From 27bbe909b08f961706bc567be6d8c6e557386047 Mon Sep 17 00:00:00 2001 From: Sumner Date: Wed, 23 May 2018 11:50:36 +0200 Subject: [PATCH 1/3] updated violins function --- build/js/d3sm.min.js | 424 +++++++++++++++++++++------ data/d3sm-data.js | 43 ++- data/dataset-data.js | 1 - data/test-data.js | 135 --------- demos/basic-violins/index.html | 77 ++--- demos/box-whiskers-points/index.html | 153 ++++++++++ demos/bubble-heatmap/index.html | 2 +- demos/index.html | 1 + src/scripts/main.js | 2 + src/scripts/modules/box-whisker.js | 1 - src/scripts/modules/points.js | 95 ++++++ src/scripts/modules/tooltip.js | 47 ++- src/scripts/modules/violin.js | 167 ++++++++--- 13 files changed, 834 insertions(+), 314 deletions(-) delete mode 100644 data/dataset-data.js delete mode 100644 data/test-data.js create mode 100644 demos/box-whiskers-points/index.html create mode 100644 src/scripts/modules/points.js diff --git a/build/js/d3sm.min.js b/build/js/d3sm.min.js index a341330..eeb4a77 100644 --- a/build/js/d3sm.min.js +++ b/build/js/d3sm.min.js @@ -388,9 +388,17 @@ * @param {d3.selection} selection selection of container in which the svg is or should be made * @param {string} namespace namespace of the chart * @param {Object} [space={w:window.innerWidth, h:window.innerHeight}] the width (w) and height (h) availble - * @param {margins} [margins={top: 0.01, bottom: 0.01, left: 0.01, right: 0.01}] the margins for the chart - * @param {percentages} [percentages = {axes:{x:0.1,y:0.1},space:{w:0.8,h:0.6}}] percentages of the param space - * of which to make the x and y axes as well as the percent of the availble space in which to render the plot + * @param {number} [space.w=window.innerWidth] the available width in which to render the chart + * @param {number} [space.h=window.innerHeight] the available height in which to render the chart + + * @param {Object} [margins={top: 0.01, bottom: 0.01, left: 0.01, right: 0.01}] the margins for the chart + * @param {number} [margins.top=0.01] the top margin of the chart + * @param {number} [margins.bottom=0.01] the bottom margin of the chart + * @param {number} [margins.left=0.01] the left margin of the chart + * @param {number} [margins.right=0.01] the right margin of the chart + + + * @param {Object} [percentages = {axes:{x:0.1,y:0.1},space:{w:0.8,h:0.6}}] percentages of the paramater space of which to make the x and y axes as well as the percent of the availble space in which to render the plot * @param {Object} [percentages.axes={x:0.1,y:0.1}] the percentages of the paramater space, of which the x and y axes will take up * @param {number} [percentages.axes.xAxisPercent=0.1] the percentages of the paramater space, of which the x axis will take up * @param {number} [percentages.axes.yAxisPercent=0.1] the percentages of the paramater space, of which the y axis will take up @@ -400,12 +408,27 @@ * @param {number} [percentages.space.percentOfSpaceForHeight=0.1] the percentages of the paramater space, of which the SVG's height will be set * @returns {Object} returns the selection and "boundingRects" of the plot container, x-axis container and y-axis container - * as { plot: {selection: plotSelection, rect: plotRect}, xAxis:{selection:xAxisSelection, rect:xAxisRect}, yAxis: {selection:yAxisSelection, rect:yAxisRect}} - * where each rect has form {x: #, y: #, h: #, w: #} depicting the starting x and y coordinate of the - * coresponding container (also their default transform values) as well their height (h) ans width (w) + * as + * + * { + * + * plot: {selection: plotSelection, rect: plotRect}, + * + * xAxis:{selection:xAxisSelection, rect:xAxisRect}, + * + * yAxis: {selection:yAxisSelection, rect:yAxisRect} + * + * } + * + * where each rect has form: + * + * {x: #, y: #, h: #, w: #} + * + * depicting the starting x and y coordinate of the coresponding container (also their default transform values) as well their height (h) ans width (w) */ // export function setupStandardChartContainers( selection, namespace, space, margins, percentages) { - function setupStandardChartContainers(selection, namespace, space) { + function setupStandardChartContainers(selection, namespace) { + var space = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : { w: availableWidth = window.innerWidth, h: availableHeight = window.innerHeight }; var margins = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : { top: 0.01, bottom: 0.01, left: 0.01, right: 0.01 }; var percentages = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : { axes: { x: xAxisPercent = 0.1, y: yAxisPercent = 0.1 }, space: { w: percentOfSpaceForWidth, h: percentOfSpaceForHeight } }; @@ -2354,7 +2377,7 @@ */ function tooltip(selection) { - var keys, values, header, data, selection; + var keys, values, header, data, selection, targetClass; /** * Gets / sets the keys to be displayed in the tooltip. @@ -2406,11 +2429,22 @@ return arguments.length ? (selection = _, tooltip) : selection; }; + /** + * Gets / sets the targetClass for the tooltip to be applied on + * @param {string} [_=none] + * @returns {tooltip | string} + * @memberof tooltip + */ + tooltip.targetClass = function (_) { + return arguments.length ? (targetClass = _, tooltip) : targetClass; + }; + /** * Bind, via selection.on(), the mousemove and mouseout events * @returns undefined */ function tooltip() { + selection.on('mouseover', mousemove); selection.on('mousemove', mousemove); selection.on('mouseout', function () { d3.selectAll(".d3sm-tooltip").remove(); @@ -2438,8 +2472,6 @@ var div = safeSelect(d3.select('html'), 'tooltip', 'd3sm-tooltip').classed('card', true).style('max-width', '300px').style('background-color', "#212529").style('color', 'white'); - div.style('position') == "relative" ? div.style('position', 'absolute').style('left', x + 15 + 'px').style('top', y + 'px') : div.transition().duration(200).ease(d3.easeSin).style('left', x + 15 + 'px').style('top', y + 'px'); - var cardBody = safeSelect(div, 'div', 'card-body'); var cardTitle = safeSelect(cardBody, 'h5', 'card-title').text(header == undefined ? key : typeof header == 'function' ? header(key, i) : header).style('color', 'cyan'); @@ -2448,26 +2480,36 @@ tBody = tBody.selectAll('tr'); tBody = tBody.data(keys == undefined ? d3.keys(currentData) : keys); + tBody.exit().remove(); var tr = tBody.enter().append('tr'); - tr.append('td').attr('class', function (d, i) { - return 'tooltip-key'; - }); - tr.append('td').attr('class', function (d, i, j) { - return 'tooltip-value'; - }); - // tBody = tBody.merge(tr) consoleGroup('tooltip-rows'); + tr.each(function (d, i) { + + d3.select(this).append('td').attr('class', 'tooltip-key').text(function (d, i) { + return d; + }); + d3.select(this).append('td').attr('class', 'tooltip-value').text(function (d, i) { + log('tooltip', 'trying to set value', { rowKey: d, rowIndex: i }); + var v = currentData[d]; + if (values != undefined) { + v = values[i];if (typeof v == "function") { + v = v(currentData, d); + } + } + return typeof v == 'number' ? round(v, 5) : v; + }); + }); + tBody = tBody.merge(tr); + tBody.selectAll('.tooltip-key').text(function (d, i) { return d; }); - tBody.selectAll('tr .tooltip-value').text(function (d, i) { + tBody.selectAll('.tooltip-value').text(function (d, i) { log('tooltip', 'trying to set value', { rowKey: d, rowIndex: i }); - var v = currentData[d]; - if (values != undefined) { v = values[i];if (typeof v == "function") { v = v(currentData, d); @@ -2475,8 +2517,11 @@ } return typeof v == 'number' ? round(v, 5) : v; }); + consoleGroupEnd(); consoleGroupEnd(); + + div.style('position') == "relative" ? div.style('position', 'absolute').style('left', x + 15 + 'px').style('top', y + 'px') : div.transition().duration(200).ease(d3.easeSin).style('left', x + 15 + 'px').style('top', y + 'px'); } return tooltip; @@ -4730,7 +4775,6 @@ }); tooltip$$1.selection(container.selectAll('g:not(.to-remove).' + objectClass)).data(data); - tooltip$$1(); } @@ -5764,6 +5808,7 @@ ** ** ** ** *******************************************************************************/ + /** * Creates a violin * @@ -5774,7 +5819,7 @@ * @returns {function} violin */ function violin(selection) { - var + var /** * Data to plot. Assumed to be a object, where each key corresponds to a violin * (see {@link bar#data}) @@ -5991,14 +6036,6 @@ easeFunc = d3.easeExp, - /** - * The key containing the quartiles - * @param {string} [quartilesKey=undefined] - * @memberof bar# - * @property - */ - quartilesKey = "quartiles", - /** * The keys corresponding to each quartile * @param {string[]} [quartileKeys=["Q0", "Q1", "Q2", "Q3", "Q4"]] @@ -6047,7 +6084,8 @@ * @memberof bar# * @property */ - tooltip$$1 = tooltip().keys([quartileKeys[4], quartileKeys[3], quartileKeys[2], quartileKeys[1], quartileKeys[0]]); + tooltip$$1 = tooltip().keys([quartileKeys[4], quartileKeys[3], quartileKeys[2], quartileKeys[1], quartileKeys[0]]), + pointsTooltip = tooltip(); //, // pointsTooltip = TTip() @@ -6459,19 +6497,28 @@ // if grouping is undefined sort violinKeys by sortingFunction var ordered = grouping == undefined ? d3.keys(data).sort(sortingFunction) : grouping; + // console.log(ordered) + violinKeys = flatten(ordered); - violinValues = extractViolinValues(violinKeys, data, valueExtractor, horizontalQ, quartilesKey, quartileKeys); + + var calcValues = neededViolinValues().horizontalQ(horizontalQ).quartileKeys(quartileKeys).violinPointsExtractor(violinPointsExtractor).violinPointValueExtractor(violinPointValueExtractor); + + // augment valus + violinKeys.map(function (vk, i) { + calcValues(vk, data); + }); + + // violinValues = extractViolinValues(violinKeys, data, valueExtractor, horizontalQ, quartilesKey, quartileKeys) var numberOfObjects = violinKeys.length; var min = (_ref = []).concat.apply(_ref, toConsumableArray(violinKeys.map(function (k, i) { - return violinValues[k][quartilesKey][quartileKeys[0]]; + return data[k].quartiles[quartileKeys[0]]; }))); var max = (_ref2 = []).concat.apply(_ref2, toConsumableArray(violinKeys.map(function (k, i) { - return violinValues[k][quartilesKey][quartileKeys[quartileKeys.length - 1]]; + return data[k].quartiles[quartileKeys[quartileKeys.length - 1]]; }))); var extent = [Math.min.apply(Math, toConsumableArray(min)) - domainPadding, Math.max.apply(Math, toConsumableArray(max)) + domainPadding]; - // console.log(extent, violinValues, ordered) // set the scale @@ -6502,7 +6549,7 @@ /* violiin specific needs */ var frequencyMax = Math.max.apply(Math, toConsumableArray((_ref3 = []).concat.apply(_ref3, toConsumableArray(violinKeys.map(function (k, i) { - return d3.max(violinValues[k].frequencies); + return d3.max(data[k].frequencies); }))))); var vScale = d3.scaleLinear().domain([0, frequencyMax]).range([0, objectSize / 2]); @@ -6517,12 +6564,6 @@ return horizontalQ ? scale(extent[1]) - scale(d.y) : vScale(d.y); }).curve(d3.curveBasis); - tooltip$$1.selection(container.selectAll('g:not(.to-remove).' + objectClass)); - if (tooltip$$1.data() == undefined) { - tooltip$$1.data(violinValues); - } - tooltip$$1(); - container.selectAll('g:not(.to-remove).' + objectClass).each(function (key, i) { var t = d3.select(this), currentData = data[key]; @@ -6530,46 +6571,46 @@ if (!hasQ(violinKeys, key)) { return; } - var d = violinValues[key], - i = t.attr('parent-index') == undefined ? i : t.attr('parent-index'), - fillColor = colorFunction$$1(key, d, i, 'fill'), + var i = t.attr('parent-index') == undefined ? i : t.attr('parent-index'), + fillColor = colorFunction$$1(key, currentData, i, 'fill'), // prevent duplicate computation - strokeColor = colorFunction$$1(key, d, i, 'stroke'), + strokeColor = colorFunction$$1(key, currentData, i, 'stroke'), area = safeSelect(t, 'g', 'area'), la = safeSelect(area, 'path', 'left'), ra = safeSelect(area, 'path', 'right'), quarts = safeSelect(t, 'g', 'quarts'), lq3 = safeSelect(quarts, 'line', 'q3'), lq1 = safeSelect(quarts, 'line', 'q1'), - q3 = d[quartilesKey][quartileKeys[3]], - q2 = d[quartilesKey][quartileKeys[2]], - q1 = d[quartilesKey][quartileKeys[1]]; + q3 = currentData.quartiles[quartileKeys[3]], + q2 = currentData.quartiles[quartileKeys[2]], + q1 = currentData.quartiles[quartileKeys[1]]; t.attr('transform', horizontalQ ? 'translate(' + objectSize / 2 + ',0)' : 'translate(0,' + objectSize / 2 + ')'); // draw curve la.transition().duration(transitionDuration).attr('d', function (dd, ii) { - return lArea(d.points); + return lArea(currentData.contour); }).attr('fill', fillColor).attr('stroke', strokeColor).attr('stroke-width', objectStrokeWidth); ra.transition().duration(transitionDuration).attr('d', function (dd, ii) { - return rArea(d.points); + return rArea(currentData.contour); }).attr('fill', fillColor).attr('stroke', strokeColor).attr('stroke-width', objectStrokeWidth); - area.on('mouseover', function (dd, ii) { + area.node().addEventListener('mouseover', function (dd, ii) { container.selectAll('g.' + objectClass).style('opacity', 0.2); t.style('opacity', 1); la.attr('stroke-width', objectStrokeWidth * 2); ra.attr('stroke-width', objectStrokeWidth * 2); }); - area.on('mouseout', function (dd, ii) { + area.node().addEventListener('mouseout', function (dd, ii) { container.selectAll('g.' + objectClass).style('opacity', 1); la.attr('stroke-width', objectStrokeWidth); ra.attr('stroke-width', objectStrokeWidth); }); if (pointsQ) { - var ptsContainer = safeSelect(t, 'g', 'points'), - pts = ptsContainer.selectAll('.point').data(d.values); + var ptsContainer = safeSelect(t, 'g', 'points'); + var pts = ptsContainer.selectAll('.point').data(currentData.pointKeys); + pts.on('mouseover', null); var ptsExit = pts.exit().transition().ease(easeFunc).duration(transitionDuration).attr('r', 0).attr('cy', horizontalQ ? scale(extent[1]) - scale(q2) : vScale(0)).attr('cx', horizontalQ ? vScale(0) : scale(q2)).remove(); @@ -6577,35 +6618,35 @@ pts = pts.merge(ptsEnter); - pts.transition().duration(transitionDuration).ease(easeFunc).attr('r', pointRadius).attr('cy', function (dd, ii) { + tooltip().selection(pts).data(violinPointsExtractor(key, currentData))(); + + pts.transition().duration(transitionDuration).ease(easeFunc).attr('r', pointRadius).attr('cy', function (pointKey, ii) { + var dd = currentData.pointValues[ii]; if (horizontalQ) { return scale(extent[1]) - scale(dd); } - var j = whichBin(d.binned, dd); + var j = whichBin(currentData.binned, dd); var r = Math.random(); - var n = vScale(r * d.frequencies[j] * 0.5); + var n = vScale(r * currentData.frequencies[j] * 0.5); var k = Math.random() > 0.5 ? n : -n; return k; - }).attr('cx', function (dd, ii) { + }).attr('cx', function (pointKey, ii) { + var dd = currentData.pointValues[ii]; if (horizontalQ) { - var j = whichBin(d.binned, dd); + var j = whichBin(currentData.binned, dd); var r = Math.random(); - var n = vScale(r * d.frequencies[j] * 0.5); + var n = vScale(r * currentData.frequencies[j] * 0.5); var k = Math.random() > 0.5 ? n : -n; return k; } return scale(dd); }).attr('stroke', function (dd, ii) { - return pointColorFunc(dd, 'stroke', strokeColor, min, max); + var dd = currentData.pointValues[ii];return pointColorFunc(dd, 'stroke', strokeColor, min, max); }).attr('fill', function (dd, ii) { - return pointColorFunc(dd, 'fill', strokeColor, min, max); + var dd = currentData.pointValues[ii];return pointColorFunc(dd, 'fill', strokeColor, min, max); }).attr('stroke-width', pointStrokeWidth); ptsContainer.selectAll('circle.point').on('mouseover', function (dd, ii) { - // var e = document.createEvent('SVGEvents') - // e.initEvent('mouseover',true,true); - // area.node().dispatchEvent(e) - container.selectAll('g.' + objectClass).style('opacity', 0.2); t.style('opacity', 1); la.attr('stroke-width', objectStrokeWidth * 2); @@ -6613,8 +6654,6 @@ container.selectAll('.point').style('opacity', 0.2); d3.select(this).style('opacity', 1).attr('r', pointRadius * 2).attr('stroke-width', pointStrokeWidth * 2); - // pointsTooltip.data(dd) - // pointsTooltip() }); ptsContainer.selectAll('circle.point').on('mouseout', function (dd, ii) { var e = document.createEvent('SVGEvents'); @@ -6628,6 +6667,25 @@ cV.selectAll('.point').transition().duration(transitionDuration).ease(easeFunc).attr('r', 0).attr('cy', horizontalQ ? scale(extent[1]) - scale(q2) : vScale(0)).attr('cx', horizontalQ ? vScale(0) : scale(q2)).remove(); } }); + + // var values = {}; + // pointKeyExtractor(key, currentData, violinValues).map(function(k, i){ + // values[k] = pointValueExtractor(k, key, currentData, violinValues) + // }) + // + // console.table(values) + // + // .data(data) + // .keys(['Value']) + // .values([function(cd, key){return cd }]) + // pointsTooltip() + + + tooltip$$1.selection(container.selectAll('g:not(.to-remove).' + objectClass + ' .area')); + if (tooltip$$1.data() == undefined) { + tooltip$$1.data(data); + } + tooltip$$1(); tooltip$$1.values([function (currentData, tooltipKey) { return currentData['quartiles'][tooltipKey]; }, function (currentData, tooltipKey) { @@ -6644,6 +6702,165 @@ return violin; } + function violinPointsExtractor(violinKey, violinData) { + return violinData.points; + } + function violinPointValueExtractor(violinPointKey, violinPointData) { + return violinPointData[violinPointKey].value; + } + + function neededViolinValues() { + var horizontalQ = true, + quartileKeys = ['Q0', 'Q1', 'Q2', 'Q3', 'Q4'], + violinPointsExtractor, + violinPointValueExtractor; + + calculateViolinValues.horizontalQ = function (_) { + return arguments.length ? (horizontalQ = _, calculateViolinValues) : horizontalQ; + }; + calculateViolinValues.quartileKeys = function (_) { + return arguments.length ? (quartileKeys = _, calculateViolinValues) : quartileKeys; + }; + calculateViolinValues.violinPointsExtractor = function (_) { + return arguments.length ? (violinPointsExtractor = _, calculateViolinValues) : violinPointsExtractor; + }; + calculateViolinValues.violinPointValueExtractor = function (_) { + return arguments.length ? (violinPointValueExtractor = _, calculateViolinValues) : violinPointValueExtractor; + }; + + function calculateViolinValues(violinKey, data) { + // data for the current violin + var violinData = data[violinKey]; + // the object of points + var violinPoints = violinPointsExtractor(violinKey, violinData); + // + var violinPointsKeys = d3.keys(violinPoints); + // the numerical values of those points + var violinPointsValues = violinPointsKeys.map(function (pk, i) { + return violinPoints[pk].value; + }); + + // quartiles of those points + var pointQuartiles = quartiles(violinPointsValues, quartileKeys); + + // binned points + var binned = d3.histogram()(violinPointsValues); + // length of bins + var frequencies = binned.map(function (bin) { + return bin.length; + }); + // min and max countour points for nice drawings + var minContourPoint = horizontalQ ? { x: 0, y: d3.min(violinPointsValues) } : { x: d3.min(violinPointsValues), y: 0 }; + var maxContourPoint = horizontalQ ? { x: 0, y: d3.max(violinPointsValues) } : { x: d3.max(violinPointsValues), y: 0 }; + var violinContourPoints = binned.map(function (bin, i) { + return horizontalQ ? { y: bin.length ? d3.median(bin) : d3.median([bin.x0, bin.x1]), x: frequencies[i] } : { x: bin.length ? d3.median(bin) : d3.median([bin.x0, bin.x1]), y: frequencies[i] }; + }); + // points along which to draw the violin shpe + violinContourPoints = [minContourPoint].concat(violinContourPoints).concat([maxContourPoint]); + + // set data + violinData.binned = binned; + violinData.frequencies = frequencies; + violinData.contour = violinContourPoints; + violinData.quartiles = pointQuartiles; + violinData.pointKeys = violinPointsKeys; + violinData.pointValues = violinPointsValues; + } + + return calculateViolinValues; + } + + function points(selection) { + var + // /** + // * Data to plot. Assumed to be a object, where each key corresponds to a violin + // * (see {@link bar#data}) + // * @param {Object} [data=undefined] + // * @memberof bar# + // * @property + // */ + // data, + // /** + // * Which direction to render the bars in + // * (see {@link bar#orient}) + // * @param {number} [orient='horizontal'] + // * @memberof bar# + // * @property + // */ + // orient='horizontal', + // /** + // * The radius of a point + // * @param {number} [pointRadius=3] + // * @memberof bar# + // * @property + // */ + // radius = 3, + // /** + // * The stroke width of the oints + // * @param {number} [pointStrokeWidth=2] + // * @memberof bar# + // * @property + // */ + // strokeWidth = 2, + // /** + // * Namespace for all items made by this instance of bar + // * @param {string} [namespace="d3sm-violin"] + // * @memberof bar# + // * @property + // */ + // namespace = 'd3sm-points', + // /** + // * Class name for bar container ( element) + // * @param {string} [objectClass="violin"] + // * @memberof bar# + // * @property + // */ + // objectClass = 'point', + // /** + // * Duration of all transitions of this element + // * @param {number} [transitionDuration=1000] + // * @memberof bar# + // * @property + // */ + // transitionDuration = 1000, + // /** + // * Easing function for transitions + // * @param {d3.ease} [easeFunc=d3.easeExp] + // * @memberof bar# + // * @property + // */ + // easeFunc = d3.easeExp, + // /** + // * The objectSize (actual width) used by the bars + // * @param {number} [objectSize=undefined] + // * @memberof bar# + // * @property + // */ + // objectSize, + + keyExtractor = function keyExtractor(d, i) { + console.log(d); + }; + + function points() { + // var ptsContainers = selection.selectAll('.'+objectClass) + var ptsContainers = selection.selectAll('.bow-whisk'); + console.log(ptsContainers.nodes()); + + ptsContainers.each(function (d, i) { + var t = d3.select(this), + ptsContainer = safeSelect(t, 'g', 'points'), + pts = ptsContainer.selectAll('.point').data(keyExtractor(d)); + + var ptsExit = pts.exit(); + var ptsEnter = pts.enter().append('circle').attr('class', 'point'); + + pts = pts.merge(ptsEnter); + }); + } + return points; + } + function createCommonjsModule(fn, module) { return module = { exports: {} }, fn(module, module.exports), module.exports; } @@ -6816,6 +7033,11 @@ exports.enabled = enabled; exports.humanize = ms; + /** + * Active `debug` instances. + */ + exports.instances = []; + /** * The currently active debug mode names, and names to skip. */ @@ -6831,12 +7053,6 @@ exports.formatters = {}; - /** - * Previous log timestamp. - */ - - var prevTime; - /** * Select a color. * @param {String} namespace @@ -6865,6 +7081,8 @@ function createDebug(namespace) { + var prevTime; + function debug() { // disabled? if (!debug.enabled) return; @@ -6921,15 +7139,28 @@ debug.enabled = exports.enabled(namespace); debug.useColors = exports.useColors(); debug.color = selectColor(namespace); + debug.destroy = destroy; // env-specific initialization logic for debug instances if ('function' === typeof exports.init) { exports.init(debug); } + exports.instances.push(debug); + return debug; } + function destroy () { + var index = exports.instances.indexOf(this); + if (index !== -1) { + exports.instances.splice(index, 1); + return true; + } else { + return false; + } + } + /** * Enables a debug mode by namespaces. This can include modes * separated by a colon and wildcards. @@ -6944,10 +7175,11 @@ exports.names = []; exports.skips = []; + var i; var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); var len = split.length; - for (var i = 0; i < len; i++) { + for (i = 0; i < len; i++) { if (!split[i]) continue; // ignore empty strings namespaces = split[i].replace(/\*/g, '.*?'); if (namespaces[0] === '-') { @@ -6956,6 +7188,11 @@ exports.names.push(new RegExp('^' + namespaces + '$')); } } + + for (i = 0; i < exports.instances.length; i++) { + var instance = exports.instances[i]; + instance.enabled = exports.enabled(instance.namespace); + } } /** @@ -6977,6 +7214,9 @@ */ function enabled(name) { + if (name[name.length - 1] === '*') { + return true; + } var i, len; for (i = 0, len = exports.skips.length; i < len; i++) { if (exports.skips[i].test(name)) { @@ -7009,9 +7249,10 @@ var debug_3 = debug.enable; var debug_4 = debug.enabled; var debug_5 = debug.humanize; - var debug_6 = debug.names; - var debug_7 = debug.skips; - var debug_8 = debug.formatters; + var debug_6 = debug.instances; + var debug_7 = debug.names; + var debug_8 = debug.skips; + var debug_9 = debug.formatters; var browser = createCommonjsModule(function (module, exports) { /** @@ -7036,12 +7277,17 @@ */ exports.colors = [ - 'lightseagreen', - 'forestgreen', - 'goldenrod', - 'dodgerblue', - 'darkorchid', - 'crimson' + '#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC', + '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF', + '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC', + '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF', + '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC', + '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033', + '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366', + '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933', + '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC', + '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF', + '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33' ]; /** @@ -7060,6 +7306,11 @@ return true; } + // Internet Explorer and Edge do not support colors. + if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) { + return false; + } + // is webkit? http://stackoverflow.com/a/16459606/376773 // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || @@ -7223,6 +7474,7 @@ d3sm.scatter = scatter; d3sm.plotZoom = plotZoom; d3sm.violin = violin; + d3sm.points = points; d3sm.uniqueElements = uniqueElements; d3sm.getTranslation = getTranslation; @@ -7264,4 +7516,4 @@ window.d3sm = d3sm; }()); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZDNzbS5taW4uanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JpcHRzL21vZHVsZXMvaGVscGVycy5qcyIsIi4uLy4uL3NyYy9zY3JpcHRzL21vZHVsZXMvYXJyYXktZnVuY3Rpb25zLmpzIiwiLi4vLi4vc3JjL3NjcmlwdHMvbW9kdWxlcy91dGlscy5qcyIsIi4uLy4uL3NyYy9zY3JpcHRzL21vZHVsZXMvZ3JvdXBpbmctc3BhY2VyLmpzIiwiLi4vLi4vc3JjL3NjcmlwdHMvbW9kdWxlcy9heGlzLmpzIiwiLi4vLi4vc3JjL3NjcmlwdHMvbW9kdWxlcy9jb2xvci1mdW5jdGlvbi5qcyIsIi4uLy4uL3NyYy9zY3JpcHRzL21vZHVsZXMvdG9vbHRpcC5qcyIsIi4uLy4uL3NyYy9zY3JpcHRzL21vZHVsZXMvYmFyLmpzIiwiLi4vLi4vc3JjL3NjcmlwdHMvbW9kdWxlcy9idWJibGUtaGVhdG1hcC5qcyIsIi4uLy4uL3NyYy9zY3JpcHRzL21vZHVsZXMvYm94LXdoaXNrZXIuanMiLCIuLi8uLi9zcmMvc2NyaXB0cy9tb2R1bGVzL2RhdGEtdG9nZ2xlLmpzIiwiLi4vLi4vc3JjL3NjcmlwdHMvbW9kdWxlcy9zY2F0dGVyLmpzIiwiLi4vLi4vc3JjL3NjcmlwdHMvbW9kdWxlcy9wbG90LXpvb20uanMiLCIuLi8uLi9zcmMvc2NyaXB0cy9tb2R1bGVzL3Zpb2xpbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9tcy9pbmRleC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvZGVidWcuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2Jyb3dzZXIuanMiLCIuLi8uLi9zcmMvc2NyaXB0cy9tYWluLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGltcG9ydCB7aGFzUX0gZnJvbSAnLi9hcnJheS1mdW5jdGlvbnMnO1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhFTFBFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKlxuKiBIZWxwZXIgZnVuY3Rpb24gZm9yIEFycmF5LmZpbHRlciB0byBnZXQgdW5pcXVlIGVsZW1lbnRzIG9mIHRoZSBhcnJheVxuKiBAcGFyYW0geyp9IHZhbHVlIGN1cnJlbnQgdmFsdWUgYXMgbWFwcGluZyBvdmVyIGFycmF5IChzZWxmKVxuKiBAcGFyYW0ge251bWJlcn0gaW5kZXggY3VycmVudCBpbmRleCBpbiB0aGUgYXJyYXlcbiogQHBhcmFtIHtBcnJheX0gc2VsZiBwYXNzZWQgYXJyYXkgZnJvbSBBcnJheS5maWx0ZXIgbWV0aG9kXG4qIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIG9yIG5vdCB2YWx1ZSBpcyB0aGUgZmlyc3Qgb2YgaXRzIGtpbmQgKGkuZS4gaW5kZXhPZih2YWx1ZSkgPT0gaW5kZXgpXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIHVuaXF1ZUVsZW1lbnRzKHZhbHVlLCBpbmRleCwgc2VsZikgeyByZXR1cm4gc2VsZi5pbmRleE9mKHZhbHVlKSA9PT0gaW5kZXg7IH1cblxuLyoqXG4qIEV4dHJhY3RzIHggYW5kIHkgb2YgdHJhbnNsYXRlIGZyb20gdHJhbnNmb3JtIHByb3BlcnR5XG4qIEBwYXJhbSB7c3RyaW5nfSB0cmFuc2Zvcm0gdHJhbnNmb3JtIHByb3BlcnR5IG9mIHN2ZyBlbGVtZW50XG4qIEByZXR1cm5zIHtudW1iZXJbXX0geCwgeSBvZiB0cmFuc2xhdGUoeCwgeSlcbiovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJhbnNsYXRpb24odHJhbnNmb3JtKSB7XG4gIC8vIENyZWF0ZSBhIGR1bW15IGcgZm9yIGNhbGN1bGF0aW9uIHB1cnBvc2VzIG9ubHkuIFRoaXMgd2lsbCBuZXZlclxuICAvLyBiZSBhcHBlbmRlZCB0byB0aGUgRE9NIGFuZCB3aWxsIGJlIGRpc2NhcmRlZCBvbmNlIHRoaXMgZnVuY3Rpb25cbiAgLy8gcmV0dXJucy5cbiAgdmFyIGcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ2cnKTtcbiAgLy8gU2V0IHRoZSB0cmFuc2Zvcm0gYXR0cmlidXRlIHRvIHRoZSBwcm92aWRlZCBzdHJpbmcgdmFsdWUuXG4gIHRyYW5zZm9ybSA9IHRyYW5zZm9ybSA9PSB1bmRlZmluZWQgPyAndHJhbnNsYXRlKDAsMCknIDogdHJhbnNmb3JtO1xuICBnLnNldEF0dHJpYnV0ZU5TKG51bGwsICd0cmFuc2Zvcm0nLCB0cmFuc2Zvcm0pO1xuICAvLyBjb25zb2xpZGF0ZSB0aGUgU1ZHVHJhbnNmb3JtTGlzdCBjb250YWluaW5nIGFsbCB0cmFuc2Zvcm1hdGlvbnNcbiAgLy8gdG8gYSBzaW5nbGUgU1ZHVHJhbnNmb3JtIG9mIHR5cGUgU1ZHX1RSQU5TRk9STV9NQVRSSVggYW5kIGdldFxuICAvLyBpdHMgU1ZHTWF0cml4LlxuICB2YXIgbWF0cml4ID0gZy50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpLm1hdHJpeDtcbiAgLy8gQXMgcGVyIGRlZmluaXRpb24gdmFsdWVzIGUgYW5kIGYgYXJlIHRoZSBvbmVzIGZvciB0aGUgdHJhbnNsYXRpb24uXG4gIHJldHVybiBbbWF0cml4LmUsIG1hdHJpeC5mXTtcbn1cblxuXG4vKipcbiogTW9kaWZpZXMgbHVtaW5hbmNlIG9mIGhleGlkZWNpbWFsIG51bWJlclxuKiBAcGFyYW0ge3N0cmluZ30gaGV4IHNob3VsZCBiZSBoZXhpZGVjaW1hbCB2YWx1ZSB3aXRoIG9yIHdpdGhvdXQgdGhlIHByb2NlZWRpbmcgb2N0b3Ryb3BlXG4qIEBwYXJhbSB7bnVtYmVyfSBsdW0gdmFsdWUgdG8gaW5jcmVhc2Ugb3IgZGVjcmVhc2UgbHVtaW5vc2l0eSBieVxuKiBAcmV0dXJucyB7c3RyaW5nfSB1cGRhdGVkIGhleGlkZWNpbWFsIHZhbHVlIHdpdGhvdXQgdGhlIHByb2NlZWRpbmcgb2N0b3Ryb3BlXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZGlmeUhleGlkZWNpbWFsQ29sb3JMdW1pbmFuY2UoaGV4LCBsdW0pIHtcbiAgLy8gdmFsaWRhdGUgaGV4IHN0cmluZ1xuICB2YXIgaGV4ID0gU3RyaW5nKGhleCkucmVwbGFjZSgvW14wLTlhLWZdL2dpLCAnJyk7XG5cbiAgaWYgKGhleC5sZW5ndGggPCA2KSB7XG4gICAgaGV4ID0gaGV4WzBdK2hleFswXStoZXhbMV0raGV4WzFdK2hleFsyXStoZXhbMl07XG5cdH1cblx0bHVtID0gbHVtIHx8IDA7XG5cblx0Ly8gY29udmVydCB0byBkZWNpbWFsIGFuZCBjaGFuZ2UgbHVtaW5vc2l0eVxuXHR2YXIgcmdiID0gJyMnLCBjLCBpO1xuXHRmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7XG5cdFx0YyA9IHBhcnNlSW50KGhleC5zdWJzdHIoaSoyLDIpLCAxNik7XG5cdFx0YyA9IE1hdGgucm91bmQoTWF0aC5taW4oTWF0aC5tYXgoMCwgYyArIChjICogbHVtKSksIDI1NSkpLnRvU3RyaW5nKDE2KTtcblx0XHRyZ2IgKz0gKCcwMCcrYykuc3Vic3RyKGMubGVuZ3RoKTtcblx0fVxuXG5cdHJldHVybiByZ2I7XG59XG5cblxuLyoqXG4qIEBkZXByZWNhdGVkIEBzZWV7QGxpbmsgdGlja1JhbmdlfVxuKiBAcGFyYW0ge251bWJlcn0gbWluXG4qIEBwYXJhbSB7bnVtYmVyfSBtYXhcbiogQHBhcmFtIHtudW1iZXJ9IHBhcnRzXG4qIEByZXR1cm5zIHtudW1iZXJbXX0gYXJyYXkgb2YgbGVuZ3RoIHBhcnRzIGV2ZW5seSBwYXJ0aXRpb25lZCBiZXR3ZWVuIG1pbiBhbmQgbWF4XG4qL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnRpdGlvblJhbmdlSW50byhtaW4sIG1heCwgcGFydHMpIHtcbiAgdmFyIGRpZmYgPSBtYXggLSBtaW5cbiAgcmV0dXJuIEFycmF5KHBhcnRzKS5tYXAoZnVuY3Rpb24gKGUsIGkpIHsgcmV0dXJuIG1pbiArIGRpZmYgLyBwYXJ0cyAqIGkgfSlcbn1cblxuXG4vKipcbiogQ2FsY3VsYXRlZCB0aGUgcXVhcnRpbGVzIG9mIHRoZSBwYXNzZWQgZGF0YSBhbmQgc3RvcmVzIHRoZW0gd2l0aCBxS2V5c1xuKiBAcGFyYW0ge251bWJlcltdfSBkYXRhIGxpc3Qgb2YgbnVtZXJpY2FsIHZhbHVlc1xuKiBAcGFyYW0ge3N0cmluZ1tdfSBbcUtleXM9WydxMCcsICdxMScsICdxMicsICdxMycsICdxNCddXSBob3cgcmV0dXJuZWQgb2JqZWN0IHdpdGggcXVhcnRpbGVzIHNob3VsZCBiZSBzdG9yZWRcbiogQHJldHVybnMge09iamVjdH0gd2l0aCBrZXlzIHFLZXlzIGdpdmluZyBvbmx5IHRoZSBudW1lcmljYWwgdmFsdWVzIGZvciB0aGUgcXVhcnRpbGVzXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIHF1YXJ0aWxlcyhkYXRhLCBxS2V5cykge1xuICB2YXJcbiAgcTIgPSBkMy5tZWRpYW4oZGF0YSksXG4gIGxvd2VyID0gZGF0YS5maWx0ZXIoeCA9PiB4IDwgcTIpLFxuICB1cHBlciA9IGRhdGEuZmlsdGVyKHggPT4geCA+IHEyKSxcblxuICBxMSA9IGQzLm1lZGlhbihsb3dlciksXG4gIHExID0gcTEgPT0gdW5kZWZpbmVkID8gcTIgOiBxMSxcblxuICBxMCA9IGQzLm1pbihsb3dlciksXG4gIHEwID0gcTAgPT0gdW5kZWZpbmVkID8gcTEgOiBxMCxcblxuICBxMyA9IGQzLm1lZGlhbih1cHBlciksXG4gIHEzID0gcTMgPT0gdW5kZWZpbmVkID8gcTIgOiBxMyxcblxuICBxNCA9IGQzLm1heCh1cHBlciksXG4gIHE0ID0gcTQgPT0gdW5kZWZpbmVkID8gcTMgOiBxNCxcblxuICBrMCA9ICdxMCcsIGsxID0gJ3ExJywgazIgPSAncTInLCBrMyA9ICdxMycsIGs0ID0gJ3E0JyxcbiAgb2JqID0ge31cbiAgaWYgKHFLZXlzIT11bmRlZmluZWQgJiYgcUtleXMubGVuZ3RoID09IDUpIHsgazAgPSBxS2V5c1swXTsgazEgPSBxS2V5c1sxXTsgazIgPSBxS2V5c1syXTsgazMgPSBxS2V5c1szXTsgazQgPSBxS2V5c1s0XTsgfVxuICBvYmpbazBdID0gcTA7IG9ialtrMV0gPSBxMTsgb2JqW2syXSA9IHEyOyBvYmpbazNdID0gcTM7IG9ialtrNF0gPSBxNDtcblxuICByZXR1cm4gb2JqXG59XG5cblxuLyoqXG4qIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgYWxsIHZhbHVlcyBuZWVkZWQgaW4gbWFraW5nIHZpb2xpbiBwbG90c1xuKiBAcGFyYW0ge3N0cmluZ1tdfSB2aW9saW5LZXlzXG4qIEBwYXJhbSB7bnVtYmVyW119IGRhdGFcbiogQHBhcmFtIHtGdW5jdGlvbn0gdmFsdWVFeHRyYWN0b3JGdW5jdGlvbiBob3cgdG8gZ2V0IHZhbHVlcyBmcm9tIGRhdGFbdmlvbGluS2V5c1tpXV1cbiogQHBhcmFtIHtib29sZWFufSBob3Jpem9udGFsUSB3aGV0aGVyIG9yIG5vdCB2aW9saW5zIHdpbGwgYmUgcmVuZGVyZWQgaG9yaXpvbnRhbGx5IG9yIHZlcnRpY2FsbHlcbiogQHBhcmFtIHtzdHJpbmd9IHFLZXkgaG93IHRoZSBvYmplY3QgY29udGFpbmluZyB0aGUgcXVhcnRpbGVzIHNob3VsZCBiZSBsYWJlbGVkIGFzXG4qIEBwYXJhbSB7c3RyaW5nW119IHFLZXlzIGhvdyBlYWNoIHF1YXJ0aWxlIHNob3VsZCBiZSBsYWJlbGVkIGFzXG4qIEByZXR1cm5zIHtPYmplY3R9IHJlcXVpcmVkIGZvciBAc2Vle0BsaW5rIHZpb2xpbn0gY29udGFpbmluZyBrZXlzIHZhbHVlcywgYmlubm5lZCwgZnJlcXVlbmNpZXMsIHBvaW50cywgYW5kIHF1YXJ0aWxlc1xuKiBAc2Vle0BsaW5rIHF1YXJ0aWxlc31cbiovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFZpb2xpblZhbHVlcyhcbiAgdmlvbGluS2V5cyxcbiAgZGF0YSxcbiAgdmFsdWVFeHRyYWN0b3JGdW5jdGlvbixcbiAgaG9yaXpvbnRhbFEsXG4gIHFLZXksXG4gIHFLZXlzXG4pe1xuICB2YXIgb2JqID0ge31cbiAgdmlvbGluS2V5cy5tYXAoZnVuY3Rpb24oaywgaSl7XG4gICAgIHZhciBkID0gdmFsdWVFeHRyYWN0b3JGdW5jdGlvbihrLCBpLCBkYXRhKSxcbiAgICAgYmlubmVkID0gZDMuaGlzdG9ncmFtKCkoZCksXG4gICAgIGZyZXF1ZW5jaWVzID0gYmlubmVkLm1hcCh4PT54Lmxlbmd0aCksXG4gICAgIG1pblBvaW50ID0gaG9yaXpvbnRhbFEgPyB7eTogZDMubWluKGQpLCB4OiAwfSA6IHt4OiBkMy5taW4oZCksIHk6IDB9LFxuICAgICBtYXhQb2ludCA9IGhvcml6b250YWxRID8ge3k6IGQzLm1heChkKSwgeDogMH0gOiB7eDogZDMubWF4KGQpLCB5OiAwfSxcbiAgICAgcG9pbnRzID0gYmlubmVkLm1hcChmdW5jdGlvbihiaW4sIGkpIHtcbiAgICAgICByZXR1cm4gaG9yaXpvbnRhbFFcbiAgICAgICA/IHt5OiAoYmluLmxlbmd0aCkgPyBkMy5tZWRpYW4oYmluKTogZDMubWVkaWFuKFtiaW4ueDAsIGJpbi54MV0pLCB4OiBmcmVxdWVuY2llc1tpXX1cbiAgICAgICA6IHt4OiAoYmluLmxlbmd0aCkgPyBkMy5tZWRpYW4oYmluKTogZDMubWVkaWFuKFtiaW4ueDAsIGJpbi54MV0pLCB5OiBmcmVxdWVuY2llc1tpXX1cbiAgICAgfSksXG4gICAgIHF1YXJ0cyA9IHF1YXJ0aWxlcyhkLCBxS2V5cyksXG4gICAgIG8gPSB7XG4gICAgICAgdmFsdWVzOiBkLFxuICAgICAgIGJpbm5lZDogYmlubmVkLFxuICAgICAgIGZyZXF1ZW5jaWVzOiBmcmVxdWVuY2llcyxcbiAgICAgICBwb2ludHM6IFttaW5Qb2ludF0uY29uY2F0KHBvaW50cykuY29uY2F0KFttYXhQb2ludF0pXG4gICAgIH1cbiAgICAgb1txS2V5XSA9IHF1YXJ0cztcbiAgICAgb2JqW2tdID0gbztcbiAgIH0pO1xuICAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4qIEh5cGVuYXRlcyBhbGwgc3RyaW5ncyB0b2dldGhlclxuKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmd1bWVudHNcbiogQHJldHVybnMge3N0cmluZ30gXCJhcmcxLWFyZzItLi4uLWFyZ25cIlxuKi9cbmV4cG9ydCBmdW5jdGlvbiBoeXBlbmF0ZSgpeyByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKS5qb2luKCctJykgfVxuXG5cbi8qKlxuKiBSb3VuZHMgZGVjaW1hbHMgb2YgbnVtYmVyIHRvIHByZWNpc2lvblxuKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyXG4qIEBwYXJhbSB7bnVtYmVyfSBwcmVjaXNpb25cbiogQHJldHVybnMge251bWJlcn0gcm91bmRlZCB0byBwcmVjaXNpb25cbiovXG5leHBvcnQgZnVuY3Rpb24gcm91bmQobnVtYmVyLCBwcmVjaXNpb24pIHtcbiAgdmFyIHNoaWZ0ID0gZnVuY3Rpb24gKG51bWJlciwgcHJlY2lzaW9uLCByZXZlcnNlU2hpZnQpIHtcbiAgICBpZiAocmV2ZXJzZVNoaWZ0KSB7XG4gICAgICBwcmVjaXNpb24gPSAtcHJlY2lzaW9uO1xuICAgIH1cbiAgICB2YXIgbnVtQXJyYXkgPSAoJycgKyBudW1iZXIpLnNwbGl0KCdlJyk7XG4gICAgcmV0dXJuICsobnVtQXJyYXlbMF0gKyAnZScgKyAobnVtQXJyYXlbMV0gPyAoK251bUFycmF5WzFdICsgcHJlY2lzaW9uKSA6IHByZWNpc2lvbikpO1xuICB9O1xuICByZXR1cm4gc2hpZnQoTWF0aC5yb3VuZChzaGlmdChudW1iZXIsIHByZWNpc2lvbiwgZmFsc2UpKSwgcHJlY2lzaW9uLCB0cnVlKTtcbn1cblxuLyoqXG4qIHJlY3Vyc2l2ZWx5IGFzY2VuZHMgZWxlbWVudC5wYXJlbnRFbGVtZW50IHRvIGZpbmQgYSBzdmcgdGFnXG4qIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuKiBAcmV0dXJucyB7RWxlbWVudCB8IHVuZGVmaW5lZH1cbiovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29udGFpbmluZ1NWRyhlbGVtZW50KSB7XG4gIHZhciBwYXJlbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnRcbiAgdmFyIHRhZyA9IHBhcmVudC50YWdOYW1lLnRvTG93ZXJDYXNlKClcbiAgaWYgKHRhZyA9PT0gJ3N2ZycpIHsgcmV0dXJuIHBhcmVudDsgfVxuICBpZiAodGFnID09PSAnaHRtbCcpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICByZXR1cm4gZ2V0Q29udGFpbmluZ1NWRyhwYXJlbnQpO1xufVxuXG4vKipcbiogTWFwcyBhcmd1bWVudHMgaW4gdG8gZDMuaW50ZXJwb2xhdGVSZ2JCYXNpc1xuKiBAcGFyYW0gYXJndW1lbnRzXG4qIEByZXR1cm5zIHtGdW5jdGlvbn1cbiovXG5leHBvcnQgZnVuY3Rpb24gaW50ZXJwb2xhdGVDb2xvcnMoKXtyZXR1cm4gZDMuaW50ZXJwb2xhdGVSZ2JCYXNpcyhhcmd1bWVudHMpfVxuXG5cbi8qKlxuKiBUcnlzIHRvIHJlZHVjZSB0ZXh0IHRvIGZpdCBpbiBzcGVjaWZpZWQgYXJlYSwgbWFkZSBmb3IgdGljayBsYWJlbHMgYXMgY2FsbGVkIGJ5XG4qIEBzZWV7QGxpbmsgYXhpc31cbiogQHBhcmFtIHtkMy5zZWxlY3Rpb259IHQgY29udGFpbmVyIGZvciBzcGVjaWZpYyBheGlzIHRpY2tcbiogQHBhcmFtIHtzdHJpbmd9IHRleHQgdG8gYmUgdGhlIGxhYmVsIG9mIHRoZSBwYXNzZWQgYXhpcyB0aWNrXG4qIEBwYXJhbSB7Ym9vbGVhbn0gb3JpZW50IG9mIHRoZSBheGlzLCB0cnVlIGlzIGhvcml6b250YWwsIGZhbHNlIGlzIHZlcnRpY2FsXG4qIEBwYXJhbSB7bnVtYmVyfSB0aWNrTGVuZ3RoIGlzIHRoZSBsZW5ndGggb2YgdGhlIHRleHRcbiogQHBhcmFtIHtudW1iZXJ9IHNwYWNlIGlzIHRoZSBhbW91bnQgb2YgYXZhaWxibGUgc3BhY2UgZm9yIHRoZSB0ZXh0IGFuZCB0aGUgdGljayB0byBmaXQgaW5cbiogQHBhcmFtIHtib29sZWFufSBvdmVyZmxvd1Egd2hldGhlciBvciBub3QgYWxsb3dlZCB0byBnbyBvdmVyIHRoZSBhbGxvdGVkIHNwYWNlXG4qIEByZXR1cm5zIHtub25lfVxuKi9cbmV4cG9ydCBmdW5jdGlvbiB0cnVuY2F0ZVRleHQodCwgdGV4dCwgb3JpZW50LCB0aWNrTGVuZ3RoLCBzcGFjZSwgb3ZlcmZsb3dRKSB7XG4gIHZhciByZWN0ID0gdC5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgdC50ZXh0KHRleHQpXG4gIHdoaWxlIChNYXRoLm1heChyZWN0LndpZHRoLCByZWN0LmhlaWdodCkgPiBzcGFjZSAtIHRpY2tMZW5ndGgpIHtcbiAgICB0ZXh0ID0gU3RyaW5nKHRleHQpXG4gICAgdGV4dCA9IHRleHQuc2xpY2UoMCwgdGV4dC5sZW5ndGggLSAxKVxuICAgIHQudGV4dCh0ZXh0ICsgJy4uLicpXG4gICAgcmVjdCA9IHQubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgaWYgKHRleHQubGVuZ3RoID09IDApIGJyZWFrXG4gIH1cbn1cblxuXG4vKipcbiogVHJ5cyB0byB1c2UgZDMuc2VsZWN0aW9uIHRvIGdldCBlbGVtZW50LCBpZiBpdCBkb2VzbnQgZXhpc3QsIG1ha2VzIG9uZVxuKiBAcGFyYW0ge2QzLnNlbGVjdGlvbn0gc2VsIHNlbGVjdGlvbiBpbiB3aGljaCB0byB0cnkgYW5kIGZpbmQgb2JqZWN0XG4qIEBwYXJhbSB7c3RyaW5nfSB0YWcgdGFnIG9mIHdoaWNoIHRvIHRyeSBhbmQgc2VsZWN0XG4qIEBwYXJhbSB7c3RyaW5nfSBbY2xzPScnXSBjbGFzcyBvZiB0YWcgdG8gdHJ5IGFuZCBncmFiXG4qIEByZXR1cm5zIHtkMy5zZWxlY3Rpb259IG9mIGVpdGhlciBhcHBlbmQgb3Igc2VsZWN0ZWQgdGFnLmNscyB3aXRoaW4gc2VsXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIHNhZmVTZWxlY3Qoc2VsLCB0YWcsIGNscykge1xuICB2YXIgY2xzU3RyID0gY2xzID09IHVuZGVmaW5lZCA/ICcnIDogJy4nK2NscztcbiAgdmFyIHNTZWwgPSBzZWwuc2VsZWN0KHRhZytjbHNTdHIpLmVtcHR5KClcbiAgPyBzZWwuYXBwZW5kKHRhZylcbiAgOiBzZWwuc2VsZWN0KHRhZytjbHNTdHIpXG4gIHJldHVybiBzU2VsXG4gIC5jbGFzc2VkKGNsc1N0ci5yZXBsYWNlKCcuJywgJycpLCB0cnVlKVxuICAuYXR0cigndHJhbnNmb3JtJywgc1NlbC5hdHRyKCd0cmFuc2Zvcm0nKSA9PSB1bmRlZmluZWQgPyAndHJhbnNsYXRlKDAsMCknIDogc1NlbC5hdHRyKCd0cmFuc2Zvcm0nKSlcbn1cblxuLyoqXG4qIGV2ZW5seSBwYXJ0aXRpb25zIHRoZSByYW5nZSBbbWluLCBtYXhdIGludG8gbiBwYXJ0c1xuKiBAcGFyYW0ge251bWJlcn0gbWluXG4qIEBwYXJhbSB7bnVtYmVyfSBtYXhcbiogQHBhcmFtIHtudW1iZXJ9IG5cbiogQHJldHVybnMge251bWJlcltdfSBhcnJheSBvZiBsZW5ndGggbiBldmVubHkgcGFydGl0aW9uZWQgYmV0d2VlbiBtaW4gYW5kIG1heFxuKi9cbmV4cG9ydCBmdW5jdGlvbiB0aWNrUmFuZ2UobWluLCBtYXgsIG4pIHtcbiAgdmFyIGEgPSBbbWluXVxuICB2YXIgZCA9IG1heC1taW5cbiAgdmFyIHMgPSBkIC8gKG4tMSlcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuLTI7IGkrKykgeyBhLnB1c2gobWluICsgcyAqIChpKzEpKSB9XG4gIGEucHVzaChtYXgpXG4gIHJldHVybiBhXG59XG4iLCJpbXBvcnQge3VuaXF1ZUVsZW1lbnRzfSBmcm9tICcuL2hlbHBlcnMnO1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9UT1RZUEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKlxuKiBUaGlzIGZ1bmN0aW9uIHRlc3RzIHRvIHNlZSBpZiBhbGwgZWxlbWVudHMgb2YgdGhlIHBhc3NlZCBhcnJheSBhcmUgdHJ1ZS5cbiogQHBhcmFtIHtBcnJheX0gYXJyYXkgb2YgdmFsdWVzXG4qIEBwYXJhbSB7RnVuY3Rpb259IFtmdW5jIGZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gdmFsdWUgPT0gdHJ1ZTt9XSBpcyBhcHBsaWVkIHRvIGVhY2ggdmFsdWUgb2YgdGhlIGFycmF5IGFuZCBzaG91bGQgcmV0dXJuIGEgYm9vbGVhbi5cbiogQHJldHVybnMge2Jvb2xlYW59IGlmIGFsbCB2YWx1ZXMgYXJlIHRydWUgYnkgZnVuY3Rpb25cbiovXG5leHBvcnQgZnVuY3Rpb24gYWxsKCBhcnJheSwgZnVuYyApIHtcbiAgaWYgKGZ1bmMgPT0gdW5kZWZpbmVkKSB7IHJldHVybiBhcnJheS5ldmVyeSggZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlID09PSB0cnVlOyB9KTsgfVxuICByZXR1cm4gYXJyYXkuZXZlcnkoIGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiBmdW5jKHZhbHVlKTsgfSApO1xufVxuXG4vKipcbiogQ291bnRzIHRoZSBudW1iZXIgb2Ygb2NjdXJhbmNlcyBvZiBlYWNoIGVsZW1lbnQgaW4gdGhlIGdpdmVuIGFycmF5LlxuKiBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiBlbGVtZW50c1xuKiBAcmV0dXJucyB7T2JqZWN0fSBvZiBrZXk6IHZhbHVlIHBhaXJzIHdoZXJlIGtleSBpcyBhbiBlbGVtZW50IGluIHRoZSBhcnJheSBhbmQgdmFsdWUgaXMgdGhlIG51bWJlciBvZiB0aW1lcyBpdCBvY2N1cnMuXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIHRhbGx5KCBhcnJheSApIHtcbiAgdmFyIHRhbGxpZXMgPSB7fTtcbiAgYXJyYXkubWFwKCBmdW5jdGlvbiAoIGVsZW1lbnQgKSB7XG4gICAgaWYgKCBoYXNRKE9iamVjdC5rZXlzKHRhbGxpZXMpLCBlbGVtZW50KSApIHsgdGFsbGllc1tlbGVtZW50XSA9IDE7IH1cbiAgICBlbHNlIHsgdGFsbGllc1tlbGVtZW50XSArPSAxOyB9XG4gIH0pO1xuICByZXR1cm4gdGFsbGllcztcbn1cbi8qKlxuKiBTaG9ydC1oYW5kIGZvciBhcnJheS5pbmNsdWRlcyhpdGVtKTtcbiogQHBhcmFtIHtBcnJheX0gYXJyYXlcbiogQHBhcmFtIHsqfSBpdGVtIHRvIHRlc3QgaWYgY29udGFpbmVkIGluICB7YXJyYXl9XG4qIEByZXR1cm5zIHtib29sZWFufVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNRKCBhcnJheSwgaXRlbSApIHsgcmV0dXJuIGFycmF5LmluY2x1ZGVzKGl0ZW0pOyB9XG5cbi8qKlxuKiBSZXR1cm5zIGZpcnN0IGl0ZW0gaW4gYXJyYXlcbiogQHBhcmFtIHtBcnJheX0gYXJyYXkgb2YgaXRlbXNcbiogQHJldHVybnMgeyp9IGFycmF5WzBdXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGZpcnN0KCBhcnJheSApIHsgcmV0dXJuIGFycmF5WzBdOyB9XG5cbi8qKlxuKiBSZXR1cm5zIGxhc3QgaXRlbSBpbiBhcnJheVxuKiBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiBpdGVtc1xuKiBAcmV0dXJucyB7Kn0gYXJyYXlbYXJyYXkubGVuZ3RoLTFdXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGxhc3QoIGFycmF5ICkgeyByZXR1cm4gYXJyYXlbYXJyYXkubGVuZ3RoLTFdOyB9XG5cbi8qKlxuKiBDYWxjdWxhdGVzIHRoZSB0b3RhbCB2YWx1ZSBvZiBudW1iZXJzIGluIHBhc3NlZCBhcnJheVxuKiBAcGFyYW0ge251bWJlcltdfSBhcnJheSBvZiBudW1lcmljYWwgdmFsdWVzXG4qIEByZXR1cm5zIHtudW1iZXJ9IHN1bSBvdmVyIGVsZW1lbnRzIGluIGFycmF5XG4qL1xuZXhwb3J0IGZ1bmN0aW9uIHRvdGFsKCBhcnJheSApIHsgcmV0dXJuIGFycmF5LnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApIH07XG5cbi8qKlxuKiBSZW1vdmVzIGR1cGxpY2F0ZXMgaW4gYXJyYXlcbiogQHBhcmFtIHtBcnJheX0gYXJyYXkgb2YgaXRlbXNcbiogQHJldHVybnMge0FycmF5fSBvZiBpdGVtcyBzdWNoIHRoYXQgaXRlbV9pICE9IGl0ZW1faiBmb3IgYWxsIGkgPCBqXG4qIEBzZWV7QGxpbmsgdW5pcXVlRWxlbWVudHN9IGZvciB0aGUgZmlsdGVyaW5nIGZ1bmN0aW9uXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIHVuaXF1ZSggYXJyYXkgKSB7IHJldHVybiBhcnJheS5maWx0ZXIoIHVuaXF1ZUVsZW1lbnRzICk7IH1cblxuLyoqXG4qIEZpbHRlcnMgcGFzc2VkIGFycmF5IGZvciBzcGVjaWZpZWQgaW5kaWNpZXNcbiogQHBhcmFtIHtBcnJheX0gYXJyYXkgb2YgaXRlbXNcbiogQHBhcmFtIHtudW1iZXJbXX0gcG9zaXRpb25zIG9mIGludGVnZXJzIHN1Y2ggdGhhdCBpIDwgYXJyYXkubGVuZ3RoXG4qIEByZXR1cm5zIHtBcnJheX0gb2YgaXRlbXMgc3VjaCB0aGF0IGZvciBhbnkgaXRlbV9pLCBwb3NpdGlvbnMuaW5jbHVkZXMoaSkgPT09IHRydWVcbiovXG5leHBvcnQgZnVuY3Rpb24gZ2V0KCBhcnJheSwgcG9zaXRpb25zICkge1xuICByZXR1cm4gYXJyYXkuZmlsdGVyKCBmdW5jdGlvbiggdmFsdWUsIGluZGV4ICkgeyByZXR1cm4gaGFzUShwb3NpdGlvbnMsIGluZGV4KTsgfSApO1xufVxuXG4vKipcbiogRGV0ZXJtaW5lcyBpZiBhbGwgZWxlbWVudHMgaW4gcGFzc2VkIGFycmF5IGFyZSBhcnJheXMgdGhlbXNlbHZlcy5cbiogQHBhcmFtIHtBcnJheX0gYXJyYXkgb2YgaXRlbXNcbiogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgQXJyYXkuaXNBcnJheShlKSBpcyB0cnVlIGZvciBhbGwgZSBpbiBhcnJheVxuKiBAc2Vle0BsaW5rIGFsbH1cbiovXG5leHBvcnQgZnVuY3Rpb24gbGlzdE9mTGlzdHNRKCBhcnJheSApIHtcbiAgcmV0dXJuIGFsbCggYXJyYXkubWFwKCBmdW5jdGlvbiggZWxlbWVudCwgaW5kZXggKSB7IHJldHVybiBBcnJheS5pc0FycmF5KGVsZW1lbnQpIH0gKSApXG59XG5cbi8qKlxuKiBCdWlsdCBvbiB0b3Agb2YgQHNlZXtAbGluayBnZXR9LCBtYXBwaW5nIGlmIHBvc2l0aW9ucyBpcyBhIGxpc3Qgb2YgbGlzdHMgKEBzZWV7QGxpbmsgbGlzdE9mTGlzdHNRfSlcbiogQHBhcmFtIHtBcnJheX0gYXJyYXkgb2YgaXRlbXNcbiogQHBhcmFtIHtudW1iZXJbXSB8IFtdbnVtYmVyW10gfSBwb3NpdGlvbnMgb2YgaW50ZWdlcnMgb3IgbGlzdCBvZiBwb3NpdGlvbnMgb2YgaW50ZWdlcnNcbiogQHJldHVybnMge2Jvb2xlYW59IHJldHVybnMgc3BlY2lmaWVkIHBvc2l0aW9ucyBmcm9tIGFycmF5LiBJZiBuZXN0ZWQgcG9zaXRpb25zIHBhc3NlZCwgcmV0dXJucyByZXF1ZXN0ZWQgaXRlbXMgaW4gc2FtZSBzdHJ1Y3R1cmUuXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGN1dCggYXJyYXksIHBvc2l0aW9ucyApIHtcbiAgaWYgKCBsaXN0T2ZMaXN0c1EoYXJyYXkpICkgeyByZXR1cm4gcG9zaXRpb25zLm1hcChmdW5jdGlvbihwb3MsIGkpIHsgcmV0dXJuIGFycmF5LmdldChwb3MpOyB9KTsgfVxuICByZXR1cm4gZ2V0KCBhcnJheSwgcG9zaXRpb25zICk7XG59XG5cbi8qKlxuKiBHaXZlbiBhbiBhcnJheSBvZiBvYmplY3RzLCBjb25zdHJ1Y3RzIG5ldyBvYmplY3RzIHdoZXJlIGVhY2ggdmFsdWUgaXMgYSBsaXN0XG4qIGJhc2VkIG9uIHRoZSBjb3JyZXNvbmRpbmcga2V5LCB3aGljaCBpcyBleHRyYWN0ZWQgYnkgdGhlIHBhcmFtZXRlciBieVxuKiBAcGFyYW0ge09iamVjdHNbXX0gYXJyYXkgb2Ygb2JqZWN0c1xuKiBAcGFyYW0ge3N0cmluZ30gYnkga2V5IHdpdGhpbiBhbGwgb2JqZWN0cyBvZiBwYXNzZWQgYXJyYXlcbiogQHBhcmFtIHtzdHJpbmdbXX0gW2dyb3Vwc10gc2F2ZXMgc29tZSBjb21wdXRhdGlvbiBpZiBhbGwga25vd24gdmFsdWVzIGV4dHJhY3RlZCBieSBtYXBwaW5nIG92ZXIgdGhlIHBhcmFtZXRlciBieSBhcmUgcGFzc2VkXG4qIEByZXR1cm5zIHtPYmplY3R9IG9mIGtleSB2YWx1ZSBwYWlycywgd2hlcmUga2V5cyBhcmUgYWxsIHZhbHVlcyBvZiB0aGUga2V5IGJ5IGZyb20gYW4gb2JqZWN0IGluIHRoZSBwYXNzZWQgYXJyYXkgYW5kIHRoZSB2YWx1ZSBhcmUgdGhvc2UgY29ycmVzcG9uZGluZyBvYmplY3RzLlxuKi9cbmV4cG9ydCBmdW5jdGlvbiBncm91cEJ5IChhcnJheSwgYnksIGdyb3Vwcykge1xuICBpZiAoZ3JvdXBzID09IHVuZGVmaW5lZCkge1xuICAgIGdyb3VwcyA9IHVuaXF1ZShhcnJheS5tYXAoZnVuY3Rpb24oZWxlbWVudHMsIGluZGV4KXsgcmV0dXJuIGVsZW1lbnRbYnldOyB9KSk7XG4gICAgZ3JvdXBzLm1hcChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpe2dyb3VwcGVkW3ZhbHVlXSA9IFtdfSlcbiAgfVxuXG4gIHZhciBncm91cHBlZCA9IHt9O1xuICBhcnJheS5tYXAoZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgpe2dyb3VwcGVkW2VsZW1lbnRbYnldXS5wdXNoKGVsZW1lbnQpfSk7XG4gIHJldHVybiBncm91cHBlZFxufVxuXG4vKipcbiogVGVzdHMgaWYgdHdvIGFycmF5cyBhcmUgZXF1aXZhbGVudFxuKiBAcGFyYW0ge0FycmF5fSBhcnJheVxuKiBAcGFyYW0ge0FycmF5fSBvdGhlclxuKiBAcmV0dXJucyB7Ym9vbGVhbn0gaWYgZXZlcnkgZWxlbWVudCBvZiBhcnJheSBtYXRjaGVzIHRoYXQgb2Ygb3RoZXJcbiovXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlFcXVhbHMoYXJyYXksIG90aGVyKSB7XG4gIGlmICghb3RoZXIpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gIC8vIGNvbXBhcmUgbGVuZ3RocyAtIGNhbiBzYXZlIGEgbG90IG9mIHRpbWVcbiAgaWYgKGFycmF5Lmxlbmd0aCAhPSBvdGhlci5sZW5ndGgpXG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGw9YXJyYXkubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIG5lc3RlZCBhcnJheXNcbiAgICAgIGlmIChhcnJheVtpXSBpbnN0YW5jZW9mIEFycmF5ICYmIG90aGVyW2ldIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAvLyByZWN1cnNlIGludG8gdGhlIG5lc3RlZCBhcnJheXNcbiAgICAgICAgICBpZiAoIWFycmF5RXF1YWxzKGFycmF5W2ldLG90aGVyW2ldKSlcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoYXJyYXlbaV0gIT0gb3RoZXJbaV0pIHtcbiAgICAgICAgICAvLyBXYXJuaW5nIC0gdHdvIGRpZmZlcmVudCBvYmplY3QgaW5zdGFuY2VzIHdpbGwgbmV2ZXIgYmUgZXF1YWw6IHt4OjIwfSAhPSB7eDoyMH1cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cblxuXG4vKipcbiogUmVjdXJzaXZlbHkgdGFsbGllcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGF0IGVhY2ggbGV2ZWwgb2YgdGhlIHBhc3NlZCwgcHV0YXRpdmVseSBuZXN0ZWQgYXJyYXlcbiogQHBhcmFtIHtBcnJheX0gYXJyYXkgb2YgaXRlbXMgd2hpY2ggbWF5IGluY2x1ZGUgbmVzdGVkIGFycmF5c1xuKiBAcGFyYW0ge251bWJlcn0gW2xldmVsPTBdIGN1cnJlbnQgZGVwdGggaW4gdGhlIHJlY3Vyc2lvblxuKiBAcGFyYW0ge0FycmF5fSBbbGV2ZWxEYXRhPVtdXSBrZWVwcyB0cmFjayBvZiBpdGVtcyBzZWVuIHNvIGZhciBhdCBlYWNoIGRlcHRoXG4qIEByZXR1cm5zIHtBcnJheX0gc3RhdGluZyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIChhcnJheSBpbmNsdXNpdmUpIGZvdW5kIGF0IGVhY2ggbGV2ZWwgb2YgdGhlIGFycmF5XG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGVsZW1lbnRzQXRMZXZlbHMoYXJyYXksIGxldmVsLCBsZXZlbERhdGEpIHtcbiAgbGV2ZWwgPSBsZXZlbCA9PSB1bmRlZmluZWQgPyAwIDogbGV2ZWwgKyAxO1xuICBsZXZlbERhdGEgPSBsZXZlbERhdGEgPT0gdW5kZWZpbmVkID8gW10gOiBsZXZlbERhdGE7XG4gIGlmICggbGV2ZWwgPj0gbGV2ZWxEYXRhLmxlbmd0aCApIHsgbGV2ZWxEYXRhLnB1c2goYXJyYXkubGVuZ3RoKX0gZWxzZSB7bGV2ZWxEYXRhW2xldmVsXSArPSBhcnJheS5sZW5ndGggfVxuICBhcnJheS5tYXAoZnVuY3Rpb24oZSwgaSkge2lmIChBcnJheS5pc0FycmF5KGUpKXsgZWxlbWVudHNBdExldmVscyhlLCBsZXZlbCwgbGV2ZWxEYXRhKSB9fSlcbiAgcmV0dXJuIGxldmVsRGF0YVxufVxuXG5cbi8qKlxuKiBSZWN1cnNpdmVseSB0YWxsaWVzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgb2YgdGhlIHBhc3NlZCwgcHV0YXRpdmVseSBuZXN0ZWQgYXJyYXlcbiogQHBhcmFtIHtBcnJheX0gYXJyYXkgb2YgaXRlbXMgd2hpY2ggbWF5IGluY2x1ZGUgbmVzdGVkIGFycmF5c1xuKiBAcGFyYW0ge251bWJlcn0gW2VsZW1lbnRzPTBdIGN1cnJlbnQgbnVtYmVyIG9mIGVsZW1lbnRzIHNlZW4gc28gZmFyXG4qIEByZXR1cm5zIHtudW1iZXJ9IG51bWJlciBvZiBlbGVtZW50cyAoYXJyYXkgaW5jbHVzaXZlKSBmb3VuZCBpbiBwYXNzZWQgYXJyYXlcbiovXG5leHBvcnQgZnVuY3Rpb24gbnVtYmVyT2ZFbGVtZW50cyggYXJyYXksIGVsZW1lbnRzICkge1xuICBlbGVtZW50cyA9IGVsZW1lbnRzID09IHVuZGVmaW5lZCA/IDAgOiBlbGVtZW50cztcbiAgYXJyYXkubWFwKGZ1bmN0aW9uKGUsIGkpIHtcbiAgICBpZiAoIEFycmF5LmlzQXJyYXkoZSkgKSB7IGVsZW1lbnRzID0gbnVtYmVyT2ZFbGVtZW50cyhlLCBlbGVtZW50cykgfVxuICAgIGVsc2UgeyBlbGVtZW50cyArPSAxIH1cbiAgfSlcbiAgcmV0dXJuIGVsZW1lbnRzXG59XG5cbi8qKlxuKiBDb25jYXRzIGFsbCBuZXN0ZWQgYXJyYXlzIGluIHBhc3NlZCBhcnJheSB0byBmb3JtIGEgc2luZ2xlIGFycmF5XG4qIEBwYXJhbSB7QXJyYXl9IGFycmF5IG9mIHB1dGF0aXZlbHkgbmVzdGVkIGFycmF5c1xuKiBAcGFyYW0ge0FycmF5fSBbZmxhdD1bXV0gY3VycmVudCBmbGF0dGVuZWQgYXJyYXlcbiogQHJldHVybnMge0FycmF5fSB3aXRoIGV2ZXJ5IGVsZW1lbnQgaW4gdGhlIHNhbWUgbGV2ZWxcbiovXG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlbiggYXJyYXksIGZsYXQgKSB7XG4gIGZsYXQgPSBmbGF0ID09IHVuZGVmaW5lZCA/IFtdIDogZmxhdDtcbiAgYXJyYXkubWFwKGZ1bmN0aW9uKGUsIGkpe1xuICAgIGlmIChBcnJheS5pc0FycmF5KGUpKSB7ZmxhdCA9IGZsYXQuY29uY2F0KGZsYXR0ZW4oZSkpfVxuICAgIGVsc2Uge2ZsYXQucHVzaChlKX1cbiAgfSlcbiAgcmV0dXJuIGZsYXQ7XG59XG5cbi8qKlxuKiBTZWFyY2ggb2YgbGlzdCBvZiBsaXN0cyB0byBmaW5kIHdoaWNoIC0gaWYgYW55IC0gcGFzc2VkIHZhbHVlIGlzIGluXG4qIEBwYXJhbSB7QXJyYXlbXX0gYmlucyBsaXN0IG9mIGxpc3RzIG9mIHZhbHVlc1xuKiBAcGFyYW0geyp9IHZhbHVlIGl0ZW0gdG8gdGVzdCBpZiBpbiBhbnkgb2YgdGhlIGJpbnNcbiogQHJldHVybnMge251bWJlcn0gaW5kaWNhdGluZyB0aGUgaW5kZXggb2YgdGhlIGJpbiBpbiB3aGljaCB2YWx1ZSB3YXMgZm91bmRcbiovXG5leHBvcnQgZnVuY3Rpb24gd2hpY2hCaW4oYmlucywgdmFsdWUpIHtcbiAgdmFyIGkgPSAtMVxuICBmb3IgKHZhciBqID0gMDsgaiA8IGJpbnMubGVuZ3RoOyBqKyspIHsgaWYgKGhhc1EoYmluc1tqXSx2YWx1ZSkpIHtyZXR1cm4gan0gfVxuICByZXR1cm4gaVxufVxuIiwiaW1wb3J0IHtoeXBlbmF0ZSwgc2FmZVNlbGVjdH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7dG90YWx9IGZyb20gJy4vYXJyYXktZnVuY3Rpb25zJztcblxuXG4vKipcbiAqIGNhbGxzIGNvbnNvbGUuZ3JvdXAgaWYgZDNzbS5kZWJ1Z1EgPT0gdHJ1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgb2YgdGhlIGdyb3VwXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uc29sZUdyb3VwKG5hbWUpIHtcbiAgaWYgKHdpbmRvdy5kM3NtLmRlYnVnUSA9PT0gdHJ1ZSl7XG4gICAgY29uc29sZS5ncm91cChuYW1lKVxuICB9XG59XG5cbi8qKlxuICogY2FsbHMgY29uc29sZS5ncm91cEVuZCBpZiBkM3NtLmRlYnVnUSA9PSB0cnVlXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uc29sZUdyb3VwRW5kKCkge1xuICBpZiAod2luZG93LmQzc20uZGVidWdRID09PSB0cnVlKXtcbiAgICBjb25zb2xlLmdyb3VwRW5kKClcbiAgfVxufVxuXG4vKipcbiAqIENhbGxzIGNvbnNvbGUubG9nIGlmIGQzc20uZGVidWdRID09IHRydWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBmdW5jIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGxvZ2dpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cgdG8gbG9nXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YSB0byBiZSBsb2dnZWQgYWxvbmcgc2lkZSB0aGUgbWVzc2FnZVxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvZyhmdW5jLCBtc2csIGRhdGEpIHtcbiAgaWYgKHdpbmRvdy5kM3NtLmRlYnVnUSA9PT0gdHJ1ZSl7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgJWNbZDNzbTo6JHtmdW5jfV06XFx0JHttc2d9YCxcbiAgICAgIFtcbiAgICAgICAgJ2JhY2tncm91bmQ6ICM2Y2QxZWYnLFxuICAgICAgICAnYm9yZGVyLXJhZGl1czogNTAwMHB4JyxcbiAgICAgICAgJ3BhZGRpbmc6IDBweCAycHgnLFxuICAgICAgICAnZm9udC1zaXplOiAxNHB4J1xuICAgICAgXS5qb2luKCc7JylcbiAgICApXG4gICAgY29uc29sZS50YWJsZShkYXRhKVxuICAgIC8vIGNvbnNvbGUudHJhY2UoKVxuICB9XG59XG5cbi8qKlxuICogQ2FsbHMgY29uc29sZS53YXJuIGlmIGQzc20uZGVidWdRID09IHRydWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBmdW5jIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHdhcm5pbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cgdG8gZGlzcGxheVxuICogQHBhcmFtIHtPYmplY3R9IGRhdGEgdG8gYmUgZGlzcGxheWVkIGFsb25nIHNpZGUgdGhlIG1lc3NhZ2VcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3YXJuKGZ1bmMsIG1zZywgZGF0YSkge1xuICBpZiAod2luZG93LmQzc20uZGVidWdRID09PSB0cnVlKVxuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGAlY1tkM3NtOjoke2Z1bmN9XTpcXHQke21zZ31gLFxuICAgICAgW1xuICAgICAgICAnYmFja2dyb3VuZDogI2ZmZDUzZScsXG4gICAgICAgICdib3JkZXItcmFkaXVzOiA1MDAwcHgnLFxuICAgICAgICAncGFkZGluZzogMHB4IDJweCcsXG4gICAgICAgICdmb250LXNpemU6IDE0cHgnXG4gICAgICBdLmpvaW4oJzsnKVxuICAgIClcbiAgICBjb25zb2xlLnRhYmxlKGRhdGEpXG59XG4vKipcbiAqIENhbGxzIHRoZSBjb25zb2xlLmluZm8gaWYgZDNzbS5kZWJ1Z1EgPT0gdHJ1ZVxuICogQHBhcmFtIHtzdHJpbmd9IGZ1bmMgbmFtZSBvZiB0aGUgZnVuY3Rpb24gcHJvdmlkaW5nIGluZm9cbiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cgdG8gZGlzcGxheVxuICogQHBhcmFtIHtPYmplY3R9IGRhdGEgdG8gYmUgZGlzcGxheWVkIGFsb25nIHNpZGUgdGhlIG1lc3NhZ2VcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmZvKGZ1bmMsIG1zZywgZGF0YSkge1xuICBpZiAod2luZG93LmQzc20uZGVidWdRKVxuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgIGAlY1tkM3NtOjoke2Z1bmN9XTpcXHQke21zZ31gLFxuICAgICAgW1xuICAgICAgICAnYmFja2dyb3VuZDogIzAwOWNjZCcsXG4gICAgICAgICdib3JkZXItcmFkaXVzOiA1MDAwcHgnLFxuICAgICAgICAncGFkZGluZzogMHB4IDJweCcsXG4gICAgICAgICdmb250LXNpemU6IDE0cHgnXG4gICAgICBdLmpvaW4oJzsnKVxuICAgIClcbiAgICBjb25zb2xlLnRhYmxlKGRhdGEpXG59XG5cblxuLyoqXG4gKiBDYWxscyBjb25zb2xlLmVycm9yIGlmIGQzc20uZGVidWdRID09IHRydWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBmdW5jIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHdoaWNoIHNlbmRzIHRoZSBlcnJvclxuICogQHBhcmFtIHtzdHJpbmd9IG1zZyB0byBkaXNwbGF5XG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YSB0byBiZSBkaXNwbGF5ZWQgYWxvbmcgc2lkZSB0aGUgbWVzc2FnZVxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yKGZ1bmMsIG1zZywgZGF0YSkge1xuICBpZiAod2luZG93LmQzc20uZGVidWdRKVxuICAgIGNvbnNvbGUuZXJyb3IoYFtkM3NtOjoke2Z1bmN9XTpcXHQke21zZ31cXHQlb2AsZGF0YSlcbn1cblxuXG5cblxuXG4vKipcbiogRnVuY3Rpb24gZm9yIHNldHRpbmcgdXAgY29udGFpbmVycyBmb3IgbW9zdCBwbG90cyB3aXRoIHRoZSB5IGF4aXMgY29udGFpbmVyXG4qIHBvc2l0aW9uZWQgb24gdGhlIGxlZnQgYW5kIHRoZSB4IGF4aXMgY29udGFpbmVyIHBvc2l0aW9uZWQgb24gdGhlIGJvdHRvbVxuKiBAcGFyYW0ge2QzLnNlbGVjdGlvbn0gc2VsZWN0aW9uIHNlbGVjdGlvbiBvZiBjb250YWluZXIgaW4gd2hpY2ggdGhlIHN2ZyBpcyBvciBzaG91bGQgYmUgbWFkZVxuKiBAcGFyYW0ge3N0cmluZ30gbmFtZXNwYWNlIG5hbWVzcGFjZSBvZiB0aGUgY2hhcnRcbiogQHBhcmFtIHtPYmplY3R9IFtzcGFjZT17dzp3aW5kb3cuaW5uZXJXaWR0aCwgaDp3aW5kb3cuaW5uZXJIZWlnaHR9XSB0aGUgd2lkdGggKHcpIGFuZCBoZWlnaHQgKGgpIGF2YWlsYmxlXG4qIEBwYXJhbSB7bWFyZ2luc30gW21hcmdpbnM9e3RvcDogMC4wMSwgYm90dG9tOiAwLjAxLCBsZWZ0OiAwLjAxLCByaWdodDogMC4wMX1dIHRoZSBtYXJnaW5zIGZvciB0aGUgY2hhcnRcbiogQHBhcmFtIHtwZXJjZW50YWdlc30gW3BlcmNlbnRhZ2VzID0ge2F4ZXM6e3g6MC4xLHk6MC4xfSxzcGFjZTp7dzowLjgsaDowLjZ9fV0gcGVyY2VudGFnZXMgb2YgdGhlIHBhcmFtIHNwYWNlXG4qIG9mIHdoaWNoIHRvIG1ha2UgdGhlIHggYW5kIHkgYXhlcyBhcyB3ZWxsIGFzIHRoZSBwZXJjZW50IG9mIHRoZSBhdmFpbGJsZSBzcGFjZSBpbiB3aGljaCB0byByZW5kZXIgdGhlIHBsb3RcbiogQHBhcmFtIHtPYmplY3R9IFtwZXJjZW50YWdlcy5heGVzPXt4OjAuMSx5OjAuMX1dIHRoZSBwZXJjZW50YWdlcyBvZiB0aGUgcGFyYW1hdGVyIHNwYWNlLCBvZiB3aGljaCB0aGUgeCBhbmQgeSBheGVzIHdpbGwgdGFrZSB1cFxuKiBAcGFyYW0ge251bWJlcn0gW3BlcmNlbnRhZ2VzLmF4ZXMueEF4aXNQZXJjZW50PTAuMV0gdGhlIHBlcmNlbnRhZ2VzIG9mIHRoZSBwYXJhbWF0ZXIgc3BhY2UsIG9mIHdoaWNoIHRoZSB4IGF4aXMgd2lsbCB0YWtlIHVwXG4qIEBwYXJhbSB7bnVtYmVyfSBbcGVyY2VudGFnZXMuYXhlcy55QXhpc1BlcmNlbnQ9MC4xXSB0aGUgcGVyY2VudGFnZXMgb2YgdGhlIHBhcmFtYXRlciBzcGFjZSwgb2Ygd2hpY2ggdGhlIHkgYXhpcyB3aWxsIHRha2UgdXBcblxuKiBAcGFyYW0ge09iamVjdH0gW3BlcmNlbnRhZ2VzLnNwYWNlPXt3OjAuOCxoOjAuNn1dIHRoZSBwZXJjZW50YWdlcyBvZiB0aGUgcGFyYW1hdGVyIHNwYWNlLCBvZiB3aGljaCB0aGUgU1ZHJ3Mgd2lkdGggYW5kIGhlaWdodCB3aWxsIGJlIHNldFxuKiBAcGFyYW0ge251bWJlcn0gW3BlcmNlbnRhZ2VzLnNwYWNlLnBlcmNlbnRPZlNwYWNlRm9yV2lkdGg9MC4xXSB0aGUgcGVyY2VudGFnZXMgb2YgdGhlIHBhcmFtYXRlciBzcGFjZSwgb2Ygd2hpY2ggdGhlIFNWRydzIHdpZHRoIHdpbGwgYmUgc2V0XG4qIEBwYXJhbSB7bnVtYmVyfSBbcGVyY2VudGFnZXMuc3BhY2UucGVyY2VudE9mU3BhY2VGb3JIZWlnaHQ9MC4xXSB0aGUgcGVyY2VudGFnZXMgb2YgdGhlIHBhcmFtYXRlciBzcGFjZSwgb2Ygd2hpY2ggdGhlIFNWRydzIGhlaWdodCB3aWxsIGJlIHNldFxuXG4qIEByZXR1cm5zIHtPYmplY3R9IHJldHVybnMgdGhlIHNlbGVjdGlvbiBhbmQgXCJib3VuZGluZ1JlY3RzXCIgb2YgdGhlIHBsb3QgY29udGFpbmVyLCB4LWF4aXMgY29udGFpbmVyIGFuZCB5LWF4aXMgY29udGFpbmVyXG4qIGFzIHsgcGxvdDoge3NlbGVjdGlvbjogcGxvdFNlbGVjdGlvbiwgcmVjdDogcGxvdFJlY3R9LCB4QXhpczp7c2VsZWN0aW9uOnhBeGlzU2VsZWN0aW9uLCByZWN0OnhBeGlzUmVjdH0sIHlBeGlzOiB7c2VsZWN0aW9uOnlBeGlzU2VsZWN0aW9uLCByZWN0OnlBeGlzUmVjdH19XG4qIHdoZXJlIGVhY2ggcmVjdCBoYXMgZm9ybSB7eDogIywgeTogIywgaDogIywgdzogI30gZGVwaWN0aW5nIHRoZSBzdGFydGluZyB4IGFuZCB5IGNvb3JkaW5hdGUgb2YgdGhlXG4qIGNvcmVzcG9uZGluZyBjb250YWluZXIgKGFsc28gdGhlaXIgZGVmYXVsdCB0cmFuc2Zvcm0gdmFsdWVzKSBhcyB3ZWxsIHRoZWlyIGhlaWdodCAoaCkgYW5zIHdpZHRoICh3KVxuKi9cbi8vIGV4cG9ydCBmdW5jdGlvbiBzZXR1cFN0YW5kYXJkQ2hhcnRDb250YWluZXJzKCBzZWxlY3Rpb24sIG5hbWVzcGFjZSwgc3BhY2UsIG1hcmdpbnMsIHBlcmNlbnRhZ2VzKSB7XG5leHBvcnQgZnVuY3Rpb24gc2V0dXBTdGFuZGFyZENoYXJ0Q29udGFpbmVycyhcbiAgc2VsZWN0aW9uLFxuICBuYW1lc3BhY2UsXG4gIHNwYWNlLFxuICBtYXJnaW5zPXt0b3A6MC4wMSwgYm90dG9tOjAuMDEsIGxlZnQ6MC4wMSwgcmlnaHQ6MC4wMX0sXG4gIHBlcmNlbnRhZ2VzPXtheGVzOiB7eDogeEF4aXNQZXJjZW50PTAuMSwgeTogeUF4aXNQZXJjZW50PTAuMX0sIHNwYWNlOiB7dzogcGVyY2VudE9mU3BhY2VGb3JXaWR0aCwgaDogcGVyY2VudE9mU3BhY2VGb3JIZWlnaHR9fVxuKSB7XG4gIGlmIChzcGFjZSA9PSB1bmRlZmluZWQpIHsgc3BhY2UgPSB7dzogd2luZG93LmlubmVyV2lkdGgsIGg6IHdpbmRvdy5pbm5lckhlaWdodH0gfVxuICBpZiAobWFyZ2lucyA9PSB1bmRlZmluZWQpIHsgbWFyZ2lucyA9IHt0b3A6IDAuMDEsIGJvdHRvbTogMC4wMSwgbGVmdDogMC4wMSwgcmlnaHQ6IDAuMDF9IH1cbiAgaWYgKHBlcmNlbnRhZ2VzID09IHVuZGVmaW5lZCkgeyBwZXJjZW50YWdlcyA9IHt9OyB9XG4gIGlmIChwZXJjZW50YWdlcy5heGVzID09IHVuZGVmaW5lZCkgeyBwZXJjZW50YWdlcy5heGVzID0geyB4OjAuMSwgeTowLjEgfSB9XG4gIGlmIChwZXJjZW50YWdlcy5zcGFjZSA9PSB1bmRlZmluZWQpIHsgcGVyY2VudGFnZXMuc3BhY2UgPSB7IHc6IDAuOCwgaDogMC42IH0gfVxuXG4gIC8vIFNWRyB3aWR0aCBhbmQgaGVpZ2h0XG4gIHZhciBzdmdTcGFjZSA9ICB7XG4gICAgdzogc3BhY2UudyAqIHBlcmNlbnRhZ2VzLnNwYWNlLncsXG4gICAgaDogc3BhY2UuaCAqIHBlcmNlbnRhZ2VzLnNwYWNlLmhcbiAgfSxcblxuICAvLyBTcGFjZSBhZnRlciByZW1vdmluZyBtYXJnaW5zXG4gIGNoYXJ0U3BhY2UgPSB7XG4gICAgdzogc3ZnU3BhY2UudyAtIChtYXJnaW5zLmxlZnQgKiBzcGFjZS53KSAtIChtYXJnaW5zLnJpZ2h0ICogc3BhY2UudyksXG4gICAgaDogc3ZnU3BhY2UuaCAtIChtYXJnaW5zLnRvcCAqIHNwYWNlLmgpIC0gKG1hcmdpbnMuYm90dG9tICogc3BhY2UuaClcbiAgfSxcblxuICAvLyBtYWluIGRpbWVuc2lvbiBvZiB4IGFuZCB5IGF4aWVzXG4gIC8vIGUuZy4gZGVmaW5lcyBob3cgdGFsbCB4IGF4aXMgaXMgYXMgbGVuZ3RoIGlzIGRldGVybWluZWQgYnkgcGxvdFJlY3Qud1xuICBheGVzU3BhY2UgPSB7XG4gICAgeDogY2hhcnRTcGFjZS5oICogcGVyY2VudGFnZXMuYXhlcy54LFxuICAgIHk6IGNoYXJ0U3BhY2UudyAqIHBlcmNlbnRhZ2VzLmF4ZXMueVxuICB9LFxuXG4gIC8vIHNwYWNlIGxlZnQgZm9yIGRyYXdpbmcgdGhlIGNoYXJ0IHByb3Blcmx5IChlLmcuIGJhcnMsIHZpb2xpbnMsIGV0YylcbiAgZHJhd2luZ1NwYWNlID0ge1xuICAgIHg6IGNoYXJ0U3BhY2UudyAtIGF4ZXNTcGFjZS55LFxuICAgIHk6IGNoYXJ0U3BhY2UuaCAtIGF4ZXNTcGFjZS54XG4gIH0sXG5cblxuICB5QXhpc1JlY3QgPSB7XG4gICAgeDogYXhlc1NwYWNlLnkgKyAobWFyZ2lucy5sZWZ0ICogc3BhY2UudyksXG4gICAgeTogKG1hcmdpbnMudG9wICogc3BhY2UuaCksXG4gICAgdzogYXhlc1NwYWNlLnksXG4gICAgaDogZHJhd2luZ1NwYWNlLnlcbiAgfSxcblxuICBwbG90UmVjdCA9IHtcbiAgICB4OiBheGVzU3BhY2UueSArIChtYXJnaW5zLmxlZnQgKiBzcGFjZS53KSxcbiAgICB5OiAobWFyZ2lucy50b3AgKiBzcGFjZS5oKSxcbiAgICB3OiBkcmF3aW5nU3BhY2UueCxcbiAgICBoOiBkcmF3aW5nU3BhY2UueVxuICB9LFxuXG4gIHhBeGlzUmVjdCA9IHtcbiAgICB4OiBheGVzU3BhY2UueSArIChtYXJnaW5zLmxlZnQgKiBzcGFjZS53KSxcbiAgICB5OiAobWFyZ2lucy50b3AgKiBzcGFjZS5oICsgcGxvdFJlY3QuaCksXG4gICAgdzogZHJhd2luZ1NwYWNlLngsXG4gICAgaDogYXhlc1NwYWNlLnhcbiAgfVxuXG5cbiAgdmFyIGNvbnRhaW5lciA9IHNhZmVTZWxlY3Qoc2VsZWN0aW9uLCAnc3ZnJywgbmFtZXNwYWNlKVxuICAgIC5zdHlsZSgnd2lkdGgnLCBzdmdTcGFjZS53KydweCcpXG4gICAgLnN0eWxlKCdoZWlnaHQnLCBzdmdTcGFjZS5oKydweCcpXG5cbiAgdmFyIGF4ZXMgPSBzYWZlU2VsZWN0KGNvbnRhaW5lciwgJ2cnLCBoeXBlbmF0ZShuYW1lc3BhY2UsICdheGVzJykpXG5cbiAgLy8gLmF0dHIoJ3RyYW5zZm9ybScsIFwidHJhbnNsYXRlKFwiK3Bsb3RSZWN0LngrXCIsXCIrcGxvdFJlY3QueStcIilcIiksXG5cbiAgdmFyIHBsb3QgPSBzYWZlU2VsZWN0KGNvbnRhaW5lciwgJ2cnLCBoeXBlbmF0ZShuYW1lc3BhY2UsICdwbG90JykpXG4gICAgLmF0dHIoJ3RyYW5zZm9ybScsIFwidHJhbnNsYXRlKFwiK3Bsb3RSZWN0LngrXCIsXCIrcGxvdFJlY3QueStcIilcIilcblxuICB2YXIgeEF4aXMgPSBzYWZlU2VsZWN0KGF4ZXMsICdnJywgaHlwZW5hdGUobmFtZXNwYWNlLCAneC1heGlzJykpXG4gICAgLmF0dHIoJ3RyYW5zZm9ybScsIFwidHJhbnNsYXRlKFwiK3hBeGlzUmVjdC54K1wiLFwiK3hBeGlzUmVjdC55K1wiKVwiKVxuXG4gIHZhciB5QXhpcyA9IHNhZmVTZWxlY3QoYXhlcywgJ2cnLCBoeXBlbmF0ZShuYW1lc3BhY2UsICd5LWF4aXMnKSlcbiAgICAuYXR0cigndHJhbnNmb3JtJywgXCJ0cmFuc2xhdGUoXCIreUF4aXNSZWN0LngrXCIsXCIreUF4aXNSZWN0LnkrXCIpXCIpXG5cbiAgcmV0dXJuIHtcbiAgICBzdmc6IHtcbiAgICAgIHNlbGVjdGlvbjogY29udGFpbmVyLFxuICAgICAgcmVjdDogc3ZnU3BhY2VcbiAgICB9LFxuICAgIHBsb3Q6IHtcbiAgICAgIHNlbGVjdGlvbjogcGxvdCxcbiAgICAgIHJlY3Q6IHBsb3RSZWN0XG4gICAgfSxcbiAgICB4QXhpczoge1xuICAgICAgc2VsZWN0aW9uOiB4QXhpcyxcbiAgICAgIHJlY3Q6IHhBeGlzUmVjdFxuICAgIH0sXG4gICAgeUF4aXM6IHtcbiAgICAgIHNlbGVjdGlvbjogeUF4aXMsXG4gICAgICByZWN0OiB5QXhpc1JlY3RcbiAgICB9XG4gIH1cblxuICAvLyByZXR1cm4gW3Bsb3QsIHhBeGlzLCB5QXhpc11cbn1cblxuXG5cbi8qKlxuKiBBZGRzIGEgY2xpcC1wYXRoIHJlY3QgYW5kIGJpbmRzIGl0IHRvIGNvbnRhaW5lclxuKiBAcGFyYW0ge2QzLnNlbGVjdGlvbn0gY29udGFpbmVyIGluIHdoaWNoIHRvIGFkZCB0aGUgY2xpcC1wYXRoIGFuZCB0byB3aGljaCB0byBiaW5kIHRoZSBjbGlwaW5nIHBhdGggdG9cbiogQHBhcmFtIHtPYmplY3R9IHJlY3QgdGhlIGNvb3JkaW5hdGVzICh4LCB5LCB3aWR0aCwgaGVpZ2h0KSBvZiB0aGUgY2xpcC1wYXRoXG4qIEBwYXJhbSB7c3RyaW5nfSBuYW1lc3BhY2VcbiogQHJldHVybnMge2QzLnNlbGVjdGlvbn0gb2YgdGhlIGNsaXAtcGF0aCByZWN0XG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGNwUmVjdChjb250YWluZXIsIHJlY3QsIG5hbWVzcGFjZSkge1xuICB2YXIgZGVmcyA9IHNhZmVTZWxlY3QoY29udGFpbmVyLCAnZGVmcycsIGh5cGVuYXRlKG5hbWVzcGFjZSwgJ2RlZmluaXRpb25zJykpXG4gIHZhciBjcCA9IHNhZmVTZWxlY3QoZGVmcywgJ2NsaXBQYXRoJywgaHlwZW5hdGUobmFtZXNwYWNlLCAnY2xpcC1wYXRoJykpXG4gIC5hdHRyKCdpZCcsIGh5cGVuYXRlKG5hbWVzcGFjZSwgJ2NsaXAtcGF0aCcpKVxuXG4gIHZhciBjcFJlY3QgPSBzYWZlU2VsZWN0KGNwLCAncmVjdCcpXG4gIC5hdHRyKCd4JywgcmVjdC54KVxuICAuYXR0cigneScsIHJlY3QueSlcbiAgLmF0dHIoJ3dpZHRoJywgcmVjdC53aWR0aClcbiAgLmF0dHIoJ2hlaWdodCcsIHJlY3QuaGVpZ2h0KVxuXG4gIGRlZnMucmFpc2UoKVxuICAvLyBzZXQgY2xpcHBpbmcgcGF0aCB0byBjb250YWluZXJcbiAgY29udGFpbmVyLmF0dHIoJ2NsaXAtcGF0aCcsICd1cmwoIycrIGh5cGVuYXRlKG5hbWVzcGFjZSwgJ2NsaXAtcGF0aCcpKycpJylcblxuICByZXR1cm4gY3BSZWN0XG59XG5cblxuLyoqXG4qIEFkZHMgYSBiYWNrZ3JvdW5kIHJlY3QgdCB0byBjb250YWluZXJcbiogQHBhcmFtIHtkMy5zZWxlY3Rpb259IGNvbnRhaW5lciBpbiB3aGljaCB0byBhZGQgdGhlIGJhY2tncm91bmQgcmVjdGFuZ2xlXG4qIEBwYXJhbSB7T2JqZWN0fSByZWN0IHRoZSBjb29yZGluYXRlcyAoeCwgeSwgd2lkdGgsIGhlaWdodCkgb2YgdGhlIGJhY2tncm91bmRcbiogQHBhcmFtIHtzdHJpbmd9IGZpbGwgdGhlIGNvbG9yIG9mIHRoZSBiYWNrZ3JvdW5kXG4qIEByZXR1cm5zIHtkMy5zZWxlY3Rpb259IG9mIHRoZSBiYWNrZ3JvdW5kIGZpbGxcbiovXG5leHBvcnQgZnVuY3Rpb24gYmdSZWN0KGNvbnRhaW5lciwgcmVjdCwgZmlsbCkge1xuICByZXR1cm4gc2FmZVNlbGVjdChjb250YWluZXIsICdyZWN0JywgJ2JnJylcbiAgLmF0dHIoJ3gnLCByZWN0LngpXG4gIC5hdHRyKCd5JywgcmVjdC55KVxuICAuYXR0cignd2lkdGgnLCByZWN0LndpZHRoKVxuICAuYXR0cignaGVpZ2h0JywgcmVjdC5oZWlnaHQpXG4gIC5hdHRyKCdmaWxsJywgZmlsbClcbn1cblxuXG4vKipcbiogU2V0cyB1cCB0aGUgY29udGFpbmVyIGZvciBtYWtpbmcgY2hhcnQgZWxlbWVudHMuIFRoaXMgaW5jbHVkZXMgbWFraW5nXG4qIGEgY2xpcC1wYXRoIHJlY3QgYm91bmQgdG8gdGhlIHBhc3NlZCBjb250YWluZXIsIGEgYmFja2dyb3VuZCByZWN0LCBhbmRcbiogYSBnIGVsZW1lbnQgd2l0aCBjbGFzcyA8bmFtZXNwYWNlPi1vYmplY3QtY29udGFpbmVyLlxuKiBAcGFyYW0ge2QzLnNlbGVjdGlvbn0gY29udGFpbmVyIGluIHdoaWNoIHRvIGFkZCB0aGUgY2xpcC1wYXRoIGFuZCBiYWNrZ3JvdW5kXG4qIEBwYXJhbSB7c3RyaW5nfSBuYW1lc3BhY2VcbiogQHBhcmFtIHtPYmplY3R9IHJlY3QgdGhlIGNvb3JkaW5hdGVzICh4LCB5LCB3aWR0aCwgaGVpZ2h0KSBvZiB0aGUgYmFja2dyb3VuZCBhbmQgY2xpcC1wYXRoXG4qIEBwYXJhbSB7c3RyaW5nfSBmaWxsIHRoZSBjb2xvciBvZiB0aGUgYmFja2dyb3VuZFxuKiBAcmV0dXJucyB7ZDMuc2VsZWN0aW9ufSBvZiBnLjxuYW1lc3BhY2U+LW9iamVjdC1jb250YWluZXJcbipcbiogQHNlZXtAbGluayBiZ1JlY3R9XG4qIEBzZWV7QGxpbmsgY3BSZWN0fVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXR1cENvbnRhaW5lcihzZWxlY3Rpb24sIG5hbWVzcGFjZSwgcmVjdCwgZmlsbCkge1xuICAvLyB0aGUgY29udGFpbmVyIGZvciB0aHJlZSBtYWluIGl0ZW1zLCBiZywgZGVmcywgYW5kIG9iamVjdC1jb250YWluZXJcbiAgdmFyXG4gIGNvbnRhaW5lciA9IHNhZmVTZWxlY3Qoc2VsZWN0aW9uLCAnZycsIG5hbWVzcGFjZSksXG4gIGJnID0gYmdSZWN0KGNvbnRhaW5lciwgcmVjdCwgZmlsbCksXG4gIGNwID0gY3BSZWN0KGNvbnRhaW5lciwgcmVjdCwgbmFtZXNwYWNlKSxcbiAgb2JqZWN0Q29udGFpbmVyID0gc2FmZVNlbGVjdChjb250YWluZXIsICdnJywgaHlwZW5hdGUobmFtZXNwYWNlLCAnb2JqZWN0LWNvbnRhaW5lcicpKVxuICByZXR1cm4gb2JqZWN0Q29udGFpbmVyXG59XG5cblxuLyoqXG4qIGRldGVybWluZXMgdGhlIHdpZHRoIG9mIGFuIG9iamVjdCBmb3IgdGhlIGNhbGxpbmcgcGxvdHRpbmcgZnVuY3Rpb25cbiogQHBhcmFtIHtudW1iZXJ9IGZyZWVTcGFjZSBob3cgbXVjaCBzcGFjZSBpcyBhdmFsaWJsZVxuKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyT2ZPYmplY3RzIGhvdyBtYW55IG9iamVjdCBkbyB3ZSBuZWVkXG4qIEBwYXJhbSB7bnVtYmVyfSBtaW5PYmplY3RXaWR0aCBob3cgc21hbGwgYXJlIHRoZXNlIG9iamVjdHMgYWxsb3dlZCB0byBiZVxuKiBAcGFyYW0ge251bWJlcn0gbWF4T2JqZWN0V2lkdGggaG93IGxhcmdlIGFyZSB0aGVzZSBvYmplY3QgYWxsb3dlZCB0byBiZVxuKiBAcGFyYW0ge251bWJlcn0gc2l6ZU9mU3BhY2VyIHBlcmNlbnQgb2YgZnJlZVNwYWNlIHRoYXQgYSBzaW5nbGUgc3BhY2VyIHNob3VsZCB0YWtlIHVwIChuZWVkIG51bWJlck9mT2JqZWN0cyAtIDEgc3BhY2VycylcbiogQHBhcmFtIHtib29sZWFufSBvdmVyZmxvd1EgY2FuIHdlIGdvIGJleW9uZCBhbGxvdGVkIHNwYWNlXG4qIEByZXR1cm5zIHtudW1iZXJ9IGhvdyBsYXJnZSBvYmplY3Qgc2hvdWxkIGJlXG4qIGZ1bmN0aW9uIHRyaWVzIHRvIGtlZXAgb2JqZWN0IHdpdGhpbiBtaW4gLyBtYXggd2lkdGgsIGJ1dCB3aWwgZGVmYXVsdCB0b1xuKiA1ZS0xMCAoc21hbGxlc3QgY29uc2lzdGVubHkgdmlzaWJsZSBieSBzdmcgc2l6ZSBvZiBlbGVtZW50KSBpZiBvdmVyZmxvd1EgaXMgZmFsc2VcbiovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlV2lkdGhPZk9iamVjdChmcmVlU3BhY2UsIG51bWJlck9mT2JqZWN0cywgbWluT2JqZWN0V2lkdGgsIG1heE9iamVjdFdpZHRoLCBzaXplT2ZTcGFjZXIsIG92ZXJmbG93USkge1xuICB2YXIgc2l6ZU9mU3BhY2VyID0gc2l6ZU9mU3BhY2VyIDwgMSA/IGZyZWVTcGFjZSAqIHNpemVPZlNwYWNlciA6IHNpemVPZlNwYWNlclxuICB2YXIgbnVtYmVyT2ZTcGFjZXJzID0gbnVtYmVyT2ZPYmplY3RzIC0gMVxuICB2YXIgc3BhY2VUYWtlbkJ5U3BhY2VycyA9IG51bWJlck9mU3BhY2VycyAqIHNpemVPZlNwYWNlclxuICB2YXIgcmVtYWluaW5nU3BhY2UgPSBmcmVlU3BhY2UgLSBzcGFjZVRha2VuQnlTcGFjZXJzXG4gIHJlbWFpbmluZ1NwYWNlID0gcmVtYWluaW5nU3BhY2UgPCAwID8gMCA6IHJlbWFpbmluZ1NwYWNlXG4gIHZhciBvYmplY3RXaWR0aCA9IHJlbWFpbmluZ1NwYWNlIC8gbnVtYmVyT2ZPYmplY3RzXG5cbiAgaWYgKCBtYXhPYmplY3RXaWR0aCAhPSB1bmRlZmluZWQgJiYgb2JqZWN0V2lkdGggPiBtYXhPYmplY3RXaWR0aCApIHsgb2JqZWN0V2lkdGggPSBtYXhPYmplY3RXaWR0aCB9XG4gIGlmICggb3ZlcmZsb3dRICYmIG1pbk9iamVjdFdpZHRoICE9IHVuZGVmaW5lZCAmJiBvYmplY3RXaWR0aCA8IG1pbk9iamVjdFdpZHRoICkgeyBvYmplY3RXaWR0aCA9IG1pbk9iamVjdFdpZHRoIH1cbiAgcmV0dXJuIE1hdGgubWF4KG9iamVjdFdpZHRoLCA1ZS0xMClcbn1cblxuLyoqXG4qIEBwYXJhbSB7QXJyYXlbXX0gZGF0YSBsaXN0IGRhdGEgKGNhbiBiZSBuZXN0ZWQpLiBJZiBuZXN0ZWQgd2lsbCBjcmVhdGUgbW9yZSBjb21wbGV4IHNwYWNlciBzaXplXG4qIEBwYXJhbSB7bnVtYmVyfSBmcmVlU3BhY2UgaG93IG11Y2ggc3BhY2UgaXMgYXZhbGlibGVcbiogQHBhcmFtIHtudW1iZXJ9IG9iamVjdFdpZHRoIEBzZWV7QGxpbmsgY2FsY3VsYXRlV2lkdGhPZk9iamVjdH1cbiogQHBhcmFtIHtudW1iZXJ9IG51bWJlck9mT2JqZWN0cyBob3cgbWFueSBvYmplY3QgZG8gd2UgbmVlZFxuKiBAcGFyYW0ge251bWJlcn0gYmFzZVNwYWNlclNpemUgcGVyY2VudCBvZiBmcmVlU3BhY2UgdGhhdCBhIHNpbmdsZSBzcGFjZXIgc2hvdWxkIHRha2UgdXAgKG5lZWQgbnVtYmVyT2ZPYmplY3RzIC0gMSBzcGFjZXJzKVxuKiBAcGFyYW0ge2Jvb2xlYW59IG92ZXJmbG93USBjYW4gd2UgZ28gYmV5b25kIGFsbG90ZWQgc3BhY2VcbiogQHJldHVybnMge251bWJlcn0gcmV0dXJucyBzaXplIHRoYXQgc3BhY2VyIHNob3VsZCBiZSBhdCBsZXZlbD0wXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZVdpZHRoT2ZTcGFjZXIoZGF0YSwgZnJlZVNwYWNlLCBvYmplY3RXaWR0aCwgbnVtYmVyT2ZPYmplY3RzLCBiYXNlU3BhY2VyU2l6ZSwgb3ZlcmZsb3dRKSB7XG4gIGlmIChvdmVyZmxvd1EpIHtcbiAgICB2YXIgbGltaXRlZE51bWJlck9mT2JqZWN0cyA9IG51bWJlck9mT2JqZWN0cyA+IDYgPyA2IDogbnVtYmVyT2ZPYmplY3RzXG4gICAgdmFyIHNwYWNlTGVmdCA9IGZyZWVTcGFjZSAtIGxpbWl0ZWROdW1iZXJPZk9iamVjdHMgKiBvYmplY3RXaWR0aFxuICAgIHJldHVybiBzcGFjZUxlZnQgLyAobGltaXRlZE51bWJlck9mT2JqZWN0cyAtIDEpXG4gIH1cbiAgdmFyIHNwYWNlcnNBdEVhY2hMZXZlbCA9IHNwYWNlcnNOZWVkZWRBdEVhY2hMZXZlbChkYXRhKVxuICB2YXIgdG90YWxTcGFjZXJQZXJjZW50ID0gdG90YWwoc3BhY2Vyc0F0RWFjaExldmVsLm1hcChmdW5jdGlvbihlLCBpKSB7cmV0dXJuIGUgKiAxIC8gKGkrMSl9KSlcbiAgdmFyIGJhc2VTcGFjZXJTaXplID0gKGZyZWVTcGFjZSAtIChvYmplY3RXaWR0aCAqIG51bWJlck9mT2JqZWN0cykpIC8gdG90YWxTcGFjZXJQZXJjZW50XG4gIC8vIGNvbnNvbGUubG9nKHRvdGFsU3BhY2VyUGVyY2VudCwgYmFzZVNwYWNlclNpemUsIHRvdGFsU3BhY2VyUGVyY2VudCAqIGJhc2VTcGFjZXJTaXplKVxuICByZXR1cm4gYmFzZVNwYWNlclNpemVcbn1cblxuXG4vKipcbiogQ2FsY3VsYXRlcyBudW1iZXIgb2Ygc3BhY2VycyBuZWVkZWQgdG8gc2VwZXJhdGUgZWxlbWVudHMgYXQgZWFjaCBsZXZlbC5cbiogQHBhcmFtIHtBcnJheVtdfSBhcnJheSBsaXN0IGRhdGEgKGNhbiBiZSBuZXN0ZWQpLiBJZiBuZXN0ZWQgd2lsbCBjcmVhdGUgbW9yZSBjb21wbGV4IHNwYWNlciBzaXplXG4qIEBwYXJhbSB7bnVtYmVyfSBbbGV2ZWw9MF0gY3VycmVudCBsZXZlbCwgdXNlZCBpbiByZWN1c3Jpb25cbiogQHBhcmFtIHtBcnJheX0gW2xldmVsRGF0YT1bXV0gaG93IG1hbnkgc3BhY2VycyBuZWVkZWQgYXQgYSBnaXZlbiBsZXZlbFxuKiBAcmV0dXJucyB7QXJyYXl9IGxldmVsRGF0YVxuKlxuKiBAZXhhbXBsZVxuKiBhcnJheSA9IFtbMSwyXSwgWzMsNF1dXG4qIC8vIHJldHVybnMgWzEsIDJdXG4qIGFzIGF0IGxldmVsPTAgdGhlIG9ubHkgc3BhY2VyIG5lZWRlZCBpcyBiZXR3ZWVuIFsxLDJdIGFuZCBbMyw0XVxuKiBhbmQgYXQgbGV2ZWw9MSB0aGUgb25seSB0d28gc3BhY2VycyBuZWVkZWQgaXMgYmV0d2VlbiAxIGFuZCAyIGFzIHdlbGwgYXNcbiogMyBhbmQgNCBzaW5jZSB0aGUgc3BhY2VyIGJldHdlZW4gMiBhbmQgMyBpcyBoYW5kbGVkIGF0IGxldmVsPTBcbiovXG5leHBvcnQgZnVuY3Rpb24gc3BhY2Vyc05lZWRlZEF0RWFjaExldmVsIChhcnJheSwgbGV2ZWwsIGxldmVsRGF0YSApIHtcbiAgaWYgKCBsZXZlbCA9PSB1bmRlZmluZWQgKSB7IGxldmVsID0gMDsgIH0gZWxzZSB7IGxldmVsICs9IDEgfVxuICBpZiAoIGxldmVsRGF0YSA9PSB1bmRlZmluZWQgKSB7IGxldmVsRGF0YSA9IFtdOyB9XG4gIGlmICggbGV2ZWwgPj0gbGV2ZWxEYXRhLmxlbmd0aCApIHsgbGV2ZWxEYXRhLnB1c2goYXJyYXkubGVuZ3RoIC0gMSkgfVxuICBlbHNlIHsgbGV2ZWxEYXRhW2xldmVsXSArPSBhcnJheS5sZW5ndGggLSAxIH1cbiAgYXJyYXkubWFwKGZ1bmN0aW9uKGUsIGkpIHsgaWYgKEFycmF5LmlzQXJyYXkoZSkpIHsgc3BhY2Vyc05lZWRlZEF0RWFjaExldmVsKGUsIGxldmVsLCBsZXZlbERhdGEpIH0gfSApXG4gIHJldHVybiBsZXZlbERhdGFcbn1cblxuXG5cblxuLyoqXG4qIERyYXdzIGEgd2hpc2tlciBmb3IgQHNlZXtAbGluayBib3h3aGlza2VyfVxuKiBAcGFyYW0ge2Jvb2xlYW59IGRpciBkaXJlY3Rpb24gdG8gZHJhdyB3aGlza2VyLCBzaG91bGQgYmUgZWl0aGVyIHRydWUgKHVwLCB0b3ApIG9yIGZhbHNlIChkb3duIG9yIGJvdHRvbSlcbiogQHBhcmFtIHtudW1iZXJ9IHggc3RhcnRpbmcgeCBjb29yZGluYXRlIGluIHdoaWNoIHRvIGRyYXcgd2hpc2tlclxuKiBAcGFyYW0ge251bWJlcn0geSBzdGFydGluZyB5IGNvb3JkaW5hdGUgaW4gd2hpY2ggdG8gZHJhdyB3aGlza2VyXG4qIEBwYXJhbSB7bnVtYmVyfSB3IHdpZHRoIG9mIHNwYWNlIGluIHdoaWNoIHRvIGRyYXcgd2hpc2tlclxuKiBAcGFyYW0ge251bWJlcn0gaCBoZWlnaHQgb2Ygc3BhY2UgaW4gd2hpY2ggdG8gZHJhdyB3aGlza2VyXG4qIEBwYXJhbSB7bnVtYmVyfSBwZXIgcGVyY2VudGFnZSBvZiB3IG9yIGggKGRlcGVuZHMgb24gbykgdG8gbWFrZSB3aGlza2VyXG4qIEBwYXJhbSB7Ym9vbGVhbn0gbyBvcmllbnRhdGlvbiwgdHJ1ZSBpcyBob3Jpem9udGFsIGFuZCBmYWxzZSBpcyB2ZXJ0aWNhbFxuKiBAcmV0dXJucyB7c3RyaW5nfSByZXByZXNlbnRpbmcgdGhlIHN2ZyBwYXRoIChpLmUuIHRoZSBkIGF0dHJpYnV0ZSBmb3IgYSBwYXRoIHRhZylcbiovXG5leHBvcnQgZnVuY3Rpb24gd2hpc2tlclBhdGgoZGlyLCB4LCB5LCB3LCBoLCBwZXIsIG8pIHtcbiAgLy8gZCA9IGRpcmVjdGlvbiAodHJ1ZSBpcyB1cCksIHAgPSBwZXJjZW50IHdpZHRoXG4gIGlmIChkaXIgPT0gJ3VwJyB8fCBkaXIgPT0gJ3RvcCcgfHwgZGlyID09IHRydWUpIHtkaXIgPSB0cnVlfVxuICBpZiAoZGlyID09ICdkb3duJyB8fCBkaXIgPT0gJ2JvdHRvbScgfHwgZGlyID09IGZhbHNlKSB7ZGlyID0gZmFsc2V9XG4gIG8gPSBvID09IHVuZGVmaW5lZCA/ICdob3Jpem9udGFsJyA6IG9cbiAgcGVyID0gcGVyID09IHVuZGVmaW5lZCA/IDEgOiBwZXJcbiAgaWYgKG8gIT0gXCJob3Jpem9udGFsXCIpIHtcbiAgICB2YXIgaGggPSBoICogcGVyICxcbiAgICB3ID0gZGlyID8gdyA6IC13ICxcbiAgICBhID0gZGlyID8geCArIHcgOiB4ICxcbiAgICBiID0gZGlyID8geCA6IHggKyB3ICxcbiAgICBjID0gZGlyID8gYSA6IGJcbiAgICBwID0gXCJNIFwiICsgYSArICcgJyArICggICAgIGggLyAyICAgICAgKSArICcgJ1xuICAgICAgKyAnTCAnICsgYiArICcgJyArICggICAgIGggLyAyICAgICAgKSArICcgJ1xuICAgICAgKyAnTSAnICsgYyArICcgJyArICggaCAvIDIgLSBoaCAvIDIgKSArICcgJ1xuICAgICAgKyAnTCAnICsgYyArICcgJyArICggaCAvIDIgKyBoaCAvIDIgKSArICcgJ1xuXG4gICAgcmV0dXJuIHBcbiAgfVxuICB2YXIgd3cgPSB3ICogcGVyLFxuICBhID0gZGlyID8geSArIGggOiB5ICAsXG4gIGIgPSBkaXIgPyB5IDogeSArIGggICxcbiAgcCA9IFwiTSBcIiArICggIHcgLyAyICApICsgJyAnICsgYSArICcgJyAvLyBzdHJhaWdodCBsaW5lIHBhcnRcbiAgICArICdMICcgKyAoICB3IC8gMiAgKSArICcgJyArIGIgKyAnICcgLy8gc3RyYWlnaHQgbGluZSBwYXJ0XG4gICAgKyAnaCAnICsgKCAtd3cgLyAyICkgKyAnICcgKyAwICsgJyAnIC8vIGhvcml6b250YWwgbGluZSBwYXJ0XG4gICAgKyAnaCAnICsgKCAgICB3dyAgICkgKyAnICcgKyAwICsgJyAnXG4gIHJldHVybiBwXG59XG4iLCJpbXBvcnQge2xvZywgd2FybiwgZXJyb3IsIGluZm99IGZyb20gJy4vdXRpbHMnO1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUEFDRUdST1VQSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKlxuICogUHJvZHVjZXMgYSBmdW5jdGlvbiBmb3Igc3BhY2luZyBvYmplY3RzIGJ5IGFuIGFyYml0cmFybHkgY29tcGxleCBncm91cGluZ1xuICogQHJldHVybnMge3JlY3Vyc2l2ZWx5UG9zaXRpb259IHRoZSBmdW5jdGlvbiBmb3IgbW92aW5nIHRoZSBvYmplY3RzXG4gKiAoc2VlIHtAbGluayBncm91cGluZ1NwYWNlciNyZWN1cnNpdmVseVBvc2l0aW9ufSlcbiAqIEBuYW1lc3BhY2UgZ3JvdXBpbmdTcGFjZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwaW5nU3BhY2VyKCkge1xuICB2YXJcbiAgLypAdmFyIHtib29sZWFufSBob3Jpem9udGFsUSBAZGVmYXVsdCovXG5cbiAgLyoqXG4gICogV2hldGhlciBvciBub3QgdG8gc3BhY2Ugb2JqZWN0cyBob3Jpem9udGFsbHkgb3IgdmVydGljYWxseS5cbiAgKiAoc2VlIHtAbGluayBncm91cGluZ1NwYWNlci5ob3Jpem9udGFsUX0pXG4gICogQHBhcmFtIHtib29sZWFufSBbaG9yaXpvbnRhbFE9dHJ1ZV1cbiAgKiBAbWVtYmVyb2YgZ3JvdXBpbmdTcGFjZXIjXG4gICogQGluc3RhbmNlXG4gICovXG4gIGhvcml6b250YWxRID0gdHJ1ZSxcbiAgLyoqXG4gICogVGhlIHNjYWxlIHRvIHVzZSB0byBwb3NpdGlvbiBlbGVtZW50cyBpZiB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIjbW92ZWJ5fT1cInN0cmluZ1wiXG4gICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIuc2NhbGV9KVxuICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtzY2FsZT1kMy5zY2FsZUxpbmVhcigpXVxuICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlciNcbiAgKiBAaW5zdGFuY2VcbiAgKi9cbiAgc2NhbGUgPSBkMy5zY2FsZUxpbmVhcigpLFxuICAvKipcbiAgKiBIb3cgZWxlbWVudHMgaW4gdGhlIGNvbXBsZXggZ3JvdXBpbmcgc2hvdWxkIGJlIG1vdmVkIG92ZXIgYnkuXG4gICogQnkgZGVmYXVsdCwgbW92ZWJ5PVwiY2F0ZWdvcnlcIiwgd2hpY2ggbW92ZXMgb2JqZWN0cyBieSB0aGUgY29tcGxleCBncm91cGluZ1xuICAqIEJ1dCBvYmplY3RzIGNhbiBhbHNvIGJlIG1vdmVkIG92ZXIgYnkgc2NhbGUuXG4gICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIubW92ZWJ5fSlcbiAgKiBAcGFyYW0ge3N0cmluZ30gW21vdmVieT1cImNhdGVnb3J5XCJdXG4gICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyI1xuICAqIEBpbnN0YW5jZVxuICAqL1xuICBtb3ZlYnkgPSAnY2F0ZWdvcnknLFxuICAvKipcbiAgKiBIb3cgbWFueSBvYmplY3RzIGFyZSB0aGVyZSBpbiB0b3RhbFxuICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyLm51bWJlck9mT2JqZWN0c30pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtudW1iZXJPZk9iamVjdHM9bm9uZV1cbiAgKiBAbWVtYmVyb2YgZ3JvdXBpbmdTcGFjZXIjXG4gICogQGluc3RhbmNlXG4gICovXG4gIG51bWJlck9mT2JqZWN0cyxcbiAgLyoqXG4gICogVGhlIGNsYXNzIGdpdmVuIHRvIGFuIG5lc3RlZCA8Zz4gdGFnIHdob3NlIHBhcmVudChzKSBoYXZlIHRoZSBjb3JyZWN0IHRyYW5zaXRpb25cbiAgKiBwcm9wZXJ0aWVzXG4gICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIubnVtYmVyT2ZPYmplY3RzfSlcbiAgKiBAcGFyYW0ge3N0cmluZ30gW251bWJlck9mT2JqZWN0cz0nZDNzbS1ncm91cHBlZC1pdGVtJ11cbiAgKiBAbWVtYmVyb2YgZ3JvdXBpbmdTcGFjZXIjXG4gICogQGluc3RhbmNlXG4gICovXG4gIG9iamVjdENsYXNzID0gJ2Qzc20tZ3JvdXBwZWQtaXRlbScsXG4gIC8qKlxuICAqIFRoZSBzaXplIG9mIHRoZSBvYmplY3RzIGJlaW5nIHBvc2l0aW9uZWRcbiAgKiAoc2VlIHtAbGluayBncm91cGluZ1NwYWNlci5vYmplY3RTaXplfSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW29iamVjdFNpemU9bm9uZV1cbiAgKiBAbWVtYmVyb2YgZ3JvdXBpbmdTcGFjZXIjXG4gICogQGluc3RhbmNlXG4gICovXG4gIG9iamVjdFNpemUsXG4gIC8qKlxuICAqIFRoZSBzaXplIG9mIHRoZSB1bi1uZXN0ZWQgc3BhY2VyIGJldHdlZW4gb2JqZWN0c1xuICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyLnNwYWNlclNpemV9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbc3BhY2VyU2l6ZT1ub25lXVxuICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlciNcbiAgKiBAaW5zdGFuY2VcbiAgKi9cbiAgc3BhY2VyU2l6ZSxcbiAgLyoqXG4gICogVGhlIGR1cmF0aW9uIG9mIHRyYW5zaXRpb25zIGluIG1zXG4gICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIudHJhbnNpdGlvbkR1cmF0aW9ufSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW3RyYW5zaXRpb25EdXJhdGlvbj0xMDAwXVxuICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlciNcbiAgKiBAaW5zdGFuY2VcbiAgKi9cbiAgdHJhbnNpdGlvbkR1cmF0aW9uID0gMTAwMCxcbiAgLyoqXG4gICogVGhlIGVhc2UgZnVuY3Rpb24gZm9yIHRoZSB0cmFuc2l0aW9uc1xuICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyLmVhc2VGdW5jfSlcbiAgKiBAcGFyYW0ge2QzLmVhc2V9IFtlYXNlRnVuYz1kMy5lYXNlU2luXVxuICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlciNcbiAgKiBAaW5zdGFuY2VcbiAgKi9cbiAgZWFzZUZ1bmMgPSBkMy5lYXNlU2luLFxuICAvKipcbiAgKiBUaGUgbmFtZXNwYWNlIGZvciB0aGUgb2JqZWN0cyBiZWluZyBtb3ZlZFxuICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyLm5hbWVzcGFjZX0pXG4gICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lc3BhY2U9J3NwYWNlciddXG4gICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyI1xuICAqIEBpbnN0YW5jZVxuICAqL1xuICBuYW1lc3BhY2UgPSAnc3BhY2VyJyxcbiAgLyoqXG4gICogVGhlIGFuaW1hdGlvbiBmb3IgbmV3IG9iamVjdHMgYmVpbmcgYWRkZWRcbiAgKiAoc2VlIHtAbGluayBncm91cGluZ1NwYWNlci5lbnRlckZ1bmN0aW9ufSlcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBlbnRlckZ1bmN0aW9uXG4gICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyI1xuICAqIEBpbnN0YW5jZVxuICAqIEBleGFtcGxlXG4gICogLy8gYnkgZGVmYXVsdFxuICAqIGZ1bmN0aW9uKG5ld09iamVjdFNlbGVjdGlvbikge1xuICAqICBuZXdPYmplY3RTZWxlY3Rpb24uYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24oZCwgaSl7XG4gICogICAgdmFyXG4gICogICAgeCA9IGhvcml6b250YWxRID8gb2JqZWN0U2l6ZSAqIG51bWJlck9mT2JqZWN0cyArIHNwYWNlclNpemUgKiAobnVtYmVyT2ZPYmplY3RzIC0gMSkgOiAwLFxuICAqICAgIHkgPSAhaG9yaXpvbnRhbFEgPyBvYmplY3RTaXplICogbnVtYmVyT2ZPYmplY3RzICsgc3BhY2VyU2l6ZSAqIChudW1iZXJPZk9iamVjdHMgLSAxKSA6IDAsXG4gICogICAgdCA9ICd0cmFuc2xhdGUoJyt4KycsJyt5KycpJ1xuICAqICAgIHJldHVybiB0XG4gICogIH0pXG4gICogfVxuICAqL1xuICBlbnRlckZ1bmN0aW9uID0gZnVuY3Rpb24oY3VyKSB7XG4gICAgY3VyLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uKGQsIGkpe1xuICAgICAgdmFyXG4gICAgICB4ID0gaG9yaXpvbnRhbFEgPyBvYmplY3RTaXplICogbnVtYmVyT2ZPYmplY3RzICsgc3BhY2VyU2l6ZSAqIChudW1iZXJPZk9iamVjdHMgLSAxKSA6IDAsXG4gICAgICB5ID0gIWhvcml6b250YWxRID8gb2JqZWN0U2l6ZSAqIG51bWJlck9mT2JqZWN0cyArIHNwYWNlclNpemUgKiAobnVtYmVyT2ZPYmplY3RzIC0gMSkgOiAwLFxuICAgICAgdCA9ICd0cmFuc2xhdGUoJyt4KycsJyt5KycpJ1xuICAgICAgcmV0dXJuIHRcbiAgICB9KVxuICB9LFxuICAvKipcbiAgKiBUaGUgYW5pbWF0aW9uIGZvciBvbGQgb2JqZWN0cyBiZWluZyByZW1vdmVkXG4gICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIuZXhpdEZ1bmN0aW9ufSlcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBleGl0RnVuY3Rpb25cbiAgKiBAbWVtYmVyb2YgZ3JvdXBpbmdTcGFjZXIjXG4gICogQGluc3RhbmNlXG4gICogQGV4YW1wbGVcbiAgKiAvLyBieSBkZWZhdWx0XG4gICogb2xkT2JqZWN0U2VsZWN0aW9uLnRyYW5zaXRpb24oKS5kdXJhdGlvbih0cmFuc2l0aW9uRHVyYXRpb24pLmVhc2UoZWFzZUZ1bmMpXG4gICogLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uKGQsIGkpe1xuICAqICAgICB2YXJcbiAgKiAgIHggPSBob3Jpem9udGFsUSA/IG9iamVjdFNpemUgKiBudW1iZXJPZk9iamVjdHMgKyBzcGFjZXJTaXplICogKG51bWJlck9mT2JqZWN0cyAtIDEpIDogMCxcbiAgKiAgIHkgPSAhaG9yaXpvbnRhbFEgPyBvYmplY3RTaXplICogbnVtYmVyT2ZPYmplY3RzICsgc3BhY2VyU2l6ZSAqIChudW1iZXJPZk9iamVjdHMgLSAxKSA6IDAsXG4gICogICB0ID0gJ3RyYW5zbGF0ZSgnK3grJywnK3krJyknXG4gICogICByZXR1cm4gdFxuICAqIH0pLnJlbW92ZSgpXG4gICovXG4gIGV4aXRGdW5jdGlvbiA9IGZ1bmN0aW9uKGN1cil7XG4gICAgbG9nKFwiZ3JvdXBpbmdTcGFjZXJcIiwgXCJleGl0aW5nIHdpdGhcIiwge2N1cnJlbnQ6IGN1ciwgY3VycmVudE5vZGU6IGN1ci5ub2RlKCl9KVxuICAgIGN1ci5jbGFzc2VkKCd0by1yZW1vdmUnLCB0cnVlKVxuXG4gICAgY3VyLnRyYW5zaXRpb24oKS5kdXJhdGlvbih0cmFuc2l0aW9uRHVyYXRpb24qMC45KS5lYXNlKGVhc2VGdW5jKVxuICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbihkLCBpKXtcbiAgICAgIHZhclxuICAgICAgeCA9IGhvcml6b250YWxRID8gb2JqZWN0U2l6ZSAqIG51bWJlck9mT2JqZWN0cyArIHNwYWNlclNpemUgKiAobnVtYmVyT2ZPYmplY3RzIC0gMSkgOiAwLFxuICAgICAgeSA9ICFob3Jpem9udGFsUSA/IG9iamVjdFNpemUgKiBudW1iZXJPZk9iamVjdHMgKyBzcGFjZXJTaXplICogKG51bWJlck9mT2JqZWN0cyAtIDEpIDogMCxcbiAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgIHJldHVybiB0XG4gICAgfSkucmVtb3ZlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyBob3Jpem9udGFsUSAod2hldGhlciBvciBub3QgdG8gc3BhY2Ugb2JqZWN0cyBob3Jpem9udGFsbHkgb3IgdmVydGljYWxseSkuXG4gICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyI2hvcml6b250YWxRfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtncm91cGluZ1NwYWNlciB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHJlY3Vyc2l2ZWx5UG9zaXRpb24uaG9yaXpvbnRhbFEgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGhvcml6b250YWxRID0gXywgcmVjdXJzaXZlbHlQb3NpdGlvbikgOiBob3Jpem9udGFsUSB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgc2NhbGUgdG8gdXNlIHRvIHBvc2l0aW9uIGVsZW1lbnRzIGlmIHtAbGluayBncm91cGluZ1NwYWNlciNtb3ZlYnl9PVwic3RyaW5nXCJcbiAgICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIjc2NhbGV9KVxuICAgKiBAcGFyYW0ge2QzLnNjYWxlfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Z3JvdXBpbmdTcGFjZXIgfCBkMy5zY2FsZX1cbiAgICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHJlY3Vyc2l2ZWx5UG9zaXRpb24uc2NhbGUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNjYWxlID0gXywgcmVjdXJzaXZlbHlQb3NpdGlvbikgOiBzY2FsZSB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyBtb3ZlYnkgKHdoZXRoZXIgb3Igbm90IHRvIG1vdmUgYnkgc2NhbGUgb3IgYnkgZ3JvdXBpbmcpLlxuICAgKiAoc2VlIHtAbGluayBncm91cGluZ1NwYWNlciNtb3ZlYnl9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2dyb3VwaW5nU3BhY2VyIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgZ3JvdXBpbmdTcGFjZXJcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgcmVjdXJzaXZlbHlQb3NpdGlvbi5tb3ZlYnkgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG1vdmVieSA9IF8sIHJlY3Vyc2l2ZWx5UG9zaXRpb24pIDogbW92ZWJ5IH1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIG51bWJlck9mT2JqZWN0cy5cbiAgICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIjbnVtYmVyT2ZPYmplY3RzfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtncm91cGluZ1NwYWNlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHJlY3Vyc2l2ZWx5UG9zaXRpb24ubnVtYmVyT2ZPYmplY3RzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChudW1iZXJPZk9iamVjdHMgPSBfLCByZWN1cnNpdmVseVBvc2l0aW9uKSA6IG51bWJlck9mT2JqZWN0cyB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgb2JqZWN0Q2xhc3MgKHdpbGwgYmUgYXBwbGllZCB0byA8Zz4gZWxlbWVudHMpLlxuICAgKiAoc2VlIHtAbGluayBncm91cGluZ1NwYWNlciNvYmplY3RDbGFzc30pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Z3JvdXBpbmdTcGFjZXIgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlclxuICAgKiBAc3RhdGljXG4gICAqL1xuICByZWN1cnNpdmVseVBvc2l0aW9uLm9iamVjdENsYXNzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvYmplY3RDbGFzcyA9IF8sIHJlY3Vyc2l2ZWx5UG9zaXRpb24pIDogb2JqZWN0Q2xhc3MgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG9iamVjdFNpemUuXG4gICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyI29iamVjdFNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2dyb3VwaW5nU3BhY2VyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgZ3JvdXBpbmdTcGFjZXJcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgcmVjdXJzaXZlbHlQb3NpdGlvbi5vYmplY3RTaXplID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvYmplY3RTaXplID0gXywgcmVjdXJzaXZlbHlQb3NpdGlvbikgOiBvYmplY3RTaXplIH1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBzcGFjZXJTaXplLlxuICAgKiAoc2VlIHtAbGluayBncm91cGluZ1NwYWNlciNzcGFjZXJTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtncm91cGluZ1NwYWNlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHJlY3Vyc2l2ZWx5UG9zaXRpb24uc3BhY2VyU2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3BhY2VyU2l6ZSA9IF8sIHJlY3Vyc2l2ZWx5UG9zaXRpb24pIDogc3BhY2VyU2l6ZSB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdHJhbnNpdGlvbkR1cmF0aW9uLlxuICAgKiAoc2VlIHtAbGluayBncm91cGluZ1NwYWNlciN0cmFuc2l0aW9uRHVyYXRpb259KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2dyb3VwaW5nU3BhY2VyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgZ3JvdXBpbmdTcGFjZXJcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgcmVjdXJzaXZlbHlQb3NpdGlvbi50cmFuc2l0aW9uRHVyYXRpb24gPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRyYW5zaXRpb25EdXJhdGlvbiA9IF8sIHJlY3Vyc2l2ZWx5UG9zaXRpb24pIDogdHJhbnNpdGlvbkR1cmF0aW9uIH1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBlYXNlRnVuYy5cbiAgICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIjZWFzZUZ1bmN9KVxuICAgKiBAcGFyYW0ge2QzLmVhc2V9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtncm91cGluZ1NwYWNlciB8IGQzLmVhc2V9XG4gICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlclxuICAgKiBAc3RhdGljXG4gICAqL1xuICByZWN1cnNpdmVseVBvc2l0aW9uLmVhc2VGdW5jID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChlYXNlRnVuYyA9IF8sIHJlY3Vyc2l2ZWx5UG9zaXRpb24pIDogZWFzZUZ1bmMgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG5hbWVzcGFjZS5cbiAgICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIjbmFtZXNwYWNlfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtncm91cGluZ1NwYWNlciB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHJlY3Vyc2l2ZWx5UG9zaXRpb24ubmFtZXNwYWNlID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChuYW1lc3BhY2UgPSBfLCByZWN1cnNpdmVseVBvc2l0aW9uKSA6IG5hbWVzcGFjZSB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgZW50ZXJGdW5jdGlvbi5cbiAgICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIjZW50ZXJGdW5jdGlvbn0pXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtncm91cGluZ1NwYWNlciB8IGZ1bmN0aW9ufVxuICAgKiBAbWVtYmVyb2YgZ3JvdXBpbmdTcGFjZXJcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgcmVjdXJzaXZlbHlQb3NpdGlvbi5lbnRlckZ1bmN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChlbnRlckZ1bmN0aW9uID0gXywgcmVjdXJzaXZlbHlQb3NpdGlvbikgOiBlbnRlckZ1bmN0aW9uIH1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBleGl0RnVuY3Rpb24uXG4gICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyI2V4aXRGdW5jdGlvbn0pXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtncm91cGluZ1NwYWNlciB8IGZ1bmN0aW9ufVxuICAgKiBAbWVtYmVyb2YgZ3JvdXBpbmdTcGFjZXJcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgcmVjdXJzaXZlbHlQb3NpdGlvbi5leGl0RnVuY3Rpb24gPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGV4aXRGdW5jdGlvbiA9IF8sIHJlY3Vyc2l2ZWx5UG9zaXRpb24pIDogZXhpdEZ1bmN0aW9uIH1cblxuXG4gIC8qKlxuICAgKiByZWN1cnNpdmVseSBwb3NpdGlvbiB0aGUgb2JqZWN0cyBpbnNpZGUgb2YgdGhlIHNlbGVjdGlvbi5cbiAgICogQHBhcmFtIHtkMy5zZWxlY3Rpb259IHNlbGVjdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YVxuICAgKiBAcGFyYW0ge2xldmVsfSBbbGV2ZWw9MF0gcmVjdXJzaW9uIGRlcHRoXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IChob3cgbXVjaCB0byBtb3ZlIG5leHQgZWxlbWVudClcbiAgICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyI1xuICAgKi9cbiAgZnVuY3Rpb24gcmVjdXJzaXZlbHlQb3NpdGlvbihzZWxlY3Rpb24sIGRhdGEsIGxldmVsKSB7XG4gICAgaWYgKCBsZXZlbCA9PSB1bmRlZmluZWQgKSB7IGxldmVsID0gMDsgIH1cblxuICAgIHZhciBjdXJyZW50U2VsZWN0aW9uID0gc2VsZWN0aW9uLnNlbGVjdEFsbCgnZy4nK25hbWVzcGFjZSsnW2xldmVsPVwiJytsZXZlbCsnXCJdJykuZGF0YShkYXRhKVxuICAgIHZhciBlbnRlciA9IGN1cnJlbnRTZWxlY3Rpb24uZW50ZXIoKS5hcHBlbmQoJ2cnKS5hdHRyKCdsZXZlbCcsIGxldmVsKS5hdHRyKCdjbGFzcycsIG5hbWVzcGFjZSlcbiAgICB2YXIgZXhpdCA9IGN1cnJlbnRTZWxlY3Rpb24uZXhpdCgpXG4gICAgY3VycmVudFNlbGVjdGlvbiA9IGN1cnJlbnRTZWxlY3Rpb24ubWVyZ2UoZW50ZXIpXG5cblxuICAgIGlmICh0eXBlb2YgZXhpdEZ1bmN0aW9uID09ICdmdW5jdGlvbicgKXsgZXhpdC5lYWNoKGZ1bmN0aW9uKGQsIGkpeyBleGl0RnVuY3Rpb24oZDMuc2VsZWN0KHRoaXMpKX0pIH1cbiAgICBlbHNle2V4aXQucmVtb3ZlKCl9XG4gICAgLy8gc3BhY2VyIGZvciBjdXJyZW50IGxldmVsXG4gICAgdmFyIGxldmVsU3BhY2VyID0gc3BhY2VyU2l6ZSAvIChsZXZlbCsxKVxuICAgIC8vIG1vdmVtZW50IGZvciBjdXJyZW50IGxldmVsXG4gICAgdmFyIG1vdmUgPSAwXG4gICAgY3VycmVudFNlbGVjdGlvbi5lYWNoKGZ1bmN0aW9uKGN1cnJlbnRFbGVtZW50LCBpbmRleCkge1xuICAgICAgdmFyIHQgPSBkMy5zZWxlY3QodGhpcylcbiAgICAgIGlmICh0LmF0dHIoJ3RyYW5zZm9ybScpID09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZW50ZXJGdW5jdGlvbiA9PSAnZnVuY3Rpb24nKSB7IGVudGVyRnVuY3Rpb24odCkgfVxuXG4gICAgICB0LnRyYW5zaXRpb24oKS5kdXJhdGlvbih0cmFuc2l0aW9uRHVyYXRpb24pLmVhc2UoZWFzZUZ1bmMpXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24oZCwgaSkge1xuICAgICAgICB2YXJcbiAgICAgICAgeCA9IGhvcml6b250YWxRID8gKG1vdmVieSA9PVwic2NhbGVcIiA/IHNjYWxlKGQpIDogbW92ZSkgOiAwLFxuICAgICAgICB5ID0gIWhvcml6b250YWxRID8gKG1vdmVieSA9PVwic2NhbGVcIiA/IHNjYWxlKGQpIDogbW92ZSk6IDAsXG4gICAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgICAgcmV0dXJuIHRcbiAgICAgIH0pXG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGN1cnJlbnRFbGVtZW50KSkge1xuICAgICAgICBtb3ZlICs9IHJlY3Vyc2l2ZWx5UG9zaXRpb24odCwgY3VycmVudEVsZW1lbnQsIGxldmVsKzEpXG4gICAgICAgIHZhciB0b1JlbW92ZSA9IHQuc2VsZWN0QWxsKCdnLicrbmFtZXNwYWNlKydbbGV2ZWw9XCInKyhsZXZlbCkrJ1wiXSA+IGcuJytvYmplY3RDbGFzcysnLicrbmFtZXNwYWNlKVxuICAgICAgICBpZiAodHlwZW9mIGV4aXRGdW5jdGlvbiA9PSAnZnVuY3Rpb24nICl7IHRvUmVtb3ZlLmVhY2goZnVuY3Rpb24oZCwgaSl7IGV4aXRGdW5jdGlvbihkMy5zZWxlY3QodGhpcykpfSkgfVxuICAgICAgICBlbHNle3RvUmVtb3ZlLnJlbW92ZSgpfVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIG1vdmUgKz0gb2JqZWN0U2l6ZVxuICAgICAgICB2YXIgb2JqID0gdC5zZWxlY3QoJ2cuJytuYW1lc3BhY2UrJ1tsZXZlbD1cIicrbGV2ZWwrJ1wiXSA+IGcuJytvYmplY3RDbGFzcysnLicrbmFtZXNwYWNlKVxuICAgICAgICBpZiAob2JqLmVtcHR5KCkpIHsgb2JqID0gdC5hcHBlbmQoJ2cnKS5hdHRyKCdjbGFzcycsIG9iamVjdENsYXNzKS5jbGFzc2VkKG5hbWVzcGFjZSwgdHJ1ZSkgfVxuICAgICAgICBvYmouYXR0cigncGFyZW50LWluZGV4JywgaW5kZXgpXG4gICAgICAgIHZhciB0b1JlbW92ZSA9IHQuc2VsZWN0QWxsKCdnLicrbmFtZXNwYWNlKydbbGV2ZWw9XCInKyhsZXZlbCsxKSsnXCJdJylcblxuICAgICAgICBpZiAodHlwZW9mIGV4aXRGdW5jdGlvbiA9PSAnZnVuY3Rpb24nICl7IHRvUmVtb3ZlLmVhY2goZnVuY3Rpb24oZCwgaSl7IGV4aXRGdW5jdGlvbihkMy5zZWxlY3QodGhpcykpfSkgfVxuICAgICAgICBlbHNle3RvUmVtb3ZlLnJlbW92ZSgpfVxuICAgICAgfVxuICAgICAgbW92ZSArPSAoaW5kZXggPT0gY3VycmVudFNlbGVjdGlvbi5zaXplKCktMSkgPyAwIDogbGV2ZWxTcGFjZXJcbiAgICB9KVxuICAgIHJldHVybiBtb3ZlXG4gIH1cbiAgcmV0dXJuIHJlY3Vyc2l2ZWx5UG9zaXRpb25cbn1cbiIsImltcG9ydCB7XG4gIGh5cGVuYXRlLCBzYWZlU2VsZWN0LCBleHRyYWN0VmlvbGluVmFsdWVzLFxuICB0aWNrUmFuZ2UsIG1vZGlmeUhleGlkZWNpbWFsQ29sb3JMdW1pbmFuY2UsIHRydW5jYXRlVGV4dCxcbiAgcm91bmRcbn0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7c2V0dXBDb250YWluZXIsIGNhbGN1bGF0ZVdpZHRoT2ZPYmplY3QsIGNhbGN1bGF0ZVdpZHRoT2ZTcGFjZXJ9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHt1bmlxdWUsIGhhc1EsIGZsYXR0ZW59IGZyb20gJy4vYXJyYXktZnVuY3Rpb25zJztcbmltcG9ydCB7Z3JvdXBpbmdTcGFjZXJ9IGZyb20gJy4vZ3JvdXBpbmctc3BhY2VyJztcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qKlxuICogQ3JlYXRlcyBhbiBheGlzXG4gKlxuICoge0BsaW5rIGh0dHBzOi8vc3VtbmV1cm9uLmdpdGxhYi5pby9kM3NtL2RlbW9zL2F4ZXMvaW5kZXguaHRtbCBEZW1vfVxuICogQGNvbnN0cnVjdG9yIGF4aXNcbiAqIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBzZWxlY3Rpb25cbiAqIEBuYW1lc3BhY2UgYXhpc1xuICogQHJldHVybnMge2Z1bmN0aW9ufSBheGlzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBheGlzICggc2VsZWN0aW9uICkge1xuICB2YXJcbiAgLyoqXG4gICogVGhlIG9yaWVudGF0aW9uIG9mIHRoZSBheGlzXG4gICogKHNlZSB7QGxpbmsgYXhpcyNvcmllbnR9KVxuICAqIEBwYXJhbSB7c3RyaW5nfSBbb3JpZW50PSdib3R0b20nXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBvcmllbnQgPSAnYm90dG9tJywgICAgICAgLy8gZGlyZWN0aW9uIG9mIHRoZSBheGlzXG5cbiAgLyoqXG4gICogQW1vdW50IG9mIGhvcml6b250YWwgc3BhY2UgKGluIHBpeGVscykgYXZhaWJsZSB0byByZW5kZXIgdGhlIGF4aXMgaW5cbiAgKiAoc2VlIHtAbGluayBheGlzI3NwYWNlWH0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZVg9MF1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc3BhY2VYPTAsXG4gIC8qKlxuICAqIEFtb3VudCBvZiB2ZXJ0aWNhbCBzcGFjZSAoaW4gcGl4ZWxzKSBhdmFpYmxlIHRvIHJlbmRlciB0aGUgYXhpcyBpblxuICAqIChzZWUge0BsaW5rIGF4aXMuc3BhY2VZfSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW3NwYWNlWT0wXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzcGFjZVk9MCxcblxuXG4gIC8qKlxuICAqIFdoZXRoZXIgb3Igbm90IHRvIGFsbG93IGF4aXMgdG8gcmVuZGVyIGVsZW1lbnRzIHBhc3MgdGhlIG1haW4gc3BhdGlhbCBkaW1lbnNpb25cbiAgKiBnaXZlbiB0aGUgb3JpZW50YXRpb24gKHNlZSB7QGxpbmsgYXhpcyNvcmllbnR9KSwgd2hlcmUge0BsaW5rIGF4aXMjb3JpZW50fT1cImJvdHRvbVwiIG9yIHtAbGluayBheGlzI29yaWVudH09XCJ0b3BcIlxuICAqIHRoZSBtYWluIGRpbWVuc2lvbiBpcyB7QGxpbmsgYXhpcyNzcGFjZVh9IGFuZCB3aGVyZSB7QGxpbmsgYXhpcyNvcmllbnR9PVwibGVmdFwiIG9yIHtAbGluayBheGlzI29yaWVudH09XCJyaWdodFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBheGlzI3NwYWNlWX1cbiAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvdmVyZmxvd1E9ZmFsc2VdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG92ZXJmbG93USA9IGZhbHNlLCAgICAvLyB3aGV0aGVyIG9yIG5vdCB0byBhbGxvdyBvdmVyZmxvd1xuICAvKipcbiAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgYXhpcyBsYWJlbHMgYXJlIGZvciBjYXRlZ29yaWNhbCBkYXRhLiBJZiBmYWxzZSxcbiAgKiB3aWxsIHVzZSB7QGxpbmsgYXhpcyNzY2FsZX0gdG8gcG9zaXRpb24gdGlja3MuXG4gICogQHBhcmFtIHtib29sZWFufSBbY2F0ZWdvcmljYWxRPWZhbHNlXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBjYXRlZ29yaWNhbFEgPSBmYWxzZSwgLy8gd2hldGhlciBvciBub3QgdGhlIGF4aXMgaXMgc2hvd2luZyB2YWx1ZXMgb3IgZ3JvdXBzXG4gIC8qKlxuICAqIFdoZXRoZXIgb3Igbm90IHRoZSBheGlzIHRpY2tzIHNob3VsZCBoYXZlIGd1aWRlbGluZXNcbiAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjYXRlZ29yaWNhbFE9ZmFsc2VdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGd1aWRlTGluZXNRID0gZmFsc2UsICAgIC8vIHdoZXRoZXIgb3Igbm90IHRvIGFsbG93IG92ZXJmbG93XG5cblxuICAvKipcbiAgKiBIb3cgdG8gZ3JvdXAgdGhlIHRpY2sgbGFiZWxzXG4gICogQHBhcmFtIHtBcnJheVtdfSBbZ3JvdXBpbmc9dW5kZWZpbmVkXSBsaXN0IG9mIHB1dGF0aXZlbHkgb3RoZXIgbGlzdHMsIHdoaWNoIHNob3VsZCBjb3JyZXNwb25kIHRvIHRpY2tMYWJlbHNcbiAgKiB3aWxsIHNwYWNlIHRpY2sgbGFiZWxzIGluIG5lc3RlZCBsaXN0cyBjbG9zZXIgdG9nZXRoZXIgdGhhbiBvdXRlciBsaXN0c1xuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBncm91cGluZyxcblxuICAvKipcbiAgKiBUaGUgc2NhbGUgZm9yIHdoaWNoIG5vbi1jYXRlZ29yaWFsIChzZWUge0BsaW5rIGF4aXMjY2F0ZWdvcmljYWxRfSkgdGlja3Mgc2hvdWxkIGJlIHNwYWNlZFxuICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtzY2FsZT1kMy5zY2FsZUxpbmVhcl1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cblxuICBzY2FsZSA9IGQzLnNjYWxlTGluZWFyKCksXG4gIC8qKlxuICAqIFRoZSBwYWRkaW5nIGZvciB0aGUgZG9tYWluIG9mIHRoZSBzY2FsZSAoc2VlIHtAbGluayBheGlzI3NjYWxlfSlcbiAgKiBAcGFyYW0ge2QzLnNjYWxlfSBbc2NhbGU9ZDMuc2NhbGVMaW5lYXJdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGRvbWFpblBhZGRpbmcgPSAwLjUsXG5cblxuICAvKipcbiAgKiBEZWZhdWx0IHNwYWNlIGZvciB0aGUgc3BhY2VyIChwZXJjZW50YWdlKSBvZiBtYWluIGRpbWVuc2lvbiBnaXZlbiB0aGUgb3JpZW50YXRpb25cbiAgKiAoc2VlIHtAbGluayBheGlzI29yaWVudH0pLCB3aGVyZSB7QGxpbmsgYXhpcyNvcmllbnR9PVwiYm90dG9tXCIgb3Ige0BsaW5rIGF4aXMjb3JpZW50fT1cInRvcFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBheGlzI3NwYWNlWH0gYW5kIHdoZXJlIHtAbGluayBheGlzI29yaWVudH09XCJsZWZ0XCIgb3Ige0BsaW5rIGF4aXMjb3JpZW50fT1cInJpZ2h0XCJcbiAgKiB0aGUgbWFpbiBkaW1lbnNpb24gaXMge0BsaW5rIGF4aXMjc3BhY2VZfWJldHdlZW4gdGlja3NcbiAgKiBAcGFyYW0ge251bWJlcn0gW29iamVjdFNwYWNlcj0wLjA1XVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBvYmplY3RTcGFjZXIgPSAwLjA1LFxuICAvKipcbiAgKiBUaGUgbWluaW11bSBzaXplIHRoYXQgYW4gb2JqZWN0IGNhbiBiZSBpZiB7QGxpbmsgYXhpcyNjYXRlZ29yaWNhbFF9IGlzIHNldCB0byB0cnVlXG4gICogQHBhcmFtIHtudW1iZXJ9IFttaW5PYmplY3RTaXplPTE1XVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBtaW5PYmplY3RTaXplID0gMTUsXG4gIC8qKlxuICAqIFRoZSBtYXhpbXVtIHNpemUgdGhhdCBhbiBvYmplY3QgY2FuIGJlIGlmIHtAbGluayBheGlzI2NhdGVnb3JpY2FsUX0gaXMgc2V0IHRvIHRydWVcbiAgKiBAcGFyYW0ge251bWJlcn0gW21heE9iamVjdFNpemU9MTVdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG1heE9iamVjdFNpemUgPSA1MCxcblxuICAvKipcbiAgKiBDb2xvciBvZiB0aGUgYmFja2dyb3VuZFxuICAqIEBwYXJhbSB7c3RyaW5nfSBbYmFja2dyb3VuZEZpbGw9XCJ0cmFuc3BhcmVudFwiXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBiYWNrZ3JvdW5kRmlsbCA9ICd0cmFuc3BhcmVudCcsXG4gIC8qKlxuICAqIE5hbWVzcGFjZSBmb3IgYWxsIGl0ZW1zIG1hZGUgYnkgdGhpcyBpbnN0YW5jZSBvZiBheGlzXG4gICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lc3BhY2U9XCJkM3NtLWF4aXNcIl1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgbmFtZXNwYWNlID0gJ2Qzc20tYXhpcycsXG4gIC8qKlxuICAqIENsYXNzIG5hbWUgZm9yIHRpY2sgY29udGFpbmVyICg8Zz4gZWxlbWVudClcbiAgKiBAcGFyYW0ge3N0cmluZ30gW29iamVjdENsYXNzPVwidGljay1ncm91cFwiXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBvYmplY3RDbGFzcyA9ICd0aWNrLWdyb3VwJyxcblxuICAvKipcbiAgKiBWYWx1ZXMgdG8gc2hvdyBhdCBlYWNoIHRpY2suIE9ubHkgdXNlZCBpZiBjYXRlZ29yaWNhbFEgaXMgc2V0IHRydWUuIFNlZSB7QGxpbmsgYXhpcyNjYXRlZ29yaWNhbFF9XG4gICogQHBhcmFtIHtzdHJpbmdbXX0gW3RpY2tMYWJlbHM9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB0aWNrTGFiZWxzLCAgIC8vIHdoYXQgdG8gcGxhY2UgYXQgdGlja3NcbiAgLyoqXG4gICogVmFsdWVzIHRvIHNob3cgYXQgZWFjaCB0aWNrLiBPbmx5IHVzZWQgaWYgY2F0ZWdvcmljYWxRIGlzIHNldCBmYWxzZS4gU2VlIHtAbGluayBheGlzI2NhdGVnb3JpY2FsUX1cbiAgKiBAcGFyYW0ge3N0cmluZ1tdIHwgbnVtYmVyW119IFtvYmplY3RDbGFzcz11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHRpY2tWYWx1ZXMsICAgLy8gd2hlcmUgdG8gcGxhY2UgdGlja3MgaWYgbm90XG4gIC8qKlxuICAqIE51bWJlciBvZiB0aWNrcyB0byBkaXNwbGF5IGlmIGNhdGVnb3JpY2FsUSBpcyBmYWxzZS4gU2VlIHtAbGluayBheGlzI2NhdGVnb3JpY2FsUX1cbiAgKiBAcGFyYW0ge251bWJlcn0gW251bWJlck9mVGlja3M9NV1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgbnVtYmVyT2ZUaWNrcyA9IDUsXG5cblxuICAvKipcbiAgKiBTdHJva2UgY29sb3Igb2YgdGhlIG1haW4gYXhpcyBsaW5lXG4gICogQHBhcmFtIHtzdHJpbmd9IFtsaW5lU3Ryb2tlPSdibGFjayddXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGxpbmVTdHJva2UgPSAnYmxhY2snLFxuICAvKipcbiAgKiBTdHJva2Ugd2lkdGggb2YgdGhlIG1haW4gYXhpcyBsaW5lXG4gICogQHBhcmFtIHtudW1iZXJ9IFtsaW5lU3Ryb2tlV2lkdGg9M11cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgbGluZVN0cm9rZVdpZHRoID0gMyxcblxuXG4gIC8qKlxuICAqIFN0cm9rZSBjb2xvciBvZiB0aWNrc1xuICAqIEBwYXJhbSB7c3RyaW5nfSBbdGlja1N0cm9rZT0nYmxhY2snXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB0aWNrU3Ryb2tlID0gJ2JsYWNrJyxcbiAgLyoqXG4gICogU3Ryb2tlIG51bWJlciBvZiB0aWNrc1xuICAqIEBwYXJhbSB7c3RyaW5nfSBbdGlja1N0cm9rZVdpZHRoPTJdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHRpY2tTdHJva2VXaWR0aCA9IDIsXG4gIC8qKlxuICAqIExlbmd0aCAtIGluIHBpeGVscyAtIG9mIHRpY2tzXG4gICogQHBhcmFtIHtudW1iZXJ9IFt0aWNrTGVuZ3RoPTEwXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB0aWNrTGVuZ3RoID0gMTAsXG5cblxuICAvKipcbiAgKiBGb250IHNpemUgb2YgdGljayBsYWJlbHNcbiAgKiBAcGFyYW0ge251bWJlcn0gW3RpY2tMYWJlbEZvbnRTaXplPTE0XVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB0aWNrTGFiZWxGb250U2l6ZSA9IDE0LFxuICAvKipcbiAgKiBNaW4gZm9udCBzaXplIG9mIHRpY2sgbGFiZWxzXG4gICogQHBhcmFtIHtudW1iZXJ9IFt0aWNrTGFiZWxNaW5Gb250U2l6ZT04XVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB0aWNrTGFiZWxNaW5Gb250U2l6ZSA9IDgsXG4gIC8qKlxuICAqIE1heCBmb250IHNpemUgb2YgdGljayBsYWJlbHNcbiAgKiBAcGFyYW0ge251bWJlcn0gW3RpY2tMYWJlbE1heEZvbnRTaXplPTIwXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB0aWNrTGFiZWxNYXhGb250U2l6ZSA9IDIwLFxuXG5cbiAgLyoqXG4gICogVGV4dCBhbmNob3Igb2YgdGljayBsYWJlbHNcbiAgKiBAcGFyYW0ge3N0cmluZ30gW3RpY2tMYWJlbFRleHRBbmNob3I9XCJtaWRkbGVcIl1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdGlja0xhYmVsVGV4dEFuY2hvciA9ICdtaWRkbGUnLFxuICAvKipcbiAgKiBSb3RhdGlvbiBvZiB0aWNrIGxhYmVsc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbdGlja0xhYmVsUm90YXRpb249MF1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdGlja0xhYmVsUm90YXRpb24gPSAwLFxuICAvKipcbiAgKiBPcHRpb25hbCBmdW5jdGlvbiBmb3IgZXh0cmFjdGluZyB0aGUgdGljayBsYWJlbCBmcm9tIGRhdGFcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbdGlja0xhYmVsRnVuYz11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHRpY2tMYWJlbEZ1bmMgPSB1bmRlZmluZWQsXG5cblxuICAvKipcbiAgKiBMZW5ndGggb2YgZ3VpZGVsaW5lc1xuICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtndWlkZWxpbmVTcGFjZT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGd1aWRlbGluZVNwYWNlLFxuICAvKipcbiAgKiBTdHJva2UgY29sb3Igb2YgZ3VpZGxpbmVzXG4gICogQHBhcmFtIHtzdHJpbmd9IFtndWlkZWxpbmVTcGFjZT1cIiMzMzMzMzNcIl1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZ3VpZGVMaW5lU3Ryb2tlID0gJyMzMzMzMzMnLFxuICAvKipcbiAgKiBTdHJva2Ugd2lkdGggb2YgZ3VpZGxpbmVzXG4gICogQHBhcmFtIHtudW1iZXJ9IFtndWlkZWxpbmVTcGFjZT0yXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBndWlkZUxpbmVTdHJva2VXaWR0aCA9IDIsXG5cbiAgLyoqXG4gICogRHVyYXRpb24gb2YgYWxsIHRyYW5zaXRpb25zIG9mIHRoaXMgZWxlbWVudFxuICAqIEBwYXJhbSB7bnVtYmVyfSBbdHJhbnNpdGlvbkR1cmF0aW9uPTEwMDBdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHRyYW5zaXRpb25EdXJhdGlvbiA9IDEwMDAsXG4gIC8qKlxuICAqIEVhc2luZyBmdW5jdGlvbiBmb3IgdHJhbnNpdGlvbnNcbiAgKiBAcGFyYW0ge2QzLmVhc2V9IFtlYXNlRnVuYz1kMy5lYXNlRXhwXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBlYXNlRnVuYyA9IGQzLmVhc2VFeHAsXG5cblxuICAvKipcbiAgKiBDbG9zdXJlIHZhcmlhYmxlIGZvciBnZXR0aW5nIG9iamVjdCBzaXplIGFmdGVyIGNhbGN1bGF0aW9uXG4gICogQHBhcmFtIHtudW1iZXJ9IFtvYmplY3RTaXplPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb2JqZWN0U2l6ZSxcbiAgLyoqXG4gICogQ2xvc3VyZSB2YXJpYWJsZSBmb3IgZ2V0dGluZyBzcGFjZXIgc2l6ZSBhZnRlciBjYWxjdWxhdGlvblxuICAqIEBwYXJhbSB7bnVtYmVyfSBbc3BhY2VyU2l6ZT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNwYWNlclNpemUsXG5cbiAgLyoqXG4gICogRGVjaW1hbCBwZXJjaXNpb24gdG8gcm91bmQgbnVtZXJpY2FsIHRpY2sgbGFiZWxzIHRvXG4gICogQHBhcmFtIHtudW1iZXJ9IFtyb3VuZFRvPTJdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHJvdW5kVG8gPSAyXG5cblxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBzZWxlY3Rpb24gaW4gd2hpY2ggaXRlbXMgYXJlIG1hbmlwdWxhdGVkXG4gICAqIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IGQzLnNlbGVjdGlvbn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc2VsZWN0aW9uID0gc2VsZWN0aW9uXG4gICAqL1xuICBheGlzLnNlbGVjdGlvbiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2VsZWN0aW9uID0gXywgYXhpcykgOiBzZWxlY3Rpb247IH07XG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgb3JpZW50YXRpb24gaW4gd2hpY2ggaXRlbXMgYXJlIG1hbmlwdWxhdGVkXG4gICAqIChzZWUge0BsaW5rIGF4aXMjb3JpZW50fSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdIHNob3VsZCBiZSBob3Jpem9udGFsIG9yIHZlcnRpY2FsXG4gICAqIEByZXR1cm5zIHtheGlzIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvcmllbnQ9XCJib3R0b21cIlxuICAgKi9cbiAgYXhpcy5vcmllbnQgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9yaWVudCA9IF8sIGF4aXMpIDogb3JpZW50OyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBhbW91bnQgb2YgaG9yaXpvbnRhbCBzcGFjZSBpbiB3aGljaCBpdGVtcyBhcmUgbWFuaXB1bGF0ZWRcbiAgICogKHNlZSB7QGxpbmsgYXhpcyNzcGFjZVh9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV0gc2hvdWxkIGJlIGEgbnVtYmVyID4gMFxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc3BhY2VYID0gdW5kZWZpbmVkXG4gICAqL1xuICBheGlzLnNwYWNlWCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3BhY2VYID0gXywgYXhpcykgOiBzcGFjZVg7IH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGFtb3VudCBvZiB2ZXJ0aWNhbCBzcGFjZSBpbiB3aGljaCBpdGVtcyBhcmUgbWFuaXB1bGF0ZWRcbiAgICogKHNlZSB7QGxpbmsgYXhpcyNzcGFjZVl9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV0gc2hvdWxkIGJlIGEgbnVtYmVyID4gMFxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc3BhY2VZID0gdW5kZWZpbmVkXG4gICAqL1xuICBheGlzLnNwYWNlWSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3BhY2VZID0gXywgYXhpcykgOiBzcGFjZVk7IH07XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgd2hldGhlciBvciBub3QgYXhpcyBpcyBhbGxvd2VkIHRvIGdvIGJleW9uZCBzcGVjaWZpZWQgZGltZW5zaW9uc1xuICAgKiAoc2VlIHtAbGluayBheGlzI3NwYWNlWH0pXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBib29sZWFufVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvdmVyZmxvd1EgPSBmYWxzZVxuICAgKi9cbiAgYXhpcy5vdmVyZmxvd1EgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG92ZXJmbG93USA9IF8sIGF4aXMpIDogb3ZlcmZsb3dROyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgd2hldGhlciBvciBub3QgYXhpcyB3aWxsIGRpc3BsYXkgY2F0ZWdvcmlhbCB0aWNrcyBvciBieSBudW1lcmljYWwgdmFsdWVcbiAgICogKHNlZSB7QGxpbmsgYXhpcyNjYXRlZ29yaWNhbFF9KVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgYm9vbGVhbn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgY2F0ZWdvcmljYWxRID0gZmFsc2VcbiAgICovXG4gIGF4aXMuY2F0ZWdvcmljYWxRID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjYXRlZ29yaWNhbFEgPSBfLCBheGlzKSA6IGNhdGVnb3JpY2FsUTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHdoZXRoZXIgb3Igbm90IGF4aXMgdGlja3Mgc2hvdWxkIGhhdmUgZ3VpZGVsaW5lc1xuICAgKiAoc2VlIHtAbGluayBheGlzI2d1aWRlTGluZXNRfSlcbiAgICogQHBhcmFtIHtib29sZWFufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IGJvb2xlYW59XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGd1aWRlTGluZXNRID0gZmFsc2VcbiAgICovXG4gIGF4aXMuZ3VpZGVMaW5lc1EgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGd1aWRlTGluZXNRID0gXywgYXhpcykgOiBndWlkZUxpbmVzUTsgfTtcblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyBob3cgdGlja3Mgc2hvdWxkIGJlIGdyb3VwcGVkXG4gICAqIChzZWUge0BsaW5rIGF4aXMjZ3JvdXBpbmd9KVxuICAgKiBAcGFyYW0ge0FycmF5W119IFtfPW5vbmVdIGxpc3Qgb2YgcHV0YXRpdmVseSBvdGhlciBsaXN0cywgd2hpY2ggc2hvdWxkIGNvcnJlc3BvbmQgdG8gdGlja0xhYmVsc1xuICAgKiB3aWxsIHNwYWNlIHRpY2sgbGFiZWxzIGluIG5lc3RlZCBsaXN0cyBjbG9zZXIgdG9nZXRoZXIgdGhhbiBvdXRlciBsaXN0c1xuICAgKiBAcmV0dXJucyB7YXhpcyB8IEFycmF5W119XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGdyb3VwaW5nID0gdW5kZWZpbmVkXG4gICAqL1xuICBheGlzLmdyb3VwaW5nID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChncm91cGluZyA9IF8sIGF4aXMpIDogZ3JvdXBpbmc7IH07XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNjYWxlIGZvciB3aGljaCBub24tY2F0ZWdvcmlhbCAgdGlja3Mgc2hvdWxkXG4gICAqIGJlIHNwYWNlZFxuICAgKiAoc2VlIHtAbGluayBheGlzI3NjYWxlfSlcbiAgICogQHBhcmFtIHtkMy5zY2FsZX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBkMy5zY2FsZX1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc2NhbGUgPSBkMy5zY2FsZUxpbmVhcigpXG4gICAqL1xuICBheGlzLnNjYWxlID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzY2FsZSA9IF8sIGF4aXMpIDogc2NhbGU7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgcGFkZGluZyBmb3IgdGhlIGRvbWFpbiBvZiB0aGUgc2NhbGVcbiAgICogKHNlZSB7QGxpbmsgYXhpcyNkb21haW5QYWRkaW5nfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBkb21haW5QYWRkaW5nID0gMC41XG4gICAqL1xuICBheGlzLmRvbWFpblBhZGRpbmcgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpblBhZGRpbmcgPSBfLCBheGlzKSA6IGRvbWFpblBhZGRpbmc7IH07XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgb2JqZWN0U3BhY2VyXG4gICAqIChzZWUge0BsaW5rIGF4aXMjb2JqZWN0U3BhY2VyfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvYmplY3RTcGFjZXIgPSAwLjA1XG4gICAqL1xuICBheGlzLm9iamVjdFNwYWNlciA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob2JqZWN0U3BhY2VyID0gXywgYXhpcykgOiBvYmplY3RTcGFjZXI7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbWluT2JqZWN0U2l6ZVxuICAgKiAoc2VlIHtAbGluayBheGlzI21pbk9iamVjdFNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG1pbk9iamVjdFNpemUgPSAxNVxuICAgKi9cbiAgYXhpcy5taW5PYmplY3RTaXplID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChtaW5PYmplY3RTaXplID0gXywgYXhpcykgOiBtaW5PYmplY3RTaXplOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG1heE9iamVjdFNpemVcbiAgICogKHNlZSB7QGxpbmsgYXhpcyNtYXhPYmplY3RTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBtYXhPYmplY3RTaXplID0gNTBcbiAgICovXG4gIGF4aXMubWF4T2JqZWN0U2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobWF4T2JqZWN0U2l6ZSA9IF8sIGF4aXMpIDogbWF4T2JqZWN0U2l6ZTsgfTtcblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbmFtZXNwYWNlXG4gICAqIChzZWUge0BsaW5rIGF4aXMjbmFtZXNwYWNlfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBuYW1lc3BhY2UgPSAnZDNzbS1heGlzJ1xuICAgKi9cbiAgYXhpcy5uYW1lc3BhY2UgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG5hbWVzcGFjZSA9IF8sIGF4aXMpIDogbmFtZXNwYWNlOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGJhY2tncm91bmRGaWxsXG4gICAqIChzZWUge0BsaW5rIGF4aXMjYmFja2dyb3VuZEZpbGx9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGJhY2tncm91bmRGaWxsID0gJ3RyYW5zcGFyZW50J1xuICAgKi9cbiAgYXhpcy5iYWNrZ3JvdW5kRmlsbCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYmFja2dyb3VuZEZpbGwgPSBfLCBheGlzKSA6IGJhY2tncm91bmRGaWxsOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG9iamVjdENsYXNzXG4gICAqIChzZWUge0BsaW5rIGF4aXMjb2JqZWN0Q2xhc3N9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG9iamVjdENsYXNzID0gJ3RpY2stZ3JvdXAnXG4gICAqL1xuICBheGlzLm9iamVjdENsYXNzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvYmplY3RDbGFzcyA9IF8sIGF4aXMpIDogb2JqZWN0Q2xhc3M7IH07XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRpY2tMYWJlbHNcbiAgICogKHNlZSB7QGxpbmsgYXhpcyN0aWNrTGFiZWxzfSlcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBzdHJpbmdbXX1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdGlja0xhYmVscyA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYXhpcy50aWNrTGFiZWxzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrTGFiZWxzID0gXywgYXhpcykgOiB0aWNrTGFiZWxzOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRpY2tWYWx1ZXNcbiAgICogKHNlZSB7QGxpbmsgYXhpcyN0aWNrVmFsdWVzfSlcbiAgICogQHBhcmFtIHtudW1iZXJbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBudW1iZXJbXX1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdGlja1ZhbHVlcyA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYXhpcy50aWNrVmFsdWVzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrVmFsdWVzID0gXywgYXhpcykgOiB0aWNrVmFsdWVzOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRpY2tWYWx1ZXNcbiAgICogKHNlZSB7QGxpbmsgYXhpcyNudW1iZXJPZlRpY2tzfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBudW1iZXJPZlRpY2tzID0gNVxuICAgKi9cbiAgYXhpcy5udW1iZXJPZlRpY2tzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChudW1iZXJPZlRpY2tzID0gXywgYXhpcykgOiBudW1iZXJPZlRpY2tzOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBsaW5lU3Ryb2tlXG4gICAqIChzZWUge0BsaW5rIGF4aXMjbGluZVN0cm9rZX0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgbGluZVN0cm9rZSA9ICdibGFjaydcbiAgICovXG4gIGF4aXMubGluZVN0cm9rZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobGluZVN0cm9rZSA9IF8sIGF4aXMpIDogbGluZVN0cm9rZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBsaW5lU3Ryb2tlV2lkdGhcbiAgICogKHNlZSB7QGxpbmsgYXhpcyNsaW5lU3Ryb2tlV2lkdGh9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGxpbmVTdHJva2VXaWR0aCA9IDNcbiAgICovXG4gIGF4aXMubGluZVN0cm9rZVdpZHRoID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChsaW5lU3Ryb2tlV2lkdGggPSBfLCBheGlzKSA6IGxpbmVTdHJva2VXaWR0aDsgfTtcblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdGlja1N0cm9rZVxuICAgKiAoc2VlIHtAbGluayBheGlzI3RpY2tTdHJva2V9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHRpY2tTdHJva2UgPSAnYmxhY2snXG4gICAqL1xuICBheGlzLnRpY2tTdHJva2UgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tTdHJva2UgPSBfLCBheGlzKSA6IHRpY2tTdHJva2U7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdGlja1N0cm9rZVdpZHRoXG4gICAqIChzZWUge0BsaW5rIGF4aXMjdGlja1N0cm9rZVdpZHRofSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0aWNrU3Ryb2tlV2lkdGggPSAyXG4gICAqL1xuICBheGlzLnRpY2tTdHJva2VXaWR0aCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja1N0cm9rZVdpZHRoID0gXywgYXhpcykgOiB0aWNrU3Ryb2tlV2lkdGg7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdGlja0xlbmd0aFxuICAgKiAoc2VlIHtAbGluayBheGlzI3RpY2tMZW5ndGh9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHRpY2tMZW5ndGggPSAxMFxuICAgKi9cbiAgYXhpcy50aWNrTGVuZ3RoID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrTGVuZ3RoID0gXywgYXhpcykgOiB0aWNrTGVuZ3RoOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB0aWNrTGFiZWxGb250U2l6ZVxuICAgKiAoc2VlIHtAbGluayBheGlzI3RpY2tMYWJlbEZvbnRTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0aWNrTGFiZWxGb250U2l6ZSA9IDE0XG4gICAqL1xuICBheGlzLnRpY2tMYWJlbEZvbnRTaXplID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrTGFiZWxGb250U2l6ZSA9IF8sIGF4aXMpIDogdGlja0xhYmVsRm9udFNpemU7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdGlja0xhYmVsTWluRm9udFNpemVcbiAgICogKHNlZSB7QGxpbmsgYXhpcyN0aWNrTGFiZWxNaW5Gb250U2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdGlja0xhYmVsTWluRm9udFNpemUgPSA4XG4gICAqL1xuICBheGlzLnRpY2tMYWJlbE1pbkZvbnRTaXplID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrTGFiZWxNaW5Gb250U2l6ZSA9IF8sIGF4aXMpIDogdGlja0xhYmVsTWluRm9udFNpemU7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdGlja0xhYmVsTWF4Rm9udFNpemVcbiAgICogKHNlZSB7QGxpbmsgYXhpcyN0aWNrTGFiZWxNYXhGb250U2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdGlja0xhYmVsTWF4Rm9udFNpemUgPSAyMFxuICAgKi9cbiAgYXhpcy50aWNrTGFiZWxNYXhGb250U2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja0xhYmVsTWF4Rm9udFNpemUgPSBfLCBheGlzKSA6IHRpY2tMYWJlbE1heEZvbnRTaXplO307XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRpY2tMYWJlbFRleHRBbmNob3JcbiAgICogKHNlZSB7QGxpbmsgYXhpcyN0aWNrTGFiZWxUZXh0QW5jaG9yfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0aWNrTGFiZWxUZXh0QW5jaG9yID0gJ2NlbnRlcidcbiAgICovXG4gIGF4aXMudGlja0xhYmVsVGV4dEFuY2hvciA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja0xhYmVsVGV4dEFuY2hvciA9IF8sIGF4aXMpIDogdGlja0xhYmVsVGV4dEFuY2hvcjsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB0aWNrTGFiZWxSb3RhdGlvblxuICAgKiAoc2VlIHtAbGluayBheGlzI3RpY2tMYWJlbFJvdGF0aW9ufSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0aWNrTGFiZWxSb3RhdGlvbiA9IDBcbiAgICovXG4gIGF4aXMudGlja0xhYmVsUm90YXRpb24gPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tMYWJlbFJvdGF0aW9uID0gXywgYXhpcykgOiB0aWNrTGFiZWxSb3RhdGlvbjsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB0aWNrTGFiZWxGdW5jXG4gICAqIChzZWUge0BsaW5rIGF4aXMjdGlja0xhYmVsRnVuY30pXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgZnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHRpY2tMYWJlbEZ1bmMgPSB1bmRlZmluZWRcbiAgICovXG4gIGF4aXMudGlja0xhYmVsRnVuYyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja0xhYmVsRnVuYyA9IF8sIGF4aXMpIDogdGlja0xhYmVsRnVuYzsgfTtcblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgZ3VpZGVsaW5lU3BhY2VcbiAgICogKHNlZSB7QGxpbmsgYXhpcyNndWlkZWxpbmVTcGFjZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgZ3VpZGVsaW5lU3BhY2UgPSB1bmRlZmluZWRcbiAgICovXG4gIGF4aXMuZ3VpZGVsaW5lU3BhY2UgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGd1aWRlbGluZVNwYWNlID0gXywgYXhpcykgOiBndWlkZWxpbmVTcGFjZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBndWlkZUxpbmVTdHJva2VcbiAgICogKHNlZSB7QGxpbmsgYXhpcyNndWlkZUxpbmVTdHJva2V9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGd1aWRlTGluZVN0cm9rZSA9IFwiIzMzMzMzM1wiXG4gICAqL1xuICBheGlzLmd1aWRlTGluZVN0cm9rZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZ3VpZGVMaW5lU3Ryb2tlID0gXywgYXhpcykgOiBndWlkZUxpbmVTdHJva2U7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgZ3VpZGVMaW5lU3Ryb2tlV2lkdGhcbiAgICogKHNlZSB7QGxpbmsgYXhpcyNndWlkZUxpbmVTdHJva2VXaWR0aH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgZ3VpZGVMaW5lU3Ryb2tlV2lkdGggPSAyXG4gICAqL1xuICBheGlzLmd1aWRlTGluZVN0cm9rZVdpZHRoID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChndWlkZUxpbmVTdHJva2VXaWR0aCA9IF8sIGF4aXMpIDogZ3VpZGVMaW5lU3Ryb2tlV2lkdGg7IH07XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRyYW5zaXRpb25EdXJhdGlvblxuICAgKiAoc2VlIHtAbGluayBheGlzI3RyYW5zaXRpb25EdXJhdGlvbn0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdHJhbnNpdGlvbkR1cmF0aW9uID0gMTAwMFxuICAgKi9cbiAgYXhpcy50cmFuc2l0aW9uRHVyYXRpb24gPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRyYW5zaXRpb25EdXJhdGlvbiA9IF8sIGF4aXMpIDogdHJhbnNpdGlvbkR1cmF0aW9uOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGVhc2VGdW5jXG4gICAqIChzZWUge0BsaW5rIGF4aXMjZWFzZUZ1bmN9KVxuICAgKiBAcGFyYW0ge2QzLmVhc2V9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgZDMuZWFzZX1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgZWFzZUZ1bmMgPSBkMy5lYXNlRXhwXG4gICAqL1xuICBheGlzLmVhc2VGdW5jID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChlYXNlRnVuYyA9IF8sIGF4aXMpIDogZWFzZUZ1bmM7IH07XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG9iamVjdFNpemVcbiAgICogKHNlZSB7QGxpbmsgYXhpcyNvYmplY3RTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvYmplY3RTaXplID0gdW5kZWZpbmVkXG4gICAqL1xuICBheGlzLm9iamVjdFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9iamVjdFNpemUgPSBfLCBheGlzKSA6IG9iamVjdFNpemU7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgc3BhY2VyU2l6ZVxuICAgKiAoc2VlIHtAbGluayBheGlzI3NwYWNlclNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNwYWNlclNpemUgPSB1bmRlZmluZWRcbiAgICovXG4gIGF4aXMuc3BhY2VyU2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3BhY2VyU2l6ZSA9IF8sIGF4aXMpIDogc3BhY2VyU2l6ZTsgfTtcblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHJvdW5kVG9cbiAgICogKHNlZSB7QGxpbmsgYXhpcyNyb3VuZFRvfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCByb3VuZFRvID0gMlxuICAgKi9cbiAgYXhpcy5yb3VuZFRvID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyb3VuZFRvID0gXywgYXhpcykgOiByb3VuZFRvOyB9O1xuXG5cblxuICBmdW5jdGlvbiBheGlzICgpIHtcbiAgICAvLyBmb3IgY29udmVuaWVuY2UgaW4gaGFuZGxpbmcgb3JpZW50YXRpb24gc3BlY2lmaWMgdmFsdWVzXG4gICAgdmFyIGhvcml6b250YWxRID0gaGFzUShbJ3RvcCcsICdib3R0b20nLCAnaG9yaXpvbnRhbCddLG9yaWVudCkgPyB0cnVlIDogZmFsc2VcbiAgICB2YXIgdmVydGljYWxRID0gIWhvcml6b250YWxRXG5cbiAgICAvLyBiYWNrZ3JvdW5kIGNsaXBpbmcgcmVjdGFuZ2xlXG4gICAgdmFyIGJnY3BSZWN0ID0ge3g6MCwgeTowLCB3aWR0aDogc3BhY2VYLCBoZWlnaHQ6c3BhY2VZfVxuICAgIGlmIChvcmllbnQgPT0gXCJsZWZ0XCIpIHsgYmdjcFJlY3QueCAtPSBzcGFjZVg7ICBpZihndWlkZUxpbmVzUSkgeyBiZ2NwUmVjdC53aWR0aCArPSBndWlkZWxpbmVTcGFjZSB9OyBiZ2NwUmVjdC55IC09IHRpY2tMYWJlbE1heEZvbnRTaXplOyBiZ2NwUmVjdC5oZWlnaHQgKz0gMip0aWNrTGFiZWxNYXhGb250U2l6ZSAgfVxuICAgIGlmIChvcmllbnQgPT0gXCJib3R0b21cIil7IGJnY3BSZWN0LnkgPSBiZ2NwUmVjdC55O1xuICAgICAgaWYoZ3VpZGVMaW5lc1EpIHsgYmdjcFJlY3QueSAtPSBndWlkZWxpbmVTcGFjZTsgYmdjcFJlY3QuaGVpZ2h0ICs9IGd1aWRlbGluZVNwYWNlOyB9O1xuICAgICAgYmdjcFJlY3QueCAtPSB0aWNrTGFiZWxNYXhGb250U2l6ZTsgYmdjcFJlY3Qud2lkdGggKz0gMip0aWNrTGFiZWxNYXhGb250U2l6ZVxuXG4gICAgfVxuICAgIGlmIChvcmllbnQgPT0gXCJ0b3BcIikgeyBiZ2NwUmVjdC55IC09IHNwYWNlWTtcbiAgICAgIGlmKGd1aWRlTGluZXNRKSB7IGJnY3BSZWN0LmhlaWdodCArPSBndWlkZWxpbmVTcGFjZSB9O1xuICAgICAgLy8gYmdjcFJlY3QueSAtPSB0aWNrTGFiZWxNYXhGb250U2l6ZTsgYmdjcFJlY3QuaGVpZ2h0ICs9IDIqdGlja0xhYmVsTWF4Rm9udFNpemVcbiAgICB9XG4gICAgaWYgKG9yaWVudCA9PSBcInJpZ2h0XCIpIHsgYmdjcFJlY3QueCA9IDA7XG4gICAgICBpZihndWlkZUxpbmVzUSkgeyBiZ2NwUmVjdC53aWR0aCArPSBndWlkZWxpbmVTcGFjZTsgYmdjcFJlY3QueCAtPSBndWlkZWxpbmVTcGFjZSB9O1xuICAgICAgYmdjcFJlY3QueSAtPSB0aWNrTGFiZWxNYXhGb250U2l6ZTsgYmdjcFJlY3QuaGVpZ2h0ICs9IDIqdGlja0xhYmVsTWF4Rm9udFNpemVcbiAgICAgIGNvbnNvbGUubG9nKGJnY3BSZWN0KVxuICAgIH1cblxuXG4gICAgdmFyIGNvbnRhaW5lciA9IHNldHVwQ29udGFpbmVyKCBzZWxlY3Rpb24sIG5hbWVzcGFjZSwgYmdjcFJlY3QsIGJhY2tncm91bmRGaWxsICk7XG5cbiAgICAvLyB2YXIgdGlja3MgPSAgc2FmZVNlbGVjdChjb250YWluZXIsICdnJywgaHlwZW5hdGUobmFtZXNwYWNlLCdheGlzLXRpY2tzJykpXG4gICAgLy8gdmFyIGxhYmVscyA9ICBzYWZlU2VsZWN0KGNvbnRhaW5lciwgJ2cnLCBoeXBlbmF0ZShuYW1lc3BhY2UsJ2F4aXMtbGFiZWxzJykpXG4gICAgLy8gdmFyIGd1aWRsaW5lcyA9ICBzYWZlU2VsZWN0KGNvbnRhaW5lciwgJ2cnLCBoeXBlbmF0ZShuYW1lc3BhY2UsJ2d1aWRlbGluZS1jb250YWluZXInKSlcbiAgICAvL1xuICAgIC8vIHZhciB0aWNrcyA9IHRpY2tzLnNlbGVjdEFsbCgnLicraHlwZW5hdGUobmFtZXNwYWNlLCd0aWNrJykpXG4gICAgLy8gdmFyIGxhYmVscyA9IGxhYmVscy5zZWxlY3RBbGwoJy4nK2h5cGVuYXRlKG5hbWVzcGFjZSwnbGFiZWwnKSlcbiAgICAvLyB2YXIgZ2xpbmVzID0gZ3VpZGxpbmVzLnNlbGVjdEFsbCgnLicraHlwZW5hdGUobmFtZXNwYWNlLCdndWlkZWxpbmUnKSlcblxuICAgIGlmIChvcmllbnQgPT0gJ3RvcCcpIHt0aWNrTGFiZWxUZXh0QW5jaG9yID0gJ3N0YXJ0JzsgdGlja0xhYmVsUm90YXRpb24gPSA5MH1cbiAgICBpZiAob3JpZW50ID09ICdib3R0b20nKSB7dGlja0xhYmVsVGV4dEFuY2hvciA9ICdlbmQnOyB0aWNrTGFiZWxSb3RhdGlvbiA9IC05MH1cbiAgICBpZiAob3JpZW50ID09ICdsZWZ0Jykge3RpY2tMYWJlbFRleHRBbmNob3IgPSAnZW5kJzsgdGlja0xhYmVsUm90YXRpb24gPSAwfVxuICAgIGlmIChvcmllbnQgPT0gJ3JpZ2h0Jykge3RpY2tMYWJlbFRleHRBbmNob3IgPSAnc3RhcnQnOyB0aWNrTGFiZWxSb3RhdGlvbiA9IDB9XG5cblxuICAgIHZhciB0aWNrRGF0YSA9IGNhdGVnb3JpY2FsUVxuICAgID8gKGdyb3VwaW5nID09IHVuZGVmaW5lZCkgPyB0aWNrTGFiZWxzIDogZ3JvdXBpbmdcbiAgICA6IChncm91cGluZyA9PSB1bmRlZmluZWQpXG4gICAgICA/IChudW1iZXJPZlRpY2tzICE9IHVuZGVmaW5lZClcbiAgICAgIC8vID8gKHRpY2tWYWx1ZXMubGVuZ3RoIDwgbnVtYmVyT2ZUaWNrcylcbiAgICAgICAgPyAodGlja1JhbmdlKC4uLmQzLmV4dGVudCh0aWNrVmFsdWVzKSwgbnVtYmVyT2ZUaWNrcykpXG4gICAgICAgIDogdGlja1ZhbHVlc1xuICAgICAgOiBncm91cGluZ1xuXG4gICAgdmFyIGZsYXRUaWNrRGF0YSA9IGZsYXR0ZW4odGlja0RhdGEpXG4gICAgdmFyIG51bWJlck9mT2JqZWN0cyA9IGZsYXRUaWNrRGF0YS5sZW5ndGhcbiAgICB2YXIgc3BhY2UgPSBob3Jpem9udGFsUSA/IHNwYWNlWCA6IHNwYWNlWVxuICAgIHZhciBleHRlbnQgPSBkMy5leHRlbnQoZmxhdFRpY2tEYXRhKVxuXG4gICAgc2NhbGVcbiAgICAuZG9tYWluKFtleHRlbnRbMF0gLSBkb21haW5QYWRkaW5nLCBleHRlbnRbMV0gKyBkb21haW5QYWRkaW5nXSlcbiAgICAucmFuZ2UoW2hvcml6b250YWxRID8gMCA6IHNwYWNlWSwgaG9yaXpvbnRhbFEgPyBzcGFjZVggOiAwXSlcblxuICAgIC8vIGNhbGN1bGF0ZSBvYmplY3Qgc2l6ZVxuICAgIG9iamVjdFNpemUgPSAob2JqZWN0U2l6ZSA9PSB1bmRlZmluZWQpXG4gICAgPyBjYWxjdWxhdGVXaWR0aE9mT2JqZWN0KHNwYWNlLCBudW1iZXJPZk9iamVjdHMsIG1pbk9iamVjdFNpemUsIG1heE9iamVjdFNpemUsIG9iamVjdFNwYWNlciwgb3ZlcmZsb3dRKVxuICAgIDogb2JqZWN0U2l6ZVxuXG4gICAgLy8gY2FsY3VsYXRlIHNwYWNlciBzaXplIGlmIG5lZWRlZFxuICAgIHNwYWNlclNpemUgPSAoc3BhY2VyU2l6ZSA9PSB1bmRlZmluZWQpXG4gICAgPyBjYWxjdWxhdGVXaWR0aE9mU3BhY2VyKGZsYXRUaWNrRGF0YSwgc3BhY2UsIG9iamVjdFNpemUsIG51bWJlck9mT2JqZWN0cywgb2JqZWN0U3BhY2VyLCBvdmVyZmxvd1EpXG4gICAgOiBzcGFjZXJTaXplXG5cbiAgICB2YXIgb2JqQ2xhc3MgPSBoeXBlbmF0ZShuYW1lc3BhY2UsIGNhdGVnb3JpY2FsUSA/IG9iamVjdENsYXNzKyctY2F0ZWdvcmljYWwnIDogb2JqZWN0Q2xhc3MpXG5cbiAgICB2YXIgc3BhY2VyRnVuY3Rpb24gPSBncm91cGluZ1NwYWNlcigpXG4gICAgLmhvcml6b250YWxRKGhvcml6b250YWxRKS5zY2FsZShzY2FsZSkubW92ZWJ5KChjYXRlZ29yaWNhbFE/J2NhdGVnb3J5Jzonc2NhbGUnKSkubnVtYmVyT2ZPYmplY3RzKG51bWJlck9mT2JqZWN0cylcbiAgICAub2JqZWN0Q2xhc3Mob2JqQ2xhc3MpLm9iamVjdFNpemUob2JqZWN0U2l6ZSkuc3BhY2VyU2l6ZShzcGFjZXJTaXplKVxuICAgIC50cmFuc2l0aW9uRHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlRnVuYyhlYXNlRnVuYylcbiAgICAubmFtZXNwYWNlKG5hbWVzcGFjZSlcblxuICAgIHZhciB0aWNrRW50ZXJBbmltYXRpb24gPSBmdW5jdGlvbihzZWwpe1xuICAgICAgdmFyIG10ID0gc2NhbGUoc2VsLmRhdHVtKCkpLFxuICAgICAgZGlzdCA9IHNjYWxlKGV4dGVudFsxXSkgKiAyLFxuICAgICAgayA9IChtdCA8IGV4dGVudFsxXSAvIDIpID8gMSA6IC0xXG4gICAgICBrID0gaG9yaXpvbnRhbFEgPyBrICogLTEgOiBrXG4gICAgICBzZWwuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24gKGQsIGkpIHtcbiAgICAgICAgdmFyXG4gICAgICAgIHggPSBob3Jpem9udGFsUSA/ICBkaXN0ICogayA6IDAsXG4gICAgICAgIHkgPSAhaG9yaXpvbnRhbFEgPyBkaXN0ICogayA6IDAsXG4gICAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgICAgcmV0dXJuIHRcbiAgICAgIH0pXG4gICAgfVxuICAgIHZhciB0aWNrRXhpdEFuaW1hdGlvbiA9IGZ1bmN0aW9uKHNlbCkge1xuICAgICAgdmFyIG10ID0gc2NhbGUoc2VsLmRhdHVtKCkpLFxuICAgICAgZGlzdCA9IHNjYWxlKGV4dGVudFsxXSkgKiAyLFxuICAgICAgayA9IChtdCA8IGV4dGVudFsxXSAvIDIpID8gMSA6IC0xXG4gICAgICBrID0gaG9yaXpvbnRhbFEgPyBrICogLTEgOiBrXG4gICAgICBzZWwudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuZWFzZShlYXNlRnVuYylcbiAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDApXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24gKGQsIGkpIHtcbiAgICAgICAgdmFyXG5cbiAgICAgICAgeCA9IGhvcml6b250YWxRID8gIGRpc3QgKiBrICA6IDAsXG4gICAgICAgIHkgPSAhaG9yaXpvbnRhbFEgPyBkaXN0ICogayA6IDAsXG4gICAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgICAgcmV0dXJuIHRcbiAgICAgIH0pLnJlbW92ZSgpXG4gICAgfVxuXG4gICAgaWYgKCFjYXRlZ29yaWNhbFEpe1xuICAgICAgc3BhY2VyRnVuY3Rpb24uZW50ZXJGdW5jdGlvbih0aWNrRW50ZXJBbmltYXRpb24pXG4gICAgICBzcGFjZXJGdW5jdGlvbi5leGl0RnVuY3Rpb24odGlja0V4aXRBbmltYXRpb24pXG4gICAgfVxuXG5cblxuICAgIHNwYWNlckZ1bmN0aW9uKGNvbnRhaW5lciwgdGlja0RhdGEsIDApXG5cbiAgICBmdW5jdGlvbiBtb3ZlWEJ5KGQsIGksIGhvcml6b250YWxRLCBjYXRlZ29yaWNhbFEsIG9iamVjdFNpemUpe1xuICAgICAgcmV0dXJuIChob3Jpem9udGFsUSlcbiAgICAgID8gKGNhdGVnb3JpY2FsUSlcbiAgICAgICAgPyBvYmplY3RTaXplIC8gMlxuICAgICAgICA6IDBcbiAgICAgIDogMFxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vdmVZQnkoZCwgaSwgdmVydGljYWxRLCBjYXRlZ29yaWNhbFEsIG9iamVjdFNpemUpe1xuICAgICAgcmV0dXJuICh2ZXJ0aWNhbFEpXG4gICAgICA/IChjYXRlZ29yaWNhbFEpXG4gICAgICAgID8gb2JqZWN0U2l6ZSAvIDJcbiAgICAgICAgOiAwXG4gICAgICA6IDBcbiAgICB9XG5cbiAgICAvLyBtYWtlTmVzdGVkR3JvdXBzKGNvbnRhaW5lciwgdGlja0RhdGEsIGhvcml6b250YWxRLCBzY2FsZSwgKGNhdGVnb3JpY2FsUT8nY2F0ZWdvcnknOidzY2FsZScpLG9iakNsYXNzLCBvYmplY3RTaXplLCBzcGFjZXJTaXplLCB1bmRlZmluZWQsIHRyYW5zaXRpb25EdXJhdGlvbiwgZWFzZUZ1bmMpXG5cbiAgICB2YXIgdGlja3MgPSBjb250YWluZXIuc2VsZWN0QWxsKCdnOm5vdCgudG8tcmVtb3ZlKS4nK29iakNsYXNzKS5lYWNoKGZ1bmN0aW9uKGQsIGkpe1xuICAgICAgdmFyIHRoYXQgPSBkMy5zZWxlY3QodGhpcykuc3R5bGUoJ29wYWNpdHknLCAxKVxuXG4gICAgICB2YXIgdGljayA9IHNhZmVTZWxlY3QodGhhdCwgJ2xpbmUnLCBoeXBlbmF0ZShuYW1lc3BhY2UsJ3RpY2snKSlcbiAgICAgIC5hdHRyKFwieDFcIiwgMClcbiAgICAgIC5hdHRyKFwieDJcIiwgaG9yaXpvbnRhbFEgPyAwIDogb3JpZW50ID09IFwibGVmdFwiID8gLXRpY2tMZW5ndGggOiB0aWNrTGVuZ3RoKVxuICAgICAgLmF0dHIoXCJ5MVwiLCAwKVxuICAgICAgLmF0dHIoJ3kyJywgIHZlcnRpY2FsUSA/IDAgOiBvcmllbnQgPT0gXCJ0b3BcIiA/IC10aWNrTGVuZ3RoIDogdGlja0xlbmd0aClcbiAgICAgIC5hdHRyKCdzdHJva2UnLCB0aWNrU3Ryb2tlKVxuICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIHRpY2tTdHJva2VXaWR0aClcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbihkLCBpKSB7XG4gICAgICAgIHZhclxuICAgICAgICB4ID0gbW92ZVhCeShkLCBpLCBob3Jpem9udGFsUSwgY2F0ZWdvcmljYWxRLCBvYmplY3RTaXplKSxcbiAgICAgICAgeSA9IG1vdmVZQnkoZCwgaSwgdmVydGljYWxRLCBjYXRlZ29yaWNhbFEsIG9iamVjdFNpemUpLFxuICAgICAgICB0ID0gJ3RyYW5zbGF0ZSgnK3grJywnK3krJyknXG4gICAgICAgIHJldHVybiB0XG4gICAgICB9KVxuXG4gICAgICB2YXIgbGFiZWwgPSBzYWZlU2VsZWN0KHRoYXQsICd0ZXh0JywgaHlwZW5hdGUobmFtZXNwYWNlLCdsYWJlbCcpKVxuICAgICAgLnRleHQoZnVuY3Rpb24oZCwgaSl7IHJldHVybiB0eXBlb2YgZCA9PSAnbnVtYmVyJyA/IHJvdW5kKGQsIHJvdW5kVG8pIDogZH0pXG4gICAgICAuYXR0cignZm9udC1zaXplJywgdGlja0xhYmVsRm9udFNpemUpXG4gICAgICAuYXR0cigndGV4dC1hbmNob3InLCB0aWNrTGFiZWxUZXh0QW5jaG9yKVxuXG4gICAgICB0cnVuY2F0ZVRleHQobGFiZWwsIGxhYmVsLnRleHQoKSwgb3JpZW50LCB0aWNrTGVuZ3RoLCBob3Jpem9udGFsUSA/IHNwYWNlWSA6IHNwYWNlWCwgb3ZlcmZsb3dRKVxuXG4gICAgICBsYWJlbC5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbihkLCBpKSB7XG4gICAgICAgIHZhclxuICAgICAgICByZWN0ID0gZDMuc2VsZWN0KHRoaXMpLm5vZGUoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgeCA9IG1vdmVYQnkoZCwgaSwgaG9yaXpvbnRhbFEsIGNhdGVnb3JpY2FsUSwgb2JqZWN0U2l6ZSksXG4gICAgICAgIHkgPSBtb3ZlWUJ5KGQsIGksIHZlcnRpY2FsUSwgY2F0ZWdvcmljYWxRLCBvYmplY3RTaXplKVxuICAgICAgICAvLyBvbiByZWNhbGwsIHJlY3QgY2hhbmdlcyBiZWNhdXNlIG9mIHJvdGF0aW9uIHNvIG5lZWQgTWF0aC5taW4ocmVjdC5oZWlnaHQsIHJlY3Qud2lkdGgpXG5cbiAgICAgICAgaWYgKG9yaWVudCA9PSAndG9wJykge3kgPSAtdGlja0xlbmd0aDsgeS09TWF0aC5tYXgocmVjdC5oZWlnaHQsIHJlY3Qud2lkdGgpO3ggLT0gTWF0aC5taW4ocmVjdC5oZWlnaHQsIHJlY3Qud2lkdGgpICogMC4yNX1cbiAgICAgICAgaWYgKG9yaWVudCA9PSAnYm90dG9tJykge3kgPSB0aWNrTGVuZ3RoOyB4ICs9IE1hdGgubWluKHJlY3QuaGVpZ2h0LCByZWN0LndpZHRoKSAqIDAuMjV9XG4gICAgICAgIGlmIChvcmllbnQgPT0gJ2xlZnQnKSB7eCAtPSB0aWNrTGVuZ3RoOyAgeSArPSByZWN0LmhlaWdodCAqIDAuNTsgeS09IHJlY3QuaGVpZ2h0LzQgfVxuICAgICAgICBpZiAob3JpZW50ID09ICdyaWdodCcpIHt4ICs9IHRpY2tMZW5ndGg7IHkgKz0gcmVjdC5oZWlnaHQgKiAwLjU7IHktPSByZWN0LmhlaWdodC80fVxuXG4gICAgICAgIHZhclxuICAgICAgICB0ID0gJ3RyYW5zbGF0ZSgnK3grJywnK3krJyknLFxuICAgICAgICByID0gJ3JvdGF0ZSgnK3RpY2tMYWJlbFJvdGF0aW9uKycpJ1xuICAgICAgICByZXR1cm4gdCArIHJcbiAgICAgIH0pXG5cblxuICAgICAgIGlmIChndWlkZUxpbmVzUSkge1xuICAgICAgICAgdmFyIGdsaW5lID0gc2FmZVNlbGVjdCh0aGF0LCAnbGluZScsIGh5cGVuYXRlKG5hbWVzcGFjZSwgJ2d1aWRlbGluZScpKVxuICAgICAgICAgLnRyYW5zaXRpb24oKS5kdXJhdGlvbih0cmFuc2l0aW9uRHVyYXRpb24pLmVhc2UoZWFzZUZ1bmMpXG4gICAgICAgICAuYXR0cihcIngxXCIsIDApXG4gICAgICAgICAuYXR0cihcIngyXCIsIGhvcml6b250YWxRID8gMCA6IG9yaWVudCA9PSBcImxlZnRcIiA/IGd1aWRlbGluZVNwYWNlIDogLWd1aWRlbGluZVNwYWNlKVxuICAgICAgICAgLmF0dHIoXCJ5MVwiLCAwKVxuICAgICAgICAgLmF0dHIoJ3kyJywgIHZlcnRpY2FsUSA/IDAgOiBvcmllbnQgPT0gXCJ0b3BcIiA/IGd1aWRlbGluZVNwYWNlIDogLWd1aWRlbGluZVNwYWNlKVxuICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uKGQsIGkpIHtcbiAgICAgICAgICAgdmFyXG4gICAgICAgICAgIHggPSBtb3ZlWEJ5KGQsIGksIGhvcml6b250YWxRLCBjYXRlZ29yaWNhbFEsIG9iamVjdFNpemUpLFxuICAgICAgICAgICB5ID0gbW92ZVlCeShkLCBpLCB2ZXJ0aWNhbFEsIGNhdGVnb3JpY2FsUSwgb2JqZWN0U2l6ZSksXG4gICAgICAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgICAgICAgcmV0dXJuIHRcbiAgICAgICAgIH0pXG4gICAgICAgfVxuXG4gICAgfSlcblxuICAgIGlmIChndWlkZUxpbmVzUSkge1xuICAgICAgY29udGFpbmVyLnNlbGVjdEFsbCgnLicraHlwZW5hdGUobmFtZXNwYWNlLCdndWlkZWxpbmUnKSlcbiAgICAgIC5hdHRyKCdzdHJva2UnLCBmdW5jdGlvbihkLCBpKXtcbiAgICAgICAgaWYgKGkgJSAyID09IDApIHsgcmV0dXJuIG1vZGlmeUhleGlkZWNpbWFsQ29sb3JMdW1pbmFuY2UoZ3VpZGVMaW5lU3Ryb2tlLCAwLjgpIH1cbiAgICAgICAgcmV0dXJuIGd1aWRlTGluZVN0cm9rZVxuICAgICAgfSlcbiAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCBmdW5jdGlvbihkLCBpKXtcbiAgICAgICAgaWYgKGkgJSAyID09IDApIHsgcmV0dXJuIGd1aWRlTGluZVN0cm9rZVdpZHRoICowLjh9XG4gICAgICAgIHJldHVybiBndWlkZUxpbmVTdHJva2VXaWR0aFxuICAgICAgfSlcbiAgICB9XG5cblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAqKiBNYWtlIHRoZSBsaW5lIG9mIHRoZSBheGlzXG4gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuICAgIHZhciBsaW5lID0gc2FmZVNlbGVjdChzZWxlY3Rpb24sICdwYXRoJywgaHlwZW5hdGUobmFtZXNwYWNlLCdsaW5lJykpXG4gICAgLy8gLmF0dHIoJ3gxJywgMClcbiAgICAvLyAuYXR0cigneDInLCBob3Jpem9udGFsUSA/IHNwYWNlWCA6IDApXG4gICAgLy8gLmF0dHIoJ3kxJywgMClcbiAgICAvLyAuYXR0cigneTInLCBob3Jpem9udGFsUSA/IDAgOiBzcGFjZVkpXG4gICAgLmF0dHIoJ2QnLFxuICAgICAgaG9yaXpvbnRhbFFcbiAgICAgID8gJ00gMCwwIEgnICsgc3BhY2VYICsgJywwJ1xuICAgICAgOiAnTSAwLDAgViAwLCcgKyBzcGFjZVlcbiAgICApXG4gICAgLmF0dHIoJ3N0cm9rZScsIGxpbmVTdHJva2UpXG4gICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIGxpbmVTdHJva2VXaWR0aClcbiAgICAuY2xhc3NlZCgnYXhpcy1saW5lJywgdHJ1ZSlcblxuXG4gIH1cbiAgcmV0dXJuIGF4aXNcbn1cbiIsImltcG9ydCB7bW9kaWZ5SGV4aWRlY2ltYWxDb2xvckx1bWluYW5jZX0gZnJvbSAnLi9oZWxwZXJzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgY29sb3JGdW5jdGlvblxuICogQGNvbnN0cnVjdG9yIGNvbG9yRnVuY3Rpb25cbiAqIEBuYW1lc3BhY2UgY29sb3JGdW5jdGlvblxuICogQHJldHVybnMge2Z1bmN0aW9ufSBjb2xvckZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xvckZ1bmN0aW9uKCkge1xuICB2YXJcbiAgLyoqXG4gICogRGVmYXVsdCBjb2xvcnMgdG8gdXNlXG4gICogQHBhcmFtIHtudW1iZXJbXX0gW2NvbG9ycz1bXCIjMmM3YmI2XCIsIFwiIzAwYTZjYVwiLCBcIiMwMGNjYmNcIiwgXCIjOTBlYjlkXCIsIFwiI2ZmZmY4Y1wiLCBcIiNmOWQwNTdcIiwgXCIjZjI5ZTJlXCIsIFwiI2U3NjgxOFwiLCBcIiNkNzE5MWNcIl1dXG4gICogQG1lbWJlcm9mIGNvbG9yRnVuY3Rpb24jXG4gICogQHByb3BlcnR5XG4gICovXG4gIGNvbG9ycyA9IFtcIiMyYzdiYjZcIiwgXCIjMDBhNmNhXCIsIFwiIzAwY2NiY1wiLCBcIiM5MGViOWRcIiwgXCIjZmZmZjhjXCIsIFwiI2Y5ZDA1N1wiLCBcIiNmMjllMmVcIiwgXCIjZTc2ODE4XCIsIFwiI2Q3MTkxY1wiXSxcbiAgLyoqXG4gICogSW50ZXJwb2xhdG9yIGZvciBjb2xvcnNcbiAgKiBAcGFyYW0ge2QzLmludGVycG9sYXRpb259IFtpbnRlcnBvbGF0aW9uPWQzLmludGVycG9sYXRlUmdiXVxuICAqIEBtZW1iZXJvZiBjb2xvckZ1bmN0aW9uI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBpbnRlcnBvbGF0aW9uID0gZDMuaW50ZXJwb2xhdGVSZ2IsXG4gIC8qKlxuICAqIEZ1bmN0aW9uIGZvciBtb2RpZnlpbmcgY29sb3IgbHVtaW5hbmNlXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW21vZGlmeU9wYWNpdHk9bW9kaWZ5SGV4aWRlY2ltYWxDb2xvckx1bWluYW5jZV1cbiAgKiBAbWVtYmVyb2YgY29sb3JGdW5jdGlvbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgbW9kaWZ5T3BhY2l0eSA9IG1vZGlmeUhleGlkZWNpbWFsQ29sb3JMdW1pbmFuY2UsXG4gIC8qKlxuICAqIEhvdyB0byBtb2RpZnkgY29sb3IgZm9yIHN0cm9rZVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbc3Ryb2tlT3BhY2l0eT0wXVxuICAqIEBtZW1iZXJvZiBjb2xvckZ1bmN0aW9uI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzdHJva2VPcGFjaXR5ID0gMCxcbiAgLyoqXG4gICogSG93IHRvIG1vZGlmeSBjb2xvciBmb3IgZmlsbFxuICAqIEBwYXJhbSB7bnVtYmVyfSBbZmlsbE9wYWNpdHk9MC40XVxuICAqIEBtZW1iZXJvZiBjb2xvckZ1bmN0aW9uI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBmaWxsT3BhY2l0eSA9IDAuNCxcbiAgLyoqXG4gICogSG93IHRvIGRldGVybWluZSB0aGUgY29sb3IgdG8gdXNlXG4gICogQHBhcmFtIHtzdHJpbmd9IFtjb2xvckJ5PSdpbmRleCddXG4gICogQG1lbWJlcm9mIGNvbG9yRnVuY3Rpb24jXG4gICogQHByb3BlcnR5XG4gICovXG4gIGNvbG9yQnkgPSAnaW5kZXgnLFxuICAvKipcbiAgKiBTZXRzIHRoZSBzY2FsZSBmb3IgaW50ZXJwb2xhdGluZyB0aGUgY29sb3JzXG4gICogQHBhcmFtIHtudW1iZXJbXX0gW2RhdGFFeHRlbnQ9WzAsIGNvbG9ycy5sZW5ndGggLSAxXV1cbiAgKiBAbWVtYmVyb2YgY29sb3JGdW5jdGlvbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZGF0YUV4dGVudCA9IFswLCBjb2xvcnMubGVuZ3RoIC0gMV0sXG4gIC8qKlxuICAqIEV4dHJhY3RzIHRoZSB2YWx1ZSB0byBjb2xvciBieVxuICAqIEBwYXJhbSB7ZnVuY3Rpb259IFt2YWx1ZUV4dHJhY3Rvcj1mdW5jdGlvbihrLCB2LCBpKSB7cmV0dXJuIHZ9XVxuICAqIEBtZW1iZXJvZiBjb2xvckZ1bmN0aW9uI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB2YWx1ZUV4dHJhY3RvciA9IGZ1bmN0aW9uKGssIHYsIGkpIHtyZXR1cm4gdn0sXG4gIC8qKlxuICAqIFNjYWxlIGZvciBpbnRlcnBvbGF0aW5nIHRoZSBjb2xvcnNcbiAgKiBAcGFyYW0ge2QzLnNjYWxlfSBbc2NhbGU9ZDMuc2NhbGVMaW5lYXIoKV1cbiAgKiBAbWVtYmVyb2YgY29sb3JGdW5jdGlvbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc2NhbGUgPSBkMy5zY2FsZUxpbmVhcigpXG4gIC5pbnRlcnBvbGF0ZShpbnRlcnBvbGF0aW9uKS5kb21haW4oZGF0YUV4dGVudCkucmFuZ2UoY29sb3JzKSxcbiAgaGVscGVyU2NhbGUgPSBkMy5zY2FsZUxpbmVhcigpXG5cbiAgLy8gdmFyIGggPSB4ID0+ICcjJyArIHgubWF0Y2goL1xcZCsvZykubWFwKHkgPSB6ID0+ICgoK3ogPCAxNik/JzAnOicnKSArICgreikudG9TdHJpbmcoMTYpKS5qb2luKCcnKTtcbiAgdmFyIGggPSBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIFwiI1wiICsgeC5tYXRjaCgvXFxkKy9nKS5tYXAoXG4gICAgICBmdW5jdGlvbih5LCBpKSB7XG4gICAgICAgIHJldHVybiAgKCgreSA8IDE2KT8nMCc6JycpICsgKCt5KS50b1N0cmluZygxNilcbiAgICAgIH0pLmpvaW4oJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgZGVmYXVsdCBjb2xvcnNcbiAgICogKHNlZSB7QGxpbmsgY29sb3JGdW5jdGlvbiNjb2xvcnN9KVxuICAgKiBAcGFyYW0ge251bWJlcltdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Y29sb3JGdW5jdGlvbiB8IG51bWJlcltdfVxuICAgKiBAbWVtYmVyb2YgY29sb3JGdW5jdGlvblxuICAgKiBAcHJvcGVydHlcbiAgICovXG4gIGNvbG9yRnVuY3Rpb24uY29sb3JzID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgP1xuICAgICAgKFxuICAgICAgICBjb2xvcnMgPSBfLFxuICAgICAgICBzY2FsZS5yYW5nZShjb2xvcnMpLFxuICAgICAgICBjb2xvckZ1bmN0aW9uXG4gICAgICApXG4gICAgOiBjb2xvcnM7XG4gIH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGZ1bmN0aW9uIGZvciBpbnRlcnBvbGF0aW5nIHRoZSBjb2xvcnNcbiAgICogKHNlZSB7QGxpbmsgY29sb3JGdW5jdGlvbiNpbnRlcnBvbGF0aW9ufSlcbiAgICogQHBhcmFtIHtkMy5pbnRlcnBvbGF0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Y29sb3JGdW5jdGlvbiB8IGQzLmludGVycG9sYXRpb259XG4gICAqIEBtZW1iZXJvZiBjb2xvckZ1bmN0aW9uXG4gICAqIEBwcm9wZXJ0eVxuICAgKi9cbiAgY29sb3JGdW5jdGlvbi5pbnRlcnBvbGF0aW9uID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgP1xuICAgIChcbiAgICAgIGludGVycG9sYXRpb24gPSBfLFxuICAgICAgc2NhbGUuaW50ZXJwb2xhdGUoaW50ZXJwb2xhdGlvbikucmFuZ2UoY29sb3JzKSxcbiAgICAgIGNvbG9yRnVuY3Rpb25cbiAgICApXG4gICAgOiBpbnRlcnBvbGF0aW9uO1xuICB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSB2YWx1ZXMgZm9yIHRoZSBzY2FsZSB3aGljaCB0cmFuc2Zvcm1zIHRoZSB2YWx1ZSB0byBhIGNvbG9yXG4gICAqIChzZWUge0BsaW5rIGNvbG9yRnVuY3Rpb24jZGF0YUV4dGVudH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyW119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtjb2xvckZ1bmN0aW9uIHwgbnVtYmVyW119XG4gICAqIEBtZW1iZXJvZiBjb2xvckZ1bmN0aW9uXG4gICAqIEBwcm9wZXJ0eVxuICAgKi9cbiAgY29sb3JGdW5jdGlvbi5kYXRhRXh0ZW50ID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgPyAoXG4gICAgICAgIGRhdGFFeHRlbnQgPSBfLFxuICAgICAgICBzY2FsZS5kb21haW4oZGF0YUV4dGVudCkuaW50ZXJwb2xhdGUoc2NhbGUuaW50ZXJwb2xhdGUoKSksXG4gICAgICAgIGNvbG9yRnVuY3Rpb25cbiAgICAgIClcbiAgICA6IGRhdGFFeHRlbnQ7XG4gIH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHZ0aGUgc2NhbGUgd2hpY2ggdHJhbnNmb3JtcyB0aGUgdmFsdWUgdG8gYSBjb2xvclxuICAgKiAoc2VlIHtAbGluayBjb2xvckZ1bmN0aW9uI3NjYWxlfSlcbiAgICogQHBhcmFtIHtkMy5zY2FsZX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2NvbG9yRnVuY3Rpb24gfCBkMy5zY2FsZX1cbiAgICogQG1lbWJlcm9mIGNvbG9yRnVuY3Rpb25cbiAgICogQHByb3BlcnR5XG4gICAqL1xuICBjb2xvckZ1bmN0aW9uLnNjYWxlID0gZnVuY3Rpb24oXykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgPyAoXG4gICAgICAgIF8gPSBfLmRvbWFpbihzY2FsZS5kb21haW4oKSkuaW50ZXJwb2xhdGUoc2NhbGUuaW50ZXJwb2xhdGUoKSkucmFuZ2Uoc2NhbGUucmFuZ2UoKSksXG4gICAgICAgIHNjYWxlID0gXyxcbiAgICAgICAgY29sb3JGdW5jdGlvblxuICAgICAgKVxuICAgIDogc2NhbGU7XG4gIH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGZ1bmN0aW9uIGZvciBtb2RpZnkgb3BhY2l0eVxuICAgKiAoc2VlIHtAbGluayBjb2xvckZ1bmN0aW9uI21vZGlmeU9wYWNpdHl9KVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Y29sb3JGdW5jdGlvbiB8IGZ1bmN0aW9ufVxuICAgKiBAbWVtYmVyb2YgY29sb3JGdW5jdGlvblxuICAgKiBAcHJvcGVydHlcbiAgICovXG4gIGNvbG9yRnVuY3Rpb24ubW9kaWZ5T3BhY2l0eSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobW9kaWZ5T3BhY2l0eSA9IF8sIGNvbG9yRnVuY3Rpb24pIDogbW9kaWZ5T3BhY2l0eTsgfTtcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgdmFsdWUgdG8gbW9kaWZ5IHRoZSBjb2xvciBmb3IgdGhlIHN0cm9rZSB2aWEge0BsaW5rIGNvbG9yRnVuY3Rpb24jbW9kaWZ5T3BhY2l0eX1cbiAgICogKHNlZSB7QGxpbmsgY29sb3JGdW5jdGlvbiNzdHJva2VPcGFjaXR5fSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtjb2xvckZ1bmN0aW9uIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgY29sb3JGdW5jdGlvblxuICAgKiBAcHJvcGVydHlcbiAgICovXG4gIGNvbG9yRnVuY3Rpb24uc3Ryb2tlT3BhY2l0eSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3Ryb2tlT3BhY2l0eSA9IF8sIGNvbG9yRnVuY3Rpb24pIDogc3Ryb2tlT3BhY2l0eTsgfTtcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgdmFsdWUgdG8gbW9kaWZ5IHRoZSBjb2xvciBmb3IgdGhlIHN0cm9rZSB2aWEge0BsaW5rIGNvbG9yRnVuY3Rpb24jZmlsbE9wYWNpdHl9XG4gICAqIChzZWUge0BsaW5rIGNvbG9yRnVuY3Rpb24jZmlsbE9wYWNpdHl9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2NvbG9yRnVuY3Rpb24gfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBjb2xvckZ1bmN0aW9uXG4gICAqIEBwcm9wZXJ0eVxuICAgKi9cbiAgY29sb3JGdW5jdGlvbi5maWxsT3BhY2l0eSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZmlsbE9wYWNpdHkgPSBfLCBjb2xvckZ1bmN0aW9uKSA6IGZpbGxPcGFjaXR5OyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSB2YWx1ZSB0byBjb2xvckJ5XG4gICAqIChzZWUge0BsaW5rIGNvbG9yRnVuY3Rpb24jY29sb3JCeX0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Y29sb3JGdW5jdGlvbiB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGNvbG9yRnVuY3Rpb25cbiAgICogQHByb3BlcnR5XG4gICAqL1xuICBjb2xvckZ1bmN0aW9uLmNvbG9yQnkgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNvbG9yQnkgPSBfLCBjb2xvckZ1bmN0aW9uKSA6IGNvbG9yQnk7IH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHZhbHVlIG9mIHZhbHVlRXh0cmFjdG9yXG4gICAqIChzZWUge0BsaW5rIGNvbG9yRnVuY3Rpb24jdmFsdWVFeHRyYWN0b3J9KVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Y29sb3JGdW5jdGlvbiB8IGZ1bmN0aW9ufVxuICAgKiBAbWVtYmVyb2YgY29sb3JGdW5jdGlvblxuICAgKiBAcHJvcGVydHlcbiAgICovXG4gIGNvbG9yRnVuY3Rpb24udmFsdWVFeHRyYWN0b3IgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZhbHVlRXh0cmFjdG9yID0gXywgY29sb3JGdW5jdGlvbikgOiB2YWx1ZUV4dHJhY3RvcjsgfTtcblxuICBmdW5jdGlvbiBjb2xvckZ1bmN0aW9uKGtleSwgdmFsdWUsIGluZGV4LCB0eXBlLCBob3ZlclEpIHtcbiAgICB2YXIgYyxcbiAgICBvcGFjID0gdHlwZSA9PSBcImZpbGxcIiA/IGZpbGxPcGFjaXR5IDogc3Ryb2tlT3BhY2l0eTtcbiAgICB1cGRhdGVTY2FsZSgpXG5cbiAgICBpZiAoY29sb3JCeSA9PSBcImluZGV4XCIpIHtcbiAgICAgIGMgPSAodHlwZSAhPSB1bmRlZmluZWQpID8gbW9kaWZ5T3BhY2l0eShoKHNjYWxlKGluZGV4KSksIG9wYWMpIDogaChzY2FsZShpbmRleCkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB2ID0gdmFsdWVFeHRyYWN0b3Ioa2V5LCB2YWx1ZSwgaW5kZXgpO1xuICAgICAgYyA9ICh0eXBlICE9IHVuZGVmaW5lZCkgPyBtb2RpZnlPcGFjaXR5KGgoc2NhbGUodikpLCBvcGFjKSA6IGgoc2NhbGUodikpXG4gICAgfVxuICAgIHJldHVybiBjXG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVTY2FsZSgpe1xuICAgIGhlbHBlclNjYWxlLmRvbWFpbihbMCwgY29sb3JzLmxlbmd0aF0pLnJhbmdlKGRhdGFFeHRlbnQpXG4gICAgdmFyIGEgPSBBcnJheShjb2xvcnMubGVuZ3RoKS5maWxsKDApLm1hcChmdW5jdGlvbihkLCBpKXsgcmV0dXJuIGhlbHBlclNjYWxlKGkpIH0pXG4gICAgc2NhbGUuZG9tYWluKGEpXG4gIH1cblxuICByZXR1cm4gY29sb3JGdW5jdGlvblxufVxuIiwiaW1wb3J0IHtzYWZlU2VsZWN0LCByb3VuZH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7bG9nLCB3YXJuLCBpbmZvLCBlcnJvciwgY29uc29sZUdyb3VwLCBjb25zb2xlR3JvdXBFbmR9IGZyb20gJy4vdXRpbHMnO1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT09MVElQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKlxuICogUHJvZHVjZXMgYSBmdW5jdGlvbiBmb3IgaGFuZGxpbmcgdGhlIHRvb2x0aXBcbiAqXG4gKiB7QGxpbmsgaHR0cHM6Ly9zdW1uZXVyb24uZ2l0bGFiLmlvL2Qzc20vZGVtb3MvdG9vbHRpcC1kZXNpZ24vaW5kZXguaHRtbCBEZW1vfVxuICogQHBhcmFtIHtkMy5zZWxlY3Rpb259IHNlbGVjdGlvblxuICogQHJldHVybnMge3Rvb2x0aXB9XG4gKiBAbmFtZXNwYWNlIHRvb2x0aXBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvb2x0aXAoIHNlbGVjdGlvbiApIHtcblxuICB2YXJcbiAga2V5cyxcbiAgdmFsdWVzLFxuICBoZWFkZXIsXG4gIGRhdGEsXG4gIHNlbGVjdGlvblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUga2V5cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHRvb2x0aXAuXG4gICAqIElmIG5vdCBzZXQsIHVzZXMgZDMua2V5cyhkYXRhW2tleV0pXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt0b29sdGlwIHwgc3RyaW5nW119XG4gICAqIEBtZW1iZXJvZiB0b29sdGlwXG4gICAqL1xuICB0b29sdGlwLmtleXMgPSBmdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChrZXlzID0gXywgdG9vbHRpcCkgOiBrZXlzfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB2YWx1ZXMgdG8gYmUgZGlzcGxheWVkIG5leHQgdG8gdGhlIGtleXMuXG4gICAqIElmIG5vdCBzZXQsIHVzZXMgZGF0YVtrZXldW2tleXNbaV1dLlxuICAgKiBJZiBhIGZ1bmN0aW9uLCBnZXRzIHBhc3NlZCBjdXJyZW50RGF0YSAoZGF0YVtrZXldKSBhbmQga2V5c1tpXS5cbiAgICogQHBhcmFtIHsqW119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt0b29sdGlwIHwgKltdfVxuICAgKiBAbWVtYmVyb2YgdG9vbHRpcFxuICAgKi9cbiAgdG9vbHRpcC52YWx1ZXMgPSBmdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2YWx1ZXMgPSBfLCB0b29sdGlwKSA6IHZhbHVlc307XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgaGVhZGVyIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgdG9vbHRpcC5cbiAgICogSWYgbm90IHNldCwgdXNlcyBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt0b29sdGlwIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgdG9vbHRpcFxuICAgKi9cbiAgdG9vbHRpcC5oZWFkZXIgPSBmdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChoZWFkZXIgPSBfLCB0b29sdGlwKSA6IGhlYWRlcn07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgZGF0YSAob3ZlciB0aGUgc2VsZWN0aW9uKSB0byBiZSB1c2VkIGZvciB0aGUgdG9vbHRpcFxuICAgKiBAcGFyYW0ge09iamVjdH0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Rvb2x0aXAgfCBPYmplY3R9XG4gICAqIEBtZW1iZXJvZiB0b29sdGlwXG4gICAqL1xuICB0b29sdGlwLmRhdGEgPSBmdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkYXRhID0gXywgdG9vbHRpcCkgOiBkYXRhfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBzZWxlY3Rpb24gZm9yIHRoZSB0b29sdGlwIHRvIGJlIGFwcGxpZWQgb25cbiAgICogQHBhcmFtIHtkMy5zZWxlY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt0b29sdGlwIHwgZDMuc2VsZWN0aW9ufVxuICAgKiBAbWVtYmVyb2YgdG9vbHRpcFxuICAgKi9cbiAgdG9vbHRpcC5zZWxlY3Rpb24gPSBmdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzZWxlY3Rpb24gPSBfLCB0b29sdGlwKSA6IHNlbGVjdGlvbn07XG5cbiAgLyoqXG4gICAqIEJpbmQsIHZpYSBzZWxlY3Rpb24ub24oKSwgdGhlIG1vdXNlbW92ZSBhbmQgbW91c2VvdXQgZXZlbnRzXG4gICAqIEByZXR1cm5zIHVuZGVmaW5lZFxuICAgKi9cbiAgZnVuY3Rpb24gdG9vbHRpcCggKSB7XG4gICAgc2VsZWN0aW9uLm9uKCdtb3VzZW1vdmUnLCBtb3VzZW1vdmUpXG4gICAgc2VsZWN0aW9uLm9uKCdtb3VzZW91dCcsIGZ1bmN0aW9uKCl7IGQzLnNlbGVjdEFsbChcIi5kM3NtLXRvb2x0aXBcIikucmVtb3ZlKCl9KVxuICB9XG5cblxuICAvKipcbiAgICogUHJvZHVjZXMgdGhlIHRvb2x0aXAgb24gbW91c2Vtb3ZlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgb2YgdGhlIG9iamVjdCB0YXJnZXRlZCBieSB0aGUgbW91c2Vtb3ZlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpIChpbmRleCkgb2YgdGhlIG9iamVjdCB0YXJnZXRlZCBieSBtb3VzZW1vdmVcbiAgICogQG1lbWJlcm9mIHRvb2x0aXBcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGZ1bmN0aW9uIG1vdXNlbW92ZShrZXksIGkpIHtcbiAgICBjb25zb2xlR3JvdXAoJ2Qzc20tdG9vbHRpcCcpXG4gICAgdmFyIGN1cnJlbnREYXRhID0gZGF0YVtrZXldXG5cbiAgICB2YXIgW3gsIHldID0gZDMubW91c2UoZDMuc2VsZWN0KFwiaHRtbFwiKS5ub2RlKCkpXG4gICAgbG9nKCd0b29sdGlwJywgJ21vdXNlbW92ZSBkZXRlY3RlZCcse2tleToga2V5LCBpbmRleDogaSwgeDp4LCB5Onl9KVxuICAgIGxvZygndG9vbHRpcCcsICdjdXJyZW50IGRhdGEnLCBjdXJyZW50RGF0YSlcblxuICAgIHZhciBkaXYgPSBzYWZlU2VsZWN0KGQzLnNlbGVjdCgnaHRtbCcpLCAndG9vbHRpcCcsICdkM3NtLXRvb2x0aXAnKVxuICAgIC5jbGFzc2VkKCdjYXJkJywgdHJ1ZSlcbiAgICAuc3R5bGUoJ21heC13aWR0aCcsICczMDBweCcpXG4gICAgLnN0eWxlKCdiYWNrZ3JvdW5kLWNvbG9yJywgXCIjMjEyNTI5XCIpXG4gICAgLnN0eWxlKCdjb2xvcicsICd3aGl0ZScpXG5cbiAgICBkaXYuc3R5bGUoJ3Bvc2l0aW9uJykgPT0gXCJyZWxhdGl2ZVwiXG4gICAgPyBkaXYuc3R5bGUoJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJykuc3R5bGUoJ2xlZnQnLCB4KzE1KydweCcpLnN0eWxlKCd0b3AnLCB5KydweCcpXG4gICAgOiBkaXYudHJhbnNpdGlvbigpLmR1cmF0aW9uKDIwMCkuZWFzZShkMy5lYXNlU2luKS5zdHlsZSgnbGVmdCcsIHgrMTUrJ3B4Jykuc3R5bGUoJ3RvcCcsIHkrJ3B4JylcblxuICAgIHZhciBjYXJkQm9keSA9IHNhZmVTZWxlY3QoZGl2LCAnZGl2JywgJ2NhcmQtYm9keScpXG4gICAgdmFyIGNhcmRUaXRsZSA9IHNhZmVTZWxlY3QoY2FyZEJvZHksICdoNScsICdjYXJkLXRpdGxlJylcbiAgICAudGV4dChoZWFkZXIgPT0gdW5kZWZpbmVkID8ga2V5IDogdHlwZW9mIGhlYWRlciA9PSAnZnVuY3Rpb24nID8gaGVhZGVyKGtleSwgaSkgOiBoZWFkZXIpXG4gICAgLnN0eWxlKCdjb2xvcicsICdjeWFuJylcblxuXG4gICAgdmFyIHRhYmxlID0gc2FmZVNlbGVjdChjYXJkQm9keSwgJ3RhYmxlJywgJ3RhYmxlJykuY2xhc3NlZCgndGFibGUtZGFyaycsIHRydWUpXG4gICAgdmFyIHRCb2R5ID0gc2FmZVNlbGVjdCh0YWJsZSwgJ3Rib2R5JylcblxuICAgIHRCb2R5ID0gdEJvZHkuc2VsZWN0QWxsKCd0cicpXG4gICAgdEJvZHk9IHRCb2R5LmRhdGEoa2V5cyA9PSB1bmRlZmluZWQgPyBkMy5rZXlzKGN1cnJlbnREYXRhKToga2V5cylcbiAgICB0Qm9keS5leGl0KCkucmVtb3ZlKClcblxuICAgIHZhciB0ciA9IHRCb2R5LmVudGVyKCkuYXBwZW5kKCd0cicpXG4gICAgdHIuYXBwZW5kKCd0ZCcpLmF0dHIoJ2NsYXNzJywgZnVuY3Rpb24oZCwgaSl7cmV0dXJuICd0b29sdGlwLWtleSd9KVxuICAgIHRyLmFwcGVuZCgndGQnKS5hdHRyKCdjbGFzcycsICBmdW5jdGlvbihkLCBpLCBqKXtyZXR1cm4gJ3Rvb2x0aXAtdmFsdWUnfSlcblxuICAgIC8vIHRCb2R5ID0gdEJvZHkubWVyZ2UodHIpXG4gICAgY29uc29sZUdyb3VwKCd0b29sdGlwLXJvd3MnKVxuICAgIHRCb2R5LnNlbGVjdEFsbCgnLnRvb2x0aXAta2V5JykudGV4dChmdW5jdGlvbihkLCBpKXtyZXR1cm4gZH0pXG4gICAgdEJvZHkuc2VsZWN0QWxsKCd0ciAudG9vbHRpcC12YWx1ZScpXG4gICAgLnRleHQoZnVuY3Rpb24oZCwgaSl7XG4gICAgICBsb2coJ3Rvb2x0aXAnLCAndHJ5aW5nIHRvIHNldCB2YWx1ZScsIHtyb3dLZXk6IGQsIHJvd0luZGV4OiBpfSlcblxuICAgICAgdmFyIHYgPSBjdXJyZW50RGF0YVtkXTtcblxuICAgICAgaWYgKHZhbHVlcyAhPSB1bmRlZmluZWQpIHt2ID0gdmFsdWVzW2ldOyBpZih0eXBlb2YgdiA9PSBcImZ1bmN0aW9uXCIpIHt2ID0gdihjdXJyZW50RGF0YSwgZCl9fVxuICAgICAgcmV0dXJuICB0eXBlb2YgdiA9PSAnbnVtYmVyJyA/IHJvdW5kKHYsIDUpIDogdlxuICAgIH0pXG4gICAgY29uc29sZUdyb3VwRW5kKClcbiAgICBjb25zb2xlR3JvdXBFbmQoKVxuICB9XG5cbiAgcmV0dXJuIHRvb2x0aXBcbn1cbiIsImltcG9ydCB7aHlwZW5hdGUsIHNhZmVTZWxlY3R9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQge3NldHVwQ29udGFpbmVyLCBjYWxjdWxhdGVXaWR0aE9mT2JqZWN0LCBjYWxjdWxhdGVXaWR0aE9mU3BhY2VyfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7dW5pcXVlLCBmbGF0dGVufSBmcm9tICcuL2FycmF5LWZ1bmN0aW9ucyc7XG5pbXBvcnQge2dyb3VwaW5nU3BhY2VyfSBmcm9tICcuL2dyb3VwaW5nLXNwYWNlcic7XG5pbXBvcnQge2NvbG9yRnVuY3Rpb24gYXMgQ0Z9IGZyb20gJy4vY29sb3ItZnVuY3Rpb24nO1xuaW1wb3J0IHt0b29sdGlwIGFzIFRUaXB9IGZyb20gJy4vdG9vbHRpcCc7XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vKipcbiAqIENyZWF0ZXMgYSBiYXJcbiAqXG4gKiB7QGxpbmsgaHR0cHM6Ly9zdW1uZXVyb24uZ2l0bGFiLmlvL2Qzc20vZGVtb3MvYmFyLWNoYXJ0LXNhbWUtZGF0YS1jb21wbGV4LWdyb3VwaW5nL2luZGV4Lmh0bWwgRGVtb31cbiAqIEBjb25zdHJ1Y3RvciBiYXJcbiAqIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBzZWxlY3Rpb25cbiAqIEBuYW1lc3BhY2UgYmFyXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259IGJhclxuICovXG5leHBvcnQgZnVuY3Rpb24gYmFyICggc2VsZWN0aW9uICkge1xuICAvKlxuICBBc3N1bWVzIHRoYXQgZGF0YSBpcyBsaXN0IGFuIG9iamVjdC5cblxuICBUaGUga2V5cyBvZiBkYXRhIHdpbGwgYmUgYm91bmQgdG8gdGhlIGJhcnMuXG4gIFRoZSB2YWx1ZUV4dHJhY3RvciBmdW5jdGlvbiB3aWxsIGV4dHJhY3QgdGhlIHZhbHVlIGZyb20gZGF0YVtrZXldLlxuXG4gIEdyb3VwaW5nIGNhbiBiZSB1c2VkIGlmIGRlc2lyZWQuIEl0IHNob3VsZCBiZSBhbiBhcmJpdHJhcnkgY29tcGxleCBsaXN0IHdoZXJlXG4gIHRoZSB2YWx1ZXMgYXJlIHN0cmluZ3MgbWF0Y2hpbmcga2V5cyBpbiBkYXRhLlxuICAqL1xuICB2YXJcbiAgLyoqXG4gICogRGF0YSB0byBwbG90LiBBc3N1bWVkIHRvIGJlIGEgb2JqZWN0LCB3aGVyZSBlYWNoIGtleSBjb3JyZXNwb25kcyB0byBhIGJhclxuICAqIChzZWUge0BsaW5rIGJhciNkYXRhfSlcbiAgKiBAcGFyYW0ge09iamVjdH0gW2RhdGE9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGRhdGEsXG4gIC8qKlxuICAqIFdoaWNoIGRpcmVjdGlvbiB0byByZW5kZXIgdGhlIGJhcnMgaW5cbiAgKiAoc2VlIHtAbGluayBiYXIjb3JpZW50fSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW29yaWVudD0naG9yaXpvbnRhbCddXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb3JpZW50PSdob3Jpem9udGFsJyxcbiAgLyoqXG4gICogQW1vdW50IG9mIGhvcml6b250YWwgc3BhY2UgKGluIHBpeGVscykgYXZhaWJsZSB0byByZW5kZXIgdGhlIGJhciBpblxuICAqIChzZWUge0BsaW5rIGJhciNzcGFjZVh9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbc3BhY2VYPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzcGFjZVgsXG4gIC8qKlxuICAqIEFtb3VudCBvZiB2ZXJ0aWNhbCBzcGFjZSAoaW4gcGl4ZWxzKSBhdmFpYmxlIHRvIHJlbmRlciB0aGUgYmFyIGluXG4gICogKHNlZSB7QGxpbmsgYmFyLnNwYWNlWX0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZVk9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNwYWNlWSxcblxuICAvKipcbiAgKiBXaGV0aGVyIG9yIG5vdCB0byBhbGxvdyBiYXIgdG8gcmVuZGVyIGVsZW1lbnRzIHBhc3MgdGhlIG1haW4gc3BhdGlhbCBkaW1lbnNpb25cbiAgKiBnaXZlbiB0aGUgb3JpZW50YXRpb24gKHNlZSB7QGxpbmsgYmFyI29yaWVudH0pLCB3aGVyZSB7QGxpbmsgYmFyI29yaWVudH09XCJob3Jpem9udGFsXCJcbiAgKiB0aGUgbWFpbiBkaW1lbnNpb24gaXMge0BsaW5rIGJhciNzcGFjZVh9IGFuZCB3aGVyZSB7QGxpbmsgYmFyI29yaWVudH09XCJ2ZXJ0aWNhbFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBiYXIjc3BhY2VZfVxuICAqIEBwYXJhbSB7Ym9vbGVhbn0gW292ZXJmbG93UT1mYWxzZV1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBvdmVyZmxvd1EgPSBmYWxzZSxcblxuICAvKipcbiAgKiBBbiBhcnJheSAtIHB1dGF0aXZlbHkgb2Ygb3RoZXIgYXJyYXlzIC0gZGVwaWN0aW5nIGhvdyBiYXJzIHNob3VsZCBiZSBhcnJhbmdlZFxuICAqIEBwYXJhbSB7QXJyYXlbXX0gW2dyb3VwaW5nPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBncm91cGluZyxcblxuICAvKipcbiAgKiBIb3cgdG8gZ2V0IHRoZSB2YWx1ZSBvZiB0aGUgYmFyXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW3ZhbHVlRXh0cmFjdG9yPWZ1bmN0aW9uKGtleSwgaW5kZXgpIHsgcmV0dXJuIGRhdGFba2V5XSB9XVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHZhbHVlRXh0cmFjdG9yID0gZnVuY3Rpb24oa2V5LCBpbmRleCkgeyByZXR1cm4gZGF0YVtrZXldIH0sXG4gIC8qKlxuICAqIEhvdyB0byBzb3J0IHRoZSBiYXJzIC0gaWYge0BsaW5rIGJhciNncm91cGluZ30gaXMgbm90IHByb3ZpZGVkLlxuICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtzb3J0aW5nRnVuY3Rpb249ZnVuY3Rpb24oa2V5QSwga2V5Qikge3JldHVybiBkMy5kZXNjZW5kaW5nKGRhdGFba2V5QV0sIGRhdGFba2V5Ql0pfV1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzb3J0aW5nRnVuY3Rpb24gPSBmdW5jdGlvbihrZXlBLCBrZXlCKSB7cmV0dXJuIGQzLmRlc2NlbmRpbmcoZGF0YVtrZXlBXSwgZGF0YVtrZXlCXSl9LFxuXG4gIC8qKlxuICAqIFRoZSBzY2FsZSBmb3Igd2hpY2ggYmFyIHZhbHVlcyBzaG91bGQgYmUgdHJhbnNmb3JtZWQgYnlcbiAgKiBAcGFyYW0ge2QzLnNjYWxlfSBbc2NhbGU9ZDMuc2NhbGVMaW5lYXJdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc2NhbGUgPSBkMy5zY2FsZUxpbmVhcigpLFxuICAvKipcbiAgKiBUaGUgcGFkZGluZyBmb3IgdGhlIGRvbWFpbiBvZiB0aGUgc2NhbGUgKHNlZSB7QGxpbmsgYmFyI3NjYWxlfSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW2RvbWFpblBhZGRpbmc9MC41XVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGRvbWFpblBhZGRpbmcgPSAwLjUsXG5cbiAgLyoqXG4gICogRGVmYXVsdCBzcGFjZSBmb3IgdGhlIHNwYWNlciAocGVyY2VudGFnZSkgb2YgbWFpbiBkaW1lbnNpb24gZ2l2ZW4gdGhlIG9yaWVudGF0aW9uXG4gICogKHNlZSB7QGxpbmsgYmFyI29yaWVudH0pLCB3aGVyZSB7QGxpbmsgYmFyI29yaWVudH09XCJob3Jpem9udGFsXCJcbiAgKiB0aGUgbWFpbiBkaW1lbnNpb24gaXMge0BsaW5rIGJhciNzcGFjZVh9IGFuZCB3aGVyZSB7QGxpbmsgYmFyI29yaWVudH09XCJ2ZXJ0aWNhbFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBiYXIjc3BhY2VZfSBiZXR3ZWVuIGJhcnNcbiAgKiBAcGFyYW0ge251bWJlcn0gW29iamVjdFNwYWNlcj0wLjA1XVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG9iamVjdFNwYWNlciA9IDAuMDUsXG4gIC8qKlxuICAqIFRoZSBtaW5pbXVtIHNpemUgdGhhdCBhbiBvYmplY3QgY2FuIGJlXG4gICogQHBhcmFtIHtudW1iZXJ9IFttaW5PYmplY3RTaXplPTUwXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG1pbk9iamVjdFNpemUgPSA1MCxcbiAgLyoqXG4gICogVGhlIG1heGltdW0gc2l6ZSB0aGF0IGFuIG9iamVjdCBjYW4gYmVcbiAgKiBAcGFyYW0ge251bWJlcn0gW21heE9iamVjdFNpemU9MTAwXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG1heE9iamVjdFNpemUgPSAxMDAsXG5cbiAgLyoqXG4gICogVGhlIHN0cm9rZSB3aWR0aCBvZiB0aGUgYmFyc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbYmFyU3Ryb2tlV2lkdGg9Ml1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBiYXJTdHJva2VXaWR0aCA9IDIsXG4gIC8qKlxuICAqIEluc3RhbmNlIG9mIENvbG9yRnVuY3Rpb25cbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbY29sb3JGdW5jdGlvbiA9IGNvbG9yRnVuY3Rpb24oKV1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBjb2xvckZ1bmN0aW9uID0gQ0YoKSxcblxuXG4gIC8qKlxuICAqIENvbG9yIG9mIHRoZSBiYWNrZ3JvdW5kXG4gICogQHBhcmFtIHtzdHJpbmd9IFtiYWNrZ3JvdW5kRmlsbD1cInRyYW5zcGFyZW50XCJdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgYmFja2dyb3VuZEZpbGwgPSAndHJhbnNwYXJlbnQnLFxuICAvKipcbiAgKiBOYW1lc3BhY2UgZm9yIGFsbCBpdGVtcyBtYWRlIGJ5IHRoaXMgaW5zdGFuY2Ugb2YgYmFyXG4gICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lc3BhY2U9XCJkM3NtLWJhclwiXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG5hbWVzcGFjZSA9ICdkM3NtLWJhcicsXG4gIC8qKlxuICAqIENsYXNzIG5hbWUgZm9yIGJhciBjb250YWluZXIgKDxnPiBlbGVtZW50KVxuICAqIEBwYXJhbSB7c3RyaW5nfSBbb2JqZWN0Q2xhc3M9XCJiYXJcIl1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBvYmplY3RDbGFzcyA9ICdiYXInLFxuXG4gIC8qKlxuICAqIER1cmF0aW9uIG9mIGFsbCB0cmFuc2l0aW9ucyBvZiB0aGlzIGVsZW1lbnRcbiAgKiBAcGFyYW0ge251bWJlcn0gW3RyYW5zaXRpb25EdXJhdGlvbj0xMDAwXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHRyYW5zaXRpb25EdXJhdGlvbiA9IDEwMDAsXG4gIC8qKlxuICAqIEVhc2luZyBmdW5jdGlvbiBmb3IgdHJhbnNpdGlvbnNcbiAgKiBAcGFyYW0ge2QzLmVhc2V9IFtlYXNlRnVuYz1kMy5lYXNlRXhwXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGVhc2VGdW5jID0gZDMuZWFzZUV4cCxcblxuICAvLyB1c2VmdWwgdmFsdWVzIHRvIGV4dHJhY3QgdG8gcHJldmVudCByZS1jYWxjdWxhdGlvblxuICAvKipcbiAgKiBUaGUga2V5cyBvZiB0aGUgYmFyc1xuICAqIEBwYXJhbSB7c3RyaW5nW119IFtiYXJLZXlzPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBiYXJLZXlzLFxuICAvKipcbiAgKiBUaGUgdmFsdWVzIG9mIHRoZSBiYXJzXG4gICogQHBhcmFtIHtudW1iZXJbXX0gW2JhclZhbHVlcz11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgYmFyVmFsdWVzLFxuICAvKipcbiAgKiBUaGUgb2JqZWN0U2l6ZSAoYWN0dWFsIHdpZHRoKSB1c2VkIGJ5IHRoZSBiYXJzXG4gICogQHBhcmFtIHtudW1iZXJ9IFtvYmplY3RTaXplPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBvYmplY3RTaXplLFxuICAvKipcbiAgKiBUaGUgc3BhY2VyU2l6ZSAoYWN0dWFsIHdpZHRoKSB1c2VkIGJ5IHRoZSBzcGFjZXJzIGJldHdlZW4gdGhlIGJhcnNcbiAgKiBAcGFyYW0ge251bWJlcn0gW3NwYWNlclNpemU9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNwYWNlclNpemUsXG4gIC8qKlxuICAqIEluc3RhbmNlIG9mIFRvb2x0aXBcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbdG9vbHRpcD10b29sdGlwKCldXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdG9vbHRpcCA9IFRUaXAoKVxuXG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHNlbGVjdGlvbiBpbiB3aGljaCBpdGVtcyBhcmUgbWFuaXB1bGF0ZWRcbiAgICogQHBhcmFtIHtkMy5zZWxlY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtiYXIgfCBkMy5zZWxlY3Rpb259XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc2VsZWN0aW9uID0gc2VsZWN0aW9uXG4gICAqL1xuICBiYXIuc2VsZWN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzZWxlY3Rpb24gPSBfLCBiYXIpIDogc2VsZWN0aW9uOyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBkYXRhXG4gICAqIChzZWUge0BsaW5rIGJhciNkYXRhfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtiYXIgfCBvYmplY3R9XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqL1xuICBiYXIuZGF0YSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZGF0YSA9IF8sIGJhcikgOiBkYXRhOyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBvcmllbnQgb2YgdGhlIGJhcnNcbiAgICogKHNlZSB7QGxpbmsgYmFyI29yaWVudH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YmFyIHwgb2JqZWN0fVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKi9cbiAgYmFyLm9yaWVudCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob3JpZW50ID0gXywgYmFyKSA6IG9yaWVudDsgfTtcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgYW1vdW50IG9mIGhvcml6b250YWwgc3BhY2UgaW4gd2hpY2ggaXRlbXMgYXJlIG1hbmlwdWxhdGVkXG4gICAqIChzZWUge0BsaW5rIGJhciNzcGFjZVh9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV0gc2hvdWxkIGJlIGEgbnVtYmVyID4gMFxuICAgKiBAcmV0dXJucyB7YmFyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNwYWNlWCA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYmFyLnNwYWNlWCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3BhY2VYID0gXywgYmFyKSA6IHNwYWNlWDsgfTtcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgYW1vdW50IG9mIHZlcnRpY2FsIHNwYWNlIGluIHdoaWNoIGl0ZW1zIGFyZSBtYW5pcHVsYXRlZFxuICAgKiAoc2VlIHtAbGluayBiYXIjc3BhY2VZfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdIHNob3VsZCBiZSBhIG51bWJlciA+IDBcbiAgICogQHJldHVybnMge2JhciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJhclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzcGFjZVkgPSB1bmRlZmluZWRcbiAgICovXG4gIGJhci5zcGFjZVkgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNwYWNlWSA9IF8sIGJhcikgOiBzcGFjZVk7IH07XG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHdoZXRoZXIgb3Igbm90IGJhciBpcyBhbGxvd2VkIHRvIGdvIGJleW9uZCBzcGVjaWZpZWQgZGltZW5zaW9uc1xuICAgKiAoc2VlIHtAbGluayBiYXIjc3BhY2VYfSlcbiAgICogQHBhcmFtIHtib29sZWFufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YmFyIHwgYm9vbGVhbn1cbiAgICogQG1lbWJlcm9mIGJhclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvdmVyZmxvd1EgPSBmYWxzZVxuICAgKi9cbiAgYmFyLm92ZXJmbG93USA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob3ZlcmZsb3dRID0gXywgYmFyKSA6IG92ZXJmbG93UTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBncm91cGluZyBvZiB0aGUgYmFyc1xuICAgKiAoc2VlIHtAbGluayBiYXIjZ3JvdXBpbmd9KVxuICAgKiBAcGFyYW0ge0FycmF5W119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtiYXIgfCBBcnJheVtdfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGdyb3VwaW5nID0gdW5kZWZpbmVkXG4gICAqL1xuICBiYXIuZ3JvdXBpbmcgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGdyb3VwaW5nID0gXywgYmFyKSA6IGdyb3VwaW5nOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHZhbHVlRXh0cmFjdG9yXG4gICAqIChzZWUge0BsaW5rIGJhciN2YWx1ZUV4dHJhY3Rvcn0pXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtiYXIgfCBmdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIGJhclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB2YWx1ZUV4dHJhY3RvciA9IGZ1bmN0aW9uKGtleSwgaW5kZXgpIHsgcmV0dXJuIGRhdGFba2V5XSB9LFxuICAgKi9cbiAgYmFyLnZhbHVlRXh0cmFjdG9yID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2YWx1ZUV4dHJhY3RvciA9IF8sIGJhcikgOiB2YWx1ZUV4dHJhY3RvcjsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBzb3J0aW5nRnVuY3Rpb25cbiAgICogKHNlZSB7QGxpbmsgYmFyI3NvcnRpbmdGdW5jdGlvbn0pXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtiYXIgfCBmdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIGJhclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzb3J0aW5nRnVuY3Rpb24gPSBmdW5jdGlvbihrZXlBLCBrZXlCKSB7cmV0dXJuIGQzLmRlc2NlbmRpbmcoZGF0YVtrZXlBXSwgZGF0YVtrZXlCXSl9LFxuICAgKi9cbiAgYmFyLnNvcnRpbmdGdW5jdGlvbiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc29ydGluZ0Z1bmN0aW9uID0gXywgYmFyKSA6IHNvcnRpbmdGdW5jdGlvbjsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBzY2FsZSBmb3Igd2hpY2ggdGhlIGJhciB2YWx1ZXMgc2hvdWxkIGJlIHRyYW5zZm9ybWVkIGJ5XG4gICAqIChzZWUge0BsaW5rIGJhciNzY2FsZX0pXG4gICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtiYXIgfCBkMy5zY2FsZX1cbiAgICogQG1lbWJlcm9mIGJhclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzY2FsZSA9IGQzLnNjYWxlTGluZWFyKClcbiAgICovXG4gIGJhci5zY2FsZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2NhbGUgPSBfLCBiYXIpIDogc2NhbGU7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgcGFkZGluZyBmb3IgdGhlIGRvbWFpbiBvZiB0aGUgc2NhbGVcbiAgICogKHNlZSB7QGxpbmsgYmFyI2RvbWFpblBhZGRpbmd9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJhclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBkb21haW5QYWRkaW5nID0gMC41XG4gICAqL1xuICBiYXIuZG9tYWluUGFkZGluZyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluUGFkZGluZyA9IF8sIGJhcikgOiBkb21haW5QYWRkaW5nOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgb2JqZWN0U3BhY2VyXG4gICAqIChzZWUge0BsaW5rIGJhciNvYmplY3RTcGFjZXJ9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJhclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvYmplY3RTcGFjZXIgPSAwLjA1XG4gICAqL1xuICBiYXIub2JqZWN0U3BhY2VyID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvYmplY3RTcGFjZXIgPSBfLCBiYXIpIDogb2JqZWN0U3BhY2VyOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG1pbk9iamVjdFNpemVcbiAgICogKHNlZSB7QGxpbmsgYmFyI21pbk9iamVjdFNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJhclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBtaW5PYmplY3RTaXplID0gNTBcbiAgICovXG4gIGJhci5taW5PYmplY3RTaXplID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChtaW5PYmplY3RTaXplID0gXywgYmFyKSA6IG1pbk9iamVjdFNpemU7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbWF4T2JqZWN0U2l6ZVxuICAgKiAoc2VlIHtAbGluayBiYXIjbWF4T2JqZWN0U2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YmFyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG1heE9iamVjdFNpemUgPSAxMDBcbiAgICovXG4gIGJhci5tYXhPYmplY3RTaXplID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChtYXhPYmplY3RTaXplID0gXywgYmFyKSA6IG1heE9iamVjdFNpemU7IH07XG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBiYXJTdHJva2VXaWR0aFxuICAgKiAoc2VlIHtAbGluayBiYXIjYmFyU3Ryb2tlV2lkdGh9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJhclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBiYXJTdHJva2VXaWR0aCA9IDJcbiAgICovXG4gIGJhci5iYXJTdHJva2VXaWR0aCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYmFyU3Ryb2tlV2lkdGggPSBfLCBiYXIpIDogYmFyU3Ryb2tlV2lkdGg7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgY29sb3JGdW5jdGlvblxuICAgKiAoc2VlIHtAbGluayBiYXIjY29sb3JGdW5jdGlvbn0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YmFyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGNvbG9yRnVuY3Rpb24gPSBjb2xvckZ1bmN0aW9uKClcbiAgICovXG4gIGJhci5jb2xvckZ1bmN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjb2xvckZ1bmN0aW9uID0gXywgYmFyKSA6IGNvbG9yRnVuY3Rpb247IH07XG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBiYWNrZ3JvdW5kRmlsbFxuICAgKiAoc2VlIHtAbGluayBiYXIjYmFja2dyb3VuZEZpbGx9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGJhclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBiYWNrZ3JvdW5kRmlsbCA9ICd0cmFuc3BhcmVudCdcbiAgICovXG4gIGJhci5iYWNrZ3JvdW5kRmlsbCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYmFja2dyb3VuZEZpbGwgPSBfLCBiYXIpIDogYmFja2dyb3VuZEZpbGw7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbmFtZXNwYWNlXG4gICAqIChzZWUge0BsaW5rIGJhciNuYW1lc3BhY2V9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGJhclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBuYW1lc3BhY2UgPSAnZDNzbS1iYXInXG4gICAqL1xuICBiYXIubmFtZXNwYWNlID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChuYW1lc3BhY2UgPSBfLCBiYXIpIDogbmFtZXNwYWNlOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG9iamVjdENsYXNzXG4gICAqIChzZWUge0BsaW5rIGJhciNvYmplY3RDbGFzc30pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YmFyIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG9iamVjdENsYXNzID0gJ3RpY2stZ3JvdXAnXG4gICAqL1xuICBiYXIub2JqZWN0Q2xhc3MgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9iamVjdENsYXNzID0gXywgYmFyKSA6IG9iamVjdENsYXNzOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRyYW5zaXRpb25EdXJhdGlvblxuICAgKiAoc2VlIHtAbGluayBiYXIjdHJhbnNpdGlvbkR1cmF0aW9ufSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtiYXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdHJhbnNpdGlvbkR1cmF0aW9uID0gMTAwMFxuICAgKi9cbiAgYmFyLnRyYW5zaXRpb25EdXJhdGlvbiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodHJhbnNpdGlvbkR1cmF0aW9uID0gXywgYmFyKSA6IHRyYW5zaXRpb25EdXJhdGlvbjsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBlYXNlRnVuY1xuICAgKiAoc2VlIHtAbGluayBiYXIjZWFzZUZ1bmN9KVxuICAgKiBAcGFyYW0ge2QzLmVhc2V9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtiYXIgfCBkMy5lYXNlfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGVhc2VGdW5jID0gZDMuZWFzZUV4cFxuICAgKi9cbiAgYmFyLmVhc2VGdW5jID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChlYXNlRnVuYyA9IF8sIGJhcikgOiBlYXNlRnVuYzsgfTtcblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgYmFyS2V5c1xuICAgKiAoc2VlIHtAbGluayBiYXIjYmFyS2V5c30pXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtiYXIgfCBzdHJpbmdbXX1cbiAgICogQG1lbWJlcm9mIGJhclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBiYXJLZXlzID0gdW5kZWZpbmVkXG4gICAqL1xuICBiYXIuYmFyS2V5cyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYmFyS2V5cyA9IF8sIGJhcikgOiBiYXJLZXlzOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGJhclZhbHVlc1xuICAgKiAoc2VlIHtAbGluayBiYXIjYmFyVmFsdWVzfSlcbiAgICogQHBhcmFtIHtudW1iZXJbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IG51bWJlcltdfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGJhclZhbHVlcyA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYmFyLmJhclZhbHVlcyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYmFyVmFsdWVzID0gXywgYmFyKSA6IGJhclZhbHVlczsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBvYmplY3RTaXplXG4gICAqIChzZWUge0BsaW5rIGJhciNvYmplY3RTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtiYXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgb2JqZWN0U2l6ZSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYmFyLm9iamVjdFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9iamVjdFNpemUgPSBfLCBiYXIpIDogb2JqZWN0U2l6ZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBzcGFjZXJTaXplXG4gICAqIChzZWUge0BsaW5rIGJhciNzcGFjZXJTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtiYXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc3BhY2VyU2l6ZSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYmFyLnNwYWNlclNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNwYWNlclNpemUgPSBfLCBiYXIpIDogc3BhY2VyU2l6ZTsgfTtcblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRvb2x0aXBcbiAgICogKHNlZSB7QGxpbmsgYmFyI3Rvb2x0aXB9KVxuICAgKiBAcGFyYW0ge3Rvb2x0aXB9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtiYXIgfCB0b29sdGlwfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHRvb2x0aXAgPSB0b29sdGlwKClcbiAgICovXG4gIGJhci50b29sdGlwID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0b29sdGlwID0gXywgYmFyKSA6IHRvb2x0aXA7IH07XG5cblxuICBmdW5jdGlvbiBiYXIoKSB7XG4gICAgLy8gZm9yIGNvbnZlbmllbmNlIGluIGhhbmRsaW5nIG9yaWVudGF0aW9uIHNwZWNpZmljIHZhbHVlc1xuICAgIHZhciBob3Jpem9udGFsUSA9IChvcmllbnQgPT0gJ2hvcml6b250YWwnKSA/IHRydWUgOiBmYWxzZVxuICAgIHZhciB2ZXJ0aWNhbFEgPSAhaG9yaXpvbnRhbFFcblxuICAgIC8vIGJhY2tncm91bmQgY2xpcGluZyByZWN0YW5nbGVcbiAgICB2YXIgYmdjcFJlY3QgPSB7eDowLCB5OjAsIHdpZHRoOiBzcGFjZVgsIGhlaWdodDpzcGFjZVl9XG4gICAgdmFyIGNvbnRhaW5lciA9IHNldHVwQ29udGFpbmVyKCBzZWxlY3Rpb24sIG5hbWVzcGFjZSwgYmdjcFJlY3QsIGJhY2tncm91bmRGaWxsICk7XG5cbiAgICAvLyB0byBwcmV2ZW50IHJlLWNhbGN1bGF0aW9uIGFuZCBnZXR0ZXJzIHRvIGJlIHBhc3NlZCB0byBheGVzXG4gICAgYmFyS2V5cyA9IGQzLmtleXMoZGF0YSlcbiAgICBiYXJWYWx1ZXMgPSBiYXJLZXlzLm1hcCh2YWx1ZUV4dHJhY3RvcilcblxuICAgIC8vIGlmIGdyb3VwaW5nIGlzIHVuZGVmaW5lZCBzb3J0IGJhcktleXMgYnkgc29ydGluZ0Z1bmN0aW9uXG4gICAgdmFyIG9yZGVyZWQgPSAoZ3JvdXBpbmcgPT0gdW5kZWZpbmVkKSA/IGJhcktleXMuc29ydChzb3J0aW5nRnVuY3Rpb24pIDogZ3JvdXBpbmdcbiAgICAvLyBvcmRlcmVkIG1pZ2h0IGJlIG5lc3RlZCBkZXBlbmRpbmcgb24gZ3JvdXBpbmdcbiAgICBiYXJLZXlzID0gZmxhdHRlbihvcmRlcmVkKVxuXG4gICAgdmFyIG51bWJlck9mT2JqZWN0cyA9IGJhcktleXMubGVuZ3RoXG4gICAgdmFyIGV4dGVudCA9IFtNYXRoLm1pbiguLi5iYXJWYWx1ZXMpIC0gZG9tYWluUGFkZGluZyxNYXRoLm1heCguLi5iYXJWYWx1ZXMpICsgZG9tYWluUGFkZGluZ107XG5cblxuXG4gICAgLy8gc2V0IHRoZSBzY2FsZVxuICAgIHNjYWxlLmRvbWFpbihleHRlbnQpLnJhbmdlKGhvcml6b250YWxRID8gWzAsc3BhY2VZXSA6IFtzcGFjZVgsIDBdKVxuICAgIHZhciBzcGFjZSA9IGhvcml6b250YWxRID8gc3BhY2VYIDogc3BhY2VZXG4gICAgLy8gY2FsY3VsYXRlIG9iamVjdCBzaXplXG4gICAgb2JqZWN0U2l6ZSA9IGNhbGN1bGF0ZVdpZHRoT2ZPYmplY3Qoc3BhY2UsIG51bWJlck9mT2JqZWN0cywgbWluT2JqZWN0U2l6ZSwgbWF4T2JqZWN0U2l6ZSwgb2JqZWN0U3BhY2VyLCBvdmVyZmxvd1EpXG4gICAgLy8gY2FsY3VsYXRlIHNwYWNlciBzaXplIGlmIG5lZWRlZFxuICAgIHNwYWNlclNpemUgPSBjYWxjdWxhdGVXaWR0aE9mU3BhY2VyKGJhcktleXMsIHNwYWNlLCBvYmplY3RTaXplLCBudW1iZXJPZk9iamVjdHMsIG9iamVjdFNwYWNlciwgb3ZlcmZsb3dRKVxuICAgIC8vIG1ha2UgdGhlIG5lc3RlZCBncm91cHNcbiAgICB2YXIgc3BhY2VyRnVuY3Rpb24gPSBncm91cGluZ1NwYWNlcigpXG4gICAgLmhvcml6b250YWxRKGhvcml6b250YWxRKS5zY2FsZShzY2FsZSkubW92ZWJ5KCdjYXRlZ29yeScpLm51bWJlck9mT2JqZWN0cyhudW1iZXJPZk9iamVjdHMpXG4gICAgLm9iamVjdENsYXNzKG9iamVjdENsYXNzKS5vYmplY3RTaXplKG9iamVjdFNpemUpLnNwYWNlclNpemUoc3BhY2VyU2l6ZSlcbiAgICAudHJhbnNpdGlvbkR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuZWFzZUZ1bmMoZWFzZUZ1bmMpXG4gICAgLm5hbWVzcGFjZShuYW1lc3BhY2UpXG4gICAgLy8gc2FmZSBkZWZhdWx0IGZ1bmN0aW9uXG4gICAgdmFyIGRlZmF1bHRFeGl0ID0gc3BhY2VyRnVuY3Rpb24uZXhpdEZ1bmN0aW9uKClcblxuICAgIHNwYWNlckZ1bmN0aW9uLmV4aXRGdW5jdGlvbihmdW5jdGlvbihzZWwpe1xuICAgICAgLy8gdXNlIGRlZmF1bHQgdG8gbW92ZSBvYmplY3RzIG9mZiBzY3JlZW5cbiAgICAgIGRlZmF1bHRFeGl0KHNlbClcbiAgICAgIC8vIHNocmluayByZWN0YW5nbGVzIGluIGFkZGl0aW9uXG4gICAgICBzZWwuc2VsZWN0QWxsKCcqID4gcmVjdCcpXG4gICAgICAudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbilcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbihkLCBpKSB7XG4gICAgICAgIHZhclxuICAgICAgICB4ID0gaG9yaXpvbnRhbFEgPyAwIDogMCxcbiAgICAgICAgeSA9IHZlcnRpY2FsUSA/IDAgOiBzY2FsZShleHRlbnRbMV0pLFxuICAgICAgICB0ID0gJ3RyYW5zbGF0ZSgnK3grJywnK3krJyknXG4gICAgICAgIHJldHVybiB0XG4gICAgICB9KVxuICAgICAgLmF0dHIoJ3dpZHRoJywgaG9yaXpvbnRhbFEgPyBvYmplY3RTaXplIDogMClcbiAgICAgIC5hdHRyKCdoZWlnaHQnLCB2ZXJ0aWNhbFEgPyBvYmplY3RTaXplIDogMCkucmVtb3ZlKClcbiAgICB9KVxuXG4gICAgLy8gbW92ZSBzdHVmZlxuICAgIHNwYWNlckZ1bmN0aW9uKGNvbnRhaW5lciwgb3JkZXJlZCwgMClcblxuXG5cblxuICAgIHZhciBwYXJlbnRJbmRleEFycmF5ID0gW11cbiAgICBjb250YWluZXIuc2VsZWN0QWxsKCdnOm5vdCgudG8tcmVtb3ZlKS4nK29iamVjdENsYXNzKVxuICAgIC5lYWNoKGZ1bmN0aW9uKGQsIGkpe3BhcmVudEluZGV4QXJyYXkucHVzaChOdW1iZXIoZDMuc2VsZWN0KHRoaXMpLmF0dHIoJ3BhcmVudC1pbmRleCcpKSl9KVxuXG5cbiAgICBjb2xvckZ1bmN0aW9uID0gY29sb3JGdW5jdGlvbi5jb2xvckJ5KCkgPT0gJ2luZGV4J1xuICAgID8gY29sb3JGdW5jdGlvbi5kYXRhRXh0ZW50KFswLCBNYXRoLm1heCguLi5wYXJlbnRJbmRleEFycmF5KV0pXG4gICAgOiBjb2xvckZ1bmN0aW9uLmRhdGFFeHRlbnQoZXh0ZW50KVxuXG5cblxuICAgIGNvbnRhaW5lci5zZWxlY3RBbGwoJ2c6bm90KC50by1yZW1vdmUpLicrb2JqZWN0Q2xhc3MpLmVhY2goZnVuY3Rpb24oa2V5LCBpKSB7XG4gICAgICB2YXIgdCA9IGQzLnNlbGVjdCh0aGlzKSxcbiAgICAgIGN1cnJlbnREYXRhID0gZGF0YVtrZXldLFxuICAgICAgdmFsdWUgPSB2YWx1ZUV4dHJhY3RvcihrZXksIGkpLFxuICAgICAgaSA9IHQuYXR0cigncGFyZW50LWluZGV4JykgPT0gdW5kZWZpbmVkID8gaSA6IHQuYXR0cigncGFyZW50LWluZGV4JyksXG4gICAgICBmaWxsQ29sb3IgPSBjb2xvckZ1bmN0aW9uKGtleSwgdmFsdWUsIGksICdmaWxsJyksIC8vIHByZXZlbnQgZHVwbGljYXRlIGNvbXB1dGF0aW9uXG4gICAgICBzdHJva2VDb2xvciA9IGNvbG9yRnVuY3Rpb24oa2V5LCB2YWx1ZSwgaSwgICdzdHJva2UnKVxuXG5cbiAgICAgIHZhciBiYXIgPSBzYWZlU2VsZWN0KHQsICdyZWN0JywgJ2Jhci1yZWN0JylcblxuICAgICAgaWYgKGJhci5hdHRyKCd0cmFuc2Zvcm0nKSA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYmFyLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uKGQsIGkpIHtcbiAgICAgICAgICB2YXJcbiAgICAgICAgICB4ID0gaG9yaXpvbnRhbFEgPyAwIDogMCxcbiAgICAgICAgICB5ID0gdmVydGljYWxRID8gMCA6IHNjYWxlKGV4dGVudFsxXSksXG4gICAgICAgICAgdCA9ICd0cmFuc2xhdGUoJyt4KycsJyt5KycpJ1xuICAgICAgICAgIHJldHVybiB0XG4gICAgICAgIH0pXG4gICAgICAgIC5hdHRyKCd3aWR0aCcsIGhvcml6b250YWxRID8gb2JqZWN0U2l6ZSA6IDApXG4gICAgICAgIC5hdHRyKCdoZWlnaHQnLCB2ZXJ0aWNhbFEgPyBvYmplY3RTaXplIDogMClcbiAgICAgIH1cblxuXG4gICAgICBiYXIudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuZWFzZShlYXNlRnVuYylcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbihkLCBpKSB7XG4gICAgICAgIHZhclxuICAgICAgICB4ID0gaG9yaXpvbnRhbFEgPyAwIDogMCxcbiAgICAgICAgeSA9IHZlcnRpY2FsUSA/IDAgOiBzY2FsZShleHRlbnRbMV0pIC0gc2NhbGUodmFsdWUpLFxuICAgICAgICB0ID0gJ3RyYW5zbGF0ZSgnK3grJywnK3krJyknXG4gICAgICAgIHJldHVybiB0XG4gICAgICB9KVxuICAgICAgLmF0dHIoJ3dpZHRoJywgaG9yaXpvbnRhbFEgPyBvYmplY3RTaXplIDogc2NhbGUodmFsdWUpKVxuICAgICAgLmF0dHIoJ2hlaWdodCcsIHZlcnRpY2FsUSA/IG9iamVjdFNpemUgOiBzY2FsZSh2YWx1ZSkpXG4gICAgICAuYXR0cignZmlsbCcsIGZpbGxDb2xvcilcbiAgICAgIC5hdHRyKCdzdHJva2UnLCBzdHJva2VDb2xvcilcbiAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCBiYXJTdHJva2VXaWR0aClcblxuXG5cbiAgICAgIHQub24oJ21vdXNlb3ZlcicsIGZ1bmN0aW9uKGQsIGkpe1xuICAgICAgICBjb250YWluZXIuc2VsZWN0QWxsKCdnLicrb2JqZWN0Q2xhc3MpLnN0eWxlKCdvcGFjaXR5JywgMC4yKVxuICAgICAgICB0LnN0eWxlKCdvcGFjaXR5JywgMSlcbiAgICAgICAgYmFyLmF0dHIoJ3N0cm9rZS13aWR0aCcsYmFyU3Ryb2tlV2lkdGgqMilcblxuICAgICAgfSlcbiAgICAgIHQub24oJ21vdXNlb3V0JywgZnVuY3Rpb24oKXtcbiAgICAgICAgY29udGFpbmVyLnNlbGVjdEFsbCgnZy4nK29iamVjdENsYXNzKS5zdHlsZSgnb3BhY2l0eScsIDEpXG4gICAgICAgIGJhci5hdHRyKCdzdHJva2Utd2lkdGgnLCBiYXJTdHJva2VXaWR0aClcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHRvb2x0aXAuc2VsZWN0aW9uKGNvbnRhaW5lci5zZWxlY3RBbGwoJy5iYXItcmVjdCcpKVxuICAgIC5kYXRhKGRhdGEpXG5cbiAgICB0b29sdGlwKClcblxuICB9XG4gIHJldHVybiBiYXJcbn1cbiIsImltcG9ydCB7aHlwZW5hdGUsIHNhZmVTZWxlY3R9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQge3NldHVwQ29udGFpbmVyLCBjYWxjdWxhdGVXaWR0aE9mT2JqZWN0LCBjYWxjdWxhdGVXaWR0aE9mU3BhY2VyLCBsb2d9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHt1bmlxdWV9IGZyb20gJy4vYXJyYXktZnVuY3Rpb25zJztcbmltcG9ydCB7Z3JvdXBpbmdTcGFjZXJ9IGZyb20gJy4vZ3JvdXBpbmctc3BhY2VyJztcbmltcG9ydCB7Y29sb3JGdW5jdGlvbiBhcyBDRn0gZnJvbSAnLi9jb2xvci1mdW5jdGlvbic7XG5pbXBvcnQge3Rvb2x0aXAgYXMgVFRpcH0gZnJvbSAnLi90b29sdGlwJztcblxuXG4vKipcbiAqIENyZWF0ZXMgYSBidWJibGVIZWF0bWFwXG4gKlxuICoge0BsaW5rIGh0dHBzOi8vc3VtbmV1cm9uLmdpdGxhYi5pby9kM3NtL2RlbW9zL2J1YmJsZS1oZWF0bWFwL2luZGV4Lmh0bWwgRGVtb31cbiAqIEBjb25zdHJ1Y3RvciBidWJibGVIZWF0bWFwXG4gKiBAcGFyYW0ge2QzLnNlbGVjdGlvbn0gc2VsZWN0aW9uXG4gKiBAbmFtZXNwYWNlIGJ1YmJsZUhlYXRtYXBcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gYnViYmxlSGVhdG1hcFxuICovXG5mdW5jdGlvbiBidWJibGVIZWF0bWFwKCBzZWxlY3Rpb24gKSB7XG4gIHZhclxuICAvKipcbiAgKiBEYXRhIHRvIHBsb3QuIEFzc3VtZWQgdG8gYmUgYSBvYmplY3QsIHdoZXJlIGVhY2gga2V5IGNvcnJlc3BvbmRzIHRvIGEgY2VsbFxuICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjZGF0YX0pXG4gICogQHBhcmFtIHtPYmplY3R9IFtkYXRhPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZGF0YSxcblxuICAvKipcbiAgKiBBbW91bnQgb2YgaG9yaXpvbnRhbCBzcGFjZSAoaW4gcGl4ZWxzKSBhdmFpYmxlIHRvIHJlbmRlciB0aGUgYnViYmxlSGVhdG1hcCBpblxuICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjc3BhY2VYfSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW3NwYWNlWD11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNwYWNlWCxcbiAgLyoqXG4gICogQW1vdW50IG9mIHZlcnRpY2FsIHNwYWNlIChpbiBwaXhlbHMpIGF2YWlibGUgdG8gcmVuZGVyIHRoZSBidWJibGVIZWF0bWFwIGluXG4gICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcC5zcGFjZVl9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbc3BhY2VZPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc3BhY2VZLFxuXG4gIC8qKlxuICAqIFRoZSBpbnRlcm5hbCBrZXkgb2YgdGhlIGNlbGwgc3BlY2lmaXlpbmcgdG8gd2hpY2ggeCBheGlzIGtleSBpdCBiZWxvbmdzXG4gICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcC54S2V5fSlcbiAgKiBAcGFyYW0ge3N0cmluZ30gW3hLZXk9J3gnXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB4S2V5ID0gJ3gnLFxuICAvKipcbiAgKiBUaGUgaW50ZXJuYWwga2V5IG9mIHRoZSBjZWxsIHNwZWNpZml5aW5nIHRvIHdoaWNoIHkgYXhpcyBrZXkgaXQgYmVsb25nc1xuICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAueUtleX0pXG4gICogQHBhcmFtIHtzdHJpbmd9IFt5S2V5PSd5J11cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgeUtleSA9ICd5JyxcbiAgLyoqXG4gICogVGhlIGludGVybmFsIGtleSBvZiB0aGUgY2VsbCBzcGVjaWZpeWluZyB3aGF0IHZhbHVlIHRvIHVzZSB0byBkZXRlcm1pbmUgdGhlIHJhZGl1c1xuICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAucktleX0pXG4gICogQHBhcmFtIHtzdHJpbmd9IFtyS2V5PSdyJ11cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgcktleSA9ICdyJyxcbiAgLyoqXG4gICogVGhlIGludGVybmFsIGtleSBvZiB0aGUgY2VsbCBzcGVjaWZpeWluZyB3aGF0IHZhbHVlIHRvIHVzZSB0byBkZXRlcm1pbmUgdGhlIGNvbG9yXG4gICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcC52S2V5fSlcbiAgKiBAcGFyYW0ge3N0cmluZ30gW3ZLZXk9J3YnXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB2S2V5ID0gJ3YnLFxuXG4gIC8qKlxuICAqIEZ1bmN0aW9uIGZvciBleHRyYWN0aW5nIHRoZSB0aGUgdmFsdWUgZnJvbSB4S2V5LlxuICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAueEV4dHJhY3Rvcn0pXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW3hFeHRyYWN0b3I9ZnVuY3Rpb24oa2V5LCBpKSB7IHJldHVybiBkYXRhW2tleV1beEtleV0gfV1cbiAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB4RXh0cmFjdG9yID0gZnVuY3Rpb24oa2V5LCBpKSB7cmV0dXJuIGRhdGFba2V5XVt4S2V5XSB9LFxuICAvKipcbiAgKiBGdW5jdGlvbiBmb3IgZXh0cmFjdGluZyB0aGUgdGhlIHZhbHVlIGZyb20geUtleS5cbiAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwLnlFeHRyYWN0b3J9KVxuICAqIEBwYXJhbSB7ZnVuY3Rpb259IFt5RXh0cmFjdG9yPWZ1bmN0aW9uKGtleSwgaSkgeyByZXR1cm4gZGF0YVtrZXldW3lLZXldIH1dXG4gICogQHJldHVybnMge3N0cmluZ31cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgeUV4dHJhY3RvciA9IGZ1bmN0aW9uKGtleSwgaSkgeyByZXR1cm4gZGF0YVtrZXldW3lLZXldIH0sXG4gIC8qKlxuICAqIEZ1bmN0aW9uIGZvciBleHRyYWN0aW5nIHRoZSB0aGUgdmFsdWUgZnJvbSByS2V5LlxuICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAuckV4dHJhY3Rvcn0pXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW3JFeHRyYWN0b3I9ZnVuY3Rpb24oa2V5LCBpKSB7IHJldHVybiBkYXRhW2tleV1bcktleV0gfV1cbiAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICByRXh0cmFjdG9yID0gZnVuY3Rpb24oa2V5LCBpKSB7IHJldHVybiBkYXRhW2tleV1bcktleV0gfSxcbiAgLyoqXG4gICogRnVuY3Rpb24gZm9yIGV4dHJhY3RpbmcgdGhlIHRoZSB2YWx1ZSBmcm9tIHZLZXkuXG4gICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcC52RXh0cmFjdG9yfSlcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbdkV4dHJhY3Rvcj1mdW5jdGlvbihrZXksIGkpIHsgcmV0dXJuIGRhdGFba2V5XVt2S2V5XSB9XVxuICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHZFeHRyYWN0b3IgPSBmdW5jdGlvbihrZXksIGkpIHsgcmV0dXJuIGRhdGFba2V5XVt2S2V5XSB9LFxuXG5cbiAgLyoqXG4gICogV2hldGhlciBvciBub3QgdG8gYWxsb3cgYnViYmxlSGVhdG1hcCB0byByZW5kZXIgZWxlbWVudHMgcGFzcyB0aGUgbWFpbiBzcGF0aWFsIGRpbWVuc2lvblxuICAqIGdpdmVuIHRoZSBvcmllbnRhdGlvbiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI29yaWVudH0pLCB3aGVyZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNvcmllbnR9PVwiYm90dG9tXCIgb3Ige0BsaW5rIGJ1YmJsZUhlYXRtYXAjb3JpZW50fT1cInRvcFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBidWJibGVIZWF0bWFwI3NwYWNlWH0gYW5kIHdoZXJlIHtAbGluayBidWJibGVIZWF0bWFwI29yaWVudH09XCJsZWZ0XCIgb3Ige0BsaW5rIGJ1YmJsZUhlYXRtYXAjb3JpZW50fT1cInJpZ2h0XCJcbiAgKiB0aGUgbWFpbiBkaW1lbnNpb24gaXMge0BsaW5rIGJ1YmJsZUhlYXRtYXAjc3BhY2VZfVxuICAqIEBwYXJhbSB7Ym9vbGVhbn0gW292ZXJmbG93UT1mYWxzZV1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb3ZlcmZsb3dRID0gZmFsc2UsXG5cbiAgLyoqXG4gICogVGhlIHNjYWxlIGZvciB3aGljaCB0aGUgcmFkaXVzIHZhbHVlcyBzaG91bGQgYmUgdHJhbnNmb3JtZWQgYnlcbiAgKiBAcGFyYW0ge2QzLnNjYWxlfSBbc2NhbGU9ZDMuc2NhbGVMaW5lYXJdXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKSxcbiAgLyoqXG4gICogVGhlIHBhZGRpbmcgZm9yIHRoZSBkb21haW4gb2YgdGhlIHNjYWxlIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjc2NhbGV9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbZG9tYWluUGFkZGluZz0wLjVdXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGRvbWFpblBhZGRpbmcgPSAwLjUsXG5cbiAgLyoqXG4gICogRGVmYXVsdCBzcGFjZSBmb3IgdGhlIHNwYWNlciAocGVyY2VudGFnZSkgb2YgbWFpbiBkaW1lbnNpb24gZ2l2ZW4gdGhlIG9yaWVudGF0aW9uXG4gICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNvcmllbnR9KSwgd2hlcmUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjb3JpZW50fT1cImhvcml6b250YWxcIlxuICAqIHRoZSBtYWluIGRpbWVuc2lvbiBpcyB7QGxpbmsgYnViYmxlSGVhdG1hcCNzcGFjZVh9IGFuZCB3aGVyZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNvcmllbnR9PVwidmVydGljYWxcIlxuICAqIHRoZSBtYWluIGRpbWVuc2lvbiBpcyB7QGxpbmsgYnViYmxlSGVhdG1hcCNzcGFjZVl9IGJldHdlZW4gYnViYmxlc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbb2JqZWN0U3BhY2VyPTAuMF1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb2JqZWN0U3BhY2VyID0gMC4wLFxuICAvKipcbiAgKiBUaGUgbWluaW11bSBzaXplIHRoYXQgYW4gb2JqZWN0IGNhbiBiZVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbbWluT2JqZWN0U2l6ZT01MF1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgbWluT2JqZWN0U2l6ZSA9IDUwLFxuICAvKipcbiAgKiBUaGUgbWF4aW11bSBzaXplIHRoYXQgYW4gb2JqZWN0IGNhbiBiZVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4T2JqZWN0U2l6ZT0xMDBdXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG1heE9iamVjdFNpemUgPSAxMDAsXG5cblxuICAvKipcbiAgKiBUaGUgc3Ryb2tlIHdpZHRoIG9mIHRoZSBidWJibGVzXG4gICogQHBhcmFtIHtudW1iZXJ9IFtidWJibGVTdHJva2VXaWR0aD0yXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBidWJibGVTdHJva2VXaWR0aCA9IDIsXG4gIC8vIGNvbG9yRnVuYyA9IGNvbG9yRnVuY3Rpb24oKSxcblxuICAvKipcbiAgKiBDb2xvciBvZiB0aGUgYmFja2dyb3VuZFxuICAqIEBwYXJhbSB7c3RyaW5nfSBbYmFja2dyb3VuZEZpbGw9XCJ0cmFuc3BhcmVudFwiXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBiYWNrZ3JvdW5kRmlsbCA9ICd0cmFuc3BhcmVudCcsXG4gIC8qKlxuICAqIE5hbWVzcGFjZSBmb3IgYWxsIGl0ZW1zIG1hZGUgYnkgdGhpcyBpbnN0YW5jZSBvZiBidWJibGVIZWF0bWFwXG4gICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lc3BhY2U9XCJkM3NtLWJ1YmJsZVwiXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBuYW1lc3BhY2UgPSAnZDNzbS1idWJibGUnLFxuICAvKipcbiAgKiBDbGFzcyBuYW1lIGZvciBidWJibGUgY29udGFpbmVyICg8Zz4gZWxlbWVudClcbiAgKiBAcGFyYW0ge3N0cmluZ30gW29iamVjdENsYXNzPVwiYnViYmxlXCJdXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG9iamVjdENsYXNzID0gJ2J1YmJsZScsXG4gIC8qKlxuICAqIER1cmF0aW9uIG9mIGFsbCB0cmFuc2l0aW9ucyBvZiB0aGlzIGVsZW1lbnRcbiAgKiBAcGFyYW0ge251bWJlcn0gW3RyYW5zaXRpb25EdXJhdGlvbj0xMDAwXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB0cmFuc2l0aW9uRHVyYXRpb24gPSAxMDAwLFxuICAvKipcbiAgKiBFYXNpbmcgZnVuY3Rpb24gZm9yIHRyYW5zaXRpb25zXG4gICogQHBhcmFtIHtkMy5lYXNlfSBbZWFzZUZ1bmM9ZDMuZWFzZUV4cF1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZWFzZUZ1bmMgPSBkMy5lYXNlRXhwLFxuXG4gIC8qKlxuICAqIFN0b3JlcyB0aGUga2V5cyBvZiBhbGwgdGhlIGNlbGxzXG4gICogQ2FsY3VsYXRlZCBhZnRlciBidWJibGVIZWF0bWFwIGNhbGxlZC5cbiAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbY2VsbEtleXM9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBjZWxsS2V5cyxcbiAgLyoqXG4gICogU3RvcmVzIHRoZSBsaXN0IG9mIHVuaXF1ZSB4VmFsdWVzXG4gICogQ2FsY3VsYXRlZCBhZnRlciBidWJibGVIZWF0bWFwIGNhbGxlZC5cbiAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbeFZhbHVlcz11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHhWYWx1ZXMsXG4gIC8qKlxuICAqIFN0b3JlcyB0aGUgbGlzdCBvZiB1bmlxdWUgeVZhbHVlc1xuICAqIENhbGN1bGF0ZWQgYWZ0ZXIgYnViYmxlSGVhdG1hcCBjYWxsZWQuXG4gICogQHBhcmFtIHtzdHJpbmdbXX0gW3lWYWx1ZXM9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB5VmFsdWVzLFxuICAvKipcbiAgKiBTdG9yZXMgdGhlIGxpc3Qgb2YgdW5pcXVlIHJWYWx1ZXNcbiAgKiBDYWxjdWxhdGVkIGFmdGVyIGJ1YmJsZUhlYXRtYXAgY2FsbGVkLlxuICAqIEBwYXJhbSB7c3RyaW5nW119IFtyVmFsdWVzPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgclZhbHVlcyxcbiAgLyoqXG4gICogU3RvcmVzIHRoZSBsaXN0IG9mIHVuaXF1ZSB2VmFsdWVzXG4gICogQ2FsY3VsYXRlZCBhZnRlciBidWJibGVIZWF0bWFwIGNhbGxlZC5cbiAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbdlZhbHVlcz11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHZWYWx1ZXMsXG5cbiAgeEtleVNvcnRpbmdGdW5jdGlvbiA9IGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIHhFeHRyYWN0b3IoYSkgLSB4RXh0cmFjdG9yKGIpIH0sXG4gIHlLZXlTb3J0aW5nRnVuY3Rpb24gPSBmdW5jdGlvbihhLCBiKSB7IHJldHVybiB5RXh0cmFjdG9yKGEpIC0geUV4dHJhY3RvcihiKSB9LFxuICByS2V5U29ydGluZ0Z1bmN0aW9uID0gZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gckV4dHJhY3RvcihhKSAtIHJFeHRyYWN0b3IoYikgfSxcbiAgdktleVNvcnRpbmdGdW5jdGlvbiA9IGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIHZFeHRyYWN0b3IoYSkgLSB2RXh0cmFjdG9yKGIpIH0sXG5cbiAgLyoqXG4gICogSW5zdGFuY2Ugb2YgQ29sb3JGdW5jdGlvbiB3aXRoIC5jb2xvckJ5IHNldCB0byAnY2F0ZWdvcnknXG4gICogQGZ1bmN0aW9uIGNvbG9yRnVuY3Rpb25cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgY29sb3JGdW5jdGlvbiA9IENGKCkuY29sb3JCeSgnY2F0ZWdvcnknKSxcbiAgLyoqXG4gICogSW5zdGFuY2Ugb2YgVG9vbHRpcFxuICAqIEBmdW5jdGlvbiB0b29sdGlwXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHRvb2x0aXAgPSBUVGlwKCksXG5cbiAgLyoqXG4gICogc3RvcmUgdGhlIHNpemUgdGhlIGJ1YmJsZSBjb3VsZCBiZSBpbiB0aGUgeCBkaW1lbnNpb25cbiAgKiB0aGUgYWN0dWFsbCBzaXplIG9mIHRoZSBidWJibGUgd2lsbCBiZSB0aGUgbWluIG9mIHhTaXplIGFuZCB7QGxpbmsgYnViYmxlSGVhdG1hcCN5U2l6ZX1cbiAgKiBDYWxjdWxhdGVkIGFmdGVyIGJ1YmJsZUhlYXRtYXAgY2FsbGVkLlxuICAqIEBwYXJhbSB7c3RyaW5nW119IFt4U2l6ZT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHhTaXplLFxuICAvKipcbiAgKiBzdG9yZSB0aGUgc2l6ZSBvZiB0aGUgc3BhY2VyIGluIHRoZSB4IGRpbWVuc2lvblxuICAqIENhbGN1bGF0ZWQgYWZ0ZXIgYnViYmxlSGVhdG1hcCBjYWxsZWQuXG4gICogQHBhcmFtIHtzdHJpbmdbXX0gW3hTcGFjZXJTaXplPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgeFNwYWNlclNpemUsXG5cbiAgLyoqXG4gICogc3RvcmUgdGhlIHNpemUgdGhlIGJ1YmJsZSBjb3VsZCBiZSBpbiB0aGUgeSBkaW1lbnNpb25cbiAgKiB0aGUgYWN0dWFsbCBzaXplIG9mIHRoZSBidWJibGUgd2lsbCBiZSB0aGUgbWluIG9mIHhTaXplIGFuZCB7QGxpbmsgYnViYmxlSGVhdG1hcCN4U2l6ZX1cbiAgKiBDYWxjdWxhdGVkIGFmdGVyIGJ1YmJsZUhlYXRtYXAgY2FsbGVkLlxuICAqIEBwYXJhbSB7c3RyaW5nW119IFt5U2l6ZT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHlTaXplLFxuICAvKipcbiAgKiBzdG9yZSB0aGUgc2l6ZSBvZiB0aGUgc3BhY2VyIGluIHRoZSB5IGRpbWVuc2lvbi5cbiAgKiBDYWxjdWxhdGVkIGFmdGVyIGJ1YmJsZUhlYXRtYXAgY2FsbGVkLlxuICAqIEBwYXJhbSB7c3RyaW5nW119IFt4U3BhY2VyU2l6ZT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHlTcGFjZXJTaXplXG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgc2VsZWN0aW9uIGluIHdoaWNoIGl0ZW1zIGFyZSBtYW5pcHVsYXRlZFxuICAgKiBAcGFyYW0ge2QzLnNlbGVjdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBkMy5zZWxlY3Rpb259XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNlbGVjdGlvbiA9IHNlbGVjdGlvblxuICAgKi9cbiAgYmhtLnNlbGVjdGlvbiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2VsZWN0aW9uID0gXywgYmhtKSA6IHNlbGVjdGlvbjsgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBkYXRhXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjZGF0YX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IG9iamVjdH1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqL1xuICBiaG0uZGF0YSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZGF0YSA9IF8sIGJobSkgOiBkYXRhOyB9XG4gIC8vIGJobS5vcmllbnQgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9yaWVudCA9IF8sIGJobSkgOiBvcmllbnQ7IH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgYW1vdW50IG9mIGhvcml6b250YWwgc3BhY2UgaW4gd2hpY2ggaXRlbXMgYXJlIG1hbmlwdWxhdGVkXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjc3BhY2VYfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdIHNob3VsZCBiZSBhIG51bWJlciA+IDBcbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNwYWNlWCA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYmhtLnNwYWNlWCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3BhY2VYID0gXywgYmhtKSA6IHNwYWNlWDsgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBhbW91bnQgb2YgdmVydGljYWwgc3BhY2UgaW4gd2hpY2ggaXRlbXMgYXJlIG1hbmlwdWxhdGVkXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjc3BhY2VZfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdIHNob3VsZCBiZSBhIG51bWJlciA+IDBcbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNwYWNlWSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYmhtLnNwYWNlWSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3BhY2VZID0gXywgYmhtKSA6IHNwYWNlWTsgfVxuXG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHhLZXlcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCN4S2V5fSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB4S2V5ID0gJ3gnXG4gICAqL1xuICBiaG0ueEtleSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeEtleSA9IF8sIGJobSkgOiB4S2V5OyB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHlLZXlcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCN5S2V5fSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB5S2V5ID0gJ3knXG4gICAqL1xuICBiaG0ueUtleSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeUtleSA9IF8sIGJobSkgOiB5S2V5OyB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHJLZXlcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNyS2V5fSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCByS2V5ID0gJ3InXG4gICAqL1xuICBiaG0ucktleSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocktleSA9IF8sIGJobSkgOiByS2V5OyB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHZLZXlcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCN2S2V5fSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB2S2V5ID0gJ3knXG4gICAqL1xuICBiaG0udktleSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodktleSA9IF8sIGJobSkgOiB2S2V5OyB9XG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgY2VsbEtleXNcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNjZWxsS2V5c30pXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgc3RyaW5nW119XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGNlbGxLZXlzID0gdW5kZWZpbmVkXG4gICAqL1xuICBiaG0uY2VsbEtleXMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNlbGxLZXlzID0gXywgYmhtKSA6IGNlbGxLZXlzOyB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHhWYWx1ZXNcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCN4VmFsdWVzfSlcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBzdHJpbmdbXX1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgeFZhbHVlcyA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYmhtLnhWYWx1ZXMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHhWYWx1ZXMgPSBfLCBiaG0pIDogeFZhbHVlczsgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSB5VmFsdWVzXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjeVZhbHVlc30pXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgc3RyaW5nW119XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHlWYWx1ZXMgPSB1bmRlZmluZWRcbiAgICovXG4gIGJobS55VmFsdWVzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5VmFsdWVzID0gXywgYmhtKSA6IHlWYWx1ZXM7IH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgclZhbHVlc1xuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3JWYWx1ZXN9KVxuICAgKiBAcGFyYW0ge251bWJlcltdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IG51bWJlcltdfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCByVmFsdWVzID0gdW5kZWZpbmVkXG4gICAqL1xuICBiaG0uclZhbHVlcyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoclZhbHVlcyA9IF8sIGJobSkgOiByVmFsdWVzOyB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHZWYWx1ZXNcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCN2VmFsdWVzfSlcbiAgICogQHBhcmFtIHtudW1iZXJbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBudW1iZXJbXX1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdlZhbHVlcyA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYmhtLnZWYWx1ZXMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZWYWx1ZXMgPSBfLCBiaG0pIDogdlZhbHVlczsgfVxuXG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgeEV4dHJhY3RvclxuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3hFeHRyYWN0b3J9KVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IGZ1bmN0aW9ufVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB4RXh0cmFjdG9yID0gdW5kZWZpbmVkXG4gICAqL1xuICBiaG0ueEV4dHJhY3RvciA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeEV4dHJhY3RvciA9IF8sIGJobSkgOiB4RXh0cmFjdG9yOyB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHlFeHRyYWN0b3JcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCN5RXh0cmFjdG9yfSlcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBmdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgeUV4dHJhY3RvciA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYmhtLnlFeHRyYWN0b3IgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHlFeHRyYWN0b3IgPSBfLCBiaG0pIDogeUV4dHJhY3RvcjsgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSByRXh0cmFjdG9yXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjckV4dHJhY3Rvcn0pXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgZnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHJFeHRyYWN0b3IgPSB1bmRlZmluZWRcbiAgICovXG4gIGJobS5yRXh0cmFjdG9yID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyRXh0cmFjdG9yID0gXywgYmhtKSA6IHJFeHRyYWN0b3I7IH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgdkV4dHJhY3RvclxuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3ZFeHRyYWN0b3J9KVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IGZ1bmN0aW9ufVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB2RXh0cmFjdG9yID0gdW5kZWZpbmVkXG4gICAqL1xuICBiaG0udkV4dHJhY3RvciA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodkV4dHJhY3RvciA9IF8sIGJobSkgOiB2RXh0cmFjdG9yOyB9XG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHdoZXRoZXIgb3Igbm90IGJ1YmJsZUhlYXRtYXAgaXMgYWxsb3dlZCB0byBnbyBiZXlvbmQgc3BlY2lmaWVkIGRpbWVuc2lvbnNcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNzcGFjZVh9KVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgYm9vbGVhbn1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgb3ZlcmZsb3dRID0gZmFsc2VcbiAgICovXG4gIGJobS5vdmVyZmxvd1EgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG92ZXJmbG93USA9IF8sIGJobSkgOiBvdmVyZmxvd1E7IH1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBzY2FsZSBmb3Igd2hpY2ggdGhlIHJhZGl1cyBvZiBidWJibGVzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBieVxuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3NjYWxlfSlcbiAgICogQHBhcmFtIHtkMy5zY2FsZX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBkMy5zY2FsZX1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc2NhbGUgPSBkMy5zY2FsZUxpbmVhcigpXG4gICAqL1xuICBiaG0uc2NhbGUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNjYWxlID0gXywgYmhtKSA6IHNjYWxlOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHBhZGRpbmcgZm9yIHRoZSBkb21haW4gb2YgdGhlIHNjYWxlXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjZG9tYWluUGFkZGluZ30pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgZG9tYWluUGFkZGluZyA9IDAuNVxuICAgKi9cbiAgYmhtLmRvbWFpblBhZGRpbmcgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpblBhZGRpbmcgPSBfLCBiaG0pIDogZG9tYWluUGFkZGluZzsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIG9iamVjdFNwYWNlclxuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI29iamVjdFNwYWNlcn0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgb2JqZWN0U3BhY2VyID0gMC4wXG4gICAqL1xuICBiaG0ub2JqZWN0U3BhY2VyID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvYmplY3RTcGFjZXIgPSBfLCBvYmplY3RTcGFjZXIpIDogZGF0YTsgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG1pbk9iamVjdFNpemVcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNtaW5PYmplY3RTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBtaW5PYmplY3RTaXplID0gNTBcbiAgICovXG4gIGJobS5taW5PYmplY3RTaXplID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChtaW5PYmplY3RTaXplID0gXywgYmhtKSA6IG1pbk9iamVjdFNpemU7IH1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBtYXhPYmplY3RTaXplXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjbWF4T2JqZWN0U2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgbWF4T2JqZWN0U2l6ZSA9IDEwMFxuICAgKi9cbiAgYmhtLm1heE9iamVjdFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG1heE9iamVjdFNpemUgPSBfLCBiaG0pIDogbWF4T2JqZWN0U2l6ZTsgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGJ1YmJsZVN0cm9rZVdpZHRoXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjYnViYmxlU3Ryb2tlV2lkdGh9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGJ1YmJsZVN0cm9rZVdpZHRoID0gMlxuICAgKi9cbiAgYmhtLmJ1YmJsZVN0cm9rZVdpZHRoID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChidWJibGVTdHJva2VXaWR0aCA9IF8sIGJobSkgOiBidWJibGVTdHJva2VXaWR0aDsgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGJhY2tncm91bmRGaWxsXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjYmFja2dyb3VuZEZpbGx9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGJhY2tncm91bmRGaWxsID0gJ3RyYW5zcGFyZW50J1xuICAgKi9cbiAgYmhtLmJhY2tncm91bmRGaWxsID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChiYWNrZ3JvdW5kRmlsbCA9IF8sIGJobSkgOiBiYWNrZ3JvdW5kRmlsbDsgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG5hbWVzcGFjZVxuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI25hbWVzcGFjZX0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgbmFtZXNwYWNlID0gJ2Qzc20tYnViYmxlSGVhdG1hcCdcbiAgICovXG4gIGJobS5uYW1lc3BhY2UgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG5hbWVzcGFjZSA9IF8sIGJobSkgOiBuYW1lc3BhY2U7IH1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBvYmplY3RDbGFzc1xuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI29iamVjdENsYXNzfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvYmplY3RDbGFzcyA9ICd0aWNrLWdyb3VwJ1xuICAgKi9cbiAgYmhtLm9iamVjdENsYXNzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvYmplY3RDbGFzcyA9IF8sIGJobSkgOiBvYmplY3RDbGFzczsgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRyYW5zaXRpb25EdXJhdGlvblxuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3RyYW5zaXRpb25EdXJhdGlvbn0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdHJhbnNpdGlvbkR1cmF0aW9uID0gMTAwMFxuICAgKi9cbiAgYmhtLnRyYW5zaXRpb25EdXJhdGlvbiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodHJhbnNpdGlvbkR1cmF0aW9uID0gXywgYmhtKSA6IHRyYW5zaXRpb25EdXJhdGlvbjsgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGVhc2VGdW5jXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjZWFzZUZ1bmN9KVxuICAgKiBAcGFyYW0ge2QzLmVhc2V9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgZDMuZWFzZX1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgZWFzZUZ1bmMgPSBkMy5lYXNlRXhwXG4gICAqL1xuICBiaG0uZWFzZUZ1bmMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGVhc2VGdW5jID0gXywgYmhtKSA6IGVhc2VGdW5jOyB9XG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB0b29sdGlwXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjdG9vbHRpcH0pXG4gICAqIEBwYXJhbSB7dG9vbHRpcH0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCB0b29sdGlwfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0b29sdGlwID0gdG9vbHRpcCgpXG4gICAqL1xuICBiaG0udG9vbHRpcCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodG9vbHRpcCA9IF8sIGJobSkgOiB0b29sdGlwOyB9XG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB4U2l6ZVxuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3hTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB4U2l6ZSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYmhtLnhTaXplID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4U2l6ZSA9IF8sIGJobSkgOiB4U2l6ZTsgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHhTcGFjZXJTaXplXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjeFNwYWNlclNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHhTcGFjZXJTaXplID0gdW5kZWZpbmVkXG4gICAqL1xuICBiaG0ueFNwYWNlclNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHhTcGFjZXJTaXplID0gXywgYmhtKSA6IHhTcGFjZXJTaXplOyB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgeVNpemVcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCN5U2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgeVNpemUgPSB1bmRlZmluZWRcbiAgICovXG4gIGJobS55U2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeVNpemUgPSBfLCBiaG0pIDogeVNpemU7IH1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB5U3BhY2VyU2l6ZVxuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3lTcGFjZXJTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB5U3BhY2VyU2l6ZSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYmhtLnlTcGFjZXJTaXplID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5U3BhY2VyU2l6ZSA9IF8sIGJobSkgOiB5U3BhY2VyU2l6ZTsgfVxuICAvLyBiaG0ueUtleVNvcnRpbmdGdW5jdGlvbiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeUtleVNvcnRpbmdGdW5jdGlvbiA9IF8sIGJobSkgOiB5S2V5U29ydGluZ0Z1bmN0aW9uOyB9XG4gIC8vIGJobS54S2V5U29ydGluZ0Z1bmN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4S2V5U29ydGluZ0Z1bmN0aW9uID0gXywgYmhtKSA6IHhLZXlTb3J0aW5nRnVuY3Rpb247IH1cblxuXG5cbiAgZnVuY3Rpb24gYmhtKCkge1xuICAgIHZhciBob3Jpem9udGFsUSA9IHRydWU7IC8vIG5vIG9yaWVudGF0aW9uIGluIGhlYXRtYXBzLiBBaWRzIGFzIHBsYWNlaG9sZGVyIGluIGZ1bmN0aW9ucyB0aGF0IHRha2Ugb3JpZW50IGFzIGEgcGFyYW1ldGVyXG4gICAgdmFyIGJnY3BSZWN0ID0ge3g6MCwgeTowLCB3aWR0aDogc3BhY2VYLCBoZWlnaHQ6c3BhY2VZfVxuICAgIHZhciBjb250YWluZXIgPSBzZXR1cENvbnRhaW5lciggc2VsZWN0aW9uLCBuYW1lc3BhY2UsIGJnY3BSZWN0LCBiYWNrZ3JvdW5kRmlsbCApO1xuXG4gICAgY2VsbEtleXMgPSBkMy5rZXlzKGRhdGEpO1xuICAgIGNlbGxLZXlzLnNvcnQoZnVuY3Rpb24oYSwgYil7IHJldHVybiB4S2V5U29ydGluZ0Z1bmN0aW9uKGEsIGIpIHx8IHlLZXlTb3J0aW5nRnVuY3Rpb24oYSwgYikgfSlcbiAgICBsb2coJ2J1YmJsZUhlYXRtYXAnLCAnY2VsbHMgYXJlIHNvcnRlZCBieScsIGNlbGxLZXlzKVxuXG5cblxuICAgIHhWYWx1ZXMgPSB1bmlxdWUoY2VsbEtleXMubWFwKHhFeHRyYWN0b3IpKTtcbiAgICB5VmFsdWVzID0gdW5pcXVlKGNlbGxLZXlzLm1hcCh5RXh0cmFjdG9yKSk7XG4gICAgclZhbHVlcyA9IHVuaXF1ZShjZWxsS2V5cy5tYXAockV4dHJhY3RvcikpO1xuICAgIHZWYWx1ZXMgPSB1bmlxdWUoY2VsbEtleXMubWFwKHZFeHRyYWN0b3IpKTtcbiAgICBsb2coJ2J1YmJsZUhlYXRtYXAnLCAneCBhbmQgeSBrZXlzIGFyZScsIHt4OiB4VmFsdWVzLCB5OnlWYWx1ZXN9KVxuXG5cbiAgICB2YXIgeERpbSA9IHhWYWx1ZXMubGVuZ3RoLCB5RGltID0geVZhbHVlcy5sZW5ndGg7XG5cblxuICAgIHZhciBleHRlbnQgPSBbTWF0aC5taW4oLi4uclZhbHVlcykgLSBkb21haW5QYWRkaW5nLE1hdGgubWF4KC4uLnJWYWx1ZXMpICsgZG9tYWluUGFkZGluZ107XG5cblxuICAgIHlTaXplID0gY2FsY3VsYXRlV2lkdGhPZk9iamVjdChzcGFjZVksIHlEaW0sIG1pbk9iamVjdFNpemUsIG1heE9iamVjdFNpemUsIG9iamVjdFNwYWNlciwgb3ZlcmZsb3dRKVxuICAgIHhTaXplID0gY2FsY3VsYXRlV2lkdGhPZk9iamVjdChzcGFjZVgsIHhEaW0sIG1pbk9iamVjdFNpemUsIG1heE9iamVjdFNpemUsIG9iamVjdFNwYWNlciwgb3ZlcmZsb3dRKVxuICAgIHlTcGFjZXJTaXplID0gY2FsY3VsYXRlV2lkdGhPZlNwYWNlcih5VmFsdWVzLCBzcGFjZVksIHlTaXplLCB5RGltLCBvYmplY3RTcGFjZXIsIG92ZXJmbG93USlcbiAgICB4U3BhY2VyU2l6ZSA9IGNhbGN1bGF0ZVdpZHRoT2ZTcGFjZXIoeFZhbHVlcywgc3BhY2VYLCB4U2l6ZSwgeERpbSwgb2JqZWN0U3BhY2VyLCBvdmVyZmxvd1EpXG4gICAgbG9nKCdidWJibGVIZWF0bWFwJywgJ3NpemUgb2YnLCB7eDogeFNpemUsIHk6IHlTaXplfSlcblxuXG4gICAgc2NhbGUuZG9tYWluKGV4dGVudCkucmFuZ2UoWzAsIE1hdGgubWluKHlTaXplLCB4U2l6ZSkvMl0pXG5cbiAgICB2YXIgeVNwYWNlciA9IGdyb3VwaW5nU3BhY2VyKClcbiAgICAuaG9yaXpvbnRhbFEoZmFsc2UpXG4gICAgLm1vdmVieSgnY2F0ZWdvcnknKS5udW1iZXJPZk9iamVjdHMoeURpbSlcbiAgICAub2JqZWN0Q2xhc3MoaHlwZW5hdGUob2JqZWN0Q2xhc3MsICdyb3cnKSlcbiAgICAub2JqZWN0U2l6ZSh5U2l6ZSkuc3BhY2VyU2l6ZSh5U3BhY2VyU2l6ZSlcbiAgICAudHJhbnNpdGlvbkR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuZWFzZUZ1bmMoZWFzZUZ1bmMpXG4gICAgLm5hbWVzcGFjZSgncm93JylcblxuICAgIHZhciB4U3BhY2VyID0gZ3JvdXBpbmdTcGFjZXIoKVxuICAgIC5ob3Jpem9udGFsUSh0cnVlKVxuICAgIC5tb3ZlYnkoJ2NhdGVnb3J5JykubnVtYmVyT2ZPYmplY3RzKHhEaW0pXG4gICAgLm9iamVjdENsYXNzKG9iamVjdENsYXNzKVxuICAgIC5vYmplY3RTaXplKHhTaXplKS5zcGFjZXJTaXplKHhTcGFjZXJTaXplKVxuICAgIC50cmFuc2l0aW9uRHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlRnVuYyhlYXNlRnVuYylcblxuXG4gICAgeVNwYWNlcihjb250YWluZXIsIHlWYWx1ZXMsIDApXG4gICAgY29udGFpbmVyLnNlbGVjdEFsbCgnZy4nK2h5cGVuYXRlKG9iamVjdENsYXNzLCAncm93JykpXG4gICAgLmVhY2goZnVuY3Rpb24oZCwgaSl7XG4gICAgICB4U3BhY2VyKGQzLnNlbGVjdCh0aGlzKSwgeFZhbHVlcywgMClcbiAgICB9KVxuICAgIHZhciBjZWxscyA9IGNvbnRhaW5lci5zZWxlY3RBbGwoJ2c6bm90KC50by1yZW1vdmUpLicrb2JqZWN0Q2xhc3MpLmRhdGEoY2VsbEtleXMpO1xuXG4gICAgdmFyIHBhcmVudEluZGV4QXJyYXkgPSBbXVxuICAgIGNlbGxzLmVhY2goZnVuY3Rpb24oZCwgaSl7IHBhcmVudEluZGV4QXJyYXkucHVzaChOdW1iZXIoZDMuc2VsZWN0KHRoaXMpLmF0dHIoJ3BhcmVudC1pbmRleCcpKSkgfSlcblxuXG4gICAgY29sb3JGdW5jdGlvbiA9IGNvbG9yRnVuY3Rpb24uY29sb3JCeSgpID09ICdpbmRleCdcbiAgICA/IGNvbG9yRnVuY3Rpb24uZGF0YUV4dGVudChbMCwgTWF0aC5tYXgoLi4ucGFyZW50SW5kZXhBcnJheSldKVxuICAgIDogY29sb3JGdW5jdGlvbi5kYXRhRXh0ZW50KGV4dGVudClcblxuICAgIGNlbGxzLmVhY2goZnVuY3Rpb24oa2V5LCBpKSB7XG4gICAgICBsb2coJ2J1YmJsZUhlYXRtYXAnLCAnZWFjaCBjZWxsJywge2tleToga2V5LCBpbmRleDogaSwgbm9kZTogZDMuc2VsZWN0KHRoaXMpLm5vZGUoKX0pXG5cbiAgICAgIHZhciB0ID0gZDMuc2VsZWN0KHRoaXMpLFxuICAgICAgY3VycmVudERhdGEgPSBkYXRhW2tleV0sXG4gICAgICB2YWx1ZSA9IHZFeHRyYWN0b3Ioa2V5LCBpKSxcbiAgICAgIHJhZGl1cz0gckV4dHJhY3RvcihrZXksIGkpLFxuICAgICAgaSA9IHQuYXR0cigncGFyZW50LWluZGV4JykgPT0gdW5kZWZpbmVkID8gaSA6IHQuYXR0cigncGFyZW50LWluZGV4JyksXG4gICAgICBmaWxsQ29sb3IgPSBjb2xvckZ1bmN0aW9uKGtleSwgdmFsdWUsIGksICdmaWxsJyksIC8vIHByZXZlbnQgZHVwbGljYXRlIGNvbXB1dGF0aW9uXG4gICAgICBzdHJva2VDb2xvciA9IGNvbG9yRnVuY3Rpb24oa2V5LCB2YWx1ZSwgaSwgICdzdHJva2UnKVxuXG4gICAgICB2YXIgYyA9IHNhZmVTZWxlY3QodCwgJ2NpcmNsZScsIGh5cGVuYXRlKG9iamVjdENsYXNzLCdjaXJjbGUnKSlcbiAgICAgIGMuYXR0cignY3gnLCB4U2l6ZSAvIDIpXG4gICAgICAuYXR0cignY3knLCB5U2l6ZSAvIDIgKVxuICAgICAgLmF0dHIoJ3InLCBzY2FsZShyYWRpdXMpKVxuICAgICAgLmF0dHIoJ2ZpbGwnLCBmaWxsQ29sb3IpXG4gICAgICAuYXR0cignc3Ryb2tlJywgc3Ryb2tlQ29sb3IpXG4gICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgYnViYmxlU3Ryb2tlV2lkdGgpXG5cbiAgICB9KVxuXG4gICAgdG9vbHRpcC5zZWxlY3Rpb24oY2VsbHMuc2VsZWN0QWxsKCdjaXJjbGUuJytoeXBlbmF0ZShvYmplY3RDbGFzcywgJ2NpcmNsZScpKSlcbiAgICAuZGF0YShkYXRhKVxuICAgIC8vIC5rZXlzKFsncicsICd2J10pXG4gICAgLy8gLmhlYWRlcihmdW5jdGlvbihkLCBpKXtyZXR1cm4gaHlwZW5hdGUoZGF0YVtkXVt4S2V5XSwgZGF0YVtkXVt5S2V5XSkgfSlcblxuICAgIHRvb2x0aXAoKVxuXG5cbiAgfVxuXG4gIHJldHVybiBiaG07XG59XG5cbmV4cG9ydCB7YnViYmxlSGVhdG1hcH1cbiIsImltcG9ydCB7aHlwZW5hdGUsIHNhZmVTZWxlY3R9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQge3NldHVwQ29udGFpbmVyLCBjYWxjdWxhdGVXaWR0aE9mT2JqZWN0LCBjYWxjdWxhdGVXaWR0aE9mU3BhY2VyLCB3aGlza2VyUGF0aH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge3VuaXF1ZSwgaGFzUSwgZmxhdHRlbn0gZnJvbSAnLi9hcnJheS1mdW5jdGlvbnMnO1xuaW1wb3J0IHtncm91cGluZ1NwYWNlcn0gZnJvbSAnLi9ncm91cGluZy1zcGFjZXInO1xuaW1wb3J0IHtjb2xvckZ1bmN0aW9uIGFzIENGfSBmcm9tICcuL2NvbG9yLWZ1bmN0aW9uJztcbmltcG9ydCB7dG9vbHRpcCBhcyBUVGlwfSBmcm9tICcuL3Rvb2x0aXAnO1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPWCBBTkQgV0hJU0tFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKlxuICogQ3JlYXRlcyBhIGJveHdoaXNrZXJcbiAqXG4gKiB7QGxpbmsgaHR0cHM6Ly9zdW1uZXVyb24uZ2l0bGFiLmlvL2Qzc20vZGVtb3MvYm94LXdoaXNrZXJzL2luZGV4Lmh0bWwgRGVtb31cbiAqIEBjb25zdHJ1Y3RvciBib3h3aGlza2VyXG4gKiBAcGFyYW0ge2QzLnNlbGVjdGlvbn0gc2VsZWN0aW9uXG4gKiBAbmFtZXNwYWNlIGJveHdoaXNrZXJcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gYm94d2hpc2tlclxuICovXG5leHBvcnQgZnVuY3Rpb24gYm94d2hpc2tlciggc2VsZWN0aW9uICkge1xuICB2YXJcbiAgLyoqXG4gICogRGF0YSB0byBwbG90LiBBc3N1bWVkIHRvIGJlIGEgb2JqZWN0LCB3aGVyZSBlYWNoIGtleSBjb3JyZXNwb25kcyB0byBhIGJveFxuICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjZGF0YX0pXG4gICogQHBhcmFtIHtPYmplY3R9IFtkYXRhPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYm94d2hpc2tlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZGF0YSxcbiAgLyoqXG4gICogV2hpY2ggZGlyZWN0aW9uIHRvIHJlbmRlciB0aGUgYm94ZXMgaW5cbiAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI29yaWVudH0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtvcmllbnQ9J2hvcml6b250YWwnXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBvcmllbnQgPSAnaG9yaXpvbnRhbCcsXG4gIC8qKlxuICAqIEFtb3VudCBvZiBob3Jpem9udGFsIHNwYWNlIChpbiBwaXhlbHMpIGF2YWlibGUgdG8gcmVuZGVyIHRoZSBib3h3aGlza2VyIGluXG4gICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNzcGFjZVh9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbc3BhY2VYPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYm94d2hpc2tlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc3BhY2VYLFxuICAvKipcbiAgKiBBbW91bnQgb2YgdmVydGljYWwgc3BhY2UgKGluIHBpeGVscykgYXZhaWJsZSB0byByZW5kZXIgdGhlIGJveHdoaXNrZXIgaW5cbiAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyLnNwYWNlWX0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZVk9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzcGFjZVksXG4gIC8qKlxuICAqIFdoZXRoZXIgb3Igbm90IHRvIGFsbG93IGJveHdoaXNrZXIgdG8gcmVuZGVyIGVsZW1lbnRzIHBhc3MgdGhlIG1haW4gc3BhdGlhbCBkaW1lbnNpb25cbiAgKiBnaXZlbiB0aGUgb3JpZW50YXRpb24gKHNlZSB7QGxpbmsgYm94d2hpc2tlciNvcmllbnR9KSwgd2hlcmUge0BsaW5rIGJveHdoaXNrZXIjb3JpZW50fT1cImhvcml6b250YWxcIlxuICAqIHRoZSBtYWluIGRpbWVuc2lvbiBpcyB7QGxpbmsgYm94d2hpc2tlciNzcGFjZVh9IGFuZCB3aGVyZSB7QGxpbmsgYm94d2hpc2tlciNvcmllbnR9PVwidmVydGljYWxcIlxuICAqIHRoZSBtYWluIGRpbWVuc2lvbiBpcyB7QGxpbmsgYm94d2hpc2tlciNzcGFjZVl9XG4gICogQHBhcmFtIHtib29sZWFufSBbb3ZlcmZsb3dRPWZhbHNlXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBvdmVyZmxvd1EgPSB0cnVlLFxuXG4gIC8qKlxuICAqIEFuIGFycmF5IC0gcHV0YXRpdmVseSBvZiBvdGhlciBhcnJheXMgLSBkZXBpY3RpbmcgaG93IGJveGVzIHNob3VsZCBiZSBhcnJhbmdlZFxuICAqIEBwYXJhbSB7QXJyYXlbXX0gW2dyb3VwaW5nPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYm94d2hpc2tlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZ3JvdXBpbmcsXG4gIHF1YXJ0aWxlc0tleSA9ICdxdWFydGlsZXMnLCAvLyBrZXkgaW4gb2JqZWN0IHdoZXJlIHF1YXJ0aWxlcyBhcmUgc3RvcmVkXG4gIHF1YXJ0aWxlc0tleXMgPSBbXCIwLjAwXCIsIFwiMC4yNVwiLCBcIjAuNTBcIiwgXCIwLjc1XCIsIFwiMS4wMFwiXSwgLy8ga2V5cyBpbiBxdWFydGlsZXMgb2JqZWN0IG1hcHBpbmcgdmFsdWVzIHRvIG1pbiwgcTEsIHEyLCBxMyBhbmQgbWF4XG5cblxuICAvKipcbiAgKiBIb3cgdG8gZ2V0IHRoZSB2YWx1ZSBvZiB0aGUgYm94d2hpc2tlclxuICAqIEBwYXJhbSB7ZnVuY3Rpb259IFt2YWx1ZUV4dHJhY3Rvcj1mdW5jdGlvbihrZXksIGluZGV4KSB7IHJldHVybiBkYXRhW2tleV1bcXVhcnRpbGVzS2V5XSB9XVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB2YWx1ZUV4dHJhY3RvciA9IGZ1bmN0aW9uKGtleSwgaW5kZXgpIHsgcmV0dXJuIGRhdGFba2V5XVtxdWFydGlsZXNLZXldIH0sXG4gIC8qKlxuICAqIEhvdyB0byBzb3J0IHRoZSBib3hlcyAtIGlmIHtAbGluayBib3h3aGlza2VyI2dyb3VwaW5nfSBpcyBub3QgcHJvdmlkZWQuXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW3NvcnRpbmdGdW5jdGlvbj1kZXNjZW5kaW5nXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqIGRlZmF1bHRcbiAgKiBmdW5jdGlvbihrZXlBLCBrZXlCKSB7cmV0dXJuIGQzLmRlc2NlbmRpbmcoXG4gICogICB2YWx1ZUV4dHJhY3RvcihrZXlBKVtxdWFydGlsZXNLZXlzWzRdXSxcbiAgKiAgIHZhbHVlRXh0cmFjdG9yKGtleUIpW3F1YXJ0aWxlc0tleXNbNF1dXG4gICogKX1cbiAgKi9cbiAgc29ydGluZ0Z1bmN0aW9uID0gZnVuY3Rpb24oa2V5QSwga2V5Qikge3JldHVybiBkMy5kZXNjZW5kaW5nKFxuICAgIHZhbHVlRXh0cmFjdG9yKGtleUEpW3F1YXJ0aWxlc0tleXNbNF1dLFxuICAgIHZhbHVlRXh0cmFjdG9yKGtleUIpW3F1YXJ0aWxlc0tleXNbNF1dXG4gICl9LFxuICAvKipcbiAgKiBUaGUgc2NhbGUgZm9yIHdoaWNoIGJveHdoaXNrZXIgdmFsdWVzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBieVxuICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtzY2FsZT1kMy5zY2FsZUxpbmVhcl1cbiAgKiBAbWVtYmVyb2YgYm94d2hpc2tlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc2NhbGUgPSBkMy5zY2FsZUxpbmVhcigpLFxuICAvKipcbiAgKiBUaGUgcGFkZGluZyBmb3IgdGhlIGRvbWFpbiBvZiB0aGUgc2NhbGUgKHNlZSB7QGxpbmsgYm94d2hpc2tlciNzY2FsZX0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtkb21haW5QYWRkaW5nPTAuNV1cbiAgKiBAbWVtYmVyb2YgYm94d2hpc2tlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZG9tYWluUGFkZGluZyA9IDAuNSxcbiAgLyoqXG4gICogRGVmYXVsdCBzcGFjZSBmb3IgdGhlIHNwYWNlciAocGVyY2VudGFnZSkgb2YgbWFpbiBkaW1lbnNpb24gZ2l2ZW4gdGhlIG9yaWVudGF0aW9uXG4gICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNvcmllbnR9KSwgd2hlcmUge0BsaW5rIGJveHdoaXNrZXIjb3JpZW50fT1cImhvcml6b250YWxcIlxuICAqIHRoZSBtYWluIGRpbWVuc2lvbiBpcyB7QGxpbmsgYm94d2hpc2tlciNzcGFjZVh9IGFuZCB3aGVyZSB7QGxpbmsgYm94d2hpc2tlciNvcmllbnR9PVwidmVydGljYWxcIlxuICAqIHRoZSBtYWluIGRpbWVuc2lvbiBpcyB7QGxpbmsgYm94d2hpc2tlciNzcGFjZVl9IGJldHdlZW4gYm94ZXNcbiAgKiBAcGFyYW0ge251bWJlcn0gW29iamVjdFNwYWNlcj0wLjA1XVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBvYmplY3RTcGFjZXIgPSAwLjA1LFxuICAvKipcbiAgKiBUaGUgbWluaW11bSBzaXplIHRoYXQgYW4gb2JqZWN0IGNhbiBiZVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbbWluT2JqZWN0U2l6ZT0xNV1cbiAgKiBAbWVtYmVyb2YgYm94d2hpc2tlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgbWluT2JqZWN0U2l6ZSA9IDE1LFxuICAvKipcbiAgKiBUaGUgbWF4aW11bSBzaXplIHRoYXQgYW4gb2JqZWN0IGNhbiBiZVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4T2JqZWN0U2l6ZT01MF1cbiAgKiBAbWVtYmVyb2YgYm94d2hpc2tlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgbWF4T2JqZWN0U2l6ZSA9IDUwLFxuICAvKipcbiAgKiBQZXJjZW50IG9mIGJveCBhbmQgd2hpc2tlciBzaXplIHRoYXQgd2hpc2tlcnMgd2lsbCBiZSByZW5kZXJlZFxuICAqIHNlZSB7QGxpbmsgYm94d2hpc2tlciNvYmplY3RTaXplfVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbd2hpc2tlcldpZHRoUGVyY2VudD0wLjZdXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHdoaXNrZXJXaWR0aFBlcmNlbnQgPSAuNixcbiAgLyoqXG4gICogSW5zdGFuY2Ugb2YgQ29sb3JGdW5jdGlvblxuICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtjb2xvckZ1bmN0aW9uID0gY29sb3JGdW5jdGlvbigpXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBjb2xvckZ1bmN0aW9uID0gQ0YoKSxcbiAgLyoqXG4gICogVGhlIHN0cm9rZSB3aWR0aCBvZiB0aGUgYm94ZXNcbiAgKiBAcGFyYW0ge251bWJlcn0gW2JveFN0cm9rZVdpZHRoPTJdXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGJveFN0cm9rZVdpZHRoID0gMixcbiAgLyoqXG4gICogVGhlIHN0cm9rZSB3aWR0aCBvZiB0aGUgd2hpc2tlcnNcbiAgKiBAcGFyYW0ge251bWJlcn0gW3doaXNrZXJTdHJva2VXaWR0aD0yXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB3aGlza2VyU3Ryb2tlV2lkdGggPSAyLFxuXG4gIC8qKlxuICAqIENvbG9yIG9mIHRoZSBiYWNrZ3JvdW5kXG4gICogQHBhcmFtIHtzdHJpbmd9IFtiYWNrZ3JvdW5kRmlsbD1cInRyYW5zcGFyZW50XCJdXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGJhY2tncm91bmRGaWxsID0gJ3RyYW5zcGFyZW50JyxcbiAgLyoqXG4gICogTmFtZXNwYWNlIGZvciBhbGwgaXRlbXMgbWFkZSBieSB0aGlzIGluc3RhbmNlIG9mIGJveHdoaXNrZXJcbiAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVzcGFjZT1cImQzc20tYm94LXdoaXNrZXJcIl1cbiAgKiBAbWVtYmVyb2YgYm94d2hpc2tlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgbmFtZXNwYWNlID0gJ2Qzc20tYm94LXdoaXNrZXInLFxuICAvKipcbiAgKiBDbGFzcyBuYW1lIGZvciBib3h3aGlza2VyIGNvbnRhaW5lciAoPGc+IGVsZW1lbnQpXG4gICogQHBhcmFtIHtzdHJpbmd9IFtvYmplY3RDbGFzcz1cImJveC13aGlza1wiXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBvYmplY3RDbGFzcyA9ICdib3gtd2hpc2snLFxuXG4gIC8qKlxuICAqIER1cmF0aW9uIG9mIGFsbCB0cmFuc2l0aW9ucyBvZiB0aGlzIGVsZW1lbnRcbiAgKiBAcGFyYW0ge251bWJlcn0gW3RyYW5zaXRpb25EdXJhdGlvbj0xMDAwXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB0cmFuc2l0aW9uRHVyYXRpb24gPSAxMDAwLFxuICAvKipcbiAgKiBFYXNpbmcgZnVuY3Rpb24gZm9yIHRyYW5zaXRpb25zXG4gICogQHBhcmFtIHtkMy5lYXNlfSBbZWFzZUZ1bmM9ZDMuZWFzZUV4cF1cbiAgKiBAbWVtYmVyb2YgYm94d2hpc2tlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZWFzZUZ1bmMgPSBkMy5lYXNlRXhwLFxuXG4gIC8qKlxuICAqIFRoZSBrZXlzIG9mIHRoZSBib3hlc1xuICAqIEBwYXJhbSB7c3RyaW5nW119IFtib3hLZXlzPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYm94d2hpc2tlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgYm94S2V5cyxcbiAgLyoqXG4gICogVGhlIHZhbHVlcyBvZiB0aGUgYm94ZXNcbiAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbYm94VmFsdWVzPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYm94d2hpc2tlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgYm94VmFsdWVzLFxuICAvKipcbiAgKiBUaGUgb2JqZWN0U2l6ZSAoYWN0dWFsIHdpZHRoKSB1c2VkIGJ5IHRoZSBib3hlc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbb2JqZWN0U2l6ZT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG9iamVjdFNpemUsXG4gIC8qKlxuICAqIFRoZSBzcGFjZXJTaXplIChhY3R1YWwgd2lkdGgpIHVzZWQgYnkgdGhlIHNwYWNlcnMgYmV0d2VlbiB0aGUgYm94ZXNcbiAgKiBAcGFyYW0ge251bWJlcn0gW3NwYWNlclNpemU9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzcGFjZXJTaXplLFxuICAvKipcbiAgKiBJbnN0YW5jZSBvZiBUb29sdGlwXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW3Rvb2x0aXA9dG9vbHRpcCgpXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB0b29sdGlwID0gVFRpcCgpXG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHNlbGVjdGlvbiBpbiB3aGljaCBpdGVtcyBhcmUgbWFuaXB1bGF0ZWRcbiAgICogQHBhcmFtIHtkMy5zZWxlY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgZDMuc2VsZWN0aW9ufVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzZWxlY3Rpb24gPSBzZWxlY3Rpb25cbiAgICovXG4gIGJveHdoaXNrZXIuc2VsZWN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzZWxlY3Rpb24gPSBfLCBib3h3aGlza2VyKSA6IHNlbGVjdGlvbjsgfTtcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgZGF0YVxuICAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI2RhdGF9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBvYmplY3R9XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKi9cbiAgYm94d2hpc2tlci5kYXRhID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkYXRhID0gXywgYm94d2hpc2tlcikgOiBkYXRhOyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBvcmllbnQgb2YgdGhlIGJveGVzXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjb3JpZW50fSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgb2JqZWN0fVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICovXG4gIGJveHdoaXNrZXIub3JpZW50ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvcmllbnQgPSBfLCBib3h3aGlza2VyKSA6IG9yaWVudDsgfTtcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgYW1vdW50IG9mIGhvcml6b250YWwgc3BhY2UgaW4gd2hpY2ggaXRlbXMgYXJlIG1hbmlwdWxhdGVkXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjc3BhY2VYfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdIHNob3VsZCBiZSBhIG51bWJlciA+IDBcbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNwYWNlWCA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYm94d2hpc2tlci5zcGFjZVggPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNwYWNlWCA9IF8sIGJveHdoaXNrZXIpIDogc3BhY2VYOyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBhbW91bnQgb2YgdmVydGljYWwgc3BhY2UgaW4gd2hpY2ggaXRlbXMgYXJlIG1hbmlwdWxhdGVkXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjc3BhY2VZfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdIHNob3VsZCBiZSBhIG51bWJlciA+IDBcbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNwYWNlWSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYm94d2hpc2tlci5zcGFjZVkgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNwYWNlWSA9IF8sIGJveHdoaXNrZXIpIDogc3BhY2VZOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgd2hldGhlciBvciBub3QgYm94d2hpc2tlciBpcyBhbGxvd2VkIHRvIGdvIGJleW9uZCBzcGVjaWZpZWQgZGltZW5zaW9uc1xuICAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI292ZXJmbG93UX0pXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBib29sZWFufVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvdmVyZmxvd1EgPSBmYWxzZVxuICAgKi9cbiAgYm94d2hpc2tlci5vdmVyZmxvd1EgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG92ZXJmbG93USA9IF8sIGJveHdoaXNrZXIpIDogb3ZlcmZsb3dROyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGdyb3VwaW5nIG9mIHRoZSBib3hlc1xuICAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI2dyb3VwaW5nfSlcbiAgICogQHBhcmFtIHtBcnJheVtdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IEFycmF5W119XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGdyb3VwaW5nID0gdW5kZWZpbmVkXG4gICAqL1xuICBib3h3aGlza2VyLmdyb3VwaW5nID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChncm91cGluZyA9IF8sIGJveHdoaXNrZXIpIDogZ3JvdXBpbmc7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgcXVhcnRpbGVzS2V5XG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjcXVhcnRpbGVzS2V5fSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBxdWFydGlsZXNLZXkgPSBxdWFydGlsZXNcbiAgICovXG4gIGJveHdoaXNrZXIucXVhcnRpbGVzS2V5ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChxdWFydGlsZXNLZXkgPSBfLCBib3h3aGlza2VyKSA6IHF1YXJ0aWxlc0tleTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBxdWFydGlsZXNLZXlzXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjcXVhcnRpbGVzS2V5c30pXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgc3RyaW5nW119XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHF1YXJ0aWxlc0tleXMgPSBbUTAsIFExLCBRMiwgUTMsIFE0XVxuICAgKi9cbiAgYm94d2hpc2tlci5xdWFydGlsZXNLZXlzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChxdWFydGlsZXNLZXlzID0gXywgYm94d2hpc2tlcikgOiBxdWFydGlsZXNLZXlzOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHZhbHVlRXh0cmFjdG9yXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjdmFsdWVFeHRyYWN0b3J9KVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IGZ1bmN0aW9ufVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB2YWx1ZUV4dHJhY3RvciA9IGZ1bmN0aW9uKGtleSwgaW5kZXgpIHsgcmV0dXJuIGRhdGFba2V5XVtxdWFydGlsZXNLZXldIH0sXG4gICAqL1xuXG4gIGJveHdoaXNrZXIudmFsdWVFeHRyYWN0b3IgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZhbHVlRXh0cmFjdG9yID0gXywgYm94d2hpc2tlcikgOiB2YWx1ZUV4dHJhY3RvcjsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBzb3J0aW5nRnVuY3Rpb25cbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNzb3J0aW5nRnVuY3Rpb259KVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IGZ1bmN0aW9ufVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzb3J0aW5nRnVuY3Rpb24gPSBmdW5jdGlvbihrZXlBLCBrZXlCKSB7cmV0dXJuIGQzLmRlc2NlbmRpbmcoXG4gICAqICAgdmFsdWVFeHRyYWN0b3Ioa2V5QSlbcXVhcnRpbGVzS2V5c1s0XV0sXG4gICAqICAgdmFsdWVFeHRyYWN0b3Ioa2V5QilbcXVhcnRpbGVzS2V5c1s0XV1cbiAgICogKX0sXG4gICAqL1xuICBib3h3aGlza2VyLnNvcnRpbmdGdW5jdGlvbiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc29ydGluZ0Z1bmN0aW9uID0gXywgYm94d2hpc2tlcikgOiBzb3J0aW5nRnVuY3Rpb247IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgc2NhbGUgZm9yIHdoaWNoIHRoZSBib3h3aGlza2VyIHZhbHVlcyBzaG91bGQgYmUgdHJhbnNmb3JtZWQgYnlcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNzY2FsZX0pXG4gICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgZDMuc2NhbGV9XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKVxuICAgKi9cbiAgYm94d2hpc2tlci5zY2FsZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2NhbGUgPSBfLCBib3h3aGlza2VyKSA6IHNjYWxlOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHBhZGRpbmcgZm9yIHRoZSBkb21haW4gb2YgdGhlIHNjYWxlXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjZG9tYWluUGFkZGluZ30pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgZG9tYWluUGFkZGluZyA9IDAuNVxuICAgKi9cbiAgYm94d2hpc2tlci5kb21haW5QYWRkaW5nID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkb21haW5QYWRkaW5nID0gXywgYm94d2hpc2tlcikgOiBkb21haW5QYWRkaW5nOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgb2JqZWN0U3BhY2VyXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjb2JqZWN0U3BhY2VyfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvYmplY3RTcGFjZXIgPSAwLjA1XG4gICAqL1xuICBib3h3aGlza2VyLm9iamVjdFNwYWNlciA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob2JqZWN0U3BhY2VyID0gXywgYm94d2hpc2tlcikgOiBvYmplY3RTcGFjZXI7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbWluT2JqZWN0U2l6ZVxuICAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI21pbk9iamVjdFNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG1pbk9iamVjdFNpemUgPSAxNVxuICAgKi9cbiAgYm94d2hpc2tlci5taW5PYmplY3RTaXplID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChtaW5PYmplY3RTaXplID0gXywgYm94d2hpc2tlcikgOiBtaW5PYmplY3RTaXplOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG1heE9iamVjdFNpemVcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNtYXhPYmplY3RTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBtYXhPYmplY3RTaXplID0gNTBcbiAgICovXG4gIGJveHdoaXNrZXIubWF4T2JqZWN0U2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobWF4T2JqZWN0U2l6ZSA9IF8sIGJveHdoaXNrZXIpIDogbWF4T2JqZWN0U2l6ZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB3aGlza2VyV2lkdGhQZXJjZW50XG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjd2hpc2tlcldpZHRoUGVyY2VudH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgbWF4T2JqZWN0U2l6ZSA9IDAuNlxuICAgKi9cbiAgYm94d2hpc2tlci53aGlza2VyV2lkdGhQZXJjZW50ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh3aGlza2VyV2lkdGhQZXJjZW50ID0gXywgYm94d2hpc2tlcikgOiB3aGlza2VyV2lkdGhQZXJjZW50OyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGNvbG9yRnVuY3Rpb25cbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNjb2xvckZ1bmN0aW9ufSlcbiAgICogQHBhcmFtIHtjb2xvckZ1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IGNvbG9yRnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGNvbG9yRnVuY3Rpb24gPSBjb2xvckZ1bmN0aW9uKClcbiAgICovXG4gIGJveHdoaXNrZXIuY29sb3JGdW5jdGlvbiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY29sb3JGdW5jdGlvbiA9IF8sIGJveHdoaXNrZXIpIDogY29sb3JGdW5jdGlvbjsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBib3hTdHJva2VXaWR0aFxuICAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI2JveFN0cm9rZVdpZHRofSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBib3hTdHJva2VXaWR0aCA9IDJcbiAgICovXG4gIGJveHdoaXNrZXIuYm94U3Ryb2tlV2lkdGggPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGJveFN0cm9rZVdpZHRoID0gXywgYm94d2hpc2tlcikgOiBib3hTdHJva2VXaWR0aDsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB3aGlza2VyU3Ryb2tlV2lkdGhcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciN3aGlza2VyU3Ryb2tlV2lkdGh9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHdoaXNrZXJTdHJva2VXaWR0aCA9IDJcbiAgICovXG4gIGJveHdoaXNrZXIud2hpc2tlclN0cm9rZVdpZHRoID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh3aGlza2VyU3Ryb2tlV2lkdGggPSBfLCBib3h3aGlza2VyKSA6IHdoaXNrZXJTdHJva2VXaWR0aDsgfTtcblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGJhY2tncm91bmRGaWxsXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjYmFja2dyb3VuZEZpbGx9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGJhY2tncm91bmRGaWxsID0gJ3RyYW5zcGFyZW50J1xuICAgKi9cbiAgYm94d2hpc2tlci5iYWNrZ3JvdW5kRmlsbCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYmFja2dyb3VuZEZpbGwgPSBfLCBib3h3aGlza2VyKSA6IGJhY2tncm91bmRGaWxsOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG5hbWVzcGFjZVxuICAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI25hbWVzcGFjZX0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgbmFtZXNwYWNlID0gJ2Qzc20tYm94d2hpc2tlcidcbiAgICovXG4gIGJveHdoaXNrZXIubmFtZXNwYWNlID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChuYW1lc3BhY2UgPSBfLCBib3h3aGlza2VyKSA6IG5hbWVzcGFjZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBvYmplY3RDbGFzc1xuICAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI29iamVjdENsYXNzfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvYmplY3RDbGFzcyA9ICd0aWNrLWdyb3VwJ1xuICAgKi9cbiAgYm94d2hpc2tlci5vYmplY3RDbGFzcyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob2JqZWN0Q2xhc3MgPSBfLCBib3h3aGlza2VyKSA6IG9iamVjdENsYXNzOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRyYW5zaXRpb25EdXJhdGlvblxuICAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI3RyYW5zaXRpb25EdXJhdGlvbn0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdHJhbnNpdGlvbkR1cmF0aW9uID0gMTAwMFxuICAgKi9cbiAgYm94d2hpc2tlci50cmFuc2l0aW9uRHVyYXRpb24gPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRyYW5zaXRpb25EdXJhdGlvbiA9IF8sIGJveHdoaXNrZXIpIDogdHJhbnNpdGlvbkR1cmF0aW9uOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGVhc2VGdW5jXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjZWFzZUZ1bmN9KVxuICAgKiBAcGFyYW0ge2QzLmVhc2V9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgZDMuZWFzZX1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgZWFzZUZ1bmMgPSBkMy5lYXNlRXhwXG4gICAqL1xuICBib3h3aGlza2VyLmVhc2VGdW5jID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChlYXNlRnVuYyA9IF8sIGJveHdoaXNrZXIpIDogZWFzZUZ1bmM7IH07XG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBiYXJLZXlzXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjYm94S2V5c30pXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgc3RyaW5nW119XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGJveEtleXMgPSB1bmRlZmluZWRcbiAgICovXG4gIGJveHdoaXNrZXIuYm94S2V5cyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYm94S2V5cyA9IF8sIGJveHdoaXNrZXIpIDogYm94S2V5czsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBib3hWYWx1ZXNcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNib3hWYWx1ZXN9KVxuICAgKiBAcGFyYW0ge251bWJlcltdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IG51bWJlcltdfVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBib3hWYWx1ZXMgPSB1bmRlZmluZWRcbiAgICovXG4gIGJveHdoaXNrZXIuYm94VmFsdWVzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChib3hWYWx1ZXMgPSBfLCBib3h3aGlza2VyKSA6IGJveFZhbHVlczsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBvYmplY3RTaXplXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjb2JqZWN0U2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgb2JqZWN0U2l6ZSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYm94d2hpc2tlci5vYmplY3RTaXplID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvYmplY3RTaXplID0gXywgYm94d2hpc2tlcikgOiBvYmplY3RTaXplOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNwYWNlclNpemVcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNzcGFjZXJTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzcGFjZXJTaXplID0gdW5kZWZpbmVkXG4gICAqL1xuICBib3h3aGlza2VyLnNwYWNlclNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNwYWNlclNpemUgPSBfLCBib3h3aGlza2VyKSA6IHNwYWNlclNpemU7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdG9vbHRpcFxuICAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI3Rvb2x0aXB9KVxuICAgKiBAcGFyYW0ge3Rvb2x0aXB9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgdG9vbHRpcH1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdG9vbHRpcCA9IHRvb2x0aXAoKVxuICAgKi9cbiAgYm94d2hpc2tlci50b29sdGlwID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0b29sdGlwID0gXywgYm94d2hpc2tlcikgOiB0b29sdGlwOyB9O1xuXG5cbiAgZnVuY3Rpb24gYm94d2hpc2tlcigpIHtcbiAgICAvLyBmb3IgY29udmVuaWVuY2UgaW4gaGFuZGxpbmcgb3JpZW50YXRpb24gc3BlY2lmaWMgdmFsdWVzXG4gICAgdmFyIGhvcml6b250YWxRID0gKG9yaWVudCA9PSAnaG9yaXpvbnRhbCcpID8gdHJ1ZSA6IGZhbHNlXG4gICAgdmFyIHZlcnRpY2FsUSA9ICFob3Jpem9udGFsUVxuXG4gICAgLy8gYmFja2dyb3VuZCBjbGlwaW5nIHJlY3RhbmdsZVxuICAgIHZhciBiZ2NwUmVjdCA9IHt4OjAsIHk6MCwgd2lkdGg6IHNwYWNlWCwgaGVpZ2h0OnNwYWNlWX1cbiAgICB2YXIgY29udGFpbmVyID0gc2V0dXBDb250YWluZXIoIHNlbGVjdGlvbiwgbmFtZXNwYWNlLCBiZ2NwUmVjdCwgYmFja2dyb3VuZEZpbGwgKTtcblxuICAgIC8vIGlmIGdyb3VwaW5nIGlzIHVuZGVmaW5lZCBzb3J0IGtleXMgYnkgc29ydGluZyBmdW5jdFxuICAgIHZhciBvcmRlcmVkID0gKGdyb3VwaW5nID09IHVuZGVmaW5lZCkgPyBkMy5rZXlzKGRhdGEpLnNvcnQoc29ydGluZ0Z1bmN0aW9uKSA6IGdyb3VwaW5nXG4gICAgLy8gdG8gcHJldmVudCByZS1jYWxjdWxhdGlvbiBhbmQgZ2V0dGVycyB0byBiZSBwYXNzZWQgdG8gYXhlc1xuICAgIGJveEtleXMgPSBmbGF0dGVuKG9yZGVyZWQpXG4gICAgYm94VmFsdWVzID0gYm94S2V5cy5tYXAodmFsdWVFeHRyYWN0b3IpXG5cblxuICAgIHZhciBudW1iZXJPZk9iamVjdHMgPSBib3hLZXlzLmxlbmd0aFxuICAgIHZhciBleHRlbnQgPSBbXG4gICAgICBNYXRoLm1pbiguLi5ib3hWYWx1ZXMubWFwKGZ1bmN0aW9uKGQsaSl7cmV0dXJuIGRbcXVhcnRpbGVzS2V5c1swXV19KSkgLSBkb21haW5QYWRkaW5nLFxuICAgICAgTWF0aC5tYXgoLi4uYm94VmFsdWVzLm1hcChmdW5jdGlvbihkLGkpe3JldHVybiBkW3F1YXJ0aWxlc0tleXNbNF1dfSkpICsgZG9tYWluUGFkZGluZ1xuICAgIF07XG5cbiAgICAvLyBzZXQgdGhlIHNjYWxlXG4gICAgc2NhbGUuZG9tYWluKGV4dGVudCkucmFuZ2UoaG9yaXpvbnRhbFEgPyBbMCxzcGFjZVldIDogW3NwYWNlWCwgMF0pXG4gICAgdmFyIHNwYWNlID0gaG9yaXpvbnRhbFEgPyBzcGFjZVggOiBzcGFjZVlcbiAgICAvLyBjYWxjdWxhdGUgb2JqZWN0IHNpemVcbiAgICBvYmplY3RTaXplID0gY2FsY3VsYXRlV2lkdGhPZk9iamVjdChzcGFjZSwgbnVtYmVyT2ZPYmplY3RzLCBtaW5PYmplY3RTaXplLCBtYXhPYmplY3RTaXplLCBvYmplY3RTcGFjZXIsIG92ZXJmbG93USlcbiAgICAvLyBjYWxjdWxhdGUgc3BhY2VyIHNpemUgaWYgbmVlZGVkXG4gICAgc3BhY2VyU2l6ZSA9IGNhbGN1bGF0ZVdpZHRoT2ZTcGFjZXIoYm94S2V5cywgc3BhY2UsIG9iamVjdFNpemUsIG51bWJlck9mT2JqZWN0cywgb2JqZWN0U3BhY2VyLCBvdmVyZmxvd1EpXG4gICAgLy8gbWFrZSB0aGUgbmVzdGVkIGdyb3Vwc1xuICAgIHZhciBzcGFjZXJGdW5jdGlvbiA9IGdyb3VwaW5nU3BhY2VyKClcbiAgICAuaG9yaXpvbnRhbFEoaG9yaXpvbnRhbFEpLnNjYWxlKHNjYWxlKS5tb3ZlYnkoJ2NhdGVnb3J5JykubnVtYmVyT2ZPYmplY3RzKG51bWJlck9mT2JqZWN0cylcbiAgICAub2JqZWN0Q2xhc3Mob2JqZWN0Q2xhc3MpLm9iamVjdFNpemUob2JqZWN0U2l6ZSkuc3BhY2VyU2l6ZShzcGFjZXJTaXplKVxuICAgIC50cmFuc2l0aW9uRHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlRnVuYyhlYXNlRnVuYylcbiAgICAubmFtZXNwYWNlKG5hbWVzcGFjZSlcblxuICAgIC8vIG1vdmUgc3R1ZmZcbiAgICBzcGFjZXJGdW5jdGlvbihjb250YWluZXIsIG9yZGVyZWQsIDApXG5cbiAgICB2YXIgcGFyZW50SW5kZXhBcnJheSA9IFtdXG4gICAgY29udGFpbmVyLnNlbGVjdEFsbCgnZzpub3QoLnRvLXJlbW92ZSkuJytvYmplY3RDbGFzcylcbiAgICAuZWFjaChmdW5jdGlvbihkLCBpKXtpZiAoaGFzUShib3hLZXlzLCBkKSl7IHBhcmVudEluZGV4QXJyYXkucHVzaChOdW1iZXIoZDMuc2VsZWN0KHRoaXMpLmF0dHIoJ3BhcmVudC1pbmRleCcpKSl9fSlcblxuXG5cbiAgICBjb2xvckZ1bmN0aW9uID0gY29sb3JGdW5jdGlvbi5jb2xvckJ5KCkgPT0gJ2luZGV4J1xuICAgID8gY29sb3JGdW5jdGlvbi5kYXRhRXh0ZW50KFswLCBNYXRoLm1heCguLi5wYXJlbnRJbmRleEFycmF5KV0pXG4gICAgOiBjb2xvckZ1bmN0aW9uLmRhdGFFeHRlbnQoZXh0ZW50KVxuXG5cbiAgICAvLyBzZXQgYXR0cmlidXRlcyBmb3IgYm94IGFuZCB3aGlza2Vyc1xuICAgIGNvbnRhaW5lci5zZWxlY3RBbGwoJ2c6bm90KC50by1yZW1vdmUpLicrb2JqZWN0Q2xhc3MpLmVhY2goZnVuY3Rpb24oa2V5LCBpKSB7XG4gICAgICB2YXIgdCA9IGQzLnNlbGVjdCh0aGlzKSxcbiAgICAgIGN1cnJlbnREYXRhID0gZGF0YVtrZXldLFxuXG4gICAgICBxdWFydGlsZXMgPSB2YWx1ZUV4dHJhY3RvcihrZXksIGkpLFxuICAgICAgcTAgPSBxdWFydGlsZXNbcXVhcnRpbGVzS2V5c1swXV0sXG4gICAgICBxMSA9IHF1YXJ0aWxlc1txdWFydGlsZXNLZXlzWzFdXSxcbiAgICAgIHEyID0gcXVhcnRpbGVzW3F1YXJ0aWxlc0tleXNbMl1dLFxuICAgICAgcTMgPSBxdWFydGlsZXNbcXVhcnRpbGVzS2V5c1szXV0sXG4gICAgICBxNCA9IHF1YXJ0aWxlc1txdWFydGlsZXNLZXlzWzRdXVxuXG4gICAgICB2YXIgaSA9IHQuYXR0cigncGFyZW50LWluZGV4JykgPT0gdW5kZWZpbmVkID8gaSA6IHQuYXR0cigncGFyZW50LWluZGV4JyksXG4gICAgICBmaWxsQ29sb3IgPSBjb2xvckZ1bmN0aW9uKGtleSwgcTIsIGksICdmaWxsJyksIC8vIHByZXZlbnQgZHVwbGljYXRlIGNvbXB1dGF0aW9uXG4gICAgICBzdHJva2VDb2xvciA9IGNvbG9yRnVuY3Rpb24oa2V5LCBxMiwgaSwgICdzdHJva2UnKVxuXG5cbiAgICAgIHZhclxuICAgICAgd2hpc2sgPSBzYWZlU2VsZWN0KHQsICdnJywgJ3doaXNrZXInKSxcbiAgICAgIHVXaGlzayA9IHNhZmVTZWxlY3Qod2hpc2ssICdwYXRoJywgJ3VwcGVyJyksXG4gICAgICBsV2hpc2sgPSBzYWZlU2VsZWN0KHdoaXNrLCAncGF0aCcsICdsb3dlcicpLFxuICAgICAgcXVhcnQgPSBzYWZlU2VsZWN0KHQsICdnJywgJ3F1YXJ0aWxlJyksXG4gICAgICB1UXVhcnQgPSBzYWZlU2VsZWN0KHF1YXJ0LCAncmVjdCcsICd1cHBlcicpLFxuICAgICAgbFF1YXJ0ID0gc2FmZVNlbGVjdChxdWFydCwgJ3JlY3QnLCAnbG93ZXInKSxcbiAgICAgIG1RdWFydCA9IHNhZmVTZWxlY3QocXVhcnQsICdjaXJjbGUnLCAnbWVkaWFuJylcblxuXG4gICAgICAvLyBzZXQgdXBwZXIgcXVhcnRpbGUgKHEzKVxuICAgICAgdVF1YXJ0LnRyYW5zaXRpb24oKS5kdXJhdGlvbih0cmFuc2l0aW9uRHVyYXRpb24pLmVhc2UoZWFzZUZ1bmMpXG4gICAgICAuYXR0cignd2lkdGgnLCBob3Jpem9udGFsUSA/IG9iamVjdFNpemUgOiBzY2FsZShxMykgLSBzY2FsZShxMikpXG4gICAgICAuYXR0cignaGVpZ2h0JywgdmVydGljYWxRID8gb2JqZWN0U2l6ZSA6IHNjYWxlKHEzKSAtIHNjYWxlKHEyKSlcbiAgICAgIC5hdHRyKCdmaWxsJywgZmlsbENvbG9yKVxuICAgICAgLmF0dHIoJ3N0cm9rZScsIHN0cm9rZUNvbG9yKVxuICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIGJveFN0cm9rZVdpZHRoKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uKGQsIGkpe1xuICAgICAgICB2YXJcbiAgICAgICAgeCA9IGhvcml6b250YWxRID8gMCA6IHNjYWxlKHEyKSxcbiAgICAgICAgeSA9IHZlcnRpY2FsUSA/IDAgOiBzY2FsZShleHRlbnRbMV0pIC0gc2NhbGUocTMpLFxuICAgICAgICB0ID0gJ3RyYW5zbGF0ZSgnK3grJywnK3krJyknXG4gICAgICAgIHJldHVybiB0XG4gICAgICB9KVxuXG4gICAgICAvLyBzZXQgbG93ZXIgcXVhcnRpbGUgKHExKVxuICAgICAgbFF1YXJ0LnRyYW5zaXRpb24oKS5kdXJhdGlvbih0cmFuc2l0aW9uRHVyYXRpb24pLmVhc2UoZWFzZUZ1bmMpXG4gICAgICAuYXR0cignd2lkdGgnLCBob3Jpem9udGFsUSA/IG9iamVjdFNpemUgOiBzY2FsZShxMikgLSBzY2FsZShxMSkpXG4gICAgICAuYXR0cignaGVpZ2h0JywgdmVydGljYWxRID8gb2JqZWN0U2l6ZSA6IHNjYWxlKHEyKSAtIHNjYWxlKHExKSlcbiAgICAgIC5hdHRyKCdmaWxsJywgZmlsbENvbG9yKVxuICAgICAgLmF0dHIoJ3N0cm9rZScsIHN0cm9rZUNvbG9yKVxuICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIGJveFN0cm9rZVdpZHRoKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uKGQsIGkpe1xuICAgICAgICB2YXJcbiAgICAgICAgeCA9IGhvcml6b250YWxRID8gMCA6IHNjYWxlKHExKSxcbiAgICAgICAgeSA9IHZlcnRpY2FsUSA/IDAgOiBzY2FsZShleHRlbnRbMV0pIC0gc2NhbGUocTIpLFxuICAgICAgICB0ID0gJ3RyYW5zbGF0ZSgnK3grJywnK3krJyknXG4gICAgICAgIHJldHVybiB0XG4gICAgICB9KVxuXG5cbiAgICAgIC8vIHNldCBtZWRpYW4gKHEyKVxuICAgICAgbVF1YXJ0LnRyYW5zaXRpb24oKS5kdXJhdGlvbih0cmFuc2l0aW9uRHVyYXRpb24pLmVhc2UoZWFzZUZ1bmMpXG4gICAgICAuYXR0cigncicsIGZ1bmN0aW9uKGQsIGkpe1xuICAgICAgICB2YXIgciA9IG9iamVjdFNpemUgLyAyXG4gICAgICAgIHZhciBkaWYgPSAoc2NhbGUocTMpIC0gc2NhbGUocTEpKSAvIDJcbiAgICAgICAgcmV0dXJuIChyID4gZGlmKSA/IGRpZiA6IHJcbiAgICAgIH0pXG4gICAgICAuYXR0cignZmlsbCcsIGZpbGxDb2xvcilcbiAgICAgIC5hdHRyKCdzdHJva2UnLCBzdHJva2VDb2xvcilcbiAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCBib3hTdHJva2VXaWR0aClcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbihkLCBpKXtcbiAgICAgICAgdmFyXG4gICAgICAgIHggPSBob3Jpem9udGFsUSA/IG9iamVjdFNpemUgLyAyIDogc2NhbGUocTIpLFxuICAgICAgICB5ID0gdmVydGljYWxRID8gb2JqZWN0U2l6ZSAvIDIgOiBzY2FsZShleHRlbnRbMV0pIC0gc2NhbGUocTIpLFxuICAgICAgICB0ID0gJ3RyYW5zbGF0ZSgnK3grJywnK3krJyknXG4gICAgICAgIHJldHVybiB0XG4gICAgICB9KVxuXG4gICAgICAvLyBzZXQgbG93ZXIgd2hpc2tlciAobWluKVxuICAgICAgbFdoaXNrLnRyYW5zaXRpb24oKS5kdXJhdGlvbih0cmFuc2l0aW9uRHVyYXRpb24pLmVhc2UoZWFzZUZ1bmMpXG4gICAgICAuYXR0cignZCcsIGZ1bmN0aW9uKGRkLCBpaSl7XG4gICAgICAgIHZhclxuICAgICAgICBkaXIgPSBmYWxzZSxcbiAgICAgICAgeCA9IDAsXG4gICAgICAgIHkgPSAwLFxuICAgICAgICBoID0gaG9yaXpvbnRhbFEgPyBzY2FsZShxMSkgLSBzY2FsZShxMCkgOiBvYmplY3RTaXplLFxuICAgICAgICB3ID0gdmVydGljYWxRID8gc2NhbGUocTEpIC0gc2NhbGUocTApIDogb2JqZWN0U2l6ZVxuICAgICAgICByZXR1cm4gd2hpc2tlclBhdGgoZGlyLCB4LCB5LCB3LCBoLCB3aGlza2VyV2lkdGhQZXJjZW50LCBvcmllbnQpXG4gICAgICB9KVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uKGQsIGkpe1xuICAgICAgICB2YXJcbiAgICAgICAgeCA9IGhvcml6b250YWxRID8gMCA6IHNjYWxlKHExKSxcbiAgICAgICAgeSA9IHZlcnRpY2FsUSA/IDAgOiBzY2FsZShleHRlbnRbMV0pIC0gc2NhbGUocTEpLFxuICAgICAgICB0ID0gJ3RyYW5zbGF0ZSgnK3grJywnK3krJyknXG4gICAgICAgIHJldHVybiB0XG4gICAgICB9KVxuICAgICAgLmF0dHIoJ3N0cm9rZScsICdibGFjaycpLmF0dHIoJ3N0cm9rZS13aWR0aCcsIHdoaXNrZXJTdHJva2VXaWR0aClcbiAgICAgIC5hdHRyKCdmaWxsJywgJ25vbmUnKVxuXG4gICAgICAvLyBzZXQgdXBwZXIgd2hpc2tlciAobWF4KVxuICAgICAgdVdoaXNrLnRyYW5zaXRpb24oKS5kdXJhdGlvbih0cmFuc2l0aW9uRHVyYXRpb24pLmVhc2UoZWFzZUZ1bmMpXG4gICAgICAuYXR0cignZCcsIGZ1bmN0aW9uKGRkLCBpaSl7XG4gICAgICAgIHZhclxuICAgICAgICBkaXIgPSB0cnVlLFxuICAgICAgICB4ID0gMCxcbiAgICAgICAgeSA9IDAsXG4gICAgICAgIGggPSBob3Jpem9udGFsUSA/IHNjYWxlKHE0KSAtIHNjYWxlKHEzKSA6IG9iamVjdFNpemUsXG4gICAgICAgIHcgPSB2ZXJ0aWNhbFEgPyBzY2FsZShxNCkgLSBzY2FsZShxMykgOiBvYmplY3RTaXplXG4gICAgICAgIHJldHVybiB3aGlza2VyUGF0aChkaXIsIHgsIHksIHcsIGgsIHdoaXNrZXJXaWR0aFBlcmNlbnQsIG9yaWVudClcbiAgICAgIH0pXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24oZCwgaSl7XG4gICAgICAgIHZhclxuICAgICAgICB4ID0gaG9yaXpvbnRhbFEgPyAwIDogc2NhbGUocTMpLFxuICAgICAgICB5ID0gdmVydGljYWxRID8gMCA6ICBzY2FsZShleHRlbnRbMV0pIC0gc2NhbGUocTQpLFxuICAgICAgICB0ID0gJ3RyYW5zbGF0ZSgnK3grJywnK3krJyknXG4gICAgICAgIHJldHVybiB0XG4gICAgICB9KVxuICAgICAgLmF0dHIoJ3N0cm9rZScsICdibGFjaycpXG4gICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgd2hpc2tlclN0cm9rZVdpZHRoKVxuICAgICAgLmF0dHIoJ2ZpbGwnLCAnbm9uZScpXG5cbiAgICB9KVxuXG4gICAgdG9vbHRpcC5zZWxlY3Rpb24oY29udGFpbmVyLnNlbGVjdEFsbCgnZzpub3QoLnRvLXJlbW92ZSkuJytvYmplY3RDbGFzcykpXG4gICAgLmRhdGEoZGF0YSlcblxuICAgIHRvb2x0aXAoKVxuXG5cbiAgfVxuXG4gIHJldHVybiBib3h3aGlza2VyXG59XG4iLCJpbXBvcnQge2h5cGVuYXRlLCBzYWZlU2VsZWN0fSBmcm9tICcuL2hlbHBlcnMnO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFUQVRPR0dMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqXG4gKiBDcmVhdGVzIGEgZGF0YXRvZ2dsZVxuICogQGNvbnN0cnVjdG9yIGRhdGF0b2dnbGVcbiAqIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBzZWxlY3Rpb25cbiAqIEBuYW1lc3BhY2UgZGF0YXRvZ2dsZVxuICogQHJldHVybnMge2Z1bmN0aW9ufSBkYXRhdG9nZ2xlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkYXRhdG9nZ2xlKCBzZWxlY3Rpb24gKSB7XG4gIHZhclxuICAvKipcbiAgKiBLZXlzIHRvIG1ha2UgdG9nZ2xlLWFibGUgb3B0aW9uc1xuICAqIChzZWUge0BsaW5rIGRhdGF0b2dnbGUja2V5c30pXG4gICogQHBhcmFtIHtzdHJpbmdbXX0gW2tleXM9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBkYXRhdG9nZ2xlI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBrZXlzLFxuICAvKipcbiAgKiBXaGF0IHRvIGRvIHdoZW4gYSBkaWZmZXJlbnQga2V5IGlzIGNsaWNrZWRcbiAgKiAoc2VlIHtAbGluayBkYXRhdG9nZ2xlI3VwZGF0ZUZ1bmN0aW9ufSlcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbdXBkYXRlRnVuY3Rpb249ZnVuY3Rpb24oKXt9XVxuICAqIEBtZW1iZXJvZiBkYXRhdG9nZ2xlI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB1cGRhdGVGdW5jdGlvbiA9IGZ1bmN0aW9uKCl7fSxcbiAgLyoqXG4gICogTmFtZXNwYWNlIGZvciBhbGwgaXRlbXMgbWFkZSBieSB0aGlzIGluc3RhbmNlIG9mIGRhdGF0b2dnbGVcbiAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVzcGFjZT1cImQzc20tZGF0YWJhclwiXVxuICAqIEBtZW1iZXJvZiBkYXRhdG9nZ2xlI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBuYW1lc3BhY2U9J2Qzc20tZGF0YWJhcicsXG4gIC8qKlxuICAqIEN1cnJlbnRseSB0b2dnbGVkIGtleVxuICAqIEBwYXJhbSB7c3RyaW5nfSBbY3VycmVudEtleT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGRhdGF0b2dnbGUjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGN1cnJlbnRLZXlcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBrZXlzXG4gICAqIChzZWUge0BsaW5rIGRhdGF0b2dnbGUja2V5c30pXG4gICAqIEBmdW5jdGlvbiBkYXRhdG9nZ2xlLmtleXNcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2RhdGF0b2dnbGUgfCBzdHJpbmdbXX1cbiAgICogQG1lbWJlcm9mIGRhdGF0b2dnbGVcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQga2V5cyA9IHVuZGVmaW5lZFxuICAgKi9cbiAgdG9nZ2xlLmtleXMgPSBmdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChrZXlzID0gXywgdG9nZ2xlKSA6IGtleXN9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdXBkYXRlRnVuY3Rpb25cbiAgICogKHNlZSB7QGxpbmsgZGF0YXRvZ2dsZSN1cGRhdGVGdW5jdGlvbn0pXG4gICAqIEBmdW5jdGlvbiBkYXRhdG9nZ2xlLnVwZGF0ZUZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtkYXRhdG9nZ2xlIHwgZnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiBkYXRhdG9nZ2xlXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHVwZGF0ZUZ1bmN0aW9uID0gZnVuY3Rpb24oKXt9XG4gICAqL1xuICB0b2dnbGUudXBkYXRlRnVuY3Rpb24gPSBmdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh1cGRhdGVGdW5jdGlvbiA9IF8sIHRvZ2dsZSkgOiB1cGRhdGVGdW5jdGlvbn1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBuYW1lc3BhY2VcbiAgICogKHNlZSB7QGxpbmsgZGF0YXRvZ2dsZSNuYW1lc3BhY2V9KVxuICAgKiBAZnVuY3Rpb24gZGF0YXRvZ2dsZS5uYW1lc3BhY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtkYXRhdG9nZ2xlIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgZGF0YXRvZ2dsZVxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBuYW1lc3BhY2UgPSAnZDNzbS1kYXRhYmFyJ1xuICAgKi9cbiAgdG9nZ2xlLm5hbWVzcGFjZSA9IGZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG5hbWVzcGFjZSA9IF8sIHRvZ2dsZSkgOiBuYW1lc3BhY2V9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgY3VycmVudEtleVxuICAgKiAoc2VlIHtAbGluayBkYXRhdG9nZ2xlI2N1cnJlbnRLZXl9KVxuICAgKiBAZnVuY3Rpb24gZGF0YXRvZ2dsZS5jdXJyZW50S2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7ZGF0YXRvZ2dsZSB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGRhdGF0b2dnbGVcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgY3VycmVudEtleSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgdG9nZ2xlLmN1cnJlbnRLZXkgPSBmdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjdXJyZW50S2V5ID0gXywgdG9nZ2xlKSA6IGN1cnJlbnRLZXl9XG5cbiAgZnVuY3Rpb24gdG9nZ2xlKCkge1xuICAgIC8vIHNlbGVjdGlvbiBvcHRpb25zXG4gICAgdmFyIGRhdGFvcHRzID0gc2VsZWN0aW9uLnNlbGVjdEFsbCgnZGl2LmRhdGEtb3B0aW9uJylcbiAgICAvLyByZW1vdmUgZXhjZXNzXG4gICAgZGF0YW9wdHMuZXhpdCgpLnJlbW92ZSgpXG4gICAgLy8gYmluZCBkYXRhXG4gICAgZGF0YW9wdHMgPSBkYXRhb3B0cy5kYXRhKGtleXMpXG4gICAgLy8gZW50ZXJcbiAgICB2YXIgZG9FbnRlciA9IGRhdGFvcHRzLmVudGVyKCkuYXBwZW5kKCdkaXYnKS5hdHRyKCdjbGFzcycsICdkYXRhLW9wdGlvbicpXG4gICAgLmNsYXNzZWQoJ2Zvcm0tY2hlY2sgZm9ybS1jaGVjay1pbmxpbmUgYWxpZ24tbWlkZGxlJywgdHJ1ZSlcbiAgICBkb0VudGVyXG4gICAgLmFwcGVuZCgnaW5wdXQnKS5hdHRyKCd0eXBlJywgJ3JhZGlvJylcbiAgICAuYXR0cignaWQnLCBmdW5jdGlvbihkLGkpe3JldHVybiBoeXBlbmF0ZShuYW1lc3BhY2UsIGQpfSlcbiAgICAuYXR0cignbmFtZScsIGh5cGVuYXRlKG5hbWVzcGFjZSwgJ2RhdGFiYXInKSlcbiAgICAuYXR0cigndmFsdWUnLCBmdW5jdGlvbihkLCBpKXtyZXR1cm4gZH0pXG5cbiAgICBkb0VudGVyXG4gICAgLmFwcGVuZCgnbGFiZWwnKVxuICAgIC5hdHRyKCdmb3InLCBmdW5jdGlvbihkLGkpe3JldHVybiBoeXBlbmF0ZShuYW1lc3BhY2UsIGQpfSlcbiAgICAuYXR0cignbmFtZScsIGh5cGVuYXRlKG5hbWVzcGFjZSwgJ2RhdGFiYXInKSlcbiAgICAudGV4dChmdW5jdGlvbihkLCBpKXtyZXR1cm4gZH0pXG5cbiAgICBkYXRhb3B0cyA9IGRhdGFvcHRzLm1lcmdlKGRvRW50ZXIpXG5cbiAgICBjdXJyZW50S2V5ID0gZGF0YW9wdHMuc2VsZWN0KCc6Y2hlY2tlZCcpLmVtcHR5KClcbiAgICA/IGtleXNbMF1cbiAgICA6IGRhdGFvcHRzLnNlbGVjdCgnOmNoZWNrZWQnKS5kYXR1bSgpXG5cbiAgICAvLyBjaGVjayBjdXJyZW50XG4gICAgZGF0YW9wdHMuc2VsZWN0KCdbdmFsdWU9XCInK2N1cnJlbnRLZXkrJ1wiXScpLnByb3BlcnR5KCdjaGVja2VkJywgdHJ1ZSlcblxuICAgIC8vIGJpbmQgdXBkYXRlIGZ1bmN0aW9uXG4gICAgZGF0YW9wdHMub24oJ2NsaWNrJywgZnVuY3Rpb24oZCwgaSl7IHVwZGF0ZUZ1bmN0aW9uKCkgfSlcbiAgICByZXR1cm4gdG9nZ2xlXG4gIH1cblxuICByZXR1cm4gdG9nZ2xlXG59XG4iLCJpbXBvcnQge2h5cGVuYXRlLCBzYWZlU2VsZWN0fSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHtzZXR1cENvbnRhaW5lciwgY2FsY3VsYXRlV2lkdGhPZk9iamVjdCwgY2FsY3VsYXRlV2lkdGhPZlNwYWNlcn0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge3VuaXF1ZSwgZmxhdHRlbn0gZnJvbSAnLi9hcnJheS1mdW5jdGlvbnMnO1xuaW1wb3J0IHtncm91cGluZ1NwYWNlcn0gZnJvbSAnLi9ncm91cGluZy1zcGFjZXInO1xuaW1wb3J0IHtjb2xvckZ1bmN0aW9uIGFzIENGfSBmcm9tICcuL2NvbG9yLWZ1bmN0aW9uJztcbmltcG9ydCB7dG9vbHRpcCBhcyBUVGlwfSBmcm9tICcuL3Rvb2x0aXAnO1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0FUVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKlxuICogQ3JlYXRlcyBhIHNjYXR0ZXJcbiAqXG4gKiB7QGxpbmsgaHR0cHM6Ly9zdW1uZXVyb24uZ2l0bGFiLmlvL2Qzc20vZGVtb3Mvc2NhdHRlci9pbmRleC5odG1sIERlbW99XG4gKiBAY29uc3RydWN0b3Igc2NhdHRlclxuICogQHBhcmFtIHtkMy5zZWxlY3Rpb259IHNlbGVjdGlvblxuICogQG5hbWVzcGFjZSBzY2F0dGVyXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259IHNjYXR0ZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjYXR0ZXIgKCBzZWxlY3Rpb24gKSB7XG5cbiAgdmFyXG4gIC8qKlxuICAqIERhdGEgdG8gcGxvdC4gQXNzdW1lZCB0byBiZSBhIG9iamVjdCwgd2hlcmUgZWFjaCBrZXkgY29ycmVzcG9uZHMgdG8gYSBwb2ludFxuICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjZGF0YX0pXG4gICogQHBhcmFtIHtPYmplY3R9IFtkYXRhPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZGF0YSxcbiAgLyoqXG4gICogQW1vdW50IG9mIGhvcml6b250YWwgc3BhY2UgKGluIHBpeGVscykgYXZhaWJsZSB0byByZW5kZXIgdGhlIHNjYXR0ZXIgaW5cbiAgKiAoc2VlIHtAbGluayBzY2F0dGVyI3NwYWNlWH0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZVg9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzcGFjZVgsXG4gIC8qKlxuICAqIEFtb3VudCBvZiB2ZXJ0aWNhbCBzcGFjZSAoaW4gcGl4ZWxzKSBhdmFpYmxlIHRvIHJlbmRlciB0aGUgc2NhdHRlciBpblxuICAqIChzZWUge0BsaW5rIHNjYXR0ZXIuc3BhY2VZfSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW3NwYWNlWT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNwYWNlWSxcblxuICAvKipcbiAgKiBUaGUgc2NhbGUgZm9yIHdoaWNoIHNjYXR0ZXIgeCB2YWx1ZXMgc2hvdWxkIGJlIHRyYW5zZm9ybWVkIGJ5XG4gICogQHBhcmFtIHtkMy5zY2FsZX0gW3NjYWxlWD1kMy5zY2FsZUxpbmVhcl1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc2NhbGVYID0gZDMuc2NhbGVMaW5lYXIoKSxcbiAgLyoqXG4gICogVGhlIHBhZGRpbmcgZm9yIHRoZSBkb21haW4gb2YgdGhlIHNjYWxlWCAoc2VlIHtAbGluayBzY2F0dGVyI3NjYWxlWH0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtkb21haW5QYWRkaW5nWD0wLjVdXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGRvbWFpblBhZGRpbmdYID0gMC41LFxuICAvKipcbiAgKiBUaGUgZnVuY3Rpb24gZm9yIGdldHRpbmcgdGhlIHggdmFsdWUgb2YgdGhlIGN1cnJlbnQgcG9pbnRcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbdmFsdWVFeHRyYWN0b3JYPWZ1bmN0aW9uKGQsIGkpe3JldHVybiBkYXRhW2RdWyd4J119XVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB2YWx1ZUV4dHJhY3RvclggPSBmdW5jdGlvbihkLCBpKSB7cmV0dXJuIGRhdGFbZF1bJ3gnXX0sXG5cbiAgLyoqXG4gICogVGhlIHNjYWxlIGZvciB3aGljaCBzY2F0dGVyIHkgdmFsdWVzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBieVxuICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtzY2FsZVk9ZDMuc2NhbGVMaW5lYXJdXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNjYWxlWSA9IGQzLnNjYWxlTGluZWFyKCksXG4gIC8qKlxuICAqIFRoZSBwYWRkaW5nIGZvciB0aGUgZG9tYWluIG9mIHRoZSBzY2FsZVkgKHNlZSB7QGxpbmsgc2NhdHRlciNzY2FsZVl9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbZG9tYWluUGFkZGluZ1k9MC41XVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBkb21haW5QYWRkaW5nWSA9IDAuNSxcbiAgLyoqXG4gICogVGhlIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHRoZSB5IHZhbHVlIG9mIHRoZSBjdXJyZW50IHBvaW50XG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW3ZhbHVlRXh0cmFjdG9yWT1mdW5jdGlvbihkLCBpKXtyZXR1cm4gZGF0YVtkXVsneSddfV1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdmFsdWVFeHRyYWN0b3JZID0gZnVuY3Rpb24oZCwgaSkge3JldHVybiBkYXRhW2RdWyd5J119LFxuXG5cbiAgLyoqXG4gICogVGhlIHNjYWxlIGZvciB3aGljaCBzY2F0dGVyIHIgdmFsdWVzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBieVxuICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtzY2FsZVI9ZDMuc2NhbGVMaW5lYXJdXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNjYWxlUiA9IGQzLnNjYWxlTGluZWFyKCksXG4gIC8qKlxuICAqIFRoZSBwYWRkaW5nIGZvciB0aGUgZG9tYWluIG9mIHRoZSBzY2FsZVIgKHNlZSB7QGxpbmsgc2NhdHRlciNzY2FsZVJ9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbZG9tYWluUGFkZGluZ1I9MC41XVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBkb21haW5QYWRkaW5nUiA9IDAuNSxcbiAgLyoqXG4gICogVGhlIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHRoZSByIHZhbHVlIG9mIHRoZSBjdXJyZW50IHBvaW50XG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW3ZhbHVlRXh0cmFjdG9yUj1mdW5jdGlvbihkLCBpKXtyZXR1cm4gMn1dXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHZhbHVlRXh0cmFjdG9yUiA9IGZ1bmN0aW9uKGQsIGkpIHtyZXR1cm4gMn0sXG4gIC8qKlxuICAqIFRoZSBtaW4gcmFkaXVzIGEgcG9pbnQgY2FuIGhhdmVcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbbWluUmFkaXVzPTJdXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG1pblJhZGl1cyA9IDIsXG4gIC8qKlxuICAqIFRoZSBtaW4gcmFkaXVzIGEgcG9pbnQgY2FuIGhhdmVcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbbWF4UmFkaXVzPTEwXVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBtYXhSYWRpdXMgPSAxMCxcblxuICAvKipcbiAgKiBUaGUgc3Ryb2tlIHdpZHRoIG9mIHRoZSBwb2ludHNcbiAgKiBAcGFyYW0ge251bWJlcn0gW3BvaW50U3Ryb2tlV2lkdGg9Ml1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgcG9pbnRTdHJva2VXaWR0aCA9IDIsXG4gIC8qKlxuICAqIEluc3RhbmNlIG9mIENvbG9yRnVuY3Rpb25cbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbY29sb3JGdW5jdGlvbiA9IGNvbG9yRnVuY3Rpb24oKV1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgY29sb3JGdW5jdGlvbiA9IENGKCksXG4gIC8qKlxuICAqIENvbG9yIG9mIHRoZSBiYWNrZ3JvdW5kXG4gICogQHBhcmFtIHtzdHJpbmd9IFtiYWNrZ3JvdW5kRmlsbD1cInRyYW5zcGFyZW50XCJdXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGJhY2tncm91bmRGaWxsID0gJ3RyYW5zcGFyZW50JyxcbiAgLyoqXG4gICogTmFtZXNwYWNlIGZvciBhbGwgaXRlbXMgbWFkZSBieSB0aGlzIGluc3RhbmNlIG9mIHNjYXR0ZXJcbiAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVzcGFjZT1cImQzc20tc2NhdHRlclwiXVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBuYW1lc3BhY2UgPSAnZDNzbS1zY2F0dGVyJyxcbiAgLyoqXG4gICogQ2xhc3MgbmFtZSBmb3Igc2NhdHRlciBjb250YWluZXIgKDxjaXJjbGU+IGVsZW1lbnQpXG4gICogQHBhcmFtIHtzdHJpbmd9IFtvYmplY3RDbGFzcz1cInNjYXR0ZXItcG9pbnRcIl1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb2JqZWN0Q2xhc3MgPSAnc2NhdHRlci1wb2ludCcsXG4gIC8qKlxuICAqIER1cmF0aW9uIG9mIGFsbCB0cmFuc2l0aW9ucyBvZiB0aGlzIGVsZW1lbnRcbiAgKiBAcGFyYW0ge251bWJlcn0gW3RyYW5zaXRpb25EdXJhdGlvbj0xMDAwXVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB0cmFuc2l0aW9uRHVyYXRpb24gPSAxMDAwLFxuICAvKipcbiAgKiBFYXNpbmcgZnVuY3Rpb24gZm9yIHRyYW5zaXRpb25zXG4gICogQHBhcmFtIHtkMy5lYXNlfSBbZWFzZUZ1bmM9ZDMuZWFzZUV4cF1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZWFzZUZ1bmMgPSBkMy5lYXNlRXhwLFxuXG4gIC8vIHVzZWZ1bCB2YWx1ZXMgdG8gZXh0cmFjdCB0byBwcmV2ZW50IHJlLWNhbGN1bGF0aW9uXG4gIC8qKlxuICAqIFRoZSBrZXlzIG9mIHRoZSBwb2ludHNcbiAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbcG9pbnRLZXlzPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgcG9pbnRLZXlzLFxuICAvKipcbiAgKiBUaGUgeCB2YWx1ZXMgb2YgdGhlIHBvaW50c1xuICAqIEBwYXJhbSB7bnVtYmVyW119IFt2YWx1ZXNYPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdmFsdWVzWCxcbiAgLyoqXG4gICogVGhlIHkgdmFsdWVzIG9mIHRoZSBwb2ludHNcbiAgKiBAcGFyYW0ge251bWJlcltdfSBbdmFsdWVzWT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHZhbHVlc1ksXG4gIC8qKlxuICAqIFRoZSByIHZhbHVlcyBvZiB0aGUgcG9pbnRzXG4gICogQHBhcmFtIHtudW1iZXJbXX0gW3ZhbHVlc1I9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB2YWx1ZXNSLFxuXG4gIC8qKlxuICAqIEluc3RhbmNlIG9mIFRvb2x0aXBcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbdG9vbHRpcD10b29sdGlwKCldXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHRvb2x0aXAgPSBUVGlwKClcblxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBzZWxlY3Rpb24gaW4gd2hpY2ggaXRlbXMgYXJlIG1hbmlwdWxhdGVkXG4gICAqIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IGQzLnNlbGVjdGlvbn1cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc2VsZWN0aW9uID0gc2VsZWN0aW9uXG4gICAqL1xuICBzY2F0dGVyLnNlbGVjdGlvbiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2VsZWN0aW9uID1fLCBzY2F0dGVyKSA6IHNlbGVjdGlvbn1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgZGF0YVxuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI2RhdGF9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBvYmplY3R9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKi9cbiAgc2NhdHRlci5kYXRhID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkYXRhID1fLCBzY2F0dGVyKSA6IGRhdGF9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGFtb3VudCBvZiBob3Jpem9udGFsIHNwYWNlIGluIHdoaWNoIGl0ZW1zIGFyZSBtYW5pcHVsYXRlZFxuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI3NwYWNlWH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXSBzaG91bGQgYmUgYSBudW1iZXIgPiAwXG4gICAqIEByZXR1cm5zIHtzY2F0dGVyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzcGFjZVggPSB1bmRlZmluZWRcbiAgICovXG4gIHNjYXR0ZXIuc3BhY2VYID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzcGFjZVggPV8sIHNjYXR0ZXIpIDogc3BhY2VYfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBhbW91bnQgb2YgdmVydGljYWwgc3BhY2UgaW4gd2hpY2ggaXRlbXMgYXJlIG1hbmlwdWxhdGVkXG4gICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjc3BhY2VZfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdIHNob3VsZCBiZSBhIG51bWJlciA+IDBcbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNwYWNlWSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgc2NhdHRlci5zcGFjZVkgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNwYWNlWSA9Xywgc2NhdHRlcikgOiBzcGFjZVl9XG5cblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgeCBzY2FsZSBmb3Igd2hpY2ggdGhlIHNjYXR0ZXIgeCB2YWx1ZXMgc2hvdWxkIGJlIHRyYW5zZm9ybWVkIGJ5XG4gICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjc2NhbGVYfSlcbiAgICogQHBhcmFtIHtkMy5zY2FsZX0gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBkMy5zY2FsZX1cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc2NhbGVYID0gZDMuc2NhbGVMaW5lYXIoKVxuICAgKi9cbiAgc2NhdHRlci5zY2FsZVggPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNjYWxlWCA9Xywgc2NhdHRlcikgOiBzY2FsZVh9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgcGFkZGluZyBmb3IgdGhlIGRvbWFpbiBvZiB0aGUgeCBzY2FsZVxuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI2RvbWFpblBhZGRpbmdYfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtzY2F0dGVyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBkb21haW5QYWRkaW5nWCA9IDAuNVxuICAgKi9cbiAgc2NhdHRlci5kb21haW5QYWRkaW5nWCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluUGFkZGluZ1ggPV8sIHNjYXR0ZXIpIDogZG9tYWluUGFkZGluZ1h9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdmFsdWVFeHRyYWN0b3JYXG4gICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjdmFsdWVFeHRyYWN0b3JYfSlcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBmdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdmFsdWVFeHRyYWN0b3JYID0gZnVuY3Rpb24oa2V5LCBpbmRleCkgeyByZXR1cm4gZGF0YVtrZXldWyd4J10gfVxuICAgKi9cbiAgc2NhdHRlci52YWx1ZUV4dHJhY3RvclggPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZhbHVlRXh0cmFjdG9yWCA9Xywgc2NhdHRlcikgOiB2YWx1ZUV4dHJhY3Rvclh9XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHkgc2NhbGUgZm9yIHdoaWNoIHRoZSBzY2F0dGVyIHkgdmFsdWVzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBieVxuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI3NjYWxlWX0pXG4gICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtzY2F0dGVyIHwgZDMuc2NhbGV9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNjYWxlWSA9IGQzLnNjYWxlTGluZWFyKClcbiAgICovXG4gIHNjYXR0ZXIuc2NhbGVZID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzY2FsZVkgPV8sIHNjYXR0ZXIpIDogc2NhbGVZfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHBhZGRpbmcgZm9yIHRoZSBkb21haW4gb2YgdGhlIHkgc2NhbGVcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciNkb21haW5QYWRkaW5nWX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgZG9tYWluUGFkZGluZ1kgPSAwLjVcbiAgICovXG4gIHNjYXR0ZXIuZG9tYWluUGFkZGluZ1kgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpblBhZGRpbmdZID1fLCBzY2F0dGVyKSA6IGRvbWFpblBhZGRpbmdZfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHZhbHVlRXh0cmFjdG9yWVxuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI3ZhbHVlRXh0cmFjdG9yWX0pXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtzY2F0dGVyIHwgZnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHZhbHVlRXh0cmFjdG9yWSA9IGZ1bmN0aW9uKGtleSwgaW5kZXgpIHsgcmV0dXJuIGRhdGFba2V5XVsneSddIH1cbiAgICovXG4gIHNjYXR0ZXIudmFsdWVFeHRyYWN0b3JZID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2YWx1ZUV4dHJhY3RvclkgPV8sIHNjYXR0ZXIpIDogdmFsdWVFeHRyYWN0b3JZfVxuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSByIHNjYWxlIGZvciB3aGljaCB0aGUgc2NhdHRlciByIHZhbHVlcyBzaG91bGQgYmUgdHJhbnNmb3JtZWQgYnlcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciNzY2FsZVJ9KVxuICAgKiBAcGFyYW0ge2QzLnNjYWxlfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IGQzLnNjYWxlfVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzY2FsZVIgPSBkMy5zY2FsZUxpbmVhcigpXG4gICAqL1xuICBzY2F0dGVyLnNjYWxlUiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2NhbGVSID1fLCBzY2F0dGVyKSA6IHNjYWxlUn1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBwYWRkaW5nIGZvciB0aGUgZG9tYWluIG9mIHRoZSByIHNjYWxlXG4gICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjZG9tYWluUGFkZGluZ1J9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGRvbWFpblBhZGRpbmdSID0gMC41XG4gICAqL1xuICBzY2F0dGVyLmRvbWFpblBhZGRpbmdSID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkb21haW5QYWRkaW5nUiA9Xywgc2NhdHRlcikgOiBkb21haW5QYWRkaW5nUn1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB2YWx1ZUV4dHJhY3RvclJcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciN2YWx1ZUV4dHJhY3RvclJ9KVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IGZ1bmN0aW9ufVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB2YWx1ZUV4dHJhY3RvclIgPSBmdW5jdGlvbihrZXksIGluZGV4KSB7IHJldHVybiBkYXRhW2tleV1bJ3InXSB9XG4gICAqL1xuICBzY2F0dGVyLnZhbHVlRXh0cmFjdG9yUiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmFsdWVFeHRyYWN0b3JSID1fLCBzY2F0dGVyKSA6IHZhbHVlRXh0cmFjdG9yUn1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBtaW5SYWRpdXNcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciNtaW5SYWRpdXN9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG1pblJhZGl1cyA9IDJcbiAgICovXG4gIHNjYXR0ZXIubWluUmFkaXVzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChtaW5SYWRpdXMgPV8sIHNjYXR0ZXIpIDogbWluUmFkaXVzfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG1heFJhZGl1c1xuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI21heFJhZGl1c30pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgbWF4UmFkaXVzID0gMTBcbiAgICovXG4gIHNjYXR0ZXIubWF4UmFkaXVzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChtYXhSYWRpdXMgPV8sIHNjYXR0ZXIpIDogbWF4UmFkaXVzfVxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgcG9pbnRTdHJva2VXaWR0aFxuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI3BvaW50U3Ryb2tlV2lkdGh9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHBvaW50U3Ryb2tlV2lkdGggPSAyXG4gICAqL1xuICBzY2F0dGVyLnBvaW50U3Ryb2tlV2lkdGggPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBvaW50U3Ryb2tlV2lkdGggPV8sIHNjYXR0ZXIpIDogcG9pbnRTdHJva2VXaWR0aH1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBjb2xvckZ1bmN0aW9uXG4gICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjY29sb3JGdW5jdGlvbn0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgY29sb3JGdW5jdGlvbiA9IGNvbG9yRnVuY3Rpb24oKVxuICAgKi9cbiAgc2NhdHRlci5jb2xvckZ1bmN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjb2xvckZ1bmN0aW9uID1fLCBzY2F0dGVyKSA6IGNvbG9yRnVuY3Rpb259XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgYmFja2dyb3VuZEZpbGxcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciNiYWNrZ3JvdW5kRmlsbH0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgYmFja2dyb3VuZEZpbGwgPSAndHJhbnNwYXJlbnQnXG4gICAqL1xuICBzY2F0dGVyLmJhY2tncm91bmRGaWxsID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChiYWNrZ3JvdW5kRmlsbCA9Xywgc2NhdHRlcikgOiBiYWNrZ3JvdW5kRmlsbH1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBuYW1lc3BhY2VcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciNuYW1lc3BhY2V9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG5hbWVzcGFjZSA9ICdkM3NtLXNjYXR0ZXInXG4gICAqL1xuICBzY2F0dGVyLm5hbWVzcGFjZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobmFtZXNwYWNlID1fLCBzY2F0dGVyKSA6IG5hbWVzcGFjZX1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBvYmplY3RDbGFzc1xuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI29iamVjdENsYXNzfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtzY2F0dGVyIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvYmplY3RDbGFzcyA9ICd0aWNrLWdyb3VwJ1xuICAgKi9cbiAgc2NhdHRlci5vYmplY3RDbGFzcyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob2JqZWN0Q2xhc3MgPV8sIHNjYXR0ZXIpIDogb2JqZWN0Q2xhc3N9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdHJhbnNpdGlvbkR1cmF0aW9uXG4gICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjdHJhbnNpdGlvbkR1cmF0aW9ufSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtzY2F0dGVyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0cmFuc2l0aW9uRHVyYXRpb24gPSAxMDAwXG4gICAqL1xuICBzY2F0dGVyLnRyYW5zaXRpb25EdXJhdGlvbiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodHJhbnNpdGlvbkR1cmF0aW9uID1fLCBzY2F0dGVyKSA6IHRyYW5zaXRpb25EdXJhdGlvbn1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBlYXNlRnVuY1xuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI2Vhc2VGdW5jfSlcbiAgICogQHBhcmFtIHtkMy5lYXNlfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IGQzLmVhc2V9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGVhc2VGdW5jID0gZDMuZWFzZUV4cFxuICAgKi9cbiAgc2NhdHRlci5lYXNlRnVuYyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZWFzZUZ1bmMgPV8sIHNjYXR0ZXIpIDogZWFzZUZ1bmN9XG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBwb2ludEtleXNcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciNwb2ludEtleXN9KVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IHN0cmluZ1tdfVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBwb2ludEtleXMgPSB1bmRlZmluZWRcbiAgICovXG4gIHNjYXR0ZXIucG9pbnRLZXlzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwb2ludEtleXMgPV8sIHNjYXR0ZXIpIDogcG9pbnRLZXlzfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHZhbHVlc1hcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciN2YWx1ZXNYfSlcbiAgICogQHBhcmFtIHtudW1iZXJbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBudW1iZXJbXX1cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdmFsdWVzWCA9IHVuZGVmaW5lZFxuICAgKi9cbiAgc2NhdHRlci52YWx1ZXNYID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2YWx1ZXNYID1fLCBzY2F0dGVyKSA6IHZhbHVlc1h9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdmFsdWVzWVxuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI3ZhbHVlc1l9KVxuICAgKiBAcGFyYW0ge251bWJlcltdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IG51bWJlcltdfVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB2YWx1ZXNZID0gdW5kZWZpbmVkXG4gICAqL1xuICBzY2F0dGVyLnZhbHVlc1kgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZhbHVlc1kgPV8sIHNjYXR0ZXIpIDogdmFsdWVzWX1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB2YWx1ZXNSXG4gICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjdmFsdWVzUn0pXG4gICAqIEBwYXJhbSB7bnVtYmVyW119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtzY2F0dGVyIHwgbnVtYmVyW119XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHZhbHVlc1IgPSB1bmRlZmluZWRcbiAgICovXG4gIHNjYXR0ZXIudmFsdWVzUiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmFsdWVzUiA9Xywgc2NhdHRlcikgOiB2YWx1ZXNSfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRvb2x0aXBcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciN0b29sdGlwfSlcbiAgICogQHBhcmFtIHt0b29sdGlwfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IHRvb2x0aXB9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHRvb2x0aXAgPSB0b29sdGlwKClcbiAgICovXG5cbiAgc2NhdHRlci50b29sdGlwID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0b29sdGlwID1fLCBzY2F0dGVyKSA6IHRvb2x0aXB9XG5cblxuICBmdW5jdGlvbiBzY2F0dGVyKCkge1xuICAgIC8vIGJhY2tncm91bmQgY2xpcGluZyByZWN0YW5nbGVcbiAgICB2YXIgYmdjcFJlY3QgPSB7eDowLCB5OjAsIHdpZHRoOiBzcGFjZVgsIGhlaWdodDpzcGFjZVl9XG4gICAgdmFyIGNvbnRhaW5lciA9IHNldHVwQ29udGFpbmVyKCBzZWxlY3Rpb24sIG5hbWVzcGFjZSwgYmdjcFJlY3QsIGJhY2tncm91bmRGaWxsICk7XG5cblxuICAgIHBvaW50S2V5cyA9IGQzLmtleXMoZGF0YSlcbiAgICB2YWx1ZXNYID0gcG9pbnRLZXlzLm1hcCh2YWx1ZUV4dHJhY3RvclgpXG4gICAgdmFsdWVzWSA9IHBvaW50S2V5cy5tYXAodmFsdWVFeHRyYWN0b3JZKVxuICAgIHZhbHVlc1IgPSBwb2ludEtleXMubWFwKHZhbHVlRXh0cmFjdG9yUilcblxuICAgIHZhciBudW1iZXJPZk9iamVjdHMgPSBwb2ludEtleXMubGVuZ3RoXG4gICAgdmFyIGV4dGVudFggPSBbTWF0aC5taW4oLi4udmFsdWVzWCkgLSBkb21haW5QYWRkaW5nWCwgTWF0aC5tYXgoLi4udmFsdWVzWCkgKyBkb21haW5QYWRkaW5nWF1cbiAgICB2YXIgZXh0ZW50WSA9IFtNYXRoLm1pbiguLi52YWx1ZXNZKSAtIGRvbWFpblBhZGRpbmdZLCBNYXRoLm1heCguLi52YWx1ZXNZKSArIGRvbWFpblBhZGRpbmdZXVxuICAgIHZhciBleHRlbnRSID0gW01hdGgubWluKC4uLnZhbHVlc1IpIC0gZG9tYWluUGFkZGluZ1IsIE1hdGgubWF4KC4uLnZhbHVlc1IpICsgZG9tYWluUGFkZGluZ1JdXG5cbiAgICBzY2FsZVguZG9tYWluKGV4dGVudFgpLnJhbmdlKFswLCBzcGFjZVhdKVxuICAgIHNjYWxlWS5kb21haW4oZXh0ZW50WSkucmFuZ2UoW3NwYWNlWSwgMF0pXG4gICAgc2NhbGVSLmRvbWFpbihleHRlbnRSKS5yYW5nZShbbWluUmFkaXVzLCBtYXhSYWRpdXNdKVxuXG4gICAgdmFyIHBvaW50cyA9IGNvbnRhaW5lci5zZWxlY3RBbGwoJy4nK29iamVjdENsYXNzKVxuICAgIHBvaW50cyA9IHBvaW50cy5kYXRhKHBvaW50S2V5cylcbiAgICB2YXIgcEVudGVyID0gcG9pbnRzLmVudGVyKCkuYXBwZW5kKCdjaXJjbGUnKVxuICAgIC5hdHRyKCdjbGFzcycsIG9iamVjdENsYXNzKVxuICAgIC5hdHRyKCdjeCcsIDApLmF0dHIoJ2N5Jywgc3BhY2VZKS5hdHRyKCdyJywgMClcblxuICAgIHZhciBwRXhpdCA9IHBvaW50cy5leGl0KClcblxuICAgIHBvaW50cyA9IHBvaW50cy5tZXJnZShwRW50ZXIpXG5cbiAgICBwb2ludHMuZWFjaChmdW5jdGlvbihrZXksIGkpe1xuICAgICAgdmFyIHQgPSBkMy5zZWxlY3QodGhpcyksXG4gICAgICBjdXJyZW50RGF0YSA9IGRhdGFba2V5XSxcbiAgICAgIHggPSB2YWx1ZXNYW2ldLFxuICAgICAgeSA9IHZhbHVlc1lbaV0sXG4gICAgICByID0gdmFsdWVzUltpXSxcbiAgICAgIGZpbGxDb2xvciA9IGNvbG9yRnVuY3Rpb24oa2V5LCBjdXJyZW50RGF0YSwgaSwgJ2ZpbGwnKSxcbiAgICAgIHN0cm9rZUNvbG9yID0gY29sb3JGdW5jdGlvbihrZXksIGN1cnJlbnREYXRhLCBpLCAnc3Ryb2tlJylcblxuICAgICAgdC50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlKGVhc2VGdW5jKVxuICAgICAgLmF0dHIoJ2N4Jywgc2NhbGVYKHgpKVxuICAgICAgLmF0dHIoJ2N5Jywgc2NhbGVZKHkpKVxuICAgICAgLmF0dHIoJ3InLCBzY2FsZVIocikpXG4gICAgICAuYXR0cignZmlsbCcsIGZpbGxDb2xvcilcbiAgICAgIC5hdHRyKCdzdHJva2UnLCBzdHJva2VDb2xvcilcbiAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCBwb2ludFN0cm9rZVdpZHRoKVxuXG5cblxuICAgICAgdC5vbignbW91c2VvdmVyJywgZnVuY3Rpb24oZCwgaSl7XG4gICAgICAgIHBvaW50cy5zdHlsZSgnb3BhY2l0eScsIDAuMilcbiAgICAgICAgdC5zdHlsZSgnb3BhY2l0eScsIDEpXG4gICAgICAgIHQudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbi8yKS5lYXNlKGVhc2VGdW5jKVxuICAgICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgcG9pbnRTdHJva2VXaWR0aCoyKVxuICAgICAgICAuYXR0cigncicsIHNjYWxlUihyKSAqIDEuNSlcblxuICAgICAgfSlcbiAgICAgIHQubm9kZSgpLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgZnVuY3Rpb24oKXtcbiAgICAgICAgY29udGFpbmVyLnNlbGVjdEFsbCgnLicrb2JqZWN0Q2xhc3MpLnN0eWxlKCdvcGFjaXR5JywgMSlcbiAgICAgICAgdC50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uLzIpLmVhc2UoZWFzZUZ1bmMpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCBwb2ludFN0cm9rZVdpZHRoKVxuICAgICAgICAuYXR0cigncicsIHNjYWxlUihyKSlcblxuICAgICAgfSlcblxuICAgIH0pXG5cblxuXG4gICAgcEV4aXQudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuZWFzZShlYXNlRnVuYylcbiAgICAuYXR0cignY3gnLCAwKS5hdHRyKCdjeScsIHNwYWNlWSkuYXR0cigncicsIDApXG4gICAgLnJlbW92ZSgpXG5cbiAgICB0b29sdGlwLnNlbGVjdGlvbihwb2ludHMpXG4gICAgLmRhdGEoZGF0YSlcblxuICAgIHRvb2x0aXAoKVxuICB9XG5cblxuICByZXR1cm4gc2NhdHRlclxufVxuIiwiaW1wb3J0IHtoeXBlbmF0ZSwgc2FmZVNlbGVjdCwgZ2V0VHJhbnNsYXRpb259IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQge2xvZywgd2FybiwgZXJyb3IsIGluZm99IGZyb20gJy4vdXRpbHMnO1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUExPVFpPT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqXG4gKiBDcmVhdGVzIGFuIHBsb3Rab29tIGluc3RhbmNlLCB3aGljaCBjYW4gaGFuZGxlIGRyYWcgYW5kIHNjcm9sbCBldmVudHNcbiAqIEBjb25zdHJ1Y3RvciBwbG90Wm9vbVxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2hhcnQgYSBmdW5jdGlvbiBpbnN0YW5jZSBvZiBvbmUgb2YgdGhlIGQzc20gcGxvdHMgKGUuZy4gYmFyLCBib3h3aGlza2VyLCBidWJibGVIZWF0bWFwLCB2aW9saW4sIGV0YylcbiAqIEBwYXJhbSB7YXhpc30gIHhBeGlzIHRoZSBheGlzIGluc3RhbmNlIHJlc3BvbnNpYmxlIGZvciB0aGUgeCBheGlzXG4gKiBAcGFyYW0ge2F4aXN9IHlBeGlzIHRoZSBheGlzIGluc3RhbmNlIHJlc3BvbnNpYmxlIGZvciB0aGUgeSBheGlzXG4gKiBAbmFtZXNwYWNlIHBsb3Rab29tXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259IHpvb21cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBsb3Rab29tKCBjaGFydCwgeEF4aXMsIHlBeGlzICkge1xuICB2YXJcbiAgLyoqXG4gICogVGhlIGV2ZW50IG9uIHdoaWNoIHRvIGZpcmVcbiAgKiAoc2VlIHtAbGluayBwbG90Wm9vbSNldmVudFR5cGV9KVxuICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFR5cGUgd2hpY2ggZXZlbnQgaXQgc2hvdWxkIGhhbmRsZS4gQ3VycmVudGx5IHN1cHBvcnRzIHNjcm9sbCBhbmQgd2hlZWxcbiAgKiBAbWVtYmVyb2YgcGxvdFpvb20jXG4gICogQHByb3BlcnR5XG4gICovXG4gIGV2ZW50VHlwZSxcbiAgLyoqXG4gICogQSBzY2FsaW5nIGZhY3RvciBmb3IgdGhlIHdoZWVsIFwic3BlZWRcIlxuICAqIChzZWUge0BsaW5rIHBsb3Rab29tI3doZWVsU3BlZWR9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbd2hlZWxTcGVlZD0yMF0gc2NhbGVzIHRoZSB3aGVlbCB0cmFuc2xhdGlvbiBieSB3aGVlbFNwZWVkXG4gICogQG1lbWJlcm9mIHBsb3Rab29tI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB3aGVlbFNwZWVkID0gMjAsXG4gIC8qKlxuICAqIFRoZSBvcmllbnRhdGlvbiBpbiB3aGljaCB0byBhbGxvdyBzY3JvbGxpbmc6ICdob3Jpem9udGFsJywgJ3ZlcnRpY2FsJywgb3IgJzJEJ1xuICAqIChzZWUge0BsaW5rIHBsb3Rab29tI29yaWVudH0pXG4gICogQHBhcmFtIHtzdHJpbmd9IFtvcmllbnQ9Y2hhcnQub3JpZW50KCkgfHwgJ2hvcml6b250YWwnXVxuICAqIEBtZW1iZXJvZiBwbG90Wm9vbSNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb3JpZW50ID0gKGNoYXJ0Lm9yaWVudCA9PSB1bmRlZmluZWQpID8gJ2hvcml6b250YWwnIDogY2hhcnQub3JpZW50KCksXG4gIC8qKlxuICAqIFRoZSBtYXggZGlzdGFuY2UgYWxsb3dlZCB0byBzY3JvbGwgaW4gdGhlIHggZGlyZWN0aW9uXG4gICogKHNlZSB7QGxpbmsgcGxvdFpvb20jeExvY2t9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbeExvY2s9Y2hhcnQuc3BhY2VYKCldIGlkZWFsbHkgY2hhcnQub3ZlcmZsb3dRKCkgPT0gdHJ1ZSBhbmQgdGhpcyB2YWx1ZSBpcyB0aGVcbiAgKiBib3VuZGluZyByZWN0IGFjcm9zcyBhbGwgZWxlbWVudHMgaW4gdGhlIGNoYXJ0ICBtaW51cyB0aGUgc3BhY2UgaW4gd2hpY2ggdG8gc2hvdy5cbiAgKiBAbWVtYmVyb2YgcGxvdFpvb20jXG4gICogQHByb3BlcnR5XG4gICovXG4gIHhMb2NrPWNoYXJ0LnNwYWNlWCgpLFxuICAvKipcbiAgKiBUaGUgbWF4IGRpc3RhbmNlIGFsbG93ZWQgdG8gc2Nyb2xsIGluIHRoZSB5IGRpcmVjdGlvblxuICAqIChzZWUge0BsaW5rIHBsb3Rab29tI3lMb2NrfSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW3lMb2NrPWNoYXJ0LnNwYWNlWSgpXSBpZGVhbGx5IGNoYXJ0Lm92ZXJmbG93USgpID09IHRydWUgYW5kIHRoaXMgdmFsdWUgaXMgdGhlXG4gICogYm91bmRpbmcgcmVjdCBhY3Jvc3MgYWxsIGVsZW1lbnRzIGluIHRoZSBjaGFydCAgbWludXMgdGhlIHNwYWNlIGluIHdoaWNoIHRvIHNob3cuXG4gICogQG1lbWJlcm9mIHBsb3Rab29tI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB5TG9jaz1jaGFydC5zcGFjZVkoKSxcblxuICBjaGFydFNlbCA9IGNoYXJ0LnNlbGVjdGlvbigpLFxuICB4QXhpc1NlbCA9IHhBeGlzLnNlbGVjdGlvbigpLFxuICB5QXhpc1NlbCA9IHlBeGlzLnNlbGVjdGlvbigpXG5cblxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBldmVudCB0eXBlIGluIHdoaWNoIHRvIHJlc3BvbmRcbiAgICogKHNlZSB7QGxpbmsgcGxvdFpvb20jZXZlbnRUeXBlfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdIHNob3VsZCBiZSAnZHJhZycgb3IgJ3doZWVsJ1xuICAgKiBAcmV0dXJucyB7em9vbSB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIHBsb3Rab29tXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHBsb3Rab29tPXVuZGVmaW5lZFxuICAgKi9cbiAgem9vbS5ldmVudFR5cGUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGV2ZW50VHlwZSA9IF8sIHpvb20pIDogZXZlbnRUeXBlOyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSB3aGVlbCBzcGVlZCBpbiB3aGljaCB0byBzY2FsZSB0aGUgd2hlZWwgc2Nyb2xsIHRyYW5zZm9ybVxuICAgKiAoc2VlIHtAbGluayBwbG90Wm9vbSN3aGVlbFNwZWVkfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt6b29tIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgcGxvdFpvb21cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgd2hlZWxTcGVlZD0yMFxuICAgKi9cbiAgem9vbS53aGVlbFNwZWVkID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh3aGVlbFNwZWVkID0gXywgem9vbSkgOiB3aGVlbFNwZWVkOyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBvcmllbnRhdGlvbiBpbiB3aGljaCBpdGVtcyBhcmUgbWFuaXB1bGF0ZWRcbiAgICogKHNlZSB7QGxpbmsgcGxvdFpvb20jb3JpZW50fSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdIHNob3VsZCBiZSBob3Jpem9udGFsLCB2ZXJ0aWNhbCwgb3IgMkRcbiAgICogQHJldHVybnMge3pvb20gfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBwbG90Wm9vbVxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvcmllbnQ9Y2hhcnQub3JpZW50KCkgfHwgJ2hvcml6b250YWwnXG4gICAqL1xuICB6b29tLm9yaWVudCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob3JpZW50ID0gXywgem9vbSkgOiBvcmllbnQ7IH07XG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgbWF4IGRpc3RhbmNlIGluIHdoaWNoIHRvIHNjcm9sbCBYXG4gICAqIChzZWUge0BsaW5rIHBsb3Rab29tI3hMb2NrfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdIHNob3VsZCBiZSBhIHBvc2l0aXZlIHZhbHVlXG4gICAqIEByZXR1cm5zIHt6b29tIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgcGxvdFpvb21cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgeExvY2s9Y2hhcnQuc3BhY2VYKClcbiAgICovXG4gIHpvb20ueExvY2sgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHhMb2NrID0gXywgem9vbSkgOiB4TG9jazsgfTtcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgbWF4IGRpc3RhbmNlIGluIHdoaWNoIHRvIHNjcm9sbCBZXG4gICAqIChzZWUge0BsaW5rIHBsb3Rab29tI3lMb2NrfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdICBzaG91bGQgYmUgYSBwb3NpdGl2ZSB2YWx1ZVxuICAgKiBAcmV0dXJucyB7em9vbSB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHBsb3Rab29tXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHlMb2NrPWNoYXJ0LnNwYWNlWSgpXG4gICAqL1xuICB6b29tLnlMb2NrID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5TG9jayA9IF8sIHpvb20pIDogeUxvY2s7IH07XG5cblxuICBmdW5jdGlvbiBzZXRMb2NrcygpIHtcbiAgICB2YXIgY2hhcnRPYmpTZWwgPSBjaGFydFNlbC5zZWxlY3QoJy4nK2h5cGVuYXRlKGNoYXJ0Lm5hbWVzcGFjZSgpLCdvYmplY3QtY29udGFpbmVyJykpXG4gICAgdmFyIGNoYXJ0T2JqVHJhbnMgPSBnZXRUcmFuc2xhdGlvbihjaGFydE9ialNlbC5hdHRyKCd0cmFuc2Zvcm0nKSlcbiAgICB2YXIgY29zID0gY2hhcnRPYmpTZWwuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgwLDApJylcbiAgICB4TG9jayA9IGNoYXJ0U2VsLm5vZGUoKS5nZXRCQm94KCkud2lkdGggLSBjaGFydC5zcGFjZVgoKSAqIC45XG4gICAgeUxvY2sgPSBjaGFydFNlbC5ub2RlKCkuZ2V0QkJveCgpLmhlaWdodCAtIGNoYXJ0LnNwYWNlWSgpICogLjlcbiAgICBjb3MuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnK2NoYXJ0T2JqVHJhbnNbMF0rJywnK2NoYXJ0T2JqVHJhbnNbMV0rJyknKVxuICAgIGxvZygncGxvdFpvb20nLCAnc2V0TG9ja3MnLCB7eExvY2s6eExvY2ssIHlMb2NrOnlMb2NrfSlcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHggYW5kIHkgbG9ja3MgKGhvdyBmYXIgb25lIGNhbiBzY3JvbGwpXG4gICAqIChzZWUge0BsaW5rIHBsb3Rab29tI3hMb2NrfSBhbmQge0BsaW5rIHBsb3Rab29tI3lMb2NrfSlcbiAgICogQGZ1bmN0aW9uIHBsb3Rab29tLnNldExvY2tzXG4gICAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJvZiBwbG90Wm9vbVxuICAgKiBAcHJvcGVydHlcbiAgICovXG4gIHpvb20uc2V0TG9ja3MgPSBzZXRMb2Nrc1xuXG4gIGZ1bmN0aW9uIHpvb20oKSB7XG4gICAgc2V0TG9ja3MoKVxuXG4gICAgdmFyIGhvcml6b250YWxRLCB2ZXJ0aWNhbFFcbiAgICBpZiAob3JpZW50ID09ICcyRCcpIHtob3Jpem9udGFsUSA9IHRydWU7IHZlcnRpY2FsUSA9IHRydWU7fVxuICAgIGlmIChvcmllbnQgPT0gJ2hvcml6b250YWwnKSB7aG9yaXpvbnRhbFEgPSB0cnVlOyB2ZXJ0aWNhbFEgPSBmYWxzZTt9XG4gICAgaWYgKG9yaWVudCA9PSAndmVydGljYWwnKSB7dmVydGljYWxRID0gdHJ1ZTsgaG9yaXpvbnRhbFEgPSBmYWxzZTt9XG5cbiAgICAvLyBjYXB0dXJlIHRyYW5zZm9ybSBldmVudFxuICAgIHZhciB0cmFuc2Zvcm0gPSBkMy5ldmVudC50cmFuc2Zvcm1cblxuICAgIHZhciBjaGFydEJveCA9IGNoYXJ0U2VsLm5vZGUoKS5nZXRCQm94KClcbiAgICB2YXIgeEF4aXNCb3ggPSB4QXhpc1NlbC5ub2RlKCkuZ2V0QkJveCgpXG4gICAgdmFyIHlBeGlzQm94ID0geEF4aXNTZWwubm9kZSgpLmdldEJCb3goKVxuXG4gICAgdmFyIGNoYXJ0V2lkdGggPSBjaGFydEJveC53aWR0aCAtIGNoYXJ0Qm94LnhcbiAgICB2YXIgY2hhcnRIZWlnaHQgPSBjaGFydEJveC5oZWlnaHQgLSBjaGFydEJveC55XG4gICAgdmFyIHhBeGlzV2lkdGggPSB4QXhpc0JveC53aWR0aC8vIC0geEF4aXNCb3gueFxuICAgIHZhciB4QXhpc0hlaWdodCA9IHhBeGlzQm94LmhlaWdodC8vIC0geEF4aXNCb3gueVxuICAgIHZhciB5QXhpc1dpZHRoID0geUF4aXNCb3gud2lkdGgvLyAtIHlBeGlzQm94LnhcbiAgICB2YXIgeUF4aXNIZWlnaHQgPSB5QXhpc0JveC5oZWlnaHQvLyAteUF4aXNCb3gueVxuXG4gICAgLy8gZW5hYmxlIHdoZWVsIGV2ZW50XG4gICAgaWYgKGV2ZW50VHlwZSA9PSBcIndoZWVsXCIpIHtcbiAgICAgIHZhciBlID0gZDMuZXZlbnRcbiAgICAgIC8vIHByZXZlbnQgcGFnZSBzY3JvbGxpbmdcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgLy8gZXZlbnQgZGVsdGEgaXMgdmVyeSB2ZXJ5IHNsb3csIHNvIHNwZWVkIGl0IHVwIHdpdGggd2hlZWwgc3BlZWRcbiAgICAgIHZhciB3ID0gZDMuZXZlbnQuZGVsdGFZICogd2hlZWxTcGVlZFxuICAgICAgdmFyIHNoaWZ0USA9IGQzLmV2ZW50LnNoaWZ0S2V5XG5cbiAgICAgIC8vIGQzIGhhcyBubyB3YXkgdG8gbWFrZSBjdXN0b20gdHJhbnNmb3JtLCBzbyBtYWtlIGFuIG9iamVjdCBhbmQgYWRkXG4gICAgICAvLyB0aGUgbmVjZXNzYXJ5IGZ1bmN0aW9ucyB0byBtYWtlIHdoZWVsIGV2ZW50IGNvbXBhdGlibGUgd2l0aCBkcmFnIGV2ZW50c1xuICAgICAgaWYgKG9yaWVudCA9PSAnMkQnKSB7XG4gICAgICAgIHRyYW5zZm9ybSA9IHNoaWZ0USA/IHtrOiAxLCB4OiB3LCB5OiAwfSA6IHtrOiAxLCB4OiAwLCB5OiB3fVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJhbnNmb3JtID0gaG9yaXpvbnRhbFEgPyB7azogMSwgeDogdywgeTogMH0gOiB7azogMSwgeDogMCwgeTogd31cbiAgICAgIH1cbiAgICAgIHRyYW5zZm9ybS5hcHBseVggPSBmdW5jdGlvbih4KSB7IHJldHVybiB4ICogdGhpcy5rICsgdGhpcy54OyB9XG4gICAgICB0cmFuc2Zvcm0uYXBwbHlZID0gIGZ1bmN0aW9uKHkpIHsgcmV0dXJuIHkgKiB0aGlzLmsgKyB0aGlzLnk7IH1cbiAgICB9XG5cblxuXG4gICAgdmFyIGNoYXJ0T2JqU2VsID0gY2hhcnRTZWwuc2VsZWN0KCcuJytoeXBlbmF0ZShjaGFydC5uYW1lc3BhY2UoKSwnb2JqZWN0LWNvbnRhaW5lcicpKVxuICAgIHZhciB4QXhpc09ialNlbCA9IHhBeGlzU2VsLnNlbGVjdCgnLicraHlwZW5hdGUoeEF4aXMubmFtZXNwYWNlKCksJ29iamVjdC1jb250YWluZXInKSlcbiAgICB2YXIgeUF4aXNPYmpTZWwgPSB5QXhpc1NlbC5zZWxlY3QoJy4nK2h5cGVuYXRlKHlBeGlzLm5hbWVzcGFjZSgpLCdvYmplY3QtY29udGFpbmVyJykpXG5cbiAgICAvLyB4TG9jayA9IGNoYXJ0U2VsLm5vZGUoKS5nZXRCQm94KCkud2lkdGggLSBjaGFydC5zcGFjZVgoKSAtIGNoYXJ0U2VsLm5vZGUoKS5nZXRCQm94KCkueFxuICAgIC8vIHlMb2NrID0gY2hhcnRTZWwubm9kZSgpLmdldEJCb3goKS5oZWlnaHQgLSBjaGFydC5zcGFjZVkoKVxuICAgIC8vIGNvbnNvbGUudGFibGUoeyd4TG9jayc6eExvY2ssIFwieUxvY2tcIjp5TG9ja30pXG4gICAgLy8gYmhtLnNlbGVjdGlvbigpLm5vZGUoKS5nZXRCQm94KCkud2lkdGggLSBiaG0uc3BhY2VYKClcblxuXG4gICAgdmFyIGNoYXJ0T2JqVHJhbnMgPSBnZXRUcmFuc2xhdGlvbihjaGFydE9ialNlbC5hdHRyKCd0cmFuc2Zvcm0nKSlcbiAgICB2YXIgeEF4aXNPYmpUcmFucyA9IGdldFRyYW5zbGF0aW9uKHhBeGlzT2JqU2VsLmF0dHIoJ3RyYW5zZm9ybScpKVxuICAgIHZhciB5QXhpc09ialRyYW5zID0gZ2V0VHJhbnNsYXRpb24oeUF4aXNPYmpTZWwuYXR0cigndHJhbnNmb3JtJykpXG5cblxuICAgIHZhciB4ID0gaG9yaXpvbnRhbFEgPyB0cmFuc2Zvcm0uYXBwbHlYKGNoYXJ0T2JqVHJhbnNbMF0pIDogMFxuICAgIGlmIChob3Jpem9udGFsUSkge3ggPSB4IDwgLXhMb2NrID8gKHRyYW5zZm9ybS54ID0gMCwgLXhMb2NrKSA6ICh0cmFuc2Zvcm0ueCA9IDAsIE1hdGgubWluKHgsIDApKSB9XG5cbiAgICB2YXIgeSA9IHZlcnRpY2FsUSA/IHRyYW5zZm9ybS5hcHBseVkoY2hhcnRPYmpUcmFuc1sxXSkgOiAwXG4gICAgaWYgKHZlcnRpY2FsUSkge3kgPSB5IDwgLXlMb2NrID8gKHRyYW5zZm9ybS55ID0gMCwgLXlMb2NrKTogKHRyYW5zZm9ybS55ID0gMCwgTWF0aC5taW4oeSwgMCkpfVxuXG4gICAgY2hhcnRPYmpTZWwuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnK3grJywnK3krJyknKVxuICAgIGlmIChob3Jpem9udGFsUSkgeyB4QXhpc09ialNlbC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcreCsnLCcrMCsnKScpIH1cbiAgICBpZiAodmVydGljYWxRKSB7IHlBeGlzT2JqU2VsLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyswKycsJyt5KycpJykgfVxuXG4gIH1cblxuICB6b29tLnJlc2V0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGhvcml6b250YWxRLCB2ZXJ0aWNhbFFcbiAgICBpZiAob3JpZW50ID09ICcyRCcpIHtob3Jpem9udGFsUSA9IHRydWU7IHZlcnRpY2FsUSA9IHRydWU7fVxuICAgIGlmIChvcmllbnQgPT0gJ2hvcml6b250YWwnKSB7aG9yaXpvbnRhbFEgPSB0cnVlOyB2ZXJ0aWNhbFEgPSBmYWxzZTt9XG4gICAgaWYgKG9yaWVudCA9PSAndmVydGljYWwnKSB7dmVydGljYWxRID0gdHJ1ZTsgaG9yaXpvbnRhbFEgPSBmYWxzZTt9XG5cbiAgICB2YXIgY2hhcnRPYmpTZWwgPSBjaGFydFNlbC5zZWxlY3QoJy4nK2h5cGVuYXRlKGNoYXJ0Lm5hbWVzcGFjZSgpLCdvYmplY3QtY29udGFpbmVyJykpXG4gICAgdmFyIHhBeGlzT2JqU2VsID0geEF4aXNTZWwuc2VsZWN0KCcuJytoeXBlbmF0ZSh4QXhpcy5uYW1lc3BhY2UoKSwnb2JqZWN0LWNvbnRhaW5lcicpKVxuICAgIHZhciB5QXhpc09ialNlbCA9IHlBeGlzU2VsLnNlbGVjdCgnLicraHlwZW5hdGUoeUF4aXMubmFtZXNwYWNlKCksJ29iamVjdC1jb250YWluZXInKSlcbiAgICBjaGFydE9ialNlbC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcrMCsnLCcrMCsnKScpXG4gICAgeEF4aXNPYmpTZWwuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnKzArJywnKzArJyknKVxuICAgIHlBeGlzT2JqU2VsLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyswKycsJyswKycpJylcbiAgfVxuXG4gIHJldHVybiB6b29tXG59XG4iLCJpbXBvcnQge2h5cGVuYXRlLCBzYWZlU2VsZWN0LCBtb2RpZnlIZXhpZGVjaW1hbENvbG9yTHVtaW5hbmNlLCBleHRyYWN0VmlvbGluVmFsdWVzfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHtzZXR1cENvbnRhaW5lciwgY2FsY3VsYXRlV2lkdGhPZk9iamVjdCwgY2FsY3VsYXRlV2lkdGhPZlNwYWNlcn0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge3VuaXF1ZSwgaGFzUSwgZmxhdHRlbiwgd2hpY2hCaW59IGZyb20gJy4vYXJyYXktZnVuY3Rpb25zJztcbmltcG9ydCB7Z3JvdXBpbmdTcGFjZXJ9IGZyb20gJy4vZ3JvdXBpbmctc3BhY2VyJztcbmltcG9ydCB7Y29sb3JGdW5jdGlvbiBhcyBDRn0gZnJvbSAnLi9jb2xvci1mdW5jdGlvbic7XG5pbXBvcnQge3Rvb2x0aXAgYXMgVFRpcH0gZnJvbSAnLi90b29sdGlwJztcblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWSU9MSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKlxuICogQ3JlYXRlcyBhIHZpb2xpblxuICpcbiAqIHtAbGluayBodHRwczovL3N1bW5ldXJvbi5naXRsYWIuaW8vZDNzbS9kZW1vcy9iYXNpYy12aW9saW5zL2luZGV4Lmh0bWwgRGVtb31cbiAqIEBjb25zdHJ1Y3RvciB2aW9saW5cbiAqIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBzZWxlY3Rpb25cbiAqIEBuYW1lc3BhY2UgdmlvbGluXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259IHZpb2xpblxuICovXG5leHBvcnQgZnVuY3Rpb24gdmlvbGluKCBzZWxlY3Rpb24gKSB7XG4gIHZhclxuICAvKipcbiAgKiBEYXRhIHRvIHBsb3QuIEFzc3VtZWQgdG8gYmUgYSBvYmplY3QsIHdoZXJlIGVhY2gga2V5IGNvcnJlc3BvbmRzIHRvIGEgdmlvbGluXG4gICogKHNlZSB7QGxpbmsgYmFyI2RhdGF9KVxuICAqIEBwYXJhbSB7T2JqZWN0fSBbZGF0YT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZGF0YSxcbiAgLyoqXG4gICogV2hpY2ggZGlyZWN0aW9uIHRvIHJlbmRlciB0aGUgYmFycyBpblxuICAqIChzZWUge0BsaW5rIGJhciNvcmllbnR9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbb3JpZW50PSdob3Jpem9udGFsJ11cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBvcmllbnQ9J2hvcml6b250YWwnLFxuICAvKipcbiAgKiBBbW91bnQgb2YgaG9yaXpvbnRhbCBzcGFjZSAoaW4gcGl4ZWxzKSBhdmFpYmxlIHRvIHJlbmRlciB0aGUgYmFyIGluXG4gICogKHNlZSB7QGxpbmsgYmFyI3NwYWNlWH0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZVg9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNwYWNlWCxcbiAgLyoqXG4gICogQW1vdW50IG9mIHZlcnRpY2FsIHNwYWNlIChpbiBwaXhlbHMpIGF2YWlibGUgdG8gcmVuZGVyIHRoZSBiYXIgaW5cbiAgKiAoc2VlIHtAbGluayBiYXIuc3BhY2VZfSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW3NwYWNlWT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc3BhY2VZLFxuICAvKipcbiAgKiBXaGV0aGVyIG9yIG5vdCB0byBhbGxvdyBiYXIgdG8gcmVuZGVyIGVsZW1lbnRzIHBhc3MgdGhlIG1haW4gc3BhdGlhbCBkaW1lbnNpb25cbiAgKiBnaXZlbiB0aGUgb3JpZW50YXRpb24gKHNlZSB7QGxpbmsgYmFyI29yaWVudH0pLCB3aGVyZSB7QGxpbmsgYmFyI29yaWVudH09XCJob3Jpem9udGFsXCJcbiAgKiB0aGUgbWFpbiBkaW1lbnNpb24gaXMge0BsaW5rIGJhciNzcGFjZVh9IGFuZCB3aGVyZSB7QGxpbmsgYmFyI29yaWVudH09XCJ2ZXJ0aWNhbFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBiYXIjc3BhY2VZfVxuICAqIEBwYXJhbSB7Ym9vbGVhbn0gW292ZXJmbG93UT1mYWxzZV1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBvdmVyZmxvd1EgPSB0cnVlLFxuICAvKipcbiAgKiBXaGV0aGVyIG9yIG5vdCB0byBkaXNwbGF5IHBvaW50cyBpbnNpZGUgdGhlIHBvaW50c1xuICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BvaW50c1E9ZmFsc2VdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgcG9pbnRzUSA9IHRydWUsXG4gIC8qKlxuICAqIEFuIGFycmF5IC0gcHV0YXRpdmVseSBvZiBvdGhlciBhcnJheXMgLSBkZXBpY3RpbmcgaG93IGJhcnMgc2hvdWxkIGJlIGFycmFuZ2VkXG4gICogQHBhcmFtIHtBcnJheVtdfSBbZ3JvdXBpbmc9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGdyb3VwaW5nLFxuICAvKipcbiAgKiBIb3cgdG8gZ2V0IHRoZSB2YWx1ZSBvZiB0aGUgYmFyXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW3ZhbHVlRXh0cmFjdG9yPWZ1bmN0aW9uKGtleSwgaW5kZXgpIHsgcmV0dXJuIGRhdGFba2V5XSB9XVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHZhbHVlRXh0cmFjdG9yID0gZnVuY3Rpb24oa2V5LCBpbmRleCkge3JldHVybiBkYXRhW2tleV0gfSxcbiAgLyoqXG4gICogSG93IHRvIHNvcnQgdGhlIGJhcnMgLSBpZiB7QGxpbmsgYmFyI2dyb3VwaW5nfSBpcyBub3QgcHJvdmlkZWQuXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW3NvcnRpbmdGdW5jdGlvbj1mdW5jdGlvbihrZXlBLCBrZXlCKSB7cmV0dXJuIGQzLmRlc2NlbmRpbmcoZGF0YVtrZXlBXSwgZGF0YVtrZXlCXSl9XVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNvcnRpbmdGdW5jdGlvbiA9IGZ1bmN0aW9uKGtleUEsIGtleUIpIHtyZXR1cm4gZDMuZGVzY2VuZGluZyhkYXRhW2tleUFdLCBkYXRhW2tleUJdKX0sXG5cbiAgLyoqXG4gICogVGhlIHNjYWxlIGZvciB3aGljaCBiYXIgdmFsdWVzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBieVxuICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtzY2FsZT1kMy5zY2FsZUxpbmVhcl1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzY2FsZSA9IGQzLnNjYWxlTGluZWFyKCksXG4gIC8qKlxuICAqIFRoZSBwYWRkaW5nIGZvciB0aGUgZG9tYWluIG9mIHRoZSBzY2FsZSAoc2VlIHtAbGluayBiYXIjc2NhbGV9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbZG9tYWluUGFkZGluZz0wLjVdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZG9tYWluUGFkZGluZyA9IDAuNSxcbiAgLyoqXG4gICogRGVmYXVsdCBzcGFjZSBmb3IgdGhlIHNwYWNlciAocGVyY2VudGFnZSkgb2YgbWFpbiBkaW1lbnNpb24gZ2l2ZW4gdGhlIG9yaWVudGF0aW9uXG4gICogKHNlZSB7QGxpbmsgYmFyI29yaWVudH0pLCB3aGVyZSB7QGxpbmsgYmFyI29yaWVudH09XCJob3Jpem9udGFsXCJcbiAgKiB0aGUgbWFpbiBkaW1lbnNpb24gaXMge0BsaW5rIGJhciNzcGFjZVh9IGFuZCB3aGVyZSB7QGxpbmsgYmFyI29yaWVudH09XCJ2ZXJ0aWNhbFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBiYXIjc3BhY2VZfSBiZXR3ZWVuIGJhcnNcbiAgKiBAcGFyYW0ge251bWJlcn0gW29iamVjdFNwYWNlcj0wLjA1XVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG9iamVjdFNwYWNlciA9IDAuMDUsXG4gIC8qKlxuICAqIFRoZSBtaW5pbXVtIHNpemUgdGhhdCBhbiBvYmplY3QgY2FuIGJlXG4gICogQHBhcmFtIHtudW1iZXJ9IFttaW5PYmplY3RTaXplPTUwXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG1pbk9iamVjdFNpemUgPSA1MCxcbiAgLyoqXG4gICogVGhlIG1heGltdW0gc2l6ZSB0aGF0IGFuIG9iamVjdCBjYW4gYmVcbiAgKiBAcGFyYW0ge251bWJlcn0gW21heE9iamVjdFNpemU9MTAwXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG1heE9iamVjdFNpemUgPSAxMDAsXG5cbiAgLyoqXG4gICogVGhlIHN0cm9rZSB3aWR0aCBvZiB0aGUgYmFyc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbYmFyU3Ryb2tlV2lkdGg9Ml1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBvYmplY3RTdHJva2VXaWR0aCA9IDIsXG4gIC8qKlxuICAqIEluc3RhbmNlIG9mIENvbG9yRnVuY3Rpb25cbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbY29sb3JGdW5jdGlvbiA9IGNvbG9yRnVuY3Rpb24oKV1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBjb2xvckZ1bmN0aW9uID0gQ0YoKSxcbiAgLyoqXG4gICogSW5zdGFuY2Ugb2YgQ29sb3JGdW5jdGlvbiBtb2RpZmllZCBieSBhIHNjYWxlIGZvciB0aGUgcG9pbnRzXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW3BvaW50Q29sb3JGdW5jID0gY29sb3JGdW5jdGlvbigpXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHBvaW50Q29sb3JGdW5jID0gZnVuY3Rpb24gKGQsIHR5cGUsIGJhc2UsIG1pbiwgbWF4KSB7XG4gICAgdmFyIG1pbk1heEhleFNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oW21heCwgbWluXSkucmFuZ2UoWy0wLjI1LCAwLjI1XSlcbiAgICB2YXIgc2NhbGVkQ29sb3IgPSBtb2RpZnlIZXhpZGVjaW1hbENvbG9yTHVtaW5hbmNlKGJhc2UucmVwbGFjZSgnIycsICcnKSwgbWluTWF4SGV4U2NhbGUoZCkpXG4gICAgdmFyIG1vZCA9IHR5cGUgPT0gXCJzdHJva2VcIiA/IDAgOiAwLjI1XG4gICAgcmV0dXJuIG1vZGlmeUhleGlkZWNpbWFsQ29sb3JMdW1pbmFuY2Uoc2NhbGVkQ29sb3IucmVwbGFjZSgnIycsICcnKSwgbW9kKVxuICB9LFxuXG4gIC8qKlxuICAqIFRoZSByYWRpdXMgb2YgYSBwb2ludFxuICAqIEBwYXJhbSB7bnVtYmVyfSBbcG9pbnRSYWRpdXM9M11cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBwb2ludFJhZGl1cyA9IDMsXG4gIC8qKlxuICAqIFRoZSBzdHJva2Ugd2lkdGggb2YgdGhlIG9pbnRzXG4gICogQHBhcmFtIHtudW1iZXJ9IFtwb2ludFN0cm9rZVdpZHRoPTJdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgcG9pbnRTdHJva2VXaWR0aCA9IDIsXG5cbiAgLyoqXG4gICogQ29sb3Igb2YgdGhlIGJhY2tncm91bmRcbiAgKiBAcGFyYW0ge3N0cmluZ30gW2JhY2tncm91bmRGaWxsPVwidHJhbnNwYXJlbnRcIl1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBiYWNrZ3JvdW5kRmlsbCA9ICd0cmFuc3BhcmVudCcsXG4gIC8qKlxuICAqIE5hbWVzcGFjZSBmb3IgYWxsIGl0ZW1zIG1hZGUgYnkgdGhpcyBpbnN0YW5jZSBvZiBiYXJcbiAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVzcGFjZT1cImQzc20tdmlvbGluXCJdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgbmFtZXNwYWNlID0gJ2Qzc20tdmlvbGluJyxcbiAgLyoqXG4gICogQ2xhc3MgbmFtZSBmb3IgYmFyIGNvbnRhaW5lciAoPGc+IGVsZW1lbnQpXG4gICogQHBhcmFtIHtzdHJpbmd9IFtvYmplY3RDbGFzcz1cInZpb2xpblwiXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG9iamVjdENsYXNzID0gJ3Zpb2xpbicsXG4gIC8qKlxuICAqIER1cmF0aW9uIG9mIGFsbCB0cmFuc2l0aW9ucyBvZiB0aGlzIGVsZW1lbnRcbiAgKiBAcGFyYW0ge251bWJlcn0gW3RyYW5zaXRpb25EdXJhdGlvbj0xMDAwXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHRyYW5zaXRpb25EdXJhdGlvbiA9IDEwMDAsXG4gIC8qKlxuICAqIEVhc2luZyBmdW5jdGlvbiBmb3IgdHJhbnNpdGlvbnNcbiAgKiBAcGFyYW0ge2QzLmVhc2V9IFtlYXNlRnVuYz1kMy5lYXNlRXhwXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGVhc2VGdW5jID0gZDMuZWFzZUV4cCxcblxuICAvKipcbiAgKiBUaGUga2V5IGNvbnRhaW5pbmcgdGhlIHF1YXJ0aWxlc1xuICAqIEBwYXJhbSB7c3RyaW5nfSBbcXVhcnRpbGVzS2V5PXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBxdWFydGlsZXNLZXkgPSBcInF1YXJ0aWxlc1wiLFxuICAvKipcbiAgKiBUaGUga2V5cyBjb3JyZXNwb25kaW5nIHRvIGVhY2ggcXVhcnRpbGVcbiAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbcXVhcnRpbGVLZXlzPVtcIlEwXCIsIFwiUTFcIiwgXCJRMlwiLCBcIlEzXCIsIFwiUTRcIl1dXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgcXVhcnRpbGVLZXlzID0gW1wiUTBcIiwgXCJRMVwiLCBcIlEyXCIsIFwiUTNcIiwgXCJRNFwiXSxcblxuICAvKipcbiAgKiBUaGUga2V5cyBvZiB0aGUgYmFyc1xuICAqIEBwYXJhbSB7c3RyaW5nW119IFt2aW9saW5LZXlzPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB2aW9saW5LZXlzLFxuICAvKipcbiAgKiBUaGUgdmFsdWVzIG9mIHRoZSBiYXJzXG4gICogQHBhcmFtIHtudW1iZXJbXX0gW3Zpb2xpblZhbHVlcz11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdmlvbGluVmFsdWVzLFxuICAvKipcbiAgKiBUaGUgb2JqZWN0U2l6ZSAoYWN0dWFsIHdpZHRoKSB1c2VkIGJ5IHRoZSBiYXJzXG4gICogQHBhcmFtIHtudW1iZXJ9IFtvYmplY3RTaXplPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBvYmplY3RTaXplLFxuICAvKipcbiAgKiBUaGUgc3BhY2VyU2l6ZSAoYWN0dWFsIHdpZHRoKSB1c2VkIGJ5IHRoZSBzcGFjZXJzIGJldHdlZW4gdGhlIGJhcnNcbiAgKiBAcGFyYW0ge251bWJlcn0gW3NwYWNlclNpemU9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNwYWNlclNpemUsXG5cbiAgLyoqXG4gICogSW5zdGFuY2Ugb2YgVG9vbHRpcFxuICAqIEBwYXJhbSB7ZnVuY3Rpb259IFt0b29sdGlwPXRvb2x0aXAoKV1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB0b29sdGlwID0gVFRpcCgpLmtleXMoW3F1YXJ0aWxlS2V5c1s0XSwgcXVhcnRpbGVLZXlzWzNdLCBxdWFydGlsZUtleXNbMl0sIHF1YXJ0aWxlS2V5c1sxXSwgcXVhcnRpbGVLZXlzWzBdXSlcblxuICAvLyxcbiAgLy8gcG9pbnRzVG9vbHRpcCA9IFRUaXAoKVxuXG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgc2VsZWN0aW9uIGluIHdoaWNoIGl0ZW1zIGFyZSBtYW5pcHVsYXRlZFxuICAgKiBAcGFyYW0ge2QzLnNlbGVjdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IGQzLnNlbGVjdGlvbn1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzZWxlY3Rpb24gPSBzZWxlY3Rpb25cbiAgICovXG4gIHZpb2xpbi5zZWxlY3Rpb24gPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNlbGVjdGlvbiA9IF8sIHZpb2xpbikgOiBzZWxlY3Rpb247IH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGRhdGFcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI2RhdGF9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IG9iamVjdH1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICovXG4gIHZpb2xpbi5kYXRhID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkYXRhID0gXywgdmlvbGluKSA6IGRhdGE7IH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIG9yaWVudCBvZiB0aGUgYm94ZXNcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI29yaWVudH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgb2JqZWN0fVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKi9cbiAgdmlvbGluLm9yaWVudCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob3JpZW50ID0gXywgdmlvbGluKSA6IG9yaWVudDsgfTtcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgYW1vdW50IG9mIGhvcml6b250YWwgc3BhY2UgaW4gd2hpY2ggaXRlbXMgYXJlIG1hbmlwdWxhdGVkXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNzcGFjZVh9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV0gc2hvdWxkIGJlIGEgbnVtYmVyID4gMFxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNwYWNlWCA9IHVuZGVmaW5lZFxuICAgKi9cbiAgdmlvbGluLnNwYWNlWCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3BhY2VYID0gXywgdmlvbGluKSA6IHNwYWNlWDsgfTtcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgYW1vdW50IG9mIHZlcnRpY2FsIHNwYWNlIGluIHdoaWNoIGl0ZW1zIGFyZSBtYW5pcHVsYXRlZFxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jc3BhY2VZfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdIHNob3VsZCBiZSBhIG51bWJlciA+IDBcbiAgICogQHJldHVybnMge3Zpb2xpbiB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzcGFjZVkgPSB1bmRlZmluZWRcbiAgICovXG4gIHZpb2xpbi5zcGFjZVkgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNwYWNlWSA9IF8sIHZpb2xpbikgOiBzcGFjZVk7IH07XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgd2hldGhlciBvciBub3QgdmlvbGluIGlzIGFsbG93ZWQgdG8gZ28gYmV5b25kIHNwZWNpZmllZCBkaW1lbnNpb25zXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNvdmVyZmxvd1F9KVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBib29sZWFufVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG92ZXJmbG93USA9IGZhbHNlXG4gICAqL1xuICB2aW9saW4ub3ZlcmZsb3dRID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvdmVyZmxvd1EgPSBfLCB2aW9saW4pIDogb3ZlcmZsb3dROyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgd2hldGhlciBvciBub3QgdG8gcGxvdCBwb2ludHMgd2l0aCB0aGUgdmlvbGluc1xuICAgKiAoc2VlIHtAbGluayB2aW9saW4jcG9pbnRzUX0pXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IGJvb2xlYW59XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgcG9pbnRzUSA9IGZhbHNlXG4gICAqL1xuICB2aW9saW4ucG9pbnRzUSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocG9pbnRzUSA9IF8sIHZpb2xpbikgOiBwb2ludHNROyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBncm91cGluZyBvZiB0aGUgYm94ZXNcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI2dyb3VwaW5nfSlcbiAgICogQHBhcmFtIHtBcnJheVtdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgQXJyYXlbXX1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBncm91cGluZyA9IHVuZGVmaW5lZFxuICAgKi9cbiAgdmlvbGluLmdyb3VwaW5nID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChncm91cGluZyA9IF8sIHZpb2xpbikgOiBncm91cGluZzsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB2YWx1ZUV4dHJhY3RvclxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jdmFsdWVFeHRyYWN0b3J9KVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgZnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqL1xuICB2aW9saW4udmFsdWVFeHRyYWN0b3IgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZhbHVlRXh0cmFjdG9yID0gXywgdmlvbGluKSA6IHZhbHVlRXh0cmFjdG9yOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNvcnRpbmdGdW5jdGlvblxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jc29ydGluZ0Z1bmN0aW9ufSlcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IGZ1bmN0aW9ufVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKi9cbiAgdmlvbGluLnNvcnRpbmdGdW5jdGlvbiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc29ydGluZ0Z1bmN0aW9uID0gXywgdmlvbGluKSA6IHNvcnRpbmdGdW5jdGlvbjsgfTtcblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNjYWxlIGZvciB3aGljaCB0aGUgdmlvbGluIHZhbHVlcyBzaG91bGQgYmUgdHJhbnNmb3JtZWQgYnlcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI3NjYWxlfSlcbiAgICogQHBhcmFtIHtkMy5zY2FsZX0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IGQzLnNjYWxlfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKVxuICAgKi9cbiAgdmlvbGluLnNjYWxlID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzY2FsZSA9IF8sIHZpb2xpbikgOiBzY2FsZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBwYWRkaW5nIGZvciB0aGUgZG9tYWluIG9mIHRoZSBzY2FsZVxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jZG9tYWluUGFkZGluZ30pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGRvbWFpblBhZGRpbmcgPSAwLjVcbiAgICovXG4gIHZpb2xpbi5kb21haW5QYWRkaW5nID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkb21haW5QYWRkaW5nID0gXywgdmlvbGluKSA6IGRvbWFpblBhZGRpbmc7IH07XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgb2JqZWN0U3BhY2VyXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNvYmplY3RTcGFjZXJ9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvYmplY3RTcGFjZXIgPSAwLjA1XG4gICAqL1xuICB2aW9saW4ub2JqZWN0U3BhY2VyID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvYmplY3RTcGFjZXIgPSBfLCB2aW9saW4pIDogb2JqZWN0U3BhY2VyOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG1pbk9iamVjdFNpemVcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI21pbk9iamVjdFNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBtaW5PYmplY3RTaXplID0gMTVcbiAgICovXG4gIHZpb2xpbi5taW5PYmplY3RTaXplID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChtaW5PYmplY3RTaXplID0gXywgdmlvbGluKSA6IG1pbk9iamVjdFNpemU7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbWF4T2JqZWN0U2l6ZVxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jbWF4T2JqZWN0U2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG1heE9iamVjdFNpemUgPSA1MFxuICAgKi9cbiAgdmlvbGluLm1heE9iamVjdFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG1heE9iamVjdFNpemUgPSBfLCB2aW9saW4pIDogbWF4T2JqZWN0U2l6ZTsgfTtcblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG9iamVjdFN0cm9rZVdpZHRoXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNvYmplY3RTdHJva2VXaWR0aH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG9iamVjdFN0cm9rZVdpZHRoID0gMlxuICAgKi9cbiAgdmlvbGluLm9iamVjdFN0cm9rZVdpZHRoID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvYmplY3RTdHJva2VXaWR0aCA9IF8sIHZpb2xpbikgOiBvYmplY3RTdHJva2VXaWR0aDsgfTtcblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgY29sb3JGdW5jdGlvblxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jY29sb3JGdW5jdGlvbn0pXG4gICAqIEBwYXJhbSB7Y29sb3JGdW5jdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IGNvbG9yRnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgY29sb3JGdW5jdGlvbiA9IGNvbG9yRnVuY3Rpb24oKVxuICAgKi9cbiAgdmlvbGluLmNvbG9yRnVuY3Rpb24gPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNvbG9yRnVuY3Rpb24gPSBfLCB2aW9saW4pIDogY29sb3JGdW5jdGlvbjsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBjb2xvckZ1bmN0aW9uXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNjb2xvckZ1bmN0aW9ufSlcbiAgICogQHBhcmFtIHtjb2xvckZ1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgY29sb3JGdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBjb2xvckZ1bmN0aW9uID0gY29sb3JGdW5jdGlvbigpXG4gICAqL1xuICB2aW9saW4ucG9pbnRDb2xvckZ1bmMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBvaW50Q29sb3JGdW5jID0gXywgdmlvbGluKSA6IHBvaW50Q29sb3JGdW5jOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBwb2ludFJhZGl1c1xuICAgKiAoc2VlIHtAbGluayB2aW9saW4jcG9pbnRSYWRpdXN9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBwb2ludFJhZGl1cyA9IDJcbiAgICovXG4gIHZpb2xpbi5wb2ludFJhZGl1cyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocG9pbnRSYWRpdXMgPSBfLCB2aW9saW4pIDogcG9pbnRSYWRpdXM7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgcG9pbnRTdHJva2VXaWR0aFxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jcG9pbnRTdHJva2VXaWR0aH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHBvaW50U3Ryb2tlV2lkdGggPSAyXG4gICAqL1xuICB2aW9saW4ucG9pbnRTdHJva2VXaWR0aCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocG9pbnRTdHJva2VXaWR0aCA9IF8sIHZpb2xpbikgOiBwb2ludFN0cm9rZVdpZHRoOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBiYWNrZ3JvdW5kRmlsbFxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jYmFja2dyb3VuZEZpbGx9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBiYWNrZ3JvdW5kRmlsbCA9ICd0cmFuc3BhcmVudCdcbiAgICovXG4gIHZpb2xpbi5iYWNrZ3JvdW5kRmlsbCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYmFja2dyb3VuZEZpbGwgPSBfLCB2aW9saW4pIDogYmFja2dyb3VuZEZpbGw7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbmFtZXNwYWNlXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNuYW1lc3BhY2V9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBuYW1lc3BhY2UgPSAnZDNzbS12aW9saW4nXG4gICAqL1xuICB2aW9saW4ubmFtZXNwYWNlID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChuYW1lc3BhY2UgPSBfLCB2aW9saW4pIDogbmFtZXNwYWNlOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG9iamVjdENsYXNzXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNvYmplY3RDbGFzc30pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG9iamVjdENsYXNzID0gJ3RpY2stZ3JvdXAnXG4gICAqL1xuICB2aW9saW4ub2JqZWN0Q2xhc3MgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9iamVjdENsYXNzID0gXywgdmlvbGluKSA6IG9iamVjdENsYXNzOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB0cmFuc2l0aW9uRHVyYXRpb25cbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI3RyYW5zaXRpb25EdXJhdGlvbn0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHRyYW5zaXRpb25EdXJhdGlvbiA9IDEwMDBcbiAgICovXG4gIHZpb2xpbi50cmFuc2l0aW9uRHVyYXRpb24gPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRyYW5zaXRpb25EdXJhdGlvbiA9IF8sIHZpb2xpbikgOiB0cmFuc2l0aW9uRHVyYXRpb247IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgZWFzZUZ1bmNcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI2Vhc2VGdW5jfSlcbiAgICogQHBhcmFtIHtkMy5lYXNlfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgZDMuZWFzZX1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBlYXNlRnVuYyA9IGQzLmVhc2VFeHBcbiAgICovXG4gIHZpb2xpbi5lYXNlRnVuYyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZWFzZUZ1bmMgPSBfLCB2aW9saW4pIDogZWFzZUZ1bmM7IH07XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHF1YXJ0aWxlS2V5XG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNxdWFydGlsZUtleX0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHF1YXJ0aWxlS2V5ID0gXCJxdWFydGlsZXNcIlxuICAgKi9cbiAgdmlvbGluLnF1YXJ0aWxlS2V5ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChxdWFydGlsZUtleSA9IF8sIHZpb2xpbikgOiBxdWFydGlsZUtleTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBxdWFydGlsZUtleXNcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI3F1YXJ0aWxlS2V5c30pXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBzdHJpbmdbXX1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBxdWFydGlsZUtleXMgPSBbXCJRMFwiLFwiUTFcIixcIlEyXCIsXCJRM1wiLFwiUTRcIl1cbiAgICovXG4gIHZpb2xpbi5xdWFydGlsZUtleXMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHF1YXJ0aWxlS2V5cyA9IF8sIHZpb2xpbikgOiBxdWFydGlsZUtleXM7IH07XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHZpb2xpbktleXNcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI3Zpb2xpbktleXN9KVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgc3RyaW5nW119XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdmlvbGluS2V5cyA9IHVuZGVmaW5lZFxuICAgKi9cbiAgdmlvbGluLnZpb2xpbktleXMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZpb2xpbktleXMgPSBfLCB2aW9saW4pIDogdmlvbGluS2V5czsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB2aW9saW5WYWx1ZXNcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI3Zpb2xpblZhbHVlc30pXG4gICAqIEBwYXJhbSB7T2JqZWN0W119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBPYmplY3RbXX1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB2aW9saW5WYWx1ZXMgPSB1bmRlZmluZWRcbiAgICovXG4gIHZpb2xpbi52aW9saW5WYWx1ZXMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZpb2xpblZhbHVlcyA9IF8sIHZpb2xpbikgOiB2aW9saW5WYWx1ZXM7IH07XG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBvYmplY3RTaXplXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNvYmplY3RTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgb2JqZWN0U2l6ZSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgdmlvbGluLm9iamVjdFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9iamVjdFNpemUgPSBfLCB2aW9saW4pIDogb2JqZWN0U2l6ZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBzcGFjZXJTaXplXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNzcGFjZXJTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc3BhY2VyU2l6ZSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgdmlvbGluLnNwYWNlclNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNwYWNlclNpemUgPSBfLCB2aW9saW4pIDogc3BhY2VyU2l6ZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB0b29sdGlwXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiN0b29sdGlwfSlcbiAgICogQHBhcmFtIHt0b29sdGlwfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgdG9vbHRpcH1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0b29sdGlwID0gdG9vbHRpcCgpXG4gICAqL1xuICB2aW9saW4udG9vbHRpcCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodG9vbHRpcCA9IF8sIHZpb2xpbikgOiB0b29sdGlwOyB9O1xuICAvLyB2aW9saW4ucG9pbnRzVG9vbHRpcCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocG9pbnRzVG9vbHRpcCA9IF8sIHZpb2xpbikgOiBwb2ludHNUb29sdGlwOyB9O1xuXG4gIGZ1bmN0aW9uIHZpb2xpbiAoKSB7XG4gICAgLy8gZm9yIGNvbnZlbmllbmNlIGluIGhhbmRsaW5nIG9yaWVudGF0aW9uIHNwZWNpZmljIHZhbHVlc1xuICAgIHZhciBob3Jpem9udGFsUSA9IChvcmllbnQgPT0gJ2hvcml6b250YWwnKSA/IHRydWUgOiBmYWxzZVxuICAgIHZhciB2ZXJ0aWNhbFEgPSAhaG9yaXpvbnRhbFFcblxuICAgIC8vIGJhY2tncm91bmQgY2xpcGluZyByZWN0YW5nbGVcbiAgICB2YXIgYmdjcFJlY3QgPSB7eDowLCB5OjAsIHdpZHRoOiBzcGFjZVgsIGhlaWdodDpzcGFjZVl9XG4gICAgdmFyIGNvbnRhaW5lciA9IHNldHVwQ29udGFpbmVyKCBzZWxlY3Rpb24sIG5hbWVzcGFjZSwgYmdjcFJlY3QsIGJhY2tncm91bmRGaWxsICk7XG5cbiAgICAvLyBpZiBncm91cGluZyBpcyB1bmRlZmluZWQgc29ydCB2aW9saW5LZXlzIGJ5IHNvcnRpbmdGdW5jdGlvblxuICAgIHZhciBvcmRlcmVkID0gKGdyb3VwaW5nID09IHVuZGVmaW5lZCkgPyBkMy5rZXlzKGRhdGEpLnNvcnQoc29ydGluZ0Z1bmN0aW9uKSA6IGdyb3VwaW5nXG5cbiAgICB2aW9saW5LZXlzID0gZmxhdHRlbihvcmRlcmVkKVxuICAgIHZpb2xpblZhbHVlcyA9IGV4dHJhY3RWaW9saW5WYWx1ZXModmlvbGluS2V5cywgZGF0YSwgdmFsdWVFeHRyYWN0b3IsIGhvcml6b250YWxRLCBxdWFydGlsZXNLZXksIHF1YXJ0aWxlS2V5cylcblxuICAgIHZhciBudW1iZXJPZk9iamVjdHMgPSB2aW9saW5LZXlzLmxlbmd0aFxuXG5cbiAgICB2YXIgbWluID0gW10uY29uY2F0KC4uLnZpb2xpbktleXMubWFwKGZ1bmN0aW9uKGssIGkpe3JldHVybiB2aW9saW5WYWx1ZXNba11bcXVhcnRpbGVzS2V5XVtxdWFydGlsZUtleXNbMF1dfSkpXG4gICAgdmFyIG1heCA9IFtdLmNvbmNhdCguLi52aW9saW5LZXlzLm1hcChmdW5jdGlvbihrLCBpKXtyZXR1cm4gdmlvbGluVmFsdWVzW2tdW3F1YXJ0aWxlc0tleV1bcXVhcnRpbGVLZXlzW3F1YXJ0aWxlS2V5cy5sZW5ndGggLSAxXV19KSlcbiAgICB2YXIgZXh0ZW50ID0gW01hdGgubWluKC4uLm1pbikgLSBkb21haW5QYWRkaW5nLCBNYXRoLm1heCguLi5tYXgpICsgZG9tYWluUGFkZGluZ11cblxuICAgIC8vIGNvbnNvbGUubG9nKGV4dGVudCwgdmlvbGluVmFsdWVzLCBvcmRlcmVkKVxuXG4gICAgLy8gc2V0IHRoZSBzY2FsZVxuICAgIHNjYWxlLmRvbWFpbihleHRlbnQpLnJhbmdlKGhvcml6b250YWxRID8gWzAsc3BhY2VZXSA6IFswLCBzcGFjZVhdKVxuICAgIHZhciBzcGFjZSA9IGhvcml6b250YWxRID8gc3BhY2VYIDogc3BhY2VZXG4gICAgLy8gY2FsY3VsYXRlIG9iamVjdCBzaXplXG4gICAgb2JqZWN0U2l6ZSA9IGNhbGN1bGF0ZVdpZHRoT2ZPYmplY3Qoc3BhY2UsIG51bWJlck9mT2JqZWN0cywgbWluT2JqZWN0U2l6ZSwgbWF4T2JqZWN0U2l6ZSwgb2JqZWN0U3BhY2VyLCBvdmVyZmxvd1EpXG4gICAgLy8gY2FsY3VsYXRlIHNwYWNlciBzaXplIGlmIG5lZWRlZFxuICAgIHNwYWNlclNpemUgPSBjYWxjdWxhdGVXaWR0aE9mU3BhY2VyKG9yZGVyZWQsIHNwYWNlLCBvYmplY3RTaXplLCBudW1iZXJPZk9iamVjdHMsIG9iamVjdFNwYWNlciwgb3ZlcmZsb3dRKVxuICAgIC8vIG1ha2UgdGhlIG5lc3RlZCBncm91cHNcbiAgICB2YXIgc3BhY2VyRnVuY3Rpb24gPSBncm91cGluZ1NwYWNlcigpXG4gICAgLmhvcml6b250YWxRKGhvcml6b250YWxRKS5zY2FsZShzY2FsZSkubW92ZWJ5KCdjYXRlZ29yeScpLm51bWJlck9mT2JqZWN0cyhudW1iZXJPZk9iamVjdHMpXG4gICAgLm9iamVjdENsYXNzKG9iamVjdENsYXNzKS5vYmplY3RTaXplKG9iamVjdFNpemUpLnNwYWNlclNpemUoc3BhY2VyU2l6ZSlcbiAgICAudHJhbnNpdGlvbkR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuZWFzZUZ1bmMoZWFzZUZ1bmMpXG4gICAgLm5hbWVzcGFjZShuYW1lc3BhY2UpXG5cbiAgICAvLyBtb3ZlIHN0dWZmXG4gICAgc3BhY2VyRnVuY3Rpb24oY29udGFpbmVyLCBvcmRlcmVkLCAwKVxuICAgIC8vIGNvbnNvbGUubG9nKHZpb2xpbktleXMsIG9yZGVyZWQsIGNvbnRhaW5lci5zZWxlY3RBbGwoJ2c6bm90KC50by1yZW1vdmUpLicrb2JqZWN0Q2xhc3MpLm5vZGVzKCkpXG5cbiAgICAvLyBmb3IgY29sb3IgZnVuY3Rpb25cbiAgICB2YXIgcGFyZW50SW5kZXhBcnJheSA9IFtdXG4gICAgY29udGFpbmVyLnNlbGVjdEFsbCgnZzpub3QoLnRvLXJlbW92ZSkuJytvYmplY3RDbGFzcylcbiAgICAuZWFjaChmdW5jdGlvbihkLCBpKXtpZiAoaGFzUSh2aW9saW5LZXlzLCBkKSl7IHBhcmVudEluZGV4QXJyYXkucHVzaChOdW1iZXIoZDMuc2VsZWN0KHRoaXMpLmF0dHIoJ3BhcmVudC1pbmRleCcpKSl9fSlcblxuICAgIC8vIHVwZGF0ZSBjb2xvciBmdW5jdGlvblxuICAgIGNvbG9yRnVuY3Rpb24gPSBjb2xvckZ1bmN0aW9uLmNvbG9yQnkoKSA9PSAnaW5kZXgnXG4gICAgPyBjb2xvckZ1bmN0aW9uLmRhdGFFeHRlbnQoWzAsIE1hdGgubWF4KC4uLnBhcmVudEluZGV4QXJyYXkpXSlcbiAgICA6IGNvbG9yRnVuY3Rpb24uZGF0YUV4dGVudChleHRlbnQpXG5cbiAgICAvKiB2aW9saWluIHNwZWNpZmljIG5lZWRzICovXG5cblxuICAgIHZhciBmcmVxdWVuY3lNYXggPSBNYXRoLm1heCguLi5bXS5jb25jYXQoLi4udmlvbGluS2V5cy5tYXAoZnVuY3Rpb24oaywgaSl7cmV0dXJuIGQzLm1heCh2aW9saW5WYWx1ZXNba10uZnJlcXVlbmNpZXMpfSkpKVxuICAgIHZhciB2U2NhbGUgPSBkMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbMCwgZnJlcXVlbmN5TWF4XSkucmFuZ2UoWzAsIG9iamVjdFNpemUgLyAyXSlcblxuICAgIHZhciBsQXJlYSA9IGQzLmxpbmUoKVxuICAgIC54KGZ1bmN0aW9uKGQsIGkpeyByZXR1cm4gaG9yaXpvbnRhbFEgPyAtdlNjYWxlKGQueCkgOiBzY2FsZShkLngpfSlcbiAgICAueShmdW5jdGlvbihkLCBpKXsgcmV0dXJuIGhvcml6b250YWxRID8gc2NhbGUoZXh0ZW50WzFdKSAtIHNjYWxlKGQueSkgOiAtdlNjYWxlKGQueSl9KVxuICAgIC5jdXJ2ZShkMy5jdXJ2ZUJhc2lzKVxuICAgIHZhciByQXJlYSA9IGQzLmxpbmUoKVxuICAgIC54KGZ1bmN0aW9uKGQsIGkpeyByZXR1cm4gaG9yaXpvbnRhbFEgPyB2U2NhbGUoZC54KSA6IHNjYWxlKGQueCl9KVxuICAgIC55KGZ1bmN0aW9uKGQsIGkpeyByZXR1cm4gaG9yaXpvbnRhbFEgPyBzY2FsZShleHRlbnRbMV0pIC0gc2NhbGUoZC55KSA6IHZTY2FsZShkLnkpfSlcbiAgICAuY3VydmUoZDMuY3VydmVCYXNpcylcblxuXG4gICAgdG9vbHRpcC5zZWxlY3Rpb24oY29udGFpbmVyLnNlbGVjdEFsbCgnZzpub3QoLnRvLXJlbW92ZSkuJytvYmplY3RDbGFzcykpXG4gICAgaWYgKHRvb2x0aXAuZGF0YSgpID09IHVuZGVmaW5lZCkge3Rvb2x0aXAuZGF0YSh2aW9saW5WYWx1ZXMpfVxuICAgIHRvb2x0aXAoKVxuXG5cblxuICAgIGNvbnRhaW5lci5zZWxlY3RBbGwoJ2c6bm90KC50by1yZW1vdmUpLicrb2JqZWN0Q2xhc3MpLmVhY2goZnVuY3Rpb24oa2V5LCBpKXtcbiAgICAgIHZhciB0ID0gZDMuc2VsZWN0KHRoaXMpLFxuICAgICAgY3VycmVudERhdGEgPSBkYXRhW2tleV1cbiAgICAgIC8vIG5lZWRlZCBiZWNhdXNlIGJ1ZyBpbiBzZWxlY3RpbmcgLnRvLXJlbW92ZVxuICAgICAgaWYgKCFoYXNRKHZpb2xpbktleXMsIGtleSkpIHtyZXR1cm59XG4gICAgICB2YXIgZCA9IHZpb2xpblZhbHVlc1trZXldLFxuICAgICAgaSA9IHQuYXR0cigncGFyZW50LWluZGV4JykgPT0gdW5kZWZpbmVkID8gaSA6IHQuYXR0cigncGFyZW50LWluZGV4JyksXG4gICAgICBmaWxsQ29sb3IgPSBjb2xvckZ1bmN0aW9uKGtleSwgZCwgaSwgJ2ZpbGwnKSwgLy8gcHJldmVudCBkdXBsaWNhdGUgY29tcHV0YXRpb25cbiAgICAgIHN0cm9rZUNvbG9yID0gY29sb3JGdW5jdGlvbihrZXksIGQsIGksICdzdHJva2UnKSxcbiAgICAgIGFyZWEgPSBzYWZlU2VsZWN0KHQsICdnJywgJ2FyZWEnKSxcbiAgICAgIGxhID0gc2FmZVNlbGVjdChhcmVhLCAncGF0aCcsICdsZWZ0JyksXG4gICAgICByYSA9IHNhZmVTZWxlY3QoYXJlYSwgJ3BhdGgnLCAncmlnaHQnKSxcbiAgICAgIHF1YXJ0cyA9IHNhZmVTZWxlY3QodCwgJ2cnLCAncXVhcnRzJyksXG4gICAgICBscTMgPSBzYWZlU2VsZWN0KHF1YXJ0cywgJ2xpbmUnLCAncTMnKSxcbiAgICAgIGxxMSA9IHNhZmVTZWxlY3QocXVhcnRzLCAnbGluZScsICdxMScpLFxuICAgICAgcTMgPSBkW3F1YXJ0aWxlc0tleV1bcXVhcnRpbGVLZXlzWzNdXSxcbiAgICAgIHEyID0gZFtxdWFydGlsZXNLZXldW3F1YXJ0aWxlS2V5c1syXV0sXG4gICAgICBxMSA9IGRbcXVhcnRpbGVzS2V5XVtxdWFydGlsZUtleXNbMV1dXG5cbiAgICAgIHQuYXR0cigndHJhbnNmb3JtJywgaG9yaXpvbnRhbFEgPyAndHJhbnNsYXRlKCcrb2JqZWN0U2l6ZSAvIDIrJywwKScgOiAndHJhbnNsYXRlKDAsJytvYmplY3RTaXplIC8gMisnKScgIClcbiAgICAgIC8vIGRyYXcgY3VydmVcbiAgICAgIGxhLnRyYW5zaXRpb24oKS5kdXJhdGlvbih0cmFuc2l0aW9uRHVyYXRpb24pLmF0dHIoJ2QnLCBmdW5jdGlvbihkZCwgaWkpeyByZXR1cm4gbEFyZWEoZC5wb2ludHMpfSlcbiAgICAgIC5hdHRyKCdmaWxsJywgZmlsbENvbG9yKVxuICAgICAgLmF0dHIoJ3N0cm9rZScsIHN0cm9rZUNvbG9yKVxuICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIG9iamVjdFN0cm9rZVdpZHRoKVxuXG4gICAgICByYS50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5hdHRyKCdkJywgZnVuY3Rpb24oZGQsIGlpKXsgcmV0dXJuIHJBcmVhKGQucG9pbnRzKX0pXG4gICAgICAuYXR0cignZmlsbCcsIGZpbGxDb2xvcilcbiAgICAgIC5hdHRyKCdzdHJva2UnLCBzdHJva2VDb2xvcilcbiAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCBvYmplY3RTdHJva2VXaWR0aClcblxuICAgICAgYXJlYS5vbignbW91c2VvdmVyJywgZnVuY3Rpb24oZGQsIGlpKXtcbiAgICAgICAgY29udGFpbmVyLnNlbGVjdEFsbCgnZy4nK29iamVjdENsYXNzKS5zdHlsZSgnb3BhY2l0eScsIDAuMilcbiAgICAgICAgdC5zdHlsZSgnb3BhY2l0eScsIDEpXG4gICAgICAgIGxhLmF0dHIoJ3N0cm9rZS13aWR0aCcsb2JqZWN0U3Ryb2tlV2lkdGgqMilcbiAgICAgICAgcmEuYXR0cignc3Ryb2tlLXdpZHRoJyxvYmplY3RTdHJva2VXaWR0aCoyKVxuICAgICAgfSlcbiAgICAgIGFyZWEub24oJ21vdXNlb3V0JywgZnVuY3Rpb24oZGQsIGlpKXtcbiAgICAgICAgY29udGFpbmVyLnNlbGVjdEFsbCgnZy4nK29iamVjdENsYXNzKS5zdHlsZSgnb3BhY2l0eScsIDEpXG4gICAgICAgIGxhLmF0dHIoJ3N0cm9rZS13aWR0aCcsb2JqZWN0U3Ryb2tlV2lkdGgpXG4gICAgICAgIHJhLmF0dHIoJ3N0cm9rZS13aWR0aCcsb2JqZWN0U3Ryb2tlV2lkdGgpXG4gICAgICB9KVxuXG4gICAgICBpZiAocG9pbnRzUSkge1xuICAgICAgICB2YXIgcHRzQ29udGFpbmVyID0gc2FmZVNlbGVjdCh0LCAnZycsICdwb2ludHMnKSxcbiAgICAgICAgcHRzID0gcHRzQ29udGFpbmVyLnNlbGVjdEFsbCgnLnBvaW50JykuZGF0YShkLnZhbHVlcylcblxuICAgICAgICB2YXIgcHRzRXhpdCA9IHB0cy5leGl0KCkudHJhbnNpdGlvbigpLmVhc2UoZWFzZUZ1bmMpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbilcbiAgICAgICAgLmF0dHIoJ3InLCAwKVxuICAgICAgICAuYXR0cignY3knLCBob3Jpem9udGFsUSA/IHNjYWxlKGV4dGVudFsxXSkgLSBzY2FsZShxMikgOiB2U2NhbGUoMCkpXG4gICAgICAgIC5hdHRyKCdjeCcsIGhvcml6b250YWxRID8gdlNjYWxlKDApIDogc2NhbGUocTIpKS5yZW1vdmUoKVxuXG4gICAgICAgIHZhciBwdHNFbnRlciA9IHB0cy5lbnRlcigpLmFwcGVuZCgnY2lyY2xlJykuYXR0cignY2xhc3MnLCAncG9pbnQnKS5hdHRyKCdyJywgMClcbiAgICAgICAgLmF0dHIoJ2N4JywgaG9yaXpvbnRhbFEgPyAwIDogc2NhbGUocTIpKVxuICAgICAgICAuYXR0cignY3knLCBob3Jpem9udGFsUSA/IHNjYWxlKHEyKSA6IDApXG5cbiAgICAgICAgcHRzID0gcHRzLm1lcmdlKHB0c0VudGVyKVxuXG4gICAgICAgIHB0cy50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlKGVhc2VGdW5jKS5hdHRyKCdyJywgcG9pbnRSYWRpdXMpXG4gICAgICAgIC5hdHRyKCdjeScsIGZ1bmN0aW9uKGRkLCBpaSl7XG4gICAgICAgICAgaWYgKGhvcml6b250YWxRKSB7IHJldHVybiBzY2FsZShleHRlbnRbMV0pIC0gc2NhbGUoZGQpIH1cbiAgICAgICAgICB2YXIgaiA9IHdoaWNoQmluKGQuYmlubmVkLCBkZClcbiAgICAgICAgICB2YXIgciA9IE1hdGgucmFuZG9tKClcbiAgICAgICAgICB2YXIgbiA9IHZTY2FsZShyICogZC5mcmVxdWVuY2llc1tqXSAqIDAuNSlcbiAgICAgICAgICB2YXIgayA9IE1hdGgucmFuZG9tKCkgPiAwLjUgPyBuIDogLW5cbiAgICAgICAgICByZXR1cm4ga1xuICAgICAgICB9KVxuICAgICAgICAuYXR0cignY3gnLCBmdW5jdGlvbihkZCwgaWkpe1xuICAgICAgICAgIGlmIChob3Jpem9udGFsUSkge1xuICAgICAgICAgICAgdmFyIGogPSB3aGljaEJpbihkLmJpbm5lZCwgZGQpXG4gICAgICAgICAgICB2YXIgciA9IE1hdGgucmFuZG9tKClcbiAgICAgICAgICAgIHZhciBuID0gdlNjYWxlKHIgKiBkLmZyZXF1ZW5jaWVzW2pdICogMC41KVxuICAgICAgICAgICAgdmFyIGsgPSBNYXRoLnJhbmRvbSgpID4gMC41ID8gbiA6IC1uXG4gICAgICAgICAgICByZXR1cm4ga1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gc2NhbGUoZGQpXG4gICAgICAgIH0pXG4gICAgICAgIC5hdHRyKCdzdHJva2UnLCBmdW5jdGlvbihkZCwgaWkpIHsgcmV0dXJuIHBvaW50Q29sb3JGdW5jKGRkLCAnc3Ryb2tlJywgc3Ryb2tlQ29sb3IsIG1pbiwgbWF4KSB9KVxuICAgICAgICAuYXR0cignZmlsbCcgICwgZnVuY3Rpb24oZGQsIGlpKSB7IHJldHVybiBwb2ludENvbG9yRnVuYyhkZCwgJ2ZpbGwnICAsIHN0cm9rZUNvbG9yLCBtaW4sIG1heCkgfSlcbiAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIHBvaW50U3Ryb2tlV2lkdGgpXG5cbiAgICAgICAgcHRzQ29udGFpbmVyLnNlbGVjdEFsbCgnY2lyY2xlLnBvaW50Jykub24oJ21vdXNlb3ZlcicsIGZ1bmN0aW9uKGRkLCBpaSl7XG4gICAgICAgICAgLy8gdmFyIGUgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnU1ZHRXZlbnRzJylcbiAgICAgICAgICAvLyBlLmluaXRFdmVudCgnbW91c2VvdmVyJyx0cnVlLHRydWUpO1xuICAgICAgICAgIC8vIGFyZWEubm9kZSgpLmRpc3BhdGNoRXZlbnQoZSlcblxuICAgICAgICAgIGNvbnRhaW5lci5zZWxlY3RBbGwoJ2cuJytvYmplY3RDbGFzcykuc3R5bGUoJ29wYWNpdHknLCAwLjIpXG4gICAgICAgICAgdC5zdHlsZSgnb3BhY2l0eScsIDEpXG4gICAgICAgICAgbGEuYXR0cignc3Ryb2tlLXdpZHRoJyxvYmplY3RTdHJva2VXaWR0aCoyKVxuICAgICAgICAgIHJhLmF0dHIoJ3N0cm9rZS13aWR0aCcsb2JqZWN0U3Ryb2tlV2lkdGgqMilcblxuICAgICAgICAgIGNvbnRhaW5lci5zZWxlY3RBbGwoJy5wb2ludCcpLnN0eWxlKCdvcGFjaXR5JywgMC4yKVxuICAgICAgICAgIGQzLnNlbGVjdCh0aGlzKS5zdHlsZSgnb3BhY2l0eScsIDEpLmF0dHIoJ3InLCBwb2ludFJhZGl1cyAqIDIpLmF0dHIoJ3N0cm9rZS13aWR0aCcscG9pbnRTdHJva2VXaWR0aCoyKVxuICAgICAgICAgIC8vIHBvaW50c1Rvb2x0aXAuZGF0YShkZClcbiAgICAgICAgICAvLyBwb2ludHNUb29sdGlwKClcblxuICAgICAgICB9KVxuICAgICAgICBwdHNDb250YWluZXIuc2VsZWN0QWxsKCdjaXJjbGUucG9pbnQnKS5vbignbW91c2VvdXQnLCBmdW5jdGlvbihkZCwgaWkpe1xuICAgICAgICAgIHZhciBlID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ1NWR0V2ZW50cycpXG4gICAgICAgICAgZS5pbml0RXZlbnQoJ21vdXNlb3V0Jyx0cnVlLHRydWUpO1xuICAgICAgICAgIGFyZWEubm9kZSgpLmRpc3BhdGNoRXZlbnQoZSlcblxuICAgICAgICAgIGNvbnRhaW5lci5zZWxlY3RBbGwoJy5wb2ludCcpLnN0eWxlKCdvcGFjaXR5JywgMSlcbiAgICAgICAgICBkMy5zZWxlY3QodGhpcykuYXR0cignc3Ryb2tlLXdpZHRoJyxwb2ludFN0cm9rZVdpZHRoKS5hdHRyKCdyJywgcG9pbnRSYWRpdXMpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgY1Yuc2VsZWN0QWxsKCcucG9pbnQnKVxuICAgICAgICAudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuZWFzZShlYXNlRnVuYylcbiAgICAgICAgLmF0dHIoJ3InLCAwKVxuICAgICAgICAuYXR0cignY3knLCBob3Jpem9udGFsUSA/IHNjYWxlKGV4dGVudFsxXSkgLSBzY2FsZShxMikgOiB2U2NhbGUoMCkpXG4gICAgICAgIC5hdHRyKCdjeCcsIGhvcml6b250YWxRID8gdlNjYWxlKDApIDogc2NhbGUocTIpKVxuICAgICAgICAucmVtb3ZlKClcbiAgICAgIH1cblxuXG4gICAgfSlcbiAgICB0b29sdGlwLnZhbHVlcyhbXG4gICAgICBmdW5jdGlvbihjdXJyZW50RGF0YSwgdG9vbHRpcEtleSl7IHJldHVybiBjdXJyZW50RGF0YVsncXVhcnRpbGVzJ11bdG9vbHRpcEtleV0gfSxcbiAgICAgIGZ1bmN0aW9uKGN1cnJlbnREYXRhLCB0b29sdGlwS2V5KXsgcmV0dXJuIGN1cnJlbnREYXRhWydxdWFydGlsZXMnXVt0b29sdGlwS2V5XSB9LFxuICAgICAgZnVuY3Rpb24oY3VycmVudERhdGEsIHRvb2x0aXBLZXkpeyByZXR1cm4gY3VycmVudERhdGFbJ3F1YXJ0aWxlcyddW3Rvb2x0aXBLZXldIH0sXG4gICAgICBmdW5jdGlvbihjdXJyZW50RGF0YSwgdG9vbHRpcEtleSl7IHJldHVybiBjdXJyZW50RGF0YVsncXVhcnRpbGVzJ11bdG9vbHRpcEtleV0gfSxcbiAgICAgIGZ1bmN0aW9uKGN1cnJlbnREYXRhLCB0b29sdGlwS2V5KXsgcmV0dXJuIGN1cnJlbnREYXRhWydxdWFydGlsZXMnXVt0b29sdGlwS2V5XSB9XG4gICAgXSlcblxuICB9XG5cbiAgcmV0dXJuIHZpb2xpblxufVxuIiwiLyoqXG4gKiBIZWxwZXJzLlxuICovXG5cbnZhciBzID0gMTAwMDtcbnZhciBtID0gcyAqIDYwO1xudmFyIGggPSBtICogNjA7XG52YXIgZCA9IGggKiAyNDtcbnZhciB5ID0gZCAqIDM2NS4yNTtcblxuLyoqXG4gKiBQYXJzZSBvciBmb3JtYXQgdGhlIGdpdmVuIGB2YWxgLlxuICpcbiAqIE9wdGlvbnM6XG4gKlxuICogIC0gYGxvbmdgIHZlcmJvc2UgZm9ybWF0dGluZyBbZmFsc2VdXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSB2YWxcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEB0aHJvd3Mge0Vycm9yfSB0aHJvdyBhbiBlcnJvciBpZiB2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIG51bWJlclxuICogQHJldHVybiB7U3RyaW5nfE51bWJlcn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbih2YWwsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbDtcbiAgaWYgKHR5cGUgPT09ICdzdHJpbmcnICYmIHZhbC5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHBhcnNlKHZhbCk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgaXNOYU4odmFsKSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5sb25nID8gZm10TG9uZyh2YWwpIDogZm10U2hvcnQodmFsKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgJ3ZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgdmFsaWQgbnVtYmVyLiB2YWw9JyArXG4gICAgICBKU09OLnN0cmluZ2lmeSh2YWwpXG4gICk7XG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBgc3RyYCBhbmQgcmV0dXJuIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZShzdHIpIHtcbiAgc3RyID0gU3RyaW5nKHN0cik7XG4gIGlmIChzdHIubGVuZ3RoID4gMTAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBtYXRjaCA9IC9eKCg/OlxcZCspP1xcLj9cXGQrKSAqKG1pbGxpc2Vjb25kcz98bXNlY3M/fG1zfHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8eWVhcnM/fHlycz98eSk/JC9pLmV4ZWMoXG4gICAgc3RyXG4gICk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG4gPSBwYXJzZUZsb2F0KG1hdGNoWzFdKTtcbiAgdmFyIHR5cGUgPSAobWF0Y2hbMl0gfHwgJ21zJykudG9Mb3dlckNhc2UoKTtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAneWVhcnMnOlxuICAgIGNhc2UgJ3llYXInOlxuICAgIGNhc2UgJ3lycyc6XG4gICAgY2FzZSAneXInOlxuICAgIGNhc2UgJ3knOlxuICAgICAgcmV0dXJuIG4gKiB5O1xuICAgIGNhc2UgJ2RheXMnOlxuICAgIGNhc2UgJ2RheSc6XG4gICAgY2FzZSAnZCc6XG4gICAgICByZXR1cm4gbiAqIGQ7XG4gICAgY2FzZSAnaG91cnMnOlxuICAgIGNhc2UgJ2hvdXInOlxuICAgIGNhc2UgJ2hycyc6XG4gICAgY2FzZSAnaHInOlxuICAgIGNhc2UgJ2gnOlxuICAgICAgcmV0dXJuIG4gKiBoO1xuICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgY2FzZSAnbWlucyc6XG4gICAgY2FzZSAnbWluJzpcbiAgICBjYXNlICdtJzpcbiAgICAgIHJldHVybiBuICogbTtcbiAgICBjYXNlICdzZWNvbmRzJzpcbiAgICBjYXNlICdzZWNvbmQnOlxuICAgIGNhc2UgJ3NlY3MnOlxuICAgIGNhc2UgJ3NlYyc6XG4gICAgY2FzZSAncyc6XG4gICAgICByZXR1cm4gbiAqIHM7XG4gICAgY2FzZSAnbWlsbGlzZWNvbmRzJzpcbiAgICBjYXNlICdtaWxsaXNlY29uZCc6XG4gICAgY2FzZSAnbXNlY3MnOlxuICAgIGNhc2UgJ21zZWMnOlxuICAgIGNhc2UgJ21zJzpcbiAgICAgIHJldHVybiBuO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogU2hvcnQgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZm10U2hvcnQobXMpIHtcbiAgaWYgKG1zID49IGQpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGQpICsgJ2QnO1xuICB9XG4gIGlmIChtcyA+PSBoKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBoKSArICdoJztcbiAgfVxuICBpZiAobXMgPj0gbSkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbSkgKyAnbSc7XG4gIH1cbiAgaWYgKG1zID49IHMpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIHMpICsgJ3MnO1xuICB9XG4gIHJldHVybiBtcyArICdtcyc7XG59XG5cbi8qKlxuICogTG9uZyBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRMb25nKG1zKSB7XG4gIHJldHVybiBwbHVyYWwobXMsIGQsICdkYXknKSB8fFxuICAgIHBsdXJhbChtcywgaCwgJ2hvdXInKSB8fFxuICAgIHBsdXJhbChtcywgbSwgJ21pbnV0ZScpIHx8XG4gICAgcGx1cmFsKG1zLCBzLCAnc2Vjb25kJykgfHxcbiAgICBtcyArICcgbXMnO1xufVxuXG4vKipcbiAqIFBsdXJhbGl6YXRpb24gaGVscGVyLlxuICovXG5cbmZ1bmN0aW9uIHBsdXJhbChtcywgbiwgbmFtZSkge1xuICBpZiAobXMgPCBuKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChtcyA8IG4gKiAxLjUpIHtcbiAgICByZXR1cm4gTWF0aC5mbG9vcihtcyAvIG4pICsgJyAnICsgbmFtZTtcbiAgfVxuICByZXR1cm4gTWF0aC5jZWlsKG1zIC8gbikgKyAnICcgKyBuYW1lICsgJ3MnO1xufVxuIiwiXG4vKipcbiAqIFRoaXMgaXMgdGhlIGNvbW1vbiBsb2dpYyBmb3IgYm90aCB0aGUgTm9kZS5qcyBhbmQgd2ViIGJyb3dzZXJcbiAqIGltcGxlbWVudGF0aW9ucyBvZiBgZGVidWcoKWAuXG4gKlxuICogRXhwb3NlIGBkZWJ1ZygpYCBhcyB0aGUgbW9kdWxlLlxuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZURlYnVnLmRlYnVnID0gY3JlYXRlRGVidWdbJ2RlZmF1bHQnXSA9IGNyZWF0ZURlYnVnO1xuZXhwb3J0cy5jb2VyY2UgPSBjb2VyY2U7XG5leHBvcnRzLmRpc2FibGUgPSBkaXNhYmxlO1xuZXhwb3J0cy5lbmFibGUgPSBlbmFibGU7XG5leHBvcnRzLmVuYWJsZWQgPSBlbmFibGVkO1xuZXhwb3J0cy5odW1hbml6ZSA9IHJlcXVpcmUoJ21zJyk7XG5cbi8qKlxuICogVGhlIGN1cnJlbnRseSBhY3RpdmUgZGVidWcgbW9kZSBuYW1lcywgYW5kIG5hbWVzIHRvIHNraXAuXG4gKi9cblxuZXhwb3J0cy5uYW1lcyA9IFtdO1xuZXhwb3J0cy5za2lwcyA9IFtdO1xuXG4vKipcbiAqIE1hcCBvZiBzcGVjaWFsIFwiJW5cIiBoYW5kbGluZyBmdW5jdGlvbnMsIGZvciB0aGUgZGVidWcgXCJmb3JtYXRcIiBhcmd1bWVudC5cbiAqXG4gKiBWYWxpZCBrZXkgbmFtZXMgYXJlIGEgc2luZ2xlLCBsb3dlciBvciB1cHBlci1jYXNlIGxldHRlciwgaS5lLiBcIm5cIiBhbmQgXCJOXCIuXG4gKi9cblxuZXhwb3J0cy5mb3JtYXR0ZXJzID0ge307XG5cbi8qKlxuICogUHJldmlvdXMgbG9nIHRpbWVzdGFtcC5cbiAqL1xuXG52YXIgcHJldlRpbWU7XG5cbi8qKlxuICogU2VsZWN0IGEgY29sb3IuXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzZWxlY3RDb2xvcihuYW1lc3BhY2UpIHtcbiAgdmFyIGhhc2ggPSAwLCBpO1xuXG4gIGZvciAoaSBpbiBuYW1lc3BhY2UpIHtcbiAgICBoYXNoICA9ICgoaGFzaCA8PCA1KSAtIGhhc2gpICsgbmFtZXNwYWNlLmNoYXJDb2RlQXQoaSk7XG4gICAgaGFzaCB8PSAwOyAvLyBDb252ZXJ0IHRvIDMyYml0IGludGVnZXJcbiAgfVxuXG4gIHJldHVybiBleHBvcnRzLmNvbG9yc1tNYXRoLmFicyhoYXNoKSAlIGV4cG9ydHMuY29sb3JzLmxlbmd0aF07XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgZGVidWdnZXIgd2l0aCB0aGUgZ2l2ZW4gYG5hbWVzcGFjZWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZURlYnVnKG5hbWVzcGFjZSkge1xuXG4gIGZ1bmN0aW9uIGRlYnVnKCkge1xuICAgIC8vIGRpc2FibGVkP1xuICAgIGlmICghZGVidWcuZW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgdmFyIHNlbGYgPSBkZWJ1ZztcblxuICAgIC8vIHNldCBgZGlmZmAgdGltZXN0YW1wXG4gICAgdmFyIGN1cnIgPSArbmV3IERhdGUoKTtcbiAgICB2YXIgbXMgPSBjdXJyIC0gKHByZXZUaW1lIHx8IGN1cnIpO1xuICAgIHNlbGYuZGlmZiA9IG1zO1xuICAgIHNlbGYucHJldiA9IHByZXZUaW1lO1xuICAgIHNlbGYuY3VyciA9IGN1cnI7XG4gICAgcHJldlRpbWUgPSBjdXJyO1xuXG4gICAgLy8gdHVybiB0aGUgYGFyZ3VtZW50c2AgaW50byBhIHByb3BlciBBcnJheVxuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG5cbiAgICBhcmdzWzBdID0gZXhwb3J0cy5jb2VyY2UoYXJnc1swXSk7XG5cbiAgICBpZiAoJ3N0cmluZycgIT09IHR5cGVvZiBhcmdzWzBdKSB7XG4gICAgICAvLyBhbnl0aGluZyBlbHNlIGxldCdzIGluc3BlY3Qgd2l0aCAlT1xuICAgICAgYXJncy51bnNoaWZ0KCclTycpO1xuICAgIH1cblxuICAgIC8vIGFwcGx5IGFueSBgZm9ybWF0dGVyc2AgdHJhbnNmb3JtYXRpb25zXG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICBhcmdzWzBdID0gYXJnc1swXS5yZXBsYWNlKC8lKFthLXpBLVolXSkvZywgZnVuY3Rpb24obWF0Y2gsIGZvcm1hdCkge1xuICAgICAgLy8gaWYgd2UgZW5jb3VudGVyIGFuIGVzY2FwZWQgJSB0aGVuIGRvbid0IGluY3JlYXNlIHRoZSBhcnJheSBpbmRleFxuICAgICAgaWYgKG1hdGNoID09PSAnJSUnKSByZXR1cm4gbWF0Y2g7XG4gICAgICBpbmRleCsrO1xuICAgICAgdmFyIGZvcm1hdHRlciA9IGV4cG9ydHMuZm9ybWF0dGVyc1tmb3JtYXRdO1xuICAgICAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBmb3JtYXR0ZXIpIHtcbiAgICAgICAgdmFyIHZhbCA9IGFyZ3NbaW5kZXhdO1xuICAgICAgICBtYXRjaCA9IGZvcm1hdHRlci5jYWxsKHNlbGYsIHZhbCk7XG5cbiAgICAgICAgLy8gbm93IHdlIG5lZWQgdG8gcmVtb3ZlIGBhcmdzW2luZGV4XWAgc2luY2UgaXQncyBpbmxpbmVkIGluIHRoZSBgZm9ybWF0YFxuICAgICAgICBhcmdzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIGluZGV4LS07XG4gICAgICB9XG4gICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfSk7XG5cbiAgICAvLyBhcHBseSBlbnYtc3BlY2lmaWMgZm9ybWF0dGluZyAoY29sb3JzLCBldGMuKVxuICAgIGV4cG9ydHMuZm9ybWF0QXJncy5jYWxsKHNlbGYsIGFyZ3MpO1xuXG4gICAgdmFyIGxvZ0ZuID0gZGVidWcubG9nIHx8IGV4cG9ydHMubG9nIHx8IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSk7XG4gICAgbG9nRm4uYXBwbHkoc2VsZiwgYXJncyk7XG4gIH1cblxuICBkZWJ1Zy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG4gIGRlYnVnLmVuYWJsZWQgPSBleHBvcnRzLmVuYWJsZWQobmFtZXNwYWNlKTtcbiAgZGVidWcudXNlQ29sb3JzID0gZXhwb3J0cy51c2VDb2xvcnMoKTtcbiAgZGVidWcuY29sb3IgPSBzZWxlY3RDb2xvcihuYW1lc3BhY2UpO1xuXG4gIC8vIGVudi1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBsb2dpYyBmb3IgZGVidWcgaW5zdGFuY2VzXG4gIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2YgZXhwb3J0cy5pbml0KSB7XG4gICAgZXhwb3J0cy5pbml0KGRlYnVnKTtcbiAgfVxuXG4gIHJldHVybiBkZWJ1Zztcbn1cblxuLyoqXG4gKiBFbmFibGVzIGEgZGVidWcgbW9kZSBieSBuYW1lc3BhY2VzLiBUaGlzIGNhbiBpbmNsdWRlIG1vZGVzXG4gKiBzZXBhcmF0ZWQgYnkgYSBjb2xvbiBhbmQgd2lsZGNhcmRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGVuYWJsZShuYW1lc3BhY2VzKSB7XG4gIGV4cG9ydHMuc2F2ZShuYW1lc3BhY2VzKTtcblxuICBleHBvcnRzLm5hbWVzID0gW107XG4gIGV4cG9ydHMuc2tpcHMgPSBbXTtcblxuICB2YXIgc3BsaXQgPSAodHlwZW9mIG5hbWVzcGFjZXMgPT09ICdzdHJpbmcnID8gbmFtZXNwYWNlcyA6ICcnKS5zcGxpdCgvW1xccyxdKy8pO1xuICB2YXIgbGVuID0gc3BsaXQubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAoIXNwbGl0W2ldKSBjb250aW51ZTsgLy8gaWdub3JlIGVtcHR5IHN0cmluZ3NcbiAgICBuYW1lc3BhY2VzID0gc3BsaXRbaV0ucmVwbGFjZSgvXFwqL2csICcuKj8nKTtcbiAgICBpZiAobmFtZXNwYWNlc1swXSA9PT0gJy0nKSB7XG4gICAgICBleHBvcnRzLnNraXBzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzLnN1YnN0cigxKSArICckJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHBvcnRzLm5hbWVzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzICsgJyQnKSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRGlzYWJsZSBkZWJ1ZyBvdXRwdXQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBkaXNhYmxlKCkge1xuICBleHBvcnRzLmVuYWJsZSgnJyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBtb2RlIG5hbWUgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBlbmFibGVkKG5hbWUpIHtcbiAgdmFyIGksIGxlbjtcbiAgZm9yIChpID0gMCwgbGVuID0gZXhwb3J0cy5za2lwcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGlmIChleHBvcnRzLnNraXBzW2ldLnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgZm9yIChpID0gMCwgbGVuID0gZXhwb3J0cy5uYW1lcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGlmIChleHBvcnRzLm5hbWVzW2ldLnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ29lcmNlIGB2YWxgLlxuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IHZhbFxuICogQHJldHVybiB7TWl4ZWR9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjb2VyY2UodmFsKSB7XG4gIGlmICh2YWwgaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIHZhbC5zdGFjayB8fCB2YWwubWVzc2FnZTtcbiAgcmV0dXJuIHZhbDtcbn1cbiIsIi8qKlxuICogVGhpcyBpcyB0aGUgd2ViIGJyb3dzZXIgaW1wbGVtZW50YXRpb24gb2YgYGRlYnVnKClgLlxuICpcbiAqIEV4cG9zZSBgZGVidWcoKWAgYXMgdGhlIG1vZHVsZS5cbiAqL1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2RlYnVnJyk7XG5leHBvcnRzLmxvZyA9IGxvZztcbmV4cG9ydHMuZm9ybWF0QXJncyA9IGZvcm1hdEFyZ3M7XG5leHBvcnRzLnNhdmUgPSBzYXZlO1xuZXhwb3J0cy5sb2FkID0gbG9hZDtcbmV4cG9ydHMudXNlQ29sb3JzID0gdXNlQ29sb3JzO1xuZXhwb3J0cy5zdG9yYWdlID0gJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGNocm9tZVxuICAgICAgICAgICAgICAgJiYgJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGNocm9tZS5zdG9yYWdlXG4gICAgICAgICAgICAgICAgICA/IGNocm9tZS5zdG9yYWdlLmxvY2FsXG4gICAgICAgICAgICAgICAgICA6IGxvY2Fsc3RvcmFnZSgpO1xuXG4vKipcbiAqIENvbG9ycy5cbiAqL1xuXG5leHBvcnRzLmNvbG9ycyA9IFtcbiAgJ2xpZ2h0c2VhZ3JlZW4nLFxuICAnZm9yZXN0Z3JlZW4nLFxuICAnZ29sZGVucm9kJyxcbiAgJ2RvZGdlcmJsdWUnLFxuICAnZGFya29yY2hpZCcsXG4gICdjcmltc29uJ1xuXTtcblxuLyoqXG4gKiBDdXJyZW50bHkgb25seSBXZWJLaXQtYmFzZWQgV2ViIEluc3BlY3RvcnMsIEZpcmVmb3ggPj0gdjMxLFxuICogYW5kIHRoZSBGaXJlYnVnIGV4dGVuc2lvbiAoYW55IEZpcmVmb3ggdmVyc2lvbikgYXJlIGtub3duXG4gKiB0byBzdXBwb3J0IFwiJWNcIiBDU1MgY3VzdG9taXphdGlvbnMuXG4gKlxuICogVE9ETzogYWRkIGEgYGxvY2FsU3RvcmFnZWAgdmFyaWFibGUgdG8gZXhwbGljaXRseSBlbmFibGUvZGlzYWJsZSBjb2xvcnNcbiAqL1xuXG5mdW5jdGlvbiB1c2VDb2xvcnMoKSB7XG4gIC8vIE5COiBJbiBhbiBFbGVjdHJvbiBwcmVsb2FkIHNjcmlwdCwgZG9jdW1lbnQgd2lsbCBiZSBkZWZpbmVkIGJ1dCBub3QgZnVsbHlcbiAgLy8gaW5pdGlhbGl6ZWQuIFNpbmNlIHdlIGtub3cgd2UncmUgaW4gQ2hyb21lLCB3ZSdsbCBqdXN0IGRldGVjdCB0aGlzIGNhc2VcbiAgLy8gZXhwbGljaXRseVxuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LnByb2Nlc3MgJiYgd2luZG93LnByb2Nlc3MudHlwZSA9PT0gJ3JlbmRlcmVyJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gaXMgd2Via2l0PyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xNjQ1OTYwNi8zNzY3NzNcbiAgLy8gZG9jdW1lbnQgaXMgdW5kZWZpbmVkIGluIHJlYWN0LW5hdGl2ZTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0LW5hdGl2ZS9wdWxsLzE2MzJcbiAgcmV0dXJuICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLldlYmtpdEFwcGVhcmFuY2UpIHx8XG4gICAgLy8gaXMgZmlyZWJ1Zz8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzk4MTIwLzM3Njc3M1xuICAgICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuY29uc29sZSAmJiAod2luZG93LmNvbnNvbGUuZmlyZWJ1ZyB8fCAod2luZG93LmNvbnNvbGUuZXhjZXB0aW9uICYmIHdpbmRvdy5jb25zb2xlLnRhYmxlKSkpIHx8XG4gICAgLy8gaXMgZmlyZWZveCA+PSB2MzE/XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9Ub29scy9XZWJfQ29uc29sZSNTdHlsaW5nX21lc3NhZ2VzXG4gICAgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9maXJlZm94XFwvKFxcZCspLykgJiYgcGFyc2VJbnQoUmVnRXhwLiQxLCAxMCkgPj0gMzEpIHx8XG4gICAgLy8gZG91YmxlIGNoZWNrIHdlYmtpdCBpbiB1c2VyQWdlbnQganVzdCBpbiBjYXNlIHdlIGFyZSBpbiBhIHdvcmtlclxuICAgICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvYXBwbGV3ZWJraXRcXC8oXFxkKykvKSk7XG59XG5cbi8qKlxuICogTWFwICVqIHRvIGBKU09OLnN0cmluZ2lmeSgpYCwgc2luY2Ugbm8gV2ViIEluc3BlY3RvcnMgZG8gdGhhdCBieSBkZWZhdWx0LlxuICovXG5cbmV4cG9ydHMuZm9ybWF0dGVycy5qID0gZnVuY3Rpb24odikge1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuICdbVW5leHBlY3RlZEpTT05QYXJzZUVycm9yXTogJyArIGVyci5tZXNzYWdlO1xuICB9XG59O1xuXG5cbi8qKlxuICogQ29sb3JpemUgbG9nIGFyZ3VtZW50cyBpZiBlbmFibGVkLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZm9ybWF0QXJncyhhcmdzKSB7XG4gIHZhciB1c2VDb2xvcnMgPSB0aGlzLnVzZUNvbG9ycztcblxuICBhcmdzWzBdID0gKHVzZUNvbG9ycyA/ICclYycgOiAnJylcbiAgICArIHRoaXMubmFtZXNwYWNlXG4gICAgKyAodXNlQ29sb3JzID8gJyAlYycgOiAnICcpXG4gICAgKyBhcmdzWzBdXG4gICAgKyAodXNlQ29sb3JzID8gJyVjICcgOiAnICcpXG4gICAgKyAnKycgKyBleHBvcnRzLmh1bWFuaXplKHRoaXMuZGlmZik7XG5cbiAgaWYgKCF1c2VDb2xvcnMpIHJldHVybjtcblxuICB2YXIgYyA9ICdjb2xvcjogJyArIHRoaXMuY29sb3I7XG4gIGFyZ3Muc3BsaWNlKDEsIDAsIGMsICdjb2xvcjogaW5oZXJpdCcpXG5cbiAgLy8gdGhlIGZpbmFsIFwiJWNcIiBpcyBzb21ld2hhdCB0cmlja3ksIGJlY2F1c2UgdGhlcmUgY291bGQgYmUgb3RoZXJcbiAgLy8gYXJndW1lbnRzIHBhc3NlZCBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIHRoZSAlYywgc28gd2UgbmVlZCB0b1xuICAvLyBmaWd1cmUgb3V0IHRoZSBjb3JyZWN0IGluZGV4IHRvIGluc2VydCB0aGUgQ1NTIGludG9cbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxhc3RDID0gMDtcbiAgYXJnc1swXS5yZXBsYWNlKC8lW2EtekEtWiVdL2csIGZ1bmN0aW9uKG1hdGNoKSB7XG4gICAgaWYgKCclJScgPT09IG1hdGNoKSByZXR1cm47XG4gICAgaW5kZXgrKztcbiAgICBpZiAoJyVjJyA9PT0gbWF0Y2gpIHtcbiAgICAgIC8vIHdlIG9ubHkgYXJlIGludGVyZXN0ZWQgaW4gdGhlICpsYXN0KiAlY1xuICAgICAgLy8gKHRoZSB1c2VyIG1heSBoYXZlIHByb3ZpZGVkIHRoZWlyIG93bilcbiAgICAgIGxhc3RDID0gaW5kZXg7XG4gICAgfVxuICB9KTtcblxuICBhcmdzLnNwbGljZShsYXN0QywgMCwgYyk7XG59XG5cbi8qKlxuICogSW52b2tlcyBgY29uc29sZS5sb2coKWAgd2hlbiBhdmFpbGFibGUuXG4gKiBOby1vcCB3aGVuIGBjb25zb2xlLmxvZ2AgaXMgbm90IGEgXCJmdW5jdGlvblwiLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gbG9nKCkge1xuICAvLyB0aGlzIGhhY2tlcnkgaXMgcmVxdWlyZWQgZm9yIElFOC85LCB3aGVyZVxuICAvLyB0aGUgYGNvbnNvbGUubG9nYCBmdW5jdGlvbiBkb2Vzbid0IGhhdmUgJ2FwcGx5J1xuICByZXR1cm4gJ29iamVjdCcgPT09IHR5cGVvZiBjb25zb2xlXG4gICAgJiYgY29uc29sZS5sb2dcbiAgICAmJiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChjb25zb2xlLmxvZywgY29uc29sZSwgYXJndW1lbnRzKTtcbn1cblxuLyoqXG4gKiBTYXZlIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc2F2ZShuYW1lc3BhY2VzKSB7XG4gIHRyeSB7XG4gICAgaWYgKG51bGwgPT0gbmFtZXNwYWNlcykge1xuICAgICAgZXhwb3J0cy5zdG9yYWdlLnJlbW92ZUl0ZW0oJ2RlYnVnJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4cG9ydHMuc3RvcmFnZS5kZWJ1ZyA9IG5hbWVzcGFjZXM7XG4gICAgfVxuICB9IGNhdGNoKGUpIHt9XG59XG5cbi8qKlxuICogTG9hZCBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHJldHVybiB7U3RyaW5nfSByZXR1cm5zIHRoZSBwcmV2aW91c2x5IHBlcnNpc3RlZCBkZWJ1ZyBtb2Rlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbG9hZCgpIHtcbiAgdmFyIHI7XG4gIHRyeSB7XG4gICAgciA9IGV4cG9ydHMuc3RvcmFnZS5kZWJ1ZztcbiAgfSBjYXRjaChlKSB7fVxuXG4gIC8vIElmIGRlYnVnIGlzbid0IHNldCBpbiBMUywgYW5kIHdlJ3JlIGluIEVsZWN0cm9uLCB0cnkgdG8gbG9hZCAkREVCVUdcbiAgaWYgKCFyICYmIHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiAnZW52JyBpbiBwcm9jZXNzKSB7XG4gICAgciA9IHByb2Nlc3MuZW52LkRFQlVHO1xuICB9XG5cbiAgcmV0dXJuIHI7XG59XG5cbi8qKlxuICogRW5hYmxlIG5hbWVzcGFjZXMgbGlzdGVkIGluIGBsb2NhbFN0b3JhZ2UuZGVidWdgIGluaXRpYWxseS5cbiAqL1xuXG5leHBvcnRzLmVuYWJsZShsb2FkKCkpO1xuXG4vKipcbiAqIExvY2Fsc3RvcmFnZSBhdHRlbXB0cyB0byByZXR1cm4gdGhlIGxvY2Fsc3RvcmFnZS5cbiAqXG4gKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNhZmFyaSB0aHJvd3NcbiAqIHdoZW4gYSB1c2VyIGRpc2FibGVzIGNvb2tpZXMvbG9jYWxzdG9yYWdlXG4gKiBhbmQgeW91IGF0dGVtcHQgdG8gYWNjZXNzIGl0LlxuICpcbiAqIEByZXR1cm4ge0xvY2FsU3RvcmFnZX1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGxvY2Fsc3RvcmFnZSgpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gd2luZG93LmxvY2FsU3RvcmFnZTtcbiAgfSBjYXRjaCAoZSkge31cbn1cbiIsIi8vIEltcG9ydCBzdHlsZXMgKGF1dG9tYXRpY2FsbHkgaW5qZWN0IGludG8gPGhlYWQ+KS5cbi8vIGltcG9ydCAnLi4vc3R5bGVzL21haW4uY3NzJztcbmltcG9ydCB7YXhpc30gZnJvbSAnLi9tb2R1bGVzL2F4aXMnO1xuaW1wb3J0IHtiYXJ9IGZyb20gJy4vbW9kdWxlcy9iYXInO1xuaW1wb3J0IHtidWJibGVIZWF0bWFwfSBmcm9tICcuL21vZHVsZXMvYnViYmxlLWhlYXRtYXAnO1xuaW1wb3J0IHtib3h3aGlza2VyfSBmcm9tICcuL21vZHVsZXMvYm94LXdoaXNrZXInO1xuaW1wb3J0IHtjb2xvckZ1bmN0aW9ufSBmcm9tICcuL21vZHVsZXMvY29sb3ItZnVuY3Rpb24nO1xuaW1wb3J0IHtkYXRhdG9nZ2xlfSBmcm9tICcuL21vZHVsZXMvZGF0YS10b2dnbGUnO1xuaW1wb3J0IHtncm91cGluZ1NwYWNlcn0gZnJvbSAnLi9tb2R1bGVzL2dyb3VwaW5nLXNwYWNlcic7XG5pbXBvcnQge3Rvb2x0aXB9IGZyb20gJy4vbW9kdWxlcy90b29sdGlwJztcbmltcG9ydCB7c2NhdHRlcn0gZnJvbSAnLi9tb2R1bGVzL3NjYXR0ZXInO1xuaW1wb3J0IHtwbG90Wm9vbX0gZnJvbSAnLi9tb2R1bGVzL3Bsb3Qtem9vbSc7XG5pbXBvcnQge3Zpb2xpbn0gZnJvbSAnLi9tb2R1bGVzL3Zpb2xpbic7XG5cbmltcG9ydCB7dW5pcXVlRWxlbWVudHMsIGdldFRyYW5zbGF0aW9uLCBtb2RpZnlIZXhpZGVjaW1hbENvbG9yTHVtaW5hbmNlLCB0aWNrUmFuZ2UsXG5xdWFydGlsZXMsIGV4dHJhY3RWaW9saW5WYWx1ZXMsIGh5cGVuYXRlLCByb3VuZCwgZ2V0Q29udGFpbmluZ1NWRyxcbmludGVycG9sYXRlQ29sb3JzLCB0cnVuY2F0ZVRleHQsIHNhZmVTZWxlY3R9IGZyb20gJy4vbW9kdWxlcy9oZWxwZXJzJztcblxuaW1wb3J0IHtcbiAgYWxsLCB0YWxseSwgaGFzUSwgZmlyc3QsIGxhc3QsIHRvdGFsLCB1bmlxdWUsIGdldCwgbGlzdE9mTGlzdHNRLFxuICBjdXQsIGdyb3VwQnksIGFycmF5RXF1YWxzLCBlbGVtZW50c0F0TGV2ZWxzLCBudW1iZXJPZkVsZW1lbnRzLFxuICBmbGF0dGVuLCB3aGljaEJpblxufSBmcm9tICcuL21vZHVsZXMvYXJyYXktZnVuY3Rpb25zJztcblxuXG5pbXBvcnQge1xuICBzZXR1cFN0YW5kYXJkQ2hhcnRDb250YWluZXJzLCBsb2cgYXMgbXlMb2csIHdhcm4sIGluZm8sIGVycm9yLFxuICBjb25zb2xlR3JvdXAsIGNvbnNvbGVHcm91cEVuZFxufSBmcm9tICcuL21vZHVsZXMvdXRpbHMnO1xuXG4vLyAvKiogQG1vZHVsZSBkM3NtICovXG52YXIgZDNzbSA9IHt9O1xuZDNzbS5heGlzID0gYXhpcztcbmQzc20uYmFyID0gYmFyO1xuZDNzbS5idWJibGVIZWF0bWFwID0gYnViYmxlSGVhdG1hcDtcbmQzc20uYm94d2hpc2tlciA9IGJveHdoaXNrZXI7XG5kM3NtLmNvbG9yRnVuY3Rpb24gPSBjb2xvckZ1bmN0aW9uO1xuZDNzbS5kYXRhdG9nZ2xlID0gZGF0YXRvZ2dsZTtcbmQzc20uZ3JvdXBpbmdTcGFjZXIgPSBncm91cGluZ1NwYWNlcjtcbmQzc20udG9vbHRpcCA9IHRvb2x0aXA7XG5kM3NtLnNjYXR0ZXIgPSBzY2F0dGVyO1xuZDNzbS5wbG90Wm9vbSA9IHBsb3Rab29tO1xuZDNzbS52aW9saW4gPSB2aW9saW47XG5cbmQzc20udW5pcXVlRWxlbWVudHMgPSB1bmlxdWVFbGVtZW50cztcbmQzc20uZ2V0VHJhbnNsYXRpb24gPSBnZXRUcmFuc2xhdGlvbjtcbmQzc20ubW9kaWZ5SGV4aWRlY2ltYWxDb2xvckx1bWluYW5jZSA9IG1vZGlmeUhleGlkZWNpbWFsQ29sb3JMdW1pbmFuY2U7XG5kM3NtLnRpY2tSYW5nZSA9IHRpY2tSYW5nZTtcbmQzc20ucXVhcnRpbGVzID0gcXVhcnRpbGVzO1xuZDNzbS5leHRyYWN0VmlvbGluVmFsdWVzID0gZXh0cmFjdFZpb2xpblZhbHVlcztcbmQzc20uaHlwZW5hdGUgPSBoeXBlbmF0ZTtcbmQzc20ucm91bmQgPSByb3VuZDtcbmQzc20uZ2V0Q29udGFpbmluZ1NWRyA9IGdldENvbnRhaW5pbmdTVkc7XG5kM3NtLmludGVycG9sYXRlQ29sb3JzID0gaW50ZXJwb2xhdGVDb2xvcnM7XG5kM3NtLnRydW5jYXRlVGV4dCA9IHRydW5jYXRlVGV4dDtcbmQzc20uc2FmZVNlbGVjdCA9IHNhZmVTZWxlY3Q7XG5cbmQzc20ud2hpY2hCaW4gPSB3aGljaEJpbjtcbmQzc20udW5pcXVlID0gdW5pcXVlO1xuXG5kM3NtLnNldHVwU3RhbmRhcmRDaGFydENvbnRhaW5lcnMgPSBzZXR1cFN0YW5kYXJkQ2hhcnRDb250YWluZXJzO1xuZDNzbS5sb2cgPSBteUxvZztcbmQzc20ud2FybiA9IHdhcm47XG5kM3NtLmluZm8gPSBpbmZvO1xuZDNzbS5lcnJvciA9IGVycm9yO1xuZDNzbS5jb25zb2xlR3JvdXAgPSBjb25zb2xlR3JvdXA7XG5kM3NtLmNvbnNvbGVHcm91cEVuZCA9IGNvbnNvbGVHcm91cEVuZDtcblxuZDNzbS5kZWJ1Z1EgPSBmYWxzZVxuXG5cblxuLy8gSW1wb3J0IGEgbG9nZ2VyIGZvciBlYXNpZXIgZGVidWdnaW5nXG5pbXBvcnQgZGVidWcgZnJvbSAnZGVidWcnO1xuY29uc3QgbG9nID0gZGVidWcoJ2FwcDpsb2cnKTtcblxuLy8gVGhlIGxvZ2dlciBzaG91bGQgb25seSBiZSBkaXNhYmxlZCBpZiB3ZSdyZSBub3QgaW4gcHJvZHVjdGlvbi5cbmlmIChFTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAvLyBFbmFibGUgdGhlIGxvZ2dlci5cbiAgZGVidWcuZW5hYmxlKCcqJyk7XG4gIGxvZygnTG9nZ2luZyBpcyBlbmFibGVkIScpO1xuXG4gIC8vIEVuYWJsZSBMaXZlUmVsb2FkXG4gIGRvY3VtZW50LndyaXRlKFxuICAgICc8c2NyaXB0IHNyYz1cImh0dHA6Ly8nXG4gICAgKyAobG9jYXRpb24uaG9zdCB8fCAnbG9jYWxob3N0Jykuc3BsaXQoJzonKVswXVxuICAgICsgJzozNTcyOS9saXZlcmVsb2FkLmpzP3NuaXB2ZXI9MVwiPjwvJ1xuICAgICsgJ3NjcmlwdD4nXG4gICk7XG59IGVsc2Uge1xuICBkZWJ1Zy5kaXNhYmxlKCk7XG59XG5cbndpbmRvdy5kM3NtID0gZDNzbTtcbiJdLCJuYW1lcyI6WyJ1bmlxdWVFbGVtZW50cyIsInZhbHVlIiwiaW5kZXgiLCJzZWxmIiwiaW5kZXhPZiIsImdldFRyYW5zbGF0aW9uIiwidHJhbnNmb3JtIiwiZyIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudE5TIiwidW5kZWZpbmVkIiwic2V0QXR0cmlidXRlTlMiLCJtYXRyaXgiLCJiYXNlVmFsIiwiY29uc29saWRhdGUiLCJlIiwiZiIsIm1vZGlmeUhleGlkZWNpbWFsQ29sb3JMdW1pbmFuY2UiLCJoZXgiLCJsdW0iLCJTdHJpbmciLCJyZXBsYWNlIiwibGVuZ3RoIiwicmdiIiwiYyIsImkiLCJwYXJzZUludCIsInN1YnN0ciIsIk1hdGgiLCJyb3VuZCIsIm1pbiIsIm1heCIsInRvU3RyaW5nIiwicXVhcnRpbGVzIiwiZGF0YSIsInFLZXlzIiwicTIiLCJkMyIsIm1lZGlhbiIsImxvd2VyIiwiZmlsdGVyIiwieCIsInVwcGVyIiwicTEiLCJxMCIsInEzIiwicTQiLCJrMCIsImsxIiwiazIiLCJrMyIsIms0Iiwib2JqIiwiZXh0cmFjdFZpb2xpblZhbHVlcyIsInZpb2xpbktleXMiLCJ2YWx1ZUV4dHJhY3RvckZ1bmN0aW9uIiwiaG9yaXpvbnRhbFEiLCJxS2V5IiwibWFwIiwiayIsImQiLCJiaW5uZWQiLCJoaXN0b2dyYW0iLCJmcmVxdWVuY2llcyIsIm1pblBvaW50IiwieSIsIm1heFBvaW50IiwicG9pbnRzIiwiYmluIiwieDAiLCJ4MSIsInF1YXJ0cyIsIm8iLCJ2YWx1ZXMiLCJjb25jYXQiLCJoeXBlbmF0ZSIsIkFycmF5IiwicHJvdG90eXBlIiwic2xpY2UiLCJjYWxsIiwiYXJndW1lbnRzIiwiam9pbiIsIm51bWJlciIsInByZWNpc2lvbiIsInNoaWZ0IiwicmV2ZXJzZVNoaWZ0IiwibnVtQXJyYXkiLCJzcGxpdCIsImdldENvbnRhaW5pbmdTVkciLCJlbGVtZW50IiwicGFyZW50IiwicGFyZW50RWxlbWVudCIsInRhZyIsInRhZ05hbWUiLCJ0b0xvd2VyQ2FzZSIsImludGVycG9sYXRlQ29sb3JzIiwiaW50ZXJwb2xhdGVSZ2JCYXNpcyIsInRydW5jYXRlVGV4dCIsInQiLCJ0ZXh0Iiwib3JpZW50IiwidGlja0xlbmd0aCIsInNwYWNlIiwib3ZlcmZsb3dRIiwicmVjdCIsIm5vZGUiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJ3aWR0aCIsImhlaWdodCIsInNhZmVTZWxlY3QiLCJzZWwiLCJjbHMiLCJjbHNTdHIiLCJzU2VsIiwic2VsZWN0IiwiZW1wdHkiLCJhcHBlbmQiLCJjbGFzc2VkIiwiYXR0ciIsInRpY2tSYW5nZSIsIm4iLCJhIiwicyIsInB1c2giLCJoYXNRIiwiYXJyYXkiLCJpdGVtIiwiaW5jbHVkZXMiLCJ0b3RhbCIsInJlZHVjZSIsImIiLCJ1bmlxdWUiLCJmbGF0dGVuIiwiZmxhdCIsImlzQXJyYXkiLCJ3aGljaEJpbiIsImJpbnMiLCJqIiwiY29uc29sZUdyb3VwIiwibmFtZSIsIndpbmRvdyIsImQzc20iLCJkZWJ1Z1EiLCJjb25zb2xlIiwiZ3JvdXAiLCJjb25zb2xlR3JvdXBFbmQiLCJncm91cEVuZCIsImxvZyIsImZ1bmMiLCJtc2ciLCJ0YWJsZSIsIndhcm4iLCJpbmZvIiwiZXJyb3IiLCJzZXR1cFN0YW5kYXJkQ2hhcnRDb250YWluZXJzIiwic2VsZWN0aW9uIiwibmFtZXNwYWNlIiwibWFyZ2lucyIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsInBlcmNlbnRhZ2VzIiwiYXhlcyIsInhBeGlzUGVyY2VudCIsInlBeGlzUGVyY2VudCIsInciLCJwZXJjZW50T2ZTcGFjZUZvcldpZHRoIiwiaCIsInBlcmNlbnRPZlNwYWNlRm9ySGVpZ2h0IiwiaW5uZXJXaWR0aCIsImlubmVySGVpZ2h0Iiwic3ZnU3BhY2UiLCJjaGFydFNwYWNlIiwiYXhlc1NwYWNlIiwiZHJhd2luZ1NwYWNlIiwieUF4aXNSZWN0IiwicGxvdFJlY3QiLCJ4QXhpc1JlY3QiLCJjb250YWluZXIiLCJzdHlsZSIsInBsb3QiLCJ4QXhpcyIsInlBeGlzIiwic3ZnIiwiY3BSZWN0IiwiZGVmcyIsImNwIiwicmFpc2UiLCJiZ1JlY3QiLCJmaWxsIiwic2V0dXBDb250YWluZXIiLCJiZyIsIm9iamVjdENvbnRhaW5lciIsImNhbGN1bGF0ZVdpZHRoT2ZPYmplY3QiLCJmcmVlU3BhY2UiLCJudW1iZXJPZk9iamVjdHMiLCJtaW5PYmplY3RXaWR0aCIsIm1heE9iamVjdFdpZHRoIiwic2l6ZU9mU3BhY2VyIiwibnVtYmVyT2ZTcGFjZXJzIiwic3BhY2VUYWtlbkJ5U3BhY2VycyIsInJlbWFpbmluZ1NwYWNlIiwib2JqZWN0V2lkdGgiLCJjYWxjdWxhdGVXaWR0aE9mU3BhY2VyIiwiYmFzZVNwYWNlclNpemUiLCJsaW1pdGVkTnVtYmVyT2ZPYmplY3RzIiwic3BhY2VMZWZ0Iiwic3BhY2Vyc0F0RWFjaExldmVsIiwic3BhY2Vyc05lZWRlZEF0RWFjaExldmVsIiwidG90YWxTcGFjZXJQZXJjZW50IiwibGV2ZWwiLCJsZXZlbERhdGEiLCJ3aGlza2VyUGF0aCIsImRpciIsInBlciIsImhoIiwicCIsInd3IiwiZ3JvdXBpbmdTcGFjZXIiLCJzY2FsZSIsInNjYWxlTGluZWFyIiwibW92ZWJ5Iiwib2JqZWN0Q2xhc3MiLCJvYmplY3RTaXplIiwic3BhY2VyU2l6ZSIsInRyYW5zaXRpb25EdXJhdGlvbiIsImVhc2VGdW5jIiwiZWFzZVNpbiIsImVudGVyRnVuY3Rpb24iLCJjdXIiLCJleGl0RnVuY3Rpb24iLCJjdXJyZW50IiwiY3VycmVudE5vZGUiLCJ0cmFuc2l0aW9uIiwiZHVyYXRpb24iLCJlYXNlIiwicmVtb3ZlIiwicmVjdXJzaXZlbHlQb3NpdGlvbiIsIl8iLCJjdXJyZW50U2VsZWN0aW9uIiwic2VsZWN0QWxsIiwiZW50ZXIiLCJleGl0IiwibWVyZ2UiLCJlYWNoIiwibGV2ZWxTcGFjZXIiLCJtb3ZlIiwiY3VycmVudEVsZW1lbnQiLCJ0b1JlbW92ZSIsInNpemUiLCJheGlzIiwic3BhY2VYIiwic3BhY2VZIiwiY2F0ZWdvcmljYWxRIiwiZ3VpZGVMaW5lc1EiLCJncm91cGluZyIsImRvbWFpblBhZGRpbmciLCJvYmplY3RTcGFjZXIiLCJtaW5PYmplY3RTaXplIiwibWF4T2JqZWN0U2l6ZSIsImJhY2tncm91bmRGaWxsIiwidGlja0xhYmVscyIsInRpY2tWYWx1ZXMiLCJudW1iZXJPZlRpY2tzIiwibGluZVN0cm9rZSIsImxpbmVTdHJva2VXaWR0aCIsInRpY2tTdHJva2UiLCJ0aWNrU3Ryb2tlV2lkdGgiLCJ0aWNrTGFiZWxGb250U2l6ZSIsInRpY2tMYWJlbE1pbkZvbnRTaXplIiwidGlja0xhYmVsTWF4Rm9udFNpemUiLCJ0aWNrTGFiZWxUZXh0QW5jaG9yIiwidGlja0xhYmVsUm90YXRpb24iLCJ0aWNrTGFiZWxGdW5jIiwiZ3VpZGVsaW5lU3BhY2UiLCJndWlkZUxpbmVTdHJva2UiLCJndWlkZUxpbmVTdHJva2VXaWR0aCIsImVhc2VFeHAiLCJyb3VuZFRvIiwidmVydGljYWxRIiwiYmdjcFJlY3QiLCJ0aWNrRGF0YSIsImV4dGVudCIsImZsYXRUaWNrRGF0YSIsImRvbWFpbiIsInJhbmdlIiwib2JqQ2xhc3MiLCJzcGFjZXJGdW5jdGlvbiIsInRpY2tFbnRlckFuaW1hdGlvbiIsIm10IiwiZGF0dW0iLCJkaXN0IiwidGlja0V4aXRBbmltYXRpb24iLCJtb3ZlWEJ5IiwibW92ZVlCeSIsInRpY2tzIiwidGhhdCIsInRpY2siLCJsYWJlbCIsInIiLCJnbGluZSIsImxpbmUiLCJjb2xvckZ1bmN0aW9uIiwiY29sb3JzIiwiaW50ZXJwb2xhdGlvbiIsImludGVycG9sYXRlUmdiIiwibW9kaWZ5T3BhY2l0eSIsInN0cm9rZU9wYWNpdHkiLCJmaWxsT3BhY2l0eSIsImNvbG9yQnkiLCJkYXRhRXh0ZW50IiwidmFsdWVFeHRyYWN0b3IiLCJ2IiwiaW50ZXJwb2xhdGUiLCJoZWxwZXJTY2FsZSIsIm1hdGNoIiwia2V5IiwidHlwZSIsImhvdmVyUSIsIm9wYWMiLCJ1cGRhdGVTY2FsZSIsInRvb2x0aXAiLCJrZXlzIiwiaGVhZGVyIiwib24iLCJtb3VzZW1vdmUiLCJjdXJyZW50RGF0YSIsIm1vdXNlIiwiZGl2IiwiY2FyZEJvZHkiLCJjYXJkVGl0bGUiLCJ0Qm9keSIsInRyIiwicm93S2V5Iiwicm93SW5kZXgiLCJiYXIiLCJzb3J0aW5nRnVuY3Rpb24iLCJrZXlBIiwia2V5QiIsImRlc2NlbmRpbmciLCJiYXJTdHJva2VXaWR0aCIsIkNGIiwiYmFyS2V5cyIsImJhclZhbHVlcyIsIlRUaXAiLCJvcmRlcmVkIiwic29ydCIsImRlZmF1bHRFeGl0IiwicGFyZW50SW5kZXhBcnJheSIsIk51bWJlciIsImZpbGxDb2xvciIsInN0cm9rZUNvbG9yIiwiYnViYmxlSGVhdG1hcCIsInhLZXkiLCJ5S2V5IiwicktleSIsInZLZXkiLCJ4RXh0cmFjdG9yIiwieUV4dHJhY3RvciIsInJFeHRyYWN0b3IiLCJ2RXh0cmFjdG9yIiwiYnViYmxlU3Ryb2tlV2lkdGgiLCJjZWxsS2V5cyIsInhWYWx1ZXMiLCJ5VmFsdWVzIiwiclZhbHVlcyIsInZWYWx1ZXMiLCJ4S2V5U29ydGluZ0Z1bmN0aW9uIiwieUtleVNvcnRpbmdGdW5jdGlvbiIsInJLZXlTb3J0aW5nRnVuY3Rpb24iLCJ4U2l6ZSIsInhTcGFjZXJTaXplIiwieVNpemUiLCJ5U3BhY2VyU2l6ZSIsImJobSIsInhEaW0iLCJ5RGltIiwieVNwYWNlciIsInhTcGFjZXIiLCJjZWxscyIsInJhZGl1cyIsImJveHdoaXNrZXIiLCJxdWFydGlsZXNLZXkiLCJxdWFydGlsZXNLZXlzIiwid2hpc2tlcldpZHRoUGVyY2VudCIsImJveFN0cm9rZVdpZHRoIiwid2hpc2tlclN0cm9rZVdpZHRoIiwiYm94S2V5cyIsImJveFZhbHVlcyIsIndoaXNrIiwidVdoaXNrIiwibFdoaXNrIiwicXVhcnQiLCJ1UXVhcnQiLCJsUXVhcnQiLCJtUXVhcnQiLCJkaWYiLCJkZCIsImlpIiwiZGF0YXRvZ2dsZSIsInVwZGF0ZUZ1bmN0aW9uIiwiY3VycmVudEtleSIsInRvZ2dsZSIsImRhdGFvcHRzIiwiZG9FbnRlciIsInByb3BlcnR5Iiwic2NhdHRlciIsInNjYWxlWCIsImRvbWFpblBhZGRpbmdYIiwidmFsdWVFeHRyYWN0b3JYIiwic2NhbGVZIiwiZG9tYWluUGFkZGluZ1kiLCJ2YWx1ZUV4dHJhY3RvclkiLCJzY2FsZVIiLCJkb21haW5QYWRkaW5nUiIsInZhbHVlRXh0cmFjdG9yUiIsIm1pblJhZGl1cyIsIm1heFJhZGl1cyIsInBvaW50U3Ryb2tlV2lkdGgiLCJwb2ludEtleXMiLCJ2YWx1ZXNYIiwidmFsdWVzWSIsInZhbHVlc1IiLCJleHRlbnRYIiwiZXh0ZW50WSIsImV4dGVudFIiLCJwRW50ZXIiLCJwRXhpdCIsImFkZEV2ZW50TGlzdGVuZXIiLCJwbG90Wm9vbSIsImNoYXJ0IiwiZXZlbnRUeXBlIiwid2hlZWxTcGVlZCIsInhMb2NrIiwieUxvY2siLCJjaGFydFNlbCIsInhBeGlzU2VsIiwieUF4aXNTZWwiLCJ6b29tIiwic2V0TG9ja3MiLCJjaGFydE9ialNlbCIsImNoYXJ0T2JqVHJhbnMiLCJjb3MiLCJnZXRCQm94IiwiZXZlbnQiLCJjaGFydEJveCIsInhBeGlzQm94IiwieUF4aXNCb3giLCJjaGFydFdpZHRoIiwiY2hhcnRIZWlnaHQiLCJ4QXhpc1dpZHRoIiwieEF4aXNIZWlnaHQiLCJ5QXhpc1dpZHRoIiwieUF4aXNIZWlnaHQiLCJwcmV2ZW50RGVmYXVsdCIsImRlbHRhWSIsInNoaWZ0USIsInNoaWZ0S2V5IiwiYXBwbHlYIiwiYXBwbHlZIiwieEF4aXNPYmpTZWwiLCJ5QXhpc09ialNlbCIsInhBeGlzT2JqVHJhbnMiLCJ5QXhpc09ialRyYW5zIiwicmVzZXQiLCJ2aW9saW4iLCJwb2ludHNRIiwib2JqZWN0U3Ryb2tlV2lkdGgiLCJwb2ludENvbG9yRnVuYyIsImJhc2UiLCJtaW5NYXhIZXhTY2FsZSIsInNjYWxlZENvbG9yIiwibW9kIiwicG9pbnRSYWRpdXMiLCJxdWFydGlsZUtleXMiLCJ2aW9saW5WYWx1ZXMiLCJxdWFydGlsZUtleSIsImZyZXF1ZW5jeU1heCIsInZTY2FsZSIsImxBcmVhIiwiY3VydmUiLCJjdXJ2ZUJhc2lzIiwickFyZWEiLCJhcmVhIiwibGEiLCJyYSIsImxxMyIsImxxMSIsInB0c0NvbnRhaW5lciIsInB0cyIsInB0c0V4aXQiLCJwdHNFbnRlciIsInJhbmRvbSIsImNyZWF0ZUV2ZW50IiwiaW5pdEV2ZW50IiwiZGlzcGF0Y2hFdmVudCIsImNWIiwidG9vbHRpcEtleSIsInJlcXVpcmUkJDAiLCJtcyIsIm15TG9nIiwiZGVidWciLCJlbmFibGUiLCJ3cml0ZSIsImxvY2F0aW9uIiwiaG9zdCJdLCJtYXBwaW5ncyI6Ijs7O0VBQUE7RUFDQTs7Ozs7OztFQU9BOzs7Ozs7O0FBT0EsRUFBTyxTQUFTQSxjQUFULENBQXdCQyxLQUF4QixFQUErQkMsS0FBL0IsRUFBc0NDLElBQXRDLEVBQTRDO0VBQUUsU0FBT0EsS0FBS0MsT0FBTCxDQUFhSCxLQUFiLE1BQXdCQyxLQUEvQjtFQUF1Qzs7RUFFNUY7Ozs7O0FBS0EsRUFBTyxTQUFTRyxjQUFULENBQXdCQyxTQUF4QixFQUFtQztFQUN4QztFQUNBO0VBQ0E7RUFDQSxNQUFJQyxJQUFJQyxTQUFTQyxlQUFULENBQXlC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 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZDNzbS5taW4uanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JpcHRzL21vZHVsZXMvaGVscGVycy5qcyIsIi4uLy4uL3NyYy9zY3JpcHRzL21vZHVsZXMvYXJyYXktZnVuY3Rpb25zLmpzIiwiLi4vLi4vc3JjL3NjcmlwdHMvbW9kdWxlcy91dGlscy5qcyIsIi4uLy4uL3NyYy9zY3JpcHRzL21vZHVsZXMvZ3JvdXBpbmctc3BhY2VyLmpzIiwiLi4vLi4vc3JjL3NjcmlwdHMvbW9kdWxlcy9heGlzLmpzIiwiLi4vLi4vc3JjL3NjcmlwdHMvbW9kdWxlcy9jb2xvci1mdW5jdGlvbi5qcyIsIi4uLy4uL3NyYy9zY3JpcHRzL21vZHVsZXMvdG9vbHRpcC5qcyIsIi4uLy4uL3NyYy9zY3JpcHRzL21vZHVsZXMvYmFyLmpzIiwiLi4vLi4vc3JjL3NjcmlwdHMvbW9kdWxlcy9idWJibGUtaGVhdG1hcC5qcyIsIi4uLy4uL3NyYy9zY3JpcHRzL21vZHVsZXMvYm94LXdoaXNrZXIuanMiLCIuLi8uLi9zcmMvc2NyaXB0cy9tb2R1bGVzL2RhdGEtdG9nZ2xlLmpzIiwiLi4vLi4vc3JjL3NjcmlwdHMvbW9kdWxlcy9zY2F0dGVyLmpzIiwiLi4vLi4vc3JjL3NjcmlwdHMvbW9kdWxlcy9wbG90LXpvb20uanMiLCIuLi8uLi9zcmMvc2NyaXB0cy9tb2R1bGVzL3Zpb2xpbi5qcyIsIi4uLy4uL3NyYy9zY3JpcHRzL21vZHVsZXMvcG9pbnRzLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL21zL2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9kZWJ1Zy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvYnJvd3Nlci5qcyIsIi4uLy4uL3NyYy9zY3JpcHRzL21haW4uanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gaW1wb3J0IHtoYXNRfSBmcm9tICcuL2FycmF5LWZ1bmN0aW9ucyc7XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEVMUEVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqXG4qIEhlbHBlciBmdW5jdGlvbiBmb3IgQXJyYXkuZmlsdGVyIHRvIGdldCB1bmlxdWUgZWxlbWVudHMgb2YgdGhlIGFycmF5XG4qIEBwYXJhbSB7Kn0gdmFsdWUgY3VycmVudCB2YWx1ZSBhcyBtYXBwaW5nIG92ZXIgYXJyYXkgKHNlbGYpXG4qIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBjdXJyZW50IGluZGV4IGluIHRoZSBhcnJheVxuKiBAcGFyYW0ge0FycmF5fSBzZWxmIHBhc3NlZCBhcnJheSBmcm9tIEFycmF5LmZpbHRlciBtZXRob2RcbiogQHJldHVybnMge2Jvb2xlYW59IHdoZXRoZXIgb3Igbm90IHZhbHVlIGlzIHRoZSBmaXJzdCBvZiBpdHMga2luZCAoaS5lLiBpbmRleE9mKHZhbHVlKSA9PSBpbmRleClcbiovXG5leHBvcnQgZnVuY3Rpb24gdW5pcXVlRWxlbWVudHModmFsdWUsIGluZGV4LCBzZWxmKSB7IHJldHVybiBzZWxmLmluZGV4T2YodmFsdWUpID09PSBpbmRleDsgfVxuXG4vKipcbiogRXh0cmFjdHMgeCBhbmQgeSBvZiB0cmFuc2xhdGUgZnJvbSB0cmFuc2Zvcm0gcHJvcGVydHlcbiogQHBhcmFtIHtzdHJpbmd9IHRyYW5zZm9ybSB0cmFuc2Zvcm0gcHJvcGVydHkgb2Ygc3ZnIGVsZW1lbnRcbiogQHJldHVybnMge251bWJlcltdfSB4LCB5IG9mIHRyYW5zbGF0ZSh4LCB5KVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUcmFuc2xhdGlvbih0cmFuc2Zvcm0pIHtcbiAgLy8gQ3JlYXRlIGEgZHVtbXkgZyBmb3IgY2FsY3VsYXRpb24gcHVycG9zZXMgb25seS4gVGhpcyB3aWxsIG5ldmVyXG4gIC8vIGJlIGFwcGVuZGVkIHRvIHRoZSBET00gYW5kIHdpbGwgYmUgZGlzY2FyZGVkIG9uY2UgdGhpcyBmdW5jdGlvblxuICAvLyByZXR1cm5zLlxuICB2YXIgZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnZycpO1xuICAvLyBTZXQgdGhlIHRyYW5zZm9ybSBhdHRyaWJ1dGUgdG8gdGhlIHByb3ZpZGVkIHN0cmluZyB2YWx1ZS5cbiAgdHJhbnNmb3JtID0gdHJhbnNmb3JtID09IHVuZGVmaW5lZCA/ICd0cmFuc2xhdGUoMCwwKScgOiB0cmFuc2Zvcm07XG4gIGcuc2V0QXR0cmlidXRlTlMobnVsbCwgJ3RyYW5zZm9ybScsIHRyYW5zZm9ybSk7XG4gIC8vIGNvbnNvbGlkYXRlIHRoZSBTVkdUcmFuc2Zvcm1MaXN0IGNvbnRhaW5pbmcgYWxsIHRyYW5zZm9ybWF0aW9uc1xuICAvLyB0byBhIHNpbmdsZSBTVkdUcmFuc2Zvcm0gb2YgdHlwZSBTVkdfVFJBTlNGT1JNX01BVFJJWCBhbmQgZ2V0XG4gIC8vIGl0cyBTVkdNYXRyaXguXG4gIHZhciBtYXRyaXggPSBnLnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCkubWF0cml4O1xuICAvLyBBcyBwZXIgZGVmaW5pdGlvbiB2YWx1ZXMgZSBhbmQgZiBhcmUgdGhlIG9uZXMgZm9yIHRoZSB0cmFuc2xhdGlvbi5cbiAgcmV0dXJuIFttYXRyaXguZSwgbWF0cml4LmZdO1xufVxuXG5cbi8qKlxuKiBNb2RpZmllcyBsdW1pbmFuY2Ugb2YgaGV4aWRlY2ltYWwgbnVtYmVyXG4qIEBwYXJhbSB7c3RyaW5nfSBoZXggc2hvdWxkIGJlIGhleGlkZWNpbWFsIHZhbHVlIHdpdGggb3Igd2l0aG91dCB0aGUgcHJvY2VlZGluZyBvY3RvdHJvcGVcbiogQHBhcmFtIHtudW1iZXJ9IGx1bSB2YWx1ZSB0byBpbmNyZWFzZSBvciBkZWNyZWFzZSBsdW1pbm9zaXR5IGJ5XG4qIEByZXR1cm5zIHtzdHJpbmd9IHVwZGF0ZWQgaGV4aWRlY2ltYWwgdmFsdWUgd2l0aG91dCB0aGUgcHJvY2VlZGluZyBvY3RvdHJvcGVcbiovXG5leHBvcnQgZnVuY3Rpb24gbW9kaWZ5SGV4aWRlY2ltYWxDb2xvckx1bWluYW5jZShoZXgsIGx1bSkge1xuICAvLyB2YWxpZGF0ZSBoZXggc3RyaW5nXG4gIHZhciBoZXggPSBTdHJpbmcoaGV4KS5yZXBsYWNlKC9bXjAtOWEtZl0vZ2ksICcnKTtcblxuICBpZiAoaGV4Lmxlbmd0aCA8IDYpIHtcbiAgICBoZXggPSBoZXhbMF0raGV4WzBdK2hleFsxXStoZXhbMV0raGV4WzJdK2hleFsyXTtcblx0fVxuXHRsdW0gPSBsdW0gfHwgMDtcblxuXHQvLyBjb252ZXJ0IHRvIGRlY2ltYWwgYW5kIGNoYW5nZSBsdW1pbm9zaXR5XG5cdHZhciByZ2IgPSAnIycsIGMsIGk7XG5cdGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHtcblx0XHRjID0gcGFyc2VJbnQoaGV4LnN1YnN0cihpKjIsMiksIDE2KTtcblx0XHRjID0gTWF0aC5yb3VuZChNYXRoLm1pbihNYXRoLm1heCgwLCBjICsgKGMgKiBsdW0pKSwgMjU1KSkudG9TdHJpbmcoMTYpO1xuXHRcdHJnYiArPSAoJzAwJytjKS5zdWJzdHIoYy5sZW5ndGgpO1xuXHR9XG5cblx0cmV0dXJuIHJnYjtcbn1cblxuXG4vKipcbiogQGRlcHJlY2F0ZWQgQHNlZXtAbGluayB0aWNrUmFuZ2V9XG4qIEBwYXJhbSB7bnVtYmVyfSBtaW5cbiogQHBhcmFtIHtudW1iZXJ9IG1heFxuKiBAcGFyYW0ge251bWJlcn0gcGFydHNcbiogQHJldHVybnMge251bWJlcltdfSBhcnJheSBvZiBsZW5ndGggcGFydHMgZXZlbmx5IHBhcnRpdGlvbmVkIGJldHdlZW4gbWluIGFuZCBtYXhcbiovXG5leHBvcnQgZnVuY3Rpb24gcGFydGl0aW9uUmFuZ2VJbnRvKG1pbiwgbWF4LCBwYXJ0cykge1xuICB2YXIgZGlmZiA9IG1heCAtIG1pblxuICByZXR1cm4gQXJyYXkocGFydHMpLm1hcChmdW5jdGlvbiAoZSwgaSkgeyByZXR1cm4gbWluICsgZGlmZiAvIHBhcnRzICogaSB9KVxufVxuXG5cbi8qKlxuKiBDYWxjdWxhdGVkIHRoZSBxdWFydGlsZXMgb2YgdGhlIHBhc3NlZCBkYXRhIGFuZCBzdG9yZXMgdGhlbSB3aXRoIHFLZXlzXG4qIEBwYXJhbSB7bnVtYmVyW119IGRhdGEgbGlzdCBvZiBudW1lcmljYWwgdmFsdWVzXG4qIEBwYXJhbSB7c3RyaW5nW119IFtxS2V5cz1bJ3EwJywgJ3ExJywgJ3EyJywgJ3EzJywgJ3E0J11dIGhvdyByZXR1cm5lZCBvYmplY3Qgd2l0aCBxdWFydGlsZXMgc2hvdWxkIGJlIHN0b3JlZFxuKiBAcmV0dXJucyB7T2JqZWN0fSB3aXRoIGtleXMgcUtleXMgZ2l2aW5nIG9ubHkgdGhlIG51bWVyaWNhbCB2YWx1ZXMgZm9yIHRoZSBxdWFydGlsZXNcbiovXG5leHBvcnQgZnVuY3Rpb24gcXVhcnRpbGVzKGRhdGEsIHFLZXlzKSB7XG4gIHZhclxuICBxMiA9IGQzLm1lZGlhbihkYXRhKSxcbiAgbG93ZXIgPSBkYXRhLmZpbHRlcih4ID0+IHggPCBxMiksXG4gIHVwcGVyID0gZGF0YS5maWx0ZXIoeCA9PiB4ID4gcTIpLFxuXG4gIHExID0gZDMubWVkaWFuKGxvd2VyKSxcbiAgcTEgPSBxMSA9PSB1bmRlZmluZWQgPyBxMiA6IHExLFxuXG4gIHEwID0gZDMubWluKGxvd2VyKSxcbiAgcTAgPSBxMCA9PSB1bmRlZmluZWQgPyBxMSA6IHEwLFxuXG4gIHEzID0gZDMubWVkaWFuKHVwcGVyKSxcbiAgcTMgPSBxMyA9PSB1bmRlZmluZWQgPyBxMiA6IHEzLFxuXG4gIHE0ID0gZDMubWF4KHVwcGVyKSxcbiAgcTQgPSBxNCA9PSB1bmRlZmluZWQgPyBxMyA6IHE0LFxuXG4gIGswID0gJ3EwJywgazEgPSAncTEnLCBrMiA9ICdxMicsIGszID0gJ3EzJywgazQgPSAncTQnLFxuICBvYmogPSB7fVxuICBpZiAocUtleXMhPXVuZGVmaW5lZCAmJiBxS2V5cy5sZW5ndGggPT0gNSkgeyBrMCA9IHFLZXlzWzBdOyBrMSA9IHFLZXlzWzFdOyBrMiA9IHFLZXlzWzJdOyBrMyA9IHFLZXlzWzNdOyBrNCA9IHFLZXlzWzRdOyB9XG4gIG9ialtrMF0gPSBxMDsgb2JqW2sxXSA9IHExOyBvYmpbazJdID0gcTI7IG9ialtrM10gPSBxMzsgb2JqW2s0XSA9IHE0O1xuXG4gIHJldHVybiBvYmpcbn1cblxuXG4vKipcbiogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCBhbGwgdmFsdWVzIG5lZWRlZCBpbiBtYWtpbmcgdmlvbGluIHBsb3RzXG4qIEBwYXJhbSB7c3RyaW5nW119IHZpb2xpbktleXNcbiogQHBhcmFtIHtudW1iZXJbXX0gZGF0YVxuKiBAcGFyYW0ge0Z1bmN0aW9ufSB2YWx1ZUV4dHJhY3RvckZ1bmN0aW9uIGhvdyB0byBnZXQgdmFsdWVzIGZyb20gZGF0YVt2aW9saW5LZXlzW2ldXVxuKiBAcGFyYW0ge2Jvb2xlYW59IGhvcml6b250YWxRIHdoZXRoZXIgb3Igbm90IHZpb2xpbnMgd2lsbCBiZSByZW5kZXJlZCBob3Jpem9udGFsbHkgb3IgdmVydGljYWxseVxuKiBAcGFyYW0ge3N0cmluZ30gcUtleSBob3cgdGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBxdWFydGlsZXMgc2hvdWxkIGJlIGxhYmVsZWQgYXNcbiogQHBhcmFtIHtzdHJpbmdbXX0gcUtleXMgaG93IGVhY2ggcXVhcnRpbGUgc2hvdWxkIGJlIGxhYmVsZWQgYXNcbiogQHJldHVybnMge09iamVjdH0gcmVxdWlyZWQgZm9yIEBzZWV7QGxpbmsgdmlvbGlufSBjb250YWluaW5nIGtleXMgdmFsdWVzLCBiaW5ubmVkLCBmcmVxdWVuY2llcywgcG9pbnRzLCBhbmQgcXVhcnRpbGVzXG4qIEBzZWV7QGxpbmsgcXVhcnRpbGVzfVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0VmlvbGluVmFsdWVzKFxuICB2aW9saW5LZXlzLFxuICBkYXRhLFxuICB2YWx1ZUV4dHJhY3RvckZ1bmN0aW9uLFxuICBob3Jpem9udGFsUSxcbiAgcUtleSxcbiAgcUtleXNcbil7XG4gIHZhciBvYmogPSB7fVxuICB2aW9saW5LZXlzLm1hcChmdW5jdGlvbihrLCBpKXtcbiAgICAgdmFyIGQgPSB2YWx1ZUV4dHJhY3RvckZ1bmN0aW9uKGssIGksIGRhdGEpLFxuICAgICBiaW5uZWQgPSBkMy5oaXN0b2dyYW0oKShkKSxcbiAgICAgZnJlcXVlbmNpZXMgPSBiaW5uZWQubWFwKHg9PngubGVuZ3RoKSxcbiAgICAgbWluUG9pbnQgPSBob3Jpem9udGFsUSA/IHt5OiBkMy5taW4oZCksIHg6IDB9IDoge3g6IGQzLm1pbihkKSwgeTogMH0sXG4gICAgIG1heFBvaW50ID0gaG9yaXpvbnRhbFEgPyB7eTogZDMubWF4KGQpLCB4OiAwfSA6IHt4OiBkMy5tYXgoZCksIHk6IDB9LFxuICAgICBwb2ludHMgPSBiaW5uZWQubWFwKGZ1bmN0aW9uKGJpbiwgaSkge1xuICAgICAgIHJldHVybiBob3Jpem9udGFsUVxuICAgICAgID8ge3k6IChiaW4ubGVuZ3RoKSA/IGQzLm1lZGlhbihiaW4pOiBkMy5tZWRpYW4oW2Jpbi54MCwgYmluLngxXSksIHg6IGZyZXF1ZW5jaWVzW2ldfVxuICAgICAgIDoge3g6IChiaW4ubGVuZ3RoKSA/IGQzLm1lZGlhbihiaW4pOiBkMy5tZWRpYW4oW2Jpbi54MCwgYmluLngxXSksIHk6IGZyZXF1ZW5jaWVzW2ldfVxuICAgICB9KSxcbiAgICAgcXVhcnRzID0gcXVhcnRpbGVzKGQsIHFLZXlzKSxcbiAgICAgbyA9IHtcbiAgICAgICB2YWx1ZXM6IGQsXG4gICAgICAgYmlubmVkOiBiaW5uZWQsXG4gICAgICAgZnJlcXVlbmNpZXM6IGZyZXF1ZW5jaWVzLFxuICAgICAgIHBvaW50czogW21pblBvaW50XS5jb25jYXQocG9pbnRzKS5jb25jYXQoW21heFBvaW50XSlcbiAgICAgfVxuICAgICBvW3FLZXldID0gcXVhcnRzO1xuICAgICBvYmpba10gPSBvO1xuICAgfSk7XG4gICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiogSHlwZW5hdGVzIGFsbCBzdHJpbmdzIHRvZ2V0aGVyXG4qIEBwYXJhbSB7c3RyaW5nW119IGFyZ3VtZW50c1xuKiBAcmV0dXJucyB7c3RyaW5nfSBcImFyZzEtYXJnMi0uLi4tYXJnblwiXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGh5cGVuYXRlKCl7IHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLmpvaW4oJy0nKSB9XG5cblxuLyoqXG4qIFJvdW5kcyBkZWNpbWFscyBvZiBudW1iZXIgdG8gcHJlY2lzaW9uXG4qIEBwYXJhbSB7bnVtYmVyfSBudW1iZXJcbiogQHBhcmFtIHtudW1iZXJ9IHByZWNpc2lvblxuKiBAcmV0dXJucyB7bnVtYmVyfSByb3VuZGVkIHRvIHByZWNpc2lvblxuKi9cbmV4cG9ydCBmdW5jdGlvbiByb3VuZChudW1iZXIsIHByZWNpc2lvbikge1xuICB2YXIgc2hpZnQgPSBmdW5jdGlvbiAobnVtYmVyLCBwcmVjaXNpb24sIHJldmVyc2VTaGlmdCkge1xuICAgIGlmIChyZXZlcnNlU2hpZnQpIHtcbiAgICAgIHByZWNpc2lvbiA9IC1wcmVjaXNpb247XG4gICAgfVxuICAgIHZhciBudW1BcnJheSA9ICgnJyArIG51bWJlcikuc3BsaXQoJ2UnKTtcbiAgICByZXR1cm4gKyhudW1BcnJheVswXSArICdlJyArIChudW1BcnJheVsxXSA/ICgrbnVtQXJyYXlbMV0gKyBwcmVjaXNpb24pIDogcHJlY2lzaW9uKSk7XG4gIH07XG4gIHJldHVybiBzaGlmdChNYXRoLnJvdW5kKHNoaWZ0KG51bWJlciwgcHJlY2lzaW9uLCBmYWxzZSkpLCBwcmVjaXNpb24sIHRydWUpO1xufVxuXG4vKipcbiogcmVjdXJzaXZlbHkgYXNjZW5kcyBlbGVtZW50LnBhcmVudEVsZW1lbnQgdG8gZmluZCBhIHN2ZyB0YWdcbiogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4qIEByZXR1cm5zIHtFbGVtZW50IHwgdW5kZWZpbmVkfVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb250YWluaW5nU1ZHKGVsZW1lbnQpIHtcbiAgdmFyIHBhcmVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudFxuICB2YXIgdGFnID0gcGFyZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKVxuICBpZiAodGFnID09PSAnc3ZnJykgeyByZXR1cm4gcGFyZW50OyB9XG4gIGlmICh0YWcgPT09ICdodG1sJykgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIHJldHVybiBnZXRDb250YWluaW5nU1ZHKHBhcmVudCk7XG59XG5cbi8qKlxuKiBNYXBzIGFyZ3VtZW50cyBpbiB0byBkMy5pbnRlcnBvbGF0ZVJnYkJhc2lzXG4qIEBwYXJhbSBhcmd1bWVudHNcbiogQHJldHVybnMge0Z1bmN0aW9ufVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcnBvbGF0ZUNvbG9ycygpe3JldHVybiBkMy5pbnRlcnBvbGF0ZVJnYkJhc2lzKGFyZ3VtZW50cyl9XG5cblxuLyoqXG4qIFRyeXMgdG8gcmVkdWNlIHRleHQgdG8gZml0IGluIHNwZWNpZmllZCBhcmVhLCBtYWRlIGZvciB0aWNrIGxhYmVscyBhcyBjYWxsZWQgYnlcbiogQHNlZXtAbGluayBheGlzfVxuKiBAcGFyYW0ge2QzLnNlbGVjdGlvbn0gdCBjb250YWluZXIgZm9yIHNwZWNpZmljIGF4aXMgdGlja1xuKiBAcGFyYW0ge3N0cmluZ30gdGV4dCB0byBiZSB0aGUgbGFiZWwgb2YgdGhlIHBhc3NlZCBheGlzIHRpY2tcbiogQHBhcmFtIHtib29sZWFufSBvcmllbnQgb2YgdGhlIGF4aXMsIHRydWUgaXMgaG9yaXpvbnRhbCwgZmFsc2UgaXMgdmVydGljYWxcbiogQHBhcmFtIHtudW1iZXJ9IHRpY2tMZW5ndGggaXMgdGhlIGxlbmd0aCBvZiB0aGUgdGV4dFxuKiBAcGFyYW0ge251bWJlcn0gc3BhY2UgaXMgdGhlIGFtb3VudCBvZiBhdmFpbGJsZSBzcGFjZSBmb3IgdGhlIHRleHQgYW5kIHRoZSB0aWNrIHRvIGZpdCBpblxuKiBAcGFyYW0ge2Jvb2xlYW59IG92ZXJmbG93USB3aGV0aGVyIG9yIG5vdCBhbGxvd2VkIHRvIGdvIG92ZXIgdGhlIGFsbG90ZWQgc3BhY2VcbiogQHJldHVybnMge25vbmV9XG4qL1xuZXhwb3J0IGZ1bmN0aW9uIHRydW5jYXRlVGV4dCh0LCB0ZXh0LCBvcmllbnQsIHRpY2tMZW5ndGgsIHNwYWNlLCBvdmVyZmxvd1EpIHtcbiAgdmFyIHJlY3QgPSB0Lm5vZGUoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICB0LnRleHQodGV4dClcbiAgd2hpbGUgKE1hdGgubWF4KHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KSA+IHNwYWNlIC0gdGlja0xlbmd0aCkge1xuICAgIHRleHQgPSBTdHJpbmcodGV4dClcbiAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCB0ZXh0Lmxlbmd0aCAtIDEpXG4gICAgdC50ZXh0KHRleHQgKyAnLi4uJylcbiAgICByZWN0ID0gdC5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICBpZiAodGV4dC5sZW5ndGggPT0gMCkgYnJlYWtcbiAgfVxufVxuXG5cbi8qKlxuKiBUcnlzIHRvIHVzZSBkMy5zZWxlY3Rpb24gdG8gZ2V0IGVsZW1lbnQsIGlmIGl0IGRvZXNudCBleGlzdCwgbWFrZXMgb25lXG4qIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBzZWwgc2VsZWN0aW9uIGluIHdoaWNoIHRvIHRyeSBhbmQgZmluZCBvYmplY3RcbiogQHBhcmFtIHtzdHJpbmd9IHRhZyB0YWcgb2Ygd2hpY2ggdG8gdHJ5IGFuZCBzZWxlY3RcbiogQHBhcmFtIHtzdHJpbmd9IFtjbHM9JyddIGNsYXNzIG9mIHRhZyB0byB0cnkgYW5kIGdyYWJcbiogQHJldHVybnMge2QzLnNlbGVjdGlvbn0gb2YgZWl0aGVyIGFwcGVuZCBvciBzZWxlY3RlZCB0YWcuY2xzIHdpdGhpbiBzZWxcbiovXG5leHBvcnQgZnVuY3Rpb24gc2FmZVNlbGVjdChzZWwsIHRhZywgY2xzKSB7XG4gIHZhciBjbHNTdHIgPSBjbHMgPT0gdW5kZWZpbmVkID8gJycgOiAnLicrY2xzO1xuICB2YXIgc1NlbCA9IHNlbC5zZWxlY3QodGFnK2Nsc1N0cikuZW1wdHkoKVxuICA/IHNlbC5hcHBlbmQodGFnKVxuICA6IHNlbC5zZWxlY3QodGFnK2Nsc1N0cilcbiAgcmV0dXJuIHNTZWxcbiAgLmNsYXNzZWQoY2xzU3RyLnJlcGxhY2UoJy4nLCAnJyksIHRydWUpXG4gIC5hdHRyKCd0cmFuc2Zvcm0nLCBzU2VsLmF0dHIoJ3RyYW5zZm9ybScpID09IHVuZGVmaW5lZCA/ICd0cmFuc2xhdGUoMCwwKScgOiBzU2VsLmF0dHIoJ3RyYW5zZm9ybScpKVxufVxuXG4vKipcbiogZXZlbmx5IHBhcnRpdGlvbnMgdGhlIHJhbmdlIFttaW4sIG1heF0gaW50byBuIHBhcnRzXG4qIEBwYXJhbSB7bnVtYmVyfSBtaW5cbiogQHBhcmFtIHtudW1iZXJ9IG1heFxuKiBAcGFyYW0ge251bWJlcn0gblxuKiBAcmV0dXJucyB7bnVtYmVyW119IGFycmF5IG9mIGxlbmd0aCBuIGV2ZW5seSBwYXJ0aXRpb25lZCBiZXR3ZWVuIG1pbiBhbmQgbWF4XG4qL1xuZXhwb3J0IGZ1bmN0aW9uIHRpY2tSYW5nZShtaW4sIG1heCwgbikge1xuICB2YXIgYSA9IFttaW5dXG4gIHZhciBkID0gbWF4LW1pblxuICB2YXIgcyA9IGQgLyAobi0xKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IG4tMjsgaSsrKSB7IGEucHVzaChtaW4gKyBzICogKGkrMSkpIH1cbiAgYS5wdXNoKG1heClcbiAgcmV0dXJuIGFcbn1cbiIsImltcG9ydCB7dW5pcXVlRWxlbWVudHN9IGZyb20gJy4vaGVscGVycyc7XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1RPVFlQRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqXG4qIFRoaXMgZnVuY3Rpb24gdGVzdHMgdG8gc2VlIGlmIGFsbCBlbGVtZW50cyBvZiB0aGUgcGFzc2VkIGFycmF5IGFyZSB0cnVlLlxuKiBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiB2YWx1ZXNcbiogQHBhcmFtIHtGdW5jdGlvbn0gW2Z1bmMgZnVuY3Rpb24odmFsdWUpe3JldHVybiB2YWx1ZSA9PSB0cnVlO31dIGlzIGFwcGxpZWQgdG8gZWFjaCB2YWx1ZSBvZiB0aGUgYXJyYXkgYW5kIHNob3VsZCByZXR1cm4gYSBib29sZWFuLlxuKiBAcmV0dXJucyB7Ym9vbGVhbn0gaWYgYWxsIHZhbHVlcyBhcmUgdHJ1ZSBieSBmdW5jdGlvblxuKi9cbmV4cG9ydCBmdW5jdGlvbiBhbGwoIGFycmF5LCBmdW5jICkge1xuICBpZiAoZnVuYyA9PSB1bmRlZmluZWQpIHsgcmV0dXJuIGFycmF5LmV2ZXJ5KCBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWUgPT09IHRydWU7IH0pOyB9XG4gIHJldHVybiBhcnJheS5ldmVyeSggZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIGZ1bmModmFsdWUpOyB9ICk7XG59XG5cbi8qKlxuKiBDb3VudHMgdGhlIG51bWJlciBvZiBvY2N1cmFuY2VzIG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgZ2l2ZW4gYXJyYXkuXG4qIEBwYXJhbSB7QXJyYXl9IGFycmF5IG9mIGVsZW1lbnRzXG4qIEByZXR1cm5zIHtPYmplY3R9IG9mIGtleTogdmFsdWUgcGFpcnMgd2hlcmUga2V5IGlzIGFuIGVsZW1lbnQgaW4gdGhlIGFycmF5IGFuZCB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIGl0IG9jY3Vycy5cbiovXG5leHBvcnQgZnVuY3Rpb24gdGFsbHkoIGFycmF5ICkge1xuICB2YXIgdGFsbGllcyA9IHt9O1xuICBhcnJheS5tYXAoIGZ1bmN0aW9uICggZWxlbWVudCApIHtcbiAgICBpZiAoIGhhc1EoT2JqZWN0LmtleXModGFsbGllcyksIGVsZW1lbnQpICkgeyB0YWxsaWVzW2VsZW1lbnRdID0gMTsgfVxuICAgIGVsc2UgeyB0YWxsaWVzW2VsZW1lbnRdICs9IDE7IH1cbiAgfSk7XG4gIHJldHVybiB0YWxsaWVzO1xufVxuLyoqXG4qIFNob3J0LWhhbmQgZm9yIGFycmF5LmluY2x1ZGVzKGl0ZW0pO1xuKiBAcGFyYW0ge0FycmF5fSBhcnJheVxuKiBAcGFyYW0geyp9IGl0ZW0gdG8gdGVzdCBpZiBjb250YWluZWQgaW4gIHthcnJheX1cbiogQHJldHVybnMge2Jvb2xlYW59XG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1EoIGFycmF5LCBpdGVtICkgeyByZXR1cm4gYXJyYXkuaW5jbHVkZXMoaXRlbSk7IH1cblxuLyoqXG4qIFJldHVybnMgZmlyc3QgaXRlbSBpbiBhcnJheVxuKiBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiBpdGVtc1xuKiBAcmV0dXJucyB7Kn0gYXJyYXlbMF1cbiovXG5leHBvcnQgZnVuY3Rpb24gZmlyc3QoIGFycmF5ICkgeyByZXR1cm4gYXJyYXlbMF07IH1cblxuLyoqXG4qIFJldHVybnMgbGFzdCBpdGVtIGluIGFycmF5XG4qIEBwYXJhbSB7QXJyYXl9IGFycmF5IG9mIGl0ZW1zXG4qIEByZXR1cm5zIHsqfSBhcnJheVthcnJheS5sZW5ndGgtMV1cbiovXG5leHBvcnQgZnVuY3Rpb24gbGFzdCggYXJyYXkgKSB7IHJldHVybiBhcnJheVthcnJheS5sZW5ndGgtMV07IH1cblxuLyoqXG4qIENhbGN1bGF0ZXMgdGhlIHRvdGFsIHZhbHVlIG9mIG51bWJlcnMgaW4gcGFzc2VkIGFycmF5XG4qIEBwYXJhbSB7bnVtYmVyW119IGFycmF5IG9mIG51bWVyaWNhbCB2YWx1ZXNcbiogQHJldHVybnMge251bWJlcn0gc3VtIG92ZXIgZWxlbWVudHMgaW4gYXJyYXlcbiovXG5leHBvcnQgZnVuY3Rpb24gdG90YWwoIGFycmF5ICkgeyByZXR1cm4gYXJyYXkucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCkgfTtcblxuLyoqXG4qIFJlbW92ZXMgZHVwbGljYXRlcyBpbiBhcnJheVxuKiBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiBpdGVtc1xuKiBAcmV0dXJucyB7QXJyYXl9IG9mIGl0ZW1zIHN1Y2ggdGhhdCBpdGVtX2kgIT0gaXRlbV9qIGZvciBhbGwgaSA8IGpcbiogQHNlZXtAbGluayB1bmlxdWVFbGVtZW50c30gZm9yIHRoZSBmaWx0ZXJpbmcgZnVuY3Rpb25cbiovXG5leHBvcnQgZnVuY3Rpb24gdW5pcXVlKCBhcnJheSApIHsgcmV0dXJuIGFycmF5LmZpbHRlciggdW5pcXVlRWxlbWVudHMgKTsgfVxuXG4vKipcbiogRmlsdGVycyBwYXNzZWQgYXJyYXkgZm9yIHNwZWNpZmllZCBpbmRpY2llc1xuKiBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiBpdGVtc1xuKiBAcGFyYW0ge251bWJlcltdfSBwb3NpdGlvbnMgb2YgaW50ZWdlcnMgc3VjaCB0aGF0IGkgPCBhcnJheS5sZW5ndGhcbiogQHJldHVybnMge0FycmF5fSBvZiBpdGVtcyBzdWNoIHRoYXQgZm9yIGFueSBpdGVtX2ksIHBvc2l0aW9ucy5pbmNsdWRlcyhpKSA9PT0gdHJ1ZVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXQoIGFycmF5LCBwb3NpdGlvbnMgKSB7XG4gIHJldHVybiBhcnJheS5maWx0ZXIoIGZ1bmN0aW9uKCB2YWx1ZSwgaW5kZXggKSB7IHJldHVybiBoYXNRKHBvc2l0aW9ucywgaW5kZXgpOyB9ICk7XG59XG5cbi8qKlxuKiBEZXRlcm1pbmVzIGlmIGFsbCBlbGVtZW50cyBpbiBwYXNzZWQgYXJyYXkgYXJlIGFycmF5cyB0aGVtc2VsdmVzLlxuKiBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiBpdGVtc1xuKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiBBcnJheS5pc0FycmF5KGUpIGlzIHRydWUgZm9yIGFsbCBlIGluIGFycmF5XG4qIEBzZWV7QGxpbmsgYWxsfVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0T2ZMaXN0c1EoIGFycmF5ICkge1xuICByZXR1cm4gYWxsKCBhcnJheS5tYXAoIGZ1bmN0aW9uKCBlbGVtZW50LCBpbmRleCApIHsgcmV0dXJuIEFycmF5LmlzQXJyYXkoZWxlbWVudCkgfSApIClcbn1cblxuLyoqXG4qIEJ1aWx0IG9uIHRvcCBvZiBAc2Vle0BsaW5rIGdldH0sIG1hcHBpbmcgaWYgcG9zaXRpb25zIGlzIGEgbGlzdCBvZiBsaXN0cyAoQHNlZXtAbGluayBsaXN0T2ZMaXN0c1F9KVxuKiBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiBpdGVtc1xuKiBAcGFyYW0ge251bWJlcltdIHwgW11udW1iZXJbXSB9IHBvc2l0aW9ucyBvZiBpbnRlZ2VycyBvciBsaXN0IG9mIHBvc2l0aW9ucyBvZiBpbnRlZ2Vyc1xuKiBAcmV0dXJucyB7Ym9vbGVhbn0gcmV0dXJucyBzcGVjaWZpZWQgcG9zaXRpb25zIGZyb20gYXJyYXkuIElmIG5lc3RlZCBwb3NpdGlvbnMgcGFzc2VkLCByZXR1cm5zIHJlcXVlc3RlZCBpdGVtcyBpbiBzYW1lIHN0cnVjdHVyZS5cbiovXG5leHBvcnQgZnVuY3Rpb24gY3V0KCBhcnJheSwgcG9zaXRpb25zICkge1xuICBpZiAoIGxpc3RPZkxpc3RzUShhcnJheSkgKSB7IHJldHVybiBwb3NpdGlvbnMubWFwKGZ1bmN0aW9uKHBvcywgaSkgeyByZXR1cm4gYXJyYXkuZ2V0KHBvcyk7IH0pOyB9XG4gIHJldHVybiBnZXQoIGFycmF5LCBwb3NpdGlvbnMgKTtcbn1cblxuLyoqXG4qIEdpdmVuIGFuIGFycmF5IG9mIG9iamVjdHMsIGNvbnN0cnVjdHMgbmV3IG9iamVjdHMgd2hlcmUgZWFjaCB2YWx1ZSBpcyBhIGxpc3RcbiogYmFzZWQgb24gdGhlIGNvcnJlc29uZGluZyBrZXksIHdoaWNoIGlzIGV4dHJhY3RlZCBieSB0aGUgcGFyYW1ldGVyIGJ5XG4qIEBwYXJhbSB7T2JqZWN0c1tdfSBhcnJheSBvZiBvYmplY3RzXG4qIEBwYXJhbSB7c3RyaW5nfSBieSBrZXkgd2l0aGluIGFsbCBvYmplY3RzIG9mIHBhc3NlZCBhcnJheVxuKiBAcGFyYW0ge3N0cmluZ1tdfSBbZ3JvdXBzXSBzYXZlcyBzb21lIGNvbXB1dGF0aW9uIGlmIGFsbCBrbm93biB2YWx1ZXMgZXh0cmFjdGVkIGJ5IG1hcHBpbmcgb3ZlciB0aGUgcGFyYW1ldGVyIGJ5IGFyZSBwYXNzZWRcbiogQHJldHVybnMge09iamVjdH0gb2Yga2V5IHZhbHVlIHBhaXJzLCB3aGVyZSBrZXlzIGFyZSBhbGwgdmFsdWVzIG9mIHRoZSBrZXkgYnkgZnJvbSBhbiBvYmplY3QgaW4gdGhlIHBhc3NlZCBhcnJheSBhbmQgdGhlIHZhbHVlIGFyZSB0aG9zZSBjb3JyZXNwb25kaW5nIG9iamVjdHMuXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwQnkgKGFycmF5LCBieSwgZ3JvdXBzKSB7XG4gIGlmIChncm91cHMgPT0gdW5kZWZpbmVkKSB7XG4gICAgZ3JvdXBzID0gdW5pcXVlKGFycmF5Lm1hcChmdW5jdGlvbihlbGVtZW50cywgaW5kZXgpeyByZXR1cm4gZWxlbWVudFtieV07IH0pKTtcbiAgICBncm91cHMubWFwKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCl7Z3JvdXBwZWRbdmFsdWVdID0gW119KVxuICB9XG5cbiAgdmFyIGdyb3VwcGVkID0ge307XG4gIGFycmF5Lm1hcChmdW5jdGlvbihlbGVtZW50LCBpbmRleCl7Z3JvdXBwZWRbZWxlbWVudFtieV1dLnB1c2goZWxlbWVudCl9KTtcbiAgcmV0dXJuIGdyb3VwcGVkXG59XG5cbi8qKlxuKiBUZXN0cyBpZiB0d28gYXJyYXlzIGFyZSBlcXVpdmFsZW50XG4qIEBwYXJhbSB7QXJyYXl9IGFycmF5XG4qIEBwYXJhbSB7QXJyYXl9IG90aGVyXG4qIEByZXR1cm5zIHtib29sZWFufSBpZiBldmVyeSBlbGVtZW50IG9mIGFycmF5IG1hdGNoZXMgdGhhdCBvZiBvdGhlclxuKi9cbmV4cG9ydCBmdW5jdGlvbiBhcnJheUVxdWFscyhhcnJheSwgb3RoZXIpIHtcbiAgaWYgKCFvdGhlcilcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgLy8gY29tcGFyZSBsZW5ndGhzIC0gY2FuIHNhdmUgYSBsb3Qgb2YgdGltZVxuICBpZiAoYXJyYXkubGVuZ3RoICE9IG90aGVyLmxlbmd0aClcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICBmb3IgKHZhciBpID0gMCwgbD1hcnJheS5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgbmVzdGVkIGFycmF5c1xuICAgICAgaWYgKGFycmF5W2ldIGluc3RhbmNlb2YgQXJyYXkgJiYgb3RoZXJbaV0gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgIC8vIHJlY3Vyc2UgaW50byB0aGUgbmVzdGVkIGFycmF5c1xuICAgICAgICAgIGlmICghYXJyYXlFcXVhbHMoYXJyYXlbaV0sb3RoZXJbaV0pKVxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChhcnJheVtpXSAhPSBvdGhlcltpXSkge1xuICAgICAgICAgIC8vIFdhcm5pbmcgLSB0d28gZGlmZmVyZW50IG9iamVjdCBpbnN0YW5jZXMgd2lsbCBuZXZlciBiZSBlcXVhbDoge3g6MjB9ICE9IHt4OjIwfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuXG5cbi8qKlxuKiBSZWN1cnNpdmVseSB0YWxsaWVzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgYXQgZWFjaCBsZXZlbCBvZiB0aGUgcGFzc2VkLCBwdXRhdGl2ZWx5IG5lc3RlZCBhcnJheVxuKiBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiBpdGVtcyB3aGljaCBtYXkgaW5jbHVkZSBuZXN0ZWQgYXJyYXlzXG4qIEBwYXJhbSB7bnVtYmVyfSBbbGV2ZWw9MF0gY3VycmVudCBkZXB0aCBpbiB0aGUgcmVjdXJzaW9uXG4qIEBwYXJhbSB7QXJyYXl9IFtsZXZlbERhdGE9W11dIGtlZXBzIHRyYWNrIG9mIGl0ZW1zIHNlZW4gc28gZmFyIGF0IGVhY2ggZGVwdGhcbiogQHJldHVybnMge0FycmF5fSBzdGF0aW5nIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgKGFycmF5IGluY2x1c2l2ZSkgZm91bmQgYXQgZWFjaCBsZXZlbCBvZiB0aGUgYXJyYXlcbiovXG5leHBvcnQgZnVuY3Rpb24gZWxlbWVudHNBdExldmVscyhhcnJheSwgbGV2ZWwsIGxldmVsRGF0YSkge1xuICBsZXZlbCA9IGxldmVsID09IHVuZGVmaW5lZCA/IDAgOiBsZXZlbCArIDE7XG4gIGxldmVsRGF0YSA9IGxldmVsRGF0YSA9PSB1bmRlZmluZWQgPyBbXSA6IGxldmVsRGF0YTtcbiAgaWYgKCBsZXZlbCA+PSBsZXZlbERhdGEubGVuZ3RoICkgeyBsZXZlbERhdGEucHVzaChhcnJheS5sZW5ndGgpfSBlbHNlIHtsZXZlbERhdGFbbGV2ZWxdICs9IGFycmF5Lmxlbmd0aCB9XG4gIGFycmF5Lm1hcChmdW5jdGlvbihlLCBpKSB7aWYgKEFycmF5LmlzQXJyYXkoZSkpeyBlbGVtZW50c0F0TGV2ZWxzKGUsIGxldmVsLCBsZXZlbERhdGEpIH19KVxuICByZXR1cm4gbGV2ZWxEYXRhXG59XG5cblxuLyoqXG4qIFJlY3Vyc2l2ZWx5IHRhbGxpZXMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBvZiB0aGUgcGFzc2VkLCBwdXRhdGl2ZWx5IG5lc3RlZCBhcnJheVxuKiBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiBpdGVtcyB3aGljaCBtYXkgaW5jbHVkZSBuZXN0ZWQgYXJyYXlzXG4qIEBwYXJhbSB7bnVtYmVyfSBbZWxlbWVudHM9MF0gY3VycmVudCBudW1iZXIgb2YgZWxlbWVudHMgc2VlbiBzbyBmYXJcbiogQHJldHVybnMge251bWJlcn0gbnVtYmVyIG9mIGVsZW1lbnRzIChhcnJheSBpbmNsdXNpdmUpIGZvdW5kIGluIHBhc3NlZCBhcnJheVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJPZkVsZW1lbnRzKCBhcnJheSwgZWxlbWVudHMgKSB7XG4gIGVsZW1lbnRzID0gZWxlbWVudHMgPT0gdW5kZWZpbmVkID8gMCA6IGVsZW1lbnRzO1xuICBhcnJheS5tYXAoZnVuY3Rpb24oZSwgaSkge1xuICAgIGlmICggQXJyYXkuaXNBcnJheShlKSApIHsgZWxlbWVudHMgPSBudW1iZXJPZkVsZW1lbnRzKGUsIGVsZW1lbnRzKSB9XG4gICAgZWxzZSB7IGVsZW1lbnRzICs9IDEgfVxuICB9KVxuICByZXR1cm4gZWxlbWVudHNcbn1cblxuLyoqXG4qIENvbmNhdHMgYWxsIG5lc3RlZCBhcnJheXMgaW4gcGFzc2VkIGFycmF5IHRvIGZvcm0gYSBzaW5nbGUgYXJyYXlcbiogQHBhcmFtIHtBcnJheX0gYXJyYXkgb2YgcHV0YXRpdmVseSBuZXN0ZWQgYXJyYXlzXG4qIEBwYXJhbSB7QXJyYXl9IFtmbGF0PVtdXSBjdXJyZW50IGZsYXR0ZW5lZCBhcnJheVxuKiBAcmV0dXJucyB7QXJyYXl9IHdpdGggZXZlcnkgZWxlbWVudCBpbiB0aGUgc2FtZSBsZXZlbFxuKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuKCBhcnJheSwgZmxhdCApIHtcbiAgZmxhdCA9IGZsYXQgPT0gdW5kZWZpbmVkID8gW10gOiBmbGF0O1xuICBhcnJheS5tYXAoZnVuY3Rpb24oZSwgaSl7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpIHtmbGF0ID0gZmxhdC5jb25jYXQoZmxhdHRlbihlKSl9XG4gICAgZWxzZSB7ZmxhdC5wdXNoKGUpfVxuICB9KVxuICByZXR1cm4gZmxhdDtcbn1cblxuLyoqXG4qIFNlYXJjaCBvZiBsaXN0IG9mIGxpc3RzIHRvIGZpbmQgd2hpY2ggLSBpZiBhbnkgLSBwYXNzZWQgdmFsdWUgaXMgaW5cbiogQHBhcmFtIHtBcnJheVtdfSBiaW5zIGxpc3Qgb2YgbGlzdHMgb2YgdmFsdWVzXG4qIEBwYXJhbSB7Kn0gdmFsdWUgaXRlbSB0byB0ZXN0IGlmIGluIGFueSBvZiB0aGUgYmluc1xuKiBAcmV0dXJucyB7bnVtYmVyfSBpbmRpY2F0aW5nIHRoZSBpbmRleCBvZiB0aGUgYmluIGluIHdoaWNoIHZhbHVlIHdhcyBmb3VuZFxuKi9cbmV4cG9ydCBmdW5jdGlvbiB3aGljaEJpbihiaW5zLCB2YWx1ZSkge1xuICB2YXIgaSA9IC0xXG4gIGZvciAodmFyIGogPSAwOyBqIDwgYmlucy5sZW5ndGg7IGorKykgeyBpZiAoaGFzUShiaW5zW2pdLHZhbHVlKSkge3JldHVybiBqfSB9XG4gIHJldHVybiBpXG59XG4iLCJpbXBvcnQge2h5cGVuYXRlLCBzYWZlU2VsZWN0fSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHt0b3RhbH0gZnJvbSAnLi9hcnJheS1mdW5jdGlvbnMnO1xuXG5cbi8qKlxuICogY2FsbHMgY29uc29sZS5ncm91cCBpZiBkM3NtLmRlYnVnUSA9PSB0cnVlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBvZiB0aGUgZ3JvdXBcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zb2xlR3JvdXAobmFtZSkge1xuICBpZiAod2luZG93LmQzc20uZGVidWdRID09PSB0cnVlKXtcbiAgICBjb25zb2xlLmdyb3VwKG5hbWUpXG4gIH1cbn1cblxuLyoqXG4gKiBjYWxscyBjb25zb2xlLmdyb3VwRW5kIGlmIGQzc20uZGVidWdRID09IHRydWVcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zb2xlR3JvdXBFbmQoKSB7XG4gIGlmICh3aW5kb3cuZDNzbS5kZWJ1Z1EgPT09IHRydWUpe1xuICAgIGNvbnNvbGUuZ3JvdXBFbmQoKVxuICB9XG59XG5cbi8qKlxuICogQ2FsbHMgY29uc29sZS5sb2cgaWYgZDNzbS5kZWJ1Z1EgPT0gdHJ1ZVxuICogQHBhcmFtIHtzdHJpbmd9IGZ1bmMgbmFtZSBvZiB0aGUgZnVuY3Rpb24gbG9nZ2luZ1xuICogQHBhcmFtIHtzdHJpbmd9IG1zZyB0byBsb2dcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIHRvIGJlIGxvZ2dlZCBhbG9uZyBzaWRlIHRoZSBtZXNzYWdlXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nKGZ1bmMsIG1zZywgZGF0YSkge1xuICBpZiAod2luZG93LmQzc20uZGVidWdRID09PSB0cnVlKXtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGAlY1tkM3NtOjoke2Z1bmN9XTpcXHQke21zZ31gLFxuICAgICAgW1xuICAgICAgICAnYmFja2dyb3VuZDogIzZjZDFlZicsXG4gICAgICAgICdib3JkZXItcmFkaXVzOiA1MDAwcHgnLFxuICAgICAgICAncGFkZGluZzogMHB4IDJweCcsXG4gICAgICAgICdmb250LXNpemU6IDE0cHgnXG4gICAgICBdLmpvaW4oJzsnKVxuICAgIClcbiAgICBjb25zb2xlLnRhYmxlKGRhdGEpXG4gICAgLy8gY29uc29sZS50cmFjZSgpXG4gIH1cbn1cblxuLyoqXG4gKiBDYWxscyBjb25zb2xlLndhcm4gaWYgZDNzbS5kZWJ1Z1EgPT0gdHJ1ZVxuICogQHBhcmFtIHtzdHJpbmd9IGZ1bmMgbmFtZSBvZiB0aGUgZnVuY3Rpb24gd2FybmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IG1zZyB0byBkaXNwbGF5XG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YSB0byBiZSBkaXNwbGF5ZWQgYWxvbmcgc2lkZSB0aGUgbWVzc2FnZVxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhcm4oZnVuYywgbXNnLCBkYXRhKSB7XG4gIGlmICh3aW5kb3cuZDNzbS5kZWJ1Z1EgPT09IHRydWUpXG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYCVjW2Qzc206OiR7ZnVuY31dOlxcdCR7bXNnfWAsXG4gICAgICBbXG4gICAgICAgICdiYWNrZ3JvdW5kOiAjZmZkNTNlJyxcbiAgICAgICAgJ2JvcmRlci1yYWRpdXM6IDUwMDBweCcsXG4gICAgICAgICdwYWRkaW5nOiAwcHggMnB4JyxcbiAgICAgICAgJ2ZvbnQtc2l6ZTogMTRweCdcbiAgICAgIF0uam9pbignOycpXG4gICAgKVxuICAgIGNvbnNvbGUudGFibGUoZGF0YSlcbn1cbi8qKlxuICogQ2FsbHMgdGhlIGNvbnNvbGUuaW5mbyBpZiBkM3NtLmRlYnVnUSA9PSB0cnVlXG4gKiBAcGFyYW0ge3N0cmluZ30gZnVuYyBuYW1lIG9mIHRoZSBmdW5jdGlvbiBwcm92aWRpbmcgaW5mb1xuICogQHBhcmFtIHtzdHJpbmd9IG1zZyB0byBkaXNwbGF5XG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YSB0byBiZSBkaXNwbGF5ZWQgYWxvbmcgc2lkZSB0aGUgbWVzc2FnZVxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluZm8oZnVuYywgbXNnLCBkYXRhKSB7XG4gIGlmICh3aW5kb3cuZDNzbS5kZWJ1Z1EpXG4gICAgY29uc29sZS5pbmZvKFxuICAgICAgYCVjW2Qzc206OiR7ZnVuY31dOlxcdCR7bXNnfWAsXG4gICAgICBbXG4gICAgICAgICdiYWNrZ3JvdW5kOiAjMDA5Y2NkJyxcbiAgICAgICAgJ2JvcmRlci1yYWRpdXM6IDUwMDBweCcsXG4gICAgICAgICdwYWRkaW5nOiAwcHggMnB4JyxcbiAgICAgICAgJ2ZvbnQtc2l6ZTogMTRweCdcbiAgICAgIF0uam9pbignOycpXG4gICAgKVxuICAgIGNvbnNvbGUudGFibGUoZGF0YSlcbn1cblxuXG4vKipcbiAqIENhbGxzIGNvbnNvbGUuZXJyb3IgaWYgZDNzbS5kZWJ1Z1EgPT0gdHJ1ZVxuICogQHBhcmFtIHtzdHJpbmd9IGZ1bmMgbmFtZSBvZiB0aGUgZnVuY3Rpb24gd2hpY2ggc2VuZHMgdGhlIGVycm9yXG4gKiBAcGFyYW0ge3N0cmluZ30gbXNnIHRvIGRpc3BsYXlcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIHRvIGJlIGRpc3BsYXllZCBhbG9uZyBzaWRlIHRoZSBtZXNzYWdlXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJyb3IoZnVuYywgbXNnLCBkYXRhKSB7XG4gIGlmICh3aW5kb3cuZDNzbS5kZWJ1Z1EpXG4gICAgY29uc29sZS5lcnJvcihgW2Qzc206OiR7ZnVuY31dOlxcdCR7bXNnfVxcdCVvYCxkYXRhKVxufVxuXG5cblxuXG5cbi8qKlxuKiBGdW5jdGlvbiBmb3Igc2V0dGluZyB1cCBjb250YWluZXJzIGZvciBtb3N0IHBsb3RzIHdpdGggdGhlIHkgYXhpcyBjb250YWluZXJcbiogcG9zaXRpb25lZCBvbiB0aGUgbGVmdCBhbmQgdGhlIHggYXhpcyBjb250YWluZXIgcG9zaXRpb25lZCBvbiB0aGUgYm90dG9tXG4qIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBzZWxlY3Rpb24gc2VsZWN0aW9uIG9mIGNvbnRhaW5lciBpbiB3aGljaCB0aGUgc3ZnIGlzIG9yIHNob3VsZCBiZSBtYWRlXG4qIEBwYXJhbSB7c3RyaW5nfSBuYW1lc3BhY2UgbmFtZXNwYWNlIG9mIHRoZSBjaGFydFxuKiBAcGFyYW0ge09iamVjdH0gW3NwYWNlPXt3OndpbmRvdy5pbm5lcldpZHRoLCBoOndpbmRvdy5pbm5lckhlaWdodH1dIHRoZSB3aWR0aCAodykgYW5kIGhlaWdodCAoaCkgYXZhaWxibGVcbiogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZS53PXdpbmRvdy5pbm5lcldpZHRoXSB0aGUgYXZhaWxhYmxlIHdpZHRoIGluIHdoaWNoIHRvIHJlbmRlciB0aGUgY2hhcnRcbiogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZS5oPXdpbmRvdy5pbm5lckhlaWdodF0gdGhlIGF2YWlsYWJsZSBoZWlnaHQgaW4gd2hpY2ggdG8gcmVuZGVyIHRoZSBjaGFydFxuXG4qIEBwYXJhbSB7T2JqZWN0fSBbbWFyZ2lucz17dG9wOiAwLjAxLCBib3R0b206IDAuMDEsIGxlZnQ6IDAuMDEsIHJpZ2h0OiAwLjAxfV0gdGhlIG1hcmdpbnMgZm9yIHRoZSBjaGFydFxuKiBAcGFyYW0ge251bWJlcn0gW21hcmdpbnMudG9wPTAuMDFdIHRoZSB0b3AgbWFyZ2luIG9mIHRoZSBjaGFydFxuKiBAcGFyYW0ge251bWJlcn0gW21hcmdpbnMuYm90dG9tPTAuMDFdIHRoZSBib3R0b20gbWFyZ2luIG9mIHRoZSBjaGFydFxuKiBAcGFyYW0ge251bWJlcn0gW21hcmdpbnMubGVmdD0wLjAxXSB0aGUgbGVmdCBtYXJnaW4gb2YgdGhlIGNoYXJ0XG4qIEBwYXJhbSB7bnVtYmVyfSBbbWFyZ2lucy5yaWdodD0wLjAxXSB0aGUgcmlnaHQgbWFyZ2luIG9mIHRoZSBjaGFydFxuXG5cbiogQHBhcmFtIHtPYmplY3R9IFtwZXJjZW50YWdlcyA9IHtheGVzOnt4OjAuMSx5OjAuMX0sc3BhY2U6e3c6MC44LGg6MC42fX1dIHBlcmNlbnRhZ2VzIG9mIHRoZSBwYXJhbWF0ZXIgc3BhY2Ugb2Ygd2hpY2ggdG8gbWFrZSB0aGUgeCBhbmQgeSBheGVzIGFzIHdlbGwgYXMgdGhlIHBlcmNlbnQgb2YgdGhlIGF2YWlsYmxlIHNwYWNlIGluIHdoaWNoIHRvIHJlbmRlciB0aGUgcGxvdFxuKiBAcGFyYW0ge09iamVjdH0gW3BlcmNlbnRhZ2VzLmF4ZXM9e3g6MC4xLHk6MC4xfV0gdGhlIHBlcmNlbnRhZ2VzIG9mIHRoZSBwYXJhbWF0ZXIgc3BhY2UsIG9mIHdoaWNoIHRoZSB4IGFuZCB5IGF4ZXMgd2lsbCB0YWtlIHVwXG4qIEBwYXJhbSB7bnVtYmVyfSBbcGVyY2VudGFnZXMuYXhlcy54QXhpc1BlcmNlbnQ9MC4xXSB0aGUgcGVyY2VudGFnZXMgb2YgdGhlIHBhcmFtYXRlciBzcGFjZSwgb2Ygd2hpY2ggdGhlIHggYXhpcyB3aWxsIHRha2UgdXBcbiogQHBhcmFtIHtudW1iZXJ9IFtwZXJjZW50YWdlcy5heGVzLnlBeGlzUGVyY2VudD0wLjFdIHRoZSBwZXJjZW50YWdlcyBvZiB0aGUgcGFyYW1hdGVyIHNwYWNlLCBvZiB3aGljaCB0aGUgeSBheGlzIHdpbGwgdGFrZSB1cFxuXG4qIEBwYXJhbSB7T2JqZWN0fSBbcGVyY2VudGFnZXMuc3BhY2U9e3c6MC44LGg6MC42fV0gdGhlIHBlcmNlbnRhZ2VzIG9mIHRoZSBwYXJhbWF0ZXIgc3BhY2UsIG9mIHdoaWNoIHRoZSBTVkcncyB3aWR0aCBhbmQgaGVpZ2h0IHdpbGwgYmUgc2V0XG4qIEBwYXJhbSB7bnVtYmVyfSBbcGVyY2VudGFnZXMuc3BhY2UucGVyY2VudE9mU3BhY2VGb3JXaWR0aD0wLjFdIHRoZSBwZXJjZW50YWdlcyBvZiB0aGUgcGFyYW1hdGVyIHNwYWNlLCBvZiB3aGljaCB0aGUgU1ZHJ3Mgd2lkdGggd2lsbCBiZSBzZXRcbiogQHBhcmFtIHtudW1iZXJ9IFtwZXJjZW50YWdlcy5zcGFjZS5wZXJjZW50T2ZTcGFjZUZvckhlaWdodD0wLjFdIHRoZSBwZXJjZW50YWdlcyBvZiB0aGUgcGFyYW1hdGVyIHNwYWNlLCBvZiB3aGljaCB0aGUgU1ZHJ3MgaGVpZ2h0IHdpbGwgYmUgc2V0XG5cbiogQHJldHVybnMge09iamVjdH0gcmV0dXJucyB0aGUgc2VsZWN0aW9uIGFuZCBcImJvdW5kaW5nUmVjdHNcIiBvZiB0aGUgcGxvdCBjb250YWluZXIsIHgtYXhpcyBjb250YWluZXIgYW5kIHktYXhpcyBjb250YWluZXJcbiogYXNcbipcbioge1xuKlxuKiAgIHBsb3Q6IHtzZWxlY3Rpb246IHBsb3RTZWxlY3Rpb24sIHJlY3Q6IHBsb3RSZWN0fSxcbipcbiogICB4QXhpczp7c2VsZWN0aW9uOnhBeGlzU2VsZWN0aW9uLCByZWN0OnhBeGlzUmVjdH0sXG4qXG4qICAgeUF4aXM6IHtzZWxlY3Rpb246eUF4aXNTZWxlY3Rpb24sIHJlY3Q6eUF4aXNSZWN0fVxuKlxuKiB9XG4qXG4qIHdoZXJlIGVhY2ggcmVjdCBoYXMgZm9ybTpcbipcbioge3g6ICMsIHk6ICMsIGg6ICMsIHc6ICN9XG4qXG4qIGRlcGljdGluZyB0aGUgc3RhcnRpbmcgeCBhbmQgeSBjb29yZGluYXRlIG9mIHRoZSBjb3Jlc3BvbmRpbmcgY29udGFpbmVyIChhbHNvIHRoZWlyIGRlZmF1bHQgdHJhbnNmb3JtIHZhbHVlcykgYXMgd2VsbCB0aGVpciBoZWlnaHQgKGgpIGFucyB3aWR0aCAodylcbiovXG4vLyBleHBvcnQgZnVuY3Rpb24gc2V0dXBTdGFuZGFyZENoYXJ0Q29udGFpbmVycyggc2VsZWN0aW9uLCBuYW1lc3BhY2UsIHNwYWNlLCBtYXJnaW5zLCBwZXJjZW50YWdlcykge1xuZXhwb3J0IGZ1bmN0aW9uIHNldHVwU3RhbmRhcmRDaGFydENvbnRhaW5lcnMoXG4gIHNlbGVjdGlvbixcbiAgbmFtZXNwYWNlLFxuICBzcGFjZT17dzphdmFpbGFibGVXaWR0aD13aW5kb3cuaW5uZXJXaWR0aCwgaDphdmFpbGFibGVIZWlnaHQ9d2luZG93LmlubmVySGVpZ2h0fSxcbiAgbWFyZ2lucz17dG9wOjAuMDEsIGJvdHRvbTowLjAxLCBsZWZ0OjAuMDEsIHJpZ2h0OjAuMDF9LFxuICBwZXJjZW50YWdlcz17YXhlczoge3g6IHhBeGlzUGVyY2VudD0wLjEsIHk6IHlBeGlzUGVyY2VudD0wLjF9LCBzcGFjZToge3c6IHBlcmNlbnRPZlNwYWNlRm9yV2lkdGgsIGg6IHBlcmNlbnRPZlNwYWNlRm9ySGVpZ2h0fX1cbikge1xuICBpZiAoc3BhY2UgPT0gdW5kZWZpbmVkKSB7IHNwYWNlID0ge3c6IHdpbmRvdy5pbm5lcldpZHRoLCBoOiB3aW5kb3cuaW5uZXJIZWlnaHR9IH1cbiAgaWYgKG1hcmdpbnMgPT0gdW5kZWZpbmVkKSB7IG1hcmdpbnMgPSB7dG9wOiAwLjAxLCBib3R0b206IDAuMDEsIGxlZnQ6IDAuMDEsIHJpZ2h0OiAwLjAxfSB9XG4gIGlmIChwZXJjZW50YWdlcyA9PSB1bmRlZmluZWQpIHsgcGVyY2VudGFnZXMgPSB7fTsgfVxuICBpZiAocGVyY2VudGFnZXMuYXhlcyA9PSB1bmRlZmluZWQpIHsgcGVyY2VudGFnZXMuYXhlcyA9IHsgeDowLjEsIHk6MC4xIH0gfVxuICBpZiAocGVyY2VudGFnZXMuc3BhY2UgPT0gdW5kZWZpbmVkKSB7IHBlcmNlbnRhZ2VzLnNwYWNlID0geyB3OiAwLjgsIGg6IDAuNiB9IH1cblxuICAvLyBTVkcgd2lkdGggYW5kIGhlaWdodFxuICB2YXIgc3ZnU3BhY2UgPSAge1xuICAgIHc6IHNwYWNlLncgKiBwZXJjZW50YWdlcy5zcGFjZS53LFxuICAgIGg6IHNwYWNlLmggKiBwZXJjZW50YWdlcy5zcGFjZS5oXG4gIH0sXG5cbiAgLy8gU3BhY2UgYWZ0ZXIgcmVtb3ZpbmcgbWFyZ2luc1xuICBjaGFydFNwYWNlID0ge1xuICAgIHc6IHN2Z1NwYWNlLncgLSAobWFyZ2lucy5sZWZ0ICogc3BhY2UudykgLSAobWFyZ2lucy5yaWdodCAqIHNwYWNlLncpLFxuICAgIGg6IHN2Z1NwYWNlLmggLSAobWFyZ2lucy50b3AgKiBzcGFjZS5oKSAtIChtYXJnaW5zLmJvdHRvbSAqIHNwYWNlLmgpXG4gIH0sXG5cbiAgLy8gbWFpbiBkaW1lbnNpb24gb2YgeCBhbmQgeSBheGllc1xuICAvLyBlLmcuIGRlZmluZXMgaG93IHRhbGwgeCBheGlzIGlzIGFzIGxlbmd0aCBpcyBkZXRlcm1pbmVkIGJ5IHBsb3RSZWN0LndcbiAgYXhlc1NwYWNlID0ge1xuICAgIHg6IGNoYXJ0U3BhY2UuaCAqIHBlcmNlbnRhZ2VzLmF4ZXMueCxcbiAgICB5OiBjaGFydFNwYWNlLncgKiBwZXJjZW50YWdlcy5heGVzLnlcbiAgfSxcblxuICAvLyBzcGFjZSBsZWZ0IGZvciBkcmF3aW5nIHRoZSBjaGFydCBwcm9wZXJseSAoZS5nLiBiYXJzLCB2aW9saW5zLCBldGMpXG4gIGRyYXdpbmdTcGFjZSA9IHtcbiAgICB4OiBjaGFydFNwYWNlLncgLSBheGVzU3BhY2UueSxcbiAgICB5OiBjaGFydFNwYWNlLmggLSBheGVzU3BhY2UueFxuICB9LFxuXG5cbiAgeUF4aXNSZWN0ID0ge1xuICAgIHg6IGF4ZXNTcGFjZS55ICsgKG1hcmdpbnMubGVmdCAqIHNwYWNlLncpLFxuICAgIHk6IChtYXJnaW5zLnRvcCAqIHNwYWNlLmgpLFxuICAgIHc6IGF4ZXNTcGFjZS55LFxuICAgIGg6IGRyYXdpbmdTcGFjZS55XG4gIH0sXG5cbiAgcGxvdFJlY3QgPSB7XG4gICAgeDogYXhlc1NwYWNlLnkgKyAobWFyZ2lucy5sZWZ0ICogc3BhY2UudyksXG4gICAgeTogKG1hcmdpbnMudG9wICogc3BhY2UuaCksXG4gICAgdzogZHJhd2luZ1NwYWNlLngsXG4gICAgaDogZHJhd2luZ1NwYWNlLnlcbiAgfSxcblxuICB4QXhpc1JlY3QgPSB7XG4gICAgeDogYXhlc1NwYWNlLnkgKyAobWFyZ2lucy5sZWZ0ICogc3BhY2UudyksXG4gICAgeTogKG1hcmdpbnMudG9wICogc3BhY2UuaCArIHBsb3RSZWN0LmgpLFxuICAgIHc6IGRyYXdpbmdTcGFjZS54LFxuICAgIGg6IGF4ZXNTcGFjZS54XG4gIH1cblxuXG4gIHZhciBjb250YWluZXIgPSBzYWZlU2VsZWN0KHNlbGVjdGlvbiwgJ3N2ZycsIG5hbWVzcGFjZSlcbiAgICAuc3R5bGUoJ3dpZHRoJywgc3ZnU3BhY2UudysncHgnKVxuICAgIC5zdHlsZSgnaGVpZ2h0Jywgc3ZnU3BhY2UuaCsncHgnKVxuXG4gIHZhciBheGVzID0gc2FmZVNlbGVjdChjb250YWluZXIsICdnJywgaHlwZW5hdGUobmFtZXNwYWNlLCAnYXhlcycpKVxuXG4gIC8vIC5hdHRyKCd0cmFuc2Zvcm0nLCBcInRyYW5zbGF0ZShcIitwbG90UmVjdC54K1wiLFwiK3Bsb3RSZWN0LnkrXCIpXCIpLFxuXG4gIHZhciBwbG90ID0gc2FmZVNlbGVjdChjb250YWluZXIsICdnJywgaHlwZW5hdGUobmFtZXNwYWNlLCAncGxvdCcpKVxuICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBcInRyYW5zbGF0ZShcIitwbG90UmVjdC54K1wiLFwiK3Bsb3RSZWN0LnkrXCIpXCIpXG5cbiAgdmFyIHhBeGlzID0gc2FmZVNlbGVjdChheGVzLCAnZycsIGh5cGVuYXRlKG5hbWVzcGFjZSwgJ3gtYXhpcycpKVxuICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBcInRyYW5zbGF0ZShcIit4QXhpc1JlY3QueCtcIixcIit4QXhpc1JlY3QueStcIilcIilcblxuICB2YXIgeUF4aXMgPSBzYWZlU2VsZWN0KGF4ZXMsICdnJywgaHlwZW5hdGUobmFtZXNwYWNlLCAneS1heGlzJykpXG4gICAgLmF0dHIoJ3RyYW5zZm9ybScsIFwidHJhbnNsYXRlKFwiK3lBeGlzUmVjdC54K1wiLFwiK3lBeGlzUmVjdC55K1wiKVwiKVxuXG4gIHJldHVybiB7XG4gICAgc3ZnOiB7XG4gICAgICBzZWxlY3Rpb246IGNvbnRhaW5lcixcbiAgICAgIHJlY3Q6IHN2Z1NwYWNlXG4gICAgfSxcbiAgICBwbG90OiB7XG4gICAgICBzZWxlY3Rpb246IHBsb3QsXG4gICAgICByZWN0OiBwbG90UmVjdFxuICAgIH0sXG4gICAgeEF4aXM6IHtcbiAgICAgIHNlbGVjdGlvbjogeEF4aXMsXG4gICAgICByZWN0OiB4QXhpc1JlY3RcbiAgICB9LFxuICAgIHlBeGlzOiB7XG4gICAgICBzZWxlY3Rpb246IHlBeGlzLFxuICAgICAgcmVjdDogeUF4aXNSZWN0XG4gICAgfVxuICB9XG5cbiAgLy8gcmV0dXJuIFtwbG90LCB4QXhpcywgeUF4aXNdXG59XG5cblxuXG4vKipcbiogQWRkcyBhIGNsaXAtcGF0aCByZWN0IGFuZCBiaW5kcyBpdCB0byBjb250YWluZXJcbiogQHBhcmFtIHtkMy5zZWxlY3Rpb259IGNvbnRhaW5lciBpbiB3aGljaCB0byBhZGQgdGhlIGNsaXAtcGF0aCBhbmQgdG8gd2hpY2ggdG8gYmluZCB0aGUgY2xpcGluZyBwYXRoIHRvXG4qIEBwYXJhbSB7T2JqZWN0fSByZWN0IHRoZSBjb29yZGluYXRlcyAoeCwgeSwgd2lkdGgsIGhlaWdodCkgb2YgdGhlIGNsaXAtcGF0aFxuKiBAcGFyYW0ge3N0cmluZ30gbmFtZXNwYWNlXG4qIEByZXR1cm5zIHtkMy5zZWxlY3Rpb259IG9mIHRoZSBjbGlwLXBhdGggcmVjdFxuKi9cbmV4cG9ydCBmdW5jdGlvbiBjcFJlY3QoY29udGFpbmVyLCByZWN0LCBuYW1lc3BhY2UpIHtcbiAgdmFyIGRlZnMgPSBzYWZlU2VsZWN0KGNvbnRhaW5lciwgJ2RlZnMnLCBoeXBlbmF0ZShuYW1lc3BhY2UsICdkZWZpbml0aW9ucycpKVxuICB2YXIgY3AgPSBzYWZlU2VsZWN0KGRlZnMsICdjbGlwUGF0aCcsIGh5cGVuYXRlKG5hbWVzcGFjZSwgJ2NsaXAtcGF0aCcpKVxuICAuYXR0cignaWQnLCBoeXBlbmF0ZShuYW1lc3BhY2UsICdjbGlwLXBhdGgnKSlcblxuICB2YXIgY3BSZWN0ID0gc2FmZVNlbGVjdChjcCwgJ3JlY3QnKVxuICAuYXR0cigneCcsIHJlY3QueClcbiAgLmF0dHIoJ3knLCByZWN0LnkpXG4gIC5hdHRyKCd3aWR0aCcsIHJlY3Qud2lkdGgpXG4gIC5hdHRyKCdoZWlnaHQnLCByZWN0LmhlaWdodClcblxuICBkZWZzLnJhaXNlKClcbiAgLy8gc2V0IGNsaXBwaW5nIHBhdGggdG8gY29udGFpbmVyXG4gIGNvbnRhaW5lci5hdHRyKCdjbGlwLXBhdGgnLCAndXJsKCMnKyBoeXBlbmF0ZShuYW1lc3BhY2UsICdjbGlwLXBhdGgnKSsnKScpXG5cbiAgcmV0dXJuIGNwUmVjdFxufVxuXG5cbi8qKlxuKiBBZGRzIGEgYmFja2dyb3VuZCByZWN0IHQgdG8gY29udGFpbmVyXG4qIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBjb250YWluZXIgaW4gd2hpY2ggdG8gYWRkIHRoZSBiYWNrZ3JvdW5kIHJlY3RhbmdsZVxuKiBAcGFyYW0ge09iamVjdH0gcmVjdCB0aGUgY29vcmRpbmF0ZXMgKHgsIHksIHdpZHRoLCBoZWlnaHQpIG9mIHRoZSBiYWNrZ3JvdW5kXG4qIEBwYXJhbSB7c3RyaW5nfSBmaWxsIHRoZSBjb2xvciBvZiB0aGUgYmFja2dyb3VuZFxuKiBAcmV0dXJucyB7ZDMuc2VsZWN0aW9ufSBvZiB0aGUgYmFja2dyb3VuZCBmaWxsXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGJnUmVjdChjb250YWluZXIsIHJlY3QsIGZpbGwpIHtcbiAgcmV0dXJuIHNhZmVTZWxlY3QoY29udGFpbmVyLCAncmVjdCcsICdiZycpXG4gIC5hdHRyKCd4JywgcmVjdC54KVxuICAuYXR0cigneScsIHJlY3QueSlcbiAgLmF0dHIoJ3dpZHRoJywgcmVjdC53aWR0aClcbiAgLmF0dHIoJ2hlaWdodCcsIHJlY3QuaGVpZ2h0KVxuICAuYXR0cignZmlsbCcsIGZpbGwpXG59XG5cblxuLyoqXG4qIFNldHMgdXAgdGhlIGNvbnRhaW5lciBmb3IgbWFraW5nIGNoYXJ0IGVsZW1lbnRzLiBUaGlzIGluY2x1ZGVzIG1ha2luZ1xuKiBhIGNsaXAtcGF0aCByZWN0IGJvdW5kIHRvIHRoZSBwYXNzZWQgY29udGFpbmVyLCBhIGJhY2tncm91bmQgcmVjdCwgYW5kXG4qIGEgZyBlbGVtZW50IHdpdGggY2xhc3MgPG5hbWVzcGFjZT4tb2JqZWN0LWNvbnRhaW5lci5cbiogQHBhcmFtIHtkMy5zZWxlY3Rpb259IGNvbnRhaW5lciBpbiB3aGljaCB0byBhZGQgdGhlIGNsaXAtcGF0aCBhbmQgYmFja2dyb3VuZFxuKiBAcGFyYW0ge3N0cmluZ30gbmFtZXNwYWNlXG4qIEBwYXJhbSB7T2JqZWN0fSByZWN0IHRoZSBjb29yZGluYXRlcyAoeCwgeSwgd2lkdGgsIGhlaWdodCkgb2YgdGhlIGJhY2tncm91bmQgYW5kIGNsaXAtcGF0aFxuKiBAcGFyYW0ge3N0cmluZ30gZmlsbCB0aGUgY29sb3Igb2YgdGhlIGJhY2tncm91bmRcbiogQHJldHVybnMge2QzLnNlbGVjdGlvbn0gb2YgZy48bmFtZXNwYWNlPi1vYmplY3QtY29udGFpbmVyXG4qXG4qIEBzZWV7QGxpbmsgYmdSZWN0fVxuKiBAc2Vle0BsaW5rIGNwUmVjdH1cbiovXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBDb250YWluZXIoc2VsZWN0aW9uLCBuYW1lc3BhY2UsIHJlY3QsIGZpbGwpIHtcbiAgLy8gdGhlIGNvbnRhaW5lciBmb3IgdGhyZWUgbWFpbiBpdGVtcywgYmcsIGRlZnMsIGFuZCBvYmplY3QtY29udGFpbmVyXG4gIHZhclxuICBjb250YWluZXIgPSBzYWZlU2VsZWN0KHNlbGVjdGlvbiwgJ2cnLCBuYW1lc3BhY2UpLFxuICBiZyA9IGJnUmVjdChjb250YWluZXIsIHJlY3QsIGZpbGwpLFxuICBjcCA9IGNwUmVjdChjb250YWluZXIsIHJlY3QsIG5hbWVzcGFjZSksXG4gIG9iamVjdENvbnRhaW5lciA9IHNhZmVTZWxlY3QoY29udGFpbmVyLCAnZycsIGh5cGVuYXRlKG5hbWVzcGFjZSwgJ29iamVjdC1jb250YWluZXInKSlcbiAgcmV0dXJuIG9iamVjdENvbnRhaW5lclxufVxuXG5cbi8qKlxuKiBkZXRlcm1pbmVzIHRoZSB3aWR0aCBvZiBhbiBvYmplY3QgZm9yIHRoZSBjYWxsaW5nIHBsb3R0aW5nIGZ1bmN0aW9uXG4qIEBwYXJhbSB7bnVtYmVyfSBmcmVlU3BhY2UgaG93IG11Y2ggc3BhY2UgaXMgYXZhbGlibGVcbiogQHBhcmFtIHtudW1iZXJ9IG51bWJlck9mT2JqZWN0cyBob3cgbWFueSBvYmplY3QgZG8gd2UgbmVlZFxuKiBAcGFyYW0ge251bWJlcn0gbWluT2JqZWN0V2lkdGggaG93IHNtYWxsIGFyZSB0aGVzZSBvYmplY3RzIGFsbG93ZWQgdG8gYmVcbiogQHBhcmFtIHtudW1iZXJ9IG1heE9iamVjdFdpZHRoIGhvdyBsYXJnZSBhcmUgdGhlc2Ugb2JqZWN0IGFsbG93ZWQgdG8gYmVcbiogQHBhcmFtIHtudW1iZXJ9IHNpemVPZlNwYWNlciBwZXJjZW50IG9mIGZyZWVTcGFjZSB0aGF0IGEgc2luZ2xlIHNwYWNlciBzaG91bGQgdGFrZSB1cCAobmVlZCBudW1iZXJPZk9iamVjdHMgLSAxIHNwYWNlcnMpXG4qIEBwYXJhbSB7Ym9vbGVhbn0gb3ZlcmZsb3dRIGNhbiB3ZSBnbyBiZXlvbmQgYWxsb3RlZCBzcGFjZVxuKiBAcmV0dXJucyB7bnVtYmVyfSBob3cgbGFyZ2Ugb2JqZWN0IHNob3VsZCBiZVxuKiBmdW5jdGlvbiB0cmllcyB0byBrZWVwIG9iamVjdCB3aXRoaW4gbWluIC8gbWF4IHdpZHRoLCBidXQgd2lsIGRlZmF1bHQgdG9cbiogNWUtMTAgKHNtYWxsZXN0IGNvbnNpc3Rlbmx5IHZpc2libGUgYnkgc3ZnIHNpemUgb2YgZWxlbWVudCkgaWYgb3ZlcmZsb3dRIGlzIGZhbHNlXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZVdpZHRoT2ZPYmplY3QoZnJlZVNwYWNlLCBudW1iZXJPZk9iamVjdHMsIG1pbk9iamVjdFdpZHRoLCBtYXhPYmplY3RXaWR0aCwgc2l6ZU9mU3BhY2VyLCBvdmVyZmxvd1EpIHtcbiAgdmFyIHNpemVPZlNwYWNlciA9IHNpemVPZlNwYWNlciA8IDEgPyBmcmVlU3BhY2UgKiBzaXplT2ZTcGFjZXIgOiBzaXplT2ZTcGFjZXJcbiAgdmFyIG51bWJlck9mU3BhY2VycyA9IG51bWJlck9mT2JqZWN0cyAtIDFcbiAgdmFyIHNwYWNlVGFrZW5CeVNwYWNlcnMgPSBudW1iZXJPZlNwYWNlcnMgKiBzaXplT2ZTcGFjZXJcbiAgdmFyIHJlbWFpbmluZ1NwYWNlID0gZnJlZVNwYWNlIC0gc3BhY2VUYWtlbkJ5U3BhY2Vyc1xuICByZW1haW5pbmdTcGFjZSA9IHJlbWFpbmluZ1NwYWNlIDwgMCA/IDAgOiByZW1haW5pbmdTcGFjZVxuICB2YXIgb2JqZWN0V2lkdGggPSByZW1haW5pbmdTcGFjZSAvIG51bWJlck9mT2JqZWN0c1xuXG4gIGlmICggbWF4T2JqZWN0V2lkdGggIT0gdW5kZWZpbmVkICYmIG9iamVjdFdpZHRoID4gbWF4T2JqZWN0V2lkdGggKSB7IG9iamVjdFdpZHRoID0gbWF4T2JqZWN0V2lkdGggfVxuICBpZiAoIG92ZXJmbG93USAmJiBtaW5PYmplY3RXaWR0aCAhPSB1bmRlZmluZWQgJiYgb2JqZWN0V2lkdGggPCBtaW5PYmplY3RXaWR0aCApIHsgb2JqZWN0V2lkdGggPSBtaW5PYmplY3RXaWR0aCB9XG4gIHJldHVybiBNYXRoLm1heChvYmplY3RXaWR0aCwgNWUtMTApXG59XG5cbi8qKlxuKiBAcGFyYW0ge0FycmF5W119IGRhdGEgbGlzdCBkYXRhIChjYW4gYmUgbmVzdGVkKS4gSWYgbmVzdGVkIHdpbGwgY3JlYXRlIG1vcmUgY29tcGxleCBzcGFjZXIgc2l6ZVxuKiBAcGFyYW0ge251bWJlcn0gZnJlZVNwYWNlIGhvdyBtdWNoIHNwYWNlIGlzIGF2YWxpYmxlXG4qIEBwYXJhbSB7bnVtYmVyfSBvYmplY3RXaWR0aCBAc2Vle0BsaW5rIGNhbGN1bGF0ZVdpZHRoT2ZPYmplY3R9XG4qIEBwYXJhbSB7bnVtYmVyfSBudW1iZXJPZk9iamVjdHMgaG93IG1hbnkgb2JqZWN0IGRvIHdlIG5lZWRcbiogQHBhcmFtIHtudW1iZXJ9IGJhc2VTcGFjZXJTaXplIHBlcmNlbnQgb2YgZnJlZVNwYWNlIHRoYXQgYSBzaW5nbGUgc3BhY2VyIHNob3VsZCB0YWtlIHVwIChuZWVkIG51bWJlck9mT2JqZWN0cyAtIDEgc3BhY2VycylcbiogQHBhcmFtIHtib29sZWFufSBvdmVyZmxvd1EgY2FuIHdlIGdvIGJleW9uZCBhbGxvdGVkIHNwYWNlXG4qIEByZXR1cm5zIHtudW1iZXJ9IHJldHVybnMgc2l6ZSB0aGF0IHNwYWNlciBzaG91bGQgYmUgYXQgbGV2ZWw9MFxuKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVXaWR0aE9mU3BhY2VyKGRhdGEsIGZyZWVTcGFjZSwgb2JqZWN0V2lkdGgsIG51bWJlck9mT2JqZWN0cywgYmFzZVNwYWNlclNpemUsIG92ZXJmbG93USkge1xuICBpZiAob3ZlcmZsb3dRKSB7XG4gICAgdmFyIGxpbWl0ZWROdW1iZXJPZk9iamVjdHMgPSBudW1iZXJPZk9iamVjdHMgPiA2ID8gNiA6IG51bWJlck9mT2JqZWN0c1xuICAgIHZhciBzcGFjZUxlZnQgPSBmcmVlU3BhY2UgLSBsaW1pdGVkTnVtYmVyT2ZPYmplY3RzICogb2JqZWN0V2lkdGhcbiAgICByZXR1cm4gc3BhY2VMZWZ0IC8gKGxpbWl0ZWROdW1iZXJPZk9iamVjdHMgLSAxKVxuICB9XG4gIHZhciBzcGFjZXJzQXRFYWNoTGV2ZWwgPSBzcGFjZXJzTmVlZGVkQXRFYWNoTGV2ZWwoZGF0YSlcbiAgdmFyIHRvdGFsU3BhY2VyUGVyY2VudCA9IHRvdGFsKHNwYWNlcnNBdEVhY2hMZXZlbC5tYXAoZnVuY3Rpb24oZSwgaSkge3JldHVybiBlICogMSAvIChpKzEpfSkpXG4gIHZhciBiYXNlU3BhY2VyU2l6ZSA9IChmcmVlU3BhY2UgLSAob2JqZWN0V2lkdGggKiBudW1iZXJPZk9iamVjdHMpKSAvIHRvdGFsU3BhY2VyUGVyY2VudFxuICAvLyBjb25zb2xlLmxvZyh0b3RhbFNwYWNlclBlcmNlbnQsIGJhc2VTcGFjZXJTaXplLCB0b3RhbFNwYWNlclBlcmNlbnQgKiBiYXNlU3BhY2VyU2l6ZSlcbiAgcmV0dXJuIGJhc2VTcGFjZXJTaXplXG59XG5cblxuLyoqXG4qIENhbGN1bGF0ZXMgbnVtYmVyIG9mIHNwYWNlcnMgbmVlZGVkIHRvIHNlcGVyYXRlIGVsZW1lbnRzIGF0IGVhY2ggbGV2ZWwuXG4qIEBwYXJhbSB7QXJyYXlbXX0gYXJyYXkgbGlzdCBkYXRhIChjYW4gYmUgbmVzdGVkKS4gSWYgbmVzdGVkIHdpbGwgY3JlYXRlIG1vcmUgY29tcGxleCBzcGFjZXIgc2l6ZVxuKiBAcGFyYW0ge251bWJlcn0gW2xldmVsPTBdIGN1cnJlbnQgbGV2ZWwsIHVzZWQgaW4gcmVjdXNyaW9uXG4qIEBwYXJhbSB7QXJyYXl9IFtsZXZlbERhdGE9W11dIGhvdyBtYW55IHNwYWNlcnMgbmVlZGVkIGF0IGEgZ2l2ZW4gbGV2ZWxcbiogQHJldHVybnMge0FycmF5fSBsZXZlbERhdGFcbipcbiogQGV4YW1wbGVcbiogYXJyYXkgPSBbWzEsMl0sIFszLDRdXVxuKiAvLyByZXR1cm5zIFsxLCAyXVxuKiBhcyBhdCBsZXZlbD0wIHRoZSBvbmx5IHNwYWNlciBuZWVkZWQgaXMgYmV0d2VlbiBbMSwyXSBhbmQgWzMsNF1cbiogYW5kIGF0IGxldmVsPTEgdGhlIG9ubHkgdHdvIHNwYWNlcnMgbmVlZGVkIGlzIGJldHdlZW4gMSBhbmQgMiBhcyB3ZWxsIGFzXG4qIDMgYW5kIDQgc2luY2UgdGhlIHNwYWNlciBiZXR3ZWVuIDIgYW5kIDMgaXMgaGFuZGxlZCBhdCBsZXZlbD0wXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIHNwYWNlcnNOZWVkZWRBdEVhY2hMZXZlbCAoYXJyYXksIGxldmVsLCBsZXZlbERhdGEgKSB7XG4gIGlmICggbGV2ZWwgPT0gdW5kZWZpbmVkICkgeyBsZXZlbCA9IDA7ICB9IGVsc2UgeyBsZXZlbCArPSAxIH1cbiAgaWYgKCBsZXZlbERhdGEgPT0gdW5kZWZpbmVkICkgeyBsZXZlbERhdGEgPSBbXTsgfVxuICBpZiAoIGxldmVsID49IGxldmVsRGF0YS5sZW5ndGggKSB7IGxldmVsRGF0YS5wdXNoKGFycmF5Lmxlbmd0aCAtIDEpIH1cbiAgZWxzZSB7IGxldmVsRGF0YVtsZXZlbF0gKz0gYXJyYXkubGVuZ3RoIC0gMSB9XG4gIGFycmF5Lm1hcChmdW5jdGlvbihlLCBpKSB7IGlmIChBcnJheS5pc0FycmF5KGUpKSB7IHNwYWNlcnNOZWVkZWRBdEVhY2hMZXZlbChlLCBsZXZlbCwgbGV2ZWxEYXRhKSB9IH0gKVxuICByZXR1cm4gbGV2ZWxEYXRhXG59XG5cblxuXG5cbi8qKlxuKiBEcmF3cyBhIHdoaXNrZXIgZm9yIEBzZWV7QGxpbmsgYm94d2hpc2tlcn1cbiogQHBhcmFtIHtib29sZWFufSBkaXIgZGlyZWN0aW9uIHRvIGRyYXcgd2hpc2tlciwgc2hvdWxkIGJlIGVpdGhlciB0cnVlICh1cCwgdG9wKSBvciBmYWxzZSAoZG93biBvciBib3R0b20pXG4qIEBwYXJhbSB7bnVtYmVyfSB4IHN0YXJ0aW5nIHggY29vcmRpbmF0ZSBpbiB3aGljaCB0byBkcmF3IHdoaXNrZXJcbiogQHBhcmFtIHtudW1iZXJ9IHkgc3RhcnRpbmcgeSBjb29yZGluYXRlIGluIHdoaWNoIHRvIGRyYXcgd2hpc2tlclxuKiBAcGFyYW0ge251bWJlcn0gdyB3aWR0aCBvZiBzcGFjZSBpbiB3aGljaCB0byBkcmF3IHdoaXNrZXJcbiogQHBhcmFtIHtudW1iZXJ9IGggaGVpZ2h0IG9mIHNwYWNlIGluIHdoaWNoIHRvIGRyYXcgd2hpc2tlclxuKiBAcGFyYW0ge251bWJlcn0gcGVyIHBlcmNlbnRhZ2Ugb2YgdyBvciBoIChkZXBlbmRzIG9uIG8pIHRvIG1ha2Ugd2hpc2tlclxuKiBAcGFyYW0ge2Jvb2xlYW59IG8gb3JpZW50YXRpb24sIHRydWUgaXMgaG9yaXpvbnRhbCBhbmQgZmFsc2UgaXMgdmVydGljYWxcbiogQHJldHVybnMge3N0cmluZ30gcmVwcmVzZW50aW5nIHRoZSBzdmcgcGF0aCAoaS5lLiB0aGUgZCBhdHRyaWJ1dGUgZm9yIGEgcGF0aCB0YWcpXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIHdoaXNrZXJQYXRoKGRpciwgeCwgeSwgdywgaCwgcGVyLCBvKSB7XG4gIC8vIGQgPSBkaXJlY3Rpb24gKHRydWUgaXMgdXApLCBwID0gcGVyY2VudCB3aWR0aFxuICBpZiAoZGlyID09ICd1cCcgfHwgZGlyID09ICd0b3AnIHx8IGRpciA9PSB0cnVlKSB7ZGlyID0gdHJ1ZX1cbiAgaWYgKGRpciA9PSAnZG93bicgfHwgZGlyID09ICdib3R0b20nIHx8IGRpciA9PSBmYWxzZSkge2RpciA9IGZhbHNlfVxuICBvID0gbyA9PSB1bmRlZmluZWQgPyAnaG9yaXpvbnRhbCcgOiBvXG4gIHBlciA9IHBlciA9PSB1bmRlZmluZWQgPyAxIDogcGVyXG4gIGlmIChvICE9IFwiaG9yaXpvbnRhbFwiKSB7XG4gICAgdmFyIGhoID0gaCAqIHBlciAsXG4gICAgdyA9IGRpciA/IHcgOiAtdyAsXG4gICAgYSA9IGRpciA/IHggKyB3IDogeCAsXG4gICAgYiA9IGRpciA/IHggOiB4ICsgdyAsXG4gICAgYyA9IGRpciA/IGEgOiBiXG4gICAgcCA9IFwiTSBcIiArIGEgKyAnICcgKyAoICAgICBoIC8gMiAgICAgICkgKyAnICdcbiAgICAgICsgJ0wgJyArIGIgKyAnICcgKyAoICAgICBoIC8gMiAgICAgICkgKyAnICdcbiAgICAgICsgJ00gJyArIGMgKyAnICcgKyAoIGggLyAyIC0gaGggLyAyICkgKyAnICdcbiAgICAgICsgJ0wgJyArIGMgKyAnICcgKyAoIGggLyAyICsgaGggLyAyICkgKyAnICdcblxuICAgIHJldHVybiBwXG4gIH1cbiAgdmFyIHd3ID0gdyAqIHBlcixcbiAgYSA9IGRpciA/IHkgKyBoIDogeSAgLFxuICBiID0gZGlyID8geSA6IHkgKyBoICAsXG4gIHAgPSBcIk0gXCIgKyAoICB3IC8gMiAgKSArICcgJyArIGEgKyAnICcgLy8gc3RyYWlnaHQgbGluZSBwYXJ0XG4gICAgKyAnTCAnICsgKCAgdyAvIDIgICkgKyAnICcgKyBiICsgJyAnIC8vIHN0cmFpZ2h0IGxpbmUgcGFydFxuICAgICsgJ2ggJyArICggLXd3IC8gMiApICsgJyAnICsgMCArICcgJyAvLyBob3Jpem9udGFsIGxpbmUgcGFydFxuICAgICsgJ2ggJyArICggICAgd3cgICApICsgJyAnICsgMCArICcgJ1xuICByZXR1cm4gcFxufVxuIiwiaW1wb3J0IHtsb2csIHdhcm4sIGVycm9yLCBpbmZvfSBmcm9tICcuL3V0aWxzJztcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BBQ0VHUk9VUElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKipcbiAqIFByb2R1Y2VzIGEgZnVuY3Rpb24gZm9yIHNwYWNpbmcgb2JqZWN0cyBieSBhbiBhcmJpdHJhcmx5IGNvbXBsZXggZ3JvdXBpbmdcbiAqIEByZXR1cm5zIHtyZWN1cnNpdmVseVBvc2l0aW9ufSB0aGUgZnVuY3Rpb24gZm9yIG1vdmluZyB0aGUgb2JqZWN0c1xuICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIjcmVjdXJzaXZlbHlQb3NpdGlvbn0pXG4gKiBAbmFtZXNwYWNlIGdyb3VwaW5nU3BhY2VyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBncm91cGluZ1NwYWNlcigpIHtcbiAgdmFyXG4gIC8qQHZhciB7Ym9vbGVhbn0gaG9yaXpvbnRhbFEgQGRlZmF1bHQqL1xuXG4gIC8qKlxuICAqIFdoZXRoZXIgb3Igbm90IHRvIHNwYWNlIG9iamVjdHMgaG9yaXpvbnRhbGx5IG9yIHZlcnRpY2FsbHkuXG4gICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIuaG9yaXpvbnRhbFF9KVxuICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2hvcml6b250YWxRPXRydWVdXG4gICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyI1xuICAqIEBpbnN0YW5jZVxuICAqL1xuICBob3Jpem9udGFsUSA9IHRydWUsXG4gIC8qKlxuICAqIFRoZSBzY2FsZSB0byB1c2UgdG8gcG9zaXRpb24gZWxlbWVudHMgaWYge0BsaW5rIGdyb3VwaW5nU3BhY2VyI21vdmVieX09XCJzdHJpbmdcIlxuICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyLnNjYWxlfSlcbiAgKiBAcGFyYW0ge2QzLnNjYWxlfSBbc2NhbGU9ZDMuc2NhbGVMaW5lYXIoKV1cbiAgKiBAbWVtYmVyb2YgZ3JvdXBpbmdTcGFjZXIjXG4gICogQGluc3RhbmNlXG4gICovXG4gIHNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKSxcbiAgLyoqXG4gICogSG93IGVsZW1lbnRzIGluIHRoZSBjb21wbGV4IGdyb3VwaW5nIHNob3VsZCBiZSBtb3ZlZCBvdmVyIGJ5LlxuICAqIEJ5IGRlZmF1bHQsIG1vdmVieT1cImNhdGVnb3J5XCIsIHdoaWNoIG1vdmVzIG9iamVjdHMgYnkgdGhlIGNvbXBsZXggZ3JvdXBpbmdcbiAgKiBCdXQgb2JqZWN0cyBjYW4gYWxzbyBiZSBtb3ZlZCBvdmVyIGJ5IHNjYWxlLlxuICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyLm1vdmVieX0pXG4gICogQHBhcmFtIHtzdHJpbmd9IFttb3ZlYnk9XCJjYXRlZ29yeVwiXVxuICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlciNcbiAgKiBAaW5zdGFuY2VcbiAgKi9cbiAgbW92ZWJ5ID0gJ2NhdGVnb3J5JyxcbiAgLyoqXG4gICogSG93IG1hbnkgb2JqZWN0cyBhcmUgdGhlcmUgaW4gdG90YWxcbiAgKiAoc2VlIHtAbGluayBncm91cGluZ1NwYWNlci5udW1iZXJPZk9iamVjdHN9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbbnVtYmVyT2ZPYmplY3RzPW5vbmVdXG4gICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyI1xuICAqIEBpbnN0YW5jZVxuICAqL1xuICBudW1iZXJPZk9iamVjdHMsXG4gIC8qKlxuICAqIFRoZSBjbGFzcyBnaXZlbiB0byBhbiBuZXN0ZWQgPGc+IHRhZyB3aG9zZSBwYXJlbnQocykgaGF2ZSB0aGUgY29ycmVjdCB0cmFuc2l0aW9uXG4gICogcHJvcGVydGllc1xuICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyLm51bWJlck9mT2JqZWN0c30pXG4gICogQHBhcmFtIHtzdHJpbmd9IFtudW1iZXJPZk9iamVjdHM9J2Qzc20tZ3JvdXBwZWQtaXRlbSddXG4gICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyI1xuICAqIEBpbnN0YW5jZVxuICAqL1xuICBvYmplY3RDbGFzcyA9ICdkM3NtLWdyb3VwcGVkLWl0ZW0nLFxuICAvKipcbiAgKiBUaGUgc2l6ZSBvZiB0aGUgb2JqZWN0cyBiZWluZyBwb3NpdGlvbmVkXG4gICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIub2JqZWN0U2l6ZX0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtvYmplY3RTaXplPW5vbmVdXG4gICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyI1xuICAqIEBpbnN0YW5jZVxuICAqL1xuICBvYmplY3RTaXplLFxuICAvKipcbiAgKiBUaGUgc2l6ZSBvZiB0aGUgdW4tbmVzdGVkIHNwYWNlciBiZXR3ZWVuIG9iamVjdHNcbiAgKiAoc2VlIHtAbGluayBncm91cGluZ1NwYWNlci5zcGFjZXJTaXplfSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW3NwYWNlclNpemU9bm9uZV1cbiAgKiBAbWVtYmVyb2YgZ3JvdXBpbmdTcGFjZXIjXG4gICogQGluc3RhbmNlXG4gICovXG4gIHNwYWNlclNpemUsXG4gIC8qKlxuICAqIFRoZSBkdXJhdGlvbiBvZiB0cmFuc2l0aW9ucyBpbiBtc1xuICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyLnRyYW5zaXRpb25EdXJhdGlvbn0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFt0cmFuc2l0aW9uRHVyYXRpb249MTAwMF1cbiAgKiBAbWVtYmVyb2YgZ3JvdXBpbmdTcGFjZXIjXG4gICogQGluc3RhbmNlXG4gICovXG4gIHRyYW5zaXRpb25EdXJhdGlvbiA9IDEwMDAsXG4gIC8qKlxuICAqIFRoZSBlYXNlIGZ1bmN0aW9uIGZvciB0aGUgdHJhbnNpdGlvbnNcbiAgKiAoc2VlIHtAbGluayBncm91cGluZ1NwYWNlci5lYXNlRnVuY30pXG4gICogQHBhcmFtIHtkMy5lYXNlfSBbZWFzZUZ1bmM9ZDMuZWFzZVNpbl1cbiAgKiBAbWVtYmVyb2YgZ3JvdXBpbmdTcGFjZXIjXG4gICogQGluc3RhbmNlXG4gICovXG4gIGVhc2VGdW5jID0gZDMuZWFzZVNpbixcbiAgLyoqXG4gICogVGhlIG5hbWVzcGFjZSBmb3IgdGhlIG9iamVjdHMgYmVpbmcgbW92ZWRcbiAgKiAoc2VlIHtAbGluayBncm91cGluZ1NwYWNlci5uYW1lc3BhY2V9KVxuICAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZXNwYWNlPSdzcGFjZXInXVxuICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlciNcbiAgKiBAaW5zdGFuY2VcbiAgKi9cbiAgbmFtZXNwYWNlID0gJ3NwYWNlcicsXG4gIC8qKlxuICAqIFRoZSBhbmltYXRpb24gZm9yIG5ldyBvYmplY3RzIGJlaW5nIGFkZGVkXG4gICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIuZW50ZXJGdW5jdGlvbn0pXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gZW50ZXJGdW5jdGlvblxuICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlciNcbiAgKiBAaW5zdGFuY2VcbiAgKiBAZXhhbXBsZVxuICAqIC8vIGJ5IGRlZmF1bHRcbiAgKiBmdW5jdGlvbihuZXdPYmplY3RTZWxlY3Rpb24pIHtcbiAgKiAgbmV3T2JqZWN0U2VsZWN0aW9uLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uKGQsIGkpe1xuICAqICAgIHZhclxuICAqICAgIHggPSBob3Jpem9udGFsUSA/IG9iamVjdFNpemUgKiBudW1iZXJPZk9iamVjdHMgKyBzcGFjZXJTaXplICogKG51bWJlck9mT2JqZWN0cyAtIDEpIDogMCxcbiAgKiAgICB5ID0gIWhvcml6b250YWxRID8gb2JqZWN0U2l6ZSAqIG51bWJlck9mT2JqZWN0cyArIHNwYWNlclNpemUgKiAobnVtYmVyT2ZPYmplY3RzIC0gMSkgOiAwLFxuICAqICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgKiAgICByZXR1cm4gdFxuICAqICB9KVxuICAqIH1cbiAgKi9cbiAgZW50ZXJGdW5jdGlvbiA9IGZ1bmN0aW9uKGN1cikge1xuICAgIGN1ci5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbihkLCBpKXtcbiAgICAgIHZhclxuICAgICAgeCA9IGhvcml6b250YWxRID8gb2JqZWN0U2l6ZSAqIG51bWJlck9mT2JqZWN0cyArIHNwYWNlclNpemUgKiAobnVtYmVyT2ZPYmplY3RzIC0gMSkgOiAwLFxuICAgICAgeSA9ICFob3Jpem9udGFsUSA/IG9iamVjdFNpemUgKiBudW1iZXJPZk9iamVjdHMgKyBzcGFjZXJTaXplICogKG51bWJlck9mT2JqZWN0cyAtIDEpIDogMCxcbiAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgIHJldHVybiB0XG4gICAgfSlcbiAgfSxcbiAgLyoqXG4gICogVGhlIGFuaW1hdGlvbiBmb3Igb2xkIG9iamVjdHMgYmVpbmcgcmVtb3ZlZFxuICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyLmV4aXRGdW5jdGlvbn0pXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gZXhpdEZ1bmN0aW9uXG4gICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyI1xuICAqIEBpbnN0YW5jZVxuICAqIEBleGFtcGxlXG4gICogLy8gYnkgZGVmYXVsdFxuICAqIG9sZE9iamVjdFNlbGVjdGlvbi50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlKGVhc2VGdW5jKVxuICAqIC5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbihkLCBpKXtcbiAgKiAgICAgdmFyXG4gICogICB4ID0gaG9yaXpvbnRhbFEgPyBvYmplY3RTaXplICogbnVtYmVyT2ZPYmplY3RzICsgc3BhY2VyU2l6ZSAqIChudW1iZXJPZk9iamVjdHMgLSAxKSA6IDAsXG4gICogICB5ID0gIWhvcml6b250YWxRID8gb2JqZWN0U2l6ZSAqIG51bWJlck9mT2JqZWN0cyArIHNwYWNlclNpemUgKiAobnVtYmVyT2ZPYmplY3RzIC0gMSkgOiAwLFxuICAqICAgdCA9ICd0cmFuc2xhdGUoJyt4KycsJyt5KycpJ1xuICAqICAgcmV0dXJuIHRcbiAgKiB9KS5yZW1vdmUoKVxuICAqL1xuICBleGl0RnVuY3Rpb24gPSBmdW5jdGlvbihjdXIpe1xuICAgIGxvZyhcImdyb3VwaW5nU3BhY2VyXCIsIFwiZXhpdGluZyB3aXRoXCIsIHtjdXJyZW50OiBjdXIsIGN1cnJlbnROb2RlOiBjdXIubm9kZSgpfSlcbiAgICBjdXIuY2xhc3NlZCgndG8tcmVtb3ZlJywgdHJ1ZSlcblxuICAgIGN1ci50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKjAuOSkuZWFzZShlYXNlRnVuYylcbiAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24oZCwgaSl7XG4gICAgICB2YXJcbiAgICAgIHggPSBob3Jpem9udGFsUSA/IG9iamVjdFNpemUgKiBudW1iZXJPZk9iamVjdHMgKyBzcGFjZXJTaXplICogKG51bWJlck9mT2JqZWN0cyAtIDEpIDogMCxcbiAgICAgIHkgPSAhaG9yaXpvbnRhbFEgPyBvYmplY3RTaXplICogbnVtYmVyT2ZPYmplY3RzICsgc3BhY2VyU2l6ZSAqIChudW1iZXJPZk9iamVjdHMgLSAxKSA6IDAsXG4gICAgICB0ID0gJ3RyYW5zbGF0ZSgnK3grJywnK3krJyknXG4gICAgICByZXR1cm4gdFxuICAgIH0pLnJlbW92ZSgpXG4gIH1cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgaG9yaXpvbnRhbFEgKHdoZXRoZXIgb3Igbm90IHRvIHNwYWNlIG9iamVjdHMgaG9yaXpvbnRhbGx5IG9yIHZlcnRpY2FsbHkpLlxuICAgKiAoc2VlIHtAbGluayBncm91cGluZ1NwYWNlciNob3Jpem9udGFsUX0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Z3JvdXBpbmdTcGFjZXIgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlclxuICAgKiBAc3RhdGljXG4gICAqL1xuICByZWN1cnNpdmVseVBvc2l0aW9uLmhvcml6b250YWxRID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChob3Jpem9udGFsUSA9IF8sIHJlY3Vyc2l2ZWx5UG9zaXRpb24pIDogaG9yaXpvbnRhbFEgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNjYWxlIHRvIHVzZSB0byBwb3NpdGlvbiBlbGVtZW50cyBpZiB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIjbW92ZWJ5fT1cInN0cmluZ1wiXG4gICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyI3NjYWxlfSlcbiAgICogQHBhcmFtIHtkMy5zY2FsZX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2dyb3VwaW5nU3BhY2VyIHwgZDMuc2NhbGV9XG4gICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlclxuICAgKiBAc3RhdGljXG4gICAqL1xuICByZWN1cnNpdmVseVBvc2l0aW9uLnNjYWxlID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzY2FsZSA9IF8sIHJlY3Vyc2l2ZWx5UG9zaXRpb24pIDogc2NhbGUgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgbW92ZWJ5ICh3aGV0aGVyIG9yIG5vdCB0byBtb3ZlIGJ5IHNjYWxlIG9yIGJ5IGdyb3VwaW5nKS5cbiAgICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIjbW92ZWJ5fSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtncm91cGluZ1NwYWNlciB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHJlY3Vyc2l2ZWx5UG9zaXRpb24ubW92ZWJ5ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChtb3ZlYnkgPSBfLCByZWN1cnNpdmVseVBvc2l0aW9uKSA6IG1vdmVieSB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyBudW1iZXJPZk9iamVjdHMuXG4gICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyI251bWJlck9mT2JqZWN0c30pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Z3JvdXBpbmdTcGFjZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlclxuICAgKiBAc3RhdGljXG4gICAqL1xuICByZWN1cnNpdmVseVBvc2l0aW9uLm51bWJlck9mT2JqZWN0cyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobnVtYmVyT2ZPYmplY3RzID0gXywgcmVjdXJzaXZlbHlQb3NpdGlvbikgOiBudW1iZXJPZk9iamVjdHMgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG9iamVjdENsYXNzICh3aWxsIGJlIGFwcGxpZWQgdG8gPGc+IGVsZW1lbnRzKS5cbiAgICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIjb2JqZWN0Q2xhc3N9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2dyb3VwaW5nU3BhY2VyIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgZ3JvdXBpbmdTcGFjZXJcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgcmVjdXJzaXZlbHlQb3NpdGlvbi5vYmplY3RDbGFzcyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob2JqZWN0Q2xhc3MgPSBfLCByZWN1cnNpdmVseVBvc2l0aW9uKSA6IG9iamVjdENsYXNzIH1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBvYmplY3RTaXplLlxuICAgKiAoc2VlIHtAbGluayBncm91cGluZ1NwYWNlciNvYmplY3RTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtncm91cGluZ1NwYWNlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHJlY3Vyc2l2ZWx5UG9zaXRpb24ub2JqZWN0U2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob2JqZWN0U2l6ZSA9IF8sIHJlY3Vyc2l2ZWx5UG9zaXRpb24pIDogb2JqZWN0U2l6ZSB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgc3BhY2VyU2l6ZS5cbiAgICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIjc3BhY2VyU2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Z3JvdXBpbmdTcGFjZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlclxuICAgKiBAc3RhdGljXG4gICAqL1xuICByZWN1cnNpdmVseVBvc2l0aW9uLnNwYWNlclNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNwYWNlclNpemUgPSBfLCByZWN1cnNpdmVseVBvc2l0aW9uKSA6IHNwYWNlclNpemUgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRyYW5zaXRpb25EdXJhdGlvbi5cbiAgICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIjdHJhbnNpdGlvbkR1cmF0aW9ufSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtncm91cGluZ1NwYWNlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHJlY3Vyc2l2ZWx5UG9zaXRpb24udHJhbnNpdGlvbkR1cmF0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0cmFuc2l0aW9uRHVyYXRpb24gPSBfLCByZWN1cnNpdmVseVBvc2l0aW9uKSA6IHRyYW5zaXRpb25EdXJhdGlvbiB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgZWFzZUZ1bmMuXG4gICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyI2Vhc2VGdW5jfSlcbiAgICogQHBhcmFtIHtkMy5lYXNlfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Z3JvdXBpbmdTcGFjZXIgfCBkMy5lYXNlfVxuICAgKiBAbWVtYmVyb2YgZ3JvdXBpbmdTcGFjZXJcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgcmVjdXJzaXZlbHlQb3NpdGlvbi5lYXNlRnVuYyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZWFzZUZ1bmMgPSBfLCByZWN1cnNpdmVseVBvc2l0aW9uKSA6IGVhc2VGdW5jIH1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBuYW1lc3BhY2UuXG4gICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyI25hbWVzcGFjZX0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Z3JvdXBpbmdTcGFjZXIgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlclxuICAgKiBAc3RhdGljXG4gICAqL1xuICByZWN1cnNpdmVseVBvc2l0aW9uLm5hbWVzcGFjZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobmFtZXNwYWNlID0gXywgcmVjdXJzaXZlbHlQb3NpdGlvbikgOiBuYW1lc3BhY2UgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGVudGVyRnVuY3Rpb24uXG4gICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyI2VudGVyRnVuY3Rpb259KVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Z3JvdXBpbmdTcGFjZXIgfCBmdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHJlY3Vyc2l2ZWx5UG9zaXRpb24uZW50ZXJGdW5jdGlvbiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZW50ZXJGdW5jdGlvbiA9IF8sIHJlY3Vyc2l2ZWx5UG9zaXRpb24pIDogZW50ZXJGdW5jdGlvbiB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgZXhpdEZ1bmN0aW9uLlxuICAgKiAoc2VlIHtAbGluayBncm91cGluZ1NwYWNlciNleGl0RnVuY3Rpb259KVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Z3JvdXBpbmdTcGFjZXIgfCBmdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHJlY3Vyc2l2ZWx5UG9zaXRpb24uZXhpdEZ1bmN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChleGl0RnVuY3Rpb24gPSBfLCByZWN1cnNpdmVseVBvc2l0aW9uKSA6IGV4aXRGdW5jdGlvbiB9XG5cblxuICAvKipcbiAgICogcmVjdXJzaXZlbHkgcG9zaXRpb24gdGhlIG9iamVjdHMgaW5zaWRlIG9mIHRoZSBzZWxlY3Rpb24uXG4gICAqIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBzZWxlY3Rpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICogQHBhcmFtIHtsZXZlbH0gW2xldmVsPTBdIHJlY3Vyc2lvbiBkZXB0aFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSAoaG93IG11Y2ggdG8gbW92ZSBuZXh0IGVsZW1lbnQpXG4gICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlciNcbiAgICovXG4gIGZ1bmN0aW9uIHJlY3Vyc2l2ZWx5UG9zaXRpb24oc2VsZWN0aW9uLCBkYXRhLCBsZXZlbCkge1xuICAgIGlmICggbGV2ZWwgPT0gdW5kZWZpbmVkICkgeyBsZXZlbCA9IDA7ICB9XG5cbiAgICB2YXIgY3VycmVudFNlbGVjdGlvbiA9IHNlbGVjdGlvbi5zZWxlY3RBbGwoJ2cuJytuYW1lc3BhY2UrJ1tsZXZlbD1cIicrbGV2ZWwrJ1wiXScpLmRhdGEoZGF0YSlcbiAgICB2YXIgZW50ZXIgPSBjdXJyZW50U2VsZWN0aW9uLmVudGVyKCkuYXBwZW5kKCdnJykuYXR0cignbGV2ZWwnLCBsZXZlbCkuYXR0cignY2xhc3MnLCBuYW1lc3BhY2UpXG4gICAgdmFyIGV4aXQgPSBjdXJyZW50U2VsZWN0aW9uLmV4aXQoKVxuICAgIGN1cnJlbnRTZWxlY3Rpb24gPSBjdXJyZW50U2VsZWN0aW9uLm1lcmdlKGVudGVyKVxuXG5cbiAgICBpZiAodHlwZW9mIGV4aXRGdW5jdGlvbiA9PSAnZnVuY3Rpb24nICl7IGV4aXQuZWFjaChmdW5jdGlvbihkLCBpKXsgZXhpdEZ1bmN0aW9uKGQzLnNlbGVjdCh0aGlzKSl9KSB9XG4gICAgZWxzZXtleGl0LnJlbW92ZSgpfVxuICAgIC8vIHNwYWNlciBmb3IgY3VycmVudCBsZXZlbFxuICAgIHZhciBsZXZlbFNwYWNlciA9IHNwYWNlclNpemUgLyAobGV2ZWwrMSlcbiAgICAvLyBtb3ZlbWVudCBmb3IgY3VycmVudCBsZXZlbFxuICAgIHZhciBtb3ZlID0gMFxuICAgIGN1cnJlbnRTZWxlY3Rpb24uZWFjaChmdW5jdGlvbihjdXJyZW50RWxlbWVudCwgaW5kZXgpIHtcbiAgICAgIHZhciB0ID0gZDMuc2VsZWN0KHRoaXMpXG4gICAgICBpZiAodC5hdHRyKCd0cmFuc2Zvcm0nKSA9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGVudGVyRnVuY3Rpb24gPT0gJ2Z1bmN0aW9uJykgeyBlbnRlckZ1bmN0aW9uKHQpIH1cblxuICAgICAgdC50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlKGVhc2VGdW5jKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uKGQsIGkpIHtcbiAgICAgICAgdmFyXG4gICAgICAgIHggPSBob3Jpem9udGFsUSA/IChtb3ZlYnkgPT1cInNjYWxlXCIgPyBzY2FsZShkKSA6IG1vdmUpIDogMCxcbiAgICAgICAgeSA9ICFob3Jpem9udGFsUSA/IChtb3ZlYnkgPT1cInNjYWxlXCIgPyBzY2FsZShkKSA6IG1vdmUpOiAwLFxuICAgICAgICB0ID0gJ3RyYW5zbGF0ZSgnK3grJywnK3krJyknXG4gICAgICAgIHJldHVybiB0XG4gICAgICB9KVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50RWxlbWVudCkpIHtcbiAgICAgICAgbW92ZSArPSByZWN1cnNpdmVseVBvc2l0aW9uKHQsIGN1cnJlbnRFbGVtZW50LCBsZXZlbCsxKVxuICAgICAgICB2YXIgdG9SZW1vdmUgPSB0LnNlbGVjdEFsbCgnZy4nK25hbWVzcGFjZSsnW2xldmVsPVwiJysobGV2ZWwpKydcIl0gPiBnLicrb2JqZWN0Q2xhc3MrJy4nK25hbWVzcGFjZSlcbiAgICAgICAgaWYgKHR5cGVvZiBleGl0RnVuY3Rpb24gPT0gJ2Z1bmN0aW9uJyApeyB0b1JlbW92ZS5lYWNoKGZ1bmN0aW9uKGQsIGkpeyBleGl0RnVuY3Rpb24oZDMuc2VsZWN0KHRoaXMpKX0pIH1cbiAgICAgICAgZWxzZXt0b1JlbW92ZS5yZW1vdmUoKX1cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBtb3ZlICs9IG9iamVjdFNpemVcbiAgICAgICAgdmFyIG9iaiA9IHQuc2VsZWN0KCdnLicrbmFtZXNwYWNlKydbbGV2ZWw9XCInK2xldmVsKydcIl0gPiBnLicrb2JqZWN0Q2xhc3MrJy4nK25hbWVzcGFjZSlcbiAgICAgICAgaWYgKG9iai5lbXB0eSgpKSB7IG9iaiA9IHQuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCBvYmplY3RDbGFzcykuY2xhc3NlZChuYW1lc3BhY2UsIHRydWUpIH1cbiAgICAgICAgb2JqLmF0dHIoJ3BhcmVudC1pbmRleCcsIGluZGV4KVxuICAgICAgICB2YXIgdG9SZW1vdmUgPSB0LnNlbGVjdEFsbCgnZy4nK25hbWVzcGFjZSsnW2xldmVsPVwiJysobGV2ZWwrMSkrJ1wiXScpXG5cbiAgICAgICAgaWYgKHR5cGVvZiBleGl0RnVuY3Rpb24gPT0gJ2Z1bmN0aW9uJyApeyB0b1JlbW92ZS5lYWNoKGZ1bmN0aW9uKGQsIGkpeyBleGl0RnVuY3Rpb24oZDMuc2VsZWN0KHRoaXMpKX0pIH1cbiAgICAgICAgZWxzZXt0b1JlbW92ZS5yZW1vdmUoKX1cbiAgICAgIH1cbiAgICAgIG1vdmUgKz0gKGluZGV4ID09IGN1cnJlbnRTZWxlY3Rpb24uc2l6ZSgpLTEpID8gMCA6IGxldmVsU3BhY2VyXG4gICAgfSlcbiAgICByZXR1cm4gbW92ZVxuICB9XG4gIHJldHVybiByZWN1cnNpdmVseVBvc2l0aW9uXG59XG4iLCJpbXBvcnQge1xuICBoeXBlbmF0ZSwgc2FmZVNlbGVjdCwgZXh0cmFjdFZpb2xpblZhbHVlcyxcbiAgdGlja1JhbmdlLCBtb2RpZnlIZXhpZGVjaW1hbENvbG9yTHVtaW5hbmNlLCB0cnVuY2F0ZVRleHQsXG4gIHJvdW5kXG59IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQge3NldHVwQ29udGFpbmVyLCBjYWxjdWxhdGVXaWR0aE9mT2JqZWN0LCBjYWxjdWxhdGVXaWR0aE9mU3BhY2VyfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7dW5pcXVlLCBoYXNRLCBmbGF0dGVufSBmcm9tICcuL2FycmF5LWZ1bmN0aW9ucyc7XG5pbXBvcnQge2dyb3VwaW5nU3BhY2VyfSBmcm9tICcuL2dyb3VwaW5nLXNwYWNlcic7XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXhpc1xuICpcbiAqIHtAbGluayBodHRwczovL3N1bW5ldXJvbi5naXRsYWIuaW8vZDNzbS9kZW1vcy9heGVzL2luZGV4Lmh0bWwgRGVtb31cbiAqIEBjb25zdHJ1Y3RvciBheGlzXG4gKiBAcGFyYW0ge2QzLnNlbGVjdGlvbn0gc2VsZWN0aW9uXG4gKiBAbmFtZXNwYWNlIGF4aXNcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gYXhpc1xuICovXG5leHBvcnQgZnVuY3Rpb24gYXhpcyAoIHNlbGVjdGlvbiApIHtcbiAgdmFyXG4gIC8qKlxuICAqIFRoZSBvcmllbnRhdGlvbiBvZiB0aGUgYXhpc1xuICAqIChzZWUge0BsaW5rIGF4aXMjb3JpZW50fSlcbiAgKiBAcGFyYW0ge3N0cmluZ30gW29yaWVudD0nYm90dG9tJ11cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb3JpZW50ID0gJ2JvdHRvbScsICAgICAgIC8vIGRpcmVjdGlvbiBvZiB0aGUgYXhpc1xuXG4gIC8qKlxuICAqIEFtb3VudCBvZiBob3Jpem9udGFsIHNwYWNlIChpbiBwaXhlbHMpIGF2YWlibGUgdG8gcmVuZGVyIHRoZSBheGlzIGluXG4gICogKHNlZSB7QGxpbmsgYXhpcyNzcGFjZVh9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbc3BhY2VYPTBdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNwYWNlWD0wLFxuICAvKipcbiAgKiBBbW91bnQgb2YgdmVydGljYWwgc3BhY2UgKGluIHBpeGVscykgYXZhaWJsZSB0byByZW5kZXIgdGhlIGF4aXMgaW5cbiAgKiAoc2VlIHtAbGluayBheGlzLnNwYWNlWX0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZVk9MF1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc3BhY2VZPTAsXG5cblxuICAvKipcbiAgKiBXaGV0aGVyIG9yIG5vdCB0byBhbGxvdyBheGlzIHRvIHJlbmRlciBlbGVtZW50cyBwYXNzIHRoZSBtYWluIHNwYXRpYWwgZGltZW5zaW9uXG4gICogZ2l2ZW4gdGhlIG9yaWVudGF0aW9uIChzZWUge0BsaW5rIGF4aXMjb3JpZW50fSksIHdoZXJlIHtAbGluayBheGlzI29yaWVudH09XCJib3R0b21cIiBvciB7QGxpbmsgYXhpcyNvcmllbnR9PVwidG9wXCJcbiAgKiB0aGUgbWFpbiBkaW1lbnNpb24gaXMge0BsaW5rIGF4aXMjc3BhY2VYfSBhbmQgd2hlcmUge0BsaW5rIGF4aXMjb3JpZW50fT1cImxlZnRcIiBvciB7QGxpbmsgYXhpcyNvcmllbnR9PVwicmlnaHRcIlxuICAqIHRoZSBtYWluIGRpbWVuc2lvbiBpcyB7QGxpbmsgYXhpcyNzcGFjZVl9XG4gICogQHBhcmFtIHtib29sZWFufSBbb3ZlcmZsb3dRPWZhbHNlXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBvdmVyZmxvd1EgPSBmYWxzZSwgICAgLy8gd2hldGhlciBvciBub3QgdG8gYWxsb3cgb3ZlcmZsb3dcbiAgLyoqXG4gICogV2hldGhlciBvciBub3QgdGhlIGF4aXMgbGFiZWxzIGFyZSBmb3IgY2F0ZWdvcmljYWwgZGF0YS4gSWYgZmFsc2UsXG4gICogd2lsbCB1c2Uge0BsaW5rIGF4aXMjc2NhbGV9IHRvIHBvc2l0aW9uIHRpY2tzLlxuICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NhdGVnb3JpY2FsUT1mYWxzZV1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgY2F0ZWdvcmljYWxRID0gZmFsc2UsIC8vIHdoZXRoZXIgb3Igbm90IHRoZSBheGlzIGlzIHNob3dpbmcgdmFsdWVzIG9yIGdyb3Vwc1xuICAvKipcbiAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgYXhpcyB0aWNrcyBzaG91bGQgaGF2ZSBndWlkZWxpbmVzXG4gICogQHBhcmFtIHtib29sZWFufSBbY2F0ZWdvcmljYWxRPWZhbHNlXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBndWlkZUxpbmVzUSA9IGZhbHNlLCAgICAvLyB3aGV0aGVyIG9yIG5vdCB0byBhbGxvdyBvdmVyZmxvd1xuXG5cbiAgLyoqXG4gICogSG93IHRvIGdyb3VwIHRoZSB0aWNrIGxhYmVsc1xuICAqIEBwYXJhbSB7QXJyYXlbXX0gW2dyb3VwaW5nPXVuZGVmaW5lZF0gbGlzdCBvZiBwdXRhdGl2ZWx5IG90aGVyIGxpc3RzLCB3aGljaCBzaG91bGQgY29ycmVzcG9uZCB0byB0aWNrTGFiZWxzXG4gICogd2lsbCBzcGFjZSB0aWNrIGxhYmVscyBpbiBuZXN0ZWQgbGlzdHMgY2xvc2VyIHRvZ2V0aGVyIHRoYW4gb3V0ZXIgbGlzdHNcbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZ3JvdXBpbmcsXG5cbiAgLyoqXG4gICogVGhlIHNjYWxlIGZvciB3aGljaCBub24tY2F0ZWdvcmlhbCAoc2VlIHtAbGluayBheGlzI2NhdGVnb3JpY2FsUX0pIHRpY2tzIHNob3VsZCBiZSBzcGFjZWRcbiAgKiBAcGFyYW0ge2QzLnNjYWxlfSBbc2NhbGU9ZDMuc2NhbGVMaW5lYXJdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG5cbiAgc2NhbGUgPSBkMy5zY2FsZUxpbmVhcigpLFxuICAvKipcbiAgKiBUaGUgcGFkZGluZyBmb3IgdGhlIGRvbWFpbiBvZiB0aGUgc2NhbGUgKHNlZSB7QGxpbmsgYXhpcyNzY2FsZX0pXG4gICogQHBhcmFtIHtkMy5zY2FsZX0gW3NjYWxlPWQzLnNjYWxlTGluZWFyXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBkb21haW5QYWRkaW5nID0gMC41LFxuXG5cbiAgLyoqXG4gICogRGVmYXVsdCBzcGFjZSBmb3IgdGhlIHNwYWNlciAocGVyY2VudGFnZSkgb2YgbWFpbiBkaW1lbnNpb24gZ2l2ZW4gdGhlIG9yaWVudGF0aW9uXG4gICogKHNlZSB7QGxpbmsgYXhpcyNvcmllbnR9KSwgd2hlcmUge0BsaW5rIGF4aXMjb3JpZW50fT1cImJvdHRvbVwiIG9yIHtAbGluayBheGlzI29yaWVudH09XCJ0b3BcIlxuICAqIHRoZSBtYWluIGRpbWVuc2lvbiBpcyB7QGxpbmsgYXhpcyNzcGFjZVh9IGFuZCB3aGVyZSB7QGxpbmsgYXhpcyNvcmllbnR9PVwibGVmdFwiIG9yIHtAbGluayBheGlzI29yaWVudH09XCJyaWdodFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBheGlzI3NwYWNlWX1iZXR3ZWVuIHRpY2tzXG4gICogQHBhcmFtIHtudW1iZXJ9IFtvYmplY3RTcGFjZXI9MC4wNV1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb2JqZWN0U3BhY2VyID0gMC4wNSxcbiAgLyoqXG4gICogVGhlIG1pbmltdW0gc2l6ZSB0aGF0IGFuIG9iamVjdCBjYW4gYmUgaWYge0BsaW5rIGF4aXMjY2F0ZWdvcmljYWxRfSBpcyBzZXQgdG8gdHJ1ZVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbbWluT2JqZWN0U2l6ZT0xNV1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgbWluT2JqZWN0U2l6ZSA9IDE1LFxuICAvKipcbiAgKiBUaGUgbWF4aW11bSBzaXplIHRoYXQgYW4gb2JqZWN0IGNhbiBiZSBpZiB7QGxpbmsgYXhpcyNjYXRlZ29yaWNhbFF9IGlzIHNldCB0byB0cnVlXG4gICogQHBhcmFtIHtudW1iZXJ9IFttYXhPYmplY3RTaXplPTE1XVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBtYXhPYmplY3RTaXplID0gNTAsXG5cbiAgLyoqXG4gICogQ29sb3Igb2YgdGhlIGJhY2tncm91bmRcbiAgKiBAcGFyYW0ge3N0cmluZ30gW2JhY2tncm91bmRGaWxsPVwidHJhbnNwYXJlbnRcIl1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgYmFja2dyb3VuZEZpbGwgPSAndHJhbnNwYXJlbnQnLFxuICAvKipcbiAgKiBOYW1lc3BhY2UgZm9yIGFsbCBpdGVtcyBtYWRlIGJ5IHRoaXMgaW5zdGFuY2Ugb2YgYXhpc1xuICAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZXNwYWNlPVwiZDNzbS1heGlzXCJdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG5hbWVzcGFjZSA9ICdkM3NtLWF4aXMnLFxuICAvKipcbiAgKiBDbGFzcyBuYW1lIGZvciB0aWNrIGNvbnRhaW5lciAoPGc+IGVsZW1lbnQpXG4gICogQHBhcmFtIHtzdHJpbmd9IFtvYmplY3RDbGFzcz1cInRpY2stZ3JvdXBcIl1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb2JqZWN0Q2xhc3MgPSAndGljay1ncm91cCcsXG5cbiAgLyoqXG4gICogVmFsdWVzIHRvIHNob3cgYXQgZWFjaCB0aWNrLiBPbmx5IHVzZWQgaWYgY2F0ZWdvcmljYWxRIGlzIHNldCB0cnVlLiBTZWUge0BsaW5rIGF4aXMjY2F0ZWdvcmljYWxRfVxuICAqIEBwYXJhbSB7c3RyaW5nW119IFt0aWNrTGFiZWxzPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdGlja0xhYmVscywgICAvLyB3aGF0IHRvIHBsYWNlIGF0IHRpY2tzXG4gIC8qKlxuICAqIFZhbHVlcyB0byBzaG93IGF0IGVhY2ggdGljay4gT25seSB1c2VkIGlmIGNhdGVnb3JpY2FsUSBpcyBzZXQgZmFsc2UuIFNlZSB7QGxpbmsgYXhpcyNjYXRlZ29yaWNhbFF9XG4gICogQHBhcmFtIHtzdHJpbmdbXSB8IG51bWJlcltdfSBbb2JqZWN0Q2xhc3M9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB0aWNrVmFsdWVzLCAgIC8vIHdoZXJlIHRvIHBsYWNlIHRpY2tzIGlmIG5vdFxuICAvKipcbiAgKiBOdW1iZXIgb2YgdGlja3MgdG8gZGlzcGxheSBpZiBjYXRlZ29yaWNhbFEgaXMgZmFsc2UuIFNlZSB7QGxpbmsgYXhpcyNjYXRlZ29yaWNhbFF9XG4gICogQHBhcmFtIHtudW1iZXJ9IFtudW1iZXJPZlRpY2tzPTVdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG51bWJlck9mVGlja3MgPSA1LFxuXG5cbiAgLyoqXG4gICogU3Ryb2tlIGNvbG9yIG9mIHRoZSBtYWluIGF4aXMgbGluZVxuICAqIEBwYXJhbSB7c3RyaW5nfSBbbGluZVN0cm9rZT0nYmxhY2snXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBsaW5lU3Ryb2tlID0gJ2JsYWNrJyxcbiAgLyoqXG4gICogU3Ryb2tlIHdpZHRoIG9mIHRoZSBtYWluIGF4aXMgbGluZVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbbGluZVN0cm9rZVdpZHRoPTNdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGxpbmVTdHJva2VXaWR0aCA9IDMsXG5cblxuICAvKipcbiAgKiBTdHJva2UgY29sb3Igb2YgdGlja3NcbiAgKiBAcGFyYW0ge3N0cmluZ30gW3RpY2tTdHJva2U9J2JsYWNrJ11cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdGlja1N0cm9rZSA9ICdibGFjaycsXG4gIC8qKlxuICAqIFN0cm9rZSBudW1iZXIgb2YgdGlja3NcbiAgKiBAcGFyYW0ge3N0cmluZ30gW3RpY2tTdHJva2VXaWR0aD0yXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB0aWNrU3Ryb2tlV2lkdGggPSAyLFxuICAvKipcbiAgKiBMZW5ndGggLSBpbiBwaXhlbHMgLSBvZiB0aWNrc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbdGlja0xlbmd0aD0xMF1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdGlja0xlbmd0aCA9IDEwLFxuXG5cbiAgLyoqXG4gICogRm9udCBzaXplIG9mIHRpY2sgbGFiZWxzXG4gICogQHBhcmFtIHtudW1iZXJ9IFt0aWNrTGFiZWxGb250U2l6ZT0xNF1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdGlja0xhYmVsRm9udFNpemUgPSAxNCxcbiAgLyoqXG4gICogTWluIGZvbnQgc2l6ZSBvZiB0aWNrIGxhYmVsc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbdGlja0xhYmVsTWluRm9udFNpemU9OF1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdGlja0xhYmVsTWluRm9udFNpemUgPSA4LFxuICAvKipcbiAgKiBNYXggZm9udCBzaXplIG9mIHRpY2sgbGFiZWxzXG4gICogQHBhcmFtIHtudW1iZXJ9IFt0aWNrTGFiZWxNYXhGb250U2l6ZT0yMF1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdGlja0xhYmVsTWF4Rm9udFNpemUgPSAyMCxcblxuXG4gIC8qKlxuICAqIFRleHQgYW5jaG9yIG9mIHRpY2sgbGFiZWxzXG4gICogQHBhcmFtIHtzdHJpbmd9IFt0aWNrTGFiZWxUZXh0QW5jaG9yPVwibWlkZGxlXCJdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHRpY2tMYWJlbFRleHRBbmNob3IgPSAnbWlkZGxlJyxcbiAgLyoqXG4gICogUm90YXRpb24gb2YgdGljayBsYWJlbHNcbiAgKiBAcGFyYW0ge251bWJlcn0gW3RpY2tMYWJlbFJvdGF0aW9uPTBdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHRpY2tMYWJlbFJvdGF0aW9uID0gMCxcbiAgLyoqXG4gICogT3B0aW9uYWwgZnVuY3Rpb24gZm9yIGV4dHJhY3RpbmcgdGhlIHRpY2sgbGFiZWwgZnJvbSBkYXRhXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW3RpY2tMYWJlbEZ1bmM9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB0aWNrTGFiZWxGdW5jID0gdW5kZWZpbmVkLFxuXG5cbiAgLyoqXG4gICogTGVuZ3RoIG9mIGd1aWRlbGluZXNcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbZ3VpZGVsaW5lU3BhY2U9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBndWlkZWxpbmVTcGFjZSxcbiAgLyoqXG4gICogU3Ryb2tlIGNvbG9yIG9mIGd1aWRsaW5lc1xuICAqIEBwYXJhbSB7c3RyaW5nfSBbZ3VpZGVsaW5lU3BhY2U9XCIjMzMzMzMzXCJdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGd1aWRlTGluZVN0cm9rZSA9ICcjMzMzMzMzJyxcbiAgLyoqXG4gICogU3Ryb2tlIHdpZHRoIG9mIGd1aWRsaW5lc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbZ3VpZGVsaW5lU3BhY2U9Ml1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZ3VpZGVMaW5lU3Ryb2tlV2lkdGggPSAyLFxuXG4gIC8qKlxuICAqIER1cmF0aW9uIG9mIGFsbCB0cmFuc2l0aW9ucyBvZiB0aGlzIGVsZW1lbnRcbiAgKiBAcGFyYW0ge251bWJlcn0gW3RyYW5zaXRpb25EdXJhdGlvbj0xMDAwXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB0cmFuc2l0aW9uRHVyYXRpb24gPSAxMDAwLFxuICAvKipcbiAgKiBFYXNpbmcgZnVuY3Rpb24gZm9yIHRyYW5zaXRpb25zXG4gICogQHBhcmFtIHtkMy5lYXNlfSBbZWFzZUZ1bmM9ZDMuZWFzZUV4cF1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZWFzZUZ1bmMgPSBkMy5lYXNlRXhwLFxuXG5cbiAgLyoqXG4gICogQ2xvc3VyZSB2YXJpYWJsZSBmb3IgZ2V0dGluZyBvYmplY3Qgc2l6ZSBhZnRlciBjYWxjdWxhdGlvblxuICAqIEBwYXJhbSB7bnVtYmVyfSBbb2JqZWN0U2l6ZT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG9iamVjdFNpemUsXG4gIC8qKlxuICAqIENsb3N1cmUgdmFyaWFibGUgZm9yIGdldHRpbmcgc3BhY2VyIHNpemUgYWZ0ZXIgY2FsY3VsYXRpb25cbiAgKiBAcGFyYW0ge251bWJlcn0gW3NwYWNlclNpemU9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzcGFjZXJTaXplLFxuXG4gIC8qKlxuICAqIERlY2ltYWwgcGVyY2lzaW9uIHRvIHJvdW5kIG51bWVyaWNhbCB0aWNrIGxhYmVscyB0b1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbcm91bmRUbz0yXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICByb3VuZFRvID0gMlxuXG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgc2VsZWN0aW9uIGluIHdoaWNoIGl0ZW1zIGFyZSBtYW5pcHVsYXRlZFxuICAgKiBAcGFyYW0ge2QzLnNlbGVjdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBkMy5zZWxlY3Rpb259XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNlbGVjdGlvbiA9IHNlbGVjdGlvblxuICAgKi9cbiAgYXhpcy5zZWxlY3Rpb24gPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNlbGVjdGlvbiA9IF8sIGF4aXMpIDogc2VsZWN0aW9uOyB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIG9yaWVudGF0aW9uIGluIHdoaWNoIGl0ZW1zIGFyZSBtYW5pcHVsYXRlZFxuICAgKiAoc2VlIHtAbGluayBheGlzI29yaWVudH0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXSBzaG91bGQgYmUgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbFxuICAgKiBAcmV0dXJucyB7YXhpcyB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgb3JpZW50PVwiYm90dG9tXCJcbiAgICovXG4gIGF4aXMub3JpZW50ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvcmllbnQgPSBfLCBheGlzKSA6IG9yaWVudDsgfTtcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgYW1vdW50IG9mIGhvcml6b250YWwgc3BhY2UgaW4gd2hpY2ggaXRlbXMgYXJlIG1hbmlwdWxhdGVkXG4gICAqIChzZWUge0BsaW5rIGF4aXMjc3BhY2VYfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdIHNob3VsZCBiZSBhIG51bWJlciA+IDBcbiAgICogQHJldHVybnMge2F4aXMgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNwYWNlWCA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYXhpcy5zcGFjZVggPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNwYWNlWCA9IF8sIGF4aXMpIDogc3BhY2VYOyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBhbW91bnQgb2YgdmVydGljYWwgc3BhY2UgaW4gd2hpY2ggaXRlbXMgYXJlIG1hbmlwdWxhdGVkXG4gICAqIChzZWUge0BsaW5rIGF4aXMjc3BhY2VZfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdIHNob3VsZCBiZSBhIG51bWJlciA+IDBcbiAgICogQHJldHVybnMge2F4aXMgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNwYWNlWSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYXhpcy5zcGFjZVkgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNwYWNlWSA9IF8sIGF4aXMpIDogc3BhY2VZOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHdoZXRoZXIgb3Igbm90IGF4aXMgaXMgYWxsb3dlZCB0byBnbyBiZXlvbmQgc3BlY2lmaWVkIGRpbWVuc2lvbnNcbiAgICogKHNlZSB7QGxpbmsgYXhpcyNzcGFjZVh9KVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgYm9vbGVhbn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgb3ZlcmZsb3dRID0gZmFsc2VcbiAgICovXG4gIGF4aXMub3ZlcmZsb3dRID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvdmVyZmxvd1EgPSBfLCBheGlzKSA6IG92ZXJmbG93UTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHdoZXRoZXIgb3Igbm90IGF4aXMgd2lsbCBkaXNwbGF5IGNhdGVnb3JpYWwgdGlja3Mgb3IgYnkgbnVtZXJpY2FsIHZhbHVlXG4gICAqIChzZWUge0BsaW5rIGF4aXMjY2F0ZWdvcmljYWxRfSlcbiAgICogQHBhcmFtIHtib29sZWFufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IGJvb2xlYW59XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGNhdGVnb3JpY2FsUSA9IGZhbHNlXG4gICAqL1xuICBheGlzLmNhdGVnb3JpY2FsUSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY2F0ZWdvcmljYWxRID0gXywgYXhpcykgOiBjYXRlZ29yaWNhbFE7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB3aGV0aGVyIG9yIG5vdCBheGlzIHRpY2tzIHNob3VsZCBoYXZlIGd1aWRlbGluZXNcbiAgICogKHNlZSB7QGxpbmsgYXhpcyNndWlkZUxpbmVzUX0pXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBib29sZWFufVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBndWlkZUxpbmVzUSA9IGZhbHNlXG4gICAqL1xuICBheGlzLmd1aWRlTGluZXNRID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChndWlkZUxpbmVzUSA9IF8sIGF4aXMpIDogZ3VpZGVMaW5lc1E7IH07XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgaG93IHRpY2tzIHNob3VsZCBiZSBncm91cHBlZFxuICAgKiAoc2VlIHtAbGluayBheGlzI2dyb3VwaW5nfSlcbiAgICogQHBhcmFtIHtBcnJheVtdfSBbXz1ub25lXSBsaXN0IG9mIHB1dGF0aXZlbHkgb3RoZXIgbGlzdHMsIHdoaWNoIHNob3VsZCBjb3JyZXNwb25kIHRvIHRpY2tMYWJlbHNcbiAgICogd2lsbCBzcGFjZSB0aWNrIGxhYmVscyBpbiBuZXN0ZWQgbGlzdHMgY2xvc2VyIHRvZ2V0aGVyIHRoYW4gb3V0ZXIgbGlzdHNcbiAgICogQHJldHVybnMge2F4aXMgfCBBcnJheVtdfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBncm91cGluZyA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYXhpcy5ncm91cGluZyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZ3JvdXBpbmcgPSBfLCBheGlzKSA6IGdyb3VwaW5nOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBzY2FsZSBmb3Igd2hpY2ggbm9uLWNhdGVnb3JpYWwgIHRpY2tzIHNob3VsZFxuICAgKiBiZSBzcGFjZWRcbiAgICogKHNlZSB7QGxpbmsgYXhpcyNzY2FsZX0pXG4gICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgZDMuc2NhbGV9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKVxuICAgKi9cbiAgYXhpcy5zY2FsZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2NhbGUgPSBfLCBheGlzKSA6IHNjYWxlOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHBhZGRpbmcgZm9yIHRoZSBkb21haW4gb2YgdGhlIHNjYWxlXG4gICAqIChzZWUge0BsaW5rIGF4aXMjZG9tYWluUGFkZGluZ30pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgZG9tYWluUGFkZGluZyA9IDAuNVxuICAgKi9cbiAgYXhpcy5kb21haW5QYWRkaW5nID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkb21haW5QYWRkaW5nID0gXywgYXhpcykgOiBkb21haW5QYWRkaW5nOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIG9iamVjdFNwYWNlclxuICAgKiAoc2VlIHtAbGluayBheGlzI29iamVjdFNwYWNlcn0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgb2JqZWN0U3BhY2VyID0gMC4wNVxuICAgKi9cbiAgYXhpcy5vYmplY3RTcGFjZXIgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9iamVjdFNwYWNlciA9IF8sIGF4aXMpIDogb2JqZWN0U3BhY2VyOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG1pbk9iamVjdFNpemVcbiAgICogKHNlZSB7QGxpbmsgYXhpcyNtaW5PYmplY3RTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBtaW5PYmplY3RTaXplID0gMTVcbiAgICovXG4gIGF4aXMubWluT2JqZWN0U2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobWluT2JqZWN0U2l6ZSA9IF8sIGF4aXMpIDogbWluT2JqZWN0U2l6ZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBtYXhPYmplY3RTaXplXG4gICAqIChzZWUge0BsaW5rIGF4aXMjbWF4T2JqZWN0U2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgbWF4T2JqZWN0U2l6ZSA9IDUwXG4gICAqL1xuICBheGlzLm1heE9iamVjdFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG1heE9iamVjdFNpemUgPSBfLCBheGlzKSA6IG1heE9iamVjdFNpemU7IH07XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG5hbWVzcGFjZVxuICAgKiAoc2VlIHtAbGluayBheGlzI25hbWVzcGFjZX0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgbmFtZXNwYWNlID0gJ2Qzc20tYXhpcydcbiAgICovXG4gIGF4aXMubmFtZXNwYWNlID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChuYW1lc3BhY2UgPSBfLCBheGlzKSA6IG5hbWVzcGFjZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBiYWNrZ3JvdW5kRmlsbFxuICAgKiAoc2VlIHtAbGluayBheGlzI2JhY2tncm91bmRGaWxsfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBiYWNrZ3JvdW5kRmlsbCA9ICd0cmFuc3BhcmVudCdcbiAgICovXG4gIGF4aXMuYmFja2dyb3VuZEZpbGwgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGJhY2tncm91bmRGaWxsID0gXywgYXhpcykgOiBiYWNrZ3JvdW5kRmlsbDsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBvYmplY3RDbGFzc1xuICAgKiAoc2VlIHtAbGluayBheGlzI29iamVjdENsYXNzfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvYmplY3RDbGFzcyA9ICd0aWNrLWdyb3VwJ1xuICAgKi9cbiAgYXhpcy5vYmplY3RDbGFzcyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob2JqZWN0Q2xhc3MgPSBfLCBheGlzKSA6IG9iamVjdENsYXNzOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB0aWNrTGFiZWxzXG4gICAqIChzZWUge0BsaW5rIGF4aXMjdGlja0xhYmVsc30pXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgc3RyaW5nW119XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHRpY2tMYWJlbHMgPSB1bmRlZmluZWRcbiAgICovXG4gIGF4aXMudGlja0xhYmVscyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja0xhYmVscyA9IF8sIGF4aXMpIDogdGlja0xhYmVsczsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB0aWNrVmFsdWVzXG4gICAqIChzZWUge0BsaW5rIGF4aXMjdGlja1ZhbHVlc30pXG4gICAqIEBwYXJhbSB7bnVtYmVyW119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgbnVtYmVyW119XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHRpY2tWYWx1ZXMgPSB1bmRlZmluZWRcbiAgICovXG4gIGF4aXMudGlja1ZhbHVlcyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja1ZhbHVlcyA9IF8sIGF4aXMpIDogdGlja1ZhbHVlczsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB0aWNrVmFsdWVzXG4gICAqIChzZWUge0BsaW5rIGF4aXMjbnVtYmVyT2ZUaWNrc30pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgbnVtYmVyT2ZUaWNrcyA9IDVcbiAgICovXG4gIGF4aXMubnVtYmVyT2ZUaWNrcyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobnVtYmVyT2ZUaWNrcyA9IF8sIGF4aXMpIDogbnVtYmVyT2ZUaWNrczsgfTtcblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbGluZVN0cm9rZVxuICAgKiAoc2VlIHtAbGluayBheGlzI2xpbmVTdHJva2V9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGxpbmVTdHJva2UgPSAnYmxhY2snXG4gICAqL1xuICBheGlzLmxpbmVTdHJva2UgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGxpbmVTdHJva2UgPSBfLCBheGlzKSA6IGxpbmVTdHJva2U7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbGluZVN0cm9rZVdpZHRoXG4gICAqIChzZWUge0BsaW5rIGF4aXMjbGluZVN0cm9rZVdpZHRofSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBsaW5lU3Ryb2tlV2lkdGggPSAzXG4gICAqL1xuICBheGlzLmxpbmVTdHJva2VXaWR0aCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobGluZVN0cm9rZVdpZHRoID0gXywgYXhpcykgOiBsaW5lU3Ryb2tlV2lkdGg7IH07XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRpY2tTdHJva2VcbiAgICogKHNlZSB7QGxpbmsgYXhpcyN0aWNrU3Ryb2tlfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0aWNrU3Ryb2tlID0gJ2JsYWNrJ1xuICAgKi9cbiAgYXhpcy50aWNrU3Ryb2tlID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrU3Ryb2tlID0gXywgYXhpcykgOiB0aWNrU3Ryb2tlOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRpY2tTdHJva2VXaWR0aFxuICAgKiAoc2VlIHtAbGluayBheGlzI3RpY2tTdHJva2VXaWR0aH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdGlja1N0cm9rZVdpZHRoID0gMlxuICAgKi9cbiAgYXhpcy50aWNrU3Ryb2tlV2lkdGggPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tTdHJva2VXaWR0aCA9IF8sIGF4aXMpIDogdGlja1N0cm9rZVdpZHRoOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRpY2tMZW5ndGhcbiAgICogKHNlZSB7QGxpbmsgYXhpcyN0aWNrTGVuZ3RofSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0aWNrTGVuZ3RoID0gMTBcbiAgICovXG4gIGF4aXMudGlja0xlbmd0aCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja0xlbmd0aCA9IF8sIGF4aXMpIDogdGlja0xlbmd0aDsgfTtcblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdGlja0xhYmVsRm9udFNpemVcbiAgICogKHNlZSB7QGxpbmsgYXhpcyN0aWNrTGFiZWxGb250U2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdGlja0xhYmVsRm9udFNpemUgPSAxNFxuICAgKi9cbiAgYXhpcy50aWNrTGFiZWxGb250U2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja0xhYmVsRm9udFNpemUgPSBfLCBheGlzKSA6IHRpY2tMYWJlbEZvbnRTaXplOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRpY2tMYWJlbE1pbkZvbnRTaXplXG4gICAqIChzZWUge0BsaW5rIGF4aXMjdGlja0xhYmVsTWluRm9udFNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHRpY2tMYWJlbE1pbkZvbnRTaXplID0gOFxuICAgKi9cbiAgYXhpcy50aWNrTGFiZWxNaW5Gb250U2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja0xhYmVsTWluRm9udFNpemUgPSBfLCBheGlzKSA6IHRpY2tMYWJlbE1pbkZvbnRTaXplOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRpY2tMYWJlbE1heEZvbnRTaXplXG4gICAqIChzZWUge0BsaW5rIGF4aXMjdGlja0xhYmVsTWF4Rm9udFNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHRpY2tMYWJlbE1heEZvbnRTaXplID0gMjBcbiAgICovXG4gIGF4aXMudGlja0xhYmVsTWF4Rm9udFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tMYWJlbE1heEZvbnRTaXplID0gXywgYXhpcykgOiB0aWNrTGFiZWxNYXhGb250U2l6ZTt9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB0aWNrTGFiZWxUZXh0QW5jaG9yXG4gICAqIChzZWUge0BsaW5rIGF4aXMjdGlja0xhYmVsVGV4dEFuY2hvcn0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdGlja0xhYmVsVGV4dEFuY2hvciA9ICdjZW50ZXInXG4gICAqL1xuICBheGlzLnRpY2tMYWJlbFRleHRBbmNob3IgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tMYWJlbFRleHRBbmNob3IgPSBfLCBheGlzKSA6IHRpY2tMYWJlbFRleHRBbmNob3I7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdGlja0xhYmVsUm90YXRpb25cbiAgICogKHNlZSB7QGxpbmsgYXhpcyN0aWNrTGFiZWxSb3RhdGlvbn0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdGlja0xhYmVsUm90YXRpb24gPSAwXG4gICAqL1xuICBheGlzLnRpY2tMYWJlbFJvdGF0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrTGFiZWxSb3RhdGlvbiA9IF8sIGF4aXMpIDogdGlja0xhYmVsUm90YXRpb247IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdGlja0xhYmVsRnVuY1xuICAgKiAoc2VlIHtAbGluayBheGlzI3RpY2tMYWJlbEZ1bmN9KVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IGZ1bmN0aW9ufVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0aWNrTGFiZWxGdW5jID0gdW5kZWZpbmVkXG4gICAqL1xuICBheGlzLnRpY2tMYWJlbEZ1bmMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tMYWJlbEZ1bmMgPSBfLCBheGlzKSA6IHRpY2tMYWJlbEZ1bmM7IH07XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGd1aWRlbGluZVNwYWNlXG4gICAqIChzZWUge0BsaW5rIGF4aXMjZ3VpZGVsaW5lU3BhY2V9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGd1aWRlbGluZVNwYWNlID0gdW5kZWZpbmVkXG4gICAqL1xuICBheGlzLmd1aWRlbGluZVNwYWNlID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChndWlkZWxpbmVTcGFjZSA9IF8sIGF4aXMpIDogZ3VpZGVsaW5lU3BhY2U7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgZ3VpZGVMaW5lU3Ryb2tlXG4gICAqIChzZWUge0BsaW5rIGF4aXMjZ3VpZGVMaW5lU3Ryb2tlfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBndWlkZUxpbmVTdHJva2UgPSBcIiMzMzMzMzNcIlxuICAgKi9cbiAgYXhpcy5ndWlkZUxpbmVTdHJva2UgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGd1aWRlTGluZVN0cm9rZSA9IF8sIGF4aXMpIDogZ3VpZGVMaW5lU3Ryb2tlOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGd1aWRlTGluZVN0cm9rZVdpZHRoXG4gICAqIChzZWUge0BsaW5rIGF4aXMjZ3VpZGVMaW5lU3Ryb2tlV2lkdGh9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGd1aWRlTGluZVN0cm9rZVdpZHRoID0gMlxuICAgKi9cbiAgYXhpcy5ndWlkZUxpbmVTdHJva2VXaWR0aCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZ3VpZGVMaW5lU3Ryb2tlV2lkdGggPSBfLCBheGlzKSA6IGd1aWRlTGluZVN0cm9rZVdpZHRoOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB0cmFuc2l0aW9uRHVyYXRpb25cbiAgICogKHNlZSB7QGxpbmsgYXhpcyN0cmFuc2l0aW9uRHVyYXRpb259KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHRyYW5zaXRpb25EdXJhdGlvbiA9IDEwMDBcbiAgICovXG4gIGF4aXMudHJhbnNpdGlvbkR1cmF0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0cmFuc2l0aW9uRHVyYXRpb24gPSBfLCBheGlzKSA6IHRyYW5zaXRpb25EdXJhdGlvbjsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBlYXNlRnVuY1xuICAgKiAoc2VlIHtAbGluayBheGlzI2Vhc2VGdW5jfSlcbiAgICogQHBhcmFtIHtkMy5lYXNlfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IGQzLmVhc2V9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGVhc2VGdW5jID0gZDMuZWFzZUV4cFxuICAgKi9cbiAgYXhpcy5lYXNlRnVuYyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZWFzZUZ1bmMgPSBfLCBheGlzKSA6IGVhc2VGdW5jOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBvYmplY3RTaXplXG4gICAqIChzZWUge0BsaW5rIGF4aXMjb2JqZWN0U2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgb2JqZWN0U2l6ZSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYXhpcy5vYmplY3RTaXplID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvYmplY3RTaXplID0gXywgYXhpcykgOiBvYmplY3RTaXplOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNwYWNlclNpemVcbiAgICogKHNlZSB7QGxpbmsgYXhpcyNzcGFjZXJTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzcGFjZXJTaXplID0gdW5kZWZpbmVkXG4gICAqL1xuICBheGlzLnNwYWNlclNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNwYWNlclNpemUgPSBfLCBheGlzKSA6IHNwYWNlclNpemU7IH07XG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSByb3VuZFRvXG4gICAqIChzZWUge0BsaW5rIGF4aXMjcm91bmRUb30pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgcm91bmRUbyA9IDJcbiAgICovXG4gIGF4aXMucm91bmRUbyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocm91bmRUbyA9IF8sIGF4aXMpIDogcm91bmRUbzsgfTtcblxuXG5cbiAgZnVuY3Rpb24gYXhpcyAoKSB7XG4gICAgLy8gZm9yIGNvbnZlbmllbmNlIGluIGhhbmRsaW5nIG9yaWVudGF0aW9uIHNwZWNpZmljIHZhbHVlc1xuICAgIHZhciBob3Jpem9udGFsUSA9IGhhc1EoWyd0b3AnLCAnYm90dG9tJywgJ2hvcml6b250YWwnXSxvcmllbnQpID8gdHJ1ZSA6IGZhbHNlXG4gICAgdmFyIHZlcnRpY2FsUSA9ICFob3Jpem9udGFsUVxuXG4gICAgLy8gYmFja2dyb3VuZCBjbGlwaW5nIHJlY3RhbmdsZVxuICAgIHZhciBiZ2NwUmVjdCA9IHt4OjAsIHk6MCwgd2lkdGg6IHNwYWNlWCwgaGVpZ2h0OnNwYWNlWX1cbiAgICBpZiAob3JpZW50ID09IFwibGVmdFwiKSB7IGJnY3BSZWN0LnggLT0gc3BhY2VYOyAgaWYoZ3VpZGVMaW5lc1EpIHsgYmdjcFJlY3Qud2lkdGggKz0gZ3VpZGVsaW5lU3BhY2UgfTsgYmdjcFJlY3QueSAtPSB0aWNrTGFiZWxNYXhGb250U2l6ZTsgYmdjcFJlY3QuaGVpZ2h0ICs9IDIqdGlja0xhYmVsTWF4Rm9udFNpemUgIH1cbiAgICBpZiAob3JpZW50ID09IFwiYm90dG9tXCIpeyBiZ2NwUmVjdC55ID0gYmdjcFJlY3QueTtcbiAgICAgIGlmKGd1aWRlTGluZXNRKSB7IGJnY3BSZWN0LnkgLT0gZ3VpZGVsaW5lU3BhY2U7IGJnY3BSZWN0LmhlaWdodCArPSBndWlkZWxpbmVTcGFjZTsgfTtcbiAgICAgIGJnY3BSZWN0LnggLT0gdGlja0xhYmVsTWF4Rm9udFNpemU7IGJnY3BSZWN0LndpZHRoICs9IDIqdGlja0xhYmVsTWF4Rm9udFNpemVcblxuICAgIH1cbiAgICBpZiAob3JpZW50ID09IFwidG9wXCIpIHsgYmdjcFJlY3QueSAtPSBzcGFjZVk7XG4gICAgICBpZihndWlkZUxpbmVzUSkgeyBiZ2NwUmVjdC5oZWlnaHQgKz0gZ3VpZGVsaW5lU3BhY2UgfTtcbiAgICAgIC8vIGJnY3BSZWN0LnkgLT0gdGlja0xhYmVsTWF4Rm9udFNpemU7IGJnY3BSZWN0LmhlaWdodCArPSAyKnRpY2tMYWJlbE1heEZvbnRTaXplXG4gICAgfVxuICAgIGlmIChvcmllbnQgPT0gXCJyaWdodFwiKSB7IGJnY3BSZWN0LnggPSAwO1xuICAgICAgaWYoZ3VpZGVMaW5lc1EpIHsgYmdjcFJlY3Qud2lkdGggKz0gZ3VpZGVsaW5lU3BhY2U7IGJnY3BSZWN0LnggLT0gZ3VpZGVsaW5lU3BhY2UgfTtcbiAgICAgIGJnY3BSZWN0LnkgLT0gdGlja0xhYmVsTWF4Rm9udFNpemU7IGJnY3BSZWN0LmhlaWdodCArPSAyKnRpY2tMYWJlbE1heEZvbnRTaXplXG4gICAgICBjb25zb2xlLmxvZyhiZ2NwUmVjdClcbiAgICB9XG5cblxuICAgIHZhciBjb250YWluZXIgPSBzZXR1cENvbnRhaW5lciggc2VsZWN0aW9uLCBuYW1lc3BhY2UsIGJnY3BSZWN0LCBiYWNrZ3JvdW5kRmlsbCApO1xuXG4gICAgLy8gdmFyIHRpY2tzID0gIHNhZmVTZWxlY3QoY29udGFpbmVyLCAnZycsIGh5cGVuYXRlKG5hbWVzcGFjZSwnYXhpcy10aWNrcycpKVxuICAgIC8vIHZhciBsYWJlbHMgPSAgc2FmZVNlbGVjdChjb250YWluZXIsICdnJywgaHlwZW5hdGUobmFtZXNwYWNlLCdheGlzLWxhYmVscycpKVxuICAgIC8vIHZhciBndWlkbGluZXMgPSAgc2FmZVNlbGVjdChjb250YWluZXIsICdnJywgaHlwZW5hdGUobmFtZXNwYWNlLCdndWlkZWxpbmUtY29udGFpbmVyJykpXG4gICAgLy9cbiAgICAvLyB2YXIgdGlja3MgPSB0aWNrcy5zZWxlY3RBbGwoJy4nK2h5cGVuYXRlKG5hbWVzcGFjZSwndGljaycpKVxuICAgIC8vIHZhciBsYWJlbHMgPSBsYWJlbHMuc2VsZWN0QWxsKCcuJytoeXBlbmF0ZShuYW1lc3BhY2UsJ2xhYmVsJykpXG4gICAgLy8gdmFyIGdsaW5lcyA9IGd1aWRsaW5lcy5zZWxlY3RBbGwoJy4nK2h5cGVuYXRlKG5hbWVzcGFjZSwnZ3VpZGVsaW5lJykpXG5cbiAgICBpZiAob3JpZW50ID09ICd0b3AnKSB7dGlja0xhYmVsVGV4dEFuY2hvciA9ICdzdGFydCc7IHRpY2tMYWJlbFJvdGF0aW9uID0gOTB9XG4gICAgaWYgKG9yaWVudCA9PSAnYm90dG9tJykge3RpY2tMYWJlbFRleHRBbmNob3IgPSAnZW5kJzsgdGlja0xhYmVsUm90YXRpb24gPSAtOTB9XG4gICAgaWYgKG9yaWVudCA9PSAnbGVmdCcpIHt0aWNrTGFiZWxUZXh0QW5jaG9yID0gJ2VuZCc7IHRpY2tMYWJlbFJvdGF0aW9uID0gMH1cbiAgICBpZiAob3JpZW50ID09ICdyaWdodCcpIHt0aWNrTGFiZWxUZXh0QW5jaG9yID0gJ3N0YXJ0JzsgdGlja0xhYmVsUm90YXRpb24gPSAwfVxuXG5cbiAgICB2YXIgdGlja0RhdGEgPSBjYXRlZ29yaWNhbFFcbiAgICA/IChncm91cGluZyA9PSB1bmRlZmluZWQpID8gdGlja0xhYmVscyA6IGdyb3VwaW5nXG4gICAgOiAoZ3JvdXBpbmcgPT0gdW5kZWZpbmVkKVxuICAgICAgPyAobnVtYmVyT2ZUaWNrcyAhPSB1bmRlZmluZWQpXG4gICAgICAvLyA/ICh0aWNrVmFsdWVzLmxlbmd0aCA8IG51bWJlck9mVGlja3MpXG4gICAgICAgID8gKHRpY2tSYW5nZSguLi5kMy5leHRlbnQodGlja1ZhbHVlcyksIG51bWJlck9mVGlja3MpKVxuICAgICAgICA6IHRpY2tWYWx1ZXNcbiAgICAgIDogZ3JvdXBpbmdcblxuICAgIHZhciBmbGF0VGlja0RhdGEgPSBmbGF0dGVuKHRpY2tEYXRhKVxuICAgIHZhciBudW1iZXJPZk9iamVjdHMgPSBmbGF0VGlja0RhdGEubGVuZ3RoXG4gICAgdmFyIHNwYWNlID0gaG9yaXpvbnRhbFEgPyBzcGFjZVggOiBzcGFjZVlcbiAgICB2YXIgZXh0ZW50ID0gZDMuZXh0ZW50KGZsYXRUaWNrRGF0YSlcblxuICAgIHNjYWxlXG4gICAgLmRvbWFpbihbZXh0ZW50WzBdIC0gZG9tYWluUGFkZGluZywgZXh0ZW50WzFdICsgZG9tYWluUGFkZGluZ10pXG4gICAgLnJhbmdlKFtob3Jpem9udGFsUSA/IDAgOiBzcGFjZVksIGhvcml6b250YWxRID8gc3BhY2VYIDogMF0pXG5cbiAgICAvLyBjYWxjdWxhdGUgb2JqZWN0IHNpemVcbiAgICBvYmplY3RTaXplID0gKG9iamVjdFNpemUgPT0gdW5kZWZpbmVkKVxuICAgID8gY2FsY3VsYXRlV2lkdGhPZk9iamVjdChzcGFjZSwgbnVtYmVyT2ZPYmplY3RzLCBtaW5PYmplY3RTaXplLCBtYXhPYmplY3RTaXplLCBvYmplY3RTcGFjZXIsIG92ZXJmbG93USlcbiAgICA6IG9iamVjdFNpemVcblxuICAgIC8vIGNhbGN1bGF0ZSBzcGFjZXIgc2l6ZSBpZiBuZWVkZWRcbiAgICBzcGFjZXJTaXplID0gKHNwYWNlclNpemUgPT0gdW5kZWZpbmVkKVxuICAgID8gY2FsY3VsYXRlV2lkdGhPZlNwYWNlcihmbGF0VGlja0RhdGEsIHNwYWNlLCBvYmplY3RTaXplLCBudW1iZXJPZk9iamVjdHMsIG9iamVjdFNwYWNlciwgb3ZlcmZsb3dRKVxuICAgIDogc3BhY2VyU2l6ZVxuXG4gICAgdmFyIG9iakNsYXNzID0gaHlwZW5hdGUobmFtZXNwYWNlLCBjYXRlZ29yaWNhbFEgPyBvYmplY3RDbGFzcysnLWNhdGVnb3JpY2FsJyA6IG9iamVjdENsYXNzKVxuXG4gICAgdmFyIHNwYWNlckZ1bmN0aW9uID0gZ3JvdXBpbmdTcGFjZXIoKVxuICAgIC5ob3Jpem9udGFsUShob3Jpem9udGFsUSkuc2NhbGUoc2NhbGUpLm1vdmVieSgoY2F0ZWdvcmljYWxRPydjYXRlZ29yeSc6J3NjYWxlJykpLm51bWJlck9mT2JqZWN0cyhudW1iZXJPZk9iamVjdHMpXG4gICAgLm9iamVjdENsYXNzKG9iakNsYXNzKS5vYmplY3RTaXplKG9iamVjdFNpemUpLnNwYWNlclNpemUoc3BhY2VyU2l6ZSlcbiAgICAudHJhbnNpdGlvbkR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuZWFzZUZ1bmMoZWFzZUZ1bmMpXG4gICAgLm5hbWVzcGFjZShuYW1lc3BhY2UpXG5cbiAgICB2YXIgdGlja0VudGVyQW5pbWF0aW9uID0gZnVuY3Rpb24oc2VsKXtcbiAgICAgIHZhciBtdCA9IHNjYWxlKHNlbC5kYXR1bSgpKSxcbiAgICAgIGRpc3QgPSBzY2FsZShleHRlbnRbMV0pICogMixcbiAgICAgIGsgPSAobXQgPCBleHRlbnRbMV0gLyAyKSA/IDEgOiAtMVxuICAgICAgayA9IGhvcml6b250YWxRID8gayAqIC0xIDoga1xuICAgICAgc2VsLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uIChkLCBpKSB7XG4gICAgICAgIHZhclxuICAgICAgICB4ID0gaG9yaXpvbnRhbFEgPyAgZGlzdCAqIGsgOiAwLFxuICAgICAgICB5ID0gIWhvcml6b250YWxRID8gZGlzdCAqIGsgOiAwLFxuICAgICAgICB0ID0gJ3RyYW5zbGF0ZSgnK3grJywnK3krJyknXG4gICAgICAgIHJldHVybiB0XG4gICAgICB9KVxuICAgIH1cbiAgICB2YXIgdGlja0V4aXRBbmltYXRpb24gPSBmdW5jdGlvbihzZWwpIHtcbiAgICAgIHZhciBtdCA9IHNjYWxlKHNlbC5kYXR1bSgpKSxcbiAgICAgIGRpc3QgPSBzY2FsZShleHRlbnRbMV0pICogMixcbiAgICAgIGsgPSAobXQgPCBleHRlbnRbMV0gLyAyKSA/IDEgOiAtMVxuICAgICAgayA9IGhvcml6b250YWxRID8gayAqIC0xIDoga1xuICAgICAgc2VsLnRyYW5zaXRpb24oKS5kdXJhdGlvbih0cmFuc2l0aW9uRHVyYXRpb24pLmVhc2UoZWFzZUZ1bmMpXG4gICAgICAuc3R5bGUoJ29wYWNpdHknLCAwKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uIChkLCBpKSB7XG4gICAgICAgIHZhclxuXG4gICAgICAgIHggPSBob3Jpem9udGFsUSA/ICBkaXN0ICogayAgOiAwLFxuICAgICAgICB5ID0gIWhvcml6b250YWxRID8gZGlzdCAqIGsgOiAwLFxuICAgICAgICB0ID0gJ3RyYW5zbGF0ZSgnK3grJywnK3krJyknXG4gICAgICAgIHJldHVybiB0XG4gICAgICB9KS5yZW1vdmUoKVxuICAgIH1cblxuICAgIGlmICghY2F0ZWdvcmljYWxRKXtcbiAgICAgIHNwYWNlckZ1bmN0aW9uLmVudGVyRnVuY3Rpb24odGlja0VudGVyQW5pbWF0aW9uKVxuICAgICAgc3BhY2VyRnVuY3Rpb24uZXhpdEZ1bmN0aW9uKHRpY2tFeGl0QW5pbWF0aW9uKVxuICAgIH1cblxuXG5cbiAgICBzcGFjZXJGdW5jdGlvbihjb250YWluZXIsIHRpY2tEYXRhLCAwKVxuXG4gICAgZnVuY3Rpb24gbW92ZVhCeShkLCBpLCBob3Jpem9udGFsUSwgY2F0ZWdvcmljYWxRLCBvYmplY3RTaXplKXtcbiAgICAgIHJldHVybiAoaG9yaXpvbnRhbFEpXG4gICAgICA/IChjYXRlZ29yaWNhbFEpXG4gICAgICAgID8gb2JqZWN0U2l6ZSAvIDJcbiAgICAgICAgOiAwXG4gICAgICA6IDBcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb3ZlWUJ5KGQsIGksIHZlcnRpY2FsUSwgY2F0ZWdvcmljYWxRLCBvYmplY3RTaXplKXtcbiAgICAgIHJldHVybiAodmVydGljYWxRKVxuICAgICAgPyAoY2F0ZWdvcmljYWxRKVxuICAgICAgICA/IG9iamVjdFNpemUgLyAyXG4gICAgICAgIDogMFxuICAgICAgOiAwXG4gICAgfVxuXG4gICAgLy8gbWFrZU5lc3RlZEdyb3Vwcyhjb250YWluZXIsIHRpY2tEYXRhLCBob3Jpem9udGFsUSwgc2NhbGUsIChjYXRlZ29yaWNhbFE/J2NhdGVnb3J5Jzonc2NhbGUnKSxvYmpDbGFzcywgb2JqZWN0U2l6ZSwgc3BhY2VyU2l6ZSwgdW5kZWZpbmVkLCB0cmFuc2l0aW9uRHVyYXRpb24sIGVhc2VGdW5jKVxuXG4gICAgdmFyIHRpY2tzID0gY29udGFpbmVyLnNlbGVjdEFsbCgnZzpub3QoLnRvLXJlbW92ZSkuJytvYmpDbGFzcykuZWFjaChmdW5jdGlvbihkLCBpKXtcbiAgICAgIHZhciB0aGF0ID0gZDMuc2VsZWN0KHRoaXMpLnN0eWxlKCdvcGFjaXR5JywgMSlcblxuICAgICAgdmFyIHRpY2sgPSBzYWZlU2VsZWN0KHRoYXQsICdsaW5lJywgaHlwZW5hdGUobmFtZXNwYWNlLCd0aWNrJykpXG4gICAgICAuYXR0cihcIngxXCIsIDApXG4gICAgICAuYXR0cihcIngyXCIsIGhvcml6b250YWxRID8gMCA6IG9yaWVudCA9PSBcImxlZnRcIiA/IC10aWNrTGVuZ3RoIDogdGlja0xlbmd0aClcbiAgICAgIC5hdHRyKFwieTFcIiwgMClcbiAgICAgIC5hdHRyKCd5MicsICB2ZXJ0aWNhbFEgPyAwIDogb3JpZW50ID09IFwidG9wXCIgPyAtdGlja0xlbmd0aCA6IHRpY2tMZW5ndGgpXG4gICAgICAuYXR0cignc3Ryb2tlJywgdGlja1N0cm9rZSlcbiAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCB0aWNrU3Ryb2tlV2lkdGgpXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24oZCwgaSkge1xuICAgICAgICB2YXJcbiAgICAgICAgeCA9IG1vdmVYQnkoZCwgaSwgaG9yaXpvbnRhbFEsIGNhdGVnb3JpY2FsUSwgb2JqZWN0U2l6ZSksXG4gICAgICAgIHkgPSBtb3ZlWUJ5KGQsIGksIHZlcnRpY2FsUSwgY2F0ZWdvcmljYWxRLCBvYmplY3RTaXplKSxcbiAgICAgICAgdCA9ICd0cmFuc2xhdGUoJyt4KycsJyt5KycpJ1xuICAgICAgICByZXR1cm4gdFxuICAgICAgfSlcblxuICAgICAgdmFyIGxhYmVsID0gc2FmZVNlbGVjdCh0aGF0LCAndGV4dCcsIGh5cGVuYXRlKG5hbWVzcGFjZSwnbGFiZWwnKSlcbiAgICAgIC50ZXh0KGZ1bmN0aW9uKGQsIGkpeyByZXR1cm4gdHlwZW9mIGQgPT0gJ251bWJlcicgPyByb3VuZChkLCByb3VuZFRvKSA6IGR9KVxuICAgICAgLmF0dHIoJ2ZvbnQtc2l6ZScsIHRpY2tMYWJlbEZvbnRTaXplKVxuICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgdGlja0xhYmVsVGV4dEFuY2hvcilcblxuICAgICAgdHJ1bmNhdGVUZXh0KGxhYmVsLCBsYWJlbC50ZXh0KCksIG9yaWVudCwgdGlja0xlbmd0aCwgaG9yaXpvbnRhbFEgPyBzcGFjZVkgOiBzcGFjZVgsIG92ZXJmbG93USlcblxuICAgICAgbGFiZWwuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24oZCwgaSkge1xuICAgICAgICB2YXJcbiAgICAgICAgcmVjdCA9IGQzLnNlbGVjdCh0aGlzKS5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgIHggPSBtb3ZlWEJ5KGQsIGksIGhvcml6b250YWxRLCBjYXRlZ29yaWNhbFEsIG9iamVjdFNpemUpLFxuICAgICAgICB5ID0gbW92ZVlCeShkLCBpLCB2ZXJ0aWNhbFEsIGNhdGVnb3JpY2FsUSwgb2JqZWN0U2l6ZSlcbiAgICAgICAgLy8gb24gcmVjYWxsLCByZWN0IGNoYW5nZXMgYmVjYXVzZSBvZiByb3RhdGlvbiBzbyBuZWVkIE1hdGgubWluKHJlY3QuaGVpZ2h0LCByZWN0LndpZHRoKVxuXG4gICAgICAgIGlmIChvcmllbnQgPT0gJ3RvcCcpIHt5ID0gLXRpY2tMZW5ndGg7IHktPU1hdGgubWF4KHJlY3QuaGVpZ2h0LCByZWN0LndpZHRoKTt4IC09IE1hdGgubWluKHJlY3QuaGVpZ2h0LCByZWN0LndpZHRoKSAqIDAuMjV9XG4gICAgICAgIGlmIChvcmllbnQgPT0gJ2JvdHRvbScpIHt5ID0gdGlja0xlbmd0aDsgeCArPSBNYXRoLm1pbihyZWN0LmhlaWdodCwgcmVjdC53aWR0aCkgKiAwLjI1fVxuICAgICAgICBpZiAob3JpZW50ID09ICdsZWZ0Jykge3ggLT0gdGlja0xlbmd0aDsgIHkgKz0gcmVjdC5oZWlnaHQgKiAwLjU7IHktPSByZWN0LmhlaWdodC80IH1cbiAgICAgICAgaWYgKG9yaWVudCA9PSAncmlnaHQnKSB7eCArPSB0aWNrTGVuZ3RoOyB5ICs9IHJlY3QuaGVpZ2h0ICogMC41OyB5LT0gcmVjdC5oZWlnaHQvNH1cblxuICAgICAgICB2YXJcbiAgICAgICAgdCA9ICd0cmFuc2xhdGUoJyt4KycsJyt5KycpJyxcbiAgICAgICAgciA9ICdyb3RhdGUoJyt0aWNrTGFiZWxSb3RhdGlvbisnKSdcbiAgICAgICAgcmV0dXJuIHQgKyByXG4gICAgICB9KVxuXG5cbiAgICAgICBpZiAoZ3VpZGVMaW5lc1EpIHtcbiAgICAgICAgIHZhciBnbGluZSA9IHNhZmVTZWxlY3QodGhhdCwgJ2xpbmUnLCBoeXBlbmF0ZShuYW1lc3BhY2UsICdndWlkZWxpbmUnKSlcbiAgICAgICAgIC50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlKGVhc2VGdW5jKVxuICAgICAgICAgLmF0dHIoXCJ4MVwiLCAwKVxuICAgICAgICAgLmF0dHIoXCJ4MlwiLCBob3Jpem9udGFsUSA/IDAgOiBvcmllbnQgPT0gXCJsZWZ0XCIgPyBndWlkZWxpbmVTcGFjZSA6IC1ndWlkZWxpbmVTcGFjZSlcbiAgICAgICAgIC5hdHRyKFwieTFcIiwgMClcbiAgICAgICAgIC5hdHRyKCd5MicsICB2ZXJ0aWNhbFEgPyAwIDogb3JpZW50ID09IFwidG9wXCIgPyBndWlkZWxpbmVTcGFjZSA6IC1ndWlkZWxpbmVTcGFjZSlcbiAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbihkLCBpKSB7XG4gICAgICAgICAgIHZhclxuICAgICAgICAgICB4ID0gbW92ZVhCeShkLCBpLCBob3Jpem9udGFsUSwgY2F0ZWdvcmljYWxRLCBvYmplY3RTaXplKSxcbiAgICAgICAgICAgeSA9IG1vdmVZQnkoZCwgaSwgdmVydGljYWxRLCBjYXRlZ29yaWNhbFEsIG9iamVjdFNpemUpLFxuICAgICAgICAgICB0ID0gJ3RyYW5zbGF0ZSgnK3grJywnK3krJyknXG4gICAgICAgICAgIHJldHVybiB0XG4gICAgICAgICB9KVxuICAgICAgIH1cblxuICAgIH0pXG5cbiAgICBpZiAoZ3VpZGVMaW5lc1EpIHtcbiAgICAgIGNvbnRhaW5lci5zZWxlY3RBbGwoJy4nK2h5cGVuYXRlKG5hbWVzcGFjZSwnZ3VpZGVsaW5lJykpXG4gICAgICAuYXR0cignc3Ryb2tlJywgZnVuY3Rpb24oZCwgaSl7XG4gICAgICAgIGlmIChpICUgMiA9PSAwKSB7IHJldHVybiBtb2RpZnlIZXhpZGVjaW1hbENvbG9yTHVtaW5hbmNlKGd1aWRlTGluZVN0cm9rZSwgMC44KSB9XG4gICAgICAgIHJldHVybiBndWlkZUxpbmVTdHJva2VcbiAgICAgIH0pXG4gICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgZnVuY3Rpb24oZCwgaSl7XG4gICAgICAgIGlmIChpICUgMiA9PSAwKSB7IHJldHVybiBndWlkZUxpbmVTdHJva2VXaWR0aCAqMC44fVxuICAgICAgICByZXR1cm4gZ3VpZGVMaW5lU3Ryb2tlV2lkdGhcbiAgICAgIH0pXG4gICAgfVxuXG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgKiogTWFrZSB0aGUgbGluZSBvZiB0aGUgYXhpc1xuICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICB2YXIgbGluZSA9IHNhZmVTZWxlY3Qoc2VsZWN0aW9uLCAncGF0aCcsIGh5cGVuYXRlKG5hbWVzcGFjZSwnbGluZScpKVxuICAgIC8vIC5hdHRyKCd4MScsIDApXG4gICAgLy8gLmF0dHIoJ3gyJywgaG9yaXpvbnRhbFEgPyBzcGFjZVggOiAwKVxuICAgIC8vIC5hdHRyKCd5MScsIDApXG4gICAgLy8gLmF0dHIoJ3kyJywgaG9yaXpvbnRhbFEgPyAwIDogc3BhY2VZKVxuICAgIC5hdHRyKCdkJyxcbiAgICAgIGhvcml6b250YWxRXG4gICAgICA/ICdNIDAsMCBIJyArIHNwYWNlWCArICcsMCdcbiAgICAgIDogJ00gMCwwIFYgMCwnICsgc3BhY2VZXG4gICAgKVxuICAgIC5hdHRyKCdzdHJva2UnLCBsaW5lU3Ryb2tlKVxuICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCBsaW5lU3Ryb2tlV2lkdGgpXG4gICAgLmNsYXNzZWQoJ2F4aXMtbGluZScsIHRydWUpXG5cblxuICB9XG4gIHJldHVybiBheGlzXG59XG4iLCJpbXBvcnQge21vZGlmeUhleGlkZWNpbWFsQ29sb3JMdW1pbmFuY2V9IGZyb20gJy4vaGVscGVycyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNvbG9yRnVuY3Rpb25cbiAqIEBjb25zdHJ1Y3RvciBjb2xvckZ1bmN0aW9uXG4gKiBAbmFtZXNwYWNlIGNvbG9yRnVuY3Rpb25cbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gY29sb3JGdW5jdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sb3JGdW5jdGlvbigpIHtcbiAgdmFyXG4gIC8qKlxuICAqIERlZmF1bHQgY29sb3JzIHRvIHVzZVxuICAqIEBwYXJhbSB7bnVtYmVyW119IFtjb2xvcnM9W1wiIzJjN2JiNlwiLCBcIiMwMGE2Y2FcIiwgXCIjMDBjY2JjXCIsIFwiIzkwZWI5ZFwiLCBcIiNmZmZmOGNcIiwgXCIjZjlkMDU3XCIsIFwiI2YyOWUyZVwiLCBcIiNlNzY4MThcIiwgXCIjZDcxOTFjXCJdXVxuICAqIEBtZW1iZXJvZiBjb2xvckZ1bmN0aW9uI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBjb2xvcnMgPSBbXCIjMmM3YmI2XCIsIFwiIzAwYTZjYVwiLCBcIiMwMGNjYmNcIiwgXCIjOTBlYjlkXCIsIFwiI2ZmZmY4Y1wiLCBcIiNmOWQwNTdcIiwgXCIjZjI5ZTJlXCIsIFwiI2U3NjgxOFwiLCBcIiNkNzE5MWNcIl0sXG4gIC8qKlxuICAqIEludGVycG9sYXRvciBmb3IgY29sb3JzXG4gICogQHBhcmFtIHtkMy5pbnRlcnBvbGF0aW9ufSBbaW50ZXJwb2xhdGlvbj1kMy5pbnRlcnBvbGF0ZVJnYl1cbiAgKiBAbWVtYmVyb2YgY29sb3JGdW5jdGlvbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgaW50ZXJwb2xhdGlvbiA9IGQzLmludGVycG9sYXRlUmdiLFxuICAvKipcbiAgKiBGdW5jdGlvbiBmb3IgbW9kaWZ5aW5nIGNvbG9yIGx1bWluYW5jZVxuICAqIEBwYXJhbSB7ZnVuY3Rpb259IFttb2RpZnlPcGFjaXR5PW1vZGlmeUhleGlkZWNpbWFsQ29sb3JMdW1pbmFuY2VdXG4gICogQG1lbWJlcm9mIGNvbG9yRnVuY3Rpb24jXG4gICogQHByb3BlcnR5XG4gICovXG4gIG1vZGlmeU9wYWNpdHkgPSBtb2RpZnlIZXhpZGVjaW1hbENvbG9yTHVtaW5hbmNlLFxuICAvKipcbiAgKiBIb3cgdG8gbW9kaWZ5IGNvbG9yIGZvciBzdHJva2VcbiAgKiBAcGFyYW0ge251bWJlcn0gW3N0cm9rZU9wYWNpdHk9MF1cbiAgKiBAbWVtYmVyb2YgY29sb3JGdW5jdGlvbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc3Ryb2tlT3BhY2l0eSA9IDAsXG4gIC8qKlxuICAqIEhvdyB0byBtb2RpZnkgY29sb3IgZm9yIGZpbGxcbiAgKiBAcGFyYW0ge251bWJlcn0gW2ZpbGxPcGFjaXR5PTAuNF1cbiAgKiBAbWVtYmVyb2YgY29sb3JGdW5jdGlvbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZmlsbE9wYWNpdHkgPSAwLjQsXG4gIC8qKlxuICAqIEhvdyB0byBkZXRlcm1pbmUgdGhlIGNvbG9yIHRvIHVzZVxuICAqIEBwYXJhbSB7c3RyaW5nfSBbY29sb3JCeT0naW5kZXgnXVxuICAqIEBtZW1iZXJvZiBjb2xvckZ1bmN0aW9uI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBjb2xvckJ5ID0gJ2luZGV4JyxcbiAgLyoqXG4gICogU2V0cyB0aGUgc2NhbGUgZm9yIGludGVycG9sYXRpbmcgdGhlIGNvbG9yc1xuICAqIEBwYXJhbSB7bnVtYmVyW119IFtkYXRhRXh0ZW50PVswLCBjb2xvcnMubGVuZ3RoIC0gMV1dXG4gICogQG1lbWJlcm9mIGNvbG9yRnVuY3Rpb24jXG4gICogQHByb3BlcnR5XG4gICovXG4gIGRhdGFFeHRlbnQgPSBbMCwgY29sb3JzLmxlbmd0aCAtIDFdLFxuICAvKipcbiAgKiBFeHRyYWN0cyB0aGUgdmFsdWUgdG8gY29sb3IgYnlcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbdmFsdWVFeHRyYWN0b3I9ZnVuY3Rpb24oaywgdiwgaSkge3JldHVybiB2fV1cbiAgKiBAbWVtYmVyb2YgY29sb3JGdW5jdGlvbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdmFsdWVFeHRyYWN0b3IgPSBmdW5jdGlvbihrLCB2LCBpKSB7cmV0dXJuIHZ9LFxuICAvKipcbiAgKiBTY2FsZSBmb3IgaW50ZXJwb2xhdGluZyB0aGUgY29sb3JzXG4gICogQHBhcmFtIHtkMy5zY2FsZX0gW3NjYWxlPWQzLnNjYWxlTGluZWFyKCldXG4gICogQG1lbWJlcm9mIGNvbG9yRnVuY3Rpb24jXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKVxuICAuaW50ZXJwb2xhdGUoaW50ZXJwb2xhdGlvbikuZG9tYWluKGRhdGFFeHRlbnQpLnJhbmdlKGNvbG9ycyksXG4gIGhlbHBlclNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKVxuXG4gIC8vIHZhciBoID0geCA9PiAnIycgKyB4Lm1hdGNoKC9cXGQrL2cpLm1hcCh5ID0geiA9PiAoKCt6IDwgMTYpPycwJzonJykgKyAoK3opLnRvU3RyaW5nKDE2KSkuam9pbignJyk7XG4gIHZhciBoID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBcIiNcIiArIHgubWF0Y2goL1xcZCsvZykubWFwKFxuICAgICAgZnVuY3Rpb24oeSwgaSkge1xuICAgICAgICByZXR1cm4gICgoK3kgPCAxNik/JzAnOicnKSArICgreSkudG9TdHJpbmcoMTYpXG4gICAgICB9KS5qb2luKCcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGRlZmF1bHQgY29sb3JzXG4gICAqIChzZWUge0BsaW5rIGNvbG9yRnVuY3Rpb24jY29sb3JzfSlcbiAgICogQHBhcmFtIHtudW1iZXJbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2NvbG9yRnVuY3Rpb24gfCBudW1iZXJbXX1cbiAgICogQG1lbWJlcm9mIGNvbG9yRnVuY3Rpb25cbiAgICogQHByb3BlcnR5XG4gICAqL1xuICBjb2xvckZ1bmN0aW9uLmNvbG9ycyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgID9cbiAgICAgIChcbiAgICAgICAgY29sb3JzID0gXyxcbiAgICAgICAgc2NhbGUucmFuZ2UoY29sb3JzKSxcbiAgICAgICAgY29sb3JGdW5jdGlvblxuICAgICAgKVxuICAgIDogY29sb3JzO1xuICB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBmdW5jdGlvbiBmb3IgaW50ZXJwb2xhdGluZyB0aGUgY29sb3JzXG4gICAqIChzZWUge0BsaW5rIGNvbG9yRnVuY3Rpb24jaW50ZXJwb2xhdGlvbn0pXG4gICAqIEBwYXJhbSB7ZDMuaW50ZXJwb2xhdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2NvbG9yRnVuY3Rpb24gfCBkMy5pbnRlcnBvbGF0aW9ufVxuICAgKiBAbWVtYmVyb2YgY29sb3JGdW5jdGlvblxuICAgKiBAcHJvcGVydHlcbiAgICovXG4gIGNvbG9yRnVuY3Rpb24uaW50ZXJwb2xhdGlvbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgID9cbiAgICAoXG4gICAgICBpbnRlcnBvbGF0aW9uID0gXyxcbiAgICAgIHNjYWxlLmludGVycG9sYXRlKGludGVycG9sYXRpb24pLnJhbmdlKGNvbG9ycyksXG4gICAgICBjb2xvckZ1bmN0aW9uXG4gICAgKVxuICAgIDogaW50ZXJwb2xhdGlvbjtcbiAgfTtcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgdmFsdWVzIGZvciB0aGUgc2NhbGUgd2hpY2ggdHJhbnNmb3JtcyB0aGUgdmFsdWUgdG8gYSBjb2xvclxuICAgKiAoc2VlIHtAbGluayBjb2xvckZ1bmN0aW9uI2RhdGFFeHRlbnR9KVxuICAgKiBAcGFyYW0ge251bWJlcltdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Y29sb3JGdW5jdGlvbiB8IG51bWJlcltdfVxuICAgKiBAbWVtYmVyb2YgY29sb3JGdW5jdGlvblxuICAgKiBAcHJvcGVydHlcbiAgICovXG4gIGNvbG9yRnVuY3Rpb24uZGF0YUV4dGVudCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgID8gKFxuICAgICAgICBkYXRhRXh0ZW50ID0gXyxcbiAgICAgICAgc2NhbGUuZG9tYWluKGRhdGFFeHRlbnQpLmludGVycG9sYXRlKHNjYWxlLmludGVycG9sYXRlKCkpLFxuICAgICAgICBjb2xvckZ1bmN0aW9uXG4gICAgICApXG4gICAgOiBkYXRhRXh0ZW50O1xuICB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSB2dGhlIHNjYWxlIHdoaWNoIHRyYW5zZm9ybXMgdGhlIHZhbHVlIHRvIGEgY29sb3JcbiAgICogKHNlZSB7QGxpbmsgY29sb3JGdW5jdGlvbiNzY2FsZX0pXG4gICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtjb2xvckZ1bmN0aW9uIHwgZDMuc2NhbGV9XG4gICAqIEBtZW1iZXJvZiBjb2xvckZ1bmN0aW9uXG4gICAqIEBwcm9wZXJ0eVxuICAgKi9cbiAgY29sb3JGdW5jdGlvbi5zY2FsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgID8gKFxuICAgICAgICBfID0gXy5kb21haW4oc2NhbGUuZG9tYWluKCkpLmludGVycG9sYXRlKHNjYWxlLmludGVycG9sYXRlKCkpLnJhbmdlKHNjYWxlLnJhbmdlKCkpLFxuICAgICAgICBzY2FsZSA9IF8sXG4gICAgICAgIGNvbG9yRnVuY3Rpb25cbiAgICAgIClcbiAgICA6IHNjYWxlO1xuICB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBmdW5jdGlvbiBmb3IgbW9kaWZ5IG9wYWNpdHlcbiAgICogKHNlZSB7QGxpbmsgY29sb3JGdW5jdGlvbiNtb2RpZnlPcGFjaXR5fSlcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2NvbG9yRnVuY3Rpb24gfCBmdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIGNvbG9yRnVuY3Rpb25cbiAgICogQHByb3BlcnR5XG4gICAqL1xuICBjb2xvckZ1bmN0aW9uLm1vZGlmeU9wYWNpdHkgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG1vZGlmeU9wYWNpdHkgPSBfLCBjb2xvckZ1bmN0aW9uKSA6IG1vZGlmeU9wYWNpdHk7IH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHZhbHVlIHRvIG1vZGlmeSB0aGUgY29sb3IgZm9yIHRoZSBzdHJva2UgdmlhIHtAbGluayBjb2xvckZ1bmN0aW9uI21vZGlmeU9wYWNpdHl9XG4gICAqIChzZWUge0BsaW5rIGNvbG9yRnVuY3Rpb24jc3Ryb2tlT3BhY2l0eX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Y29sb3JGdW5jdGlvbiB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGNvbG9yRnVuY3Rpb25cbiAgICogQHByb3BlcnR5XG4gICAqL1xuICBjb2xvckZ1bmN0aW9uLnN0cm9rZU9wYWNpdHkgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN0cm9rZU9wYWNpdHkgPSBfLCBjb2xvckZ1bmN0aW9uKSA6IHN0cm9rZU9wYWNpdHk7IH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHZhbHVlIHRvIG1vZGlmeSB0aGUgY29sb3IgZm9yIHRoZSBzdHJva2UgdmlhIHtAbGluayBjb2xvckZ1bmN0aW9uI2ZpbGxPcGFjaXR5fVxuICAgKiAoc2VlIHtAbGluayBjb2xvckZ1bmN0aW9uI2ZpbGxPcGFjaXR5fSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtjb2xvckZ1bmN0aW9uIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgY29sb3JGdW5jdGlvblxuICAgKiBAcHJvcGVydHlcbiAgICovXG4gIGNvbG9yRnVuY3Rpb24uZmlsbE9wYWNpdHkgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGZpbGxPcGFjaXR5ID0gXywgY29sb3JGdW5jdGlvbikgOiBmaWxsT3BhY2l0eTsgfTtcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgdmFsdWUgdG8gY29sb3JCeVxuICAgKiAoc2VlIHtAbGluayBjb2xvckZ1bmN0aW9uI2NvbG9yQnl9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2NvbG9yRnVuY3Rpb24gfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBjb2xvckZ1bmN0aW9uXG4gICAqIEBwcm9wZXJ0eVxuICAgKi9cbiAgY29sb3JGdW5jdGlvbi5jb2xvckJ5ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjb2xvckJ5ID0gXywgY29sb3JGdW5jdGlvbikgOiBjb2xvckJ5OyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSB2YWx1ZSBvZiB2YWx1ZUV4dHJhY3RvclxuICAgKiAoc2VlIHtAbGluayBjb2xvckZ1bmN0aW9uI3ZhbHVlRXh0cmFjdG9yfSlcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2NvbG9yRnVuY3Rpb24gfCBmdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIGNvbG9yRnVuY3Rpb25cbiAgICogQHByb3BlcnR5XG4gICAqL1xuICBjb2xvckZ1bmN0aW9uLnZhbHVlRXh0cmFjdG9yID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2YWx1ZUV4dHJhY3RvciA9IF8sIGNvbG9yRnVuY3Rpb24pIDogdmFsdWVFeHRyYWN0b3I7IH07XG5cbiAgZnVuY3Rpb24gY29sb3JGdW5jdGlvbihrZXksIHZhbHVlLCBpbmRleCwgdHlwZSwgaG92ZXJRKSB7XG4gICAgdmFyIGMsXG4gICAgb3BhYyA9IHR5cGUgPT0gXCJmaWxsXCIgPyBmaWxsT3BhY2l0eSA6IHN0cm9rZU9wYWNpdHk7XG4gICAgdXBkYXRlU2NhbGUoKVxuXG4gICAgaWYgKGNvbG9yQnkgPT0gXCJpbmRleFwiKSB7XG4gICAgICBjID0gKHR5cGUgIT0gdW5kZWZpbmVkKSA/IG1vZGlmeU9wYWNpdHkoaChzY2FsZShpbmRleCkpLCBvcGFjKSA6IGgoc2NhbGUoaW5kZXgpKVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdiA9IHZhbHVlRXh0cmFjdG9yKGtleSwgdmFsdWUsIGluZGV4KTtcbiAgICAgIGMgPSAodHlwZSAhPSB1bmRlZmluZWQpID8gbW9kaWZ5T3BhY2l0eShoKHNjYWxlKHYpKSwgb3BhYykgOiBoKHNjYWxlKHYpKVxuICAgIH1cbiAgICByZXR1cm4gY1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlU2NhbGUoKXtcbiAgICBoZWxwZXJTY2FsZS5kb21haW4oWzAsIGNvbG9ycy5sZW5ndGhdKS5yYW5nZShkYXRhRXh0ZW50KVxuICAgIHZhciBhID0gQXJyYXkoY29sb3JzLmxlbmd0aCkuZmlsbCgwKS5tYXAoZnVuY3Rpb24oZCwgaSl7IHJldHVybiBoZWxwZXJTY2FsZShpKSB9KVxuICAgIHNjYWxlLmRvbWFpbihhKVxuICB9XG5cbiAgcmV0dXJuIGNvbG9yRnVuY3Rpb25cbn1cbiIsImltcG9ydCB7c2FmZVNlbGVjdCwgcm91bmR9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQge2xvZywgd2FybiwgaW5mbywgZXJyb3IsIGNvbnNvbGVHcm91cCwgY29uc29sZUdyb3VwRW5kfSBmcm9tICcuL3V0aWxzJztcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE9PTFRJUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKipcbiAqIFByb2R1Y2VzIGEgZnVuY3Rpb24gZm9yIGhhbmRsaW5nIHRoZSB0b29sdGlwXG4gKlxuICoge0BsaW5rIGh0dHBzOi8vc3VtbmV1cm9uLmdpdGxhYi5pby9kM3NtL2RlbW9zL3Rvb2x0aXAtZGVzaWduL2luZGV4Lmh0bWwgRGVtb31cbiAqIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBzZWxlY3Rpb25cbiAqIEByZXR1cm5zIHt0b29sdGlwfVxuICogQG5hbWVzcGFjZSB0b29sdGlwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b29sdGlwKCBzZWxlY3Rpb24gKSB7XG5cbiAgdmFyXG4gIGtleXMsXG4gIHZhbHVlcyxcbiAgaGVhZGVyLFxuICBkYXRhLFxuICBzZWxlY3Rpb24sXG4gIHRhcmdldENsYXNzXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBrZXlzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgdG9vbHRpcC5cbiAgICogSWYgbm90IHNldCwgdXNlcyBkMy5rZXlzKGRhdGFba2V5XSlcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Rvb2x0aXAgfCBzdHJpbmdbXX1cbiAgICogQG1lbWJlcm9mIHRvb2x0aXBcbiAgICovXG4gIHRvb2x0aXAua2V5cyA9IGZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGtleXMgPSBfLCB0b29sdGlwKSA6IGtleXN9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHZhbHVlcyB0byBiZSBkaXNwbGF5ZWQgbmV4dCB0byB0aGUga2V5cy5cbiAgICogSWYgbm90IHNldCwgdXNlcyBkYXRhW2tleV1ba2V5c1tpXV0uXG4gICAqIElmIGEgZnVuY3Rpb24sIGdldHMgcGFzc2VkIGN1cnJlbnREYXRhIChkYXRhW2tleV0pIGFuZCBrZXlzW2ldLlxuICAgKiBAcGFyYW0geypbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Rvb2x0aXAgfCAqW119XG4gICAqIEBtZW1iZXJvZiB0b29sdGlwXG4gICAqL1xuICB0b29sdGlwLnZhbHVlcyA9IGZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZhbHVlcyA9IF8sIHRvb2x0aXApIDogdmFsdWVzfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBoZWFkZXIgdG8gYmUgZGlzcGxheWVkIGluIHRoZSB0b29sdGlwLlxuICAgKiBJZiBub3Qgc2V0LCB1c2VzIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge3Rvb2x0aXAgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiB0b29sdGlwXG4gICAqL1xuICB0b29sdGlwLmhlYWRlciA9IGZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGhlYWRlciA9IF8sIHRvb2x0aXApIDogaGVhZGVyfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBkYXRhIChvdmVyIHRoZSBzZWxlY3Rpb24pIHRvIGJlIHVzZWQgZm9yIHRoZSB0b29sdGlwXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dG9vbHRpcCB8IE9iamVjdH1cbiAgICogQG1lbWJlcm9mIHRvb2x0aXBcbiAgICovXG4gIHRvb2x0aXAuZGF0YSA9IGZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRhdGEgPSBfLCB0b29sdGlwKSA6IGRhdGF9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNlbGVjdGlvbiBmb3IgdGhlIHRvb2x0aXAgdG8gYmUgYXBwbGllZCBvblxuICAgKiBAcGFyYW0ge2QzLnNlbGVjdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Rvb2x0aXAgfCBkMy5zZWxlY3Rpb259XG4gICAqIEBtZW1iZXJvZiB0b29sdGlwXG4gICAqL1xuICB0b29sdGlwLnNlbGVjdGlvbiA9IGZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNlbGVjdGlvbiA9IF8sIHRvb2x0aXApIDogc2VsZWN0aW9ufTtcblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdGFyZ2V0Q2xhc3MgZm9yIHRoZSB0b29sdGlwIHRvIGJlIGFwcGxpZWQgb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt0b29sdGlwIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgdG9vbHRpcFxuICAgKi9cbiAgdG9vbHRpcC50YXJnZXRDbGFzcyA9IGZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRhcmdldENsYXNzID0gXywgdG9vbHRpcCkgOiB0YXJnZXRDbGFzc307XG5cblxuICAvKipcbiAgICogQmluZCwgdmlhIHNlbGVjdGlvbi5vbigpLCB0aGUgbW91c2Vtb3ZlIGFuZCBtb3VzZW91dCBldmVudHNcbiAgICogQHJldHVybnMgdW5kZWZpbmVkXG4gICAqL1xuICBmdW5jdGlvbiB0b29sdGlwKCApIHtcbiAgICBzZWxlY3Rpb24ub24oJ21vdXNlb3ZlcicsIG1vdXNlbW92ZSlcbiAgICBzZWxlY3Rpb24ub24oJ21vdXNlbW92ZScsIG1vdXNlbW92ZSlcbiAgICBzZWxlY3Rpb24ub24oJ21vdXNlb3V0JywgZnVuY3Rpb24oKXsgZDMuc2VsZWN0QWxsKFwiLmQzc20tdG9vbHRpcFwiKS5yZW1vdmUoKX0pXG4gIH1cblxuXG4gIC8qKlxuICAgKiBQcm9kdWNlcyB0aGUgdG9vbHRpcCBvbiBtb3VzZW1vdmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBvZiB0aGUgb2JqZWN0IHRhcmdldGVkIGJ5IHRoZSBtb3VzZW1vdmVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGkgKGluZGV4KSBvZiB0aGUgb2JqZWN0IHRhcmdldGVkIGJ5IG1vdXNlbW92ZVxuICAgKiBAbWVtYmVyb2YgdG9vbHRpcFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZnVuY3Rpb24gbW91c2Vtb3ZlKGtleSwgaSkge1xuICAgIGNvbnNvbGVHcm91cCgnZDNzbS10b29sdGlwJylcbiAgICB2YXIgY3VycmVudERhdGEgPSBkYXRhW2tleV1cblxuICAgIHZhciBbeCwgeV0gPSBkMy5tb3VzZShkMy5zZWxlY3QoXCJodG1sXCIpLm5vZGUoKSlcbiAgICBsb2coJ3Rvb2x0aXAnLCAnbW91c2Vtb3ZlIGRldGVjdGVkJyx7a2V5OiBrZXksIGluZGV4OiBpLCB4OngsIHk6eX0pXG4gICAgbG9nKCd0b29sdGlwJywgJ2N1cnJlbnQgZGF0YScsIGN1cnJlbnREYXRhKVxuXG4gICAgdmFyIGRpdiA9IHNhZmVTZWxlY3QoZDMuc2VsZWN0KCdodG1sJyksICd0b29sdGlwJywgJ2Qzc20tdG9vbHRpcCcpXG4gICAgLmNsYXNzZWQoJ2NhcmQnLCB0cnVlKVxuICAgIC5zdHlsZSgnbWF4LXdpZHRoJywgJzMwMHB4JylcbiAgICAuc3R5bGUoJ2JhY2tncm91bmQtY29sb3InLCBcIiMyMTI1MjlcIilcbiAgICAuc3R5bGUoJ2NvbG9yJywgJ3doaXRlJylcblxuXG5cbiAgICB2YXIgY2FyZEJvZHkgPSBzYWZlU2VsZWN0KGRpdiwgJ2RpdicsICdjYXJkLWJvZHknKVxuICAgIHZhciBjYXJkVGl0bGUgPSBzYWZlU2VsZWN0KGNhcmRCb2R5LCAnaDUnLCAnY2FyZC10aXRsZScpXG4gICAgLnRleHQoaGVhZGVyID09IHVuZGVmaW5lZCA/IGtleSA6IHR5cGVvZiBoZWFkZXIgPT0gJ2Z1bmN0aW9uJyA/IGhlYWRlcihrZXksIGkpIDogaGVhZGVyKVxuICAgIC5zdHlsZSgnY29sb3InLCAnY3lhbicpXG5cblxuICAgIHZhciB0YWJsZSA9IHNhZmVTZWxlY3QoY2FyZEJvZHksICd0YWJsZScsICd0YWJsZScpLmNsYXNzZWQoJ3RhYmxlLWRhcmsnLCB0cnVlKVxuICAgIHZhciB0Qm9keSA9IHNhZmVTZWxlY3QodGFibGUsICd0Ym9keScpXG5cbiAgICB0Qm9keSA9IHRCb2R5LnNlbGVjdEFsbCgndHInKVxuICAgIHRCb2R5PSB0Qm9keS5kYXRhKGtleXMgPT0gdW5kZWZpbmVkID8gZDMua2V5cyhjdXJyZW50RGF0YSk6IGtleXMpXG5cblxuXG4gICAgdEJvZHkuZXhpdCgpLnJlbW92ZSgpXG5cbiAgICB2YXIgdHIgPSB0Qm9keS5lbnRlcigpLmFwcGVuZCgndHInKVxuXG4gICAgY29uc29sZUdyb3VwKCd0b29sdGlwLXJvd3MnKVxuICAgIHRyLmVhY2goZnVuY3Rpb24oZCwgaSkge1xuXG4gICAgICBkMy5zZWxlY3QodGhpcykuYXBwZW5kKCd0ZCcpLmF0dHIoJ2NsYXNzJywgJ3Rvb2x0aXAta2V5JykudGV4dChmdW5jdGlvbihkLCBpKXtyZXR1cm4gZH0pXG4gICAgICBkMy5zZWxlY3QodGhpcykuYXBwZW5kKCd0ZCcpLmF0dHIoJ2NsYXNzJywgJ3Rvb2x0aXAtdmFsdWUnKVxuICAgICAgLnRleHQoZnVuY3Rpb24oZCwgaSl7XG4gICAgICAgIGxvZygndG9vbHRpcCcsICd0cnlpbmcgdG8gc2V0IHZhbHVlJywge3Jvd0tleTogZCwgcm93SW5kZXg6IGl9KVxuICAgICAgICB2YXIgdiA9IGN1cnJlbnREYXRhW2RdO1xuICAgICAgICBpZiAodmFsdWVzICE9IHVuZGVmaW5lZCkge3YgPSB2YWx1ZXNbaV07IGlmKHR5cGVvZiB2ID09IFwiZnVuY3Rpb25cIikge3YgPSB2KGN1cnJlbnREYXRhLCBkKX19XG4gICAgICAgIHJldHVybiAgdHlwZW9mIHYgPT0gJ251bWJlcicgPyByb3VuZCh2LCA1KSA6IHZcbiAgICAgIH0pXG4gICAgfSlcbiAgICB0Qm9keSA9IHRCb2R5Lm1lcmdlKHRyKVxuXG4gICAgdEJvZHkuc2VsZWN0QWxsKCcudG9vbHRpcC1rZXknKS50ZXh0KGZ1bmN0aW9uKGQsIGkpe3JldHVybiBkfSlcbiAgICB0Qm9keS5zZWxlY3RBbGwoJy50b29sdGlwLXZhbHVlJykudGV4dChmdW5jdGlvbihkLCBpKXtcbiAgICAgIGxvZygndG9vbHRpcCcsICd0cnlpbmcgdG8gc2V0IHZhbHVlJywge3Jvd0tleTogZCwgcm93SW5kZXg6IGl9KVxuICAgICAgdmFyIHYgPSBjdXJyZW50RGF0YVtkXTtcbiAgICAgIGlmICh2YWx1ZXMgIT0gdW5kZWZpbmVkKSB7diA9IHZhbHVlc1tpXTsgaWYodHlwZW9mIHYgPT0gXCJmdW5jdGlvblwiKSB7diA9IHYoY3VycmVudERhdGEsIGQpfX1cbiAgICAgIHJldHVybiAgdHlwZW9mIHYgPT0gJ251bWJlcicgPyByb3VuZCh2LCA1KSA6IHZcbiAgICB9KVxuXG4gICAgY29uc29sZUdyb3VwRW5kKClcbiAgICBjb25zb2xlR3JvdXBFbmQoKVxuXG4gICAgZGl2LnN0eWxlKCdwb3NpdGlvbicpID09IFwicmVsYXRpdmVcIlxuICAgID8gZGl2LnN0eWxlKCdwb3NpdGlvbicsICdhYnNvbHV0ZScpLnN0eWxlKCdsZWZ0JywgeCsxNSsncHgnKS5zdHlsZSgndG9wJywgeSsncHgnKVxuICAgIDogZGl2LnRyYW5zaXRpb24oKS5kdXJhdGlvbigyMDApLmVhc2UoZDMuZWFzZVNpbikuc3R5bGUoJ2xlZnQnLCB4KzE1KydweCcpLnN0eWxlKCd0b3AnLCB5KydweCcpXG4gIH1cblxuICByZXR1cm4gdG9vbHRpcFxufVxuIiwiaW1wb3J0IHtoeXBlbmF0ZSwgc2FmZVNlbGVjdH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7c2V0dXBDb250YWluZXIsIGNhbGN1bGF0ZVdpZHRoT2ZPYmplY3QsIGNhbGN1bGF0ZVdpZHRoT2ZTcGFjZXJ9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHt1bmlxdWUsIGZsYXR0ZW59IGZyb20gJy4vYXJyYXktZnVuY3Rpb25zJztcbmltcG9ydCB7Z3JvdXBpbmdTcGFjZXJ9IGZyb20gJy4vZ3JvdXBpbmctc3BhY2VyJztcbmltcG9ydCB7Y29sb3JGdW5jdGlvbiBhcyBDRn0gZnJvbSAnLi9jb2xvci1mdW5jdGlvbic7XG5pbXBvcnQge3Rvb2x0aXAgYXMgVFRpcH0gZnJvbSAnLi90b29sdGlwJztcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qKlxuICogQ3JlYXRlcyBhIGJhclxuICpcbiAqIHtAbGluayBodHRwczovL3N1bW5ldXJvbi5naXRsYWIuaW8vZDNzbS9kZW1vcy9iYXItY2hhcnQtc2FtZS1kYXRhLWNvbXBsZXgtZ3JvdXBpbmcvaW5kZXguaHRtbCBEZW1vfVxuICogQGNvbnN0cnVjdG9yIGJhclxuICogQHBhcmFtIHtkMy5zZWxlY3Rpb259IHNlbGVjdGlvblxuICogQG5hbWVzcGFjZSBiYXJcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gYmFyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYXIgKCBzZWxlY3Rpb24gKSB7XG4gIC8qXG4gIEFzc3VtZXMgdGhhdCBkYXRhIGlzIGxpc3QgYW4gb2JqZWN0LlxuXG4gIFRoZSBrZXlzIG9mIGRhdGEgd2lsbCBiZSBib3VuZCB0byB0aGUgYmFycy5cbiAgVGhlIHZhbHVlRXh0cmFjdG9yIGZ1bmN0aW9uIHdpbGwgZXh0cmFjdCB0aGUgdmFsdWUgZnJvbSBkYXRhW2tleV0uXG5cbiAgR3JvdXBpbmcgY2FuIGJlIHVzZWQgaWYgZGVzaXJlZC4gSXQgc2hvdWxkIGJlIGFuIGFyYml0cmFyeSBjb21wbGV4IGxpc3Qgd2hlcmVcbiAgdGhlIHZhbHVlcyBhcmUgc3RyaW5ncyBtYXRjaGluZyBrZXlzIGluIGRhdGEuXG4gICovXG4gIHZhclxuICAvKipcbiAgKiBEYXRhIHRvIHBsb3QuIEFzc3VtZWQgdG8gYmUgYSBvYmplY3QsIHdoZXJlIGVhY2gga2V5IGNvcnJlc3BvbmRzIHRvIGEgYmFyXG4gICogKHNlZSB7QGxpbmsgYmFyI2RhdGF9KVxuICAqIEBwYXJhbSB7T2JqZWN0fSBbZGF0YT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZGF0YSxcbiAgLyoqXG4gICogV2hpY2ggZGlyZWN0aW9uIHRvIHJlbmRlciB0aGUgYmFycyBpblxuICAqIChzZWUge0BsaW5rIGJhciNvcmllbnR9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbb3JpZW50PSdob3Jpem9udGFsJ11cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBvcmllbnQ9J2hvcml6b250YWwnLFxuICAvKipcbiAgKiBBbW91bnQgb2YgaG9yaXpvbnRhbCBzcGFjZSAoaW4gcGl4ZWxzKSBhdmFpYmxlIHRvIHJlbmRlciB0aGUgYmFyIGluXG4gICogKHNlZSB7QGxpbmsgYmFyI3NwYWNlWH0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZVg9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNwYWNlWCxcbiAgLyoqXG4gICogQW1vdW50IG9mIHZlcnRpY2FsIHNwYWNlIChpbiBwaXhlbHMpIGF2YWlibGUgdG8gcmVuZGVyIHRoZSBiYXIgaW5cbiAgKiAoc2VlIHtAbGluayBiYXIuc3BhY2VZfSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW3NwYWNlWT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc3BhY2VZLFxuXG4gIC8qKlxuICAqIFdoZXRoZXIgb3Igbm90IHRvIGFsbG93IGJhciB0byByZW5kZXIgZWxlbWVudHMgcGFzcyB0aGUgbWFpbiBzcGF0aWFsIGRpbWVuc2lvblxuICAqIGdpdmVuIHRoZSBvcmllbnRhdGlvbiAoc2VlIHtAbGluayBiYXIjb3JpZW50fSksIHdoZXJlIHtAbGluayBiYXIjb3JpZW50fT1cImhvcml6b250YWxcIlxuICAqIHRoZSBtYWluIGRpbWVuc2lvbiBpcyB7QGxpbmsgYmFyI3NwYWNlWH0gYW5kIHdoZXJlIHtAbGluayBiYXIjb3JpZW50fT1cInZlcnRpY2FsXCJcbiAgKiB0aGUgbWFpbiBkaW1lbnNpb24gaXMge0BsaW5rIGJhciNzcGFjZVl9XG4gICogQHBhcmFtIHtib29sZWFufSBbb3ZlcmZsb3dRPWZhbHNlXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG92ZXJmbG93USA9IGZhbHNlLFxuXG4gIC8qKlxuICAqIEFuIGFycmF5IC0gcHV0YXRpdmVseSBvZiBvdGhlciBhcnJheXMgLSBkZXBpY3RpbmcgaG93IGJhcnMgc2hvdWxkIGJlIGFycmFuZ2VkXG4gICogQHBhcmFtIHtBcnJheVtdfSBbZ3JvdXBpbmc9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGdyb3VwaW5nLFxuXG4gIC8qKlxuICAqIEhvdyB0byBnZXQgdGhlIHZhbHVlIG9mIHRoZSBiYXJcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbdmFsdWVFeHRyYWN0b3I9ZnVuY3Rpb24oa2V5LCBpbmRleCkgeyByZXR1cm4gZGF0YVtrZXldIH1dXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdmFsdWVFeHRyYWN0b3IgPSBmdW5jdGlvbihrZXksIGluZGV4KSB7IHJldHVybiBkYXRhW2tleV0gfSxcbiAgLyoqXG4gICogSG93IHRvIHNvcnQgdGhlIGJhcnMgLSBpZiB7QGxpbmsgYmFyI2dyb3VwaW5nfSBpcyBub3QgcHJvdmlkZWQuXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW3NvcnRpbmdGdW5jdGlvbj1mdW5jdGlvbihrZXlBLCBrZXlCKSB7cmV0dXJuIGQzLmRlc2NlbmRpbmcoZGF0YVtrZXlBXSwgZGF0YVtrZXlCXSl9XVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNvcnRpbmdGdW5jdGlvbiA9IGZ1bmN0aW9uKGtleUEsIGtleUIpIHtyZXR1cm4gZDMuZGVzY2VuZGluZyhkYXRhW2tleUFdLCBkYXRhW2tleUJdKX0sXG5cbiAgLyoqXG4gICogVGhlIHNjYWxlIGZvciB3aGljaCBiYXIgdmFsdWVzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBieVxuICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtzY2FsZT1kMy5zY2FsZUxpbmVhcl1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzY2FsZSA9IGQzLnNjYWxlTGluZWFyKCksXG4gIC8qKlxuICAqIFRoZSBwYWRkaW5nIGZvciB0aGUgZG9tYWluIG9mIHRoZSBzY2FsZSAoc2VlIHtAbGluayBiYXIjc2NhbGV9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbZG9tYWluUGFkZGluZz0wLjVdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZG9tYWluUGFkZGluZyA9IDAuNSxcblxuICAvKipcbiAgKiBEZWZhdWx0IHNwYWNlIGZvciB0aGUgc3BhY2VyIChwZXJjZW50YWdlKSBvZiBtYWluIGRpbWVuc2lvbiBnaXZlbiB0aGUgb3JpZW50YXRpb25cbiAgKiAoc2VlIHtAbGluayBiYXIjb3JpZW50fSksIHdoZXJlIHtAbGluayBiYXIjb3JpZW50fT1cImhvcml6b250YWxcIlxuICAqIHRoZSBtYWluIGRpbWVuc2lvbiBpcyB7QGxpbmsgYmFyI3NwYWNlWH0gYW5kIHdoZXJlIHtAbGluayBiYXIjb3JpZW50fT1cInZlcnRpY2FsXCJcbiAgKiB0aGUgbWFpbiBkaW1lbnNpb24gaXMge0BsaW5rIGJhciNzcGFjZVl9IGJldHdlZW4gYmFyc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbb2JqZWN0U3BhY2VyPTAuMDVdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb2JqZWN0U3BhY2VyID0gMC4wNSxcbiAgLyoqXG4gICogVGhlIG1pbmltdW0gc2l6ZSB0aGF0IGFuIG9iamVjdCBjYW4gYmVcbiAgKiBAcGFyYW0ge251bWJlcn0gW21pbk9iamVjdFNpemU9NTBdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgbWluT2JqZWN0U2l6ZSA9IDUwLFxuICAvKipcbiAgKiBUaGUgbWF4aW11bSBzaXplIHRoYXQgYW4gb2JqZWN0IGNhbiBiZVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4T2JqZWN0U2l6ZT0xMDBdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgbWF4T2JqZWN0U2l6ZSA9IDEwMCxcblxuICAvKipcbiAgKiBUaGUgc3Ryb2tlIHdpZHRoIG9mIHRoZSBiYXJzXG4gICogQHBhcmFtIHtudW1iZXJ9IFtiYXJTdHJva2VXaWR0aD0yXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGJhclN0cm9rZVdpZHRoID0gMixcbiAgLyoqXG4gICogSW5zdGFuY2Ugb2YgQ29sb3JGdW5jdGlvblxuICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtjb2xvckZ1bmN0aW9uID0gY29sb3JGdW5jdGlvbigpXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGNvbG9yRnVuY3Rpb24gPSBDRigpLFxuXG5cbiAgLyoqXG4gICogQ29sb3Igb2YgdGhlIGJhY2tncm91bmRcbiAgKiBAcGFyYW0ge3N0cmluZ30gW2JhY2tncm91bmRGaWxsPVwidHJhbnNwYXJlbnRcIl1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBiYWNrZ3JvdW5kRmlsbCA9ICd0cmFuc3BhcmVudCcsXG4gIC8qKlxuICAqIE5hbWVzcGFjZSBmb3IgYWxsIGl0ZW1zIG1hZGUgYnkgdGhpcyBpbnN0YW5jZSBvZiBiYXJcbiAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVzcGFjZT1cImQzc20tYmFyXCJdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgbmFtZXNwYWNlID0gJ2Qzc20tYmFyJyxcbiAgLyoqXG4gICogQ2xhc3MgbmFtZSBmb3IgYmFyIGNvbnRhaW5lciAoPGc+IGVsZW1lbnQpXG4gICogQHBhcmFtIHtzdHJpbmd9IFtvYmplY3RDbGFzcz1cImJhclwiXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG9iamVjdENsYXNzID0gJ2JhcicsXG5cbiAgLyoqXG4gICogRHVyYXRpb24gb2YgYWxsIHRyYW5zaXRpb25zIG9mIHRoaXMgZWxlbWVudFxuICAqIEBwYXJhbSB7bnVtYmVyfSBbdHJhbnNpdGlvbkR1cmF0aW9uPTEwMDBdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdHJhbnNpdGlvbkR1cmF0aW9uID0gMTAwMCxcbiAgLyoqXG4gICogRWFzaW5nIGZ1bmN0aW9uIGZvciB0cmFuc2l0aW9uc1xuICAqIEBwYXJhbSB7ZDMuZWFzZX0gW2Vhc2VGdW5jPWQzLmVhc2VFeHBdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZWFzZUZ1bmMgPSBkMy5lYXNlRXhwLFxuXG4gIC8vIHVzZWZ1bCB2YWx1ZXMgdG8gZXh0cmFjdCB0byBwcmV2ZW50IHJlLWNhbGN1bGF0aW9uXG4gIC8qKlxuICAqIFRoZSBrZXlzIG9mIHRoZSBiYXJzXG4gICogQHBhcmFtIHtzdHJpbmdbXX0gW2JhcktleXM9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGJhcktleXMsXG4gIC8qKlxuICAqIFRoZSB2YWx1ZXMgb2YgdGhlIGJhcnNcbiAgKiBAcGFyYW0ge251bWJlcltdfSBbYmFyVmFsdWVzPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBiYXJWYWx1ZXMsXG4gIC8qKlxuICAqIFRoZSBvYmplY3RTaXplIChhY3R1YWwgd2lkdGgpIHVzZWQgYnkgdGhlIGJhcnNcbiAgKiBAcGFyYW0ge251bWJlcn0gW29iamVjdFNpemU9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG9iamVjdFNpemUsXG4gIC8qKlxuICAqIFRoZSBzcGFjZXJTaXplIChhY3R1YWwgd2lkdGgpIHVzZWQgYnkgdGhlIHNwYWNlcnMgYmV0d2VlbiB0aGUgYmFyc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbc3BhY2VyU2l6ZT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc3BhY2VyU2l6ZSxcbiAgLyoqXG4gICogSW5zdGFuY2Ugb2YgVG9vbHRpcFxuICAqIEBwYXJhbSB7ZnVuY3Rpb259IFt0b29sdGlwPXRvb2x0aXAoKV1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB0b29sdGlwID0gVFRpcCgpXG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgc2VsZWN0aW9uIGluIHdoaWNoIGl0ZW1zIGFyZSBtYW5pcHVsYXRlZFxuICAgKiBAcGFyYW0ge2QzLnNlbGVjdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IGQzLnNlbGVjdGlvbn1cbiAgICogQG1lbWJlcm9mIGJhclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzZWxlY3Rpb24gPSBzZWxlY3Rpb25cbiAgICovXG4gIGJhci5zZWxlY3Rpb24gPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNlbGVjdGlvbiA9IF8sIGJhcikgOiBzZWxlY3Rpb247IH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGRhdGFcbiAgICogKHNlZSB7QGxpbmsgYmFyI2RhdGF9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IG9iamVjdH1cbiAgICogQG1lbWJlcm9mIGJhclxuICAgKiBAcHJvcGVydHlcbiAgICovXG4gIGJhci5kYXRhID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkYXRhID0gXywgYmFyKSA6IGRhdGE7IH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIG9yaWVudCBvZiB0aGUgYmFyc1xuICAgKiAoc2VlIHtAbGluayBiYXIjb3JpZW50fSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtiYXIgfCBvYmplY3R9XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqL1xuICBiYXIub3JpZW50ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvcmllbnQgPSBfLCBiYXIpIDogb3JpZW50OyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBhbW91bnQgb2YgaG9yaXpvbnRhbCBzcGFjZSBpbiB3aGljaCBpdGVtcyBhcmUgbWFuaXB1bGF0ZWRcbiAgICogKHNlZSB7QGxpbmsgYmFyI3NwYWNlWH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXSBzaG91bGQgYmUgYSBudW1iZXIgPiAwXG4gICAqIEByZXR1cm5zIHtiYXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc3BhY2VYID0gdW5kZWZpbmVkXG4gICAqL1xuICBiYXIuc3BhY2VYID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzcGFjZVggPSBfLCBiYXIpIDogc3BhY2VYOyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBhbW91bnQgb2YgdmVydGljYWwgc3BhY2UgaW4gd2hpY2ggaXRlbXMgYXJlIG1hbmlwdWxhdGVkXG4gICAqIChzZWUge0BsaW5rIGJhciNzcGFjZVl9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV0gc2hvdWxkIGJlIGEgbnVtYmVyID4gMFxuICAgKiBAcmV0dXJucyB7YmFyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNwYWNlWSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYmFyLnNwYWNlWSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3BhY2VZID0gXywgYmFyKSA6IHNwYWNlWTsgfTtcblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgd2hldGhlciBvciBub3QgYmFyIGlzIGFsbG93ZWQgdG8gZ28gYmV5b25kIHNwZWNpZmllZCBkaW1lbnNpb25zXG4gICAqIChzZWUge0BsaW5rIGJhciNzcGFjZVh9KVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtiYXIgfCBib29sZWFufVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG92ZXJmbG93USA9IGZhbHNlXG4gICAqL1xuICBiYXIub3ZlcmZsb3dRID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvdmVyZmxvd1EgPSBfLCBiYXIpIDogb3ZlcmZsb3dROyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGdyb3VwaW5nIG9mIHRoZSBiYXJzXG4gICAqIChzZWUge0BsaW5rIGJhciNncm91cGluZ30pXG4gICAqIEBwYXJhbSB7QXJyYXlbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IEFycmF5W119XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgZ3JvdXBpbmcgPSB1bmRlZmluZWRcbiAgICovXG4gIGJhci5ncm91cGluZyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZ3JvdXBpbmcgPSBfLCBiYXIpIDogZ3JvdXBpbmc7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdmFsdWVFeHRyYWN0b3JcbiAgICogKHNlZSB7QGxpbmsgYmFyI3ZhbHVlRXh0cmFjdG9yfSlcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IGZ1bmN0aW9ufVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHZhbHVlRXh0cmFjdG9yID0gZnVuY3Rpb24oa2V5LCBpbmRleCkgeyByZXR1cm4gZGF0YVtrZXldIH0sXG4gICAqL1xuICBiYXIudmFsdWVFeHRyYWN0b3IgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZhbHVlRXh0cmFjdG9yID0gXywgYmFyKSA6IHZhbHVlRXh0cmFjdG9yOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNvcnRpbmdGdW5jdGlvblxuICAgKiAoc2VlIHtAbGluayBiYXIjc29ydGluZ0Z1bmN0aW9ufSlcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IGZ1bmN0aW9ufVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNvcnRpbmdGdW5jdGlvbiA9IGZ1bmN0aW9uKGtleUEsIGtleUIpIHtyZXR1cm4gZDMuZGVzY2VuZGluZyhkYXRhW2tleUFdLCBkYXRhW2tleUJdKX0sXG4gICAqL1xuICBiYXIuc29ydGluZ0Z1bmN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzb3J0aW5nRnVuY3Rpb24gPSBfLCBiYXIpIDogc29ydGluZ0Z1bmN0aW9uOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNjYWxlIGZvciB3aGljaCB0aGUgYmFyIHZhbHVlcyBzaG91bGQgYmUgdHJhbnNmb3JtZWQgYnlcbiAgICogKHNlZSB7QGxpbmsgYmFyI3NjYWxlfSlcbiAgICogQHBhcmFtIHtkMy5zY2FsZX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IGQzLnNjYWxlfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKVxuICAgKi9cbiAgYmFyLnNjYWxlID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzY2FsZSA9IF8sIGJhcikgOiBzY2FsZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBwYWRkaW5nIGZvciB0aGUgZG9tYWluIG9mIHRoZSBzY2FsZVxuICAgKiAoc2VlIHtAbGluayBiYXIjZG9tYWluUGFkZGluZ30pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YmFyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGRvbWFpblBhZGRpbmcgPSAwLjVcbiAgICovXG4gIGJhci5kb21haW5QYWRkaW5nID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkb21haW5QYWRkaW5nID0gXywgYmFyKSA6IGRvbWFpblBhZGRpbmc7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyBvYmplY3RTcGFjZXJcbiAgICogKHNlZSB7QGxpbmsgYmFyI29iamVjdFNwYWNlcn0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YmFyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG9iamVjdFNwYWNlciA9IDAuMDVcbiAgICovXG4gIGJhci5vYmplY3RTcGFjZXIgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9iamVjdFNwYWNlciA9IF8sIGJhcikgOiBvYmplY3RTcGFjZXI7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbWluT2JqZWN0U2l6ZVxuICAgKiAoc2VlIHtAbGluayBiYXIjbWluT2JqZWN0U2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YmFyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG1pbk9iamVjdFNpemUgPSA1MFxuICAgKi9cbiAgYmFyLm1pbk9iamVjdFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG1pbk9iamVjdFNpemUgPSBfLCBiYXIpIDogbWluT2JqZWN0U2l6ZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBtYXhPYmplY3RTaXplXG4gICAqIChzZWUge0BsaW5rIGJhciNtYXhPYmplY3RTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtiYXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgbWF4T2JqZWN0U2l6ZSA9IDEwMFxuICAgKi9cbiAgYmFyLm1heE9iamVjdFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG1heE9iamVjdFNpemUgPSBfLCBiYXIpIDogbWF4T2JqZWN0U2l6ZTsgfTtcblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGJhclN0cm9rZVdpZHRoXG4gICAqIChzZWUge0BsaW5rIGJhciNiYXJTdHJva2VXaWR0aH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YmFyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGJhclN0cm9rZVdpZHRoID0gMlxuICAgKi9cbiAgYmFyLmJhclN0cm9rZVdpZHRoID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChiYXJTdHJva2VXaWR0aCA9IF8sIGJhcikgOiBiYXJTdHJva2VXaWR0aDsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBjb2xvckZ1bmN0aW9uXG4gICAqIChzZWUge0BsaW5rIGJhciNjb2xvckZ1bmN0aW9ufSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtiYXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgY29sb3JGdW5jdGlvbiA9IGNvbG9yRnVuY3Rpb24oKVxuICAgKi9cbiAgYmFyLmNvbG9yRnVuY3Rpb24gPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNvbG9yRnVuY3Rpb24gPSBfLCBiYXIpIDogY29sb3JGdW5jdGlvbjsgfTtcblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGJhY2tncm91bmRGaWxsXG4gICAqIChzZWUge0BsaW5rIGJhciNiYWNrZ3JvdW5kRmlsbH0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YmFyIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGJhY2tncm91bmRGaWxsID0gJ3RyYW5zcGFyZW50J1xuICAgKi9cbiAgYmFyLmJhY2tncm91bmRGaWxsID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChiYWNrZ3JvdW5kRmlsbCA9IF8sIGJhcikgOiBiYWNrZ3JvdW5kRmlsbDsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBuYW1lc3BhY2VcbiAgICogKHNlZSB7QGxpbmsgYmFyI25hbWVzcGFjZX0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YmFyIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG5hbWVzcGFjZSA9ICdkM3NtLWJhcidcbiAgICovXG4gIGJhci5uYW1lc3BhY2UgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG5hbWVzcGFjZSA9IF8sIGJhcikgOiBuYW1lc3BhY2U7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgb2JqZWN0Q2xhc3NcbiAgICogKHNlZSB7QGxpbmsgYmFyI29iamVjdENsYXNzfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtiYXIgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgb2JqZWN0Q2xhc3MgPSAndGljay1ncm91cCdcbiAgICovXG4gIGJhci5vYmplY3RDbGFzcyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob2JqZWN0Q2xhc3MgPSBfLCBiYXIpIDogb2JqZWN0Q2xhc3M7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdHJhbnNpdGlvbkR1cmF0aW9uXG4gICAqIChzZWUge0BsaW5rIGJhciN0cmFuc2l0aW9uRHVyYXRpb259KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJhclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0cmFuc2l0aW9uRHVyYXRpb24gPSAxMDAwXG4gICAqL1xuICBiYXIudHJhbnNpdGlvbkR1cmF0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0cmFuc2l0aW9uRHVyYXRpb24gPSBfLCBiYXIpIDogdHJhbnNpdGlvbkR1cmF0aW9uOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGVhc2VGdW5jXG4gICAqIChzZWUge0BsaW5rIGJhciNlYXNlRnVuY30pXG4gICAqIEBwYXJhbSB7ZDMuZWFzZX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IGQzLmVhc2V9XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgZWFzZUZ1bmMgPSBkMy5lYXNlRXhwXG4gICAqL1xuICBiYXIuZWFzZUZ1bmMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGVhc2VGdW5jID0gXywgYmFyKSA6IGVhc2VGdW5jOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBiYXJLZXlzXG4gICAqIChzZWUge0BsaW5rIGJhciNiYXJLZXlzfSlcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IHN0cmluZ1tdfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGJhcktleXMgPSB1bmRlZmluZWRcbiAgICovXG4gIGJhci5iYXJLZXlzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChiYXJLZXlzID0gXywgYmFyKSA6IGJhcktleXM7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgYmFyVmFsdWVzXG4gICAqIChzZWUge0BsaW5rIGJhciNiYXJWYWx1ZXN9KVxuICAgKiBAcGFyYW0ge251bWJlcltdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YmFyIHwgbnVtYmVyW119XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgYmFyVmFsdWVzID0gdW5kZWZpbmVkXG4gICAqL1xuICBiYXIuYmFyVmFsdWVzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChiYXJWYWx1ZXMgPSBfLCBiYXIpIDogYmFyVmFsdWVzOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG9iamVjdFNpemVcbiAgICogKHNlZSB7QGxpbmsgYmFyI29iamVjdFNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJhclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvYmplY3RTaXplID0gdW5kZWZpbmVkXG4gICAqL1xuICBiYXIub2JqZWN0U2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob2JqZWN0U2l6ZSA9IF8sIGJhcikgOiBvYmplY3RTaXplOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNwYWNlclNpemVcbiAgICogKHNlZSB7QGxpbmsgYmFyI3NwYWNlclNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJhclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzcGFjZXJTaXplID0gdW5kZWZpbmVkXG4gICAqL1xuICBiYXIuc3BhY2VyU2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3BhY2VyU2l6ZSA9IF8sIGJhcikgOiBzcGFjZXJTaXplOyB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdG9vbHRpcFxuICAgKiAoc2VlIHtAbGluayBiYXIjdG9vbHRpcH0pXG4gICAqIEBwYXJhbSB7dG9vbHRpcH0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IHRvb2x0aXB9XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdG9vbHRpcCA9IHRvb2x0aXAoKVxuICAgKi9cbiAgYmFyLnRvb2x0aXAgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRvb2x0aXAgPSBfLCBiYXIpIDogdG9vbHRpcDsgfTtcblxuXG4gIGZ1bmN0aW9uIGJhcigpIHtcbiAgICAvLyBmb3IgY29udmVuaWVuY2UgaW4gaGFuZGxpbmcgb3JpZW50YXRpb24gc3BlY2lmaWMgdmFsdWVzXG4gICAgdmFyIGhvcml6b250YWxRID0gKG9yaWVudCA9PSAnaG9yaXpvbnRhbCcpID8gdHJ1ZSA6IGZhbHNlXG4gICAgdmFyIHZlcnRpY2FsUSA9ICFob3Jpem9udGFsUVxuXG4gICAgLy8gYmFja2dyb3VuZCBjbGlwaW5nIHJlY3RhbmdsZVxuICAgIHZhciBiZ2NwUmVjdCA9IHt4OjAsIHk6MCwgd2lkdGg6IHNwYWNlWCwgaGVpZ2h0OnNwYWNlWX1cbiAgICB2YXIgY29udGFpbmVyID0gc2V0dXBDb250YWluZXIoIHNlbGVjdGlvbiwgbmFtZXNwYWNlLCBiZ2NwUmVjdCwgYmFja2dyb3VuZEZpbGwgKTtcblxuICAgIC8vIHRvIHByZXZlbnQgcmUtY2FsY3VsYXRpb24gYW5kIGdldHRlcnMgdG8gYmUgcGFzc2VkIHRvIGF4ZXNcbiAgICBiYXJLZXlzID0gZDMua2V5cyhkYXRhKVxuICAgIGJhclZhbHVlcyA9IGJhcktleXMubWFwKHZhbHVlRXh0cmFjdG9yKVxuXG4gICAgLy8gaWYgZ3JvdXBpbmcgaXMgdW5kZWZpbmVkIHNvcnQgYmFyS2V5cyBieSBzb3J0aW5nRnVuY3Rpb25cbiAgICB2YXIgb3JkZXJlZCA9IChncm91cGluZyA9PSB1bmRlZmluZWQpID8gYmFyS2V5cy5zb3J0KHNvcnRpbmdGdW5jdGlvbikgOiBncm91cGluZ1xuICAgIC8vIG9yZGVyZWQgbWlnaHQgYmUgbmVzdGVkIGRlcGVuZGluZyBvbiBncm91cGluZ1xuICAgIGJhcktleXMgPSBmbGF0dGVuKG9yZGVyZWQpXG5cbiAgICB2YXIgbnVtYmVyT2ZPYmplY3RzID0gYmFyS2V5cy5sZW5ndGhcbiAgICB2YXIgZXh0ZW50ID0gW01hdGgubWluKC4uLmJhclZhbHVlcykgLSBkb21haW5QYWRkaW5nLE1hdGgubWF4KC4uLmJhclZhbHVlcykgKyBkb21haW5QYWRkaW5nXTtcblxuXG5cbiAgICAvLyBzZXQgdGhlIHNjYWxlXG4gICAgc2NhbGUuZG9tYWluKGV4dGVudCkucmFuZ2UoaG9yaXpvbnRhbFEgPyBbMCxzcGFjZVldIDogW3NwYWNlWCwgMF0pXG4gICAgdmFyIHNwYWNlID0gaG9yaXpvbnRhbFEgPyBzcGFjZVggOiBzcGFjZVlcbiAgICAvLyBjYWxjdWxhdGUgb2JqZWN0IHNpemVcbiAgICBvYmplY3RTaXplID0gY2FsY3VsYXRlV2lkdGhPZk9iamVjdChzcGFjZSwgbnVtYmVyT2ZPYmplY3RzLCBtaW5PYmplY3RTaXplLCBtYXhPYmplY3RTaXplLCBvYmplY3RTcGFjZXIsIG92ZXJmbG93USlcbiAgICAvLyBjYWxjdWxhdGUgc3BhY2VyIHNpemUgaWYgbmVlZGVkXG4gICAgc3BhY2VyU2l6ZSA9IGNhbGN1bGF0ZVdpZHRoT2ZTcGFjZXIoYmFyS2V5cywgc3BhY2UsIG9iamVjdFNpemUsIG51bWJlck9mT2JqZWN0cywgb2JqZWN0U3BhY2VyLCBvdmVyZmxvd1EpXG4gICAgLy8gbWFrZSB0aGUgbmVzdGVkIGdyb3Vwc1xuICAgIHZhciBzcGFjZXJGdW5jdGlvbiA9IGdyb3VwaW5nU3BhY2VyKClcbiAgICAuaG9yaXpvbnRhbFEoaG9yaXpvbnRhbFEpLnNjYWxlKHNjYWxlKS5tb3ZlYnkoJ2NhdGVnb3J5JykubnVtYmVyT2ZPYmplY3RzKG51bWJlck9mT2JqZWN0cylcbiAgICAub2JqZWN0Q2xhc3Mob2JqZWN0Q2xhc3MpLm9iamVjdFNpemUob2JqZWN0U2l6ZSkuc3BhY2VyU2l6ZShzcGFjZXJTaXplKVxuICAgIC50cmFuc2l0aW9uRHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlRnVuYyhlYXNlRnVuYylcbiAgICAubmFtZXNwYWNlKG5hbWVzcGFjZSlcbiAgICAvLyBzYWZlIGRlZmF1bHQgZnVuY3Rpb25cbiAgICB2YXIgZGVmYXVsdEV4aXQgPSBzcGFjZXJGdW5jdGlvbi5leGl0RnVuY3Rpb24oKVxuXG4gICAgc3BhY2VyRnVuY3Rpb24uZXhpdEZ1bmN0aW9uKGZ1bmN0aW9uKHNlbCl7XG4gICAgICAvLyB1c2UgZGVmYXVsdCB0byBtb3ZlIG9iamVjdHMgb2ZmIHNjcmVlblxuICAgICAgZGVmYXVsdEV4aXQoc2VsKVxuICAgICAgLy8gc2hyaW5rIHJlY3RhbmdsZXMgaW4gYWRkaXRpb25cbiAgICAgIHNlbC5zZWxlY3RBbGwoJyogPiByZWN0JylcbiAgICAgIC50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uKGQsIGkpIHtcbiAgICAgICAgdmFyXG4gICAgICAgIHggPSBob3Jpem9udGFsUSA/IDAgOiAwLFxuICAgICAgICB5ID0gdmVydGljYWxRID8gMCA6IHNjYWxlKGV4dGVudFsxXSksXG4gICAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgICAgcmV0dXJuIHRcbiAgICAgIH0pXG4gICAgICAuYXR0cignd2lkdGgnLCBob3Jpem9udGFsUSA/IG9iamVjdFNpemUgOiAwKVxuICAgICAgLmF0dHIoJ2hlaWdodCcsIHZlcnRpY2FsUSA/IG9iamVjdFNpemUgOiAwKS5yZW1vdmUoKVxuICAgIH0pXG5cbiAgICAvLyBtb3ZlIHN0dWZmXG4gICAgc3BhY2VyRnVuY3Rpb24oY29udGFpbmVyLCBvcmRlcmVkLCAwKVxuXG5cblxuXG4gICAgdmFyIHBhcmVudEluZGV4QXJyYXkgPSBbXVxuICAgIGNvbnRhaW5lci5zZWxlY3RBbGwoJ2c6bm90KC50by1yZW1vdmUpLicrb2JqZWN0Q2xhc3MpXG4gICAgLmVhY2goZnVuY3Rpb24oZCwgaSl7cGFyZW50SW5kZXhBcnJheS5wdXNoKE51bWJlcihkMy5zZWxlY3QodGhpcykuYXR0cigncGFyZW50LWluZGV4JykpKX0pXG5cblxuICAgIGNvbG9yRnVuY3Rpb24gPSBjb2xvckZ1bmN0aW9uLmNvbG9yQnkoKSA9PSAnaW5kZXgnXG4gICAgPyBjb2xvckZ1bmN0aW9uLmRhdGFFeHRlbnQoWzAsIE1hdGgubWF4KC4uLnBhcmVudEluZGV4QXJyYXkpXSlcbiAgICA6IGNvbG9yRnVuY3Rpb24uZGF0YUV4dGVudChleHRlbnQpXG5cblxuXG4gICAgY29udGFpbmVyLnNlbGVjdEFsbCgnZzpub3QoLnRvLXJlbW92ZSkuJytvYmplY3RDbGFzcykuZWFjaChmdW5jdGlvbihrZXksIGkpIHtcbiAgICAgIHZhciB0ID0gZDMuc2VsZWN0KHRoaXMpLFxuICAgICAgY3VycmVudERhdGEgPSBkYXRhW2tleV0sXG4gICAgICB2YWx1ZSA9IHZhbHVlRXh0cmFjdG9yKGtleSwgaSksXG4gICAgICBpID0gdC5hdHRyKCdwYXJlbnQtaW5kZXgnKSA9PSB1bmRlZmluZWQgPyBpIDogdC5hdHRyKCdwYXJlbnQtaW5kZXgnKSxcbiAgICAgIGZpbGxDb2xvciA9IGNvbG9yRnVuY3Rpb24oa2V5LCB2YWx1ZSwgaSwgJ2ZpbGwnKSwgLy8gcHJldmVudCBkdXBsaWNhdGUgY29tcHV0YXRpb25cbiAgICAgIHN0cm9rZUNvbG9yID0gY29sb3JGdW5jdGlvbihrZXksIHZhbHVlLCBpLCAgJ3N0cm9rZScpXG5cblxuICAgICAgdmFyIGJhciA9IHNhZmVTZWxlY3QodCwgJ3JlY3QnLCAnYmFyLXJlY3QnKVxuXG4gICAgICBpZiAoYmFyLmF0dHIoJ3RyYW5zZm9ybScpID09IHVuZGVmaW5lZCkge1xuICAgICAgICBiYXIuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24oZCwgaSkge1xuICAgICAgICAgIHZhclxuICAgICAgICAgIHggPSBob3Jpem9udGFsUSA/IDAgOiAwLFxuICAgICAgICAgIHkgPSB2ZXJ0aWNhbFEgPyAwIDogc2NhbGUoZXh0ZW50WzFdKSxcbiAgICAgICAgICB0ID0gJ3RyYW5zbGF0ZSgnK3grJywnK3krJyknXG4gICAgICAgICAgcmV0dXJuIHRcbiAgICAgICAgfSlcbiAgICAgICAgLmF0dHIoJ3dpZHRoJywgaG9yaXpvbnRhbFEgPyBvYmplY3RTaXplIDogMClcbiAgICAgICAgLmF0dHIoJ2hlaWdodCcsIHZlcnRpY2FsUSA/IG9iamVjdFNpemUgOiAwKVxuICAgICAgfVxuXG5cbiAgICAgIGJhci50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlKGVhc2VGdW5jKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uKGQsIGkpIHtcbiAgICAgICAgdmFyXG4gICAgICAgIHggPSBob3Jpem9udGFsUSA/IDAgOiAwLFxuICAgICAgICB5ID0gdmVydGljYWxRID8gMCA6IHNjYWxlKGV4dGVudFsxXSkgLSBzY2FsZSh2YWx1ZSksXG4gICAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgICAgcmV0dXJuIHRcbiAgICAgIH0pXG4gICAgICAuYXR0cignd2lkdGgnLCBob3Jpem9udGFsUSA/IG9iamVjdFNpemUgOiBzY2FsZSh2YWx1ZSkpXG4gICAgICAuYXR0cignaGVpZ2h0JywgdmVydGljYWxRID8gb2JqZWN0U2l6ZSA6IHNjYWxlKHZhbHVlKSlcbiAgICAgIC5hdHRyKCdmaWxsJywgZmlsbENvbG9yKVxuICAgICAgLmF0dHIoJ3N0cm9rZScsIHN0cm9rZUNvbG9yKVxuICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIGJhclN0cm9rZVdpZHRoKVxuXG5cblxuICAgICAgdC5vbignbW91c2VvdmVyJywgZnVuY3Rpb24oZCwgaSl7XG4gICAgICAgIGNvbnRhaW5lci5zZWxlY3RBbGwoJ2cuJytvYmplY3RDbGFzcykuc3R5bGUoJ29wYWNpdHknLCAwLjIpXG4gICAgICAgIHQuc3R5bGUoJ29wYWNpdHknLCAxKVxuICAgICAgICBiYXIuYXR0cignc3Ryb2tlLXdpZHRoJyxiYXJTdHJva2VXaWR0aCoyKVxuXG4gICAgICB9KVxuICAgICAgdC5vbignbW91c2VvdXQnLCBmdW5jdGlvbigpe1xuICAgICAgICBjb250YWluZXIuc2VsZWN0QWxsKCdnLicrb2JqZWN0Q2xhc3MpLnN0eWxlKCdvcGFjaXR5JywgMSlcbiAgICAgICAgYmFyLmF0dHIoJ3N0cm9rZS13aWR0aCcsIGJhclN0cm9rZVdpZHRoKVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgdG9vbHRpcC5zZWxlY3Rpb24oY29udGFpbmVyLnNlbGVjdEFsbCgnLmJhci1yZWN0JykpXG4gICAgLmRhdGEoZGF0YSlcblxuICAgIHRvb2x0aXAoKVxuXG4gIH1cbiAgcmV0dXJuIGJhclxufVxuIiwiaW1wb3J0IHtoeXBlbmF0ZSwgc2FmZVNlbGVjdH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7c2V0dXBDb250YWluZXIsIGNhbGN1bGF0ZVdpZHRoT2ZPYmplY3QsIGNhbGN1bGF0ZVdpZHRoT2ZTcGFjZXIsIGxvZ30gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge3VuaXF1ZX0gZnJvbSAnLi9hcnJheS1mdW5jdGlvbnMnO1xuaW1wb3J0IHtncm91cGluZ1NwYWNlcn0gZnJvbSAnLi9ncm91cGluZy1zcGFjZXInO1xuaW1wb3J0IHtjb2xvckZ1bmN0aW9uIGFzIENGfSBmcm9tICcuL2NvbG9yLWZ1bmN0aW9uJztcbmltcG9ydCB7dG9vbHRpcCBhcyBUVGlwfSBmcm9tICcuL3Rvb2x0aXAnO1xuXG5cbi8qKlxuICogQ3JlYXRlcyBhIGJ1YmJsZUhlYXRtYXBcbiAqXG4gKiB7QGxpbmsgaHR0cHM6Ly9zdW1uZXVyb24uZ2l0bGFiLmlvL2Qzc20vZGVtb3MvYnViYmxlLWhlYXRtYXAvaW5kZXguaHRtbCBEZW1vfVxuICogQGNvbnN0cnVjdG9yIGJ1YmJsZUhlYXRtYXBcbiAqIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBzZWxlY3Rpb25cbiAqIEBuYW1lc3BhY2UgYnViYmxlSGVhdG1hcFxuICogQHJldHVybnMge2Z1bmN0aW9ufSBidWJibGVIZWF0bWFwXG4gKi9cbmZ1bmN0aW9uIGJ1YmJsZUhlYXRtYXAoIHNlbGVjdGlvbiApIHtcbiAgdmFyXG4gIC8qKlxuICAqIERhdGEgdG8gcGxvdC4gQXNzdW1lZCB0byBiZSBhIG9iamVjdCwgd2hlcmUgZWFjaCBrZXkgY29ycmVzcG9uZHMgdG8gYSBjZWxsXG4gICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNkYXRhfSlcbiAgKiBAcGFyYW0ge09iamVjdH0gW2RhdGE9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBkYXRhLFxuXG4gIC8qKlxuICAqIEFtb3VudCBvZiBob3Jpem9udGFsIHNwYWNlIChpbiBwaXhlbHMpIGF2YWlibGUgdG8gcmVuZGVyIHRoZSBidWJibGVIZWF0bWFwIGluXG4gICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNzcGFjZVh9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbc3BhY2VYPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc3BhY2VYLFxuICAvKipcbiAgKiBBbW91bnQgb2YgdmVydGljYWwgc3BhY2UgKGluIHBpeGVscykgYXZhaWJsZSB0byByZW5kZXIgdGhlIGJ1YmJsZUhlYXRtYXAgaW5cbiAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwLnNwYWNlWX0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZVk9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzcGFjZVksXG5cbiAgLyoqXG4gICogVGhlIGludGVybmFsIGtleSBvZiB0aGUgY2VsbCBzcGVjaWZpeWluZyB0byB3aGljaCB4IGF4aXMga2V5IGl0IGJlbG9uZ3NcbiAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwLnhLZXl9KVxuICAqIEBwYXJhbSB7c3RyaW5nfSBbeEtleT0neCddXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHhLZXkgPSAneCcsXG4gIC8qKlxuICAqIFRoZSBpbnRlcm5hbCBrZXkgb2YgdGhlIGNlbGwgc3BlY2lmaXlpbmcgdG8gd2hpY2ggeSBheGlzIGtleSBpdCBiZWxvbmdzXG4gICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcC55S2V5fSlcbiAgKiBAcGFyYW0ge3N0cmluZ30gW3lLZXk9J3knXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB5S2V5ID0gJ3knLFxuICAvKipcbiAgKiBUaGUgaW50ZXJuYWwga2V5IG9mIHRoZSBjZWxsIHNwZWNpZml5aW5nIHdoYXQgdmFsdWUgdG8gdXNlIHRvIGRldGVybWluZSB0aGUgcmFkaXVzXG4gICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcC5yS2V5fSlcbiAgKiBAcGFyYW0ge3N0cmluZ30gW3JLZXk9J3InXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICByS2V5ID0gJ3InLFxuICAvKipcbiAgKiBUaGUgaW50ZXJuYWwga2V5IG9mIHRoZSBjZWxsIHNwZWNpZml5aW5nIHdoYXQgdmFsdWUgdG8gdXNlIHRvIGRldGVybWluZSB0aGUgY29sb3JcbiAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwLnZLZXl9KVxuICAqIEBwYXJhbSB7c3RyaW5nfSBbdktleT0ndiddXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHZLZXkgPSAndicsXG5cbiAgLyoqXG4gICogRnVuY3Rpb24gZm9yIGV4dHJhY3RpbmcgdGhlIHRoZSB2YWx1ZSBmcm9tIHhLZXkuXG4gICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcC54RXh0cmFjdG9yfSlcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbeEV4dHJhY3Rvcj1mdW5jdGlvbihrZXksIGkpIHsgcmV0dXJuIGRhdGFba2V5XVt4S2V5XSB9XVxuICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHhFeHRyYWN0b3IgPSBmdW5jdGlvbihrZXksIGkpIHtyZXR1cm4gZGF0YVtrZXldW3hLZXldIH0sXG4gIC8qKlxuICAqIEZ1bmN0aW9uIGZvciBleHRyYWN0aW5nIHRoZSB0aGUgdmFsdWUgZnJvbSB5S2V5LlxuICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAueUV4dHJhY3Rvcn0pXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW3lFeHRyYWN0b3I9ZnVuY3Rpb24oa2V5LCBpKSB7IHJldHVybiBkYXRhW2tleV1beUtleV0gfV1cbiAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB5RXh0cmFjdG9yID0gZnVuY3Rpb24oa2V5LCBpKSB7IHJldHVybiBkYXRhW2tleV1beUtleV0gfSxcbiAgLyoqXG4gICogRnVuY3Rpb24gZm9yIGV4dHJhY3RpbmcgdGhlIHRoZSB2YWx1ZSBmcm9tIHJLZXkuXG4gICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcC5yRXh0cmFjdG9yfSlcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbckV4dHJhY3Rvcj1mdW5jdGlvbihrZXksIGkpIHsgcmV0dXJuIGRhdGFba2V5XVtyS2V5XSB9XVxuICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHJFeHRyYWN0b3IgPSBmdW5jdGlvbihrZXksIGkpIHsgcmV0dXJuIGRhdGFba2V5XVtyS2V5XSB9LFxuICAvKipcbiAgKiBGdW5jdGlvbiBmb3IgZXh0cmFjdGluZyB0aGUgdGhlIHZhbHVlIGZyb20gdktleS5cbiAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwLnZFeHRyYWN0b3J9KVxuICAqIEBwYXJhbSB7ZnVuY3Rpb259IFt2RXh0cmFjdG9yPWZ1bmN0aW9uKGtleSwgaSkgeyByZXR1cm4gZGF0YVtrZXldW3ZLZXldIH1dXG4gICogQHJldHVybnMge251bWJlcn1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdkV4dHJhY3RvciA9IGZ1bmN0aW9uKGtleSwgaSkgeyByZXR1cm4gZGF0YVtrZXldW3ZLZXldIH0sXG5cblxuICAvKipcbiAgKiBXaGV0aGVyIG9yIG5vdCB0byBhbGxvdyBidWJibGVIZWF0bWFwIHRvIHJlbmRlciBlbGVtZW50cyBwYXNzIHRoZSBtYWluIHNwYXRpYWwgZGltZW5zaW9uXG4gICogZ2l2ZW4gdGhlIG9yaWVudGF0aW9uIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjb3JpZW50fSksIHdoZXJlIHtAbGluayBidWJibGVIZWF0bWFwI29yaWVudH09XCJib3R0b21cIiBvciB7QGxpbmsgYnViYmxlSGVhdG1hcCNvcmllbnR9PVwidG9wXCJcbiAgKiB0aGUgbWFpbiBkaW1lbnNpb24gaXMge0BsaW5rIGJ1YmJsZUhlYXRtYXAjc3BhY2VYfSBhbmQgd2hlcmUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjb3JpZW50fT1cImxlZnRcIiBvciB7QGxpbmsgYnViYmxlSGVhdG1hcCNvcmllbnR9PVwicmlnaHRcIlxuICAqIHRoZSBtYWluIGRpbWVuc2lvbiBpcyB7QGxpbmsgYnViYmxlSGVhdG1hcCNzcGFjZVl9XG4gICogQHBhcmFtIHtib29sZWFufSBbb3ZlcmZsb3dRPWZhbHNlXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBvdmVyZmxvd1EgPSBmYWxzZSxcblxuICAvKipcbiAgKiBUaGUgc2NhbGUgZm9yIHdoaWNoIHRoZSByYWRpdXMgdmFsdWVzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBieVxuICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtzY2FsZT1kMy5zY2FsZUxpbmVhcl1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc2NhbGUgPSBkMy5zY2FsZUxpbmVhcigpLFxuICAvKipcbiAgKiBUaGUgcGFkZGluZyBmb3IgdGhlIGRvbWFpbiBvZiB0aGUgc2NhbGUgKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNzY2FsZX0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtkb21haW5QYWRkaW5nPTAuNV1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZG9tYWluUGFkZGluZyA9IDAuNSxcblxuICAvKipcbiAgKiBEZWZhdWx0IHNwYWNlIGZvciB0aGUgc3BhY2VyIChwZXJjZW50YWdlKSBvZiBtYWluIGRpbWVuc2lvbiBnaXZlbiB0aGUgb3JpZW50YXRpb25cbiAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI29yaWVudH0pLCB3aGVyZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNvcmllbnR9PVwiaG9yaXpvbnRhbFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBidWJibGVIZWF0bWFwI3NwYWNlWH0gYW5kIHdoZXJlIHtAbGluayBidWJibGVIZWF0bWFwI29yaWVudH09XCJ2ZXJ0aWNhbFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBidWJibGVIZWF0bWFwI3NwYWNlWX0gYmV0d2VlbiBidWJibGVzXG4gICogQHBhcmFtIHtudW1iZXJ9IFtvYmplY3RTcGFjZXI9MC4wXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBvYmplY3RTcGFjZXIgPSAwLjAsXG4gIC8qKlxuICAqIFRoZSBtaW5pbXVtIHNpemUgdGhhdCBhbiBvYmplY3QgY2FuIGJlXG4gICogQHBhcmFtIHtudW1iZXJ9IFttaW5PYmplY3RTaXplPTUwXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBtaW5PYmplY3RTaXplID0gNTAsXG4gIC8qKlxuICAqIFRoZSBtYXhpbXVtIHNpemUgdGhhdCBhbiBvYmplY3QgY2FuIGJlXG4gICogQHBhcmFtIHtudW1iZXJ9IFttYXhPYmplY3RTaXplPTEwMF1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgbWF4T2JqZWN0U2l6ZSA9IDEwMCxcblxuXG4gIC8qKlxuICAqIFRoZSBzdHJva2Ugd2lkdGggb2YgdGhlIGJ1YmJsZXNcbiAgKiBAcGFyYW0ge251bWJlcn0gW2J1YmJsZVN0cm9rZVdpZHRoPTJdXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGJ1YmJsZVN0cm9rZVdpZHRoID0gMixcbiAgLy8gY29sb3JGdW5jID0gY29sb3JGdW5jdGlvbigpLFxuXG4gIC8qKlxuICAqIENvbG9yIG9mIHRoZSBiYWNrZ3JvdW5kXG4gICogQHBhcmFtIHtzdHJpbmd9IFtiYWNrZ3JvdW5kRmlsbD1cInRyYW5zcGFyZW50XCJdXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGJhY2tncm91bmRGaWxsID0gJ3RyYW5zcGFyZW50JyxcbiAgLyoqXG4gICogTmFtZXNwYWNlIGZvciBhbGwgaXRlbXMgbWFkZSBieSB0aGlzIGluc3RhbmNlIG9mIGJ1YmJsZUhlYXRtYXBcbiAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVzcGFjZT1cImQzc20tYnViYmxlXCJdXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG5hbWVzcGFjZSA9ICdkM3NtLWJ1YmJsZScsXG4gIC8qKlxuICAqIENsYXNzIG5hbWUgZm9yIGJ1YmJsZSBjb250YWluZXIgKDxnPiBlbGVtZW50KVxuICAqIEBwYXJhbSB7c3RyaW5nfSBbb2JqZWN0Q2xhc3M9XCJidWJibGVcIl1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb2JqZWN0Q2xhc3MgPSAnYnViYmxlJyxcbiAgLyoqXG4gICogRHVyYXRpb24gb2YgYWxsIHRyYW5zaXRpb25zIG9mIHRoaXMgZWxlbWVudFxuICAqIEBwYXJhbSB7bnVtYmVyfSBbdHJhbnNpdGlvbkR1cmF0aW9uPTEwMDBdXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHRyYW5zaXRpb25EdXJhdGlvbiA9IDEwMDAsXG4gIC8qKlxuICAqIEVhc2luZyBmdW5jdGlvbiBmb3IgdHJhbnNpdGlvbnNcbiAgKiBAcGFyYW0ge2QzLmVhc2V9IFtlYXNlRnVuYz1kMy5lYXNlRXhwXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBlYXNlRnVuYyA9IGQzLmVhc2VFeHAsXG5cbiAgLyoqXG4gICogU3RvcmVzIHRoZSBrZXlzIG9mIGFsbCB0aGUgY2VsbHNcbiAgKiBDYWxjdWxhdGVkIGFmdGVyIGJ1YmJsZUhlYXRtYXAgY2FsbGVkLlxuICAqIEBwYXJhbSB7c3RyaW5nW119IFtjZWxsS2V5cz11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGNlbGxLZXlzLFxuICAvKipcbiAgKiBTdG9yZXMgdGhlIGxpc3Qgb2YgdW5pcXVlIHhWYWx1ZXNcbiAgKiBDYWxjdWxhdGVkIGFmdGVyIGJ1YmJsZUhlYXRtYXAgY2FsbGVkLlxuICAqIEBwYXJhbSB7c3RyaW5nW119IFt4VmFsdWVzPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgeFZhbHVlcyxcbiAgLyoqXG4gICogU3RvcmVzIHRoZSBsaXN0IG9mIHVuaXF1ZSB5VmFsdWVzXG4gICogQ2FsY3VsYXRlZCBhZnRlciBidWJibGVIZWF0bWFwIGNhbGxlZC5cbiAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbeVZhbHVlcz11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHlWYWx1ZXMsXG4gIC8qKlxuICAqIFN0b3JlcyB0aGUgbGlzdCBvZiB1bmlxdWUgclZhbHVlc1xuICAqIENhbGN1bGF0ZWQgYWZ0ZXIgYnViYmxlSGVhdG1hcCBjYWxsZWQuXG4gICogQHBhcmFtIHtzdHJpbmdbXX0gW3JWYWx1ZXM9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICByVmFsdWVzLFxuICAvKipcbiAgKiBTdG9yZXMgdGhlIGxpc3Qgb2YgdW5pcXVlIHZWYWx1ZXNcbiAgKiBDYWxjdWxhdGVkIGFmdGVyIGJ1YmJsZUhlYXRtYXAgY2FsbGVkLlxuICAqIEBwYXJhbSB7c3RyaW5nW119IFt2VmFsdWVzPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdlZhbHVlcyxcblxuICB4S2V5U29ydGluZ0Z1bmN0aW9uID0gZnVuY3Rpb24oYSwgYikgeyByZXR1cm4geEV4dHJhY3RvcihhKSAtIHhFeHRyYWN0b3IoYikgfSxcbiAgeUtleVNvcnRpbmdGdW5jdGlvbiA9IGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIHlFeHRyYWN0b3IoYSkgLSB5RXh0cmFjdG9yKGIpIH0sXG4gIHJLZXlTb3J0aW5nRnVuY3Rpb24gPSBmdW5jdGlvbihhLCBiKSB7IHJldHVybiByRXh0cmFjdG9yKGEpIC0gckV4dHJhY3RvcihiKSB9LFxuICB2S2V5U29ydGluZ0Z1bmN0aW9uID0gZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gdkV4dHJhY3RvcihhKSAtIHZFeHRyYWN0b3IoYikgfSxcblxuICAvKipcbiAgKiBJbnN0YW5jZSBvZiBDb2xvckZ1bmN0aW9uIHdpdGggLmNvbG9yQnkgc2V0IHRvICdjYXRlZ29yeSdcbiAgKiBAZnVuY3Rpb24gY29sb3JGdW5jdGlvblxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBjb2xvckZ1bmN0aW9uID0gQ0YoKS5jb2xvckJ5KCdjYXRlZ29yeScpLFxuICAvKipcbiAgKiBJbnN0YW5jZSBvZiBUb29sdGlwXG4gICogQGZ1bmN0aW9uIHRvb2x0aXBcbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdG9vbHRpcCA9IFRUaXAoKSxcblxuICAvKipcbiAgKiBzdG9yZSB0aGUgc2l6ZSB0aGUgYnViYmxlIGNvdWxkIGJlIGluIHRoZSB4IGRpbWVuc2lvblxuICAqIHRoZSBhY3R1YWxsIHNpemUgb2YgdGhlIGJ1YmJsZSB3aWxsIGJlIHRoZSBtaW4gb2YgeFNpemUgYW5kIHtAbGluayBidWJibGVIZWF0bWFwI3lTaXplfVxuICAqIENhbGN1bGF0ZWQgYWZ0ZXIgYnViYmxlSGVhdG1hcCBjYWxsZWQuXG4gICogQHBhcmFtIHtzdHJpbmdbXX0gW3hTaXplPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgeFNpemUsXG4gIC8qKlxuICAqIHN0b3JlIHRoZSBzaXplIG9mIHRoZSBzcGFjZXIgaW4gdGhlIHggZGltZW5zaW9uXG4gICogQ2FsY3VsYXRlZCBhZnRlciBidWJibGVIZWF0bWFwIGNhbGxlZC5cbiAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbeFNwYWNlclNpemU9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB4U3BhY2VyU2l6ZSxcblxuICAvKipcbiAgKiBzdG9yZSB0aGUgc2l6ZSB0aGUgYnViYmxlIGNvdWxkIGJlIGluIHRoZSB5IGRpbWVuc2lvblxuICAqIHRoZSBhY3R1YWxsIHNpemUgb2YgdGhlIGJ1YmJsZSB3aWxsIGJlIHRoZSBtaW4gb2YgeFNpemUgYW5kIHtAbGluayBidWJibGVIZWF0bWFwI3hTaXplfVxuICAqIENhbGN1bGF0ZWQgYWZ0ZXIgYnViYmxlSGVhdG1hcCBjYWxsZWQuXG4gICogQHBhcmFtIHtzdHJpbmdbXX0gW3lTaXplPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgeVNpemUsXG4gIC8qKlxuICAqIHN0b3JlIHRoZSBzaXplIG9mIHRoZSBzcGFjZXIgaW4gdGhlIHkgZGltZW5zaW9uLlxuICAqIENhbGN1bGF0ZWQgYWZ0ZXIgYnViYmxlSGVhdG1hcCBjYWxsZWQuXG4gICogQHBhcmFtIHtzdHJpbmdbXX0gW3hTcGFjZXJTaXplPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgeVNwYWNlclNpemVcblxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBzZWxlY3Rpb24gaW4gd2hpY2ggaXRlbXMgYXJlIG1hbmlwdWxhdGVkXG4gICAqIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IGQzLnNlbGVjdGlvbn1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc2VsZWN0aW9uID0gc2VsZWN0aW9uXG4gICAqL1xuICBiaG0uc2VsZWN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzZWxlY3Rpb24gPSBfLCBiaG0pIDogc2VsZWN0aW9uOyB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGRhdGFcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNkYXRhfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgb2JqZWN0fVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICovXG4gIGJobS5kYXRhID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkYXRhID0gXywgYmhtKSA6IGRhdGE7IH1cbiAgLy8gYmhtLm9yaWVudCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob3JpZW50ID0gXywgYmhtKSA6IG9yaWVudDsgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBhbW91bnQgb2YgaG9yaXpvbnRhbCBzcGFjZSBpbiB3aGljaCBpdGVtcyBhcmUgbWFuaXB1bGF0ZWRcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNzcGFjZVh9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV0gc2hvdWxkIGJlIGEgbnVtYmVyID4gMFxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc3BhY2VYID0gdW5kZWZpbmVkXG4gICAqL1xuICBiaG0uc3BhY2VYID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzcGFjZVggPSBfLCBiaG0pIDogc3BhY2VYOyB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGFtb3VudCBvZiB2ZXJ0aWNhbCBzcGFjZSBpbiB3aGljaCBpdGVtcyBhcmUgbWFuaXB1bGF0ZWRcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNzcGFjZVl9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV0gc2hvdWxkIGJlIGEgbnVtYmVyID4gMFxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc3BhY2VZID0gdW5kZWZpbmVkXG4gICAqL1xuICBiaG0uc3BhY2VZID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzcGFjZVkgPSBfLCBiaG0pIDogc3BhY2VZOyB9XG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgeEtleVxuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3hLZXl9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHhLZXkgPSAneCdcbiAgICovXG4gIGJobS54S2V5ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4S2V5ID0gXywgYmhtKSA6IHhLZXk7IH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgeUtleVxuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3lLZXl9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHlLZXkgPSAneSdcbiAgICovXG4gIGJobS55S2V5ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5S2V5ID0gXywgYmhtKSA6IHlLZXk7IH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgcktleVxuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3JLZXl9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHJLZXkgPSAncidcbiAgICovXG4gIGJobS5yS2V5ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyS2V5ID0gXywgYmhtKSA6IHJLZXk7IH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgdktleVxuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3ZLZXl9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHZLZXkgPSAneSdcbiAgICovXG4gIGJobS52S2V5ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2S2V5ID0gXywgYmhtKSA6IHZLZXk7IH1cblxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBjZWxsS2V5c1xuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI2NlbGxLZXlzfSlcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBzdHJpbmdbXX1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgY2VsbEtleXMgPSB1bmRlZmluZWRcbiAgICovXG4gIGJobS5jZWxsS2V5cyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY2VsbEtleXMgPSBfLCBiaG0pIDogY2VsbEtleXM7IH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgeFZhbHVlc1xuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3hWYWx1ZXN9KVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IHN0cmluZ1tdfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB4VmFsdWVzID0gdW5kZWZpbmVkXG4gICAqL1xuICBiaG0ueFZhbHVlcyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeFZhbHVlcyA9IF8sIGJobSkgOiB4VmFsdWVzOyB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHlWYWx1ZXNcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCN5VmFsdWVzfSlcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBzdHJpbmdbXX1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgeVZhbHVlcyA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYmhtLnlWYWx1ZXMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHlWYWx1ZXMgPSBfLCBiaG0pIDogeVZhbHVlczsgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSByVmFsdWVzXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjclZhbHVlc30pXG4gICAqIEBwYXJhbSB7bnVtYmVyW119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgbnVtYmVyW119XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHJWYWx1ZXMgPSB1bmRlZmluZWRcbiAgICovXG4gIGJobS5yVmFsdWVzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyVmFsdWVzID0gXywgYmhtKSA6IHJWYWx1ZXM7IH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgdlZhbHVlc1xuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3ZWYWx1ZXN9KVxuICAgKiBAcGFyYW0ge251bWJlcltdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IG51bWJlcltdfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB2VmFsdWVzID0gdW5kZWZpbmVkXG4gICAqL1xuICBiaG0udlZhbHVlcyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodlZhbHVlcyA9IF8sIGJobSkgOiB2VmFsdWVzOyB9XG5cblxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSB4RXh0cmFjdG9yXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjeEV4dHJhY3Rvcn0pXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgZnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHhFeHRyYWN0b3IgPSB1bmRlZmluZWRcbiAgICovXG4gIGJobS54RXh0cmFjdG9yID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4RXh0cmFjdG9yID0gXywgYmhtKSA6IHhFeHRyYWN0b3I7IH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgeUV4dHJhY3RvclxuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3lFeHRyYWN0b3J9KVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IGZ1bmN0aW9ufVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB5RXh0cmFjdG9yID0gdW5kZWZpbmVkXG4gICAqL1xuICBiaG0ueUV4dHJhY3RvciA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeUV4dHJhY3RvciA9IF8sIGJobSkgOiB5RXh0cmFjdG9yOyB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHJFeHRyYWN0b3JcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNyRXh0cmFjdG9yfSlcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBmdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgckV4dHJhY3RvciA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYmhtLnJFeHRyYWN0b3IgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJFeHRyYWN0b3IgPSBfLCBiaG0pIDogckV4dHJhY3RvcjsgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSB2RXh0cmFjdG9yXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjdkV4dHJhY3Rvcn0pXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgZnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHZFeHRyYWN0b3IgPSB1bmRlZmluZWRcbiAgICovXG4gIGJobS52RXh0cmFjdG9yID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2RXh0cmFjdG9yID0gXywgYmhtKSA6IHZFeHRyYWN0b3I7IH1cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgd2hldGhlciBvciBub3QgYnViYmxlSGVhdG1hcCBpcyBhbGxvd2VkIHRvIGdvIGJleW9uZCBzcGVjaWZpZWQgZGltZW5zaW9uc1xuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3NwYWNlWH0pXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBib29sZWFufVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvdmVyZmxvd1EgPSBmYWxzZVxuICAgKi9cbiAgYmhtLm92ZXJmbG93USA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob3ZlcmZsb3dRID0gXywgYmhtKSA6IG92ZXJmbG93UTsgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNjYWxlIGZvciB3aGljaCB0aGUgcmFkaXVzIG9mIGJ1YmJsZXMgc2hvdWxkIGJlIHRyYW5zZm9ybWVkIGJ5XG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjc2NhbGV9KVxuICAgKiBAcGFyYW0ge2QzLnNjYWxlfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IGQzLnNjYWxlfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzY2FsZSA9IGQzLnNjYWxlTGluZWFyKClcbiAgICovXG4gIGJobS5zY2FsZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2NhbGUgPSBfLCBiaG0pIDogc2NhbGU7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgcGFkZGluZyBmb3IgdGhlIGRvbWFpbiBvZiB0aGUgc2NhbGVcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNkb21haW5QYWRkaW5nfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBkb21haW5QYWRkaW5nID0gMC41XG4gICAqL1xuICBiaG0uZG9tYWluUGFkZGluZyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluUGFkZGluZyA9IF8sIGJobSkgOiBkb21haW5QYWRkaW5nOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgb2JqZWN0U3BhY2VyXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjb2JqZWN0U3BhY2VyfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvYmplY3RTcGFjZXIgPSAwLjBcbiAgICovXG4gIGJobS5vYmplY3RTcGFjZXIgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9iamVjdFNwYWNlciA9IF8sIG9iamVjdFNwYWNlcikgOiBkYXRhOyB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbWluT2JqZWN0U2l6ZVxuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI21pbk9iamVjdFNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG1pbk9iamVjdFNpemUgPSA1MFxuICAgKi9cbiAgYmhtLm1pbk9iamVjdFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG1pbk9iamVjdFNpemUgPSBfLCBiaG0pIDogbWluT2JqZWN0U2l6ZTsgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG1heE9iamVjdFNpemVcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNtYXhPYmplY3RTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBtYXhPYmplY3RTaXplID0gMTAwXG4gICAqL1xuICBiaG0ubWF4T2JqZWN0U2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobWF4T2JqZWN0U2l6ZSA9IF8sIGJobSkgOiBtYXhPYmplY3RTaXplOyB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgYnViYmxlU3Ryb2tlV2lkdGhcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNidWJibGVTdHJva2VXaWR0aH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgYnViYmxlU3Ryb2tlV2lkdGggPSAyXG4gICAqL1xuICBiaG0uYnViYmxlU3Ryb2tlV2lkdGggPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGJ1YmJsZVN0cm9rZVdpZHRoID0gXywgYmhtKSA6IGJ1YmJsZVN0cm9rZVdpZHRoOyB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgYmFja2dyb3VuZEZpbGxcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNiYWNrZ3JvdW5kRmlsbH0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgYmFja2dyb3VuZEZpbGwgPSAndHJhbnNwYXJlbnQnXG4gICAqL1xuICBiaG0uYmFja2dyb3VuZEZpbGwgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGJhY2tncm91bmRGaWxsID0gXywgYmhtKSA6IGJhY2tncm91bmRGaWxsOyB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbmFtZXNwYWNlXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjbmFtZXNwYWNlfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBuYW1lc3BhY2UgPSAnZDNzbS1idWJibGVIZWF0bWFwJ1xuICAgKi9cbiAgYmhtLm5hbWVzcGFjZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobmFtZXNwYWNlID0gXywgYmhtKSA6IG5hbWVzcGFjZTsgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG9iamVjdENsYXNzXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjb2JqZWN0Q2xhc3N9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG9iamVjdENsYXNzID0gJ3RpY2stZ3JvdXAnXG4gICAqL1xuICBiaG0ub2JqZWN0Q2xhc3MgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9iamVjdENsYXNzID0gXywgYmhtKSA6IG9iamVjdENsYXNzOyB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdHJhbnNpdGlvbkR1cmF0aW9uXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjdHJhbnNpdGlvbkR1cmF0aW9ufSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0cmFuc2l0aW9uRHVyYXRpb24gPSAxMDAwXG4gICAqL1xuICBiaG0udHJhbnNpdGlvbkR1cmF0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0cmFuc2l0aW9uRHVyYXRpb24gPSBfLCBiaG0pIDogdHJhbnNpdGlvbkR1cmF0aW9uOyB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgZWFzZUZ1bmNcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNlYXNlRnVuY30pXG4gICAqIEBwYXJhbSB7ZDMuZWFzZX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBkMy5lYXNlfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBlYXNlRnVuYyA9IGQzLmVhc2VFeHBcbiAgICovXG4gIGJobS5lYXNlRnVuYyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZWFzZUZ1bmMgPSBfLCBiaG0pIDogZWFzZUZ1bmM7IH1cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRvb2x0aXBcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCN0b29sdGlwfSlcbiAgICogQHBhcmFtIHt0b29sdGlwfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IHRvb2x0aXB9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHRvb2x0aXAgPSB0b29sdGlwKClcbiAgICovXG4gIGJobS50b29sdGlwID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0b29sdGlwID0gXywgYmhtKSA6IHRvb2x0aXA7IH1cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHhTaXplXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjeFNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHhTaXplID0gdW5kZWZpbmVkXG4gICAqL1xuICBiaG0ueFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHhTaXplID0gXywgYmhtKSA6IHhTaXplOyB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgeFNwYWNlclNpemVcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCN4U3BhY2VyU2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgeFNwYWNlclNpemUgPSB1bmRlZmluZWRcbiAgICovXG4gIGJobS54U3BhY2VyU2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeFNwYWNlclNpemUgPSBfLCBiaG0pIDogeFNwYWNlclNpemU7IH1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB5U2l6ZVxuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3lTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB5U2l6ZSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYmhtLnlTaXplID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5U2l6ZSA9IF8sIGJobSkgOiB5U2l6ZTsgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHlTcGFjZXJTaXplXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjeVNwYWNlclNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHlTcGFjZXJTaXplID0gdW5kZWZpbmVkXG4gICAqL1xuICBiaG0ueVNwYWNlclNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHlTcGFjZXJTaXplID0gXywgYmhtKSA6IHlTcGFjZXJTaXplOyB9XG4gIC8vIGJobS55S2V5U29ydGluZ0Z1bmN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5S2V5U29ydGluZ0Z1bmN0aW9uID0gXywgYmhtKSA6IHlLZXlTb3J0aW5nRnVuY3Rpb247IH1cbiAgLy8gYmhtLnhLZXlTb3J0aW5nRnVuY3Rpb24gPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHhLZXlTb3J0aW5nRnVuY3Rpb24gPSBfLCBiaG0pIDogeEtleVNvcnRpbmdGdW5jdGlvbjsgfVxuXG5cblxuICBmdW5jdGlvbiBiaG0oKSB7XG4gICAgdmFyIGhvcml6b250YWxRID0gdHJ1ZTsgLy8gbm8gb3JpZW50YXRpb24gaW4gaGVhdG1hcHMuIEFpZHMgYXMgcGxhY2Vob2xkZXIgaW4gZnVuY3Rpb25zIHRoYXQgdGFrZSBvcmllbnQgYXMgYSBwYXJhbWV0ZXJcbiAgICB2YXIgYmdjcFJlY3QgPSB7eDowLCB5OjAsIHdpZHRoOiBzcGFjZVgsIGhlaWdodDpzcGFjZVl9XG4gICAgdmFyIGNvbnRhaW5lciA9IHNldHVwQ29udGFpbmVyKCBzZWxlY3Rpb24sIG5hbWVzcGFjZSwgYmdjcFJlY3QsIGJhY2tncm91bmRGaWxsICk7XG5cbiAgICBjZWxsS2V5cyA9IGQzLmtleXMoZGF0YSk7XG4gICAgY2VsbEtleXMuc29ydChmdW5jdGlvbihhLCBiKXsgcmV0dXJuIHhLZXlTb3J0aW5nRnVuY3Rpb24oYSwgYikgfHwgeUtleVNvcnRpbmdGdW5jdGlvbihhLCBiKSB9KVxuICAgIGxvZygnYnViYmxlSGVhdG1hcCcsICdjZWxscyBhcmUgc29ydGVkIGJ5JywgY2VsbEtleXMpXG5cblxuXG4gICAgeFZhbHVlcyA9IHVuaXF1ZShjZWxsS2V5cy5tYXAoeEV4dHJhY3RvcikpO1xuICAgIHlWYWx1ZXMgPSB1bmlxdWUoY2VsbEtleXMubWFwKHlFeHRyYWN0b3IpKTtcbiAgICByVmFsdWVzID0gdW5pcXVlKGNlbGxLZXlzLm1hcChyRXh0cmFjdG9yKSk7XG4gICAgdlZhbHVlcyA9IHVuaXF1ZShjZWxsS2V5cy5tYXAodkV4dHJhY3RvcikpO1xuICAgIGxvZygnYnViYmxlSGVhdG1hcCcsICd4IGFuZCB5IGtleXMgYXJlJywge3g6IHhWYWx1ZXMsIHk6eVZhbHVlc30pXG5cblxuICAgIHZhciB4RGltID0geFZhbHVlcy5sZW5ndGgsIHlEaW0gPSB5VmFsdWVzLmxlbmd0aDtcblxuXG4gICAgdmFyIGV4dGVudCA9IFtNYXRoLm1pbiguLi5yVmFsdWVzKSAtIGRvbWFpblBhZGRpbmcsTWF0aC5tYXgoLi4uclZhbHVlcykgKyBkb21haW5QYWRkaW5nXTtcblxuXG4gICAgeVNpemUgPSBjYWxjdWxhdGVXaWR0aE9mT2JqZWN0KHNwYWNlWSwgeURpbSwgbWluT2JqZWN0U2l6ZSwgbWF4T2JqZWN0U2l6ZSwgb2JqZWN0U3BhY2VyLCBvdmVyZmxvd1EpXG4gICAgeFNpemUgPSBjYWxjdWxhdGVXaWR0aE9mT2JqZWN0KHNwYWNlWCwgeERpbSwgbWluT2JqZWN0U2l6ZSwgbWF4T2JqZWN0U2l6ZSwgb2JqZWN0U3BhY2VyLCBvdmVyZmxvd1EpXG4gICAgeVNwYWNlclNpemUgPSBjYWxjdWxhdGVXaWR0aE9mU3BhY2VyKHlWYWx1ZXMsIHNwYWNlWSwgeVNpemUsIHlEaW0sIG9iamVjdFNwYWNlciwgb3ZlcmZsb3dRKVxuICAgIHhTcGFjZXJTaXplID0gY2FsY3VsYXRlV2lkdGhPZlNwYWNlcih4VmFsdWVzLCBzcGFjZVgsIHhTaXplLCB4RGltLCBvYmplY3RTcGFjZXIsIG92ZXJmbG93USlcbiAgICBsb2coJ2J1YmJsZUhlYXRtYXAnLCAnc2l6ZSBvZicsIHt4OiB4U2l6ZSwgeTogeVNpemV9KVxuXG5cbiAgICBzY2FsZS5kb21haW4oZXh0ZW50KS5yYW5nZShbMCwgTWF0aC5taW4oeVNpemUsIHhTaXplKS8yXSlcblxuICAgIHZhciB5U3BhY2VyID0gZ3JvdXBpbmdTcGFjZXIoKVxuICAgIC5ob3Jpem9udGFsUShmYWxzZSlcbiAgICAubW92ZWJ5KCdjYXRlZ29yeScpLm51bWJlck9mT2JqZWN0cyh5RGltKVxuICAgIC5vYmplY3RDbGFzcyhoeXBlbmF0ZShvYmplY3RDbGFzcywgJ3JvdycpKVxuICAgIC5vYmplY3RTaXplKHlTaXplKS5zcGFjZXJTaXplKHlTcGFjZXJTaXplKVxuICAgIC50cmFuc2l0aW9uRHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlRnVuYyhlYXNlRnVuYylcbiAgICAubmFtZXNwYWNlKCdyb3cnKVxuXG4gICAgdmFyIHhTcGFjZXIgPSBncm91cGluZ1NwYWNlcigpXG4gICAgLmhvcml6b250YWxRKHRydWUpXG4gICAgLm1vdmVieSgnY2F0ZWdvcnknKS5udW1iZXJPZk9iamVjdHMoeERpbSlcbiAgICAub2JqZWN0Q2xhc3Mob2JqZWN0Q2xhc3MpXG4gICAgLm9iamVjdFNpemUoeFNpemUpLnNwYWNlclNpemUoeFNwYWNlclNpemUpXG4gICAgLnRyYW5zaXRpb25EdXJhdGlvbih0cmFuc2l0aW9uRHVyYXRpb24pLmVhc2VGdW5jKGVhc2VGdW5jKVxuXG5cbiAgICB5U3BhY2VyKGNvbnRhaW5lciwgeVZhbHVlcywgMClcbiAgICBjb250YWluZXIuc2VsZWN0QWxsKCdnLicraHlwZW5hdGUob2JqZWN0Q2xhc3MsICdyb3cnKSlcbiAgICAuZWFjaChmdW5jdGlvbihkLCBpKXtcbiAgICAgIHhTcGFjZXIoZDMuc2VsZWN0KHRoaXMpLCB4VmFsdWVzLCAwKVxuICAgIH0pXG4gICAgdmFyIGNlbGxzID0gY29udGFpbmVyLnNlbGVjdEFsbCgnZzpub3QoLnRvLXJlbW92ZSkuJytvYmplY3RDbGFzcykuZGF0YShjZWxsS2V5cyk7XG5cbiAgICB2YXIgcGFyZW50SW5kZXhBcnJheSA9IFtdXG4gICAgY2VsbHMuZWFjaChmdW5jdGlvbihkLCBpKXsgcGFyZW50SW5kZXhBcnJheS5wdXNoKE51bWJlcihkMy5zZWxlY3QodGhpcykuYXR0cigncGFyZW50LWluZGV4JykpKSB9KVxuXG5cbiAgICBjb2xvckZ1bmN0aW9uID0gY29sb3JGdW5jdGlvbi5jb2xvckJ5KCkgPT0gJ2luZGV4J1xuICAgID8gY29sb3JGdW5jdGlvbi5kYXRhRXh0ZW50KFswLCBNYXRoLm1heCguLi5wYXJlbnRJbmRleEFycmF5KV0pXG4gICAgOiBjb2xvckZ1bmN0aW9uLmRhdGFFeHRlbnQoZXh0ZW50KVxuXG4gICAgY2VsbHMuZWFjaChmdW5jdGlvbihrZXksIGkpIHtcbiAgICAgIGxvZygnYnViYmxlSGVhdG1hcCcsICdlYWNoIGNlbGwnLCB7a2V5OiBrZXksIGluZGV4OiBpLCBub2RlOiBkMy5zZWxlY3QodGhpcykubm9kZSgpfSlcblxuICAgICAgdmFyIHQgPSBkMy5zZWxlY3QodGhpcyksXG4gICAgICBjdXJyZW50RGF0YSA9IGRhdGFba2V5XSxcbiAgICAgIHZhbHVlID0gdkV4dHJhY3RvcihrZXksIGkpLFxuICAgICAgcmFkaXVzPSByRXh0cmFjdG9yKGtleSwgaSksXG4gICAgICBpID0gdC5hdHRyKCdwYXJlbnQtaW5kZXgnKSA9PSB1bmRlZmluZWQgPyBpIDogdC5hdHRyKCdwYXJlbnQtaW5kZXgnKSxcbiAgICAgIGZpbGxDb2xvciA9IGNvbG9yRnVuY3Rpb24oa2V5LCB2YWx1ZSwgaSwgJ2ZpbGwnKSwgLy8gcHJldmVudCBkdXBsaWNhdGUgY29tcHV0YXRpb25cbiAgICAgIHN0cm9rZUNvbG9yID0gY29sb3JGdW5jdGlvbihrZXksIHZhbHVlLCBpLCAgJ3N0cm9rZScpXG5cbiAgICAgIHZhciBjID0gc2FmZVNlbGVjdCh0LCAnY2lyY2xlJywgaHlwZW5hdGUob2JqZWN0Q2xhc3MsJ2NpcmNsZScpKVxuICAgICAgYy5hdHRyKCdjeCcsIHhTaXplIC8gMilcbiAgICAgIC5hdHRyKCdjeScsIHlTaXplIC8gMiApXG4gICAgICAuYXR0cigncicsIHNjYWxlKHJhZGl1cykpXG4gICAgICAuYXR0cignZmlsbCcsIGZpbGxDb2xvcilcbiAgICAgIC5hdHRyKCdzdHJva2UnLCBzdHJva2VDb2xvcilcbiAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCBidWJibGVTdHJva2VXaWR0aClcblxuICAgIH0pXG5cbiAgICB0b29sdGlwLnNlbGVjdGlvbihjZWxscy5zZWxlY3RBbGwoJ2NpcmNsZS4nK2h5cGVuYXRlKG9iamVjdENsYXNzLCAnY2lyY2xlJykpKVxuICAgIC5kYXRhKGRhdGEpXG4gICAgLy8gLmtleXMoWydyJywgJ3YnXSlcbiAgICAvLyAuaGVhZGVyKGZ1bmN0aW9uKGQsIGkpe3JldHVybiBoeXBlbmF0ZShkYXRhW2RdW3hLZXldLCBkYXRhW2RdW3lLZXldKSB9KVxuXG4gICAgdG9vbHRpcCgpXG5cblxuICB9XG5cbiAgcmV0dXJuIGJobTtcbn1cblxuZXhwb3J0IHtidWJibGVIZWF0bWFwfVxuIiwiaW1wb3J0IHtoeXBlbmF0ZSwgc2FmZVNlbGVjdH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7c2V0dXBDb250YWluZXIsIGNhbGN1bGF0ZVdpZHRoT2ZPYmplY3QsIGNhbGN1bGF0ZVdpZHRoT2ZTcGFjZXIsIHdoaXNrZXJQYXRofSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7dW5pcXVlLCBoYXNRLCBmbGF0dGVufSBmcm9tICcuL2FycmF5LWZ1bmN0aW9ucyc7XG5pbXBvcnQge2dyb3VwaW5nU3BhY2VyfSBmcm9tICcuL2dyb3VwaW5nLXNwYWNlcic7XG5pbXBvcnQge2NvbG9yRnVuY3Rpb24gYXMgQ0Z9IGZyb20gJy4vY29sb3ItZnVuY3Rpb24nO1xuaW1wb3J0IHt0b29sdGlwIGFzIFRUaXB9IGZyb20gJy4vdG9vbHRpcCc7XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9YIEFORCBXSElTS0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqXG4gKiBDcmVhdGVzIGEgYm94d2hpc2tlclxuICpcbiAqIHtAbGluayBodHRwczovL3N1bW5ldXJvbi5naXRsYWIuaW8vZDNzbS9kZW1vcy9ib3gtd2hpc2tlcnMvaW5kZXguaHRtbCBEZW1vfVxuICogQGNvbnN0cnVjdG9yIGJveHdoaXNrZXJcbiAqIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBzZWxlY3Rpb25cbiAqIEBuYW1lc3BhY2UgYm94d2hpc2tlclxuICogQHJldHVybnMge2Z1bmN0aW9ufSBib3h3aGlza2VyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBib3h3aGlza2VyKCBzZWxlY3Rpb24gKSB7XG4gIHZhclxuICAvKipcbiAgKiBEYXRhIHRvIHBsb3QuIEFzc3VtZWQgdG8gYmUgYSBvYmplY3QsIHdoZXJlIGVhY2gga2V5IGNvcnJlc3BvbmRzIHRvIGEgYm94XG4gICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNkYXRhfSlcbiAgKiBAcGFyYW0ge09iamVjdH0gW2RhdGE9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBkYXRhLFxuICAvKipcbiAgKiBXaGljaCBkaXJlY3Rpb24gdG8gcmVuZGVyIHRoZSBib3hlcyBpblxuICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjb3JpZW50fSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW29yaWVudD0naG9yaXpvbnRhbCddXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG9yaWVudCA9ICdob3Jpem9udGFsJyxcbiAgLyoqXG4gICogQW1vdW50IG9mIGhvcml6b250YWwgc3BhY2UgKGluIHBpeGVscykgYXZhaWJsZSB0byByZW5kZXIgdGhlIGJveHdoaXNrZXIgaW5cbiAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI3NwYWNlWH0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZVg9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzcGFjZVgsXG4gIC8qKlxuICAqIEFtb3VudCBvZiB2ZXJ0aWNhbCBzcGFjZSAoaW4gcGl4ZWxzKSBhdmFpYmxlIHRvIHJlbmRlciB0aGUgYm94d2hpc2tlciBpblxuICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIuc3BhY2VZfSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW3NwYWNlWT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNwYWNlWSxcbiAgLyoqXG4gICogV2hldGhlciBvciBub3QgdG8gYWxsb3cgYm94d2hpc2tlciB0byByZW5kZXIgZWxlbWVudHMgcGFzcyB0aGUgbWFpbiBzcGF0aWFsIGRpbWVuc2lvblxuICAqIGdpdmVuIHRoZSBvcmllbnRhdGlvbiAoc2VlIHtAbGluayBib3h3aGlza2VyI29yaWVudH0pLCB3aGVyZSB7QGxpbmsgYm94d2hpc2tlciNvcmllbnR9PVwiaG9yaXpvbnRhbFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBib3h3aGlza2VyI3NwYWNlWH0gYW5kIHdoZXJlIHtAbGluayBib3h3aGlza2VyI29yaWVudH09XCJ2ZXJ0aWNhbFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBib3h3aGlza2VyI3NwYWNlWX1cbiAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvdmVyZmxvd1E9ZmFsc2VdXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG92ZXJmbG93USA9IHRydWUsXG5cbiAgLyoqXG4gICogQW4gYXJyYXkgLSBwdXRhdGl2ZWx5IG9mIG90aGVyIGFycmF5cyAtIGRlcGljdGluZyBob3cgYm94ZXMgc2hvdWxkIGJlIGFycmFuZ2VkXG4gICogQHBhcmFtIHtBcnJheVtdfSBbZ3JvdXBpbmc9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBncm91cGluZyxcbiAgcXVhcnRpbGVzS2V5ID0gJ3F1YXJ0aWxlcycsIC8vIGtleSBpbiBvYmplY3Qgd2hlcmUgcXVhcnRpbGVzIGFyZSBzdG9yZWRcbiAgcXVhcnRpbGVzS2V5cyA9IFtcIjAuMDBcIiwgXCIwLjI1XCIsIFwiMC41MFwiLCBcIjAuNzVcIiwgXCIxLjAwXCJdLCAvLyBrZXlzIGluIHF1YXJ0aWxlcyBvYmplY3QgbWFwcGluZyB2YWx1ZXMgdG8gbWluLCBxMSwgcTIsIHEzIGFuZCBtYXhcblxuXG4gIC8qKlxuICAqIEhvdyB0byBnZXQgdGhlIHZhbHVlIG9mIHRoZSBib3h3aGlza2VyXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW3ZhbHVlRXh0cmFjdG9yPWZ1bmN0aW9uKGtleSwgaW5kZXgpIHsgcmV0dXJuIGRhdGFba2V5XVtxdWFydGlsZXNLZXldIH1dXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHZhbHVlRXh0cmFjdG9yID0gZnVuY3Rpb24oa2V5LCBpbmRleCkgeyByZXR1cm4gZGF0YVtrZXldW3F1YXJ0aWxlc0tleV0gfSxcbiAgLyoqXG4gICogSG93IHRvIHNvcnQgdGhlIGJveGVzIC0gaWYge0BsaW5rIGJveHdoaXNrZXIjZ3JvdXBpbmd9IGlzIG5vdCBwcm92aWRlZC5cbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbc29ydGluZ0Z1bmN0aW9uPWRlc2NlbmRpbmddXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICogZGVmYXVsdFxuICAqIGZ1bmN0aW9uKGtleUEsIGtleUIpIHtyZXR1cm4gZDMuZGVzY2VuZGluZyhcbiAgKiAgIHZhbHVlRXh0cmFjdG9yKGtleUEpW3F1YXJ0aWxlc0tleXNbNF1dLFxuICAqICAgdmFsdWVFeHRyYWN0b3Ioa2V5QilbcXVhcnRpbGVzS2V5c1s0XV1cbiAgKiApfVxuICAqL1xuICBzb3J0aW5nRnVuY3Rpb24gPSBmdW5jdGlvbihrZXlBLCBrZXlCKSB7cmV0dXJuIGQzLmRlc2NlbmRpbmcoXG4gICAgdmFsdWVFeHRyYWN0b3Ioa2V5QSlbcXVhcnRpbGVzS2V5c1s0XV0sXG4gICAgdmFsdWVFeHRyYWN0b3Ioa2V5QilbcXVhcnRpbGVzS2V5c1s0XV1cbiAgKX0sXG4gIC8qKlxuICAqIFRoZSBzY2FsZSBmb3Igd2hpY2ggYm94d2hpc2tlciB2YWx1ZXMgc2hvdWxkIGJlIHRyYW5zZm9ybWVkIGJ5XG4gICogQHBhcmFtIHtkMy5zY2FsZX0gW3NjYWxlPWQzLnNjYWxlTGluZWFyXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzY2FsZSA9IGQzLnNjYWxlTGluZWFyKCksXG4gIC8qKlxuICAqIFRoZSBwYWRkaW5nIGZvciB0aGUgZG9tYWluIG9mIHRoZSBzY2FsZSAoc2VlIHtAbGluayBib3h3aGlza2VyI3NjYWxlfSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW2RvbWFpblBhZGRpbmc9MC41XVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBkb21haW5QYWRkaW5nID0gMC41LFxuICAvKipcbiAgKiBEZWZhdWx0IHNwYWNlIGZvciB0aGUgc3BhY2VyIChwZXJjZW50YWdlKSBvZiBtYWluIGRpbWVuc2lvbiBnaXZlbiB0aGUgb3JpZW50YXRpb25cbiAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI29yaWVudH0pLCB3aGVyZSB7QGxpbmsgYm94d2hpc2tlciNvcmllbnR9PVwiaG9yaXpvbnRhbFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBib3h3aGlza2VyI3NwYWNlWH0gYW5kIHdoZXJlIHtAbGluayBib3h3aGlza2VyI29yaWVudH09XCJ2ZXJ0aWNhbFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBib3h3aGlza2VyI3NwYWNlWX0gYmV0d2VlbiBib3hlc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbb2JqZWN0U3BhY2VyPTAuMDVdXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG9iamVjdFNwYWNlciA9IDAuMDUsXG4gIC8qKlxuICAqIFRoZSBtaW5pbXVtIHNpemUgdGhhdCBhbiBvYmplY3QgY2FuIGJlXG4gICogQHBhcmFtIHtudW1iZXJ9IFttaW5PYmplY3RTaXplPTE1XVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBtaW5PYmplY3RTaXplID0gMTUsXG4gIC8qKlxuICAqIFRoZSBtYXhpbXVtIHNpemUgdGhhdCBhbiBvYmplY3QgY2FuIGJlXG4gICogQHBhcmFtIHtudW1iZXJ9IFttYXhPYmplY3RTaXplPTUwXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBtYXhPYmplY3RTaXplID0gNTAsXG4gIC8qKlxuICAqIFBlcmNlbnQgb2YgYm94IGFuZCB3aGlza2VyIHNpemUgdGhhdCB3aGlza2VycyB3aWxsIGJlIHJlbmRlcmVkXG4gICogc2VlIHtAbGluayBib3h3aGlza2VyI29iamVjdFNpemV9XG4gICogQHBhcmFtIHtudW1iZXJ9IFt3aGlza2VyV2lkdGhQZXJjZW50PTAuNl1cbiAgKiBAbWVtYmVyb2YgYm94d2hpc2tlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgd2hpc2tlcldpZHRoUGVyY2VudCA9IC42LFxuICAvKipcbiAgKiBJbnN0YW5jZSBvZiBDb2xvckZ1bmN0aW9uXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW2NvbG9yRnVuY3Rpb24gPSBjb2xvckZ1bmN0aW9uKCldXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGNvbG9yRnVuY3Rpb24gPSBDRigpLFxuICAvKipcbiAgKiBUaGUgc3Ryb2tlIHdpZHRoIG9mIHRoZSBib3hlc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbYm94U3Ryb2tlV2lkdGg9Ml1cbiAgKiBAbWVtYmVyb2YgYm94d2hpc2tlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgYm94U3Ryb2tlV2lkdGggPSAyLFxuICAvKipcbiAgKiBUaGUgc3Ryb2tlIHdpZHRoIG9mIHRoZSB3aGlza2Vyc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbd2hpc2tlclN0cm9rZVdpZHRoPTJdXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHdoaXNrZXJTdHJva2VXaWR0aCA9IDIsXG5cbiAgLyoqXG4gICogQ29sb3Igb2YgdGhlIGJhY2tncm91bmRcbiAgKiBAcGFyYW0ge3N0cmluZ30gW2JhY2tncm91bmRGaWxsPVwidHJhbnNwYXJlbnRcIl1cbiAgKiBAbWVtYmVyb2YgYm94d2hpc2tlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgYmFja2dyb3VuZEZpbGwgPSAndHJhbnNwYXJlbnQnLFxuICAvKipcbiAgKiBOYW1lc3BhY2UgZm9yIGFsbCBpdGVtcyBtYWRlIGJ5IHRoaXMgaW5zdGFuY2Ugb2YgYm94d2hpc2tlclxuICAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZXNwYWNlPVwiZDNzbS1ib3gtd2hpc2tlclwiXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBuYW1lc3BhY2UgPSAnZDNzbS1ib3gtd2hpc2tlcicsXG4gIC8qKlxuICAqIENsYXNzIG5hbWUgZm9yIGJveHdoaXNrZXIgY29udGFpbmVyICg8Zz4gZWxlbWVudClcbiAgKiBAcGFyYW0ge3N0cmluZ30gW29iamVjdENsYXNzPVwiYm94LXdoaXNrXCJdXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG9iamVjdENsYXNzID0gJ2JveC13aGlzaycsXG5cbiAgLyoqXG4gICogRHVyYXRpb24gb2YgYWxsIHRyYW5zaXRpb25zIG9mIHRoaXMgZWxlbWVudFxuICAqIEBwYXJhbSB7bnVtYmVyfSBbdHJhbnNpdGlvbkR1cmF0aW9uPTEwMDBdXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHRyYW5zaXRpb25EdXJhdGlvbiA9IDEwMDAsXG4gIC8qKlxuICAqIEVhc2luZyBmdW5jdGlvbiBmb3IgdHJhbnNpdGlvbnNcbiAgKiBAcGFyYW0ge2QzLmVhc2V9IFtlYXNlRnVuYz1kMy5lYXNlRXhwXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBlYXNlRnVuYyA9IGQzLmVhc2VFeHAsXG5cbiAgLyoqXG4gICogVGhlIGtleXMgb2YgdGhlIGJveGVzXG4gICogQHBhcmFtIHtzdHJpbmdbXX0gW2JveEtleXM9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBib3hLZXlzLFxuICAvKipcbiAgKiBUaGUgdmFsdWVzIG9mIHRoZSBib3hlc1xuICAqIEBwYXJhbSB7c3RyaW5nW119IFtib3hWYWx1ZXM9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBib3hWYWx1ZXMsXG4gIC8qKlxuICAqIFRoZSBvYmplY3RTaXplIChhY3R1YWwgd2lkdGgpIHVzZWQgYnkgdGhlIGJveGVzXG4gICogQHBhcmFtIHtudW1iZXJ9IFtvYmplY3RTaXplPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYm94d2hpc2tlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb2JqZWN0U2l6ZSxcbiAgLyoqXG4gICogVGhlIHNwYWNlclNpemUgKGFjdHVhbCB3aWR0aCkgdXNlZCBieSB0aGUgc3BhY2VycyBiZXR3ZWVuIHRoZSBib3hlc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbc3BhY2VyU2l6ZT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNwYWNlclNpemUsXG4gIC8qKlxuICAqIEluc3RhbmNlIG9mIFRvb2x0aXBcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbdG9vbHRpcD10b29sdGlwKCldXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHRvb2x0aXAgPSBUVGlwKClcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgc2VsZWN0aW9uIGluIHdoaWNoIGl0ZW1zIGFyZSBtYW5pcHVsYXRlZFxuICAgKiBAcGFyYW0ge2QzLnNlbGVjdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBkMy5zZWxlY3Rpb259XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNlbGVjdGlvbiA9IHNlbGVjdGlvblxuICAgKi9cbiAgYm94d2hpc2tlci5zZWxlY3Rpb24gPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNlbGVjdGlvbiA9IF8sIGJveHdoaXNrZXIpIDogc2VsZWN0aW9uOyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBkYXRhXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjZGF0YX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IG9iamVjdH1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqL1xuICBib3h3aGlza2VyLmRhdGEgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRhdGEgPSBfLCBib3h3aGlza2VyKSA6IGRhdGE7IH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIG9yaWVudCBvZiB0aGUgYm94ZXNcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNvcmllbnR9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBvYmplY3R9XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKi9cbiAgYm94d2hpc2tlci5vcmllbnQgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9yaWVudCA9IF8sIGJveHdoaXNrZXIpIDogb3JpZW50OyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBhbW91bnQgb2YgaG9yaXpvbnRhbCBzcGFjZSBpbiB3aGljaCBpdGVtcyBhcmUgbWFuaXB1bGF0ZWRcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNzcGFjZVh9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV0gc2hvdWxkIGJlIGEgbnVtYmVyID4gMFxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc3BhY2VYID0gdW5kZWZpbmVkXG4gICAqL1xuICBib3h3aGlza2VyLnNwYWNlWCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3BhY2VYID0gXywgYm94d2hpc2tlcikgOiBzcGFjZVg7IH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGFtb3VudCBvZiB2ZXJ0aWNhbCBzcGFjZSBpbiB3aGljaCBpdGVtcyBhcmUgbWFuaXB1bGF0ZWRcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNzcGFjZVl9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV0gc2hvdWxkIGJlIGEgbnVtYmVyID4gMFxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc3BhY2VZID0gdW5kZWZpbmVkXG4gICAqL1xuICBib3h3aGlza2VyLnNwYWNlWSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3BhY2VZID0gXywgYm94d2hpc2tlcikgOiBzcGFjZVk7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB3aGV0aGVyIG9yIG5vdCBib3h3aGlza2VyIGlzIGFsbG93ZWQgdG8gZ28gYmV5b25kIHNwZWNpZmllZCBkaW1lbnNpb25zXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjb3ZlcmZsb3dRfSlcbiAgICogQHBhcmFtIHtib29sZWFufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IGJvb2xlYW59XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG92ZXJmbG93USA9IGZhbHNlXG4gICAqL1xuICBib3h3aGlza2VyLm92ZXJmbG93USA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob3ZlcmZsb3dRID0gXywgYm94d2hpc2tlcikgOiBvdmVyZmxvd1E7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgZ3JvdXBpbmcgb2YgdGhlIGJveGVzXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjZ3JvdXBpbmd9KVxuICAgKiBAcGFyYW0ge0FycmF5W119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgQXJyYXlbXX1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgZ3JvdXBpbmcgPSB1bmRlZmluZWRcbiAgICovXG4gIGJveHdoaXNrZXIuZ3JvdXBpbmcgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGdyb3VwaW5nID0gXywgYm94d2hpc2tlcikgOiBncm91cGluZzsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBxdWFydGlsZXNLZXlcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNxdWFydGlsZXNLZXl9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHF1YXJ0aWxlc0tleSA9IHF1YXJ0aWxlc1xuICAgKi9cbiAgYm94d2hpc2tlci5xdWFydGlsZXNLZXkgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHF1YXJ0aWxlc0tleSA9IF8sIGJveHdoaXNrZXIpIDogcXVhcnRpbGVzS2V5OyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHF1YXJ0aWxlc0tleXNcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNxdWFydGlsZXNLZXlzfSlcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBzdHJpbmdbXX1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgcXVhcnRpbGVzS2V5cyA9IFtRMCwgUTEsIFEyLCBRMywgUTRdXG4gICAqL1xuICBib3h3aGlza2VyLnF1YXJ0aWxlc0tleXMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHF1YXJ0aWxlc0tleXMgPSBfLCBib3h3aGlza2VyKSA6IHF1YXJ0aWxlc0tleXM7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdmFsdWVFeHRyYWN0b3JcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciN2YWx1ZUV4dHJhY3Rvcn0pXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgZnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHZhbHVlRXh0cmFjdG9yID0gZnVuY3Rpb24oa2V5LCBpbmRleCkgeyByZXR1cm4gZGF0YVtrZXldW3F1YXJ0aWxlc0tleV0gfSxcbiAgICovXG5cbiAgYm94d2hpc2tlci52YWx1ZUV4dHJhY3RvciA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmFsdWVFeHRyYWN0b3IgPSBfLCBib3h3aGlza2VyKSA6IHZhbHVlRXh0cmFjdG9yOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNvcnRpbmdGdW5jdGlvblxuICAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI3NvcnRpbmdGdW5jdGlvbn0pXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgZnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNvcnRpbmdGdW5jdGlvbiA9IGZ1bmN0aW9uKGtleUEsIGtleUIpIHtyZXR1cm4gZDMuZGVzY2VuZGluZyhcbiAgICogICB2YWx1ZUV4dHJhY3RvcihrZXlBKVtxdWFydGlsZXNLZXlzWzRdXSxcbiAgICogICB2YWx1ZUV4dHJhY3RvcihrZXlCKVtxdWFydGlsZXNLZXlzWzRdXVxuICAgKiApfSxcbiAgICovXG4gIGJveHdoaXNrZXIuc29ydGluZ0Z1bmN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzb3J0aW5nRnVuY3Rpb24gPSBfLCBib3h3aGlza2VyKSA6IHNvcnRpbmdGdW5jdGlvbjsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBzY2FsZSBmb3Igd2hpY2ggdGhlIGJveHdoaXNrZXIgdmFsdWVzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBieVxuICAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI3NjYWxlfSlcbiAgICogQHBhcmFtIHtkMy5zY2FsZX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBkMy5zY2FsZX1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc2NhbGUgPSBkMy5zY2FsZUxpbmVhcigpXG4gICAqL1xuICBib3h3aGlza2VyLnNjYWxlID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzY2FsZSA9IF8sIGJveHdoaXNrZXIpIDogc2NhbGU7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgcGFkZGluZyBmb3IgdGhlIGRvbWFpbiBvZiB0aGUgc2NhbGVcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNkb21haW5QYWRkaW5nfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBkb21haW5QYWRkaW5nID0gMC41XG4gICAqL1xuICBib3h3aGlza2VyLmRvbWFpblBhZGRpbmcgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpblBhZGRpbmcgPSBfLCBib3h3aGlza2VyKSA6IGRvbWFpblBhZGRpbmc7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyBvYmplY3RTcGFjZXJcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNvYmplY3RTcGFjZXJ9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG9iamVjdFNwYWNlciA9IDAuMDVcbiAgICovXG4gIGJveHdoaXNrZXIub2JqZWN0U3BhY2VyID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvYmplY3RTcGFjZXIgPSBfLCBib3h3aGlza2VyKSA6IG9iamVjdFNwYWNlcjsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBtaW5PYmplY3RTaXplXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjbWluT2JqZWN0U2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgbWluT2JqZWN0U2l6ZSA9IDE1XG4gICAqL1xuICBib3h3aGlza2VyLm1pbk9iamVjdFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG1pbk9iamVjdFNpemUgPSBfLCBib3h3aGlza2VyKSA6IG1pbk9iamVjdFNpemU7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbWF4T2JqZWN0U2l6ZVxuICAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI21heE9iamVjdFNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG1heE9iamVjdFNpemUgPSA1MFxuICAgKi9cbiAgYm94d2hpc2tlci5tYXhPYmplY3RTaXplID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChtYXhPYmplY3RTaXplID0gXywgYm94d2hpc2tlcikgOiBtYXhPYmplY3RTaXplOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHdoaXNrZXJXaWR0aFBlcmNlbnRcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciN3aGlza2VyV2lkdGhQZXJjZW50fSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBtYXhPYmplY3RTaXplID0gMC42XG4gICAqL1xuICBib3h3aGlza2VyLndoaXNrZXJXaWR0aFBlcmNlbnQgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHdoaXNrZXJXaWR0aFBlcmNlbnQgPSBfLCBib3h3aGlza2VyKSA6IHdoaXNrZXJXaWR0aFBlcmNlbnQ7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgY29sb3JGdW5jdGlvblxuICAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI2NvbG9yRnVuY3Rpb259KVxuICAgKiBAcGFyYW0ge2NvbG9yRnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgY29sb3JGdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgY29sb3JGdW5jdGlvbiA9IGNvbG9yRnVuY3Rpb24oKVxuICAgKi9cbiAgYm94d2hpc2tlci5jb2xvckZ1bmN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjb2xvckZ1bmN0aW9uID0gXywgYm94d2hpc2tlcikgOiBjb2xvckZ1bmN0aW9uOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGJveFN0cm9rZVdpZHRoXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjYm94U3Ryb2tlV2lkdGh9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGJveFN0cm9rZVdpZHRoID0gMlxuICAgKi9cbiAgYm94d2hpc2tlci5ib3hTdHJva2VXaWR0aCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYm94U3Ryb2tlV2lkdGggPSBfLCBib3h3aGlza2VyKSA6IGJveFN0cm9rZVdpZHRoOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHdoaXNrZXJTdHJva2VXaWR0aFxuICAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI3doaXNrZXJTdHJva2VXaWR0aH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgd2hpc2tlclN0cm9rZVdpZHRoID0gMlxuICAgKi9cbiAgYm94d2hpc2tlci53aGlza2VyU3Ryb2tlV2lkdGggPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHdoaXNrZXJTdHJva2VXaWR0aCA9IF8sIGJveHdoaXNrZXIpIDogd2hpc2tlclN0cm9rZVdpZHRoOyB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgYmFja2dyb3VuZEZpbGxcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNiYWNrZ3JvdW5kRmlsbH0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgYmFja2dyb3VuZEZpbGwgPSAndHJhbnNwYXJlbnQnXG4gICAqL1xuICBib3h3aGlza2VyLmJhY2tncm91bmRGaWxsID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChiYWNrZ3JvdW5kRmlsbCA9IF8sIGJveHdoaXNrZXIpIDogYmFja2dyb3VuZEZpbGw7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbmFtZXNwYWNlXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjbmFtZXNwYWNlfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBuYW1lc3BhY2UgPSAnZDNzbS1ib3h3aGlza2VyJ1xuICAgKi9cbiAgYm94d2hpc2tlci5uYW1lc3BhY2UgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG5hbWVzcGFjZSA9IF8sIGJveHdoaXNrZXIpIDogbmFtZXNwYWNlOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG9iamVjdENsYXNzXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjb2JqZWN0Q2xhc3N9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG9iamVjdENsYXNzID0gJ3RpY2stZ3JvdXAnXG4gICAqL1xuICBib3h3aGlza2VyLm9iamVjdENsYXNzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvYmplY3RDbGFzcyA9IF8sIGJveHdoaXNrZXIpIDogb2JqZWN0Q2xhc3M7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdHJhbnNpdGlvbkR1cmF0aW9uXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjdHJhbnNpdGlvbkR1cmF0aW9ufSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0cmFuc2l0aW9uRHVyYXRpb24gPSAxMDAwXG4gICAqL1xuICBib3h3aGlza2VyLnRyYW5zaXRpb25EdXJhdGlvbiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodHJhbnNpdGlvbkR1cmF0aW9uID0gXywgYm94d2hpc2tlcikgOiB0cmFuc2l0aW9uRHVyYXRpb247IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgZWFzZUZ1bmNcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNlYXNlRnVuY30pXG4gICAqIEBwYXJhbSB7ZDMuZWFzZX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBkMy5lYXNlfVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBlYXNlRnVuYyA9IGQzLmVhc2VFeHBcbiAgICovXG4gIGJveHdoaXNrZXIuZWFzZUZ1bmMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGVhc2VGdW5jID0gXywgYm94d2hpc2tlcikgOiBlYXNlRnVuYzsgfTtcblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGJhcktleXNcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNib3hLZXlzfSlcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBzdHJpbmdbXX1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgYm94S2V5cyA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYm94d2hpc2tlci5ib3hLZXlzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChib3hLZXlzID0gXywgYm94d2hpc2tlcikgOiBib3hLZXlzOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGJveFZhbHVlc1xuICAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI2JveFZhbHVlc30pXG4gICAqIEBwYXJhbSB7bnVtYmVyW119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgbnVtYmVyW119XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGJveFZhbHVlcyA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYm94d2hpc2tlci5ib3hWYWx1ZXMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGJveFZhbHVlcyA9IF8sIGJveHdoaXNrZXIpIDogYm94VmFsdWVzOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG9iamVjdFNpemVcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNvYmplY3RTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvYmplY3RTaXplID0gdW5kZWZpbmVkXG4gICAqL1xuICBib3h3aGlza2VyLm9iamVjdFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9iamVjdFNpemUgPSBfLCBib3h3aGlza2VyKSA6IG9iamVjdFNpemU7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgc3BhY2VyU2l6ZVxuICAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI3NwYWNlclNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNwYWNlclNpemUgPSB1bmRlZmluZWRcbiAgICovXG4gIGJveHdoaXNrZXIuc3BhY2VyU2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3BhY2VyU2l6ZSA9IF8sIGJveHdoaXNrZXIpIDogc3BhY2VyU2l6ZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB0b29sdGlwXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjdG9vbHRpcH0pXG4gICAqIEBwYXJhbSB7dG9vbHRpcH0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCB0b29sdGlwfVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0b29sdGlwID0gdG9vbHRpcCgpXG4gICAqL1xuICBib3h3aGlza2VyLnRvb2x0aXAgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRvb2x0aXAgPSBfLCBib3h3aGlza2VyKSA6IHRvb2x0aXA7IH07XG5cblxuICBmdW5jdGlvbiBib3h3aGlza2VyKCkge1xuICAgIC8vIGZvciBjb252ZW5pZW5jZSBpbiBoYW5kbGluZyBvcmllbnRhdGlvbiBzcGVjaWZpYyB2YWx1ZXNcbiAgICB2YXIgaG9yaXpvbnRhbFEgPSAob3JpZW50ID09ICdob3Jpem9udGFsJykgPyB0cnVlIDogZmFsc2VcbiAgICB2YXIgdmVydGljYWxRID0gIWhvcml6b250YWxRXG5cbiAgICAvLyBiYWNrZ3JvdW5kIGNsaXBpbmcgcmVjdGFuZ2xlXG4gICAgdmFyIGJnY3BSZWN0ID0ge3g6MCwgeTowLCB3aWR0aDogc3BhY2VYLCBoZWlnaHQ6c3BhY2VZfVxuICAgIHZhciBjb250YWluZXIgPSBzZXR1cENvbnRhaW5lciggc2VsZWN0aW9uLCBuYW1lc3BhY2UsIGJnY3BSZWN0LCBiYWNrZ3JvdW5kRmlsbCApO1xuXG4gICAgLy8gaWYgZ3JvdXBpbmcgaXMgdW5kZWZpbmVkIHNvcnQga2V5cyBieSBzb3J0aW5nIGZ1bmN0XG4gICAgdmFyIG9yZGVyZWQgPSAoZ3JvdXBpbmcgPT0gdW5kZWZpbmVkKSA/IGQzLmtleXMoZGF0YSkuc29ydChzb3J0aW5nRnVuY3Rpb24pIDogZ3JvdXBpbmdcbiAgICAvLyB0byBwcmV2ZW50IHJlLWNhbGN1bGF0aW9uIGFuZCBnZXR0ZXJzIHRvIGJlIHBhc3NlZCB0byBheGVzXG4gICAgYm94S2V5cyA9IGZsYXR0ZW4ob3JkZXJlZClcbiAgICBib3hWYWx1ZXMgPSBib3hLZXlzLm1hcCh2YWx1ZUV4dHJhY3RvcilcblxuXG4gICAgdmFyIG51bWJlck9mT2JqZWN0cyA9IGJveEtleXMubGVuZ3RoXG4gICAgdmFyIGV4dGVudCA9IFtcbiAgICAgIE1hdGgubWluKC4uLmJveFZhbHVlcy5tYXAoZnVuY3Rpb24oZCxpKXtyZXR1cm4gZFtxdWFydGlsZXNLZXlzWzBdXX0pKSAtIGRvbWFpblBhZGRpbmcsXG4gICAgICBNYXRoLm1heCguLi5ib3hWYWx1ZXMubWFwKGZ1bmN0aW9uKGQsaSl7cmV0dXJuIGRbcXVhcnRpbGVzS2V5c1s0XV19KSkgKyBkb21haW5QYWRkaW5nXG4gICAgXTtcblxuICAgIC8vIHNldCB0aGUgc2NhbGVcbiAgICBzY2FsZS5kb21haW4oZXh0ZW50KS5yYW5nZShob3Jpem9udGFsUSA/IFswLHNwYWNlWV0gOiBbc3BhY2VYLCAwXSlcbiAgICB2YXIgc3BhY2UgPSBob3Jpem9udGFsUSA/IHNwYWNlWCA6IHNwYWNlWVxuICAgIC8vIGNhbGN1bGF0ZSBvYmplY3Qgc2l6ZVxuICAgIG9iamVjdFNpemUgPSBjYWxjdWxhdGVXaWR0aE9mT2JqZWN0KHNwYWNlLCBudW1iZXJPZk9iamVjdHMsIG1pbk9iamVjdFNpemUsIG1heE9iamVjdFNpemUsIG9iamVjdFNwYWNlciwgb3ZlcmZsb3dRKVxuICAgIC8vIGNhbGN1bGF0ZSBzcGFjZXIgc2l6ZSBpZiBuZWVkZWRcbiAgICBzcGFjZXJTaXplID0gY2FsY3VsYXRlV2lkdGhPZlNwYWNlcihib3hLZXlzLCBzcGFjZSwgb2JqZWN0U2l6ZSwgbnVtYmVyT2ZPYmplY3RzLCBvYmplY3RTcGFjZXIsIG92ZXJmbG93USlcbiAgICAvLyBtYWtlIHRoZSBuZXN0ZWQgZ3JvdXBzXG4gICAgdmFyIHNwYWNlckZ1bmN0aW9uID0gZ3JvdXBpbmdTcGFjZXIoKVxuICAgIC5ob3Jpem9udGFsUShob3Jpem9udGFsUSkuc2NhbGUoc2NhbGUpLm1vdmVieSgnY2F0ZWdvcnknKS5udW1iZXJPZk9iamVjdHMobnVtYmVyT2ZPYmplY3RzKVxuICAgIC5vYmplY3RDbGFzcyhvYmplY3RDbGFzcykub2JqZWN0U2l6ZShvYmplY3RTaXplKS5zcGFjZXJTaXplKHNwYWNlclNpemUpXG4gICAgLnRyYW5zaXRpb25EdXJhdGlvbih0cmFuc2l0aW9uRHVyYXRpb24pLmVhc2VGdW5jKGVhc2VGdW5jKVxuICAgIC5uYW1lc3BhY2UobmFtZXNwYWNlKVxuXG4gICAgLy8gbW92ZSBzdHVmZlxuICAgIHNwYWNlckZ1bmN0aW9uKGNvbnRhaW5lciwgb3JkZXJlZCwgMClcblxuICAgIHZhciBwYXJlbnRJbmRleEFycmF5ID0gW11cbiAgICBjb250YWluZXIuc2VsZWN0QWxsKCdnOm5vdCgudG8tcmVtb3ZlKS4nK29iamVjdENsYXNzKVxuICAgIC5lYWNoKGZ1bmN0aW9uKGQsIGkpe2lmIChoYXNRKGJveEtleXMsIGQpKXsgcGFyZW50SW5kZXhBcnJheS5wdXNoKE51bWJlcihkMy5zZWxlY3QodGhpcykuYXR0cigncGFyZW50LWluZGV4JykpKX19KVxuXG5cblxuICAgIGNvbG9yRnVuY3Rpb24gPSBjb2xvckZ1bmN0aW9uLmNvbG9yQnkoKSA9PSAnaW5kZXgnXG4gICAgPyBjb2xvckZ1bmN0aW9uLmRhdGFFeHRlbnQoWzAsIE1hdGgubWF4KC4uLnBhcmVudEluZGV4QXJyYXkpXSlcbiAgICA6IGNvbG9yRnVuY3Rpb24uZGF0YUV4dGVudChleHRlbnQpXG5cblxuICAgIC8vIHNldCBhdHRyaWJ1dGVzIGZvciBib3ggYW5kIHdoaXNrZXJzXG4gICAgY29udGFpbmVyLnNlbGVjdEFsbCgnZzpub3QoLnRvLXJlbW92ZSkuJytvYmplY3RDbGFzcykuZWFjaChmdW5jdGlvbihrZXksIGkpIHtcbiAgICAgIHZhciB0ID0gZDMuc2VsZWN0KHRoaXMpLFxuICAgICAgY3VycmVudERhdGEgPSBkYXRhW2tleV0sXG5cbiAgICAgIHF1YXJ0aWxlcyA9IHZhbHVlRXh0cmFjdG9yKGtleSwgaSksXG4gICAgICBxMCA9IHF1YXJ0aWxlc1txdWFydGlsZXNLZXlzWzBdXSxcbiAgICAgIHExID0gcXVhcnRpbGVzW3F1YXJ0aWxlc0tleXNbMV1dLFxuICAgICAgcTIgPSBxdWFydGlsZXNbcXVhcnRpbGVzS2V5c1syXV0sXG4gICAgICBxMyA9IHF1YXJ0aWxlc1txdWFydGlsZXNLZXlzWzNdXSxcbiAgICAgIHE0ID0gcXVhcnRpbGVzW3F1YXJ0aWxlc0tleXNbNF1dXG5cbiAgICAgIHZhciBpID0gdC5hdHRyKCdwYXJlbnQtaW5kZXgnKSA9PSB1bmRlZmluZWQgPyBpIDogdC5hdHRyKCdwYXJlbnQtaW5kZXgnKSxcbiAgICAgIGZpbGxDb2xvciA9IGNvbG9yRnVuY3Rpb24oa2V5LCBxMiwgaSwgJ2ZpbGwnKSwgLy8gcHJldmVudCBkdXBsaWNhdGUgY29tcHV0YXRpb25cbiAgICAgIHN0cm9rZUNvbG9yID0gY29sb3JGdW5jdGlvbihrZXksIHEyLCBpLCAgJ3N0cm9rZScpXG5cblxuICAgICAgdmFyXG4gICAgICB3aGlzayA9IHNhZmVTZWxlY3QodCwgJ2cnLCAnd2hpc2tlcicpLFxuICAgICAgdVdoaXNrID0gc2FmZVNlbGVjdCh3aGlzaywgJ3BhdGgnLCAndXBwZXInKSxcbiAgICAgIGxXaGlzayA9IHNhZmVTZWxlY3Qod2hpc2ssICdwYXRoJywgJ2xvd2VyJyksXG4gICAgICBxdWFydCA9IHNhZmVTZWxlY3QodCwgJ2cnLCAncXVhcnRpbGUnKSxcbiAgICAgIHVRdWFydCA9IHNhZmVTZWxlY3QocXVhcnQsICdyZWN0JywgJ3VwcGVyJyksXG4gICAgICBsUXVhcnQgPSBzYWZlU2VsZWN0KHF1YXJ0LCAncmVjdCcsICdsb3dlcicpLFxuICAgICAgbVF1YXJ0ID0gc2FmZVNlbGVjdChxdWFydCwgJ2NpcmNsZScsICdtZWRpYW4nKVxuXG5cbiAgICAgIC8vIHNldCB1cHBlciBxdWFydGlsZSAocTMpXG4gICAgICB1UXVhcnQudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuZWFzZShlYXNlRnVuYylcbiAgICAgIC5hdHRyKCd3aWR0aCcsIGhvcml6b250YWxRID8gb2JqZWN0U2l6ZSA6IHNjYWxlKHEzKSAtIHNjYWxlKHEyKSlcbiAgICAgIC5hdHRyKCdoZWlnaHQnLCB2ZXJ0aWNhbFEgPyBvYmplY3RTaXplIDogc2NhbGUocTMpIC0gc2NhbGUocTIpKVxuICAgICAgLmF0dHIoJ2ZpbGwnLCBmaWxsQ29sb3IpXG4gICAgICAuYXR0cignc3Ryb2tlJywgc3Ryb2tlQ29sb3IpXG4gICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgYm94U3Ryb2tlV2lkdGgpXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24oZCwgaSl7XG4gICAgICAgIHZhclxuICAgICAgICB4ID0gaG9yaXpvbnRhbFEgPyAwIDogc2NhbGUocTIpLFxuICAgICAgICB5ID0gdmVydGljYWxRID8gMCA6IHNjYWxlKGV4dGVudFsxXSkgLSBzY2FsZShxMyksXG4gICAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgICAgcmV0dXJuIHRcbiAgICAgIH0pXG5cbiAgICAgIC8vIHNldCBsb3dlciBxdWFydGlsZSAocTEpXG4gICAgICBsUXVhcnQudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuZWFzZShlYXNlRnVuYylcbiAgICAgIC5hdHRyKCd3aWR0aCcsIGhvcml6b250YWxRID8gb2JqZWN0U2l6ZSA6IHNjYWxlKHEyKSAtIHNjYWxlKHExKSlcbiAgICAgIC5hdHRyKCdoZWlnaHQnLCB2ZXJ0aWNhbFEgPyBvYmplY3RTaXplIDogc2NhbGUocTIpIC0gc2NhbGUocTEpKVxuICAgICAgLmF0dHIoJ2ZpbGwnLCBmaWxsQ29sb3IpXG4gICAgICAuYXR0cignc3Ryb2tlJywgc3Ryb2tlQ29sb3IpXG4gICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgYm94U3Ryb2tlV2lkdGgpXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24oZCwgaSl7XG4gICAgICAgIHZhclxuICAgICAgICB4ID0gaG9yaXpvbnRhbFEgPyAwIDogc2NhbGUocTEpLFxuICAgICAgICB5ID0gdmVydGljYWxRID8gMCA6IHNjYWxlKGV4dGVudFsxXSkgLSBzY2FsZShxMiksXG4gICAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgICAgcmV0dXJuIHRcbiAgICAgIH0pXG5cblxuICAgICAgLy8gc2V0IG1lZGlhbiAocTIpXG4gICAgICBtUXVhcnQudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuZWFzZShlYXNlRnVuYylcbiAgICAgIC5hdHRyKCdyJywgZnVuY3Rpb24oZCwgaSl7XG4gICAgICAgIHZhciByID0gb2JqZWN0U2l6ZSAvIDJcbiAgICAgICAgdmFyIGRpZiA9IChzY2FsZShxMykgLSBzY2FsZShxMSkpIC8gMlxuICAgICAgICByZXR1cm4gKHIgPiBkaWYpID8gZGlmIDogclxuICAgICAgfSlcbiAgICAgIC5hdHRyKCdmaWxsJywgZmlsbENvbG9yKVxuICAgICAgLmF0dHIoJ3N0cm9rZScsIHN0cm9rZUNvbG9yKVxuICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIGJveFN0cm9rZVdpZHRoKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uKGQsIGkpe1xuICAgICAgICB2YXJcbiAgICAgICAgeCA9IGhvcml6b250YWxRID8gb2JqZWN0U2l6ZSAvIDIgOiBzY2FsZShxMiksXG4gICAgICAgIHkgPSB2ZXJ0aWNhbFEgPyBvYmplY3RTaXplIC8gMiA6IHNjYWxlKGV4dGVudFsxXSkgLSBzY2FsZShxMiksXG4gICAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgICAgcmV0dXJuIHRcbiAgICAgIH0pXG5cbiAgICAgIC8vIHNldCBsb3dlciB3aGlza2VyIChtaW4pXG4gICAgICBsV2hpc2sudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuZWFzZShlYXNlRnVuYylcbiAgICAgIC5hdHRyKCdkJywgZnVuY3Rpb24oZGQsIGlpKXtcbiAgICAgICAgdmFyXG4gICAgICAgIGRpciA9IGZhbHNlLFxuICAgICAgICB4ID0gMCxcbiAgICAgICAgeSA9IDAsXG4gICAgICAgIGggPSBob3Jpem9udGFsUSA/IHNjYWxlKHExKSAtIHNjYWxlKHEwKSA6IG9iamVjdFNpemUsXG4gICAgICAgIHcgPSB2ZXJ0aWNhbFEgPyBzY2FsZShxMSkgLSBzY2FsZShxMCkgOiBvYmplY3RTaXplXG4gICAgICAgIHJldHVybiB3aGlza2VyUGF0aChkaXIsIHgsIHksIHcsIGgsIHdoaXNrZXJXaWR0aFBlcmNlbnQsIG9yaWVudClcbiAgICAgIH0pXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24oZCwgaSl7XG4gICAgICAgIHZhclxuICAgICAgICB4ID0gaG9yaXpvbnRhbFEgPyAwIDogc2NhbGUocTEpLFxuICAgICAgICB5ID0gdmVydGljYWxRID8gMCA6IHNjYWxlKGV4dGVudFsxXSkgLSBzY2FsZShxMSksXG4gICAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgICAgcmV0dXJuIHRcbiAgICAgIH0pXG4gICAgICAuYXR0cignc3Ryb2tlJywgJ2JsYWNrJykuYXR0cignc3Ryb2tlLXdpZHRoJywgd2hpc2tlclN0cm9rZVdpZHRoKVxuICAgICAgLmF0dHIoJ2ZpbGwnLCAnbm9uZScpXG5cbiAgICAgIC8vIHNldCB1cHBlciB3aGlza2VyIChtYXgpXG4gICAgICB1V2hpc2sudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuZWFzZShlYXNlRnVuYylcbiAgICAgIC5hdHRyKCdkJywgZnVuY3Rpb24oZGQsIGlpKXtcbiAgICAgICAgdmFyXG4gICAgICAgIGRpciA9IHRydWUsXG4gICAgICAgIHggPSAwLFxuICAgICAgICB5ID0gMCxcbiAgICAgICAgaCA9IGhvcml6b250YWxRID8gc2NhbGUocTQpIC0gc2NhbGUocTMpIDogb2JqZWN0U2l6ZSxcbiAgICAgICAgdyA9IHZlcnRpY2FsUSA/IHNjYWxlKHE0KSAtIHNjYWxlKHEzKSA6IG9iamVjdFNpemVcbiAgICAgICAgcmV0dXJuIHdoaXNrZXJQYXRoKGRpciwgeCwgeSwgdywgaCwgd2hpc2tlcldpZHRoUGVyY2VudCwgb3JpZW50KVxuICAgICAgfSlcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbihkLCBpKXtcbiAgICAgICAgdmFyXG4gICAgICAgIHggPSBob3Jpem9udGFsUSA/IDAgOiBzY2FsZShxMyksXG4gICAgICAgIHkgPSB2ZXJ0aWNhbFEgPyAwIDogIHNjYWxlKGV4dGVudFsxXSkgLSBzY2FsZShxNCksXG4gICAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgICAgcmV0dXJuIHRcbiAgICAgIH0pXG4gICAgICAuYXR0cignc3Ryb2tlJywgJ2JsYWNrJylcbiAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCB3aGlza2VyU3Ryb2tlV2lkdGgpXG4gICAgICAuYXR0cignZmlsbCcsICdub25lJylcblxuICAgIH0pXG5cbiAgICB0b29sdGlwLnNlbGVjdGlvbihjb250YWluZXIuc2VsZWN0QWxsKCdnOm5vdCgudG8tcmVtb3ZlKS4nK29iamVjdENsYXNzKSlcbiAgICAuZGF0YShkYXRhKVxuICAgIHRvb2x0aXAoKVxuXG5cbiAgfVxuXG4gIHJldHVybiBib3h3aGlza2VyXG59XG4iLCJpbXBvcnQge2h5cGVuYXRlLCBzYWZlU2VsZWN0fSBmcm9tICcuL2hlbHBlcnMnO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFUQVRPR0dMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqXG4gKiBDcmVhdGVzIGEgZGF0YXRvZ2dsZVxuICogQGNvbnN0cnVjdG9yIGRhdGF0b2dnbGVcbiAqIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBzZWxlY3Rpb25cbiAqIEBuYW1lc3BhY2UgZGF0YXRvZ2dsZVxuICogQHJldHVybnMge2Z1bmN0aW9ufSBkYXRhdG9nZ2xlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkYXRhdG9nZ2xlKCBzZWxlY3Rpb24gKSB7XG4gIHZhclxuICAvKipcbiAgKiBLZXlzIHRvIG1ha2UgdG9nZ2xlLWFibGUgb3B0aW9uc1xuICAqIChzZWUge0BsaW5rIGRhdGF0b2dnbGUja2V5c30pXG4gICogQHBhcmFtIHtzdHJpbmdbXX0gW2tleXM9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBkYXRhdG9nZ2xlI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBrZXlzLFxuICAvKipcbiAgKiBXaGF0IHRvIGRvIHdoZW4gYSBkaWZmZXJlbnQga2V5IGlzIGNsaWNrZWRcbiAgKiAoc2VlIHtAbGluayBkYXRhdG9nZ2xlI3VwZGF0ZUZ1bmN0aW9ufSlcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbdXBkYXRlRnVuY3Rpb249ZnVuY3Rpb24oKXt9XVxuICAqIEBtZW1iZXJvZiBkYXRhdG9nZ2xlI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB1cGRhdGVGdW5jdGlvbiA9IGZ1bmN0aW9uKCl7fSxcbiAgLyoqXG4gICogTmFtZXNwYWNlIGZvciBhbGwgaXRlbXMgbWFkZSBieSB0aGlzIGluc3RhbmNlIG9mIGRhdGF0b2dnbGVcbiAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVzcGFjZT1cImQzc20tZGF0YWJhclwiXVxuICAqIEBtZW1iZXJvZiBkYXRhdG9nZ2xlI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBuYW1lc3BhY2U9J2Qzc20tZGF0YWJhcicsXG4gIC8qKlxuICAqIEN1cnJlbnRseSB0b2dnbGVkIGtleVxuICAqIEBwYXJhbSB7c3RyaW5nfSBbY3VycmVudEtleT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGRhdGF0b2dnbGUjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGN1cnJlbnRLZXlcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBrZXlzXG4gICAqIChzZWUge0BsaW5rIGRhdGF0b2dnbGUja2V5c30pXG4gICAqIEBmdW5jdGlvbiBkYXRhdG9nZ2xlLmtleXNcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2RhdGF0b2dnbGUgfCBzdHJpbmdbXX1cbiAgICogQG1lbWJlcm9mIGRhdGF0b2dnbGVcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQga2V5cyA9IHVuZGVmaW5lZFxuICAgKi9cbiAgdG9nZ2xlLmtleXMgPSBmdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChrZXlzID0gXywgdG9nZ2xlKSA6IGtleXN9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdXBkYXRlRnVuY3Rpb25cbiAgICogKHNlZSB7QGxpbmsgZGF0YXRvZ2dsZSN1cGRhdGVGdW5jdGlvbn0pXG4gICAqIEBmdW5jdGlvbiBkYXRhdG9nZ2xlLnVwZGF0ZUZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtkYXRhdG9nZ2xlIHwgZnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiBkYXRhdG9nZ2xlXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHVwZGF0ZUZ1bmN0aW9uID0gZnVuY3Rpb24oKXt9XG4gICAqL1xuICB0b2dnbGUudXBkYXRlRnVuY3Rpb24gPSBmdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh1cGRhdGVGdW5jdGlvbiA9IF8sIHRvZ2dsZSkgOiB1cGRhdGVGdW5jdGlvbn1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBuYW1lc3BhY2VcbiAgICogKHNlZSB7QGxpbmsgZGF0YXRvZ2dsZSNuYW1lc3BhY2V9KVxuICAgKiBAZnVuY3Rpb24gZGF0YXRvZ2dsZS5uYW1lc3BhY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtkYXRhdG9nZ2xlIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgZGF0YXRvZ2dsZVxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBuYW1lc3BhY2UgPSAnZDNzbS1kYXRhYmFyJ1xuICAgKi9cbiAgdG9nZ2xlLm5hbWVzcGFjZSA9IGZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG5hbWVzcGFjZSA9IF8sIHRvZ2dsZSkgOiBuYW1lc3BhY2V9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgY3VycmVudEtleVxuICAgKiAoc2VlIHtAbGluayBkYXRhdG9nZ2xlI2N1cnJlbnRLZXl9KVxuICAgKiBAZnVuY3Rpb24gZGF0YXRvZ2dsZS5jdXJyZW50S2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7ZGF0YXRvZ2dsZSB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGRhdGF0b2dnbGVcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgY3VycmVudEtleSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgdG9nZ2xlLmN1cnJlbnRLZXkgPSBmdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjdXJyZW50S2V5ID0gXywgdG9nZ2xlKSA6IGN1cnJlbnRLZXl9XG5cbiAgZnVuY3Rpb24gdG9nZ2xlKCkge1xuICAgIC8vIHNlbGVjdGlvbiBvcHRpb25zXG4gICAgdmFyIGRhdGFvcHRzID0gc2VsZWN0aW9uLnNlbGVjdEFsbCgnZGl2LmRhdGEtb3B0aW9uJylcbiAgICAvLyByZW1vdmUgZXhjZXNzXG4gICAgZGF0YW9wdHMuZXhpdCgpLnJlbW92ZSgpXG4gICAgLy8gYmluZCBkYXRhXG4gICAgZGF0YW9wdHMgPSBkYXRhb3B0cy5kYXRhKGtleXMpXG4gICAgLy8gZW50ZXJcbiAgICB2YXIgZG9FbnRlciA9IGRhdGFvcHRzLmVudGVyKCkuYXBwZW5kKCdkaXYnKS5hdHRyKCdjbGFzcycsICdkYXRhLW9wdGlvbicpXG4gICAgLmNsYXNzZWQoJ2Zvcm0tY2hlY2sgZm9ybS1jaGVjay1pbmxpbmUgYWxpZ24tbWlkZGxlJywgdHJ1ZSlcbiAgICBkb0VudGVyXG4gICAgLmFwcGVuZCgnaW5wdXQnKS5hdHRyKCd0eXBlJywgJ3JhZGlvJylcbiAgICAuYXR0cignaWQnLCBmdW5jdGlvbihkLGkpe3JldHVybiBoeXBlbmF0ZShuYW1lc3BhY2UsIGQpfSlcbiAgICAuYXR0cignbmFtZScsIGh5cGVuYXRlKG5hbWVzcGFjZSwgJ2RhdGFiYXInKSlcbiAgICAuYXR0cigndmFsdWUnLCBmdW5jdGlvbihkLCBpKXtyZXR1cm4gZH0pXG5cbiAgICBkb0VudGVyXG4gICAgLmFwcGVuZCgnbGFiZWwnKVxuICAgIC5hdHRyKCdmb3InLCBmdW5jdGlvbihkLGkpe3JldHVybiBoeXBlbmF0ZShuYW1lc3BhY2UsIGQpfSlcbiAgICAuYXR0cignbmFtZScsIGh5cGVuYXRlKG5hbWVzcGFjZSwgJ2RhdGFiYXInKSlcbiAgICAudGV4dChmdW5jdGlvbihkLCBpKXtyZXR1cm4gZH0pXG5cbiAgICBkYXRhb3B0cyA9IGRhdGFvcHRzLm1lcmdlKGRvRW50ZXIpXG5cbiAgICBjdXJyZW50S2V5ID0gZGF0YW9wdHMuc2VsZWN0KCc6Y2hlY2tlZCcpLmVtcHR5KClcbiAgICA/IGtleXNbMF1cbiAgICA6IGRhdGFvcHRzLnNlbGVjdCgnOmNoZWNrZWQnKS5kYXR1bSgpXG5cbiAgICAvLyBjaGVjayBjdXJyZW50XG4gICAgZGF0YW9wdHMuc2VsZWN0KCdbdmFsdWU9XCInK2N1cnJlbnRLZXkrJ1wiXScpLnByb3BlcnR5KCdjaGVja2VkJywgdHJ1ZSlcblxuICAgIC8vIGJpbmQgdXBkYXRlIGZ1bmN0aW9uXG4gICAgZGF0YW9wdHMub24oJ2NsaWNrJywgZnVuY3Rpb24oZCwgaSl7IHVwZGF0ZUZ1bmN0aW9uKCkgfSlcbiAgICByZXR1cm4gdG9nZ2xlXG4gIH1cblxuICByZXR1cm4gdG9nZ2xlXG59XG4iLCJpbXBvcnQge2h5cGVuYXRlLCBzYWZlU2VsZWN0fSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHtzZXR1cENvbnRhaW5lciwgY2FsY3VsYXRlV2lkdGhPZk9iamVjdCwgY2FsY3VsYXRlV2lkdGhPZlNwYWNlcn0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge3VuaXF1ZSwgZmxhdHRlbn0gZnJvbSAnLi9hcnJheS1mdW5jdGlvbnMnO1xuaW1wb3J0IHtncm91cGluZ1NwYWNlcn0gZnJvbSAnLi9ncm91cGluZy1zcGFjZXInO1xuaW1wb3J0IHtjb2xvckZ1bmN0aW9uIGFzIENGfSBmcm9tICcuL2NvbG9yLWZ1bmN0aW9uJztcbmltcG9ydCB7dG9vbHRpcCBhcyBUVGlwfSBmcm9tICcuL3Rvb2x0aXAnO1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0FUVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKlxuICogQ3JlYXRlcyBhIHNjYXR0ZXJcbiAqXG4gKiB7QGxpbmsgaHR0cHM6Ly9zdW1uZXVyb24uZ2l0bGFiLmlvL2Qzc20vZGVtb3Mvc2NhdHRlci9pbmRleC5odG1sIERlbW99XG4gKiBAY29uc3RydWN0b3Igc2NhdHRlclxuICogQHBhcmFtIHtkMy5zZWxlY3Rpb259IHNlbGVjdGlvblxuICogQG5hbWVzcGFjZSBzY2F0dGVyXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259IHNjYXR0ZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjYXR0ZXIgKCBzZWxlY3Rpb24gKSB7XG5cbiAgdmFyXG4gIC8qKlxuICAqIERhdGEgdG8gcGxvdC4gQXNzdW1lZCB0byBiZSBhIG9iamVjdCwgd2hlcmUgZWFjaCBrZXkgY29ycmVzcG9uZHMgdG8gYSBwb2ludFxuICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjZGF0YX0pXG4gICogQHBhcmFtIHtPYmplY3R9IFtkYXRhPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZGF0YSxcbiAgLyoqXG4gICogQW1vdW50IG9mIGhvcml6b250YWwgc3BhY2UgKGluIHBpeGVscykgYXZhaWJsZSB0byByZW5kZXIgdGhlIHNjYXR0ZXIgaW5cbiAgKiAoc2VlIHtAbGluayBzY2F0dGVyI3NwYWNlWH0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZVg9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzcGFjZVgsXG4gIC8qKlxuICAqIEFtb3VudCBvZiB2ZXJ0aWNhbCBzcGFjZSAoaW4gcGl4ZWxzKSBhdmFpYmxlIHRvIHJlbmRlciB0aGUgc2NhdHRlciBpblxuICAqIChzZWUge0BsaW5rIHNjYXR0ZXIuc3BhY2VZfSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW3NwYWNlWT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNwYWNlWSxcblxuICAvKipcbiAgKiBUaGUgc2NhbGUgZm9yIHdoaWNoIHNjYXR0ZXIgeCB2YWx1ZXMgc2hvdWxkIGJlIHRyYW5zZm9ybWVkIGJ5XG4gICogQHBhcmFtIHtkMy5zY2FsZX0gW3NjYWxlWD1kMy5zY2FsZUxpbmVhcl1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc2NhbGVYID0gZDMuc2NhbGVMaW5lYXIoKSxcbiAgLyoqXG4gICogVGhlIHBhZGRpbmcgZm9yIHRoZSBkb21haW4gb2YgdGhlIHNjYWxlWCAoc2VlIHtAbGluayBzY2F0dGVyI3NjYWxlWH0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtkb21haW5QYWRkaW5nWD0wLjVdXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGRvbWFpblBhZGRpbmdYID0gMC41LFxuICAvKipcbiAgKiBUaGUgZnVuY3Rpb24gZm9yIGdldHRpbmcgdGhlIHggdmFsdWUgb2YgdGhlIGN1cnJlbnQgcG9pbnRcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbdmFsdWVFeHRyYWN0b3JYPWZ1bmN0aW9uKGQsIGkpe3JldHVybiBkYXRhW2RdWyd4J119XVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB2YWx1ZUV4dHJhY3RvclggPSBmdW5jdGlvbihkLCBpKSB7cmV0dXJuIGRhdGFbZF1bJ3gnXX0sXG5cbiAgLyoqXG4gICogVGhlIHNjYWxlIGZvciB3aGljaCBzY2F0dGVyIHkgdmFsdWVzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBieVxuICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtzY2FsZVk9ZDMuc2NhbGVMaW5lYXJdXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNjYWxlWSA9IGQzLnNjYWxlTGluZWFyKCksXG4gIC8qKlxuICAqIFRoZSBwYWRkaW5nIGZvciB0aGUgZG9tYWluIG9mIHRoZSBzY2FsZVkgKHNlZSB7QGxpbmsgc2NhdHRlciNzY2FsZVl9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbZG9tYWluUGFkZGluZ1k9MC41XVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBkb21haW5QYWRkaW5nWSA9IDAuNSxcbiAgLyoqXG4gICogVGhlIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHRoZSB5IHZhbHVlIG9mIHRoZSBjdXJyZW50IHBvaW50XG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW3ZhbHVlRXh0cmFjdG9yWT1mdW5jdGlvbihkLCBpKXtyZXR1cm4gZGF0YVtkXVsneSddfV1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdmFsdWVFeHRyYWN0b3JZID0gZnVuY3Rpb24oZCwgaSkge3JldHVybiBkYXRhW2RdWyd5J119LFxuXG5cbiAgLyoqXG4gICogVGhlIHNjYWxlIGZvciB3aGljaCBzY2F0dGVyIHIgdmFsdWVzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBieVxuICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtzY2FsZVI9ZDMuc2NhbGVMaW5lYXJdXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNjYWxlUiA9IGQzLnNjYWxlTGluZWFyKCksXG4gIC8qKlxuICAqIFRoZSBwYWRkaW5nIGZvciB0aGUgZG9tYWluIG9mIHRoZSBzY2FsZVIgKHNlZSB7QGxpbmsgc2NhdHRlciNzY2FsZVJ9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbZG9tYWluUGFkZGluZ1I9MC41XVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBkb21haW5QYWRkaW5nUiA9IDAuNSxcbiAgLyoqXG4gICogVGhlIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHRoZSByIHZhbHVlIG9mIHRoZSBjdXJyZW50IHBvaW50XG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW3ZhbHVlRXh0cmFjdG9yUj1mdW5jdGlvbihkLCBpKXtyZXR1cm4gMn1dXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHZhbHVlRXh0cmFjdG9yUiA9IGZ1bmN0aW9uKGQsIGkpIHtyZXR1cm4gMn0sXG4gIC8qKlxuICAqIFRoZSBtaW4gcmFkaXVzIGEgcG9pbnQgY2FuIGhhdmVcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbbWluUmFkaXVzPTJdXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG1pblJhZGl1cyA9IDIsXG4gIC8qKlxuICAqIFRoZSBtaW4gcmFkaXVzIGEgcG9pbnQgY2FuIGhhdmVcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbbWF4UmFkaXVzPTEwXVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBtYXhSYWRpdXMgPSAxMCxcblxuICAvKipcbiAgKiBUaGUgc3Ryb2tlIHdpZHRoIG9mIHRoZSBwb2ludHNcbiAgKiBAcGFyYW0ge251bWJlcn0gW3BvaW50U3Ryb2tlV2lkdGg9Ml1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgcG9pbnRTdHJva2VXaWR0aCA9IDIsXG4gIC8qKlxuICAqIEluc3RhbmNlIG9mIENvbG9yRnVuY3Rpb25cbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbY29sb3JGdW5jdGlvbiA9IGNvbG9yRnVuY3Rpb24oKV1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgY29sb3JGdW5jdGlvbiA9IENGKCksXG4gIC8qKlxuICAqIENvbG9yIG9mIHRoZSBiYWNrZ3JvdW5kXG4gICogQHBhcmFtIHtzdHJpbmd9IFtiYWNrZ3JvdW5kRmlsbD1cInRyYW5zcGFyZW50XCJdXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGJhY2tncm91bmRGaWxsID0gJ3RyYW5zcGFyZW50JyxcbiAgLyoqXG4gICogTmFtZXNwYWNlIGZvciBhbGwgaXRlbXMgbWFkZSBieSB0aGlzIGluc3RhbmNlIG9mIHNjYXR0ZXJcbiAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVzcGFjZT1cImQzc20tc2NhdHRlclwiXVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBuYW1lc3BhY2UgPSAnZDNzbS1zY2F0dGVyJyxcbiAgLyoqXG4gICogQ2xhc3MgbmFtZSBmb3Igc2NhdHRlciBjb250YWluZXIgKDxjaXJjbGU+IGVsZW1lbnQpXG4gICogQHBhcmFtIHtzdHJpbmd9IFtvYmplY3RDbGFzcz1cInNjYXR0ZXItcG9pbnRcIl1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb2JqZWN0Q2xhc3MgPSAnc2NhdHRlci1wb2ludCcsXG4gIC8qKlxuICAqIER1cmF0aW9uIG9mIGFsbCB0cmFuc2l0aW9ucyBvZiB0aGlzIGVsZW1lbnRcbiAgKiBAcGFyYW0ge251bWJlcn0gW3RyYW5zaXRpb25EdXJhdGlvbj0xMDAwXVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB0cmFuc2l0aW9uRHVyYXRpb24gPSAxMDAwLFxuICAvKipcbiAgKiBFYXNpbmcgZnVuY3Rpb24gZm9yIHRyYW5zaXRpb25zXG4gICogQHBhcmFtIHtkMy5lYXNlfSBbZWFzZUZ1bmM9ZDMuZWFzZUV4cF1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZWFzZUZ1bmMgPSBkMy5lYXNlRXhwLFxuXG4gIC8vIHVzZWZ1bCB2YWx1ZXMgdG8gZXh0cmFjdCB0byBwcmV2ZW50IHJlLWNhbGN1bGF0aW9uXG4gIC8qKlxuICAqIFRoZSBrZXlzIG9mIHRoZSBwb2ludHNcbiAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbcG9pbnRLZXlzPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgcG9pbnRLZXlzLFxuICAvKipcbiAgKiBUaGUgeCB2YWx1ZXMgb2YgdGhlIHBvaW50c1xuICAqIEBwYXJhbSB7bnVtYmVyW119IFt2YWx1ZXNYPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdmFsdWVzWCxcbiAgLyoqXG4gICogVGhlIHkgdmFsdWVzIG9mIHRoZSBwb2ludHNcbiAgKiBAcGFyYW0ge251bWJlcltdfSBbdmFsdWVzWT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHZhbHVlc1ksXG4gIC8qKlxuICAqIFRoZSByIHZhbHVlcyBvZiB0aGUgcG9pbnRzXG4gICogQHBhcmFtIHtudW1iZXJbXX0gW3ZhbHVlc1I9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB2YWx1ZXNSLFxuXG4gIC8qKlxuICAqIEluc3RhbmNlIG9mIFRvb2x0aXBcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbdG9vbHRpcD10b29sdGlwKCldXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHRvb2x0aXAgPSBUVGlwKClcblxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBzZWxlY3Rpb24gaW4gd2hpY2ggaXRlbXMgYXJlIG1hbmlwdWxhdGVkXG4gICAqIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IGQzLnNlbGVjdGlvbn1cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc2VsZWN0aW9uID0gc2VsZWN0aW9uXG4gICAqL1xuICBzY2F0dGVyLnNlbGVjdGlvbiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2VsZWN0aW9uID1fLCBzY2F0dGVyKSA6IHNlbGVjdGlvbn1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgZGF0YVxuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI2RhdGF9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBvYmplY3R9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKi9cbiAgc2NhdHRlci5kYXRhID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkYXRhID1fLCBzY2F0dGVyKSA6IGRhdGF9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGFtb3VudCBvZiBob3Jpem9udGFsIHNwYWNlIGluIHdoaWNoIGl0ZW1zIGFyZSBtYW5pcHVsYXRlZFxuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI3NwYWNlWH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXSBzaG91bGQgYmUgYSBudW1iZXIgPiAwXG4gICAqIEByZXR1cm5zIHtzY2F0dGVyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzcGFjZVggPSB1bmRlZmluZWRcbiAgICovXG4gIHNjYXR0ZXIuc3BhY2VYID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzcGFjZVggPV8sIHNjYXR0ZXIpIDogc3BhY2VYfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBhbW91bnQgb2YgdmVydGljYWwgc3BhY2UgaW4gd2hpY2ggaXRlbXMgYXJlIG1hbmlwdWxhdGVkXG4gICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjc3BhY2VZfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdIHNob3VsZCBiZSBhIG51bWJlciA+IDBcbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNwYWNlWSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgc2NhdHRlci5zcGFjZVkgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNwYWNlWSA9Xywgc2NhdHRlcikgOiBzcGFjZVl9XG5cblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgeCBzY2FsZSBmb3Igd2hpY2ggdGhlIHNjYXR0ZXIgeCB2YWx1ZXMgc2hvdWxkIGJlIHRyYW5zZm9ybWVkIGJ5XG4gICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjc2NhbGVYfSlcbiAgICogQHBhcmFtIHtkMy5zY2FsZX0gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBkMy5zY2FsZX1cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc2NhbGVYID0gZDMuc2NhbGVMaW5lYXIoKVxuICAgKi9cbiAgc2NhdHRlci5zY2FsZVggPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNjYWxlWCA9Xywgc2NhdHRlcikgOiBzY2FsZVh9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgcGFkZGluZyBmb3IgdGhlIGRvbWFpbiBvZiB0aGUgeCBzY2FsZVxuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI2RvbWFpblBhZGRpbmdYfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtzY2F0dGVyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBkb21haW5QYWRkaW5nWCA9IDAuNVxuICAgKi9cbiAgc2NhdHRlci5kb21haW5QYWRkaW5nWCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluUGFkZGluZ1ggPV8sIHNjYXR0ZXIpIDogZG9tYWluUGFkZGluZ1h9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdmFsdWVFeHRyYWN0b3JYXG4gICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjdmFsdWVFeHRyYWN0b3JYfSlcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBmdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdmFsdWVFeHRyYWN0b3JYID0gZnVuY3Rpb24oa2V5LCBpbmRleCkgeyByZXR1cm4gZGF0YVtrZXldWyd4J10gfVxuICAgKi9cbiAgc2NhdHRlci52YWx1ZUV4dHJhY3RvclggPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZhbHVlRXh0cmFjdG9yWCA9Xywgc2NhdHRlcikgOiB2YWx1ZUV4dHJhY3Rvclh9XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHkgc2NhbGUgZm9yIHdoaWNoIHRoZSBzY2F0dGVyIHkgdmFsdWVzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBieVxuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI3NjYWxlWX0pXG4gICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtzY2F0dGVyIHwgZDMuc2NhbGV9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNjYWxlWSA9IGQzLnNjYWxlTGluZWFyKClcbiAgICovXG4gIHNjYXR0ZXIuc2NhbGVZID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzY2FsZVkgPV8sIHNjYXR0ZXIpIDogc2NhbGVZfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHBhZGRpbmcgZm9yIHRoZSBkb21haW4gb2YgdGhlIHkgc2NhbGVcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciNkb21haW5QYWRkaW5nWX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgZG9tYWluUGFkZGluZ1kgPSAwLjVcbiAgICovXG4gIHNjYXR0ZXIuZG9tYWluUGFkZGluZ1kgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpblBhZGRpbmdZID1fLCBzY2F0dGVyKSA6IGRvbWFpblBhZGRpbmdZfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHZhbHVlRXh0cmFjdG9yWVxuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI3ZhbHVlRXh0cmFjdG9yWX0pXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtzY2F0dGVyIHwgZnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHZhbHVlRXh0cmFjdG9yWSA9IGZ1bmN0aW9uKGtleSwgaW5kZXgpIHsgcmV0dXJuIGRhdGFba2V5XVsneSddIH1cbiAgICovXG4gIHNjYXR0ZXIudmFsdWVFeHRyYWN0b3JZID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2YWx1ZUV4dHJhY3RvclkgPV8sIHNjYXR0ZXIpIDogdmFsdWVFeHRyYWN0b3JZfVxuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSByIHNjYWxlIGZvciB3aGljaCB0aGUgc2NhdHRlciByIHZhbHVlcyBzaG91bGQgYmUgdHJhbnNmb3JtZWQgYnlcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciNzY2FsZVJ9KVxuICAgKiBAcGFyYW0ge2QzLnNjYWxlfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IGQzLnNjYWxlfVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzY2FsZVIgPSBkMy5zY2FsZUxpbmVhcigpXG4gICAqL1xuICBzY2F0dGVyLnNjYWxlUiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2NhbGVSID1fLCBzY2F0dGVyKSA6IHNjYWxlUn1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBwYWRkaW5nIGZvciB0aGUgZG9tYWluIG9mIHRoZSByIHNjYWxlXG4gICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjZG9tYWluUGFkZGluZ1J9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGRvbWFpblBhZGRpbmdSID0gMC41XG4gICAqL1xuICBzY2F0dGVyLmRvbWFpblBhZGRpbmdSID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkb21haW5QYWRkaW5nUiA9Xywgc2NhdHRlcikgOiBkb21haW5QYWRkaW5nUn1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB2YWx1ZUV4dHJhY3RvclJcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciN2YWx1ZUV4dHJhY3RvclJ9KVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IGZ1bmN0aW9ufVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB2YWx1ZUV4dHJhY3RvclIgPSBmdW5jdGlvbihrZXksIGluZGV4KSB7IHJldHVybiBkYXRhW2tleV1bJ3InXSB9XG4gICAqL1xuICBzY2F0dGVyLnZhbHVlRXh0cmFjdG9yUiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmFsdWVFeHRyYWN0b3JSID1fLCBzY2F0dGVyKSA6IHZhbHVlRXh0cmFjdG9yUn1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBtaW5SYWRpdXNcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciNtaW5SYWRpdXN9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG1pblJhZGl1cyA9IDJcbiAgICovXG4gIHNjYXR0ZXIubWluUmFkaXVzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChtaW5SYWRpdXMgPV8sIHNjYXR0ZXIpIDogbWluUmFkaXVzfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG1heFJhZGl1c1xuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI21heFJhZGl1c30pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgbWF4UmFkaXVzID0gMTBcbiAgICovXG4gIHNjYXR0ZXIubWF4UmFkaXVzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChtYXhSYWRpdXMgPV8sIHNjYXR0ZXIpIDogbWF4UmFkaXVzfVxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgcG9pbnRTdHJva2VXaWR0aFxuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI3BvaW50U3Ryb2tlV2lkdGh9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHBvaW50U3Ryb2tlV2lkdGggPSAyXG4gICAqL1xuICBzY2F0dGVyLnBvaW50U3Ryb2tlV2lkdGggPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBvaW50U3Ryb2tlV2lkdGggPV8sIHNjYXR0ZXIpIDogcG9pbnRTdHJva2VXaWR0aH1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBjb2xvckZ1bmN0aW9uXG4gICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjY29sb3JGdW5jdGlvbn0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgY29sb3JGdW5jdGlvbiA9IGNvbG9yRnVuY3Rpb24oKVxuICAgKi9cbiAgc2NhdHRlci5jb2xvckZ1bmN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjb2xvckZ1bmN0aW9uID1fLCBzY2F0dGVyKSA6IGNvbG9yRnVuY3Rpb259XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgYmFja2dyb3VuZEZpbGxcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciNiYWNrZ3JvdW5kRmlsbH0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgYmFja2dyb3VuZEZpbGwgPSAndHJhbnNwYXJlbnQnXG4gICAqL1xuICBzY2F0dGVyLmJhY2tncm91bmRGaWxsID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChiYWNrZ3JvdW5kRmlsbCA9Xywgc2NhdHRlcikgOiBiYWNrZ3JvdW5kRmlsbH1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBuYW1lc3BhY2VcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciNuYW1lc3BhY2V9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG5hbWVzcGFjZSA9ICdkM3NtLXNjYXR0ZXInXG4gICAqL1xuICBzY2F0dGVyLm5hbWVzcGFjZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobmFtZXNwYWNlID1fLCBzY2F0dGVyKSA6IG5hbWVzcGFjZX1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBvYmplY3RDbGFzc1xuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI29iamVjdENsYXNzfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtzY2F0dGVyIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvYmplY3RDbGFzcyA9ICd0aWNrLWdyb3VwJ1xuICAgKi9cbiAgc2NhdHRlci5vYmplY3RDbGFzcyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob2JqZWN0Q2xhc3MgPV8sIHNjYXR0ZXIpIDogb2JqZWN0Q2xhc3N9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdHJhbnNpdGlvbkR1cmF0aW9uXG4gICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjdHJhbnNpdGlvbkR1cmF0aW9ufSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtzY2F0dGVyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0cmFuc2l0aW9uRHVyYXRpb24gPSAxMDAwXG4gICAqL1xuICBzY2F0dGVyLnRyYW5zaXRpb25EdXJhdGlvbiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodHJhbnNpdGlvbkR1cmF0aW9uID1fLCBzY2F0dGVyKSA6IHRyYW5zaXRpb25EdXJhdGlvbn1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBlYXNlRnVuY1xuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI2Vhc2VGdW5jfSlcbiAgICogQHBhcmFtIHtkMy5lYXNlfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IGQzLmVhc2V9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGVhc2VGdW5jID0gZDMuZWFzZUV4cFxuICAgKi9cbiAgc2NhdHRlci5lYXNlRnVuYyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZWFzZUZ1bmMgPV8sIHNjYXR0ZXIpIDogZWFzZUZ1bmN9XG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBwb2ludEtleXNcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciNwb2ludEtleXN9KVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IHN0cmluZ1tdfVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBwb2ludEtleXMgPSB1bmRlZmluZWRcbiAgICovXG4gIHNjYXR0ZXIucG9pbnRLZXlzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwb2ludEtleXMgPV8sIHNjYXR0ZXIpIDogcG9pbnRLZXlzfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHZhbHVlc1hcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciN2YWx1ZXNYfSlcbiAgICogQHBhcmFtIHtudW1iZXJbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBudW1iZXJbXX1cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdmFsdWVzWCA9IHVuZGVmaW5lZFxuICAgKi9cbiAgc2NhdHRlci52YWx1ZXNYID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2YWx1ZXNYID1fLCBzY2F0dGVyKSA6IHZhbHVlc1h9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdmFsdWVzWVxuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI3ZhbHVlc1l9KVxuICAgKiBAcGFyYW0ge251bWJlcltdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IG51bWJlcltdfVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB2YWx1ZXNZID0gdW5kZWZpbmVkXG4gICAqL1xuICBzY2F0dGVyLnZhbHVlc1kgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZhbHVlc1kgPV8sIHNjYXR0ZXIpIDogdmFsdWVzWX1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB2YWx1ZXNSXG4gICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjdmFsdWVzUn0pXG4gICAqIEBwYXJhbSB7bnVtYmVyW119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtzY2F0dGVyIHwgbnVtYmVyW119XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHZhbHVlc1IgPSB1bmRlZmluZWRcbiAgICovXG4gIHNjYXR0ZXIudmFsdWVzUiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmFsdWVzUiA9Xywgc2NhdHRlcikgOiB2YWx1ZXNSfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRvb2x0aXBcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciN0b29sdGlwfSlcbiAgICogQHBhcmFtIHt0b29sdGlwfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IHRvb2x0aXB9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHRvb2x0aXAgPSB0b29sdGlwKClcbiAgICovXG5cbiAgc2NhdHRlci50b29sdGlwID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0b29sdGlwID1fLCBzY2F0dGVyKSA6IHRvb2x0aXB9XG5cblxuICBmdW5jdGlvbiBzY2F0dGVyKCkge1xuICAgIC8vIGJhY2tncm91bmQgY2xpcGluZyByZWN0YW5nbGVcbiAgICB2YXIgYmdjcFJlY3QgPSB7eDowLCB5OjAsIHdpZHRoOiBzcGFjZVgsIGhlaWdodDpzcGFjZVl9XG4gICAgdmFyIGNvbnRhaW5lciA9IHNldHVwQ29udGFpbmVyKCBzZWxlY3Rpb24sIG5hbWVzcGFjZSwgYmdjcFJlY3QsIGJhY2tncm91bmRGaWxsICk7XG5cblxuICAgIHBvaW50S2V5cyA9IGQzLmtleXMoZGF0YSlcbiAgICB2YWx1ZXNYID0gcG9pbnRLZXlzLm1hcCh2YWx1ZUV4dHJhY3RvclgpXG4gICAgdmFsdWVzWSA9IHBvaW50S2V5cy5tYXAodmFsdWVFeHRyYWN0b3JZKVxuICAgIHZhbHVlc1IgPSBwb2ludEtleXMubWFwKHZhbHVlRXh0cmFjdG9yUilcblxuICAgIHZhciBudW1iZXJPZk9iamVjdHMgPSBwb2ludEtleXMubGVuZ3RoXG4gICAgdmFyIGV4dGVudFggPSBbTWF0aC5taW4oLi4udmFsdWVzWCkgLSBkb21haW5QYWRkaW5nWCwgTWF0aC5tYXgoLi4udmFsdWVzWCkgKyBkb21haW5QYWRkaW5nWF1cbiAgICB2YXIgZXh0ZW50WSA9IFtNYXRoLm1pbiguLi52YWx1ZXNZKSAtIGRvbWFpblBhZGRpbmdZLCBNYXRoLm1heCguLi52YWx1ZXNZKSArIGRvbWFpblBhZGRpbmdZXVxuICAgIHZhciBleHRlbnRSID0gW01hdGgubWluKC4uLnZhbHVlc1IpIC0gZG9tYWluUGFkZGluZ1IsIE1hdGgubWF4KC4uLnZhbHVlc1IpICsgZG9tYWluUGFkZGluZ1JdXG5cbiAgICBzY2FsZVguZG9tYWluKGV4dGVudFgpLnJhbmdlKFswLCBzcGFjZVhdKVxuICAgIHNjYWxlWS5kb21haW4oZXh0ZW50WSkucmFuZ2UoW3NwYWNlWSwgMF0pXG4gICAgc2NhbGVSLmRvbWFpbihleHRlbnRSKS5yYW5nZShbbWluUmFkaXVzLCBtYXhSYWRpdXNdKVxuXG4gICAgdmFyIHBvaW50cyA9IGNvbnRhaW5lci5zZWxlY3RBbGwoJy4nK29iamVjdENsYXNzKVxuICAgIHBvaW50cyA9IHBvaW50cy5kYXRhKHBvaW50S2V5cylcbiAgICB2YXIgcEVudGVyID0gcG9pbnRzLmVudGVyKCkuYXBwZW5kKCdjaXJjbGUnKVxuICAgIC5hdHRyKCdjbGFzcycsIG9iamVjdENsYXNzKVxuICAgIC5hdHRyKCdjeCcsIDApLmF0dHIoJ2N5Jywgc3BhY2VZKS5hdHRyKCdyJywgMClcblxuICAgIHZhciBwRXhpdCA9IHBvaW50cy5leGl0KClcblxuICAgIHBvaW50cyA9IHBvaW50cy5tZXJnZShwRW50ZXIpXG5cbiAgICBwb2ludHMuZWFjaChmdW5jdGlvbihrZXksIGkpe1xuICAgICAgdmFyIHQgPSBkMy5zZWxlY3QodGhpcyksXG4gICAgICBjdXJyZW50RGF0YSA9IGRhdGFba2V5XSxcbiAgICAgIHggPSB2YWx1ZXNYW2ldLFxuICAgICAgeSA9IHZhbHVlc1lbaV0sXG4gICAgICByID0gdmFsdWVzUltpXSxcbiAgICAgIGZpbGxDb2xvciA9IGNvbG9yRnVuY3Rpb24oa2V5LCBjdXJyZW50RGF0YSwgaSwgJ2ZpbGwnKSxcbiAgICAgIHN0cm9rZUNvbG9yID0gY29sb3JGdW5jdGlvbihrZXksIGN1cnJlbnREYXRhLCBpLCAnc3Ryb2tlJylcblxuICAgICAgdC50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlKGVhc2VGdW5jKVxuICAgICAgLmF0dHIoJ2N4Jywgc2NhbGVYKHgpKVxuICAgICAgLmF0dHIoJ2N5Jywgc2NhbGVZKHkpKVxuICAgICAgLmF0dHIoJ3InLCBzY2FsZVIocikpXG4gICAgICAuYXR0cignZmlsbCcsIGZpbGxDb2xvcilcbiAgICAgIC5hdHRyKCdzdHJva2UnLCBzdHJva2VDb2xvcilcbiAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCBwb2ludFN0cm9rZVdpZHRoKVxuXG5cblxuICAgICAgdC5vbignbW91c2VvdmVyJywgZnVuY3Rpb24oZCwgaSl7XG4gICAgICAgIHBvaW50cy5zdHlsZSgnb3BhY2l0eScsIDAuMilcbiAgICAgICAgdC5zdHlsZSgnb3BhY2l0eScsIDEpXG4gICAgICAgIHQudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbi8yKS5lYXNlKGVhc2VGdW5jKVxuICAgICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgcG9pbnRTdHJva2VXaWR0aCoyKVxuICAgICAgICAuYXR0cigncicsIHNjYWxlUihyKSAqIDEuNSlcblxuICAgICAgfSlcbiAgICAgIHQubm9kZSgpLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgZnVuY3Rpb24oKXtcbiAgICAgICAgY29udGFpbmVyLnNlbGVjdEFsbCgnLicrb2JqZWN0Q2xhc3MpLnN0eWxlKCdvcGFjaXR5JywgMSlcbiAgICAgICAgdC50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uLzIpLmVhc2UoZWFzZUZ1bmMpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCBwb2ludFN0cm9rZVdpZHRoKVxuICAgICAgICAuYXR0cigncicsIHNjYWxlUihyKSlcblxuICAgICAgfSlcblxuICAgIH0pXG5cblxuXG4gICAgcEV4aXQudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuZWFzZShlYXNlRnVuYylcbiAgICAuYXR0cignY3gnLCAwKS5hdHRyKCdjeScsIHNwYWNlWSkuYXR0cigncicsIDApXG4gICAgLnJlbW92ZSgpXG5cbiAgICB0b29sdGlwLnNlbGVjdGlvbihwb2ludHMpXG4gICAgLmRhdGEoZGF0YSlcblxuICAgIHRvb2x0aXAoKVxuICB9XG5cblxuICByZXR1cm4gc2NhdHRlclxufVxuIiwiaW1wb3J0IHtoeXBlbmF0ZSwgc2FmZVNlbGVjdCwgZ2V0VHJhbnNsYXRpb259IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQge2xvZywgd2FybiwgZXJyb3IsIGluZm99IGZyb20gJy4vdXRpbHMnO1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUExPVFpPT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqXG4gKiBDcmVhdGVzIGFuIHBsb3Rab29tIGluc3RhbmNlLCB3aGljaCBjYW4gaGFuZGxlIGRyYWcgYW5kIHNjcm9sbCBldmVudHNcbiAqIEBjb25zdHJ1Y3RvciBwbG90Wm9vbVxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2hhcnQgYSBmdW5jdGlvbiBpbnN0YW5jZSBvZiBvbmUgb2YgdGhlIGQzc20gcGxvdHMgKGUuZy4gYmFyLCBib3h3aGlza2VyLCBidWJibGVIZWF0bWFwLCB2aW9saW4sIGV0YylcbiAqIEBwYXJhbSB7YXhpc30gIHhBeGlzIHRoZSBheGlzIGluc3RhbmNlIHJlc3BvbnNpYmxlIGZvciB0aGUgeCBheGlzXG4gKiBAcGFyYW0ge2F4aXN9IHlBeGlzIHRoZSBheGlzIGluc3RhbmNlIHJlc3BvbnNpYmxlIGZvciB0aGUgeSBheGlzXG4gKiBAbmFtZXNwYWNlIHBsb3Rab29tXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259IHpvb21cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBsb3Rab29tKCBjaGFydCwgeEF4aXMsIHlBeGlzICkge1xuICB2YXJcbiAgLyoqXG4gICogVGhlIGV2ZW50IG9uIHdoaWNoIHRvIGZpcmVcbiAgKiAoc2VlIHtAbGluayBwbG90Wm9vbSNldmVudFR5cGV9KVxuICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFR5cGUgd2hpY2ggZXZlbnQgaXQgc2hvdWxkIGhhbmRsZS4gQ3VycmVudGx5IHN1cHBvcnRzIHNjcm9sbCBhbmQgd2hlZWxcbiAgKiBAbWVtYmVyb2YgcGxvdFpvb20jXG4gICogQHByb3BlcnR5XG4gICovXG4gIGV2ZW50VHlwZSxcbiAgLyoqXG4gICogQSBzY2FsaW5nIGZhY3RvciBmb3IgdGhlIHdoZWVsIFwic3BlZWRcIlxuICAqIChzZWUge0BsaW5rIHBsb3Rab29tI3doZWVsU3BlZWR9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbd2hlZWxTcGVlZD0yMF0gc2NhbGVzIHRoZSB3aGVlbCB0cmFuc2xhdGlvbiBieSB3aGVlbFNwZWVkXG4gICogQG1lbWJlcm9mIHBsb3Rab29tI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB3aGVlbFNwZWVkID0gMjAsXG4gIC8qKlxuICAqIFRoZSBvcmllbnRhdGlvbiBpbiB3aGljaCB0byBhbGxvdyBzY3JvbGxpbmc6ICdob3Jpem9udGFsJywgJ3ZlcnRpY2FsJywgb3IgJzJEJ1xuICAqIChzZWUge0BsaW5rIHBsb3Rab29tI29yaWVudH0pXG4gICogQHBhcmFtIHtzdHJpbmd9IFtvcmllbnQ9Y2hhcnQub3JpZW50KCkgfHwgJ2hvcml6b250YWwnXVxuICAqIEBtZW1iZXJvZiBwbG90Wm9vbSNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb3JpZW50ID0gKGNoYXJ0Lm9yaWVudCA9PSB1bmRlZmluZWQpID8gJ2hvcml6b250YWwnIDogY2hhcnQub3JpZW50KCksXG4gIC8qKlxuICAqIFRoZSBtYXggZGlzdGFuY2UgYWxsb3dlZCB0byBzY3JvbGwgaW4gdGhlIHggZGlyZWN0aW9uXG4gICogKHNlZSB7QGxpbmsgcGxvdFpvb20jeExvY2t9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbeExvY2s9Y2hhcnQuc3BhY2VYKCldIGlkZWFsbHkgY2hhcnQub3ZlcmZsb3dRKCkgPT0gdHJ1ZSBhbmQgdGhpcyB2YWx1ZSBpcyB0aGVcbiAgKiBib3VuZGluZyByZWN0IGFjcm9zcyBhbGwgZWxlbWVudHMgaW4gdGhlIGNoYXJ0ICBtaW51cyB0aGUgc3BhY2UgaW4gd2hpY2ggdG8gc2hvdy5cbiAgKiBAbWVtYmVyb2YgcGxvdFpvb20jXG4gICogQHByb3BlcnR5XG4gICovXG4gIHhMb2NrPWNoYXJ0LnNwYWNlWCgpLFxuICAvKipcbiAgKiBUaGUgbWF4IGRpc3RhbmNlIGFsbG93ZWQgdG8gc2Nyb2xsIGluIHRoZSB5IGRpcmVjdGlvblxuICAqIChzZWUge0BsaW5rIHBsb3Rab29tI3lMb2NrfSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW3lMb2NrPWNoYXJ0LnNwYWNlWSgpXSBpZGVhbGx5IGNoYXJ0Lm92ZXJmbG93USgpID09IHRydWUgYW5kIHRoaXMgdmFsdWUgaXMgdGhlXG4gICogYm91bmRpbmcgcmVjdCBhY3Jvc3MgYWxsIGVsZW1lbnRzIGluIHRoZSBjaGFydCAgbWludXMgdGhlIHNwYWNlIGluIHdoaWNoIHRvIHNob3cuXG4gICogQG1lbWJlcm9mIHBsb3Rab29tI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB5TG9jaz1jaGFydC5zcGFjZVkoKSxcblxuICBjaGFydFNlbCA9IGNoYXJ0LnNlbGVjdGlvbigpLFxuICB4QXhpc1NlbCA9IHhBeGlzLnNlbGVjdGlvbigpLFxuICB5QXhpc1NlbCA9IHlBeGlzLnNlbGVjdGlvbigpXG5cblxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBldmVudCB0eXBlIGluIHdoaWNoIHRvIHJlc3BvbmRcbiAgICogKHNlZSB7QGxpbmsgcGxvdFpvb20jZXZlbnRUeXBlfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdIHNob3VsZCBiZSAnZHJhZycgb3IgJ3doZWVsJ1xuICAgKiBAcmV0dXJucyB7em9vbSB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIHBsb3Rab29tXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHBsb3Rab29tPXVuZGVmaW5lZFxuICAgKi9cbiAgem9vbS5ldmVudFR5cGUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGV2ZW50VHlwZSA9IF8sIHpvb20pIDogZXZlbnRUeXBlOyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSB3aGVlbCBzcGVlZCBpbiB3aGljaCB0byBzY2FsZSB0aGUgd2hlZWwgc2Nyb2xsIHRyYW5zZm9ybVxuICAgKiAoc2VlIHtAbGluayBwbG90Wm9vbSN3aGVlbFNwZWVkfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt6b29tIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgcGxvdFpvb21cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgd2hlZWxTcGVlZD0yMFxuICAgKi9cbiAgem9vbS53aGVlbFNwZWVkID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh3aGVlbFNwZWVkID0gXywgem9vbSkgOiB3aGVlbFNwZWVkOyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBvcmllbnRhdGlvbiBpbiB3aGljaCBpdGVtcyBhcmUgbWFuaXB1bGF0ZWRcbiAgICogKHNlZSB7QGxpbmsgcGxvdFpvb20jb3JpZW50fSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdIHNob3VsZCBiZSBob3Jpem9udGFsLCB2ZXJ0aWNhbCwgb3IgMkRcbiAgICogQHJldHVybnMge3pvb20gfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBwbG90Wm9vbVxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvcmllbnQ9Y2hhcnQub3JpZW50KCkgfHwgJ2hvcml6b250YWwnXG4gICAqL1xuICB6b29tLm9yaWVudCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob3JpZW50ID0gXywgem9vbSkgOiBvcmllbnQ7IH07XG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgbWF4IGRpc3RhbmNlIGluIHdoaWNoIHRvIHNjcm9sbCBYXG4gICAqIChzZWUge0BsaW5rIHBsb3Rab29tI3hMb2NrfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdIHNob3VsZCBiZSBhIHBvc2l0aXZlIHZhbHVlXG4gICAqIEByZXR1cm5zIHt6b29tIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgcGxvdFpvb21cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgeExvY2s9Y2hhcnQuc3BhY2VYKClcbiAgICovXG4gIHpvb20ueExvY2sgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHhMb2NrID0gXywgem9vbSkgOiB4TG9jazsgfTtcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgbWF4IGRpc3RhbmNlIGluIHdoaWNoIHRvIHNjcm9sbCBZXG4gICAqIChzZWUge0BsaW5rIHBsb3Rab29tI3lMb2NrfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdICBzaG91bGQgYmUgYSBwb3NpdGl2ZSB2YWx1ZVxuICAgKiBAcmV0dXJucyB7em9vbSB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHBsb3Rab29tXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHlMb2NrPWNoYXJ0LnNwYWNlWSgpXG4gICAqL1xuICB6b29tLnlMb2NrID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5TG9jayA9IF8sIHpvb20pIDogeUxvY2s7IH07XG5cblxuICBmdW5jdGlvbiBzZXRMb2NrcygpIHtcbiAgICB2YXIgY2hhcnRPYmpTZWwgPSBjaGFydFNlbC5zZWxlY3QoJy4nK2h5cGVuYXRlKGNoYXJ0Lm5hbWVzcGFjZSgpLCdvYmplY3QtY29udGFpbmVyJykpXG4gICAgdmFyIGNoYXJ0T2JqVHJhbnMgPSBnZXRUcmFuc2xhdGlvbihjaGFydE9ialNlbC5hdHRyKCd0cmFuc2Zvcm0nKSlcbiAgICB2YXIgY29zID0gY2hhcnRPYmpTZWwuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgwLDApJylcbiAgICB4TG9jayA9IGNoYXJ0U2VsLm5vZGUoKS5nZXRCQm94KCkud2lkdGggLSBjaGFydC5zcGFjZVgoKSAqIC45XG4gICAgeUxvY2sgPSBjaGFydFNlbC5ub2RlKCkuZ2V0QkJveCgpLmhlaWdodCAtIGNoYXJ0LnNwYWNlWSgpICogLjlcbiAgICBjb3MuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnK2NoYXJ0T2JqVHJhbnNbMF0rJywnK2NoYXJ0T2JqVHJhbnNbMV0rJyknKVxuICAgIGxvZygncGxvdFpvb20nLCAnc2V0TG9ja3MnLCB7eExvY2s6eExvY2ssIHlMb2NrOnlMb2NrfSlcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHggYW5kIHkgbG9ja3MgKGhvdyBmYXIgb25lIGNhbiBzY3JvbGwpXG4gICAqIChzZWUge0BsaW5rIHBsb3Rab29tI3hMb2NrfSBhbmQge0BsaW5rIHBsb3Rab29tI3lMb2NrfSlcbiAgICogQGZ1bmN0aW9uIHBsb3Rab29tLnNldExvY2tzXG4gICAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJvZiBwbG90Wm9vbVxuICAgKiBAcHJvcGVydHlcbiAgICovXG4gIHpvb20uc2V0TG9ja3MgPSBzZXRMb2Nrc1xuXG4gIGZ1bmN0aW9uIHpvb20oKSB7XG4gICAgc2V0TG9ja3MoKVxuXG4gICAgdmFyIGhvcml6b250YWxRLCB2ZXJ0aWNhbFFcbiAgICBpZiAob3JpZW50ID09ICcyRCcpIHtob3Jpem9udGFsUSA9IHRydWU7IHZlcnRpY2FsUSA9IHRydWU7fVxuICAgIGlmIChvcmllbnQgPT0gJ2hvcml6b250YWwnKSB7aG9yaXpvbnRhbFEgPSB0cnVlOyB2ZXJ0aWNhbFEgPSBmYWxzZTt9XG4gICAgaWYgKG9yaWVudCA9PSAndmVydGljYWwnKSB7dmVydGljYWxRID0gdHJ1ZTsgaG9yaXpvbnRhbFEgPSBmYWxzZTt9XG5cbiAgICAvLyBjYXB0dXJlIHRyYW5zZm9ybSBldmVudFxuICAgIHZhciB0cmFuc2Zvcm0gPSBkMy5ldmVudC50cmFuc2Zvcm1cblxuICAgIHZhciBjaGFydEJveCA9IGNoYXJ0U2VsLm5vZGUoKS5nZXRCQm94KClcbiAgICB2YXIgeEF4aXNCb3ggPSB4QXhpc1NlbC5ub2RlKCkuZ2V0QkJveCgpXG4gICAgdmFyIHlBeGlzQm94ID0geEF4aXNTZWwubm9kZSgpLmdldEJCb3goKVxuXG4gICAgdmFyIGNoYXJ0V2lkdGggPSBjaGFydEJveC53aWR0aCAtIGNoYXJ0Qm94LnhcbiAgICB2YXIgY2hhcnRIZWlnaHQgPSBjaGFydEJveC5oZWlnaHQgLSBjaGFydEJveC55XG4gICAgdmFyIHhBeGlzV2lkdGggPSB4QXhpc0JveC53aWR0aC8vIC0geEF4aXNCb3gueFxuICAgIHZhciB4QXhpc0hlaWdodCA9IHhBeGlzQm94LmhlaWdodC8vIC0geEF4aXNCb3gueVxuICAgIHZhciB5QXhpc1dpZHRoID0geUF4aXNCb3gud2lkdGgvLyAtIHlBeGlzQm94LnhcbiAgICB2YXIgeUF4aXNIZWlnaHQgPSB5QXhpc0JveC5oZWlnaHQvLyAteUF4aXNCb3gueVxuXG4gICAgLy8gZW5hYmxlIHdoZWVsIGV2ZW50XG4gICAgaWYgKGV2ZW50VHlwZSA9PSBcIndoZWVsXCIpIHtcbiAgICAgIHZhciBlID0gZDMuZXZlbnRcbiAgICAgIC8vIHByZXZlbnQgcGFnZSBzY3JvbGxpbmdcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgLy8gZXZlbnQgZGVsdGEgaXMgdmVyeSB2ZXJ5IHNsb3csIHNvIHNwZWVkIGl0IHVwIHdpdGggd2hlZWwgc3BlZWRcbiAgICAgIHZhciB3ID0gZDMuZXZlbnQuZGVsdGFZICogd2hlZWxTcGVlZFxuICAgICAgdmFyIHNoaWZ0USA9IGQzLmV2ZW50LnNoaWZ0S2V5XG5cbiAgICAgIC8vIGQzIGhhcyBubyB3YXkgdG8gbWFrZSBjdXN0b20gdHJhbnNmb3JtLCBzbyBtYWtlIGFuIG9iamVjdCBhbmQgYWRkXG4gICAgICAvLyB0aGUgbmVjZXNzYXJ5IGZ1bmN0aW9ucyB0byBtYWtlIHdoZWVsIGV2ZW50IGNvbXBhdGlibGUgd2l0aCBkcmFnIGV2ZW50c1xuICAgICAgaWYgKG9yaWVudCA9PSAnMkQnKSB7XG4gICAgICAgIHRyYW5zZm9ybSA9IHNoaWZ0USA/IHtrOiAxLCB4OiB3LCB5OiAwfSA6IHtrOiAxLCB4OiAwLCB5OiB3fVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJhbnNmb3JtID0gaG9yaXpvbnRhbFEgPyB7azogMSwgeDogdywgeTogMH0gOiB7azogMSwgeDogMCwgeTogd31cbiAgICAgIH1cbiAgICAgIHRyYW5zZm9ybS5hcHBseVggPSBmdW5jdGlvbih4KSB7IHJldHVybiB4ICogdGhpcy5rICsgdGhpcy54OyB9XG4gICAgICB0cmFuc2Zvcm0uYXBwbHlZID0gIGZ1bmN0aW9uKHkpIHsgcmV0dXJuIHkgKiB0aGlzLmsgKyB0aGlzLnk7IH1cbiAgICB9XG5cblxuXG4gICAgdmFyIGNoYXJ0T2JqU2VsID0gY2hhcnRTZWwuc2VsZWN0KCcuJytoeXBlbmF0ZShjaGFydC5uYW1lc3BhY2UoKSwnb2JqZWN0LWNvbnRhaW5lcicpKVxuICAgIHZhciB4QXhpc09ialNlbCA9IHhBeGlzU2VsLnNlbGVjdCgnLicraHlwZW5hdGUoeEF4aXMubmFtZXNwYWNlKCksJ29iamVjdC1jb250YWluZXInKSlcbiAgICB2YXIgeUF4aXNPYmpTZWwgPSB5QXhpc1NlbC5zZWxlY3QoJy4nK2h5cGVuYXRlKHlBeGlzLm5hbWVzcGFjZSgpLCdvYmplY3QtY29udGFpbmVyJykpXG5cbiAgICAvLyB4TG9jayA9IGNoYXJ0U2VsLm5vZGUoKS5nZXRCQm94KCkud2lkdGggLSBjaGFydC5zcGFjZVgoKSAtIGNoYXJ0U2VsLm5vZGUoKS5nZXRCQm94KCkueFxuICAgIC8vIHlMb2NrID0gY2hhcnRTZWwubm9kZSgpLmdldEJCb3goKS5oZWlnaHQgLSBjaGFydC5zcGFjZVkoKVxuICAgIC8vIGNvbnNvbGUudGFibGUoeyd4TG9jayc6eExvY2ssIFwieUxvY2tcIjp5TG9ja30pXG4gICAgLy8gYmhtLnNlbGVjdGlvbigpLm5vZGUoKS5nZXRCQm94KCkud2lkdGggLSBiaG0uc3BhY2VYKClcblxuXG4gICAgdmFyIGNoYXJ0T2JqVHJhbnMgPSBnZXRUcmFuc2xhdGlvbihjaGFydE9ialNlbC5hdHRyKCd0cmFuc2Zvcm0nKSlcbiAgICB2YXIgeEF4aXNPYmpUcmFucyA9IGdldFRyYW5zbGF0aW9uKHhBeGlzT2JqU2VsLmF0dHIoJ3RyYW5zZm9ybScpKVxuICAgIHZhciB5QXhpc09ialRyYW5zID0gZ2V0VHJhbnNsYXRpb24oeUF4aXNPYmpTZWwuYXR0cigndHJhbnNmb3JtJykpXG5cblxuICAgIHZhciB4ID0gaG9yaXpvbnRhbFEgPyB0cmFuc2Zvcm0uYXBwbHlYKGNoYXJ0T2JqVHJhbnNbMF0pIDogMFxuICAgIGlmIChob3Jpem9udGFsUSkge3ggPSB4IDwgLXhMb2NrID8gKHRyYW5zZm9ybS54ID0gMCwgLXhMb2NrKSA6ICh0cmFuc2Zvcm0ueCA9IDAsIE1hdGgubWluKHgsIDApKSB9XG5cbiAgICB2YXIgeSA9IHZlcnRpY2FsUSA/IHRyYW5zZm9ybS5hcHBseVkoY2hhcnRPYmpUcmFuc1sxXSkgOiAwXG4gICAgaWYgKHZlcnRpY2FsUSkge3kgPSB5IDwgLXlMb2NrID8gKHRyYW5zZm9ybS55ID0gMCwgLXlMb2NrKTogKHRyYW5zZm9ybS55ID0gMCwgTWF0aC5taW4oeSwgMCkpfVxuXG4gICAgY2hhcnRPYmpTZWwuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnK3grJywnK3krJyknKVxuICAgIGlmIChob3Jpem9udGFsUSkgeyB4QXhpc09ialNlbC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcreCsnLCcrMCsnKScpIH1cbiAgICBpZiAodmVydGljYWxRKSB7IHlBeGlzT2JqU2VsLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyswKycsJyt5KycpJykgfVxuXG4gIH1cblxuICB6b29tLnJlc2V0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGhvcml6b250YWxRLCB2ZXJ0aWNhbFFcbiAgICBpZiAob3JpZW50ID09ICcyRCcpIHtob3Jpem9udGFsUSA9IHRydWU7IHZlcnRpY2FsUSA9IHRydWU7fVxuICAgIGlmIChvcmllbnQgPT0gJ2hvcml6b250YWwnKSB7aG9yaXpvbnRhbFEgPSB0cnVlOyB2ZXJ0aWNhbFEgPSBmYWxzZTt9XG4gICAgaWYgKG9yaWVudCA9PSAndmVydGljYWwnKSB7dmVydGljYWxRID0gdHJ1ZTsgaG9yaXpvbnRhbFEgPSBmYWxzZTt9XG5cbiAgICB2YXIgY2hhcnRPYmpTZWwgPSBjaGFydFNlbC5zZWxlY3QoJy4nK2h5cGVuYXRlKGNoYXJ0Lm5hbWVzcGFjZSgpLCdvYmplY3QtY29udGFpbmVyJykpXG4gICAgdmFyIHhBeGlzT2JqU2VsID0geEF4aXNTZWwuc2VsZWN0KCcuJytoeXBlbmF0ZSh4QXhpcy5uYW1lc3BhY2UoKSwnb2JqZWN0LWNvbnRhaW5lcicpKVxuICAgIHZhciB5QXhpc09ialNlbCA9IHlBeGlzU2VsLnNlbGVjdCgnLicraHlwZW5hdGUoeUF4aXMubmFtZXNwYWNlKCksJ29iamVjdC1jb250YWluZXInKSlcbiAgICBjaGFydE9ialNlbC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcrMCsnLCcrMCsnKScpXG4gICAgeEF4aXNPYmpTZWwuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnKzArJywnKzArJyknKVxuICAgIHlBeGlzT2JqU2VsLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyswKycsJyswKycpJylcbiAgfVxuXG4gIHJldHVybiB6b29tXG59XG4iLCJpbXBvcnQge2h5cGVuYXRlLCBzYWZlU2VsZWN0LCBtb2RpZnlIZXhpZGVjaW1hbENvbG9yTHVtaW5hbmNlLCBleHRyYWN0VmlvbGluVmFsdWVzLCBxdWFydGlsZXN9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQge3NldHVwQ29udGFpbmVyLCBjYWxjdWxhdGVXaWR0aE9mT2JqZWN0LCBjYWxjdWxhdGVXaWR0aE9mU3BhY2VyfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7dW5pcXVlLCBoYXNRLCBmbGF0dGVuLCB3aGljaEJpbn0gZnJvbSAnLi9hcnJheS1mdW5jdGlvbnMnO1xuaW1wb3J0IHtncm91cGluZ1NwYWNlcn0gZnJvbSAnLi9ncm91cGluZy1zcGFjZXInO1xuaW1wb3J0IHtjb2xvckZ1bmN0aW9uIGFzIENGfSBmcm9tICcuL2NvbG9yLWZ1bmN0aW9uJztcbmltcG9ydCB7dG9vbHRpcCBhcyBUVGlwfSBmcm9tICcuL3Rvb2x0aXAnO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZJT0xJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vKipcbiAqIENyZWF0ZXMgYSB2aW9saW5cbiAqXG4gKiB7QGxpbmsgaHR0cHM6Ly9zdW1uZXVyb24uZ2l0bGFiLmlvL2Qzc20vZGVtb3MvYmFzaWMtdmlvbGlucy9pbmRleC5odG1sIERlbW99XG4gKiBAY29uc3RydWN0b3IgdmlvbGluXG4gKiBAcGFyYW0ge2QzLnNlbGVjdGlvbn0gc2VsZWN0aW9uXG4gKiBAbmFtZXNwYWNlIHZpb2xpblxuICogQHJldHVybnMge2Z1bmN0aW9ufSB2aW9saW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZpb2xpbiggc2VsZWN0aW9uICkge1xuICB2YXJcbiAgLyoqXG4gICogRGF0YSB0byBwbG90LiBBc3N1bWVkIHRvIGJlIGEgb2JqZWN0LCB3aGVyZSBlYWNoIGtleSBjb3JyZXNwb25kcyB0byBhIHZpb2xpblxuICAqIChzZWUge0BsaW5rIGJhciNkYXRhfSlcbiAgKiBAcGFyYW0ge09iamVjdH0gW2RhdGE9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGRhdGEsXG4gIC8qKlxuICAqIFdoaWNoIGRpcmVjdGlvbiB0byByZW5kZXIgdGhlIGJhcnMgaW5cbiAgKiAoc2VlIHtAbGluayBiYXIjb3JpZW50fSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW29yaWVudD0naG9yaXpvbnRhbCddXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb3JpZW50PSdob3Jpem9udGFsJyxcbiAgLyoqXG4gICogQW1vdW50IG9mIGhvcml6b250YWwgc3BhY2UgKGluIHBpeGVscykgYXZhaWJsZSB0byByZW5kZXIgdGhlIGJhciBpblxuICAqIChzZWUge0BsaW5rIGJhciNzcGFjZVh9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbc3BhY2VYPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzcGFjZVgsXG4gIC8qKlxuICAqIEFtb3VudCBvZiB2ZXJ0aWNhbCBzcGFjZSAoaW4gcGl4ZWxzKSBhdmFpYmxlIHRvIHJlbmRlciB0aGUgYmFyIGluXG4gICogKHNlZSB7QGxpbmsgYmFyLnNwYWNlWX0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZVk9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNwYWNlWSxcbiAgLyoqXG4gICogV2hldGhlciBvciBub3QgdG8gYWxsb3cgYmFyIHRvIHJlbmRlciBlbGVtZW50cyBwYXNzIHRoZSBtYWluIHNwYXRpYWwgZGltZW5zaW9uXG4gICogZ2l2ZW4gdGhlIG9yaWVudGF0aW9uIChzZWUge0BsaW5rIGJhciNvcmllbnR9KSwgd2hlcmUge0BsaW5rIGJhciNvcmllbnR9PVwiaG9yaXpvbnRhbFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBiYXIjc3BhY2VYfSBhbmQgd2hlcmUge0BsaW5rIGJhciNvcmllbnR9PVwidmVydGljYWxcIlxuICAqIHRoZSBtYWluIGRpbWVuc2lvbiBpcyB7QGxpbmsgYmFyI3NwYWNlWX1cbiAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvdmVyZmxvd1E9ZmFsc2VdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb3ZlcmZsb3dRID0gdHJ1ZSxcbiAgLyoqXG4gICogV2hldGhlciBvciBub3QgdG8gZGlzcGxheSBwb2ludHMgaW5zaWRlIHRoZSBwb2ludHNcbiAgKiBAcGFyYW0ge2Jvb2xlYW59IFtwb2ludHNRPWZhbHNlXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHBvaW50c1EgPSB0cnVlLFxuICAvKipcbiAgKiBBbiBhcnJheSAtIHB1dGF0aXZlbHkgb2Ygb3RoZXIgYXJyYXlzIC0gZGVwaWN0aW5nIGhvdyBiYXJzIHNob3VsZCBiZSBhcnJhbmdlZFxuICAqIEBwYXJhbSB7QXJyYXlbXX0gW2dyb3VwaW5nPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBncm91cGluZyxcbiAgLyoqXG4gICogSG93IHRvIGdldCB0aGUgdmFsdWUgb2YgdGhlIGJhclxuICAqIEBwYXJhbSB7ZnVuY3Rpb259IFt2YWx1ZUV4dHJhY3Rvcj1mdW5jdGlvbihrZXksIGluZGV4KSB7IHJldHVybiBkYXRhW2tleV0gfV1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB2YWx1ZUV4dHJhY3RvciA9IGZ1bmN0aW9uKGtleSwgaW5kZXgpIHtyZXR1cm4gZGF0YVtrZXldIH0sXG4gIC8qKlxuICAqIEhvdyB0byBzb3J0IHRoZSBiYXJzIC0gaWYge0BsaW5rIGJhciNncm91cGluZ30gaXMgbm90IHByb3ZpZGVkLlxuICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtzb3J0aW5nRnVuY3Rpb249ZnVuY3Rpb24oa2V5QSwga2V5Qikge3JldHVybiBkMy5kZXNjZW5kaW5nKGRhdGFba2V5QV0sIGRhdGFba2V5Ql0pfV1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzb3J0aW5nRnVuY3Rpb24gPSBmdW5jdGlvbihrZXlBLCBrZXlCKSB7cmV0dXJuIGQzLmRlc2NlbmRpbmcoZGF0YVtrZXlBXSwgZGF0YVtrZXlCXSl9LFxuXG4gIC8qKlxuICAqIFRoZSBzY2FsZSBmb3Igd2hpY2ggYmFyIHZhbHVlcyBzaG91bGQgYmUgdHJhbnNmb3JtZWQgYnlcbiAgKiBAcGFyYW0ge2QzLnNjYWxlfSBbc2NhbGU9ZDMuc2NhbGVMaW5lYXJdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc2NhbGUgPSBkMy5zY2FsZUxpbmVhcigpLFxuICAvKipcbiAgKiBUaGUgcGFkZGluZyBmb3IgdGhlIGRvbWFpbiBvZiB0aGUgc2NhbGUgKHNlZSB7QGxpbmsgYmFyI3NjYWxlfSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW2RvbWFpblBhZGRpbmc9MC41XVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGRvbWFpblBhZGRpbmcgPSAwLjUsXG4gIC8qKlxuICAqIERlZmF1bHQgc3BhY2UgZm9yIHRoZSBzcGFjZXIgKHBlcmNlbnRhZ2UpIG9mIG1haW4gZGltZW5zaW9uIGdpdmVuIHRoZSBvcmllbnRhdGlvblxuICAqIChzZWUge0BsaW5rIGJhciNvcmllbnR9KSwgd2hlcmUge0BsaW5rIGJhciNvcmllbnR9PVwiaG9yaXpvbnRhbFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBiYXIjc3BhY2VYfSBhbmQgd2hlcmUge0BsaW5rIGJhciNvcmllbnR9PVwidmVydGljYWxcIlxuICAqIHRoZSBtYWluIGRpbWVuc2lvbiBpcyB7QGxpbmsgYmFyI3NwYWNlWX0gYmV0d2VlbiBiYXJzXG4gICogQHBhcmFtIHtudW1iZXJ9IFtvYmplY3RTcGFjZXI9MC4wNV1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBvYmplY3RTcGFjZXIgPSAwLjA1LFxuICAvKipcbiAgKiBUaGUgbWluaW11bSBzaXplIHRoYXQgYW4gb2JqZWN0IGNhbiBiZVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbbWluT2JqZWN0U2l6ZT01MF1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBtaW5PYmplY3RTaXplID0gNTAsXG4gIC8qKlxuICAqIFRoZSBtYXhpbXVtIHNpemUgdGhhdCBhbiBvYmplY3QgY2FuIGJlXG4gICogQHBhcmFtIHtudW1iZXJ9IFttYXhPYmplY3RTaXplPTEwMF1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBtYXhPYmplY3RTaXplID0gMTAwLFxuXG4gIC8qKlxuICAqIFRoZSBzdHJva2Ugd2lkdGggb2YgdGhlIGJhcnNcbiAgKiBAcGFyYW0ge251bWJlcn0gW2JhclN0cm9rZVdpZHRoPTJdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb2JqZWN0U3Ryb2tlV2lkdGggPSAyLFxuICAvKipcbiAgKiBJbnN0YW5jZSBvZiBDb2xvckZ1bmN0aW9uXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW2NvbG9yRnVuY3Rpb24gPSBjb2xvckZ1bmN0aW9uKCldXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgY29sb3JGdW5jdGlvbiA9IENGKCksXG4gIC8qKlxuICAqIEluc3RhbmNlIG9mIENvbG9yRnVuY3Rpb24gbW9kaWZpZWQgYnkgYSBzY2FsZSBmb3IgdGhlIHBvaW50c1xuICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtwb2ludENvbG9yRnVuYyA9IGNvbG9yRnVuY3Rpb24oKV1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBwb2ludENvbG9yRnVuYyA9IGZ1bmN0aW9uIChkLCB0eXBlLCBiYXNlLCBtaW4sIG1heCkge1xuICAgIHZhciBtaW5NYXhIZXhTY2FsZSA9IGQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFttYXgsIG1pbl0pLnJhbmdlKFstMC4yNSwgMC4yNV0pXG4gICAgdmFyIHNjYWxlZENvbG9yID0gbW9kaWZ5SGV4aWRlY2ltYWxDb2xvckx1bWluYW5jZShiYXNlLnJlcGxhY2UoJyMnLCAnJyksIG1pbk1heEhleFNjYWxlKGQpKVxuICAgIHZhciBtb2QgPSB0eXBlID09IFwic3Ryb2tlXCIgPyAwIDogMC4yNVxuICAgIHJldHVybiBtb2RpZnlIZXhpZGVjaW1hbENvbG9yTHVtaW5hbmNlKHNjYWxlZENvbG9yLnJlcGxhY2UoJyMnLCAnJyksIG1vZClcbiAgfSxcblxuICAvKipcbiAgKiBUaGUgcmFkaXVzIG9mIGEgcG9pbnRcbiAgKiBAcGFyYW0ge251bWJlcn0gW3BvaW50UmFkaXVzPTNdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgcG9pbnRSYWRpdXMgPSAzLFxuICAvKipcbiAgKiBUaGUgc3Ryb2tlIHdpZHRoIG9mIHRoZSBvaW50c1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbcG9pbnRTdHJva2VXaWR0aD0yXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHBvaW50U3Ryb2tlV2lkdGggPSAyLFxuXG4gIC8qKlxuICAqIENvbG9yIG9mIHRoZSBiYWNrZ3JvdW5kXG4gICogQHBhcmFtIHtzdHJpbmd9IFtiYWNrZ3JvdW5kRmlsbD1cInRyYW5zcGFyZW50XCJdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgYmFja2dyb3VuZEZpbGwgPSAndHJhbnNwYXJlbnQnLFxuICAvKipcbiAgKiBOYW1lc3BhY2UgZm9yIGFsbCBpdGVtcyBtYWRlIGJ5IHRoaXMgaW5zdGFuY2Ugb2YgYmFyXG4gICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lc3BhY2U9XCJkM3NtLXZpb2xpblwiXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG5hbWVzcGFjZSA9ICdkM3NtLXZpb2xpbicsXG4gIC8qKlxuICAqIENsYXNzIG5hbWUgZm9yIGJhciBjb250YWluZXIgKDxnPiBlbGVtZW50KVxuICAqIEBwYXJhbSB7c3RyaW5nfSBbb2JqZWN0Q2xhc3M9XCJ2aW9saW5cIl1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBvYmplY3RDbGFzcyA9ICd2aW9saW4nLFxuICAvKipcbiAgKiBEdXJhdGlvbiBvZiBhbGwgdHJhbnNpdGlvbnMgb2YgdGhpcyBlbGVtZW50XG4gICogQHBhcmFtIHtudW1iZXJ9IFt0cmFuc2l0aW9uRHVyYXRpb249MTAwMF1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB0cmFuc2l0aW9uRHVyYXRpb24gPSAxMDAwLFxuICAvKipcbiAgKiBFYXNpbmcgZnVuY3Rpb24gZm9yIHRyYW5zaXRpb25zXG4gICogQHBhcmFtIHtkMy5lYXNlfSBbZWFzZUZ1bmM9ZDMuZWFzZUV4cF1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBlYXNlRnVuYyA9IGQzLmVhc2VFeHAsXG5cbiAgLyoqXG4gICogVGhlIGtleSBjb250YWluaW5nIHRoZSBxdWFydGlsZXNcbiAgKiBAcGFyYW0ge3N0cmluZ30gW3F1YXJ0aWxlc0tleT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgcXVhcnRpbGVzS2V5ID0gXCJxdWFydGlsZXNcIixcbiAgLyoqXG4gICogVGhlIGtleXMgY29ycmVzcG9uZGluZyB0byBlYWNoIHF1YXJ0aWxlXG4gICogQHBhcmFtIHtzdHJpbmdbXX0gW3F1YXJ0aWxlS2V5cz1bXCJRMFwiLCBcIlExXCIsIFwiUTJcIiwgXCJRM1wiLCBcIlE0XCJdXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHF1YXJ0aWxlS2V5cyA9IFtcIlEwXCIsIFwiUTFcIiwgXCJRMlwiLCBcIlEzXCIsIFwiUTRcIl0sXG5cbiAgLyoqXG4gICogVGhlIGtleXMgb2YgdGhlIGJhcnNcbiAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbdmlvbGluS2V5cz11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdmlvbGluS2V5cyxcbiAgLyoqXG4gICogVGhlIHZhbHVlcyBvZiB0aGUgYmFyc1xuICAqIEBwYXJhbSB7bnVtYmVyW119IFt2aW9saW5WYWx1ZXM9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHZpb2xpblZhbHVlcyxcbiAgLyoqXG4gICogVGhlIG9iamVjdFNpemUgKGFjdHVhbCB3aWR0aCkgdXNlZCBieSB0aGUgYmFyc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbb2JqZWN0U2l6ZT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb2JqZWN0U2l6ZSxcbiAgLyoqXG4gICogVGhlIHNwYWNlclNpemUgKGFjdHVhbCB3aWR0aCkgdXNlZCBieSB0aGUgc3BhY2VycyBiZXR3ZWVuIHRoZSBiYXJzXG4gICogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZXJTaXplPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzcGFjZXJTaXplLFxuXG4gIC8qKlxuICAqIEluc3RhbmNlIG9mIFRvb2x0aXBcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbdG9vbHRpcD10b29sdGlwKCldXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdG9vbHRpcCA9IFRUaXAoKS5rZXlzKFtxdWFydGlsZUtleXNbNF0sIHF1YXJ0aWxlS2V5c1szXSwgcXVhcnRpbGVLZXlzWzJdLCBxdWFydGlsZUtleXNbMV0sIHF1YXJ0aWxlS2V5c1swXV0pLFxuICBwb2ludHNUb29sdGlwID0gVFRpcCgpLFxuICBwb2ludEtleUV4dHJhY3RvciA9IGZ1bmN0aW9uKHZpb2xpbktleSwgdmlvbGluRGF0YSwgdmlvbGluVmFsdWVzKSB7cmV0dXJuIGQzLmtleXModmlvbGluVmFsdWVzW3Zpb2xpbktleV0udmFsdWVzKX0sXG4gIHBvaW50VmFsdWVFeHRyYWN0b3IgPSBmdW5jdGlvbihwb2ludEtleSwgdmlvbGluS2V5LCB2aW9saW5EYXRhLCB2aW9saW5WYWx1ZXMpIHtyZXR1cm4gdmlvbGluVmFsdWVzW3Zpb2xpbktleV0udmFsdWVzW3BvaW50S2V5XX1cblxuICAvLyxcbiAgLy8gcG9pbnRzVG9vbHRpcCA9IFRUaXAoKVxuXG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgc2VsZWN0aW9uIGluIHdoaWNoIGl0ZW1zIGFyZSBtYW5pcHVsYXRlZFxuICAgKiBAcGFyYW0ge2QzLnNlbGVjdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IGQzLnNlbGVjdGlvbn1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzZWxlY3Rpb24gPSBzZWxlY3Rpb25cbiAgICovXG4gIHZpb2xpbi5zZWxlY3Rpb24gPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNlbGVjdGlvbiA9IF8sIHZpb2xpbikgOiBzZWxlY3Rpb247IH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGRhdGFcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI2RhdGF9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IG9iamVjdH1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICovXG4gIHZpb2xpbi5kYXRhID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkYXRhID0gXywgdmlvbGluKSA6IGRhdGE7IH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIG9yaWVudCBvZiB0aGUgYm94ZXNcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI29yaWVudH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgb2JqZWN0fVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKi9cbiAgdmlvbGluLm9yaWVudCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob3JpZW50ID0gXywgdmlvbGluKSA6IG9yaWVudDsgfTtcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgYW1vdW50IG9mIGhvcml6b250YWwgc3BhY2UgaW4gd2hpY2ggaXRlbXMgYXJlIG1hbmlwdWxhdGVkXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNzcGFjZVh9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV0gc2hvdWxkIGJlIGEgbnVtYmVyID4gMFxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNwYWNlWCA9IHVuZGVmaW5lZFxuICAgKi9cbiAgdmlvbGluLnNwYWNlWCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3BhY2VYID0gXywgdmlvbGluKSA6IHNwYWNlWDsgfTtcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgYW1vdW50IG9mIHZlcnRpY2FsIHNwYWNlIGluIHdoaWNoIGl0ZW1zIGFyZSBtYW5pcHVsYXRlZFxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jc3BhY2VZfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdIHNob3VsZCBiZSBhIG51bWJlciA+IDBcbiAgICogQHJldHVybnMge3Zpb2xpbiB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzcGFjZVkgPSB1bmRlZmluZWRcbiAgICovXG4gIHZpb2xpbi5zcGFjZVkgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNwYWNlWSA9IF8sIHZpb2xpbikgOiBzcGFjZVk7IH07XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgd2hldGhlciBvciBub3QgdmlvbGluIGlzIGFsbG93ZWQgdG8gZ28gYmV5b25kIHNwZWNpZmllZCBkaW1lbnNpb25zXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNvdmVyZmxvd1F9KVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBib29sZWFufVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG92ZXJmbG93USA9IGZhbHNlXG4gICAqL1xuICB2aW9saW4ub3ZlcmZsb3dRID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvdmVyZmxvd1EgPSBfLCB2aW9saW4pIDogb3ZlcmZsb3dROyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgd2hldGhlciBvciBub3QgdG8gcGxvdCBwb2ludHMgd2l0aCB0aGUgdmlvbGluc1xuICAgKiAoc2VlIHtAbGluayB2aW9saW4jcG9pbnRzUX0pXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IGJvb2xlYW59XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgcG9pbnRzUSA9IGZhbHNlXG4gICAqL1xuICB2aW9saW4ucG9pbnRzUSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocG9pbnRzUSA9IF8sIHZpb2xpbikgOiBwb2ludHNROyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBncm91cGluZyBvZiB0aGUgYm94ZXNcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI2dyb3VwaW5nfSlcbiAgICogQHBhcmFtIHtBcnJheVtdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgQXJyYXlbXX1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBncm91cGluZyA9IHVuZGVmaW5lZFxuICAgKi9cbiAgdmlvbGluLmdyb3VwaW5nID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChncm91cGluZyA9IF8sIHZpb2xpbikgOiBncm91cGluZzsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB2YWx1ZUV4dHJhY3RvclxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jdmFsdWVFeHRyYWN0b3J9KVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgZnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqL1xuICB2aW9saW4udmFsdWVFeHRyYWN0b3IgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZhbHVlRXh0cmFjdG9yID0gXywgdmlvbGluKSA6IHZhbHVlRXh0cmFjdG9yOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNvcnRpbmdGdW5jdGlvblxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jc29ydGluZ0Z1bmN0aW9ufSlcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IGZ1bmN0aW9ufVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKi9cbiAgdmlvbGluLnNvcnRpbmdGdW5jdGlvbiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc29ydGluZ0Z1bmN0aW9uID0gXywgdmlvbGluKSA6IHNvcnRpbmdGdW5jdGlvbjsgfTtcblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNjYWxlIGZvciB3aGljaCB0aGUgdmlvbGluIHZhbHVlcyBzaG91bGQgYmUgdHJhbnNmb3JtZWQgYnlcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI3NjYWxlfSlcbiAgICogQHBhcmFtIHtkMy5zY2FsZX0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IGQzLnNjYWxlfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKVxuICAgKi9cbiAgdmlvbGluLnNjYWxlID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzY2FsZSA9IF8sIHZpb2xpbikgOiBzY2FsZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBwYWRkaW5nIGZvciB0aGUgZG9tYWluIG9mIHRoZSBzY2FsZVxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jZG9tYWluUGFkZGluZ30pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGRvbWFpblBhZGRpbmcgPSAwLjVcbiAgICovXG4gIHZpb2xpbi5kb21haW5QYWRkaW5nID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkb21haW5QYWRkaW5nID0gXywgdmlvbGluKSA6IGRvbWFpblBhZGRpbmc7IH07XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgb2JqZWN0U3BhY2VyXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNvYmplY3RTcGFjZXJ9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvYmplY3RTcGFjZXIgPSAwLjA1XG4gICAqL1xuICB2aW9saW4ub2JqZWN0U3BhY2VyID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvYmplY3RTcGFjZXIgPSBfLCB2aW9saW4pIDogb2JqZWN0U3BhY2VyOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG1pbk9iamVjdFNpemVcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI21pbk9iamVjdFNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBtaW5PYmplY3RTaXplID0gMTVcbiAgICovXG4gIHZpb2xpbi5taW5PYmplY3RTaXplID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChtaW5PYmplY3RTaXplID0gXywgdmlvbGluKSA6IG1pbk9iamVjdFNpemU7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbWF4T2JqZWN0U2l6ZVxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jbWF4T2JqZWN0U2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG1heE9iamVjdFNpemUgPSA1MFxuICAgKi9cbiAgdmlvbGluLm1heE9iamVjdFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG1heE9iamVjdFNpemUgPSBfLCB2aW9saW4pIDogbWF4T2JqZWN0U2l6ZTsgfTtcblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG9iamVjdFN0cm9rZVdpZHRoXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNvYmplY3RTdHJva2VXaWR0aH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG9iamVjdFN0cm9rZVdpZHRoID0gMlxuICAgKi9cbiAgdmlvbGluLm9iamVjdFN0cm9rZVdpZHRoID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvYmplY3RTdHJva2VXaWR0aCA9IF8sIHZpb2xpbikgOiBvYmplY3RTdHJva2VXaWR0aDsgfTtcblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgY29sb3JGdW5jdGlvblxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jY29sb3JGdW5jdGlvbn0pXG4gICAqIEBwYXJhbSB7Y29sb3JGdW5jdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IGNvbG9yRnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgY29sb3JGdW5jdGlvbiA9IGNvbG9yRnVuY3Rpb24oKVxuICAgKi9cbiAgdmlvbGluLmNvbG9yRnVuY3Rpb24gPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNvbG9yRnVuY3Rpb24gPSBfLCB2aW9saW4pIDogY29sb3JGdW5jdGlvbjsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBjb2xvckZ1bmN0aW9uXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNjb2xvckZ1bmN0aW9ufSlcbiAgICogQHBhcmFtIHtjb2xvckZ1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgY29sb3JGdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBjb2xvckZ1bmN0aW9uID0gY29sb3JGdW5jdGlvbigpXG4gICAqL1xuICB2aW9saW4ucG9pbnRDb2xvckZ1bmMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBvaW50Q29sb3JGdW5jID0gXywgdmlvbGluKSA6IHBvaW50Q29sb3JGdW5jOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBwb2ludFJhZGl1c1xuICAgKiAoc2VlIHtAbGluayB2aW9saW4jcG9pbnRSYWRpdXN9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBwb2ludFJhZGl1cyA9IDJcbiAgICovXG4gIHZpb2xpbi5wb2ludFJhZGl1cyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocG9pbnRSYWRpdXMgPSBfLCB2aW9saW4pIDogcG9pbnRSYWRpdXM7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgcG9pbnRTdHJva2VXaWR0aFxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jcG9pbnRTdHJva2VXaWR0aH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHBvaW50U3Ryb2tlV2lkdGggPSAyXG4gICAqL1xuICB2aW9saW4ucG9pbnRTdHJva2VXaWR0aCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocG9pbnRTdHJva2VXaWR0aCA9IF8sIHZpb2xpbikgOiBwb2ludFN0cm9rZVdpZHRoOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBiYWNrZ3JvdW5kRmlsbFxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jYmFja2dyb3VuZEZpbGx9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBiYWNrZ3JvdW5kRmlsbCA9ICd0cmFuc3BhcmVudCdcbiAgICovXG4gIHZpb2xpbi5iYWNrZ3JvdW5kRmlsbCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYmFja2dyb3VuZEZpbGwgPSBfLCB2aW9saW4pIDogYmFja2dyb3VuZEZpbGw7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbmFtZXNwYWNlXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNuYW1lc3BhY2V9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBuYW1lc3BhY2UgPSAnZDNzbS12aW9saW4nXG4gICAqL1xuICB2aW9saW4ubmFtZXNwYWNlID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChuYW1lc3BhY2UgPSBfLCB2aW9saW4pIDogbmFtZXNwYWNlOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG9iamVjdENsYXNzXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNvYmplY3RDbGFzc30pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG9iamVjdENsYXNzID0gJ3RpY2stZ3JvdXAnXG4gICAqL1xuICB2aW9saW4ub2JqZWN0Q2xhc3MgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9iamVjdENsYXNzID0gXywgdmlvbGluKSA6IG9iamVjdENsYXNzOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB0cmFuc2l0aW9uRHVyYXRpb25cbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI3RyYW5zaXRpb25EdXJhdGlvbn0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHRyYW5zaXRpb25EdXJhdGlvbiA9IDEwMDBcbiAgICovXG4gIHZpb2xpbi50cmFuc2l0aW9uRHVyYXRpb24gPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRyYW5zaXRpb25EdXJhdGlvbiA9IF8sIHZpb2xpbikgOiB0cmFuc2l0aW9uRHVyYXRpb247IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgZWFzZUZ1bmNcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI2Vhc2VGdW5jfSlcbiAgICogQHBhcmFtIHtkMy5lYXNlfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgZDMuZWFzZX1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBlYXNlRnVuYyA9IGQzLmVhc2VFeHBcbiAgICovXG4gIHZpb2xpbi5lYXNlRnVuYyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZWFzZUZ1bmMgPSBfLCB2aW9saW4pIDogZWFzZUZ1bmM7IH07XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHF1YXJ0aWxlS2V5XG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNxdWFydGlsZUtleX0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHF1YXJ0aWxlS2V5ID0gXCJxdWFydGlsZXNcIlxuICAgKi9cbiAgdmlvbGluLnF1YXJ0aWxlS2V5ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChxdWFydGlsZUtleSA9IF8sIHZpb2xpbikgOiBxdWFydGlsZUtleTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBxdWFydGlsZUtleXNcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI3F1YXJ0aWxlS2V5c30pXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBzdHJpbmdbXX1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBxdWFydGlsZUtleXMgPSBbXCJRMFwiLFwiUTFcIixcIlEyXCIsXCJRM1wiLFwiUTRcIl1cbiAgICovXG4gIHZpb2xpbi5xdWFydGlsZUtleXMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHF1YXJ0aWxlS2V5cyA9IF8sIHZpb2xpbikgOiBxdWFydGlsZUtleXM7IH07XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHZpb2xpbktleXNcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI3Zpb2xpbktleXN9KVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgc3RyaW5nW119XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdmlvbGluS2V5cyA9IHVuZGVmaW5lZFxuICAgKi9cbiAgdmlvbGluLnZpb2xpbktleXMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZpb2xpbktleXMgPSBfLCB2aW9saW4pIDogdmlvbGluS2V5czsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB2aW9saW5WYWx1ZXNcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI3Zpb2xpblZhbHVlc30pXG4gICAqIEBwYXJhbSB7T2JqZWN0W119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBPYmplY3RbXX1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB2aW9saW5WYWx1ZXMgPSB1bmRlZmluZWRcbiAgICovXG4gIHZpb2xpbi52aW9saW5WYWx1ZXMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZpb2xpblZhbHVlcyA9IF8sIHZpb2xpbikgOiB2aW9saW5WYWx1ZXM7IH07XG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBvYmplY3RTaXplXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNvYmplY3RTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgb2JqZWN0U2l6ZSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgdmlvbGluLm9iamVjdFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9iamVjdFNpemUgPSBfLCB2aW9saW4pIDogb2JqZWN0U2l6ZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBzcGFjZXJTaXplXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNzcGFjZXJTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc3BhY2VyU2l6ZSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgdmlvbGluLnNwYWNlclNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNwYWNlclNpemUgPSBfLCB2aW9saW4pIDogc3BhY2VyU2l6ZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB0b29sdGlwXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiN0b29sdGlwfSlcbiAgICogQHBhcmFtIHt0b29sdGlwfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgdG9vbHRpcH1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0b29sdGlwID0gdG9vbHRpcCgpXG4gICAqL1xuICB2aW9saW4udG9vbHRpcCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodG9vbHRpcCA9IF8sIHZpb2xpbikgOiB0b29sdGlwOyB9O1xuICAvLyB2aW9saW4ucG9pbnRzVG9vbHRpcCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocG9pbnRzVG9vbHRpcCA9IF8sIHZpb2xpbikgOiBwb2ludHNUb29sdGlwOyB9O1xuXG4gIGZ1bmN0aW9uIHZpb2xpbiAoKSB7XG4gICAgLy8gZm9yIGNvbnZlbmllbmNlIGluIGhhbmRsaW5nIG9yaWVudGF0aW9uIHNwZWNpZmljIHZhbHVlc1xuICAgIHZhciBob3Jpem9udGFsUSA9IChvcmllbnQgPT0gJ2hvcml6b250YWwnKSA/IHRydWUgOiBmYWxzZVxuICAgIHZhciB2ZXJ0aWNhbFEgPSAhaG9yaXpvbnRhbFFcblxuICAgIC8vIGJhY2tncm91bmQgY2xpcGluZyByZWN0YW5nbGVcbiAgICB2YXIgYmdjcFJlY3QgPSB7eDowLCB5OjAsIHdpZHRoOiBzcGFjZVgsIGhlaWdodDpzcGFjZVl9XG4gICAgdmFyIGNvbnRhaW5lciA9IHNldHVwQ29udGFpbmVyKCBzZWxlY3Rpb24sIG5hbWVzcGFjZSwgYmdjcFJlY3QsIGJhY2tncm91bmRGaWxsICk7XG5cbiAgICAvLyBpZiBncm91cGluZyBpcyB1bmRlZmluZWQgc29ydCB2aW9saW5LZXlzIGJ5IHNvcnRpbmdGdW5jdGlvblxuICAgIHZhciBvcmRlcmVkID0gKGdyb3VwaW5nID09IHVuZGVmaW5lZCkgPyBkMy5rZXlzKGRhdGEpLnNvcnQoc29ydGluZ0Z1bmN0aW9uKSA6IGdyb3VwaW5nXG5cbiAgICAvLyBjb25zb2xlLmxvZyhvcmRlcmVkKVxuXG4gICAgdmlvbGluS2V5cyA9IGZsYXR0ZW4ob3JkZXJlZClcblxuICAgIHZhciBjYWxjVmFsdWVzID0gbmVlZGVkVmlvbGluVmFsdWVzKClcbiAgICAuaG9yaXpvbnRhbFEoaG9yaXpvbnRhbFEpXG4gICAgLnF1YXJ0aWxlS2V5cyhxdWFydGlsZUtleXMpXG4gICAgLnZpb2xpblBvaW50c0V4dHJhY3Rvcih2aW9saW5Qb2ludHNFeHRyYWN0b3IpXG4gICAgLnZpb2xpblBvaW50VmFsdWVFeHRyYWN0b3IodmlvbGluUG9pbnRWYWx1ZUV4dHJhY3RvcilcblxuICAgIC8vIGF1Z21lbnQgdmFsdXNcbiAgICB2aW9saW5LZXlzLm1hcChmdW5jdGlvbih2aywgaSl7IGNhbGNWYWx1ZXModmssIGRhdGEpIH0pXG5cbiAgICAvLyB2aW9saW5WYWx1ZXMgPSBleHRyYWN0VmlvbGluVmFsdWVzKHZpb2xpbktleXMsIGRhdGEsIHZhbHVlRXh0cmFjdG9yLCBob3Jpem9udGFsUSwgcXVhcnRpbGVzS2V5LCBxdWFydGlsZUtleXMpXG5cbiAgICB2YXIgbnVtYmVyT2ZPYmplY3RzID0gdmlvbGluS2V5cy5sZW5ndGhcblxuXG4gICAgdmFyIG1pbiA9IFtdLmNvbmNhdCguLi52aW9saW5LZXlzLm1hcChmdW5jdGlvbihrLCBpKXtyZXR1cm4gZGF0YVtrXS5xdWFydGlsZXNbcXVhcnRpbGVLZXlzWzBdXX0pKVxuICAgIHZhciBtYXggPSBbXS5jb25jYXQoLi4udmlvbGluS2V5cy5tYXAoZnVuY3Rpb24oaywgaSl7cmV0dXJuIGRhdGFba10ucXVhcnRpbGVzW3F1YXJ0aWxlS2V5c1txdWFydGlsZUtleXMubGVuZ3RoIC0gMV1dfSkpXG4gICAgdmFyIGV4dGVudCA9IFtNYXRoLm1pbiguLi5taW4pIC0gZG9tYWluUGFkZGluZywgTWF0aC5tYXgoLi4ubWF4KSArIGRvbWFpblBhZGRpbmddXG4gICAgLy8gY29uc29sZS5sb2coZXh0ZW50LCB2aW9saW5WYWx1ZXMsIG9yZGVyZWQpXG5cbiAgICAvLyBzZXQgdGhlIHNjYWxlXG4gICAgc2NhbGUuZG9tYWluKGV4dGVudCkucmFuZ2UoaG9yaXpvbnRhbFEgPyBbMCxzcGFjZVldIDogWzAsIHNwYWNlWF0pXG4gICAgdmFyIHNwYWNlID0gaG9yaXpvbnRhbFEgPyBzcGFjZVggOiBzcGFjZVlcbiAgICAvLyBjYWxjdWxhdGUgb2JqZWN0IHNpemVcbiAgICBvYmplY3RTaXplID0gY2FsY3VsYXRlV2lkdGhPZk9iamVjdChzcGFjZSwgbnVtYmVyT2ZPYmplY3RzLCBtaW5PYmplY3RTaXplLCBtYXhPYmplY3RTaXplLCBvYmplY3RTcGFjZXIsIG92ZXJmbG93USlcbiAgICAvLyBjYWxjdWxhdGUgc3BhY2VyIHNpemUgaWYgbmVlZGVkXG4gICAgc3BhY2VyU2l6ZSA9IGNhbGN1bGF0ZVdpZHRoT2ZTcGFjZXIob3JkZXJlZCwgc3BhY2UsIG9iamVjdFNpemUsIG51bWJlck9mT2JqZWN0cywgb2JqZWN0U3BhY2VyLCBvdmVyZmxvd1EpXG4gICAgLy8gbWFrZSB0aGUgbmVzdGVkIGdyb3Vwc1xuICAgIHZhciBzcGFjZXJGdW5jdGlvbiA9IGdyb3VwaW5nU3BhY2VyKClcbiAgICAuaG9yaXpvbnRhbFEoaG9yaXpvbnRhbFEpLnNjYWxlKHNjYWxlKS5tb3ZlYnkoJ2NhdGVnb3J5JykubnVtYmVyT2ZPYmplY3RzKG51bWJlck9mT2JqZWN0cylcbiAgICAub2JqZWN0Q2xhc3Mob2JqZWN0Q2xhc3MpLm9iamVjdFNpemUob2JqZWN0U2l6ZSkuc3BhY2VyU2l6ZShzcGFjZXJTaXplKVxuICAgIC50cmFuc2l0aW9uRHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlRnVuYyhlYXNlRnVuYylcbiAgICAubmFtZXNwYWNlKG5hbWVzcGFjZSlcblxuICAgIC8vIG1vdmUgc3R1ZmZcbiAgICBzcGFjZXJGdW5jdGlvbihjb250YWluZXIsIG9yZGVyZWQsIDApXG4gICAgLy8gY29uc29sZS5sb2codmlvbGluS2V5cywgb3JkZXJlZCwgY29udGFpbmVyLnNlbGVjdEFsbCgnZzpub3QoLnRvLXJlbW92ZSkuJytvYmplY3RDbGFzcykubm9kZXMoKSlcblxuICAgIC8vIGZvciBjb2xvciBmdW5jdGlvblxuICAgIHZhciBwYXJlbnRJbmRleEFycmF5ID0gW11cbiAgICBjb250YWluZXIuc2VsZWN0QWxsKCdnOm5vdCgudG8tcmVtb3ZlKS4nK29iamVjdENsYXNzKVxuICAgIC5lYWNoKGZ1bmN0aW9uKGQsIGkpe2lmIChoYXNRKHZpb2xpbktleXMsIGQpKXsgcGFyZW50SW5kZXhBcnJheS5wdXNoKE51bWJlcihkMy5zZWxlY3QodGhpcykuYXR0cigncGFyZW50LWluZGV4JykpKX19KVxuXG4gICAgLy8gdXBkYXRlIGNvbG9yIGZ1bmN0aW9uXG4gICAgY29sb3JGdW5jdGlvbiA9IGNvbG9yRnVuY3Rpb24uY29sb3JCeSgpID09ICdpbmRleCdcbiAgICA/IGNvbG9yRnVuY3Rpb24uZGF0YUV4dGVudChbMCwgTWF0aC5tYXgoLi4ucGFyZW50SW5kZXhBcnJheSldKVxuICAgIDogY29sb3JGdW5jdGlvbi5kYXRhRXh0ZW50KGV4dGVudClcblxuICAgIC8qIHZpb2xpaW4gc3BlY2lmaWMgbmVlZHMgKi9cblxuXG4gICAgdmFyIGZyZXF1ZW5jeU1heCA9IE1hdGgubWF4KC4uLltdLmNvbmNhdCguLi52aW9saW5LZXlzLm1hcChmdW5jdGlvbihrLCBpKXtyZXR1cm4gZDMubWF4KGRhdGFba10uZnJlcXVlbmNpZXMpfSkpKVxuICAgIHZhciB2U2NhbGUgPSBkMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbMCwgZnJlcXVlbmN5TWF4XSkucmFuZ2UoWzAsIG9iamVjdFNpemUgLyAyXSlcblxuICAgIHZhciBsQXJlYSA9IGQzLmxpbmUoKVxuICAgIC54KGZ1bmN0aW9uKGQsIGkpeyByZXR1cm4gaG9yaXpvbnRhbFEgPyAtdlNjYWxlKGQueCkgOiBzY2FsZShkLngpfSlcbiAgICAueShmdW5jdGlvbihkLCBpKXsgcmV0dXJuIGhvcml6b250YWxRID8gc2NhbGUoZXh0ZW50WzFdKSAtIHNjYWxlKGQueSkgOiAtdlNjYWxlKGQueSl9KVxuICAgIC5jdXJ2ZShkMy5jdXJ2ZUJhc2lzKVxuICAgIHZhciByQXJlYSA9IGQzLmxpbmUoKVxuICAgIC54KGZ1bmN0aW9uKGQsIGkpeyByZXR1cm4gaG9yaXpvbnRhbFEgPyB2U2NhbGUoZC54KSA6IHNjYWxlKGQueCl9KVxuICAgIC55KGZ1bmN0aW9uKGQsIGkpeyByZXR1cm4gaG9yaXpvbnRhbFEgPyBzY2FsZShleHRlbnRbMV0pIC0gc2NhbGUoZC55KSA6IHZTY2FsZShkLnkpfSlcbiAgICAuY3VydmUoZDMuY3VydmVCYXNpcylcblxuXG5cblxuXG5cbiAgICBjb250YWluZXIuc2VsZWN0QWxsKCdnOm5vdCgudG8tcmVtb3ZlKS4nK29iamVjdENsYXNzKS5lYWNoKGZ1bmN0aW9uKGtleSwgaSl7XG4gICAgICB2YXIgdCA9IGQzLnNlbGVjdCh0aGlzKSxcbiAgICAgIGN1cnJlbnREYXRhID0gZGF0YVtrZXldXG4gICAgICAvLyBuZWVkZWQgYmVjYXVzZSBidWcgaW4gc2VsZWN0aW5nIC50by1yZW1vdmVcbiAgICAgIGlmICghaGFzUSh2aW9saW5LZXlzLCBrZXkpKSB7cmV0dXJufVxuICAgICAgdmFyXG4gICAgICBpID0gdC5hdHRyKCdwYXJlbnQtaW5kZXgnKSA9PSB1bmRlZmluZWQgPyBpIDogdC5hdHRyKCdwYXJlbnQtaW5kZXgnKSxcbiAgICAgIGZpbGxDb2xvciA9IGNvbG9yRnVuY3Rpb24oa2V5LCBjdXJyZW50RGF0YSwgaSwgJ2ZpbGwnKSwgLy8gcHJldmVudCBkdXBsaWNhdGUgY29tcHV0YXRpb25cbiAgICAgIHN0cm9rZUNvbG9yID0gY29sb3JGdW5jdGlvbihrZXksIGN1cnJlbnREYXRhLCBpLCAnc3Ryb2tlJyksXG4gICAgICBhcmVhID0gc2FmZVNlbGVjdCh0LCAnZycsICdhcmVhJyksXG4gICAgICBsYSA9IHNhZmVTZWxlY3QoYXJlYSwgJ3BhdGgnLCAnbGVmdCcpLFxuICAgICAgcmEgPSBzYWZlU2VsZWN0KGFyZWEsICdwYXRoJywgJ3JpZ2h0JyksXG4gICAgICBxdWFydHMgPSBzYWZlU2VsZWN0KHQsICdnJywgJ3F1YXJ0cycpLFxuICAgICAgbHEzID0gc2FmZVNlbGVjdChxdWFydHMsICdsaW5lJywgJ3EzJyksXG4gICAgICBscTEgPSBzYWZlU2VsZWN0KHF1YXJ0cywgJ2xpbmUnLCAncTEnKSxcbiAgICAgIHEzID0gY3VycmVudERhdGEucXVhcnRpbGVzW3F1YXJ0aWxlS2V5c1szXV0sXG4gICAgICBxMiA9IGN1cnJlbnREYXRhLnF1YXJ0aWxlc1txdWFydGlsZUtleXNbMl1dLFxuICAgICAgcTEgPSBjdXJyZW50RGF0YS5xdWFydGlsZXNbcXVhcnRpbGVLZXlzWzFdXVxuXG4gICAgICB0LmF0dHIoJ3RyYW5zZm9ybScsIGhvcml6b250YWxRID8gJ3RyYW5zbGF0ZSgnK29iamVjdFNpemUgLyAyKycsMCknIDogJ3RyYW5zbGF0ZSgwLCcrb2JqZWN0U2l6ZSAvIDIrJyknICApXG4gICAgICAvLyBkcmF3IGN1cnZlXG4gICAgICBsYS50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5hdHRyKCdkJywgZnVuY3Rpb24oZGQsIGlpKXsgcmV0dXJuIGxBcmVhKGN1cnJlbnREYXRhLmNvbnRvdXIpfSlcbiAgICAgIC5hdHRyKCdmaWxsJywgZmlsbENvbG9yKVxuICAgICAgLmF0dHIoJ3N0cm9rZScsIHN0cm9rZUNvbG9yKVxuICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIG9iamVjdFN0cm9rZVdpZHRoKVxuXG4gICAgICByYS50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5hdHRyKCdkJywgZnVuY3Rpb24oZGQsIGlpKXsgcmV0dXJuIHJBcmVhKGN1cnJlbnREYXRhLmNvbnRvdXIpfSlcbiAgICAgIC5hdHRyKCdmaWxsJywgZmlsbENvbG9yKVxuICAgICAgLmF0dHIoJ3N0cm9rZScsIHN0cm9rZUNvbG9yKVxuICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIG9iamVjdFN0cm9rZVdpZHRoKVxuXG4gICAgICBhcmVhLm5vZGUoKS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCBmdW5jdGlvbihkZCwgaWkpe1xuICAgICAgICBjb250YWluZXIuc2VsZWN0QWxsKCdnLicrb2JqZWN0Q2xhc3MpLnN0eWxlKCdvcGFjaXR5JywgMC4yKVxuICAgICAgICB0LnN0eWxlKCdvcGFjaXR5JywgMSlcbiAgICAgICAgbGEuYXR0cignc3Ryb2tlLXdpZHRoJyxvYmplY3RTdHJva2VXaWR0aCoyKVxuICAgICAgICByYS5hdHRyKCdzdHJva2Utd2lkdGgnLG9iamVjdFN0cm9rZVdpZHRoKjIpXG4gICAgICB9KVxuICAgICAgYXJlYS5ub2RlKCkuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCBmdW5jdGlvbihkZCwgaWkpe1xuICAgICAgICBjb250YWluZXIuc2VsZWN0QWxsKCdnLicrb2JqZWN0Q2xhc3MpLnN0eWxlKCdvcGFjaXR5JywgMSlcbiAgICAgICAgbGEuYXR0cignc3Ryb2tlLXdpZHRoJyxvYmplY3RTdHJva2VXaWR0aClcbiAgICAgICAgcmEuYXR0cignc3Ryb2tlLXdpZHRoJyxvYmplY3RTdHJva2VXaWR0aClcbiAgICAgIH0pXG5cbiAgICAgIGlmIChwb2ludHNRKSB7XG4gICAgICAgIHZhciBwdHNDb250YWluZXIgPSBzYWZlU2VsZWN0KHQsICdnJywgJ3BvaW50cycpXG4gICAgICAgIHZhciBwdHMgPSBwdHNDb250YWluZXIuc2VsZWN0QWxsKCcucG9pbnQnKS5kYXRhKGN1cnJlbnREYXRhLnBvaW50S2V5cylcbiAgICAgICAgcHRzLm9uKCdtb3VzZW92ZXInLCBudWxsKVxuXG5cbiAgICAgICAgdmFyIHB0c0V4aXQgPSBwdHMuZXhpdCgpLnRyYW5zaXRpb24oKS5lYXNlKGVhc2VGdW5jKS5kdXJhdGlvbih0cmFuc2l0aW9uRHVyYXRpb24pXG4gICAgICAgIC5hdHRyKCdyJywgMClcbiAgICAgICAgLmF0dHIoJ2N5JywgaG9yaXpvbnRhbFEgPyBzY2FsZShleHRlbnRbMV0pIC0gc2NhbGUocTIpIDogdlNjYWxlKDApKVxuICAgICAgICAuYXR0cignY3gnLCBob3Jpem9udGFsUSA/IHZTY2FsZSgwKSA6IHNjYWxlKHEyKSkucmVtb3ZlKClcblxuICAgICAgICB2YXIgcHRzRW50ZXIgPSBwdHMuZW50ZXIoKS5hcHBlbmQoJ2NpcmNsZScpLmF0dHIoJ2NsYXNzJywgJ3BvaW50JykuYXR0cigncicsIDApXG4gICAgICAgIC5hdHRyKCdjeCcsIGhvcml6b250YWxRID8gMCA6IHNjYWxlKHEyKSlcbiAgICAgICAgLmF0dHIoJ2N5JywgaG9yaXpvbnRhbFEgPyBzY2FsZShxMikgOiAwKVxuXG5cblxuICAgICAgICBwdHMgPSBwdHMubWVyZ2UocHRzRW50ZXIpXG5cbiAgICAgICAgVFRpcCgpLnNlbGVjdGlvbihwdHMpXG4gICAgICAgIC5kYXRhKHZpb2xpblBvaW50c0V4dHJhY3RvcihrZXksIGN1cnJlbnREYXRhKSlcbiAgICAgICAgKClcblxuXG5cbiAgICAgICAgcHRzLnRyYW5zaXRpb24oKS5kdXJhdGlvbih0cmFuc2l0aW9uRHVyYXRpb24pLmVhc2UoZWFzZUZ1bmMpLmF0dHIoJ3InLCBwb2ludFJhZGl1cylcbiAgICAgICAgLmF0dHIoJ2N5JywgZnVuY3Rpb24ocG9pbnRLZXksIGlpKXtcbiAgICAgICAgICB2YXIgZGQgPSBjdXJyZW50RGF0YS5wb2ludFZhbHVlc1tpaV1cbiAgICAgICAgICBpZiAoaG9yaXpvbnRhbFEpIHsgcmV0dXJuIHNjYWxlKGV4dGVudFsxXSkgLSBzY2FsZShkZCkgfVxuICAgICAgICAgIHZhciBqID0gd2hpY2hCaW4oY3VycmVudERhdGEuYmlubmVkLCBkZClcbiAgICAgICAgICB2YXIgciA9IE1hdGgucmFuZG9tKClcbiAgICAgICAgICB2YXIgbiA9IHZTY2FsZShyICogY3VycmVudERhdGEuZnJlcXVlbmNpZXNbal0gKiAwLjUpXG4gICAgICAgICAgdmFyIGsgPSBNYXRoLnJhbmRvbSgpID4gMC41ID8gbiA6IC1uXG4gICAgICAgICAgcmV0dXJuIGtcbiAgICAgICAgfSlcbiAgICAgICAgLmF0dHIoJ2N4JywgZnVuY3Rpb24ocG9pbnRLZXksIGlpKXtcbiAgICAgICAgICB2YXIgZGQgPSBjdXJyZW50RGF0YS5wb2ludFZhbHVlc1tpaV1cbiAgICAgICAgICBpZiAoaG9yaXpvbnRhbFEpIHtcbiAgICAgICAgICAgIHZhciBqID0gd2hpY2hCaW4oY3VycmVudERhdGEuYmlubmVkLCBkZClcbiAgICAgICAgICAgIHZhciByID0gTWF0aC5yYW5kb20oKVxuICAgICAgICAgICAgdmFyIG4gPSB2U2NhbGUociAqIGN1cnJlbnREYXRhLmZyZXF1ZW5jaWVzW2pdICogMC41KVxuICAgICAgICAgICAgdmFyIGsgPSBNYXRoLnJhbmRvbSgpID4gMC41ID8gbiA6IC1uXG4gICAgICAgICAgICByZXR1cm4ga1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gc2NhbGUoZGQpXG4gICAgICAgIH0pXG4gICAgICAgIC5hdHRyKCdzdHJva2UnLCBmdW5jdGlvbihkZCwgaWkpIHsgdmFyIGRkID0gY3VycmVudERhdGEucG9pbnRWYWx1ZXNbaWldO3JldHVybiBwb2ludENvbG9yRnVuYyhkZCwgJ3N0cm9rZScsIHN0cm9rZUNvbG9yLCBtaW4sIG1heCkgfSlcbiAgICAgICAgLmF0dHIoJ2ZpbGwnICAsIGZ1bmN0aW9uKGRkLCBpaSkgeyB2YXIgZGQgPSBjdXJyZW50RGF0YS5wb2ludFZhbHVlc1tpaV07cmV0dXJuIHBvaW50Q29sb3JGdW5jKGRkLCAnZmlsbCcgICwgc3Ryb2tlQ29sb3IsIG1pbiwgbWF4KSB9KVxuICAgICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgcG9pbnRTdHJva2VXaWR0aClcblxuICAgICAgICBwdHNDb250YWluZXIuc2VsZWN0QWxsKCdjaXJjbGUucG9pbnQnKS5vbignbW91c2VvdmVyJywgZnVuY3Rpb24oZGQsIGlpKXtcbiAgICAgICAgICBjb250YWluZXIuc2VsZWN0QWxsKCdnLicrb2JqZWN0Q2xhc3MpLnN0eWxlKCdvcGFjaXR5JywgMC4yKVxuICAgICAgICAgIHQuc3R5bGUoJ29wYWNpdHknLCAxKVxuICAgICAgICAgIGxhLmF0dHIoJ3N0cm9rZS13aWR0aCcsb2JqZWN0U3Ryb2tlV2lkdGgqMilcbiAgICAgICAgICByYS5hdHRyKCdzdHJva2Utd2lkdGgnLG9iamVjdFN0cm9rZVdpZHRoKjIpXG5cbiAgICAgICAgICBjb250YWluZXIuc2VsZWN0QWxsKCcucG9pbnQnKS5zdHlsZSgnb3BhY2l0eScsIDAuMilcbiAgICAgICAgICBkMy5zZWxlY3QodGhpcykuc3R5bGUoJ29wYWNpdHknLCAxKS5hdHRyKCdyJywgcG9pbnRSYWRpdXMgKiAyKS5hdHRyKCdzdHJva2Utd2lkdGgnLHBvaW50U3Ryb2tlV2lkdGgqMilcbiAgICAgICAgfSlcbiAgICAgICAgcHRzQ29udGFpbmVyLnNlbGVjdEFsbCgnY2lyY2xlLnBvaW50Jykub24oJ21vdXNlb3V0JywgZnVuY3Rpb24oZGQsIGlpKXtcbiAgICAgICAgICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdTVkdFdmVudHMnKVxuICAgICAgICAgIGUuaW5pdEV2ZW50KCdtb3VzZW91dCcsdHJ1ZSx0cnVlKTtcbiAgICAgICAgICBhcmVhLm5vZGUoKS5kaXNwYXRjaEV2ZW50KGUpXG5cbiAgICAgICAgICBjb250YWluZXIuc2VsZWN0QWxsKCcucG9pbnQnKS5zdHlsZSgnb3BhY2l0eScsIDEpXG4gICAgICAgICAgZDMuc2VsZWN0KHRoaXMpLmF0dHIoJ3N0cm9rZS13aWR0aCcsIHBvaW50U3Ryb2tlV2lkdGgpLmF0dHIoJ3InLCBwb2ludFJhZGl1cylcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjVi5zZWxlY3RBbGwoJy5wb2ludCcpXG4gICAgICAgIC50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlKGVhc2VGdW5jKVxuICAgICAgICAuYXR0cigncicsIDApXG4gICAgICAgIC5hdHRyKCdjeScsIGhvcml6b250YWxRID8gc2NhbGUoZXh0ZW50WzFdKSAtIHNjYWxlKHEyKSA6IHZTY2FsZSgwKSlcbiAgICAgICAgLmF0dHIoJ2N4JywgaG9yaXpvbnRhbFEgPyB2U2NhbGUoMCkgOiBzY2FsZShxMikpXG4gICAgICAgIC5yZW1vdmUoKVxuICAgICAgfVxuXG5cbiAgICB9KVxuXG5cbiAgICAvLyB2YXIgdmFsdWVzID0ge307XG4gICAgLy8gcG9pbnRLZXlFeHRyYWN0b3Ioa2V5LCBjdXJyZW50RGF0YSwgdmlvbGluVmFsdWVzKS5tYXAoZnVuY3Rpb24oaywgaSl7XG4gICAgLy8gICB2YWx1ZXNba10gPSBwb2ludFZhbHVlRXh0cmFjdG9yKGssIGtleSwgY3VycmVudERhdGEsIHZpb2xpblZhbHVlcylcbiAgICAvLyB9KVxuICAgIC8vXG4gICAgLy8gY29uc29sZS50YWJsZSh2YWx1ZXMpXG4gICAgLy9cbiAgICAvLyAuZGF0YShkYXRhKVxuICAgIC8vIC5rZXlzKFsnVmFsdWUnXSlcbiAgICAvLyAudmFsdWVzKFtmdW5jdGlvbihjZCwga2V5KXtyZXR1cm4gY2QgfV0pXG4gICAgLy8gcG9pbnRzVG9vbHRpcCgpXG5cblxuICAgIHRvb2x0aXAuc2VsZWN0aW9uKGNvbnRhaW5lci5zZWxlY3RBbGwoJ2c6bm90KC50by1yZW1vdmUpLicrb2JqZWN0Q2xhc3MgKyAnIC5hcmVhJykpXG4gICAgaWYgKHRvb2x0aXAuZGF0YSgpID09IHVuZGVmaW5lZCkge3Rvb2x0aXAuZGF0YShkYXRhKX1cbiAgICB0b29sdGlwKClcbiAgICB0b29sdGlwLnZhbHVlcyhbXG4gICAgICBmdW5jdGlvbihjdXJyZW50RGF0YSwgdG9vbHRpcEtleSl7IHJldHVybiBjdXJyZW50RGF0YVsncXVhcnRpbGVzJ11bdG9vbHRpcEtleV0gfSxcbiAgICAgIGZ1bmN0aW9uKGN1cnJlbnREYXRhLCB0b29sdGlwS2V5KXsgcmV0dXJuIGN1cnJlbnREYXRhWydxdWFydGlsZXMnXVt0b29sdGlwS2V5XSB9LFxuICAgICAgZnVuY3Rpb24oY3VycmVudERhdGEsIHRvb2x0aXBLZXkpeyByZXR1cm4gY3VycmVudERhdGFbJ3F1YXJ0aWxlcyddW3Rvb2x0aXBLZXldIH0sXG4gICAgICBmdW5jdGlvbihjdXJyZW50RGF0YSwgdG9vbHRpcEtleSl7IHJldHVybiBjdXJyZW50RGF0YVsncXVhcnRpbGVzJ11bdG9vbHRpcEtleV0gfSxcbiAgICAgIGZ1bmN0aW9uKGN1cnJlbnREYXRhLCB0b29sdGlwS2V5KXsgcmV0dXJuIGN1cnJlbnREYXRhWydxdWFydGlsZXMnXVt0b29sdGlwS2V5XSB9XG4gICAgXSlcblxuICB9XG5cbiAgcmV0dXJuIHZpb2xpblxufVxuXG5cblxuXG5mdW5jdGlvbiB2aW9saW5Qb2ludHNFeHRyYWN0b3IodmlvbGluS2V5LCB2aW9saW5EYXRhKSB7IHJldHVybiB2aW9saW5EYXRhLnBvaW50cyB9XG5mdW5jdGlvbiB2aW9saW5Qb2ludFZhbHVlRXh0cmFjdG9yKHZpb2xpblBvaW50S2V5LCB2aW9saW5Qb2ludERhdGEpIHsgcmV0dXJuIHZpb2xpblBvaW50RGF0YVt2aW9saW5Qb2ludEtleV0udmFsdWUgfVxuXG5mdW5jdGlvbiBuZWVkZWRWaW9saW5WYWx1ZXMoKSB7XG4gIHZhclxuICBob3Jpem9udGFsUSA9IHRydWUsXG4gIHF1YXJ0aWxlS2V5cyA9IFsnUTAnLCAnUTEnLCAnUTInLCAnUTMnLCAnUTQnXSxcbiAgdmlvbGluUG9pbnRzRXh0cmFjdG9yLFxuICB2aW9saW5Qb2ludFZhbHVlRXh0cmFjdG9yXG5cbiAgY2FsY3VsYXRlVmlvbGluVmFsdWVzLmhvcml6b250YWxRID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChob3Jpem9udGFsUT1fLCBjYWxjdWxhdGVWaW9saW5WYWx1ZXMpIDogaG9yaXpvbnRhbFEgfVxuICBjYWxjdWxhdGVWaW9saW5WYWx1ZXMucXVhcnRpbGVLZXlzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChxdWFydGlsZUtleXM9XywgY2FsY3VsYXRlVmlvbGluVmFsdWVzKSA6IHF1YXJ0aWxlS2V5cyB9XG4gIGNhbGN1bGF0ZVZpb2xpblZhbHVlcy52aW9saW5Qb2ludHNFeHRyYWN0b3IgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZpb2xpblBvaW50c0V4dHJhY3Rvcj1fLCBjYWxjdWxhdGVWaW9saW5WYWx1ZXMpIDogdmlvbGluUG9pbnRzRXh0cmFjdG9yIH1cbiAgY2FsY3VsYXRlVmlvbGluVmFsdWVzLnZpb2xpblBvaW50VmFsdWVFeHRyYWN0b3IgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZpb2xpblBvaW50VmFsdWVFeHRyYWN0b3I9XywgY2FsY3VsYXRlVmlvbGluVmFsdWVzKSA6IHZpb2xpblBvaW50VmFsdWVFeHRyYWN0b3IgfVxuXG4gIGZ1bmN0aW9uIGNhbGN1bGF0ZVZpb2xpblZhbHVlcyh2aW9saW5LZXksIGRhdGEpIHtcbiAgICAvLyBkYXRhIGZvciB0aGUgY3VycmVudCB2aW9saW5cbiAgICB2YXIgdmlvbGluRGF0YSA9IGRhdGFbdmlvbGluS2V5XTtcbiAgICAvLyB0aGUgb2JqZWN0IG9mIHBvaW50c1xuICAgIHZhciB2aW9saW5Qb2ludHMgPSB2aW9saW5Qb2ludHNFeHRyYWN0b3IodmlvbGluS2V5LCB2aW9saW5EYXRhKTtcbiAgICAvL1xuICAgIHZhciB2aW9saW5Qb2ludHNLZXlzID0gZDMua2V5cyh2aW9saW5Qb2ludHMpO1xuICAgIC8vIHRoZSBudW1lcmljYWwgdmFsdWVzIG9mIHRob3NlIHBvaW50c1xuICAgIHZhciB2aW9saW5Qb2ludHNWYWx1ZXMgPSB2aW9saW5Qb2ludHNLZXlzLm1hcChmdW5jdGlvbihwaywgaSl7cmV0dXJuIHZpb2xpblBvaW50c1twa10udmFsdWV9KVxuXG4gICAgLy8gcXVhcnRpbGVzIG9mIHRob3NlIHBvaW50c1xuICAgIHZhciBwb2ludFF1YXJ0aWxlcyA9IHF1YXJ0aWxlcyh2aW9saW5Qb2ludHNWYWx1ZXMsIHF1YXJ0aWxlS2V5cylcblxuICAgIC8vIGJpbm5lZCBwb2ludHNcbiAgICB2YXIgYmlubmVkID0gZDMuaGlzdG9ncmFtKCkodmlvbGluUG9pbnRzVmFsdWVzKVxuICAgIC8vIGxlbmd0aCBvZiBiaW5zXG4gICAgdmFyIGZyZXF1ZW5jaWVzID0gYmlubmVkLm1hcChiaW49PmJpbi5sZW5ndGgpXG4gICAgLy8gbWluIGFuZCBtYXggY291bnRvdXIgcG9pbnRzIGZvciBuaWNlIGRyYXdpbmdzXG4gICAgdmFyIG1pbkNvbnRvdXJQb2ludCA9IGhvcml6b250YWxRID8ge3g6IDAsIHk6IGQzLm1pbih2aW9saW5Qb2ludHNWYWx1ZXMpfSA6ICB7eDogZDMubWluKHZpb2xpblBvaW50c1ZhbHVlcyksIHk6IDB9XG4gICAgdmFyIG1heENvbnRvdXJQb2ludCA9IGhvcml6b250YWxRID8ge3g6IDAsIHk6IGQzLm1heCh2aW9saW5Qb2ludHNWYWx1ZXMpfSA6ICB7eDogZDMubWF4KHZpb2xpblBvaW50c1ZhbHVlcyksIHk6IDB9XG4gICAgdmFyIHZpb2xpbkNvbnRvdXJQb2ludHMgPSBiaW5uZWQubWFwKGZ1bmN0aW9uKGJpbiwgaSkge1xuICAgICAgICByZXR1cm4gaG9yaXpvbnRhbFFcbiAgICAgICAgPyB7eTogKGJpbi5sZW5ndGgpID8gZDMubWVkaWFuKGJpbik6IGQzLm1lZGlhbihbYmluLngwLCBiaW4ueDFdKSwgeDogZnJlcXVlbmNpZXNbaV19XG4gICAgICAgIDoge3g6IChiaW4ubGVuZ3RoKSA/IGQzLm1lZGlhbihiaW4pOiBkMy5tZWRpYW4oW2Jpbi54MCwgYmluLngxXSksIHk6IGZyZXF1ZW5jaWVzW2ldfVxuICAgICAgfSlcbiAgICAvLyBwb2ludHMgYWxvbmcgd2hpY2ggdG8gZHJhdyB0aGUgdmlvbGluIHNocGVcbiAgICB2aW9saW5Db250b3VyUG9pbnRzID0gW21pbkNvbnRvdXJQb2ludF0uY29uY2F0KHZpb2xpbkNvbnRvdXJQb2ludHMpLmNvbmNhdChbbWF4Q29udG91clBvaW50XSlcblxuICAgIC8vIHNldCBkYXRhXG4gICAgdmlvbGluRGF0YS5iaW5uZWQgPSBiaW5uZWQ7XG4gICAgdmlvbGluRGF0YS5mcmVxdWVuY2llcyA9IGZyZXF1ZW5jaWVzXG4gICAgdmlvbGluRGF0YS5jb250b3VyID0gdmlvbGluQ29udG91clBvaW50c1xuICAgIHZpb2xpbkRhdGEucXVhcnRpbGVzID0gcG9pbnRRdWFydGlsZXNcbiAgICB2aW9saW5EYXRhLnBvaW50S2V5cyA9IHZpb2xpblBvaW50c0tleXNcbiAgICB2aW9saW5EYXRhLnBvaW50VmFsdWVzID0gdmlvbGluUG9pbnRzVmFsdWVzXG4gIH1cblxuICByZXR1cm4gY2FsY3VsYXRlVmlvbGluVmFsdWVzXG59XG4iLCJpbXBvcnQge2h5cGVuYXRlLCBzYWZlU2VsZWN0fSBmcm9tICcuL2hlbHBlcnMnO1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBwb2ludHMgKCBzZWxlY3Rpb24gKSB7XG4gIHZhclxuICAvLyAvKipcbiAgLy8gKiBEYXRhIHRvIHBsb3QuIEFzc3VtZWQgdG8gYmUgYSBvYmplY3QsIHdoZXJlIGVhY2gga2V5IGNvcnJlc3BvbmRzIHRvIGEgdmlvbGluXG4gIC8vICogKHNlZSB7QGxpbmsgYmFyI2RhdGF9KVxuICAvLyAqIEBwYXJhbSB7T2JqZWN0fSBbZGF0YT11bmRlZmluZWRdXG4gIC8vICogQG1lbWJlcm9mIGJhciNcbiAgLy8gKiBAcHJvcGVydHlcbiAgLy8gKi9cbiAgLy8gZGF0YSxcbiAgLy8gLyoqXG4gIC8vICogV2hpY2ggZGlyZWN0aW9uIHRvIHJlbmRlciB0aGUgYmFycyBpblxuICAvLyAqIChzZWUge0BsaW5rIGJhciNvcmllbnR9KVxuICAvLyAqIEBwYXJhbSB7bnVtYmVyfSBbb3JpZW50PSdob3Jpem9udGFsJ11cbiAgLy8gKiBAbWVtYmVyb2YgYmFyI1xuICAvLyAqIEBwcm9wZXJ0eVxuICAvLyAqL1xuICAvLyBvcmllbnQ9J2hvcml6b250YWwnLFxuICAvLyAvKipcbiAgLy8gKiBUaGUgcmFkaXVzIG9mIGEgcG9pbnRcbiAgLy8gKiBAcGFyYW0ge251bWJlcn0gW3BvaW50UmFkaXVzPTNdXG4gIC8vICogQG1lbWJlcm9mIGJhciNcbiAgLy8gKiBAcHJvcGVydHlcbiAgLy8gKi9cbiAgLy8gcmFkaXVzID0gMyxcbiAgLy8gLyoqXG4gIC8vICogVGhlIHN0cm9rZSB3aWR0aCBvZiB0aGUgb2ludHNcbiAgLy8gKiBAcGFyYW0ge251bWJlcn0gW3BvaW50U3Ryb2tlV2lkdGg9Ml1cbiAgLy8gKiBAbWVtYmVyb2YgYmFyI1xuICAvLyAqIEBwcm9wZXJ0eVxuICAvLyAqL1xuICAvLyBzdHJva2VXaWR0aCA9IDIsXG4gIC8vIC8qKlxuICAvLyAqIE5hbWVzcGFjZSBmb3IgYWxsIGl0ZW1zIG1hZGUgYnkgdGhpcyBpbnN0YW5jZSBvZiBiYXJcbiAgLy8gKiBAcGFyYW0ge3N0cmluZ30gW25hbWVzcGFjZT1cImQzc20tdmlvbGluXCJdXG4gIC8vICogQG1lbWJlcm9mIGJhciNcbiAgLy8gKiBAcHJvcGVydHlcbiAgLy8gKi9cbiAgLy8gbmFtZXNwYWNlID0gJ2Qzc20tcG9pbnRzJyxcbiAgLy8gLyoqXG4gIC8vICogQ2xhc3MgbmFtZSBmb3IgYmFyIGNvbnRhaW5lciAoPGc+IGVsZW1lbnQpXG4gIC8vICogQHBhcmFtIHtzdHJpbmd9IFtvYmplY3RDbGFzcz1cInZpb2xpblwiXVxuICAvLyAqIEBtZW1iZXJvZiBiYXIjXG4gIC8vICogQHByb3BlcnR5XG4gIC8vICovXG4gIC8vIG9iamVjdENsYXNzID0gJ3BvaW50JyxcbiAgLy8gLyoqXG4gIC8vICogRHVyYXRpb24gb2YgYWxsIHRyYW5zaXRpb25zIG9mIHRoaXMgZWxlbWVudFxuICAvLyAqIEBwYXJhbSB7bnVtYmVyfSBbdHJhbnNpdGlvbkR1cmF0aW9uPTEwMDBdXG4gIC8vICogQG1lbWJlcm9mIGJhciNcbiAgLy8gKiBAcHJvcGVydHlcbiAgLy8gKi9cbiAgLy8gdHJhbnNpdGlvbkR1cmF0aW9uID0gMTAwMCxcbiAgLy8gLyoqXG4gIC8vICogRWFzaW5nIGZ1bmN0aW9uIGZvciB0cmFuc2l0aW9uc1xuICAvLyAqIEBwYXJhbSB7ZDMuZWFzZX0gW2Vhc2VGdW5jPWQzLmVhc2VFeHBdXG4gIC8vICogQG1lbWJlcm9mIGJhciNcbiAgLy8gKiBAcHJvcGVydHlcbiAgLy8gKi9cbiAgLy8gZWFzZUZ1bmMgPSBkMy5lYXNlRXhwLFxuICAvLyAvKipcbiAgLy8gKiBUaGUgb2JqZWN0U2l6ZSAoYWN0dWFsIHdpZHRoKSB1c2VkIGJ5IHRoZSBiYXJzXG4gIC8vICogQHBhcmFtIHtudW1iZXJ9IFtvYmplY3RTaXplPXVuZGVmaW5lZF1cbiAgLy8gKiBAbWVtYmVyb2YgYmFyI1xuICAvLyAqIEBwcm9wZXJ0eVxuICAvLyAqL1xuICAvLyBvYmplY3RTaXplLFxuXG4gIGtleUV4dHJhY3RvciA9IGZ1bmN0aW9uKGQsIGkpIHsgY29uc29sZS5sb2coZCkgfSxcbiAgdmFsdWVFeHRyYWN0b3IgPSBmdW5jdGlvbihkLCBpKSB7IH1cblxuXG4gIGZ1bmN0aW9uIHBvaW50cygpIHtcbiAgICAvLyB2YXIgcHRzQ29udGFpbmVycyA9IHNlbGVjdGlvbi5zZWxlY3RBbGwoJy4nK29iamVjdENsYXNzKVxuICAgIHZhciBwdHNDb250YWluZXJzID0gc2VsZWN0aW9uLnNlbGVjdEFsbCgnLmJvdy13aGlzaycpXG4gICAgY29uc29sZS5sb2cocHRzQ29udGFpbmVycy5ub2RlcygpKVxuXG4gICAgcHRzQ29udGFpbmVycy5lYWNoKGZ1bmN0aW9uKGQsIGkpe1xuICAgICAgdmFyIHQgPSBkMy5zZWxlY3QodGhpcyksXG4gICAgICBwdHNDb250YWluZXIgPSBzYWZlU2VsZWN0KHQsICdnJywgJ3BvaW50cycpLFxuICAgICAgcHRzID0gcHRzQ29udGFpbmVyLnNlbGVjdEFsbCgnLnBvaW50JykuZGF0YSgga2V5RXh0cmFjdG9yKGQpIClcblxuXG4gICAgICB2YXIgcHRzRXhpdCA9IHB0cy5leGl0KClcbiAgICAgIHZhciBwdHNFbnRlciA9IHB0cy5lbnRlcigpLmFwcGVuZCgnY2lyY2xlJykuYXR0cignY2xhc3MnLCAncG9pbnQnKVxuXG4gICAgICBwdHMgPSBwdHMubWVyZ2UocHRzRW50ZXIpXG5cbiAgICB9KVxuICB9XG4gIHJldHVybiBwb2ludHNcbn1cbiIsIi8qKlxuICogSGVscGVycy5cbiAqL1xuXG52YXIgcyA9IDEwMDA7XG52YXIgbSA9IHMgKiA2MDtcbnZhciBoID0gbSAqIDYwO1xudmFyIGQgPSBoICogMjQ7XG52YXIgeSA9IGQgKiAzNjUuMjU7XG5cbi8qKlxuICogUGFyc2Ugb3IgZm9ybWF0IHRoZSBnaXZlbiBgdmFsYC5cbiAqXG4gKiBPcHRpb25zOlxuICpcbiAqICAtIGBsb25nYCB2ZXJib3NlIGZvcm1hdHRpbmcgW2ZhbHNlXVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gdmFsXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhyb3cgYW4gZXJyb3IgaWYgdmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSBudW1iZXJcbiAqIEByZXR1cm4ge1N0cmluZ3xOdW1iZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odmFsLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWw7XG4gIGlmICh0eXBlID09PSAnc3RyaW5nJyAmJiB2YWwubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBwYXJzZSh2YWwpO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInICYmIGlzTmFOKHZhbCkgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMubG9uZyA/IGZtdExvbmcodmFsKSA6IGZtdFNob3J0KHZhbCk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgICd2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIHZhbGlkIG51bWJlci4gdmFsPScgK1xuICAgICAgSlNPTi5zdHJpbmdpZnkodmFsKVxuICApO1xufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gYHN0cmAgYW5kIHJldHVybiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2Uoc3RyKSB7XG4gIHN0ciA9IFN0cmluZyhzdHIpO1xuICBpZiAoc3RyLmxlbmd0aCA+IDEwMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbWF0Y2ggPSAvXigoPzpcXGQrKT9cXC4/XFxkKykgKihtaWxsaXNlY29uZHM/fG1zZWNzP3xtc3xzZWNvbmRzP3xzZWNzP3xzfG1pbnV0ZXM/fG1pbnM/fG18aG91cnM/fGhycz98aHxkYXlzP3xkfHllYXJzP3x5cnM/fHkpPyQvaS5leGVjKFxuICAgIHN0clxuICApO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBuID0gcGFyc2VGbG9hdChtYXRjaFsxXSk7XG4gIHZhciB0eXBlID0gKG1hdGNoWzJdIHx8ICdtcycpLnRvTG93ZXJDYXNlKCk7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3llYXJzJzpcbiAgICBjYXNlICd5ZWFyJzpcbiAgICBjYXNlICd5cnMnOlxuICAgIGNhc2UgJ3lyJzpcbiAgICBjYXNlICd5JzpcbiAgICAgIHJldHVybiBuICogeTtcbiAgICBjYXNlICdkYXlzJzpcbiAgICBjYXNlICdkYXknOlxuICAgIGNhc2UgJ2QnOlxuICAgICAgcmV0dXJuIG4gKiBkO1xuICAgIGNhc2UgJ2hvdXJzJzpcbiAgICBjYXNlICdob3VyJzpcbiAgICBjYXNlICdocnMnOlxuICAgIGNhc2UgJ2hyJzpcbiAgICBjYXNlICdoJzpcbiAgICAgIHJldHVybiBuICogaDtcbiAgICBjYXNlICdtaW51dGVzJzpcbiAgICBjYXNlICdtaW51dGUnOlxuICAgIGNhc2UgJ21pbnMnOlxuICAgIGNhc2UgJ21pbic6XG4gICAgY2FzZSAnbSc6XG4gICAgICByZXR1cm4gbiAqIG07XG4gICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgY2FzZSAnc2Vjb25kJzpcbiAgICBjYXNlICdzZWNzJzpcbiAgICBjYXNlICdzZWMnOlxuICAgIGNhc2UgJ3MnOlxuICAgICAgcmV0dXJuIG4gKiBzO1xuICAgIGNhc2UgJ21pbGxpc2Vjb25kcyc6XG4gICAgY2FzZSAnbWlsbGlzZWNvbmQnOlxuICAgIGNhc2UgJ21zZWNzJzpcbiAgICBjYXNlICdtc2VjJzpcbiAgICBjYXNlICdtcyc6XG4gICAgICByZXR1cm4gbjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFNob3J0IGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdFNob3J0KG1zKSB7XG4gIGlmIChtcyA+PSBkKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBkKSArICdkJztcbiAgfVxuICBpZiAobXMgPj0gaCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gaCkgKyAnaCc7XG4gIH1cbiAgaWYgKG1zID49IG0pIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG0pICsgJ20nO1xuICB9XG4gIGlmIChtcyA+PSBzKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBzKSArICdzJztcbiAgfVxuICByZXR1cm4gbXMgKyAnbXMnO1xufVxuXG4vKipcbiAqIExvbmcgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZm10TG9uZyhtcykge1xuICByZXR1cm4gcGx1cmFsKG1zLCBkLCAnZGF5JykgfHxcbiAgICBwbHVyYWwobXMsIGgsICdob3VyJykgfHxcbiAgICBwbHVyYWwobXMsIG0sICdtaW51dGUnKSB8fFxuICAgIHBsdXJhbChtcywgcywgJ3NlY29uZCcpIHx8XG4gICAgbXMgKyAnIG1zJztcbn1cblxuLyoqXG4gKiBQbHVyYWxpemF0aW9uIGhlbHBlci5cbiAqL1xuXG5mdW5jdGlvbiBwbHVyYWwobXMsIG4sIG5hbWUpIHtcbiAgaWYgKG1zIDwgbikge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAobXMgPCBuICogMS41KSB7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IobXMgLyBuKSArICcgJyArIG5hbWU7XG4gIH1cbiAgcmV0dXJuIE1hdGguY2VpbChtcyAvIG4pICsgJyAnICsgbmFtZSArICdzJztcbn1cbiIsIlxuLyoqXG4gKiBUaGlzIGlzIHRoZSBjb21tb24gbG9naWMgZm9yIGJvdGggdGhlIE5vZGUuanMgYW5kIHdlYiBicm93c2VyXG4gKiBpbXBsZW1lbnRhdGlvbnMgb2YgYGRlYnVnKClgLlxuICpcbiAqIEV4cG9zZSBgZGVidWcoKWAgYXMgdGhlIG1vZHVsZS5cbiAqL1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVEZWJ1Zy5kZWJ1ZyA9IGNyZWF0ZURlYnVnWydkZWZhdWx0J10gPSBjcmVhdGVEZWJ1ZztcbmV4cG9ydHMuY29lcmNlID0gY29lcmNlO1xuZXhwb3J0cy5kaXNhYmxlID0gZGlzYWJsZTtcbmV4cG9ydHMuZW5hYmxlID0gZW5hYmxlO1xuZXhwb3J0cy5lbmFibGVkID0gZW5hYmxlZDtcbmV4cG9ydHMuaHVtYW5pemUgPSByZXF1aXJlKCdtcycpO1xuXG4vKipcbiAqIEFjdGl2ZSBgZGVidWdgIGluc3RhbmNlcy5cbiAqL1xuZXhwb3J0cy5pbnN0YW5jZXMgPSBbXTtcblxuLyoqXG4gKiBUaGUgY3VycmVudGx5IGFjdGl2ZSBkZWJ1ZyBtb2RlIG5hbWVzLCBhbmQgbmFtZXMgdG8gc2tpcC5cbiAqL1xuXG5leHBvcnRzLm5hbWVzID0gW107XG5leHBvcnRzLnNraXBzID0gW107XG5cbi8qKlxuICogTWFwIG9mIHNwZWNpYWwgXCIlblwiIGhhbmRsaW5nIGZ1bmN0aW9ucywgZm9yIHRoZSBkZWJ1ZyBcImZvcm1hdFwiIGFyZ3VtZW50LlxuICpcbiAqIFZhbGlkIGtleSBuYW1lcyBhcmUgYSBzaW5nbGUsIGxvd2VyIG9yIHVwcGVyLWNhc2UgbGV0dGVyLCBpLmUuIFwiblwiIGFuZCBcIk5cIi5cbiAqL1xuXG5leHBvcnRzLmZvcm1hdHRlcnMgPSB7fTtcblxuLyoqXG4gKiBTZWxlY3QgYSBjb2xvci5cbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNlbGVjdENvbG9yKG5hbWVzcGFjZSkge1xuICB2YXIgaGFzaCA9IDAsIGk7XG5cbiAgZm9yIChpIGluIG5hbWVzcGFjZSkge1xuICAgIGhhc2ggID0gKChoYXNoIDw8IDUpIC0gaGFzaCkgKyBuYW1lc3BhY2UuY2hhckNvZGVBdChpKTtcbiAgICBoYXNoIHw9IDA7IC8vIENvbnZlcnQgdG8gMzJiaXQgaW50ZWdlclxuICB9XG5cbiAgcmV0dXJuIGV4cG9ydHMuY29sb3JzW01hdGguYWJzKGhhc2gpICUgZXhwb3J0cy5jb2xvcnMubGVuZ3RoXTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBkZWJ1Z2dlciB3aXRoIHRoZSBnaXZlbiBgbmFtZXNwYWNlYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlRGVidWcobmFtZXNwYWNlKSB7XG5cbiAgdmFyIHByZXZUaW1lO1xuXG4gIGZ1bmN0aW9uIGRlYnVnKCkge1xuICAgIC8vIGRpc2FibGVkP1xuICAgIGlmICghZGVidWcuZW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgdmFyIHNlbGYgPSBkZWJ1ZztcblxuICAgIC8vIHNldCBgZGlmZmAgdGltZXN0YW1wXG4gICAgdmFyIGN1cnIgPSArbmV3IERhdGUoKTtcbiAgICB2YXIgbXMgPSBjdXJyIC0gKHByZXZUaW1lIHx8IGN1cnIpO1xuICAgIHNlbGYuZGlmZiA9IG1zO1xuICAgIHNlbGYucHJldiA9IHByZXZUaW1lO1xuICAgIHNlbGYuY3VyciA9IGN1cnI7XG4gICAgcHJldlRpbWUgPSBjdXJyO1xuXG4gICAgLy8gdHVybiB0aGUgYGFyZ3VtZW50c2AgaW50byBhIHByb3BlciBBcnJheVxuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG5cbiAgICBhcmdzWzBdID0gZXhwb3J0cy5jb2VyY2UoYXJnc1swXSk7XG5cbiAgICBpZiAoJ3N0cmluZycgIT09IHR5cGVvZiBhcmdzWzBdKSB7XG4gICAgICAvLyBhbnl0aGluZyBlbHNlIGxldCdzIGluc3BlY3Qgd2l0aCAlT1xuICAgICAgYXJncy51bnNoaWZ0KCclTycpO1xuICAgIH1cblxuICAgIC8vIGFwcGx5IGFueSBgZm9ybWF0dGVyc2AgdHJhbnNmb3JtYXRpb25zXG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICBhcmdzWzBdID0gYXJnc1swXS5yZXBsYWNlKC8lKFthLXpBLVolXSkvZywgZnVuY3Rpb24obWF0Y2gsIGZvcm1hdCkge1xuICAgICAgLy8gaWYgd2UgZW5jb3VudGVyIGFuIGVzY2FwZWQgJSB0aGVuIGRvbid0IGluY3JlYXNlIHRoZSBhcnJheSBpbmRleFxuICAgICAgaWYgKG1hdGNoID09PSAnJSUnKSByZXR1cm4gbWF0Y2g7XG4gICAgICBpbmRleCsrO1xuICAgICAgdmFyIGZvcm1hdHRlciA9IGV4cG9ydHMuZm9ybWF0dGVyc1tmb3JtYXRdO1xuICAgICAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBmb3JtYXR0ZXIpIHtcbiAgICAgICAgdmFyIHZhbCA9IGFyZ3NbaW5kZXhdO1xuICAgICAgICBtYXRjaCA9IGZvcm1hdHRlci5jYWxsKHNlbGYsIHZhbCk7XG5cbiAgICAgICAgLy8gbm93IHdlIG5lZWQgdG8gcmVtb3ZlIGBhcmdzW2luZGV4XWAgc2luY2UgaXQncyBpbmxpbmVkIGluIHRoZSBgZm9ybWF0YFxuICAgICAgICBhcmdzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIGluZGV4LS07XG4gICAgICB9XG4gICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfSk7XG5cbiAgICAvLyBhcHBseSBlbnYtc3BlY2lmaWMgZm9ybWF0dGluZyAoY29sb3JzLCBldGMuKVxuICAgIGV4cG9ydHMuZm9ybWF0QXJncy5jYWxsKHNlbGYsIGFyZ3MpO1xuXG4gICAgdmFyIGxvZ0ZuID0gZGVidWcubG9nIHx8IGV4cG9ydHMubG9nIHx8IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSk7XG4gICAgbG9nRm4uYXBwbHkoc2VsZiwgYXJncyk7XG4gIH1cblxuICBkZWJ1Zy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG4gIGRlYnVnLmVuYWJsZWQgPSBleHBvcnRzLmVuYWJsZWQobmFtZXNwYWNlKTtcbiAgZGVidWcudXNlQ29sb3JzID0gZXhwb3J0cy51c2VDb2xvcnMoKTtcbiAgZGVidWcuY29sb3IgPSBzZWxlY3RDb2xvcihuYW1lc3BhY2UpO1xuICBkZWJ1Zy5kZXN0cm95ID0gZGVzdHJveTtcblxuICAvLyBlbnYtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gbG9naWMgZm9yIGRlYnVnIGluc3RhbmNlc1xuICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGV4cG9ydHMuaW5pdCkge1xuICAgIGV4cG9ydHMuaW5pdChkZWJ1Zyk7XG4gIH1cblxuICBleHBvcnRzLmluc3RhbmNlcy5wdXNoKGRlYnVnKTtcblxuICByZXR1cm4gZGVidWc7XG59XG5cbmZ1bmN0aW9uIGRlc3Ryb3kgKCkge1xuICB2YXIgaW5kZXggPSBleHBvcnRzLmluc3RhbmNlcy5pbmRleE9mKHRoaXMpO1xuICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgZXhwb3J0cy5pbnN0YW5jZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBFbmFibGVzIGEgZGVidWcgbW9kZSBieSBuYW1lc3BhY2VzLiBUaGlzIGNhbiBpbmNsdWRlIG1vZGVzXG4gKiBzZXBhcmF0ZWQgYnkgYSBjb2xvbiBhbmQgd2lsZGNhcmRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGVuYWJsZShuYW1lc3BhY2VzKSB7XG4gIGV4cG9ydHMuc2F2ZShuYW1lc3BhY2VzKTtcblxuICBleHBvcnRzLm5hbWVzID0gW107XG4gIGV4cG9ydHMuc2tpcHMgPSBbXTtcblxuICB2YXIgaTtcbiAgdmFyIHNwbGl0ID0gKHR5cGVvZiBuYW1lc3BhY2VzID09PSAnc3RyaW5nJyA/IG5hbWVzcGFjZXMgOiAnJykuc3BsaXQoL1tcXHMsXSsvKTtcbiAgdmFyIGxlbiA9IHNwbGl0Lmxlbmd0aDtcblxuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAoIXNwbGl0W2ldKSBjb250aW51ZTsgLy8gaWdub3JlIGVtcHR5IHN0cmluZ3NcbiAgICBuYW1lc3BhY2VzID0gc3BsaXRbaV0ucmVwbGFjZSgvXFwqL2csICcuKj8nKTtcbiAgICBpZiAobmFtZXNwYWNlc1swXSA9PT0gJy0nKSB7XG4gICAgICBleHBvcnRzLnNraXBzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzLnN1YnN0cigxKSArICckJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHBvcnRzLm5hbWVzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzICsgJyQnKSk7XG4gICAgfVxuICB9XG5cbiAgZm9yIChpID0gMDsgaSA8IGV4cG9ydHMuaW5zdGFuY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGluc3RhbmNlID0gZXhwb3J0cy5pbnN0YW5jZXNbaV07XG4gICAgaW5zdGFuY2UuZW5hYmxlZCA9IGV4cG9ydHMuZW5hYmxlZChpbnN0YW5jZS5uYW1lc3BhY2UpO1xuICB9XG59XG5cbi8qKlxuICogRGlzYWJsZSBkZWJ1ZyBvdXRwdXQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBkaXNhYmxlKCkge1xuICBleHBvcnRzLmVuYWJsZSgnJyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBtb2RlIG5hbWUgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBlbmFibGVkKG5hbWUpIHtcbiAgaWYgKG5hbWVbbmFtZS5sZW5ndGggLSAxXSA9PT0gJyonKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdmFyIGksIGxlbjtcbiAgZm9yIChpID0gMCwgbGVuID0gZXhwb3J0cy5za2lwcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGlmIChleHBvcnRzLnNraXBzW2ldLnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgZm9yIChpID0gMCwgbGVuID0gZXhwb3J0cy5uYW1lcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGlmIChleHBvcnRzLm5hbWVzW2ldLnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ29lcmNlIGB2YWxgLlxuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IHZhbFxuICogQHJldHVybiB7TWl4ZWR9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjb2VyY2UodmFsKSB7XG4gIGlmICh2YWwgaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIHZhbC5zdGFjayB8fCB2YWwubWVzc2FnZTtcbiAgcmV0dXJuIHZhbDtcbn1cbiIsIi8qKlxuICogVGhpcyBpcyB0aGUgd2ViIGJyb3dzZXIgaW1wbGVtZW50YXRpb24gb2YgYGRlYnVnKClgLlxuICpcbiAqIEV4cG9zZSBgZGVidWcoKWAgYXMgdGhlIG1vZHVsZS5cbiAqL1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2RlYnVnJyk7XG5leHBvcnRzLmxvZyA9IGxvZztcbmV4cG9ydHMuZm9ybWF0QXJncyA9IGZvcm1hdEFyZ3M7XG5leHBvcnRzLnNhdmUgPSBzYXZlO1xuZXhwb3J0cy5sb2FkID0gbG9hZDtcbmV4cG9ydHMudXNlQ29sb3JzID0gdXNlQ29sb3JzO1xuZXhwb3J0cy5zdG9yYWdlID0gJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGNocm9tZVxuICAgICAgICAgICAgICAgJiYgJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGNocm9tZS5zdG9yYWdlXG4gICAgICAgICAgICAgICAgICA/IGNocm9tZS5zdG9yYWdlLmxvY2FsXG4gICAgICAgICAgICAgICAgICA6IGxvY2Fsc3RvcmFnZSgpO1xuXG4vKipcbiAqIENvbG9ycy5cbiAqL1xuXG5leHBvcnRzLmNvbG9ycyA9IFtcbiAgJyMwMDAwQ0MnLCAnIzAwMDBGRicsICcjMDAzM0NDJywgJyMwMDMzRkYnLCAnIzAwNjZDQycsICcjMDA2NkZGJywgJyMwMDk5Q0MnLFxuICAnIzAwOTlGRicsICcjMDBDQzAwJywgJyMwMENDMzMnLCAnIzAwQ0M2NicsICcjMDBDQzk5JywgJyMwMENDQ0MnLCAnIzAwQ0NGRicsXG4gICcjMzMwMENDJywgJyMzMzAwRkYnLCAnIzMzMzNDQycsICcjMzMzM0ZGJywgJyMzMzY2Q0MnLCAnIzMzNjZGRicsICcjMzM5OUNDJyxcbiAgJyMzMzk5RkYnLCAnIzMzQ0MwMCcsICcjMzNDQzMzJywgJyMzM0NDNjYnLCAnIzMzQ0M5OScsICcjMzNDQ0NDJywgJyMzM0NDRkYnLFxuICAnIzY2MDBDQycsICcjNjYwMEZGJywgJyM2NjMzQ0MnLCAnIzY2MzNGRicsICcjNjZDQzAwJywgJyM2NkNDMzMnLCAnIzk5MDBDQycsXG4gICcjOTkwMEZGJywgJyM5OTMzQ0MnLCAnIzk5MzNGRicsICcjOTlDQzAwJywgJyM5OUNDMzMnLCAnI0NDMDAwMCcsICcjQ0MwMDMzJyxcbiAgJyNDQzAwNjYnLCAnI0NDMDA5OScsICcjQ0MwMENDJywgJyNDQzAwRkYnLCAnI0NDMzMwMCcsICcjQ0MzMzMzJywgJyNDQzMzNjYnLFxuICAnI0NDMzM5OScsICcjQ0MzM0NDJywgJyNDQzMzRkYnLCAnI0NDNjYwMCcsICcjQ0M2NjMzJywgJyNDQzk5MDAnLCAnI0NDOTkzMycsXG4gICcjQ0NDQzAwJywgJyNDQ0NDMzMnLCAnI0ZGMDAwMCcsICcjRkYwMDMzJywgJyNGRjAwNjYnLCAnI0ZGMDA5OScsICcjRkYwMENDJyxcbiAgJyNGRjAwRkYnLCAnI0ZGMzMwMCcsICcjRkYzMzMzJywgJyNGRjMzNjYnLCAnI0ZGMzM5OScsICcjRkYzM0NDJywgJyNGRjMzRkYnLFxuICAnI0ZGNjYwMCcsICcjRkY2NjMzJywgJyNGRjk5MDAnLCAnI0ZGOTkzMycsICcjRkZDQzAwJywgJyNGRkNDMzMnXG5dO1xuXG4vKipcbiAqIEN1cnJlbnRseSBvbmx5IFdlYktpdC1iYXNlZCBXZWIgSW5zcGVjdG9ycywgRmlyZWZveCA+PSB2MzEsXG4gKiBhbmQgdGhlIEZpcmVidWcgZXh0ZW5zaW9uIChhbnkgRmlyZWZveCB2ZXJzaW9uKSBhcmUga25vd25cbiAqIHRvIHN1cHBvcnQgXCIlY1wiIENTUyBjdXN0b21pemF0aW9ucy5cbiAqXG4gKiBUT0RPOiBhZGQgYSBgbG9jYWxTdG9yYWdlYCB2YXJpYWJsZSB0byBleHBsaWNpdGx5IGVuYWJsZS9kaXNhYmxlIGNvbG9yc1xuICovXG5cbmZ1bmN0aW9uIHVzZUNvbG9ycygpIHtcbiAgLy8gTkI6IEluIGFuIEVsZWN0cm9uIHByZWxvYWQgc2NyaXB0LCBkb2N1bWVudCB3aWxsIGJlIGRlZmluZWQgYnV0IG5vdCBmdWxseVxuICAvLyBpbml0aWFsaXplZC4gU2luY2Ugd2Uga25vdyB3ZSdyZSBpbiBDaHJvbWUsIHdlJ2xsIGp1c3QgZGV0ZWN0IHRoaXMgY2FzZVxuICAvLyBleHBsaWNpdGx5XG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cucHJvY2VzcyAmJiB3aW5kb3cucHJvY2Vzcy50eXBlID09PSAncmVuZGVyZXInKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBJbnRlcm5ldCBFeHBsb3JlciBhbmQgRWRnZSBkbyBub3Qgc3VwcG9ydCBjb2xvcnMuXG4gIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvKGVkZ2V8dHJpZGVudClcXC8oXFxkKykvKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIGlzIHdlYmtpdD8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTY0NTk2MDYvMzc2NzczXG4gIC8vIGRvY3VtZW50IGlzIHVuZGVmaW5lZCBpbiByZWFjdC1uYXRpdmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC1uYXRpdmUvcHVsbC8xNjMyXG4gIHJldHVybiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5XZWJraXRBcHBlYXJhbmNlKSB8fFxuICAgIC8vIGlzIGZpcmVidWc/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM5ODEyMC8zNzY3NzNcbiAgICAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmNvbnNvbGUgJiYgKHdpbmRvdy5jb25zb2xlLmZpcmVidWcgfHwgKHdpbmRvdy5jb25zb2xlLmV4Y2VwdGlvbiAmJiB3aW5kb3cuY29uc29sZS50YWJsZSkpKSB8fFxuICAgIC8vIGlzIGZpcmVmb3ggPj0gdjMxP1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvVG9vbHMvV2ViX0NvbnNvbGUjU3R5bGluZ19tZXNzYWdlc1xuICAgICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvZmlyZWZveFxcLyhcXGQrKS8pICYmIHBhcnNlSW50KFJlZ0V4cC4kMSwgMTApID49IDMxKSB8fFxuICAgIC8vIGRvdWJsZSBjaGVjayB3ZWJraXQgaW4gdXNlckFnZW50IGp1c3QgaW4gY2FzZSB3ZSBhcmUgaW4gYSB3b3JrZXJcbiAgICAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2FwcGxld2Via2l0XFwvKFxcZCspLykpO1xufVxuXG4vKipcbiAqIE1hcCAlaiB0byBgSlNPTi5zdHJpbmdpZnkoKWAsIHNpbmNlIG5vIFdlYiBJbnNwZWN0b3JzIGRvIHRoYXQgYnkgZGVmYXVsdC5cbiAqL1xuXG5leHBvcnRzLmZvcm1hdHRlcnMuaiA9IGZ1bmN0aW9uKHYpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiAnW1VuZXhwZWN0ZWRKU09OUGFyc2VFcnJvcl06ICcgKyBlcnIubWVzc2FnZTtcbiAgfVxufTtcblxuXG4vKipcbiAqIENvbG9yaXplIGxvZyBhcmd1bWVudHMgaWYgZW5hYmxlZC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGZvcm1hdEFyZ3MoYXJncykge1xuICB2YXIgdXNlQ29sb3JzID0gdGhpcy51c2VDb2xvcnM7XG5cbiAgYXJnc1swXSA9ICh1c2VDb2xvcnMgPyAnJWMnIDogJycpXG4gICAgKyB0aGlzLm5hbWVzcGFjZVxuICAgICsgKHVzZUNvbG9ycyA/ICcgJWMnIDogJyAnKVxuICAgICsgYXJnc1swXVxuICAgICsgKHVzZUNvbG9ycyA/ICclYyAnIDogJyAnKVxuICAgICsgJysnICsgZXhwb3J0cy5odW1hbml6ZSh0aGlzLmRpZmYpO1xuXG4gIGlmICghdXNlQ29sb3JzKSByZXR1cm47XG5cbiAgdmFyIGMgPSAnY29sb3I6ICcgKyB0aGlzLmNvbG9yO1xuICBhcmdzLnNwbGljZSgxLCAwLCBjLCAnY29sb3I6IGluaGVyaXQnKVxuXG4gIC8vIHRoZSBmaW5hbCBcIiVjXCIgaXMgc29tZXdoYXQgdHJpY2t5LCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG90aGVyXG4gIC8vIGFyZ3VtZW50cyBwYXNzZWQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgJWMsIHNvIHdlIG5lZWQgdG9cbiAgLy8gZmlndXJlIG91dCB0aGUgY29ycmVjdCBpbmRleCB0byBpbnNlcnQgdGhlIENTUyBpbnRvXG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBsYXN0QyA9IDA7XG4gIGFyZ3NbMF0ucmVwbGFjZSgvJVthLXpBLVolXS9nLCBmdW5jdGlvbihtYXRjaCkge1xuICAgIGlmICgnJSUnID09PSBtYXRjaCkgcmV0dXJuO1xuICAgIGluZGV4Kys7XG4gICAgaWYgKCclYycgPT09IG1hdGNoKSB7XG4gICAgICAvLyB3ZSBvbmx5IGFyZSBpbnRlcmVzdGVkIGluIHRoZSAqbGFzdCogJWNcbiAgICAgIC8vICh0aGUgdXNlciBtYXkgaGF2ZSBwcm92aWRlZCB0aGVpciBvd24pXG4gICAgICBsYXN0QyA9IGluZGV4O1xuICAgIH1cbiAgfSk7XG5cbiAgYXJncy5zcGxpY2UobGFzdEMsIDAsIGMpO1xufVxuXG4vKipcbiAqIEludm9rZXMgYGNvbnNvbGUubG9nKClgIHdoZW4gYXZhaWxhYmxlLlxuICogTm8tb3Agd2hlbiBgY29uc29sZS5sb2dgIGlzIG5vdCBhIFwiZnVuY3Rpb25cIi5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGxvZygpIHtcbiAgLy8gdGhpcyBoYWNrZXJ5IGlzIHJlcXVpcmVkIGZvciBJRTgvOSwgd2hlcmVcbiAgLy8gdGhlIGBjb25zb2xlLmxvZ2AgZnVuY3Rpb24gZG9lc24ndCBoYXZlICdhcHBseSdcbiAgcmV0dXJuICdvYmplY3QnID09PSB0eXBlb2YgY29uc29sZVxuICAgICYmIGNvbnNvbGUubG9nXG4gICAgJiYgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZS5sb2csIGNvbnNvbGUsIGFyZ3VtZW50cyk7XG59XG5cbi8qKlxuICogU2F2ZSBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNhdmUobmFtZXNwYWNlcykge1xuICB0cnkge1xuICAgIGlmIChudWxsID09IG5hbWVzcGFjZXMpIHtcbiAgICAgIGV4cG9ydHMuc3RvcmFnZS5yZW1vdmVJdGVtKCdkZWJ1ZycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHBvcnRzLnN0b3JhZ2UuZGVidWcgPSBuYW1lc3BhY2VzO1xuICAgIH1cbiAgfSBjYXRjaChlKSB7fVxufVxuXG4vKipcbiAqIExvYWQgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGxvYWQoKSB7XG4gIHZhciByO1xuICB0cnkge1xuICAgIHIgPSBleHBvcnRzLnN0b3JhZ2UuZGVidWc7XG4gIH0gY2F0Y2goZSkge31cblxuICAvLyBJZiBkZWJ1ZyBpc24ndCBzZXQgaW4gTFMsIGFuZCB3ZSdyZSBpbiBFbGVjdHJvbiwgdHJ5IHRvIGxvYWQgJERFQlVHXG4gIGlmICghciAmJiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgJ2VudicgaW4gcHJvY2Vzcykge1xuICAgIHIgPSBwcm9jZXNzLmVudi5ERUJVRztcbiAgfVxuXG4gIHJldHVybiByO1xufVxuXG4vKipcbiAqIEVuYWJsZSBuYW1lc3BhY2VzIGxpc3RlZCBpbiBgbG9jYWxTdG9yYWdlLmRlYnVnYCBpbml0aWFsbHkuXG4gKi9cblxuZXhwb3J0cy5lbmFibGUobG9hZCgpKTtcblxuLyoqXG4gKiBMb2NhbHN0b3JhZ2UgYXR0ZW1wdHMgdG8gcmV0dXJuIHRoZSBsb2NhbHN0b3JhZ2UuXG4gKlxuICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzYWZhcmkgdGhyb3dzXG4gKiB3aGVuIGEgdXNlciBkaXNhYmxlcyBjb29raWVzL2xvY2Fsc3RvcmFnZVxuICogYW5kIHlvdSBhdHRlbXB0IHRvIGFjY2VzcyBpdC5cbiAqXG4gKiBAcmV0dXJuIHtMb2NhbFN0b3JhZ2V9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2NhbHN0b3JhZ2UoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHdpbmRvdy5sb2NhbFN0b3JhZ2U7XG4gIH0gY2F0Y2ggKGUpIHt9XG59XG4iLCIvLyBJbXBvcnQgc3R5bGVzIChhdXRvbWF0aWNhbGx5IGluamVjdCBpbnRvIDxoZWFkPikuXG4vLyBpbXBvcnQgJy4uL3N0eWxlcy9tYWluLmNzcyc7XG5pbXBvcnQge2F4aXN9IGZyb20gJy4vbW9kdWxlcy9heGlzJztcbmltcG9ydCB7YmFyfSBmcm9tICcuL21vZHVsZXMvYmFyJztcbmltcG9ydCB7YnViYmxlSGVhdG1hcH0gZnJvbSAnLi9tb2R1bGVzL2J1YmJsZS1oZWF0bWFwJztcbmltcG9ydCB7Ym94d2hpc2tlcn0gZnJvbSAnLi9tb2R1bGVzL2JveC13aGlza2VyJztcbmltcG9ydCB7Y29sb3JGdW5jdGlvbn0gZnJvbSAnLi9tb2R1bGVzL2NvbG9yLWZ1bmN0aW9uJztcbmltcG9ydCB7ZGF0YXRvZ2dsZX0gZnJvbSAnLi9tb2R1bGVzL2RhdGEtdG9nZ2xlJztcbmltcG9ydCB7Z3JvdXBpbmdTcGFjZXJ9IGZyb20gJy4vbW9kdWxlcy9ncm91cGluZy1zcGFjZXInO1xuaW1wb3J0IHt0b29sdGlwfSBmcm9tICcuL21vZHVsZXMvdG9vbHRpcCc7XG5pbXBvcnQge3NjYXR0ZXJ9IGZyb20gJy4vbW9kdWxlcy9zY2F0dGVyJztcbmltcG9ydCB7cGxvdFpvb219IGZyb20gJy4vbW9kdWxlcy9wbG90LXpvb20nO1xuaW1wb3J0IHt2aW9saW59IGZyb20gJy4vbW9kdWxlcy92aW9saW4nO1xuaW1wb3J0IHtwb2ludHN9IGZyb20gJy4vbW9kdWxlcy9wb2ludHMnO1xuXG5pbXBvcnQge3VuaXF1ZUVsZW1lbnRzLCBnZXRUcmFuc2xhdGlvbiwgbW9kaWZ5SGV4aWRlY2ltYWxDb2xvckx1bWluYW5jZSwgdGlja1JhbmdlLFxucXVhcnRpbGVzLCBleHRyYWN0VmlvbGluVmFsdWVzLCBoeXBlbmF0ZSwgcm91bmQsIGdldENvbnRhaW5pbmdTVkcsXG5pbnRlcnBvbGF0ZUNvbG9ycywgdHJ1bmNhdGVUZXh0LCBzYWZlU2VsZWN0fSBmcm9tICcuL21vZHVsZXMvaGVscGVycyc7XG5cbmltcG9ydCB7XG4gIGFsbCwgdGFsbHksIGhhc1EsIGZpcnN0LCBsYXN0LCB0b3RhbCwgdW5pcXVlLCBnZXQsIGxpc3RPZkxpc3RzUSxcbiAgY3V0LCBncm91cEJ5LCBhcnJheUVxdWFscywgZWxlbWVudHNBdExldmVscywgbnVtYmVyT2ZFbGVtZW50cyxcbiAgZmxhdHRlbiwgd2hpY2hCaW5cbn0gZnJvbSAnLi9tb2R1bGVzL2FycmF5LWZ1bmN0aW9ucyc7XG5cblxuaW1wb3J0IHtcbiAgc2V0dXBTdGFuZGFyZENoYXJ0Q29udGFpbmVycywgbG9nIGFzIG15TG9nLCB3YXJuLCBpbmZvLCBlcnJvcixcbiAgY29uc29sZUdyb3VwLCBjb25zb2xlR3JvdXBFbmRcbn0gZnJvbSAnLi9tb2R1bGVzL3V0aWxzJztcblxuLy8gLyoqIEBtb2R1bGUgZDNzbSAqL1xudmFyIGQzc20gPSB7fTtcbmQzc20uYXhpcyA9IGF4aXM7XG5kM3NtLmJhciA9IGJhcjtcbmQzc20uYnViYmxlSGVhdG1hcCA9IGJ1YmJsZUhlYXRtYXA7XG5kM3NtLmJveHdoaXNrZXIgPSBib3h3aGlza2VyO1xuZDNzbS5jb2xvckZ1bmN0aW9uID0gY29sb3JGdW5jdGlvbjtcbmQzc20uZGF0YXRvZ2dsZSA9IGRhdGF0b2dnbGU7XG5kM3NtLmdyb3VwaW5nU3BhY2VyID0gZ3JvdXBpbmdTcGFjZXI7XG5kM3NtLnRvb2x0aXAgPSB0b29sdGlwO1xuZDNzbS5zY2F0dGVyID0gc2NhdHRlcjtcbmQzc20ucGxvdFpvb20gPSBwbG90Wm9vbTtcbmQzc20udmlvbGluID0gdmlvbGluO1xuZDNzbS5wb2ludHMgPSBwb2ludHM7XG5cbmQzc20udW5pcXVlRWxlbWVudHMgPSB1bmlxdWVFbGVtZW50cztcbmQzc20uZ2V0VHJhbnNsYXRpb24gPSBnZXRUcmFuc2xhdGlvbjtcbmQzc20ubW9kaWZ5SGV4aWRlY2ltYWxDb2xvckx1bWluYW5jZSA9IG1vZGlmeUhleGlkZWNpbWFsQ29sb3JMdW1pbmFuY2U7XG5kM3NtLnRpY2tSYW5nZSA9IHRpY2tSYW5nZTtcbmQzc20ucXVhcnRpbGVzID0gcXVhcnRpbGVzO1xuZDNzbS5leHRyYWN0VmlvbGluVmFsdWVzID0gZXh0cmFjdFZpb2xpblZhbHVlcztcbmQzc20uaHlwZW5hdGUgPSBoeXBlbmF0ZTtcbmQzc20ucm91bmQgPSByb3VuZDtcbmQzc20uZ2V0Q29udGFpbmluZ1NWRyA9IGdldENvbnRhaW5pbmdTVkc7XG5kM3NtLmludGVycG9sYXRlQ29sb3JzID0gaW50ZXJwb2xhdGVDb2xvcnM7XG5kM3NtLnRydW5jYXRlVGV4dCA9IHRydW5jYXRlVGV4dDtcbmQzc20uc2FmZVNlbGVjdCA9IHNhZmVTZWxlY3Q7XG5cbmQzc20ud2hpY2hCaW4gPSB3aGljaEJpbjtcbmQzc20udW5pcXVlID0gdW5pcXVlO1xuXG5kM3NtLnNldHVwU3RhbmRhcmRDaGFydENvbnRhaW5lcnMgPSBzZXR1cFN0YW5kYXJkQ2hhcnRDb250YWluZXJzO1xuZDNzbS5sb2cgPSBteUxvZztcbmQzc20ud2FybiA9IHdhcm47XG5kM3NtLmluZm8gPSBpbmZvO1xuZDNzbS5lcnJvciA9IGVycm9yO1xuZDNzbS5jb25zb2xlR3JvdXAgPSBjb25zb2xlR3JvdXA7XG5kM3NtLmNvbnNvbGVHcm91cEVuZCA9IGNvbnNvbGVHcm91cEVuZDtcblxuZDNzbS5kZWJ1Z1EgPSBmYWxzZVxuXG5cblxuLy8gSW1wb3J0IGEgbG9nZ2VyIGZvciBlYXNpZXIgZGVidWdnaW5nXG5pbXBvcnQgZGVidWcgZnJvbSAnZGVidWcnO1xuY29uc3QgbG9nID0gZGVidWcoJ2FwcDpsb2cnKTtcblxuLy8gVGhlIGxvZ2dlciBzaG91bGQgb25seSBiZSBkaXNhYmxlZCBpZiB3ZSdyZSBub3QgaW4gcHJvZHVjdGlvbi5cbmlmIChFTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAvLyBFbmFibGUgdGhlIGxvZ2dlci5cbiAgZGVidWcuZW5hYmxlKCcqJyk7XG4gIGxvZygnTG9nZ2luZyBpcyBlbmFibGVkIScpO1xuXG4gIC8vIEVuYWJsZSBMaXZlUmVsb2FkXG4gIGRvY3VtZW50LndyaXRlKFxuICAgICc8c2NyaXB0IHNyYz1cImh0dHA6Ly8nXG4gICAgKyAobG9jYXRpb24uaG9zdCB8fCAnbG9jYWxob3N0Jykuc3BsaXQoJzonKVswXVxuICAgICsgJzozNTcyOS9saXZlcmVsb2FkLmpzP3NuaXB2ZXI9MVwiPjwvJ1xuICAgICsgJ3NjcmlwdD4nXG4gICk7XG59IGVsc2Uge1xuICBkZWJ1Zy5kaXNhYmxlKCk7XG59XG5cbndpbmRvdy5kM3NtID0gZDNzbTtcbiJdLCJuYW1lcyI6WyJ1bmlxdWVFbGVtZW50cyIsInZhbHVlIiwiaW5kZXgiLCJzZWxmIiwiaW5kZXhPZiIsImdldFRyYW5zbGF0aW9uIiwidHJhbnNmb3JtIiwiZyIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudE5TIiwidW5kZWZpbmVkIiwic2V0QXR0cmlidXRlTlMiLCJtYXRyaXgiLCJiYXNlVmFsIiwiY29uc29saWRhdGUiLCJlIiwiZiIsIm1vZGlmeUhleGlkZWNpbWFsQ29sb3JMdW1pbmFuY2UiLCJoZXgiLCJsdW0iLCJTdHJpbmciLCJyZXBsYWNlIiwibGVuZ3RoIiwicmdiIiwiYyIsImkiLCJwYXJzZUludCIsInN1YnN0ciIsIk1hdGgiLCJyb3VuZCIsIm1pbiIsIm1heCIsInRvU3RyaW5nIiwicXVhcnRpbGVzIiwiZGF0YSIsInFLZXlzIiwicTIiLCJkMyIsIm1lZGlhbiIsImxvd2VyIiwiZmlsdGVyIiwieCIsInVwcGVyIiwicTEiLCJxMCIsInEzIiwicTQiLCJrMCIsImsxIiwiazIiLCJrMyIsIms0Iiwib2JqIiwiZXh0cmFjdFZpb2xpblZhbHVlcyIsInZpb2xpbktleXMiLCJ2YWx1ZUV4dHJhY3RvckZ1bmN0aW9uIiwiaG9yaXpvbnRhbFEiLCJxS2V5IiwibWFwIiwiayIsImQiLCJiaW5uZWQiLCJoaXN0b2dyYW0iLCJmcmVxdWVuY2llcyIsIm1pblBvaW50IiwieSIsIm1heFBvaW50IiwicG9pbnRzIiwiYmluIiwieDAiLCJ4MSIsInF1YXJ0cyIsIm8iLCJ2YWx1ZXMiLCJjb25jYXQiLCJoeXBlbmF0ZSIsIkFycmF5IiwicHJvdG90eXBlIiwic2xpY2UiLCJjYWxsIiwiYXJndW1lbnRzIiwiam9pbiIsIm51bWJlciIsInByZWNpc2lvbiIsInNoaWZ0IiwicmV2ZXJzZVNoaWZ0IiwibnVtQXJyYXkiLCJzcGxpdCIsImdldENvbnRhaW5pbmdTVkciLCJlbGVtZW50IiwicGFyZW50IiwicGFyZW50RWxlbWVudCIsInRhZyIsInRhZ05hbWUiLCJ0b0xvd2VyQ2FzZSIsImludGVycG9sYXRlQ29sb3JzIiwiaW50ZXJwb2xhdGVSZ2JCYXNpcyIsInRydW5jYXRlVGV4dCIsInQiLCJ0ZXh0Iiwib3JpZW50IiwidGlja0xlbmd0aCIsInNwYWNlIiwib3ZlcmZsb3dRIiwicmVjdCIsIm5vZGUiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJ3aWR0aCIsImhlaWdodCIsInNhZmVTZWxlY3QiLCJzZWwiLCJjbHMiLCJjbHNTdHIiLCJzU2VsIiwic2VsZWN0IiwiZW1wdHkiLCJhcHBlbmQiLCJjbGFzc2VkIiwiYXR0ciIsInRpY2tSYW5nZSIsIm4iLCJhIiwicyIsInB1c2giLCJoYXNRIiwiYXJyYXkiLCJpdGVtIiwiaW5jbHVkZXMiLCJ0b3RhbCIsInJlZHVjZSIsImIiLCJ1bmlxdWUiLCJmbGF0dGVuIiwiZmxhdCIsImlzQXJyYXkiLCJ3aGljaEJpbiIsImJpbnMiLCJqIiwiY29uc29sZUdyb3VwIiwibmFtZSIsIndpbmRvdyIsImQzc20iLCJkZWJ1Z1EiLCJjb25zb2xlIiwiZ3JvdXAiLCJjb25zb2xlR3JvdXBFbmQiLCJncm91cEVuZCIsImxvZyIsImZ1bmMiLCJtc2ciLCJ0YWJsZSIsIndhcm4iLCJpbmZvIiwiZXJyb3IiLCJzZXR1cFN0YW5kYXJkQ2hhcnRDb250YWluZXJzIiwic2VsZWN0aW9uIiwibmFtZXNwYWNlIiwidyIsImF2YWlsYWJsZVdpZHRoIiwiaW5uZXJXaWR0aCIsImgiLCJhdmFpbGFibGVIZWlnaHQiLCJpbm5lckhlaWdodCIsIm1hcmdpbnMiLCJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiLCJwZXJjZW50YWdlcyIsImF4ZXMiLCJ4QXhpc1BlcmNlbnQiLCJ5QXhpc1BlcmNlbnQiLCJwZXJjZW50T2ZTcGFjZUZvcldpZHRoIiwicGVyY2VudE9mU3BhY2VGb3JIZWlnaHQiLCJzdmdTcGFjZSIsImNoYXJ0U3BhY2UiLCJheGVzU3BhY2UiLCJkcmF3aW5nU3BhY2UiLCJ5QXhpc1JlY3QiLCJwbG90UmVjdCIsInhBeGlzUmVjdCIsImNvbnRhaW5lciIsInN0eWxlIiwicGxvdCIsInhBeGlzIiwieUF4aXMiLCJzdmciLCJjcFJlY3QiLCJkZWZzIiwiY3AiLCJyYWlzZSIsImJnUmVjdCIsImZpbGwiLCJzZXR1cENvbnRhaW5lciIsImJnIiwib2JqZWN0Q29udGFpbmVyIiwiY2FsY3VsYXRlV2lkdGhPZk9iamVjdCIsImZyZWVTcGFjZSIsIm51bWJlck9mT2JqZWN0cyIsIm1pbk9iamVjdFdpZHRoIiwibWF4T2JqZWN0V2lkdGgiLCJzaXplT2ZTcGFjZXIiLCJudW1iZXJPZlNwYWNlcnMiLCJzcGFjZVRha2VuQnlTcGFjZXJzIiwicmVtYWluaW5nU3BhY2UiLCJvYmplY3RXaWR0aCIsImNhbGN1bGF0ZVdpZHRoT2ZTcGFjZXIiLCJiYXNlU3BhY2VyU2l6ZSIsImxpbWl0ZWROdW1iZXJPZk9iamVjdHMiLCJzcGFjZUxlZnQiLCJzcGFjZXJzQXRFYWNoTGV2ZWwiLCJzcGFjZXJzTmVlZGVkQXRFYWNoTGV2ZWwiLCJ0b3RhbFNwYWNlclBlcmNlbnQiLCJsZXZlbCIsImxldmVsRGF0YSIsIndoaXNrZXJQYXRoIiwiZGlyIiwicGVyIiwiaGgiLCJwIiwid3ciLCJncm91cGluZ1NwYWNlciIsInNjYWxlIiwic2NhbGVMaW5lYXIiLCJtb3ZlYnkiLCJvYmplY3RDbGFzcyIsIm9iamVjdFNpemUiLCJzcGFjZXJTaXplIiwidHJhbnNpdGlvbkR1cmF0aW9uIiwiZWFzZUZ1bmMiLCJlYXNlU2luIiwiZW50ZXJGdW5jdGlvbiIsImN1ciIsImV4aXRGdW5jdGlvbiIsImN1cnJlbnQiLCJjdXJyZW50Tm9kZSIsInRyYW5zaXRpb24iLCJkdXJhdGlvbiIsImVhc2UiLCJyZW1vdmUiLCJyZWN1cnNpdmVseVBvc2l0aW9uIiwiXyIsImN1cnJlbnRTZWxlY3Rpb24iLCJzZWxlY3RBbGwiLCJlbnRlciIsImV4aXQiLCJtZXJnZSIsImVhY2giLCJsZXZlbFNwYWNlciIsIm1vdmUiLCJjdXJyZW50RWxlbWVudCIsInRvUmVtb3ZlIiwic2l6ZSIsImF4aXMiLCJzcGFjZVgiLCJzcGFjZVkiLCJjYXRlZ29yaWNhbFEiLCJndWlkZUxpbmVzUSIsImdyb3VwaW5nIiwiZG9tYWluUGFkZGluZyIsIm9iamVjdFNwYWNlciIsIm1pbk9iamVjdFNpemUiLCJtYXhPYmplY3RTaXplIiwiYmFja2dyb3VuZEZpbGwiLCJ0aWNrTGFiZWxzIiwidGlja1ZhbHVlcyIsIm51bWJlck9mVGlja3MiLCJsaW5lU3Ryb2tlIiwibGluZVN0cm9rZVdpZHRoIiwidGlja1N0cm9rZSIsInRpY2tTdHJva2VXaWR0aCIsInRpY2tMYWJlbEZvbnRTaXplIiwidGlja0xhYmVsTWluRm9udFNpemUiLCJ0aWNrTGFiZWxNYXhGb250U2l6ZSIsInRpY2tMYWJlbFRleHRBbmNob3IiLCJ0aWNrTGFiZWxSb3RhdGlvbiIsInRpY2tMYWJlbEZ1bmMiLCJndWlkZWxpbmVTcGFjZSIsImd1aWRlTGluZVN0cm9rZSIsImd1aWRlTGluZVN0cm9rZVdpZHRoIiwiZWFzZUV4cCIsInJvdW5kVG8iLCJ2ZXJ0aWNhbFEiLCJiZ2NwUmVjdCIsInRpY2tEYXRhIiwiZXh0ZW50IiwiZmxhdFRpY2tEYXRhIiwiZG9tYWluIiwicmFuZ2UiLCJvYmpDbGFzcyIsInNwYWNlckZ1bmN0aW9uIiwidGlja0VudGVyQW5pbWF0aW9uIiwibXQiLCJkYXR1bSIsImRpc3QiLCJ0aWNrRXhpdEFuaW1hdGlvbiIsIm1vdmVYQnkiLCJtb3ZlWUJ5IiwidGlja3MiLCJ0aGF0IiwidGljayIsImxhYmVsIiwiciIsImdsaW5lIiwibGluZSIsImNvbG9yRnVuY3Rpb24iLCJjb2xvcnMiLCJpbnRlcnBvbGF0aW9uIiwiaW50ZXJwb2xhdGVSZ2IiLCJtb2RpZnlPcGFjaXR5Iiwic3Ryb2tlT3BhY2l0eSIsImZpbGxPcGFjaXR5IiwiY29sb3JCeSIsImRhdGFFeHRlbnQiLCJ2YWx1ZUV4dHJhY3RvciIsInYiLCJpbnRlcnBvbGF0ZSIsImhlbHBlclNjYWxlIiwibWF0Y2giLCJrZXkiLCJ0eXBlIiwiaG92ZXJRIiwib3BhYyIsInVwZGF0ZVNjYWxlIiwidG9vbHRpcCIsImtleXMiLCJoZWFkZXIiLCJ0YXJnZXRDbGFzcyIsIm9uIiwibW91c2Vtb3ZlIiwiY3VycmVudERhdGEiLCJtb3VzZSIsImRpdiIsImNhcmRCb2R5IiwiY2FyZFRpdGxlIiwidEJvZHkiLCJ0ciIsInJvd0tleSIsInJvd0luZGV4IiwiYmFyIiwic29ydGluZ0Z1bmN0aW9uIiwia2V5QSIsImtleUIiLCJkZXNjZW5kaW5nIiwiYmFyU3Ryb2tlV2lkdGgiLCJDRiIsImJhcktleXMiLCJiYXJWYWx1ZXMiLCJUVGlwIiwib3JkZXJlZCIsInNvcnQiLCJkZWZhdWx0RXhpdCIsInBhcmVudEluZGV4QXJyYXkiLCJOdW1iZXIiLCJmaWxsQ29sb3IiLCJzdHJva2VDb2xvciIsImJ1YmJsZUhlYXRtYXAiLCJ4S2V5IiwieUtleSIsInJLZXkiLCJ2S2V5IiwieEV4dHJhY3RvciIsInlFeHRyYWN0b3IiLCJyRXh0cmFjdG9yIiwidkV4dHJhY3RvciIsImJ1YmJsZVN0cm9rZVdpZHRoIiwiY2VsbEtleXMiLCJ4VmFsdWVzIiwieVZhbHVlcyIsInJWYWx1ZXMiLCJ2VmFsdWVzIiwieEtleVNvcnRpbmdGdW5jdGlvbiIsInlLZXlTb3J0aW5nRnVuY3Rpb24iLCJyS2V5U29ydGluZ0Z1bmN0aW9uIiwieFNpemUiLCJ4U3BhY2VyU2l6ZSIsInlTaXplIiwieVNwYWNlclNpemUiLCJiaG0iLCJ4RGltIiwieURpbSIsInlTcGFjZXIiLCJ4U3BhY2VyIiwiY2VsbHMiLCJyYWRpdXMiLCJib3h3aGlza2VyIiwicXVhcnRpbGVzS2V5IiwicXVhcnRpbGVzS2V5cyIsIndoaXNrZXJXaWR0aFBlcmNlbnQiLCJib3hTdHJva2VXaWR0aCIsIndoaXNrZXJTdHJva2VXaWR0aCIsImJveEtleXMiLCJib3hWYWx1ZXMiLCJ3aGlzayIsInVXaGlzayIsImxXaGlzayIsInF1YXJ0IiwidVF1YXJ0IiwibFF1YXJ0IiwibVF1YXJ0IiwiZGlmIiwiZGQiLCJpaSIsImRhdGF0b2dnbGUiLCJ1cGRhdGVGdW5jdGlvbiIsImN1cnJlbnRLZXkiLCJ0b2dnbGUiLCJkYXRhb3B0cyIsImRvRW50ZXIiLCJwcm9wZXJ0eSIsInNjYXR0ZXIiLCJzY2FsZVgiLCJkb21haW5QYWRkaW5nWCIsInZhbHVlRXh0cmFjdG9yWCIsInNjYWxlWSIsImRvbWFpblBhZGRpbmdZIiwidmFsdWVFeHRyYWN0b3JZIiwic2NhbGVSIiwiZG9tYWluUGFkZGluZ1IiLCJ2YWx1ZUV4dHJhY3RvclIiLCJtaW5SYWRpdXMiLCJtYXhSYWRpdXMiLCJwb2ludFN0cm9rZVdpZHRoIiwicG9pbnRLZXlzIiwidmFsdWVzWCIsInZhbHVlc1kiLCJ2YWx1ZXNSIiwiZXh0ZW50WCIsImV4dGVudFkiLCJleHRlbnRSIiwicEVudGVyIiwicEV4aXQiLCJhZGRFdmVudExpc3RlbmVyIiwicGxvdFpvb20iLCJjaGFydCIsImV2ZW50VHlwZSIsIndoZWVsU3BlZWQiLCJ4TG9jayIsInlMb2NrIiwiY2hhcnRTZWwiLCJ4QXhpc1NlbCIsInlBeGlzU2VsIiwiem9vbSIsInNldExvY2tzIiwiY2hhcnRPYmpTZWwiLCJjaGFydE9ialRyYW5zIiwiY29zIiwiZ2V0QkJveCIsImV2ZW50IiwiY2hhcnRCb3giLCJ4QXhpc0JveCIsInlBeGlzQm94IiwiY2hhcnRXaWR0aCIsImNoYXJ0SGVpZ2h0IiwieEF4aXNXaWR0aCIsInhBeGlzSGVpZ2h0IiwieUF4aXNXaWR0aCIsInlBeGlzSGVpZ2h0IiwicHJldmVudERlZmF1bHQiLCJkZWx0YVkiLCJzaGlmdFEiLCJzaGlmdEtleSIsImFwcGx5WCIsImFwcGx5WSIsInhBeGlzT2JqU2VsIiwieUF4aXNPYmpTZWwiLCJ4QXhpc09ialRyYW5zIiwieUF4aXNPYmpUcmFucyIsInJlc2V0IiwidmlvbGluIiwicG9pbnRzUSIsIm9iamVjdFN0cm9rZVdpZHRoIiwicG9pbnRDb2xvckZ1bmMiLCJiYXNlIiwibWluTWF4SGV4U2NhbGUiLCJzY2FsZWRDb2xvciIsIm1vZCIsInBvaW50UmFkaXVzIiwicXVhcnRpbGVLZXlzIiwidmlvbGluVmFsdWVzIiwicG9pbnRzVG9vbHRpcCIsInF1YXJ0aWxlS2V5IiwiY2FsY1ZhbHVlcyIsIm5lZWRlZFZpb2xpblZhbHVlcyIsInZpb2xpblBvaW50c0V4dHJhY3RvciIsInZpb2xpblBvaW50VmFsdWVFeHRyYWN0b3IiLCJ2ayIsImZyZXF1ZW5jeU1heCIsInZTY2FsZSIsImxBcmVhIiwiY3VydmUiLCJjdXJ2ZUJhc2lzIiwickFyZWEiLCJhcmVhIiwibGEiLCJyYSIsImxxMyIsImxxMSIsImNvbnRvdXIiLCJwdHNDb250YWluZXIiLCJwdHMiLCJwdHNFeGl0IiwicHRzRW50ZXIiLCJwb2ludEtleSIsInBvaW50VmFsdWVzIiwicmFuZG9tIiwiY3JlYXRlRXZlbnQiLCJpbml0RXZlbnQiLCJkaXNwYXRjaEV2ZW50IiwiY1YiLCJ0b29sdGlwS2V5IiwidmlvbGluS2V5IiwidmlvbGluRGF0YSIsInZpb2xpblBvaW50S2V5IiwidmlvbGluUG9pbnREYXRhIiwiY2FsY3VsYXRlVmlvbGluVmFsdWVzIiwidmlvbGluUG9pbnRzIiwidmlvbGluUG9pbnRzS2V5cyIsInZpb2xpblBvaW50c1ZhbHVlcyIsInBrIiwicG9pbnRRdWFydGlsZXMiLCJtaW5Db250b3VyUG9pbnQiLCJtYXhDb250b3VyUG9pbnQiLCJ2aW9saW5Db250b3VyUG9pbnRzIiwia2V5RXh0cmFjdG9yIiwicHRzQ29udGFpbmVycyIsIm5vZGVzIiwicmVxdWlyZSQkMCIsIm1zIiwibXlMb2ciLCJkZWJ1ZyIsImVuYWJsZSIsIndyaXRlIiwibG9jYXRpb24iLCJob3N0Il0sIm1hcHBpbmdzIjoiOzs7RUFBQTtFQUNBOzs7Ozs7O0VBT0E7Ozs7Ozs7QUFPQSxFQUFPLFNBQVNBLGNBQVQsQ0FBd0JDLEtBQXhCLEVBQStCQyxLQUEvQixFQUFzQ0MsSUFBdEMsRUFBNEM7RUFBRSxTQUFPQSxLQUFLQyxPQUFMLENBQWFILEtBQWIsTUFBd0JDLEtBQS9CO0VBQXVDOztFQUU1Rjs7Ozs7QUFLQSxFQUFPLFNBQVNHLGNBQVQsQ0FBd0JDLFNBQXhCLEVBQW1DO0VBQ3hDO0VBQ0E7RUFDQTtFQUNBLE1BQUlDLElBQUlDLFNBQVNDLGVBQVQsQ0FBeUIsNEJBQXpCLEVBQXVELEdBQXZELENBQVI7RUFDQTtFQUNBSCxjQUFZQSxhQUFhSSxTQUFiLEdBQXlCLGdCQUF6QixHQUE0Q0osU0FBeEQ7RUFDQUMsSUFBRUksY0FBRixDQUFpQixJQUFqQixFQUF1QixXQUF2QixFQUFvQ0wsU0FBcEM7RUFDQTtFQUNBO0VBQ0E7RUFD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 diff --git a/data/d3sm-data.js b/data/d3sm-data.js index 99a26d3..ad1f1c5 100644 --- a/data/d3sm-data.js +++ b/data/d3sm-data.js @@ -1,4 +1,11 @@ d3smDemoData = {}; +function shuffle(a) { + for (let i = a.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [a[i], a[j]] = [a[j], a[i]]; + } + return a; +} d3smDemoData["largestCities"] = { America: { @@ -49,14 +56,6 @@ d3smDemoData["largestCities"] = { } }; -function shuffle(a) { - for (let i = a.length - 1; i > 0; i--) { - const j = Math.floor(Math.random() * (i + 1)); - [a[i], a[j]] = [a[j], a[i]]; - } - return a; -} - d3smDemoData["arbitraryBars"] = { groupings: { Flat: ["a", "b", "c", "d", "e", "f", "g", "h"], @@ -124,6 +123,34 @@ d3smDemoData["arbitraryBars"] = { } }; + + + +var violins = {} +for (var i = 0; i < 15; i++) { + var curData = {}; + var scale = Math.random() * 10 + for (var j = 0; j < 15; j++) { + curData['point-'+j] = {'value': Math.random() * scale, 'name': j} + } + violins['vio-'+(i+1)] = {points: curData, name: 'vio-'+(i+1)} +} +violins['vio-1-point'] = {points:{ 'point': {'value': 5 } }} +violins['vio-divergent-points'] = {points:{ 'point-low': {'value': 0 }, 'point-high': {'value': 20 } }} + + + +var vioGroups = { + flatten: ['vio-1','vio-2','vio-3','vio-4','vio-5','vio-6','vio-7','vio-8','vio-9','vio-10','vio-11','vio-12','vio-13','vio-14','vio-15'], + groups: [['vio-1','vio-2','vio-3'],['vio-4','vio-5','vio-6'],['vio-7','vio-8','vio-9'],['vio-10','vio-11','vio-12'],['vio-13','vio-14','vio-15']], + nestedGroups: [[['vio-1','vio-2','vio-3'],['vio-4','vio-5','vio-6']],[['vio-7','vio-8','vio-9'],['vio-10','vio-11','vio-12']],['vio-13','vio-14','vio-15']], + tryToBreak: ['vio-1-point', 'vio-divergent-points'] +} + +d3smDemoData['violins'] = { groupings: vioGroups, data: violins } + + + d3smDemoData["basicViolins"] = { groupings: { alphabetic: ["a", "b", "c"], diff --git a/data/dataset-data.js b/data/dataset-data.js deleted file mode 100644 index 524a087..0000000 --- a/data/dataset-data.js +++ /dev/null @@ -1 +0,0 @@ -var datasets = {"datasets":{"GSE45983":{"description":"field prepared for future if needed","annotation":{"categories":["cell type","tissue"],"sampleGroups":["oocyte","zygote","spermatozoa"]},"samples":{"GSM1121087":{"gsm_id":"GSM1121087","annotation":{"tissue":"NA","cell_line":"NA","cell_type":"oocyte","disease":"NA","gender":"NA","age":"NA","organism":"mus musculus","sampleGroup":"oocyte","categories":["cell type"],"ageUnit":"NA"},"sRNAs":{},"pathogens":{}},"GSM1121089":{"gsm_id":"GSM1121089","annotation":{"tissue":"NA","cell_line":"NA","cell_type":"zygote","disease":"NA","gender":"NA","age":"15-18","organism":"mus musculus","sampleGroup":"zygote","categories":["cell type"],"ageUnit":"hour"},"sRNAs":{},"pathogens":{}},"GSM1121088":{"gsm_id":"GSM1121088","annotation":{"tissue":"cauda epididymis","cell_line":"NA","cell_type":"sperm","disease":"NA","gender":"NA","age":"NA","organism":"mus musculus","sampleGroup":"spermatozoa","categories":["tissue","cell type"],"ageUnit":"NA"},"sRNAs":{},"pathogens":{}}},"id":"GSE45983"},"GSE74588":{"description":"field prepared for future if needed","annotation":{"categories":["cell line","cell type","disease"],"sampleGroups":["doxorubicin","control"]},"samples":{"GSM1923402":{"gsm_id":"GSM1923402","annotation":{"tissue":"NA","cell_line":"HepG2","cell_type":"epithelial cell","disease":"hepatocellular carcinoma","gender":"NA","age":"NA","organism":"homo sapiens","sampleGroup":"doxorubicin","categories":["disease","cell line","cell type"],"ageUnit":"NA"},"sRNAs":{},"pathogens":{}},"GSM1923403":{"gsm_id":"GSM1923403","annotation":{"tissue":"NA","cell_line":"HepG2","cell_type":"epithelial cell","disease":"hepatocellular carcinoma","gender":"NA","age":"NA","organism":"homo sapiens","sampleGroup":"doxorubicin","categories":["disease","cell line","cell type"],"ageUnit":"NA"},"sRNAs":{},"pathogens":{}},"GSM1923400":{"gsm_id":"GSM1923400","annotation":{"tissue":"NA","cell_line":"HepG2","cell_type":"epithelial cell","disease":"hepatocellular carcinoma","gender":"NA","age":"NA","organism":"homo sapiens","sampleGroup":"control","categories":["disease","cell line","cell type"],"ageUnit":"NA"},"sRNAs":{},"pathogens":{}},"GSM1923401":{"gsm_id":"GSM1923401","annotation":{"tissue":"NA","cell_line":"HepG2","cell_type":"epithelial cell","disease":"hepatocellular carcinoma","gender":"NA","age":"NA","organism":"homo sapiens","sampleGroup":"control","categories":["disease","cell line","cell type"],"ageUnit":"NA"},"sRNAs":{},"pathogens":{}}},"id":"GSE74588"}}} diff --git a/data/test-data.js b/data/test-data.js deleted file mode 100644 index 1f16556..0000000 --- a/data/test-data.js +++ /dev/null @@ -1,135 +0,0 @@ -var numberOfViolins = 3, numberOfPointsInViolin = 150 -var violinData, boxWhiskerData, barData, groupedBarData -violinData = Array.from({length: numberOfViolins}).map(function(e, i) { var scale = Math.random(); scale = 1; return Array.from({length: numberOfPointsInViolin}).map(function(d, i) { return Math.random() / scale }) }) -violinData = violinData.map(function(v, i){return {values: v}}) -boxWhiskerData = [ - {'quartiles': {"0.00": 0, "0.25": 25, "0.50": 50, "0.75": 75, "1.00":100}}, - {'quartiles': {"0.00": 10, "0.25": 20, "0.50": 50, "0.75": 75, "1.00":80}}, - {'quartiles': {"0.00": 5, "0.25": 10, "0.50": 25, "0.75": 35, "1.00":40}}, - {'quartiles': {"0.00": 0, "0.25": 25, "0.50": 50, "0.75": 75, "1.00":100}}, - {'quartiles': {"0.00": 10, "0.25": 20, "0.50": 50, "0.75": 75, "1.00":80}}, - {'quartiles': {"0.00": 5, "0.25": 10, "0.50": 25, "0.75": 35, "1.00":40}}, - {'quartiles': {"0.00": 0, "0.25": 30, "0.50": 35, "0.75": 65, "1.00":80}} -] - - - - - - -boxWhiskerDataNest = [ - [ - {'quartiles': {"0.00": 0, "0.25": 25, "0.50": 50, "0.75": 75, "1.00":100}}, - {'quartiles': {"0.00": 10, "0.25": 20, "0.50": 50, "0.75": 75, "1.00":80}} - ], - [ - {'quartiles': {"0.00": 5, "0.25": 10, "0.50": 25, "0.75": 35, "1.00":40}}, - {'quartiles': {"0.00": 0, "0.25": 25, "0.50": 50, "0.75": 75, "1.00":100}} - ], - [ - {'quartiles': {"0.00": 0, "0.25": 30, "0.50": 35, "0.75": 65, "1.00":80}}, - {'quartiles': {"0.00": 7, "0.25": 10, "0.50": 20, "0.75": 35, "1.00":40}} - ] -] - - -boxWhiskerDataNest1 = [ - [ - {'quartiles': {"0.00": 0, "0.25": 25, "0.50": 50, "0.75": 75, "1.00":200}}, - {'quartiles': {"0.00": 10, "0.25": 20, "0.50": 50, "0.75": 75, "1.00":80}} - ], - [ - {'quartiles': {"0.00": 5, "0.25": 10, "0.50": 25, "0.75": 35, "1.00":40}}, - {'quartiles': {"0.00": 0, "0.25": 25, "0.50": 50, "0.75": 75, "1.00":100}} - ], - [ - {'quartiles': {"0.00": 0, "0.25": 30, "0.50": 35, "0.75": 65, "1.00":80}}, - {'quartiles': {"0.00": 7, "0.25": 10, "0.50": 20, "0.75": 35, "1.00":40}} - ], - [ - {'quartiles': {"0.00": 0, "0.25": 25, "0.50": 50, "0.75": 75, "1.00":100}}, - {'quartiles': {"0.00": 10, "0.25": 20, "0.50": 50, "0.75": 75, "1.00":80}} - ], - [ - {'quartiles': {"0.00": 5, "0.25": 10, "0.50": 25, "0.75": 35, "1.00":40}}, - {'quartiles': {"0.00": 0, "0.25": 25, "0.50": 50, "0.75": 75, "1.00":100}} - ], - [ - {'quartiles': {"0.00": 0, "0.25": 30, "0.50": 35, "0.75": 65, "1.00":80}}, - {'quartiles': {"0.00": 7, "0.25": 10, "0.50": 20, "0.75": 35, "1.00":40}} - ] -] - - -boxWhiskerDataNest2 = [ - [ - {'quartiles': {"0.00": 0, "0.25": 25, "0.50": 50, "0.75": 75, "1.00":100}}, - {'quartiles': {"0.00": 0, "0.25": 25, "0.50": 50, "0.75": 75, "1.00":100}}, - {'quartiles': {"0.00": 5, "0.25": 10, "0.50": 25, "0.75": 35, "1.00":40}}, - [{'quartiles': {"0.00": 10, "0.25": 20, "0.50": 50, "0.75": 75, "1.00":80}}] - ], - [ - {'quartiles': {"0.00": 0, "0.25": 30, "0.50": 35, "0.75": 65, "1.00":80}}, - {'quartiles': {"0.00": 7, "0.25": 10, "0.50": 20, "0.75": 35, "1.00":40}} - ] -] - - - - - - - -barData = [ 1, 2, 3, 4, 5, 4, 3, 2, 1 ] -// groupedBarData = [1,1,1,1,[2,2,2],[[3,3],[[4,4,4]]], 1] -groupedBarData3 = [1,[1,1],[1], 1, [[4]]] -groupedBarData4 = [[2],2,2] - -groupedBarData = [[2,4,8],[[7,0],[4,6]],[[1,3,2]],[2,5]] -groupedBarData2 = [[2,2,2],10,[[2,2,2]],[2]] -groupedBarData = [2,[3,5],[[1,4,3],2]] -groupedBarData2 = [[1,4],[3,2]] - - - - - - - -violinGrouping = [['a', 'b'], ['c']] -// violinGrouping = ['a', 'b', 'c'] - - - -violinData2 = { - a: {values: [1,2,3,4,5,4,3,2,1,20]}, - b: {values: [1,2,3,4,5,4,3,2,1,20]}, - c: {values: [1,2,3,4,5,4,3,2,1,20]} -} - - - - - - - - - -// [ -// [ -// 2, -// 2, -// 2 -// ], -// [ -// [ -// 2, -// 2, -// 2 -// ] -// ], -// [ -// 2 -// ] -// -// ] diff --git a/demos/basic-violins/index.html b/demos/basic-violins/index.html index 8cb9624..cabe6d9 100644 --- a/demos/basic-violins/index.html +++ b/demos/basic-violins/index.html @@ -45,16 +45,18 @@ -
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/bubble-heatmap/index.html b/demos/bubble-heatmap/index.html index 7018201..d1d07bd 100644 --- a/demos/bubble-heatmap/index.html +++ b/demos/bubble-heatmap/index.html @@ -97,7 +97,7 @@ // // // // extract keys and values to safe re-computation - var xk = bhm.xKeys(), yk = bhm.yKeys() + var xk = bhm.xValues(), yk = bhm.yValues() // var pd = [] // vk.map(function(k, i){ pd.push(...d3.values(vv[k].quartiles)) }) // pd = d3sm.unique(pd.sort(function (a, b) {return d3.ascending(a, b)})) diff --git a/demos/index.html b/demos/index.html index d098fea..3abc7b0 100644 --- a/demos/index.html +++ b/demos/index.html @@ -34,6 +34,7 @@
  • Axes
  • Bar chart with complex groupings
  • Basic box-whisker chart
  • +
  • Basic bubble heatmap
  • Basic Violin chart
  • Scatter
  • diff --git a/src/scripts/main.js b/src/scripts/main.js index 107673a..18d3556 100644 --- a/src/scripts/main.js +++ b/src/scripts/main.js @@ -11,6 +11,7 @@ import {tooltip} from './modules/tooltip'; import {scatter} from './modules/scatter'; import {plotZoom} from './modules/plot-zoom'; import {violin} from './modules/violin'; +import {points} from './modules/points'; import {uniqueElements, getTranslation, modifyHexidecimalColorLuminance, tickRange, quartiles, extractViolinValues, hypenate, round, getContainingSVG, @@ -41,6 +42,7 @@ d3sm.tooltip = tooltip; d3sm.scatter = scatter; d3sm.plotZoom = plotZoom; d3sm.violin = violin; +d3sm.points = points; d3sm.uniqueElements = uniqueElements; d3sm.getTranslation = getTranslation; diff --git a/src/scripts/modules/box-whisker.js b/src/scripts/modules/box-whisker.js index 303db90..03a0842 100644 --- a/src/scripts/modules/box-whisker.js +++ b/src/scripts/modules/box-whisker.js @@ -716,7 +716,6 @@ export function boxwhisker( selection ) { tooltip.selection(container.selectAll('g:not(.to-remove).'+objectClass)) .data(data) - tooltip() diff --git a/src/scripts/modules/points.js b/src/scripts/modules/points.js new file mode 100644 index 0000000..5f167d8 --- /dev/null +++ b/src/scripts/modules/points.js @@ -0,0 +1,95 @@ +import {hypenate, safeSelect} from './helpers'; + + +export function points ( selection ) { + var + // /** + // * Data to plot. Assumed to be a object, where each key corresponds to a violin + // * (see {@link bar#data}) + // * @param {Object} [data=undefined] + // * @memberof bar# + // * @property + // */ + // data, + // /** + // * Which direction to render the bars in + // * (see {@link bar#orient}) + // * @param {number} [orient='horizontal'] + // * @memberof bar# + // * @property + // */ + // orient='horizontal', + // /** + // * The radius of a point + // * @param {number} [pointRadius=3] + // * @memberof bar# + // * @property + // */ + // radius = 3, + // /** + // * The stroke width of the oints + // * @param {number} [pointStrokeWidth=2] + // * @memberof bar# + // * @property + // */ + // strokeWidth = 2, + // /** + // * Namespace for all items made by this instance of bar + // * @param {string} [namespace="d3sm-violin"] + // * @memberof bar# + // * @property + // */ + // namespace = 'd3sm-points', + // /** + // * Class name for bar container ( element) + // * @param {string} [objectClass="violin"] + // * @memberof bar# + // * @property + // */ + // objectClass = 'point', + // /** + // * Duration of all transitions of this element + // * @param {number} [transitionDuration=1000] + // * @memberof bar# + // * @property + // */ + // transitionDuration = 1000, + // /** + // * Easing function for transitions + // * @param {d3.ease} [easeFunc=d3.easeExp] + // * @memberof bar# + // * @property + // */ + // easeFunc = d3.easeExp, + // /** + // * The objectSize (actual width) used by the bars + // * @param {number} [objectSize=undefined] + // * @memberof bar# + // * @property + // */ + // objectSize, + + keyExtractor = function(d, i) { console.log(d) }, + valueExtractor = function(d, i) { } + + + function points() { + // var ptsContainers = selection.selectAll('.'+objectClass) + var ptsContainers = selection.selectAll('.bow-whisk') + console.log(ptsContainers.nodes()) + + ptsContainers.each(function(d, i){ + var t = d3.select(this), + ptsContainer = safeSelect(t, 'g', 'points'), + pts = ptsContainer.selectAll('.point').data( keyExtractor(d) ) + + + var ptsExit = pts.exit() + var ptsEnter = pts.enter().append('circle').attr('class', 'point') + + pts = pts.merge(ptsEnter) + + }) + } + return points +} diff --git a/src/scripts/modules/tooltip.js b/src/scripts/modules/tooltip.js index e7d42fc..3202d9f 100644 --- a/src/scripts/modules/tooltip.js +++ b/src/scripts/modules/tooltip.js @@ -22,7 +22,8 @@ export function tooltip( selection ) { values, header, data, - selection + selection, + targetClass /** * Gets / sets the keys to be displayed in the tooltip. @@ -64,11 +65,22 @@ export function tooltip( selection ) { */ tooltip.selection = function(_){return arguments.length ? (selection = _, tooltip) : selection}; + + /** + * Gets / sets the targetClass for the tooltip to be applied on + * @param {string} [_=none] + * @returns {tooltip | string} + * @memberof tooltip + */ + tooltip.targetClass = function(_){return arguments.length ? (targetClass = _, tooltip) : targetClass}; + + /** * Bind, via selection.on(), the mousemove and mouseout events * @returns undefined */ function tooltip( ) { + selection.on('mouseover', mousemove) selection.on('mousemove', mousemove) selection.on('mouseout', function(){ d3.selectAll(".d3sm-tooltip").remove()}) } @@ -95,9 +107,7 @@ export function tooltip( selection ) { .style('background-color', "#212529") .style('color', 'white') - div.style('position') == "relative" - ? div.style('position', 'absolute').style('left', x+15+'px').style('top', y+'px') - : div.transition().duration(200).ease(d3.easeSin).style('left', x+15+'px').style('top', y+'px') + var cardBody = safeSelect(div, 'div', 'card-body') var cardTitle = safeSelect(cardBody, 'h5', 'card-title') @@ -110,26 +120,41 @@ export function tooltip( selection ) { tBody = tBody.selectAll('tr') tBody= tBody.data(keys == undefined ? d3.keys(currentData): keys) + + + tBody.exit().remove() var tr = tBody.enter().append('tr') - tr.append('td').attr('class', function(d, i){return 'tooltip-key'}) - tr.append('td').attr('class', function(d, i, j){return 'tooltip-value'}) - // tBody = tBody.merge(tr) consoleGroup('tooltip-rows') + tr.each(function(d, i) { + + d3.select(this).append('td').attr('class', 'tooltip-key').text(function(d, i){return d}) + d3.select(this).append('td').attr('class', 'tooltip-value') + .text(function(d, i){ + log('tooltip', 'trying to set value', {rowKey: d, rowIndex: i}) + var v = currentData[d]; + if (values != undefined) {v = values[i]; if(typeof v == "function") {v = v(currentData, d)}} + return typeof v == 'number' ? round(v, 5) : v + }) + }) + tBody = tBody.merge(tr) + tBody.selectAll('.tooltip-key').text(function(d, i){return d}) - tBody.selectAll('tr .tooltip-value') - .text(function(d, i){ + tBody.selectAll('.tooltip-value').text(function(d, i){ log('tooltip', 'trying to set value', {rowKey: d, rowIndex: i}) - var v = currentData[d]; - if (values != undefined) {v = values[i]; if(typeof v == "function") {v = v(currentData, d)}} return typeof v == 'number' ? round(v, 5) : v }) + consoleGroupEnd() consoleGroupEnd() + + div.style('position') == "relative" + ? div.style('position', 'absolute').style('left', x+15+'px').style('top', y+'px') + : div.transition().duration(200).ease(d3.easeSin).style('left', x+15+'px').style('top', y+'px') } return tooltip diff --git a/src/scripts/modules/violin.js b/src/scripts/modules/violin.js index 01bf721..c492b08 100644 --- a/src/scripts/modules/violin.js +++ b/src/scripts/modules/violin.js @@ -1,4 +1,4 @@ -import {hypenate, safeSelect, modifyHexidecimalColorLuminance, extractViolinValues} from './helpers'; +import {hypenate, safeSelect, modifyHexidecimalColorLuminance, extractViolinValues, quartiles} from './helpers'; import {setupContainer, calculateWidthOfObject, calculateWidthOfSpacer} from './utils'; import {unique, hasQ, flatten, whichBin} from './array-functions'; import {groupingSpacer} from './grouping-spacer'; @@ -12,6 +12,7 @@ import {tooltip as TTip} from './tooltip'; ** ** ** ** *******************************************************************************/ + /** * Creates a violin * @@ -261,7 +262,10 @@ export function violin( selection ) { * @memberof bar# * @property */ - tooltip = TTip().keys([quartileKeys[4], quartileKeys[3], quartileKeys[2], quartileKeys[1], quartileKeys[0]]) + tooltip = TTip().keys([quartileKeys[4], quartileKeys[3], quartileKeys[2], quartileKeys[1], quartileKeys[0]]), + pointsTooltip = TTip(), + pointKeyExtractor = function(violinKey, violinData, violinValues) {return d3.keys(violinValues[violinKey].values)}, + pointValueExtractor = function(pointKey, violinKey, violinData, violinValues) {return violinValues[violinKey].values[pointKey]} //, // pointsTooltip = TTip() @@ -617,16 +621,27 @@ export function violin( selection ) { // if grouping is undefined sort violinKeys by sortingFunction var ordered = (grouping == undefined) ? d3.keys(data).sort(sortingFunction) : grouping + // console.log(ordered) + violinKeys = flatten(ordered) - violinValues = extractViolinValues(violinKeys, data, valueExtractor, horizontalQ, quartilesKey, quartileKeys) + + var calcValues = neededViolinValues() + .horizontalQ(horizontalQ) + .quartileKeys(quartileKeys) + .violinPointsExtractor(violinPointsExtractor) + .violinPointValueExtractor(violinPointValueExtractor) + + // augment valus + violinKeys.map(function(vk, i){ calcValues(vk, data) }) + + // violinValues = extractViolinValues(violinKeys, data, valueExtractor, horizontalQ, quartilesKey, quartileKeys) var numberOfObjects = violinKeys.length - var min = [].concat(...violinKeys.map(function(k, i){return violinValues[k][quartilesKey][quartileKeys[0]]})) - var max = [].concat(...violinKeys.map(function(k, i){return violinValues[k][quartilesKey][quartileKeys[quartileKeys.length - 1]]})) + var min = [].concat(...violinKeys.map(function(k, i){return data[k].quartiles[quartileKeys[0]]})) + var max = [].concat(...violinKeys.map(function(k, i){return data[k].quartiles[quartileKeys[quartileKeys.length - 1]]})) var extent = [Math.min(...min) - domainPadding, Math.max(...max) + domainPadding] - // console.log(extent, violinValues, ordered) // set the scale @@ -660,7 +675,7 @@ export function violin( selection ) { /* violiin specific needs */ - var frequencyMax = Math.max(...[].concat(...violinKeys.map(function(k, i){return d3.max(violinValues[k].frequencies)}))) + var frequencyMax = Math.max(...[].concat(...violinKeys.map(function(k, i){return d3.max(data[k].frequencies)}))) var vScale = d3.scaleLinear().domain([0, frequencyMax]).range([0, objectSize / 2]) var lArea = d3.line() @@ -673,9 +688,7 @@ export function violin( selection ) { .curve(d3.curveBasis) - tooltip.selection(container.selectAll('g:not(.to-remove).'+objectClass)) - if (tooltip.data() == undefined) {tooltip.data(violinValues)} - tooltip() + @@ -684,47 +697,49 @@ export function violin( selection ) { currentData = data[key] // needed because bug in selecting .to-remove if (!hasQ(violinKeys, key)) {return} - var d = violinValues[key], + var i = t.attr('parent-index') == undefined ? i : t.attr('parent-index'), - fillColor = colorFunction(key, d, i, 'fill'), // prevent duplicate computation - strokeColor = colorFunction(key, d, i, 'stroke'), + fillColor = colorFunction(key, currentData, i, 'fill'), // prevent duplicate computation + strokeColor = colorFunction(key, currentData, i, 'stroke'), area = safeSelect(t, 'g', 'area'), la = safeSelect(area, 'path', 'left'), ra = safeSelect(area, 'path', 'right'), quarts = safeSelect(t, 'g', 'quarts'), lq3 = safeSelect(quarts, 'line', 'q3'), lq1 = safeSelect(quarts, 'line', 'q1'), - q3 = d[quartilesKey][quartileKeys[3]], - q2 = d[quartilesKey][quartileKeys[2]], - q1 = d[quartilesKey][quartileKeys[1]] + q3 = currentData.quartiles[quartileKeys[3]], + q2 = currentData.quartiles[quartileKeys[2]], + q1 = currentData.quartiles[quartileKeys[1]] t.attr('transform', horizontalQ ? 'translate('+objectSize / 2+',0)' : 'translate(0,'+objectSize / 2+')' ) // draw curve - la.transition().duration(transitionDuration).attr('d', function(dd, ii){ return lArea(d.points)}) + la.transition().duration(transitionDuration).attr('d', function(dd, ii){ return lArea(currentData.contour)}) .attr('fill', fillColor) .attr('stroke', strokeColor) .attr('stroke-width', objectStrokeWidth) - ra.transition().duration(transitionDuration).attr('d', function(dd, ii){ return rArea(d.points)}) + ra.transition().duration(transitionDuration).attr('d', function(dd, ii){ return rArea(currentData.contour)}) .attr('fill', fillColor) .attr('stroke', strokeColor) .attr('stroke-width', objectStrokeWidth) - area.on('mouseover', function(dd, ii){ + area.node().addEventListener('mouseover', function(dd, ii){ container.selectAll('g.'+objectClass).style('opacity', 0.2) t.style('opacity', 1) la.attr('stroke-width',objectStrokeWidth*2) ra.attr('stroke-width',objectStrokeWidth*2) }) - area.on('mouseout', function(dd, ii){ + area.node().addEventListener('mouseout', function(dd, ii){ container.selectAll('g.'+objectClass).style('opacity', 1) la.attr('stroke-width',objectStrokeWidth) ra.attr('stroke-width',objectStrokeWidth) }) if (pointsQ) { - var ptsContainer = safeSelect(t, 'g', 'points'), - pts = ptsContainer.selectAll('.point').data(d.values) + var ptsContainer = safeSelect(t, 'g', 'points') + var pts = ptsContainer.selectAll('.point').data(currentData.pointKeys) + pts.on('mouseover', null) + var ptsExit = pts.exit().transition().ease(easeFunc).duration(transitionDuration) .attr('r', 0) @@ -737,34 +752,37 @@ export function violin( selection ) { pts = pts.merge(ptsEnter) + var pTTips = TTip().selection(pts).data(violinPointsExtractor(key, currentData)) + () + + + pts.transition().duration(transitionDuration).ease(easeFunc).attr('r', pointRadius) - .attr('cy', function(dd, ii){ + .attr('cy', function(pointKey, ii){ + var dd = currentData.pointValues[ii] if (horizontalQ) { return scale(extent[1]) - scale(dd) } - var j = whichBin(d.binned, dd) + var j = whichBin(currentData.binned, dd) var r = Math.random() - var n = vScale(r * d.frequencies[j] * 0.5) + var n = vScale(r * currentData.frequencies[j] * 0.5) var k = Math.random() > 0.5 ? n : -n return k }) - .attr('cx', function(dd, ii){ + .attr('cx', function(pointKey, ii){ + var dd = currentData.pointValues[ii] if (horizontalQ) { - var j = whichBin(d.binned, dd) + var j = whichBin(currentData.binned, dd) var r = Math.random() - var n = vScale(r * d.frequencies[j] * 0.5) + var n = vScale(r * currentData.frequencies[j] * 0.5) var k = Math.random() > 0.5 ? n : -n return k } return scale(dd) }) - .attr('stroke', function(dd, ii) { return pointColorFunc(dd, 'stroke', strokeColor, min, max) }) - .attr('fill' , function(dd, ii) { return pointColorFunc(dd, 'fill' , strokeColor, min, max) }) + .attr('stroke', function(dd, ii) { var dd = currentData.pointValues[ii];return pointColorFunc(dd, 'stroke', strokeColor, min, max) }) + .attr('fill' , function(dd, ii) { var dd = currentData.pointValues[ii];return pointColorFunc(dd, 'fill' , strokeColor, min, max) }) .attr('stroke-width', pointStrokeWidth) ptsContainer.selectAll('circle.point').on('mouseover', function(dd, ii){ - // var e = document.createEvent('SVGEvents') - // e.initEvent('mouseover',true,true); - // area.node().dispatchEvent(e) - container.selectAll('g.'+objectClass).style('opacity', 0.2) t.style('opacity', 1) la.attr('stroke-width',objectStrokeWidth*2) @@ -772,9 +790,6 @@ export function violin( selection ) { container.selectAll('.point').style('opacity', 0.2) d3.select(this).style('opacity', 1).attr('r', pointRadius * 2).attr('stroke-width',pointStrokeWidth*2) - // pointsTooltip.data(dd) - // pointsTooltip() - }) ptsContainer.selectAll('circle.point').on('mouseout', function(dd, ii){ var e = document.createEvent('SVGEvents') @@ -782,7 +797,7 @@ export function violin( selection ) { area.node().dispatchEvent(e) container.selectAll('.point').style('opacity', 1) - d3.select(this).attr('stroke-width',pointStrokeWidth).attr('r', pointRadius) + d3.select(this).attr('stroke-width', pointStrokeWidth).attr('r', pointRadius) }) } else { @@ -796,6 +811,24 @@ export function violin( selection ) { }) + + + // var values = {}; + // pointKeyExtractor(key, currentData, violinValues).map(function(k, i){ + // values[k] = pointValueExtractor(k, key, currentData, violinValues) + // }) + // + // console.table(values) + // + // .data(data) + // .keys(['Value']) + // .values([function(cd, key){return cd }]) + // pointsTooltip() + + + tooltip.selection(container.selectAll('g:not(.to-remove).'+objectClass + ' .area')) + if (tooltip.data() == undefined) {tooltip.data(data)} + tooltip() tooltip.values([ function(currentData, tooltipKey){ return currentData['quartiles'][tooltipKey] }, function(currentData, tooltipKey){ return currentData['quartiles'][tooltipKey] }, @@ -808,3 +841,61 @@ export function violin( selection ) { return violin } + + + + +function violinPointsExtractor(violinKey, violinData) { return violinData.points } +function violinPointValueExtractor(violinPointKey, violinPointData) { return violinPointData[violinPointKey].value } + +function neededViolinValues() { + var + horizontalQ = true, + quartileKeys = ['Q0', 'Q1', 'Q2', 'Q3', 'Q4'], + violinPointsExtractor, + violinPointValueExtractor + + calculateViolinValues.horizontalQ = function(_) { return arguments.length ? (horizontalQ=_, calculateViolinValues) : horizontalQ } + calculateViolinValues.quartileKeys = function(_) { return arguments.length ? (quartileKeys=_, calculateViolinValues) : quartileKeys } + calculateViolinValues.violinPointsExtractor = function(_) { return arguments.length ? (violinPointsExtractor=_, calculateViolinValues) : violinPointsExtractor } + calculateViolinValues.violinPointValueExtractor = function(_) { return arguments.length ? (violinPointValueExtractor=_, calculateViolinValues) : violinPointValueExtractor } + + function calculateViolinValues(violinKey, data) { + // data for the current violin + var violinData = data[violinKey]; + // the object of points + var violinPoints = violinPointsExtractor(violinKey, violinData); + // + var violinPointsKeys = d3.keys(violinPoints); + // the numerical values of those points + var violinPointsValues = violinPointsKeys.map(function(pk, i){return violinPoints[pk].value}) + + // quartiles of those points + var pointQuartiles = quartiles(violinPointsValues, quartileKeys) + + // binned points + var binned = d3.histogram()(violinPointsValues) + // length of bins + var frequencies = binned.map(bin=>bin.length) + // min and max countour points for nice drawings + var minContourPoint = horizontalQ ? {x: 0, y: d3.min(violinPointsValues)} : {x: d3.min(violinPointsValues), y: 0} + var maxContourPoint = horizontalQ ? {x: 0, y: d3.max(violinPointsValues)} : {x: d3.max(violinPointsValues), y: 0} + var violinContourPoints = binned.map(function(bin, i) { + return horizontalQ + ? {y: (bin.length) ? d3.median(bin): d3.median([bin.x0, bin.x1]), x: frequencies[i]} + : {x: (bin.length) ? d3.median(bin): d3.median([bin.x0, bin.x1]), y: frequencies[i]} + }) + // points along which to draw the violin shpe + violinContourPoints = [minContourPoint].concat(violinContourPoints).concat([maxContourPoint]) + + // set data + violinData.binned = binned; + violinData.frequencies = frequencies + violinData.contour = violinContourPoints + violinData.quartiles = pointQuartiles + violinData.pointKeys = violinPointsKeys + violinData.pointValues = violinPointsValues + } + + return calculateViolinValues +} -- GitLab From 05af1ffd8a96b6f0b7cf8adb798eb847144f51d2 Mon Sep 17 00:00:00 2001 From: Sumner Date: Wed, 23 May 2018 16:41:08 +0200 Subject: [PATCH 2/3] new violins --- build/js/d3sm.min.js | 294 ++++++++++++++++++++++++---------- build/js/d3sm.min.obf.js | 2 + src/scripts/modules/violin.js | 276 ++++++++++++++++++++++--------- 3 files changed, 414 insertions(+), 158 deletions(-) create mode 100644 build/js/d3sm.min.obf.js diff --git a/build/js/d3sm.min.js b/build/js/d3sm.min.js index eeb4a77..8cfc14e 100644 --- a/build/js/d3sm.min.js +++ b/build/js/d3sm.min.js @@ -5822,47 +5822,47 @@ var /** * Data to plot. Assumed to be a object, where each key corresponds to a violin - * (see {@link bar#data}) + * (see {@link violin#data}) * @param {Object} [data=undefined] - * @memberof bar# + * @memberof violin# * @property */ data, /** * Which direction to render the bars in - * (see {@link bar#orient}) + * (see {@link violin#orient}) * @param {number} [orient='horizontal'] - * @memberof bar# + * @memberof violin# * @property */ orient = 'horizontal', /** - * Amount of horizontal space (in pixels) avaible to render the bar in - * (see {@link bar#spaceX}) + * Amount of horizontal space (in pixels) avaible to render the violin in + * (see {@link violin#spaceX}) * @param {number} [spaceX=undefined] - * @memberof bar# + * @memberof violin# * @property */ spaceX, /** - * Amount of vertical space (in pixels) avaible to render the bar in - * (see {@link bar.spaceY}) + * Amount of vertical space (in pixels) avaible to render the violin in + * (see {@link violin.spaceY}) * @param {number} [spaceY=undefined] - * @memberof bar# + * @memberof violin# * @property */ spaceY, /** - * Whether or not to allow bar to render elements pass the main spatial dimension - * given the orientation (see {@link bar#orient}), where {@link bar#orient}="horizontal" - * the main dimension is {@link bar#spaceX} and where {@link bar#orient}="vertical" - * the main dimension is {@link bar#spaceY} + * Whether or not to allow violin to render elements pass the main spatial dimension + * given the orientation (see {@link violin#orient}), where {@link violin#orient}="horizontal" + * the main dimension is {@link violin#spaceX} and where {@link violin#orient}="vertical" + * the main dimension is {@link violin#spaceY} * @param {boolean} [overflowQ=false] - * @memberof bar# + * @memberof violin# * @property */ overflowQ = true, @@ -5870,7 +5870,7 @@ /** * Whether or not to display points inside the points * @param {boolean} [pointsQ=false] - * @memberof bar# + * @memberof violin# * @property */ pointsQ = true, @@ -5878,15 +5878,15 @@ /** * An array - putatively of other arrays - depicting how bars should be arranged * @param {Array[]} [grouping=undefined] - * @memberof bar# + * @memberof violin# * @property */ grouping, /** - * How to get the value of the bar + * How to get the value of the violin * @param {function} [valueExtractor=function(key, index) { return data[key] }] - * @memberof bar# + * @memberof violin# * @property */ valueExtractor = function valueExtractor(key, index) { @@ -5894,9 +5894,9 @@ }, /** - * How to sort the bars - if {@link bar#grouping} is not provided. + * How to sort the bars - if {@link violin#grouping} is not provided. * @param {function} [sortingFunction=function(keyA, keyB) {return d3.descending(data[keyA], data[keyB])}] - * @memberof bar# + * @memberof violin# * @property */ sortingFunction = function sortingFunction(keyA, keyB) { @@ -5905,28 +5905,28 @@ /** - * The scale for which bar values should be transformed by + * The scale for which violin values should be transformed by * @param {d3.scale} [scale=d3.scaleLinear] - * @memberof bar# + * @memberof violin# * @property */ scale = d3.scaleLinear(), /** - * The padding for the domain of the scale (see {@link bar#scale}) + * The padding for the domain of the scale (see {@link violin#scale}) * @param {number} [domainPadding=0.5] - * @memberof bar# + * @memberof violin# * @property */ domainPadding = 0.5, /** * Default space for the spacer (percentage) of main dimension given the orientation - * (see {@link bar#orient}), where {@link bar#orient}="horizontal" - * the main dimension is {@link bar#spaceX} and where {@link bar#orient}="vertical" - * the main dimension is {@link bar#spaceY} between bars + * (see {@link violin#orient}), where {@link violin#orient}="horizontal" + * the main dimension is {@link violin#spaceX} and where {@link violin#orient}="vertical" + * the main dimension is {@link violin#spaceY} between bars * @param {number} [objectSpacer=0.05] - * @memberof bar# + * @memberof violin# * @property */ objectSpacer = 0.05, @@ -5934,7 +5934,7 @@ /** * The minimum size that an object can be * @param {number} [minObjectSize=50] - * @memberof bar# + * @memberof violin# * @property */ minObjectSize = 50, @@ -5942,7 +5942,7 @@ /** * The maximum size that an object can be * @param {number} [maxObjectSize=100] - * @memberof bar# + * @memberof violin# * @property */ maxObjectSize = 100, @@ -5951,7 +5951,7 @@ /** * The stroke width of the bars * @param {number} [barStrokeWidth=2] - * @memberof bar# + * @memberof violin# * @property */ objectStrokeWidth = 2, @@ -5959,7 +5959,7 @@ /** * Instance of ColorFunction * @param {function} [colorFunction = colorFunction()] - * @memberof bar# + * @memberof violin# * @property */ colorFunction$$1 = colorFunction(), @@ -5967,11 +5967,11 @@ /** * Instance of ColorFunction modified by a scale for the points * @param {function} [pointColorFunc = colorFunction()] - * @memberof bar# + * @memberof violin# * @property */ pointColorFunc = function pointColorFunc(d, type, base, min, max) { - var minMaxHexScale = d3.scaleLinear().domain([max, min]).range([-0.25, 0.25]); + var minMaxHexScale = d3.scaleLinear().domain([min, max]).range([-0.25, 0.05]); var scaledColor = modifyHexidecimalColorLuminance(base.replace('#', ''), minMaxHexScale(d)); var mod = type == "stroke" ? 0 : 0.25; return modifyHexidecimalColorLuminance(scaledColor.replace('#', ''), mod); @@ -5981,7 +5981,7 @@ /** * The radius of a point * @param {number} [pointRadius=3] - * @memberof bar# + * @memberof violin# * @property */ pointRadius = 3, @@ -5989,7 +5989,7 @@ /** * The stroke width of the oints * @param {number} [pointStrokeWidth=2] - * @memberof bar# + * @memberof violin# * @property */ pointStrokeWidth = 2, @@ -5998,23 +5998,23 @@ /** * Color of the background * @param {string} [backgroundFill="transparent"] - * @memberof bar# + * @memberof violin# * @property */ backgroundFill = 'transparent', /** - * Namespace for all items made by this instance of bar + * Namespace for all items made by this instance of violin * @param {string} [namespace="d3sm-violin"] - * @memberof bar# + * @memberof violin# * @property */ namespace = 'd3sm-violin', /** - * Class name for bar container ( element) + * Class name for violin container ( element) * @param {string} [objectClass="violin"] - * @memberof bar# + * @memberof violin# * @property */ objectClass = 'violin', @@ -6022,7 +6022,7 @@ /** * Duration of all transitions of this element * @param {number} [transitionDuration=1000] - * @memberof bar# + * @memberof violin# * @property */ transitionDuration = 1000, @@ -6030,7 +6030,7 @@ /** * Easing function for transitions * @param {d3.ease} [easeFunc=d3.easeExp] - * @memberof bar# + * @memberof violin# * @property */ easeFunc = d3.easeExp, @@ -6039,7 +6039,7 @@ /** * The keys corresponding to each quartile * @param {string[]} [quartileKeys=["Q0", "Q1", "Q2", "Q3", "Q4"]] - * @memberof bar# + * @memberof violin# * @property */ quartileKeys = ["Q0", "Q1", "Q2", "Q3", "Q4"], @@ -6048,7 +6048,7 @@ /** * The keys of the bars * @param {string[]} [violinKeys=undefined] - * @memberof bar# + * @memberof violin# * @property */ violinKeys, @@ -6056,7 +6056,7 @@ /** * The values of the bars * @param {number[]} [violinValues=undefined] - * @memberof bar# + * @memberof violin# * @property */ violinValues, @@ -6064,7 +6064,7 @@ /** * The objectSize (actual width) used by the bars * @param {number} [objectSize=undefined] - * @memberof bar# + * @memberof violin# * @property */ objectSize, @@ -6072,7 +6072,7 @@ /** * The spacerSize (actual width) used by the spacers between the bars * @param {number} [spacerSize=undefined] - * @memberof bar# + * @memberof violin# * @property */ spacerSize, @@ -6081,15 +6081,57 @@ /** * Instance of Tooltip * @param {function} [tooltip=tooltip()] - * @memberof bar# + * @memberof violin# * @property */ tooltip$$1 = tooltip().keys([quartileKeys[4], quartileKeys[3], quartileKeys[2], quartileKeys[1], quartileKeys[0]]), - pointsTooltip = tooltip(); + pointsTooltip = tooltip(), + /** + * Function which given the key of the violin and that key's associated value + * returns the object consiting of the points of the violin + * (see {@link violin#violinPointsExtractor}) + * @param {Object} [violinPointsExtractor=function(violinKey, violinData) { return violinData.points }] + * @memberof violin# + * @property + */ + violinPointsExtractor = function violinPointsExtractor(violinKey, violinData) { + return violinData.points; + }, - //, - // pointsTooltip = TTip() + /** + * Function which given the key of the current point and the object of points for the + * violin, returns the numerical value of the point + * (see {@link violin#violinPointValueExtractor}) + * @param {Object} [violinPointValueExtractor=function(violinPointKey, violinPointData) { return violinPointData[violinPointKey].value }] + * @memberof violin# + * @property + */ + violinPointValueExtractor = function violinPointValueExtractor(violinPointKey, violinPointData) { + return violinPointData[violinPointKey].value; + }; + /** + * Gets or sets the violinPointsExtractor + * @param {function} [_=none] + * @returns {violin | function} + * @memberof violin + * @property + * by default violinPointsExtractor = function(violinKey, violinData) { return violinData.points } + */ + violin.violinPointsExtractor = function (_) { + return arguments.length ? (violinPointsExtractor = _, violin) : violinPointsExtractor; + }; + /** + * Gets or sets the violinPointValueExtractor + * @param {function} [_=none] + * @returns {violin | function} + * @memberof violin + * @property + * by default violinPointsExtractor = function(pointKey, violinKey, violinData, violinValues) {return violinValues[violinKey].values[pointKey]} + */ + violin.violinPointValueExtractor = function (_) { + return arguments.length ? (violinPointValueExtractor = _, violin) : violinPointValueExtractor; + }; /** * Gets or sets the selection in which items are manipulated @@ -6484,6 +6526,7 @@ }; // violin.pointsTooltip = function(_) { return arguments.length ? (pointsTooltip = _, violin) : pointsTooltip; }; + function violin() { var _ref, _ref2, _ref3; @@ -6508,8 +6551,6 @@ calcValues(vk, data); }); - // violinValues = extractViolinValues(violinKeys, data, valueExtractor, horizontalQ, quartilesKey, quartileKeys) - var numberOfObjects = violinKeys.length; var min = (_ref = []).concat.apply(_ref, toConsumableArray(violinKeys.map(function (k, i) { @@ -6618,7 +6659,11 @@ pts = pts.merge(ptsEnter); - tooltip().selection(pts).data(violinPointsExtractor(key, currentData))(); + var pTTips = tooltip().selection(pts).data(violinPointsExtractor(key, currentData)); + pTTips(); + + var pMin = d3.min(currentData.pointValues), + pMax = d3.max(currentData.pointValues); pts.transition().duration(transitionDuration).ease(easeFunc).attr('r', pointRadius).attr('cy', function (pointKey, ii) { var dd = currentData.pointValues[ii]; @@ -6641,9 +6686,9 @@ } return scale(dd); }).attr('stroke', function (dd, ii) { - var dd = currentData.pointValues[ii];return pointColorFunc(dd, 'stroke', strokeColor, min, max); + var dd = currentData.pointValues[ii];return pointColorFunc(dd, 'stroke', strokeColor, pMin, pMax); }).attr('fill', function (dd, ii) { - var dd = currentData.pointValues[ii];return pointColorFunc(dd, 'fill', strokeColor, min, max); + var dd = currentData.pointValues[ii];return pointColorFunc(dd, 'fill', strokeColor, pMin, pMax); }).attr('stroke-width', pointStrokeWidth); ptsContainer.selectAll('circle.point').on('mouseover', function (dd, ii) { @@ -6668,19 +6713,6 @@ } }); - // var values = {}; - // pointKeyExtractor(key, currentData, violinValues).map(function(k, i){ - // values[k] = pointValueExtractor(k, key, currentData, violinValues) - // }) - // - // console.table(values) - // - // .data(data) - // .keys(['Value']) - // .values([function(cd, key){return cd }]) - // pointsTooltip() - - tooltip$$1.selection(container.selectAll('g:not(.to-remove).' + objectClass + ' .area')); if (tooltip$$1.data() == undefined) { tooltip$$1.data(data); @@ -6702,32 +6734,128 @@ return violin; } - function violinPointsExtractor(violinKey, violinData) { - return violinData.points; - } - function violinPointValueExtractor(violinPointKey, violinPointData) { - return violinPointData[violinPointKey].value; - } - + /** + * Produces the function which manipulates the violin data to have values needed + * for rendering the violins as svg. + * @returns {function} calculateViolinValues + * @namespace neededViolinValues + */ function neededViolinValues() { - var horizontalQ = true, - quartileKeys = ['Q0', 'Q1', 'Q2', 'Q3', 'Q4'], - violinPointsExtractor, - violinPointValueExtractor; + var + /** + * Whether or not the orientation of the violins are horizontal + * (see {@link violin#orient}) + * @param {Object} [horizontalQ=true] + * @memberof neededViolinValues# + * @property + */ + horizontalQ = true, + /** + * Keys to be put into the quartiles if they need to be calculated. + * (see {@link violin#quartileKeys}) + * @param {Object} [quartileKeys=['Q0', 'Q1', 'Q2', 'Q3', 'Q4']] + * @memberof neededViolinValues# + * @property + */ + quartileKeys = ['Q0', 'Q1', 'Q2', 'Q3', 'Q4'], + + /** + * Function which given the key of the violin and that key's associated value + * returns the object consiting of the points of the violin + * (see {@link violin#violinPointsExtractor}) + * @param {Object} [violinPointsExtractor=function(violinKey, violinData) { return violinData.points }] + * @memberof neededViolinValues# + * @property + */ + violinPointsExtractor, + + /** + * Function which given the key of the current point and the object of points for the + * violin, returns the numerical value of the point + * (see {@link violin#violinPointValueExtractor}) + * @param {Object} [violinPointValueExtractor=function(violinPointKey, violinPointData) { return violinPointData[violinPointKey].value }] + * @memberof neededViolinValues# + * @property + */ + violinPointValueExtractor; + + /** + * Gets / sets the horizontalQ + * (see {@link violin#orient}) + * @param {boolean} [_=none] + * @returns {calculateViolinValues | boolean} + * @memberof calculateViolinValues + * @property + * + * by default horizontalQ = true + */ calculateViolinValues.horizontalQ = function (_) { return arguments.length ? (horizontalQ = _, calculateViolinValues) : horizontalQ; }; + /** + * Gets / sets the quartileKeys + * (see {@link violin#quartileKeys}) + * @param {string[]} [_=none] + * @returns {calculateViolinValues | string[]} + * @memberof calculateViolinValues + * @property + * + * by default quartileKeys = ["Q0","Q1","Q2","Q3","Q4"] + */ calculateViolinValues.quartileKeys = function (_) { return arguments.length ? (quartileKeys = _, calculateViolinValues) : quartileKeys; }; + /** + * Gets / sets the violinPointsExtractor + * (see {@link violin#violinPointsExtractor}) + * @param {function} [_=none] + * @returns {calculateViolinValues | function} + * @memberof calculateViolinValues + * @property + * + * by default violinPointsExtractor = function(violinKey, violinData) { return violinData.points } + */ calculateViolinValues.violinPointsExtractor = function (_) { return arguments.length ? (violinPointsExtractor = _, calculateViolinValues) : violinPointsExtractor; }; + /** + * Gets / sets the violinPointValueExtractor + * (see {@link violin#violinPointValueExtractor}) + * @param {function} [_=none] + * @returns {calculateViolinValues | function} + * @memberof calculateViolinValues + * @property + * + * by default violinPointValueExtractor = function(violinPointKey, violinPointData) { return violinPointData[violinPointKey].value } + */ calculateViolinValues.violinPointValueExtractor = function (_) { return arguments.length ? (violinPointValueExtractor = _, calculateViolinValues) : violinPointValueExtractor; }; + /** + * The function produced by neededViolinValues. + * + * Adds the data need to render the violin as an svg + * @param {string} violinKey the key of the current violin + * @param {object} data the object consisting of violinKey - values (violin data) pairs + * @returns {none} this function manipulates the passed data object adding the following keys + * + * data[violinKey].binned // the binned values of the points + * + * data[violinKey].frequencies // the list consisting of the length of each bin + * + * data[violinKey].contour // the points depicting the contour of 1/2 of the violin + * + * data[violinKey].quartiles // the quartiles of the points' values + * + * data[violinKey].pointKeys // the keys associated with the points + * + * data[violinKey].pointValues // the numerical values of the points + * + * @memberof neededViolinValues# + * @property + */ function calculateViolinValues(violinKey, data) { // data for the current violin var violinData = data[violinKey]; @@ -7516,4 +7644,4 @@ window.d3sm = d3sm; }()); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZDNzbS5taW4uanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JpcHRzL21vZHVsZXMvaGVscGVycy5qcyIsIi4uLy4uL3NyYy9zY3JpcHRzL21vZHVsZXMvYXJyYXktZnVuY3Rpb25zLmpzIiwiLi4vLi4vc3JjL3NjcmlwdHMvbW9kdWxlcy91dGlscy5qcyIsIi4uLy4uL3NyYy9zY3JpcHRzL21vZHVsZXMvZ3JvdXBpbmctc3BhY2VyLmpzIiwiLi4vLi4vc3JjL3NjcmlwdHMvbW9kdWxlcy9heGlzLmpzIiwiLi4vLi4vc3JjL3NjcmlwdHMvbW9kdWxlcy9jb2xvci1mdW5jdGlvbi5qcyIsIi4uLy4uL3NyYy9zY3JpcHRzL21vZHVsZXMvdG9vbHRpcC5qcyIsIi4uLy4uL3NyYy9zY3JpcHRzL21vZHVsZXMvYmFyLmpzIiwiLi4vLi4vc3JjL3NjcmlwdHMvbW9kdWxlcy9idWJibGUtaGVhdG1hcC5qcyIsIi4uLy4uL3NyYy9zY3JpcHRzL21vZHVsZXMvYm94LXdoaXNrZXIuanMiLCIuLi8uLi9zcmMvc2NyaXB0cy9tb2R1bGVzL2RhdGEtdG9nZ2xlLmpzIiwiLi4vLi4vc3JjL3NjcmlwdHMvbW9kdWxlcy9zY2F0dGVyLmpzIiwiLi4vLi4vc3JjL3NjcmlwdHMvbW9kdWxlcy9wbG90LXpvb20uanMiLCIuLi8uLi9zcmMvc2NyaXB0cy9tb2R1bGVzL3Zpb2xpbi5qcyIsIi4uLy4uL3NyYy9zY3JpcHRzL21vZHVsZXMvcG9pbnRzLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL21zL2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9kZWJ1Zy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvYnJvd3Nlci5qcyIsIi4uLy4uL3NyYy9zY3JpcHRzL21haW4uanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gaW1wb3J0IHtoYXNRfSBmcm9tICcuL2FycmF5LWZ1bmN0aW9ucyc7XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEVMUEVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqXG4qIEhlbHBlciBmdW5jdGlvbiBmb3IgQXJyYXkuZmlsdGVyIHRvIGdldCB1bmlxdWUgZWxlbWVudHMgb2YgdGhlIGFycmF5XG4qIEBwYXJhbSB7Kn0gdmFsdWUgY3VycmVudCB2YWx1ZSBhcyBtYXBwaW5nIG92ZXIgYXJyYXkgKHNlbGYpXG4qIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBjdXJyZW50IGluZGV4IGluIHRoZSBhcnJheVxuKiBAcGFyYW0ge0FycmF5fSBzZWxmIHBhc3NlZCBhcnJheSBmcm9tIEFycmF5LmZpbHRlciBtZXRob2RcbiogQHJldHVybnMge2Jvb2xlYW59IHdoZXRoZXIgb3Igbm90IHZhbHVlIGlzIHRoZSBmaXJzdCBvZiBpdHMga2luZCAoaS5lLiBpbmRleE9mKHZhbHVlKSA9PSBpbmRleClcbiovXG5leHBvcnQgZnVuY3Rpb24gdW5pcXVlRWxlbWVudHModmFsdWUsIGluZGV4LCBzZWxmKSB7IHJldHVybiBzZWxmLmluZGV4T2YodmFsdWUpID09PSBpbmRleDsgfVxuXG4vKipcbiogRXh0cmFjdHMgeCBhbmQgeSBvZiB0cmFuc2xhdGUgZnJvbSB0cmFuc2Zvcm0gcHJvcGVydHlcbiogQHBhcmFtIHtzdHJpbmd9IHRyYW5zZm9ybSB0cmFuc2Zvcm0gcHJvcGVydHkgb2Ygc3ZnIGVsZW1lbnRcbiogQHJldHVybnMge251bWJlcltdfSB4LCB5IG9mIHRyYW5zbGF0ZSh4LCB5KVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUcmFuc2xhdGlvbih0cmFuc2Zvcm0pIHtcbiAgLy8gQ3JlYXRlIGEgZHVtbXkgZyBmb3IgY2FsY3VsYXRpb24gcHVycG9zZXMgb25seS4gVGhpcyB3aWxsIG5ldmVyXG4gIC8vIGJlIGFwcGVuZGVkIHRvIHRoZSBET00gYW5kIHdpbGwgYmUgZGlzY2FyZGVkIG9uY2UgdGhpcyBmdW5jdGlvblxuICAvLyByZXR1cm5zLlxuICB2YXIgZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnZycpO1xuICAvLyBTZXQgdGhlIHRyYW5zZm9ybSBhdHRyaWJ1dGUgdG8gdGhlIHByb3ZpZGVkIHN0cmluZyB2YWx1ZS5cbiAgdHJhbnNmb3JtID0gdHJhbnNmb3JtID09IHVuZGVmaW5lZCA/ICd0cmFuc2xhdGUoMCwwKScgOiB0cmFuc2Zvcm07XG4gIGcuc2V0QXR0cmlidXRlTlMobnVsbCwgJ3RyYW5zZm9ybScsIHRyYW5zZm9ybSk7XG4gIC8vIGNvbnNvbGlkYXRlIHRoZSBTVkdUcmFuc2Zvcm1MaXN0IGNvbnRhaW5pbmcgYWxsIHRyYW5zZm9ybWF0aW9uc1xuICAvLyB0byBhIHNpbmdsZSBTVkdUcmFuc2Zvcm0gb2YgdHlwZSBTVkdfVFJBTlNGT1JNX01BVFJJWCBhbmQgZ2V0XG4gIC8vIGl0cyBTVkdNYXRyaXguXG4gIHZhciBtYXRyaXggPSBnLnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCkubWF0cml4O1xuICAvLyBBcyBwZXIgZGVmaW5pdGlvbiB2YWx1ZXMgZSBhbmQgZiBhcmUgdGhlIG9uZXMgZm9yIHRoZSB0cmFuc2xhdGlvbi5cbiAgcmV0dXJuIFttYXRyaXguZSwgbWF0cml4LmZdO1xufVxuXG5cbi8qKlxuKiBNb2RpZmllcyBsdW1pbmFuY2Ugb2YgaGV4aWRlY2ltYWwgbnVtYmVyXG4qIEBwYXJhbSB7c3RyaW5nfSBoZXggc2hvdWxkIGJlIGhleGlkZWNpbWFsIHZhbHVlIHdpdGggb3Igd2l0aG91dCB0aGUgcHJvY2VlZGluZyBvY3RvdHJvcGVcbiogQHBhcmFtIHtudW1iZXJ9IGx1bSB2YWx1ZSB0byBpbmNyZWFzZSBvciBkZWNyZWFzZSBsdW1pbm9zaXR5IGJ5XG4qIEByZXR1cm5zIHtzdHJpbmd9IHVwZGF0ZWQgaGV4aWRlY2ltYWwgdmFsdWUgd2l0aG91dCB0aGUgcHJvY2VlZGluZyBvY3RvdHJvcGVcbiovXG5leHBvcnQgZnVuY3Rpb24gbW9kaWZ5SGV4aWRlY2ltYWxDb2xvckx1bWluYW5jZShoZXgsIGx1bSkge1xuICAvLyB2YWxpZGF0ZSBoZXggc3RyaW5nXG4gIHZhciBoZXggPSBTdHJpbmcoaGV4KS5yZXBsYWNlKC9bXjAtOWEtZl0vZ2ksICcnKTtcblxuICBpZiAoaGV4Lmxlbmd0aCA8IDYpIHtcbiAgICBoZXggPSBoZXhbMF0raGV4WzBdK2hleFsxXStoZXhbMV0raGV4WzJdK2hleFsyXTtcblx0fVxuXHRsdW0gPSBsdW0gfHwgMDtcblxuXHQvLyBjb252ZXJ0IHRvIGRlY2ltYWwgYW5kIGNoYW5nZSBsdW1pbm9zaXR5XG5cdHZhciByZ2IgPSAnIycsIGMsIGk7XG5cdGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHtcblx0XHRjID0gcGFyc2VJbnQoaGV4LnN1YnN0cihpKjIsMiksIDE2KTtcblx0XHRjID0gTWF0aC5yb3VuZChNYXRoLm1pbihNYXRoLm1heCgwLCBjICsgKGMgKiBsdW0pKSwgMjU1KSkudG9TdHJpbmcoMTYpO1xuXHRcdHJnYiArPSAoJzAwJytjKS5zdWJzdHIoYy5sZW5ndGgpO1xuXHR9XG5cblx0cmV0dXJuIHJnYjtcbn1cblxuXG4vKipcbiogQGRlcHJlY2F0ZWQgQHNlZXtAbGluayB0aWNrUmFuZ2V9XG4qIEBwYXJhbSB7bnVtYmVyfSBtaW5cbiogQHBhcmFtIHtudW1iZXJ9IG1heFxuKiBAcGFyYW0ge251bWJlcn0gcGFydHNcbiogQHJldHVybnMge251bWJlcltdfSBhcnJheSBvZiBsZW5ndGggcGFydHMgZXZlbmx5IHBhcnRpdGlvbmVkIGJldHdlZW4gbWluIGFuZCBtYXhcbiovXG5leHBvcnQgZnVuY3Rpb24gcGFydGl0aW9uUmFuZ2VJbnRvKG1pbiwgbWF4LCBwYXJ0cykge1xuICB2YXIgZGlmZiA9IG1heCAtIG1pblxuICByZXR1cm4gQXJyYXkocGFydHMpLm1hcChmdW5jdGlvbiAoZSwgaSkgeyByZXR1cm4gbWluICsgZGlmZiAvIHBhcnRzICogaSB9KVxufVxuXG5cbi8qKlxuKiBDYWxjdWxhdGVkIHRoZSBxdWFydGlsZXMgb2YgdGhlIHBhc3NlZCBkYXRhIGFuZCBzdG9yZXMgdGhlbSB3aXRoIHFLZXlzXG4qIEBwYXJhbSB7bnVtYmVyW119IGRhdGEgbGlzdCBvZiBudW1lcmljYWwgdmFsdWVzXG4qIEBwYXJhbSB7c3RyaW5nW119IFtxS2V5cz1bJ3EwJywgJ3ExJywgJ3EyJywgJ3EzJywgJ3E0J11dIGhvdyByZXR1cm5lZCBvYmplY3Qgd2l0aCBxdWFydGlsZXMgc2hvdWxkIGJlIHN0b3JlZFxuKiBAcmV0dXJucyB7T2JqZWN0fSB3aXRoIGtleXMgcUtleXMgZ2l2aW5nIG9ubHkgdGhlIG51bWVyaWNhbCB2YWx1ZXMgZm9yIHRoZSBxdWFydGlsZXNcbiovXG5leHBvcnQgZnVuY3Rpb24gcXVhcnRpbGVzKGRhdGEsIHFLZXlzKSB7XG4gIHZhclxuICBxMiA9IGQzLm1lZGlhbihkYXRhKSxcbiAgbG93ZXIgPSBkYXRhLmZpbHRlcih4ID0+IHggPCBxMiksXG4gIHVwcGVyID0gZGF0YS5maWx0ZXIoeCA9PiB4ID4gcTIpLFxuXG4gIHExID0gZDMubWVkaWFuKGxvd2VyKSxcbiAgcTEgPSBxMSA9PSB1bmRlZmluZWQgPyBxMiA6IHExLFxuXG4gIHEwID0gZDMubWluKGxvd2VyKSxcbiAgcTAgPSBxMCA9PSB1bmRlZmluZWQgPyBxMSA6IHEwLFxuXG4gIHEzID0gZDMubWVkaWFuKHVwcGVyKSxcbiAgcTMgPSBxMyA9PSB1bmRlZmluZWQgPyBxMiA6IHEzLFxuXG4gIHE0ID0gZDMubWF4KHVwcGVyKSxcbiAgcTQgPSBxNCA9PSB1bmRlZmluZWQgPyBxMyA6IHE0LFxuXG4gIGswID0gJ3EwJywgazEgPSAncTEnLCBrMiA9ICdxMicsIGszID0gJ3EzJywgazQgPSAncTQnLFxuICBvYmogPSB7fVxuICBpZiAocUtleXMhPXVuZGVmaW5lZCAmJiBxS2V5cy5sZW5ndGggPT0gNSkgeyBrMCA9IHFLZXlzWzBdOyBrMSA9IHFLZXlzWzFdOyBrMiA9IHFLZXlzWzJdOyBrMyA9IHFLZXlzWzNdOyBrNCA9IHFLZXlzWzRdOyB9XG4gIG9ialtrMF0gPSBxMDsgb2JqW2sxXSA9IHExOyBvYmpbazJdID0gcTI7IG9ialtrM10gPSBxMzsgb2JqW2s0XSA9IHE0O1xuXG4gIHJldHVybiBvYmpcbn1cblxuXG4vKipcbiogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCBhbGwgdmFsdWVzIG5lZWRlZCBpbiBtYWtpbmcgdmlvbGluIHBsb3RzXG4qIEBwYXJhbSB7c3RyaW5nW119IHZpb2xpbktleXNcbiogQHBhcmFtIHtudW1iZXJbXX0gZGF0YVxuKiBAcGFyYW0ge0Z1bmN0aW9ufSB2YWx1ZUV4dHJhY3RvckZ1bmN0aW9uIGhvdyB0byBnZXQgdmFsdWVzIGZyb20gZGF0YVt2aW9saW5LZXlzW2ldXVxuKiBAcGFyYW0ge2Jvb2xlYW59IGhvcml6b250YWxRIHdoZXRoZXIgb3Igbm90IHZpb2xpbnMgd2lsbCBiZSByZW5kZXJlZCBob3Jpem9udGFsbHkgb3IgdmVydGljYWxseVxuKiBAcGFyYW0ge3N0cmluZ30gcUtleSBob3cgdGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBxdWFydGlsZXMgc2hvdWxkIGJlIGxhYmVsZWQgYXNcbiogQHBhcmFtIHtzdHJpbmdbXX0gcUtleXMgaG93IGVhY2ggcXVhcnRpbGUgc2hvdWxkIGJlIGxhYmVsZWQgYXNcbiogQHJldHVybnMge09iamVjdH0gcmVxdWlyZWQgZm9yIEBzZWV7QGxpbmsgdmlvbGlufSBjb250YWluaW5nIGtleXMgdmFsdWVzLCBiaW5ubmVkLCBmcmVxdWVuY2llcywgcG9pbnRzLCBhbmQgcXVhcnRpbGVzXG4qIEBzZWV7QGxpbmsgcXVhcnRpbGVzfVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0VmlvbGluVmFsdWVzKFxuICB2aW9saW5LZXlzLFxuICBkYXRhLFxuICB2YWx1ZUV4dHJhY3RvckZ1bmN0aW9uLFxuICBob3Jpem9udGFsUSxcbiAgcUtleSxcbiAgcUtleXNcbil7XG4gIHZhciBvYmogPSB7fVxuICB2aW9saW5LZXlzLm1hcChmdW5jdGlvbihrLCBpKXtcbiAgICAgdmFyIGQgPSB2YWx1ZUV4dHJhY3RvckZ1bmN0aW9uKGssIGksIGRhdGEpLFxuICAgICBiaW5uZWQgPSBkMy5oaXN0b2dyYW0oKShkKSxcbiAgICAgZnJlcXVlbmNpZXMgPSBiaW5uZWQubWFwKHg9PngubGVuZ3RoKSxcbiAgICAgbWluUG9pbnQgPSBob3Jpem9udGFsUSA/IHt5OiBkMy5taW4oZCksIHg6IDB9IDoge3g6IGQzLm1pbihkKSwgeTogMH0sXG4gICAgIG1heFBvaW50ID0gaG9yaXpvbnRhbFEgPyB7eTogZDMubWF4KGQpLCB4OiAwfSA6IHt4OiBkMy5tYXgoZCksIHk6IDB9LFxuICAgICBwb2ludHMgPSBiaW5uZWQubWFwKGZ1bmN0aW9uKGJpbiwgaSkge1xuICAgICAgIHJldHVybiBob3Jpem9udGFsUVxuICAgICAgID8ge3k6IChiaW4ubGVuZ3RoKSA/IGQzLm1lZGlhbihiaW4pOiBkMy5tZWRpYW4oW2Jpbi54MCwgYmluLngxXSksIHg6IGZyZXF1ZW5jaWVzW2ldfVxuICAgICAgIDoge3g6IChiaW4ubGVuZ3RoKSA/IGQzLm1lZGlhbihiaW4pOiBkMy5tZWRpYW4oW2Jpbi54MCwgYmluLngxXSksIHk6IGZyZXF1ZW5jaWVzW2ldfVxuICAgICB9KSxcbiAgICAgcXVhcnRzID0gcXVhcnRpbGVzKGQsIHFLZXlzKSxcbiAgICAgbyA9IHtcbiAgICAgICB2YWx1ZXM6IGQsXG4gICAgICAgYmlubmVkOiBiaW5uZWQsXG4gICAgICAgZnJlcXVlbmNpZXM6IGZyZXF1ZW5jaWVzLFxuICAgICAgIHBvaW50czogW21pblBvaW50XS5jb25jYXQocG9pbnRzKS5jb25jYXQoW21heFBvaW50XSlcbiAgICAgfVxuICAgICBvW3FLZXldID0gcXVhcnRzO1xuICAgICBvYmpba10gPSBvO1xuICAgfSk7XG4gICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiogSHlwZW5hdGVzIGFsbCBzdHJpbmdzIHRvZ2V0aGVyXG4qIEBwYXJhbSB7c3RyaW5nW119IGFyZ3VtZW50c1xuKiBAcmV0dXJucyB7c3RyaW5nfSBcImFyZzEtYXJnMi0uLi4tYXJnblwiXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGh5cGVuYXRlKCl7IHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLmpvaW4oJy0nKSB9XG5cblxuLyoqXG4qIFJvdW5kcyBkZWNpbWFscyBvZiBudW1iZXIgdG8gcHJlY2lzaW9uXG4qIEBwYXJhbSB7bnVtYmVyfSBudW1iZXJcbiogQHBhcmFtIHtudW1iZXJ9IHByZWNpc2lvblxuKiBAcmV0dXJucyB7bnVtYmVyfSByb3VuZGVkIHRvIHByZWNpc2lvblxuKi9cbmV4cG9ydCBmdW5jdGlvbiByb3VuZChudW1iZXIsIHByZWNpc2lvbikge1xuICB2YXIgc2hpZnQgPSBmdW5jdGlvbiAobnVtYmVyLCBwcmVjaXNpb24sIHJldmVyc2VTaGlmdCkge1xuICAgIGlmIChyZXZlcnNlU2hpZnQpIHtcbiAgICAgIHByZWNpc2lvbiA9IC1wcmVjaXNpb247XG4gICAgfVxuICAgIHZhciBudW1BcnJheSA9ICgnJyArIG51bWJlcikuc3BsaXQoJ2UnKTtcbiAgICByZXR1cm4gKyhudW1BcnJheVswXSArICdlJyArIChudW1BcnJheVsxXSA/ICgrbnVtQXJyYXlbMV0gKyBwcmVjaXNpb24pIDogcHJlY2lzaW9uKSk7XG4gIH07XG4gIHJldHVybiBzaGlmdChNYXRoLnJvdW5kKHNoaWZ0KG51bWJlciwgcHJlY2lzaW9uLCBmYWxzZSkpLCBwcmVjaXNpb24sIHRydWUpO1xufVxuXG4vKipcbiogcmVjdXJzaXZlbHkgYXNjZW5kcyBlbGVtZW50LnBhcmVudEVsZW1lbnQgdG8gZmluZCBhIHN2ZyB0YWdcbiogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4qIEByZXR1cm5zIHtFbGVtZW50IHwgdW5kZWZpbmVkfVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb250YWluaW5nU1ZHKGVsZW1lbnQpIHtcbiAgdmFyIHBhcmVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudFxuICB2YXIgdGFnID0gcGFyZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKVxuICBpZiAodGFnID09PSAnc3ZnJykgeyByZXR1cm4gcGFyZW50OyB9XG4gIGlmICh0YWcgPT09ICdodG1sJykgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIHJldHVybiBnZXRDb250YWluaW5nU1ZHKHBhcmVudCk7XG59XG5cbi8qKlxuKiBNYXBzIGFyZ3VtZW50cyBpbiB0byBkMy5pbnRlcnBvbGF0ZVJnYkJhc2lzXG4qIEBwYXJhbSBhcmd1bWVudHNcbiogQHJldHVybnMge0Z1bmN0aW9ufVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcnBvbGF0ZUNvbG9ycygpe3JldHVybiBkMy5pbnRlcnBvbGF0ZVJnYkJhc2lzKGFyZ3VtZW50cyl9XG5cblxuLyoqXG4qIFRyeXMgdG8gcmVkdWNlIHRleHQgdG8gZml0IGluIHNwZWNpZmllZCBhcmVhLCBtYWRlIGZvciB0aWNrIGxhYmVscyBhcyBjYWxsZWQgYnlcbiogQHNlZXtAbGluayBheGlzfVxuKiBAcGFyYW0ge2QzLnNlbGVjdGlvbn0gdCBjb250YWluZXIgZm9yIHNwZWNpZmljIGF4aXMgdGlja1xuKiBAcGFyYW0ge3N0cmluZ30gdGV4dCB0byBiZSB0aGUgbGFiZWwgb2YgdGhlIHBhc3NlZCBheGlzIHRpY2tcbiogQHBhcmFtIHtib29sZWFufSBvcmllbnQgb2YgdGhlIGF4aXMsIHRydWUgaXMgaG9yaXpvbnRhbCwgZmFsc2UgaXMgdmVydGljYWxcbiogQHBhcmFtIHtudW1iZXJ9IHRpY2tMZW5ndGggaXMgdGhlIGxlbmd0aCBvZiB0aGUgdGV4dFxuKiBAcGFyYW0ge251bWJlcn0gc3BhY2UgaXMgdGhlIGFtb3VudCBvZiBhdmFpbGJsZSBzcGFjZSBmb3IgdGhlIHRleHQgYW5kIHRoZSB0aWNrIHRvIGZpdCBpblxuKiBAcGFyYW0ge2Jvb2xlYW59IG92ZXJmbG93USB3aGV0aGVyIG9yIG5vdCBhbGxvd2VkIHRvIGdvIG92ZXIgdGhlIGFsbG90ZWQgc3BhY2VcbiogQHJldHVybnMge25vbmV9XG4qL1xuZXhwb3J0IGZ1bmN0aW9uIHRydW5jYXRlVGV4dCh0LCB0ZXh0LCBvcmllbnQsIHRpY2tMZW5ndGgsIHNwYWNlLCBvdmVyZmxvd1EpIHtcbiAgdmFyIHJlY3QgPSB0Lm5vZGUoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICB0LnRleHQodGV4dClcbiAgd2hpbGUgKE1hdGgubWF4KHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KSA+IHNwYWNlIC0gdGlja0xlbmd0aCkge1xuICAgIHRleHQgPSBTdHJpbmcodGV4dClcbiAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCB0ZXh0Lmxlbmd0aCAtIDEpXG4gICAgdC50ZXh0KHRleHQgKyAnLi4uJylcbiAgICByZWN0ID0gdC5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICBpZiAodGV4dC5sZW5ndGggPT0gMCkgYnJlYWtcbiAgfVxufVxuXG5cbi8qKlxuKiBUcnlzIHRvIHVzZSBkMy5zZWxlY3Rpb24gdG8gZ2V0IGVsZW1lbnQsIGlmIGl0IGRvZXNudCBleGlzdCwgbWFrZXMgb25lXG4qIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBzZWwgc2VsZWN0aW9uIGluIHdoaWNoIHRvIHRyeSBhbmQgZmluZCBvYmplY3RcbiogQHBhcmFtIHtzdHJpbmd9IHRhZyB0YWcgb2Ygd2hpY2ggdG8gdHJ5IGFuZCBzZWxlY3RcbiogQHBhcmFtIHtzdHJpbmd9IFtjbHM9JyddIGNsYXNzIG9mIHRhZyB0byB0cnkgYW5kIGdyYWJcbiogQHJldHVybnMge2QzLnNlbGVjdGlvbn0gb2YgZWl0aGVyIGFwcGVuZCBvciBzZWxlY3RlZCB0YWcuY2xzIHdpdGhpbiBzZWxcbiovXG5leHBvcnQgZnVuY3Rpb24gc2FmZVNlbGVjdChzZWwsIHRhZywgY2xzKSB7XG4gIHZhciBjbHNTdHIgPSBjbHMgPT0gdW5kZWZpbmVkID8gJycgOiAnLicrY2xzO1xuICB2YXIgc1NlbCA9IHNlbC5zZWxlY3QodGFnK2Nsc1N0cikuZW1wdHkoKVxuICA/IHNlbC5hcHBlbmQodGFnKVxuICA6IHNlbC5zZWxlY3QodGFnK2Nsc1N0cilcbiAgcmV0dXJuIHNTZWxcbiAgLmNsYXNzZWQoY2xzU3RyLnJlcGxhY2UoJy4nLCAnJyksIHRydWUpXG4gIC5hdHRyKCd0cmFuc2Zvcm0nLCBzU2VsLmF0dHIoJ3RyYW5zZm9ybScpID09IHVuZGVmaW5lZCA/ICd0cmFuc2xhdGUoMCwwKScgOiBzU2VsLmF0dHIoJ3RyYW5zZm9ybScpKVxufVxuXG4vKipcbiogZXZlbmx5IHBhcnRpdGlvbnMgdGhlIHJhbmdlIFttaW4sIG1heF0gaW50byBuIHBhcnRzXG4qIEBwYXJhbSB7bnVtYmVyfSBtaW5cbiogQHBhcmFtIHtudW1iZXJ9IG1heFxuKiBAcGFyYW0ge251bWJlcn0gblxuKiBAcmV0dXJucyB7bnVtYmVyW119IGFycmF5IG9mIGxlbmd0aCBuIGV2ZW5seSBwYXJ0aXRpb25lZCBiZXR3ZWVuIG1pbiBhbmQgbWF4XG4qL1xuZXhwb3J0IGZ1bmN0aW9uIHRpY2tSYW5nZShtaW4sIG1heCwgbikge1xuICB2YXIgYSA9IFttaW5dXG4gIHZhciBkID0gbWF4LW1pblxuICB2YXIgcyA9IGQgLyAobi0xKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IG4tMjsgaSsrKSB7IGEucHVzaChtaW4gKyBzICogKGkrMSkpIH1cbiAgYS5wdXNoKG1heClcbiAgcmV0dXJuIGFcbn1cbiIsImltcG9ydCB7dW5pcXVlRWxlbWVudHN9IGZyb20gJy4vaGVscGVycyc7XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1RPVFlQRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqXG4qIFRoaXMgZnVuY3Rpb24gdGVzdHMgdG8gc2VlIGlmIGFsbCBlbGVtZW50cyBvZiB0aGUgcGFzc2VkIGFycmF5IGFyZSB0cnVlLlxuKiBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiB2YWx1ZXNcbiogQHBhcmFtIHtGdW5jdGlvbn0gW2Z1bmMgZnVuY3Rpb24odmFsdWUpe3JldHVybiB2YWx1ZSA9PSB0cnVlO31dIGlzIGFwcGxpZWQgdG8gZWFjaCB2YWx1ZSBvZiB0aGUgYXJyYXkgYW5kIHNob3VsZCByZXR1cm4gYSBib29sZWFuLlxuKiBAcmV0dXJucyB7Ym9vbGVhbn0gaWYgYWxsIHZhbHVlcyBhcmUgdHJ1ZSBieSBmdW5jdGlvblxuKi9cbmV4cG9ydCBmdW5jdGlvbiBhbGwoIGFycmF5LCBmdW5jICkge1xuICBpZiAoZnVuYyA9PSB1bmRlZmluZWQpIHsgcmV0dXJuIGFycmF5LmV2ZXJ5KCBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWUgPT09IHRydWU7IH0pOyB9XG4gIHJldHVybiBhcnJheS5ldmVyeSggZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIGZ1bmModmFsdWUpOyB9ICk7XG59XG5cbi8qKlxuKiBDb3VudHMgdGhlIG51bWJlciBvZiBvY2N1cmFuY2VzIG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgZ2l2ZW4gYXJyYXkuXG4qIEBwYXJhbSB7QXJyYXl9IGFycmF5IG9mIGVsZW1lbnRzXG4qIEByZXR1cm5zIHtPYmplY3R9IG9mIGtleTogdmFsdWUgcGFpcnMgd2hlcmUga2V5IGlzIGFuIGVsZW1lbnQgaW4gdGhlIGFycmF5IGFuZCB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIGl0IG9jY3Vycy5cbiovXG5leHBvcnQgZnVuY3Rpb24gdGFsbHkoIGFycmF5ICkge1xuICB2YXIgdGFsbGllcyA9IHt9O1xuICBhcnJheS5tYXAoIGZ1bmN0aW9uICggZWxlbWVudCApIHtcbiAgICBpZiAoIGhhc1EoT2JqZWN0LmtleXModGFsbGllcyksIGVsZW1lbnQpICkgeyB0YWxsaWVzW2VsZW1lbnRdID0gMTsgfVxuICAgIGVsc2UgeyB0YWxsaWVzW2VsZW1lbnRdICs9IDE7IH1cbiAgfSk7XG4gIHJldHVybiB0YWxsaWVzO1xufVxuLyoqXG4qIFNob3J0LWhhbmQgZm9yIGFycmF5LmluY2x1ZGVzKGl0ZW0pO1xuKiBAcGFyYW0ge0FycmF5fSBhcnJheVxuKiBAcGFyYW0geyp9IGl0ZW0gdG8gdGVzdCBpZiBjb250YWluZWQgaW4gIHthcnJheX1cbiogQHJldHVybnMge2Jvb2xlYW59XG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1EoIGFycmF5LCBpdGVtICkgeyByZXR1cm4gYXJyYXkuaW5jbHVkZXMoaXRlbSk7IH1cblxuLyoqXG4qIFJldHVybnMgZmlyc3QgaXRlbSBpbiBhcnJheVxuKiBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiBpdGVtc1xuKiBAcmV0dXJucyB7Kn0gYXJyYXlbMF1cbiovXG5leHBvcnQgZnVuY3Rpb24gZmlyc3QoIGFycmF5ICkgeyByZXR1cm4gYXJyYXlbMF07IH1cblxuLyoqXG4qIFJldHVybnMgbGFzdCBpdGVtIGluIGFycmF5XG4qIEBwYXJhbSB7QXJyYXl9IGFycmF5IG9mIGl0ZW1zXG4qIEByZXR1cm5zIHsqfSBhcnJheVthcnJheS5sZW5ndGgtMV1cbiovXG5leHBvcnQgZnVuY3Rpb24gbGFzdCggYXJyYXkgKSB7IHJldHVybiBhcnJheVthcnJheS5sZW5ndGgtMV07IH1cblxuLyoqXG4qIENhbGN1bGF0ZXMgdGhlIHRvdGFsIHZhbHVlIG9mIG51bWJlcnMgaW4gcGFzc2VkIGFycmF5XG4qIEBwYXJhbSB7bnVtYmVyW119IGFycmF5IG9mIG51bWVyaWNhbCB2YWx1ZXNcbiogQHJldHVybnMge251bWJlcn0gc3VtIG92ZXIgZWxlbWVudHMgaW4gYXJyYXlcbiovXG5leHBvcnQgZnVuY3Rpb24gdG90YWwoIGFycmF5ICkgeyByZXR1cm4gYXJyYXkucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCkgfTtcblxuLyoqXG4qIFJlbW92ZXMgZHVwbGljYXRlcyBpbiBhcnJheVxuKiBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiBpdGVtc1xuKiBAcmV0dXJucyB7QXJyYXl9IG9mIGl0ZW1zIHN1Y2ggdGhhdCBpdGVtX2kgIT0gaXRlbV9qIGZvciBhbGwgaSA8IGpcbiogQHNlZXtAbGluayB1bmlxdWVFbGVtZW50c30gZm9yIHRoZSBmaWx0ZXJpbmcgZnVuY3Rpb25cbiovXG5leHBvcnQgZnVuY3Rpb24gdW5pcXVlKCBhcnJheSApIHsgcmV0dXJuIGFycmF5LmZpbHRlciggdW5pcXVlRWxlbWVudHMgKTsgfVxuXG4vKipcbiogRmlsdGVycyBwYXNzZWQgYXJyYXkgZm9yIHNwZWNpZmllZCBpbmRpY2llc1xuKiBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiBpdGVtc1xuKiBAcGFyYW0ge251bWJlcltdfSBwb3NpdGlvbnMgb2YgaW50ZWdlcnMgc3VjaCB0aGF0IGkgPCBhcnJheS5sZW5ndGhcbiogQHJldHVybnMge0FycmF5fSBvZiBpdGVtcyBzdWNoIHRoYXQgZm9yIGFueSBpdGVtX2ksIHBvc2l0aW9ucy5pbmNsdWRlcyhpKSA9PT0gdHJ1ZVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXQoIGFycmF5LCBwb3NpdGlvbnMgKSB7XG4gIHJldHVybiBhcnJheS5maWx0ZXIoIGZ1bmN0aW9uKCB2YWx1ZSwgaW5kZXggKSB7IHJldHVybiBoYXNRKHBvc2l0aW9ucywgaW5kZXgpOyB9ICk7XG59XG5cbi8qKlxuKiBEZXRlcm1pbmVzIGlmIGFsbCBlbGVtZW50cyBpbiBwYXNzZWQgYXJyYXkgYXJlIGFycmF5cyB0aGVtc2VsdmVzLlxuKiBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiBpdGVtc1xuKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiBBcnJheS5pc0FycmF5KGUpIGlzIHRydWUgZm9yIGFsbCBlIGluIGFycmF5XG4qIEBzZWV7QGxpbmsgYWxsfVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0T2ZMaXN0c1EoIGFycmF5ICkge1xuICByZXR1cm4gYWxsKCBhcnJheS5tYXAoIGZ1bmN0aW9uKCBlbGVtZW50LCBpbmRleCApIHsgcmV0dXJuIEFycmF5LmlzQXJyYXkoZWxlbWVudCkgfSApIClcbn1cblxuLyoqXG4qIEJ1aWx0IG9uIHRvcCBvZiBAc2Vle0BsaW5rIGdldH0sIG1hcHBpbmcgaWYgcG9zaXRpb25zIGlzIGEgbGlzdCBvZiBsaXN0cyAoQHNlZXtAbGluayBsaXN0T2ZMaXN0c1F9KVxuKiBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiBpdGVtc1xuKiBAcGFyYW0ge251bWJlcltdIHwgW11udW1iZXJbXSB9IHBvc2l0aW9ucyBvZiBpbnRlZ2VycyBvciBsaXN0IG9mIHBvc2l0aW9ucyBvZiBpbnRlZ2Vyc1xuKiBAcmV0dXJucyB7Ym9vbGVhbn0gcmV0dXJucyBzcGVjaWZpZWQgcG9zaXRpb25zIGZyb20gYXJyYXkuIElmIG5lc3RlZCBwb3NpdGlvbnMgcGFzc2VkLCByZXR1cm5zIHJlcXVlc3RlZCBpdGVtcyBpbiBzYW1lIHN0cnVjdHVyZS5cbiovXG5leHBvcnQgZnVuY3Rpb24gY3V0KCBhcnJheSwgcG9zaXRpb25zICkge1xuICBpZiAoIGxpc3RPZkxpc3RzUShhcnJheSkgKSB7IHJldHVybiBwb3NpdGlvbnMubWFwKGZ1bmN0aW9uKHBvcywgaSkgeyByZXR1cm4gYXJyYXkuZ2V0KHBvcyk7IH0pOyB9XG4gIHJldHVybiBnZXQoIGFycmF5LCBwb3NpdGlvbnMgKTtcbn1cblxuLyoqXG4qIEdpdmVuIGFuIGFycmF5IG9mIG9iamVjdHMsIGNvbnN0cnVjdHMgbmV3IG9iamVjdHMgd2hlcmUgZWFjaCB2YWx1ZSBpcyBhIGxpc3RcbiogYmFzZWQgb24gdGhlIGNvcnJlc29uZGluZyBrZXksIHdoaWNoIGlzIGV4dHJhY3RlZCBieSB0aGUgcGFyYW1ldGVyIGJ5XG4qIEBwYXJhbSB7T2JqZWN0c1tdfSBhcnJheSBvZiBvYmplY3RzXG4qIEBwYXJhbSB7c3RyaW5nfSBieSBrZXkgd2l0aGluIGFsbCBvYmplY3RzIG9mIHBhc3NlZCBhcnJheVxuKiBAcGFyYW0ge3N0cmluZ1tdfSBbZ3JvdXBzXSBzYXZlcyBzb21lIGNvbXB1dGF0aW9uIGlmIGFsbCBrbm93biB2YWx1ZXMgZXh0cmFjdGVkIGJ5IG1hcHBpbmcgb3ZlciB0aGUgcGFyYW1ldGVyIGJ5IGFyZSBwYXNzZWRcbiogQHJldHVybnMge09iamVjdH0gb2Yga2V5IHZhbHVlIHBhaXJzLCB3aGVyZSBrZXlzIGFyZSBhbGwgdmFsdWVzIG9mIHRoZSBrZXkgYnkgZnJvbSBhbiBvYmplY3QgaW4gdGhlIHBhc3NlZCBhcnJheSBhbmQgdGhlIHZhbHVlIGFyZSB0aG9zZSBjb3JyZXNwb25kaW5nIG9iamVjdHMuXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwQnkgKGFycmF5LCBieSwgZ3JvdXBzKSB7XG4gIGlmIChncm91cHMgPT0gdW5kZWZpbmVkKSB7XG4gICAgZ3JvdXBzID0gdW5pcXVlKGFycmF5Lm1hcChmdW5jdGlvbihlbGVtZW50cywgaW5kZXgpeyByZXR1cm4gZWxlbWVudFtieV07IH0pKTtcbiAgICBncm91cHMubWFwKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCl7Z3JvdXBwZWRbdmFsdWVdID0gW119KVxuICB9XG5cbiAgdmFyIGdyb3VwcGVkID0ge307XG4gIGFycmF5Lm1hcChmdW5jdGlvbihlbGVtZW50LCBpbmRleCl7Z3JvdXBwZWRbZWxlbWVudFtieV1dLnB1c2goZWxlbWVudCl9KTtcbiAgcmV0dXJuIGdyb3VwcGVkXG59XG5cbi8qKlxuKiBUZXN0cyBpZiB0d28gYXJyYXlzIGFyZSBlcXVpdmFsZW50XG4qIEBwYXJhbSB7QXJyYXl9IGFycmF5XG4qIEBwYXJhbSB7QXJyYXl9IG90aGVyXG4qIEByZXR1cm5zIHtib29sZWFufSBpZiBldmVyeSBlbGVtZW50IG9mIGFycmF5IG1hdGNoZXMgdGhhdCBvZiBvdGhlclxuKi9cbmV4cG9ydCBmdW5jdGlvbiBhcnJheUVxdWFscyhhcnJheSwgb3RoZXIpIHtcbiAgaWYgKCFvdGhlcilcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgLy8gY29tcGFyZSBsZW5ndGhzIC0gY2FuIHNhdmUgYSBsb3Qgb2YgdGltZVxuICBpZiAoYXJyYXkubGVuZ3RoICE9IG90aGVyLmxlbmd0aClcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICBmb3IgKHZhciBpID0gMCwgbD1hcnJheS5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgbmVzdGVkIGFycmF5c1xuICAgICAgaWYgKGFycmF5W2ldIGluc3RhbmNlb2YgQXJyYXkgJiYgb3RoZXJbaV0gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgIC8vIHJlY3Vyc2UgaW50byB0aGUgbmVzdGVkIGFycmF5c1xuICAgICAgICAgIGlmICghYXJyYXlFcXVhbHMoYXJyYXlbaV0sb3RoZXJbaV0pKVxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChhcnJheVtpXSAhPSBvdGhlcltpXSkge1xuICAgICAgICAgIC8vIFdhcm5pbmcgLSB0d28gZGlmZmVyZW50IG9iamVjdCBpbnN0YW5jZXMgd2lsbCBuZXZlciBiZSBlcXVhbDoge3g6MjB9ICE9IHt4OjIwfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuXG5cbi8qKlxuKiBSZWN1cnNpdmVseSB0YWxsaWVzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgYXQgZWFjaCBsZXZlbCBvZiB0aGUgcGFzc2VkLCBwdXRhdGl2ZWx5IG5lc3RlZCBhcnJheVxuKiBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiBpdGVtcyB3aGljaCBtYXkgaW5jbHVkZSBuZXN0ZWQgYXJyYXlzXG4qIEBwYXJhbSB7bnVtYmVyfSBbbGV2ZWw9MF0gY3VycmVudCBkZXB0aCBpbiB0aGUgcmVjdXJzaW9uXG4qIEBwYXJhbSB7QXJyYXl9IFtsZXZlbERhdGE9W11dIGtlZXBzIHRyYWNrIG9mIGl0ZW1zIHNlZW4gc28gZmFyIGF0IGVhY2ggZGVwdGhcbiogQHJldHVybnMge0FycmF5fSBzdGF0aW5nIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgKGFycmF5IGluY2x1c2l2ZSkgZm91bmQgYXQgZWFjaCBsZXZlbCBvZiB0aGUgYXJyYXlcbiovXG5leHBvcnQgZnVuY3Rpb24gZWxlbWVudHNBdExldmVscyhhcnJheSwgbGV2ZWwsIGxldmVsRGF0YSkge1xuICBsZXZlbCA9IGxldmVsID09IHVuZGVmaW5lZCA/IDAgOiBsZXZlbCArIDE7XG4gIGxldmVsRGF0YSA9IGxldmVsRGF0YSA9PSB1bmRlZmluZWQgPyBbXSA6IGxldmVsRGF0YTtcbiAgaWYgKCBsZXZlbCA+PSBsZXZlbERhdGEubGVuZ3RoICkgeyBsZXZlbERhdGEucHVzaChhcnJheS5sZW5ndGgpfSBlbHNlIHtsZXZlbERhdGFbbGV2ZWxdICs9IGFycmF5Lmxlbmd0aCB9XG4gIGFycmF5Lm1hcChmdW5jdGlvbihlLCBpKSB7aWYgKEFycmF5LmlzQXJyYXkoZSkpeyBlbGVtZW50c0F0TGV2ZWxzKGUsIGxldmVsLCBsZXZlbERhdGEpIH19KVxuICByZXR1cm4gbGV2ZWxEYXRhXG59XG5cblxuLyoqXG4qIFJlY3Vyc2l2ZWx5IHRhbGxpZXMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBvZiB0aGUgcGFzc2VkLCBwdXRhdGl2ZWx5IG5lc3RlZCBhcnJheVxuKiBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiBpdGVtcyB3aGljaCBtYXkgaW5jbHVkZSBuZXN0ZWQgYXJyYXlzXG4qIEBwYXJhbSB7bnVtYmVyfSBbZWxlbWVudHM9MF0gY3VycmVudCBudW1iZXIgb2YgZWxlbWVudHMgc2VlbiBzbyBmYXJcbiogQHJldHVybnMge251bWJlcn0gbnVtYmVyIG9mIGVsZW1lbnRzIChhcnJheSBpbmNsdXNpdmUpIGZvdW5kIGluIHBhc3NlZCBhcnJheVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJPZkVsZW1lbnRzKCBhcnJheSwgZWxlbWVudHMgKSB7XG4gIGVsZW1lbnRzID0gZWxlbWVudHMgPT0gdW5kZWZpbmVkID8gMCA6IGVsZW1lbnRzO1xuICBhcnJheS5tYXAoZnVuY3Rpb24oZSwgaSkge1xuICAgIGlmICggQXJyYXkuaXNBcnJheShlKSApIHsgZWxlbWVudHMgPSBudW1iZXJPZkVsZW1lbnRzKGUsIGVsZW1lbnRzKSB9XG4gICAgZWxzZSB7IGVsZW1lbnRzICs9IDEgfVxuICB9KVxuICByZXR1cm4gZWxlbWVudHNcbn1cblxuLyoqXG4qIENvbmNhdHMgYWxsIG5lc3RlZCBhcnJheXMgaW4gcGFzc2VkIGFycmF5IHRvIGZvcm0gYSBzaW5nbGUgYXJyYXlcbiogQHBhcmFtIHtBcnJheX0gYXJyYXkgb2YgcHV0YXRpdmVseSBuZXN0ZWQgYXJyYXlzXG4qIEBwYXJhbSB7QXJyYXl9IFtmbGF0PVtdXSBjdXJyZW50IGZsYXR0ZW5lZCBhcnJheVxuKiBAcmV0dXJucyB7QXJyYXl9IHdpdGggZXZlcnkgZWxlbWVudCBpbiB0aGUgc2FtZSBsZXZlbFxuKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuKCBhcnJheSwgZmxhdCApIHtcbiAgZmxhdCA9IGZsYXQgPT0gdW5kZWZpbmVkID8gW10gOiBmbGF0O1xuICBhcnJheS5tYXAoZnVuY3Rpb24oZSwgaSl7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpIHtmbGF0ID0gZmxhdC5jb25jYXQoZmxhdHRlbihlKSl9XG4gICAgZWxzZSB7ZmxhdC5wdXNoKGUpfVxuICB9KVxuICByZXR1cm4gZmxhdDtcbn1cblxuLyoqXG4qIFNlYXJjaCBvZiBsaXN0IG9mIGxpc3RzIHRvIGZpbmQgd2hpY2ggLSBpZiBhbnkgLSBwYXNzZWQgdmFsdWUgaXMgaW5cbiogQHBhcmFtIHtBcnJheVtdfSBiaW5zIGxpc3Qgb2YgbGlzdHMgb2YgdmFsdWVzXG4qIEBwYXJhbSB7Kn0gdmFsdWUgaXRlbSB0byB0ZXN0IGlmIGluIGFueSBvZiB0aGUgYmluc1xuKiBAcmV0dXJucyB7bnVtYmVyfSBpbmRpY2F0aW5nIHRoZSBpbmRleCBvZiB0aGUgYmluIGluIHdoaWNoIHZhbHVlIHdhcyBmb3VuZFxuKi9cbmV4cG9ydCBmdW5jdGlvbiB3aGljaEJpbihiaW5zLCB2YWx1ZSkge1xuICB2YXIgaSA9IC0xXG4gIGZvciAodmFyIGogPSAwOyBqIDwgYmlucy5sZW5ndGg7IGorKykgeyBpZiAoaGFzUShiaW5zW2pdLHZhbHVlKSkge3JldHVybiBqfSB9XG4gIHJldHVybiBpXG59XG4iLCJpbXBvcnQge2h5cGVuYXRlLCBzYWZlU2VsZWN0fSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHt0b3RhbH0gZnJvbSAnLi9hcnJheS1mdW5jdGlvbnMnO1xuXG5cbi8qKlxuICogY2FsbHMgY29uc29sZS5ncm91cCBpZiBkM3NtLmRlYnVnUSA9PSB0cnVlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBvZiB0aGUgZ3JvdXBcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zb2xlR3JvdXAobmFtZSkge1xuICBpZiAod2luZG93LmQzc20uZGVidWdRID09PSB0cnVlKXtcbiAgICBjb25zb2xlLmdyb3VwKG5hbWUpXG4gIH1cbn1cblxuLyoqXG4gKiBjYWxscyBjb25zb2xlLmdyb3VwRW5kIGlmIGQzc20uZGVidWdRID09IHRydWVcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zb2xlR3JvdXBFbmQoKSB7XG4gIGlmICh3aW5kb3cuZDNzbS5kZWJ1Z1EgPT09IHRydWUpe1xuICAgIGNvbnNvbGUuZ3JvdXBFbmQoKVxuICB9XG59XG5cbi8qKlxuICogQ2FsbHMgY29uc29sZS5sb2cgaWYgZDNzbS5kZWJ1Z1EgPT0gdHJ1ZVxuICogQHBhcmFtIHtzdHJpbmd9IGZ1bmMgbmFtZSBvZiB0aGUgZnVuY3Rpb24gbG9nZ2luZ1xuICogQHBhcmFtIHtzdHJpbmd9IG1zZyB0byBsb2dcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIHRvIGJlIGxvZ2dlZCBhbG9uZyBzaWRlIHRoZSBtZXNzYWdlXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nKGZ1bmMsIG1zZywgZGF0YSkge1xuICBpZiAod2luZG93LmQzc20uZGVidWdRID09PSB0cnVlKXtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGAlY1tkM3NtOjoke2Z1bmN9XTpcXHQke21zZ31gLFxuICAgICAgW1xuICAgICAgICAnYmFja2dyb3VuZDogIzZjZDFlZicsXG4gICAgICAgICdib3JkZXItcmFkaXVzOiA1MDAwcHgnLFxuICAgICAgICAncGFkZGluZzogMHB4IDJweCcsXG4gICAgICAgICdmb250LXNpemU6IDE0cHgnXG4gICAgICBdLmpvaW4oJzsnKVxuICAgIClcbiAgICBjb25zb2xlLnRhYmxlKGRhdGEpXG4gICAgLy8gY29uc29sZS50cmFjZSgpXG4gIH1cbn1cblxuLyoqXG4gKiBDYWxscyBjb25zb2xlLndhcm4gaWYgZDNzbS5kZWJ1Z1EgPT0gdHJ1ZVxuICogQHBhcmFtIHtzdHJpbmd9IGZ1bmMgbmFtZSBvZiB0aGUgZnVuY3Rpb24gd2FybmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IG1zZyB0byBkaXNwbGF5XG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YSB0byBiZSBkaXNwbGF5ZWQgYWxvbmcgc2lkZSB0aGUgbWVzc2FnZVxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhcm4oZnVuYywgbXNnLCBkYXRhKSB7XG4gIGlmICh3aW5kb3cuZDNzbS5kZWJ1Z1EgPT09IHRydWUpXG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYCVjW2Qzc206OiR7ZnVuY31dOlxcdCR7bXNnfWAsXG4gICAgICBbXG4gICAgICAgICdiYWNrZ3JvdW5kOiAjZmZkNTNlJyxcbiAgICAgICAgJ2JvcmRlci1yYWRpdXM6IDUwMDBweCcsXG4gICAgICAgICdwYWRkaW5nOiAwcHggMnB4JyxcbiAgICAgICAgJ2ZvbnQtc2l6ZTogMTRweCdcbiAgICAgIF0uam9pbignOycpXG4gICAgKVxuICAgIGNvbnNvbGUudGFibGUoZGF0YSlcbn1cbi8qKlxuICogQ2FsbHMgdGhlIGNvbnNvbGUuaW5mbyBpZiBkM3NtLmRlYnVnUSA9PSB0cnVlXG4gKiBAcGFyYW0ge3N0cmluZ30gZnVuYyBuYW1lIG9mIHRoZSBmdW5jdGlvbiBwcm92aWRpbmcgaW5mb1xuICogQHBhcmFtIHtzdHJpbmd9IG1zZyB0byBkaXNwbGF5XG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YSB0byBiZSBkaXNwbGF5ZWQgYWxvbmcgc2lkZSB0aGUgbWVzc2FnZVxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluZm8oZnVuYywgbXNnLCBkYXRhKSB7XG4gIGlmICh3aW5kb3cuZDNzbS5kZWJ1Z1EpXG4gICAgY29uc29sZS5pbmZvKFxuICAgICAgYCVjW2Qzc206OiR7ZnVuY31dOlxcdCR7bXNnfWAsXG4gICAgICBbXG4gICAgICAgICdiYWNrZ3JvdW5kOiAjMDA5Y2NkJyxcbiAgICAgICAgJ2JvcmRlci1yYWRpdXM6IDUwMDBweCcsXG4gICAgICAgICdwYWRkaW5nOiAwcHggMnB4JyxcbiAgICAgICAgJ2ZvbnQtc2l6ZTogMTRweCdcbiAgICAgIF0uam9pbignOycpXG4gICAgKVxuICAgIGNvbnNvbGUudGFibGUoZGF0YSlcbn1cblxuXG4vKipcbiAqIENhbGxzIGNvbnNvbGUuZXJyb3IgaWYgZDNzbS5kZWJ1Z1EgPT0gdHJ1ZVxuICogQHBhcmFtIHtzdHJpbmd9IGZ1bmMgbmFtZSBvZiB0aGUgZnVuY3Rpb24gd2hpY2ggc2VuZHMgdGhlIGVycm9yXG4gKiBAcGFyYW0ge3N0cmluZ30gbXNnIHRvIGRpc3BsYXlcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIHRvIGJlIGRpc3BsYXllZCBhbG9uZyBzaWRlIHRoZSBtZXNzYWdlXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJyb3IoZnVuYywgbXNnLCBkYXRhKSB7XG4gIGlmICh3aW5kb3cuZDNzbS5kZWJ1Z1EpXG4gICAgY29uc29sZS5lcnJvcihgW2Qzc206OiR7ZnVuY31dOlxcdCR7bXNnfVxcdCVvYCxkYXRhKVxufVxuXG5cblxuXG5cbi8qKlxuKiBGdW5jdGlvbiBmb3Igc2V0dGluZyB1cCBjb250YWluZXJzIGZvciBtb3N0IHBsb3RzIHdpdGggdGhlIHkgYXhpcyBjb250YWluZXJcbiogcG9zaXRpb25lZCBvbiB0aGUgbGVmdCBhbmQgdGhlIHggYXhpcyBjb250YWluZXIgcG9zaXRpb25lZCBvbiB0aGUgYm90dG9tXG4qIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBzZWxlY3Rpb24gc2VsZWN0aW9uIG9mIGNvbnRhaW5lciBpbiB3aGljaCB0aGUgc3ZnIGlzIG9yIHNob3VsZCBiZSBtYWRlXG4qIEBwYXJhbSB7c3RyaW5nfSBuYW1lc3BhY2UgbmFtZXNwYWNlIG9mIHRoZSBjaGFydFxuKiBAcGFyYW0ge09iamVjdH0gW3NwYWNlPXt3OndpbmRvdy5pbm5lcldpZHRoLCBoOndpbmRvdy5pbm5lckhlaWdodH1dIHRoZSB3aWR0aCAodykgYW5kIGhlaWdodCAoaCkgYXZhaWxibGVcbiogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZS53PXdpbmRvdy5pbm5lcldpZHRoXSB0aGUgYXZhaWxhYmxlIHdpZHRoIGluIHdoaWNoIHRvIHJlbmRlciB0aGUgY2hhcnRcbiogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZS5oPXdpbmRvdy5pbm5lckhlaWdodF0gdGhlIGF2YWlsYWJsZSBoZWlnaHQgaW4gd2hpY2ggdG8gcmVuZGVyIHRoZSBjaGFydFxuXG4qIEBwYXJhbSB7T2JqZWN0fSBbbWFyZ2lucz17dG9wOiAwLjAxLCBib3R0b206IDAuMDEsIGxlZnQ6IDAuMDEsIHJpZ2h0OiAwLjAxfV0gdGhlIG1hcmdpbnMgZm9yIHRoZSBjaGFydFxuKiBAcGFyYW0ge251bWJlcn0gW21hcmdpbnMudG9wPTAuMDFdIHRoZSB0b3AgbWFyZ2luIG9mIHRoZSBjaGFydFxuKiBAcGFyYW0ge251bWJlcn0gW21hcmdpbnMuYm90dG9tPTAuMDFdIHRoZSBib3R0b20gbWFyZ2luIG9mIHRoZSBjaGFydFxuKiBAcGFyYW0ge251bWJlcn0gW21hcmdpbnMubGVmdD0wLjAxXSB0aGUgbGVmdCBtYXJnaW4gb2YgdGhlIGNoYXJ0XG4qIEBwYXJhbSB7bnVtYmVyfSBbbWFyZ2lucy5yaWdodD0wLjAxXSB0aGUgcmlnaHQgbWFyZ2luIG9mIHRoZSBjaGFydFxuXG5cbiogQHBhcmFtIHtPYmplY3R9IFtwZXJjZW50YWdlcyA9IHtheGVzOnt4OjAuMSx5OjAuMX0sc3BhY2U6e3c6MC44LGg6MC42fX1dIHBlcmNlbnRhZ2VzIG9mIHRoZSBwYXJhbWF0ZXIgc3BhY2Ugb2Ygd2hpY2ggdG8gbWFrZSB0aGUgeCBhbmQgeSBheGVzIGFzIHdlbGwgYXMgdGhlIHBlcmNlbnQgb2YgdGhlIGF2YWlsYmxlIHNwYWNlIGluIHdoaWNoIHRvIHJlbmRlciB0aGUgcGxvdFxuKiBAcGFyYW0ge09iamVjdH0gW3BlcmNlbnRhZ2VzLmF4ZXM9e3g6MC4xLHk6MC4xfV0gdGhlIHBlcmNlbnRhZ2VzIG9mIHRoZSBwYXJhbWF0ZXIgc3BhY2UsIG9mIHdoaWNoIHRoZSB4IGFuZCB5IGF4ZXMgd2lsbCB0YWtlIHVwXG4qIEBwYXJhbSB7bnVtYmVyfSBbcGVyY2VudGFnZXMuYXhlcy54QXhpc1BlcmNlbnQ9MC4xXSB0aGUgcGVyY2VudGFnZXMgb2YgdGhlIHBhcmFtYXRlciBzcGFjZSwgb2Ygd2hpY2ggdGhlIHggYXhpcyB3aWxsIHRha2UgdXBcbiogQHBhcmFtIHtudW1iZXJ9IFtwZXJjZW50YWdlcy5heGVzLnlBeGlzUGVyY2VudD0wLjFdIHRoZSBwZXJjZW50YWdlcyBvZiB0aGUgcGFyYW1hdGVyIHNwYWNlLCBvZiB3aGljaCB0aGUgeSBheGlzIHdpbGwgdGFrZSB1cFxuXG4qIEBwYXJhbSB7T2JqZWN0fSBbcGVyY2VudGFnZXMuc3BhY2U9e3c6MC44LGg6MC42fV0gdGhlIHBlcmNlbnRhZ2VzIG9mIHRoZSBwYXJhbWF0ZXIgc3BhY2UsIG9mIHdoaWNoIHRoZSBTVkcncyB3aWR0aCBhbmQgaGVpZ2h0IHdpbGwgYmUgc2V0XG4qIEBwYXJhbSB7bnVtYmVyfSBbcGVyY2VudGFnZXMuc3BhY2UucGVyY2VudE9mU3BhY2VGb3JXaWR0aD0wLjFdIHRoZSBwZXJjZW50YWdlcyBvZiB0aGUgcGFyYW1hdGVyIHNwYWNlLCBvZiB3aGljaCB0aGUgU1ZHJ3Mgd2lkdGggd2lsbCBiZSBzZXRcbiogQHBhcmFtIHtudW1iZXJ9IFtwZXJjZW50YWdlcy5zcGFjZS5wZXJjZW50T2ZTcGFjZUZvckhlaWdodD0wLjFdIHRoZSBwZXJjZW50YWdlcyBvZiB0aGUgcGFyYW1hdGVyIHNwYWNlLCBvZiB3aGljaCB0aGUgU1ZHJ3MgaGVpZ2h0IHdpbGwgYmUgc2V0XG5cbiogQHJldHVybnMge09iamVjdH0gcmV0dXJucyB0aGUgc2VsZWN0aW9uIGFuZCBcImJvdW5kaW5nUmVjdHNcIiBvZiB0aGUgcGxvdCBjb250YWluZXIsIHgtYXhpcyBjb250YWluZXIgYW5kIHktYXhpcyBjb250YWluZXJcbiogYXNcbipcbioge1xuKlxuKiAgIHBsb3Q6IHtzZWxlY3Rpb246IHBsb3RTZWxlY3Rpb24sIHJlY3Q6IHBsb3RSZWN0fSxcbipcbiogICB4QXhpczp7c2VsZWN0aW9uOnhBeGlzU2VsZWN0aW9uLCByZWN0OnhBeGlzUmVjdH0sXG4qXG4qICAgeUF4aXM6IHtzZWxlY3Rpb246eUF4aXNTZWxlY3Rpb24sIHJlY3Q6eUF4aXNSZWN0fVxuKlxuKiB9XG4qXG4qIHdoZXJlIGVhY2ggcmVjdCBoYXMgZm9ybTpcbipcbioge3g6ICMsIHk6ICMsIGg6ICMsIHc6ICN9XG4qXG4qIGRlcGljdGluZyB0aGUgc3RhcnRpbmcgeCBhbmQgeSBjb29yZGluYXRlIG9mIHRoZSBjb3Jlc3BvbmRpbmcgY29udGFpbmVyIChhbHNvIHRoZWlyIGRlZmF1bHQgdHJhbnNmb3JtIHZhbHVlcykgYXMgd2VsbCB0aGVpciBoZWlnaHQgKGgpIGFucyB3aWR0aCAodylcbiovXG4vLyBleHBvcnQgZnVuY3Rpb24gc2V0dXBTdGFuZGFyZENoYXJ0Q29udGFpbmVycyggc2VsZWN0aW9uLCBuYW1lc3BhY2UsIHNwYWNlLCBtYXJnaW5zLCBwZXJjZW50YWdlcykge1xuZXhwb3J0IGZ1bmN0aW9uIHNldHVwU3RhbmRhcmRDaGFydENvbnRhaW5lcnMoXG4gIHNlbGVjdGlvbixcbiAgbmFtZXNwYWNlLFxuICBzcGFjZT17dzphdmFpbGFibGVXaWR0aD13aW5kb3cuaW5uZXJXaWR0aCwgaDphdmFpbGFibGVIZWlnaHQ9d2luZG93LmlubmVySGVpZ2h0fSxcbiAgbWFyZ2lucz17dG9wOjAuMDEsIGJvdHRvbTowLjAxLCBsZWZ0OjAuMDEsIHJpZ2h0OjAuMDF9LFxuICBwZXJjZW50YWdlcz17YXhlczoge3g6IHhBeGlzUGVyY2VudD0wLjEsIHk6IHlBeGlzUGVyY2VudD0wLjF9LCBzcGFjZToge3c6IHBlcmNlbnRPZlNwYWNlRm9yV2lkdGgsIGg6IHBlcmNlbnRPZlNwYWNlRm9ySGVpZ2h0fX1cbikge1xuICBpZiAoc3BhY2UgPT0gdW5kZWZpbmVkKSB7IHNwYWNlID0ge3c6IHdpbmRvdy5pbm5lcldpZHRoLCBoOiB3aW5kb3cuaW5uZXJIZWlnaHR9IH1cbiAgaWYgKG1hcmdpbnMgPT0gdW5kZWZpbmVkKSB7IG1hcmdpbnMgPSB7dG9wOiAwLjAxLCBib3R0b206IDAuMDEsIGxlZnQ6IDAuMDEsIHJpZ2h0OiAwLjAxfSB9XG4gIGlmIChwZXJjZW50YWdlcyA9PSB1bmRlZmluZWQpIHsgcGVyY2VudGFnZXMgPSB7fTsgfVxuICBpZiAocGVyY2VudGFnZXMuYXhlcyA9PSB1bmRlZmluZWQpIHsgcGVyY2VudGFnZXMuYXhlcyA9IHsgeDowLjEsIHk6MC4xIH0gfVxuICBpZiAocGVyY2VudGFnZXMuc3BhY2UgPT0gdW5kZWZpbmVkKSB7IHBlcmNlbnRhZ2VzLnNwYWNlID0geyB3OiAwLjgsIGg6IDAuNiB9IH1cblxuICAvLyBTVkcgd2lkdGggYW5kIGhlaWdodFxuICB2YXIgc3ZnU3BhY2UgPSAge1xuICAgIHc6IHNwYWNlLncgKiBwZXJjZW50YWdlcy5zcGFjZS53LFxuICAgIGg6IHNwYWNlLmggKiBwZXJjZW50YWdlcy5zcGFjZS5oXG4gIH0sXG5cbiAgLy8gU3BhY2UgYWZ0ZXIgcmVtb3ZpbmcgbWFyZ2luc1xuICBjaGFydFNwYWNlID0ge1xuICAgIHc6IHN2Z1NwYWNlLncgLSAobWFyZ2lucy5sZWZ0ICogc3BhY2UudykgLSAobWFyZ2lucy5yaWdodCAqIHNwYWNlLncpLFxuICAgIGg6IHN2Z1NwYWNlLmggLSAobWFyZ2lucy50b3AgKiBzcGFjZS5oKSAtIChtYXJnaW5zLmJvdHRvbSAqIHNwYWNlLmgpXG4gIH0sXG5cbiAgLy8gbWFpbiBkaW1lbnNpb24gb2YgeCBhbmQgeSBheGllc1xuICAvLyBlLmcuIGRlZmluZXMgaG93IHRhbGwgeCBheGlzIGlzIGFzIGxlbmd0aCBpcyBkZXRlcm1pbmVkIGJ5IHBsb3RSZWN0LndcbiAgYXhlc1NwYWNlID0ge1xuICAgIHg6IGNoYXJ0U3BhY2UuaCAqIHBlcmNlbnRhZ2VzLmF4ZXMueCxcbiAgICB5OiBjaGFydFNwYWNlLncgKiBwZXJjZW50YWdlcy5heGVzLnlcbiAgfSxcblxuICAvLyBzcGFjZSBsZWZ0IGZvciBkcmF3aW5nIHRoZSBjaGFydCBwcm9wZXJseSAoZS5nLiBiYXJzLCB2aW9saW5zLCBldGMpXG4gIGRyYXdpbmdTcGFjZSA9IHtcbiAgICB4OiBjaGFydFNwYWNlLncgLSBheGVzU3BhY2UueSxcbiAgICB5OiBjaGFydFNwYWNlLmggLSBheGVzU3BhY2UueFxuICB9LFxuXG5cbiAgeUF4aXNSZWN0ID0ge1xuICAgIHg6IGF4ZXNTcGFjZS55ICsgKG1hcmdpbnMubGVmdCAqIHNwYWNlLncpLFxuICAgIHk6IChtYXJnaW5zLnRvcCAqIHNwYWNlLmgpLFxuICAgIHc6IGF4ZXNTcGFjZS55LFxuICAgIGg6IGRyYXdpbmdTcGFjZS55XG4gIH0sXG5cbiAgcGxvdFJlY3QgPSB7XG4gICAgeDogYXhlc1NwYWNlLnkgKyAobWFyZ2lucy5sZWZ0ICogc3BhY2UudyksXG4gICAgeTogKG1hcmdpbnMudG9wICogc3BhY2UuaCksXG4gICAgdzogZHJhd2luZ1NwYWNlLngsXG4gICAgaDogZHJhd2luZ1NwYWNlLnlcbiAgfSxcblxuICB4QXhpc1JlY3QgPSB7XG4gICAgeDogYXhlc1NwYWNlLnkgKyAobWFyZ2lucy5sZWZ0ICogc3BhY2UudyksXG4gICAgeTogKG1hcmdpbnMudG9wICogc3BhY2UuaCArIHBsb3RSZWN0LmgpLFxuICAgIHc6IGRyYXdpbmdTcGFjZS54LFxuICAgIGg6IGF4ZXNTcGFjZS54XG4gIH1cblxuXG4gIHZhciBjb250YWluZXIgPSBzYWZlU2VsZWN0KHNlbGVjdGlvbiwgJ3N2ZycsIG5hbWVzcGFjZSlcbiAgICAuc3R5bGUoJ3dpZHRoJywgc3ZnU3BhY2UudysncHgnKVxuICAgIC5zdHlsZSgnaGVpZ2h0Jywgc3ZnU3BhY2UuaCsncHgnKVxuXG4gIHZhciBheGVzID0gc2FmZVNlbGVjdChjb250YWluZXIsICdnJywgaHlwZW5hdGUobmFtZXNwYWNlLCAnYXhlcycpKVxuXG4gIC8vIC5hdHRyKCd0cmFuc2Zvcm0nLCBcInRyYW5zbGF0ZShcIitwbG90UmVjdC54K1wiLFwiK3Bsb3RSZWN0LnkrXCIpXCIpLFxuXG4gIHZhciBwbG90ID0gc2FmZVNlbGVjdChjb250YWluZXIsICdnJywgaHlwZW5hdGUobmFtZXNwYWNlLCAncGxvdCcpKVxuICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBcInRyYW5zbGF0ZShcIitwbG90UmVjdC54K1wiLFwiK3Bsb3RSZWN0LnkrXCIpXCIpXG5cbiAgdmFyIHhBeGlzID0gc2FmZVNlbGVjdChheGVzLCAnZycsIGh5cGVuYXRlKG5hbWVzcGFjZSwgJ3gtYXhpcycpKVxuICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBcInRyYW5zbGF0ZShcIit4QXhpc1JlY3QueCtcIixcIit4QXhpc1JlY3QueStcIilcIilcblxuICB2YXIgeUF4aXMgPSBzYWZlU2VsZWN0KGF4ZXMsICdnJywgaHlwZW5hdGUobmFtZXNwYWNlLCAneS1heGlzJykpXG4gICAgLmF0dHIoJ3RyYW5zZm9ybScsIFwidHJhbnNsYXRlKFwiK3lBeGlzUmVjdC54K1wiLFwiK3lBeGlzUmVjdC55K1wiKVwiKVxuXG4gIHJldHVybiB7XG4gICAgc3ZnOiB7XG4gICAgICBzZWxlY3Rpb246IGNvbnRhaW5lcixcbiAgICAgIHJlY3Q6IHN2Z1NwYWNlXG4gICAgfSxcbiAgICBwbG90OiB7XG4gICAgICBzZWxlY3Rpb246IHBsb3QsXG4gICAgICByZWN0OiBwbG90UmVjdFxuICAgIH0sXG4gICAgeEF4aXM6IHtcbiAgICAgIHNlbGVjdGlvbjogeEF4aXMsXG4gICAgICByZWN0OiB4QXhpc1JlY3RcbiAgICB9LFxuICAgIHlBeGlzOiB7XG4gICAgICBzZWxlY3Rpb246IHlBeGlzLFxuICAgICAgcmVjdDogeUF4aXNSZWN0XG4gICAgfVxuICB9XG5cbiAgLy8gcmV0dXJuIFtwbG90LCB4QXhpcywgeUF4aXNdXG59XG5cblxuXG4vKipcbiogQWRkcyBhIGNsaXAtcGF0aCByZWN0IGFuZCBiaW5kcyBpdCB0byBjb250YWluZXJcbiogQHBhcmFtIHtkMy5zZWxlY3Rpb259IGNvbnRhaW5lciBpbiB3aGljaCB0byBhZGQgdGhlIGNsaXAtcGF0aCBhbmQgdG8gd2hpY2ggdG8gYmluZCB0aGUgY2xpcGluZyBwYXRoIHRvXG4qIEBwYXJhbSB7T2JqZWN0fSByZWN0IHRoZSBjb29yZGluYXRlcyAoeCwgeSwgd2lkdGgsIGhlaWdodCkgb2YgdGhlIGNsaXAtcGF0aFxuKiBAcGFyYW0ge3N0cmluZ30gbmFtZXNwYWNlXG4qIEByZXR1cm5zIHtkMy5zZWxlY3Rpb259IG9mIHRoZSBjbGlwLXBhdGggcmVjdFxuKi9cbmV4cG9ydCBmdW5jdGlvbiBjcFJlY3QoY29udGFpbmVyLCByZWN0LCBuYW1lc3BhY2UpIHtcbiAgdmFyIGRlZnMgPSBzYWZlU2VsZWN0KGNvbnRhaW5lciwgJ2RlZnMnLCBoeXBlbmF0ZShuYW1lc3BhY2UsICdkZWZpbml0aW9ucycpKVxuICB2YXIgY3AgPSBzYWZlU2VsZWN0KGRlZnMsICdjbGlwUGF0aCcsIGh5cGVuYXRlKG5hbWVzcGFjZSwgJ2NsaXAtcGF0aCcpKVxuICAuYXR0cignaWQnLCBoeXBlbmF0ZShuYW1lc3BhY2UsICdjbGlwLXBhdGgnKSlcblxuICB2YXIgY3BSZWN0ID0gc2FmZVNlbGVjdChjcCwgJ3JlY3QnKVxuICAuYXR0cigneCcsIHJlY3QueClcbiAgLmF0dHIoJ3knLCByZWN0LnkpXG4gIC5hdHRyKCd3aWR0aCcsIHJlY3Qud2lkdGgpXG4gIC5hdHRyKCdoZWlnaHQnLCByZWN0LmhlaWdodClcblxuICBkZWZzLnJhaXNlKClcbiAgLy8gc2V0IGNsaXBwaW5nIHBhdGggdG8gY29udGFpbmVyXG4gIGNvbnRhaW5lci5hdHRyKCdjbGlwLXBhdGgnLCAndXJsKCMnKyBoeXBlbmF0ZShuYW1lc3BhY2UsICdjbGlwLXBhdGgnKSsnKScpXG5cbiAgcmV0dXJuIGNwUmVjdFxufVxuXG5cbi8qKlxuKiBBZGRzIGEgYmFja2dyb3VuZCByZWN0IHQgdG8gY29udGFpbmVyXG4qIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBjb250YWluZXIgaW4gd2hpY2ggdG8gYWRkIHRoZSBiYWNrZ3JvdW5kIHJlY3RhbmdsZVxuKiBAcGFyYW0ge09iamVjdH0gcmVjdCB0aGUgY29vcmRpbmF0ZXMgKHgsIHksIHdpZHRoLCBoZWlnaHQpIG9mIHRoZSBiYWNrZ3JvdW5kXG4qIEBwYXJhbSB7c3RyaW5nfSBmaWxsIHRoZSBjb2xvciBvZiB0aGUgYmFja2dyb3VuZFxuKiBAcmV0dXJucyB7ZDMuc2VsZWN0aW9ufSBvZiB0aGUgYmFja2dyb3VuZCBmaWxsXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGJnUmVjdChjb250YWluZXIsIHJlY3QsIGZpbGwpIHtcbiAgcmV0dXJuIHNhZmVTZWxlY3QoY29udGFpbmVyLCAncmVjdCcsICdiZycpXG4gIC5hdHRyKCd4JywgcmVjdC54KVxuICAuYXR0cigneScsIHJlY3QueSlcbiAgLmF0dHIoJ3dpZHRoJywgcmVjdC53aWR0aClcbiAgLmF0dHIoJ2hlaWdodCcsIHJlY3QuaGVpZ2h0KVxuICAuYXR0cignZmlsbCcsIGZpbGwpXG59XG5cblxuLyoqXG4qIFNldHMgdXAgdGhlIGNvbnRhaW5lciBmb3IgbWFraW5nIGNoYXJ0IGVsZW1lbnRzLiBUaGlzIGluY2x1ZGVzIG1ha2luZ1xuKiBhIGNsaXAtcGF0aCByZWN0IGJvdW5kIHRvIHRoZSBwYXNzZWQgY29udGFpbmVyLCBhIGJhY2tncm91bmQgcmVjdCwgYW5kXG4qIGEgZyBlbGVtZW50IHdpdGggY2xhc3MgPG5hbWVzcGFjZT4tb2JqZWN0LWNvbnRhaW5lci5cbiogQHBhcmFtIHtkMy5zZWxlY3Rpb259IGNvbnRhaW5lciBpbiB3aGljaCB0byBhZGQgdGhlIGNsaXAtcGF0aCBhbmQgYmFja2dyb3VuZFxuKiBAcGFyYW0ge3N0cmluZ30gbmFtZXNwYWNlXG4qIEBwYXJhbSB7T2JqZWN0fSByZWN0IHRoZSBjb29yZGluYXRlcyAoeCwgeSwgd2lkdGgsIGhlaWdodCkgb2YgdGhlIGJhY2tncm91bmQgYW5kIGNsaXAtcGF0aFxuKiBAcGFyYW0ge3N0cmluZ30gZmlsbCB0aGUgY29sb3Igb2YgdGhlIGJhY2tncm91bmRcbiogQHJldHVybnMge2QzLnNlbGVjdGlvbn0gb2YgZy48bmFtZXNwYWNlPi1vYmplY3QtY29udGFpbmVyXG4qXG4qIEBzZWV7QGxpbmsgYmdSZWN0fVxuKiBAc2Vle0BsaW5rIGNwUmVjdH1cbiovXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBDb250YWluZXIoc2VsZWN0aW9uLCBuYW1lc3BhY2UsIHJlY3QsIGZpbGwpIHtcbiAgLy8gdGhlIGNvbnRhaW5lciBmb3IgdGhyZWUgbWFpbiBpdGVtcywgYmcsIGRlZnMsIGFuZCBvYmplY3QtY29udGFpbmVyXG4gIHZhclxuICBjb250YWluZXIgPSBzYWZlU2VsZWN0KHNlbGVjdGlvbiwgJ2cnLCBuYW1lc3BhY2UpLFxuICBiZyA9IGJnUmVjdChjb250YWluZXIsIHJlY3QsIGZpbGwpLFxuICBjcCA9IGNwUmVjdChjb250YWluZXIsIHJlY3QsIG5hbWVzcGFjZSksXG4gIG9iamVjdENvbnRhaW5lciA9IHNhZmVTZWxlY3QoY29udGFpbmVyLCAnZycsIGh5cGVuYXRlKG5hbWVzcGFjZSwgJ29iamVjdC1jb250YWluZXInKSlcbiAgcmV0dXJuIG9iamVjdENvbnRhaW5lclxufVxuXG5cbi8qKlxuKiBkZXRlcm1pbmVzIHRoZSB3aWR0aCBvZiBhbiBvYmplY3QgZm9yIHRoZSBjYWxsaW5nIHBsb3R0aW5nIGZ1bmN0aW9uXG4qIEBwYXJhbSB7bnVtYmVyfSBmcmVlU3BhY2UgaG93IG11Y2ggc3BhY2UgaXMgYXZhbGlibGVcbiogQHBhcmFtIHtudW1iZXJ9IG51bWJlck9mT2JqZWN0cyBob3cgbWFueSBvYmplY3QgZG8gd2UgbmVlZFxuKiBAcGFyYW0ge251bWJlcn0gbWluT2JqZWN0V2lkdGggaG93IHNtYWxsIGFyZSB0aGVzZSBvYmplY3RzIGFsbG93ZWQgdG8gYmVcbiogQHBhcmFtIHtudW1iZXJ9IG1heE9iamVjdFdpZHRoIGhvdyBsYXJnZSBhcmUgdGhlc2Ugb2JqZWN0IGFsbG93ZWQgdG8gYmVcbiogQHBhcmFtIHtudW1iZXJ9IHNpemVPZlNwYWNlciBwZXJjZW50IG9mIGZyZWVTcGFjZSB0aGF0IGEgc2luZ2xlIHNwYWNlciBzaG91bGQgdGFrZSB1cCAobmVlZCBudW1iZXJPZk9iamVjdHMgLSAxIHNwYWNlcnMpXG4qIEBwYXJhbSB7Ym9vbGVhbn0gb3ZlcmZsb3dRIGNhbiB3ZSBnbyBiZXlvbmQgYWxsb3RlZCBzcGFjZVxuKiBAcmV0dXJucyB7bnVtYmVyfSBob3cgbGFyZ2Ugb2JqZWN0IHNob3VsZCBiZVxuKiBmdW5jdGlvbiB0cmllcyB0byBrZWVwIG9iamVjdCB3aXRoaW4gbWluIC8gbWF4IHdpZHRoLCBidXQgd2lsIGRlZmF1bHQgdG9cbiogNWUtMTAgKHNtYWxsZXN0IGNvbnNpc3Rlbmx5IHZpc2libGUgYnkgc3ZnIHNpemUgb2YgZWxlbWVudCkgaWYgb3ZlcmZsb3dRIGlzIGZhbHNlXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZVdpZHRoT2ZPYmplY3QoZnJlZVNwYWNlLCBudW1iZXJPZk9iamVjdHMsIG1pbk9iamVjdFdpZHRoLCBtYXhPYmplY3RXaWR0aCwgc2l6ZU9mU3BhY2VyLCBvdmVyZmxvd1EpIHtcbiAgdmFyIHNpemVPZlNwYWNlciA9IHNpemVPZlNwYWNlciA8IDEgPyBmcmVlU3BhY2UgKiBzaXplT2ZTcGFjZXIgOiBzaXplT2ZTcGFjZXJcbiAgdmFyIG51bWJlck9mU3BhY2VycyA9IG51bWJlck9mT2JqZWN0cyAtIDFcbiAgdmFyIHNwYWNlVGFrZW5CeVNwYWNlcnMgPSBudW1iZXJPZlNwYWNlcnMgKiBzaXplT2ZTcGFjZXJcbiAgdmFyIHJlbWFpbmluZ1NwYWNlID0gZnJlZVNwYWNlIC0gc3BhY2VUYWtlbkJ5U3BhY2Vyc1xuICByZW1haW5pbmdTcGFjZSA9IHJlbWFpbmluZ1NwYWNlIDwgMCA/IDAgOiByZW1haW5pbmdTcGFjZVxuICB2YXIgb2JqZWN0V2lkdGggPSByZW1haW5pbmdTcGFjZSAvIG51bWJlck9mT2JqZWN0c1xuXG4gIGlmICggbWF4T2JqZWN0V2lkdGggIT0gdW5kZWZpbmVkICYmIG9iamVjdFdpZHRoID4gbWF4T2JqZWN0V2lkdGggKSB7IG9iamVjdFdpZHRoID0gbWF4T2JqZWN0V2lkdGggfVxuICBpZiAoIG92ZXJmbG93USAmJiBtaW5PYmplY3RXaWR0aCAhPSB1bmRlZmluZWQgJiYgb2JqZWN0V2lkdGggPCBtaW5PYmplY3RXaWR0aCApIHsgb2JqZWN0V2lkdGggPSBtaW5PYmplY3RXaWR0aCB9XG4gIHJldHVybiBNYXRoLm1heChvYmplY3RXaWR0aCwgNWUtMTApXG59XG5cbi8qKlxuKiBAcGFyYW0ge0FycmF5W119IGRhdGEgbGlzdCBkYXRhIChjYW4gYmUgbmVzdGVkKS4gSWYgbmVzdGVkIHdpbGwgY3JlYXRlIG1vcmUgY29tcGxleCBzcGFjZXIgc2l6ZVxuKiBAcGFyYW0ge251bWJlcn0gZnJlZVNwYWNlIGhvdyBtdWNoIHNwYWNlIGlzIGF2YWxpYmxlXG4qIEBwYXJhbSB7bnVtYmVyfSBvYmplY3RXaWR0aCBAc2Vle0BsaW5rIGNhbGN1bGF0ZVdpZHRoT2ZPYmplY3R9XG4qIEBwYXJhbSB7bnVtYmVyfSBudW1iZXJPZk9iamVjdHMgaG93IG1hbnkgb2JqZWN0IGRvIHdlIG5lZWRcbiogQHBhcmFtIHtudW1iZXJ9IGJhc2VTcGFjZXJTaXplIHBlcmNlbnQgb2YgZnJlZVNwYWNlIHRoYXQgYSBzaW5nbGUgc3BhY2VyIHNob3VsZCB0YWtlIHVwIChuZWVkIG51bWJlck9mT2JqZWN0cyAtIDEgc3BhY2VycylcbiogQHBhcmFtIHtib29sZWFufSBvdmVyZmxvd1EgY2FuIHdlIGdvIGJleW9uZCBhbGxvdGVkIHNwYWNlXG4qIEByZXR1cm5zIHtudW1iZXJ9IHJldHVybnMgc2l6ZSB0aGF0IHNwYWNlciBzaG91bGQgYmUgYXQgbGV2ZWw9MFxuKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVXaWR0aE9mU3BhY2VyKGRhdGEsIGZyZWVTcGFjZSwgb2JqZWN0V2lkdGgsIG51bWJlck9mT2JqZWN0cywgYmFzZVNwYWNlclNpemUsIG92ZXJmbG93USkge1xuICBpZiAob3ZlcmZsb3dRKSB7XG4gICAgdmFyIGxpbWl0ZWROdW1iZXJPZk9iamVjdHMgPSBudW1iZXJPZk9iamVjdHMgPiA2ID8gNiA6IG51bWJlck9mT2JqZWN0c1xuICAgIHZhciBzcGFjZUxlZnQgPSBmcmVlU3BhY2UgLSBsaW1pdGVkTnVtYmVyT2ZPYmplY3RzICogb2JqZWN0V2lkdGhcbiAgICByZXR1cm4gc3BhY2VMZWZ0IC8gKGxpbWl0ZWROdW1iZXJPZk9iamVjdHMgLSAxKVxuICB9XG4gIHZhciBzcGFjZXJzQXRFYWNoTGV2ZWwgPSBzcGFjZXJzTmVlZGVkQXRFYWNoTGV2ZWwoZGF0YSlcbiAgdmFyIHRvdGFsU3BhY2VyUGVyY2VudCA9IHRvdGFsKHNwYWNlcnNBdEVhY2hMZXZlbC5tYXAoZnVuY3Rpb24oZSwgaSkge3JldHVybiBlICogMSAvIChpKzEpfSkpXG4gIHZhciBiYXNlU3BhY2VyU2l6ZSA9IChmcmVlU3BhY2UgLSAob2JqZWN0V2lkdGggKiBudW1iZXJPZk9iamVjdHMpKSAvIHRvdGFsU3BhY2VyUGVyY2VudFxuICAvLyBjb25zb2xlLmxvZyh0b3RhbFNwYWNlclBlcmNlbnQsIGJhc2VTcGFjZXJTaXplLCB0b3RhbFNwYWNlclBlcmNlbnQgKiBiYXNlU3BhY2VyU2l6ZSlcbiAgcmV0dXJuIGJhc2VTcGFjZXJTaXplXG59XG5cblxuLyoqXG4qIENhbGN1bGF0ZXMgbnVtYmVyIG9mIHNwYWNlcnMgbmVlZGVkIHRvIHNlcGVyYXRlIGVsZW1lbnRzIGF0IGVhY2ggbGV2ZWwuXG4qIEBwYXJhbSB7QXJyYXlbXX0gYXJyYXkgbGlzdCBkYXRhIChjYW4gYmUgbmVzdGVkKS4gSWYgbmVzdGVkIHdpbGwgY3JlYXRlIG1vcmUgY29tcGxleCBzcGFjZXIgc2l6ZVxuKiBAcGFyYW0ge251bWJlcn0gW2xldmVsPTBdIGN1cnJlbnQgbGV2ZWwsIHVzZWQgaW4gcmVjdXNyaW9uXG4qIEBwYXJhbSB7QXJyYXl9IFtsZXZlbERhdGE9W11dIGhvdyBtYW55IHNwYWNlcnMgbmVlZGVkIGF0IGEgZ2l2ZW4gbGV2ZWxcbiogQHJldHVybnMge0FycmF5fSBsZXZlbERhdGFcbipcbiogQGV4YW1wbGVcbiogYXJyYXkgPSBbWzEsMl0sIFszLDRdXVxuKiAvLyByZXR1cm5zIFsxLCAyXVxuKiBhcyBhdCBsZXZlbD0wIHRoZSBvbmx5IHNwYWNlciBuZWVkZWQgaXMgYmV0d2VlbiBbMSwyXSBhbmQgWzMsNF1cbiogYW5kIGF0IGxldmVsPTEgdGhlIG9ubHkgdHdvIHNwYWNlcnMgbmVlZGVkIGlzIGJldHdlZW4gMSBhbmQgMiBhcyB3ZWxsIGFzXG4qIDMgYW5kIDQgc2luY2UgdGhlIHNwYWNlciBiZXR3ZWVuIDIgYW5kIDMgaXMgaGFuZGxlZCBhdCBsZXZlbD0wXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIHNwYWNlcnNOZWVkZWRBdEVhY2hMZXZlbCAoYXJyYXksIGxldmVsLCBsZXZlbERhdGEgKSB7XG4gIGlmICggbGV2ZWwgPT0gdW5kZWZpbmVkICkgeyBsZXZlbCA9IDA7ICB9IGVsc2UgeyBsZXZlbCArPSAxIH1cbiAgaWYgKCBsZXZlbERhdGEgPT0gdW5kZWZpbmVkICkgeyBsZXZlbERhdGEgPSBbXTsgfVxuICBpZiAoIGxldmVsID49IGxldmVsRGF0YS5sZW5ndGggKSB7IGxldmVsRGF0YS5wdXNoKGFycmF5Lmxlbmd0aCAtIDEpIH1cbiAgZWxzZSB7IGxldmVsRGF0YVtsZXZlbF0gKz0gYXJyYXkubGVuZ3RoIC0gMSB9XG4gIGFycmF5Lm1hcChmdW5jdGlvbihlLCBpKSB7IGlmIChBcnJheS5pc0FycmF5KGUpKSB7IHNwYWNlcnNOZWVkZWRBdEVhY2hMZXZlbChlLCBsZXZlbCwgbGV2ZWxEYXRhKSB9IH0gKVxuICByZXR1cm4gbGV2ZWxEYXRhXG59XG5cblxuXG5cbi8qKlxuKiBEcmF3cyBhIHdoaXNrZXIgZm9yIEBzZWV7QGxpbmsgYm94d2hpc2tlcn1cbiogQHBhcmFtIHtib29sZWFufSBkaXIgZGlyZWN0aW9uIHRvIGRyYXcgd2hpc2tlciwgc2hvdWxkIGJlIGVpdGhlciB0cnVlICh1cCwgdG9wKSBvciBmYWxzZSAoZG93biBvciBib3R0b20pXG4qIEBwYXJhbSB7bnVtYmVyfSB4IHN0YXJ0aW5nIHggY29vcmRpbmF0ZSBpbiB3aGljaCB0byBkcmF3IHdoaXNrZXJcbiogQHBhcmFtIHtudW1iZXJ9IHkgc3RhcnRpbmcgeSBjb29yZGluYXRlIGluIHdoaWNoIHRvIGRyYXcgd2hpc2tlclxuKiBAcGFyYW0ge251bWJlcn0gdyB3aWR0aCBvZiBzcGFjZSBpbiB3aGljaCB0byBkcmF3IHdoaXNrZXJcbiogQHBhcmFtIHtudW1iZXJ9IGggaGVpZ2h0IG9mIHNwYWNlIGluIHdoaWNoIHRvIGRyYXcgd2hpc2tlclxuKiBAcGFyYW0ge251bWJlcn0gcGVyIHBlcmNlbnRhZ2Ugb2YgdyBvciBoIChkZXBlbmRzIG9uIG8pIHRvIG1ha2Ugd2hpc2tlclxuKiBAcGFyYW0ge2Jvb2xlYW59IG8gb3JpZW50YXRpb24sIHRydWUgaXMgaG9yaXpvbnRhbCBhbmQgZmFsc2UgaXMgdmVydGljYWxcbiogQHJldHVybnMge3N0cmluZ30gcmVwcmVzZW50aW5nIHRoZSBzdmcgcGF0aCAoaS5lLiB0aGUgZCBhdHRyaWJ1dGUgZm9yIGEgcGF0aCB0YWcpXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIHdoaXNrZXJQYXRoKGRpciwgeCwgeSwgdywgaCwgcGVyLCBvKSB7XG4gIC8vIGQgPSBkaXJlY3Rpb24gKHRydWUgaXMgdXApLCBwID0gcGVyY2VudCB3aWR0aFxuICBpZiAoZGlyID09ICd1cCcgfHwgZGlyID09ICd0b3AnIHx8IGRpciA9PSB0cnVlKSB7ZGlyID0gdHJ1ZX1cbiAgaWYgKGRpciA9PSAnZG93bicgfHwgZGlyID09ICdib3R0b20nIHx8IGRpciA9PSBmYWxzZSkge2RpciA9IGZhbHNlfVxuICBvID0gbyA9PSB1bmRlZmluZWQgPyAnaG9yaXpvbnRhbCcgOiBvXG4gIHBlciA9IHBlciA9PSB1bmRlZmluZWQgPyAxIDogcGVyXG4gIGlmIChvICE9IFwiaG9yaXpvbnRhbFwiKSB7XG4gICAgdmFyIGhoID0gaCAqIHBlciAsXG4gICAgdyA9IGRpciA/IHcgOiAtdyAsXG4gICAgYSA9IGRpciA/IHggKyB3IDogeCAsXG4gICAgYiA9IGRpciA/IHggOiB4ICsgdyAsXG4gICAgYyA9IGRpciA/IGEgOiBiXG4gICAgcCA9IFwiTSBcIiArIGEgKyAnICcgKyAoICAgICBoIC8gMiAgICAgICkgKyAnICdcbiAgICAgICsgJ0wgJyArIGIgKyAnICcgKyAoICAgICBoIC8gMiAgICAgICkgKyAnICdcbiAgICAgICsgJ00gJyArIGMgKyAnICcgKyAoIGggLyAyIC0gaGggLyAyICkgKyAnICdcbiAgICAgICsgJ0wgJyArIGMgKyAnICcgKyAoIGggLyAyICsgaGggLyAyICkgKyAnICdcblxuICAgIHJldHVybiBwXG4gIH1cbiAgdmFyIHd3ID0gdyAqIHBlcixcbiAgYSA9IGRpciA/IHkgKyBoIDogeSAgLFxuICBiID0gZGlyID8geSA6IHkgKyBoICAsXG4gIHAgPSBcIk0gXCIgKyAoICB3IC8gMiAgKSArICcgJyArIGEgKyAnICcgLy8gc3RyYWlnaHQgbGluZSBwYXJ0XG4gICAgKyAnTCAnICsgKCAgdyAvIDIgICkgKyAnICcgKyBiICsgJyAnIC8vIHN0cmFpZ2h0IGxpbmUgcGFydFxuICAgICsgJ2ggJyArICggLXd3IC8gMiApICsgJyAnICsgMCArICcgJyAvLyBob3Jpem9udGFsIGxpbmUgcGFydFxuICAgICsgJ2ggJyArICggICAgd3cgICApICsgJyAnICsgMCArICcgJ1xuICByZXR1cm4gcFxufVxuIiwiaW1wb3J0IHtsb2csIHdhcm4sIGVycm9yLCBpbmZvfSBmcm9tICcuL3V0aWxzJztcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BBQ0VHUk9VUElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKipcbiAqIFByb2R1Y2VzIGEgZnVuY3Rpb24gZm9yIHNwYWNpbmcgb2JqZWN0cyBieSBhbiBhcmJpdHJhcmx5IGNvbXBsZXggZ3JvdXBpbmdcbiAqIEByZXR1cm5zIHtyZWN1cnNpdmVseVBvc2l0aW9ufSB0aGUgZnVuY3Rpb24gZm9yIG1vdmluZyB0aGUgb2JqZWN0c1xuICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIjcmVjdXJzaXZlbHlQb3NpdGlvbn0pXG4gKiBAbmFtZXNwYWNlIGdyb3VwaW5nU3BhY2VyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBncm91cGluZ1NwYWNlcigpIHtcbiAgdmFyXG4gIC8qQHZhciB7Ym9vbGVhbn0gaG9yaXpvbnRhbFEgQGRlZmF1bHQqL1xuXG4gIC8qKlxuICAqIFdoZXRoZXIgb3Igbm90IHRvIHNwYWNlIG9iamVjdHMgaG9yaXpvbnRhbGx5IG9yIHZlcnRpY2FsbHkuXG4gICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIuaG9yaXpvbnRhbFF9KVxuICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2hvcml6b250YWxRPXRydWVdXG4gICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyI1xuICAqIEBpbnN0YW5jZVxuICAqL1xuICBob3Jpem9udGFsUSA9IHRydWUsXG4gIC8qKlxuICAqIFRoZSBzY2FsZSB0byB1c2UgdG8gcG9zaXRpb24gZWxlbWVudHMgaWYge0BsaW5rIGdyb3VwaW5nU3BhY2VyI21vdmVieX09XCJzdHJpbmdcIlxuICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyLnNjYWxlfSlcbiAgKiBAcGFyYW0ge2QzLnNjYWxlfSBbc2NhbGU9ZDMuc2NhbGVMaW5lYXIoKV1cbiAgKiBAbWVtYmVyb2YgZ3JvdXBpbmdTcGFjZXIjXG4gICogQGluc3RhbmNlXG4gICovXG4gIHNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKSxcbiAgLyoqXG4gICogSG93IGVsZW1lbnRzIGluIHRoZSBjb21wbGV4IGdyb3VwaW5nIHNob3VsZCBiZSBtb3ZlZCBvdmVyIGJ5LlxuICAqIEJ5IGRlZmF1bHQsIG1vdmVieT1cImNhdGVnb3J5XCIsIHdoaWNoIG1vdmVzIG9iamVjdHMgYnkgdGhlIGNvbXBsZXggZ3JvdXBpbmdcbiAgKiBCdXQgb2JqZWN0cyBjYW4gYWxzbyBiZSBtb3ZlZCBvdmVyIGJ5IHNjYWxlLlxuICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyLm1vdmVieX0pXG4gICogQHBhcmFtIHtzdHJpbmd9IFttb3ZlYnk9XCJjYXRlZ29yeVwiXVxuICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlciNcbiAgKiBAaW5zdGFuY2VcbiAgKi9cbiAgbW92ZWJ5ID0gJ2NhdGVnb3J5JyxcbiAgLyoqXG4gICogSG93IG1hbnkgb2JqZWN0cyBhcmUgdGhlcmUgaW4gdG90YWxcbiAgKiAoc2VlIHtAbGluayBncm91cGluZ1NwYWNlci5udW1iZXJPZk9iamVjdHN9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbbnVtYmVyT2ZPYmplY3RzPW5vbmVdXG4gICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyI1xuICAqIEBpbnN0YW5jZVxuICAqL1xuICBudW1iZXJPZk9iamVjdHMsXG4gIC8qKlxuICAqIFRoZSBjbGFzcyBnaXZlbiB0byBhbiBuZXN0ZWQgPGc+IHRhZyB3aG9zZSBwYXJlbnQocykgaGF2ZSB0aGUgY29ycmVjdCB0cmFuc2l0aW9uXG4gICogcHJvcGVydGllc1xuICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyLm51bWJlck9mT2JqZWN0c30pXG4gICogQHBhcmFtIHtzdHJpbmd9IFtudW1iZXJPZk9iamVjdHM9J2Qzc20tZ3JvdXBwZWQtaXRlbSddXG4gICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyI1xuICAqIEBpbnN0YW5jZVxuICAqL1xuICBvYmplY3RDbGFzcyA9ICdkM3NtLWdyb3VwcGVkLWl0ZW0nLFxuICAvKipcbiAgKiBUaGUgc2l6ZSBvZiB0aGUgb2JqZWN0cyBiZWluZyBwb3NpdGlvbmVkXG4gICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIub2JqZWN0U2l6ZX0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtvYmplY3RTaXplPW5vbmVdXG4gICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyI1xuICAqIEBpbnN0YW5jZVxuICAqL1xuICBvYmplY3RTaXplLFxuICAvKipcbiAgKiBUaGUgc2l6ZSBvZiB0aGUgdW4tbmVzdGVkIHNwYWNlciBiZXR3ZWVuIG9iamVjdHNcbiAgKiAoc2VlIHtAbGluayBncm91cGluZ1NwYWNlci5zcGFjZXJTaXplfSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW3NwYWNlclNpemU9bm9uZV1cbiAgKiBAbWVtYmVyb2YgZ3JvdXBpbmdTcGFjZXIjXG4gICogQGluc3RhbmNlXG4gICovXG4gIHNwYWNlclNpemUsXG4gIC8qKlxuICAqIFRoZSBkdXJhdGlvbiBvZiB0cmFuc2l0aW9ucyBpbiBtc1xuICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyLnRyYW5zaXRpb25EdXJhdGlvbn0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFt0cmFuc2l0aW9uRHVyYXRpb249MTAwMF1cbiAgKiBAbWVtYmVyb2YgZ3JvdXBpbmdTcGFjZXIjXG4gICogQGluc3RhbmNlXG4gICovXG4gIHRyYW5zaXRpb25EdXJhdGlvbiA9IDEwMDAsXG4gIC8qKlxuICAqIFRoZSBlYXNlIGZ1bmN0aW9uIGZvciB0aGUgdHJhbnNpdGlvbnNcbiAgKiAoc2VlIHtAbGluayBncm91cGluZ1NwYWNlci5lYXNlRnVuY30pXG4gICogQHBhcmFtIHtkMy5lYXNlfSBbZWFzZUZ1bmM9ZDMuZWFzZVNpbl1cbiAgKiBAbWVtYmVyb2YgZ3JvdXBpbmdTcGFjZXIjXG4gICogQGluc3RhbmNlXG4gICovXG4gIGVhc2VGdW5jID0gZDMuZWFzZVNpbixcbiAgLyoqXG4gICogVGhlIG5hbWVzcGFjZSBmb3IgdGhlIG9iamVjdHMgYmVpbmcgbW92ZWRcbiAgKiAoc2VlIHtAbGluayBncm91cGluZ1NwYWNlci5uYW1lc3BhY2V9KVxuICAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZXNwYWNlPSdzcGFjZXInXVxuICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlciNcbiAgKiBAaW5zdGFuY2VcbiAgKi9cbiAgbmFtZXNwYWNlID0gJ3NwYWNlcicsXG4gIC8qKlxuICAqIFRoZSBhbmltYXRpb24gZm9yIG5ldyBvYmplY3RzIGJlaW5nIGFkZGVkXG4gICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIuZW50ZXJGdW5jdGlvbn0pXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gZW50ZXJGdW5jdGlvblxuICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlciNcbiAgKiBAaW5zdGFuY2VcbiAgKiBAZXhhbXBsZVxuICAqIC8vIGJ5IGRlZmF1bHRcbiAgKiBmdW5jdGlvbihuZXdPYmplY3RTZWxlY3Rpb24pIHtcbiAgKiAgbmV3T2JqZWN0U2VsZWN0aW9uLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uKGQsIGkpe1xuICAqICAgIHZhclxuICAqICAgIHggPSBob3Jpem9udGFsUSA/IG9iamVjdFNpemUgKiBudW1iZXJPZk9iamVjdHMgKyBzcGFjZXJTaXplICogKG51bWJlck9mT2JqZWN0cyAtIDEpIDogMCxcbiAgKiAgICB5ID0gIWhvcml6b250YWxRID8gb2JqZWN0U2l6ZSAqIG51bWJlck9mT2JqZWN0cyArIHNwYWNlclNpemUgKiAobnVtYmVyT2ZPYmplY3RzIC0gMSkgOiAwLFxuICAqICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgKiAgICByZXR1cm4gdFxuICAqICB9KVxuICAqIH1cbiAgKi9cbiAgZW50ZXJGdW5jdGlvbiA9IGZ1bmN0aW9uKGN1cikge1xuICAgIGN1ci5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbihkLCBpKXtcbiAgICAgIHZhclxuICAgICAgeCA9IGhvcml6b250YWxRID8gb2JqZWN0U2l6ZSAqIG51bWJlck9mT2JqZWN0cyArIHNwYWNlclNpemUgKiAobnVtYmVyT2ZPYmplY3RzIC0gMSkgOiAwLFxuICAgICAgeSA9ICFob3Jpem9udGFsUSA/IG9iamVjdFNpemUgKiBudW1iZXJPZk9iamVjdHMgKyBzcGFjZXJTaXplICogKG51bWJlck9mT2JqZWN0cyAtIDEpIDogMCxcbiAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgIHJldHVybiB0XG4gICAgfSlcbiAgfSxcbiAgLyoqXG4gICogVGhlIGFuaW1hdGlvbiBmb3Igb2xkIG9iamVjdHMgYmVpbmcgcmVtb3ZlZFxuICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyLmV4aXRGdW5jdGlvbn0pXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gZXhpdEZ1bmN0aW9uXG4gICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyI1xuICAqIEBpbnN0YW5jZVxuICAqIEBleGFtcGxlXG4gICogLy8gYnkgZGVmYXVsdFxuICAqIG9sZE9iamVjdFNlbGVjdGlvbi50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlKGVhc2VGdW5jKVxuICAqIC5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbihkLCBpKXtcbiAgKiAgICAgdmFyXG4gICogICB4ID0gaG9yaXpvbnRhbFEgPyBvYmplY3RTaXplICogbnVtYmVyT2ZPYmplY3RzICsgc3BhY2VyU2l6ZSAqIChudW1iZXJPZk9iamVjdHMgLSAxKSA6IDAsXG4gICogICB5ID0gIWhvcml6b250YWxRID8gb2JqZWN0U2l6ZSAqIG51bWJlck9mT2JqZWN0cyArIHNwYWNlclNpemUgKiAobnVtYmVyT2ZPYmplY3RzIC0gMSkgOiAwLFxuICAqICAgdCA9ICd0cmFuc2xhdGUoJyt4KycsJyt5KycpJ1xuICAqICAgcmV0dXJuIHRcbiAgKiB9KS5yZW1vdmUoKVxuICAqL1xuICBleGl0RnVuY3Rpb24gPSBmdW5jdGlvbihjdXIpe1xuICAgIGxvZyhcImdyb3VwaW5nU3BhY2VyXCIsIFwiZXhpdGluZyB3aXRoXCIsIHtjdXJyZW50OiBjdXIsIGN1cnJlbnROb2RlOiBjdXIubm9kZSgpfSlcbiAgICBjdXIuY2xhc3NlZCgndG8tcmVtb3ZlJywgdHJ1ZSlcblxuICAgIGN1ci50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKjAuOSkuZWFzZShlYXNlRnVuYylcbiAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24oZCwgaSl7XG4gICAgICB2YXJcbiAgICAgIHggPSBob3Jpem9udGFsUSA/IG9iamVjdFNpemUgKiBudW1iZXJPZk9iamVjdHMgKyBzcGFjZXJTaXplICogKG51bWJlck9mT2JqZWN0cyAtIDEpIDogMCxcbiAgICAgIHkgPSAhaG9yaXpvbnRhbFEgPyBvYmplY3RTaXplICogbnVtYmVyT2ZPYmplY3RzICsgc3BhY2VyU2l6ZSAqIChudW1iZXJPZk9iamVjdHMgLSAxKSA6IDAsXG4gICAgICB0ID0gJ3RyYW5zbGF0ZSgnK3grJywnK3krJyknXG4gICAgICByZXR1cm4gdFxuICAgIH0pLnJlbW92ZSgpXG4gIH1cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgaG9yaXpvbnRhbFEgKHdoZXRoZXIgb3Igbm90IHRvIHNwYWNlIG9iamVjdHMgaG9yaXpvbnRhbGx5IG9yIHZlcnRpY2FsbHkpLlxuICAgKiAoc2VlIHtAbGluayBncm91cGluZ1NwYWNlciNob3Jpem9udGFsUX0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Z3JvdXBpbmdTcGFjZXIgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlclxuICAgKiBAc3RhdGljXG4gICAqL1xuICByZWN1cnNpdmVseVBvc2l0aW9uLmhvcml6b250YWxRID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChob3Jpem9udGFsUSA9IF8sIHJlY3Vyc2l2ZWx5UG9zaXRpb24pIDogaG9yaXpvbnRhbFEgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNjYWxlIHRvIHVzZSB0byBwb3NpdGlvbiBlbGVtZW50cyBpZiB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIjbW92ZWJ5fT1cInN0cmluZ1wiXG4gICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyI3NjYWxlfSlcbiAgICogQHBhcmFtIHtkMy5zY2FsZX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2dyb3VwaW5nU3BhY2VyIHwgZDMuc2NhbGV9XG4gICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlclxuICAgKiBAc3RhdGljXG4gICAqL1xuICByZWN1cnNpdmVseVBvc2l0aW9uLnNjYWxlID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzY2FsZSA9IF8sIHJlY3Vyc2l2ZWx5UG9zaXRpb24pIDogc2NhbGUgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgbW92ZWJ5ICh3aGV0aGVyIG9yIG5vdCB0byBtb3ZlIGJ5IHNjYWxlIG9yIGJ5IGdyb3VwaW5nKS5cbiAgICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIjbW92ZWJ5fSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtncm91cGluZ1NwYWNlciB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHJlY3Vyc2l2ZWx5UG9zaXRpb24ubW92ZWJ5ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChtb3ZlYnkgPSBfLCByZWN1cnNpdmVseVBvc2l0aW9uKSA6IG1vdmVieSB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyBudW1iZXJPZk9iamVjdHMuXG4gICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyI251bWJlck9mT2JqZWN0c30pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Z3JvdXBpbmdTcGFjZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlclxuICAgKiBAc3RhdGljXG4gICAqL1xuICByZWN1cnNpdmVseVBvc2l0aW9uLm51bWJlck9mT2JqZWN0cyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobnVtYmVyT2ZPYmplY3RzID0gXywgcmVjdXJzaXZlbHlQb3NpdGlvbikgOiBudW1iZXJPZk9iamVjdHMgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG9iamVjdENsYXNzICh3aWxsIGJlIGFwcGxpZWQgdG8gPGc+IGVsZW1lbnRzKS5cbiAgICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIjb2JqZWN0Q2xhc3N9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2dyb3VwaW5nU3BhY2VyIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgZ3JvdXBpbmdTcGFjZXJcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgcmVjdXJzaXZlbHlQb3NpdGlvbi5vYmplY3RDbGFzcyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob2JqZWN0Q2xhc3MgPSBfLCByZWN1cnNpdmVseVBvc2l0aW9uKSA6IG9iamVjdENsYXNzIH1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBvYmplY3RTaXplLlxuICAgKiAoc2VlIHtAbGluayBncm91cGluZ1NwYWNlciNvYmplY3RTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtncm91cGluZ1NwYWNlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHJlY3Vyc2l2ZWx5UG9zaXRpb24ub2JqZWN0U2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob2JqZWN0U2l6ZSA9IF8sIHJlY3Vyc2l2ZWx5UG9zaXRpb24pIDogb2JqZWN0U2l6ZSB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgc3BhY2VyU2l6ZS5cbiAgICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIjc3BhY2VyU2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Z3JvdXBpbmdTcGFjZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlclxuICAgKiBAc3RhdGljXG4gICAqL1xuICByZWN1cnNpdmVseVBvc2l0aW9uLnNwYWNlclNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNwYWNlclNpemUgPSBfLCByZWN1cnNpdmVseVBvc2l0aW9uKSA6IHNwYWNlclNpemUgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRyYW5zaXRpb25EdXJhdGlvbi5cbiAgICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIjdHJhbnNpdGlvbkR1cmF0aW9ufSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtncm91cGluZ1NwYWNlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHJlY3Vyc2l2ZWx5UG9zaXRpb24udHJhbnNpdGlvbkR1cmF0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0cmFuc2l0aW9uRHVyYXRpb24gPSBfLCByZWN1cnNpdmVseVBvc2l0aW9uKSA6IHRyYW5zaXRpb25EdXJhdGlvbiB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgZWFzZUZ1bmMuXG4gICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyI2Vhc2VGdW5jfSlcbiAgICogQHBhcmFtIHtkMy5lYXNlfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Z3JvdXBpbmdTcGFjZXIgfCBkMy5lYXNlfVxuICAgKiBAbWVtYmVyb2YgZ3JvdXBpbmdTcGFjZXJcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgcmVjdXJzaXZlbHlQb3NpdGlvbi5lYXNlRnVuYyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZWFzZUZ1bmMgPSBfLCByZWN1cnNpdmVseVBvc2l0aW9uKSA6IGVhc2VGdW5jIH1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBuYW1lc3BhY2UuXG4gICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyI25hbWVzcGFjZX0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Z3JvdXBpbmdTcGFjZXIgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlclxuICAgKiBAc3RhdGljXG4gICAqL1xuICByZWN1cnNpdmVseVBvc2l0aW9uLm5hbWVzcGFjZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobmFtZXNwYWNlID0gXywgcmVjdXJzaXZlbHlQb3NpdGlvbikgOiBuYW1lc3BhY2UgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGVudGVyRnVuY3Rpb24uXG4gICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyI2VudGVyRnVuY3Rpb259KVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Z3JvdXBpbmdTcGFjZXIgfCBmdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHJlY3Vyc2l2ZWx5UG9zaXRpb24uZW50ZXJGdW5jdGlvbiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZW50ZXJGdW5jdGlvbiA9IF8sIHJlY3Vyc2l2ZWx5UG9zaXRpb24pIDogZW50ZXJGdW5jdGlvbiB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgZXhpdEZ1bmN0aW9uLlxuICAgKiAoc2VlIHtAbGluayBncm91cGluZ1NwYWNlciNleGl0RnVuY3Rpb259KVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Z3JvdXBpbmdTcGFjZXIgfCBmdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHJlY3Vyc2l2ZWx5UG9zaXRpb24uZXhpdEZ1bmN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChleGl0RnVuY3Rpb24gPSBfLCByZWN1cnNpdmVseVBvc2l0aW9uKSA6IGV4aXRGdW5jdGlvbiB9XG5cblxuICAvKipcbiAgICogcmVjdXJzaXZlbHkgcG9zaXRpb24gdGhlIG9iamVjdHMgaW5zaWRlIG9mIHRoZSBzZWxlY3Rpb24uXG4gICAqIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBzZWxlY3Rpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICogQHBhcmFtIHtsZXZlbH0gW2xldmVsPTBdIHJlY3Vyc2lvbiBkZXB0aFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSAoaG93IG11Y2ggdG8gbW92ZSBuZXh0IGVsZW1lbnQpXG4gICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlciNcbiAgICovXG4gIGZ1bmN0aW9uIHJlY3Vyc2l2ZWx5UG9zaXRpb24oc2VsZWN0aW9uLCBkYXRhLCBsZXZlbCkge1xuICAgIGlmICggbGV2ZWwgPT0gdW5kZWZpbmVkICkgeyBsZXZlbCA9IDA7ICB9XG5cbiAgICB2YXIgY3VycmVudFNlbGVjdGlvbiA9IHNlbGVjdGlvbi5zZWxlY3RBbGwoJ2cuJytuYW1lc3BhY2UrJ1tsZXZlbD1cIicrbGV2ZWwrJ1wiXScpLmRhdGEoZGF0YSlcbiAgICB2YXIgZW50ZXIgPSBjdXJyZW50U2VsZWN0aW9uLmVudGVyKCkuYXBwZW5kKCdnJykuYXR0cignbGV2ZWwnLCBsZXZlbCkuYXR0cignY2xhc3MnLCBuYW1lc3BhY2UpXG4gICAgdmFyIGV4aXQgPSBjdXJyZW50U2VsZWN0aW9uLmV4aXQoKVxuICAgIGN1cnJlbnRTZWxlY3Rpb24gPSBjdXJyZW50U2VsZWN0aW9uLm1lcmdlKGVudGVyKVxuXG5cbiAgICBpZiAodHlwZW9mIGV4aXRGdW5jdGlvbiA9PSAnZnVuY3Rpb24nICl7IGV4aXQuZWFjaChmdW5jdGlvbihkLCBpKXsgZXhpdEZ1bmN0aW9uKGQzLnNlbGVjdCh0aGlzKSl9KSB9XG4gICAgZWxzZXtleGl0LnJlbW92ZSgpfVxuICAgIC8vIHNwYWNlciBmb3IgY3VycmVudCBsZXZlbFxuICAgIHZhciBsZXZlbFNwYWNlciA9IHNwYWNlclNpemUgLyAobGV2ZWwrMSlcbiAgICAvLyBtb3ZlbWVudCBmb3IgY3VycmVudCBsZXZlbFxuICAgIHZhciBtb3ZlID0gMFxuICAgIGN1cnJlbnRTZWxlY3Rpb24uZWFjaChmdW5jdGlvbihjdXJyZW50RWxlbWVudCwgaW5kZXgpIHtcbiAgICAgIHZhciB0ID0gZDMuc2VsZWN0KHRoaXMpXG4gICAgICBpZiAodC5hdHRyKCd0cmFuc2Zvcm0nKSA9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGVudGVyRnVuY3Rpb24gPT0gJ2Z1bmN0aW9uJykgeyBlbnRlckZ1bmN0aW9uKHQpIH1cblxuICAgICAgdC50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlKGVhc2VGdW5jKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uKGQsIGkpIHtcbiAgICAgICAgdmFyXG4gICAgICAgIHggPSBob3Jpem9udGFsUSA/IChtb3ZlYnkgPT1cInNjYWxlXCIgPyBzY2FsZShkKSA6IG1vdmUpIDogMCxcbiAgICAgICAgeSA9ICFob3Jpem9udGFsUSA/IChtb3ZlYnkgPT1cInNjYWxlXCIgPyBzY2FsZShkKSA6IG1vdmUpOiAwLFxuICAgICAgICB0ID0gJ3RyYW5zbGF0ZSgnK3grJywnK3krJyknXG4gICAgICAgIHJldHVybiB0XG4gICAgICB9KVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50RWxlbWVudCkpIHtcbiAgICAgICAgbW92ZSArPSByZWN1cnNpdmVseVBvc2l0aW9uKHQsIGN1cnJlbnRFbGVtZW50LCBsZXZlbCsxKVxuICAgICAgICB2YXIgdG9SZW1vdmUgPSB0LnNlbGVjdEFsbCgnZy4nK25hbWVzcGFjZSsnW2xldmVsPVwiJysobGV2ZWwpKydcIl0gPiBnLicrb2JqZWN0Q2xhc3MrJy4nK25hbWVzcGFjZSlcbiAgICAgICAgaWYgKHR5cGVvZiBleGl0RnVuY3Rpb24gPT0gJ2Z1bmN0aW9uJyApeyB0b1JlbW92ZS5lYWNoKGZ1bmN0aW9uKGQsIGkpeyBleGl0RnVuY3Rpb24oZDMuc2VsZWN0KHRoaXMpKX0pIH1cbiAgICAgICAgZWxzZXt0b1JlbW92ZS5yZW1vdmUoKX1cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBtb3ZlICs9IG9iamVjdFNpemVcbiAgICAgICAgdmFyIG9iaiA9IHQuc2VsZWN0KCdnLicrbmFtZXNwYWNlKydbbGV2ZWw9XCInK2xldmVsKydcIl0gPiBnLicrb2JqZWN0Q2xhc3MrJy4nK25hbWVzcGFjZSlcbiAgICAgICAgaWYgKG9iai5lbXB0eSgpKSB7IG9iaiA9IHQuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCBvYmplY3RDbGFzcykuY2xhc3NlZChuYW1lc3BhY2UsIHRydWUpIH1cbiAgICAgICAgb2JqLmF0dHIoJ3BhcmVudC1pbmRleCcsIGluZGV4KVxuICAgICAgICB2YXIgdG9SZW1vdmUgPSB0LnNlbGVjdEFsbCgnZy4nK25hbWVzcGFjZSsnW2xldmVsPVwiJysobGV2ZWwrMSkrJ1wiXScpXG5cbiAgICAgICAgaWYgKHR5cGVvZiBleGl0RnVuY3Rpb24gPT0gJ2Z1bmN0aW9uJyApeyB0b1JlbW92ZS5lYWNoKGZ1bmN0aW9uKGQsIGkpeyBleGl0RnVuY3Rpb24oZDMuc2VsZWN0KHRoaXMpKX0pIH1cbiAgICAgICAgZWxzZXt0b1JlbW92ZS5yZW1vdmUoKX1cbiAgICAgIH1cbiAgICAgIG1vdmUgKz0gKGluZGV4ID09IGN1cnJlbnRTZWxlY3Rpb24uc2l6ZSgpLTEpID8gMCA6IGxldmVsU3BhY2VyXG4gICAgfSlcbiAgICByZXR1cm4gbW92ZVxuICB9XG4gIHJldHVybiByZWN1cnNpdmVseVBvc2l0aW9uXG59XG4iLCJpbXBvcnQge1xuICBoeXBlbmF0ZSwgc2FmZVNlbGVjdCwgZXh0cmFjdFZpb2xpblZhbHVlcyxcbiAgdGlja1JhbmdlLCBtb2RpZnlIZXhpZGVjaW1hbENvbG9yTHVtaW5hbmNlLCB0cnVuY2F0ZVRleHQsXG4gIHJvdW5kXG59IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQge3NldHVwQ29udGFpbmVyLCBjYWxjdWxhdGVXaWR0aE9mT2JqZWN0LCBjYWxjdWxhdGVXaWR0aE9mU3BhY2VyfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7dW5pcXVlLCBoYXNRLCBmbGF0dGVufSBmcm9tICcuL2FycmF5LWZ1bmN0aW9ucyc7XG5pbXBvcnQge2dyb3VwaW5nU3BhY2VyfSBmcm9tICcuL2dyb3VwaW5nLXNwYWNlcic7XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXhpc1xuICpcbiAqIHtAbGluayBodHRwczovL3N1bW5ldXJvbi5naXRsYWIuaW8vZDNzbS9kZW1vcy9heGVzL2luZGV4Lmh0bWwgRGVtb31cbiAqIEBjb25zdHJ1Y3RvciBheGlzXG4gKiBAcGFyYW0ge2QzLnNlbGVjdGlvbn0gc2VsZWN0aW9uXG4gKiBAbmFtZXNwYWNlIGF4aXNcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gYXhpc1xuICovXG5leHBvcnQgZnVuY3Rpb24gYXhpcyAoIHNlbGVjdGlvbiApIHtcbiAgdmFyXG4gIC8qKlxuICAqIFRoZSBvcmllbnRhdGlvbiBvZiB0aGUgYXhpc1xuICAqIChzZWUge0BsaW5rIGF4aXMjb3JpZW50fSlcbiAgKiBAcGFyYW0ge3N0cmluZ30gW29yaWVudD0nYm90dG9tJ11cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb3JpZW50ID0gJ2JvdHRvbScsICAgICAgIC8vIGRpcmVjdGlvbiBvZiB0aGUgYXhpc1xuXG4gIC8qKlxuICAqIEFtb3VudCBvZiBob3Jpem9udGFsIHNwYWNlIChpbiBwaXhlbHMpIGF2YWlibGUgdG8gcmVuZGVyIHRoZSBheGlzIGluXG4gICogKHNlZSB7QGxpbmsgYXhpcyNzcGFjZVh9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbc3BhY2VYPTBdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNwYWNlWD0wLFxuICAvKipcbiAgKiBBbW91bnQgb2YgdmVydGljYWwgc3BhY2UgKGluIHBpeGVscykgYXZhaWJsZSB0byByZW5kZXIgdGhlIGF4aXMgaW5cbiAgKiAoc2VlIHtAbGluayBheGlzLnNwYWNlWX0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZVk9MF1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc3BhY2VZPTAsXG5cblxuICAvKipcbiAgKiBXaGV0aGVyIG9yIG5vdCB0byBhbGxvdyBheGlzIHRvIHJlbmRlciBlbGVtZW50cyBwYXNzIHRoZSBtYWluIHNwYXRpYWwgZGltZW5zaW9uXG4gICogZ2l2ZW4gdGhlIG9yaWVudGF0aW9uIChzZWUge0BsaW5rIGF4aXMjb3JpZW50fSksIHdoZXJlIHtAbGluayBheGlzI29yaWVudH09XCJib3R0b21cIiBvciB7QGxpbmsgYXhpcyNvcmllbnR9PVwidG9wXCJcbiAgKiB0aGUgbWFpbiBkaW1lbnNpb24gaXMge0BsaW5rIGF4aXMjc3BhY2VYfSBhbmQgd2hlcmUge0BsaW5rIGF4aXMjb3JpZW50fT1cImxlZnRcIiBvciB7QGxpbmsgYXhpcyNvcmllbnR9PVwicmlnaHRcIlxuICAqIHRoZSBtYWluIGRpbWVuc2lvbiBpcyB7QGxpbmsgYXhpcyNzcGFjZVl9XG4gICogQHBhcmFtIHtib29sZWFufSBbb3ZlcmZsb3dRPWZhbHNlXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBvdmVyZmxvd1EgPSBmYWxzZSwgICAgLy8gd2hldGhlciBvciBub3QgdG8gYWxsb3cgb3ZlcmZsb3dcbiAgLyoqXG4gICogV2hldGhlciBvciBub3QgdGhlIGF4aXMgbGFiZWxzIGFyZSBmb3IgY2F0ZWdvcmljYWwgZGF0YS4gSWYgZmFsc2UsXG4gICogd2lsbCB1c2Uge0BsaW5rIGF4aXMjc2NhbGV9IHRvIHBvc2l0aW9uIHRpY2tzLlxuICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NhdGVnb3JpY2FsUT1mYWxzZV1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgY2F0ZWdvcmljYWxRID0gZmFsc2UsIC8vIHdoZXRoZXIgb3Igbm90IHRoZSBheGlzIGlzIHNob3dpbmcgdmFsdWVzIG9yIGdyb3Vwc1xuICAvKipcbiAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgYXhpcyB0aWNrcyBzaG91bGQgaGF2ZSBndWlkZWxpbmVzXG4gICogQHBhcmFtIHtib29sZWFufSBbY2F0ZWdvcmljYWxRPWZhbHNlXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBndWlkZUxpbmVzUSA9IGZhbHNlLCAgICAvLyB3aGV0aGVyIG9yIG5vdCB0byBhbGxvdyBvdmVyZmxvd1xuXG5cbiAgLyoqXG4gICogSG93IHRvIGdyb3VwIHRoZSB0aWNrIGxhYmVsc1xuICAqIEBwYXJhbSB7QXJyYXlbXX0gW2dyb3VwaW5nPXVuZGVmaW5lZF0gbGlzdCBvZiBwdXRhdGl2ZWx5IG90aGVyIGxpc3RzLCB3aGljaCBzaG91bGQgY29ycmVzcG9uZCB0byB0aWNrTGFiZWxzXG4gICogd2lsbCBzcGFjZSB0aWNrIGxhYmVscyBpbiBuZXN0ZWQgbGlzdHMgY2xvc2VyIHRvZ2V0aGVyIHRoYW4gb3V0ZXIgbGlzdHNcbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZ3JvdXBpbmcsXG5cbiAgLyoqXG4gICogVGhlIHNjYWxlIGZvciB3aGljaCBub24tY2F0ZWdvcmlhbCAoc2VlIHtAbGluayBheGlzI2NhdGVnb3JpY2FsUX0pIHRpY2tzIHNob3VsZCBiZSBzcGFjZWRcbiAgKiBAcGFyYW0ge2QzLnNjYWxlfSBbc2NhbGU9ZDMuc2NhbGVMaW5lYXJdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG5cbiAgc2NhbGUgPSBkMy5zY2FsZUxpbmVhcigpLFxuICAvKipcbiAgKiBUaGUgcGFkZGluZyBmb3IgdGhlIGRvbWFpbiBvZiB0aGUgc2NhbGUgKHNlZSB7QGxpbmsgYXhpcyNzY2FsZX0pXG4gICogQHBhcmFtIHtkMy5zY2FsZX0gW3NjYWxlPWQzLnNjYWxlTGluZWFyXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBkb21haW5QYWRkaW5nID0gMC41LFxuXG5cbiAgLyoqXG4gICogRGVmYXVsdCBzcGFjZSBmb3IgdGhlIHNwYWNlciAocGVyY2VudGFnZSkgb2YgbWFpbiBkaW1lbnNpb24gZ2l2ZW4gdGhlIG9yaWVudGF0aW9uXG4gICogKHNlZSB7QGxpbmsgYXhpcyNvcmllbnR9KSwgd2hlcmUge0BsaW5rIGF4aXMjb3JpZW50fT1cImJvdHRvbVwiIG9yIHtAbGluayBheGlzI29yaWVudH09XCJ0b3BcIlxuICAqIHRoZSBtYWluIGRpbWVuc2lvbiBpcyB7QGxpbmsgYXhpcyNzcGFjZVh9IGFuZCB3aGVyZSB7QGxpbmsgYXhpcyNvcmllbnR9PVwibGVmdFwiIG9yIHtAbGluayBheGlzI29yaWVudH09XCJyaWdodFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBheGlzI3NwYWNlWX1iZXR3ZWVuIHRpY2tzXG4gICogQHBhcmFtIHtudW1iZXJ9IFtvYmplY3RTcGFjZXI9MC4wNV1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb2JqZWN0U3BhY2VyID0gMC4wNSxcbiAgLyoqXG4gICogVGhlIG1pbmltdW0gc2l6ZSB0aGF0IGFuIG9iamVjdCBjYW4gYmUgaWYge0BsaW5rIGF4aXMjY2F0ZWdvcmljYWxRfSBpcyBzZXQgdG8gdHJ1ZVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbbWluT2JqZWN0U2l6ZT0xNV1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgbWluT2JqZWN0U2l6ZSA9IDE1LFxuICAvKipcbiAgKiBUaGUgbWF4aW11bSBzaXplIHRoYXQgYW4gb2JqZWN0IGNhbiBiZSBpZiB7QGxpbmsgYXhpcyNjYXRlZ29yaWNhbFF9IGlzIHNldCB0byB0cnVlXG4gICogQHBhcmFtIHtudW1iZXJ9IFttYXhPYmplY3RTaXplPTE1XVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBtYXhPYmplY3RTaXplID0gNTAsXG5cbiAgLyoqXG4gICogQ29sb3Igb2YgdGhlIGJhY2tncm91bmRcbiAgKiBAcGFyYW0ge3N0cmluZ30gW2JhY2tncm91bmRGaWxsPVwidHJhbnNwYXJlbnRcIl1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgYmFja2dyb3VuZEZpbGwgPSAndHJhbnNwYXJlbnQnLFxuICAvKipcbiAgKiBOYW1lc3BhY2UgZm9yIGFsbCBpdGVtcyBtYWRlIGJ5IHRoaXMgaW5zdGFuY2Ugb2YgYXhpc1xuICAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZXNwYWNlPVwiZDNzbS1heGlzXCJdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG5hbWVzcGFjZSA9ICdkM3NtLWF4aXMnLFxuICAvKipcbiAgKiBDbGFzcyBuYW1lIGZvciB0aWNrIGNvbnRhaW5lciAoPGc+IGVsZW1lbnQpXG4gICogQHBhcmFtIHtzdHJpbmd9IFtvYmplY3RDbGFzcz1cInRpY2stZ3JvdXBcIl1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb2JqZWN0Q2xhc3MgPSAndGljay1ncm91cCcsXG5cbiAgLyoqXG4gICogVmFsdWVzIHRvIHNob3cgYXQgZWFjaCB0aWNrLiBPbmx5IHVzZWQgaWYgY2F0ZWdvcmljYWxRIGlzIHNldCB0cnVlLiBTZWUge0BsaW5rIGF4aXMjY2F0ZWdvcmljYWxRfVxuICAqIEBwYXJhbSB7c3RyaW5nW119IFt0aWNrTGFiZWxzPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdGlja0xhYmVscywgICAvLyB3aGF0IHRvIHBsYWNlIGF0IHRpY2tzXG4gIC8qKlxuICAqIFZhbHVlcyB0byBzaG93IGF0IGVhY2ggdGljay4gT25seSB1c2VkIGlmIGNhdGVnb3JpY2FsUSBpcyBzZXQgZmFsc2UuIFNlZSB7QGxpbmsgYXhpcyNjYXRlZ29yaWNhbFF9XG4gICogQHBhcmFtIHtzdHJpbmdbXSB8IG51bWJlcltdfSBbb2JqZWN0Q2xhc3M9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB0aWNrVmFsdWVzLCAgIC8vIHdoZXJlIHRvIHBsYWNlIHRpY2tzIGlmIG5vdFxuICAvKipcbiAgKiBOdW1iZXIgb2YgdGlja3MgdG8gZGlzcGxheSBpZiBjYXRlZ29yaWNhbFEgaXMgZmFsc2UuIFNlZSB7QGxpbmsgYXhpcyNjYXRlZ29yaWNhbFF9XG4gICogQHBhcmFtIHtudW1iZXJ9IFtudW1iZXJPZlRpY2tzPTVdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG51bWJlck9mVGlja3MgPSA1LFxuXG5cbiAgLyoqXG4gICogU3Ryb2tlIGNvbG9yIG9mIHRoZSBtYWluIGF4aXMgbGluZVxuICAqIEBwYXJhbSB7c3RyaW5nfSBbbGluZVN0cm9rZT0nYmxhY2snXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBsaW5lU3Ryb2tlID0gJ2JsYWNrJyxcbiAgLyoqXG4gICogU3Ryb2tlIHdpZHRoIG9mIHRoZSBtYWluIGF4aXMgbGluZVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbbGluZVN0cm9rZVdpZHRoPTNdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGxpbmVTdHJva2VXaWR0aCA9IDMsXG5cblxuICAvKipcbiAgKiBTdHJva2UgY29sb3Igb2YgdGlja3NcbiAgKiBAcGFyYW0ge3N0cmluZ30gW3RpY2tTdHJva2U9J2JsYWNrJ11cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdGlja1N0cm9rZSA9ICdibGFjaycsXG4gIC8qKlxuICAqIFN0cm9rZSBudW1iZXIgb2YgdGlja3NcbiAgKiBAcGFyYW0ge3N0cmluZ30gW3RpY2tTdHJva2VXaWR0aD0yXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB0aWNrU3Ryb2tlV2lkdGggPSAyLFxuICAvKipcbiAgKiBMZW5ndGggLSBpbiBwaXhlbHMgLSBvZiB0aWNrc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbdGlja0xlbmd0aD0xMF1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdGlja0xlbmd0aCA9IDEwLFxuXG5cbiAgLyoqXG4gICogRm9udCBzaXplIG9mIHRpY2sgbGFiZWxzXG4gICogQHBhcmFtIHtudW1iZXJ9IFt0aWNrTGFiZWxGb250U2l6ZT0xNF1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdGlja0xhYmVsRm9udFNpemUgPSAxNCxcbiAgLyoqXG4gICogTWluIGZvbnQgc2l6ZSBvZiB0aWNrIGxhYmVsc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbdGlja0xhYmVsTWluRm9udFNpemU9OF1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdGlja0xhYmVsTWluRm9udFNpemUgPSA4LFxuICAvKipcbiAgKiBNYXggZm9udCBzaXplIG9mIHRpY2sgbGFiZWxzXG4gICogQHBhcmFtIHtudW1iZXJ9IFt0aWNrTGFiZWxNYXhGb250U2l6ZT0yMF1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdGlja0xhYmVsTWF4Rm9udFNpemUgPSAyMCxcblxuXG4gIC8qKlxuICAqIFRleHQgYW5jaG9yIG9mIHRpY2sgbGFiZWxzXG4gICogQHBhcmFtIHtzdHJpbmd9IFt0aWNrTGFiZWxUZXh0QW5jaG9yPVwibWlkZGxlXCJdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHRpY2tMYWJlbFRleHRBbmNob3IgPSAnbWlkZGxlJyxcbiAgLyoqXG4gICogUm90YXRpb24gb2YgdGljayBsYWJlbHNcbiAgKiBAcGFyYW0ge251bWJlcn0gW3RpY2tMYWJlbFJvdGF0aW9uPTBdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHRpY2tMYWJlbFJvdGF0aW9uID0gMCxcbiAgLyoqXG4gICogT3B0aW9uYWwgZnVuY3Rpb24gZm9yIGV4dHJhY3RpbmcgdGhlIHRpY2sgbGFiZWwgZnJvbSBkYXRhXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW3RpY2tMYWJlbEZ1bmM9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB0aWNrTGFiZWxGdW5jID0gdW5kZWZpbmVkLFxuXG5cbiAgLyoqXG4gICogTGVuZ3RoIG9mIGd1aWRlbGluZXNcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbZ3VpZGVsaW5lU3BhY2U9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBndWlkZWxpbmVTcGFjZSxcbiAgLyoqXG4gICogU3Ryb2tlIGNvbG9yIG9mIGd1aWRsaW5lc1xuICAqIEBwYXJhbSB7c3RyaW5nfSBbZ3VpZGVsaW5lU3BhY2U9XCIjMzMzMzMzXCJdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGd1aWRlTGluZVN0cm9rZSA9ICcjMzMzMzMzJyxcbiAgLyoqXG4gICogU3Ryb2tlIHdpZHRoIG9mIGd1aWRsaW5lc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbZ3VpZGVsaW5lU3BhY2U9Ml1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZ3VpZGVMaW5lU3Ryb2tlV2lkdGggPSAyLFxuXG4gIC8qKlxuICAqIER1cmF0aW9uIG9mIGFsbCB0cmFuc2l0aW9ucyBvZiB0aGlzIGVsZW1lbnRcbiAgKiBAcGFyYW0ge251bWJlcn0gW3RyYW5zaXRpb25EdXJhdGlvbj0xMDAwXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB0cmFuc2l0aW9uRHVyYXRpb24gPSAxMDAwLFxuICAvKipcbiAgKiBFYXNpbmcgZnVuY3Rpb24gZm9yIHRyYW5zaXRpb25zXG4gICogQHBhcmFtIHtkMy5lYXNlfSBbZWFzZUZ1bmM9ZDMuZWFzZUV4cF1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZWFzZUZ1bmMgPSBkMy5lYXNlRXhwLFxuXG5cbiAgLyoqXG4gICogQ2xvc3VyZSB2YXJpYWJsZSBmb3IgZ2V0dGluZyBvYmplY3Qgc2l6ZSBhZnRlciBjYWxjdWxhdGlvblxuICAqIEBwYXJhbSB7bnVtYmVyfSBbb2JqZWN0U2l6ZT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG9iamVjdFNpemUsXG4gIC8qKlxuICAqIENsb3N1cmUgdmFyaWFibGUgZm9yIGdldHRpbmcgc3BhY2VyIHNpemUgYWZ0ZXIgY2FsY3VsYXRpb25cbiAgKiBAcGFyYW0ge251bWJlcn0gW3NwYWNlclNpemU9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzcGFjZXJTaXplLFxuXG4gIC8qKlxuICAqIERlY2ltYWwgcGVyY2lzaW9uIHRvIHJvdW5kIG51bWVyaWNhbCB0aWNrIGxhYmVscyB0b1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbcm91bmRUbz0yXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICByb3VuZFRvID0gMlxuXG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgc2VsZWN0aW9uIGluIHdoaWNoIGl0ZW1zIGFyZSBtYW5pcHVsYXRlZFxuICAgKiBAcGFyYW0ge2QzLnNlbGVjdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBkMy5zZWxlY3Rpb259XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNlbGVjdGlvbiA9IHNlbGVjdGlvblxuICAgKi9cbiAgYXhpcy5zZWxlY3Rpb24gPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNlbGVjdGlvbiA9IF8sIGF4aXMpIDogc2VsZWN0aW9uOyB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIG9yaWVudGF0aW9uIGluIHdoaWNoIGl0ZW1zIGFyZSBtYW5pcHVsYXRlZFxuICAgKiAoc2VlIHtAbGluayBheGlzI29yaWVudH0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXSBzaG91bGQgYmUgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbFxuICAgKiBAcmV0dXJucyB7YXhpcyB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgb3JpZW50PVwiYm90dG9tXCJcbiAgICovXG4gIGF4aXMub3JpZW50ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvcmllbnQgPSBfLCBheGlzKSA6IG9yaWVudDsgfTtcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgYW1vdW50IG9mIGhvcml6b250YWwgc3BhY2UgaW4gd2hpY2ggaXRlbXMgYXJlIG1hbmlwdWxhdGVkXG4gICAqIChzZWUge0BsaW5rIGF4aXMjc3BhY2VYfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdIHNob3VsZCBiZSBhIG51bWJlciA+IDBcbiAgICogQHJldHVybnMge2F4aXMgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNwYWNlWCA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYXhpcy5zcGFjZVggPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNwYWNlWCA9IF8sIGF4aXMpIDogc3BhY2VYOyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBhbW91bnQgb2YgdmVydGljYWwgc3BhY2UgaW4gd2hpY2ggaXRlbXMgYXJlIG1hbmlwdWxhdGVkXG4gICAqIChzZWUge0BsaW5rIGF4aXMjc3BhY2VZfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdIHNob3VsZCBiZSBhIG51bWJlciA+IDBcbiAgICogQHJldHVybnMge2F4aXMgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNwYWNlWSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYXhpcy5zcGFjZVkgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNwYWNlWSA9IF8sIGF4aXMpIDogc3BhY2VZOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHdoZXRoZXIgb3Igbm90IGF4aXMgaXMgYWxsb3dlZCB0byBnbyBiZXlvbmQgc3BlY2lmaWVkIGRpbWVuc2lvbnNcbiAgICogKHNlZSB7QGxpbmsgYXhpcyNzcGFjZVh9KVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgYm9vbGVhbn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgb3ZlcmZsb3dRID0gZmFsc2VcbiAgICovXG4gIGF4aXMub3ZlcmZsb3dRID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvdmVyZmxvd1EgPSBfLCBheGlzKSA6IG92ZXJmbG93UTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHdoZXRoZXIgb3Igbm90IGF4aXMgd2lsbCBkaXNwbGF5IGNhdGVnb3JpYWwgdGlja3Mgb3IgYnkgbnVtZXJpY2FsIHZhbHVlXG4gICAqIChzZWUge0BsaW5rIGF4aXMjY2F0ZWdvcmljYWxRfSlcbiAgICogQHBhcmFtIHtib29sZWFufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IGJvb2xlYW59XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGNhdGVnb3JpY2FsUSA9IGZhbHNlXG4gICAqL1xuICBheGlzLmNhdGVnb3JpY2FsUSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY2F0ZWdvcmljYWxRID0gXywgYXhpcykgOiBjYXRlZ29yaWNhbFE7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB3aGV0aGVyIG9yIG5vdCBheGlzIHRpY2tzIHNob3VsZCBoYXZlIGd1aWRlbGluZXNcbiAgICogKHNlZSB7QGxpbmsgYXhpcyNndWlkZUxpbmVzUX0pXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBib29sZWFufVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBndWlkZUxpbmVzUSA9IGZhbHNlXG4gICAqL1xuICBheGlzLmd1aWRlTGluZXNRID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChndWlkZUxpbmVzUSA9IF8sIGF4aXMpIDogZ3VpZGVMaW5lc1E7IH07XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgaG93IHRpY2tzIHNob3VsZCBiZSBncm91cHBlZFxuICAgKiAoc2VlIHtAbGluayBheGlzI2dyb3VwaW5nfSlcbiAgICogQHBhcmFtIHtBcnJheVtdfSBbXz1ub25lXSBsaXN0IG9mIHB1dGF0aXZlbHkgb3RoZXIgbGlzdHMsIHdoaWNoIHNob3VsZCBjb3JyZXNwb25kIHRvIHRpY2tMYWJlbHNcbiAgICogd2lsbCBzcGFjZSB0aWNrIGxhYmVscyBpbiBuZXN0ZWQgbGlzdHMgY2xvc2VyIHRvZ2V0aGVyIHRoYW4gb3V0ZXIgbGlzdHNcbiAgICogQHJldHVybnMge2F4aXMgfCBBcnJheVtdfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBncm91cGluZyA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYXhpcy5ncm91cGluZyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZ3JvdXBpbmcgPSBfLCBheGlzKSA6IGdyb3VwaW5nOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBzY2FsZSBmb3Igd2hpY2ggbm9uLWNhdGVnb3JpYWwgIHRpY2tzIHNob3VsZFxuICAgKiBiZSBzcGFjZWRcbiAgICogKHNlZSB7QGxpbmsgYXhpcyNzY2FsZX0pXG4gICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgZDMuc2NhbGV9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKVxuICAgKi9cbiAgYXhpcy5zY2FsZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2NhbGUgPSBfLCBheGlzKSA6IHNjYWxlOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHBhZGRpbmcgZm9yIHRoZSBkb21haW4gb2YgdGhlIHNjYWxlXG4gICAqIChzZWUge0BsaW5rIGF4aXMjZG9tYWluUGFkZGluZ30pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgZG9tYWluUGFkZGluZyA9IDAuNVxuICAgKi9cbiAgYXhpcy5kb21haW5QYWRkaW5nID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkb21haW5QYWRkaW5nID0gXywgYXhpcykgOiBkb21haW5QYWRkaW5nOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIG9iamVjdFNwYWNlclxuICAgKiAoc2VlIHtAbGluayBheGlzI29iamVjdFNwYWNlcn0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgb2JqZWN0U3BhY2VyID0gMC4wNVxuICAgKi9cbiAgYXhpcy5vYmplY3RTcGFjZXIgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9iamVjdFNwYWNlciA9IF8sIGF4aXMpIDogb2JqZWN0U3BhY2VyOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG1pbk9iamVjdFNpemVcbiAgICogKHNlZSB7QGxpbmsgYXhpcyNtaW5PYmplY3RTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBtaW5PYmplY3RTaXplID0gMTVcbiAgICovXG4gIGF4aXMubWluT2JqZWN0U2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobWluT2JqZWN0U2l6ZSA9IF8sIGF4aXMpIDogbWluT2JqZWN0U2l6ZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBtYXhPYmplY3RTaXplXG4gICAqIChzZWUge0BsaW5rIGF4aXMjbWF4T2JqZWN0U2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgbWF4T2JqZWN0U2l6ZSA9IDUwXG4gICAqL1xuICBheGlzLm1heE9iamVjdFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG1heE9iamVjdFNpemUgPSBfLCBheGlzKSA6IG1heE9iamVjdFNpemU7IH07XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG5hbWVzcGFjZVxuICAgKiAoc2VlIHtAbGluayBheGlzI25hbWVzcGFjZX0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgbmFtZXNwYWNlID0gJ2Qzc20tYXhpcydcbiAgICovXG4gIGF4aXMubmFtZXNwYWNlID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChuYW1lc3BhY2UgPSBfLCBheGlzKSA6IG5hbWVzcGFjZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBiYWNrZ3JvdW5kRmlsbFxuICAgKiAoc2VlIHtAbGluayBheGlzI2JhY2tncm91bmRGaWxsfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBiYWNrZ3JvdW5kRmlsbCA9ICd0cmFuc3BhcmVudCdcbiAgICovXG4gIGF4aXMuYmFja2dyb3VuZEZpbGwgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGJhY2tncm91bmRGaWxsID0gXywgYXhpcykgOiBiYWNrZ3JvdW5kRmlsbDsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBvYmplY3RDbGFzc1xuICAgKiAoc2VlIHtAbGluayBheGlzI29iamVjdENsYXNzfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvYmplY3RDbGFzcyA9ICd0aWNrLWdyb3VwJ1xuICAgKi9cbiAgYXhpcy5vYmplY3RDbGFzcyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob2JqZWN0Q2xhc3MgPSBfLCBheGlzKSA6IG9iamVjdENsYXNzOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB0aWNrTGFiZWxzXG4gICAqIChzZWUge0BsaW5rIGF4aXMjdGlja0xhYmVsc30pXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgc3RyaW5nW119XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHRpY2tMYWJlbHMgPSB1bmRlZmluZWRcbiAgICovXG4gIGF4aXMudGlja0xhYmVscyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja0xhYmVscyA9IF8sIGF4aXMpIDogdGlja0xhYmVsczsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB0aWNrVmFsdWVzXG4gICAqIChzZWUge0BsaW5rIGF4aXMjdGlja1ZhbHVlc30pXG4gICAqIEBwYXJhbSB7bnVtYmVyW119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgbnVtYmVyW119XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHRpY2tWYWx1ZXMgPSB1bmRlZmluZWRcbiAgICovXG4gIGF4aXMudGlja1ZhbHVlcyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja1ZhbHVlcyA9IF8sIGF4aXMpIDogdGlja1ZhbHVlczsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB0aWNrVmFsdWVzXG4gICAqIChzZWUge0BsaW5rIGF4aXMjbnVtYmVyT2ZUaWNrc30pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgbnVtYmVyT2ZUaWNrcyA9IDVcbiAgICovXG4gIGF4aXMubnVtYmVyT2ZUaWNrcyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobnVtYmVyT2ZUaWNrcyA9IF8sIGF4aXMpIDogbnVtYmVyT2ZUaWNrczsgfTtcblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbGluZVN0cm9rZVxuICAgKiAoc2VlIHtAbGluayBheGlzI2xpbmVTdHJva2V9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGxpbmVTdHJva2UgPSAnYmxhY2snXG4gICAqL1xuICBheGlzLmxpbmVTdHJva2UgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGxpbmVTdHJva2UgPSBfLCBheGlzKSA6IGxpbmVTdHJva2U7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbGluZVN0cm9rZVdpZHRoXG4gICAqIChzZWUge0BsaW5rIGF4aXMjbGluZVN0cm9rZVdpZHRofSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBsaW5lU3Ryb2tlV2lkdGggPSAzXG4gICAqL1xuICBheGlzLmxpbmVTdHJva2VXaWR0aCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobGluZVN0cm9rZVdpZHRoID0gXywgYXhpcykgOiBsaW5lU3Ryb2tlV2lkdGg7IH07XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRpY2tTdHJva2VcbiAgICogKHNlZSB7QGxpbmsgYXhpcyN0aWNrU3Ryb2tlfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0aWNrU3Ryb2tlID0gJ2JsYWNrJ1xuICAgKi9cbiAgYXhpcy50aWNrU3Ryb2tlID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrU3Ryb2tlID0gXywgYXhpcykgOiB0aWNrU3Ryb2tlOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRpY2tTdHJva2VXaWR0aFxuICAgKiAoc2VlIHtAbGluayBheGlzI3RpY2tTdHJva2VXaWR0aH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdGlja1N0cm9rZVdpZHRoID0gMlxuICAgKi9cbiAgYXhpcy50aWNrU3Ryb2tlV2lkdGggPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tTdHJva2VXaWR0aCA9IF8sIGF4aXMpIDogdGlja1N0cm9rZVdpZHRoOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRpY2tMZW5ndGhcbiAgICogKHNlZSB7QGxpbmsgYXhpcyN0aWNrTGVuZ3RofSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0aWNrTGVuZ3RoID0gMTBcbiAgICovXG4gIGF4aXMudGlja0xlbmd0aCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja0xlbmd0aCA9IF8sIGF4aXMpIDogdGlja0xlbmd0aDsgfTtcblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdGlja0xhYmVsRm9udFNpemVcbiAgICogKHNlZSB7QGxpbmsgYXhpcyN0aWNrTGFiZWxGb250U2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdGlja0xhYmVsRm9udFNpemUgPSAxNFxuICAgKi9cbiAgYXhpcy50aWNrTGFiZWxGb250U2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja0xhYmVsRm9udFNpemUgPSBfLCBheGlzKSA6IHRpY2tMYWJlbEZvbnRTaXplOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRpY2tMYWJlbE1pbkZvbnRTaXplXG4gICAqIChzZWUge0BsaW5rIGF4aXMjdGlja0xhYmVsTWluRm9udFNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHRpY2tMYWJlbE1pbkZvbnRTaXplID0gOFxuICAgKi9cbiAgYXhpcy50aWNrTGFiZWxNaW5Gb250U2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja0xhYmVsTWluRm9udFNpemUgPSBfLCBheGlzKSA6IHRpY2tMYWJlbE1pbkZvbnRTaXplOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRpY2tMYWJlbE1heEZvbnRTaXplXG4gICAqIChzZWUge0BsaW5rIGF4aXMjdGlja0xhYmVsTWF4Rm9udFNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHRpY2tMYWJlbE1heEZvbnRTaXplID0gMjBcbiAgICovXG4gIGF4aXMudGlja0xhYmVsTWF4Rm9udFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tMYWJlbE1heEZvbnRTaXplID0gXywgYXhpcykgOiB0aWNrTGFiZWxNYXhGb250U2l6ZTt9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB0aWNrTGFiZWxUZXh0QW5jaG9yXG4gICAqIChzZWUge0BsaW5rIGF4aXMjdGlja0xhYmVsVGV4dEFuY2hvcn0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdGlja0xhYmVsVGV4dEFuY2hvciA9ICdjZW50ZXInXG4gICAqL1xuICBheGlzLnRpY2tMYWJlbFRleHRBbmNob3IgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tMYWJlbFRleHRBbmNob3IgPSBfLCBheGlzKSA6IHRpY2tMYWJlbFRleHRBbmNob3I7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdGlja0xhYmVsUm90YXRpb25cbiAgICogKHNlZSB7QGxpbmsgYXhpcyN0aWNrTGFiZWxSb3RhdGlvbn0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdGlja0xhYmVsUm90YXRpb24gPSAwXG4gICAqL1xuICBheGlzLnRpY2tMYWJlbFJvdGF0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrTGFiZWxSb3RhdGlvbiA9IF8sIGF4aXMpIDogdGlja0xhYmVsUm90YXRpb247IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdGlja0xhYmVsRnVuY1xuICAgKiAoc2VlIHtAbGluayBheGlzI3RpY2tMYWJlbEZ1bmN9KVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IGZ1bmN0aW9ufVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0aWNrTGFiZWxGdW5jID0gdW5kZWZpbmVkXG4gICAqL1xuICBheGlzLnRpY2tMYWJlbEZ1bmMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tMYWJlbEZ1bmMgPSBfLCBheGlzKSA6IHRpY2tMYWJlbEZ1bmM7IH07XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGd1aWRlbGluZVNwYWNlXG4gICAqIChzZWUge0BsaW5rIGF4aXMjZ3VpZGVsaW5lU3BhY2V9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGd1aWRlbGluZVNwYWNlID0gdW5kZWZpbmVkXG4gICAqL1xuICBheGlzLmd1aWRlbGluZVNwYWNlID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChndWlkZWxpbmVTcGFjZSA9IF8sIGF4aXMpIDogZ3VpZGVsaW5lU3BhY2U7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgZ3VpZGVMaW5lU3Ryb2tlXG4gICAqIChzZWUge0BsaW5rIGF4aXMjZ3VpZGVMaW5lU3Ryb2tlfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBndWlkZUxpbmVTdHJva2UgPSBcIiMzMzMzMzNcIlxuICAgKi9cbiAgYXhpcy5ndWlkZUxpbmVTdHJva2UgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGd1aWRlTGluZVN0cm9rZSA9IF8sIGF4aXMpIDogZ3VpZGVMaW5lU3Ryb2tlOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGd1aWRlTGluZVN0cm9rZVdpZHRoXG4gICAqIChzZWUge0BsaW5rIGF4aXMjZ3VpZGVMaW5lU3Ryb2tlV2lkdGh9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGd1aWRlTGluZVN0cm9rZVdpZHRoID0gMlxuICAgKi9cbiAgYXhpcy5ndWlkZUxpbmVTdHJva2VXaWR0aCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZ3VpZGVMaW5lU3Ryb2tlV2lkdGggPSBfLCBheGlzKSA6IGd1aWRlTGluZVN0cm9rZVdpZHRoOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB0cmFuc2l0aW9uRHVyYXRpb25cbiAgICogKHNlZSB7QGxpbmsgYXhpcyN0cmFuc2l0aW9uRHVyYXRpb259KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHRyYW5zaXRpb25EdXJhdGlvbiA9IDEwMDBcbiAgICovXG4gIGF4aXMudHJhbnNpdGlvbkR1cmF0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0cmFuc2l0aW9uRHVyYXRpb24gPSBfLCBheGlzKSA6IHRyYW5zaXRpb25EdXJhdGlvbjsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBlYXNlRnVuY1xuICAgKiAoc2VlIHtAbGluayBheGlzI2Vhc2VGdW5jfSlcbiAgICogQHBhcmFtIHtkMy5lYXNlfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IGQzLmVhc2V9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGVhc2VGdW5jID0gZDMuZWFzZUV4cFxuICAgKi9cbiAgYXhpcy5lYXNlRnVuYyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZWFzZUZ1bmMgPSBfLCBheGlzKSA6IGVhc2VGdW5jOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBvYmplY3RTaXplXG4gICAqIChzZWUge0BsaW5rIGF4aXMjb2JqZWN0U2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgb2JqZWN0U2l6ZSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYXhpcy5vYmplY3RTaXplID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvYmplY3RTaXplID0gXywgYXhpcykgOiBvYmplY3RTaXplOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNwYWNlclNpemVcbiAgICogKHNlZSB7QGxpbmsgYXhpcyNzcGFjZXJTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzcGFjZXJTaXplID0gdW5kZWZpbmVkXG4gICAqL1xuICBheGlzLnNwYWNlclNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNwYWNlclNpemUgPSBfLCBheGlzKSA6IHNwYWNlclNpemU7IH07XG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSByb3VuZFRvXG4gICAqIChzZWUge0BsaW5rIGF4aXMjcm91bmRUb30pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgcm91bmRUbyA9IDJcbiAgICovXG4gIGF4aXMucm91bmRUbyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocm91bmRUbyA9IF8sIGF4aXMpIDogcm91bmRUbzsgfTtcblxuXG5cbiAgZnVuY3Rpb24gYXhpcyAoKSB7XG4gICAgLy8gZm9yIGNvbnZlbmllbmNlIGluIGhhbmRsaW5nIG9yaWVudGF0aW9uIHNwZWNpZmljIHZhbHVlc1xuICAgIHZhciBob3Jpem9udGFsUSA9IGhhc1EoWyd0b3AnLCAnYm90dG9tJywgJ2hvcml6b250YWwnXSxvcmllbnQpID8gdHJ1ZSA6IGZhbHNlXG4gICAgdmFyIHZlcnRpY2FsUSA9ICFob3Jpem9udGFsUVxuXG4gICAgLy8gYmFja2dyb3VuZCBjbGlwaW5nIHJlY3RhbmdsZVxuICAgIHZhciBiZ2NwUmVjdCA9IHt4OjAsIHk6MCwgd2lkdGg6IHNwYWNlWCwgaGVpZ2h0OnNwYWNlWX1cbiAgICBpZiAob3JpZW50ID09IFwibGVmdFwiKSB7IGJnY3BSZWN0LnggLT0gc3BhY2VYOyAgaWYoZ3VpZGVMaW5lc1EpIHsgYmdjcFJlY3Qud2lkdGggKz0gZ3VpZGVsaW5lU3BhY2UgfTsgYmdjcFJlY3QueSAtPSB0aWNrTGFiZWxNYXhGb250U2l6ZTsgYmdjcFJlY3QuaGVpZ2h0ICs9IDIqdGlja0xhYmVsTWF4Rm9udFNpemUgIH1cbiAgICBpZiAob3JpZW50ID09IFwiYm90dG9tXCIpeyBiZ2NwUmVjdC55ID0gYmdjcFJlY3QueTtcbiAgICAgIGlmKGd1aWRlTGluZXNRKSB7IGJnY3BSZWN0LnkgLT0gZ3VpZGVsaW5lU3BhY2U7IGJnY3BSZWN0LmhlaWdodCArPSBndWlkZWxpbmVTcGFjZTsgfTtcbiAgICAgIGJnY3BSZWN0LnggLT0gdGlja0xhYmVsTWF4Rm9udFNpemU7IGJnY3BSZWN0LndpZHRoICs9IDIqdGlja0xhYmVsTWF4Rm9udFNpemVcblxuICAgIH1cbiAgICBpZiAob3JpZW50ID09IFwidG9wXCIpIHsgYmdjcFJlY3QueSAtPSBzcGFjZVk7XG4gICAgICBpZihndWlkZUxpbmVzUSkgeyBiZ2NwUmVjdC5oZWlnaHQgKz0gZ3VpZGVsaW5lU3BhY2UgfTtcbiAgICAgIC8vIGJnY3BSZWN0LnkgLT0gdGlja0xhYmVsTWF4Rm9udFNpemU7IGJnY3BSZWN0LmhlaWdodCArPSAyKnRpY2tMYWJlbE1heEZvbnRTaXplXG4gICAgfVxuICAgIGlmIChvcmllbnQgPT0gXCJyaWdodFwiKSB7IGJnY3BSZWN0LnggPSAwO1xuICAgICAgaWYoZ3VpZGVMaW5lc1EpIHsgYmdjcFJlY3Qud2lkdGggKz0gZ3VpZGVsaW5lU3BhY2U7IGJnY3BSZWN0LnggLT0gZ3VpZGVsaW5lU3BhY2UgfTtcbiAgICAgIGJnY3BSZWN0LnkgLT0gdGlja0xhYmVsTWF4Rm9udFNpemU7IGJnY3BSZWN0LmhlaWdodCArPSAyKnRpY2tMYWJlbE1heEZvbnRTaXplXG4gICAgICBjb25zb2xlLmxvZyhiZ2NwUmVjdClcbiAgICB9XG5cblxuICAgIHZhciBjb250YWluZXIgPSBzZXR1cENvbnRhaW5lciggc2VsZWN0aW9uLCBuYW1lc3BhY2UsIGJnY3BSZWN0LCBiYWNrZ3JvdW5kRmlsbCApO1xuXG4gICAgLy8gdmFyIHRpY2tzID0gIHNhZmVTZWxlY3QoY29udGFpbmVyLCAnZycsIGh5cGVuYXRlKG5hbWVzcGFjZSwnYXhpcy10aWNrcycpKVxuICAgIC8vIHZhciBsYWJlbHMgPSAgc2FmZVNlbGVjdChjb250YWluZXIsICdnJywgaHlwZW5hdGUobmFtZXNwYWNlLCdheGlzLWxhYmVscycpKVxuICAgIC8vIHZhciBndWlkbGluZXMgPSAgc2FmZVNlbGVjdChjb250YWluZXIsICdnJywgaHlwZW5hdGUobmFtZXNwYWNlLCdndWlkZWxpbmUtY29udGFpbmVyJykpXG4gICAgLy9cbiAgICAvLyB2YXIgdGlja3MgPSB0aWNrcy5zZWxlY3RBbGwoJy4nK2h5cGVuYXRlKG5hbWVzcGFjZSwndGljaycpKVxuICAgIC8vIHZhciBsYWJlbHMgPSBsYWJlbHMuc2VsZWN0QWxsKCcuJytoeXBlbmF0ZShuYW1lc3BhY2UsJ2xhYmVsJykpXG4gICAgLy8gdmFyIGdsaW5lcyA9IGd1aWRsaW5lcy5zZWxlY3RBbGwoJy4nK2h5cGVuYXRlKG5hbWVzcGFjZSwnZ3VpZGVsaW5lJykpXG5cbiAgICBpZiAob3JpZW50ID09ICd0b3AnKSB7dGlja0xhYmVsVGV4dEFuY2hvciA9ICdzdGFydCc7IHRpY2tMYWJlbFJvdGF0aW9uID0gOTB9XG4gICAgaWYgKG9yaWVudCA9PSAnYm90dG9tJykge3RpY2tMYWJlbFRleHRBbmNob3IgPSAnZW5kJzsgdGlja0xhYmVsUm90YXRpb24gPSAtOTB9XG4gICAgaWYgKG9yaWVudCA9PSAnbGVmdCcpIHt0aWNrTGFiZWxUZXh0QW5jaG9yID0gJ2VuZCc7IHRpY2tMYWJlbFJvdGF0aW9uID0gMH1cbiAgICBpZiAob3JpZW50ID09ICdyaWdodCcpIHt0aWNrTGFiZWxUZXh0QW5jaG9yID0gJ3N0YXJ0JzsgdGlja0xhYmVsUm90YXRpb24gPSAwfVxuXG5cbiAgICB2YXIgdGlja0RhdGEgPSBjYXRlZ29yaWNhbFFcbiAgICA/IChncm91cGluZyA9PSB1bmRlZmluZWQpID8gdGlja0xhYmVscyA6IGdyb3VwaW5nXG4gICAgOiAoZ3JvdXBpbmcgPT0gdW5kZWZpbmVkKVxuICAgICAgPyAobnVtYmVyT2ZUaWNrcyAhPSB1bmRlZmluZWQpXG4gICAgICAvLyA/ICh0aWNrVmFsdWVzLmxlbmd0aCA8IG51bWJlck9mVGlja3MpXG4gICAgICAgID8gKHRpY2tSYW5nZSguLi5kMy5leHRlbnQodGlja1ZhbHVlcyksIG51bWJlck9mVGlja3MpKVxuICAgICAgICA6IHRpY2tWYWx1ZXNcbiAgICAgIDogZ3JvdXBpbmdcblxuICAgIHZhciBmbGF0VGlja0RhdGEgPSBmbGF0dGVuKHRpY2tEYXRhKVxuICAgIHZhciBudW1iZXJPZk9iamVjdHMgPSBmbGF0VGlja0RhdGEubGVuZ3RoXG4gICAgdmFyIHNwYWNlID0gaG9yaXpvbnRhbFEgPyBzcGFjZVggOiBzcGFjZVlcbiAgICB2YXIgZXh0ZW50ID0gZDMuZXh0ZW50KGZsYXRUaWNrRGF0YSlcblxuICAgIHNjYWxlXG4gICAgLmRvbWFpbihbZXh0ZW50WzBdIC0gZG9tYWluUGFkZGluZywgZXh0ZW50WzFdICsgZG9tYWluUGFkZGluZ10pXG4gICAgLnJhbmdlKFtob3Jpem9udGFsUSA/IDAgOiBzcGFjZVksIGhvcml6b250YWxRID8gc3BhY2VYIDogMF0pXG5cbiAgICAvLyBjYWxjdWxhdGUgb2JqZWN0IHNpemVcbiAgICBvYmplY3RTaXplID0gKG9iamVjdFNpemUgPT0gdW5kZWZpbmVkKVxuICAgID8gY2FsY3VsYXRlV2lkdGhPZk9iamVjdChzcGFjZSwgbnVtYmVyT2ZPYmplY3RzLCBtaW5PYmplY3RTaXplLCBtYXhPYmplY3RTaXplLCBvYmplY3RTcGFjZXIsIG92ZXJmbG93USlcbiAgICA6IG9iamVjdFNpemVcblxuICAgIC8vIGNhbGN1bGF0ZSBzcGFjZXIgc2l6ZSBpZiBuZWVkZWRcbiAgICBzcGFjZXJTaXplID0gKHNwYWNlclNpemUgPT0gdW5kZWZpbmVkKVxuICAgID8gY2FsY3VsYXRlV2lkdGhPZlNwYWNlcihmbGF0VGlja0RhdGEsIHNwYWNlLCBvYmplY3RTaXplLCBudW1iZXJPZk9iamVjdHMsIG9iamVjdFNwYWNlciwgb3ZlcmZsb3dRKVxuICAgIDogc3BhY2VyU2l6ZVxuXG4gICAgdmFyIG9iakNsYXNzID0gaHlwZW5hdGUobmFtZXNwYWNlLCBjYXRlZ29yaWNhbFEgPyBvYmplY3RDbGFzcysnLWNhdGVnb3JpY2FsJyA6IG9iamVjdENsYXNzKVxuXG4gICAgdmFyIHNwYWNlckZ1bmN0aW9uID0gZ3JvdXBpbmdTcGFjZXIoKVxuICAgIC5ob3Jpem9udGFsUShob3Jpem9udGFsUSkuc2NhbGUoc2NhbGUpLm1vdmVieSgoY2F0ZWdvcmljYWxRPydjYXRlZ29yeSc6J3NjYWxlJykpLm51bWJlck9mT2JqZWN0cyhudW1iZXJPZk9iamVjdHMpXG4gICAgLm9iamVjdENsYXNzKG9iakNsYXNzKS5vYmplY3RTaXplKG9iamVjdFNpemUpLnNwYWNlclNpemUoc3BhY2VyU2l6ZSlcbiAgICAudHJhbnNpdGlvbkR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuZWFzZUZ1bmMoZWFzZUZ1bmMpXG4gICAgLm5hbWVzcGFjZShuYW1lc3BhY2UpXG5cbiAgICB2YXIgdGlja0VudGVyQW5pbWF0aW9uID0gZnVuY3Rpb24oc2VsKXtcbiAgICAgIHZhciBtdCA9IHNjYWxlKHNlbC5kYXR1bSgpKSxcbiAgICAgIGRpc3QgPSBzY2FsZShleHRlbnRbMV0pICogMixcbiAgICAgIGsgPSAobXQgPCBleHRlbnRbMV0gLyAyKSA/IDEgOiAtMVxuICAgICAgayA9IGhvcml6b250YWxRID8gayAqIC0xIDoga1xuICAgICAgc2VsLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uIChkLCBpKSB7XG4gICAgICAgIHZhclxuICAgICAgICB4ID0gaG9yaXpvbnRhbFEgPyAgZGlzdCAqIGsgOiAwLFxuICAgICAgICB5ID0gIWhvcml6b250YWxRID8gZGlzdCAqIGsgOiAwLFxuICAgICAgICB0ID0gJ3RyYW5zbGF0ZSgnK3grJywnK3krJyknXG4gICAgICAgIHJldHVybiB0XG4gICAgICB9KVxuICAgIH1cbiAgICB2YXIgdGlja0V4aXRBbmltYXRpb24gPSBmdW5jdGlvbihzZWwpIHtcbiAgICAgIHZhciBtdCA9IHNjYWxlKHNlbC5kYXR1bSgpKSxcbiAgICAgIGRpc3QgPSBzY2FsZShleHRlbnRbMV0pICogMixcbiAgICAgIGsgPSAobXQgPCBleHRlbnRbMV0gLyAyKSA/IDEgOiAtMVxuICAgICAgayA9IGhvcml6b250YWxRID8gayAqIC0xIDoga1xuICAgICAgc2VsLnRyYW5zaXRpb24oKS5kdXJhdGlvbih0cmFuc2l0aW9uRHVyYXRpb24pLmVhc2UoZWFzZUZ1bmMpXG4gICAgICAuc3R5bGUoJ29wYWNpdHknLCAwKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uIChkLCBpKSB7XG4gICAgICAgIHZhclxuXG4gICAgICAgIHggPSBob3Jpem9udGFsUSA/ICBkaXN0ICogayAgOiAwLFxuICAgICAgICB5ID0gIWhvcml6b250YWxRID8gZGlzdCAqIGsgOiAwLFxuICAgICAgICB0ID0gJ3RyYW5zbGF0ZSgnK3grJywnK3krJyknXG4gICAgICAgIHJldHVybiB0XG4gICAgICB9KS5yZW1vdmUoKVxuICAgIH1cblxuICAgIGlmICghY2F0ZWdvcmljYWxRKXtcbiAgICAgIHNwYWNlckZ1bmN0aW9uLmVudGVyRnVuY3Rpb24odGlja0VudGVyQW5pbWF0aW9uKVxuICAgICAgc3BhY2VyRnVuY3Rpb24uZXhpdEZ1bmN0aW9uKHRpY2tFeGl0QW5pbWF0aW9uKVxuICAgIH1cblxuXG5cbiAgICBzcGFjZXJGdW5jdGlvbihjb250YWluZXIsIHRpY2tEYXRhLCAwKVxuXG4gICAgZnVuY3Rpb24gbW92ZVhCeShkLCBpLCBob3Jpem9udGFsUSwgY2F0ZWdvcmljYWxRLCBvYmplY3RTaXplKXtcbiAgICAgIHJldHVybiAoaG9yaXpvbnRhbFEpXG4gICAgICA/IChjYXRlZ29yaWNhbFEpXG4gICAgICAgID8gb2JqZWN0U2l6ZSAvIDJcbiAgICAgICAgOiAwXG4gICAgICA6IDBcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb3ZlWUJ5KGQsIGksIHZlcnRpY2FsUSwgY2F0ZWdvcmljYWxRLCBvYmplY3RTaXplKXtcbiAgICAgIHJldHVybiAodmVydGljYWxRKVxuICAgICAgPyAoY2F0ZWdvcmljYWxRKVxuICAgICAgICA/IG9iamVjdFNpemUgLyAyXG4gICAgICAgIDogMFxuICAgICAgOiAwXG4gICAgfVxuXG4gICAgLy8gbWFrZU5lc3RlZEdyb3Vwcyhjb250YWluZXIsIHRpY2tEYXRhLCBob3Jpem9udGFsUSwgc2NhbGUsIChjYXRlZ29yaWNhbFE/J2NhdGVnb3J5Jzonc2NhbGUnKSxvYmpDbGFzcywgb2JqZWN0U2l6ZSwgc3BhY2VyU2l6ZSwgdW5kZWZpbmVkLCB0cmFuc2l0aW9uRHVyYXRpb24sIGVhc2VGdW5jKVxuXG4gICAgdmFyIHRpY2tzID0gY29udGFpbmVyLnNlbGVjdEFsbCgnZzpub3QoLnRvLXJlbW92ZSkuJytvYmpDbGFzcykuZWFjaChmdW5jdGlvbihkLCBpKXtcbiAgICAgIHZhciB0aGF0ID0gZDMuc2VsZWN0KHRoaXMpLnN0eWxlKCdvcGFjaXR5JywgMSlcblxuICAgICAgdmFyIHRpY2sgPSBzYWZlU2VsZWN0KHRoYXQsICdsaW5lJywgaHlwZW5hdGUobmFtZXNwYWNlLCd0aWNrJykpXG4gICAgICAuYXR0cihcIngxXCIsIDApXG4gICAgICAuYXR0cihcIngyXCIsIGhvcml6b250YWxRID8gMCA6IG9yaWVudCA9PSBcImxlZnRcIiA/IC10aWNrTGVuZ3RoIDogdGlja0xlbmd0aClcbiAgICAgIC5hdHRyKFwieTFcIiwgMClcbiAgICAgIC5hdHRyKCd5MicsICB2ZXJ0aWNhbFEgPyAwIDogb3JpZW50ID09IFwidG9wXCIgPyAtdGlja0xlbmd0aCA6IHRpY2tMZW5ndGgpXG4gICAgICAuYXR0cignc3Ryb2tlJywgdGlja1N0cm9rZSlcbiAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCB0aWNrU3Ryb2tlV2lkdGgpXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24oZCwgaSkge1xuICAgICAgICB2YXJcbiAgICAgICAgeCA9IG1vdmVYQnkoZCwgaSwgaG9yaXpvbnRhbFEsIGNhdGVnb3JpY2FsUSwgb2JqZWN0U2l6ZSksXG4gICAgICAgIHkgPSBtb3ZlWUJ5KGQsIGksIHZlcnRpY2FsUSwgY2F0ZWdvcmljYWxRLCBvYmplY3RTaXplKSxcbiAgICAgICAgdCA9ICd0cmFuc2xhdGUoJyt4KycsJyt5KycpJ1xuICAgICAgICByZXR1cm4gdFxuICAgICAgfSlcblxuICAgICAgdmFyIGxhYmVsID0gc2FmZVNlbGVjdCh0aGF0LCAndGV4dCcsIGh5cGVuYXRlKG5hbWVzcGFjZSwnbGFiZWwnKSlcbiAgICAgIC50ZXh0KGZ1bmN0aW9uKGQsIGkpeyByZXR1cm4gdHlwZW9mIGQgPT0gJ251bWJlcicgPyByb3VuZChkLCByb3VuZFRvKSA6IGR9KVxuICAgICAgLmF0dHIoJ2ZvbnQtc2l6ZScsIHRpY2tMYWJlbEZvbnRTaXplKVxuICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgdGlja0xhYmVsVGV4dEFuY2hvcilcblxuICAgICAgdHJ1bmNhdGVUZXh0KGxhYmVsLCBsYWJlbC50ZXh0KCksIG9yaWVudCwgdGlja0xlbmd0aCwgaG9yaXpvbnRhbFEgPyBzcGFjZVkgOiBzcGFjZVgsIG92ZXJmbG93USlcblxuICAgICAgbGFiZWwuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24oZCwgaSkge1xuICAgICAgICB2YXJcbiAgICAgICAgcmVjdCA9IGQzLnNlbGVjdCh0aGlzKS5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgIHggPSBtb3ZlWEJ5KGQsIGksIGhvcml6b250YWxRLCBjYXRlZ29yaWNhbFEsIG9iamVjdFNpemUpLFxuICAgICAgICB5ID0gbW92ZVlCeShkLCBpLCB2ZXJ0aWNhbFEsIGNhdGVnb3JpY2FsUSwgb2JqZWN0U2l6ZSlcbiAgICAgICAgLy8gb24gcmVjYWxsLCByZWN0IGNoYW5nZXMgYmVjYXVzZSBvZiByb3RhdGlvbiBzbyBuZWVkIE1hdGgubWluKHJlY3QuaGVpZ2h0LCByZWN0LndpZHRoKVxuXG4gICAgICAgIGlmIChvcmllbnQgPT0gJ3RvcCcpIHt5ID0gLXRpY2tMZW5ndGg7IHktPU1hdGgubWF4KHJlY3QuaGVpZ2h0LCByZWN0LndpZHRoKTt4IC09IE1hdGgubWluKHJlY3QuaGVpZ2h0LCByZWN0LndpZHRoKSAqIDAuMjV9XG4gICAgICAgIGlmIChvcmllbnQgPT0gJ2JvdHRvbScpIHt5ID0gdGlja0xlbmd0aDsgeCArPSBNYXRoLm1pbihyZWN0LmhlaWdodCwgcmVjdC53aWR0aCkgKiAwLjI1fVxuICAgICAgICBpZiAob3JpZW50ID09ICdsZWZ0Jykge3ggLT0gdGlja0xlbmd0aDsgIHkgKz0gcmVjdC5oZWlnaHQgKiAwLjU7IHktPSByZWN0LmhlaWdodC80IH1cbiAgICAgICAgaWYgKG9yaWVudCA9PSAncmlnaHQnKSB7eCArPSB0aWNrTGVuZ3RoOyB5ICs9IHJlY3QuaGVpZ2h0ICogMC41OyB5LT0gcmVjdC5oZWlnaHQvNH1cblxuICAgICAgICB2YXJcbiAgICAgICAgdCA9ICd0cmFuc2xhdGUoJyt4KycsJyt5KycpJyxcbiAgICAgICAgciA9ICdyb3RhdGUoJyt0aWNrTGFiZWxSb3RhdGlvbisnKSdcbiAgICAgICAgcmV0dXJuIHQgKyByXG4gICAgICB9KVxuXG5cbiAgICAgICBpZiAoZ3VpZGVMaW5lc1EpIHtcbiAgICAgICAgIHZhciBnbGluZSA9IHNhZmVTZWxlY3QodGhhdCwgJ2xpbmUnLCBoeXBlbmF0ZShuYW1lc3BhY2UsICdndWlkZWxpbmUnKSlcbiAgICAgICAgIC50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlKGVhc2VGdW5jKVxuICAgICAgICAgLmF0dHIoXCJ4MVwiLCAwKVxuICAgICAgICAgLmF0dHIoXCJ4MlwiLCBob3Jpem9udGFsUSA/IDAgOiBvcmllbnQgPT0gXCJsZWZ0XCIgPyBndWlkZWxpbmVTcGFjZSA6IC1ndWlkZWxpbmVTcGFjZSlcbiAgICAgICAgIC5hdHRyKFwieTFcIiwgMClcbiAgICAgICAgIC5hdHRyKCd5MicsICB2ZXJ0aWNhbFEgPyAwIDogb3JpZW50ID09IFwidG9wXCIgPyBndWlkZWxpbmVTcGFjZSA6IC1ndWlkZWxpbmVTcGFjZSlcbiAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbihkLCBpKSB7XG4gICAgICAgICAgIHZhclxuICAgICAgICAgICB4ID0gbW92ZVhCeShkLCBpLCBob3Jpem9udGFsUSwgY2F0ZWdvcmljYWxRLCBvYmplY3RTaXplKSxcbiAgICAgICAgICAgeSA9IG1vdmVZQnkoZCwgaSwgdmVydGljYWxRLCBjYXRlZ29yaWNhbFEsIG9iamVjdFNpemUpLFxuICAgICAgICAgICB0ID0gJ3RyYW5zbGF0ZSgnK3grJywnK3krJyknXG4gICAgICAgICAgIHJldHVybiB0XG4gICAgICAgICB9KVxuICAgICAgIH1cblxuICAgIH0pXG5cbiAgICBpZiAoZ3VpZGVMaW5lc1EpIHtcbiAgICAgIGNvbnRhaW5lci5zZWxlY3RBbGwoJy4nK2h5cGVuYXRlKG5hbWVzcGFjZSwnZ3VpZGVsaW5lJykpXG4gICAgICAuYXR0cignc3Ryb2tlJywgZnVuY3Rpb24oZCwgaSl7XG4gICAgICAgIGlmIChpICUgMiA9PSAwKSB7IHJldHVybiBtb2RpZnlIZXhpZGVjaW1hbENvbG9yTHVtaW5hbmNlKGd1aWRlTGluZVN0cm9rZSwgMC44KSB9XG4gICAgICAgIHJldHVybiBndWlkZUxpbmVTdHJva2VcbiAgICAgIH0pXG4gICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgZnVuY3Rpb24oZCwgaSl7XG4gICAgICAgIGlmIChpICUgMiA9PSAwKSB7IHJldHVybiBndWlkZUxpbmVTdHJva2VXaWR0aCAqMC44fVxuICAgICAgICByZXR1cm4gZ3VpZGVMaW5lU3Ryb2tlV2lkdGhcbiAgICAgIH0pXG4gICAgfVxuXG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgKiogTWFrZSB0aGUgbGluZSBvZiB0aGUgYXhpc1xuICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICB2YXIgbGluZSA9IHNhZmVTZWxlY3Qoc2VsZWN0aW9uLCAncGF0aCcsIGh5cGVuYXRlKG5hbWVzcGFjZSwnbGluZScpKVxuICAgIC8vIC5hdHRyKCd4MScsIDApXG4gICAgLy8gLmF0dHIoJ3gyJywgaG9yaXpvbnRhbFEgPyBzcGFjZVggOiAwKVxuICAgIC8vIC5hdHRyKCd5MScsIDApXG4gICAgLy8gLmF0dHIoJ3kyJywgaG9yaXpvbnRhbFEgPyAwIDogc3BhY2VZKVxuICAgIC5hdHRyKCdkJyxcbiAgICAgIGhvcml6b250YWxRXG4gICAgICA/ICdNIDAsMCBIJyArIHNwYWNlWCArICcsMCdcbiAgICAgIDogJ00gMCwwIFYgMCwnICsgc3BhY2VZXG4gICAgKVxuICAgIC5hdHRyKCdzdHJva2UnLCBsaW5lU3Ryb2tlKVxuICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCBsaW5lU3Ryb2tlV2lkdGgpXG4gICAgLmNsYXNzZWQoJ2F4aXMtbGluZScsIHRydWUpXG5cblxuICB9XG4gIHJldHVybiBheGlzXG59XG4iLCJpbXBvcnQge21vZGlmeUhleGlkZWNpbWFsQ29sb3JMdW1pbmFuY2V9IGZyb20gJy4vaGVscGVycyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNvbG9yRnVuY3Rpb25cbiAqIEBjb25zdHJ1Y3RvciBjb2xvckZ1bmN0aW9uXG4gKiBAbmFtZXNwYWNlIGNvbG9yRnVuY3Rpb25cbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gY29sb3JGdW5jdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sb3JGdW5jdGlvbigpIHtcbiAgdmFyXG4gIC8qKlxuICAqIERlZmF1bHQgY29sb3JzIHRvIHVzZVxuICAqIEBwYXJhbSB7bnVtYmVyW119IFtjb2xvcnM9W1wiIzJjN2JiNlwiLCBcIiMwMGE2Y2FcIiwgXCIjMDBjY2JjXCIsIFwiIzkwZWI5ZFwiLCBcIiNmZmZmOGNcIiwgXCIjZjlkMDU3XCIsIFwiI2YyOWUyZVwiLCBcIiNlNzY4MThcIiwgXCIjZDcxOTFjXCJdXVxuICAqIEBtZW1iZXJvZiBjb2xvckZ1bmN0aW9uI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBjb2xvcnMgPSBbXCIjMmM3YmI2XCIsIFwiIzAwYTZjYVwiLCBcIiMwMGNjYmNcIiwgXCIjOTBlYjlkXCIsIFwiI2ZmZmY4Y1wiLCBcIiNmOWQwNTdcIiwgXCIjZjI5ZTJlXCIsIFwiI2U3NjgxOFwiLCBcIiNkNzE5MWNcIl0sXG4gIC8qKlxuICAqIEludGVycG9sYXRvciBmb3IgY29sb3JzXG4gICogQHBhcmFtIHtkMy5pbnRlcnBvbGF0aW9ufSBbaW50ZXJwb2xhdGlvbj1kMy5pbnRlcnBvbGF0ZVJnYl1cbiAgKiBAbWVtYmVyb2YgY29sb3JGdW5jdGlvbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgaW50ZXJwb2xhdGlvbiA9IGQzLmludGVycG9sYXRlUmdiLFxuICAvKipcbiAgKiBGdW5jdGlvbiBmb3IgbW9kaWZ5aW5nIGNvbG9yIGx1bWluYW5jZVxuICAqIEBwYXJhbSB7ZnVuY3Rpb259IFttb2RpZnlPcGFjaXR5PW1vZGlmeUhleGlkZWNpbWFsQ29sb3JMdW1pbmFuY2VdXG4gICogQG1lbWJlcm9mIGNvbG9yRnVuY3Rpb24jXG4gICogQHByb3BlcnR5XG4gICovXG4gIG1vZGlmeU9wYWNpdHkgPSBtb2RpZnlIZXhpZGVjaW1hbENvbG9yTHVtaW5hbmNlLFxuICAvKipcbiAgKiBIb3cgdG8gbW9kaWZ5IGNvbG9yIGZvciBzdHJva2VcbiAgKiBAcGFyYW0ge251bWJlcn0gW3N0cm9rZU9wYWNpdHk9MF1cbiAgKiBAbWVtYmVyb2YgY29sb3JGdW5jdGlvbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc3Ryb2tlT3BhY2l0eSA9IDAsXG4gIC8qKlxuICAqIEhvdyB0byBtb2RpZnkgY29sb3IgZm9yIGZpbGxcbiAgKiBAcGFyYW0ge251bWJlcn0gW2ZpbGxPcGFjaXR5PTAuNF1cbiAgKiBAbWVtYmVyb2YgY29sb3JGdW5jdGlvbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZmlsbE9wYWNpdHkgPSAwLjQsXG4gIC8qKlxuICAqIEhvdyB0byBkZXRlcm1pbmUgdGhlIGNvbG9yIHRvIHVzZVxuICAqIEBwYXJhbSB7c3RyaW5nfSBbY29sb3JCeT0naW5kZXgnXVxuICAqIEBtZW1iZXJvZiBjb2xvckZ1bmN0aW9uI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBjb2xvckJ5ID0gJ2luZGV4JyxcbiAgLyoqXG4gICogU2V0cyB0aGUgc2NhbGUgZm9yIGludGVycG9sYXRpbmcgdGhlIGNvbG9yc1xuICAqIEBwYXJhbSB7bnVtYmVyW119IFtkYXRhRXh0ZW50PVswLCBjb2xvcnMubGVuZ3RoIC0gMV1dXG4gICogQG1lbWJlcm9mIGNvbG9yRnVuY3Rpb24jXG4gICogQHByb3BlcnR5XG4gICovXG4gIGRhdGFFeHRlbnQgPSBbMCwgY29sb3JzLmxlbmd0aCAtIDFdLFxuICAvKipcbiAgKiBFeHRyYWN0cyB0aGUgdmFsdWUgdG8gY29sb3IgYnlcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbdmFsdWVFeHRyYWN0b3I9ZnVuY3Rpb24oaywgdiwgaSkge3JldHVybiB2fV1cbiAgKiBAbWVtYmVyb2YgY29sb3JGdW5jdGlvbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdmFsdWVFeHRyYWN0b3IgPSBmdW5jdGlvbihrLCB2LCBpKSB7cmV0dXJuIHZ9LFxuICAvKipcbiAgKiBTY2FsZSBmb3IgaW50ZXJwb2xhdGluZyB0aGUgY29sb3JzXG4gICogQHBhcmFtIHtkMy5zY2FsZX0gW3NjYWxlPWQzLnNjYWxlTGluZWFyKCldXG4gICogQG1lbWJlcm9mIGNvbG9yRnVuY3Rpb24jXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKVxuICAuaW50ZXJwb2xhdGUoaW50ZXJwb2xhdGlvbikuZG9tYWluKGRhdGFFeHRlbnQpLnJhbmdlKGNvbG9ycyksXG4gIGhlbHBlclNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKVxuXG4gIC8vIHZhciBoID0geCA9PiAnIycgKyB4Lm1hdGNoKC9cXGQrL2cpLm1hcCh5ID0geiA9PiAoKCt6IDwgMTYpPycwJzonJykgKyAoK3opLnRvU3RyaW5nKDE2KSkuam9pbignJyk7XG4gIHZhciBoID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBcIiNcIiArIHgubWF0Y2goL1xcZCsvZykubWFwKFxuICAgICAgZnVuY3Rpb24oeSwgaSkge1xuICAgICAgICByZXR1cm4gICgoK3kgPCAxNik/JzAnOicnKSArICgreSkudG9TdHJpbmcoMTYpXG4gICAgICB9KS5qb2luKCcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGRlZmF1bHQgY29sb3JzXG4gICAqIChzZWUge0BsaW5rIGNvbG9yRnVuY3Rpb24jY29sb3JzfSlcbiAgICogQHBhcmFtIHtudW1iZXJbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2NvbG9yRnVuY3Rpb24gfCBudW1iZXJbXX1cbiAgICogQG1lbWJlcm9mIGNvbG9yRnVuY3Rpb25cbiAgICogQHByb3BlcnR5XG4gICAqL1xuICBjb2xvckZ1bmN0aW9uLmNvbG9ycyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgID9cbiAgICAgIChcbiAgICAgICAgY29sb3JzID0gXyxcbiAgICAgICAgc2NhbGUucmFuZ2UoY29sb3JzKSxcbiAgICAgICAgY29sb3JGdW5jdGlvblxuICAgICAgKVxuICAgIDogY29sb3JzO1xuICB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBmdW5jdGlvbiBmb3IgaW50ZXJwb2xhdGluZyB0aGUgY29sb3JzXG4gICAqIChzZWUge0BsaW5rIGNvbG9yRnVuY3Rpb24jaW50ZXJwb2xhdGlvbn0pXG4gICAqIEBwYXJhbSB7ZDMuaW50ZXJwb2xhdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2NvbG9yRnVuY3Rpb24gfCBkMy5pbnRlcnBvbGF0aW9ufVxuICAgKiBAbWVtYmVyb2YgY29sb3JGdW5jdGlvblxuICAgKiBAcHJvcGVydHlcbiAgICovXG4gIGNvbG9yRnVuY3Rpb24uaW50ZXJwb2xhdGlvbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgID9cbiAgICAoXG4gICAgICBpbnRlcnBvbGF0aW9uID0gXyxcbiAgICAgIHNjYWxlLmludGVycG9sYXRlKGludGVycG9sYXRpb24pLnJhbmdlKGNvbG9ycyksXG4gICAgICBjb2xvckZ1bmN0aW9uXG4gICAgKVxuICAgIDogaW50ZXJwb2xhdGlvbjtcbiAgfTtcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgdmFsdWVzIGZvciB0aGUgc2NhbGUgd2hpY2ggdHJhbnNmb3JtcyB0aGUgdmFsdWUgdG8gYSBjb2xvclxuICAgKiAoc2VlIHtAbGluayBjb2xvckZ1bmN0aW9uI2RhdGFFeHRlbnR9KVxuICAgKiBAcGFyYW0ge251bWJlcltdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Y29sb3JGdW5jdGlvbiB8IG51bWJlcltdfVxuICAgKiBAbWVtYmVyb2YgY29sb3JGdW5jdGlvblxuICAgKiBAcHJvcGVydHlcbiAgICovXG4gIGNvbG9yRnVuY3Rpb24uZGF0YUV4dGVudCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgID8gKFxuICAgICAgICBkYXRhRXh0ZW50ID0gXyxcbiAgICAgICAgc2NhbGUuZG9tYWluKGRhdGFFeHRlbnQpLmludGVycG9sYXRlKHNjYWxlLmludGVycG9sYXRlKCkpLFxuICAgICAgICBjb2xvckZ1bmN0aW9uXG4gICAgICApXG4gICAgOiBkYXRhRXh0ZW50O1xuICB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSB2dGhlIHNjYWxlIHdoaWNoIHRyYW5zZm9ybXMgdGhlIHZhbHVlIHRvIGEgY29sb3JcbiAgICogKHNlZSB7QGxpbmsgY29sb3JGdW5jdGlvbiNzY2FsZX0pXG4gICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtjb2xvckZ1bmN0aW9uIHwgZDMuc2NhbGV9XG4gICAqIEBtZW1iZXJvZiBjb2xvckZ1bmN0aW9uXG4gICAqIEBwcm9wZXJ0eVxuICAgKi9cbiAgY29sb3JGdW5jdGlvbi5zY2FsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgID8gKFxuICAgICAgICBfID0gXy5kb21haW4oc2NhbGUuZG9tYWluKCkpLmludGVycG9sYXRlKHNjYWxlLmludGVycG9sYXRlKCkpLnJhbmdlKHNjYWxlLnJhbmdlKCkpLFxuICAgICAgICBzY2FsZSA9IF8sXG4gICAgICAgIGNvbG9yRnVuY3Rpb25cbiAgICAgIClcbiAgICA6IHNjYWxlO1xuICB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBmdW5jdGlvbiBmb3IgbW9kaWZ5IG9wYWNpdHlcbiAgICogKHNlZSB7QGxpbmsgY29sb3JGdW5jdGlvbiNtb2RpZnlPcGFjaXR5fSlcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2NvbG9yRnVuY3Rpb24gfCBmdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIGNvbG9yRnVuY3Rpb25cbiAgICogQHByb3BlcnR5XG4gICAqL1xuICBjb2xvckZ1bmN0aW9uLm1vZGlmeU9wYWNpdHkgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG1vZGlmeU9wYWNpdHkgPSBfLCBjb2xvckZ1bmN0aW9uKSA6IG1vZGlmeU9wYWNpdHk7IH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHZhbHVlIHRvIG1vZGlmeSB0aGUgY29sb3IgZm9yIHRoZSBzdHJva2UgdmlhIHtAbGluayBjb2xvckZ1bmN0aW9uI21vZGlmeU9wYWNpdHl9XG4gICAqIChzZWUge0BsaW5rIGNvbG9yRnVuY3Rpb24jc3Ryb2tlT3BhY2l0eX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Y29sb3JGdW5jdGlvbiB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGNvbG9yRnVuY3Rpb25cbiAgICogQHByb3BlcnR5XG4gICAqL1xuICBjb2xvckZ1bmN0aW9uLnN0cm9rZU9wYWNpdHkgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN0cm9rZU9wYWNpdHkgPSBfLCBjb2xvckZ1bmN0aW9uKSA6IHN0cm9rZU9wYWNpdHk7IH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHZhbHVlIHRvIG1vZGlmeSB0aGUgY29sb3IgZm9yIHRoZSBzdHJva2UgdmlhIHtAbGluayBjb2xvckZ1bmN0aW9uI2ZpbGxPcGFjaXR5fVxuICAgKiAoc2VlIHtAbGluayBjb2xvckZ1bmN0aW9uI2ZpbGxPcGFjaXR5fSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtjb2xvckZ1bmN0aW9uIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgY29sb3JGdW5jdGlvblxuICAgKiBAcHJvcGVydHlcbiAgICovXG4gIGNvbG9yRnVuY3Rpb24uZmlsbE9wYWNpdHkgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGZpbGxPcGFjaXR5ID0gXywgY29sb3JGdW5jdGlvbikgOiBmaWxsT3BhY2l0eTsgfTtcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgdmFsdWUgdG8gY29sb3JCeVxuICAgKiAoc2VlIHtAbGluayBjb2xvckZ1bmN0aW9uI2NvbG9yQnl9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2NvbG9yRnVuY3Rpb24gfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBjb2xvckZ1bmN0aW9uXG4gICAqIEBwcm9wZXJ0eVxuICAgKi9cbiAgY29sb3JGdW5jdGlvbi5jb2xvckJ5ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjb2xvckJ5ID0gXywgY29sb3JGdW5jdGlvbikgOiBjb2xvckJ5OyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSB2YWx1ZSBvZiB2YWx1ZUV4dHJhY3RvclxuICAgKiAoc2VlIHtAbGluayBjb2xvckZ1bmN0aW9uI3ZhbHVlRXh0cmFjdG9yfSlcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2NvbG9yRnVuY3Rpb24gfCBmdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIGNvbG9yRnVuY3Rpb25cbiAgICogQHByb3BlcnR5XG4gICAqL1xuICBjb2xvckZ1bmN0aW9uLnZhbHVlRXh0cmFjdG9yID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2YWx1ZUV4dHJhY3RvciA9IF8sIGNvbG9yRnVuY3Rpb24pIDogdmFsdWVFeHRyYWN0b3I7IH07XG5cbiAgZnVuY3Rpb24gY29sb3JGdW5jdGlvbihrZXksIHZhbHVlLCBpbmRleCwgdHlwZSwgaG92ZXJRKSB7XG4gICAgdmFyIGMsXG4gICAgb3BhYyA9IHR5cGUgPT0gXCJmaWxsXCIgPyBmaWxsT3BhY2l0eSA6IHN0cm9rZU9wYWNpdHk7XG4gICAgdXBkYXRlU2NhbGUoKVxuXG4gICAgaWYgKGNvbG9yQnkgPT0gXCJpbmRleFwiKSB7XG4gICAgICBjID0gKHR5cGUgIT0gdW5kZWZpbmVkKSA/IG1vZGlmeU9wYWNpdHkoaChzY2FsZShpbmRleCkpLCBvcGFjKSA6IGgoc2NhbGUoaW5kZXgpKVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdiA9IHZhbHVlRXh0cmFjdG9yKGtleSwgdmFsdWUsIGluZGV4KTtcbiAgICAgIGMgPSAodHlwZSAhPSB1bmRlZmluZWQpID8gbW9kaWZ5T3BhY2l0eShoKHNjYWxlKHYpKSwgb3BhYykgOiBoKHNjYWxlKHYpKVxuICAgIH1cbiAgICByZXR1cm4gY1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlU2NhbGUoKXtcbiAgICBoZWxwZXJTY2FsZS5kb21haW4oWzAsIGNvbG9ycy5sZW5ndGhdKS5yYW5nZShkYXRhRXh0ZW50KVxuICAgIHZhciBhID0gQXJyYXkoY29sb3JzLmxlbmd0aCkuZmlsbCgwKS5tYXAoZnVuY3Rpb24oZCwgaSl7IHJldHVybiBoZWxwZXJTY2FsZShpKSB9KVxuICAgIHNjYWxlLmRvbWFpbihhKVxuICB9XG5cbiAgcmV0dXJuIGNvbG9yRnVuY3Rpb25cbn1cbiIsImltcG9ydCB7c2FmZVNlbGVjdCwgcm91bmR9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQge2xvZywgd2FybiwgaW5mbywgZXJyb3IsIGNvbnNvbGVHcm91cCwgY29uc29sZUdyb3VwRW5kfSBmcm9tICcuL3V0aWxzJztcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE9PTFRJUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKipcbiAqIFByb2R1Y2VzIGEgZnVuY3Rpb24gZm9yIGhhbmRsaW5nIHRoZSB0b29sdGlwXG4gKlxuICoge0BsaW5rIGh0dHBzOi8vc3VtbmV1cm9uLmdpdGxhYi5pby9kM3NtL2RlbW9zL3Rvb2x0aXAtZGVzaWduL2luZGV4Lmh0bWwgRGVtb31cbiAqIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBzZWxlY3Rpb25cbiAqIEByZXR1cm5zIHt0b29sdGlwfVxuICogQG5hbWVzcGFjZSB0b29sdGlwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b29sdGlwKCBzZWxlY3Rpb24gKSB7XG5cbiAgdmFyXG4gIGtleXMsXG4gIHZhbHVlcyxcbiAgaGVhZGVyLFxuICBkYXRhLFxuICBzZWxlY3Rpb24sXG4gIHRhcmdldENsYXNzXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBrZXlzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgdG9vbHRpcC5cbiAgICogSWYgbm90IHNldCwgdXNlcyBkMy5rZXlzKGRhdGFba2V5XSlcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Rvb2x0aXAgfCBzdHJpbmdbXX1cbiAgICogQG1lbWJlcm9mIHRvb2x0aXBcbiAgICovXG4gIHRvb2x0aXAua2V5cyA9IGZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGtleXMgPSBfLCB0b29sdGlwKSA6IGtleXN9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHZhbHVlcyB0byBiZSBkaXNwbGF5ZWQgbmV4dCB0byB0aGUga2V5cy5cbiAgICogSWYgbm90IHNldCwgdXNlcyBkYXRhW2tleV1ba2V5c1tpXV0uXG4gICAqIElmIGEgZnVuY3Rpb24sIGdldHMgcGFzc2VkIGN1cnJlbnREYXRhIChkYXRhW2tleV0pIGFuZCBrZXlzW2ldLlxuICAgKiBAcGFyYW0geypbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Rvb2x0aXAgfCAqW119XG4gICAqIEBtZW1iZXJvZiB0b29sdGlwXG4gICAqL1xuICB0b29sdGlwLnZhbHVlcyA9IGZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZhbHVlcyA9IF8sIHRvb2x0aXApIDogdmFsdWVzfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBoZWFkZXIgdG8gYmUgZGlzcGxheWVkIGluIHRoZSB0b29sdGlwLlxuICAgKiBJZiBub3Qgc2V0LCB1c2VzIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge3Rvb2x0aXAgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiB0b29sdGlwXG4gICAqL1xuICB0b29sdGlwLmhlYWRlciA9IGZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGhlYWRlciA9IF8sIHRvb2x0aXApIDogaGVhZGVyfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBkYXRhIChvdmVyIHRoZSBzZWxlY3Rpb24pIHRvIGJlIHVzZWQgZm9yIHRoZSB0b29sdGlwXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dG9vbHRpcCB8IE9iamVjdH1cbiAgICogQG1lbWJlcm9mIHRvb2x0aXBcbiAgICovXG4gIHRvb2x0aXAuZGF0YSA9IGZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRhdGEgPSBfLCB0b29sdGlwKSA6IGRhdGF9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNlbGVjdGlvbiBmb3IgdGhlIHRvb2x0aXAgdG8gYmUgYXBwbGllZCBvblxuICAgKiBAcGFyYW0ge2QzLnNlbGVjdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Rvb2x0aXAgfCBkMy5zZWxlY3Rpb259XG4gICAqIEBtZW1iZXJvZiB0b29sdGlwXG4gICAqL1xuICB0b29sdGlwLnNlbGVjdGlvbiA9IGZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNlbGVjdGlvbiA9IF8sIHRvb2x0aXApIDogc2VsZWN0aW9ufTtcblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdGFyZ2V0Q2xhc3MgZm9yIHRoZSB0b29sdGlwIHRvIGJlIGFwcGxpZWQgb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt0b29sdGlwIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgdG9vbHRpcFxuICAgKi9cbiAgdG9vbHRpcC50YXJnZXRDbGFzcyA9IGZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRhcmdldENsYXNzID0gXywgdG9vbHRpcCkgOiB0YXJnZXRDbGFzc307XG5cblxuICAvKipcbiAgICogQmluZCwgdmlhIHNlbGVjdGlvbi5vbigpLCB0aGUgbW91c2Vtb3ZlIGFuZCBtb3VzZW91dCBldmVudHNcbiAgICogQHJldHVybnMgdW5kZWZpbmVkXG4gICAqL1xuICBmdW5jdGlvbiB0b29sdGlwKCApIHtcbiAgICBzZWxlY3Rpb24ub24oJ21vdXNlb3ZlcicsIG1vdXNlbW92ZSlcbiAgICBzZWxlY3Rpb24ub24oJ21vdXNlbW92ZScsIG1vdXNlbW92ZSlcbiAgICBzZWxlY3Rpb24ub24oJ21vdXNlb3V0JywgZnVuY3Rpb24oKXsgZDMuc2VsZWN0QWxsKFwiLmQzc20tdG9vbHRpcFwiKS5yZW1vdmUoKX0pXG4gIH1cblxuXG4gIC8qKlxuICAgKiBQcm9kdWNlcyB0aGUgdG9vbHRpcCBvbiBtb3VzZW1vdmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBvZiB0aGUgb2JqZWN0IHRhcmdldGVkIGJ5IHRoZSBtb3VzZW1vdmVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGkgKGluZGV4KSBvZiB0aGUgb2JqZWN0IHRhcmdldGVkIGJ5IG1vdXNlbW92ZVxuICAgKiBAbWVtYmVyb2YgdG9vbHRpcFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZnVuY3Rpb24gbW91c2Vtb3ZlKGtleSwgaSkge1xuICAgIGNvbnNvbGVHcm91cCgnZDNzbS10b29sdGlwJylcbiAgICB2YXIgY3VycmVudERhdGEgPSBkYXRhW2tleV1cblxuICAgIHZhciBbeCwgeV0gPSBkMy5tb3VzZShkMy5zZWxlY3QoXCJodG1sXCIpLm5vZGUoKSlcbiAgICBsb2coJ3Rvb2x0aXAnLCAnbW91c2Vtb3ZlIGRldGVjdGVkJyx7a2V5OiBrZXksIGluZGV4OiBpLCB4OngsIHk6eX0pXG4gICAgbG9nKCd0b29sdGlwJywgJ2N1cnJlbnQgZGF0YScsIGN1cnJlbnREYXRhKVxuXG4gICAgdmFyIGRpdiA9IHNhZmVTZWxlY3QoZDMuc2VsZWN0KCdodG1sJyksICd0b29sdGlwJywgJ2Qzc20tdG9vbHRpcCcpXG4gICAgLmNsYXNzZWQoJ2NhcmQnLCB0cnVlKVxuICAgIC5zdHlsZSgnbWF4LXdpZHRoJywgJzMwMHB4JylcbiAgICAuc3R5bGUoJ2JhY2tncm91bmQtY29sb3InLCBcIiMyMTI1MjlcIilcbiAgICAuc3R5bGUoJ2NvbG9yJywgJ3doaXRlJylcblxuXG5cbiAgICB2YXIgY2FyZEJvZHkgPSBzYWZlU2VsZWN0KGRpdiwgJ2RpdicsICdjYXJkLWJvZHknKVxuICAgIHZhciBjYXJkVGl0bGUgPSBzYWZlU2VsZWN0KGNhcmRCb2R5LCAnaDUnLCAnY2FyZC10aXRsZScpXG4gICAgLnRleHQoaGVhZGVyID09IHVuZGVmaW5lZCA/IGtleSA6IHR5cGVvZiBoZWFkZXIgPT0gJ2Z1bmN0aW9uJyA/IGhlYWRlcihrZXksIGkpIDogaGVhZGVyKVxuICAgIC5zdHlsZSgnY29sb3InLCAnY3lhbicpXG5cblxuICAgIHZhciB0YWJsZSA9IHNhZmVTZWxlY3QoY2FyZEJvZHksICd0YWJsZScsICd0YWJsZScpLmNsYXNzZWQoJ3RhYmxlLWRhcmsnLCB0cnVlKVxuICAgIHZhciB0Qm9keSA9IHNhZmVTZWxlY3QodGFibGUsICd0Ym9keScpXG5cbiAgICB0Qm9keSA9IHRCb2R5LnNlbGVjdEFsbCgndHInKVxuICAgIHRCb2R5PSB0Qm9keS5kYXRhKGtleXMgPT0gdW5kZWZpbmVkID8gZDMua2V5cyhjdXJyZW50RGF0YSk6IGtleXMpXG5cblxuXG4gICAgdEJvZHkuZXhpdCgpLnJlbW92ZSgpXG5cbiAgICB2YXIgdHIgPSB0Qm9keS5lbnRlcigpLmFwcGVuZCgndHInKVxuXG4gICAgY29uc29sZUdyb3VwKCd0b29sdGlwLXJvd3MnKVxuICAgIHRyLmVhY2goZnVuY3Rpb24oZCwgaSkge1xuXG4gICAgICBkMy5zZWxlY3QodGhpcykuYXBwZW5kKCd0ZCcpLmF0dHIoJ2NsYXNzJywgJ3Rvb2x0aXAta2V5JykudGV4dChmdW5jdGlvbihkLCBpKXtyZXR1cm4gZH0pXG4gICAgICBkMy5zZWxlY3QodGhpcykuYXBwZW5kKCd0ZCcpLmF0dHIoJ2NsYXNzJywgJ3Rvb2x0aXAtdmFsdWUnKVxuICAgICAgLnRleHQoZnVuY3Rpb24oZCwgaSl7XG4gICAgICAgIGxvZygndG9vbHRpcCcsICd0cnlpbmcgdG8gc2V0IHZhbHVlJywge3Jvd0tleTogZCwgcm93SW5kZXg6IGl9KVxuICAgICAgICB2YXIgdiA9IGN1cnJlbnREYXRhW2RdO1xuICAgICAgICBpZiAodmFsdWVzICE9IHVuZGVmaW5lZCkge3YgPSB2YWx1ZXNbaV07IGlmKHR5cGVvZiB2ID09IFwiZnVuY3Rpb25cIikge3YgPSB2KGN1cnJlbnREYXRhLCBkKX19XG4gICAgICAgIHJldHVybiAgdHlwZW9mIHYgPT0gJ251bWJlcicgPyByb3VuZCh2LCA1KSA6IHZcbiAgICAgIH0pXG4gICAgfSlcbiAgICB0Qm9keSA9IHRCb2R5Lm1lcmdlKHRyKVxuXG4gICAgdEJvZHkuc2VsZWN0QWxsKCcudG9vbHRpcC1rZXknKS50ZXh0KGZ1bmN0aW9uKGQsIGkpe3JldHVybiBkfSlcbiAgICB0Qm9keS5zZWxlY3RBbGwoJy50b29sdGlwLXZhbHVlJykudGV4dChmdW5jdGlvbihkLCBpKXtcbiAgICAgIGxvZygndG9vbHRpcCcsICd0cnlpbmcgdG8gc2V0IHZhbHVlJywge3Jvd0tleTogZCwgcm93SW5kZXg6IGl9KVxuICAgICAgdmFyIHYgPSBjdXJyZW50RGF0YVtkXTtcbiAgICAgIGlmICh2YWx1ZXMgIT0gdW5kZWZpbmVkKSB7diA9IHZhbHVlc1tpXTsgaWYodHlwZW9mIHYgPT0gXCJmdW5jdGlvblwiKSB7diA9IHYoY3VycmVudERhdGEsIGQpfX1cbiAgICAgIHJldHVybiAgdHlwZW9mIHYgPT0gJ251bWJlcicgPyByb3VuZCh2LCA1KSA6IHZcbiAgICB9KVxuXG4gICAgY29uc29sZUdyb3VwRW5kKClcbiAgICBjb25zb2xlR3JvdXBFbmQoKVxuXG4gICAgZGl2LnN0eWxlKCdwb3NpdGlvbicpID09IFwicmVsYXRpdmVcIlxuICAgID8gZGl2LnN0eWxlKCdwb3NpdGlvbicsICdhYnNvbHV0ZScpLnN0eWxlKCdsZWZ0JywgeCsxNSsncHgnKS5zdHlsZSgndG9wJywgeSsncHgnKVxuICAgIDogZGl2LnRyYW5zaXRpb24oKS5kdXJhdGlvbigyMDApLmVhc2UoZDMuZWFzZVNpbikuc3R5bGUoJ2xlZnQnLCB4KzE1KydweCcpLnN0eWxlKCd0b3AnLCB5KydweCcpXG4gIH1cblxuICByZXR1cm4gdG9vbHRpcFxufVxuIiwiaW1wb3J0IHtoeXBlbmF0ZSwgc2FmZVNlbGVjdH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7c2V0dXBDb250YWluZXIsIGNhbGN1bGF0ZVdpZHRoT2ZPYmplY3QsIGNhbGN1bGF0ZVdpZHRoT2ZTcGFjZXJ9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHt1bmlxdWUsIGZsYXR0ZW59IGZyb20gJy4vYXJyYXktZnVuY3Rpb25zJztcbmltcG9ydCB7Z3JvdXBpbmdTcGFjZXJ9IGZyb20gJy4vZ3JvdXBpbmctc3BhY2VyJztcbmltcG9ydCB7Y29sb3JGdW5jdGlvbiBhcyBDRn0gZnJvbSAnLi9jb2xvci1mdW5jdGlvbic7XG5pbXBvcnQge3Rvb2x0aXAgYXMgVFRpcH0gZnJvbSAnLi90b29sdGlwJztcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qKlxuICogQ3JlYXRlcyBhIGJhclxuICpcbiAqIHtAbGluayBodHRwczovL3N1bW5ldXJvbi5naXRsYWIuaW8vZDNzbS9kZW1vcy9iYXItY2hhcnQtc2FtZS1kYXRhLWNvbXBsZXgtZ3JvdXBpbmcvaW5kZXguaHRtbCBEZW1vfVxuICogQGNvbnN0cnVjdG9yIGJhclxuICogQHBhcmFtIHtkMy5zZWxlY3Rpb259IHNlbGVjdGlvblxuICogQG5hbWVzcGFjZSBiYXJcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gYmFyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYXIgKCBzZWxlY3Rpb24gKSB7XG4gIC8qXG4gIEFzc3VtZXMgdGhhdCBkYXRhIGlzIGxpc3QgYW4gb2JqZWN0LlxuXG4gIFRoZSBrZXlzIG9mIGRhdGEgd2lsbCBiZSBib3VuZCB0byB0aGUgYmFycy5cbiAgVGhlIHZhbHVlRXh0cmFjdG9yIGZ1bmN0aW9uIHdpbGwgZXh0cmFjdCB0aGUgdmFsdWUgZnJvbSBkYXRhW2tleV0uXG5cbiAgR3JvdXBpbmcgY2FuIGJlIHVzZWQgaWYgZGVzaXJlZC4gSXQgc2hvdWxkIGJlIGFuIGFyYml0cmFyeSBjb21wbGV4IGxpc3Qgd2hlcmVcbiAgdGhlIHZhbHVlcyBhcmUgc3RyaW5ncyBtYXRjaGluZyBrZXlzIGluIGRhdGEuXG4gICovXG4gIHZhclxuICAvKipcbiAgKiBEYXRhIHRvIHBsb3QuIEFzc3VtZWQgdG8gYmUgYSBvYmplY3QsIHdoZXJlIGVhY2gga2V5IGNvcnJlc3BvbmRzIHRvIGEgYmFyXG4gICogKHNlZSB7QGxpbmsgYmFyI2RhdGF9KVxuICAqIEBwYXJhbSB7T2JqZWN0fSBbZGF0YT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZGF0YSxcbiAgLyoqXG4gICogV2hpY2ggZGlyZWN0aW9uIHRvIHJlbmRlciB0aGUgYmFycyBpblxuICAqIChzZWUge0BsaW5rIGJhciNvcmllbnR9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbb3JpZW50PSdob3Jpem9udGFsJ11cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBvcmllbnQ9J2hvcml6b250YWwnLFxuICAvKipcbiAgKiBBbW91bnQgb2YgaG9yaXpvbnRhbCBzcGFjZSAoaW4gcGl4ZWxzKSBhdmFpYmxlIHRvIHJlbmRlciB0aGUgYmFyIGluXG4gICogKHNlZSB7QGxpbmsgYmFyI3NwYWNlWH0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZVg9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNwYWNlWCxcbiAgLyoqXG4gICogQW1vdW50IG9mIHZlcnRpY2FsIHNwYWNlIChpbiBwaXhlbHMpIGF2YWlibGUgdG8gcmVuZGVyIHRoZSBiYXIgaW5cbiAgKiAoc2VlIHtAbGluayBiYXIuc3BhY2VZfSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW3NwYWNlWT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc3BhY2VZLFxuXG4gIC8qKlxuICAqIFdoZXRoZXIgb3Igbm90IHRvIGFsbG93IGJhciB0byByZW5kZXIgZWxlbWVudHMgcGFzcyB0aGUgbWFpbiBzcGF0aWFsIGRpbWVuc2lvblxuICAqIGdpdmVuIHRoZSBvcmllbnRhdGlvbiAoc2VlIHtAbGluayBiYXIjb3JpZW50fSksIHdoZXJlIHtAbGluayBiYXIjb3JpZW50fT1cImhvcml6b250YWxcIlxuICAqIHRoZSBtYWluIGRpbWVuc2lvbiBpcyB7QGxpbmsgYmFyI3NwYWNlWH0gYW5kIHdoZXJlIHtAbGluayBiYXIjb3JpZW50fT1cInZlcnRpY2FsXCJcbiAgKiB0aGUgbWFpbiBkaW1lbnNpb24gaXMge0BsaW5rIGJhciNzcGFjZVl9XG4gICogQHBhcmFtIHtib29sZWFufSBbb3ZlcmZsb3dRPWZhbHNlXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG92ZXJmbG93USA9IGZhbHNlLFxuXG4gIC8qKlxuICAqIEFuIGFycmF5IC0gcHV0YXRpdmVseSBvZiBvdGhlciBhcnJheXMgLSBkZXBpY3RpbmcgaG93IGJhcnMgc2hvdWxkIGJlIGFycmFuZ2VkXG4gICogQHBhcmFtIHtBcnJheVtdfSBbZ3JvdXBpbmc9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGdyb3VwaW5nLFxuXG4gIC8qKlxuICAqIEhvdyB0byBnZXQgdGhlIHZhbHVlIG9mIHRoZSBiYXJcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbdmFsdWVFeHRyYWN0b3I9ZnVuY3Rpb24oa2V5LCBpbmRleCkgeyByZXR1cm4gZGF0YVtrZXldIH1dXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdmFsdWVFeHRyYWN0b3IgPSBmdW5jdGlvbihrZXksIGluZGV4KSB7IHJldHVybiBkYXRhW2tleV0gfSxcbiAgLyoqXG4gICogSG93IHRvIHNvcnQgdGhlIGJhcnMgLSBpZiB7QGxpbmsgYmFyI2dyb3VwaW5nfSBpcyBub3QgcHJvdmlkZWQuXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW3NvcnRpbmdGdW5jdGlvbj1mdW5jdGlvbihrZXlBLCBrZXlCKSB7cmV0dXJuIGQzLmRlc2NlbmRpbmcoZGF0YVtrZXlBXSwgZGF0YVtrZXlCXSl9XVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNvcnRpbmdGdW5jdGlvbiA9IGZ1bmN0aW9uKGtleUEsIGtleUIpIHtyZXR1cm4gZDMuZGVzY2VuZGluZyhkYXRhW2tleUFdLCBkYXRhW2tleUJdKX0sXG5cbiAgLyoqXG4gICogVGhlIHNjYWxlIGZvciB3aGljaCBiYXIgdmFsdWVzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBieVxuICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtzY2FsZT1kMy5zY2FsZUxpbmVhcl1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzY2FsZSA9IGQzLnNjYWxlTGluZWFyKCksXG4gIC8qKlxuICAqIFRoZSBwYWRkaW5nIGZvciB0aGUgZG9tYWluIG9mIHRoZSBzY2FsZSAoc2VlIHtAbGluayBiYXIjc2NhbGV9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbZG9tYWluUGFkZGluZz0wLjVdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZG9tYWluUGFkZGluZyA9IDAuNSxcblxuICAvKipcbiAgKiBEZWZhdWx0IHNwYWNlIGZvciB0aGUgc3BhY2VyIChwZXJjZW50YWdlKSBvZiBtYWluIGRpbWVuc2lvbiBnaXZlbiB0aGUgb3JpZW50YXRpb25cbiAgKiAoc2VlIHtAbGluayBiYXIjb3JpZW50fSksIHdoZXJlIHtAbGluayBiYXIjb3JpZW50fT1cImhvcml6b250YWxcIlxuICAqIHRoZSBtYWluIGRpbWVuc2lvbiBpcyB7QGxpbmsgYmFyI3NwYWNlWH0gYW5kIHdoZXJlIHtAbGluayBiYXIjb3JpZW50fT1cInZlcnRpY2FsXCJcbiAgKiB0aGUgbWFpbiBkaW1lbnNpb24gaXMge0BsaW5rIGJhciNzcGFjZVl9IGJldHdlZW4gYmFyc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbb2JqZWN0U3BhY2VyPTAuMDVdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb2JqZWN0U3BhY2VyID0gMC4wNSxcbiAgLyoqXG4gICogVGhlIG1pbmltdW0gc2l6ZSB0aGF0IGFuIG9iamVjdCBjYW4gYmVcbiAgKiBAcGFyYW0ge251bWJlcn0gW21pbk9iamVjdFNpemU9NTBdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgbWluT2JqZWN0U2l6ZSA9IDUwLFxuICAvKipcbiAgKiBUaGUgbWF4aW11bSBzaXplIHRoYXQgYW4gb2JqZWN0IGNhbiBiZVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4T2JqZWN0U2l6ZT0xMDBdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgbWF4T2JqZWN0U2l6ZSA9IDEwMCxcblxuICAvKipcbiAgKiBUaGUgc3Ryb2tlIHdpZHRoIG9mIHRoZSBiYXJzXG4gICogQHBhcmFtIHtudW1iZXJ9IFtiYXJTdHJva2VXaWR0aD0yXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGJhclN0cm9rZVdpZHRoID0gMixcbiAgLyoqXG4gICogSW5zdGFuY2Ugb2YgQ29sb3JGdW5jdGlvblxuICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtjb2xvckZ1bmN0aW9uID0gY29sb3JGdW5jdGlvbigpXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGNvbG9yRnVuY3Rpb24gPSBDRigpLFxuXG5cbiAgLyoqXG4gICogQ29sb3Igb2YgdGhlIGJhY2tncm91bmRcbiAgKiBAcGFyYW0ge3N0cmluZ30gW2JhY2tncm91bmRGaWxsPVwidHJhbnNwYXJlbnRcIl1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBiYWNrZ3JvdW5kRmlsbCA9ICd0cmFuc3BhcmVudCcsXG4gIC8qKlxuICAqIE5hbWVzcGFjZSBmb3IgYWxsIGl0ZW1zIG1hZGUgYnkgdGhpcyBpbnN0YW5jZSBvZiBiYXJcbiAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVzcGFjZT1cImQzc20tYmFyXCJdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgbmFtZXNwYWNlID0gJ2Qzc20tYmFyJyxcbiAgLyoqXG4gICogQ2xhc3MgbmFtZSBmb3IgYmFyIGNvbnRhaW5lciAoPGc+IGVsZW1lbnQpXG4gICogQHBhcmFtIHtzdHJpbmd9IFtvYmplY3RDbGFzcz1cImJhclwiXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG9iamVjdENsYXNzID0gJ2JhcicsXG5cbiAgLyoqXG4gICogRHVyYXRpb24gb2YgYWxsIHRyYW5zaXRpb25zIG9mIHRoaXMgZWxlbWVudFxuICAqIEBwYXJhbSB7bnVtYmVyfSBbdHJhbnNpdGlvbkR1cmF0aW9uPTEwMDBdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdHJhbnNpdGlvbkR1cmF0aW9uID0gMTAwMCxcbiAgLyoqXG4gICogRWFzaW5nIGZ1bmN0aW9uIGZvciB0cmFuc2l0aW9uc1xuICAqIEBwYXJhbSB7ZDMuZWFzZX0gW2Vhc2VGdW5jPWQzLmVhc2VFeHBdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZWFzZUZ1bmMgPSBkMy5lYXNlRXhwLFxuXG4gIC8vIHVzZWZ1bCB2YWx1ZXMgdG8gZXh0cmFjdCB0byBwcmV2ZW50IHJlLWNhbGN1bGF0aW9uXG4gIC8qKlxuICAqIFRoZSBrZXlzIG9mIHRoZSBiYXJzXG4gICogQHBhcmFtIHtzdHJpbmdbXX0gW2JhcktleXM9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGJhcktleXMsXG4gIC8qKlxuICAqIFRoZSB2YWx1ZXMgb2YgdGhlIGJhcnNcbiAgKiBAcGFyYW0ge251bWJlcltdfSBbYmFyVmFsdWVzPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBiYXJWYWx1ZXMsXG4gIC8qKlxuICAqIFRoZSBvYmplY3RTaXplIChhY3R1YWwgd2lkdGgpIHVzZWQgYnkgdGhlIGJhcnNcbiAgKiBAcGFyYW0ge251bWJlcn0gW29iamVjdFNpemU9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG9iamVjdFNpemUsXG4gIC8qKlxuICAqIFRoZSBzcGFjZXJTaXplIChhY3R1YWwgd2lkdGgpIHVzZWQgYnkgdGhlIHNwYWNlcnMgYmV0d2VlbiB0aGUgYmFyc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbc3BhY2VyU2l6ZT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc3BhY2VyU2l6ZSxcbiAgLyoqXG4gICogSW5zdGFuY2Ugb2YgVG9vbHRpcFxuICAqIEBwYXJhbSB7ZnVuY3Rpb259IFt0b29sdGlwPXRvb2x0aXAoKV1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB0b29sdGlwID0gVFRpcCgpXG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgc2VsZWN0aW9uIGluIHdoaWNoIGl0ZW1zIGFyZSBtYW5pcHVsYXRlZFxuICAgKiBAcGFyYW0ge2QzLnNlbGVjdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IGQzLnNlbGVjdGlvbn1cbiAgICogQG1lbWJlcm9mIGJhclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzZWxlY3Rpb24gPSBzZWxlY3Rpb25cbiAgICovXG4gIGJhci5zZWxlY3Rpb24gPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNlbGVjdGlvbiA9IF8sIGJhcikgOiBzZWxlY3Rpb247IH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGRhdGFcbiAgICogKHNlZSB7QGxpbmsgYmFyI2RhdGF9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IG9iamVjdH1cbiAgICogQG1lbWJlcm9mIGJhclxuICAgKiBAcHJvcGVydHlcbiAgICovXG4gIGJhci5kYXRhID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkYXRhID0gXywgYmFyKSA6IGRhdGE7IH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIG9yaWVudCBvZiB0aGUgYmFyc1xuICAgKiAoc2VlIHtAbGluayBiYXIjb3JpZW50fSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtiYXIgfCBvYmplY3R9XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqL1xuICBiYXIub3JpZW50ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvcmllbnQgPSBfLCBiYXIpIDogb3JpZW50OyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBhbW91bnQgb2YgaG9yaXpvbnRhbCBzcGFjZSBpbiB3aGljaCBpdGVtcyBhcmUgbWFuaXB1bGF0ZWRcbiAgICogKHNlZSB7QGxpbmsgYmFyI3NwYWNlWH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXSBzaG91bGQgYmUgYSBudW1iZXIgPiAwXG4gICAqIEByZXR1cm5zIHtiYXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc3BhY2VYID0gdW5kZWZpbmVkXG4gICAqL1xuICBiYXIuc3BhY2VYID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzcGFjZVggPSBfLCBiYXIpIDogc3BhY2VYOyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBhbW91bnQgb2YgdmVydGljYWwgc3BhY2UgaW4gd2hpY2ggaXRlbXMgYXJlIG1hbmlwdWxhdGVkXG4gICAqIChzZWUge0BsaW5rIGJhciNzcGFjZVl9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV0gc2hvdWxkIGJlIGEgbnVtYmVyID4gMFxuICAgKiBAcmV0dXJucyB7YmFyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNwYWNlWSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYmFyLnNwYWNlWSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3BhY2VZID0gXywgYmFyKSA6IHNwYWNlWTsgfTtcblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgd2hldGhlciBvciBub3QgYmFyIGlzIGFsbG93ZWQgdG8gZ28gYmV5b25kIHNwZWNpZmllZCBkaW1lbnNpb25zXG4gICAqIChzZWUge0BsaW5rIGJhciNzcGFjZVh9KVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtiYXIgfCBib29sZWFufVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG92ZXJmbG93USA9IGZhbHNlXG4gICAqL1xuICBiYXIub3ZlcmZsb3dRID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvdmVyZmxvd1EgPSBfLCBiYXIpIDogb3ZlcmZsb3dROyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGdyb3VwaW5nIG9mIHRoZSBiYXJzXG4gICAqIChzZWUge0BsaW5rIGJhciNncm91cGluZ30pXG4gICAqIEBwYXJhbSB7QXJyYXlbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IEFycmF5W119XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgZ3JvdXBpbmcgPSB1bmRlZmluZWRcbiAgICovXG4gIGJhci5ncm91cGluZyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZ3JvdXBpbmcgPSBfLCBiYXIpIDogZ3JvdXBpbmc7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdmFsdWVFeHRyYWN0b3JcbiAgICogKHNlZSB7QGxpbmsgYmFyI3ZhbHVlRXh0cmFjdG9yfSlcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IGZ1bmN0aW9ufVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHZhbHVlRXh0cmFjdG9yID0gZnVuY3Rpb24oa2V5LCBpbmRleCkgeyByZXR1cm4gZGF0YVtrZXldIH0sXG4gICAqL1xuICBiYXIudmFsdWVFeHRyYWN0b3IgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZhbHVlRXh0cmFjdG9yID0gXywgYmFyKSA6IHZhbHVlRXh0cmFjdG9yOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNvcnRpbmdGdW5jdGlvblxuICAgKiAoc2VlIHtAbGluayBiYXIjc29ydGluZ0Z1bmN0aW9ufSlcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IGZ1bmN0aW9ufVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNvcnRpbmdGdW5jdGlvbiA9IGZ1bmN0aW9uKGtleUEsIGtleUIpIHtyZXR1cm4gZDMuZGVzY2VuZGluZyhkYXRhW2tleUFdLCBkYXRhW2tleUJdKX0sXG4gICAqL1xuICBiYXIuc29ydGluZ0Z1bmN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzb3J0aW5nRnVuY3Rpb24gPSBfLCBiYXIpIDogc29ydGluZ0Z1bmN0aW9uOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNjYWxlIGZvciB3aGljaCB0aGUgYmFyIHZhbHVlcyBzaG91bGQgYmUgdHJhbnNmb3JtZWQgYnlcbiAgICogKHNlZSB7QGxpbmsgYmFyI3NjYWxlfSlcbiAgICogQHBhcmFtIHtkMy5zY2FsZX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IGQzLnNjYWxlfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKVxuICAgKi9cbiAgYmFyLnNjYWxlID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzY2FsZSA9IF8sIGJhcikgOiBzY2FsZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBwYWRkaW5nIGZvciB0aGUgZG9tYWluIG9mIHRoZSBzY2FsZVxuICAgKiAoc2VlIHtAbGluayBiYXIjZG9tYWluUGFkZGluZ30pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YmFyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGRvbWFpblBhZGRpbmcgPSAwLjVcbiAgICovXG4gIGJhci5kb21haW5QYWRkaW5nID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkb21haW5QYWRkaW5nID0gXywgYmFyKSA6IGRvbWFpblBhZGRpbmc7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyBvYmplY3RTcGFjZXJcbiAgICogKHNlZSB7QGxpbmsgYmFyI29iamVjdFNwYWNlcn0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YmFyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG9iamVjdFNwYWNlciA9IDAuMDVcbiAgICovXG4gIGJhci5vYmplY3RTcGFjZXIgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9iamVjdFNwYWNlciA9IF8sIGJhcikgOiBvYmplY3RTcGFjZXI7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbWluT2JqZWN0U2l6ZVxuICAgKiAoc2VlIHtAbGluayBiYXIjbWluT2JqZWN0U2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YmFyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG1pbk9iamVjdFNpemUgPSA1MFxuICAgKi9cbiAgYmFyLm1pbk9iamVjdFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG1pbk9iamVjdFNpemUgPSBfLCBiYXIpIDogbWluT2JqZWN0U2l6ZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBtYXhPYmplY3RTaXplXG4gICAqIChzZWUge0BsaW5rIGJhciNtYXhPYmplY3RTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtiYXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgbWF4T2JqZWN0U2l6ZSA9IDEwMFxuICAgKi9cbiAgYmFyLm1heE9iamVjdFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG1heE9iamVjdFNpemUgPSBfLCBiYXIpIDogbWF4T2JqZWN0U2l6ZTsgfTtcblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGJhclN0cm9rZVdpZHRoXG4gICAqIChzZWUge0BsaW5rIGJhciNiYXJTdHJva2VXaWR0aH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YmFyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGJhclN0cm9rZVdpZHRoID0gMlxuICAgKi9cbiAgYmFyLmJhclN0cm9rZVdpZHRoID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChiYXJTdHJva2VXaWR0aCA9IF8sIGJhcikgOiBiYXJTdHJva2VXaWR0aDsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBjb2xvckZ1bmN0aW9uXG4gICAqIChzZWUge0BsaW5rIGJhciNjb2xvckZ1bmN0aW9ufSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtiYXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgY29sb3JGdW5jdGlvbiA9IGNvbG9yRnVuY3Rpb24oKVxuICAgKi9cbiAgYmFyLmNvbG9yRnVuY3Rpb24gPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNvbG9yRnVuY3Rpb24gPSBfLCBiYXIpIDogY29sb3JGdW5jdGlvbjsgfTtcblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGJhY2tncm91bmRGaWxsXG4gICAqIChzZWUge0BsaW5rIGJhciNiYWNrZ3JvdW5kRmlsbH0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YmFyIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGJhY2tncm91bmRGaWxsID0gJ3RyYW5zcGFyZW50J1xuICAgKi9cbiAgYmFyLmJhY2tncm91bmRGaWxsID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChiYWNrZ3JvdW5kRmlsbCA9IF8sIGJhcikgOiBiYWNrZ3JvdW5kRmlsbDsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBuYW1lc3BhY2VcbiAgICogKHNlZSB7QGxpbmsgYmFyI25hbWVzcGFjZX0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YmFyIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG5hbWVzcGFjZSA9ICdkM3NtLWJhcidcbiAgICovXG4gIGJhci5uYW1lc3BhY2UgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG5hbWVzcGFjZSA9IF8sIGJhcikgOiBuYW1lc3BhY2U7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgb2JqZWN0Q2xhc3NcbiAgICogKHNlZSB7QGxpbmsgYmFyI29iamVjdENsYXNzfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtiYXIgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgb2JqZWN0Q2xhc3MgPSAndGljay1ncm91cCdcbiAgICovXG4gIGJhci5vYmplY3RDbGFzcyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob2JqZWN0Q2xhc3MgPSBfLCBiYXIpIDogb2JqZWN0Q2xhc3M7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdHJhbnNpdGlvbkR1cmF0aW9uXG4gICAqIChzZWUge0BsaW5rIGJhciN0cmFuc2l0aW9uRHVyYXRpb259KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJhclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0cmFuc2l0aW9uRHVyYXRpb24gPSAxMDAwXG4gICAqL1xuICBiYXIudHJhbnNpdGlvbkR1cmF0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0cmFuc2l0aW9uRHVyYXRpb24gPSBfLCBiYXIpIDogdHJhbnNpdGlvbkR1cmF0aW9uOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGVhc2VGdW5jXG4gICAqIChzZWUge0BsaW5rIGJhciNlYXNlRnVuY30pXG4gICAqIEBwYXJhbSB7ZDMuZWFzZX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IGQzLmVhc2V9XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgZWFzZUZ1bmMgPSBkMy5lYXNlRXhwXG4gICAqL1xuICBiYXIuZWFzZUZ1bmMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGVhc2VGdW5jID0gXywgYmFyKSA6IGVhc2VGdW5jOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBiYXJLZXlzXG4gICAqIChzZWUge0BsaW5rIGJhciNiYXJLZXlzfSlcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IHN0cmluZ1tdfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGJhcktleXMgPSB1bmRlZmluZWRcbiAgICovXG4gIGJhci5iYXJLZXlzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChiYXJLZXlzID0gXywgYmFyKSA6IGJhcktleXM7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgYmFyVmFsdWVzXG4gICAqIChzZWUge0BsaW5rIGJhciNiYXJWYWx1ZXN9KVxuICAgKiBAcGFyYW0ge251bWJlcltdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YmFyIHwgbnVtYmVyW119XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgYmFyVmFsdWVzID0gdW5kZWZpbmVkXG4gICAqL1xuICBiYXIuYmFyVmFsdWVzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChiYXJWYWx1ZXMgPSBfLCBiYXIpIDogYmFyVmFsdWVzOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG9iamVjdFNpemVcbiAgICogKHNlZSB7QGxpbmsgYmFyI29iamVjdFNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJhclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvYmplY3RTaXplID0gdW5kZWZpbmVkXG4gICAqL1xuICBiYXIub2JqZWN0U2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob2JqZWN0U2l6ZSA9IF8sIGJhcikgOiBvYmplY3RTaXplOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNwYWNlclNpemVcbiAgICogKHNlZSB7QGxpbmsgYmFyI3NwYWNlclNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJhclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzcGFjZXJTaXplID0gdW5kZWZpbmVkXG4gICAqL1xuICBiYXIuc3BhY2VyU2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3BhY2VyU2l6ZSA9IF8sIGJhcikgOiBzcGFjZXJTaXplOyB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdG9vbHRpcFxuICAgKiAoc2VlIHtAbGluayBiYXIjdG9vbHRpcH0pXG4gICAqIEBwYXJhbSB7dG9vbHRpcH0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IHRvb2x0aXB9XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdG9vbHRpcCA9IHRvb2x0aXAoKVxuICAgKi9cbiAgYmFyLnRvb2x0aXAgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRvb2x0aXAgPSBfLCBiYXIpIDogdG9vbHRpcDsgfTtcblxuXG4gIGZ1bmN0aW9uIGJhcigpIHtcbiAgICAvLyBmb3IgY29udmVuaWVuY2UgaW4gaGFuZGxpbmcgb3JpZW50YXRpb24gc3BlY2lmaWMgdmFsdWVzXG4gICAgdmFyIGhvcml6b250YWxRID0gKG9yaWVudCA9PSAnaG9yaXpvbnRhbCcpID8gdHJ1ZSA6IGZhbHNlXG4gICAgdmFyIHZlcnRpY2FsUSA9ICFob3Jpem9udGFsUVxuXG4gICAgLy8gYmFja2dyb3VuZCBjbGlwaW5nIHJlY3RhbmdsZVxuICAgIHZhciBiZ2NwUmVjdCA9IHt4OjAsIHk6MCwgd2lkdGg6IHNwYWNlWCwgaGVpZ2h0OnNwYWNlWX1cbiAgICB2YXIgY29udGFpbmVyID0gc2V0dXBDb250YWluZXIoIHNlbGVjdGlvbiwgbmFtZXNwYWNlLCBiZ2NwUmVjdCwgYmFja2dyb3VuZEZpbGwgKTtcblxuICAgIC8vIHRvIHByZXZlbnQgcmUtY2FsY3VsYXRpb24gYW5kIGdldHRlcnMgdG8gYmUgcGFzc2VkIHRvIGF4ZXNcbiAgICBiYXJLZXlzID0gZDMua2V5cyhkYXRhKVxuICAgIGJhclZhbHVlcyA9IGJhcktleXMubWFwKHZhbHVlRXh0cmFjdG9yKVxuXG4gICAgLy8gaWYgZ3JvdXBpbmcgaXMgdW5kZWZpbmVkIHNvcnQgYmFyS2V5cyBieSBzb3J0aW5nRnVuY3Rpb25cbiAgICB2YXIgb3JkZXJlZCA9IChncm91cGluZyA9PSB1bmRlZmluZWQpID8gYmFyS2V5cy5zb3J0KHNvcnRpbmdGdW5jdGlvbikgOiBncm91cGluZ1xuICAgIC8vIG9yZGVyZWQgbWlnaHQgYmUgbmVzdGVkIGRlcGVuZGluZyBvbiBncm91cGluZ1xuICAgIGJhcktleXMgPSBmbGF0dGVuKG9yZGVyZWQpXG5cbiAgICB2YXIgbnVtYmVyT2ZPYmplY3RzID0gYmFyS2V5cy5sZW5ndGhcbiAgICB2YXIgZXh0ZW50ID0gW01hdGgubWluKC4uLmJhclZhbHVlcykgLSBkb21haW5QYWRkaW5nLE1hdGgubWF4KC4uLmJhclZhbHVlcykgKyBkb21haW5QYWRkaW5nXTtcblxuXG5cbiAgICAvLyBzZXQgdGhlIHNjYWxlXG4gICAgc2NhbGUuZG9tYWluKGV4dGVudCkucmFuZ2UoaG9yaXpvbnRhbFEgPyBbMCxzcGFjZVldIDogW3NwYWNlWCwgMF0pXG4gICAgdmFyIHNwYWNlID0gaG9yaXpvbnRhbFEgPyBzcGFjZVggOiBzcGFjZVlcbiAgICAvLyBjYWxjdWxhdGUgb2JqZWN0IHNpemVcbiAgICBvYmplY3RTaXplID0gY2FsY3VsYXRlV2lkdGhPZk9iamVjdChzcGFjZSwgbnVtYmVyT2ZPYmplY3RzLCBtaW5PYmplY3RTaXplLCBtYXhPYmplY3RTaXplLCBvYmplY3RTcGFjZXIsIG92ZXJmbG93USlcbiAgICAvLyBjYWxjdWxhdGUgc3BhY2VyIHNpemUgaWYgbmVlZGVkXG4gICAgc3BhY2VyU2l6ZSA9IGNhbGN1bGF0ZVdpZHRoT2ZTcGFjZXIoYmFyS2V5cywgc3BhY2UsIG9iamVjdFNpemUsIG51bWJlck9mT2JqZWN0cywgb2JqZWN0U3BhY2VyLCBvdmVyZmxvd1EpXG4gICAgLy8gbWFrZSB0aGUgbmVzdGVkIGdyb3Vwc1xuICAgIHZhciBzcGFjZXJGdW5jdGlvbiA9IGdyb3VwaW5nU3BhY2VyKClcbiAgICAuaG9yaXpvbnRhbFEoaG9yaXpvbnRhbFEpLnNjYWxlKHNjYWxlKS5tb3ZlYnkoJ2NhdGVnb3J5JykubnVtYmVyT2ZPYmplY3RzKG51bWJlck9mT2JqZWN0cylcbiAgICAub2JqZWN0Q2xhc3Mob2JqZWN0Q2xhc3MpLm9iamVjdFNpemUob2JqZWN0U2l6ZSkuc3BhY2VyU2l6ZShzcGFjZXJTaXplKVxuICAgIC50cmFuc2l0aW9uRHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlRnVuYyhlYXNlRnVuYylcbiAgICAubmFtZXNwYWNlKG5hbWVzcGFjZSlcbiAgICAvLyBzYWZlIGRlZmF1bHQgZnVuY3Rpb25cbiAgICB2YXIgZGVmYXVsdEV4aXQgPSBzcGFjZXJGdW5jdGlvbi5leGl0RnVuY3Rpb24oKVxuXG4gICAgc3BhY2VyRnVuY3Rpb24uZXhpdEZ1bmN0aW9uKGZ1bmN0aW9uKHNlbCl7XG4gICAgICAvLyB1c2UgZGVmYXVsdCB0byBtb3ZlIG9iamVjdHMgb2ZmIHNjcmVlblxuICAgICAgZGVmYXVsdEV4aXQoc2VsKVxuICAgICAgLy8gc2hyaW5rIHJlY3RhbmdsZXMgaW4gYWRkaXRpb25cbiAgICAgIHNlbC5zZWxlY3RBbGwoJyogPiByZWN0JylcbiAgICAgIC50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uKGQsIGkpIHtcbiAgICAgICAgdmFyXG4gICAgICAgIHggPSBob3Jpem9udGFsUSA/IDAgOiAwLFxuICAgICAgICB5ID0gdmVydGljYWxRID8gMCA6IHNjYWxlKGV4dGVudFsxXSksXG4gICAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgICAgcmV0dXJuIHRcbiAgICAgIH0pXG4gICAgICAuYXR0cignd2lkdGgnLCBob3Jpem9udGFsUSA/IG9iamVjdFNpemUgOiAwKVxuICAgICAgLmF0dHIoJ2hlaWdodCcsIHZlcnRpY2FsUSA/IG9iamVjdFNpemUgOiAwKS5yZW1vdmUoKVxuICAgIH0pXG5cbiAgICAvLyBtb3ZlIHN0dWZmXG4gICAgc3BhY2VyRnVuY3Rpb24oY29udGFpbmVyLCBvcmRlcmVkLCAwKVxuXG5cblxuXG4gICAgdmFyIHBhcmVudEluZGV4QXJyYXkgPSBbXVxuICAgIGNvbnRhaW5lci5zZWxlY3RBbGwoJ2c6bm90KC50by1yZW1vdmUpLicrb2JqZWN0Q2xhc3MpXG4gICAgLmVhY2goZnVuY3Rpb24oZCwgaSl7cGFyZW50SW5kZXhBcnJheS5wdXNoKE51bWJlcihkMy5zZWxlY3QodGhpcykuYXR0cigncGFyZW50LWluZGV4JykpKX0pXG5cblxuICAgIGNvbG9yRnVuY3Rpb24gPSBjb2xvckZ1bmN0aW9uLmNvbG9yQnkoKSA9PSAnaW5kZXgnXG4gICAgPyBjb2xvckZ1bmN0aW9uLmRhdGFFeHRlbnQoWzAsIE1hdGgubWF4KC4uLnBhcmVudEluZGV4QXJyYXkpXSlcbiAgICA6IGNvbG9yRnVuY3Rpb24uZGF0YUV4dGVudChleHRlbnQpXG5cblxuXG4gICAgY29udGFpbmVyLnNlbGVjdEFsbCgnZzpub3QoLnRvLXJlbW92ZSkuJytvYmplY3RDbGFzcykuZWFjaChmdW5jdGlvbihrZXksIGkpIHtcbiAgICAgIHZhciB0ID0gZDMuc2VsZWN0KHRoaXMpLFxuICAgICAgY3VycmVudERhdGEgPSBkYXRhW2tleV0sXG4gICAgICB2YWx1ZSA9IHZhbHVlRXh0cmFjdG9yKGtleSwgaSksXG4gICAgICBpID0gdC5hdHRyKCdwYXJlbnQtaW5kZXgnKSA9PSB1bmRlZmluZWQgPyBpIDogdC5hdHRyKCdwYXJlbnQtaW5kZXgnKSxcbiAgICAgIGZpbGxDb2xvciA9IGNvbG9yRnVuY3Rpb24oa2V5LCB2YWx1ZSwgaSwgJ2ZpbGwnKSwgLy8gcHJldmVudCBkdXBsaWNhdGUgY29tcHV0YXRpb25cbiAgICAgIHN0cm9rZUNvbG9yID0gY29sb3JGdW5jdGlvbihrZXksIHZhbHVlLCBpLCAgJ3N0cm9rZScpXG5cblxuICAgICAgdmFyIGJhciA9IHNhZmVTZWxlY3QodCwgJ3JlY3QnLCAnYmFyLXJlY3QnKVxuXG4gICAgICBpZiAoYmFyLmF0dHIoJ3RyYW5zZm9ybScpID09IHVuZGVmaW5lZCkge1xuICAgICAgICBiYXIuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24oZCwgaSkge1xuICAgICAgICAgIHZhclxuICAgICAgICAgIHggPSBob3Jpem9udGFsUSA/IDAgOiAwLFxuICAgICAgICAgIHkgPSB2ZXJ0aWNhbFEgPyAwIDogc2NhbGUoZXh0ZW50WzFdKSxcbiAgICAgICAgICB0ID0gJ3RyYW5zbGF0ZSgnK3grJywnK3krJyknXG4gICAgICAgICAgcmV0dXJuIHRcbiAgICAgICAgfSlcbiAgICAgICAgLmF0dHIoJ3dpZHRoJywgaG9yaXpvbnRhbFEgPyBvYmplY3RTaXplIDogMClcbiAgICAgICAgLmF0dHIoJ2hlaWdodCcsIHZlcnRpY2FsUSA/IG9iamVjdFNpemUgOiAwKVxuICAgICAgfVxuXG5cbiAgICAgIGJhci50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlKGVhc2VGdW5jKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uKGQsIGkpIHtcbiAgICAgICAgdmFyXG4gICAgICAgIHggPSBob3Jpem9udGFsUSA/IDAgOiAwLFxuICAgICAgICB5ID0gdmVydGljYWxRID8gMCA6IHNjYWxlKGV4dGVudFsxXSkgLSBzY2FsZSh2YWx1ZSksXG4gICAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgICAgcmV0dXJuIHRcbiAgICAgIH0pXG4gICAgICAuYXR0cignd2lkdGgnLCBob3Jpem9udGFsUSA/IG9iamVjdFNpemUgOiBzY2FsZSh2YWx1ZSkpXG4gICAgICAuYXR0cignaGVpZ2h0JywgdmVydGljYWxRID8gb2JqZWN0U2l6ZSA6IHNjYWxlKHZhbHVlKSlcbiAgICAgIC5hdHRyKCdmaWxsJywgZmlsbENvbG9yKVxuICAgICAgLmF0dHIoJ3N0cm9rZScsIHN0cm9rZUNvbG9yKVxuICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIGJhclN0cm9rZVdpZHRoKVxuXG5cblxuICAgICAgdC5vbignbW91c2VvdmVyJywgZnVuY3Rpb24oZCwgaSl7XG4gICAgICAgIGNvbnRhaW5lci5zZWxlY3RBbGwoJ2cuJytvYmplY3RDbGFzcykuc3R5bGUoJ29wYWNpdHknLCAwLjIpXG4gICAgICAgIHQuc3R5bGUoJ29wYWNpdHknLCAxKVxuICAgICAgICBiYXIuYXR0cignc3Ryb2tlLXdpZHRoJyxiYXJTdHJva2VXaWR0aCoyKVxuXG4gICAgICB9KVxuICAgICAgdC5vbignbW91c2VvdXQnLCBmdW5jdGlvbigpe1xuICAgICAgICBjb250YWluZXIuc2VsZWN0QWxsKCdnLicrb2JqZWN0Q2xhc3MpLnN0eWxlKCdvcGFjaXR5JywgMSlcbiAgICAgICAgYmFyLmF0dHIoJ3N0cm9rZS13aWR0aCcsIGJhclN0cm9rZVdpZHRoKVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgdG9vbHRpcC5zZWxlY3Rpb24oY29udGFpbmVyLnNlbGVjdEFsbCgnLmJhci1yZWN0JykpXG4gICAgLmRhdGEoZGF0YSlcblxuICAgIHRvb2x0aXAoKVxuXG4gIH1cbiAgcmV0dXJuIGJhclxufVxuIiwiaW1wb3J0IHtoeXBlbmF0ZSwgc2FmZVNlbGVjdH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7c2V0dXBDb250YWluZXIsIGNhbGN1bGF0ZVdpZHRoT2ZPYmplY3QsIGNhbGN1bGF0ZVdpZHRoT2ZTcGFjZXIsIGxvZ30gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge3VuaXF1ZX0gZnJvbSAnLi9hcnJheS1mdW5jdGlvbnMnO1xuaW1wb3J0IHtncm91cGluZ1NwYWNlcn0gZnJvbSAnLi9ncm91cGluZy1zcGFjZXInO1xuaW1wb3J0IHtjb2xvckZ1bmN0aW9uIGFzIENGfSBmcm9tICcuL2NvbG9yLWZ1bmN0aW9uJztcbmltcG9ydCB7dG9vbHRpcCBhcyBUVGlwfSBmcm9tICcuL3Rvb2x0aXAnO1xuXG5cbi8qKlxuICogQ3JlYXRlcyBhIGJ1YmJsZUhlYXRtYXBcbiAqXG4gKiB7QGxpbmsgaHR0cHM6Ly9zdW1uZXVyb24uZ2l0bGFiLmlvL2Qzc20vZGVtb3MvYnViYmxlLWhlYXRtYXAvaW5kZXguaHRtbCBEZW1vfVxuICogQGNvbnN0cnVjdG9yIGJ1YmJsZUhlYXRtYXBcbiAqIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBzZWxlY3Rpb25cbiAqIEBuYW1lc3BhY2UgYnViYmxlSGVhdG1hcFxuICogQHJldHVybnMge2Z1bmN0aW9ufSBidWJibGVIZWF0bWFwXG4gKi9cbmZ1bmN0aW9uIGJ1YmJsZUhlYXRtYXAoIHNlbGVjdGlvbiApIHtcbiAgdmFyXG4gIC8qKlxuICAqIERhdGEgdG8gcGxvdC4gQXNzdW1lZCB0byBiZSBhIG9iamVjdCwgd2hlcmUgZWFjaCBrZXkgY29ycmVzcG9uZHMgdG8gYSBjZWxsXG4gICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNkYXRhfSlcbiAgKiBAcGFyYW0ge09iamVjdH0gW2RhdGE9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBkYXRhLFxuXG4gIC8qKlxuICAqIEFtb3VudCBvZiBob3Jpem9udGFsIHNwYWNlIChpbiBwaXhlbHMpIGF2YWlibGUgdG8gcmVuZGVyIHRoZSBidWJibGVIZWF0bWFwIGluXG4gICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNzcGFjZVh9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbc3BhY2VYPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc3BhY2VYLFxuICAvKipcbiAgKiBBbW91bnQgb2YgdmVydGljYWwgc3BhY2UgKGluIHBpeGVscykgYXZhaWJsZSB0byByZW5kZXIgdGhlIGJ1YmJsZUhlYXRtYXAgaW5cbiAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwLnNwYWNlWX0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZVk9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzcGFjZVksXG5cbiAgLyoqXG4gICogVGhlIGludGVybmFsIGtleSBvZiB0aGUgY2VsbCBzcGVjaWZpeWluZyB0byB3aGljaCB4IGF4aXMga2V5IGl0IGJlbG9uZ3NcbiAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwLnhLZXl9KVxuICAqIEBwYXJhbSB7c3RyaW5nfSBbeEtleT0neCddXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHhLZXkgPSAneCcsXG4gIC8qKlxuICAqIFRoZSBpbnRlcm5hbCBrZXkgb2YgdGhlIGNlbGwgc3BlY2lmaXlpbmcgdG8gd2hpY2ggeSBheGlzIGtleSBpdCBiZWxvbmdzXG4gICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcC55S2V5fSlcbiAgKiBAcGFyYW0ge3N0cmluZ30gW3lLZXk9J3knXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB5S2V5ID0gJ3knLFxuICAvKipcbiAgKiBUaGUgaW50ZXJuYWwga2V5IG9mIHRoZSBjZWxsIHNwZWNpZml5aW5nIHdoYXQgdmFsdWUgdG8gdXNlIHRvIGRldGVybWluZSB0aGUgcmFkaXVzXG4gICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcC5yS2V5fSlcbiAgKiBAcGFyYW0ge3N0cmluZ30gW3JLZXk9J3InXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICByS2V5ID0gJ3InLFxuICAvKipcbiAgKiBUaGUgaW50ZXJuYWwga2V5IG9mIHRoZSBjZWxsIHNwZWNpZml5aW5nIHdoYXQgdmFsdWUgdG8gdXNlIHRvIGRldGVybWluZSB0aGUgY29sb3JcbiAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwLnZLZXl9KVxuICAqIEBwYXJhbSB7c3RyaW5nfSBbdktleT0ndiddXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHZLZXkgPSAndicsXG5cbiAgLyoqXG4gICogRnVuY3Rpb24gZm9yIGV4dHJhY3RpbmcgdGhlIHRoZSB2YWx1ZSBmcm9tIHhLZXkuXG4gICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcC54RXh0cmFjdG9yfSlcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbeEV4dHJhY3Rvcj1mdW5jdGlvbihrZXksIGkpIHsgcmV0dXJuIGRhdGFba2V5XVt4S2V5XSB9XVxuICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHhFeHRyYWN0b3IgPSBmdW5jdGlvbihrZXksIGkpIHtyZXR1cm4gZGF0YVtrZXldW3hLZXldIH0sXG4gIC8qKlxuICAqIEZ1bmN0aW9uIGZvciBleHRyYWN0aW5nIHRoZSB0aGUgdmFsdWUgZnJvbSB5S2V5LlxuICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAueUV4dHJhY3Rvcn0pXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW3lFeHRyYWN0b3I9ZnVuY3Rpb24oa2V5LCBpKSB7IHJldHVybiBkYXRhW2tleV1beUtleV0gfV1cbiAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB5RXh0cmFjdG9yID0gZnVuY3Rpb24oa2V5LCBpKSB7IHJldHVybiBkYXRhW2tleV1beUtleV0gfSxcbiAgLyoqXG4gICogRnVuY3Rpb24gZm9yIGV4dHJhY3RpbmcgdGhlIHRoZSB2YWx1ZSBmcm9tIHJLZXkuXG4gICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcC5yRXh0cmFjdG9yfSlcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbckV4dHJhY3Rvcj1mdW5jdGlvbihrZXksIGkpIHsgcmV0dXJuIGRhdGFba2V5XVtyS2V5XSB9XVxuICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHJFeHRyYWN0b3IgPSBmdW5jdGlvbihrZXksIGkpIHsgcmV0dXJuIGRhdGFba2V5XVtyS2V5XSB9LFxuICAvKipcbiAgKiBGdW5jdGlvbiBmb3IgZXh0cmFjdGluZyB0aGUgdGhlIHZhbHVlIGZyb20gdktleS5cbiAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwLnZFeHRyYWN0b3J9KVxuICAqIEBwYXJhbSB7ZnVuY3Rpb259IFt2RXh0cmFjdG9yPWZ1bmN0aW9uKGtleSwgaSkgeyByZXR1cm4gZGF0YVtrZXldW3ZLZXldIH1dXG4gICogQHJldHVybnMge251bWJlcn1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdkV4dHJhY3RvciA9IGZ1bmN0aW9uKGtleSwgaSkgeyByZXR1cm4gZGF0YVtrZXldW3ZLZXldIH0sXG5cblxuICAvKipcbiAgKiBXaGV0aGVyIG9yIG5vdCB0byBhbGxvdyBidWJibGVIZWF0bWFwIHRvIHJlbmRlciBlbGVtZW50cyBwYXNzIHRoZSBtYWluIHNwYXRpYWwgZGltZW5zaW9uXG4gICogZ2l2ZW4gdGhlIG9yaWVudGF0aW9uIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjb3JpZW50fSksIHdoZXJlIHtAbGluayBidWJibGVIZWF0bWFwI29yaWVudH09XCJib3R0b21cIiBvciB7QGxpbmsgYnViYmxlSGVhdG1hcCNvcmllbnR9PVwidG9wXCJcbiAgKiB0aGUgbWFpbiBkaW1lbnNpb24gaXMge0BsaW5rIGJ1YmJsZUhlYXRtYXAjc3BhY2VYfSBhbmQgd2hlcmUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjb3JpZW50fT1cImxlZnRcIiBvciB7QGxpbmsgYnViYmxlSGVhdG1hcCNvcmllbnR9PVwicmlnaHRcIlxuICAqIHRoZSBtYWluIGRpbWVuc2lvbiBpcyB7QGxpbmsgYnViYmxlSGVhdG1hcCNzcGFjZVl9XG4gICogQHBhcmFtIHtib29sZWFufSBbb3ZlcmZsb3dRPWZhbHNlXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBvdmVyZmxvd1EgPSBmYWxzZSxcblxuICAvKipcbiAgKiBUaGUgc2NhbGUgZm9yIHdoaWNoIHRoZSByYWRpdXMgdmFsdWVzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBieVxuICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtzY2FsZT1kMy5zY2FsZUxpbmVhcl1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc2NhbGUgPSBkMy5zY2FsZUxpbmVhcigpLFxuICAvKipcbiAgKiBUaGUgcGFkZGluZyBmb3IgdGhlIGRvbWFpbiBvZiB0aGUgc2NhbGUgKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNzY2FsZX0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtkb21haW5QYWRkaW5nPTAuNV1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZG9tYWluUGFkZGluZyA9IDAuNSxcblxuICAvKipcbiAgKiBEZWZhdWx0IHNwYWNlIGZvciB0aGUgc3BhY2VyIChwZXJjZW50YWdlKSBvZiBtYWluIGRpbWVuc2lvbiBnaXZlbiB0aGUgb3JpZW50YXRpb25cbiAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI29yaWVudH0pLCB3aGVyZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNvcmllbnR9PVwiaG9yaXpvbnRhbFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBidWJibGVIZWF0bWFwI3NwYWNlWH0gYW5kIHdoZXJlIHtAbGluayBidWJibGVIZWF0bWFwI29yaWVudH09XCJ2ZXJ0aWNhbFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBidWJibGVIZWF0bWFwI3NwYWNlWX0gYmV0d2VlbiBidWJibGVzXG4gICogQHBhcmFtIHtudW1iZXJ9IFtvYmplY3RTcGFjZXI9MC4wXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBvYmplY3RTcGFjZXIgPSAwLjAsXG4gIC8qKlxuICAqIFRoZSBtaW5pbXVtIHNpemUgdGhhdCBhbiBvYmplY3QgY2FuIGJlXG4gICogQHBhcmFtIHtudW1iZXJ9IFttaW5PYmplY3RTaXplPTUwXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBtaW5PYmplY3RTaXplID0gNTAsXG4gIC8qKlxuICAqIFRoZSBtYXhpbXVtIHNpemUgdGhhdCBhbiBvYmplY3QgY2FuIGJlXG4gICogQHBhcmFtIHtudW1iZXJ9IFttYXhPYmplY3RTaXplPTEwMF1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgbWF4T2JqZWN0U2l6ZSA9IDEwMCxcblxuXG4gIC8qKlxuICAqIFRoZSBzdHJva2Ugd2lkdGggb2YgdGhlIGJ1YmJsZXNcbiAgKiBAcGFyYW0ge251bWJlcn0gW2J1YmJsZVN0cm9rZVdpZHRoPTJdXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGJ1YmJsZVN0cm9rZVdpZHRoID0gMixcbiAgLy8gY29sb3JGdW5jID0gY29sb3JGdW5jdGlvbigpLFxuXG4gIC8qKlxuICAqIENvbG9yIG9mIHRoZSBiYWNrZ3JvdW5kXG4gICogQHBhcmFtIHtzdHJpbmd9IFtiYWNrZ3JvdW5kRmlsbD1cInRyYW5zcGFyZW50XCJdXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGJhY2tncm91bmRGaWxsID0gJ3RyYW5zcGFyZW50JyxcbiAgLyoqXG4gICogTmFtZXNwYWNlIGZvciBhbGwgaXRlbXMgbWFkZSBieSB0aGlzIGluc3RhbmNlIG9mIGJ1YmJsZUhlYXRtYXBcbiAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVzcGFjZT1cImQzc20tYnViYmxlXCJdXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG5hbWVzcGFjZSA9ICdkM3NtLWJ1YmJsZScsXG4gIC8qKlxuICAqIENsYXNzIG5hbWUgZm9yIGJ1YmJsZSBjb250YWluZXIgKDxnPiBlbGVtZW50KVxuICAqIEBwYXJhbSB7c3RyaW5nfSBbb2JqZWN0Q2xhc3M9XCJidWJibGVcIl1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb2JqZWN0Q2xhc3MgPSAnYnViYmxlJyxcbiAgLyoqXG4gICogRHVyYXRpb24gb2YgYWxsIHRyYW5zaXRpb25zIG9mIHRoaXMgZWxlbWVudFxuICAqIEBwYXJhbSB7bnVtYmVyfSBbdHJhbnNpdGlvbkR1cmF0aW9uPTEwMDBdXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHRyYW5zaXRpb25EdXJhdGlvbiA9IDEwMDAsXG4gIC8qKlxuICAqIEVhc2luZyBmdW5jdGlvbiBmb3IgdHJhbnNpdGlvbnNcbiAgKiBAcGFyYW0ge2QzLmVhc2V9IFtlYXNlRnVuYz1kMy5lYXNlRXhwXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBlYXNlRnVuYyA9IGQzLmVhc2VFeHAsXG5cbiAgLyoqXG4gICogU3RvcmVzIHRoZSBrZXlzIG9mIGFsbCB0aGUgY2VsbHNcbiAgKiBDYWxjdWxhdGVkIGFmdGVyIGJ1YmJsZUhlYXRtYXAgY2FsbGVkLlxuICAqIEBwYXJhbSB7c3RyaW5nW119IFtjZWxsS2V5cz11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGNlbGxLZXlzLFxuICAvKipcbiAgKiBTdG9yZXMgdGhlIGxpc3Qgb2YgdW5pcXVlIHhWYWx1ZXNcbiAgKiBDYWxjdWxhdGVkIGFmdGVyIGJ1YmJsZUhlYXRtYXAgY2FsbGVkLlxuICAqIEBwYXJhbSB7c3RyaW5nW119IFt4VmFsdWVzPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgeFZhbHVlcyxcbiAgLyoqXG4gICogU3RvcmVzIHRoZSBsaXN0IG9mIHVuaXF1ZSB5VmFsdWVzXG4gICogQ2FsY3VsYXRlZCBhZnRlciBidWJibGVIZWF0bWFwIGNhbGxlZC5cbiAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbeVZhbHVlcz11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHlWYWx1ZXMsXG4gIC8qKlxuICAqIFN0b3JlcyB0aGUgbGlzdCBvZiB1bmlxdWUgclZhbHVlc1xuICAqIENhbGN1bGF0ZWQgYWZ0ZXIgYnViYmxlSGVhdG1hcCBjYWxsZWQuXG4gICogQHBhcmFtIHtzdHJpbmdbXX0gW3JWYWx1ZXM9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICByVmFsdWVzLFxuICAvKipcbiAgKiBTdG9yZXMgdGhlIGxpc3Qgb2YgdW5pcXVlIHZWYWx1ZXNcbiAgKiBDYWxjdWxhdGVkIGFmdGVyIGJ1YmJsZUhlYXRtYXAgY2FsbGVkLlxuICAqIEBwYXJhbSB7c3RyaW5nW119IFt2VmFsdWVzPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdlZhbHVlcyxcblxuICB4S2V5U29ydGluZ0Z1bmN0aW9uID0gZnVuY3Rpb24oYSwgYikgeyByZXR1cm4geEV4dHJhY3RvcihhKSAtIHhFeHRyYWN0b3IoYikgfSxcbiAgeUtleVNvcnRpbmdGdW5jdGlvbiA9IGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIHlFeHRyYWN0b3IoYSkgLSB5RXh0cmFjdG9yKGIpIH0sXG4gIHJLZXlTb3J0aW5nRnVuY3Rpb24gPSBmdW5jdGlvbihhLCBiKSB7IHJldHVybiByRXh0cmFjdG9yKGEpIC0gckV4dHJhY3RvcihiKSB9LFxuICB2S2V5U29ydGluZ0Z1bmN0aW9uID0gZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gdkV4dHJhY3RvcihhKSAtIHZFeHRyYWN0b3IoYikgfSxcblxuICAvKipcbiAgKiBJbnN0YW5jZSBvZiBDb2xvckZ1bmN0aW9uIHdpdGggLmNvbG9yQnkgc2V0IHRvICdjYXRlZ29yeSdcbiAgKiBAZnVuY3Rpb24gY29sb3JGdW5jdGlvblxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBjb2xvckZ1bmN0aW9uID0gQ0YoKS5jb2xvckJ5KCdjYXRlZ29yeScpLFxuICAvKipcbiAgKiBJbnN0YW5jZSBvZiBUb29sdGlwXG4gICogQGZ1bmN0aW9uIHRvb2x0aXBcbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdG9vbHRpcCA9IFRUaXAoKSxcblxuICAvKipcbiAgKiBzdG9yZSB0aGUgc2l6ZSB0aGUgYnViYmxlIGNvdWxkIGJlIGluIHRoZSB4IGRpbWVuc2lvblxuICAqIHRoZSBhY3R1YWxsIHNpemUgb2YgdGhlIGJ1YmJsZSB3aWxsIGJlIHRoZSBtaW4gb2YgeFNpemUgYW5kIHtAbGluayBidWJibGVIZWF0bWFwI3lTaXplfVxuICAqIENhbGN1bGF0ZWQgYWZ0ZXIgYnViYmxlSGVhdG1hcCBjYWxsZWQuXG4gICogQHBhcmFtIHtzdHJpbmdbXX0gW3hTaXplPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgeFNpemUsXG4gIC8qKlxuICAqIHN0b3JlIHRoZSBzaXplIG9mIHRoZSBzcGFjZXIgaW4gdGhlIHggZGltZW5zaW9uXG4gICogQ2FsY3VsYXRlZCBhZnRlciBidWJibGVIZWF0bWFwIGNhbGxlZC5cbiAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbeFNwYWNlclNpemU9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB4U3BhY2VyU2l6ZSxcblxuICAvKipcbiAgKiBzdG9yZSB0aGUgc2l6ZSB0aGUgYnViYmxlIGNvdWxkIGJlIGluIHRoZSB5IGRpbWVuc2lvblxuICAqIHRoZSBhY3R1YWxsIHNpemUgb2YgdGhlIGJ1YmJsZSB3aWxsIGJlIHRoZSBtaW4gb2YgeFNpemUgYW5kIHtAbGluayBidWJibGVIZWF0bWFwI3hTaXplfVxuICAqIENhbGN1bGF0ZWQgYWZ0ZXIgYnViYmxlSGVhdG1hcCBjYWxsZWQuXG4gICogQHBhcmFtIHtzdHJpbmdbXX0gW3lTaXplPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgeVNpemUsXG4gIC8qKlxuICAqIHN0b3JlIHRoZSBzaXplIG9mIHRoZSBzcGFjZXIgaW4gdGhlIHkgZGltZW5zaW9uLlxuICAqIENhbGN1bGF0ZWQgYWZ0ZXIgYnViYmxlSGVhdG1hcCBjYWxsZWQuXG4gICogQHBhcmFtIHtzdHJpbmdbXX0gW3hTcGFjZXJTaXplPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgeVNwYWNlclNpemVcblxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBzZWxlY3Rpb24gaW4gd2hpY2ggaXRlbXMgYXJlIG1hbmlwdWxhdGVkXG4gICAqIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IGQzLnNlbGVjdGlvbn1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc2VsZWN0aW9uID0gc2VsZWN0aW9uXG4gICAqL1xuICBiaG0uc2VsZWN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzZWxlY3Rpb24gPSBfLCBiaG0pIDogc2VsZWN0aW9uOyB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGRhdGFcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNkYXRhfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgb2JqZWN0fVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICovXG4gIGJobS5kYXRhID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkYXRhID0gXywgYmhtKSA6IGRhdGE7IH1cbiAgLy8gYmhtLm9yaWVudCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob3JpZW50ID0gXywgYmhtKSA6IG9yaWVudDsgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBhbW91bnQgb2YgaG9yaXpvbnRhbCBzcGFjZSBpbiB3aGljaCBpdGVtcyBhcmUgbWFuaXB1bGF0ZWRcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNzcGFjZVh9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV0gc2hvdWxkIGJlIGEgbnVtYmVyID4gMFxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc3BhY2VYID0gdW5kZWZpbmVkXG4gICAqL1xuICBiaG0uc3BhY2VYID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzcGFjZVggPSBfLCBiaG0pIDogc3BhY2VYOyB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGFtb3VudCBvZiB2ZXJ0aWNhbCBzcGFjZSBpbiB3aGljaCBpdGVtcyBhcmUgbWFuaXB1bGF0ZWRcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNzcGFjZVl9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV0gc2hvdWxkIGJlIGEgbnVtYmVyID4gMFxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc3BhY2VZID0gdW5kZWZpbmVkXG4gICAqL1xuICBiaG0uc3BhY2VZID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzcGFjZVkgPSBfLCBiaG0pIDogc3BhY2VZOyB9XG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgeEtleVxuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3hLZXl9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHhLZXkgPSAneCdcbiAgICovXG4gIGJobS54S2V5ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4S2V5ID0gXywgYmhtKSA6IHhLZXk7IH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgeUtleVxuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3lLZXl9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHlLZXkgPSAneSdcbiAgICovXG4gIGJobS55S2V5ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5S2V5ID0gXywgYmhtKSA6IHlLZXk7IH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgcktleVxuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3JLZXl9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHJLZXkgPSAncidcbiAgICovXG4gIGJobS5yS2V5ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyS2V5ID0gXywgYmhtKSA6IHJLZXk7IH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgdktleVxuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3ZLZXl9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHZLZXkgPSAneSdcbiAgICovXG4gIGJobS52S2V5ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2S2V5ID0gXywgYmhtKSA6IHZLZXk7IH1cblxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBjZWxsS2V5c1xuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI2NlbGxLZXlzfSlcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBzdHJpbmdbXX1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgY2VsbEtleXMgPSB1bmRlZmluZWRcbiAgICovXG4gIGJobS5jZWxsS2V5cyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY2VsbEtleXMgPSBfLCBiaG0pIDogY2VsbEtleXM7IH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgeFZhbHVlc1xuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3hWYWx1ZXN9KVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IHN0cmluZ1tdfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB4VmFsdWVzID0gdW5kZWZpbmVkXG4gICAqL1xuICBiaG0ueFZhbHVlcyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeFZhbHVlcyA9IF8sIGJobSkgOiB4VmFsdWVzOyB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHlWYWx1ZXNcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCN5VmFsdWVzfSlcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBzdHJpbmdbXX1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgeVZhbHVlcyA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYmhtLnlWYWx1ZXMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHlWYWx1ZXMgPSBfLCBiaG0pIDogeVZhbHVlczsgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSByVmFsdWVzXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjclZhbHVlc30pXG4gICAqIEBwYXJhbSB7bnVtYmVyW119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgbnVtYmVyW119XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHJWYWx1ZXMgPSB1bmRlZmluZWRcbiAgICovXG4gIGJobS5yVmFsdWVzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyVmFsdWVzID0gXywgYmhtKSA6IHJWYWx1ZXM7IH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgdlZhbHVlc1xuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3ZWYWx1ZXN9KVxuICAgKiBAcGFyYW0ge251bWJlcltdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IG51bWJlcltdfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB2VmFsdWVzID0gdW5kZWZpbmVkXG4gICAqL1xuICBiaG0udlZhbHVlcyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodlZhbHVlcyA9IF8sIGJobSkgOiB2VmFsdWVzOyB9XG5cblxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSB4RXh0cmFjdG9yXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjeEV4dHJhY3Rvcn0pXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgZnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHhFeHRyYWN0b3IgPSB1bmRlZmluZWRcbiAgICovXG4gIGJobS54RXh0cmFjdG9yID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4RXh0cmFjdG9yID0gXywgYmhtKSA6IHhFeHRyYWN0b3I7IH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgeUV4dHJhY3RvclxuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3lFeHRyYWN0b3J9KVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IGZ1bmN0aW9ufVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB5RXh0cmFjdG9yID0gdW5kZWZpbmVkXG4gICAqL1xuICBiaG0ueUV4dHJhY3RvciA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeUV4dHJhY3RvciA9IF8sIGJobSkgOiB5RXh0cmFjdG9yOyB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHJFeHRyYWN0b3JcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNyRXh0cmFjdG9yfSlcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBmdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgckV4dHJhY3RvciA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYmhtLnJFeHRyYWN0b3IgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJFeHRyYWN0b3IgPSBfLCBiaG0pIDogckV4dHJhY3RvcjsgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSB2RXh0cmFjdG9yXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjdkV4dHJhY3Rvcn0pXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgZnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHZFeHRyYWN0b3IgPSB1bmRlZmluZWRcbiAgICovXG4gIGJobS52RXh0cmFjdG9yID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2RXh0cmFjdG9yID0gXywgYmhtKSA6IHZFeHRyYWN0b3I7IH1cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgd2hldGhlciBvciBub3QgYnViYmxlSGVhdG1hcCBpcyBhbGxvd2VkIHRvIGdvIGJleW9uZCBzcGVjaWZpZWQgZGltZW5zaW9uc1xuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3NwYWNlWH0pXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBib29sZWFufVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvdmVyZmxvd1EgPSBmYWxzZVxuICAgKi9cbiAgYmhtLm92ZXJmbG93USA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob3ZlcmZsb3dRID0gXywgYmhtKSA6IG92ZXJmbG93UTsgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNjYWxlIGZvciB3aGljaCB0aGUgcmFkaXVzIG9mIGJ1YmJsZXMgc2hvdWxkIGJlIHRyYW5zZm9ybWVkIGJ5XG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjc2NhbGV9KVxuICAgKiBAcGFyYW0ge2QzLnNjYWxlfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IGQzLnNjYWxlfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzY2FsZSA9IGQzLnNjYWxlTGluZWFyKClcbiAgICovXG4gIGJobS5zY2FsZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2NhbGUgPSBfLCBiaG0pIDogc2NhbGU7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgcGFkZGluZyBmb3IgdGhlIGRvbWFpbiBvZiB0aGUgc2NhbGVcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNkb21haW5QYWRkaW5nfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBkb21haW5QYWRkaW5nID0gMC41XG4gICAqL1xuICBiaG0uZG9tYWluUGFkZGluZyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluUGFkZGluZyA9IF8sIGJobSkgOiBkb21haW5QYWRkaW5nOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgb2JqZWN0U3BhY2VyXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjb2JqZWN0U3BhY2VyfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvYmplY3RTcGFjZXIgPSAwLjBcbiAgICovXG4gIGJobS5vYmplY3RTcGFjZXIgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9iamVjdFNwYWNlciA9IF8sIG9iamVjdFNwYWNlcikgOiBkYXRhOyB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbWluT2JqZWN0U2l6ZVxuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI21pbk9iamVjdFNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG1pbk9iamVjdFNpemUgPSA1MFxuICAgKi9cbiAgYmhtLm1pbk9iamVjdFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG1pbk9iamVjdFNpemUgPSBfLCBiaG0pIDogbWluT2JqZWN0U2l6ZTsgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG1heE9iamVjdFNpemVcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNtYXhPYmplY3RTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBtYXhPYmplY3RTaXplID0gMTAwXG4gICAqL1xuICBiaG0ubWF4T2JqZWN0U2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobWF4T2JqZWN0U2l6ZSA9IF8sIGJobSkgOiBtYXhPYmplY3RTaXplOyB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgYnViYmxlU3Ryb2tlV2lkdGhcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNidWJibGVTdHJva2VXaWR0aH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgYnViYmxlU3Ryb2tlV2lkdGggPSAyXG4gICAqL1xuICBiaG0uYnViYmxlU3Ryb2tlV2lkdGggPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGJ1YmJsZVN0cm9rZVdpZHRoID0gXywgYmhtKSA6IGJ1YmJsZVN0cm9rZVdpZHRoOyB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgYmFja2dyb3VuZEZpbGxcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNiYWNrZ3JvdW5kRmlsbH0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgYmFja2dyb3VuZEZpbGwgPSAndHJhbnNwYXJlbnQnXG4gICAqL1xuICBiaG0uYmFja2dyb3VuZEZpbGwgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGJhY2tncm91bmRGaWxsID0gXywgYmhtKSA6IGJhY2tncm91bmRGaWxsOyB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbmFtZXNwYWNlXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjbmFtZXNwYWNlfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBuYW1lc3BhY2UgPSAnZDNzbS1idWJibGVIZWF0bWFwJ1xuICAgKi9cbiAgYmhtLm5hbWVzcGFjZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobmFtZXNwYWNlID0gXywgYmhtKSA6IG5hbWVzcGFjZTsgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG9iamVjdENsYXNzXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjb2JqZWN0Q2xhc3N9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG9iamVjdENsYXNzID0gJ3RpY2stZ3JvdXAnXG4gICAqL1xuICBiaG0ub2JqZWN0Q2xhc3MgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9iamVjdENsYXNzID0gXywgYmhtKSA6IG9iamVjdENsYXNzOyB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdHJhbnNpdGlvbkR1cmF0aW9uXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjdHJhbnNpdGlvbkR1cmF0aW9ufSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0cmFuc2l0aW9uRHVyYXRpb24gPSAxMDAwXG4gICAqL1xuICBiaG0udHJhbnNpdGlvbkR1cmF0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0cmFuc2l0aW9uRHVyYXRpb24gPSBfLCBiaG0pIDogdHJhbnNpdGlvbkR1cmF0aW9uOyB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgZWFzZUZ1bmNcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNlYXNlRnVuY30pXG4gICAqIEBwYXJhbSB7ZDMuZWFzZX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBkMy5lYXNlfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBlYXNlRnVuYyA9IGQzLmVhc2VFeHBcbiAgICovXG4gIGJobS5lYXNlRnVuYyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZWFzZUZ1bmMgPSBfLCBiaG0pIDogZWFzZUZ1bmM7IH1cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRvb2x0aXBcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCN0b29sdGlwfSlcbiAgICogQHBhcmFtIHt0b29sdGlwfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IHRvb2x0aXB9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHRvb2x0aXAgPSB0b29sdGlwKClcbiAgICovXG4gIGJobS50b29sdGlwID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0b29sdGlwID0gXywgYmhtKSA6IHRvb2x0aXA7IH1cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHhTaXplXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjeFNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHhTaXplID0gdW5kZWZpbmVkXG4gICAqL1xuICBiaG0ueFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHhTaXplID0gXywgYmhtKSA6IHhTaXplOyB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgeFNwYWNlclNpemVcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCN4U3BhY2VyU2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgeFNwYWNlclNpemUgPSB1bmRlZmluZWRcbiAgICovXG4gIGJobS54U3BhY2VyU2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeFNwYWNlclNpemUgPSBfLCBiaG0pIDogeFNwYWNlclNpemU7IH1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB5U2l6ZVxuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3lTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB5U2l6ZSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYmhtLnlTaXplID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5U2l6ZSA9IF8sIGJobSkgOiB5U2l6ZTsgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHlTcGFjZXJTaXplXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjeVNwYWNlclNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHlTcGFjZXJTaXplID0gdW5kZWZpbmVkXG4gICAqL1xuICBiaG0ueVNwYWNlclNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHlTcGFjZXJTaXplID0gXywgYmhtKSA6IHlTcGFjZXJTaXplOyB9XG4gIC8vIGJobS55S2V5U29ydGluZ0Z1bmN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5S2V5U29ydGluZ0Z1bmN0aW9uID0gXywgYmhtKSA6IHlLZXlTb3J0aW5nRnVuY3Rpb247IH1cbiAgLy8gYmhtLnhLZXlTb3J0aW5nRnVuY3Rpb24gPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHhLZXlTb3J0aW5nRnVuY3Rpb24gPSBfLCBiaG0pIDogeEtleVNvcnRpbmdGdW5jdGlvbjsgfVxuXG5cblxuICBmdW5jdGlvbiBiaG0oKSB7XG4gICAgdmFyIGhvcml6b250YWxRID0gdHJ1ZTsgLy8gbm8gb3JpZW50YXRpb24gaW4gaGVhdG1hcHMuIEFpZHMgYXMgcGxhY2Vob2xkZXIgaW4gZnVuY3Rpb25zIHRoYXQgdGFrZSBvcmllbnQgYXMgYSBwYXJhbWV0ZXJcbiAgICB2YXIgYmdjcFJlY3QgPSB7eDowLCB5OjAsIHdpZHRoOiBzcGFjZVgsIGhlaWdodDpzcGFjZVl9XG4gICAgdmFyIGNvbnRhaW5lciA9IHNldHVwQ29udGFpbmVyKCBzZWxlY3Rpb24sIG5hbWVzcGFjZSwgYmdjcFJlY3QsIGJhY2tncm91bmRGaWxsICk7XG5cbiAgICBjZWxsS2V5cyA9IGQzLmtleXMoZGF0YSk7XG4gICAgY2VsbEtleXMuc29ydChmdW5jdGlvbihhLCBiKXsgcmV0dXJuIHhLZXlTb3J0aW5nRnVuY3Rpb24oYSwgYikgfHwgeUtleVNvcnRpbmdGdW5jdGlvbihhLCBiKSB9KVxuICAgIGxvZygnYnViYmxlSGVhdG1hcCcsICdjZWxscyBhcmUgc29ydGVkIGJ5JywgY2VsbEtleXMpXG5cblxuXG4gICAgeFZhbHVlcyA9IHVuaXF1ZShjZWxsS2V5cy5tYXAoeEV4dHJhY3RvcikpO1xuICAgIHlWYWx1ZXMgPSB1bmlxdWUoY2VsbEtleXMubWFwKHlFeHRyYWN0b3IpKTtcbiAgICByVmFsdWVzID0gdW5pcXVlKGNlbGxLZXlzLm1hcChyRXh0cmFjdG9yKSk7XG4gICAgdlZhbHVlcyA9IHVuaXF1ZShjZWxsS2V5cy5tYXAodkV4dHJhY3RvcikpO1xuICAgIGxvZygnYnViYmxlSGVhdG1hcCcsICd4IGFuZCB5IGtleXMgYXJlJywge3g6IHhWYWx1ZXMsIHk6eVZhbHVlc30pXG5cblxuICAgIHZhciB4RGltID0geFZhbHVlcy5sZW5ndGgsIHlEaW0gPSB5VmFsdWVzLmxlbmd0aDtcblxuXG4gICAgdmFyIGV4dGVudCA9IFtNYXRoLm1pbiguLi5yVmFsdWVzKSAtIGRvbWFpblBhZGRpbmcsTWF0aC5tYXgoLi4uclZhbHVlcykgKyBkb21haW5QYWRkaW5nXTtcblxuXG4gICAgeVNpemUgPSBjYWxjdWxhdGVXaWR0aE9mT2JqZWN0KHNwYWNlWSwgeURpbSwgbWluT2JqZWN0U2l6ZSwgbWF4T2JqZWN0U2l6ZSwgb2JqZWN0U3BhY2VyLCBvdmVyZmxvd1EpXG4gICAgeFNpemUgPSBjYWxjdWxhdGVXaWR0aE9mT2JqZWN0KHNwYWNlWCwgeERpbSwgbWluT2JqZWN0U2l6ZSwgbWF4T2JqZWN0U2l6ZSwgb2JqZWN0U3BhY2VyLCBvdmVyZmxvd1EpXG4gICAgeVNwYWNlclNpemUgPSBjYWxjdWxhdGVXaWR0aE9mU3BhY2VyKHlWYWx1ZXMsIHNwYWNlWSwgeVNpemUsIHlEaW0sIG9iamVjdFNwYWNlciwgb3ZlcmZsb3dRKVxuICAgIHhTcGFjZXJTaXplID0gY2FsY3VsYXRlV2lkdGhPZlNwYWNlcih4VmFsdWVzLCBzcGFjZVgsIHhTaXplLCB4RGltLCBvYmplY3RTcGFjZXIsIG92ZXJmbG93USlcbiAgICBsb2coJ2J1YmJsZUhlYXRtYXAnLCAnc2l6ZSBvZicsIHt4OiB4U2l6ZSwgeTogeVNpemV9KVxuXG5cbiAgICBzY2FsZS5kb21haW4oZXh0ZW50KS5yYW5nZShbMCwgTWF0aC5taW4oeVNpemUsIHhTaXplKS8yXSlcblxuICAgIHZhciB5U3BhY2VyID0gZ3JvdXBpbmdTcGFjZXIoKVxuICAgIC5ob3Jpem9udGFsUShmYWxzZSlcbiAgICAubW92ZWJ5KCdjYXRlZ29yeScpLm51bWJlck9mT2JqZWN0cyh5RGltKVxuICAgIC5vYmplY3RDbGFzcyhoeXBlbmF0ZShvYmplY3RDbGFzcywgJ3JvdycpKVxuICAgIC5vYmplY3RTaXplKHlTaXplKS5zcGFjZXJTaXplKHlTcGFjZXJTaXplKVxuICAgIC50cmFuc2l0aW9uRHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlRnVuYyhlYXNlRnVuYylcbiAgICAubmFtZXNwYWNlKCdyb3cnKVxuXG4gICAgdmFyIHhTcGFjZXIgPSBncm91cGluZ1NwYWNlcigpXG4gICAgLmhvcml6b250YWxRKHRydWUpXG4gICAgLm1vdmVieSgnY2F0ZWdvcnknKS5udW1iZXJPZk9iamVjdHMoeERpbSlcbiAgICAub2JqZWN0Q2xhc3Mob2JqZWN0Q2xhc3MpXG4gICAgLm9iamVjdFNpemUoeFNpemUpLnNwYWNlclNpemUoeFNwYWNlclNpemUpXG4gICAgLnRyYW5zaXRpb25EdXJhdGlvbih0cmFuc2l0aW9uRHVyYXRpb24pLmVhc2VGdW5jKGVhc2VGdW5jKVxuXG5cbiAgICB5U3BhY2VyKGNvbnRhaW5lciwgeVZhbHVlcywgMClcbiAgICBjb250YWluZXIuc2VsZWN0QWxsKCdnLicraHlwZW5hdGUob2JqZWN0Q2xhc3MsICdyb3cnKSlcbiAgICAuZWFjaChmdW5jdGlvbihkLCBpKXtcbiAgICAgIHhTcGFjZXIoZDMuc2VsZWN0KHRoaXMpLCB4VmFsdWVzLCAwKVxuICAgIH0pXG4gICAgdmFyIGNlbGxzID0gY29udGFpbmVyLnNlbGVjdEFsbCgnZzpub3QoLnRvLXJlbW92ZSkuJytvYmplY3RDbGFzcykuZGF0YShjZWxsS2V5cyk7XG5cbiAgICB2YXIgcGFyZW50SW5kZXhBcnJheSA9IFtdXG4gICAgY2VsbHMuZWFjaChmdW5jdGlvbihkLCBpKXsgcGFyZW50SW5kZXhBcnJheS5wdXNoKE51bWJlcihkMy5zZWxlY3QodGhpcykuYXR0cigncGFyZW50LWluZGV4JykpKSB9KVxuXG5cbiAgICBjb2xvckZ1bmN0aW9uID0gY29sb3JGdW5jdGlvbi5jb2xvckJ5KCkgPT0gJ2luZGV4J1xuICAgID8gY29sb3JGdW5jdGlvbi5kYXRhRXh0ZW50KFswLCBNYXRoLm1heCguLi5wYXJlbnRJbmRleEFycmF5KV0pXG4gICAgOiBjb2xvckZ1bmN0aW9uLmRhdGFFeHRlbnQoZXh0ZW50KVxuXG4gICAgY2VsbHMuZWFjaChmdW5jdGlvbihrZXksIGkpIHtcbiAgICAgIGxvZygnYnViYmxlSGVhdG1hcCcsICdlYWNoIGNlbGwnLCB7a2V5OiBrZXksIGluZGV4OiBpLCBub2RlOiBkMy5zZWxlY3QodGhpcykubm9kZSgpfSlcblxuICAgICAgdmFyIHQgPSBkMy5zZWxlY3QodGhpcyksXG4gICAgICBjdXJyZW50RGF0YSA9IGRhdGFba2V5XSxcbiAgICAgIHZhbHVlID0gdkV4dHJhY3RvcihrZXksIGkpLFxuICAgICAgcmFkaXVzPSByRXh0cmFjdG9yKGtleSwgaSksXG4gICAgICBpID0gdC5hdHRyKCdwYXJlbnQtaW5kZXgnKSA9PSB1bmRlZmluZWQgPyBpIDogdC5hdHRyKCdwYXJlbnQtaW5kZXgnKSxcbiAgICAgIGZpbGxDb2xvciA9IGNvbG9yRnVuY3Rpb24oa2V5LCB2YWx1ZSwgaSwgJ2ZpbGwnKSwgLy8gcHJldmVudCBkdXBsaWNhdGUgY29tcHV0YXRpb25cbiAgICAgIHN0cm9rZUNvbG9yID0gY29sb3JGdW5jdGlvbihrZXksIHZhbHVlLCBpLCAgJ3N0cm9rZScpXG5cbiAgICAgIHZhciBjID0gc2FmZVNlbGVjdCh0LCAnY2lyY2xlJywgaHlwZW5hdGUob2JqZWN0Q2xhc3MsJ2NpcmNsZScpKVxuICAgICAgYy5hdHRyKCdjeCcsIHhTaXplIC8gMilcbiAgICAgIC5hdHRyKCdjeScsIHlTaXplIC8gMiApXG4gICAgICAuYXR0cigncicsIHNjYWxlKHJhZGl1cykpXG4gICAgICAuYXR0cignZmlsbCcsIGZpbGxDb2xvcilcbiAgICAgIC5hdHRyKCdzdHJva2UnLCBzdHJva2VDb2xvcilcbiAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCBidWJibGVTdHJva2VXaWR0aClcblxuICAgIH0pXG5cbiAgICB0b29sdGlwLnNlbGVjdGlvbihjZWxscy5zZWxlY3RBbGwoJ2NpcmNsZS4nK2h5cGVuYXRlKG9iamVjdENsYXNzLCAnY2lyY2xlJykpKVxuICAgIC5kYXRhKGRhdGEpXG4gICAgLy8gLmtleXMoWydyJywgJ3YnXSlcbiAgICAvLyAuaGVhZGVyKGZ1bmN0aW9uKGQsIGkpe3JldHVybiBoeXBlbmF0ZShkYXRhW2RdW3hLZXldLCBkYXRhW2RdW3lLZXldKSB9KVxuXG4gICAgdG9vbHRpcCgpXG5cblxuICB9XG5cbiAgcmV0dXJuIGJobTtcbn1cblxuZXhwb3J0IHtidWJibGVIZWF0bWFwfVxuIiwiaW1wb3J0IHtoeXBlbmF0ZSwgc2FmZVNlbGVjdH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7c2V0dXBDb250YWluZXIsIGNhbGN1bGF0ZVdpZHRoT2ZPYmplY3QsIGNhbGN1bGF0ZVdpZHRoT2ZTcGFjZXIsIHdoaXNrZXJQYXRofSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7dW5pcXVlLCBoYXNRLCBmbGF0dGVufSBmcm9tICcuL2FycmF5LWZ1bmN0aW9ucyc7XG5pbXBvcnQge2dyb3VwaW5nU3BhY2VyfSBmcm9tICcuL2dyb3VwaW5nLXNwYWNlcic7XG5pbXBvcnQge2NvbG9yRnVuY3Rpb24gYXMgQ0Z9IGZyb20gJy4vY29sb3ItZnVuY3Rpb24nO1xuaW1wb3J0IHt0b29sdGlwIGFzIFRUaXB9IGZyb20gJy4vdG9vbHRpcCc7XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9YIEFORCBXSElTS0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqXG4gKiBDcmVhdGVzIGEgYm94d2hpc2tlclxuICpcbiAqIHtAbGluayBodHRwczovL3N1bW5ldXJvbi5naXRsYWIuaW8vZDNzbS9kZW1vcy9ib3gtd2hpc2tlcnMvaW5kZXguaHRtbCBEZW1vfVxuICogQGNvbnN0cnVjdG9yIGJveHdoaXNrZXJcbiAqIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBzZWxlY3Rpb25cbiAqIEBuYW1lc3BhY2UgYm94d2hpc2tlclxuICogQHJldHVybnMge2Z1bmN0aW9ufSBib3h3aGlza2VyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBib3h3aGlza2VyKCBzZWxlY3Rpb24gKSB7XG4gIHZhclxuICAvKipcbiAgKiBEYXRhIHRvIHBsb3QuIEFzc3VtZWQgdG8gYmUgYSBvYmplY3QsIHdoZXJlIGVhY2gga2V5IGNvcnJlc3BvbmRzIHRvIGEgYm94XG4gICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNkYXRhfSlcbiAgKiBAcGFyYW0ge09iamVjdH0gW2RhdGE9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBkYXRhLFxuICAvKipcbiAgKiBXaGljaCBkaXJlY3Rpb24gdG8gcmVuZGVyIHRoZSBib3hlcyBpblxuICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjb3JpZW50fSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW29yaWVudD0naG9yaXpvbnRhbCddXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG9yaWVudCA9ICdob3Jpem9udGFsJyxcbiAgLyoqXG4gICogQW1vdW50IG9mIGhvcml6b250YWwgc3BhY2UgKGluIHBpeGVscykgYXZhaWJsZSB0byByZW5kZXIgdGhlIGJveHdoaXNrZXIgaW5cbiAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI3NwYWNlWH0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZVg9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzcGFjZVgsXG4gIC8qKlxuICAqIEFtb3VudCBvZiB2ZXJ0aWNhbCBzcGFjZSAoaW4gcGl4ZWxzKSBhdmFpYmxlIHRvIHJlbmRlciB0aGUgYm94d2hpc2tlciBpblxuICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIuc3BhY2VZfSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW3NwYWNlWT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNwYWNlWSxcbiAgLyoqXG4gICogV2hldGhlciBvciBub3QgdG8gYWxsb3cgYm94d2hpc2tlciB0byByZW5kZXIgZWxlbWVudHMgcGFzcyB0aGUgbWFpbiBzcGF0aWFsIGRpbWVuc2lvblxuICAqIGdpdmVuIHRoZSBvcmllbnRhdGlvbiAoc2VlIHtAbGluayBib3h3aGlza2VyI29yaWVudH0pLCB3aGVyZSB7QGxpbmsgYm94d2hpc2tlciNvcmllbnR9PVwiaG9yaXpvbnRhbFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBib3h3aGlza2VyI3NwYWNlWH0gYW5kIHdoZXJlIHtAbGluayBib3h3aGlza2VyI29yaWVudH09XCJ2ZXJ0aWNhbFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBib3h3aGlza2VyI3NwYWNlWX1cbiAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvdmVyZmxvd1E9ZmFsc2VdXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG92ZXJmbG93USA9IHRydWUsXG5cbiAgLyoqXG4gICogQW4gYXJyYXkgLSBwdXRhdGl2ZWx5IG9mIG90aGVyIGFycmF5cyAtIGRlcGljdGluZyBob3cgYm94ZXMgc2hvdWxkIGJlIGFycmFuZ2VkXG4gICogQHBhcmFtIHtBcnJheVtdfSBbZ3JvdXBpbmc9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBncm91cGluZyxcbiAgcXVhcnRpbGVzS2V5ID0gJ3F1YXJ0aWxlcycsIC8vIGtleSBpbiBvYmplY3Qgd2hlcmUgcXVhcnRpbGVzIGFyZSBzdG9yZWRcbiAgcXVhcnRpbGVzS2V5cyA9IFtcIjAuMDBcIiwgXCIwLjI1XCIsIFwiMC41MFwiLCBcIjAuNzVcIiwgXCIxLjAwXCJdLCAvLyBrZXlzIGluIHF1YXJ0aWxlcyBvYmplY3QgbWFwcGluZyB2YWx1ZXMgdG8gbWluLCBxMSwgcTIsIHEzIGFuZCBtYXhcblxuXG4gIC8qKlxuICAqIEhvdyB0byBnZXQgdGhlIHZhbHVlIG9mIHRoZSBib3h3aGlza2VyXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW3ZhbHVlRXh0cmFjdG9yPWZ1bmN0aW9uKGtleSwgaW5kZXgpIHsgcmV0dXJuIGRhdGFba2V5XVtxdWFydGlsZXNLZXldIH1dXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHZhbHVlRXh0cmFjdG9yID0gZnVuY3Rpb24oa2V5LCBpbmRleCkgeyByZXR1cm4gZGF0YVtrZXldW3F1YXJ0aWxlc0tleV0gfSxcbiAgLyoqXG4gICogSG93IHRvIHNvcnQgdGhlIGJveGVzIC0gaWYge0BsaW5rIGJveHdoaXNrZXIjZ3JvdXBpbmd9IGlzIG5vdCBwcm92aWRlZC5cbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbc29ydGluZ0Z1bmN0aW9uPWRlc2NlbmRpbmddXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICogZGVmYXVsdFxuICAqIGZ1bmN0aW9uKGtleUEsIGtleUIpIHtyZXR1cm4gZDMuZGVzY2VuZGluZyhcbiAgKiAgIHZhbHVlRXh0cmFjdG9yKGtleUEpW3F1YXJ0aWxlc0tleXNbNF1dLFxuICAqICAgdmFsdWVFeHRyYWN0b3Ioa2V5QilbcXVhcnRpbGVzS2V5c1s0XV1cbiAgKiApfVxuICAqL1xuICBzb3J0aW5nRnVuY3Rpb24gPSBmdW5jdGlvbihrZXlBLCBrZXlCKSB7cmV0dXJuIGQzLmRlc2NlbmRpbmcoXG4gICAgdmFsdWVFeHRyYWN0b3Ioa2V5QSlbcXVhcnRpbGVzS2V5c1s0XV0sXG4gICAgdmFsdWVFeHRyYWN0b3Ioa2V5QilbcXVhcnRpbGVzS2V5c1s0XV1cbiAgKX0sXG4gIC8qKlxuICAqIFRoZSBzY2FsZSBmb3Igd2hpY2ggYm94d2hpc2tlciB2YWx1ZXMgc2hvdWxkIGJlIHRyYW5zZm9ybWVkIGJ5XG4gICogQHBhcmFtIHtkMy5zY2FsZX0gW3NjYWxlPWQzLnNjYWxlTGluZWFyXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzY2FsZSA9IGQzLnNjYWxlTGluZWFyKCksXG4gIC8qKlxuICAqIFRoZSBwYWRkaW5nIGZvciB0aGUgZG9tYWluIG9mIHRoZSBzY2FsZSAoc2VlIHtAbGluayBib3h3aGlza2VyI3NjYWxlfSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW2RvbWFpblBhZGRpbmc9MC41XVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBkb21haW5QYWRkaW5nID0gMC41LFxuICAvKipcbiAgKiBEZWZhdWx0IHNwYWNlIGZvciB0aGUgc3BhY2VyIChwZXJjZW50YWdlKSBvZiBtYWluIGRpbWVuc2lvbiBnaXZlbiB0aGUgb3JpZW50YXRpb25cbiAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI29yaWVudH0pLCB3aGVyZSB7QGxpbmsgYm94d2hpc2tlciNvcmllbnR9PVwiaG9yaXpvbnRhbFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBib3h3aGlza2VyI3NwYWNlWH0gYW5kIHdoZXJlIHtAbGluayBib3h3aGlza2VyI29yaWVudH09XCJ2ZXJ0aWNhbFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBib3h3aGlza2VyI3NwYWNlWX0gYmV0d2VlbiBib3hlc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbb2JqZWN0U3BhY2VyPTAuMDVdXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG9iamVjdFNwYWNlciA9IDAuMDUsXG4gIC8qKlxuICAqIFRoZSBtaW5pbXVtIHNpemUgdGhhdCBhbiBvYmplY3QgY2FuIGJlXG4gICogQHBhcmFtIHtudW1iZXJ9IFttaW5PYmplY3RTaXplPTE1XVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBtaW5PYmplY3RTaXplID0gMTUsXG4gIC8qKlxuICAqIFRoZSBtYXhpbXVtIHNpemUgdGhhdCBhbiBvYmplY3QgY2FuIGJlXG4gICogQHBhcmFtIHtudW1iZXJ9IFttYXhPYmplY3RTaXplPTUwXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBtYXhPYmplY3RTaXplID0gNTAsXG4gIC8qKlxuICAqIFBlcmNlbnQgb2YgYm94IGFuZCB3aGlza2VyIHNpemUgdGhhdCB3aGlza2VycyB3aWxsIGJlIHJlbmRlcmVkXG4gICogc2VlIHtAbGluayBib3h3aGlza2VyI29iamVjdFNpemV9XG4gICogQHBhcmFtIHtudW1iZXJ9IFt3aGlza2VyV2lkdGhQZXJjZW50PTAuNl1cbiAgKiBAbWVtYmVyb2YgYm94d2hpc2tlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgd2hpc2tlcldpZHRoUGVyY2VudCA9IC42LFxuICAvKipcbiAgKiBJbnN0YW5jZSBvZiBDb2xvckZ1bmN0aW9uXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW2NvbG9yRnVuY3Rpb24gPSBjb2xvckZ1bmN0aW9uKCldXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGNvbG9yRnVuY3Rpb24gPSBDRigpLFxuICAvKipcbiAgKiBUaGUgc3Ryb2tlIHdpZHRoIG9mIHRoZSBib3hlc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbYm94U3Ryb2tlV2lkdGg9Ml1cbiAgKiBAbWVtYmVyb2YgYm94d2hpc2tlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgYm94U3Ryb2tlV2lkdGggPSAyLFxuICAvKipcbiAgKiBUaGUgc3Ryb2tlIHdpZHRoIG9mIHRoZSB3aGlza2Vyc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbd2hpc2tlclN0cm9rZVdpZHRoPTJdXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHdoaXNrZXJTdHJva2VXaWR0aCA9IDIsXG5cbiAgLyoqXG4gICogQ29sb3Igb2YgdGhlIGJhY2tncm91bmRcbiAgKiBAcGFyYW0ge3N0cmluZ30gW2JhY2tncm91bmRGaWxsPVwidHJhbnNwYXJlbnRcIl1cbiAgKiBAbWVtYmVyb2YgYm94d2hpc2tlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgYmFja2dyb3VuZEZpbGwgPSAndHJhbnNwYXJlbnQnLFxuICAvKipcbiAgKiBOYW1lc3BhY2UgZm9yIGFsbCBpdGVtcyBtYWRlIGJ5IHRoaXMgaW5zdGFuY2Ugb2YgYm94d2hpc2tlclxuICAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZXNwYWNlPVwiZDNzbS1ib3gtd2hpc2tlclwiXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBuYW1lc3BhY2UgPSAnZDNzbS1ib3gtd2hpc2tlcicsXG4gIC8qKlxuICAqIENsYXNzIG5hbWUgZm9yIGJveHdoaXNrZXIgY29udGFpbmVyICg8Zz4gZWxlbWVudClcbiAgKiBAcGFyYW0ge3N0cmluZ30gW29iamVjdENsYXNzPVwiYm94LXdoaXNrXCJdXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG9iamVjdENsYXNzID0gJ2JveC13aGlzaycsXG5cbiAgLyoqXG4gICogRHVyYXRpb24gb2YgYWxsIHRyYW5zaXRpb25zIG9mIHRoaXMgZWxlbWVudFxuICAqIEBwYXJhbSB7bnVtYmVyfSBbdHJhbnNpdGlvbkR1cmF0aW9uPTEwMDBdXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHRyYW5zaXRpb25EdXJhdGlvbiA9IDEwMDAsXG4gIC8qKlxuICAqIEVhc2luZyBmdW5jdGlvbiBmb3IgdHJhbnNpdGlvbnNcbiAgKiBAcGFyYW0ge2QzLmVhc2V9IFtlYXNlRnVuYz1kMy5lYXNlRXhwXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBlYXNlRnVuYyA9IGQzLmVhc2VFeHAsXG5cbiAgLyoqXG4gICogVGhlIGtleXMgb2YgdGhlIGJveGVzXG4gICogQHBhcmFtIHtzdHJpbmdbXX0gW2JveEtleXM9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBib3hLZXlzLFxuICAvKipcbiAgKiBUaGUgdmFsdWVzIG9mIHRoZSBib3hlc1xuICAqIEBwYXJhbSB7c3RyaW5nW119IFtib3hWYWx1ZXM9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBib3hWYWx1ZXMsXG4gIC8qKlxuICAqIFRoZSBvYmplY3RTaXplIChhY3R1YWwgd2lkdGgpIHVzZWQgYnkgdGhlIGJveGVzXG4gICogQHBhcmFtIHtudW1iZXJ9IFtvYmplY3RTaXplPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYm94d2hpc2tlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb2JqZWN0U2l6ZSxcbiAgLyoqXG4gICogVGhlIHNwYWNlclNpemUgKGFjdHVhbCB3aWR0aCkgdXNlZCBieSB0aGUgc3BhY2VycyBiZXR3ZWVuIHRoZSBib3hlc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbc3BhY2VyU2l6ZT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNwYWNlclNpemUsXG4gIC8qKlxuICAqIEluc3RhbmNlIG9mIFRvb2x0aXBcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbdG9vbHRpcD10b29sdGlwKCldXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHRvb2x0aXAgPSBUVGlwKClcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgc2VsZWN0aW9uIGluIHdoaWNoIGl0ZW1zIGFyZSBtYW5pcHVsYXRlZFxuICAgKiBAcGFyYW0ge2QzLnNlbGVjdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBkMy5zZWxlY3Rpb259XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNlbGVjdGlvbiA9IHNlbGVjdGlvblxuICAgKi9cbiAgYm94d2hpc2tlci5zZWxlY3Rpb24gPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNlbGVjdGlvbiA9IF8sIGJveHdoaXNrZXIpIDogc2VsZWN0aW9uOyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBkYXRhXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjZGF0YX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IG9iamVjdH1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqL1xuICBib3h3aGlza2VyLmRhdGEgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRhdGEgPSBfLCBib3h3aGlza2VyKSA6IGRhdGE7IH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIG9yaWVudCBvZiB0aGUgYm94ZXNcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNvcmllbnR9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBvYmplY3R9XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKi9cbiAgYm94d2hpc2tlci5vcmllbnQgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9yaWVudCA9IF8sIGJveHdoaXNrZXIpIDogb3JpZW50OyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBhbW91bnQgb2YgaG9yaXpvbnRhbCBzcGFjZSBpbiB3aGljaCBpdGVtcyBhcmUgbWFuaXB1bGF0ZWRcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNzcGFjZVh9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV0gc2hvdWxkIGJlIGEgbnVtYmVyID4gMFxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc3BhY2VYID0gdW5kZWZpbmVkXG4gICAqL1xuICBib3h3aGlza2VyLnNwYWNlWCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3BhY2VYID0gXywgYm94d2hpc2tlcikgOiBzcGFjZVg7IH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGFtb3VudCBvZiB2ZXJ0aWNhbCBzcGFjZSBpbiB3aGljaCBpdGVtcyBhcmUgbWFuaXB1bGF0ZWRcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNzcGFjZVl9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV0gc2hvdWxkIGJlIGEgbnVtYmVyID4gMFxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc3BhY2VZID0gdW5kZWZpbmVkXG4gICAqL1xuICBib3h3aGlza2VyLnNwYWNlWSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3BhY2VZID0gXywgYm94d2hpc2tlcikgOiBzcGFjZVk7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB3aGV0aGVyIG9yIG5vdCBib3h3aGlza2VyIGlzIGFsbG93ZWQgdG8gZ28gYmV5b25kIHNwZWNpZmllZCBkaW1lbnNpb25zXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjb3ZlcmZsb3dRfSlcbiAgICogQHBhcmFtIHtib29sZWFufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IGJvb2xlYW59XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG92ZXJmbG93USA9IGZhbHNlXG4gICAqL1xuICBib3h3aGlza2VyLm92ZXJmbG93USA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob3ZlcmZsb3dRID0gXywgYm94d2hpc2tlcikgOiBvdmVyZmxvd1E7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgZ3JvdXBpbmcgb2YgdGhlIGJveGVzXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjZ3JvdXBpbmd9KVxuICAgKiBAcGFyYW0ge0FycmF5W119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgQXJyYXlbXX1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgZ3JvdXBpbmcgPSB1bmRlZmluZWRcbiAgICovXG4gIGJveHdoaXNrZXIuZ3JvdXBpbmcgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGdyb3VwaW5nID0gXywgYm94d2hpc2tlcikgOiBncm91cGluZzsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBxdWFydGlsZXNLZXlcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNxdWFydGlsZXNLZXl9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHF1YXJ0aWxlc0tleSA9IHF1YXJ0aWxlc1xuICAgKi9cbiAgYm94d2hpc2tlci5xdWFydGlsZXNLZXkgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHF1YXJ0aWxlc0tleSA9IF8sIGJveHdoaXNrZXIpIDogcXVhcnRpbGVzS2V5OyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHF1YXJ0aWxlc0tleXNcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNxdWFydGlsZXNLZXlzfSlcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBzdHJpbmdbXX1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgcXVhcnRpbGVzS2V5cyA9IFtRMCwgUTEsIFEyLCBRMywgUTRdXG4gICAqL1xuICBib3h3aGlza2VyLnF1YXJ0aWxlc0tleXMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHF1YXJ0aWxlc0tleXMgPSBfLCBib3h3aGlza2VyKSA6IHF1YXJ0aWxlc0tleXM7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdmFsdWVFeHRyYWN0b3JcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciN2YWx1ZUV4dHJhY3Rvcn0pXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgZnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHZhbHVlRXh0cmFjdG9yID0gZnVuY3Rpb24oa2V5LCBpbmRleCkgeyByZXR1cm4gZGF0YVtrZXldW3F1YXJ0aWxlc0tleV0gfSxcbiAgICovXG5cbiAgYm94d2hpc2tlci52YWx1ZUV4dHJhY3RvciA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmFsdWVFeHRyYWN0b3IgPSBfLCBib3h3aGlza2VyKSA6IHZhbHVlRXh0cmFjdG9yOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNvcnRpbmdGdW5jdGlvblxuICAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI3NvcnRpbmdGdW5jdGlvbn0pXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgZnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNvcnRpbmdGdW5jdGlvbiA9IGZ1bmN0aW9uKGtleUEsIGtleUIpIHtyZXR1cm4gZDMuZGVzY2VuZGluZyhcbiAgICogICB2YWx1ZUV4dHJhY3RvcihrZXlBKVtxdWFydGlsZXNLZXlzWzRdXSxcbiAgICogICB2YWx1ZUV4dHJhY3RvcihrZXlCKVtxdWFydGlsZXNLZXlzWzRdXVxuICAgKiApfSxcbiAgICovXG4gIGJveHdoaXNrZXIuc29ydGluZ0Z1bmN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzb3J0aW5nRnVuY3Rpb24gPSBfLCBib3h3aGlza2VyKSA6IHNvcnRpbmdGdW5jdGlvbjsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBzY2FsZSBmb3Igd2hpY2ggdGhlIGJveHdoaXNrZXIgdmFsdWVzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBieVxuICAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI3NjYWxlfSlcbiAgICogQHBhcmFtIHtkMy5zY2FsZX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBkMy5zY2FsZX1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc2NhbGUgPSBkMy5zY2FsZUxpbmVhcigpXG4gICAqL1xuICBib3h3aGlza2VyLnNjYWxlID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzY2FsZSA9IF8sIGJveHdoaXNrZXIpIDogc2NhbGU7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgcGFkZGluZyBmb3IgdGhlIGRvbWFpbiBvZiB0aGUgc2NhbGVcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNkb21haW5QYWRkaW5nfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBkb21haW5QYWRkaW5nID0gMC41XG4gICAqL1xuICBib3h3aGlza2VyLmRvbWFpblBhZGRpbmcgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpblBhZGRpbmcgPSBfLCBib3h3aGlza2VyKSA6IGRvbWFpblBhZGRpbmc7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyBvYmplY3RTcGFjZXJcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNvYmplY3RTcGFjZXJ9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG9iamVjdFNwYWNlciA9IDAuMDVcbiAgICovXG4gIGJveHdoaXNrZXIub2JqZWN0U3BhY2VyID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvYmplY3RTcGFjZXIgPSBfLCBib3h3aGlza2VyKSA6IG9iamVjdFNwYWNlcjsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBtaW5PYmplY3RTaXplXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjbWluT2JqZWN0U2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgbWluT2JqZWN0U2l6ZSA9IDE1XG4gICAqL1xuICBib3h3aGlza2VyLm1pbk9iamVjdFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG1pbk9iamVjdFNpemUgPSBfLCBib3h3aGlza2VyKSA6IG1pbk9iamVjdFNpemU7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbWF4T2JqZWN0U2l6ZVxuICAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI21heE9iamVjdFNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG1heE9iamVjdFNpemUgPSA1MFxuICAgKi9cbiAgYm94d2hpc2tlci5tYXhPYmplY3RTaXplID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChtYXhPYmplY3RTaXplID0gXywgYm94d2hpc2tlcikgOiBtYXhPYmplY3RTaXplOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHdoaXNrZXJXaWR0aFBlcmNlbnRcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciN3aGlza2VyV2lkdGhQZXJjZW50fSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBtYXhPYmplY3RTaXplID0gMC42XG4gICAqL1xuICBib3h3aGlza2VyLndoaXNrZXJXaWR0aFBlcmNlbnQgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHdoaXNrZXJXaWR0aFBlcmNlbnQgPSBfLCBib3h3aGlza2VyKSA6IHdoaXNrZXJXaWR0aFBlcmNlbnQ7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgY29sb3JGdW5jdGlvblxuICAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI2NvbG9yRnVuY3Rpb259KVxuICAgKiBAcGFyYW0ge2NvbG9yRnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgY29sb3JGdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgY29sb3JGdW5jdGlvbiA9IGNvbG9yRnVuY3Rpb24oKVxuICAgKi9cbiAgYm94d2hpc2tlci5jb2xvckZ1bmN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjb2xvckZ1bmN0aW9uID0gXywgYm94d2hpc2tlcikgOiBjb2xvckZ1bmN0aW9uOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGJveFN0cm9rZVdpZHRoXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjYm94U3Ryb2tlV2lkdGh9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGJveFN0cm9rZVdpZHRoID0gMlxuICAgKi9cbiAgYm94d2hpc2tlci5ib3hTdHJva2VXaWR0aCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYm94U3Ryb2tlV2lkdGggPSBfLCBib3h3aGlza2VyKSA6IGJveFN0cm9rZVdpZHRoOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHdoaXNrZXJTdHJva2VXaWR0aFxuICAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI3doaXNrZXJTdHJva2VXaWR0aH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgd2hpc2tlclN0cm9rZVdpZHRoID0gMlxuICAgKi9cbiAgYm94d2hpc2tlci53aGlza2VyU3Ryb2tlV2lkdGggPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHdoaXNrZXJTdHJva2VXaWR0aCA9IF8sIGJveHdoaXNrZXIpIDogd2hpc2tlclN0cm9rZVdpZHRoOyB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgYmFja2dyb3VuZEZpbGxcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNiYWNrZ3JvdW5kRmlsbH0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgYmFja2dyb3VuZEZpbGwgPSAndHJhbnNwYXJlbnQnXG4gICAqL1xuICBib3h3aGlza2VyLmJhY2tncm91bmRGaWxsID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChiYWNrZ3JvdW5kRmlsbCA9IF8sIGJveHdoaXNrZXIpIDogYmFja2dyb3VuZEZpbGw7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbmFtZXNwYWNlXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjbmFtZXNwYWNlfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBuYW1lc3BhY2UgPSAnZDNzbS1ib3h3aGlza2VyJ1xuICAgKi9cbiAgYm94d2hpc2tlci5uYW1lc3BhY2UgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG5hbWVzcGFjZSA9IF8sIGJveHdoaXNrZXIpIDogbmFtZXNwYWNlOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG9iamVjdENsYXNzXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjb2JqZWN0Q2xhc3N9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG9iamVjdENsYXNzID0gJ3RpY2stZ3JvdXAnXG4gICAqL1xuICBib3h3aGlza2VyLm9iamVjdENsYXNzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvYmplY3RDbGFzcyA9IF8sIGJveHdoaXNrZXIpIDogb2JqZWN0Q2xhc3M7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdHJhbnNpdGlvbkR1cmF0aW9uXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjdHJhbnNpdGlvbkR1cmF0aW9ufSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0cmFuc2l0aW9uRHVyYXRpb24gPSAxMDAwXG4gICAqL1xuICBib3h3aGlza2VyLnRyYW5zaXRpb25EdXJhdGlvbiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodHJhbnNpdGlvbkR1cmF0aW9uID0gXywgYm94d2hpc2tlcikgOiB0cmFuc2l0aW9uRHVyYXRpb247IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgZWFzZUZ1bmNcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNlYXNlRnVuY30pXG4gICAqIEBwYXJhbSB7ZDMuZWFzZX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBkMy5lYXNlfVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBlYXNlRnVuYyA9IGQzLmVhc2VFeHBcbiAgICovXG4gIGJveHdoaXNrZXIuZWFzZUZ1bmMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGVhc2VGdW5jID0gXywgYm94d2hpc2tlcikgOiBlYXNlRnVuYzsgfTtcblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGJhcktleXNcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNib3hLZXlzfSlcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBzdHJpbmdbXX1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgYm94S2V5cyA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYm94d2hpc2tlci5ib3hLZXlzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChib3hLZXlzID0gXywgYm94d2hpc2tlcikgOiBib3hLZXlzOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGJveFZhbHVlc1xuICAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI2JveFZhbHVlc30pXG4gICAqIEBwYXJhbSB7bnVtYmVyW119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgbnVtYmVyW119XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGJveFZhbHVlcyA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYm94d2hpc2tlci5ib3hWYWx1ZXMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGJveFZhbHVlcyA9IF8sIGJveHdoaXNrZXIpIDogYm94VmFsdWVzOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG9iamVjdFNpemVcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNvYmplY3RTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvYmplY3RTaXplID0gdW5kZWZpbmVkXG4gICAqL1xuICBib3h3aGlza2VyLm9iamVjdFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9iamVjdFNpemUgPSBfLCBib3h3aGlza2VyKSA6IG9iamVjdFNpemU7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgc3BhY2VyU2l6ZVxuICAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI3NwYWNlclNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNwYWNlclNpemUgPSB1bmRlZmluZWRcbiAgICovXG4gIGJveHdoaXNrZXIuc3BhY2VyU2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3BhY2VyU2l6ZSA9IF8sIGJveHdoaXNrZXIpIDogc3BhY2VyU2l6ZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB0b29sdGlwXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjdG9vbHRpcH0pXG4gICAqIEBwYXJhbSB7dG9vbHRpcH0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCB0b29sdGlwfVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0b29sdGlwID0gdG9vbHRpcCgpXG4gICAqL1xuICBib3h3aGlza2VyLnRvb2x0aXAgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRvb2x0aXAgPSBfLCBib3h3aGlza2VyKSA6IHRvb2x0aXA7IH07XG5cblxuICBmdW5jdGlvbiBib3h3aGlza2VyKCkge1xuICAgIC8vIGZvciBjb252ZW5pZW5jZSBpbiBoYW5kbGluZyBvcmllbnRhdGlvbiBzcGVjaWZpYyB2YWx1ZXNcbiAgICB2YXIgaG9yaXpvbnRhbFEgPSAob3JpZW50ID09ICdob3Jpem9udGFsJykgPyB0cnVlIDogZmFsc2VcbiAgICB2YXIgdmVydGljYWxRID0gIWhvcml6b250YWxRXG5cbiAgICAvLyBiYWNrZ3JvdW5kIGNsaXBpbmcgcmVjdGFuZ2xlXG4gICAgdmFyIGJnY3BSZWN0ID0ge3g6MCwgeTowLCB3aWR0aDogc3BhY2VYLCBoZWlnaHQ6c3BhY2VZfVxuICAgIHZhciBjb250YWluZXIgPSBzZXR1cENvbnRhaW5lciggc2VsZWN0aW9uLCBuYW1lc3BhY2UsIGJnY3BSZWN0LCBiYWNrZ3JvdW5kRmlsbCApO1xuXG4gICAgLy8gaWYgZ3JvdXBpbmcgaXMgdW5kZWZpbmVkIHNvcnQga2V5cyBieSBzb3J0aW5nIGZ1bmN0XG4gICAgdmFyIG9yZGVyZWQgPSAoZ3JvdXBpbmcgPT0gdW5kZWZpbmVkKSA/IGQzLmtleXMoZGF0YSkuc29ydChzb3J0aW5nRnVuY3Rpb24pIDogZ3JvdXBpbmdcbiAgICAvLyB0byBwcmV2ZW50IHJlLWNhbGN1bGF0aW9uIGFuZCBnZXR0ZXJzIHRvIGJlIHBhc3NlZCB0byBheGVzXG4gICAgYm94S2V5cyA9IGZsYXR0ZW4ob3JkZXJlZClcbiAgICBib3hWYWx1ZXMgPSBib3hLZXlzLm1hcCh2YWx1ZUV4dHJhY3RvcilcblxuXG4gICAgdmFyIG51bWJlck9mT2JqZWN0cyA9IGJveEtleXMubGVuZ3RoXG4gICAgdmFyIGV4dGVudCA9IFtcbiAgICAgIE1hdGgubWluKC4uLmJveFZhbHVlcy5tYXAoZnVuY3Rpb24oZCxpKXtyZXR1cm4gZFtxdWFydGlsZXNLZXlzWzBdXX0pKSAtIGRvbWFpblBhZGRpbmcsXG4gICAgICBNYXRoLm1heCguLi5ib3hWYWx1ZXMubWFwKGZ1bmN0aW9uKGQsaSl7cmV0dXJuIGRbcXVhcnRpbGVzS2V5c1s0XV19KSkgKyBkb21haW5QYWRkaW5nXG4gICAgXTtcblxuICAgIC8vIHNldCB0aGUgc2NhbGVcbiAgICBzY2FsZS5kb21haW4oZXh0ZW50KS5yYW5nZShob3Jpem9udGFsUSA/IFswLHNwYWNlWV0gOiBbc3BhY2VYLCAwXSlcbiAgICB2YXIgc3BhY2UgPSBob3Jpem9udGFsUSA/IHNwYWNlWCA6IHNwYWNlWVxuICAgIC8vIGNhbGN1bGF0ZSBvYmplY3Qgc2l6ZVxuICAgIG9iamVjdFNpemUgPSBjYWxjdWxhdGVXaWR0aE9mT2JqZWN0KHNwYWNlLCBudW1iZXJPZk9iamVjdHMsIG1pbk9iamVjdFNpemUsIG1heE9iamVjdFNpemUsIG9iamVjdFNwYWNlciwgb3ZlcmZsb3dRKVxuICAgIC8vIGNhbGN1bGF0ZSBzcGFjZXIgc2l6ZSBpZiBuZWVkZWRcbiAgICBzcGFjZXJTaXplID0gY2FsY3VsYXRlV2lkdGhPZlNwYWNlcihib3hLZXlzLCBzcGFjZSwgb2JqZWN0U2l6ZSwgbnVtYmVyT2ZPYmplY3RzLCBvYmplY3RTcGFjZXIsIG92ZXJmbG93USlcbiAgICAvLyBtYWtlIHRoZSBuZXN0ZWQgZ3JvdXBzXG4gICAgdmFyIHNwYWNlckZ1bmN0aW9uID0gZ3JvdXBpbmdTcGFjZXIoKVxuICAgIC5ob3Jpem9udGFsUShob3Jpem9udGFsUSkuc2NhbGUoc2NhbGUpLm1vdmVieSgnY2F0ZWdvcnknKS5udW1iZXJPZk9iamVjdHMobnVtYmVyT2ZPYmplY3RzKVxuICAgIC5vYmplY3RDbGFzcyhvYmplY3RDbGFzcykub2JqZWN0U2l6ZShvYmplY3RTaXplKS5zcGFjZXJTaXplKHNwYWNlclNpemUpXG4gICAgLnRyYW5zaXRpb25EdXJhdGlvbih0cmFuc2l0aW9uRHVyYXRpb24pLmVhc2VGdW5jKGVhc2VGdW5jKVxuICAgIC5uYW1lc3BhY2UobmFtZXNwYWNlKVxuXG4gICAgLy8gbW92ZSBzdHVmZlxuICAgIHNwYWNlckZ1bmN0aW9uKGNvbnRhaW5lciwgb3JkZXJlZCwgMClcblxuICAgIHZhciBwYXJlbnRJbmRleEFycmF5ID0gW11cbiAgICBjb250YWluZXIuc2VsZWN0QWxsKCdnOm5vdCgudG8tcmVtb3ZlKS4nK29iamVjdENsYXNzKVxuICAgIC5lYWNoKGZ1bmN0aW9uKGQsIGkpe2lmIChoYXNRKGJveEtleXMsIGQpKXsgcGFyZW50SW5kZXhBcnJheS5wdXNoKE51bWJlcihkMy5zZWxlY3QodGhpcykuYXR0cigncGFyZW50LWluZGV4JykpKX19KVxuXG5cblxuICAgIGNvbG9yRnVuY3Rpb24gPSBjb2xvckZ1bmN0aW9uLmNvbG9yQnkoKSA9PSAnaW5kZXgnXG4gICAgPyBjb2xvckZ1bmN0aW9uLmRhdGFFeHRlbnQoWzAsIE1hdGgubWF4KC4uLnBhcmVudEluZGV4QXJyYXkpXSlcbiAgICA6IGNvbG9yRnVuY3Rpb24uZGF0YUV4dGVudChleHRlbnQpXG5cblxuICAgIC8vIHNldCBhdHRyaWJ1dGVzIGZvciBib3ggYW5kIHdoaXNrZXJzXG4gICAgY29udGFpbmVyLnNlbGVjdEFsbCgnZzpub3QoLnRvLXJlbW92ZSkuJytvYmplY3RDbGFzcykuZWFjaChmdW5jdGlvbihrZXksIGkpIHtcbiAgICAgIHZhciB0ID0gZDMuc2VsZWN0KHRoaXMpLFxuICAgICAgY3VycmVudERhdGEgPSBkYXRhW2tleV0sXG5cbiAgICAgIHF1YXJ0aWxlcyA9IHZhbHVlRXh0cmFjdG9yKGtleSwgaSksXG4gICAgICBxMCA9IHF1YXJ0aWxlc1txdWFydGlsZXNLZXlzWzBdXSxcbiAgICAgIHExID0gcXVhcnRpbGVzW3F1YXJ0aWxlc0tleXNbMV1dLFxuICAgICAgcTIgPSBxdWFydGlsZXNbcXVhcnRpbGVzS2V5c1syXV0sXG4gICAgICBxMyA9IHF1YXJ0aWxlc1txdWFydGlsZXNLZXlzWzNdXSxcbiAgICAgIHE0ID0gcXVhcnRpbGVzW3F1YXJ0aWxlc0tleXNbNF1dXG5cbiAgICAgIHZhciBpID0gdC5hdHRyKCdwYXJlbnQtaW5kZXgnKSA9PSB1bmRlZmluZWQgPyBpIDogdC5hdHRyKCdwYXJlbnQtaW5kZXgnKSxcbiAgICAgIGZpbGxDb2xvciA9IGNvbG9yRnVuY3Rpb24oa2V5LCBxMiwgaSwgJ2ZpbGwnKSwgLy8gcHJldmVudCBkdXBsaWNhdGUgY29tcHV0YXRpb25cbiAgICAgIHN0cm9rZUNvbG9yID0gY29sb3JGdW5jdGlvbihrZXksIHEyLCBpLCAgJ3N0cm9rZScpXG5cblxuICAgICAgdmFyXG4gICAgICB3aGlzayA9IHNhZmVTZWxlY3QodCwgJ2cnLCAnd2hpc2tlcicpLFxuICAgICAgdVdoaXNrID0gc2FmZVNlbGVjdCh3aGlzaywgJ3BhdGgnLCAndXBwZXInKSxcbiAgICAgIGxXaGlzayA9IHNhZmVTZWxlY3Qod2hpc2ssICdwYXRoJywgJ2xvd2VyJyksXG4gICAgICBxdWFydCA9IHNhZmVTZWxlY3QodCwgJ2cnLCAncXVhcnRpbGUnKSxcbiAgICAgIHVRdWFydCA9IHNhZmVTZWxlY3QocXVhcnQsICdyZWN0JywgJ3VwcGVyJyksXG4gICAgICBsUXVhcnQgPSBzYWZlU2VsZWN0KHF1YXJ0LCAncmVjdCcsICdsb3dlcicpLFxuICAgICAgbVF1YXJ0ID0gc2FmZVNlbGVjdChxdWFydCwgJ2NpcmNsZScsICdtZWRpYW4nKVxuXG5cbiAgICAgIC8vIHNldCB1cHBlciBxdWFydGlsZSAocTMpXG4gICAgICB1UXVhcnQudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuZWFzZShlYXNlRnVuYylcbiAgICAgIC5hdHRyKCd3aWR0aCcsIGhvcml6b250YWxRID8gb2JqZWN0U2l6ZSA6IHNjYWxlKHEzKSAtIHNjYWxlKHEyKSlcbiAgICAgIC5hdHRyKCdoZWlnaHQnLCB2ZXJ0aWNhbFEgPyBvYmplY3RTaXplIDogc2NhbGUocTMpIC0gc2NhbGUocTIpKVxuICAgICAgLmF0dHIoJ2ZpbGwnLCBmaWxsQ29sb3IpXG4gICAgICAuYXR0cignc3Ryb2tlJywgc3Ryb2tlQ29sb3IpXG4gICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgYm94U3Ryb2tlV2lkdGgpXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24oZCwgaSl7XG4gICAgICAgIHZhclxuICAgICAgICB4ID0gaG9yaXpvbnRhbFEgPyAwIDogc2NhbGUocTIpLFxuICAgICAgICB5ID0gdmVydGljYWxRID8gMCA6IHNjYWxlKGV4dGVudFsxXSkgLSBzY2FsZShxMyksXG4gICAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgICAgcmV0dXJuIHRcbiAgICAgIH0pXG5cbiAgICAgIC8vIHNldCBsb3dlciBxdWFydGlsZSAocTEpXG4gICAgICBsUXVhcnQudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuZWFzZShlYXNlRnVuYylcbiAgICAgIC5hdHRyKCd3aWR0aCcsIGhvcml6b250YWxRID8gb2JqZWN0U2l6ZSA6IHNjYWxlKHEyKSAtIHNjYWxlKHExKSlcbiAgICAgIC5hdHRyKCdoZWlnaHQnLCB2ZXJ0aWNhbFEgPyBvYmplY3RTaXplIDogc2NhbGUocTIpIC0gc2NhbGUocTEpKVxuICAgICAgLmF0dHIoJ2ZpbGwnLCBmaWxsQ29sb3IpXG4gICAgICAuYXR0cignc3Ryb2tlJywgc3Ryb2tlQ29sb3IpXG4gICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgYm94U3Ryb2tlV2lkdGgpXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24oZCwgaSl7XG4gICAgICAgIHZhclxuICAgICAgICB4ID0gaG9yaXpvbnRhbFEgPyAwIDogc2NhbGUocTEpLFxuICAgICAgICB5ID0gdmVydGljYWxRID8gMCA6IHNjYWxlKGV4dGVudFsxXSkgLSBzY2FsZShxMiksXG4gICAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgICAgcmV0dXJuIHRcbiAgICAgIH0pXG5cblxuICAgICAgLy8gc2V0IG1lZGlhbiAocTIpXG4gICAgICBtUXVhcnQudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuZWFzZShlYXNlRnVuYylcbiAgICAgIC5hdHRyKCdyJywgZnVuY3Rpb24oZCwgaSl7XG4gICAgICAgIHZhciByID0gb2JqZWN0U2l6ZSAvIDJcbiAgICAgICAgdmFyIGRpZiA9IChzY2FsZShxMykgLSBzY2FsZShxMSkpIC8gMlxuICAgICAgICByZXR1cm4gKHIgPiBkaWYpID8gZGlmIDogclxuICAgICAgfSlcbiAgICAgIC5hdHRyKCdmaWxsJywgZmlsbENvbG9yKVxuICAgICAgLmF0dHIoJ3N0cm9rZScsIHN0cm9rZUNvbG9yKVxuICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIGJveFN0cm9rZVdpZHRoKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uKGQsIGkpe1xuICAgICAgICB2YXJcbiAgICAgICAgeCA9IGhvcml6b250YWxRID8gb2JqZWN0U2l6ZSAvIDIgOiBzY2FsZShxMiksXG4gICAgICAgIHkgPSB2ZXJ0aWNhbFEgPyBvYmplY3RTaXplIC8gMiA6IHNjYWxlKGV4dGVudFsxXSkgLSBzY2FsZShxMiksXG4gICAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgICAgcmV0dXJuIHRcbiAgICAgIH0pXG5cbiAgICAgIC8vIHNldCBsb3dlciB3aGlza2VyIChtaW4pXG4gICAgICBsV2hpc2sudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuZWFzZShlYXNlRnVuYylcbiAgICAgIC5hdHRyKCdkJywgZnVuY3Rpb24oZGQsIGlpKXtcbiAgICAgICAgdmFyXG4gICAgICAgIGRpciA9IGZhbHNlLFxuICAgICAgICB4ID0gMCxcbiAgICAgICAgeSA9IDAsXG4gICAgICAgIGggPSBob3Jpem9udGFsUSA/IHNjYWxlKHExKSAtIHNjYWxlKHEwKSA6IG9iamVjdFNpemUsXG4gICAgICAgIHcgPSB2ZXJ0aWNhbFEgPyBzY2FsZShxMSkgLSBzY2FsZShxMCkgOiBvYmplY3RTaXplXG4gICAgICAgIHJldHVybiB3aGlza2VyUGF0aChkaXIsIHgsIHksIHcsIGgsIHdoaXNrZXJXaWR0aFBlcmNlbnQsIG9yaWVudClcbiAgICAgIH0pXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24oZCwgaSl7XG4gICAgICAgIHZhclxuICAgICAgICB4ID0gaG9yaXpvbnRhbFEgPyAwIDogc2NhbGUocTEpLFxuICAgICAgICB5ID0gdmVydGljYWxRID8gMCA6IHNjYWxlKGV4dGVudFsxXSkgLSBzY2FsZShxMSksXG4gICAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgICAgcmV0dXJuIHRcbiAgICAgIH0pXG4gICAgICAuYXR0cignc3Ryb2tlJywgJ2JsYWNrJykuYXR0cignc3Ryb2tlLXdpZHRoJywgd2hpc2tlclN0cm9rZVdpZHRoKVxuICAgICAgLmF0dHIoJ2ZpbGwnLCAnbm9uZScpXG5cbiAgICAgIC8vIHNldCB1cHBlciB3aGlza2VyIChtYXgpXG4gICAgICB1V2hpc2sudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuZWFzZShlYXNlRnVuYylcbiAgICAgIC5hdHRyKCdkJywgZnVuY3Rpb24oZGQsIGlpKXtcbiAgICAgICAgdmFyXG4gICAgICAgIGRpciA9IHRydWUsXG4gICAgICAgIHggPSAwLFxuICAgICAgICB5ID0gMCxcbiAgICAgICAgaCA9IGhvcml6b250YWxRID8gc2NhbGUocTQpIC0gc2NhbGUocTMpIDogb2JqZWN0U2l6ZSxcbiAgICAgICAgdyA9IHZlcnRpY2FsUSA/IHNjYWxlKHE0KSAtIHNjYWxlKHEzKSA6IG9iamVjdFNpemVcbiAgICAgICAgcmV0dXJuIHdoaXNrZXJQYXRoKGRpciwgeCwgeSwgdywgaCwgd2hpc2tlcldpZHRoUGVyY2VudCwgb3JpZW50KVxuICAgICAgfSlcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbihkLCBpKXtcbiAgICAgICAgdmFyXG4gICAgICAgIHggPSBob3Jpem9udGFsUSA/IDAgOiBzY2FsZShxMyksXG4gICAgICAgIHkgPSB2ZXJ0aWNhbFEgPyAwIDogIHNjYWxlKGV4dGVudFsxXSkgLSBzY2FsZShxNCksXG4gICAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgICAgcmV0dXJuIHRcbiAgICAgIH0pXG4gICAgICAuYXR0cignc3Ryb2tlJywgJ2JsYWNrJylcbiAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCB3aGlza2VyU3Ryb2tlV2lkdGgpXG4gICAgICAuYXR0cignZmlsbCcsICdub25lJylcblxuICAgIH0pXG5cbiAgICB0b29sdGlwLnNlbGVjdGlvbihjb250YWluZXIuc2VsZWN0QWxsKCdnOm5vdCgudG8tcmVtb3ZlKS4nK29iamVjdENsYXNzKSlcbiAgICAuZGF0YShkYXRhKVxuICAgIHRvb2x0aXAoKVxuXG5cbiAgfVxuXG4gIHJldHVybiBib3h3aGlza2VyXG59XG4iLCJpbXBvcnQge2h5cGVuYXRlLCBzYWZlU2VsZWN0fSBmcm9tICcuL2hlbHBlcnMnO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFUQVRPR0dMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqXG4gKiBDcmVhdGVzIGEgZGF0YXRvZ2dsZVxuICogQGNvbnN0cnVjdG9yIGRhdGF0b2dnbGVcbiAqIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBzZWxlY3Rpb25cbiAqIEBuYW1lc3BhY2UgZGF0YXRvZ2dsZVxuICogQHJldHVybnMge2Z1bmN0aW9ufSBkYXRhdG9nZ2xlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkYXRhdG9nZ2xlKCBzZWxlY3Rpb24gKSB7XG4gIHZhclxuICAvKipcbiAgKiBLZXlzIHRvIG1ha2UgdG9nZ2xlLWFibGUgb3B0aW9uc1xuICAqIChzZWUge0BsaW5rIGRhdGF0b2dnbGUja2V5c30pXG4gICogQHBhcmFtIHtzdHJpbmdbXX0gW2tleXM9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBkYXRhdG9nZ2xlI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBrZXlzLFxuICAvKipcbiAgKiBXaGF0IHRvIGRvIHdoZW4gYSBkaWZmZXJlbnQga2V5IGlzIGNsaWNrZWRcbiAgKiAoc2VlIHtAbGluayBkYXRhdG9nZ2xlI3VwZGF0ZUZ1bmN0aW9ufSlcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbdXBkYXRlRnVuY3Rpb249ZnVuY3Rpb24oKXt9XVxuICAqIEBtZW1iZXJvZiBkYXRhdG9nZ2xlI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB1cGRhdGVGdW5jdGlvbiA9IGZ1bmN0aW9uKCl7fSxcbiAgLyoqXG4gICogTmFtZXNwYWNlIGZvciBhbGwgaXRlbXMgbWFkZSBieSB0aGlzIGluc3RhbmNlIG9mIGRhdGF0b2dnbGVcbiAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVzcGFjZT1cImQzc20tZGF0YWJhclwiXVxuICAqIEBtZW1iZXJvZiBkYXRhdG9nZ2xlI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBuYW1lc3BhY2U9J2Qzc20tZGF0YWJhcicsXG4gIC8qKlxuICAqIEN1cnJlbnRseSB0b2dnbGVkIGtleVxuICAqIEBwYXJhbSB7c3RyaW5nfSBbY3VycmVudEtleT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGRhdGF0b2dnbGUjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGN1cnJlbnRLZXlcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBrZXlzXG4gICAqIChzZWUge0BsaW5rIGRhdGF0b2dnbGUja2V5c30pXG4gICAqIEBmdW5jdGlvbiBkYXRhdG9nZ2xlLmtleXNcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2RhdGF0b2dnbGUgfCBzdHJpbmdbXX1cbiAgICogQG1lbWJlcm9mIGRhdGF0b2dnbGVcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQga2V5cyA9IHVuZGVmaW5lZFxuICAgKi9cbiAgdG9nZ2xlLmtleXMgPSBmdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChrZXlzID0gXywgdG9nZ2xlKSA6IGtleXN9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdXBkYXRlRnVuY3Rpb25cbiAgICogKHNlZSB7QGxpbmsgZGF0YXRvZ2dsZSN1cGRhdGVGdW5jdGlvbn0pXG4gICAqIEBmdW5jdGlvbiBkYXRhdG9nZ2xlLnVwZGF0ZUZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtkYXRhdG9nZ2xlIHwgZnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiBkYXRhdG9nZ2xlXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHVwZGF0ZUZ1bmN0aW9uID0gZnVuY3Rpb24oKXt9XG4gICAqL1xuICB0b2dnbGUudXBkYXRlRnVuY3Rpb24gPSBmdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh1cGRhdGVGdW5jdGlvbiA9IF8sIHRvZ2dsZSkgOiB1cGRhdGVGdW5jdGlvbn1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBuYW1lc3BhY2VcbiAgICogKHNlZSB7QGxpbmsgZGF0YXRvZ2dsZSNuYW1lc3BhY2V9KVxuICAgKiBAZnVuY3Rpb24gZGF0YXRvZ2dsZS5uYW1lc3BhY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtkYXRhdG9nZ2xlIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgZGF0YXRvZ2dsZVxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBuYW1lc3BhY2UgPSAnZDNzbS1kYXRhYmFyJ1xuICAgKi9cbiAgdG9nZ2xlLm5hbWVzcGFjZSA9IGZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG5hbWVzcGFjZSA9IF8sIHRvZ2dsZSkgOiBuYW1lc3BhY2V9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgY3VycmVudEtleVxuICAgKiAoc2VlIHtAbGluayBkYXRhdG9nZ2xlI2N1cnJlbnRLZXl9KVxuICAgKiBAZnVuY3Rpb24gZGF0YXRvZ2dsZS5jdXJyZW50S2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7ZGF0YXRvZ2dsZSB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGRhdGF0b2dnbGVcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgY3VycmVudEtleSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgdG9nZ2xlLmN1cnJlbnRLZXkgPSBmdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjdXJyZW50S2V5ID0gXywgdG9nZ2xlKSA6IGN1cnJlbnRLZXl9XG5cbiAgZnVuY3Rpb24gdG9nZ2xlKCkge1xuICAgIC8vIHNlbGVjdGlvbiBvcHRpb25zXG4gICAgdmFyIGRhdGFvcHRzID0gc2VsZWN0aW9uLnNlbGVjdEFsbCgnZGl2LmRhdGEtb3B0aW9uJylcbiAgICAvLyByZW1vdmUgZXhjZXNzXG4gICAgZGF0YW9wdHMuZXhpdCgpLnJlbW92ZSgpXG4gICAgLy8gYmluZCBkYXRhXG4gICAgZGF0YW9wdHMgPSBkYXRhb3B0cy5kYXRhKGtleXMpXG4gICAgLy8gZW50ZXJcbiAgICB2YXIgZG9FbnRlciA9IGRhdGFvcHRzLmVudGVyKCkuYXBwZW5kKCdkaXYnKS5hdHRyKCdjbGFzcycsICdkYXRhLW9wdGlvbicpXG4gICAgLmNsYXNzZWQoJ2Zvcm0tY2hlY2sgZm9ybS1jaGVjay1pbmxpbmUgYWxpZ24tbWlkZGxlJywgdHJ1ZSlcbiAgICBkb0VudGVyXG4gICAgLmFwcGVuZCgnaW5wdXQnKS5hdHRyKCd0eXBlJywgJ3JhZGlvJylcbiAgICAuYXR0cignaWQnLCBmdW5jdGlvbihkLGkpe3JldHVybiBoeXBlbmF0ZShuYW1lc3BhY2UsIGQpfSlcbiAgICAuYXR0cignbmFtZScsIGh5cGVuYXRlKG5hbWVzcGFjZSwgJ2RhdGFiYXInKSlcbiAgICAuYXR0cigndmFsdWUnLCBmdW5jdGlvbihkLCBpKXtyZXR1cm4gZH0pXG5cbiAgICBkb0VudGVyXG4gICAgLmFwcGVuZCgnbGFiZWwnKVxuICAgIC5hdHRyKCdmb3InLCBmdW5jdGlvbihkLGkpe3JldHVybiBoeXBlbmF0ZShuYW1lc3BhY2UsIGQpfSlcbiAgICAuYXR0cignbmFtZScsIGh5cGVuYXRlKG5hbWVzcGFjZSwgJ2RhdGFiYXInKSlcbiAgICAudGV4dChmdW5jdGlvbihkLCBpKXtyZXR1cm4gZH0pXG5cbiAgICBkYXRhb3B0cyA9IGRhdGFvcHRzLm1lcmdlKGRvRW50ZXIpXG5cbiAgICBjdXJyZW50S2V5ID0gZGF0YW9wdHMuc2VsZWN0KCc6Y2hlY2tlZCcpLmVtcHR5KClcbiAgICA/IGtleXNbMF1cbiAgICA6IGRhdGFvcHRzLnNlbGVjdCgnOmNoZWNrZWQnKS5kYXR1bSgpXG5cbiAgICAvLyBjaGVjayBjdXJyZW50XG4gICAgZGF0YW9wdHMuc2VsZWN0KCdbdmFsdWU9XCInK2N1cnJlbnRLZXkrJ1wiXScpLnByb3BlcnR5KCdjaGVja2VkJywgdHJ1ZSlcblxuICAgIC8vIGJpbmQgdXBkYXRlIGZ1bmN0aW9uXG4gICAgZGF0YW9wdHMub24oJ2NsaWNrJywgZnVuY3Rpb24oZCwgaSl7IHVwZGF0ZUZ1bmN0aW9uKCkgfSlcbiAgICByZXR1cm4gdG9nZ2xlXG4gIH1cblxuICByZXR1cm4gdG9nZ2xlXG59XG4iLCJpbXBvcnQge2h5cGVuYXRlLCBzYWZlU2VsZWN0fSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHtzZXR1cENvbnRhaW5lciwgY2FsY3VsYXRlV2lkdGhPZk9iamVjdCwgY2FsY3VsYXRlV2lkdGhPZlNwYWNlcn0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge3VuaXF1ZSwgZmxhdHRlbn0gZnJvbSAnLi9hcnJheS1mdW5jdGlvbnMnO1xuaW1wb3J0IHtncm91cGluZ1NwYWNlcn0gZnJvbSAnLi9ncm91cGluZy1zcGFjZXInO1xuaW1wb3J0IHtjb2xvckZ1bmN0aW9uIGFzIENGfSBmcm9tICcuL2NvbG9yLWZ1bmN0aW9uJztcbmltcG9ydCB7dG9vbHRpcCBhcyBUVGlwfSBmcm9tICcuL3Rvb2x0aXAnO1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0FUVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKlxuICogQ3JlYXRlcyBhIHNjYXR0ZXJcbiAqXG4gKiB7QGxpbmsgaHR0cHM6Ly9zdW1uZXVyb24uZ2l0bGFiLmlvL2Qzc20vZGVtb3Mvc2NhdHRlci9pbmRleC5odG1sIERlbW99XG4gKiBAY29uc3RydWN0b3Igc2NhdHRlclxuICogQHBhcmFtIHtkMy5zZWxlY3Rpb259IHNlbGVjdGlvblxuICogQG5hbWVzcGFjZSBzY2F0dGVyXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259IHNjYXR0ZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjYXR0ZXIgKCBzZWxlY3Rpb24gKSB7XG5cbiAgdmFyXG4gIC8qKlxuICAqIERhdGEgdG8gcGxvdC4gQXNzdW1lZCB0byBiZSBhIG9iamVjdCwgd2hlcmUgZWFjaCBrZXkgY29ycmVzcG9uZHMgdG8gYSBwb2ludFxuICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjZGF0YX0pXG4gICogQHBhcmFtIHtPYmplY3R9IFtkYXRhPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZGF0YSxcbiAgLyoqXG4gICogQW1vdW50IG9mIGhvcml6b250YWwgc3BhY2UgKGluIHBpeGVscykgYXZhaWJsZSB0byByZW5kZXIgdGhlIHNjYXR0ZXIgaW5cbiAgKiAoc2VlIHtAbGluayBzY2F0dGVyI3NwYWNlWH0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZVg9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzcGFjZVgsXG4gIC8qKlxuICAqIEFtb3VudCBvZiB2ZXJ0aWNhbCBzcGFjZSAoaW4gcGl4ZWxzKSBhdmFpYmxlIHRvIHJlbmRlciB0aGUgc2NhdHRlciBpblxuICAqIChzZWUge0BsaW5rIHNjYXR0ZXIuc3BhY2VZfSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW3NwYWNlWT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNwYWNlWSxcblxuICAvKipcbiAgKiBUaGUgc2NhbGUgZm9yIHdoaWNoIHNjYXR0ZXIgeCB2YWx1ZXMgc2hvdWxkIGJlIHRyYW5zZm9ybWVkIGJ5XG4gICogQHBhcmFtIHtkMy5zY2FsZX0gW3NjYWxlWD1kMy5zY2FsZUxpbmVhcl1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc2NhbGVYID0gZDMuc2NhbGVMaW5lYXIoKSxcbiAgLyoqXG4gICogVGhlIHBhZGRpbmcgZm9yIHRoZSBkb21haW4gb2YgdGhlIHNjYWxlWCAoc2VlIHtAbGluayBzY2F0dGVyI3NjYWxlWH0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtkb21haW5QYWRkaW5nWD0wLjVdXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGRvbWFpblBhZGRpbmdYID0gMC41LFxuICAvKipcbiAgKiBUaGUgZnVuY3Rpb24gZm9yIGdldHRpbmcgdGhlIHggdmFsdWUgb2YgdGhlIGN1cnJlbnQgcG9pbnRcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbdmFsdWVFeHRyYWN0b3JYPWZ1bmN0aW9uKGQsIGkpe3JldHVybiBkYXRhW2RdWyd4J119XVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB2YWx1ZUV4dHJhY3RvclggPSBmdW5jdGlvbihkLCBpKSB7cmV0dXJuIGRhdGFbZF1bJ3gnXX0sXG5cbiAgLyoqXG4gICogVGhlIHNjYWxlIGZvciB3aGljaCBzY2F0dGVyIHkgdmFsdWVzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBieVxuICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtzY2FsZVk9ZDMuc2NhbGVMaW5lYXJdXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNjYWxlWSA9IGQzLnNjYWxlTGluZWFyKCksXG4gIC8qKlxuICAqIFRoZSBwYWRkaW5nIGZvciB0aGUgZG9tYWluIG9mIHRoZSBzY2FsZVkgKHNlZSB7QGxpbmsgc2NhdHRlciNzY2FsZVl9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbZG9tYWluUGFkZGluZ1k9MC41XVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBkb21haW5QYWRkaW5nWSA9IDAuNSxcbiAgLyoqXG4gICogVGhlIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHRoZSB5IHZhbHVlIG9mIHRoZSBjdXJyZW50IHBvaW50XG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW3ZhbHVlRXh0cmFjdG9yWT1mdW5jdGlvbihkLCBpKXtyZXR1cm4gZGF0YVtkXVsneSddfV1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdmFsdWVFeHRyYWN0b3JZID0gZnVuY3Rpb24oZCwgaSkge3JldHVybiBkYXRhW2RdWyd5J119LFxuXG5cbiAgLyoqXG4gICogVGhlIHNjYWxlIGZvciB3aGljaCBzY2F0dGVyIHIgdmFsdWVzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBieVxuICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtzY2FsZVI9ZDMuc2NhbGVMaW5lYXJdXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNjYWxlUiA9IGQzLnNjYWxlTGluZWFyKCksXG4gIC8qKlxuICAqIFRoZSBwYWRkaW5nIGZvciB0aGUgZG9tYWluIG9mIHRoZSBzY2FsZVIgKHNlZSB7QGxpbmsgc2NhdHRlciNzY2FsZVJ9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbZG9tYWluUGFkZGluZ1I9MC41XVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBkb21haW5QYWRkaW5nUiA9IDAuNSxcbiAgLyoqXG4gICogVGhlIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHRoZSByIHZhbHVlIG9mIHRoZSBjdXJyZW50IHBvaW50XG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW3ZhbHVlRXh0cmFjdG9yUj1mdW5jdGlvbihkLCBpKXtyZXR1cm4gMn1dXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHZhbHVlRXh0cmFjdG9yUiA9IGZ1bmN0aW9uKGQsIGkpIHtyZXR1cm4gMn0sXG4gIC8qKlxuICAqIFRoZSBtaW4gcmFkaXVzIGEgcG9pbnQgY2FuIGhhdmVcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbbWluUmFkaXVzPTJdXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG1pblJhZGl1cyA9IDIsXG4gIC8qKlxuICAqIFRoZSBtaW4gcmFkaXVzIGEgcG9pbnQgY2FuIGhhdmVcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbbWF4UmFkaXVzPTEwXVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBtYXhSYWRpdXMgPSAxMCxcblxuICAvKipcbiAgKiBUaGUgc3Ryb2tlIHdpZHRoIG9mIHRoZSBwb2ludHNcbiAgKiBAcGFyYW0ge251bWJlcn0gW3BvaW50U3Ryb2tlV2lkdGg9Ml1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgcG9pbnRTdHJva2VXaWR0aCA9IDIsXG4gIC8qKlxuICAqIEluc3RhbmNlIG9mIENvbG9yRnVuY3Rpb25cbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbY29sb3JGdW5jdGlvbiA9IGNvbG9yRnVuY3Rpb24oKV1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgY29sb3JGdW5jdGlvbiA9IENGKCksXG4gIC8qKlxuICAqIENvbG9yIG9mIHRoZSBiYWNrZ3JvdW5kXG4gICogQHBhcmFtIHtzdHJpbmd9IFtiYWNrZ3JvdW5kRmlsbD1cInRyYW5zcGFyZW50XCJdXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGJhY2tncm91bmRGaWxsID0gJ3RyYW5zcGFyZW50JyxcbiAgLyoqXG4gICogTmFtZXNwYWNlIGZvciBhbGwgaXRlbXMgbWFkZSBieSB0aGlzIGluc3RhbmNlIG9mIHNjYXR0ZXJcbiAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVzcGFjZT1cImQzc20tc2NhdHRlclwiXVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBuYW1lc3BhY2UgPSAnZDNzbS1zY2F0dGVyJyxcbiAgLyoqXG4gICogQ2xhc3MgbmFtZSBmb3Igc2NhdHRlciBjb250YWluZXIgKDxjaXJjbGU+IGVsZW1lbnQpXG4gICogQHBhcmFtIHtzdHJpbmd9IFtvYmplY3RDbGFzcz1cInNjYXR0ZXItcG9pbnRcIl1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb2JqZWN0Q2xhc3MgPSAnc2NhdHRlci1wb2ludCcsXG4gIC8qKlxuICAqIER1cmF0aW9uIG9mIGFsbCB0cmFuc2l0aW9ucyBvZiB0aGlzIGVsZW1lbnRcbiAgKiBAcGFyYW0ge251bWJlcn0gW3RyYW5zaXRpb25EdXJhdGlvbj0xMDAwXVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB0cmFuc2l0aW9uRHVyYXRpb24gPSAxMDAwLFxuICAvKipcbiAgKiBFYXNpbmcgZnVuY3Rpb24gZm9yIHRyYW5zaXRpb25zXG4gICogQHBhcmFtIHtkMy5lYXNlfSBbZWFzZUZ1bmM9ZDMuZWFzZUV4cF1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZWFzZUZ1bmMgPSBkMy5lYXNlRXhwLFxuXG4gIC8vIHVzZWZ1bCB2YWx1ZXMgdG8gZXh0cmFjdCB0byBwcmV2ZW50IHJlLWNhbGN1bGF0aW9uXG4gIC8qKlxuICAqIFRoZSBrZXlzIG9mIHRoZSBwb2ludHNcbiAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbcG9pbnRLZXlzPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgcG9pbnRLZXlzLFxuICAvKipcbiAgKiBUaGUgeCB2YWx1ZXMgb2YgdGhlIHBvaW50c1xuICAqIEBwYXJhbSB7bnVtYmVyW119IFt2YWx1ZXNYPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdmFsdWVzWCxcbiAgLyoqXG4gICogVGhlIHkgdmFsdWVzIG9mIHRoZSBwb2ludHNcbiAgKiBAcGFyYW0ge251bWJlcltdfSBbdmFsdWVzWT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHZhbHVlc1ksXG4gIC8qKlxuICAqIFRoZSByIHZhbHVlcyBvZiB0aGUgcG9pbnRzXG4gICogQHBhcmFtIHtudW1iZXJbXX0gW3ZhbHVlc1I9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB2YWx1ZXNSLFxuXG4gIC8qKlxuICAqIEluc3RhbmNlIG9mIFRvb2x0aXBcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbdG9vbHRpcD10b29sdGlwKCldXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHRvb2x0aXAgPSBUVGlwKClcblxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBzZWxlY3Rpb24gaW4gd2hpY2ggaXRlbXMgYXJlIG1hbmlwdWxhdGVkXG4gICAqIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IGQzLnNlbGVjdGlvbn1cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc2VsZWN0aW9uID0gc2VsZWN0aW9uXG4gICAqL1xuICBzY2F0dGVyLnNlbGVjdGlvbiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2VsZWN0aW9uID1fLCBzY2F0dGVyKSA6IHNlbGVjdGlvbn1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgZGF0YVxuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI2RhdGF9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBvYmplY3R9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKi9cbiAgc2NhdHRlci5kYXRhID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkYXRhID1fLCBzY2F0dGVyKSA6IGRhdGF9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGFtb3VudCBvZiBob3Jpem9udGFsIHNwYWNlIGluIHdoaWNoIGl0ZW1zIGFyZSBtYW5pcHVsYXRlZFxuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI3NwYWNlWH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXSBzaG91bGQgYmUgYSBudW1iZXIgPiAwXG4gICAqIEByZXR1cm5zIHtzY2F0dGVyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzcGFjZVggPSB1bmRlZmluZWRcbiAgICovXG4gIHNjYXR0ZXIuc3BhY2VYID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzcGFjZVggPV8sIHNjYXR0ZXIpIDogc3BhY2VYfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBhbW91bnQgb2YgdmVydGljYWwgc3BhY2UgaW4gd2hpY2ggaXRlbXMgYXJlIG1hbmlwdWxhdGVkXG4gICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjc3BhY2VZfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdIHNob3VsZCBiZSBhIG51bWJlciA+IDBcbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNwYWNlWSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgc2NhdHRlci5zcGFjZVkgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNwYWNlWSA9Xywgc2NhdHRlcikgOiBzcGFjZVl9XG5cblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgeCBzY2FsZSBmb3Igd2hpY2ggdGhlIHNjYXR0ZXIgeCB2YWx1ZXMgc2hvdWxkIGJlIHRyYW5zZm9ybWVkIGJ5XG4gICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjc2NhbGVYfSlcbiAgICogQHBhcmFtIHtkMy5zY2FsZX0gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBkMy5zY2FsZX1cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc2NhbGVYID0gZDMuc2NhbGVMaW5lYXIoKVxuICAgKi9cbiAgc2NhdHRlci5zY2FsZVggPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNjYWxlWCA9Xywgc2NhdHRlcikgOiBzY2FsZVh9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgcGFkZGluZyBmb3IgdGhlIGRvbWFpbiBvZiB0aGUgeCBzY2FsZVxuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI2RvbWFpblBhZGRpbmdYfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtzY2F0dGVyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBkb21haW5QYWRkaW5nWCA9IDAuNVxuICAgKi9cbiAgc2NhdHRlci5kb21haW5QYWRkaW5nWCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluUGFkZGluZ1ggPV8sIHNjYXR0ZXIpIDogZG9tYWluUGFkZGluZ1h9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdmFsdWVFeHRyYWN0b3JYXG4gICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjdmFsdWVFeHRyYWN0b3JYfSlcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBmdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdmFsdWVFeHRyYWN0b3JYID0gZnVuY3Rpb24oa2V5LCBpbmRleCkgeyByZXR1cm4gZGF0YVtrZXldWyd4J10gfVxuICAgKi9cbiAgc2NhdHRlci52YWx1ZUV4dHJhY3RvclggPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZhbHVlRXh0cmFjdG9yWCA9Xywgc2NhdHRlcikgOiB2YWx1ZUV4dHJhY3Rvclh9XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHkgc2NhbGUgZm9yIHdoaWNoIHRoZSBzY2F0dGVyIHkgdmFsdWVzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBieVxuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI3NjYWxlWX0pXG4gICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtzY2F0dGVyIHwgZDMuc2NhbGV9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNjYWxlWSA9IGQzLnNjYWxlTGluZWFyKClcbiAgICovXG4gIHNjYXR0ZXIuc2NhbGVZID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzY2FsZVkgPV8sIHNjYXR0ZXIpIDogc2NhbGVZfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHBhZGRpbmcgZm9yIHRoZSBkb21haW4gb2YgdGhlIHkgc2NhbGVcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciNkb21haW5QYWRkaW5nWX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgZG9tYWluUGFkZGluZ1kgPSAwLjVcbiAgICovXG4gIHNjYXR0ZXIuZG9tYWluUGFkZGluZ1kgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpblBhZGRpbmdZID1fLCBzY2F0dGVyKSA6IGRvbWFpblBhZGRpbmdZfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHZhbHVlRXh0cmFjdG9yWVxuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI3ZhbHVlRXh0cmFjdG9yWX0pXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtzY2F0dGVyIHwgZnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHZhbHVlRXh0cmFjdG9yWSA9IGZ1bmN0aW9uKGtleSwgaW5kZXgpIHsgcmV0dXJuIGRhdGFba2V5XVsneSddIH1cbiAgICovXG4gIHNjYXR0ZXIudmFsdWVFeHRyYWN0b3JZID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2YWx1ZUV4dHJhY3RvclkgPV8sIHNjYXR0ZXIpIDogdmFsdWVFeHRyYWN0b3JZfVxuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSByIHNjYWxlIGZvciB3aGljaCB0aGUgc2NhdHRlciByIHZhbHVlcyBzaG91bGQgYmUgdHJhbnNmb3JtZWQgYnlcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciNzY2FsZVJ9KVxuICAgKiBAcGFyYW0ge2QzLnNjYWxlfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IGQzLnNjYWxlfVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzY2FsZVIgPSBkMy5zY2FsZUxpbmVhcigpXG4gICAqL1xuICBzY2F0dGVyLnNjYWxlUiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2NhbGVSID1fLCBzY2F0dGVyKSA6IHNjYWxlUn1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBwYWRkaW5nIGZvciB0aGUgZG9tYWluIG9mIHRoZSByIHNjYWxlXG4gICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjZG9tYWluUGFkZGluZ1J9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGRvbWFpblBhZGRpbmdSID0gMC41XG4gICAqL1xuICBzY2F0dGVyLmRvbWFpblBhZGRpbmdSID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkb21haW5QYWRkaW5nUiA9Xywgc2NhdHRlcikgOiBkb21haW5QYWRkaW5nUn1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB2YWx1ZUV4dHJhY3RvclJcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciN2YWx1ZUV4dHJhY3RvclJ9KVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IGZ1bmN0aW9ufVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB2YWx1ZUV4dHJhY3RvclIgPSBmdW5jdGlvbihrZXksIGluZGV4KSB7IHJldHVybiBkYXRhW2tleV1bJ3InXSB9XG4gICAqL1xuICBzY2F0dGVyLnZhbHVlRXh0cmFjdG9yUiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmFsdWVFeHRyYWN0b3JSID1fLCBzY2F0dGVyKSA6IHZhbHVlRXh0cmFjdG9yUn1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBtaW5SYWRpdXNcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciNtaW5SYWRpdXN9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG1pblJhZGl1cyA9IDJcbiAgICovXG4gIHNjYXR0ZXIubWluUmFkaXVzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChtaW5SYWRpdXMgPV8sIHNjYXR0ZXIpIDogbWluUmFkaXVzfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG1heFJhZGl1c1xuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI21heFJhZGl1c30pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgbWF4UmFkaXVzID0gMTBcbiAgICovXG4gIHNjYXR0ZXIubWF4UmFkaXVzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChtYXhSYWRpdXMgPV8sIHNjYXR0ZXIpIDogbWF4UmFkaXVzfVxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgcG9pbnRTdHJva2VXaWR0aFxuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI3BvaW50U3Ryb2tlV2lkdGh9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHBvaW50U3Ryb2tlV2lkdGggPSAyXG4gICAqL1xuICBzY2F0dGVyLnBvaW50U3Ryb2tlV2lkdGggPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBvaW50U3Ryb2tlV2lkdGggPV8sIHNjYXR0ZXIpIDogcG9pbnRTdHJva2VXaWR0aH1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBjb2xvckZ1bmN0aW9uXG4gICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjY29sb3JGdW5jdGlvbn0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgY29sb3JGdW5jdGlvbiA9IGNvbG9yRnVuY3Rpb24oKVxuICAgKi9cbiAgc2NhdHRlci5jb2xvckZ1bmN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjb2xvckZ1bmN0aW9uID1fLCBzY2F0dGVyKSA6IGNvbG9yRnVuY3Rpb259XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgYmFja2dyb3VuZEZpbGxcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciNiYWNrZ3JvdW5kRmlsbH0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgYmFja2dyb3VuZEZpbGwgPSAndHJhbnNwYXJlbnQnXG4gICAqL1xuICBzY2F0dGVyLmJhY2tncm91bmRGaWxsID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChiYWNrZ3JvdW5kRmlsbCA9Xywgc2NhdHRlcikgOiBiYWNrZ3JvdW5kRmlsbH1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBuYW1lc3BhY2VcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciNuYW1lc3BhY2V9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG5hbWVzcGFjZSA9ICdkM3NtLXNjYXR0ZXInXG4gICAqL1xuICBzY2F0dGVyLm5hbWVzcGFjZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobmFtZXNwYWNlID1fLCBzY2F0dGVyKSA6IG5hbWVzcGFjZX1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBvYmplY3RDbGFzc1xuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI29iamVjdENsYXNzfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtzY2F0dGVyIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvYmplY3RDbGFzcyA9ICd0aWNrLWdyb3VwJ1xuICAgKi9cbiAgc2NhdHRlci5vYmplY3RDbGFzcyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob2JqZWN0Q2xhc3MgPV8sIHNjYXR0ZXIpIDogb2JqZWN0Q2xhc3N9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdHJhbnNpdGlvbkR1cmF0aW9uXG4gICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjdHJhbnNpdGlvbkR1cmF0aW9ufSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtzY2F0dGVyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0cmFuc2l0aW9uRHVyYXRpb24gPSAxMDAwXG4gICAqL1xuICBzY2F0dGVyLnRyYW5zaXRpb25EdXJhdGlvbiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodHJhbnNpdGlvbkR1cmF0aW9uID1fLCBzY2F0dGVyKSA6IHRyYW5zaXRpb25EdXJhdGlvbn1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBlYXNlRnVuY1xuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI2Vhc2VGdW5jfSlcbiAgICogQHBhcmFtIHtkMy5lYXNlfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IGQzLmVhc2V9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGVhc2VGdW5jID0gZDMuZWFzZUV4cFxuICAgKi9cbiAgc2NhdHRlci5lYXNlRnVuYyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZWFzZUZ1bmMgPV8sIHNjYXR0ZXIpIDogZWFzZUZ1bmN9XG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBwb2ludEtleXNcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciNwb2ludEtleXN9KVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IHN0cmluZ1tdfVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBwb2ludEtleXMgPSB1bmRlZmluZWRcbiAgICovXG4gIHNjYXR0ZXIucG9pbnRLZXlzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwb2ludEtleXMgPV8sIHNjYXR0ZXIpIDogcG9pbnRLZXlzfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHZhbHVlc1hcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciN2YWx1ZXNYfSlcbiAgICogQHBhcmFtIHtudW1iZXJbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBudW1iZXJbXX1cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdmFsdWVzWCA9IHVuZGVmaW5lZFxuICAgKi9cbiAgc2NhdHRlci52YWx1ZXNYID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2YWx1ZXNYID1fLCBzY2F0dGVyKSA6IHZhbHVlc1h9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdmFsdWVzWVxuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI3ZhbHVlc1l9KVxuICAgKiBAcGFyYW0ge251bWJlcltdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IG51bWJlcltdfVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB2YWx1ZXNZID0gdW5kZWZpbmVkXG4gICAqL1xuICBzY2F0dGVyLnZhbHVlc1kgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZhbHVlc1kgPV8sIHNjYXR0ZXIpIDogdmFsdWVzWX1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB2YWx1ZXNSXG4gICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjdmFsdWVzUn0pXG4gICAqIEBwYXJhbSB7bnVtYmVyW119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtzY2F0dGVyIHwgbnVtYmVyW119XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHZhbHVlc1IgPSB1bmRlZmluZWRcbiAgICovXG4gIHNjYXR0ZXIudmFsdWVzUiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmFsdWVzUiA9Xywgc2NhdHRlcikgOiB2YWx1ZXNSfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRvb2x0aXBcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciN0b29sdGlwfSlcbiAgICogQHBhcmFtIHt0b29sdGlwfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IHRvb2x0aXB9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHRvb2x0aXAgPSB0b29sdGlwKClcbiAgICovXG5cbiAgc2NhdHRlci50b29sdGlwID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0b29sdGlwID1fLCBzY2F0dGVyKSA6IHRvb2x0aXB9XG5cblxuICBmdW5jdGlvbiBzY2F0dGVyKCkge1xuICAgIC8vIGJhY2tncm91bmQgY2xpcGluZyByZWN0YW5nbGVcbiAgICB2YXIgYmdjcFJlY3QgPSB7eDowLCB5OjAsIHdpZHRoOiBzcGFjZVgsIGhlaWdodDpzcGFjZVl9XG4gICAgdmFyIGNvbnRhaW5lciA9IHNldHVwQ29udGFpbmVyKCBzZWxlY3Rpb24sIG5hbWVzcGFjZSwgYmdjcFJlY3QsIGJhY2tncm91bmRGaWxsICk7XG5cblxuICAgIHBvaW50S2V5cyA9IGQzLmtleXMoZGF0YSlcbiAgICB2YWx1ZXNYID0gcG9pbnRLZXlzLm1hcCh2YWx1ZUV4dHJhY3RvclgpXG4gICAgdmFsdWVzWSA9IHBvaW50S2V5cy5tYXAodmFsdWVFeHRyYWN0b3JZKVxuICAgIHZhbHVlc1IgPSBwb2ludEtleXMubWFwKHZhbHVlRXh0cmFjdG9yUilcblxuICAgIHZhciBudW1iZXJPZk9iamVjdHMgPSBwb2ludEtleXMubGVuZ3RoXG4gICAgdmFyIGV4dGVudFggPSBbTWF0aC5taW4oLi4udmFsdWVzWCkgLSBkb21haW5QYWRkaW5nWCwgTWF0aC5tYXgoLi4udmFsdWVzWCkgKyBkb21haW5QYWRkaW5nWF1cbiAgICB2YXIgZXh0ZW50WSA9IFtNYXRoLm1pbiguLi52YWx1ZXNZKSAtIGRvbWFpblBhZGRpbmdZLCBNYXRoLm1heCguLi52YWx1ZXNZKSArIGRvbWFpblBhZGRpbmdZXVxuICAgIHZhciBleHRlbnRSID0gW01hdGgubWluKC4uLnZhbHVlc1IpIC0gZG9tYWluUGFkZGluZ1IsIE1hdGgubWF4KC4uLnZhbHVlc1IpICsgZG9tYWluUGFkZGluZ1JdXG5cbiAgICBzY2FsZVguZG9tYWluKGV4dGVudFgpLnJhbmdlKFswLCBzcGFjZVhdKVxuICAgIHNjYWxlWS5kb21haW4oZXh0ZW50WSkucmFuZ2UoW3NwYWNlWSwgMF0pXG4gICAgc2NhbGVSLmRvbWFpbihleHRlbnRSKS5yYW5nZShbbWluUmFkaXVzLCBtYXhSYWRpdXNdKVxuXG4gICAgdmFyIHBvaW50cyA9IGNvbnRhaW5lci5zZWxlY3RBbGwoJy4nK29iamVjdENsYXNzKVxuICAgIHBvaW50cyA9IHBvaW50cy5kYXRhKHBvaW50S2V5cylcbiAgICB2YXIgcEVudGVyID0gcG9pbnRzLmVudGVyKCkuYXBwZW5kKCdjaXJjbGUnKVxuICAgIC5hdHRyKCdjbGFzcycsIG9iamVjdENsYXNzKVxuICAgIC5hdHRyKCdjeCcsIDApLmF0dHIoJ2N5Jywgc3BhY2VZKS5hdHRyKCdyJywgMClcblxuICAgIHZhciBwRXhpdCA9IHBvaW50cy5leGl0KClcblxuICAgIHBvaW50cyA9IHBvaW50cy5tZXJnZShwRW50ZXIpXG5cbiAgICBwb2ludHMuZWFjaChmdW5jdGlvbihrZXksIGkpe1xuICAgICAgdmFyIHQgPSBkMy5zZWxlY3QodGhpcyksXG4gICAgICBjdXJyZW50RGF0YSA9IGRhdGFba2V5XSxcbiAgICAgIHggPSB2YWx1ZXNYW2ldLFxuICAgICAgeSA9IHZhbHVlc1lbaV0sXG4gICAgICByID0gdmFsdWVzUltpXSxcbiAgICAgIGZpbGxDb2xvciA9IGNvbG9yRnVuY3Rpb24oa2V5LCBjdXJyZW50RGF0YSwgaSwgJ2ZpbGwnKSxcbiAgICAgIHN0cm9rZUNvbG9yID0gY29sb3JGdW5jdGlvbihrZXksIGN1cnJlbnREYXRhLCBpLCAnc3Ryb2tlJylcblxuICAgICAgdC50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlKGVhc2VGdW5jKVxuICAgICAgLmF0dHIoJ2N4Jywgc2NhbGVYKHgpKVxuICAgICAgLmF0dHIoJ2N5Jywgc2NhbGVZKHkpKVxuICAgICAgLmF0dHIoJ3InLCBzY2FsZVIocikpXG4gICAgICAuYXR0cignZmlsbCcsIGZpbGxDb2xvcilcbiAgICAgIC5hdHRyKCdzdHJva2UnLCBzdHJva2VDb2xvcilcbiAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCBwb2ludFN0cm9rZVdpZHRoKVxuXG5cblxuICAgICAgdC5vbignbW91c2VvdmVyJywgZnVuY3Rpb24oZCwgaSl7XG4gICAgICAgIHBvaW50cy5zdHlsZSgnb3BhY2l0eScsIDAuMilcbiAgICAgICAgdC5zdHlsZSgnb3BhY2l0eScsIDEpXG4gICAgICAgIHQudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbi8yKS5lYXNlKGVhc2VGdW5jKVxuICAgICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgcG9pbnRTdHJva2VXaWR0aCoyKVxuICAgICAgICAuYXR0cigncicsIHNjYWxlUihyKSAqIDEuNSlcblxuICAgICAgfSlcbiAgICAgIHQubm9kZSgpLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgZnVuY3Rpb24oKXtcbiAgICAgICAgY29udGFpbmVyLnNlbGVjdEFsbCgnLicrb2JqZWN0Q2xhc3MpLnN0eWxlKCdvcGFjaXR5JywgMSlcbiAgICAgICAgdC50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uLzIpLmVhc2UoZWFzZUZ1bmMpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCBwb2ludFN0cm9rZVdpZHRoKVxuICAgICAgICAuYXR0cigncicsIHNjYWxlUihyKSlcblxuICAgICAgfSlcblxuICAgIH0pXG5cblxuXG4gICAgcEV4aXQudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuZWFzZShlYXNlRnVuYylcbiAgICAuYXR0cignY3gnLCAwKS5hdHRyKCdjeScsIHNwYWNlWSkuYXR0cigncicsIDApXG4gICAgLnJlbW92ZSgpXG5cbiAgICB0b29sdGlwLnNlbGVjdGlvbihwb2ludHMpXG4gICAgLmRhdGEoZGF0YSlcblxuICAgIHRvb2x0aXAoKVxuICB9XG5cblxuICByZXR1cm4gc2NhdHRlclxufVxuIiwiaW1wb3J0IHtoeXBlbmF0ZSwgc2FmZVNlbGVjdCwgZ2V0VHJhbnNsYXRpb259IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQge2xvZywgd2FybiwgZXJyb3IsIGluZm99IGZyb20gJy4vdXRpbHMnO1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUExPVFpPT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqXG4gKiBDcmVhdGVzIGFuIHBsb3Rab29tIGluc3RhbmNlLCB3aGljaCBjYW4gaGFuZGxlIGRyYWcgYW5kIHNjcm9sbCBldmVudHNcbiAqIEBjb25zdHJ1Y3RvciBwbG90Wm9vbVxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2hhcnQgYSBmdW5jdGlvbiBpbnN0YW5jZSBvZiBvbmUgb2YgdGhlIGQzc20gcGxvdHMgKGUuZy4gYmFyLCBib3h3aGlza2VyLCBidWJibGVIZWF0bWFwLCB2aW9saW4sIGV0YylcbiAqIEBwYXJhbSB7YXhpc30gIHhBeGlzIHRoZSBheGlzIGluc3RhbmNlIHJlc3BvbnNpYmxlIGZvciB0aGUgeCBheGlzXG4gKiBAcGFyYW0ge2F4aXN9IHlBeGlzIHRoZSBheGlzIGluc3RhbmNlIHJlc3BvbnNpYmxlIGZvciB0aGUgeSBheGlzXG4gKiBAbmFtZXNwYWNlIHBsb3Rab29tXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259IHpvb21cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBsb3Rab29tKCBjaGFydCwgeEF4aXMsIHlBeGlzICkge1xuICB2YXJcbiAgLyoqXG4gICogVGhlIGV2ZW50IG9uIHdoaWNoIHRvIGZpcmVcbiAgKiAoc2VlIHtAbGluayBwbG90Wm9vbSNldmVudFR5cGV9KVxuICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFR5cGUgd2hpY2ggZXZlbnQgaXQgc2hvdWxkIGhhbmRsZS4gQ3VycmVudGx5IHN1cHBvcnRzIHNjcm9sbCBhbmQgd2hlZWxcbiAgKiBAbWVtYmVyb2YgcGxvdFpvb20jXG4gICogQHByb3BlcnR5XG4gICovXG4gIGV2ZW50VHlwZSxcbiAgLyoqXG4gICogQSBzY2FsaW5nIGZhY3RvciBmb3IgdGhlIHdoZWVsIFwic3BlZWRcIlxuICAqIChzZWUge0BsaW5rIHBsb3Rab29tI3doZWVsU3BlZWR9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbd2hlZWxTcGVlZD0yMF0gc2NhbGVzIHRoZSB3aGVlbCB0cmFuc2xhdGlvbiBieSB3aGVlbFNwZWVkXG4gICogQG1lbWJlcm9mIHBsb3Rab29tI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB3aGVlbFNwZWVkID0gMjAsXG4gIC8qKlxuICAqIFRoZSBvcmllbnRhdGlvbiBpbiB3aGljaCB0byBhbGxvdyBzY3JvbGxpbmc6ICdob3Jpem9udGFsJywgJ3ZlcnRpY2FsJywgb3IgJzJEJ1xuICAqIChzZWUge0BsaW5rIHBsb3Rab29tI29yaWVudH0pXG4gICogQHBhcmFtIHtzdHJpbmd9IFtvcmllbnQ9Y2hhcnQub3JpZW50KCkgfHwgJ2hvcml6b250YWwnXVxuICAqIEBtZW1iZXJvZiBwbG90Wm9vbSNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb3JpZW50ID0gKGNoYXJ0Lm9yaWVudCA9PSB1bmRlZmluZWQpID8gJ2hvcml6b250YWwnIDogY2hhcnQub3JpZW50KCksXG4gIC8qKlxuICAqIFRoZSBtYXggZGlzdGFuY2UgYWxsb3dlZCB0byBzY3JvbGwgaW4gdGhlIHggZGlyZWN0aW9uXG4gICogKHNlZSB7QGxpbmsgcGxvdFpvb20jeExvY2t9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbeExvY2s9Y2hhcnQuc3BhY2VYKCldIGlkZWFsbHkgY2hhcnQub3ZlcmZsb3dRKCkgPT0gdHJ1ZSBhbmQgdGhpcyB2YWx1ZSBpcyB0aGVcbiAgKiBib3VuZGluZyByZWN0IGFjcm9zcyBhbGwgZWxlbWVudHMgaW4gdGhlIGNoYXJ0ICBtaW51cyB0aGUgc3BhY2UgaW4gd2hpY2ggdG8gc2hvdy5cbiAgKiBAbWVtYmVyb2YgcGxvdFpvb20jXG4gICogQHByb3BlcnR5XG4gICovXG4gIHhMb2NrPWNoYXJ0LnNwYWNlWCgpLFxuICAvKipcbiAgKiBUaGUgbWF4IGRpc3RhbmNlIGFsbG93ZWQgdG8gc2Nyb2xsIGluIHRoZSB5IGRpcmVjdGlvblxuICAqIChzZWUge0BsaW5rIHBsb3Rab29tI3lMb2NrfSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW3lMb2NrPWNoYXJ0LnNwYWNlWSgpXSBpZGVhbGx5IGNoYXJ0Lm92ZXJmbG93USgpID09IHRydWUgYW5kIHRoaXMgdmFsdWUgaXMgdGhlXG4gICogYm91bmRpbmcgcmVjdCBhY3Jvc3MgYWxsIGVsZW1lbnRzIGluIHRoZSBjaGFydCAgbWludXMgdGhlIHNwYWNlIGluIHdoaWNoIHRvIHNob3cuXG4gICogQG1lbWJlcm9mIHBsb3Rab29tI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB5TG9jaz1jaGFydC5zcGFjZVkoKSxcblxuICBjaGFydFNlbCA9IGNoYXJ0LnNlbGVjdGlvbigpLFxuICB4QXhpc1NlbCA9IHhBeGlzLnNlbGVjdGlvbigpLFxuICB5QXhpc1NlbCA9IHlBeGlzLnNlbGVjdGlvbigpXG5cblxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBldmVudCB0eXBlIGluIHdoaWNoIHRvIHJlc3BvbmRcbiAgICogKHNlZSB7QGxpbmsgcGxvdFpvb20jZXZlbnRUeXBlfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdIHNob3VsZCBiZSAnZHJhZycgb3IgJ3doZWVsJ1xuICAgKiBAcmV0dXJucyB7em9vbSB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIHBsb3Rab29tXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHBsb3Rab29tPXVuZGVmaW5lZFxuICAgKi9cbiAgem9vbS5ldmVudFR5cGUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGV2ZW50VHlwZSA9IF8sIHpvb20pIDogZXZlbnRUeXBlOyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSB3aGVlbCBzcGVlZCBpbiB3aGljaCB0byBzY2FsZSB0aGUgd2hlZWwgc2Nyb2xsIHRyYW5zZm9ybVxuICAgKiAoc2VlIHtAbGluayBwbG90Wm9vbSN3aGVlbFNwZWVkfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt6b29tIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgcGxvdFpvb21cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgd2hlZWxTcGVlZD0yMFxuICAgKi9cbiAgem9vbS53aGVlbFNwZWVkID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh3aGVlbFNwZWVkID0gXywgem9vbSkgOiB3aGVlbFNwZWVkOyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBvcmllbnRhdGlvbiBpbiB3aGljaCBpdGVtcyBhcmUgbWFuaXB1bGF0ZWRcbiAgICogKHNlZSB7QGxpbmsgcGxvdFpvb20jb3JpZW50fSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdIHNob3VsZCBiZSBob3Jpem9udGFsLCB2ZXJ0aWNhbCwgb3IgMkRcbiAgICogQHJldHVybnMge3pvb20gfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBwbG90Wm9vbVxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvcmllbnQ9Y2hhcnQub3JpZW50KCkgfHwgJ2hvcml6b250YWwnXG4gICAqL1xuICB6b29tLm9yaWVudCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob3JpZW50ID0gXywgem9vbSkgOiBvcmllbnQ7IH07XG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgbWF4IGRpc3RhbmNlIGluIHdoaWNoIHRvIHNjcm9sbCBYXG4gICAqIChzZWUge0BsaW5rIHBsb3Rab29tI3hMb2NrfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdIHNob3VsZCBiZSBhIHBvc2l0aXZlIHZhbHVlXG4gICAqIEByZXR1cm5zIHt6b29tIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgcGxvdFpvb21cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgeExvY2s9Y2hhcnQuc3BhY2VYKClcbiAgICovXG4gIHpvb20ueExvY2sgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHhMb2NrID0gXywgem9vbSkgOiB4TG9jazsgfTtcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgbWF4IGRpc3RhbmNlIGluIHdoaWNoIHRvIHNjcm9sbCBZXG4gICAqIChzZWUge0BsaW5rIHBsb3Rab29tI3lMb2NrfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdICBzaG91bGQgYmUgYSBwb3NpdGl2ZSB2YWx1ZVxuICAgKiBAcmV0dXJucyB7em9vbSB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHBsb3Rab29tXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHlMb2NrPWNoYXJ0LnNwYWNlWSgpXG4gICAqL1xuICB6b29tLnlMb2NrID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5TG9jayA9IF8sIHpvb20pIDogeUxvY2s7IH07XG5cblxuICBmdW5jdGlvbiBzZXRMb2NrcygpIHtcbiAgICB2YXIgY2hhcnRPYmpTZWwgPSBjaGFydFNlbC5zZWxlY3QoJy4nK2h5cGVuYXRlKGNoYXJ0Lm5hbWVzcGFjZSgpLCdvYmplY3QtY29udGFpbmVyJykpXG4gICAgdmFyIGNoYXJ0T2JqVHJhbnMgPSBnZXRUcmFuc2xhdGlvbihjaGFydE9ialNlbC5hdHRyKCd0cmFuc2Zvcm0nKSlcbiAgICB2YXIgY29zID0gY2hhcnRPYmpTZWwuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgwLDApJylcbiAgICB4TG9jayA9IGNoYXJ0U2VsLm5vZGUoKS5nZXRCQm94KCkud2lkdGggLSBjaGFydC5zcGFjZVgoKSAqIC45XG4gICAgeUxvY2sgPSBjaGFydFNlbC5ub2RlKCkuZ2V0QkJveCgpLmhlaWdodCAtIGNoYXJ0LnNwYWNlWSgpICogLjlcbiAgICBjb3MuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnK2NoYXJ0T2JqVHJhbnNbMF0rJywnK2NoYXJ0T2JqVHJhbnNbMV0rJyknKVxuICAgIGxvZygncGxvdFpvb20nLCAnc2V0TG9ja3MnLCB7eExvY2s6eExvY2ssIHlMb2NrOnlMb2NrfSlcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHggYW5kIHkgbG9ja3MgKGhvdyBmYXIgb25lIGNhbiBzY3JvbGwpXG4gICAqIChzZWUge0BsaW5rIHBsb3Rab29tI3hMb2NrfSBhbmQge0BsaW5rIHBsb3Rab29tI3lMb2NrfSlcbiAgICogQGZ1bmN0aW9uIHBsb3Rab29tLnNldExvY2tzXG4gICAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJvZiBwbG90Wm9vbVxuICAgKiBAcHJvcGVydHlcbiAgICovXG4gIHpvb20uc2V0TG9ja3MgPSBzZXRMb2Nrc1xuXG4gIGZ1bmN0aW9uIHpvb20oKSB7XG4gICAgc2V0TG9ja3MoKVxuXG4gICAgdmFyIGhvcml6b250YWxRLCB2ZXJ0aWNhbFFcbiAgICBpZiAob3JpZW50ID09ICcyRCcpIHtob3Jpem9udGFsUSA9IHRydWU7IHZlcnRpY2FsUSA9IHRydWU7fVxuICAgIGlmIChvcmllbnQgPT0gJ2hvcml6b250YWwnKSB7aG9yaXpvbnRhbFEgPSB0cnVlOyB2ZXJ0aWNhbFEgPSBmYWxzZTt9XG4gICAgaWYgKG9yaWVudCA9PSAndmVydGljYWwnKSB7dmVydGljYWxRID0gdHJ1ZTsgaG9yaXpvbnRhbFEgPSBmYWxzZTt9XG5cbiAgICAvLyBjYXB0dXJlIHRyYW5zZm9ybSBldmVudFxuICAgIHZhciB0cmFuc2Zvcm0gPSBkMy5ldmVudC50cmFuc2Zvcm1cblxuICAgIHZhciBjaGFydEJveCA9IGNoYXJ0U2VsLm5vZGUoKS5nZXRCQm94KClcbiAgICB2YXIgeEF4aXNCb3ggPSB4QXhpc1NlbC5ub2RlKCkuZ2V0QkJveCgpXG4gICAgdmFyIHlBeGlzQm94ID0geEF4aXNTZWwubm9kZSgpLmdldEJCb3goKVxuXG4gICAgdmFyIGNoYXJ0V2lkdGggPSBjaGFydEJveC53aWR0aCAtIGNoYXJ0Qm94LnhcbiAgICB2YXIgY2hhcnRIZWlnaHQgPSBjaGFydEJveC5oZWlnaHQgLSBjaGFydEJveC55XG4gICAgdmFyIHhBeGlzV2lkdGggPSB4QXhpc0JveC53aWR0aC8vIC0geEF4aXNCb3gueFxuICAgIHZhciB4QXhpc0hlaWdodCA9IHhBeGlzQm94LmhlaWdodC8vIC0geEF4aXNCb3gueVxuICAgIHZhciB5QXhpc1dpZHRoID0geUF4aXNCb3gud2lkdGgvLyAtIHlBeGlzQm94LnhcbiAgICB2YXIgeUF4aXNIZWlnaHQgPSB5QXhpc0JveC5oZWlnaHQvLyAteUF4aXNCb3gueVxuXG4gICAgLy8gZW5hYmxlIHdoZWVsIGV2ZW50XG4gICAgaWYgKGV2ZW50VHlwZSA9PSBcIndoZWVsXCIpIHtcbiAgICAgIHZhciBlID0gZDMuZXZlbnRcbiAgICAgIC8vIHByZXZlbnQgcGFnZSBzY3JvbGxpbmdcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgLy8gZXZlbnQgZGVsdGEgaXMgdmVyeSB2ZXJ5IHNsb3csIHNvIHNwZWVkIGl0IHVwIHdpdGggd2hlZWwgc3BlZWRcbiAgICAgIHZhciB3ID0gZDMuZXZlbnQuZGVsdGFZICogd2hlZWxTcGVlZFxuICAgICAgdmFyIHNoaWZ0USA9IGQzLmV2ZW50LnNoaWZ0S2V5XG5cbiAgICAgIC8vIGQzIGhhcyBubyB3YXkgdG8gbWFrZSBjdXN0b20gdHJhbnNmb3JtLCBzbyBtYWtlIGFuIG9iamVjdCBhbmQgYWRkXG4gICAgICAvLyB0aGUgbmVjZXNzYXJ5IGZ1bmN0aW9ucyB0byBtYWtlIHdoZWVsIGV2ZW50IGNvbXBhdGlibGUgd2l0aCBkcmFnIGV2ZW50c1xuICAgICAgaWYgKG9yaWVudCA9PSAnMkQnKSB7XG4gICAgICAgIHRyYW5zZm9ybSA9IHNoaWZ0USA/IHtrOiAxLCB4OiB3LCB5OiAwfSA6IHtrOiAxLCB4OiAwLCB5OiB3fVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJhbnNmb3JtID0gaG9yaXpvbnRhbFEgPyB7azogMSwgeDogdywgeTogMH0gOiB7azogMSwgeDogMCwgeTogd31cbiAgICAgIH1cbiAgICAgIHRyYW5zZm9ybS5hcHBseVggPSBmdW5jdGlvbih4KSB7IHJldHVybiB4ICogdGhpcy5rICsgdGhpcy54OyB9XG4gICAgICB0cmFuc2Zvcm0uYXBwbHlZID0gIGZ1bmN0aW9uKHkpIHsgcmV0dXJuIHkgKiB0aGlzLmsgKyB0aGlzLnk7IH1cbiAgICB9XG5cblxuXG4gICAgdmFyIGNoYXJ0T2JqU2VsID0gY2hhcnRTZWwuc2VsZWN0KCcuJytoeXBlbmF0ZShjaGFydC5uYW1lc3BhY2UoKSwnb2JqZWN0LWNvbnRhaW5lcicpKVxuICAgIHZhciB4QXhpc09ialNlbCA9IHhBeGlzU2VsLnNlbGVjdCgnLicraHlwZW5hdGUoeEF4aXMubmFtZXNwYWNlKCksJ29iamVjdC1jb250YWluZXInKSlcbiAgICB2YXIgeUF4aXNPYmpTZWwgPSB5QXhpc1NlbC5zZWxlY3QoJy4nK2h5cGVuYXRlKHlBeGlzLm5hbWVzcGFjZSgpLCdvYmplY3QtY29udGFpbmVyJykpXG5cbiAgICAvLyB4TG9jayA9IGNoYXJ0U2VsLm5vZGUoKS5nZXRCQm94KCkud2lkdGggLSBjaGFydC5zcGFjZVgoKSAtIGNoYXJ0U2VsLm5vZGUoKS5nZXRCQm94KCkueFxuICAgIC8vIHlMb2NrID0gY2hhcnRTZWwubm9kZSgpLmdldEJCb3goKS5oZWlnaHQgLSBjaGFydC5zcGFjZVkoKVxuICAgIC8vIGNvbnNvbGUudGFibGUoeyd4TG9jayc6eExvY2ssIFwieUxvY2tcIjp5TG9ja30pXG4gICAgLy8gYmhtLnNlbGVjdGlvbigpLm5vZGUoKS5nZXRCQm94KCkud2lkdGggLSBiaG0uc3BhY2VYKClcblxuXG4gICAgdmFyIGNoYXJ0T2JqVHJhbnMgPSBnZXRUcmFuc2xhdGlvbihjaGFydE9ialNlbC5hdHRyKCd0cmFuc2Zvcm0nKSlcbiAgICB2YXIgeEF4aXNPYmpUcmFucyA9IGdldFRyYW5zbGF0aW9uKHhBeGlzT2JqU2VsLmF0dHIoJ3RyYW5zZm9ybScpKVxuICAgIHZhciB5QXhpc09ialRyYW5zID0gZ2V0VHJhbnNsYXRpb24oeUF4aXNPYmpTZWwuYXR0cigndHJhbnNmb3JtJykpXG5cblxuICAgIHZhciB4ID0gaG9yaXpvbnRhbFEgPyB0cmFuc2Zvcm0uYXBwbHlYKGNoYXJ0T2JqVHJhbnNbMF0pIDogMFxuICAgIGlmIChob3Jpem9udGFsUSkge3ggPSB4IDwgLXhMb2NrID8gKHRyYW5zZm9ybS54ID0gMCwgLXhMb2NrKSA6ICh0cmFuc2Zvcm0ueCA9IDAsIE1hdGgubWluKHgsIDApKSB9XG5cbiAgICB2YXIgeSA9IHZlcnRpY2FsUSA/IHRyYW5zZm9ybS5hcHBseVkoY2hhcnRPYmpUcmFuc1sxXSkgOiAwXG4gICAgaWYgKHZlcnRpY2FsUSkge3kgPSB5IDwgLXlMb2NrID8gKHRyYW5zZm9ybS55ID0gMCwgLXlMb2NrKTogKHRyYW5zZm9ybS55ID0gMCwgTWF0aC5taW4oeSwgMCkpfVxuXG4gICAgY2hhcnRPYmpTZWwuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnK3grJywnK3krJyknKVxuICAgIGlmIChob3Jpem9udGFsUSkgeyB4QXhpc09ialNlbC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcreCsnLCcrMCsnKScpIH1cbiAgICBpZiAodmVydGljYWxRKSB7IHlBeGlzT2JqU2VsLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyswKycsJyt5KycpJykgfVxuXG4gIH1cblxuICB6b29tLnJlc2V0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGhvcml6b250YWxRLCB2ZXJ0aWNhbFFcbiAgICBpZiAob3JpZW50ID09ICcyRCcpIHtob3Jpem9udGFsUSA9IHRydWU7IHZlcnRpY2FsUSA9IHRydWU7fVxuICAgIGlmIChvcmllbnQgPT0gJ2hvcml6b250YWwnKSB7aG9yaXpvbnRhbFEgPSB0cnVlOyB2ZXJ0aWNhbFEgPSBmYWxzZTt9XG4gICAgaWYgKG9yaWVudCA9PSAndmVydGljYWwnKSB7dmVydGljYWxRID0gdHJ1ZTsgaG9yaXpvbnRhbFEgPSBmYWxzZTt9XG5cbiAgICB2YXIgY2hhcnRPYmpTZWwgPSBjaGFydFNlbC5zZWxlY3QoJy4nK2h5cGVuYXRlKGNoYXJ0Lm5hbWVzcGFjZSgpLCdvYmplY3QtY29udGFpbmVyJykpXG4gICAgdmFyIHhBeGlzT2JqU2VsID0geEF4aXNTZWwuc2VsZWN0KCcuJytoeXBlbmF0ZSh4QXhpcy5uYW1lc3BhY2UoKSwnb2JqZWN0LWNvbnRhaW5lcicpKVxuICAgIHZhciB5QXhpc09ialNlbCA9IHlBeGlzU2VsLnNlbGVjdCgnLicraHlwZW5hdGUoeUF4aXMubmFtZXNwYWNlKCksJ29iamVjdC1jb250YWluZXInKSlcbiAgICBjaGFydE9ialNlbC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcrMCsnLCcrMCsnKScpXG4gICAgeEF4aXNPYmpTZWwuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnKzArJywnKzArJyknKVxuICAgIHlBeGlzT2JqU2VsLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyswKycsJyswKycpJylcbiAgfVxuXG4gIHJldHVybiB6b29tXG59XG4iLCJpbXBvcnQge2h5cGVuYXRlLCBzYWZlU2VsZWN0LCBtb2RpZnlIZXhpZGVjaW1hbENvbG9yTHVtaW5hbmNlLCBleHRyYWN0VmlvbGluVmFsdWVzLCBxdWFydGlsZXN9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQge3NldHVwQ29udGFpbmVyLCBjYWxjdWxhdGVXaWR0aE9mT2JqZWN0LCBjYWxjdWxhdGVXaWR0aE9mU3BhY2VyfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7dW5pcXVlLCBoYXNRLCBmbGF0dGVuLCB3aGljaEJpbn0gZnJvbSAnLi9hcnJheS1mdW5jdGlvbnMnO1xuaW1wb3J0IHtncm91cGluZ1NwYWNlcn0gZnJvbSAnLi9ncm91cGluZy1zcGFjZXInO1xuaW1wb3J0IHtjb2xvckZ1bmN0aW9uIGFzIENGfSBmcm9tICcuL2NvbG9yLWZ1bmN0aW9uJztcbmltcG9ydCB7dG9vbHRpcCBhcyBUVGlwfSBmcm9tICcuL3Rvb2x0aXAnO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZJT0xJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vKipcbiAqIENyZWF0ZXMgYSB2aW9saW5cbiAqXG4gKiB7QGxpbmsgaHR0cHM6Ly9zdW1uZXVyb24uZ2l0bGFiLmlvL2Qzc20vZGVtb3MvYmFzaWMtdmlvbGlucy9pbmRleC5odG1sIERlbW99XG4gKiBAY29uc3RydWN0b3IgdmlvbGluXG4gKiBAcGFyYW0ge2QzLnNlbGVjdGlvbn0gc2VsZWN0aW9uXG4gKiBAbmFtZXNwYWNlIHZpb2xpblxuICogQHJldHVybnMge2Z1bmN0aW9ufSB2aW9saW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZpb2xpbiggc2VsZWN0aW9uICkge1xuICB2YXJcbiAgLyoqXG4gICogRGF0YSB0byBwbG90LiBBc3N1bWVkIHRvIGJlIGEgb2JqZWN0LCB3aGVyZSBlYWNoIGtleSBjb3JyZXNwb25kcyB0byBhIHZpb2xpblxuICAqIChzZWUge0BsaW5rIGJhciNkYXRhfSlcbiAgKiBAcGFyYW0ge09iamVjdH0gW2RhdGE9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGRhdGEsXG4gIC8qKlxuICAqIFdoaWNoIGRpcmVjdGlvbiB0byByZW5kZXIgdGhlIGJhcnMgaW5cbiAgKiAoc2VlIHtAbGluayBiYXIjb3JpZW50fSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW29yaWVudD0naG9yaXpvbnRhbCddXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb3JpZW50PSdob3Jpem9udGFsJyxcbiAgLyoqXG4gICogQW1vdW50IG9mIGhvcml6b250YWwgc3BhY2UgKGluIHBpeGVscykgYXZhaWJsZSB0byByZW5kZXIgdGhlIGJhciBpblxuICAqIChzZWUge0BsaW5rIGJhciNzcGFjZVh9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbc3BhY2VYPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzcGFjZVgsXG4gIC8qKlxuICAqIEFtb3VudCBvZiB2ZXJ0aWNhbCBzcGFjZSAoaW4gcGl4ZWxzKSBhdmFpYmxlIHRvIHJlbmRlciB0aGUgYmFyIGluXG4gICogKHNlZSB7QGxpbmsgYmFyLnNwYWNlWX0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZVk9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNwYWNlWSxcbiAgLyoqXG4gICogV2hldGhlciBvciBub3QgdG8gYWxsb3cgYmFyIHRvIHJlbmRlciBlbGVtZW50cyBwYXNzIHRoZSBtYWluIHNwYXRpYWwgZGltZW5zaW9uXG4gICogZ2l2ZW4gdGhlIG9yaWVudGF0aW9uIChzZWUge0BsaW5rIGJhciNvcmllbnR9KSwgd2hlcmUge0BsaW5rIGJhciNvcmllbnR9PVwiaG9yaXpvbnRhbFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBiYXIjc3BhY2VYfSBhbmQgd2hlcmUge0BsaW5rIGJhciNvcmllbnR9PVwidmVydGljYWxcIlxuICAqIHRoZSBtYWluIGRpbWVuc2lvbiBpcyB7QGxpbmsgYmFyI3NwYWNlWX1cbiAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvdmVyZmxvd1E9ZmFsc2VdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb3ZlcmZsb3dRID0gdHJ1ZSxcbiAgLyoqXG4gICogV2hldGhlciBvciBub3QgdG8gZGlzcGxheSBwb2ludHMgaW5zaWRlIHRoZSBwb2ludHNcbiAgKiBAcGFyYW0ge2Jvb2xlYW59IFtwb2ludHNRPWZhbHNlXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHBvaW50c1EgPSB0cnVlLFxuICAvKipcbiAgKiBBbiBhcnJheSAtIHB1dGF0aXZlbHkgb2Ygb3RoZXIgYXJyYXlzIC0gZGVwaWN0aW5nIGhvdyBiYXJzIHNob3VsZCBiZSBhcnJhbmdlZFxuICAqIEBwYXJhbSB7QXJyYXlbXX0gW2dyb3VwaW5nPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBncm91cGluZyxcbiAgLyoqXG4gICogSG93IHRvIGdldCB0aGUgdmFsdWUgb2YgdGhlIGJhclxuICAqIEBwYXJhbSB7ZnVuY3Rpb259IFt2YWx1ZUV4dHJhY3Rvcj1mdW5jdGlvbihrZXksIGluZGV4KSB7IHJldHVybiBkYXRhW2tleV0gfV1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB2YWx1ZUV4dHJhY3RvciA9IGZ1bmN0aW9uKGtleSwgaW5kZXgpIHtyZXR1cm4gZGF0YVtrZXldIH0sXG4gIC8qKlxuICAqIEhvdyB0byBzb3J0IHRoZSBiYXJzIC0gaWYge0BsaW5rIGJhciNncm91cGluZ30gaXMgbm90IHByb3ZpZGVkLlxuICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtzb3J0aW5nRnVuY3Rpb249ZnVuY3Rpb24oa2V5QSwga2V5Qikge3JldHVybiBkMy5kZXNjZW5kaW5nKGRhdGFba2V5QV0sIGRhdGFba2V5Ql0pfV1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzb3J0aW5nRnVuY3Rpb24gPSBmdW5jdGlvbihrZXlBLCBrZXlCKSB7cmV0dXJuIGQzLmRlc2NlbmRpbmcoZGF0YVtrZXlBXSwgZGF0YVtrZXlCXSl9LFxuXG4gIC8qKlxuICAqIFRoZSBzY2FsZSBmb3Igd2hpY2ggYmFyIHZhbHVlcyBzaG91bGQgYmUgdHJhbnNmb3JtZWQgYnlcbiAgKiBAcGFyYW0ge2QzLnNjYWxlfSBbc2NhbGU9ZDMuc2NhbGVMaW5lYXJdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc2NhbGUgPSBkMy5zY2FsZUxpbmVhcigpLFxuICAvKipcbiAgKiBUaGUgcGFkZGluZyBmb3IgdGhlIGRvbWFpbiBvZiB0aGUgc2NhbGUgKHNlZSB7QGxpbmsgYmFyI3NjYWxlfSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW2RvbWFpblBhZGRpbmc9MC41XVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGRvbWFpblBhZGRpbmcgPSAwLjUsXG4gIC8qKlxuICAqIERlZmF1bHQgc3BhY2UgZm9yIHRoZSBzcGFjZXIgKHBlcmNlbnRhZ2UpIG9mIG1haW4gZGltZW5zaW9uIGdpdmVuIHRoZSBvcmllbnRhdGlvblxuICAqIChzZWUge0BsaW5rIGJhciNvcmllbnR9KSwgd2hlcmUge0BsaW5rIGJhciNvcmllbnR9PVwiaG9yaXpvbnRhbFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBiYXIjc3BhY2VYfSBhbmQgd2hlcmUge0BsaW5rIGJhciNvcmllbnR9PVwidmVydGljYWxcIlxuICAqIHRoZSBtYWluIGRpbWVuc2lvbiBpcyB7QGxpbmsgYmFyI3NwYWNlWX0gYmV0d2VlbiBiYXJzXG4gICogQHBhcmFtIHtudW1iZXJ9IFtvYmplY3RTcGFjZXI9MC4wNV1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBvYmplY3RTcGFjZXIgPSAwLjA1LFxuICAvKipcbiAgKiBUaGUgbWluaW11bSBzaXplIHRoYXQgYW4gb2JqZWN0IGNhbiBiZVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbbWluT2JqZWN0U2l6ZT01MF1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBtaW5PYmplY3RTaXplID0gNTAsXG4gIC8qKlxuICAqIFRoZSBtYXhpbXVtIHNpemUgdGhhdCBhbiBvYmplY3QgY2FuIGJlXG4gICogQHBhcmFtIHtudW1iZXJ9IFttYXhPYmplY3RTaXplPTEwMF1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBtYXhPYmplY3RTaXplID0gMTAwLFxuXG4gIC8qKlxuICAqIFRoZSBzdHJva2Ugd2lkdGggb2YgdGhlIGJhcnNcbiAgKiBAcGFyYW0ge251bWJlcn0gW2JhclN0cm9rZVdpZHRoPTJdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb2JqZWN0U3Ryb2tlV2lkdGggPSAyLFxuICAvKipcbiAgKiBJbnN0YW5jZSBvZiBDb2xvckZ1bmN0aW9uXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW2NvbG9yRnVuY3Rpb24gPSBjb2xvckZ1bmN0aW9uKCldXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgY29sb3JGdW5jdGlvbiA9IENGKCksXG4gIC8qKlxuICAqIEluc3RhbmNlIG9mIENvbG9yRnVuY3Rpb24gbW9kaWZpZWQgYnkgYSBzY2FsZSBmb3IgdGhlIHBvaW50c1xuICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtwb2ludENvbG9yRnVuYyA9IGNvbG9yRnVuY3Rpb24oKV1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBwb2ludENvbG9yRnVuYyA9IGZ1bmN0aW9uIChkLCB0eXBlLCBiYXNlLCBtaW4sIG1heCkge1xuICAgIHZhciBtaW5NYXhIZXhTY2FsZSA9IGQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFttYXgsIG1pbl0pLnJhbmdlKFstMC4yNSwgMC4yNV0pXG4gICAgdmFyIHNjYWxlZENvbG9yID0gbW9kaWZ5SGV4aWRlY2ltYWxDb2xvckx1bWluYW5jZShiYXNlLnJlcGxhY2UoJyMnLCAnJyksIG1pbk1heEhleFNjYWxlKGQpKVxuICAgIHZhciBtb2QgPSB0eXBlID09IFwic3Ryb2tlXCIgPyAwIDogMC4yNVxuICAgIHJldHVybiBtb2RpZnlIZXhpZGVjaW1hbENvbG9yTHVtaW5hbmNlKHNjYWxlZENvbG9yLnJlcGxhY2UoJyMnLCAnJyksIG1vZClcbiAgfSxcblxuICAvKipcbiAgKiBUaGUgcmFkaXVzIG9mIGEgcG9pbnRcbiAgKiBAcGFyYW0ge251bWJlcn0gW3BvaW50UmFkaXVzPTNdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgcG9pbnRSYWRpdXMgPSAzLFxuICAvKipcbiAgKiBUaGUgc3Ryb2tlIHdpZHRoIG9mIHRoZSBvaW50c1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbcG9pbnRTdHJva2VXaWR0aD0yXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHBvaW50U3Ryb2tlV2lkdGggPSAyLFxuXG4gIC8qKlxuICAqIENvbG9yIG9mIHRoZSBiYWNrZ3JvdW5kXG4gICogQHBhcmFtIHtzdHJpbmd9IFtiYWNrZ3JvdW5kRmlsbD1cInRyYW5zcGFyZW50XCJdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgYmFja2dyb3VuZEZpbGwgPSAndHJhbnNwYXJlbnQnLFxuICAvKipcbiAgKiBOYW1lc3BhY2UgZm9yIGFsbCBpdGVtcyBtYWRlIGJ5IHRoaXMgaW5zdGFuY2Ugb2YgYmFyXG4gICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lc3BhY2U9XCJkM3NtLXZpb2xpblwiXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG5hbWVzcGFjZSA9ICdkM3NtLXZpb2xpbicsXG4gIC8qKlxuICAqIENsYXNzIG5hbWUgZm9yIGJhciBjb250YWluZXIgKDxnPiBlbGVtZW50KVxuICAqIEBwYXJhbSB7c3RyaW5nfSBbb2JqZWN0Q2xhc3M9XCJ2aW9saW5cIl1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBvYmplY3RDbGFzcyA9ICd2aW9saW4nLFxuICAvKipcbiAgKiBEdXJhdGlvbiBvZiBhbGwgdHJhbnNpdGlvbnMgb2YgdGhpcyBlbGVtZW50XG4gICogQHBhcmFtIHtudW1iZXJ9IFt0cmFuc2l0aW9uRHVyYXRpb249MTAwMF1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB0cmFuc2l0aW9uRHVyYXRpb24gPSAxMDAwLFxuICAvKipcbiAgKiBFYXNpbmcgZnVuY3Rpb24gZm9yIHRyYW5zaXRpb25zXG4gICogQHBhcmFtIHtkMy5lYXNlfSBbZWFzZUZ1bmM9ZDMuZWFzZUV4cF1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBlYXNlRnVuYyA9IGQzLmVhc2VFeHAsXG5cbiAgLyoqXG4gICogVGhlIGtleSBjb250YWluaW5nIHRoZSBxdWFydGlsZXNcbiAgKiBAcGFyYW0ge3N0cmluZ30gW3F1YXJ0aWxlc0tleT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgcXVhcnRpbGVzS2V5ID0gXCJxdWFydGlsZXNcIixcbiAgLyoqXG4gICogVGhlIGtleXMgY29ycmVzcG9uZGluZyB0byBlYWNoIHF1YXJ0aWxlXG4gICogQHBhcmFtIHtzdHJpbmdbXX0gW3F1YXJ0aWxlS2V5cz1bXCJRMFwiLCBcIlExXCIsIFwiUTJcIiwgXCJRM1wiLCBcIlE0XCJdXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHF1YXJ0aWxlS2V5cyA9IFtcIlEwXCIsIFwiUTFcIiwgXCJRMlwiLCBcIlEzXCIsIFwiUTRcIl0sXG5cbiAgLyoqXG4gICogVGhlIGtleXMgb2YgdGhlIGJhcnNcbiAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbdmlvbGluS2V5cz11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdmlvbGluS2V5cyxcbiAgLyoqXG4gICogVGhlIHZhbHVlcyBvZiB0aGUgYmFyc1xuICAqIEBwYXJhbSB7bnVtYmVyW119IFt2aW9saW5WYWx1ZXM9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHZpb2xpblZhbHVlcyxcbiAgLyoqXG4gICogVGhlIG9iamVjdFNpemUgKGFjdHVhbCB3aWR0aCkgdXNlZCBieSB0aGUgYmFyc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbb2JqZWN0U2l6ZT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb2JqZWN0U2l6ZSxcbiAgLyoqXG4gICogVGhlIHNwYWNlclNpemUgKGFjdHVhbCB3aWR0aCkgdXNlZCBieSB0aGUgc3BhY2VycyBiZXR3ZWVuIHRoZSBiYXJzXG4gICogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZXJTaXplPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzcGFjZXJTaXplLFxuXG4gIC8qKlxuICAqIEluc3RhbmNlIG9mIFRvb2x0aXBcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbdG9vbHRpcD10b29sdGlwKCldXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdG9vbHRpcCA9IFRUaXAoKS5rZXlzKFtxdWFydGlsZUtleXNbNF0sIHF1YXJ0aWxlS2V5c1szXSwgcXVhcnRpbGVLZXlzWzJdLCBxdWFydGlsZUtleXNbMV0sIHF1YXJ0aWxlS2V5c1swXV0pLFxuICBwb2ludHNUb29sdGlwID0gVFRpcCgpLFxuICBwb2ludEtleUV4dHJhY3RvciA9IGZ1bmN0aW9uKHZpb2xpbktleSwgdmlvbGluRGF0YSwgdmlvbGluVmFsdWVzKSB7cmV0dXJuIGQzLmtleXModmlvbGluVmFsdWVzW3Zpb2xpbktleV0udmFsdWVzKX0sXG4gIHBvaW50VmFsdWVFeHRyYWN0b3IgPSBmdW5jdGlvbihwb2ludEtleSwgdmlvbGluS2V5LCB2aW9saW5EYXRhLCB2aW9saW5WYWx1ZXMpIHtyZXR1cm4gdmlvbGluVmFsdWVzW3Zpb2xpbktleV0udmFsdWVzW3BvaW50S2V5XX1cblxuICAvLyxcbiAgLy8gcG9pbnRzVG9vbHRpcCA9IFRUaXAoKVxuXG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgc2VsZWN0aW9uIGluIHdoaWNoIGl0ZW1zIGFyZSBtYW5pcHVsYXRlZFxuICAgKiBAcGFyYW0ge2QzLnNlbGVjdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IGQzLnNlbGVjdGlvbn1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzZWxlY3Rpb24gPSBzZWxlY3Rpb25cbiAgICovXG4gIHZpb2xpbi5zZWxlY3Rpb24gPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNlbGVjdGlvbiA9IF8sIHZpb2xpbikgOiBzZWxlY3Rpb247IH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGRhdGFcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI2RhdGF9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IG9iamVjdH1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICovXG4gIHZpb2xpbi5kYXRhID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkYXRhID0gXywgdmlvbGluKSA6IGRhdGE7IH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIG9yaWVudCBvZiB0aGUgYm94ZXNcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI29yaWVudH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgb2JqZWN0fVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKi9cbiAgdmlvbGluLm9yaWVudCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob3JpZW50ID0gXywgdmlvbGluKSA6IG9yaWVudDsgfTtcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgYW1vdW50IG9mIGhvcml6b250YWwgc3BhY2UgaW4gd2hpY2ggaXRlbXMgYXJlIG1hbmlwdWxhdGVkXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNzcGFjZVh9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV0gc2hvdWxkIGJlIGEgbnVtYmVyID4gMFxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNwYWNlWCA9IHVuZGVmaW5lZFxuICAgKi9cbiAgdmlvbGluLnNwYWNlWCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3BhY2VYID0gXywgdmlvbGluKSA6IHNwYWNlWDsgfTtcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgYW1vdW50IG9mIHZlcnRpY2FsIHNwYWNlIGluIHdoaWNoIGl0ZW1zIGFyZSBtYW5pcHVsYXRlZFxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jc3BhY2VZfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdIHNob3VsZCBiZSBhIG51bWJlciA+IDBcbiAgICogQHJldHVybnMge3Zpb2xpbiB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzcGFjZVkgPSB1bmRlZmluZWRcbiAgICovXG4gIHZpb2xpbi5zcGFjZVkgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNwYWNlWSA9IF8sIHZpb2xpbikgOiBzcGFjZVk7IH07XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgd2hldGhlciBvciBub3QgdmlvbGluIGlzIGFsbG93ZWQgdG8gZ28gYmV5b25kIHNwZWNpZmllZCBkaW1lbnNpb25zXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNvdmVyZmxvd1F9KVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBib29sZWFufVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG92ZXJmbG93USA9IGZhbHNlXG4gICAqL1xuICB2aW9saW4ub3ZlcmZsb3dRID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvdmVyZmxvd1EgPSBfLCB2aW9saW4pIDogb3ZlcmZsb3dROyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgd2hldGhlciBvciBub3QgdG8gcGxvdCBwb2ludHMgd2l0aCB0aGUgdmlvbGluc1xuICAgKiAoc2VlIHtAbGluayB2aW9saW4jcG9pbnRzUX0pXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IGJvb2xlYW59XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgcG9pbnRzUSA9IGZhbHNlXG4gICAqL1xuICB2aW9saW4ucG9pbnRzUSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocG9pbnRzUSA9IF8sIHZpb2xpbikgOiBwb2ludHNROyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBncm91cGluZyBvZiB0aGUgYm94ZXNcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI2dyb3VwaW5nfSlcbiAgICogQHBhcmFtIHtBcnJheVtdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgQXJyYXlbXX1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBncm91cGluZyA9IHVuZGVmaW5lZFxuICAgKi9cbiAgdmlvbGluLmdyb3VwaW5nID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChncm91cGluZyA9IF8sIHZpb2xpbikgOiBncm91cGluZzsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB2YWx1ZUV4dHJhY3RvclxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jdmFsdWVFeHRyYWN0b3J9KVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgZnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqL1xuICB2aW9saW4udmFsdWVFeHRyYWN0b3IgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZhbHVlRXh0cmFjdG9yID0gXywgdmlvbGluKSA6IHZhbHVlRXh0cmFjdG9yOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNvcnRpbmdGdW5jdGlvblxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jc29ydGluZ0Z1bmN0aW9ufSlcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IGZ1bmN0aW9ufVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKi9cbiAgdmlvbGluLnNvcnRpbmdGdW5jdGlvbiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc29ydGluZ0Z1bmN0aW9uID0gXywgdmlvbGluKSA6IHNvcnRpbmdGdW5jdGlvbjsgfTtcblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNjYWxlIGZvciB3aGljaCB0aGUgdmlvbGluIHZhbHVlcyBzaG91bGQgYmUgdHJhbnNmb3JtZWQgYnlcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI3NjYWxlfSlcbiAgICogQHBhcmFtIHtkMy5zY2FsZX0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IGQzLnNjYWxlfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKVxuICAgKi9cbiAgdmlvbGluLnNjYWxlID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzY2FsZSA9IF8sIHZpb2xpbikgOiBzY2FsZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBwYWRkaW5nIGZvciB0aGUgZG9tYWluIG9mIHRoZSBzY2FsZVxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jZG9tYWluUGFkZGluZ30pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGRvbWFpblBhZGRpbmcgPSAwLjVcbiAgICovXG4gIHZpb2xpbi5kb21haW5QYWRkaW5nID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkb21haW5QYWRkaW5nID0gXywgdmlvbGluKSA6IGRvbWFpblBhZGRpbmc7IH07XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgb2JqZWN0U3BhY2VyXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNvYmplY3RTcGFjZXJ9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvYmplY3RTcGFjZXIgPSAwLjA1XG4gICAqL1xuICB2aW9saW4ub2JqZWN0U3BhY2VyID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvYmplY3RTcGFjZXIgPSBfLCB2aW9saW4pIDogb2JqZWN0U3BhY2VyOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG1pbk9iamVjdFNpemVcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI21pbk9iamVjdFNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBtaW5PYmplY3RTaXplID0gMTVcbiAgICovXG4gIHZpb2xpbi5taW5PYmplY3RTaXplID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChtaW5PYmplY3RTaXplID0gXywgdmlvbGluKSA6IG1pbk9iamVjdFNpemU7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbWF4T2JqZWN0U2l6ZVxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jbWF4T2JqZWN0U2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG1heE9iamVjdFNpemUgPSA1MFxuICAgKi9cbiAgdmlvbGluLm1heE9iamVjdFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG1heE9iamVjdFNpemUgPSBfLCB2aW9saW4pIDogbWF4T2JqZWN0U2l6ZTsgfTtcblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG9iamVjdFN0cm9rZVdpZHRoXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNvYmplY3RTdHJva2VXaWR0aH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG9iamVjdFN0cm9rZVdpZHRoID0gMlxuICAgKi9cbiAgdmlvbGluLm9iamVjdFN0cm9rZVdpZHRoID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvYmplY3RTdHJva2VXaWR0aCA9IF8sIHZpb2xpbikgOiBvYmplY3RTdHJva2VXaWR0aDsgfTtcblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgY29sb3JGdW5jdGlvblxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jY29sb3JGdW5jdGlvbn0pXG4gICAqIEBwYXJhbSB7Y29sb3JGdW5jdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IGNvbG9yRnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgY29sb3JGdW5jdGlvbiA9IGNvbG9yRnVuY3Rpb24oKVxuICAgKi9cbiAgdmlvbGluLmNvbG9yRnVuY3Rpb24gPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNvbG9yRnVuY3Rpb24gPSBfLCB2aW9saW4pIDogY29sb3JGdW5jdGlvbjsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBjb2xvckZ1bmN0aW9uXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNjb2xvckZ1bmN0aW9ufSlcbiAgICogQHBhcmFtIHtjb2xvckZ1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgY29sb3JGdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBjb2xvckZ1bmN0aW9uID0gY29sb3JGdW5jdGlvbigpXG4gICAqL1xuICB2aW9saW4ucG9pbnRDb2xvckZ1bmMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBvaW50Q29sb3JGdW5jID0gXywgdmlvbGluKSA6IHBvaW50Q29sb3JGdW5jOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBwb2ludFJhZGl1c1xuICAgKiAoc2VlIHtAbGluayB2aW9saW4jcG9pbnRSYWRpdXN9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBwb2ludFJhZGl1cyA9IDJcbiAgICovXG4gIHZpb2xpbi5wb2ludFJhZGl1cyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocG9pbnRSYWRpdXMgPSBfLCB2aW9saW4pIDogcG9pbnRSYWRpdXM7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgcG9pbnRTdHJva2VXaWR0aFxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jcG9pbnRTdHJva2VXaWR0aH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHBvaW50U3Ryb2tlV2lkdGggPSAyXG4gICAqL1xuICB2aW9saW4ucG9pbnRTdHJva2VXaWR0aCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocG9pbnRTdHJva2VXaWR0aCA9IF8sIHZpb2xpbikgOiBwb2ludFN0cm9rZVdpZHRoOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBiYWNrZ3JvdW5kRmlsbFxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jYmFja2dyb3VuZEZpbGx9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBiYWNrZ3JvdW5kRmlsbCA9ICd0cmFuc3BhcmVudCdcbiAgICovXG4gIHZpb2xpbi5iYWNrZ3JvdW5kRmlsbCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYmFja2dyb3VuZEZpbGwgPSBfLCB2aW9saW4pIDogYmFja2dyb3VuZEZpbGw7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbmFtZXNwYWNlXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNuYW1lc3BhY2V9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBuYW1lc3BhY2UgPSAnZDNzbS12aW9saW4nXG4gICAqL1xuICB2aW9saW4ubmFtZXNwYWNlID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChuYW1lc3BhY2UgPSBfLCB2aW9saW4pIDogbmFtZXNwYWNlOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG9iamVjdENsYXNzXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNvYmplY3RDbGFzc30pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG9iamVjdENsYXNzID0gJ3RpY2stZ3JvdXAnXG4gICAqL1xuICB2aW9saW4ub2JqZWN0Q2xhc3MgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9iamVjdENsYXNzID0gXywgdmlvbGluKSA6IG9iamVjdENsYXNzOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB0cmFuc2l0aW9uRHVyYXRpb25cbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI3RyYW5zaXRpb25EdXJhdGlvbn0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHRyYW5zaXRpb25EdXJhdGlvbiA9IDEwMDBcbiAgICovXG4gIHZpb2xpbi50cmFuc2l0aW9uRHVyYXRpb24gPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRyYW5zaXRpb25EdXJhdGlvbiA9IF8sIHZpb2xpbikgOiB0cmFuc2l0aW9uRHVyYXRpb247IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgZWFzZUZ1bmNcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI2Vhc2VGdW5jfSlcbiAgICogQHBhcmFtIHtkMy5lYXNlfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgZDMuZWFzZX1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBlYXNlRnVuYyA9IGQzLmVhc2VFeHBcbiAgICovXG4gIHZpb2xpbi5lYXNlRnVuYyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZWFzZUZ1bmMgPSBfLCB2aW9saW4pIDogZWFzZUZ1bmM7IH07XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHF1YXJ0aWxlS2V5XG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNxdWFydGlsZUtleX0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHF1YXJ0aWxlS2V5ID0gXCJxdWFydGlsZXNcIlxuICAgKi9cbiAgdmlvbGluLnF1YXJ0aWxlS2V5ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChxdWFydGlsZUtleSA9IF8sIHZpb2xpbikgOiBxdWFydGlsZUtleTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBxdWFydGlsZUtleXNcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI3F1YXJ0aWxlS2V5c30pXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBzdHJpbmdbXX1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBxdWFydGlsZUtleXMgPSBbXCJRMFwiLFwiUTFcIixcIlEyXCIsXCJRM1wiLFwiUTRcIl1cbiAgICovXG4gIHZpb2xpbi5xdWFydGlsZUtleXMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHF1YXJ0aWxlS2V5cyA9IF8sIHZpb2xpbikgOiBxdWFydGlsZUtleXM7IH07XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHZpb2xpbktleXNcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI3Zpb2xpbktleXN9KVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgc3RyaW5nW119XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdmlvbGluS2V5cyA9IHVuZGVmaW5lZFxuICAgKi9cbiAgdmlvbGluLnZpb2xpbktleXMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZpb2xpbktleXMgPSBfLCB2aW9saW4pIDogdmlvbGluS2V5czsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB2aW9saW5WYWx1ZXNcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI3Zpb2xpblZhbHVlc30pXG4gICAqIEBwYXJhbSB7T2JqZWN0W119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBPYmplY3RbXX1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB2aW9saW5WYWx1ZXMgPSB1bmRlZmluZWRcbiAgICovXG4gIHZpb2xpbi52aW9saW5WYWx1ZXMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZpb2xpblZhbHVlcyA9IF8sIHZpb2xpbikgOiB2aW9saW5WYWx1ZXM7IH07XG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBvYmplY3RTaXplXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNvYmplY3RTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgb2JqZWN0U2l6ZSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgdmlvbGluLm9iamVjdFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9iamVjdFNpemUgPSBfLCB2aW9saW4pIDogb2JqZWN0U2l6ZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBzcGFjZXJTaXplXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNzcGFjZXJTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc3BhY2VyU2l6ZSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgdmlvbGluLnNwYWNlclNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNwYWNlclNpemUgPSBfLCB2aW9saW4pIDogc3BhY2VyU2l6ZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB0b29sdGlwXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiN0b29sdGlwfSlcbiAgICogQHBhcmFtIHt0b29sdGlwfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgdG9vbHRpcH1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0b29sdGlwID0gdG9vbHRpcCgpXG4gICAqL1xuICB2aW9saW4udG9vbHRpcCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodG9vbHRpcCA9IF8sIHZpb2xpbikgOiB0b29sdGlwOyB9O1xuICAvLyB2aW9saW4ucG9pbnRzVG9vbHRpcCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocG9pbnRzVG9vbHRpcCA9IF8sIHZpb2xpbikgOiBwb2ludHNUb29sdGlwOyB9O1xuXG4gIGZ1bmN0aW9uIHZpb2xpbiAoKSB7XG4gICAgLy8gZm9yIGNvbnZlbmllbmNlIGluIGhhbmRsaW5nIG9yaWVudGF0aW9uIHNwZWNpZmljIHZhbHVlc1xuICAgIHZhciBob3Jpem9udGFsUSA9IChvcmllbnQgPT0gJ2hvcml6b250YWwnKSA/IHRydWUgOiBmYWxzZVxuICAgIHZhciB2ZXJ0aWNhbFEgPSAhaG9yaXpvbnRhbFFcblxuICAgIC8vIGJhY2tncm91bmQgY2xpcGluZyByZWN0YW5nbGVcbiAgICB2YXIgYmdjcFJlY3QgPSB7eDowLCB5OjAsIHdpZHRoOiBzcGFjZVgsIGhlaWdodDpzcGFjZVl9XG4gICAgdmFyIGNvbnRhaW5lciA9IHNldHVwQ29udGFpbmVyKCBzZWxlY3Rpb24sIG5hbWVzcGFjZSwgYmdjcFJlY3QsIGJhY2tncm91bmRGaWxsICk7XG5cbiAgICAvLyBpZiBncm91cGluZyBpcyB1bmRlZmluZWQgc29ydCB2aW9saW5LZXlzIGJ5IHNvcnRpbmdGdW5jdGlvblxuICAgIHZhciBvcmRlcmVkID0gKGdyb3VwaW5nID09IHVuZGVmaW5lZCkgPyBkMy5rZXlzKGRhdGEpLnNvcnQoc29ydGluZ0Z1bmN0aW9uKSA6IGdyb3VwaW5nXG5cbiAgICAvLyBjb25zb2xlLmxvZyhvcmRlcmVkKVxuXG4gICAgdmlvbGluS2V5cyA9IGZsYXR0ZW4ob3JkZXJlZClcblxuICAgIHZhciBjYWxjVmFsdWVzID0gbmVlZGVkVmlvbGluVmFsdWVzKClcbiAgICAuaG9yaXpvbnRhbFEoaG9yaXpvbnRhbFEpXG4gICAgLnF1YXJ0aWxlS2V5cyhxdWFydGlsZUtleXMpXG4gICAgLnZpb2xpblBvaW50c0V4dHJhY3Rvcih2aW9saW5Qb2ludHNFeHRyYWN0b3IpXG4gICAgLnZpb2xpblBvaW50VmFsdWVFeHRyYWN0b3IodmlvbGluUG9pbnRWYWx1ZUV4dHJhY3RvcilcblxuICAgIC8vIGF1Z21lbnQgdmFsdXNcbiAgICB2aW9saW5LZXlzLm1hcChmdW5jdGlvbih2aywgaSl7IGNhbGNWYWx1ZXModmssIGRhdGEpIH0pXG5cbiAgICAvLyB2aW9saW5WYWx1ZXMgPSBleHRyYWN0VmlvbGluVmFsdWVzKHZpb2xpbktleXMsIGRhdGEsIHZhbHVlRXh0cmFjdG9yLCBob3Jpem9udGFsUSwgcXVhcnRpbGVzS2V5LCBxdWFydGlsZUtleXMpXG5cbiAgICB2YXIgbnVtYmVyT2ZPYmplY3RzID0gdmlvbGluS2V5cy5sZW5ndGhcblxuXG4gICAgdmFyIG1pbiA9IFtdLmNvbmNhdCguLi52aW9saW5LZXlzLm1hcChmdW5jdGlvbihrLCBpKXtyZXR1cm4gZGF0YVtrXS5xdWFydGlsZXNbcXVhcnRpbGVLZXlzWzBdXX0pKVxuICAgIHZhciBtYXggPSBbXS5jb25jYXQoLi4udmlvbGluS2V5cy5tYXAoZnVuY3Rpb24oaywgaSl7cmV0dXJuIGRhdGFba10ucXVhcnRpbGVzW3F1YXJ0aWxlS2V5c1txdWFydGlsZUtleXMubGVuZ3RoIC0gMV1dfSkpXG4gICAgdmFyIGV4dGVudCA9IFtNYXRoLm1pbiguLi5taW4pIC0gZG9tYWluUGFkZGluZywgTWF0aC5tYXgoLi4ubWF4KSArIGRvbWFpblBhZGRpbmddXG4gICAgLy8gY29uc29sZS5sb2coZXh0ZW50LCB2aW9saW5WYWx1ZXMsIG9yZGVyZWQpXG5cbiAgICAvLyBzZXQgdGhlIHNjYWxlXG4gICAgc2NhbGUuZG9tYWluKGV4dGVudCkucmFuZ2UoaG9yaXpvbnRhbFEgPyBbMCxzcGFjZVldIDogWzAsIHNwYWNlWF0pXG4gICAgdmFyIHNwYWNlID0gaG9yaXpvbnRhbFEgPyBzcGFjZVggOiBzcGFjZVlcbiAgICAvLyBjYWxjdWxhdGUgb2JqZWN0IHNpemVcbiAgICBvYmplY3RTaXplID0gY2FsY3VsYXRlV2lkdGhPZk9iamVjdChzcGFjZSwgbnVtYmVyT2ZPYmplY3RzLCBtaW5PYmplY3RTaXplLCBtYXhPYmplY3RTaXplLCBvYmplY3RTcGFjZXIsIG92ZXJmbG93USlcbiAgICAvLyBjYWxjdWxhdGUgc3BhY2VyIHNpemUgaWYgbmVlZGVkXG4gICAgc3BhY2VyU2l6ZSA9IGNhbGN1bGF0ZVdpZHRoT2ZTcGFjZXIob3JkZXJlZCwgc3BhY2UsIG9iamVjdFNpemUsIG51bWJlck9mT2JqZWN0cywgb2JqZWN0U3BhY2VyLCBvdmVyZmxvd1EpXG4gICAgLy8gbWFrZSB0aGUgbmVzdGVkIGdyb3Vwc1xuICAgIHZhciBzcGFjZXJGdW5jdGlvbiA9IGdyb3VwaW5nU3BhY2VyKClcbiAgICAuaG9yaXpvbnRhbFEoaG9yaXpvbnRhbFEpLnNjYWxlKHNjYWxlKS5tb3ZlYnkoJ2NhdGVnb3J5JykubnVtYmVyT2ZPYmplY3RzKG51bWJlck9mT2JqZWN0cylcbiAgICAub2JqZWN0Q2xhc3Mob2JqZWN0Q2xhc3MpLm9iamVjdFNpemUob2JqZWN0U2l6ZSkuc3BhY2VyU2l6ZShzcGFjZXJTaXplKVxuICAgIC50cmFuc2l0aW9uRHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlRnVuYyhlYXNlRnVuYylcbiAgICAubmFtZXNwYWNlKG5hbWVzcGFjZSlcblxuICAgIC8vIG1vdmUgc3R1ZmZcbiAgICBzcGFjZXJGdW5jdGlvbihjb250YWluZXIsIG9yZGVyZWQsIDApXG4gICAgLy8gY29uc29sZS5sb2codmlvbGluS2V5cywgb3JkZXJlZCwgY29udGFpbmVyLnNlbGVjdEFsbCgnZzpub3QoLnRvLXJlbW92ZSkuJytvYmplY3RDbGFzcykubm9kZXMoKSlcblxuICAgIC8vIGZvciBjb2xvciBmdW5jdGlvblxuICAgIHZhciBwYXJlbnRJbmRleEFycmF5ID0gW11cbiAgICBjb250YWluZXIuc2VsZWN0QWxsKCdnOm5vdCgudG8tcmVtb3ZlKS4nK29iamVjdENsYXNzKVxuICAgIC5lYWNoKGZ1bmN0aW9uKGQsIGkpe2lmIChoYXNRKHZpb2xpbktleXMsIGQpKXsgcGFyZW50SW5kZXhBcnJheS5wdXNoKE51bWJlcihkMy5zZWxlY3QodGhpcykuYXR0cigncGFyZW50LWluZGV4JykpKX19KVxuXG4gICAgLy8gdXBkYXRlIGNvbG9yIGZ1bmN0aW9uXG4gICAgY29sb3JGdW5jdGlvbiA9IGNvbG9yRnVuY3Rpb24uY29sb3JCeSgpID09ICdpbmRleCdcbiAgICA/IGNvbG9yRnVuY3Rpb24uZGF0YUV4dGVudChbMCwgTWF0aC5tYXgoLi4ucGFyZW50SW5kZXhBcnJheSldKVxuICAgIDogY29sb3JGdW5jdGlvbi5kYXRhRXh0ZW50KGV4dGVudClcblxuICAgIC8qIHZpb2xpaW4gc3BlY2lmaWMgbmVlZHMgKi9cblxuXG4gICAgdmFyIGZyZXF1ZW5jeU1heCA9IE1hdGgubWF4KC4uLltdLmNvbmNhdCguLi52aW9saW5LZXlzLm1hcChmdW5jdGlvbihrLCBpKXtyZXR1cm4gZDMubWF4KGRhdGFba10uZnJlcXVlbmNpZXMpfSkpKVxuICAgIHZhciB2U2NhbGUgPSBkMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbMCwgZnJlcXVlbmN5TWF4XSkucmFuZ2UoWzAsIG9iamVjdFNpemUgLyAyXSlcblxuICAgIHZhciBsQXJlYSA9IGQzLmxpbmUoKVxuICAgIC54KGZ1bmN0aW9uKGQsIGkpeyByZXR1cm4gaG9yaXpvbnRhbFEgPyAtdlNjYWxlKGQueCkgOiBzY2FsZShkLngpfSlcbiAgICAueShmdW5jdGlvbihkLCBpKXsgcmV0dXJuIGhvcml6b250YWxRID8gc2NhbGUoZXh0ZW50WzFdKSAtIHNjYWxlKGQueSkgOiAtdlNjYWxlKGQueSl9KVxuICAgIC5jdXJ2ZShkMy5jdXJ2ZUJhc2lzKVxuICAgIHZhciByQXJlYSA9IGQzLmxpbmUoKVxuICAgIC54KGZ1bmN0aW9uKGQsIGkpeyByZXR1cm4gaG9yaXpvbnRhbFEgPyB2U2NhbGUoZC54KSA6IHNjYWxlKGQueCl9KVxuICAgIC55KGZ1bmN0aW9uKGQsIGkpeyByZXR1cm4gaG9yaXpvbnRhbFEgPyBzY2FsZShleHRlbnRbMV0pIC0gc2NhbGUoZC55KSA6IHZTY2FsZShkLnkpfSlcbiAgICAuY3VydmUoZDMuY3VydmVCYXNpcylcblxuXG5cblxuXG5cbiAgICBjb250YWluZXIuc2VsZWN0QWxsKCdnOm5vdCgudG8tcmVtb3ZlKS4nK29iamVjdENsYXNzKS5lYWNoKGZ1bmN0aW9uKGtleSwgaSl7XG4gICAgICB2YXIgdCA9IGQzLnNlbGVjdCh0aGlzKSxcbiAgICAgIGN1cnJlbnREYXRhID0gZGF0YVtrZXldXG4gICAgICAvLyBuZWVkZWQgYmVjYXVzZSBidWcgaW4gc2VsZWN0aW5nIC50by1yZW1vdmVcbiAgICAgIGlmICghaGFzUSh2aW9saW5LZXlzLCBrZXkpKSB7cmV0dXJufVxuICAgICAgdmFyXG4gICAgICBpID0gdC5hdHRyKCdwYXJlbnQtaW5kZXgnKSA9PSB1bmRlZmluZWQgPyBpIDogdC5hdHRyKCdwYXJlbnQtaW5kZXgnKSxcbiAgICAgIGZpbGxDb2xvciA9IGNvbG9yRnVuY3Rpb24oa2V5LCBjdXJyZW50RGF0YSwgaSwgJ2ZpbGwnKSwgLy8gcHJldmVudCBkdXBsaWNhdGUgY29tcHV0YXRpb25cbiAgICAgIHN0cm9rZUNvbG9yID0gY29sb3JGdW5jdGlvbihrZXksIGN1cnJlbnREYXRhLCBpLCAnc3Ryb2tlJyksXG4gICAgICBhcmVhID0gc2FmZVNlbGVjdCh0LCAnZycsICdhcmVhJyksXG4gICAgICBsYSA9IHNhZmVTZWxlY3QoYXJlYSwgJ3BhdGgnLCAnbGVmdCcpLFxuICAgICAgcmEgPSBzYWZlU2VsZWN0KGFyZWEsICdwYXRoJywgJ3JpZ2h0JyksXG4gICAgICBxdWFydHMgPSBzYWZlU2VsZWN0KHQsICdnJywgJ3F1YXJ0cycpLFxuICAgICAgbHEzID0gc2FmZVNlbGVjdChxdWFydHMsICdsaW5lJywgJ3EzJyksXG4gICAgICBscTEgPSBzYWZlU2VsZWN0KHF1YXJ0cywgJ2xpbmUnLCAncTEnKSxcbiAgICAgIHEzID0gY3VycmVudERhdGEucXVhcnRpbGVzW3F1YXJ0aWxlS2V5c1szXV0sXG4gICAgICBxMiA9IGN1cnJlbnREYXRhLnF1YXJ0aWxlc1txdWFydGlsZUtleXNbMl1dLFxuICAgICAgcTEgPSBjdXJyZW50RGF0YS5xdWFydGlsZXNbcXVhcnRpbGVLZXlzWzFdXVxuXG4gICAgICB0LmF0dHIoJ3RyYW5zZm9ybScsIGhvcml6b250YWxRID8gJ3RyYW5zbGF0ZSgnK29iamVjdFNpemUgLyAyKycsMCknIDogJ3RyYW5zbGF0ZSgwLCcrb2JqZWN0U2l6ZSAvIDIrJyknICApXG4gICAgICAvLyBkcmF3IGN1cnZlXG4gICAgICBsYS50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5hdHRyKCdkJywgZnVuY3Rpb24oZGQsIGlpKXsgcmV0dXJuIGxBcmVhKGN1cnJlbnREYXRhLmNvbnRvdXIpfSlcbiAgICAgIC5hdHRyKCdmaWxsJywgZmlsbENvbG9yKVxuICAgICAgLmF0dHIoJ3N0cm9rZScsIHN0cm9rZUNvbG9yKVxuICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIG9iamVjdFN0cm9rZVdpZHRoKVxuXG4gICAgICByYS50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5hdHRyKCdkJywgZnVuY3Rpb24oZGQsIGlpKXsgcmV0dXJuIHJBcmVhKGN1cnJlbnREYXRhLmNvbnRvdXIpfSlcbiAgICAgIC5hdHRyKCdmaWxsJywgZmlsbENvbG9yKVxuICAgICAgLmF0dHIoJ3N0cm9rZScsIHN0cm9rZUNvbG9yKVxuICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIG9iamVjdFN0cm9rZVdpZHRoKVxuXG4gICAgICBhcmVhLm5vZGUoKS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCBmdW5jdGlvbihkZCwgaWkpe1xuICAgICAgICBjb250YWluZXIuc2VsZWN0QWxsKCdnLicrb2JqZWN0Q2xhc3MpLnN0eWxlKCdvcGFjaXR5JywgMC4yKVxuICAgICAgICB0LnN0eWxlKCdvcGFjaXR5JywgMSlcbiAgICAgICAgbGEuYXR0cignc3Ryb2tlLXdpZHRoJyxvYmplY3RTdHJva2VXaWR0aCoyKVxuICAgICAgICByYS5hdHRyKCdzdHJva2Utd2lkdGgnLG9iamVjdFN0cm9rZVdpZHRoKjIpXG4gICAgICB9KVxuICAgICAgYXJlYS5ub2RlKCkuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCBmdW5jdGlvbihkZCwgaWkpe1xuICAgICAgICBjb250YWluZXIuc2VsZWN0QWxsKCdnLicrb2JqZWN0Q2xhc3MpLnN0eWxlKCdvcGFjaXR5JywgMSlcbiAgICAgICAgbGEuYXR0cignc3Ryb2tlLXdpZHRoJyxvYmplY3RTdHJva2VXaWR0aClcbiAgICAgICAgcmEuYXR0cignc3Ryb2tlLXdpZHRoJyxvYmplY3RTdHJva2VXaWR0aClcbiAgICAgIH0pXG5cbiAgICAgIGlmIChwb2ludHNRKSB7XG4gICAgICAgIHZhciBwdHNDb250YWluZXIgPSBzYWZlU2VsZWN0KHQsICdnJywgJ3BvaW50cycpXG4gICAgICAgIHZhciBwdHMgPSBwdHNDb250YWluZXIuc2VsZWN0QWxsKCcucG9pbnQnKS5kYXRhKGN1cnJlbnREYXRhLnBvaW50S2V5cylcbiAgICAgICAgcHRzLm9uKCdtb3VzZW92ZXInLCBudWxsKVxuXG5cbiAgICAgICAgdmFyIHB0c0V4aXQgPSBwdHMuZXhpdCgpLnRyYW5zaXRpb24oKS5lYXNlKGVhc2VGdW5jKS5kdXJhdGlvbih0cmFuc2l0aW9uRHVyYXRpb24pXG4gICAgICAgIC5hdHRyKCdyJywgMClcbiAgICAgICAgLmF0dHIoJ2N5JywgaG9yaXpvbnRhbFEgPyBzY2FsZShleHRlbnRbMV0pIC0gc2NhbGUocTIpIDogdlNjYWxlKDApKVxuICAgICAgICAuYXR0cignY3gnLCBob3Jpem9udGFsUSA/IHZTY2FsZSgwKSA6IHNjYWxlKHEyKSkucmVtb3ZlKClcblxuICAgICAgICB2YXIgcHRzRW50ZXIgPSBwdHMuZW50ZXIoKS5hcHBlbmQoJ2NpcmNsZScpLmF0dHIoJ2NsYXNzJywgJ3BvaW50JykuYXR0cigncicsIDApXG4gICAgICAgIC5hdHRyKCdjeCcsIGhvcml6b250YWxRID8gMCA6IHNjYWxlKHEyKSlcbiAgICAgICAgLmF0dHIoJ2N5JywgaG9yaXpvbnRhbFEgPyBzY2FsZShxMikgOiAwKVxuXG5cblxuICAgICAgICBwdHMgPSBwdHMubWVyZ2UocHRzRW50ZXIpXG5cbiAgICAgICAgVFRpcCgpLnNlbGVjdGlvbihwdHMpXG4gICAgICAgIC5kYXRhKHZpb2xpblBvaW50c0V4dHJhY3RvcihrZXksIGN1cnJlbnREYXRhKSlcbiAgICAgICAgKClcblxuXG5cbiAgICAgICAgcHRzLnRyYW5zaXRpb24oKS5kdXJhdGlvbih0cmFuc2l0aW9uRHVyYXRpb24pLmVhc2UoZWFzZUZ1bmMpLmF0dHIoJ3InLCBwb2ludFJhZGl1cylcbiAgICAgICAgLmF0dHIoJ2N5JywgZnVuY3Rpb24ocG9pbnRLZXksIGlpKXtcbiAgICAgICAgICB2YXIgZGQgPSBjdXJyZW50RGF0YS5wb2ludFZhbHVlc1tpaV1cbiAgICAgICAgICBpZiAoaG9yaXpvbnRhbFEpIHsgcmV0dXJuIHNjYWxlKGV4dGVudFsxXSkgLSBzY2FsZShkZCkgfVxuICAgICAgICAgIHZhciBqID0gd2hpY2hCaW4oY3VycmVudERhdGEuYmlubmVkLCBkZClcbiAgICAgICAgICB2YXIgciA9IE1hdGgucmFuZG9tKClcbiAgICAgICAgICB2YXIgbiA9IHZTY2FsZShyICogY3VycmVudERhdGEuZnJlcXVlbmNpZXNbal0gKiAwLjUpXG4gICAgICAgICAgdmFyIGsgPSBNYXRoLnJhbmRvbSgpID4gMC41ID8gbiA6IC1uXG4gICAgICAgICAgcmV0dXJuIGtcbiAgICAgICAgfSlcbiAgICAgICAgLmF0dHIoJ2N4JywgZnVuY3Rpb24ocG9pbnRLZXksIGlpKXtcbiAgICAgICAgICB2YXIgZGQgPSBjdXJyZW50RGF0YS5wb2ludFZhbHVlc1tpaV1cbiAgICAgICAgICBpZiAoaG9yaXpvbnRhbFEpIHtcbiAgICAgICAgICAgIHZhciBqID0gd2hpY2hCaW4oY3VycmVudERhdGEuYmlubmVkLCBkZClcbiAgICAgICAgICAgIHZhciByID0gTWF0aC5yYW5kb20oKVxuICAgICAgICAgICAgdmFyIG4gPSB2U2NhbGUociAqIGN1cnJlbnREYXRhLmZyZXF1ZW5jaWVzW2pdICogMC41KVxuICAgICAgICAgICAgdmFyIGsgPSBNYXRoLnJhbmRvbSgpID4gMC41ID8gbiA6IC1uXG4gICAgICAgICAgICByZXR1cm4ga1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gc2NhbGUoZGQpXG4gICAgICAgIH0pXG4gICAgICAgIC5hdHRyKCdzdHJva2UnLCBmdW5jdGlvbihkZCwgaWkpIHsgdmFyIGRkID0gY3VycmVudERhdGEucG9pbnRWYWx1ZXNbaWldO3JldHVybiBwb2ludENvbG9yRnVuYyhkZCwgJ3N0cm9rZScsIHN0cm9rZUNvbG9yLCBtaW4sIG1heCkgfSlcbiAgICAgICAgLmF0dHIoJ2ZpbGwnICAsIGZ1bmN0aW9uKGRkLCBpaSkgeyB2YXIgZGQgPSBjdXJyZW50RGF0YS5wb2ludFZhbHVlc1tpaV07cmV0dXJuIHBvaW50Q29sb3JGdW5jKGRkLCAnZmlsbCcgICwgc3Ryb2tlQ29sb3IsIG1pbiwgbWF4KSB9KVxuICAgICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgcG9pbnRTdHJva2VXaWR0aClcblxuICAgICAgICBwdHNDb250YWluZXIuc2VsZWN0QWxsKCdjaXJjbGUucG9pbnQnKS5vbignbW91c2VvdmVyJywgZnVuY3Rpb24oZGQsIGlpKXtcbiAgICAgICAgICBjb250YWluZXIuc2VsZWN0QWxsKCdnLicrb2JqZWN0Q2xhc3MpLnN0eWxlKCdvcGFjaXR5JywgMC4yKVxuICAgICAgICAgIHQuc3R5bGUoJ29wYWNpdHknLCAxKVxuICAgICAgICAgIGxhLmF0dHIoJ3N0cm9rZS13aWR0aCcsb2JqZWN0U3Ryb2tlV2lkdGgqMilcbiAgICAgICAgICByYS5hdHRyKCdzdHJva2Utd2lkdGgnLG9iamVjdFN0cm9rZVdpZHRoKjIpXG5cbiAgICAgICAgICBjb250YWluZXIuc2VsZWN0QWxsKCcucG9pbnQnKS5zdHlsZSgnb3BhY2l0eScsIDAuMilcbiAgICAgICAgICBkMy5zZWxlY3QodGhpcykuc3R5bGUoJ29wYWNpdHknLCAxKS5hdHRyKCdyJywgcG9pbnRSYWRpdXMgKiAyKS5hdHRyKCdzdHJva2Utd2lkdGgnLHBvaW50U3Ryb2tlV2lkdGgqMilcbiAgICAgICAgfSlcbiAgICAgICAgcHRzQ29udGFpbmVyLnNlbGVjdEFsbCgnY2lyY2xlLnBvaW50Jykub24oJ21vdXNlb3V0JywgZnVuY3Rpb24oZGQsIGlpKXtcbiAgICAgICAgICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdTVkdFdmVudHMnKVxuICAgICAgICAgIGUuaW5pdEV2ZW50KCdtb3VzZW91dCcsdHJ1ZSx0cnVlKTtcbiAgICAgICAgICBhcmVhLm5vZGUoKS5kaXNwYXRjaEV2ZW50KGUpXG5cbiAgICAgICAgICBjb250YWluZXIuc2VsZWN0QWxsKCcucG9pbnQnKS5zdHlsZSgnb3BhY2l0eScsIDEpXG4gICAgICAgICAgZDMuc2VsZWN0KHRoaXMpLmF0dHIoJ3N0cm9rZS13aWR0aCcsIHBvaW50U3Ryb2tlV2lkdGgpLmF0dHIoJ3InLCBwb2ludFJhZGl1cylcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjVi5zZWxlY3RBbGwoJy5wb2ludCcpXG4gICAgICAgIC50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlKGVhc2VGdW5jKVxuICAgICAgICAuYXR0cigncicsIDApXG4gICAgICAgIC5hdHRyKCdjeScsIGhvcml6b250YWxRID8gc2NhbGUoZXh0ZW50WzFdKSAtIHNjYWxlKHEyKSA6IHZTY2FsZSgwKSlcbiAgICAgICAgLmF0dHIoJ2N4JywgaG9yaXpvbnRhbFEgPyB2U2NhbGUoMCkgOiBzY2FsZShxMikpXG4gICAgICAgIC5yZW1vdmUoKVxuICAgICAgfVxuXG5cbiAgICB9KVxuXG5cbiAgICAvLyB2YXIgdmFsdWVzID0ge307XG4gICAgLy8gcG9pbnRLZXlFeHRyYWN0b3Ioa2V5LCBjdXJyZW50RGF0YSwgdmlvbGluVmFsdWVzKS5tYXAoZnVuY3Rpb24oaywgaSl7XG4gICAgLy8gICB2YWx1ZXNba10gPSBwb2ludFZhbHVlRXh0cmFjdG9yKGssIGtleSwgY3VycmVudERhdGEsIHZpb2xpblZhbHVlcylcbiAgICAvLyB9KVxuICAgIC8vXG4gICAgLy8gY29uc29sZS50YWJsZSh2YWx1ZXMpXG4gICAgLy9cbiAgICAvLyAuZGF0YShkYXRhKVxuICAgIC8vIC5rZXlzKFsnVmFsdWUnXSlcbiAgICAvLyAudmFsdWVzKFtmdW5jdGlvbihjZCwga2V5KXtyZXR1cm4gY2QgfV0pXG4gICAgLy8gcG9pbnRzVG9vbHRpcCgpXG5cblxuICAgIHRvb2x0aXAuc2VsZWN0aW9uKGNvbnRhaW5lci5zZWxlY3RBbGwoJ2c6bm90KC50by1yZW1vdmUpLicrb2JqZWN0Q2xhc3MgKyAnIC5hcmVhJykpXG4gICAgaWYgKHRvb2x0aXAuZGF0YSgpID09IHVuZGVmaW5lZCkge3Rvb2x0aXAuZGF0YShkYXRhKX1cbiAgICB0b29sdGlwKClcbiAgICB0b29sdGlwLnZhbHVlcyhbXG4gICAgICBmdW5jdGlvbihjdXJyZW50RGF0YSwgdG9vbHRpcEtleSl7IHJldHVybiBjdXJyZW50RGF0YVsncXVhcnRpbGVzJ11bdG9vbHRpcEtleV0gfSxcbiAgICAgIGZ1bmN0aW9uKGN1cnJlbnREYXRhLCB0b29sdGlwS2V5KXsgcmV0dXJuIGN1cnJlbnREYXRhWydxdWFydGlsZXMnXVt0b29sdGlwS2V5XSB9LFxuICAgICAgZnVuY3Rpb24oY3VycmVudERhdGEsIHRvb2x0aXBLZXkpeyByZXR1cm4gY3VycmVudERhdGFbJ3F1YXJ0aWxlcyddW3Rvb2x0aXBLZXldIH0sXG4gICAgICBmdW5jdGlvbihjdXJyZW50RGF0YSwgdG9vbHRpcEtleSl7IHJldHVybiBjdXJyZW50RGF0YVsncXVhcnRpbGVzJ11bdG9vbHRpcEtleV0gfSxcbiAgICAgIGZ1bmN0aW9uKGN1cnJlbnREYXRhLCB0b29sdGlwS2V5KXsgcmV0dXJuIGN1cnJlbnREYXRhWydxdWFydGlsZXMnXVt0b29sdGlwS2V5XSB9XG4gICAgXSlcblxuICB9XG5cbiAgcmV0dXJuIHZpb2xpblxufVxuXG5cblxuXG5mdW5jdGlvbiB2aW9saW5Qb2ludHNFeHRyYWN0b3IodmlvbGluS2V5LCB2aW9saW5EYXRhKSB7IHJldHVybiB2aW9saW5EYXRhLnBvaW50cyB9XG5mdW5jdGlvbiB2aW9saW5Qb2ludFZhbHVlRXh0cmFjdG9yKHZpb2xpblBvaW50S2V5LCB2aW9saW5Qb2ludERhdGEpIHsgcmV0dXJuIHZpb2xpblBvaW50RGF0YVt2aW9saW5Qb2ludEtleV0udmFsdWUgfVxuXG5mdW5jdGlvbiBuZWVkZWRWaW9saW5WYWx1ZXMoKSB7XG4gIHZhclxuICBob3Jpem9udGFsUSA9IHRydWUsXG4gIHF1YXJ0aWxlS2V5cyA9IFsnUTAnLCAnUTEnLCAnUTInLCAnUTMnLCAnUTQnXSxcbiAgdmlvbGluUG9pbnRzRXh0cmFjdG9yLFxuICB2aW9saW5Qb2ludFZhbHVlRXh0cmFjdG9yXG5cbiAgY2FsY3VsYXRlVmlvbGluVmFsdWVzLmhvcml6b250YWxRID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChob3Jpem9udGFsUT1fLCBjYWxjdWxhdGVWaW9saW5WYWx1ZXMpIDogaG9yaXpvbnRhbFEgfVxuICBjYWxjdWxhdGVWaW9saW5WYWx1ZXMucXVhcnRpbGVLZXlzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChxdWFydGlsZUtleXM9XywgY2FsY3VsYXRlVmlvbGluVmFsdWVzKSA6IHF1YXJ0aWxlS2V5cyB9XG4gIGNhbGN1bGF0ZVZpb2xpblZhbHVlcy52aW9saW5Qb2ludHNFeHRyYWN0b3IgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZpb2xpblBvaW50c0V4dHJhY3Rvcj1fLCBjYWxjdWxhdGVWaW9saW5WYWx1ZXMpIDogdmlvbGluUG9pbnRzRXh0cmFjdG9yIH1cbiAgY2FsY3VsYXRlVmlvbGluVmFsdWVzLnZpb2xpblBvaW50VmFsdWVFeHRyYWN0b3IgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZpb2xpblBvaW50VmFsdWVFeHRyYWN0b3I9XywgY2FsY3VsYXRlVmlvbGluVmFsdWVzKSA6IHZpb2xpblBvaW50VmFsdWVFeHRyYWN0b3IgfVxuXG4gIGZ1bmN0aW9uIGNhbGN1bGF0ZVZpb2xpblZhbHVlcyh2aW9saW5LZXksIGRhdGEpIHtcbiAgICAvLyBkYXRhIGZvciB0aGUgY3VycmVudCB2aW9saW5cbiAgICB2YXIgdmlvbGluRGF0YSA9IGRhdGFbdmlvbGluS2V5XTtcbiAgICAvLyB0aGUgb2JqZWN0IG9mIHBvaW50c1xuICAgIHZhciB2aW9saW5Qb2ludHMgPSB2aW9saW5Qb2ludHNFeHRyYWN0b3IodmlvbGluS2V5LCB2aW9saW5EYXRhKTtcbiAgICAvL1xuICAgIHZhciB2aW9saW5Qb2ludHNLZXlzID0gZDMua2V5cyh2aW9saW5Qb2ludHMpO1xuICAgIC8vIHRoZSBudW1lcmljYWwgdmFsdWVzIG9mIHRob3NlIHBvaW50c1xuICAgIHZhciB2aW9saW5Qb2ludHNWYWx1ZXMgPSB2aW9saW5Qb2ludHNLZXlzLm1hcChmdW5jdGlvbihwaywgaSl7cmV0dXJuIHZpb2xpblBvaW50c1twa10udmFsdWV9KVxuXG4gICAgLy8gcXVhcnRpbGVzIG9mIHRob3NlIHBvaW50c1xuICAgIHZhciBwb2ludFF1YXJ0aWxlcyA9IHF1YXJ0aWxlcyh2aW9saW5Qb2ludHNWYWx1ZXMsIHF1YXJ0aWxlS2V5cylcblxuICAgIC8vIGJpbm5lZCBwb2ludHNcbiAgICB2YXIgYmlubmVkID0gZDMuaGlzdG9ncmFtKCkodmlvbGluUG9pbnRzVmFsdWVzKVxuICAgIC8vIGxlbmd0aCBvZiBiaW5zXG4gICAgdmFyIGZyZXF1ZW5jaWVzID0gYmlubmVkLm1hcChiaW49PmJpbi5sZW5ndGgpXG4gICAgLy8gbWluIGFuZCBtYXggY291bnRvdXIgcG9pbnRzIGZvciBuaWNlIGRyYXdpbmdzXG4gICAgdmFyIG1pbkNvbnRvdXJQb2ludCA9IGhvcml6b250YWxRID8ge3g6IDAsIHk6IGQzLm1pbih2aW9saW5Qb2ludHNWYWx1ZXMpfSA6ICB7eDogZDMubWluKHZpb2xpblBvaW50c1ZhbHVlcyksIHk6IDB9XG4gICAgdmFyIG1heENvbnRvdXJQb2ludCA9IGhvcml6b250YWxRID8ge3g6IDAsIHk6IGQzLm1heCh2aW9saW5Qb2ludHNWYWx1ZXMpfSA6ICB7eDogZDMubWF4KHZpb2xpblBvaW50c1ZhbHVlcyksIHk6IDB9XG4gICAgdmFyIHZpb2xpbkNvbnRvdXJQb2ludHMgPSBiaW5uZWQubWFwKGZ1bmN0aW9uKGJpbiwgaSkge1xuICAgICAgICByZXR1cm4gaG9yaXpvbnRhbFFcbiAgICAgICAgPyB7eTogKGJpbi5sZW5ndGgpID8gZDMubWVkaWFuKGJpbik6IGQzLm1lZGlhbihbYmluLngwLCBiaW4ueDFdKSwgeDogZnJlcXVlbmNpZXNbaV19XG4gICAgICAgIDoge3g6IChiaW4ubGVuZ3RoKSA/IGQzLm1lZGlhbihiaW4pOiBkMy5tZWRpYW4oW2Jpbi54MCwgYmluLngxXSksIHk6IGZyZXF1ZW5jaWVzW2ldfVxuICAgICAgfSlcbiAgICAvLyBwb2ludHMgYWxvbmcgd2hpY2ggdG8gZHJhdyB0aGUgdmlvbGluIHNocGVcbiAgICB2aW9saW5Db250b3VyUG9pbnRzID0gW21pbkNvbnRvdXJQb2ludF0uY29uY2F0KHZpb2xpbkNvbnRvdXJQb2ludHMpLmNvbmNhdChbbWF4Q29udG91clBvaW50XSlcblxuICAgIC8vIHNldCBkYXRhXG4gICAgdmlvbGluRGF0YS5iaW5uZWQgPSBiaW5uZWQ7XG4gICAgdmlvbGluRGF0YS5mcmVxdWVuY2llcyA9IGZyZXF1ZW5jaWVzXG4gICAgdmlvbGluRGF0YS5jb250b3VyID0gdmlvbGluQ29udG91clBvaW50c1xuICAgIHZpb2xpbkRhdGEucXVhcnRpbGVzID0gcG9pbnRRdWFydGlsZXNcbiAgICB2aW9saW5EYXRhLnBvaW50S2V5cyA9IHZpb2xpblBvaW50c0tleXNcbiAgICB2aW9saW5EYXRhLnBvaW50VmFsdWVzID0gdmlvbGluUG9pbnRzVmFsdWVzXG4gIH1cblxuICByZXR1cm4gY2FsY3VsYXRlVmlvbGluVmFsdWVzXG59XG4iLCJpbXBvcnQge2h5cGVuYXRlLCBzYWZlU2VsZWN0fSBmcm9tICcuL2hlbHBlcnMnO1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBwb2ludHMgKCBzZWxlY3Rpb24gKSB7XG4gIHZhclxuICAvLyAvKipcbiAgLy8gKiBEYXRhIHRvIHBsb3QuIEFzc3VtZWQgdG8gYmUgYSBvYmplY3QsIHdoZXJlIGVhY2gga2V5IGNvcnJlc3BvbmRzIHRvIGEgdmlvbGluXG4gIC8vICogKHNlZSB7QGxpbmsgYmFyI2RhdGF9KVxuICAvLyAqIEBwYXJhbSB7T2JqZWN0fSBbZGF0YT11bmRlZmluZWRdXG4gIC8vICogQG1lbWJlcm9mIGJhciNcbiAgLy8gKiBAcHJvcGVydHlcbiAgLy8gKi9cbiAgLy8gZGF0YSxcbiAgLy8gLyoqXG4gIC8vICogV2hpY2ggZGlyZWN0aW9uIHRvIHJlbmRlciB0aGUgYmFycyBpblxuICAvLyAqIChzZWUge0BsaW5rIGJhciNvcmllbnR9KVxuICAvLyAqIEBwYXJhbSB7bnVtYmVyfSBbb3JpZW50PSdob3Jpem9udGFsJ11cbiAgLy8gKiBAbWVtYmVyb2YgYmFyI1xuICAvLyAqIEBwcm9wZXJ0eVxuICAvLyAqL1xuICAvLyBvcmllbnQ9J2hvcml6b250YWwnLFxuICAvLyAvKipcbiAgLy8gKiBUaGUgcmFkaXVzIG9mIGEgcG9pbnRcbiAgLy8gKiBAcGFyYW0ge251bWJlcn0gW3BvaW50UmFkaXVzPTNdXG4gIC8vICogQG1lbWJlcm9mIGJhciNcbiAgLy8gKiBAcHJvcGVydHlcbiAgLy8gKi9cbiAgLy8gcmFkaXVzID0gMyxcbiAgLy8gLyoqXG4gIC8vICogVGhlIHN0cm9rZSB3aWR0aCBvZiB0aGUgb2ludHNcbiAgLy8gKiBAcGFyYW0ge251bWJlcn0gW3BvaW50U3Ryb2tlV2lkdGg9Ml1cbiAgLy8gKiBAbWVtYmVyb2YgYmFyI1xuICAvLyAqIEBwcm9wZXJ0eVxuICAvLyAqL1xuICAvLyBzdHJva2VXaWR0aCA9IDIsXG4gIC8vIC8qKlxuICAvLyAqIE5hbWVzcGFjZSBmb3IgYWxsIGl0ZW1zIG1hZGUgYnkgdGhpcyBpbnN0YW5jZSBvZiBiYXJcbiAgLy8gKiBAcGFyYW0ge3N0cmluZ30gW25hbWVzcGFjZT1cImQzc20tdmlvbGluXCJdXG4gIC8vICogQG1lbWJlcm9mIGJhciNcbiAgLy8gKiBAcHJvcGVydHlcbiAgLy8gKi9cbiAgLy8gbmFtZXNwYWNlID0gJ2Qzc20tcG9pbnRzJyxcbiAgLy8gLyoqXG4gIC8vICogQ2xhc3MgbmFtZSBmb3IgYmFyIGNvbnRhaW5lciAoPGc+IGVsZW1lbnQpXG4gIC8vICogQHBhcmFtIHtzdHJpbmd9IFtvYmplY3RDbGFzcz1cInZpb2xpblwiXVxuICAvLyAqIEBtZW1iZXJvZiBiYXIjXG4gIC8vICogQHByb3BlcnR5XG4gIC8vICovXG4gIC8vIG9iamVjdENsYXNzID0gJ3BvaW50JyxcbiAgLy8gLyoqXG4gIC8vICogRHVyYXRpb24gb2YgYWxsIHRyYW5zaXRpb25zIG9mIHRoaXMgZWxlbWVudFxuICAvLyAqIEBwYXJhbSB7bnVtYmVyfSBbdHJhbnNpdGlvbkR1cmF0aW9uPTEwMDBdXG4gIC8vICogQG1lbWJlcm9mIGJhciNcbiAgLy8gKiBAcHJvcGVydHlcbiAgLy8gKi9cbiAgLy8gdHJhbnNpdGlvbkR1cmF0aW9uID0gMTAwMCxcbiAgLy8gLyoqXG4gIC8vICogRWFzaW5nIGZ1bmN0aW9uIGZvciB0cmFuc2l0aW9uc1xuICAvLyAqIEBwYXJhbSB7ZDMuZWFzZX0gW2Vhc2VGdW5jPWQzLmVhc2VFeHBdXG4gIC8vICogQG1lbWJlcm9mIGJhciNcbiAgLy8gKiBAcHJvcGVydHlcbiAgLy8gKi9cbiAgLy8gZWFzZUZ1bmMgPSBkMy5lYXNlRXhwLFxuICAvLyAvKipcbiAgLy8gKiBUaGUgb2JqZWN0U2l6ZSAoYWN0dWFsIHdpZHRoKSB1c2VkIGJ5IHRoZSBiYXJzXG4gIC8vICogQHBhcmFtIHtudW1iZXJ9IFtvYmplY3RTaXplPXVuZGVmaW5lZF1cbiAgLy8gKiBAbWVtYmVyb2YgYmFyI1xuICAvLyAqIEBwcm9wZXJ0eVxuICAvLyAqL1xuICAvLyBvYmplY3RTaXplLFxuXG4gIGtleUV4dHJhY3RvciA9IGZ1bmN0aW9uKGQsIGkpIHsgY29uc29sZS5sb2coZCkgfSxcbiAgdmFsdWVFeHRyYWN0b3IgPSBmdW5jdGlvbihkLCBpKSB7IH1cblxuXG4gIGZ1bmN0aW9uIHBvaW50cygpIHtcbiAgICAvLyB2YXIgcHRzQ29udGFpbmVycyA9IHNlbGVjdGlvbi5zZWxlY3RBbGwoJy4nK29iamVjdENsYXNzKVxuICAgIHZhciBwdHNDb250YWluZXJzID0gc2VsZWN0aW9uLnNlbGVjdEFsbCgnLmJvdy13aGlzaycpXG4gICAgY29uc29sZS5sb2cocHRzQ29udGFpbmVycy5ub2RlcygpKVxuXG4gICAgcHRzQ29udGFpbmVycy5lYWNoKGZ1bmN0aW9uKGQsIGkpe1xuICAgICAgdmFyIHQgPSBkMy5zZWxlY3QodGhpcyksXG4gICAgICBwdHNDb250YWluZXIgPSBzYWZlU2VsZWN0KHQsICdnJywgJ3BvaW50cycpLFxuICAgICAgcHRzID0gcHRzQ29udGFpbmVyLnNlbGVjdEFsbCgnLnBvaW50JykuZGF0YSgga2V5RXh0cmFjdG9yKGQpIClcblxuXG4gICAgICB2YXIgcHRzRXhpdCA9IHB0cy5leGl0KClcbiAgICAgIHZhciBwdHNFbnRlciA9IHB0cy5lbnRlcigpLmFwcGVuZCgnY2lyY2xlJykuYXR0cignY2xhc3MnLCAncG9pbnQnKVxuXG4gICAgICBwdHMgPSBwdHMubWVyZ2UocHRzRW50ZXIpXG5cbiAgICB9KVxuICB9XG4gIHJldHVybiBwb2ludHNcbn1cbiIsIi8qKlxuICogSGVscGVycy5cbiAqL1xuXG52YXIgcyA9IDEwMDA7XG52YXIgbSA9IHMgKiA2MDtcbnZhciBoID0gbSAqIDYwO1xudmFyIGQgPSBoICogMjQ7XG52YXIgeSA9IGQgKiAzNjUuMjU7XG5cbi8qKlxuICogUGFyc2Ugb3IgZm9ybWF0IHRoZSBnaXZlbiBgdmFsYC5cbiAqXG4gKiBPcHRpb25zOlxuICpcbiAqICAtIGBsb25nYCB2ZXJib3NlIGZvcm1hdHRpbmcgW2ZhbHNlXVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gdmFsXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhyb3cgYW4gZXJyb3IgaWYgdmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSBudW1iZXJcbiAqIEByZXR1cm4ge1N0cmluZ3xOdW1iZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odmFsLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWw7XG4gIGlmICh0eXBlID09PSAnc3RyaW5nJyAmJiB2YWwubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBwYXJzZSh2YWwpO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInICYmIGlzTmFOKHZhbCkgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMubG9uZyA/IGZtdExvbmcodmFsKSA6IGZtdFNob3J0KHZhbCk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgICd2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIHZhbGlkIG51bWJlci4gdmFsPScgK1xuICAgICAgSlNPTi5zdHJpbmdpZnkodmFsKVxuICApO1xufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gYHN0cmAgYW5kIHJldHVybiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2Uoc3RyKSB7XG4gIHN0ciA9IFN0cmluZyhzdHIpO1xuICBpZiAoc3RyLmxlbmd0aCA+IDEwMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbWF0Y2ggPSAvXigoPzpcXGQrKT9cXC4/XFxkKykgKihtaWxsaXNlY29uZHM/fG1zZWNzP3xtc3xzZWNvbmRzP3xzZWNzP3xzfG1pbnV0ZXM/fG1pbnM/fG18aG91cnM/fGhycz98aHxkYXlzP3xkfHllYXJzP3x5cnM/fHkpPyQvaS5leGVjKFxuICAgIHN0clxuICApO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBuID0gcGFyc2VGbG9hdChtYXRjaFsxXSk7XG4gIHZhciB0eXBlID0gKG1hdGNoWzJdIHx8ICdtcycpLnRvTG93ZXJDYXNlKCk7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3llYXJzJzpcbiAgICBjYXNlICd5ZWFyJzpcbiAgICBjYXNlICd5cnMnOlxuICAgIGNhc2UgJ3lyJzpcbiAgICBjYXNlICd5JzpcbiAgICAgIHJldHVybiBuICogeTtcbiAgICBjYXNlICdkYXlzJzpcbiAgICBjYXNlICdkYXknOlxuICAgIGNhc2UgJ2QnOlxuICAgICAgcmV0dXJuIG4gKiBkO1xuICAgIGNhc2UgJ2hvdXJzJzpcbiAgICBjYXNlICdob3VyJzpcbiAgICBjYXNlICdocnMnOlxuICAgIGNhc2UgJ2hyJzpcbiAgICBjYXNlICdoJzpcbiAgICAgIHJldHVybiBuICogaDtcbiAgICBjYXNlICdtaW51dGVzJzpcbiAgICBjYXNlICdtaW51dGUnOlxuICAgIGNhc2UgJ21pbnMnOlxuICAgIGNhc2UgJ21pbic6XG4gICAgY2FzZSAnbSc6XG4gICAgICByZXR1cm4gbiAqIG07XG4gICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgY2FzZSAnc2Vjb25kJzpcbiAgICBjYXNlICdzZWNzJzpcbiAgICBjYXNlICdzZWMnOlxuICAgIGNhc2UgJ3MnOlxuICAgICAgcmV0dXJuIG4gKiBzO1xuICAgIGNhc2UgJ21pbGxpc2Vjb25kcyc6XG4gICAgY2FzZSAnbWlsbGlzZWNvbmQnOlxuICAgIGNhc2UgJ21zZWNzJzpcbiAgICBjYXNlICdtc2VjJzpcbiAgICBjYXNlICdtcyc6XG4gICAgICByZXR1cm4gbjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFNob3J0IGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdFNob3J0KG1zKSB7XG4gIGlmIChtcyA+PSBkKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBkKSArICdkJztcbiAgfVxuICBpZiAobXMgPj0gaCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gaCkgKyAnaCc7XG4gIH1cbiAgaWYgKG1zID49IG0pIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG0pICsgJ20nO1xuICB9XG4gIGlmIChtcyA+PSBzKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBzKSArICdzJztcbiAgfVxuICByZXR1cm4gbXMgKyAnbXMnO1xufVxuXG4vKipcbiAqIExvbmcgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZm10TG9uZyhtcykge1xuICByZXR1cm4gcGx1cmFsKG1zLCBkLCAnZGF5JykgfHxcbiAgICBwbHVyYWwobXMsIGgsICdob3VyJykgfHxcbiAgICBwbHVyYWwobXMsIG0sICdtaW51dGUnKSB8fFxuICAgIHBsdXJhbChtcywgcywgJ3NlY29uZCcpIHx8XG4gICAgbXMgKyAnIG1zJztcbn1cblxuLyoqXG4gKiBQbHVyYWxpemF0aW9uIGhlbHBlci5cbiAqL1xuXG5mdW5jdGlvbiBwbHVyYWwobXMsIG4sIG5hbWUpIHtcbiAgaWYgKG1zIDwgbikge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAobXMgPCBuICogMS41KSB7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IobXMgLyBuKSArICcgJyArIG5hbWU7XG4gIH1cbiAgcmV0dXJuIE1hdGguY2VpbChtcyAvIG4pICsgJyAnICsgbmFtZSArICdzJztcbn1cbiIsIlxuLyoqXG4gKiBUaGlzIGlzIHRoZSBjb21tb24gbG9naWMgZm9yIGJvdGggdGhlIE5vZGUuanMgYW5kIHdlYiBicm93c2VyXG4gKiBpbXBsZW1lbnRhdGlvbnMgb2YgYGRlYnVnKClgLlxuICpcbiAqIEV4cG9zZSBgZGVidWcoKWAgYXMgdGhlIG1vZHVsZS5cbiAqL1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVEZWJ1Zy5kZWJ1ZyA9IGNyZWF0ZURlYnVnWydkZWZhdWx0J10gPSBjcmVhdGVEZWJ1ZztcbmV4cG9ydHMuY29lcmNlID0gY29lcmNlO1xuZXhwb3J0cy5kaXNhYmxlID0gZGlzYWJsZTtcbmV4cG9ydHMuZW5hYmxlID0gZW5hYmxlO1xuZXhwb3J0cy5lbmFibGVkID0gZW5hYmxlZDtcbmV4cG9ydHMuaHVtYW5pemUgPSByZXF1aXJlKCdtcycpO1xuXG4vKipcbiAqIEFjdGl2ZSBgZGVidWdgIGluc3RhbmNlcy5cbiAqL1xuZXhwb3J0cy5pbnN0YW5jZXMgPSBbXTtcblxuLyoqXG4gKiBUaGUgY3VycmVudGx5IGFjdGl2ZSBkZWJ1ZyBtb2RlIG5hbWVzLCBhbmQgbmFtZXMgdG8gc2tpcC5cbiAqL1xuXG5leHBvcnRzLm5hbWVzID0gW107XG5leHBvcnRzLnNraXBzID0gW107XG5cbi8qKlxuICogTWFwIG9mIHNwZWNpYWwgXCIlblwiIGhhbmRsaW5nIGZ1bmN0aW9ucywgZm9yIHRoZSBkZWJ1ZyBcImZvcm1hdFwiIGFyZ3VtZW50LlxuICpcbiAqIFZhbGlkIGtleSBuYW1lcyBhcmUgYSBzaW5nbGUsIGxvd2VyIG9yIHVwcGVyLWNhc2UgbGV0dGVyLCBpLmUuIFwiblwiIGFuZCBcIk5cIi5cbiAqL1xuXG5leHBvcnRzLmZvcm1hdHRlcnMgPSB7fTtcblxuLyoqXG4gKiBTZWxlY3QgYSBjb2xvci5cbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNlbGVjdENvbG9yKG5hbWVzcGFjZSkge1xuICB2YXIgaGFzaCA9IDAsIGk7XG5cbiAgZm9yIChpIGluIG5hbWVzcGFjZSkge1xuICAgIGhhc2ggID0gKChoYXNoIDw8IDUpIC0gaGFzaCkgKyBuYW1lc3BhY2UuY2hhckNvZGVBdChpKTtcbiAgICBoYXNoIHw9IDA7IC8vIENvbnZlcnQgdG8gMzJiaXQgaW50ZWdlclxuICB9XG5cbiAgcmV0dXJuIGV4cG9ydHMuY29sb3JzW01hdGguYWJzKGhhc2gpICUgZXhwb3J0cy5jb2xvcnMubGVuZ3RoXTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBkZWJ1Z2dlciB3aXRoIHRoZSBnaXZlbiBgbmFtZXNwYWNlYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlRGVidWcobmFtZXNwYWNlKSB7XG5cbiAgdmFyIHByZXZUaW1lO1xuXG4gIGZ1bmN0aW9uIGRlYnVnKCkge1xuICAgIC8vIGRpc2FibGVkP1xuICAgIGlmICghZGVidWcuZW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgdmFyIHNlbGYgPSBkZWJ1ZztcblxuICAgIC8vIHNldCBgZGlmZmAgdGltZXN0YW1wXG4gICAgdmFyIGN1cnIgPSArbmV3IERhdGUoKTtcbiAgICB2YXIgbXMgPSBjdXJyIC0gKHByZXZUaW1lIHx8IGN1cnIpO1xuICAgIHNlbGYuZGlmZiA9IG1zO1xuICAgIHNlbGYucHJldiA9IHByZXZUaW1lO1xuICAgIHNlbGYuY3VyciA9IGN1cnI7XG4gICAgcHJldlRpbWUgPSBjdXJyO1xuXG4gICAgLy8gdHVybiB0aGUgYGFyZ3VtZW50c2AgaW50byBhIHByb3BlciBBcnJheVxuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG5cbiAgICBhcmdzWzBdID0gZXhwb3J0cy5jb2VyY2UoYXJnc1swXSk7XG5cbiAgICBpZiAoJ3N0cmluZycgIT09IHR5cGVvZiBhcmdzWzBdKSB7XG4gICAgICAvLyBhbnl0aGluZyBlbHNlIGxldCdzIGluc3BlY3Qgd2l0aCAlT1xuICAgICAgYXJncy51bnNoaWZ0KCclTycpO1xuICAgIH1cblxuICAgIC8vIGFwcGx5IGFueSBgZm9ybWF0dGVyc2AgdHJhbnNmb3JtYXRpb25zXG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICBhcmdzWzBdID0gYXJnc1swXS5yZXBsYWNlKC8lKFthLXpBLVolXSkvZywgZnVuY3Rpb24obWF0Y2gsIGZvcm1hdCkge1xuICAgICAgLy8gaWYgd2UgZW5jb3VudGVyIGFuIGVzY2FwZWQgJSB0aGVuIGRvbid0IGluY3JlYXNlIHRoZSBhcnJheSBpbmRleFxuICAgICAgaWYgKG1hdGNoID09PSAnJSUnKSByZXR1cm4gbWF0Y2g7XG4gICAgICBpbmRleCsrO1xuICAgICAgdmFyIGZvcm1hdHRlciA9IGV4cG9ydHMuZm9ybWF0dGVyc1tmb3JtYXRdO1xuICAgICAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBmb3JtYXR0ZXIpIHtcbiAgICAgICAgdmFyIHZhbCA9IGFyZ3NbaW5kZXhdO1xuICAgICAgICBtYXRjaCA9IGZvcm1hdHRlci5jYWxsKHNlbGYsIHZhbCk7XG5cbiAgICAgICAgLy8gbm93IHdlIG5lZWQgdG8gcmVtb3ZlIGBhcmdzW2luZGV4XWAgc2luY2UgaXQncyBpbmxpbmVkIGluIHRoZSBgZm9ybWF0YFxuICAgICAgICBhcmdzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIGluZGV4LS07XG4gICAgICB9XG4gICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfSk7XG5cbiAgICAvLyBhcHBseSBlbnYtc3BlY2lmaWMgZm9ybWF0dGluZyAoY29sb3JzLCBldGMuKVxuICAgIGV4cG9ydHMuZm9ybWF0QXJncy5jYWxsKHNlbGYsIGFyZ3MpO1xuXG4gICAgdmFyIGxvZ0ZuID0gZGVidWcubG9nIHx8IGV4cG9ydHMubG9nIHx8IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSk7XG4gICAgbG9nRm4uYXBwbHkoc2VsZiwgYXJncyk7XG4gIH1cblxuICBkZWJ1Zy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG4gIGRlYnVnLmVuYWJsZWQgPSBleHBvcnRzLmVuYWJsZWQobmFtZXNwYWNlKTtcbiAgZGVidWcudXNlQ29sb3JzID0gZXhwb3J0cy51c2VDb2xvcnMoKTtcbiAgZGVidWcuY29sb3IgPSBzZWxlY3RDb2xvcihuYW1lc3BhY2UpO1xuICBkZWJ1Zy5kZXN0cm95ID0gZGVzdHJveTtcblxuICAvLyBlbnYtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gbG9naWMgZm9yIGRlYnVnIGluc3RhbmNlc1xuICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGV4cG9ydHMuaW5pdCkge1xuICAgIGV4cG9ydHMuaW5pdChkZWJ1Zyk7XG4gIH1cblxuICBleHBvcnRzLmluc3RhbmNlcy5wdXNoKGRlYnVnKTtcblxuICByZXR1cm4gZGVidWc7XG59XG5cbmZ1bmN0aW9uIGRlc3Ryb3kgKCkge1xuICB2YXIgaW5kZXggPSBleHBvcnRzLmluc3RhbmNlcy5pbmRleE9mKHRoaXMpO1xuICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgZXhwb3J0cy5pbnN0YW5jZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBFbmFibGVzIGEgZGVidWcgbW9kZSBieSBuYW1lc3BhY2VzLiBUaGlzIGNhbiBpbmNsdWRlIG1vZGVzXG4gKiBzZXBhcmF0ZWQgYnkgYSBjb2xvbiBhbmQgd2lsZGNhcmRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGVuYWJsZShuYW1lc3BhY2VzKSB7XG4gIGV4cG9ydHMuc2F2ZShuYW1lc3BhY2VzKTtcblxuICBleHBvcnRzLm5hbWVzID0gW107XG4gIGV4cG9ydHMuc2tpcHMgPSBbXTtcblxuICB2YXIgaTtcbiAgdmFyIHNwbGl0ID0gKHR5cGVvZiBuYW1lc3BhY2VzID09PSAnc3RyaW5nJyA/IG5hbWVzcGFjZXMgOiAnJykuc3BsaXQoL1tcXHMsXSsvKTtcbiAgdmFyIGxlbiA9IHNwbGl0Lmxlbmd0aDtcblxuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAoIXNwbGl0W2ldKSBjb250aW51ZTsgLy8gaWdub3JlIGVtcHR5IHN0cmluZ3NcbiAgICBuYW1lc3BhY2VzID0gc3BsaXRbaV0ucmVwbGFjZSgvXFwqL2csICcuKj8nKTtcbiAgICBpZiAobmFtZXNwYWNlc1swXSA9PT0gJy0nKSB7XG4gICAgICBleHBvcnRzLnNraXBzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzLnN1YnN0cigxKSArICckJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHBvcnRzLm5hbWVzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzICsgJyQnKSk7XG4gICAgfVxuICB9XG5cbiAgZm9yIChpID0gMDsgaSA8IGV4cG9ydHMuaW5zdGFuY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGluc3RhbmNlID0gZXhwb3J0cy5pbnN0YW5jZXNbaV07XG4gICAgaW5zdGFuY2UuZW5hYmxlZCA9IGV4cG9ydHMuZW5hYmxlZChpbnN0YW5jZS5uYW1lc3BhY2UpO1xuICB9XG59XG5cbi8qKlxuICogRGlzYWJsZSBkZWJ1ZyBvdXRwdXQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBkaXNhYmxlKCkge1xuICBleHBvcnRzLmVuYWJsZSgnJyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBtb2RlIG5hbWUgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBlbmFibGVkKG5hbWUpIHtcbiAgaWYgKG5hbWVbbmFtZS5sZW5ndGggLSAxXSA9PT0gJyonKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdmFyIGksIGxlbjtcbiAgZm9yIChpID0gMCwgbGVuID0gZXhwb3J0cy5za2lwcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGlmIChleHBvcnRzLnNraXBzW2ldLnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgZm9yIChpID0gMCwgbGVuID0gZXhwb3J0cy5uYW1lcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGlmIChleHBvcnRzLm5hbWVzW2ldLnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ29lcmNlIGB2YWxgLlxuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IHZhbFxuICogQHJldHVybiB7TWl4ZWR9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjb2VyY2UodmFsKSB7XG4gIGlmICh2YWwgaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIHZhbC5zdGFjayB8fCB2YWwubWVzc2FnZTtcbiAgcmV0dXJuIHZhbDtcbn1cbiIsIi8qKlxuICogVGhpcyBpcyB0aGUgd2ViIGJyb3dzZXIgaW1wbGVtZW50YXRpb24gb2YgYGRlYnVnKClgLlxuICpcbiAqIEV4cG9zZSBgZGVidWcoKWAgYXMgdGhlIG1vZHVsZS5cbiAqL1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2RlYnVnJyk7XG5leHBvcnRzLmxvZyA9IGxvZztcbmV4cG9ydHMuZm9ybWF0QXJncyA9IGZvcm1hdEFyZ3M7XG5leHBvcnRzLnNhdmUgPSBzYXZlO1xuZXhwb3J0cy5sb2FkID0gbG9hZDtcbmV4cG9ydHMudXNlQ29sb3JzID0gdXNlQ29sb3JzO1xuZXhwb3J0cy5zdG9yYWdlID0gJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGNocm9tZVxuICAgICAgICAgICAgICAgJiYgJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGNocm9tZS5zdG9yYWdlXG4gICAgICAgICAgICAgICAgICA/IGNocm9tZS5zdG9yYWdlLmxvY2FsXG4gICAgICAgICAgICAgICAgICA6IGxvY2Fsc3RvcmFnZSgpO1xuXG4vKipcbiAqIENvbG9ycy5cbiAqL1xuXG5leHBvcnRzLmNvbG9ycyA9IFtcbiAgJyMwMDAwQ0MnLCAnIzAwMDBGRicsICcjMDAzM0NDJywgJyMwMDMzRkYnLCAnIzAwNjZDQycsICcjMDA2NkZGJywgJyMwMDk5Q0MnLFxuICAnIzAwOTlGRicsICcjMDBDQzAwJywgJyMwMENDMzMnLCAnIzAwQ0M2NicsICcjMDBDQzk5JywgJyMwMENDQ0MnLCAnIzAwQ0NGRicsXG4gICcjMzMwMENDJywgJyMzMzAwRkYnLCAnIzMzMzNDQycsICcjMzMzM0ZGJywgJyMzMzY2Q0MnLCAnIzMzNjZGRicsICcjMzM5OUNDJyxcbiAgJyMzMzk5RkYnLCAnIzMzQ0MwMCcsICcjMzNDQzMzJywgJyMzM0NDNjYnLCAnIzMzQ0M5OScsICcjMzNDQ0NDJywgJyMzM0NDRkYnLFxuICAnIzY2MDBDQycsICcjNjYwMEZGJywgJyM2NjMzQ0MnLCAnIzY2MzNGRicsICcjNjZDQzAwJywgJyM2NkNDMzMnLCAnIzk5MDBDQycsXG4gICcjOTkwMEZGJywgJyM5OTMzQ0MnLCAnIzk5MzNGRicsICcjOTlDQzAwJywgJyM5OUNDMzMnLCAnI0NDMDAwMCcsICcjQ0MwMDMzJyxcbiAgJyNDQzAwNjYnLCAnI0NDMDA5OScsICcjQ0MwMENDJywgJyNDQzAwRkYnLCAnI0NDMzMwMCcsICcjQ0MzMzMzJywgJyNDQzMzNjYnLFxuICAnI0NDMzM5OScsICcjQ0MzM0NDJywgJyNDQzMzRkYnLCAnI0NDNjYwMCcsICcjQ0M2NjMzJywgJyNDQzk5MDAnLCAnI0NDOTkzMycsXG4gICcjQ0NDQzAwJywgJyNDQ0NDMzMnLCAnI0ZGMDAwMCcsICcjRkYwMDMzJywgJyNGRjAwNjYnLCAnI0ZGMDA5OScsICcjRkYwMENDJyxcbiAgJyNGRjAwRkYnLCAnI0ZGMzMwMCcsICcjRkYzMzMzJywgJyNGRjMzNjYnLCAnI0ZGMzM5OScsICcjRkYzM0NDJywgJyNGRjMzRkYnLFxuICAnI0ZGNjYwMCcsICcjRkY2NjMzJywgJyNGRjk5MDAnLCAnI0ZGOTkzMycsICcjRkZDQzAwJywgJyNGRkNDMzMnXG5dO1xuXG4vKipcbiAqIEN1cnJlbnRseSBvbmx5IFdlYktpdC1iYXNlZCBXZWIgSW5zcGVjdG9ycywgRmlyZWZveCA+PSB2MzEsXG4gKiBhbmQgdGhlIEZpcmVidWcgZXh0ZW5zaW9uIChhbnkgRmlyZWZveCB2ZXJzaW9uKSBhcmUga25vd25cbiAqIHRvIHN1cHBvcnQgXCIlY1wiIENTUyBjdXN0b21pemF0aW9ucy5cbiAqXG4gKiBUT0RPOiBhZGQgYSBgbG9jYWxTdG9yYWdlYCB2YXJpYWJsZSB0byBleHBsaWNpdGx5IGVuYWJsZS9kaXNhYmxlIGNvbG9yc1xuICovXG5cbmZ1bmN0aW9uIHVzZUNvbG9ycygpIHtcbiAgLy8gTkI6IEluIGFuIEVsZWN0cm9uIHByZWxvYWQgc2NyaXB0LCBkb2N1bWVudCB3aWxsIGJlIGRlZmluZWQgYnV0IG5vdCBmdWxseVxuICAvLyBpbml0aWFsaXplZC4gU2luY2Ugd2Uga25vdyB3ZSdyZSBpbiBDaHJvbWUsIHdlJ2xsIGp1c3QgZGV0ZWN0IHRoaXMgY2FzZVxuICAvLyBleHBsaWNpdGx5XG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cucHJvY2VzcyAmJiB3aW5kb3cucHJvY2Vzcy50eXBlID09PSAncmVuZGVyZXInKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBJbnRlcm5ldCBFeHBsb3JlciBhbmQgRWRnZSBkbyBub3Qgc3VwcG9ydCBjb2xvcnMuXG4gIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvKGVkZ2V8dHJpZGVudClcXC8oXFxkKykvKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIGlzIHdlYmtpdD8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTY0NTk2MDYvMzc2NzczXG4gIC8vIGRvY3VtZW50IGlzIHVuZGVmaW5lZCBpbiByZWFjdC1uYXRpdmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC1uYXRpdmUvcHVsbC8xNjMyXG4gIHJldHVybiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5XZWJraXRBcHBlYXJhbmNlKSB8fFxuICAgIC8vIGlzIGZpcmVidWc/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM5ODEyMC8zNzY3NzNcbiAgICAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmNvbnNvbGUgJiYgKHdpbmRvdy5jb25zb2xlLmZpcmVidWcgfHwgKHdpbmRvdy5jb25zb2xlLmV4Y2VwdGlvbiAmJiB3aW5kb3cuY29uc29sZS50YWJsZSkpKSB8fFxuICAgIC8vIGlzIGZpcmVmb3ggPj0gdjMxP1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvVG9vbHMvV2ViX0NvbnNvbGUjU3R5bGluZ19tZXNzYWdlc1xuICAgICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvZmlyZWZveFxcLyhcXGQrKS8pICYmIHBhcnNlSW50KFJlZ0V4cC4kMSwgMTApID49IDMxKSB8fFxuICAgIC8vIGRvdWJsZSBjaGVjayB3ZWJraXQgaW4gdXNlckFnZW50IGp1c3QgaW4gY2FzZSB3ZSBhcmUgaW4gYSB3b3JrZXJcbiAgICAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2FwcGxld2Via2l0XFwvKFxcZCspLykpO1xufVxuXG4vKipcbiAqIE1hcCAlaiB0byBgSlNPTi5zdHJpbmdpZnkoKWAsIHNpbmNlIG5vIFdlYiBJbnNwZWN0b3JzIGRvIHRoYXQgYnkgZGVmYXVsdC5cbiAqL1xuXG5leHBvcnRzLmZvcm1hdHRlcnMuaiA9IGZ1bmN0aW9uKHYpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiAnW1VuZXhwZWN0ZWRKU09OUGFyc2VFcnJvcl06ICcgKyBlcnIubWVzc2FnZTtcbiAgfVxufTtcblxuXG4vKipcbiAqIENvbG9yaXplIGxvZyBhcmd1bWVudHMgaWYgZW5hYmxlZC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGZvcm1hdEFyZ3MoYXJncykge1xuICB2YXIgdXNlQ29sb3JzID0gdGhpcy51c2VDb2xvcnM7XG5cbiAgYXJnc1swXSA9ICh1c2VDb2xvcnMgPyAnJWMnIDogJycpXG4gICAgKyB0aGlzLm5hbWVzcGFjZVxuICAgICsgKHVzZUNvbG9ycyA/ICcgJWMnIDogJyAnKVxuICAgICsgYXJnc1swXVxuICAgICsgKHVzZUNvbG9ycyA/ICclYyAnIDogJyAnKVxuICAgICsgJysnICsgZXhwb3J0cy5odW1hbml6ZSh0aGlzLmRpZmYpO1xuXG4gIGlmICghdXNlQ29sb3JzKSByZXR1cm47XG5cbiAgdmFyIGMgPSAnY29sb3I6ICcgKyB0aGlzLmNvbG9yO1xuICBhcmdzLnNwbGljZSgxLCAwLCBjLCAnY29sb3I6IGluaGVyaXQnKVxuXG4gIC8vIHRoZSBmaW5hbCBcIiVjXCIgaXMgc29tZXdoYXQgdHJpY2t5LCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG90aGVyXG4gIC8vIGFyZ3VtZW50cyBwYXNzZWQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgJWMsIHNvIHdlIG5lZWQgdG9cbiAgLy8gZmlndXJlIG91dCB0aGUgY29ycmVjdCBpbmRleCB0byBpbnNlcnQgdGhlIENTUyBpbnRvXG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBsYXN0QyA9IDA7XG4gIGFyZ3NbMF0ucmVwbGFjZSgvJVthLXpBLVolXS9nLCBmdW5jdGlvbihtYXRjaCkge1xuICAgIGlmICgnJSUnID09PSBtYXRjaCkgcmV0dXJuO1xuICAgIGluZGV4Kys7XG4gICAgaWYgKCclYycgPT09IG1hdGNoKSB7XG4gICAgICAvLyB3ZSBvbmx5IGFyZSBpbnRlcmVzdGVkIGluIHRoZSAqbGFzdCogJWNcbiAgICAgIC8vICh0aGUgdXNlciBtYXkgaGF2ZSBwcm92aWRlZCB0aGVpciBvd24pXG4gICAgICBsYXN0QyA9IGluZGV4O1xuICAgIH1cbiAgfSk7XG5cbiAgYXJncy5zcGxpY2UobGFzdEMsIDAsIGMpO1xufVxuXG4vKipcbiAqIEludm9rZXMgYGNvbnNvbGUubG9nKClgIHdoZW4gYXZhaWxhYmxlLlxuICogTm8tb3Agd2hlbiBgY29uc29sZS5sb2dgIGlzIG5vdCBhIFwiZnVuY3Rpb25cIi5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGxvZygpIHtcbiAgLy8gdGhpcyBoYWNrZXJ5IGlzIHJlcXVpcmVkIGZvciBJRTgvOSwgd2hlcmVcbiAgLy8gdGhlIGBjb25zb2xlLmxvZ2AgZnVuY3Rpb24gZG9lc24ndCBoYXZlICdhcHBseSdcbiAgcmV0dXJuICdvYmplY3QnID09PSB0eXBlb2YgY29uc29sZVxuICAgICYmIGNvbnNvbGUubG9nXG4gICAgJiYgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZS5sb2csIGNvbnNvbGUsIGFyZ3VtZW50cyk7XG59XG5cbi8qKlxuICogU2F2ZSBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNhdmUobmFtZXNwYWNlcykge1xuICB0cnkge1xuICAgIGlmIChudWxsID09IG5hbWVzcGFjZXMpIHtcbiAgICAgIGV4cG9ydHMuc3RvcmFnZS5yZW1vdmVJdGVtKCdkZWJ1ZycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHBvcnRzLnN0b3JhZ2UuZGVidWcgPSBuYW1lc3BhY2VzO1xuICAgIH1cbiAgfSBjYXRjaChlKSB7fVxufVxuXG4vKipcbiAqIExvYWQgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGxvYWQoKSB7XG4gIHZhciByO1xuICB0cnkge1xuICAgIHIgPSBleHBvcnRzLnN0b3JhZ2UuZGVidWc7XG4gIH0gY2F0Y2goZSkge31cblxuICAvLyBJZiBkZWJ1ZyBpc24ndCBzZXQgaW4gTFMsIGFuZCB3ZSdyZSBpbiBFbGVjdHJvbiwgdHJ5IHRvIGxvYWQgJERFQlVHXG4gIGlmICghciAmJiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgJ2VudicgaW4gcHJvY2Vzcykge1xuICAgIHIgPSBwcm9jZXNzLmVudi5ERUJVRztcbiAgfVxuXG4gIHJldHVybiByO1xufVxuXG4vKipcbiAqIEVuYWJsZSBuYW1lc3BhY2VzIGxpc3RlZCBpbiBgbG9jYWxTdG9yYWdlLmRlYnVnYCBpbml0aWFsbHkuXG4gKi9cblxuZXhwb3J0cy5lbmFibGUobG9hZCgpKTtcblxuLyoqXG4gKiBMb2NhbHN0b3JhZ2UgYXR0ZW1wdHMgdG8gcmV0dXJuIHRoZSBsb2NhbHN0b3JhZ2UuXG4gKlxuICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzYWZhcmkgdGhyb3dzXG4gKiB3aGVuIGEgdXNlciBkaXNhYmxlcyBjb29raWVzL2xvY2Fsc3RvcmFnZVxuICogYW5kIHlvdSBhdHRlbXB0IHRvIGFjY2VzcyBpdC5cbiAqXG4gKiBAcmV0dXJuIHtMb2NhbFN0b3JhZ2V9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2NhbHN0b3JhZ2UoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHdpbmRvdy5sb2NhbFN0b3JhZ2U7XG4gIH0gY2F0Y2ggKGUpIHt9XG59XG4iLCIvLyBJbXBvcnQgc3R5bGVzIChhdXRvbWF0aWNhbGx5IGluamVjdCBpbnRvIDxoZWFkPikuXG4vLyBpbXBvcnQgJy4uL3N0eWxlcy9tYWluLmNzcyc7XG5pbXBvcnQge2F4aXN9IGZyb20gJy4vbW9kdWxlcy9heGlzJztcbmltcG9ydCB7YmFyfSBmcm9tICcuL21vZHVsZXMvYmFyJztcbmltcG9ydCB7YnViYmxlSGVhdG1hcH0gZnJvbSAnLi9tb2R1bGVzL2J1YmJsZS1oZWF0bWFwJztcbmltcG9ydCB7Ym94d2hpc2tlcn0gZnJvbSAnLi9tb2R1bGVzL2JveC13aGlza2VyJztcbmltcG9ydCB7Y29sb3JGdW5jdGlvbn0gZnJvbSAnLi9tb2R1bGVzL2NvbG9yLWZ1bmN0aW9uJztcbmltcG9ydCB7ZGF0YXRvZ2dsZX0gZnJvbSAnLi9tb2R1bGVzL2RhdGEtdG9nZ2xlJztcbmltcG9ydCB7Z3JvdXBpbmdTcGFjZXJ9IGZyb20gJy4vbW9kdWxlcy9ncm91cGluZy1zcGFjZXInO1xuaW1wb3J0IHt0b29sdGlwfSBmcm9tICcuL21vZHVsZXMvdG9vbHRpcCc7XG5pbXBvcnQge3NjYXR0ZXJ9IGZyb20gJy4vbW9kdWxlcy9zY2F0dGVyJztcbmltcG9ydCB7cGxvdFpvb219IGZyb20gJy4vbW9kdWxlcy9wbG90LXpvb20nO1xuaW1wb3J0IHt2aW9saW59IGZyb20gJy4vbW9kdWxlcy92aW9saW4nO1xuaW1wb3J0IHtwb2ludHN9IGZyb20gJy4vbW9kdWxlcy9wb2ludHMnO1xuXG5pbXBvcnQge3VuaXF1ZUVsZW1lbnRzLCBnZXRUcmFuc2xhdGlvbiwgbW9kaWZ5SGV4aWRlY2ltYWxDb2xvckx1bWluYW5jZSwgdGlja1JhbmdlLFxucXVhcnRpbGVzLCBleHRyYWN0VmlvbGluVmFsdWVzLCBoeXBlbmF0ZSwgcm91bmQsIGdldENvbnRhaW5pbmdTVkcsXG5pbnRlcnBvbGF0ZUNvbG9ycywgdHJ1bmNhdGVUZXh0LCBzYWZlU2VsZWN0fSBmcm9tICcuL21vZHVsZXMvaGVscGVycyc7XG5cbmltcG9ydCB7XG4gIGFsbCwgdGFsbHksIGhhc1EsIGZpcnN0LCBsYXN0LCB0b3RhbCwgdW5pcXVlLCBnZXQsIGxpc3RPZkxpc3RzUSxcbiAgY3V0LCBncm91cEJ5LCBhcnJheUVxdWFscywgZWxlbWVudHNBdExldmVscywgbnVtYmVyT2ZFbGVtZW50cyxcbiAgZmxhdHRlbiwgd2hpY2hCaW5cbn0gZnJvbSAnLi9tb2R1bGVzL2FycmF5LWZ1bmN0aW9ucyc7XG5cblxuaW1wb3J0IHtcbiAgc2V0dXBTdGFuZGFyZENoYXJ0Q29udGFpbmVycywgbG9nIGFzIG15TG9nLCB3YXJuLCBpbmZvLCBlcnJvcixcbiAgY29uc29sZUdyb3VwLCBjb25zb2xlR3JvdXBFbmRcbn0gZnJvbSAnLi9tb2R1bGVzL3V0aWxzJztcblxuLy8gLyoqIEBtb2R1bGUgZDNzbSAqL1xudmFyIGQzc20gPSB7fTtcbmQzc20uYXhpcyA9IGF4aXM7XG5kM3NtLmJhciA9IGJhcjtcbmQzc20uYnViYmxlSGVhdG1hcCA9IGJ1YmJsZUhlYXRtYXA7XG5kM3NtLmJveHdoaXNrZXIgPSBib3h3aGlza2VyO1xuZDNzbS5jb2xvckZ1bmN0aW9uID0gY29sb3JGdW5jdGlvbjtcbmQzc20uZGF0YXRvZ2dsZSA9IGRhdGF0b2dnbGU7XG5kM3NtLmdyb3VwaW5nU3BhY2VyID0gZ3JvdXBpbmdTcGFjZXI7XG5kM3NtLnRvb2x0aXAgPSB0b29sdGlwO1xuZDNzbS5zY2F0dGVyID0gc2NhdHRlcjtcbmQzc20ucGxvdFpvb20gPSBwbG90Wm9vbTtcbmQzc20udmlvbGluID0gdmlvbGluO1xuZDNzbS5wb2ludHMgPSBwb2ludHM7XG5cbmQzc20udW5pcXVlRWxlbWVudHMgPSB1bmlxdWVFbGVtZW50cztcbmQzc20uZ2V0VHJhbnNsYXRpb24gPSBnZXRUcmFuc2xhdGlvbjtcbmQzc20ubW9kaWZ5SGV4aWRlY2ltYWxDb2xvckx1bWluYW5jZSA9IG1vZGlmeUhleGlkZWNpbWFsQ29sb3JMdW1pbmFuY2U7XG5kM3NtLnRpY2tSYW5nZSA9IHRpY2tSYW5nZTtcbmQzc20ucXVhcnRpbGVzID0gcXVhcnRpbGVzO1xuZDNzbS5leHRyYWN0VmlvbGluVmFsdWVzID0gZXh0cmFjdFZpb2xpblZhbHVlcztcbmQzc20uaHlwZW5hdGUgPSBoeXBlbmF0ZTtcbmQzc20ucm91bmQgPSByb3VuZDtcbmQzc20uZ2V0Q29udGFpbmluZ1NWRyA9IGdldENvbnRhaW5pbmdTVkc7XG5kM3NtLmludGVycG9sYXRlQ29sb3JzID0gaW50ZXJwb2xhdGVDb2xvcnM7XG5kM3NtLnRydW5jYXRlVGV4dCA9IHRydW5jYXRlVGV4dDtcbmQzc20uc2FmZVNlbGVjdCA9IHNhZmVTZWxlY3Q7XG5cbmQzc20ud2hpY2hCaW4gPSB3aGljaEJpbjtcbmQzc20udW5pcXVlID0gdW5pcXVlO1xuXG5kM3NtLnNldHVwU3RhbmRhcmRDaGFydENvbnRhaW5lcnMgPSBzZXR1cFN0YW5kYXJkQ2hhcnRDb250YWluZXJzO1xuZDNzbS5sb2cgPSBteUxvZztcbmQzc20ud2FybiA9IHdhcm47XG5kM3NtLmluZm8gPSBpbmZvO1xuZDNzbS5lcnJvciA9IGVycm9yO1xuZDNzbS5jb25zb2xlR3JvdXAgPSBjb25zb2xlR3JvdXA7XG5kM3NtLmNvbnNvbGVHcm91cEVuZCA9IGNvbnNvbGVHcm91cEVuZDtcblxuZDNzbS5kZWJ1Z1EgPSBmYWxzZVxuXG5cblxuLy8gSW1wb3J0IGEgbG9nZ2VyIGZvciBlYXNpZXIgZGVidWdnaW5nXG5pbXBvcnQgZGVidWcgZnJvbSAnZGVidWcnO1xuY29uc3QgbG9nID0gZGVidWcoJ2FwcDpsb2cnKTtcblxuLy8gVGhlIGxvZ2dlciBzaG91bGQgb25seSBiZSBkaXNhYmxlZCBpZiB3ZSdyZSBub3QgaW4gcHJvZHVjdGlvbi5cbmlmIChFTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAvLyBFbmFibGUgdGhlIGxvZ2dlci5cbiAgZGVidWcuZW5hYmxlKCcqJyk7XG4gIGxvZygnTG9nZ2luZyBpcyBlbmFibGVkIScpO1xuXG4gIC8vIEVuYWJsZSBMaXZlUmVsb2FkXG4gIGRvY3VtZW50LndyaXRlKFxuICAgICc8c2NyaXB0IHNyYz1cImh0dHA6Ly8nXG4gICAgKyAobG9jYXRpb24uaG9zdCB8fCAnbG9jYWxob3N0Jykuc3BsaXQoJzonKVswXVxuICAgICsgJzozNTcyOS9saXZlcmVsb2FkLmpzP3NuaXB2ZXI9MVwiPjwvJ1xuICAgICsgJ3NjcmlwdD4nXG4gICk7XG59IGVsc2Uge1xuICBkZWJ1Zy5kaXNhYmxlKCk7XG59XG5cbndpbmRvdy5kM3NtID0gZDNzbTtcbiJdLCJuYW1lcyI6WyJ1bmlxdWVFbGVtZW50cyIsInZhbHVlIiwiaW5kZXgiLCJzZWxmIiwiaW5kZXhPZiIsImdldFRyYW5zbGF0aW9uIiwidHJhbnNmb3JtIiwiZyIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudE5TIiwidW5kZWZpbmVkIiwic2V0QXR0cmlidXRlTlMiLCJtYXRyaXgiLCJiYXNlVmFsIiwiY29uc29saWRhdGUiLCJlIiwiZiIsIm1vZGlmeUhleGlkZWNpbWFsQ29sb3JMdW1pbmFuY2UiLCJoZXgiLCJsdW0iLCJTdHJpbmciLCJyZXBsYWNlIiwibGVuZ3RoIiwicmdiIiwiYyIsImkiLCJwYXJzZUludCIsInN1YnN0ciIsIk1hdGgiLCJyb3VuZCIsIm1pbiIsIm1heCIsInRvU3RyaW5nIiwicXVhcnRpbGVzIiwiZGF0YSIsInFLZXlzIiwicTIiLCJkMyIsIm1lZGlhbiIsImxvd2VyIiwiZmlsdGVyIiwieCIsInVwcGVyIiwicTEiLCJxMCIsInEzIiwicTQiLCJrMCIsImsxIiwiazIiLCJrMyIsIms0Iiwib2JqIiwiZXh0cmFjdFZpb2xpblZhbHVlcyIsInZpb2xpbktleXMiLCJ2YWx1ZUV4dHJhY3RvckZ1bmN0aW9uIiwiaG9yaXpvbnRhbFEiLCJxS2V5IiwibWFwIiwiayIsImQiLCJiaW5uZWQiLCJoaXN0b2dyYW0iLCJmcmVxdWVuY2llcyIsIm1pblBvaW50IiwieSIsIm1heFBvaW50IiwicG9pbnRzIiwiYmluIiwieDAiLCJ4MSIsInF1YXJ0cyIsIm8iLCJ2YWx1ZXMiLCJjb25jYXQiLCJoeXBlbmF0ZSIsIkFycmF5IiwicHJvdG90eXBlIiwic2xpY2UiLCJjYWxsIiwiYXJndW1lbnRzIiwiam9pbiIsIm51bWJlciIsInByZWNpc2lvbiIsInNoaWZ0IiwicmV2ZXJzZVNoaWZ0IiwibnVtQXJyYXkiLCJzcGxpdCIsImdldENvbnRhaW5pbmdTVkciLCJlbGVtZW50IiwicGFyZW50IiwicGFyZW50RWxlbWVudCIsInRhZyIsInRhZ05hbWUiLCJ0b0xvd2VyQ2FzZSIsImludGVycG9sYXRlQ29sb3JzIiwiaW50ZXJwb2xhdGVSZ2JCYXNpcyIsInRydW5jYXRlVGV4dCIsInQiLCJ0ZXh0Iiwib3JpZW50IiwidGlja0xlbmd0aCIsInNwYWNlIiwib3ZlcmZsb3dRIiwicmVjdCIsIm5vZGUiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJ3aWR0aCIsImhlaWdodCIsInNhZmVTZWxlY3QiLCJzZWwiLCJjbHMiLCJjbHNTdHIiLCJzU2VsIiwic2VsZWN0IiwiZW1wdHkiLCJhcHBlbmQiLCJjbGFzc2VkIiwiYXR0ciIsInRpY2tSYW5nZSIsIm4iLCJhIiwicyIsInB1c2giLCJoYXNRIiwiYXJyYXkiLCJpdGVtIiwiaW5jbHVkZXMiLCJ0b3RhbCIsInJlZHVjZSIsImIiLCJ1bmlxdWUiLCJmbGF0dGVuIiwiZmxhdCIsImlzQXJyYXkiLCJ3aGljaEJpbiIsImJpbnMiLCJqIiwiY29uc29sZUdyb3VwIiwibmFtZSIsIndpbmRvdyIsImQzc20iLCJkZWJ1Z1EiLCJjb25zb2xlIiwiZ3JvdXAiLCJjb25zb2xlR3JvdXBFbmQiLCJncm91cEVuZCIsImxvZyIsImZ1bmMiLCJtc2ciLCJ0YWJsZSIsIndhcm4iLCJpbmZvIiwiZXJyb3IiLCJzZXR1cFN0YW5kYXJkQ2hhcnRDb250YWluZXJzIiwic2VsZWN0aW9uIiwibmFtZXNwYWNlIiwidyIsImF2YWlsYWJsZVdpZHRoIiwiaW5uZXJXaWR0aCIsImgiLCJhdmFpbGFibGVIZWlnaHQiLCJpbm5lckhlaWdodCIsIm1hcmdpbnMiLCJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiLCJwZXJjZW50YWdlcyIsImF4ZXMiLCJ4QXhpc1BlcmNlbnQiLCJ5QXhpc1BlcmNlbnQiLCJwZXJjZW50T2ZTcGFjZUZvcldpZHRoIiwicGVyY2VudE9mU3BhY2VGb3JIZWlnaHQiLCJzdmdTcGFjZSIsImNoYXJ0U3BhY2UiLCJheGVzU3BhY2UiLCJkcmF3aW5nU3BhY2UiLCJ5QXhpc1JlY3QiLCJwbG90UmVjdCIsInhBeGlzUmVjdCIsImNvbnRhaW5lciIsInN0eWxlIiwicGxvdCIsInhBeGlzIiwieUF4aXMiLCJzdmciLCJjcFJlY3QiLCJkZWZzIiwiY3AiLCJyYWlzZSIsImJnUmVjdCIsImZpbGwiLCJzZXR1cENvbnRhaW5lciIsImJnIiwib2JqZWN0Q29udGFpbmVyIiwiY2FsY3VsYXRlV2lkdGhPZk9iamVjdCIsImZyZWVTcGFjZSIsIm51bWJlck9mT2JqZWN0cyIsIm1pbk9iamVjdFdpZHRoIiwibWF4T2JqZWN0V2lkdGgiLCJzaXplT2ZTcGFjZXIiLCJudW1iZXJPZlNwYWNlcnMiLCJzcGFjZVRha2VuQnlTcGFjZXJzIiwicmVtYWluaW5nU3BhY2UiLCJvYmplY3RXaWR0aCIsImNhbGN1bGF0ZVdpZHRoT2ZTcGFjZXIiLCJiYXNlU3BhY2VyU2l6ZSIsImxpbWl0ZWROdW1iZXJPZk9iamVjdHMiLCJzcGFjZUxlZnQiLCJzcGFjZXJzQXRFYWNoTGV2ZWwiLCJzcGFjZXJzTmVlZGVkQXRFYWNoTGV2ZWwiLCJ0b3RhbFNwYWNlclBlcmNlbnQiLCJsZXZlbCIsImxldmVsRGF0YSIsIndoaXNrZXJQYXRoIiwiZGlyIiwicGVyIiwiaGgiLCJwIiwid3ciLCJncm91cGluZ1NwYWNlciIsInNjYWxlIiwic2NhbGVMaW5lYXIiLCJtb3ZlYnkiLCJvYmplY3RDbGFzcyIsIm9iamVjdFNpemUiLCJzcGFjZXJTaXplIiwidHJhbnNpdGlvbkR1cmF0aW9uIiwiZWFzZUZ1bmMiLCJlYXNlU2luIiwiZW50ZXJGdW5jdGlvbiIsImN1ciIsImV4aXRGdW5jdGlvbiIsImN1cnJlbnQiLCJjdXJyZW50Tm9kZSIsInRyYW5zaXRpb24iLCJkdXJhdGlvbiIsImVhc2UiLCJyZW1vdmUiLCJyZWN1cnNpdmVseVBvc2l0aW9uIiwiXyIsImN1cnJlbnRTZWxlY3Rpb24iLCJzZWxlY3RBbGwiLCJlbnRlciIsImV4aXQiLCJtZXJnZSIsImVhY2giLCJsZXZlbFNwYWNlciIsIm1vdmUiLCJjdXJyZW50RWxlbWVudCIsInRvUmVtb3ZlIiwic2l6ZSIsImF4aXMiLCJzcGFjZVgiLCJzcGFjZVkiLCJjYXRlZ29yaWNhbFEiLCJndWlkZUxpbmVzUSIsImdyb3VwaW5nIiwiZG9tYWluUGFkZGluZyIsIm9iamVjdFNwYWNlciIsIm1pbk9iamVjdFNpemUiLCJtYXhPYmplY3RTaXplIiwiYmFja2dyb3VuZEZpbGwiLCJ0aWNrTGFiZWxzIiwidGlja1ZhbHVlcyIsIm51bWJlck9mVGlja3MiLCJsaW5lU3Ryb2tlIiwibGluZVN0cm9rZVdpZHRoIiwidGlja1N0cm9rZSIsInRpY2tTdHJva2VXaWR0aCIsInRpY2tMYWJlbEZvbnRTaXplIiwidGlja0xhYmVsTWluRm9udFNpemUiLCJ0aWNrTGFiZWxNYXhGb250U2l6ZSIsInRpY2tMYWJlbFRleHRBbmNob3IiLCJ0aWNrTGFiZWxSb3RhdGlvbiIsInRpY2tMYWJlbEZ1bmMiLCJndWlkZWxpbmVTcGFjZSIsImd1aWRlTGluZVN0cm9rZSIsImd1aWRlTGluZVN0cm9rZVdpZHRoIiwiZWFzZUV4cCIsInJvdW5kVG8iLCJ2ZXJ0aWNhbFEiLCJiZ2NwUmVjdCIsInRpY2tEYXRhIiwiZXh0ZW50IiwiZmxhdFRpY2tEYXRhIiwiZG9tYWluIiwicmFuZ2UiLCJvYmpDbGFzcyIsInNwYWNlckZ1bmN0aW9uIiwidGlja0VudGVyQW5pbWF0aW9uIiwibXQiLCJkYXR1bSIsImRpc3QiLCJ0aWNrRXhpdEFuaW1hdGlvbiIsIm1vdmVYQnkiLCJtb3ZlWUJ5IiwidGlja3MiLCJ0aGF0IiwidGljayIsImxhYmVsIiwiciIsImdsaW5lIiwibGluZSIsImNvbG9yRnVuY3Rpb24iLCJjb2xvcnMiLCJpbnRlcnBvbGF0aW9uIiwiaW50ZXJwb2xhdGVSZ2IiLCJtb2RpZnlPcGFjaXR5Iiwic3Ryb2tlT3BhY2l0eSIsImZpbGxPcGFjaXR5IiwiY29sb3JCeSIsImRhdGFFeHRlbnQiLCJ2YWx1ZUV4dHJhY3RvciIsInYiLCJpbnRlcnBvbGF0ZSIsImhlbHBlclNjYWxlIiwibWF0Y2giLCJrZXkiLCJ0eXBlIiwiaG92ZXJRIiwib3BhYyIsInVwZGF0ZVNjYWxlIiwidG9vbHRpcCIsImtleXMiLCJoZWFkZXIiLCJ0YXJnZXRDbGFzcyIsIm9uIiwibW91c2Vtb3ZlIiwiY3VycmVudERhdGEiLCJtb3VzZSIsImRpdiIsImNhcmRCb2R5IiwiY2FyZFRpdGxlIiwidEJvZHkiLCJ0ciIsInJvd0tleSIsInJvd0luZGV4IiwiYmFyIiwic29ydGluZ0Z1bmN0aW9uIiwia2V5QSIsImtleUIiLCJkZXNjZW5kaW5nIiwiYmFyU3Ryb2tlV2lkdGgiLCJDRiIsImJhcktleXMiLCJiYXJWYWx1ZXMiLCJUVGlwIiwib3JkZXJlZCIsInNvcnQiLCJkZWZhdWx0RXhpdCIsInBhcmVudEluZGV4QXJyYXkiLCJOdW1iZXIiLCJmaWxsQ29sb3IiLCJzdHJva2VDb2xvciIsImJ1YmJsZUhlYXRtYXAiLCJ4S2V5IiwieUtleSIsInJLZXkiLCJ2S2V5IiwieEV4dHJhY3RvciIsInlFeHRyYWN0b3IiLCJyRXh0cmFjdG9yIiwidkV4dHJhY3RvciIsImJ1YmJsZVN0cm9rZVdpZHRoIiwiY2VsbEtleXMiLCJ4VmFsdWVzIiwieVZhbHVlcyIsInJWYWx1ZXMiLCJ2VmFsdWVzIiwieEtleVNvcnRpbmdGdW5jdGlvbiIsInlLZXlTb3J0aW5nRnVuY3Rpb24iLCJyS2V5U29ydGluZ0Z1bmN0aW9uIiwieFNpemUiLCJ4U3BhY2VyU2l6ZSIsInlTaXplIiwieVNwYWNlclNpemUiLCJiaG0iLCJ4RGltIiwieURpbSIsInlTcGFjZXIiLCJ4U3BhY2VyIiwiY2VsbHMiLCJyYWRpdXMiLCJib3h3aGlza2VyIiwicXVhcnRpbGVzS2V5IiwicXVhcnRpbGVzS2V5cyIsIndoaXNrZXJXaWR0aFBlcmNlbnQiLCJib3hTdHJva2VXaWR0aCIsIndoaXNrZXJTdHJva2VXaWR0aCIsImJveEtleXMiLCJib3hWYWx1ZXMiLCJ3aGlzayIsInVXaGlzayIsImxXaGlzayIsInF1YXJ0IiwidVF1YXJ0IiwibFF1YXJ0IiwibVF1YXJ0IiwiZGlmIiwiZGQiLCJpaSIsImRhdGF0b2dnbGUiLCJ1cGRhdGVGdW5jdGlvbiIsImN1cnJlbnRLZXkiLCJ0b2dnbGUiLCJkYXRhb3B0cyIsImRvRW50ZXIiLCJwcm9wZXJ0eSIsInNjYXR0ZXIiLCJzY2FsZVgiLCJkb21haW5QYWRkaW5nWCIsInZhbHVlRXh0cmFjdG9yWCIsInNjYWxlWSIsImRvbWFpblBhZGRpbmdZIiwidmFsdWVFeHRyYWN0b3JZIiwic2NhbGVSIiwiZG9tYWluUGFkZGluZ1IiLCJ2YWx1ZUV4dHJhY3RvclIiLCJtaW5SYWRpdXMiLCJtYXhSYWRpdXMiLCJwb2ludFN0cm9rZVdpZHRoIiwicG9pbnRLZXlzIiwidmFsdWVzWCIsInZhbHVlc1kiLCJ2YWx1ZXNSIiwiZXh0ZW50WCIsImV4dGVudFkiLCJleHRlbnRSIiwicEVudGVyIiwicEV4aXQiLCJhZGRFdmVudExpc3RlbmVyIiwicGxvdFpvb20iLCJjaGFydCIsImV2ZW50VHlwZSIsIndoZWVsU3BlZWQiLCJ4TG9jayIsInlMb2NrIiwiY2hhcnRTZWwiLCJ4QXhpc1NlbCIsInlBeGlzU2VsIiwiem9vbSIsInNldExvY2tzIiwiY2hhcnRPYmpTZWwiLCJjaGFydE9ialRyYW5zIiwiY29zIiwiZ2V0QkJveCIsImV2ZW50IiwiY2hhcnRCb3giLCJ4QXhpc0JveCIsInlBeGlzQm94IiwiY2hhcnRXaWR0aCIsImNoYXJ0SGVpZ2h0IiwieEF4aXNXaWR0aCIsInhBeGlzSGVpZ2h0IiwieUF4aXNXaWR0aCIsInlBeGlzSGVpZ2h0IiwicHJldmVudERlZmF1bHQiLCJkZWx0YVkiLCJzaGlmdFEiLCJzaGlmdEtleSIsImFwcGx5WCIsImFwcGx5WSIsInhBeGlzT2JqU2VsIiwieUF4aXNPYmpTZWwiLCJ4QXhpc09ialRyYW5zIiwieUF4aXNPYmpUcmFucyIsInJlc2V0IiwidmlvbGluIiwicG9pbnRzUSIsIm9iamVjdFN0cm9rZVdpZHRoIiwicG9pbnRDb2xvckZ1bmMiLCJiYXNlIiwibWluTWF4SGV4U2NhbGUiLCJzY2FsZWRDb2xvciIsIm1vZCIsInBvaW50UmFkaXVzIiwicXVhcnRpbGVLZXlzIiwidmlvbGluVmFsdWVzIiwicG9pbnRzVG9vbHRpcCIsInF1YXJ0aWxlS2V5IiwiY2FsY1ZhbHVlcyIsIm5lZWRlZFZpb2xpblZhbHVlcyIsInZpb2xpblBvaW50c0V4dHJhY3RvciIsInZpb2xpblBvaW50VmFsdWVFeHRyYWN0b3IiLCJ2ayIsImZyZXF1ZW5jeU1heCIsInZTY2FsZSIsImxBcmVhIiwiY3VydmUiLCJjdXJ2ZUJhc2lzIiwickFyZWEiLCJhcmVhIiwibGEiLCJyYSIsImxxMyIsImxxMSIsImNvbnRvdXIiLCJwdHNDb250YWluZXIiLCJwdHMiLCJwdHNFeGl0IiwicHRzRW50ZXIiLCJwb2ludEtleSIsInBvaW50VmFsdWVzIiwicmFuZG9tIiwiY3JlYXRlRXZlbnQiLCJpbml0RXZlbnQiLCJkaXNwYXRjaEV2ZW50IiwiY1YiLCJ0b29sdGlwS2V5IiwidmlvbGluS2V5IiwidmlvbGluRGF0YSIsInZpb2xpblBvaW50S2V5IiwidmlvbGluUG9pbnREYXRhIiwiY2FsY3VsYXRlVmlvbGluVmFsdWVzIiwidmlvbGluUG9pbnRzIiwidmlvbGluUG9pbnRzS2V5cyIsInZpb2xpblBvaW50c1ZhbHVlcyIsInBrIiwicG9pbnRRdWFydGlsZXMiLCJtaW5Db250b3VyUG9pbnQiLCJtYXhDb250b3VyUG9pbnQiLCJ2aW9saW5Db250b3VyUG9pbnRzIiwia2V5RXh0cmFjdG9yIiwicHRzQ29udGFpbmVycyIsIm5vZGVzIiwicmVxdWlyZSQkMCIsIm1zIiwibXlMb2ciLCJkZWJ1ZyIsImVuYWJsZSIsIndyaXRlIiwibG9jYXRpb24iLCJob3N0Il0sIm1hcHBpbmdzIjoiOzs7RUFBQTtFQUNBOzs7Ozs7O0VBT0E7Ozs7Ozs7QUFPQSxFQUFPLFNBQVNBLGNBQVQsQ0FBd0JDLEtBQXhCLEVBQStCQyxLQUEvQixFQUFzQ0MsSUFBdEMsRUFBNEM7RUFBRSxTQUFPQSxLQUFLQyxPQUFMLENBQWFILEtBQWIsTUFBd0JDLEtBQS9CO0VBQXVDOztFQUU1Rjs7Ozs7QUFLQSxFQUFPLFNBQVNHLGNBQVQsQ0FBd0JDLFNBQXhCLEVBQW1DO0VBQ3hDO0VBQ0E7RUFDQTtFQUNBLE1BQUlDLElBQUlDLFNBQVNDLGVBQVQsQ0FBeUIsNEJBQXpCLEVBQXVELEdBQXZELENBQVI7RUFDQTtFQUNBSCxjQUFZQSxhQUFhSSxTQUFiLEdBQXlCLGdCQUF6QixHQUE0Q0osU0FBeEQ7RUFDQUMsSUFBRUksY0FBRixDQUFpQixJQUFqQixFQUF1QixXQUF2QixFQUFvQ0wsU0FBcEM7RUFDQTtFQUNBO0VBQ0E7RUFD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 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZDNzbS5taW4uanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JpcHRzL21vZHVsZXMvaGVscGVycy5qcyIsIi4uLy4uL3NyYy9zY3JpcHRzL21vZHVsZXMvYXJyYXktZnVuY3Rpb25zLmpzIiwiLi4vLi4vc3JjL3NjcmlwdHMvbW9kdWxlcy91dGlscy5qcyIsIi4uLy4uL3NyYy9zY3JpcHRzL21vZHVsZXMvZ3JvdXBpbmctc3BhY2VyLmpzIiwiLi4vLi4vc3JjL3NjcmlwdHMvbW9kdWxlcy9heGlzLmpzIiwiLi4vLi4vc3JjL3NjcmlwdHMvbW9kdWxlcy9jb2xvci1mdW5jdGlvbi5qcyIsIi4uLy4uL3NyYy9zY3JpcHRzL21vZHVsZXMvdG9vbHRpcC5qcyIsIi4uLy4uL3NyYy9zY3JpcHRzL21vZHVsZXMvYmFyLmpzIiwiLi4vLi4vc3JjL3NjcmlwdHMvbW9kdWxlcy9idWJibGUtaGVhdG1hcC5qcyIsIi4uLy4uL3NyYy9zY3JpcHRzL21vZHVsZXMvYm94LXdoaXNrZXIuanMiLCIuLi8uLi9zcmMvc2NyaXB0cy9tb2R1bGVzL2RhdGEtdG9nZ2xlLmpzIiwiLi4vLi4vc3JjL3NjcmlwdHMvbW9kdWxlcy9zY2F0dGVyLmpzIiwiLi4vLi4vc3JjL3NjcmlwdHMvbW9kdWxlcy9wbG90LXpvb20uanMiLCIuLi8uLi9zcmMvc2NyaXB0cy9tb2R1bGVzL3Zpb2xpbi5qcyIsIi4uLy4uL3NyYy9zY3JpcHRzL21vZHVsZXMvcG9pbnRzLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL21zL2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9kZWJ1Zy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvYnJvd3Nlci5qcyIsIi4uLy4uL3NyYy9zY3JpcHRzL21haW4uanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gaW1wb3J0IHtoYXNRfSBmcm9tICcuL2FycmF5LWZ1bmN0aW9ucyc7XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEVMUEVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqXG4qIEhlbHBlciBmdW5jdGlvbiBmb3IgQXJyYXkuZmlsdGVyIHRvIGdldCB1bmlxdWUgZWxlbWVudHMgb2YgdGhlIGFycmF5XG4qIEBwYXJhbSB7Kn0gdmFsdWUgY3VycmVudCB2YWx1ZSBhcyBtYXBwaW5nIG92ZXIgYXJyYXkgKHNlbGYpXG4qIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBjdXJyZW50IGluZGV4IGluIHRoZSBhcnJheVxuKiBAcGFyYW0ge0FycmF5fSBzZWxmIHBhc3NlZCBhcnJheSBmcm9tIEFycmF5LmZpbHRlciBtZXRob2RcbiogQHJldHVybnMge2Jvb2xlYW59IHdoZXRoZXIgb3Igbm90IHZhbHVlIGlzIHRoZSBmaXJzdCBvZiBpdHMga2luZCAoaS5lLiBpbmRleE9mKHZhbHVlKSA9PSBpbmRleClcbiovXG5leHBvcnQgZnVuY3Rpb24gdW5pcXVlRWxlbWVudHModmFsdWUsIGluZGV4LCBzZWxmKSB7IHJldHVybiBzZWxmLmluZGV4T2YodmFsdWUpID09PSBpbmRleDsgfVxuXG4vKipcbiogRXh0cmFjdHMgeCBhbmQgeSBvZiB0cmFuc2xhdGUgZnJvbSB0cmFuc2Zvcm0gcHJvcGVydHlcbiogQHBhcmFtIHtzdHJpbmd9IHRyYW5zZm9ybSB0cmFuc2Zvcm0gcHJvcGVydHkgb2Ygc3ZnIGVsZW1lbnRcbiogQHJldHVybnMge251bWJlcltdfSB4LCB5IG9mIHRyYW5zbGF0ZSh4LCB5KVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUcmFuc2xhdGlvbih0cmFuc2Zvcm0pIHtcbiAgLy8gQ3JlYXRlIGEgZHVtbXkgZyBmb3IgY2FsY3VsYXRpb24gcHVycG9zZXMgb25seS4gVGhpcyB3aWxsIG5ldmVyXG4gIC8vIGJlIGFwcGVuZGVkIHRvIHRoZSBET00gYW5kIHdpbGwgYmUgZGlzY2FyZGVkIG9uY2UgdGhpcyBmdW5jdGlvblxuICAvLyByZXR1cm5zLlxuICB2YXIgZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnZycpO1xuICAvLyBTZXQgdGhlIHRyYW5zZm9ybSBhdHRyaWJ1dGUgdG8gdGhlIHByb3ZpZGVkIHN0cmluZyB2YWx1ZS5cbiAgdHJhbnNmb3JtID0gdHJhbnNmb3JtID09IHVuZGVmaW5lZCA/ICd0cmFuc2xhdGUoMCwwKScgOiB0cmFuc2Zvcm07XG4gIGcuc2V0QXR0cmlidXRlTlMobnVsbCwgJ3RyYW5zZm9ybScsIHRyYW5zZm9ybSk7XG4gIC8vIGNvbnNvbGlkYXRlIHRoZSBTVkdUcmFuc2Zvcm1MaXN0IGNvbnRhaW5pbmcgYWxsIHRyYW5zZm9ybWF0aW9uc1xuICAvLyB0byBhIHNpbmdsZSBTVkdUcmFuc2Zvcm0gb2YgdHlwZSBTVkdfVFJBTlNGT1JNX01BVFJJWCBhbmQgZ2V0XG4gIC8vIGl0cyBTVkdNYXRyaXguXG4gIHZhciBtYXRyaXggPSBnLnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCkubWF0cml4O1xuICAvLyBBcyBwZXIgZGVmaW5pdGlvbiB2YWx1ZXMgZSBhbmQgZiBhcmUgdGhlIG9uZXMgZm9yIHRoZSB0cmFuc2xhdGlvbi5cbiAgcmV0dXJuIFttYXRyaXguZSwgbWF0cml4LmZdO1xufVxuXG5cbi8qKlxuKiBNb2RpZmllcyBsdW1pbmFuY2Ugb2YgaGV4aWRlY2ltYWwgbnVtYmVyXG4qIEBwYXJhbSB7c3RyaW5nfSBoZXggc2hvdWxkIGJlIGhleGlkZWNpbWFsIHZhbHVlIHdpdGggb3Igd2l0aG91dCB0aGUgcHJvY2VlZGluZyBvY3RvdHJvcGVcbiogQHBhcmFtIHtudW1iZXJ9IGx1bSB2YWx1ZSB0byBpbmNyZWFzZSBvciBkZWNyZWFzZSBsdW1pbm9zaXR5IGJ5XG4qIEByZXR1cm5zIHtzdHJpbmd9IHVwZGF0ZWQgaGV4aWRlY2ltYWwgdmFsdWUgd2l0aG91dCB0aGUgcHJvY2VlZGluZyBvY3RvdHJvcGVcbiovXG5leHBvcnQgZnVuY3Rpb24gbW9kaWZ5SGV4aWRlY2ltYWxDb2xvckx1bWluYW5jZShoZXgsIGx1bSkge1xuICAvLyB2YWxpZGF0ZSBoZXggc3RyaW5nXG4gIHZhciBoZXggPSBTdHJpbmcoaGV4KS5yZXBsYWNlKC9bXjAtOWEtZl0vZ2ksICcnKTtcblxuICBpZiAoaGV4Lmxlbmd0aCA8IDYpIHtcbiAgICBoZXggPSBoZXhbMF0raGV4WzBdK2hleFsxXStoZXhbMV0raGV4WzJdK2hleFsyXTtcblx0fVxuXHRsdW0gPSBsdW0gfHwgMDtcblxuXHQvLyBjb252ZXJ0IHRvIGRlY2ltYWwgYW5kIGNoYW5nZSBsdW1pbm9zaXR5XG5cdHZhciByZ2IgPSAnIycsIGMsIGk7XG5cdGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHtcblx0XHRjID0gcGFyc2VJbnQoaGV4LnN1YnN0cihpKjIsMiksIDE2KTtcblx0XHRjID0gTWF0aC5yb3VuZChNYXRoLm1pbihNYXRoLm1heCgwLCBjICsgKGMgKiBsdW0pKSwgMjU1KSkudG9TdHJpbmcoMTYpO1xuXHRcdHJnYiArPSAoJzAwJytjKS5zdWJzdHIoYy5sZW5ndGgpO1xuXHR9XG5cblx0cmV0dXJuIHJnYjtcbn1cblxuXG4vKipcbiogQGRlcHJlY2F0ZWQgQHNlZXtAbGluayB0aWNrUmFuZ2V9XG4qIEBwYXJhbSB7bnVtYmVyfSBtaW5cbiogQHBhcmFtIHtudW1iZXJ9IG1heFxuKiBAcGFyYW0ge251bWJlcn0gcGFydHNcbiogQHJldHVybnMge251bWJlcltdfSBhcnJheSBvZiBsZW5ndGggcGFydHMgZXZlbmx5IHBhcnRpdGlvbmVkIGJldHdlZW4gbWluIGFuZCBtYXhcbiovXG5leHBvcnQgZnVuY3Rpb24gcGFydGl0aW9uUmFuZ2VJbnRvKG1pbiwgbWF4LCBwYXJ0cykge1xuICB2YXIgZGlmZiA9IG1heCAtIG1pblxuICByZXR1cm4gQXJyYXkocGFydHMpLm1hcChmdW5jdGlvbiAoZSwgaSkgeyByZXR1cm4gbWluICsgZGlmZiAvIHBhcnRzICogaSB9KVxufVxuXG5cbi8qKlxuKiBDYWxjdWxhdGVkIHRoZSBxdWFydGlsZXMgb2YgdGhlIHBhc3NlZCBkYXRhIGFuZCBzdG9yZXMgdGhlbSB3aXRoIHFLZXlzXG4qIEBwYXJhbSB7bnVtYmVyW119IGRhdGEgbGlzdCBvZiBudW1lcmljYWwgdmFsdWVzXG4qIEBwYXJhbSB7c3RyaW5nW119IFtxS2V5cz1bJ3EwJywgJ3ExJywgJ3EyJywgJ3EzJywgJ3E0J11dIGhvdyByZXR1cm5lZCBvYmplY3Qgd2l0aCBxdWFydGlsZXMgc2hvdWxkIGJlIHN0b3JlZFxuKiBAcmV0dXJucyB7T2JqZWN0fSB3aXRoIGtleXMgcUtleXMgZ2l2aW5nIG9ubHkgdGhlIG51bWVyaWNhbCB2YWx1ZXMgZm9yIHRoZSBxdWFydGlsZXNcbiovXG5leHBvcnQgZnVuY3Rpb24gcXVhcnRpbGVzKGRhdGEsIHFLZXlzKSB7XG4gIHZhclxuICBxMiA9IGQzLm1lZGlhbihkYXRhKSxcbiAgbG93ZXIgPSBkYXRhLmZpbHRlcih4ID0+IHggPCBxMiksXG4gIHVwcGVyID0gZGF0YS5maWx0ZXIoeCA9PiB4ID4gcTIpLFxuXG4gIHExID0gZDMubWVkaWFuKGxvd2VyKSxcbiAgcTEgPSBxMSA9PSB1bmRlZmluZWQgPyBxMiA6IHExLFxuXG4gIHEwID0gZDMubWluKGxvd2VyKSxcbiAgcTAgPSBxMCA9PSB1bmRlZmluZWQgPyBxMSA6IHEwLFxuXG4gIHEzID0gZDMubWVkaWFuKHVwcGVyKSxcbiAgcTMgPSBxMyA9PSB1bmRlZmluZWQgPyBxMiA6IHEzLFxuXG4gIHE0ID0gZDMubWF4KHVwcGVyKSxcbiAgcTQgPSBxNCA9PSB1bmRlZmluZWQgPyBxMyA6IHE0LFxuXG4gIGswID0gJ3EwJywgazEgPSAncTEnLCBrMiA9ICdxMicsIGszID0gJ3EzJywgazQgPSAncTQnLFxuICBvYmogPSB7fVxuICBpZiAocUtleXMhPXVuZGVmaW5lZCAmJiBxS2V5cy5sZW5ndGggPT0gNSkgeyBrMCA9IHFLZXlzWzBdOyBrMSA9IHFLZXlzWzFdOyBrMiA9IHFLZXlzWzJdOyBrMyA9IHFLZXlzWzNdOyBrNCA9IHFLZXlzWzRdOyB9XG4gIG9ialtrMF0gPSBxMDsgb2JqW2sxXSA9IHExOyBvYmpbazJdID0gcTI7IG9ialtrM10gPSBxMzsgb2JqW2s0XSA9IHE0O1xuXG4gIHJldHVybiBvYmpcbn1cblxuXG4vKipcbiogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCBhbGwgdmFsdWVzIG5lZWRlZCBpbiBtYWtpbmcgdmlvbGluIHBsb3RzXG4qIEBwYXJhbSB7c3RyaW5nW119IHZpb2xpbktleXNcbiogQHBhcmFtIHtudW1iZXJbXX0gZGF0YVxuKiBAcGFyYW0ge0Z1bmN0aW9ufSB2YWx1ZUV4dHJhY3RvckZ1bmN0aW9uIGhvdyB0byBnZXQgdmFsdWVzIGZyb20gZGF0YVt2aW9saW5LZXlzW2ldXVxuKiBAcGFyYW0ge2Jvb2xlYW59IGhvcml6b250YWxRIHdoZXRoZXIgb3Igbm90IHZpb2xpbnMgd2lsbCBiZSByZW5kZXJlZCBob3Jpem9udGFsbHkgb3IgdmVydGljYWxseVxuKiBAcGFyYW0ge3N0cmluZ30gcUtleSBob3cgdGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBxdWFydGlsZXMgc2hvdWxkIGJlIGxhYmVsZWQgYXNcbiogQHBhcmFtIHtzdHJpbmdbXX0gcUtleXMgaG93IGVhY2ggcXVhcnRpbGUgc2hvdWxkIGJlIGxhYmVsZWQgYXNcbiogQHJldHVybnMge09iamVjdH0gcmVxdWlyZWQgZm9yIEBzZWV7QGxpbmsgdmlvbGlufSBjb250YWluaW5nIGtleXMgdmFsdWVzLCBiaW5ubmVkLCBmcmVxdWVuY2llcywgcG9pbnRzLCBhbmQgcXVhcnRpbGVzXG4qIEBzZWV7QGxpbmsgcXVhcnRpbGVzfVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0VmlvbGluVmFsdWVzKFxuICB2aW9saW5LZXlzLFxuICBkYXRhLFxuICB2YWx1ZUV4dHJhY3RvckZ1bmN0aW9uLFxuICBob3Jpem9udGFsUSxcbiAgcUtleSxcbiAgcUtleXNcbil7XG4gIHZhciBvYmogPSB7fVxuICB2aW9saW5LZXlzLm1hcChmdW5jdGlvbihrLCBpKXtcbiAgICAgdmFyIGQgPSB2YWx1ZUV4dHJhY3RvckZ1bmN0aW9uKGssIGksIGRhdGEpLFxuICAgICBiaW5uZWQgPSBkMy5oaXN0b2dyYW0oKShkKSxcbiAgICAgZnJlcXVlbmNpZXMgPSBiaW5uZWQubWFwKHg9PngubGVuZ3RoKSxcbiAgICAgbWluUG9pbnQgPSBob3Jpem9udGFsUSA/IHt5OiBkMy5taW4oZCksIHg6IDB9IDoge3g6IGQzLm1pbihkKSwgeTogMH0sXG4gICAgIG1heFBvaW50ID0gaG9yaXpvbnRhbFEgPyB7eTogZDMubWF4KGQpLCB4OiAwfSA6IHt4OiBkMy5tYXgoZCksIHk6IDB9LFxuICAgICBwb2ludHMgPSBiaW5uZWQubWFwKGZ1bmN0aW9uKGJpbiwgaSkge1xuICAgICAgIHJldHVybiBob3Jpem9udGFsUVxuICAgICAgID8ge3k6IChiaW4ubGVuZ3RoKSA/IGQzLm1lZGlhbihiaW4pOiBkMy5tZWRpYW4oW2Jpbi54MCwgYmluLngxXSksIHg6IGZyZXF1ZW5jaWVzW2ldfVxuICAgICAgIDoge3g6IChiaW4ubGVuZ3RoKSA/IGQzLm1lZGlhbihiaW4pOiBkMy5tZWRpYW4oW2Jpbi54MCwgYmluLngxXSksIHk6IGZyZXF1ZW5jaWVzW2ldfVxuICAgICB9KSxcbiAgICAgcXVhcnRzID0gcXVhcnRpbGVzKGQsIHFLZXlzKSxcbiAgICAgbyA9IHtcbiAgICAgICB2YWx1ZXM6IGQsXG4gICAgICAgYmlubmVkOiBiaW5uZWQsXG4gICAgICAgZnJlcXVlbmNpZXM6IGZyZXF1ZW5jaWVzLFxuICAgICAgIHBvaW50czogW21pblBvaW50XS5jb25jYXQocG9pbnRzKS5jb25jYXQoW21heFBvaW50XSlcbiAgICAgfVxuICAgICBvW3FLZXldID0gcXVhcnRzO1xuICAgICBvYmpba10gPSBvO1xuICAgfSk7XG4gICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiogSHlwZW5hdGVzIGFsbCBzdHJpbmdzIHRvZ2V0aGVyXG4qIEBwYXJhbSB7c3RyaW5nW119IGFyZ3VtZW50c1xuKiBAcmV0dXJucyB7c3RyaW5nfSBcImFyZzEtYXJnMi0uLi4tYXJnblwiXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGh5cGVuYXRlKCl7IHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLmpvaW4oJy0nKSB9XG5cblxuLyoqXG4qIFJvdW5kcyBkZWNpbWFscyBvZiBudW1iZXIgdG8gcHJlY2lzaW9uXG4qIEBwYXJhbSB7bnVtYmVyfSBudW1iZXJcbiogQHBhcmFtIHtudW1iZXJ9IHByZWNpc2lvblxuKiBAcmV0dXJucyB7bnVtYmVyfSByb3VuZGVkIHRvIHByZWNpc2lvblxuKi9cbmV4cG9ydCBmdW5jdGlvbiByb3VuZChudW1iZXIsIHByZWNpc2lvbikge1xuICB2YXIgc2hpZnQgPSBmdW5jdGlvbiAobnVtYmVyLCBwcmVjaXNpb24sIHJldmVyc2VTaGlmdCkge1xuICAgIGlmIChyZXZlcnNlU2hpZnQpIHtcbiAgICAgIHByZWNpc2lvbiA9IC1wcmVjaXNpb247XG4gICAgfVxuICAgIHZhciBudW1BcnJheSA9ICgnJyArIG51bWJlcikuc3BsaXQoJ2UnKTtcbiAgICByZXR1cm4gKyhudW1BcnJheVswXSArICdlJyArIChudW1BcnJheVsxXSA/ICgrbnVtQXJyYXlbMV0gKyBwcmVjaXNpb24pIDogcHJlY2lzaW9uKSk7XG4gIH07XG4gIHJldHVybiBzaGlmdChNYXRoLnJvdW5kKHNoaWZ0KG51bWJlciwgcHJlY2lzaW9uLCBmYWxzZSkpLCBwcmVjaXNpb24sIHRydWUpO1xufVxuXG4vKipcbiogcmVjdXJzaXZlbHkgYXNjZW5kcyBlbGVtZW50LnBhcmVudEVsZW1lbnQgdG8gZmluZCBhIHN2ZyB0YWdcbiogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4qIEByZXR1cm5zIHtFbGVtZW50IHwgdW5kZWZpbmVkfVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb250YWluaW5nU1ZHKGVsZW1lbnQpIHtcbiAgdmFyIHBhcmVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudFxuICB2YXIgdGFnID0gcGFyZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKVxuICBpZiAodGFnID09PSAnc3ZnJykgeyByZXR1cm4gcGFyZW50OyB9XG4gIGlmICh0YWcgPT09ICdodG1sJykgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIHJldHVybiBnZXRDb250YWluaW5nU1ZHKHBhcmVudCk7XG59XG5cbi8qKlxuKiBNYXBzIGFyZ3VtZW50cyBpbiB0byBkMy5pbnRlcnBvbGF0ZVJnYkJhc2lzXG4qIEBwYXJhbSBhcmd1bWVudHNcbiogQHJldHVybnMge0Z1bmN0aW9ufVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcnBvbGF0ZUNvbG9ycygpe3JldHVybiBkMy5pbnRlcnBvbGF0ZVJnYkJhc2lzKGFyZ3VtZW50cyl9XG5cblxuLyoqXG4qIFRyeXMgdG8gcmVkdWNlIHRleHQgdG8gZml0IGluIHNwZWNpZmllZCBhcmVhLCBtYWRlIGZvciB0aWNrIGxhYmVscyBhcyBjYWxsZWQgYnlcbiogQHNlZXtAbGluayBheGlzfVxuKiBAcGFyYW0ge2QzLnNlbGVjdGlvbn0gdCBjb250YWluZXIgZm9yIHNwZWNpZmljIGF4aXMgdGlja1xuKiBAcGFyYW0ge3N0cmluZ30gdGV4dCB0byBiZSB0aGUgbGFiZWwgb2YgdGhlIHBhc3NlZCBheGlzIHRpY2tcbiogQHBhcmFtIHtib29sZWFufSBvcmllbnQgb2YgdGhlIGF4aXMsIHRydWUgaXMgaG9yaXpvbnRhbCwgZmFsc2UgaXMgdmVydGljYWxcbiogQHBhcmFtIHtudW1iZXJ9IHRpY2tMZW5ndGggaXMgdGhlIGxlbmd0aCBvZiB0aGUgdGV4dFxuKiBAcGFyYW0ge251bWJlcn0gc3BhY2UgaXMgdGhlIGFtb3VudCBvZiBhdmFpbGJsZSBzcGFjZSBmb3IgdGhlIHRleHQgYW5kIHRoZSB0aWNrIHRvIGZpdCBpblxuKiBAcGFyYW0ge2Jvb2xlYW59IG92ZXJmbG93USB3aGV0aGVyIG9yIG5vdCBhbGxvd2VkIHRvIGdvIG92ZXIgdGhlIGFsbG90ZWQgc3BhY2VcbiogQHJldHVybnMge25vbmV9XG4qL1xuZXhwb3J0IGZ1bmN0aW9uIHRydW5jYXRlVGV4dCh0LCB0ZXh0LCBvcmllbnQsIHRpY2tMZW5ndGgsIHNwYWNlLCBvdmVyZmxvd1EpIHtcbiAgdmFyIHJlY3QgPSB0Lm5vZGUoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICB0LnRleHQodGV4dClcbiAgd2hpbGUgKE1hdGgubWF4KHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KSA+IHNwYWNlIC0gdGlja0xlbmd0aCkge1xuICAgIHRleHQgPSBTdHJpbmcodGV4dClcbiAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCB0ZXh0Lmxlbmd0aCAtIDEpXG4gICAgdC50ZXh0KHRleHQgKyAnLi4uJylcbiAgICByZWN0ID0gdC5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICBpZiAodGV4dC5sZW5ndGggPT0gMCkgYnJlYWtcbiAgfVxufVxuXG5cbi8qKlxuKiBUcnlzIHRvIHVzZSBkMy5zZWxlY3Rpb24gdG8gZ2V0IGVsZW1lbnQsIGlmIGl0IGRvZXNudCBleGlzdCwgbWFrZXMgb25lXG4qIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBzZWwgc2VsZWN0aW9uIGluIHdoaWNoIHRvIHRyeSBhbmQgZmluZCBvYmplY3RcbiogQHBhcmFtIHtzdHJpbmd9IHRhZyB0YWcgb2Ygd2hpY2ggdG8gdHJ5IGFuZCBzZWxlY3RcbiogQHBhcmFtIHtzdHJpbmd9IFtjbHM9JyddIGNsYXNzIG9mIHRhZyB0byB0cnkgYW5kIGdyYWJcbiogQHJldHVybnMge2QzLnNlbGVjdGlvbn0gb2YgZWl0aGVyIGFwcGVuZCBvciBzZWxlY3RlZCB0YWcuY2xzIHdpdGhpbiBzZWxcbiovXG5leHBvcnQgZnVuY3Rpb24gc2FmZVNlbGVjdChzZWwsIHRhZywgY2xzKSB7XG4gIHZhciBjbHNTdHIgPSBjbHMgPT0gdW5kZWZpbmVkID8gJycgOiAnLicrY2xzO1xuICB2YXIgc1NlbCA9IHNlbC5zZWxlY3QodGFnK2Nsc1N0cikuZW1wdHkoKVxuICA/IHNlbC5hcHBlbmQodGFnKVxuICA6IHNlbC5zZWxlY3QodGFnK2Nsc1N0cilcbiAgcmV0dXJuIHNTZWxcbiAgLmNsYXNzZWQoY2xzU3RyLnJlcGxhY2UoJy4nLCAnJyksIHRydWUpXG4gIC5hdHRyKCd0cmFuc2Zvcm0nLCBzU2VsLmF0dHIoJ3RyYW5zZm9ybScpID09IHVuZGVmaW5lZCA/ICd0cmFuc2xhdGUoMCwwKScgOiBzU2VsLmF0dHIoJ3RyYW5zZm9ybScpKVxufVxuXG4vKipcbiogZXZlbmx5IHBhcnRpdGlvbnMgdGhlIHJhbmdlIFttaW4sIG1heF0gaW50byBuIHBhcnRzXG4qIEBwYXJhbSB7bnVtYmVyfSBtaW5cbiogQHBhcmFtIHtudW1iZXJ9IG1heFxuKiBAcGFyYW0ge251bWJlcn0gblxuKiBAcmV0dXJucyB7bnVtYmVyW119IGFycmF5IG9mIGxlbmd0aCBuIGV2ZW5seSBwYXJ0aXRpb25lZCBiZXR3ZWVuIG1pbiBhbmQgbWF4XG4qL1xuZXhwb3J0IGZ1bmN0aW9uIHRpY2tSYW5nZShtaW4sIG1heCwgbikge1xuICB2YXIgYSA9IFttaW5dXG4gIHZhciBkID0gbWF4LW1pblxuICB2YXIgcyA9IGQgLyAobi0xKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IG4tMjsgaSsrKSB7IGEucHVzaChtaW4gKyBzICogKGkrMSkpIH1cbiAgYS5wdXNoKG1heClcbiAgcmV0dXJuIGFcbn1cbiIsImltcG9ydCB7dW5pcXVlRWxlbWVudHN9IGZyb20gJy4vaGVscGVycyc7XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1RPVFlQRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqXG4qIFRoaXMgZnVuY3Rpb24gdGVzdHMgdG8gc2VlIGlmIGFsbCBlbGVtZW50cyBvZiB0aGUgcGFzc2VkIGFycmF5IGFyZSB0cnVlLlxuKiBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiB2YWx1ZXNcbiogQHBhcmFtIHtGdW5jdGlvbn0gW2Z1bmMgZnVuY3Rpb24odmFsdWUpe3JldHVybiB2YWx1ZSA9PSB0cnVlO31dIGlzIGFwcGxpZWQgdG8gZWFjaCB2YWx1ZSBvZiB0aGUgYXJyYXkgYW5kIHNob3VsZCByZXR1cm4gYSBib29sZWFuLlxuKiBAcmV0dXJucyB7Ym9vbGVhbn0gaWYgYWxsIHZhbHVlcyBhcmUgdHJ1ZSBieSBmdW5jdGlvblxuKi9cbmV4cG9ydCBmdW5jdGlvbiBhbGwoIGFycmF5LCBmdW5jICkge1xuICBpZiAoZnVuYyA9PSB1bmRlZmluZWQpIHsgcmV0dXJuIGFycmF5LmV2ZXJ5KCBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWUgPT09IHRydWU7IH0pOyB9XG4gIHJldHVybiBhcnJheS5ldmVyeSggZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIGZ1bmModmFsdWUpOyB9ICk7XG59XG5cbi8qKlxuKiBDb3VudHMgdGhlIG51bWJlciBvZiBvY2N1cmFuY2VzIG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgZ2l2ZW4gYXJyYXkuXG4qIEBwYXJhbSB7QXJyYXl9IGFycmF5IG9mIGVsZW1lbnRzXG4qIEByZXR1cm5zIHtPYmplY3R9IG9mIGtleTogdmFsdWUgcGFpcnMgd2hlcmUga2V5IGlzIGFuIGVsZW1lbnQgaW4gdGhlIGFycmF5IGFuZCB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIGl0IG9jY3Vycy5cbiovXG5leHBvcnQgZnVuY3Rpb24gdGFsbHkoIGFycmF5ICkge1xuICB2YXIgdGFsbGllcyA9IHt9O1xuICBhcnJheS5tYXAoIGZ1bmN0aW9uICggZWxlbWVudCApIHtcbiAgICBpZiAoIGhhc1EoT2JqZWN0LmtleXModGFsbGllcyksIGVsZW1lbnQpICkgeyB0YWxsaWVzW2VsZW1lbnRdID0gMTsgfVxuICAgIGVsc2UgeyB0YWxsaWVzW2VsZW1lbnRdICs9IDE7IH1cbiAgfSk7XG4gIHJldHVybiB0YWxsaWVzO1xufVxuLyoqXG4qIFNob3J0LWhhbmQgZm9yIGFycmF5LmluY2x1ZGVzKGl0ZW0pO1xuKiBAcGFyYW0ge0FycmF5fSBhcnJheVxuKiBAcGFyYW0geyp9IGl0ZW0gdG8gdGVzdCBpZiBjb250YWluZWQgaW4gIHthcnJheX1cbiogQHJldHVybnMge2Jvb2xlYW59XG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1EoIGFycmF5LCBpdGVtICkgeyByZXR1cm4gYXJyYXkuaW5jbHVkZXMoaXRlbSk7IH1cblxuLyoqXG4qIFJldHVybnMgZmlyc3QgaXRlbSBpbiBhcnJheVxuKiBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiBpdGVtc1xuKiBAcmV0dXJucyB7Kn0gYXJyYXlbMF1cbiovXG5leHBvcnQgZnVuY3Rpb24gZmlyc3QoIGFycmF5ICkgeyByZXR1cm4gYXJyYXlbMF07IH1cblxuLyoqXG4qIFJldHVybnMgbGFzdCBpdGVtIGluIGFycmF5XG4qIEBwYXJhbSB7QXJyYXl9IGFycmF5IG9mIGl0ZW1zXG4qIEByZXR1cm5zIHsqfSBhcnJheVthcnJheS5sZW5ndGgtMV1cbiovXG5leHBvcnQgZnVuY3Rpb24gbGFzdCggYXJyYXkgKSB7IHJldHVybiBhcnJheVthcnJheS5sZW5ndGgtMV07IH1cblxuLyoqXG4qIENhbGN1bGF0ZXMgdGhlIHRvdGFsIHZhbHVlIG9mIG51bWJlcnMgaW4gcGFzc2VkIGFycmF5XG4qIEBwYXJhbSB7bnVtYmVyW119IGFycmF5IG9mIG51bWVyaWNhbCB2YWx1ZXNcbiogQHJldHVybnMge251bWJlcn0gc3VtIG92ZXIgZWxlbWVudHMgaW4gYXJyYXlcbiovXG5leHBvcnQgZnVuY3Rpb24gdG90YWwoIGFycmF5ICkgeyByZXR1cm4gYXJyYXkucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCkgfTtcblxuLyoqXG4qIFJlbW92ZXMgZHVwbGljYXRlcyBpbiBhcnJheVxuKiBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiBpdGVtc1xuKiBAcmV0dXJucyB7QXJyYXl9IG9mIGl0ZW1zIHN1Y2ggdGhhdCBpdGVtX2kgIT0gaXRlbV9qIGZvciBhbGwgaSA8IGpcbiogQHNlZXtAbGluayB1bmlxdWVFbGVtZW50c30gZm9yIHRoZSBmaWx0ZXJpbmcgZnVuY3Rpb25cbiovXG5leHBvcnQgZnVuY3Rpb24gdW5pcXVlKCBhcnJheSApIHsgcmV0dXJuIGFycmF5LmZpbHRlciggdW5pcXVlRWxlbWVudHMgKTsgfVxuXG4vKipcbiogRmlsdGVycyBwYXNzZWQgYXJyYXkgZm9yIHNwZWNpZmllZCBpbmRpY2llc1xuKiBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiBpdGVtc1xuKiBAcGFyYW0ge251bWJlcltdfSBwb3NpdGlvbnMgb2YgaW50ZWdlcnMgc3VjaCB0aGF0IGkgPCBhcnJheS5sZW5ndGhcbiogQHJldHVybnMge0FycmF5fSBvZiBpdGVtcyBzdWNoIHRoYXQgZm9yIGFueSBpdGVtX2ksIHBvc2l0aW9ucy5pbmNsdWRlcyhpKSA9PT0gdHJ1ZVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXQoIGFycmF5LCBwb3NpdGlvbnMgKSB7XG4gIHJldHVybiBhcnJheS5maWx0ZXIoIGZ1bmN0aW9uKCB2YWx1ZSwgaW5kZXggKSB7IHJldHVybiBoYXNRKHBvc2l0aW9ucywgaW5kZXgpOyB9ICk7XG59XG5cbi8qKlxuKiBEZXRlcm1pbmVzIGlmIGFsbCBlbGVtZW50cyBpbiBwYXNzZWQgYXJyYXkgYXJlIGFycmF5cyB0aGVtc2VsdmVzLlxuKiBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiBpdGVtc1xuKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiBBcnJheS5pc0FycmF5KGUpIGlzIHRydWUgZm9yIGFsbCBlIGluIGFycmF5XG4qIEBzZWV7QGxpbmsgYWxsfVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0T2ZMaXN0c1EoIGFycmF5ICkge1xuICByZXR1cm4gYWxsKCBhcnJheS5tYXAoIGZ1bmN0aW9uKCBlbGVtZW50LCBpbmRleCApIHsgcmV0dXJuIEFycmF5LmlzQXJyYXkoZWxlbWVudCkgfSApIClcbn1cblxuLyoqXG4qIEJ1aWx0IG9uIHRvcCBvZiBAc2Vle0BsaW5rIGdldH0sIG1hcHBpbmcgaWYgcG9zaXRpb25zIGlzIGEgbGlzdCBvZiBsaXN0cyAoQHNlZXtAbGluayBsaXN0T2ZMaXN0c1F9KVxuKiBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiBpdGVtc1xuKiBAcGFyYW0ge251bWJlcltdIHwgW11udW1iZXJbXSB9IHBvc2l0aW9ucyBvZiBpbnRlZ2VycyBvciBsaXN0IG9mIHBvc2l0aW9ucyBvZiBpbnRlZ2Vyc1xuKiBAcmV0dXJucyB7Ym9vbGVhbn0gcmV0dXJucyBzcGVjaWZpZWQgcG9zaXRpb25zIGZyb20gYXJyYXkuIElmIG5lc3RlZCBwb3NpdGlvbnMgcGFzc2VkLCByZXR1cm5zIHJlcXVlc3RlZCBpdGVtcyBpbiBzYW1lIHN0cnVjdHVyZS5cbiovXG5leHBvcnQgZnVuY3Rpb24gY3V0KCBhcnJheSwgcG9zaXRpb25zICkge1xuICBpZiAoIGxpc3RPZkxpc3RzUShhcnJheSkgKSB7IHJldHVybiBwb3NpdGlvbnMubWFwKGZ1bmN0aW9uKHBvcywgaSkgeyByZXR1cm4gYXJyYXkuZ2V0KHBvcyk7IH0pOyB9XG4gIHJldHVybiBnZXQoIGFycmF5LCBwb3NpdGlvbnMgKTtcbn1cblxuLyoqXG4qIEdpdmVuIGFuIGFycmF5IG9mIG9iamVjdHMsIGNvbnN0cnVjdHMgbmV3IG9iamVjdHMgd2hlcmUgZWFjaCB2YWx1ZSBpcyBhIGxpc3RcbiogYmFzZWQgb24gdGhlIGNvcnJlc29uZGluZyBrZXksIHdoaWNoIGlzIGV4dHJhY3RlZCBieSB0aGUgcGFyYW1ldGVyIGJ5XG4qIEBwYXJhbSB7T2JqZWN0c1tdfSBhcnJheSBvZiBvYmplY3RzXG4qIEBwYXJhbSB7c3RyaW5nfSBieSBrZXkgd2l0aGluIGFsbCBvYmplY3RzIG9mIHBhc3NlZCBhcnJheVxuKiBAcGFyYW0ge3N0cmluZ1tdfSBbZ3JvdXBzXSBzYXZlcyBzb21lIGNvbXB1dGF0aW9uIGlmIGFsbCBrbm93biB2YWx1ZXMgZXh0cmFjdGVkIGJ5IG1hcHBpbmcgb3ZlciB0aGUgcGFyYW1ldGVyIGJ5IGFyZSBwYXNzZWRcbiogQHJldHVybnMge09iamVjdH0gb2Yga2V5IHZhbHVlIHBhaXJzLCB3aGVyZSBrZXlzIGFyZSBhbGwgdmFsdWVzIG9mIHRoZSBrZXkgYnkgZnJvbSBhbiBvYmplY3QgaW4gdGhlIHBhc3NlZCBhcnJheSBhbmQgdGhlIHZhbHVlIGFyZSB0aG9zZSBjb3JyZXNwb25kaW5nIG9iamVjdHMuXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwQnkgKGFycmF5LCBieSwgZ3JvdXBzKSB7XG4gIGlmIChncm91cHMgPT0gdW5kZWZpbmVkKSB7XG4gICAgZ3JvdXBzID0gdW5pcXVlKGFycmF5Lm1hcChmdW5jdGlvbihlbGVtZW50cywgaW5kZXgpeyByZXR1cm4gZWxlbWVudFtieV07IH0pKTtcbiAgICBncm91cHMubWFwKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCl7Z3JvdXBwZWRbdmFsdWVdID0gW119KVxuICB9XG5cbiAgdmFyIGdyb3VwcGVkID0ge307XG4gIGFycmF5Lm1hcChmdW5jdGlvbihlbGVtZW50LCBpbmRleCl7Z3JvdXBwZWRbZWxlbWVudFtieV1dLnB1c2goZWxlbWVudCl9KTtcbiAgcmV0dXJuIGdyb3VwcGVkXG59XG5cbi8qKlxuKiBUZXN0cyBpZiB0d28gYXJyYXlzIGFyZSBlcXVpdmFsZW50XG4qIEBwYXJhbSB7QXJyYXl9IGFycmF5XG4qIEBwYXJhbSB7QXJyYXl9IG90aGVyXG4qIEByZXR1cm5zIHtib29sZWFufSBpZiBldmVyeSBlbGVtZW50IG9mIGFycmF5IG1hdGNoZXMgdGhhdCBvZiBvdGhlclxuKi9cbmV4cG9ydCBmdW5jdGlvbiBhcnJheUVxdWFscyhhcnJheSwgb3RoZXIpIHtcbiAgaWYgKCFvdGhlcilcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgLy8gY29tcGFyZSBsZW5ndGhzIC0gY2FuIHNhdmUgYSBsb3Qgb2YgdGltZVxuICBpZiAoYXJyYXkubGVuZ3RoICE9IG90aGVyLmxlbmd0aClcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICBmb3IgKHZhciBpID0gMCwgbD1hcnJheS5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgbmVzdGVkIGFycmF5c1xuICAgICAgaWYgKGFycmF5W2ldIGluc3RhbmNlb2YgQXJyYXkgJiYgb3RoZXJbaV0gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgIC8vIHJlY3Vyc2UgaW50byB0aGUgbmVzdGVkIGFycmF5c1xuICAgICAgICAgIGlmICghYXJyYXlFcXVhbHMoYXJyYXlbaV0sb3RoZXJbaV0pKVxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChhcnJheVtpXSAhPSBvdGhlcltpXSkge1xuICAgICAgICAgIC8vIFdhcm5pbmcgLSB0d28gZGlmZmVyZW50IG9iamVjdCBpbnN0YW5jZXMgd2lsbCBuZXZlciBiZSBlcXVhbDoge3g6MjB9ICE9IHt4OjIwfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuXG5cbi8qKlxuKiBSZWN1cnNpdmVseSB0YWxsaWVzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgYXQgZWFjaCBsZXZlbCBvZiB0aGUgcGFzc2VkLCBwdXRhdGl2ZWx5IG5lc3RlZCBhcnJheVxuKiBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiBpdGVtcyB3aGljaCBtYXkgaW5jbHVkZSBuZXN0ZWQgYXJyYXlzXG4qIEBwYXJhbSB7bnVtYmVyfSBbbGV2ZWw9MF0gY3VycmVudCBkZXB0aCBpbiB0aGUgcmVjdXJzaW9uXG4qIEBwYXJhbSB7QXJyYXl9IFtsZXZlbERhdGE9W11dIGtlZXBzIHRyYWNrIG9mIGl0ZW1zIHNlZW4gc28gZmFyIGF0IGVhY2ggZGVwdGhcbiogQHJldHVybnMge0FycmF5fSBzdGF0aW5nIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgKGFycmF5IGluY2x1c2l2ZSkgZm91bmQgYXQgZWFjaCBsZXZlbCBvZiB0aGUgYXJyYXlcbiovXG5leHBvcnQgZnVuY3Rpb24gZWxlbWVudHNBdExldmVscyhhcnJheSwgbGV2ZWwsIGxldmVsRGF0YSkge1xuICBsZXZlbCA9IGxldmVsID09IHVuZGVmaW5lZCA/IDAgOiBsZXZlbCArIDE7XG4gIGxldmVsRGF0YSA9IGxldmVsRGF0YSA9PSB1bmRlZmluZWQgPyBbXSA6IGxldmVsRGF0YTtcbiAgaWYgKCBsZXZlbCA+PSBsZXZlbERhdGEubGVuZ3RoICkgeyBsZXZlbERhdGEucHVzaChhcnJheS5sZW5ndGgpfSBlbHNlIHtsZXZlbERhdGFbbGV2ZWxdICs9IGFycmF5Lmxlbmd0aCB9XG4gIGFycmF5Lm1hcChmdW5jdGlvbihlLCBpKSB7aWYgKEFycmF5LmlzQXJyYXkoZSkpeyBlbGVtZW50c0F0TGV2ZWxzKGUsIGxldmVsLCBsZXZlbERhdGEpIH19KVxuICByZXR1cm4gbGV2ZWxEYXRhXG59XG5cblxuLyoqXG4qIFJlY3Vyc2l2ZWx5IHRhbGxpZXMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBvZiB0aGUgcGFzc2VkLCBwdXRhdGl2ZWx5IG5lc3RlZCBhcnJheVxuKiBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiBpdGVtcyB3aGljaCBtYXkgaW5jbHVkZSBuZXN0ZWQgYXJyYXlzXG4qIEBwYXJhbSB7bnVtYmVyfSBbZWxlbWVudHM9MF0gY3VycmVudCBudW1iZXIgb2YgZWxlbWVudHMgc2VlbiBzbyBmYXJcbiogQHJldHVybnMge251bWJlcn0gbnVtYmVyIG9mIGVsZW1lbnRzIChhcnJheSBpbmNsdXNpdmUpIGZvdW5kIGluIHBhc3NlZCBhcnJheVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJPZkVsZW1lbnRzKCBhcnJheSwgZWxlbWVudHMgKSB7XG4gIGVsZW1lbnRzID0gZWxlbWVudHMgPT0gdW5kZWZpbmVkID8gMCA6IGVsZW1lbnRzO1xuICBhcnJheS5tYXAoZnVuY3Rpb24oZSwgaSkge1xuICAgIGlmICggQXJyYXkuaXNBcnJheShlKSApIHsgZWxlbWVudHMgPSBudW1iZXJPZkVsZW1lbnRzKGUsIGVsZW1lbnRzKSB9XG4gICAgZWxzZSB7IGVsZW1lbnRzICs9IDEgfVxuICB9KVxuICByZXR1cm4gZWxlbWVudHNcbn1cblxuLyoqXG4qIENvbmNhdHMgYWxsIG5lc3RlZCBhcnJheXMgaW4gcGFzc2VkIGFycmF5IHRvIGZvcm0gYSBzaW5nbGUgYXJyYXlcbiogQHBhcmFtIHtBcnJheX0gYXJyYXkgb2YgcHV0YXRpdmVseSBuZXN0ZWQgYXJyYXlzXG4qIEBwYXJhbSB7QXJyYXl9IFtmbGF0PVtdXSBjdXJyZW50IGZsYXR0ZW5lZCBhcnJheVxuKiBAcmV0dXJucyB7QXJyYXl9IHdpdGggZXZlcnkgZWxlbWVudCBpbiB0aGUgc2FtZSBsZXZlbFxuKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuKCBhcnJheSwgZmxhdCApIHtcbiAgZmxhdCA9IGZsYXQgPT0gdW5kZWZpbmVkID8gW10gOiBmbGF0O1xuICBhcnJheS5tYXAoZnVuY3Rpb24oZSwgaSl7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpIHtmbGF0ID0gZmxhdC5jb25jYXQoZmxhdHRlbihlKSl9XG4gICAgZWxzZSB7ZmxhdC5wdXNoKGUpfVxuICB9KVxuICByZXR1cm4gZmxhdDtcbn1cblxuLyoqXG4qIFNlYXJjaCBvZiBsaXN0IG9mIGxpc3RzIHRvIGZpbmQgd2hpY2ggLSBpZiBhbnkgLSBwYXNzZWQgdmFsdWUgaXMgaW5cbiogQHBhcmFtIHtBcnJheVtdfSBiaW5zIGxpc3Qgb2YgbGlzdHMgb2YgdmFsdWVzXG4qIEBwYXJhbSB7Kn0gdmFsdWUgaXRlbSB0byB0ZXN0IGlmIGluIGFueSBvZiB0aGUgYmluc1xuKiBAcmV0dXJucyB7bnVtYmVyfSBpbmRpY2F0aW5nIHRoZSBpbmRleCBvZiB0aGUgYmluIGluIHdoaWNoIHZhbHVlIHdhcyBmb3VuZFxuKi9cbmV4cG9ydCBmdW5jdGlvbiB3aGljaEJpbihiaW5zLCB2YWx1ZSkge1xuICB2YXIgaSA9IC0xXG4gIGZvciAodmFyIGogPSAwOyBqIDwgYmlucy5sZW5ndGg7IGorKykgeyBpZiAoaGFzUShiaW5zW2pdLHZhbHVlKSkge3JldHVybiBqfSB9XG4gIHJldHVybiBpXG59XG4iLCJpbXBvcnQge2h5cGVuYXRlLCBzYWZlU2VsZWN0fSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHt0b3RhbH0gZnJvbSAnLi9hcnJheS1mdW5jdGlvbnMnO1xuXG5cbi8qKlxuICogY2FsbHMgY29uc29sZS5ncm91cCBpZiBkM3NtLmRlYnVnUSA9PSB0cnVlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBvZiB0aGUgZ3JvdXBcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zb2xlR3JvdXAobmFtZSkge1xuICBpZiAod2luZG93LmQzc20uZGVidWdRID09PSB0cnVlKXtcbiAgICBjb25zb2xlLmdyb3VwKG5hbWUpXG4gIH1cbn1cblxuLyoqXG4gKiBjYWxscyBjb25zb2xlLmdyb3VwRW5kIGlmIGQzc20uZGVidWdRID09IHRydWVcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zb2xlR3JvdXBFbmQoKSB7XG4gIGlmICh3aW5kb3cuZDNzbS5kZWJ1Z1EgPT09IHRydWUpe1xuICAgIGNvbnNvbGUuZ3JvdXBFbmQoKVxuICB9XG59XG5cbi8qKlxuICogQ2FsbHMgY29uc29sZS5sb2cgaWYgZDNzbS5kZWJ1Z1EgPT0gdHJ1ZVxuICogQHBhcmFtIHtzdHJpbmd9IGZ1bmMgbmFtZSBvZiB0aGUgZnVuY3Rpb24gbG9nZ2luZ1xuICogQHBhcmFtIHtzdHJpbmd9IG1zZyB0byBsb2dcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIHRvIGJlIGxvZ2dlZCBhbG9uZyBzaWRlIHRoZSBtZXNzYWdlXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nKGZ1bmMsIG1zZywgZGF0YSkge1xuICBpZiAod2luZG93LmQzc20uZGVidWdRID09PSB0cnVlKXtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGAlY1tkM3NtOjoke2Z1bmN9XTpcXHQke21zZ31gLFxuICAgICAgW1xuICAgICAgICAnYmFja2dyb3VuZDogIzZjZDFlZicsXG4gICAgICAgICdib3JkZXItcmFkaXVzOiA1MDAwcHgnLFxuICAgICAgICAncGFkZGluZzogMHB4IDJweCcsXG4gICAgICAgICdmb250LXNpemU6IDE0cHgnXG4gICAgICBdLmpvaW4oJzsnKVxuICAgIClcbiAgICBjb25zb2xlLnRhYmxlKGRhdGEpXG4gICAgLy8gY29uc29sZS50cmFjZSgpXG4gIH1cbn1cblxuLyoqXG4gKiBDYWxscyBjb25zb2xlLndhcm4gaWYgZDNzbS5kZWJ1Z1EgPT0gdHJ1ZVxuICogQHBhcmFtIHtzdHJpbmd9IGZ1bmMgbmFtZSBvZiB0aGUgZnVuY3Rpb24gd2FybmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IG1zZyB0byBkaXNwbGF5XG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YSB0byBiZSBkaXNwbGF5ZWQgYWxvbmcgc2lkZSB0aGUgbWVzc2FnZVxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhcm4oZnVuYywgbXNnLCBkYXRhKSB7XG4gIGlmICh3aW5kb3cuZDNzbS5kZWJ1Z1EgPT09IHRydWUpXG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYCVjW2Qzc206OiR7ZnVuY31dOlxcdCR7bXNnfWAsXG4gICAgICBbXG4gICAgICAgICdiYWNrZ3JvdW5kOiAjZmZkNTNlJyxcbiAgICAgICAgJ2JvcmRlci1yYWRpdXM6IDUwMDBweCcsXG4gICAgICAgICdwYWRkaW5nOiAwcHggMnB4JyxcbiAgICAgICAgJ2ZvbnQtc2l6ZTogMTRweCdcbiAgICAgIF0uam9pbignOycpXG4gICAgKVxuICAgIGNvbnNvbGUudGFibGUoZGF0YSlcbn1cbi8qKlxuICogQ2FsbHMgdGhlIGNvbnNvbGUuaW5mbyBpZiBkM3NtLmRlYnVnUSA9PSB0cnVlXG4gKiBAcGFyYW0ge3N0cmluZ30gZnVuYyBuYW1lIG9mIHRoZSBmdW5jdGlvbiBwcm92aWRpbmcgaW5mb1xuICogQHBhcmFtIHtzdHJpbmd9IG1zZyB0byBkaXNwbGF5XG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YSB0byBiZSBkaXNwbGF5ZWQgYWxvbmcgc2lkZSB0aGUgbWVzc2FnZVxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluZm8oZnVuYywgbXNnLCBkYXRhKSB7XG4gIGlmICh3aW5kb3cuZDNzbS5kZWJ1Z1EpXG4gICAgY29uc29sZS5pbmZvKFxuICAgICAgYCVjW2Qzc206OiR7ZnVuY31dOlxcdCR7bXNnfWAsXG4gICAgICBbXG4gICAgICAgICdiYWNrZ3JvdW5kOiAjMDA5Y2NkJyxcbiAgICAgICAgJ2JvcmRlci1yYWRpdXM6IDUwMDBweCcsXG4gICAgICAgICdwYWRkaW5nOiAwcHggMnB4JyxcbiAgICAgICAgJ2ZvbnQtc2l6ZTogMTRweCdcbiAgICAgIF0uam9pbignOycpXG4gICAgKVxuICAgIGNvbnNvbGUudGFibGUoZGF0YSlcbn1cblxuXG4vKipcbiAqIENhbGxzIGNvbnNvbGUuZXJyb3IgaWYgZDNzbS5kZWJ1Z1EgPT0gdHJ1ZVxuICogQHBhcmFtIHtzdHJpbmd9IGZ1bmMgbmFtZSBvZiB0aGUgZnVuY3Rpb24gd2hpY2ggc2VuZHMgdGhlIGVycm9yXG4gKiBAcGFyYW0ge3N0cmluZ30gbXNnIHRvIGRpc3BsYXlcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIHRvIGJlIGRpc3BsYXllZCBhbG9uZyBzaWRlIHRoZSBtZXNzYWdlXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJyb3IoZnVuYywgbXNnLCBkYXRhKSB7XG4gIGlmICh3aW5kb3cuZDNzbS5kZWJ1Z1EpXG4gICAgY29uc29sZS5lcnJvcihgW2Qzc206OiR7ZnVuY31dOlxcdCR7bXNnfVxcdCVvYCxkYXRhKVxufVxuXG5cblxuXG5cbi8qKlxuKiBGdW5jdGlvbiBmb3Igc2V0dGluZyB1cCBjb250YWluZXJzIGZvciBtb3N0IHBsb3RzIHdpdGggdGhlIHkgYXhpcyBjb250YWluZXJcbiogcG9zaXRpb25lZCBvbiB0aGUgbGVmdCBhbmQgdGhlIHggYXhpcyBjb250YWluZXIgcG9zaXRpb25lZCBvbiB0aGUgYm90dG9tXG4qIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBzZWxlY3Rpb24gc2VsZWN0aW9uIG9mIGNvbnRhaW5lciBpbiB3aGljaCB0aGUgc3ZnIGlzIG9yIHNob3VsZCBiZSBtYWRlXG4qIEBwYXJhbSB7c3RyaW5nfSBuYW1lc3BhY2UgbmFtZXNwYWNlIG9mIHRoZSBjaGFydFxuKiBAcGFyYW0ge09iamVjdH0gW3NwYWNlPXt3OndpbmRvdy5pbm5lcldpZHRoLCBoOndpbmRvdy5pbm5lckhlaWdodH1dIHRoZSB3aWR0aCAodykgYW5kIGhlaWdodCAoaCkgYXZhaWxibGVcbiogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZS53PXdpbmRvdy5pbm5lcldpZHRoXSB0aGUgYXZhaWxhYmxlIHdpZHRoIGluIHdoaWNoIHRvIHJlbmRlciB0aGUgY2hhcnRcbiogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZS5oPXdpbmRvdy5pbm5lckhlaWdodF0gdGhlIGF2YWlsYWJsZSBoZWlnaHQgaW4gd2hpY2ggdG8gcmVuZGVyIHRoZSBjaGFydFxuXG4qIEBwYXJhbSB7T2JqZWN0fSBbbWFyZ2lucz17dG9wOiAwLjAxLCBib3R0b206IDAuMDEsIGxlZnQ6IDAuMDEsIHJpZ2h0OiAwLjAxfV0gdGhlIG1hcmdpbnMgZm9yIHRoZSBjaGFydFxuKiBAcGFyYW0ge251bWJlcn0gW21hcmdpbnMudG9wPTAuMDFdIHRoZSB0b3AgbWFyZ2luIG9mIHRoZSBjaGFydFxuKiBAcGFyYW0ge251bWJlcn0gW21hcmdpbnMuYm90dG9tPTAuMDFdIHRoZSBib3R0b20gbWFyZ2luIG9mIHRoZSBjaGFydFxuKiBAcGFyYW0ge251bWJlcn0gW21hcmdpbnMubGVmdD0wLjAxXSB0aGUgbGVmdCBtYXJnaW4gb2YgdGhlIGNoYXJ0XG4qIEBwYXJhbSB7bnVtYmVyfSBbbWFyZ2lucy5yaWdodD0wLjAxXSB0aGUgcmlnaHQgbWFyZ2luIG9mIHRoZSBjaGFydFxuXG5cbiogQHBhcmFtIHtPYmplY3R9IFtwZXJjZW50YWdlcyA9IHtheGVzOnt4OjAuMSx5OjAuMX0sc3BhY2U6e3c6MC44LGg6MC42fX1dIHBlcmNlbnRhZ2VzIG9mIHRoZSBwYXJhbWF0ZXIgc3BhY2Ugb2Ygd2hpY2ggdG8gbWFrZSB0aGUgeCBhbmQgeSBheGVzIGFzIHdlbGwgYXMgdGhlIHBlcmNlbnQgb2YgdGhlIGF2YWlsYmxlIHNwYWNlIGluIHdoaWNoIHRvIHJlbmRlciB0aGUgcGxvdFxuKiBAcGFyYW0ge09iamVjdH0gW3BlcmNlbnRhZ2VzLmF4ZXM9e3g6MC4xLHk6MC4xfV0gdGhlIHBlcmNlbnRhZ2VzIG9mIHRoZSBwYXJhbWF0ZXIgc3BhY2UsIG9mIHdoaWNoIHRoZSB4IGFuZCB5IGF4ZXMgd2lsbCB0YWtlIHVwXG4qIEBwYXJhbSB7bnVtYmVyfSBbcGVyY2VudGFnZXMuYXhlcy54QXhpc1BlcmNlbnQ9MC4xXSB0aGUgcGVyY2VudGFnZXMgb2YgdGhlIHBhcmFtYXRlciBzcGFjZSwgb2Ygd2hpY2ggdGhlIHggYXhpcyB3aWxsIHRha2UgdXBcbiogQHBhcmFtIHtudW1iZXJ9IFtwZXJjZW50YWdlcy5heGVzLnlBeGlzUGVyY2VudD0wLjFdIHRoZSBwZXJjZW50YWdlcyBvZiB0aGUgcGFyYW1hdGVyIHNwYWNlLCBvZiB3aGljaCB0aGUgeSBheGlzIHdpbGwgdGFrZSB1cFxuXG4qIEBwYXJhbSB7T2JqZWN0fSBbcGVyY2VudGFnZXMuc3BhY2U9e3c6MC44LGg6MC42fV0gdGhlIHBlcmNlbnRhZ2VzIG9mIHRoZSBwYXJhbWF0ZXIgc3BhY2UsIG9mIHdoaWNoIHRoZSBTVkcncyB3aWR0aCBhbmQgaGVpZ2h0IHdpbGwgYmUgc2V0XG4qIEBwYXJhbSB7bnVtYmVyfSBbcGVyY2VudGFnZXMuc3BhY2UucGVyY2VudE9mU3BhY2VGb3JXaWR0aD0wLjFdIHRoZSBwZXJjZW50YWdlcyBvZiB0aGUgcGFyYW1hdGVyIHNwYWNlLCBvZiB3aGljaCB0aGUgU1ZHJ3Mgd2lkdGggd2lsbCBiZSBzZXRcbiogQHBhcmFtIHtudW1iZXJ9IFtwZXJjZW50YWdlcy5zcGFjZS5wZXJjZW50T2ZTcGFjZUZvckhlaWdodD0wLjFdIHRoZSBwZXJjZW50YWdlcyBvZiB0aGUgcGFyYW1hdGVyIHNwYWNlLCBvZiB3aGljaCB0aGUgU1ZHJ3MgaGVpZ2h0IHdpbGwgYmUgc2V0XG5cbiogQHJldHVybnMge09iamVjdH0gcmV0dXJucyB0aGUgc2VsZWN0aW9uIGFuZCBcImJvdW5kaW5nUmVjdHNcIiBvZiB0aGUgcGxvdCBjb250YWluZXIsIHgtYXhpcyBjb250YWluZXIgYW5kIHktYXhpcyBjb250YWluZXJcbiogYXNcbipcbioge1xuKlxuKiAgIHBsb3Q6IHtzZWxlY3Rpb246IHBsb3RTZWxlY3Rpb24sIHJlY3Q6IHBsb3RSZWN0fSxcbipcbiogICB4QXhpczp7c2VsZWN0aW9uOnhBeGlzU2VsZWN0aW9uLCByZWN0OnhBeGlzUmVjdH0sXG4qXG4qICAgeUF4aXM6IHtzZWxlY3Rpb246eUF4aXNTZWxlY3Rpb24sIHJlY3Q6eUF4aXNSZWN0fVxuKlxuKiB9XG4qXG4qIHdoZXJlIGVhY2ggcmVjdCBoYXMgZm9ybTpcbipcbioge3g6ICMsIHk6ICMsIGg6ICMsIHc6ICN9XG4qXG4qIGRlcGljdGluZyB0aGUgc3RhcnRpbmcgeCBhbmQgeSBjb29yZGluYXRlIG9mIHRoZSBjb3Jlc3BvbmRpbmcgY29udGFpbmVyIChhbHNvIHRoZWlyIGRlZmF1bHQgdHJhbnNmb3JtIHZhbHVlcykgYXMgd2VsbCB0aGVpciBoZWlnaHQgKGgpIGFucyB3aWR0aCAodylcbiovXG4vLyBleHBvcnQgZnVuY3Rpb24gc2V0dXBTdGFuZGFyZENoYXJ0Q29udGFpbmVycyggc2VsZWN0aW9uLCBuYW1lc3BhY2UsIHNwYWNlLCBtYXJnaW5zLCBwZXJjZW50YWdlcykge1xuZXhwb3J0IGZ1bmN0aW9uIHNldHVwU3RhbmRhcmRDaGFydENvbnRhaW5lcnMoXG4gIHNlbGVjdGlvbixcbiAgbmFtZXNwYWNlLFxuICBzcGFjZT17dzphdmFpbGFibGVXaWR0aD13aW5kb3cuaW5uZXJXaWR0aCwgaDphdmFpbGFibGVIZWlnaHQ9d2luZG93LmlubmVySGVpZ2h0fSxcbiAgbWFyZ2lucz17dG9wOjAuMDEsIGJvdHRvbTowLjAxLCBsZWZ0OjAuMDEsIHJpZ2h0OjAuMDF9LFxuICBwZXJjZW50YWdlcz17YXhlczoge3g6IHhBeGlzUGVyY2VudD0wLjEsIHk6IHlBeGlzUGVyY2VudD0wLjF9LCBzcGFjZToge3c6IHBlcmNlbnRPZlNwYWNlRm9yV2lkdGgsIGg6IHBlcmNlbnRPZlNwYWNlRm9ySGVpZ2h0fX1cbikge1xuICBpZiAoc3BhY2UgPT0gdW5kZWZpbmVkKSB7IHNwYWNlID0ge3c6IHdpbmRvdy5pbm5lcldpZHRoLCBoOiB3aW5kb3cuaW5uZXJIZWlnaHR9IH1cbiAgaWYgKG1hcmdpbnMgPT0gdW5kZWZpbmVkKSB7IG1hcmdpbnMgPSB7dG9wOiAwLjAxLCBib3R0b206IDAuMDEsIGxlZnQ6IDAuMDEsIHJpZ2h0OiAwLjAxfSB9XG4gIGlmIChwZXJjZW50YWdlcyA9PSB1bmRlZmluZWQpIHsgcGVyY2VudGFnZXMgPSB7fTsgfVxuICBpZiAocGVyY2VudGFnZXMuYXhlcyA9PSB1bmRlZmluZWQpIHsgcGVyY2VudGFnZXMuYXhlcyA9IHsgeDowLjEsIHk6MC4xIH0gfVxuICBpZiAocGVyY2VudGFnZXMuc3BhY2UgPT0gdW5kZWZpbmVkKSB7IHBlcmNlbnRhZ2VzLnNwYWNlID0geyB3OiAwLjgsIGg6IDAuNiB9IH1cblxuICAvLyBTVkcgd2lkdGggYW5kIGhlaWdodFxuICB2YXIgc3ZnU3BhY2UgPSAge1xuICAgIHc6IHNwYWNlLncgKiBwZXJjZW50YWdlcy5zcGFjZS53LFxuICAgIGg6IHNwYWNlLmggKiBwZXJjZW50YWdlcy5zcGFjZS5oXG4gIH0sXG5cbiAgLy8gU3BhY2UgYWZ0ZXIgcmVtb3ZpbmcgbWFyZ2luc1xuICBjaGFydFNwYWNlID0ge1xuICAgIHc6IHN2Z1NwYWNlLncgLSAobWFyZ2lucy5sZWZ0ICogc3BhY2UudykgLSAobWFyZ2lucy5yaWdodCAqIHNwYWNlLncpLFxuICAgIGg6IHN2Z1NwYWNlLmggLSAobWFyZ2lucy50b3AgKiBzcGFjZS5oKSAtIChtYXJnaW5zLmJvdHRvbSAqIHNwYWNlLmgpXG4gIH0sXG5cbiAgLy8gbWFpbiBkaW1lbnNpb24gb2YgeCBhbmQgeSBheGllc1xuICAvLyBlLmcuIGRlZmluZXMgaG93IHRhbGwgeCBheGlzIGlzIGFzIGxlbmd0aCBpcyBkZXRlcm1pbmVkIGJ5IHBsb3RSZWN0LndcbiAgYXhlc1NwYWNlID0ge1xuICAgIHg6IGNoYXJ0U3BhY2UuaCAqIHBlcmNlbnRhZ2VzLmF4ZXMueCxcbiAgICB5OiBjaGFydFNwYWNlLncgKiBwZXJjZW50YWdlcy5heGVzLnlcbiAgfSxcblxuICAvLyBzcGFjZSBsZWZ0IGZvciBkcmF3aW5nIHRoZSBjaGFydCBwcm9wZXJseSAoZS5nLiBiYXJzLCB2aW9saW5zLCBldGMpXG4gIGRyYXdpbmdTcGFjZSA9IHtcbiAgICB4OiBjaGFydFNwYWNlLncgLSBheGVzU3BhY2UueSxcbiAgICB5OiBjaGFydFNwYWNlLmggLSBheGVzU3BhY2UueFxuICB9LFxuXG5cbiAgeUF4aXNSZWN0ID0ge1xuICAgIHg6IGF4ZXNTcGFjZS55ICsgKG1hcmdpbnMubGVmdCAqIHNwYWNlLncpLFxuICAgIHk6IChtYXJnaW5zLnRvcCAqIHNwYWNlLmgpLFxuICAgIHc6IGF4ZXNTcGFjZS55LFxuICAgIGg6IGRyYXdpbmdTcGFjZS55XG4gIH0sXG5cbiAgcGxvdFJlY3QgPSB7XG4gICAgeDogYXhlc1NwYWNlLnkgKyAobWFyZ2lucy5sZWZ0ICogc3BhY2UudyksXG4gICAgeTogKG1hcmdpbnMudG9wICogc3BhY2UuaCksXG4gICAgdzogZHJhd2luZ1NwYWNlLngsXG4gICAgaDogZHJhd2luZ1NwYWNlLnlcbiAgfSxcblxuICB4QXhpc1JlY3QgPSB7XG4gICAgeDogYXhlc1NwYWNlLnkgKyAobWFyZ2lucy5sZWZ0ICogc3BhY2UudyksXG4gICAgeTogKG1hcmdpbnMudG9wICogc3BhY2UuaCArIHBsb3RSZWN0LmgpLFxuICAgIHc6IGRyYXdpbmdTcGFjZS54LFxuICAgIGg6IGF4ZXNTcGFjZS54XG4gIH1cblxuXG4gIHZhciBjb250YWluZXIgPSBzYWZlU2VsZWN0KHNlbGVjdGlvbiwgJ3N2ZycsIG5hbWVzcGFjZSlcbiAgICAuc3R5bGUoJ3dpZHRoJywgc3ZnU3BhY2UudysncHgnKVxuICAgIC5zdHlsZSgnaGVpZ2h0Jywgc3ZnU3BhY2UuaCsncHgnKVxuXG4gIHZhciBheGVzID0gc2FmZVNlbGVjdChjb250YWluZXIsICdnJywgaHlwZW5hdGUobmFtZXNwYWNlLCAnYXhlcycpKVxuXG4gIC8vIC5hdHRyKCd0cmFuc2Zvcm0nLCBcInRyYW5zbGF0ZShcIitwbG90UmVjdC54K1wiLFwiK3Bsb3RSZWN0LnkrXCIpXCIpLFxuXG4gIHZhciBwbG90ID0gc2FmZVNlbGVjdChjb250YWluZXIsICdnJywgaHlwZW5hdGUobmFtZXNwYWNlLCAncGxvdCcpKVxuICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBcInRyYW5zbGF0ZShcIitwbG90UmVjdC54K1wiLFwiK3Bsb3RSZWN0LnkrXCIpXCIpXG5cbiAgdmFyIHhBeGlzID0gc2FmZVNlbGVjdChheGVzLCAnZycsIGh5cGVuYXRlKG5hbWVzcGFjZSwgJ3gtYXhpcycpKVxuICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBcInRyYW5zbGF0ZShcIit4QXhpc1JlY3QueCtcIixcIit4QXhpc1JlY3QueStcIilcIilcblxuICB2YXIgeUF4aXMgPSBzYWZlU2VsZWN0KGF4ZXMsICdnJywgaHlwZW5hdGUobmFtZXNwYWNlLCAneS1heGlzJykpXG4gICAgLmF0dHIoJ3RyYW5zZm9ybScsIFwidHJhbnNsYXRlKFwiK3lBeGlzUmVjdC54K1wiLFwiK3lBeGlzUmVjdC55K1wiKVwiKVxuXG4gIHJldHVybiB7XG4gICAgc3ZnOiB7XG4gICAgICBzZWxlY3Rpb246IGNvbnRhaW5lcixcbiAgICAgIHJlY3Q6IHN2Z1NwYWNlXG4gICAgfSxcbiAgICBwbG90OiB7XG4gICAgICBzZWxlY3Rpb246IHBsb3QsXG4gICAgICByZWN0OiBwbG90UmVjdFxuICAgIH0sXG4gICAgeEF4aXM6IHtcbiAgICAgIHNlbGVjdGlvbjogeEF4aXMsXG4gICAgICByZWN0OiB4QXhpc1JlY3RcbiAgICB9LFxuICAgIHlBeGlzOiB7XG4gICAgICBzZWxlY3Rpb246IHlBeGlzLFxuICAgICAgcmVjdDogeUF4aXNSZWN0XG4gICAgfVxuICB9XG5cbiAgLy8gcmV0dXJuIFtwbG90LCB4QXhpcywgeUF4aXNdXG59XG5cblxuXG4vKipcbiogQWRkcyBhIGNsaXAtcGF0aCByZWN0IGFuZCBiaW5kcyBpdCB0byBjb250YWluZXJcbiogQHBhcmFtIHtkMy5zZWxlY3Rpb259IGNvbnRhaW5lciBpbiB3aGljaCB0byBhZGQgdGhlIGNsaXAtcGF0aCBhbmQgdG8gd2hpY2ggdG8gYmluZCB0aGUgY2xpcGluZyBwYXRoIHRvXG4qIEBwYXJhbSB7T2JqZWN0fSByZWN0IHRoZSBjb29yZGluYXRlcyAoeCwgeSwgd2lkdGgsIGhlaWdodCkgb2YgdGhlIGNsaXAtcGF0aFxuKiBAcGFyYW0ge3N0cmluZ30gbmFtZXNwYWNlXG4qIEByZXR1cm5zIHtkMy5zZWxlY3Rpb259IG9mIHRoZSBjbGlwLXBhdGggcmVjdFxuKi9cbmV4cG9ydCBmdW5jdGlvbiBjcFJlY3QoY29udGFpbmVyLCByZWN0LCBuYW1lc3BhY2UpIHtcbiAgdmFyIGRlZnMgPSBzYWZlU2VsZWN0KGNvbnRhaW5lciwgJ2RlZnMnLCBoeXBlbmF0ZShuYW1lc3BhY2UsICdkZWZpbml0aW9ucycpKVxuICB2YXIgY3AgPSBzYWZlU2VsZWN0KGRlZnMsICdjbGlwUGF0aCcsIGh5cGVuYXRlKG5hbWVzcGFjZSwgJ2NsaXAtcGF0aCcpKVxuICAuYXR0cignaWQnLCBoeXBlbmF0ZShuYW1lc3BhY2UsICdjbGlwLXBhdGgnKSlcblxuICB2YXIgY3BSZWN0ID0gc2FmZVNlbGVjdChjcCwgJ3JlY3QnKVxuICAuYXR0cigneCcsIHJlY3QueClcbiAgLmF0dHIoJ3knLCByZWN0LnkpXG4gIC5hdHRyKCd3aWR0aCcsIHJlY3Qud2lkdGgpXG4gIC5hdHRyKCdoZWlnaHQnLCByZWN0LmhlaWdodClcblxuICBkZWZzLnJhaXNlKClcbiAgLy8gc2V0IGNsaXBwaW5nIHBhdGggdG8gY29udGFpbmVyXG4gIGNvbnRhaW5lci5hdHRyKCdjbGlwLXBhdGgnLCAndXJsKCMnKyBoeXBlbmF0ZShuYW1lc3BhY2UsICdjbGlwLXBhdGgnKSsnKScpXG5cbiAgcmV0dXJuIGNwUmVjdFxufVxuXG5cbi8qKlxuKiBBZGRzIGEgYmFja2dyb3VuZCByZWN0IHQgdG8gY29udGFpbmVyXG4qIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBjb250YWluZXIgaW4gd2hpY2ggdG8gYWRkIHRoZSBiYWNrZ3JvdW5kIHJlY3RhbmdsZVxuKiBAcGFyYW0ge09iamVjdH0gcmVjdCB0aGUgY29vcmRpbmF0ZXMgKHgsIHksIHdpZHRoLCBoZWlnaHQpIG9mIHRoZSBiYWNrZ3JvdW5kXG4qIEBwYXJhbSB7c3RyaW5nfSBmaWxsIHRoZSBjb2xvciBvZiB0aGUgYmFja2dyb3VuZFxuKiBAcmV0dXJucyB7ZDMuc2VsZWN0aW9ufSBvZiB0aGUgYmFja2dyb3VuZCBmaWxsXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGJnUmVjdChjb250YWluZXIsIHJlY3QsIGZpbGwpIHtcbiAgcmV0dXJuIHNhZmVTZWxlY3QoY29udGFpbmVyLCAncmVjdCcsICdiZycpXG4gIC5hdHRyKCd4JywgcmVjdC54KVxuICAuYXR0cigneScsIHJlY3QueSlcbiAgLmF0dHIoJ3dpZHRoJywgcmVjdC53aWR0aClcbiAgLmF0dHIoJ2hlaWdodCcsIHJlY3QuaGVpZ2h0KVxuICAuYXR0cignZmlsbCcsIGZpbGwpXG59XG5cblxuLyoqXG4qIFNldHMgdXAgdGhlIGNvbnRhaW5lciBmb3IgbWFraW5nIGNoYXJ0IGVsZW1lbnRzLiBUaGlzIGluY2x1ZGVzIG1ha2luZ1xuKiBhIGNsaXAtcGF0aCByZWN0IGJvdW5kIHRvIHRoZSBwYXNzZWQgY29udGFpbmVyLCBhIGJhY2tncm91bmQgcmVjdCwgYW5kXG4qIGEgZyBlbGVtZW50IHdpdGggY2xhc3MgPG5hbWVzcGFjZT4tb2JqZWN0LWNvbnRhaW5lci5cbiogQHBhcmFtIHtkMy5zZWxlY3Rpb259IGNvbnRhaW5lciBpbiB3aGljaCB0byBhZGQgdGhlIGNsaXAtcGF0aCBhbmQgYmFja2dyb3VuZFxuKiBAcGFyYW0ge3N0cmluZ30gbmFtZXNwYWNlXG4qIEBwYXJhbSB7T2JqZWN0fSByZWN0IHRoZSBjb29yZGluYXRlcyAoeCwgeSwgd2lkdGgsIGhlaWdodCkgb2YgdGhlIGJhY2tncm91bmQgYW5kIGNsaXAtcGF0aFxuKiBAcGFyYW0ge3N0cmluZ30gZmlsbCB0aGUgY29sb3Igb2YgdGhlIGJhY2tncm91bmRcbiogQHJldHVybnMge2QzLnNlbGVjdGlvbn0gb2YgZy48bmFtZXNwYWNlPi1vYmplY3QtY29udGFpbmVyXG4qXG4qIEBzZWV7QGxpbmsgYmdSZWN0fVxuKiBAc2Vle0BsaW5rIGNwUmVjdH1cbiovXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBDb250YWluZXIoc2VsZWN0aW9uLCBuYW1lc3BhY2UsIHJlY3QsIGZpbGwpIHtcbiAgLy8gdGhlIGNvbnRhaW5lciBmb3IgdGhyZWUgbWFpbiBpdGVtcywgYmcsIGRlZnMsIGFuZCBvYmplY3QtY29udGFpbmVyXG4gIHZhclxuICBjb250YWluZXIgPSBzYWZlU2VsZWN0KHNlbGVjdGlvbiwgJ2cnLCBuYW1lc3BhY2UpLFxuICBiZyA9IGJnUmVjdChjb250YWluZXIsIHJlY3QsIGZpbGwpLFxuICBjcCA9IGNwUmVjdChjb250YWluZXIsIHJlY3QsIG5hbWVzcGFjZSksXG4gIG9iamVjdENvbnRhaW5lciA9IHNhZmVTZWxlY3QoY29udGFpbmVyLCAnZycsIGh5cGVuYXRlKG5hbWVzcGFjZSwgJ29iamVjdC1jb250YWluZXInKSlcbiAgcmV0dXJuIG9iamVjdENvbnRhaW5lclxufVxuXG5cbi8qKlxuKiBkZXRlcm1pbmVzIHRoZSB3aWR0aCBvZiBhbiBvYmplY3QgZm9yIHRoZSBjYWxsaW5nIHBsb3R0aW5nIGZ1bmN0aW9uXG4qIEBwYXJhbSB7bnVtYmVyfSBmcmVlU3BhY2UgaG93IG11Y2ggc3BhY2UgaXMgYXZhbGlibGVcbiogQHBhcmFtIHtudW1iZXJ9IG51bWJlck9mT2JqZWN0cyBob3cgbWFueSBvYmplY3QgZG8gd2UgbmVlZFxuKiBAcGFyYW0ge251bWJlcn0gbWluT2JqZWN0V2lkdGggaG93IHNtYWxsIGFyZSB0aGVzZSBvYmplY3RzIGFsbG93ZWQgdG8gYmVcbiogQHBhcmFtIHtudW1iZXJ9IG1heE9iamVjdFdpZHRoIGhvdyBsYXJnZSBhcmUgdGhlc2Ugb2JqZWN0IGFsbG93ZWQgdG8gYmVcbiogQHBhcmFtIHtudW1iZXJ9IHNpemVPZlNwYWNlciBwZXJjZW50IG9mIGZyZWVTcGFjZSB0aGF0IGEgc2luZ2xlIHNwYWNlciBzaG91bGQgdGFrZSB1cCAobmVlZCBudW1iZXJPZk9iamVjdHMgLSAxIHNwYWNlcnMpXG4qIEBwYXJhbSB7Ym9vbGVhbn0gb3ZlcmZsb3dRIGNhbiB3ZSBnbyBiZXlvbmQgYWxsb3RlZCBzcGFjZVxuKiBAcmV0dXJucyB7bnVtYmVyfSBob3cgbGFyZ2Ugb2JqZWN0IHNob3VsZCBiZVxuKiBmdW5jdGlvbiB0cmllcyB0byBrZWVwIG9iamVjdCB3aXRoaW4gbWluIC8gbWF4IHdpZHRoLCBidXQgd2lsIGRlZmF1bHQgdG9cbiogNWUtMTAgKHNtYWxsZXN0IGNvbnNpc3Rlbmx5IHZpc2libGUgYnkgc3ZnIHNpemUgb2YgZWxlbWVudCkgaWYgb3ZlcmZsb3dRIGlzIGZhbHNlXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZVdpZHRoT2ZPYmplY3QoZnJlZVNwYWNlLCBudW1iZXJPZk9iamVjdHMsIG1pbk9iamVjdFdpZHRoLCBtYXhPYmplY3RXaWR0aCwgc2l6ZU9mU3BhY2VyLCBvdmVyZmxvd1EpIHtcbiAgdmFyIHNpemVPZlNwYWNlciA9IHNpemVPZlNwYWNlciA8IDEgPyBmcmVlU3BhY2UgKiBzaXplT2ZTcGFjZXIgOiBzaXplT2ZTcGFjZXJcbiAgdmFyIG51bWJlck9mU3BhY2VycyA9IG51bWJlck9mT2JqZWN0cyAtIDFcbiAgdmFyIHNwYWNlVGFrZW5CeVNwYWNlcnMgPSBudW1iZXJPZlNwYWNlcnMgKiBzaXplT2ZTcGFjZXJcbiAgdmFyIHJlbWFpbmluZ1NwYWNlID0gZnJlZVNwYWNlIC0gc3BhY2VUYWtlbkJ5U3BhY2Vyc1xuICByZW1haW5pbmdTcGFjZSA9IHJlbWFpbmluZ1NwYWNlIDwgMCA/IDAgOiByZW1haW5pbmdTcGFjZVxuICB2YXIgb2JqZWN0V2lkdGggPSByZW1haW5pbmdTcGFjZSAvIG51bWJlck9mT2JqZWN0c1xuXG4gIGlmICggbWF4T2JqZWN0V2lkdGggIT0gdW5kZWZpbmVkICYmIG9iamVjdFdpZHRoID4gbWF4T2JqZWN0V2lkdGggKSB7IG9iamVjdFdpZHRoID0gbWF4T2JqZWN0V2lkdGggfVxuICBpZiAoIG92ZXJmbG93USAmJiBtaW5PYmplY3RXaWR0aCAhPSB1bmRlZmluZWQgJiYgb2JqZWN0V2lkdGggPCBtaW5PYmplY3RXaWR0aCApIHsgb2JqZWN0V2lkdGggPSBtaW5PYmplY3RXaWR0aCB9XG4gIHJldHVybiBNYXRoLm1heChvYmplY3RXaWR0aCwgNWUtMTApXG59XG5cbi8qKlxuKiBAcGFyYW0ge0FycmF5W119IGRhdGEgbGlzdCBkYXRhIChjYW4gYmUgbmVzdGVkKS4gSWYgbmVzdGVkIHdpbGwgY3JlYXRlIG1vcmUgY29tcGxleCBzcGFjZXIgc2l6ZVxuKiBAcGFyYW0ge251bWJlcn0gZnJlZVNwYWNlIGhvdyBtdWNoIHNwYWNlIGlzIGF2YWxpYmxlXG4qIEBwYXJhbSB7bnVtYmVyfSBvYmplY3RXaWR0aCBAc2Vle0BsaW5rIGNhbGN1bGF0ZVdpZHRoT2ZPYmplY3R9XG4qIEBwYXJhbSB7bnVtYmVyfSBudW1iZXJPZk9iamVjdHMgaG93IG1hbnkgb2JqZWN0IGRvIHdlIG5lZWRcbiogQHBhcmFtIHtudW1iZXJ9IGJhc2VTcGFjZXJTaXplIHBlcmNlbnQgb2YgZnJlZVNwYWNlIHRoYXQgYSBzaW5nbGUgc3BhY2VyIHNob3VsZCB0YWtlIHVwIChuZWVkIG51bWJlck9mT2JqZWN0cyAtIDEgc3BhY2VycylcbiogQHBhcmFtIHtib29sZWFufSBvdmVyZmxvd1EgY2FuIHdlIGdvIGJleW9uZCBhbGxvdGVkIHNwYWNlXG4qIEByZXR1cm5zIHtudW1iZXJ9IHJldHVybnMgc2l6ZSB0aGF0IHNwYWNlciBzaG91bGQgYmUgYXQgbGV2ZWw9MFxuKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVXaWR0aE9mU3BhY2VyKGRhdGEsIGZyZWVTcGFjZSwgb2JqZWN0V2lkdGgsIG51bWJlck9mT2JqZWN0cywgYmFzZVNwYWNlclNpemUsIG92ZXJmbG93USkge1xuICBpZiAob3ZlcmZsb3dRKSB7XG4gICAgdmFyIGxpbWl0ZWROdW1iZXJPZk9iamVjdHMgPSBudW1iZXJPZk9iamVjdHMgPiA2ID8gNiA6IG51bWJlck9mT2JqZWN0c1xuICAgIHZhciBzcGFjZUxlZnQgPSBmcmVlU3BhY2UgLSBsaW1pdGVkTnVtYmVyT2ZPYmplY3RzICogb2JqZWN0V2lkdGhcbiAgICByZXR1cm4gc3BhY2VMZWZ0IC8gKGxpbWl0ZWROdW1iZXJPZk9iamVjdHMgLSAxKVxuICB9XG4gIHZhciBzcGFjZXJzQXRFYWNoTGV2ZWwgPSBzcGFjZXJzTmVlZGVkQXRFYWNoTGV2ZWwoZGF0YSlcbiAgdmFyIHRvdGFsU3BhY2VyUGVyY2VudCA9IHRvdGFsKHNwYWNlcnNBdEVhY2hMZXZlbC5tYXAoZnVuY3Rpb24oZSwgaSkge3JldHVybiBlICogMSAvIChpKzEpfSkpXG4gIHZhciBiYXNlU3BhY2VyU2l6ZSA9IChmcmVlU3BhY2UgLSAob2JqZWN0V2lkdGggKiBudW1iZXJPZk9iamVjdHMpKSAvIHRvdGFsU3BhY2VyUGVyY2VudFxuICAvLyBjb25zb2xlLmxvZyh0b3RhbFNwYWNlclBlcmNlbnQsIGJhc2VTcGFjZXJTaXplLCB0b3RhbFNwYWNlclBlcmNlbnQgKiBiYXNlU3BhY2VyU2l6ZSlcbiAgcmV0dXJuIGJhc2VTcGFjZXJTaXplXG59XG5cblxuLyoqXG4qIENhbGN1bGF0ZXMgbnVtYmVyIG9mIHNwYWNlcnMgbmVlZGVkIHRvIHNlcGVyYXRlIGVsZW1lbnRzIGF0IGVhY2ggbGV2ZWwuXG4qIEBwYXJhbSB7QXJyYXlbXX0gYXJyYXkgbGlzdCBkYXRhIChjYW4gYmUgbmVzdGVkKS4gSWYgbmVzdGVkIHdpbGwgY3JlYXRlIG1vcmUgY29tcGxleCBzcGFjZXIgc2l6ZVxuKiBAcGFyYW0ge251bWJlcn0gW2xldmVsPTBdIGN1cnJlbnQgbGV2ZWwsIHVzZWQgaW4gcmVjdXNyaW9uXG4qIEBwYXJhbSB7QXJyYXl9IFtsZXZlbERhdGE9W11dIGhvdyBtYW55IHNwYWNlcnMgbmVlZGVkIGF0IGEgZ2l2ZW4gbGV2ZWxcbiogQHJldHVybnMge0FycmF5fSBsZXZlbERhdGFcbipcbiogQGV4YW1wbGVcbiogYXJyYXkgPSBbWzEsMl0sIFszLDRdXVxuKiAvLyByZXR1cm5zIFsxLCAyXVxuKiBhcyBhdCBsZXZlbD0wIHRoZSBvbmx5IHNwYWNlciBuZWVkZWQgaXMgYmV0d2VlbiBbMSwyXSBhbmQgWzMsNF1cbiogYW5kIGF0IGxldmVsPTEgdGhlIG9ubHkgdHdvIHNwYWNlcnMgbmVlZGVkIGlzIGJldHdlZW4gMSBhbmQgMiBhcyB3ZWxsIGFzXG4qIDMgYW5kIDQgc2luY2UgdGhlIHNwYWNlciBiZXR3ZWVuIDIgYW5kIDMgaXMgaGFuZGxlZCBhdCBsZXZlbD0wXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIHNwYWNlcnNOZWVkZWRBdEVhY2hMZXZlbCAoYXJyYXksIGxldmVsLCBsZXZlbERhdGEgKSB7XG4gIGlmICggbGV2ZWwgPT0gdW5kZWZpbmVkICkgeyBsZXZlbCA9IDA7ICB9IGVsc2UgeyBsZXZlbCArPSAxIH1cbiAgaWYgKCBsZXZlbERhdGEgPT0gdW5kZWZpbmVkICkgeyBsZXZlbERhdGEgPSBbXTsgfVxuICBpZiAoIGxldmVsID49IGxldmVsRGF0YS5sZW5ndGggKSB7IGxldmVsRGF0YS5wdXNoKGFycmF5Lmxlbmd0aCAtIDEpIH1cbiAgZWxzZSB7IGxldmVsRGF0YVtsZXZlbF0gKz0gYXJyYXkubGVuZ3RoIC0gMSB9XG4gIGFycmF5Lm1hcChmdW5jdGlvbihlLCBpKSB7IGlmIChBcnJheS5pc0FycmF5KGUpKSB7IHNwYWNlcnNOZWVkZWRBdEVhY2hMZXZlbChlLCBsZXZlbCwgbGV2ZWxEYXRhKSB9IH0gKVxuICByZXR1cm4gbGV2ZWxEYXRhXG59XG5cblxuXG5cbi8qKlxuKiBEcmF3cyBhIHdoaXNrZXIgZm9yIEBzZWV7QGxpbmsgYm94d2hpc2tlcn1cbiogQHBhcmFtIHtib29sZWFufSBkaXIgZGlyZWN0aW9uIHRvIGRyYXcgd2hpc2tlciwgc2hvdWxkIGJlIGVpdGhlciB0cnVlICh1cCwgdG9wKSBvciBmYWxzZSAoZG93biBvciBib3R0b20pXG4qIEBwYXJhbSB7bnVtYmVyfSB4IHN0YXJ0aW5nIHggY29vcmRpbmF0ZSBpbiB3aGljaCB0byBkcmF3IHdoaXNrZXJcbiogQHBhcmFtIHtudW1iZXJ9IHkgc3RhcnRpbmcgeSBjb29yZGluYXRlIGluIHdoaWNoIHRvIGRyYXcgd2hpc2tlclxuKiBAcGFyYW0ge251bWJlcn0gdyB3aWR0aCBvZiBzcGFjZSBpbiB3aGljaCB0byBkcmF3IHdoaXNrZXJcbiogQHBhcmFtIHtudW1iZXJ9IGggaGVpZ2h0IG9mIHNwYWNlIGluIHdoaWNoIHRvIGRyYXcgd2hpc2tlclxuKiBAcGFyYW0ge251bWJlcn0gcGVyIHBlcmNlbnRhZ2Ugb2YgdyBvciBoIChkZXBlbmRzIG9uIG8pIHRvIG1ha2Ugd2hpc2tlclxuKiBAcGFyYW0ge2Jvb2xlYW59IG8gb3JpZW50YXRpb24sIHRydWUgaXMgaG9yaXpvbnRhbCBhbmQgZmFsc2UgaXMgdmVydGljYWxcbiogQHJldHVybnMge3N0cmluZ30gcmVwcmVzZW50aW5nIHRoZSBzdmcgcGF0aCAoaS5lLiB0aGUgZCBhdHRyaWJ1dGUgZm9yIGEgcGF0aCB0YWcpXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIHdoaXNrZXJQYXRoKGRpciwgeCwgeSwgdywgaCwgcGVyLCBvKSB7XG4gIC8vIGQgPSBkaXJlY3Rpb24gKHRydWUgaXMgdXApLCBwID0gcGVyY2VudCB3aWR0aFxuICBpZiAoZGlyID09ICd1cCcgfHwgZGlyID09ICd0b3AnIHx8IGRpciA9PSB0cnVlKSB7ZGlyID0gdHJ1ZX1cbiAgaWYgKGRpciA9PSAnZG93bicgfHwgZGlyID09ICdib3R0b20nIHx8IGRpciA9PSBmYWxzZSkge2RpciA9IGZhbHNlfVxuICBvID0gbyA9PSB1bmRlZmluZWQgPyAnaG9yaXpvbnRhbCcgOiBvXG4gIHBlciA9IHBlciA9PSB1bmRlZmluZWQgPyAxIDogcGVyXG4gIGlmIChvICE9IFwiaG9yaXpvbnRhbFwiKSB7XG4gICAgdmFyIGhoID0gaCAqIHBlciAsXG4gICAgdyA9IGRpciA/IHcgOiAtdyAsXG4gICAgYSA9IGRpciA/IHggKyB3IDogeCAsXG4gICAgYiA9IGRpciA/IHggOiB4ICsgdyAsXG4gICAgYyA9IGRpciA/IGEgOiBiXG4gICAgcCA9IFwiTSBcIiArIGEgKyAnICcgKyAoICAgICBoIC8gMiAgICAgICkgKyAnICdcbiAgICAgICsgJ0wgJyArIGIgKyAnICcgKyAoICAgICBoIC8gMiAgICAgICkgKyAnICdcbiAgICAgICsgJ00gJyArIGMgKyAnICcgKyAoIGggLyAyIC0gaGggLyAyICkgKyAnICdcbiAgICAgICsgJ0wgJyArIGMgKyAnICcgKyAoIGggLyAyICsgaGggLyAyICkgKyAnICdcblxuICAgIHJldHVybiBwXG4gIH1cbiAgdmFyIHd3ID0gdyAqIHBlcixcbiAgYSA9IGRpciA/IHkgKyBoIDogeSAgLFxuICBiID0gZGlyID8geSA6IHkgKyBoICAsXG4gIHAgPSBcIk0gXCIgKyAoICB3IC8gMiAgKSArICcgJyArIGEgKyAnICcgLy8gc3RyYWlnaHQgbGluZSBwYXJ0XG4gICAgKyAnTCAnICsgKCAgdyAvIDIgICkgKyAnICcgKyBiICsgJyAnIC8vIHN0cmFpZ2h0IGxpbmUgcGFydFxuICAgICsgJ2ggJyArICggLXd3IC8gMiApICsgJyAnICsgMCArICcgJyAvLyBob3Jpem9udGFsIGxpbmUgcGFydFxuICAgICsgJ2ggJyArICggICAgd3cgICApICsgJyAnICsgMCArICcgJ1xuICByZXR1cm4gcFxufVxuIiwiaW1wb3J0IHtsb2csIHdhcm4sIGVycm9yLCBpbmZvfSBmcm9tICcuL3V0aWxzJztcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BBQ0VHUk9VUElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKipcbiAqIFByb2R1Y2VzIGEgZnVuY3Rpb24gZm9yIHNwYWNpbmcgb2JqZWN0cyBieSBhbiBhcmJpdHJhcmx5IGNvbXBsZXggZ3JvdXBpbmdcbiAqIEByZXR1cm5zIHtyZWN1cnNpdmVseVBvc2l0aW9ufSB0aGUgZnVuY3Rpb24gZm9yIG1vdmluZyB0aGUgb2JqZWN0c1xuICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIjcmVjdXJzaXZlbHlQb3NpdGlvbn0pXG4gKiBAbmFtZXNwYWNlIGdyb3VwaW5nU3BhY2VyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBncm91cGluZ1NwYWNlcigpIHtcbiAgdmFyXG4gIC8qQHZhciB7Ym9vbGVhbn0gaG9yaXpvbnRhbFEgQGRlZmF1bHQqL1xuXG4gIC8qKlxuICAqIFdoZXRoZXIgb3Igbm90IHRvIHNwYWNlIG9iamVjdHMgaG9yaXpvbnRhbGx5IG9yIHZlcnRpY2FsbHkuXG4gICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIuaG9yaXpvbnRhbFF9KVxuICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2hvcml6b250YWxRPXRydWVdXG4gICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyI1xuICAqIEBpbnN0YW5jZVxuICAqL1xuICBob3Jpem9udGFsUSA9IHRydWUsXG4gIC8qKlxuICAqIFRoZSBzY2FsZSB0byB1c2UgdG8gcG9zaXRpb24gZWxlbWVudHMgaWYge0BsaW5rIGdyb3VwaW5nU3BhY2VyI21vdmVieX09XCJzdHJpbmdcIlxuICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyLnNjYWxlfSlcbiAgKiBAcGFyYW0ge2QzLnNjYWxlfSBbc2NhbGU9ZDMuc2NhbGVMaW5lYXIoKV1cbiAgKiBAbWVtYmVyb2YgZ3JvdXBpbmdTcGFjZXIjXG4gICogQGluc3RhbmNlXG4gICovXG4gIHNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKSxcbiAgLyoqXG4gICogSG93IGVsZW1lbnRzIGluIHRoZSBjb21wbGV4IGdyb3VwaW5nIHNob3VsZCBiZSBtb3ZlZCBvdmVyIGJ5LlxuICAqIEJ5IGRlZmF1bHQsIG1vdmVieT1cImNhdGVnb3J5XCIsIHdoaWNoIG1vdmVzIG9iamVjdHMgYnkgdGhlIGNvbXBsZXggZ3JvdXBpbmdcbiAgKiBCdXQgb2JqZWN0cyBjYW4gYWxzbyBiZSBtb3ZlZCBvdmVyIGJ5IHNjYWxlLlxuICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyLm1vdmVieX0pXG4gICogQHBhcmFtIHtzdHJpbmd9IFttb3ZlYnk9XCJjYXRlZ29yeVwiXVxuICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlciNcbiAgKiBAaW5zdGFuY2VcbiAgKi9cbiAgbW92ZWJ5ID0gJ2NhdGVnb3J5JyxcbiAgLyoqXG4gICogSG93IG1hbnkgb2JqZWN0cyBhcmUgdGhlcmUgaW4gdG90YWxcbiAgKiAoc2VlIHtAbGluayBncm91cGluZ1NwYWNlci5udW1iZXJPZk9iamVjdHN9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbbnVtYmVyT2ZPYmplY3RzPW5vbmVdXG4gICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyI1xuICAqIEBpbnN0YW5jZVxuICAqL1xuICBudW1iZXJPZk9iamVjdHMsXG4gIC8qKlxuICAqIFRoZSBjbGFzcyBnaXZlbiB0byBhbiBuZXN0ZWQgPGc+IHRhZyB3aG9zZSBwYXJlbnQocykgaGF2ZSB0aGUgY29ycmVjdCB0cmFuc2l0aW9uXG4gICogcHJvcGVydGllc1xuICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyLm51bWJlck9mT2JqZWN0c30pXG4gICogQHBhcmFtIHtzdHJpbmd9IFtudW1iZXJPZk9iamVjdHM9J2Qzc20tZ3JvdXBwZWQtaXRlbSddXG4gICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyI1xuICAqIEBpbnN0YW5jZVxuICAqL1xuICBvYmplY3RDbGFzcyA9ICdkM3NtLWdyb3VwcGVkLWl0ZW0nLFxuICAvKipcbiAgKiBUaGUgc2l6ZSBvZiB0aGUgb2JqZWN0cyBiZWluZyBwb3NpdGlvbmVkXG4gICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIub2JqZWN0U2l6ZX0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtvYmplY3RTaXplPW5vbmVdXG4gICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyI1xuICAqIEBpbnN0YW5jZVxuICAqL1xuICBvYmplY3RTaXplLFxuICAvKipcbiAgKiBUaGUgc2l6ZSBvZiB0aGUgdW4tbmVzdGVkIHNwYWNlciBiZXR3ZWVuIG9iamVjdHNcbiAgKiAoc2VlIHtAbGluayBncm91cGluZ1NwYWNlci5zcGFjZXJTaXplfSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW3NwYWNlclNpemU9bm9uZV1cbiAgKiBAbWVtYmVyb2YgZ3JvdXBpbmdTcGFjZXIjXG4gICogQGluc3RhbmNlXG4gICovXG4gIHNwYWNlclNpemUsXG4gIC8qKlxuICAqIFRoZSBkdXJhdGlvbiBvZiB0cmFuc2l0aW9ucyBpbiBtc1xuICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyLnRyYW5zaXRpb25EdXJhdGlvbn0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFt0cmFuc2l0aW9uRHVyYXRpb249MTAwMF1cbiAgKiBAbWVtYmVyb2YgZ3JvdXBpbmdTcGFjZXIjXG4gICogQGluc3RhbmNlXG4gICovXG4gIHRyYW5zaXRpb25EdXJhdGlvbiA9IDEwMDAsXG4gIC8qKlxuICAqIFRoZSBlYXNlIGZ1bmN0aW9uIGZvciB0aGUgdHJhbnNpdGlvbnNcbiAgKiAoc2VlIHtAbGluayBncm91cGluZ1NwYWNlci5lYXNlRnVuY30pXG4gICogQHBhcmFtIHtkMy5lYXNlfSBbZWFzZUZ1bmM9ZDMuZWFzZVNpbl1cbiAgKiBAbWVtYmVyb2YgZ3JvdXBpbmdTcGFjZXIjXG4gICogQGluc3RhbmNlXG4gICovXG4gIGVhc2VGdW5jID0gZDMuZWFzZVNpbixcbiAgLyoqXG4gICogVGhlIG5hbWVzcGFjZSBmb3IgdGhlIG9iamVjdHMgYmVpbmcgbW92ZWRcbiAgKiAoc2VlIHtAbGluayBncm91cGluZ1NwYWNlci5uYW1lc3BhY2V9KVxuICAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZXNwYWNlPSdzcGFjZXInXVxuICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlciNcbiAgKiBAaW5zdGFuY2VcbiAgKi9cbiAgbmFtZXNwYWNlID0gJ3NwYWNlcicsXG4gIC8qKlxuICAqIFRoZSBhbmltYXRpb24gZm9yIG5ldyBvYmplY3RzIGJlaW5nIGFkZGVkXG4gICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIuZW50ZXJGdW5jdGlvbn0pXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gZW50ZXJGdW5jdGlvblxuICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlciNcbiAgKiBAaW5zdGFuY2VcbiAgKiBAZXhhbXBsZVxuICAqIC8vIGJ5IGRlZmF1bHRcbiAgKiBmdW5jdGlvbihuZXdPYmplY3RTZWxlY3Rpb24pIHtcbiAgKiAgbmV3T2JqZWN0U2VsZWN0aW9uLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uKGQsIGkpe1xuICAqICAgIHZhclxuICAqICAgIHggPSBob3Jpem9udGFsUSA/IG9iamVjdFNpemUgKiBudW1iZXJPZk9iamVjdHMgKyBzcGFjZXJTaXplICogKG51bWJlck9mT2JqZWN0cyAtIDEpIDogMCxcbiAgKiAgICB5ID0gIWhvcml6b250YWxRID8gb2JqZWN0U2l6ZSAqIG51bWJlck9mT2JqZWN0cyArIHNwYWNlclNpemUgKiAobnVtYmVyT2ZPYmplY3RzIC0gMSkgOiAwLFxuICAqICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgKiAgICByZXR1cm4gdFxuICAqICB9KVxuICAqIH1cbiAgKi9cbiAgZW50ZXJGdW5jdGlvbiA9IGZ1bmN0aW9uKGN1cikge1xuICAgIGN1ci5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbihkLCBpKXtcbiAgICAgIHZhclxuICAgICAgeCA9IGhvcml6b250YWxRID8gb2JqZWN0U2l6ZSAqIG51bWJlck9mT2JqZWN0cyArIHNwYWNlclNpemUgKiAobnVtYmVyT2ZPYmplY3RzIC0gMSkgOiAwLFxuICAgICAgeSA9ICFob3Jpem9udGFsUSA/IG9iamVjdFNpemUgKiBudW1iZXJPZk9iamVjdHMgKyBzcGFjZXJTaXplICogKG51bWJlck9mT2JqZWN0cyAtIDEpIDogMCxcbiAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgIHJldHVybiB0XG4gICAgfSlcbiAgfSxcbiAgLyoqXG4gICogVGhlIGFuaW1hdGlvbiBmb3Igb2xkIG9iamVjdHMgYmVpbmcgcmVtb3ZlZFxuICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyLmV4aXRGdW5jdGlvbn0pXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gZXhpdEZ1bmN0aW9uXG4gICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyI1xuICAqIEBpbnN0YW5jZVxuICAqIEBleGFtcGxlXG4gICogLy8gYnkgZGVmYXVsdFxuICAqIG9sZE9iamVjdFNlbGVjdGlvbi50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlKGVhc2VGdW5jKVxuICAqIC5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbihkLCBpKXtcbiAgKiAgICAgdmFyXG4gICogICB4ID0gaG9yaXpvbnRhbFEgPyBvYmplY3RTaXplICogbnVtYmVyT2ZPYmplY3RzICsgc3BhY2VyU2l6ZSAqIChudW1iZXJPZk9iamVjdHMgLSAxKSA6IDAsXG4gICogICB5ID0gIWhvcml6b250YWxRID8gb2JqZWN0U2l6ZSAqIG51bWJlck9mT2JqZWN0cyArIHNwYWNlclNpemUgKiAobnVtYmVyT2ZPYmplY3RzIC0gMSkgOiAwLFxuICAqICAgdCA9ICd0cmFuc2xhdGUoJyt4KycsJyt5KycpJ1xuICAqICAgcmV0dXJuIHRcbiAgKiB9KS5yZW1vdmUoKVxuICAqL1xuICBleGl0RnVuY3Rpb24gPSBmdW5jdGlvbihjdXIpe1xuICAgIGxvZyhcImdyb3VwaW5nU3BhY2VyXCIsIFwiZXhpdGluZyB3aXRoXCIsIHtjdXJyZW50OiBjdXIsIGN1cnJlbnROb2RlOiBjdXIubm9kZSgpfSlcbiAgICBjdXIuY2xhc3NlZCgndG8tcmVtb3ZlJywgdHJ1ZSlcblxuICAgIGN1ci50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKjAuOSkuZWFzZShlYXNlRnVuYylcbiAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24oZCwgaSl7XG4gICAgICB2YXJcbiAgICAgIHggPSBob3Jpem9udGFsUSA/IG9iamVjdFNpemUgKiBudW1iZXJPZk9iamVjdHMgKyBzcGFjZXJTaXplICogKG51bWJlck9mT2JqZWN0cyAtIDEpIDogMCxcbiAgICAgIHkgPSAhaG9yaXpvbnRhbFEgPyBvYmplY3RTaXplICogbnVtYmVyT2ZPYmplY3RzICsgc3BhY2VyU2l6ZSAqIChudW1iZXJPZk9iamVjdHMgLSAxKSA6IDAsXG4gICAgICB0ID0gJ3RyYW5zbGF0ZSgnK3grJywnK3krJyknXG4gICAgICByZXR1cm4gdFxuICAgIH0pLnJlbW92ZSgpXG4gIH1cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgaG9yaXpvbnRhbFEgKHdoZXRoZXIgb3Igbm90IHRvIHNwYWNlIG9iamVjdHMgaG9yaXpvbnRhbGx5IG9yIHZlcnRpY2FsbHkpLlxuICAgKiAoc2VlIHtAbGluayBncm91cGluZ1NwYWNlciNob3Jpem9udGFsUX0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Z3JvdXBpbmdTcGFjZXIgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlclxuICAgKiBAc3RhdGljXG4gICAqL1xuICByZWN1cnNpdmVseVBvc2l0aW9uLmhvcml6b250YWxRID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChob3Jpem9udGFsUSA9IF8sIHJlY3Vyc2l2ZWx5UG9zaXRpb24pIDogaG9yaXpvbnRhbFEgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNjYWxlIHRvIHVzZSB0byBwb3NpdGlvbiBlbGVtZW50cyBpZiB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIjbW92ZWJ5fT1cInN0cmluZ1wiXG4gICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyI3NjYWxlfSlcbiAgICogQHBhcmFtIHtkMy5zY2FsZX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2dyb3VwaW5nU3BhY2VyIHwgZDMuc2NhbGV9XG4gICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlclxuICAgKiBAc3RhdGljXG4gICAqL1xuICByZWN1cnNpdmVseVBvc2l0aW9uLnNjYWxlID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzY2FsZSA9IF8sIHJlY3Vyc2l2ZWx5UG9zaXRpb24pIDogc2NhbGUgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgbW92ZWJ5ICh3aGV0aGVyIG9yIG5vdCB0byBtb3ZlIGJ5IHNjYWxlIG9yIGJ5IGdyb3VwaW5nKS5cbiAgICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIjbW92ZWJ5fSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtncm91cGluZ1NwYWNlciB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHJlY3Vyc2l2ZWx5UG9zaXRpb24ubW92ZWJ5ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChtb3ZlYnkgPSBfLCByZWN1cnNpdmVseVBvc2l0aW9uKSA6IG1vdmVieSB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyBudW1iZXJPZk9iamVjdHMuXG4gICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyI251bWJlck9mT2JqZWN0c30pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Z3JvdXBpbmdTcGFjZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlclxuICAgKiBAc3RhdGljXG4gICAqL1xuICByZWN1cnNpdmVseVBvc2l0aW9uLm51bWJlck9mT2JqZWN0cyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobnVtYmVyT2ZPYmplY3RzID0gXywgcmVjdXJzaXZlbHlQb3NpdGlvbikgOiBudW1iZXJPZk9iamVjdHMgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG9iamVjdENsYXNzICh3aWxsIGJlIGFwcGxpZWQgdG8gPGc+IGVsZW1lbnRzKS5cbiAgICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIjb2JqZWN0Q2xhc3N9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2dyb3VwaW5nU3BhY2VyIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgZ3JvdXBpbmdTcGFjZXJcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgcmVjdXJzaXZlbHlQb3NpdGlvbi5vYmplY3RDbGFzcyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob2JqZWN0Q2xhc3MgPSBfLCByZWN1cnNpdmVseVBvc2l0aW9uKSA6IG9iamVjdENsYXNzIH1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBvYmplY3RTaXplLlxuICAgKiAoc2VlIHtAbGluayBncm91cGluZ1NwYWNlciNvYmplY3RTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtncm91cGluZ1NwYWNlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHJlY3Vyc2l2ZWx5UG9zaXRpb24ub2JqZWN0U2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob2JqZWN0U2l6ZSA9IF8sIHJlY3Vyc2l2ZWx5UG9zaXRpb24pIDogb2JqZWN0U2l6ZSB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgc3BhY2VyU2l6ZS5cbiAgICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIjc3BhY2VyU2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Z3JvdXBpbmdTcGFjZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlclxuICAgKiBAc3RhdGljXG4gICAqL1xuICByZWN1cnNpdmVseVBvc2l0aW9uLnNwYWNlclNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNwYWNlclNpemUgPSBfLCByZWN1cnNpdmVseVBvc2l0aW9uKSA6IHNwYWNlclNpemUgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRyYW5zaXRpb25EdXJhdGlvbi5cbiAgICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIjdHJhbnNpdGlvbkR1cmF0aW9ufSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtncm91cGluZ1NwYWNlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHJlY3Vyc2l2ZWx5UG9zaXRpb24udHJhbnNpdGlvbkR1cmF0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0cmFuc2l0aW9uRHVyYXRpb24gPSBfLCByZWN1cnNpdmVseVBvc2l0aW9uKSA6IHRyYW5zaXRpb25EdXJhdGlvbiB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgZWFzZUZ1bmMuXG4gICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyI2Vhc2VGdW5jfSlcbiAgICogQHBhcmFtIHtkMy5lYXNlfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Z3JvdXBpbmdTcGFjZXIgfCBkMy5lYXNlfVxuICAgKiBAbWVtYmVyb2YgZ3JvdXBpbmdTcGFjZXJcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgcmVjdXJzaXZlbHlQb3NpdGlvbi5lYXNlRnVuYyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZWFzZUZ1bmMgPSBfLCByZWN1cnNpdmVseVBvc2l0aW9uKSA6IGVhc2VGdW5jIH1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBuYW1lc3BhY2UuXG4gICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyI25hbWVzcGFjZX0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Z3JvdXBpbmdTcGFjZXIgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlclxuICAgKiBAc3RhdGljXG4gICAqL1xuICByZWN1cnNpdmVseVBvc2l0aW9uLm5hbWVzcGFjZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobmFtZXNwYWNlID0gXywgcmVjdXJzaXZlbHlQb3NpdGlvbikgOiBuYW1lc3BhY2UgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGVudGVyRnVuY3Rpb24uXG4gICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyI2VudGVyRnVuY3Rpb259KVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Z3JvdXBpbmdTcGFjZXIgfCBmdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHJlY3Vyc2l2ZWx5UG9zaXRpb24uZW50ZXJGdW5jdGlvbiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZW50ZXJGdW5jdGlvbiA9IF8sIHJlY3Vyc2l2ZWx5UG9zaXRpb24pIDogZW50ZXJGdW5jdGlvbiB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgZXhpdEZ1bmN0aW9uLlxuICAgKiAoc2VlIHtAbGluayBncm91cGluZ1NwYWNlciNleGl0RnVuY3Rpb259KVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Z3JvdXBpbmdTcGFjZXIgfCBmdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHJlY3Vyc2l2ZWx5UG9zaXRpb24uZXhpdEZ1bmN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChleGl0RnVuY3Rpb24gPSBfLCByZWN1cnNpdmVseVBvc2l0aW9uKSA6IGV4aXRGdW5jdGlvbiB9XG5cblxuICAvKipcbiAgICogcmVjdXJzaXZlbHkgcG9zaXRpb24gdGhlIG9iamVjdHMgaW5zaWRlIG9mIHRoZSBzZWxlY3Rpb24uXG4gICAqIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBzZWxlY3Rpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICogQHBhcmFtIHtsZXZlbH0gW2xldmVsPTBdIHJlY3Vyc2lvbiBkZXB0aFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSAoaG93IG11Y2ggdG8gbW92ZSBuZXh0IGVsZW1lbnQpXG4gICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlciNcbiAgICovXG4gIGZ1bmN0aW9uIHJlY3Vyc2l2ZWx5UG9zaXRpb24oc2VsZWN0aW9uLCBkYXRhLCBsZXZlbCkge1xuICAgIGlmICggbGV2ZWwgPT0gdW5kZWZpbmVkICkgeyBsZXZlbCA9IDA7ICB9XG5cbiAgICB2YXIgY3VycmVudFNlbGVjdGlvbiA9IHNlbGVjdGlvbi5zZWxlY3RBbGwoJ2cuJytuYW1lc3BhY2UrJ1tsZXZlbD1cIicrbGV2ZWwrJ1wiXScpLmRhdGEoZGF0YSlcbiAgICB2YXIgZW50ZXIgPSBjdXJyZW50U2VsZWN0aW9uLmVudGVyKCkuYXBwZW5kKCdnJykuYXR0cignbGV2ZWwnLCBsZXZlbCkuYXR0cignY2xhc3MnLCBuYW1lc3BhY2UpXG4gICAgdmFyIGV4aXQgPSBjdXJyZW50U2VsZWN0aW9uLmV4aXQoKVxuICAgIGN1cnJlbnRTZWxlY3Rpb24gPSBjdXJyZW50U2VsZWN0aW9uLm1lcmdlKGVudGVyKVxuXG5cbiAgICBpZiAodHlwZW9mIGV4aXRGdW5jdGlvbiA9PSAnZnVuY3Rpb24nICl7IGV4aXQuZWFjaChmdW5jdGlvbihkLCBpKXsgZXhpdEZ1bmN0aW9uKGQzLnNlbGVjdCh0aGlzKSl9KSB9XG4gICAgZWxzZXtleGl0LnJlbW92ZSgpfVxuICAgIC8vIHNwYWNlciBmb3IgY3VycmVudCBsZXZlbFxuICAgIHZhciBsZXZlbFNwYWNlciA9IHNwYWNlclNpemUgLyAobGV2ZWwrMSlcbiAgICAvLyBtb3ZlbWVudCBmb3IgY3VycmVudCBsZXZlbFxuICAgIHZhciBtb3ZlID0gMFxuICAgIGN1cnJlbnRTZWxlY3Rpb24uZWFjaChmdW5jdGlvbihjdXJyZW50RWxlbWVudCwgaW5kZXgpIHtcbiAgICAgIHZhciB0ID0gZDMuc2VsZWN0KHRoaXMpXG4gICAgICBpZiAodC5hdHRyKCd0cmFuc2Zvcm0nKSA9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGVudGVyRnVuY3Rpb24gPT0gJ2Z1bmN0aW9uJykgeyBlbnRlckZ1bmN0aW9uKHQpIH1cblxuICAgICAgdC50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlKGVhc2VGdW5jKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uKGQsIGkpIHtcbiAgICAgICAgdmFyXG4gICAgICAgIHggPSBob3Jpem9udGFsUSA/IChtb3ZlYnkgPT1cInNjYWxlXCIgPyBzY2FsZShkKSA6IG1vdmUpIDogMCxcbiAgICAgICAgeSA9ICFob3Jpem9udGFsUSA/IChtb3ZlYnkgPT1cInNjYWxlXCIgPyBzY2FsZShkKSA6IG1vdmUpOiAwLFxuICAgICAgICB0ID0gJ3RyYW5zbGF0ZSgnK3grJywnK3krJyknXG4gICAgICAgIHJldHVybiB0XG4gICAgICB9KVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50RWxlbWVudCkpIHtcbiAgICAgICAgbW92ZSArPSByZWN1cnNpdmVseVBvc2l0aW9uKHQsIGN1cnJlbnRFbGVtZW50LCBsZXZlbCsxKVxuICAgICAgICB2YXIgdG9SZW1vdmUgPSB0LnNlbGVjdEFsbCgnZy4nK25hbWVzcGFjZSsnW2xldmVsPVwiJysobGV2ZWwpKydcIl0gPiBnLicrb2JqZWN0Q2xhc3MrJy4nK25hbWVzcGFjZSlcbiAgICAgICAgaWYgKHR5cGVvZiBleGl0RnVuY3Rpb24gPT0gJ2Z1bmN0aW9uJyApeyB0b1JlbW92ZS5lYWNoKGZ1bmN0aW9uKGQsIGkpeyBleGl0RnVuY3Rpb24oZDMuc2VsZWN0KHRoaXMpKX0pIH1cbiAgICAgICAgZWxzZXt0b1JlbW92ZS5yZW1vdmUoKX1cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBtb3ZlICs9IG9iamVjdFNpemVcbiAgICAgICAgdmFyIG9iaiA9IHQuc2VsZWN0KCdnLicrbmFtZXNwYWNlKydbbGV2ZWw9XCInK2xldmVsKydcIl0gPiBnLicrb2JqZWN0Q2xhc3MrJy4nK25hbWVzcGFjZSlcbiAgICAgICAgaWYgKG9iai5lbXB0eSgpKSB7IG9iaiA9IHQuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCBvYmplY3RDbGFzcykuY2xhc3NlZChuYW1lc3BhY2UsIHRydWUpIH1cbiAgICAgICAgb2JqLmF0dHIoJ3BhcmVudC1pbmRleCcsIGluZGV4KVxuICAgICAgICB2YXIgdG9SZW1vdmUgPSB0LnNlbGVjdEFsbCgnZy4nK25hbWVzcGFjZSsnW2xldmVsPVwiJysobGV2ZWwrMSkrJ1wiXScpXG5cbiAgICAgICAgaWYgKHR5cGVvZiBleGl0RnVuY3Rpb24gPT0gJ2Z1bmN0aW9uJyApeyB0b1JlbW92ZS5lYWNoKGZ1bmN0aW9uKGQsIGkpeyBleGl0RnVuY3Rpb24oZDMuc2VsZWN0KHRoaXMpKX0pIH1cbiAgICAgICAgZWxzZXt0b1JlbW92ZS5yZW1vdmUoKX1cbiAgICAgIH1cbiAgICAgIG1vdmUgKz0gKGluZGV4ID09IGN1cnJlbnRTZWxlY3Rpb24uc2l6ZSgpLTEpID8gMCA6IGxldmVsU3BhY2VyXG4gICAgfSlcbiAgICByZXR1cm4gbW92ZVxuICB9XG4gIHJldHVybiByZWN1cnNpdmVseVBvc2l0aW9uXG59XG4iLCJpbXBvcnQge1xuICBoeXBlbmF0ZSwgc2FmZVNlbGVjdCwgZXh0cmFjdFZpb2xpblZhbHVlcyxcbiAgdGlja1JhbmdlLCBtb2RpZnlIZXhpZGVjaW1hbENvbG9yTHVtaW5hbmNlLCB0cnVuY2F0ZVRleHQsXG4gIHJvdW5kXG59IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQge3NldHVwQ29udGFpbmVyLCBjYWxjdWxhdGVXaWR0aE9mT2JqZWN0LCBjYWxjdWxhdGVXaWR0aE9mU3BhY2VyfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7dW5pcXVlLCBoYXNRLCBmbGF0dGVufSBmcm9tICcuL2FycmF5LWZ1bmN0aW9ucyc7XG5pbXBvcnQge2dyb3VwaW5nU3BhY2VyfSBmcm9tICcuL2dyb3VwaW5nLXNwYWNlcic7XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXhpc1xuICpcbiAqIHtAbGluayBodHRwczovL3N1bW5ldXJvbi5naXRsYWIuaW8vZDNzbS9kZW1vcy9heGVzL2luZGV4Lmh0bWwgRGVtb31cbiAqIEBjb25zdHJ1Y3RvciBheGlzXG4gKiBAcGFyYW0ge2QzLnNlbGVjdGlvbn0gc2VsZWN0aW9uXG4gKiBAbmFtZXNwYWNlIGF4aXNcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gYXhpc1xuICovXG5leHBvcnQgZnVuY3Rpb24gYXhpcyAoIHNlbGVjdGlvbiApIHtcbiAgdmFyXG4gIC8qKlxuICAqIFRoZSBvcmllbnRhdGlvbiBvZiB0aGUgYXhpc1xuICAqIChzZWUge0BsaW5rIGF4aXMjb3JpZW50fSlcbiAgKiBAcGFyYW0ge3N0cmluZ30gW29yaWVudD0nYm90dG9tJ11cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb3JpZW50ID0gJ2JvdHRvbScsICAgICAgIC8vIGRpcmVjdGlvbiBvZiB0aGUgYXhpc1xuXG4gIC8qKlxuICAqIEFtb3VudCBvZiBob3Jpem9udGFsIHNwYWNlIChpbiBwaXhlbHMpIGF2YWlibGUgdG8gcmVuZGVyIHRoZSBheGlzIGluXG4gICogKHNlZSB7QGxpbmsgYXhpcyNzcGFjZVh9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbc3BhY2VYPTBdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNwYWNlWD0wLFxuICAvKipcbiAgKiBBbW91bnQgb2YgdmVydGljYWwgc3BhY2UgKGluIHBpeGVscykgYXZhaWJsZSB0byByZW5kZXIgdGhlIGF4aXMgaW5cbiAgKiAoc2VlIHtAbGluayBheGlzLnNwYWNlWX0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZVk9MF1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc3BhY2VZPTAsXG5cblxuICAvKipcbiAgKiBXaGV0aGVyIG9yIG5vdCB0byBhbGxvdyBheGlzIHRvIHJlbmRlciBlbGVtZW50cyBwYXNzIHRoZSBtYWluIHNwYXRpYWwgZGltZW5zaW9uXG4gICogZ2l2ZW4gdGhlIG9yaWVudGF0aW9uIChzZWUge0BsaW5rIGF4aXMjb3JpZW50fSksIHdoZXJlIHtAbGluayBheGlzI29yaWVudH09XCJib3R0b21cIiBvciB7QGxpbmsgYXhpcyNvcmllbnR9PVwidG9wXCJcbiAgKiB0aGUgbWFpbiBkaW1lbnNpb24gaXMge0BsaW5rIGF4aXMjc3BhY2VYfSBhbmQgd2hlcmUge0BsaW5rIGF4aXMjb3JpZW50fT1cImxlZnRcIiBvciB7QGxpbmsgYXhpcyNvcmllbnR9PVwicmlnaHRcIlxuICAqIHRoZSBtYWluIGRpbWVuc2lvbiBpcyB7QGxpbmsgYXhpcyNzcGFjZVl9XG4gICogQHBhcmFtIHtib29sZWFufSBbb3ZlcmZsb3dRPWZhbHNlXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBvdmVyZmxvd1EgPSBmYWxzZSwgICAgLy8gd2hldGhlciBvciBub3QgdG8gYWxsb3cgb3ZlcmZsb3dcbiAgLyoqXG4gICogV2hldGhlciBvciBub3QgdGhlIGF4aXMgbGFiZWxzIGFyZSBmb3IgY2F0ZWdvcmljYWwgZGF0YS4gSWYgZmFsc2UsXG4gICogd2lsbCB1c2Uge0BsaW5rIGF4aXMjc2NhbGV9IHRvIHBvc2l0aW9uIHRpY2tzLlxuICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NhdGVnb3JpY2FsUT1mYWxzZV1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgY2F0ZWdvcmljYWxRID0gZmFsc2UsIC8vIHdoZXRoZXIgb3Igbm90IHRoZSBheGlzIGlzIHNob3dpbmcgdmFsdWVzIG9yIGdyb3Vwc1xuICAvKipcbiAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgYXhpcyB0aWNrcyBzaG91bGQgaGF2ZSBndWlkZWxpbmVzXG4gICogQHBhcmFtIHtib29sZWFufSBbY2F0ZWdvcmljYWxRPWZhbHNlXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBndWlkZUxpbmVzUSA9IGZhbHNlLCAgICAvLyB3aGV0aGVyIG9yIG5vdCB0byBhbGxvdyBvdmVyZmxvd1xuXG5cbiAgLyoqXG4gICogSG93IHRvIGdyb3VwIHRoZSB0aWNrIGxhYmVsc1xuICAqIEBwYXJhbSB7QXJyYXlbXX0gW2dyb3VwaW5nPXVuZGVmaW5lZF0gbGlzdCBvZiBwdXRhdGl2ZWx5IG90aGVyIGxpc3RzLCB3aGljaCBzaG91bGQgY29ycmVzcG9uZCB0byB0aWNrTGFiZWxzXG4gICogd2lsbCBzcGFjZSB0aWNrIGxhYmVscyBpbiBuZXN0ZWQgbGlzdHMgY2xvc2VyIHRvZ2V0aGVyIHRoYW4gb3V0ZXIgbGlzdHNcbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZ3JvdXBpbmcsXG5cbiAgLyoqXG4gICogVGhlIHNjYWxlIGZvciB3aGljaCBub24tY2F0ZWdvcmlhbCAoc2VlIHtAbGluayBheGlzI2NhdGVnb3JpY2FsUX0pIHRpY2tzIHNob3VsZCBiZSBzcGFjZWRcbiAgKiBAcGFyYW0ge2QzLnNjYWxlfSBbc2NhbGU9ZDMuc2NhbGVMaW5lYXJdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG5cbiAgc2NhbGUgPSBkMy5zY2FsZUxpbmVhcigpLFxuICAvKipcbiAgKiBUaGUgcGFkZGluZyBmb3IgdGhlIGRvbWFpbiBvZiB0aGUgc2NhbGUgKHNlZSB7QGxpbmsgYXhpcyNzY2FsZX0pXG4gICogQHBhcmFtIHtkMy5zY2FsZX0gW3NjYWxlPWQzLnNjYWxlTGluZWFyXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBkb21haW5QYWRkaW5nID0gMC41LFxuXG5cbiAgLyoqXG4gICogRGVmYXVsdCBzcGFjZSBmb3IgdGhlIHNwYWNlciAocGVyY2VudGFnZSkgb2YgbWFpbiBkaW1lbnNpb24gZ2l2ZW4gdGhlIG9yaWVudGF0aW9uXG4gICogKHNlZSB7QGxpbmsgYXhpcyNvcmllbnR9KSwgd2hlcmUge0BsaW5rIGF4aXMjb3JpZW50fT1cImJvdHRvbVwiIG9yIHtAbGluayBheGlzI29yaWVudH09XCJ0b3BcIlxuICAqIHRoZSBtYWluIGRpbWVuc2lvbiBpcyB7QGxpbmsgYXhpcyNzcGFjZVh9IGFuZCB3aGVyZSB7QGxpbmsgYXhpcyNvcmllbnR9PVwibGVmdFwiIG9yIHtAbGluayBheGlzI29yaWVudH09XCJyaWdodFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBheGlzI3NwYWNlWX1iZXR3ZWVuIHRpY2tzXG4gICogQHBhcmFtIHtudW1iZXJ9IFtvYmplY3RTcGFjZXI9MC4wNV1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb2JqZWN0U3BhY2VyID0gMC4wNSxcbiAgLyoqXG4gICogVGhlIG1pbmltdW0gc2l6ZSB0aGF0IGFuIG9iamVjdCBjYW4gYmUgaWYge0BsaW5rIGF4aXMjY2F0ZWdvcmljYWxRfSBpcyBzZXQgdG8gdHJ1ZVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbbWluT2JqZWN0U2l6ZT0xNV1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgbWluT2JqZWN0U2l6ZSA9IDE1LFxuICAvKipcbiAgKiBUaGUgbWF4aW11bSBzaXplIHRoYXQgYW4gb2JqZWN0IGNhbiBiZSBpZiB7QGxpbmsgYXhpcyNjYXRlZ29yaWNhbFF9IGlzIHNldCB0byB0cnVlXG4gICogQHBhcmFtIHtudW1iZXJ9IFttYXhPYmplY3RTaXplPTE1XVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBtYXhPYmplY3RTaXplID0gNTAsXG5cbiAgLyoqXG4gICogQ29sb3Igb2YgdGhlIGJhY2tncm91bmRcbiAgKiBAcGFyYW0ge3N0cmluZ30gW2JhY2tncm91bmRGaWxsPVwidHJhbnNwYXJlbnRcIl1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgYmFja2dyb3VuZEZpbGwgPSAndHJhbnNwYXJlbnQnLFxuICAvKipcbiAgKiBOYW1lc3BhY2UgZm9yIGFsbCBpdGVtcyBtYWRlIGJ5IHRoaXMgaW5zdGFuY2Ugb2YgYXhpc1xuICAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZXNwYWNlPVwiZDNzbS1heGlzXCJdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG5hbWVzcGFjZSA9ICdkM3NtLWF4aXMnLFxuICAvKipcbiAgKiBDbGFzcyBuYW1lIGZvciB0aWNrIGNvbnRhaW5lciAoPGc+IGVsZW1lbnQpXG4gICogQHBhcmFtIHtzdHJpbmd9IFtvYmplY3RDbGFzcz1cInRpY2stZ3JvdXBcIl1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb2JqZWN0Q2xhc3MgPSAndGljay1ncm91cCcsXG5cbiAgLyoqXG4gICogVmFsdWVzIHRvIHNob3cgYXQgZWFjaCB0aWNrLiBPbmx5IHVzZWQgaWYgY2F0ZWdvcmljYWxRIGlzIHNldCB0cnVlLiBTZWUge0BsaW5rIGF4aXMjY2F0ZWdvcmljYWxRfVxuICAqIEBwYXJhbSB7c3RyaW5nW119IFt0aWNrTGFiZWxzPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdGlja0xhYmVscywgICAvLyB3aGF0IHRvIHBsYWNlIGF0IHRpY2tzXG4gIC8qKlxuICAqIFZhbHVlcyB0byBzaG93IGF0IGVhY2ggdGljay4gT25seSB1c2VkIGlmIGNhdGVnb3JpY2FsUSBpcyBzZXQgZmFsc2UuIFNlZSB7QGxpbmsgYXhpcyNjYXRlZ29yaWNhbFF9XG4gICogQHBhcmFtIHtzdHJpbmdbXSB8IG51bWJlcltdfSBbb2JqZWN0Q2xhc3M9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB0aWNrVmFsdWVzLCAgIC8vIHdoZXJlIHRvIHBsYWNlIHRpY2tzIGlmIG5vdFxuICAvKipcbiAgKiBOdW1iZXIgb2YgdGlja3MgdG8gZGlzcGxheSBpZiBjYXRlZ29yaWNhbFEgaXMgZmFsc2UuIFNlZSB7QGxpbmsgYXhpcyNjYXRlZ29yaWNhbFF9XG4gICogQHBhcmFtIHtudW1iZXJ9IFtudW1iZXJPZlRpY2tzPTVdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG51bWJlck9mVGlja3MgPSA1LFxuXG5cbiAgLyoqXG4gICogU3Ryb2tlIGNvbG9yIG9mIHRoZSBtYWluIGF4aXMgbGluZVxuICAqIEBwYXJhbSB7c3RyaW5nfSBbbGluZVN0cm9rZT0nYmxhY2snXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBsaW5lU3Ryb2tlID0gJ2JsYWNrJyxcbiAgLyoqXG4gICogU3Ryb2tlIHdpZHRoIG9mIHRoZSBtYWluIGF4aXMgbGluZVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbbGluZVN0cm9rZVdpZHRoPTNdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGxpbmVTdHJva2VXaWR0aCA9IDMsXG5cblxuICAvKipcbiAgKiBTdHJva2UgY29sb3Igb2YgdGlja3NcbiAgKiBAcGFyYW0ge3N0cmluZ30gW3RpY2tTdHJva2U9J2JsYWNrJ11cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdGlja1N0cm9rZSA9ICdibGFjaycsXG4gIC8qKlxuICAqIFN0cm9rZSBudW1iZXIgb2YgdGlja3NcbiAgKiBAcGFyYW0ge3N0cmluZ30gW3RpY2tTdHJva2VXaWR0aD0yXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB0aWNrU3Ryb2tlV2lkdGggPSAyLFxuICAvKipcbiAgKiBMZW5ndGggLSBpbiBwaXhlbHMgLSBvZiB0aWNrc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbdGlja0xlbmd0aD0xMF1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdGlja0xlbmd0aCA9IDEwLFxuXG5cbiAgLyoqXG4gICogRm9udCBzaXplIG9mIHRpY2sgbGFiZWxzXG4gICogQHBhcmFtIHtudW1iZXJ9IFt0aWNrTGFiZWxGb250U2l6ZT0xNF1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdGlja0xhYmVsRm9udFNpemUgPSAxNCxcbiAgLyoqXG4gICogTWluIGZvbnQgc2l6ZSBvZiB0aWNrIGxhYmVsc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbdGlja0xhYmVsTWluRm9udFNpemU9OF1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdGlja0xhYmVsTWluRm9udFNpemUgPSA4LFxuICAvKipcbiAgKiBNYXggZm9udCBzaXplIG9mIHRpY2sgbGFiZWxzXG4gICogQHBhcmFtIHtudW1iZXJ9IFt0aWNrTGFiZWxNYXhGb250U2l6ZT0yMF1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdGlja0xhYmVsTWF4Rm9udFNpemUgPSAyMCxcblxuXG4gIC8qKlxuICAqIFRleHQgYW5jaG9yIG9mIHRpY2sgbGFiZWxzXG4gICogQHBhcmFtIHtzdHJpbmd9IFt0aWNrTGFiZWxUZXh0QW5jaG9yPVwibWlkZGxlXCJdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHRpY2tMYWJlbFRleHRBbmNob3IgPSAnbWlkZGxlJyxcbiAgLyoqXG4gICogUm90YXRpb24gb2YgdGljayBsYWJlbHNcbiAgKiBAcGFyYW0ge251bWJlcn0gW3RpY2tMYWJlbFJvdGF0aW9uPTBdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHRpY2tMYWJlbFJvdGF0aW9uID0gMCxcbiAgLyoqXG4gICogT3B0aW9uYWwgZnVuY3Rpb24gZm9yIGV4dHJhY3RpbmcgdGhlIHRpY2sgbGFiZWwgZnJvbSBkYXRhXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW3RpY2tMYWJlbEZ1bmM9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB0aWNrTGFiZWxGdW5jID0gdW5kZWZpbmVkLFxuXG5cbiAgLyoqXG4gICogTGVuZ3RoIG9mIGd1aWRlbGluZXNcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbZ3VpZGVsaW5lU3BhY2U9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBndWlkZWxpbmVTcGFjZSxcbiAgLyoqXG4gICogU3Ryb2tlIGNvbG9yIG9mIGd1aWRsaW5lc1xuICAqIEBwYXJhbSB7c3RyaW5nfSBbZ3VpZGVsaW5lU3BhY2U9XCIjMzMzMzMzXCJdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGd1aWRlTGluZVN0cm9rZSA9ICcjMzMzMzMzJyxcbiAgLyoqXG4gICogU3Ryb2tlIHdpZHRoIG9mIGd1aWRsaW5lc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbZ3VpZGVsaW5lU3BhY2U9Ml1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZ3VpZGVMaW5lU3Ryb2tlV2lkdGggPSAyLFxuXG4gIC8qKlxuICAqIER1cmF0aW9uIG9mIGFsbCB0cmFuc2l0aW9ucyBvZiB0aGlzIGVsZW1lbnRcbiAgKiBAcGFyYW0ge251bWJlcn0gW3RyYW5zaXRpb25EdXJhdGlvbj0xMDAwXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB0cmFuc2l0aW9uRHVyYXRpb24gPSAxMDAwLFxuICAvKipcbiAgKiBFYXNpbmcgZnVuY3Rpb24gZm9yIHRyYW5zaXRpb25zXG4gICogQHBhcmFtIHtkMy5lYXNlfSBbZWFzZUZ1bmM9ZDMuZWFzZUV4cF1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZWFzZUZ1bmMgPSBkMy5lYXNlRXhwLFxuXG5cbiAgLyoqXG4gICogQ2xvc3VyZSB2YXJpYWJsZSBmb3IgZ2V0dGluZyBvYmplY3Qgc2l6ZSBhZnRlciBjYWxjdWxhdGlvblxuICAqIEBwYXJhbSB7bnVtYmVyfSBbb2JqZWN0U2l6ZT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG9iamVjdFNpemUsXG4gIC8qKlxuICAqIENsb3N1cmUgdmFyaWFibGUgZm9yIGdldHRpbmcgc3BhY2VyIHNpemUgYWZ0ZXIgY2FsY3VsYXRpb25cbiAgKiBAcGFyYW0ge251bWJlcn0gW3NwYWNlclNpemU9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzcGFjZXJTaXplLFxuXG4gIC8qKlxuICAqIERlY2ltYWwgcGVyY2lzaW9uIHRvIHJvdW5kIG51bWVyaWNhbCB0aWNrIGxhYmVscyB0b1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbcm91bmRUbz0yXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICByb3VuZFRvID0gMlxuXG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgc2VsZWN0aW9uIGluIHdoaWNoIGl0ZW1zIGFyZSBtYW5pcHVsYXRlZFxuICAgKiBAcGFyYW0ge2QzLnNlbGVjdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBkMy5zZWxlY3Rpb259XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNlbGVjdGlvbiA9IHNlbGVjdGlvblxuICAgKi9cbiAgYXhpcy5zZWxlY3Rpb24gPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNlbGVjdGlvbiA9IF8sIGF4aXMpIDogc2VsZWN0aW9uOyB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIG9yaWVudGF0aW9uIGluIHdoaWNoIGl0ZW1zIGFyZSBtYW5pcHVsYXRlZFxuICAgKiAoc2VlIHtAbGluayBheGlzI29yaWVudH0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXSBzaG91bGQgYmUgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbFxuICAgKiBAcmV0dXJucyB7YXhpcyB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgb3JpZW50PVwiYm90dG9tXCJcbiAgICovXG4gIGF4aXMub3JpZW50ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvcmllbnQgPSBfLCBheGlzKSA6IG9yaWVudDsgfTtcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgYW1vdW50IG9mIGhvcml6b250YWwgc3BhY2UgaW4gd2hpY2ggaXRlbXMgYXJlIG1hbmlwdWxhdGVkXG4gICAqIChzZWUge0BsaW5rIGF4aXMjc3BhY2VYfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdIHNob3VsZCBiZSBhIG51bWJlciA+IDBcbiAgICogQHJldHVybnMge2F4aXMgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNwYWNlWCA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYXhpcy5zcGFjZVggPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNwYWNlWCA9IF8sIGF4aXMpIDogc3BhY2VYOyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBhbW91bnQgb2YgdmVydGljYWwgc3BhY2UgaW4gd2hpY2ggaXRlbXMgYXJlIG1hbmlwdWxhdGVkXG4gICAqIChzZWUge0BsaW5rIGF4aXMjc3BhY2VZfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdIHNob3VsZCBiZSBhIG51bWJlciA+IDBcbiAgICogQHJldHVybnMge2F4aXMgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNwYWNlWSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYXhpcy5zcGFjZVkgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNwYWNlWSA9IF8sIGF4aXMpIDogc3BhY2VZOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHdoZXRoZXIgb3Igbm90IGF4aXMgaXMgYWxsb3dlZCB0byBnbyBiZXlvbmQgc3BlY2lmaWVkIGRpbWVuc2lvbnNcbiAgICogKHNlZSB7QGxpbmsgYXhpcyNzcGFjZVh9KVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgYm9vbGVhbn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgb3ZlcmZsb3dRID0gZmFsc2VcbiAgICovXG4gIGF4aXMub3ZlcmZsb3dRID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvdmVyZmxvd1EgPSBfLCBheGlzKSA6IG92ZXJmbG93UTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHdoZXRoZXIgb3Igbm90IGF4aXMgd2lsbCBkaXNwbGF5IGNhdGVnb3JpYWwgdGlja3Mgb3IgYnkgbnVtZXJpY2FsIHZhbHVlXG4gICAqIChzZWUge0BsaW5rIGF4aXMjY2F0ZWdvcmljYWxRfSlcbiAgICogQHBhcmFtIHtib29sZWFufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IGJvb2xlYW59XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGNhdGVnb3JpY2FsUSA9IGZhbHNlXG4gICAqL1xuICBheGlzLmNhdGVnb3JpY2FsUSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY2F0ZWdvcmljYWxRID0gXywgYXhpcykgOiBjYXRlZ29yaWNhbFE7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB3aGV0aGVyIG9yIG5vdCBheGlzIHRpY2tzIHNob3VsZCBoYXZlIGd1aWRlbGluZXNcbiAgICogKHNlZSB7QGxpbmsgYXhpcyNndWlkZUxpbmVzUX0pXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBib29sZWFufVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBndWlkZUxpbmVzUSA9IGZhbHNlXG4gICAqL1xuICBheGlzLmd1aWRlTGluZXNRID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChndWlkZUxpbmVzUSA9IF8sIGF4aXMpIDogZ3VpZGVMaW5lc1E7IH07XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgaG93IHRpY2tzIHNob3VsZCBiZSBncm91cHBlZFxuICAgKiAoc2VlIHtAbGluayBheGlzI2dyb3VwaW5nfSlcbiAgICogQHBhcmFtIHtBcnJheVtdfSBbXz1ub25lXSBsaXN0IG9mIHB1dGF0aXZlbHkgb3RoZXIgbGlzdHMsIHdoaWNoIHNob3VsZCBjb3JyZXNwb25kIHRvIHRpY2tMYWJlbHNcbiAgICogd2lsbCBzcGFjZSB0aWNrIGxhYmVscyBpbiBuZXN0ZWQgbGlzdHMgY2xvc2VyIHRvZ2V0aGVyIHRoYW4gb3V0ZXIgbGlzdHNcbiAgICogQHJldHVybnMge2F4aXMgfCBBcnJheVtdfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBncm91cGluZyA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYXhpcy5ncm91cGluZyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZ3JvdXBpbmcgPSBfLCBheGlzKSA6IGdyb3VwaW5nOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBzY2FsZSBmb3Igd2hpY2ggbm9uLWNhdGVnb3JpYWwgIHRpY2tzIHNob3VsZFxuICAgKiBiZSBzcGFjZWRcbiAgICogKHNlZSB7QGxpbmsgYXhpcyNzY2FsZX0pXG4gICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgZDMuc2NhbGV9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKVxuICAgKi9cbiAgYXhpcy5zY2FsZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2NhbGUgPSBfLCBheGlzKSA6IHNjYWxlOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHBhZGRpbmcgZm9yIHRoZSBkb21haW4gb2YgdGhlIHNjYWxlXG4gICAqIChzZWUge0BsaW5rIGF4aXMjZG9tYWluUGFkZGluZ30pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgZG9tYWluUGFkZGluZyA9IDAuNVxuICAgKi9cbiAgYXhpcy5kb21haW5QYWRkaW5nID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkb21haW5QYWRkaW5nID0gXywgYXhpcykgOiBkb21haW5QYWRkaW5nOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIG9iamVjdFNwYWNlclxuICAgKiAoc2VlIHtAbGluayBheGlzI29iamVjdFNwYWNlcn0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgb2JqZWN0U3BhY2VyID0gMC4wNVxuICAgKi9cbiAgYXhpcy5vYmplY3RTcGFjZXIgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9iamVjdFNwYWNlciA9IF8sIGF4aXMpIDogb2JqZWN0U3BhY2VyOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG1pbk9iamVjdFNpemVcbiAgICogKHNlZSB7QGxpbmsgYXhpcyNtaW5PYmplY3RTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBtaW5PYmplY3RTaXplID0gMTVcbiAgICovXG4gIGF4aXMubWluT2JqZWN0U2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobWluT2JqZWN0U2l6ZSA9IF8sIGF4aXMpIDogbWluT2JqZWN0U2l6ZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBtYXhPYmplY3RTaXplXG4gICAqIChzZWUge0BsaW5rIGF4aXMjbWF4T2JqZWN0U2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgbWF4T2JqZWN0U2l6ZSA9IDUwXG4gICAqL1xuICBheGlzLm1heE9iamVjdFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG1heE9iamVjdFNpemUgPSBfLCBheGlzKSA6IG1heE9iamVjdFNpemU7IH07XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG5hbWVzcGFjZVxuICAgKiAoc2VlIHtAbGluayBheGlzI25hbWVzcGFjZX0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgbmFtZXNwYWNlID0gJ2Qzc20tYXhpcydcbiAgICovXG4gIGF4aXMubmFtZXNwYWNlID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChuYW1lc3BhY2UgPSBfLCBheGlzKSA6IG5hbWVzcGFjZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBiYWNrZ3JvdW5kRmlsbFxuICAgKiAoc2VlIHtAbGluayBheGlzI2JhY2tncm91bmRGaWxsfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBiYWNrZ3JvdW5kRmlsbCA9ICd0cmFuc3BhcmVudCdcbiAgICovXG4gIGF4aXMuYmFja2dyb3VuZEZpbGwgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGJhY2tncm91bmRGaWxsID0gXywgYXhpcykgOiBiYWNrZ3JvdW5kRmlsbDsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBvYmplY3RDbGFzc1xuICAgKiAoc2VlIHtAbGluayBheGlzI29iamVjdENsYXNzfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvYmplY3RDbGFzcyA9ICd0aWNrLWdyb3VwJ1xuICAgKi9cbiAgYXhpcy5vYmplY3RDbGFzcyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob2JqZWN0Q2xhc3MgPSBfLCBheGlzKSA6IG9iamVjdENsYXNzOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB0aWNrTGFiZWxzXG4gICAqIChzZWUge0BsaW5rIGF4aXMjdGlja0xhYmVsc30pXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgc3RyaW5nW119XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHRpY2tMYWJlbHMgPSB1bmRlZmluZWRcbiAgICovXG4gIGF4aXMudGlja0xhYmVscyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja0xhYmVscyA9IF8sIGF4aXMpIDogdGlja0xhYmVsczsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB0aWNrVmFsdWVzXG4gICAqIChzZWUge0BsaW5rIGF4aXMjdGlja1ZhbHVlc30pXG4gICAqIEBwYXJhbSB7bnVtYmVyW119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgbnVtYmVyW119XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHRpY2tWYWx1ZXMgPSB1bmRlZmluZWRcbiAgICovXG4gIGF4aXMudGlja1ZhbHVlcyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja1ZhbHVlcyA9IF8sIGF4aXMpIDogdGlja1ZhbHVlczsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB0aWNrVmFsdWVzXG4gICAqIChzZWUge0BsaW5rIGF4aXMjbnVtYmVyT2ZUaWNrc30pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgbnVtYmVyT2ZUaWNrcyA9IDVcbiAgICovXG4gIGF4aXMubnVtYmVyT2ZUaWNrcyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobnVtYmVyT2ZUaWNrcyA9IF8sIGF4aXMpIDogbnVtYmVyT2ZUaWNrczsgfTtcblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbGluZVN0cm9rZVxuICAgKiAoc2VlIHtAbGluayBheGlzI2xpbmVTdHJva2V9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGxpbmVTdHJva2UgPSAnYmxhY2snXG4gICAqL1xuICBheGlzLmxpbmVTdHJva2UgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGxpbmVTdHJva2UgPSBfLCBheGlzKSA6IGxpbmVTdHJva2U7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbGluZVN0cm9rZVdpZHRoXG4gICAqIChzZWUge0BsaW5rIGF4aXMjbGluZVN0cm9rZVdpZHRofSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBsaW5lU3Ryb2tlV2lkdGggPSAzXG4gICAqL1xuICBheGlzLmxpbmVTdHJva2VXaWR0aCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobGluZVN0cm9rZVdpZHRoID0gXywgYXhpcykgOiBsaW5lU3Ryb2tlV2lkdGg7IH07XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRpY2tTdHJva2VcbiAgICogKHNlZSB7QGxpbmsgYXhpcyN0aWNrU3Ryb2tlfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0aWNrU3Ryb2tlID0gJ2JsYWNrJ1xuICAgKi9cbiAgYXhpcy50aWNrU3Ryb2tlID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrU3Ryb2tlID0gXywgYXhpcykgOiB0aWNrU3Ryb2tlOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRpY2tTdHJva2VXaWR0aFxuICAgKiAoc2VlIHtAbGluayBheGlzI3RpY2tTdHJva2VXaWR0aH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdGlja1N0cm9rZVdpZHRoID0gMlxuICAgKi9cbiAgYXhpcy50aWNrU3Ryb2tlV2lkdGggPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tTdHJva2VXaWR0aCA9IF8sIGF4aXMpIDogdGlja1N0cm9rZVdpZHRoOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRpY2tMZW5ndGhcbiAgICogKHNlZSB7QGxpbmsgYXhpcyN0aWNrTGVuZ3RofSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0aWNrTGVuZ3RoID0gMTBcbiAgICovXG4gIGF4aXMudGlja0xlbmd0aCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja0xlbmd0aCA9IF8sIGF4aXMpIDogdGlja0xlbmd0aDsgfTtcblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdGlja0xhYmVsRm9udFNpemVcbiAgICogKHNlZSB7QGxpbmsgYXhpcyN0aWNrTGFiZWxGb250U2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdGlja0xhYmVsRm9udFNpemUgPSAxNFxuICAgKi9cbiAgYXhpcy50aWNrTGFiZWxGb250U2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja0xhYmVsRm9udFNpemUgPSBfLCBheGlzKSA6IHRpY2tMYWJlbEZvbnRTaXplOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRpY2tMYWJlbE1pbkZvbnRTaXplXG4gICAqIChzZWUge0BsaW5rIGF4aXMjdGlja0xhYmVsTWluRm9udFNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHRpY2tMYWJlbE1pbkZvbnRTaXplID0gOFxuICAgKi9cbiAgYXhpcy50aWNrTGFiZWxNaW5Gb250U2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja0xhYmVsTWluRm9udFNpemUgPSBfLCBheGlzKSA6IHRpY2tMYWJlbE1pbkZvbnRTaXplOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRpY2tMYWJlbE1heEZvbnRTaXplXG4gICAqIChzZWUge0BsaW5rIGF4aXMjdGlja0xhYmVsTWF4Rm9udFNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHRpY2tMYWJlbE1heEZvbnRTaXplID0gMjBcbiAgICovXG4gIGF4aXMudGlja0xhYmVsTWF4Rm9udFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tMYWJlbE1heEZvbnRTaXplID0gXywgYXhpcykgOiB0aWNrTGFiZWxNYXhGb250U2l6ZTt9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB0aWNrTGFiZWxUZXh0QW5jaG9yXG4gICAqIChzZWUge0BsaW5rIGF4aXMjdGlja0xhYmVsVGV4dEFuY2hvcn0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdGlja0xhYmVsVGV4dEFuY2hvciA9ICdjZW50ZXInXG4gICAqL1xuICBheGlzLnRpY2tMYWJlbFRleHRBbmNob3IgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tMYWJlbFRleHRBbmNob3IgPSBfLCBheGlzKSA6IHRpY2tMYWJlbFRleHRBbmNob3I7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdGlja0xhYmVsUm90YXRpb25cbiAgICogKHNlZSB7QGxpbmsgYXhpcyN0aWNrTGFiZWxSb3RhdGlvbn0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdGlja0xhYmVsUm90YXRpb24gPSAwXG4gICAqL1xuICBheGlzLnRpY2tMYWJlbFJvdGF0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrTGFiZWxSb3RhdGlvbiA9IF8sIGF4aXMpIDogdGlja0xhYmVsUm90YXRpb247IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdGlja0xhYmVsRnVuY1xuICAgKiAoc2VlIHtAbGluayBheGlzI3RpY2tMYWJlbEZ1bmN9KVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IGZ1bmN0aW9ufVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0aWNrTGFiZWxGdW5jID0gdW5kZWZpbmVkXG4gICAqL1xuICBheGlzLnRpY2tMYWJlbEZ1bmMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tMYWJlbEZ1bmMgPSBfLCBheGlzKSA6IHRpY2tMYWJlbEZ1bmM7IH07XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGd1aWRlbGluZVNwYWNlXG4gICAqIChzZWUge0BsaW5rIGF4aXMjZ3VpZGVsaW5lU3BhY2V9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGd1aWRlbGluZVNwYWNlID0gdW5kZWZpbmVkXG4gICAqL1xuICBheGlzLmd1aWRlbGluZVNwYWNlID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChndWlkZWxpbmVTcGFjZSA9IF8sIGF4aXMpIDogZ3VpZGVsaW5lU3BhY2U7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgZ3VpZGVMaW5lU3Ryb2tlXG4gICAqIChzZWUge0BsaW5rIGF4aXMjZ3VpZGVMaW5lU3Ryb2tlfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBndWlkZUxpbmVTdHJva2UgPSBcIiMzMzMzMzNcIlxuICAgKi9cbiAgYXhpcy5ndWlkZUxpbmVTdHJva2UgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGd1aWRlTGluZVN0cm9rZSA9IF8sIGF4aXMpIDogZ3VpZGVMaW5lU3Ryb2tlOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGd1aWRlTGluZVN0cm9rZVdpZHRoXG4gICAqIChzZWUge0BsaW5rIGF4aXMjZ3VpZGVMaW5lU3Ryb2tlV2lkdGh9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGd1aWRlTGluZVN0cm9rZVdpZHRoID0gMlxuICAgKi9cbiAgYXhpcy5ndWlkZUxpbmVTdHJva2VXaWR0aCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZ3VpZGVMaW5lU3Ryb2tlV2lkdGggPSBfLCBheGlzKSA6IGd1aWRlTGluZVN0cm9rZVdpZHRoOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB0cmFuc2l0aW9uRHVyYXRpb25cbiAgICogKHNlZSB7QGxpbmsgYXhpcyN0cmFuc2l0aW9uRHVyYXRpb259KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHRyYW5zaXRpb25EdXJhdGlvbiA9IDEwMDBcbiAgICovXG4gIGF4aXMudHJhbnNpdGlvbkR1cmF0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0cmFuc2l0aW9uRHVyYXRpb24gPSBfLCBheGlzKSA6IHRyYW5zaXRpb25EdXJhdGlvbjsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBlYXNlRnVuY1xuICAgKiAoc2VlIHtAbGluayBheGlzI2Vhc2VGdW5jfSlcbiAgICogQHBhcmFtIHtkMy5lYXNlfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IGQzLmVhc2V9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGVhc2VGdW5jID0gZDMuZWFzZUV4cFxuICAgKi9cbiAgYXhpcy5lYXNlRnVuYyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZWFzZUZ1bmMgPSBfLCBheGlzKSA6IGVhc2VGdW5jOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBvYmplY3RTaXplXG4gICAqIChzZWUge0BsaW5rIGF4aXMjb2JqZWN0U2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgb2JqZWN0U2l6ZSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYXhpcy5vYmplY3RTaXplID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvYmplY3RTaXplID0gXywgYXhpcykgOiBvYmplY3RTaXplOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNwYWNlclNpemVcbiAgICogKHNlZSB7QGxpbmsgYXhpcyNzcGFjZXJTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzcGFjZXJTaXplID0gdW5kZWZpbmVkXG4gICAqL1xuICBheGlzLnNwYWNlclNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNwYWNlclNpemUgPSBfLCBheGlzKSA6IHNwYWNlclNpemU7IH07XG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSByb3VuZFRvXG4gICAqIChzZWUge0BsaW5rIGF4aXMjcm91bmRUb30pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgcm91bmRUbyA9IDJcbiAgICovXG4gIGF4aXMucm91bmRUbyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocm91bmRUbyA9IF8sIGF4aXMpIDogcm91bmRUbzsgfTtcblxuXG5cbiAgZnVuY3Rpb24gYXhpcyAoKSB7XG4gICAgLy8gZm9yIGNvbnZlbmllbmNlIGluIGhhbmRsaW5nIG9yaWVudGF0aW9uIHNwZWNpZmljIHZhbHVlc1xuICAgIHZhciBob3Jpem9udGFsUSA9IGhhc1EoWyd0b3AnLCAnYm90dG9tJywgJ2hvcml6b250YWwnXSxvcmllbnQpID8gdHJ1ZSA6IGZhbHNlXG4gICAgdmFyIHZlcnRpY2FsUSA9ICFob3Jpem9udGFsUVxuXG4gICAgLy8gYmFja2dyb3VuZCBjbGlwaW5nIHJlY3RhbmdsZVxuICAgIHZhciBiZ2NwUmVjdCA9IHt4OjAsIHk6MCwgd2lkdGg6IHNwYWNlWCwgaGVpZ2h0OnNwYWNlWX1cbiAgICBpZiAob3JpZW50ID09IFwibGVmdFwiKSB7IGJnY3BSZWN0LnggLT0gc3BhY2VYOyAgaWYoZ3VpZGVMaW5lc1EpIHsgYmdjcFJlY3Qud2lkdGggKz0gZ3VpZGVsaW5lU3BhY2UgfTsgYmdjcFJlY3QueSAtPSB0aWNrTGFiZWxNYXhGb250U2l6ZTsgYmdjcFJlY3QuaGVpZ2h0ICs9IDIqdGlja0xhYmVsTWF4Rm9udFNpemUgIH1cbiAgICBpZiAob3JpZW50ID09IFwiYm90dG9tXCIpeyBiZ2NwUmVjdC55ID0gYmdjcFJlY3QueTtcbiAgICAgIGlmKGd1aWRlTGluZXNRKSB7IGJnY3BSZWN0LnkgLT0gZ3VpZGVsaW5lU3BhY2U7IGJnY3BSZWN0LmhlaWdodCArPSBndWlkZWxpbmVTcGFjZTsgfTtcbiAgICAgIGJnY3BSZWN0LnggLT0gdGlja0xhYmVsTWF4Rm9udFNpemU7IGJnY3BSZWN0LndpZHRoICs9IDIqdGlja0xhYmVsTWF4Rm9udFNpemVcblxuICAgIH1cbiAgICBpZiAob3JpZW50ID09IFwidG9wXCIpIHsgYmdjcFJlY3QueSAtPSBzcGFjZVk7XG4gICAgICBpZihndWlkZUxpbmVzUSkgeyBiZ2NwUmVjdC5oZWlnaHQgKz0gZ3VpZGVsaW5lU3BhY2UgfTtcbiAgICAgIC8vIGJnY3BSZWN0LnkgLT0gdGlja0xhYmVsTWF4Rm9udFNpemU7IGJnY3BSZWN0LmhlaWdodCArPSAyKnRpY2tMYWJlbE1heEZvbnRTaXplXG4gICAgfVxuICAgIGlmIChvcmllbnQgPT0gXCJyaWdodFwiKSB7IGJnY3BSZWN0LnggPSAwO1xuICAgICAgaWYoZ3VpZGVMaW5lc1EpIHsgYmdjcFJlY3Qud2lkdGggKz0gZ3VpZGVsaW5lU3BhY2U7IGJnY3BSZWN0LnggLT0gZ3VpZGVsaW5lU3BhY2UgfTtcbiAgICAgIGJnY3BSZWN0LnkgLT0gdGlja0xhYmVsTWF4Rm9udFNpemU7IGJnY3BSZWN0LmhlaWdodCArPSAyKnRpY2tMYWJlbE1heEZvbnRTaXplXG4gICAgICBjb25zb2xlLmxvZyhiZ2NwUmVjdClcbiAgICB9XG5cblxuICAgIHZhciBjb250YWluZXIgPSBzZXR1cENvbnRhaW5lciggc2VsZWN0aW9uLCBuYW1lc3BhY2UsIGJnY3BSZWN0LCBiYWNrZ3JvdW5kRmlsbCApO1xuXG4gICAgLy8gdmFyIHRpY2tzID0gIHNhZmVTZWxlY3QoY29udGFpbmVyLCAnZycsIGh5cGVuYXRlKG5hbWVzcGFjZSwnYXhpcy10aWNrcycpKVxuICAgIC8vIHZhciBsYWJlbHMgPSAgc2FmZVNlbGVjdChjb250YWluZXIsICdnJywgaHlwZW5hdGUobmFtZXNwYWNlLCdheGlzLWxhYmVscycpKVxuICAgIC8vIHZhciBndWlkbGluZXMgPSAgc2FmZVNlbGVjdChjb250YWluZXIsICdnJywgaHlwZW5hdGUobmFtZXNwYWNlLCdndWlkZWxpbmUtY29udGFpbmVyJykpXG4gICAgLy9cbiAgICAvLyB2YXIgdGlja3MgPSB0aWNrcy5zZWxlY3RBbGwoJy4nK2h5cGVuYXRlKG5hbWVzcGFjZSwndGljaycpKVxuICAgIC8vIHZhciBsYWJlbHMgPSBsYWJlbHMuc2VsZWN0QWxsKCcuJytoeXBlbmF0ZShuYW1lc3BhY2UsJ2xhYmVsJykpXG4gICAgLy8gdmFyIGdsaW5lcyA9IGd1aWRsaW5lcy5zZWxlY3RBbGwoJy4nK2h5cGVuYXRlKG5hbWVzcGFjZSwnZ3VpZGVsaW5lJykpXG5cbiAgICBpZiAob3JpZW50ID09ICd0b3AnKSB7dGlja0xhYmVsVGV4dEFuY2hvciA9ICdzdGFydCc7IHRpY2tMYWJlbFJvdGF0aW9uID0gOTB9XG4gICAgaWYgKG9yaWVudCA9PSAnYm90dG9tJykge3RpY2tMYWJlbFRleHRBbmNob3IgPSAnZW5kJzsgdGlja0xhYmVsUm90YXRpb24gPSAtOTB9XG4gICAgaWYgKG9yaWVudCA9PSAnbGVmdCcpIHt0aWNrTGFiZWxUZXh0QW5jaG9yID0gJ2VuZCc7IHRpY2tMYWJlbFJvdGF0aW9uID0gMH1cbiAgICBpZiAob3JpZW50ID09ICdyaWdodCcpIHt0aWNrTGFiZWxUZXh0QW5jaG9yID0gJ3N0YXJ0JzsgdGlja0xhYmVsUm90YXRpb24gPSAwfVxuXG5cbiAgICB2YXIgdGlja0RhdGEgPSBjYXRlZ29yaWNhbFFcbiAgICA/IChncm91cGluZyA9PSB1bmRlZmluZWQpID8gdGlja0xhYmVscyA6IGdyb3VwaW5nXG4gICAgOiAoZ3JvdXBpbmcgPT0gdW5kZWZpbmVkKVxuICAgICAgPyAobnVtYmVyT2ZUaWNrcyAhPSB1bmRlZmluZWQpXG4gICAgICAvLyA/ICh0aWNrVmFsdWVzLmxlbmd0aCA8IG51bWJlck9mVGlja3MpXG4gICAgICAgID8gKHRpY2tSYW5nZSguLi5kMy5leHRlbnQodGlja1ZhbHVlcyksIG51bWJlck9mVGlja3MpKVxuICAgICAgICA6IHRpY2tWYWx1ZXNcbiAgICAgIDogZ3JvdXBpbmdcblxuICAgIHZhciBmbGF0VGlja0RhdGEgPSBmbGF0dGVuKHRpY2tEYXRhKVxuICAgIHZhciBudW1iZXJPZk9iamVjdHMgPSBmbGF0VGlja0RhdGEubGVuZ3RoXG4gICAgdmFyIHNwYWNlID0gaG9yaXpvbnRhbFEgPyBzcGFjZVggOiBzcGFjZVlcbiAgICB2YXIgZXh0ZW50ID0gZDMuZXh0ZW50KGZsYXRUaWNrRGF0YSlcblxuICAgIHNjYWxlXG4gICAgLmRvbWFpbihbZXh0ZW50WzBdIC0gZG9tYWluUGFkZGluZywgZXh0ZW50WzFdICsgZG9tYWluUGFkZGluZ10pXG4gICAgLnJhbmdlKFtob3Jpem9udGFsUSA/IDAgOiBzcGFjZVksIGhvcml6b250YWxRID8gc3BhY2VYIDogMF0pXG5cbiAgICAvLyBjYWxjdWxhdGUgb2JqZWN0IHNpemVcbiAgICBvYmplY3RTaXplID0gKG9iamVjdFNpemUgPT0gdW5kZWZpbmVkKVxuICAgID8gY2FsY3VsYXRlV2lkdGhPZk9iamVjdChzcGFjZSwgbnVtYmVyT2ZPYmplY3RzLCBtaW5PYmplY3RTaXplLCBtYXhPYmplY3RTaXplLCBvYmplY3RTcGFjZXIsIG92ZXJmbG93USlcbiAgICA6IG9iamVjdFNpemVcblxuICAgIC8vIGNhbGN1bGF0ZSBzcGFjZXIgc2l6ZSBpZiBuZWVkZWRcbiAgICBzcGFjZXJTaXplID0gKHNwYWNlclNpemUgPT0gdW5kZWZpbmVkKVxuICAgID8gY2FsY3VsYXRlV2lkdGhPZlNwYWNlcihmbGF0VGlja0RhdGEsIHNwYWNlLCBvYmplY3RTaXplLCBudW1iZXJPZk9iamVjdHMsIG9iamVjdFNwYWNlciwgb3ZlcmZsb3dRKVxuICAgIDogc3BhY2VyU2l6ZVxuXG4gICAgdmFyIG9iakNsYXNzID0gaHlwZW5hdGUobmFtZXNwYWNlLCBjYXRlZ29yaWNhbFEgPyBvYmplY3RDbGFzcysnLWNhdGVnb3JpY2FsJyA6IG9iamVjdENsYXNzKVxuXG4gICAgdmFyIHNwYWNlckZ1bmN0aW9uID0gZ3JvdXBpbmdTcGFjZXIoKVxuICAgIC5ob3Jpem9udGFsUShob3Jpem9udGFsUSkuc2NhbGUoc2NhbGUpLm1vdmVieSgoY2F0ZWdvcmljYWxRPydjYXRlZ29yeSc6J3NjYWxlJykpLm51bWJlck9mT2JqZWN0cyhudW1iZXJPZk9iamVjdHMpXG4gICAgLm9iamVjdENsYXNzKG9iakNsYXNzKS5vYmplY3RTaXplKG9iamVjdFNpemUpLnNwYWNlclNpemUoc3BhY2VyU2l6ZSlcbiAgICAudHJhbnNpdGlvbkR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuZWFzZUZ1bmMoZWFzZUZ1bmMpXG4gICAgLm5hbWVzcGFjZShuYW1lc3BhY2UpXG5cbiAgICB2YXIgdGlja0VudGVyQW5pbWF0aW9uID0gZnVuY3Rpb24oc2VsKXtcbiAgICAgIHZhciBtdCA9IHNjYWxlKHNlbC5kYXR1bSgpKSxcbiAgICAgIGRpc3QgPSBzY2FsZShleHRlbnRbMV0pICogMixcbiAgICAgIGsgPSAobXQgPCBleHRlbnRbMV0gLyAyKSA/IDEgOiAtMVxuICAgICAgayA9IGhvcml6b250YWxRID8gayAqIC0xIDoga1xuICAgICAgc2VsLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uIChkLCBpKSB7XG4gICAgICAgIHZhclxuICAgICAgICB4ID0gaG9yaXpvbnRhbFEgPyAgZGlzdCAqIGsgOiAwLFxuICAgICAgICB5ID0gIWhvcml6b250YWxRID8gZGlzdCAqIGsgOiAwLFxuICAgICAgICB0ID0gJ3RyYW5zbGF0ZSgnK3grJywnK3krJyknXG4gICAgICAgIHJldHVybiB0XG4gICAgICB9KVxuICAgIH1cbiAgICB2YXIgdGlja0V4aXRBbmltYXRpb24gPSBmdW5jdGlvbihzZWwpIHtcbiAgICAgIHZhciBtdCA9IHNjYWxlKHNlbC5kYXR1bSgpKSxcbiAgICAgIGRpc3QgPSBzY2FsZShleHRlbnRbMV0pICogMixcbiAgICAgIGsgPSAobXQgPCBleHRlbnRbMV0gLyAyKSA/IDEgOiAtMVxuICAgICAgayA9IGhvcml6b250YWxRID8gayAqIC0xIDoga1xuICAgICAgc2VsLnRyYW5zaXRpb24oKS5kdXJhdGlvbih0cmFuc2l0aW9uRHVyYXRpb24pLmVhc2UoZWFzZUZ1bmMpXG4gICAgICAuc3R5bGUoJ29wYWNpdHknLCAwKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uIChkLCBpKSB7XG4gICAgICAgIHZhclxuXG4gICAgICAgIHggPSBob3Jpem9udGFsUSA/ICBkaXN0ICogayAgOiAwLFxuICAgICAgICB5ID0gIWhvcml6b250YWxRID8gZGlzdCAqIGsgOiAwLFxuICAgICAgICB0ID0gJ3RyYW5zbGF0ZSgnK3grJywnK3krJyknXG4gICAgICAgIHJldHVybiB0XG4gICAgICB9KS5yZW1vdmUoKVxuICAgIH1cblxuICAgIGlmICghY2F0ZWdvcmljYWxRKXtcbiAgICAgIHNwYWNlckZ1bmN0aW9uLmVudGVyRnVuY3Rpb24odGlja0VudGVyQW5pbWF0aW9uKVxuICAgICAgc3BhY2VyRnVuY3Rpb24uZXhpdEZ1bmN0aW9uKHRpY2tFeGl0QW5pbWF0aW9uKVxuICAgIH1cblxuXG5cbiAgICBzcGFjZXJGdW5jdGlvbihjb250YWluZXIsIHRpY2tEYXRhLCAwKVxuXG4gICAgZnVuY3Rpb24gbW92ZVhCeShkLCBpLCBob3Jpem9udGFsUSwgY2F0ZWdvcmljYWxRLCBvYmplY3RTaXplKXtcbiAgICAgIHJldHVybiAoaG9yaXpvbnRhbFEpXG4gICAgICA/IChjYXRlZ29yaWNhbFEpXG4gICAgICAgID8gb2JqZWN0U2l6ZSAvIDJcbiAgICAgICAgOiAwXG4gICAgICA6IDBcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb3ZlWUJ5KGQsIGksIHZlcnRpY2FsUSwgY2F0ZWdvcmljYWxRLCBvYmplY3RTaXplKXtcbiAgICAgIHJldHVybiAodmVydGljYWxRKVxuICAgICAgPyAoY2F0ZWdvcmljYWxRKVxuICAgICAgICA/IG9iamVjdFNpemUgLyAyXG4gICAgICAgIDogMFxuICAgICAgOiAwXG4gICAgfVxuXG4gICAgLy8gbWFrZU5lc3RlZEdyb3Vwcyhjb250YWluZXIsIHRpY2tEYXRhLCBob3Jpem9udGFsUSwgc2NhbGUsIChjYXRlZ29yaWNhbFE/J2NhdGVnb3J5Jzonc2NhbGUnKSxvYmpDbGFzcywgb2JqZWN0U2l6ZSwgc3BhY2VyU2l6ZSwgdW5kZWZpbmVkLCB0cmFuc2l0aW9uRHVyYXRpb24sIGVhc2VGdW5jKVxuXG4gICAgdmFyIHRpY2tzID0gY29udGFpbmVyLnNlbGVjdEFsbCgnZzpub3QoLnRvLXJlbW92ZSkuJytvYmpDbGFzcykuZWFjaChmdW5jdGlvbihkLCBpKXtcbiAgICAgIHZhciB0aGF0ID0gZDMuc2VsZWN0KHRoaXMpLnN0eWxlKCdvcGFjaXR5JywgMSlcblxuICAgICAgdmFyIHRpY2sgPSBzYWZlU2VsZWN0KHRoYXQsICdsaW5lJywgaHlwZW5hdGUobmFtZXNwYWNlLCd0aWNrJykpXG4gICAgICAuYXR0cihcIngxXCIsIDApXG4gICAgICAuYXR0cihcIngyXCIsIGhvcml6b250YWxRID8gMCA6IG9yaWVudCA9PSBcImxlZnRcIiA/IC10aWNrTGVuZ3RoIDogdGlja0xlbmd0aClcbiAgICAgIC5hdHRyKFwieTFcIiwgMClcbiAgICAgIC5hdHRyKCd5MicsICB2ZXJ0aWNhbFEgPyAwIDogb3JpZW50ID09IFwidG9wXCIgPyAtdGlja0xlbmd0aCA6IHRpY2tMZW5ndGgpXG4gICAgICAuYXR0cignc3Ryb2tlJywgdGlja1N0cm9rZSlcbiAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCB0aWNrU3Ryb2tlV2lkdGgpXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24oZCwgaSkge1xuICAgICAgICB2YXJcbiAgICAgICAgeCA9IG1vdmVYQnkoZCwgaSwgaG9yaXpvbnRhbFEsIGNhdGVnb3JpY2FsUSwgb2JqZWN0U2l6ZSksXG4gICAgICAgIHkgPSBtb3ZlWUJ5KGQsIGksIHZlcnRpY2FsUSwgY2F0ZWdvcmljYWxRLCBvYmplY3RTaXplKSxcbiAgICAgICAgdCA9ICd0cmFuc2xhdGUoJyt4KycsJyt5KycpJ1xuICAgICAgICByZXR1cm4gdFxuICAgICAgfSlcblxuICAgICAgdmFyIGxhYmVsID0gc2FmZVNlbGVjdCh0aGF0LCAndGV4dCcsIGh5cGVuYXRlKG5hbWVzcGFjZSwnbGFiZWwnKSlcbiAgICAgIC50ZXh0KGZ1bmN0aW9uKGQsIGkpeyByZXR1cm4gdHlwZW9mIGQgPT0gJ251bWJlcicgPyByb3VuZChkLCByb3VuZFRvKSA6IGR9KVxuICAgICAgLmF0dHIoJ2ZvbnQtc2l6ZScsIHRpY2tMYWJlbEZvbnRTaXplKVxuICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgdGlja0xhYmVsVGV4dEFuY2hvcilcblxuICAgICAgdHJ1bmNhdGVUZXh0KGxhYmVsLCBsYWJlbC50ZXh0KCksIG9yaWVudCwgdGlja0xlbmd0aCwgaG9yaXpvbnRhbFEgPyBzcGFjZVkgOiBzcGFjZVgsIG92ZXJmbG93USlcblxuICAgICAgbGFiZWwuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24oZCwgaSkge1xuICAgICAgICB2YXJcbiAgICAgICAgcmVjdCA9IGQzLnNlbGVjdCh0aGlzKS5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgIHggPSBtb3ZlWEJ5KGQsIGksIGhvcml6b250YWxRLCBjYXRlZ29yaWNhbFEsIG9iamVjdFNpemUpLFxuICAgICAgICB5ID0gbW92ZVlCeShkLCBpLCB2ZXJ0aWNhbFEsIGNhdGVnb3JpY2FsUSwgb2JqZWN0U2l6ZSlcbiAgICAgICAgLy8gb24gcmVjYWxsLCByZWN0IGNoYW5nZXMgYmVjYXVzZSBvZiByb3RhdGlvbiBzbyBuZWVkIE1hdGgubWluKHJlY3QuaGVpZ2h0LCByZWN0LndpZHRoKVxuXG4gICAgICAgIGlmIChvcmllbnQgPT0gJ3RvcCcpIHt5ID0gLXRpY2tMZW5ndGg7IHktPU1hdGgubWF4KHJlY3QuaGVpZ2h0LCByZWN0LndpZHRoKTt4IC09IE1hdGgubWluKHJlY3QuaGVpZ2h0LCByZWN0LndpZHRoKSAqIDAuMjV9XG4gICAgICAgIGlmIChvcmllbnQgPT0gJ2JvdHRvbScpIHt5ID0gdGlja0xlbmd0aDsgeCArPSBNYXRoLm1pbihyZWN0LmhlaWdodCwgcmVjdC53aWR0aCkgKiAwLjI1fVxuICAgICAgICBpZiAob3JpZW50ID09ICdsZWZ0Jykge3ggLT0gdGlja0xlbmd0aDsgIHkgKz0gcmVjdC5oZWlnaHQgKiAwLjU7IHktPSByZWN0LmhlaWdodC80IH1cbiAgICAgICAgaWYgKG9yaWVudCA9PSAncmlnaHQnKSB7eCArPSB0aWNrTGVuZ3RoOyB5ICs9IHJlY3QuaGVpZ2h0ICogMC41OyB5LT0gcmVjdC5oZWlnaHQvNH1cblxuICAgICAgICB2YXJcbiAgICAgICAgdCA9ICd0cmFuc2xhdGUoJyt4KycsJyt5KycpJyxcbiAgICAgICAgciA9ICdyb3RhdGUoJyt0aWNrTGFiZWxSb3RhdGlvbisnKSdcbiAgICAgICAgcmV0dXJuIHQgKyByXG4gICAgICB9KVxuXG5cbiAgICAgICBpZiAoZ3VpZGVMaW5lc1EpIHtcbiAgICAgICAgIHZhciBnbGluZSA9IHNhZmVTZWxlY3QodGhhdCwgJ2xpbmUnLCBoeXBlbmF0ZShuYW1lc3BhY2UsICdndWlkZWxpbmUnKSlcbiAgICAgICAgIC50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlKGVhc2VGdW5jKVxuICAgICAgICAgLmF0dHIoXCJ4MVwiLCAwKVxuICAgICAgICAgLmF0dHIoXCJ4MlwiLCBob3Jpem9udGFsUSA/IDAgOiBvcmllbnQgPT0gXCJsZWZ0XCIgPyBndWlkZWxpbmVTcGFjZSA6IC1ndWlkZWxpbmVTcGFjZSlcbiAgICAgICAgIC5hdHRyKFwieTFcIiwgMClcbiAgICAgICAgIC5hdHRyKCd5MicsICB2ZXJ0aWNhbFEgPyAwIDogb3JpZW50ID09IFwidG9wXCIgPyBndWlkZWxpbmVTcGFjZSA6IC1ndWlkZWxpbmVTcGFjZSlcbiAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbihkLCBpKSB7XG4gICAgICAgICAgIHZhclxuICAgICAgICAgICB4ID0gbW92ZVhCeShkLCBpLCBob3Jpem9udGFsUSwgY2F0ZWdvcmljYWxRLCBvYmplY3RTaXplKSxcbiAgICAgICAgICAgeSA9IG1vdmVZQnkoZCwgaSwgdmVydGljYWxRLCBjYXRlZ29yaWNhbFEsIG9iamVjdFNpemUpLFxuICAgICAgICAgICB0ID0gJ3RyYW5zbGF0ZSgnK3grJywnK3krJyknXG4gICAgICAgICAgIHJldHVybiB0XG4gICAgICAgICB9KVxuICAgICAgIH1cblxuICAgIH0pXG5cbiAgICBpZiAoZ3VpZGVMaW5lc1EpIHtcbiAgICAgIGNvbnRhaW5lci5zZWxlY3RBbGwoJy4nK2h5cGVuYXRlKG5hbWVzcGFjZSwnZ3VpZGVsaW5lJykpXG4gICAgICAuYXR0cignc3Ryb2tlJywgZnVuY3Rpb24oZCwgaSl7XG4gICAgICAgIGlmIChpICUgMiA9PSAwKSB7IHJldHVybiBtb2RpZnlIZXhpZGVjaW1hbENvbG9yTHVtaW5hbmNlKGd1aWRlTGluZVN0cm9rZSwgMC44KSB9XG4gICAgICAgIHJldHVybiBndWlkZUxpbmVTdHJva2VcbiAgICAgIH0pXG4gICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgZnVuY3Rpb24oZCwgaSl7XG4gICAgICAgIGlmIChpICUgMiA9PSAwKSB7IHJldHVybiBndWlkZUxpbmVTdHJva2VXaWR0aCAqMC44fVxuICAgICAgICByZXR1cm4gZ3VpZGVMaW5lU3Ryb2tlV2lkdGhcbiAgICAgIH0pXG4gICAgfVxuXG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgKiogTWFrZSB0aGUgbGluZSBvZiB0aGUgYXhpc1xuICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICB2YXIgbGluZSA9IHNhZmVTZWxlY3Qoc2VsZWN0aW9uLCAncGF0aCcsIGh5cGVuYXRlKG5hbWVzcGFjZSwnbGluZScpKVxuICAgIC8vIC5hdHRyKCd4MScsIDApXG4gICAgLy8gLmF0dHIoJ3gyJywgaG9yaXpvbnRhbFEgPyBzcGFjZVggOiAwKVxuICAgIC8vIC5hdHRyKCd5MScsIDApXG4gICAgLy8gLmF0dHIoJ3kyJywgaG9yaXpvbnRhbFEgPyAwIDogc3BhY2VZKVxuICAgIC5hdHRyKCdkJyxcbiAgICAgIGhvcml6b250YWxRXG4gICAgICA/ICdNIDAsMCBIJyArIHNwYWNlWCArICcsMCdcbiAgICAgIDogJ00gMCwwIFYgMCwnICsgc3BhY2VZXG4gICAgKVxuICAgIC5hdHRyKCdzdHJva2UnLCBsaW5lU3Ryb2tlKVxuICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCBsaW5lU3Ryb2tlV2lkdGgpXG4gICAgLmNsYXNzZWQoJ2F4aXMtbGluZScsIHRydWUpXG5cblxuICB9XG4gIHJldHVybiBheGlzXG59XG4iLCJpbXBvcnQge21vZGlmeUhleGlkZWNpbWFsQ29sb3JMdW1pbmFuY2V9IGZyb20gJy4vaGVscGVycyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNvbG9yRnVuY3Rpb25cbiAqIEBjb25zdHJ1Y3RvciBjb2xvckZ1bmN0aW9uXG4gKiBAbmFtZXNwYWNlIGNvbG9yRnVuY3Rpb25cbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gY29sb3JGdW5jdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sb3JGdW5jdGlvbigpIHtcbiAgdmFyXG4gIC8qKlxuICAqIERlZmF1bHQgY29sb3JzIHRvIHVzZVxuICAqIEBwYXJhbSB7bnVtYmVyW119IFtjb2xvcnM9W1wiIzJjN2JiNlwiLCBcIiMwMGE2Y2FcIiwgXCIjMDBjY2JjXCIsIFwiIzkwZWI5ZFwiLCBcIiNmZmZmOGNcIiwgXCIjZjlkMDU3XCIsIFwiI2YyOWUyZVwiLCBcIiNlNzY4MThcIiwgXCIjZDcxOTFjXCJdXVxuICAqIEBtZW1iZXJvZiBjb2xvckZ1bmN0aW9uI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBjb2xvcnMgPSBbXCIjMmM3YmI2XCIsIFwiIzAwYTZjYVwiLCBcIiMwMGNjYmNcIiwgXCIjOTBlYjlkXCIsIFwiI2ZmZmY4Y1wiLCBcIiNmOWQwNTdcIiwgXCIjZjI5ZTJlXCIsIFwiI2U3NjgxOFwiLCBcIiNkNzE5MWNcIl0sXG4gIC8qKlxuICAqIEludGVycG9sYXRvciBmb3IgY29sb3JzXG4gICogQHBhcmFtIHtkMy5pbnRlcnBvbGF0aW9ufSBbaW50ZXJwb2xhdGlvbj1kMy5pbnRlcnBvbGF0ZVJnYl1cbiAgKiBAbWVtYmVyb2YgY29sb3JGdW5jdGlvbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgaW50ZXJwb2xhdGlvbiA9IGQzLmludGVycG9sYXRlUmdiLFxuICAvKipcbiAgKiBGdW5jdGlvbiBmb3IgbW9kaWZ5aW5nIGNvbG9yIGx1bWluYW5jZVxuICAqIEBwYXJhbSB7ZnVuY3Rpb259IFttb2RpZnlPcGFjaXR5PW1vZGlmeUhleGlkZWNpbWFsQ29sb3JMdW1pbmFuY2VdXG4gICogQG1lbWJlcm9mIGNvbG9yRnVuY3Rpb24jXG4gICogQHByb3BlcnR5XG4gICovXG4gIG1vZGlmeU9wYWNpdHkgPSBtb2RpZnlIZXhpZGVjaW1hbENvbG9yTHVtaW5hbmNlLFxuICAvKipcbiAgKiBIb3cgdG8gbW9kaWZ5IGNvbG9yIGZvciBzdHJva2VcbiAgKiBAcGFyYW0ge251bWJlcn0gW3N0cm9rZU9wYWNpdHk9MF1cbiAgKiBAbWVtYmVyb2YgY29sb3JGdW5jdGlvbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc3Ryb2tlT3BhY2l0eSA9IDAsXG4gIC8qKlxuICAqIEhvdyB0byBtb2RpZnkgY29sb3IgZm9yIGZpbGxcbiAgKiBAcGFyYW0ge251bWJlcn0gW2ZpbGxPcGFjaXR5PTAuNF1cbiAgKiBAbWVtYmVyb2YgY29sb3JGdW5jdGlvbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZmlsbE9wYWNpdHkgPSAwLjQsXG4gIC8qKlxuICAqIEhvdyB0byBkZXRlcm1pbmUgdGhlIGNvbG9yIHRvIHVzZVxuICAqIEBwYXJhbSB7c3RyaW5nfSBbY29sb3JCeT0naW5kZXgnXVxuICAqIEBtZW1iZXJvZiBjb2xvckZ1bmN0aW9uI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBjb2xvckJ5ID0gJ2luZGV4JyxcbiAgLyoqXG4gICogU2V0cyB0aGUgc2NhbGUgZm9yIGludGVycG9sYXRpbmcgdGhlIGNvbG9yc1xuICAqIEBwYXJhbSB7bnVtYmVyW119IFtkYXRhRXh0ZW50PVswLCBjb2xvcnMubGVuZ3RoIC0gMV1dXG4gICogQG1lbWJlcm9mIGNvbG9yRnVuY3Rpb24jXG4gICogQHByb3BlcnR5XG4gICovXG4gIGRhdGFFeHRlbnQgPSBbMCwgY29sb3JzLmxlbmd0aCAtIDFdLFxuICAvKipcbiAgKiBFeHRyYWN0cyB0aGUgdmFsdWUgdG8gY29sb3IgYnlcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbdmFsdWVFeHRyYWN0b3I9ZnVuY3Rpb24oaywgdiwgaSkge3JldHVybiB2fV1cbiAgKiBAbWVtYmVyb2YgY29sb3JGdW5jdGlvbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdmFsdWVFeHRyYWN0b3IgPSBmdW5jdGlvbihrLCB2LCBpKSB7cmV0dXJuIHZ9LFxuICAvKipcbiAgKiBTY2FsZSBmb3IgaW50ZXJwb2xhdGluZyB0aGUgY29sb3JzXG4gICogQHBhcmFtIHtkMy5zY2FsZX0gW3NjYWxlPWQzLnNjYWxlTGluZWFyKCldXG4gICogQG1lbWJlcm9mIGNvbG9yRnVuY3Rpb24jXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKVxuICAuaW50ZXJwb2xhdGUoaW50ZXJwb2xhdGlvbikuZG9tYWluKGRhdGFFeHRlbnQpLnJhbmdlKGNvbG9ycyksXG4gIGhlbHBlclNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKVxuXG4gIC8vIHZhciBoID0geCA9PiAnIycgKyB4Lm1hdGNoKC9cXGQrL2cpLm1hcCh5ID0geiA9PiAoKCt6IDwgMTYpPycwJzonJykgKyAoK3opLnRvU3RyaW5nKDE2KSkuam9pbignJyk7XG4gIHZhciBoID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBcIiNcIiArIHgubWF0Y2goL1xcZCsvZykubWFwKFxuICAgICAgZnVuY3Rpb24oeSwgaSkge1xuICAgICAgICByZXR1cm4gICgoK3kgPCAxNik/JzAnOicnKSArICgreSkudG9TdHJpbmcoMTYpXG4gICAgICB9KS5qb2luKCcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGRlZmF1bHQgY29sb3JzXG4gICAqIChzZWUge0BsaW5rIGNvbG9yRnVuY3Rpb24jY29sb3JzfSlcbiAgICogQHBhcmFtIHtudW1iZXJbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2NvbG9yRnVuY3Rpb24gfCBudW1iZXJbXX1cbiAgICogQG1lbWJlcm9mIGNvbG9yRnVuY3Rpb25cbiAgICogQHByb3BlcnR5XG4gICAqL1xuICBjb2xvckZ1bmN0aW9uLmNvbG9ycyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgID9cbiAgICAgIChcbiAgICAgICAgY29sb3JzID0gXyxcbiAgICAgICAgc2NhbGUucmFuZ2UoY29sb3JzKSxcbiAgICAgICAgY29sb3JGdW5jdGlvblxuICAgICAgKVxuICAgIDogY29sb3JzO1xuICB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBmdW5jdGlvbiBmb3IgaW50ZXJwb2xhdGluZyB0aGUgY29sb3JzXG4gICAqIChzZWUge0BsaW5rIGNvbG9yRnVuY3Rpb24jaW50ZXJwb2xhdGlvbn0pXG4gICAqIEBwYXJhbSB7ZDMuaW50ZXJwb2xhdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2NvbG9yRnVuY3Rpb24gfCBkMy5pbnRlcnBvbGF0aW9ufVxuICAgKiBAbWVtYmVyb2YgY29sb3JGdW5jdGlvblxuICAgKiBAcHJvcGVydHlcbiAgICovXG4gIGNvbG9yRnVuY3Rpb24uaW50ZXJwb2xhdGlvbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgID9cbiAgICAoXG4gICAgICBpbnRlcnBvbGF0aW9uID0gXyxcbiAgICAgIHNjYWxlLmludGVycG9sYXRlKGludGVycG9sYXRpb24pLnJhbmdlKGNvbG9ycyksXG4gICAgICBjb2xvckZ1bmN0aW9uXG4gICAgKVxuICAgIDogaW50ZXJwb2xhdGlvbjtcbiAgfTtcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgdmFsdWVzIGZvciB0aGUgc2NhbGUgd2hpY2ggdHJhbnNmb3JtcyB0aGUgdmFsdWUgdG8gYSBjb2xvclxuICAgKiAoc2VlIHtAbGluayBjb2xvckZ1bmN0aW9uI2RhdGFFeHRlbnR9KVxuICAgKiBAcGFyYW0ge251bWJlcltdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Y29sb3JGdW5jdGlvbiB8IG51bWJlcltdfVxuICAgKiBAbWVtYmVyb2YgY29sb3JGdW5jdGlvblxuICAgKiBAcHJvcGVydHlcbiAgICovXG4gIGNvbG9yRnVuY3Rpb24uZGF0YUV4dGVudCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgID8gKFxuICAgICAgICBkYXRhRXh0ZW50ID0gXyxcbiAgICAgICAgc2NhbGUuZG9tYWluKGRhdGFFeHRlbnQpLmludGVycG9sYXRlKHNjYWxlLmludGVycG9sYXRlKCkpLFxuICAgICAgICBjb2xvckZ1bmN0aW9uXG4gICAgICApXG4gICAgOiBkYXRhRXh0ZW50O1xuICB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSB2dGhlIHNjYWxlIHdoaWNoIHRyYW5zZm9ybXMgdGhlIHZhbHVlIHRvIGEgY29sb3JcbiAgICogKHNlZSB7QGxpbmsgY29sb3JGdW5jdGlvbiNzY2FsZX0pXG4gICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtjb2xvckZ1bmN0aW9uIHwgZDMuc2NhbGV9XG4gICAqIEBtZW1iZXJvZiBjb2xvckZ1bmN0aW9uXG4gICAqIEBwcm9wZXJ0eVxuICAgKi9cbiAgY29sb3JGdW5jdGlvbi5zY2FsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgID8gKFxuICAgICAgICBfID0gXy5kb21haW4oc2NhbGUuZG9tYWluKCkpLmludGVycG9sYXRlKHNjYWxlLmludGVycG9sYXRlKCkpLnJhbmdlKHNjYWxlLnJhbmdlKCkpLFxuICAgICAgICBzY2FsZSA9IF8sXG4gICAgICAgIGNvbG9yRnVuY3Rpb25cbiAgICAgIClcbiAgICA6IHNjYWxlO1xuICB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBmdW5jdGlvbiBmb3IgbW9kaWZ5IG9wYWNpdHlcbiAgICogKHNlZSB7QGxpbmsgY29sb3JGdW5jdGlvbiNtb2RpZnlPcGFjaXR5fSlcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2NvbG9yRnVuY3Rpb24gfCBmdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIGNvbG9yRnVuY3Rpb25cbiAgICogQHByb3BlcnR5XG4gICAqL1xuICBjb2xvckZ1bmN0aW9uLm1vZGlmeU9wYWNpdHkgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG1vZGlmeU9wYWNpdHkgPSBfLCBjb2xvckZ1bmN0aW9uKSA6IG1vZGlmeU9wYWNpdHk7IH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHZhbHVlIHRvIG1vZGlmeSB0aGUgY29sb3IgZm9yIHRoZSBzdHJva2UgdmlhIHtAbGluayBjb2xvckZ1bmN0aW9uI21vZGlmeU9wYWNpdHl9XG4gICAqIChzZWUge0BsaW5rIGNvbG9yRnVuY3Rpb24jc3Ryb2tlT3BhY2l0eX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Y29sb3JGdW5jdGlvbiB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGNvbG9yRnVuY3Rpb25cbiAgICogQHByb3BlcnR5XG4gICAqL1xuICBjb2xvckZ1bmN0aW9uLnN0cm9rZU9wYWNpdHkgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN0cm9rZU9wYWNpdHkgPSBfLCBjb2xvckZ1bmN0aW9uKSA6IHN0cm9rZU9wYWNpdHk7IH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHZhbHVlIHRvIG1vZGlmeSB0aGUgY29sb3IgZm9yIHRoZSBzdHJva2UgdmlhIHtAbGluayBjb2xvckZ1bmN0aW9uI2ZpbGxPcGFjaXR5fVxuICAgKiAoc2VlIHtAbGluayBjb2xvckZ1bmN0aW9uI2ZpbGxPcGFjaXR5fSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtjb2xvckZ1bmN0aW9uIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgY29sb3JGdW5jdGlvblxuICAgKiBAcHJvcGVydHlcbiAgICovXG4gIGNvbG9yRnVuY3Rpb24uZmlsbE9wYWNpdHkgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGZpbGxPcGFjaXR5ID0gXywgY29sb3JGdW5jdGlvbikgOiBmaWxsT3BhY2l0eTsgfTtcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgdmFsdWUgdG8gY29sb3JCeVxuICAgKiAoc2VlIHtAbGluayBjb2xvckZ1bmN0aW9uI2NvbG9yQnl9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2NvbG9yRnVuY3Rpb24gfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBjb2xvckZ1bmN0aW9uXG4gICAqIEBwcm9wZXJ0eVxuICAgKi9cbiAgY29sb3JGdW5jdGlvbi5jb2xvckJ5ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjb2xvckJ5ID0gXywgY29sb3JGdW5jdGlvbikgOiBjb2xvckJ5OyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSB2YWx1ZSBvZiB2YWx1ZUV4dHJhY3RvclxuICAgKiAoc2VlIHtAbGluayBjb2xvckZ1bmN0aW9uI3ZhbHVlRXh0cmFjdG9yfSlcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2NvbG9yRnVuY3Rpb24gfCBmdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIGNvbG9yRnVuY3Rpb25cbiAgICogQHByb3BlcnR5XG4gICAqL1xuICBjb2xvckZ1bmN0aW9uLnZhbHVlRXh0cmFjdG9yID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2YWx1ZUV4dHJhY3RvciA9IF8sIGNvbG9yRnVuY3Rpb24pIDogdmFsdWVFeHRyYWN0b3I7IH07XG5cbiAgZnVuY3Rpb24gY29sb3JGdW5jdGlvbihrZXksIHZhbHVlLCBpbmRleCwgdHlwZSwgaG92ZXJRKSB7XG4gICAgdmFyIGMsXG4gICAgb3BhYyA9IHR5cGUgPT0gXCJmaWxsXCIgPyBmaWxsT3BhY2l0eSA6IHN0cm9rZU9wYWNpdHk7XG4gICAgdXBkYXRlU2NhbGUoKVxuXG4gICAgaWYgKGNvbG9yQnkgPT0gXCJpbmRleFwiKSB7XG4gICAgICBjID0gKHR5cGUgIT0gdW5kZWZpbmVkKSA/IG1vZGlmeU9wYWNpdHkoaChzY2FsZShpbmRleCkpLCBvcGFjKSA6IGgoc2NhbGUoaW5kZXgpKVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdiA9IHZhbHVlRXh0cmFjdG9yKGtleSwgdmFsdWUsIGluZGV4KTtcbiAgICAgIGMgPSAodHlwZSAhPSB1bmRlZmluZWQpID8gbW9kaWZ5T3BhY2l0eShoKHNjYWxlKHYpKSwgb3BhYykgOiBoKHNjYWxlKHYpKVxuICAgIH1cbiAgICByZXR1cm4gY1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlU2NhbGUoKXtcbiAgICBoZWxwZXJTY2FsZS5kb21haW4oWzAsIGNvbG9ycy5sZW5ndGhdKS5yYW5nZShkYXRhRXh0ZW50KVxuICAgIHZhciBhID0gQXJyYXkoY29sb3JzLmxlbmd0aCkuZmlsbCgwKS5tYXAoZnVuY3Rpb24oZCwgaSl7IHJldHVybiBoZWxwZXJTY2FsZShpKSB9KVxuICAgIHNjYWxlLmRvbWFpbihhKVxuICB9XG5cbiAgcmV0dXJuIGNvbG9yRnVuY3Rpb25cbn1cbiIsImltcG9ydCB7c2FmZVNlbGVjdCwgcm91bmR9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQge2xvZywgd2FybiwgaW5mbywgZXJyb3IsIGNvbnNvbGVHcm91cCwgY29uc29sZUdyb3VwRW5kfSBmcm9tICcuL3V0aWxzJztcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE9PTFRJUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKipcbiAqIFByb2R1Y2VzIGEgZnVuY3Rpb24gZm9yIGhhbmRsaW5nIHRoZSB0b29sdGlwXG4gKlxuICoge0BsaW5rIGh0dHBzOi8vc3VtbmV1cm9uLmdpdGxhYi5pby9kM3NtL2RlbW9zL3Rvb2x0aXAtZGVzaWduL2luZGV4Lmh0bWwgRGVtb31cbiAqIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBzZWxlY3Rpb25cbiAqIEByZXR1cm5zIHt0b29sdGlwfVxuICogQG5hbWVzcGFjZSB0b29sdGlwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b29sdGlwKCBzZWxlY3Rpb24gKSB7XG5cbiAgdmFyXG4gIGtleXMsXG4gIHZhbHVlcyxcbiAgaGVhZGVyLFxuICBkYXRhLFxuICBzZWxlY3Rpb24sXG4gIHRhcmdldENsYXNzXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBrZXlzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgdG9vbHRpcC5cbiAgICogSWYgbm90IHNldCwgdXNlcyBkMy5rZXlzKGRhdGFba2V5XSlcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Rvb2x0aXAgfCBzdHJpbmdbXX1cbiAgICogQG1lbWJlcm9mIHRvb2x0aXBcbiAgICovXG4gIHRvb2x0aXAua2V5cyA9IGZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGtleXMgPSBfLCB0b29sdGlwKSA6IGtleXN9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHZhbHVlcyB0byBiZSBkaXNwbGF5ZWQgbmV4dCB0byB0aGUga2V5cy5cbiAgICogSWYgbm90IHNldCwgdXNlcyBkYXRhW2tleV1ba2V5c1tpXV0uXG4gICAqIElmIGEgZnVuY3Rpb24sIGdldHMgcGFzc2VkIGN1cnJlbnREYXRhIChkYXRhW2tleV0pIGFuZCBrZXlzW2ldLlxuICAgKiBAcGFyYW0geypbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Rvb2x0aXAgfCAqW119XG4gICAqIEBtZW1iZXJvZiB0b29sdGlwXG4gICAqL1xuICB0b29sdGlwLnZhbHVlcyA9IGZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZhbHVlcyA9IF8sIHRvb2x0aXApIDogdmFsdWVzfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBoZWFkZXIgdG8gYmUgZGlzcGxheWVkIGluIHRoZSB0b29sdGlwLlxuICAgKiBJZiBub3Qgc2V0LCB1c2VzIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge3Rvb2x0aXAgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiB0b29sdGlwXG4gICAqL1xuICB0b29sdGlwLmhlYWRlciA9IGZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGhlYWRlciA9IF8sIHRvb2x0aXApIDogaGVhZGVyfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBkYXRhIChvdmVyIHRoZSBzZWxlY3Rpb24pIHRvIGJlIHVzZWQgZm9yIHRoZSB0b29sdGlwXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dG9vbHRpcCB8IE9iamVjdH1cbiAgICogQG1lbWJlcm9mIHRvb2x0aXBcbiAgICovXG4gIHRvb2x0aXAuZGF0YSA9IGZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRhdGEgPSBfLCB0b29sdGlwKSA6IGRhdGF9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNlbGVjdGlvbiBmb3IgdGhlIHRvb2x0aXAgdG8gYmUgYXBwbGllZCBvblxuICAgKiBAcGFyYW0ge2QzLnNlbGVjdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Rvb2x0aXAgfCBkMy5zZWxlY3Rpb259XG4gICAqIEBtZW1iZXJvZiB0b29sdGlwXG4gICAqL1xuICB0b29sdGlwLnNlbGVjdGlvbiA9IGZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNlbGVjdGlvbiA9IF8sIHRvb2x0aXApIDogc2VsZWN0aW9ufTtcblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdGFyZ2V0Q2xhc3MgZm9yIHRoZSB0b29sdGlwIHRvIGJlIGFwcGxpZWQgb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt0b29sdGlwIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgdG9vbHRpcFxuICAgKi9cbiAgdG9vbHRpcC50YXJnZXRDbGFzcyA9IGZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRhcmdldENsYXNzID0gXywgdG9vbHRpcCkgOiB0YXJnZXRDbGFzc307XG5cblxuICAvKipcbiAgICogQmluZCwgdmlhIHNlbGVjdGlvbi5vbigpLCB0aGUgbW91c2Vtb3ZlIGFuZCBtb3VzZW91dCBldmVudHNcbiAgICogQHJldHVybnMgdW5kZWZpbmVkXG4gICAqL1xuICBmdW5jdGlvbiB0b29sdGlwKCApIHtcbiAgICBzZWxlY3Rpb24ub24oJ21vdXNlb3ZlcicsIG1vdXNlbW92ZSlcbiAgICBzZWxlY3Rpb24ub24oJ21vdXNlbW92ZScsIG1vdXNlbW92ZSlcbiAgICBzZWxlY3Rpb24ub24oJ21vdXNlb3V0JywgZnVuY3Rpb24oKXsgZDMuc2VsZWN0QWxsKFwiLmQzc20tdG9vbHRpcFwiKS5yZW1vdmUoKX0pXG4gIH1cblxuXG4gIC8qKlxuICAgKiBQcm9kdWNlcyB0aGUgdG9vbHRpcCBvbiBtb3VzZW1vdmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBvZiB0aGUgb2JqZWN0IHRhcmdldGVkIGJ5IHRoZSBtb3VzZW1vdmVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGkgKGluZGV4KSBvZiB0aGUgb2JqZWN0IHRhcmdldGVkIGJ5IG1vdXNlbW92ZVxuICAgKiBAbWVtYmVyb2YgdG9vbHRpcFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZnVuY3Rpb24gbW91c2Vtb3ZlKGtleSwgaSkge1xuICAgIGNvbnNvbGVHcm91cCgnZDNzbS10b29sdGlwJylcbiAgICB2YXIgY3VycmVudERhdGEgPSBkYXRhW2tleV1cblxuICAgIHZhciBbeCwgeV0gPSBkMy5tb3VzZShkMy5zZWxlY3QoXCJodG1sXCIpLm5vZGUoKSlcbiAgICBsb2coJ3Rvb2x0aXAnLCAnbW91c2Vtb3ZlIGRldGVjdGVkJyx7a2V5OiBrZXksIGluZGV4OiBpLCB4OngsIHk6eX0pXG4gICAgbG9nKCd0b29sdGlwJywgJ2N1cnJlbnQgZGF0YScsIGN1cnJlbnREYXRhKVxuXG4gICAgdmFyIGRpdiA9IHNhZmVTZWxlY3QoZDMuc2VsZWN0KCdodG1sJyksICd0b29sdGlwJywgJ2Qzc20tdG9vbHRpcCcpXG4gICAgLmNsYXNzZWQoJ2NhcmQnLCB0cnVlKVxuICAgIC5zdHlsZSgnbWF4LXdpZHRoJywgJzMwMHB4JylcbiAgICAuc3R5bGUoJ2JhY2tncm91bmQtY29sb3InLCBcIiMyMTI1MjlcIilcbiAgICAuc3R5bGUoJ2NvbG9yJywgJ3doaXRlJylcblxuXG5cbiAgICB2YXIgY2FyZEJvZHkgPSBzYWZlU2VsZWN0KGRpdiwgJ2RpdicsICdjYXJkLWJvZHknKVxuICAgIHZhciBjYXJkVGl0bGUgPSBzYWZlU2VsZWN0KGNhcmRCb2R5LCAnaDUnLCAnY2FyZC10aXRsZScpXG4gICAgLnRleHQoaGVhZGVyID09IHVuZGVmaW5lZCA/IGtleSA6IHR5cGVvZiBoZWFkZXIgPT0gJ2Z1bmN0aW9uJyA/IGhlYWRlcihrZXksIGkpIDogaGVhZGVyKVxuICAgIC5zdHlsZSgnY29sb3InLCAnY3lhbicpXG5cblxuICAgIHZhciB0YWJsZSA9IHNhZmVTZWxlY3QoY2FyZEJvZHksICd0YWJsZScsICd0YWJsZScpLmNsYXNzZWQoJ3RhYmxlLWRhcmsnLCB0cnVlKVxuICAgIHZhciB0Qm9keSA9IHNhZmVTZWxlY3QodGFibGUsICd0Ym9keScpXG5cbiAgICB0Qm9keSA9IHRCb2R5LnNlbGVjdEFsbCgndHInKVxuICAgIHRCb2R5PSB0Qm9keS5kYXRhKGtleXMgPT0gdW5kZWZpbmVkID8gZDMua2V5cyhjdXJyZW50RGF0YSk6IGtleXMpXG5cblxuXG4gICAgdEJvZHkuZXhpdCgpLnJlbW92ZSgpXG5cbiAgICB2YXIgdHIgPSB0Qm9keS5lbnRlcigpLmFwcGVuZCgndHInKVxuXG4gICAgY29uc29sZUdyb3VwKCd0b29sdGlwLXJvd3MnKVxuICAgIHRyLmVhY2goZnVuY3Rpb24oZCwgaSkge1xuXG4gICAgICBkMy5zZWxlY3QodGhpcykuYXBwZW5kKCd0ZCcpLmF0dHIoJ2NsYXNzJywgJ3Rvb2x0aXAta2V5JykudGV4dChmdW5jdGlvbihkLCBpKXtyZXR1cm4gZH0pXG4gICAgICBkMy5zZWxlY3QodGhpcykuYXBwZW5kKCd0ZCcpLmF0dHIoJ2NsYXNzJywgJ3Rvb2x0aXAtdmFsdWUnKVxuICAgICAgLnRleHQoZnVuY3Rpb24oZCwgaSl7XG4gICAgICAgIGxvZygndG9vbHRpcCcsICd0cnlpbmcgdG8gc2V0IHZhbHVlJywge3Jvd0tleTogZCwgcm93SW5kZXg6IGl9KVxuICAgICAgICB2YXIgdiA9IGN1cnJlbnREYXRhW2RdO1xuICAgICAgICBpZiAodmFsdWVzICE9IHVuZGVmaW5lZCkge3YgPSB2YWx1ZXNbaV07IGlmKHR5cGVvZiB2ID09IFwiZnVuY3Rpb25cIikge3YgPSB2KGN1cnJlbnREYXRhLCBkKX19XG4gICAgICAgIHJldHVybiAgdHlwZW9mIHYgPT0gJ251bWJlcicgPyByb3VuZCh2LCA1KSA6IHZcbiAgICAgIH0pXG4gICAgfSlcbiAgICB0Qm9keSA9IHRCb2R5Lm1lcmdlKHRyKVxuXG4gICAgdEJvZHkuc2VsZWN0QWxsKCcudG9vbHRpcC1rZXknKS50ZXh0KGZ1bmN0aW9uKGQsIGkpe3JldHVybiBkfSlcbiAgICB0Qm9keS5zZWxlY3RBbGwoJy50b29sdGlwLXZhbHVlJykudGV4dChmdW5jdGlvbihkLCBpKXtcbiAgICAgIGxvZygndG9vbHRpcCcsICd0cnlpbmcgdG8gc2V0IHZhbHVlJywge3Jvd0tleTogZCwgcm93SW5kZXg6IGl9KVxuICAgICAgdmFyIHYgPSBjdXJyZW50RGF0YVtkXTtcbiAgICAgIGlmICh2YWx1ZXMgIT0gdW5kZWZpbmVkKSB7diA9IHZhbHVlc1tpXTsgaWYodHlwZW9mIHYgPT0gXCJmdW5jdGlvblwiKSB7diA9IHYoY3VycmVudERhdGEsIGQpfX1cbiAgICAgIHJldHVybiAgdHlwZW9mIHYgPT0gJ251bWJlcicgPyByb3VuZCh2LCA1KSA6IHZcbiAgICB9KVxuXG4gICAgY29uc29sZUdyb3VwRW5kKClcbiAgICBjb25zb2xlR3JvdXBFbmQoKVxuXG4gICAgZGl2LnN0eWxlKCdwb3NpdGlvbicpID09IFwicmVsYXRpdmVcIlxuICAgID8gZGl2LnN0eWxlKCdwb3NpdGlvbicsICdhYnNvbHV0ZScpLnN0eWxlKCdsZWZ0JywgeCsxNSsncHgnKS5zdHlsZSgndG9wJywgeSsncHgnKVxuICAgIDogZGl2LnRyYW5zaXRpb24oKS5kdXJhdGlvbigyMDApLmVhc2UoZDMuZWFzZVNpbikuc3R5bGUoJ2xlZnQnLCB4KzE1KydweCcpLnN0eWxlKCd0b3AnLCB5KydweCcpXG4gIH1cblxuICByZXR1cm4gdG9vbHRpcFxufVxuIiwiaW1wb3J0IHtoeXBlbmF0ZSwgc2FmZVNlbGVjdH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7c2V0dXBDb250YWluZXIsIGNhbGN1bGF0ZVdpZHRoT2ZPYmplY3QsIGNhbGN1bGF0ZVdpZHRoT2ZTcGFjZXJ9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHt1bmlxdWUsIGZsYXR0ZW59IGZyb20gJy4vYXJyYXktZnVuY3Rpb25zJztcbmltcG9ydCB7Z3JvdXBpbmdTcGFjZXJ9IGZyb20gJy4vZ3JvdXBpbmctc3BhY2VyJztcbmltcG9ydCB7Y29sb3JGdW5jdGlvbiBhcyBDRn0gZnJvbSAnLi9jb2xvci1mdW5jdGlvbic7XG5pbXBvcnQge3Rvb2x0aXAgYXMgVFRpcH0gZnJvbSAnLi90b29sdGlwJztcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qKlxuICogQ3JlYXRlcyBhIGJhclxuICpcbiAqIHtAbGluayBodHRwczovL3N1bW5ldXJvbi5naXRsYWIuaW8vZDNzbS9kZW1vcy9iYXItY2hhcnQtc2FtZS1kYXRhLWNvbXBsZXgtZ3JvdXBpbmcvaW5kZXguaHRtbCBEZW1vfVxuICogQGNvbnN0cnVjdG9yIGJhclxuICogQHBhcmFtIHtkMy5zZWxlY3Rpb259IHNlbGVjdGlvblxuICogQG5hbWVzcGFjZSBiYXJcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gYmFyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYXIgKCBzZWxlY3Rpb24gKSB7XG4gIC8qXG4gIEFzc3VtZXMgdGhhdCBkYXRhIGlzIGxpc3QgYW4gb2JqZWN0LlxuXG4gIFRoZSBrZXlzIG9mIGRhdGEgd2lsbCBiZSBib3VuZCB0byB0aGUgYmFycy5cbiAgVGhlIHZhbHVlRXh0cmFjdG9yIGZ1bmN0aW9uIHdpbGwgZXh0cmFjdCB0aGUgdmFsdWUgZnJvbSBkYXRhW2tleV0uXG5cbiAgR3JvdXBpbmcgY2FuIGJlIHVzZWQgaWYgZGVzaXJlZC4gSXQgc2hvdWxkIGJlIGFuIGFyYml0cmFyeSBjb21wbGV4IGxpc3Qgd2hlcmVcbiAgdGhlIHZhbHVlcyBhcmUgc3RyaW5ncyBtYXRjaGluZyBrZXlzIGluIGRhdGEuXG4gICovXG4gIHZhclxuICAvKipcbiAgKiBEYXRhIHRvIHBsb3QuIEFzc3VtZWQgdG8gYmUgYSBvYmplY3QsIHdoZXJlIGVhY2gga2V5IGNvcnJlc3BvbmRzIHRvIGEgYmFyXG4gICogKHNlZSB7QGxpbmsgYmFyI2RhdGF9KVxuICAqIEBwYXJhbSB7T2JqZWN0fSBbZGF0YT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZGF0YSxcbiAgLyoqXG4gICogV2hpY2ggZGlyZWN0aW9uIHRvIHJlbmRlciB0aGUgYmFycyBpblxuICAqIChzZWUge0BsaW5rIGJhciNvcmllbnR9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbb3JpZW50PSdob3Jpem9udGFsJ11cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBvcmllbnQ9J2hvcml6b250YWwnLFxuICAvKipcbiAgKiBBbW91bnQgb2YgaG9yaXpvbnRhbCBzcGFjZSAoaW4gcGl4ZWxzKSBhdmFpYmxlIHRvIHJlbmRlciB0aGUgYmFyIGluXG4gICogKHNlZSB7QGxpbmsgYmFyI3NwYWNlWH0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZVg9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNwYWNlWCxcbiAgLyoqXG4gICogQW1vdW50IG9mIHZlcnRpY2FsIHNwYWNlIChpbiBwaXhlbHMpIGF2YWlibGUgdG8gcmVuZGVyIHRoZSBiYXIgaW5cbiAgKiAoc2VlIHtAbGluayBiYXIuc3BhY2VZfSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW3NwYWNlWT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc3BhY2VZLFxuXG4gIC8qKlxuICAqIFdoZXRoZXIgb3Igbm90IHRvIGFsbG93IGJhciB0byByZW5kZXIgZWxlbWVudHMgcGFzcyB0aGUgbWFpbiBzcGF0aWFsIGRpbWVuc2lvblxuICAqIGdpdmVuIHRoZSBvcmllbnRhdGlvbiAoc2VlIHtAbGluayBiYXIjb3JpZW50fSksIHdoZXJlIHtAbGluayBiYXIjb3JpZW50fT1cImhvcml6b250YWxcIlxuICAqIHRoZSBtYWluIGRpbWVuc2lvbiBpcyB7QGxpbmsgYmFyI3NwYWNlWH0gYW5kIHdoZXJlIHtAbGluayBiYXIjb3JpZW50fT1cInZlcnRpY2FsXCJcbiAgKiB0aGUgbWFpbiBkaW1lbnNpb24gaXMge0BsaW5rIGJhciNzcGFjZVl9XG4gICogQHBhcmFtIHtib29sZWFufSBbb3ZlcmZsb3dRPWZhbHNlXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG92ZXJmbG93USA9IGZhbHNlLFxuXG4gIC8qKlxuICAqIEFuIGFycmF5IC0gcHV0YXRpdmVseSBvZiBvdGhlciBhcnJheXMgLSBkZXBpY3RpbmcgaG93IGJhcnMgc2hvdWxkIGJlIGFycmFuZ2VkXG4gICogQHBhcmFtIHtBcnJheVtdfSBbZ3JvdXBpbmc9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGdyb3VwaW5nLFxuXG4gIC8qKlxuICAqIEhvdyB0byBnZXQgdGhlIHZhbHVlIG9mIHRoZSBiYXJcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbdmFsdWVFeHRyYWN0b3I9ZnVuY3Rpb24oa2V5LCBpbmRleCkgeyByZXR1cm4gZGF0YVtrZXldIH1dXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdmFsdWVFeHRyYWN0b3IgPSBmdW5jdGlvbihrZXksIGluZGV4KSB7IHJldHVybiBkYXRhW2tleV0gfSxcbiAgLyoqXG4gICogSG93IHRvIHNvcnQgdGhlIGJhcnMgLSBpZiB7QGxpbmsgYmFyI2dyb3VwaW5nfSBpcyBub3QgcHJvdmlkZWQuXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW3NvcnRpbmdGdW5jdGlvbj1mdW5jdGlvbihrZXlBLCBrZXlCKSB7cmV0dXJuIGQzLmRlc2NlbmRpbmcoZGF0YVtrZXlBXSwgZGF0YVtrZXlCXSl9XVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNvcnRpbmdGdW5jdGlvbiA9IGZ1bmN0aW9uKGtleUEsIGtleUIpIHtyZXR1cm4gZDMuZGVzY2VuZGluZyhkYXRhW2tleUFdLCBkYXRhW2tleUJdKX0sXG5cbiAgLyoqXG4gICogVGhlIHNjYWxlIGZvciB3aGljaCBiYXIgdmFsdWVzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBieVxuICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtzY2FsZT1kMy5zY2FsZUxpbmVhcl1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzY2FsZSA9IGQzLnNjYWxlTGluZWFyKCksXG4gIC8qKlxuICAqIFRoZSBwYWRkaW5nIGZvciB0aGUgZG9tYWluIG9mIHRoZSBzY2FsZSAoc2VlIHtAbGluayBiYXIjc2NhbGV9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbZG9tYWluUGFkZGluZz0wLjVdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZG9tYWluUGFkZGluZyA9IDAuNSxcblxuICAvKipcbiAgKiBEZWZhdWx0IHNwYWNlIGZvciB0aGUgc3BhY2VyIChwZXJjZW50YWdlKSBvZiBtYWluIGRpbWVuc2lvbiBnaXZlbiB0aGUgb3JpZW50YXRpb25cbiAgKiAoc2VlIHtAbGluayBiYXIjb3JpZW50fSksIHdoZXJlIHtAbGluayBiYXIjb3JpZW50fT1cImhvcml6b250YWxcIlxuICAqIHRoZSBtYWluIGRpbWVuc2lvbiBpcyB7QGxpbmsgYmFyI3NwYWNlWH0gYW5kIHdoZXJlIHtAbGluayBiYXIjb3JpZW50fT1cInZlcnRpY2FsXCJcbiAgKiB0aGUgbWFpbiBkaW1lbnNpb24gaXMge0BsaW5rIGJhciNzcGFjZVl9IGJldHdlZW4gYmFyc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbb2JqZWN0U3BhY2VyPTAuMDVdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb2JqZWN0U3BhY2VyID0gMC4wNSxcbiAgLyoqXG4gICogVGhlIG1pbmltdW0gc2l6ZSB0aGF0IGFuIG9iamVjdCBjYW4gYmVcbiAgKiBAcGFyYW0ge251bWJlcn0gW21pbk9iamVjdFNpemU9NTBdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgbWluT2JqZWN0U2l6ZSA9IDUwLFxuICAvKipcbiAgKiBUaGUgbWF4aW11bSBzaXplIHRoYXQgYW4gb2JqZWN0IGNhbiBiZVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4T2JqZWN0U2l6ZT0xMDBdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgbWF4T2JqZWN0U2l6ZSA9IDEwMCxcblxuICAvKipcbiAgKiBUaGUgc3Ryb2tlIHdpZHRoIG9mIHRoZSBiYXJzXG4gICogQHBhcmFtIHtudW1iZXJ9IFtiYXJTdHJva2VXaWR0aD0yXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGJhclN0cm9rZVdpZHRoID0gMixcbiAgLyoqXG4gICogSW5zdGFuY2Ugb2YgQ29sb3JGdW5jdGlvblxuICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtjb2xvckZ1bmN0aW9uID0gY29sb3JGdW5jdGlvbigpXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGNvbG9yRnVuY3Rpb24gPSBDRigpLFxuXG5cbiAgLyoqXG4gICogQ29sb3Igb2YgdGhlIGJhY2tncm91bmRcbiAgKiBAcGFyYW0ge3N0cmluZ30gW2JhY2tncm91bmRGaWxsPVwidHJhbnNwYXJlbnRcIl1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBiYWNrZ3JvdW5kRmlsbCA9ICd0cmFuc3BhcmVudCcsXG4gIC8qKlxuICAqIE5hbWVzcGFjZSBmb3IgYWxsIGl0ZW1zIG1hZGUgYnkgdGhpcyBpbnN0YW5jZSBvZiBiYXJcbiAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVzcGFjZT1cImQzc20tYmFyXCJdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgbmFtZXNwYWNlID0gJ2Qzc20tYmFyJyxcbiAgLyoqXG4gICogQ2xhc3MgbmFtZSBmb3IgYmFyIGNvbnRhaW5lciAoPGc+IGVsZW1lbnQpXG4gICogQHBhcmFtIHtzdHJpbmd9IFtvYmplY3RDbGFzcz1cImJhclwiXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG9iamVjdENsYXNzID0gJ2JhcicsXG5cbiAgLyoqXG4gICogRHVyYXRpb24gb2YgYWxsIHRyYW5zaXRpb25zIG9mIHRoaXMgZWxlbWVudFxuICAqIEBwYXJhbSB7bnVtYmVyfSBbdHJhbnNpdGlvbkR1cmF0aW9uPTEwMDBdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdHJhbnNpdGlvbkR1cmF0aW9uID0gMTAwMCxcbiAgLyoqXG4gICogRWFzaW5nIGZ1bmN0aW9uIGZvciB0cmFuc2l0aW9uc1xuICAqIEBwYXJhbSB7ZDMuZWFzZX0gW2Vhc2VGdW5jPWQzLmVhc2VFeHBdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZWFzZUZ1bmMgPSBkMy5lYXNlRXhwLFxuXG4gIC8vIHVzZWZ1bCB2YWx1ZXMgdG8gZXh0cmFjdCB0byBwcmV2ZW50IHJlLWNhbGN1bGF0aW9uXG4gIC8qKlxuICAqIFRoZSBrZXlzIG9mIHRoZSBiYXJzXG4gICogQHBhcmFtIHtzdHJpbmdbXX0gW2JhcktleXM9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGJhcktleXMsXG4gIC8qKlxuICAqIFRoZSB2YWx1ZXMgb2YgdGhlIGJhcnNcbiAgKiBAcGFyYW0ge251bWJlcltdfSBbYmFyVmFsdWVzPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBiYXJWYWx1ZXMsXG4gIC8qKlxuICAqIFRoZSBvYmplY3RTaXplIChhY3R1YWwgd2lkdGgpIHVzZWQgYnkgdGhlIGJhcnNcbiAgKiBAcGFyYW0ge251bWJlcn0gW29iamVjdFNpemU9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG9iamVjdFNpemUsXG4gIC8qKlxuICAqIFRoZSBzcGFjZXJTaXplIChhY3R1YWwgd2lkdGgpIHVzZWQgYnkgdGhlIHNwYWNlcnMgYmV0d2VlbiB0aGUgYmFyc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbc3BhY2VyU2l6ZT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc3BhY2VyU2l6ZSxcbiAgLyoqXG4gICogSW5zdGFuY2Ugb2YgVG9vbHRpcFxuICAqIEBwYXJhbSB7ZnVuY3Rpb259IFt0b29sdGlwPXRvb2x0aXAoKV1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB0b29sdGlwID0gVFRpcCgpXG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgc2VsZWN0aW9uIGluIHdoaWNoIGl0ZW1zIGFyZSBtYW5pcHVsYXRlZFxuICAgKiBAcGFyYW0ge2QzLnNlbGVjdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IGQzLnNlbGVjdGlvbn1cbiAgICogQG1lbWJlcm9mIGJhclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzZWxlY3Rpb24gPSBzZWxlY3Rpb25cbiAgICovXG4gIGJhci5zZWxlY3Rpb24gPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNlbGVjdGlvbiA9IF8sIGJhcikgOiBzZWxlY3Rpb247IH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGRhdGFcbiAgICogKHNlZSB7QGxpbmsgYmFyI2RhdGF9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IG9iamVjdH1cbiAgICogQG1lbWJlcm9mIGJhclxuICAgKiBAcHJvcGVydHlcbiAgICovXG4gIGJhci5kYXRhID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkYXRhID0gXywgYmFyKSA6IGRhdGE7IH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIG9yaWVudCBvZiB0aGUgYmFyc1xuICAgKiAoc2VlIHtAbGluayBiYXIjb3JpZW50fSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtiYXIgfCBvYmplY3R9XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqL1xuICBiYXIub3JpZW50ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvcmllbnQgPSBfLCBiYXIpIDogb3JpZW50OyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBhbW91bnQgb2YgaG9yaXpvbnRhbCBzcGFjZSBpbiB3aGljaCBpdGVtcyBhcmUgbWFuaXB1bGF0ZWRcbiAgICogKHNlZSB7QGxpbmsgYmFyI3NwYWNlWH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXSBzaG91bGQgYmUgYSBudW1iZXIgPiAwXG4gICAqIEByZXR1cm5zIHtiYXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc3BhY2VYID0gdW5kZWZpbmVkXG4gICAqL1xuICBiYXIuc3BhY2VYID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzcGFjZVggPSBfLCBiYXIpIDogc3BhY2VYOyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBhbW91bnQgb2YgdmVydGljYWwgc3BhY2UgaW4gd2hpY2ggaXRlbXMgYXJlIG1hbmlwdWxhdGVkXG4gICAqIChzZWUge0BsaW5rIGJhciNzcGFjZVl9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV0gc2hvdWxkIGJlIGEgbnVtYmVyID4gMFxuICAgKiBAcmV0dXJucyB7YmFyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNwYWNlWSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYmFyLnNwYWNlWSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3BhY2VZID0gXywgYmFyKSA6IHNwYWNlWTsgfTtcblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgd2hldGhlciBvciBub3QgYmFyIGlzIGFsbG93ZWQgdG8gZ28gYmV5b25kIHNwZWNpZmllZCBkaW1lbnNpb25zXG4gICAqIChzZWUge0BsaW5rIGJhciNzcGFjZVh9KVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtiYXIgfCBib29sZWFufVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG92ZXJmbG93USA9IGZhbHNlXG4gICAqL1xuICBiYXIub3ZlcmZsb3dRID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvdmVyZmxvd1EgPSBfLCBiYXIpIDogb3ZlcmZsb3dROyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGdyb3VwaW5nIG9mIHRoZSBiYXJzXG4gICAqIChzZWUge0BsaW5rIGJhciNncm91cGluZ30pXG4gICAqIEBwYXJhbSB7QXJyYXlbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IEFycmF5W119XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgZ3JvdXBpbmcgPSB1bmRlZmluZWRcbiAgICovXG4gIGJhci5ncm91cGluZyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZ3JvdXBpbmcgPSBfLCBiYXIpIDogZ3JvdXBpbmc7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdmFsdWVFeHRyYWN0b3JcbiAgICogKHNlZSB7QGxpbmsgYmFyI3ZhbHVlRXh0cmFjdG9yfSlcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IGZ1bmN0aW9ufVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHZhbHVlRXh0cmFjdG9yID0gZnVuY3Rpb24oa2V5LCBpbmRleCkgeyByZXR1cm4gZGF0YVtrZXldIH0sXG4gICAqL1xuICBiYXIudmFsdWVFeHRyYWN0b3IgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZhbHVlRXh0cmFjdG9yID0gXywgYmFyKSA6IHZhbHVlRXh0cmFjdG9yOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNvcnRpbmdGdW5jdGlvblxuICAgKiAoc2VlIHtAbGluayBiYXIjc29ydGluZ0Z1bmN0aW9ufSlcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IGZ1bmN0aW9ufVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNvcnRpbmdGdW5jdGlvbiA9IGZ1bmN0aW9uKGtleUEsIGtleUIpIHtyZXR1cm4gZDMuZGVzY2VuZGluZyhkYXRhW2tleUFdLCBkYXRhW2tleUJdKX0sXG4gICAqL1xuICBiYXIuc29ydGluZ0Z1bmN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzb3J0aW5nRnVuY3Rpb24gPSBfLCBiYXIpIDogc29ydGluZ0Z1bmN0aW9uOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNjYWxlIGZvciB3aGljaCB0aGUgYmFyIHZhbHVlcyBzaG91bGQgYmUgdHJhbnNmb3JtZWQgYnlcbiAgICogKHNlZSB7QGxpbmsgYmFyI3NjYWxlfSlcbiAgICogQHBhcmFtIHtkMy5zY2FsZX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IGQzLnNjYWxlfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKVxuICAgKi9cbiAgYmFyLnNjYWxlID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzY2FsZSA9IF8sIGJhcikgOiBzY2FsZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBwYWRkaW5nIGZvciB0aGUgZG9tYWluIG9mIHRoZSBzY2FsZVxuICAgKiAoc2VlIHtAbGluayBiYXIjZG9tYWluUGFkZGluZ30pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YmFyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGRvbWFpblBhZGRpbmcgPSAwLjVcbiAgICovXG4gIGJhci5kb21haW5QYWRkaW5nID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkb21haW5QYWRkaW5nID0gXywgYmFyKSA6IGRvbWFpblBhZGRpbmc7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyBvYmplY3RTcGFjZXJcbiAgICogKHNlZSB7QGxpbmsgYmFyI29iamVjdFNwYWNlcn0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YmFyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG9iamVjdFNwYWNlciA9IDAuMDVcbiAgICovXG4gIGJhci5vYmplY3RTcGFjZXIgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9iamVjdFNwYWNlciA9IF8sIGJhcikgOiBvYmplY3RTcGFjZXI7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbWluT2JqZWN0U2l6ZVxuICAgKiAoc2VlIHtAbGluayBiYXIjbWluT2JqZWN0U2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YmFyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG1pbk9iamVjdFNpemUgPSA1MFxuICAgKi9cbiAgYmFyLm1pbk9iamVjdFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG1pbk9iamVjdFNpemUgPSBfLCBiYXIpIDogbWluT2JqZWN0U2l6ZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBtYXhPYmplY3RTaXplXG4gICAqIChzZWUge0BsaW5rIGJhciNtYXhPYmplY3RTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtiYXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgbWF4T2JqZWN0U2l6ZSA9IDEwMFxuICAgKi9cbiAgYmFyLm1heE9iamVjdFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG1heE9iamVjdFNpemUgPSBfLCBiYXIpIDogbWF4T2JqZWN0U2l6ZTsgfTtcblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGJhclN0cm9rZVdpZHRoXG4gICAqIChzZWUge0BsaW5rIGJhciNiYXJTdHJva2VXaWR0aH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YmFyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGJhclN0cm9rZVdpZHRoID0gMlxuICAgKi9cbiAgYmFyLmJhclN0cm9rZVdpZHRoID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChiYXJTdHJva2VXaWR0aCA9IF8sIGJhcikgOiBiYXJTdHJva2VXaWR0aDsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBjb2xvckZ1bmN0aW9uXG4gICAqIChzZWUge0BsaW5rIGJhciNjb2xvckZ1bmN0aW9ufSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtiYXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgY29sb3JGdW5jdGlvbiA9IGNvbG9yRnVuY3Rpb24oKVxuICAgKi9cbiAgYmFyLmNvbG9yRnVuY3Rpb24gPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNvbG9yRnVuY3Rpb24gPSBfLCBiYXIpIDogY29sb3JGdW5jdGlvbjsgfTtcblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGJhY2tncm91bmRGaWxsXG4gICAqIChzZWUge0BsaW5rIGJhciNiYWNrZ3JvdW5kRmlsbH0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YmFyIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGJhY2tncm91bmRGaWxsID0gJ3RyYW5zcGFyZW50J1xuICAgKi9cbiAgYmFyLmJhY2tncm91bmRGaWxsID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChiYWNrZ3JvdW5kRmlsbCA9IF8sIGJhcikgOiBiYWNrZ3JvdW5kRmlsbDsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBuYW1lc3BhY2VcbiAgICogKHNlZSB7QGxpbmsgYmFyI25hbWVzcGFjZX0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YmFyIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG5hbWVzcGFjZSA9ICdkM3NtLWJhcidcbiAgICovXG4gIGJhci5uYW1lc3BhY2UgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG5hbWVzcGFjZSA9IF8sIGJhcikgOiBuYW1lc3BhY2U7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgb2JqZWN0Q2xhc3NcbiAgICogKHNlZSB7QGxpbmsgYmFyI29iamVjdENsYXNzfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtiYXIgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgb2JqZWN0Q2xhc3MgPSAndGljay1ncm91cCdcbiAgICovXG4gIGJhci5vYmplY3RDbGFzcyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob2JqZWN0Q2xhc3MgPSBfLCBiYXIpIDogb2JqZWN0Q2xhc3M7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdHJhbnNpdGlvbkR1cmF0aW9uXG4gICAqIChzZWUge0BsaW5rIGJhciN0cmFuc2l0aW9uRHVyYXRpb259KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJhclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0cmFuc2l0aW9uRHVyYXRpb24gPSAxMDAwXG4gICAqL1xuICBiYXIudHJhbnNpdGlvbkR1cmF0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0cmFuc2l0aW9uRHVyYXRpb24gPSBfLCBiYXIpIDogdHJhbnNpdGlvbkR1cmF0aW9uOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGVhc2VGdW5jXG4gICAqIChzZWUge0BsaW5rIGJhciNlYXNlRnVuY30pXG4gICAqIEBwYXJhbSB7ZDMuZWFzZX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IGQzLmVhc2V9XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgZWFzZUZ1bmMgPSBkMy5lYXNlRXhwXG4gICAqL1xuICBiYXIuZWFzZUZ1bmMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGVhc2VGdW5jID0gXywgYmFyKSA6IGVhc2VGdW5jOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBiYXJLZXlzXG4gICAqIChzZWUge0BsaW5rIGJhciNiYXJLZXlzfSlcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IHN0cmluZ1tdfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGJhcktleXMgPSB1bmRlZmluZWRcbiAgICovXG4gIGJhci5iYXJLZXlzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChiYXJLZXlzID0gXywgYmFyKSA6IGJhcktleXM7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgYmFyVmFsdWVzXG4gICAqIChzZWUge0BsaW5rIGJhciNiYXJWYWx1ZXN9KVxuICAgKiBAcGFyYW0ge251bWJlcltdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YmFyIHwgbnVtYmVyW119XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgYmFyVmFsdWVzID0gdW5kZWZpbmVkXG4gICAqL1xuICBiYXIuYmFyVmFsdWVzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChiYXJWYWx1ZXMgPSBfLCBiYXIpIDogYmFyVmFsdWVzOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG9iamVjdFNpemVcbiAgICogKHNlZSB7QGxpbmsgYmFyI29iamVjdFNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJhclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvYmplY3RTaXplID0gdW5kZWZpbmVkXG4gICAqL1xuICBiYXIub2JqZWN0U2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob2JqZWN0U2l6ZSA9IF8sIGJhcikgOiBvYmplY3RTaXplOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNwYWNlclNpemVcbiAgICogKHNlZSB7QGxpbmsgYmFyI3NwYWNlclNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJhclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzcGFjZXJTaXplID0gdW5kZWZpbmVkXG4gICAqL1xuICBiYXIuc3BhY2VyU2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3BhY2VyU2l6ZSA9IF8sIGJhcikgOiBzcGFjZXJTaXplOyB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdG9vbHRpcFxuICAgKiAoc2VlIHtAbGluayBiYXIjdG9vbHRpcH0pXG4gICAqIEBwYXJhbSB7dG9vbHRpcH0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IHRvb2x0aXB9XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdG9vbHRpcCA9IHRvb2x0aXAoKVxuICAgKi9cbiAgYmFyLnRvb2x0aXAgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRvb2x0aXAgPSBfLCBiYXIpIDogdG9vbHRpcDsgfTtcblxuXG4gIGZ1bmN0aW9uIGJhcigpIHtcbiAgICAvLyBmb3IgY29udmVuaWVuY2UgaW4gaGFuZGxpbmcgb3JpZW50YXRpb24gc3BlY2lmaWMgdmFsdWVzXG4gICAgdmFyIGhvcml6b250YWxRID0gKG9yaWVudCA9PSAnaG9yaXpvbnRhbCcpID8gdHJ1ZSA6IGZhbHNlXG4gICAgdmFyIHZlcnRpY2FsUSA9ICFob3Jpem9udGFsUVxuXG4gICAgLy8gYmFja2dyb3VuZCBjbGlwaW5nIHJlY3RhbmdsZVxuICAgIHZhciBiZ2NwUmVjdCA9IHt4OjAsIHk6MCwgd2lkdGg6IHNwYWNlWCwgaGVpZ2h0OnNwYWNlWX1cbiAgICB2YXIgY29udGFpbmVyID0gc2V0dXBDb250YWluZXIoIHNlbGVjdGlvbiwgbmFtZXNwYWNlLCBiZ2NwUmVjdCwgYmFja2dyb3VuZEZpbGwgKTtcblxuICAgIC8vIHRvIHByZXZlbnQgcmUtY2FsY3VsYXRpb24gYW5kIGdldHRlcnMgdG8gYmUgcGFzc2VkIHRvIGF4ZXNcbiAgICBiYXJLZXlzID0gZDMua2V5cyhkYXRhKVxuICAgIGJhclZhbHVlcyA9IGJhcktleXMubWFwKHZhbHVlRXh0cmFjdG9yKVxuXG4gICAgLy8gaWYgZ3JvdXBpbmcgaXMgdW5kZWZpbmVkIHNvcnQgYmFyS2V5cyBieSBzb3J0aW5nRnVuY3Rpb25cbiAgICB2YXIgb3JkZXJlZCA9IChncm91cGluZyA9PSB1bmRlZmluZWQpID8gYmFyS2V5cy5zb3J0KHNvcnRpbmdGdW5jdGlvbikgOiBncm91cGluZ1xuICAgIC8vIG9yZGVyZWQgbWlnaHQgYmUgbmVzdGVkIGRlcGVuZGluZyBvbiBncm91cGluZ1xuICAgIGJhcktleXMgPSBmbGF0dGVuKG9yZGVyZWQpXG5cbiAgICB2YXIgbnVtYmVyT2ZPYmplY3RzID0gYmFyS2V5cy5sZW5ndGhcbiAgICB2YXIgZXh0ZW50ID0gW01hdGgubWluKC4uLmJhclZhbHVlcykgLSBkb21haW5QYWRkaW5nLE1hdGgubWF4KC4uLmJhclZhbHVlcykgKyBkb21haW5QYWRkaW5nXTtcblxuXG5cbiAgICAvLyBzZXQgdGhlIHNjYWxlXG4gICAgc2NhbGUuZG9tYWluKGV4dGVudCkucmFuZ2UoaG9yaXpvbnRhbFEgPyBbMCxzcGFjZVldIDogW3NwYWNlWCwgMF0pXG4gICAgdmFyIHNwYWNlID0gaG9yaXpvbnRhbFEgPyBzcGFjZVggOiBzcGFjZVlcbiAgICAvLyBjYWxjdWxhdGUgb2JqZWN0IHNpemVcbiAgICBvYmplY3RTaXplID0gY2FsY3VsYXRlV2lkdGhPZk9iamVjdChzcGFjZSwgbnVtYmVyT2ZPYmplY3RzLCBtaW5PYmplY3RTaXplLCBtYXhPYmplY3RTaXplLCBvYmplY3RTcGFjZXIsIG92ZXJmbG93USlcbiAgICAvLyBjYWxjdWxhdGUgc3BhY2VyIHNpemUgaWYgbmVlZGVkXG4gICAgc3BhY2VyU2l6ZSA9IGNhbGN1bGF0ZVdpZHRoT2ZTcGFjZXIoYmFyS2V5cywgc3BhY2UsIG9iamVjdFNpemUsIG51bWJlck9mT2JqZWN0cywgb2JqZWN0U3BhY2VyLCBvdmVyZmxvd1EpXG4gICAgLy8gbWFrZSB0aGUgbmVzdGVkIGdyb3Vwc1xuICAgIHZhciBzcGFjZXJGdW5jdGlvbiA9IGdyb3VwaW5nU3BhY2VyKClcbiAgICAuaG9yaXpvbnRhbFEoaG9yaXpvbnRhbFEpLnNjYWxlKHNjYWxlKS5tb3ZlYnkoJ2NhdGVnb3J5JykubnVtYmVyT2ZPYmplY3RzKG51bWJlck9mT2JqZWN0cylcbiAgICAub2JqZWN0Q2xhc3Mob2JqZWN0Q2xhc3MpLm9iamVjdFNpemUob2JqZWN0U2l6ZSkuc3BhY2VyU2l6ZShzcGFjZXJTaXplKVxuICAgIC50cmFuc2l0aW9uRHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlRnVuYyhlYXNlRnVuYylcbiAgICAubmFtZXNwYWNlKG5hbWVzcGFjZSlcbiAgICAvLyBzYWZlIGRlZmF1bHQgZnVuY3Rpb25cbiAgICB2YXIgZGVmYXVsdEV4aXQgPSBzcGFjZXJGdW5jdGlvbi5leGl0RnVuY3Rpb24oKVxuXG4gICAgc3BhY2VyRnVuY3Rpb24uZXhpdEZ1bmN0aW9uKGZ1bmN0aW9uKHNlbCl7XG4gICAgICAvLyB1c2UgZGVmYXVsdCB0byBtb3ZlIG9iamVjdHMgb2ZmIHNjcmVlblxuICAgICAgZGVmYXVsdEV4aXQoc2VsKVxuICAgICAgLy8gc2hyaW5rIHJlY3RhbmdsZXMgaW4gYWRkaXRpb25cbiAgICAgIHNlbC5zZWxlY3RBbGwoJyogPiByZWN0JylcbiAgICAgIC50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uKGQsIGkpIHtcbiAgICAgICAgdmFyXG4gICAgICAgIHggPSBob3Jpem9udGFsUSA/IDAgOiAwLFxuICAgICAgICB5ID0gdmVydGljYWxRID8gMCA6IHNjYWxlKGV4dGVudFsxXSksXG4gICAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgICAgcmV0dXJuIHRcbiAgICAgIH0pXG4gICAgICAuYXR0cignd2lkdGgnLCBob3Jpem9udGFsUSA/IG9iamVjdFNpemUgOiAwKVxuICAgICAgLmF0dHIoJ2hlaWdodCcsIHZlcnRpY2FsUSA/IG9iamVjdFNpemUgOiAwKS5yZW1vdmUoKVxuICAgIH0pXG5cbiAgICAvLyBtb3ZlIHN0dWZmXG4gICAgc3BhY2VyRnVuY3Rpb24oY29udGFpbmVyLCBvcmRlcmVkLCAwKVxuXG5cblxuXG4gICAgdmFyIHBhcmVudEluZGV4QXJyYXkgPSBbXVxuICAgIGNvbnRhaW5lci5zZWxlY3RBbGwoJ2c6bm90KC50by1yZW1vdmUpLicrb2JqZWN0Q2xhc3MpXG4gICAgLmVhY2goZnVuY3Rpb24oZCwgaSl7cGFyZW50SW5kZXhBcnJheS5wdXNoKE51bWJlcihkMy5zZWxlY3QodGhpcykuYXR0cigncGFyZW50LWluZGV4JykpKX0pXG5cblxuICAgIGNvbG9yRnVuY3Rpb24gPSBjb2xvckZ1bmN0aW9uLmNvbG9yQnkoKSA9PSAnaW5kZXgnXG4gICAgPyBjb2xvckZ1bmN0aW9uLmRhdGFFeHRlbnQoWzAsIE1hdGgubWF4KC4uLnBhcmVudEluZGV4QXJyYXkpXSlcbiAgICA6IGNvbG9yRnVuY3Rpb24uZGF0YUV4dGVudChleHRlbnQpXG5cblxuXG4gICAgY29udGFpbmVyLnNlbGVjdEFsbCgnZzpub3QoLnRvLXJlbW92ZSkuJytvYmplY3RDbGFzcykuZWFjaChmdW5jdGlvbihrZXksIGkpIHtcbiAgICAgIHZhciB0ID0gZDMuc2VsZWN0KHRoaXMpLFxuICAgICAgY3VycmVudERhdGEgPSBkYXRhW2tleV0sXG4gICAgICB2YWx1ZSA9IHZhbHVlRXh0cmFjdG9yKGtleSwgaSksXG4gICAgICBpID0gdC5hdHRyKCdwYXJlbnQtaW5kZXgnKSA9PSB1bmRlZmluZWQgPyBpIDogdC5hdHRyKCdwYXJlbnQtaW5kZXgnKSxcbiAgICAgIGZpbGxDb2xvciA9IGNvbG9yRnVuY3Rpb24oa2V5LCB2YWx1ZSwgaSwgJ2ZpbGwnKSwgLy8gcHJldmVudCBkdXBsaWNhdGUgY29tcHV0YXRpb25cbiAgICAgIHN0cm9rZUNvbG9yID0gY29sb3JGdW5jdGlvbihrZXksIHZhbHVlLCBpLCAgJ3N0cm9rZScpXG5cblxuICAgICAgdmFyIGJhciA9IHNhZmVTZWxlY3QodCwgJ3JlY3QnLCAnYmFyLXJlY3QnKVxuXG4gICAgICBpZiAoYmFyLmF0dHIoJ3RyYW5zZm9ybScpID09IHVuZGVmaW5lZCkge1xuICAgICAgICBiYXIuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24oZCwgaSkge1xuICAgICAgICAgIHZhclxuICAgICAgICAgIHggPSBob3Jpem9udGFsUSA/IDAgOiAwLFxuICAgICAgICAgIHkgPSB2ZXJ0aWNhbFEgPyAwIDogc2NhbGUoZXh0ZW50WzFdKSxcbiAgICAgICAgICB0ID0gJ3RyYW5zbGF0ZSgnK3grJywnK3krJyknXG4gICAgICAgICAgcmV0dXJuIHRcbiAgICAgICAgfSlcbiAgICAgICAgLmF0dHIoJ3dpZHRoJywgaG9yaXpvbnRhbFEgPyBvYmplY3RTaXplIDogMClcbiAgICAgICAgLmF0dHIoJ2hlaWdodCcsIHZlcnRpY2FsUSA/IG9iamVjdFNpemUgOiAwKVxuICAgICAgfVxuXG5cbiAgICAgIGJhci50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlKGVhc2VGdW5jKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uKGQsIGkpIHtcbiAgICAgICAgdmFyXG4gICAgICAgIHggPSBob3Jpem9udGFsUSA/IDAgOiAwLFxuICAgICAgICB5ID0gdmVydGljYWxRID8gMCA6IHNjYWxlKGV4dGVudFsxXSkgLSBzY2FsZSh2YWx1ZSksXG4gICAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgICAgcmV0dXJuIHRcbiAgICAgIH0pXG4gICAgICAuYXR0cignd2lkdGgnLCBob3Jpem9udGFsUSA/IG9iamVjdFNpemUgOiBzY2FsZSh2YWx1ZSkpXG4gICAgICAuYXR0cignaGVpZ2h0JywgdmVydGljYWxRID8gb2JqZWN0U2l6ZSA6IHNjYWxlKHZhbHVlKSlcbiAgICAgIC5hdHRyKCdmaWxsJywgZmlsbENvbG9yKVxuICAgICAgLmF0dHIoJ3N0cm9rZScsIHN0cm9rZUNvbG9yKVxuICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIGJhclN0cm9rZVdpZHRoKVxuXG5cblxuICAgICAgdC5vbignbW91c2VvdmVyJywgZnVuY3Rpb24oZCwgaSl7XG4gICAgICAgIGNvbnRhaW5lci5zZWxlY3RBbGwoJ2cuJytvYmplY3RDbGFzcykuc3R5bGUoJ29wYWNpdHknLCAwLjIpXG4gICAgICAgIHQuc3R5bGUoJ29wYWNpdHknLCAxKVxuICAgICAgICBiYXIuYXR0cignc3Ryb2tlLXdpZHRoJyxiYXJTdHJva2VXaWR0aCoyKVxuXG4gICAgICB9KVxuICAgICAgdC5vbignbW91c2VvdXQnLCBmdW5jdGlvbigpe1xuICAgICAgICBjb250YWluZXIuc2VsZWN0QWxsKCdnLicrb2JqZWN0Q2xhc3MpLnN0eWxlKCdvcGFjaXR5JywgMSlcbiAgICAgICAgYmFyLmF0dHIoJ3N0cm9rZS13aWR0aCcsIGJhclN0cm9rZVdpZHRoKVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgdG9vbHRpcC5zZWxlY3Rpb24oY29udGFpbmVyLnNlbGVjdEFsbCgnLmJhci1yZWN0JykpXG4gICAgLmRhdGEoZGF0YSlcblxuICAgIHRvb2x0aXAoKVxuXG4gIH1cbiAgcmV0dXJuIGJhclxufVxuIiwiaW1wb3J0IHtoeXBlbmF0ZSwgc2FmZVNlbGVjdH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7c2V0dXBDb250YWluZXIsIGNhbGN1bGF0ZVdpZHRoT2ZPYmplY3QsIGNhbGN1bGF0ZVdpZHRoT2ZTcGFjZXIsIGxvZ30gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge3VuaXF1ZX0gZnJvbSAnLi9hcnJheS1mdW5jdGlvbnMnO1xuaW1wb3J0IHtncm91cGluZ1NwYWNlcn0gZnJvbSAnLi9ncm91cGluZy1zcGFjZXInO1xuaW1wb3J0IHtjb2xvckZ1bmN0aW9uIGFzIENGfSBmcm9tICcuL2NvbG9yLWZ1bmN0aW9uJztcbmltcG9ydCB7dG9vbHRpcCBhcyBUVGlwfSBmcm9tICcuL3Rvb2x0aXAnO1xuXG5cbi8qKlxuICogQ3JlYXRlcyBhIGJ1YmJsZUhlYXRtYXBcbiAqXG4gKiB7QGxpbmsgaHR0cHM6Ly9zdW1uZXVyb24uZ2l0bGFiLmlvL2Qzc20vZGVtb3MvYnViYmxlLWhlYXRtYXAvaW5kZXguaHRtbCBEZW1vfVxuICogQGNvbnN0cnVjdG9yIGJ1YmJsZUhlYXRtYXBcbiAqIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBzZWxlY3Rpb25cbiAqIEBuYW1lc3BhY2UgYnViYmxlSGVhdG1hcFxuICogQHJldHVybnMge2Z1bmN0aW9ufSBidWJibGVIZWF0bWFwXG4gKi9cbmZ1bmN0aW9uIGJ1YmJsZUhlYXRtYXAoIHNlbGVjdGlvbiApIHtcbiAgdmFyXG4gIC8qKlxuICAqIERhdGEgdG8gcGxvdC4gQXNzdW1lZCB0byBiZSBhIG9iamVjdCwgd2hlcmUgZWFjaCBrZXkgY29ycmVzcG9uZHMgdG8gYSBjZWxsXG4gICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNkYXRhfSlcbiAgKiBAcGFyYW0ge09iamVjdH0gW2RhdGE9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBkYXRhLFxuXG4gIC8qKlxuICAqIEFtb3VudCBvZiBob3Jpem9udGFsIHNwYWNlIChpbiBwaXhlbHMpIGF2YWlibGUgdG8gcmVuZGVyIHRoZSBidWJibGVIZWF0bWFwIGluXG4gICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNzcGFjZVh9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbc3BhY2VYPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc3BhY2VYLFxuICAvKipcbiAgKiBBbW91bnQgb2YgdmVydGljYWwgc3BhY2UgKGluIHBpeGVscykgYXZhaWJsZSB0byByZW5kZXIgdGhlIGJ1YmJsZUhlYXRtYXAgaW5cbiAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwLnNwYWNlWX0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZVk9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzcGFjZVksXG5cbiAgLyoqXG4gICogVGhlIGludGVybmFsIGtleSBvZiB0aGUgY2VsbCBzcGVjaWZpeWluZyB0byB3aGljaCB4IGF4aXMga2V5IGl0IGJlbG9uZ3NcbiAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwLnhLZXl9KVxuICAqIEBwYXJhbSB7c3RyaW5nfSBbeEtleT0neCddXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHhLZXkgPSAneCcsXG4gIC8qKlxuICAqIFRoZSBpbnRlcm5hbCBrZXkgb2YgdGhlIGNlbGwgc3BlY2lmaXlpbmcgdG8gd2hpY2ggeSBheGlzIGtleSBpdCBiZWxvbmdzXG4gICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcC55S2V5fSlcbiAgKiBAcGFyYW0ge3N0cmluZ30gW3lLZXk9J3knXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB5S2V5ID0gJ3knLFxuICAvKipcbiAgKiBUaGUgaW50ZXJuYWwga2V5IG9mIHRoZSBjZWxsIHNwZWNpZml5aW5nIHdoYXQgdmFsdWUgdG8gdXNlIHRvIGRldGVybWluZSB0aGUgcmFkaXVzXG4gICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcC5yS2V5fSlcbiAgKiBAcGFyYW0ge3N0cmluZ30gW3JLZXk9J3InXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICByS2V5ID0gJ3InLFxuICAvKipcbiAgKiBUaGUgaW50ZXJuYWwga2V5IG9mIHRoZSBjZWxsIHNwZWNpZml5aW5nIHdoYXQgdmFsdWUgdG8gdXNlIHRvIGRldGVybWluZSB0aGUgY29sb3JcbiAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwLnZLZXl9KVxuICAqIEBwYXJhbSB7c3RyaW5nfSBbdktleT0ndiddXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHZLZXkgPSAndicsXG5cbiAgLyoqXG4gICogRnVuY3Rpb24gZm9yIGV4dHJhY3RpbmcgdGhlIHRoZSB2YWx1ZSBmcm9tIHhLZXkuXG4gICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcC54RXh0cmFjdG9yfSlcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbeEV4dHJhY3Rvcj1mdW5jdGlvbihrZXksIGkpIHsgcmV0dXJuIGRhdGFba2V5XVt4S2V5XSB9XVxuICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHhFeHRyYWN0b3IgPSBmdW5jdGlvbihrZXksIGkpIHtyZXR1cm4gZGF0YVtrZXldW3hLZXldIH0sXG4gIC8qKlxuICAqIEZ1bmN0aW9uIGZvciBleHRyYWN0aW5nIHRoZSB0aGUgdmFsdWUgZnJvbSB5S2V5LlxuICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAueUV4dHJhY3Rvcn0pXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW3lFeHRyYWN0b3I9ZnVuY3Rpb24oa2V5LCBpKSB7IHJldHVybiBkYXRhW2tleV1beUtleV0gfV1cbiAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB5RXh0cmFjdG9yID0gZnVuY3Rpb24oa2V5LCBpKSB7IHJldHVybiBkYXRhW2tleV1beUtleV0gfSxcbiAgLyoqXG4gICogRnVuY3Rpb24gZm9yIGV4dHJhY3RpbmcgdGhlIHRoZSB2YWx1ZSBmcm9tIHJLZXkuXG4gICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcC5yRXh0cmFjdG9yfSlcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbckV4dHJhY3Rvcj1mdW5jdGlvbihrZXksIGkpIHsgcmV0dXJuIGRhdGFba2V5XVtyS2V5XSB9XVxuICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHJFeHRyYWN0b3IgPSBmdW5jdGlvbihrZXksIGkpIHsgcmV0dXJuIGRhdGFba2V5XVtyS2V5XSB9LFxuICAvKipcbiAgKiBGdW5jdGlvbiBmb3IgZXh0cmFjdGluZyB0aGUgdGhlIHZhbHVlIGZyb20gdktleS5cbiAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwLnZFeHRyYWN0b3J9KVxuICAqIEBwYXJhbSB7ZnVuY3Rpb259IFt2RXh0cmFjdG9yPWZ1bmN0aW9uKGtleSwgaSkgeyByZXR1cm4gZGF0YVtrZXldW3ZLZXldIH1dXG4gICogQHJldHVybnMge251bWJlcn1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdkV4dHJhY3RvciA9IGZ1bmN0aW9uKGtleSwgaSkgeyByZXR1cm4gZGF0YVtrZXldW3ZLZXldIH0sXG5cblxuICAvKipcbiAgKiBXaGV0aGVyIG9yIG5vdCB0byBhbGxvdyBidWJibGVIZWF0bWFwIHRvIHJlbmRlciBlbGVtZW50cyBwYXNzIHRoZSBtYWluIHNwYXRpYWwgZGltZW5zaW9uXG4gICogZ2l2ZW4gdGhlIG9yaWVudGF0aW9uIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjb3JpZW50fSksIHdoZXJlIHtAbGluayBidWJibGVIZWF0bWFwI29yaWVudH09XCJib3R0b21cIiBvciB7QGxpbmsgYnViYmxlSGVhdG1hcCNvcmllbnR9PVwidG9wXCJcbiAgKiB0aGUgbWFpbiBkaW1lbnNpb24gaXMge0BsaW5rIGJ1YmJsZUhlYXRtYXAjc3BhY2VYfSBhbmQgd2hlcmUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjb3JpZW50fT1cImxlZnRcIiBvciB7QGxpbmsgYnViYmxlSGVhdG1hcCNvcmllbnR9PVwicmlnaHRcIlxuICAqIHRoZSBtYWluIGRpbWVuc2lvbiBpcyB7QGxpbmsgYnViYmxlSGVhdG1hcCNzcGFjZVl9XG4gICogQHBhcmFtIHtib29sZWFufSBbb3ZlcmZsb3dRPWZhbHNlXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBvdmVyZmxvd1EgPSBmYWxzZSxcblxuICAvKipcbiAgKiBUaGUgc2NhbGUgZm9yIHdoaWNoIHRoZSByYWRpdXMgdmFsdWVzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBieVxuICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtzY2FsZT1kMy5zY2FsZUxpbmVhcl1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc2NhbGUgPSBkMy5zY2FsZUxpbmVhcigpLFxuICAvKipcbiAgKiBUaGUgcGFkZGluZyBmb3IgdGhlIGRvbWFpbiBvZiB0aGUgc2NhbGUgKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNzY2FsZX0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtkb21haW5QYWRkaW5nPTAuNV1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZG9tYWluUGFkZGluZyA9IDAuNSxcblxuICAvKipcbiAgKiBEZWZhdWx0IHNwYWNlIGZvciB0aGUgc3BhY2VyIChwZXJjZW50YWdlKSBvZiBtYWluIGRpbWVuc2lvbiBnaXZlbiB0aGUgb3JpZW50YXRpb25cbiAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI29yaWVudH0pLCB3aGVyZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNvcmllbnR9PVwiaG9yaXpvbnRhbFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBidWJibGVIZWF0bWFwI3NwYWNlWH0gYW5kIHdoZXJlIHtAbGluayBidWJibGVIZWF0bWFwI29yaWVudH09XCJ2ZXJ0aWNhbFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBidWJibGVIZWF0bWFwI3NwYWNlWX0gYmV0d2VlbiBidWJibGVzXG4gICogQHBhcmFtIHtudW1iZXJ9IFtvYmplY3RTcGFjZXI9MC4wXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBvYmplY3RTcGFjZXIgPSAwLjAsXG4gIC8qKlxuICAqIFRoZSBtaW5pbXVtIHNpemUgdGhhdCBhbiBvYmplY3QgY2FuIGJlXG4gICogQHBhcmFtIHtudW1iZXJ9IFttaW5PYmplY3RTaXplPTUwXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBtaW5PYmplY3RTaXplID0gNTAsXG4gIC8qKlxuICAqIFRoZSBtYXhpbXVtIHNpemUgdGhhdCBhbiBvYmplY3QgY2FuIGJlXG4gICogQHBhcmFtIHtudW1iZXJ9IFttYXhPYmplY3RTaXplPTEwMF1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgbWF4T2JqZWN0U2l6ZSA9IDEwMCxcblxuXG4gIC8qKlxuICAqIFRoZSBzdHJva2Ugd2lkdGggb2YgdGhlIGJ1YmJsZXNcbiAgKiBAcGFyYW0ge251bWJlcn0gW2J1YmJsZVN0cm9rZVdpZHRoPTJdXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGJ1YmJsZVN0cm9rZVdpZHRoID0gMixcbiAgLy8gY29sb3JGdW5jID0gY29sb3JGdW5jdGlvbigpLFxuXG4gIC8qKlxuICAqIENvbG9yIG9mIHRoZSBiYWNrZ3JvdW5kXG4gICogQHBhcmFtIHtzdHJpbmd9IFtiYWNrZ3JvdW5kRmlsbD1cInRyYW5zcGFyZW50XCJdXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGJhY2tncm91bmRGaWxsID0gJ3RyYW5zcGFyZW50JyxcbiAgLyoqXG4gICogTmFtZXNwYWNlIGZvciBhbGwgaXRlbXMgbWFkZSBieSB0aGlzIGluc3RhbmNlIG9mIGJ1YmJsZUhlYXRtYXBcbiAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVzcGFjZT1cImQzc20tYnViYmxlXCJdXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG5hbWVzcGFjZSA9ICdkM3NtLWJ1YmJsZScsXG4gIC8qKlxuICAqIENsYXNzIG5hbWUgZm9yIGJ1YmJsZSBjb250YWluZXIgKDxnPiBlbGVtZW50KVxuICAqIEBwYXJhbSB7c3RyaW5nfSBbb2JqZWN0Q2xhc3M9XCJidWJibGVcIl1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb2JqZWN0Q2xhc3MgPSAnYnViYmxlJyxcbiAgLyoqXG4gICogRHVyYXRpb24gb2YgYWxsIHRyYW5zaXRpb25zIG9mIHRoaXMgZWxlbWVudFxuICAqIEBwYXJhbSB7bnVtYmVyfSBbdHJhbnNpdGlvbkR1cmF0aW9uPTEwMDBdXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHRyYW5zaXRpb25EdXJhdGlvbiA9IDEwMDAsXG4gIC8qKlxuICAqIEVhc2luZyBmdW5jdGlvbiBmb3IgdHJhbnNpdGlvbnNcbiAgKiBAcGFyYW0ge2QzLmVhc2V9IFtlYXNlRnVuYz1kMy5lYXNlRXhwXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBlYXNlRnVuYyA9IGQzLmVhc2VFeHAsXG5cbiAgLyoqXG4gICogU3RvcmVzIHRoZSBrZXlzIG9mIGFsbCB0aGUgY2VsbHNcbiAgKiBDYWxjdWxhdGVkIGFmdGVyIGJ1YmJsZUhlYXRtYXAgY2FsbGVkLlxuICAqIEBwYXJhbSB7c3RyaW5nW119IFtjZWxsS2V5cz11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGNlbGxLZXlzLFxuICAvKipcbiAgKiBTdG9yZXMgdGhlIGxpc3Qgb2YgdW5pcXVlIHhWYWx1ZXNcbiAgKiBDYWxjdWxhdGVkIGFmdGVyIGJ1YmJsZUhlYXRtYXAgY2FsbGVkLlxuICAqIEBwYXJhbSB7c3RyaW5nW119IFt4VmFsdWVzPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgeFZhbHVlcyxcbiAgLyoqXG4gICogU3RvcmVzIHRoZSBsaXN0IG9mIHVuaXF1ZSB5VmFsdWVzXG4gICogQ2FsY3VsYXRlZCBhZnRlciBidWJibGVIZWF0bWFwIGNhbGxlZC5cbiAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbeVZhbHVlcz11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHlWYWx1ZXMsXG4gIC8qKlxuICAqIFN0b3JlcyB0aGUgbGlzdCBvZiB1bmlxdWUgclZhbHVlc1xuICAqIENhbGN1bGF0ZWQgYWZ0ZXIgYnViYmxlSGVhdG1hcCBjYWxsZWQuXG4gICogQHBhcmFtIHtzdHJpbmdbXX0gW3JWYWx1ZXM9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICByVmFsdWVzLFxuICAvKipcbiAgKiBTdG9yZXMgdGhlIGxpc3Qgb2YgdW5pcXVlIHZWYWx1ZXNcbiAgKiBDYWxjdWxhdGVkIGFmdGVyIGJ1YmJsZUhlYXRtYXAgY2FsbGVkLlxuICAqIEBwYXJhbSB7c3RyaW5nW119IFt2VmFsdWVzPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdlZhbHVlcyxcblxuICB4S2V5U29ydGluZ0Z1bmN0aW9uID0gZnVuY3Rpb24oYSwgYikgeyByZXR1cm4geEV4dHJhY3RvcihhKSAtIHhFeHRyYWN0b3IoYikgfSxcbiAgeUtleVNvcnRpbmdGdW5jdGlvbiA9IGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIHlFeHRyYWN0b3IoYSkgLSB5RXh0cmFjdG9yKGIpIH0sXG4gIHJLZXlTb3J0aW5nRnVuY3Rpb24gPSBmdW5jdGlvbihhLCBiKSB7IHJldHVybiByRXh0cmFjdG9yKGEpIC0gckV4dHJhY3RvcihiKSB9LFxuICB2S2V5U29ydGluZ0Z1bmN0aW9uID0gZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gdkV4dHJhY3RvcihhKSAtIHZFeHRyYWN0b3IoYikgfSxcblxuICAvKipcbiAgKiBJbnN0YW5jZSBvZiBDb2xvckZ1bmN0aW9uIHdpdGggLmNvbG9yQnkgc2V0IHRvICdjYXRlZ29yeSdcbiAgKiBAZnVuY3Rpb24gY29sb3JGdW5jdGlvblxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBjb2xvckZ1bmN0aW9uID0gQ0YoKS5jb2xvckJ5KCdjYXRlZ29yeScpLFxuICAvKipcbiAgKiBJbnN0YW5jZSBvZiBUb29sdGlwXG4gICogQGZ1bmN0aW9uIHRvb2x0aXBcbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdG9vbHRpcCA9IFRUaXAoKSxcblxuICAvKipcbiAgKiBzdG9yZSB0aGUgc2l6ZSB0aGUgYnViYmxlIGNvdWxkIGJlIGluIHRoZSB4IGRpbWVuc2lvblxuICAqIHRoZSBhY3R1YWxsIHNpemUgb2YgdGhlIGJ1YmJsZSB3aWxsIGJlIHRoZSBtaW4gb2YgeFNpemUgYW5kIHtAbGluayBidWJibGVIZWF0bWFwI3lTaXplfVxuICAqIENhbGN1bGF0ZWQgYWZ0ZXIgYnViYmxlSGVhdG1hcCBjYWxsZWQuXG4gICogQHBhcmFtIHtzdHJpbmdbXX0gW3hTaXplPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgeFNpemUsXG4gIC8qKlxuICAqIHN0b3JlIHRoZSBzaXplIG9mIHRoZSBzcGFjZXIgaW4gdGhlIHggZGltZW5zaW9uXG4gICogQ2FsY3VsYXRlZCBhZnRlciBidWJibGVIZWF0bWFwIGNhbGxlZC5cbiAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbeFNwYWNlclNpemU9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB4U3BhY2VyU2l6ZSxcblxuICAvKipcbiAgKiBzdG9yZSB0aGUgc2l6ZSB0aGUgYnViYmxlIGNvdWxkIGJlIGluIHRoZSB5IGRpbWVuc2lvblxuICAqIHRoZSBhY3R1YWxsIHNpemUgb2YgdGhlIGJ1YmJsZSB3aWxsIGJlIHRoZSBtaW4gb2YgeFNpemUgYW5kIHtAbGluayBidWJibGVIZWF0bWFwI3hTaXplfVxuICAqIENhbGN1bGF0ZWQgYWZ0ZXIgYnViYmxlSGVhdG1hcCBjYWxsZWQuXG4gICogQHBhcmFtIHtzdHJpbmdbXX0gW3lTaXplPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgeVNpemUsXG4gIC8qKlxuICAqIHN0b3JlIHRoZSBzaXplIG9mIHRoZSBzcGFjZXIgaW4gdGhlIHkgZGltZW5zaW9uLlxuICAqIENhbGN1bGF0ZWQgYWZ0ZXIgYnViYmxlSGVhdG1hcCBjYWxsZWQuXG4gICogQHBhcmFtIHtzdHJpbmdbXX0gW3hTcGFjZXJTaXplPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgeVNwYWNlclNpemVcblxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBzZWxlY3Rpb24gaW4gd2hpY2ggaXRlbXMgYXJlIG1hbmlwdWxhdGVkXG4gICAqIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IGQzLnNlbGVjdGlvbn1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc2VsZWN0aW9uID0gc2VsZWN0aW9uXG4gICAqL1xuICBiaG0uc2VsZWN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzZWxlY3Rpb24gPSBfLCBiaG0pIDogc2VsZWN0aW9uOyB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGRhdGFcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNkYXRhfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgb2JqZWN0fVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICovXG4gIGJobS5kYXRhID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkYXRhID0gXywgYmhtKSA6IGRhdGE7IH1cbiAgLy8gYmhtLm9yaWVudCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob3JpZW50ID0gXywgYmhtKSA6IG9yaWVudDsgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBhbW91bnQgb2YgaG9yaXpvbnRhbCBzcGFjZSBpbiB3aGljaCBpdGVtcyBhcmUgbWFuaXB1bGF0ZWRcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNzcGFjZVh9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV0gc2hvdWxkIGJlIGEgbnVtYmVyID4gMFxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc3BhY2VYID0gdW5kZWZpbmVkXG4gICAqL1xuICBiaG0uc3BhY2VYID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzcGFjZVggPSBfLCBiaG0pIDogc3BhY2VYOyB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGFtb3VudCBvZiB2ZXJ0aWNhbCBzcGFjZSBpbiB3aGljaCBpdGVtcyBhcmUgbWFuaXB1bGF0ZWRcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNzcGFjZVl9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV0gc2hvdWxkIGJlIGEgbnVtYmVyID4gMFxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc3BhY2VZID0gdW5kZWZpbmVkXG4gICAqL1xuICBiaG0uc3BhY2VZID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzcGFjZVkgPSBfLCBiaG0pIDogc3BhY2VZOyB9XG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgeEtleVxuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3hLZXl9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHhLZXkgPSAneCdcbiAgICovXG4gIGJobS54S2V5ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4S2V5ID0gXywgYmhtKSA6IHhLZXk7IH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgeUtleVxuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3lLZXl9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHlLZXkgPSAneSdcbiAgICovXG4gIGJobS55S2V5ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5S2V5ID0gXywgYmhtKSA6IHlLZXk7IH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgcktleVxuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3JLZXl9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHJLZXkgPSAncidcbiAgICovXG4gIGJobS5yS2V5ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyS2V5ID0gXywgYmhtKSA6IHJLZXk7IH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgdktleVxuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3ZLZXl9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHZLZXkgPSAneSdcbiAgICovXG4gIGJobS52S2V5ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2S2V5ID0gXywgYmhtKSA6IHZLZXk7IH1cblxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBjZWxsS2V5c1xuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI2NlbGxLZXlzfSlcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBzdHJpbmdbXX1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgY2VsbEtleXMgPSB1bmRlZmluZWRcbiAgICovXG4gIGJobS5jZWxsS2V5cyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY2VsbEtleXMgPSBfLCBiaG0pIDogY2VsbEtleXM7IH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgeFZhbHVlc1xuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3hWYWx1ZXN9KVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IHN0cmluZ1tdfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB4VmFsdWVzID0gdW5kZWZpbmVkXG4gICAqL1xuICBiaG0ueFZhbHVlcyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeFZhbHVlcyA9IF8sIGJobSkgOiB4VmFsdWVzOyB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHlWYWx1ZXNcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCN5VmFsdWVzfSlcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBzdHJpbmdbXX1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgeVZhbHVlcyA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYmhtLnlWYWx1ZXMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHlWYWx1ZXMgPSBfLCBiaG0pIDogeVZhbHVlczsgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSByVmFsdWVzXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjclZhbHVlc30pXG4gICAqIEBwYXJhbSB7bnVtYmVyW119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgbnVtYmVyW119XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHJWYWx1ZXMgPSB1bmRlZmluZWRcbiAgICovXG4gIGJobS5yVmFsdWVzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyVmFsdWVzID0gXywgYmhtKSA6IHJWYWx1ZXM7IH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgdlZhbHVlc1xuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3ZWYWx1ZXN9KVxuICAgKiBAcGFyYW0ge251bWJlcltdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IG51bWJlcltdfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB2VmFsdWVzID0gdW5kZWZpbmVkXG4gICAqL1xuICBiaG0udlZhbHVlcyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodlZhbHVlcyA9IF8sIGJobSkgOiB2VmFsdWVzOyB9XG5cblxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSB4RXh0cmFjdG9yXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjeEV4dHJhY3Rvcn0pXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgZnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHhFeHRyYWN0b3IgPSB1bmRlZmluZWRcbiAgICovXG4gIGJobS54RXh0cmFjdG9yID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4RXh0cmFjdG9yID0gXywgYmhtKSA6IHhFeHRyYWN0b3I7IH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgeUV4dHJhY3RvclxuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3lFeHRyYWN0b3J9KVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IGZ1bmN0aW9ufVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB5RXh0cmFjdG9yID0gdW5kZWZpbmVkXG4gICAqL1xuICBiaG0ueUV4dHJhY3RvciA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeUV4dHJhY3RvciA9IF8sIGJobSkgOiB5RXh0cmFjdG9yOyB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHJFeHRyYWN0b3JcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNyRXh0cmFjdG9yfSlcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBmdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgckV4dHJhY3RvciA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYmhtLnJFeHRyYWN0b3IgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJFeHRyYWN0b3IgPSBfLCBiaG0pIDogckV4dHJhY3RvcjsgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSB2RXh0cmFjdG9yXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjdkV4dHJhY3Rvcn0pXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgZnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHZFeHRyYWN0b3IgPSB1bmRlZmluZWRcbiAgICovXG4gIGJobS52RXh0cmFjdG9yID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2RXh0cmFjdG9yID0gXywgYmhtKSA6IHZFeHRyYWN0b3I7IH1cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgd2hldGhlciBvciBub3QgYnViYmxlSGVhdG1hcCBpcyBhbGxvd2VkIHRvIGdvIGJleW9uZCBzcGVjaWZpZWQgZGltZW5zaW9uc1xuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3NwYWNlWH0pXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBib29sZWFufVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvdmVyZmxvd1EgPSBmYWxzZVxuICAgKi9cbiAgYmhtLm92ZXJmbG93USA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob3ZlcmZsb3dRID0gXywgYmhtKSA6IG92ZXJmbG93UTsgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNjYWxlIGZvciB3aGljaCB0aGUgcmFkaXVzIG9mIGJ1YmJsZXMgc2hvdWxkIGJlIHRyYW5zZm9ybWVkIGJ5XG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjc2NhbGV9KVxuICAgKiBAcGFyYW0ge2QzLnNjYWxlfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IGQzLnNjYWxlfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzY2FsZSA9IGQzLnNjYWxlTGluZWFyKClcbiAgICovXG4gIGJobS5zY2FsZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2NhbGUgPSBfLCBiaG0pIDogc2NhbGU7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgcGFkZGluZyBmb3IgdGhlIGRvbWFpbiBvZiB0aGUgc2NhbGVcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNkb21haW5QYWRkaW5nfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBkb21haW5QYWRkaW5nID0gMC41XG4gICAqL1xuICBiaG0uZG9tYWluUGFkZGluZyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluUGFkZGluZyA9IF8sIGJobSkgOiBkb21haW5QYWRkaW5nOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgb2JqZWN0U3BhY2VyXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjb2JqZWN0U3BhY2VyfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvYmplY3RTcGFjZXIgPSAwLjBcbiAgICovXG4gIGJobS5vYmplY3RTcGFjZXIgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9iamVjdFNwYWNlciA9IF8sIG9iamVjdFNwYWNlcikgOiBkYXRhOyB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbWluT2JqZWN0U2l6ZVxuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI21pbk9iamVjdFNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG1pbk9iamVjdFNpemUgPSA1MFxuICAgKi9cbiAgYmhtLm1pbk9iamVjdFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG1pbk9iamVjdFNpemUgPSBfLCBiaG0pIDogbWluT2JqZWN0U2l6ZTsgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG1heE9iamVjdFNpemVcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNtYXhPYmplY3RTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBtYXhPYmplY3RTaXplID0gMTAwXG4gICAqL1xuICBiaG0ubWF4T2JqZWN0U2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobWF4T2JqZWN0U2l6ZSA9IF8sIGJobSkgOiBtYXhPYmplY3RTaXplOyB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgYnViYmxlU3Ryb2tlV2lkdGhcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNidWJibGVTdHJva2VXaWR0aH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgYnViYmxlU3Ryb2tlV2lkdGggPSAyXG4gICAqL1xuICBiaG0uYnViYmxlU3Ryb2tlV2lkdGggPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGJ1YmJsZVN0cm9rZVdpZHRoID0gXywgYmhtKSA6IGJ1YmJsZVN0cm9rZVdpZHRoOyB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgYmFja2dyb3VuZEZpbGxcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNiYWNrZ3JvdW5kRmlsbH0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgYmFja2dyb3VuZEZpbGwgPSAndHJhbnNwYXJlbnQnXG4gICAqL1xuICBiaG0uYmFja2dyb3VuZEZpbGwgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGJhY2tncm91bmRGaWxsID0gXywgYmhtKSA6IGJhY2tncm91bmRGaWxsOyB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbmFtZXNwYWNlXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjbmFtZXNwYWNlfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBuYW1lc3BhY2UgPSAnZDNzbS1idWJibGVIZWF0bWFwJ1xuICAgKi9cbiAgYmhtLm5hbWVzcGFjZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobmFtZXNwYWNlID0gXywgYmhtKSA6IG5hbWVzcGFjZTsgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG9iamVjdENsYXNzXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjb2JqZWN0Q2xhc3N9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG9iamVjdENsYXNzID0gJ3RpY2stZ3JvdXAnXG4gICAqL1xuICBiaG0ub2JqZWN0Q2xhc3MgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9iamVjdENsYXNzID0gXywgYmhtKSA6IG9iamVjdENsYXNzOyB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdHJhbnNpdGlvbkR1cmF0aW9uXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjdHJhbnNpdGlvbkR1cmF0aW9ufSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0cmFuc2l0aW9uRHVyYXRpb24gPSAxMDAwXG4gICAqL1xuICBiaG0udHJhbnNpdGlvbkR1cmF0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0cmFuc2l0aW9uRHVyYXRpb24gPSBfLCBiaG0pIDogdHJhbnNpdGlvbkR1cmF0aW9uOyB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgZWFzZUZ1bmNcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNlYXNlRnVuY30pXG4gICAqIEBwYXJhbSB7ZDMuZWFzZX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBkMy5lYXNlfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBlYXNlRnVuYyA9IGQzLmVhc2VFeHBcbiAgICovXG4gIGJobS5lYXNlRnVuYyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZWFzZUZ1bmMgPSBfLCBiaG0pIDogZWFzZUZ1bmM7IH1cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRvb2x0aXBcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCN0b29sdGlwfSlcbiAgICogQHBhcmFtIHt0b29sdGlwfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IHRvb2x0aXB9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHRvb2x0aXAgPSB0b29sdGlwKClcbiAgICovXG4gIGJobS50b29sdGlwID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0b29sdGlwID0gXywgYmhtKSA6IHRvb2x0aXA7IH1cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHhTaXplXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjeFNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHhTaXplID0gdW5kZWZpbmVkXG4gICAqL1xuICBiaG0ueFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHhTaXplID0gXywgYmhtKSA6IHhTaXplOyB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgeFNwYWNlclNpemVcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCN4U3BhY2VyU2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgeFNwYWNlclNpemUgPSB1bmRlZmluZWRcbiAgICovXG4gIGJobS54U3BhY2VyU2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeFNwYWNlclNpemUgPSBfLCBiaG0pIDogeFNwYWNlclNpemU7IH1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB5U2l6ZVxuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3lTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB5U2l6ZSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYmhtLnlTaXplID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5U2l6ZSA9IF8sIGJobSkgOiB5U2l6ZTsgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHlTcGFjZXJTaXplXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjeVNwYWNlclNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHlTcGFjZXJTaXplID0gdW5kZWZpbmVkXG4gICAqL1xuICBiaG0ueVNwYWNlclNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHlTcGFjZXJTaXplID0gXywgYmhtKSA6IHlTcGFjZXJTaXplOyB9XG4gIC8vIGJobS55S2V5U29ydGluZ0Z1bmN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5S2V5U29ydGluZ0Z1bmN0aW9uID0gXywgYmhtKSA6IHlLZXlTb3J0aW5nRnVuY3Rpb247IH1cbiAgLy8gYmhtLnhLZXlTb3J0aW5nRnVuY3Rpb24gPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHhLZXlTb3J0aW5nRnVuY3Rpb24gPSBfLCBiaG0pIDogeEtleVNvcnRpbmdGdW5jdGlvbjsgfVxuXG5cblxuICBmdW5jdGlvbiBiaG0oKSB7XG4gICAgdmFyIGhvcml6b250YWxRID0gdHJ1ZTsgLy8gbm8gb3JpZW50YXRpb24gaW4gaGVhdG1hcHMuIEFpZHMgYXMgcGxhY2Vob2xkZXIgaW4gZnVuY3Rpb25zIHRoYXQgdGFrZSBvcmllbnQgYXMgYSBwYXJhbWV0ZXJcbiAgICB2YXIgYmdjcFJlY3QgPSB7eDowLCB5OjAsIHdpZHRoOiBzcGFjZVgsIGhlaWdodDpzcGFjZVl9XG4gICAgdmFyIGNvbnRhaW5lciA9IHNldHVwQ29udGFpbmVyKCBzZWxlY3Rpb24sIG5hbWVzcGFjZSwgYmdjcFJlY3QsIGJhY2tncm91bmRGaWxsICk7XG5cbiAgICBjZWxsS2V5cyA9IGQzLmtleXMoZGF0YSk7XG4gICAgY2VsbEtleXMuc29ydChmdW5jdGlvbihhLCBiKXsgcmV0dXJuIHhLZXlTb3J0aW5nRnVuY3Rpb24oYSwgYikgfHwgeUtleVNvcnRpbmdGdW5jdGlvbihhLCBiKSB9KVxuICAgIGxvZygnYnViYmxlSGVhdG1hcCcsICdjZWxscyBhcmUgc29ydGVkIGJ5JywgY2VsbEtleXMpXG5cblxuXG4gICAgeFZhbHVlcyA9IHVuaXF1ZShjZWxsS2V5cy5tYXAoeEV4dHJhY3RvcikpO1xuICAgIHlWYWx1ZXMgPSB1bmlxdWUoY2VsbEtleXMubWFwKHlFeHRyYWN0b3IpKTtcbiAgICByVmFsdWVzID0gdW5pcXVlKGNlbGxLZXlzLm1hcChyRXh0cmFjdG9yKSk7XG4gICAgdlZhbHVlcyA9IHVuaXF1ZShjZWxsS2V5cy5tYXAodkV4dHJhY3RvcikpO1xuICAgIGxvZygnYnViYmxlSGVhdG1hcCcsICd4IGFuZCB5IGtleXMgYXJlJywge3g6IHhWYWx1ZXMsIHk6eVZhbHVlc30pXG5cblxuICAgIHZhciB4RGltID0geFZhbHVlcy5sZW5ndGgsIHlEaW0gPSB5VmFsdWVzLmxlbmd0aDtcblxuXG4gICAgdmFyIGV4dGVudCA9IFtNYXRoLm1pbiguLi5yVmFsdWVzKSAtIGRvbWFpblBhZGRpbmcsTWF0aC5tYXgoLi4uclZhbHVlcykgKyBkb21haW5QYWRkaW5nXTtcblxuXG4gICAgeVNpemUgPSBjYWxjdWxhdGVXaWR0aE9mT2JqZWN0KHNwYWNlWSwgeURpbSwgbWluT2JqZWN0U2l6ZSwgbWF4T2JqZWN0U2l6ZSwgb2JqZWN0U3BhY2VyLCBvdmVyZmxvd1EpXG4gICAgeFNpemUgPSBjYWxjdWxhdGVXaWR0aE9mT2JqZWN0KHNwYWNlWCwgeERpbSwgbWluT2JqZWN0U2l6ZSwgbWF4T2JqZWN0U2l6ZSwgb2JqZWN0U3BhY2VyLCBvdmVyZmxvd1EpXG4gICAgeVNwYWNlclNpemUgPSBjYWxjdWxhdGVXaWR0aE9mU3BhY2VyKHlWYWx1ZXMsIHNwYWNlWSwgeVNpemUsIHlEaW0sIG9iamVjdFNwYWNlciwgb3ZlcmZsb3dRKVxuICAgIHhTcGFjZXJTaXplID0gY2FsY3VsYXRlV2lkdGhPZlNwYWNlcih4VmFsdWVzLCBzcGFjZVgsIHhTaXplLCB4RGltLCBvYmplY3RTcGFjZXIsIG92ZXJmbG93USlcbiAgICBsb2coJ2J1YmJsZUhlYXRtYXAnLCAnc2l6ZSBvZicsIHt4OiB4U2l6ZSwgeTogeVNpemV9KVxuXG5cbiAgICBzY2FsZS5kb21haW4oZXh0ZW50KS5yYW5nZShbMCwgTWF0aC5taW4oeVNpemUsIHhTaXplKS8yXSlcblxuICAgIHZhciB5U3BhY2VyID0gZ3JvdXBpbmdTcGFjZXIoKVxuICAgIC5ob3Jpem9udGFsUShmYWxzZSlcbiAgICAubW92ZWJ5KCdjYXRlZ29yeScpLm51bWJlck9mT2JqZWN0cyh5RGltKVxuICAgIC5vYmplY3RDbGFzcyhoeXBlbmF0ZShvYmplY3RDbGFzcywgJ3JvdycpKVxuICAgIC5vYmplY3RTaXplKHlTaXplKS5zcGFjZXJTaXplKHlTcGFjZXJTaXplKVxuICAgIC50cmFuc2l0aW9uRHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlRnVuYyhlYXNlRnVuYylcbiAgICAubmFtZXNwYWNlKCdyb3cnKVxuXG4gICAgdmFyIHhTcGFjZXIgPSBncm91cGluZ1NwYWNlcigpXG4gICAgLmhvcml6b250YWxRKHRydWUpXG4gICAgLm1vdmVieSgnY2F0ZWdvcnknKS5udW1iZXJPZk9iamVjdHMoeERpbSlcbiAgICAub2JqZWN0Q2xhc3Mob2JqZWN0Q2xhc3MpXG4gICAgLm9iamVjdFNpemUoeFNpemUpLnNwYWNlclNpemUoeFNwYWNlclNpemUpXG4gICAgLnRyYW5zaXRpb25EdXJhdGlvbih0cmFuc2l0aW9uRHVyYXRpb24pLmVhc2VGdW5jKGVhc2VGdW5jKVxuXG5cbiAgICB5U3BhY2VyKGNvbnRhaW5lciwgeVZhbHVlcywgMClcbiAgICBjb250YWluZXIuc2VsZWN0QWxsKCdnLicraHlwZW5hdGUob2JqZWN0Q2xhc3MsICdyb3cnKSlcbiAgICAuZWFjaChmdW5jdGlvbihkLCBpKXtcbiAgICAgIHhTcGFjZXIoZDMuc2VsZWN0KHRoaXMpLCB4VmFsdWVzLCAwKVxuICAgIH0pXG4gICAgdmFyIGNlbGxzID0gY29udGFpbmVyLnNlbGVjdEFsbCgnZzpub3QoLnRvLXJlbW92ZSkuJytvYmplY3RDbGFzcykuZGF0YShjZWxsS2V5cyk7XG5cbiAgICB2YXIgcGFyZW50SW5kZXhBcnJheSA9IFtdXG4gICAgY2VsbHMuZWFjaChmdW5jdGlvbihkLCBpKXsgcGFyZW50SW5kZXhBcnJheS5wdXNoKE51bWJlcihkMy5zZWxlY3QodGhpcykuYXR0cigncGFyZW50LWluZGV4JykpKSB9KVxuXG5cbiAgICBjb2xvckZ1bmN0aW9uID0gY29sb3JGdW5jdGlvbi5jb2xvckJ5KCkgPT0gJ2luZGV4J1xuICAgID8gY29sb3JGdW5jdGlvbi5kYXRhRXh0ZW50KFswLCBNYXRoLm1heCguLi5wYXJlbnRJbmRleEFycmF5KV0pXG4gICAgOiBjb2xvckZ1bmN0aW9uLmRhdGFFeHRlbnQoZXh0ZW50KVxuXG4gICAgY2VsbHMuZWFjaChmdW5jdGlvbihrZXksIGkpIHtcbiAgICAgIGxvZygnYnViYmxlSGVhdG1hcCcsICdlYWNoIGNlbGwnLCB7a2V5OiBrZXksIGluZGV4OiBpLCBub2RlOiBkMy5zZWxlY3QodGhpcykubm9kZSgpfSlcblxuICAgICAgdmFyIHQgPSBkMy5zZWxlY3QodGhpcyksXG4gICAgICBjdXJyZW50RGF0YSA9IGRhdGFba2V5XSxcbiAgICAgIHZhbHVlID0gdkV4dHJhY3RvcihrZXksIGkpLFxuICAgICAgcmFkaXVzPSByRXh0cmFjdG9yKGtleSwgaSksXG4gICAgICBpID0gdC5hdHRyKCdwYXJlbnQtaW5kZXgnKSA9PSB1bmRlZmluZWQgPyBpIDogdC5hdHRyKCdwYXJlbnQtaW5kZXgnKSxcbiAgICAgIGZpbGxDb2xvciA9IGNvbG9yRnVuY3Rpb24oa2V5LCB2YWx1ZSwgaSwgJ2ZpbGwnKSwgLy8gcHJldmVudCBkdXBsaWNhdGUgY29tcHV0YXRpb25cbiAgICAgIHN0cm9rZUNvbG9yID0gY29sb3JGdW5jdGlvbihrZXksIHZhbHVlLCBpLCAgJ3N0cm9rZScpXG5cbiAgICAgIHZhciBjID0gc2FmZVNlbGVjdCh0LCAnY2lyY2xlJywgaHlwZW5hdGUob2JqZWN0Q2xhc3MsJ2NpcmNsZScpKVxuICAgICAgYy5hdHRyKCdjeCcsIHhTaXplIC8gMilcbiAgICAgIC5hdHRyKCdjeScsIHlTaXplIC8gMiApXG4gICAgICAuYXR0cigncicsIHNjYWxlKHJhZGl1cykpXG4gICAgICAuYXR0cignZmlsbCcsIGZpbGxDb2xvcilcbiAgICAgIC5hdHRyKCdzdHJva2UnLCBzdHJva2VDb2xvcilcbiAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCBidWJibGVTdHJva2VXaWR0aClcblxuICAgIH0pXG5cbiAgICB0b29sdGlwLnNlbGVjdGlvbihjZWxscy5zZWxlY3RBbGwoJ2NpcmNsZS4nK2h5cGVuYXRlKG9iamVjdENsYXNzLCAnY2lyY2xlJykpKVxuICAgIC5kYXRhKGRhdGEpXG4gICAgLy8gLmtleXMoWydyJywgJ3YnXSlcbiAgICAvLyAuaGVhZGVyKGZ1bmN0aW9uKGQsIGkpe3JldHVybiBoeXBlbmF0ZShkYXRhW2RdW3hLZXldLCBkYXRhW2RdW3lLZXldKSB9KVxuXG4gICAgdG9vbHRpcCgpXG5cblxuICB9XG5cbiAgcmV0dXJuIGJobTtcbn1cblxuZXhwb3J0IHtidWJibGVIZWF0bWFwfVxuIiwiaW1wb3J0IHtoeXBlbmF0ZSwgc2FmZVNlbGVjdH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7c2V0dXBDb250YWluZXIsIGNhbGN1bGF0ZVdpZHRoT2ZPYmplY3QsIGNhbGN1bGF0ZVdpZHRoT2ZTcGFjZXIsIHdoaXNrZXJQYXRofSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7dW5pcXVlLCBoYXNRLCBmbGF0dGVufSBmcm9tICcuL2FycmF5LWZ1bmN0aW9ucyc7XG5pbXBvcnQge2dyb3VwaW5nU3BhY2VyfSBmcm9tICcuL2dyb3VwaW5nLXNwYWNlcic7XG5pbXBvcnQge2NvbG9yRnVuY3Rpb24gYXMgQ0Z9IGZyb20gJy4vY29sb3ItZnVuY3Rpb24nO1xuaW1wb3J0IHt0b29sdGlwIGFzIFRUaXB9IGZyb20gJy4vdG9vbHRpcCc7XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9YIEFORCBXSElTS0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqXG4gKiBDcmVhdGVzIGEgYm94d2hpc2tlclxuICpcbiAqIHtAbGluayBodHRwczovL3N1bW5ldXJvbi5naXRsYWIuaW8vZDNzbS9kZW1vcy9ib3gtd2hpc2tlcnMvaW5kZXguaHRtbCBEZW1vfVxuICogQGNvbnN0cnVjdG9yIGJveHdoaXNrZXJcbiAqIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBzZWxlY3Rpb25cbiAqIEBuYW1lc3BhY2UgYm94d2hpc2tlclxuICogQHJldHVybnMge2Z1bmN0aW9ufSBib3h3aGlza2VyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBib3h3aGlza2VyKCBzZWxlY3Rpb24gKSB7XG4gIHZhclxuICAvKipcbiAgKiBEYXRhIHRvIHBsb3QuIEFzc3VtZWQgdG8gYmUgYSBvYmplY3QsIHdoZXJlIGVhY2gga2V5IGNvcnJlc3BvbmRzIHRvIGEgYm94XG4gICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNkYXRhfSlcbiAgKiBAcGFyYW0ge09iamVjdH0gW2RhdGE9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBkYXRhLFxuICAvKipcbiAgKiBXaGljaCBkaXJlY3Rpb24gdG8gcmVuZGVyIHRoZSBib3hlcyBpblxuICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjb3JpZW50fSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW29yaWVudD0naG9yaXpvbnRhbCddXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG9yaWVudCA9ICdob3Jpem9udGFsJyxcbiAgLyoqXG4gICogQW1vdW50IG9mIGhvcml6b250YWwgc3BhY2UgKGluIHBpeGVscykgYXZhaWJsZSB0byByZW5kZXIgdGhlIGJveHdoaXNrZXIgaW5cbiAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI3NwYWNlWH0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZVg9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzcGFjZVgsXG4gIC8qKlxuICAqIEFtb3VudCBvZiB2ZXJ0aWNhbCBzcGFjZSAoaW4gcGl4ZWxzKSBhdmFpYmxlIHRvIHJlbmRlciB0aGUgYm94d2hpc2tlciBpblxuICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIuc3BhY2VZfSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW3NwYWNlWT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNwYWNlWSxcbiAgLyoqXG4gICogV2hldGhlciBvciBub3QgdG8gYWxsb3cgYm94d2hpc2tlciB0byByZW5kZXIgZWxlbWVudHMgcGFzcyB0aGUgbWFpbiBzcGF0aWFsIGRpbWVuc2lvblxuICAqIGdpdmVuIHRoZSBvcmllbnRhdGlvbiAoc2VlIHtAbGluayBib3h3aGlza2VyI29yaWVudH0pLCB3aGVyZSB7QGxpbmsgYm94d2hpc2tlciNvcmllbnR9PVwiaG9yaXpvbnRhbFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBib3h3aGlza2VyI3NwYWNlWH0gYW5kIHdoZXJlIHtAbGluayBib3h3aGlza2VyI29yaWVudH09XCJ2ZXJ0aWNhbFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBib3h3aGlza2VyI3NwYWNlWX1cbiAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvdmVyZmxvd1E9ZmFsc2VdXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG92ZXJmbG93USA9IHRydWUsXG5cbiAgLyoqXG4gICogQW4gYXJyYXkgLSBwdXRhdGl2ZWx5IG9mIG90aGVyIGFycmF5cyAtIGRlcGljdGluZyBob3cgYm94ZXMgc2hvdWxkIGJlIGFycmFuZ2VkXG4gICogQHBhcmFtIHtBcnJheVtdfSBbZ3JvdXBpbmc9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBncm91cGluZyxcbiAgcXVhcnRpbGVzS2V5ID0gJ3F1YXJ0aWxlcycsIC8vIGtleSBpbiBvYmplY3Qgd2hlcmUgcXVhcnRpbGVzIGFyZSBzdG9yZWRcbiAgcXVhcnRpbGVzS2V5cyA9IFtcIjAuMDBcIiwgXCIwLjI1XCIsIFwiMC41MFwiLCBcIjAuNzVcIiwgXCIxLjAwXCJdLCAvLyBrZXlzIGluIHF1YXJ0aWxlcyBvYmplY3QgbWFwcGluZyB2YWx1ZXMgdG8gbWluLCBxMSwgcTIsIHEzIGFuZCBtYXhcblxuXG4gIC8qKlxuICAqIEhvdyB0byBnZXQgdGhlIHZhbHVlIG9mIHRoZSBib3h3aGlza2VyXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW3ZhbHVlRXh0cmFjdG9yPWZ1bmN0aW9uKGtleSwgaW5kZXgpIHsgcmV0dXJuIGRhdGFba2V5XVtxdWFydGlsZXNLZXldIH1dXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHZhbHVlRXh0cmFjdG9yID0gZnVuY3Rpb24oa2V5LCBpbmRleCkgeyByZXR1cm4gZGF0YVtrZXldW3F1YXJ0aWxlc0tleV0gfSxcbiAgLyoqXG4gICogSG93IHRvIHNvcnQgdGhlIGJveGVzIC0gaWYge0BsaW5rIGJveHdoaXNrZXIjZ3JvdXBpbmd9IGlzIG5vdCBwcm92aWRlZC5cbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbc29ydGluZ0Z1bmN0aW9uPWRlc2NlbmRpbmddXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICogZGVmYXVsdFxuICAqIGZ1bmN0aW9uKGtleUEsIGtleUIpIHtyZXR1cm4gZDMuZGVzY2VuZGluZyhcbiAgKiAgIHZhbHVlRXh0cmFjdG9yKGtleUEpW3F1YXJ0aWxlc0tleXNbNF1dLFxuICAqICAgdmFsdWVFeHRyYWN0b3Ioa2V5QilbcXVhcnRpbGVzS2V5c1s0XV1cbiAgKiApfVxuICAqL1xuICBzb3J0aW5nRnVuY3Rpb24gPSBmdW5jdGlvbihrZXlBLCBrZXlCKSB7cmV0dXJuIGQzLmRlc2NlbmRpbmcoXG4gICAgdmFsdWVFeHRyYWN0b3Ioa2V5QSlbcXVhcnRpbGVzS2V5c1s0XV0sXG4gICAgdmFsdWVFeHRyYWN0b3Ioa2V5QilbcXVhcnRpbGVzS2V5c1s0XV1cbiAgKX0sXG4gIC8qKlxuICAqIFRoZSBzY2FsZSBmb3Igd2hpY2ggYm94d2hpc2tlciB2YWx1ZXMgc2hvdWxkIGJlIHRyYW5zZm9ybWVkIGJ5XG4gICogQHBhcmFtIHtkMy5zY2FsZX0gW3NjYWxlPWQzLnNjYWxlTGluZWFyXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzY2FsZSA9IGQzLnNjYWxlTGluZWFyKCksXG4gIC8qKlxuICAqIFRoZSBwYWRkaW5nIGZvciB0aGUgZG9tYWluIG9mIHRoZSBzY2FsZSAoc2VlIHtAbGluayBib3h3aGlza2VyI3NjYWxlfSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW2RvbWFpblBhZGRpbmc9MC41XVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBkb21haW5QYWRkaW5nID0gMC41LFxuICAvKipcbiAgKiBEZWZhdWx0IHNwYWNlIGZvciB0aGUgc3BhY2VyIChwZXJjZW50YWdlKSBvZiBtYWluIGRpbWVuc2lvbiBnaXZlbiB0aGUgb3JpZW50YXRpb25cbiAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI29yaWVudH0pLCB3aGVyZSB7QGxpbmsgYm94d2hpc2tlciNvcmllbnR9PVwiaG9yaXpvbnRhbFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBib3h3aGlza2VyI3NwYWNlWH0gYW5kIHdoZXJlIHtAbGluayBib3h3aGlza2VyI29yaWVudH09XCJ2ZXJ0aWNhbFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBib3h3aGlza2VyI3NwYWNlWX0gYmV0d2VlbiBib3hlc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbb2JqZWN0U3BhY2VyPTAuMDVdXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG9iamVjdFNwYWNlciA9IDAuMDUsXG4gIC8qKlxuICAqIFRoZSBtaW5pbXVtIHNpemUgdGhhdCBhbiBvYmplY3QgY2FuIGJlXG4gICogQHBhcmFtIHtudW1iZXJ9IFttaW5PYmplY3RTaXplPTE1XVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBtaW5PYmplY3RTaXplID0gMTUsXG4gIC8qKlxuICAqIFRoZSBtYXhpbXVtIHNpemUgdGhhdCBhbiBvYmplY3QgY2FuIGJlXG4gICogQHBhcmFtIHtudW1iZXJ9IFttYXhPYmplY3RTaXplPTUwXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBtYXhPYmplY3RTaXplID0gNTAsXG4gIC8qKlxuICAqIFBlcmNlbnQgb2YgYm94IGFuZCB3aGlza2VyIHNpemUgdGhhdCB3aGlza2VycyB3aWxsIGJlIHJlbmRlcmVkXG4gICogc2VlIHtAbGluayBib3h3aGlza2VyI29iamVjdFNpemV9XG4gICogQHBhcmFtIHtudW1iZXJ9IFt3aGlza2VyV2lkdGhQZXJjZW50PTAuNl1cbiAgKiBAbWVtYmVyb2YgYm94d2hpc2tlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgd2hpc2tlcldpZHRoUGVyY2VudCA9IC42LFxuICAvKipcbiAgKiBJbnN0YW5jZSBvZiBDb2xvckZ1bmN0aW9uXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW2NvbG9yRnVuY3Rpb24gPSBjb2xvckZ1bmN0aW9uKCldXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGNvbG9yRnVuY3Rpb24gPSBDRigpLFxuICAvKipcbiAgKiBUaGUgc3Ryb2tlIHdpZHRoIG9mIHRoZSBib3hlc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbYm94U3Ryb2tlV2lkdGg9Ml1cbiAgKiBAbWVtYmVyb2YgYm94d2hpc2tlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgYm94U3Ryb2tlV2lkdGggPSAyLFxuICAvKipcbiAgKiBUaGUgc3Ryb2tlIHdpZHRoIG9mIHRoZSB3aGlza2Vyc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbd2hpc2tlclN0cm9rZVdpZHRoPTJdXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHdoaXNrZXJTdHJva2VXaWR0aCA9IDIsXG5cbiAgLyoqXG4gICogQ29sb3Igb2YgdGhlIGJhY2tncm91bmRcbiAgKiBAcGFyYW0ge3N0cmluZ30gW2JhY2tncm91bmRGaWxsPVwidHJhbnNwYXJlbnRcIl1cbiAgKiBAbWVtYmVyb2YgYm94d2hpc2tlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgYmFja2dyb3VuZEZpbGwgPSAndHJhbnNwYXJlbnQnLFxuICAvKipcbiAgKiBOYW1lc3BhY2UgZm9yIGFsbCBpdGVtcyBtYWRlIGJ5IHRoaXMgaW5zdGFuY2Ugb2YgYm94d2hpc2tlclxuICAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZXNwYWNlPVwiZDNzbS1ib3gtd2hpc2tlclwiXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBuYW1lc3BhY2UgPSAnZDNzbS1ib3gtd2hpc2tlcicsXG4gIC8qKlxuICAqIENsYXNzIG5hbWUgZm9yIGJveHdoaXNrZXIgY29udGFpbmVyICg8Zz4gZWxlbWVudClcbiAgKiBAcGFyYW0ge3N0cmluZ30gW29iamVjdENsYXNzPVwiYm94LXdoaXNrXCJdXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG9iamVjdENsYXNzID0gJ2JveC13aGlzaycsXG5cbiAgLyoqXG4gICogRHVyYXRpb24gb2YgYWxsIHRyYW5zaXRpb25zIG9mIHRoaXMgZWxlbWVudFxuICAqIEBwYXJhbSB7bnVtYmVyfSBbdHJhbnNpdGlvbkR1cmF0aW9uPTEwMDBdXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHRyYW5zaXRpb25EdXJhdGlvbiA9IDEwMDAsXG4gIC8qKlxuICAqIEVhc2luZyBmdW5jdGlvbiBmb3IgdHJhbnNpdGlvbnNcbiAgKiBAcGFyYW0ge2QzLmVhc2V9IFtlYXNlRnVuYz1kMy5lYXNlRXhwXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBlYXNlRnVuYyA9IGQzLmVhc2VFeHAsXG5cbiAgLyoqXG4gICogVGhlIGtleXMgb2YgdGhlIGJveGVzXG4gICogQHBhcmFtIHtzdHJpbmdbXX0gW2JveEtleXM9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBib3hLZXlzLFxuICAvKipcbiAgKiBUaGUgdmFsdWVzIG9mIHRoZSBib3hlc1xuICAqIEBwYXJhbSB7c3RyaW5nW119IFtib3hWYWx1ZXM9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBib3hWYWx1ZXMsXG4gIC8qKlxuICAqIFRoZSBvYmplY3RTaXplIChhY3R1YWwgd2lkdGgpIHVzZWQgYnkgdGhlIGJveGVzXG4gICogQHBhcmFtIHtudW1iZXJ9IFtvYmplY3RTaXplPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYm94d2hpc2tlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb2JqZWN0U2l6ZSxcbiAgLyoqXG4gICogVGhlIHNwYWNlclNpemUgKGFjdHVhbCB3aWR0aCkgdXNlZCBieSB0aGUgc3BhY2VycyBiZXR3ZWVuIHRoZSBib3hlc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbc3BhY2VyU2l6ZT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNwYWNlclNpemUsXG4gIC8qKlxuICAqIEluc3RhbmNlIG9mIFRvb2x0aXBcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbdG9vbHRpcD10b29sdGlwKCldXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHRvb2x0aXAgPSBUVGlwKClcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgc2VsZWN0aW9uIGluIHdoaWNoIGl0ZW1zIGFyZSBtYW5pcHVsYXRlZFxuICAgKiBAcGFyYW0ge2QzLnNlbGVjdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBkMy5zZWxlY3Rpb259XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNlbGVjdGlvbiA9IHNlbGVjdGlvblxuICAgKi9cbiAgYm94d2hpc2tlci5zZWxlY3Rpb24gPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNlbGVjdGlvbiA9IF8sIGJveHdoaXNrZXIpIDogc2VsZWN0aW9uOyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBkYXRhXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjZGF0YX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IG9iamVjdH1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqL1xuICBib3h3aGlza2VyLmRhdGEgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRhdGEgPSBfLCBib3h3aGlza2VyKSA6IGRhdGE7IH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIG9yaWVudCBvZiB0aGUgYm94ZXNcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNvcmllbnR9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBvYmplY3R9XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKi9cbiAgYm94d2hpc2tlci5vcmllbnQgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9yaWVudCA9IF8sIGJveHdoaXNrZXIpIDogb3JpZW50OyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBhbW91bnQgb2YgaG9yaXpvbnRhbCBzcGFjZSBpbiB3aGljaCBpdGVtcyBhcmUgbWFuaXB1bGF0ZWRcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNzcGFjZVh9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV0gc2hvdWxkIGJlIGEgbnVtYmVyID4gMFxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc3BhY2VYID0gdW5kZWZpbmVkXG4gICAqL1xuICBib3h3aGlza2VyLnNwYWNlWCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3BhY2VYID0gXywgYm94d2hpc2tlcikgOiBzcGFjZVg7IH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGFtb3VudCBvZiB2ZXJ0aWNhbCBzcGFjZSBpbiB3aGljaCBpdGVtcyBhcmUgbWFuaXB1bGF0ZWRcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNzcGFjZVl9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV0gc2hvdWxkIGJlIGEgbnVtYmVyID4gMFxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc3BhY2VZID0gdW5kZWZpbmVkXG4gICAqL1xuICBib3h3aGlza2VyLnNwYWNlWSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3BhY2VZID0gXywgYm94d2hpc2tlcikgOiBzcGFjZVk7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB3aGV0aGVyIG9yIG5vdCBib3h3aGlza2VyIGlzIGFsbG93ZWQgdG8gZ28gYmV5b25kIHNwZWNpZmllZCBkaW1lbnNpb25zXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjb3ZlcmZsb3dRfSlcbiAgICogQHBhcmFtIHtib29sZWFufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IGJvb2xlYW59XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG92ZXJmbG93USA9IGZhbHNlXG4gICAqL1xuICBib3h3aGlza2VyLm92ZXJmbG93USA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob3ZlcmZsb3dRID0gXywgYm94d2hpc2tlcikgOiBvdmVyZmxvd1E7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgZ3JvdXBpbmcgb2YgdGhlIGJveGVzXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjZ3JvdXBpbmd9KVxuICAgKiBAcGFyYW0ge0FycmF5W119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgQXJyYXlbXX1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgZ3JvdXBpbmcgPSB1bmRlZmluZWRcbiAgICovXG4gIGJveHdoaXNrZXIuZ3JvdXBpbmcgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGdyb3VwaW5nID0gXywgYm94d2hpc2tlcikgOiBncm91cGluZzsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBxdWFydGlsZXNLZXlcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNxdWFydGlsZXNLZXl9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHF1YXJ0aWxlc0tleSA9IHF1YXJ0aWxlc1xuICAgKi9cbiAgYm94d2hpc2tlci5xdWFydGlsZXNLZXkgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHF1YXJ0aWxlc0tleSA9IF8sIGJveHdoaXNrZXIpIDogcXVhcnRpbGVzS2V5OyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHF1YXJ0aWxlc0tleXNcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNxdWFydGlsZXNLZXlzfSlcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBzdHJpbmdbXX1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgcXVhcnRpbGVzS2V5cyA9IFtRMCwgUTEsIFEyLCBRMywgUTRdXG4gICAqL1xuICBib3h3aGlza2VyLnF1YXJ0aWxlc0tleXMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHF1YXJ0aWxlc0tleXMgPSBfLCBib3h3aGlza2VyKSA6IHF1YXJ0aWxlc0tleXM7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdmFsdWVFeHRyYWN0b3JcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciN2YWx1ZUV4dHJhY3Rvcn0pXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgZnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHZhbHVlRXh0cmFjdG9yID0gZnVuY3Rpb24oa2V5LCBpbmRleCkgeyByZXR1cm4gZGF0YVtrZXldW3F1YXJ0aWxlc0tleV0gfSxcbiAgICovXG5cbiAgYm94d2hpc2tlci52YWx1ZUV4dHJhY3RvciA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmFsdWVFeHRyYWN0b3IgPSBfLCBib3h3aGlza2VyKSA6IHZhbHVlRXh0cmFjdG9yOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNvcnRpbmdGdW5jdGlvblxuICAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI3NvcnRpbmdGdW5jdGlvbn0pXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgZnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNvcnRpbmdGdW5jdGlvbiA9IGZ1bmN0aW9uKGtleUEsIGtleUIpIHtyZXR1cm4gZDMuZGVzY2VuZGluZyhcbiAgICogICB2YWx1ZUV4dHJhY3RvcihrZXlBKVtxdWFydGlsZXNLZXlzWzRdXSxcbiAgICogICB2YWx1ZUV4dHJhY3RvcihrZXlCKVtxdWFydGlsZXNLZXlzWzRdXVxuICAgKiApfSxcbiAgICovXG4gIGJveHdoaXNrZXIuc29ydGluZ0Z1bmN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzb3J0aW5nRnVuY3Rpb24gPSBfLCBib3h3aGlza2VyKSA6IHNvcnRpbmdGdW5jdGlvbjsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBzY2FsZSBmb3Igd2hpY2ggdGhlIGJveHdoaXNrZXIgdmFsdWVzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBieVxuICAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI3NjYWxlfSlcbiAgICogQHBhcmFtIHtkMy5zY2FsZX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBkMy5zY2FsZX1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc2NhbGUgPSBkMy5zY2FsZUxpbmVhcigpXG4gICAqL1xuICBib3h3aGlza2VyLnNjYWxlID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzY2FsZSA9IF8sIGJveHdoaXNrZXIpIDogc2NhbGU7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgcGFkZGluZyBmb3IgdGhlIGRvbWFpbiBvZiB0aGUgc2NhbGVcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNkb21haW5QYWRkaW5nfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBkb21haW5QYWRkaW5nID0gMC41XG4gICAqL1xuICBib3h3aGlza2VyLmRvbWFpblBhZGRpbmcgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpblBhZGRpbmcgPSBfLCBib3h3aGlza2VyKSA6IGRvbWFpblBhZGRpbmc7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyBvYmplY3RTcGFjZXJcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNvYmplY3RTcGFjZXJ9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG9iamVjdFNwYWNlciA9IDAuMDVcbiAgICovXG4gIGJveHdoaXNrZXIub2JqZWN0U3BhY2VyID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvYmplY3RTcGFjZXIgPSBfLCBib3h3aGlza2VyKSA6IG9iamVjdFNwYWNlcjsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBtaW5PYmplY3RTaXplXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjbWluT2JqZWN0U2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgbWluT2JqZWN0U2l6ZSA9IDE1XG4gICAqL1xuICBib3h3aGlza2VyLm1pbk9iamVjdFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG1pbk9iamVjdFNpemUgPSBfLCBib3h3aGlza2VyKSA6IG1pbk9iamVjdFNpemU7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbWF4T2JqZWN0U2l6ZVxuICAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI21heE9iamVjdFNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG1heE9iamVjdFNpemUgPSA1MFxuICAgKi9cbiAgYm94d2hpc2tlci5tYXhPYmplY3RTaXplID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChtYXhPYmplY3RTaXplID0gXywgYm94d2hpc2tlcikgOiBtYXhPYmplY3RTaXplOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHdoaXNrZXJXaWR0aFBlcmNlbnRcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciN3aGlza2VyV2lkdGhQZXJjZW50fSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBtYXhPYmplY3RTaXplID0gMC42XG4gICAqL1xuICBib3h3aGlza2VyLndoaXNrZXJXaWR0aFBlcmNlbnQgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHdoaXNrZXJXaWR0aFBlcmNlbnQgPSBfLCBib3h3aGlza2VyKSA6IHdoaXNrZXJXaWR0aFBlcmNlbnQ7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgY29sb3JGdW5jdGlvblxuICAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI2NvbG9yRnVuY3Rpb259KVxuICAgKiBAcGFyYW0ge2NvbG9yRnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgY29sb3JGdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgY29sb3JGdW5jdGlvbiA9IGNvbG9yRnVuY3Rpb24oKVxuICAgKi9cbiAgYm94d2hpc2tlci5jb2xvckZ1bmN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjb2xvckZ1bmN0aW9uID0gXywgYm94d2hpc2tlcikgOiBjb2xvckZ1bmN0aW9uOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGJveFN0cm9rZVdpZHRoXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjYm94U3Ryb2tlV2lkdGh9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGJveFN0cm9rZVdpZHRoID0gMlxuICAgKi9cbiAgYm94d2hpc2tlci5ib3hTdHJva2VXaWR0aCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYm94U3Ryb2tlV2lkdGggPSBfLCBib3h3aGlza2VyKSA6IGJveFN0cm9rZVdpZHRoOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHdoaXNrZXJTdHJva2VXaWR0aFxuICAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI3doaXNrZXJTdHJva2VXaWR0aH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgd2hpc2tlclN0cm9rZVdpZHRoID0gMlxuICAgKi9cbiAgYm94d2hpc2tlci53aGlza2VyU3Ryb2tlV2lkdGggPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHdoaXNrZXJTdHJva2VXaWR0aCA9IF8sIGJveHdoaXNrZXIpIDogd2hpc2tlclN0cm9rZVdpZHRoOyB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgYmFja2dyb3VuZEZpbGxcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNiYWNrZ3JvdW5kRmlsbH0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgYmFja2dyb3VuZEZpbGwgPSAndHJhbnNwYXJlbnQnXG4gICAqL1xuICBib3h3aGlza2VyLmJhY2tncm91bmRGaWxsID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChiYWNrZ3JvdW5kRmlsbCA9IF8sIGJveHdoaXNrZXIpIDogYmFja2dyb3VuZEZpbGw7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbmFtZXNwYWNlXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjbmFtZXNwYWNlfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBuYW1lc3BhY2UgPSAnZDNzbS1ib3h3aGlza2VyJ1xuICAgKi9cbiAgYm94d2hpc2tlci5uYW1lc3BhY2UgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG5hbWVzcGFjZSA9IF8sIGJveHdoaXNrZXIpIDogbmFtZXNwYWNlOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG9iamVjdENsYXNzXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjb2JqZWN0Q2xhc3N9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG9iamVjdENsYXNzID0gJ3RpY2stZ3JvdXAnXG4gICAqL1xuICBib3h3aGlza2VyLm9iamVjdENsYXNzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvYmplY3RDbGFzcyA9IF8sIGJveHdoaXNrZXIpIDogb2JqZWN0Q2xhc3M7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdHJhbnNpdGlvbkR1cmF0aW9uXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjdHJhbnNpdGlvbkR1cmF0aW9ufSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0cmFuc2l0aW9uRHVyYXRpb24gPSAxMDAwXG4gICAqL1xuICBib3h3aGlza2VyLnRyYW5zaXRpb25EdXJhdGlvbiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodHJhbnNpdGlvbkR1cmF0aW9uID0gXywgYm94d2hpc2tlcikgOiB0cmFuc2l0aW9uRHVyYXRpb247IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgZWFzZUZ1bmNcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNlYXNlRnVuY30pXG4gICAqIEBwYXJhbSB7ZDMuZWFzZX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBkMy5lYXNlfVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBlYXNlRnVuYyA9IGQzLmVhc2VFeHBcbiAgICovXG4gIGJveHdoaXNrZXIuZWFzZUZ1bmMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGVhc2VGdW5jID0gXywgYm94d2hpc2tlcikgOiBlYXNlRnVuYzsgfTtcblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGJhcktleXNcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNib3hLZXlzfSlcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBzdHJpbmdbXX1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgYm94S2V5cyA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYm94d2hpc2tlci5ib3hLZXlzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChib3hLZXlzID0gXywgYm94d2hpc2tlcikgOiBib3hLZXlzOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGJveFZhbHVlc1xuICAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI2JveFZhbHVlc30pXG4gICAqIEBwYXJhbSB7bnVtYmVyW119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgbnVtYmVyW119XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGJveFZhbHVlcyA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYm94d2hpc2tlci5ib3hWYWx1ZXMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGJveFZhbHVlcyA9IF8sIGJveHdoaXNrZXIpIDogYm94VmFsdWVzOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG9iamVjdFNpemVcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNvYmplY3RTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvYmplY3RTaXplID0gdW5kZWZpbmVkXG4gICAqL1xuICBib3h3aGlza2VyLm9iamVjdFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9iamVjdFNpemUgPSBfLCBib3h3aGlza2VyKSA6IG9iamVjdFNpemU7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgc3BhY2VyU2l6ZVxuICAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI3NwYWNlclNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNwYWNlclNpemUgPSB1bmRlZmluZWRcbiAgICovXG4gIGJveHdoaXNrZXIuc3BhY2VyU2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3BhY2VyU2l6ZSA9IF8sIGJveHdoaXNrZXIpIDogc3BhY2VyU2l6ZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB0b29sdGlwXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjdG9vbHRpcH0pXG4gICAqIEBwYXJhbSB7dG9vbHRpcH0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCB0b29sdGlwfVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0b29sdGlwID0gdG9vbHRpcCgpXG4gICAqL1xuICBib3h3aGlza2VyLnRvb2x0aXAgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRvb2x0aXAgPSBfLCBib3h3aGlza2VyKSA6IHRvb2x0aXA7IH07XG5cblxuICBmdW5jdGlvbiBib3h3aGlza2VyKCkge1xuICAgIC8vIGZvciBjb252ZW5pZW5jZSBpbiBoYW5kbGluZyBvcmllbnRhdGlvbiBzcGVjaWZpYyB2YWx1ZXNcbiAgICB2YXIgaG9yaXpvbnRhbFEgPSAob3JpZW50ID09ICdob3Jpem9udGFsJykgPyB0cnVlIDogZmFsc2VcbiAgICB2YXIgdmVydGljYWxRID0gIWhvcml6b250YWxRXG5cbiAgICAvLyBiYWNrZ3JvdW5kIGNsaXBpbmcgcmVjdGFuZ2xlXG4gICAgdmFyIGJnY3BSZWN0ID0ge3g6MCwgeTowLCB3aWR0aDogc3BhY2VYLCBoZWlnaHQ6c3BhY2VZfVxuICAgIHZhciBjb250YWluZXIgPSBzZXR1cENvbnRhaW5lciggc2VsZWN0aW9uLCBuYW1lc3BhY2UsIGJnY3BSZWN0LCBiYWNrZ3JvdW5kRmlsbCApO1xuXG4gICAgLy8gaWYgZ3JvdXBpbmcgaXMgdW5kZWZpbmVkIHNvcnQga2V5cyBieSBzb3J0aW5nIGZ1bmN0XG4gICAgdmFyIG9yZGVyZWQgPSAoZ3JvdXBpbmcgPT0gdW5kZWZpbmVkKSA/IGQzLmtleXMoZGF0YSkuc29ydChzb3J0aW5nRnVuY3Rpb24pIDogZ3JvdXBpbmdcbiAgICAvLyB0byBwcmV2ZW50IHJlLWNhbGN1bGF0aW9uIGFuZCBnZXR0ZXJzIHRvIGJlIHBhc3NlZCB0byBheGVzXG4gICAgYm94S2V5cyA9IGZsYXR0ZW4ob3JkZXJlZClcbiAgICBib3hWYWx1ZXMgPSBib3hLZXlzLm1hcCh2YWx1ZUV4dHJhY3RvcilcblxuXG4gICAgdmFyIG51bWJlck9mT2JqZWN0cyA9IGJveEtleXMubGVuZ3RoXG4gICAgdmFyIGV4dGVudCA9IFtcbiAgICAgIE1hdGgubWluKC4uLmJveFZhbHVlcy5tYXAoZnVuY3Rpb24oZCxpKXtyZXR1cm4gZFtxdWFydGlsZXNLZXlzWzBdXX0pKSAtIGRvbWFpblBhZGRpbmcsXG4gICAgICBNYXRoLm1heCguLi5ib3hWYWx1ZXMubWFwKGZ1bmN0aW9uKGQsaSl7cmV0dXJuIGRbcXVhcnRpbGVzS2V5c1s0XV19KSkgKyBkb21haW5QYWRkaW5nXG4gICAgXTtcblxuICAgIC8vIHNldCB0aGUgc2NhbGVcbiAgICBzY2FsZS5kb21haW4oZXh0ZW50KS5yYW5nZShob3Jpem9udGFsUSA/IFswLHNwYWNlWV0gOiBbc3BhY2VYLCAwXSlcbiAgICB2YXIgc3BhY2UgPSBob3Jpem9udGFsUSA/IHNwYWNlWCA6IHNwYWNlWVxuICAgIC8vIGNhbGN1bGF0ZSBvYmplY3Qgc2l6ZVxuICAgIG9iamVjdFNpemUgPSBjYWxjdWxhdGVXaWR0aE9mT2JqZWN0KHNwYWNlLCBudW1iZXJPZk9iamVjdHMsIG1pbk9iamVjdFNpemUsIG1heE9iamVjdFNpemUsIG9iamVjdFNwYWNlciwgb3ZlcmZsb3dRKVxuICAgIC8vIGNhbGN1bGF0ZSBzcGFjZXIgc2l6ZSBpZiBuZWVkZWRcbiAgICBzcGFjZXJTaXplID0gY2FsY3VsYXRlV2lkdGhPZlNwYWNlcihib3hLZXlzLCBzcGFjZSwgb2JqZWN0U2l6ZSwgbnVtYmVyT2ZPYmplY3RzLCBvYmplY3RTcGFjZXIsIG92ZXJmbG93USlcbiAgICAvLyBtYWtlIHRoZSBuZXN0ZWQgZ3JvdXBzXG4gICAgdmFyIHNwYWNlckZ1bmN0aW9uID0gZ3JvdXBpbmdTcGFjZXIoKVxuICAgIC5ob3Jpem9udGFsUShob3Jpem9udGFsUSkuc2NhbGUoc2NhbGUpLm1vdmVieSgnY2F0ZWdvcnknKS5udW1iZXJPZk9iamVjdHMobnVtYmVyT2ZPYmplY3RzKVxuICAgIC5vYmplY3RDbGFzcyhvYmplY3RDbGFzcykub2JqZWN0U2l6ZShvYmplY3RTaXplKS5zcGFjZXJTaXplKHNwYWNlclNpemUpXG4gICAgLnRyYW5zaXRpb25EdXJhdGlvbih0cmFuc2l0aW9uRHVyYXRpb24pLmVhc2VGdW5jKGVhc2VGdW5jKVxuICAgIC5uYW1lc3BhY2UobmFtZXNwYWNlKVxuXG4gICAgLy8gbW92ZSBzdHVmZlxuICAgIHNwYWNlckZ1bmN0aW9uKGNvbnRhaW5lciwgb3JkZXJlZCwgMClcblxuICAgIHZhciBwYXJlbnRJbmRleEFycmF5ID0gW11cbiAgICBjb250YWluZXIuc2VsZWN0QWxsKCdnOm5vdCgudG8tcmVtb3ZlKS4nK29iamVjdENsYXNzKVxuICAgIC5lYWNoKGZ1bmN0aW9uKGQsIGkpe2lmIChoYXNRKGJveEtleXMsIGQpKXsgcGFyZW50SW5kZXhBcnJheS5wdXNoKE51bWJlcihkMy5zZWxlY3QodGhpcykuYXR0cigncGFyZW50LWluZGV4JykpKX19KVxuXG5cblxuICAgIGNvbG9yRnVuY3Rpb24gPSBjb2xvckZ1bmN0aW9uLmNvbG9yQnkoKSA9PSAnaW5kZXgnXG4gICAgPyBjb2xvckZ1bmN0aW9uLmRhdGFFeHRlbnQoWzAsIE1hdGgubWF4KC4uLnBhcmVudEluZGV4QXJyYXkpXSlcbiAgICA6IGNvbG9yRnVuY3Rpb24uZGF0YUV4dGVudChleHRlbnQpXG5cblxuICAgIC8vIHNldCBhdHRyaWJ1dGVzIGZvciBib3ggYW5kIHdoaXNrZXJzXG4gICAgY29udGFpbmVyLnNlbGVjdEFsbCgnZzpub3QoLnRvLXJlbW92ZSkuJytvYmplY3RDbGFzcykuZWFjaChmdW5jdGlvbihrZXksIGkpIHtcbiAgICAgIHZhciB0ID0gZDMuc2VsZWN0KHRoaXMpLFxuICAgICAgY3VycmVudERhdGEgPSBkYXRhW2tleV0sXG5cbiAgICAgIHF1YXJ0aWxlcyA9IHZhbHVlRXh0cmFjdG9yKGtleSwgaSksXG4gICAgICBxMCA9IHF1YXJ0aWxlc1txdWFydGlsZXNLZXlzWzBdXSxcbiAgICAgIHExID0gcXVhcnRpbGVzW3F1YXJ0aWxlc0tleXNbMV1dLFxuICAgICAgcTIgPSBxdWFydGlsZXNbcXVhcnRpbGVzS2V5c1syXV0sXG4gICAgICBxMyA9IHF1YXJ0aWxlc1txdWFydGlsZXNLZXlzWzNdXSxcbiAgICAgIHE0ID0gcXVhcnRpbGVzW3F1YXJ0aWxlc0tleXNbNF1dXG5cbiAgICAgIHZhciBpID0gdC5hdHRyKCdwYXJlbnQtaW5kZXgnKSA9PSB1bmRlZmluZWQgPyBpIDogdC5hdHRyKCdwYXJlbnQtaW5kZXgnKSxcbiAgICAgIGZpbGxDb2xvciA9IGNvbG9yRnVuY3Rpb24oa2V5LCBxMiwgaSwgJ2ZpbGwnKSwgLy8gcHJldmVudCBkdXBsaWNhdGUgY29tcHV0YXRpb25cbiAgICAgIHN0cm9rZUNvbG9yID0gY29sb3JGdW5jdGlvbihrZXksIHEyLCBpLCAgJ3N0cm9rZScpXG5cblxuICAgICAgdmFyXG4gICAgICB3aGlzayA9IHNhZmVTZWxlY3QodCwgJ2cnLCAnd2hpc2tlcicpLFxuICAgICAgdVdoaXNrID0gc2FmZVNlbGVjdCh3aGlzaywgJ3BhdGgnLCAndXBwZXInKSxcbiAgICAgIGxXaGlzayA9IHNhZmVTZWxlY3Qod2hpc2ssICdwYXRoJywgJ2xvd2VyJyksXG4gICAgICBxdWFydCA9IHNhZmVTZWxlY3QodCwgJ2cnLCAncXVhcnRpbGUnKSxcbiAgICAgIHVRdWFydCA9IHNhZmVTZWxlY3QocXVhcnQsICdyZWN0JywgJ3VwcGVyJyksXG4gICAgICBsUXVhcnQgPSBzYWZlU2VsZWN0KHF1YXJ0LCAncmVjdCcsICdsb3dlcicpLFxuICAgICAgbVF1YXJ0ID0gc2FmZVNlbGVjdChxdWFydCwgJ2NpcmNsZScsICdtZWRpYW4nKVxuXG5cbiAgICAgIC8vIHNldCB1cHBlciBxdWFydGlsZSAocTMpXG4gICAgICB1UXVhcnQudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuZWFzZShlYXNlRnVuYylcbiAgICAgIC5hdHRyKCd3aWR0aCcsIGhvcml6b250YWxRID8gb2JqZWN0U2l6ZSA6IHNjYWxlKHEzKSAtIHNjYWxlKHEyKSlcbiAgICAgIC5hdHRyKCdoZWlnaHQnLCB2ZXJ0aWNhbFEgPyBvYmplY3RTaXplIDogc2NhbGUocTMpIC0gc2NhbGUocTIpKVxuICAgICAgLmF0dHIoJ2ZpbGwnLCBmaWxsQ29sb3IpXG4gICAgICAuYXR0cignc3Ryb2tlJywgc3Ryb2tlQ29sb3IpXG4gICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgYm94U3Ryb2tlV2lkdGgpXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24oZCwgaSl7XG4gICAgICAgIHZhclxuICAgICAgICB4ID0gaG9yaXpvbnRhbFEgPyAwIDogc2NhbGUocTIpLFxuICAgICAgICB5ID0gdmVydGljYWxRID8gMCA6IHNjYWxlKGV4dGVudFsxXSkgLSBzY2FsZShxMyksXG4gICAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgICAgcmV0dXJuIHRcbiAgICAgIH0pXG5cbiAgICAgIC8vIHNldCBsb3dlciBxdWFydGlsZSAocTEpXG4gICAgICBsUXVhcnQudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuZWFzZShlYXNlRnVuYylcbiAgICAgIC5hdHRyKCd3aWR0aCcsIGhvcml6b250YWxRID8gb2JqZWN0U2l6ZSA6IHNjYWxlKHEyKSAtIHNjYWxlKHExKSlcbiAgICAgIC5hdHRyKCdoZWlnaHQnLCB2ZXJ0aWNhbFEgPyBvYmplY3RTaXplIDogc2NhbGUocTIpIC0gc2NhbGUocTEpKVxuICAgICAgLmF0dHIoJ2ZpbGwnLCBmaWxsQ29sb3IpXG4gICAgICAuYXR0cignc3Ryb2tlJywgc3Ryb2tlQ29sb3IpXG4gICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgYm94U3Ryb2tlV2lkdGgpXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24oZCwgaSl7XG4gICAgICAgIHZhclxuICAgICAgICB4ID0gaG9yaXpvbnRhbFEgPyAwIDogc2NhbGUocTEpLFxuICAgICAgICB5ID0gdmVydGljYWxRID8gMCA6IHNjYWxlKGV4dGVudFsxXSkgLSBzY2FsZShxMiksXG4gICAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgICAgcmV0dXJuIHRcbiAgICAgIH0pXG5cblxuICAgICAgLy8gc2V0IG1lZGlhbiAocTIpXG4gICAgICBtUXVhcnQudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuZWFzZShlYXNlRnVuYylcbiAgICAgIC5hdHRyKCdyJywgZnVuY3Rpb24oZCwgaSl7XG4gICAgICAgIHZhciByID0gb2JqZWN0U2l6ZSAvIDJcbiAgICAgICAgdmFyIGRpZiA9IChzY2FsZShxMykgLSBzY2FsZShxMSkpIC8gMlxuICAgICAgICByZXR1cm4gKHIgPiBkaWYpID8gZGlmIDogclxuICAgICAgfSlcbiAgICAgIC5hdHRyKCdmaWxsJywgZmlsbENvbG9yKVxuICAgICAgLmF0dHIoJ3N0cm9rZScsIHN0cm9rZUNvbG9yKVxuICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIGJveFN0cm9rZVdpZHRoKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uKGQsIGkpe1xuICAgICAgICB2YXJcbiAgICAgICAgeCA9IGhvcml6b250YWxRID8gb2JqZWN0U2l6ZSAvIDIgOiBzY2FsZShxMiksXG4gICAgICAgIHkgPSB2ZXJ0aWNhbFEgPyBvYmplY3RTaXplIC8gMiA6IHNjYWxlKGV4dGVudFsxXSkgLSBzY2FsZShxMiksXG4gICAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgICAgcmV0dXJuIHRcbiAgICAgIH0pXG5cbiAgICAgIC8vIHNldCBsb3dlciB3aGlza2VyIChtaW4pXG4gICAgICBsV2hpc2sudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuZWFzZShlYXNlRnVuYylcbiAgICAgIC5hdHRyKCdkJywgZnVuY3Rpb24oZGQsIGlpKXtcbiAgICAgICAgdmFyXG4gICAgICAgIGRpciA9IGZhbHNlLFxuICAgICAgICB4ID0gMCxcbiAgICAgICAgeSA9IDAsXG4gICAgICAgIGggPSBob3Jpem9udGFsUSA/IHNjYWxlKHExKSAtIHNjYWxlKHEwKSA6IG9iamVjdFNpemUsXG4gICAgICAgIHcgPSB2ZXJ0aWNhbFEgPyBzY2FsZShxMSkgLSBzY2FsZShxMCkgOiBvYmplY3RTaXplXG4gICAgICAgIHJldHVybiB3aGlza2VyUGF0aChkaXIsIHgsIHksIHcsIGgsIHdoaXNrZXJXaWR0aFBlcmNlbnQsIG9yaWVudClcbiAgICAgIH0pXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24oZCwgaSl7XG4gICAgICAgIHZhclxuICAgICAgICB4ID0gaG9yaXpvbnRhbFEgPyAwIDogc2NhbGUocTEpLFxuICAgICAgICB5ID0gdmVydGljYWxRID8gMCA6IHNjYWxlKGV4dGVudFsxXSkgLSBzY2FsZShxMSksXG4gICAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgICAgcmV0dXJuIHRcbiAgICAgIH0pXG4gICAgICAuYXR0cignc3Ryb2tlJywgJ2JsYWNrJykuYXR0cignc3Ryb2tlLXdpZHRoJywgd2hpc2tlclN0cm9rZVdpZHRoKVxuICAgICAgLmF0dHIoJ2ZpbGwnLCAnbm9uZScpXG5cbiAgICAgIC8vIHNldCB1cHBlciB3aGlza2VyIChtYXgpXG4gICAgICB1V2hpc2sudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuZWFzZShlYXNlRnVuYylcbiAgICAgIC5hdHRyKCdkJywgZnVuY3Rpb24oZGQsIGlpKXtcbiAgICAgICAgdmFyXG4gICAgICAgIGRpciA9IHRydWUsXG4gICAgICAgIHggPSAwLFxuICAgICAgICB5ID0gMCxcbiAgICAgICAgaCA9IGhvcml6b250YWxRID8gc2NhbGUocTQpIC0gc2NhbGUocTMpIDogb2JqZWN0U2l6ZSxcbiAgICAgICAgdyA9IHZlcnRpY2FsUSA/IHNjYWxlKHE0KSAtIHNjYWxlKHEzKSA6IG9iamVjdFNpemVcbiAgICAgICAgcmV0dXJuIHdoaXNrZXJQYXRoKGRpciwgeCwgeSwgdywgaCwgd2hpc2tlcldpZHRoUGVyY2VudCwgb3JpZW50KVxuICAgICAgfSlcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbihkLCBpKXtcbiAgICAgICAgdmFyXG4gICAgICAgIHggPSBob3Jpem9udGFsUSA/IDAgOiBzY2FsZShxMyksXG4gICAgICAgIHkgPSB2ZXJ0aWNhbFEgPyAwIDogIHNjYWxlKGV4dGVudFsxXSkgLSBzY2FsZShxNCksXG4gICAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgICAgcmV0dXJuIHRcbiAgICAgIH0pXG4gICAgICAuYXR0cignc3Ryb2tlJywgJ2JsYWNrJylcbiAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCB3aGlza2VyU3Ryb2tlV2lkdGgpXG4gICAgICAuYXR0cignZmlsbCcsICdub25lJylcblxuICAgIH0pXG5cbiAgICB0b29sdGlwLnNlbGVjdGlvbihjb250YWluZXIuc2VsZWN0QWxsKCdnOm5vdCgudG8tcmVtb3ZlKS4nK29iamVjdENsYXNzKSlcbiAgICAuZGF0YShkYXRhKVxuICAgIHRvb2x0aXAoKVxuXG5cbiAgfVxuXG4gIHJldHVybiBib3h3aGlza2VyXG59XG4iLCJpbXBvcnQge2h5cGVuYXRlLCBzYWZlU2VsZWN0fSBmcm9tICcuL2hlbHBlcnMnO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFUQVRPR0dMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqXG4gKiBDcmVhdGVzIGEgZGF0YXRvZ2dsZVxuICogQGNvbnN0cnVjdG9yIGRhdGF0b2dnbGVcbiAqIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBzZWxlY3Rpb25cbiAqIEBuYW1lc3BhY2UgZGF0YXRvZ2dsZVxuICogQHJldHVybnMge2Z1bmN0aW9ufSBkYXRhdG9nZ2xlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkYXRhdG9nZ2xlKCBzZWxlY3Rpb24gKSB7XG4gIHZhclxuICAvKipcbiAgKiBLZXlzIHRvIG1ha2UgdG9nZ2xlLWFibGUgb3B0aW9uc1xuICAqIChzZWUge0BsaW5rIGRhdGF0b2dnbGUja2V5c30pXG4gICogQHBhcmFtIHtzdHJpbmdbXX0gW2tleXM9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBkYXRhdG9nZ2xlI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBrZXlzLFxuICAvKipcbiAgKiBXaGF0IHRvIGRvIHdoZW4gYSBkaWZmZXJlbnQga2V5IGlzIGNsaWNrZWRcbiAgKiAoc2VlIHtAbGluayBkYXRhdG9nZ2xlI3VwZGF0ZUZ1bmN0aW9ufSlcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbdXBkYXRlRnVuY3Rpb249ZnVuY3Rpb24oKXt9XVxuICAqIEBtZW1iZXJvZiBkYXRhdG9nZ2xlI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB1cGRhdGVGdW5jdGlvbiA9IGZ1bmN0aW9uKCl7fSxcbiAgLyoqXG4gICogTmFtZXNwYWNlIGZvciBhbGwgaXRlbXMgbWFkZSBieSB0aGlzIGluc3RhbmNlIG9mIGRhdGF0b2dnbGVcbiAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVzcGFjZT1cImQzc20tZGF0YWJhclwiXVxuICAqIEBtZW1iZXJvZiBkYXRhdG9nZ2xlI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBuYW1lc3BhY2U9J2Qzc20tZGF0YWJhcicsXG4gIC8qKlxuICAqIEN1cnJlbnRseSB0b2dnbGVkIGtleVxuICAqIEBwYXJhbSB7c3RyaW5nfSBbY3VycmVudEtleT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGRhdGF0b2dnbGUjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGN1cnJlbnRLZXlcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBrZXlzXG4gICAqIChzZWUge0BsaW5rIGRhdGF0b2dnbGUja2V5c30pXG4gICAqIEBmdW5jdGlvbiBkYXRhdG9nZ2xlLmtleXNcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2RhdGF0b2dnbGUgfCBzdHJpbmdbXX1cbiAgICogQG1lbWJlcm9mIGRhdGF0b2dnbGVcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQga2V5cyA9IHVuZGVmaW5lZFxuICAgKi9cbiAgdG9nZ2xlLmtleXMgPSBmdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChrZXlzID0gXywgdG9nZ2xlKSA6IGtleXN9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdXBkYXRlRnVuY3Rpb25cbiAgICogKHNlZSB7QGxpbmsgZGF0YXRvZ2dsZSN1cGRhdGVGdW5jdGlvbn0pXG4gICAqIEBmdW5jdGlvbiBkYXRhdG9nZ2xlLnVwZGF0ZUZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtkYXRhdG9nZ2xlIHwgZnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiBkYXRhdG9nZ2xlXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHVwZGF0ZUZ1bmN0aW9uID0gZnVuY3Rpb24oKXt9XG4gICAqL1xuICB0b2dnbGUudXBkYXRlRnVuY3Rpb24gPSBmdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh1cGRhdGVGdW5jdGlvbiA9IF8sIHRvZ2dsZSkgOiB1cGRhdGVGdW5jdGlvbn1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBuYW1lc3BhY2VcbiAgICogKHNlZSB7QGxpbmsgZGF0YXRvZ2dsZSNuYW1lc3BhY2V9KVxuICAgKiBAZnVuY3Rpb24gZGF0YXRvZ2dsZS5uYW1lc3BhY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtkYXRhdG9nZ2xlIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgZGF0YXRvZ2dsZVxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBuYW1lc3BhY2UgPSAnZDNzbS1kYXRhYmFyJ1xuICAgKi9cbiAgdG9nZ2xlLm5hbWVzcGFjZSA9IGZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG5hbWVzcGFjZSA9IF8sIHRvZ2dsZSkgOiBuYW1lc3BhY2V9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgY3VycmVudEtleVxuICAgKiAoc2VlIHtAbGluayBkYXRhdG9nZ2xlI2N1cnJlbnRLZXl9KVxuICAgKiBAZnVuY3Rpb24gZGF0YXRvZ2dsZS5jdXJyZW50S2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7ZGF0YXRvZ2dsZSB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGRhdGF0b2dnbGVcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgY3VycmVudEtleSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgdG9nZ2xlLmN1cnJlbnRLZXkgPSBmdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjdXJyZW50S2V5ID0gXywgdG9nZ2xlKSA6IGN1cnJlbnRLZXl9XG5cbiAgZnVuY3Rpb24gdG9nZ2xlKCkge1xuICAgIC8vIHNlbGVjdGlvbiBvcHRpb25zXG4gICAgdmFyIGRhdGFvcHRzID0gc2VsZWN0aW9uLnNlbGVjdEFsbCgnZGl2LmRhdGEtb3B0aW9uJylcbiAgICAvLyByZW1vdmUgZXhjZXNzXG4gICAgZGF0YW9wdHMuZXhpdCgpLnJlbW92ZSgpXG4gICAgLy8gYmluZCBkYXRhXG4gICAgZGF0YW9wdHMgPSBkYXRhb3B0cy5kYXRhKGtleXMpXG4gICAgLy8gZW50ZXJcbiAgICB2YXIgZG9FbnRlciA9IGRhdGFvcHRzLmVudGVyKCkuYXBwZW5kKCdkaXYnKS5hdHRyKCdjbGFzcycsICdkYXRhLW9wdGlvbicpXG4gICAgLmNsYXNzZWQoJ2Zvcm0tY2hlY2sgZm9ybS1jaGVjay1pbmxpbmUgYWxpZ24tbWlkZGxlJywgdHJ1ZSlcbiAgICBkb0VudGVyXG4gICAgLmFwcGVuZCgnaW5wdXQnKS5hdHRyKCd0eXBlJywgJ3JhZGlvJylcbiAgICAuYXR0cignaWQnLCBmdW5jdGlvbihkLGkpe3JldHVybiBoeXBlbmF0ZShuYW1lc3BhY2UsIGQpfSlcbiAgICAuYXR0cignbmFtZScsIGh5cGVuYXRlKG5hbWVzcGFjZSwgJ2RhdGFiYXInKSlcbiAgICAuYXR0cigndmFsdWUnLCBmdW5jdGlvbihkLCBpKXtyZXR1cm4gZH0pXG5cbiAgICBkb0VudGVyXG4gICAgLmFwcGVuZCgnbGFiZWwnKVxuICAgIC5hdHRyKCdmb3InLCBmdW5jdGlvbihkLGkpe3JldHVybiBoeXBlbmF0ZShuYW1lc3BhY2UsIGQpfSlcbiAgICAuYXR0cignbmFtZScsIGh5cGVuYXRlKG5hbWVzcGFjZSwgJ2RhdGFiYXInKSlcbiAgICAudGV4dChmdW5jdGlvbihkLCBpKXtyZXR1cm4gZH0pXG5cbiAgICBkYXRhb3B0cyA9IGRhdGFvcHRzLm1lcmdlKGRvRW50ZXIpXG5cbiAgICBjdXJyZW50S2V5ID0gZGF0YW9wdHMuc2VsZWN0KCc6Y2hlY2tlZCcpLmVtcHR5KClcbiAgICA/IGtleXNbMF1cbiAgICA6IGRhdGFvcHRzLnNlbGVjdCgnOmNoZWNrZWQnKS5kYXR1bSgpXG5cbiAgICAvLyBjaGVjayBjdXJyZW50XG4gICAgZGF0YW9wdHMuc2VsZWN0KCdbdmFsdWU9XCInK2N1cnJlbnRLZXkrJ1wiXScpLnByb3BlcnR5KCdjaGVja2VkJywgdHJ1ZSlcblxuICAgIC8vIGJpbmQgdXBkYXRlIGZ1bmN0aW9uXG4gICAgZGF0YW9wdHMub24oJ2NsaWNrJywgZnVuY3Rpb24oZCwgaSl7IHVwZGF0ZUZ1bmN0aW9uKCkgfSlcbiAgICByZXR1cm4gdG9nZ2xlXG4gIH1cblxuICByZXR1cm4gdG9nZ2xlXG59XG4iLCJpbXBvcnQge2h5cGVuYXRlLCBzYWZlU2VsZWN0fSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHtzZXR1cENvbnRhaW5lciwgY2FsY3VsYXRlV2lkdGhPZk9iamVjdCwgY2FsY3VsYXRlV2lkdGhPZlNwYWNlcn0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge3VuaXF1ZSwgZmxhdHRlbn0gZnJvbSAnLi9hcnJheS1mdW5jdGlvbnMnO1xuaW1wb3J0IHtncm91cGluZ1NwYWNlcn0gZnJvbSAnLi9ncm91cGluZy1zcGFjZXInO1xuaW1wb3J0IHtjb2xvckZ1bmN0aW9uIGFzIENGfSBmcm9tICcuL2NvbG9yLWZ1bmN0aW9uJztcbmltcG9ydCB7dG9vbHRpcCBhcyBUVGlwfSBmcm9tICcuL3Rvb2x0aXAnO1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0FUVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKlxuICogQ3JlYXRlcyBhIHNjYXR0ZXJcbiAqXG4gKiB7QGxpbmsgaHR0cHM6Ly9zdW1uZXVyb24uZ2l0bGFiLmlvL2Qzc20vZGVtb3Mvc2NhdHRlci9pbmRleC5odG1sIERlbW99XG4gKiBAY29uc3RydWN0b3Igc2NhdHRlclxuICogQHBhcmFtIHtkMy5zZWxlY3Rpb259IHNlbGVjdGlvblxuICogQG5hbWVzcGFjZSBzY2F0dGVyXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259IHNjYXR0ZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjYXR0ZXIgKCBzZWxlY3Rpb24gKSB7XG5cbiAgdmFyXG4gIC8qKlxuICAqIERhdGEgdG8gcGxvdC4gQXNzdW1lZCB0byBiZSBhIG9iamVjdCwgd2hlcmUgZWFjaCBrZXkgY29ycmVzcG9uZHMgdG8gYSBwb2ludFxuICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjZGF0YX0pXG4gICogQHBhcmFtIHtPYmplY3R9IFtkYXRhPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZGF0YSxcbiAgLyoqXG4gICogQW1vdW50IG9mIGhvcml6b250YWwgc3BhY2UgKGluIHBpeGVscykgYXZhaWJsZSB0byByZW5kZXIgdGhlIHNjYXR0ZXIgaW5cbiAgKiAoc2VlIHtAbGluayBzY2F0dGVyI3NwYWNlWH0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZVg9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzcGFjZVgsXG4gIC8qKlxuICAqIEFtb3VudCBvZiB2ZXJ0aWNhbCBzcGFjZSAoaW4gcGl4ZWxzKSBhdmFpYmxlIHRvIHJlbmRlciB0aGUgc2NhdHRlciBpblxuICAqIChzZWUge0BsaW5rIHNjYXR0ZXIuc3BhY2VZfSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW3NwYWNlWT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNwYWNlWSxcblxuICAvKipcbiAgKiBUaGUgc2NhbGUgZm9yIHdoaWNoIHNjYXR0ZXIgeCB2YWx1ZXMgc2hvdWxkIGJlIHRyYW5zZm9ybWVkIGJ5XG4gICogQHBhcmFtIHtkMy5zY2FsZX0gW3NjYWxlWD1kMy5zY2FsZUxpbmVhcl1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc2NhbGVYID0gZDMuc2NhbGVMaW5lYXIoKSxcbiAgLyoqXG4gICogVGhlIHBhZGRpbmcgZm9yIHRoZSBkb21haW4gb2YgdGhlIHNjYWxlWCAoc2VlIHtAbGluayBzY2F0dGVyI3NjYWxlWH0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtkb21haW5QYWRkaW5nWD0wLjVdXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGRvbWFpblBhZGRpbmdYID0gMC41LFxuICAvKipcbiAgKiBUaGUgZnVuY3Rpb24gZm9yIGdldHRpbmcgdGhlIHggdmFsdWUgb2YgdGhlIGN1cnJlbnQgcG9pbnRcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbdmFsdWVFeHRyYWN0b3JYPWZ1bmN0aW9uKGQsIGkpe3JldHVybiBkYXRhW2RdWyd4J119XVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB2YWx1ZUV4dHJhY3RvclggPSBmdW5jdGlvbihkLCBpKSB7cmV0dXJuIGRhdGFbZF1bJ3gnXX0sXG5cbiAgLyoqXG4gICogVGhlIHNjYWxlIGZvciB3aGljaCBzY2F0dGVyIHkgdmFsdWVzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBieVxuICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtzY2FsZVk9ZDMuc2NhbGVMaW5lYXJdXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNjYWxlWSA9IGQzLnNjYWxlTGluZWFyKCksXG4gIC8qKlxuICAqIFRoZSBwYWRkaW5nIGZvciB0aGUgZG9tYWluIG9mIHRoZSBzY2FsZVkgKHNlZSB7QGxpbmsgc2NhdHRlciNzY2FsZVl9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbZG9tYWluUGFkZGluZ1k9MC41XVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBkb21haW5QYWRkaW5nWSA9IDAuNSxcbiAgLyoqXG4gICogVGhlIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHRoZSB5IHZhbHVlIG9mIHRoZSBjdXJyZW50IHBvaW50XG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW3ZhbHVlRXh0cmFjdG9yWT1mdW5jdGlvbihkLCBpKXtyZXR1cm4gZGF0YVtkXVsneSddfV1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdmFsdWVFeHRyYWN0b3JZID0gZnVuY3Rpb24oZCwgaSkge3JldHVybiBkYXRhW2RdWyd5J119LFxuXG5cbiAgLyoqXG4gICogVGhlIHNjYWxlIGZvciB3aGljaCBzY2F0dGVyIHIgdmFsdWVzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBieVxuICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtzY2FsZVI9ZDMuc2NhbGVMaW5lYXJdXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNjYWxlUiA9IGQzLnNjYWxlTGluZWFyKCksXG4gIC8qKlxuICAqIFRoZSBwYWRkaW5nIGZvciB0aGUgZG9tYWluIG9mIHRoZSBzY2FsZVIgKHNlZSB7QGxpbmsgc2NhdHRlciNzY2FsZVJ9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbZG9tYWluUGFkZGluZ1I9MC41XVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBkb21haW5QYWRkaW5nUiA9IDAuNSxcbiAgLyoqXG4gICogVGhlIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHRoZSByIHZhbHVlIG9mIHRoZSBjdXJyZW50IHBvaW50XG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW3ZhbHVlRXh0cmFjdG9yUj1mdW5jdGlvbihkLCBpKXtyZXR1cm4gMn1dXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHZhbHVlRXh0cmFjdG9yUiA9IGZ1bmN0aW9uKGQsIGkpIHtyZXR1cm4gMn0sXG4gIC8qKlxuICAqIFRoZSBtaW4gcmFkaXVzIGEgcG9pbnQgY2FuIGhhdmVcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbbWluUmFkaXVzPTJdXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG1pblJhZGl1cyA9IDIsXG4gIC8qKlxuICAqIFRoZSBtaW4gcmFkaXVzIGEgcG9pbnQgY2FuIGhhdmVcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbbWF4UmFkaXVzPTEwXVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBtYXhSYWRpdXMgPSAxMCxcblxuICAvKipcbiAgKiBUaGUgc3Ryb2tlIHdpZHRoIG9mIHRoZSBwb2ludHNcbiAgKiBAcGFyYW0ge251bWJlcn0gW3BvaW50U3Ryb2tlV2lkdGg9Ml1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgcG9pbnRTdHJva2VXaWR0aCA9IDIsXG4gIC8qKlxuICAqIEluc3RhbmNlIG9mIENvbG9yRnVuY3Rpb25cbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbY29sb3JGdW5jdGlvbiA9IGNvbG9yRnVuY3Rpb24oKV1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgY29sb3JGdW5jdGlvbiA9IENGKCksXG4gIC8qKlxuICAqIENvbG9yIG9mIHRoZSBiYWNrZ3JvdW5kXG4gICogQHBhcmFtIHtzdHJpbmd9IFtiYWNrZ3JvdW5kRmlsbD1cInRyYW5zcGFyZW50XCJdXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGJhY2tncm91bmRGaWxsID0gJ3RyYW5zcGFyZW50JyxcbiAgLyoqXG4gICogTmFtZXNwYWNlIGZvciBhbGwgaXRlbXMgbWFkZSBieSB0aGlzIGluc3RhbmNlIG9mIHNjYXR0ZXJcbiAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVzcGFjZT1cImQzc20tc2NhdHRlclwiXVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBuYW1lc3BhY2UgPSAnZDNzbS1zY2F0dGVyJyxcbiAgLyoqXG4gICogQ2xhc3MgbmFtZSBmb3Igc2NhdHRlciBjb250YWluZXIgKDxjaXJjbGU+IGVsZW1lbnQpXG4gICogQHBhcmFtIHtzdHJpbmd9IFtvYmplY3RDbGFzcz1cInNjYXR0ZXItcG9pbnRcIl1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb2JqZWN0Q2xhc3MgPSAnc2NhdHRlci1wb2ludCcsXG4gIC8qKlxuICAqIER1cmF0aW9uIG9mIGFsbCB0cmFuc2l0aW9ucyBvZiB0aGlzIGVsZW1lbnRcbiAgKiBAcGFyYW0ge251bWJlcn0gW3RyYW5zaXRpb25EdXJhdGlvbj0xMDAwXVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB0cmFuc2l0aW9uRHVyYXRpb24gPSAxMDAwLFxuICAvKipcbiAgKiBFYXNpbmcgZnVuY3Rpb24gZm9yIHRyYW5zaXRpb25zXG4gICogQHBhcmFtIHtkMy5lYXNlfSBbZWFzZUZ1bmM9ZDMuZWFzZUV4cF1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZWFzZUZ1bmMgPSBkMy5lYXNlRXhwLFxuXG4gIC8vIHVzZWZ1bCB2YWx1ZXMgdG8gZXh0cmFjdCB0byBwcmV2ZW50IHJlLWNhbGN1bGF0aW9uXG4gIC8qKlxuICAqIFRoZSBrZXlzIG9mIHRoZSBwb2ludHNcbiAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbcG9pbnRLZXlzPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgcG9pbnRLZXlzLFxuICAvKipcbiAgKiBUaGUgeCB2YWx1ZXMgb2YgdGhlIHBvaW50c1xuICAqIEBwYXJhbSB7bnVtYmVyW119IFt2YWx1ZXNYPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdmFsdWVzWCxcbiAgLyoqXG4gICogVGhlIHkgdmFsdWVzIG9mIHRoZSBwb2ludHNcbiAgKiBAcGFyYW0ge251bWJlcltdfSBbdmFsdWVzWT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHZhbHVlc1ksXG4gIC8qKlxuICAqIFRoZSByIHZhbHVlcyBvZiB0aGUgcG9pbnRzXG4gICogQHBhcmFtIHtudW1iZXJbXX0gW3ZhbHVlc1I9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB2YWx1ZXNSLFxuXG4gIC8qKlxuICAqIEluc3RhbmNlIG9mIFRvb2x0aXBcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbdG9vbHRpcD10b29sdGlwKCldXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHRvb2x0aXAgPSBUVGlwKClcblxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBzZWxlY3Rpb24gaW4gd2hpY2ggaXRlbXMgYXJlIG1hbmlwdWxhdGVkXG4gICAqIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IGQzLnNlbGVjdGlvbn1cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc2VsZWN0aW9uID0gc2VsZWN0aW9uXG4gICAqL1xuICBzY2F0dGVyLnNlbGVjdGlvbiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2VsZWN0aW9uID1fLCBzY2F0dGVyKSA6IHNlbGVjdGlvbn1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgZGF0YVxuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI2RhdGF9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBvYmplY3R9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKi9cbiAgc2NhdHRlci5kYXRhID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkYXRhID1fLCBzY2F0dGVyKSA6IGRhdGF9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGFtb3VudCBvZiBob3Jpem9udGFsIHNwYWNlIGluIHdoaWNoIGl0ZW1zIGFyZSBtYW5pcHVsYXRlZFxuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI3NwYWNlWH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXSBzaG91bGQgYmUgYSBudW1iZXIgPiAwXG4gICAqIEByZXR1cm5zIHtzY2F0dGVyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzcGFjZVggPSB1bmRlZmluZWRcbiAgICovXG4gIHNjYXR0ZXIuc3BhY2VYID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzcGFjZVggPV8sIHNjYXR0ZXIpIDogc3BhY2VYfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBhbW91bnQgb2YgdmVydGljYWwgc3BhY2UgaW4gd2hpY2ggaXRlbXMgYXJlIG1hbmlwdWxhdGVkXG4gICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjc3BhY2VZfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdIHNob3VsZCBiZSBhIG51bWJlciA+IDBcbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNwYWNlWSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgc2NhdHRlci5zcGFjZVkgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNwYWNlWSA9Xywgc2NhdHRlcikgOiBzcGFjZVl9XG5cblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgeCBzY2FsZSBmb3Igd2hpY2ggdGhlIHNjYXR0ZXIgeCB2YWx1ZXMgc2hvdWxkIGJlIHRyYW5zZm9ybWVkIGJ5XG4gICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjc2NhbGVYfSlcbiAgICogQHBhcmFtIHtkMy5zY2FsZX0gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBkMy5zY2FsZX1cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc2NhbGVYID0gZDMuc2NhbGVMaW5lYXIoKVxuICAgKi9cbiAgc2NhdHRlci5zY2FsZVggPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNjYWxlWCA9Xywgc2NhdHRlcikgOiBzY2FsZVh9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgcGFkZGluZyBmb3IgdGhlIGRvbWFpbiBvZiB0aGUgeCBzY2FsZVxuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI2RvbWFpblBhZGRpbmdYfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtzY2F0dGVyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBkb21haW5QYWRkaW5nWCA9IDAuNVxuICAgKi9cbiAgc2NhdHRlci5kb21haW5QYWRkaW5nWCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluUGFkZGluZ1ggPV8sIHNjYXR0ZXIpIDogZG9tYWluUGFkZGluZ1h9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdmFsdWVFeHRyYWN0b3JYXG4gICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjdmFsdWVFeHRyYWN0b3JYfSlcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBmdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdmFsdWVFeHRyYWN0b3JYID0gZnVuY3Rpb24oa2V5LCBpbmRleCkgeyByZXR1cm4gZGF0YVtrZXldWyd4J10gfVxuICAgKi9cbiAgc2NhdHRlci52YWx1ZUV4dHJhY3RvclggPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZhbHVlRXh0cmFjdG9yWCA9Xywgc2NhdHRlcikgOiB2YWx1ZUV4dHJhY3Rvclh9XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHkgc2NhbGUgZm9yIHdoaWNoIHRoZSBzY2F0dGVyIHkgdmFsdWVzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBieVxuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI3NjYWxlWX0pXG4gICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtzY2F0dGVyIHwgZDMuc2NhbGV9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNjYWxlWSA9IGQzLnNjYWxlTGluZWFyKClcbiAgICovXG4gIHNjYXR0ZXIuc2NhbGVZID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzY2FsZVkgPV8sIHNjYXR0ZXIpIDogc2NhbGVZfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHBhZGRpbmcgZm9yIHRoZSBkb21haW4gb2YgdGhlIHkgc2NhbGVcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciNkb21haW5QYWRkaW5nWX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgZG9tYWluUGFkZGluZ1kgPSAwLjVcbiAgICovXG4gIHNjYXR0ZXIuZG9tYWluUGFkZGluZ1kgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpblBhZGRpbmdZID1fLCBzY2F0dGVyKSA6IGRvbWFpblBhZGRpbmdZfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHZhbHVlRXh0cmFjdG9yWVxuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI3ZhbHVlRXh0cmFjdG9yWX0pXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtzY2F0dGVyIHwgZnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHZhbHVlRXh0cmFjdG9yWSA9IGZ1bmN0aW9uKGtleSwgaW5kZXgpIHsgcmV0dXJuIGRhdGFba2V5XVsneSddIH1cbiAgICovXG4gIHNjYXR0ZXIudmFsdWVFeHRyYWN0b3JZID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2YWx1ZUV4dHJhY3RvclkgPV8sIHNjYXR0ZXIpIDogdmFsdWVFeHRyYWN0b3JZfVxuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSByIHNjYWxlIGZvciB3aGljaCB0aGUgc2NhdHRlciByIHZhbHVlcyBzaG91bGQgYmUgdHJhbnNmb3JtZWQgYnlcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciNzY2FsZVJ9KVxuICAgKiBAcGFyYW0ge2QzLnNjYWxlfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IGQzLnNjYWxlfVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzY2FsZVIgPSBkMy5zY2FsZUxpbmVhcigpXG4gICAqL1xuICBzY2F0dGVyLnNjYWxlUiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2NhbGVSID1fLCBzY2F0dGVyKSA6IHNjYWxlUn1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBwYWRkaW5nIGZvciB0aGUgZG9tYWluIG9mIHRoZSByIHNjYWxlXG4gICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjZG9tYWluUGFkZGluZ1J9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGRvbWFpblBhZGRpbmdSID0gMC41XG4gICAqL1xuICBzY2F0dGVyLmRvbWFpblBhZGRpbmdSID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkb21haW5QYWRkaW5nUiA9Xywgc2NhdHRlcikgOiBkb21haW5QYWRkaW5nUn1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB2YWx1ZUV4dHJhY3RvclJcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciN2YWx1ZUV4dHJhY3RvclJ9KVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IGZ1bmN0aW9ufVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB2YWx1ZUV4dHJhY3RvclIgPSBmdW5jdGlvbihrZXksIGluZGV4KSB7IHJldHVybiBkYXRhW2tleV1bJ3InXSB9XG4gICAqL1xuICBzY2F0dGVyLnZhbHVlRXh0cmFjdG9yUiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmFsdWVFeHRyYWN0b3JSID1fLCBzY2F0dGVyKSA6IHZhbHVlRXh0cmFjdG9yUn1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBtaW5SYWRpdXNcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciNtaW5SYWRpdXN9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG1pblJhZGl1cyA9IDJcbiAgICovXG4gIHNjYXR0ZXIubWluUmFkaXVzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChtaW5SYWRpdXMgPV8sIHNjYXR0ZXIpIDogbWluUmFkaXVzfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG1heFJhZGl1c1xuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI21heFJhZGl1c30pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgbWF4UmFkaXVzID0gMTBcbiAgICovXG4gIHNjYXR0ZXIubWF4UmFkaXVzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChtYXhSYWRpdXMgPV8sIHNjYXR0ZXIpIDogbWF4UmFkaXVzfVxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgcG9pbnRTdHJva2VXaWR0aFxuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI3BvaW50U3Ryb2tlV2lkdGh9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHBvaW50U3Ryb2tlV2lkdGggPSAyXG4gICAqL1xuICBzY2F0dGVyLnBvaW50U3Ryb2tlV2lkdGggPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBvaW50U3Ryb2tlV2lkdGggPV8sIHNjYXR0ZXIpIDogcG9pbnRTdHJva2VXaWR0aH1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBjb2xvckZ1bmN0aW9uXG4gICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjY29sb3JGdW5jdGlvbn0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgY29sb3JGdW5jdGlvbiA9IGNvbG9yRnVuY3Rpb24oKVxuICAgKi9cbiAgc2NhdHRlci5jb2xvckZ1bmN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjb2xvckZ1bmN0aW9uID1fLCBzY2F0dGVyKSA6IGNvbG9yRnVuY3Rpb259XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgYmFja2dyb3VuZEZpbGxcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciNiYWNrZ3JvdW5kRmlsbH0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgYmFja2dyb3VuZEZpbGwgPSAndHJhbnNwYXJlbnQnXG4gICAqL1xuICBzY2F0dGVyLmJhY2tncm91bmRGaWxsID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChiYWNrZ3JvdW5kRmlsbCA9Xywgc2NhdHRlcikgOiBiYWNrZ3JvdW5kRmlsbH1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBuYW1lc3BhY2VcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciNuYW1lc3BhY2V9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG5hbWVzcGFjZSA9ICdkM3NtLXNjYXR0ZXInXG4gICAqL1xuICBzY2F0dGVyLm5hbWVzcGFjZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobmFtZXNwYWNlID1fLCBzY2F0dGVyKSA6IG5hbWVzcGFjZX1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBvYmplY3RDbGFzc1xuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI29iamVjdENsYXNzfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtzY2F0dGVyIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvYmplY3RDbGFzcyA9ICd0aWNrLWdyb3VwJ1xuICAgKi9cbiAgc2NhdHRlci5vYmplY3RDbGFzcyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob2JqZWN0Q2xhc3MgPV8sIHNjYXR0ZXIpIDogb2JqZWN0Q2xhc3N9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdHJhbnNpdGlvbkR1cmF0aW9uXG4gICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjdHJhbnNpdGlvbkR1cmF0aW9ufSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtzY2F0dGVyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0cmFuc2l0aW9uRHVyYXRpb24gPSAxMDAwXG4gICAqL1xuICBzY2F0dGVyLnRyYW5zaXRpb25EdXJhdGlvbiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodHJhbnNpdGlvbkR1cmF0aW9uID1fLCBzY2F0dGVyKSA6IHRyYW5zaXRpb25EdXJhdGlvbn1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBlYXNlRnVuY1xuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI2Vhc2VGdW5jfSlcbiAgICogQHBhcmFtIHtkMy5lYXNlfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IGQzLmVhc2V9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGVhc2VGdW5jID0gZDMuZWFzZUV4cFxuICAgKi9cbiAgc2NhdHRlci5lYXNlRnVuYyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZWFzZUZ1bmMgPV8sIHNjYXR0ZXIpIDogZWFzZUZ1bmN9XG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBwb2ludEtleXNcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciNwb2ludEtleXN9KVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IHN0cmluZ1tdfVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBwb2ludEtleXMgPSB1bmRlZmluZWRcbiAgICovXG4gIHNjYXR0ZXIucG9pbnRLZXlzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwb2ludEtleXMgPV8sIHNjYXR0ZXIpIDogcG9pbnRLZXlzfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHZhbHVlc1hcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciN2YWx1ZXNYfSlcbiAgICogQHBhcmFtIHtudW1iZXJbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBudW1iZXJbXX1cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdmFsdWVzWCA9IHVuZGVmaW5lZFxuICAgKi9cbiAgc2NhdHRlci52YWx1ZXNYID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2YWx1ZXNYID1fLCBzY2F0dGVyKSA6IHZhbHVlc1h9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdmFsdWVzWVxuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI3ZhbHVlc1l9KVxuICAgKiBAcGFyYW0ge251bWJlcltdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IG51bWJlcltdfVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB2YWx1ZXNZID0gdW5kZWZpbmVkXG4gICAqL1xuICBzY2F0dGVyLnZhbHVlc1kgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZhbHVlc1kgPV8sIHNjYXR0ZXIpIDogdmFsdWVzWX1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB2YWx1ZXNSXG4gICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjdmFsdWVzUn0pXG4gICAqIEBwYXJhbSB7bnVtYmVyW119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtzY2F0dGVyIHwgbnVtYmVyW119XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHZhbHVlc1IgPSB1bmRlZmluZWRcbiAgICovXG4gIHNjYXR0ZXIudmFsdWVzUiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmFsdWVzUiA9Xywgc2NhdHRlcikgOiB2YWx1ZXNSfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRvb2x0aXBcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciN0b29sdGlwfSlcbiAgICogQHBhcmFtIHt0b29sdGlwfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IHRvb2x0aXB9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHRvb2x0aXAgPSB0b29sdGlwKClcbiAgICovXG5cbiAgc2NhdHRlci50b29sdGlwID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0b29sdGlwID1fLCBzY2F0dGVyKSA6IHRvb2x0aXB9XG5cblxuICBmdW5jdGlvbiBzY2F0dGVyKCkge1xuICAgIC8vIGJhY2tncm91bmQgY2xpcGluZyByZWN0YW5nbGVcbiAgICB2YXIgYmdjcFJlY3QgPSB7eDowLCB5OjAsIHdpZHRoOiBzcGFjZVgsIGhlaWdodDpzcGFjZVl9XG4gICAgdmFyIGNvbnRhaW5lciA9IHNldHVwQ29udGFpbmVyKCBzZWxlY3Rpb24sIG5hbWVzcGFjZSwgYmdjcFJlY3QsIGJhY2tncm91bmRGaWxsICk7XG5cblxuICAgIHBvaW50S2V5cyA9IGQzLmtleXMoZGF0YSlcbiAgICB2YWx1ZXNYID0gcG9pbnRLZXlzLm1hcCh2YWx1ZUV4dHJhY3RvclgpXG4gICAgdmFsdWVzWSA9IHBvaW50S2V5cy5tYXAodmFsdWVFeHRyYWN0b3JZKVxuICAgIHZhbHVlc1IgPSBwb2ludEtleXMubWFwKHZhbHVlRXh0cmFjdG9yUilcblxuICAgIHZhciBudW1iZXJPZk9iamVjdHMgPSBwb2ludEtleXMubGVuZ3RoXG4gICAgdmFyIGV4dGVudFggPSBbTWF0aC5taW4oLi4udmFsdWVzWCkgLSBkb21haW5QYWRkaW5nWCwgTWF0aC5tYXgoLi4udmFsdWVzWCkgKyBkb21haW5QYWRkaW5nWF1cbiAgICB2YXIgZXh0ZW50WSA9IFtNYXRoLm1pbiguLi52YWx1ZXNZKSAtIGRvbWFpblBhZGRpbmdZLCBNYXRoLm1heCguLi52YWx1ZXNZKSArIGRvbWFpblBhZGRpbmdZXVxuICAgIHZhciBleHRlbnRSID0gW01hdGgubWluKC4uLnZhbHVlc1IpIC0gZG9tYWluUGFkZGluZ1IsIE1hdGgubWF4KC4uLnZhbHVlc1IpICsgZG9tYWluUGFkZGluZ1JdXG5cbiAgICBzY2FsZVguZG9tYWluKGV4dGVudFgpLnJhbmdlKFswLCBzcGFjZVhdKVxuICAgIHNjYWxlWS5kb21haW4oZXh0ZW50WSkucmFuZ2UoW3NwYWNlWSwgMF0pXG4gICAgc2NhbGVSLmRvbWFpbihleHRlbnRSKS5yYW5nZShbbWluUmFkaXVzLCBtYXhSYWRpdXNdKVxuXG4gICAgdmFyIHBvaW50cyA9IGNvbnRhaW5lci5zZWxlY3RBbGwoJy4nK29iamVjdENsYXNzKVxuICAgIHBvaW50cyA9IHBvaW50cy5kYXRhKHBvaW50S2V5cylcbiAgICB2YXIgcEVudGVyID0gcG9pbnRzLmVudGVyKCkuYXBwZW5kKCdjaXJjbGUnKVxuICAgIC5hdHRyKCdjbGFzcycsIG9iamVjdENsYXNzKVxuICAgIC5hdHRyKCdjeCcsIDApLmF0dHIoJ2N5Jywgc3BhY2VZKS5hdHRyKCdyJywgMClcblxuICAgIHZhciBwRXhpdCA9IHBvaW50cy5leGl0KClcblxuICAgIHBvaW50cyA9IHBvaW50cy5tZXJnZShwRW50ZXIpXG5cbiAgICBwb2ludHMuZWFjaChmdW5jdGlvbihrZXksIGkpe1xuICAgICAgdmFyIHQgPSBkMy5zZWxlY3QodGhpcyksXG4gICAgICBjdXJyZW50RGF0YSA9IGRhdGFba2V5XSxcbiAgICAgIHggPSB2YWx1ZXNYW2ldLFxuICAgICAgeSA9IHZhbHVlc1lbaV0sXG4gICAgICByID0gdmFsdWVzUltpXSxcbiAgICAgIGZpbGxDb2xvciA9IGNvbG9yRnVuY3Rpb24oa2V5LCBjdXJyZW50RGF0YSwgaSwgJ2ZpbGwnKSxcbiAgICAgIHN0cm9rZUNvbG9yID0gY29sb3JGdW5jdGlvbihrZXksIGN1cnJlbnREYXRhLCBpLCAnc3Ryb2tlJylcblxuICAgICAgdC50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlKGVhc2VGdW5jKVxuICAgICAgLmF0dHIoJ2N4Jywgc2NhbGVYKHgpKVxuICAgICAgLmF0dHIoJ2N5Jywgc2NhbGVZKHkpKVxuICAgICAgLmF0dHIoJ3InLCBzY2FsZVIocikpXG4gICAgICAuYXR0cignZmlsbCcsIGZpbGxDb2xvcilcbiAgICAgIC5hdHRyKCdzdHJva2UnLCBzdHJva2VDb2xvcilcbiAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCBwb2ludFN0cm9rZVdpZHRoKVxuXG5cblxuICAgICAgdC5vbignbW91c2VvdmVyJywgZnVuY3Rpb24oZCwgaSl7XG4gICAgICAgIHBvaW50cy5zdHlsZSgnb3BhY2l0eScsIDAuMilcbiAgICAgICAgdC5zdHlsZSgnb3BhY2l0eScsIDEpXG4gICAgICAgIHQudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbi8yKS5lYXNlKGVhc2VGdW5jKVxuICAgICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgcG9pbnRTdHJva2VXaWR0aCoyKVxuICAgICAgICAuYXR0cigncicsIHNjYWxlUihyKSAqIDEuNSlcblxuICAgICAgfSlcbiAgICAgIHQubm9kZSgpLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgZnVuY3Rpb24oKXtcbiAgICAgICAgY29udGFpbmVyLnNlbGVjdEFsbCgnLicrb2JqZWN0Q2xhc3MpLnN0eWxlKCdvcGFjaXR5JywgMSlcbiAgICAgICAgdC50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uLzIpLmVhc2UoZWFzZUZ1bmMpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCBwb2ludFN0cm9rZVdpZHRoKVxuICAgICAgICAuYXR0cigncicsIHNjYWxlUihyKSlcblxuICAgICAgfSlcblxuICAgIH0pXG5cblxuXG4gICAgcEV4aXQudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuZWFzZShlYXNlRnVuYylcbiAgICAuYXR0cignY3gnLCAwKS5hdHRyKCdjeScsIHNwYWNlWSkuYXR0cigncicsIDApXG4gICAgLnJlbW92ZSgpXG5cbiAgICB0b29sdGlwLnNlbGVjdGlvbihwb2ludHMpXG4gICAgLmRhdGEoZGF0YSlcblxuICAgIHRvb2x0aXAoKVxuICB9XG5cblxuICByZXR1cm4gc2NhdHRlclxufVxuIiwiaW1wb3J0IHtoeXBlbmF0ZSwgc2FmZVNlbGVjdCwgZ2V0VHJhbnNsYXRpb259IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQge2xvZywgd2FybiwgZXJyb3IsIGluZm99IGZyb20gJy4vdXRpbHMnO1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUExPVFpPT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqXG4gKiBDcmVhdGVzIGFuIHBsb3Rab29tIGluc3RhbmNlLCB3aGljaCBjYW4gaGFuZGxlIGRyYWcgYW5kIHNjcm9sbCBldmVudHNcbiAqIEBjb25zdHJ1Y3RvciBwbG90Wm9vbVxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2hhcnQgYSBmdW5jdGlvbiBpbnN0YW5jZSBvZiBvbmUgb2YgdGhlIGQzc20gcGxvdHMgKGUuZy4gYmFyLCBib3h3aGlza2VyLCBidWJibGVIZWF0bWFwLCB2aW9saW4sIGV0YylcbiAqIEBwYXJhbSB7YXhpc30gIHhBeGlzIHRoZSBheGlzIGluc3RhbmNlIHJlc3BvbnNpYmxlIGZvciB0aGUgeCBheGlzXG4gKiBAcGFyYW0ge2F4aXN9IHlBeGlzIHRoZSBheGlzIGluc3RhbmNlIHJlc3BvbnNpYmxlIGZvciB0aGUgeSBheGlzXG4gKiBAbmFtZXNwYWNlIHBsb3Rab29tXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259IHpvb21cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBsb3Rab29tKCBjaGFydCwgeEF4aXMsIHlBeGlzICkge1xuICB2YXJcbiAgLyoqXG4gICogVGhlIGV2ZW50IG9uIHdoaWNoIHRvIGZpcmVcbiAgKiAoc2VlIHtAbGluayBwbG90Wm9vbSNldmVudFR5cGV9KVxuICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFR5cGUgd2hpY2ggZXZlbnQgaXQgc2hvdWxkIGhhbmRsZS4gQ3VycmVudGx5IHN1cHBvcnRzIHNjcm9sbCBhbmQgd2hlZWxcbiAgKiBAbWVtYmVyb2YgcGxvdFpvb20jXG4gICogQHByb3BlcnR5XG4gICovXG4gIGV2ZW50VHlwZSxcbiAgLyoqXG4gICogQSBzY2FsaW5nIGZhY3RvciBmb3IgdGhlIHdoZWVsIFwic3BlZWRcIlxuICAqIChzZWUge0BsaW5rIHBsb3Rab29tI3doZWVsU3BlZWR9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbd2hlZWxTcGVlZD0yMF0gc2NhbGVzIHRoZSB3aGVlbCB0cmFuc2xhdGlvbiBieSB3aGVlbFNwZWVkXG4gICogQG1lbWJlcm9mIHBsb3Rab29tI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB3aGVlbFNwZWVkID0gMjAsXG4gIC8qKlxuICAqIFRoZSBvcmllbnRhdGlvbiBpbiB3aGljaCB0byBhbGxvdyBzY3JvbGxpbmc6ICdob3Jpem9udGFsJywgJ3ZlcnRpY2FsJywgb3IgJzJEJ1xuICAqIChzZWUge0BsaW5rIHBsb3Rab29tI29yaWVudH0pXG4gICogQHBhcmFtIHtzdHJpbmd9IFtvcmllbnQ9Y2hhcnQub3JpZW50KCkgfHwgJ2hvcml6b250YWwnXVxuICAqIEBtZW1iZXJvZiBwbG90Wm9vbSNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb3JpZW50ID0gKGNoYXJ0Lm9yaWVudCA9PSB1bmRlZmluZWQpID8gJ2hvcml6b250YWwnIDogY2hhcnQub3JpZW50KCksXG4gIC8qKlxuICAqIFRoZSBtYXggZGlzdGFuY2UgYWxsb3dlZCB0byBzY3JvbGwgaW4gdGhlIHggZGlyZWN0aW9uXG4gICogKHNlZSB7QGxpbmsgcGxvdFpvb20jeExvY2t9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbeExvY2s9Y2hhcnQuc3BhY2VYKCldIGlkZWFsbHkgY2hhcnQub3ZlcmZsb3dRKCkgPT0gdHJ1ZSBhbmQgdGhpcyB2YWx1ZSBpcyB0aGVcbiAgKiBib3VuZGluZyByZWN0IGFjcm9zcyBhbGwgZWxlbWVudHMgaW4gdGhlIGNoYXJ0ICBtaW51cyB0aGUgc3BhY2UgaW4gd2hpY2ggdG8gc2hvdy5cbiAgKiBAbWVtYmVyb2YgcGxvdFpvb20jXG4gICogQHByb3BlcnR5XG4gICovXG4gIHhMb2NrPWNoYXJ0LnNwYWNlWCgpLFxuICAvKipcbiAgKiBUaGUgbWF4IGRpc3RhbmNlIGFsbG93ZWQgdG8gc2Nyb2xsIGluIHRoZSB5IGRpcmVjdGlvblxuICAqIChzZWUge0BsaW5rIHBsb3Rab29tI3lMb2NrfSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW3lMb2NrPWNoYXJ0LnNwYWNlWSgpXSBpZGVhbGx5IGNoYXJ0Lm92ZXJmbG93USgpID09IHRydWUgYW5kIHRoaXMgdmFsdWUgaXMgdGhlXG4gICogYm91bmRpbmcgcmVjdCBhY3Jvc3MgYWxsIGVsZW1lbnRzIGluIHRoZSBjaGFydCAgbWludXMgdGhlIHNwYWNlIGluIHdoaWNoIHRvIHNob3cuXG4gICogQG1lbWJlcm9mIHBsb3Rab29tI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB5TG9jaz1jaGFydC5zcGFjZVkoKSxcblxuICBjaGFydFNlbCA9IGNoYXJ0LnNlbGVjdGlvbigpLFxuICB4QXhpc1NlbCA9IHhBeGlzLnNlbGVjdGlvbigpLFxuICB5QXhpc1NlbCA9IHlBeGlzLnNlbGVjdGlvbigpXG5cblxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBldmVudCB0eXBlIGluIHdoaWNoIHRvIHJlc3BvbmRcbiAgICogKHNlZSB7QGxpbmsgcGxvdFpvb20jZXZlbnRUeXBlfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdIHNob3VsZCBiZSAnZHJhZycgb3IgJ3doZWVsJ1xuICAgKiBAcmV0dXJucyB7em9vbSB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIHBsb3Rab29tXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHBsb3Rab29tPXVuZGVmaW5lZFxuICAgKi9cbiAgem9vbS5ldmVudFR5cGUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGV2ZW50VHlwZSA9IF8sIHpvb20pIDogZXZlbnRUeXBlOyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSB3aGVlbCBzcGVlZCBpbiB3aGljaCB0byBzY2FsZSB0aGUgd2hlZWwgc2Nyb2xsIHRyYW5zZm9ybVxuICAgKiAoc2VlIHtAbGluayBwbG90Wm9vbSN3aGVlbFNwZWVkfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt6b29tIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgcGxvdFpvb21cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgd2hlZWxTcGVlZD0yMFxuICAgKi9cbiAgem9vbS53aGVlbFNwZWVkID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh3aGVlbFNwZWVkID0gXywgem9vbSkgOiB3aGVlbFNwZWVkOyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBvcmllbnRhdGlvbiBpbiB3aGljaCBpdGVtcyBhcmUgbWFuaXB1bGF0ZWRcbiAgICogKHNlZSB7QGxpbmsgcGxvdFpvb20jb3JpZW50fSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdIHNob3VsZCBiZSBob3Jpem9udGFsLCB2ZXJ0aWNhbCwgb3IgMkRcbiAgICogQHJldHVybnMge3pvb20gfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBwbG90Wm9vbVxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvcmllbnQ9Y2hhcnQub3JpZW50KCkgfHwgJ2hvcml6b250YWwnXG4gICAqL1xuICB6b29tLm9yaWVudCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob3JpZW50ID0gXywgem9vbSkgOiBvcmllbnQ7IH07XG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgbWF4IGRpc3RhbmNlIGluIHdoaWNoIHRvIHNjcm9sbCBYXG4gICAqIChzZWUge0BsaW5rIHBsb3Rab29tI3hMb2NrfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdIHNob3VsZCBiZSBhIHBvc2l0aXZlIHZhbHVlXG4gICAqIEByZXR1cm5zIHt6b29tIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgcGxvdFpvb21cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgeExvY2s9Y2hhcnQuc3BhY2VYKClcbiAgICovXG4gIHpvb20ueExvY2sgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHhMb2NrID0gXywgem9vbSkgOiB4TG9jazsgfTtcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgbWF4IGRpc3RhbmNlIGluIHdoaWNoIHRvIHNjcm9sbCBZXG4gICAqIChzZWUge0BsaW5rIHBsb3Rab29tI3lMb2NrfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdICBzaG91bGQgYmUgYSBwb3NpdGl2ZSB2YWx1ZVxuICAgKiBAcmV0dXJucyB7em9vbSB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHBsb3Rab29tXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHlMb2NrPWNoYXJ0LnNwYWNlWSgpXG4gICAqL1xuICB6b29tLnlMb2NrID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5TG9jayA9IF8sIHpvb20pIDogeUxvY2s7IH07XG5cblxuICBmdW5jdGlvbiBzZXRMb2NrcygpIHtcbiAgICB2YXIgY2hhcnRPYmpTZWwgPSBjaGFydFNlbC5zZWxlY3QoJy4nK2h5cGVuYXRlKGNoYXJ0Lm5hbWVzcGFjZSgpLCdvYmplY3QtY29udGFpbmVyJykpXG4gICAgdmFyIGNoYXJ0T2JqVHJhbnMgPSBnZXRUcmFuc2xhdGlvbihjaGFydE9ialNlbC5hdHRyKCd0cmFuc2Zvcm0nKSlcbiAgICB2YXIgY29zID0gY2hhcnRPYmpTZWwuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgwLDApJylcbiAgICB4TG9jayA9IGNoYXJ0U2VsLm5vZGUoKS5nZXRCQm94KCkud2lkdGggLSBjaGFydC5zcGFjZVgoKSAqIC45XG4gICAgeUxvY2sgPSBjaGFydFNlbC5ub2RlKCkuZ2V0QkJveCgpLmhlaWdodCAtIGNoYXJ0LnNwYWNlWSgpICogLjlcbiAgICBjb3MuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnK2NoYXJ0T2JqVHJhbnNbMF0rJywnK2NoYXJ0T2JqVHJhbnNbMV0rJyknKVxuICAgIGxvZygncGxvdFpvb20nLCAnc2V0TG9ja3MnLCB7eExvY2s6eExvY2ssIHlMb2NrOnlMb2NrfSlcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHggYW5kIHkgbG9ja3MgKGhvdyBmYXIgb25lIGNhbiBzY3JvbGwpXG4gICAqIChzZWUge0BsaW5rIHBsb3Rab29tI3hMb2NrfSBhbmQge0BsaW5rIHBsb3Rab29tI3lMb2NrfSlcbiAgICogQGZ1bmN0aW9uIHBsb3Rab29tLnNldExvY2tzXG4gICAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJvZiBwbG90Wm9vbVxuICAgKiBAcHJvcGVydHlcbiAgICovXG4gIHpvb20uc2V0TG9ja3MgPSBzZXRMb2Nrc1xuXG4gIGZ1bmN0aW9uIHpvb20oKSB7XG4gICAgc2V0TG9ja3MoKVxuXG4gICAgdmFyIGhvcml6b250YWxRLCB2ZXJ0aWNhbFFcbiAgICBpZiAob3JpZW50ID09ICcyRCcpIHtob3Jpem9udGFsUSA9IHRydWU7IHZlcnRpY2FsUSA9IHRydWU7fVxuICAgIGlmIChvcmllbnQgPT0gJ2hvcml6b250YWwnKSB7aG9yaXpvbnRhbFEgPSB0cnVlOyB2ZXJ0aWNhbFEgPSBmYWxzZTt9XG4gICAgaWYgKG9yaWVudCA9PSAndmVydGljYWwnKSB7dmVydGljYWxRID0gdHJ1ZTsgaG9yaXpvbnRhbFEgPSBmYWxzZTt9XG5cbiAgICAvLyBjYXB0dXJlIHRyYW5zZm9ybSBldmVudFxuICAgIHZhciB0cmFuc2Zvcm0gPSBkMy5ldmVudC50cmFuc2Zvcm1cblxuICAgIHZhciBjaGFydEJveCA9IGNoYXJ0U2VsLm5vZGUoKS5nZXRCQm94KClcbiAgICB2YXIgeEF4aXNCb3ggPSB4QXhpc1NlbC5ub2RlKCkuZ2V0QkJveCgpXG4gICAgdmFyIHlBeGlzQm94ID0geEF4aXNTZWwubm9kZSgpLmdldEJCb3goKVxuXG4gICAgdmFyIGNoYXJ0V2lkdGggPSBjaGFydEJveC53aWR0aCAtIGNoYXJ0Qm94LnhcbiAgICB2YXIgY2hhcnRIZWlnaHQgPSBjaGFydEJveC5oZWlnaHQgLSBjaGFydEJveC55XG4gICAgdmFyIHhBeGlzV2lkdGggPSB4QXhpc0JveC53aWR0aC8vIC0geEF4aXNCb3gueFxuICAgIHZhciB4QXhpc0hlaWdodCA9IHhBeGlzQm94LmhlaWdodC8vIC0geEF4aXNCb3gueVxuICAgIHZhciB5QXhpc1dpZHRoID0geUF4aXNCb3gud2lkdGgvLyAtIHlBeGlzQm94LnhcbiAgICB2YXIgeUF4aXNIZWlnaHQgPSB5QXhpc0JveC5oZWlnaHQvLyAteUF4aXNCb3gueVxuXG4gICAgLy8gZW5hYmxlIHdoZWVsIGV2ZW50XG4gICAgaWYgKGV2ZW50VHlwZSA9PSBcIndoZWVsXCIpIHtcbiAgICAgIHZhciBlID0gZDMuZXZlbnRcbiAgICAgIC8vIHByZXZlbnQgcGFnZSBzY3JvbGxpbmdcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgLy8gZXZlbnQgZGVsdGEgaXMgdmVyeSB2ZXJ5IHNsb3csIHNvIHNwZWVkIGl0IHVwIHdpdGggd2hlZWwgc3BlZWRcbiAgICAgIHZhciB3ID0gZDMuZXZlbnQuZGVsdGFZICogd2hlZWxTcGVlZFxuICAgICAgdmFyIHNoaWZ0USA9IGQzLmV2ZW50LnNoaWZ0S2V5XG5cbiAgICAgIC8vIGQzIGhhcyBubyB3YXkgdG8gbWFrZSBjdXN0b20gdHJhbnNmb3JtLCBzbyBtYWtlIGFuIG9iamVjdCBhbmQgYWRkXG4gICAgICAvLyB0aGUgbmVjZXNzYXJ5IGZ1bmN0aW9ucyB0byBtYWtlIHdoZWVsIGV2ZW50IGNvbXBhdGlibGUgd2l0aCBkcmFnIGV2ZW50c1xuICAgICAgaWYgKG9yaWVudCA9PSAnMkQnKSB7XG4gICAgICAgIHRyYW5zZm9ybSA9IHNoaWZ0USA/IHtrOiAxLCB4OiB3LCB5OiAwfSA6IHtrOiAxLCB4OiAwLCB5OiB3fVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJhbnNmb3JtID0gaG9yaXpvbnRhbFEgPyB7azogMSwgeDogdywgeTogMH0gOiB7azogMSwgeDogMCwgeTogd31cbiAgICAgIH1cbiAgICAgIHRyYW5zZm9ybS5hcHBseVggPSBmdW5jdGlvbih4KSB7IHJldHVybiB4ICogdGhpcy5rICsgdGhpcy54OyB9XG4gICAgICB0cmFuc2Zvcm0uYXBwbHlZID0gIGZ1bmN0aW9uKHkpIHsgcmV0dXJuIHkgKiB0aGlzLmsgKyB0aGlzLnk7IH1cbiAgICB9XG5cblxuXG4gICAgdmFyIGNoYXJ0T2JqU2VsID0gY2hhcnRTZWwuc2VsZWN0KCcuJytoeXBlbmF0ZShjaGFydC5uYW1lc3BhY2UoKSwnb2JqZWN0LWNvbnRhaW5lcicpKVxuICAgIHZhciB4QXhpc09ialNlbCA9IHhBeGlzU2VsLnNlbGVjdCgnLicraHlwZW5hdGUoeEF4aXMubmFtZXNwYWNlKCksJ29iamVjdC1jb250YWluZXInKSlcbiAgICB2YXIgeUF4aXNPYmpTZWwgPSB5QXhpc1NlbC5zZWxlY3QoJy4nK2h5cGVuYXRlKHlBeGlzLm5hbWVzcGFjZSgpLCdvYmplY3QtY29udGFpbmVyJykpXG5cbiAgICAvLyB4TG9jayA9IGNoYXJ0U2VsLm5vZGUoKS5nZXRCQm94KCkud2lkdGggLSBjaGFydC5zcGFjZVgoKSAtIGNoYXJ0U2VsLm5vZGUoKS5nZXRCQm94KCkueFxuICAgIC8vIHlMb2NrID0gY2hhcnRTZWwubm9kZSgpLmdldEJCb3goKS5oZWlnaHQgLSBjaGFydC5zcGFjZVkoKVxuICAgIC8vIGNvbnNvbGUudGFibGUoeyd4TG9jayc6eExvY2ssIFwieUxvY2tcIjp5TG9ja30pXG4gICAgLy8gYmhtLnNlbGVjdGlvbigpLm5vZGUoKS5nZXRCQm94KCkud2lkdGggLSBiaG0uc3BhY2VYKClcblxuXG4gICAgdmFyIGNoYXJ0T2JqVHJhbnMgPSBnZXRUcmFuc2xhdGlvbihjaGFydE9ialNlbC5hdHRyKCd0cmFuc2Zvcm0nKSlcbiAgICB2YXIgeEF4aXNPYmpUcmFucyA9IGdldFRyYW5zbGF0aW9uKHhBeGlzT2JqU2VsLmF0dHIoJ3RyYW5zZm9ybScpKVxuICAgIHZhciB5QXhpc09ialRyYW5zID0gZ2V0VHJhbnNsYXRpb24oeUF4aXNPYmpTZWwuYXR0cigndHJhbnNmb3JtJykpXG5cblxuICAgIHZhciB4ID0gaG9yaXpvbnRhbFEgPyB0cmFuc2Zvcm0uYXBwbHlYKGNoYXJ0T2JqVHJhbnNbMF0pIDogMFxuICAgIGlmIChob3Jpem9udGFsUSkge3ggPSB4IDwgLXhMb2NrID8gKHRyYW5zZm9ybS54ID0gMCwgLXhMb2NrKSA6ICh0cmFuc2Zvcm0ueCA9IDAsIE1hdGgubWluKHgsIDApKSB9XG5cbiAgICB2YXIgeSA9IHZlcnRpY2FsUSA/IHRyYW5zZm9ybS5hcHBseVkoY2hhcnRPYmpUcmFuc1sxXSkgOiAwXG4gICAgaWYgKHZlcnRpY2FsUSkge3kgPSB5IDwgLXlMb2NrID8gKHRyYW5zZm9ybS55ID0gMCwgLXlMb2NrKTogKHRyYW5zZm9ybS55ID0gMCwgTWF0aC5taW4oeSwgMCkpfVxuXG4gICAgY2hhcnRPYmpTZWwuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnK3grJywnK3krJyknKVxuICAgIGlmIChob3Jpem9udGFsUSkgeyB4QXhpc09ialNlbC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcreCsnLCcrMCsnKScpIH1cbiAgICBpZiAodmVydGljYWxRKSB7IHlBeGlzT2JqU2VsLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyswKycsJyt5KycpJykgfVxuXG4gIH1cblxuICB6b29tLnJlc2V0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGhvcml6b250YWxRLCB2ZXJ0aWNhbFFcbiAgICBpZiAob3JpZW50ID09ICcyRCcpIHtob3Jpem9udGFsUSA9IHRydWU7IHZlcnRpY2FsUSA9IHRydWU7fVxuICAgIGlmIChvcmllbnQgPT0gJ2hvcml6b250YWwnKSB7aG9yaXpvbnRhbFEgPSB0cnVlOyB2ZXJ0aWNhbFEgPSBmYWxzZTt9XG4gICAgaWYgKG9yaWVudCA9PSAndmVydGljYWwnKSB7dmVydGljYWxRID0gdHJ1ZTsgaG9yaXpvbnRhbFEgPSBmYWxzZTt9XG5cbiAgICB2YXIgY2hhcnRPYmpTZWwgPSBjaGFydFNlbC5zZWxlY3QoJy4nK2h5cGVuYXRlKGNoYXJ0Lm5hbWVzcGFjZSgpLCdvYmplY3QtY29udGFpbmVyJykpXG4gICAgdmFyIHhBeGlzT2JqU2VsID0geEF4aXNTZWwuc2VsZWN0KCcuJytoeXBlbmF0ZSh4QXhpcy5uYW1lc3BhY2UoKSwnb2JqZWN0LWNvbnRhaW5lcicpKVxuICAgIHZhciB5QXhpc09ialNlbCA9IHlBeGlzU2VsLnNlbGVjdCgnLicraHlwZW5hdGUoeUF4aXMubmFtZXNwYWNlKCksJ29iamVjdC1jb250YWluZXInKSlcbiAgICBjaGFydE9ialNlbC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcrMCsnLCcrMCsnKScpXG4gICAgeEF4aXNPYmpTZWwuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnKzArJywnKzArJyknKVxuICAgIHlBeGlzT2JqU2VsLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyswKycsJyswKycpJylcbiAgfVxuXG4gIHJldHVybiB6b29tXG59XG4iLCJpbXBvcnQge2h5cGVuYXRlLCBzYWZlU2VsZWN0LCBtb2RpZnlIZXhpZGVjaW1hbENvbG9yTHVtaW5hbmNlLCBleHRyYWN0VmlvbGluVmFsdWVzLCBxdWFydGlsZXN9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQge3NldHVwQ29udGFpbmVyLCBjYWxjdWxhdGVXaWR0aE9mT2JqZWN0LCBjYWxjdWxhdGVXaWR0aE9mU3BhY2VyfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7dW5pcXVlLCBoYXNRLCBmbGF0dGVuLCB3aGljaEJpbn0gZnJvbSAnLi9hcnJheS1mdW5jdGlvbnMnO1xuaW1wb3J0IHtncm91cGluZ1NwYWNlcn0gZnJvbSAnLi9ncm91cGluZy1zcGFjZXInO1xuaW1wb3J0IHtjb2xvckZ1bmN0aW9uIGFzIENGfSBmcm9tICcuL2NvbG9yLWZ1bmN0aW9uJztcbmltcG9ydCB7dG9vbHRpcCBhcyBUVGlwfSBmcm9tICcuL3Rvb2x0aXAnO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZJT0xJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vKipcbiAqIENyZWF0ZXMgYSB2aW9saW5cbiAqXG4gKiB7QGxpbmsgaHR0cHM6Ly9zdW1uZXVyb24uZ2l0bGFiLmlvL2Qzc20vZGVtb3MvYmFzaWMtdmlvbGlucy9pbmRleC5odG1sIERlbW99XG4gKiBAY29uc3RydWN0b3IgdmlvbGluXG4gKiBAcGFyYW0ge2QzLnNlbGVjdGlvbn0gc2VsZWN0aW9uXG4gKiBAbmFtZXNwYWNlIHZpb2xpblxuICogQHJldHVybnMge2Z1bmN0aW9ufSB2aW9saW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZpb2xpbiggc2VsZWN0aW9uICkge1xuICB2YXJcbiAgLyoqXG4gICogRGF0YSB0byBwbG90LiBBc3N1bWVkIHRvIGJlIGEgb2JqZWN0LCB3aGVyZSBlYWNoIGtleSBjb3JyZXNwb25kcyB0byBhIHZpb2xpblxuICAqIChzZWUge0BsaW5rIHZpb2xpbiNkYXRhfSlcbiAgKiBAcGFyYW0ge09iamVjdH0gW2RhdGE9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiB2aW9saW4jXG4gICogQHByb3BlcnR5XG4gICovXG4gIGRhdGEsXG4gIC8qKlxuICAqIFdoaWNoIGRpcmVjdGlvbiB0byByZW5kZXIgdGhlIGJhcnMgaW5cbiAgKiAoc2VlIHtAbGluayB2aW9saW4jb3JpZW50fSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW29yaWVudD0naG9yaXpvbnRhbCddXG4gICogQG1lbWJlcm9mIHZpb2xpbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb3JpZW50PSdob3Jpem9udGFsJyxcbiAgLyoqXG4gICogQW1vdW50IG9mIGhvcml6b250YWwgc3BhY2UgKGluIHBpeGVscykgYXZhaWJsZSB0byByZW5kZXIgdGhlIHZpb2xpbiBpblxuICAqIChzZWUge0BsaW5rIHZpb2xpbiNzcGFjZVh9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbc3BhY2VYPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgdmlvbGluI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzcGFjZVgsXG4gIC8qKlxuICAqIEFtb3VudCBvZiB2ZXJ0aWNhbCBzcGFjZSAoaW4gcGl4ZWxzKSBhdmFpYmxlIHRvIHJlbmRlciB0aGUgdmlvbGluIGluXG4gICogKHNlZSB7QGxpbmsgdmlvbGluLnNwYWNlWX0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZVk9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiB2aW9saW4jXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNwYWNlWSxcbiAgLyoqXG4gICogV2hldGhlciBvciBub3QgdG8gYWxsb3cgdmlvbGluIHRvIHJlbmRlciBlbGVtZW50cyBwYXNzIHRoZSBtYWluIHNwYXRpYWwgZGltZW5zaW9uXG4gICogZ2l2ZW4gdGhlIG9yaWVudGF0aW9uIChzZWUge0BsaW5rIHZpb2xpbiNvcmllbnR9KSwgd2hlcmUge0BsaW5rIHZpb2xpbiNvcmllbnR9PVwiaG9yaXpvbnRhbFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayB2aW9saW4jc3BhY2VYfSBhbmQgd2hlcmUge0BsaW5rIHZpb2xpbiNvcmllbnR9PVwidmVydGljYWxcIlxuICAqIHRoZSBtYWluIGRpbWVuc2lvbiBpcyB7QGxpbmsgdmlvbGluI3NwYWNlWX1cbiAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvdmVyZmxvd1E9ZmFsc2VdXG4gICogQG1lbWJlcm9mIHZpb2xpbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb3ZlcmZsb3dRID0gdHJ1ZSxcbiAgLyoqXG4gICogV2hldGhlciBvciBub3QgdG8gZGlzcGxheSBwb2ludHMgaW5zaWRlIHRoZSBwb2ludHNcbiAgKiBAcGFyYW0ge2Jvb2xlYW59IFtwb2ludHNRPWZhbHNlXVxuICAqIEBtZW1iZXJvZiB2aW9saW4jXG4gICogQHByb3BlcnR5XG4gICovXG4gIHBvaW50c1EgPSB0cnVlLFxuICAvKipcbiAgKiBBbiBhcnJheSAtIHB1dGF0aXZlbHkgb2Ygb3RoZXIgYXJyYXlzIC0gZGVwaWN0aW5nIGhvdyBiYXJzIHNob3VsZCBiZSBhcnJhbmdlZFxuICAqIEBwYXJhbSB7QXJyYXlbXX0gW2dyb3VwaW5nPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgdmlvbGluI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBncm91cGluZyxcbiAgLyoqXG4gICogSG93IHRvIGdldCB0aGUgdmFsdWUgb2YgdGhlIHZpb2xpblxuICAqIEBwYXJhbSB7ZnVuY3Rpb259IFt2YWx1ZUV4dHJhY3Rvcj1mdW5jdGlvbihrZXksIGluZGV4KSB7IHJldHVybiBkYXRhW2tleV0gfV1cbiAgKiBAbWVtYmVyb2YgdmlvbGluI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB2YWx1ZUV4dHJhY3RvciA9IGZ1bmN0aW9uKGtleSwgaW5kZXgpIHtyZXR1cm4gZGF0YVtrZXldIH0sXG4gIC8qKlxuICAqIEhvdyB0byBzb3J0IHRoZSBiYXJzIC0gaWYge0BsaW5rIHZpb2xpbiNncm91cGluZ30gaXMgbm90IHByb3ZpZGVkLlxuICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtzb3J0aW5nRnVuY3Rpb249ZnVuY3Rpb24oa2V5QSwga2V5Qikge3JldHVybiBkMy5kZXNjZW5kaW5nKGRhdGFba2V5QV0sIGRhdGFba2V5Ql0pfV1cbiAgKiBAbWVtYmVyb2YgdmlvbGluI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzb3J0aW5nRnVuY3Rpb24gPSBmdW5jdGlvbihrZXlBLCBrZXlCKSB7cmV0dXJuIGQzLmRlc2NlbmRpbmcoZGF0YVtrZXlBXSwgZGF0YVtrZXlCXSl9LFxuXG4gIC8qKlxuICAqIFRoZSBzY2FsZSBmb3Igd2hpY2ggdmlvbGluIHZhbHVlcyBzaG91bGQgYmUgdHJhbnNmb3JtZWQgYnlcbiAgKiBAcGFyYW0ge2QzLnNjYWxlfSBbc2NhbGU9ZDMuc2NhbGVMaW5lYXJdXG4gICogQG1lbWJlcm9mIHZpb2xpbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc2NhbGUgPSBkMy5zY2FsZUxpbmVhcigpLFxuICAvKipcbiAgKiBUaGUgcGFkZGluZyBmb3IgdGhlIGRvbWFpbiBvZiB0aGUgc2NhbGUgKHNlZSB7QGxpbmsgdmlvbGluI3NjYWxlfSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW2RvbWFpblBhZGRpbmc9MC41XVxuICAqIEBtZW1iZXJvZiB2aW9saW4jXG4gICogQHByb3BlcnR5XG4gICovXG4gIGRvbWFpblBhZGRpbmcgPSAwLjUsXG4gIC8qKlxuICAqIERlZmF1bHQgc3BhY2UgZm9yIHRoZSBzcGFjZXIgKHBlcmNlbnRhZ2UpIG9mIG1haW4gZGltZW5zaW9uIGdpdmVuIHRoZSBvcmllbnRhdGlvblxuICAqIChzZWUge0BsaW5rIHZpb2xpbiNvcmllbnR9KSwgd2hlcmUge0BsaW5rIHZpb2xpbiNvcmllbnR9PVwiaG9yaXpvbnRhbFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayB2aW9saW4jc3BhY2VYfSBhbmQgd2hlcmUge0BsaW5rIHZpb2xpbiNvcmllbnR9PVwidmVydGljYWxcIlxuICAqIHRoZSBtYWluIGRpbWVuc2lvbiBpcyB7QGxpbmsgdmlvbGluI3NwYWNlWX0gYmV0d2VlbiBiYXJzXG4gICogQHBhcmFtIHtudW1iZXJ9IFtvYmplY3RTcGFjZXI9MC4wNV1cbiAgKiBAbWVtYmVyb2YgdmlvbGluI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBvYmplY3RTcGFjZXIgPSAwLjA1LFxuICAvKipcbiAgKiBUaGUgbWluaW11bSBzaXplIHRoYXQgYW4gb2JqZWN0IGNhbiBiZVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbbWluT2JqZWN0U2l6ZT01MF1cbiAgKiBAbWVtYmVyb2YgdmlvbGluI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBtaW5PYmplY3RTaXplID0gNTAsXG4gIC8qKlxuICAqIFRoZSBtYXhpbXVtIHNpemUgdGhhdCBhbiBvYmplY3QgY2FuIGJlXG4gICogQHBhcmFtIHtudW1iZXJ9IFttYXhPYmplY3RTaXplPTEwMF1cbiAgKiBAbWVtYmVyb2YgdmlvbGluI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBtYXhPYmplY3RTaXplID0gMTAwLFxuXG4gIC8qKlxuICAqIFRoZSBzdHJva2Ugd2lkdGggb2YgdGhlIGJhcnNcbiAgKiBAcGFyYW0ge251bWJlcn0gW2JhclN0cm9rZVdpZHRoPTJdXG4gICogQG1lbWJlcm9mIHZpb2xpbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb2JqZWN0U3Ryb2tlV2lkdGggPSAyLFxuICAvKipcbiAgKiBJbnN0YW5jZSBvZiBDb2xvckZ1bmN0aW9uXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW2NvbG9yRnVuY3Rpb24gPSBjb2xvckZ1bmN0aW9uKCldXG4gICogQG1lbWJlcm9mIHZpb2xpbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgY29sb3JGdW5jdGlvbiA9IENGKCksXG4gIC8qKlxuICAqIEluc3RhbmNlIG9mIENvbG9yRnVuY3Rpb24gbW9kaWZpZWQgYnkgYSBzY2FsZSBmb3IgdGhlIHBvaW50c1xuICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtwb2ludENvbG9yRnVuYyA9IGNvbG9yRnVuY3Rpb24oKV1cbiAgKiBAbWVtYmVyb2YgdmlvbGluI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBwb2ludENvbG9yRnVuYyA9IGZ1bmN0aW9uIChkLCB0eXBlLCBiYXNlLCBtaW4sIG1heCkge1xuICAgIHZhciBtaW5NYXhIZXhTY2FsZSA9IGQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFttaW4sIG1heF0pLnJhbmdlKFstMC4yNSwgMC4wNV0pXG4gICAgdmFyIHNjYWxlZENvbG9yID0gbW9kaWZ5SGV4aWRlY2ltYWxDb2xvckx1bWluYW5jZShiYXNlLnJlcGxhY2UoJyMnLCAnJyksIG1pbk1heEhleFNjYWxlKGQpKVxuICAgIHZhciBtb2QgPSB0eXBlID09IFwic3Ryb2tlXCIgPyAwIDogMC4yNVxuICAgIHJldHVybiBtb2RpZnlIZXhpZGVjaW1hbENvbG9yTHVtaW5hbmNlKHNjYWxlZENvbG9yLnJlcGxhY2UoJyMnLCAnJyksIG1vZClcbiAgfSxcblxuICAvKipcbiAgKiBUaGUgcmFkaXVzIG9mIGEgcG9pbnRcbiAgKiBAcGFyYW0ge251bWJlcn0gW3BvaW50UmFkaXVzPTNdXG4gICogQG1lbWJlcm9mIHZpb2xpbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgcG9pbnRSYWRpdXMgPSAzLFxuICAvKipcbiAgKiBUaGUgc3Ryb2tlIHdpZHRoIG9mIHRoZSBvaW50c1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbcG9pbnRTdHJva2VXaWR0aD0yXVxuICAqIEBtZW1iZXJvZiB2aW9saW4jXG4gICogQHByb3BlcnR5XG4gICovXG4gIHBvaW50U3Ryb2tlV2lkdGggPSAyLFxuXG4gIC8qKlxuICAqIENvbG9yIG9mIHRoZSBiYWNrZ3JvdW5kXG4gICogQHBhcmFtIHtzdHJpbmd9IFtiYWNrZ3JvdW5kRmlsbD1cInRyYW5zcGFyZW50XCJdXG4gICogQG1lbWJlcm9mIHZpb2xpbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgYmFja2dyb3VuZEZpbGwgPSAndHJhbnNwYXJlbnQnLFxuICAvKipcbiAgKiBOYW1lc3BhY2UgZm9yIGFsbCBpdGVtcyBtYWRlIGJ5IHRoaXMgaW5zdGFuY2Ugb2YgdmlvbGluXG4gICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lc3BhY2U9XCJkM3NtLXZpb2xpblwiXVxuICAqIEBtZW1iZXJvZiB2aW9saW4jXG4gICogQHByb3BlcnR5XG4gICovXG4gIG5hbWVzcGFjZSA9ICdkM3NtLXZpb2xpbicsXG4gIC8qKlxuICAqIENsYXNzIG5hbWUgZm9yIHZpb2xpbiBjb250YWluZXIgKDxnPiBlbGVtZW50KVxuICAqIEBwYXJhbSB7c3RyaW5nfSBbb2JqZWN0Q2xhc3M9XCJ2aW9saW5cIl1cbiAgKiBAbWVtYmVyb2YgdmlvbGluI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBvYmplY3RDbGFzcyA9ICd2aW9saW4nLFxuICAvKipcbiAgKiBEdXJhdGlvbiBvZiBhbGwgdHJhbnNpdGlvbnMgb2YgdGhpcyBlbGVtZW50XG4gICogQHBhcmFtIHtudW1iZXJ9IFt0cmFuc2l0aW9uRHVyYXRpb249MTAwMF1cbiAgKiBAbWVtYmVyb2YgdmlvbGluI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB0cmFuc2l0aW9uRHVyYXRpb24gPSAxMDAwLFxuICAvKipcbiAgKiBFYXNpbmcgZnVuY3Rpb24gZm9yIHRyYW5zaXRpb25zXG4gICogQHBhcmFtIHtkMy5lYXNlfSBbZWFzZUZ1bmM9ZDMuZWFzZUV4cF1cbiAgKiBAbWVtYmVyb2YgdmlvbGluI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBlYXNlRnVuYyA9IGQzLmVhc2VFeHAsXG5cbiAgLyoqXG4gICogVGhlIGtleSBjb250YWluaW5nIHRoZSBxdWFydGlsZXNcbiAgKiBAcGFyYW0ge3N0cmluZ30gW3F1YXJ0aWxlc0tleT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIHZpb2xpbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgcXVhcnRpbGVzS2V5ID0gXCJxdWFydGlsZXNcIixcbiAgLyoqXG4gICogVGhlIGtleXMgY29ycmVzcG9uZGluZyB0byBlYWNoIHF1YXJ0aWxlXG4gICogQHBhcmFtIHtzdHJpbmdbXX0gW3F1YXJ0aWxlS2V5cz1bXCJRMFwiLCBcIlExXCIsIFwiUTJcIiwgXCJRM1wiLCBcIlE0XCJdXVxuICAqIEBtZW1iZXJvZiB2aW9saW4jXG4gICogQHByb3BlcnR5XG4gICovXG4gIHF1YXJ0aWxlS2V5cyA9IFtcIlEwXCIsIFwiUTFcIiwgXCJRMlwiLCBcIlEzXCIsIFwiUTRcIl0sXG5cbiAgLyoqXG4gICogVGhlIGtleXMgb2YgdGhlIGJhcnNcbiAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbdmlvbGluS2V5cz11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIHZpb2xpbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdmlvbGluS2V5cyxcbiAgLyoqXG4gICogVGhlIHZhbHVlcyBvZiB0aGUgYmFyc1xuICAqIEBwYXJhbSB7bnVtYmVyW119IFt2aW9saW5WYWx1ZXM9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiB2aW9saW4jXG4gICogQHByb3BlcnR5XG4gICovXG4gIHZpb2xpblZhbHVlcyxcbiAgLyoqXG4gICogVGhlIG9iamVjdFNpemUgKGFjdHVhbCB3aWR0aCkgdXNlZCBieSB0aGUgYmFyc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbb2JqZWN0U2l6ZT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIHZpb2xpbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb2JqZWN0U2l6ZSxcbiAgLyoqXG4gICogVGhlIHNwYWNlclNpemUgKGFjdHVhbCB3aWR0aCkgdXNlZCBieSB0aGUgc3BhY2VycyBiZXR3ZWVuIHRoZSBiYXJzXG4gICogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZXJTaXplPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgdmlvbGluI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzcGFjZXJTaXplLFxuXG4gIC8qKlxuICAqIEluc3RhbmNlIG9mIFRvb2x0aXBcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbdG9vbHRpcD10b29sdGlwKCldXG4gICogQG1lbWJlcm9mIHZpb2xpbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdG9vbHRpcCA9IFRUaXAoKS5rZXlzKFtxdWFydGlsZUtleXNbNF0sIHF1YXJ0aWxlS2V5c1szXSwgcXVhcnRpbGVLZXlzWzJdLCBxdWFydGlsZUtleXNbMV0sIHF1YXJ0aWxlS2V5c1swXV0pLFxuICBwb2ludHNUb29sdGlwID0gVFRpcCgpLFxuICBwb2ludEtleUV4dHJhY3RvciA9IGZ1bmN0aW9uKHZpb2xpbktleSwgdmlvbGluRGF0YSwgdmlvbGluVmFsdWVzKSB7cmV0dXJuIGQzLmtleXModmlvbGluVmFsdWVzW3Zpb2xpbktleV0udmFsdWVzKX0sXG4gIHBvaW50VmFsdWVFeHRyYWN0b3IgPSBmdW5jdGlvbihwb2ludEtleSwgdmlvbGluS2V5LCB2aW9saW5EYXRhLCB2aW9saW5WYWx1ZXMpIHtyZXR1cm4gdmlvbGluVmFsdWVzW3Zpb2xpbktleV0udmFsdWVzW3BvaW50S2V5XX0sXG5cblxuICAvKipcbiAgKiBGdW5jdGlvbiB3aGljaCBnaXZlbiB0aGUga2V5IG9mIHRoZSB2aW9saW4gYW5kIHRoYXQga2V5J3MgYXNzb2NpYXRlZCB2YWx1ZVxuICAqIHJldHVybnMgdGhlIG9iamVjdCBjb25zaXRpbmcgb2YgdGhlIHBvaW50cyBvZiB0aGUgdmlvbGluXG4gICogKHNlZSB7QGxpbmsgdmlvbGluI3Zpb2xpblBvaW50c0V4dHJhY3Rvcn0pXG4gICogQHBhcmFtIHtPYmplY3R9IFt2aW9saW5Qb2ludHNFeHRyYWN0b3I9ZnVuY3Rpb24odmlvbGluS2V5LCB2aW9saW5EYXRhKSB7IHJldHVybiB2aW9saW5EYXRhLnBvaW50cyB9XVxuICAqIEBtZW1iZXJvZiB2aW9saW4jXG4gICogQHByb3BlcnR5XG4gICovXG4gIHZpb2xpblBvaW50c0V4dHJhY3RvciA9IGZ1bmN0aW9uKHZpb2xpbktleSwgdmlvbGluRGF0YSkgeyByZXR1cm4gdmlvbGluRGF0YS5wb2ludHMgfSxcbiAgLyoqXG4gICogRnVuY3Rpb24gd2hpY2ggZ2l2ZW4gdGhlIGtleSBvZiB0aGUgY3VycmVudCBwb2ludCBhbmQgdGhlIG9iamVjdCBvZiBwb2ludHMgZm9yIHRoZVxuICAqIHZpb2xpbiwgcmV0dXJucyB0aGUgbnVtZXJpY2FsIHZhbHVlIG9mIHRoZSBwb2ludFxuICAqIChzZWUge0BsaW5rIHZpb2xpbiN2aW9saW5Qb2ludFZhbHVlRXh0cmFjdG9yfSlcbiAgKiBAcGFyYW0ge09iamVjdH0gW3Zpb2xpblBvaW50VmFsdWVFeHRyYWN0b3I9ZnVuY3Rpb24odmlvbGluUG9pbnRLZXksIHZpb2xpblBvaW50RGF0YSkgeyByZXR1cm4gdmlvbGluUG9pbnREYXRhW3Zpb2xpblBvaW50S2V5XS52YWx1ZSB9XVxuICAqIEBtZW1iZXJvZiB2aW9saW4jXG4gICogQHByb3BlcnR5XG4gICovXG4gIHZpb2xpblBvaW50VmFsdWVFeHRyYWN0b3IgPSBmdW5jdGlvbih2aW9saW5Qb2ludEtleSwgdmlvbGluUG9pbnREYXRhKSB7IHJldHVybiB2aW9saW5Qb2ludERhdGFbdmlvbGluUG9pbnRLZXldLnZhbHVlIH1cblxuXG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHZpb2xpblBvaW50c0V4dHJhY3RvclxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgZnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdmlvbGluUG9pbnRzRXh0cmFjdG9yID0gZnVuY3Rpb24odmlvbGluS2V5LCB2aW9saW5EYXRhKSB7IHJldHVybiB2aW9saW5EYXRhLnBvaW50cyB9XG4gICAqL1xuICB2aW9saW4udmlvbGluUG9pbnRzRXh0cmFjdG9yID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2aW9saW5Qb2ludHNFeHRyYWN0b3IgPSBfLCB2aW9saW4pIDogdmlvbGluUG9pbnRzRXh0cmFjdG9yOyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSB2aW9saW5Qb2ludFZhbHVlRXh0cmFjdG9yXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBmdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB2aW9saW5Qb2ludHNFeHRyYWN0b3IgPSBmdW5jdGlvbihwb2ludEtleSwgdmlvbGluS2V5LCB2aW9saW5EYXRhLCB2aW9saW5WYWx1ZXMpIHtyZXR1cm4gdmlvbGluVmFsdWVzW3Zpb2xpbktleV0udmFsdWVzW3BvaW50S2V5XX1cbiAgICovXG4gIHZpb2xpbi52aW9saW5Qb2ludFZhbHVlRXh0cmFjdG9yID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2aW9saW5Qb2ludFZhbHVlRXh0cmFjdG9yID0gXywgdmlvbGluKSA6IHZpb2xpblBvaW50VmFsdWVFeHRyYWN0b3I7IH07XG5cblxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBzZWxlY3Rpb24gaW4gd2hpY2ggaXRlbXMgYXJlIG1hbmlwdWxhdGVkXG4gICAqIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgZDMuc2VsZWN0aW9ufVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNlbGVjdGlvbiA9IHNlbGVjdGlvblxuICAgKi9cbiAgdmlvbGluLnNlbGVjdGlvbiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2VsZWN0aW9uID0gXywgdmlvbGluKSA6IHNlbGVjdGlvbjsgfTtcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgZGF0YVxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jZGF0YX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgb2JqZWN0fVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKi9cbiAgdmlvbGluLmRhdGEgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRhdGEgPSBfLCB2aW9saW4pIDogZGF0YTsgfTtcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgb3JpZW50IG9mIHRoZSBib3hlc1xuICAgKiAoc2VlIHtAbGluayB2aW9saW4jb3JpZW50fSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBvYmplY3R9XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqL1xuICB2aW9saW4ub3JpZW50ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvcmllbnQgPSBfLCB2aW9saW4pIDogb3JpZW50OyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBhbW91bnQgb2YgaG9yaXpvbnRhbCBzcGFjZSBpbiB3aGljaCBpdGVtcyBhcmUgbWFuaXB1bGF0ZWRcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI3NwYWNlWH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXSBzaG91bGQgYmUgYSBudW1iZXIgPiAwXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc3BhY2VYID0gdW5kZWZpbmVkXG4gICAqL1xuICB2aW9saW4uc3BhY2VYID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzcGFjZVggPSBfLCB2aW9saW4pIDogc3BhY2VYOyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBhbW91bnQgb2YgdmVydGljYWwgc3BhY2UgaW4gd2hpY2ggaXRlbXMgYXJlIG1hbmlwdWxhdGVkXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNzcGFjZVl9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV0gc2hvdWxkIGJlIGEgbnVtYmVyID4gMFxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNwYWNlWSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgdmlvbGluLnNwYWNlWSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3BhY2VZID0gXywgdmlvbGluKSA6IHNwYWNlWTsgfTtcblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB3aGV0aGVyIG9yIG5vdCB2aW9saW4gaXMgYWxsb3dlZCB0byBnbyBiZXlvbmQgc3BlY2lmaWVkIGRpbWVuc2lvbnNcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI292ZXJmbG93UX0pXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IGJvb2xlYW59XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgb3ZlcmZsb3dRID0gZmFsc2VcbiAgICovXG4gIHZpb2xpbi5vdmVyZmxvd1EgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG92ZXJmbG93USA9IF8sIHZpb2xpbikgOiBvdmVyZmxvd1E7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB3aGV0aGVyIG9yIG5vdCB0byBwbG90IHBvaW50cyB3aXRoIHRoZSB2aW9saW5zXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNwb2ludHNRfSlcbiAgICogQHBhcmFtIHtib29sZWFufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgYm9vbGVhbn1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBwb2ludHNRID0gZmFsc2VcbiAgICovXG4gIHZpb2xpbi5wb2ludHNRID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwb2ludHNRID0gXywgdmlvbGluKSA6IHBvaW50c1E7IH07XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGdyb3VwaW5nIG9mIHRoZSBib3hlc1xuICAgKiAoc2VlIHtAbGluayB2aW9saW4jZ3JvdXBpbmd9KVxuICAgKiBAcGFyYW0ge0FycmF5W119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBBcnJheVtdfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGdyb3VwaW5nID0gdW5kZWZpbmVkXG4gICAqL1xuICB2aW9saW4uZ3JvdXBpbmcgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGdyb3VwaW5nID0gXywgdmlvbGluKSA6IGdyb3VwaW5nOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHZhbHVlRXh0cmFjdG9yXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiN2YWx1ZUV4dHJhY3Rvcn0pXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBmdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICovXG4gIHZpb2xpbi52YWx1ZUV4dHJhY3RvciA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmFsdWVFeHRyYWN0b3IgPSBfLCB2aW9saW4pIDogdmFsdWVFeHRyYWN0b3I7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgc29ydGluZ0Z1bmN0aW9uXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNzb3J0aW5nRnVuY3Rpb259KVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgZnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqL1xuICB2aW9saW4uc29ydGluZ0Z1bmN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzb3J0aW5nRnVuY3Rpb24gPSBfLCB2aW9saW4pIDogc29ydGluZ0Z1bmN0aW9uOyB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgc2NhbGUgZm9yIHdoaWNoIHRoZSB2aW9saW4gdmFsdWVzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBieVxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jc2NhbGV9KVxuICAgKiBAcGFyYW0ge2QzLnNjYWxlfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgZDMuc2NhbGV9XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc2NhbGUgPSBkMy5zY2FsZUxpbmVhcigpXG4gICAqL1xuICB2aW9saW4uc2NhbGUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNjYWxlID0gXywgdmlvbGluKSA6IHNjYWxlOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHBhZGRpbmcgZm9yIHRoZSBkb21haW4gb2YgdGhlIHNjYWxlXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNkb21haW5QYWRkaW5nfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgZG9tYWluUGFkZGluZyA9IDAuNVxuICAgKi9cbiAgdmlvbGluLmRvbWFpblBhZGRpbmcgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpblBhZGRpbmcgPSBfLCB2aW9saW4pIDogZG9tYWluUGFkZGluZzsgfTtcblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyBvYmplY3RTcGFjZXJcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI29iamVjdFNwYWNlcn0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG9iamVjdFNwYWNlciA9IDAuMDVcbiAgICovXG4gIHZpb2xpbi5vYmplY3RTcGFjZXIgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9iamVjdFNwYWNlciA9IF8sIHZpb2xpbikgOiBvYmplY3RTcGFjZXI7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbWluT2JqZWN0U2l6ZVxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jbWluT2JqZWN0U2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG1pbk9iamVjdFNpemUgPSAxNVxuICAgKi9cbiAgdmlvbGluLm1pbk9iamVjdFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG1pbk9iamVjdFNpemUgPSBfLCB2aW9saW4pIDogbWluT2JqZWN0U2l6ZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBtYXhPYmplY3RTaXplXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNtYXhPYmplY3RTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgbWF4T2JqZWN0U2l6ZSA9IDUwXG4gICAqL1xuICB2aW9saW4ubWF4T2JqZWN0U2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobWF4T2JqZWN0U2l6ZSA9IF8sIHZpb2xpbikgOiBtYXhPYmplY3RTaXplOyB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgb2JqZWN0U3Ryb2tlV2lkdGhcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI29iamVjdFN0cm9rZVdpZHRofSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgb2JqZWN0U3Ryb2tlV2lkdGggPSAyXG4gICAqL1xuICB2aW9saW4ub2JqZWN0U3Ryb2tlV2lkdGggPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9iamVjdFN0cm9rZVdpZHRoID0gXywgdmlvbGluKSA6IG9iamVjdFN0cm9rZVdpZHRoOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBjb2xvckZ1bmN0aW9uXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNjb2xvckZ1bmN0aW9ufSlcbiAgICogQHBhcmFtIHtjb2xvckZ1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgY29sb3JGdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBjb2xvckZ1bmN0aW9uID0gY29sb3JGdW5jdGlvbigpXG4gICAqL1xuICB2aW9saW4uY29sb3JGdW5jdGlvbiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY29sb3JGdW5jdGlvbiA9IF8sIHZpb2xpbikgOiBjb2xvckZ1bmN0aW9uOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGNvbG9yRnVuY3Rpb25cbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI2NvbG9yRnVuY3Rpb259KVxuICAgKiBAcGFyYW0ge2NvbG9yRnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBjb2xvckZ1bmN0aW9ufVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGNvbG9yRnVuY3Rpb24gPSBjb2xvckZ1bmN0aW9uKClcbiAgICovXG4gIHZpb2xpbi5wb2ludENvbG9yRnVuYyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocG9pbnRDb2xvckZ1bmMgPSBfLCB2aW9saW4pIDogcG9pbnRDb2xvckZ1bmM7IH07XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHBvaW50UmFkaXVzXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNwb2ludFJhZGl1c30pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHBvaW50UmFkaXVzID0gMlxuICAgKi9cbiAgdmlvbGluLnBvaW50UmFkaXVzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwb2ludFJhZGl1cyA9IF8sIHZpb2xpbikgOiBwb2ludFJhZGl1czsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBwb2ludFN0cm9rZVdpZHRoXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNwb2ludFN0cm9rZVdpZHRofSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgcG9pbnRTdHJva2VXaWR0aCA9IDJcbiAgICovXG4gIHZpb2xpbi5wb2ludFN0cm9rZVdpZHRoID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwb2ludFN0cm9rZVdpZHRoID0gXywgdmlvbGluKSA6IHBvaW50U3Ryb2tlV2lkdGg7IH07XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGJhY2tncm91bmRGaWxsXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNiYWNrZ3JvdW5kRmlsbH0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGJhY2tncm91bmRGaWxsID0gJ3RyYW5zcGFyZW50J1xuICAgKi9cbiAgdmlvbGluLmJhY2tncm91bmRGaWxsID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChiYWNrZ3JvdW5kRmlsbCA9IF8sIHZpb2xpbikgOiBiYWNrZ3JvdW5kRmlsbDsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBuYW1lc3BhY2VcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI25hbWVzcGFjZX0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG5hbWVzcGFjZSA9ICdkM3NtLXZpb2xpbidcbiAgICovXG4gIHZpb2xpbi5uYW1lc3BhY2UgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG5hbWVzcGFjZSA9IF8sIHZpb2xpbikgOiBuYW1lc3BhY2U7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgb2JqZWN0Q2xhc3NcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI29iamVjdENsYXNzfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgb2JqZWN0Q2xhc3MgPSAndGljay1ncm91cCdcbiAgICovXG4gIHZpb2xpbi5vYmplY3RDbGFzcyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob2JqZWN0Q2xhc3MgPSBfLCB2aW9saW4pIDogb2JqZWN0Q2xhc3M7IH07XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRyYW5zaXRpb25EdXJhdGlvblxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jdHJhbnNpdGlvbkR1cmF0aW9ufSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdHJhbnNpdGlvbkR1cmF0aW9uID0gMTAwMFxuICAgKi9cbiAgdmlvbGluLnRyYW5zaXRpb25EdXJhdGlvbiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodHJhbnNpdGlvbkR1cmF0aW9uID0gXywgdmlvbGluKSA6IHRyYW5zaXRpb25EdXJhdGlvbjsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBlYXNlRnVuY1xuICAgKiAoc2VlIHtAbGluayB2aW9saW4jZWFzZUZ1bmN9KVxuICAgKiBAcGFyYW0ge2QzLmVhc2V9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBkMy5lYXNlfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGVhc2VGdW5jID0gZDMuZWFzZUV4cFxuICAgKi9cbiAgdmlvbGluLmVhc2VGdW5jID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChlYXNlRnVuYyA9IF8sIHZpb2xpbikgOiBlYXNlRnVuYzsgfTtcblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgcXVhcnRpbGVLZXlcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI3F1YXJ0aWxlS2V5fSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgcXVhcnRpbGVLZXkgPSBcInF1YXJ0aWxlc1wiXG4gICAqL1xuICB2aW9saW4ucXVhcnRpbGVLZXkgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHF1YXJ0aWxlS2V5ID0gXywgdmlvbGluKSA6IHF1YXJ0aWxlS2V5OyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHF1YXJ0aWxlS2V5c1xuICAgKiAoc2VlIHtAbGluayB2aW9saW4jcXVhcnRpbGVLZXlzfSlcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IHN0cmluZ1tdfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHF1YXJ0aWxlS2V5cyA9IFtcIlEwXCIsXCJRMVwiLFwiUTJcIixcIlEzXCIsXCJRNFwiXVxuICAgKi9cbiAgdmlvbGluLnF1YXJ0aWxlS2V5cyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocXVhcnRpbGVLZXlzID0gXywgdmlvbGluKSA6IHF1YXJ0aWxlS2V5czsgfTtcblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdmlvbGluS2V5c1xuICAgKiAoc2VlIHtAbGluayB2aW9saW4jdmlvbGluS2V5c30pXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBzdHJpbmdbXX1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB2aW9saW5LZXlzID0gdW5kZWZpbmVkXG4gICAqL1xuICB2aW9saW4udmlvbGluS2V5cyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmlvbGluS2V5cyA9IF8sIHZpb2xpbikgOiB2aW9saW5LZXlzOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHZpb2xpblZhbHVlc1xuICAgKiAoc2VlIHtAbGluayB2aW9saW4jdmlvbGluVmFsdWVzfSlcbiAgICogQHBhcmFtIHtPYmplY3RbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IE9iamVjdFtdfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHZpb2xpblZhbHVlcyA9IHVuZGVmaW5lZFxuICAgKi9cbiAgdmlvbGluLnZpb2xpblZhbHVlcyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmlvbGluVmFsdWVzID0gXywgdmlvbGluKSA6IHZpb2xpblZhbHVlczsgfTtcblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG9iamVjdFNpemVcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI29iamVjdFNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvYmplY3RTaXplID0gdW5kZWZpbmVkXG4gICAqL1xuICB2aW9saW4ub2JqZWN0U2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob2JqZWN0U2l6ZSA9IF8sIHZpb2xpbikgOiBvYmplY3RTaXplOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNwYWNlclNpemVcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI3NwYWNlclNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzcGFjZXJTaXplID0gdW5kZWZpbmVkXG4gICAqL1xuICB2aW9saW4uc3BhY2VyU2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3BhY2VyU2l6ZSA9IF8sIHZpb2xpbikgOiBzcGFjZXJTaXplOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRvb2x0aXBcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI3Rvb2x0aXB9KVxuICAgKiBAcGFyYW0ge3Rvb2x0aXB9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCB0b29sdGlwfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHRvb2x0aXAgPSB0b29sdGlwKClcbiAgICovXG4gIHZpb2xpbi50b29sdGlwID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0b29sdGlwID0gXywgdmlvbGluKSA6IHRvb2x0aXA7IH07XG4gIC8vIHZpb2xpbi5wb2ludHNUb29sdGlwID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwb2ludHNUb29sdGlwID0gXywgdmlvbGluKSA6IHBvaW50c1Rvb2x0aXA7IH07XG5cblxuXG5cblxuICBmdW5jdGlvbiB2aW9saW4gKCkge1xuICAgIC8vIGZvciBjb252ZW5pZW5jZSBpbiBoYW5kbGluZyBvcmllbnRhdGlvbiBzcGVjaWZpYyB2YWx1ZXNcbiAgICB2YXIgaG9yaXpvbnRhbFEgPSAob3JpZW50ID09ICdob3Jpem9udGFsJykgPyB0cnVlIDogZmFsc2VcbiAgICB2YXIgdmVydGljYWxRID0gIWhvcml6b250YWxRXG5cbiAgICAvLyBiYWNrZ3JvdW5kIGNsaXBpbmcgcmVjdGFuZ2xlXG4gICAgdmFyIGJnY3BSZWN0ID0ge3g6MCwgeTowLCB3aWR0aDogc3BhY2VYLCBoZWlnaHQ6c3BhY2VZfVxuICAgIHZhciBjb250YWluZXIgPSBzZXR1cENvbnRhaW5lciggc2VsZWN0aW9uLCBuYW1lc3BhY2UsIGJnY3BSZWN0LCBiYWNrZ3JvdW5kRmlsbCApO1xuXG4gICAgLy8gaWYgZ3JvdXBpbmcgaXMgdW5kZWZpbmVkIHNvcnQgdmlvbGluS2V5cyBieSBzb3J0aW5nRnVuY3Rpb25cbiAgICB2YXIgb3JkZXJlZCA9IChncm91cGluZyA9PSB1bmRlZmluZWQpID8gZDMua2V5cyhkYXRhKS5zb3J0KHNvcnRpbmdGdW5jdGlvbikgOiBncm91cGluZ1xuXG4gICAgLy8gY29uc29sZS5sb2cob3JkZXJlZClcblxuICAgIHZpb2xpbktleXMgPSBmbGF0dGVuKG9yZGVyZWQpXG5cbiAgICB2YXIgY2FsY1ZhbHVlcyA9IG5lZWRlZFZpb2xpblZhbHVlcygpXG4gICAgLmhvcml6b250YWxRKGhvcml6b250YWxRKVxuICAgIC5xdWFydGlsZUtleXMocXVhcnRpbGVLZXlzKVxuICAgIC52aW9saW5Qb2ludHNFeHRyYWN0b3IodmlvbGluUG9pbnRzRXh0cmFjdG9yKVxuICAgIC52aW9saW5Qb2ludFZhbHVlRXh0cmFjdG9yKHZpb2xpblBvaW50VmFsdWVFeHRyYWN0b3IpXG5cbiAgICAvLyBhdWdtZW50IHZhbHVzXG4gICAgdmlvbGluS2V5cy5tYXAoZnVuY3Rpb24odmssIGkpeyBjYWxjVmFsdWVzKHZrLCBkYXRhKSB9KVxuXG4gICAgdmFyIG51bWJlck9mT2JqZWN0cyA9IHZpb2xpbktleXMubGVuZ3RoXG5cbiAgICB2YXIgbWluID0gW10uY29uY2F0KC4uLnZpb2xpbktleXMubWFwKGZ1bmN0aW9uKGssIGkpe3JldHVybiBkYXRhW2tdLnF1YXJ0aWxlc1txdWFydGlsZUtleXNbMF1dfSkpXG4gICAgdmFyIG1heCA9IFtdLmNvbmNhdCguLi52aW9saW5LZXlzLm1hcChmdW5jdGlvbihrLCBpKXtyZXR1cm4gZGF0YVtrXS5xdWFydGlsZXNbcXVhcnRpbGVLZXlzW3F1YXJ0aWxlS2V5cy5sZW5ndGggLSAxXV19KSlcbiAgICB2YXIgZXh0ZW50ID0gW01hdGgubWluKC4uLm1pbikgLSBkb21haW5QYWRkaW5nLCBNYXRoLm1heCguLi5tYXgpICsgZG9tYWluUGFkZGluZ11cbiAgICAvLyBjb25zb2xlLmxvZyhleHRlbnQsIHZpb2xpblZhbHVlcywgb3JkZXJlZClcblxuICAgIC8vIHNldCB0aGUgc2NhbGVcbiAgICBzY2FsZS5kb21haW4oZXh0ZW50KS5yYW5nZShob3Jpem9udGFsUSA/IFswLHNwYWNlWV0gOiBbMCwgc3BhY2VYXSlcbiAgICB2YXIgc3BhY2UgPSBob3Jpem9udGFsUSA/IHNwYWNlWCA6IHNwYWNlWVxuICAgIC8vIGNhbGN1bGF0ZSBvYmplY3Qgc2l6ZVxuICAgIG9iamVjdFNpemUgPSBjYWxjdWxhdGVXaWR0aE9mT2JqZWN0KHNwYWNlLCBudW1iZXJPZk9iamVjdHMsIG1pbk9iamVjdFNpemUsIG1heE9iamVjdFNpemUsIG9iamVjdFNwYWNlciwgb3ZlcmZsb3dRKVxuICAgIC8vIGNhbGN1bGF0ZSBzcGFjZXIgc2l6ZSBpZiBuZWVkZWRcbiAgICBzcGFjZXJTaXplID0gY2FsY3VsYXRlV2lkdGhPZlNwYWNlcihvcmRlcmVkLCBzcGFjZSwgb2JqZWN0U2l6ZSwgbnVtYmVyT2ZPYmplY3RzLCBvYmplY3RTcGFjZXIsIG92ZXJmbG93USlcbiAgICAvLyBtYWtlIHRoZSBuZXN0ZWQgZ3JvdXBzXG4gICAgdmFyIHNwYWNlckZ1bmN0aW9uID0gZ3JvdXBpbmdTcGFjZXIoKVxuICAgIC5ob3Jpem9udGFsUShob3Jpem9udGFsUSkuc2NhbGUoc2NhbGUpLm1vdmVieSgnY2F0ZWdvcnknKS5udW1iZXJPZk9iamVjdHMobnVtYmVyT2ZPYmplY3RzKVxuICAgIC5vYmplY3RDbGFzcyhvYmplY3RDbGFzcykub2JqZWN0U2l6ZShvYmplY3RTaXplKS5zcGFjZXJTaXplKHNwYWNlclNpemUpXG4gICAgLnRyYW5zaXRpb25EdXJhdGlvbih0cmFuc2l0aW9uRHVyYXRpb24pLmVhc2VGdW5jKGVhc2VGdW5jKVxuICAgIC5uYW1lc3BhY2UobmFtZXNwYWNlKVxuXG4gICAgLy8gbW92ZSBzdHVmZlxuICAgIHNwYWNlckZ1bmN0aW9uKGNvbnRhaW5lciwgb3JkZXJlZCwgMClcbiAgICAvLyBjb25zb2xlLmxvZyh2aW9saW5LZXlzLCBvcmRlcmVkLCBjb250YWluZXIuc2VsZWN0QWxsKCdnOm5vdCgudG8tcmVtb3ZlKS4nK29iamVjdENsYXNzKS5ub2RlcygpKVxuXG4gICAgLy8gZm9yIGNvbG9yIGZ1bmN0aW9uXG4gICAgdmFyIHBhcmVudEluZGV4QXJyYXkgPSBbXVxuICAgIGNvbnRhaW5lci5zZWxlY3RBbGwoJ2c6bm90KC50by1yZW1vdmUpLicrb2JqZWN0Q2xhc3MpXG4gICAgLmVhY2goZnVuY3Rpb24oZCwgaSl7aWYgKGhhc1EodmlvbGluS2V5cywgZCkpeyBwYXJlbnRJbmRleEFycmF5LnB1c2goTnVtYmVyKGQzLnNlbGVjdCh0aGlzKS5hdHRyKCdwYXJlbnQtaW5kZXgnKSkpfX0pXG5cbiAgICAvLyB1cGRhdGUgY29sb3IgZnVuY3Rpb25cbiAgICBjb2xvckZ1bmN0aW9uID0gY29sb3JGdW5jdGlvbi5jb2xvckJ5KCkgPT0gJ2luZGV4J1xuICAgID8gY29sb3JGdW5jdGlvbi5kYXRhRXh0ZW50KFswLCBNYXRoLm1heCguLi5wYXJlbnRJbmRleEFycmF5KV0pXG4gICAgOiBjb2xvckZ1bmN0aW9uLmRhdGFFeHRlbnQoZXh0ZW50KVxuXG4gICAgLyogdmlvbGlpbiBzcGVjaWZpYyBuZWVkcyAqL1xuXG5cbiAgICB2YXIgZnJlcXVlbmN5TWF4ID0gTWF0aC5tYXgoLi4uW10uY29uY2F0KC4uLnZpb2xpbktleXMubWFwKGZ1bmN0aW9uKGssIGkpe3JldHVybiBkMy5tYXgoZGF0YVtrXS5mcmVxdWVuY2llcyl9KSkpXG4gICAgdmFyIHZTY2FsZSA9IGQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFswLCBmcmVxdWVuY3lNYXhdKS5yYW5nZShbMCwgb2JqZWN0U2l6ZSAvIDJdKVxuXG4gICAgdmFyIGxBcmVhID0gZDMubGluZSgpXG4gICAgLngoZnVuY3Rpb24oZCwgaSl7IHJldHVybiBob3Jpem9udGFsUSA/IC12U2NhbGUoZC54KSA6IHNjYWxlKGQueCl9KVxuICAgIC55KGZ1bmN0aW9uKGQsIGkpeyByZXR1cm4gaG9yaXpvbnRhbFEgPyBzY2FsZShleHRlbnRbMV0pIC0gc2NhbGUoZC55KSA6IC12U2NhbGUoZC55KX0pXG4gICAgLmN1cnZlKGQzLmN1cnZlQmFzaXMpXG4gICAgdmFyIHJBcmVhID0gZDMubGluZSgpXG4gICAgLngoZnVuY3Rpb24oZCwgaSl7IHJldHVybiBob3Jpem9udGFsUSA/IHZTY2FsZShkLngpIDogc2NhbGUoZC54KX0pXG4gICAgLnkoZnVuY3Rpb24oZCwgaSl7IHJldHVybiBob3Jpem9udGFsUSA/IHNjYWxlKGV4dGVudFsxXSkgLSBzY2FsZShkLnkpIDogdlNjYWxlKGQueSl9KVxuICAgIC5jdXJ2ZShkMy5jdXJ2ZUJhc2lzKVxuXG5cblxuXG5cblxuICAgIGNvbnRhaW5lci5zZWxlY3RBbGwoJ2c6bm90KC50by1yZW1vdmUpLicrb2JqZWN0Q2xhc3MpLmVhY2goZnVuY3Rpb24oa2V5LCBpKXtcbiAgICAgIHZhciB0ID0gZDMuc2VsZWN0KHRoaXMpLFxuICAgICAgY3VycmVudERhdGEgPSBkYXRhW2tleV1cbiAgICAgIC8vIG5lZWRlZCBiZWNhdXNlIGJ1ZyBpbiBzZWxlY3RpbmcgLnRvLXJlbW92ZVxuICAgICAgaWYgKCFoYXNRKHZpb2xpbktleXMsIGtleSkpIHtyZXR1cm59XG4gICAgICB2YXJcbiAgICAgIGkgPSB0LmF0dHIoJ3BhcmVudC1pbmRleCcpID09IHVuZGVmaW5lZCA/IGkgOiB0LmF0dHIoJ3BhcmVudC1pbmRleCcpLFxuICAgICAgZmlsbENvbG9yID0gY29sb3JGdW5jdGlvbihrZXksIGN1cnJlbnREYXRhLCBpLCAnZmlsbCcpLCAvLyBwcmV2ZW50IGR1cGxpY2F0ZSBjb21wdXRhdGlvblxuICAgICAgc3Ryb2tlQ29sb3IgPSBjb2xvckZ1bmN0aW9uKGtleSwgY3VycmVudERhdGEsIGksICdzdHJva2UnKSxcbiAgICAgIGFyZWEgPSBzYWZlU2VsZWN0KHQsICdnJywgJ2FyZWEnKSxcbiAgICAgIGxhID0gc2FmZVNlbGVjdChhcmVhLCAncGF0aCcsICdsZWZ0JyksXG4gICAgICByYSA9IHNhZmVTZWxlY3QoYXJlYSwgJ3BhdGgnLCAncmlnaHQnKSxcbiAgICAgIHF1YXJ0cyA9IHNhZmVTZWxlY3QodCwgJ2cnLCAncXVhcnRzJyksXG4gICAgICBscTMgPSBzYWZlU2VsZWN0KHF1YXJ0cywgJ2xpbmUnLCAncTMnKSxcbiAgICAgIGxxMSA9IHNhZmVTZWxlY3QocXVhcnRzLCAnbGluZScsICdxMScpLFxuICAgICAgcTMgPSBjdXJyZW50RGF0YS5xdWFydGlsZXNbcXVhcnRpbGVLZXlzWzNdXSxcbiAgICAgIHEyID0gY3VycmVudERhdGEucXVhcnRpbGVzW3F1YXJ0aWxlS2V5c1syXV0sXG4gICAgICBxMSA9IGN1cnJlbnREYXRhLnF1YXJ0aWxlc1txdWFydGlsZUtleXNbMV1dXG5cbiAgICAgIHQuYXR0cigndHJhbnNmb3JtJywgaG9yaXpvbnRhbFEgPyAndHJhbnNsYXRlKCcrb2JqZWN0U2l6ZSAvIDIrJywwKScgOiAndHJhbnNsYXRlKDAsJytvYmplY3RTaXplIC8gMisnKScgIClcbiAgICAgIC8vIGRyYXcgY3VydmVcbiAgICAgIGxhLnRyYW5zaXRpb24oKS5kdXJhdGlvbih0cmFuc2l0aW9uRHVyYXRpb24pLmF0dHIoJ2QnLCBmdW5jdGlvbihkZCwgaWkpeyByZXR1cm4gbEFyZWEoY3VycmVudERhdGEuY29udG91cil9KVxuICAgICAgLmF0dHIoJ2ZpbGwnLCBmaWxsQ29sb3IpXG4gICAgICAuYXR0cignc3Ryb2tlJywgc3Ryb2tlQ29sb3IpXG4gICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgb2JqZWN0U3Ryb2tlV2lkdGgpXG5cbiAgICAgIHJhLnRyYW5zaXRpb24oKS5kdXJhdGlvbih0cmFuc2l0aW9uRHVyYXRpb24pLmF0dHIoJ2QnLCBmdW5jdGlvbihkZCwgaWkpeyByZXR1cm4gckFyZWEoY3VycmVudERhdGEuY29udG91cil9KVxuICAgICAgLmF0dHIoJ2ZpbGwnLCBmaWxsQ29sb3IpXG4gICAgICAuYXR0cignc3Ryb2tlJywgc3Ryb2tlQ29sb3IpXG4gICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgb2JqZWN0U3Ryb2tlV2lkdGgpXG5cbiAgICAgIGFyZWEubm9kZSgpLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIGZ1bmN0aW9uKGRkLCBpaSl7XG4gICAgICAgIGNvbnRhaW5lci5zZWxlY3RBbGwoJ2cuJytvYmplY3RDbGFzcykuc3R5bGUoJ29wYWNpdHknLCAwLjIpXG4gICAgICAgIHQuc3R5bGUoJ29wYWNpdHknLCAxKVxuICAgICAgICBsYS5hdHRyKCdzdHJva2Utd2lkdGgnLG9iamVjdFN0cm9rZVdpZHRoKjIpXG4gICAgICAgIHJhLmF0dHIoJ3N0cm9rZS13aWR0aCcsb2JqZWN0U3Ryb2tlV2lkdGgqMilcbiAgICAgIH0pXG4gICAgICBhcmVhLm5vZGUoKS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsIGZ1bmN0aW9uKGRkLCBpaSl7XG4gICAgICAgIGNvbnRhaW5lci5zZWxlY3RBbGwoJ2cuJytvYmplY3RDbGFzcykuc3R5bGUoJ29wYWNpdHknLCAxKVxuICAgICAgICBsYS5hdHRyKCdzdHJva2Utd2lkdGgnLG9iamVjdFN0cm9rZVdpZHRoKVxuICAgICAgICByYS5hdHRyKCdzdHJva2Utd2lkdGgnLG9iamVjdFN0cm9rZVdpZHRoKVxuICAgICAgfSlcblxuICAgICAgaWYgKHBvaW50c1EpIHtcbiAgICAgICAgdmFyIHB0c0NvbnRhaW5lciA9IHNhZmVTZWxlY3QodCwgJ2cnLCAncG9pbnRzJylcbiAgICAgICAgdmFyIHB0cyA9IHB0c0NvbnRhaW5lci5zZWxlY3RBbGwoJy5wb2ludCcpLmRhdGEoY3VycmVudERhdGEucG9pbnRLZXlzKVxuICAgICAgICBwdHMub24oJ21vdXNlb3ZlcicsIG51bGwpXG5cblxuICAgICAgICB2YXIgcHRzRXhpdCA9IHB0cy5leGl0KCkudHJhbnNpdGlvbigpLmVhc2UoZWFzZUZ1bmMpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbilcbiAgICAgICAgLmF0dHIoJ3InLCAwKVxuICAgICAgICAuYXR0cignY3knLCBob3Jpem9udGFsUSA/IHNjYWxlKGV4dGVudFsxXSkgLSBzY2FsZShxMikgOiB2U2NhbGUoMCkpXG4gICAgICAgIC5hdHRyKCdjeCcsIGhvcml6b250YWxRID8gdlNjYWxlKDApIDogc2NhbGUocTIpKS5yZW1vdmUoKVxuXG4gICAgICAgIHZhciBwdHNFbnRlciA9IHB0cy5lbnRlcigpLmFwcGVuZCgnY2lyY2xlJykuYXR0cignY2xhc3MnLCAncG9pbnQnKS5hdHRyKCdyJywgMClcbiAgICAgICAgLmF0dHIoJ2N4JywgaG9yaXpvbnRhbFEgPyAwIDogc2NhbGUocTIpKVxuICAgICAgICAuYXR0cignY3knLCBob3Jpem9udGFsUSA/IHNjYWxlKHEyKSA6IDApXG5cbiAgICAgICAgcHRzID0gcHRzLm1lcmdlKHB0c0VudGVyKVxuXG4gICAgICAgIHZhciBwVFRpcHMgPSBUVGlwKCkuc2VsZWN0aW9uKHB0cykuZGF0YSh2aW9saW5Qb2ludHNFeHRyYWN0b3Ioa2V5LCBjdXJyZW50RGF0YSkpXG4gICAgICAgIHBUVGlwcygpXG5cbiAgICAgICAgdmFyIHBNaW4gPSBkMy5taW4oY3VycmVudERhdGEucG9pbnRWYWx1ZXMpLCBwTWF4ID0gZDMubWF4KGN1cnJlbnREYXRhLnBvaW50VmFsdWVzKVxuXG5cblxuICAgICAgICBwdHMudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuZWFzZShlYXNlRnVuYykuYXR0cigncicsIHBvaW50UmFkaXVzKVxuICAgICAgICAuYXR0cignY3knLCBmdW5jdGlvbihwb2ludEtleSwgaWkpe1xuICAgICAgICAgIHZhciBkZCA9IGN1cnJlbnREYXRhLnBvaW50VmFsdWVzW2lpXVxuICAgICAgICAgIGlmIChob3Jpem9udGFsUSkgeyByZXR1cm4gc2NhbGUoZXh0ZW50WzFdKSAtIHNjYWxlKGRkKSB9XG4gICAgICAgICAgdmFyIGogPSB3aGljaEJpbihjdXJyZW50RGF0YS5iaW5uZWQsIGRkKVxuICAgICAgICAgIHZhciByID0gTWF0aC5yYW5kb20oKVxuICAgICAgICAgIHZhciBuID0gdlNjYWxlKHIgKiBjdXJyZW50RGF0YS5mcmVxdWVuY2llc1tqXSAqIDAuNSlcbiAgICAgICAgICB2YXIgayA9IE1hdGgucmFuZG9tKCkgPiAwLjUgPyBuIDogLW5cbiAgICAgICAgICByZXR1cm4ga1xuICAgICAgICB9KVxuICAgICAgICAuYXR0cignY3gnLCBmdW5jdGlvbihwb2ludEtleSwgaWkpe1xuICAgICAgICAgIHZhciBkZCA9IGN1cnJlbnREYXRhLnBvaW50VmFsdWVzW2lpXVxuICAgICAgICAgIGlmIChob3Jpem9udGFsUSkge1xuICAgICAgICAgICAgdmFyIGogPSB3aGljaEJpbihjdXJyZW50RGF0YS5iaW5uZWQsIGRkKVxuICAgICAgICAgICAgdmFyIHIgPSBNYXRoLnJhbmRvbSgpXG4gICAgICAgICAgICB2YXIgbiA9IHZTY2FsZShyICogY3VycmVudERhdGEuZnJlcXVlbmNpZXNbal0gKiAwLjUpXG4gICAgICAgICAgICB2YXIgayA9IE1hdGgucmFuZG9tKCkgPiAwLjUgPyBuIDogLW5cbiAgICAgICAgICAgIHJldHVybiBrXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBzY2FsZShkZClcbiAgICAgICAgfSlcbiAgICAgICAgLmF0dHIoJ3N0cm9rZScsIGZ1bmN0aW9uKGRkLCBpaSkgeyB2YXIgZGQgPSBjdXJyZW50RGF0YS5wb2ludFZhbHVlc1tpaV07IHJldHVybiBwb2ludENvbG9yRnVuYyhkZCwgJ3N0cm9rZScsIHN0cm9rZUNvbG9yLCBwTWluLCBwTWF4KSB9KVxuICAgICAgICAuYXR0cignZmlsbCcgICwgZnVuY3Rpb24oZGQsIGlpKSB7IHZhciBkZCA9IGN1cnJlbnREYXRhLnBvaW50VmFsdWVzW2lpXTsgcmV0dXJuIHBvaW50Q29sb3JGdW5jKGRkLCAnZmlsbCcgICwgc3Ryb2tlQ29sb3IsIHBNaW4sIHBNYXgpIH0pXG4gICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCBwb2ludFN0cm9rZVdpZHRoKVxuXG4gICAgICAgIHB0c0NvbnRhaW5lci5zZWxlY3RBbGwoJ2NpcmNsZS5wb2ludCcpLm9uKCdtb3VzZW92ZXInLCBmdW5jdGlvbihkZCwgaWkpe1xuICAgICAgICAgIGNvbnRhaW5lci5zZWxlY3RBbGwoJ2cuJytvYmplY3RDbGFzcykuc3R5bGUoJ29wYWNpdHknLCAwLjIpXG4gICAgICAgICAgdC5zdHlsZSgnb3BhY2l0eScsIDEpXG4gICAgICAgICAgbGEuYXR0cignc3Ryb2tlLXdpZHRoJyxvYmplY3RTdHJva2VXaWR0aCoyKVxuICAgICAgICAgIHJhLmF0dHIoJ3N0cm9rZS13aWR0aCcsb2JqZWN0U3Ryb2tlV2lkdGgqMilcblxuICAgICAgICAgIGNvbnRhaW5lci5zZWxlY3RBbGwoJy5wb2ludCcpLnN0eWxlKCdvcGFjaXR5JywgMC4yKVxuICAgICAgICAgIGQzLnNlbGVjdCh0aGlzKS5zdHlsZSgnb3BhY2l0eScsIDEpLmF0dHIoJ3InLCBwb2ludFJhZGl1cyAqIDIpLmF0dHIoJ3N0cm9rZS13aWR0aCcscG9pbnRTdHJva2VXaWR0aCoyKVxuICAgICAgICB9KVxuICAgICAgICBwdHNDb250YWluZXIuc2VsZWN0QWxsKCdjaXJjbGUucG9pbnQnKS5vbignbW91c2VvdXQnLCBmdW5jdGlvbihkZCwgaWkpe1xuICAgICAgICAgIHZhciBlID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ1NWR0V2ZW50cycpXG4gICAgICAgICAgZS5pbml0RXZlbnQoJ21vdXNlb3V0Jyx0cnVlLHRydWUpO1xuICAgICAgICAgIGFyZWEubm9kZSgpLmRpc3BhdGNoRXZlbnQoZSlcblxuICAgICAgICAgIGNvbnRhaW5lci5zZWxlY3RBbGwoJy5wb2ludCcpLnN0eWxlKCdvcGFjaXR5JywgMSlcbiAgICAgICAgICBkMy5zZWxlY3QodGhpcykuYXR0cignc3Ryb2tlLXdpZHRoJywgcG9pbnRTdHJva2VXaWR0aCkuYXR0cigncicsIHBvaW50UmFkaXVzKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGNWLnNlbGVjdEFsbCgnLnBvaW50JylcbiAgICAgICAgLnRyYW5zaXRpb24oKS5kdXJhdGlvbih0cmFuc2l0aW9uRHVyYXRpb24pLmVhc2UoZWFzZUZ1bmMpXG4gICAgICAgIC5hdHRyKCdyJywgMClcbiAgICAgICAgLmF0dHIoJ2N5JywgaG9yaXpvbnRhbFEgPyBzY2FsZShleHRlbnRbMV0pIC0gc2NhbGUocTIpIDogdlNjYWxlKDApKVxuICAgICAgICAuYXR0cignY3gnLCBob3Jpem9udGFsUSA/IHZTY2FsZSgwKSA6IHNjYWxlKHEyKSlcbiAgICAgICAgLnJlbW92ZSgpXG4gICAgICB9XG5cblxuICAgIH0pXG5cblxuICAgIHRvb2x0aXAuc2VsZWN0aW9uKGNvbnRhaW5lci5zZWxlY3RBbGwoJ2c6bm90KC50by1yZW1vdmUpLicrb2JqZWN0Q2xhc3MgKyAnIC5hcmVhJykpXG4gICAgaWYgKHRvb2x0aXAuZGF0YSgpID09IHVuZGVmaW5lZCkge3Rvb2x0aXAuZGF0YShkYXRhKX1cbiAgICB0b29sdGlwKClcbiAgICB0b29sdGlwLnZhbHVlcyhbXG4gICAgICBmdW5jdGlvbihjdXJyZW50RGF0YSwgdG9vbHRpcEtleSl7IHJldHVybiBjdXJyZW50RGF0YVsncXVhcnRpbGVzJ11bdG9vbHRpcEtleV0gfSxcbiAgICAgIGZ1bmN0aW9uKGN1cnJlbnREYXRhLCB0b29sdGlwS2V5KXsgcmV0dXJuIGN1cnJlbnREYXRhWydxdWFydGlsZXMnXVt0b29sdGlwS2V5XSB9LFxuICAgICAgZnVuY3Rpb24oY3VycmVudERhdGEsIHRvb2x0aXBLZXkpeyByZXR1cm4gY3VycmVudERhdGFbJ3F1YXJ0aWxlcyddW3Rvb2x0aXBLZXldIH0sXG4gICAgICBmdW5jdGlvbihjdXJyZW50RGF0YSwgdG9vbHRpcEtleSl7IHJldHVybiBjdXJyZW50RGF0YVsncXVhcnRpbGVzJ11bdG9vbHRpcEtleV0gfSxcbiAgICAgIGZ1bmN0aW9uKGN1cnJlbnREYXRhLCB0b29sdGlwS2V5KXsgcmV0dXJuIGN1cnJlbnREYXRhWydxdWFydGlsZXMnXVt0b29sdGlwS2V5XSB9XG4gICAgXSlcblxuICB9XG5cbiAgcmV0dXJuIHZpb2xpblxufVxuXG5cblxuXG5cbi8qKlxuKiBQcm9kdWNlcyB0aGUgZnVuY3Rpb24gd2hpY2ggbWFuaXB1bGF0ZXMgdGhlIHZpb2xpbiBkYXRhIHRvIGhhdmUgdmFsdWVzIG5lZWRlZFxuKiBmb3IgcmVuZGVyaW5nIHRoZSB2aW9saW5zIGFzIHN2Zy5cbiogQHJldHVybnMge2Z1bmN0aW9ufSBjYWxjdWxhdGVWaW9saW5WYWx1ZXNcbiogQG5hbWVzcGFjZSBuZWVkZWRWaW9saW5WYWx1ZXNcbiovXG5mdW5jdGlvbiBuZWVkZWRWaW9saW5WYWx1ZXMoKSB7XG4gIHZhclxuICAvKipcbiAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgb3JpZW50YXRpb24gb2YgdGhlIHZpb2xpbnMgYXJlIGhvcml6b250YWxcbiAgKiAoc2VlIHtAbGluayB2aW9saW4jb3JpZW50fSlcbiAgKiBAcGFyYW0ge09iamVjdH0gW2hvcml6b250YWxRPXRydWVdXG4gICogQG1lbWJlcm9mIG5lZWRlZFZpb2xpblZhbHVlcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgaG9yaXpvbnRhbFEgPSB0cnVlLFxuICAvKipcbiAgKiBLZXlzIHRvIGJlIHB1dCBpbnRvIHRoZSBxdWFydGlsZXMgaWYgdGhleSBuZWVkIHRvIGJlIGNhbGN1bGF0ZWQuXG4gICogKHNlZSB7QGxpbmsgdmlvbGluI3F1YXJ0aWxlS2V5c30pXG4gICogQHBhcmFtIHtPYmplY3R9IFtxdWFydGlsZUtleXM9WydRMCcsICdRMScsICdRMicsICdRMycsICdRNCddXVxuICAqIEBtZW1iZXJvZiBuZWVkZWRWaW9saW5WYWx1ZXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHF1YXJ0aWxlS2V5cyA9IFsnUTAnLCAnUTEnLCAnUTInLCAnUTMnLCAnUTQnXSxcbiAgLyoqXG4gICogRnVuY3Rpb24gd2hpY2ggZ2l2ZW4gdGhlIGtleSBvZiB0aGUgdmlvbGluIGFuZCB0aGF0IGtleSdzIGFzc29jaWF0ZWQgdmFsdWVcbiAgKiByZXR1cm5zIHRoZSBvYmplY3QgY29uc2l0aW5nIG9mIHRoZSBwb2ludHMgb2YgdGhlIHZpb2xpblxuICAqIChzZWUge0BsaW5rIHZpb2xpbiN2aW9saW5Qb2ludHNFeHRyYWN0b3J9KVxuICAqIEBwYXJhbSB7T2JqZWN0fSBbdmlvbGluUG9pbnRzRXh0cmFjdG9yPWZ1bmN0aW9uKHZpb2xpbktleSwgdmlvbGluRGF0YSkgeyByZXR1cm4gdmlvbGluRGF0YS5wb2ludHMgfV1cbiAgKiBAbWVtYmVyb2YgbmVlZGVkVmlvbGluVmFsdWVzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB2aW9saW5Qb2ludHNFeHRyYWN0b3IsXG4gIC8qKlxuICAqIEZ1bmN0aW9uIHdoaWNoIGdpdmVuIHRoZSBrZXkgb2YgdGhlIGN1cnJlbnQgcG9pbnQgYW5kIHRoZSBvYmplY3Qgb2YgcG9pbnRzIGZvciB0aGVcbiAgKiB2aW9saW4sIHJldHVybnMgdGhlIG51bWVyaWNhbCB2YWx1ZSBvZiB0aGUgcG9pbnRcbiAgKiAoc2VlIHtAbGluayB2aW9saW4jdmlvbGluUG9pbnRWYWx1ZUV4dHJhY3Rvcn0pXG4gICogQHBhcmFtIHtPYmplY3R9IFt2aW9saW5Qb2ludFZhbHVlRXh0cmFjdG9yPWZ1bmN0aW9uKHZpb2xpblBvaW50S2V5LCB2aW9saW5Qb2ludERhdGEpIHsgcmV0dXJuIHZpb2xpblBvaW50RGF0YVt2aW9saW5Qb2ludEtleV0udmFsdWUgfV1cbiAgKiBAbWVtYmVyb2YgbmVlZGVkVmlvbGluVmFsdWVzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB2aW9saW5Qb2ludFZhbHVlRXh0cmFjdG9yXG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGhvcml6b250YWxRXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNvcmllbnR9KVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtjYWxjdWxhdGVWaW9saW5WYWx1ZXMgfCBib29sZWFufVxuICAgKiBAbWVtYmVyb2YgY2FsY3VsYXRlVmlvbGluVmFsdWVzXG4gICAqIEBwcm9wZXJ0eVxuICAgKlxuICAgKiBieSBkZWZhdWx0IGhvcml6b250YWxRID0gdHJ1ZVxuICAgKi9cbiAgY2FsY3VsYXRlVmlvbGluVmFsdWVzLmhvcml6b250YWxRID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChob3Jpem9udGFsUT1fLCBjYWxjdWxhdGVWaW9saW5WYWx1ZXMpIDogaG9yaXpvbnRhbFEgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHF1YXJ0aWxlS2V5c1xuICAgKiAoc2VlIHtAbGluayB2aW9saW4jcXVhcnRpbGVLZXlzfSlcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2NhbGN1bGF0ZVZpb2xpblZhbHVlcyB8IHN0cmluZ1tdfVxuICAgKiBAbWVtYmVyb2YgY2FsY3VsYXRlVmlvbGluVmFsdWVzXG4gICAqIEBwcm9wZXJ0eVxuICAgKlxuICAgKiBieSBkZWZhdWx0IHF1YXJ0aWxlS2V5cyA9IFtcIlEwXCIsXCJRMVwiLFwiUTJcIixcIlEzXCIsXCJRNFwiXVxuICAgKi9cbiAgY2FsY3VsYXRlVmlvbGluVmFsdWVzLnF1YXJ0aWxlS2V5cyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocXVhcnRpbGVLZXlzPV8sIGNhbGN1bGF0ZVZpb2xpblZhbHVlcykgOiBxdWFydGlsZUtleXMgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHZpb2xpblBvaW50c0V4dHJhY3RvclxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jdmlvbGluUG9pbnRzRXh0cmFjdG9yfSlcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2NhbGN1bGF0ZVZpb2xpblZhbHVlcyB8IGZ1bmN0aW9ufVxuICAgKiBAbWVtYmVyb2YgY2FsY3VsYXRlVmlvbGluVmFsdWVzXG4gICAqIEBwcm9wZXJ0eVxuICAgKlxuICAgKiBieSBkZWZhdWx0IHZpb2xpblBvaW50c0V4dHJhY3RvciA9IGZ1bmN0aW9uKHZpb2xpbktleSwgdmlvbGluRGF0YSkgeyByZXR1cm4gdmlvbGluRGF0YS5wb2ludHMgfVxuICAgKi9cbiAgY2FsY3VsYXRlVmlvbGluVmFsdWVzLnZpb2xpblBvaW50c0V4dHJhY3RvciA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmlvbGluUG9pbnRzRXh0cmFjdG9yPV8sIGNhbGN1bGF0ZVZpb2xpblZhbHVlcykgOiB2aW9saW5Qb2ludHNFeHRyYWN0b3IgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHZpb2xpblBvaW50VmFsdWVFeHRyYWN0b3JcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI3Zpb2xpblBvaW50VmFsdWVFeHRyYWN0b3J9KVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Y2FsY3VsYXRlVmlvbGluVmFsdWVzIHwgZnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiBjYWxjdWxhdGVWaW9saW5WYWx1ZXNcbiAgICogQHByb3BlcnR5XG4gICAqXG4gICAqIGJ5IGRlZmF1bHQgdmlvbGluUG9pbnRWYWx1ZUV4dHJhY3RvciA9IGZ1bmN0aW9uKHZpb2xpblBvaW50S2V5LCB2aW9saW5Qb2ludERhdGEpIHsgcmV0dXJuIHZpb2xpblBvaW50RGF0YVt2aW9saW5Qb2ludEtleV0udmFsdWUgfVxuICAgKi9cbiAgY2FsY3VsYXRlVmlvbGluVmFsdWVzLnZpb2xpblBvaW50VmFsdWVFeHRyYWN0b3IgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZpb2xpblBvaW50VmFsdWVFeHRyYWN0b3I9XywgY2FsY3VsYXRlVmlvbGluVmFsdWVzKSA6IHZpb2xpblBvaW50VmFsdWVFeHRyYWN0b3IgfVxuXG5cbiAgLyoqXG4gICogVGhlIGZ1bmN0aW9uIHByb2R1Y2VkIGJ5IG5lZWRlZFZpb2xpblZhbHVlcy5cbiAgKlxuICAqIEFkZHMgdGhlIGRhdGEgbmVlZCB0byByZW5kZXIgdGhlIHZpb2xpbiBhcyBhbiBzdmdcbiAgKiBAcGFyYW0ge3N0cmluZ30gdmlvbGluS2V5IHRoZSBrZXkgb2YgdGhlIGN1cnJlbnQgdmlvbGluXG4gICogQHBhcmFtIHtvYmplY3R9IGRhdGEgdGhlIG9iamVjdCBjb25zaXN0aW5nIG9mIHZpb2xpbktleSAtIHZhbHVlcyAodmlvbGluIGRhdGEpIHBhaXJzXG4gICogQHJldHVybnMge25vbmV9IHRoaXMgZnVuY3Rpb24gbWFuaXB1bGF0ZXMgdGhlIHBhc3NlZCBkYXRhIG9iamVjdCBhZGRpbmcgdGhlIGZvbGxvd2luZyBrZXlzXG4gICpcbiAgKiBkYXRhW3Zpb2xpbktleV0uYmlubmVkIC8vIHRoZSBiaW5uZWQgdmFsdWVzIG9mIHRoZSBwb2ludHNcbiAgKlxuICAqIGRhdGFbdmlvbGluS2V5XS5mcmVxdWVuY2llcyAvLyB0aGUgbGlzdCBjb25zaXN0aW5nIG9mIHRoZSBsZW5ndGggb2YgZWFjaCBiaW5cbiAgKlxuICAqIGRhdGFbdmlvbGluS2V5XS5jb250b3VyIC8vIHRoZSBwb2ludHMgZGVwaWN0aW5nIHRoZSBjb250b3VyIG9mIDEvMiBvZiB0aGUgdmlvbGluXG4gICpcbiAgKiBkYXRhW3Zpb2xpbktleV0ucXVhcnRpbGVzIC8vIHRoZSBxdWFydGlsZXMgb2YgdGhlIHBvaW50cycgdmFsdWVzXG4gICpcbiAgKiBkYXRhW3Zpb2xpbktleV0ucG9pbnRLZXlzIC8vIHRoZSBrZXlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcG9pbnRzXG4gICpcbiAgKiBkYXRhW3Zpb2xpbktleV0ucG9pbnRWYWx1ZXMgLy8gdGhlIG51bWVyaWNhbCB2YWx1ZXMgb2YgdGhlIHBvaW50c1xuICAqXG4gICogQG1lbWJlcm9mIG5lZWRlZFZpb2xpblZhbHVlcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZnVuY3Rpb24gY2FsY3VsYXRlVmlvbGluVmFsdWVzKHZpb2xpbktleSwgZGF0YSkge1xuICAgIC8vIGRhdGEgZm9yIHRoZSBjdXJyZW50IHZpb2xpblxuICAgIHZhciB2aW9saW5EYXRhID0gZGF0YVt2aW9saW5LZXldO1xuICAgIC8vIHRoZSBvYmplY3Qgb2YgcG9pbnRzXG4gICAgdmFyIHZpb2xpblBvaW50cyA9IHZpb2xpblBvaW50c0V4dHJhY3Rvcih2aW9saW5LZXksIHZpb2xpbkRhdGEpO1xuICAgIC8vXG4gICAgdmFyIHZpb2xpblBvaW50c0tleXMgPSBkMy5rZXlzKHZpb2xpblBvaW50cyk7XG4gICAgLy8gdGhlIG51bWVyaWNhbCB2YWx1ZXMgb2YgdGhvc2UgcG9pbnRzXG4gICAgdmFyIHZpb2xpblBvaW50c1ZhbHVlcyA9IHZpb2xpblBvaW50c0tleXMubWFwKGZ1bmN0aW9uKHBrLCBpKXtyZXR1cm4gdmlvbGluUG9pbnRzW3BrXS52YWx1ZX0pXG5cbiAgICAvLyBxdWFydGlsZXMgb2YgdGhvc2UgcG9pbnRzXG4gICAgdmFyIHBvaW50UXVhcnRpbGVzID0gcXVhcnRpbGVzKHZpb2xpblBvaW50c1ZhbHVlcywgcXVhcnRpbGVLZXlzKVxuXG4gICAgLy8gYmlubmVkIHBvaW50c1xuICAgIHZhciBiaW5uZWQgPSBkMy5oaXN0b2dyYW0oKSh2aW9saW5Qb2ludHNWYWx1ZXMpXG4gICAgLy8gbGVuZ3RoIG9mIGJpbnNcbiAgICB2YXIgZnJlcXVlbmNpZXMgPSBiaW5uZWQubWFwKGJpbj0+YmluLmxlbmd0aClcbiAgICAvLyBtaW4gYW5kIG1heCBjb3VudG91ciBwb2ludHMgZm9yIG5pY2UgZHJhd2luZ3NcbiAgICB2YXIgbWluQ29udG91clBvaW50ID0gaG9yaXpvbnRhbFEgPyB7eDogMCwgeTogZDMubWluKHZpb2xpblBvaW50c1ZhbHVlcyl9IDogIHt4OiBkMy5taW4odmlvbGluUG9pbnRzVmFsdWVzKSwgeTogMH1cbiAgICB2YXIgbWF4Q29udG91clBvaW50ID0gaG9yaXpvbnRhbFEgPyB7eDogMCwgeTogZDMubWF4KHZpb2xpblBvaW50c1ZhbHVlcyl9IDogIHt4OiBkMy5tYXgodmlvbGluUG9pbnRzVmFsdWVzKSwgeTogMH1cbiAgICB2YXIgdmlvbGluQ29udG91clBvaW50cyA9IGJpbm5lZC5tYXAoZnVuY3Rpb24oYmluLCBpKSB7XG4gICAgICAgIHJldHVybiBob3Jpem9udGFsUVxuICAgICAgICA/IHt5OiAoYmluLmxlbmd0aCkgPyBkMy5tZWRpYW4oYmluKTogZDMubWVkaWFuKFtiaW4ueDAsIGJpbi54MV0pLCB4OiBmcmVxdWVuY2llc1tpXX1cbiAgICAgICAgOiB7eDogKGJpbi5sZW5ndGgpID8gZDMubWVkaWFuKGJpbik6IGQzLm1lZGlhbihbYmluLngwLCBiaW4ueDFdKSwgeTogZnJlcXVlbmNpZXNbaV19XG4gICAgICB9KVxuICAgIC8vIHBvaW50cyBhbG9uZyB3aGljaCB0byBkcmF3IHRoZSB2aW9saW4gc2hwZVxuICAgIHZpb2xpbkNvbnRvdXJQb2ludHMgPSBbbWluQ29udG91clBvaW50XS5jb25jYXQodmlvbGluQ29udG91clBvaW50cykuY29uY2F0KFttYXhDb250b3VyUG9pbnRdKVxuXG4gICAgLy8gc2V0IGRhdGFcbiAgICB2aW9saW5EYXRhLmJpbm5lZCA9IGJpbm5lZDtcbiAgICB2aW9saW5EYXRhLmZyZXF1ZW5jaWVzID0gZnJlcXVlbmNpZXNcbiAgICB2aW9saW5EYXRhLmNvbnRvdXIgPSB2aW9saW5Db250b3VyUG9pbnRzXG4gICAgdmlvbGluRGF0YS5xdWFydGlsZXMgPSBwb2ludFF1YXJ0aWxlc1xuICAgIHZpb2xpbkRhdGEucG9pbnRLZXlzID0gdmlvbGluUG9pbnRzS2V5c1xuICAgIHZpb2xpbkRhdGEucG9pbnRWYWx1ZXMgPSB2aW9saW5Qb2ludHNWYWx1ZXNcbiAgfVxuXG4gIHJldHVybiBjYWxjdWxhdGVWaW9saW5WYWx1ZXNcbn1cbiIsImltcG9ydCB7aHlwZW5hdGUsIHNhZmVTZWxlY3R9IGZyb20gJy4vaGVscGVycyc7XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHBvaW50cyAoIHNlbGVjdGlvbiApIHtcbiAgdmFyXG4gIC8vIC8qKlxuICAvLyAqIERhdGEgdG8gcGxvdC4gQXNzdW1lZCB0byBiZSBhIG9iamVjdCwgd2hlcmUgZWFjaCBrZXkgY29ycmVzcG9uZHMgdG8gYSB2aW9saW5cbiAgLy8gKiAoc2VlIHtAbGluayBiYXIjZGF0YX0pXG4gIC8vICogQHBhcmFtIHtPYmplY3R9IFtkYXRhPXVuZGVmaW5lZF1cbiAgLy8gKiBAbWVtYmVyb2YgYmFyI1xuICAvLyAqIEBwcm9wZXJ0eVxuICAvLyAqL1xuICAvLyBkYXRhLFxuICAvLyAvKipcbiAgLy8gKiBXaGljaCBkaXJlY3Rpb24gdG8gcmVuZGVyIHRoZSBiYXJzIGluXG4gIC8vICogKHNlZSB7QGxpbmsgYmFyI29yaWVudH0pXG4gIC8vICogQHBhcmFtIHtudW1iZXJ9IFtvcmllbnQ9J2hvcml6b250YWwnXVxuICAvLyAqIEBtZW1iZXJvZiBiYXIjXG4gIC8vICogQHByb3BlcnR5XG4gIC8vICovXG4gIC8vIG9yaWVudD0naG9yaXpvbnRhbCcsXG4gIC8vIC8qKlxuICAvLyAqIFRoZSByYWRpdXMgb2YgYSBwb2ludFxuICAvLyAqIEBwYXJhbSB7bnVtYmVyfSBbcG9pbnRSYWRpdXM9M11cbiAgLy8gKiBAbWVtYmVyb2YgYmFyI1xuICAvLyAqIEBwcm9wZXJ0eVxuICAvLyAqL1xuICAvLyByYWRpdXMgPSAzLFxuICAvLyAvKipcbiAgLy8gKiBUaGUgc3Ryb2tlIHdpZHRoIG9mIHRoZSBvaW50c1xuICAvLyAqIEBwYXJhbSB7bnVtYmVyfSBbcG9pbnRTdHJva2VXaWR0aD0yXVxuICAvLyAqIEBtZW1iZXJvZiBiYXIjXG4gIC8vICogQHByb3BlcnR5XG4gIC8vICovXG4gIC8vIHN0cm9rZVdpZHRoID0gMixcbiAgLy8gLyoqXG4gIC8vICogTmFtZXNwYWNlIGZvciBhbGwgaXRlbXMgbWFkZSBieSB0aGlzIGluc3RhbmNlIG9mIGJhclxuICAvLyAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZXNwYWNlPVwiZDNzbS12aW9saW5cIl1cbiAgLy8gKiBAbWVtYmVyb2YgYmFyI1xuICAvLyAqIEBwcm9wZXJ0eVxuICAvLyAqL1xuICAvLyBuYW1lc3BhY2UgPSAnZDNzbS1wb2ludHMnLFxuICAvLyAvKipcbiAgLy8gKiBDbGFzcyBuYW1lIGZvciBiYXIgY29udGFpbmVyICg8Zz4gZWxlbWVudClcbiAgLy8gKiBAcGFyYW0ge3N0cmluZ30gW29iamVjdENsYXNzPVwidmlvbGluXCJdXG4gIC8vICogQG1lbWJlcm9mIGJhciNcbiAgLy8gKiBAcHJvcGVydHlcbiAgLy8gKi9cbiAgLy8gb2JqZWN0Q2xhc3MgPSAncG9pbnQnLFxuICAvLyAvKipcbiAgLy8gKiBEdXJhdGlvbiBvZiBhbGwgdHJhbnNpdGlvbnMgb2YgdGhpcyBlbGVtZW50XG4gIC8vICogQHBhcmFtIHtudW1iZXJ9IFt0cmFuc2l0aW9uRHVyYXRpb249MTAwMF1cbiAgLy8gKiBAbWVtYmVyb2YgYmFyI1xuICAvLyAqIEBwcm9wZXJ0eVxuICAvLyAqL1xuICAvLyB0cmFuc2l0aW9uRHVyYXRpb24gPSAxMDAwLFxuICAvLyAvKipcbiAgLy8gKiBFYXNpbmcgZnVuY3Rpb24gZm9yIHRyYW5zaXRpb25zXG4gIC8vICogQHBhcmFtIHtkMy5lYXNlfSBbZWFzZUZ1bmM9ZDMuZWFzZUV4cF1cbiAgLy8gKiBAbWVtYmVyb2YgYmFyI1xuICAvLyAqIEBwcm9wZXJ0eVxuICAvLyAqL1xuICAvLyBlYXNlRnVuYyA9IGQzLmVhc2VFeHAsXG4gIC8vIC8qKlxuICAvLyAqIFRoZSBvYmplY3RTaXplIChhY3R1YWwgd2lkdGgpIHVzZWQgYnkgdGhlIGJhcnNcbiAgLy8gKiBAcGFyYW0ge251bWJlcn0gW29iamVjdFNpemU9dW5kZWZpbmVkXVxuICAvLyAqIEBtZW1iZXJvZiBiYXIjXG4gIC8vICogQHByb3BlcnR5XG4gIC8vICovXG4gIC8vIG9iamVjdFNpemUsXG5cbiAga2V5RXh0cmFjdG9yID0gZnVuY3Rpb24oZCwgaSkgeyBjb25zb2xlLmxvZyhkKSB9LFxuICB2YWx1ZUV4dHJhY3RvciA9IGZ1bmN0aW9uKGQsIGkpIHsgfVxuXG5cbiAgZnVuY3Rpb24gcG9pbnRzKCkge1xuICAgIC8vIHZhciBwdHNDb250YWluZXJzID0gc2VsZWN0aW9uLnNlbGVjdEFsbCgnLicrb2JqZWN0Q2xhc3MpXG4gICAgdmFyIHB0c0NvbnRhaW5lcnMgPSBzZWxlY3Rpb24uc2VsZWN0QWxsKCcuYm93LXdoaXNrJylcbiAgICBjb25zb2xlLmxvZyhwdHNDb250YWluZXJzLm5vZGVzKCkpXG5cbiAgICBwdHNDb250YWluZXJzLmVhY2goZnVuY3Rpb24oZCwgaSl7XG4gICAgICB2YXIgdCA9IGQzLnNlbGVjdCh0aGlzKSxcbiAgICAgIHB0c0NvbnRhaW5lciA9IHNhZmVTZWxlY3QodCwgJ2cnLCAncG9pbnRzJyksXG4gICAgICBwdHMgPSBwdHNDb250YWluZXIuc2VsZWN0QWxsKCcucG9pbnQnKS5kYXRhKCBrZXlFeHRyYWN0b3IoZCkgKVxuXG5cbiAgICAgIHZhciBwdHNFeGl0ID0gcHRzLmV4aXQoKVxuICAgICAgdmFyIHB0c0VudGVyID0gcHRzLmVudGVyKCkuYXBwZW5kKCdjaXJjbGUnKS5hdHRyKCdjbGFzcycsICdwb2ludCcpXG5cbiAgICAgIHB0cyA9IHB0cy5tZXJnZShwdHNFbnRlcilcblxuICAgIH0pXG4gIH1cbiAgcmV0dXJuIHBvaW50c1xufVxuIiwiLyoqXG4gKiBIZWxwZXJzLlxuICovXG5cbnZhciBzID0gMTAwMDtcbnZhciBtID0gcyAqIDYwO1xudmFyIGggPSBtICogNjA7XG52YXIgZCA9IGggKiAyNDtcbnZhciB5ID0gZCAqIDM2NS4yNTtcblxuLyoqXG4gKiBQYXJzZSBvciBmb3JtYXQgdGhlIGdpdmVuIGB2YWxgLlxuICpcbiAqIE9wdGlvbnM6XG4gKlxuICogIC0gYGxvbmdgIHZlcmJvc2UgZm9ybWF0dGluZyBbZmFsc2VdXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSB2YWxcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEB0aHJvd3Mge0Vycm9yfSB0aHJvdyBhbiBlcnJvciBpZiB2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIG51bWJlclxuICogQHJldHVybiB7U3RyaW5nfE51bWJlcn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbih2YWwsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbDtcbiAgaWYgKHR5cGUgPT09ICdzdHJpbmcnICYmIHZhbC5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHBhcnNlKHZhbCk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgaXNOYU4odmFsKSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5sb25nID8gZm10TG9uZyh2YWwpIDogZm10U2hvcnQodmFsKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgJ3ZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgdmFsaWQgbnVtYmVyLiB2YWw9JyArXG4gICAgICBKU09OLnN0cmluZ2lmeSh2YWwpXG4gICk7XG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBgc3RyYCBhbmQgcmV0dXJuIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZShzdHIpIHtcbiAgc3RyID0gU3RyaW5nKHN0cik7XG4gIGlmIChzdHIubGVuZ3RoID4gMTAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBtYXRjaCA9IC9eKCg/OlxcZCspP1xcLj9cXGQrKSAqKG1pbGxpc2Vjb25kcz98bXNlY3M/fG1zfHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8eWVhcnM/fHlycz98eSk/JC9pLmV4ZWMoXG4gICAgc3RyXG4gICk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG4gPSBwYXJzZUZsb2F0KG1hdGNoWzFdKTtcbiAgdmFyIHR5cGUgPSAobWF0Y2hbMl0gfHwgJ21zJykudG9Mb3dlckNhc2UoKTtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAneWVhcnMnOlxuICAgIGNhc2UgJ3llYXInOlxuICAgIGNhc2UgJ3lycyc6XG4gICAgY2FzZSAneXInOlxuICAgIGNhc2UgJ3knOlxuICAgICAgcmV0dXJuIG4gKiB5O1xuICAgIGNhc2UgJ2RheXMnOlxuICAgIGNhc2UgJ2RheSc6XG4gICAgY2FzZSAnZCc6XG4gICAgICByZXR1cm4gbiAqIGQ7XG4gICAgY2FzZSAnaG91cnMnOlxuICAgIGNhc2UgJ2hvdXInOlxuICAgIGNhc2UgJ2hycyc6XG4gICAgY2FzZSAnaHInOlxuICAgIGNhc2UgJ2gnOlxuICAgICAgcmV0dXJuIG4gKiBoO1xuICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgY2FzZSAnbWlucyc6XG4gICAgY2FzZSAnbWluJzpcbiAgICBjYXNlICdtJzpcbiAgICAgIHJldHVybiBuICogbTtcbiAgICBjYXNlICdzZWNvbmRzJzpcbiAgICBjYXNlICdzZWNvbmQnOlxuICAgIGNhc2UgJ3NlY3MnOlxuICAgIGNhc2UgJ3NlYyc6XG4gICAgY2FzZSAncyc6XG4gICAgICByZXR1cm4gbiAqIHM7XG4gICAgY2FzZSAnbWlsbGlzZWNvbmRzJzpcbiAgICBjYXNlICdtaWxsaXNlY29uZCc6XG4gICAgY2FzZSAnbXNlY3MnOlxuICAgIGNhc2UgJ21zZWMnOlxuICAgIGNhc2UgJ21zJzpcbiAgICAgIHJldHVybiBuO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogU2hvcnQgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZm10U2hvcnQobXMpIHtcbiAgaWYgKG1zID49IGQpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGQpICsgJ2QnO1xuICB9XG4gIGlmIChtcyA+PSBoKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBoKSArICdoJztcbiAgfVxuICBpZiAobXMgPj0gbSkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbSkgKyAnbSc7XG4gIH1cbiAgaWYgKG1zID49IHMpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIHMpICsgJ3MnO1xuICB9XG4gIHJldHVybiBtcyArICdtcyc7XG59XG5cbi8qKlxuICogTG9uZyBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRMb25nKG1zKSB7XG4gIHJldHVybiBwbHVyYWwobXMsIGQsICdkYXknKSB8fFxuICAgIHBsdXJhbChtcywgaCwgJ2hvdXInKSB8fFxuICAgIHBsdXJhbChtcywgbSwgJ21pbnV0ZScpIHx8XG4gICAgcGx1cmFsKG1zLCBzLCAnc2Vjb25kJykgfHxcbiAgICBtcyArICcgbXMnO1xufVxuXG4vKipcbiAqIFBsdXJhbGl6YXRpb24gaGVscGVyLlxuICovXG5cbmZ1bmN0aW9uIHBsdXJhbChtcywgbiwgbmFtZSkge1xuICBpZiAobXMgPCBuKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChtcyA8IG4gKiAxLjUpIHtcbiAgICByZXR1cm4gTWF0aC5mbG9vcihtcyAvIG4pICsgJyAnICsgbmFtZTtcbiAgfVxuICByZXR1cm4gTWF0aC5jZWlsKG1zIC8gbikgKyAnICcgKyBuYW1lICsgJ3MnO1xufVxuIiwiXG4vKipcbiAqIFRoaXMgaXMgdGhlIGNvbW1vbiBsb2dpYyBmb3IgYm90aCB0aGUgTm9kZS5qcyBhbmQgd2ViIGJyb3dzZXJcbiAqIGltcGxlbWVudGF0aW9ucyBvZiBgZGVidWcoKWAuXG4gKlxuICogRXhwb3NlIGBkZWJ1ZygpYCBhcyB0aGUgbW9kdWxlLlxuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZURlYnVnLmRlYnVnID0gY3JlYXRlRGVidWdbJ2RlZmF1bHQnXSA9IGNyZWF0ZURlYnVnO1xuZXhwb3J0cy5jb2VyY2UgPSBjb2VyY2U7XG5leHBvcnRzLmRpc2FibGUgPSBkaXNhYmxlO1xuZXhwb3J0cy5lbmFibGUgPSBlbmFibGU7XG5leHBvcnRzLmVuYWJsZWQgPSBlbmFibGVkO1xuZXhwb3J0cy5odW1hbml6ZSA9IHJlcXVpcmUoJ21zJyk7XG5cbi8qKlxuICogQWN0aXZlIGBkZWJ1Z2AgaW5zdGFuY2VzLlxuICovXG5leHBvcnRzLmluc3RhbmNlcyA9IFtdO1xuXG4vKipcbiAqIFRoZSBjdXJyZW50bHkgYWN0aXZlIGRlYnVnIG1vZGUgbmFtZXMsIGFuZCBuYW1lcyB0byBza2lwLlxuICovXG5cbmV4cG9ydHMubmFtZXMgPSBbXTtcbmV4cG9ydHMuc2tpcHMgPSBbXTtcblxuLyoqXG4gKiBNYXAgb2Ygc3BlY2lhbCBcIiVuXCIgaGFuZGxpbmcgZnVuY3Rpb25zLCBmb3IgdGhlIGRlYnVnIFwiZm9ybWF0XCIgYXJndW1lbnQuXG4gKlxuICogVmFsaWQga2V5IG5hbWVzIGFyZSBhIHNpbmdsZSwgbG93ZXIgb3IgdXBwZXItY2FzZSBsZXR0ZXIsIGkuZS4gXCJuXCIgYW5kIFwiTlwiLlxuICovXG5cbmV4cG9ydHMuZm9ybWF0dGVycyA9IHt9O1xuXG4vKipcbiAqIFNlbGVjdCBhIGNvbG9yLlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZVxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc2VsZWN0Q29sb3IobmFtZXNwYWNlKSB7XG4gIHZhciBoYXNoID0gMCwgaTtcblxuICBmb3IgKGkgaW4gbmFtZXNwYWNlKSB7XG4gICAgaGFzaCAgPSAoKGhhc2ggPDwgNSkgLSBoYXNoKSArIG5hbWVzcGFjZS5jaGFyQ29kZUF0KGkpO1xuICAgIGhhc2ggfD0gMDsgLy8gQ29udmVydCB0byAzMmJpdCBpbnRlZ2VyXG4gIH1cblxuICByZXR1cm4gZXhwb3J0cy5jb2xvcnNbTWF0aC5hYnMoaGFzaCkgJSBleHBvcnRzLmNvbG9ycy5sZW5ndGhdO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGRlYnVnZ2VyIHdpdGggdGhlIGdpdmVuIGBuYW1lc3BhY2VgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVEZWJ1ZyhuYW1lc3BhY2UpIHtcblxuICB2YXIgcHJldlRpbWU7XG5cbiAgZnVuY3Rpb24gZGVidWcoKSB7XG4gICAgLy8gZGlzYWJsZWQ/XG4gICAgaWYgKCFkZWJ1Zy5lbmFibGVkKSByZXR1cm47XG5cbiAgICB2YXIgc2VsZiA9IGRlYnVnO1xuXG4gICAgLy8gc2V0IGBkaWZmYCB0aW1lc3RhbXBcbiAgICB2YXIgY3VyciA9ICtuZXcgRGF0ZSgpO1xuICAgIHZhciBtcyA9IGN1cnIgLSAocHJldlRpbWUgfHwgY3Vycik7XG4gICAgc2VsZi5kaWZmID0gbXM7XG4gICAgc2VsZi5wcmV2ID0gcHJldlRpbWU7XG4gICAgc2VsZi5jdXJyID0gY3VycjtcbiAgICBwcmV2VGltZSA9IGN1cnI7XG5cbiAgICAvLyB0dXJuIHRoZSBgYXJndW1lbnRzYCBpbnRvIGEgcHJvcGVyIEFycmF5XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2ldO1xuICAgIH1cblxuICAgIGFyZ3NbMF0gPSBleHBvcnRzLmNvZXJjZShhcmdzWzBdKTtcblxuICAgIGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIGFyZ3NbMF0pIHtcbiAgICAgIC8vIGFueXRoaW5nIGVsc2UgbGV0J3MgaW5zcGVjdCB3aXRoICVPXG4gICAgICBhcmdzLnVuc2hpZnQoJyVPJyk7XG4gICAgfVxuXG4gICAgLy8gYXBwbHkgYW55IGBmb3JtYXR0ZXJzYCB0cmFuc2Zvcm1hdGlvbnNcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIGFyZ3NbMF0gPSBhcmdzWzBdLnJlcGxhY2UoLyUoW2EtekEtWiVdKS9nLCBmdW5jdGlvbihtYXRjaCwgZm9ybWF0KSB7XG4gICAgICAvLyBpZiB3ZSBlbmNvdW50ZXIgYW4gZXNjYXBlZCAlIHRoZW4gZG9uJ3QgaW5jcmVhc2UgdGhlIGFycmF5IGluZGV4XG4gICAgICBpZiAobWF0Y2ggPT09ICclJScpIHJldHVybiBtYXRjaDtcbiAgICAgIGluZGV4Kys7XG4gICAgICB2YXIgZm9ybWF0dGVyID0gZXhwb3J0cy5mb3JtYXR0ZXJzW2Zvcm1hdF07XG4gICAgICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGZvcm1hdHRlcikge1xuICAgICAgICB2YXIgdmFsID0gYXJnc1tpbmRleF07XG4gICAgICAgIG1hdGNoID0gZm9ybWF0dGVyLmNhbGwoc2VsZiwgdmFsKTtcblxuICAgICAgICAvLyBub3cgd2UgbmVlZCB0byByZW1vdmUgYGFyZ3NbaW5kZXhdYCBzaW5jZSBpdCdzIGlubGluZWQgaW4gdGhlIGBmb3JtYXRgXG4gICAgICAgIGFyZ3Muc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgaW5kZXgtLTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtYXRjaDtcbiAgICB9KTtcblxuICAgIC8vIGFwcGx5IGVudi1zcGVjaWZpYyBmb3JtYXR0aW5nIChjb2xvcnMsIGV0Yy4pXG4gICAgZXhwb3J0cy5mb3JtYXRBcmdzLmNhbGwoc2VsZiwgYXJncyk7XG5cbiAgICB2YXIgbG9nRm4gPSBkZWJ1Zy5sb2cgfHwgZXhwb3J0cy5sb2cgfHwgY29uc29sZS5sb2cuYmluZChjb25zb2xlKTtcbiAgICBsb2dGbi5hcHBseShzZWxmLCBhcmdzKTtcbiAgfVxuXG4gIGRlYnVnLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcbiAgZGVidWcuZW5hYmxlZCA9IGV4cG9ydHMuZW5hYmxlZChuYW1lc3BhY2UpO1xuICBkZWJ1Zy51c2VDb2xvcnMgPSBleHBvcnRzLnVzZUNvbG9ycygpO1xuICBkZWJ1Zy5jb2xvciA9IHNlbGVjdENvbG9yKG5hbWVzcGFjZSk7XG4gIGRlYnVnLmRlc3Ryb3kgPSBkZXN0cm95O1xuXG4gIC8vIGVudi1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBsb2dpYyBmb3IgZGVidWcgaW5zdGFuY2VzXG4gIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2YgZXhwb3J0cy5pbml0KSB7XG4gICAgZXhwb3J0cy5pbml0KGRlYnVnKTtcbiAgfVxuXG4gIGV4cG9ydHMuaW5zdGFuY2VzLnB1c2goZGVidWcpO1xuXG4gIHJldHVybiBkZWJ1Zztcbn1cblxuZnVuY3Rpb24gZGVzdHJveSAoKSB7XG4gIHZhciBpbmRleCA9IGV4cG9ydHMuaW5zdGFuY2VzLmluZGV4T2YodGhpcyk7XG4gIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICBleHBvcnRzLmluc3RhbmNlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIEVuYWJsZXMgYSBkZWJ1ZyBtb2RlIGJ5IG5hbWVzcGFjZXMuIFRoaXMgY2FuIGluY2x1ZGUgbW9kZXNcbiAqIHNlcGFyYXRlZCBieSBhIGNvbG9uIGFuZCB3aWxkY2FyZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZW5hYmxlKG5hbWVzcGFjZXMpIHtcbiAgZXhwb3J0cy5zYXZlKG5hbWVzcGFjZXMpO1xuXG4gIGV4cG9ydHMubmFtZXMgPSBbXTtcbiAgZXhwb3J0cy5za2lwcyA9IFtdO1xuXG4gIHZhciBpO1xuICB2YXIgc3BsaXQgPSAodHlwZW9mIG5hbWVzcGFjZXMgPT09ICdzdHJpbmcnID8gbmFtZXNwYWNlcyA6ICcnKS5zcGxpdCgvW1xccyxdKy8pO1xuICB2YXIgbGVuID0gc3BsaXQubGVuZ3RoO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGlmICghc3BsaXRbaV0pIGNvbnRpbnVlOyAvLyBpZ25vcmUgZW1wdHkgc3RyaW5nc1xuICAgIG5hbWVzcGFjZXMgPSBzcGxpdFtpXS5yZXBsYWNlKC9cXCovZywgJy4qPycpO1xuICAgIGlmIChuYW1lc3BhY2VzWzBdID09PSAnLScpIHtcbiAgICAgIGV4cG9ydHMuc2tpcHMucHVzaChuZXcgUmVnRXhwKCdeJyArIG5hbWVzcGFjZXMuc3Vic3RyKDEpICsgJyQnKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4cG9ydHMubmFtZXMucHVzaChuZXcgUmVnRXhwKCdeJyArIG5hbWVzcGFjZXMgKyAnJCcpKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGkgPSAwOyBpIDwgZXhwb3J0cy5pbnN0YW5jZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBleHBvcnRzLmluc3RhbmNlc1tpXTtcbiAgICBpbnN0YW5jZS5lbmFibGVkID0gZXhwb3J0cy5lbmFibGVkKGluc3RhbmNlLm5hbWVzcGFjZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEaXNhYmxlIGRlYnVnIG91dHB1dC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGRpc2FibGUoKSB7XG4gIGV4cG9ydHMuZW5hYmxlKCcnKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIG1vZGUgbmFtZSBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGVuYWJsZWQobmFtZSkge1xuICBpZiAobmFtZVtuYW1lLmxlbmd0aCAtIDFdID09PSAnKicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgaSwgbGVuO1xuICBmb3IgKGkgPSAwLCBsZW4gPSBleHBvcnRzLnNraXBzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKGV4cG9ydHMuc2tpcHNbaV0udGVzdChuYW1lKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBmb3IgKGkgPSAwLCBsZW4gPSBleHBvcnRzLm5hbWVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKGV4cG9ydHMubmFtZXNbaV0udGVzdChuYW1lKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDb2VyY2UgYHZhbGAuXG4gKlxuICogQHBhcmFtIHtNaXhlZH0gdmFsXG4gKiBAcmV0dXJuIHtNaXhlZH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNvZXJjZSh2YWwpIHtcbiAgaWYgKHZhbCBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gdmFsLnN0YWNrIHx8IHZhbC5tZXNzYWdlO1xuICByZXR1cm4gdmFsO1xufVxuIiwiLyoqXG4gKiBUaGlzIGlzIHRoZSB3ZWIgYnJvd3NlciBpbXBsZW1lbnRhdGlvbiBvZiBgZGVidWcoKWAuXG4gKlxuICogRXhwb3NlIGBkZWJ1ZygpYCBhcyB0aGUgbW9kdWxlLlxuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZGVidWcnKTtcbmV4cG9ydHMubG9nID0gbG9nO1xuZXhwb3J0cy5mb3JtYXRBcmdzID0gZm9ybWF0QXJncztcbmV4cG9ydHMuc2F2ZSA9IHNhdmU7XG5leHBvcnRzLmxvYWQgPSBsb2FkO1xuZXhwb3J0cy51c2VDb2xvcnMgPSB1c2VDb2xvcnM7XG5leHBvcnRzLnN0b3JhZ2UgPSAndW5kZWZpbmVkJyAhPSB0eXBlb2YgY2hyb21lXG4gICAgICAgICAgICAgICAmJiAndW5kZWZpbmVkJyAhPSB0eXBlb2YgY2hyb21lLnN0b3JhZ2VcbiAgICAgICAgICAgICAgICAgID8gY2hyb21lLnN0b3JhZ2UubG9jYWxcbiAgICAgICAgICAgICAgICAgIDogbG9jYWxzdG9yYWdlKCk7XG5cbi8qKlxuICogQ29sb3JzLlxuICovXG5cbmV4cG9ydHMuY29sb3JzID0gW1xuICAnIzAwMDBDQycsICcjMDAwMEZGJywgJyMwMDMzQ0MnLCAnIzAwMzNGRicsICcjMDA2NkNDJywgJyMwMDY2RkYnLCAnIzAwOTlDQycsXG4gICcjMDA5OUZGJywgJyMwMENDMDAnLCAnIzAwQ0MzMycsICcjMDBDQzY2JywgJyMwMENDOTknLCAnIzAwQ0NDQycsICcjMDBDQ0ZGJyxcbiAgJyMzMzAwQ0MnLCAnIzMzMDBGRicsICcjMzMzM0NDJywgJyMzMzMzRkYnLCAnIzMzNjZDQycsICcjMzM2NkZGJywgJyMzMzk5Q0MnLFxuICAnIzMzOTlGRicsICcjMzNDQzAwJywgJyMzM0NDMzMnLCAnIzMzQ0M2NicsICcjMzNDQzk5JywgJyMzM0NDQ0MnLCAnIzMzQ0NGRicsXG4gICcjNjYwMENDJywgJyM2NjAwRkYnLCAnIzY2MzNDQycsICcjNjYzM0ZGJywgJyM2NkNDMDAnLCAnIzY2Q0MzMycsICcjOTkwMENDJyxcbiAgJyM5OTAwRkYnLCAnIzk5MzNDQycsICcjOTkzM0ZGJywgJyM5OUNDMDAnLCAnIzk5Q0MzMycsICcjQ0MwMDAwJywgJyNDQzAwMzMnLFxuICAnI0NDMDA2NicsICcjQ0MwMDk5JywgJyNDQzAwQ0MnLCAnI0NDMDBGRicsICcjQ0MzMzAwJywgJyNDQzMzMzMnLCAnI0NDMzM2NicsXG4gICcjQ0MzMzk5JywgJyNDQzMzQ0MnLCAnI0NDMzNGRicsICcjQ0M2NjAwJywgJyNDQzY2MzMnLCAnI0NDOTkwMCcsICcjQ0M5OTMzJyxcbiAgJyNDQ0NDMDAnLCAnI0NDQ0MzMycsICcjRkYwMDAwJywgJyNGRjAwMzMnLCAnI0ZGMDA2NicsICcjRkYwMDk5JywgJyNGRjAwQ0MnLFxuICAnI0ZGMDBGRicsICcjRkYzMzAwJywgJyNGRjMzMzMnLCAnI0ZGMzM2NicsICcjRkYzMzk5JywgJyNGRjMzQ0MnLCAnI0ZGMzNGRicsXG4gICcjRkY2NjAwJywgJyNGRjY2MzMnLCAnI0ZGOTkwMCcsICcjRkY5OTMzJywgJyNGRkNDMDAnLCAnI0ZGQ0MzMydcbl07XG5cbi8qKlxuICogQ3VycmVudGx5IG9ubHkgV2ViS2l0LWJhc2VkIFdlYiBJbnNwZWN0b3JzLCBGaXJlZm94ID49IHYzMSxcbiAqIGFuZCB0aGUgRmlyZWJ1ZyBleHRlbnNpb24gKGFueSBGaXJlZm94IHZlcnNpb24pIGFyZSBrbm93blxuICogdG8gc3VwcG9ydCBcIiVjXCIgQ1NTIGN1c3RvbWl6YXRpb25zLlxuICpcbiAqIFRPRE86IGFkZCBhIGBsb2NhbFN0b3JhZ2VgIHZhcmlhYmxlIHRvIGV4cGxpY2l0bHkgZW5hYmxlL2Rpc2FibGUgY29sb3JzXG4gKi9cblxuZnVuY3Rpb24gdXNlQ29sb3JzKCkge1xuICAvLyBOQjogSW4gYW4gRWxlY3Ryb24gcHJlbG9hZCBzY3JpcHQsIGRvY3VtZW50IHdpbGwgYmUgZGVmaW5lZCBidXQgbm90IGZ1bGx5XG4gIC8vIGluaXRpYWxpemVkLiBTaW5jZSB3ZSBrbm93IHdlJ3JlIGluIENocm9tZSwgd2UnbGwganVzdCBkZXRlY3QgdGhpcyBjYXNlXG4gIC8vIGV4cGxpY2l0bHlcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5wcm9jZXNzICYmIHdpbmRvdy5wcm9jZXNzLnR5cGUgPT09ICdyZW5kZXJlcicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIEludGVybmV0IEV4cGxvcmVyIGFuZCBFZGdlIGRvIG5vdCBzdXBwb3J0IGNvbG9ycy5cbiAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC8oZWRnZXx0cmlkZW50KVxcLyhcXGQrKS8pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gaXMgd2Via2l0PyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xNjQ1OTYwNi8zNzY3NzNcbiAgLy8gZG9jdW1lbnQgaXMgdW5kZWZpbmVkIGluIHJlYWN0LW5hdGl2ZTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0LW5hdGl2ZS9wdWxsLzE2MzJcbiAgcmV0dXJuICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLldlYmtpdEFwcGVhcmFuY2UpIHx8XG4gICAgLy8gaXMgZmlyZWJ1Zz8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzk4MTIwLzM3Njc3M1xuICAgICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuY29uc29sZSAmJiAod2luZG93LmNvbnNvbGUuZmlyZWJ1ZyB8fCAod2luZG93LmNvbnNvbGUuZXhjZXB0aW9uICYmIHdpbmRvdy5jb25zb2xlLnRhYmxlKSkpIHx8XG4gICAgLy8gaXMgZmlyZWZveCA+PSB2MzE/XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9Ub29scy9XZWJfQ29uc29sZSNTdHlsaW5nX21lc3NhZ2VzXG4gICAgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9maXJlZm94XFwvKFxcZCspLykgJiYgcGFyc2VJbnQoUmVnRXhwLiQxLCAxMCkgPj0gMzEpIHx8XG4gICAgLy8gZG91YmxlIGNoZWNrIHdlYmtpdCBpbiB1c2VyQWdlbnQganVzdCBpbiBjYXNlIHdlIGFyZSBpbiBhIHdvcmtlclxuICAgICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvYXBwbGV3ZWJraXRcXC8oXFxkKykvKSk7XG59XG5cbi8qKlxuICogTWFwICVqIHRvIGBKU09OLnN0cmluZ2lmeSgpYCwgc2luY2Ugbm8gV2ViIEluc3BlY3RvcnMgZG8gdGhhdCBieSBkZWZhdWx0LlxuICovXG5cbmV4cG9ydHMuZm9ybWF0dGVycy5qID0gZnVuY3Rpb24odikge1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuICdbVW5leHBlY3RlZEpTT05QYXJzZUVycm9yXTogJyArIGVyci5tZXNzYWdlO1xuICB9XG59O1xuXG5cbi8qKlxuICogQ29sb3JpemUgbG9nIGFyZ3VtZW50cyBpZiBlbmFibGVkLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZm9ybWF0QXJncyhhcmdzKSB7XG4gIHZhciB1c2VDb2xvcnMgPSB0aGlzLnVzZUNvbG9ycztcblxuICBhcmdzWzBdID0gKHVzZUNvbG9ycyA/ICclYycgOiAnJylcbiAgICArIHRoaXMubmFtZXNwYWNlXG4gICAgKyAodXNlQ29sb3JzID8gJyAlYycgOiAnICcpXG4gICAgKyBhcmdzWzBdXG4gICAgKyAodXNlQ29sb3JzID8gJyVjICcgOiAnICcpXG4gICAgKyAnKycgKyBleHBvcnRzLmh1bWFuaXplKHRoaXMuZGlmZik7XG5cbiAgaWYgKCF1c2VDb2xvcnMpIHJldHVybjtcblxuICB2YXIgYyA9ICdjb2xvcjogJyArIHRoaXMuY29sb3I7XG4gIGFyZ3Muc3BsaWNlKDEsIDAsIGMsICdjb2xvcjogaW5oZXJpdCcpXG5cbiAgLy8gdGhlIGZpbmFsIFwiJWNcIiBpcyBzb21ld2hhdCB0cmlja3ksIGJlY2F1c2UgdGhlcmUgY291bGQgYmUgb3RoZXJcbiAgLy8gYXJndW1lbnRzIHBhc3NlZCBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIHRoZSAlYywgc28gd2UgbmVlZCB0b1xuICAvLyBmaWd1cmUgb3V0IHRoZSBjb3JyZWN0IGluZGV4IHRvIGluc2VydCB0aGUgQ1NTIGludG9cbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxhc3RDID0gMDtcbiAgYXJnc1swXS5yZXBsYWNlKC8lW2EtekEtWiVdL2csIGZ1bmN0aW9uKG1hdGNoKSB7XG4gICAgaWYgKCclJScgPT09IG1hdGNoKSByZXR1cm47XG4gICAgaW5kZXgrKztcbiAgICBpZiAoJyVjJyA9PT0gbWF0Y2gpIHtcbiAgICAgIC8vIHdlIG9ubHkgYXJlIGludGVyZXN0ZWQgaW4gdGhlICpsYXN0KiAlY1xuICAgICAgLy8gKHRoZSB1c2VyIG1heSBoYXZlIHByb3ZpZGVkIHRoZWlyIG93bilcbiAgICAgIGxhc3RDID0gaW5kZXg7XG4gICAgfVxuICB9KTtcblxuICBhcmdzLnNwbGljZShsYXN0QywgMCwgYyk7XG59XG5cbi8qKlxuICogSW52b2tlcyBgY29uc29sZS5sb2coKWAgd2hlbiBhdmFpbGFibGUuXG4gKiBOby1vcCB3aGVuIGBjb25zb2xlLmxvZ2AgaXMgbm90IGEgXCJmdW5jdGlvblwiLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gbG9nKCkge1xuICAvLyB0aGlzIGhhY2tlcnkgaXMgcmVxdWlyZWQgZm9yIElFOC85LCB3aGVyZVxuICAvLyB0aGUgYGNvbnNvbGUubG9nYCBmdW5jdGlvbiBkb2Vzbid0IGhhdmUgJ2FwcGx5J1xuICByZXR1cm4gJ29iamVjdCcgPT09IHR5cGVvZiBjb25zb2xlXG4gICAgJiYgY29uc29sZS5sb2dcbiAgICAmJiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChjb25zb2xlLmxvZywgY29uc29sZSwgYXJndW1lbnRzKTtcbn1cblxuLyoqXG4gKiBTYXZlIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc2F2ZShuYW1lc3BhY2VzKSB7XG4gIHRyeSB7XG4gICAgaWYgKG51bGwgPT0gbmFtZXNwYWNlcykge1xuICAgICAgZXhwb3J0cy5zdG9yYWdlLnJlbW92ZUl0ZW0oJ2RlYnVnJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4cG9ydHMuc3RvcmFnZS5kZWJ1ZyA9IG5hbWVzcGFjZXM7XG4gICAgfVxuICB9IGNhdGNoKGUpIHt9XG59XG5cbi8qKlxuICogTG9hZCBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHJldHVybiB7U3RyaW5nfSByZXR1cm5zIHRoZSBwcmV2aW91c2x5IHBlcnNpc3RlZCBkZWJ1ZyBtb2Rlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbG9hZCgpIHtcbiAgdmFyIHI7XG4gIHRyeSB7XG4gICAgciA9IGV4cG9ydHMuc3RvcmFnZS5kZWJ1ZztcbiAgfSBjYXRjaChlKSB7fVxuXG4gIC8vIElmIGRlYnVnIGlzbid0IHNldCBpbiBMUywgYW5kIHdlJ3JlIGluIEVsZWN0cm9uLCB0cnkgdG8gbG9hZCAkREVCVUdcbiAgaWYgKCFyICYmIHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiAnZW52JyBpbiBwcm9jZXNzKSB7XG4gICAgciA9IHByb2Nlc3MuZW52LkRFQlVHO1xuICB9XG5cbiAgcmV0dXJuIHI7XG59XG5cbi8qKlxuICogRW5hYmxlIG5hbWVzcGFjZXMgbGlzdGVkIGluIGBsb2NhbFN0b3JhZ2UuZGVidWdgIGluaXRpYWxseS5cbiAqL1xuXG5leHBvcnRzLmVuYWJsZShsb2FkKCkpO1xuXG4vKipcbiAqIExvY2Fsc3RvcmFnZSBhdHRlbXB0cyB0byByZXR1cm4gdGhlIGxvY2Fsc3RvcmFnZS5cbiAqXG4gKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNhZmFyaSB0aHJvd3NcbiAqIHdoZW4gYSB1c2VyIGRpc2FibGVzIGNvb2tpZXMvbG9jYWxzdG9yYWdlXG4gKiBhbmQgeW91IGF0dGVtcHQgdG8gYWNjZXNzIGl0LlxuICpcbiAqIEByZXR1cm4ge0xvY2FsU3RvcmFnZX1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGxvY2Fsc3RvcmFnZSgpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gd2luZG93LmxvY2FsU3RvcmFnZTtcbiAgfSBjYXRjaCAoZSkge31cbn1cbiIsIi8vIEltcG9ydCBzdHlsZXMgKGF1dG9tYXRpY2FsbHkgaW5qZWN0IGludG8gPGhlYWQ+KS5cbi8vIGltcG9ydCAnLi4vc3R5bGVzL21haW4uY3NzJztcbmltcG9ydCB7YXhpc30gZnJvbSAnLi9tb2R1bGVzL2F4aXMnO1xuaW1wb3J0IHtiYXJ9IGZyb20gJy4vbW9kdWxlcy9iYXInO1xuaW1wb3J0IHtidWJibGVIZWF0bWFwfSBmcm9tICcuL21vZHVsZXMvYnViYmxlLWhlYXRtYXAnO1xuaW1wb3J0IHtib3h3aGlza2VyfSBmcm9tICcuL21vZHVsZXMvYm94LXdoaXNrZXInO1xuaW1wb3J0IHtjb2xvckZ1bmN0aW9ufSBmcm9tICcuL21vZHVsZXMvY29sb3ItZnVuY3Rpb24nO1xuaW1wb3J0IHtkYXRhdG9nZ2xlfSBmcm9tICcuL21vZHVsZXMvZGF0YS10b2dnbGUnO1xuaW1wb3J0IHtncm91cGluZ1NwYWNlcn0gZnJvbSAnLi9tb2R1bGVzL2dyb3VwaW5nLXNwYWNlcic7XG5pbXBvcnQge3Rvb2x0aXB9IGZyb20gJy4vbW9kdWxlcy90b29sdGlwJztcbmltcG9ydCB7c2NhdHRlcn0gZnJvbSAnLi9tb2R1bGVzL3NjYXR0ZXInO1xuaW1wb3J0IHtwbG90Wm9vbX0gZnJvbSAnLi9tb2R1bGVzL3Bsb3Qtem9vbSc7XG5pbXBvcnQge3Zpb2xpbn0gZnJvbSAnLi9tb2R1bGVzL3Zpb2xpbic7XG5pbXBvcnQge3BvaW50c30gZnJvbSAnLi9tb2R1bGVzL3BvaW50cyc7XG5cbmltcG9ydCB7dW5pcXVlRWxlbWVudHMsIGdldFRyYW5zbGF0aW9uLCBtb2RpZnlIZXhpZGVjaW1hbENvbG9yTHVtaW5hbmNlLCB0aWNrUmFuZ2UsXG5xdWFydGlsZXMsIGV4dHJhY3RWaW9saW5WYWx1ZXMsIGh5cGVuYXRlLCByb3VuZCwgZ2V0Q29udGFpbmluZ1NWRyxcbmludGVycG9sYXRlQ29sb3JzLCB0cnVuY2F0ZVRleHQsIHNhZmVTZWxlY3R9IGZyb20gJy4vbW9kdWxlcy9oZWxwZXJzJztcblxuaW1wb3J0IHtcbiAgYWxsLCB0YWxseSwgaGFzUSwgZmlyc3QsIGxhc3QsIHRvdGFsLCB1bmlxdWUsIGdldCwgbGlzdE9mTGlzdHNRLFxuICBjdXQsIGdyb3VwQnksIGFycmF5RXF1YWxzLCBlbGVtZW50c0F0TGV2ZWxzLCBudW1iZXJPZkVsZW1lbnRzLFxuICBmbGF0dGVuLCB3aGljaEJpblxufSBmcm9tICcuL21vZHVsZXMvYXJyYXktZnVuY3Rpb25zJztcblxuXG5pbXBvcnQge1xuICBzZXR1cFN0YW5kYXJkQ2hhcnRDb250YWluZXJzLCBsb2cgYXMgbXlMb2csIHdhcm4sIGluZm8sIGVycm9yLFxuICBjb25zb2xlR3JvdXAsIGNvbnNvbGVHcm91cEVuZFxufSBmcm9tICcuL21vZHVsZXMvdXRpbHMnO1xuXG4vLyAvKiogQG1vZHVsZSBkM3NtICovXG52YXIgZDNzbSA9IHt9O1xuZDNzbS5heGlzID0gYXhpcztcbmQzc20uYmFyID0gYmFyO1xuZDNzbS5idWJibGVIZWF0bWFwID0gYnViYmxlSGVhdG1hcDtcbmQzc20uYm94d2hpc2tlciA9IGJveHdoaXNrZXI7XG5kM3NtLmNvbG9yRnVuY3Rpb24gPSBjb2xvckZ1bmN0aW9uO1xuZDNzbS5kYXRhdG9nZ2xlID0gZGF0YXRvZ2dsZTtcbmQzc20uZ3JvdXBpbmdTcGFjZXIgPSBncm91cGluZ1NwYWNlcjtcbmQzc20udG9vbHRpcCA9IHRvb2x0aXA7XG5kM3NtLnNjYXR0ZXIgPSBzY2F0dGVyO1xuZDNzbS5wbG90Wm9vbSA9IHBsb3Rab29tO1xuZDNzbS52aW9saW4gPSB2aW9saW47XG5kM3NtLnBvaW50cyA9IHBvaW50cztcblxuZDNzbS51bmlxdWVFbGVtZW50cyA9IHVuaXF1ZUVsZW1lbnRzO1xuZDNzbS5nZXRUcmFuc2xhdGlvbiA9IGdldFRyYW5zbGF0aW9uO1xuZDNzbS5tb2RpZnlIZXhpZGVjaW1hbENvbG9yTHVtaW5hbmNlID0gbW9kaWZ5SGV4aWRlY2ltYWxDb2xvckx1bWluYW5jZTtcbmQzc20udGlja1JhbmdlID0gdGlja1JhbmdlO1xuZDNzbS5xdWFydGlsZXMgPSBxdWFydGlsZXM7XG5kM3NtLmV4dHJhY3RWaW9saW5WYWx1ZXMgPSBleHRyYWN0VmlvbGluVmFsdWVzO1xuZDNzbS5oeXBlbmF0ZSA9IGh5cGVuYXRlO1xuZDNzbS5yb3VuZCA9IHJvdW5kO1xuZDNzbS5nZXRDb250YWluaW5nU1ZHID0gZ2V0Q29udGFpbmluZ1NWRztcbmQzc20uaW50ZXJwb2xhdGVDb2xvcnMgPSBpbnRlcnBvbGF0ZUNvbG9ycztcbmQzc20udHJ1bmNhdGVUZXh0ID0gdHJ1bmNhdGVUZXh0O1xuZDNzbS5zYWZlU2VsZWN0ID0gc2FmZVNlbGVjdDtcblxuZDNzbS53aGljaEJpbiA9IHdoaWNoQmluO1xuZDNzbS51bmlxdWUgPSB1bmlxdWU7XG5cbmQzc20uc2V0dXBTdGFuZGFyZENoYXJ0Q29udGFpbmVycyA9IHNldHVwU3RhbmRhcmRDaGFydENvbnRhaW5lcnM7XG5kM3NtLmxvZyA9IG15TG9nO1xuZDNzbS53YXJuID0gd2FybjtcbmQzc20uaW5mbyA9IGluZm87XG5kM3NtLmVycm9yID0gZXJyb3I7XG5kM3NtLmNvbnNvbGVHcm91cCA9IGNvbnNvbGVHcm91cDtcbmQzc20uY29uc29sZUdyb3VwRW5kID0gY29uc29sZUdyb3VwRW5kO1xuXG5kM3NtLmRlYnVnUSA9IGZhbHNlXG5cblxuXG4vLyBJbXBvcnQgYSBsb2dnZXIgZm9yIGVhc2llciBkZWJ1Z2dpbmdcbmltcG9ydCBkZWJ1ZyBmcm9tICdkZWJ1Zyc7XG5jb25zdCBsb2cgPSBkZWJ1ZygnYXBwOmxvZycpO1xuXG4vLyBUaGUgbG9nZ2VyIHNob3VsZCBvbmx5IGJlIGRpc2FibGVkIGlmIHdlJ3JlIG5vdCBpbiBwcm9kdWN0aW9uLlxuaWYgKEVOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIC8vIEVuYWJsZSB0aGUgbG9nZ2VyLlxuICBkZWJ1Zy5lbmFibGUoJyonKTtcbiAgbG9nKCdMb2dnaW5nIGlzIGVuYWJsZWQhJyk7XG5cbiAgLy8gRW5hYmxlIExpdmVSZWxvYWRcbiAgZG9jdW1lbnQud3JpdGUoXG4gICAgJzxzY3JpcHQgc3JjPVwiaHR0cDovLydcbiAgICArIChsb2NhdGlvbi5ob3N0IHx8ICdsb2NhbGhvc3QnKS5zcGxpdCgnOicpWzBdXG4gICAgKyAnOjM1NzI5L2xpdmVyZWxvYWQuanM/c25pcHZlcj0xXCI+PC8nXG4gICAgKyAnc2NyaXB0PidcbiAgKTtcbn0gZWxzZSB7XG4gIGRlYnVnLmRpc2FibGUoKTtcbn1cblxud2luZG93LmQzc20gPSBkM3NtO1xuIl0sIm5hbWVzIjpbInVuaXF1ZUVsZW1lbnRzIiwidmFsdWUiLCJpbmRleCIsInNlbGYiLCJpbmRleE9mIiwiZ2V0VHJhbnNsYXRpb24iLCJ0cmFuc2Zvcm0iLCJnIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50TlMiLCJ1bmRlZmluZWQiLCJzZXRBdHRyaWJ1dGVOUyIsIm1hdHJpeCIsImJhc2VWYWwiLCJjb25zb2xpZGF0ZSIsImUiLCJmIiwibW9kaWZ5SGV4aWRlY2ltYWxDb2xvckx1bWluYW5jZSIsImhleCIsImx1bSIsIlN0cmluZyIsInJlcGxhY2UiLCJsZW5ndGgiLCJyZ2IiLCJjIiwiaSIsInBhcnNlSW50Iiwic3Vic3RyIiwiTWF0aCIsInJvdW5kIiwibWluIiwibWF4IiwidG9TdHJpbmciLCJxdWFydGlsZXMiLCJkYXRhIiwicUtleXMiLCJxMiIsImQzIiwibWVkaWFuIiwibG93ZXIiLCJmaWx0ZXIiLCJ4IiwidXBwZXIiLCJxMSIsInEwIiwicTMiLCJxNCIsImswIiwiazEiLCJrMiIsImszIiwiazQiLCJvYmoiLCJleHRyYWN0VmlvbGluVmFsdWVzIiwidmlvbGluS2V5cyIsInZhbHVlRXh0cmFjdG9yRnVuY3Rpb24iLCJob3Jpem9udGFsUSIsInFLZXkiLCJtYXAiLCJrIiwiZCIsImJpbm5lZCIsImhpc3RvZ3JhbSIsImZyZXF1ZW5jaWVzIiwibWluUG9pbnQiLCJ5IiwibWF4UG9pbnQiLCJwb2ludHMiLCJiaW4iLCJ4MCIsIngxIiwicXVhcnRzIiwibyIsInZhbHVlcyIsImNvbmNhdCIsImh5cGVuYXRlIiwiQXJyYXkiLCJwcm90b3R5cGUiLCJzbGljZSIsImNhbGwiLCJhcmd1bWVudHMiLCJqb2luIiwibnVtYmVyIiwicHJlY2lzaW9uIiwic2hpZnQiLCJyZXZlcnNlU2hpZnQiLCJudW1BcnJheSIsInNwbGl0IiwiZ2V0Q29udGFpbmluZ1NWRyIsImVsZW1lbnQiLCJwYXJlbnQiLCJwYXJlbnRFbGVtZW50IiwidGFnIiwidGFnTmFtZSIsInRvTG93ZXJDYXNlIiwiaW50ZXJwb2xhdGVDb2xvcnMiLCJpbnRlcnBvbGF0ZVJnYkJhc2lzIiwidHJ1bmNhdGVUZXh0IiwidCIsInRleHQiLCJvcmllbnQiLCJ0aWNrTGVuZ3RoIiwic3BhY2UiLCJvdmVyZmxvd1EiLCJyZWN0Iiwibm9kZSIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsIndpZHRoIiwiaGVpZ2h0Iiwic2FmZVNlbGVjdCIsInNlbCIsImNscyIsImNsc1N0ciIsInNTZWwiLCJzZWxlY3QiLCJlbXB0eSIsImFwcGVuZCIsImNsYXNzZWQiLCJhdHRyIiwidGlja1JhbmdlIiwibiIsImEiLCJzIiwicHVzaCIsImhhc1EiLCJhcnJheSIsIml0ZW0iLCJpbmNsdWRlcyIsInRvdGFsIiwicmVkdWNlIiwiYiIsInVuaXF1ZSIsImZsYXR0ZW4iLCJmbGF0IiwiaXNBcnJheSIsIndoaWNoQmluIiwiYmlucyIsImoiLCJjb25zb2xlR3JvdXAiLCJuYW1lIiwid2luZG93IiwiZDNzbSIsImRlYnVnUSIsImNvbnNvbGUiLCJncm91cCIsImNvbnNvbGVHcm91cEVuZCIsImdyb3VwRW5kIiwibG9nIiwiZnVuYyIsIm1zZyIsInRhYmxlIiwid2FybiIsImluZm8iLCJlcnJvciIsInNldHVwU3RhbmRhcmRDaGFydENvbnRhaW5lcnMiLCJzZWxlY3Rpb24iLCJuYW1lc3BhY2UiLCJ3IiwiYXZhaWxhYmxlV2lkdGgiLCJpbm5lcldpZHRoIiwiaCIsImF2YWlsYWJsZUhlaWdodCIsImlubmVySGVpZ2h0IiwibWFyZ2lucyIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsInBlcmNlbnRhZ2VzIiwiYXhlcyIsInhBeGlzUGVyY2VudCIsInlBeGlzUGVyY2VudCIsInBlcmNlbnRPZlNwYWNlRm9yV2lkdGgiLCJwZXJjZW50T2ZTcGFjZUZvckhlaWdodCIsInN2Z1NwYWNlIiwiY2hhcnRTcGFjZSIsImF4ZXNTcGFjZSIsImRyYXdpbmdTcGFjZSIsInlBeGlzUmVjdCIsInBsb3RSZWN0IiwieEF4aXNSZWN0IiwiY29udGFpbmVyIiwic3R5bGUiLCJwbG90IiwieEF4aXMiLCJ5QXhpcyIsInN2ZyIsImNwUmVjdCIsImRlZnMiLCJjcCIsInJhaXNlIiwiYmdSZWN0IiwiZmlsbCIsInNldHVwQ29udGFpbmVyIiwiYmciLCJvYmplY3RDb250YWluZXIiLCJjYWxjdWxhdGVXaWR0aE9mT2JqZWN0IiwiZnJlZVNwYWNlIiwibnVtYmVyT2ZPYmplY3RzIiwibWluT2JqZWN0V2lkdGgiLCJtYXhPYmplY3RXaWR0aCIsInNpemVPZlNwYWNlciIsIm51bWJlck9mU3BhY2VycyIsInNwYWNlVGFrZW5CeVNwYWNlcnMiLCJyZW1haW5pbmdTcGFjZSIsIm9iamVjdFdpZHRoIiwiY2FsY3VsYXRlV2lkdGhPZlNwYWNlciIsImJhc2VTcGFjZXJTaXplIiwibGltaXRlZE51bWJlck9mT2JqZWN0cyIsInNwYWNlTGVmdCIsInNwYWNlcnNBdEVhY2hMZXZlbCIsInNwYWNlcnNOZWVkZWRBdEVhY2hMZXZlbCIsInRvdGFsU3BhY2VyUGVyY2VudCIsImxldmVsIiwibGV2ZWxEYXRhIiwid2hpc2tlclBhdGgiLCJkaXIiLCJwZXIiLCJoaCIsInAiLCJ3dyIsImdyb3VwaW5nU3BhY2VyIiwic2NhbGUiLCJzY2FsZUxpbmVhciIsIm1vdmVieSIsIm9iamVjdENsYXNzIiwib2JqZWN0U2l6ZSIsInNwYWNlclNpemUiLCJ0cmFuc2l0aW9uRHVyYXRpb24iLCJlYXNlRnVuYyIsImVhc2VTaW4iLCJlbnRlckZ1bmN0aW9uIiwiY3VyIiwiZXhpdEZ1bmN0aW9uIiwiY3VycmVudCIsImN1cnJlbnROb2RlIiwidHJhbnNpdGlvbiIsImR1cmF0aW9uIiwiZWFzZSIsInJlbW92ZSIsInJlY3Vyc2l2ZWx5UG9zaXRpb24iLCJfIiwiY3VycmVudFNlbGVjdGlvbiIsInNlbGVjdEFsbCIsImVudGVyIiwiZXhpdCIsIm1lcmdlIiwiZWFjaCIsImxldmVsU3BhY2VyIiwibW92ZSIsImN1cnJlbnRFbGVtZW50IiwidG9SZW1vdmUiLCJzaXplIiwiYXhpcyIsInNwYWNlWCIsInNwYWNlWSIsImNhdGVnb3JpY2FsUSIsImd1aWRlTGluZXNRIiwiZ3JvdXBpbmciLCJkb21haW5QYWRkaW5nIiwib2JqZWN0U3BhY2VyIiwibWluT2JqZWN0U2l6ZSIsIm1heE9iamVjdFNpemUiLCJiYWNrZ3JvdW5kRmlsbCIsInRpY2tMYWJlbHMiLCJ0aWNrVmFsdWVzIiwibnVtYmVyT2ZUaWNrcyIsImxpbmVTdHJva2UiLCJsaW5lU3Ryb2tlV2lkdGgiLCJ0aWNrU3Ryb2tlIiwidGlja1N0cm9rZVdpZHRoIiwidGlja0xhYmVsRm9udFNpemUiLCJ0aWNrTGFiZWxNaW5Gb250U2l6ZSIsInRpY2tMYWJlbE1heEZvbnRTaXplIiwidGlja0xhYmVsVGV4dEFuY2hvciIsInRpY2tMYWJlbFJvdGF0aW9uIiwidGlja0xhYmVsRnVuYyIsImd1aWRlbGluZVNwYWNlIiwiZ3VpZGVMaW5lU3Ryb2tlIiwiZ3VpZGVMaW5lU3Ryb2tlV2lkdGgiLCJlYXNlRXhwIiwicm91bmRUbyIsInZlcnRpY2FsUSIsImJnY3BSZWN0IiwidGlja0RhdGEiLCJleHRlbnQiLCJmbGF0VGlja0RhdGEiLCJkb21haW4iLCJyYW5nZSIsIm9iakNsYXNzIiwic3BhY2VyRnVuY3Rpb24iLCJ0aWNrRW50ZXJBbmltYXRpb24iLCJtdCIsImRhdHVtIiwiZGlzdCIsInRpY2tFeGl0QW5pbWF0aW9uIiwibW92ZVhCeSIsIm1vdmVZQnkiLCJ0aWNrcyIsInRoYXQiLCJ0aWNrIiwibGFiZWwiLCJyIiwiZ2xpbmUiLCJsaW5lIiwiY29sb3JGdW5jdGlvbiIsImNvbG9ycyIsImludGVycG9sYXRpb24iLCJpbnRlcnBvbGF0ZVJnYiIsIm1vZGlmeU9wYWNpdHkiLCJzdHJva2VPcGFjaXR5IiwiZmlsbE9wYWNpdHkiLCJjb2xvckJ5IiwiZGF0YUV4dGVudCIsInZhbHVlRXh0cmFjdG9yIiwidiIsImludGVycG9sYXRlIiwiaGVscGVyU2NhbGUiLCJtYXRjaCIsImtleSIsInR5cGUiLCJob3ZlclEiLCJvcGFjIiwidXBkYXRlU2NhbGUiLCJ0b29sdGlwIiwia2V5cyIsImhlYWRlciIsInRhcmdldENsYXNzIiwib24iLCJtb3VzZW1vdmUiLCJjdXJyZW50RGF0YSIsIm1vdXNlIiwiZGl2IiwiY2FyZEJvZHkiLCJjYXJkVGl0bGUiLCJ0Qm9keSIsInRyIiwicm93S2V5Iiwicm93SW5kZXgiLCJiYXIiLCJzb3J0aW5nRnVuY3Rpb24iLCJrZXlBIiwia2V5QiIsImRlc2NlbmRpbmciLCJiYXJTdHJva2VXaWR0aCIsIkNGIiwiYmFyS2V5cyIsImJhclZhbHVlcyIsIlRUaXAiLCJvcmRlcmVkIiwic29ydCIsImRlZmF1bHRFeGl0IiwicGFyZW50SW5kZXhBcnJheSIsIk51bWJlciIsImZpbGxDb2xvciIsInN0cm9rZUNvbG9yIiwiYnViYmxlSGVhdG1hcCIsInhLZXkiLCJ5S2V5IiwicktleSIsInZLZXkiLCJ4RXh0cmFjdG9yIiwieUV4dHJhY3RvciIsInJFeHRyYWN0b3IiLCJ2RXh0cmFjdG9yIiwiYnViYmxlU3Ryb2tlV2lkdGgiLCJjZWxsS2V5cyIsInhWYWx1ZXMiLCJ5VmFsdWVzIiwiclZhbHVlcyIsInZWYWx1ZXMiLCJ4S2V5U29ydGluZ0Z1bmN0aW9uIiwieUtleVNvcnRpbmdGdW5jdGlvbiIsInJLZXlTb3J0aW5nRnVuY3Rpb24iLCJ4U2l6ZSIsInhTcGFjZXJTaXplIiwieVNpemUiLCJ5U3BhY2VyU2l6ZSIsImJobSIsInhEaW0iLCJ5RGltIiwieVNwYWNlciIsInhTcGFjZXIiLCJjZWxscyIsInJhZGl1cyIsImJveHdoaXNrZXIiLCJxdWFydGlsZXNLZXkiLCJxdWFydGlsZXNLZXlzIiwid2hpc2tlcldpZHRoUGVyY2VudCIsImJveFN0cm9rZVdpZHRoIiwid2hpc2tlclN0cm9rZVdpZHRoIiwiYm94S2V5cyIsImJveFZhbHVlcyIsIndoaXNrIiwidVdoaXNrIiwibFdoaXNrIiwicXVhcnQiLCJ1UXVhcnQiLCJsUXVhcnQiLCJtUXVhcnQiLCJkaWYiLCJkZCIsImlpIiwiZGF0YXRvZ2dsZSIsInVwZGF0ZUZ1bmN0aW9uIiwiY3VycmVudEtleSIsInRvZ2dsZSIsImRhdGFvcHRzIiwiZG9FbnRlciIsInByb3BlcnR5Iiwic2NhdHRlciIsInNjYWxlWCIsImRvbWFpblBhZGRpbmdYIiwidmFsdWVFeHRyYWN0b3JYIiwic2NhbGVZIiwiZG9tYWluUGFkZGluZ1kiLCJ2YWx1ZUV4dHJhY3RvclkiLCJzY2FsZVIiLCJkb21haW5QYWRkaW5nUiIsInZhbHVlRXh0cmFjdG9yUiIsIm1pblJhZGl1cyIsIm1heFJhZGl1cyIsInBvaW50U3Ryb2tlV2lkdGgiLCJwb2ludEtleXMiLCJ2YWx1ZXNYIiwidmFsdWVzWSIsInZhbHVlc1IiLCJleHRlbnRYIiwiZXh0ZW50WSIsImV4dGVudFIiLCJwRW50ZXIiLCJwRXhpdCIsImFkZEV2ZW50TGlzdGVuZXIiLCJwbG90Wm9vbSIsImNoYXJ0IiwiZXZlbnRUeXBlIiwid2hlZWxTcGVlZCIsInhMb2NrIiwieUxvY2siLCJjaGFydFNlbCIsInhBeGlzU2VsIiwieUF4aXNTZWwiLCJ6b29tIiwic2V0TG9ja3MiLCJjaGFydE9ialNlbCIsImNoYXJ0T2JqVHJhbnMiLCJjb3MiLCJnZXRCQm94IiwiZXZlbnQiLCJjaGFydEJveCIsInhBeGlzQm94IiwieUF4aXNCb3giLCJjaGFydFdpZHRoIiwiY2hhcnRIZWlnaHQiLCJ4QXhpc1dpZHRoIiwieEF4aXNIZWlnaHQiLCJ5QXhpc1dpZHRoIiwieUF4aXNIZWlnaHQiLCJwcmV2ZW50RGVmYXVsdCIsImRlbHRhWSIsInNoaWZ0USIsInNoaWZ0S2V5IiwiYXBwbHlYIiwiYXBwbHlZIiwieEF4aXNPYmpTZWwiLCJ5QXhpc09ialNlbCIsInhBeGlzT2JqVHJhbnMiLCJ5QXhpc09ialRyYW5zIiwicmVzZXQiLCJ2aW9saW4iLCJwb2ludHNRIiwib2JqZWN0U3Ryb2tlV2lkdGgiLCJwb2ludENvbG9yRnVuYyIsImJhc2UiLCJtaW5NYXhIZXhTY2FsZSIsInNjYWxlZENvbG9yIiwibW9kIiwicG9pbnRSYWRpdXMiLCJxdWFydGlsZUtleXMiLCJ2aW9saW5WYWx1ZXMiLCJwb2ludHNUb29sdGlwIiwicG9pbnRLZXlFeHRyYWN0b3IiLCJ2aW9saW5Qb2ludHNFeHRyYWN0b3IiLCJ2aW9saW5LZXkiLCJ2aW9saW5EYXRhIiwidmlvbGluUG9pbnRWYWx1ZUV4dHJhY3RvciIsInZpb2xpblBvaW50S2V5IiwidmlvbGluUG9pbnREYXRhIiwicXVhcnRpbGVLZXkiLCJjYWxjVmFsdWVzIiwibmVlZGVkVmlvbGluVmFsdWVzIiwidmsiLCJmcmVxdWVuY3lNYXgiLCJ2U2NhbGUiLCJsQXJlYSIsImN1cnZlIiwiY3VydmVCYXNpcyIsInJBcmVhIiwiYXJlYSIsImxhIiwicmEiLCJscTMiLCJscTEiLCJjb250b3VyIiwicHRzQ29udGFpbmVyIiwicHRzIiwicHRzRXhpdCIsInB0c0VudGVyIiwicFRUaXBzIiwicE1pbiIsInBvaW50VmFsdWVzIiwicE1heCIsInBvaW50S2V5IiwicmFuZG9tIiwiY3JlYXRlRXZlbnQiLCJpbml0RXZlbnQiLCJkaXNwYXRjaEV2ZW50IiwiY1YiLCJ0b29sdGlwS2V5IiwiY2FsY3VsYXRlVmlvbGluVmFsdWVzIiwidmlvbGluUG9pbnRzIiwidmlvbGluUG9pbnRzS2V5cyIsInZpb2xpblBvaW50c1ZhbHVlcyIsInBrIiwicG9pbnRRdWFydGlsZXMiLCJtaW5Db250b3VyUG9pbnQiLCJtYXhDb250b3VyUG9pbnQiLCJ2aW9saW5Db250b3VyUG9pbnRzIiwia2V5RXh0cmFjdG9yIiwicHRzQ29udGFpbmVycyIsIm5vZGVzIiwicmVxdWlyZSQkMCIsIm1zIiwibXlMb2ciLCJkZWJ1ZyIsImVuYWJsZSIsIndyaXRlIiwibG9jYXRpb24iLCJob3N0Il0sIm1hcHBpbmdzIjoiOzs7RUFBQTtFQUNBOzs7Ozs7O0VBT0E7Ozs7Ozs7QUFPQSxFQUFPLFNBQVNBLGNBQVQsQ0FBd0JDLEtBQXhCLEVBQStCQyxLQUEvQixFQUFzQ0MsSUFBdEMsRUFBNEM7RUFBRSxTQUFPQSxLQUFLQyxPQUFMLENBQWFILEtBQWIsTUFBd0JDLEtBQS9CO0VBQXVDOztFQUU1Rjs7Ozs7QUFLQSxFQUFPLFNBQVNHLGNBQVQsQ0FBd0JDLFNBQXhCLEVBQW1DO0VBQ3hDO0VBQ0E7RUFDQTtFQUNBLE1BQUlDLElBQUlDLFNBQVNDLGVBQVQsQ0FBeUIsNEJBQXpCLEVBQXVELEdBQXZELENBQVI7RUFDQTtFQUNBSCxjQUFZQSxhQUFhSSxTQUFiLEdBQXlCLGdCQUF6QixHQUE0Q0osU0FBeEQ7RUFDQUMsSUFBRUksY0FBRixDQUFpQixJQUFqQixFQUF1QixXQUF2QixFQUFvQ0wsU0FBcEM7RUFDQTtFQUNBO0VBQ0E7RUFDQSxNQUFJTSxTQUFTTCxFQUFFRCxTQUFGLENBQVlPLE9BQVosQ0FBb0JDLFdBQXBCLEdBQWtDRixNQUEvQztFQUNBO0VBQ0EsU0FBTyxDQUFDQSxPQUFPRyxDQUFSLEVBQVdILE9BQU9JLENBQWxCLENBQVA7RUFDRDs7RUFHRDs7Ozs7O0FBTUEsRUFBTyxTQUFTQywrQkFBVCxDQUF5Q0MsR0FBekMsRUFBOENDLEdBQTlDLEVBQW1EO0VBQ3hEO0VBQ0EsTUFBSUQsTUFBTUUsT0FBT0YsR0FBUCxFQUFZRyxPQUFaLENBQW9CLGFBQXBCLEVBQW1DLEVBQW5DLENBQVY7O0VBRUEsTUFBSUgsSUFBSUksTUFBSixHQUFhLENBQWpCLEVBQW9CO0VBQ2xCSixVQUFNQSxJQUFJLENBQUosSUFBT0EsSUFBSSxDQUFKLENBQVAsR0FBY0EsSUFBSSxDQUFKLENBQWQsR0FB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QUFDLEtBQUssQ0FBQyxDQUFDO1VBQ3RCLEtBQUssR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQzs7O1VBR2xDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1VBQ3RCLEtBQUssRUFBRSxDQUFDO1NBQ1Q7UUFDRCxPQUFPLEtBQUssQ0FBQztPQUNkLENBQUMsQ0FBQzs7O01BR0gsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDOztNQUVwQyxJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7TUFDbEUsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDekI7O0lBRUQsS0FBSyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDNUIsS0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzNDLEtBQUssQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3RDLEtBQUssQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3JDLEtBQUssQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDOzs7SUFHeEIsSUFBSSxVQUFVLEtBQUssT0FBTyxPQUFPLENBQUMsSUFBSSxFQUFFO01BQ3RDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDckI7O0lBRUQsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7O0lBRTlCLE9BQU8sS0FBSyxDQUFDO0dBQ2Q7O0VBRUQsU0FBUyxPQUFPLElBQUk7SUFDbEIsSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMs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 diff --git a/build/js/d3sm.min.obf.js b/build/js/d3sm.min.obf.js new file mode 100644 index 0000000..44aed6b --- /dev/null +++ b/build/js/d3sm.min.obf.js @@ -0,0 +1,2 @@ +!function(){"use strict";function t(t,n,e){return e.indexOf(t)===n}function n(t){var n=document.createElementNS("http://www.w3.org/2000/svg","g");t=void 0==t?"translate(0,0)":t,n.setAttributeNS(null,"transform",t);var e=n.transform.baseVal.consolidate().matrix;return[e.e,e.f]}function e(t,n){(t=String(t).replace(/[^0-9a-f]/gi,"")).length<6&&(t=t[0]+t[0]+t[1]+t[1]+t[2]+t[2]),n=n||0;var e,r,o="#";for(r=0;r<3;r++)e=parseInt(t.substr(2*r,2),16),o+=("00"+(e=Math.round(Math.min(Math.max(0,e+e*n),255)).toString(16))).substr(e.length);return o}function r(t,n){var e=d3.median(t),r=t.filter(function(t){return te}),a=void 0==(a=d3.median(r))?e:a,i=void 0==(i=d3.min(r))?a:i,u=void 0==(u=d3.median(o))?e:u,c=void 0==(c=d3.max(o))?u:c,l="q0",s="q1",f="q2",h="q3",d="q4",g={};return void 0!=n&&5==n.length&&(l=n[0],s=n[1],f=n[2],h=n[3],d=n[4]),g[l]=i,g[s]=a,g[f]=e,g[h]=u,g[d]=c,g}function o(){return Array.prototype.slice.call(arguments).join("-")}function a(t,n){var e=function(t,n,e){e&&(n=-n);var r=(""+t).split("e");return+(r[0]+"e"+(r[1]?+r[1]+n:n))};return e(Math.round(e(t,n,!1)),n,!0)}function i(t,n,e,r,o,a){var i=t.node().getBoundingClientRect();for(t.text(n);Math.max(i.width,i.height)>o-r&&(n=(n=String(n)).slice(0,n.length-1),t.text(n+"..."),i=t.node().getBoundingClientRect(),0!=n.length););}function u(t,n,e){var r=void 0==e?"":"."+e,o=t.select(n+r).empty()?t.append(n):t.select(n+r);return o.classed(r.replace(".",""),!0).attr("transform",void 0==o.attr("transform")?"translate(0,0)":o.attr("transform"))}function c(t,n,e){for(var r=[t],o=(n-t)/(e-1),a=0;ar&&(u=r),a&&void 0!=e&&u6?6:r;return(n-i*e)/(i-1)}var u=function t(n,e,r){void 0==e?e=0:e+=1;void 0==r&&(r=[]);e>=r.length?r.push(n.length-1):r[e]+=n.length-1;n.map(function(n,o){Array.isArray(n)&&t(n,e,r)});return r}(t);return(n-e*r)/u.map(function(t,n){return 1*t/(n+1)}).reduce(function(t,n){return t+n},0)}function x(t,n,e,r,o,a,i){if("up"!=t&&"top"!=t&&1!=t||(t=!0),"down"!=t&&"bottom"!=t&&0!=t||(t=!1),i=void 0==i?"horizontal":i,a=void 0==a?1:a,"horizontal"!=i){var u=o*a,c=(r=t?r:-r,t?n+r:n),l=t?n:n+r,s=t?c:l;return h="M "+c+" "+o/2+" L "+l+" "+o/2+" M "+s+" "+(o/2-u/2)+" L "+s+" "+(o/2+u/2)+" "}var f=r*a,h="M "+r/2+" "+(c=t?e+o:e)+" L "+r/2+" "+(l=t?e:e+o)+" h "+-f/2+" 0 h "+f+" 0 ";return h}function b(){var t,n,e,r=!0,o=d3.scaleLinear(),a="category",i="d3sm-groupped-item",u=1e3,c=d3.easeSin,l="spacer",s=function(o){o.attr("transform",function(o,a){return"translate("+(r?n*t+e*(t-1):0)+","+(r?0:n*t+e*(t-1))+")"})},f=function(o){p("groupingSpacer","exiting with",{current:o,currentNode:o.node()}),o.classed("to-remove",!0),o.transition().duration(.9*u).ease(c).attr("transform",function(o,a){return"translate("+(r?n*t+e*(t-1):0)+","+(r?0:n*t+e*(t-1))+")"}).remove()};function h(t,d,g){void 0==g&&(g=0);var p=t.selectAll("g."+l+'[level="'+g+'"]').data(d),m=p.enter().append("g").attr("level",g).attr("class",l),v=p.exit();p=p.merge(m),"function"==typeof f?v.each(function(t,n){f(d3.select(this))}):v.remove();var y=e/(g+1),x=0;return p.each(function(t,e){var d=d3.select(this);if(void 0==d.attr("transform")&&"function"==typeof s&&s(d),d.transition().duration(u).ease(c).attr("transform",function(t,n){return"translate("+(r?"scale"==a?o(t):x:0)+","+(r?0:"scale"==a?o(t):x)+")"}),Array.isArray(t)){x+=h(d,t,g+1);var m=d.selectAll("g."+l+'[level="'+g+'"] > g.'+i+"."+l);"function"==typeof f?m.each(function(t,n){f(d3.select(this))}):m.remove()}else{x+=n;var v=d.select("g."+l+'[level="'+g+'"] > g.'+i+"."+l);v.empty()&&(v=d.append("g").attr("class",i).classed(l,!0)),v.attr("parent-index",e);m=d.selectAll("g."+l+'[level="'+(g+1)+'"]');"function"==typeof f?m.each(function(t,n){f(d3.select(this))}):m.remove()}x+=e==p.size()-1?0:y}),x}return h.horizontalQ=function(t){return arguments.length?(r=t,h):r},h.scale=function(t){return arguments.length?(o=t,h):o},h.moveby=function(t){return arguments.length?(a=t,h):a},h.numberOfObjects=function(n){return arguments.length?(t=n,h):t},h.objectClass=function(t){return arguments.length?(i=t,h):i},h.objectSize=function(t){return arguments.length?(n=t,h):n},h.spacerSize=function(t){return arguments.length?(e=t,h):e},h.transitionDuration=function(t){return arguments.length?(u=t,h):u},h.easeFunc=function(t){return arguments.length?(c=t,h):c},h.namespace=function(t){return arguments.length?(l=t,h):l},h.enterFunction=function(t){return arguments.length?(s=t,h):s},h.exitFunction=function(t){return arguments.length?(f=t,h):f},h}var w=function(){return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return function(t,n){var e=[],r=!0,o=!1,a=void 0;try{for(var i,u=t[Symbol.iterator]();!(r=(i=u.next()).done)&&(e.push(i.value),!n||e.length!==n);r=!0);}catch(t){o=!0,a=t}finally{try{!r&&u.return&&u.return()}finally{if(o)throw a}}return e}(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),C=function(t){if(Array.isArray(t)){for(var n=0,e=Array(t.length);n0)return function(t){if((t=String(t)).length>100)return;var n=/^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(t);if(!n)return;var e=parseFloat(n[1]);switch((n[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return e*q;case"days":case"day":case"d":return e*L;case"hours":case"hour":case"hrs":case"hr":case"h":return e*E;case"minutes":case"minute":case"mins":case"min":case"m":return e*j;case"seconds":case"second":case"secs":case"sec":case"s":return e*M;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return e;default:return}}(t);if("number"===r&&!1===isNaN(t))return n.long?Q(e=t,L,"day")||Q(e,E,"hour")||Q(e,j,"minute")||Q(e,M,"second")||e+" ms":function(t){if(t>=L)return Math.round(t/L)+"d";if(t>=E)return Math.round(t/E)+"h";if(t>=j)return Math.round(t/j)+"m";if(t>=M)return Math.round(t/M)+"s";return t+"ms"}(t);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(t))};function Q(t,n,e){if(!(t=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)},n.storage="undefined"!=typeof chrome&&void 0!==chrome.storage?chrome.storage.local:function(){try{return window.localStorage}catch(t){}}(),n.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],n.formatters.j=function(t){try{return JSON.stringify(t)}catch(t){return"[UnexpectedJSONParseError]: "+t.message}},n.enable(e())})),V=(K.log,K.formatArgs,K.save,K.load,K.useColors,K.storage,K.colors,{axis:function(t){var n,r,s,h,d,g,p="bottom",x=0,w=0,k=!1,F=!1,S=!1,A=d3.scaleLinear(),z=.5,M=.05,j=15,E=50,L="transparent",q="d3sm-axis",O="tick-group",Q=5,B="black",K=3,V="black",D=2,P=10,R=14,W=8,Y=20,X="middle",N=0,H=void 0,T="#333333",I=2,G=1e3,Z=d3.easeExp,$=2;function J(){var W=!!l(["top","bottom","horizontal"],p),H=!W,J={x:0,y:0,width:x,height:w};"left"==p&&(J.x-=x,S&&(J.width+=h),J.y-=Y,J.height+=2*Y),"bottom"==p&&(J.y=J.y,S&&(J.y-=h,J.height+=h),J.x-=Y,J.width+=2*Y),"top"==p&&(J.y-=w,S&&(J.height+=h)),"right"==p&&(J.x=0,S&&(J.width+=h,J.x-=h),J.y-=Y,J.height+=2*Y,console.log(J));var U=m(t,q,J,L);"top"==p&&(X="start",N=90),"bottom"==p&&(X="end",N=-90),"left"==p&&(X="end",N=0),"right"==p&&(X="start",N=0);var _=F?void 0==n?r:n:void 0==n?void 0!=Q?c.apply(void 0,C(d3.extent(s)).concat([Q])):s:n,tt=f(_),nt=tt.length,et=W?x:w,rt=d3.extent(tt);A.domain([rt[0]-z,rt[1]+z]).range([W?0:w,W?x:0]),d=void 0==d?v(et,nt,j,E,M,k):d,g=void 0==g?y(tt,et,d,nt,0,k):g;var ot=o(q,F?O+"-categorical":O),at=b().horizontalQ(W).scale(A).moveby(F?"category":"scale").numberOfObjects(nt).objectClass(ot).objectSize(d).spacerSize(g).transitionDuration(G).easeFunc(Z).namespace(q);function it(t,n,e,r,o){return e&&r?o/2:0}function ut(t,n,e,r,o){return e&&r?o/2:0}F||(at.enterFunction(function(t){var n=A(t.datum()),e=2*A(rt[1]),r=n rect").transition().duration(q).attr("transform",function(t,n){return"translate(0,"+(F?0:p(D[1]))+")"}).attr("width",k?c:0).attr("height",F?c:0).remove()}),R(B,K,0);var Y=[];B.selectAll("g:not(.to-remove)."+L).each(function(t,n){Y.push(Number(d3.select(this).attr("parent-index")))}),M="index"==M.colorBy()?M.dataExtent([0,Math.max.apply(Math,Y)]):M.dataExtent(D),B.selectAll("g:not(.to-remove)."+L).each(function(t,e){var r=d3.select(this),o=(n[t],d(t,e)),a=(e=void 0==r.attr("parent-index")?e:r.attr("parent-index"),M(t,o,e,"fill")),i=M(t,o,e,"stroke"),l=u(r,"rect","bar-rect");void 0==l.attr("transform")&&l.attr("transform",function(t,n){return"translate(0,"+(F?0:p(D[1]))+")"}).attr("width",k?c:0).attr("height",F?c:0),l.transition().duration(q).ease(O).attr("transform",function(t,n){return"translate(0,"+(F?0:p(D[1])-p(o))+")"}).attr("width",k?c:p(o)).attr("height",F?c:p(o)).attr("fill",a).attr("stroke",i).attr("stroke-width",z),r.on("mouseover",function(t,n){B.selectAll("g."+L).style("opacity",.2),r.style("opacity",1),l.attr("stroke-width",2*z)}),r.on("mouseout",function(){B.selectAll("g."+L).style("opacity",1),l.attr("stroke-width",z)})}),Q.selection(B.selectAll(".bar-rect")).data(n),Q()}return B.selection=function(n){return arguments.length?(t=n,B):t},B.data=function(t){return arguments.length?(n=t,B):n},B.orient=function(t){return arguments.length?(s=t,B):s},B.spaceX=function(t){return arguments.length?(e=t,B):e},B.spaceY=function(t){return arguments.length?(r=t,B):r},B.overflowQ=function(t){return arguments.length?(h=t,B):h},B.grouping=function(t){return arguments.length?(o=t,B):o},B.valueExtractor=function(t){return arguments.length?(d=t,B):d},B.sortingFunction=function(t){return arguments.length?(g=t,B):g},B.scale=function(t){return arguments.length?(p=t,B):p},B.domainPadding=function(t){return arguments.length?(x=t,B):x},B.objectSpacer=function(t){return arguments.length?(w=t,B):w},B.minObjectSize=function(t){return arguments.length?(S=t,B):S},B.maxObjectSize=function(t){return arguments.length?(A=t,B):A},B.barStrokeWidth=function(t){return arguments.length?(z=t,B):z},B.colorFunction=function(t){return arguments.length?(M=t,B):M},B.backgroundFill=function(t){return arguments.length?(j=t,B):j},B.namespace=function(t){return arguments.length?(E=t,B):E},B.objectClass=function(t){return arguments.length?(L=t,B):L},B.transitionDuration=function(t){return arguments.length?(q=t,B):q},B.easeFunc=function(t){return arguments.length?(O=t,B):O},B.barKeys=function(t){return arguments.length?(a=t,B):a},B.barValues=function(t){return arguments.length?(i=t,B):i},B.objectSize=function(t){return arguments.length?(c=t,B):c},B.spacerSize=function(t){return arguments.length?(l=t,B):l},B.tooltip=function(t){return arguments.length?(Q=t,B):Q},B},bubbleHeatmap:function(t){var n,e,r,a,i,c,l,f,h,d,g,x,w="x",S="y",A="r",z="v",M=function(t,e){return n[t][w]},j=function(t,e){return n[t][S]},E=function(t,e){return n[t][A]},L=function(t,e){return n[t][z]},q=!1,O=d3.scaleLinear(),Q=.5,B=0,K=50,V=100,D=2,P="transparent",R="d3sm-bubble",W="bubble",Y=1e3,X=d3.easeExp,N=function(t,n){return M(t)-M(n)},H=function(t,n){return j(t)-j(n)},T=k().colorBy("category"),I=F();function G(){var w=m(t,R,{x:0,y:0,width:e,height:r},P);(a=d3.keys(n)).sort(function(t,n){return N(t,n)||H(t,n)}),p("bubbleHeatmap","cells are sorted by",a),i=s(a.map(M)),c=s(a.map(j)),l=s(a.map(E)),f=s(a.map(L)),p("bubbleHeatmap","x and y keys are",{x:i,y:c});var k=i.length,F=c.length,S=[Math.min.apply(Math,C(l))-Q,Math.max.apply(Math,C(l))+Q];g=v(r,F,K,V,B,q),h=v(e,k,K,V,B,q),x=y(c,r,g,F,0,q),d=y(i,e,h,k,0,q),p("bubbleHeatmap","size of",{x:h,y:g}),O.domain(S).range([0,Math.min(g,h)/2]);var A=b().horizontalQ(!1).moveby("category").numberOfObjects(F).objectClass(o(W,"row")).objectSize(g).spacerSize(x).transitionDuration(Y).easeFunc(X).namespace("row"),z=b().horizontalQ(!0).moveby("category").numberOfObjects(k).objectClass(W).objectSize(h).spacerSize(d).transitionDuration(Y).easeFunc(X);A(w,c,0),w.selectAll("g."+o(W,"row")).each(function(t,n){z(d3.select(this),i,0)});var G=w.selectAll("g:not(.to-remove)."+W).data(a),Z=[];G.each(function(t,n){Z.push(Number(d3.select(this).attr("parent-index")))}),T="index"==T.colorBy()?T.dataExtent([0,Math.max.apply(Math,Z)]):T.dataExtent(S),G.each(function(t,e){p("bubbleHeatmap","each cell",{key:t,index:e,node:d3.select(this).node()});var r=d3.select(this),a=(n[t],L(t,e)),i=E(t,e),c=(e=void 0==r.attr("parent-index")?e:r.attr("parent-index"),T(t,a,e,"fill")),l=T(t,a,e,"stroke");u(r,"circle",o(W,"circle")).attr("cx",h/2).attr("cy",g/2).attr("r",O(i)).attr("fill",c).attr("stroke",l).attr("stroke-width",D)}),I.selection(G.selectAll("circle."+o(W,"circle"))).data(n),I()}return G.selection=function(n){return arguments.length?(t=n,G):t},G.data=function(t){return arguments.length?(n=t,G):n},G.spaceX=function(t){return arguments.length?(e=t,G):e},G.spaceY=function(t){return arguments.length?(r=t,G):r},G.xKey=function(t){return arguments.length?(w=t,G):w},G.yKey=function(t){return arguments.length?(S=t,G):S},G.rKey=function(t){return arguments.length?(A=t,G):A},G.vKey=function(t){return arguments.length?(z=t,G):z},G.cellKeys=function(t){return arguments.length?(a=t,G):a},G.xValues=function(t){return arguments.length?(i=t,G):i},G.yValues=function(t){return arguments.length?(c=t,G):c},G.rValues=function(t){return arguments.length?(l=t,G):l},G.vValues=function(t){return arguments.length?(f=t,G):f},G.xExtractor=function(t){return arguments.length?(M=t,G):M},G.yExtractor=function(t){return arguments.length?(j=t,G):j},G.rExtractor=function(t){return arguments.length?(E=t,G):E},G.vExtractor=function(t){return arguments.length?(L=t,G):L},G.overflowQ=function(t){return arguments.length?(q=t,G):q},G.scale=function(t){return arguments.length?(O=t,G):O},G.domainPadding=function(t){return arguments.length?(Q=t,G):Q},G.objectSpacer=function(t){return arguments.length?B=t:n},G.minObjectSize=function(t){return arguments.length?(K=t,G):K},G.maxObjectSize=function(t){return arguments.length?(V=t,G):V},G.bubbleStrokeWidth=function(t){return arguments.length?(D=t,G):D},G.backgroundFill=function(t){return arguments.length?(P=t,G):P},G.namespace=function(t){return arguments.length?(R=t,G):R},G.objectClass=function(t){return arguments.length?(W=t,G):W},G.transitionDuration=function(t){return arguments.length?(Y=t,G):Y},G.easeFunc=function(t){return arguments.length?(X=t,G):X},G.tooltip=function(t){return arguments.length?(I=t,G):I},G.xSize=function(t){return arguments.length?(h=t,G):h},G.xSpacerSize=function(t){return arguments.length?(d=t,G):d},G.ySize=function(t){return arguments.length?(g=t,G):g},G.ySpacerSize=function(t){return arguments.length?(x=t,G):x},G},boxwhisker:function(t){var n,e,r,o,a,i,c,s,h="horizontal",d=!0,g="quartiles",p=["0.00","0.25","0.50","0.75","1.00"],w=function(t,e){return n[t][g]},S=function(t,n){return d3.descending(w(t)[p[4]],w(n)[p[4]])},A=d3.scaleLinear(),z=.5,M=.05,j=15,E=50,L=.6,q=k(),O=2,Q=2,B="transparent",K="d3sm-box-whisker",V="box-whisk",D=1e3,P=d3.easeExp,R=F();function W(){var g="horizontal"==h,k=!g,F=m(t,K,{x:0,y:0,width:e,height:r},B),W=void 0==o?d3.keys(n).sort(S):o;a=f(W),i=a.map(w);var Y=a.length,X=[Math.min.apply(Math,C(i.map(function(t,n){return t[p[0]]})))-z,Math.max.apply(Math,C(i.map(function(t,n){return t[p[4]]})))+z];A.domain(X).range(g?[0,r]:[e,0]);var N=g?e:r;c=v(N,Y,j,E,M,d),s=y(a,N,c,Y,0,d),b().horizontalQ(g).scale(A).moveby("category").numberOfObjects(Y).objectClass(V).objectSize(c).spacerSize(s).transitionDuration(D).easeFunc(P).namespace(K)(F,W,0);var H=[];F.selectAll("g:not(.to-remove)."+V).each(function(t,n){l(a,t)&&H.push(Number(d3.select(this).attr("parent-index")))}),q="index"==q.colorBy()?q.dataExtent([0,Math.max.apply(Math,H)]):q.dataExtent(X),F.selectAll("g:not(.to-remove)."+V).each(function(t,e){var r=d3.select(this),o=(n[t],w(t,e)),a=o[p[0]],i=o[p[1]],l=o[p[2]],s=o[p[3]],f=o[p[4]],d=(e=void 0==r.attr("parent-index")?e:r.attr("parent-index"),q(t,l,e,"fill")),m=q(t,l,e,"stroke"),v=u(r,"g","whisker"),y=u(v,"path","upper"),b=u(v,"path","lower"),C=u(r,"g","quartile"),F=u(C,"rect","upper"),S=u(C,"rect","lower"),z=u(C,"circle","median");F.transition().duration(D).ease(P).attr("width",g?c:A(s)-A(l)).attr("height",k?c:A(s)-A(l)).attr("fill",d).attr("stroke",m).attr("stroke-width",O).attr("transform",function(t,n){return"translate("+(g?0:A(l))+","+(k?0:A(X[1])-A(s))+")"}),S.transition().duration(D).ease(P).attr("width",g?c:A(l)-A(i)).attr("height",k?c:A(l)-A(i)).attr("fill",d).attr("stroke",m).attr("stroke-width",O).attr("transform",function(t,n){return"translate("+(g?0:A(i))+","+(k?0:A(X[1])-A(l))+")"}),z.transition().duration(D).ease(P).attr("r",function(t,n){var e=c/2,r=(A(s)-A(i))/2;return e>r?r:e}).attr("fill",d).attr("stroke",m).attr("stroke-width",O).attr("transform",function(t,n){return"translate("+(g?c/2:A(l))+","+(k?c/2:A(X[1])-A(l))+")"}),b.transition().duration(D).ease(P).attr("d",function(t,n){var e=g?A(i)-A(a):c;return x(!1,0,0,k?A(i)-A(a):c,e,L,h)}).attr("transform",function(t,n){return"translate("+(g?0:A(i))+","+(k?0:A(X[1])-A(i))+")"}).attr("stroke","black").attr("stroke-width",Q).attr("fill","none"),y.transition().duration(D).ease(P).attr("d",function(t,n){var e=g?A(f)-A(s):c;return x(!0,0,0,k?A(f)-A(s):c,e,L,h)}).attr("transform",function(t,n){return"translate("+(g?0:A(s))+","+(k?0:A(X[1])-A(f))+")"}).attr("stroke","black").attr("stroke-width",Q).attr("fill","none")}),R.selection(F.selectAll("g:not(.to-remove)."+V)).data(n),R()}return W.selection=function(n){return arguments.length?(t=n,W):t},W.data=function(t){return arguments.length?(n=t,W):n},W.orient=function(t){return arguments.length?(h=t,W):h},W.spaceX=function(t){return arguments.length?(e=t,W):e},W.spaceY=function(t){return arguments.length?(r=t,W):r},W.overflowQ=function(t){return arguments.length?(d=t,W):d},W.grouping=function(t){return arguments.length?(o=t,W):o},W.quartilesKey=function(t){return arguments.length?(g=t,W):g},W.quartilesKeys=function(t){return arguments.length?(p=t,W):p},W.valueExtractor=function(t){return arguments.length?(w=t,W):w},W.sortingFunction=function(t){return arguments.length?(S=t,W):S},W.scale=function(t){return arguments.length?(A=t,W):A},W.domainPadding=function(t){return arguments.length?(z=t,W):z},W.objectSpacer=function(t){return arguments.length?(M=t,W):M},W.minObjectSize=function(t){return arguments.length?(j=t,W):j},W.maxObjectSize=function(t){return arguments.length?(E=t,W):E},W.whiskerWidthPercent=function(t){return arguments.length?(L=t,W):L},W.colorFunction=function(t){return arguments.length?(q=t,W):q},W.boxStrokeWidth=function(t){return arguments.length?(O=t,W):O},W.whiskerStrokeWidth=function(t){return arguments.length?(Q=t,W):Q},W.backgroundFill=function(t){return arguments.length?(B=t,W):B},W.namespace=function(t){return arguments.length?(K=t,W):K},W.objectClass=function(t){return arguments.length?(V=t,W):V},W.transitionDuration=function(t){return arguments.length?(D=t,W):D},W.easeFunc=function(t){return arguments.length?(P=t,W):P},W.boxKeys=function(t){return arguments.length?(a=t,W):a},W.boxValues=function(t){return arguments.length?(i=t,W):i},W.objectSize=function(t){return arguments.length?(c=t,W):c},W.spacerSize=function(t){return arguments.length?(s=t,W):s},W.tooltip=function(t){return arguments.length?(R=t,W):R},W}});V.colorFunction=k,V.datatoggle=function(t){var n,e,r=function(){},a="d3sm-databar";function i(){var u=t.selectAll("div.data-option");u.exit().remove();var c=(u=u.data(n)).enter().append("div").attr("class","data-option").classed("form-check form-check-inline align-middle",!0);return c.append("input").attr("type","radio").attr("id",function(t,n){return o(a,t)}).attr("name",o(a,"databar")).attr("value",function(t,n){return t}),c.append("label").attr("for",function(t,n){return o(a,t)}).attr("name",o(a,"databar")).text(function(t,n){return t}),u=u.merge(c),e=u.select(":checked").empty()?n[0]:u.select(":checked").datum(),u.select('[value="'+e+'"]').property("checked",!0),u.on("click",function(t,n){r()}),i}return i.keys=function(t){return arguments.length?(n=t,i):n},i.updateFunction=function(t){return arguments.length?(r=t,i):r},i.namespace=function(t){return arguments.length?(a=t,i):a},i.currentKey=function(t){return arguments.length?(e=t,i):e},i},V.groupingSpacer=b,V.tooltip=F,V.scatter=function(t){var n,e,r,o,a,i,u,c=d3.scaleLinear(),l=.5,s=function(t,e){return n[t].x},f=d3.scaleLinear(),h=.5,d=function(t,e){return n[t].y},g=d3.scaleLinear(),p=.5,v=function(t,n){return 2},y=2,x=10,b=2,w=k(),S="transparent",A="d3sm-scatter",z="scatter-point",M=1e3,j=d3.easeExp,E=F();function L(){var k=m(t,A,{x:0,y:0,width:e,height:r},S);o=d3.keys(n),a=o.map(s),i=o.map(d),u=o.map(v),o.length;var F=[Math.min.apply(Math,C(a))-l,Math.max.apply(Math,C(a))+l],L=[Math.min.apply(Math,C(i))-h,Math.max.apply(Math,C(i))+h],q=[Math.min.apply(Math,C(u))-p,Math.max.apply(Math,C(u))+p];c.domain(F).range([0,e]),f.domain(L).range([r,0]),g.domain(q).range([y,x]);var O=k.selectAll("."+z),Q=(O=O.data(o)).enter().append("circle").attr("class",z).attr("cx",0).attr("cy",r).attr("r",0),B=O.exit();(O=O.merge(Q)).each(function(t,e){var r=d3.select(this),o=n[t],l=a[e],s=i[e],h=u[e],d=w(t,o,e,"fill"),p=w(t,o,e,"stroke");r.transition().duration(M).ease(j).attr("cx",c(l)).attr("cy",f(s)).attr("r",g(h)).attr("fill",d).attr("stroke",p).attr("stroke-width",b),r.on("mouseover",function(t,n){O.style("opacity",.2),r.style("opacity",1),r.transition().duration(M/2).ease(j).attr("stroke-width",2*b).attr("r",1.5*g(h))}),r.node().addEventListener("mouseout",function(){k.selectAll("."+z).style("opacity",1),r.transition().duration(M/2).ease(j).attr("stroke-width",b).attr("r",g(h))})}),B.transition().duration(M).ease(j).attr("cx",0).attr("cy",r).attr("r",0).remove(),E.selection(O).data(n),E()}return L.selection=function(n){return arguments.length?(t=n,L):t},L.data=function(t){return arguments.length?(n=t,L):n},L.spaceX=function(t){return arguments.length?(e=t,L):e},L.spaceY=function(t){return arguments.length?(r=t,L):r},L.scaleX=function(t){return arguments.length?(c=t,L):c},L.domainPaddingX=function(t){return arguments.length?(l=t,L):l},L.valueExtractorX=function(t){return arguments.length?(s=t,L):s},L.scaleY=function(t){return arguments.length?(f=t,L):f},L.domainPaddingY=function(t){return arguments.length?(h=t,L):h},L.valueExtractorY=function(t){return arguments.length?(d=t,L):d},L.scaleR=function(t){return arguments.length?(g=t,L):g},L.domainPaddingR=function(t){return arguments.length?(p=t,L):p},L.valueExtractorR=function(t){return arguments.length?(v=t,L):v},L.minRadius=function(t){return arguments.length?(y=t,L):y},L.maxRadius=function(t){return arguments.length?(x=t,L):x},L.pointStrokeWidth=function(t){return arguments.length?(b=t,L):b},L.colorFunction=function(t){return arguments.length?(w=t,L):w},L.backgroundFill=function(t){return arguments.length?(S=t,L):S},L.namespace=function(t){return arguments.length?(A=t,L):A},L.objectClass=function(t){return arguments.length?(z=t,L):z},L.transitionDuration=function(t){return arguments.length?(M=t,L):M},L.easeFunc=function(t){return arguments.length?(j=t,L):j},L.pointKeys=function(t){return arguments.length?(o=t,L):o},L.valuesX=function(t){return arguments.length?(a=t,L):a},L.valuesY=function(t){return arguments.length?(i=t,L):i},L.valuesR=function(t){return arguments.length?(u=t,L):u},L.tooltip=function(t){return arguments.length?(E=t,L):E},L},V.plotZoom=function(t,e,r){var a,i=20,u=void 0==t.orient?"horizontal":t.orient(),c=t.spaceX(),l=t.spaceY(),s=t.selection(),f=e.selection(),h=r.selection();function d(){var e=s.select("."+o(t.namespace(),"object-container")),r=n(e.attr("transform")),a=e.attr("transform","translate(0,0)");c=s.node().getBBox().width-.9*t.spaceX(),l=s.node().getBBox().height-.9*t.spaceY(),a.attr("transform","translate("+r[0]+","+r[1]+")"),p("plotZoom","setLocks",{xLock:c,yLock:l})}function g(){var g,p;d(),"2D"==u&&(g=!0,p=!0),"horizontal"==u&&(g=!0,p=!1),"vertical"==u&&(p=!0,g=!1);var m=d3.event.transform,v=s.node().getBBox(),y=f.node().getBBox(),x=f.node().getBBox();if(v.width,v.x,v.height,v.y,y.width,y.height,x.width,x.height,"wheel"==a){d3.event.preventDefault();var b=d3.event.deltaY*i,w=d3.event.shiftKey;(m="2D"==u?w?{k:1,x:b,y:0}:{k:1,x:0,y:b}:g?{k:1,x:b,y:0}:{k:1,x:0,y:b}).applyX=function(t){return t*this.k+this.x},m.applyY=function(t){return t*this.k+this.y}}var C=s.select("."+o(t.namespace(),"object-container")),k=f.select("."+o(e.namespace(),"object-container")),F=h.select("."+o(r.namespace(),"object-container")),S=n(C.attr("transform")),A=(n(k.attr("transform")),n(F.attr("transform")),g?m.applyX(S[0]):0);g&&(A=A<-c?(m.x=0,-c):(m.x=0,Math.min(A,0)));var z=p?m.applyY(S[1]):0;p&&(z=z<-l?(m.y=0,-l):(m.y=0,Math.min(z,0))),C.attr("transform","translate("+A+","+z+")"),g&&k.attr("transform","translate("+A+",0)"),p&&F.attr("transform","translate(0,"+z+")")}return g.eventType=function(t){return arguments.length?(a=t,g):a},g.wheelSpeed=function(t){return arguments.length?(i=t,g):i},g.orient=function(t){return arguments.length?(u=t,g):u},g.xLock=function(t){return arguments.length?(c=t,g):c},g.yLock=function(t){return arguments.length?(l=t,g):l},g.setLocks=d,g.reset=function(){var n=s.select("."+o(t.namespace(),"object-container")),a=f.select("."+o(e.namespace(),"object-container")),i=h.select("."+o(r.namespace(),"object-container"));n.attr("transform","translate(0,0)"),a.attr("transform","translate(0,0)"),i.attr("transform","translate(0,0)")},g},V.violin=function(t){var n,o,a,i,c,s,d,g,p="horizontal",x=!0,w=!0,z=function(t,e){return n[t]},M=function(t,e){return d3.descending(n[t],n[e])},j=d3.scaleLinear(),E=.5,L=.05,q=50,O=100,Q=2,B=k(),K=function(t,n,r,o,a){var i=d3.scaleLinear().domain([a,o]).range([-.25,.25]),u=e(r.replace("#",""),i(t)),c="stroke"==n?0:.25;return e(u.replace("#",""),c)},V=3,D=2,P="transparent",R="d3sm-violin",W="violin",Y=1e3,X=d3.easeExp,N=["Q0","Q1","Q2","Q3","Q4"],H=F().keys([N[4],N[3],N[2],N[1],N[0]]);function T(){var e,s,k,z="horizontal"==p,T=m(t,R,{x:0,y:0,width:o,height:a},P),I=void 0==i?d3.keys(n).sort(M):i;c=f(I);var G=function(){var t,n,e=!0,o=["Q0","Q1","Q2","Q3","Q4"];function a(n,a){var i=a[n],u=t(n,i),c=d3.keys(u),l=c.map(function(t,n){return u[t].value}),s=r(l,o),f=d3.histogram()(l),h=f.map(function(t){return t.length}),d=e?{x:0,y:d3.min(l)}:{x:d3.min(l),y:0},g=e?{x:0,y:d3.max(l)}:{x:d3.max(l),y:0},p=f.map(function(t,n){return e?{y:t.length?d3.median(t):d3.median([t.x0,t.x1]),x:h[n]}:{x:t.length?d3.median(t):d3.median([t.x0,t.x1]),y:h[n]}});p=[d].concat(p).concat([g]),i.binned=f,i.frequencies=h,i.contour=p,i.quartiles=s,i.pointKeys=c,i.pointValues=l}return a.horizontalQ=function(t){return arguments.length?(e=t,a):e},a.quartileKeys=function(t){return arguments.length?(o=t,a):o},a.violinPointsExtractor=function(n){return arguments.length?(t=n,a):t},a.violinPointValueExtractor=function(t){return arguments.length?(n=t,a):n},a}().horizontalQ(z).quartileKeys(N).violinPointsExtractor(S).violinPointValueExtractor(A);c.map(function(t,e){G(t,n)});var Z=c.length,$=(e=[]).concat.apply(e,C(c.map(function(t,e){return n[t].quartiles[N[0]]}))),J=(s=[]).concat.apply(s,C(c.map(function(t,e){return n[t].quartiles[N[N.length-1]]}))),U=[Math.min.apply(Math,C($))-E,Math.max.apply(Math,C(J))+E];j.domain(U).range(z?[0,a]:[0,o]);var _=z?o:a;d=v(_,Z,q,O,L,x),g=y(I,_,d,Z,0,x),b().horizontalQ(z).scale(j).moveby("category").numberOfObjects(Z).objectClass(W).objectSize(d).spacerSize(g).transitionDuration(Y).easeFunc(X).namespace(R)(T,I,0);var tt=[];T.selectAll("g:not(.to-remove)."+W).each(function(t,n){l(c,t)&&tt.push(Number(d3.select(this).attr("parent-index")))}),B="index"==B.colorBy()?B.dataExtent([0,Math.max.apply(Math,tt)]):B.dataExtent(U);var nt=Math.max.apply(Math,C((k=[]).concat.apply(k,C(c.map(function(t,e){return d3.max(n[t].frequencies)}))))),et=d3.scaleLinear().domain([0,nt]).range([0,d/2]),rt=d3.line().x(function(t,n){return z?-et(t.x):j(t.x)}).y(function(t,n){return z?j(U[1])-j(t.y):-et(t.y)}).curve(d3.curveBasis),ot=d3.line().x(function(t,n){return z?et(t.x):j(t.x)}).y(function(t,n){return z?j(U[1])-j(t.y):et(t.y)}).curve(d3.curveBasis);T.selectAll("g:not(.to-remove)."+W).each(function(t,e){var r=d3.select(this),o=n[t];if(l(c,t)){e=void 0==r.attr("parent-index")?e:r.attr("parent-index");var a=B(t,o,e,"fill"),i=B(t,o,e,"stroke"),s=u(r,"g","area"),f=u(s,"path","left"),g=u(s,"path","right"),p=u(r,"g","quarts"),m=(u(p,"line","q3"),u(p,"line","q1"),o.quartiles[N[3]],o.quartiles[N[2]]);if(o.quartiles[N[1]],r.attr("transform",z?"translate("+d/2+",0)":"translate(0,"+d/2+")"),f.transition().duration(Y).attr("d",function(t,n){return rt(o.contour)}).attr("fill",a).attr("stroke",i).attr("stroke-width",Q),g.transition().duration(Y).attr("d",function(t,n){return ot(o.contour)}).attr("fill",a).attr("stroke",i).attr("stroke-width",Q),s.node().addEventListener("mouseover",function(t,n){T.selectAll("g."+W).style("opacity",.2),r.style("opacity",1),f.attr("stroke-width",2*Q),g.attr("stroke-width",2*Q)}),s.node().addEventListener("mouseout",function(t,n){T.selectAll("g."+W).style("opacity",1),f.attr("stroke-width",Q),g.attr("stroke-width",Q)}),w){var v=u(r,"g","points"),y=v.selectAll(".point").data(o.pointKeys);y.on("mouseover",null),y.exit().transition().ease(X).duration(Y).attr("r",0).attr("cy",z?j(U[1])-j(m):et(0)).attr("cx",z?et(0):j(m)).remove();var x=y.enter().append("circle").attr("class","point").attr("r",0).attr("cx",z?0:j(m)).attr("cy",z?j(m):0);y=y.merge(x),F().selection(y).data(S(0,o))(),y.transition().duration(Y).ease(X).attr("r",V).attr("cy",function(t,n){var e=o.pointValues[n];if(z)return j(U[1])-j(e);var r=h(o.binned,e),a=Math.random(),i=et(a*o.frequencies[r]*.5);return Math.random()>.5?i:-i}).attr("cx",function(t,n){var e=o.pointValues[n];if(z){var r=h(o.binned,e),a=Math.random(),i=et(a*o.frequencies[r]*.5);return Math.random()>.5?i:-i}return j(e)}).attr("stroke",function(t,n){return t=o.pointValues[n],K(t,"stroke",i,$,J)}).attr("fill",function(t,n){return t=o.pointValues[n],K(t,"fill",i,$,J)}).attr("stroke-width",D),v.selectAll("circle.point").on("mouseover",function(t,n){T.selectAll("g."+W).style("opacity",.2),r.style("opacity",1),f.attr("stroke-width",2*Q),g.attr("stroke-width",2*Q),T.selectAll(".point").style("opacity",.2),d3.select(this).style("opacity",1).attr("r",2*V).attr("stroke-width",2*D)}),v.selectAll("circle.point").on("mouseout",function(t,n){var e=document.createEvent("SVGEvents");e.initEvent("mouseout",!0,!0),s.node().dispatchEvent(e),T.selectAll(".point").style("opacity",1),d3.select(this).attr("stroke-width",D).attr("r",V)})}else cV.selectAll(".point").transition().duration(Y).ease(X).attr("r",0).attr("cy",z?j(U[1])-j(m):et(0)).attr("cx",z?et(0):j(m)).remove()}}),H.selection(T.selectAll("g:not(.to-remove)."+W+" .area")),void 0==H.data()&&H.data(n),H(),H.values([function(t,n){return t.quartiles[n]},function(t,n){return t.quartiles[n]},function(t,n){return t.quartiles[n]},function(t,n){return t.quartiles[n]},function(t,n){return t.quartiles[n]}])}return F(),T.selection=function(n){return arguments.length?(t=n,T):t},T.data=function(t){return arguments.length?(n=t,T):n},T.orient=function(t){return arguments.length?(p=t,T):p},T.spaceX=function(t){return arguments.length?(o=t,T):o},T.spaceY=function(t){return arguments.length?(a=t,T):a},T.overflowQ=function(t){return arguments.length?(x=t,T):x},T.pointsQ=function(t){return arguments.length?(w=t,T):w},T.grouping=function(t){return arguments.length?(i=t,T):i},T.valueExtractor=function(t){return arguments.length?(z=t,T):z},T.sortingFunction=function(t){return arguments.length?(M=t,T):M},T.scale=function(t){return arguments.length?(j=t,T):j},T.domainPadding=function(t){return arguments.length?(E=t,T):E},T.objectSpacer=function(t){return arguments.length?(L=t,T):L},T.minObjectSize=function(t){return arguments.length?(q=t,T):q},T.maxObjectSize=function(t){return arguments.length?(O=t,T):O},T.objectStrokeWidth=function(t){return arguments.length?(Q=t,T):Q},T.colorFunction=function(t){return arguments.length?(B=t,T):B},T.pointColorFunc=function(t){return arguments.length?(K=t,T):K},T.pointRadius=function(t){return arguments.length?(V=t,T):V},T.pointStrokeWidth=function(t){return arguments.length?(D=t,T):D},T.backgroundFill=function(t){return arguments.length?(P=t,T):P},T.namespace=function(t){return arguments.length?(R=t,T):R},T.objectClass=function(t){return arguments.length?(W=t,T):W},T.transitionDuration=function(t){return arguments.length?(Y=t,T):Y},T.easeFunc=function(t){return arguments.length?(X=t,T):X},T.quartileKey=function(t){return arguments.length?(quartileKey=t,T):quartileKey},T.quartileKeys=function(t){return arguments.length?(N=t,T):N},T.violinKeys=function(t){return arguments.length?(c=t,T):c},T.violinValues=function(t){return arguments.length?(s=t,T):s},T.objectSize=function(t){return arguments.length?(d=t,T):d},T.spacerSize=function(t){return arguments.length?(g=t,T):g},T.tooltip=function(t){return arguments.length?(H=t,T):H},T},V.points=function(t){var n=function(t,n){console.log(t)};return function(){var e=t.selectAll(".bow-whisk");console.log(e.nodes()),e.each(function(t,e){var r=u(d3.select(this),"g","points").selectAll(".point").data(n(t)),o=(r.exit(),r.enter().append("circle").attr("class","point"));r=r.merge(o)})}},V.uniqueElements=t,V.getTranslation=n,V.modifyHexidecimalColorLuminance=e,V.tickRange=c,V.quartiles=r,V.extractViolinValues=function(t,n,e,o,a,i){var u={};return t.map(function(t,c){var l=e(t,c,n),s=d3.histogram()(l),f=s.map(function(t){return t.length}),h=o?{y:d3.min(l),x:0}:{x:d3.min(l),y:0},d=o?{y:d3.max(l),x:0}:{x:d3.max(l),y:0},g=s.map(function(t,n){return o?{y:t.length?d3.median(t):d3.median([t.x0,t.x1]),x:f[n]}:{x:t.length?d3.median(t):d3.median([t.x0,t.x1]),y:f[n]}}),p=r(l,i),m={values:l,binned:s,frequencies:f,points:[h].concat(g).concat([d])};m[a]=p,u[t]=m}),u},V.hypenate=o,V.round=a,V.getContainingSVG=function t(n){var e=n.parentElement,r=e.tagName.toLowerCase();return"svg"===r?e:"html"!==r?t(e):void 0},V.interpolateColors=function(){return d3.interpolateRgbBasis(arguments)},V.truncateText=i,V.safeSelect=u,V.whichBin=h,V.unique=s,V.setupStandardChartContainers=function(t,n){var e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{w:availableWidth=window.innerWidth,h:availableHeight=window.innerHeight},r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{top:.01,bottom:.01,left:.01,right:.01},a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{axes:{x:xAxisPercent=.1,y:yAxisPercent=.1},space:{w:percentOfSpaceForWidth,h:percentOfSpaceForHeight}};void 0==e&&(e={w:window.innerWidth,h:window.innerHeight}),void 0==r&&(r={top:.01,bottom:.01,left:.01,right:.01}),void 0==a&&(a={}),void 0==a.axes&&(a.axes={x:.1,y:.1}),void 0==a.space&&(a.space={w:.8,h:.6});var i={w:e.w*a.space.w,h:e.h*a.space.h},c=i.w-r.left*e.w-r.right*e.w,l=i.h-r.top*e.h-r.bottom*e.h,s={x:l*a.axes.x,y:c*a.axes.y},f={x:c-s.y,y:l-s.x},h={x:s.y+r.left*e.w,y:r.top*e.h,w:s.y,h:f.y},d={x:s.y+r.left*e.w,y:r.top*e.h,w:f.x,h:f.y},g={x:s.y+r.left*e.w,y:r.top*e.h+d.h,w:f.x,h:s.x},p=u(t,"svg",n).style("width",i.w+"px").style("height",i.h+"px"),m=u(p,"g",o(n,"axes"));return{svg:{selection:p,rect:i},plot:{selection:u(p,"g",o(n,"plot")).attr("transform","translate("+d.x+","+d.y+")"),rect:d},xAxis:{selection:u(m,"g",o(n,"x-axis")).attr("transform","translate("+g.x+","+g.y+")"),rect:g},yAxis:{selection:u(m,"g",o(n,"y-axis")).attr("transform","translate("+h.x+","+h.y+")"),rect:h}}},V.log=p,V.warn=function(t,n,e){!0===window.d3sm.debugQ&&console.warn("%c[d3sm::"+t+"]:\t"+n,["background: #ffd53e","border-radius: 5000px","padding: 0px 2px","font-size: 14px"].join(";")),console.table(e)},V.info=function(t,n,e){window.d3sm.debugQ&&console.info("%c[d3sm::"+t+"]:\t"+n,["background: #009ccd","border-radius: 5000px","padding: 0px 2px","font-size: 14px"].join(";")),console.table(e)},V.error=function(t,n,e){window.d3sm.debugQ&&console.error("[d3sm::"+t+"]:\t"+n+"\t%o",e)},V.consoleGroup=d,V.consoleGroupEnd=g,V.debugQ=!1;K("app:log");K.disable(),window.d3sm=V}(); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZDNzbS5taW4uanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JpcHRzL21vZHVsZXMvaGVscGVycy5qcyIsIi4uLy4uL3NyYy9zY3JpcHRzL21vZHVsZXMvYXJyYXktZnVuY3Rpb25zLmpzIiwiLi4vLi4vc3JjL3NjcmlwdHMvbW9kdWxlcy91dGlscy5qcyIsIi4uLy4uL3NyYy9zY3JpcHRzL21vZHVsZXMvZ3JvdXBpbmctc3BhY2VyLmpzIiwiLi4vLi4vc3JjL3NjcmlwdHMvbW9kdWxlcy9jb2xvci1mdW5jdGlvbi5qcyIsIi4uLy4uL3NyYy9zY3JpcHRzL21vZHVsZXMvdG9vbHRpcC5qcyIsIi4uLy4uL3NyYy9zY3JpcHRzL21vZHVsZXMvdmlvbGluLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL21zL2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9kZWJ1Zy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvYnJvd3Nlci5qcyIsIi4uLy4uL3NyYy9zY3JpcHRzL21haW4uanMiLCIuLi8uLi9zcmMvc2NyaXB0cy9tb2R1bGVzL2F4aXMuanMiLCIuLi8uLi9zcmMvc2NyaXB0cy9tb2R1bGVzL2Jhci5qcyIsIi4uLy4uL3NyYy9zY3JpcHRzL21vZHVsZXMvYnViYmxlLWhlYXRtYXAuanMiLCIuLi8uLi9zcmMvc2NyaXB0cy9tb2R1bGVzL2JveC13aGlza2VyLmpzIiwiLi4vLi4vc3JjL3NjcmlwdHMvbW9kdWxlcy9kYXRhLXRvZ2dsZS5qcyIsIi4uLy4uL3NyYy9zY3JpcHRzL21vZHVsZXMvc2NhdHRlci5qcyIsIi4uLy4uL3NyYy9zY3JpcHRzL21vZHVsZXMvcGxvdC16b29tLmpzIiwiLi4vLi4vc3JjL3NjcmlwdHMvbW9kdWxlcy9wb2ludHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gaW1wb3J0IHtoYXNRfSBmcm9tICcuL2FycmF5LWZ1bmN0aW9ucyc7XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEVMUEVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqXG4qIEhlbHBlciBmdW5jdGlvbiBmb3IgQXJyYXkuZmlsdGVyIHRvIGdldCB1bmlxdWUgZWxlbWVudHMgb2YgdGhlIGFycmF5XG4qIEBwYXJhbSB7Kn0gdmFsdWUgY3VycmVudCB2YWx1ZSBhcyBtYXBwaW5nIG92ZXIgYXJyYXkgKHNlbGYpXG4qIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBjdXJyZW50IGluZGV4IGluIHRoZSBhcnJheVxuKiBAcGFyYW0ge0FycmF5fSBzZWxmIHBhc3NlZCBhcnJheSBmcm9tIEFycmF5LmZpbHRlciBtZXRob2RcbiogQHJldHVybnMge2Jvb2xlYW59IHdoZXRoZXIgb3Igbm90IHZhbHVlIGlzIHRoZSBmaXJzdCBvZiBpdHMga2luZCAoaS5lLiBpbmRleE9mKHZhbHVlKSA9PSBpbmRleClcbiovXG5leHBvcnQgZnVuY3Rpb24gdW5pcXVlRWxlbWVudHModmFsdWUsIGluZGV4LCBzZWxmKSB7IHJldHVybiBzZWxmLmluZGV4T2YodmFsdWUpID09PSBpbmRleDsgfVxuXG4vKipcbiogRXh0cmFjdHMgeCBhbmQgeSBvZiB0cmFuc2xhdGUgZnJvbSB0cmFuc2Zvcm0gcHJvcGVydHlcbiogQHBhcmFtIHtzdHJpbmd9IHRyYW5zZm9ybSB0cmFuc2Zvcm0gcHJvcGVydHkgb2Ygc3ZnIGVsZW1lbnRcbiogQHJldHVybnMge251bWJlcltdfSB4LCB5IG9mIHRyYW5zbGF0ZSh4LCB5KVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUcmFuc2xhdGlvbih0cmFuc2Zvcm0pIHtcbiAgLy8gQ3JlYXRlIGEgZHVtbXkgZyBmb3IgY2FsY3VsYXRpb24gcHVycG9zZXMgb25seS4gVGhpcyB3aWxsIG5ldmVyXG4gIC8vIGJlIGFwcGVuZGVkIHRvIHRoZSBET00gYW5kIHdpbGwgYmUgZGlzY2FyZGVkIG9uY2UgdGhpcyBmdW5jdGlvblxuICAvLyByZXR1cm5zLlxuICB2YXIgZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnZycpO1xuICAvLyBTZXQgdGhlIHRyYW5zZm9ybSBhdHRyaWJ1dGUgdG8gdGhlIHByb3ZpZGVkIHN0cmluZyB2YWx1ZS5cbiAgdHJhbnNmb3JtID0gdHJhbnNmb3JtID09IHVuZGVmaW5lZCA/ICd0cmFuc2xhdGUoMCwwKScgOiB0cmFuc2Zvcm07XG4gIGcuc2V0QXR0cmlidXRlTlMobnVsbCwgJ3RyYW5zZm9ybScsIHRyYW5zZm9ybSk7XG4gIC8vIGNvbnNvbGlkYXRlIHRoZSBTVkdUcmFuc2Zvcm1MaXN0IGNvbnRhaW5pbmcgYWxsIHRyYW5zZm9ybWF0aW9uc1xuICAvLyB0byBhIHNpbmdsZSBTVkdUcmFuc2Zvcm0gb2YgdHlwZSBTVkdfVFJBTlNGT1JNX01BVFJJWCBhbmQgZ2V0XG4gIC8vIGl0cyBTVkdNYXRyaXguXG4gIHZhciBtYXRyaXggPSBnLnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCkubWF0cml4O1xuICAvLyBBcyBwZXIgZGVmaW5pdGlvbiB2YWx1ZXMgZSBhbmQgZiBhcmUgdGhlIG9uZXMgZm9yIHRoZSB0cmFuc2xhdGlvbi5cbiAgcmV0dXJuIFttYXRyaXguZSwgbWF0cml4LmZdO1xufVxuXG5cbi8qKlxuKiBNb2RpZmllcyBsdW1pbmFuY2Ugb2YgaGV4aWRlY2ltYWwgbnVtYmVyXG4qIEBwYXJhbSB7c3RyaW5nfSBoZXggc2hvdWxkIGJlIGhleGlkZWNpbWFsIHZhbHVlIHdpdGggb3Igd2l0aG91dCB0aGUgcHJvY2VlZGluZyBvY3RvdHJvcGVcbiogQHBhcmFtIHtudW1iZXJ9IGx1bSB2YWx1ZSB0byBpbmNyZWFzZSBvciBkZWNyZWFzZSBsdW1pbm9zaXR5IGJ5XG4qIEByZXR1cm5zIHtzdHJpbmd9IHVwZGF0ZWQgaGV4aWRlY2ltYWwgdmFsdWUgd2l0aG91dCB0aGUgcHJvY2VlZGluZyBvY3RvdHJvcGVcbiovXG5leHBvcnQgZnVuY3Rpb24gbW9kaWZ5SGV4aWRlY2ltYWxDb2xvckx1bWluYW5jZShoZXgsIGx1bSkge1xuICAvLyB2YWxpZGF0ZSBoZXggc3RyaW5nXG4gIHZhciBoZXggPSBTdHJpbmcoaGV4KS5yZXBsYWNlKC9bXjAtOWEtZl0vZ2ksICcnKTtcblxuICBpZiAoaGV4Lmxlbmd0aCA8IDYpIHtcbiAgICBoZXggPSBoZXhbMF0raGV4WzBdK2hleFsxXStoZXhbMV0raGV4WzJdK2hleFsyXTtcblx0fVxuXHRsdW0gPSBsdW0gfHwgMDtcblxuXHQvLyBjb252ZXJ0IHRvIGRlY2ltYWwgYW5kIGNoYW5nZSBsdW1pbm9zaXR5XG5cdHZhciByZ2IgPSAnIycsIGMsIGk7XG5cdGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHtcblx0XHRjID0gcGFyc2VJbnQoaGV4LnN1YnN0cihpKjIsMiksIDE2KTtcblx0XHRjID0gTWF0aC5yb3VuZChNYXRoLm1pbihNYXRoLm1heCgwLCBjICsgKGMgKiBsdW0pKSwgMjU1KSkudG9TdHJpbmcoMTYpO1xuXHRcdHJnYiArPSAoJzAwJytjKS5zdWJzdHIoYy5sZW5ndGgpO1xuXHR9XG5cblx0cmV0dXJuIHJnYjtcbn1cblxuXG4vKipcbiogQGRlcHJlY2F0ZWQgQHNlZXtAbGluayB0aWNrUmFuZ2V9XG4qIEBwYXJhbSB7bnVtYmVyfSBtaW5cbiogQHBhcmFtIHtudW1iZXJ9IG1heFxuKiBAcGFyYW0ge251bWJlcn0gcGFydHNcbiogQHJldHVybnMge251bWJlcltdfSBhcnJheSBvZiBsZW5ndGggcGFydHMgZXZlbmx5IHBhcnRpdGlvbmVkIGJldHdlZW4gbWluIGFuZCBtYXhcbiovXG5leHBvcnQgZnVuY3Rpb24gcGFydGl0aW9uUmFuZ2VJbnRvKG1pbiwgbWF4LCBwYXJ0cykge1xuICB2YXIgZGlmZiA9IG1heCAtIG1pblxuICByZXR1cm4gQXJyYXkocGFydHMpLm1hcChmdW5jdGlvbiAoZSwgaSkgeyByZXR1cm4gbWluICsgZGlmZiAvIHBhcnRzICogaSB9KVxufVxuXG5cbi8qKlxuKiBDYWxjdWxhdGVkIHRoZSBxdWFydGlsZXMgb2YgdGhlIHBhc3NlZCBkYXRhIGFuZCBzdG9yZXMgdGhlbSB3aXRoIHFLZXlzXG4qIEBwYXJhbSB7bnVtYmVyW119IGRhdGEgbGlzdCBvZiBudW1lcmljYWwgdmFsdWVzXG4qIEBwYXJhbSB7c3RyaW5nW119IFtxS2V5cz1bJ3EwJywgJ3ExJywgJ3EyJywgJ3EzJywgJ3E0J11dIGhvdyByZXR1cm5lZCBvYmplY3Qgd2l0aCBxdWFydGlsZXMgc2hvdWxkIGJlIHN0b3JlZFxuKiBAcmV0dXJucyB7T2JqZWN0fSB3aXRoIGtleXMgcUtleXMgZ2l2aW5nIG9ubHkgdGhlIG51bWVyaWNhbCB2YWx1ZXMgZm9yIHRoZSBxdWFydGlsZXNcbiovXG5leHBvcnQgZnVuY3Rpb24gcXVhcnRpbGVzKGRhdGEsIHFLZXlzKSB7XG4gIHZhclxuICBxMiA9IGQzLm1lZGlhbihkYXRhKSxcbiAgbG93ZXIgPSBkYXRhLmZpbHRlcih4ID0+IHggPCBxMiksXG4gIHVwcGVyID0gZGF0YS5maWx0ZXIoeCA9PiB4ID4gcTIpLFxuXG4gIHExID0gZDMubWVkaWFuKGxvd2VyKSxcbiAgcTEgPSBxMSA9PSB1bmRlZmluZWQgPyBxMiA6IHExLFxuXG4gIHEwID0gZDMubWluKGxvd2VyKSxcbiAgcTAgPSBxMCA9PSB1bmRlZmluZWQgPyBxMSA6IHEwLFxuXG4gIHEzID0gZDMubWVkaWFuKHVwcGVyKSxcbiAgcTMgPSBxMyA9PSB1bmRlZmluZWQgPyBxMiA6IHEzLFxuXG4gIHE0ID0gZDMubWF4KHVwcGVyKSxcbiAgcTQgPSBxNCA9PSB1bmRlZmluZWQgPyBxMyA6IHE0LFxuXG4gIGswID0gJ3EwJywgazEgPSAncTEnLCBrMiA9ICdxMicsIGszID0gJ3EzJywgazQgPSAncTQnLFxuICBvYmogPSB7fVxuICBpZiAocUtleXMhPXVuZGVmaW5lZCAmJiBxS2V5cy5sZW5ndGggPT0gNSkgeyBrMCA9IHFLZXlzWzBdOyBrMSA9IHFLZXlzWzFdOyBrMiA9IHFLZXlzWzJdOyBrMyA9IHFLZXlzWzNdOyBrNCA9IHFLZXlzWzRdOyB9XG4gIG9ialtrMF0gPSBxMDsgb2JqW2sxXSA9IHExOyBvYmpbazJdID0gcTI7IG9ialtrM10gPSBxMzsgb2JqW2s0XSA9IHE0O1xuXG4gIHJldHVybiBvYmpcbn1cblxuXG4vKipcbiogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCBhbGwgdmFsdWVzIG5lZWRlZCBpbiBtYWtpbmcgdmlvbGluIHBsb3RzXG4qIEBwYXJhbSB7c3RyaW5nW119IHZpb2xpbktleXNcbiogQHBhcmFtIHtudW1iZXJbXX0gZGF0YVxuKiBAcGFyYW0ge0Z1bmN0aW9ufSB2YWx1ZUV4dHJhY3RvckZ1bmN0aW9uIGhvdyB0byBnZXQgdmFsdWVzIGZyb20gZGF0YVt2aW9saW5LZXlzW2ldXVxuKiBAcGFyYW0ge2Jvb2xlYW59IGhvcml6b250YWxRIHdoZXRoZXIgb3Igbm90IHZpb2xpbnMgd2lsbCBiZSByZW5kZXJlZCBob3Jpem9udGFsbHkgb3IgdmVydGljYWxseVxuKiBAcGFyYW0ge3N0cmluZ30gcUtleSBob3cgdGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBxdWFydGlsZXMgc2hvdWxkIGJlIGxhYmVsZWQgYXNcbiogQHBhcmFtIHtzdHJpbmdbXX0gcUtleXMgaG93IGVhY2ggcXVhcnRpbGUgc2hvdWxkIGJlIGxhYmVsZWQgYXNcbiogQHJldHVybnMge09iamVjdH0gcmVxdWlyZWQgZm9yIEBzZWV7QGxpbmsgdmlvbGlufSBjb250YWluaW5nIGtleXMgdmFsdWVzLCBiaW5ubmVkLCBmcmVxdWVuY2llcywgcG9pbnRzLCBhbmQgcXVhcnRpbGVzXG4qIEBzZWV7QGxpbmsgcXVhcnRpbGVzfVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0VmlvbGluVmFsdWVzKFxuICB2aW9saW5LZXlzLFxuICBkYXRhLFxuICB2YWx1ZUV4dHJhY3RvckZ1bmN0aW9uLFxuICBob3Jpem9udGFsUSxcbiAgcUtleSxcbiAgcUtleXNcbil7XG4gIHZhciBvYmogPSB7fVxuICB2aW9saW5LZXlzLm1hcChmdW5jdGlvbihrLCBpKXtcbiAgICAgdmFyIGQgPSB2YWx1ZUV4dHJhY3RvckZ1bmN0aW9uKGssIGksIGRhdGEpLFxuICAgICBiaW5uZWQgPSBkMy5oaXN0b2dyYW0oKShkKSxcbiAgICAgZnJlcXVlbmNpZXMgPSBiaW5uZWQubWFwKHg9PngubGVuZ3RoKSxcbiAgICAgbWluUG9pbnQgPSBob3Jpem9udGFsUSA/IHt5OiBkMy5taW4oZCksIHg6IDB9IDoge3g6IGQzLm1pbihkKSwgeTogMH0sXG4gICAgIG1heFBvaW50ID0gaG9yaXpvbnRhbFEgPyB7eTogZDMubWF4KGQpLCB4OiAwfSA6IHt4OiBkMy5tYXgoZCksIHk6IDB9LFxuICAgICBwb2ludHMgPSBiaW5uZWQubWFwKGZ1bmN0aW9uKGJpbiwgaSkge1xuICAgICAgIHJldHVybiBob3Jpem9udGFsUVxuICAgICAgID8ge3k6IChiaW4ubGVuZ3RoKSA/IGQzLm1lZGlhbihiaW4pOiBkMy5tZWRpYW4oW2Jpbi54MCwgYmluLngxXSksIHg6IGZyZXF1ZW5jaWVzW2ldfVxuICAgICAgIDoge3g6IChiaW4ubGVuZ3RoKSA/IGQzLm1lZGlhbihiaW4pOiBkMy5tZWRpYW4oW2Jpbi54MCwgYmluLngxXSksIHk6IGZyZXF1ZW5jaWVzW2ldfVxuICAgICB9KSxcbiAgICAgcXVhcnRzID0gcXVhcnRpbGVzKGQsIHFLZXlzKSxcbiAgICAgbyA9IHtcbiAgICAgICB2YWx1ZXM6IGQsXG4gICAgICAgYmlubmVkOiBiaW5uZWQsXG4gICAgICAgZnJlcXVlbmNpZXM6IGZyZXF1ZW5jaWVzLFxuICAgICAgIHBvaW50czogW21pblBvaW50XS5jb25jYXQocG9pbnRzKS5jb25jYXQoW21heFBvaW50XSlcbiAgICAgfVxuICAgICBvW3FLZXldID0gcXVhcnRzO1xuICAgICBvYmpba10gPSBvO1xuICAgfSk7XG4gICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiogSHlwZW5hdGVzIGFsbCBzdHJpbmdzIHRvZ2V0aGVyXG4qIEBwYXJhbSB7c3RyaW5nW119IGFyZ3VtZW50c1xuKiBAcmV0dXJucyB7c3RyaW5nfSBcImFyZzEtYXJnMi0uLi4tYXJnblwiXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGh5cGVuYXRlKCl7IHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLmpvaW4oJy0nKSB9XG5cblxuLyoqXG4qIFJvdW5kcyBkZWNpbWFscyBvZiBudW1iZXIgdG8gcHJlY2lzaW9uXG4qIEBwYXJhbSB7bnVtYmVyfSBudW1iZXJcbiogQHBhcmFtIHtudW1iZXJ9IHByZWNpc2lvblxuKiBAcmV0dXJucyB7bnVtYmVyfSByb3VuZGVkIHRvIHByZWNpc2lvblxuKi9cbmV4cG9ydCBmdW5jdGlvbiByb3VuZChudW1iZXIsIHByZWNpc2lvbikge1xuICB2YXIgc2hpZnQgPSBmdW5jdGlvbiAobnVtYmVyLCBwcmVjaXNpb24sIHJldmVyc2VTaGlmdCkge1xuICAgIGlmIChyZXZlcnNlU2hpZnQpIHtcbiAgICAgIHByZWNpc2lvbiA9IC1wcmVjaXNpb247XG4gICAgfVxuICAgIHZhciBudW1BcnJheSA9ICgnJyArIG51bWJlcikuc3BsaXQoJ2UnKTtcbiAgICByZXR1cm4gKyhudW1BcnJheVswXSArICdlJyArIChudW1BcnJheVsxXSA/ICgrbnVtQXJyYXlbMV0gKyBwcmVjaXNpb24pIDogcHJlY2lzaW9uKSk7XG4gIH07XG4gIHJldHVybiBzaGlmdChNYXRoLnJvdW5kKHNoaWZ0KG51bWJlciwgcHJlY2lzaW9uLCBmYWxzZSkpLCBwcmVjaXNpb24sIHRydWUpO1xufVxuXG4vKipcbiogcmVjdXJzaXZlbHkgYXNjZW5kcyBlbGVtZW50LnBhcmVudEVsZW1lbnQgdG8gZmluZCBhIHN2ZyB0YWdcbiogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4qIEByZXR1cm5zIHtFbGVtZW50IHwgdW5kZWZpbmVkfVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb250YWluaW5nU1ZHKGVsZW1lbnQpIHtcbiAgdmFyIHBhcmVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudFxuICB2YXIgdGFnID0gcGFyZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKVxuICBpZiAodGFnID09PSAnc3ZnJykgeyByZXR1cm4gcGFyZW50OyB9XG4gIGlmICh0YWcgPT09ICdodG1sJykgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIHJldHVybiBnZXRDb250YWluaW5nU1ZHKHBhcmVudCk7XG59XG5cbi8qKlxuKiBNYXBzIGFyZ3VtZW50cyBpbiB0byBkMy5pbnRlcnBvbGF0ZVJnYkJhc2lzXG4qIEBwYXJhbSBhcmd1bWVudHNcbiogQHJldHVybnMge0Z1bmN0aW9ufVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcnBvbGF0ZUNvbG9ycygpe3JldHVybiBkMy5pbnRlcnBvbGF0ZVJnYkJhc2lzKGFyZ3VtZW50cyl9XG5cblxuLyoqXG4qIFRyeXMgdG8gcmVkdWNlIHRleHQgdG8gZml0IGluIHNwZWNpZmllZCBhcmVhLCBtYWRlIGZvciB0aWNrIGxhYmVscyBhcyBjYWxsZWQgYnlcbiogQHNlZXtAbGluayBheGlzfVxuKiBAcGFyYW0ge2QzLnNlbGVjdGlvbn0gdCBjb250YWluZXIgZm9yIHNwZWNpZmljIGF4aXMgdGlja1xuKiBAcGFyYW0ge3N0cmluZ30gdGV4dCB0byBiZSB0aGUgbGFiZWwgb2YgdGhlIHBhc3NlZCBheGlzIHRpY2tcbiogQHBhcmFtIHtib29sZWFufSBvcmllbnQgb2YgdGhlIGF4aXMsIHRydWUgaXMgaG9yaXpvbnRhbCwgZmFsc2UgaXMgdmVydGljYWxcbiogQHBhcmFtIHtudW1iZXJ9IHRpY2tMZW5ndGggaXMgdGhlIGxlbmd0aCBvZiB0aGUgdGV4dFxuKiBAcGFyYW0ge251bWJlcn0gc3BhY2UgaXMgdGhlIGFtb3VudCBvZiBhdmFpbGJsZSBzcGFjZSBmb3IgdGhlIHRleHQgYW5kIHRoZSB0aWNrIHRvIGZpdCBpblxuKiBAcGFyYW0ge2Jvb2xlYW59IG92ZXJmbG93USB3aGV0aGVyIG9yIG5vdCBhbGxvd2VkIHRvIGdvIG92ZXIgdGhlIGFsbG90ZWQgc3BhY2VcbiogQHJldHVybnMge25vbmV9XG4qL1xuZXhwb3J0IGZ1bmN0aW9uIHRydW5jYXRlVGV4dCh0LCB0ZXh0LCBvcmllbnQsIHRpY2tMZW5ndGgsIHNwYWNlLCBvdmVyZmxvd1EpIHtcbiAgdmFyIHJlY3QgPSB0Lm5vZGUoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICB0LnRleHQodGV4dClcbiAgd2hpbGUgKE1hdGgubWF4KHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KSA+IHNwYWNlIC0gdGlja0xlbmd0aCkge1xuICAgIHRleHQgPSBTdHJpbmcodGV4dClcbiAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCB0ZXh0Lmxlbmd0aCAtIDEpXG4gICAgdC50ZXh0KHRleHQgKyAnLi4uJylcbiAgICByZWN0ID0gdC5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICBpZiAodGV4dC5sZW5ndGggPT0gMCkgYnJlYWtcbiAgfVxufVxuXG5cbi8qKlxuKiBUcnlzIHRvIHVzZSBkMy5zZWxlY3Rpb24gdG8gZ2V0IGVsZW1lbnQsIGlmIGl0IGRvZXNudCBleGlzdCwgbWFrZXMgb25lXG4qIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBzZWwgc2VsZWN0aW9uIGluIHdoaWNoIHRvIHRyeSBhbmQgZmluZCBvYmplY3RcbiogQHBhcmFtIHtzdHJpbmd9IHRhZyB0YWcgb2Ygd2hpY2ggdG8gdHJ5IGFuZCBzZWxlY3RcbiogQHBhcmFtIHtzdHJpbmd9IFtjbHM9JyddIGNsYXNzIG9mIHRhZyB0byB0cnkgYW5kIGdyYWJcbiogQHJldHVybnMge2QzLnNlbGVjdGlvbn0gb2YgZWl0aGVyIGFwcGVuZCBvciBzZWxlY3RlZCB0YWcuY2xzIHdpdGhpbiBzZWxcbiovXG5leHBvcnQgZnVuY3Rpb24gc2FmZVNlbGVjdChzZWwsIHRhZywgY2xzKSB7XG4gIHZhciBjbHNTdHIgPSBjbHMgPT0gdW5kZWZpbmVkID8gJycgOiAnLicrY2xzO1xuICB2YXIgc1NlbCA9IHNlbC5zZWxlY3QodGFnK2Nsc1N0cikuZW1wdHkoKVxuICA/IHNlbC5hcHBlbmQodGFnKVxuICA6IHNlbC5zZWxlY3QodGFnK2Nsc1N0cilcbiAgcmV0dXJuIHNTZWxcbiAgLmNsYXNzZWQoY2xzU3RyLnJlcGxhY2UoJy4nLCAnJyksIHRydWUpXG4gIC5hdHRyKCd0cmFuc2Zvcm0nLCBzU2VsLmF0dHIoJ3RyYW5zZm9ybScpID09IHVuZGVmaW5lZCA/ICd0cmFuc2xhdGUoMCwwKScgOiBzU2VsLmF0dHIoJ3RyYW5zZm9ybScpKVxufVxuXG4vKipcbiogZXZlbmx5IHBhcnRpdGlvbnMgdGhlIHJhbmdlIFttaW4sIG1heF0gaW50byBuIHBhcnRzXG4qIEBwYXJhbSB7bnVtYmVyfSBtaW5cbiogQHBhcmFtIHtudW1iZXJ9IG1heFxuKiBAcGFyYW0ge251bWJlcn0gblxuKiBAcmV0dXJucyB7bnVtYmVyW119IGFycmF5IG9mIGxlbmd0aCBuIGV2ZW5seSBwYXJ0aXRpb25lZCBiZXR3ZWVuIG1pbiBhbmQgbWF4XG4qL1xuZXhwb3J0IGZ1bmN0aW9uIHRpY2tSYW5nZShtaW4sIG1heCwgbikge1xuICB2YXIgYSA9IFttaW5dXG4gIHZhciBkID0gbWF4LW1pblxuICB2YXIgcyA9IGQgLyAobi0xKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IG4tMjsgaSsrKSB7IGEucHVzaChtaW4gKyBzICogKGkrMSkpIH1cbiAgYS5wdXNoKG1heClcbiAgcmV0dXJuIGFcbn1cbiIsImltcG9ydCB7dW5pcXVlRWxlbWVudHN9IGZyb20gJy4vaGVscGVycyc7XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1RPVFlQRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqXG4qIFRoaXMgZnVuY3Rpb24gdGVzdHMgdG8gc2VlIGlmIGFsbCBlbGVtZW50cyBvZiB0aGUgcGFzc2VkIGFycmF5IGFyZSB0cnVlLlxuKiBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiB2YWx1ZXNcbiogQHBhcmFtIHtGdW5jdGlvbn0gW2Z1bmMgZnVuY3Rpb24odmFsdWUpe3JldHVybiB2YWx1ZSA9PSB0cnVlO31dIGlzIGFwcGxpZWQgdG8gZWFjaCB2YWx1ZSBvZiB0aGUgYXJyYXkgYW5kIHNob3VsZCByZXR1cm4gYSBib29sZWFuLlxuKiBAcmV0dXJucyB7Ym9vbGVhbn0gaWYgYWxsIHZhbHVlcyBhcmUgdHJ1ZSBieSBmdW5jdGlvblxuKi9cbmV4cG9ydCBmdW5jdGlvbiBhbGwoIGFycmF5LCBmdW5jICkge1xuICBpZiAoZnVuYyA9PSB1bmRlZmluZWQpIHsgcmV0dXJuIGFycmF5LmV2ZXJ5KCBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWUgPT09IHRydWU7IH0pOyB9XG4gIHJldHVybiBhcnJheS5ldmVyeSggZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIGZ1bmModmFsdWUpOyB9ICk7XG59XG5cbi8qKlxuKiBDb3VudHMgdGhlIG51bWJlciBvZiBvY2N1cmFuY2VzIG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgZ2l2ZW4gYXJyYXkuXG4qIEBwYXJhbSB7QXJyYXl9IGFycmF5IG9mIGVsZW1lbnRzXG4qIEByZXR1cm5zIHtPYmplY3R9IG9mIGtleTogdmFsdWUgcGFpcnMgd2hlcmUga2V5IGlzIGFuIGVsZW1lbnQgaW4gdGhlIGFycmF5IGFuZCB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIGl0IG9jY3Vycy5cbiovXG5leHBvcnQgZnVuY3Rpb24gdGFsbHkoIGFycmF5ICkge1xuICB2YXIgdGFsbGllcyA9IHt9O1xuICBhcnJheS5tYXAoIGZ1bmN0aW9uICggZWxlbWVudCApIHtcbiAgICBpZiAoIGhhc1EoT2JqZWN0LmtleXModGFsbGllcyksIGVsZW1lbnQpICkgeyB0YWxsaWVzW2VsZW1lbnRdID0gMTsgfVxuICAgIGVsc2UgeyB0YWxsaWVzW2VsZW1lbnRdICs9IDE7IH1cbiAgfSk7XG4gIHJldHVybiB0YWxsaWVzO1xufVxuLyoqXG4qIFNob3J0LWhhbmQgZm9yIGFycmF5LmluY2x1ZGVzKGl0ZW0pO1xuKiBAcGFyYW0ge0FycmF5fSBhcnJheVxuKiBAcGFyYW0geyp9IGl0ZW0gdG8gdGVzdCBpZiBjb250YWluZWQgaW4gIHthcnJheX1cbiogQHJldHVybnMge2Jvb2xlYW59XG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1EoIGFycmF5LCBpdGVtICkgeyByZXR1cm4gYXJyYXkuaW5jbHVkZXMoaXRlbSk7IH1cblxuLyoqXG4qIFJldHVybnMgZmlyc3QgaXRlbSBpbiBhcnJheVxuKiBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiBpdGVtc1xuKiBAcmV0dXJucyB7Kn0gYXJyYXlbMF1cbiovXG5leHBvcnQgZnVuY3Rpb24gZmlyc3QoIGFycmF5ICkgeyByZXR1cm4gYXJyYXlbMF07IH1cblxuLyoqXG4qIFJldHVybnMgbGFzdCBpdGVtIGluIGFycmF5XG4qIEBwYXJhbSB7QXJyYXl9IGFycmF5IG9mIGl0ZW1zXG4qIEByZXR1cm5zIHsqfSBhcnJheVthcnJheS5sZW5ndGgtMV1cbiovXG5leHBvcnQgZnVuY3Rpb24gbGFzdCggYXJyYXkgKSB7IHJldHVybiBhcnJheVthcnJheS5sZW5ndGgtMV07IH1cblxuLyoqXG4qIENhbGN1bGF0ZXMgdGhlIHRvdGFsIHZhbHVlIG9mIG51bWJlcnMgaW4gcGFzc2VkIGFycmF5XG4qIEBwYXJhbSB7bnVtYmVyW119IGFycmF5IG9mIG51bWVyaWNhbCB2YWx1ZXNcbiogQHJldHVybnMge251bWJlcn0gc3VtIG92ZXIgZWxlbWVudHMgaW4gYXJyYXlcbiovXG5leHBvcnQgZnVuY3Rpb24gdG90YWwoIGFycmF5ICkgeyByZXR1cm4gYXJyYXkucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCkgfTtcblxuLyoqXG4qIFJlbW92ZXMgZHVwbGljYXRlcyBpbiBhcnJheVxuKiBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiBpdGVtc1xuKiBAcmV0dXJucyB7QXJyYXl9IG9mIGl0ZW1zIHN1Y2ggdGhhdCBpdGVtX2kgIT0gaXRlbV9qIGZvciBhbGwgaSA8IGpcbiogQHNlZXtAbGluayB1bmlxdWVFbGVtZW50c30gZm9yIHRoZSBmaWx0ZXJpbmcgZnVuY3Rpb25cbiovXG5leHBvcnQgZnVuY3Rpb24gdW5pcXVlKCBhcnJheSApIHsgcmV0dXJuIGFycmF5LmZpbHRlciggdW5pcXVlRWxlbWVudHMgKTsgfVxuXG4vKipcbiogRmlsdGVycyBwYXNzZWQgYXJyYXkgZm9yIHNwZWNpZmllZCBpbmRpY2llc1xuKiBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiBpdGVtc1xuKiBAcGFyYW0ge251bWJlcltdfSBwb3NpdGlvbnMgb2YgaW50ZWdlcnMgc3VjaCB0aGF0IGkgPCBhcnJheS5sZW5ndGhcbiogQHJldHVybnMge0FycmF5fSBvZiBpdGVtcyBzdWNoIHRoYXQgZm9yIGFueSBpdGVtX2ksIHBvc2l0aW9ucy5pbmNsdWRlcyhpKSA9PT0gdHJ1ZVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXQoIGFycmF5LCBwb3NpdGlvbnMgKSB7XG4gIHJldHVybiBhcnJheS5maWx0ZXIoIGZ1bmN0aW9uKCB2YWx1ZSwgaW5kZXggKSB7IHJldHVybiBoYXNRKHBvc2l0aW9ucywgaW5kZXgpOyB9ICk7XG59XG5cbi8qKlxuKiBEZXRlcm1pbmVzIGlmIGFsbCBlbGVtZW50cyBpbiBwYXNzZWQgYXJyYXkgYXJlIGFycmF5cyB0aGVtc2VsdmVzLlxuKiBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiBpdGVtc1xuKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiBBcnJheS5pc0FycmF5KGUpIGlzIHRydWUgZm9yIGFsbCBlIGluIGFycmF5XG4qIEBzZWV7QGxpbmsgYWxsfVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0T2ZMaXN0c1EoIGFycmF5ICkge1xuICByZXR1cm4gYWxsKCBhcnJheS5tYXAoIGZ1bmN0aW9uKCBlbGVtZW50LCBpbmRleCApIHsgcmV0dXJuIEFycmF5LmlzQXJyYXkoZWxlbWVudCkgfSApIClcbn1cblxuLyoqXG4qIEJ1aWx0IG9uIHRvcCBvZiBAc2Vle0BsaW5rIGdldH0sIG1hcHBpbmcgaWYgcG9zaXRpb25zIGlzIGEgbGlzdCBvZiBsaXN0cyAoQHNlZXtAbGluayBsaXN0T2ZMaXN0c1F9KVxuKiBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiBpdGVtc1xuKiBAcGFyYW0ge251bWJlcltdIHwgW11udW1iZXJbXSB9IHBvc2l0aW9ucyBvZiBpbnRlZ2VycyBvciBsaXN0IG9mIHBvc2l0aW9ucyBvZiBpbnRlZ2Vyc1xuKiBAcmV0dXJucyB7Ym9vbGVhbn0gcmV0dXJucyBzcGVjaWZpZWQgcG9zaXRpb25zIGZyb20gYXJyYXkuIElmIG5lc3RlZCBwb3NpdGlvbnMgcGFzc2VkLCByZXR1cm5zIHJlcXVlc3RlZCBpdGVtcyBpbiBzYW1lIHN0cnVjdHVyZS5cbiovXG5leHBvcnQgZnVuY3Rpb24gY3V0KCBhcnJheSwgcG9zaXRpb25zICkge1xuICBpZiAoIGxpc3RPZkxpc3RzUShhcnJheSkgKSB7IHJldHVybiBwb3NpdGlvbnMubWFwKGZ1bmN0aW9uKHBvcywgaSkgeyByZXR1cm4gYXJyYXkuZ2V0KHBvcyk7IH0pOyB9XG4gIHJldHVybiBnZXQoIGFycmF5LCBwb3NpdGlvbnMgKTtcbn1cblxuLyoqXG4qIEdpdmVuIGFuIGFycmF5IG9mIG9iamVjdHMsIGNvbnN0cnVjdHMgbmV3IG9iamVjdHMgd2hlcmUgZWFjaCB2YWx1ZSBpcyBhIGxpc3RcbiogYmFzZWQgb24gdGhlIGNvcnJlc29uZGluZyBrZXksIHdoaWNoIGlzIGV4dHJhY3RlZCBieSB0aGUgcGFyYW1ldGVyIGJ5XG4qIEBwYXJhbSB7T2JqZWN0c1tdfSBhcnJheSBvZiBvYmplY3RzXG4qIEBwYXJhbSB7c3RyaW5nfSBieSBrZXkgd2l0aGluIGFsbCBvYmplY3RzIG9mIHBhc3NlZCBhcnJheVxuKiBAcGFyYW0ge3N0cmluZ1tdfSBbZ3JvdXBzXSBzYXZlcyBzb21lIGNvbXB1dGF0aW9uIGlmIGFsbCBrbm93biB2YWx1ZXMgZXh0cmFjdGVkIGJ5IG1hcHBpbmcgb3ZlciB0aGUgcGFyYW1ldGVyIGJ5IGFyZSBwYXNzZWRcbiogQHJldHVybnMge09iamVjdH0gb2Yga2V5IHZhbHVlIHBhaXJzLCB3aGVyZSBrZXlzIGFyZSBhbGwgdmFsdWVzIG9mIHRoZSBrZXkgYnkgZnJvbSBhbiBvYmplY3QgaW4gdGhlIHBhc3NlZCBhcnJheSBhbmQgdGhlIHZhbHVlIGFyZSB0aG9zZSBjb3JyZXNwb25kaW5nIG9iamVjdHMuXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwQnkgKGFycmF5LCBieSwgZ3JvdXBzKSB7XG4gIGlmIChncm91cHMgPT0gdW5kZWZpbmVkKSB7XG4gICAgZ3JvdXBzID0gdW5pcXVlKGFycmF5Lm1hcChmdW5jdGlvbihlbGVtZW50cywgaW5kZXgpeyByZXR1cm4gZWxlbWVudFtieV07IH0pKTtcbiAgICBncm91cHMubWFwKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCl7Z3JvdXBwZWRbdmFsdWVdID0gW119KVxuICB9XG5cbiAgdmFyIGdyb3VwcGVkID0ge307XG4gIGFycmF5Lm1hcChmdW5jdGlvbihlbGVtZW50LCBpbmRleCl7Z3JvdXBwZWRbZWxlbWVudFtieV1dLnB1c2goZWxlbWVudCl9KTtcbiAgcmV0dXJuIGdyb3VwcGVkXG59XG5cbi8qKlxuKiBUZXN0cyBpZiB0d28gYXJyYXlzIGFyZSBlcXVpdmFsZW50XG4qIEBwYXJhbSB7QXJyYXl9IGFycmF5XG4qIEBwYXJhbSB7QXJyYXl9IG90aGVyXG4qIEByZXR1cm5zIHtib29sZWFufSBpZiBldmVyeSBlbGVtZW50IG9mIGFycmF5IG1hdGNoZXMgdGhhdCBvZiBvdGhlclxuKi9cbmV4cG9ydCBmdW5jdGlvbiBhcnJheUVxdWFscyhhcnJheSwgb3RoZXIpIHtcbiAgaWYgKCFvdGhlcilcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgLy8gY29tcGFyZSBsZW5ndGhzIC0gY2FuIHNhdmUgYSBsb3Qgb2YgdGltZVxuICBpZiAoYXJyYXkubGVuZ3RoICE9IG90aGVyLmxlbmd0aClcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICBmb3IgKHZhciBpID0gMCwgbD1hcnJheS5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgbmVzdGVkIGFycmF5c1xuICAgICAgaWYgKGFycmF5W2ldIGluc3RhbmNlb2YgQXJyYXkgJiYgb3RoZXJbaV0gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgIC8vIHJlY3Vyc2UgaW50byB0aGUgbmVzdGVkIGFycmF5c1xuICAgICAgICAgIGlmICghYXJyYXlFcXVhbHMoYXJyYXlbaV0sb3RoZXJbaV0pKVxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChhcnJheVtpXSAhPSBvdGhlcltpXSkge1xuICAgICAgICAgIC8vIFdhcm5pbmcgLSB0d28gZGlmZmVyZW50IG9iamVjdCBpbnN0YW5jZXMgd2lsbCBuZXZlciBiZSBlcXVhbDoge3g6MjB9ICE9IHt4OjIwfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuXG5cbi8qKlxuKiBSZWN1cnNpdmVseSB0YWxsaWVzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgYXQgZWFjaCBsZXZlbCBvZiB0aGUgcGFzc2VkLCBwdXRhdGl2ZWx5IG5lc3RlZCBhcnJheVxuKiBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiBpdGVtcyB3aGljaCBtYXkgaW5jbHVkZSBuZXN0ZWQgYXJyYXlzXG4qIEBwYXJhbSB7bnVtYmVyfSBbbGV2ZWw9MF0gY3VycmVudCBkZXB0aCBpbiB0aGUgcmVjdXJzaW9uXG4qIEBwYXJhbSB7QXJyYXl9IFtsZXZlbERhdGE9W11dIGtlZXBzIHRyYWNrIG9mIGl0ZW1zIHNlZW4gc28gZmFyIGF0IGVhY2ggZGVwdGhcbiogQHJldHVybnMge0FycmF5fSBzdGF0aW5nIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgKGFycmF5IGluY2x1c2l2ZSkgZm91bmQgYXQgZWFjaCBsZXZlbCBvZiB0aGUgYXJyYXlcbiovXG5leHBvcnQgZnVuY3Rpb24gZWxlbWVudHNBdExldmVscyhhcnJheSwgbGV2ZWwsIGxldmVsRGF0YSkge1xuICBsZXZlbCA9IGxldmVsID09IHVuZGVmaW5lZCA/IDAgOiBsZXZlbCArIDE7XG4gIGxldmVsRGF0YSA9IGxldmVsRGF0YSA9PSB1bmRlZmluZWQgPyBbXSA6IGxldmVsRGF0YTtcbiAgaWYgKCBsZXZlbCA+PSBsZXZlbERhdGEubGVuZ3RoICkgeyBsZXZlbERhdGEucHVzaChhcnJheS5sZW5ndGgpfSBlbHNlIHtsZXZlbERhdGFbbGV2ZWxdICs9IGFycmF5Lmxlbmd0aCB9XG4gIGFycmF5Lm1hcChmdW5jdGlvbihlLCBpKSB7aWYgKEFycmF5LmlzQXJyYXkoZSkpeyBlbGVtZW50c0F0TGV2ZWxzKGUsIGxldmVsLCBsZXZlbERhdGEpIH19KVxuICByZXR1cm4gbGV2ZWxEYXRhXG59XG5cblxuLyoqXG4qIFJlY3Vyc2l2ZWx5IHRhbGxpZXMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBvZiB0aGUgcGFzc2VkLCBwdXRhdGl2ZWx5IG5lc3RlZCBhcnJheVxuKiBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiBpdGVtcyB3aGljaCBtYXkgaW5jbHVkZSBuZXN0ZWQgYXJyYXlzXG4qIEBwYXJhbSB7bnVtYmVyfSBbZWxlbWVudHM9MF0gY3VycmVudCBudW1iZXIgb2YgZWxlbWVudHMgc2VlbiBzbyBmYXJcbiogQHJldHVybnMge251bWJlcn0gbnVtYmVyIG9mIGVsZW1lbnRzIChhcnJheSBpbmNsdXNpdmUpIGZvdW5kIGluIHBhc3NlZCBhcnJheVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJPZkVsZW1lbnRzKCBhcnJheSwgZWxlbWVudHMgKSB7XG4gIGVsZW1lbnRzID0gZWxlbWVudHMgPT0gdW5kZWZpbmVkID8gMCA6IGVsZW1lbnRzO1xuICBhcnJheS5tYXAoZnVuY3Rpb24oZSwgaSkge1xuICAgIGlmICggQXJyYXkuaXNBcnJheShlKSApIHsgZWxlbWVudHMgPSBudW1iZXJPZkVsZW1lbnRzKGUsIGVsZW1lbnRzKSB9XG4gICAgZWxzZSB7IGVsZW1lbnRzICs9IDEgfVxuICB9KVxuICByZXR1cm4gZWxlbWVudHNcbn1cblxuLyoqXG4qIENvbmNhdHMgYWxsIG5lc3RlZCBhcnJheXMgaW4gcGFzc2VkIGFycmF5IHRvIGZvcm0gYSBzaW5nbGUgYXJyYXlcbiogQHBhcmFtIHtBcnJheX0gYXJyYXkgb2YgcHV0YXRpdmVseSBuZXN0ZWQgYXJyYXlzXG4qIEBwYXJhbSB7QXJyYXl9IFtmbGF0PVtdXSBjdXJyZW50IGZsYXR0ZW5lZCBhcnJheVxuKiBAcmV0dXJucyB7QXJyYXl9IHdpdGggZXZlcnkgZWxlbWVudCBpbiB0aGUgc2FtZSBsZXZlbFxuKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuKCBhcnJheSwgZmxhdCApIHtcbiAgZmxhdCA9IGZsYXQgPT0gdW5kZWZpbmVkID8gW10gOiBmbGF0O1xuICBhcnJheS5tYXAoZnVuY3Rpb24oZSwgaSl7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpIHtmbGF0ID0gZmxhdC5jb25jYXQoZmxhdHRlbihlKSl9XG4gICAgZWxzZSB7ZmxhdC5wdXNoKGUpfVxuICB9KVxuICByZXR1cm4gZmxhdDtcbn1cblxuLyoqXG4qIFNlYXJjaCBvZiBsaXN0IG9mIGxpc3RzIHRvIGZpbmQgd2hpY2ggLSBpZiBhbnkgLSBwYXNzZWQgdmFsdWUgaXMgaW5cbiogQHBhcmFtIHtBcnJheVtdfSBiaW5zIGxpc3Qgb2YgbGlzdHMgb2YgdmFsdWVzXG4qIEBwYXJhbSB7Kn0gdmFsdWUgaXRlbSB0byB0ZXN0IGlmIGluIGFueSBvZiB0aGUgYmluc1xuKiBAcmV0dXJucyB7bnVtYmVyfSBpbmRpY2F0aW5nIHRoZSBpbmRleCBvZiB0aGUgYmluIGluIHdoaWNoIHZhbHVlIHdhcyBmb3VuZFxuKi9cbmV4cG9ydCBmdW5jdGlvbiB3aGljaEJpbihiaW5zLCB2YWx1ZSkge1xuICB2YXIgaSA9IC0xXG4gIGZvciAodmFyIGogPSAwOyBqIDwgYmlucy5sZW5ndGg7IGorKykgeyBpZiAoaGFzUShiaW5zW2pdLHZhbHVlKSkge3JldHVybiBqfSB9XG4gIHJldHVybiBpXG59XG4iLCJpbXBvcnQge2h5cGVuYXRlLCBzYWZlU2VsZWN0fSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHt0b3RhbH0gZnJvbSAnLi9hcnJheS1mdW5jdGlvbnMnO1xuXG5cbi8qKlxuICogY2FsbHMgY29uc29sZS5ncm91cCBpZiBkM3NtLmRlYnVnUSA9PSB0cnVlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBvZiB0aGUgZ3JvdXBcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zb2xlR3JvdXAobmFtZSkge1xuICBpZiAod2luZG93LmQzc20uZGVidWdRID09PSB0cnVlKXtcbiAgICBjb25zb2xlLmdyb3VwKG5hbWUpXG4gIH1cbn1cblxuLyoqXG4gKiBjYWxscyBjb25zb2xlLmdyb3VwRW5kIGlmIGQzc20uZGVidWdRID09IHRydWVcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zb2xlR3JvdXBFbmQoKSB7XG4gIGlmICh3aW5kb3cuZDNzbS5kZWJ1Z1EgPT09IHRydWUpe1xuICAgIGNvbnNvbGUuZ3JvdXBFbmQoKVxuICB9XG59XG5cbi8qKlxuICogQ2FsbHMgY29uc29sZS5sb2cgaWYgZDNzbS5kZWJ1Z1EgPT0gdHJ1ZVxuICogQHBhcmFtIHtzdHJpbmd9IGZ1bmMgbmFtZSBvZiB0aGUgZnVuY3Rpb24gbG9nZ2luZ1xuICogQHBhcmFtIHtzdHJpbmd9IG1zZyB0byBsb2dcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIHRvIGJlIGxvZ2dlZCBhbG9uZyBzaWRlIHRoZSBtZXNzYWdlXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nKGZ1bmMsIG1zZywgZGF0YSkge1xuICBpZiAod2luZG93LmQzc20uZGVidWdRID09PSB0cnVlKXtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGAlY1tkM3NtOjoke2Z1bmN9XTpcXHQke21zZ31gLFxuICAgICAgW1xuICAgICAgICAnYmFja2dyb3VuZDogIzZjZDFlZicsXG4gICAgICAgICdib3JkZXItcmFkaXVzOiA1MDAwcHgnLFxuICAgICAgICAncGFkZGluZzogMHB4IDJweCcsXG4gICAgICAgICdmb250LXNpemU6IDE0cHgnXG4gICAgICBdLmpvaW4oJzsnKVxuICAgIClcbiAgICBjb25zb2xlLnRhYmxlKGRhdGEpXG4gICAgLy8gY29uc29sZS50cmFjZSgpXG4gIH1cbn1cblxuLyoqXG4gKiBDYWxscyBjb25zb2xlLndhcm4gaWYgZDNzbS5kZWJ1Z1EgPT0gdHJ1ZVxuICogQHBhcmFtIHtzdHJpbmd9IGZ1bmMgbmFtZSBvZiB0aGUgZnVuY3Rpb24gd2FybmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IG1zZyB0byBkaXNwbGF5XG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YSB0byBiZSBkaXNwbGF5ZWQgYWxvbmcgc2lkZSB0aGUgbWVzc2FnZVxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhcm4oZnVuYywgbXNnLCBkYXRhKSB7XG4gIGlmICh3aW5kb3cuZDNzbS5kZWJ1Z1EgPT09IHRydWUpXG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYCVjW2Qzc206OiR7ZnVuY31dOlxcdCR7bXNnfWAsXG4gICAgICBbXG4gICAgICAgICdiYWNrZ3JvdW5kOiAjZmZkNTNlJyxcbiAgICAgICAgJ2JvcmRlci1yYWRpdXM6IDUwMDBweCcsXG4gICAgICAgICdwYWRkaW5nOiAwcHggMnB4JyxcbiAgICAgICAgJ2ZvbnQtc2l6ZTogMTRweCdcbiAgICAgIF0uam9pbignOycpXG4gICAgKVxuICAgIGNvbnNvbGUudGFibGUoZGF0YSlcbn1cbi8qKlxuICogQ2FsbHMgdGhlIGNvbnNvbGUuaW5mbyBpZiBkM3NtLmRlYnVnUSA9PSB0cnVlXG4gKiBAcGFyYW0ge3N0cmluZ30gZnVuYyBuYW1lIG9mIHRoZSBmdW5jdGlvbiBwcm92aWRpbmcgaW5mb1xuICogQHBhcmFtIHtzdHJpbmd9IG1zZyB0byBkaXNwbGF5XG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YSB0byBiZSBkaXNwbGF5ZWQgYWxvbmcgc2lkZSB0aGUgbWVzc2FnZVxuICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluZm8oZnVuYywgbXNnLCBkYXRhKSB7XG4gIGlmICh3aW5kb3cuZDNzbS5kZWJ1Z1EpXG4gICAgY29uc29sZS5pbmZvKFxuICAgICAgYCVjW2Qzc206OiR7ZnVuY31dOlxcdCR7bXNnfWAsXG4gICAgICBbXG4gICAgICAgICdiYWNrZ3JvdW5kOiAjMDA5Y2NkJyxcbiAgICAgICAgJ2JvcmRlci1yYWRpdXM6IDUwMDBweCcsXG4gICAgICAgICdwYWRkaW5nOiAwcHggMnB4JyxcbiAgICAgICAgJ2ZvbnQtc2l6ZTogMTRweCdcbiAgICAgIF0uam9pbignOycpXG4gICAgKVxuICAgIGNvbnNvbGUudGFibGUoZGF0YSlcbn1cblxuXG4vKipcbiAqIENhbGxzIGNvbnNvbGUuZXJyb3IgaWYgZDNzbS5kZWJ1Z1EgPT0gdHJ1ZVxuICogQHBhcmFtIHtzdHJpbmd9IGZ1bmMgbmFtZSBvZiB0aGUgZnVuY3Rpb24gd2hpY2ggc2VuZHMgdGhlIGVycm9yXG4gKiBAcGFyYW0ge3N0cmluZ30gbXNnIHRvIGRpc3BsYXlcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIHRvIGJlIGRpc3BsYXllZCBhbG9uZyBzaWRlIHRoZSBtZXNzYWdlXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJyb3IoZnVuYywgbXNnLCBkYXRhKSB7XG4gIGlmICh3aW5kb3cuZDNzbS5kZWJ1Z1EpXG4gICAgY29uc29sZS5lcnJvcihgW2Qzc206OiR7ZnVuY31dOlxcdCR7bXNnfVxcdCVvYCxkYXRhKVxufVxuXG5cblxuXG5cbi8qKlxuKiBGdW5jdGlvbiBmb3Igc2V0dGluZyB1cCBjb250YWluZXJzIGZvciBtb3N0IHBsb3RzIHdpdGggdGhlIHkgYXhpcyBjb250YWluZXJcbiogcG9zaXRpb25lZCBvbiB0aGUgbGVmdCBhbmQgdGhlIHggYXhpcyBjb250YWluZXIgcG9zaXRpb25lZCBvbiB0aGUgYm90dG9tXG4qIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBzZWxlY3Rpb24gc2VsZWN0aW9uIG9mIGNvbnRhaW5lciBpbiB3aGljaCB0aGUgc3ZnIGlzIG9yIHNob3VsZCBiZSBtYWRlXG4qIEBwYXJhbSB7c3RyaW5nfSBuYW1lc3BhY2UgbmFtZXNwYWNlIG9mIHRoZSBjaGFydFxuKiBAcGFyYW0ge09iamVjdH0gW3NwYWNlPXt3OndpbmRvdy5pbm5lcldpZHRoLCBoOndpbmRvdy5pbm5lckhlaWdodH1dIHRoZSB3aWR0aCAodykgYW5kIGhlaWdodCAoaCkgYXZhaWxibGVcbiogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZS53PXdpbmRvdy5pbm5lcldpZHRoXSB0aGUgYXZhaWxhYmxlIHdpZHRoIGluIHdoaWNoIHRvIHJlbmRlciB0aGUgY2hhcnRcbiogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZS5oPXdpbmRvdy5pbm5lckhlaWdodF0gdGhlIGF2YWlsYWJsZSBoZWlnaHQgaW4gd2hpY2ggdG8gcmVuZGVyIHRoZSBjaGFydFxuXG4qIEBwYXJhbSB7T2JqZWN0fSBbbWFyZ2lucz17dG9wOiAwLjAxLCBib3R0b206IDAuMDEsIGxlZnQ6IDAuMDEsIHJpZ2h0OiAwLjAxfV0gdGhlIG1hcmdpbnMgZm9yIHRoZSBjaGFydFxuKiBAcGFyYW0ge251bWJlcn0gW21hcmdpbnMudG9wPTAuMDFdIHRoZSB0b3AgbWFyZ2luIG9mIHRoZSBjaGFydFxuKiBAcGFyYW0ge251bWJlcn0gW21hcmdpbnMuYm90dG9tPTAuMDFdIHRoZSBib3R0b20gbWFyZ2luIG9mIHRoZSBjaGFydFxuKiBAcGFyYW0ge251bWJlcn0gW21hcmdpbnMubGVmdD0wLjAxXSB0aGUgbGVmdCBtYXJnaW4gb2YgdGhlIGNoYXJ0XG4qIEBwYXJhbSB7bnVtYmVyfSBbbWFyZ2lucy5yaWdodD0wLjAxXSB0aGUgcmlnaHQgbWFyZ2luIG9mIHRoZSBjaGFydFxuXG5cbiogQHBhcmFtIHtPYmplY3R9IFtwZXJjZW50YWdlcyA9IHtheGVzOnt4OjAuMSx5OjAuMX0sc3BhY2U6e3c6MC44LGg6MC42fX1dIHBlcmNlbnRhZ2VzIG9mIHRoZSBwYXJhbWF0ZXIgc3BhY2Ugb2Ygd2hpY2ggdG8gbWFrZSB0aGUgeCBhbmQgeSBheGVzIGFzIHdlbGwgYXMgdGhlIHBlcmNlbnQgb2YgdGhlIGF2YWlsYmxlIHNwYWNlIGluIHdoaWNoIHRvIHJlbmRlciB0aGUgcGxvdFxuKiBAcGFyYW0ge09iamVjdH0gW3BlcmNlbnRhZ2VzLmF4ZXM9e3g6MC4xLHk6MC4xfV0gdGhlIHBlcmNlbnRhZ2VzIG9mIHRoZSBwYXJhbWF0ZXIgc3BhY2UsIG9mIHdoaWNoIHRoZSB4IGFuZCB5IGF4ZXMgd2lsbCB0YWtlIHVwXG4qIEBwYXJhbSB7bnVtYmVyfSBbcGVyY2VudGFnZXMuYXhlcy54QXhpc1BlcmNlbnQ9MC4xXSB0aGUgcGVyY2VudGFnZXMgb2YgdGhlIHBhcmFtYXRlciBzcGFjZSwgb2Ygd2hpY2ggdGhlIHggYXhpcyB3aWxsIHRha2UgdXBcbiogQHBhcmFtIHtudW1iZXJ9IFtwZXJjZW50YWdlcy5heGVzLnlBeGlzUGVyY2VudD0wLjFdIHRoZSBwZXJjZW50YWdlcyBvZiB0aGUgcGFyYW1hdGVyIHNwYWNlLCBvZiB3aGljaCB0aGUgeSBheGlzIHdpbGwgdGFrZSB1cFxuXG4qIEBwYXJhbSB7T2JqZWN0fSBbcGVyY2VudGFnZXMuc3BhY2U9e3c6MC44LGg6MC42fV0gdGhlIHBlcmNlbnRhZ2VzIG9mIHRoZSBwYXJhbWF0ZXIgc3BhY2UsIG9mIHdoaWNoIHRoZSBTVkcncyB3aWR0aCBhbmQgaGVpZ2h0IHdpbGwgYmUgc2V0XG4qIEBwYXJhbSB7bnVtYmVyfSBbcGVyY2VudGFnZXMuc3BhY2UucGVyY2VudE9mU3BhY2VGb3JXaWR0aD0wLjFdIHRoZSBwZXJjZW50YWdlcyBvZiB0aGUgcGFyYW1hdGVyIHNwYWNlLCBvZiB3aGljaCB0aGUgU1ZHJ3Mgd2lkdGggd2lsbCBiZSBzZXRcbiogQHBhcmFtIHtudW1iZXJ9IFtwZXJjZW50YWdlcy5zcGFjZS5wZXJjZW50T2ZTcGFjZUZvckhlaWdodD0wLjFdIHRoZSBwZXJjZW50YWdlcyBvZiB0aGUgcGFyYW1hdGVyIHNwYWNlLCBvZiB3aGljaCB0aGUgU1ZHJ3MgaGVpZ2h0IHdpbGwgYmUgc2V0XG5cbiogQHJldHVybnMge09iamVjdH0gcmV0dXJucyB0aGUgc2VsZWN0aW9uIGFuZCBcImJvdW5kaW5nUmVjdHNcIiBvZiB0aGUgcGxvdCBjb250YWluZXIsIHgtYXhpcyBjb250YWluZXIgYW5kIHktYXhpcyBjb250YWluZXJcbiogYXNcbipcbioge1xuKlxuKiAgIHBsb3Q6IHtzZWxlY3Rpb246IHBsb3RTZWxlY3Rpb24sIHJlY3Q6IHBsb3RSZWN0fSxcbipcbiogICB4QXhpczp7c2VsZWN0aW9uOnhBeGlzU2VsZWN0aW9uLCByZWN0OnhBeGlzUmVjdH0sXG4qXG4qICAgeUF4aXM6IHtzZWxlY3Rpb246eUF4aXNTZWxlY3Rpb24sIHJlY3Q6eUF4aXNSZWN0fVxuKlxuKiB9XG4qXG4qIHdoZXJlIGVhY2ggcmVjdCBoYXMgZm9ybTpcbipcbioge3g6ICMsIHk6ICMsIGg6ICMsIHc6ICN9XG4qXG4qIGRlcGljdGluZyB0aGUgc3RhcnRpbmcgeCBhbmQgeSBjb29yZGluYXRlIG9mIHRoZSBjb3Jlc3BvbmRpbmcgY29udGFpbmVyIChhbHNvIHRoZWlyIGRlZmF1bHQgdHJhbnNmb3JtIHZhbHVlcykgYXMgd2VsbCB0aGVpciBoZWlnaHQgKGgpIGFucyB3aWR0aCAodylcbiovXG4vLyBleHBvcnQgZnVuY3Rpb24gc2V0dXBTdGFuZGFyZENoYXJ0Q29udGFpbmVycyggc2VsZWN0aW9uLCBuYW1lc3BhY2UsIHNwYWNlLCBtYXJnaW5zLCBwZXJjZW50YWdlcykge1xuZXhwb3J0IGZ1bmN0aW9uIHNldHVwU3RhbmRhcmRDaGFydENvbnRhaW5lcnMoXG4gIHNlbGVjdGlvbixcbiAgbmFtZXNwYWNlLFxuICBzcGFjZT17dzphdmFpbGFibGVXaWR0aD13aW5kb3cuaW5uZXJXaWR0aCwgaDphdmFpbGFibGVIZWlnaHQ9d2luZG93LmlubmVySGVpZ2h0fSxcbiAgbWFyZ2lucz17dG9wOjAuMDEsIGJvdHRvbTowLjAxLCBsZWZ0OjAuMDEsIHJpZ2h0OjAuMDF9LFxuICBwZXJjZW50YWdlcz17YXhlczoge3g6IHhBeGlzUGVyY2VudD0wLjEsIHk6IHlBeGlzUGVyY2VudD0wLjF9LCBzcGFjZToge3c6IHBlcmNlbnRPZlNwYWNlRm9yV2lkdGgsIGg6IHBlcmNlbnRPZlNwYWNlRm9ySGVpZ2h0fX1cbikge1xuICBpZiAoc3BhY2UgPT0gdW5kZWZpbmVkKSB7IHNwYWNlID0ge3c6IHdpbmRvdy5pbm5lcldpZHRoLCBoOiB3aW5kb3cuaW5uZXJIZWlnaHR9IH1cbiAgaWYgKG1hcmdpbnMgPT0gdW5kZWZpbmVkKSB7IG1hcmdpbnMgPSB7dG9wOiAwLjAxLCBib3R0b206IDAuMDEsIGxlZnQ6IDAuMDEsIHJpZ2h0OiAwLjAxfSB9XG4gIGlmIChwZXJjZW50YWdlcyA9PSB1bmRlZmluZWQpIHsgcGVyY2VudGFnZXMgPSB7fTsgfVxuICBpZiAocGVyY2VudGFnZXMuYXhlcyA9PSB1bmRlZmluZWQpIHsgcGVyY2VudGFnZXMuYXhlcyA9IHsgeDowLjEsIHk6MC4xIH0gfVxuICBpZiAocGVyY2VudGFnZXMuc3BhY2UgPT0gdW5kZWZpbmVkKSB7IHBlcmNlbnRhZ2VzLnNwYWNlID0geyB3OiAwLjgsIGg6IDAuNiB9IH1cblxuICAvLyBTVkcgd2lkdGggYW5kIGhlaWdodFxuICB2YXIgc3ZnU3BhY2UgPSAge1xuICAgIHc6IHNwYWNlLncgKiBwZXJjZW50YWdlcy5zcGFjZS53LFxuICAgIGg6IHNwYWNlLmggKiBwZXJjZW50YWdlcy5zcGFjZS5oXG4gIH0sXG5cbiAgLy8gU3BhY2UgYWZ0ZXIgcmVtb3ZpbmcgbWFyZ2luc1xuICBjaGFydFNwYWNlID0ge1xuICAgIHc6IHN2Z1NwYWNlLncgLSAobWFyZ2lucy5sZWZ0ICogc3BhY2UudykgLSAobWFyZ2lucy5yaWdodCAqIHNwYWNlLncpLFxuICAgIGg6IHN2Z1NwYWNlLmggLSAobWFyZ2lucy50b3AgKiBzcGFjZS5oKSAtIChtYXJnaW5zLmJvdHRvbSAqIHNwYWNlLmgpXG4gIH0sXG5cbiAgLy8gbWFpbiBkaW1lbnNpb24gb2YgeCBhbmQgeSBheGllc1xuICAvLyBlLmcuIGRlZmluZXMgaG93IHRhbGwgeCBheGlzIGlzIGFzIGxlbmd0aCBpcyBkZXRlcm1pbmVkIGJ5IHBsb3RSZWN0LndcbiAgYXhlc1NwYWNlID0ge1xuICAgIHg6IGNoYXJ0U3BhY2UuaCAqIHBlcmNlbnRhZ2VzLmF4ZXMueCxcbiAgICB5OiBjaGFydFNwYWNlLncgKiBwZXJjZW50YWdlcy5heGVzLnlcbiAgfSxcblxuICAvLyBzcGFjZSBsZWZ0IGZvciBkcmF3aW5nIHRoZSBjaGFydCBwcm9wZXJseSAoZS5nLiBiYXJzLCB2aW9saW5zLCBldGMpXG4gIGRyYXdpbmdTcGFjZSA9IHtcbiAgICB4OiBjaGFydFNwYWNlLncgLSBheGVzU3BhY2UueSxcbiAgICB5OiBjaGFydFNwYWNlLmggLSBheGVzU3BhY2UueFxuICB9LFxuXG5cbiAgeUF4aXNSZWN0ID0ge1xuICAgIHg6IGF4ZXNTcGFjZS55ICsgKG1hcmdpbnMubGVmdCAqIHNwYWNlLncpLFxuICAgIHk6IChtYXJnaW5zLnRvcCAqIHNwYWNlLmgpLFxuICAgIHc6IGF4ZXNTcGFjZS55LFxuICAgIGg6IGRyYXdpbmdTcGFjZS55XG4gIH0sXG5cbiAgcGxvdFJlY3QgPSB7XG4gICAgeDogYXhlc1NwYWNlLnkgKyAobWFyZ2lucy5sZWZ0ICogc3BhY2UudyksXG4gICAgeTogKG1hcmdpbnMudG9wICogc3BhY2UuaCksXG4gICAgdzogZHJhd2luZ1NwYWNlLngsXG4gICAgaDogZHJhd2luZ1NwYWNlLnlcbiAgfSxcblxuICB4QXhpc1JlY3QgPSB7XG4gICAgeDogYXhlc1NwYWNlLnkgKyAobWFyZ2lucy5sZWZ0ICogc3BhY2UudyksXG4gICAgeTogKG1hcmdpbnMudG9wICogc3BhY2UuaCArIHBsb3RSZWN0LmgpLFxuICAgIHc6IGRyYXdpbmdTcGFjZS54LFxuICAgIGg6IGF4ZXNTcGFjZS54XG4gIH1cblxuXG4gIHZhciBjb250YWluZXIgPSBzYWZlU2VsZWN0KHNlbGVjdGlvbiwgJ3N2ZycsIG5hbWVzcGFjZSlcbiAgICAuc3R5bGUoJ3dpZHRoJywgc3ZnU3BhY2UudysncHgnKVxuICAgIC5zdHlsZSgnaGVpZ2h0Jywgc3ZnU3BhY2UuaCsncHgnKVxuXG4gIHZhciBheGVzID0gc2FmZVNlbGVjdChjb250YWluZXIsICdnJywgaHlwZW5hdGUobmFtZXNwYWNlLCAnYXhlcycpKVxuXG4gIC8vIC5hdHRyKCd0cmFuc2Zvcm0nLCBcInRyYW5zbGF0ZShcIitwbG90UmVjdC54K1wiLFwiK3Bsb3RSZWN0LnkrXCIpXCIpLFxuXG4gIHZhciBwbG90ID0gc2FmZVNlbGVjdChjb250YWluZXIsICdnJywgaHlwZW5hdGUobmFtZXNwYWNlLCAncGxvdCcpKVxuICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBcInRyYW5zbGF0ZShcIitwbG90UmVjdC54K1wiLFwiK3Bsb3RSZWN0LnkrXCIpXCIpXG5cbiAgdmFyIHhBeGlzID0gc2FmZVNlbGVjdChheGVzLCAnZycsIGh5cGVuYXRlKG5hbWVzcGFjZSwgJ3gtYXhpcycpKVxuICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBcInRyYW5zbGF0ZShcIit4QXhpc1JlY3QueCtcIixcIit4QXhpc1JlY3QueStcIilcIilcblxuICB2YXIgeUF4aXMgPSBzYWZlU2VsZWN0KGF4ZXMsICdnJywgaHlwZW5hdGUobmFtZXNwYWNlLCAneS1heGlzJykpXG4gICAgLmF0dHIoJ3RyYW5zZm9ybScsIFwidHJhbnNsYXRlKFwiK3lBeGlzUmVjdC54K1wiLFwiK3lBeGlzUmVjdC55K1wiKVwiKVxuXG4gIHJldHVybiB7XG4gICAgc3ZnOiB7XG4gICAgICBzZWxlY3Rpb246IGNvbnRhaW5lcixcbiAgICAgIHJlY3Q6IHN2Z1NwYWNlXG4gICAgfSxcbiAgICBwbG90OiB7XG4gICAgICBzZWxlY3Rpb246IHBsb3QsXG4gICAgICByZWN0OiBwbG90UmVjdFxuICAgIH0sXG4gICAgeEF4aXM6IHtcbiAgICAgIHNlbGVjdGlvbjogeEF4aXMsXG4gICAgICByZWN0OiB4QXhpc1JlY3RcbiAgICB9LFxuICAgIHlBeGlzOiB7XG4gICAgICBzZWxlY3Rpb246IHlBeGlzLFxuICAgICAgcmVjdDogeUF4aXNSZWN0XG4gICAgfVxuICB9XG5cbiAgLy8gcmV0dXJuIFtwbG90LCB4QXhpcywgeUF4aXNdXG59XG5cblxuXG4vKipcbiogQWRkcyBhIGNsaXAtcGF0aCByZWN0IGFuZCBiaW5kcyBpdCB0byBjb250YWluZXJcbiogQHBhcmFtIHtkMy5zZWxlY3Rpb259IGNvbnRhaW5lciBpbiB3aGljaCB0byBhZGQgdGhlIGNsaXAtcGF0aCBhbmQgdG8gd2hpY2ggdG8gYmluZCB0aGUgY2xpcGluZyBwYXRoIHRvXG4qIEBwYXJhbSB7T2JqZWN0fSByZWN0IHRoZSBjb29yZGluYXRlcyAoeCwgeSwgd2lkdGgsIGhlaWdodCkgb2YgdGhlIGNsaXAtcGF0aFxuKiBAcGFyYW0ge3N0cmluZ30gbmFtZXNwYWNlXG4qIEByZXR1cm5zIHtkMy5zZWxlY3Rpb259IG9mIHRoZSBjbGlwLXBhdGggcmVjdFxuKi9cbmV4cG9ydCBmdW5jdGlvbiBjcFJlY3QoY29udGFpbmVyLCByZWN0LCBuYW1lc3BhY2UpIHtcbiAgdmFyIGRlZnMgPSBzYWZlU2VsZWN0KGNvbnRhaW5lciwgJ2RlZnMnLCBoeXBlbmF0ZShuYW1lc3BhY2UsICdkZWZpbml0aW9ucycpKVxuICB2YXIgY3AgPSBzYWZlU2VsZWN0KGRlZnMsICdjbGlwUGF0aCcsIGh5cGVuYXRlKG5hbWVzcGFjZSwgJ2NsaXAtcGF0aCcpKVxuICAuYXR0cignaWQnLCBoeXBlbmF0ZShuYW1lc3BhY2UsICdjbGlwLXBhdGgnKSlcblxuICB2YXIgY3BSZWN0ID0gc2FmZVNlbGVjdChjcCwgJ3JlY3QnKVxuICAuYXR0cigneCcsIHJlY3QueClcbiAgLmF0dHIoJ3knLCByZWN0LnkpXG4gIC5hdHRyKCd3aWR0aCcsIHJlY3Qud2lkdGgpXG4gIC5hdHRyKCdoZWlnaHQnLCByZWN0LmhlaWdodClcblxuICBkZWZzLnJhaXNlKClcbiAgLy8gc2V0IGNsaXBwaW5nIHBhdGggdG8gY29udGFpbmVyXG4gIGNvbnRhaW5lci5hdHRyKCdjbGlwLXBhdGgnLCAndXJsKCMnKyBoeXBlbmF0ZShuYW1lc3BhY2UsICdjbGlwLXBhdGgnKSsnKScpXG5cbiAgcmV0dXJuIGNwUmVjdFxufVxuXG5cbi8qKlxuKiBBZGRzIGEgYmFja2dyb3VuZCByZWN0IHQgdG8gY29udGFpbmVyXG4qIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBjb250YWluZXIgaW4gd2hpY2ggdG8gYWRkIHRoZSBiYWNrZ3JvdW5kIHJlY3RhbmdsZVxuKiBAcGFyYW0ge09iamVjdH0gcmVjdCB0aGUgY29vcmRpbmF0ZXMgKHgsIHksIHdpZHRoLCBoZWlnaHQpIG9mIHRoZSBiYWNrZ3JvdW5kXG4qIEBwYXJhbSB7c3RyaW5nfSBmaWxsIHRoZSBjb2xvciBvZiB0aGUgYmFja2dyb3VuZFxuKiBAcmV0dXJucyB7ZDMuc2VsZWN0aW9ufSBvZiB0aGUgYmFja2dyb3VuZCBmaWxsXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGJnUmVjdChjb250YWluZXIsIHJlY3QsIGZpbGwpIHtcbiAgcmV0dXJuIHNhZmVTZWxlY3QoY29udGFpbmVyLCAncmVjdCcsICdiZycpXG4gIC5hdHRyKCd4JywgcmVjdC54KVxuICAuYXR0cigneScsIHJlY3QueSlcbiAgLmF0dHIoJ3dpZHRoJywgcmVjdC53aWR0aClcbiAgLmF0dHIoJ2hlaWdodCcsIHJlY3QuaGVpZ2h0KVxuICAuYXR0cignZmlsbCcsIGZpbGwpXG59XG5cblxuLyoqXG4qIFNldHMgdXAgdGhlIGNvbnRhaW5lciBmb3IgbWFraW5nIGNoYXJ0IGVsZW1lbnRzLiBUaGlzIGluY2x1ZGVzIG1ha2luZ1xuKiBhIGNsaXAtcGF0aCByZWN0IGJvdW5kIHRvIHRoZSBwYXNzZWQgY29udGFpbmVyLCBhIGJhY2tncm91bmQgcmVjdCwgYW5kXG4qIGEgZyBlbGVtZW50IHdpdGggY2xhc3MgPG5hbWVzcGFjZT4tb2JqZWN0LWNvbnRhaW5lci5cbiogQHBhcmFtIHtkMy5zZWxlY3Rpb259IGNvbnRhaW5lciBpbiB3aGljaCB0byBhZGQgdGhlIGNsaXAtcGF0aCBhbmQgYmFja2dyb3VuZFxuKiBAcGFyYW0ge3N0cmluZ30gbmFtZXNwYWNlXG4qIEBwYXJhbSB7T2JqZWN0fSByZWN0IHRoZSBjb29yZGluYXRlcyAoeCwgeSwgd2lkdGgsIGhlaWdodCkgb2YgdGhlIGJhY2tncm91bmQgYW5kIGNsaXAtcGF0aFxuKiBAcGFyYW0ge3N0cmluZ30gZmlsbCB0aGUgY29sb3Igb2YgdGhlIGJhY2tncm91bmRcbiogQHJldHVybnMge2QzLnNlbGVjdGlvbn0gb2YgZy48bmFtZXNwYWNlPi1vYmplY3QtY29udGFpbmVyXG4qXG4qIEBzZWV7QGxpbmsgYmdSZWN0fVxuKiBAc2Vle0BsaW5rIGNwUmVjdH1cbiovXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBDb250YWluZXIoc2VsZWN0aW9uLCBuYW1lc3BhY2UsIHJlY3QsIGZpbGwpIHtcbiAgLy8gdGhlIGNvbnRhaW5lciBmb3IgdGhyZWUgbWFpbiBpdGVtcywgYmcsIGRlZnMsIGFuZCBvYmplY3QtY29udGFpbmVyXG4gIHZhclxuICBjb250YWluZXIgPSBzYWZlU2VsZWN0KHNlbGVjdGlvbiwgJ2cnLCBuYW1lc3BhY2UpLFxuICBiZyA9IGJnUmVjdChjb250YWluZXIsIHJlY3QsIGZpbGwpLFxuICBjcCA9IGNwUmVjdChjb250YWluZXIsIHJlY3QsIG5hbWVzcGFjZSksXG4gIG9iamVjdENvbnRhaW5lciA9IHNhZmVTZWxlY3QoY29udGFpbmVyLCAnZycsIGh5cGVuYXRlKG5hbWVzcGFjZSwgJ29iamVjdC1jb250YWluZXInKSlcbiAgcmV0dXJuIG9iamVjdENvbnRhaW5lclxufVxuXG5cbi8qKlxuKiBkZXRlcm1pbmVzIHRoZSB3aWR0aCBvZiBhbiBvYmplY3QgZm9yIHRoZSBjYWxsaW5nIHBsb3R0aW5nIGZ1bmN0aW9uXG4qIEBwYXJhbSB7bnVtYmVyfSBmcmVlU3BhY2UgaG93IG11Y2ggc3BhY2UgaXMgYXZhbGlibGVcbiogQHBhcmFtIHtudW1iZXJ9IG51bWJlck9mT2JqZWN0cyBob3cgbWFueSBvYmplY3QgZG8gd2UgbmVlZFxuKiBAcGFyYW0ge251bWJlcn0gbWluT2JqZWN0V2lkdGggaG93IHNtYWxsIGFyZSB0aGVzZSBvYmplY3RzIGFsbG93ZWQgdG8gYmVcbiogQHBhcmFtIHtudW1iZXJ9IG1heE9iamVjdFdpZHRoIGhvdyBsYXJnZSBhcmUgdGhlc2Ugb2JqZWN0IGFsbG93ZWQgdG8gYmVcbiogQHBhcmFtIHtudW1iZXJ9IHNpemVPZlNwYWNlciBwZXJjZW50IG9mIGZyZWVTcGFjZSB0aGF0IGEgc2luZ2xlIHNwYWNlciBzaG91bGQgdGFrZSB1cCAobmVlZCBudW1iZXJPZk9iamVjdHMgLSAxIHNwYWNlcnMpXG4qIEBwYXJhbSB7Ym9vbGVhbn0gb3ZlcmZsb3dRIGNhbiB3ZSBnbyBiZXlvbmQgYWxsb3RlZCBzcGFjZVxuKiBAcmV0dXJucyB7bnVtYmVyfSBob3cgbGFyZ2Ugb2JqZWN0IHNob3VsZCBiZVxuKiBmdW5jdGlvbiB0cmllcyB0byBrZWVwIG9iamVjdCB3aXRoaW4gbWluIC8gbWF4IHdpZHRoLCBidXQgd2lsIGRlZmF1bHQgdG9cbiogNWUtMTAgKHNtYWxsZXN0IGNvbnNpc3Rlbmx5IHZpc2libGUgYnkgc3ZnIHNpemUgb2YgZWxlbWVudCkgaWYgb3ZlcmZsb3dRIGlzIGZhbHNlXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZVdpZHRoT2ZPYmplY3QoZnJlZVNwYWNlLCBudW1iZXJPZk9iamVjdHMsIG1pbk9iamVjdFdpZHRoLCBtYXhPYmplY3RXaWR0aCwgc2l6ZU9mU3BhY2VyLCBvdmVyZmxvd1EpIHtcbiAgdmFyIHNpemVPZlNwYWNlciA9IHNpemVPZlNwYWNlciA8IDEgPyBmcmVlU3BhY2UgKiBzaXplT2ZTcGFjZXIgOiBzaXplT2ZTcGFjZXJcbiAgdmFyIG51bWJlck9mU3BhY2VycyA9IG51bWJlck9mT2JqZWN0cyAtIDFcbiAgdmFyIHNwYWNlVGFrZW5CeVNwYWNlcnMgPSBudW1iZXJPZlNwYWNlcnMgKiBzaXplT2ZTcGFjZXJcbiAgdmFyIHJlbWFpbmluZ1NwYWNlID0gZnJlZVNwYWNlIC0gc3BhY2VUYWtlbkJ5U3BhY2Vyc1xuICByZW1haW5pbmdTcGFjZSA9IHJlbWFpbmluZ1NwYWNlIDwgMCA/IDAgOiByZW1haW5pbmdTcGFjZVxuICB2YXIgb2JqZWN0V2lkdGggPSByZW1haW5pbmdTcGFjZSAvIG51bWJlck9mT2JqZWN0c1xuXG4gIGlmICggbWF4T2JqZWN0V2lkdGggIT0gdW5kZWZpbmVkICYmIG9iamVjdFdpZHRoID4gbWF4T2JqZWN0V2lkdGggKSB7IG9iamVjdFdpZHRoID0gbWF4T2JqZWN0V2lkdGggfVxuICBpZiAoIG92ZXJmbG93USAmJiBtaW5PYmplY3RXaWR0aCAhPSB1bmRlZmluZWQgJiYgb2JqZWN0V2lkdGggPCBtaW5PYmplY3RXaWR0aCApIHsgb2JqZWN0V2lkdGggPSBtaW5PYmplY3RXaWR0aCB9XG4gIHJldHVybiBNYXRoLm1heChvYmplY3RXaWR0aCwgNWUtMTApXG59XG5cbi8qKlxuKiBAcGFyYW0ge0FycmF5W119IGRhdGEgbGlzdCBkYXRhIChjYW4gYmUgbmVzdGVkKS4gSWYgbmVzdGVkIHdpbGwgY3JlYXRlIG1vcmUgY29tcGxleCBzcGFjZXIgc2l6ZVxuKiBAcGFyYW0ge251bWJlcn0gZnJlZVNwYWNlIGhvdyBtdWNoIHNwYWNlIGlzIGF2YWxpYmxlXG4qIEBwYXJhbSB7bnVtYmVyfSBvYmplY3RXaWR0aCBAc2Vle0BsaW5rIGNhbGN1bGF0ZVdpZHRoT2ZPYmplY3R9XG4qIEBwYXJhbSB7bnVtYmVyfSBudW1iZXJPZk9iamVjdHMgaG93IG1hbnkgb2JqZWN0IGRvIHdlIG5lZWRcbiogQHBhcmFtIHtudW1iZXJ9IGJhc2VTcGFjZXJTaXplIHBlcmNlbnQgb2YgZnJlZVNwYWNlIHRoYXQgYSBzaW5nbGUgc3BhY2VyIHNob3VsZCB0YWtlIHVwIChuZWVkIG51bWJlck9mT2JqZWN0cyAtIDEgc3BhY2VycylcbiogQHBhcmFtIHtib29sZWFufSBvdmVyZmxvd1EgY2FuIHdlIGdvIGJleW9uZCBhbGxvdGVkIHNwYWNlXG4qIEByZXR1cm5zIHtudW1iZXJ9IHJldHVybnMgc2l6ZSB0aGF0IHNwYWNlciBzaG91bGQgYmUgYXQgbGV2ZWw9MFxuKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVXaWR0aE9mU3BhY2VyKGRhdGEsIGZyZWVTcGFjZSwgb2JqZWN0V2lkdGgsIG51bWJlck9mT2JqZWN0cywgYmFzZVNwYWNlclNpemUsIG92ZXJmbG93USkge1xuICBpZiAob3ZlcmZsb3dRKSB7XG4gICAgdmFyIGxpbWl0ZWROdW1iZXJPZk9iamVjdHMgPSBudW1iZXJPZk9iamVjdHMgPiA2ID8gNiA6IG51bWJlck9mT2JqZWN0c1xuICAgIHZhciBzcGFjZUxlZnQgPSBmcmVlU3BhY2UgLSBsaW1pdGVkTnVtYmVyT2ZPYmplY3RzICogb2JqZWN0V2lkdGhcbiAgICByZXR1cm4gc3BhY2VMZWZ0IC8gKGxpbWl0ZWROdW1iZXJPZk9iamVjdHMgLSAxKVxuICB9XG4gIHZhciBzcGFjZXJzQXRFYWNoTGV2ZWwgPSBzcGFjZXJzTmVlZGVkQXRFYWNoTGV2ZWwoZGF0YSlcbiAgdmFyIHRvdGFsU3BhY2VyUGVyY2VudCA9IHRvdGFsKHNwYWNlcnNBdEVhY2hMZXZlbC5tYXAoZnVuY3Rpb24oZSwgaSkge3JldHVybiBlICogMSAvIChpKzEpfSkpXG4gIHZhciBiYXNlU3BhY2VyU2l6ZSA9IChmcmVlU3BhY2UgLSAob2JqZWN0V2lkdGggKiBudW1iZXJPZk9iamVjdHMpKSAvIHRvdGFsU3BhY2VyUGVyY2VudFxuICAvLyBjb25zb2xlLmxvZyh0b3RhbFNwYWNlclBlcmNlbnQsIGJhc2VTcGFjZXJTaXplLCB0b3RhbFNwYWNlclBlcmNlbnQgKiBiYXNlU3BhY2VyU2l6ZSlcbiAgcmV0dXJuIGJhc2VTcGFjZXJTaXplXG59XG5cblxuLyoqXG4qIENhbGN1bGF0ZXMgbnVtYmVyIG9mIHNwYWNlcnMgbmVlZGVkIHRvIHNlcGVyYXRlIGVsZW1lbnRzIGF0IGVhY2ggbGV2ZWwuXG4qIEBwYXJhbSB7QXJyYXlbXX0gYXJyYXkgbGlzdCBkYXRhIChjYW4gYmUgbmVzdGVkKS4gSWYgbmVzdGVkIHdpbGwgY3JlYXRlIG1vcmUgY29tcGxleCBzcGFjZXIgc2l6ZVxuKiBAcGFyYW0ge251bWJlcn0gW2xldmVsPTBdIGN1cnJlbnQgbGV2ZWwsIHVzZWQgaW4gcmVjdXNyaW9uXG4qIEBwYXJhbSB7QXJyYXl9IFtsZXZlbERhdGE9W11dIGhvdyBtYW55IHNwYWNlcnMgbmVlZGVkIGF0IGEgZ2l2ZW4gbGV2ZWxcbiogQHJldHVybnMge0FycmF5fSBsZXZlbERhdGFcbipcbiogQGV4YW1wbGVcbiogYXJyYXkgPSBbWzEsMl0sIFszLDRdXVxuKiAvLyByZXR1cm5zIFsxLCAyXVxuKiBhcyBhdCBsZXZlbD0wIHRoZSBvbmx5IHNwYWNlciBuZWVkZWQgaXMgYmV0d2VlbiBbMSwyXSBhbmQgWzMsNF1cbiogYW5kIGF0IGxldmVsPTEgdGhlIG9ubHkgdHdvIHNwYWNlcnMgbmVlZGVkIGlzIGJldHdlZW4gMSBhbmQgMiBhcyB3ZWxsIGFzXG4qIDMgYW5kIDQgc2luY2UgdGhlIHNwYWNlciBiZXR3ZWVuIDIgYW5kIDMgaXMgaGFuZGxlZCBhdCBsZXZlbD0wXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIHNwYWNlcnNOZWVkZWRBdEVhY2hMZXZlbCAoYXJyYXksIGxldmVsLCBsZXZlbERhdGEgKSB7XG4gIGlmICggbGV2ZWwgPT0gdW5kZWZpbmVkICkgeyBsZXZlbCA9IDA7ICB9IGVsc2UgeyBsZXZlbCArPSAxIH1cbiAgaWYgKCBsZXZlbERhdGEgPT0gdW5kZWZpbmVkICkgeyBsZXZlbERhdGEgPSBbXTsgfVxuICBpZiAoIGxldmVsID49IGxldmVsRGF0YS5sZW5ndGggKSB7IGxldmVsRGF0YS5wdXNoKGFycmF5Lmxlbmd0aCAtIDEpIH1cbiAgZWxzZSB7IGxldmVsRGF0YVtsZXZlbF0gKz0gYXJyYXkubGVuZ3RoIC0gMSB9XG4gIGFycmF5Lm1hcChmdW5jdGlvbihlLCBpKSB7IGlmIChBcnJheS5pc0FycmF5KGUpKSB7IHNwYWNlcnNOZWVkZWRBdEVhY2hMZXZlbChlLCBsZXZlbCwgbGV2ZWxEYXRhKSB9IH0gKVxuICByZXR1cm4gbGV2ZWxEYXRhXG59XG5cblxuXG5cbi8qKlxuKiBEcmF3cyBhIHdoaXNrZXIgZm9yIEBzZWV7QGxpbmsgYm94d2hpc2tlcn1cbiogQHBhcmFtIHtib29sZWFufSBkaXIgZGlyZWN0aW9uIHRvIGRyYXcgd2hpc2tlciwgc2hvdWxkIGJlIGVpdGhlciB0cnVlICh1cCwgdG9wKSBvciBmYWxzZSAoZG93biBvciBib3R0b20pXG4qIEBwYXJhbSB7bnVtYmVyfSB4IHN0YXJ0aW5nIHggY29vcmRpbmF0ZSBpbiB3aGljaCB0byBkcmF3IHdoaXNrZXJcbiogQHBhcmFtIHtudW1iZXJ9IHkgc3RhcnRpbmcgeSBjb29yZGluYXRlIGluIHdoaWNoIHRvIGRyYXcgd2hpc2tlclxuKiBAcGFyYW0ge251bWJlcn0gdyB3aWR0aCBvZiBzcGFjZSBpbiB3aGljaCB0byBkcmF3IHdoaXNrZXJcbiogQHBhcmFtIHtudW1iZXJ9IGggaGVpZ2h0IG9mIHNwYWNlIGluIHdoaWNoIHRvIGRyYXcgd2hpc2tlclxuKiBAcGFyYW0ge251bWJlcn0gcGVyIHBlcmNlbnRhZ2Ugb2YgdyBvciBoIChkZXBlbmRzIG9uIG8pIHRvIG1ha2Ugd2hpc2tlclxuKiBAcGFyYW0ge2Jvb2xlYW59IG8gb3JpZW50YXRpb24sIHRydWUgaXMgaG9yaXpvbnRhbCBhbmQgZmFsc2UgaXMgdmVydGljYWxcbiogQHJldHVybnMge3N0cmluZ30gcmVwcmVzZW50aW5nIHRoZSBzdmcgcGF0aCAoaS5lLiB0aGUgZCBhdHRyaWJ1dGUgZm9yIGEgcGF0aCB0YWcpXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIHdoaXNrZXJQYXRoKGRpciwgeCwgeSwgdywgaCwgcGVyLCBvKSB7XG4gIC8vIGQgPSBkaXJlY3Rpb24gKHRydWUgaXMgdXApLCBwID0gcGVyY2VudCB3aWR0aFxuICBpZiAoZGlyID09ICd1cCcgfHwgZGlyID09ICd0b3AnIHx8IGRpciA9PSB0cnVlKSB7ZGlyID0gdHJ1ZX1cbiAgaWYgKGRpciA9PSAnZG93bicgfHwgZGlyID09ICdib3R0b20nIHx8IGRpciA9PSBmYWxzZSkge2RpciA9IGZhbHNlfVxuICBvID0gbyA9PSB1bmRlZmluZWQgPyAnaG9yaXpvbnRhbCcgOiBvXG4gIHBlciA9IHBlciA9PSB1bmRlZmluZWQgPyAxIDogcGVyXG4gIGlmIChvICE9IFwiaG9yaXpvbnRhbFwiKSB7XG4gICAgdmFyIGhoID0gaCAqIHBlciAsXG4gICAgdyA9IGRpciA/IHcgOiAtdyAsXG4gICAgYSA9IGRpciA/IHggKyB3IDogeCAsXG4gICAgYiA9IGRpciA/IHggOiB4ICsgdyAsXG4gICAgYyA9IGRpciA/IGEgOiBiXG4gICAgcCA9IFwiTSBcIiArIGEgKyAnICcgKyAoICAgICBoIC8gMiAgICAgICkgKyAnICdcbiAgICAgICsgJ0wgJyArIGIgKyAnICcgKyAoICAgICBoIC8gMiAgICAgICkgKyAnICdcbiAgICAgICsgJ00gJyArIGMgKyAnICcgKyAoIGggLyAyIC0gaGggLyAyICkgKyAnICdcbiAgICAgICsgJ0wgJyArIGMgKyAnICcgKyAoIGggLyAyICsgaGggLyAyICkgKyAnICdcblxuICAgIHJldHVybiBwXG4gIH1cbiAgdmFyIHd3ID0gdyAqIHBlcixcbiAgYSA9IGRpciA/IHkgKyBoIDogeSAgLFxuICBiID0gZGlyID8geSA6IHkgKyBoICAsXG4gIHAgPSBcIk0gXCIgKyAoICB3IC8gMiAgKSArICcgJyArIGEgKyAnICcgLy8gc3RyYWlnaHQgbGluZSBwYXJ0XG4gICAgKyAnTCAnICsgKCAgdyAvIDIgICkgKyAnICcgKyBiICsgJyAnIC8vIHN0cmFpZ2h0IGxpbmUgcGFydFxuICAgICsgJ2ggJyArICggLXd3IC8gMiApICsgJyAnICsgMCArICcgJyAvLyBob3Jpem9udGFsIGxpbmUgcGFydFxuICAgICsgJ2ggJyArICggICAgd3cgICApICsgJyAnICsgMCArICcgJ1xuICByZXR1cm4gcFxufVxuIiwiaW1wb3J0IHtsb2csIHdhcm4sIGVycm9yLCBpbmZvfSBmcm9tICcuL3V0aWxzJztcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BBQ0VHUk9VUElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKipcbiAqIFByb2R1Y2VzIGEgZnVuY3Rpb24gZm9yIHNwYWNpbmcgb2JqZWN0cyBieSBhbiBhcmJpdHJhcmx5IGNvbXBsZXggZ3JvdXBpbmdcbiAqIEByZXR1cm5zIHtyZWN1cnNpdmVseVBvc2l0aW9ufSB0aGUgZnVuY3Rpb24gZm9yIG1vdmluZyB0aGUgb2JqZWN0c1xuICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIjcmVjdXJzaXZlbHlQb3NpdGlvbn0pXG4gKiBAbmFtZXNwYWNlIGdyb3VwaW5nU3BhY2VyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBncm91cGluZ1NwYWNlcigpIHtcbiAgdmFyXG4gIC8qQHZhciB7Ym9vbGVhbn0gaG9yaXpvbnRhbFEgQGRlZmF1bHQqL1xuXG4gIC8qKlxuICAqIFdoZXRoZXIgb3Igbm90IHRvIHNwYWNlIG9iamVjdHMgaG9yaXpvbnRhbGx5IG9yIHZlcnRpY2FsbHkuXG4gICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIuaG9yaXpvbnRhbFF9KVxuICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2hvcml6b250YWxRPXRydWVdXG4gICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyI1xuICAqIEBpbnN0YW5jZVxuICAqL1xuICBob3Jpem9udGFsUSA9IHRydWUsXG4gIC8qKlxuICAqIFRoZSBzY2FsZSB0byB1c2UgdG8gcG9zaXRpb24gZWxlbWVudHMgaWYge0BsaW5rIGdyb3VwaW5nU3BhY2VyI21vdmVieX09XCJzdHJpbmdcIlxuICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyLnNjYWxlfSlcbiAgKiBAcGFyYW0ge2QzLnNjYWxlfSBbc2NhbGU9ZDMuc2NhbGVMaW5lYXIoKV1cbiAgKiBAbWVtYmVyb2YgZ3JvdXBpbmdTcGFjZXIjXG4gICogQGluc3RhbmNlXG4gICovXG4gIHNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKSxcbiAgLyoqXG4gICogSG93IGVsZW1lbnRzIGluIHRoZSBjb21wbGV4IGdyb3VwaW5nIHNob3VsZCBiZSBtb3ZlZCBvdmVyIGJ5LlxuICAqIEJ5IGRlZmF1bHQsIG1vdmVieT1cImNhdGVnb3J5XCIsIHdoaWNoIG1vdmVzIG9iamVjdHMgYnkgdGhlIGNvbXBsZXggZ3JvdXBpbmdcbiAgKiBCdXQgb2JqZWN0cyBjYW4gYWxzbyBiZSBtb3ZlZCBvdmVyIGJ5IHNjYWxlLlxuICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyLm1vdmVieX0pXG4gICogQHBhcmFtIHtzdHJpbmd9IFttb3ZlYnk9XCJjYXRlZ29yeVwiXVxuICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlciNcbiAgKiBAaW5zdGFuY2VcbiAgKi9cbiAgbW92ZWJ5ID0gJ2NhdGVnb3J5JyxcbiAgLyoqXG4gICogSG93IG1hbnkgb2JqZWN0cyBhcmUgdGhlcmUgaW4gdG90YWxcbiAgKiAoc2VlIHtAbGluayBncm91cGluZ1NwYWNlci5udW1iZXJPZk9iamVjdHN9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbbnVtYmVyT2ZPYmplY3RzPW5vbmVdXG4gICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyI1xuICAqIEBpbnN0YW5jZVxuICAqL1xuICBudW1iZXJPZk9iamVjdHMsXG4gIC8qKlxuICAqIFRoZSBjbGFzcyBnaXZlbiB0byBhbiBuZXN0ZWQgPGc+IHRhZyB3aG9zZSBwYXJlbnQocykgaGF2ZSB0aGUgY29ycmVjdCB0cmFuc2l0aW9uXG4gICogcHJvcGVydGllc1xuICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyLm51bWJlck9mT2JqZWN0c30pXG4gICogQHBhcmFtIHtzdHJpbmd9IFtudW1iZXJPZk9iamVjdHM9J2Qzc20tZ3JvdXBwZWQtaXRlbSddXG4gICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyI1xuICAqIEBpbnN0YW5jZVxuICAqL1xuICBvYmplY3RDbGFzcyA9ICdkM3NtLWdyb3VwcGVkLWl0ZW0nLFxuICAvKipcbiAgKiBUaGUgc2l6ZSBvZiB0aGUgb2JqZWN0cyBiZWluZyBwb3NpdGlvbmVkXG4gICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIub2JqZWN0U2l6ZX0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtvYmplY3RTaXplPW5vbmVdXG4gICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyI1xuICAqIEBpbnN0YW5jZVxuICAqL1xuICBvYmplY3RTaXplLFxuICAvKipcbiAgKiBUaGUgc2l6ZSBvZiB0aGUgdW4tbmVzdGVkIHNwYWNlciBiZXR3ZWVuIG9iamVjdHNcbiAgKiAoc2VlIHtAbGluayBncm91cGluZ1NwYWNlci5zcGFjZXJTaXplfSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW3NwYWNlclNpemU9bm9uZV1cbiAgKiBAbWVtYmVyb2YgZ3JvdXBpbmdTcGFjZXIjXG4gICogQGluc3RhbmNlXG4gICovXG4gIHNwYWNlclNpemUsXG4gIC8qKlxuICAqIFRoZSBkdXJhdGlvbiBvZiB0cmFuc2l0aW9ucyBpbiBtc1xuICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyLnRyYW5zaXRpb25EdXJhdGlvbn0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFt0cmFuc2l0aW9uRHVyYXRpb249MTAwMF1cbiAgKiBAbWVtYmVyb2YgZ3JvdXBpbmdTcGFjZXIjXG4gICogQGluc3RhbmNlXG4gICovXG4gIHRyYW5zaXRpb25EdXJhdGlvbiA9IDEwMDAsXG4gIC8qKlxuICAqIFRoZSBlYXNlIGZ1bmN0aW9uIGZvciB0aGUgdHJhbnNpdGlvbnNcbiAgKiAoc2VlIHtAbGluayBncm91cGluZ1NwYWNlci5lYXNlRnVuY30pXG4gICogQHBhcmFtIHtkMy5lYXNlfSBbZWFzZUZ1bmM9ZDMuZWFzZVNpbl1cbiAgKiBAbWVtYmVyb2YgZ3JvdXBpbmdTcGFjZXIjXG4gICogQGluc3RhbmNlXG4gICovXG4gIGVhc2VGdW5jID0gZDMuZWFzZVNpbixcbiAgLyoqXG4gICogVGhlIG5hbWVzcGFjZSBmb3IgdGhlIG9iamVjdHMgYmVpbmcgbW92ZWRcbiAgKiAoc2VlIHtAbGluayBncm91cGluZ1NwYWNlci5uYW1lc3BhY2V9KVxuICAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZXNwYWNlPSdzcGFjZXInXVxuICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlciNcbiAgKiBAaW5zdGFuY2VcbiAgKi9cbiAgbmFtZXNwYWNlID0gJ3NwYWNlcicsXG4gIC8qKlxuICAqIFRoZSBhbmltYXRpb24gZm9yIG5ldyBvYmplY3RzIGJlaW5nIGFkZGVkXG4gICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIuZW50ZXJGdW5jdGlvbn0pXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gZW50ZXJGdW5jdGlvblxuICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlciNcbiAgKiBAaW5zdGFuY2VcbiAgKiBAZXhhbXBsZVxuICAqIC8vIGJ5IGRlZmF1bHRcbiAgKiBmdW5jdGlvbihuZXdPYmplY3RTZWxlY3Rpb24pIHtcbiAgKiAgbmV3T2JqZWN0U2VsZWN0aW9uLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uKGQsIGkpe1xuICAqICAgIHZhclxuICAqICAgIHggPSBob3Jpem9udGFsUSA/IG9iamVjdFNpemUgKiBudW1iZXJPZk9iamVjdHMgKyBzcGFjZXJTaXplICogKG51bWJlck9mT2JqZWN0cyAtIDEpIDogMCxcbiAgKiAgICB5ID0gIWhvcml6b250YWxRID8gb2JqZWN0U2l6ZSAqIG51bWJlck9mT2JqZWN0cyArIHNwYWNlclNpemUgKiAobnVtYmVyT2ZPYmplY3RzIC0gMSkgOiAwLFxuICAqICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgKiAgICByZXR1cm4gdFxuICAqICB9KVxuICAqIH1cbiAgKi9cbiAgZW50ZXJGdW5jdGlvbiA9IGZ1bmN0aW9uKGN1cikge1xuICAgIGN1ci5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbihkLCBpKXtcbiAgICAgIHZhclxuICAgICAgeCA9IGhvcml6b250YWxRID8gb2JqZWN0U2l6ZSAqIG51bWJlck9mT2JqZWN0cyArIHNwYWNlclNpemUgKiAobnVtYmVyT2ZPYmplY3RzIC0gMSkgOiAwLFxuICAgICAgeSA9ICFob3Jpem9udGFsUSA/IG9iamVjdFNpemUgKiBudW1iZXJPZk9iamVjdHMgKyBzcGFjZXJTaXplICogKG51bWJlck9mT2JqZWN0cyAtIDEpIDogMCxcbiAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgIHJldHVybiB0XG4gICAgfSlcbiAgfSxcbiAgLyoqXG4gICogVGhlIGFuaW1hdGlvbiBmb3Igb2xkIG9iamVjdHMgYmVpbmcgcmVtb3ZlZFxuICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyLmV4aXRGdW5jdGlvbn0pXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gZXhpdEZ1bmN0aW9uXG4gICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyI1xuICAqIEBpbnN0YW5jZVxuICAqIEBleGFtcGxlXG4gICogLy8gYnkgZGVmYXVsdFxuICAqIG9sZE9iamVjdFNlbGVjdGlvbi50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlKGVhc2VGdW5jKVxuICAqIC5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbihkLCBpKXtcbiAgKiAgICAgdmFyXG4gICogICB4ID0gaG9yaXpvbnRhbFEgPyBvYmplY3RTaXplICogbnVtYmVyT2ZPYmplY3RzICsgc3BhY2VyU2l6ZSAqIChudW1iZXJPZk9iamVjdHMgLSAxKSA6IDAsXG4gICogICB5ID0gIWhvcml6b250YWxRID8gb2JqZWN0U2l6ZSAqIG51bWJlck9mT2JqZWN0cyArIHNwYWNlclNpemUgKiAobnVtYmVyT2ZPYmplY3RzIC0gMSkgOiAwLFxuICAqICAgdCA9ICd0cmFuc2xhdGUoJyt4KycsJyt5KycpJ1xuICAqICAgcmV0dXJuIHRcbiAgKiB9KS5yZW1vdmUoKVxuICAqL1xuICBleGl0RnVuY3Rpb24gPSBmdW5jdGlvbihjdXIpe1xuICAgIGxvZyhcImdyb3VwaW5nU3BhY2VyXCIsIFwiZXhpdGluZyB3aXRoXCIsIHtjdXJyZW50OiBjdXIsIGN1cnJlbnROb2RlOiBjdXIubm9kZSgpfSlcbiAgICBjdXIuY2xhc3NlZCgndG8tcmVtb3ZlJywgdHJ1ZSlcblxuICAgIGN1ci50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKjAuOSkuZWFzZShlYXNlRnVuYylcbiAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24oZCwgaSl7XG4gICAgICB2YXJcbiAgICAgIHggPSBob3Jpem9udGFsUSA/IG9iamVjdFNpemUgKiBudW1iZXJPZk9iamVjdHMgKyBzcGFjZXJTaXplICogKG51bWJlck9mT2JqZWN0cyAtIDEpIDogMCxcbiAgICAgIHkgPSAhaG9yaXpvbnRhbFEgPyBvYmplY3RTaXplICogbnVtYmVyT2ZPYmplY3RzICsgc3BhY2VyU2l6ZSAqIChudW1iZXJPZk9iamVjdHMgLSAxKSA6IDAsXG4gICAgICB0ID0gJ3RyYW5zbGF0ZSgnK3grJywnK3krJyknXG4gICAgICByZXR1cm4gdFxuICAgIH0pLnJlbW92ZSgpXG4gIH1cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgaG9yaXpvbnRhbFEgKHdoZXRoZXIgb3Igbm90IHRvIHNwYWNlIG9iamVjdHMgaG9yaXpvbnRhbGx5IG9yIHZlcnRpY2FsbHkpLlxuICAgKiAoc2VlIHtAbGluayBncm91cGluZ1NwYWNlciNob3Jpem9udGFsUX0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Z3JvdXBpbmdTcGFjZXIgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlclxuICAgKiBAc3RhdGljXG4gICAqL1xuICByZWN1cnNpdmVseVBvc2l0aW9uLmhvcml6b250YWxRID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChob3Jpem9udGFsUSA9IF8sIHJlY3Vyc2l2ZWx5UG9zaXRpb24pIDogaG9yaXpvbnRhbFEgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNjYWxlIHRvIHVzZSB0byBwb3NpdGlvbiBlbGVtZW50cyBpZiB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIjbW92ZWJ5fT1cInN0cmluZ1wiXG4gICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyI3NjYWxlfSlcbiAgICogQHBhcmFtIHtkMy5zY2FsZX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2dyb3VwaW5nU3BhY2VyIHwgZDMuc2NhbGV9XG4gICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlclxuICAgKiBAc3RhdGljXG4gICAqL1xuICByZWN1cnNpdmVseVBvc2l0aW9uLnNjYWxlID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzY2FsZSA9IF8sIHJlY3Vyc2l2ZWx5UG9zaXRpb24pIDogc2NhbGUgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgbW92ZWJ5ICh3aGV0aGVyIG9yIG5vdCB0byBtb3ZlIGJ5IHNjYWxlIG9yIGJ5IGdyb3VwaW5nKS5cbiAgICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIjbW92ZWJ5fSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtncm91cGluZ1NwYWNlciB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHJlY3Vyc2l2ZWx5UG9zaXRpb24ubW92ZWJ5ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChtb3ZlYnkgPSBfLCByZWN1cnNpdmVseVBvc2l0aW9uKSA6IG1vdmVieSB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyBudW1iZXJPZk9iamVjdHMuXG4gICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyI251bWJlck9mT2JqZWN0c30pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Z3JvdXBpbmdTcGFjZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlclxuICAgKiBAc3RhdGljXG4gICAqL1xuICByZWN1cnNpdmVseVBvc2l0aW9uLm51bWJlck9mT2JqZWN0cyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobnVtYmVyT2ZPYmplY3RzID0gXywgcmVjdXJzaXZlbHlQb3NpdGlvbikgOiBudW1iZXJPZk9iamVjdHMgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG9iamVjdENsYXNzICh3aWxsIGJlIGFwcGxpZWQgdG8gPGc+IGVsZW1lbnRzKS5cbiAgICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIjb2JqZWN0Q2xhc3N9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2dyb3VwaW5nU3BhY2VyIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgZ3JvdXBpbmdTcGFjZXJcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgcmVjdXJzaXZlbHlQb3NpdGlvbi5vYmplY3RDbGFzcyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob2JqZWN0Q2xhc3MgPSBfLCByZWN1cnNpdmVseVBvc2l0aW9uKSA6IG9iamVjdENsYXNzIH1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBvYmplY3RTaXplLlxuICAgKiAoc2VlIHtAbGluayBncm91cGluZ1NwYWNlciNvYmplY3RTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtncm91cGluZ1NwYWNlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHJlY3Vyc2l2ZWx5UG9zaXRpb24ub2JqZWN0U2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob2JqZWN0U2l6ZSA9IF8sIHJlY3Vyc2l2ZWx5UG9zaXRpb24pIDogb2JqZWN0U2l6ZSB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgc3BhY2VyU2l6ZS5cbiAgICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIjc3BhY2VyU2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Z3JvdXBpbmdTcGFjZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlclxuICAgKiBAc3RhdGljXG4gICAqL1xuICByZWN1cnNpdmVseVBvc2l0aW9uLnNwYWNlclNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNwYWNlclNpemUgPSBfLCByZWN1cnNpdmVseVBvc2l0aW9uKSA6IHNwYWNlclNpemUgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRyYW5zaXRpb25EdXJhdGlvbi5cbiAgICogKHNlZSB7QGxpbmsgZ3JvdXBpbmdTcGFjZXIjdHJhbnNpdGlvbkR1cmF0aW9ufSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtncm91cGluZ1NwYWNlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHJlY3Vyc2l2ZWx5UG9zaXRpb24udHJhbnNpdGlvbkR1cmF0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0cmFuc2l0aW9uRHVyYXRpb24gPSBfLCByZWN1cnNpdmVseVBvc2l0aW9uKSA6IHRyYW5zaXRpb25EdXJhdGlvbiB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgZWFzZUZ1bmMuXG4gICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyI2Vhc2VGdW5jfSlcbiAgICogQHBhcmFtIHtkMy5lYXNlfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Z3JvdXBpbmdTcGFjZXIgfCBkMy5lYXNlfVxuICAgKiBAbWVtYmVyb2YgZ3JvdXBpbmdTcGFjZXJcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgcmVjdXJzaXZlbHlQb3NpdGlvbi5lYXNlRnVuYyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZWFzZUZ1bmMgPSBfLCByZWN1cnNpdmVseVBvc2l0aW9uKSA6IGVhc2VGdW5jIH1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBuYW1lc3BhY2UuXG4gICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyI25hbWVzcGFjZX0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Z3JvdXBpbmdTcGFjZXIgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlclxuICAgKiBAc3RhdGljXG4gICAqL1xuICByZWN1cnNpdmVseVBvc2l0aW9uLm5hbWVzcGFjZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobmFtZXNwYWNlID0gXywgcmVjdXJzaXZlbHlQb3NpdGlvbikgOiBuYW1lc3BhY2UgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGVudGVyRnVuY3Rpb24uXG4gICAqIChzZWUge0BsaW5rIGdyb3VwaW5nU3BhY2VyI2VudGVyRnVuY3Rpb259KVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Z3JvdXBpbmdTcGFjZXIgfCBmdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHJlY3Vyc2l2ZWx5UG9zaXRpb24uZW50ZXJGdW5jdGlvbiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZW50ZXJGdW5jdGlvbiA9IF8sIHJlY3Vyc2l2ZWx5UG9zaXRpb24pIDogZW50ZXJGdW5jdGlvbiB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgZXhpdEZ1bmN0aW9uLlxuICAgKiAoc2VlIHtAbGluayBncm91cGluZ1NwYWNlciNleGl0RnVuY3Rpb259KVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Z3JvdXBpbmdTcGFjZXIgfCBmdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIGdyb3VwaW5nU3BhY2VyXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHJlY3Vyc2l2ZWx5UG9zaXRpb24uZXhpdEZ1bmN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChleGl0RnVuY3Rpb24gPSBfLCByZWN1cnNpdmVseVBvc2l0aW9uKSA6IGV4aXRGdW5jdGlvbiB9XG5cblxuICAvKipcbiAgICogcmVjdXJzaXZlbHkgcG9zaXRpb24gdGhlIG9iamVjdHMgaW5zaWRlIG9mIHRoZSBzZWxlY3Rpb24uXG4gICAqIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBzZWxlY3Rpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICogQHBhcmFtIHtsZXZlbH0gW2xldmVsPTBdIHJlY3Vyc2lvbiBkZXB0aFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSAoaG93IG11Y2ggdG8gbW92ZSBuZXh0IGVsZW1lbnQpXG4gICAqIEBtZW1iZXJvZiBncm91cGluZ1NwYWNlciNcbiAgICovXG4gIGZ1bmN0aW9uIHJlY3Vyc2l2ZWx5UG9zaXRpb24oc2VsZWN0aW9uLCBkYXRhLCBsZXZlbCkge1xuICAgIGlmICggbGV2ZWwgPT0gdW5kZWZpbmVkICkgeyBsZXZlbCA9IDA7ICB9XG5cbiAgICB2YXIgY3VycmVudFNlbGVjdGlvbiA9IHNlbGVjdGlvbi5zZWxlY3RBbGwoJ2cuJytuYW1lc3BhY2UrJ1tsZXZlbD1cIicrbGV2ZWwrJ1wiXScpLmRhdGEoZGF0YSlcbiAgICB2YXIgZW50ZXIgPSBjdXJyZW50U2VsZWN0aW9uLmVudGVyKCkuYXBwZW5kKCdnJykuYXR0cignbGV2ZWwnLCBsZXZlbCkuYXR0cignY2xhc3MnLCBuYW1lc3BhY2UpXG4gICAgdmFyIGV4aXQgPSBjdXJyZW50U2VsZWN0aW9uLmV4aXQoKVxuICAgIGN1cnJlbnRTZWxlY3Rpb24gPSBjdXJyZW50U2VsZWN0aW9uLm1lcmdlKGVudGVyKVxuXG5cbiAgICBpZiAodHlwZW9mIGV4aXRGdW5jdGlvbiA9PSAnZnVuY3Rpb24nICl7IGV4aXQuZWFjaChmdW5jdGlvbihkLCBpKXsgZXhpdEZ1bmN0aW9uKGQzLnNlbGVjdCh0aGlzKSl9KSB9XG4gICAgZWxzZXtleGl0LnJlbW92ZSgpfVxuICAgIC8vIHNwYWNlciBmb3IgY3VycmVudCBsZXZlbFxuICAgIHZhciBsZXZlbFNwYWNlciA9IHNwYWNlclNpemUgLyAobGV2ZWwrMSlcbiAgICAvLyBtb3ZlbWVudCBmb3IgY3VycmVudCBsZXZlbFxuICAgIHZhciBtb3ZlID0gMFxuICAgIGN1cnJlbnRTZWxlY3Rpb24uZWFjaChmdW5jdGlvbihjdXJyZW50RWxlbWVudCwgaW5kZXgpIHtcbiAgICAgIHZhciB0ID0gZDMuc2VsZWN0KHRoaXMpXG4gICAgICBpZiAodC5hdHRyKCd0cmFuc2Zvcm0nKSA9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGVudGVyRnVuY3Rpb24gPT0gJ2Z1bmN0aW9uJykgeyBlbnRlckZ1bmN0aW9uKHQpIH1cblxuICAgICAgdC50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlKGVhc2VGdW5jKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uKGQsIGkpIHtcbiAgICAgICAgdmFyXG4gICAgICAgIHggPSBob3Jpem9udGFsUSA/IChtb3ZlYnkgPT1cInNjYWxlXCIgPyBzY2FsZShkKSA6IG1vdmUpIDogMCxcbiAgICAgICAgeSA9ICFob3Jpem9udGFsUSA/IChtb3ZlYnkgPT1cInNjYWxlXCIgPyBzY2FsZShkKSA6IG1vdmUpOiAwLFxuICAgICAgICB0ID0gJ3RyYW5zbGF0ZSgnK3grJywnK3krJyknXG4gICAgICAgIHJldHVybiB0XG4gICAgICB9KVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50RWxlbWVudCkpIHtcbiAgICAgICAgbW92ZSArPSByZWN1cnNpdmVseVBvc2l0aW9uKHQsIGN1cnJlbnRFbGVtZW50LCBsZXZlbCsxKVxuICAgICAgICB2YXIgdG9SZW1vdmUgPSB0LnNlbGVjdEFsbCgnZy4nK25hbWVzcGFjZSsnW2xldmVsPVwiJysobGV2ZWwpKydcIl0gPiBnLicrb2JqZWN0Q2xhc3MrJy4nK25hbWVzcGFjZSlcbiAgICAgICAgaWYgKHR5cGVvZiBleGl0RnVuY3Rpb24gPT0gJ2Z1bmN0aW9uJyApeyB0b1JlbW92ZS5lYWNoKGZ1bmN0aW9uKGQsIGkpeyBleGl0RnVuY3Rpb24oZDMuc2VsZWN0KHRoaXMpKX0pIH1cbiAgICAgICAgZWxzZXt0b1JlbW92ZS5yZW1vdmUoKX1cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBtb3ZlICs9IG9iamVjdFNpemVcbiAgICAgICAgdmFyIG9iaiA9IHQuc2VsZWN0KCdnLicrbmFtZXNwYWNlKydbbGV2ZWw9XCInK2xldmVsKydcIl0gPiBnLicrb2JqZWN0Q2xhc3MrJy4nK25hbWVzcGFjZSlcbiAgICAgICAgaWYgKG9iai5lbXB0eSgpKSB7IG9iaiA9IHQuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCBvYmplY3RDbGFzcykuY2xhc3NlZChuYW1lc3BhY2UsIHRydWUpIH1cbiAgICAgICAgb2JqLmF0dHIoJ3BhcmVudC1pbmRleCcsIGluZGV4KVxuICAgICAgICB2YXIgdG9SZW1vdmUgPSB0LnNlbGVjdEFsbCgnZy4nK25hbWVzcGFjZSsnW2xldmVsPVwiJysobGV2ZWwrMSkrJ1wiXScpXG5cbiAgICAgICAgaWYgKHR5cGVvZiBleGl0RnVuY3Rpb24gPT0gJ2Z1bmN0aW9uJyApeyB0b1JlbW92ZS5lYWNoKGZ1bmN0aW9uKGQsIGkpeyBleGl0RnVuY3Rpb24oZDMuc2VsZWN0KHRoaXMpKX0pIH1cbiAgICAgICAgZWxzZXt0b1JlbW92ZS5yZW1vdmUoKX1cbiAgICAgIH1cbiAgICAgIG1vdmUgKz0gKGluZGV4ID09IGN1cnJlbnRTZWxlY3Rpb24uc2l6ZSgpLTEpID8gMCA6IGxldmVsU3BhY2VyXG4gICAgfSlcbiAgICByZXR1cm4gbW92ZVxuICB9XG4gIHJldHVybiByZWN1cnNpdmVseVBvc2l0aW9uXG59XG4iLCJpbXBvcnQge21vZGlmeUhleGlkZWNpbWFsQ29sb3JMdW1pbmFuY2V9IGZyb20gJy4vaGVscGVycyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNvbG9yRnVuY3Rpb25cbiAqIEBjb25zdHJ1Y3RvciBjb2xvckZ1bmN0aW9uXG4gKiBAbmFtZXNwYWNlIGNvbG9yRnVuY3Rpb25cbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gY29sb3JGdW5jdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sb3JGdW5jdGlvbigpIHtcbiAgdmFyXG4gIC8qKlxuICAqIERlZmF1bHQgY29sb3JzIHRvIHVzZVxuICAqIEBwYXJhbSB7bnVtYmVyW119IFtjb2xvcnM9W1wiIzJjN2JiNlwiLCBcIiMwMGE2Y2FcIiwgXCIjMDBjY2JjXCIsIFwiIzkwZWI5ZFwiLCBcIiNmZmZmOGNcIiwgXCIjZjlkMDU3XCIsIFwiI2YyOWUyZVwiLCBcIiNlNzY4MThcIiwgXCIjZDcxOTFjXCJdXVxuICAqIEBtZW1iZXJvZiBjb2xvckZ1bmN0aW9uI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBjb2xvcnMgPSBbXCIjMmM3YmI2XCIsIFwiIzAwYTZjYVwiLCBcIiMwMGNjYmNcIiwgXCIjOTBlYjlkXCIsIFwiI2ZmZmY4Y1wiLCBcIiNmOWQwNTdcIiwgXCIjZjI5ZTJlXCIsIFwiI2U3NjgxOFwiLCBcIiNkNzE5MWNcIl0sXG4gIC8qKlxuICAqIEludGVycG9sYXRvciBmb3IgY29sb3JzXG4gICogQHBhcmFtIHtkMy5pbnRlcnBvbGF0aW9ufSBbaW50ZXJwb2xhdGlvbj1kMy5pbnRlcnBvbGF0ZVJnYl1cbiAgKiBAbWVtYmVyb2YgY29sb3JGdW5jdGlvbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgaW50ZXJwb2xhdGlvbiA9IGQzLmludGVycG9sYXRlUmdiLFxuICAvKipcbiAgKiBGdW5jdGlvbiBmb3IgbW9kaWZ5aW5nIGNvbG9yIGx1bWluYW5jZVxuICAqIEBwYXJhbSB7ZnVuY3Rpb259IFttb2RpZnlPcGFjaXR5PW1vZGlmeUhleGlkZWNpbWFsQ29sb3JMdW1pbmFuY2VdXG4gICogQG1lbWJlcm9mIGNvbG9yRnVuY3Rpb24jXG4gICogQHByb3BlcnR5XG4gICovXG4gIG1vZGlmeU9wYWNpdHkgPSBtb2RpZnlIZXhpZGVjaW1hbENvbG9yTHVtaW5hbmNlLFxuICAvKipcbiAgKiBIb3cgdG8gbW9kaWZ5IGNvbG9yIGZvciBzdHJva2VcbiAgKiBAcGFyYW0ge251bWJlcn0gW3N0cm9rZU9wYWNpdHk9MF1cbiAgKiBAbWVtYmVyb2YgY29sb3JGdW5jdGlvbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc3Ryb2tlT3BhY2l0eSA9IDAsXG4gIC8qKlxuICAqIEhvdyB0byBtb2RpZnkgY29sb3IgZm9yIGZpbGxcbiAgKiBAcGFyYW0ge251bWJlcn0gW2ZpbGxPcGFjaXR5PTAuNF1cbiAgKiBAbWVtYmVyb2YgY29sb3JGdW5jdGlvbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZmlsbE9wYWNpdHkgPSAwLjQsXG4gIC8qKlxuICAqIEhvdyB0byBkZXRlcm1pbmUgdGhlIGNvbG9yIHRvIHVzZVxuICAqIEBwYXJhbSB7c3RyaW5nfSBbY29sb3JCeT0naW5kZXgnXVxuICAqIEBtZW1iZXJvZiBjb2xvckZ1bmN0aW9uI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBjb2xvckJ5ID0gJ2luZGV4JyxcbiAgLyoqXG4gICogU2V0cyB0aGUgc2NhbGUgZm9yIGludGVycG9sYXRpbmcgdGhlIGNvbG9yc1xuICAqIEBwYXJhbSB7bnVtYmVyW119IFtkYXRhRXh0ZW50PVswLCBjb2xvcnMubGVuZ3RoIC0gMV1dXG4gICogQG1lbWJlcm9mIGNvbG9yRnVuY3Rpb24jXG4gICogQHByb3BlcnR5XG4gICovXG4gIGRhdGFFeHRlbnQgPSBbMCwgY29sb3JzLmxlbmd0aCAtIDFdLFxuICAvKipcbiAgKiBFeHRyYWN0cyB0aGUgdmFsdWUgdG8gY29sb3IgYnlcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbdmFsdWVFeHRyYWN0b3I9ZnVuY3Rpb24oaywgdiwgaSkge3JldHVybiB2fV1cbiAgKiBAbWVtYmVyb2YgY29sb3JGdW5jdGlvbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdmFsdWVFeHRyYWN0b3IgPSBmdW5jdGlvbihrLCB2LCBpKSB7cmV0dXJuIHZ9LFxuICAvKipcbiAgKiBTY2FsZSBmb3IgaW50ZXJwb2xhdGluZyB0aGUgY29sb3JzXG4gICogQHBhcmFtIHtkMy5zY2FsZX0gW3NjYWxlPWQzLnNjYWxlTGluZWFyKCldXG4gICogQG1lbWJlcm9mIGNvbG9yRnVuY3Rpb24jXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKVxuICAuaW50ZXJwb2xhdGUoaW50ZXJwb2xhdGlvbikuZG9tYWluKGRhdGFFeHRlbnQpLnJhbmdlKGNvbG9ycyksXG4gIGhlbHBlclNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKVxuXG4gIC8vIHZhciBoID0geCA9PiAnIycgKyB4Lm1hdGNoKC9cXGQrL2cpLm1hcCh5ID0geiA9PiAoKCt6IDwgMTYpPycwJzonJykgKyAoK3opLnRvU3RyaW5nKDE2KSkuam9pbignJyk7XG4gIHZhciBoID0gZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiBcIiNcIiArIHgubWF0Y2goL1xcZCsvZykubWFwKFxuICAgICAgZnVuY3Rpb24oeSwgaSkge1xuICAgICAgICByZXR1cm4gICgoK3kgPCAxNik/JzAnOicnKSArICgreSkudG9TdHJpbmcoMTYpXG4gICAgICB9KS5qb2luKCcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGRlZmF1bHQgY29sb3JzXG4gICAqIChzZWUge0BsaW5rIGNvbG9yRnVuY3Rpb24jY29sb3JzfSlcbiAgICogQHBhcmFtIHtudW1iZXJbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2NvbG9yRnVuY3Rpb24gfCBudW1iZXJbXX1cbiAgICogQG1lbWJlcm9mIGNvbG9yRnVuY3Rpb25cbiAgICogQHByb3BlcnR5XG4gICAqL1xuICBjb2xvckZ1bmN0aW9uLmNvbG9ycyA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgID9cbiAgICAgIChcbiAgICAgICAgY29sb3JzID0gXyxcbiAgICAgICAgc2NhbGUucmFuZ2UoY29sb3JzKSxcbiAgICAgICAgY29sb3JGdW5jdGlvblxuICAgICAgKVxuICAgIDogY29sb3JzO1xuICB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBmdW5jdGlvbiBmb3IgaW50ZXJwb2xhdGluZyB0aGUgY29sb3JzXG4gICAqIChzZWUge0BsaW5rIGNvbG9yRnVuY3Rpb24jaW50ZXJwb2xhdGlvbn0pXG4gICAqIEBwYXJhbSB7ZDMuaW50ZXJwb2xhdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2NvbG9yRnVuY3Rpb24gfCBkMy5pbnRlcnBvbGF0aW9ufVxuICAgKiBAbWVtYmVyb2YgY29sb3JGdW5jdGlvblxuICAgKiBAcHJvcGVydHlcbiAgICovXG4gIGNvbG9yRnVuY3Rpb24uaW50ZXJwb2xhdGlvbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgID9cbiAgICAoXG4gICAgICBpbnRlcnBvbGF0aW9uID0gXyxcbiAgICAgIHNjYWxlLmludGVycG9sYXRlKGludGVycG9sYXRpb24pLnJhbmdlKGNvbG9ycyksXG4gICAgICBjb2xvckZ1bmN0aW9uXG4gICAgKVxuICAgIDogaW50ZXJwb2xhdGlvbjtcbiAgfTtcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgdmFsdWVzIGZvciB0aGUgc2NhbGUgd2hpY2ggdHJhbnNmb3JtcyB0aGUgdmFsdWUgdG8gYSBjb2xvclxuICAgKiAoc2VlIHtAbGluayBjb2xvckZ1bmN0aW9uI2RhdGFFeHRlbnR9KVxuICAgKiBAcGFyYW0ge251bWJlcltdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Y29sb3JGdW5jdGlvbiB8IG51bWJlcltdfVxuICAgKiBAbWVtYmVyb2YgY29sb3JGdW5jdGlvblxuICAgKiBAcHJvcGVydHlcbiAgICovXG4gIGNvbG9yRnVuY3Rpb24uZGF0YUV4dGVudCA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgID8gKFxuICAgICAgICBkYXRhRXh0ZW50ID0gXyxcbiAgICAgICAgc2NhbGUuZG9tYWluKGRhdGFFeHRlbnQpLmludGVycG9sYXRlKHNjYWxlLmludGVycG9sYXRlKCkpLFxuICAgICAgICBjb2xvckZ1bmN0aW9uXG4gICAgICApXG4gICAgOiBkYXRhRXh0ZW50O1xuICB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSB2dGhlIHNjYWxlIHdoaWNoIHRyYW5zZm9ybXMgdGhlIHZhbHVlIHRvIGEgY29sb3JcbiAgICogKHNlZSB7QGxpbmsgY29sb3JGdW5jdGlvbiNzY2FsZX0pXG4gICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtjb2xvckZ1bmN0aW9uIHwgZDMuc2NhbGV9XG4gICAqIEBtZW1iZXJvZiBjb2xvckZ1bmN0aW9uXG4gICAqIEBwcm9wZXJ0eVxuICAgKi9cbiAgY29sb3JGdW5jdGlvbi5zY2FsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgID8gKFxuICAgICAgICBfID0gXy5kb21haW4oc2NhbGUuZG9tYWluKCkpLmludGVycG9sYXRlKHNjYWxlLmludGVycG9sYXRlKCkpLnJhbmdlKHNjYWxlLnJhbmdlKCkpLFxuICAgICAgICBzY2FsZSA9IF8sXG4gICAgICAgIGNvbG9yRnVuY3Rpb25cbiAgICAgIClcbiAgICA6IHNjYWxlO1xuICB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBmdW5jdGlvbiBmb3IgbW9kaWZ5IG9wYWNpdHlcbiAgICogKHNlZSB7QGxpbmsgY29sb3JGdW5jdGlvbiNtb2RpZnlPcGFjaXR5fSlcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2NvbG9yRnVuY3Rpb24gfCBmdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIGNvbG9yRnVuY3Rpb25cbiAgICogQHByb3BlcnR5XG4gICAqL1xuICBjb2xvckZ1bmN0aW9uLm1vZGlmeU9wYWNpdHkgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG1vZGlmeU9wYWNpdHkgPSBfLCBjb2xvckZ1bmN0aW9uKSA6IG1vZGlmeU9wYWNpdHk7IH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHZhbHVlIHRvIG1vZGlmeSB0aGUgY29sb3IgZm9yIHRoZSBzdHJva2UgdmlhIHtAbGluayBjb2xvckZ1bmN0aW9uI21vZGlmeU9wYWNpdHl9XG4gICAqIChzZWUge0BsaW5rIGNvbG9yRnVuY3Rpb24jc3Ryb2tlT3BhY2l0eX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Y29sb3JGdW5jdGlvbiB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGNvbG9yRnVuY3Rpb25cbiAgICogQHByb3BlcnR5XG4gICAqL1xuICBjb2xvckZ1bmN0aW9uLnN0cm9rZU9wYWNpdHkgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN0cm9rZU9wYWNpdHkgPSBfLCBjb2xvckZ1bmN0aW9uKSA6IHN0cm9rZU9wYWNpdHk7IH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHZhbHVlIHRvIG1vZGlmeSB0aGUgY29sb3IgZm9yIHRoZSBzdHJva2UgdmlhIHtAbGluayBjb2xvckZ1bmN0aW9uI2ZpbGxPcGFjaXR5fVxuICAgKiAoc2VlIHtAbGluayBjb2xvckZ1bmN0aW9uI2ZpbGxPcGFjaXR5fSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtjb2xvckZ1bmN0aW9uIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgY29sb3JGdW5jdGlvblxuICAgKiBAcHJvcGVydHlcbiAgICovXG4gIGNvbG9yRnVuY3Rpb24uZmlsbE9wYWNpdHkgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGZpbGxPcGFjaXR5ID0gXywgY29sb3JGdW5jdGlvbikgOiBmaWxsT3BhY2l0eTsgfTtcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgdmFsdWUgdG8gY29sb3JCeVxuICAgKiAoc2VlIHtAbGluayBjb2xvckZ1bmN0aW9uI2NvbG9yQnl9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2NvbG9yRnVuY3Rpb24gfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBjb2xvckZ1bmN0aW9uXG4gICAqIEBwcm9wZXJ0eVxuICAgKi9cbiAgY29sb3JGdW5jdGlvbi5jb2xvckJ5ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjb2xvckJ5ID0gXywgY29sb3JGdW5jdGlvbikgOiBjb2xvckJ5OyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSB2YWx1ZSBvZiB2YWx1ZUV4dHJhY3RvclxuICAgKiAoc2VlIHtAbGluayBjb2xvckZ1bmN0aW9uI3ZhbHVlRXh0cmFjdG9yfSlcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2NvbG9yRnVuY3Rpb24gfCBmdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIGNvbG9yRnVuY3Rpb25cbiAgICogQHByb3BlcnR5XG4gICAqL1xuICBjb2xvckZ1bmN0aW9uLnZhbHVlRXh0cmFjdG9yID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2YWx1ZUV4dHJhY3RvciA9IF8sIGNvbG9yRnVuY3Rpb24pIDogdmFsdWVFeHRyYWN0b3I7IH07XG5cbiAgZnVuY3Rpb24gY29sb3JGdW5jdGlvbihrZXksIHZhbHVlLCBpbmRleCwgdHlwZSwgaG92ZXJRKSB7XG4gICAgdmFyIGMsXG4gICAgb3BhYyA9IHR5cGUgPT0gXCJmaWxsXCIgPyBmaWxsT3BhY2l0eSA6IHN0cm9rZU9wYWNpdHk7XG4gICAgdXBkYXRlU2NhbGUoKVxuXG4gICAgaWYgKGNvbG9yQnkgPT0gXCJpbmRleFwiKSB7XG4gICAgICBjID0gKHR5cGUgIT0gdW5kZWZpbmVkKSA/IG1vZGlmeU9wYWNpdHkoaChzY2FsZShpbmRleCkpLCBvcGFjKSA6IGgoc2NhbGUoaW5kZXgpKVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdiA9IHZhbHVlRXh0cmFjdG9yKGtleSwgdmFsdWUsIGluZGV4KTtcbiAgICAgIGMgPSAodHlwZSAhPSB1bmRlZmluZWQpID8gbW9kaWZ5T3BhY2l0eShoKHNjYWxlKHYpKSwgb3BhYykgOiBoKHNjYWxlKHYpKVxuICAgIH1cbiAgICByZXR1cm4gY1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlU2NhbGUoKXtcbiAgICBoZWxwZXJTY2FsZS5kb21haW4oWzAsIGNvbG9ycy5sZW5ndGhdKS5yYW5nZShkYXRhRXh0ZW50KVxuICAgIHZhciBhID0gQXJyYXkoY29sb3JzLmxlbmd0aCkuZmlsbCgwKS5tYXAoZnVuY3Rpb24oZCwgaSl7IHJldHVybiBoZWxwZXJTY2FsZShpKSB9KVxuICAgIHNjYWxlLmRvbWFpbihhKVxuICB9XG5cbiAgcmV0dXJuIGNvbG9yRnVuY3Rpb25cbn1cbiIsImltcG9ydCB7c2FmZVNlbGVjdCwgcm91bmR9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQge2xvZywgd2FybiwgaW5mbywgZXJyb3IsIGNvbnNvbGVHcm91cCwgY29uc29sZUdyb3VwRW5kfSBmcm9tICcuL3V0aWxzJztcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE9PTFRJUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKipcbiAqIFByb2R1Y2VzIGEgZnVuY3Rpb24gZm9yIGhhbmRsaW5nIHRoZSB0b29sdGlwXG4gKlxuICoge0BsaW5rIGh0dHBzOi8vc3VtbmV1cm9uLmdpdGxhYi5pby9kM3NtL2RlbW9zL3Rvb2x0aXAtZGVzaWduL2luZGV4Lmh0bWwgRGVtb31cbiAqIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBzZWxlY3Rpb25cbiAqIEByZXR1cm5zIHt0b29sdGlwfVxuICogQG5hbWVzcGFjZSB0b29sdGlwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b29sdGlwKCBzZWxlY3Rpb24gKSB7XG5cbiAgdmFyXG4gIGtleXMsXG4gIHZhbHVlcyxcbiAgaGVhZGVyLFxuICBkYXRhLFxuICBzZWxlY3Rpb24sXG4gIHRhcmdldENsYXNzXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBrZXlzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgdG9vbHRpcC5cbiAgICogSWYgbm90IHNldCwgdXNlcyBkMy5rZXlzKGRhdGFba2V5XSlcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Rvb2x0aXAgfCBzdHJpbmdbXX1cbiAgICogQG1lbWJlcm9mIHRvb2x0aXBcbiAgICovXG4gIHRvb2x0aXAua2V5cyA9IGZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGtleXMgPSBfLCB0b29sdGlwKSA6IGtleXN9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHZhbHVlcyB0byBiZSBkaXNwbGF5ZWQgbmV4dCB0byB0aGUga2V5cy5cbiAgICogSWYgbm90IHNldCwgdXNlcyBkYXRhW2tleV1ba2V5c1tpXV0uXG4gICAqIElmIGEgZnVuY3Rpb24sIGdldHMgcGFzc2VkIGN1cnJlbnREYXRhIChkYXRhW2tleV0pIGFuZCBrZXlzW2ldLlxuICAgKiBAcGFyYW0geypbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Rvb2x0aXAgfCAqW119XG4gICAqIEBtZW1iZXJvZiB0b29sdGlwXG4gICAqL1xuICB0b29sdGlwLnZhbHVlcyA9IGZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZhbHVlcyA9IF8sIHRvb2x0aXApIDogdmFsdWVzfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBoZWFkZXIgdG8gYmUgZGlzcGxheWVkIGluIHRoZSB0b29sdGlwLlxuICAgKiBJZiBub3Qgc2V0LCB1c2VzIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge3Rvb2x0aXAgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiB0b29sdGlwXG4gICAqL1xuICB0b29sdGlwLmhlYWRlciA9IGZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGhlYWRlciA9IF8sIHRvb2x0aXApIDogaGVhZGVyfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBkYXRhIChvdmVyIHRoZSBzZWxlY3Rpb24pIHRvIGJlIHVzZWQgZm9yIHRoZSB0b29sdGlwXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dG9vbHRpcCB8IE9iamVjdH1cbiAgICogQG1lbWJlcm9mIHRvb2x0aXBcbiAgICovXG4gIHRvb2x0aXAuZGF0YSA9IGZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRhdGEgPSBfLCB0b29sdGlwKSA6IGRhdGF9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNlbGVjdGlvbiBmb3IgdGhlIHRvb2x0aXAgdG8gYmUgYXBwbGllZCBvblxuICAgKiBAcGFyYW0ge2QzLnNlbGVjdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Rvb2x0aXAgfCBkMy5zZWxlY3Rpb259XG4gICAqIEBtZW1iZXJvZiB0b29sdGlwXG4gICAqL1xuICB0b29sdGlwLnNlbGVjdGlvbiA9IGZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNlbGVjdGlvbiA9IF8sIHRvb2x0aXApIDogc2VsZWN0aW9ufTtcblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdGFyZ2V0Q2xhc3MgZm9yIHRoZSB0b29sdGlwIHRvIGJlIGFwcGxpZWQgb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt0b29sdGlwIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgdG9vbHRpcFxuICAgKi9cbiAgdG9vbHRpcC50YXJnZXRDbGFzcyA9IGZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRhcmdldENsYXNzID0gXywgdG9vbHRpcCkgOiB0YXJnZXRDbGFzc307XG5cblxuICAvKipcbiAgICogQmluZCwgdmlhIHNlbGVjdGlvbi5vbigpLCB0aGUgbW91c2Vtb3ZlIGFuZCBtb3VzZW91dCBldmVudHNcbiAgICogQHJldHVybnMgdW5kZWZpbmVkXG4gICAqL1xuICBmdW5jdGlvbiB0b29sdGlwKCApIHtcbiAgICBzZWxlY3Rpb24ub24oJ21vdXNlb3ZlcicsIG1vdXNlbW92ZSlcbiAgICBzZWxlY3Rpb24ub24oJ21vdXNlbW92ZScsIG1vdXNlbW92ZSlcbiAgICBzZWxlY3Rpb24ub24oJ21vdXNlb3V0JywgZnVuY3Rpb24oKXsgZDMuc2VsZWN0QWxsKFwiLmQzc20tdG9vbHRpcFwiKS5yZW1vdmUoKX0pXG4gIH1cblxuXG4gIC8qKlxuICAgKiBQcm9kdWNlcyB0aGUgdG9vbHRpcCBvbiBtb3VzZW1vdmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBvZiB0aGUgb2JqZWN0IHRhcmdldGVkIGJ5IHRoZSBtb3VzZW1vdmVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGkgKGluZGV4KSBvZiB0aGUgb2JqZWN0IHRhcmdldGVkIGJ5IG1vdXNlbW92ZVxuICAgKiBAbWVtYmVyb2YgdG9vbHRpcFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZnVuY3Rpb24gbW91c2Vtb3ZlKGtleSwgaSkge1xuICAgIGNvbnNvbGVHcm91cCgnZDNzbS10b29sdGlwJylcbiAgICB2YXIgY3VycmVudERhdGEgPSBkYXRhW2tleV1cblxuICAgIHZhciBbeCwgeV0gPSBkMy5tb3VzZShkMy5zZWxlY3QoXCJodG1sXCIpLm5vZGUoKSlcbiAgICBsb2coJ3Rvb2x0aXAnLCAnbW91c2Vtb3ZlIGRldGVjdGVkJyx7a2V5OiBrZXksIGluZGV4OiBpLCB4OngsIHk6eX0pXG4gICAgbG9nKCd0b29sdGlwJywgJ2N1cnJlbnQgZGF0YScsIGN1cnJlbnREYXRhKVxuXG4gICAgdmFyIGRpdiA9IHNhZmVTZWxlY3QoZDMuc2VsZWN0KCdodG1sJyksICd0b29sdGlwJywgJ2Qzc20tdG9vbHRpcCcpXG4gICAgLmNsYXNzZWQoJ2NhcmQnLCB0cnVlKVxuICAgIC5zdHlsZSgnbWF4LXdpZHRoJywgJzMwMHB4JylcbiAgICAuc3R5bGUoJ2JhY2tncm91bmQtY29sb3InLCBcIiMyMTI1MjlcIilcbiAgICAuc3R5bGUoJ2NvbG9yJywgJ3doaXRlJylcblxuXG5cbiAgICB2YXIgY2FyZEJvZHkgPSBzYWZlU2VsZWN0KGRpdiwgJ2RpdicsICdjYXJkLWJvZHknKVxuICAgIHZhciBjYXJkVGl0bGUgPSBzYWZlU2VsZWN0KGNhcmRCb2R5LCAnaDUnLCAnY2FyZC10aXRsZScpXG4gICAgLnRleHQoaGVhZGVyID09IHVuZGVmaW5lZCA/IGtleSA6IHR5cGVvZiBoZWFkZXIgPT0gJ2Z1bmN0aW9uJyA/IGhlYWRlcihrZXksIGkpIDogaGVhZGVyKVxuICAgIC5zdHlsZSgnY29sb3InLCAnY3lhbicpXG5cblxuICAgIHZhciB0YWJsZSA9IHNhZmVTZWxlY3QoY2FyZEJvZHksICd0YWJsZScsICd0YWJsZScpLmNsYXNzZWQoJ3RhYmxlLWRhcmsnLCB0cnVlKVxuICAgIHZhciB0Qm9keSA9IHNhZmVTZWxlY3QodGFibGUsICd0Ym9keScpXG5cbiAgICB0Qm9keSA9IHRCb2R5LnNlbGVjdEFsbCgndHInKVxuICAgIHRCb2R5PSB0Qm9keS5kYXRhKGtleXMgPT0gdW5kZWZpbmVkID8gZDMua2V5cyhjdXJyZW50RGF0YSk6IGtleXMpXG5cblxuXG4gICAgdEJvZHkuZXhpdCgpLnJlbW92ZSgpXG5cbiAgICB2YXIgdHIgPSB0Qm9keS5lbnRlcigpLmFwcGVuZCgndHInKVxuXG4gICAgY29uc29sZUdyb3VwKCd0b29sdGlwLXJvd3MnKVxuICAgIHRyLmVhY2goZnVuY3Rpb24oZCwgaSkge1xuXG4gICAgICBkMy5zZWxlY3QodGhpcykuYXBwZW5kKCd0ZCcpLmF0dHIoJ2NsYXNzJywgJ3Rvb2x0aXAta2V5JykudGV4dChmdW5jdGlvbihkLCBpKXtyZXR1cm4gZH0pXG4gICAgICBkMy5zZWxlY3QodGhpcykuYXBwZW5kKCd0ZCcpLmF0dHIoJ2NsYXNzJywgJ3Rvb2x0aXAtdmFsdWUnKVxuICAgICAgLnRleHQoZnVuY3Rpb24oZCwgaSl7XG4gICAgICAgIGxvZygndG9vbHRpcCcsICd0cnlpbmcgdG8gc2V0IHZhbHVlJywge3Jvd0tleTogZCwgcm93SW5kZXg6IGl9KVxuICAgICAgICB2YXIgdiA9IGN1cnJlbnREYXRhW2RdO1xuICAgICAgICBpZiAodmFsdWVzICE9IHVuZGVmaW5lZCkge3YgPSB2YWx1ZXNbaV07IGlmKHR5cGVvZiB2ID09IFwiZnVuY3Rpb25cIikge3YgPSB2KGN1cnJlbnREYXRhLCBkKX19XG4gICAgICAgIHJldHVybiAgdHlwZW9mIHYgPT0gJ251bWJlcicgPyByb3VuZCh2LCA1KSA6IHZcbiAgICAgIH0pXG4gICAgfSlcbiAgICB0Qm9keSA9IHRCb2R5Lm1lcmdlKHRyKVxuXG4gICAgdEJvZHkuc2VsZWN0QWxsKCcudG9vbHRpcC1rZXknKS50ZXh0KGZ1bmN0aW9uKGQsIGkpe3JldHVybiBkfSlcbiAgICB0Qm9keS5zZWxlY3RBbGwoJy50b29sdGlwLXZhbHVlJykudGV4dChmdW5jdGlvbihkLCBpKXtcbiAgICAgIGxvZygndG9vbHRpcCcsICd0cnlpbmcgdG8gc2V0IHZhbHVlJywge3Jvd0tleTogZCwgcm93SW5kZXg6IGl9KVxuICAgICAgdmFyIHYgPSBjdXJyZW50RGF0YVtkXTtcbiAgICAgIGlmICh2YWx1ZXMgIT0gdW5kZWZpbmVkKSB7diA9IHZhbHVlc1tpXTsgaWYodHlwZW9mIHYgPT0gXCJmdW5jdGlvblwiKSB7diA9IHYoY3VycmVudERhdGEsIGQpfX1cbiAgICAgIHJldHVybiAgdHlwZW9mIHYgPT0gJ251bWJlcicgPyByb3VuZCh2LCA1KSA6IHZcbiAgICB9KVxuXG4gICAgY29uc29sZUdyb3VwRW5kKClcbiAgICBjb25zb2xlR3JvdXBFbmQoKVxuXG4gICAgZGl2LnN0eWxlKCdwb3NpdGlvbicpID09IFwicmVsYXRpdmVcIlxuICAgID8gZGl2LnN0eWxlKCdwb3NpdGlvbicsICdhYnNvbHV0ZScpLnN0eWxlKCdsZWZ0JywgeCsxNSsncHgnKS5zdHlsZSgndG9wJywgeSsncHgnKVxuICAgIDogZGl2LnRyYW5zaXRpb24oKS5kdXJhdGlvbigyMDApLmVhc2UoZDMuZWFzZVNpbikuc3R5bGUoJ2xlZnQnLCB4KzE1KydweCcpLnN0eWxlKCd0b3AnLCB5KydweCcpXG4gIH1cblxuICByZXR1cm4gdG9vbHRpcFxufVxuIiwiaW1wb3J0IHtoeXBlbmF0ZSwgc2FmZVNlbGVjdCwgbW9kaWZ5SGV4aWRlY2ltYWxDb2xvckx1bWluYW5jZSwgZXh0cmFjdFZpb2xpblZhbHVlcywgcXVhcnRpbGVzfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHtzZXR1cENvbnRhaW5lciwgY2FsY3VsYXRlV2lkdGhPZk9iamVjdCwgY2FsY3VsYXRlV2lkdGhPZlNwYWNlcn0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge3VuaXF1ZSwgaGFzUSwgZmxhdHRlbiwgd2hpY2hCaW59IGZyb20gJy4vYXJyYXktZnVuY3Rpb25zJztcbmltcG9ydCB7Z3JvdXBpbmdTcGFjZXJ9IGZyb20gJy4vZ3JvdXBpbmctc3BhY2VyJztcbmltcG9ydCB7Y29sb3JGdW5jdGlvbiBhcyBDRn0gZnJvbSAnLi9jb2xvci1mdW5jdGlvbic7XG5pbXBvcnQge3Rvb2x0aXAgYXMgVFRpcH0gZnJvbSAnLi90b29sdGlwJztcblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWSU9MSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgdmlvbGluXG4gKlxuICoge0BsaW5rIGh0dHBzOi8vc3VtbmV1cm9uLmdpdGxhYi5pby9kM3NtL2RlbW9zL2Jhc2ljLXZpb2xpbnMvaW5kZXguaHRtbCBEZW1vfVxuICogQGNvbnN0cnVjdG9yIHZpb2xpblxuICogQHBhcmFtIHtkMy5zZWxlY3Rpb259IHNlbGVjdGlvblxuICogQG5hbWVzcGFjZSB2aW9saW5cbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gdmlvbGluXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2aW9saW4oIHNlbGVjdGlvbiApIHtcbiAgdmFyXG4gIC8qKlxuICAqIERhdGEgdG8gcGxvdC4gQXNzdW1lZCB0byBiZSBhIG9iamVjdCwgd2hlcmUgZWFjaCBrZXkgY29ycmVzcG9uZHMgdG8gYSB2aW9saW5cbiAgKiAoc2VlIHtAbGluayB2aW9saW4jZGF0YX0pXG4gICogQHBhcmFtIHtPYmplY3R9IFtkYXRhPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgdmlvbGluI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBkYXRhLFxuICAvKipcbiAgKiBXaGljaCBkaXJlY3Rpb24gdG8gcmVuZGVyIHRoZSBiYXJzIGluXG4gICogKHNlZSB7QGxpbmsgdmlvbGluI29yaWVudH0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtvcmllbnQ9J2hvcml6b250YWwnXVxuICAqIEBtZW1iZXJvZiB2aW9saW4jXG4gICogQHByb3BlcnR5XG4gICovXG4gIG9yaWVudD0naG9yaXpvbnRhbCcsXG4gIC8qKlxuICAqIEFtb3VudCBvZiBob3Jpem9udGFsIHNwYWNlIChpbiBwaXhlbHMpIGF2YWlibGUgdG8gcmVuZGVyIHRoZSB2aW9saW4gaW5cbiAgKiAoc2VlIHtAbGluayB2aW9saW4jc3BhY2VYfSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW3NwYWNlWD11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIHZpb2xpbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc3BhY2VYLFxuICAvKipcbiAgKiBBbW91bnQgb2YgdmVydGljYWwgc3BhY2UgKGluIHBpeGVscykgYXZhaWJsZSB0byByZW5kZXIgdGhlIHZpb2xpbiBpblxuICAqIChzZWUge0BsaW5rIHZpb2xpbi5zcGFjZVl9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbc3BhY2VZPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgdmlvbGluI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzcGFjZVksXG4gIC8qKlxuICAqIFdoZXRoZXIgb3Igbm90IHRvIGFsbG93IHZpb2xpbiB0byByZW5kZXIgZWxlbWVudHMgcGFzcyB0aGUgbWFpbiBzcGF0aWFsIGRpbWVuc2lvblxuICAqIGdpdmVuIHRoZSBvcmllbnRhdGlvbiAoc2VlIHtAbGluayB2aW9saW4jb3JpZW50fSksIHdoZXJlIHtAbGluayB2aW9saW4jb3JpZW50fT1cImhvcml6b250YWxcIlxuICAqIHRoZSBtYWluIGRpbWVuc2lvbiBpcyB7QGxpbmsgdmlvbGluI3NwYWNlWH0gYW5kIHdoZXJlIHtAbGluayB2aW9saW4jb3JpZW50fT1cInZlcnRpY2FsXCJcbiAgKiB0aGUgbWFpbiBkaW1lbnNpb24gaXMge0BsaW5rIHZpb2xpbiNzcGFjZVl9XG4gICogQHBhcmFtIHtib29sZWFufSBbb3ZlcmZsb3dRPWZhbHNlXVxuICAqIEBtZW1iZXJvZiB2aW9saW4jXG4gICogQHByb3BlcnR5XG4gICovXG4gIG92ZXJmbG93USA9IHRydWUsXG4gIC8qKlxuICAqIFdoZXRoZXIgb3Igbm90IHRvIGRpc3BsYXkgcG9pbnRzIGluc2lkZSB0aGUgcG9pbnRzXG4gICogQHBhcmFtIHtib29sZWFufSBbcG9pbnRzUT1mYWxzZV1cbiAgKiBAbWVtYmVyb2YgdmlvbGluI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBwb2ludHNRID0gdHJ1ZSxcbiAgLyoqXG4gICogQW4gYXJyYXkgLSBwdXRhdGl2ZWx5IG9mIG90aGVyIGFycmF5cyAtIGRlcGljdGluZyBob3cgYmFycyBzaG91bGQgYmUgYXJyYW5nZWRcbiAgKiBAcGFyYW0ge0FycmF5W119IFtncm91cGluZz11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIHZpb2xpbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZ3JvdXBpbmcsXG4gIC8qKlxuICAqIEhvdyB0byBnZXQgdGhlIHZhbHVlIG9mIHRoZSB2aW9saW5cbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbdmFsdWVFeHRyYWN0b3I9ZnVuY3Rpb24oa2V5LCBpbmRleCkgeyByZXR1cm4gZGF0YVtrZXldIH1dXG4gICogQG1lbWJlcm9mIHZpb2xpbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdmFsdWVFeHRyYWN0b3IgPSBmdW5jdGlvbihrZXksIGluZGV4KSB7cmV0dXJuIGRhdGFba2V5XSB9LFxuICAvKipcbiAgKiBIb3cgdG8gc29ydCB0aGUgYmFycyAtIGlmIHtAbGluayB2aW9saW4jZ3JvdXBpbmd9IGlzIG5vdCBwcm92aWRlZC5cbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbc29ydGluZ0Z1bmN0aW9uPWZ1bmN0aW9uKGtleUEsIGtleUIpIHtyZXR1cm4gZDMuZGVzY2VuZGluZyhkYXRhW2tleUFdLCBkYXRhW2tleUJdKX1dXG4gICogQG1lbWJlcm9mIHZpb2xpbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc29ydGluZ0Z1bmN0aW9uID0gZnVuY3Rpb24oa2V5QSwga2V5Qikge3JldHVybiBkMy5kZXNjZW5kaW5nKGRhdGFba2V5QV0sIGRhdGFba2V5Ql0pfSxcblxuICAvKipcbiAgKiBUaGUgc2NhbGUgZm9yIHdoaWNoIHZpb2xpbiB2YWx1ZXMgc2hvdWxkIGJlIHRyYW5zZm9ybWVkIGJ5XG4gICogQHBhcmFtIHtkMy5zY2FsZX0gW3NjYWxlPWQzLnNjYWxlTGluZWFyXVxuICAqIEBtZW1iZXJvZiB2aW9saW4jXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKSxcbiAgLyoqXG4gICogVGhlIHBhZGRpbmcgZm9yIHRoZSBkb21haW4gb2YgdGhlIHNjYWxlIChzZWUge0BsaW5rIHZpb2xpbiNzY2FsZX0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtkb21haW5QYWRkaW5nPTAuNV1cbiAgKiBAbWVtYmVyb2YgdmlvbGluI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBkb21haW5QYWRkaW5nID0gMC41LFxuICAvKipcbiAgKiBEZWZhdWx0IHNwYWNlIGZvciB0aGUgc3BhY2VyIChwZXJjZW50YWdlKSBvZiBtYWluIGRpbWVuc2lvbiBnaXZlbiB0aGUgb3JpZW50YXRpb25cbiAgKiAoc2VlIHtAbGluayB2aW9saW4jb3JpZW50fSksIHdoZXJlIHtAbGluayB2aW9saW4jb3JpZW50fT1cImhvcml6b250YWxcIlxuICAqIHRoZSBtYWluIGRpbWVuc2lvbiBpcyB7QGxpbmsgdmlvbGluI3NwYWNlWH0gYW5kIHdoZXJlIHtAbGluayB2aW9saW4jb3JpZW50fT1cInZlcnRpY2FsXCJcbiAgKiB0aGUgbWFpbiBkaW1lbnNpb24gaXMge0BsaW5rIHZpb2xpbiNzcGFjZVl9IGJldHdlZW4gYmFyc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbb2JqZWN0U3BhY2VyPTAuMDVdXG4gICogQG1lbWJlcm9mIHZpb2xpbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb2JqZWN0U3BhY2VyID0gMC4wNSxcbiAgLyoqXG4gICogVGhlIG1pbmltdW0gc2l6ZSB0aGF0IGFuIG9iamVjdCBjYW4gYmVcbiAgKiBAcGFyYW0ge251bWJlcn0gW21pbk9iamVjdFNpemU9NTBdXG4gICogQG1lbWJlcm9mIHZpb2xpbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgbWluT2JqZWN0U2l6ZSA9IDUwLFxuICAvKipcbiAgKiBUaGUgbWF4aW11bSBzaXplIHRoYXQgYW4gb2JqZWN0IGNhbiBiZVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4T2JqZWN0U2l6ZT0xMDBdXG4gICogQG1lbWJlcm9mIHZpb2xpbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgbWF4T2JqZWN0U2l6ZSA9IDEwMCxcblxuICAvKipcbiAgKiBUaGUgc3Ryb2tlIHdpZHRoIG9mIHRoZSBiYXJzXG4gICogQHBhcmFtIHtudW1iZXJ9IFtiYXJTdHJva2VXaWR0aD0yXVxuICAqIEBtZW1iZXJvZiB2aW9saW4jXG4gICogQHByb3BlcnR5XG4gICovXG4gIG9iamVjdFN0cm9rZVdpZHRoID0gMixcbiAgLyoqXG4gICogSW5zdGFuY2Ugb2YgQ29sb3JGdW5jdGlvblxuICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtjb2xvckZ1bmN0aW9uID0gY29sb3JGdW5jdGlvbigpXVxuICAqIEBtZW1iZXJvZiB2aW9saW4jXG4gICogQHByb3BlcnR5XG4gICovXG4gIGNvbG9yRnVuY3Rpb24gPSBDRigpLFxuICAvKipcbiAgKiBJbnN0YW5jZSBvZiBDb2xvckZ1bmN0aW9uIG1vZGlmaWVkIGJ5IGEgc2NhbGUgZm9yIHRoZSBwb2ludHNcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbcG9pbnRDb2xvckZ1bmMgPSBjb2xvckZ1bmN0aW9uKCldXG4gICogQG1lbWJlcm9mIHZpb2xpbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgcG9pbnRDb2xvckZ1bmMgPSBmdW5jdGlvbiAoZCwgdHlwZSwgYmFzZSwgbWluLCBtYXgpIHtcbiAgICB2YXIgbWluTWF4SGV4U2NhbGUgPSBkMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbbWF4LCBtaW5dKS5yYW5nZShbLTAuMjUsIDAuMjVdKVxuICAgIHZhciBzY2FsZWRDb2xvciA9IG1vZGlmeUhleGlkZWNpbWFsQ29sb3JMdW1pbmFuY2UoYmFzZS5yZXBsYWNlKCcjJywgJycpLCBtaW5NYXhIZXhTY2FsZShkKSlcbiAgICB2YXIgbW9kID0gdHlwZSA9PSBcInN0cm9rZVwiID8gMCA6IDAuMjVcbiAgICByZXR1cm4gbW9kaWZ5SGV4aWRlY2ltYWxDb2xvckx1bWluYW5jZShzY2FsZWRDb2xvci5yZXBsYWNlKCcjJywgJycpLCBtb2QpXG4gIH0sXG5cbiAgLyoqXG4gICogVGhlIHJhZGl1cyBvZiBhIHBvaW50XG4gICogQHBhcmFtIHtudW1iZXJ9IFtwb2ludFJhZGl1cz0zXVxuICAqIEBtZW1iZXJvZiB2aW9saW4jXG4gICogQHByb3BlcnR5XG4gICovXG4gIHBvaW50UmFkaXVzID0gMyxcbiAgLyoqXG4gICogVGhlIHN0cm9rZSB3aWR0aCBvZiB0aGUgb2ludHNcbiAgKiBAcGFyYW0ge251bWJlcn0gW3BvaW50U3Ryb2tlV2lkdGg9Ml1cbiAgKiBAbWVtYmVyb2YgdmlvbGluI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBwb2ludFN0cm9rZVdpZHRoID0gMixcblxuICAvKipcbiAgKiBDb2xvciBvZiB0aGUgYmFja2dyb3VuZFxuICAqIEBwYXJhbSB7c3RyaW5nfSBbYmFja2dyb3VuZEZpbGw9XCJ0cmFuc3BhcmVudFwiXVxuICAqIEBtZW1iZXJvZiB2aW9saW4jXG4gICogQHByb3BlcnR5XG4gICovXG4gIGJhY2tncm91bmRGaWxsID0gJ3RyYW5zcGFyZW50JyxcbiAgLyoqXG4gICogTmFtZXNwYWNlIGZvciBhbGwgaXRlbXMgbWFkZSBieSB0aGlzIGluc3RhbmNlIG9mIHZpb2xpblxuICAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZXNwYWNlPVwiZDNzbS12aW9saW5cIl1cbiAgKiBAbWVtYmVyb2YgdmlvbGluI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBuYW1lc3BhY2UgPSAnZDNzbS12aW9saW4nLFxuICAvKipcbiAgKiBDbGFzcyBuYW1lIGZvciB2aW9saW4gY29udGFpbmVyICg8Zz4gZWxlbWVudClcbiAgKiBAcGFyYW0ge3N0cmluZ30gW29iamVjdENsYXNzPVwidmlvbGluXCJdXG4gICogQG1lbWJlcm9mIHZpb2xpbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb2JqZWN0Q2xhc3MgPSAndmlvbGluJyxcbiAgLyoqXG4gICogRHVyYXRpb24gb2YgYWxsIHRyYW5zaXRpb25zIG9mIHRoaXMgZWxlbWVudFxuICAqIEBwYXJhbSB7bnVtYmVyfSBbdHJhbnNpdGlvbkR1cmF0aW9uPTEwMDBdXG4gICogQG1lbWJlcm9mIHZpb2xpbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdHJhbnNpdGlvbkR1cmF0aW9uID0gMTAwMCxcbiAgLyoqXG4gICogRWFzaW5nIGZ1bmN0aW9uIGZvciB0cmFuc2l0aW9uc1xuICAqIEBwYXJhbSB7ZDMuZWFzZX0gW2Vhc2VGdW5jPWQzLmVhc2VFeHBdXG4gICogQG1lbWJlcm9mIHZpb2xpbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZWFzZUZ1bmMgPSBkMy5lYXNlRXhwLFxuXG4gIC8qKlxuICAqIFRoZSBrZXkgY29udGFpbmluZyB0aGUgcXVhcnRpbGVzXG4gICogQHBhcmFtIHtzdHJpbmd9IFtxdWFydGlsZXNLZXk9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiB2aW9saW4jXG4gICogQHByb3BlcnR5XG4gICovXG4gIHF1YXJ0aWxlc0tleSA9IFwicXVhcnRpbGVzXCIsXG4gIC8qKlxuICAqIFRoZSBrZXlzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBxdWFydGlsZVxuICAqIEBwYXJhbSB7c3RyaW5nW119IFtxdWFydGlsZUtleXM9W1wiUTBcIiwgXCJRMVwiLCBcIlEyXCIsIFwiUTNcIiwgXCJRNFwiXV1cbiAgKiBAbWVtYmVyb2YgdmlvbGluI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBxdWFydGlsZUtleXMgPSBbXCJRMFwiLCBcIlExXCIsIFwiUTJcIiwgXCJRM1wiLCBcIlE0XCJdLFxuXG4gIC8qKlxuICAqIFRoZSBrZXlzIG9mIHRoZSBiYXJzXG4gICogQHBhcmFtIHtzdHJpbmdbXX0gW3Zpb2xpbktleXM9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiB2aW9saW4jXG4gICogQHByb3BlcnR5XG4gICovXG4gIHZpb2xpbktleXMsXG4gIC8qKlxuICAqIFRoZSB2YWx1ZXMgb2YgdGhlIGJhcnNcbiAgKiBAcGFyYW0ge251bWJlcltdfSBbdmlvbGluVmFsdWVzPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgdmlvbGluI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB2aW9saW5WYWx1ZXMsXG4gIC8qKlxuICAqIFRoZSBvYmplY3RTaXplIChhY3R1YWwgd2lkdGgpIHVzZWQgYnkgdGhlIGJhcnNcbiAgKiBAcGFyYW0ge251bWJlcn0gW29iamVjdFNpemU9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiB2aW9saW4jXG4gICogQHByb3BlcnR5XG4gICovXG4gIG9iamVjdFNpemUsXG4gIC8qKlxuICAqIFRoZSBzcGFjZXJTaXplIChhY3R1YWwgd2lkdGgpIHVzZWQgYnkgdGhlIHNwYWNlcnMgYmV0d2VlbiB0aGUgYmFyc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbc3BhY2VyU2l6ZT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIHZpb2xpbiNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc3BhY2VyU2l6ZSxcblxuICAvKipcbiAgKiBJbnN0YW5jZSBvZiBUb29sdGlwXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW3Rvb2x0aXA9dG9vbHRpcCgpXVxuICAqIEBtZW1iZXJvZiB2aW9saW4jXG4gICogQHByb3BlcnR5XG4gICovXG4gIHRvb2x0aXAgPSBUVGlwKCkua2V5cyhbcXVhcnRpbGVLZXlzWzRdLCBxdWFydGlsZUtleXNbM10sIHF1YXJ0aWxlS2V5c1syXSwgcXVhcnRpbGVLZXlzWzFdLCBxdWFydGlsZUtleXNbMF1dKSxcbiAgcG9pbnRzVG9vbHRpcCA9IFRUaXAoKSxcbiAgcG9pbnRLZXlFeHRyYWN0b3IgPSBmdW5jdGlvbih2aW9saW5LZXksIHZpb2xpbkRhdGEsIHZpb2xpblZhbHVlcykge3JldHVybiBkMy5rZXlzKHZpb2xpblZhbHVlc1t2aW9saW5LZXldLnZhbHVlcyl9LFxuICBwb2ludFZhbHVlRXh0cmFjdG9yID0gZnVuY3Rpb24ocG9pbnRLZXksIHZpb2xpbktleSwgdmlvbGluRGF0YSwgdmlvbGluVmFsdWVzKSB7cmV0dXJuIHZpb2xpblZhbHVlc1t2aW9saW5LZXldLnZhbHVlc1twb2ludEtleV19XG5cbiAgLy8sXG4gIC8vIHBvaW50c1Rvb2x0aXAgPSBUVGlwKClcblxuXG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHNlbGVjdGlvbiBpbiB3aGljaCBpdGVtcyBhcmUgbWFuaXB1bGF0ZWRcbiAgICogQHBhcmFtIHtkMy5zZWxlY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBkMy5zZWxlY3Rpb259XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc2VsZWN0aW9uID0gc2VsZWN0aW9uXG4gICAqL1xuICB2aW9saW4uc2VsZWN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzZWxlY3Rpb24gPSBfLCB2aW9saW4pIDogc2VsZWN0aW9uOyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBkYXRhXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNkYXRhfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBvYmplY3R9XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqL1xuICB2aW9saW4uZGF0YSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZGF0YSA9IF8sIHZpb2xpbikgOiBkYXRhOyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBvcmllbnQgb2YgdGhlIGJveGVzXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNvcmllbnR9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IG9iamVjdH1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICovXG4gIHZpb2xpbi5vcmllbnQgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9yaWVudCA9IF8sIHZpb2xpbikgOiBvcmllbnQ7IH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGFtb3VudCBvZiBob3Jpem9udGFsIHNwYWNlIGluIHdoaWNoIGl0ZW1zIGFyZSBtYW5pcHVsYXRlZFxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jc3BhY2VYfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdIHNob3VsZCBiZSBhIG51bWJlciA+IDBcbiAgICogQHJldHVybnMge3Zpb2xpbiB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzcGFjZVggPSB1bmRlZmluZWRcbiAgICovXG4gIHZpb2xpbi5zcGFjZVggPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNwYWNlWCA9IF8sIHZpb2xpbikgOiBzcGFjZVg7IH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGFtb3VudCBvZiB2ZXJ0aWNhbCBzcGFjZSBpbiB3aGljaCBpdGVtcyBhcmUgbWFuaXB1bGF0ZWRcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI3NwYWNlWX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXSBzaG91bGQgYmUgYSBudW1iZXIgPiAwXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc3BhY2VZID0gdW5kZWZpbmVkXG4gICAqL1xuICB2aW9saW4uc3BhY2VZID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzcGFjZVkgPSBfLCB2aW9saW4pIDogc3BhY2VZOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHdoZXRoZXIgb3Igbm90IHZpb2xpbiBpcyBhbGxvd2VkIHRvIGdvIGJleW9uZCBzcGVjaWZpZWQgZGltZW5zaW9uc1xuICAgKiAoc2VlIHtAbGluayB2aW9saW4jb3ZlcmZsb3dRfSlcbiAgICogQHBhcmFtIHtib29sZWFufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgYm9vbGVhbn1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvdmVyZmxvd1EgPSBmYWxzZVxuICAgKi9cbiAgdmlvbGluLm92ZXJmbG93USA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob3ZlcmZsb3dRID0gXywgdmlvbGluKSA6IG92ZXJmbG93UTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHdoZXRoZXIgb3Igbm90IHRvIHBsb3QgcG9pbnRzIHdpdGggdGhlIHZpb2xpbnNcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI3BvaW50c1F9KVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBib29sZWFufVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHBvaW50c1EgPSBmYWxzZVxuICAgKi9cbiAgdmlvbGluLnBvaW50c1EgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBvaW50c1EgPSBfLCB2aW9saW4pIDogcG9pbnRzUTsgfTtcblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgZ3JvdXBpbmcgb2YgdGhlIGJveGVzXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNncm91cGluZ30pXG4gICAqIEBwYXJhbSB7QXJyYXlbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IEFycmF5W119XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgZ3JvdXBpbmcgPSB1bmRlZmluZWRcbiAgICovXG4gIHZpb2xpbi5ncm91cGluZyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZ3JvdXBpbmcgPSBfLCB2aW9saW4pIDogZ3JvdXBpbmc7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdmFsdWVFeHRyYWN0b3JcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI3ZhbHVlRXh0cmFjdG9yfSlcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IGZ1bmN0aW9ufVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKi9cbiAgdmlvbGluLnZhbHVlRXh0cmFjdG9yID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2YWx1ZUV4dHJhY3RvciA9IF8sIHZpb2xpbikgOiB2YWx1ZUV4dHJhY3RvcjsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBzb3J0aW5nRnVuY3Rpb25cbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI3NvcnRpbmdGdW5jdGlvbn0pXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBmdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICovXG4gIHZpb2xpbi5zb3J0aW5nRnVuY3Rpb24gPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNvcnRpbmdGdW5jdGlvbiA9IF8sIHZpb2xpbikgOiBzb3J0aW5nRnVuY3Rpb247IH07XG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBzY2FsZSBmb3Igd2hpY2ggdGhlIHZpb2xpbiB2YWx1ZXMgc2hvdWxkIGJlIHRyYW5zZm9ybWVkIGJ5XG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNzY2FsZX0pXG4gICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBkMy5zY2FsZX1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzY2FsZSA9IGQzLnNjYWxlTGluZWFyKClcbiAgICovXG4gIHZpb2xpbi5zY2FsZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2NhbGUgPSBfLCB2aW9saW4pIDogc2NhbGU7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgcGFkZGluZyBmb3IgdGhlIGRvbWFpbiBvZiB0aGUgc2NhbGVcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI2RvbWFpblBhZGRpbmd9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBkb21haW5QYWRkaW5nID0gMC41XG4gICAqL1xuICB2aW9saW4uZG9tYWluUGFkZGluZyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluUGFkZGluZyA9IF8sIHZpb2xpbikgOiBkb21haW5QYWRkaW5nOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIG9iamVjdFNwYWNlclxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jb2JqZWN0U3BhY2VyfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgb2JqZWN0U3BhY2VyID0gMC4wNVxuICAgKi9cbiAgdmlvbGluLm9iamVjdFNwYWNlciA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob2JqZWN0U3BhY2VyID0gXywgdmlvbGluKSA6IG9iamVjdFNwYWNlcjsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBtaW5PYmplY3RTaXplXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNtaW5PYmplY3RTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgbWluT2JqZWN0U2l6ZSA9IDE1XG4gICAqL1xuICB2aW9saW4ubWluT2JqZWN0U2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobWluT2JqZWN0U2l6ZSA9IF8sIHZpb2xpbikgOiBtaW5PYmplY3RTaXplOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG1heE9iamVjdFNpemVcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI21heE9iamVjdFNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBtYXhPYmplY3RTaXplID0gNTBcbiAgICovXG4gIHZpb2xpbi5tYXhPYmplY3RTaXplID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChtYXhPYmplY3RTaXplID0gXywgdmlvbGluKSA6IG1heE9iamVjdFNpemU7IH07XG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBvYmplY3RTdHJva2VXaWR0aFxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jb2JqZWN0U3Ryb2tlV2lkdGh9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvYmplY3RTdHJva2VXaWR0aCA9IDJcbiAgICovXG4gIHZpb2xpbi5vYmplY3RTdHJva2VXaWR0aCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob2JqZWN0U3Ryb2tlV2lkdGggPSBfLCB2aW9saW4pIDogb2JqZWN0U3Ryb2tlV2lkdGg7IH07XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGNvbG9yRnVuY3Rpb25cbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI2NvbG9yRnVuY3Rpb259KVxuICAgKiBAcGFyYW0ge2NvbG9yRnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBjb2xvckZ1bmN0aW9ufVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGNvbG9yRnVuY3Rpb24gPSBjb2xvckZ1bmN0aW9uKClcbiAgICovXG4gIHZpb2xpbi5jb2xvckZ1bmN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjb2xvckZ1bmN0aW9uID0gXywgdmlvbGluKSA6IGNvbG9yRnVuY3Rpb247IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgY29sb3JGdW5jdGlvblxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jY29sb3JGdW5jdGlvbn0pXG4gICAqIEBwYXJhbSB7Y29sb3JGdW5jdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IGNvbG9yRnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgY29sb3JGdW5jdGlvbiA9IGNvbG9yRnVuY3Rpb24oKVxuICAgKi9cbiAgdmlvbGluLnBvaW50Q29sb3JGdW5jID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwb2ludENvbG9yRnVuYyA9IF8sIHZpb2xpbikgOiBwb2ludENvbG9yRnVuYzsgfTtcblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgcG9pbnRSYWRpdXNcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI3BvaW50UmFkaXVzfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgcG9pbnRSYWRpdXMgPSAyXG4gICAqL1xuICB2aW9saW4ucG9pbnRSYWRpdXMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBvaW50UmFkaXVzID0gXywgdmlvbGluKSA6IHBvaW50UmFkaXVzOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHBvaW50U3Ryb2tlV2lkdGhcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI3BvaW50U3Ryb2tlV2lkdGh9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBwb2ludFN0cm9rZVdpZHRoID0gMlxuICAgKi9cbiAgdmlvbGluLnBvaW50U3Ryb2tlV2lkdGggPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBvaW50U3Ryb2tlV2lkdGggPSBfLCB2aW9saW4pIDogcG9pbnRTdHJva2VXaWR0aDsgfTtcblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgYmFja2dyb3VuZEZpbGxcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI2JhY2tncm91bmRGaWxsfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgYmFja2dyb3VuZEZpbGwgPSAndHJhbnNwYXJlbnQnXG4gICAqL1xuICB2aW9saW4uYmFja2dyb3VuZEZpbGwgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGJhY2tncm91bmRGaWxsID0gXywgdmlvbGluKSA6IGJhY2tncm91bmRGaWxsOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG5hbWVzcGFjZVxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jbmFtZXNwYWNlfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt2aW9saW4gfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgbmFtZXNwYWNlID0gJ2Qzc20tdmlvbGluJ1xuICAgKi9cbiAgdmlvbGluLm5hbWVzcGFjZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobmFtZXNwYWNlID0gXywgdmlvbGluKSA6IG5hbWVzcGFjZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBvYmplY3RDbGFzc1xuICAgKiAoc2VlIHtAbGluayB2aW9saW4jb2JqZWN0Q2xhc3N9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvYmplY3RDbGFzcyA9ICd0aWNrLWdyb3VwJ1xuICAgKi9cbiAgdmlvbGluLm9iamVjdENsYXNzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvYmplY3RDbGFzcyA9IF8sIHZpb2xpbikgOiBvYmplY3RDbGFzczsgfTtcblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdHJhbnNpdGlvbkR1cmF0aW9uXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiN0cmFuc2l0aW9uRHVyYXRpb259KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0cmFuc2l0aW9uRHVyYXRpb24gPSAxMDAwXG4gICAqL1xuICB2aW9saW4udHJhbnNpdGlvbkR1cmF0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0cmFuc2l0aW9uRHVyYXRpb24gPSBfLCB2aW9saW4pIDogdHJhbnNpdGlvbkR1cmF0aW9uOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGVhc2VGdW5jXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNlYXNlRnVuY30pXG4gICAqIEBwYXJhbSB7ZDMuZWFzZX0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IGQzLmVhc2V9XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgZWFzZUZ1bmMgPSBkMy5lYXNlRXhwXG4gICAqL1xuICB2aW9saW4uZWFzZUZ1bmMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGVhc2VGdW5jID0gXywgdmlvbGluKSA6IGVhc2VGdW5jOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBxdWFydGlsZUtleVxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jcXVhcnRpbGVLZXl9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIHZpb2xpblxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBxdWFydGlsZUtleSA9IFwicXVhcnRpbGVzXCJcbiAgICovXG4gIHZpb2xpbi5xdWFydGlsZUtleSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocXVhcnRpbGVLZXkgPSBfLCB2aW9saW4pIDogcXVhcnRpbGVLZXk7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgcXVhcnRpbGVLZXlzXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNxdWFydGlsZUtleXN9KVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgc3RyaW5nW119XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgcXVhcnRpbGVLZXlzID0gW1wiUTBcIixcIlExXCIsXCJRMlwiLFwiUTNcIixcIlE0XCJdXG4gICAqL1xuICB2aW9saW4ucXVhcnRpbGVLZXlzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChxdWFydGlsZUtleXMgPSBfLCB2aW9saW4pIDogcXVhcnRpbGVLZXlzOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB2aW9saW5LZXlzXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiN2aW9saW5LZXlzfSlcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IHN0cmluZ1tdfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHZpb2xpbktleXMgPSB1bmRlZmluZWRcbiAgICovXG4gIHZpb2xpbi52aW9saW5LZXlzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2aW9saW5LZXlzID0gXywgdmlvbGluKSA6IHZpb2xpbktleXM7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdmlvbGluVmFsdWVzXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiN2aW9saW5WYWx1ZXN9KVxuICAgKiBAcGFyYW0ge09iamVjdFtdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgT2JqZWN0W119XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdmlvbGluVmFsdWVzID0gdW5kZWZpbmVkXG4gICAqL1xuICB2aW9saW4udmlvbGluVmFsdWVzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2aW9saW5WYWx1ZXMgPSBfLCB2aW9saW4pIDogdmlvbGluVmFsdWVzOyB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgb2JqZWN0U2l6ZVxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jb2JqZWN0U2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG9iamVjdFNpemUgPSB1bmRlZmluZWRcbiAgICovXG4gIHZpb2xpbi5vYmplY3RTaXplID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvYmplY3RTaXplID0gXywgdmlvbGluKSA6IG9iamVjdFNpemU7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgc3BhY2VyU2l6ZVxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jc3BhY2VyU2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7dmlvbGluIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgdmlvbGluXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNwYWNlclNpemUgPSB1bmRlZmluZWRcbiAgICovXG4gIHZpb2xpbi5zcGFjZXJTaXplID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzcGFjZXJTaXplID0gXywgdmlvbGluKSA6IHNwYWNlclNpemU7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdG9vbHRpcFxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jdG9vbHRpcH0pXG4gICAqIEBwYXJhbSB7dG9vbHRpcH0gW189bm9uZV1cbiAgICogQHJldHVybnMge3Zpb2xpbiB8IHRvb2x0aXB9XG4gICAqIEBtZW1iZXJvZiB2aW9saW5cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdG9vbHRpcCA9IHRvb2x0aXAoKVxuICAgKi9cbiAgdmlvbGluLnRvb2x0aXAgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRvb2x0aXAgPSBfLCB2aW9saW4pIDogdG9vbHRpcDsgfTtcbiAgLy8gdmlvbGluLnBvaW50c1Rvb2x0aXAgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBvaW50c1Rvb2x0aXAgPSBfLCB2aW9saW4pIDogcG9pbnRzVG9vbHRpcDsgfTtcblxuICBmdW5jdGlvbiB2aW9saW4gKCkge1xuICAgIC8vIGZvciBjb252ZW5pZW5jZSBpbiBoYW5kbGluZyBvcmllbnRhdGlvbiBzcGVjaWZpYyB2YWx1ZXNcbiAgICB2YXIgaG9yaXpvbnRhbFEgPSAob3JpZW50ID09ICdob3Jpem9udGFsJykgPyB0cnVlIDogZmFsc2VcbiAgICB2YXIgdmVydGljYWxRID0gIWhvcml6b250YWxRXG5cbiAgICAvLyBiYWNrZ3JvdW5kIGNsaXBpbmcgcmVjdGFuZ2xlXG4gICAgdmFyIGJnY3BSZWN0ID0ge3g6MCwgeTowLCB3aWR0aDogc3BhY2VYLCBoZWlnaHQ6c3BhY2VZfVxuICAgIHZhciBjb250YWluZXIgPSBzZXR1cENvbnRhaW5lciggc2VsZWN0aW9uLCBuYW1lc3BhY2UsIGJnY3BSZWN0LCBiYWNrZ3JvdW5kRmlsbCApO1xuXG4gICAgLy8gaWYgZ3JvdXBpbmcgaXMgdW5kZWZpbmVkIHNvcnQgdmlvbGluS2V5cyBieSBzb3J0aW5nRnVuY3Rpb25cbiAgICB2YXIgb3JkZXJlZCA9IChncm91cGluZyA9PSB1bmRlZmluZWQpID8gZDMua2V5cyhkYXRhKS5zb3J0KHNvcnRpbmdGdW5jdGlvbikgOiBncm91cGluZ1xuXG4gICAgLy8gY29uc29sZS5sb2cob3JkZXJlZClcblxuICAgIHZpb2xpbktleXMgPSBmbGF0dGVuKG9yZGVyZWQpXG5cbiAgICB2YXIgY2FsY1ZhbHVlcyA9IG5lZWRlZFZpb2xpblZhbHVlcygpXG4gICAgLmhvcml6b250YWxRKGhvcml6b250YWxRKVxuICAgIC5xdWFydGlsZUtleXMocXVhcnRpbGVLZXlzKVxuICAgIC52aW9saW5Qb2ludHNFeHRyYWN0b3IodmlvbGluUG9pbnRzRXh0cmFjdG9yKVxuICAgIC52aW9saW5Qb2ludFZhbHVlRXh0cmFjdG9yKHZpb2xpblBvaW50VmFsdWVFeHRyYWN0b3IpXG5cbiAgICAvLyBhdWdtZW50IHZhbHVzXG4gICAgdmlvbGluS2V5cy5tYXAoZnVuY3Rpb24odmssIGkpeyBjYWxjVmFsdWVzKHZrLCBkYXRhKSB9KVxuXG4gICAgLy8gdmlvbGluVmFsdWVzID0gZXh0cmFjdFZpb2xpblZhbHVlcyh2aW9saW5LZXlzLCBkYXRhLCB2YWx1ZUV4dHJhY3RvciwgaG9yaXpvbnRhbFEsIHF1YXJ0aWxlc0tleSwgcXVhcnRpbGVLZXlzKVxuXG4gICAgdmFyIG51bWJlck9mT2JqZWN0cyA9IHZpb2xpbktleXMubGVuZ3RoXG5cblxuICAgIHZhciBtaW4gPSBbXS5jb25jYXQoLi4udmlvbGluS2V5cy5tYXAoZnVuY3Rpb24oaywgaSl7cmV0dXJuIGRhdGFba10ucXVhcnRpbGVzW3F1YXJ0aWxlS2V5c1swXV19KSlcbiAgICB2YXIgbWF4ID0gW10uY29uY2F0KC4uLnZpb2xpbktleXMubWFwKGZ1bmN0aW9uKGssIGkpe3JldHVybiBkYXRhW2tdLnF1YXJ0aWxlc1txdWFydGlsZUtleXNbcXVhcnRpbGVLZXlzLmxlbmd0aCAtIDFdXX0pKVxuICAgIHZhciBleHRlbnQgPSBbTWF0aC5taW4oLi4ubWluKSAtIGRvbWFpblBhZGRpbmcsIE1hdGgubWF4KC4uLm1heCkgKyBkb21haW5QYWRkaW5nXVxuICAgIC8vIGNvbnNvbGUubG9nKGV4dGVudCwgdmlvbGluVmFsdWVzLCBvcmRlcmVkKVxuXG4gICAgLy8gc2V0IHRoZSBzY2FsZVxuICAgIHNjYWxlLmRvbWFpbihleHRlbnQpLnJhbmdlKGhvcml6b250YWxRID8gWzAsc3BhY2VZXSA6IFswLCBzcGFjZVhdKVxuICAgIHZhciBzcGFjZSA9IGhvcml6b250YWxRID8gc3BhY2VYIDogc3BhY2VZXG4gICAgLy8gY2FsY3VsYXRlIG9iamVjdCBzaXplXG4gICAgb2JqZWN0U2l6ZSA9IGNhbGN1bGF0ZVdpZHRoT2ZPYmplY3Qoc3BhY2UsIG51bWJlck9mT2JqZWN0cywgbWluT2JqZWN0U2l6ZSwgbWF4T2JqZWN0U2l6ZSwgb2JqZWN0U3BhY2VyLCBvdmVyZmxvd1EpXG4gICAgLy8gY2FsY3VsYXRlIHNwYWNlciBzaXplIGlmIG5lZWRlZFxuICAgIHNwYWNlclNpemUgPSBjYWxjdWxhdGVXaWR0aE9mU3BhY2VyKG9yZGVyZWQsIHNwYWNlLCBvYmplY3RTaXplLCBudW1iZXJPZk9iamVjdHMsIG9iamVjdFNwYWNlciwgb3ZlcmZsb3dRKVxuICAgIC8vIG1ha2UgdGhlIG5lc3RlZCBncm91cHNcbiAgICB2YXIgc3BhY2VyRnVuY3Rpb24gPSBncm91cGluZ1NwYWNlcigpXG4gICAgLmhvcml6b250YWxRKGhvcml6b250YWxRKS5zY2FsZShzY2FsZSkubW92ZWJ5KCdjYXRlZ29yeScpLm51bWJlck9mT2JqZWN0cyhudW1iZXJPZk9iamVjdHMpXG4gICAgLm9iamVjdENsYXNzKG9iamVjdENsYXNzKS5vYmplY3RTaXplKG9iamVjdFNpemUpLnNwYWNlclNpemUoc3BhY2VyU2l6ZSlcbiAgICAudHJhbnNpdGlvbkR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuZWFzZUZ1bmMoZWFzZUZ1bmMpXG4gICAgLm5hbWVzcGFjZShuYW1lc3BhY2UpXG5cbiAgICAvLyBtb3ZlIHN0dWZmXG4gICAgc3BhY2VyRnVuY3Rpb24oY29udGFpbmVyLCBvcmRlcmVkLCAwKVxuICAgIC8vIGNvbnNvbGUubG9nKHZpb2xpbktleXMsIG9yZGVyZWQsIGNvbnRhaW5lci5zZWxlY3RBbGwoJ2c6bm90KC50by1yZW1vdmUpLicrb2JqZWN0Q2xhc3MpLm5vZGVzKCkpXG5cbiAgICAvLyBmb3IgY29sb3IgZnVuY3Rpb25cbiAgICB2YXIgcGFyZW50SW5kZXhBcnJheSA9IFtdXG4gICAgY29udGFpbmVyLnNlbGVjdEFsbCgnZzpub3QoLnRvLXJlbW92ZSkuJytvYmplY3RDbGFzcylcbiAgICAuZWFjaChmdW5jdGlvbihkLCBpKXtpZiAoaGFzUSh2aW9saW5LZXlzLCBkKSl7IHBhcmVudEluZGV4QXJyYXkucHVzaChOdW1iZXIoZDMuc2VsZWN0KHRoaXMpLmF0dHIoJ3BhcmVudC1pbmRleCcpKSl9fSlcblxuICAgIC8vIHVwZGF0ZSBjb2xvciBmdW5jdGlvblxuICAgIGNvbG9yRnVuY3Rpb24gPSBjb2xvckZ1bmN0aW9uLmNvbG9yQnkoKSA9PSAnaW5kZXgnXG4gICAgPyBjb2xvckZ1bmN0aW9uLmRhdGFFeHRlbnQoWzAsIE1hdGgubWF4KC4uLnBhcmVudEluZGV4QXJyYXkpXSlcbiAgICA6IGNvbG9yRnVuY3Rpb24uZGF0YUV4dGVudChleHRlbnQpXG5cbiAgICAvKiB2aW9saWluIHNwZWNpZmljIG5lZWRzICovXG5cblxuICAgIHZhciBmcmVxdWVuY3lNYXggPSBNYXRoLm1heCguLi5bXS5jb25jYXQoLi4udmlvbGluS2V5cy5tYXAoZnVuY3Rpb24oaywgaSl7cmV0dXJuIGQzLm1heChkYXRhW2tdLmZyZXF1ZW5jaWVzKX0pKSlcbiAgICB2YXIgdlNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oWzAsIGZyZXF1ZW5jeU1heF0pLnJhbmdlKFswLCBvYmplY3RTaXplIC8gMl0pXG5cbiAgICB2YXIgbEFyZWEgPSBkMy5saW5lKClcbiAgICAueChmdW5jdGlvbihkLCBpKXsgcmV0dXJuIGhvcml6b250YWxRID8gLXZTY2FsZShkLngpIDogc2NhbGUoZC54KX0pXG4gICAgLnkoZnVuY3Rpb24oZCwgaSl7IHJldHVybiBob3Jpem9udGFsUSA/IHNjYWxlKGV4dGVudFsxXSkgLSBzY2FsZShkLnkpIDogLXZTY2FsZShkLnkpfSlcbiAgICAuY3VydmUoZDMuY3VydmVCYXNpcylcbiAgICB2YXIgckFyZWEgPSBkMy5saW5lKClcbiAgICAueChmdW5jdGlvbihkLCBpKXsgcmV0dXJuIGhvcml6b250YWxRID8gdlNjYWxlKGQueCkgOiBzY2FsZShkLngpfSlcbiAgICAueShmdW5jdGlvbihkLCBpKXsgcmV0dXJuIGhvcml6b250YWxRID8gc2NhbGUoZXh0ZW50WzFdKSAtIHNjYWxlKGQueSkgOiB2U2NhbGUoZC55KX0pXG4gICAgLmN1cnZlKGQzLmN1cnZlQmFzaXMpXG5cblxuXG5cblxuXG4gICAgY29udGFpbmVyLnNlbGVjdEFsbCgnZzpub3QoLnRvLXJlbW92ZSkuJytvYmplY3RDbGFzcykuZWFjaChmdW5jdGlvbihrZXksIGkpe1xuICAgICAgdmFyIHQgPSBkMy5zZWxlY3QodGhpcyksXG4gICAgICBjdXJyZW50RGF0YSA9IGRhdGFba2V5XVxuICAgICAgLy8gbmVlZGVkIGJlY2F1c2UgYnVnIGluIHNlbGVjdGluZyAudG8tcmVtb3ZlXG4gICAgICBpZiAoIWhhc1EodmlvbGluS2V5cywga2V5KSkge3JldHVybn1cbiAgICAgIHZhclxuICAgICAgaSA9IHQuYXR0cigncGFyZW50LWluZGV4JykgPT0gdW5kZWZpbmVkID8gaSA6IHQuYXR0cigncGFyZW50LWluZGV4JyksXG4gICAgICBmaWxsQ29sb3IgPSBjb2xvckZ1bmN0aW9uKGtleSwgY3VycmVudERhdGEsIGksICdmaWxsJyksIC8vIHByZXZlbnQgZHVwbGljYXRlIGNvbXB1dGF0aW9uXG4gICAgICBzdHJva2VDb2xvciA9IGNvbG9yRnVuY3Rpb24oa2V5LCBjdXJyZW50RGF0YSwgaSwgJ3N0cm9rZScpLFxuICAgICAgYXJlYSA9IHNhZmVTZWxlY3QodCwgJ2cnLCAnYXJlYScpLFxuICAgICAgbGEgPSBzYWZlU2VsZWN0KGFyZWEsICdwYXRoJywgJ2xlZnQnKSxcbiAgICAgIHJhID0gc2FmZVNlbGVjdChhcmVhLCAncGF0aCcsICdyaWdodCcpLFxuICAgICAgcXVhcnRzID0gc2FmZVNlbGVjdCh0LCAnZycsICdxdWFydHMnKSxcbiAgICAgIGxxMyA9IHNhZmVTZWxlY3QocXVhcnRzLCAnbGluZScsICdxMycpLFxuICAgICAgbHExID0gc2FmZVNlbGVjdChxdWFydHMsICdsaW5lJywgJ3ExJyksXG4gICAgICBxMyA9IGN1cnJlbnREYXRhLnF1YXJ0aWxlc1txdWFydGlsZUtleXNbM11dLFxuICAgICAgcTIgPSBjdXJyZW50RGF0YS5xdWFydGlsZXNbcXVhcnRpbGVLZXlzWzJdXSxcbiAgICAgIHExID0gY3VycmVudERhdGEucXVhcnRpbGVzW3F1YXJ0aWxlS2V5c1sxXV1cblxuICAgICAgdC5hdHRyKCd0cmFuc2Zvcm0nLCBob3Jpem9udGFsUSA/ICd0cmFuc2xhdGUoJytvYmplY3RTaXplIC8gMisnLDApJyA6ICd0cmFuc2xhdGUoMCwnK29iamVjdFNpemUgLyAyKycpJyAgKVxuICAgICAgLy8gZHJhdyBjdXJ2ZVxuICAgICAgbGEudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuYXR0cignZCcsIGZ1bmN0aW9uKGRkLCBpaSl7IHJldHVybiBsQXJlYShjdXJyZW50RGF0YS5jb250b3VyKX0pXG4gICAgICAuYXR0cignZmlsbCcsIGZpbGxDb2xvcilcbiAgICAgIC5hdHRyKCdzdHJva2UnLCBzdHJva2VDb2xvcilcbiAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCBvYmplY3RTdHJva2VXaWR0aClcblxuICAgICAgcmEudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuYXR0cignZCcsIGZ1bmN0aW9uKGRkLCBpaSl7IHJldHVybiByQXJlYShjdXJyZW50RGF0YS5jb250b3VyKX0pXG4gICAgICAuYXR0cignZmlsbCcsIGZpbGxDb2xvcilcbiAgICAgIC5hdHRyKCdzdHJva2UnLCBzdHJva2VDb2xvcilcbiAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCBvYmplY3RTdHJva2VXaWR0aClcblxuICAgICAgYXJlYS5ub2RlKCkuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgZnVuY3Rpb24oZGQsIGlpKXtcbiAgICAgICAgY29udGFpbmVyLnNlbGVjdEFsbCgnZy4nK29iamVjdENsYXNzKS5zdHlsZSgnb3BhY2l0eScsIDAuMilcbiAgICAgICAgdC5zdHlsZSgnb3BhY2l0eScsIDEpXG4gICAgICAgIGxhLmF0dHIoJ3N0cm9rZS13aWR0aCcsb2JqZWN0U3Ryb2tlV2lkdGgqMilcbiAgICAgICAgcmEuYXR0cignc3Ryb2tlLXdpZHRoJyxvYmplY3RTdHJva2VXaWR0aCoyKVxuICAgICAgfSlcbiAgICAgIGFyZWEubm9kZSgpLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgZnVuY3Rpb24oZGQsIGlpKXtcbiAgICAgICAgY29udGFpbmVyLnNlbGVjdEFsbCgnZy4nK29iamVjdENsYXNzKS5zdHlsZSgnb3BhY2l0eScsIDEpXG4gICAgICAgIGxhLmF0dHIoJ3N0cm9rZS13aWR0aCcsb2JqZWN0U3Ryb2tlV2lkdGgpXG4gICAgICAgIHJhLmF0dHIoJ3N0cm9rZS13aWR0aCcsb2JqZWN0U3Ryb2tlV2lkdGgpXG4gICAgICB9KVxuXG4gICAgICBpZiAocG9pbnRzUSkge1xuICAgICAgICB2YXIgcHRzQ29udGFpbmVyID0gc2FmZVNlbGVjdCh0LCAnZycsICdwb2ludHMnKVxuICAgICAgICB2YXIgcHRzID0gcHRzQ29udGFpbmVyLnNlbGVjdEFsbCgnLnBvaW50JykuZGF0YShjdXJyZW50RGF0YS5wb2ludEtleXMpXG4gICAgICAgIHB0cy5vbignbW91c2VvdmVyJywgbnVsbClcblxuXG4gICAgICAgIHZhciBwdHNFeGl0ID0gcHRzLmV4aXQoKS50cmFuc2l0aW9uKCkuZWFzZShlYXNlRnVuYykuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKVxuICAgICAgICAuYXR0cigncicsIDApXG4gICAgICAgIC5hdHRyKCdjeScsIGhvcml6b250YWxRID8gc2NhbGUoZXh0ZW50WzFdKSAtIHNjYWxlKHEyKSA6IHZTY2FsZSgwKSlcbiAgICAgICAgLmF0dHIoJ2N4JywgaG9yaXpvbnRhbFEgPyB2U2NhbGUoMCkgOiBzY2FsZShxMikpLnJlbW92ZSgpXG5cbiAgICAgICAgdmFyIHB0c0VudGVyID0gcHRzLmVudGVyKCkuYXBwZW5kKCdjaXJjbGUnKS5hdHRyKCdjbGFzcycsICdwb2ludCcpLmF0dHIoJ3InLCAwKVxuICAgICAgICAuYXR0cignY3gnLCBob3Jpem9udGFsUSA/IDAgOiBzY2FsZShxMikpXG4gICAgICAgIC5hdHRyKCdjeScsIGhvcml6b250YWxRID8gc2NhbGUocTIpIDogMClcblxuICAgICAgICBwdHMgPSBwdHMubWVyZ2UocHRzRW50ZXIpXG5cbiAgICAgICAgdmFyIHBUVGlwcyA9IFRUaXAoKS5zZWxlY3Rpb24ocHRzKS5kYXRhKHZpb2xpblBvaW50c0V4dHJhY3RvcihrZXksIGN1cnJlbnREYXRhKSlcbiAgICAgICAgKClcblxuXG5cbiAgICAgICAgcHRzLnRyYW5zaXRpb24oKS5kdXJhdGlvbih0cmFuc2l0aW9uRHVyYXRpb24pLmVhc2UoZWFzZUZ1bmMpLmF0dHIoJ3InLCBwb2ludFJhZGl1cylcbiAgICAgICAgLmF0dHIoJ2N5JywgZnVuY3Rpb24ocG9pbnRLZXksIGlpKXtcbiAgICAgICAgICB2YXIgZGQgPSBjdXJyZW50RGF0YS5wb2ludFZhbHVlc1tpaV1cbiAgICAgICAgICBpZiAoaG9yaXpvbnRhbFEpIHsgcmV0dXJuIHNjYWxlKGV4dGVudFsxXSkgLSBzY2FsZShkZCkgfVxuICAgICAgICAgIHZhciBqID0gd2hpY2hCaW4oY3VycmVudERhdGEuYmlubmVkLCBkZClcbiAgICAgICAgICB2YXIgciA9IE1hdGgucmFuZG9tKClcbiAgICAgICAgICB2YXIgbiA9IHZTY2FsZShyICogY3VycmVudERhdGEuZnJlcXVlbmNpZXNbal0gKiAwLjUpXG4gICAgICAgICAgdmFyIGsgPSBNYXRoLnJhbmRvbSgpID4gMC41ID8gbiA6IC1uXG4gICAgICAgICAgcmV0dXJuIGtcbiAgICAgICAgfSlcbiAgICAgICAgLmF0dHIoJ2N4JywgZnVuY3Rpb24ocG9pbnRLZXksIGlpKXtcbiAgICAgICAgICB2YXIgZGQgPSBjdXJyZW50RGF0YS5wb2ludFZhbHVlc1tpaV1cbiAgICAgICAgICBpZiAoaG9yaXpvbnRhbFEpIHtcbiAgICAgICAgICAgIHZhciBqID0gd2hpY2hCaW4oY3VycmVudERhdGEuYmlubmVkLCBkZClcbiAgICAgICAgICAgIHZhciByID0gTWF0aC5yYW5kb20oKVxuICAgICAgICAgICAgdmFyIG4gPSB2U2NhbGUociAqIGN1cnJlbnREYXRhLmZyZXF1ZW5jaWVzW2pdICogMC41KVxuICAgICAgICAgICAgdmFyIGsgPSBNYXRoLnJhbmRvbSgpID4gMC41ID8gbiA6IC1uXG4gICAgICAgICAgICByZXR1cm4ga1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gc2NhbGUoZGQpXG4gICAgICAgIH0pXG4gICAgICAgIC5hdHRyKCdzdHJva2UnLCBmdW5jdGlvbihkZCwgaWkpIHsgdmFyIGRkID0gY3VycmVudERhdGEucG9pbnRWYWx1ZXNbaWldO3JldHVybiBwb2ludENvbG9yRnVuYyhkZCwgJ3N0cm9rZScsIHN0cm9rZUNvbG9yLCBtaW4sIG1heCkgfSlcbiAgICAgICAgLmF0dHIoJ2ZpbGwnICAsIGZ1bmN0aW9uKGRkLCBpaSkgeyB2YXIgZGQgPSBjdXJyZW50RGF0YS5wb2ludFZhbHVlc1tpaV07cmV0dXJuIHBvaW50Q29sb3JGdW5jKGRkLCAnZmlsbCcgICwgc3Ryb2tlQ29sb3IsIG1pbiwgbWF4KSB9KVxuICAgICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgcG9pbnRTdHJva2VXaWR0aClcblxuICAgICAgICBwdHNDb250YWluZXIuc2VsZWN0QWxsKCdjaXJjbGUucG9pbnQnKS5vbignbW91c2VvdmVyJywgZnVuY3Rpb24oZGQsIGlpKXtcbiAgICAgICAgICBjb250YWluZXIuc2VsZWN0QWxsKCdnLicrb2JqZWN0Q2xhc3MpLnN0eWxlKCdvcGFjaXR5JywgMC4yKVxuICAgICAgICAgIHQuc3R5bGUoJ29wYWNpdHknLCAxKVxuICAgICAgICAgIGxhLmF0dHIoJ3N0cm9rZS13aWR0aCcsb2JqZWN0U3Ryb2tlV2lkdGgqMilcbiAgICAgICAgICByYS5hdHRyKCdzdHJva2Utd2lkdGgnLG9iamVjdFN0cm9rZVdpZHRoKjIpXG5cbiAgICAgICAgICBjb250YWluZXIuc2VsZWN0QWxsKCcucG9pbnQnKS5zdHlsZSgnb3BhY2l0eScsIDAuMilcbiAgICAgICAgICBkMy5zZWxlY3QodGhpcykuc3R5bGUoJ29wYWNpdHknLCAxKS5hdHRyKCdyJywgcG9pbnRSYWRpdXMgKiAyKS5hdHRyKCdzdHJva2Utd2lkdGgnLHBvaW50U3Ryb2tlV2lkdGgqMilcbiAgICAgICAgfSlcbiAgICAgICAgcHRzQ29udGFpbmVyLnNlbGVjdEFsbCgnY2lyY2xlLnBvaW50Jykub24oJ21vdXNlb3V0JywgZnVuY3Rpb24oZGQsIGlpKXtcbiAgICAgICAgICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdTVkdFdmVudHMnKVxuICAgICAgICAgIGUuaW5pdEV2ZW50KCdtb3VzZW91dCcsdHJ1ZSx0cnVlKTtcbiAgICAgICAgICBhcmVhLm5vZGUoKS5kaXNwYXRjaEV2ZW50KGUpXG5cbiAgICAgICAgICBjb250YWluZXIuc2VsZWN0QWxsKCcucG9pbnQnKS5zdHlsZSgnb3BhY2l0eScsIDEpXG4gICAgICAgICAgZDMuc2VsZWN0KHRoaXMpLmF0dHIoJ3N0cm9rZS13aWR0aCcsIHBvaW50U3Ryb2tlV2lkdGgpLmF0dHIoJ3InLCBwb2ludFJhZGl1cylcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjVi5zZWxlY3RBbGwoJy5wb2ludCcpXG4gICAgICAgIC50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlKGVhc2VGdW5jKVxuICAgICAgICAuYXR0cigncicsIDApXG4gICAgICAgIC5hdHRyKCdjeScsIGhvcml6b250YWxRID8gc2NhbGUoZXh0ZW50WzFdKSAtIHNjYWxlKHEyKSA6IHZTY2FsZSgwKSlcbiAgICAgICAgLmF0dHIoJ2N4JywgaG9yaXpvbnRhbFEgPyB2U2NhbGUoMCkgOiBzY2FsZShxMikpXG4gICAgICAgIC5yZW1vdmUoKVxuICAgICAgfVxuXG5cbiAgICB9KVxuXG5cbiAgICAvLyB2YXIgdmFsdWVzID0ge307XG4gICAgLy8gcG9pbnRLZXlFeHRyYWN0b3Ioa2V5LCBjdXJyZW50RGF0YSwgdmlvbGluVmFsdWVzKS5tYXAoZnVuY3Rpb24oaywgaSl7XG4gICAgLy8gICB2YWx1ZXNba10gPSBwb2ludFZhbHVlRXh0cmFjdG9yKGssIGtleSwgY3VycmVudERhdGEsIHZpb2xpblZhbHVlcylcbiAgICAvLyB9KVxuICAgIC8vXG4gICAgLy8gY29uc29sZS50YWJsZSh2YWx1ZXMpXG4gICAgLy9cbiAgICAvLyAuZGF0YShkYXRhKVxuICAgIC8vIC5rZXlzKFsnVmFsdWUnXSlcbiAgICAvLyAudmFsdWVzKFtmdW5jdGlvbihjZCwga2V5KXtyZXR1cm4gY2QgfV0pXG4gICAgLy8gcG9pbnRzVG9vbHRpcCgpXG5cblxuICAgIHRvb2x0aXAuc2VsZWN0aW9uKGNvbnRhaW5lci5zZWxlY3RBbGwoJ2c6bm90KC50by1yZW1vdmUpLicrb2JqZWN0Q2xhc3MgKyAnIC5hcmVhJykpXG4gICAgaWYgKHRvb2x0aXAuZGF0YSgpID09IHVuZGVmaW5lZCkge3Rvb2x0aXAuZGF0YShkYXRhKX1cbiAgICB0b29sdGlwKClcbiAgICB0b29sdGlwLnZhbHVlcyhbXG4gICAgICBmdW5jdGlvbihjdXJyZW50RGF0YSwgdG9vbHRpcEtleSl7IHJldHVybiBjdXJyZW50RGF0YVsncXVhcnRpbGVzJ11bdG9vbHRpcEtleV0gfSxcbiAgICAgIGZ1bmN0aW9uKGN1cnJlbnREYXRhLCB0b29sdGlwS2V5KXsgcmV0dXJuIGN1cnJlbnREYXRhWydxdWFydGlsZXMnXVt0b29sdGlwS2V5XSB9LFxuICAgICAgZnVuY3Rpb24oY3VycmVudERhdGEsIHRvb2x0aXBLZXkpeyByZXR1cm4gY3VycmVudERhdGFbJ3F1YXJ0aWxlcyddW3Rvb2x0aXBLZXldIH0sXG4gICAgICBmdW5jdGlvbihjdXJyZW50RGF0YSwgdG9vbHRpcEtleSl7IHJldHVybiBjdXJyZW50RGF0YVsncXVhcnRpbGVzJ11bdG9vbHRpcEtleV0gfSxcbiAgICAgIGZ1bmN0aW9uKGN1cnJlbnREYXRhLCB0b29sdGlwS2V5KXsgcmV0dXJuIGN1cnJlbnREYXRhWydxdWFydGlsZXMnXVt0b29sdGlwS2V5XSB9XG4gICAgXSlcblxuICB9XG5cbiAgcmV0dXJuIHZpb2xpblxufVxuXG5cblxuXG5mdW5jdGlvbiB2aW9saW5Qb2ludHNFeHRyYWN0b3IodmlvbGluS2V5LCB2aW9saW5EYXRhKSB7IHJldHVybiB2aW9saW5EYXRhLnBvaW50cyB9XG5mdW5jdGlvbiB2aW9saW5Qb2ludFZhbHVlRXh0cmFjdG9yKHZpb2xpblBvaW50S2V5LCB2aW9saW5Qb2ludERhdGEpIHsgcmV0dXJuIHZpb2xpblBvaW50RGF0YVt2aW9saW5Qb2ludEtleV0udmFsdWUgfVxuLyoqXG4qIFByb2R1Y2VzIHRoZSBmdW5jdGlvbiB3aGljaCBtYW5pcHVsYXRlcyB0aGUgdmlvbGluIGRhdGEgdG8gaGF2ZSB2YWx1ZXMgbmVlZGVkXG4qIGZvciByZW5kZXJpbmcgdGhlIHZpb2xpbnMgYXMgc3ZnLlxuKiBAcmV0dXJucyB7ZnVuY3Rpb259IGNhbGN1bGF0ZVZpb2xpblZhbHVlc1xuKiBAbmFtZXNwYWNlIG5lZWRlZFZpb2xpblZhbHVlc1xuKi9cbmZ1bmN0aW9uIG5lZWRlZFZpb2xpblZhbHVlcygpIHtcbiAgdmFyXG4gIC8qKlxuICAqIFdoZXRoZXIgb3Igbm90IHRoZSBvcmllbnRhdGlvbiBvZiB0aGUgdmlvbGlucyBhcmUgaG9yaXpvbnRhbFxuICAqIChzZWUge0BsaW5rIHZpb2xpbiNvcmllbnR9KVxuICAqIEBwYXJhbSB7T2JqZWN0fSBbaG9yaXpvbnRhbFE9dHJ1ZV1cbiAgKiBAbWVtYmVyb2YgbmVlZGVkVmlvbGluVmFsdWVzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBob3Jpem9udGFsUSA9IHRydWUsXG4gIC8qKlxuICAqIEtleXMgdG8gYmUgcHV0IGludG8gdGhlIHF1YXJ0aWxlcyBpZiB0aGV5IG5lZWQgdG8gYmUgY2FsY3VsYXRlZC5cbiAgKiAoc2VlIHtAbGluayB2aW9saW4jcXVhcnRpbGVLZXlzfSlcbiAgKiBAcGFyYW0ge09iamVjdH0gW3F1YXJ0aWxlS2V5cz1bJ1EwJywgJ1ExJywgJ1EyJywgJ1EzJywgJ1E0J11dXG4gICogQG1lbWJlcm9mIG5lZWRlZFZpb2xpblZhbHVlcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgcXVhcnRpbGVLZXlzID0gWydRMCcsICdRMScsICdRMicsICdRMycsICdRNCddLFxuICAvKipcbiAgKiBGdW5jdGlvbiB3aGljaCBnaXZlbiB0aGUga2V5IG9mIHRoZSB2aW9saW4gYW5kIHRoYXQga2V5J3MgYXNzb2NpYXRlZCB2YWx1ZVxuICAqIHJldHVybnMgdGhlIG9iamVjdCBjb25zaXRpbmcgb2YgdGhlIHBvaW50cyBvZiB0aGUgdmlvbGluXG4gICogKHNlZSB7QGxpbmsgdmlvbGluI3Zpb2xpblBvaW50c0V4dHJhY3Rvcn0pXG4gICogQHBhcmFtIHtPYmplY3R9IFt2aW9saW5Qb2ludHNFeHRyYWN0b3I9ZnVuY3Rpb24odmlvbGluS2V5LCB2aW9saW5EYXRhKSB7IHJldHVybiB2aW9saW5EYXRhLnBvaW50cyB9XVxuICAqIEBtZW1iZXJvZiBuZWVkZWRWaW9saW5WYWx1ZXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHZpb2xpblBvaW50c0V4dHJhY3RvcixcbiAgLyoqXG4gICogRnVuY3Rpb24gd2hpY2ggZ2l2ZW4gdGhlIGtleSBvZiB0aGUgY3VycmVudCBwb2ludCBhbmQgdGhlIG9iamVjdCBvZiBwb2ludHMgZm9yIHRoZVxuICAqIHZpb2xpbiwgcmV0dXJucyB0aGUgbnVtZXJpY2FsIHZhbHVlIG9mIHRoZSBwb2ludFxuICAqIChzZWUge0BsaW5rIHZpb2xpbiN2aW9saW5Qb2ludFZhbHVlRXh0cmFjdG9yfSlcbiAgKiBAcGFyYW0ge09iamVjdH0gW3Zpb2xpblBvaW50VmFsdWVFeHRyYWN0b3I9ZnVuY3Rpb24odmlvbGluUG9pbnRLZXksIHZpb2xpblBvaW50RGF0YSkgeyByZXR1cm4gdmlvbGluUG9pbnREYXRhW3Zpb2xpblBvaW50S2V5XS52YWx1ZSB9XVxuICAqIEBtZW1iZXJvZiBuZWVkZWRWaW9saW5WYWx1ZXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHZpb2xpblBvaW50VmFsdWVFeHRyYWN0b3JcblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgaG9yaXpvbnRhbFFcbiAgICogKHNlZSB7QGxpbmsgdmlvbGluI29yaWVudH0pXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2NhbGN1bGF0ZVZpb2xpblZhbHVlcyB8IGJvb2xlYW59XG4gICAqIEBtZW1iZXJvZiBjYWxjdWxhdGVWaW9saW5WYWx1ZXNcbiAgICogQHByb3BlcnR5XG4gICAqXG4gICAqIGJ5IGRlZmF1bHQgaG9yaXpvbnRhbFEgPSB0cnVlXG4gICAqL1xuICBjYWxjdWxhdGVWaW9saW5WYWx1ZXMuaG9yaXpvbnRhbFEgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGhvcml6b250YWxRPV8sIGNhbGN1bGF0ZVZpb2xpblZhbHVlcykgOiBob3Jpem9udGFsUSB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgcXVhcnRpbGVLZXlzXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiNxdWFydGlsZUtleXN9KVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Y2FsY3VsYXRlVmlvbGluVmFsdWVzIHwgc3RyaW5nW119XG4gICAqIEBtZW1iZXJvZiBjYWxjdWxhdGVWaW9saW5WYWx1ZXNcbiAgICogQHByb3BlcnR5XG4gICAqXG4gICAqIGJ5IGRlZmF1bHQgcXVhcnRpbGVLZXlzID0gW1wiUTBcIixcIlExXCIsXCJRMlwiLFwiUTNcIixcIlE0XCJdXG4gICAqL1xuICBjYWxjdWxhdGVWaW9saW5WYWx1ZXMucXVhcnRpbGVLZXlzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChxdWFydGlsZUtleXM9XywgY2FsY3VsYXRlVmlvbGluVmFsdWVzKSA6IHF1YXJ0aWxlS2V5cyB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdmlvbGluUG9pbnRzRXh0cmFjdG9yXG4gICAqIChzZWUge0BsaW5rIHZpb2xpbiN2aW9saW5Qb2ludHNFeHRyYWN0b3J9KVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Y2FsY3VsYXRlVmlvbGluVmFsdWVzIHwgZnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiBjYWxjdWxhdGVWaW9saW5WYWx1ZXNcbiAgICogQHByb3BlcnR5XG4gICAqXG4gICAqIGJ5IGRlZmF1bHQgdmlvbGluUG9pbnRzRXh0cmFjdG9yID0gZnVuY3Rpb24odmlvbGluS2V5LCB2aW9saW5EYXRhKSB7IHJldHVybiB2aW9saW5EYXRhLnBvaW50cyB9XG4gICAqL1xuICBjYWxjdWxhdGVWaW9saW5WYWx1ZXMudmlvbGluUG9pbnRzRXh0cmFjdG9yID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2aW9saW5Qb2ludHNFeHRyYWN0b3I9XywgY2FsY3VsYXRlVmlvbGluVmFsdWVzKSA6IHZpb2xpblBvaW50c0V4dHJhY3RvciB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdmlvbGluUG9pbnRWYWx1ZUV4dHJhY3RvclxuICAgKiAoc2VlIHtAbGluayB2aW9saW4jdmlvbGluUG9pbnRWYWx1ZUV4dHJhY3Rvcn0pXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtjYWxjdWxhdGVWaW9saW5WYWx1ZXMgfCBmdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIGNhbGN1bGF0ZVZpb2xpblZhbHVlc1xuICAgKiBAcHJvcGVydHlcbiAgICpcbiAgICogYnkgZGVmYXVsdCB2aW9saW5Qb2ludFZhbHVlRXh0cmFjdG9yID0gZnVuY3Rpb24odmlvbGluUG9pbnRLZXksIHZpb2xpblBvaW50RGF0YSkgeyByZXR1cm4gdmlvbGluUG9pbnREYXRhW3Zpb2xpblBvaW50S2V5XS52YWx1ZSB9XG4gICAqL1xuICBjYWxjdWxhdGVWaW9saW5WYWx1ZXMudmlvbGluUG9pbnRWYWx1ZUV4dHJhY3RvciA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmlvbGluUG9pbnRWYWx1ZUV4dHJhY3Rvcj1fLCBjYWxjdWxhdGVWaW9saW5WYWx1ZXMpIDogdmlvbGluUG9pbnRWYWx1ZUV4dHJhY3RvciB9XG5cblxuICAvKipcbiAgKiBUaGUgZnVuY3Rpb24gcHJvZHVjZWQgYnkgbmVlZGVkVmlvbGluVmFsdWVzLlxuICAqXG4gICogQWRkcyB0aGUgZGF0YSBuZWVkIHRvIHJlbmRlciB0aGUgdmlvbGluIGFzIGFuIHN2Z1xuICAqIEBwYXJhbSB7c3RyaW5nfSB2aW9saW5LZXkgdGhlIGtleSBvZiB0aGUgY3VycmVudCB2aW9saW5cbiAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSB0aGUgb2JqZWN0IGNvbnNpc3Rpbmcgb2YgdmlvbGluS2V5IC0gdmFsdWVzICh2aW9saW4gZGF0YSkgcGFpcnNcbiAgKiBAcmV0dXJucyB7bm9uZX0gdGhpcyBmdW5jdGlvbiBtYW5pcHVsYXRlcyB0aGUgcGFzc2VkIGRhdGEgb2JqZWN0IGFkZGluZyB0aGUgZm9sbG93aW5nIGtleXNcbiAgKlxuICAqIGRhdGFbdmlvbGluS2V5XS5iaW5uZWQgLy8gdGhlIGJpbm5lZCB2YWx1ZXMgb2YgdGhlIHBvaW50c1xuICAqXG4gICogZGF0YVt2aW9saW5LZXldLmZyZXF1ZW5jaWVzIC8vIHRoZSBsaXN0IGNvbnNpc3Rpbmcgb2YgdGhlIGxlbmd0aCBvZiBlYWNoIGJpblxuICAqXG4gICogZGF0YVt2aW9saW5LZXldLmNvbnRvdXIgLy8gdGhlIHBvaW50cyBkZXBpY3RpbmcgdGhlIGNvbnRvdXIgb2YgMS8yIG9mIHRoZSB2aW9saW5cbiAgKlxuICAqIGRhdGFbdmlvbGluS2V5XS5xdWFydGlsZXMgLy8gdGhlIHF1YXJ0aWxlcyBvZiB0aGUgcG9pbnRzJyB2YWx1ZXNcbiAgKlxuICAqIGRhdGFbdmlvbGluS2V5XS5wb2ludEtleXMgLy8gdGhlIGtleXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwb2ludHNcbiAgKlxuICAqIGRhdGFbdmlvbGluS2V5XS5wb2ludFZhbHVlcyAvLyB0aGUgbnVtZXJpY2FsIHZhbHVlcyBvZiB0aGUgcG9pbnRzXG4gICpcbiAgKiBAbWVtYmVyb2YgbmVlZGVkVmlvbGluVmFsdWVzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBmdW5jdGlvbiBjYWxjdWxhdGVWaW9saW5WYWx1ZXModmlvbGluS2V5LCBkYXRhKSB7XG4gICAgLy8gZGF0YSBmb3IgdGhlIGN1cnJlbnQgdmlvbGluXG4gICAgdmFyIHZpb2xpbkRhdGEgPSBkYXRhW3Zpb2xpbktleV07XG4gICAgLy8gdGhlIG9iamVjdCBvZiBwb2ludHNcbiAgICB2YXIgdmlvbGluUG9pbnRzID0gdmlvbGluUG9pbnRzRXh0cmFjdG9yKHZpb2xpbktleSwgdmlvbGluRGF0YSk7XG4gICAgLy9cbiAgICB2YXIgdmlvbGluUG9pbnRzS2V5cyA9IGQzLmtleXModmlvbGluUG9pbnRzKTtcbiAgICAvLyB0aGUgbnVtZXJpY2FsIHZhbHVlcyBvZiB0aG9zZSBwb2ludHNcbiAgICB2YXIgdmlvbGluUG9pbnRzVmFsdWVzID0gdmlvbGluUG9pbnRzS2V5cy5tYXAoZnVuY3Rpb24ocGssIGkpe3JldHVybiB2aW9saW5Qb2ludHNbcGtdLnZhbHVlfSlcblxuICAgIC8vIHF1YXJ0aWxlcyBvZiB0aG9zZSBwb2ludHNcbiAgICB2YXIgcG9pbnRRdWFydGlsZXMgPSBxdWFydGlsZXModmlvbGluUG9pbnRzVmFsdWVzLCBxdWFydGlsZUtleXMpXG5cbiAgICAvLyBiaW5uZWQgcG9pbnRzXG4gICAgdmFyIGJpbm5lZCA9IGQzLmhpc3RvZ3JhbSgpKHZpb2xpblBvaW50c1ZhbHVlcylcbiAgICAvLyBsZW5ndGggb2YgYmluc1xuICAgIHZhciBmcmVxdWVuY2llcyA9IGJpbm5lZC5tYXAoYmluPT5iaW4ubGVuZ3RoKVxuICAgIC8vIG1pbiBhbmQgbWF4IGNvdW50b3VyIHBvaW50cyBmb3IgbmljZSBkcmF3aW5nc1xuICAgIHZhciBtaW5Db250b3VyUG9pbnQgPSBob3Jpem9udGFsUSA/IHt4OiAwLCB5OiBkMy5taW4odmlvbGluUG9pbnRzVmFsdWVzKX0gOiAge3g6IGQzLm1pbih2aW9saW5Qb2ludHNWYWx1ZXMpLCB5OiAwfVxuICAgIHZhciBtYXhDb250b3VyUG9pbnQgPSBob3Jpem9udGFsUSA/IHt4OiAwLCB5OiBkMy5tYXgodmlvbGluUG9pbnRzVmFsdWVzKX0gOiAge3g6IGQzLm1heCh2aW9saW5Qb2ludHNWYWx1ZXMpLCB5OiAwfVxuICAgIHZhciB2aW9saW5Db250b3VyUG9pbnRzID0gYmlubmVkLm1hcChmdW5jdGlvbihiaW4sIGkpIHtcbiAgICAgICAgcmV0dXJuIGhvcml6b250YWxRXG4gICAgICAgID8ge3k6IChiaW4ubGVuZ3RoKSA/IGQzLm1lZGlhbihiaW4pOiBkMy5tZWRpYW4oW2Jpbi54MCwgYmluLngxXSksIHg6IGZyZXF1ZW5jaWVzW2ldfVxuICAgICAgICA6IHt4OiAoYmluLmxlbmd0aCkgPyBkMy5tZWRpYW4oYmluKTogZDMubWVkaWFuKFtiaW4ueDAsIGJpbi54MV0pLCB5OiBmcmVxdWVuY2llc1tpXX1cbiAgICAgIH0pXG4gICAgLy8gcG9pbnRzIGFsb25nIHdoaWNoIHRvIGRyYXcgdGhlIHZpb2xpbiBzaHBlXG4gICAgdmlvbGluQ29udG91clBvaW50cyA9IFttaW5Db250b3VyUG9pbnRdLmNvbmNhdCh2aW9saW5Db250b3VyUG9pbnRzKS5jb25jYXQoW21heENvbnRvdXJQb2ludF0pXG5cbiAgICAvLyBzZXQgZGF0YVxuICAgIHZpb2xpbkRhdGEuYmlubmVkID0gYmlubmVkO1xuICAgIHZpb2xpbkRhdGEuZnJlcXVlbmNpZXMgPSBmcmVxdWVuY2llc1xuICAgIHZpb2xpbkRhdGEuY29udG91ciA9IHZpb2xpbkNvbnRvdXJQb2ludHNcbiAgICB2aW9saW5EYXRhLnF1YXJ0aWxlcyA9IHBvaW50UXVhcnRpbGVzXG4gICAgdmlvbGluRGF0YS5wb2ludEtleXMgPSB2aW9saW5Qb2ludHNLZXlzXG4gICAgdmlvbGluRGF0YS5wb2ludFZhbHVlcyA9IHZpb2xpblBvaW50c1ZhbHVlc1xuICB9XG5cbiAgcmV0dXJuIGNhbGN1bGF0ZVZpb2xpblZhbHVlc1xufVxuIiwiLyoqXG4gKiBIZWxwZXJzLlxuICovXG5cbnZhciBzID0gMTAwMDtcbnZhciBtID0gcyAqIDYwO1xudmFyIGggPSBtICogNjA7XG52YXIgZCA9IGggKiAyNDtcbnZhciB5ID0gZCAqIDM2NS4yNTtcblxuLyoqXG4gKiBQYXJzZSBvciBmb3JtYXQgdGhlIGdpdmVuIGB2YWxgLlxuICpcbiAqIE9wdGlvbnM6XG4gKlxuICogIC0gYGxvbmdgIHZlcmJvc2UgZm9ybWF0dGluZyBbZmFsc2VdXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSB2YWxcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEB0aHJvd3Mge0Vycm9yfSB0aHJvdyBhbiBlcnJvciBpZiB2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIG51bWJlclxuICogQHJldHVybiB7U3RyaW5nfE51bWJlcn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbih2YWwsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbDtcbiAgaWYgKHR5cGUgPT09ICdzdHJpbmcnICYmIHZhbC5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHBhcnNlKHZhbCk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgaXNOYU4odmFsKSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5sb25nID8gZm10TG9uZyh2YWwpIDogZm10U2hvcnQodmFsKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgJ3ZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgdmFsaWQgbnVtYmVyLiB2YWw9JyArXG4gICAgICBKU09OLnN0cmluZ2lmeSh2YWwpXG4gICk7XG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBgc3RyYCBhbmQgcmV0dXJuIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZShzdHIpIHtcbiAgc3RyID0gU3RyaW5nKHN0cik7XG4gIGlmIChzdHIubGVuZ3RoID4gMTAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBtYXRjaCA9IC9eKCg/OlxcZCspP1xcLj9cXGQrKSAqKG1pbGxpc2Vjb25kcz98bXNlY3M/fG1zfHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8eWVhcnM/fHlycz98eSk/JC9pLmV4ZWMoXG4gICAgc3RyXG4gICk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG4gPSBwYXJzZUZsb2F0KG1hdGNoWzFdKTtcbiAgdmFyIHR5cGUgPSAobWF0Y2hbMl0gfHwgJ21zJykudG9Mb3dlckNhc2UoKTtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAneWVhcnMnOlxuICAgIGNhc2UgJ3llYXInOlxuICAgIGNhc2UgJ3lycyc6XG4gICAgY2FzZSAneXInOlxuICAgIGNhc2UgJ3knOlxuICAgICAgcmV0dXJuIG4gKiB5O1xuICAgIGNhc2UgJ2RheXMnOlxuICAgIGNhc2UgJ2RheSc6XG4gICAgY2FzZSAnZCc6XG4gICAgICByZXR1cm4gbiAqIGQ7XG4gICAgY2FzZSAnaG91cnMnOlxuICAgIGNhc2UgJ2hvdXInOlxuICAgIGNhc2UgJ2hycyc6XG4gICAgY2FzZSAnaHInOlxuICAgIGNhc2UgJ2gnOlxuICAgICAgcmV0dXJuIG4gKiBoO1xuICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgY2FzZSAnbWlucyc6XG4gICAgY2FzZSAnbWluJzpcbiAgICBjYXNlICdtJzpcbiAgICAgIHJldHVybiBuICogbTtcbiAgICBjYXNlICdzZWNvbmRzJzpcbiAgICBjYXNlICdzZWNvbmQnOlxuICAgIGNhc2UgJ3NlY3MnOlxuICAgIGNhc2UgJ3NlYyc6XG4gICAgY2FzZSAncyc6XG4gICAgICByZXR1cm4gbiAqIHM7XG4gICAgY2FzZSAnbWlsbGlzZWNvbmRzJzpcbiAgICBjYXNlICdtaWxsaXNlY29uZCc6XG4gICAgY2FzZSAnbXNlY3MnOlxuICAgIGNhc2UgJ21zZWMnOlxuICAgIGNhc2UgJ21zJzpcbiAgICAgIHJldHVybiBuO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogU2hvcnQgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZm10U2hvcnQobXMpIHtcbiAgaWYgKG1zID49IGQpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGQpICsgJ2QnO1xuICB9XG4gIGlmIChtcyA+PSBoKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBoKSArICdoJztcbiAgfVxuICBpZiAobXMgPj0gbSkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbSkgKyAnbSc7XG4gIH1cbiAgaWYgKG1zID49IHMpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIHMpICsgJ3MnO1xuICB9XG4gIHJldHVybiBtcyArICdtcyc7XG59XG5cbi8qKlxuICogTG9uZyBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRMb25nKG1zKSB7XG4gIHJldHVybiBwbHVyYWwobXMsIGQsICdkYXknKSB8fFxuICAgIHBsdXJhbChtcywgaCwgJ2hvdXInKSB8fFxuICAgIHBsdXJhbChtcywgbSwgJ21pbnV0ZScpIHx8XG4gICAgcGx1cmFsKG1zLCBzLCAnc2Vjb25kJykgfHxcbiAgICBtcyArICcgbXMnO1xufVxuXG4vKipcbiAqIFBsdXJhbGl6YXRpb24gaGVscGVyLlxuICovXG5cbmZ1bmN0aW9uIHBsdXJhbChtcywgbiwgbmFtZSkge1xuICBpZiAobXMgPCBuKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChtcyA8IG4gKiAxLjUpIHtcbiAgICByZXR1cm4gTWF0aC5mbG9vcihtcyAvIG4pICsgJyAnICsgbmFtZTtcbiAgfVxuICByZXR1cm4gTWF0aC5jZWlsKG1zIC8gbikgKyAnICcgKyBuYW1lICsgJ3MnO1xufVxuIiwiXG4vKipcbiAqIFRoaXMgaXMgdGhlIGNvbW1vbiBsb2dpYyBmb3IgYm90aCB0aGUgTm9kZS5qcyBhbmQgd2ViIGJyb3dzZXJcbiAqIGltcGxlbWVudGF0aW9ucyBvZiBgZGVidWcoKWAuXG4gKlxuICogRXhwb3NlIGBkZWJ1ZygpYCBhcyB0aGUgbW9kdWxlLlxuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZURlYnVnLmRlYnVnID0gY3JlYXRlRGVidWdbJ2RlZmF1bHQnXSA9IGNyZWF0ZURlYnVnO1xuZXhwb3J0cy5jb2VyY2UgPSBjb2VyY2U7XG5leHBvcnRzLmRpc2FibGUgPSBkaXNhYmxlO1xuZXhwb3J0cy5lbmFibGUgPSBlbmFibGU7XG5leHBvcnRzLmVuYWJsZWQgPSBlbmFibGVkO1xuZXhwb3J0cy5odW1hbml6ZSA9IHJlcXVpcmUoJ21zJyk7XG5cbi8qKlxuICogQWN0aXZlIGBkZWJ1Z2AgaW5zdGFuY2VzLlxuICovXG5leHBvcnRzLmluc3RhbmNlcyA9IFtdO1xuXG4vKipcbiAqIFRoZSBjdXJyZW50bHkgYWN0aXZlIGRlYnVnIG1vZGUgbmFtZXMsIGFuZCBuYW1lcyB0byBza2lwLlxuICovXG5cbmV4cG9ydHMubmFtZXMgPSBbXTtcbmV4cG9ydHMuc2tpcHMgPSBbXTtcblxuLyoqXG4gKiBNYXAgb2Ygc3BlY2lhbCBcIiVuXCIgaGFuZGxpbmcgZnVuY3Rpb25zLCBmb3IgdGhlIGRlYnVnIFwiZm9ybWF0XCIgYXJndW1lbnQuXG4gKlxuICogVmFsaWQga2V5IG5hbWVzIGFyZSBhIHNpbmdsZSwgbG93ZXIgb3IgdXBwZXItY2FzZSBsZXR0ZXIsIGkuZS4gXCJuXCIgYW5kIFwiTlwiLlxuICovXG5cbmV4cG9ydHMuZm9ybWF0dGVycyA9IHt9O1xuXG4vKipcbiAqIFNlbGVjdCBhIGNvbG9yLlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZVxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc2VsZWN0Q29sb3IobmFtZXNwYWNlKSB7XG4gIHZhciBoYXNoID0gMCwgaTtcblxuICBmb3IgKGkgaW4gbmFtZXNwYWNlKSB7XG4gICAgaGFzaCAgPSAoKGhhc2ggPDwgNSkgLSBoYXNoKSArIG5hbWVzcGFjZS5jaGFyQ29kZUF0KGkpO1xuICAgIGhhc2ggfD0gMDsgLy8gQ29udmVydCB0byAzMmJpdCBpbnRlZ2VyXG4gIH1cblxuICByZXR1cm4gZXhwb3J0cy5jb2xvcnNbTWF0aC5hYnMoaGFzaCkgJSBleHBvcnRzLmNvbG9ycy5sZW5ndGhdO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGRlYnVnZ2VyIHdpdGggdGhlIGdpdmVuIGBuYW1lc3BhY2VgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVEZWJ1ZyhuYW1lc3BhY2UpIHtcblxuICB2YXIgcHJldlRpbWU7XG5cbiAgZnVuY3Rpb24gZGVidWcoKSB7XG4gICAgLy8gZGlzYWJsZWQ/XG4gICAgaWYgKCFkZWJ1Zy5lbmFibGVkKSByZXR1cm47XG5cbiAgICB2YXIgc2VsZiA9IGRlYnVnO1xuXG4gICAgLy8gc2V0IGBkaWZmYCB0aW1lc3RhbXBcbiAgICB2YXIgY3VyciA9ICtuZXcgRGF0ZSgpO1xuICAgIHZhciBtcyA9IGN1cnIgLSAocHJldlRpbWUgfHwgY3Vycik7XG4gICAgc2VsZi5kaWZmID0gbXM7XG4gICAgc2VsZi5wcmV2ID0gcHJldlRpbWU7XG4gICAgc2VsZi5jdXJyID0gY3VycjtcbiAgICBwcmV2VGltZSA9IGN1cnI7XG5cbiAgICAvLyB0dXJuIHRoZSBgYXJndW1lbnRzYCBpbnRvIGEgcHJvcGVyIEFycmF5XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2ldO1xuICAgIH1cblxuICAgIGFyZ3NbMF0gPSBleHBvcnRzLmNvZXJjZShhcmdzWzBdKTtcblxuICAgIGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIGFyZ3NbMF0pIHtcbiAgICAgIC8vIGFueXRoaW5nIGVsc2UgbGV0J3MgaW5zcGVjdCB3aXRoICVPXG4gICAgICBhcmdzLnVuc2hpZnQoJyVPJyk7XG4gICAgfVxuXG4gICAgLy8gYXBwbHkgYW55IGBmb3JtYXR0ZXJzYCB0cmFuc2Zvcm1hdGlvbnNcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIGFyZ3NbMF0gPSBhcmdzWzBdLnJlcGxhY2UoLyUoW2EtekEtWiVdKS9nLCBmdW5jdGlvbihtYXRjaCwgZm9ybWF0KSB7XG4gICAgICAvLyBpZiB3ZSBlbmNvdW50ZXIgYW4gZXNjYXBlZCAlIHRoZW4gZG9uJ3QgaW5jcmVhc2UgdGhlIGFycmF5IGluZGV4XG4gICAgICBpZiAobWF0Y2ggPT09ICclJScpIHJldHVybiBtYXRjaDtcbiAgICAgIGluZGV4Kys7XG4gICAgICB2YXIgZm9ybWF0dGVyID0gZXhwb3J0cy5mb3JtYXR0ZXJzW2Zvcm1hdF07XG4gICAgICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGZvcm1hdHRlcikge1xuICAgICAgICB2YXIgdmFsID0gYXJnc1tpbmRleF07XG4gICAgICAgIG1hdGNoID0gZm9ybWF0dGVyLmNhbGwoc2VsZiwgdmFsKTtcblxuICAgICAgICAvLyBub3cgd2UgbmVlZCB0byByZW1vdmUgYGFyZ3NbaW5kZXhdYCBzaW5jZSBpdCdzIGlubGluZWQgaW4gdGhlIGBmb3JtYXRgXG4gICAgICAgIGFyZ3Muc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgaW5kZXgtLTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtYXRjaDtcbiAgICB9KTtcblxuICAgIC8vIGFwcGx5IGVudi1zcGVjaWZpYyBmb3JtYXR0aW5nIChjb2xvcnMsIGV0Yy4pXG4gICAgZXhwb3J0cy5mb3JtYXRBcmdzLmNhbGwoc2VsZiwgYXJncyk7XG5cbiAgICB2YXIgbG9nRm4gPSBkZWJ1Zy5sb2cgfHwgZXhwb3J0cy5sb2cgfHwgY29uc29sZS5sb2cuYmluZChjb25zb2xlKTtcbiAgICBsb2dGbi5hcHBseShzZWxmLCBhcmdzKTtcbiAgfVxuXG4gIGRlYnVnLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcbiAgZGVidWcuZW5hYmxlZCA9IGV4cG9ydHMuZW5hYmxlZChuYW1lc3BhY2UpO1xuICBkZWJ1Zy51c2VDb2xvcnMgPSBleHBvcnRzLnVzZUNvbG9ycygpO1xuICBkZWJ1Zy5jb2xvciA9IHNlbGVjdENvbG9yKG5hbWVzcGFjZSk7XG4gIGRlYnVnLmRlc3Ryb3kgPSBkZXN0cm95O1xuXG4gIC8vIGVudi1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBsb2dpYyBmb3IgZGVidWcgaW5zdGFuY2VzXG4gIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2YgZXhwb3J0cy5pbml0KSB7XG4gICAgZXhwb3J0cy5pbml0KGRlYnVnKTtcbiAgfVxuXG4gIGV4cG9ydHMuaW5zdGFuY2VzLnB1c2goZGVidWcpO1xuXG4gIHJldHVybiBkZWJ1Zztcbn1cblxuZnVuY3Rpb24gZGVzdHJveSAoKSB7XG4gIHZhciBpbmRleCA9IGV4cG9ydHMuaW5zdGFuY2VzLmluZGV4T2YodGhpcyk7XG4gIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICBleHBvcnRzLmluc3RhbmNlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIEVuYWJsZXMgYSBkZWJ1ZyBtb2RlIGJ5IG5hbWVzcGFjZXMuIFRoaXMgY2FuIGluY2x1ZGUgbW9kZXNcbiAqIHNlcGFyYXRlZCBieSBhIGNvbG9uIGFuZCB3aWxkY2FyZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZW5hYmxlKG5hbWVzcGFjZXMpIHtcbiAgZXhwb3J0cy5zYXZlKG5hbWVzcGFjZXMpO1xuXG4gIGV4cG9ydHMubmFtZXMgPSBbXTtcbiAgZXhwb3J0cy5za2lwcyA9IFtdO1xuXG4gIHZhciBpO1xuICB2YXIgc3BsaXQgPSAodHlwZW9mIG5hbWVzcGFjZXMgPT09ICdzdHJpbmcnID8gbmFtZXNwYWNlcyA6ICcnKS5zcGxpdCgvW1xccyxdKy8pO1xuICB2YXIgbGVuID0gc3BsaXQubGVuZ3RoO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGlmICghc3BsaXRbaV0pIGNvbnRpbnVlOyAvLyBpZ25vcmUgZW1wdHkgc3RyaW5nc1xuICAgIG5hbWVzcGFjZXMgPSBzcGxpdFtpXS5yZXBsYWNlKC9cXCovZywgJy4qPycpO1xuICAgIGlmIChuYW1lc3BhY2VzWzBdID09PSAnLScpIHtcbiAgICAgIGV4cG9ydHMuc2tpcHMucHVzaChuZXcgUmVnRXhwKCdeJyArIG5hbWVzcGFjZXMuc3Vic3RyKDEpICsgJyQnKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4cG9ydHMubmFtZXMucHVzaChuZXcgUmVnRXhwKCdeJyArIG5hbWVzcGFjZXMgKyAnJCcpKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGkgPSAwOyBpIDwgZXhwb3J0cy5pbnN0YW5jZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBleHBvcnRzLmluc3RhbmNlc1tpXTtcbiAgICBpbnN0YW5jZS5lbmFibGVkID0gZXhwb3J0cy5lbmFibGVkKGluc3RhbmNlLm5hbWVzcGFjZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEaXNhYmxlIGRlYnVnIG91dHB1dC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGRpc2FibGUoKSB7XG4gIGV4cG9ydHMuZW5hYmxlKCcnKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIG1vZGUgbmFtZSBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGVuYWJsZWQobmFtZSkge1xuICBpZiAobmFtZVtuYW1lLmxlbmd0aCAtIDFdID09PSAnKicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgaSwgbGVuO1xuICBmb3IgKGkgPSAwLCBsZW4gPSBleHBvcnRzLnNraXBzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKGV4cG9ydHMuc2tpcHNbaV0udGVzdChuYW1lKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBmb3IgKGkgPSAwLCBsZW4gPSBleHBvcnRzLm5hbWVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKGV4cG9ydHMubmFtZXNbaV0udGVzdChuYW1lKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDb2VyY2UgYHZhbGAuXG4gKlxuICogQHBhcmFtIHtNaXhlZH0gdmFsXG4gKiBAcmV0dXJuIHtNaXhlZH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNvZXJjZSh2YWwpIHtcbiAgaWYgKHZhbCBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gdmFsLnN0YWNrIHx8IHZhbC5tZXNzYWdlO1xuICByZXR1cm4gdmFsO1xufVxuIiwiLyoqXG4gKiBUaGlzIGlzIHRoZSB3ZWIgYnJvd3NlciBpbXBsZW1lbnRhdGlvbiBvZiBgZGVidWcoKWAuXG4gKlxuICogRXhwb3NlIGBkZWJ1ZygpYCBhcyB0aGUgbW9kdWxlLlxuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZGVidWcnKTtcbmV4cG9ydHMubG9nID0gbG9nO1xuZXhwb3J0cy5mb3JtYXRBcmdzID0gZm9ybWF0QXJncztcbmV4cG9ydHMuc2F2ZSA9IHNhdmU7XG5leHBvcnRzLmxvYWQgPSBsb2FkO1xuZXhwb3J0cy51c2VDb2xvcnMgPSB1c2VDb2xvcnM7XG5leHBvcnRzLnN0b3JhZ2UgPSAndW5kZWZpbmVkJyAhPSB0eXBlb2YgY2hyb21lXG4gICAgICAgICAgICAgICAmJiAndW5kZWZpbmVkJyAhPSB0eXBlb2YgY2hyb21lLnN0b3JhZ2VcbiAgICAgICAgICAgICAgICAgID8gY2hyb21lLnN0b3JhZ2UubG9jYWxcbiAgICAgICAgICAgICAgICAgIDogbG9jYWxzdG9yYWdlKCk7XG5cbi8qKlxuICogQ29sb3JzLlxuICovXG5cbmV4cG9ydHMuY29sb3JzID0gW1xuICAnIzAwMDBDQycsICcjMDAwMEZGJywgJyMwMDMzQ0MnLCAnIzAwMzNGRicsICcjMDA2NkNDJywgJyMwMDY2RkYnLCAnIzAwOTlDQycsXG4gICcjMDA5OUZGJywgJyMwMENDMDAnLCAnIzAwQ0MzMycsICcjMDBDQzY2JywgJyMwMENDOTknLCAnIzAwQ0NDQycsICcjMDBDQ0ZGJyxcbiAgJyMzMzAwQ0MnLCAnIzMzMDBGRicsICcjMzMzM0NDJywgJyMzMzMzRkYnLCAnIzMzNjZDQycsICcjMzM2NkZGJywgJyMzMzk5Q0MnLFxuICAnIzMzOTlGRicsICcjMzNDQzAwJywgJyMzM0NDMzMnLCAnIzMzQ0M2NicsICcjMzNDQzk5JywgJyMzM0NDQ0MnLCAnIzMzQ0NGRicsXG4gICcjNjYwMENDJywgJyM2NjAwRkYnLCAnIzY2MzNDQycsICcjNjYzM0ZGJywgJyM2NkNDMDAnLCAnIzY2Q0MzMycsICcjOTkwMENDJyxcbiAgJyM5OTAwRkYnLCAnIzk5MzNDQycsICcjOTkzM0ZGJywgJyM5OUNDMDAnLCAnIzk5Q0MzMycsICcjQ0MwMDAwJywgJyNDQzAwMzMnLFxuICAnI0NDMDA2NicsICcjQ0MwMDk5JywgJyNDQzAwQ0MnLCAnI0NDMDBGRicsICcjQ0MzMzAwJywgJyNDQzMzMzMnLCAnI0NDMzM2NicsXG4gICcjQ0MzMzk5JywgJyNDQzMzQ0MnLCAnI0NDMzNGRicsICcjQ0M2NjAwJywgJyNDQzY2MzMnLCAnI0NDOTkwMCcsICcjQ0M5OTMzJyxcbiAgJyNDQ0NDMDAnLCAnI0NDQ0MzMycsICcjRkYwMDAwJywgJyNGRjAwMzMnLCAnI0ZGMDA2NicsICcjRkYwMDk5JywgJyNGRjAwQ0MnLFxuICAnI0ZGMDBGRicsICcjRkYzMzAwJywgJyNGRjMzMzMnLCAnI0ZGMzM2NicsICcjRkYzMzk5JywgJyNGRjMzQ0MnLCAnI0ZGMzNGRicsXG4gICcjRkY2NjAwJywgJyNGRjY2MzMnLCAnI0ZGOTkwMCcsICcjRkY5OTMzJywgJyNGRkNDMDAnLCAnI0ZGQ0MzMydcbl07XG5cbi8qKlxuICogQ3VycmVudGx5IG9ubHkgV2ViS2l0LWJhc2VkIFdlYiBJbnNwZWN0b3JzLCBGaXJlZm94ID49IHYzMSxcbiAqIGFuZCB0aGUgRmlyZWJ1ZyBleHRlbnNpb24gKGFueSBGaXJlZm94IHZlcnNpb24pIGFyZSBrbm93blxuICogdG8gc3VwcG9ydCBcIiVjXCIgQ1NTIGN1c3RvbWl6YXRpb25zLlxuICpcbiAqIFRPRE86IGFkZCBhIGBsb2NhbFN0b3JhZ2VgIHZhcmlhYmxlIHRvIGV4cGxpY2l0bHkgZW5hYmxlL2Rpc2FibGUgY29sb3JzXG4gKi9cblxuZnVuY3Rpb24gdXNlQ29sb3JzKCkge1xuICAvLyBOQjogSW4gYW4gRWxlY3Ryb24gcHJlbG9hZCBzY3JpcHQsIGRvY3VtZW50IHdpbGwgYmUgZGVmaW5lZCBidXQgbm90IGZ1bGx5XG4gIC8vIGluaXRpYWxpemVkLiBTaW5jZSB3ZSBrbm93IHdlJ3JlIGluIENocm9tZSwgd2UnbGwganVzdCBkZXRlY3QgdGhpcyBjYXNlXG4gIC8vIGV4cGxpY2l0bHlcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5wcm9jZXNzICYmIHdpbmRvdy5wcm9jZXNzLnR5cGUgPT09ICdyZW5kZXJlcicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIEludGVybmV0IEV4cGxvcmVyIGFuZCBFZGdlIGRvIG5vdCBzdXBwb3J0IGNvbG9ycy5cbiAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC8oZWRnZXx0cmlkZW50KVxcLyhcXGQrKS8pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gaXMgd2Via2l0PyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xNjQ1OTYwNi8zNzY3NzNcbiAgLy8gZG9jdW1lbnQgaXMgdW5kZWZpbmVkIGluIHJlYWN0LW5hdGl2ZTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0LW5hdGl2ZS9wdWxsLzE2MzJcbiAgcmV0dXJuICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLldlYmtpdEFwcGVhcmFuY2UpIHx8XG4gICAgLy8gaXMgZmlyZWJ1Zz8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzk4MTIwLzM3Njc3M1xuICAgICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuY29uc29sZSAmJiAod2luZG93LmNvbnNvbGUuZmlyZWJ1ZyB8fCAod2luZG93LmNvbnNvbGUuZXhjZXB0aW9uICYmIHdpbmRvdy5jb25zb2xlLnRhYmxlKSkpIHx8XG4gICAgLy8gaXMgZmlyZWZveCA+PSB2MzE/XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9Ub29scy9XZWJfQ29uc29sZSNTdHlsaW5nX21lc3NhZ2VzXG4gICAgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9maXJlZm94XFwvKFxcZCspLykgJiYgcGFyc2VJbnQoUmVnRXhwLiQxLCAxMCkgPj0gMzEpIHx8XG4gICAgLy8gZG91YmxlIGNoZWNrIHdlYmtpdCBpbiB1c2VyQWdlbnQganVzdCBpbiBjYXNlIHdlIGFyZSBpbiBhIHdvcmtlclxuICAgICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvYXBwbGV3ZWJraXRcXC8oXFxkKykvKSk7XG59XG5cbi8qKlxuICogTWFwICVqIHRvIGBKU09OLnN0cmluZ2lmeSgpYCwgc2luY2Ugbm8gV2ViIEluc3BlY3RvcnMgZG8gdGhhdCBieSBkZWZhdWx0LlxuICovXG5cbmV4cG9ydHMuZm9ybWF0dGVycy5qID0gZnVuY3Rpb24odikge1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuICdbVW5leHBlY3RlZEpTT05QYXJzZUVycm9yXTogJyArIGVyci5tZXNzYWdlO1xuICB9XG59O1xuXG5cbi8qKlxuICogQ29sb3JpemUgbG9nIGFyZ3VtZW50cyBpZiBlbmFibGVkLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZm9ybWF0QXJncyhhcmdzKSB7XG4gIHZhciB1c2VDb2xvcnMgPSB0aGlzLnVzZUNvbG9ycztcblxuICBhcmdzWzBdID0gKHVzZUNvbG9ycyA/ICclYycgOiAnJylcbiAgICArIHRoaXMubmFtZXNwYWNlXG4gICAgKyAodXNlQ29sb3JzID8gJyAlYycgOiAnICcpXG4gICAgKyBhcmdzWzBdXG4gICAgKyAodXNlQ29sb3JzID8gJyVjICcgOiAnICcpXG4gICAgKyAnKycgKyBleHBvcnRzLmh1bWFuaXplKHRoaXMuZGlmZik7XG5cbiAgaWYgKCF1c2VDb2xvcnMpIHJldHVybjtcblxuICB2YXIgYyA9ICdjb2xvcjogJyArIHRoaXMuY29sb3I7XG4gIGFyZ3Muc3BsaWNlKDEsIDAsIGMsICdjb2xvcjogaW5oZXJpdCcpXG5cbiAgLy8gdGhlIGZpbmFsIFwiJWNcIiBpcyBzb21ld2hhdCB0cmlja3ksIGJlY2F1c2UgdGhlcmUgY291bGQgYmUgb3RoZXJcbiAgLy8gYXJndW1lbnRzIHBhc3NlZCBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIHRoZSAlYywgc28gd2UgbmVlZCB0b1xuICAvLyBmaWd1cmUgb3V0IHRoZSBjb3JyZWN0IGluZGV4IHRvIGluc2VydCB0aGUgQ1NTIGludG9cbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxhc3RDID0gMDtcbiAgYXJnc1swXS5yZXBsYWNlKC8lW2EtekEtWiVdL2csIGZ1bmN0aW9uKG1hdGNoKSB7XG4gICAgaWYgKCclJScgPT09IG1hdGNoKSByZXR1cm47XG4gICAgaW5kZXgrKztcbiAgICBpZiAoJyVjJyA9PT0gbWF0Y2gpIHtcbiAgICAgIC8vIHdlIG9ubHkgYXJlIGludGVyZXN0ZWQgaW4gdGhlICpsYXN0KiAlY1xuICAgICAgLy8gKHRoZSB1c2VyIG1heSBoYXZlIHByb3ZpZGVkIHRoZWlyIG93bilcbiAgICAgIGxhc3RDID0gaW5kZXg7XG4gICAgfVxuICB9KTtcblxuICBhcmdzLnNwbGljZShsYXN0QywgMCwgYyk7XG59XG5cbi8qKlxuICogSW52b2tlcyBgY29uc29sZS5sb2coKWAgd2hlbiBhdmFpbGFibGUuXG4gKiBOby1vcCB3aGVuIGBjb25zb2xlLmxvZ2AgaXMgbm90IGEgXCJmdW5jdGlvblwiLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gbG9nKCkge1xuICAvLyB0aGlzIGhhY2tlcnkgaXMgcmVxdWlyZWQgZm9yIElFOC85LCB3aGVyZVxuICAvLyB0aGUgYGNvbnNvbGUubG9nYCBmdW5jdGlvbiBkb2Vzbid0IGhhdmUgJ2FwcGx5J1xuICByZXR1cm4gJ29iamVjdCcgPT09IHR5cGVvZiBjb25zb2xlXG4gICAgJiYgY29uc29sZS5sb2dcbiAgICAmJiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChjb25zb2xlLmxvZywgY29uc29sZSwgYXJndW1lbnRzKTtcbn1cblxuLyoqXG4gKiBTYXZlIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc2F2ZShuYW1lc3BhY2VzKSB7XG4gIHRyeSB7XG4gICAgaWYgKG51bGwgPT0gbmFtZXNwYWNlcykge1xuICAgICAgZXhwb3J0cy5zdG9yYWdlLnJlbW92ZUl0ZW0oJ2RlYnVnJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4cG9ydHMuc3RvcmFnZS5kZWJ1ZyA9IG5hbWVzcGFjZXM7XG4gICAgfVxuICB9IGNhdGNoKGUpIHt9XG59XG5cbi8qKlxuICogTG9hZCBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHJldHVybiB7U3RyaW5nfSByZXR1cm5zIHRoZSBwcmV2aW91c2x5IHBlcnNpc3RlZCBkZWJ1ZyBtb2Rlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbG9hZCgpIHtcbiAgdmFyIHI7XG4gIHRyeSB7XG4gICAgciA9IGV4cG9ydHMuc3RvcmFnZS5kZWJ1ZztcbiAgfSBjYXRjaChlKSB7fVxuXG4gIC8vIElmIGRlYnVnIGlzbid0IHNldCBpbiBMUywgYW5kIHdlJ3JlIGluIEVsZWN0cm9uLCB0cnkgdG8gbG9hZCAkREVCVUdcbiAgaWYgKCFyICYmIHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiAnZW52JyBpbiBwcm9jZXNzKSB7XG4gICAgciA9IHByb2Nlc3MuZW52LkRFQlVHO1xuICB9XG5cbiAgcmV0dXJuIHI7XG59XG5cbi8qKlxuICogRW5hYmxlIG5hbWVzcGFjZXMgbGlzdGVkIGluIGBsb2NhbFN0b3JhZ2UuZGVidWdgIGluaXRpYWxseS5cbiAqL1xuXG5leHBvcnRzLmVuYWJsZShsb2FkKCkpO1xuXG4vKipcbiAqIExvY2Fsc3RvcmFnZSBhdHRlbXB0cyB0byByZXR1cm4gdGhlIGxvY2Fsc3RvcmFnZS5cbiAqXG4gKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNhZmFyaSB0aHJvd3NcbiAqIHdoZW4gYSB1c2VyIGRpc2FibGVzIGNvb2tpZXMvbG9jYWxzdG9yYWdlXG4gKiBhbmQgeW91IGF0dGVtcHQgdG8gYWNjZXNzIGl0LlxuICpcbiAqIEByZXR1cm4ge0xvY2FsU3RvcmFnZX1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGxvY2Fsc3RvcmFnZSgpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gd2luZG93LmxvY2FsU3RvcmFnZTtcbiAgfSBjYXRjaCAoZSkge31cbn1cbiIsIi8vIEltcG9ydCBzdHlsZXMgKGF1dG9tYXRpY2FsbHkgaW5qZWN0IGludG8gPGhlYWQ+KS5cbi8vIGltcG9ydCAnLi4vc3R5bGVzL21haW4uY3NzJztcbmltcG9ydCB7YXhpc30gZnJvbSAnLi9tb2R1bGVzL2F4aXMnO1xuaW1wb3J0IHtiYXJ9IGZyb20gJy4vbW9kdWxlcy9iYXInO1xuaW1wb3J0IHtidWJibGVIZWF0bWFwfSBmcm9tICcuL21vZHVsZXMvYnViYmxlLWhlYXRtYXAnO1xuaW1wb3J0IHtib3h3aGlza2VyfSBmcm9tICcuL21vZHVsZXMvYm94LXdoaXNrZXInO1xuaW1wb3J0IHtjb2xvckZ1bmN0aW9ufSBmcm9tICcuL21vZHVsZXMvY29sb3ItZnVuY3Rpb24nO1xuaW1wb3J0IHtkYXRhdG9nZ2xlfSBmcm9tICcuL21vZHVsZXMvZGF0YS10b2dnbGUnO1xuaW1wb3J0IHtncm91cGluZ1NwYWNlcn0gZnJvbSAnLi9tb2R1bGVzL2dyb3VwaW5nLXNwYWNlcic7XG5pbXBvcnQge3Rvb2x0aXB9IGZyb20gJy4vbW9kdWxlcy90b29sdGlwJztcbmltcG9ydCB7c2NhdHRlcn0gZnJvbSAnLi9tb2R1bGVzL3NjYXR0ZXInO1xuaW1wb3J0IHtwbG90Wm9vbX0gZnJvbSAnLi9tb2R1bGVzL3Bsb3Qtem9vbSc7XG5pbXBvcnQge3Zpb2xpbn0gZnJvbSAnLi9tb2R1bGVzL3Zpb2xpbic7XG5pbXBvcnQge3BvaW50c30gZnJvbSAnLi9tb2R1bGVzL3BvaW50cyc7XG5cbmltcG9ydCB7dW5pcXVlRWxlbWVudHMsIGdldFRyYW5zbGF0aW9uLCBtb2RpZnlIZXhpZGVjaW1hbENvbG9yTHVtaW5hbmNlLCB0aWNrUmFuZ2UsXG5xdWFydGlsZXMsIGV4dHJhY3RWaW9saW5WYWx1ZXMsIGh5cGVuYXRlLCByb3VuZCwgZ2V0Q29udGFpbmluZ1NWRyxcbmludGVycG9sYXRlQ29sb3JzLCB0cnVuY2F0ZVRleHQsIHNhZmVTZWxlY3R9IGZyb20gJy4vbW9kdWxlcy9oZWxwZXJzJztcblxuaW1wb3J0IHtcbiAgYWxsLCB0YWxseSwgaGFzUSwgZmlyc3QsIGxhc3QsIHRvdGFsLCB1bmlxdWUsIGdldCwgbGlzdE9mTGlzdHNRLFxuICBjdXQsIGdyb3VwQnksIGFycmF5RXF1YWxzLCBlbGVtZW50c0F0TGV2ZWxzLCBudW1iZXJPZkVsZW1lbnRzLFxuICBmbGF0dGVuLCB3aGljaEJpblxufSBmcm9tICcuL21vZHVsZXMvYXJyYXktZnVuY3Rpb25zJztcblxuXG5pbXBvcnQge1xuICBzZXR1cFN0YW5kYXJkQ2hhcnRDb250YWluZXJzLCBsb2cgYXMgbXlMb2csIHdhcm4sIGluZm8sIGVycm9yLFxuICBjb25zb2xlR3JvdXAsIGNvbnNvbGVHcm91cEVuZFxufSBmcm9tICcuL21vZHVsZXMvdXRpbHMnO1xuXG4vLyAvKiogQG1vZHVsZSBkM3NtICovXG52YXIgZDNzbSA9IHt9O1xuZDNzbS5heGlzID0gYXhpcztcbmQzc20uYmFyID0gYmFyO1xuZDNzbS5idWJibGVIZWF0bWFwID0gYnViYmxlSGVhdG1hcDtcbmQzc20uYm94d2hpc2tlciA9IGJveHdoaXNrZXI7XG5kM3NtLmNvbG9yRnVuY3Rpb24gPSBjb2xvckZ1bmN0aW9uO1xuZDNzbS5kYXRhdG9nZ2xlID0gZGF0YXRvZ2dsZTtcbmQzc20uZ3JvdXBpbmdTcGFjZXIgPSBncm91cGluZ1NwYWNlcjtcbmQzc20udG9vbHRpcCA9IHRvb2x0aXA7XG5kM3NtLnNjYXR0ZXIgPSBzY2F0dGVyO1xuZDNzbS5wbG90Wm9vbSA9IHBsb3Rab29tO1xuZDNzbS52aW9saW4gPSB2aW9saW47XG5kM3NtLnBvaW50cyA9IHBvaW50cztcblxuZDNzbS51bmlxdWVFbGVtZW50cyA9IHVuaXF1ZUVsZW1lbnRzO1xuZDNzbS5nZXRUcmFuc2xhdGlvbiA9IGdldFRyYW5zbGF0aW9uO1xuZDNzbS5tb2RpZnlIZXhpZGVjaW1hbENvbG9yTHVtaW5hbmNlID0gbW9kaWZ5SGV4aWRlY2ltYWxDb2xvckx1bWluYW5jZTtcbmQzc20udGlja1JhbmdlID0gdGlja1JhbmdlO1xuZDNzbS5xdWFydGlsZXMgPSBxdWFydGlsZXM7XG5kM3NtLmV4dHJhY3RWaW9saW5WYWx1ZXMgPSBleHRyYWN0VmlvbGluVmFsdWVzO1xuZDNzbS5oeXBlbmF0ZSA9IGh5cGVuYXRlO1xuZDNzbS5yb3VuZCA9IHJvdW5kO1xuZDNzbS5nZXRDb250YWluaW5nU1ZHID0gZ2V0Q29udGFpbmluZ1NWRztcbmQzc20uaW50ZXJwb2xhdGVDb2xvcnMgPSBpbnRlcnBvbGF0ZUNvbG9ycztcbmQzc20udHJ1bmNhdGVUZXh0ID0gdHJ1bmNhdGVUZXh0O1xuZDNzbS5zYWZlU2VsZWN0ID0gc2FmZVNlbGVjdDtcblxuZDNzbS53aGljaEJpbiA9IHdoaWNoQmluO1xuZDNzbS51bmlxdWUgPSB1bmlxdWU7XG5cbmQzc20uc2V0dXBTdGFuZGFyZENoYXJ0Q29udGFpbmVycyA9IHNldHVwU3RhbmRhcmRDaGFydENvbnRhaW5lcnM7XG5kM3NtLmxvZyA9IG15TG9nO1xuZDNzbS53YXJuID0gd2FybjtcbmQzc20uaW5mbyA9IGluZm87XG5kM3NtLmVycm9yID0gZXJyb3I7XG5kM3NtLmNvbnNvbGVHcm91cCA9IGNvbnNvbGVHcm91cDtcbmQzc20uY29uc29sZUdyb3VwRW5kID0gY29uc29sZUdyb3VwRW5kO1xuXG5kM3NtLmRlYnVnUSA9IGZhbHNlXG5cblxuXG4vLyBJbXBvcnQgYSBsb2dnZXIgZm9yIGVhc2llciBkZWJ1Z2dpbmdcbmltcG9ydCBkZWJ1ZyBmcm9tICdkZWJ1Zyc7XG5jb25zdCBsb2cgPSBkZWJ1ZygnYXBwOmxvZycpO1xuXG4vLyBUaGUgbG9nZ2VyIHNob3VsZCBvbmx5IGJlIGRpc2FibGVkIGlmIHdlJ3JlIG5vdCBpbiBwcm9kdWN0aW9uLlxuaWYgKEVOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIC8vIEVuYWJsZSB0aGUgbG9nZ2VyLlxuICBkZWJ1Zy5lbmFibGUoJyonKTtcbiAgbG9nKCdMb2dnaW5nIGlzIGVuYWJsZWQhJyk7XG5cbiAgLy8gRW5hYmxlIExpdmVSZWxvYWRcbiAgZG9jdW1lbnQud3JpdGUoXG4gICAgJzxzY3JpcHQgc3JjPVwiaHR0cDovLydcbiAgICArIChsb2NhdGlvbi5ob3N0IHx8ICdsb2NhbGhvc3QnKS5zcGxpdCgnOicpWzBdXG4gICAgKyAnOjM1NzI5L2xpdmVyZWxvYWQuanM/c25pcHZlcj0xXCI+PC8nXG4gICAgKyAnc2NyaXB0PidcbiAgKTtcbn0gZWxzZSB7XG4gIGRlYnVnLmRpc2FibGUoKTtcbn1cblxud2luZG93LmQzc20gPSBkM3NtO1xuIiwiaW1wb3J0IHtcbiAgaHlwZW5hdGUsIHNhZmVTZWxlY3QsIGV4dHJhY3RWaW9saW5WYWx1ZXMsXG4gIHRpY2tSYW5nZSwgbW9kaWZ5SGV4aWRlY2ltYWxDb2xvckx1bWluYW5jZSwgdHJ1bmNhdGVUZXh0LFxuICByb3VuZFxufSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHtzZXR1cENvbnRhaW5lciwgY2FsY3VsYXRlV2lkdGhPZk9iamVjdCwgY2FsY3VsYXRlV2lkdGhPZlNwYWNlcn0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge3VuaXF1ZSwgaGFzUSwgZmxhdHRlbn0gZnJvbSAnLi9hcnJheS1mdW5jdGlvbnMnO1xuaW1wb3J0IHtncm91cGluZ1NwYWNlcn0gZnJvbSAnLi9ncm91cGluZy1zcGFjZXInO1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGF4aXNcbiAqXG4gKiB7QGxpbmsgaHR0cHM6Ly9zdW1uZXVyb24uZ2l0bGFiLmlvL2Qzc20vZGVtb3MvYXhlcy9pbmRleC5odG1sIERlbW99XG4gKiBAY29uc3RydWN0b3IgYXhpc1xuICogQHBhcmFtIHtkMy5zZWxlY3Rpb259IHNlbGVjdGlvblxuICogQG5hbWVzcGFjZSBheGlzXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259IGF4aXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF4aXMgKCBzZWxlY3Rpb24gKSB7XG4gIHZhclxuICAvKipcbiAgKiBUaGUgb3JpZW50YXRpb24gb2YgdGhlIGF4aXNcbiAgKiAoc2VlIHtAbGluayBheGlzI29yaWVudH0pXG4gICogQHBhcmFtIHtzdHJpbmd9IFtvcmllbnQ9J2JvdHRvbSddXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG9yaWVudCA9ICdib3R0b20nLCAgICAgICAvLyBkaXJlY3Rpb24gb2YgdGhlIGF4aXNcblxuICAvKipcbiAgKiBBbW91bnQgb2YgaG9yaXpvbnRhbCBzcGFjZSAoaW4gcGl4ZWxzKSBhdmFpYmxlIHRvIHJlbmRlciB0aGUgYXhpcyBpblxuICAqIChzZWUge0BsaW5rIGF4aXMjc3BhY2VYfSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW3NwYWNlWD0wXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzcGFjZVg9MCxcbiAgLyoqXG4gICogQW1vdW50IG9mIHZlcnRpY2FsIHNwYWNlIChpbiBwaXhlbHMpIGF2YWlibGUgdG8gcmVuZGVyIHRoZSBheGlzIGluXG4gICogKHNlZSB7QGxpbmsgYXhpcy5zcGFjZVl9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbc3BhY2VZPTBdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNwYWNlWT0wLFxuXG5cbiAgLyoqXG4gICogV2hldGhlciBvciBub3QgdG8gYWxsb3cgYXhpcyB0byByZW5kZXIgZWxlbWVudHMgcGFzcyB0aGUgbWFpbiBzcGF0aWFsIGRpbWVuc2lvblxuICAqIGdpdmVuIHRoZSBvcmllbnRhdGlvbiAoc2VlIHtAbGluayBheGlzI29yaWVudH0pLCB3aGVyZSB7QGxpbmsgYXhpcyNvcmllbnR9PVwiYm90dG9tXCIgb3Ige0BsaW5rIGF4aXMjb3JpZW50fT1cInRvcFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBheGlzI3NwYWNlWH0gYW5kIHdoZXJlIHtAbGluayBheGlzI29yaWVudH09XCJsZWZ0XCIgb3Ige0BsaW5rIGF4aXMjb3JpZW50fT1cInJpZ2h0XCJcbiAgKiB0aGUgbWFpbiBkaW1lbnNpb24gaXMge0BsaW5rIGF4aXMjc3BhY2VZfVxuICAqIEBwYXJhbSB7Ym9vbGVhbn0gW292ZXJmbG93UT1mYWxzZV1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb3ZlcmZsb3dRID0gZmFsc2UsICAgIC8vIHdoZXRoZXIgb3Igbm90IHRvIGFsbG93IG92ZXJmbG93XG4gIC8qKlxuICAqIFdoZXRoZXIgb3Igbm90IHRoZSBheGlzIGxhYmVscyBhcmUgZm9yIGNhdGVnb3JpY2FsIGRhdGEuIElmIGZhbHNlLFxuICAqIHdpbGwgdXNlIHtAbGluayBheGlzI3NjYWxlfSB0byBwb3NpdGlvbiB0aWNrcy5cbiAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjYXRlZ29yaWNhbFE9ZmFsc2VdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGNhdGVnb3JpY2FsUSA9IGZhbHNlLCAvLyB3aGV0aGVyIG9yIG5vdCB0aGUgYXhpcyBpcyBzaG93aW5nIHZhbHVlcyBvciBncm91cHNcbiAgLyoqXG4gICogV2hldGhlciBvciBub3QgdGhlIGF4aXMgdGlja3Mgc2hvdWxkIGhhdmUgZ3VpZGVsaW5lc1xuICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NhdGVnb3JpY2FsUT1mYWxzZV1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZ3VpZGVMaW5lc1EgPSBmYWxzZSwgICAgLy8gd2hldGhlciBvciBub3QgdG8gYWxsb3cgb3ZlcmZsb3dcblxuXG4gIC8qKlxuICAqIEhvdyB0byBncm91cCB0aGUgdGljayBsYWJlbHNcbiAgKiBAcGFyYW0ge0FycmF5W119IFtncm91cGluZz11bmRlZmluZWRdIGxpc3Qgb2YgcHV0YXRpdmVseSBvdGhlciBsaXN0cywgd2hpY2ggc2hvdWxkIGNvcnJlc3BvbmQgdG8gdGlja0xhYmVsc1xuICAqIHdpbGwgc3BhY2UgdGljayBsYWJlbHMgaW4gbmVzdGVkIGxpc3RzIGNsb3NlciB0b2dldGhlciB0aGFuIG91dGVyIGxpc3RzXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGdyb3VwaW5nLFxuXG4gIC8qKlxuICAqIFRoZSBzY2FsZSBmb3Igd2hpY2ggbm9uLWNhdGVnb3JpYWwgKHNlZSB7QGxpbmsgYXhpcyNjYXRlZ29yaWNhbFF9KSB0aWNrcyBzaG91bGQgYmUgc3BhY2VkXG4gICogQHBhcmFtIHtkMy5zY2FsZX0gW3NjYWxlPWQzLnNjYWxlTGluZWFyXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuXG4gIHNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKSxcbiAgLyoqXG4gICogVGhlIHBhZGRpbmcgZm9yIHRoZSBkb21haW4gb2YgdGhlIHNjYWxlIChzZWUge0BsaW5rIGF4aXMjc2NhbGV9KVxuICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtzY2FsZT1kMy5zY2FsZUxpbmVhcl1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZG9tYWluUGFkZGluZyA9IDAuNSxcblxuXG4gIC8qKlxuICAqIERlZmF1bHQgc3BhY2UgZm9yIHRoZSBzcGFjZXIgKHBlcmNlbnRhZ2UpIG9mIG1haW4gZGltZW5zaW9uIGdpdmVuIHRoZSBvcmllbnRhdGlvblxuICAqIChzZWUge0BsaW5rIGF4aXMjb3JpZW50fSksIHdoZXJlIHtAbGluayBheGlzI29yaWVudH09XCJib3R0b21cIiBvciB7QGxpbmsgYXhpcyNvcmllbnR9PVwidG9wXCJcbiAgKiB0aGUgbWFpbiBkaW1lbnNpb24gaXMge0BsaW5rIGF4aXMjc3BhY2VYfSBhbmQgd2hlcmUge0BsaW5rIGF4aXMjb3JpZW50fT1cImxlZnRcIiBvciB7QGxpbmsgYXhpcyNvcmllbnR9PVwicmlnaHRcIlxuICAqIHRoZSBtYWluIGRpbWVuc2lvbiBpcyB7QGxpbmsgYXhpcyNzcGFjZVl9YmV0d2VlbiB0aWNrc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbb2JqZWN0U3BhY2VyPTAuMDVdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG9iamVjdFNwYWNlciA9IDAuMDUsXG4gIC8qKlxuICAqIFRoZSBtaW5pbXVtIHNpemUgdGhhdCBhbiBvYmplY3QgY2FuIGJlIGlmIHtAbGluayBheGlzI2NhdGVnb3JpY2FsUX0gaXMgc2V0IHRvIHRydWVcbiAgKiBAcGFyYW0ge251bWJlcn0gW21pbk9iamVjdFNpemU9MTVdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG1pbk9iamVjdFNpemUgPSAxNSxcbiAgLyoqXG4gICogVGhlIG1heGltdW0gc2l6ZSB0aGF0IGFuIG9iamVjdCBjYW4gYmUgaWYge0BsaW5rIGF4aXMjY2F0ZWdvcmljYWxRfSBpcyBzZXQgdG8gdHJ1ZVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4T2JqZWN0U2l6ZT0xNV1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgbWF4T2JqZWN0U2l6ZSA9IDUwLFxuXG4gIC8qKlxuICAqIENvbG9yIG9mIHRoZSBiYWNrZ3JvdW5kXG4gICogQHBhcmFtIHtzdHJpbmd9IFtiYWNrZ3JvdW5kRmlsbD1cInRyYW5zcGFyZW50XCJdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGJhY2tncm91bmRGaWxsID0gJ3RyYW5zcGFyZW50JyxcbiAgLyoqXG4gICogTmFtZXNwYWNlIGZvciBhbGwgaXRlbXMgbWFkZSBieSB0aGlzIGluc3RhbmNlIG9mIGF4aXNcbiAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVzcGFjZT1cImQzc20tYXhpc1wiXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBuYW1lc3BhY2UgPSAnZDNzbS1heGlzJyxcbiAgLyoqXG4gICogQ2xhc3MgbmFtZSBmb3IgdGljayBjb250YWluZXIgKDxnPiBlbGVtZW50KVxuICAqIEBwYXJhbSB7c3RyaW5nfSBbb2JqZWN0Q2xhc3M9XCJ0aWNrLWdyb3VwXCJdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG9iamVjdENsYXNzID0gJ3RpY2stZ3JvdXAnLFxuXG4gIC8qKlxuICAqIFZhbHVlcyB0byBzaG93IGF0IGVhY2ggdGljay4gT25seSB1c2VkIGlmIGNhdGVnb3JpY2FsUSBpcyBzZXQgdHJ1ZS4gU2VlIHtAbGluayBheGlzI2NhdGVnb3JpY2FsUX1cbiAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbdGlja0xhYmVscz11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHRpY2tMYWJlbHMsICAgLy8gd2hhdCB0byBwbGFjZSBhdCB0aWNrc1xuICAvKipcbiAgKiBWYWx1ZXMgdG8gc2hvdyBhdCBlYWNoIHRpY2suIE9ubHkgdXNlZCBpZiBjYXRlZ29yaWNhbFEgaXMgc2V0IGZhbHNlLiBTZWUge0BsaW5rIGF4aXMjY2F0ZWdvcmljYWxRfVxuICAqIEBwYXJhbSB7c3RyaW5nW10gfCBudW1iZXJbXX0gW29iamVjdENsYXNzPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdGlja1ZhbHVlcywgICAvLyB3aGVyZSB0byBwbGFjZSB0aWNrcyBpZiBub3RcbiAgLyoqXG4gICogTnVtYmVyIG9mIHRpY2tzIHRvIGRpc3BsYXkgaWYgY2F0ZWdvcmljYWxRIGlzIGZhbHNlLiBTZWUge0BsaW5rIGF4aXMjY2F0ZWdvcmljYWxRfVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbbnVtYmVyT2ZUaWNrcz01XVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBudW1iZXJPZlRpY2tzID0gNSxcblxuXG4gIC8qKlxuICAqIFN0cm9rZSBjb2xvciBvZiB0aGUgbWFpbiBheGlzIGxpbmVcbiAgKiBAcGFyYW0ge3N0cmluZ30gW2xpbmVTdHJva2U9J2JsYWNrJ11cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgbGluZVN0cm9rZSA9ICdibGFjaycsXG4gIC8qKlxuICAqIFN0cm9rZSB3aWR0aCBvZiB0aGUgbWFpbiBheGlzIGxpbmVcbiAgKiBAcGFyYW0ge251bWJlcn0gW2xpbmVTdHJva2VXaWR0aD0zXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBsaW5lU3Ryb2tlV2lkdGggPSAzLFxuXG5cbiAgLyoqXG4gICogU3Ryb2tlIGNvbG9yIG9mIHRpY2tzXG4gICogQHBhcmFtIHtzdHJpbmd9IFt0aWNrU3Ryb2tlPSdibGFjayddXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHRpY2tTdHJva2UgPSAnYmxhY2snLFxuICAvKipcbiAgKiBTdHJva2UgbnVtYmVyIG9mIHRpY2tzXG4gICogQHBhcmFtIHtzdHJpbmd9IFt0aWNrU3Ryb2tlV2lkdGg9Ml1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdGlja1N0cm9rZVdpZHRoID0gMixcbiAgLyoqXG4gICogTGVuZ3RoIC0gaW4gcGl4ZWxzIC0gb2YgdGlja3NcbiAgKiBAcGFyYW0ge251bWJlcn0gW3RpY2tMZW5ndGg9MTBdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHRpY2tMZW5ndGggPSAxMCxcblxuXG4gIC8qKlxuICAqIEZvbnQgc2l6ZSBvZiB0aWNrIGxhYmVsc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbdGlja0xhYmVsRm9udFNpemU9MTRdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHRpY2tMYWJlbEZvbnRTaXplID0gMTQsXG4gIC8qKlxuICAqIE1pbiBmb250IHNpemUgb2YgdGljayBsYWJlbHNcbiAgKiBAcGFyYW0ge251bWJlcn0gW3RpY2tMYWJlbE1pbkZvbnRTaXplPThdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHRpY2tMYWJlbE1pbkZvbnRTaXplID0gOCxcbiAgLyoqXG4gICogTWF4IGZvbnQgc2l6ZSBvZiB0aWNrIGxhYmVsc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbdGlja0xhYmVsTWF4Rm9udFNpemU9MjBdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHRpY2tMYWJlbE1heEZvbnRTaXplID0gMjAsXG5cblxuICAvKipcbiAgKiBUZXh0IGFuY2hvciBvZiB0aWNrIGxhYmVsc1xuICAqIEBwYXJhbSB7c3RyaW5nfSBbdGlja0xhYmVsVGV4dEFuY2hvcj1cIm1pZGRsZVwiXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB0aWNrTGFiZWxUZXh0QW5jaG9yID0gJ21pZGRsZScsXG4gIC8qKlxuICAqIFJvdGF0aW9uIG9mIHRpY2sgbGFiZWxzXG4gICogQHBhcmFtIHtudW1iZXJ9IFt0aWNrTGFiZWxSb3RhdGlvbj0wXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB0aWNrTGFiZWxSb3RhdGlvbiA9IDAsXG4gIC8qKlxuICAqIE9wdGlvbmFsIGZ1bmN0aW9uIGZvciBleHRyYWN0aW5nIHRoZSB0aWNrIGxhYmVsIGZyb20gZGF0YVxuICAqIEBwYXJhbSB7ZnVuY3Rpb259IFt0aWNrTGFiZWxGdW5jPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdGlja0xhYmVsRnVuYyA9IHVuZGVmaW5lZCxcblxuXG4gIC8qKlxuICAqIExlbmd0aCBvZiBndWlkZWxpbmVzXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW2d1aWRlbGluZVNwYWNlPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZ3VpZGVsaW5lU3BhY2UsXG4gIC8qKlxuICAqIFN0cm9rZSBjb2xvciBvZiBndWlkbGluZXNcbiAgKiBAcGFyYW0ge3N0cmluZ30gW2d1aWRlbGluZVNwYWNlPVwiIzMzMzMzM1wiXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBndWlkZUxpbmVTdHJva2UgPSAnIzMzMzMzMycsXG4gIC8qKlxuICAqIFN0cm9rZSB3aWR0aCBvZiBndWlkbGluZXNcbiAgKiBAcGFyYW0ge251bWJlcn0gW2d1aWRlbGluZVNwYWNlPTJdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGd1aWRlTGluZVN0cm9rZVdpZHRoID0gMixcblxuICAvKipcbiAgKiBEdXJhdGlvbiBvZiBhbGwgdHJhbnNpdGlvbnMgb2YgdGhpcyBlbGVtZW50XG4gICogQHBhcmFtIHtudW1iZXJ9IFt0cmFuc2l0aW9uRHVyYXRpb249MTAwMF1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdHJhbnNpdGlvbkR1cmF0aW9uID0gMTAwMCxcbiAgLyoqXG4gICogRWFzaW5nIGZ1bmN0aW9uIGZvciB0cmFuc2l0aW9uc1xuICAqIEBwYXJhbSB7ZDMuZWFzZX0gW2Vhc2VGdW5jPWQzLmVhc2VFeHBdXG4gICogQG1lbWJlcm9mIGF4aXMjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGVhc2VGdW5jID0gZDMuZWFzZUV4cCxcblxuXG4gIC8qKlxuICAqIENsb3N1cmUgdmFyaWFibGUgZm9yIGdldHRpbmcgb2JqZWN0IHNpemUgYWZ0ZXIgY2FsY3VsYXRpb25cbiAgKiBAcGFyYW0ge251bWJlcn0gW29iamVjdFNpemU9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBheGlzI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBvYmplY3RTaXplLFxuICAvKipcbiAgKiBDbG9zdXJlIHZhcmlhYmxlIGZvciBnZXR0aW5nIHNwYWNlciBzaXplIGFmdGVyIGNhbGN1bGF0aW9uXG4gICogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZXJTaXplPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc3BhY2VyU2l6ZSxcblxuICAvKipcbiAgKiBEZWNpbWFsIHBlcmNpc2lvbiB0byByb3VuZCBudW1lcmljYWwgdGljayBsYWJlbHMgdG9cbiAgKiBAcGFyYW0ge251bWJlcn0gW3JvdW5kVG89Ml1cbiAgKiBAbWVtYmVyb2YgYXhpcyNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgcm91bmRUbyA9IDJcblxuXG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHNlbGVjdGlvbiBpbiB3aGljaCBpdGVtcyBhcmUgbWFuaXB1bGF0ZWRcbiAgICogQHBhcmFtIHtkMy5zZWxlY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgZDMuc2VsZWN0aW9ufVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzZWxlY3Rpb24gPSBzZWxlY3Rpb25cbiAgICovXG4gIGF4aXMuc2VsZWN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzZWxlY3Rpb24gPSBfLCBheGlzKSA6IHNlbGVjdGlvbjsgfTtcblxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBvcmllbnRhdGlvbiBpbiB3aGljaCBpdGVtcyBhcmUgbWFuaXB1bGF0ZWRcbiAgICogKHNlZSB7QGxpbmsgYXhpcyNvcmllbnR9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV0gc2hvdWxkIGJlIGhvcml6b250YWwgb3IgdmVydGljYWxcbiAgICogQHJldHVybnMge2F4aXMgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG9yaWVudD1cImJvdHRvbVwiXG4gICAqL1xuICBheGlzLm9yaWVudCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob3JpZW50ID0gXywgYXhpcykgOiBvcmllbnQ7IH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGFtb3VudCBvZiBob3Jpem9udGFsIHNwYWNlIGluIHdoaWNoIGl0ZW1zIGFyZSBtYW5pcHVsYXRlZFxuICAgKiAoc2VlIHtAbGluayBheGlzI3NwYWNlWH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXSBzaG91bGQgYmUgYSBudW1iZXIgPiAwXG4gICAqIEByZXR1cm5zIHtheGlzIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzcGFjZVggPSB1bmRlZmluZWRcbiAgICovXG4gIGF4aXMuc3BhY2VYID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzcGFjZVggPSBfLCBheGlzKSA6IHNwYWNlWDsgfTtcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgYW1vdW50IG9mIHZlcnRpY2FsIHNwYWNlIGluIHdoaWNoIGl0ZW1zIGFyZSBtYW5pcHVsYXRlZFxuICAgKiAoc2VlIHtAbGluayBheGlzI3NwYWNlWX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXSBzaG91bGQgYmUgYSBudW1iZXIgPiAwXG4gICAqIEByZXR1cm5zIHtheGlzIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzcGFjZVkgPSB1bmRlZmluZWRcbiAgICovXG4gIGF4aXMuc3BhY2VZID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzcGFjZVkgPSBfLCBheGlzKSA6IHNwYWNlWTsgfTtcblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB3aGV0aGVyIG9yIG5vdCBheGlzIGlzIGFsbG93ZWQgdG8gZ28gYmV5b25kIHNwZWNpZmllZCBkaW1lbnNpb25zXG4gICAqIChzZWUge0BsaW5rIGF4aXMjc3BhY2VYfSlcbiAgICogQHBhcmFtIHtib29sZWFufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IGJvb2xlYW59XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG92ZXJmbG93USA9IGZhbHNlXG4gICAqL1xuICBheGlzLm92ZXJmbG93USA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob3ZlcmZsb3dRID0gXywgYXhpcykgOiBvdmVyZmxvd1E7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB3aGV0aGVyIG9yIG5vdCBheGlzIHdpbGwgZGlzcGxheSBjYXRlZ29yaWFsIHRpY2tzIG9yIGJ5IG51bWVyaWNhbCB2YWx1ZVxuICAgKiAoc2VlIHtAbGluayBheGlzI2NhdGVnb3JpY2FsUX0pXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBib29sZWFufVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBjYXRlZ29yaWNhbFEgPSBmYWxzZVxuICAgKi9cbiAgYXhpcy5jYXRlZ29yaWNhbFEgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNhdGVnb3JpY2FsUSA9IF8sIGF4aXMpIDogY2F0ZWdvcmljYWxROyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgd2hldGhlciBvciBub3QgYXhpcyB0aWNrcyBzaG91bGQgaGF2ZSBndWlkZWxpbmVzXG4gICAqIChzZWUge0BsaW5rIGF4aXMjZ3VpZGVMaW5lc1F9KVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgYm9vbGVhbn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgZ3VpZGVMaW5lc1EgPSBmYWxzZVxuICAgKi9cbiAgYXhpcy5ndWlkZUxpbmVzUSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZ3VpZGVMaW5lc1EgPSBfLCBheGlzKSA6IGd1aWRlTGluZXNROyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIGhvdyB0aWNrcyBzaG91bGQgYmUgZ3JvdXBwZWRcbiAgICogKHNlZSB7QGxpbmsgYXhpcyNncm91cGluZ30pXG4gICAqIEBwYXJhbSB7QXJyYXlbXX0gW189bm9uZV0gbGlzdCBvZiBwdXRhdGl2ZWx5IG90aGVyIGxpc3RzLCB3aGljaCBzaG91bGQgY29ycmVzcG9uZCB0byB0aWNrTGFiZWxzXG4gICAqIHdpbGwgc3BhY2UgdGljayBsYWJlbHMgaW4gbmVzdGVkIGxpc3RzIGNsb3NlciB0b2dldGhlciB0aGFuIG91dGVyIGxpc3RzXG4gICAqIEByZXR1cm5zIHtheGlzIHwgQXJyYXlbXX1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgZ3JvdXBpbmcgPSB1bmRlZmluZWRcbiAgICovXG4gIGF4aXMuZ3JvdXBpbmcgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGdyb3VwaW5nID0gXywgYXhpcykgOiBncm91cGluZzsgfTtcblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgc2NhbGUgZm9yIHdoaWNoIG5vbi1jYXRlZ29yaWFsICB0aWNrcyBzaG91bGRcbiAgICogYmUgc3BhY2VkXG4gICAqIChzZWUge0BsaW5rIGF4aXMjc2NhbGV9KVxuICAgKiBAcGFyYW0ge2QzLnNjYWxlfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IGQzLnNjYWxlfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzY2FsZSA9IGQzLnNjYWxlTGluZWFyKClcbiAgICovXG4gIGF4aXMuc2NhbGUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNjYWxlID0gXywgYXhpcykgOiBzY2FsZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBwYWRkaW5nIGZvciB0aGUgZG9tYWluIG9mIHRoZSBzY2FsZVxuICAgKiAoc2VlIHtAbGluayBheGlzI2RvbWFpblBhZGRpbmd9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGRvbWFpblBhZGRpbmcgPSAwLjVcbiAgICovXG4gIGF4aXMuZG9tYWluUGFkZGluZyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluUGFkZGluZyA9IF8sIGF4aXMpIDogZG9tYWluUGFkZGluZzsgfTtcblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyBvYmplY3RTcGFjZXJcbiAgICogKHNlZSB7QGxpbmsgYXhpcyNvYmplY3RTcGFjZXJ9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG9iamVjdFNwYWNlciA9IDAuMDVcbiAgICovXG4gIGF4aXMub2JqZWN0U3BhY2VyID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvYmplY3RTcGFjZXIgPSBfLCBheGlzKSA6IG9iamVjdFNwYWNlcjsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBtaW5PYmplY3RTaXplXG4gICAqIChzZWUge0BsaW5rIGF4aXMjbWluT2JqZWN0U2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgbWluT2JqZWN0U2l6ZSA9IDE1XG4gICAqL1xuICBheGlzLm1pbk9iamVjdFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG1pbk9iamVjdFNpemUgPSBfLCBheGlzKSA6IG1pbk9iamVjdFNpemU7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbWF4T2JqZWN0U2l6ZVxuICAgKiAoc2VlIHtAbGluayBheGlzI21heE9iamVjdFNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG1heE9iamVjdFNpemUgPSA1MFxuICAgKi9cbiAgYXhpcy5tYXhPYmplY3RTaXplID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChtYXhPYmplY3RTaXplID0gXywgYXhpcykgOiBtYXhPYmplY3RTaXplOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBuYW1lc3BhY2VcbiAgICogKHNlZSB7QGxpbmsgYXhpcyNuYW1lc3BhY2V9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG5hbWVzcGFjZSA9ICdkM3NtLWF4aXMnXG4gICAqL1xuICBheGlzLm5hbWVzcGFjZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobmFtZXNwYWNlID0gXywgYXhpcykgOiBuYW1lc3BhY2U7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgYmFja2dyb3VuZEZpbGxcbiAgICogKHNlZSB7QGxpbmsgYXhpcyNiYWNrZ3JvdW5kRmlsbH0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgYmFja2dyb3VuZEZpbGwgPSAndHJhbnNwYXJlbnQnXG4gICAqL1xuICBheGlzLmJhY2tncm91bmRGaWxsID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChiYWNrZ3JvdW5kRmlsbCA9IF8sIGF4aXMpIDogYmFja2dyb3VuZEZpbGw7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgb2JqZWN0Q2xhc3NcbiAgICogKHNlZSB7QGxpbmsgYXhpcyNvYmplY3RDbGFzc30pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgb2JqZWN0Q2xhc3MgPSAndGljay1ncm91cCdcbiAgICovXG4gIGF4aXMub2JqZWN0Q2xhc3MgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9iamVjdENsYXNzID0gXywgYXhpcykgOiBvYmplY3RDbGFzczsgfTtcblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdGlja0xhYmVsc1xuICAgKiAoc2VlIHtAbGluayBheGlzI3RpY2tMYWJlbHN9KVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IHN0cmluZ1tdfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0aWNrTGFiZWxzID0gdW5kZWZpbmVkXG4gICAqL1xuICBheGlzLnRpY2tMYWJlbHMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tMYWJlbHMgPSBfLCBheGlzKSA6IHRpY2tMYWJlbHM7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdGlja1ZhbHVlc1xuICAgKiAoc2VlIHtAbGluayBheGlzI3RpY2tWYWx1ZXN9KVxuICAgKiBAcGFyYW0ge251bWJlcltdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcltdfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0aWNrVmFsdWVzID0gdW5kZWZpbmVkXG4gICAqL1xuICBheGlzLnRpY2tWYWx1ZXMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tWYWx1ZXMgPSBfLCBheGlzKSA6IHRpY2tWYWx1ZXM7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdGlja1ZhbHVlc1xuICAgKiAoc2VlIHtAbGluayBheGlzI251bWJlck9mVGlja3N9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG51bWJlck9mVGlja3MgPSA1XG4gICAqL1xuICBheGlzLm51bWJlck9mVGlja3MgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG51bWJlck9mVGlja3MgPSBfLCBheGlzKSA6IG51bWJlck9mVGlja3M7IH07XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGxpbmVTdHJva2VcbiAgICogKHNlZSB7QGxpbmsgYXhpcyNsaW5lU3Ryb2tlfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBsaW5lU3Ryb2tlID0gJ2JsYWNrJ1xuICAgKi9cbiAgYXhpcy5saW5lU3Ryb2tlID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChsaW5lU3Ryb2tlID0gXywgYXhpcykgOiBsaW5lU3Ryb2tlOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGxpbmVTdHJva2VXaWR0aFxuICAgKiAoc2VlIHtAbGluayBheGlzI2xpbmVTdHJva2VXaWR0aH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgbGluZVN0cm9rZVdpZHRoID0gM1xuICAgKi9cbiAgYXhpcy5saW5lU3Ryb2tlV2lkdGggPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGxpbmVTdHJva2VXaWR0aCA9IF8sIGF4aXMpIDogbGluZVN0cm9rZVdpZHRoOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB0aWNrU3Ryb2tlXG4gICAqIChzZWUge0BsaW5rIGF4aXMjdGlja1N0cm9rZX0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdGlja1N0cm9rZSA9ICdibGFjaydcbiAgICovXG4gIGF4aXMudGlja1N0cm9rZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja1N0cm9rZSA9IF8sIGF4aXMpIDogdGlja1N0cm9rZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB0aWNrU3Ryb2tlV2lkdGhcbiAgICogKHNlZSB7QGxpbmsgYXhpcyN0aWNrU3Ryb2tlV2lkdGh9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHRpY2tTdHJva2VXaWR0aCA9IDJcbiAgICovXG4gIGF4aXMudGlja1N0cm9rZVdpZHRoID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrU3Ryb2tlV2lkdGggPSBfLCBheGlzKSA6IHRpY2tTdHJva2VXaWR0aDsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB0aWNrTGVuZ3RoXG4gICAqIChzZWUge0BsaW5rIGF4aXMjdGlja0xlbmd0aH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdGlja0xlbmd0aCA9IDEwXG4gICAqL1xuICBheGlzLnRpY2tMZW5ndGggPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tMZW5ndGggPSBfLCBheGlzKSA6IHRpY2tMZW5ndGg7IH07XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRpY2tMYWJlbEZvbnRTaXplXG4gICAqIChzZWUge0BsaW5rIGF4aXMjdGlja0xhYmVsRm9udFNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHRpY2tMYWJlbEZvbnRTaXplID0gMTRcbiAgICovXG4gIGF4aXMudGlja0xhYmVsRm9udFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tMYWJlbEZvbnRTaXplID0gXywgYXhpcykgOiB0aWNrTGFiZWxGb250U2l6ZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB0aWNrTGFiZWxNaW5Gb250U2l6ZVxuICAgKiAoc2VlIHtAbGluayBheGlzI3RpY2tMYWJlbE1pbkZvbnRTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0aWNrTGFiZWxNaW5Gb250U2l6ZSA9IDhcbiAgICovXG4gIGF4aXMudGlja0xhYmVsTWluRm9udFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tMYWJlbE1pbkZvbnRTaXplID0gXywgYXhpcykgOiB0aWNrTGFiZWxNaW5Gb250U2l6ZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB0aWNrTGFiZWxNYXhGb250U2l6ZVxuICAgKiAoc2VlIHtAbGluayBheGlzI3RpY2tMYWJlbE1heEZvbnRTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0aWNrTGFiZWxNYXhGb250U2l6ZSA9IDIwXG4gICAqL1xuICBheGlzLnRpY2tMYWJlbE1heEZvbnRTaXplID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrTGFiZWxNYXhGb250U2l6ZSA9IF8sIGF4aXMpIDogdGlja0xhYmVsTWF4Rm9udFNpemU7fTtcblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdGlja0xhYmVsVGV4dEFuY2hvclxuICAgKiAoc2VlIHtAbGluayBheGlzI3RpY2tMYWJlbFRleHRBbmNob3J9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHRpY2tMYWJlbFRleHRBbmNob3IgPSAnY2VudGVyJ1xuICAgKi9cbiAgYXhpcy50aWNrTGFiZWxUZXh0QW5jaG9yID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrTGFiZWxUZXh0QW5jaG9yID0gXywgYXhpcykgOiB0aWNrTGFiZWxUZXh0QW5jaG9yOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRpY2tMYWJlbFJvdGF0aW9uXG4gICAqIChzZWUge0BsaW5rIGF4aXMjdGlja0xhYmVsUm90YXRpb259KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHRpY2tMYWJlbFJvdGF0aW9uID0gMFxuICAgKi9cbiAgYXhpcy50aWNrTGFiZWxSb3RhdGlvbiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja0xhYmVsUm90YXRpb24gPSBfLCBheGlzKSA6IHRpY2tMYWJlbFJvdGF0aW9uOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRpY2tMYWJlbEZ1bmNcbiAgICogKHNlZSB7QGxpbmsgYXhpcyN0aWNrTGFiZWxGdW5jfSlcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBmdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdGlja0xhYmVsRnVuYyA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYXhpcy50aWNrTGFiZWxGdW5jID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrTGFiZWxGdW5jID0gXywgYXhpcykgOiB0aWNrTGFiZWxGdW5jOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBndWlkZWxpbmVTcGFjZVxuICAgKiAoc2VlIHtAbGluayBheGlzI2d1aWRlbGluZVNwYWNlfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBndWlkZWxpbmVTcGFjZSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYXhpcy5ndWlkZWxpbmVTcGFjZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZ3VpZGVsaW5lU3BhY2UgPSBfLCBheGlzKSA6IGd1aWRlbGluZVNwYWNlOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGd1aWRlTGluZVN0cm9rZVxuICAgKiAoc2VlIHtAbGluayBheGlzI2d1aWRlTGluZVN0cm9rZX0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgZ3VpZGVMaW5lU3Ryb2tlID0gXCIjMzMzMzMzXCJcbiAgICovXG4gIGF4aXMuZ3VpZGVMaW5lU3Ryb2tlID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChndWlkZUxpbmVTdHJva2UgPSBfLCBheGlzKSA6IGd1aWRlTGluZVN0cm9rZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBndWlkZUxpbmVTdHJva2VXaWR0aFxuICAgKiAoc2VlIHtAbGluayBheGlzI2d1aWRlTGluZVN0cm9rZVdpZHRofSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBndWlkZUxpbmVTdHJva2VXaWR0aCA9IDJcbiAgICovXG4gIGF4aXMuZ3VpZGVMaW5lU3Ryb2tlV2lkdGggPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGd1aWRlTGluZVN0cm9rZVdpZHRoID0gXywgYXhpcykgOiBndWlkZUxpbmVTdHJva2VXaWR0aDsgfTtcblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdHJhbnNpdGlvbkR1cmF0aW9uXG4gICAqIChzZWUge0BsaW5rIGF4aXMjdHJhbnNpdGlvbkR1cmF0aW9ufSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtheGlzIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0cmFuc2l0aW9uRHVyYXRpb24gPSAxMDAwXG4gICAqL1xuICBheGlzLnRyYW5zaXRpb25EdXJhdGlvbiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodHJhbnNpdGlvbkR1cmF0aW9uID0gXywgYXhpcykgOiB0cmFuc2l0aW9uRHVyYXRpb247IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgZWFzZUZ1bmNcbiAgICogKHNlZSB7QGxpbmsgYXhpcyNlYXNlRnVuY30pXG4gICAqIEBwYXJhbSB7ZDMuZWFzZX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBkMy5lYXNlfVxuICAgKiBAbWVtYmVyb2YgYXhpc1xuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBlYXNlRnVuYyA9IGQzLmVhc2VFeHBcbiAgICovXG4gIGF4aXMuZWFzZUZ1bmMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGVhc2VGdW5jID0gXywgYXhpcykgOiBlYXNlRnVuYzsgfTtcblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgb2JqZWN0U2l6ZVxuICAgKiAoc2VlIHtAbGluayBheGlzI29iamVjdFNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG9iamVjdFNpemUgPSB1bmRlZmluZWRcbiAgICovXG4gIGF4aXMub2JqZWN0U2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob2JqZWN0U2l6ZSA9IF8sIGF4aXMpIDogb2JqZWN0U2l6ZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBzcGFjZXJTaXplXG4gICAqIChzZWUge0BsaW5rIGF4aXMjc3BhY2VyU2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YXhpcyB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGF4aXNcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc3BhY2VyU2l6ZSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYXhpcy5zcGFjZXJTaXplID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzcGFjZXJTaXplID0gXywgYXhpcykgOiBzcGFjZXJTaXplOyB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgcm91bmRUb1xuICAgKiAoc2VlIHtAbGluayBheGlzI3JvdW5kVG99KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2F4aXMgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBheGlzXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHJvdW5kVG8gPSAyXG4gICAqL1xuICBheGlzLnJvdW5kVG8gPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJvdW5kVG8gPSBfLCBheGlzKSA6IHJvdW5kVG87IH07XG5cblxuXG4gIGZ1bmN0aW9uIGF4aXMgKCkge1xuICAgIC8vIGZvciBjb252ZW5pZW5jZSBpbiBoYW5kbGluZyBvcmllbnRhdGlvbiBzcGVjaWZpYyB2YWx1ZXNcbiAgICB2YXIgaG9yaXpvbnRhbFEgPSBoYXNRKFsndG9wJywgJ2JvdHRvbScsICdob3Jpem9udGFsJ10sb3JpZW50KSA/IHRydWUgOiBmYWxzZVxuICAgIHZhciB2ZXJ0aWNhbFEgPSAhaG9yaXpvbnRhbFFcblxuICAgIC8vIGJhY2tncm91bmQgY2xpcGluZyByZWN0YW5nbGVcbiAgICB2YXIgYmdjcFJlY3QgPSB7eDowLCB5OjAsIHdpZHRoOiBzcGFjZVgsIGhlaWdodDpzcGFjZVl9XG4gICAgaWYgKG9yaWVudCA9PSBcImxlZnRcIikgeyBiZ2NwUmVjdC54IC09IHNwYWNlWDsgIGlmKGd1aWRlTGluZXNRKSB7IGJnY3BSZWN0LndpZHRoICs9IGd1aWRlbGluZVNwYWNlIH07IGJnY3BSZWN0LnkgLT0gdGlja0xhYmVsTWF4Rm9udFNpemU7IGJnY3BSZWN0LmhlaWdodCArPSAyKnRpY2tMYWJlbE1heEZvbnRTaXplICB9XG4gICAgaWYgKG9yaWVudCA9PSBcImJvdHRvbVwiKXsgYmdjcFJlY3QueSA9IGJnY3BSZWN0Lnk7XG4gICAgICBpZihndWlkZUxpbmVzUSkgeyBiZ2NwUmVjdC55IC09IGd1aWRlbGluZVNwYWNlOyBiZ2NwUmVjdC5oZWlnaHQgKz0gZ3VpZGVsaW5lU3BhY2U7IH07XG4gICAgICBiZ2NwUmVjdC54IC09IHRpY2tMYWJlbE1heEZvbnRTaXplOyBiZ2NwUmVjdC53aWR0aCArPSAyKnRpY2tMYWJlbE1heEZvbnRTaXplXG5cbiAgICB9XG4gICAgaWYgKG9yaWVudCA9PSBcInRvcFwiKSB7IGJnY3BSZWN0LnkgLT0gc3BhY2VZO1xuICAgICAgaWYoZ3VpZGVMaW5lc1EpIHsgYmdjcFJlY3QuaGVpZ2h0ICs9IGd1aWRlbGluZVNwYWNlIH07XG4gICAgICAvLyBiZ2NwUmVjdC55IC09IHRpY2tMYWJlbE1heEZvbnRTaXplOyBiZ2NwUmVjdC5oZWlnaHQgKz0gMip0aWNrTGFiZWxNYXhGb250U2l6ZVxuICAgIH1cbiAgICBpZiAob3JpZW50ID09IFwicmlnaHRcIikgeyBiZ2NwUmVjdC54ID0gMDtcbiAgICAgIGlmKGd1aWRlTGluZXNRKSB7IGJnY3BSZWN0LndpZHRoICs9IGd1aWRlbGluZVNwYWNlOyBiZ2NwUmVjdC54IC09IGd1aWRlbGluZVNwYWNlIH07XG4gICAgICBiZ2NwUmVjdC55IC09IHRpY2tMYWJlbE1heEZvbnRTaXplOyBiZ2NwUmVjdC5oZWlnaHQgKz0gMip0aWNrTGFiZWxNYXhGb250U2l6ZVxuICAgICAgY29uc29sZS5sb2coYmdjcFJlY3QpXG4gICAgfVxuXG5cbiAgICB2YXIgY29udGFpbmVyID0gc2V0dXBDb250YWluZXIoIHNlbGVjdGlvbiwgbmFtZXNwYWNlLCBiZ2NwUmVjdCwgYmFja2dyb3VuZEZpbGwgKTtcblxuICAgIC8vIHZhciB0aWNrcyA9ICBzYWZlU2VsZWN0KGNvbnRhaW5lciwgJ2cnLCBoeXBlbmF0ZShuYW1lc3BhY2UsJ2F4aXMtdGlja3MnKSlcbiAgICAvLyB2YXIgbGFiZWxzID0gIHNhZmVTZWxlY3QoY29udGFpbmVyLCAnZycsIGh5cGVuYXRlKG5hbWVzcGFjZSwnYXhpcy1sYWJlbHMnKSlcbiAgICAvLyB2YXIgZ3VpZGxpbmVzID0gIHNhZmVTZWxlY3QoY29udGFpbmVyLCAnZycsIGh5cGVuYXRlKG5hbWVzcGFjZSwnZ3VpZGVsaW5lLWNvbnRhaW5lcicpKVxuICAgIC8vXG4gICAgLy8gdmFyIHRpY2tzID0gdGlja3Muc2VsZWN0QWxsKCcuJytoeXBlbmF0ZShuYW1lc3BhY2UsJ3RpY2snKSlcbiAgICAvLyB2YXIgbGFiZWxzID0gbGFiZWxzLnNlbGVjdEFsbCgnLicraHlwZW5hdGUobmFtZXNwYWNlLCdsYWJlbCcpKVxuICAgIC8vIHZhciBnbGluZXMgPSBndWlkbGluZXMuc2VsZWN0QWxsKCcuJytoeXBlbmF0ZShuYW1lc3BhY2UsJ2d1aWRlbGluZScpKVxuXG4gICAgaWYgKG9yaWVudCA9PSAndG9wJykge3RpY2tMYWJlbFRleHRBbmNob3IgPSAnc3RhcnQnOyB0aWNrTGFiZWxSb3RhdGlvbiA9IDkwfVxuICAgIGlmIChvcmllbnQgPT0gJ2JvdHRvbScpIHt0aWNrTGFiZWxUZXh0QW5jaG9yID0gJ2VuZCc7IHRpY2tMYWJlbFJvdGF0aW9uID0gLTkwfVxuICAgIGlmIChvcmllbnQgPT0gJ2xlZnQnKSB7dGlja0xhYmVsVGV4dEFuY2hvciA9ICdlbmQnOyB0aWNrTGFiZWxSb3RhdGlvbiA9IDB9XG4gICAgaWYgKG9yaWVudCA9PSAncmlnaHQnKSB7dGlja0xhYmVsVGV4dEFuY2hvciA9ICdzdGFydCc7IHRpY2tMYWJlbFJvdGF0aW9uID0gMH1cblxuXG4gICAgdmFyIHRpY2tEYXRhID0gY2F0ZWdvcmljYWxRXG4gICAgPyAoZ3JvdXBpbmcgPT0gdW5kZWZpbmVkKSA/IHRpY2tMYWJlbHMgOiBncm91cGluZ1xuICAgIDogKGdyb3VwaW5nID09IHVuZGVmaW5lZClcbiAgICAgID8gKG51bWJlck9mVGlja3MgIT0gdW5kZWZpbmVkKVxuICAgICAgLy8gPyAodGlja1ZhbHVlcy5sZW5ndGggPCBudW1iZXJPZlRpY2tzKVxuICAgICAgICA/ICh0aWNrUmFuZ2UoLi4uZDMuZXh0ZW50KHRpY2tWYWx1ZXMpLCBudW1iZXJPZlRpY2tzKSlcbiAgICAgICAgOiB0aWNrVmFsdWVzXG4gICAgICA6IGdyb3VwaW5nXG5cbiAgICB2YXIgZmxhdFRpY2tEYXRhID0gZmxhdHRlbih0aWNrRGF0YSlcbiAgICB2YXIgbnVtYmVyT2ZPYmplY3RzID0gZmxhdFRpY2tEYXRhLmxlbmd0aFxuICAgIHZhciBzcGFjZSA9IGhvcml6b250YWxRID8gc3BhY2VYIDogc3BhY2VZXG4gICAgdmFyIGV4dGVudCA9IGQzLmV4dGVudChmbGF0VGlja0RhdGEpXG5cbiAgICBzY2FsZVxuICAgIC5kb21haW4oW2V4dGVudFswXSAtIGRvbWFpblBhZGRpbmcsIGV4dGVudFsxXSArIGRvbWFpblBhZGRpbmddKVxuICAgIC5yYW5nZShbaG9yaXpvbnRhbFEgPyAwIDogc3BhY2VZLCBob3Jpem9udGFsUSA/IHNwYWNlWCA6IDBdKVxuXG4gICAgLy8gY2FsY3VsYXRlIG9iamVjdCBzaXplXG4gICAgb2JqZWN0U2l6ZSA9IChvYmplY3RTaXplID09IHVuZGVmaW5lZClcbiAgICA/IGNhbGN1bGF0ZVdpZHRoT2ZPYmplY3Qoc3BhY2UsIG51bWJlck9mT2JqZWN0cywgbWluT2JqZWN0U2l6ZSwgbWF4T2JqZWN0U2l6ZSwgb2JqZWN0U3BhY2VyLCBvdmVyZmxvd1EpXG4gICAgOiBvYmplY3RTaXplXG5cbiAgICAvLyBjYWxjdWxhdGUgc3BhY2VyIHNpemUgaWYgbmVlZGVkXG4gICAgc3BhY2VyU2l6ZSA9IChzcGFjZXJTaXplID09IHVuZGVmaW5lZClcbiAgICA/IGNhbGN1bGF0ZVdpZHRoT2ZTcGFjZXIoZmxhdFRpY2tEYXRhLCBzcGFjZSwgb2JqZWN0U2l6ZSwgbnVtYmVyT2ZPYmplY3RzLCBvYmplY3RTcGFjZXIsIG92ZXJmbG93USlcbiAgICA6IHNwYWNlclNpemVcblxuICAgIHZhciBvYmpDbGFzcyA9IGh5cGVuYXRlKG5hbWVzcGFjZSwgY2F0ZWdvcmljYWxRID8gb2JqZWN0Q2xhc3MrJy1jYXRlZ29yaWNhbCcgOiBvYmplY3RDbGFzcylcblxuICAgIHZhciBzcGFjZXJGdW5jdGlvbiA9IGdyb3VwaW5nU3BhY2VyKClcbiAgICAuaG9yaXpvbnRhbFEoaG9yaXpvbnRhbFEpLnNjYWxlKHNjYWxlKS5tb3ZlYnkoKGNhdGVnb3JpY2FsUT8nY2F0ZWdvcnknOidzY2FsZScpKS5udW1iZXJPZk9iamVjdHMobnVtYmVyT2ZPYmplY3RzKVxuICAgIC5vYmplY3RDbGFzcyhvYmpDbGFzcykub2JqZWN0U2l6ZShvYmplY3RTaXplKS5zcGFjZXJTaXplKHNwYWNlclNpemUpXG4gICAgLnRyYW5zaXRpb25EdXJhdGlvbih0cmFuc2l0aW9uRHVyYXRpb24pLmVhc2VGdW5jKGVhc2VGdW5jKVxuICAgIC5uYW1lc3BhY2UobmFtZXNwYWNlKVxuXG4gICAgdmFyIHRpY2tFbnRlckFuaW1hdGlvbiA9IGZ1bmN0aW9uKHNlbCl7XG4gICAgICB2YXIgbXQgPSBzY2FsZShzZWwuZGF0dW0oKSksXG4gICAgICBkaXN0ID0gc2NhbGUoZXh0ZW50WzFdKSAqIDIsXG4gICAgICBrID0gKG10IDwgZXh0ZW50WzFdIC8gMikgPyAxIDogLTFcbiAgICAgIGsgPSBob3Jpem9udGFsUSA/IGsgKiAtMSA6IGtcbiAgICAgIHNlbC5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbiAoZCwgaSkge1xuICAgICAgICB2YXJcbiAgICAgICAgeCA9IGhvcml6b250YWxRID8gIGRpc3QgKiBrIDogMCxcbiAgICAgICAgeSA9ICFob3Jpem9udGFsUSA/IGRpc3QgKiBrIDogMCxcbiAgICAgICAgdCA9ICd0cmFuc2xhdGUoJyt4KycsJyt5KycpJ1xuICAgICAgICByZXR1cm4gdFxuICAgICAgfSlcbiAgICB9XG4gICAgdmFyIHRpY2tFeGl0QW5pbWF0aW9uID0gZnVuY3Rpb24oc2VsKSB7XG4gICAgICB2YXIgbXQgPSBzY2FsZShzZWwuZGF0dW0oKSksXG4gICAgICBkaXN0ID0gc2NhbGUoZXh0ZW50WzFdKSAqIDIsXG4gICAgICBrID0gKG10IDwgZXh0ZW50WzFdIC8gMikgPyAxIDogLTFcbiAgICAgIGsgPSBob3Jpem9udGFsUSA/IGsgKiAtMSA6IGtcbiAgICAgIHNlbC50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlKGVhc2VGdW5jKVxuICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMClcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbiAoZCwgaSkge1xuICAgICAgICB2YXJcblxuICAgICAgICB4ID0gaG9yaXpvbnRhbFEgPyAgZGlzdCAqIGsgIDogMCxcbiAgICAgICAgeSA9ICFob3Jpem9udGFsUSA/IGRpc3QgKiBrIDogMCxcbiAgICAgICAgdCA9ICd0cmFuc2xhdGUoJyt4KycsJyt5KycpJ1xuICAgICAgICByZXR1cm4gdFxuICAgICAgfSkucmVtb3ZlKClcbiAgICB9XG5cbiAgICBpZiAoIWNhdGVnb3JpY2FsUSl7XG4gICAgICBzcGFjZXJGdW5jdGlvbi5lbnRlckZ1bmN0aW9uKHRpY2tFbnRlckFuaW1hdGlvbilcbiAgICAgIHNwYWNlckZ1bmN0aW9uLmV4aXRGdW5jdGlvbih0aWNrRXhpdEFuaW1hdGlvbilcbiAgICB9XG5cblxuXG4gICAgc3BhY2VyRnVuY3Rpb24oY29udGFpbmVyLCB0aWNrRGF0YSwgMClcblxuICAgIGZ1bmN0aW9uIG1vdmVYQnkoZCwgaSwgaG9yaXpvbnRhbFEsIGNhdGVnb3JpY2FsUSwgb2JqZWN0U2l6ZSl7XG4gICAgICByZXR1cm4gKGhvcml6b250YWxRKVxuICAgICAgPyAoY2F0ZWdvcmljYWxRKVxuICAgICAgICA/IG9iamVjdFNpemUgLyAyXG4gICAgICAgIDogMFxuICAgICAgOiAwXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW92ZVlCeShkLCBpLCB2ZXJ0aWNhbFEsIGNhdGVnb3JpY2FsUSwgb2JqZWN0U2l6ZSl7XG4gICAgICByZXR1cm4gKHZlcnRpY2FsUSlcbiAgICAgID8gKGNhdGVnb3JpY2FsUSlcbiAgICAgICAgPyBvYmplY3RTaXplIC8gMlxuICAgICAgICA6IDBcbiAgICAgIDogMFxuICAgIH1cblxuICAgIC8vIG1ha2VOZXN0ZWRHcm91cHMoY29udGFpbmVyLCB0aWNrRGF0YSwgaG9yaXpvbnRhbFEsIHNjYWxlLCAoY2F0ZWdvcmljYWxRPydjYXRlZ29yeSc6J3NjYWxlJyksb2JqQ2xhc3MsIG9iamVjdFNpemUsIHNwYWNlclNpemUsIHVuZGVmaW5lZCwgdHJhbnNpdGlvbkR1cmF0aW9uLCBlYXNlRnVuYylcblxuICAgIHZhciB0aWNrcyA9IGNvbnRhaW5lci5zZWxlY3RBbGwoJ2c6bm90KC50by1yZW1vdmUpLicrb2JqQ2xhc3MpLmVhY2goZnVuY3Rpb24oZCwgaSl7XG4gICAgICB2YXIgdGhhdCA9IGQzLnNlbGVjdCh0aGlzKS5zdHlsZSgnb3BhY2l0eScsIDEpXG5cbiAgICAgIHZhciB0aWNrID0gc2FmZVNlbGVjdCh0aGF0LCAnbGluZScsIGh5cGVuYXRlKG5hbWVzcGFjZSwndGljaycpKVxuICAgICAgLmF0dHIoXCJ4MVwiLCAwKVxuICAgICAgLmF0dHIoXCJ4MlwiLCBob3Jpem9udGFsUSA/IDAgOiBvcmllbnQgPT0gXCJsZWZ0XCIgPyAtdGlja0xlbmd0aCA6IHRpY2tMZW5ndGgpXG4gICAgICAuYXR0cihcInkxXCIsIDApXG4gICAgICAuYXR0cigneTInLCAgdmVydGljYWxRID8gMCA6IG9yaWVudCA9PSBcInRvcFwiID8gLXRpY2tMZW5ndGggOiB0aWNrTGVuZ3RoKVxuICAgICAgLmF0dHIoJ3N0cm9rZScsIHRpY2tTdHJva2UpXG4gICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgdGlja1N0cm9rZVdpZHRoKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uKGQsIGkpIHtcbiAgICAgICAgdmFyXG4gICAgICAgIHggPSBtb3ZlWEJ5KGQsIGksIGhvcml6b250YWxRLCBjYXRlZ29yaWNhbFEsIG9iamVjdFNpemUpLFxuICAgICAgICB5ID0gbW92ZVlCeShkLCBpLCB2ZXJ0aWNhbFEsIGNhdGVnb3JpY2FsUSwgb2JqZWN0U2l6ZSksXG4gICAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgICAgcmV0dXJuIHRcbiAgICAgIH0pXG5cbiAgICAgIHZhciBsYWJlbCA9IHNhZmVTZWxlY3QodGhhdCwgJ3RleHQnLCBoeXBlbmF0ZShuYW1lc3BhY2UsJ2xhYmVsJykpXG4gICAgICAudGV4dChmdW5jdGlvbihkLCBpKXsgcmV0dXJuIHR5cGVvZiBkID09ICdudW1iZXInID8gcm91bmQoZCwgcm91bmRUbykgOiBkfSlcbiAgICAgIC5hdHRyKCdmb250LXNpemUnLCB0aWNrTGFiZWxGb250U2l6ZSlcbiAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsIHRpY2tMYWJlbFRleHRBbmNob3IpXG5cbiAgICAgIHRydW5jYXRlVGV4dChsYWJlbCwgbGFiZWwudGV4dCgpLCBvcmllbnQsIHRpY2tMZW5ndGgsIGhvcml6b250YWxRID8gc3BhY2VZIDogc3BhY2VYLCBvdmVyZmxvd1EpXG5cbiAgICAgIGxhYmVsLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uKGQsIGkpIHtcbiAgICAgICAgdmFyXG4gICAgICAgIHJlY3QgPSBkMy5zZWxlY3QodGhpcykubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgICAgICB4ID0gbW92ZVhCeShkLCBpLCBob3Jpem9udGFsUSwgY2F0ZWdvcmljYWxRLCBvYmplY3RTaXplKSxcbiAgICAgICAgeSA9IG1vdmVZQnkoZCwgaSwgdmVydGljYWxRLCBjYXRlZ29yaWNhbFEsIG9iamVjdFNpemUpXG4gICAgICAgIC8vIG9uIHJlY2FsbCwgcmVjdCBjaGFuZ2VzIGJlY2F1c2Ugb2Ygcm90YXRpb24gc28gbmVlZCBNYXRoLm1pbihyZWN0LmhlaWdodCwgcmVjdC53aWR0aClcblxuICAgICAgICBpZiAob3JpZW50ID09ICd0b3AnKSB7eSA9IC10aWNrTGVuZ3RoOyB5LT1NYXRoLm1heChyZWN0LmhlaWdodCwgcmVjdC53aWR0aCk7eCAtPSBNYXRoLm1pbihyZWN0LmhlaWdodCwgcmVjdC53aWR0aCkgKiAwLjI1fVxuICAgICAgICBpZiAob3JpZW50ID09ICdib3R0b20nKSB7eSA9IHRpY2tMZW5ndGg7IHggKz0gTWF0aC5taW4ocmVjdC5oZWlnaHQsIHJlY3Qud2lkdGgpICogMC4yNX1cbiAgICAgICAgaWYgKG9yaWVudCA9PSAnbGVmdCcpIHt4IC09IHRpY2tMZW5ndGg7ICB5ICs9IHJlY3QuaGVpZ2h0ICogMC41OyB5LT0gcmVjdC5oZWlnaHQvNCB9XG4gICAgICAgIGlmIChvcmllbnQgPT0gJ3JpZ2h0Jykge3ggKz0gdGlja0xlbmd0aDsgeSArPSByZWN0LmhlaWdodCAqIDAuNTsgeS09IHJlY3QuaGVpZ2h0LzR9XG5cbiAgICAgICAgdmFyXG4gICAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKScsXG4gICAgICAgIHIgPSAncm90YXRlKCcrdGlja0xhYmVsUm90YXRpb24rJyknXG4gICAgICAgIHJldHVybiB0ICsgclxuICAgICAgfSlcblxuXG4gICAgICAgaWYgKGd1aWRlTGluZXNRKSB7XG4gICAgICAgICB2YXIgZ2xpbmUgPSBzYWZlU2VsZWN0KHRoYXQsICdsaW5lJywgaHlwZW5hdGUobmFtZXNwYWNlLCAnZ3VpZGVsaW5lJykpXG4gICAgICAgICAudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuZWFzZShlYXNlRnVuYylcbiAgICAgICAgIC5hdHRyKFwieDFcIiwgMClcbiAgICAgICAgIC5hdHRyKFwieDJcIiwgaG9yaXpvbnRhbFEgPyAwIDogb3JpZW50ID09IFwibGVmdFwiID8gZ3VpZGVsaW5lU3BhY2UgOiAtZ3VpZGVsaW5lU3BhY2UpXG4gICAgICAgICAuYXR0cihcInkxXCIsIDApXG4gICAgICAgICAuYXR0cigneTInLCAgdmVydGljYWxRID8gMCA6IG9yaWVudCA9PSBcInRvcFwiID8gZ3VpZGVsaW5lU3BhY2UgOiAtZ3VpZGVsaW5lU3BhY2UpXG4gICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24oZCwgaSkge1xuICAgICAgICAgICB2YXJcbiAgICAgICAgICAgeCA9IG1vdmVYQnkoZCwgaSwgaG9yaXpvbnRhbFEsIGNhdGVnb3JpY2FsUSwgb2JqZWN0U2l6ZSksXG4gICAgICAgICAgIHkgPSBtb3ZlWUJ5KGQsIGksIHZlcnRpY2FsUSwgY2F0ZWdvcmljYWxRLCBvYmplY3RTaXplKSxcbiAgICAgICAgICAgdCA9ICd0cmFuc2xhdGUoJyt4KycsJyt5KycpJ1xuICAgICAgICAgICByZXR1cm4gdFxuICAgICAgICAgfSlcbiAgICAgICB9XG5cbiAgICB9KVxuXG4gICAgaWYgKGd1aWRlTGluZXNRKSB7XG4gICAgICBjb250YWluZXIuc2VsZWN0QWxsKCcuJytoeXBlbmF0ZShuYW1lc3BhY2UsJ2d1aWRlbGluZScpKVxuICAgICAgLmF0dHIoJ3N0cm9rZScsIGZ1bmN0aW9uKGQsIGkpe1xuICAgICAgICBpZiAoaSAlIDIgPT0gMCkgeyByZXR1cm4gbW9kaWZ5SGV4aWRlY2ltYWxDb2xvckx1bWluYW5jZShndWlkZUxpbmVTdHJva2UsIDAuOCkgfVxuICAgICAgICByZXR1cm4gZ3VpZGVMaW5lU3Ryb2tlXG4gICAgICB9KVxuICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIGZ1bmN0aW9uKGQsIGkpe1xuICAgICAgICBpZiAoaSAlIDIgPT0gMCkgeyByZXR1cm4gZ3VpZGVMaW5lU3Ryb2tlV2lkdGggKjAuOH1cbiAgICAgICAgcmV0dXJuIGd1aWRlTGluZVN0cm9rZVdpZHRoXG4gICAgICB9KVxuICAgIH1cblxuXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICoqIE1ha2UgdGhlIGxpbmUgb2YgdGhlIGF4aXNcbiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4gICAgdmFyIGxpbmUgPSBzYWZlU2VsZWN0KHNlbGVjdGlvbiwgJ3BhdGgnLCBoeXBlbmF0ZShuYW1lc3BhY2UsJ2xpbmUnKSlcbiAgICAvLyAuYXR0cigneDEnLCAwKVxuICAgIC8vIC5hdHRyKCd4MicsIGhvcml6b250YWxRID8gc3BhY2VYIDogMClcbiAgICAvLyAuYXR0cigneTEnLCAwKVxuICAgIC8vIC5hdHRyKCd5MicsIGhvcml6b250YWxRID8gMCA6IHNwYWNlWSlcbiAgICAuYXR0cignZCcsXG4gICAgICBob3Jpem9udGFsUVxuICAgICAgPyAnTSAwLDAgSCcgKyBzcGFjZVggKyAnLDAnXG4gICAgICA6ICdNIDAsMCBWIDAsJyArIHNwYWNlWVxuICAgIClcbiAgICAuYXR0cignc3Ryb2tlJywgbGluZVN0cm9rZSlcbiAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgbGluZVN0cm9rZVdpZHRoKVxuICAgIC5jbGFzc2VkKCdheGlzLWxpbmUnLCB0cnVlKVxuXG5cbiAgfVxuICByZXR1cm4gYXhpc1xufVxuIiwiaW1wb3J0IHtoeXBlbmF0ZSwgc2FmZVNlbGVjdH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7c2V0dXBDb250YWluZXIsIGNhbGN1bGF0ZVdpZHRoT2ZPYmplY3QsIGNhbGN1bGF0ZVdpZHRoT2ZTcGFjZXJ9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHt1bmlxdWUsIGZsYXR0ZW59IGZyb20gJy4vYXJyYXktZnVuY3Rpb25zJztcbmltcG9ydCB7Z3JvdXBpbmdTcGFjZXJ9IGZyb20gJy4vZ3JvdXBpbmctc3BhY2VyJztcbmltcG9ydCB7Y29sb3JGdW5jdGlvbiBhcyBDRn0gZnJvbSAnLi9jb2xvci1mdW5jdGlvbic7XG5pbXBvcnQge3Rvb2x0aXAgYXMgVFRpcH0gZnJvbSAnLi90b29sdGlwJztcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qKlxuICogQ3JlYXRlcyBhIGJhclxuICpcbiAqIHtAbGluayBodHRwczovL3N1bW5ldXJvbi5naXRsYWIuaW8vZDNzbS9kZW1vcy9iYXItY2hhcnQtc2FtZS1kYXRhLWNvbXBsZXgtZ3JvdXBpbmcvaW5kZXguaHRtbCBEZW1vfVxuICogQGNvbnN0cnVjdG9yIGJhclxuICogQHBhcmFtIHtkMy5zZWxlY3Rpb259IHNlbGVjdGlvblxuICogQG5hbWVzcGFjZSBiYXJcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gYmFyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYXIgKCBzZWxlY3Rpb24gKSB7XG4gIC8qXG4gIEFzc3VtZXMgdGhhdCBkYXRhIGlzIGxpc3QgYW4gb2JqZWN0LlxuXG4gIFRoZSBrZXlzIG9mIGRhdGEgd2lsbCBiZSBib3VuZCB0byB0aGUgYmFycy5cbiAgVGhlIHZhbHVlRXh0cmFjdG9yIGZ1bmN0aW9uIHdpbGwgZXh0cmFjdCB0aGUgdmFsdWUgZnJvbSBkYXRhW2tleV0uXG5cbiAgR3JvdXBpbmcgY2FuIGJlIHVzZWQgaWYgZGVzaXJlZC4gSXQgc2hvdWxkIGJlIGFuIGFyYml0cmFyeSBjb21wbGV4IGxpc3Qgd2hlcmVcbiAgdGhlIHZhbHVlcyBhcmUgc3RyaW5ncyBtYXRjaGluZyBrZXlzIGluIGRhdGEuXG4gICovXG4gIHZhclxuICAvKipcbiAgKiBEYXRhIHRvIHBsb3QuIEFzc3VtZWQgdG8gYmUgYSBvYmplY3QsIHdoZXJlIGVhY2gga2V5IGNvcnJlc3BvbmRzIHRvIGEgYmFyXG4gICogKHNlZSB7QGxpbmsgYmFyI2RhdGF9KVxuICAqIEBwYXJhbSB7T2JqZWN0fSBbZGF0YT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZGF0YSxcbiAgLyoqXG4gICogV2hpY2ggZGlyZWN0aW9uIHRvIHJlbmRlciB0aGUgYmFycyBpblxuICAqIChzZWUge0BsaW5rIGJhciNvcmllbnR9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbb3JpZW50PSdob3Jpem9udGFsJ11cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBvcmllbnQ9J2hvcml6b250YWwnLFxuICAvKipcbiAgKiBBbW91bnQgb2YgaG9yaXpvbnRhbCBzcGFjZSAoaW4gcGl4ZWxzKSBhdmFpYmxlIHRvIHJlbmRlciB0aGUgYmFyIGluXG4gICogKHNlZSB7QGxpbmsgYmFyI3NwYWNlWH0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZVg9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNwYWNlWCxcbiAgLyoqXG4gICogQW1vdW50IG9mIHZlcnRpY2FsIHNwYWNlIChpbiBwaXhlbHMpIGF2YWlibGUgdG8gcmVuZGVyIHRoZSBiYXIgaW5cbiAgKiAoc2VlIHtAbGluayBiYXIuc3BhY2VZfSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW3NwYWNlWT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc3BhY2VZLFxuXG4gIC8qKlxuICAqIFdoZXRoZXIgb3Igbm90IHRvIGFsbG93IGJhciB0byByZW5kZXIgZWxlbWVudHMgcGFzcyB0aGUgbWFpbiBzcGF0aWFsIGRpbWVuc2lvblxuICAqIGdpdmVuIHRoZSBvcmllbnRhdGlvbiAoc2VlIHtAbGluayBiYXIjb3JpZW50fSksIHdoZXJlIHtAbGluayBiYXIjb3JpZW50fT1cImhvcml6b250YWxcIlxuICAqIHRoZSBtYWluIGRpbWVuc2lvbiBpcyB7QGxpbmsgYmFyI3NwYWNlWH0gYW5kIHdoZXJlIHtAbGluayBiYXIjb3JpZW50fT1cInZlcnRpY2FsXCJcbiAgKiB0aGUgbWFpbiBkaW1lbnNpb24gaXMge0BsaW5rIGJhciNzcGFjZVl9XG4gICogQHBhcmFtIHtib29sZWFufSBbb3ZlcmZsb3dRPWZhbHNlXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG92ZXJmbG93USA9IGZhbHNlLFxuXG4gIC8qKlxuICAqIEFuIGFycmF5IC0gcHV0YXRpdmVseSBvZiBvdGhlciBhcnJheXMgLSBkZXBpY3RpbmcgaG93IGJhcnMgc2hvdWxkIGJlIGFycmFuZ2VkXG4gICogQHBhcmFtIHtBcnJheVtdfSBbZ3JvdXBpbmc9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGdyb3VwaW5nLFxuXG4gIC8qKlxuICAqIEhvdyB0byBnZXQgdGhlIHZhbHVlIG9mIHRoZSBiYXJcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbdmFsdWVFeHRyYWN0b3I9ZnVuY3Rpb24oa2V5LCBpbmRleCkgeyByZXR1cm4gZGF0YVtrZXldIH1dXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdmFsdWVFeHRyYWN0b3IgPSBmdW5jdGlvbihrZXksIGluZGV4KSB7IHJldHVybiBkYXRhW2tleV0gfSxcbiAgLyoqXG4gICogSG93IHRvIHNvcnQgdGhlIGJhcnMgLSBpZiB7QGxpbmsgYmFyI2dyb3VwaW5nfSBpcyBub3QgcHJvdmlkZWQuXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW3NvcnRpbmdGdW5jdGlvbj1mdW5jdGlvbihrZXlBLCBrZXlCKSB7cmV0dXJuIGQzLmRlc2NlbmRpbmcoZGF0YVtrZXlBXSwgZGF0YVtrZXlCXSl9XVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNvcnRpbmdGdW5jdGlvbiA9IGZ1bmN0aW9uKGtleUEsIGtleUIpIHtyZXR1cm4gZDMuZGVzY2VuZGluZyhkYXRhW2tleUFdLCBkYXRhW2tleUJdKX0sXG5cbiAgLyoqXG4gICogVGhlIHNjYWxlIGZvciB3aGljaCBiYXIgdmFsdWVzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBieVxuICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtzY2FsZT1kMy5zY2FsZUxpbmVhcl1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzY2FsZSA9IGQzLnNjYWxlTGluZWFyKCksXG4gIC8qKlxuICAqIFRoZSBwYWRkaW5nIGZvciB0aGUgZG9tYWluIG9mIHRoZSBzY2FsZSAoc2VlIHtAbGluayBiYXIjc2NhbGV9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbZG9tYWluUGFkZGluZz0wLjVdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZG9tYWluUGFkZGluZyA9IDAuNSxcblxuICAvKipcbiAgKiBEZWZhdWx0IHNwYWNlIGZvciB0aGUgc3BhY2VyIChwZXJjZW50YWdlKSBvZiBtYWluIGRpbWVuc2lvbiBnaXZlbiB0aGUgb3JpZW50YXRpb25cbiAgKiAoc2VlIHtAbGluayBiYXIjb3JpZW50fSksIHdoZXJlIHtAbGluayBiYXIjb3JpZW50fT1cImhvcml6b250YWxcIlxuICAqIHRoZSBtYWluIGRpbWVuc2lvbiBpcyB7QGxpbmsgYmFyI3NwYWNlWH0gYW5kIHdoZXJlIHtAbGluayBiYXIjb3JpZW50fT1cInZlcnRpY2FsXCJcbiAgKiB0aGUgbWFpbiBkaW1lbnNpb24gaXMge0BsaW5rIGJhciNzcGFjZVl9IGJldHdlZW4gYmFyc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbb2JqZWN0U3BhY2VyPTAuMDVdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb2JqZWN0U3BhY2VyID0gMC4wNSxcbiAgLyoqXG4gICogVGhlIG1pbmltdW0gc2l6ZSB0aGF0IGFuIG9iamVjdCBjYW4gYmVcbiAgKiBAcGFyYW0ge251bWJlcn0gW21pbk9iamVjdFNpemU9NTBdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgbWluT2JqZWN0U2l6ZSA9IDUwLFxuICAvKipcbiAgKiBUaGUgbWF4aW11bSBzaXplIHRoYXQgYW4gb2JqZWN0IGNhbiBiZVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4T2JqZWN0U2l6ZT0xMDBdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgbWF4T2JqZWN0U2l6ZSA9IDEwMCxcblxuICAvKipcbiAgKiBUaGUgc3Ryb2tlIHdpZHRoIG9mIHRoZSBiYXJzXG4gICogQHBhcmFtIHtudW1iZXJ9IFtiYXJTdHJva2VXaWR0aD0yXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGJhclN0cm9rZVdpZHRoID0gMixcbiAgLyoqXG4gICogSW5zdGFuY2Ugb2YgQ29sb3JGdW5jdGlvblxuICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtjb2xvckZ1bmN0aW9uID0gY29sb3JGdW5jdGlvbigpXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGNvbG9yRnVuY3Rpb24gPSBDRigpLFxuXG5cbiAgLyoqXG4gICogQ29sb3Igb2YgdGhlIGJhY2tncm91bmRcbiAgKiBAcGFyYW0ge3N0cmluZ30gW2JhY2tncm91bmRGaWxsPVwidHJhbnNwYXJlbnRcIl1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBiYWNrZ3JvdW5kRmlsbCA9ICd0cmFuc3BhcmVudCcsXG4gIC8qKlxuICAqIE5hbWVzcGFjZSBmb3IgYWxsIGl0ZW1zIG1hZGUgYnkgdGhpcyBpbnN0YW5jZSBvZiBiYXJcbiAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVzcGFjZT1cImQzc20tYmFyXCJdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgbmFtZXNwYWNlID0gJ2Qzc20tYmFyJyxcbiAgLyoqXG4gICogQ2xhc3MgbmFtZSBmb3IgYmFyIGNvbnRhaW5lciAoPGc+IGVsZW1lbnQpXG4gICogQHBhcmFtIHtzdHJpbmd9IFtvYmplY3RDbGFzcz1cImJhclwiXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG9iamVjdENsYXNzID0gJ2JhcicsXG5cbiAgLyoqXG4gICogRHVyYXRpb24gb2YgYWxsIHRyYW5zaXRpb25zIG9mIHRoaXMgZWxlbWVudFxuICAqIEBwYXJhbSB7bnVtYmVyfSBbdHJhbnNpdGlvbkR1cmF0aW9uPTEwMDBdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdHJhbnNpdGlvbkR1cmF0aW9uID0gMTAwMCxcbiAgLyoqXG4gICogRWFzaW5nIGZ1bmN0aW9uIGZvciB0cmFuc2l0aW9uc1xuICAqIEBwYXJhbSB7ZDMuZWFzZX0gW2Vhc2VGdW5jPWQzLmVhc2VFeHBdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZWFzZUZ1bmMgPSBkMy5lYXNlRXhwLFxuXG4gIC8vIHVzZWZ1bCB2YWx1ZXMgdG8gZXh0cmFjdCB0byBwcmV2ZW50IHJlLWNhbGN1bGF0aW9uXG4gIC8qKlxuICAqIFRoZSBrZXlzIG9mIHRoZSBiYXJzXG4gICogQHBhcmFtIHtzdHJpbmdbXX0gW2JhcktleXM9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGJhcktleXMsXG4gIC8qKlxuICAqIFRoZSB2YWx1ZXMgb2YgdGhlIGJhcnNcbiAgKiBAcGFyYW0ge251bWJlcltdfSBbYmFyVmFsdWVzPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBiYXJWYWx1ZXMsXG4gIC8qKlxuICAqIFRoZSBvYmplY3RTaXplIChhY3R1YWwgd2lkdGgpIHVzZWQgYnkgdGhlIGJhcnNcbiAgKiBAcGFyYW0ge251bWJlcn0gW29iamVjdFNpemU9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBiYXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG9iamVjdFNpemUsXG4gIC8qKlxuICAqIFRoZSBzcGFjZXJTaXplIChhY3R1YWwgd2lkdGgpIHVzZWQgYnkgdGhlIHNwYWNlcnMgYmV0d2VlbiB0aGUgYmFyc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbc3BhY2VyU2l6ZT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJhciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc3BhY2VyU2l6ZSxcbiAgLyoqXG4gICogSW5zdGFuY2Ugb2YgVG9vbHRpcFxuICAqIEBwYXJhbSB7ZnVuY3Rpb259IFt0b29sdGlwPXRvb2x0aXAoKV1cbiAgKiBAbWVtYmVyb2YgYmFyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB0b29sdGlwID0gVFRpcCgpXG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgc2VsZWN0aW9uIGluIHdoaWNoIGl0ZW1zIGFyZSBtYW5pcHVsYXRlZFxuICAgKiBAcGFyYW0ge2QzLnNlbGVjdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IGQzLnNlbGVjdGlvbn1cbiAgICogQG1lbWJlcm9mIGJhclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzZWxlY3Rpb24gPSBzZWxlY3Rpb25cbiAgICovXG4gIGJhci5zZWxlY3Rpb24gPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNlbGVjdGlvbiA9IF8sIGJhcikgOiBzZWxlY3Rpb247IH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGRhdGFcbiAgICogKHNlZSB7QGxpbmsgYmFyI2RhdGF9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IG9iamVjdH1cbiAgICogQG1lbWJlcm9mIGJhclxuICAgKiBAcHJvcGVydHlcbiAgICovXG4gIGJhci5kYXRhID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkYXRhID0gXywgYmFyKSA6IGRhdGE7IH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIG9yaWVudCBvZiB0aGUgYmFyc1xuICAgKiAoc2VlIHtAbGluayBiYXIjb3JpZW50fSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtiYXIgfCBvYmplY3R9XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqL1xuICBiYXIub3JpZW50ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvcmllbnQgPSBfLCBiYXIpIDogb3JpZW50OyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBhbW91bnQgb2YgaG9yaXpvbnRhbCBzcGFjZSBpbiB3aGljaCBpdGVtcyBhcmUgbWFuaXB1bGF0ZWRcbiAgICogKHNlZSB7QGxpbmsgYmFyI3NwYWNlWH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXSBzaG91bGQgYmUgYSBudW1iZXIgPiAwXG4gICAqIEByZXR1cm5zIHtiYXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc3BhY2VYID0gdW5kZWZpbmVkXG4gICAqL1xuICBiYXIuc3BhY2VYID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzcGFjZVggPSBfLCBiYXIpIDogc3BhY2VYOyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBhbW91bnQgb2YgdmVydGljYWwgc3BhY2UgaW4gd2hpY2ggaXRlbXMgYXJlIG1hbmlwdWxhdGVkXG4gICAqIChzZWUge0BsaW5rIGJhciNzcGFjZVl9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV0gc2hvdWxkIGJlIGEgbnVtYmVyID4gMFxuICAgKiBAcmV0dXJucyB7YmFyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNwYWNlWSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYmFyLnNwYWNlWSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3BhY2VZID0gXywgYmFyKSA6IHNwYWNlWTsgfTtcblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgd2hldGhlciBvciBub3QgYmFyIGlzIGFsbG93ZWQgdG8gZ28gYmV5b25kIHNwZWNpZmllZCBkaW1lbnNpb25zXG4gICAqIChzZWUge0BsaW5rIGJhciNzcGFjZVh9KVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtiYXIgfCBib29sZWFufVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG92ZXJmbG93USA9IGZhbHNlXG4gICAqL1xuICBiYXIub3ZlcmZsb3dRID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvdmVyZmxvd1EgPSBfLCBiYXIpIDogb3ZlcmZsb3dROyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGdyb3VwaW5nIG9mIHRoZSBiYXJzXG4gICAqIChzZWUge0BsaW5rIGJhciNncm91cGluZ30pXG4gICAqIEBwYXJhbSB7QXJyYXlbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IEFycmF5W119XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgZ3JvdXBpbmcgPSB1bmRlZmluZWRcbiAgICovXG4gIGJhci5ncm91cGluZyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZ3JvdXBpbmcgPSBfLCBiYXIpIDogZ3JvdXBpbmc7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdmFsdWVFeHRyYWN0b3JcbiAgICogKHNlZSB7QGxpbmsgYmFyI3ZhbHVlRXh0cmFjdG9yfSlcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IGZ1bmN0aW9ufVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHZhbHVlRXh0cmFjdG9yID0gZnVuY3Rpb24oa2V5LCBpbmRleCkgeyByZXR1cm4gZGF0YVtrZXldIH0sXG4gICAqL1xuICBiYXIudmFsdWVFeHRyYWN0b3IgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZhbHVlRXh0cmFjdG9yID0gXywgYmFyKSA6IHZhbHVlRXh0cmFjdG9yOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNvcnRpbmdGdW5jdGlvblxuICAgKiAoc2VlIHtAbGluayBiYXIjc29ydGluZ0Z1bmN0aW9ufSlcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IGZ1bmN0aW9ufVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNvcnRpbmdGdW5jdGlvbiA9IGZ1bmN0aW9uKGtleUEsIGtleUIpIHtyZXR1cm4gZDMuZGVzY2VuZGluZyhkYXRhW2tleUFdLCBkYXRhW2tleUJdKX0sXG4gICAqL1xuICBiYXIuc29ydGluZ0Z1bmN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzb3J0aW5nRnVuY3Rpb24gPSBfLCBiYXIpIDogc29ydGluZ0Z1bmN0aW9uOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNjYWxlIGZvciB3aGljaCB0aGUgYmFyIHZhbHVlcyBzaG91bGQgYmUgdHJhbnNmb3JtZWQgYnlcbiAgICogKHNlZSB7QGxpbmsgYmFyI3NjYWxlfSlcbiAgICogQHBhcmFtIHtkMy5zY2FsZX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IGQzLnNjYWxlfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKVxuICAgKi9cbiAgYmFyLnNjYWxlID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzY2FsZSA9IF8sIGJhcikgOiBzY2FsZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBwYWRkaW5nIGZvciB0aGUgZG9tYWluIG9mIHRoZSBzY2FsZVxuICAgKiAoc2VlIHtAbGluayBiYXIjZG9tYWluUGFkZGluZ30pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YmFyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGRvbWFpblBhZGRpbmcgPSAwLjVcbiAgICovXG4gIGJhci5kb21haW5QYWRkaW5nID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkb21haW5QYWRkaW5nID0gXywgYmFyKSA6IGRvbWFpblBhZGRpbmc7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyBvYmplY3RTcGFjZXJcbiAgICogKHNlZSB7QGxpbmsgYmFyI29iamVjdFNwYWNlcn0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YmFyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG9iamVjdFNwYWNlciA9IDAuMDVcbiAgICovXG4gIGJhci5vYmplY3RTcGFjZXIgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9iamVjdFNwYWNlciA9IF8sIGJhcikgOiBvYmplY3RTcGFjZXI7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbWluT2JqZWN0U2l6ZVxuICAgKiAoc2VlIHtAbGluayBiYXIjbWluT2JqZWN0U2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YmFyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG1pbk9iamVjdFNpemUgPSA1MFxuICAgKi9cbiAgYmFyLm1pbk9iamVjdFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG1pbk9iamVjdFNpemUgPSBfLCBiYXIpIDogbWluT2JqZWN0U2l6ZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBtYXhPYmplY3RTaXplXG4gICAqIChzZWUge0BsaW5rIGJhciNtYXhPYmplY3RTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtiYXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgbWF4T2JqZWN0U2l6ZSA9IDEwMFxuICAgKi9cbiAgYmFyLm1heE9iamVjdFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG1heE9iamVjdFNpemUgPSBfLCBiYXIpIDogbWF4T2JqZWN0U2l6ZTsgfTtcblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGJhclN0cm9rZVdpZHRoXG4gICAqIChzZWUge0BsaW5rIGJhciNiYXJTdHJva2VXaWR0aH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YmFyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGJhclN0cm9rZVdpZHRoID0gMlxuICAgKi9cbiAgYmFyLmJhclN0cm9rZVdpZHRoID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChiYXJTdHJva2VXaWR0aCA9IF8sIGJhcikgOiBiYXJTdHJva2VXaWR0aDsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBjb2xvckZ1bmN0aW9uXG4gICAqIChzZWUge0BsaW5rIGJhciNjb2xvckZ1bmN0aW9ufSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtiYXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgY29sb3JGdW5jdGlvbiA9IGNvbG9yRnVuY3Rpb24oKVxuICAgKi9cbiAgYmFyLmNvbG9yRnVuY3Rpb24gPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNvbG9yRnVuY3Rpb24gPSBfLCBiYXIpIDogY29sb3JGdW5jdGlvbjsgfTtcblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGJhY2tncm91bmRGaWxsXG4gICAqIChzZWUge0BsaW5rIGJhciNiYWNrZ3JvdW5kRmlsbH0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YmFyIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGJhY2tncm91bmRGaWxsID0gJ3RyYW5zcGFyZW50J1xuICAgKi9cbiAgYmFyLmJhY2tncm91bmRGaWxsID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChiYWNrZ3JvdW5kRmlsbCA9IF8sIGJhcikgOiBiYWNrZ3JvdW5kRmlsbDsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBuYW1lc3BhY2VcbiAgICogKHNlZSB7QGxpbmsgYmFyI25hbWVzcGFjZX0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YmFyIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG5hbWVzcGFjZSA9ICdkM3NtLWJhcidcbiAgICovXG4gIGJhci5uYW1lc3BhY2UgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG5hbWVzcGFjZSA9IF8sIGJhcikgOiBuYW1lc3BhY2U7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgb2JqZWN0Q2xhc3NcbiAgICogKHNlZSB7QGxpbmsgYmFyI29iamVjdENsYXNzfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtiYXIgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgb2JqZWN0Q2xhc3MgPSAndGljay1ncm91cCdcbiAgICovXG4gIGJhci5vYmplY3RDbGFzcyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob2JqZWN0Q2xhc3MgPSBfLCBiYXIpIDogb2JqZWN0Q2xhc3M7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdHJhbnNpdGlvbkR1cmF0aW9uXG4gICAqIChzZWUge0BsaW5rIGJhciN0cmFuc2l0aW9uRHVyYXRpb259KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJhclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0cmFuc2l0aW9uRHVyYXRpb24gPSAxMDAwXG4gICAqL1xuICBiYXIudHJhbnNpdGlvbkR1cmF0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0cmFuc2l0aW9uRHVyYXRpb24gPSBfLCBiYXIpIDogdHJhbnNpdGlvbkR1cmF0aW9uOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGVhc2VGdW5jXG4gICAqIChzZWUge0BsaW5rIGJhciNlYXNlRnVuY30pXG4gICAqIEBwYXJhbSB7ZDMuZWFzZX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IGQzLmVhc2V9XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgZWFzZUZ1bmMgPSBkMy5lYXNlRXhwXG4gICAqL1xuICBiYXIuZWFzZUZ1bmMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGVhc2VGdW5jID0gXywgYmFyKSA6IGVhc2VGdW5jOyB9O1xuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBiYXJLZXlzXG4gICAqIChzZWUge0BsaW5rIGJhciNiYXJLZXlzfSlcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IHN0cmluZ1tdfVxuICAgKiBAbWVtYmVyb2YgYmFyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGJhcktleXMgPSB1bmRlZmluZWRcbiAgICovXG4gIGJhci5iYXJLZXlzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChiYXJLZXlzID0gXywgYmFyKSA6IGJhcktleXM7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgYmFyVmFsdWVzXG4gICAqIChzZWUge0BsaW5rIGJhciNiYXJWYWx1ZXN9KVxuICAgKiBAcGFyYW0ge251bWJlcltdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YmFyIHwgbnVtYmVyW119XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgYmFyVmFsdWVzID0gdW5kZWZpbmVkXG4gICAqL1xuICBiYXIuYmFyVmFsdWVzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChiYXJWYWx1ZXMgPSBfLCBiYXIpIDogYmFyVmFsdWVzOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG9iamVjdFNpemVcbiAgICogKHNlZSB7QGxpbmsgYmFyI29iamVjdFNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJhclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvYmplY3RTaXplID0gdW5kZWZpbmVkXG4gICAqL1xuICBiYXIub2JqZWN0U2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob2JqZWN0U2l6ZSA9IF8sIGJhcikgOiBvYmplY3RTaXplOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNwYWNlclNpemVcbiAgICogKHNlZSB7QGxpbmsgYmFyI3NwYWNlclNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJhclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzcGFjZXJTaXplID0gdW5kZWZpbmVkXG4gICAqL1xuICBiYXIuc3BhY2VyU2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3BhY2VyU2l6ZSA9IF8sIGJhcikgOiBzcGFjZXJTaXplOyB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdG9vbHRpcFxuICAgKiAoc2VlIHtAbGluayBiYXIjdG9vbHRpcH0pXG4gICAqIEBwYXJhbSB7dG9vbHRpcH0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JhciB8IHRvb2x0aXB9XG4gICAqIEBtZW1iZXJvZiBiYXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdG9vbHRpcCA9IHRvb2x0aXAoKVxuICAgKi9cbiAgYmFyLnRvb2x0aXAgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRvb2x0aXAgPSBfLCBiYXIpIDogdG9vbHRpcDsgfTtcblxuXG4gIGZ1bmN0aW9uIGJhcigpIHtcbiAgICAvLyBmb3IgY29udmVuaWVuY2UgaW4gaGFuZGxpbmcgb3JpZW50YXRpb24gc3BlY2lmaWMgdmFsdWVzXG4gICAgdmFyIGhvcml6b250YWxRID0gKG9yaWVudCA9PSAnaG9yaXpvbnRhbCcpID8gdHJ1ZSA6IGZhbHNlXG4gICAgdmFyIHZlcnRpY2FsUSA9ICFob3Jpem9udGFsUVxuXG4gICAgLy8gYmFja2dyb3VuZCBjbGlwaW5nIHJlY3RhbmdsZVxuICAgIHZhciBiZ2NwUmVjdCA9IHt4OjAsIHk6MCwgd2lkdGg6IHNwYWNlWCwgaGVpZ2h0OnNwYWNlWX1cbiAgICB2YXIgY29udGFpbmVyID0gc2V0dXBDb250YWluZXIoIHNlbGVjdGlvbiwgbmFtZXNwYWNlLCBiZ2NwUmVjdCwgYmFja2dyb3VuZEZpbGwgKTtcblxuICAgIC8vIHRvIHByZXZlbnQgcmUtY2FsY3VsYXRpb24gYW5kIGdldHRlcnMgdG8gYmUgcGFzc2VkIHRvIGF4ZXNcbiAgICBiYXJLZXlzID0gZDMua2V5cyhkYXRhKVxuICAgIGJhclZhbHVlcyA9IGJhcktleXMubWFwKHZhbHVlRXh0cmFjdG9yKVxuXG4gICAgLy8gaWYgZ3JvdXBpbmcgaXMgdW5kZWZpbmVkIHNvcnQgYmFyS2V5cyBieSBzb3J0aW5nRnVuY3Rpb25cbiAgICB2YXIgb3JkZXJlZCA9IChncm91cGluZyA9PSB1bmRlZmluZWQpID8gYmFyS2V5cy5zb3J0KHNvcnRpbmdGdW5jdGlvbikgOiBncm91cGluZ1xuICAgIC8vIG9yZGVyZWQgbWlnaHQgYmUgbmVzdGVkIGRlcGVuZGluZyBvbiBncm91cGluZ1xuICAgIGJhcktleXMgPSBmbGF0dGVuKG9yZGVyZWQpXG5cbiAgICB2YXIgbnVtYmVyT2ZPYmplY3RzID0gYmFyS2V5cy5sZW5ndGhcbiAgICB2YXIgZXh0ZW50ID0gW01hdGgubWluKC4uLmJhclZhbHVlcykgLSBkb21haW5QYWRkaW5nLE1hdGgubWF4KC4uLmJhclZhbHVlcykgKyBkb21haW5QYWRkaW5nXTtcblxuXG5cbiAgICAvLyBzZXQgdGhlIHNjYWxlXG4gICAgc2NhbGUuZG9tYWluKGV4dGVudCkucmFuZ2UoaG9yaXpvbnRhbFEgPyBbMCxzcGFjZVldIDogW3NwYWNlWCwgMF0pXG4gICAgdmFyIHNwYWNlID0gaG9yaXpvbnRhbFEgPyBzcGFjZVggOiBzcGFjZVlcbiAgICAvLyBjYWxjdWxhdGUgb2JqZWN0IHNpemVcbiAgICBvYmplY3RTaXplID0gY2FsY3VsYXRlV2lkdGhPZk9iamVjdChzcGFjZSwgbnVtYmVyT2ZPYmplY3RzLCBtaW5PYmplY3RTaXplLCBtYXhPYmplY3RTaXplLCBvYmplY3RTcGFjZXIsIG92ZXJmbG93USlcbiAgICAvLyBjYWxjdWxhdGUgc3BhY2VyIHNpemUgaWYgbmVlZGVkXG4gICAgc3BhY2VyU2l6ZSA9IGNhbGN1bGF0ZVdpZHRoT2ZTcGFjZXIoYmFyS2V5cywgc3BhY2UsIG9iamVjdFNpemUsIG51bWJlck9mT2JqZWN0cywgb2JqZWN0U3BhY2VyLCBvdmVyZmxvd1EpXG4gICAgLy8gbWFrZSB0aGUgbmVzdGVkIGdyb3Vwc1xuICAgIHZhciBzcGFjZXJGdW5jdGlvbiA9IGdyb3VwaW5nU3BhY2VyKClcbiAgICAuaG9yaXpvbnRhbFEoaG9yaXpvbnRhbFEpLnNjYWxlKHNjYWxlKS5tb3ZlYnkoJ2NhdGVnb3J5JykubnVtYmVyT2ZPYmplY3RzKG51bWJlck9mT2JqZWN0cylcbiAgICAub2JqZWN0Q2xhc3Mob2JqZWN0Q2xhc3MpLm9iamVjdFNpemUob2JqZWN0U2l6ZSkuc3BhY2VyU2l6ZShzcGFjZXJTaXplKVxuICAgIC50cmFuc2l0aW9uRHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlRnVuYyhlYXNlRnVuYylcbiAgICAubmFtZXNwYWNlKG5hbWVzcGFjZSlcbiAgICAvLyBzYWZlIGRlZmF1bHQgZnVuY3Rpb25cbiAgICB2YXIgZGVmYXVsdEV4aXQgPSBzcGFjZXJGdW5jdGlvbi5leGl0RnVuY3Rpb24oKVxuXG4gICAgc3BhY2VyRnVuY3Rpb24uZXhpdEZ1bmN0aW9uKGZ1bmN0aW9uKHNlbCl7XG4gICAgICAvLyB1c2UgZGVmYXVsdCB0byBtb3ZlIG9iamVjdHMgb2ZmIHNjcmVlblxuICAgICAgZGVmYXVsdEV4aXQoc2VsKVxuICAgICAgLy8gc2hyaW5rIHJlY3RhbmdsZXMgaW4gYWRkaXRpb25cbiAgICAgIHNlbC5zZWxlY3RBbGwoJyogPiByZWN0JylcbiAgICAgIC50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uKGQsIGkpIHtcbiAgICAgICAgdmFyXG4gICAgICAgIHggPSBob3Jpem9udGFsUSA/IDAgOiAwLFxuICAgICAgICB5ID0gdmVydGljYWxRID8gMCA6IHNjYWxlKGV4dGVudFsxXSksXG4gICAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgICAgcmV0dXJuIHRcbiAgICAgIH0pXG4gICAgICAuYXR0cignd2lkdGgnLCBob3Jpem9udGFsUSA/IG9iamVjdFNpemUgOiAwKVxuICAgICAgLmF0dHIoJ2hlaWdodCcsIHZlcnRpY2FsUSA/IG9iamVjdFNpemUgOiAwKS5yZW1vdmUoKVxuICAgIH0pXG5cbiAgICAvLyBtb3ZlIHN0dWZmXG4gICAgc3BhY2VyRnVuY3Rpb24oY29udGFpbmVyLCBvcmRlcmVkLCAwKVxuXG5cblxuXG4gICAgdmFyIHBhcmVudEluZGV4QXJyYXkgPSBbXVxuICAgIGNvbnRhaW5lci5zZWxlY3RBbGwoJ2c6bm90KC50by1yZW1vdmUpLicrb2JqZWN0Q2xhc3MpXG4gICAgLmVhY2goZnVuY3Rpb24oZCwgaSl7cGFyZW50SW5kZXhBcnJheS5wdXNoKE51bWJlcihkMy5zZWxlY3QodGhpcykuYXR0cigncGFyZW50LWluZGV4JykpKX0pXG5cblxuICAgIGNvbG9yRnVuY3Rpb24gPSBjb2xvckZ1bmN0aW9uLmNvbG9yQnkoKSA9PSAnaW5kZXgnXG4gICAgPyBjb2xvckZ1bmN0aW9uLmRhdGFFeHRlbnQoWzAsIE1hdGgubWF4KC4uLnBhcmVudEluZGV4QXJyYXkpXSlcbiAgICA6IGNvbG9yRnVuY3Rpb24uZGF0YUV4dGVudChleHRlbnQpXG5cblxuXG4gICAgY29udGFpbmVyLnNlbGVjdEFsbCgnZzpub3QoLnRvLXJlbW92ZSkuJytvYmplY3RDbGFzcykuZWFjaChmdW5jdGlvbihrZXksIGkpIHtcbiAgICAgIHZhciB0ID0gZDMuc2VsZWN0KHRoaXMpLFxuICAgICAgY3VycmVudERhdGEgPSBkYXRhW2tleV0sXG4gICAgICB2YWx1ZSA9IHZhbHVlRXh0cmFjdG9yKGtleSwgaSksXG4gICAgICBpID0gdC5hdHRyKCdwYXJlbnQtaW5kZXgnKSA9PSB1bmRlZmluZWQgPyBpIDogdC5hdHRyKCdwYXJlbnQtaW5kZXgnKSxcbiAgICAgIGZpbGxDb2xvciA9IGNvbG9yRnVuY3Rpb24oa2V5LCB2YWx1ZSwgaSwgJ2ZpbGwnKSwgLy8gcHJldmVudCBkdXBsaWNhdGUgY29tcHV0YXRpb25cbiAgICAgIHN0cm9rZUNvbG9yID0gY29sb3JGdW5jdGlvbihrZXksIHZhbHVlLCBpLCAgJ3N0cm9rZScpXG5cblxuICAgICAgdmFyIGJhciA9IHNhZmVTZWxlY3QodCwgJ3JlY3QnLCAnYmFyLXJlY3QnKVxuXG4gICAgICBpZiAoYmFyLmF0dHIoJ3RyYW5zZm9ybScpID09IHVuZGVmaW5lZCkge1xuICAgICAgICBiYXIuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24oZCwgaSkge1xuICAgICAgICAgIHZhclxuICAgICAgICAgIHggPSBob3Jpem9udGFsUSA/IDAgOiAwLFxuICAgICAgICAgIHkgPSB2ZXJ0aWNhbFEgPyAwIDogc2NhbGUoZXh0ZW50WzFdKSxcbiAgICAgICAgICB0ID0gJ3RyYW5zbGF0ZSgnK3grJywnK3krJyknXG4gICAgICAgICAgcmV0dXJuIHRcbiAgICAgICAgfSlcbiAgICAgICAgLmF0dHIoJ3dpZHRoJywgaG9yaXpvbnRhbFEgPyBvYmplY3RTaXplIDogMClcbiAgICAgICAgLmF0dHIoJ2hlaWdodCcsIHZlcnRpY2FsUSA/IG9iamVjdFNpemUgOiAwKVxuICAgICAgfVxuXG5cbiAgICAgIGJhci50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlKGVhc2VGdW5jKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uKGQsIGkpIHtcbiAgICAgICAgdmFyXG4gICAgICAgIHggPSBob3Jpem9udGFsUSA/IDAgOiAwLFxuICAgICAgICB5ID0gdmVydGljYWxRID8gMCA6IHNjYWxlKGV4dGVudFsxXSkgLSBzY2FsZSh2YWx1ZSksXG4gICAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgICAgcmV0dXJuIHRcbiAgICAgIH0pXG4gICAgICAuYXR0cignd2lkdGgnLCBob3Jpem9udGFsUSA/IG9iamVjdFNpemUgOiBzY2FsZSh2YWx1ZSkpXG4gICAgICAuYXR0cignaGVpZ2h0JywgdmVydGljYWxRID8gb2JqZWN0U2l6ZSA6IHNjYWxlKHZhbHVlKSlcbiAgICAgIC5hdHRyKCdmaWxsJywgZmlsbENvbG9yKVxuICAgICAgLmF0dHIoJ3N0cm9rZScsIHN0cm9rZUNvbG9yKVxuICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIGJhclN0cm9rZVdpZHRoKVxuXG5cblxuICAgICAgdC5vbignbW91c2VvdmVyJywgZnVuY3Rpb24oZCwgaSl7XG4gICAgICAgIGNvbnRhaW5lci5zZWxlY3RBbGwoJ2cuJytvYmplY3RDbGFzcykuc3R5bGUoJ29wYWNpdHknLCAwLjIpXG4gICAgICAgIHQuc3R5bGUoJ29wYWNpdHknLCAxKVxuICAgICAgICBiYXIuYXR0cignc3Ryb2tlLXdpZHRoJyxiYXJTdHJva2VXaWR0aCoyKVxuXG4gICAgICB9KVxuICAgICAgdC5vbignbW91c2VvdXQnLCBmdW5jdGlvbigpe1xuICAgICAgICBjb250YWluZXIuc2VsZWN0QWxsKCdnLicrb2JqZWN0Q2xhc3MpLnN0eWxlKCdvcGFjaXR5JywgMSlcbiAgICAgICAgYmFyLmF0dHIoJ3N0cm9rZS13aWR0aCcsIGJhclN0cm9rZVdpZHRoKVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgdG9vbHRpcC5zZWxlY3Rpb24oY29udGFpbmVyLnNlbGVjdEFsbCgnLmJhci1yZWN0JykpXG4gICAgLmRhdGEoZGF0YSlcblxuICAgIHRvb2x0aXAoKVxuXG4gIH1cbiAgcmV0dXJuIGJhclxufVxuIiwiaW1wb3J0IHtoeXBlbmF0ZSwgc2FmZVNlbGVjdH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7c2V0dXBDb250YWluZXIsIGNhbGN1bGF0ZVdpZHRoT2ZPYmplY3QsIGNhbGN1bGF0ZVdpZHRoT2ZTcGFjZXIsIGxvZ30gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge3VuaXF1ZX0gZnJvbSAnLi9hcnJheS1mdW5jdGlvbnMnO1xuaW1wb3J0IHtncm91cGluZ1NwYWNlcn0gZnJvbSAnLi9ncm91cGluZy1zcGFjZXInO1xuaW1wb3J0IHtjb2xvckZ1bmN0aW9uIGFzIENGfSBmcm9tICcuL2NvbG9yLWZ1bmN0aW9uJztcbmltcG9ydCB7dG9vbHRpcCBhcyBUVGlwfSBmcm9tICcuL3Rvb2x0aXAnO1xuXG5cbi8qKlxuICogQ3JlYXRlcyBhIGJ1YmJsZUhlYXRtYXBcbiAqXG4gKiB7QGxpbmsgaHR0cHM6Ly9zdW1uZXVyb24uZ2l0bGFiLmlvL2Qzc20vZGVtb3MvYnViYmxlLWhlYXRtYXAvaW5kZXguaHRtbCBEZW1vfVxuICogQGNvbnN0cnVjdG9yIGJ1YmJsZUhlYXRtYXBcbiAqIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBzZWxlY3Rpb25cbiAqIEBuYW1lc3BhY2UgYnViYmxlSGVhdG1hcFxuICogQHJldHVybnMge2Z1bmN0aW9ufSBidWJibGVIZWF0bWFwXG4gKi9cbmZ1bmN0aW9uIGJ1YmJsZUhlYXRtYXAoIHNlbGVjdGlvbiApIHtcbiAgdmFyXG4gIC8qKlxuICAqIERhdGEgdG8gcGxvdC4gQXNzdW1lZCB0byBiZSBhIG9iamVjdCwgd2hlcmUgZWFjaCBrZXkgY29ycmVzcG9uZHMgdG8gYSBjZWxsXG4gICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNkYXRhfSlcbiAgKiBAcGFyYW0ge09iamVjdH0gW2RhdGE9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBkYXRhLFxuXG4gIC8qKlxuICAqIEFtb3VudCBvZiBob3Jpem9udGFsIHNwYWNlIChpbiBwaXhlbHMpIGF2YWlibGUgdG8gcmVuZGVyIHRoZSBidWJibGVIZWF0bWFwIGluXG4gICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNzcGFjZVh9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbc3BhY2VYPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc3BhY2VYLFxuICAvKipcbiAgKiBBbW91bnQgb2YgdmVydGljYWwgc3BhY2UgKGluIHBpeGVscykgYXZhaWJsZSB0byByZW5kZXIgdGhlIGJ1YmJsZUhlYXRtYXAgaW5cbiAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwLnNwYWNlWX0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZVk9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzcGFjZVksXG5cbiAgLyoqXG4gICogVGhlIGludGVybmFsIGtleSBvZiB0aGUgY2VsbCBzcGVjaWZpeWluZyB0byB3aGljaCB4IGF4aXMga2V5IGl0IGJlbG9uZ3NcbiAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwLnhLZXl9KVxuICAqIEBwYXJhbSB7c3RyaW5nfSBbeEtleT0neCddXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHhLZXkgPSAneCcsXG4gIC8qKlxuICAqIFRoZSBpbnRlcm5hbCBrZXkgb2YgdGhlIGNlbGwgc3BlY2lmaXlpbmcgdG8gd2hpY2ggeSBheGlzIGtleSBpdCBiZWxvbmdzXG4gICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcC55S2V5fSlcbiAgKiBAcGFyYW0ge3N0cmluZ30gW3lLZXk9J3knXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB5S2V5ID0gJ3knLFxuICAvKipcbiAgKiBUaGUgaW50ZXJuYWwga2V5IG9mIHRoZSBjZWxsIHNwZWNpZml5aW5nIHdoYXQgdmFsdWUgdG8gdXNlIHRvIGRldGVybWluZSB0aGUgcmFkaXVzXG4gICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcC5yS2V5fSlcbiAgKiBAcGFyYW0ge3N0cmluZ30gW3JLZXk9J3InXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICByS2V5ID0gJ3InLFxuICAvKipcbiAgKiBUaGUgaW50ZXJuYWwga2V5IG9mIHRoZSBjZWxsIHNwZWNpZml5aW5nIHdoYXQgdmFsdWUgdG8gdXNlIHRvIGRldGVybWluZSB0aGUgY29sb3JcbiAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwLnZLZXl9KVxuICAqIEBwYXJhbSB7c3RyaW5nfSBbdktleT0ndiddXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHZLZXkgPSAndicsXG5cbiAgLyoqXG4gICogRnVuY3Rpb24gZm9yIGV4dHJhY3RpbmcgdGhlIHRoZSB2YWx1ZSBmcm9tIHhLZXkuXG4gICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcC54RXh0cmFjdG9yfSlcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbeEV4dHJhY3Rvcj1mdW5jdGlvbihrZXksIGkpIHsgcmV0dXJuIGRhdGFba2V5XVt4S2V5XSB9XVxuICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHhFeHRyYWN0b3IgPSBmdW5jdGlvbihrZXksIGkpIHtyZXR1cm4gZGF0YVtrZXldW3hLZXldIH0sXG4gIC8qKlxuICAqIEZ1bmN0aW9uIGZvciBleHRyYWN0aW5nIHRoZSB0aGUgdmFsdWUgZnJvbSB5S2V5LlxuICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAueUV4dHJhY3Rvcn0pXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW3lFeHRyYWN0b3I9ZnVuY3Rpb24oa2V5LCBpKSB7IHJldHVybiBkYXRhW2tleV1beUtleV0gfV1cbiAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB5RXh0cmFjdG9yID0gZnVuY3Rpb24oa2V5LCBpKSB7IHJldHVybiBkYXRhW2tleV1beUtleV0gfSxcbiAgLyoqXG4gICogRnVuY3Rpb24gZm9yIGV4dHJhY3RpbmcgdGhlIHRoZSB2YWx1ZSBmcm9tIHJLZXkuXG4gICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcC5yRXh0cmFjdG9yfSlcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbckV4dHJhY3Rvcj1mdW5jdGlvbihrZXksIGkpIHsgcmV0dXJuIGRhdGFba2V5XVtyS2V5XSB9XVxuICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHJFeHRyYWN0b3IgPSBmdW5jdGlvbihrZXksIGkpIHsgcmV0dXJuIGRhdGFba2V5XVtyS2V5XSB9LFxuICAvKipcbiAgKiBGdW5jdGlvbiBmb3IgZXh0cmFjdGluZyB0aGUgdGhlIHZhbHVlIGZyb20gdktleS5cbiAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwLnZFeHRyYWN0b3J9KVxuICAqIEBwYXJhbSB7ZnVuY3Rpb259IFt2RXh0cmFjdG9yPWZ1bmN0aW9uKGtleSwgaSkgeyByZXR1cm4gZGF0YVtrZXldW3ZLZXldIH1dXG4gICogQHJldHVybnMge251bWJlcn1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdkV4dHJhY3RvciA9IGZ1bmN0aW9uKGtleSwgaSkgeyByZXR1cm4gZGF0YVtrZXldW3ZLZXldIH0sXG5cblxuICAvKipcbiAgKiBXaGV0aGVyIG9yIG5vdCB0byBhbGxvdyBidWJibGVIZWF0bWFwIHRvIHJlbmRlciBlbGVtZW50cyBwYXNzIHRoZSBtYWluIHNwYXRpYWwgZGltZW5zaW9uXG4gICogZ2l2ZW4gdGhlIG9yaWVudGF0aW9uIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjb3JpZW50fSksIHdoZXJlIHtAbGluayBidWJibGVIZWF0bWFwI29yaWVudH09XCJib3R0b21cIiBvciB7QGxpbmsgYnViYmxlSGVhdG1hcCNvcmllbnR9PVwidG9wXCJcbiAgKiB0aGUgbWFpbiBkaW1lbnNpb24gaXMge0BsaW5rIGJ1YmJsZUhlYXRtYXAjc3BhY2VYfSBhbmQgd2hlcmUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjb3JpZW50fT1cImxlZnRcIiBvciB7QGxpbmsgYnViYmxlSGVhdG1hcCNvcmllbnR9PVwicmlnaHRcIlxuICAqIHRoZSBtYWluIGRpbWVuc2lvbiBpcyB7QGxpbmsgYnViYmxlSGVhdG1hcCNzcGFjZVl9XG4gICogQHBhcmFtIHtib29sZWFufSBbb3ZlcmZsb3dRPWZhbHNlXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBvdmVyZmxvd1EgPSBmYWxzZSxcblxuICAvKipcbiAgKiBUaGUgc2NhbGUgZm9yIHdoaWNoIHRoZSByYWRpdXMgdmFsdWVzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBieVxuICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtzY2FsZT1kMy5zY2FsZUxpbmVhcl1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc2NhbGUgPSBkMy5zY2FsZUxpbmVhcigpLFxuICAvKipcbiAgKiBUaGUgcGFkZGluZyBmb3IgdGhlIGRvbWFpbiBvZiB0aGUgc2NhbGUgKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNzY2FsZX0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtkb21haW5QYWRkaW5nPTAuNV1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZG9tYWluUGFkZGluZyA9IDAuNSxcblxuICAvKipcbiAgKiBEZWZhdWx0IHNwYWNlIGZvciB0aGUgc3BhY2VyIChwZXJjZW50YWdlKSBvZiBtYWluIGRpbWVuc2lvbiBnaXZlbiB0aGUgb3JpZW50YXRpb25cbiAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI29yaWVudH0pLCB3aGVyZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNvcmllbnR9PVwiaG9yaXpvbnRhbFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBidWJibGVIZWF0bWFwI3NwYWNlWH0gYW5kIHdoZXJlIHtAbGluayBidWJibGVIZWF0bWFwI29yaWVudH09XCJ2ZXJ0aWNhbFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBidWJibGVIZWF0bWFwI3NwYWNlWX0gYmV0d2VlbiBidWJibGVzXG4gICogQHBhcmFtIHtudW1iZXJ9IFtvYmplY3RTcGFjZXI9MC4wXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBvYmplY3RTcGFjZXIgPSAwLjAsXG4gIC8qKlxuICAqIFRoZSBtaW5pbXVtIHNpemUgdGhhdCBhbiBvYmplY3QgY2FuIGJlXG4gICogQHBhcmFtIHtudW1iZXJ9IFttaW5PYmplY3RTaXplPTUwXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBtaW5PYmplY3RTaXplID0gNTAsXG4gIC8qKlxuICAqIFRoZSBtYXhpbXVtIHNpemUgdGhhdCBhbiBvYmplY3QgY2FuIGJlXG4gICogQHBhcmFtIHtudW1iZXJ9IFttYXhPYmplY3RTaXplPTEwMF1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgbWF4T2JqZWN0U2l6ZSA9IDEwMCxcblxuXG4gIC8qKlxuICAqIFRoZSBzdHJva2Ugd2lkdGggb2YgdGhlIGJ1YmJsZXNcbiAgKiBAcGFyYW0ge251bWJlcn0gW2J1YmJsZVN0cm9rZVdpZHRoPTJdXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGJ1YmJsZVN0cm9rZVdpZHRoID0gMixcbiAgLy8gY29sb3JGdW5jID0gY29sb3JGdW5jdGlvbigpLFxuXG4gIC8qKlxuICAqIENvbG9yIG9mIHRoZSBiYWNrZ3JvdW5kXG4gICogQHBhcmFtIHtzdHJpbmd9IFtiYWNrZ3JvdW5kRmlsbD1cInRyYW5zcGFyZW50XCJdXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGJhY2tncm91bmRGaWxsID0gJ3RyYW5zcGFyZW50JyxcbiAgLyoqXG4gICogTmFtZXNwYWNlIGZvciBhbGwgaXRlbXMgbWFkZSBieSB0aGlzIGluc3RhbmNlIG9mIGJ1YmJsZUhlYXRtYXBcbiAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVzcGFjZT1cImQzc20tYnViYmxlXCJdXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG5hbWVzcGFjZSA9ICdkM3NtLWJ1YmJsZScsXG4gIC8qKlxuICAqIENsYXNzIG5hbWUgZm9yIGJ1YmJsZSBjb250YWluZXIgKDxnPiBlbGVtZW50KVxuICAqIEBwYXJhbSB7c3RyaW5nfSBbb2JqZWN0Q2xhc3M9XCJidWJibGVcIl1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb2JqZWN0Q2xhc3MgPSAnYnViYmxlJyxcbiAgLyoqXG4gICogRHVyYXRpb24gb2YgYWxsIHRyYW5zaXRpb25zIG9mIHRoaXMgZWxlbWVudFxuICAqIEBwYXJhbSB7bnVtYmVyfSBbdHJhbnNpdGlvbkR1cmF0aW9uPTEwMDBdXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHRyYW5zaXRpb25EdXJhdGlvbiA9IDEwMDAsXG4gIC8qKlxuICAqIEVhc2luZyBmdW5jdGlvbiBmb3IgdHJhbnNpdGlvbnNcbiAgKiBAcGFyYW0ge2QzLmVhc2V9IFtlYXNlRnVuYz1kMy5lYXNlRXhwXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBlYXNlRnVuYyA9IGQzLmVhc2VFeHAsXG5cbiAgLyoqXG4gICogU3RvcmVzIHRoZSBrZXlzIG9mIGFsbCB0aGUgY2VsbHNcbiAgKiBDYWxjdWxhdGVkIGFmdGVyIGJ1YmJsZUhlYXRtYXAgY2FsbGVkLlxuICAqIEBwYXJhbSB7c3RyaW5nW119IFtjZWxsS2V5cz11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGNlbGxLZXlzLFxuICAvKipcbiAgKiBTdG9yZXMgdGhlIGxpc3Qgb2YgdW5pcXVlIHhWYWx1ZXNcbiAgKiBDYWxjdWxhdGVkIGFmdGVyIGJ1YmJsZUhlYXRtYXAgY2FsbGVkLlxuICAqIEBwYXJhbSB7c3RyaW5nW119IFt4VmFsdWVzPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgeFZhbHVlcyxcbiAgLyoqXG4gICogU3RvcmVzIHRoZSBsaXN0IG9mIHVuaXF1ZSB5VmFsdWVzXG4gICogQ2FsY3VsYXRlZCBhZnRlciBidWJibGVIZWF0bWFwIGNhbGxlZC5cbiAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbeVZhbHVlcz11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXAjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHlWYWx1ZXMsXG4gIC8qKlxuICAqIFN0b3JlcyB0aGUgbGlzdCBvZiB1bmlxdWUgclZhbHVlc1xuICAqIENhbGN1bGF0ZWQgYWZ0ZXIgYnViYmxlSGVhdG1hcCBjYWxsZWQuXG4gICogQHBhcmFtIHtzdHJpbmdbXX0gW3JWYWx1ZXM9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICByVmFsdWVzLFxuICAvKipcbiAgKiBTdG9yZXMgdGhlIGxpc3Qgb2YgdW5pcXVlIHZWYWx1ZXNcbiAgKiBDYWxjdWxhdGVkIGFmdGVyIGJ1YmJsZUhlYXRtYXAgY2FsbGVkLlxuICAqIEBwYXJhbSB7c3RyaW5nW119IFt2VmFsdWVzPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdlZhbHVlcyxcblxuICB4S2V5U29ydGluZ0Z1bmN0aW9uID0gZnVuY3Rpb24oYSwgYikgeyByZXR1cm4geEV4dHJhY3RvcihhKSAtIHhFeHRyYWN0b3IoYikgfSxcbiAgeUtleVNvcnRpbmdGdW5jdGlvbiA9IGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIHlFeHRyYWN0b3IoYSkgLSB5RXh0cmFjdG9yKGIpIH0sXG4gIHJLZXlTb3J0aW5nRnVuY3Rpb24gPSBmdW5jdGlvbihhLCBiKSB7IHJldHVybiByRXh0cmFjdG9yKGEpIC0gckV4dHJhY3RvcihiKSB9LFxuICB2S2V5U29ydGluZ0Z1bmN0aW9uID0gZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gdkV4dHJhY3RvcihhKSAtIHZFeHRyYWN0b3IoYikgfSxcblxuICAvKipcbiAgKiBJbnN0YW5jZSBvZiBDb2xvckZ1bmN0aW9uIHdpdGggLmNvbG9yQnkgc2V0IHRvICdjYXRlZ29yeSdcbiAgKiBAZnVuY3Rpb24gY29sb3JGdW5jdGlvblxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBjb2xvckZ1bmN0aW9uID0gQ0YoKS5jb2xvckJ5KCdjYXRlZ29yeScpLFxuICAvKipcbiAgKiBJbnN0YW5jZSBvZiBUb29sdGlwXG4gICogQGZ1bmN0aW9uIHRvb2x0aXBcbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdG9vbHRpcCA9IFRUaXAoKSxcblxuICAvKipcbiAgKiBzdG9yZSB0aGUgc2l6ZSB0aGUgYnViYmxlIGNvdWxkIGJlIGluIHRoZSB4IGRpbWVuc2lvblxuICAqIHRoZSBhY3R1YWxsIHNpemUgb2YgdGhlIGJ1YmJsZSB3aWxsIGJlIHRoZSBtaW4gb2YgeFNpemUgYW5kIHtAbGluayBidWJibGVIZWF0bWFwI3lTaXplfVxuICAqIENhbGN1bGF0ZWQgYWZ0ZXIgYnViYmxlSGVhdG1hcCBjYWxsZWQuXG4gICogQHBhcmFtIHtzdHJpbmdbXX0gW3hTaXplPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgeFNpemUsXG4gIC8qKlxuICAqIHN0b3JlIHRoZSBzaXplIG9mIHRoZSBzcGFjZXIgaW4gdGhlIHggZGltZW5zaW9uXG4gICogQ2FsY3VsYXRlZCBhZnRlciBidWJibGVIZWF0bWFwIGNhbGxlZC5cbiAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbeFNwYWNlclNpemU9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB4U3BhY2VyU2l6ZSxcblxuICAvKipcbiAgKiBzdG9yZSB0aGUgc2l6ZSB0aGUgYnViYmxlIGNvdWxkIGJlIGluIHRoZSB5IGRpbWVuc2lvblxuICAqIHRoZSBhY3R1YWxsIHNpemUgb2YgdGhlIGJ1YmJsZSB3aWxsIGJlIHRoZSBtaW4gb2YgeFNpemUgYW5kIHtAbGluayBidWJibGVIZWF0bWFwI3hTaXplfVxuICAqIENhbGN1bGF0ZWQgYWZ0ZXIgYnViYmxlSGVhdG1hcCBjYWxsZWQuXG4gICogQHBhcmFtIHtzdHJpbmdbXX0gW3lTaXplPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgeVNpemUsXG4gIC8qKlxuICAqIHN0b3JlIHRoZSBzaXplIG9mIHRoZSBzcGFjZXIgaW4gdGhlIHkgZGltZW5zaW9uLlxuICAqIENhbGN1bGF0ZWQgYWZ0ZXIgYnViYmxlSGVhdG1hcCBjYWxsZWQuXG4gICogQHBhcmFtIHtzdHJpbmdbXX0gW3hTcGFjZXJTaXplPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcCNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgeVNwYWNlclNpemVcblxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBzZWxlY3Rpb24gaW4gd2hpY2ggaXRlbXMgYXJlIG1hbmlwdWxhdGVkXG4gICAqIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IGQzLnNlbGVjdGlvbn1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc2VsZWN0aW9uID0gc2VsZWN0aW9uXG4gICAqL1xuICBiaG0uc2VsZWN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzZWxlY3Rpb24gPSBfLCBiaG0pIDogc2VsZWN0aW9uOyB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGRhdGFcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNkYXRhfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgb2JqZWN0fVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICovXG4gIGJobS5kYXRhID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkYXRhID0gXywgYmhtKSA6IGRhdGE7IH1cbiAgLy8gYmhtLm9yaWVudCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob3JpZW50ID0gXywgYmhtKSA6IG9yaWVudDsgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBhbW91bnQgb2YgaG9yaXpvbnRhbCBzcGFjZSBpbiB3aGljaCBpdGVtcyBhcmUgbWFuaXB1bGF0ZWRcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNzcGFjZVh9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV0gc2hvdWxkIGJlIGEgbnVtYmVyID4gMFxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc3BhY2VYID0gdW5kZWZpbmVkXG4gICAqL1xuICBiaG0uc3BhY2VYID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzcGFjZVggPSBfLCBiaG0pIDogc3BhY2VYOyB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGFtb3VudCBvZiB2ZXJ0aWNhbCBzcGFjZSBpbiB3aGljaCBpdGVtcyBhcmUgbWFuaXB1bGF0ZWRcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNzcGFjZVl9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV0gc2hvdWxkIGJlIGEgbnVtYmVyID4gMFxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc3BhY2VZID0gdW5kZWZpbmVkXG4gICAqL1xuICBiaG0uc3BhY2VZID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzcGFjZVkgPSBfLCBiaG0pIDogc3BhY2VZOyB9XG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgeEtleVxuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3hLZXl9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHhLZXkgPSAneCdcbiAgICovXG4gIGJobS54S2V5ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4S2V5ID0gXywgYmhtKSA6IHhLZXk7IH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgeUtleVxuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3lLZXl9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHlLZXkgPSAneSdcbiAgICovXG4gIGJobS55S2V5ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5S2V5ID0gXywgYmhtKSA6IHlLZXk7IH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgcktleVxuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3JLZXl9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHJLZXkgPSAncidcbiAgICovXG4gIGJobS5yS2V5ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyS2V5ID0gXywgYmhtKSA6IHJLZXk7IH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgdktleVxuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3ZLZXl9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHZLZXkgPSAneSdcbiAgICovXG4gIGJobS52S2V5ID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2S2V5ID0gXywgYmhtKSA6IHZLZXk7IH1cblxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBjZWxsS2V5c1xuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI2NlbGxLZXlzfSlcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBzdHJpbmdbXX1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgY2VsbEtleXMgPSB1bmRlZmluZWRcbiAgICovXG4gIGJobS5jZWxsS2V5cyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY2VsbEtleXMgPSBfLCBiaG0pIDogY2VsbEtleXM7IH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgeFZhbHVlc1xuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3hWYWx1ZXN9KVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IHN0cmluZ1tdfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB4VmFsdWVzID0gdW5kZWZpbmVkXG4gICAqL1xuICBiaG0ueFZhbHVlcyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeFZhbHVlcyA9IF8sIGJobSkgOiB4VmFsdWVzOyB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHlWYWx1ZXNcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCN5VmFsdWVzfSlcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBzdHJpbmdbXX1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgeVZhbHVlcyA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYmhtLnlWYWx1ZXMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHlWYWx1ZXMgPSBfLCBiaG0pIDogeVZhbHVlczsgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSByVmFsdWVzXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjclZhbHVlc30pXG4gICAqIEBwYXJhbSB7bnVtYmVyW119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgbnVtYmVyW119XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHJWYWx1ZXMgPSB1bmRlZmluZWRcbiAgICovXG4gIGJobS5yVmFsdWVzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyVmFsdWVzID0gXywgYmhtKSA6IHJWYWx1ZXM7IH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgdlZhbHVlc1xuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3ZWYWx1ZXN9KVxuICAgKiBAcGFyYW0ge251bWJlcltdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IG51bWJlcltdfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB2VmFsdWVzID0gdW5kZWZpbmVkXG4gICAqL1xuICBiaG0udlZhbHVlcyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodlZhbHVlcyA9IF8sIGJobSkgOiB2VmFsdWVzOyB9XG5cblxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSB4RXh0cmFjdG9yXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjeEV4dHJhY3Rvcn0pXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgZnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHhFeHRyYWN0b3IgPSB1bmRlZmluZWRcbiAgICovXG4gIGJobS54RXh0cmFjdG9yID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4RXh0cmFjdG9yID0gXywgYmhtKSA6IHhFeHRyYWN0b3I7IH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgeUV4dHJhY3RvclxuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3lFeHRyYWN0b3J9KVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IGZ1bmN0aW9ufVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB5RXh0cmFjdG9yID0gdW5kZWZpbmVkXG4gICAqL1xuICBiaG0ueUV4dHJhY3RvciA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeUV4dHJhY3RvciA9IF8sIGJobSkgOiB5RXh0cmFjdG9yOyB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHJFeHRyYWN0b3JcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNyRXh0cmFjdG9yfSlcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBmdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgckV4dHJhY3RvciA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYmhtLnJFeHRyYWN0b3IgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJFeHRyYWN0b3IgPSBfLCBiaG0pIDogckV4dHJhY3RvcjsgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSB2RXh0cmFjdG9yXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjdkV4dHJhY3Rvcn0pXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgZnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHZFeHRyYWN0b3IgPSB1bmRlZmluZWRcbiAgICovXG4gIGJobS52RXh0cmFjdG9yID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2RXh0cmFjdG9yID0gXywgYmhtKSA6IHZFeHRyYWN0b3I7IH1cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgd2hldGhlciBvciBub3QgYnViYmxlSGVhdG1hcCBpcyBhbGxvd2VkIHRvIGdvIGJleW9uZCBzcGVjaWZpZWQgZGltZW5zaW9uc1xuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3NwYWNlWH0pXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBib29sZWFufVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvdmVyZmxvd1EgPSBmYWxzZVxuICAgKi9cbiAgYmhtLm92ZXJmbG93USA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob3ZlcmZsb3dRID0gXywgYmhtKSA6IG92ZXJmbG93UTsgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNjYWxlIGZvciB3aGljaCB0aGUgcmFkaXVzIG9mIGJ1YmJsZXMgc2hvdWxkIGJlIHRyYW5zZm9ybWVkIGJ5XG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjc2NhbGV9KVxuICAgKiBAcGFyYW0ge2QzLnNjYWxlfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IGQzLnNjYWxlfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzY2FsZSA9IGQzLnNjYWxlTGluZWFyKClcbiAgICovXG4gIGJobS5zY2FsZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2NhbGUgPSBfLCBiaG0pIDogc2NhbGU7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgcGFkZGluZyBmb3IgdGhlIGRvbWFpbiBvZiB0aGUgc2NhbGVcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNkb21haW5QYWRkaW5nfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBkb21haW5QYWRkaW5nID0gMC41XG4gICAqL1xuICBiaG0uZG9tYWluUGFkZGluZyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluUGFkZGluZyA9IF8sIGJobSkgOiBkb21haW5QYWRkaW5nOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgb2JqZWN0U3BhY2VyXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjb2JqZWN0U3BhY2VyfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvYmplY3RTcGFjZXIgPSAwLjBcbiAgICovXG4gIGJobS5vYmplY3RTcGFjZXIgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9iamVjdFNwYWNlciA9IF8sIG9iamVjdFNwYWNlcikgOiBkYXRhOyB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbWluT2JqZWN0U2l6ZVxuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI21pbk9iamVjdFNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG1pbk9iamVjdFNpemUgPSA1MFxuICAgKi9cbiAgYmhtLm1pbk9iamVjdFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG1pbk9iamVjdFNpemUgPSBfLCBiaG0pIDogbWluT2JqZWN0U2l6ZTsgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG1heE9iamVjdFNpemVcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNtYXhPYmplY3RTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBtYXhPYmplY3RTaXplID0gMTAwXG4gICAqL1xuICBiaG0ubWF4T2JqZWN0U2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobWF4T2JqZWN0U2l6ZSA9IF8sIGJobSkgOiBtYXhPYmplY3RTaXplOyB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgYnViYmxlU3Ryb2tlV2lkdGhcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNidWJibGVTdHJva2VXaWR0aH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgYnViYmxlU3Ryb2tlV2lkdGggPSAyXG4gICAqL1xuICBiaG0uYnViYmxlU3Ryb2tlV2lkdGggPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGJ1YmJsZVN0cm9rZVdpZHRoID0gXywgYmhtKSA6IGJ1YmJsZVN0cm9rZVdpZHRoOyB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgYmFja2dyb3VuZEZpbGxcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNiYWNrZ3JvdW5kRmlsbH0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgYmFja2dyb3VuZEZpbGwgPSAndHJhbnNwYXJlbnQnXG4gICAqL1xuICBiaG0uYmFja2dyb3VuZEZpbGwgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGJhY2tncm91bmRGaWxsID0gXywgYmhtKSA6IGJhY2tncm91bmRGaWxsOyB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbmFtZXNwYWNlXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjbmFtZXNwYWNlfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBuYW1lc3BhY2UgPSAnZDNzbS1idWJibGVIZWF0bWFwJ1xuICAgKi9cbiAgYmhtLm5hbWVzcGFjZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobmFtZXNwYWNlID0gXywgYmhtKSA6IG5hbWVzcGFjZTsgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG9iamVjdENsYXNzXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjb2JqZWN0Q2xhc3N9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG9iamVjdENsYXNzID0gJ3RpY2stZ3JvdXAnXG4gICAqL1xuICBiaG0ub2JqZWN0Q2xhc3MgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9iamVjdENsYXNzID0gXywgYmhtKSA6IG9iamVjdENsYXNzOyB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdHJhbnNpdGlvbkR1cmF0aW9uXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjdHJhbnNpdGlvbkR1cmF0aW9ufSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0cmFuc2l0aW9uRHVyYXRpb24gPSAxMDAwXG4gICAqL1xuICBiaG0udHJhbnNpdGlvbkR1cmF0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0cmFuc2l0aW9uRHVyYXRpb24gPSBfLCBiaG0pIDogdHJhbnNpdGlvbkR1cmF0aW9uOyB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgZWFzZUZ1bmNcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCNlYXNlRnVuY30pXG4gICAqIEBwYXJhbSB7ZDMuZWFzZX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBkMy5lYXNlfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBlYXNlRnVuYyA9IGQzLmVhc2VFeHBcbiAgICovXG4gIGJobS5lYXNlRnVuYyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZWFzZUZ1bmMgPSBfLCBiaG0pIDogZWFzZUZ1bmM7IH1cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRvb2x0aXBcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCN0b29sdGlwfSlcbiAgICogQHBhcmFtIHt0b29sdGlwfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IHRvb2x0aXB9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHRvb2x0aXAgPSB0b29sdGlwKClcbiAgICovXG4gIGJobS50b29sdGlwID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0b29sdGlwID0gXywgYmhtKSA6IHRvb2x0aXA7IH1cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHhTaXplXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjeFNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHhTaXplID0gdW5kZWZpbmVkXG4gICAqL1xuICBiaG0ueFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHhTaXplID0gXywgYmhtKSA6IHhTaXplOyB9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgeFNwYWNlclNpemVcbiAgICogKHNlZSB7QGxpbmsgYnViYmxlSGVhdG1hcCN4U3BhY2VyU2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7YnViYmxlSGVhdG1hcCB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJ1YmJsZUhlYXRtYXBcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgeFNwYWNlclNpemUgPSB1bmRlZmluZWRcbiAgICovXG4gIGJobS54U3BhY2VyU2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeFNwYWNlclNpemUgPSBfLCBiaG0pIDogeFNwYWNlclNpemU7IH1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB5U2l6ZVxuICAgKiAoc2VlIHtAbGluayBidWJibGVIZWF0bWFwI3lTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtidWJibGVIZWF0bWFwIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYnViYmxlSGVhdG1hcFxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB5U2l6ZSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYmhtLnlTaXplID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5U2l6ZSA9IF8sIGJobSkgOiB5U2l6ZTsgfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHlTcGFjZXJTaXplXG4gICAqIChzZWUge0BsaW5rIGJ1YmJsZUhlYXRtYXAjeVNwYWNlclNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2J1YmJsZUhlYXRtYXAgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBidWJibGVIZWF0bWFwXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHlTcGFjZXJTaXplID0gdW5kZWZpbmVkXG4gICAqL1xuICBiaG0ueVNwYWNlclNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHlTcGFjZXJTaXplID0gXywgYmhtKSA6IHlTcGFjZXJTaXplOyB9XG4gIC8vIGJobS55S2V5U29ydGluZ0Z1bmN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5S2V5U29ydGluZ0Z1bmN0aW9uID0gXywgYmhtKSA6IHlLZXlTb3J0aW5nRnVuY3Rpb247IH1cbiAgLy8gYmhtLnhLZXlTb3J0aW5nRnVuY3Rpb24gPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHhLZXlTb3J0aW5nRnVuY3Rpb24gPSBfLCBiaG0pIDogeEtleVNvcnRpbmdGdW5jdGlvbjsgfVxuXG5cblxuICBmdW5jdGlvbiBiaG0oKSB7XG4gICAgdmFyIGhvcml6b250YWxRID0gdHJ1ZTsgLy8gbm8gb3JpZW50YXRpb24gaW4gaGVhdG1hcHMuIEFpZHMgYXMgcGxhY2Vob2xkZXIgaW4gZnVuY3Rpb25zIHRoYXQgdGFrZSBvcmllbnQgYXMgYSBwYXJhbWV0ZXJcbiAgICB2YXIgYmdjcFJlY3QgPSB7eDowLCB5OjAsIHdpZHRoOiBzcGFjZVgsIGhlaWdodDpzcGFjZVl9XG4gICAgdmFyIGNvbnRhaW5lciA9IHNldHVwQ29udGFpbmVyKCBzZWxlY3Rpb24sIG5hbWVzcGFjZSwgYmdjcFJlY3QsIGJhY2tncm91bmRGaWxsICk7XG5cbiAgICBjZWxsS2V5cyA9IGQzLmtleXMoZGF0YSk7XG4gICAgY2VsbEtleXMuc29ydChmdW5jdGlvbihhLCBiKXsgcmV0dXJuIHhLZXlTb3J0aW5nRnVuY3Rpb24oYSwgYikgfHwgeUtleVNvcnRpbmdGdW5jdGlvbihhLCBiKSB9KVxuICAgIGxvZygnYnViYmxlSGVhdG1hcCcsICdjZWxscyBhcmUgc29ydGVkIGJ5JywgY2VsbEtleXMpXG5cblxuXG4gICAgeFZhbHVlcyA9IHVuaXF1ZShjZWxsS2V5cy5tYXAoeEV4dHJhY3RvcikpO1xuICAgIHlWYWx1ZXMgPSB1bmlxdWUoY2VsbEtleXMubWFwKHlFeHRyYWN0b3IpKTtcbiAgICByVmFsdWVzID0gdW5pcXVlKGNlbGxLZXlzLm1hcChyRXh0cmFjdG9yKSk7XG4gICAgdlZhbHVlcyA9IHVuaXF1ZShjZWxsS2V5cy5tYXAodkV4dHJhY3RvcikpO1xuICAgIGxvZygnYnViYmxlSGVhdG1hcCcsICd4IGFuZCB5IGtleXMgYXJlJywge3g6IHhWYWx1ZXMsIHk6eVZhbHVlc30pXG5cblxuICAgIHZhciB4RGltID0geFZhbHVlcy5sZW5ndGgsIHlEaW0gPSB5VmFsdWVzLmxlbmd0aDtcblxuXG4gICAgdmFyIGV4dGVudCA9IFtNYXRoLm1pbiguLi5yVmFsdWVzKSAtIGRvbWFpblBhZGRpbmcsTWF0aC5tYXgoLi4uclZhbHVlcykgKyBkb21haW5QYWRkaW5nXTtcblxuXG4gICAgeVNpemUgPSBjYWxjdWxhdGVXaWR0aE9mT2JqZWN0KHNwYWNlWSwgeURpbSwgbWluT2JqZWN0U2l6ZSwgbWF4T2JqZWN0U2l6ZSwgb2JqZWN0U3BhY2VyLCBvdmVyZmxvd1EpXG4gICAgeFNpemUgPSBjYWxjdWxhdGVXaWR0aE9mT2JqZWN0KHNwYWNlWCwgeERpbSwgbWluT2JqZWN0U2l6ZSwgbWF4T2JqZWN0U2l6ZSwgb2JqZWN0U3BhY2VyLCBvdmVyZmxvd1EpXG4gICAgeVNwYWNlclNpemUgPSBjYWxjdWxhdGVXaWR0aE9mU3BhY2VyKHlWYWx1ZXMsIHNwYWNlWSwgeVNpemUsIHlEaW0sIG9iamVjdFNwYWNlciwgb3ZlcmZsb3dRKVxuICAgIHhTcGFjZXJTaXplID0gY2FsY3VsYXRlV2lkdGhPZlNwYWNlcih4VmFsdWVzLCBzcGFjZVgsIHhTaXplLCB4RGltLCBvYmplY3RTcGFjZXIsIG92ZXJmbG93USlcbiAgICBsb2coJ2J1YmJsZUhlYXRtYXAnLCAnc2l6ZSBvZicsIHt4OiB4U2l6ZSwgeTogeVNpemV9KVxuXG5cbiAgICBzY2FsZS5kb21haW4oZXh0ZW50KS5yYW5nZShbMCwgTWF0aC5taW4oeVNpemUsIHhTaXplKS8yXSlcblxuICAgIHZhciB5U3BhY2VyID0gZ3JvdXBpbmdTcGFjZXIoKVxuICAgIC5ob3Jpem9udGFsUShmYWxzZSlcbiAgICAubW92ZWJ5KCdjYXRlZ29yeScpLm51bWJlck9mT2JqZWN0cyh5RGltKVxuICAgIC5vYmplY3RDbGFzcyhoeXBlbmF0ZShvYmplY3RDbGFzcywgJ3JvdycpKVxuICAgIC5vYmplY3RTaXplKHlTaXplKS5zcGFjZXJTaXplKHlTcGFjZXJTaXplKVxuICAgIC50cmFuc2l0aW9uRHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlRnVuYyhlYXNlRnVuYylcbiAgICAubmFtZXNwYWNlKCdyb3cnKVxuXG4gICAgdmFyIHhTcGFjZXIgPSBncm91cGluZ1NwYWNlcigpXG4gICAgLmhvcml6b250YWxRKHRydWUpXG4gICAgLm1vdmVieSgnY2F0ZWdvcnknKS5udW1iZXJPZk9iamVjdHMoeERpbSlcbiAgICAub2JqZWN0Q2xhc3Mob2JqZWN0Q2xhc3MpXG4gICAgLm9iamVjdFNpemUoeFNpemUpLnNwYWNlclNpemUoeFNwYWNlclNpemUpXG4gICAgLnRyYW5zaXRpb25EdXJhdGlvbih0cmFuc2l0aW9uRHVyYXRpb24pLmVhc2VGdW5jKGVhc2VGdW5jKVxuXG5cbiAgICB5U3BhY2VyKGNvbnRhaW5lciwgeVZhbHVlcywgMClcbiAgICBjb250YWluZXIuc2VsZWN0QWxsKCdnLicraHlwZW5hdGUob2JqZWN0Q2xhc3MsICdyb3cnKSlcbiAgICAuZWFjaChmdW5jdGlvbihkLCBpKXtcbiAgICAgIHhTcGFjZXIoZDMuc2VsZWN0KHRoaXMpLCB4VmFsdWVzLCAwKVxuICAgIH0pXG4gICAgdmFyIGNlbGxzID0gY29udGFpbmVyLnNlbGVjdEFsbCgnZzpub3QoLnRvLXJlbW92ZSkuJytvYmplY3RDbGFzcykuZGF0YShjZWxsS2V5cyk7XG5cbiAgICB2YXIgcGFyZW50SW5kZXhBcnJheSA9IFtdXG4gICAgY2VsbHMuZWFjaChmdW5jdGlvbihkLCBpKXsgcGFyZW50SW5kZXhBcnJheS5wdXNoKE51bWJlcihkMy5zZWxlY3QodGhpcykuYXR0cigncGFyZW50LWluZGV4JykpKSB9KVxuXG5cbiAgICBjb2xvckZ1bmN0aW9uID0gY29sb3JGdW5jdGlvbi5jb2xvckJ5KCkgPT0gJ2luZGV4J1xuICAgID8gY29sb3JGdW5jdGlvbi5kYXRhRXh0ZW50KFswLCBNYXRoLm1heCguLi5wYXJlbnRJbmRleEFycmF5KV0pXG4gICAgOiBjb2xvckZ1bmN0aW9uLmRhdGFFeHRlbnQoZXh0ZW50KVxuXG4gICAgY2VsbHMuZWFjaChmdW5jdGlvbihrZXksIGkpIHtcbiAgICAgIGxvZygnYnViYmxlSGVhdG1hcCcsICdlYWNoIGNlbGwnLCB7a2V5OiBrZXksIGluZGV4OiBpLCBub2RlOiBkMy5zZWxlY3QodGhpcykubm9kZSgpfSlcblxuICAgICAgdmFyIHQgPSBkMy5zZWxlY3QodGhpcyksXG4gICAgICBjdXJyZW50RGF0YSA9IGRhdGFba2V5XSxcbiAgICAgIHZhbHVlID0gdkV4dHJhY3RvcihrZXksIGkpLFxuICAgICAgcmFkaXVzPSByRXh0cmFjdG9yKGtleSwgaSksXG4gICAgICBpID0gdC5hdHRyKCdwYXJlbnQtaW5kZXgnKSA9PSB1bmRlZmluZWQgPyBpIDogdC5hdHRyKCdwYXJlbnQtaW5kZXgnKSxcbiAgICAgIGZpbGxDb2xvciA9IGNvbG9yRnVuY3Rpb24oa2V5LCB2YWx1ZSwgaSwgJ2ZpbGwnKSwgLy8gcHJldmVudCBkdXBsaWNhdGUgY29tcHV0YXRpb25cbiAgICAgIHN0cm9rZUNvbG9yID0gY29sb3JGdW5jdGlvbihrZXksIHZhbHVlLCBpLCAgJ3N0cm9rZScpXG5cbiAgICAgIHZhciBjID0gc2FmZVNlbGVjdCh0LCAnY2lyY2xlJywgaHlwZW5hdGUob2JqZWN0Q2xhc3MsJ2NpcmNsZScpKVxuICAgICAgYy5hdHRyKCdjeCcsIHhTaXplIC8gMilcbiAgICAgIC5hdHRyKCdjeScsIHlTaXplIC8gMiApXG4gICAgICAuYXR0cigncicsIHNjYWxlKHJhZGl1cykpXG4gICAgICAuYXR0cignZmlsbCcsIGZpbGxDb2xvcilcbiAgICAgIC5hdHRyKCdzdHJva2UnLCBzdHJva2VDb2xvcilcbiAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCBidWJibGVTdHJva2VXaWR0aClcblxuICAgIH0pXG5cbiAgICB0b29sdGlwLnNlbGVjdGlvbihjZWxscy5zZWxlY3RBbGwoJ2NpcmNsZS4nK2h5cGVuYXRlKG9iamVjdENsYXNzLCAnY2lyY2xlJykpKVxuICAgIC5kYXRhKGRhdGEpXG4gICAgLy8gLmtleXMoWydyJywgJ3YnXSlcbiAgICAvLyAuaGVhZGVyKGZ1bmN0aW9uKGQsIGkpe3JldHVybiBoeXBlbmF0ZShkYXRhW2RdW3hLZXldLCBkYXRhW2RdW3lLZXldKSB9KVxuXG4gICAgdG9vbHRpcCgpXG5cblxuICB9XG5cbiAgcmV0dXJuIGJobTtcbn1cblxuZXhwb3J0IHtidWJibGVIZWF0bWFwfVxuIiwiaW1wb3J0IHtoeXBlbmF0ZSwgc2FmZVNlbGVjdH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7c2V0dXBDb250YWluZXIsIGNhbGN1bGF0ZVdpZHRoT2ZPYmplY3QsIGNhbGN1bGF0ZVdpZHRoT2ZTcGFjZXIsIHdoaXNrZXJQYXRofSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7dW5pcXVlLCBoYXNRLCBmbGF0dGVufSBmcm9tICcuL2FycmF5LWZ1bmN0aW9ucyc7XG5pbXBvcnQge2dyb3VwaW5nU3BhY2VyfSBmcm9tICcuL2dyb3VwaW5nLXNwYWNlcic7XG5pbXBvcnQge2NvbG9yRnVuY3Rpb24gYXMgQ0Z9IGZyb20gJy4vY29sb3ItZnVuY3Rpb24nO1xuaW1wb3J0IHt0b29sdGlwIGFzIFRUaXB9IGZyb20gJy4vdG9vbHRpcCc7XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9YIEFORCBXSElTS0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqXG4gKiBDcmVhdGVzIGEgYm94d2hpc2tlclxuICpcbiAqIHtAbGluayBodHRwczovL3N1bW5ldXJvbi5naXRsYWIuaW8vZDNzbS9kZW1vcy9ib3gtd2hpc2tlcnMvaW5kZXguaHRtbCBEZW1vfVxuICogQGNvbnN0cnVjdG9yIGJveHdoaXNrZXJcbiAqIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBzZWxlY3Rpb25cbiAqIEBuYW1lc3BhY2UgYm94d2hpc2tlclxuICogQHJldHVybnMge2Z1bmN0aW9ufSBib3h3aGlza2VyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBib3h3aGlza2VyKCBzZWxlY3Rpb24gKSB7XG4gIHZhclxuICAvKipcbiAgKiBEYXRhIHRvIHBsb3QuIEFzc3VtZWQgdG8gYmUgYSBvYmplY3QsIHdoZXJlIGVhY2gga2V5IGNvcnJlc3BvbmRzIHRvIGEgYm94XG4gICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNkYXRhfSlcbiAgKiBAcGFyYW0ge09iamVjdH0gW2RhdGE9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBkYXRhLFxuICAvKipcbiAgKiBXaGljaCBkaXJlY3Rpb24gdG8gcmVuZGVyIHRoZSBib3hlcyBpblxuICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjb3JpZW50fSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW29yaWVudD0naG9yaXpvbnRhbCddXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG9yaWVudCA9ICdob3Jpem9udGFsJyxcbiAgLyoqXG4gICogQW1vdW50IG9mIGhvcml6b250YWwgc3BhY2UgKGluIHBpeGVscykgYXZhaWJsZSB0byByZW5kZXIgdGhlIGJveHdoaXNrZXIgaW5cbiAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI3NwYWNlWH0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZVg9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzcGFjZVgsXG4gIC8qKlxuICAqIEFtb3VudCBvZiB2ZXJ0aWNhbCBzcGFjZSAoaW4gcGl4ZWxzKSBhdmFpYmxlIHRvIHJlbmRlciB0aGUgYm94d2hpc2tlciBpblxuICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIuc3BhY2VZfSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW3NwYWNlWT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNwYWNlWSxcbiAgLyoqXG4gICogV2hldGhlciBvciBub3QgdG8gYWxsb3cgYm94d2hpc2tlciB0byByZW5kZXIgZWxlbWVudHMgcGFzcyB0aGUgbWFpbiBzcGF0aWFsIGRpbWVuc2lvblxuICAqIGdpdmVuIHRoZSBvcmllbnRhdGlvbiAoc2VlIHtAbGluayBib3h3aGlza2VyI29yaWVudH0pLCB3aGVyZSB7QGxpbmsgYm94d2hpc2tlciNvcmllbnR9PVwiaG9yaXpvbnRhbFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBib3h3aGlza2VyI3NwYWNlWH0gYW5kIHdoZXJlIHtAbGluayBib3h3aGlza2VyI29yaWVudH09XCJ2ZXJ0aWNhbFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBib3h3aGlza2VyI3NwYWNlWX1cbiAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvdmVyZmxvd1E9ZmFsc2VdXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG92ZXJmbG93USA9IHRydWUsXG5cbiAgLyoqXG4gICogQW4gYXJyYXkgLSBwdXRhdGl2ZWx5IG9mIG90aGVyIGFycmF5cyAtIGRlcGljdGluZyBob3cgYm94ZXMgc2hvdWxkIGJlIGFycmFuZ2VkXG4gICogQHBhcmFtIHtBcnJheVtdfSBbZ3JvdXBpbmc9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBncm91cGluZyxcbiAgcXVhcnRpbGVzS2V5ID0gJ3F1YXJ0aWxlcycsIC8vIGtleSBpbiBvYmplY3Qgd2hlcmUgcXVhcnRpbGVzIGFyZSBzdG9yZWRcbiAgcXVhcnRpbGVzS2V5cyA9IFtcIjAuMDBcIiwgXCIwLjI1XCIsIFwiMC41MFwiLCBcIjAuNzVcIiwgXCIxLjAwXCJdLCAvLyBrZXlzIGluIHF1YXJ0aWxlcyBvYmplY3QgbWFwcGluZyB2YWx1ZXMgdG8gbWluLCBxMSwgcTIsIHEzIGFuZCBtYXhcblxuXG4gIC8qKlxuICAqIEhvdyB0byBnZXQgdGhlIHZhbHVlIG9mIHRoZSBib3h3aGlza2VyXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW3ZhbHVlRXh0cmFjdG9yPWZ1bmN0aW9uKGtleSwgaW5kZXgpIHsgcmV0dXJuIGRhdGFba2V5XVtxdWFydGlsZXNLZXldIH1dXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHZhbHVlRXh0cmFjdG9yID0gZnVuY3Rpb24oa2V5LCBpbmRleCkgeyByZXR1cm4gZGF0YVtrZXldW3F1YXJ0aWxlc0tleV0gfSxcbiAgLyoqXG4gICogSG93IHRvIHNvcnQgdGhlIGJveGVzIC0gaWYge0BsaW5rIGJveHdoaXNrZXIjZ3JvdXBpbmd9IGlzIG5vdCBwcm92aWRlZC5cbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbc29ydGluZ0Z1bmN0aW9uPWRlc2NlbmRpbmddXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICogZGVmYXVsdFxuICAqIGZ1bmN0aW9uKGtleUEsIGtleUIpIHtyZXR1cm4gZDMuZGVzY2VuZGluZyhcbiAgKiAgIHZhbHVlRXh0cmFjdG9yKGtleUEpW3F1YXJ0aWxlc0tleXNbNF1dLFxuICAqICAgdmFsdWVFeHRyYWN0b3Ioa2V5QilbcXVhcnRpbGVzS2V5c1s0XV1cbiAgKiApfVxuICAqL1xuICBzb3J0aW5nRnVuY3Rpb24gPSBmdW5jdGlvbihrZXlBLCBrZXlCKSB7cmV0dXJuIGQzLmRlc2NlbmRpbmcoXG4gICAgdmFsdWVFeHRyYWN0b3Ioa2V5QSlbcXVhcnRpbGVzS2V5c1s0XV0sXG4gICAgdmFsdWVFeHRyYWN0b3Ioa2V5QilbcXVhcnRpbGVzS2V5c1s0XV1cbiAgKX0sXG4gIC8qKlxuICAqIFRoZSBzY2FsZSBmb3Igd2hpY2ggYm94d2hpc2tlciB2YWx1ZXMgc2hvdWxkIGJlIHRyYW5zZm9ybWVkIGJ5XG4gICogQHBhcmFtIHtkMy5zY2FsZX0gW3NjYWxlPWQzLnNjYWxlTGluZWFyXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzY2FsZSA9IGQzLnNjYWxlTGluZWFyKCksXG4gIC8qKlxuICAqIFRoZSBwYWRkaW5nIGZvciB0aGUgZG9tYWluIG9mIHRoZSBzY2FsZSAoc2VlIHtAbGluayBib3h3aGlza2VyI3NjYWxlfSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW2RvbWFpblBhZGRpbmc9MC41XVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBkb21haW5QYWRkaW5nID0gMC41LFxuICAvKipcbiAgKiBEZWZhdWx0IHNwYWNlIGZvciB0aGUgc3BhY2VyIChwZXJjZW50YWdlKSBvZiBtYWluIGRpbWVuc2lvbiBnaXZlbiB0aGUgb3JpZW50YXRpb25cbiAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI29yaWVudH0pLCB3aGVyZSB7QGxpbmsgYm94d2hpc2tlciNvcmllbnR9PVwiaG9yaXpvbnRhbFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBib3h3aGlza2VyI3NwYWNlWH0gYW5kIHdoZXJlIHtAbGluayBib3h3aGlza2VyI29yaWVudH09XCJ2ZXJ0aWNhbFwiXG4gICogdGhlIG1haW4gZGltZW5zaW9uIGlzIHtAbGluayBib3h3aGlza2VyI3NwYWNlWX0gYmV0d2VlbiBib3hlc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbb2JqZWN0U3BhY2VyPTAuMDVdXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG9iamVjdFNwYWNlciA9IDAuMDUsXG4gIC8qKlxuICAqIFRoZSBtaW5pbXVtIHNpemUgdGhhdCBhbiBvYmplY3QgY2FuIGJlXG4gICogQHBhcmFtIHtudW1iZXJ9IFttaW5PYmplY3RTaXplPTE1XVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBtaW5PYmplY3RTaXplID0gMTUsXG4gIC8qKlxuICAqIFRoZSBtYXhpbXVtIHNpemUgdGhhdCBhbiBvYmplY3QgY2FuIGJlXG4gICogQHBhcmFtIHtudW1iZXJ9IFttYXhPYmplY3RTaXplPTUwXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBtYXhPYmplY3RTaXplID0gNTAsXG4gIC8qKlxuICAqIFBlcmNlbnQgb2YgYm94IGFuZCB3aGlza2VyIHNpemUgdGhhdCB3aGlza2VycyB3aWxsIGJlIHJlbmRlcmVkXG4gICogc2VlIHtAbGluayBib3h3aGlza2VyI29iamVjdFNpemV9XG4gICogQHBhcmFtIHtudW1iZXJ9IFt3aGlza2VyV2lkdGhQZXJjZW50PTAuNl1cbiAgKiBAbWVtYmVyb2YgYm94d2hpc2tlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgd2hpc2tlcldpZHRoUGVyY2VudCA9IC42LFxuICAvKipcbiAgKiBJbnN0YW5jZSBvZiBDb2xvckZ1bmN0aW9uXG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW2NvbG9yRnVuY3Rpb24gPSBjb2xvckZ1bmN0aW9uKCldXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGNvbG9yRnVuY3Rpb24gPSBDRigpLFxuICAvKipcbiAgKiBUaGUgc3Ryb2tlIHdpZHRoIG9mIHRoZSBib3hlc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbYm94U3Ryb2tlV2lkdGg9Ml1cbiAgKiBAbWVtYmVyb2YgYm94d2hpc2tlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgYm94U3Ryb2tlV2lkdGggPSAyLFxuICAvKipcbiAgKiBUaGUgc3Ryb2tlIHdpZHRoIG9mIHRoZSB3aGlza2Vyc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbd2hpc2tlclN0cm9rZVdpZHRoPTJdXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHdoaXNrZXJTdHJva2VXaWR0aCA9IDIsXG5cbiAgLyoqXG4gICogQ29sb3Igb2YgdGhlIGJhY2tncm91bmRcbiAgKiBAcGFyYW0ge3N0cmluZ30gW2JhY2tncm91bmRGaWxsPVwidHJhbnNwYXJlbnRcIl1cbiAgKiBAbWVtYmVyb2YgYm94d2hpc2tlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgYmFja2dyb3VuZEZpbGwgPSAndHJhbnNwYXJlbnQnLFxuICAvKipcbiAgKiBOYW1lc3BhY2UgZm9yIGFsbCBpdGVtcyBtYWRlIGJ5IHRoaXMgaW5zdGFuY2Ugb2YgYm94d2hpc2tlclxuICAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZXNwYWNlPVwiZDNzbS1ib3gtd2hpc2tlclwiXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBuYW1lc3BhY2UgPSAnZDNzbS1ib3gtd2hpc2tlcicsXG4gIC8qKlxuICAqIENsYXNzIG5hbWUgZm9yIGJveHdoaXNrZXIgY29udGFpbmVyICg8Zz4gZWxlbWVudClcbiAgKiBAcGFyYW0ge3N0cmluZ30gW29iamVjdENsYXNzPVwiYm94LXdoaXNrXCJdXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG9iamVjdENsYXNzID0gJ2JveC13aGlzaycsXG5cbiAgLyoqXG4gICogRHVyYXRpb24gb2YgYWxsIHRyYW5zaXRpb25zIG9mIHRoaXMgZWxlbWVudFxuICAqIEBwYXJhbSB7bnVtYmVyfSBbdHJhbnNpdGlvbkR1cmF0aW9uPTEwMDBdXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHRyYW5zaXRpb25EdXJhdGlvbiA9IDEwMDAsXG4gIC8qKlxuICAqIEVhc2luZyBmdW5jdGlvbiBmb3IgdHJhbnNpdGlvbnNcbiAgKiBAcGFyYW0ge2QzLmVhc2V9IFtlYXNlRnVuYz1kMy5lYXNlRXhwXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBlYXNlRnVuYyA9IGQzLmVhc2VFeHAsXG5cbiAgLyoqXG4gICogVGhlIGtleXMgb2YgdGhlIGJveGVzXG4gICogQHBhcmFtIHtzdHJpbmdbXX0gW2JveEtleXM9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBib3hLZXlzLFxuICAvKipcbiAgKiBUaGUgdmFsdWVzIG9mIHRoZSBib3hlc1xuICAqIEBwYXJhbSB7c3RyaW5nW119IFtib3hWYWx1ZXM9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBib3h3aGlza2VyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBib3hWYWx1ZXMsXG4gIC8qKlxuICAqIFRoZSBvYmplY3RTaXplIChhY3R1YWwgd2lkdGgpIHVzZWQgYnkgdGhlIGJveGVzXG4gICogQHBhcmFtIHtudW1iZXJ9IFtvYmplY3RTaXplPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2YgYm94d2hpc2tlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb2JqZWN0U2l6ZSxcbiAgLyoqXG4gICogVGhlIHNwYWNlclNpemUgKGFjdHVhbCB3aWR0aCkgdXNlZCBieSB0aGUgc3BhY2VycyBiZXR3ZWVuIHRoZSBib3hlc1xuICAqIEBwYXJhbSB7bnVtYmVyfSBbc3BhY2VyU2l6ZT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNwYWNlclNpemUsXG4gIC8qKlxuICAqIEluc3RhbmNlIG9mIFRvb2x0aXBcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbdG9vbHRpcD10b29sdGlwKCldXG4gICogQG1lbWJlcm9mIGJveHdoaXNrZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHRvb2x0aXAgPSBUVGlwKClcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgc2VsZWN0aW9uIGluIHdoaWNoIGl0ZW1zIGFyZSBtYW5pcHVsYXRlZFxuICAgKiBAcGFyYW0ge2QzLnNlbGVjdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBkMy5zZWxlY3Rpb259XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNlbGVjdGlvbiA9IHNlbGVjdGlvblxuICAgKi9cbiAgYm94d2hpc2tlci5zZWxlY3Rpb24gPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNlbGVjdGlvbiA9IF8sIGJveHdoaXNrZXIpIDogc2VsZWN0aW9uOyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBkYXRhXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjZGF0YX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IG9iamVjdH1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqL1xuICBib3h3aGlza2VyLmRhdGEgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRhdGEgPSBfLCBib3h3aGlza2VyKSA6IGRhdGE7IH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIG9yaWVudCBvZiB0aGUgYm94ZXNcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNvcmllbnR9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBvYmplY3R9XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKi9cbiAgYm94d2hpc2tlci5vcmllbnQgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9yaWVudCA9IF8sIGJveHdoaXNrZXIpIDogb3JpZW50OyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBhbW91bnQgb2YgaG9yaXpvbnRhbCBzcGFjZSBpbiB3aGljaCBpdGVtcyBhcmUgbWFuaXB1bGF0ZWRcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNzcGFjZVh9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV0gc2hvdWxkIGJlIGEgbnVtYmVyID4gMFxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc3BhY2VYID0gdW5kZWZpbmVkXG4gICAqL1xuICBib3h3aGlza2VyLnNwYWNlWCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3BhY2VYID0gXywgYm94d2hpc2tlcikgOiBzcGFjZVg7IH07XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGFtb3VudCBvZiB2ZXJ0aWNhbCBzcGFjZSBpbiB3aGljaCBpdGVtcyBhcmUgbWFuaXB1bGF0ZWRcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNzcGFjZVl9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV0gc2hvdWxkIGJlIGEgbnVtYmVyID4gMFxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc3BhY2VZID0gdW5kZWZpbmVkXG4gICAqL1xuICBib3h3aGlza2VyLnNwYWNlWSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3BhY2VZID0gXywgYm94d2hpc2tlcikgOiBzcGFjZVk7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB3aGV0aGVyIG9yIG5vdCBib3h3aGlza2VyIGlzIGFsbG93ZWQgdG8gZ28gYmV5b25kIHNwZWNpZmllZCBkaW1lbnNpb25zXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjb3ZlcmZsb3dRfSlcbiAgICogQHBhcmFtIHtib29sZWFufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IGJvb2xlYW59XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG92ZXJmbG93USA9IGZhbHNlXG4gICAqL1xuICBib3h3aGlza2VyLm92ZXJmbG93USA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob3ZlcmZsb3dRID0gXywgYm94d2hpc2tlcikgOiBvdmVyZmxvd1E7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgZ3JvdXBpbmcgb2YgdGhlIGJveGVzXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjZ3JvdXBpbmd9KVxuICAgKiBAcGFyYW0ge0FycmF5W119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgQXJyYXlbXX1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgZ3JvdXBpbmcgPSB1bmRlZmluZWRcbiAgICovXG4gIGJveHdoaXNrZXIuZ3JvdXBpbmcgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGdyb3VwaW5nID0gXywgYm94d2hpc2tlcikgOiBncm91cGluZzsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBxdWFydGlsZXNLZXlcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNxdWFydGlsZXNLZXl9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHF1YXJ0aWxlc0tleSA9IHF1YXJ0aWxlc1xuICAgKi9cbiAgYm94d2hpc2tlci5xdWFydGlsZXNLZXkgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHF1YXJ0aWxlc0tleSA9IF8sIGJveHdoaXNrZXIpIDogcXVhcnRpbGVzS2V5OyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHF1YXJ0aWxlc0tleXNcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNxdWFydGlsZXNLZXlzfSlcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBzdHJpbmdbXX1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgcXVhcnRpbGVzS2V5cyA9IFtRMCwgUTEsIFEyLCBRMywgUTRdXG4gICAqL1xuICBib3h3aGlza2VyLnF1YXJ0aWxlc0tleXMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHF1YXJ0aWxlc0tleXMgPSBfLCBib3h3aGlza2VyKSA6IHF1YXJ0aWxlc0tleXM7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdmFsdWVFeHRyYWN0b3JcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciN2YWx1ZUV4dHJhY3Rvcn0pXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgZnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHZhbHVlRXh0cmFjdG9yID0gZnVuY3Rpb24oa2V5LCBpbmRleCkgeyByZXR1cm4gZGF0YVtrZXldW3F1YXJ0aWxlc0tleV0gfSxcbiAgICovXG5cbiAgYm94d2hpc2tlci52YWx1ZUV4dHJhY3RvciA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmFsdWVFeHRyYWN0b3IgPSBfLCBib3h3aGlza2VyKSA6IHZhbHVlRXh0cmFjdG9yOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHNvcnRpbmdGdW5jdGlvblxuICAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI3NvcnRpbmdGdW5jdGlvbn0pXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgZnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNvcnRpbmdGdW5jdGlvbiA9IGZ1bmN0aW9uKGtleUEsIGtleUIpIHtyZXR1cm4gZDMuZGVzY2VuZGluZyhcbiAgICogICB2YWx1ZUV4dHJhY3RvcihrZXlBKVtxdWFydGlsZXNLZXlzWzRdXSxcbiAgICogICB2YWx1ZUV4dHJhY3RvcihrZXlCKVtxdWFydGlsZXNLZXlzWzRdXVxuICAgKiApfSxcbiAgICovXG4gIGJveHdoaXNrZXIuc29ydGluZ0Z1bmN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzb3J0aW5nRnVuY3Rpb24gPSBfLCBib3h3aGlza2VyKSA6IHNvcnRpbmdGdW5jdGlvbjsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBzY2FsZSBmb3Igd2hpY2ggdGhlIGJveHdoaXNrZXIgdmFsdWVzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBieVxuICAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI3NjYWxlfSlcbiAgICogQHBhcmFtIHtkMy5zY2FsZX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBkMy5zY2FsZX1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc2NhbGUgPSBkMy5zY2FsZUxpbmVhcigpXG4gICAqL1xuICBib3h3aGlza2VyLnNjYWxlID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzY2FsZSA9IF8sIGJveHdoaXNrZXIpIDogc2NhbGU7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgcGFkZGluZyBmb3IgdGhlIGRvbWFpbiBvZiB0aGUgc2NhbGVcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNkb21haW5QYWRkaW5nfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBkb21haW5QYWRkaW5nID0gMC41XG4gICAqL1xuICBib3h3aGlza2VyLmRvbWFpblBhZGRpbmcgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpblBhZGRpbmcgPSBfLCBib3h3aGlza2VyKSA6IGRvbWFpblBhZGRpbmc7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyBvYmplY3RTcGFjZXJcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNvYmplY3RTcGFjZXJ9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG9iamVjdFNwYWNlciA9IDAuMDVcbiAgICovXG4gIGJveHdoaXNrZXIub2JqZWN0U3BhY2VyID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvYmplY3RTcGFjZXIgPSBfLCBib3h3aGlza2VyKSA6IG9iamVjdFNwYWNlcjsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBtaW5PYmplY3RTaXplXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjbWluT2JqZWN0U2l6ZX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgbWluT2JqZWN0U2l6ZSA9IDE1XG4gICAqL1xuICBib3h3aGlza2VyLm1pbk9iamVjdFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG1pbk9iamVjdFNpemUgPSBfLCBib3h3aGlza2VyKSA6IG1pbk9iamVjdFNpemU7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbWF4T2JqZWN0U2l6ZVxuICAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI21heE9iamVjdFNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG1heE9iamVjdFNpemUgPSA1MFxuICAgKi9cbiAgYm94d2hpc2tlci5tYXhPYmplY3RTaXplID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChtYXhPYmplY3RTaXplID0gXywgYm94d2hpc2tlcikgOiBtYXhPYmplY3RTaXplOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHdoaXNrZXJXaWR0aFBlcmNlbnRcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciN3aGlza2VyV2lkdGhQZXJjZW50fSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBtYXhPYmplY3RTaXplID0gMC42XG4gICAqL1xuICBib3h3aGlza2VyLndoaXNrZXJXaWR0aFBlcmNlbnQgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHdoaXNrZXJXaWR0aFBlcmNlbnQgPSBfLCBib3h3aGlza2VyKSA6IHdoaXNrZXJXaWR0aFBlcmNlbnQ7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgY29sb3JGdW5jdGlvblxuICAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI2NvbG9yRnVuY3Rpb259KVxuICAgKiBAcGFyYW0ge2NvbG9yRnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgY29sb3JGdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgY29sb3JGdW5jdGlvbiA9IGNvbG9yRnVuY3Rpb24oKVxuICAgKi9cbiAgYm94d2hpc2tlci5jb2xvckZ1bmN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjb2xvckZ1bmN0aW9uID0gXywgYm94d2hpc2tlcikgOiBjb2xvckZ1bmN0aW9uOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGJveFN0cm9rZVdpZHRoXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjYm94U3Ryb2tlV2lkdGh9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGJveFN0cm9rZVdpZHRoID0gMlxuICAgKi9cbiAgYm94d2hpc2tlci5ib3hTdHJva2VXaWR0aCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYm94U3Ryb2tlV2lkdGggPSBfLCBib3h3aGlza2VyKSA6IGJveFN0cm9rZVdpZHRoOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHdoaXNrZXJTdHJva2VXaWR0aFxuICAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI3doaXNrZXJTdHJva2VXaWR0aH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgd2hpc2tlclN0cm9rZVdpZHRoID0gMlxuICAgKi9cbiAgYm94d2hpc2tlci53aGlza2VyU3Ryb2tlV2lkdGggPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHdoaXNrZXJTdHJva2VXaWR0aCA9IF8sIGJveHdoaXNrZXIpIDogd2hpc2tlclN0cm9rZVdpZHRoOyB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgYmFja2dyb3VuZEZpbGxcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNiYWNrZ3JvdW5kRmlsbH0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7Ym94d2hpc2tlciB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgYmFja2dyb3VuZEZpbGwgPSAndHJhbnNwYXJlbnQnXG4gICAqL1xuICBib3h3aGlza2VyLmJhY2tncm91bmRGaWxsID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChiYWNrZ3JvdW5kRmlsbCA9IF8sIGJveHdoaXNrZXIpIDogYmFja2dyb3VuZEZpbGw7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgbmFtZXNwYWNlXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjbmFtZXNwYWNlfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBuYW1lc3BhY2UgPSAnZDNzbS1ib3h3aGlza2VyJ1xuICAgKi9cbiAgYm94d2hpc2tlci5uYW1lc3BhY2UgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG5hbWVzcGFjZSA9IF8sIGJveHdoaXNrZXIpIDogbmFtZXNwYWNlOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG9iamVjdENsYXNzXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjb2JqZWN0Q2xhc3N9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG9iamVjdENsYXNzID0gJ3RpY2stZ3JvdXAnXG4gICAqL1xuICBib3h3aGlza2VyLm9iamVjdENsYXNzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvYmplY3RDbGFzcyA9IF8sIGJveHdoaXNrZXIpIDogb2JqZWN0Q2xhc3M7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdHJhbnNpdGlvbkR1cmF0aW9uXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjdHJhbnNpdGlvbkR1cmF0aW9ufSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0cmFuc2l0aW9uRHVyYXRpb24gPSAxMDAwXG4gICAqL1xuICBib3h3aGlza2VyLnRyYW5zaXRpb25EdXJhdGlvbiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodHJhbnNpdGlvbkR1cmF0aW9uID0gXywgYm94d2hpc2tlcikgOiB0cmFuc2l0aW9uRHVyYXRpb247IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgZWFzZUZ1bmNcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNlYXNlRnVuY30pXG4gICAqIEBwYXJhbSB7ZDMuZWFzZX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBkMy5lYXNlfVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBlYXNlRnVuYyA9IGQzLmVhc2VFeHBcbiAgICovXG4gIGJveHdoaXNrZXIuZWFzZUZ1bmMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGVhc2VGdW5jID0gXywgYm94d2hpc2tlcikgOiBlYXNlRnVuYzsgfTtcblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGJhcktleXNcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNib3hLZXlzfSlcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBzdHJpbmdbXX1cbiAgICogQG1lbWJlcm9mIGJveHdoaXNrZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgYm94S2V5cyA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYm94d2hpc2tlci5ib3hLZXlzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChib3hLZXlzID0gXywgYm94d2hpc2tlcikgOiBib3hLZXlzOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIGJveFZhbHVlc1xuICAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI2JveFZhbHVlc30pXG4gICAqIEBwYXJhbSB7bnVtYmVyW119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgbnVtYmVyW119XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGJveFZhbHVlcyA9IHVuZGVmaW5lZFxuICAgKi9cbiAgYm94d2hpc2tlci5ib3hWYWx1ZXMgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGJveFZhbHVlcyA9IF8sIGJveHdoaXNrZXIpIDogYm94VmFsdWVzOyB9O1xuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG9iamVjdFNpemVcbiAgICogKHNlZSB7QGxpbmsgYm94d2hpc2tlciNvYmplY3RTaXplfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtib3h3aGlza2VyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvYmplY3RTaXplID0gdW5kZWZpbmVkXG4gICAqL1xuICBib3h3aGlza2VyLm9iamVjdFNpemUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9iamVjdFNpemUgPSBfLCBib3h3aGlza2VyKSA6IG9iamVjdFNpemU7IH07XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgc3BhY2VyU2l6ZVxuICAgKiAoc2VlIHtAbGluayBib3h3aGlza2VyI3NwYWNlclNpemV9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBib3h3aGlza2VyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNwYWNlclNpemUgPSB1bmRlZmluZWRcbiAgICovXG4gIGJveHdoaXNrZXIuc3BhY2VyU2l6ZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3BhY2VyU2l6ZSA9IF8sIGJveHdoaXNrZXIpIDogc3BhY2VyU2l6ZTsgfTtcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB0b29sdGlwXG4gICAqIChzZWUge0BsaW5rIGJveHdoaXNrZXIjdG9vbHRpcH0pXG4gICAqIEBwYXJhbSB7dG9vbHRpcH0gW189bm9uZV1cbiAgICogQHJldHVybnMge2JveHdoaXNrZXIgfCB0b29sdGlwfVxuICAgKiBAbWVtYmVyb2YgYm94d2hpc2tlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0b29sdGlwID0gdG9vbHRpcCgpXG4gICAqL1xuICBib3h3aGlza2VyLnRvb2x0aXAgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRvb2x0aXAgPSBfLCBib3h3aGlza2VyKSA6IHRvb2x0aXA7IH07XG5cblxuICBmdW5jdGlvbiBib3h3aGlza2VyKCkge1xuICAgIC8vIGZvciBjb252ZW5pZW5jZSBpbiBoYW5kbGluZyBvcmllbnRhdGlvbiBzcGVjaWZpYyB2YWx1ZXNcbiAgICB2YXIgaG9yaXpvbnRhbFEgPSAob3JpZW50ID09ICdob3Jpem9udGFsJykgPyB0cnVlIDogZmFsc2VcbiAgICB2YXIgdmVydGljYWxRID0gIWhvcml6b250YWxRXG5cbiAgICAvLyBiYWNrZ3JvdW5kIGNsaXBpbmcgcmVjdGFuZ2xlXG4gICAgdmFyIGJnY3BSZWN0ID0ge3g6MCwgeTowLCB3aWR0aDogc3BhY2VYLCBoZWlnaHQ6c3BhY2VZfVxuICAgIHZhciBjb250YWluZXIgPSBzZXR1cENvbnRhaW5lciggc2VsZWN0aW9uLCBuYW1lc3BhY2UsIGJnY3BSZWN0LCBiYWNrZ3JvdW5kRmlsbCApO1xuXG4gICAgLy8gaWYgZ3JvdXBpbmcgaXMgdW5kZWZpbmVkIHNvcnQga2V5cyBieSBzb3J0aW5nIGZ1bmN0XG4gICAgdmFyIG9yZGVyZWQgPSAoZ3JvdXBpbmcgPT0gdW5kZWZpbmVkKSA/IGQzLmtleXMoZGF0YSkuc29ydChzb3J0aW5nRnVuY3Rpb24pIDogZ3JvdXBpbmdcbiAgICAvLyB0byBwcmV2ZW50IHJlLWNhbGN1bGF0aW9uIGFuZCBnZXR0ZXJzIHRvIGJlIHBhc3NlZCB0byBheGVzXG4gICAgYm94S2V5cyA9IGZsYXR0ZW4ob3JkZXJlZClcbiAgICBib3hWYWx1ZXMgPSBib3hLZXlzLm1hcCh2YWx1ZUV4dHJhY3RvcilcblxuXG4gICAgdmFyIG51bWJlck9mT2JqZWN0cyA9IGJveEtleXMubGVuZ3RoXG4gICAgdmFyIGV4dGVudCA9IFtcbiAgICAgIE1hdGgubWluKC4uLmJveFZhbHVlcy5tYXAoZnVuY3Rpb24oZCxpKXtyZXR1cm4gZFtxdWFydGlsZXNLZXlzWzBdXX0pKSAtIGRvbWFpblBhZGRpbmcsXG4gICAgICBNYXRoLm1heCguLi5ib3hWYWx1ZXMubWFwKGZ1bmN0aW9uKGQsaSl7cmV0dXJuIGRbcXVhcnRpbGVzS2V5c1s0XV19KSkgKyBkb21haW5QYWRkaW5nXG4gICAgXTtcblxuICAgIC8vIHNldCB0aGUgc2NhbGVcbiAgICBzY2FsZS5kb21haW4oZXh0ZW50KS5yYW5nZShob3Jpem9udGFsUSA/IFswLHNwYWNlWV0gOiBbc3BhY2VYLCAwXSlcbiAgICB2YXIgc3BhY2UgPSBob3Jpem9udGFsUSA/IHNwYWNlWCA6IHNwYWNlWVxuICAgIC8vIGNhbGN1bGF0ZSBvYmplY3Qgc2l6ZVxuICAgIG9iamVjdFNpemUgPSBjYWxjdWxhdGVXaWR0aE9mT2JqZWN0KHNwYWNlLCBudW1iZXJPZk9iamVjdHMsIG1pbk9iamVjdFNpemUsIG1heE9iamVjdFNpemUsIG9iamVjdFNwYWNlciwgb3ZlcmZsb3dRKVxuICAgIC8vIGNhbGN1bGF0ZSBzcGFjZXIgc2l6ZSBpZiBuZWVkZWRcbiAgICBzcGFjZXJTaXplID0gY2FsY3VsYXRlV2lkdGhPZlNwYWNlcihib3hLZXlzLCBzcGFjZSwgb2JqZWN0U2l6ZSwgbnVtYmVyT2ZPYmplY3RzLCBvYmplY3RTcGFjZXIsIG92ZXJmbG93USlcbiAgICAvLyBtYWtlIHRoZSBuZXN0ZWQgZ3JvdXBzXG4gICAgdmFyIHNwYWNlckZ1bmN0aW9uID0gZ3JvdXBpbmdTcGFjZXIoKVxuICAgIC5ob3Jpem9udGFsUShob3Jpem9udGFsUSkuc2NhbGUoc2NhbGUpLm1vdmVieSgnY2F0ZWdvcnknKS5udW1iZXJPZk9iamVjdHMobnVtYmVyT2ZPYmplY3RzKVxuICAgIC5vYmplY3RDbGFzcyhvYmplY3RDbGFzcykub2JqZWN0U2l6ZShvYmplY3RTaXplKS5zcGFjZXJTaXplKHNwYWNlclNpemUpXG4gICAgLnRyYW5zaXRpb25EdXJhdGlvbih0cmFuc2l0aW9uRHVyYXRpb24pLmVhc2VGdW5jKGVhc2VGdW5jKVxuICAgIC5uYW1lc3BhY2UobmFtZXNwYWNlKVxuXG4gICAgLy8gbW92ZSBzdHVmZlxuICAgIHNwYWNlckZ1bmN0aW9uKGNvbnRhaW5lciwgb3JkZXJlZCwgMClcblxuICAgIHZhciBwYXJlbnRJbmRleEFycmF5ID0gW11cbiAgICBjb250YWluZXIuc2VsZWN0QWxsKCdnOm5vdCgudG8tcmVtb3ZlKS4nK29iamVjdENsYXNzKVxuICAgIC5lYWNoKGZ1bmN0aW9uKGQsIGkpe2lmIChoYXNRKGJveEtleXMsIGQpKXsgcGFyZW50SW5kZXhBcnJheS5wdXNoKE51bWJlcihkMy5zZWxlY3QodGhpcykuYXR0cigncGFyZW50LWluZGV4JykpKX19KVxuXG5cblxuICAgIGNvbG9yRnVuY3Rpb24gPSBjb2xvckZ1bmN0aW9uLmNvbG9yQnkoKSA9PSAnaW5kZXgnXG4gICAgPyBjb2xvckZ1bmN0aW9uLmRhdGFFeHRlbnQoWzAsIE1hdGgubWF4KC4uLnBhcmVudEluZGV4QXJyYXkpXSlcbiAgICA6IGNvbG9yRnVuY3Rpb24uZGF0YUV4dGVudChleHRlbnQpXG5cblxuICAgIC8vIHNldCBhdHRyaWJ1dGVzIGZvciBib3ggYW5kIHdoaXNrZXJzXG4gICAgY29udGFpbmVyLnNlbGVjdEFsbCgnZzpub3QoLnRvLXJlbW92ZSkuJytvYmplY3RDbGFzcykuZWFjaChmdW5jdGlvbihrZXksIGkpIHtcbiAgICAgIHZhciB0ID0gZDMuc2VsZWN0KHRoaXMpLFxuICAgICAgY3VycmVudERhdGEgPSBkYXRhW2tleV0sXG5cbiAgICAgIHF1YXJ0aWxlcyA9IHZhbHVlRXh0cmFjdG9yKGtleSwgaSksXG4gICAgICBxMCA9IHF1YXJ0aWxlc1txdWFydGlsZXNLZXlzWzBdXSxcbiAgICAgIHExID0gcXVhcnRpbGVzW3F1YXJ0aWxlc0tleXNbMV1dLFxuICAgICAgcTIgPSBxdWFydGlsZXNbcXVhcnRpbGVzS2V5c1syXV0sXG4gICAgICBxMyA9IHF1YXJ0aWxlc1txdWFydGlsZXNLZXlzWzNdXSxcbiAgICAgIHE0ID0gcXVhcnRpbGVzW3F1YXJ0aWxlc0tleXNbNF1dXG5cbiAgICAgIHZhciBpID0gdC5hdHRyKCdwYXJlbnQtaW5kZXgnKSA9PSB1bmRlZmluZWQgPyBpIDogdC5hdHRyKCdwYXJlbnQtaW5kZXgnKSxcbiAgICAgIGZpbGxDb2xvciA9IGNvbG9yRnVuY3Rpb24oa2V5LCBxMiwgaSwgJ2ZpbGwnKSwgLy8gcHJldmVudCBkdXBsaWNhdGUgY29tcHV0YXRpb25cbiAgICAgIHN0cm9rZUNvbG9yID0gY29sb3JGdW5jdGlvbihrZXksIHEyLCBpLCAgJ3N0cm9rZScpXG5cblxuICAgICAgdmFyXG4gICAgICB3aGlzayA9IHNhZmVTZWxlY3QodCwgJ2cnLCAnd2hpc2tlcicpLFxuICAgICAgdVdoaXNrID0gc2FmZVNlbGVjdCh3aGlzaywgJ3BhdGgnLCAndXBwZXInKSxcbiAgICAgIGxXaGlzayA9IHNhZmVTZWxlY3Qod2hpc2ssICdwYXRoJywgJ2xvd2VyJyksXG4gICAgICBxdWFydCA9IHNhZmVTZWxlY3QodCwgJ2cnLCAncXVhcnRpbGUnKSxcbiAgICAgIHVRdWFydCA9IHNhZmVTZWxlY3QocXVhcnQsICdyZWN0JywgJ3VwcGVyJyksXG4gICAgICBsUXVhcnQgPSBzYWZlU2VsZWN0KHF1YXJ0LCAncmVjdCcsICdsb3dlcicpLFxuICAgICAgbVF1YXJ0ID0gc2FmZVNlbGVjdChxdWFydCwgJ2NpcmNsZScsICdtZWRpYW4nKVxuXG5cbiAgICAgIC8vIHNldCB1cHBlciBxdWFydGlsZSAocTMpXG4gICAgICB1UXVhcnQudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuZWFzZShlYXNlRnVuYylcbiAgICAgIC5hdHRyKCd3aWR0aCcsIGhvcml6b250YWxRID8gb2JqZWN0U2l6ZSA6IHNjYWxlKHEzKSAtIHNjYWxlKHEyKSlcbiAgICAgIC5hdHRyKCdoZWlnaHQnLCB2ZXJ0aWNhbFEgPyBvYmplY3RTaXplIDogc2NhbGUocTMpIC0gc2NhbGUocTIpKVxuICAgICAgLmF0dHIoJ2ZpbGwnLCBmaWxsQ29sb3IpXG4gICAgICAuYXR0cignc3Ryb2tlJywgc3Ryb2tlQ29sb3IpXG4gICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgYm94U3Ryb2tlV2lkdGgpXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24oZCwgaSl7XG4gICAgICAgIHZhclxuICAgICAgICB4ID0gaG9yaXpvbnRhbFEgPyAwIDogc2NhbGUocTIpLFxuICAgICAgICB5ID0gdmVydGljYWxRID8gMCA6IHNjYWxlKGV4dGVudFsxXSkgLSBzY2FsZShxMyksXG4gICAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgICAgcmV0dXJuIHRcbiAgICAgIH0pXG5cbiAgICAgIC8vIHNldCBsb3dlciBxdWFydGlsZSAocTEpXG4gICAgICBsUXVhcnQudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuZWFzZShlYXNlRnVuYylcbiAgICAgIC5hdHRyKCd3aWR0aCcsIGhvcml6b250YWxRID8gb2JqZWN0U2l6ZSA6IHNjYWxlKHEyKSAtIHNjYWxlKHExKSlcbiAgICAgIC5hdHRyKCdoZWlnaHQnLCB2ZXJ0aWNhbFEgPyBvYmplY3RTaXplIDogc2NhbGUocTIpIC0gc2NhbGUocTEpKVxuICAgICAgLmF0dHIoJ2ZpbGwnLCBmaWxsQ29sb3IpXG4gICAgICAuYXR0cignc3Ryb2tlJywgc3Ryb2tlQ29sb3IpXG4gICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgYm94U3Ryb2tlV2lkdGgpXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24oZCwgaSl7XG4gICAgICAgIHZhclxuICAgICAgICB4ID0gaG9yaXpvbnRhbFEgPyAwIDogc2NhbGUocTEpLFxuICAgICAgICB5ID0gdmVydGljYWxRID8gMCA6IHNjYWxlKGV4dGVudFsxXSkgLSBzY2FsZShxMiksXG4gICAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgICAgcmV0dXJuIHRcbiAgICAgIH0pXG5cblxuICAgICAgLy8gc2V0IG1lZGlhbiAocTIpXG4gICAgICBtUXVhcnQudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuZWFzZShlYXNlRnVuYylcbiAgICAgIC5hdHRyKCdyJywgZnVuY3Rpb24oZCwgaSl7XG4gICAgICAgIHZhciByID0gb2JqZWN0U2l6ZSAvIDJcbiAgICAgICAgdmFyIGRpZiA9IChzY2FsZShxMykgLSBzY2FsZShxMSkpIC8gMlxuICAgICAgICByZXR1cm4gKHIgPiBkaWYpID8gZGlmIDogclxuICAgICAgfSlcbiAgICAgIC5hdHRyKCdmaWxsJywgZmlsbENvbG9yKVxuICAgICAgLmF0dHIoJ3N0cm9rZScsIHN0cm9rZUNvbG9yKVxuICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIGJveFN0cm9rZVdpZHRoKVxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uKGQsIGkpe1xuICAgICAgICB2YXJcbiAgICAgICAgeCA9IGhvcml6b250YWxRID8gb2JqZWN0U2l6ZSAvIDIgOiBzY2FsZShxMiksXG4gICAgICAgIHkgPSB2ZXJ0aWNhbFEgPyBvYmplY3RTaXplIC8gMiA6IHNjYWxlKGV4dGVudFsxXSkgLSBzY2FsZShxMiksXG4gICAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgICAgcmV0dXJuIHRcbiAgICAgIH0pXG5cbiAgICAgIC8vIHNldCBsb3dlciB3aGlza2VyIChtaW4pXG4gICAgICBsV2hpc2sudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuZWFzZShlYXNlRnVuYylcbiAgICAgIC5hdHRyKCdkJywgZnVuY3Rpb24oZGQsIGlpKXtcbiAgICAgICAgdmFyXG4gICAgICAgIGRpciA9IGZhbHNlLFxuICAgICAgICB4ID0gMCxcbiAgICAgICAgeSA9IDAsXG4gICAgICAgIGggPSBob3Jpem9udGFsUSA/IHNjYWxlKHExKSAtIHNjYWxlKHEwKSA6IG9iamVjdFNpemUsXG4gICAgICAgIHcgPSB2ZXJ0aWNhbFEgPyBzY2FsZShxMSkgLSBzY2FsZShxMCkgOiBvYmplY3RTaXplXG4gICAgICAgIHJldHVybiB3aGlza2VyUGF0aChkaXIsIHgsIHksIHcsIGgsIHdoaXNrZXJXaWR0aFBlcmNlbnQsIG9yaWVudClcbiAgICAgIH0pXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24oZCwgaSl7XG4gICAgICAgIHZhclxuICAgICAgICB4ID0gaG9yaXpvbnRhbFEgPyAwIDogc2NhbGUocTEpLFxuICAgICAgICB5ID0gdmVydGljYWxRID8gMCA6IHNjYWxlKGV4dGVudFsxXSkgLSBzY2FsZShxMSksXG4gICAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgICAgcmV0dXJuIHRcbiAgICAgIH0pXG4gICAgICAuYXR0cignc3Ryb2tlJywgJ2JsYWNrJykuYXR0cignc3Ryb2tlLXdpZHRoJywgd2hpc2tlclN0cm9rZVdpZHRoKVxuICAgICAgLmF0dHIoJ2ZpbGwnLCAnbm9uZScpXG5cbiAgICAgIC8vIHNldCB1cHBlciB3aGlza2VyIChtYXgpXG4gICAgICB1V2hpc2sudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuZWFzZShlYXNlRnVuYylcbiAgICAgIC5hdHRyKCdkJywgZnVuY3Rpb24oZGQsIGlpKXtcbiAgICAgICAgdmFyXG4gICAgICAgIGRpciA9IHRydWUsXG4gICAgICAgIHggPSAwLFxuICAgICAgICB5ID0gMCxcbiAgICAgICAgaCA9IGhvcml6b250YWxRID8gc2NhbGUocTQpIC0gc2NhbGUocTMpIDogb2JqZWN0U2l6ZSxcbiAgICAgICAgdyA9IHZlcnRpY2FsUSA/IHNjYWxlKHE0KSAtIHNjYWxlKHEzKSA6IG9iamVjdFNpemVcbiAgICAgICAgcmV0dXJuIHdoaXNrZXJQYXRoKGRpciwgeCwgeSwgdywgaCwgd2hpc2tlcldpZHRoUGVyY2VudCwgb3JpZW50KVxuICAgICAgfSlcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbihkLCBpKXtcbiAgICAgICAgdmFyXG4gICAgICAgIHggPSBob3Jpem9udGFsUSA/IDAgOiBzY2FsZShxMyksXG4gICAgICAgIHkgPSB2ZXJ0aWNhbFEgPyAwIDogIHNjYWxlKGV4dGVudFsxXSkgLSBzY2FsZShxNCksXG4gICAgICAgIHQgPSAndHJhbnNsYXRlKCcreCsnLCcreSsnKSdcbiAgICAgICAgcmV0dXJuIHRcbiAgICAgIH0pXG4gICAgICAuYXR0cignc3Ryb2tlJywgJ2JsYWNrJylcbiAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCB3aGlza2VyU3Ryb2tlV2lkdGgpXG4gICAgICAuYXR0cignZmlsbCcsICdub25lJylcblxuICAgIH0pXG5cbiAgICB0b29sdGlwLnNlbGVjdGlvbihjb250YWluZXIuc2VsZWN0QWxsKCdnOm5vdCgudG8tcmVtb3ZlKS4nK29iamVjdENsYXNzKSlcbiAgICAuZGF0YShkYXRhKVxuICAgIHRvb2x0aXAoKVxuXG5cbiAgfVxuXG4gIHJldHVybiBib3h3aGlza2VyXG59XG4iLCJpbXBvcnQge2h5cGVuYXRlLCBzYWZlU2VsZWN0fSBmcm9tICcuL2hlbHBlcnMnO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFUQVRPR0dMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqXG4gKiBDcmVhdGVzIGEgZGF0YXRvZ2dsZVxuICogQGNvbnN0cnVjdG9yIGRhdGF0b2dnbGVcbiAqIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBzZWxlY3Rpb25cbiAqIEBuYW1lc3BhY2UgZGF0YXRvZ2dsZVxuICogQHJldHVybnMge2Z1bmN0aW9ufSBkYXRhdG9nZ2xlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkYXRhdG9nZ2xlKCBzZWxlY3Rpb24gKSB7XG4gIHZhclxuICAvKipcbiAgKiBLZXlzIHRvIG1ha2UgdG9nZ2xlLWFibGUgb3B0aW9uc1xuICAqIChzZWUge0BsaW5rIGRhdGF0b2dnbGUja2V5c30pXG4gICogQHBhcmFtIHtzdHJpbmdbXX0gW2tleXM9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBkYXRhdG9nZ2xlI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBrZXlzLFxuICAvKipcbiAgKiBXaGF0IHRvIGRvIHdoZW4gYSBkaWZmZXJlbnQga2V5IGlzIGNsaWNrZWRcbiAgKiAoc2VlIHtAbGluayBkYXRhdG9nZ2xlI3VwZGF0ZUZ1bmN0aW9ufSlcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbdXBkYXRlRnVuY3Rpb249ZnVuY3Rpb24oKXt9XVxuICAqIEBtZW1iZXJvZiBkYXRhdG9nZ2xlI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB1cGRhdGVGdW5jdGlvbiA9IGZ1bmN0aW9uKCl7fSxcbiAgLyoqXG4gICogTmFtZXNwYWNlIGZvciBhbGwgaXRlbXMgbWFkZSBieSB0aGlzIGluc3RhbmNlIG9mIGRhdGF0b2dnbGVcbiAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVzcGFjZT1cImQzc20tZGF0YWJhclwiXVxuICAqIEBtZW1iZXJvZiBkYXRhdG9nZ2xlI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBuYW1lc3BhY2U9J2Qzc20tZGF0YWJhcicsXG4gIC8qKlxuICAqIEN1cnJlbnRseSB0b2dnbGVkIGtleVxuICAqIEBwYXJhbSB7c3RyaW5nfSBbY3VycmVudEtleT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIGRhdGF0b2dnbGUjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGN1cnJlbnRLZXlcbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBrZXlzXG4gICAqIChzZWUge0BsaW5rIGRhdGF0b2dnbGUja2V5c30pXG4gICAqIEBmdW5jdGlvbiBkYXRhdG9nZ2xlLmtleXNcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge2RhdGF0b2dnbGUgfCBzdHJpbmdbXX1cbiAgICogQG1lbWJlcm9mIGRhdGF0b2dnbGVcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQga2V5cyA9IHVuZGVmaW5lZFxuICAgKi9cbiAgdG9nZ2xlLmtleXMgPSBmdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChrZXlzID0gXywgdG9nZ2xlKSA6IGtleXN9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdXBkYXRlRnVuY3Rpb25cbiAgICogKHNlZSB7QGxpbmsgZGF0YXRvZ2dsZSN1cGRhdGVGdW5jdGlvbn0pXG4gICAqIEBmdW5jdGlvbiBkYXRhdG9nZ2xlLnVwZGF0ZUZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtkYXRhdG9nZ2xlIHwgZnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiBkYXRhdG9nZ2xlXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHVwZGF0ZUZ1bmN0aW9uID0gZnVuY3Rpb24oKXt9XG4gICAqL1xuICB0b2dnbGUudXBkYXRlRnVuY3Rpb24gPSBmdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh1cGRhdGVGdW5jdGlvbiA9IF8sIHRvZ2dsZSkgOiB1cGRhdGVGdW5jdGlvbn1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBuYW1lc3BhY2VcbiAgICogKHNlZSB7QGxpbmsgZGF0YXRvZ2dsZSNuYW1lc3BhY2V9KVxuICAgKiBAZnVuY3Rpb24gZGF0YXRvZ2dsZS5uYW1lc3BhY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtkYXRhdG9nZ2xlIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgZGF0YXRvZ2dsZVxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBuYW1lc3BhY2UgPSAnZDNzbS1kYXRhYmFyJ1xuICAgKi9cbiAgdG9nZ2xlLm5hbWVzcGFjZSA9IGZ1bmN0aW9uKF8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG5hbWVzcGFjZSA9IF8sIHRvZ2dsZSkgOiBuYW1lc3BhY2V9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgY3VycmVudEtleVxuICAgKiAoc2VlIHtAbGluayBkYXRhdG9nZ2xlI2N1cnJlbnRLZXl9KVxuICAgKiBAZnVuY3Rpb24gZGF0YXRvZ2dsZS5jdXJyZW50S2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7ZGF0YXRvZ2dsZSB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIGRhdGF0b2dnbGVcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgY3VycmVudEtleSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgdG9nZ2xlLmN1cnJlbnRLZXkgPSBmdW5jdGlvbihfKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjdXJyZW50S2V5ID0gXywgdG9nZ2xlKSA6IGN1cnJlbnRLZXl9XG5cbiAgZnVuY3Rpb24gdG9nZ2xlKCkge1xuICAgIC8vIHNlbGVjdGlvbiBvcHRpb25zXG4gICAgdmFyIGRhdGFvcHRzID0gc2VsZWN0aW9uLnNlbGVjdEFsbCgnZGl2LmRhdGEtb3B0aW9uJylcbiAgICAvLyByZW1vdmUgZXhjZXNzXG4gICAgZGF0YW9wdHMuZXhpdCgpLnJlbW92ZSgpXG4gICAgLy8gYmluZCBkYXRhXG4gICAgZGF0YW9wdHMgPSBkYXRhb3B0cy5kYXRhKGtleXMpXG4gICAgLy8gZW50ZXJcbiAgICB2YXIgZG9FbnRlciA9IGRhdGFvcHRzLmVudGVyKCkuYXBwZW5kKCdkaXYnKS5hdHRyKCdjbGFzcycsICdkYXRhLW9wdGlvbicpXG4gICAgLmNsYXNzZWQoJ2Zvcm0tY2hlY2sgZm9ybS1jaGVjay1pbmxpbmUgYWxpZ24tbWlkZGxlJywgdHJ1ZSlcbiAgICBkb0VudGVyXG4gICAgLmFwcGVuZCgnaW5wdXQnKS5hdHRyKCd0eXBlJywgJ3JhZGlvJylcbiAgICAuYXR0cignaWQnLCBmdW5jdGlvbihkLGkpe3JldHVybiBoeXBlbmF0ZShuYW1lc3BhY2UsIGQpfSlcbiAgICAuYXR0cignbmFtZScsIGh5cGVuYXRlKG5hbWVzcGFjZSwgJ2RhdGFiYXInKSlcbiAgICAuYXR0cigndmFsdWUnLCBmdW5jdGlvbihkLCBpKXtyZXR1cm4gZH0pXG5cbiAgICBkb0VudGVyXG4gICAgLmFwcGVuZCgnbGFiZWwnKVxuICAgIC5hdHRyKCdmb3InLCBmdW5jdGlvbihkLGkpe3JldHVybiBoeXBlbmF0ZShuYW1lc3BhY2UsIGQpfSlcbiAgICAuYXR0cignbmFtZScsIGh5cGVuYXRlKG5hbWVzcGFjZSwgJ2RhdGFiYXInKSlcbiAgICAudGV4dChmdW5jdGlvbihkLCBpKXtyZXR1cm4gZH0pXG5cbiAgICBkYXRhb3B0cyA9IGRhdGFvcHRzLm1lcmdlKGRvRW50ZXIpXG5cbiAgICBjdXJyZW50S2V5ID0gZGF0YW9wdHMuc2VsZWN0KCc6Y2hlY2tlZCcpLmVtcHR5KClcbiAgICA/IGtleXNbMF1cbiAgICA6IGRhdGFvcHRzLnNlbGVjdCgnOmNoZWNrZWQnKS5kYXR1bSgpXG5cbiAgICAvLyBjaGVjayBjdXJyZW50XG4gICAgZGF0YW9wdHMuc2VsZWN0KCdbdmFsdWU9XCInK2N1cnJlbnRLZXkrJ1wiXScpLnByb3BlcnR5KCdjaGVja2VkJywgdHJ1ZSlcblxuICAgIC8vIGJpbmQgdXBkYXRlIGZ1bmN0aW9uXG4gICAgZGF0YW9wdHMub24oJ2NsaWNrJywgZnVuY3Rpb24oZCwgaSl7IHVwZGF0ZUZ1bmN0aW9uKCkgfSlcbiAgICByZXR1cm4gdG9nZ2xlXG4gIH1cblxuICByZXR1cm4gdG9nZ2xlXG59XG4iLCJpbXBvcnQge2h5cGVuYXRlLCBzYWZlU2VsZWN0fSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHtzZXR1cENvbnRhaW5lciwgY2FsY3VsYXRlV2lkdGhPZk9iamVjdCwgY2FsY3VsYXRlV2lkdGhPZlNwYWNlcn0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge3VuaXF1ZSwgZmxhdHRlbn0gZnJvbSAnLi9hcnJheS1mdW5jdGlvbnMnO1xuaW1wb3J0IHtncm91cGluZ1NwYWNlcn0gZnJvbSAnLi9ncm91cGluZy1zcGFjZXInO1xuaW1wb3J0IHtjb2xvckZ1bmN0aW9uIGFzIENGfSBmcm9tICcuL2NvbG9yLWZ1bmN0aW9uJztcbmltcG9ydCB7dG9vbHRpcCBhcyBUVGlwfSBmcm9tICcuL3Rvb2x0aXAnO1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0FUVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKlxuICogQ3JlYXRlcyBhIHNjYXR0ZXJcbiAqXG4gKiB7QGxpbmsgaHR0cHM6Ly9zdW1uZXVyb24uZ2l0bGFiLmlvL2Qzc20vZGVtb3Mvc2NhdHRlci9pbmRleC5odG1sIERlbW99XG4gKiBAY29uc3RydWN0b3Igc2NhdHRlclxuICogQHBhcmFtIHtkMy5zZWxlY3Rpb259IHNlbGVjdGlvblxuICogQG5hbWVzcGFjZSBzY2F0dGVyXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259IHNjYXR0ZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjYXR0ZXIgKCBzZWxlY3Rpb24gKSB7XG5cbiAgdmFyXG4gIC8qKlxuICAqIERhdGEgdG8gcGxvdC4gQXNzdW1lZCB0byBiZSBhIG9iamVjdCwgd2hlcmUgZWFjaCBrZXkgY29ycmVzcG9uZHMgdG8gYSBwb2ludFxuICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjZGF0YX0pXG4gICogQHBhcmFtIHtPYmplY3R9IFtkYXRhPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZGF0YSxcbiAgLyoqXG4gICogQW1vdW50IG9mIGhvcml6b250YWwgc3BhY2UgKGluIHBpeGVscykgYXZhaWJsZSB0byByZW5kZXIgdGhlIHNjYXR0ZXIgaW5cbiAgKiAoc2VlIHtAbGluayBzY2F0dGVyI3NwYWNlWH0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtzcGFjZVg9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBzcGFjZVgsXG4gIC8qKlxuICAqIEFtb3VudCBvZiB2ZXJ0aWNhbCBzcGFjZSAoaW4gcGl4ZWxzKSBhdmFpYmxlIHRvIHJlbmRlciB0aGUgc2NhdHRlciBpblxuICAqIChzZWUge0BsaW5rIHNjYXR0ZXIuc3BhY2VZfSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW3NwYWNlWT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNwYWNlWSxcblxuICAvKipcbiAgKiBUaGUgc2NhbGUgZm9yIHdoaWNoIHNjYXR0ZXIgeCB2YWx1ZXMgc2hvdWxkIGJlIHRyYW5zZm9ybWVkIGJ5XG4gICogQHBhcmFtIHtkMy5zY2FsZX0gW3NjYWxlWD1kMy5zY2FsZUxpbmVhcl1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgc2NhbGVYID0gZDMuc2NhbGVMaW5lYXIoKSxcbiAgLyoqXG4gICogVGhlIHBhZGRpbmcgZm9yIHRoZSBkb21haW4gb2YgdGhlIHNjYWxlWCAoc2VlIHtAbGluayBzY2F0dGVyI3NjYWxlWH0pXG4gICogQHBhcmFtIHtudW1iZXJ9IFtkb21haW5QYWRkaW5nWD0wLjVdXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGRvbWFpblBhZGRpbmdYID0gMC41LFxuICAvKipcbiAgKiBUaGUgZnVuY3Rpb24gZm9yIGdldHRpbmcgdGhlIHggdmFsdWUgb2YgdGhlIGN1cnJlbnQgcG9pbnRcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbdmFsdWVFeHRyYWN0b3JYPWZ1bmN0aW9uKGQsIGkpe3JldHVybiBkYXRhW2RdWyd4J119XVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB2YWx1ZUV4dHJhY3RvclggPSBmdW5jdGlvbihkLCBpKSB7cmV0dXJuIGRhdGFbZF1bJ3gnXX0sXG5cbiAgLyoqXG4gICogVGhlIHNjYWxlIGZvciB3aGljaCBzY2F0dGVyIHkgdmFsdWVzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBieVxuICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtzY2FsZVk9ZDMuc2NhbGVMaW5lYXJdXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNjYWxlWSA9IGQzLnNjYWxlTGluZWFyKCksXG4gIC8qKlxuICAqIFRoZSBwYWRkaW5nIGZvciB0aGUgZG9tYWluIG9mIHRoZSBzY2FsZVkgKHNlZSB7QGxpbmsgc2NhdHRlciNzY2FsZVl9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbZG9tYWluUGFkZGluZ1k9MC41XVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBkb21haW5QYWRkaW5nWSA9IDAuNSxcbiAgLyoqXG4gICogVGhlIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHRoZSB5IHZhbHVlIG9mIHRoZSBjdXJyZW50IHBvaW50XG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW3ZhbHVlRXh0cmFjdG9yWT1mdW5jdGlvbihkLCBpKXtyZXR1cm4gZGF0YVtkXVsneSddfV1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdmFsdWVFeHRyYWN0b3JZID0gZnVuY3Rpb24oZCwgaSkge3JldHVybiBkYXRhW2RdWyd5J119LFxuXG5cbiAgLyoqXG4gICogVGhlIHNjYWxlIGZvciB3aGljaCBzY2F0dGVyIHIgdmFsdWVzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBieVxuICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtzY2FsZVI9ZDMuc2NhbGVMaW5lYXJdXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHNjYWxlUiA9IGQzLnNjYWxlTGluZWFyKCksXG4gIC8qKlxuICAqIFRoZSBwYWRkaW5nIGZvciB0aGUgZG9tYWluIG9mIHRoZSBzY2FsZVIgKHNlZSB7QGxpbmsgc2NhdHRlciNzY2FsZVJ9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbZG9tYWluUGFkZGluZ1I9MC41XVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBkb21haW5QYWRkaW5nUiA9IDAuNSxcbiAgLyoqXG4gICogVGhlIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHRoZSByIHZhbHVlIG9mIHRoZSBjdXJyZW50IHBvaW50XG4gICogQHBhcmFtIHtmdW5jdGlvbn0gW3ZhbHVlRXh0cmFjdG9yUj1mdW5jdGlvbihkLCBpKXtyZXR1cm4gMn1dXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHZhbHVlRXh0cmFjdG9yUiA9IGZ1bmN0aW9uKGQsIGkpIHtyZXR1cm4gMn0sXG4gIC8qKlxuICAqIFRoZSBtaW4gcmFkaXVzIGEgcG9pbnQgY2FuIGhhdmVcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbbWluUmFkaXVzPTJdXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIG1pblJhZGl1cyA9IDIsXG4gIC8qKlxuICAqIFRoZSBtaW4gcmFkaXVzIGEgcG9pbnQgY2FuIGhhdmVcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbbWF4UmFkaXVzPTEwXVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBtYXhSYWRpdXMgPSAxMCxcblxuICAvKipcbiAgKiBUaGUgc3Ryb2tlIHdpZHRoIG9mIHRoZSBwb2ludHNcbiAgKiBAcGFyYW0ge251bWJlcn0gW3BvaW50U3Ryb2tlV2lkdGg9Ml1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgcG9pbnRTdHJva2VXaWR0aCA9IDIsXG4gIC8qKlxuICAqIEluc3RhbmNlIG9mIENvbG9yRnVuY3Rpb25cbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbY29sb3JGdW5jdGlvbiA9IGNvbG9yRnVuY3Rpb24oKV1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgY29sb3JGdW5jdGlvbiA9IENGKCksXG4gIC8qKlxuICAqIENvbG9yIG9mIHRoZSBiYWNrZ3JvdW5kXG4gICogQHBhcmFtIHtzdHJpbmd9IFtiYWNrZ3JvdW5kRmlsbD1cInRyYW5zcGFyZW50XCJdXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIGJhY2tncm91bmRGaWxsID0gJ3RyYW5zcGFyZW50JyxcbiAgLyoqXG4gICogTmFtZXNwYWNlIGZvciBhbGwgaXRlbXMgbWFkZSBieSB0aGlzIGluc3RhbmNlIG9mIHNjYXR0ZXJcbiAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVzcGFjZT1cImQzc20tc2NhdHRlclwiXVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICBuYW1lc3BhY2UgPSAnZDNzbS1zY2F0dGVyJyxcbiAgLyoqXG4gICogQ2xhc3MgbmFtZSBmb3Igc2NhdHRlciBjb250YWluZXIgKDxjaXJjbGU+IGVsZW1lbnQpXG4gICogQHBhcmFtIHtzdHJpbmd9IFtvYmplY3RDbGFzcz1cInNjYXR0ZXItcG9pbnRcIl1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb2JqZWN0Q2xhc3MgPSAnc2NhdHRlci1wb2ludCcsXG4gIC8qKlxuICAqIER1cmF0aW9uIG9mIGFsbCB0cmFuc2l0aW9ucyBvZiB0aGlzIGVsZW1lbnRcbiAgKiBAcGFyYW0ge251bWJlcn0gW3RyYW5zaXRpb25EdXJhdGlvbj0xMDAwXVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB0cmFuc2l0aW9uRHVyYXRpb24gPSAxMDAwLFxuICAvKipcbiAgKiBFYXNpbmcgZnVuY3Rpb24gZm9yIHRyYW5zaXRpb25zXG4gICogQHBhcmFtIHtkMy5lYXNlfSBbZWFzZUZ1bmM9ZDMuZWFzZUV4cF1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgZWFzZUZ1bmMgPSBkMy5lYXNlRXhwLFxuXG4gIC8vIHVzZWZ1bCB2YWx1ZXMgdG8gZXh0cmFjdCB0byBwcmV2ZW50IHJlLWNhbGN1bGF0aW9uXG4gIC8qKlxuICAqIFRoZSBrZXlzIG9mIHRoZSBwb2ludHNcbiAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbcG9pbnRLZXlzPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgcG9pbnRLZXlzLFxuICAvKipcbiAgKiBUaGUgeCB2YWx1ZXMgb2YgdGhlIHBvaW50c1xuICAqIEBwYXJhbSB7bnVtYmVyW119IFt2YWx1ZXNYPXVuZGVmaW5lZF1cbiAgKiBAbWVtYmVyb2Ygc2NhdHRlciNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgdmFsdWVzWCxcbiAgLyoqXG4gICogVGhlIHkgdmFsdWVzIG9mIHRoZSBwb2ludHNcbiAgKiBAcGFyYW0ge251bWJlcltdfSBbdmFsdWVzWT11bmRlZmluZWRdXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHZhbHVlc1ksXG4gIC8qKlxuICAqIFRoZSByIHZhbHVlcyBvZiB0aGUgcG9pbnRzXG4gICogQHBhcmFtIHtudW1iZXJbXX0gW3ZhbHVlc1I9dW5kZWZpbmVkXVxuICAqIEBtZW1iZXJvZiBzY2F0dGVyI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB2YWx1ZXNSLFxuXG4gIC8qKlxuICAqIEluc3RhbmNlIG9mIFRvb2x0aXBcbiAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbdG9vbHRpcD10b29sdGlwKCldXG4gICogQG1lbWJlcm9mIHNjYXR0ZXIjXG4gICogQHByb3BlcnR5XG4gICovXG4gIHRvb2x0aXAgPSBUVGlwKClcblxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBzZWxlY3Rpb24gaW4gd2hpY2ggaXRlbXMgYXJlIG1hbmlwdWxhdGVkXG4gICAqIEBwYXJhbSB7ZDMuc2VsZWN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IGQzLnNlbGVjdGlvbn1cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc2VsZWN0aW9uID0gc2VsZWN0aW9uXG4gICAqL1xuICBzY2F0dGVyLnNlbGVjdGlvbiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2VsZWN0aW9uID1fLCBzY2F0dGVyKSA6IHNlbGVjdGlvbn1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgZGF0YVxuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI2RhdGF9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBvYmplY3R9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKi9cbiAgc2NhdHRlci5kYXRhID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkYXRhID1fLCBzY2F0dGVyKSA6IGRhdGF9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGFtb3VudCBvZiBob3Jpem9udGFsIHNwYWNlIGluIHdoaWNoIGl0ZW1zIGFyZSBtYW5pcHVsYXRlZFxuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI3NwYWNlWH0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXSBzaG91bGQgYmUgYSBudW1iZXIgPiAwXG4gICAqIEByZXR1cm5zIHtzY2F0dGVyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzcGFjZVggPSB1bmRlZmluZWRcbiAgICovXG4gIHNjYXR0ZXIuc3BhY2VYID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzcGFjZVggPV8sIHNjYXR0ZXIpIDogc3BhY2VYfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBhbW91bnQgb2YgdmVydGljYWwgc3BhY2UgaW4gd2hpY2ggaXRlbXMgYXJlIG1hbmlwdWxhdGVkXG4gICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjc3BhY2VZfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdIHNob3VsZCBiZSBhIG51bWJlciA+IDBcbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNwYWNlWSA9IHVuZGVmaW5lZFxuICAgKi9cbiAgc2NhdHRlci5zcGFjZVkgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNwYWNlWSA9Xywgc2NhdHRlcikgOiBzcGFjZVl9XG5cblxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgeCBzY2FsZSBmb3Igd2hpY2ggdGhlIHNjYXR0ZXIgeCB2YWx1ZXMgc2hvdWxkIGJlIHRyYW5zZm9ybWVkIGJ5XG4gICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjc2NhbGVYfSlcbiAgICogQHBhcmFtIHtkMy5zY2FsZX0gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBkMy5zY2FsZX1cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgc2NhbGVYID0gZDMuc2NhbGVMaW5lYXIoKVxuICAgKi9cbiAgc2NhdHRlci5zY2FsZVggPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNjYWxlWCA9Xywgc2NhdHRlcikgOiBzY2FsZVh9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgcGFkZGluZyBmb3IgdGhlIGRvbWFpbiBvZiB0aGUgeCBzY2FsZVxuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI2RvbWFpblBhZGRpbmdYfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtzY2F0dGVyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBkb21haW5QYWRkaW5nWCA9IDAuNVxuICAgKi9cbiAgc2NhdHRlci5kb21haW5QYWRkaW5nWCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluUGFkZGluZ1ggPV8sIHNjYXR0ZXIpIDogZG9tYWluUGFkZGluZ1h9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdmFsdWVFeHRyYWN0b3JYXG4gICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjdmFsdWVFeHRyYWN0b3JYfSlcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBmdW5jdGlvbn1cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdmFsdWVFeHRyYWN0b3JYID0gZnVuY3Rpb24oa2V5LCBpbmRleCkgeyByZXR1cm4gZGF0YVtrZXldWyd4J10gfVxuICAgKi9cbiAgc2NhdHRlci52YWx1ZUV4dHJhY3RvclggPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZhbHVlRXh0cmFjdG9yWCA9Xywgc2NhdHRlcikgOiB2YWx1ZUV4dHJhY3Rvclh9XG5cblxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHkgc2NhbGUgZm9yIHdoaWNoIHRoZSBzY2F0dGVyIHkgdmFsdWVzIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBieVxuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI3NjYWxlWX0pXG4gICAqIEBwYXJhbSB7ZDMuc2NhbGV9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtzY2F0dGVyIHwgZDMuc2NhbGV9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHNjYWxlWSA9IGQzLnNjYWxlTGluZWFyKClcbiAgICovXG4gIHNjYXR0ZXIuc2NhbGVZID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzY2FsZVkgPV8sIHNjYXR0ZXIpIDogc2NhbGVZfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHBhZGRpbmcgZm9yIHRoZSBkb21haW4gb2YgdGhlIHkgc2NhbGVcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciNkb21haW5QYWRkaW5nWX0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgZG9tYWluUGFkZGluZ1kgPSAwLjVcbiAgICovXG4gIHNjYXR0ZXIuZG9tYWluUGFkZGluZ1kgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpblBhZGRpbmdZID1fLCBzY2F0dGVyKSA6IGRvbWFpblBhZGRpbmdZfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHZhbHVlRXh0cmFjdG9yWVxuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI3ZhbHVlRXh0cmFjdG9yWX0pXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtzY2F0dGVyIHwgZnVuY3Rpb259XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHZhbHVlRXh0cmFjdG9yWSA9IGZ1bmN0aW9uKGtleSwgaW5kZXgpIHsgcmV0dXJuIGRhdGFba2V5XVsneSddIH1cbiAgICovXG4gIHNjYXR0ZXIudmFsdWVFeHRyYWN0b3JZID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2YWx1ZUV4dHJhY3RvclkgPV8sIHNjYXR0ZXIpIDogdmFsdWVFeHRyYWN0b3JZfVxuXG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSByIHNjYWxlIGZvciB3aGljaCB0aGUgc2NhdHRlciByIHZhbHVlcyBzaG91bGQgYmUgdHJhbnNmb3JtZWQgYnlcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciNzY2FsZVJ9KVxuICAgKiBAcGFyYW0ge2QzLnNjYWxlfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IGQzLnNjYWxlfVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBzY2FsZVIgPSBkMy5zY2FsZUxpbmVhcigpXG4gICAqL1xuICBzY2F0dGVyLnNjYWxlUiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2NhbGVSID1fLCBzY2F0dGVyKSA6IHNjYWxlUn1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBwYWRkaW5nIGZvciB0aGUgZG9tYWluIG9mIHRoZSByIHNjYWxlXG4gICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjZG9tYWluUGFkZGluZ1J9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGRvbWFpblBhZGRpbmdSID0gMC41XG4gICAqL1xuICBzY2F0dGVyLmRvbWFpblBhZGRpbmdSID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkb21haW5QYWRkaW5nUiA9Xywgc2NhdHRlcikgOiBkb21haW5QYWRkaW5nUn1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB2YWx1ZUV4dHJhY3RvclJcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciN2YWx1ZUV4dHJhY3RvclJ9KVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IGZ1bmN0aW9ufVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB2YWx1ZUV4dHJhY3RvclIgPSBmdW5jdGlvbihrZXksIGluZGV4KSB7IHJldHVybiBkYXRhW2tleV1bJ3InXSB9XG4gICAqL1xuICBzY2F0dGVyLnZhbHVlRXh0cmFjdG9yUiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmFsdWVFeHRyYWN0b3JSID1fLCBzY2F0dGVyKSA6IHZhbHVlRXh0cmFjdG9yUn1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBtaW5SYWRpdXNcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciNtaW5SYWRpdXN9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG1pblJhZGl1cyA9IDJcbiAgICovXG4gIHNjYXR0ZXIubWluUmFkaXVzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChtaW5SYWRpdXMgPV8sIHNjYXR0ZXIpIDogbWluUmFkaXVzfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIG1heFJhZGl1c1xuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI21heFJhZGl1c30pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgbWF4UmFkaXVzID0gMTBcbiAgICovXG4gIHNjYXR0ZXIubWF4UmFkaXVzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChtYXhSYWRpdXMgPV8sIHNjYXR0ZXIpIDogbWF4UmFkaXVzfVxuXG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgcG9pbnRTdHJva2VXaWR0aFxuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI3BvaW50U3Ryb2tlV2lkdGh9KVxuICAgKiBAcGFyYW0ge251bWJlcn0gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBudW1iZXJ9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHBvaW50U3Ryb2tlV2lkdGggPSAyXG4gICAqL1xuICBzY2F0dGVyLnBvaW50U3Ryb2tlV2lkdGggPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBvaW50U3Ryb2tlV2lkdGggPV8sIHNjYXR0ZXIpIDogcG9pbnRTdHJva2VXaWR0aH1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBjb2xvckZ1bmN0aW9uXG4gICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjY29sb3JGdW5jdGlvbn0pXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgY29sb3JGdW5jdGlvbiA9IGNvbG9yRnVuY3Rpb24oKVxuICAgKi9cbiAgc2NhdHRlci5jb2xvckZ1bmN0aW9uID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjb2xvckZ1bmN0aW9uID1fLCBzY2F0dGVyKSA6IGNvbG9yRnVuY3Rpb259XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgYmFja2dyb3VuZEZpbGxcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciNiYWNrZ3JvdW5kRmlsbH0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgYmFja2dyb3VuZEZpbGwgPSAndHJhbnNwYXJlbnQnXG4gICAqL1xuICBzY2F0dGVyLmJhY2tncm91bmRGaWxsID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChiYWNrZ3JvdW5kRmlsbCA9Xywgc2NhdHRlcikgOiBiYWNrZ3JvdW5kRmlsbH1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBuYW1lc3BhY2VcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciNuYW1lc3BhY2V9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IG5hbWVzcGFjZSA9ICdkM3NtLXNjYXR0ZXInXG4gICAqL1xuICBzY2F0dGVyLm5hbWVzcGFjZSA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobmFtZXNwYWNlID1fLCBzY2F0dGVyKSA6IG5hbWVzcGFjZX1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBvYmplY3RDbGFzc1xuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI29iamVjdENsYXNzfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtzY2F0dGVyIHwgc3RyaW5nfVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvYmplY3RDbGFzcyA9ICd0aWNrLWdyb3VwJ1xuICAgKi9cbiAgc2NhdHRlci5vYmplY3RDbGFzcyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob2JqZWN0Q2xhc3MgPV8sIHNjYXR0ZXIpIDogb2JqZWN0Q2xhc3N9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdHJhbnNpdGlvbkR1cmF0aW9uXG4gICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjdHJhbnNpdGlvbkR1cmF0aW9ufSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtzY2F0dGVyIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB0cmFuc2l0aW9uRHVyYXRpb24gPSAxMDAwXG4gICAqL1xuICBzY2F0dGVyLnRyYW5zaXRpb25EdXJhdGlvbiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodHJhbnNpdGlvbkR1cmF0aW9uID1fLCBzY2F0dGVyKSA6IHRyYW5zaXRpb25EdXJhdGlvbn1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBlYXNlRnVuY1xuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI2Vhc2VGdW5jfSlcbiAgICogQHBhcmFtIHtkMy5lYXNlfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IGQzLmVhc2V9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IGVhc2VGdW5jID0gZDMuZWFzZUV4cFxuICAgKi9cbiAgc2NhdHRlci5lYXNlRnVuYyA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZWFzZUZ1bmMgPV8sIHNjYXR0ZXIpIDogZWFzZUZ1bmN9XG5cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSBwb2ludEtleXNcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciNwb2ludEtleXN9KVxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IHN0cmluZ1tdfVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBwb2ludEtleXMgPSB1bmRlZmluZWRcbiAgICovXG4gIHNjYXR0ZXIucG9pbnRLZXlzID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwb2ludEtleXMgPV8sIHNjYXR0ZXIpIDogcG9pbnRLZXlzfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHZhbHVlc1hcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciN2YWx1ZXNYfSlcbiAgICogQHBhcmFtIHtudW1iZXJbXX0gW189bm9uZV1cbiAgICogQHJldHVybnMge3NjYXR0ZXIgfCBudW1iZXJbXX1cbiAgICogQG1lbWJlcm9mIHNjYXR0ZXJcbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgdmFsdWVzWCA9IHVuZGVmaW5lZFxuICAgKi9cbiAgc2NhdHRlci52YWx1ZXNYID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2YWx1ZXNYID1fLCBzY2F0dGVyKSA6IHZhbHVlc1h9XG4gIC8qKlxuICAgKiBHZXRzIC8gc2V0cyB0aGUgdmFsdWVzWVxuICAgKiAoc2VlIHtAbGluayBzY2F0dGVyI3ZhbHVlc1l9KVxuICAgKiBAcGFyYW0ge251bWJlcltdfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IG51bWJlcltdfVxuICAgKiBAbWVtYmVyb2Ygc2NhdHRlclxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCB2YWx1ZXNZID0gdW5kZWZpbmVkXG4gICAqL1xuICBzY2F0dGVyLnZhbHVlc1kgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZhbHVlc1kgPV8sIHNjYXR0ZXIpIDogdmFsdWVzWX1cbiAgLyoqXG4gICAqIEdldHMgLyBzZXRzIHRoZSB2YWx1ZXNSXG4gICAqIChzZWUge0BsaW5rIHNjYXR0ZXIjdmFsdWVzUn0pXG4gICAqIEBwYXJhbSB7bnVtYmVyW119IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHtzY2F0dGVyIHwgbnVtYmVyW119XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHZhbHVlc1IgPSB1bmRlZmluZWRcbiAgICovXG4gIHNjYXR0ZXIudmFsdWVzUiA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmFsdWVzUiA9Xywgc2NhdHRlcikgOiB2YWx1ZXNSfVxuICAvKipcbiAgICogR2V0cyAvIHNldHMgdGhlIHRvb2x0aXBcbiAgICogKHNlZSB7QGxpbmsgc2NhdHRlciN0b29sdGlwfSlcbiAgICogQHBhcmFtIHt0b29sdGlwfSBbXz1ub25lXVxuICAgKiBAcmV0dXJucyB7c2NhdHRlciB8IHRvb2x0aXB9XG4gICAqIEBtZW1iZXJvZiBzY2F0dGVyXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHRvb2x0aXAgPSB0b29sdGlwKClcbiAgICovXG5cbiAgc2NhdHRlci50b29sdGlwID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0b29sdGlwID1fLCBzY2F0dGVyKSA6IHRvb2x0aXB9XG5cblxuICBmdW5jdGlvbiBzY2F0dGVyKCkge1xuICAgIC8vIGJhY2tncm91bmQgY2xpcGluZyByZWN0YW5nbGVcbiAgICB2YXIgYmdjcFJlY3QgPSB7eDowLCB5OjAsIHdpZHRoOiBzcGFjZVgsIGhlaWdodDpzcGFjZVl9XG4gICAgdmFyIGNvbnRhaW5lciA9IHNldHVwQ29udGFpbmVyKCBzZWxlY3Rpb24sIG5hbWVzcGFjZSwgYmdjcFJlY3QsIGJhY2tncm91bmRGaWxsICk7XG5cblxuICAgIHBvaW50S2V5cyA9IGQzLmtleXMoZGF0YSlcbiAgICB2YWx1ZXNYID0gcG9pbnRLZXlzLm1hcCh2YWx1ZUV4dHJhY3RvclgpXG4gICAgdmFsdWVzWSA9IHBvaW50S2V5cy5tYXAodmFsdWVFeHRyYWN0b3JZKVxuICAgIHZhbHVlc1IgPSBwb2ludEtleXMubWFwKHZhbHVlRXh0cmFjdG9yUilcblxuICAgIHZhciBudW1iZXJPZk9iamVjdHMgPSBwb2ludEtleXMubGVuZ3RoXG4gICAgdmFyIGV4dGVudFggPSBbTWF0aC5taW4oLi4udmFsdWVzWCkgLSBkb21haW5QYWRkaW5nWCwgTWF0aC5tYXgoLi4udmFsdWVzWCkgKyBkb21haW5QYWRkaW5nWF1cbiAgICB2YXIgZXh0ZW50WSA9IFtNYXRoLm1pbiguLi52YWx1ZXNZKSAtIGRvbWFpblBhZGRpbmdZLCBNYXRoLm1heCguLi52YWx1ZXNZKSArIGRvbWFpblBhZGRpbmdZXVxuICAgIHZhciBleHRlbnRSID0gW01hdGgubWluKC4uLnZhbHVlc1IpIC0gZG9tYWluUGFkZGluZ1IsIE1hdGgubWF4KC4uLnZhbHVlc1IpICsgZG9tYWluUGFkZGluZ1JdXG5cbiAgICBzY2FsZVguZG9tYWluKGV4dGVudFgpLnJhbmdlKFswLCBzcGFjZVhdKVxuICAgIHNjYWxlWS5kb21haW4oZXh0ZW50WSkucmFuZ2UoW3NwYWNlWSwgMF0pXG4gICAgc2NhbGVSLmRvbWFpbihleHRlbnRSKS5yYW5nZShbbWluUmFkaXVzLCBtYXhSYWRpdXNdKVxuXG4gICAgdmFyIHBvaW50cyA9IGNvbnRhaW5lci5zZWxlY3RBbGwoJy4nK29iamVjdENsYXNzKVxuICAgIHBvaW50cyA9IHBvaW50cy5kYXRhKHBvaW50S2V5cylcbiAgICB2YXIgcEVudGVyID0gcG9pbnRzLmVudGVyKCkuYXBwZW5kKCdjaXJjbGUnKVxuICAgIC5hdHRyKCdjbGFzcycsIG9iamVjdENsYXNzKVxuICAgIC5hdHRyKCdjeCcsIDApLmF0dHIoJ2N5Jywgc3BhY2VZKS5hdHRyKCdyJywgMClcblxuICAgIHZhciBwRXhpdCA9IHBvaW50cy5leGl0KClcblxuICAgIHBvaW50cyA9IHBvaW50cy5tZXJnZShwRW50ZXIpXG5cbiAgICBwb2ludHMuZWFjaChmdW5jdGlvbihrZXksIGkpe1xuICAgICAgdmFyIHQgPSBkMy5zZWxlY3QodGhpcyksXG4gICAgICBjdXJyZW50RGF0YSA9IGRhdGFba2V5XSxcbiAgICAgIHggPSB2YWx1ZXNYW2ldLFxuICAgICAgeSA9IHZhbHVlc1lbaV0sXG4gICAgICByID0gdmFsdWVzUltpXSxcbiAgICAgIGZpbGxDb2xvciA9IGNvbG9yRnVuY3Rpb24oa2V5LCBjdXJyZW50RGF0YSwgaSwgJ2ZpbGwnKSxcbiAgICAgIHN0cm9rZUNvbG9yID0gY29sb3JGdW5jdGlvbihrZXksIGN1cnJlbnREYXRhLCBpLCAnc3Ryb2tlJylcblxuICAgICAgdC50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uKS5lYXNlKGVhc2VGdW5jKVxuICAgICAgLmF0dHIoJ2N4Jywgc2NhbGVYKHgpKVxuICAgICAgLmF0dHIoJ2N5Jywgc2NhbGVZKHkpKVxuICAgICAgLmF0dHIoJ3InLCBzY2FsZVIocikpXG4gICAgICAuYXR0cignZmlsbCcsIGZpbGxDb2xvcilcbiAgICAgIC5hdHRyKCdzdHJva2UnLCBzdHJva2VDb2xvcilcbiAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCBwb2ludFN0cm9rZVdpZHRoKVxuXG5cblxuICAgICAgdC5vbignbW91c2VvdmVyJywgZnVuY3Rpb24oZCwgaSl7XG4gICAgICAgIHBvaW50cy5zdHlsZSgnb3BhY2l0eScsIDAuMilcbiAgICAgICAgdC5zdHlsZSgnb3BhY2l0eScsIDEpXG4gICAgICAgIHQudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbi8yKS5lYXNlKGVhc2VGdW5jKVxuICAgICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgcG9pbnRTdHJva2VXaWR0aCoyKVxuICAgICAgICAuYXR0cigncicsIHNjYWxlUihyKSAqIDEuNSlcblxuICAgICAgfSlcbiAgICAgIHQubm9kZSgpLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgZnVuY3Rpb24oKXtcbiAgICAgICAgY29udGFpbmVyLnNlbGVjdEFsbCgnLicrb2JqZWN0Q2xhc3MpLnN0eWxlKCdvcGFjaXR5JywgMSlcbiAgICAgICAgdC50cmFuc2l0aW9uKCkuZHVyYXRpb24odHJhbnNpdGlvbkR1cmF0aW9uLzIpLmVhc2UoZWFzZUZ1bmMpXG4gICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCBwb2ludFN0cm9rZVdpZHRoKVxuICAgICAgICAuYXR0cigncicsIHNjYWxlUihyKSlcblxuICAgICAgfSlcblxuICAgIH0pXG5cblxuXG4gICAgcEV4aXQudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRyYW5zaXRpb25EdXJhdGlvbikuZWFzZShlYXNlRnVuYylcbiAgICAuYXR0cignY3gnLCAwKS5hdHRyKCdjeScsIHNwYWNlWSkuYXR0cigncicsIDApXG4gICAgLnJlbW92ZSgpXG5cbiAgICB0b29sdGlwLnNlbGVjdGlvbihwb2ludHMpXG4gICAgLmRhdGEoZGF0YSlcblxuICAgIHRvb2x0aXAoKVxuICB9XG5cblxuICByZXR1cm4gc2NhdHRlclxufVxuIiwiaW1wb3J0IHtoeXBlbmF0ZSwgc2FmZVNlbGVjdCwgZ2V0VHJhbnNsYXRpb259IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQge2xvZywgd2FybiwgZXJyb3IsIGluZm99IGZyb20gJy4vdXRpbHMnO1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUExPVFpPT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKlxuKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqXG4gKiBDcmVhdGVzIGFuIHBsb3Rab29tIGluc3RhbmNlLCB3aGljaCBjYW4gaGFuZGxlIGRyYWcgYW5kIHNjcm9sbCBldmVudHNcbiAqIEBjb25zdHJ1Y3RvciBwbG90Wm9vbVxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2hhcnQgYSBmdW5jdGlvbiBpbnN0YW5jZSBvZiBvbmUgb2YgdGhlIGQzc20gcGxvdHMgKGUuZy4gYmFyLCBib3h3aGlza2VyLCBidWJibGVIZWF0bWFwLCB2aW9saW4sIGV0YylcbiAqIEBwYXJhbSB7YXhpc30gIHhBeGlzIHRoZSBheGlzIGluc3RhbmNlIHJlc3BvbnNpYmxlIGZvciB0aGUgeCBheGlzXG4gKiBAcGFyYW0ge2F4aXN9IHlBeGlzIHRoZSBheGlzIGluc3RhbmNlIHJlc3BvbnNpYmxlIGZvciB0aGUgeSBheGlzXG4gKiBAbmFtZXNwYWNlIHBsb3Rab29tXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb259IHpvb21cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBsb3Rab29tKCBjaGFydCwgeEF4aXMsIHlBeGlzICkge1xuICB2YXJcbiAgLyoqXG4gICogVGhlIGV2ZW50IG9uIHdoaWNoIHRvIGZpcmVcbiAgKiAoc2VlIHtAbGluayBwbG90Wm9vbSNldmVudFR5cGV9KVxuICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFR5cGUgd2hpY2ggZXZlbnQgaXQgc2hvdWxkIGhhbmRsZS4gQ3VycmVudGx5IHN1cHBvcnRzIHNjcm9sbCBhbmQgd2hlZWxcbiAgKiBAbWVtYmVyb2YgcGxvdFpvb20jXG4gICogQHByb3BlcnR5XG4gICovXG4gIGV2ZW50VHlwZSxcbiAgLyoqXG4gICogQSBzY2FsaW5nIGZhY3RvciBmb3IgdGhlIHdoZWVsIFwic3BlZWRcIlxuICAqIChzZWUge0BsaW5rIHBsb3Rab29tI3doZWVsU3BlZWR9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbd2hlZWxTcGVlZD0yMF0gc2NhbGVzIHRoZSB3aGVlbCB0cmFuc2xhdGlvbiBieSB3aGVlbFNwZWVkXG4gICogQG1lbWJlcm9mIHBsb3Rab29tI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB3aGVlbFNwZWVkID0gMjAsXG4gIC8qKlxuICAqIFRoZSBvcmllbnRhdGlvbiBpbiB3aGljaCB0byBhbGxvdyBzY3JvbGxpbmc6ICdob3Jpem9udGFsJywgJ3ZlcnRpY2FsJywgb3IgJzJEJ1xuICAqIChzZWUge0BsaW5rIHBsb3Rab29tI29yaWVudH0pXG4gICogQHBhcmFtIHtzdHJpbmd9IFtvcmllbnQ9Y2hhcnQub3JpZW50KCkgfHwgJ2hvcml6b250YWwnXVxuICAqIEBtZW1iZXJvZiBwbG90Wm9vbSNcbiAgKiBAcHJvcGVydHlcbiAgKi9cbiAgb3JpZW50ID0gKGNoYXJ0Lm9yaWVudCA9PSB1bmRlZmluZWQpID8gJ2hvcml6b250YWwnIDogY2hhcnQub3JpZW50KCksXG4gIC8qKlxuICAqIFRoZSBtYXggZGlzdGFuY2UgYWxsb3dlZCB0byBzY3JvbGwgaW4gdGhlIHggZGlyZWN0aW9uXG4gICogKHNlZSB7QGxpbmsgcGxvdFpvb20jeExvY2t9KVxuICAqIEBwYXJhbSB7bnVtYmVyfSBbeExvY2s9Y2hhcnQuc3BhY2VYKCldIGlkZWFsbHkgY2hhcnQub3ZlcmZsb3dRKCkgPT0gdHJ1ZSBhbmQgdGhpcyB2YWx1ZSBpcyB0aGVcbiAgKiBib3VuZGluZyByZWN0IGFjcm9zcyBhbGwgZWxlbWVudHMgaW4gdGhlIGNoYXJ0ICBtaW51cyB0aGUgc3BhY2UgaW4gd2hpY2ggdG8gc2hvdy5cbiAgKiBAbWVtYmVyb2YgcGxvdFpvb20jXG4gICogQHByb3BlcnR5XG4gICovXG4gIHhMb2NrPWNoYXJ0LnNwYWNlWCgpLFxuICAvKipcbiAgKiBUaGUgbWF4IGRpc3RhbmNlIGFsbG93ZWQgdG8gc2Nyb2xsIGluIHRoZSB5IGRpcmVjdGlvblxuICAqIChzZWUge0BsaW5rIHBsb3Rab29tI3lMb2NrfSlcbiAgKiBAcGFyYW0ge251bWJlcn0gW3lMb2NrPWNoYXJ0LnNwYWNlWSgpXSBpZGVhbGx5IGNoYXJ0Lm92ZXJmbG93USgpID09IHRydWUgYW5kIHRoaXMgdmFsdWUgaXMgdGhlXG4gICogYm91bmRpbmcgcmVjdCBhY3Jvc3MgYWxsIGVsZW1lbnRzIGluIHRoZSBjaGFydCAgbWludXMgdGhlIHNwYWNlIGluIHdoaWNoIHRvIHNob3cuXG4gICogQG1lbWJlcm9mIHBsb3Rab29tI1xuICAqIEBwcm9wZXJ0eVxuICAqL1xuICB5TG9jaz1jaGFydC5zcGFjZVkoKSxcblxuICBjaGFydFNlbCA9IGNoYXJ0LnNlbGVjdGlvbigpLFxuICB4QXhpc1NlbCA9IHhBeGlzLnNlbGVjdGlvbigpLFxuICB5QXhpc1NlbCA9IHlBeGlzLnNlbGVjdGlvbigpXG5cblxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBldmVudCB0eXBlIGluIHdoaWNoIHRvIHJlc3BvbmRcbiAgICogKHNlZSB7QGxpbmsgcGxvdFpvb20jZXZlbnRUeXBlfSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdIHNob3VsZCBiZSAnZHJhZycgb3IgJ3doZWVsJ1xuICAgKiBAcmV0dXJucyB7em9vbSB8IHN0cmluZ31cbiAgICogQG1lbWJlcm9mIHBsb3Rab29tXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHBsb3Rab29tPXVuZGVmaW5lZFxuICAgKi9cbiAgem9vbS5ldmVudFR5cGUgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGV2ZW50VHlwZSA9IF8sIHpvb20pIDogZXZlbnRUeXBlOyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSB3aGVlbCBzcGVlZCBpbiB3aGljaCB0byBzY2FsZSB0aGUgd2hlZWwgc2Nyb2xsIHRyYW5zZm9ybVxuICAgKiAoc2VlIHtAbGluayBwbG90Wm9vbSN3aGVlbFNwZWVkfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdXG4gICAqIEByZXR1cm5zIHt6b29tIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgcGxvdFpvb21cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgd2hlZWxTcGVlZD0yMFxuICAgKi9cbiAgem9vbS53aGVlbFNwZWVkID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh3aGVlbFNwZWVkID0gXywgem9vbSkgOiB3aGVlbFNwZWVkOyB9O1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBvcmllbnRhdGlvbiBpbiB3aGljaCBpdGVtcyBhcmUgbWFuaXB1bGF0ZWRcbiAgICogKHNlZSB7QGxpbmsgcGxvdFpvb20jb3JpZW50fSlcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtfPW5vbmVdIHNob3VsZCBiZSBob3Jpem9udGFsLCB2ZXJ0aWNhbCwgb3IgMkRcbiAgICogQHJldHVybnMge3pvb20gfCBzdHJpbmd9XG4gICAqIEBtZW1iZXJvZiBwbG90Wm9vbVxuICAgKiBAcHJvcGVydHlcbiAgICogYnkgZGVmYXVsdCBvcmllbnQ9Y2hhcnQub3JpZW50KCkgfHwgJ2hvcml6b250YWwnXG4gICAqL1xuICB6b29tLm9yaWVudCA9IGZ1bmN0aW9uKF8pIHsgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob3JpZW50ID0gXywgem9vbSkgOiBvcmllbnQ7IH07XG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgbWF4IGRpc3RhbmNlIGluIHdoaWNoIHRvIHNjcm9sbCBYXG4gICAqIChzZWUge0BsaW5rIHBsb3Rab29tI3hMb2NrfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdIHNob3VsZCBiZSBhIHBvc2l0aXZlIHZhbHVlXG4gICAqIEByZXR1cm5zIHt6b29tIHwgbnVtYmVyfVxuICAgKiBAbWVtYmVyb2YgcGxvdFpvb21cbiAgICogQHByb3BlcnR5XG4gICAqIGJ5IGRlZmF1bHQgeExvY2s9Y2hhcnQuc3BhY2VYKClcbiAgICovXG4gIHpvb20ueExvY2sgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHhMb2NrID0gXywgem9vbSkgOiB4TG9jazsgfTtcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgbWF4IGRpc3RhbmNlIGluIHdoaWNoIHRvIHNjcm9sbCBZXG4gICAqIChzZWUge0BsaW5rIHBsb3Rab29tI3lMb2NrfSlcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtfPW5vbmVdICBzaG91bGQgYmUgYSBwb3NpdGl2ZSB2YWx1ZVxuICAgKiBAcmV0dXJucyB7em9vbSB8IG51bWJlcn1cbiAgICogQG1lbWJlcm9mIHBsb3Rab29tXG4gICAqIEBwcm9wZXJ0eVxuICAgKiBieSBkZWZhdWx0IHlMb2NrPWNoYXJ0LnNwYWNlWSgpXG4gICAqL1xuICB6b29tLnlMb2NrID0gZnVuY3Rpb24oXykgeyByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5TG9jayA9IF8sIHpvb20pIDogeUxvY2s7IH07XG5cblxuICBmdW5jdGlvbiBzZXRMb2NrcygpIHtcbiAgICB2YXIgY2hhcnRPYmpTZWwgPSBjaGFydFNlbC5zZWxlY3QoJy4nK2h5cGVuYXRlKGNoYXJ0Lm5hbWVzcGFjZSgpLCdvYmplY3QtY29udGFpbmVyJykpXG4gICAgdmFyIGNoYXJ0T2JqVHJhbnMgPSBnZXRUcmFuc2xhdGlvbihjaGFydE9ialNlbC5hdHRyKCd0cmFuc2Zvcm0nKSlcbiAgICB2YXIgY29zID0gY2hhcnRPYmpTZWwuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgwLDApJylcbiAgICB4TG9jayA9IGNoYXJ0U2VsLm5vZGUoKS5nZXRCQm94KCkud2lkdGggLSBjaGFydC5zcGFjZVgoKSAqIC45XG4gICAgeUxvY2sgPSBjaGFydFNlbC5ub2RlKCkuZ2V0QkJveCgpLmhlaWdodCAtIGNoYXJ0LnNwYWNlWSgpICogLjlcbiAgICBjb3MuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnK2NoYXJ0T2JqVHJhbnNbMF0rJywnK2NoYXJ0T2JqVHJhbnNbMV0rJyknKVxuICAgIGxvZygncGxvdFpvb20nLCAnc2V0TG9ja3MnLCB7eExvY2s6eExvY2ssIHlMb2NrOnlMb2NrfSlcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHggYW5kIHkgbG9ja3MgKGhvdyBmYXIgb25lIGNhbiBzY3JvbGwpXG4gICAqIChzZWUge0BsaW5rIHBsb3Rab29tI3hMb2NrfSBhbmQge0BsaW5rIHBsb3Rab29tI3lMb2NrfSlcbiAgICogQGZ1bmN0aW9uIHBsb3Rab29tLnNldExvY2tzXG4gICAqIEByZXR1cm5zIHt1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJvZiBwbG90Wm9vbVxuICAgKiBAcHJvcGVydHlcbiAgICovXG4gIHpvb20uc2V0TG9ja3MgPSBzZXRMb2Nrc1xuXG4gIGZ1bmN0aW9uIHpvb20oKSB7XG4gICAgc2V0TG9ja3MoKVxuXG4gICAgdmFyIGhvcml6b250YWxRLCB2ZXJ0aWNhbFFcbiAgICBpZiAob3JpZW50ID09ICcyRCcpIHtob3Jpem9udGFsUSA9IHRydWU7IHZlcnRpY2FsUSA9IHRydWU7fVxuICAgIGlmIChvcmllbnQgPT0gJ2hvcml6b250YWwnKSB7aG9yaXpvbnRhbFEgPSB0cnVlOyB2ZXJ0aWNhbFEgPSBmYWxzZTt9XG4gICAgaWYgKG9yaWVudCA9PSAndmVydGljYWwnKSB7dmVydGljYWxRID0gdHJ1ZTsgaG9yaXpvbnRhbFEgPSBmYWxzZTt9XG5cbiAgICAvLyBjYXB0dXJlIHRyYW5zZm9ybSBldmVudFxuICAgIHZhciB0cmFuc2Zvcm0gPSBkMy5ldmVudC50cmFuc2Zvcm1cblxuICAgIHZhciBjaGFydEJveCA9IGNoYXJ0U2VsLm5vZGUoKS5nZXRCQm94KClcbiAgICB2YXIgeEF4aXNCb3ggPSB4QXhpc1NlbC5ub2RlKCkuZ2V0QkJveCgpXG4gICAgdmFyIHlBeGlzQm94ID0geEF4aXNTZWwubm9kZSgpLmdldEJCb3goKVxuXG4gICAgdmFyIGNoYXJ0V2lkdGggPSBjaGFydEJveC53aWR0aCAtIGNoYXJ0Qm94LnhcbiAgICB2YXIgY2hhcnRIZWlnaHQgPSBjaGFydEJveC5oZWlnaHQgLSBjaGFydEJveC55XG4gICAgdmFyIHhBeGlzV2lkdGggPSB4QXhpc0JveC53aWR0aC8vIC0geEF4aXNCb3gueFxuICAgIHZhciB4QXhpc0hlaWdodCA9IHhBeGlzQm94LmhlaWdodC8vIC0geEF4aXNCb3gueVxuICAgIHZhciB5QXhpc1dpZHRoID0geUF4aXNCb3gud2lkdGgvLyAtIHlBeGlzQm94LnhcbiAgICB2YXIgeUF4aXNIZWlnaHQgPSB5QXhpc0JveC5oZWlnaHQvLyAteUF4aXNCb3gueVxuXG4gICAgLy8gZW5hYmxlIHdoZWVsIGV2ZW50XG4gICAgaWYgKGV2ZW50VHlwZSA9PSBcIndoZWVsXCIpIHtcbiAgICAgIHZhciBlID0gZDMuZXZlbnRcbiAgICAgIC8vIHByZXZlbnQgcGFnZSBzY3JvbGxpbmdcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgLy8gZXZlbnQgZGVsdGEgaXMgdmVyeSB2ZXJ5IHNsb3csIHNvIHNwZWVkIGl0IHVwIHdpdGggd2hlZWwgc3BlZWRcbiAgICAgIHZhciB3ID0gZDMuZXZlbnQuZGVsdGFZICogd2hlZWxTcGVlZFxuICAgICAgdmFyIHNoaWZ0USA9IGQzLmV2ZW50LnNoaWZ0S2V5XG5cbiAgICAgIC8vIGQzIGhhcyBubyB3YXkgdG8gbWFrZSBjdXN0b20gdHJhbnNmb3JtLCBzbyBtYWtlIGFuIG9iamVjdCBhbmQgYWRkXG4gICAgICAvLyB0aGUgbmVjZXNzYXJ5IGZ1bmN0aW9ucyB0byBtYWtlIHdoZWVsIGV2ZW50IGNvbXBhdGlibGUgd2l0aCBkcmFnIGV2ZW50c1xuICAgICAgaWYgKG9yaWVudCA9PSAnMkQnKSB7XG4gICAgICAgIHRyYW5zZm9ybSA9IHNoaWZ0USA/IHtrOiAxLCB4OiB3LCB5OiAwfSA6IHtrOiAxLCB4OiAwLCB5OiB3fVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJhbnNmb3JtID0gaG9yaXpvbnRhbFEgPyB7azogMSwgeDogdywgeTogMH0gOiB7azogMSwgeDogMCwgeTogd31cbiAgICAgIH1cbiAgICAgIHRyYW5zZm9ybS5hcHBseVggPSBmdW5jdGlvbih4KSB7IHJldHVybiB4ICogdGhpcy5rICsgdGhpcy54OyB9XG4gICAgICB0cmFuc2Zvcm0uYXBwbHlZID0gIGZ1bmN0aW9uKHkpIHsgcmV0dXJuIHkgKiB0aGlzLmsgKyB0aGlzLnk7IH1cbiAgICB9XG5cblxuXG4gICAgdmFyIGNoYXJ0T2JqU2VsID0gY2hhcnRTZWwuc2VsZWN0KCcuJytoeXBlbmF0ZShjaGFydC5uYW1lc3BhY2UoKSwnb2JqZWN0LWNvbnRhaW5lcicpKVxuICAgIHZhciB4QXhpc09ialNlbCA9IHhBeGlzU2VsLnNlbGVjdCgnLicraHlwZW5hdGUoeEF4aXMubmFtZXNwYWNlKCksJ29iamVjdC1jb250YWluZXInKSlcbiAgICB2YXIgeUF4aXNPYmpTZWwgPSB5QXhpc1NlbC5zZWxlY3QoJy4nK2h5cGVuYXRlKHlBeGlzLm5hbWVzcGFjZSgpLCdvYmplY3QtY29udGFpbmVyJykpXG5cbiAgICAvLyB4TG9jayA9IGNoYXJ0U2VsLm5vZGUoKS5nZXRCQm94KCkud2lkdGggLSBjaGFydC5zcGFjZVgoKSAtIGNoYXJ0U2VsLm5vZGUoKS5nZXRCQm94KCkueFxuICAgIC8vIHlMb2NrID0gY2hhcnRTZWwubm9kZSgpLmdldEJCb3goKS5oZWlnaHQgLSBjaGFydC5zcGFjZVkoKVxuICAgIC8vIGNvbnNvbGUudGFibGUoeyd4TG9jayc6eExvY2ssIFwieUxvY2tcIjp5TG9ja30pXG4gICAgLy8gYmhtLnNlbGVjdGlvbigpLm5vZGUoKS5nZXRCQm94KCkud2lkdGggLSBiaG0uc3BhY2VYKClcblxuXG4gICAgdmFyIGNoYXJ0T2JqVHJhbnMgPSBnZXRUcmFuc2xhdGlvbihjaGFydE9ialNlbC5hdHRyKCd0cmFuc2Zvcm0nKSlcbiAgICB2YXIgeEF4aXNPYmpUcmFucyA9IGdldFRyYW5zbGF0aW9uKHhBeGlzT2JqU2VsLmF0dHIoJ3RyYW5zZm9ybScpKVxuICAgIHZhciB5QXhpc09ialRyYW5zID0gZ2V0VHJhbnNsYXRpb24oeUF4aXNPYmpTZWwuYXR0cigndHJhbnNmb3JtJykpXG5cblxuICAgIHZhciB4ID0gaG9yaXpvbnRhbFEgPyB0cmFuc2Zvcm0uYXBwbHlYKGNoYXJ0T2JqVHJhbnNbMF0pIDogMFxuICAgIGlmIChob3Jpem9udGFsUSkge3ggPSB4IDwgLXhMb2NrID8gKHRyYW5zZm9ybS54ID0gMCwgLXhMb2NrKSA6ICh0cmFuc2Zvcm0ueCA9IDAsIE1hdGgubWluKHgsIDApKSB9XG5cbiAgICB2YXIgeSA9IHZlcnRpY2FsUSA/IHRyYW5zZm9ybS5hcHBseVkoY2hhcnRPYmpUcmFuc1sxXSkgOiAwXG4gICAgaWYgKHZlcnRpY2FsUSkge3kgPSB5IDwgLXlMb2NrID8gKHRyYW5zZm9ybS55ID0gMCwgLXlMb2NrKTogKHRyYW5zZm9ybS55ID0gMCwgTWF0aC5taW4oeSwgMCkpfVxuXG4gICAgY2hhcnRPYmpTZWwuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnK3grJywnK3krJyknKVxuICAgIGlmIChob3Jpem9udGFsUSkgeyB4QXhpc09ialNlbC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcreCsnLCcrMCsnKScpIH1cbiAgICBpZiAodmVydGljYWxRKSB7IHlBeGlzT2JqU2VsLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyswKycsJyt5KycpJykgfVxuXG4gIH1cblxuICB6b29tLnJlc2V0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGhvcml6b250YWxRLCB2ZXJ0aWNhbFFcbiAgICBpZiAob3JpZW50ID09ICcyRCcpIHtob3Jpem9udGFsUSA9IHRydWU7IHZlcnRpY2FsUSA9IHRydWU7fVxuICAgIGlmIChvcmllbnQgPT0gJ2hvcml6b250YWwnKSB7aG9yaXpvbnRhbFEgPSB0cnVlOyB2ZXJ0aWNhbFEgPSBmYWxzZTt9XG4gICAgaWYgKG9yaWVudCA9PSAndmVydGljYWwnKSB7dmVydGljYWxRID0gdHJ1ZTsgaG9yaXpvbnRhbFEgPSBmYWxzZTt9XG5cbiAgICB2YXIgY2hhcnRPYmpTZWwgPSBjaGFydFNlbC5zZWxlY3QoJy4nK2h5cGVuYXRlKGNoYXJ0Lm5hbWVzcGFjZSgpLCdvYmplY3QtY29udGFpbmVyJykpXG4gICAgdmFyIHhBeGlzT2JqU2VsID0geEF4aXNTZWwuc2VsZWN0KCcuJytoeXBlbmF0ZSh4QXhpcy5uYW1lc3BhY2UoKSwnb2JqZWN0LWNvbnRhaW5lcicpKVxuICAgIHZhciB5QXhpc09ialNlbCA9IHlBeGlzU2VsLnNlbGVjdCgnLicraHlwZW5hdGUoeUF4aXMubmFtZXNwYWNlKCksJ29iamVjdC1jb250YWluZXInKSlcbiAgICBjaGFydE9ialNlbC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcrMCsnLCcrMCsnKScpXG4gICAgeEF4aXNPYmpTZWwuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnKzArJywnKzArJyknKVxuICAgIHlBeGlzT2JqU2VsLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyswKycsJyswKycpJylcbiAgfVxuXG4gIHJldHVybiB6b29tXG59XG4iLCJpbXBvcnQge2h5cGVuYXRlLCBzYWZlU2VsZWN0fSBmcm9tICcuL2hlbHBlcnMnO1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBwb2ludHMgKCBzZWxlY3Rpb24gKSB7XG4gIHZhclxuICAvLyAvKipcbiAgLy8gKiBEYXRhIHRvIHBsb3QuIEFzc3VtZWQgdG8gYmUgYSBvYmplY3QsIHdoZXJlIGVhY2gga2V5IGNvcnJlc3BvbmRzIHRvIGEgdmlvbGluXG4gIC8vICogKHNlZSB7QGxpbmsgYmFyI2RhdGF9KVxuICAvLyAqIEBwYXJhbSB7T2JqZWN0fSBbZGF0YT11bmRlZmluZWRdXG4gIC8vICogQG1lbWJlcm9mIGJhciNcbiAgLy8gKiBAcHJvcGVydHlcbiAgLy8gKi9cbiAgLy8gZGF0YSxcbiAgLy8gLyoqXG4gIC8vICogV2hpY2ggZGlyZWN0aW9uIHRvIHJlbmRlciB0aGUgYmFycyBpblxuICAvLyAqIChzZWUge0BsaW5rIGJhciNvcmllbnR9KVxuICAvLyAqIEBwYXJhbSB7bnVtYmVyfSBbb3JpZW50PSdob3Jpem9udGFsJ11cbiAgLy8gKiBAbWVtYmVyb2YgYmFyI1xuICAvLyAqIEBwcm9wZXJ0eVxuICAvLyAqL1xuICAvLyBvcmllbnQ9J2hvcml6b250YWwnLFxuICAvLyAvKipcbiAgLy8gKiBUaGUgcmFkaXVzIG9mIGEgcG9pbnRcbiAgLy8gKiBAcGFyYW0ge251bWJlcn0gW3BvaW50UmFkaXVzPTNdXG4gIC8vICogQG1lbWJlcm9mIGJhciNcbiAgLy8gKiBAcHJvcGVydHlcbiAgLy8gKi9cbiAgLy8gcmFkaXVzID0gMyxcbiAgLy8gLyoqXG4gIC8vICogVGhlIHN0cm9rZSB3aWR0aCBvZiB0aGUgb2ludHNcbiAgLy8gKiBAcGFyYW0ge251bWJlcn0gW3BvaW50U3Ryb2tlV2lkdGg9Ml1cbiAgLy8gKiBAbWVtYmVyb2YgYmFyI1xuICAvLyAqIEBwcm9wZXJ0eVxuICAvLyAqL1xuICAvLyBzdHJva2VXaWR0aCA9IDIsXG4gIC8vIC8qKlxuICAvLyAqIE5hbWVzcGFjZSBmb3IgYWxsIGl0ZW1zIG1hZGUgYnkgdGhpcyBpbnN0YW5jZSBvZiBiYXJcbiAgLy8gKiBAcGFyYW0ge3N0cmluZ30gW25hbWVzcGFjZT1cImQzc20tdmlvbGluXCJdXG4gIC8vICogQG1lbWJlcm9mIGJhciNcbiAgLy8gKiBAcHJvcGVydHlcbiAgLy8gKi9cbiAgLy8gbmFtZXNwYWNlID0gJ2Qzc20tcG9pbnRzJyxcbiAgLy8gLyoqXG4gIC8vICogQ2xhc3MgbmFtZSBmb3IgYmFyIGNvbnRhaW5lciAoPGc+IGVsZW1lbnQpXG4gIC8vICogQHBhcmFtIHtzdHJpbmd9IFtvYmplY3RDbGFzcz1cInZpb2xpblwiXVxuICAvLyAqIEBtZW1iZXJvZiBiYXIjXG4gIC8vICogQHByb3BlcnR5XG4gIC8vICovXG4gIC8vIG9iamVjdENsYXNzID0gJ3BvaW50JyxcbiAgLy8gLyoqXG4gIC8vICogRHVyYXRpb24gb2YgYWxsIHRyYW5zaXRpb25zIG9mIHRoaXMgZWxlbWVudFxuICAvLyAqIEBwYXJhbSB7bnVtYmVyfSBbdHJhbnNpdGlvbkR1cmF0aW9uPTEwMDBdXG4gIC8vICogQG1lbWJlcm9mIGJhciNcbiAgLy8gKiBAcHJvcGVydHlcbiAgLy8gKi9cbiAgLy8gdHJhbnNpdGlvbkR1cmF0aW9uID0gMTAwMCxcbiAgLy8gLyoqXG4gIC8vICogRWFzaW5nIGZ1bmN0aW9uIGZvciB0cmFuc2l0aW9uc1xuICAvLyAqIEBwYXJhbSB7ZDMuZWFzZX0gW2Vhc2VGdW5jPWQzLmVhc2VFeHBdXG4gIC8vICogQG1lbWJlcm9mIGJhciNcbiAgLy8gKiBAcHJvcGVydHlcbiAgLy8gKi9cbiAgLy8gZWFzZUZ1bmMgPSBkMy5lYXNlRXhwLFxuICAvLyAvKipcbiAgLy8gKiBUaGUgb2JqZWN0U2l6ZSAoYWN0dWFsIHdpZHRoKSB1c2VkIGJ5IHRoZSBiYXJzXG4gIC8vICogQHBhcmFtIHtudW1iZXJ9IFtvYmplY3RTaXplPXVuZGVmaW5lZF1cbiAgLy8gKiBAbWVtYmVyb2YgYmFyI1xuICAvLyAqIEBwcm9wZXJ0eVxuICAvLyAqL1xuICAvLyBvYmplY3RTaXplLFxuXG4gIGtleUV4dHJhY3RvciA9IGZ1bmN0aW9uKGQsIGkpIHsgY29uc29sZS5sb2coZCkgfSxcbiAgdmFsdWVFeHRyYWN0b3IgPSBmdW5jdGlvbihkLCBpKSB7IH1cblxuXG4gIGZ1bmN0aW9uIHBvaW50cygpIHtcbiAgICAvLyB2YXIgcHRzQ29udGFpbmVycyA9IHNlbGVjdGlvbi5zZWxlY3RBbGwoJy4nK29iamVjdENsYXNzKVxuICAgIHZhciBwdHNDb250YWluZXJzID0gc2VsZWN0aW9uLnNlbGVjdEFsbCgnLmJvdy13aGlzaycpXG4gICAgY29uc29sZS5sb2cocHRzQ29udGFpbmVycy5ub2RlcygpKVxuXG4gICAgcHRzQ29udGFpbmVycy5lYWNoKGZ1bmN0aW9uKGQsIGkpe1xuICAgICAgdmFyIHQgPSBkMy5zZWxlY3QodGhpcyksXG4gICAgICBwdHNDb250YWluZXIgPSBzYWZlU2VsZWN0KHQsICdnJywgJ3BvaW50cycpLFxuICAgICAgcHRzID0gcHRzQ29udGFpbmVyLnNlbGVjdEFsbCgnLnBvaW50JykuZGF0YSgga2V5RXh0cmFjdG9yKGQpIClcblxuXG4gICAgICB2YXIgcHRzRXhpdCA9IHB0cy5leGl0KClcbiAgICAgIHZhciBwdHNFbnRlciA9IHB0cy5lbnRlcigpLmFwcGVuZCgnY2lyY2xlJykuYXR0cignY2xhc3MnLCAncG9pbnQnKVxuXG4gICAgICBwdHMgPSBwdHMubWVyZ2UocHRzRW50ZXIpXG5cbiAgICB9KVxuICB9XG4gIHJldHVybiBwb2ludHNcbn1cbiJdLCJuYW1lcyI6WyJ1bmlxdWVFbGVtZW50cyIsInZhbHVlIiwiaW5kZXgiLCJzZWxmIiwiaW5kZXhPZiIsImdldFRyYW5zbGF0aW9uIiwidHJhbnNmb3JtIiwiZyIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudE5TIiwidW5kZWZpbmVkIiwic2V0QXR0cmlidXRlTlMiLCJtYXRyaXgiLCJiYXNlVmFsIiwiY29uc29saWRhdGUiLCJlIiwiZiIsIm1vZGlmeUhleGlkZWNpbWFsQ29sb3JMdW1pbmFuY2UiLCJoZXgiLCJsdW0iLCJTdHJpbmciLCJyZXBsYWNlIiwibGVuZ3RoIiwiYyIsImkiLCJyZ2IiLCJwYXJzZUludCIsInN1YnN0ciIsIk1hdGgiLCJyb3VuZCIsIm1pbiIsIm1heCIsInRvU3RyaW5nIiwicXVhcnRpbGVzIiwiZGF0YSIsInFLZXlzIiwicTIiLCJkMyIsIm1lZGlhbiIsImxvd2VyIiwiZmlsdGVyIiwieCIsInVwcGVyIiwicTEiLCJxMCIsInEzIiwicTQiLCJrMCIsImsxIiwiazIiLCJrMyIsIms0Iiwib2JqIiwiaHlwZW5hdGUiLCJBcnJheSIsInByb3RvdHlwZSIsInNsaWNlIiwiY2FsbCIsImFyZ3VtZW50cyIsImpvaW4iLCJudW1iZXIiLCJwcmVjaXNpb24iLCJzaGlmdCIsInJldmVyc2VTaGlmdCIsIm51bUFycmF5Iiwic3BsaXQiLCJ0cnVuY2F0ZVRleHQiLCJ0IiwidGV4dCIsIm9yaWVudCIsInRpY2tMZW5ndGgiLCJzcGFjZSIsIm92ZXJmbG93USIsInJlY3QiLCJub2RlIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0Iiwid2lkdGgiLCJoZWlnaHQiLCJzYWZlU2VsZWN0Iiwic2VsIiwidGFnIiwiY2xzIiwiY2xzU3RyIiwic1NlbCIsInNlbGVjdCIsImVtcHR5IiwiYXBwZW5kIiwiY2xhc3NlZCIsImF0dHIiLCJ0aWNrUmFuZ2UiLCJuIiwiYSIsInMiLCJwdXNoIiwiaGFzUSIsImFycmF5IiwiaXRlbSIsImluY2x1ZGVzIiwidW5pcXVlIiwiZmxhdHRlbiIsImZsYXQiLCJtYXAiLCJpc0FycmF5IiwiY29uY2F0Iiwid2hpY2hCaW4iLCJiaW5zIiwiaiIsImNvbnNvbGVHcm91cCIsIm5hbWUiLCJ3aW5kb3ciLCJkM3NtIiwiZGVidWdRIiwiZ3JvdXAiLCJjb25zb2xlR3JvdXBFbmQiLCJncm91cEVuZCIsImxvZyIsImZ1bmMiLCJtc2ciLCJ0YWJsZSIsInNldHVwQ29udGFpbmVyIiwic2VsZWN0aW9uIiwibmFtZXNwYWNlIiwiZmlsbCIsImNvbnRhaW5lciIsInkiLCJiZ1JlY3QiLCJkZWZzIiwiY3BSZWN0IiwicmFpc2UiLCJjYWxjdWxhdGVXaWR0aE9mT2JqZWN0IiwiZnJlZVNwYWNlIiwibnVtYmVyT2ZPYmplY3RzIiwibWluT2JqZWN0V2lkdGgiLCJtYXhPYmplY3RXaWR0aCIsInNpemVPZlNwYWNlciIsInJlbWFpbmluZ1NwYWNlIiwib2JqZWN0V2lkdGgiLCJjYWxjdWxhdGVXaWR0aE9mU3BhY2VyIiwiYmFzZVNwYWNlclNpemUiLCJsaW1pdGVkTnVtYmVyT2ZPYmplY3RzIiwic3BhY2Vyc0F0RWFjaExldmVsIiwic3BhY2Vyc05lZWRlZEF0RWFjaExldmVsIiwibGV2ZWwiLCJsZXZlbERhdGEiLCJyZWR1Y2UiLCJiIiwid2hpc2tlclBhdGgiLCJkaXIiLCJ3IiwiaCIsInBlciIsIm8iLCJoaCIsInd3IiwicCIsImdyb3VwaW5nU3BhY2VyIiwic2NhbGVMaW5lYXIiLCJlYXNlU2luIiwiY3VyIiwiZCIsImhvcml6b250YWxRIiwib2JqZWN0U2l6ZSIsInNwYWNlclNpemUiLCJjdXJyZW50IiwiY3VycmVudE5vZGUiLCJ0cmFuc2l0aW9uIiwiZHVyYXRpb24iLCJ0cmFuc2l0aW9uRHVyYXRpb24iLCJlYXNlIiwiZWFzZUZ1bmMiLCJyZW1vdmUiLCJyZWN1cnNpdmVseVBvc2l0aW9uIiwiY3VycmVudFNlbGVjdGlvbiIsInNlbGVjdEFsbCIsImVudGVyIiwiZXhpdCIsIm1lcmdlIiwiZXhpdEZ1bmN0aW9uIiwiZWFjaCIsInRoaXMiLCJsZXZlbFNwYWNlciIsIm1vdmUiLCJjdXJyZW50RWxlbWVudCIsImVudGVyRnVuY3Rpb24iLCJtb3ZlYnkiLCJzY2FsZSIsInRvUmVtb3ZlIiwib2JqZWN0Q2xhc3MiLCJzaXplIiwiXyIsImNvbG9yRnVuY3Rpb24iLCJpbnRlcnBvbGF0ZVJnYiIsImNvbG9ycyIsImsiLCJ2IiwiaW50ZXJwb2xhdGUiLCJpbnRlcnBvbGF0aW9uIiwiZG9tYWluIiwiZGF0YUV4dGVudCIsInJhbmdlIiwiaGVscGVyU2NhbGUiLCJtYXRjaCIsImtleSIsInR5cGUiLCJob3ZlclEiLCJvcGFjIiwiZmlsbE9wYWNpdHkiLCJzdHJva2VPcGFjaXR5IiwiY29sb3JCeSIsIm1vZGlmeU9wYWNpdHkiLCJ2YWx1ZUV4dHJhY3RvciIsInRvb2x0aXAiLCJrZXlzIiwidmFsdWVzIiwiaGVhZGVyIiwidGFyZ2V0Q2xhc3MiLCJvbiIsIm1vdXNlbW92ZSIsImN1cnJlbnREYXRhIiwibW91c2UiLCJkaXYiLCJzdHlsZSIsImNhcmRCb2R5IiwidEJvZHkiLCJ0ciIsInJvd0tleSIsInJvd0luZGV4IiwidmlvbGluUG9pbnRzRXh0cmFjdG9yIiwidmlvbGluS2V5IiwidmlvbGluRGF0YSIsInBvaW50cyIsInZpb2xpblBvaW50VmFsdWVFeHRyYWN0b3IiLCJ2aW9saW5Qb2ludEtleSIsInZpb2xpblBvaW50RGF0YSIsIm0iLCJ2YWwiLCJvcHRpb25zIiwibXMiLCJzdHIiLCJleGVjIiwicGFyc2VGbG9hdCIsInRvTG93ZXJDYXNlIiwicGFyc2UiLCJpc05hTiIsImxvbmciLCJwbHVyYWwiLCJmbXRTaG9ydCIsIkVycm9yIiwiSlNPTiIsInN0cmluZ2lmeSIsImZsb29yIiwiY2VpbCIsImNyZWF0ZURlYnVnIiwicHJldlRpbWUiLCJkZWJ1ZyIsImVuYWJsZWQiLCJjdXJyIiwiRGF0ZSIsImRpZmYiLCJwcmV2IiwiYXJncyIsImV4cG9ydHMiLCJjb2VyY2UiLCJ1bnNoaWZ0IiwiZm9ybWF0IiwiZm9ybWF0dGVyIiwiZm9ybWF0dGVycyIsInNwbGljZSIsImZvcm1hdEFyZ3MiLCJjb25zb2xlIiwiYmluZCIsImFwcGx5IiwidXNlQ29sb3JzIiwiY29sb3IiLCJoYXNoIiwiY2hhckNvZGVBdCIsImFicyIsInNlbGVjdENvbG9yIiwiZGVzdHJveSIsImluaXQiLCJpbnN0YW5jZXMiLCJtb2R1bGUiLCJzdGFjayIsIm1lc3NhZ2UiLCJlbmFibGUiLCJuYW1lc3BhY2VzIiwic2F2ZSIsImxlbiIsInNraXBzIiwiUmVnRXhwIiwibmFtZXMiLCJpbnN0YW5jZSIsInRlc3QiLCJyZXF1aXJlJCQwIiwibG9hZCIsInIiLCJzdG9yYWdlIiwicHJvY2VzcyIsImVudiIsIkRFQlVHIiwiRnVuY3Rpb24iLCJodW1hbml6ZSIsImxhc3RDIiwicmVtb3ZlSXRlbSIsIm5hdmlnYXRvciIsInVzZXJBZ2VudCIsImRvY3VtZW50RWxlbWVudCIsIldlYmtpdEFwcGVhcmFuY2UiLCJmaXJlYnVnIiwiZXhjZXB0aW9uIiwiJDEiLCJjaHJvbWUiLCJsb2NhbCIsImxvY2FsU3RvcmFnZSIsImxvY2Fsc3RvcmFnZSIsImVyciIsImVhc2VFeHAiLCJheGlzIiwidmVydGljYWxRIiwiYmdjcFJlY3QiLCJzcGFjZVgiLCJzcGFjZVkiLCJndWlkZUxpbmVzUSIsImd1aWRlbGluZVNwYWNlIiwidGlja0xhYmVsTWF4Rm9udFNpemUiLCJiYWNrZ3JvdW5kRmlsbCIsInRpY2tMYWJlbFJvdGF0aW9uIiwidGlja0RhdGEiLCJjYXRlZ29yaWNhbFEiLCJncm91cGluZyIsInRpY2tMYWJlbHMiLCJudW1iZXJPZlRpY2tzIiwiZXh0ZW50IiwidGlja1ZhbHVlcyIsImZsYXRUaWNrRGF0YSIsImRvbWFpblBhZGRpbmciLCJtaW5PYmplY3RTaXplIiwibWF4T2JqZWN0U2l6ZSIsIm9iamVjdFNwYWNlciIsIm9iakNsYXNzIiwic3BhY2VyRnVuY3Rpb24iLCJtb3ZlWEJ5IiwibW92ZVlCeSIsIm10IiwiZGF0dW0iLCJkaXN0IiwidGhhdCIsImxhYmVsIiwidGlja1N0cm9rZSIsInRpY2tTdHJva2VXaWR0aCIsInJvdW5kVG8iLCJ0aWNrTGFiZWxGb250U2l6ZSIsInRpY2tMYWJlbFRleHRBbmNob3IiLCJndWlkZUxpbmVTdHJva2UiLCJndWlkZUxpbmVTdHJva2VXaWR0aCIsImxpbmVTdHJva2UiLCJsaW5lU3Ryb2tlV2lkdGgiLCJ0aWNrTGFiZWxNaW5Gb250U2l6ZSIsInRpY2tMYWJlbEZ1bmMiLCJrZXlBIiwia2V5QiIsImRlc2NlbmRpbmciLCJDRiIsIlRUaXAiLCJiYXIiLCJiYXJLZXlzIiwib3JkZXJlZCIsInNvcnQiLCJzb3J0aW5nRnVuY3Rpb24iLCJiYXJWYWx1ZXMiLCJkZWZhdWx0RXhpdCIsInBhcmVudEluZGV4QXJyYXkiLCJOdW1iZXIiLCJmaWxsQ29sb3IiLCJzdHJva2VDb2xvciIsImJhclN0cm9rZVdpZHRoIiwieEtleSIsInlLZXkiLCJyS2V5IiwidktleSIsInhLZXlTb3J0aW5nRnVuY3Rpb24iLCJ4RXh0cmFjdG9yIiwieUtleVNvcnRpbmdGdW5jdGlvbiIsInlFeHRyYWN0b3IiLCJiaG0iLCJjZWxsS2V5cyIsInJFeHRyYWN0b3IiLCJ2RXh0cmFjdG9yIiwieFZhbHVlcyIsInlWYWx1ZXMiLCJ4RGltIiwieURpbSIsInJWYWx1ZXMiLCJ5U2l6ZSIsInhTaXplIiwieVNwYWNlciIsInlTcGFjZXJTaXplIiwieFNwYWNlciIsInhTcGFjZXJTaXplIiwiY2VsbHMiLCJyYWRpdXMiLCJidWJibGVTdHJva2VXaWR0aCIsInZWYWx1ZXMiLCJxdWFydGlsZXNLZXkiLCJxdWFydGlsZXNLZXlzIiwiYm94d2hpc2tlciIsImJveEtleXMiLCJib3hWYWx1ZXMiLCJ3aGlzayIsInVXaGlzayIsImxXaGlzayIsInF1YXJ0IiwidVF1YXJ0IiwibFF1YXJ0IiwibVF1YXJ0IiwiYm94U3Ryb2tlV2lkdGgiLCJkaWYiLCJkZCIsImlpIiwid2hpc2tlcldpZHRoUGVyY2VudCIsIndoaXNrZXJTdHJva2VXaWR0aCIsImRhdGF0b2dnbGUiLCJ0b2dnbGUiLCJkYXRhb3B0cyIsImRvRW50ZXIiLCJjdXJyZW50S2V5IiwicHJvcGVydHkiLCJ1cGRhdGVGdW5jdGlvbiIsInNjYXR0ZXIiLCJwb2ludEtleXMiLCJ2YWx1ZUV4dHJhY3RvclgiLCJ2YWx1ZUV4dHJhY3RvclkiLCJ2YWx1ZUV4dHJhY3RvclIiLCJleHRlbnRYIiwidmFsdWVzWCIsImRvbWFpblBhZGRpbmdYIiwiZXh0ZW50WSIsInZhbHVlc1kiLCJkb21haW5QYWRkaW5nWSIsImV4dGVudFIiLCJ2YWx1ZXNSIiwiZG9tYWluUGFkZGluZ1IiLCJtaW5SYWRpdXMiLCJtYXhSYWRpdXMiLCJwRW50ZXIiLCJwRXhpdCIsInNjYWxlWCIsInNjYWxlWSIsInNjYWxlUiIsInBvaW50U3Ryb2tlV2lkdGgiLCJhZGRFdmVudExpc3RlbmVyIiwicGxvdFpvb20iLCJjaGFydCIsInhBeGlzIiwieUF4aXMiLCJjaGFydFNlbCIsInhBeGlzU2VsIiwieUF4aXNTZWwiLCJzZXRMb2NrcyIsImNoYXJ0T2JqU2VsIiwiY2hhcnRPYmpUcmFucyIsImNvcyIsImdldEJCb3giLCJ4TG9jayIsInlMb2NrIiwiem9vbSIsImV2ZW50IiwiY2hhcnRCb3giLCJ4QXhpc0JveCIsInlBeGlzQm94IiwiZXZlbnRUeXBlIiwicHJldmVudERlZmF1bHQiLCJkZWx0YVkiLCJ3aGVlbFNwZWVkIiwic2hpZnRRIiwic2hpZnRLZXkiLCJhcHBseVgiLCJhcHBseVkiLCJ4QXhpc09ialNlbCIsInlBeGlzT2JqU2VsIiwicmVzZXQiLCJ2aW9saW4iLCJiYXNlIiwibWluTWF4SGV4U2NhbGUiLCJzY2FsZWRDb2xvciIsIm1vZCIsInF1YXJ0aWxlS2V5cyIsImNhbGNWYWx1ZXMiLCJjYWxjdWxhdGVWaW9saW5WYWx1ZXMiLCJ2aW9saW5Qb2ludHMiLCJ2aW9saW5Qb2ludHNLZXlzIiwidmlvbGluUG9pbnRzVmFsdWVzIiwicGsiLCJwb2ludFF1YXJ0aWxlcyIsImJpbm5lZCIsImhpc3RvZ3JhbSIsImZyZXF1ZW5jaWVzIiwiYmluIiwibWluQ29udG91clBvaW50IiwibWF4Q29udG91clBvaW50IiwidmlvbGluQ29udG91clBvaW50cyIsIngwIiwieDEiLCJjb250b3VyIiwicG9pbnRWYWx1ZXMiLCJuZWVkZWRWaW9saW5WYWx1ZXMiLCJ2ayIsInZpb2xpbktleXMiLCJmcmVxdWVuY3lNYXgiLCJ2U2NhbGUiLCJsQXJlYSIsImxpbmUiLCJjdXJ2ZSIsImN1cnZlQmFzaXMiLCJyQXJlYSIsImFyZWEiLCJsYSIsInJhIiwicXVhcnRzIiwib2JqZWN0U3Ryb2tlV2lkdGgiLCJwb2ludHNRIiwicHRzQ29udGFpbmVyIiwicHRzIiwicHRzRW50ZXIiLCJwb2ludFJhZGl1cyIsInBvaW50S2V5IiwicmFuZG9tIiwicG9pbnRDb2xvckZ1bmMiLCJjcmVhdGVFdmVudCIsImluaXRFdmVudCIsImRpc3BhdGNoRXZlbnQiLCJ0b29sdGlwS2V5IiwicXVhcnRpbGVLZXkiLCJ2aW9saW5WYWx1ZXMiLCJwdHNDb250YWluZXJzIiwibm9kZXMiLCJrZXlFeHRyYWN0b3IiLCJleHRyYWN0VmlvbGluVmFsdWVzIiwidmFsdWVFeHRyYWN0b3JGdW5jdGlvbiIsInFLZXkiLCJtaW5Qb2ludCIsIm1heFBvaW50IiwiZ2V0Q29udGFpbmluZ1NWRyIsImVsZW1lbnQiLCJwYXJlbnQiLCJwYXJlbnRFbGVtZW50IiwidGFnTmFtZSIsImludGVycG9sYXRlQ29sb3JzIiwiaW50ZXJwb2xhdGVSZ2JCYXNpcyIsInNldHVwU3RhbmRhcmRDaGFydENvbnRhaW5lcnMiLCJhdmFpbGFibGVXaWR0aCIsImlubmVyV2lkdGgiLCJhdmFpbGFibGVIZWlnaHQiLCJpbm5lckhlaWdodCIsIm1hcmdpbnMiLCJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiLCJwZXJjZW50YWdlcyIsImF4ZXMiLCJ4QXhpc1BlcmNlbnQiLCJ5QXhpc1BlcmNlbnQiLCJwZXJjZW50T2ZTcGFjZUZvcldpZHRoIiwicGVyY2VudE9mU3BhY2VGb3JIZWlnaHQiLCJzdmdTcGFjZSIsImNoYXJ0U3BhY2UiLCJheGVzU3BhY2UiLCJ5QXhpc1JlY3QiLCJkcmF3aW5nU3BhY2UiLCJwbG90UmVjdCIs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 diff --git a/src/scripts/modules/violin.js b/src/scripts/modules/violin.js index c492b08..a297812 100644 --- a/src/scripts/modules/violin.js +++ b/src/scripts/modules/violin.js @@ -26,110 +26,110 @@ export function violin( selection ) { var /** * Data to plot. Assumed to be a object, where each key corresponds to a violin - * (see {@link bar#data}) + * (see {@link violin#data}) * @param {Object} [data=undefined] - * @memberof bar# + * @memberof violin# * @property */ data, /** * Which direction to render the bars in - * (see {@link bar#orient}) + * (see {@link violin#orient}) * @param {number} [orient='horizontal'] - * @memberof bar# + * @memberof violin# * @property */ orient='horizontal', /** - * Amount of horizontal space (in pixels) avaible to render the bar in - * (see {@link bar#spaceX}) + * Amount of horizontal space (in pixels) avaible to render the violin in + * (see {@link violin#spaceX}) * @param {number} [spaceX=undefined] - * @memberof bar# + * @memberof violin# * @property */ spaceX, /** - * Amount of vertical space (in pixels) avaible to render the bar in - * (see {@link bar.spaceY}) + * Amount of vertical space (in pixels) avaible to render the violin in + * (see {@link violin.spaceY}) * @param {number} [spaceY=undefined] - * @memberof bar# + * @memberof violin# * @property */ spaceY, /** - * Whether or not to allow bar to render elements pass the main spatial dimension - * given the orientation (see {@link bar#orient}), where {@link bar#orient}="horizontal" - * the main dimension is {@link bar#spaceX} and where {@link bar#orient}="vertical" - * the main dimension is {@link bar#spaceY} + * Whether or not to allow violin to render elements pass the main spatial dimension + * given the orientation (see {@link violin#orient}), where {@link violin#orient}="horizontal" + * the main dimension is {@link violin#spaceX} and where {@link violin#orient}="vertical" + * the main dimension is {@link violin#spaceY} * @param {boolean} [overflowQ=false] - * @memberof bar# + * @memberof violin# * @property */ overflowQ = true, /** * Whether or not to display points inside the points * @param {boolean} [pointsQ=false] - * @memberof bar# + * @memberof violin# * @property */ pointsQ = true, /** * An array - putatively of other arrays - depicting how bars should be arranged * @param {Array[]} [grouping=undefined] - * @memberof bar# + * @memberof violin# * @property */ grouping, /** - * How to get the value of the bar + * How to get the value of the violin * @param {function} [valueExtractor=function(key, index) { return data[key] }] - * @memberof bar# + * @memberof violin# * @property */ valueExtractor = function(key, index) {return data[key] }, /** - * How to sort the bars - if {@link bar#grouping} is not provided. + * How to sort the bars - if {@link violin#grouping} is not provided. * @param {function} [sortingFunction=function(keyA, keyB) {return d3.descending(data[keyA], data[keyB])}] - * @memberof bar# + * @memberof violin# * @property */ sortingFunction = function(keyA, keyB) {return d3.descending(data[keyA], data[keyB])}, /** - * The scale for which bar values should be transformed by + * The scale for which violin values should be transformed by * @param {d3.scale} [scale=d3.scaleLinear] - * @memberof bar# + * @memberof violin# * @property */ scale = d3.scaleLinear(), /** - * The padding for the domain of the scale (see {@link bar#scale}) + * The padding for the domain of the scale (see {@link violin#scale}) * @param {number} [domainPadding=0.5] - * @memberof bar# + * @memberof violin# * @property */ domainPadding = 0.5, /** * Default space for the spacer (percentage) of main dimension given the orientation - * (see {@link bar#orient}), where {@link bar#orient}="horizontal" - * the main dimension is {@link bar#spaceX} and where {@link bar#orient}="vertical" - * the main dimension is {@link bar#spaceY} between bars + * (see {@link violin#orient}), where {@link violin#orient}="horizontal" + * the main dimension is {@link violin#spaceX} and where {@link violin#orient}="vertical" + * the main dimension is {@link violin#spaceY} between bars * @param {number} [objectSpacer=0.05] - * @memberof bar# + * @memberof violin# * @property */ objectSpacer = 0.05, /** * The minimum size that an object can be * @param {number} [minObjectSize=50] - * @memberof bar# + * @memberof violin# * @property */ minObjectSize = 50, /** * The maximum size that an object can be * @param {number} [maxObjectSize=100] - * @memberof bar# + * @memberof violin# * @property */ maxObjectSize = 100, @@ -137,25 +137,25 @@ export function violin( selection ) { /** * The stroke width of the bars * @param {number} [barStrokeWidth=2] - * @memberof bar# + * @memberof violin# * @property */ objectStrokeWidth = 2, /** * Instance of ColorFunction * @param {function} [colorFunction = colorFunction()] - * @memberof bar# + * @memberof violin# * @property */ colorFunction = CF(), /** * Instance of ColorFunction modified by a scale for the points * @param {function} [pointColorFunc = colorFunction()] - * @memberof bar# + * @memberof violin# * @property */ pointColorFunc = function (d, type, base, min, max) { - var minMaxHexScale = d3.scaleLinear().domain([max, min]).range([-0.25, 0.25]) + var minMaxHexScale = d3.scaleLinear().domain([min, max]).range([-0.25, 0.05]) var scaledColor = modifyHexidecimalColorLuminance(base.replace('#', ''), minMaxHexScale(d)) var mod = type == "stroke" ? 0 : 0.25 return modifyHexidecimalColorLuminance(scaledColor.replace('#', ''), mod) @@ -164,14 +164,14 @@ export function violin( selection ) { /** * The radius of a point * @param {number} [pointRadius=3] - * @memberof bar# + * @memberof violin# * @property */ pointRadius = 3, /** * The stroke width of the oints * @param {number} [pointStrokeWidth=2] - * @memberof bar# + * @memberof violin# * @property */ pointStrokeWidth = 2, @@ -179,35 +179,35 @@ export function violin( selection ) { /** * Color of the background * @param {string} [backgroundFill="transparent"] - * @memberof bar# + * @memberof violin# * @property */ backgroundFill = 'transparent', /** - * Namespace for all items made by this instance of bar + * Namespace for all items made by this instance of violin * @param {string} [namespace="d3sm-violin"] - * @memberof bar# + * @memberof violin# * @property */ namespace = 'd3sm-violin', /** - * Class name for bar container ( element) + * Class name for violin container ( element) * @param {string} [objectClass="violin"] - * @memberof bar# + * @memberof violin# * @property */ objectClass = 'violin', /** * Duration of all transitions of this element * @param {number} [transitionDuration=1000] - * @memberof bar# + * @memberof violin# * @property */ transitionDuration = 1000, /** * Easing function for transitions * @param {d3.ease} [easeFunc=d3.easeExp] - * @memberof bar# + * @memberof violin# * @property */ easeFunc = d3.easeExp, @@ -215,14 +215,14 @@ export function violin( selection ) { /** * The key containing the quartiles * @param {string} [quartilesKey=undefined] - * @memberof bar# + * @memberof violin# * @property */ quartilesKey = "quartiles", /** * The keys corresponding to each quartile * @param {string[]} [quartileKeys=["Q0", "Q1", "Q2", "Q3", "Q4"]] - * @memberof bar# + * @memberof violin# * @property */ quartileKeys = ["Q0", "Q1", "Q2", "Q3", "Q4"], @@ -230,28 +230,28 @@ export function violin( selection ) { /** * The keys of the bars * @param {string[]} [violinKeys=undefined] - * @memberof bar# + * @memberof violin# * @property */ violinKeys, /** * The values of the bars * @param {number[]} [violinValues=undefined] - * @memberof bar# + * @memberof violin# * @property */ violinValues, /** * The objectSize (actual width) used by the bars * @param {number} [objectSize=undefined] - * @memberof bar# + * @memberof violin# * @property */ objectSize, /** * The spacerSize (actual width) used by the spacers between the bars * @param {number} [spacerSize=undefined] - * @memberof bar# + * @memberof violin# * @property */ spacerSize, @@ -259,16 +259,53 @@ export function violin( selection ) { /** * Instance of Tooltip * @param {function} [tooltip=tooltip()] - * @memberof bar# + * @memberof violin# * @property */ tooltip = TTip().keys([quartileKeys[4], quartileKeys[3], quartileKeys[2], quartileKeys[1], quartileKeys[0]]), pointsTooltip = TTip(), pointKeyExtractor = function(violinKey, violinData, violinValues) {return d3.keys(violinValues[violinKey].values)}, - pointValueExtractor = function(pointKey, violinKey, violinData, violinValues) {return violinValues[violinKey].values[pointKey]} + pointValueExtractor = function(pointKey, violinKey, violinData, violinValues) {return violinValues[violinKey].values[pointKey]}, - //, - // pointsTooltip = TTip() + + /** + * Function which given the key of the violin and that key's associated value + * returns the object consiting of the points of the violin + * (see {@link violin#violinPointsExtractor}) + * @param {Object} [violinPointsExtractor=function(violinKey, violinData) { return violinData.points }] + * @memberof violin# + * @property + */ + violinPointsExtractor = function(violinKey, violinData) { return violinData.points }, + /** + * Function which given the key of the current point and the object of points for the + * violin, returns the numerical value of the point + * (see {@link violin#violinPointValueExtractor}) + * @param {Object} [violinPointValueExtractor=function(violinPointKey, violinPointData) { return violinPointData[violinPointKey].value }] + * @memberof violin# + * @property + */ + violinPointValueExtractor = function(violinPointKey, violinPointData) { return violinPointData[violinPointKey].value } + + + /** + * Gets or sets the violinPointsExtractor + * @param {function} [_=none] + * @returns {violin | function} + * @memberof violin + * @property + * by default violinPointsExtractor = function(violinKey, violinData) { return violinData.points } + */ + violin.violinPointsExtractor = function(_) { return arguments.length ? (violinPointsExtractor = _, violin) : violinPointsExtractor; }; + /** + * Gets or sets the violinPointValueExtractor + * @param {function} [_=none] + * @returns {violin | function} + * @memberof violin + * @property + * by default violinPointsExtractor = function(pointKey, violinKey, violinData, violinValues) {return violinValues[violinKey].values[pointKey]} + */ + violin.violinPointValueExtractor = function(_) { return arguments.length ? (violinPointValueExtractor = _, violin) : violinPointValueExtractor; }; /** @@ -609,6 +646,10 @@ export function violin( selection ) { violin.tooltip = function(_) { return arguments.length ? (tooltip = _, violin) : tooltip; }; // violin.pointsTooltip = function(_) { return arguments.length ? (pointsTooltip = _, violin) : pointsTooltip; }; + + + + function violin () { // for convenience in handling orientation specific values var horizontalQ = (orient == 'horizontal') ? true : false @@ -634,11 +675,8 @@ export function violin( selection ) { // augment valus violinKeys.map(function(vk, i){ calcValues(vk, data) }) - // violinValues = extractViolinValues(violinKeys, data, valueExtractor, horizontalQ, quartilesKey, quartileKeys) - var numberOfObjects = violinKeys.length - var min = [].concat(...violinKeys.map(function(k, i){return data[k].quartiles[quartileKeys[0]]})) var max = [].concat(...violinKeys.map(function(k, i){return data[k].quartiles[quartileKeys[quartileKeys.length - 1]]})) var extent = [Math.min(...min) - domainPadding, Math.max(...max) + domainPadding] @@ -753,7 +791,9 @@ export function violin( selection ) { pts = pts.merge(ptsEnter) var pTTips = TTip().selection(pts).data(violinPointsExtractor(key, currentData)) - () + pTTips() + + var pMin = d3.min(currentData.pointValues), pMax = d3.max(currentData.pointValues) @@ -778,8 +818,8 @@ export function violin( selection ) { } return scale(dd) }) - .attr('stroke', function(dd, ii) { var dd = currentData.pointValues[ii];return pointColorFunc(dd, 'stroke', strokeColor, min, max) }) - .attr('fill' , function(dd, ii) { var dd = currentData.pointValues[ii];return pointColorFunc(dd, 'fill' , strokeColor, min, max) }) + .attr('stroke', function(dd, ii) { var dd = currentData.pointValues[ii]; return pointColorFunc(dd, 'stroke', strokeColor, pMin, pMax) }) + .attr('fill' , function(dd, ii) { var dd = currentData.pointValues[ii]; return pointColorFunc(dd, 'fill' , strokeColor, pMin, pMax) }) .attr('stroke-width', pointStrokeWidth) ptsContainer.selectAll('circle.point').on('mouseover', function(dd, ii){ @@ -813,19 +853,6 @@ export function violin( selection ) { }) - // var values = {}; - // pointKeyExtractor(key, currentData, violinValues).map(function(k, i){ - // values[k] = pointValueExtractor(k, key, currentData, violinValues) - // }) - // - // console.table(values) - // - // .data(data) - // .keys(['Value']) - // .values([function(cd, key){return cd }]) - // pointsTooltip() - - tooltip.selection(container.selectAll('g:not(.to-remove).'+objectClass + ' .area')) if (tooltip.data() == undefined) {tooltip.data(data)} tooltip() @@ -845,21 +872,120 @@ export function violin( selection ) { -function violinPointsExtractor(violinKey, violinData) { return violinData.points } -function violinPointValueExtractor(violinPointKey, violinPointData) { return violinPointData[violinPointKey].value } +/** +* Produces the function which manipulates the violin data to have values needed +* for rendering the violins as svg. +* @returns {function} calculateViolinValues +* @namespace neededViolinValues +*/ function neededViolinValues() { var + /** + * Whether or not the orientation of the violins are horizontal + * (see {@link violin#orient}) + * @param {Object} [horizontalQ=true] + * @memberof neededViolinValues# + * @property + */ horizontalQ = true, + /** + * Keys to be put into the quartiles if they need to be calculated. + * (see {@link violin#quartileKeys}) + * @param {Object} [quartileKeys=['Q0', 'Q1', 'Q2', 'Q3', 'Q4']] + * @memberof neededViolinValues# + * @property + */ quartileKeys = ['Q0', 'Q1', 'Q2', 'Q3', 'Q4'], + /** + * Function which given the key of the violin and that key's associated value + * returns the object consiting of the points of the violin + * (see {@link violin#violinPointsExtractor}) + * @param {Object} [violinPointsExtractor=function(violinKey, violinData) { return violinData.points }] + * @memberof neededViolinValues# + * @property + */ violinPointsExtractor, + /** + * Function which given the key of the current point and the object of points for the + * violin, returns the numerical value of the point + * (see {@link violin#violinPointValueExtractor}) + * @param {Object} [violinPointValueExtractor=function(violinPointKey, violinPointData) { return violinPointData[violinPointKey].value }] + * @memberof neededViolinValues# + * @property + */ violinPointValueExtractor + + /** + * Gets / sets the horizontalQ + * (see {@link violin#orient}) + * @param {boolean} [_=none] + * @returns {calculateViolinValues | boolean} + * @memberof calculateViolinValues + * @property + * + * by default horizontalQ = true + */ calculateViolinValues.horizontalQ = function(_) { return arguments.length ? (horizontalQ=_, calculateViolinValues) : horizontalQ } + /** + * Gets / sets the quartileKeys + * (see {@link violin#quartileKeys}) + * @param {string[]} [_=none] + * @returns {calculateViolinValues | string[]} + * @memberof calculateViolinValues + * @property + * + * by default quartileKeys = ["Q0","Q1","Q2","Q3","Q4"] + */ calculateViolinValues.quartileKeys = function(_) { return arguments.length ? (quartileKeys=_, calculateViolinValues) : quartileKeys } + /** + * Gets / sets the violinPointsExtractor + * (see {@link violin#violinPointsExtractor}) + * @param {function} [_=none] + * @returns {calculateViolinValues | function} + * @memberof calculateViolinValues + * @property + * + * by default violinPointsExtractor = function(violinKey, violinData) { return violinData.points } + */ calculateViolinValues.violinPointsExtractor = function(_) { return arguments.length ? (violinPointsExtractor=_, calculateViolinValues) : violinPointsExtractor } + /** + * Gets / sets the violinPointValueExtractor + * (see {@link violin#violinPointValueExtractor}) + * @param {function} [_=none] + * @returns {calculateViolinValues | function} + * @memberof calculateViolinValues + * @property + * + * by default violinPointValueExtractor = function(violinPointKey, violinPointData) { return violinPointData[violinPointKey].value } + */ calculateViolinValues.violinPointValueExtractor = function(_) { return arguments.length ? (violinPointValueExtractor=_, calculateViolinValues) : violinPointValueExtractor } + + /** + * The function produced by neededViolinValues. + * + * Adds the data need to render the violin as an svg + * @param {string} violinKey the key of the current violin + * @param {object} data the object consisting of violinKey - values (violin data) pairs + * @returns {none} this function manipulates the passed data object adding the following keys + * + * data[violinKey].binned // the binned values of the points + * + * data[violinKey].frequencies // the list consisting of the length of each bin + * + * data[violinKey].contour // the points depicting the contour of 1/2 of the violin + * + * data[violinKey].quartiles // the quartiles of the points' values + * + * data[violinKey].pointKeys // the keys associated with the points + * + * data[violinKey].pointValues // the numerical values of the points + * + * @memberof neededViolinValues# + * @property + */ function calculateViolinValues(violinKey, data) { // data for the current violin var violinData = data[violinKey]; -- GitLab From e4f115b0a5d2424792ab799c46606de1d608c9b7 Mon Sep 17 00:00:00 2001 From: Sumner Date: Wed, 23 May 2018 17:07:10 +0200 Subject: [PATCH 3/3] v --- src/scripts/modules/violin.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/scripts/modules/violin.js b/src/scripts/modules/violin.js index a297812..72f2e6b 100644 --- a/src/scripts/modules/violin.js +++ b/src/scripts/modules/violin.js @@ -666,12 +666,17 @@ export function violin( selection ) { violinKeys = flatten(ordered) + console.log('VIOKEYS', violinKey) + var calcValues = neededViolinValues() .horizontalQ(horizontalQ) .quartileKeys(quartileKeys) .violinPointsExtractor(violinPointsExtractor) .violinPointValueExtractor(violinPointValueExtractor) + console.log('VIOKEYS', violinKey.map(function(k,i){return data[k]})) + + // augment valus violinKeys.map(function(vk, i){ calcValues(vk, data) }) -- GitLab