axidio-styleguide-library1-v2 0.2.59 → 0.2.61
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/horizontal-bars-with-scroll-zoom/horizontal-bars-with-scroll-zoom.component.mjs +113 -181
- package/esm2022/lib/horizontal-grouped-bar-with-scroll-zoom/horizontal-grouped-bar-with-scroll-zoom.component.mjs +26 -64
- package/fesm2022/axidio-styleguide-library1-v2.mjs +137 -243
- package/fesm2022/axidio-styleguide-library1-v2.mjs.map +1 -1
- package/lib/horizontal-bars-with-scroll-zoom/horizontal-bars-with-scroll-zoom.component.d.ts +0 -3
- package/package.json +1 -1
|
@@ -1400,27 +1400,6 @@ export class HorizontalGroupedBarWithScrollZoomComponent extends ComponentUnique
|
|
|
1400
1400
|
}
|
|
1401
1401
|
// ==================== SVG CONTAINERS CREATION ====================
|
|
1402
1402
|
const { outerContainer, svgYAxisLeft, svgYAxisRight, innerContainer, svg } = this.createChartContainers(chartContainer, margin, height, RIGHT_SVG_WIDTH, self, width);
|
|
1403
|
-
// Only enable horizontal scrolling on mobile/tablet when in zoomed-out
|
|
1404
|
-
// mode and there are many groups or multiple subgroups. Otherwise keep
|
|
1405
|
-
// the inner container fixed (no scrollbar).
|
|
1406
|
-
try {
|
|
1407
|
-
const groupsCount = data.length || 0;
|
|
1408
|
-
const subgroupsCount = (keyList && keyList.length) || 0;
|
|
1409
|
-
// Show scrollbar when there are many groups or multiple subgroups,
|
|
1410
|
-
// for ALL viewports (mobile/tablet/desktop) so both zoom-in and
|
|
1411
|
-
// zoom-out allow horizontal scrolling when content overflows.
|
|
1412
|
-
if (groupsCount > 8 || subgroupsCount > 2) {
|
|
1413
|
-
innerContainer.style('overflow-x', 'auto');
|
|
1414
|
-
innerContainer.classed('scroll-enabled', true);
|
|
1415
|
-
}
|
|
1416
|
-
else {
|
|
1417
|
-
innerContainer.style('overflow-x', 'hidden');
|
|
1418
|
-
innerContainer.classed('scroll-enabled', false);
|
|
1419
|
-
}
|
|
1420
|
-
}
|
|
1421
|
-
catch (e) {
|
|
1422
|
-
// ignore
|
|
1423
|
-
}
|
|
1424
1403
|
// ==================== SCALES SETUP ====================
|
|
1425
1404
|
const subgroups = keyList;
|
|
1426
1405
|
const groups = d3.map(data, (d) => d.name).keys();
|
|
@@ -1848,24 +1827,14 @@ export class HorizontalGroupedBarWithScrollZoomComponent extends ComponentUnique
|
|
|
1848
1827
|
return y(0);
|
|
1849
1828
|
}
|
|
1850
1829
|
calculateBarWidth(d, data, subgroups, x, xSubgroup, self, tempScale) {
|
|
1851
|
-
// Device detection for responsive sizing
|
|
1852
|
-
const isMobile = window.innerWidth < 576;
|
|
1853
|
-
const isTablet = window.innerWidth >= 576 && window.innerWidth < 992;
|
|
1854
1830
|
// For grouped bar charts in zoom-in view
|
|
1855
1831
|
if (subgroups.length > 1 && !self.isZoomedOut) {
|
|
1856
|
-
return
|
|
1832
|
+
return 50;
|
|
1857
1833
|
}
|
|
1858
1834
|
// For single-bar charts in zoom-in view
|
|
1859
1835
|
if (subgroups.length === 1 && !self.isZoomedOut) {
|
|
1860
|
-
return
|
|
1836
|
+
return 80;
|
|
1861
1837
|
}
|
|
1862
|
-
// Minimum bar widths for zoomed-out state
|
|
1863
|
-
const minBarWidth = (() => {
|
|
1864
|
-
if (subgroups.length > 2) {
|
|
1865
|
-
return isMobile ? 18 : isTablet ? 24 : 30;
|
|
1866
|
-
}
|
|
1867
|
-
return isMobile ? 12 : isTablet ? 16 : 20;
|
|
1868
|
-
})();
|
|
1869
1838
|
// Default logic for drilldown charts
|
|
1870
1839
|
if (self.chartConfiguration.isDrilldownChart) {
|
|
1871
1840
|
let calculatedScale = d3.scaleBand().domain([]).range([0, 0]);
|
|
@@ -1880,11 +1849,9 @@ export class HorizontalGroupedBarWithScrollZoomComponent extends ComponentUnique
|
|
|
1880
1849
|
}
|
|
1881
1850
|
}
|
|
1882
1851
|
});
|
|
1883
|
-
|
|
1884
|
-
return Math.max(calculatedScale.bandwidth(), minBarWidth);
|
|
1852
|
+
return calculatedScale.bandwidth();
|
|
1885
1853
|
}
|
|
1886
|
-
|
|
1887
|
-
return Math.max(xSubgroup.bandwidth(), minBarWidth);
|
|
1854
|
+
return xSubgroup.bandwidth();
|
|
1888
1855
|
}
|
|
1889
1856
|
calculateBarHeight(d, y, height, self) {
|
|
1890
1857
|
if (d.value === -1) {
|
|
@@ -2278,34 +2245,30 @@ export class HorizontalGroupedBarWithScrollZoomComponent extends ComponentUnique
|
|
|
2278
2245
|
calculateChartDimensions(chartContainer, verticalstackedcontainer, margin, self) {
|
|
2279
2246
|
let width = parseInt(chartContainer.style('width')) - margin.left - margin.right;
|
|
2280
2247
|
const dataLength = this.chartData.data.length;
|
|
2281
|
-
|
|
2282
|
-
|
|
2283
|
-
|
|
2284
|
-
|
|
2285
|
-
|
|
2286
|
-
|
|
2287
|
-
|
|
2288
|
-
|
|
2289
|
-
|
|
2290
|
-
|
|
2291
|
-
|
|
2292
|
-
|
|
2293
|
-
|
|
2294
|
-
|
|
2295
|
-
|
|
2296
|
-
|
|
2297
|
-
width = Math.max(width, minRequiredWidth);
|
|
2298
|
-
}
|
|
2248
|
+
// ---- Width Logic (no change) ----
|
|
2249
|
+
if (dataLength > 30 && this.isZoomedOut) {
|
|
2250
|
+
width =
|
|
2251
|
+
width > dataLength * 40
|
|
2252
|
+
? this.chartData.dropdownData1
|
|
2253
|
+
? dataLength * 60
|
|
2254
|
+
: width
|
|
2255
|
+
: this.chartData.dropdownData1
|
|
2256
|
+
? dataLength * 60
|
|
2257
|
+
: dataLength * 40;
|
|
2258
|
+
width = width > dataLength * 40 ? width : dataLength * 40;
|
|
2259
|
+
}
|
|
2260
|
+
if (this.chartData.dropdownData2 &&
|
|
2261
|
+
width < dataLength * 120 &&
|
|
2262
|
+
this.isZoomedOut) {
|
|
2263
|
+
width = dataLength * 120;
|
|
2299
2264
|
}
|
|
2300
|
-
// In zoomed-in state, always ensure generous spacing
|
|
2301
2265
|
if (dataLength > 8 && !this.isZoomedOut) {
|
|
2302
2266
|
if (this.chartData.dropdownData2 &&
|
|
2303
2267
|
width < dataLength * 250) {
|
|
2304
2268
|
width = dataLength * 250;
|
|
2305
2269
|
}
|
|
2306
2270
|
else {
|
|
2307
|
-
|
|
2308
|
-
width = dataLength * (subgroupsCount > 2 ? 200 : 160);
|
|
2271
|
+
width = dataLength * 160;
|
|
2309
2272
|
}
|
|
2310
2273
|
}
|
|
2311
2274
|
// ---- Height Logic (no change) ----
|
|
@@ -2344,7 +2307,7 @@ export class HorizontalGroupedBarWithScrollZoomComponent extends ComponentUnique
|
|
|
2344
2307
|
.attr('class', 'outer-container')
|
|
2345
2308
|
.style('width', '100%')
|
|
2346
2309
|
.style('height', height)
|
|
2347
|
-
.style('overflow', '
|
|
2310
|
+
.style('overflow-x', 'hidden')
|
|
2348
2311
|
.style('padding-left', `${margin.left}px`)
|
|
2349
2312
|
.style('padding-right', `${rightSvgWidth}px`)
|
|
2350
2313
|
.style('margin-left', '15px');
|
|
@@ -2377,9 +2340,8 @@ export class HorizontalGroupedBarWithScrollZoomComponent extends ComponentUnique
|
|
|
2377
2340
|
// Main SVG
|
|
2378
2341
|
const svg = innerContainer
|
|
2379
2342
|
.append('svg')
|
|
2380
|
-
.attr('width',
|
|
2343
|
+
.attr('width', width - rightSvgWidth)
|
|
2381
2344
|
.attr('height', height + margin.top + margin.bottom + 60)
|
|
2382
|
-
.style('min-width', '100%') // Prevent svg from shrinking
|
|
2383
2345
|
.append('g')
|
|
2384
2346
|
.attr('transform', `translate(0,${margin.top})`);
|
|
2385
2347
|
return { outerContainer, svgYAxisLeft, svgYAxisRight, innerContainer, svg };
|
|
@@ -2403,11 +2365,11 @@ export class HorizontalGroupedBarWithScrollZoomComponent extends ComponentUnique
|
|
|
2403
2365
|
this.clickEvent.emit(event);
|
|
2404
2366
|
}
|
|
2405
2367
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HorizontalGroupedBarWithScrollZoomComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2406
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: HorizontalGroupedBarWithScrollZoomComponent, selector: "lib-horizontal-grouped-bar-with-scroll-zoom", inputs: { chartData: "chartData", customChartConfiguration: "customChartConfiguration" }, outputs: { clickEvent: "clickEvent", headerMenuclickEvent: "headerMenuclickEvent" }, viewQueries: [{ propertyName: "containerElt", first: true, predicate: ["groupchartcontainer"], descendants: true, static: true }, { propertyName: "groupcontainerElt", first: true, predicate: ["groupcontainer"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<div\r\n #groupcontainer\r\n class=\"lib-chart-wrapper\"\r\n [ngClass]=\"{ 'lib-no-background': isTransparentBackground }\"\r\n style=\"background-color: var(--card-bg);\"\r\n (resized)=\"onResized($event)\"\r\n>\r\n <div class=\"header-alt\" *ngIf=\"!isHeaderVisible\">\r\n <lib-chart-header-v2\r\n [chartData]=\"chartData\"\r\n [chartConfiguration]=\"chartConfiguration\"\r\n (clickEvent)=\"handleClick($event)\"\r\n ></lib-chart-header-v2>\r\n <lib-chart-header-v3\r\n [chartData]=\"chartData\"\r\n [chartConfiguration]=\"chartConfiguration\"\r\n (compareByFilterSelection)=\"handleCompareByFilterSelection($event)\"\r\n (zoomInZoomOutClick)=\"handleZoominZoomoutClick($event)\"\r\n ></lib-chart-header-v3>\r\n </div>\r\n <lib-chart-header-v1\r\n [title]=\"chartData.metaData.title\"\r\n [hasDrillDown]=\"chartData.metaData.hasDrillDown\"\r\n [isEditEnabled]=\"chartData.metaData.isEditEnabled\"\r\n [menuOptions]=\"chartConfiguration.headerMenuOptions\"\r\n [isria]=\"customChartConfiguration.isRia\"\r\n [selectedKpiTooltop]=\"chartConfiguration.selectedKpiTooltop\"\r\n (menuOptionClickEvent)=\"handleHeaderMenuClick($event)\"\r\n [isAlertEnabled]=\"isAlertEnabled\"\r\n *ngIf=\"isHeaderVisible\"\r\n ></lib-chart-header-v1>\r\n <div\r\n *ngIf=\"\r\n chartData &&\r\n chartData.metaData &&\r\n chartConfiguration.legendJustified &&\r\n legendVisible &&\r\n chartConfiguration.legendAtTopRight\r\n \"\r\n class=\"legend-holder-right\"\r\n [style.height]=\"chartConfiguration.footerHeight\"\r\n >\r\n <ul class=\"display-flex\">\r\n <li\r\n class=\"legends-positioning-inline\"\r\n *ngFor=\"let item of chartData.metaData.colors | keyvalue : keepOrder\"\r\n >\r\n <span\r\n class=\"lib-donut-justified-label-icon-drilldown\"\r\n [style.background-color]=\"item.value\"\r\n ></span\r\n ><span>{{ item.key }}</span>\r\n </li>\r\n </ul>\r\n </div>\r\n <div\r\n [style.height]=\"chartConfiguration.svgHeight\"\r\n id=\"groupchartcontainer\"\r\n #groupchartcontainer\r\n class=\"lib-chart-svg\"\r\n ></div>\r\n\r\n\r\n <!-- <div\r\n *ngIf=\"\r\n chartData &&\r\n chartData.metaData &&\r\n chartConfiguration.legendJustified &&\r\n legendVisible &&\r\n !chartConfiguration.legendAtTopRight\r\n \"\r\n class=\"lib-donut-chart-footer\"\r\n [style.height]=\"chartConfiguration.footerHeight\"\r\n >\r\n <ul class=\"lib-donut-justified-label-wrapper\">\r\n <li\r\n class=\"lib-donut-justified-label-item\"\r\n *ngFor=\"let item of chartData.metaData.colors | keyvalue\"\r\n >\r\n <span\r\n class=\"lib-donut-justified-label-icon\"\r\n [style.background-color]=\"item.value\"\r\n ></span\r\n ><span>{{ item.key }}</span>\r\n </li>\r\n </ul>\r\n </div> -->\r\n\r\n\r\n <!-- <div *ngIf=\"chartConfiguration?.isDisplayBarDetailsAtBottom\">\r\n <div\r\n class=\"bar-values lib-display-flex lib-justify-content-center lib-align-items-center\"\r\n *ngFor=\"\r\n let item of chartData.metaData.colors | keyvalue : keepOrder;\r\n let i = index\r\n \">\r\n <div\r\n class=\"bar-name font-size-1\"\r\n *ngIf=\"\r\n chartData.data[0][item.key] &&\r\n i <= chartConfiguration.howmanyBarDetailsToDisplay\r\n \"\r\n >\r\n {{ item.key }}\r\n </div>\r\n <div\r\n class=\"bar-value lib-display-flex lib-align-items-center font-size-1\"\r\n [style.color]=\"\r\n chartConfiguration.barVauleColor ? barVauleColor : item.value\r\n \"\r\n *ngIf=\"\r\n chartData.data[0][item.key] &&\r\n i <= chartConfiguration.howmanyBarDetailsToDisplay\r\n \"\r\n >\r\n {{ chartData.data[0][item.key] }}\r\n </div>\r\n </div>\r\n </div> -->\r\n</div>\r\n", styles: [".lib-axis-group-label{font-size:.85em;font-weight:600;letter-spacing:0px;color:#000;opacity:1}.text-transform-uppercase{text-transform:uppercase!important}.text-transform-capitalize{text-transform:capitalize!important}.legend-holder-right{display:flex;justify-content:flex-end}.display-flex{display:flex}.legends-positioning-inline{display:flex;align-items:center;justify-content:center;margin-right:10px;margin-left:35px;font-size:18px;font-weight:700;letter-spacing:0px;color:#000;opacity:1}.title{background-color:#d9d9d9;height:50px;display:flex;flex-direction:column;justify-content:center;align-items:center;border-radius:3px;line-height:1.3}.title:after{content:\"\";position:absolute;bottom:0;margin-bottom:-10px;left:50%;margin-left:-10px;width:0;height:0;border-top:solid 10px #d3d3d3;border-left:solid 10px transparent;border-right:solid 10px transparent}.title-bar-name{color:var(--font-color)!important;font-size:17px;font-weight:700;text-transform:capitalize}.title-bar-value{color:var(--font-color)!important;font-size:14px}.title-bar-value>span{font-weight:600}.zoomIcons-holder{display:flex;align-items:center}.legends-latest{height:14px;width:14px;display:flex;margin-right:10px}.legend-latest-holder{font-size:12px;display:flex;justify-content:flex-start;align-items:center}.marginRight-30{margin-right:30px}.zoomIcons-holder{display:flex;align-items:center;margin-right:15px}.zoomIcons{border:.5px solid #b6b6b6;cursor:pointer;display:flex;justify-content:center;align-items:center;width:30px;height:30px;color:var(--color)!important}.zoom-active{background-color:#2d5ca0;opacity:1}.zoom-inactive{background-color:#d9d9d9;opacity:.5}.flex-inline{display:flex;justify-content:center;align-items:center;font-size:14px}.marginLeft-20{margin-left:20px}.target-display{font-size:12px;line-height:14.52px;font-weight:700;text-transform:uppercase;float:right}.legend-style{font-weight:600;text-transform:capitalize}.bar-values{margin-top:10px}.bar-name{font-weight:600;margin-right:10px;text-transform:capitalize}.lib-chart-svg{margin-top:10px}.bar-value{height:29px;background-color:#f4f4f4;padding-left:15px;padding-right:15px;border-radius:8px;box-shadow:-2px 2px 10px #0000004d,2px 2px 10px #0000004d;font-weight:600}.mobile-xaxis-override{writing-mode:sideways-lr}@media (min-height: 900px){.legends-latest{height:17px;width:17px}}.outer-container{position:relative;width:100%;overflow:visible}.inner-container{width:100%;overflow-x:hidden;position:relative}.inner-container.scroll-enabled{overflow-x:auto;-webkit-overflow-scrolling:touch;background:linear-gradient(to right,#fff 30%,#fff0),linear-gradient(to left,#fff 30%,#fff0) 100% 0,radial-gradient(farthest-side at 0 50%,#0000001f,#0000),radial-gradient(farthest-side at 100% 50%,#0000001f,#0000) 100% 0;background-repeat:no-repeat;background-color:#fff;background-size:40px 100%,40px 100%,14px 100%,14px 100%;background-attachment:local,local,scroll,scroll}.inner-container.scroll-enabled::-webkit-scrollbar{height:8px}.inner-container.scroll-enabled::-webkit-scrollbar-track{background:#f1f1f1;border-radius:4px}.inner-container.scroll-enabled::-webkit-scrollbar-thumb{background:#888;border-radius:4px}\n", ".lib-chart-wrapper{width:100%;height:100%;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;background:#fff 0% 0% no-repeat padding-box;position:relative}.lib-chart-wrapper-wo-shadow{width:100%;height:100%;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto}.lib-chart-wrapper:hover .chart-header-v1:not(.header-no-background){background-color:#2e3640}.lib-chart-wrapper:hover .chart-header-v1:not(.header-no-background) .chart-title{color:#fff}.lib-chart-svg{width:100%}.lib-chart-header{text-align:center;background-color:#052340;color:#fff;width:100%;height:17%;word-spacing:.5px;line-height:1.8;font-weight:700;padding-top:2%;letter-spacing:0;font-size:1.2em}.lib-donut-chart-footer{width:100%;text-align:right}.lib-donut-label-text{font-size:.9em;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-weight:400;letter-spacing:0px;color:#000;opacity:1}.lib-donut-label-icon{display:inline-block;width:10px;height:10px;margin-right:20px;border-radius:3px}.lib-donut-label-item{font-weight:400;font-size:.85em;color:#2f2f2f}.lib-donut-justified-label-wrapper{width:100%;display:inline-block;text-align:center;list-style-type:none}.lib-donut-justified-label-item{font-weight:400;font-size:.85em;color:#2f2f2f;display:inline-block;text-align:left;padding:0 10px}.lib-donut-justified-label-icon{display:inline-block;width:10px;height:10px;margin-right:5px;border-radius:3px}.lib-no-background{background:none!important}.lib-display-hidden{display:none}.lib-ylabel-weeklyCharts{font-style:normal;font-variant:normal;font-weight:800;font-size:10px;line-height:12px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:-.07px;text-transform:capitalize;color:#000}.lib-data-labels-weeklycharts{font-style:normal;font-variant:normal;font-weight:400;font-size:12px;line-height:14px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:-.06px;color:#000}.lib-data-labels-angled-weeklycharts{font-style:normal;font-variant:normal;font-weight:800;font-size:9.5px;line-height:11px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:.4px;text-anchor:start}.lib-xaxis-labels-texts-weeklycharts{font-style:normal;font-variant:normal;font-weight:800;font-size:10px;line-height:11px;letter-spacing:-.05px;fill:#000}.lib-xaxis-labels-texts-drilldown{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:14px;letter-spacing:-1px;color:#000;opacity:1;text-transform:capitalize}.lib-white-space-nowrap{white-space:nowrap}.lib-xaxis-labels-texts-drilldown-alt{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:10px;letter-spacing:0px;color:#000;opacity:1;text-transform:capitalize}.lib-yaxis-labels-texts-drilldown{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:14px;letter-spacing:0px;color:#000!important;opacity:1}.lib-ylabel-drilldowncharts,.lib-xlabel-drilldowncharts{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:16px;letter-spacing:-.1px;color:#000!important;opacity:1}.lib-donut-justified-label-icon-drilldown{display:inline-block;width:14px;height:14px;margin-right:10px;border-radius:50%}.marginright-2{margin-right:2%}.margintop-5{margin-top:5%}.width-100{width:100%}.float-right{float:right}.marginBottom-10{margin-bottom:10px}.header-alt{align-items:center;margin-bottom:10px}input::placeholder{font-size:20px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:0px;color:#000;opacity:1}.padding-5{padding:5px}.hidden{visibility:hidden}.font-weight-bold{font-weight:900}.textalign-center{text-align:center}.cursor-pointer{cursor:pointer}.cursor-default{cursor:default}.font-weight-600{font-weight:600}.marginRight-15{margin-right:15px}.marginRight-20{margin-right:20px}.switch{position:relative;display:inline-block;width:46px;height:24px;margin-left:5px;margin-right:5px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#2d5ca0;-webkit-transition:.4s;transition:.4s}.slider:before{position:absolute;content:\"\";height:18px;width:18px;right:3px;bottom:3px;background-color:#fff;-webkit-transition:.4s;transition:.4s}.slider.round{border-radius:18px}.slider.round:before{border-radius:50%}.slider1{position:absolute;cursor:pointer;inset:0;background-color:#015ba2cf;-webkit-transition:.4s;transition:.4s}.slider1:before{position:absolute;content:\"\";height:18px;width:18px;left:3px;bottom:3px;background-color:#fff;-webkit-transition:.4s;transition:.4s}.slider1.round1{border-radius:18px}.slider1.round1:before{border-radius:50%}.lib-display-flex{display:flex}.lib-align-items-center{align-items:center}.lib-flex-direction-column{flex-direction:column}.lib-justify-content-space-between{justify-content:space-between}.lib-justify-content-space-around{justify-content:space-around}.lib-justify-content-center{justify-content:center}.lib-justify-content-start{justify-content:start}.lib-justify-content-end{justify-content:end}.lib-ml-20{margin-left:20px}.lib-position-absolute{position:absolute}.lib-z-index-9{z-index:9}.marginright-3{margin-right:3px}@media (min-height: 900px){.lib-chart-wrapper{border-radius:8px}.header-font-size-1{font-size:18px!important}.font-size-1{font-size:14px!important}.font-size-2{font-size:16px!important}.font-size-3{font-size:14px!important}.font-size-4{font-size:22px!important}.font-size-5{font-size:24px!important}}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ResizedDirective, selector: "[resized]", outputs: ["resized"] }, { kind: "component", type: i3.ChartHeaderV1Component, selector: "lib-chart-header-v1", inputs: ["isAlertEnabled", "title", "menuOptions", "isEditEnabled", "isria", "hasDrillDown", "selectedKpiTooltop"], outputs: ["menuOptionClickEvent"] }, { kind: "component", type: i4.ChartHeaderV2Component, selector: "lib-chart-header-v2", inputs: ["chartData", "chartConfiguration"], outputs: ["clickEvent", "zoomInZoomOutClick"] }, { kind: "component", type: i5.ChartHeaderV3Component, selector: "lib-chart-header-v3", inputs: ["chartData", "chartConfiguration"], outputs: ["compareByFilterSelection", "zoomInZoomOutClick"] }, { kind: "pipe", type: i1.KeyValuePipe, name: "keyvalue" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
2368
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: HorizontalGroupedBarWithScrollZoomComponent, selector: "lib-horizontal-grouped-bar-with-scroll-zoom", inputs: { chartData: "chartData", customChartConfiguration: "customChartConfiguration" }, outputs: { clickEvent: "clickEvent", headerMenuclickEvent: "headerMenuclickEvent" }, viewQueries: [{ propertyName: "containerElt", first: true, predicate: ["groupchartcontainer"], descendants: true, static: true }, { propertyName: "groupcontainerElt", first: true, predicate: ["groupcontainer"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<div\r\n #groupcontainer\r\n class=\"lib-chart-wrapper\"\r\n [ngClass]=\"{ 'lib-no-background': isTransparentBackground }\"\r\n style=\"background-color: var(--card-bg);\"\r\n (resized)=\"onResized($event)\"\r\n>\r\n <div class=\"header-alt\" *ngIf=\"!isHeaderVisible\">\r\n <lib-chart-header-v2\r\n [chartData]=\"chartData\"\r\n [chartConfiguration]=\"chartConfiguration\"\r\n (clickEvent)=\"handleClick($event)\"\r\n ></lib-chart-header-v2>\r\n <lib-chart-header-v3\r\n [chartData]=\"chartData\"\r\n [chartConfiguration]=\"chartConfiguration\"\r\n (compareByFilterSelection)=\"handleCompareByFilterSelection($event)\"\r\n (zoomInZoomOutClick)=\"handleZoominZoomoutClick($event)\"\r\n ></lib-chart-header-v3>\r\n </div>\r\n <lib-chart-header-v1\r\n [title]=\"chartData.metaData.title\"\r\n [hasDrillDown]=\"chartData.metaData.hasDrillDown\"\r\n [isEditEnabled]=\"chartData.metaData.isEditEnabled\"\r\n [menuOptions]=\"chartConfiguration.headerMenuOptions\"\r\n [isria]=\"customChartConfiguration.isRia\"\r\n [selectedKpiTooltop]=\"chartConfiguration.selectedKpiTooltop\"\r\n (menuOptionClickEvent)=\"handleHeaderMenuClick($event)\"\r\n [isAlertEnabled]=\"isAlertEnabled\"\r\n *ngIf=\"isHeaderVisible\"\r\n ></lib-chart-header-v1>\r\n <div\r\n *ngIf=\"\r\n chartData &&\r\n chartData.metaData &&\r\n chartConfiguration.legendJustified &&\r\n legendVisible &&\r\n chartConfiguration.legendAtTopRight\r\n \"\r\n class=\"legend-holder-right\"\r\n [style.height]=\"chartConfiguration.footerHeight\"\r\n >\r\n <ul class=\"display-flex\">\r\n <li\r\n class=\"legends-positioning-inline\"\r\n *ngFor=\"let item of chartData.metaData.colors | keyvalue : keepOrder\"\r\n >\r\n <span\r\n class=\"lib-donut-justified-label-icon-drilldown\"\r\n [style.background-color]=\"item.value\"\r\n ></span\r\n ><span>{{ item.key }}</span>\r\n </li>\r\n </ul>\r\n </div>\r\n <div\r\n [style.height]=\"chartConfiguration.svgHeight\"\r\n id=\"groupchartcontainer\"\r\n #groupchartcontainer\r\n class=\"lib-chart-svg\"\r\n ></div>\r\n\r\n\r\n <!-- <div\r\n *ngIf=\"\r\n chartData &&\r\n chartData.metaData &&\r\n chartConfiguration.legendJustified &&\r\n legendVisible &&\r\n !chartConfiguration.legendAtTopRight\r\n \"\r\n class=\"lib-donut-chart-footer\"\r\n [style.height]=\"chartConfiguration.footerHeight\"\r\n >\r\n <ul class=\"lib-donut-justified-label-wrapper\">\r\n <li\r\n class=\"lib-donut-justified-label-item\"\r\n *ngFor=\"let item of chartData.metaData.colors | keyvalue\"\r\n >\r\n <span\r\n class=\"lib-donut-justified-label-icon\"\r\n [style.background-color]=\"item.value\"\r\n ></span\r\n ><span>{{ item.key }}</span>\r\n </li>\r\n </ul>\r\n </div> -->\r\n\r\n\r\n <!-- <div *ngIf=\"chartConfiguration?.isDisplayBarDetailsAtBottom\">\r\n <div\r\n class=\"bar-values lib-display-flex lib-justify-content-center lib-align-items-center\"\r\n *ngFor=\"\r\n let item of chartData.metaData.colors | keyvalue : keepOrder;\r\n let i = index\r\n \">\r\n <div\r\n class=\"bar-name font-size-1\"\r\n *ngIf=\"\r\n chartData.data[0][item.key] &&\r\n i <= chartConfiguration.howmanyBarDetailsToDisplay\r\n \"\r\n >\r\n {{ item.key }}\r\n </div>\r\n <div\r\n class=\"bar-value lib-display-flex lib-align-items-center font-size-1\"\r\n [style.color]=\"\r\n chartConfiguration.barVauleColor ? barVauleColor : item.value\r\n \"\r\n *ngIf=\"\r\n chartData.data[0][item.key] &&\r\n i <= chartConfiguration.howmanyBarDetailsToDisplay\r\n \"\r\n >\r\n {{ chartData.data[0][item.key] }}\r\n </div>\r\n </div>\r\n </div> -->\r\n</div>\r\n", styles: [".lib-axis-group-label{font-size:.85em;font-weight:600;letter-spacing:0px;color:#000;opacity:1}.text-transform-uppercase{text-transform:uppercase!important}.text-transform-capitalize{text-transform:capitalize!important}.legend-holder-right{display:flex;justify-content:flex-end}.display-flex{display:flex}.legends-positioning-inline{display:flex;align-items:center;justify-content:center;margin-right:10px;margin-left:35px;font-size:18px;font-weight:700;letter-spacing:0px;color:#000;opacity:1}.title{background-color:#d9d9d9;height:50px;display:flex;flex-direction:column;justify-content:center;align-items:center;border-radius:3px;line-height:1.3}.title:after{content:\"\";position:absolute;bottom:0;margin-bottom:-10px;left:50%;margin-left:-10px;width:0;height:0;border-top:solid 10px #d3d3d3;border-left:solid 10px transparent;border-right:solid 10px transparent}.title-bar-name{color:var(--font-color)!important;font-size:17px;font-weight:700;text-transform:capitalize}.title-bar-value{color:var(--font-color)!important;font-size:14px}.title-bar-value>span{font-weight:600}.zoomIcons-holder{display:flex;align-items:center}.legends-latest{height:14px;width:14px;display:flex;margin-right:10px}.legend-latest-holder{font-size:12px;display:flex;justify-content:flex-start;align-items:center}.marginRight-30{margin-right:30px}.zoomIcons-holder{display:flex;align-items:center;margin-right:15px}.zoomIcons{border:.5px solid #b6b6b6;cursor:pointer;display:flex;justify-content:center;align-items:center;width:30px;height:30px;color:var(--color)!important}.zoom-active{background-color:#2d5ca0;opacity:1}.zoom-inactive{background-color:#d9d9d9;opacity:.5}.flex-inline{display:flex;justify-content:center;align-items:center;font-size:14px}.marginLeft-20{margin-left:20px}.target-display{font-size:12px;line-height:14.52px;font-weight:700;text-transform:uppercase;float:right}.legend-style{font-weight:600;text-transform:capitalize}.bar-values{margin-top:10px}.bar-name{font-weight:600;margin-right:10px;text-transform:capitalize}.lib-chart-svg{margin-top:10px}.bar-value{height:29px;background-color:#f4f4f4;padding-left:15px;padding-right:15px;border-radius:8px;box-shadow:-2px 2px 10px #0000004d,2px 2px 10px #0000004d;font-weight:600}.mobile-xaxis-override{writing-mode:sideways-lr}.mobile-xaxis-override[style*=\"writing-mode: horizontal-tb\"]{writing-mode:horizontal-tb!important;transform:none!important}g.x1.axis1 g.tick text[style*=\"writing-mode: horizontal-tb\"]{writing-mode:horizontal-tb!important;transform:none!important}@media (min-height: 900px){.legends-latest{height:17px;width:17px}}\n", ".lib-chart-wrapper{width:100%;height:100%;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;background:#fff 0% 0% no-repeat padding-box;position:relative}.lib-chart-wrapper-wo-shadow{width:100%;height:100%;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto}.lib-chart-wrapper:hover .chart-header-v1:not(.header-no-background){background-color:#2e3640}.lib-chart-wrapper:hover .chart-header-v1:not(.header-no-background) .chart-title{color:#fff}.lib-chart-svg{width:100%}.lib-chart-header{text-align:center;background-color:#052340;color:#fff;width:100%;height:17%;word-spacing:.5px;line-height:1.8;font-weight:700;padding-top:2%;letter-spacing:0;font-size:1.2em}.lib-donut-chart-footer{width:100%;text-align:right}.lib-donut-label-text{font-size:.9em;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-weight:400;letter-spacing:0px;color:#000;opacity:1}.lib-donut-label-icon{display:inline-block;width:10px;height:10px;margin-right:20px;border-radius:3px}.lib-donut-label-item{font-weight:400;font-size:.85em;color:#2f2f2f}.lib-donut-justified-label-wrapper{width:100%;display:inline-block;text-align:center;list-style-type:none}.lib-donut-justified-label-item{font-weight:400;font-size:.85em;color:#2f2f2f;display:inline-block;text-align:left;padding:0 10px}.lib-donut-justified-label-icon{display:inline-block;width:10px;height:10px;margin-right:5px;border-radius:3px}.lib-no-background{background:none!important}.lib-display-hidden{display:none}.lib-ylabel-weeklyCharts{font-style:normal;font-variant:normal;font-weight:800;font-size:10px;line-height:12px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:-.07px;text-transform:capitalize;color:#000}.lib-data-labels-weeklycharts{font-style:normal;font-variant:normal;font-weight:400;font-size:12px;line-height:14px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:-.06px;color:#000}.lib-data-labels-angled-weeklycharts{font-style:normal;font-variant:normal;font-weight:800;font-size:9.5px;line-height:11px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:.4px;text-anchor:start}.lib-xaxis-labels-texts-weeklycharts{font-style:normal;font-variant:normal;font-weight:800;font-size:10px;line-height:11px;letter-spacing:-.05px;fill:#000}.lib-xaxis-labels-texts-drilldown{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:14px;letter-spacing:-1px;color:#000;opacity:1;text-transform:capitalize}.lib-white-space-nowrap{white-space:nowrap}.lib-xaxis-labels-texts-drilldown-alt{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:10px;letter-spacing:0px;color:#000;opacity:1;text-transform:capitalize}.lib-yaxis-labels-texts-drilldown{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:14px;letter-spacing:0px;color:#000!important;opacity:1}.lib-ylabel-drilldowncharts,.lib-xlabel-drilldowncharts{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:16px;letter-spacing:-.1px;color:#000!important;opacity:1}.lib-donut-justified-label-icon-drilldown{display:inline-block;width:14px;height:14px;margin-right:10px;border-radius:50%}.marginright-2{margin-right:2%}.margintop-5{margin-top:5%}.width-100{width:100%}.float-right{float:right}.marginBottom-10{margin-bottom:10px}.header-alt{align-items:center;margin-bottom:10px}input::placeholder{font-size:20px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:0px;color:#000;opacity:1}.padding-5{padding:5px}.hidden{visibility:hidden}.font-weight-bold{font-weight:900}.textalign-center{text-align:center}.cursor-pointer{cursor:pointer}.cursor-default{cursor:default}.font-weight-600{font-weight:600}.marginRight-15{margin-right:15px}.marginRight-20{margin-right:20px}.switch{position:relative;display:inline-block;width:46px;height:24px;margin-left:5px;margin-right:5px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#2d5ca0;-webkit-transition:.4s;transition:.4s}.slider:before{position:absolute;content:\"\";height:18px;width:18px;right:3px;bottom:3px;background-color:#fff;-webkit-transition:.4s;transition:.4s}.slider.round{border-radius:18px}.slider.round:before{border-radius:50%}.slider1{position:absolute;cursor:pointer;inset:0;background-color:#015ba2cf;-webkit-transition:.4s;transition:.4s}.slider1:before{position:absolute;content:\"\";height:18px;width:18px;left:3px;bottom:3px;background-color:#fff;-webkit-transition:.4s;transition:.4s}.slider1.round1{border-radius:18px}.slider1.round1:before{border-radius:50%}.lib-display-flex{display:flex}.lib-align-items-center{align-items:center}.lib-flex-direction-column{flex-direction:column}.lib-justify-content-space-between{justify-content:space-between}.lib-justify-content-space-around{justify-content:space-around}.lib-justify-content-center{justify-content:center}.lib-justify-content-start{justify-content:start}.lib-justify-content-end{justify-content:end}.lib-ml-20{margin-left:20px}.lib-position-absolute{position:absolute}.lib-z-index-9{z-index:9}.marginright-3{margin-right:3px}@media (min-height: 900px){.lib-chart-wrapper{border-radius:8px}.header-font-size-1{font-size:18px!important}.font-size-1{font-size:14px!important}.font-size-2{font-size:16px!important}.font-size-3{font-size:14px!important}.font-size-4{font-size:22px!important}.font-size-5{font-size:24px!important}}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ResizedDirective, selector: "[resized]", outputs: ["resized"] }, { kind: "component", type: i3.ChartHeaderV1Component, selector: "lib-chart-header-v1", inputs: ["isAlertEnabled", "title", "menuOptions", "isEditEnabled", "isria", "hasDrillDown", "selectedKpiTooltop"], outputs: ["menuOptionClickEvent"] }, { kind: "component", type: i4.ChartHeaderV2Component, selector: "lib-chart-header-v2", inputs: ["chartData", "chartConfiguration"], outputs: ["clickEvent", "zoomInZoomOutClick"] }, { kind: "component", type: i5.ChartHeaderV3Component, selector: "lib-chart-header-v3", inputs: ["chartData", "chartConfiguration"], outputs: ["compareByFilterSelection", "zoomInZoomOutClick"] }, { kind: "pipe", type: i1.KeyValuePipe, name: "keyvalue" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
2407
2369
|
}
|
|
2408
2370
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HorizontalGroupedBarWithScrollZoomComponent, decorators: [{
|
|
2409
2371
|
type: Component,
|
|
2410
|
-
args: [{ selector: 'lib-horizontal-grouped-bar-with-scroll-zoom', encapsulation: ViewEncapsulation.None, template: "<div\r\n #groupcontainer\r\n class=\"lib-chart-wrapper\"\r\n [ngClass]=\"{ 'lib-no-background': isTransparentBackground }\"\r\n style=\"background-color: var(--card-bg);\"\r\n (resized)=\"onResized($event)\"\r\n>\r\n <div class=\"header-alt\" *ngIf=\"!isHeaderVisible\">\r\n <lib-chart-header-v2\r\n [chartData]=\"chartData\"\r\n [chartConfiguration]=\"chartConfiguration\"\r\n (clickEvent)=\"handleClick($event)\"\r\n ></lib-chart-header-v2>\r\n <lib-chart-header-v3\r\n [chartData]=\"chartData\"\r\n [chartConfiguration]=\"chartConfiguration\"\r\n (compareByFilterSelection)=\"handleCompareByFilterSelection($event)\"\r\n (zoomInZoomOutClick)=\"handleZoominZoomoutClick($event)\"\r\n ></lib-chart-header-v3>\r\n </div>\r\n <lib-chart-header-v1\r\n [title]=\"chartData.metaData.title\"\r\n [hasDrillDown]=\"chartData.metaData.hasDrillDown\"\r\n [isEditEnabled]=\"chartData.metaData.isEditEnabled\"\r\n [menuOptions]=\"chartConfiguration.headerMenuOptions\"\r\n [isria]=\"customChartConfiguration.isRia\"\r\n [selectedKpiTooltop]=\"chartConfiguration.selectedKpiTooltop\"\r\n (menuOptionClickEvent)=\"handleHeaderMenuClick($event)\"\r\n [isAlertEnabled]=\"isAlertEnabled\"\r\n *ngIf=\"isHeaderVisible\"\r\n ></lib-chart-header-v1>\r\n <div\r\n *ngIf=\"\r\n chartData &&\r\n chartData.metaData &&\r\n chartConfiguration.legendJustified &&\r\n legendVisible &&\r\n chartConfiguration.legendAtTopRight\r\n \"\r\n class=\"legend-holder-right\"\r\n [style.height]=\"chartConfiguration.footerHeight\"\r\n >\r\n <ul class=\"display-flex\">\r\n <li\r\n class=\"legends-positioning-inline\"\r\n *ngFor=\"let item of chartData.metaData.colors | keyvalue : keepOrder\"\r\n >\r\n <span\r\n class=\"lib-donut-justified-label-icon-drilldown\"\r\n [style.background-color]=\"item.value\"\r\n ></span\r\n ><span>{{ item.key }}</span>\r\n </li>\r\n </ul>\r\n </div>\r\n <div\r\n [style.height]=\"chartConfiguration.svgHeight\"\r\n id=\"groupchartcontainer\"\r\n #groupchartcontainer\r\n class=\"lib-chart-svg\"\r\n ></div>\r\n\r\n\r\n <!-- <div\r\n *ngIf=\"\r\n chartData &&\r\n chartData.metaData &&\r\n chartConfiguration.legendJustified &&\r\n legendVisible &&\r\n !chartConfiguration.legendAtTopRight\r\n \"\r\n class=\"lib-donut-chart-footer\"\r\n [style.height]=\"chartConfiguration.footerHeight\"\r\n >\r\n <ul class=\"lib-donut-justified-label-wrapper\">\r\n <li\r\n class=\"lib-donut-justified-label-item\"\r\n *ngFor=\"let item of chartData.metaData.colors | keyvalue\"\r\n >\r\n <span\r\n class=\"lib-donut-justified-label-icon\"\r\n [style.background-color]=\"item.value\"\r\n ></span\r\n ><span>{{ item.key }}</span>\r\n </li>\r\n </ul>\r\n </div> -->\r\n\r\n\r\n <!-- <div *ngIf=\"chartConfiguration?.isDisplayBarDetailsAtBottom\">\r\n <div\r\n class=\"bar-values lib-display-flex lib-justify-content-center lib-align-items-center\"\r\n *ngFor=\"\r\n let item of chartData.metaData.colors | keyvalue : keepOrder;\r\n let i = index\r\n \">\r\n <div\r\n class=\"bar-name font-size-1\"\r\n *ngIf=\"\r\n chartData.data[0][item.key] &&\r\n i <= chartConfiguration.howmanyBarDetailsToDisplay\r\n \"\r\n >\r\n {{ item.key }}\r\n </div>\r\n <div\r\n class=\"bar-value lib-display-flex lib-align-items-center font-size-1\"\r\n [style.color]=\"\r\n chartConfiguration.barVauleColor ? barVauleColor : item.value\r\n \"\r\n *ngIf=\"\r\n chartData.data[0][item.key] &&\r\n i <= chartConfiguration.howmanyBarDetailsToDisplay\r\n \"\r\n >\r\n {{ chartData.data[0][item.key] }}\r\n </div>\r\n </div>\r\n </div> -->\r\n</div>\r\n", styles: [".lib-axis-group-label{font-size:.85em;font-weight:600;letter-spacing:0px;color:#000;opacity:1}.text-transform-uppercase{text-transform:uppercase!important}.text-transform-capitalize{text-transform:capitalize!important}.legend-holder-right{display:flex;justify-content:flex-end}.display-flex{display:flex}.legends-positioning-inline{display:flex;align-items:center;justify-content:center;margin-right:10px;margin-left:35px;font-size:18px;font-weight:700;letter-spacing:0px;color:#000;opacity:1}.title{background-color:#d9d9d9;height:50px;display:flex;flex-direction:column;justify-content:center;align-items:center;border-radius:3px;line-height:1.3}.title:after{content:\"\";position:absolute;bottom:0;margin-bottom:-10px;left:50%;margin-left:-10px;width:0;height:0;border-top:solid 10px #d3d3d3;border-left:solid 10px transparent;border-right:solid 10px transparent}.title-bar-name{color:var(--font-color)!important;font-size:17px;font-weight:700;text-transform:capitalize}.title-bar-value{color:var(--font-color)!important;font-size:14px}.title-bar-value>span{font-weight:600}.zoomIcons-holder{display:flex;align-items:center}.legends-latest{height:14px;width:14px;display:flex;margin-right:10px}.legend-latest-holder{font-size:12px;display:flex;justify-content:flex-start;align-items:center}.marginRight-30{margin-right:30px}.zoomIcons-holder{display:flex;align-items:center;margin-right:15px}.zoomIcons{border:.5px solid #b6b6b6;cursor:pointer;display:flex;justify-content:center;align-items:center;width:30px;height:30px;color:var(--color)!important}.zoom-active{background-color:#2d5ca0;opacity:1}.zoom-inactive{background-color:#d9d9d9;opacity:.5}.flex-inline{display:flex;justify-content:center;align-items:center;font-size:14px}.marginLeft-20{margin-left:20px}.target-display{font-size:12px;line-height:14.52px;font-weight:700;text-transform:uppercase;float:right}.legend-style{font-weight:600;text-transform:capitalize}.bar-values{margin-top:10px}.bar-name{font-weight:600;margin-right:10px;text-transform:capitalize}.lib-chart-svg{margin-top:10px}.bar-value{height:29px;background-color:#f4f4f4;padding-left:15px;padding-right:15px;border-radius:8px;box-shadow:-2px 2px 10px #0000004d,2px 2px 10px #0000004d;font-weight:600}.mobile-xaxis-override{writing-mode:sideways-lr}@media (min-height: 900px){.legends-latest{height:17px;width:17px}}.outer-container{position:relative;width:100%;overflow:visible}.inner-container{width:100%;overflow-x:hidden;position:relative}.inner-container.scroll-enabled{overflow-x:auto;-webkit-overflow-scrolling:touch;background:linear-gradient(to right,#fff 30%,#fff0),linear-gradient(to left,#fff 30%,#fff0) 100% 0,radial-gradient(farthest-side at 0 50%,#0000001f,#0000),radial-gradient(farthest-side at 100% 50%,#0000001f,#0000) 100% 0;background-repeat:no-repeat;background-color:#fff;background-size:40px 100%,40px 100%,14px 100%,14px 100%;background-attachment:local,local,scroll,scroll}.inner-container.scroll-enabled::-webkit-scrollbar{height:8px}.inner-container.scroll-enabled::-webkit-scrollbar-track{background:#f1f1f1;border-radius:4px}.inner-container.scroll-enabled::-webkit-scrollbar-thumb{background:#888;border-radius:4px}\n", ".lib-chart-wrapper{width:100%;height:100%;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;background:#fff 0% 0% no-repeat padding-box;position:relative}.lib-chart-wrapper-wo-shadow{width:100%;height:100%;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto}.lib-chart-wrapper:hover .chart-header-v1:not(.header-no-background){background-color:#2e3640}.lib-chart-wrapper:hover .chart-header-v1:not(.header-no-background) .chart-title{color:#fff}.lib-chart-svg{width:100%}.lib-chart-header{text-align:center;background-color:#052340;color:#fff;width:100%;height:17%;word-spacing:.5px;line-height:1.8;font-weight:700;padding-top:2%;letter-spacing:0;font-size:1.2em}.lib-donut-chart-footer{width:100%;text-align:right}.lib-donut-label-text{font-size:.9em;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-weight:400;letter-spacing:0px;color:#000;opacity:1}.lib-donut-label-icon{display:inline-block;width:10px;height:10px;margin-right:20px;border-radius:3px}.lib-donut-label-item{font-weight:400;font-size:.85em;color:#2f2f2f}.lib-donut-justified-label-wrapper{width:100%;display:inline-block;text-align:center;list-style-type:none}.lib-donut-justified-label-item{font-weight:400;font-size:.85em;color:#2f2f2f;display:inline-block;text-align:left;padding:0 10px}.lib-donut-justified-label-icon{display:inline-block;width:10px;height:10px;margin-right:5px;border-radius:3px}.lib-no-background{background:none!important}.lib-display-hidden{display:none}.lib-ylabel-weeklyCharts{font-style:normal;font-variant:normal;font-weight:800;font-size:10px;line-height:12px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:-.07px;text-transform:capitalize;color:#000}.lib-data-labels-weeklycharts{font-style:normal;font-variant:normal;font-weight:400;font-size:12px;line-height:14px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:-.06px;color:#000}.lib-data-labels-angled-weeklycharts{font-style:normal;font-variant:normal;font-weight:800;font-size:9.5px;line-height:11px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:.4px;text-anchor:start}.lib-xaxis-labels-texts-weeklycharts{font-style:normal;font-variant:normal;font-weight:800;font-size:10px;line-height:11px;letter-spacing:-.05px;fill:#000}.lib-xaxis-labels-texts-drilldown{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:14px;letter-spacing:-1px;color:#000;opacity:1;text-transform:capitalize}.lib-white-space-nowrap{white-space:nowrap}.lib-xaxis-labels-texts-drilldown-alt{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:10px;letter-spacing:0px;color:#000;opacity:1;text-transform:capitalize}.lib-yaxis-labels-texts-drilldown{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:14px;letter-spacing:0px;color:#000!important;opacity:1}.lib-ylabel-drilldowncharts,.lib-xlabel-drilldowncharts{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:16px;letter-spacing:-.1px;color:#000!important;opacity:1}.lib-donut-justified-label-icon-drilldown{display:inline-block;width:14px;height:14px;margin-right:10px;border-radius:50%}.marginright-2{margin-right:2%}.margintop-5{margin-top:5%}.width-100{width:100%}.float-right{float:right}.marginBottom-10{margin-bottom:10px}.header-alt{align-items:center;margin-bottom:10px}input::placeholder{font-size:20px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:0px;color:#000;opacity:1}.padding-5{padding:5px}.hidden{visibility:hidden}.font-weight-bold{font-weight:900}.textalign-center{text-align:center}.cursor-pointer{cursor:pointer}.cursor-default{cursor:default}.font-weight-600{font-weight:600}.marginRight-15{margin-right:15px}.marginRight-20{margin-right:20px}.switch{position:relative;display:inline-block;width:46px;height:24px;margin-left:5px;margin-right:5px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#2d5ca0;-webkit-transition:.4s;transition:.4s}.slider:before{position:absolute;content:\"\";height:18px;width:18px;right:3px;bottom:3px;background-color:#fff;-webkit-transition:.4s;transition:.4s}.slider.round{border-radius:18px}.slider.round:before{border-radius:50%}.slider1{position:absolute;cursor:pointer;inset:0;background-color:#015ba2cf;-webkit-transition:.4s;transition:.4s}.slider1:before{position:absolute;content:\"\";height:18px;width:18px;left:3px;bottom:3px;background-color:#fff;-webkit-transition:.4s;transition:.4s}.slider1.round1{border-radius:18px}.slider1.round1:before{border-radius:50%}.lib-display-flex{display:flex}.lib-align-items-center{align-items:center}.lib-flex-direction-column{flex-direction:column}.lib-justify-content-space-between{justify-content:space-between}.lib-justify-content-space-around{justify-content:space-around}.lib-justify-content-center{justify-content:center}.lib-justify-content-start{justify-content:start}.lib-justify-content-end{justify-content:end}.lib-ml-20{margin-left:20px}.lib-position-absolute{position:absolute}.lib-z-index-9{z-index:9}.marginright-3{margin-right:3px}@media (min-height: 900px){.lib-chart-wrapper{border-radius:8px}.header-font-size-1{font-size:18px!important}.font-size-1{font-size:14px!important}.font-size-2{font-size:16px!important}.font-size-3{font-size:14px!important}.font-size-4{font-size:22px!important}.font-size-5{font-size:24px!important}}\n"] }]
|
|
2372
|
+
args: [{ selector: 'lib-horizontal-grouped-bar-with-scroll-zoom', encapsulation: ViewEncapsulation.None, template: "<div\r\n #groupcontainer\r\n class=\"lib-chart-wrapper\"\r\n [ngClass]=\"{ 'lib-no-background': isTransparentBackground }\"\r\n style=\"background-color: var(--card-bg);\"\r\n (resized)=\"onResized($event)\"\r\n>\r\n <div class=\"header-alt\" *ngIf=\"!isHeaderVisible\">\r\n <lib-chart-header-v2\r\n [chartData]=\"chartData\"\r\n [chartConfiguration]=\"chartConfiguration\"\r\n (clickEvent)=\"handleClick($event)\"\r\n ></lib-chart-header-v2>\r\n <lib-chart-header-v3\r\n [chartData]=\"chartData\"\r\n [chartConfiguration]=\"chartConfiguration\"\r\n (compareByFilterSelection)=\"handleCompareByFilterSelection($event)\"\r\n (zoomInZoomOutClick)=\"handleZoominZoomoutClick($event)\"\r\n ></lib-chart-header-v3>\r\n </div>\r\n <lib-chart-header-v1\r\n [title]=\"chartData.metaData.title\"\r\n [hasDrillDown]=\"chartData.metaData.hasDrillDown\"\r\n [isEditEnabled]=\"chartData.metaData.isEditEnabled\"\r\n [menuOptions]=\"chartConfiguration.headerMenuOptions\"\r\n [isria]=\"customChartConfiguration.isRia\"\r\n [selectedKpiTooltop]=\"chartConfiguration.selectedKpiTooltop\"\r\n (menuOptionClickEvent)=\"handleHeaderMenuClick($event)\"\r\n [isAlertEnabled]=\"isAlertEnabled\"\r\n *ngIf=\"isHeaderVisible\"\r\n ></lib-chart-header-v1>\r\n <div\r\n *ngIf=\"\r\n chartData &&\r\n chartData.metaData &&\r\n chartConfiguration.legendJustified &&\r\n legendVisible &&\r\n chartConfiguration.legendAtTopRight\r\n \"\r\n class=\"legend-holder-right\"\r\n [style.height]=\"chartConfiguration.footerHeight\"\r\n >\r\n <ul class=\"display-flex\">\r\n <li\r\n class=\"legends-positioning-inline\"\r\n *ngFor=\"let item of chartData.metaData.colors | keyvalue : keepOrder\"\r\n >\r\n <span\r\n class=\"lib-donut-justified-label-icon-drilldown\"\r\n [style.background-color]=\"item.value\"\r\n ></span\r\n ><span>{{ item.key }}</span>\r\n </li>\r\n </ul>\r\n </div>\r\n <div\r\n [style.height]=\"chartConfiguration.svgHeight\"\r\n id=\"groupchartcontainer\"\r\n #groupchartcontainer\r\n class=\"lib-chart-svg\"\r\n ></div>\r\n\r\n\r\n <!-- <div\r\n *ngIf=\"\r\n chartData &&\r\n chartData.metaData &&\r\n chartConfiguration.legendJustified &&\r\n legendVisible &&\r\n !chartConfiguration.legendAtTopRight\r\n \"\r\n class=\"lib-donut-chart-footer\"\r\n [style.height]=\"chartConfiguration.footerHeight\"\r\n >\r\n <ul class=\"lib-donut-justified-label-wrapper\">\r\n <li\r\n class=\"lib-donut-justified-label-item\"\r\n *ngFor=\"let item of chartData.metaData.colors | keyvalue\"\r\n >\r\n <span\r\n class=\"lib-donut-justified-label-icon\"\r\n [style.background-color]=\"item.value\"\r\n ></span\r\n ><span>{{ item.key }}</span>\r\n </li>\r\n </ul>\r\n </div> -->\r\n\r\n\r\n <!-- <div *ngIf=\"chartConfiguration?.isDisplayBarDetailsAtBottom\">\r\n <div\r\n class=\"bar-values lib-display-flex lib-justify-content-center lib-align-items-center\"\r\n *ngFor=\"\r\n let item of chartData.metaData.colors | keyvalue : keepOrder;\r\n let i = index\r\n \">\r\n <div\r\n class=\"bar-name font-size-1\"\r\n *ngIf=\"\r\n chartData.data[0][item.key] &&\r\n i <= chartConfiguration.howmanyBarDetailsToDisplay\r\n \"\r\n >\r\n {{ item.key }}\r\n </div>\r\n <div\r\n class=\"bar-value lib-display-flex lib-align-items-center font-size-1\"\r\n [style.color]=\"\r\n chartConfiguration.barVauleColor ? barVauleColor : item.value\r\n \"\r\n *ngIf=\"\r\n chartData.data[0][item.key] &&\r\n i <= chartConfiguration.howmanyBarDetailsToDisplay\r\n \"\r\n >\r\n {{ chartData.data[0][item.key] }}\r\n </div>\r\n </div>\r\n </div> -->\r\n</div>\r\n", styles: [".lib-axis-group-label{font-size:.85em;font-weight:600;letter-spacing:0px;color:#000;opacity:1}.text-transform-uppercase{text-transform:uppercase!important}.text-transform-capitalize{text-transform:capitalize!important}.legend-holder-right{display:flex;justify-content:flex-end}.display-flex{display:flex}.legends-positioning-inline{display:flex;align-items:center;justify-content:center;margin-right:10px;margin-left:35px;font-size:18px;font-weight:700;letter-spacing:0px;color:#000;opacity:1}.title{background-color:#d9d9d9;height:50px;display:flex;flex-direction:column;justify-content:center;align-items:center;border-radius:3px;line-height:1.3}.title:after{content:\"\";position:absolute;bottom:0;margin-bottom:-10px;left:50%;margin-left:-10px;width:0;height:0;border-top:solid 10px #d3d3d3;border-left:solid 10px transparent;border-right:solid 10px transparent}.title-bar-name{color:var(--font-color)!important;font-size:17px;font-weight:700;text-transform:capitalize}.title-bar-value{color:var(--font-color)!important;font-size:14px}.title-bar-value>span{font-weight:600}.zoomIcons-holder{display:flex;align-items:center}.legends-latest{height:14px;width:14px;display:flex;margin-right:10px}.legend-latest-holder{font-size:12px;display:flex;justify-content:flex-start;align-items:center}.marginRight-30{margin-right:30px}.zoomIcons-holder{display:flex;align-items:center;margin-right:15px}.zoomIcons{border:.5px solid #b6b6b6;cursor:pointer;display:flex;justify-content:center;align-items:center;width:30px;height:30px;color:var(--color)!important}.zoom-active{background-color:#2d5ca0;opacity:1}.zoom-inactive{background-color:#d9d9d9;opacity:.5}.flex-inline{display:flex;justify-content:center;align-items:center;font-size:14px}.marginLeft-20{margin-left:20px}.target-display{font-size:12px;line-height:14.52px;font-weight:700;text-transform:uppercase;float:right}.legend-style{font-weight:600;text-transform:capitalize}.bar-values{margin-top:10px}.bar-name{font-weight:600;margin-right:10px;text-transform:capitalize}.lib-chart-svg{margin-top:10px}.bar-value{height:29px;background-color:#f4f4f4;padding-left:15px;padding-right:15px;border-radius:8px;box-shadow:-2px 2px 10px #0000004d,2px 2px 10px #0000004d;font-weight:600}.mobile-xaxis-override{writing-mode:sideways-lr}.mobile-xaxis-override[style*=\"writing-mode: horizontal-tb\"]{writing-mode:horizontal-tb!important;transform:none!important}g.x1.axis1 g.tick text[style*=\"writing-mode: horizontal-tb\"]{writing-mode:horizontal-tb!important;transform:none!important}@media (min-height: 900px){.legends-latest{height:17px;width:17px}}\n", ".lib-chart-wrapper{width:100%;height:100%;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;background:#fff 0% 0% no-repeat padding-box;position:relative}.lib-chart-wrapper-wo-shadow{width:100%;height:100%;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto}.lib-chart-wrapper:hover .chart-header-v1:not(.header-no-background){background-color:#2e3640}.lib-chart-wrapper:hover .chart-header-v1:not(.header-no-background) .chart-title{color:#fff}.lib-chart-svg{width:100%}.lib-chart-header{text-align:center;background-color:#052340;color:#fff;width:100%;height:17%;word-spacing:.5px;line-height:1.8;font-weight:700;padding-top:2%;letter-spacing:0;font-size:1.2em}.lib-donut-chart-footer{width:100%;text-align:right}.lib-donut-label-text{font-size:.9em;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-weight:400;letter-spacing:0px;color:#000;opacity:1}.lib-donut-label-icon{display:inline-block;width:10px;height:10px;margin-right:20px;border-radius:3px}.lib-donut-label-item{font-weight:400;font-size:.85em;color:#2f2f2f}.lib-donut-justified-label-wrapper{width:100%;display:inline-block;text-align:center;list-style-type:none}.lib-donut-justified-label-item{font-weight:400;font-size:.85em;color:#2f2f2f;display:inline-block;text-align:left;padding:0 10px}.lib-donut-justified-label-icon{display:inline-block;width:10px;height:10px;margin-right:5px;border-radius:3px}.lib-no-background{background:none!important}.lib-display-hidden{display:none}.lib-ylabel-weeklyCharts{font-style:normal;font-variant:normal;font-weight:800;font-size:10px;line-height:12px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:-.07px;text-transform:capitalize;color:#000}.lib-data-labels-weeklycharts{font-style:normal;font-variant:normal;font-weight:400;font-size:12px;line-height:14px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:-.06px;color:#000}.lib-data-labels-angled-weeklycharts{font-style:normal;font-variant:normal;font-weight:800;font-size:9.5px;line-height:11px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:.4px;text-anchor:start}.lib-xaxis-labels-texts-weeklycharts{font-style:normal;font-variant:normal;font-weight:800;font-size:10px;line-height:11px;letter-spacing:-.05px;fill:#000}.lib-xaxis-labels-texts-drilldown{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:14px;letter-spacing:-1px;color:#000;opacity:1;text-transform:capitalize}.lib-white-space-nowrap{white-space:nowrap}.lib-xaxis-labels-texts-drilldown-alt{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:10px;letter-spacing:0px;color:#000;opacity:1;text-transform:capitalize}.lib-yaxis-labels-texts-drilldown{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:14px;letter-spacing:0px;color:#000!important;opacity:1}.lib-ylabel-drilldowncharts,.lib-xlabel-drilldowncharts{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;font-size:16px;letter-spacing:-.1px;color:#000!important;opacity:1}.lib-donut-justified-label-icon-drilldown{display:inline-block;width:14px;height:14px;margin-right:10px;border-radius:50%}.marginright-2{margin-right:2%}.margintop-5{margin-top:5%}.width-100{width:100%}.float-right{float:right}.marginBottom-10{margin-bottom:10px}.header-alt{align-items:center;margin-bottom:10px}input::placeholder{font-size:20px;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto;letter-spacing:0px;color:#000;opacity:1}.padding-5{padding:5px}.hidden{visibility:hidden}.font-weight-bold{font-weight:900}.textalign-center{text-align:center}.cursor-pointer{cursor:pointer}.cursor-default{cursor:default}.font-weight-600{font-weight:600}.marginRight-15{margin-right:15px}.marginRight-20{margin-right:20px}.switch{position:relative;display:inline-block;width:46px;height:24px;margin-left:5px;margin-right:5px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#2d5ca0;-webkit-transition:.4s;transition:.4s}.slider:before{position:absolute;content:\"\";height:18px;width:18px;right:3px;bottom:3px;background-color:#fff;-webkit-transition:.4s;transition:.4s}.slider.round{border-radius:18px}.slider.round:before{border-radius:50%}.slider1{position:absolute;cursor:pointer;inset:0;background-color:#015ba2cf;-webkit-transition:.4s;transition:.4s}.slider1:before{position:absolute;content:\"\";height:18px;width:18px;left:3px;bottom:3px;background-color:#fff;-webkit-transition:.4s;transition:.4s}.slider1.round1{border-radius:18px}.slider1.round1:before{border-radius:50%}.lib-display-flex{display:flex}.lib-align-items-center{align-items:center}.lib-flex-direction-column{flex-direction:column}.lib-justify-content-space-between{justify-content:space-between}.lib-justify-content-space-around{justify-content:space-around}.lib-justify-content-center{justify-content:center}.lib-justify-content-start{justify-content:start}.lib-justify-content-end{justify-content:end}.lib-ml-20{margin-left:20px}.lib-position-absolute{position:absolute}.lib-z-index-9{z-index:9}.marginright-3{margin-right:3px}@media (min-height: 900px){.lib-chart-wrapper{border-radius:8px}.header-font-size-1{font-size:18px!important}.font-size-1{font-size:14px!important}.font-size-2{font-size:16px!important}.font-size-3{font-size:14px!important}.font-size-4{font-size:22px!important}.font-size-5{font-size:24px!important}}\n"] }]
|
|
2411
2373
|
}], ctorParameters: () => [], propDecorators: { containerElt: [{
|
|
2412
2374
|
type: ViewChild,
|
|
2413
2375
|
args: ['groupchartcontainer', { static: true }]
|
|
@@ -2423,4 +2385,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
2423
2385
|
}], headerMenuclickEvent: [{
|
|
2424
2386
|
type: Output
|
|
2425
2387
|
}] } });
|
|
2426
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9yaXpvbnRhbC1ncm91cGVkLWJhci13aXRoLXNjcm9sbC16b29tLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2F4aWRpby1zdHlsZWd1aWRlLWxpYnJhcnkvc3JjL2xpYi9ob3Jpem9udGFsLWdyb3VwZWQtYmFyLXdpdGgtc2Nyb2xsLXpvb20vaG9yaXpvbnRhbC1ncm91cGVkLWJhci13aXRoLXNjcm9sbC16b29tLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2F4aWRpby1zdHlsZWd1aWRlLWxpYnJhcnkvc3JjL2xpYi9ob3Jpem9udGFsLWdyb3VwZWQtYmFyLXdpdGgtc2Nyb2xsLXpvb20vaG9yaXpvbnRhbC1ncm91cGVkLWJhci13aXRoLXNjcm9sbC16b29tLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsU0FBUyxFQUVULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDakQsT0FBTyxXQUFXLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFFekIsT0FBTyxrQkFBa0IsTUFBTSxrQkFBa0IsQ0FBQzs7Ozs7OztBQVdsRCxNQUFNLE9BQU8sMkNBQ1gsU0FBUSxpQkFBaUI7SUF5RXpCO1FBQ0UsS0FBSyxFQUFFLENBQUM7UUEvREEsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDckMseUJBQW9CLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUN6RCxvQkFBZSxHQUFZLElBQUksQ0FBQztRQUNoQyxrQkFBYSxHQUFZLElBQUksQ0FBQztRQUM5Qiw0QkFBdUIsR0FBWSxLQUFLLENBQUM7UUFD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SSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFDRCxxQkFBcUIsQ0FBQyxFQUFFO1FBQ3RCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUNELGNBQWMsQ0FBQyxLQUFLO1FBQ2xCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLENBQUM7SUFDRCxjQUFjLENBQUMsS0FBSztRQUNsQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUN6QixDQUFDO0lBQ0QsOEJBQThCLENBQUMsS0FBSztRQUNsQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixDQUFDOytHQWxtRlUsMkNBQTJDO21HQUEzQywyQ0FBMkMsZ2hCQ3pCeEQsazdIQXdIQTs7NEZEL0ZhLDJDQUEyQztrQkFUdkQsU0FBUzsrQkFDRSw2Q0FBNkMsaUJBTXhDLGlCQUFpQixDQUFDLElBQUk7d0RBT3JDLFlBQVk7c0JBRFgsU0FBUzt1QkFBQyxxQkFBcUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSWxELGlCQUFpQjtzQkFEaEIsU0FBUzt1QkFBQyxnQkFBZ0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBR3BDLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csd0JBQXdCO3NCQUFoQyxLQUFLO2dCQUNJLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgT25Jbml0LFxyXG4gIFZpZXdDaGlsZCxcclxuICBFbGVtZW50UmVmLFxyXG4gIElucHV0LFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgVmlld0VuY2Fwc3VsYXRpb24sXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbXBvbmVudFVuaXF1ZUlkIH0gZnJvbSAnLi4vdW5pcXVlLWlkJztcclxuaW1wb3J0IENoYXJ0SGVscGVyIGZyb20gJy4uL2NoYXJ0LWhlbHBlcic7XHJcbmltcG9ydCAqIGFzIGQzIGZyb20gJ2QzJztcclxuaW1wb3J0IHsgUmVzaXplZEV2ZW50IH0gZnJvbSAnYW5ndWxhci1yZXNpemUtZXZlbnQnO1xyXG5pbXBvcnQgSGVhZGVyQ29uZmlnSGVscGVyIGZyb20gJy4uL2hlYWRlci1jb25maWcnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItaG9yaXpvbnRhbC1ncm91cGVkLWJhci13aXRoLXNjcm9sbC16b29tJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vaG9yaXpvbnRhbC1ncm91cGVkLWJhci13aXRoLXNjcm9sbC16b29tLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFtcclxuICAgICcuL2hvcml6b250YWwtZ3JvdXBlZC1iYXItd2l0aC1zY3JvbGwtem9vbS5jb21wb25lbnQubGVzcycsXHJcbiAgICAnLi4vY29tbW9uLXN0eWxlcy5sZXNzJyxcclxuICBdLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBIb3Jpem9udGFsR3JvdXBlZEJhcldpdGhTY3JvbGxab29tQ29tcG9uZW50XHJcbiAgZXh0ZW5kcyBDb21wb25lbnRVbmlxdWVJZFxyXG4gIGltcGxlbWVudHMgT25Jbml0XHJcbntcclxuICBAVmlld0NoaWxkKCdncm91cGNoYXJ0Y29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUgfSlcclxuICBjb250YWluZXJFbHQhOiBFbGVtZW50UmVmO1xyXG5cclxuICBAVmlld0NoaWxkKCdncm91cGNvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pXHJcbiAgZ3JvdXBjb250YWluZXJFbHQhOiBFbGVtZW50UmVmO1xyXG5cclxuICBASW5wdXQoKSBjaGFydERhdGE6IGFueTtcclxuICBASW5wdXQoKSBjdXN0b21DaGFydENvbmZpZ3VyYXRpb246IGFueTtcclxuICBAT3V0cHV0KCkgY2xpY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBoZWFkZXJNZW51Y2xpY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIGlzSGVhZGVyVmlzaWJsZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgbGVnZW5kVmlzaWJsZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgaXNUcmFuc3BhcmVudEJhY2tncm91bmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBjaGFydENvbmZpZ3VyYXRpb246IGFueSA9IHt9O1xyXG4gIG9iamVjdEtleXMgPSBPYmplY3Qua2V5cztcclxuXHJcbiAgZGVmYXVsdENvbmZpZ3VyYXRpb246IGFueSA9IHtcclxuICAgIG1hcmdpbjogeyB0b3A6IDIwLCByaWdodDogMjAsIGJvdHRvbTogMjAsIGxlZnQ6IDQwIH0sXHJcbiAgICBsYWJlbEZvcm1hdHRlcjogQ2hhcnRIZWxwZXIuZGVmYXVsdEZvcm1hdHRlcixcclxuICAgIHN2Z0hlaWdodDogNzAsXHJcbiAgICBudW1iZXJPZllUaWNrczogNSxcclxuICAgIGxlZ2VuZEp1c3RpZmllZDogdHJ1ZSxcclxuICAgIHlMaW5lQXhpc0xhYmVsRm9tYXR0ZXI6IENoYXJ0SGVscGVyLmRlZmF1bHRGb3JtYXR0ZXIsXHJcbiAgICB5QXhpc0xhYmVsRm9tYXR0ZXI6IENoYXJ0SGVscGVyLmRlZmF1bHRGb3JtYXR0ZXIsXHJcbiAgICBsaW5lR3JhcGhDb2xvcjogJyNGNkQyODMnLFxyXG4gICAgc2hvd0xpbmVDaGFydEF4aXM6IHRydWUsXHJcbiAgICBzaG93VmFsdWVzOiB0cnVlLFxyXG4gICAgaGVhZGVyTWVudU9wdGlvbnM6IEhlYWRlckNvbmZpZ0hlbHBlci5oZWFkZXJDb25maWcuaGVhZGVyTWVudU9wdGlvbnMsXHJcbiAgICB4QXhpc0dyaWQ6IHVuZGVmaW5lZCxcclxuICAgIHlBeGlzR3JpZDogZmFsc2UsXHJcbiAgICBsZWdlbmRWaXNpYmxlOiBmYWxzZSxcclxuICAgIGlzSGVhZGVyVmlzaWJsZTogdW5kZWZpbmVkLFxyXG4gICAgaXNUcmFuc3BhcmVudEJhY2tncm91bmQ6IHVuZGVmaW5lZCxcclxuICAgIGlzTXVsdGlDaGFydEdyaWRMaW5lOiB1bmRlZmluZWQsXHJcbiAgICBpc0Z1bGxTY3JlZW46IHVuZGVmaW5lZCxcclxuICAgIGN1c3RvbVlzY2FsZTogdW5kZWZpbmVkLFxyXG4gICAgdGV4dHNPbkJhcjogdW5kZWZpbmVkLFxyXG4gICAgaXNYYXhpc0xhYmVsSGlkZGVuOiB1bmRlZmluZWQsXHJcbiAgICBpc1lheGlzTGFiZWxIaWRkZW46IGZhbHNlLFxyXG4gICAgaXNZYXhpc0hpZGRlbjogdW5kZWZpbmVkLFxyXG4gICAgaXNZYXhpc0Rhc2hlZDogdW5kZWZpbmVkLFxyXG4gICAgdGV4dEZvcm1hdHRlcjogdW5kZWZpbmVkLFxyXG4gICAgaXNOb0FsdGVybmF0ZVhheGlzVGV4dDogdW5kZWZpbmVkLFxyXG4gICAgaXNYZ3JpZEJldHdlZW5MYWJlbHM6IHVuZGVmaW5lZCxcclxuICAgIGJhY2tncm91bmRDb2xvcjogJyNGRkZGRkYnLFxyXG4gICAgaGlkZUxlZ2VuZE9uVG9wOiB0cnVlLFxyXG4gICAgaXNYYXhpc0NvbG9yOiAnIzk5OTk5OScsXHJcbiAgICBsYWJlbE92ZXJsYXBNaW5vckZpeDogdHJ1ZSxcclxuICAgIG5vSG92ZXJFZmZlY3Q6IHRydWUsXHJcbiAgICBub0hvdmVyRGlzcGxheURhdGE6IHRydWUsXHJcbiAgICBzaG93WGF4aXNUb3A6IHRydWUsXHJcbiAgICBkaXNwbGF5WWF4aXNMYWJlbHM6IHVuZGVmaW5lZCxcclxuICAgIHhMYWJlbHNPblNhbWVMaW5lOiB1bmRlZmluZWQsXHJcbiAgICB0ZXh0QWx3YXlzSG9yaXpvbnRhbDogdW5kZWZpbmVkLFxyXG4gICAgbGVnZW5kQXRUb3BSaWdodDogdW5kZWZpbmVkLFxyXG4gICAgaXNEcmlsbGRvd25DaGFydDogdHJ1ZSxcclxuICAgIGRpc3BsYXlUaXRsZU9uVG9wOiB1bmRlZmluZWQsXHJcbiAgICBpc1RvZ2dsZVZpc2libGU6IHVuZGVmaW5lZCxcclxuICAgIGlzVGl0bGVIaWRkZW46IHVuZGVmaW5lZCxcclxuICAgIGlzRGlzcGxheUJhckRldGFpbHNBdEJvdHRvbTogdW5kZWZpbmVkLFxyXG4gICAgaG93bWFueUJhckRldGFpbHNUb0Rpc3BsYXk6IDAsXHJcbiAgICBiYXJWYXVsZUNvbG9yOiB1bmRlZmluZWQsXHJcbiAgICBkZWZhdWx0QmFySGVpZ2h0OiAyLFxyXG4gIH07XHJcblxyXG4gIHVuaXF1ZUlkOiBhbnkgPSB0aGlzLmdldFVuaXF1ZUlkKCk7XHJcbiAgaXNab29tZWRPdXQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGlzREQxT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzREQyT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgfVxyXG5cclxuICBvblJlc2l6ZWQoZXZlbnQ6IFJlc2l6ZWRFdmVudCkge1xyXG4gICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgc2V0VGltZW91dChcclxuICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGQzLnNlbGVjdCgnIycgKyBzZWxmLnVuaXF1ZUlkKS5yZW1vdmUoKTtcclxuICAgICAgICBzZWxmLmluaXRpYWxpemVncm91cENoYXJ0KCk7XHJcbiAgICAgIH0uYmluZChzZWxmKSxcclxuICAgICAgMTBcclxuICAgICk7XHJcbiAgfVxyXG4gIGlzWm9vbU91dFNlbGVjdGVkKGlzWm9vbU91dCwgZXZlbnQpIHtcclxuICAgIHRoaXMuaXNab29tZWRPdXQgPSBpc1pvb21PdXQ7XHJcbiAgICB0aGlzLm9uUmVzaXplZChldmVudCk7XHJcbiAgfVxyXG4gIGhhbmRsZVpvb21pblpvb21vdXRDbGljayh7IGlzWm9vbU91dCwgZXZlbnQgfSkge1xyXG4gICAgdGhpcy5pc1pvb21PdXRTZWxlY3RlZChpc1pvb21PdXQsIGV2ZW50KTtcclxuICB9XHJcbiAgbmdPbkluaXQoKSB7fVxyXG4gIGlzTGVnZW5kVmlzaWJsZSgpIHtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5jaGFydERhdGEgJiZcclxuICAgICAgdGhpcy5jaGFydERhdGEubWV0YURhdGEuY29sb3JzICYmXHJcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuY2hhcnREYXRhLm1ldGFEYXRhLmNvbG9ycykubGVuZ3RoID4gMVxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICBrZWVwT3JkZXIgPSAoYSwgYikgPT4ge1xyXG4gICAgcmV0dXJuIGE7XHJcbiAgfTtcclxuXHJcbiAgZ2V0IGlzQWxlcnRFbmFibGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uPy5oZWFkZXJNZW51T3B0aW9ucz8uc29tZShcclxuICAgICAgKG9wdGlvbikgPT4gb3B0aW9uLmlkID09PSAnZWRpdEFsZXJ0J1xyXG4gICAgKTtcclxuICB9ICBcclxuLy8gICBpbml0aWFsaXplZ3JvdXBDaGFydCgpIHtcclxuLy8gICAgIHZhciBzZWxmID0gdGhpcztcclxuLy8gICAgIGxldCBkYXRhID0gW107XHJcbi8vICAgICBsZXQgbWV0YURhdGE6IGFueSA9IG51bGw7XHJcbi8vICAgICBsZXQga2V5TGlzdCA9IG51bGw7XHJcbi8vICAgICBsZXQgbGluZURhdGEgPSBudWxsO1xyXG4vLyAgICAgbGV0IGNvbG9yTWFwID0ge307XHJcbi8vICAgICB2YXIgZm9ybWF0RnJvbUJhY2tlbmQ7XHJcbi8vICAgICB2YXIgZm9ybWF0Rm9ySHVnZU51bWJlcnM7XHJcbi8vICAgICBjb25zdCBpc01vYmlsZSA9IHdpbmRvdy5pbm5lcldpZHRoIDwgNTc2O1xyXG4vLyAgICAgY29uc3QgaXNUYWJsZXQgPSB3aW5kb3cuaW5uZXJXaWR0aCA+PSA1NzYgJiYgd2luZG93LmlubmVyV2lkdGggPCA5OTI7XHJcbi8vICAgICBjb25zdCBpc0Rlc2t0b3AgPSB3aW5kb3cuaW5uZXJXaWR0aCA+PSA5OTI7XHJcblxyXG4vLyAgICBsZXQgaXNyaWEgPSB0aGlzLmN1c3RvbUNoYXJ0Q29uZmlndXJhdGlvbi5pc1JpYVxyXG5cclxuLy8gICAgIHZhciB4OiBhbnk7XHJcblxyXG4vLyAgICAgdmFyIGFsdGVybmF0ZV90ZXh0ID0gZmFsc2U7XHJcbi8vICAgICB2YXIgc2hvcnRfdGlja19sZW5ndGggPSA0O1xyXG4vLyAgICAgdmFyIGxvbmdfdGlja19sZW5ndGggPSAxNjtcclxuLy8gICAgIC8qKlxyXG4vLyAgICAgICogbG9uZ2VyIHRpY2sgbGVuZ3RoIG5lZWRlZCBmb3Igd2Vla2x5IGNoYXJ0c1xyXG4vLyAgICAgICovXHJcbi8vICAgICB2YXIgc2hvcnRfdGlja19sZW5ndGhfYmcgPSA1O1xyXG4vLyAgICAgdmFyIGxvbmdfdGlja19sZW5ndGhfYmcgPSAzMDtcclxuLy8gICAgIHZhciBsZWZ0QW5kUmlnaHRTcGFjZXMgPSA1MDtcclxuLy8gICAgIHZhciByaWdodFN2Z1dpZHRoID0gNjA7XHJcbi8vICAgICB2YXIgdGVtcFNjYWxlO1xyXG5cclxuLy8gICAgIGZvciAodmFyIGkgaW4gdGhpcy5kZWZhdWx0Q29uZmlndXJhdGlvbikge1xyXG4vLyAgICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbltpXSA9IENoYXJ0SGVscGVyLmdldFZhbHVlQnlDb25maWd1cmF0aW9uVHlwZShcclxuLy8gICAgICAgICBpLFxyXG4vLyAgICAgICAgIHRoaXMuZGVmYXVsdENvbmZpZ3VyYXRpb24sXHJcbi8vICAgICAgICAgdGhpcy5jdXN0b21DaGFydENvbmZpZ3VyYXRpb25cclxuLy8gICAgICAgKTtcclxuLy8gICAgIH1cclxuXHJcbi8vICAgICBkYXRhID0gdGhpcy5jaGFydERhdGEuZGF0YTtcclxuLy8gICAgIG1ldGFEYXRhID0gdGhpcy5jaGFydERhdGEubWV0YURhdGE7XHJcbi8vICAgICBsaW5lRGF0YSA9IHRoaXMuY2hhcnREYXRhLmxpbmVEYXRhO1xyXG5cclxuLy8gICAgIC8vIGlmIChsaW5lRGF0YSB8fCB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YSkge1xyXG4vLyAgICAgLy8gICByaWdodFN2Z1dpZHRoID0gNjA7XHJcbi8vICAgICAvLyB9XHJcbi8vICAgICBpZiAoIW1ldGFEYXRhLmNvbG9yQWJvdmVUYXJnZXQpIHtcclxuLy8gICAgICAgbWV0YURhdGFbJ2NvbG9yQWJvdmVUYXJnZXQnXSA9IG1ldGFEYXRhLmNvbG9ycztcclxuLy8gICAgIH1cclxuLy8gICAgIGNvbG9yTWFwID0gbWV0YURhdGEuY29sb3JzO1xyXG4vLyAgICAga2V5TGlzdCA9IG1ldGFEYXRhLmtleUxpc3Q7XHJcblxyXG4vLyAgICAgdmFyIGNoYXJ0Q29udGFpbmVyID0gZDMuc2VsZWN0KHRoaXMuY29udGFpbmVyRWx0Lm5hdGl2ZUVsZW1lbnQpO1xyXG4vLyAgICAgdmFyIHZlcnRpY2Fsc3RhY2tlZGNvbnRhaW5lciA9IGQzLnNlbGVjdChcclxuLy8gICAgICAgdGhpcy5ncm91cGNvbnRhaW5lckVsdC5uYXRpdmVFbGVtZW50XHJcbi8vICAgICApO1xyXG4vLyAgICAgdmFyIG1hcmdpbiA9IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLm1hcmdpbjtcclxuLy8gICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gdGhpcy5jYWxjdWxhdGVDaGFydERpbWVuc2lvbnMoXHJcbi8vICAgICBjaGFydENvbnRhaW5lcixcclxuLy8gICAgIHZlcnRpY2Fsc3RhY2tlZGNvbnRhaW5lcixcclxuLy8gICAgIG1hcmdpbixcclxuLy8gICAgIHNlbGZcclxuLy8gICApO1xyXG4vLyAgICAgLyoqXHJcbi8vICAgICAgKiBmb3IgaGlkaW5nIGhlYWRlclxyXG4vLyAgICAgICogdXNlZCBieSB3ZWVrbHkgY2hhcnRzXHJcbi8vICAgICAgKi9cclxuLy8gICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0hlYWRlclZpc2libGUgIT0gdW5kZWZpbmVkKVxyXG4vLyAgICAgICB0aGlzLmlzSGVhZGVyVmlzaWJsZSA9IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzSGVhZGVyVmlzaWJsZTtcclxuLy8gICAgIC8qKlxyXG4vLyAgICAgICogZm9yIGhpZGluZyBsZWdlbmRzXHJcbi8vICAgICAgKiB1c2VkIGJ5IHdlZWtseSBjaGFydHNcclxuLy8gICAgICAqL1xyXG4vLyAgICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmxlZ2VuZFZpc2libGUgIT0gdW5kZWZpbmVkKSB7XHJcbi8vICAgICAgIHRoaXMubGVnZW5kVmlzaWJsZSA9IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmxlZ2VuZFZpc2libGU7XHJcbi8vICAgICB9XHJcblxyXG4vLyAgICAgLyoqXHJcbi8vICAgICAgKiBmb3IgcmVtb3ZpbmcgYmFja2dyb3VuZCBjb2xvciBzbyB0aGF0IGl0IGNhbiB0YWtlIHBhcmVudHMgY29sb3JcclxuLy8gICAgICAqXHJcbi8vICAgICAgKi9cclxuLy8gICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1RyYW5zcGFyZW50QmFja2dyb3VuZCAhPSB1bmRlZmluZWQpIHtcclxuLy8gICAgICAgdGhpcy5pc1RyYW5zcGFyZW50QmFja2dyb3VuZCA9XHJcbi8vICAgICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNUcmFuc3BhcmVudEJhY2tncm91bmQ7XHJcbi8vICAgICB9XHJcbi8vICAgICAvKipcclxuLy8gICAgICAqIGZvcm1hdCBkYXRhIHZhbHVlcyBiYXNlZCBvbiBjb25maWd1cmF0aW9uIHJlY2VpdmVkXHJcbi8vICAgICAgKi9cclxuLy8gICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi50ZXh0Rm9ybWF0dGVyICE9IHVuZGVmaW5lZCkge1xyXG4vLyAgICAgICBmb3JtYXRGcm9tQmFja2VuZCA9IENoYXJ0SGVscGVyLmRhdGFWYWx1ZUZvcm1hdHRlcihcclxuLy8gICAgICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi50ZXh0Rm9ybWF0dGVyXHJcbi8vICAgICAgICk7XHJcbi8vICAgICAgIGZvcm1hdEZvckh1Z2VOdW1iZXJzID0gQ2hhcnRIZWxwZXIuZGF0YVZhbHVlRm9ybWF0dGVyKCcuMnMnKTtcclxuLy8gICAgIH1cclxuLy8gICAgIGNvbnN0IHtcclxuLy8gICAgIG91dGVyQ29udGFpbmVyLFxyXG4vLyAgICAgc3ZnWUF4aXNMZWZ0LFxyXG4vLyAgICAgc3ZnWUF4aXNSaWdodCxcclxuLy8gICAgIGlubmVyQ29udGFpbmVyLFxyXG4vLyAgICAgc3ZnXHJcbi8vICAgfSA9IHRoaXMuY3JlYXRlQ2hhcnRDb250YWluZXJzKGNoYXJ0Q29udGFpbmVyLCBtYXJnaW4sIGhlaWdodCwgcmlnaHRTdmdXaWR0aCwgc2VsZiwgd2lkdGgpO1xyXG4vLyAgICAgdmFyIHN1Ymdyb3VwczogYW55ID0ga2V5TGlzdDtcclxuXHJcbi8vICAgICB2YXIgZ3JvdXBzID0gZDNcclxuLy8gICAgICAgLm1hcChkYXRhLCBmdW5jdGlvbiAoZCkge1xyXG4vLyAgICAgICAgIHJldHVybiBkLm5hbWU7XHJcbi8vICAgICAgIH0pXHJcbi8vICAgICAgIC5rZXlzKCk7XHJcblxyXG4vLyAgICAgLyoqXHJcbi8vICAgICAgKiB4IGF4aXMgcmFuZ2UgbWFkZSBzaW1pbGFyIHRvIGxpbmUgY2hhcnQgb3IgdmVydGljYWwgc3RhY2sgc28gdGhhdCBhbGwgdGhlIGNoYXJ0cyB3aWxsIGdldCBhbGlnbmVkIHdpdGggZWFjaCBvdGhlci5cclxuLy8gICAgICAqL1xyXG4vLyAgICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzTXVsdGlDaGFydEdyaWRMaW5lICE9IHVuZGVmaW5lZCkge1xyXG4vLyAgICAgICB4ID0gZDNcclxuLy8gICAgICAgICAuc2NhbGVCYW5kKClcclxuLy8gICAgICAgICAucmFuZ2VSb3VuZChbd2lkdGgsIDBdKVxyXG4vLyAgICAgICAgIC5hbGlnbigwLjUpXHJcbi8vICAgICAgICAgLnBhZGRpbmcoWzAuNV0pXHJcbi8vICAgICAgICAgLmRvbWFpbihcclxuLy8gICAgICAgICAgIGRhdGEubWFwKGZ1bmN0aW9uIChkOiBhbnkpIHtcclxuLy8gICAgICAgICAgICAgcmV0dXJuIGQubmFtZS50b0xvd2VyQ2FzZSgpO1xyXG4vLyAgICAgICAgICAgfSlcclxuLy8gICAgICAgICApO1xyXG4vLyAgICAgfSBlbHNlIHtcclxuLy8gICAgICAgeCA9IGQzXHJcbi8vICAgICAgICAgLnNjYWxlQmFuZCgpXHJcbi8vICAgICAgICAgLmRvbWFpbihncm91cHMpXHJcbi8vICAgICAgICAgLnJhbmdlKFtsZWZ0QW5kUmlnaHRTcGFjZXMsIHdpZHRoIC0gcmlnaHRTdmdXaWR0aCAtIGxlZnRBbmRSaWdodFNwYWNlc10pXHJcbi8vICAgICAgICAgLnBhZGRpbmcoWzAuM10pO1xyXG4vLyAgICAgfVxyXG4vLyAgICAgLy8geC5iYW5kd2lkdGgoOTYpO1xyXG4vLyAgICAgdmFyIHhTY2FsZUZyb21PcmlnaW4gPSBkM1xyXG4vLyAgICAgICAuc2NhbGVCYW5kKClcclxuLy8gICAgICAgLmRvbWFpbihncm91cHMpXHJcbi8vICAgICAgIC5yYW5nZShbMCwgd2lkdGggLSByaWdodFN2Z1dpZHRoXSk7XHJcbi8vICAgICAvLyAucGFkZGluZyhbMC4yXSk7XHJcblxyXG4vLyAgICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzTXVsdGlDaGFydEdyaWRMaW5lID09IHVuZGVmaW5lZCkge1xyXG4vLyAgICAgICAvKipcclxuLy8gICAgICAgICogbm9ybWFsIHRpY2tzIGZvciBhbGwgZGFzaGJvYXJkIGNoYXJ0c1xyXG4vLyAgICAgICAgKi9cclxuLy8gICAgICAgc3ZnXHJcbi8vICAgICAgICAgLmFwcGVuZCgnZycpXHJcbi8vICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ3gxIGF4aXMxJylcclxuLy8gICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgwLCcgKyBoZWlnaHQgKyAnKScpXHJcbi8vICAgICAgICAgLmNhbGwoZDMuYXhpc0JvdHRvbSh4KSlcclxuLy8gICAgICAgICAuY2FsbCgoZykgPT4gZy5zZWxlY3QoJy5kb21haW4nKS5yZW1vdmUoKSk7XHJcblxyXG4vLyAgICAgICBzdmcuc2VsZWN0QWxsKCdnLngxLmF4aXMxIGcudGljayBsaW5lJykucmVtb3ZlKCk7XHJcblxyXG4vLyAgICAgICAvLyBPbmx5IG1vdmUgeC1heGlzIGxhYmVscyBmdXJ0aGVyIGRvd24gZm9yIGdyb3VwZWQgY2hhcnRzIGlmIHRoZXJlIGlzIG5vIHhMYWJlbFxyXG4vLyAgICAgICBpZiAoc3ViZ3JvdXBzLmxlbmd0aCA+IDEgJiYgIW1ldGFEYXRhLnhMYWJlbCkge1xyXG4vLyAgICAgICAgIHN2Z1xyXG4vLyAgICAgICAgICAgLnNlbGVjdEFsbCgnZy54MS5heGlzMSBnLnRpY2sgdGV4dCcpXHJcbi8vICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnbGliLXhheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24nKVxyXG4vLyAgICAgICAgICAgLnN0eWxlKCdmaWxsJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJylcclxuLy8gICAgICAgICAgIC5hdHRyKCd5JywgMzIpOyAvLyBJbmNyZWFzZSBkaXN0YW5jZSBmcm9tIGJhcnMgKGRlZmF1bHQgaXMgfjkpXHJcbi8vICAgICAgIH0gZWxzZSB7XHJcbi8vICAgICAgICAgc3ZnXHJcbi8vICAgICAgICAgICAuc2VsZWN0QWxsKCdnLngxLmF4aXMxIGcudGljayB0ZXh0JylcclxuLy8gICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdsaWIteGF4aXMtbGFiZWxzLXRleHRzLWRyaWxsZG93bicpXHJcbi8vICAgICAgICAgICAuc3R5bGUoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKTtcclxuLy8gICAgICAgfVxyXG4vLyAgICAgfSBcclxuLy8gICAgIGVsc2Uge1xyXG4vLyAgICAgICAvKipcclxuLy8gICAgICAgICogYmlnZ2VyIHRpY2tzIGZvciB3ZWVrbHkgY2hhcnRzIGFuZCBtb3JlIHNwYWNlIGZyb20geCBheGlzIHRvIGxhYmVsc1xyXG4vLyAgICAgICAgKi9cclxuLy8gICAgICAgLyoqXHJcbi8vICAgICAgICAqIGRyYXcgeCBheGlzXHJcbi8vICAgICAgICAqL1xyXG4vLyAgICAgICBzdmdcclxuLy8gICAgICAgICAuYXBwZW5kKCdnJylcclxuLy8gICAgICAgICAuYXR0cignY2xhc3MnLCAneDEgYXhpczEnKVxyXG4vLyAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDAsJyArIGhlaWdodCArICcpJylcclxuLy8gICAgICAgICAuY2FsbChkMy5heGlzQm90dG9tKHgpLnRpY2tTaXplKDApKVxyXG4vLyAgICAgICAgIC5jYWxsKChnKSA9PiBnLnNlbGVjdCgnLmRvbWFpbicpLmF0dHIoJ2ZpbGwnLCAnbm9uZScpKTtcclxuLy8gICAgICAgLyoqXHJcbi8vICAgICAgICAqIHRpY2sgbGluZSBzaXplIGluIGFsdGVybmF0ZSBmYXNoaW9uXHJcbi8vICAgICAgICAqL1xyXG4vLyAgICAgICBzdmcuc2VsZWN0QWxsKCdnLngxLmF4aXMxIGcudGljayBsaW5lJykuYXR0cigneTInLCBmdW5jdGlvbiAoKSB7XHJcbi8vICAgICAgICAgaWYgKFxyXG4vLyAgICAgICAgICAgYWx0ZXJuYXRlX3RleHQgJiZcclxuLy8gICAgICAgICAgIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmlzTm9BbHRlcm5hdGVYYXhpc1RleHQgPT0gdW5kZWZpbmVkXHJcbi8vICAgICAgICAgKSB7XHJcbi8vICAgICAgICAgICBhbHRlcm5hdGVfdGV4dCA9IGZhbHNlO1xyXG4vLyAgICAgICAgICAgcmV0dXJuIGxvbmdfdGlja19sZW5ndGhfYmcgLSA3O1xyXG4vLyAgICAgICAgIH0gZWxzZSB7XHJcbi8vICAgICAgICAgICBhbHRlcm5hdGVfdGV4dCA9IHRydWU7XHJcbi8vICAgICAgICAgICByZXR1cm4gc2hvcnRfdGlja19sZW5ndGhfYmcgLSA0O1xyXG4vLyAgICAgICAgIH1cclxuLy8gICAgICAgfSk7XHJcbi8vICAgICAgIC8qKlxyXG4vLyAgICAgICAgKiByZXNldCB0aGUgZmxhZyBzbyB0aGF0IHZhbHVlcyBjYW4gYmUgc2hvd24gaW4gc2FtZSBhbHRlcm5hdGUgZmFzaGlvblxyXG4vLyAgICAgICAgKi9cclxuLy8gICAgICAgYWx0ZXJuYXRlX3RleHQgPSBmYWxzZTtcclxuLy8gICAgICAgLyoqXHJcbi8vICAgICAgICAqIHByaW50IHgtYXhpcyBsYWJlbCB0ZXh0c1xyXG4vLyAgICAgICAgKiB1c2VkIGJ5IHdlZWtseSBjaGFydHNcclxuLy8gICAgICAgICovXHJcbi8vICAgICAgIHN2Z1xyXG4vLyAgICAgICAgIC5zZWxlY3RBbGwoJ2cueDEuYXhpczEgZy50aWNrIHRleHQnKVxyXG4vLyAgICAgICAgIC5hdHRyKCdjbGFzcycsICdsaWIteGF4aXMtbGFiZWxzLXRleHRzLXdlZWtseWNoYXJ0cycpXHJcbi8vICAgICAgICAgLmF0dHIoJ3knLCBmdW5jdGlvbiAoKSB7XHJcbi8vICAgICAgICAgICAvLyBNaW5pbWl6ZSBnYXAgaW4gbWF4aW1pemVkIChmdWxsc2NyZWVuKSB2aWV3IGZvciB3ZWVrbHkgY2hhcnRzXHJcbi8vICAgICAgICAgICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNGdWxsU2NyZWVuKSB7XHJcbi8vICAgICAgICAgICAgIHJldHVybiBzaG9ydF90aWNrX2xlbmd0aF9iZztcclxuLy8gICAgICAgICAgIH1cclxuLy8gICAgICAgICAgIGlmIChhbHRlcm5hdGVfdGV4dCkge1xyXG4vLyAgICAgICAgICAgICBhbHRlcm5hdGVfdGV4dCA9IGZhbHNlO1xyXG4vLyAgICAgICAgICAgICByZXR1cm4gbG9uZ190aWNrX2xlbmd0aF9iZztcclxuLy8gICAgICAgICAgIH0gZWxzZSB7XHJcbi8vICAgICAgICAgICAgIGFsdGVybmF0ZV90ZXh0ID0gdHJ1ZTtcclxuLy8gICAgICAgICAgICAgcmV0dXJuIHNob3J0X3RpY2tfbGVuZ3RoX2JnO1xyXG4vLyAgICAgICAgICAgfVxyXG4vLyAgICAgICAgIH0pO1xyXG4vLyAgICAgfVxyXG4vLyAgICAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnhMYWJlbHNPblNhbWVMaW5lKSB7XHJcbi8vICAgICAgIGNvbnN0IHhBeGlzTGFiZWxzID0gc3ZnXHJcbi8vICAgICAgICAgLnNlbGVjdEFsbCgnZy54MS5heGlzMSBnLnRpY2sgdGV4dCcpXHJcbi8vICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi14YXhpcy1sYWJlbHMtdGV4dHMtZHJpbGxkb3duJylcclxuLy8gICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMuaXNIZWFkZXJWaXNpYmxlID8gJzE4cHgnIDogJzE0cHgnKVxyXG4vLyAgICAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxyXG4vLyAgICAgICAgIC5hdHRyKCd5JywgZnVuY3Rpb24oZCkge1xyXG4vLyAgICAgICAgICAgLy8gRm9yIGdyb3VwZWQgYmFyIGNoYXJ0cyB3aXRoIG1hbnkgYmFycyBhbmQgeExhYmVsIHByZXNlbnQsIG9ubHkgYWRkIDUgaWYgdGhlIGxhYmVsIGlzIGEgZGF0ZVxyXG4vLyAgICAgICAgICAgaWYgKHN1Ymdyb3Vwcy5sZW5ndGggPiAxICYmIGRhdGEubGVuZ3RoID4gOCAmJiBtZXRhRGF0YS54TGFiZWwpIHtcclxuLy8gICAgICAgICAgICAgY29uc3QgaXNEYXRlTGFiZWwgPSAvXFxkezIsNH1bLVxcL10vLnRlc3QoZCk7XHJcbi8vICAgICAgICAgICAgIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0Z1bGxTY3JlZW4pIHtcclxuLy8gICAgICAgICAgICAgICByZXR1cm4gaXNEYXRlTGFiZWwgPyBzaG9ydF90aWNrX2xlbmd0aF9iZyArIDE0IDogc2hvcnRfdGlja19sZW5ndGhfYmc7XHJcbi8vICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgICAgcmV0dXJuIGlzRGF0ZUxhYmVsID8gc2hvcnRfdGlja19sZW5ndGhfYmcgKyAxNCA6IHNob3J0X3RpY2tfbGVuZ3RoX2JnO1xyXG4vLyAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgLy8gRm9yIGdyb3VwZWQgYmFyIGNoYXJ0cyB3aXRoIG1hbnkgYmFycyBhbmQgTk8geExhYmVsLCBhZGQgc3BhY2UgYXMgYmVmb3JlLCBidXQgcmVkdWNlIGluIGZ1bGxzY3JlZW5cclxuLy8gICAgICAgICAgIGlmIChzdWJncm91cHMubGVuZ3RoID4gMSAmJiBkYXRhLmxlbmd0aCA+IDggJiYgIW1ldGFEYXRhLnhMYWJlbCkge1xyXG4vLyAgICAgICAgICAgICBjb25zdCBjaGFydEhhc0V4dHJhQm90dG9tID0gKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLm1hcmdpbiAmJiBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5tYXJnaW4uYm90dG9tID49IDQwKTtcclxuLy8gICAgICAgICAgICAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmlzRnVsbFNjcmVlbikge1xyXG4vLyAgICAgICAgICAgICAgIC8vIFJlZHVjZSBleHRyYSBnYXAgaW4gbWF4aW1pemVkIHZpZXdcclxuLy8gICAgICAgICAgICAgICByZXR1cm4gc2hvcnRfdGlja19sZW5ndGhfYmcgKyAyO1xyXG4vLyAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAgIHJldHVybiBjaGFydEhhc0V4dHJhQm90dG9tID8gc2hvcnRfdGlja19sZW5ndGhfYmcgOiBzaG9ydF90aWNrX2xlbmd0aF9iZyArIDEwO1xyXG4vLyAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgLy8gRGVmYXVsdC9mYWxsYmFjayBsb2dpYyBmb3Igb3RoZXIgY2FzZXNcclxuLy8gICAgICAgICAgIGxldCBiYXNlWSA9IHNlbGYuaXNIZWFkZXJWaXNpYmxlID8gc2hvcnRfdGlja19sZW5ndGhfYmcgKyAyNSA6IHNob3J0X3RpY2tfbGVuZ3RoX2JnO1xyXG4vLyAgICAgICAgICAgaWYgKFxyXG4vLyAgICAgICAgICAgICBzdWJncm91cHMubGVuZ3RoID4gMSAmJlxyXG4vLyAgICAgICAgICAgICAhbWV0YURhdGEueExhYmVsICYmXHJcbi8vICAgICAgICAgICAgICgvXFxkezIsNH1bLVxcL11cXGR7Mn1bLVxcL11cXGR7Miw0fS8udGVzdChkKSB8fCAvXFxkezIsNH1bLVxcL11cXGR7Miw0fS8udGVzdChkKSlcclxuLy8gICAgICAgICAgICkge1xyXG4vLyAgICAgICAgICAgICBiYXNlWSA9IHNlbGYuaXNIZWFkZXJWaXNpYmxlID8gc2hvcnRfdGlja19sZW5ndGhfYmcgKyAxNSA6IHNob3J0X3RpY2tfbGVuZ3RoX2JnICsgMjU7XHJcbi8vICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICBpZiAoL1xcZHsyLDR9Wy1cXC9dXFxkezIsNH0vLnRlc3QoZCkgJiYgZC5pbmRleE9mKCcgJykgPiAtMSkge1xyXG4vLyAgICAgICAgICAgICBiYXNlWSArPSA0O1xyXG4vLyAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgLy8gSW4gbWF4aW1pemVkIHZpZXcsIHJlZHVjZSBiYXNlWSBzbGlnaHRseSBmb3IgZ3JvdXBlZCBiYXJzXHJcbi8vICAgICAgICAgICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNGdWxsU2NyZWVuICYmIHN1Ymdyb3Vwcy5sZW5ndGggPiAxKSB7XHJcbi8vICAgICAgICAgICAgIGJhc2VZID0gTWF0aC5tYXgoc2hvcnRfdGlja19sZW5ndGhfYmcsIGJhc2VZIC0gMTApO1xyXG4vLyAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgcmV0dXJuIGJhc2VZO1xyXG4vLyAgICAgICAgIH0pXHJcbi8vICAgICAgICAgLmF0dHIoJ3gnLCBmdW5jdGlvbiAoZCkge1xyXG4vLyAgICAgICAgICAgaWYgKHNlbGYuY2hhcnREYXRhLmRhdGEubGVuZ3RoID4gOCAmJiAhc2VsZi5pc1pvb21lZE91dCkge1xyXG4vLyAgICAgICAgICAgICByZXR1cm4gMTsgLy8gTW92ZSBmaXJzdCBsaW5lIHRleHQgc2xpZ2h0bHkgdG8gdGhlIGxlZnQgaW4gem9vbS1pbiB2aWV3IGZvciBiZXR0ZXIgYWxpZ25tZW50XHJcbi8vICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICByZXR1cm4gMDsgLy8gRGVmYXVsdCBwb3NpdGlvblxyXG4vLyAgICAgICAgIH0pXHJcbi8vICAgICAgICAgLnRleHQoZnVuY3Rpb24gKGQpIHtcclxuLy8gICAgICAgICAgIHZhciBpc1ZhbHVlVG9CZUlnbm9yZWQgPSBmYWxzZTtcclxuLy8gICAgICAgICAgIGlmIChpc01vYmlsZSAmJiAhc2VsZi5pc0hlYWRlclZpc2libGUpIHtcclxuLy8gICAgICAgICAgICAgbGV0IGZpcnN0UGFydCA9IGQuc3BsaXQoL1tcXHNcXC1dKy8pWzBdO1xyXG4vLyAgICAgICAgICAgICByZXR1cm4gZmlyc3RQYXJ0LnN1YnN0cmluZygwLCAzKS50b0xvd2VyQ2FzZSgpO1xyXG4vLyAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgKGRhdGEgYXMgYW55W10pLm1hcCgoaW5kaXY6IGFueSkgPT4ge1xyXG4vLyAgICAgICAgICAgICBpZiAoXHJcbi8vICAgICAgICAgICAgICAgaW5kaXYubmFtZSAmJlxyXG4vLyAgICAgICAgICAgICAgIGluZGl2Lm5hbWUudG9Mb3dlckNhc2UoKSA9PSBkLnRyaW0oKS50b0xvd2VyQ2FzZSgpICYmXHJcbi8vICAgICAgICAgICAgICAgaW5kaXZbbWV0YURhdGEua2V5TGlzdFswXV0gPT0gLTFcclxuLy8gICAgICAgICAgICAgKSB7XHJcbi8vICAgICAgICAgICAgICAgaXNWYWx1ZVRvQmVJZ25vcmVkID0gdHJ1ZTtcclxuLy8gICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgfSk7XHJcbi8vICAgICAgICAgICBpZiAoaXNWYWx1ZVRvQmVJZ25vcmVkKSB7XHJcbi8vICAgICAgICAgICAgIHJldHVybiAnJztcclxuLy8gICAgICAgICAgIH1cclxuLy8gICAgICAgICAgIC8vIEFsd2F5cyBhZGQgc3BhY2UgYmVmb3JlIGFuZCBhZnRlciBoeXBoZW4gZm9yIGRhdGUgcmFuZ2UgbGFiZWxzLCBldmVuIHdoZW4gaGVhZGVyIGlzIHZpc2libGUgYW5kIGxhYmVsIGlzIHNpbmdsZSBsaW5lXHJcbi8vICAgICAgICAgICAvLyBBcHBseSBmb3IgZ3JvdXBlZCBiYXIgY2hhcnRzIGFuZCBzaW5nbGUgYmFyIGNoYXJ0cywgaGVhZGVyIHZpc2libGUsIHNpbmdsZSBsaW5lXHJcbi8vICAgICAgICAgICBjb25zdCBkYXRlUmFuZ2VSZWdleCA9IC8oXFxkezIsNH1bLVxcL11cXGR7Mn1bLVxcL11cXGR7Miw0fSlcXHMqLVxccyooXFxkezIsNH1bLVxcL11cXGR7Mn1bLVxcL11cXGR7Miw0fSkvO1xyXG4vLyAgICAgICAgICAgaWYgKGRhdGVSYW5nZVJlZ2V4LnRlc3QoZC50cmltKCkpKSB7XHJcbi8vICAgICAgICAgICAgIHJldHVybiBkLnRyaW0oKS5yZXBsYWNlKGRhdGVSYW5nZVJlZ2V4LCAobSwgZDEsIGQyKSA9PiBgJHtkMX0gLSAke2QyfWApO1xyXG4vLyAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgLy8gU3BsaXQgZGF0ZSBhbmQgd2VlayBsYWJlbHMgaW50byB0d28gbGluZXMgaW4gZ3JvdXBlZCBiYXIgem9vbS1pbiB2aWV3IChhbmQgbWluaW1pemVkIHZpZXcpXHJcbi8vICAgICAgICAgICBjb25zdCBpc0RhdGVMYWJlbCA9IC9cXGR7Miw0fVstXFwvXS8udGVzdChkKTtcclxuLy8gICAgICAgICAgIGNvbnN0IGlzV2Vla0xhYmVsID0gL3dlZWt8d2t8d1xcZCsvaS50ZXN0KGQpO1xyXG4vLyAgICAgICAgICAgaWYgKFxyXG4vLyAgICAgICAgICAgICBzdWJncm91cHMubGVuZ3RoID4gMSAmJiAhc2VsZi5pc1pvb21lZE91dCAmJiBkYXRhLmxlbmd0aCA+IDggJiYgZC5pbmRleE9mKCcgJykgPiAtMSAmJiAoaXNEYXRlTGFiZWwgfHwgaXNXZWVrTGFiZWwpXHJcbi8vICAgICAgICAgICApIHtcclxuLy8gICAgICAgICAgICAgdmFyIGZpcnN0ID0gZC5zdWJzdHJpbmcoMCwgZC5pbmRleE9mKCcgJykpO1xyXG4vLyAgICAgICAgICAgICB2YXIgc2Vjb25kID0gZC5zdWJzdHJpbmcoZC5pbmRleE9mKCcgJykgKyAxKS50cmltKCk7XHJcbi8vICAgICAgICAgICAgIHJldHVybiBmaXJzdCArICdcXG4nICsgc2Vjb25kO1xyXG4vLyAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgLy8gQWxzbyBrZWVwIHByZXZpb3VzIGxvZ2ljIGZvciBtaW5pbWl6ZWQgdmlld1xyXG4vLyAgICAgICAgICAgaWYgKGlzRGF0ZUxhYmVsKSB7XHJcbi8vICAgICAgICAgICAgIGlmICghc2VsZi5pc0hlYWRlclZpc2libGUgJiYgZGF0YS5sZW5ndGggPiA4ICYmIGQuaW5kZXhPZignICcpID4gLTEpIHtcclxuLy8gICAgICAgICAgICAgICB2YXIgZmlyc3QgPSBkLnN1YnN0cmluZygwLCBkLmluZGV4T2YoJyAnKSk7XHJcbi8vICAgICAgICAgICAgICAgdmFyIHNlY29uZCA9IGQuc3Vic3RyaW5nKGQuaW5kZXhPZignICcpICsgMSkudHJpbSgpO1xyXG4vLyAgICAgICAgICAgICAgIHJldHVybiBmaXJzdCArICdcXG4nICsgc2Vjb25kO1xyXG4vLyAgICAgICAgICAgICB9IGVsc2Uge1xyXG4vLyAgICAgICAgICAgICAgIHJldHVybiBkO1xyXG4vLyAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICBpZiAoZC50cmltKCkuaW5kZXhPZignICcpID4gLTEpIHtcclxuLy8gICAgICAgICAgICAgcmV0dXJuIGQudHJpbSgpLnN1YnN0cmluZygwLCBkLmluZGV4T2YoJyAnKSkudG9Mb3dlckNhc2UoKTtcclxuLy8gICAgICAgICAgIH1cclxuLy8gICAgICAgICAgIHJldHVybiBkLnRvTG93ZXJDYXNlKCk7XHJcbi8vICAgICAgICAgICAvLyBJZiBsYWJlbCBsb29rcyBsaWtlIGEgZGF0ZSAoY29udGFpbnMgZGlnaXRzIGFuZCAtIG9yIC8pXHJcbi8vICAgICAgICAgICBjb25zdCBpc0RhdGVMYWJlbDIgPSAvXFxkezIsNH1bLVxcL10vLnRlc3QoZCk7XHJcbi8vICAgICAgICAgICAvLyBPbmx5IHNwbGl0IGRhdGUvd2VlayBsYWJlbHMgaWYgdGhlcmUgYXJlIG1hbnkgZ3JvdXBlZCBiYXJzIGFuZCBoZWFkZXIgaXMgbm90IHZpc2libGVcclxuLy8gICAgICAgICAgIGlmIChpc0RhdGVMYWJlbCkge1xyXG4vLyAgICAgICAgICAgICBpZiAoIXNlbGYuaXNIZWFkZXJWaXNpYmxlICYmIGRhdGEubGVuZ3RoID4gOCAmJiBkLmluZGV4T2YoJyAnKSA+IC0xKSB7XHJcbi8vICAgICAgICAgICAgICAgdmFyIGZpcnN0ID0gZC5zdWJzdHJpbmcoMCwgZC5pbmRleE9mKCcgJykpO1xyXG4vLyAgICAgICAgICAgICAgIHZhciBzZWNvbmQgPSBkLnN1YnN0cmluZyhkLmluZGV4T2YoJyAnKSArIDEpLnRyaW0oKTtcclxuLy8gICAgICAgICAgICAgICByZXR1cm4gZmlyc3QgKyAnXFxuJyArIHNlY29uZDtcclxuLy8gICAgICAgICAgICAgfSBlbHNlIHtcclxuLy8gICAgICAgICAgICAgICByZXR1cm4gZDtcclxuLy8gICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgaWYgKGQudHJpbSgpLmluZGV4T2YoJyAnKSA+IC0xKSB7XHJcbi8vICAgICAgICAgICAgIHJldHVybiBkLnRyaW0oKS5zdWJzdHJpbmcoMCwgZC5pbmRleE9mKCcgJykpLnRvTG93ZXJDYXNlKCk7XHJcbi8vICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICByZXR1cm4gZC50b0xvd2VyQ2FzZSgpO1xyXG4vLyAgICAgICAgIH0pO1xyXG5cclxuLy8gICAgICAgLy8gTm93IGFwcGx5IHdyaXRpbmctbW9kZTogc2lkZXdheXMtbHIgZm9yIGdyb3VwZWQgY2hhcnRzIHdpdGggZGF0ZSBsYWJlbHMgaW4gem9vbWVkLW91dCB2aWV3IGFuZCBtYW55IGJhcnNcclxuLy8gICAgICAgeEF4aXNMYWJlbHMuZWFjaChmdW5jdGlvbih0aGlzOiBTVkdUZXh0RWxlbWVudCwgZDogYW55KSB7XHJcbi8vICAgICAgICAgLy8gT25seSBhcHBseSB3cml0aW5nLW1vZGUgZm9yIGV4YWN0IGRhdGUgbGFiZWxzLCBub3QgdGhvc2UgY29udGFpbmluZyAnd2Vlaycgb3Igc2ltaWxhclxyXG4vLyAgICAgICAgIGNvbnN0IGlzRGF0ZUxhYmVsID0gL14oXFxkezIsNH1bLVxcL10pP1xcZHsyLDR9Wy1cXC9dXFxkezIsNH0kLy50ZXN0KGQudHJpbSgpKTtcclxuLy8gICAgICAgICBjb25zdCBpc1dlZWtMYWJlbCA9IC93ZWVrfHdrfHdcXGQrL2kudGVzdChkKTtcclxuLy8gICAgICAgICBpZiAoc3ViZ3JvdXBzLmxlbmd0aCA+IDEgJiYgc2VsZi5pc1pvb21lZE91dCAmJiBkYXRhLmxlbmd0aCA+IDggJiYgaXNEYXRlTGFiZWwgJiYgIWlzV2Vla0xhYmVsKSB7XHJcbi8vICAgICAgICAgICBkMy5zZWxlY3QodGhpcykuc3R5bGUoJ3dyaXRpbmctbW9kZScsICdzaWRld2F5cy1scicpO1xyXG4vLyAgICAgICAgIH1cclxuLy8gICAgICAgfSk7XHJcbi8vICAgICAgIGlmICghaXNNb2JpbGUpIHtcclxuLy8gICAgICAgICBzdmdcclxuLy8gICAgICAgICAgIC5zZWxlY3RBbGwoJ2cueDEuYXhpczEgZy50aWNrJylcclxuLy8gICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGQpIHtcclxuLy8gICAgICAgICAgICAgcmV0dXJuICEvXFxkezIsNH1bLVxcL10vLnRlc3QoZCk7IC8vIE9ubHkgcHJvY2VzcyBub24tZGF0ZSBsYWJlbHNcclxuLy8gICAgICAgICAgIH0pXHJcbi8vICAgICAgICAgICAuYXBwZW5kKCd0ZXh0JylcclxuLy8gICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdsaWIteGF4aXMtbGFiZWxzLXRleHRzLWRyaWxsZG93bicpXHJcbi8vICAgICAgICAgICAuYXR0cigneScsIGxvbmdfdGlja19sZW5ndGhfYmcpXHJcbi8vICAgICAgICAgICAuYXR0cignZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpXHJcbi8vICAgICAgICAgICAuYXR0cigneCcsIGZ1bmN0aW9uIChkKSB7XHJcbi8vICAgICAgICAgICAgIGlmIChzZWxmLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aCA+IDggJiYgIXNlbGYuaXNab29tZWRPdXQpIHtcclxuLy8gICAgICAgICAgICAgICByZXR1cm4gMTsgLy8gTW92ZSB0ZXh0IHNsaWdodGx5IHRvIHRoZSBsZWZ0XHJcbi8vICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgICAgcmV0dXJuIDA7IC8vIERlZmF1bHQgcG9zaXRpb25cclxuLy8gICAgICAgICAgIH0pXHJcbi8vICAgICAgICAgICAudGV4dChmdW5jdGlvbiAoZCkge1xyXG4vLyAgICAgICAgICAgICBpZiAoZC50cmltKCkuaW5kZXhPZignICcpID4gLTEpIHtcclxuLy8gICAgICAgICAgICAgICByZXR1cm4gZC50cmltKCkuc3Vic3RyaW5nKGQuaW5kZXhPZignICcpLCBkLmxlbmd0aCkudG9Mb3dlckNhc2UoKTtcclxuLy8gICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgICByZXR1cm4gJyc7XHJcbi8vICAgICAgICAgICB9KTtcclxuLy8gICAgICAgfVxyXG4vLyAgICAgfVxyXG4vLyAgICAgICAgIGlmIChpc3JpYSAmJiBzZWxmLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aCA+IDgpIHtcclxuLy8gICAgICAgc3ZnXHJcbi8vICAgICAgICAgLnNlbGVjdEFsbCgnZy54MS5heGlzMSBnLnRpY2sgdGV4dCcpXHJcbi8vICAgICAgICAgLmNsYXNzZWQoJ21vYmlsZS14YXhpcy1vdmVycmlkZScsIHRydWUpXHJcbi8vICAgICAgICAgLnRleHQoZnVuY3Rpb24gKGQ6IHN0cmluZykge1xyXG4vLyAgICAgICAgICAgcmV0dXJuIGQuc3Vic3RyaW5nKDAsIDMpO1xyXG4vLyAgICAgICAgIH0pXHJcbi8vICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCAnMTJweCcpIFxyXG4vLyAgICAgICAgIC5hdHRyKCd5JywgNSkgICAgICAgICAgICAgICBcclxuLy8gICAgICAgICAuYXR0cigneCcsIDUpICAgICAgICAgICAgICAgIFxyXG4vLyAgICAgICAgIC5zdHlsZSgndGV4dC1hbmNob3InLCAnbWlkZGxlJyk7XHJcbi8vICAgICB9XHJcbi8vICAgICBpZiAoaXNNb2JpbGUgJiYgIXRoaXMuaXNIZWFkZXJWaXNpYmxlKSB7XHJcbi8vICAgICAgIHN2Z1xyXG4vLyAgICAgICAgIC5zZWxlY3RBbGwoJ2cueDEuYXhpczEgZy50aWNrIHRleHQnKVxyXG4vLyAgICAgICAgIC5jbGFzc2VkKCdtb2JpbGUteGF4aXMtb3ZlcnJpZGUnLCB0cnVlKTtcclxuLy8gICAgIH1cclxuLy8gICAgIC8qKnkgc2NhbGUgZm9yIGxlZnQgeSBheGlzICovXHJcbi8vICAgICB2YXIgeSA9IGQzLnNjYWxlTGluZWFyKCkucmFuZ2VSb3VuZChbaGVpZ2h0LCAwXSk7XHJcbi8vICAgICB2YXIgbWF4VmFsdWUgPSBkMy5tYXgoZGF0YSwgKGQpID0+IGQzLm1heChrZXlMaXN0LCAoa2V5KSA9PiArZFtrZXldKSk7XHJcbi8vICAgICBpZiAobWF4VmFsdWUgPT0gMCkge1xyXG4vLyAgICAgICBpZiAodGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEpIHtcclxuLy8gICAgICAgICBtYXhWYWx1ZSA9IHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLnRhcmdldCArIDIwO1xyXG4vLyAgICAgICB9IGVsc2Uge1xyXG4vLyAgICAgICAgIG1heFZhbHVlID0gMTAwO1xyXG4vLyAgICAgICB9XHJcbi8vICAgICB9XHJcblxyXG4vLyAgICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmN1c3RvbVlzY2FsZSkge1xyXG4vLyAgICAgICAvKipcclxuLy8gICAgICAgICogaW5jcmVhc2UgeS1zY2FsZSBzbyB0aGF0IHZhbHVlcyB3b250IGNyb3NzIG9yIGV4Y2VlZCBvdXQgb2YgcmFuZ2VcclxuLy8gICAgICAgICogdXNlZCBpbiB3ZWVrbHkgY2hhcnRzXHJcbi8vICAgICAgICAqL1xyXG4vLyAgICAgICBtYXhWYWx1ZSA9IG1heFZhbHVlICogdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uY3VzdG9tWXNjYWxlO1xyXG4vLyAgICAgfVxyXG4vLyAgICAgaWYgKFxyXG4vLyAgICAgICB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YSAmJlxyXG4vLyAgICAgICBtYXhWYWx1ZSA8IHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLnRhcmdldFxyXG4vLyAgICAgKSB7XHJcbi8vICAgICAgIG1heFZhbHVlID1cclxuLy8gICAgICAgICBtYXhWYWx1ZSA8IDEwICYmIHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLnRhcmdldCA8IDEwXHJcbi8vICAgICAgICAgICA/IHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLnRhcmdldCArIDNcclxuLy8gICAgICAgICAgIDogdGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEudGFyZ2V0ICsgMjA7XHJcbi8vICAgICB9XHJcbi8vICAgICB5LmRvbWFpbihbMCwgbWF4VmFsdWVdKS5uaWNlKCk7XHJcbi8vICAgICBsZXQgbGluZVlzY2FsZTtcclxuXHJcbi8vICAgICBpZiAobGluZURhdGEgIT0gbnVsbCkge1xyXG4vLyAgICAgICBsZXQgbWF4TGluZVZhbHVlID0gZDMubWF4KGxpbmVEYXRhLCBmdW5jdGlvbiAoZCkge1xyXG4vLyAgICAgICAgIHJldHVybiArZC52YWx1ZTtcclxuLy8gICAgICAgfSk7XHJcblxyXG4vLyAgICAgICBtYXhMaW5lVmFsdWUgPSBtYXhMaW5lVmFsdWUgKiB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXN0b21Zc2NhbGU7XHJcblxyXG4vLyAgICAgICBsZXQgbWluTGluZVZhbHVlID0gZDMubWluKGxpbmVEYXRhLCBmdW5jdGlvbiAoZCkge1xyXG4vLyAgICAgICAgIHJldHVybiArZC52YWx1ZTtcclxuLy8gICAgICAgfSk7XHJcbi8vICAgICAgIGlmIChtYXhMaW5lVmFsdWUgPiAwKSBtaW5MaW5lVmFsdWUgPSBtaW5MaW5lVmFsdWUgLSAzO1xyXG4vLyAgICAgICBpZiAobWluTGluZVZhbHVlID4gMCkge1xyXG4vLyAgICAgICAgIG1pbkxpbmVWYWx1ZSA9IDA7XHJcbi8vICAgICAgIH1cclxuLy8gICAgICAgbGluZVlzY2FsZSA9IGQzXHJcbi8vICAgICAgICAgLnNjYWxlTGluZWFyKClcclxuLy8gICAgICAgICAuZG9tYWluKFttaW5MaW5lVmFsdWUsIG1heExpbmVWYWx1ZV0pXHJcbi8vICAgICAgICAgLnJhbmdlKFtoZWlnaHQsIG1pbkxpbmVWYWx1ZV0pO1xyXG4vLyAgICAgfVxyXG4vLyAgICAgbGV0IHlMaW5lQXhpcztcclxuLy8gICAgIGlmIChsaW5lWXNjYWxlICE9IG51bGwpIHtcclxuLy8gICAgICAgeUxpbmVBeGlzID0gZDNcclxuLy8gICAgICAgICAuYXhpc1JpZ2h0KGxpbmVZc2NhbGUpXHJcbi8vICAgICAgICAgLnRpY2tzKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLm51bWJlck9mWVRpY2tzKVxyXG4vLyAgICAgICAgIC50aWNrU2l6ZSgwKVxyXG4vLyAgICAgICAgIC50aWNrRm9ybWF0KHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnlMaW5lQXhpc0xhYmVsRm9tYXR0ZXIpO1xyXG4vLyAgICAgfVxyXG4vLyAgICAgLyoqXHJcbi8vICAgICAgKiBzaG93IHgtYXhpcyBncmlkIGJldHdlZW4gbGFiZWxzXHJcbi8vICAgICAgKiB1c2VkIGJ5IHdlZWtseSBjaGFydHNcclxuLy8gICAgICAqL1xyXG4vLyAgICAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmlzWGdyaWRCZXR3ZWVuTGFiZWxzKSB7XHJcbi8vICAgICAgIHN2Z1xyXG4vLyAgICAgICAgIC5hcHBlbmQoJ2cnKVxyXG4vLyAgICAgICAgIC5hdHRyKCdjbGFzcycsICdncmlkJylcclxuLy8gICAgICAgICAuYXR0cihcclxuLy8gICAgICAgICAgICd0cmFuc2Zvcm0nLFxyXG4vLyAgICAgICAgICAgJ3RyYW5zbGF0ZSgnICsgeC5iYW5kd2lkdGgoKSAvIDIgKyAnLCcgKyBoZWlnaHQgKyAnKSdcclxuLy8gICAgICAgICApXHJcbi8vICAgICAgICAgLmNhbGwoZDMuYXhpc0JvdHRvbSh4KS50aWNrU2l6ZSgtaGVpZ2h0KS50aWNrRm9ybWF0KCcnKSlcclxuLy8gICAgICAgICAuc3R5bGUoJ3N0cm9rZS1kYXNoYXJyYXknLCAnNSA1JylcclxuLy8gICAgICAgICAuc3R5bGUoJ2NvbG9yJywgJ3ZhcigtLWNoYXJ0LWdyaWQtY29sb3IsICM5OTk5OTkpJykgLy8gVXNlIENTUyB2YXJpYWJsZVxyXG4vLyAgICAgICAgIC5jYWxsKChnKSA9PiBnLnNlbGVjdCgnLmRvbWFpbicpLnJlbW92ZSgpKTtcclxuLy8gICAgIH1cclxuXHJcbi8vICAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNHcmlkKSB7XHJcbi8vICAgICAgIHN2Z1xyXG4vLyAgICAgICAgIC5hcHBlbmQoJ2cnKVxyXG4vLyAgICAgICAgIC5jYWxsKFxyXG4vLyAgICAgICAgICAgZDNcclxuLy8gICAgICAgICAgICAgLmF4aXNMZWZ0KHkpXHJcbi8vICAgICAgICAgICAgIC50aWNrcyhzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5udW1iZXJPZllUaWNrcylcclxuLy8gICAgICAgICAgICAgLnRpY2tTaXplKC13aWR0aClcclxuLy8gICAgICAgICApXHJcbi8vICAgICAgICAgLnN0eWxlKCdjb2xvcicsICd2YXIoLS1jaGFydC1heGlzLWNvbG9yLCAjQjlCOUI5KScpXHJcbi8vICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgJzAuNScpXHJcbi8vICAgICAgICAgLmNhbGwoKGcpID0+IHtcclxuLy8gICAgICAgICAgIGcuc2VsZWN0KCcuZG9tYWluJylcclxuLy8gICAgICAgICAgICAgLnJlbW92ZSgpXHJcbi8vICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgJ3ZhcigtLWNoYXJ0LWRvbWFpbi1jb2xvciwgIzAwMDAwMCknKTsgLy8gQWRkIENTUyB2YXJpYWJsZSBmb3IgZG9tYWluXHJcbi8vICAgICAgICAgfSk7XHJcbi8vICAgICB9IGVsc2Uge1xyXG4vLyAgICAgICBzdmdcclxuLy8gICAgICAgICAuYXBwZW5kKCdnJylcclxuLy8gICAgICAgICAuY2FsbChkMy5heGlzTGVmdCh5KS50aWNrcyhzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5udW1iZXJPZllUaWNrcykpXHJcbi8vICAgICAgICAgLnN0eWxlKCdjb2xvcicsICd2YXIoLS1jaGFydC1heGlzLWNvbG9yLCAjQjlCOUI5KScpXHJcbi8vICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgJzAuNScpXHJcbi8vICAgICAgICAgLmNhbGwoKGcpID0+IHtcclxuLy8gICAgICAgICAgIGcuc2VsZWN0KCcuZG9tYWluJylcclxuLy8gICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCAndmFyKC0tY2hhcnQtZG9tYWluLWNvbG9yLCAjMDAwMDAwKScpIC8vIEFkZCBDU1MgdmFyaWFibGUgZm9yIGRvbWFpblxyXG4vLyAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsICcxcHgnKTsgLy8gRW5zdXJlIHZpc2liaWxpdHlcclxuLy8gICAgICAgICB9KTtcclxuLy8gICAgIH1cclxuXHJcbi8vICAgICB2YXIgeFN1Ymdyb3VwID0gZDMuc2NhbGVCYW5kKCkuZG9tYWluKHN1Ymdyb3Vwcyk7XHJcbi8vICAgICBpZiAoc3ViZ3JvdXBzLmxlbmd0aCA+IDEgJiYgIXRoaXMuaXNab29tZWRPdXQpIHtcclxuLy8gICAvLyBGb3IgZ3JvdXBlZCBiYXIgY2hhcnRzIGluIHpvb20taW4gdmlldywgdXNlIGZ1bGwgeC5iYW5kd2lkdGgoKSBmb3Igc3ViZ3JvdXBzXHJcbi8vICAgeFN1Ymdyb3VwLnJhbmdlKFswLCB4LmJhbmR3aWR0aCgpXSk7XHJcbi8vICAgICB9IGVsc2UgaWYgKHN1Ymdyb3Vwcy5sZW5ndGggPT09IDEgJiYgIXRoaXMuaXNab29tZWRPdXQpIHtcclxuLy8gICAgICAgLy8gRm9yIHNpbmdsZS1iYXIgKG5vbi1ncm91cGVkKSBjaGFydHMgaW4gem9vbS1pbiB2aWV3LCBzZXQgYmFyIHdpZHRoIHRvIDEwMCAoaW5jcmVhc2VkIGZyb20gODApXHJcbi8vICAgICAgIHhTdWJncm91cC5yYW5nZShbMCwgMTAwXSk7XHJcbi8vICAgICB9IGVsc2UgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzTXVsdGlDaGFydEdyaWRMaW5lID09IHVuZGVmaW5lZCkge1xyXG4vLyAgICAgICB4U3ViZ3JvdXAucmFuZ2UoWzAsIHguYmFuZHdpZHRoKCldKTtcclxuLy8gICAgIH0gZWxzZSB7XHJcbi8vICAgICAgIC8vIHVzZWQgdG8gbWFrZSBncm91cGVkIGJhcnMgd2l0aCBsZXNzZXIgd2lkdGggYXMgd2UgYXJlIG5vdCB1c2luZyBwYWRkaW5nIGZvciB3aWR0aFxyXG4vLyAgICAgICB4U3ViZ3JvdXAucmFuZ2UoWzAsIHguYmFuZHdpZHRoKCldKTtcclxuLy8gICAgIH1cclxuLy8gICAgIC8vIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0RyaWxsZG93bkNoYXJ0KSB7XHJcblxyXG4vLyAgICAgLy8gfVxyXG4vLyAgICAgdmFyIGNvbG9yID0gZDNcclxuLy8gICAgICAgLnNjYWxlT3JkaW5hbCgpXHJcbi8vICAgICAgIC5kb21haW4oc3ViZ3JvdXBzKVxyXG4vLyAgICAgICAucmFuZ2UoT2JqZWN0LnZhbHVlcyhtZXRhRGF0YS5jb2xvcnMpKTtcclxuLy8gICAgIC8vIHZhciBjb2xvckFib3ZlVGFyZ2V0ID0gZDNcclxuLy8gICAgIC8vICAgLnNjYWxlT3JkaW5hbCgpXHJcbi8vICAgICAvLyAgIC5kb21haW4oc3ViZ3JvdXBzKVxyXG4vLyAgICAgLy8gICAucmFuZ2UoT2JqZWN0LnZhbHVlcyhtZXRhRGF0YS5jb2xvckFib3ZlVGFyZ2V0KSk7XHJcbi8vICAgICB2YXIgc3RhdGUgPSBzdmdcclxuLy8gICAgICAgLmFwcGVuZCgnZycpXHJcbi8vICAgICAgIC5zZWxlY3RBbGwoJy5zdGF0ZScpXHJcbi8vICAgICAgIC5kYXRhKGRhdGEpXHJcbi8vICAgICAgIC5lbnRlcigpXHJcbi8vICAgICAgIC5hcHBlbmQoJ2cnKVxyXG4vLyAgICAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24gKGQpIHtcclxuLy8gICAgICAgICByZXR1cm4gJ3RyYW5zbGF0ZSgnICsgeChkLm5hbWUpICsgJywwKSc7XHJcbi8vICAgICAgIH0pO1xyXG4vLyAgICAgc3RhdGVcclxuLy8gICAgICAgLnNlbGVjdEFsbCgncmVjdCcpXHJcbi8vICAgICAgIC5kYXRhKGZ1bmN0aW9uIChkKSB7XHJcbi8vICAgICAgICAgbGV0IG5ld0xpc3Q6IGFueSA9IFtdO1xyXG4vLyAgICAgICAgIHN1Ymdyb3Vwcy5tYXAoZnVuY3Rpb24gKGtleSkge1xyXG4vLyAgICAgICAgICAgLy8gaWYgKGtleSAhPT0gXCJncm91cFwiKSB7XHJcbi8vICAgICAgICAgICBsZXQgb2JqOiBhbnkgPSB7IGtleToga2V5LCB2YWx1ZTogZFtrZXldLCBuYW1lOiBkLm5hbWUgfTtcclxuLy8gICAgICAgICAgIG5ld0xpc3QucHVzaChvYmopO1xyXG4vLyAgICAgICAgICAgLy8gfVxyXG4vLyAgICAgICAgIH0pO1xyXG4vLyAgICAgICAgIHJldHVybiBuZXdMaXN0O1xyXG4vLyAgICAgICB9KVxyXG4vLyAgICAgICAuZW50ZXIoKVxyXG4vLyAgICAgICAuYXBwZW5kKCdyZWN0JylcclxuLy8gICAgICAgLmF0dHIoJ2NsYXNzJywgJ2JhcnMnKVxyXG4vLyAgICAgICAub24oJ2NsaWNrJywgZnVuY3Rpb24gKGQpIHtcclxuLy8gICAgICAgICBpZiAoZC5rZXkgIT0gJ1RhcmdldCcpIHtcclxuLy8gICAgICAgICAgIGlmIChcclxuLy8gICAgICAgICAgICAgIW1ldGFEYXRhLmJhcldpdGhvdXRDbGljayB8fFxyXG4vLyAgICAgICAgICAgICAhbWV0YURhdGEuYmFyV2l0aG91dENsaWNrLmxlbmd0aCB8fFxyXG4vLyAgICAgICAgICAgICAoIW1ldGFEYXRhLmJhcldpdGhvdXRDbGljay5pbmNsdWRlcyhkPy5uYW1lKSAmJlxyXG4vLyAgICAgICAgICAgICAgICFtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2suaW5jbHVkZXMoZD8ua2V5KSlcclxuLy8gICAgICAgICAgIClcclxuLy8gICAgICAgICAgICAgLy8gc2VsZi5oYW5kbGVDbGljayhkLmRhdGEubmFtZSk7XHJcbi8vICAgICAgICAgICAgIHNlbGYuaGFuZGxlQ2xpY2soZCk7XHJcbi8vICAgICAgICAgfVxyXG4vLyAgICAgICB9KVxyXG4vLyAgICAgICAuYXR0cigneCcsIGZ1bmN0aW9uIChkKSB7XHJcbi8vICAgICAgICAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmlzRHJpbGxkb3duQ2hhcnQpIHtcclxuLy8gICAgICAgICAgIGRhdGEubWFwKChpbmRpdjogYW55KSA9PiB7XHJcbi8vICAgICAgICAgICAgIGlmIChpbmRpdi5uYW1lID09IGQubmFtZSkge1xyXG4vLyAgICAgICAgICAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMoaW5kaXYpLmZpbHRlcigodGVtcCwgaSkgPT4gaSAhPSAwKTtcclxuLy8gICAgICAgICAgICAgICB0ZW1wU2NhbGUgPSBkMy5zY2FsZUJhbmQoKS5kb21haW4oa2V5cykucmFuZ2UoWzAsIHguYmFuZHdpZHRoKCldKTtcclxuLy8gICAgICAgICAgICAgICBpZiAoeC5iYW5kd2lkdGgoKSA+IDEwMCkge1xyXG4vLyAgICAgICAgICAgICAgICAgLy8gSW5jcmVhc2UgYmFyIHdpZHRoIGEgYml0IGluIHpvb20taW4gdmlld1xyXG4vLyAgICAgICAgICAgICAgICAgbGV0IHJlZHVjZWRCYXJXaWR0aCA9IDYwO1xyXG4vLyAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLmlzWm9vbWVkT3V0KSB7XHJcbi8vICAgICAgICAgICAgICAgICAgIHJlZHVjZWRCYXJXaWR0aCA9IDMwO1xyXG4vLyAgICAgICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY2hhcnREYXRhLmRhdGEubGVuZ3RoID09IDEpIHtcclxuLy8gICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHNlbGYuY2hhcnREYXRhLmRhdGFbMF0pLmxlbmd0aCA9PSAyKSB7XHJcbi8vICAgICAgICAgICAgICAgICAgICAgdGVtcFNjYWxlLnJhbmdlKFtcclxuLy8gICAgICAgICAgICAgICAgICAgICAgIDAgKyAoeC5iYW5kd2lkdGgoKSAtIHJlZHVjZWRCYXJXaWR0aCkgLyAyLFxyXG4vLyAgICAgICAgICAgICAgICAgICAgICAgeC5iYW5kd2lkdGgoKSAtICh4LmJhbmR3aWR0aCgpIC0gcmVkdWNlZEJhcldpZHRoKSAvIDIsXHJcbi8vICAgICAgICAgICAgICAgICAgICAgXSk7XHJcbi8vICAgICAgICAgICAgICAgICAgIH0gZWxzZVxyXG4vLyAgICAgICAgICAgICAgICAgICAgIHRlbXBTY2FsZS5yYW5nZShbXHJcbi8vICAgICAgICAgICAgICAgICAgICAgICAwICsgKHguYmFuZHdpZHRoKCkgLSByZWR1Y2VkQmFyV2lkdGgpIC8gMixcclxuLy8gICAgICAgICAgICAgICAgICAgICAgIHguYmFuZHdpZHRoKCkgLSAoeC5iYW5kd2lkdGgoKSAtIHJlZHVjZWRCYXJXaWR0aCkgLyAyLFxyXG4vLyAgICAgICAgICAgICAgICAgICAgIF0pO1xyXG4vLyAgICAgICAgICAgICAgICAgfSBlbHNlXHJcbi8vICAgICAgICAgICAgICAgICAgIHRlbXBTY2FsZS5yYW5nZShbXHJcbi8vICAgICAgICAgICAgICAgICAgICAgMCArICh4LmJhbmR3aWR0aCgpIC0gcmVkdWNlZEJhcldpZHRoKSAvIDIsXHJcbi8vICAgICAgICAgICAgICAgICAgICAgeC5iYW5kd2lkdGgoKSAtICh4LmJhbmR3aWR0aCgpIC0gcmVkdWNlZEJhcldpZHRoKSAvIDIsXHJcbi8vICAgICAgICAgICAgICAgICAgIF0pO1xyXG4vLyAgICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgfSk7XHJcbi8vICAgICAgICAgICByZXR1cm4gdGVtcFNjYWxlKGQua2V5KTtcclxuLy8gICAgICAgICB9XHJcbi8vICAgICAgICAgcmV0dXJuIHhTdWJncm91cChkLmtleSk7XHJcbi8vICAgICAgIH0pXHJcbi8vICAgICAgIC5hdHRyKCd5JywgZnVuY3Rpb24gKGQpIHtcclxuLy8gICAgICAgICBpZiAoZC52YWx1ZSA9PSAtMSkge1xyXG4vLyAgICAgICAgICAgcmV0dXJuIHkoMCk7XHJcbi8vICAgICAgICAgfVxyXG5cclxuLy8gICAgICAgICBpZiAoZC52YWx1ZSA+PSAwKSB7XHJcbi8vICAgICAgICAgICBjb25zdCBiYXJIZWlnaHQgPSBoZWlnaHQgLSB5KGQudmFsdWUpO1xyXG4vLyAgICAgICAgICAgY29uc3QgbWluSGVpZ2h0ID0gc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uZGVmYXVsdEJhckhlaWdodCB8fCAyO1xyXG4vLyAgICAgICAgICAgcmV0dXJuIGJhckhlaWdodCA8IG1pbkhlaWdodCA/IHkoMCkgLSBtaW5IZWlnaHQgOiB5KGQudmFsdWUpO1xyXG4vLyAgICAgICAgIH1cclxuXHJcbi8vICAgICAgICAgcmV0dXJuIHkoMCk7XHJcbi8vICAgICAgIH0pXHJcbi8vICAgICAgIC5hdHRyKCd3aWR0aCcsIGZ1bmN0aW9uIChkKSB7XHJcbi8vICAgICAgICAgLy8gRm9yIGdyb3VwZWQgYmFyIGNoYXJ0cyBpbiB6b29tLWluIHZpZXcsIHNldCBiYXIgd2lkdGggdG8gNTAgZm9yIG1heGltdW0gdGhpY2tuZXNzXHJcbi8vICAgICAgICAgaWYgKHN1Ymdyb3Vwcy5sZW5ndGggPiAxICYmICFzZWxmLmlzWm9vbWVkT3V0KSB7XHJcbi8vICAgICAgICAgICByZXR1cm4gNTA7XHJcbi8vICAgICAgICAgfVxyXG4vLyAgICAgICAgIC8vIEZvciBzaW5nbGUtYmFyIChub24tZ3JvdXBlZCkgY2hhcnRzIGluIHpvb20taW4gdmlldywgc2V0IGJhciB3aWR0aCB0byA4MFxyXG4vLyAgICAgICAgIGlmIChzdWJncm91cHMubGVuZ3RoID09PSAxICYmICFzZWxmLmlzWm9vbWVkT3V0KSB7XHJcbi8vICAgICAgICAgICByZXR1cm4gODA7XHJcbi8vICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgbGV0IHRlbXBTY2FsZSA9IGQzLnNjYWxlQmFuZCgpLmRvbWFpbihbXSkucmFuZ2UoWzAsIDBdKTtcclxuLy8gICAgICAgICAvLyBEZWZhdWx0IGxvZ2ljIGZvciBvdGhlciBjaGFydCB0eXBlc1xyXG4vLyAgICAgICAgIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0RyaWxsZG93bkNoYXJ0KSB7XHJcbi8vICAgICAgICAgICBkYXRhLm1hcCgoaW5kaXY6IGFueSkgPT4ge1xyXG4vLyAgICAgICAgICAgICBpZiAoaW5kaXYubmFtZSA9PSBkLm5hbWUpIHtcclxuLy8gICAgICAgICAgICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKGluZGl2KS5maWx0ZXIoKHRlbXAsIGkpID0+IGkgIT0gMCk7XHJcbi8vICAgICAgICAgICAgICAgdGVtcFNjYWxlID0gZDMuc2NhbGVCYW5kKCkuZG9tYWluKGtleXMpLnJhbmdlKFswLCB4LmJhbmR3aWR0aCgpXSk7XHJcbi8vICAgICAgICAgICAgICAgaWYgKHguYmFuZHdpZHRoKCkgPiAxMDApIHtcclxuLy8gICAgICAgICAgICAgICAgIC8vIEluY3JlYXNlIGJhciB3aWR0aCBhIGJpdCBpbiB6b29tLWluIHZpZXdcclxuLy8gICAgICAgICAgICAgICAgIGxldCByZWR1Y2VkQmFyV2lkdGggPSA2MDtcclxuLy8gICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc1pvb21lZE91dCkge1xyXG4vLyAgICAgICAgICAgICAgICAgICByZWR1Y2VkQmFyV2lkdGggPSAxMDA7XHJcbi8vICAgICAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jaGFydERhdGEuZGF0YS5sZW5ndGggPT0gMSkge1xyXG4vLyAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoc2VsZi5jaGFydERhdGEuZGF0YVswXSkubGVuZ3RoID09IDIpIHtcclxuLy8gICAgICAgICAgICAgICAgICAgICB0ZW1wU2NhbGUucmFuZ2UoW1xyXG4vLyAgICAgICAgICAgICAgICAgICAgICAgMCArICh4LmJhbmR3aWR0aCgpIC0gcmVkdWNlZEJhcldpZHRoKSAvIDIsXHJcbi8vICAgICAgICAgICAgICAgICAgICAgICB4LmJhbmR3aWR0aCgpIC0gKHguYmFuZHdpZHRoKCkgLSByZWR1Y2VkQmFyV2lkdGgpIC8gMixcclxuLy8gICAgICAgICAgICAgICAgICAgICBdKTtcclxuLy8gICAgICAgICAgICAgICAgICAgfSBlbHNlXHJcbi8vICAgICAgICAgICAgICAgICAgICAgdGVtcFNjYWxlLnJhbmdlKFtcclxuLy8gICAgICAgICAgICAgICAgICAgICAgIDAgKyAoeC5iYW5kd2lkdGgoKSAtIHJlZHVjZWRCYXJXaWR0aCkgLyAyLFxyXG4vLyAgICAgICAgICAgICAgICAgICAgICAgeC5iYW5kd2lkdGgoKSAtICh4LmJhbmR3aWR0aCgpIC0gcmVkdWNlZEJhcldpZHRoKSAvIDIsXHJcbi8vICAgICAgICAgICAgICAgICAgICAgXSk7XHJcbi8vICAgICAgICAgICAgICAgICB9IGVsc2VcclxuLy8gICAgICAgICAgICAgICAgICAgdGVtcFNjYWxlLnJhbmdlKFtcclxuLy8gICAgICAgICAgICAgICAgICAgICAwICsgKHguYmFuZHdpZHRoKCkgLSByZWR1Y2VkQmFyV2lkdGgpIC8gMixcclxuLy8gICAgICAgICAgICAgICAgICAgICB4LmJhbmR3aWR0aCgpIC0gKHguYmFuZHdpZHRoKCkgLSByZWR1Y2VkQmFyV2lkdGgpIC8gMixcclxuLy8gICAgICAgICAgICAgICAgICAgXSk7XHJcbi8vICAgICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICB9KTtcclxuLy8gICAgICAgICAgIHJldHVybiBzZWxmLmlzWm9vbWVkT3V0XHJcbi8vICAgICAgICAgICAgID8gdGVtcFNjYWxlLmJhbmR3aWR0aCgpXHJcbi8vICAgICAgICAgICAgIDogc2VsZi5jaGFydERhdGEuZGF0YS5sZW5ndGggJiYgc2VsZi5jaGFydERhdGEuZGF0YS5sZW5ndGggPiA4XHJcbi8vICAgICAgICAgICAgID8gdGVtcFNjYWxlLmJhbmR3aWR0aCgpIFxyXG4vLyAgICAgICAgICAgICA6IHRlbXBTY2FsZS5iYW5kd2lkdGgoKTtcclxuLy8gICAgICAgICB9XHJcbi8vICAgICAgICAgcmV0dXJuIHNlbGYuaXNab29tZWRPdXRcclxuLy8gICAgICAgICAgID8gdGVtcFNjYWxlLmJhbmR3aWR0aCgpXHJcbi8vICAgICAgICAgICA6IHNlbGYuY2hhcnREYXRhLmRhdGEubGVuZ3RoICYmIHNlbGYuY2hhcnREYXRhLmRhdGEubGVuZ3RoID4gOFxyXG4vLyAgICAgICAgICAgPyB0ZW1wU2NhbGUuYmFuZHdpZHRoKClcclxuLy8gICAgICAgICAgIDogdGVtcFNjYWxlLmJhbmR3aWR0aCgpO1xyXG4vLyAgICAgICB9KVxyXG4vLyAgICAgICAuYXR0cignaGVpZ2h0JywgZnVuY3Rpb24gKGQpIHtcclxuLy8gICAgICAgICBpZiAoZC52YWx1ZSA9PSAtMSkge1xyXG4vLyAgICAgICAgICAgcmV0dXJuIGhlaWdodCAtIHkoMCk7XHJcbi8vICAgICAgICAgfVxyXG5cclxuLy8gICAgICAgICBpZiAoZC52YWx1ZSA+PSAwKSB7XHJcbi8vICAgICAgICAgICBjb25zdCBiYXJIZWlnaHQgPSBoZWlnaHQgLSB5KGQudmFsdWUpO1xyXG4vLyAgICAgICAgICAgY29uc3QgbWluSGVpZ2h0ID0gc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uZGVmYXVsdEJhckhlaWdodCB8fCAyO1xyXG4vLyAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KGJhckhlaWdodCwgbWluSGVpZ2h0KTtcclxuLy8gICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgIHJldHVybiBoZWlnaHQgLSB5KDApO1xyXG4vLyAgICAgICB9KVxyXG4vLyAgICAgICAuc3R5bGUoJ2N1cnNvcicsIGZ1bmN0aW9uIChkKSB7XHJcbi8vICAgICAgICAgaWYgKG1ldGFEYXRhLmhhc0RyaWxsRG93biAmJiAhaXNyaWEpIHJldHVybiAncG9pbnRlcic7XHJcbi8vICAgICAgICAgICBlbHNlIHJldHVybiAnZGVmYXVsdCc7XHJcbi8vICAgICAgIH0pXHJcbi8vICAgICAgIC5hdHRyKCdmaWxsJywgZnVuY3Rpb24gKGQpIHtcclxuLy8gICAgICAgICBpZiAoXHJcbi8vICAgICAgICAgICBkLnZhbHVlICYmXHJcbi8vICAgICAgICAgICBzZWxmLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YSAmJlxyXG4vLyAgICAgICAgICAgZC52YWx1ZSA+PSBwYXJzZUZsb2F0KHNlbGYuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLnRhcmdldCkgJiZcclxuLy8gICAgICAgICAgIHNlbGYuY2hhcnREYXRhLm1ldGFEYXRhLmNvbG9yQWJvdmVUYXJnZXRcclxuLy8gICAgICAgICApIHtcclxuLy8gICAgICAgICAgIGNvbnN0IGtleSA9IGQua2V5LnRvTG93ZXJDYXNlKCk7XHJcbi8vICAgICAgICAgICBjb25zdCBjb2xvckFib3ZlVGFyZ2V0ID0gT2JqZWN0LmtleXMoc2VsZi5jaGFydERhdGEubWV0YURhdGEuY29sb3JBYm92ZVRhcmdldCkuZmluZChcclxuLy8gICAgICAgICAgICAgayA9PiBrLnRvTG93ZXJDYXNlKCkgPT09IGtleVxyXG4vLyAgICAgICAgICAgKTtcclxuLy8gICAgICAgICAgIGlmIChjb2xvckFib3ZlVGFyZ2V0KSB7XHJcbi8vICAgICAgICAgICAgIHJldHVybiBzZWxmLmNoYXJ0RGF0YS5tZXRhRGF0YS5jb2xvckFib3ZlVGFyZ2V0W2NvbG9yQWJvdmVUYXJnZXRdO1xyXG4vLyAgICAgICAgICAgfVxyXG4vLyAgICAgICAgIH1cclxuLy8gICAgICAgICByZXR1cm4gc2VsZi5jaGFydERhdGEubWV0YURhdGEuY29sb3JzW2Qua2V5XTtcclxuLy8gICAgICAgfSk7XHJcblxyXG4vLyAgICAgLyoqXHJcbi8vICAgICAgKiBkaXNwbGF5IGFuZ2xlZCB0ZXh0cyBvbiB0aGUgYmFyc1xyXG4vLyAgICAgICovXHJcbi8vICAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24udGV4dHNPbkJhciAhPSB1bmRlZmluZWQgJiYgIXRoaXMuaXNab29tZWRPdXQpIHtcclxuLy8gICAgICAgc3RhdGVcclxuLy8gICAgICAgICAuc2VsZWN0QWxsKCd0ZXh0JylcclxuLy8gICAgICAgICAuZGF0YShmdW5jdGlvbiAoZCkge1xyXG4vLyAgICAgICAgICAgbGV0IG5ld0xpc3Q6IGFueSA9IFtdO1xyXG4vLyAgICAgICAgICAgc3ViZ3JvdXBzLm1hcChmdW5jdGlvbiAoa2V5KSB7XHJcbi8vICAgICAgICAgICAgIGxldCBvYmo6IGFueSA9IHsga2V5OiBrZXksIHZhbHVlOiBkW2tleV0sIG5hbWU6IGQubmFtZSB9O1xyXG4vLyAgICAgICAgICAgICBuZXdMaXN0LnB1c2gob2JqKTtcclxuLy8gICAgICAgICAgIH0pO1xyXG4vLyAgICAgICAgICAgcmV0dXJuIG5ld0xpc3Q7XHJcbi8vICAgICAgICAgfSlcclxuLy8gICAgICAgICAuZW50ZXIoKVxyXG4vLyAgICAgICAgIC5hcHBlbmQoJ3RleHQnKVxyXG4vLyAgICAgICAgIC5hdHRyKCdmaWxsJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJylcclxuLy8gICAgICAgICAuYXR0cigneCcsIGZ1bmN0aW9uIChkKSB7XHJcbi8vICAgICAgICAgICByZXR1cm4gMDtcclxuLy8gICAgICAgICB9KVxyXG4vLyAgICAgICAgIC5hdHRyKCd5JywgZnVuY3Rpb24gKGQpIHtcclxuLy8gICAgICAgICAgIHJldHVybiAwO1xyXG4vLyAgICAgICAgIH0pXHJcbi8vICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi1kYXRhLWxhYmVscy13ZWVrbHljaGFydHMnKVxyXG4vLyAgICAgICAgIC50ZXh0KGZ1bmN0aW9uIChkKSB7XHJcbi8vICAgICAgICAgICByZXR1cm4gZC5rZXkgJiYgZC52YWx1ZVxyXG4vLyAgICAgICAgICAgICA/IGQua2V5Lmxlbmd0aCA+IDIwXHJcbi8vICAgICAgICAgICAgICAgPyBkLmtleS5zdWJzdHJpbmcoMCwgMTcpICsgJy4uLidcclxuLy8gICAgICAgICAgICAgICA6IGQua2V5XHJcbi8vICAgICAgICAgICAgIDogJyc7XHJcbi8vICAgICAgICAgfSlcclxuLy8gICAgICAgICAuc3R5bGUoJ2ZpbGwnLCBmdW5jdGlvbiAoZCkge1xyXG4vLyAgICAgICAgICAgcmV0dXJuICcjMDAwJztcclxuLy8gICAgICAgICB9KVxyXG4vLyAgICAgICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnYm9sZCcpXHJcbi8vICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCBmdW5jdGlvbiAoZCkge1xyXG4vLyAgICAgICAgICAgaWYgKHNlbGYuaXNab29tZWRPdXQpIHtcclxuLy8gICAgICAgICAgICAgcmV0dXJuICc5cHgnOyAvLyDwn5GIIFpvb21lZCBvdXQgbW9kZVxyXG4vLyAgICAgICAgICAgfVxyXG5cclxuLy8gICAgICAgICAgIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0RyaWxsZG93bkNoYXJ0KSB7XHJcbi8vICAgICAgICAgICAgIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA+IDE5MDApIHtcclxuLy8gICAgICAgICAgICAgICByZXR1cm4gJzE4cHgnO1xyXG4vLyAgICAgICAgICAgICB9IGVsc2UgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDwgMTQwMCkge1xyXG4vLyAgICAgICAgICAgICAgIHJldHVybiAnMTBweCc7XHJcbi8vICAgICAgICAgICAgIH0gZWxzZSB7XHJcbi8vICAgICAgICAgICAgICAgcmV0dXJuICcxNHB4JztcclxuLy8gICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgfSBlbHNlIHtcclxuLy8gICAgICAgICAgICAgcmV0dXJuICcxNHB4JztcclxuLy8gICAgICAgICAgIH1cclxuLy8gICAgICAgICB9KVxyXG4vLyAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbiAoZCkge1xyXG4vLyAgICAgICAgICAgZGF0YS5tYXAoKGluZGl2OiBhbnkpID0+IHtcclxuLy8gICAgICAgICAgICAgaWYgKGluZGl2Lm5hbWUgPT0gZC5uYW1lKSB7XHJcbi8vICAgICAgICAgICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhpbmRpdikuZmlsdGVyKCh0ZW1wLCBpKSA9PiBpICE9IDApO1xyXG4vLyAgICAgICAgICAgICAgIHZhciB0ZW1wO1xyXG4vLyAgICAgICAgICAgICAgIHRlbXBTY2FsZSA9IGQzLnNjYWxlQmFuZCgpLmRvbWFpbihrZXlzKS5yYW5nZShbMCwgeC5iYW5kd2lkdGgoKV0pO1xyXG4vLyAgICAgICAgICAgICAgIGlmICh4LmJhbmR3aWR0aCgpID4gMTAwKSB7XHJcbi8vICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jaGFydERhdGEuZGF0YS5sZW5ndGggPT0gMSkge1xyXG4vLyAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoc2VsZi5jaGFydERhdGEuZGF0YVswXSkubGVuZ3RoID09IDIpIHtcclxuLy8gICAgICAgICAgICAgICAgICAgICB0ZW1wU2NhbGUucmFuZ2UoW1xyXG4vLyAgICAgICAgICAgICAgICAgICAgICAgMCArICh4LmJhbmR3aWR0aCgpIC0gMjAwKSAvIDIsXHJcbi8vICAgICAgICAgICAgICAgICAgICAgICB4LmJhbmR3aWR0aCgpIC0gKHguYmFuZHdpZHRoKCkgLSAyMDApIC8gMixcclxuLy8gICAgICAgICAgICAgICAgICAgICBdKTtcclxuLy8gICAgICAgICAgICAgICAgICAgICAvLyAucGFkZGluZygwLjA1KTtcclxuLy8gICAgICAgICAgICAgICAgICAgfSBlbHNlXHJcbi8vICAgICAgICAgICAgICAgICAgICAgdGVtcFNjYWxlLnJhbmdlKFtcclxuLy8gICAgICAgICAgICAgICAgICAgICAgIDAgKyAoeC5iYW5kd2lkdGgoKSAtIDMwMCkgLyAyLFxyXG4vLyAgICAgICAgICAgICAgICAgICAgICAgeC5iYW5kd2lkdGgoKSAtICh4LmJhbmR3aWR0aCgpIC0gMzAwKSAvIDIsXHJcbi8vICAgICAgICAgICAgICAgICAgICAgXSk7XHJcbi8vICAgICAgICAgICAgICAgICAgIC8vIC5wYWRkaW5nKDAuMDUpO1xyXG4vLyAgICAgICAgICAgICAgICAgfSBlbHNlXHJcbi8vICAgICAgICAgICAgICAgICAgIHRlbXBTY2FsZS5yYW5nZShbXHJcbi8vICAgICAgICAgICAgICAgICAgICAgMCArICh4LmJhbmR3aWR0aCgpIC0gMTI1KSAvIDIsXHJcbi8vICAgICAgICAgICAgICAgICAgICAgeC5iYW5kd2lkdGgoKSAtICh4LmJhbmR3aWR0aCgpIC0gMTI1KSAvIDIsXHJcbi8vICAgICAgICAgICAgICAgICAgIF0pO1xyXG4vLyAgICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgfSk7XHJcbi8vICAgICAgICAgICAvKipcclxuLy8gICAgICAgICAgICAqIGlmIHNldCwgdGhlbiBhbGwgdGV4dHMgbGwgYmUgaG9yaXpvbnRhbFxyXG4vLyAgICAgICAgICAgICovXHJcbi8vICAgICAgICAgICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24udGV4dEFsd2F5c0hvcml6b250YWwpIHtcclxuLy8gICAgICAgICAgICAgcmV0dXJuIChcclxuLy8gICAgICAgICAgICAgICAndHJhbnNsYXRlKCcgKyB4U3ViZ3JvdXAoZC5rZXkpICsgJywnICsgKHkoZC52YWx1ZSkgLSAzKSArICcpJ1xyXG4vLyAgICAgICAgICAgICApO1xyXG4vLyAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgLyoqXHJcbi8vICAgICAgICAgICAgKiByb3RhdGUgdGV4dHMgaGF2aW5nIG1vcmUgdGhhbiBvbmUgZGlnaXRzXHJcbi8vICAgICAgICAgICAgKi9cclxuLy8gICAgICAgICAgIC8vIGlmIChkLnZhbHVlID4gOSlcclxuLy8gICAgICAgICAgIGlmICghaXNOYU4odGVtcFNjYWxlKGQua2V5KSkpXHJcbi8vICAgICAgICAgICAgIHJldHVybiAoXHJcbi8vICAgICAgICAgICAgICAgJ3RyYW5zbGF0ZSgnICtcclxuLy8gICAgICAgICAgICAgICAodGVtcFNjYWxlKGQua2V5KSArIHRlbXBTY2FsZS5iYW5kd2lkdGgoKSAqIDAuNTUpICtcclxuLy8gICAgICAgICAgICAgICAnLCcgK1xyXG4vLyAgICAgICAgICAgICAgICh5KDApIC0gMTApICtcclxuLy8gICAgICAgICAgICAgICAnKSByb3RhdGUoMjcwKSdcclxuLy8gICAgICAgICAgICAgKTtcclxuLy8gICAgICAgICAgIHJldHVybiAndHJhbnNsYXRlKDAsMCknO1xyXG4vLyAgICAgICAgICAgLy8gZWxzZVxyXG4vLyAgICAgICAgICAgLy8gICByZXR1cm4gKFxyXG4vLyAgICAgICAgICAgLy8gICAgICd0cmFuc2xhdGUoJyArXHJcbi8vICAgICAgICAgICAvLyAgICAgKHRlbXBTY2FsZShkLmtleSkgKyB0ZW1wU2NhbGUuYmFuZHdpZHRoKCkgLyAyKSArXHJcbi8vICAgICAgICAgICAvLyAgICAgJywnICtcclxuLy8gICAgICAgICAgIC8vICAgICB5KDApICtcclxuLy8gICAgICAgICAgIC8vICAgICAnKSdcclxuLy8gICAgICAgICAgIC8vICAgKTtcclxuLy8gICAgICAgICB9KVxyXG4vLyAgICAgICAgIC5vbignY2xpY2snLCBmdW5jdGlvbiAoZCkge1xyXG4vLyAgICAgICAgICAgaWYgKFxyXG4vLyAgICAgICAgICAgICAhbWV0YURhdGEuYmFyV2l0aG91dENsaWNrIHx8XHJcbi8vICAgICAgICAgICAgICFtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2subGVuZ3RoIHx8XHJcbi8vICAgICAgICAgICAgICghbWV0YURhdGEuYmFyV2l0aG91dENsaWNrLmluY2x1ZGVzKGQ/Lm5hbWUpICYmXHJcbi8vICAgICAgICAgICAgICAgIW1ldGFEYXRhLmJhcldpdGhvdXRDbGljay5pbmNsdWRlcyhkPy5rZXkpKVxyXG4vLyAgICAgICAgICAgKVxyXG4vLyAgICAgICAgICAgICBzZWxmLmhhbmRsZUNsaWNrKGQpO1xyXG4vLyAgICAgICAgIH0pO1xyXG4vLyAgICAgICAgICAgICBpZiAoIWlzcmlhKSB7XHJcbi8vICAgICAgICAgICAgICAgICAgICAgc3RhdGVcclxuLy8gICAgICAgICAuc2VsZWN0QWxsKCcubGliLWRhdGEtbGFiZWxzLXdlZWtseWNoYXJ0cycpXHJcbi8vICAgICAgICAgLm9uKCdtb3VzZW91dCcsIGhhbmRsZU1vdXNlT3V0KVxyXG4vLyAgICAgICAgIC5vbignbW91c2VvdmVyJywgaGFuZGxlTW91c2VPdmVyKTtcclxuLy8gICAgICAgICAgICAgfVxyXG4vLyAgICAgfVxyXG4vLyAgICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmRpc3BsYXlUaXRsZU9uVG9wIHx8IChcclxuLy8gICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24udGV4dHNPbkJhciA9PSB1bmRlZmluZWQgJiZcclxuLy8gICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uZGlzcGxheVRpdGxlT25Ub3AgPT0gdW5kZWZpbmVkXHJcbi8vICAgICApKSB7XHJcblxyXG4vLyAgICAgICAgICAgICAgICAgICBpZiAoIWlzcmlhKSB7XHJcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVcclxuLy8gICAgICAgICAuc2VsZWN0QWxsKCdyZWN0JylcclxuLy8gICAgICAgICAub24oJ21vdXNlb3V0JywgaGFuZGxlTW91c2VPdXQpXHJcbi8vICAgICAgICAgLm9uKCdtb3VzZW92ZXInLCBoYW5kbGVNb3VzZU92ZXIpO1xyXG4vLyAgICAgICAgICAgICAgICAgICB9XHJcbi8vICAgICB9XHJcbi8vICAgICBmdW5jdGlvbiBoYW5kbGVNb3VzZU92ZXIoZCwgaSkge1xyXG4vLyAgICAgICBzdmcuc2VsZWN0QWxsKCcubGliLXZlcnRpY2Fsc3RhY2stdGl0bGUtb250b3AnKS5yZW1vdmUoKTtcclxuLy8gICAgICAgc3ZnXHJcbi8vICAgICAgICAgLmFwcGVuZCgnZm9yZWlnbk9iamVjdCcpXHJcbi8vICAgICAgICAgLmF0dHIoJ3gnLCBmdW5jdGlvbiAoKSB7XHJcbi8vICAgICAgICAgICAvLyAuLi5leGlzdGluZyBjb2RlIGZvciB0ZW1wU2NhbGUgY2FsY3VsYXRpb24uLi5cclxuLy8gICAgICAgICAgIHZhciBlbGVtZW50c0NvdW50ZXI7XHJcbi8vICAgICAgICAgICBkYXRhLm1hcCgoaW5kaXY6IGFueSkgPT4ge1xyXG4vLyAgICAgICAgICAgICBpZiAoaW5kaXYubmFtZSA9PSBkLm5hbWUpIHtcclxuLy8gICAgICAgICAgICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKGluZGl2KS5maWx0ZXIoKHRlbXAsIGkpID0+IGkgIT0gMCk7XHJcbi8vICAgICAgICAgICAgICAgZWxlbWVudHNDb3VudGVyID0ga2V5cy5sZW5ndGg7XHJcbi8vICAgICAgICAgICAgICAgdGVtcFNjYWxlID0gZDMuc2NhbGVCYW5kKCkuZG9tYWluKGtleXMpLnJhbmdlKFswLCB4LmJhbmR3aWR0aCgpXSk7XHJcbi8vICAgICAgICAgICAgICAgaWYgKHguYmFuZHdpZHRoKCkgPiAxMDApIHtcclxuLy8gICAgICAgICAgICAgICAgIGlmIChzZWxmLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aCA9PSAxKSB7XHJcbi8vICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhzZWxmLmNoYXJ0RGF0YS5kYXRhWzBdKS5sZW5ndGggPT0gMikge1xyXG4vLyAgICAgICAgICAgICAgICAgICAgIHRlbXBTY2FsZS5yYW5nZShbXHJcbi8vICAgICAgICAgICAgICAgICAgICAgICAwICsgKHguYmFuZHdpZHRoKCkgLSAyMDApIC8gMixcclxuLy8gICAgICAgICAgICAgICAgICAgICAgIHguYmFuZHdpZHRoKCkgLSAoeC5iYW5kd2lkdGgoKSAtIDIwMCkgLyAyLFxyXG4vLyAgICAgICAgICAgICAgICAgICAgIF0pO1xyXG4vLyAgICAgICAgICAgICAgICAgICB9IGVsc2VcclxuLy8gICAgICAgICAgICAgICAgICAgICB0ZW1wU2NhbGUucmFuZ2UoW1xyXG4vLyAgICAgICAgICAgICAgICAgICAgICAgMCArICh4LmJhbmR3aWR0aCgpIC0gMzAwKSAvIDIsXHJcbi8vICAgICAgICAgICAgICAgICAgICAgICB4LmJhbmR3aWR0aCgpIC0gKHguYmFuZHdpZHRoKCkgLSAzMDApIC8gMixcclxuLy8gICAgICAgICAgICAgICAgICAgICBdKTtcclxuLy8gICAgICAgICAgICAgICAgIH0gZWxzZVxyXG4vLyAgICAgICAgICAgICAgICAgICB0ZW1wU2NhbGUucmFuZ2UoW1xyXG4vLyAgICAgICAgICAgICAgICAgICAgIDAgKyAoeC5iYW5kd2lkdGgoKSAtIDEyNSkgLyAyLFxyXG4vLyAgICAgICAgICAgICAgICAgICAgIHguYmFuZHdpZHRoKCkgLSAoeC5iYW5kd2lkdGgoKSAtIDEyNSkgLyAyLFxyXG4vLyAgICAgICAgICAgICAgICAgICBdKTtcclxuLy8gICAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgIH0pO1xyXG4vLyAgICAgICAgICAgaWYgKG1ldGFEYXRhLmhhc0RyaWxsRG93bikge1xyXG4vLyAgICAgICAgICAgICBpZiAodGVtcFNjYWxlLmJhbmR3aWR0aCgpICsgbGVmdEFuZFJpZ2h0U3BhY2VzICogMiA+IDE4MCkge1xyXG4vLyAgICAgICAgICAgICAgIHJldHVybiAoXHJcbi8vICAgICAgICAgICAgICAgICB4KGQubmFtZSkgKyB0ZW1wU2NhbGUoZC5rZXkpICsgdGVtcFNjYWxlLmJhbmR3aWR0aCgpIC8gMiAtIDkwXHJcbi8vICAgICAgICAgICAgICAgKTtcclxuLy8gICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgICByZXR1cm4gKFxyXG4vLyAgICAgICAgICAgICAgIHgoZC5uYW1lKSArXHJcbi8vICAgICAgICAgICAgICAgdGVtcFNjYWxlKGQua2V5KSAtXHJcbi8vICAgICAgICAgICAgICAgKHRlbXBTY2FsZS5iYW5kd2lkdGgoKSArIGxlZnRBbmRSaWdodFNwYWNlcyAqIDIpIC8gMiArXHJcbi8vICAgICAgICAgICAgICAgdGVtcFNjYWxlLmJhbmR3aWR0aCgpIC8gMlxyXG4vLyAgICAgICAgICAgICApO1xyXG4vLyAgICAgICAgICAgfSBlbHNlIHJldHVybiB4KGQubmFtZSkgKyB0ZW1wU2NhbGUoZC5rZXkpIC0gKHRlbXBTY2FsZS5iYW5kd2lkdGgoKSArIGxlZnRBbmRSaWdodFNwYWNlcyAqIDIpIC8gMiArIHRlbXBTY2FsZS5iYW5kd2lkdGgoKSAvIDI7XHJcbi8vICAgICAgICAgfSlcclxuLy8gICAgICAgICAuYXR0cignY2xhc3MnLCAnbGliLXZlcnRpY2Fsc3RhY2stdGl0bGUtb250b3AnKVxyXG4vLyAgICAgICAgIC5hdHRyKCd5JywgZnVuY3Rpb24gKCkge1xyXG4vLyAgICAgICAgICAgcmV0dXJuIHkoZC52YWx1ZSkgLSAzIC0gNDAgLSAxMDtcclxuLy8gICAgICAgICB9KVxyXG4vLyAgICAgICAgIC5hdHRyKCdkeScsIGZ1bmN0aW9uICgpIHtcclxuLy8gICAgICAgICAgIHJldHVybiBkLmNsYXNzO1xyXG4vLyAgICAgICAgIH0pXHJcbi8vICAgICAgICAgLmF0dHIoJ3dpZHRoJywgZnVuY3Rpb24gKCkge1xyXG4vLyAgICAgICAgICAgZGF0YS5tYXAoKGluZGl2OiBhbnkpID0+IHtcclxuLy8gICAgICAgICAgICAgaWYgKGluZGl2Lm5hbWUgPT0gZC5uYW1lKSB7XHJcbi8vICAgICAgICAgICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhpbmRpdikuZmlsdGVyKCh0ZW1wLCBpKSA9PiBpICE9IDApO1xyXG4vLyAgICAgICAgICAgICAgIHRlbXBTY2FsZSA9IGQzLnNjYWxlQmFuZCgpLmRvbWFpbihrZXlzKS5yYW5nZShbMCwgeC5iYW5kd2lkdGgoKV0pO1xyXG4vLyAgICAgICAgICAgICAgIGlmICh4LmJhbmR3aWR0aCgpID4gMTAwKSB7XHJcbi8vICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jaGFydERhdGEuZGF0YS5sZW5ndGggPT0gMSkge1xyXG4vLyAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoc2VsZi5jaGFydERhdGEuZGF0YVswXSkubGVuZ3RoID09IDIpIHtcclxuLy8gICAgICAgICAgICAgICAgICAgICB0ZW1wU2NhbGUucmFuZ2UoW1xyXG4vLyAgICAgICAgICAgICAgICAgICAgICAgMCArICh4LmJhbmR3aWR0aCgpIC0gMjAwKSAvIDIsXHJcbi8vICAgICAgICAgICAgICAgICAgICAgICB4LmJhbmR3aWR0aCgpIC0gKHguYmFuZHdpZHRoKCkgLSAyMDApIC8gMixcclxuLy8gICAgICAgICAgICAgICAgICAgICBdKTtcclxuLy8gICAgICAgICAgICAgICAgICAgfSBlbHNlXHJcbi8vICAgICAgICAgICAgICAgICAgICAgdGVtcFNjYWxlLnJhbmdlKFtcclxuLy8gICAgICAgICAgICAgICAgICAgICAgIDAgKyAoeC5iYW5kd2lkdGgoKSAtIDMwMCkgLyAyLFxyXG4vLyAgICAgICAgICAgICAgICAgICAgICAgeC5iYW5kd2lkdGgoKSAtICh4LmJhbmR3aWR0aCgpIC0gMzAwKSAvIDIsXHJcbi8vICAgICAgICAgICAgICAgICAgICAgXSk7XHJcbi8vICAgICAgICAgICAgICAgICB9IGVsc2VcclxuLy8gICAgICAgICAgICAgICAgICAgdGVtcFNjYWxlLnJhbmdlKFtcclxuLy8gICAgICAgICAgICAgICAgICAgICAwICsgKHguYmFuZHdpZHRoKCkgLSAxMjUpIC8gMixcclxuLy8gICAgICAgICAgICAgICAgICAgICB4LmJhbmR3aWR0aCgpIC0gKHguYmFuZHdpZHRoKCkgLSAxMjUpIC8gMixcclxuLy8gICAgICAgICAgICAgICAgICAgXSk7XHJcbi8vICAgICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICB9KTtcclxuLy8gICAgICAgICAgIGlmIChtZXRhRGF0YS5oYXNEcmlsbERvd24pIHtcclxuLy8gICAgICAgICAgICAgaWYgKHRlbXBTY2FsZS5iYW5kd2lkdGgoKSArIGxlZnRBbmRSaWdodFNwYWNlcyAqIDIgPiAxODApIHtcclxuLy8gICAgICAgICAgICAgICByZXR1cm4gJzE4MHB4JztcclxuLy8gICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgICByZXR1cm4gdGVtcFNjYWxlLmJhbmR3aWR0aCgpICsgbGVmdEFuZFJpZ2h0U3BhY2VzICogMjtcclxuLy8gICAgICAgICAgIH0gZWxzZSByZXR1cm4gdGVtcFNjYWxlLmJhbmR3aWR0aCgpICsgbGVmdEFuZFJpZ2h0U3BhY2VzICogMjtcclxuLy8gICAgICAgICB9KVxyXG4vLyAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCA1MClcclxuLy8gICAgICAgICAuYXBwZW5kKCd4aHRtbDpkaXYnKVxyXG4vLyAgICAgICAgIC5hdHRyKCdjbGFzcycsICd0aXRsZScpXHJcbi8vICAgICAgICAgLnN0eWxlKCd6LWluZGV4JywgOTkpXHJcbi8vICAgICAgICAgLmh0bWwoZnVuY3Rpb24gKCkge1xyXG4vLyAgICAgICAgICAgbGV0IGJhckxhYmVsID0gZC5rZXk7XHJcbi8vICAgICAgICAgICBsZXQgZGF0YVR5cGUgPSBtZXRhRGF0YS5kYXRhVHlwZSA/IG1ldGFEYXRhLmRhdGFUeXBlIDogJyc7XHJcbi8vICAgICAgICAgICBsZXQgdmFsdWUgPSBkLnZhbHVlO1xyXG4vLyAgICAgICAgICAgbGV0IGRlc2lyZWRUZXh0ID1cclxuLy8gICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwidGl0bGUtYmFyLW5hbWVcIj4nICsgYmFyTGFiZWwgKyAnPC9zcGFuPic7XHJcbi8vICAgICAgICAgICBkZXNpcmVkVGV4dCArPVxyXG4vLyAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJ0aXRsZS1iYXItdmFsdWVcIj48c3Bhbj4nICtcclxuLy8gICAgICAgICAgICAgdmFsdWUgK1xyXG4vLyAgICAgICAgICAgICAnPC9zcGFuPicgK1xyXG4vLyAgICAgICAgICAgICBkYXRhVHlwZSArXHJcbi8vICAgICAgICAgICAgICc8L3NwYW4+JztcclxuLy8gICAgICAgICAgIHJldHVybiBkZXNpcmVkVGV4dDtcclxuLy8gICAgICAgICB9KTtcclxuLy8gICAgIH1cclxuLy8gICAgIGZ1bmN0aW9uIGhhbmRsZU1vdXNlT3V0KGQsIGkpIHtcclxuLy8gICAgICAgc3ZnLnNlbGVjdEFsbCgnLmxpYi12ZXJ0aWNhbHN0YWNrLXRpdGxlLW9udG9wJykucmVtb3ZlKCk7XHJcbi8vICAgICB9XHJcbi8vICAgICBzdmdcclxuLy8gICAgICAgLmFwcGVuZCgnZycpXHJcbi8vICAgICAgIC5hdHRyKCdjbGFzcycsICd4MiBheGlzMicpXHJcbi8vICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDAsJyArIGhlaWdodCArICcpJylcclxuLy8gICAgICAgLnN0eWxlKCdjb2xvcicsICd2YXIoLS1jaGFydC1heGlzLWNvbG9yLCAjMDAwKScpIC8vIFVzZSBDU1MgdmFyaWFibGUgaW5zdGVhZCBvZiBoYXJkY29kZWQgIzAwMFxyXG4vLyAgICAgICAuY2FsbChkMy5heGlzQm90dG9tKHhTY2FsZUZyb21PcmlnaW4pLnRpY2tTaXplKDApKVxyXG4vLyAgICAgICAuY2FsbCgoZykgPT4gZy5zZWxlY3QoJy5kb21haW4nKS5hdHRyKCdmaWxsJywgJ25vbmUnKSk7XHJcbi8vICAgICBzdmcuc2VsZWN0QWxsKCdnLngyLmF4aXMyIGcudGljayB0ZXh0Jykuc3R5bGUoJ2Rpc3BsYXknLCAnbm9uZScpO1xyXG4vLyAgICAgc3ZnXHJcbi8vICAgICAgIC5hcHBlbmQoJ2cnKVxyXG4vLyAgICAgICAuYXR0cignY2xhc3MnLCAnbGliLXN0YWNrZWQteS1heGlzLXRleHQgeWF4aXMtZGFzaGVkJylcclxuLy8gICAgICAgLmF0dHIoJ3N0eWxlJywgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNDdXN0b21UZXh0U3R5bGVzKVxyXG4vLyAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgwLDApJylcclxuLy8gICAgICAgLmNhbGwoeSlcclxuLy8gICAgICAgLnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKTtcclxuLy8gICAgIHN2Z1lBeGlzTGVmdFxyXG4vLyAgICAgICAuYXBwZW5kKCdnJylcclxuLy8gICAgICAgLmFwcGVuZCgnZycpXHJcbi8vICAgICAgIC5hdHRyKCdjbGFzcycsICdsaWIteWF4aXMtbGFiZWxzLXRleHRzLWRyaWxsZG93biB5YXhpcy1kYXNoZWQnKVxyXG4vLyAgICAgICAuYXR0cignc3R5bGUnLCBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi55QXhpc0N1c3RvbVRleHRTdHlsZXMpXHJcbi8vICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDAsMCknKVxyXG4vLyAgICAgICAuY2FsbChcclxuLy8gICAgICAgICBkM1xyXG4vLyAgICAgICAgICAgLmF4aXNMZWZ0KHkpXHJcbi8vICAgICAgICAgICAudGlja1NpemUoMClcclxuLy8gICAgICAgICAgIC50aWNrcyhzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5udW1iZXJPZllUaWNrcylcclxuLy8gICAgICAgICAgIC50aWNrRm9ybWF0KGZ1bmN0aW9uIChkKSB7XHJcbi8vICAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZCA9IHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzTGFiZWxGb21hdHRlclxyXG4vLyAgICAgICAgICAgICAgID8gc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNMYWJlbEZvbWF0dGVyKGQpXHJcbi8vICAgICAgICAgICAgICAgOiBkO1xyXG4vLyAgICAgICAgICAgICByZXR1cm4gZm9ybWF0dGVkID49IDEwMDAgPyBmb3JtYXR0ZWQgLyAxMDAwICsgJ2snIDogZm9ybWF0dGVkO1xyXG4vLyAgICAgICAgICAgfSlcclxuLy8gICAgICAgKVxyXG4vLyAgICAgICAuY2FsbCgoZykgPT4ge1xyXG4vLyAgICAgICAgIC8vIFN0eWxlIHRoZSBkb21haW4gbGluZSBmb3IgdGhlbWUgc3VwcG9ydFxyXG4vLyAgICAgICAgIGcuc2VsZWN0KCcuZG9tYWluJylcclxuLy8gICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgJ3ZhcigtLWNoYXJ0LWRvbWFpbi1jb2xvciwgIzAwMDAwMCknKVxyXG4vLyAgICAgICAgICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCAnMXB4Jyk7XHJcbi8vICAgICAgIH0pXHJcbi8vICAgICAgIC5zZWxlY3RBbGwoJ3RleHQnKVxyXG4vLyAgICAgICAuc3R5bGUoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKTtcclxuLy8gICAgIHN2Z1lBeGlzUmlnaHRcclxuLy8gICAgICAgLmFwcGVuZCgnZycpXHJcbi8vICAgICAgIC5hdHRyKCdjbGFzcycsICdsaWIteWF4aXMtbGFiZWxzLXRleHRzLWRyaWxsZG93biB5YXhpcy1kYXNoZWQnKVxyXG4vLyAgICAgICAuYXR0cignc3R5bGUnLCBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi55QXhpc0N1c3RvbVRleHRTdHlsZXMpXHJcbi8vICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDAsMCknKVxyXG4vLyAgICAgICAuY2FsbCh5KVxyXG4vLyAgICAgICAuc3R5bGUoJ2Rpc3BsYXknLCAnbm9uZScpO1xyXG4vLyAgICAgLyoqXHJcbi8vICAgICAgKiBoaWRlIHggYXhpcyBsYWJlbHNcclxuLy8gICAgICAqIGNvbmZpZyBpcyB0aGVyZSBmb3IgZnV0dXJlIHVzZVxyXG4vLyAgICAgICogdXNlZCBieSB3ZWVrbHkgY2hhcnRzXHJcbi8vICAgICAgKi9cclxuLy8gICAgIGlmIChcclxuLy8gICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNYYXhpc0xhYmVsSGlkZGVuICE9IHVuZGVmaW5lZCAmJlxyXG4vLyAgICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1hheGlzTGFiZWxIaWRkZW5cclxuLy8gICAgICkge1xyXG4vLyAgICAgICBkMy5zZWxlY3RBbGwoJ2cubGliLWxpbmUteC1heGlzLXRleHQgPiBnID4gdGV4dCcpLmF0dHIoXHJcbi8vICAgICAgICAgJ2NsYXNzJyxcclxuLy8gICAgICAgICAnbGliLWRpc3BsYXktaGlkZGVuJ1xyXG4vLyAgICAgICApO1xyXG4vLyAgICAgfVxyXG4vLyAgICAgLyoqXHJcbi8vICAgICAgKiBoaWRlIHkgYXhpcyBsYWJlbHNcclxuLy8gICAgICAqIHVzZWQgYnkgd2Vla2x5IGNoYXJ0c1xyXG4vLyAgICAgICovXHJcbi8vICAgICBpZiAoXHJcbi8vICAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzWWF4aXNMYWJlbEhpZGRlbiAhPSB1bmRlZmluZWQgJiZcclxuLy8gICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNZYXhpc0xhYmVsSGlkZGVuXHJcbi8vICAgICApIHtcclxuLy8gICAgICAgZDMuc2VsZWN0QWxsKCcueWF4aXMtZGFzaGVkID4gZyA+IHRleHQnKS5hdHRyKFxyXG4vLyAgICAgICAgICdjbGFzcycsXHJcbi8vICAgICAgICAgJ2xpYi1kaXNwbGF5LWhpZGRlbidcclxuLy8gICAgICAgKTtcclxuLy8gICAgIH1cclxuLy8gICAgIC8qKlxyXG4vLyAgICAgICogaGlkZSB5IGF4aXMgbGFiZWxzXHJcbi8vICAgICAgKiBjb25maWcgaXMgdGhlcmUgZm9yIGZ1dHVyZSB1c2VcclxuLy8gICAgICAqL1xyXG4vLyAgICAgaWYgKFxyXG4vLyAgICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1lheGlzSGlkZGVuICE9IHVuZGVmaW5lZCAmJlxyXG4vLyAgICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1lheGlzSGlkZGVuXHJcbi8vICAgICApIHtcclxuLy8gICAgICAgZDMuc2VsZWN0QWxsKCcueWF4aXMtZGFzaGVkJykuYXR0cignY2xhc3MnLCAnbGliLWRpc3BsYXktaGlkZGVuJyk7XHJcbi8vICAgICB9XHJcbi8vICAgICAvKipcclxuLy8gICAgICAqIGRhc2hlZCB5IGF4aXNcclxuLy8gICAgICAqIHVzZWQgYnkgd2Vla2x5IGNoYXJ0c1xyXG4vLyAgICAgICovXHJcbi8vICAgICBpZiAoXHJcbi8vICAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzWWF4aXNEYXNoZWQgIT0gdW5kZWZpbmVkICYmXHJcbi8vICAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzWWF4aXNEYXNoZWRcclxuLy8gICAgICkge1xyXG4vLyAgICAgICBkMy5zZWxlY3RBbGwoJy55YXhpcy1kYXNoZWQnKVxyXG4vLyAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLWRhc2hhcnJheScsICc1IDUnKVxyXG4vLyAgICAgICAgIC5zdHlsZSgnY29sb3InLCAndmFyKC0tY2hhcnQtYXhpcy1jb2xvciwgIzk5OTk5OSknKTsgLy8gVXNlIENTUyB2YXJpYWJsZVxyXG4vLyAgICAgfVxyXG4vLyAgICAgaWYgKGxpbmVEYXRhICE9IG51bGwpIHtcclxuLy8gICAgICAgaWYgKGxpbmVEYXRhICYmIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnNob3dMaW5lQ2hhcnRBeGlzKSB7XHJcbi8vICAgICAgICAgc3ZnWUF4aXNSaWdodFxyXG4vLyAgICAgICAgICAgLmFwcGVuZCgnZycpXHJcbi8vICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnbGliLXN0YWNrZWQteS1heGlzLXRleHQxJylcclxuLy8gICAgICAgICAgIC5hdHRyKCdzdHlsZScsIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzQ3VzdG9tVGV4dFN0eWxlcylcclxuLy8gICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcgKyAwICsgJywwKScpXHJcbi8vICAgICAgICAgICAuY2FsbCh5TGluZUF4aXMpO1xyXG4vLyAgICAgICB9XHJcbi8vICAgICB9XHJcbi8vICAgICAvKipcclxuLy8gICAgICAqIHVzZWQgdG8gZGlzcGxheSB5IGxhYmVsXHJcbi8vICAgICAgKi9cclxuXHJcbi8vICAgICAvLyBpZiAodGhpcy5pc1pvb21lZE91dCkge1xyXG4vLyAgICAgLy8gICBzdmdcclxuLy8gICAgIC8vICAgICAuc2VsZWN0QWxsKCcubGliLXhheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24nKVxyXG4vLyAgICAgLy8gICAgIC5hdHRyKCdjbGFzcycsICdsaWItZGlzcGxheS1oaWRkZW4nKTtcclxuLy8gICAgIC8vIH1cclxuXHJcbi8vICAgICBpZiAodGhpcy5pc1pvb21lZE91dCkge1xyXG4vLyAgICAgICBzdmdcclxuLy8gICAgICAgICAuc2VsZWN0QWxsKCcubGliLXhheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24nKVxyXG4vLyAgICAgICAgIC5lYWNoKChkLCBpLCBub2RlcykgPT4ge1xyXG4vLyAgICAgICAgICAgY29uc3QgdGV4dCA9IGQzLnNlbGVjdChub2Rlc1tpXSk7XHJcbi8vICAgICAgICAgICBjb25zdCBsYWJlbCA9IHRleHQudGV4dCgpO1xyXG4vLyAgICAgICAgICAgaWYgKGxhYmVsLmluZGV4T2YoJ1xcbicpID4gLTEpIHtcclxuLy8gICAgICAgICAgICAgY29uc3QgbGluZXMgPSBsYWJlbC5zcGxpdCgnXFxuJyk7XHJcbi8vICAgICAgICAgICAgIHRleHQudGV4dChudWxsKTtcclxuLy8gICAgICAgICAgICAgbGluZXMuZm9yRWFjaCgobGluZSwgaWR4KSA9PiB7XHJcbi8vICAgICAgICAgICAgICAgdGV4dC5hcHBlbmQoJ3RzcGFuJylcclxuLy8gICAgICAgICAgICAgICAgIC50ZXh0KGxpbmUpXHJcbi8vICAgICAgICAgICAgICAgICAuYXR0cigneCcsIDApXHJcbi8vICAgICAgICAgICAgICAgICAuYXR0cignZHknLCBpZHggPT09IDAgPyAnMWVtJyA6ICcxLjFlbScpO1xyXG4vLyAgICAgICAgICAgICB9KTtcclxuLy8gICAgICAgICAgIH0gZWxzZSB7XHJcbi8vICAgICAgICAgICAgIGNvbnN0IHdvcmRzID0gbGFiZWwuc3BsaXQoJyAnKTtcclxuLy8gICAgICAgICAgICAgdGV4dC50ZXh0KG51bGwpO1xyXG4vLyAgICAgICAgICAgICB3b3Jkcy5mb3JFYWNoKCh3b3JkLCBpbmRleCkgPT4ge1xyXG4vLyAgICAgICAgICAgICAgIHRleHQuYXBwZW5kKCd0c3BhbicpLnRleHQod29yZCk7XHJcbi8vICAgICAgICAgICAgIH0pO1xyXG4vLyAgICAgICAgICAgfVxyXG4vLyAgICAgICAgIH0pXHJcbi8vICAgICAgICAgLnN0eWxlKCdmaWxsJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJylcclxuLy8gICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgbnVsbCk7IFxyXG4vLyAgICAgICBzdmdcclxuLy8gICAgICAgICAuc2VsZWN0KCcueC1heGlzJylcclxuLy8gICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgwLCAke2hlaWdodCAtIG1hcmdpbi5ib3R0b20gKyAxMH0pYCk7XHJcbi8vICAgICB9XHJcblxyXG4vLyAgICAgLyoqXHJcbi8vICAgICAgKiB1c2VkIHRvIHdyaXRlIHkgbGFiZWxzIGJhc2VkIG9uIGNvbmZpZ3VyYXRpb25cclxuLy8gICAgICAqL1xyXG4vLyBpZiAobWV0YURhdGEueUxhYmVsKSB7XHJcbi8vICAgY29uc3QgeVBvc2l0aW9uID0gaXNyaWEgPyAwIC0gbWFyZ2luLmxlZnQgLyAyIC0gMzAgOiAwIC0gbWFyZ2luLmxlZnQgLyAyIC0gNDA7XHJcblxyXG4vLyAgIHN2Z1lBeGlzTGVmdFxyXG4vLyAgICAgLmFwcGVuZCgndGV4dCcpXHJcbi8vICAgICAuYXR0cignY2xhc3MnLCAnbGliLWF4aXMtZ3JvdXAtbGFiZWwgZm9udC1zaXplLTEnKVxyXG4vLyAgICAgLmF0dHIoJ3N0eWxlJywgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNDdXN0b21sYWJlbFN0eWxlcylcclxuLy8gICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAncm90YXRlKC05MCknKVxyXG4vLyAgICAgLmF0dHIoJ3knLCB5UG9zaXRpb24pXHJcbi8vICAgICAuYXR0cigneCcsIDAgLSBoZWlnaHQgLyAyKVxyXG4vLyAgICAgLmF0dHIoJ2R5JywgJzFlbScpXHJcbi8vICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXHJcbi8vICAgICAuYXR0cignZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpO1xyXG5cclxuLy8gICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNNdWx0aUNoYXJ0R3JpZExpbmUgPT09IHVuZGVmaW5lZCkge1xyXG4vLyAgICAgc3ZnWUF4aXNMZWZ0XHJcbi8vICAgICAgIC5zZWxlY3RBbGwoJy5saWItYXhpcy1ncm91cC1sYWJlbCcpXHJcbi8vICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgJ3NtYWxsZXInKVxyXG4vLyAgICAgICAudGV4dChtZXRhRGF0YS55TGFiZWwpO1xyXG4vLyAgIH0gZWxzZSB7XHJcbi8vICAgICBzdmdcclxuLy8gICAgICAgLnNlbGVjdEFsbCgnLmxpYi1heGlzLWdyb3VwLWxhYmVsJylcclxuLy8gICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi15bGFiZWwtd2Vla2x5Q2hhcnRzJylcclxuLy8gICAgICAgLnRleHQobWV0YURhdGEueUxhYmVsLnRvTG93ZXJDYXNlKCkpO1xyXG4vLyAgIH1cclxuLy8gfVxyXG5cclxuLy8gICAgIGlmICh0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YSkge1xyXG4vLyAgICAgICBjb25zdCB5WmVybyA9IHkodGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEudGFyZ2V0KTtcclxuLy8gICAgICAgc3ZnXHJcbi8vICAgICAgICAgLmFwcGVuZCgnbGluZScpXHJcbi8vICAgICAgICAgLmF0dHIoJ3gxJywgMClcclxuLy8gICAgICAgICAuYXR0cigneDInLCB3aWR0aClcclxuLy8gICAgICAgICAuYXR0cigneTEnLCB5WmVybylcclxuLy8gICAgICAgICAuYXR0cigneTInLCB5WmVybylcclxuLy8gICAgICAgICAuc3R5bGUoJ3N0cm9rZS1kYXNoYXJyYXknLCAnNSA1JylcclxuLy8gICAgICAgICAuc3R5bGUoJ3N0cm9rZScsIHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLmNvbG9yKTtcclxuLy8gICAgICAgLy8gc3ZnWUF4aXNSaWdodFxyXG4vLyAgICAgICAvLyAgIC5hcHBlbmQoJ2xpbmUnKVxyXG4vLyAgICAgICAvLyAgIC5hdHRyKCd4MScsIDApXHJcbi8vICAgICAgIC8vICAgLmF0dHIoJ3gyJywgcmlnaHRTdmdXaWR0aClcclxuLy8gICAgICAgLy8gICAuYXR0cigneTEnLCB5WmVybylcclxuLy8gICAgICAgLy8gICAuYXR0cigneTInLCB5WmVybylcclxuLy8gICAgICAgLy8gICAuc3R5bGUoJ3N0cm9rZScsIHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLmNvbG9yKTtcclxuLy8gICAgICAgc3ZnWUF4aXNSaWdodFxyXG4vLyAgICAgICAgIC5hcHBlbmQoJ2ZvcmVpZ25PYmplY3QnKVxyXG4vLyAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcgKyAwICsgJywnICsgKHlaZXJvIC0gMzApICsgJyknKVxyXG4vLyAgICAgICAgIC5hdHRyKCd3aWR0aCcsIHJpZ2h0U3ZnV2lkdGgpXHJcbi8vICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIDUwKVxyXG4vLyAgICAgICAgIC5hcHBlbmQoJ3hodG1sOmRpdicpXHJcbi8vICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ3RhcmdldC1kaXNwbGF5JylcclxuLy8gICAgICAgICAuc3R5bGUoJ2NvbG9yJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJylcclxuLy8gICAgICAgICAuaHRtbChmdW5jdGlvbiAoKSB7XHJcbi8vICAgICAgICAgICBsZXQgZGF0YVR5cGVUZW1wID0gJyc7XHJcbi8vICAgICAgICAgICBsZXQgdGFyZ2V0TGluZU5hbWUgPSAndGFyZ2V0JztcclxuLy8gICAgICAgICAgIGlmIChtZXRhRGF0YS5kYXRhVHlwZSkge1xyXG4vLyAgICAgICAgICAgICBkYXRhVHlwZVRlbXAgPSBtZXRhRGF0YS5kYXRhVHlwZTtcclxuLy8gICAgICAgICAgIH1cclxuLy8gICAgICAgICAgIGlmIChcclxuLy8gICAgICAgICAgICAgc2VsZi5jaGFydERhdGEudGFyZ2V0TGluZURhdGEgJiZcclxuLy8gICAgICAgICAgICAgc2VsZi5jaGFydERhdGEudGFyZ2V0TGluZURhdGEudGFyZ2V0TmFtZVxyXG4vLyAgICAgICAgICAgKSB7XHJcbi8vICAgICAgICAgICAgIHRhcmdldExpbmVOYW1lID0gc2VsZi5jaGFydERhdGEudGFyZ2V0TGluZURhdGEudGFyZ2V0TmFtZTtcclxuLy8gICAgICAgICAgIH1cclxuLy8gICAgICAgICAgIHJldHVybiAoXHJcbi8vICAgICAgICAgICAgIGA8ZGl2PiR7dGFyZ2V0TGluZU5hbWV9PC9kaXY+YCArXHJcbi8vICAgICAgICAgICAgICc8ZGl2PicgK1xyXG4vLyAgICAgICAgICAgICBzZWxmLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXQgK1xyXG4vLyAgICAgICAgICAgICAnJyArXHJcbi8vICAgICAgICAgICAgIGRhdGFUeXBlVGVtcCArXHJcbi8vICAgICAgICAgICAgICc8L2Rpdj4nXHJcbi8vICAgICAgICAgICApO1xyXG4vLyAgICAgICAgIH0pO1xyXG4vLyAgICAgfVxyXG4vLyAgICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzRHJpbGxkb3duQ2hhcnQpIHtcclxuLy8gICAgICAgLyoqXHJcbi8vICAgICAgICAqIHVzZWQgYnkgZHJpbGxkb3duIGNoYXJ0c1xyXG4vLyAgICAgICAgKi9cclxuLy8gICAgICAgLy8gc3ZnXHJcbi8vICAgICAgIC8vICAgLnNlbGVjdEFsbCgnLmxpYi1heGlzLWdyb3VwLWxhYmVsJylcclxuLy8gICAgICAgLy8gICAuYXR0cignY2xhc3MnLCAnbGliLXlsYWJlbC1kcmlsbGRvd25jaGFydHMnKVxyXG4vLyAgICAgICAvLyAgIC50ZXh0KG1ldGFEYXRhLnlMYWJlbC50b0xvd2VyQ2FzZSgpKTtcclxuLy8gICAgICAgc3ZnLnNlbGVjdEFsbCgnZy54MS5heGlzMSBnLnRpY2sgbGluZScpLnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKTtcclxuLy8gICAgIH1cclxuXHJcbi8vICAgICBpZiAobWV0YURhdGEueExhYmVsKSB7XHJcbi8vICAgICAgIGZ1bmN0aW9uIGlzQWNyb255bShsYWJlbCkge1xyXG4vLyAgICAgICAgIHJldHVybiAoXHJcbi8vICAgICAgICAgICAobGFiZWwubGVuZ3RoIDw9IDQgJiYgL15bQS1aXSskLy50ZXN0KGxhYmVsKSkgfHxcclxuLy8gICAgICAgICAgIChsYWJlbCA9PT0gbGFiZWwudG9VcHBlckNhc2UoKSAmJiAvW0EtWl0vLnRlc3QobGFiZWwpKVxyXG4vLyAgICAgICAgICk7XHJcbi8vICAgICAgIH1cclxuLy8gICAgICAgY29uc3QgeExhYmVsVGV4dCA9IG1ldGFEYXRhLnhMYWJlbDtcclxuLy8gICAgICAgY29uc3QgaXNBY3IgPSBpc0Fjcm9ueW0oeExhYmVsVGV4dC5yZXBsYWNlKC9bXkEtWmEtel0vZywgJycpKTtcclxuXHJcbi8vICAgICAgICAgY29uc3QgeFBvc2l0aW9uID0gaXNyaWEgPyAoaGVpZ2h0ICsgbWFyZ2luLnRvcCArIG1hcmdpbi5ib3R0b20pIDogKGhlaWdodCArIG1hcmdpbi50b3AgKyBtYXJnaW4uYm90dG9tICsgNDApO1xyXG5cclxuLy8gICAgICAgc3ZnXHJcbi8vICAgICAgICAgLmFwcGVuZCgndGV4dCcpXHJcbi8vICAgICAgICAgLmF0dHIoJ2NsYXNzJywgZnVuY3Rpb24gKCkge1xyXG4vLyAgICAgICAgICAgbGV0IGJhc2VDbGFzcyA9ICdsaWItYXhpcy1ncm91cC1sYWJlbCBmb250LXNpemUtMSc7XHJcbi8vICAgICAgICAgICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydClcclxuLy8gICAgICAgICAgICAgcmV0dXJuIGJhc2VDbGFzcyArICcgbGliLXhsYWJlbC1kcmlsbGRvd25jaGFydHMnO1xyXG4vLyAgICAgICAgICAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmlzTXVsdGlDaGFydEdyaWRMaW5lICE9IHVuZGVmaW5lZClcclxuLy8gICAgICAgICAgICAgcmV0dXJuIGJhc2VDbGFzcyArICcgbGliLXhsYWJlbC13ZWVrbHlDaGFydHMnO1xyXG4vLyAgICAgICAgICAgcmV0dXJuIGJhc2VDbGFzcyArICcgbGliLWF4aXMtd2F0ZXJmYWxsLWxhYmVsJztcclxuLy8gICAgICAgICB9KVxyXG4vLyAgICAgICAgIC5hdHRyKCdzdHlsZScsIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnhBeGlzQ3VzdG9tbGFiZWxTdHlsZXMpXHJcbi8vICAgICAgICAgLmF0dHIoXHJcbi8vICAgICAgICAgICAndHJhbnNmb3JtJyxcclxuLy8gICAgICAgICAgICd0cmFuc2xhdGUoJyArIHdpZHRoIC8gMiArICcgLCcgKyB4UG9zaXRpb24gKyAnKSdcclxuLy8gICAgICAgICApXHJcbi8vICAgICAgICAgLnN0eWxlKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxyXG4vLyAgICAgICAgIC5zdHlsZSgnZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpXHJcbi8vICAgICAgICAgLnRleHQoaXNBY3IgPyB4TGFiZWxUZXh0LnRvVXBwZXJDYXNlKCkgOiB4TGFiZWxUZXh0LnRvTG93ZXJDYXNlKCkpXHJcbi8vICAgICAgICAgLnN0eWxlKCd0ZXh0LXRyYW5zZm9ybScsIGlzQWNyID8gJ25vbmUnIDogJ2NhcGl0YWxpemUnKTtcclxuLy8gICAgIH1cclxuLy8gICAgIGlmIChtZXRhRGF0YS5saW5leUxhYmVsKSB7XHJcbi8vICAgICAgIHN2Z1lBeGlzUmlnaHRcclxuLy8gICAgICAgICAuYXBwZW5kKCd0ZXh0JylcclxuLy8gICAgICAgICAuYXR0cignY2xhc3MnLCAnbGliLWF4aXMtZ3JvdXAtbGFiZWwgbGliLWxpbmUtYXhpcycpXHJcbi8vICAgICAgICAgLmF0dHIoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKVxyXG4vLyAgICAgICAgIC5hdHRyKCdzdHlsZScsIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzQ3VzdG9tbGFiZWxTdHlsZXMpXHJcbi8vICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoMCwwKSByb3RhdGUoOTApJylcclxuLy8gICAgICAgICAuYXR0cigneScsIDAgLSAxMDApXHJcbi8vICAgICAgICAgLmF0dHIoJ3gnLCAwICsgMTAwKVxyXG4vLyAgICAgICAgIC5hdHRyKCdkeScsICc1ZW0nKVxyXG4vLyAgICAgICAgIC5zdHlsZSgndGV4dC1hbmNob3InLCAnbWlkZGxlJylcclxuLy8gICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsICdzbWFsbGVyJylcclxuLy8gICAgICAgICAudGV4dChtZXRhRGF0YS5saW5leUxhYmVsKTtcclxuLy8gICAgIH1cclxuLy8gICAgIGlmIChsaW5lRGF0YSkge1xyXG4vLyAgICAgICBzdmdcclxuLy8gICAgICAgICAuYXBwZW5kKCdwYXRoJylcclxuLy8gICAgICAgICAuZGF0dW0obGluZURhdGEpXHJcbi8vICAgICAgICAgLmF0dHIoJ2ZpbGwnLCAnbm9uZScpXHJcbi8vICAgICAgICAgLmF0dHIoJ3N0cm9rZScsIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmxpbmVHcmFwaENvbG9yKVxyXG4vLyAgICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCAxLjUpXHJcbi8vICAgICAgICAgLmF0dHIoXHJcbi8vICAgICAgICAgICAnZCcsXHJcbi8vICAgICAgICAgICBkM1xyXG4vLyAgICAgICAgICAgICAubGluZSgpXHJcbi8vICAgICAgICAgICAgIC54KGZ1bmN0aW9uIChkKSB7XHJcbi8vICAgICAgICAgICAgICAgcmV0dXJuIHgoZC5uYW1lKSArIHguYmFuZHdpZHRoKCkgLyAyO1xyXG4vLyAgICAgICAgICAgICB9KVxyXG4vLyAgICAgICAgICAgICAueShmdW5jdGlvbiAoZCkge1xyXG4vLyAgICAgICAgICAgICAgIHJldHVybiBsaW5lWXNjYWxlKGQudmFsdWUpO1xyXG4vLyAgICAgICAgICAgICB9KVxyXG4vLyAgICAgICAgICk7XHJcblxyXG4vLyAgICAgICB2YXIgZG90ID0gc3ZnXHJcbi8vICAgICAgICAgLnNlbGVjdEFsbCgnbXlDaXJjbGVzJylcclxuLy8gICAgICAgICAuZGF0YShsaW5lRGF0YSlcclxuLy8gICAgICAgICAuZW50ZXIoKVxyXG4vLyAgICAgICAgIC5hcHBlbmQoJ2cnKVxyXG4vLyAgICAgICAgIC5vbignY2xpY2snLCBmdW5jdGlvbiAoZCkge1xyXG4vLyAgICAgICAgICAgaWYgKFxyXG4vLyAgICAgICAgICAgICAhbWV0YURhdGEuYmFyV2l0aG91dENsaWNrIHx8XHJcbi8vICAgICAgICAgICAgICFtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2subGVuZ3RoIHx8XHJcbi8vICAgICAgICAgICAgICghbWV0YURhdGEuYmFyV2l0aG91dENsaWNrLmluY2x1ZGVzKGQ/Lm5hbWUpICYmXHJcbi8vICAgICAgICAgICAgICAgIW1ldGFEYXRhLmJhcldpdGhvdXRDbGljay5pbmNsdWRlcyhkPy5rZXkpKVxyXG4vLyAgICAgICAgICAgKVxyXG4vLyAgICAgICAgICAgICBzZWxmLmhhbmRsZUNsaWNrKGQpO1xyXG4vLyAgICAgICAgIH0pO1xyXG5cclxuLy8gICAgICAgZG90XHJcbi8vICAgICAgICAgLmFwcGVuZCgnY2lyY2xlJylcclxuLy8gICAgICAgICAuYXR0cignZmlsbCcsIGZ1bmN0aW9uIChkKSB7XHJcbi8vICAgICAgICAgICByZXR1cm4gc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubGluZUdyYXBoQ29sb3I7XHJcbi8vICAgICAgICAgfSlcclxuLy8gICAgICAgICAuYXR0cignc3Ryb2tlJywgJ25vbmUnKVxyXG4vLyAgICAgICAgIC5hdHRyKCdjeCcsIGZ1bmN0aW9uIChkKSB7XHJcbi8vICAgICAgICAgICByZXR1cm4geChkLm5hbWUpICsgeC5iYW5kd2lkdGgoKSAvIDI7XHJcbi8vICAgICAgICAgfSlcclxuLy8gICAgICAgICAuYXR0cignY3knLCBmdW5jdGlvbiAoZCkge1xyXG4vLyAgICAgICAgICAgcmV0dXJuIGxpbmVZc2NhbGUoZC52YWx1ZSk7XHJcbi8vICAgICAgICAgfSlcclxuLy8gICAgICAgICAuc3R5bGUoJ2N1cnNvcicsICgpID0+XHJcbi8vICAgICAgICAgICBzZWxmLmNoYXJ0RGF0YS5tZXRhRGF0YS5oYXNEcmlsbERvd24gPyAncG9pbnRlcicgOiAnZGVmYXVsdCdcclxuLy8gICAgICAgICApXHJcbi8vICAgICAgICAgLmF0dHIoJ3InLCAzKTtcclxuXHJcbi8vICAgICAgIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5saW5lR3JhcGhDb2xvcikge1xyXG4vLyAgICAgICAgIGRvdFxyXG4vLyAgICAgICAgICAgLmFwcGVuZCgndGV4dCcpXHJcbi8vICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnZG90JylcclxuLy8gICAgICAgICAgIC5hdHRyKCdmaWxsJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJylcclxuLy8gICAgICAgICAgIC5hdHRyKCdjb2xvcicsIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmxpbmVHcmFwaENvbG9yKVxyXG4vLyAgICAgICAgICAgLmF0dHIoJ3N0eWxlJywgJ2ZvbnQtc2l6ZTogJyArICcuODVlbScpXHJcbi8vICAgICAgICAgICAuYXR0cigneCcsIGZ1bmN0aW9uIChkLCBpKSB7XHJcbi8vICAgICAgICAgICAgIHJldHVybiB4KGQubmFtZSkgKyB4LmJhbmR3aWR0aCgpIC8gMjtcclxuLy8gICAgICAgICAgIH0pXHJcbi8vICAgICAgICAgICAuYXR0cigneScsIGZ1bmN0aW9uIChkKSB7XHJcbi8vICAgICAgICAgICAgIHJldHVybiBsaW5lWXNjYWxlKGQudmFsdWUpO1xyXG4vLyAgICAgICAgICAgfSlcclxuLy8gICAgICAgICAgIC5hdHRyKCdkeScsICctMWVtJylcclxuLy8gICAgICAgICAgIC50ZXh0KGZ1bmN0aW9uIChkKSB7XHJcbi8vICAgICAgICAgICAgIHJldHVybiBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5sYWJlbEZvcm1hdHRlcihkLnZhbHVlKTtcclxuLy8gICAgICAgICAgIH0pO1xyXG4vLyAgICAgICB9XHJcbi8vICAgICB9XHJcbi8vICAgfVxyXG5cclxuaW5pdGlhbGl6ZWdyb3VwQ2hhcnQoKSB7XHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gVkFSSUFCTEUgREVDTEFSQVRJT05TID09PT09PT09PT09PT09PT09PT09XHJcbiAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgbGV0IGRhdGEgPSBbXTtcclxuICBsZXQgbWV0YURhdGE6IGFueSA9IG51bGw7XHJcbiAgbGV0IGtleUxpc3QgPSBudWxsO1xyXG4gIGxldCBsaW5lRGF0YSA9IG51bGw7XHJcbiAgbGV0IGNvbG9yTWFwID0ge307XHJcbiAgbGV0IGZvcm1hdEZyb21CYWNrZW5kO1xyXG4gIGxldCBmb3JtYXRGb3JIdWdlTnVtYmVycztcclxuICBcclxuICAvLyBEZXZpY2UgZGV0ZWN0aW9uXHJcbiAgY29uc3QgaXNNb2JpbGUgPSB3aW5kb3cuaW5uZXJXaWR0aCA8IDU3NjtcclxuICBjb25zdCBpc1RhYmxldCA9IHdpbmRvdy5pbm5lcldpZHRoID49IDU3NiAmJiB3aW5kb3cuaW5uZXJXaWR0aCA8IDk5MjtcclxuICBjb25zdCBpc0Rlc2t0b3AgPSB3aW5kb3cuaW5uZXJXaWR0aCA+PSA5OTI7XHJcbiAgY29uc3QgaXNyaWEgPSB0aGlzLmN1c3RvbUNoYXJ0Q29uZmlndXJhdGlvbi5pc1JpYTtcclxuXHJcbiAgLy8gQ2hhcnQgc2NhbGUgdmFyaWFibGVzXHJcbiAgbGV0IHg6IGFueTtcclxuICBsZXQgdGVtcFNjYWxlO1xyXG5cclxuICAvLyBUaWNrIGxlbmd0aCBjb25zdGFudHNcclxuICBjb25zdCBTSE9SVF9USUNLX0xFTkdUSCA9IDQ7XHJcbiAgY29uc3QgTE9OR19USUNLX0xFTkdUSCA9IDE2O1xyXG4gIGNvbnN0IFNIT1JUX1RJQ0tfTEVOR1RIX0JHID0gNTtcclxuICBjb25zdCBMT05HX1RJQ0tfTEVOR1RIX0JHID0gMzA7XHJcbiAgY29uc3QgTEVGVF9BTkRfUklHSFRfU1BBQ0VTID0gNTA7XHJcbiAgY29uc3QgUklHSFRfU1ZHX1dJRFRIID0gNjA7XHJcbiAgXHJcbiAgLy8gRmxhZ3NcclxuICBsZXQgYWx0ZXJuYXRlX3RleHQgPSBmYWxzZTtcclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gQ09ORklHVVJBVElPTiBTRVRVUCA9PT09PT09PT09PT09PT09PT09PVxyXG4gIGZvciAoY29uc3Qga2V5IGluIHRoaXMuZGVmYXVsdENvbmZpZ3VyYXRpb24pIHtcclxuICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uW2tleV0gPSBDaGFydEhlbHBlci5nZXRWYWx1ZUJ5Q29uZmlndXJhdGlvblR5cGUoXHJcbiAgICAgIGtleSxcclxuICAgICAgdGhpcy5kZWZhdWx0Q29uZmlndXJhdGlvbixcclxuICAgICAgdGhpcy5jdXN0b21DaGFydENvbmZpZ3VyYXRpb25cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvLyBFeHRyYWN0IGNoYXJ0IGRhdGFcclxuICBkYXRhID0gdGhpcy5jaGFydERhdGEuZGF0YTtcclxuICBtZXRhRGF0YSA9IHRoaXMuY2hhcnREYXRhLm1ldGFEYXRhO1xyXG4gIGxpbmVEYXRhID0gdGhpcy5jaGFydERhdGEubGluZURhdGE7XHJcblxyXG4gIC8vIFNldHVwIGNvbG9yIG1hcHBpbmdzXHJcbiAgaWYgKCFtZXRhRGF0YS5jb2xvckFib3ZlVGFyZ2V0KSB7XHJcbiAgICBtZXRhRGF0YVsnY29sb3JBYm92ZVRhcmdldCddID0gbWV0YURhdGEuY29sb3JzO1xyXG4gIH1cclxuICBjb2xvck1hcCA9IG1ldGFEYXRhLmNvbG9ycztcclxuICBrZXlMaXN0ID0gbWV0YURhdGEua2V5TGlzdDtcclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gQ09OVEFJTkVSIFNFVFVQID09PT09PT09PT09PT09PT09PT09XHJcbiAgY29uc3QgY2hhcnRDb250YWluZXIgPSBkMy5zZWxlY3QodGhpcy5jb250YWluZXJFbHQubmF0aXZlRWxlbWVudCk7XHJcbiAgY29uc3QgdmVydGljYWxzdGFja2VkY29udGFpbmVyID0gZDMuc2VsZWN0KHRoaXMuZ3JvdXBjb250YWluZXJFbHQubmF0aXZlRWxlbWVudCk7XHJcbiAgY29uc3QgbWFyZ2luID0gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubWFyZ2luO1xyXG4gIFxyXG4gIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gdGhpcy5jYWxjdWxhdGVDaGFydERpbWVuc2lvbnMoXHJcbiAgICBjaGFydENvbnRhaW5lcixcclxuICAgIHZlcnRpY2Fsc3RhY2tlZGNvbnRhaW5lcixcclxuICAgIG1hcmdpbixcclxuICAgIHNlbGZcclxuICApO1xyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBWSVNJQklMSVRZIENPTkZJR1VSQVRJT04gPT09PT09PT09PT09PT09PT09PT1cclxuICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNIZWFkZXJWaXNpYmxlICE9PSB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuaXNIZWFkZXJWaXNpYmxlID0gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNIZWFkZXJWaXNpYmxlO1xyXG4gIH1cclxuXHJcbiAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmxlZ2VuZFZpc2libGUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5sZWdlbmRWaXNpYmxlID0gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubGVnZW5kVmlzaWJsZTtcclxuICB9XHJcblxyXG4gIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1RyYW5zcGFyZW50QmFja2dyb3VuZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICB0aGlzLmlzVHJhbnNwYXJlbnRCYWNrZ3JvdW5kID0gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNUcmFuc3BhcmVudEJhY2tncm91bmQ7XHJcbiAgfVxyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBEQVRBIEZPUk1BVFRJTkcgPT09PT09PT09PT09PT09PT09PT1cclxuICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24udGV4dEZvcm1hdHRlciAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICBmb3JtYXRGcm9tQmFja2VuZCA9IENoYXJ0SGVscGVyLmRhdGFWYWx1ZUZvcm1hdHRlcih0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi50ZXh0Rm9ybWF0dGVyKTtcclxuICAgIGZvcm1hdEZvckh1Z2VOdW1iZXJzID0gQ2hhcnRIZWxwZXIuZGF0YVZhbHVlRm9ybWF0dGVyKCcuMnMnKTtcclxuICB9XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IFNWRyBDT05UQUlORVJTIENSRUFUSU9OID09PT09PT09PT09PT09PT09PT09XHJcbiAgY29uc3Qge1xyXG4gICAgb3V0ZXJDb250YWluZXIsXHJcbiAgICBzdmdZQXhpc0xlZnQsXHJcbiAgICBzdmdZQXhpc1JpZ2h0LFxyXG4gICAgaW5uZXJDb250YWluZXIsXHJcbiAgICBzdmdcclxuICB9ID0gdGhpcy5jcmVhdGVDaGFydENvbnRhaW5lcnMoY2hhcnRDb250YWluZXIsIG1hcmdpbiwgaGVpZ2h0LCBSSUdIVF9TVkdfV0lEVEgsIHNlbGYsIHdpZHRoKTtcclxuXHJcbiAgLy8gT25seSBlbmFibGUgaG9yaXpvbnRhbCBzY3JvbGxpbmcgb24gbW9iaWxlL3RhYmxldCB3aGVuIGluIHpvb21lZC1vdXRcclxuICAvLyBtb2RlIGFuZCB0aGVyZSBhcmUgbWFueSBncm91cHMgb3IgbXVsdGlwbGUgc3ViZ3JvdXBzLiBPdGhlcndpc2Uga2VlcFxyXG4gIC8vIHRoZSBpbm5lciBjb250YWluZXIgZml4ZWQgKG5vIHNjcm9sbGJhcikuXHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IGdyb3Vwc0NvdW50ID0gKGRhdGEgYXMgYW55KS5sZW5ndGggfHwgMDtcclxuICAgIGNvbnN0IHN1Ymdyb3Vwc0NvdW50ID0gKGtleUxpc3QgYXMgYW55ICYmIChrZXlMaXN0IGFzIGFueSkubGVuZ3RoKSB8fCAwO1xyXG4gICAgLy8gU2hvdyBzY3JvbGxiYXIgd2hlbiB0aGVyZSBhcmUgbWFueSBncm91cHMgb3IgbXVsdGlwbGUgc3ViZ3JvdXBzLFxyXG4gICAgLy8gZm9yIEFMTCB2aWV3cG9ydHMgKG1vYmlsZS90YWJsZXQvZGVza3RvcCkgc28gYm90aCB6b29tLWluIGFuZFxyXG4gICAgLy8gem9vbS1vdXQgYWxsb3cgaG9yaXpvbnRhbCBzY3JvbGxpbmcgd2hlbiBjb250ZW50IG92ZXJmbG93cy5cclxuICAgIGlmIChncm91cHNDb3VudCA+IDggfHwgc3ViZ3JvdXBzQ291bnQgPiAyKSB7XHJcbiAgICAgIGlubmVyQ29udGFpbmVyLnN0eWxlKCdvdmVyZmxvdy14JywgJ2F1dG8nKTtcclxuICAgICAgaW5uZXJDb250YWluZXIuY2xhc3NlZCgnc2Nyb2xsLWVuYWJsZWQnLCB0cnVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlubmVyQ29udGFpbmVyLnN0eWxlKCdvdmVyZmxvdy14JywgJ2hpZGRlbicpO1xyXG4gICAgICBpbm5lckNvbnRhaW5lci5jbGFzc2VkKCdzY3JvbGwtZW5hYmxlZCcsIGZhbHNlKTtcclxuICAgIH1cclxuICB9IGNhdGNoIChlKSB7XHJcbiAgICAvLyBpZ25vcmVcclxuICB9XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IFNDQUxFUyBTRVRVUCA9PT09PT09PT09PT09PT09PT09PVxyXG4gIGNvbnN0IHN1Ymdyb3VwczogYW55ID0ga2V5TGlzdDtcclxuICBjb25zdCBncm91cHMgPSBkMy5tYXAoZGF0YSwgKGQpID0+IGQubmFtZSkua2V5cygpO1xyXG5cclxuICAvLyBYLWF4aXMgc2NhbGUgY29uZmlndXJhdGlvblxyXG4gIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc011bHRpQ2hhcnRHcmlkTGluZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICB4ID0gZDMuc2NhbGVCYW5kKClcclxuICAgICAgLnJhbmdlUm91bmQoW3dpZHRoLCAwXSlcclxuICAgICAgLmFsaWduKDAuNSlcclxuICAgICAgLnBhZGRpbmcoWzAuNV0pXHJcbiAgICAgIC5kb21haW4oZGF0YS5tYXAoKGQ6IGFueSkgPT4gZC5uYW1lLnRvTG93ZXJDYXNlKCkpKTtcclxuICB9IGVsc2Uge1xyXG4gICAgeCA9IGQzLnNjYWxlQmFuZCgpXHJcbiAgICAgIC5kb21haW4oZ3JvdXBzKVxyXG4gICAgICAucmFuZ2UoW0xFRlRfQU5EX1JJR0hUX1NQQUNFUywgd2lkdGggLSBSSUdIVF9TVkdfV0lEVEggLSBMRUZUX0FORF9SSUdIVF9TUEFDRVNdKVxyXG4gICAgICAucGFkZGluZyhbMC4zXSk7XHJcbiAgfVxyXG5cclxuICBjb25zdCB4U2NhbGVGcm9tT3JpZ2luID0gZDMuc2NhbGVCYW5kKClcclxuICAgIC5kb21haW4oZ3JvdXBzKVxyXG4gICAgLnJhbmdlKFswLCB3aWR0aCAtIFJJR0hUX1NWR19XSURUSF0pO1xyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBYLUFYSVMgUkVOREVSSU5HID09PT09PT09PT09PT09PT09PT09XHJcbiAgdGhpcy5yZW5kZXJYQXhpcyhzdmcsIHgsIGhlaWdodCwgbWV0YURhdGEsIHN1Ymdyb3VwcywgZGF0YSwgXHJcbiAgICBTSE9SVF9USUNLX0xFTkdUSF9CRywgTE9OR19USUNLX0xFTkdUSF9CRywgc2VsZiwgaXNyaWEsIGlzTW9iaWxlKTtcclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gWS1BWElTIFNFVFVQID09PT09PT09PT09PT09PT09PT09XHJcbiAgY29uc3QgeSA9IGQzLnNjYWxlTGluZWFyKCkucmFuZ2VSb3VuZChbaGVpZ2h0LCAwXSk7XHJcbiAgbGV0IG1heFZhbHVlID0gdGhpcy5jYWxjdWxhdGVNYXhWYWx1ZShkYXRhLCBrZXlMaXN0KTtcclxuXHJcbiAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmN1c3RvbVlzY2FsZSkge1xyXG4gICAgbWF4VmFsdWUgPSBtYXhWYWx1ZSAqIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmN1c3RvbVlzY2FsZTtcclxuICB9XHJcblxyXG4gIGlmICh0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YSAmJiBtYXhWYWx1ZSA8IHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLnRhcmdldCkge1xyXG4gICAgbWF4VmFsdWUgPSBtYXhWYWx1ZSA8IDEwICYmIHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLnRhcmdldCA8IDEwXHJcbiAgICAgID8gdGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEudGFyZ2V0ICsgM1xyXG4gICAgICA6IHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLnRhcmdldCArIDIwO1xyXG4gIH1cclxuXHJcbiAgeS5kb21haW4oWzAsIG1heFZhbHVlXSkubmljZSgpO1xyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBMSU5FIENIQVJUIFktU0NBTEUgPT09PT09PT09PT09PT09PT09PT1cclxuICBsZXQgbGluZVlzY2FsZTtcclxuICBsZXQgeUxpbmVBeGlzO1xyXG5cclxuICBpZiAobGluZURhdGEgIT0gbnVsbCkge1xyXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zZXR1cExpbmVZU2NhbGUobGluZURhdGEsIGhlaWdodCwgc2VsZik7XHJcbiAgICBsaW5lWXNjYWxlID0gcmVzdWx0LmxpbmVZc2NhbGU7XHJcbiAgICB5TGluZUF4aXMgPSByZXN1bHQueUxpbmVBeGlzO1xyXG4gIH1cclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gR1JJRCBMSU5FUyA9PT09PT09PT09PT09PT09PT09PVxyXG4gIHRoaXMucmVuZGVyR3JpZExpbmVzKHN2ZywgeCwgeSwgaGVpZ2h0LCB3aWR0aCwgc2VsZik7XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IEJBUlMgUkVOREVSSU5HID09PT09PT09PT09PT09PT09PT09XHJcbiAgY29uc3QgeFN1Ymdyb3VwID0gdGhpcy5zZXR1cFhTdWJncm91cFNjYWxlKHN1Ymdyb3VwcywgeCwgc2VsZik7XHJcbiAgY29uc3QgY29sb3IgPSBkMy5zY2FsZU9yZGluYWwoKVxyXG4gICAgLmRvbWFpbihzdWJncm91cHMpXHJcbiAgICAucmFuZ2UoT2JqZWN0LnZhbHVlcyhtZXRhRGF0YS5jb2xvcnMpKTtcclxuXHJcbiAgdGhpcy5yZW5kZXJCYXJzKHN2ZywgZGF0YSwgc3ViZ3JvdXBzLCB4LCB4U3ViZ3JvdXAsIHksIGhlaWdodCwgY29sb3IsIFxyXG4gICAgbWV0YURhdGEsIHNlbGYsIExFRlRfQU5EX1JJR0hUX1NQQUNFUywgdGVtcFNjYWxlLCBpc3JpYSk7XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IEJBUiBMQUJFTFMgPT09PT09PT09PT09PT09PT09PT1cclxuICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24udGV4dHNPbkJhciAhPT0gdW5kZWZpbmVkICYmICF0aGlzLmlzWm9vbWVkT3V0KSB7XHJcbiAgICB0aGlzLnJlbmRlckJhckxhYmVscyhzdmcsIGRhdGEsIHN1Ymdyb3VwcywgeCwgeFN1Ymdyb3VwLCB5LCBoZWlnaHQsIFxyXG4gICAgICBtZXRhRGF0YSwgc2VsZiwgdGVtcFNjYWxlLCBpc3JpYSk7XHJcbiAgfVxyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBZLUFYSVMgUkVOREVSSU5HID09PT09PT09PT09PT09PT09PT09XHJcbiAgdGhpcy5yZW5kZXJZQXhpcyhzdmcsIHN2Z1lBeGlzTGVmdCwgc3ZnWUF4aXNSaWdodCwgeSwgeUxpbmVBeGlzLCBcclxuICAgIGxpbmVEYXRhLCBzZWxmLCBpc3JpYSwgbWFyZ2luKTtcclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gQVhJUyBMQUJFTFMgPT09PT09PT09PT09PT09PT09PT1cclxuICB0aGlzLnJlbmRlckF4aXNMYWJlbHMoc3ZnLCBzdmdZQXhpc0xlZnQsIHN2Z1lBeGlzUmlnaHQsIG1ldGFEYXRhLCBcclxuICAgIHdpZHRoLCBoZWlnaHQsIG1hcmdpbiwgc2VsZiwgaXNyaWEsIFJJR0hUX1NWR19XSURUSCk7XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IFRBUkdFVCBMSU5FID09PT09PT09PT09PT09PT09PT09XHJcbiAgaWYgKHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhKSB7XHJcbiAgICB0aGlzLnJlbmRlclRhcmdldExpbmUoc3ZnLCBzdmdZQXhpc1JpZ2h0LCB5LCB3aWR0aCwgUklHSFRfU1ZHX1dJRFRILCBcclxuICAgICAgbWV0YURhdGEsIHNlbGYpO1xyXG4gIH1cclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gTElORSBDSEFSVCA9PT09PT09PT09PT09PT09PT09PVxyXG4gIGlmIChsaW5lRGF0YSkge1xyXG4gICAgdGhpcy5yZW5kZXJMaW5lQ2hhcnQoc3ZnLCBsaW5lRGF0YSwgeCwgbGluZVlzY2FsZSwgbWV0YURhdGEsIHNlbGYpO1xyXG4gIH1cclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gWk9PTSBIQU5ETElORyA9PT09PT09PT09PT09PT09PT09PVxyXG4gIGlmICh0aGlzLmlzWm9vbWVkT3V0KSB7XHJcbiAgICB0aGlzLmhhbmRsZVpvb21PdXQoc3ZnLCBoZWlnaHQsIG1hcmdpbik7XHJcbiAgfVxyXG59XHJcblxyXG4vLyA9PT09PT09PT09PT09PT09PT09PSBIRUxQRVIgTUVUSE9EUyA9PT09PT09PT09PT09PT09PT09PVxyXG5cclxucHJpdmF0ZSByZW5kZXJYQXhpcyhzdmcsIHgsIGhlaWdodCwgbWV0YURhdGEsIHN1Ymdyb3VwcywgZGF0YSwgXHJcbiAgc2hvcnRUaWNrTGVuZ3RoQmcsIGxvbmdUaWNrTGVuZ3RoQmcsIHNlbGYsIGlzcmlhLCBpc01vYmlsZSkge1xyXG4gIFxyXG4gIGxldCBhbHRlcm5hdGVfdGV4dCA9IGZhbHNlO1xyXG5cclxuICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNNdWx0aUNoYXJ0R3JpZExpbmUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgLy8gTm9ybWFsIHRpY2tzIGZvciBkYXNoYm9hcmQgY2hhcnRzXHJcbiAgICBzdmcuYXBwZW5kKCdnJylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ3gxIGF4aXMxJylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoMCwke2hlaWdodH0pYClcclxuICAgICAgLmNhbGwoZDMuYXhpc0JvdHRvbSh4KSlcclxuICAgICAgLmNhbGwoKGcpID0+IGcuc2VsZWN0KCcuZG9tYWluJykucmVtb3ZlKCkpO1xyXG5cclxuICAgIHN2Zy5zZWxlY3RBbGwoJ2cueDEuYXhpczEgZy50aWNrIGxpbmUnKS5yZW1vdmUoKTtcclxuXHJcbiAgICBjb25zdCB5T2Zmc2V0ID0gc3ViZ3JvdXBzLmxlbmd0aCA+IDEgJiYgIW1ldGFEYXRhLnhMYWJlbCA/IDMyIDogMDtcclxuICAgIHN2Zy5zZWxlY3RBbGwoJ2cueDEuYXhpczEgZy50aWNrIHRleHQnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGliLXhheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24nKVxyXG4gICAgICAuc3R5bGUoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKVxyXG4gICAgICAuYXR0cigneScsIHlPZmZzZXQgfHwgbnVsbCk7XHJcbiAgfSBlbHNlIHtcclxuICAgIC8vIEJpZ2dlciB0aWNrcyBmb3Igd2Vla2x5IGNoYXJ0c1xyXG4gICAgc3ZnLmFwcGVuZCgnZycpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICd4MSBheGlzMScpXHJcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsJHtoZWlnaHR9KWApXHJcbiAgICAgIC5jYWxsKGQzLmF4aXNCb3R0b20oeCkudGlja1NpemUoMCkpXHJcbiAgICAgIC5jYWxsKChnKSA9PiBnLnNlbGVjdCgnLmRvbWFpbicpLmF0dHIoJ2ZpbGwnLCAnbm9uZScpKTtcclxuXHJcbiAgICAvLyBBbHRlcm5hdGUgdGljayBsaW5lIHNpemVzXHJcbiAgICBzdmcuc2VsZWN0QWxsKCdnLngxLmF4aXMxIGcudGljayBsaW5lJykuYXR0cigneTInLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIGlmIChhbHRlcm5hdGVfdGV4dCAmJiBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5pc05vQWx0ZXJuYXRlWGF4aXNUZXh0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBhbHRlcm5hdGVfdGV4dCA9IGZhbHNlO1xyXG4gICAgICAgIHJldHVybiBsb25nVGlja0xlbmd0aEJnIC0gNztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBhbHRlcm5hdGVfdGV4dCA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIHNob3J0VGlja0xlbmd0aEJnIC0gNDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgYWx0ZXJuYXRlX3RleHQgPSBmYWxzZTtcclxuXHJcbiAgICAvLyBYLWF4aXMgbGFiZWwgdGV4dHNcclxuICAgIHN2Zy5zZWxlY3RBbGwoJ2cueDEuYXhpczEgZy50aWNrIHRleHQnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGliLXhheGlzLWxhYmVscy10ZXh0cy13ZWVrbHljaGFydHMnKVxyXG4gICAgICAuYXR0cigneScsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNGdWxsU2NyZWVuKSB7XHJcbiAgICAgICAgICByZXR1cm4gc2hvcnRUaWNrTGVuZ3RoQmc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhbHRlcm5hdGVfdGV4dCkge1xyXG4gICAgICAgICAgYWx0ZXJuYXRlX3RleHQgPSBmYWxzZTtcclxuICAgICAgICAgIHJldHVybiBsb25nVGlja0xlbmd0aEJnO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBhbHRlcm5hdGVfdGV4dCA9IHRydWU7XHJcbiAgICAgICAgICByZXR1cm4gc2hvcnRUaWNrTGVuZ3RoQmc7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIEFwcGx5IGxhYmVscyBvbiBzYW1lIGxpbmUgY29uZmlndXJhdGlvblxyXG4gIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi54TGFiZWxzT25TYW1lTGluZSkge1xyXG4gICAgdGhpcy5hcHBseVhMYWJlbHNPblNhbWVMaW5lKHN2Zywgc3ViZ3JvdXBzLCBkYXRhLCBtZXRhRGF0YSwgc2VsZiwgXHJcbiAgICAgIHNob3J0VGlja0xlbmd0aEJnLCBpc01vYmlsZSwgaXNyaWEpO1xyXG4gIH1cclxuXHJcbiAgLy8gTW9iaWxlIG92ZXJyaWRlIGZvciBSSUFcclxuICBpZiAoaXNyaWEgJiYgc2VsZi5jaGFydERhdGEuZGF0YS5sZW5ndGggPiA4KSB7XHJcbiAgICBzdmcuc2VsZWN0QWxsKCdnLngxLmF4aXMxIGcudGljayB0ZXh0JylcclxuICAgICAgLmNsYXNzZWQoJ21vYmlsZS14YXhpcy1vdmVycmlkZScsIHRydWUpXHJcbiAgICAgIC50ZXh0KChkOiBzdHJpbmcpID0+IGQuc3Vic3RyaW5nKDAsIDMpKVxyXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsICcxMnB4JylcclxuICAgICAgLmF0dHIoJ3knLCA1KVxyXG4gICAgICAuYXR0cigneCcsIDUpXHJcbiAgICAgIC5zdHlsZSgndGV4dC1hbmNob3InLCAnbWlkZGxlJyk7XHJcbiAgfVxyXG5cclxuICAvLyBNb2JpbGUgb3ZlcnJpZGUgLSBjaGVjayBmb3Igc2luZ2xlLWdyb3VwIGRhdGUgY2hhcnRzIGZpcnN0XHJcbiAgaWYgKGlzTW9iaWxlKSB7XHJcbiAgICBjb25zdCB0ZXh0Tm9kZXMgPSBzdmcuc2VsZWN0QWxsKCdnLngxLmF4aXMxIGcudGljayB0ZXh0Jyk7XHJcbiAgICBcclxuICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgZGF0ZXMgaW4geC1heGlzIGFuZCBzaW5nbGUgZ3JvdXBcclxuICAgIGxldCBoYXNEYXRlVmFsdWVzID0gZmFsc2U7XHJcbiAgICB0ZXh0Tm9kZXMuZWFjaChmdW5jdGlvbihkKSB7XHJcbiAgICAgIC8vIENoZWNrIGZvciBkYXRlIHZhbHVlcyB1c2luZyBib3RoIERhdGUucGFyc2UgYW5kIHJlZ2V4IGZvciBkYXRlIGZvcm1hdFxyXG4gICAgICAgIGNvbnN0IGlzRGF0ZVN0cmluZyA9XHJcbiAgICAvXlxcZHsxLDR9Wy1cXC9dXFxkezEsMn1bLVxcL11cXGR7MSw0fSQvLnRlc3QoZC50cmltKCkpIHx8XHJcbiAgICAvXihcXGR7MSw0fVstXFwvXVxcZHsxLDJ9Wy1cXC9dXFxkezEsNH0pXFxzKlst4oCTXVxccyooXFxkezEsNH1bLVxcL11cXGR7MSwyfVstXFwvXVxcZHsxLDR9KSQvLnRlc3QoZC50cmltKCkpO1xyXG4gICAgICBpZiAoIWhhc0RhdGVWYWx1ZXMgJiYgaXNEYXRlU3RyaW5nKSB7XHJcbiAgICAgICAgaGFzRGF0ZVZhbHVlcyA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGlmIChoYXNEYXRlVmFsdWVzICYmIHN1Ymdyb3VwcyAmJiBzdWJncm91cHMubGVuZ3RoIDwgMykge1xyXG4gICAgICAvLyBGb3Igc2luZ2xlIGNoYXJ0IHdpdGggZGF0ZXMsIGVuc3VyZSBob3Jpem9udGFsIGRpc3BsYXlcclxuICAgICAgdGV4dE5vZGVzXHJcbiAgICAgICAgLnN0eWxlKCd3cml0aW5nLW1vZGUnLCAnaG9yaXpvbnRhbC10YicpICAvLyBFeHBsaWNpdGx5IHNldCBob3Jpem9udGFsXHJcbiAgICAgICAgLmNsYXNzZWQoJ21vYmlsZS14YXhpcy1vdmVycmlkZScsIGZhbHNlKSAvLyBSZW1vdmUgdmVydGljYWwgY2xhc3NcclxuICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3JvdGF0ZSgwKScpICAgICAgICAgIC8vIFJlbW92ZSBhbnkgcm90YXRpb25cclxuICAgICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnbWlkZGxlJykgICAgICAgICAgIC8vIENlbnRlciBhbGlnblxyXG4gICAgICAgIC5hdHRyKCd5JywgMjApICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQdXNoIGRvd24gYSBiaXRcclxuICAgICAgICAuYXR0cignZHgnLCAnMCcpICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgYW55IHggb2Zmc2V0XHJcbiAgICAgICAgLmF0dHIoJ2R5JywgJzAnKTsgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IGFueSB5IG9mZnNldFxyXG4gICAgfSBlbHNlIGlmICghdGhpcy5pc0hlYWRlclZpc2libGUpIHtcclxuICAgICAgLy8gRGVmYXVsdCBtb2JpbGUgYmVoYXZpb3IgZm9yIG5vbi1kYXRlIG9yIG11bHRpLWdyb3VwXHJcbiAgICAgIHRleHROb2Rlcy5jbGFzc2VkKCdtb2JpbGUteGF4aXMtb3ZlcnJpZGUnLCB0cnVlKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbnByaXZhdGUgYXBwbHlYTGFiZWxzT25TYW1lTGluZShzdmcsIHN1Ymdyb3VwcywgZGF0YSwgbWV0YURhdGEsIHNlbGYsIFxyXG4gIHNob3J0VGlja0xlbmd0aEJnLCBpc01vYmlsZSwgaXNyaWEpIHtcclxuICBcclxuICBjb25zdCB4QXhpc0xhYmVscyA9IHN2Zy5zZWxlY3RBbGwoJ2cueDEuYXhpczEgZy50aWNrIHRleHQnKVxyXG4gICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi14YXhpcy1sYWJlbHMtdGV4dHMtZHJpbGxkb3duJylcclxuICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy5pc0hlYWRlclZpc2libGUgPyAnMThweCcgOiAnMTRweCcpXHJcbiAgICAuYXR0cigndGV4dC1hbmNob3InLCAnbWlkZGxlJylcclxuICAgIC5hdHRyKCd5JywgKGQpID0+IHRoaXMuY2FsY3VsYXRlWExhYmVsWVBvc2l0aW9uKGQsIHN1Ymdyb3VwcywgZGF0YSwgbWV0YURhdGEsIHNlbGYsIHNob3J0VGlja0xlbmd0aEJnKSlcclxuICAgIC5hdHRyKCd4JywgKGQpID0+IChzZWxmLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aCA+IDggJiYgIXNlbGYuaXNab29tZWRPdXQpID8gMSA6IDApXHJcbiAgICAudGV4dCgoZCkgPT4gdGhpcy5mb3JtYXRYTGFiZWxUZXh0KGQsIGRhdGEsIG1ldGFEYXRhLCBzdWJncm91cHMsIHNlbGYsIGlzTW9iaWxlKSk7XHJcblxyXG4gIC8vIEFwcGx5IHdyaXRpbmctbW9kZSBmb3IgZ3JvdXBlZCBjaGFydHMgd2l0aCBkYXRlIGxhYmVscyBpbiB6b29tZWQtb3V0IHZpZXdcclxuICB4QXhpc0xhYmVscy5lYWNoKGZ1bmN0aW9uKHRoaXM6IFNWR1RleHRFbGVtZW50LCBkOiBhbnkpIHtcclxuICAgIGNvbnN0IGlzRGF0ZUxhYmVsID0gL14oXFxkezIsNH1bLVxcL10pP1xcZHsyLDR9Wy1cXC9dXFxkezIsNH0kLy50ZXN0KGQudHJpbSgpKTtcclxuICAgIGNvbnN0IGlzV2Vla0xhYmVsID0gL3dlZWt8d2t8d1xcZCsvaS50ZXN0KGQpO1xyXG4gICAgXHJcbiAgICBpZiAoc3ViZ3JvdXBzLmxlbmd0aCA+IDEgJiYgc2VsZi5pc1pvb21lZE91dCAmJiBkYXRhLmxlbmd0aCA+IDggJiYgaXNEYXRlTGFiZWwgJiYgIWlzV2Vla0xhYmVsKSB7XHJcbiAgICAgIGQzLnNlbGVjdCh0aGlzKS5zdHlsZSgnd3JpdGluZy1tb2RlJywgJ3NpZGV3YXlzLWxyJyk7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIC8vIEFkZCBzZWNvbmQgbGluZSBmb3Igbm9uLWRhdGUgbGFiZWxzIG9uIGRlc2t0b3BcclxuICBpZiAoIWlzTW9iaWxlKSB7XHJcbiAgICBzdmcuc2VsZWN0QWxsKCdnLngxLmF4aXMxIGcudGljaycpXHJcbiAgICAgIC5maWx0ZXIoKGQpID0+ICEvXFxkezIsNH1bLVxcL10vLnRlc3QoZCkpXHJcbiAgICAgIC5hcHBlbmQoJ3RleHQnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGliLXhheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24nKVxyXG4gICAgICAuYXR0cigneScsIDMwKVxyXG4gICAgICAuYXR0cignZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpXHJcbiAgICAgIC5hdHRyKCd4JywgKGQpID0+IChzZWxmLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aCA+IDggJiYgIXNlbGYuaXNab29tZWRPdXQpID8gMSA6IDApXHJcbiAgICAgIC50ZXh0KChkKSA9PiB7XHJcbiAgICAgICAgaWYgKGQudHJpbSgpLmluZGV4T2YoJyAnKSA+IC0xKSB7XHJcbiAgICAgICAgICByZXR1cm4gZC50cmltKCkuc3Vic3RyaW5nKGQuaW5kZXhPZignICcpLCBkLmxlbmd0aCkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbnByaXZhdGUgY2FsY3VsYXRlWExhYmVsWVBvc2l0aW9uKGQsIHN1Ymdyb3VwcywgZGF0YSwgbWV0YURhdGEsIHNlbGYsIHNob3J0VGlja0xlbmd0aEJnKSB7XHJcbiAgLy8gRm9yIGdyb3VwZWQgYmFyIGNoYXJ0cyB3aXRoIG1hbnkgYmFycyBhbmQgeExhYmVsIHByZXNlbnRcclxuICBpZiAoc3ViZ3JvdXBzLmxlbmd0aCA+IDEgJiYgZGF0YS5sZW5ndGggPiA4ICYmIG1ldGFEYXRhLnhMYWJlbCkge1xyXG4gICAgY29uc3QgaXNEYXRlTGFiZWwgPSAvXFxkezIsNH1bLVxcL10vLnRlc3QoZCk7XHJcbiAgICByZXR1cm4gaXNEYXRlTGFiZWwgPyBzaG9ydFRpY2tMZW5ndGhCZyArIDE0IDogc2hvcnRUaWNrTGVuZ3RoQmc7XHJcbiAgfVxyXG5cclxuICAvLyBGb3IgZ3JvdXBlZCBiYXIgY2hhcnRzIHdpdGggbWFueSBiYXJzIGFuZCBOTyB4TGFiZWxcclxuICBpZiAoc3ViZ3JvdXBzLmxlbmd0aCA+IDEgJiYgZGF0YS5sZW5ndGggPiA4ICYmICFtZXRhRGF0YS54TGFiZWwpIHtcclxuICAgIGNvbnN0IGNoYXJ0SGFzRXh0cmFCb3R0b20gPSBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5tYXJnaW4gJiYgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubWFyZ2luLmJvdHRvbSA+PSA0MDtcclxuICAgIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0Z1bGxTY3JlZW4pIHtcclxuICAgICAgcmV0dXJuIHNob3J0VGlja0xlbmd0aEJnICsgMjtcclxuICAgIH1cclxuICAgIHJldHVybiBjaGFydEhhc0V4dHJhQm90dG9tID8gc2hvcnRUaWNrTGVuZ3RoQmcgOiBzaG9ydFRpY2tMZW5ndGhCZyArIDEwO1xyXG4gIH1cclxuXHJcbiAgLy8gRGVmYXVsdC9mYWxsYmFjayBsb2dpY1xyXG4gIGxldCBiYXNlWSA9IHNlbGYuaXNIZWFkZXJWaXNpYmxlID8gc2hvcnRUaWNrTGVuZ3RoQmcgKyAyNSA6IHNob3J0VGlja0xlbmd0aEJnO1xyXG4gIFxyXG4gIGlmIChzdWJncm91cHMubGVuZ3RoID4gMSAmJiAhbWV0YURhdGEueExhYmVsICYmIFxyXG4gICAgICAoL1xcZHsyLDR9Wy1cXC9dXFxkezJ9Wy1cXC9dXFxkezIsNH0vLnRlc3QoZCkgfHwgL1xcZHsyLDR9Wy1cXC9dXFxkezIsNH0vLnRlc3QoZCkpKSB7XHJcbiAgICBiYXNlWSA9IHNlbGYuaXNIZWFkZXJWaXNpYmxlID8gc2hvcnRUaWNrTGVuZ3RoQmcgKyAxNSA6IHNob3J0VGlja0xlbmd0aEJnICsgMjU7XHJcbiAgfVxyXG5cclxuICBpZiAoL1xcZHsyLDR9Wy1cXC9dXFxkezIsNH0vLnRlc3QoZCkgJiYgZC5pbmRleE9mKCcgJykgPiAtMSkge1xyXG4gICAgYmFzZVkgKz0gNDtcclxuICB9XHJcblxyXG4gIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0Z1bGxTY3JlZW4gJiYgc3ViZ3JvdXBzLmxlbmd0aCA+IDEpIHtcclxuICAgIGJhc2VZID0gTWF0aC5tYXgoc2hvcnRUaWNrTGVuZ3RoQmcsIGJhc2VZIC0gMTApO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGJhc2VZO1xyXG59XHJcblxyXG5wcml2YXRlIGZvcm1hdFhMYWJlbFRleHQoZCwgZGF0YSwgbWV0YURhdGEsIHN1Ymdyb3Vwcywgc2VsZiwgaXNNb2JpbGUpIHtcclxuICAvLyBNb2JpbGUgaGFuZGxpbmc6IGtlZXAgZGF0ZSBsYWJlbHMgaW50YWN0IGZvciBzaW5nbGUtc2VyaWVzIGNoYXJ0cyAoZG8gbm90IHRyaW0pXHJcbiAgaWYgKGlzTW9iaWxlKSB7XHJcbiAgICBjb25zdCBpc0RhdGVMYWJlbCA9IC9cXGR7Miw0fVstXFwvXVxcZHsxLDJ9Wy1cXC9dXFxkezEsNH0vLnRlc3QoZCkgfHwgIWlzTmFOKERhdGUucGFyc2UoZCkpO1xyXG5cclxuICAgIGlmIChpc0RhdGVMYWJlbCAmJiBzdWJncm91cHMgJiYgc3ViZ3JvdXBzLmxlbmd0aCA8IDMpIHtcclxuICAgICAgLy8gRm9yIHNpbmdsZS1zZXJpZXMgY2hhcnRzIG9uIG1vYmlsZSwgc2hvdyBmdWxsIGRhdGUgbGFiZWxzIChubyB0cmltbWluZylcclxuICAgICAgcmV0dXJuIGQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgaGVhZGVyIGlzIGhpZGRlbiAoY29tcGFjdCBtb2JpbGUpLCB0cmltIG5vbi1kYXRlIGxhYmVscyBhcyBiZWZvcmVcclxuICAgIGlmICghc2VsZi5pc0hlYWRlclZpc2libGUpIHtcclxuICAgICAgY29uc3QgZmlyc3RQYXJ0ID0gZC5zcGxpdCgvW1xcc1xcLV0rLylbMF07XHJcbiAgICAgIHJldHVybiBmaXJzdFBhcnQuc3Vic3RyaW5nKDAsIDMpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBDaGVjayBpZiB2YWx1ZSBzaG91bGQgYmUgaWdub3JlZFxyXG4gIGNvbnN0IGlzVmFsdWVUb0JlSWdub3JlZCA9IGRhdGEuc29tZSgoaW5kaXY6IGFueSkgPT4gXHJcbiAgICBpbmRpdi5uYW1lICYmIGluZGl2Lm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gZC50cmltKCkudG9Mb3dlckNhc2UoKSAmJiBcclxuICAgIGluZGl2W21ldGFEYXRhLmtleUxpc3RbMF1dID09PSAtMVxyXG4gICk7XHJcblxyXG4gIGlmIChpc1ZhbHVlVG9CZUlnbm9yZWQpIHtcclxuICAgIHJldHVybiAnJztcclxuICB9XHJcblxyXG4gIC8vIEhhbmRsZSBkYXRlIHJhbmdlIGxhYmVsc1xyXG4gIGNvbnN0IGRhdGVSYW5nZVJlZ2V4ID0gLyhcXGR7Miw0fVstXFwvXVxcZHsyfVstXFwvXVxcZHsyLDR9KVxccyotXFxzKihcXGR7Miw0fVstXFwvXVxcZHsyfVstXFwvXVxcZHsyLDR9KS87XHJcbiAgaWYgKGRhdGVSYW5nZVJlZ2V4LnRlc3QoZC50cmltKCkpKSB7XHJcbiAgICByZXR1cm4gZC50cmltKCkucmVwbGFjZShkYXRlUmFuZ2VSZWdleCwgKG0sIGQxLCBkMikgPT4gYCR7ZDF9IC0gJHtkMn1gKTtcclxuICB9XHJcblxyXG4gIC8vIFNwbGl0IGRhdGUgYW5kIHdlZWsgbGFiZWxzIGludG8gdHdvIGxpbmVzXHJcbiAgY29uc3QgaXNEYXRlTGFiZWwgPSAvXFxkezIsNH1bLVxcL10vLnRlc3QoZCk7XHJcbiAgY29uc3QgaXNXZWVrTGFiZWwgPSAvd2Vla3x3a3x3XFxkKy9pLnRlc3QoZCk7XHJcbiAgXHJcbiAgaWYgKHN1Ymdyb3Vwcy5sZW5ndGggPiAxICYmICFzZWxmLmlzWm9vbWVkT3V0ICYmIGRhdGEubGVuZ3RoID4gOCAmJiBcclxuICAgICAgZC5pbmRleE9mKCcgJykgPiAtMSAmJiAoaXNEYXRlTGFiZWwgfHwgaXNXZWVrTGFiZWwpKSB7XHJcbiAgICBjb25zdCBmaXJzdCA9IGQuc3Vic3RyaW5nKDAsIGQuaW5kZXhPZignICcpKTtcclxuICAgIGNvbnN0IHNlY29uZCA9IGQuc3Vic3RyaW5nKGQuaW5kZXhPZignICcpICsgMSkudHJpbSgpO1xyXG4gICAgcmV0dXJuIGAke2ZpcnN0fVxcbiR7c2Vjb25kfWA7XHJcbiAgfVxyXG5cclxuICAvLyBIYW5kbGUgZGF0ZSBsYWJlbHMgaW4gbWluaW1pemVkIHZpZXdcclxuICBpZiAoaXNEYXRlTGFiZWwpIHtcclxuICAgIGlmICghc2VsZi5pc0hlYWRlclZpc2libGUgJiYgZGF0YS5sZW5ndGggPiA4ICYmIGQuaW5kZXhPZignICcpID4gLTEpIHtcclxuICAgICAgY29uc3QgZmlyc3QgPSBkLnN1YnN0cmluZygwLCBkLmluZGV4T2YoJyAnKSk7XHJcbiAgICAgIGNvbnN0IHNlY29uZCA9IGQuc3Vic3RyaW5nKGQuaW5kZXhPZignICcpICsgMSkudHJpbSgpO1xyXG4gICAgICByZXR1cm4gYCR7Zmlyc3R9XFxuJHtzZWNvbmR9YDtcclxuICAgIH1cclxuICAgIHJldHVybiBkO1xyXG4gIH1cclxuXHJcbiAgLy8gSGFuZGxlIGxhYmVscyB3aXRoIHNwYWNlc1xyXG4gIGlmIChkLnRyaW0oKS5pbmRleE9mKCcgJykgPiAtMSkge1xyXG4gICAgcmV0dXJuIGQudHJpbSgpLnN1YnN0cmluZygwLCBkLmluZGV4T2YoJyAnKSkudG9Mb3dlckNhc2UoKTtcclxuICB9XHJcblxyXG4gIHJldHVybiBkLnRvTG93ZXJDYXNlKCk7XHJcbn1cclxuXHJcbnByaXZhdGUgY2FsY3VsYXRlTWF4VmFsdWUoZGF0YSwga2V5TGlzdCkge1xyXG4gIGxldCBtYXhWYWx1ZSA9IGQzLm1heChkYXRhLCAoZCkgPT4gZDMubWF4KGtleUxpc3QsIChrZXkpID0+ICtkW2tleV0pKTtcclxuICBcclxuICBpZiAobWF4VmFsdWUgPT09IDApIHtcclxuICAgIGlmICh0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YSkge1xyXG4gICAgICBtYXhWYWx1ZSA9IHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLnRhcmdldCArIDIwO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbWF4VmFsdWUgPSAxMDA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gbWF4VmFsdWU7XHJcbn1cclxuXHJcbnByaXZhdGUgc2V0dXBMaW5lWVNjYWxlKGxpbmVEYXRhLCBoZWlnaHQsIHNlbGYpIHtcclxuICBsZXQgbWF4TGluZVZhbHVlID0gZDMubWF4KGxpbmVEYXRhLCAoZCkgPT4gK2QudmFsdWUpO1xyXG4gIG1heExpbmVWYWx1ZSA9IG1heExpbmVWYWx1ZSAqIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmN1c3RvbVlzY2FsZTtcclxuXHJcbiAgbGV0IG1pbkxpbmVWYWx1ZSA9IGQzLm1pbihsaW5lRGF0YSwgKGQpID0+ICtkLnZhbHVlKTtcclxuICBpZiAobWF4TGluZVZhbHVlID4gMCkgbWluTGluZVZhbHVlID0gbWluTGluZVZhbHVlIC0gMztcclxuICBpZiAobWluTGluZVZhbHVlID4gMCkgbWluTGluZVZhbHVlID0gMDtcclxuXHJcbiAgY29uc3QgbGluZVlzY2FsZSA9IGQzLnNjYWxlTGluZWFyKClcclxuICAgIC5kb21haW4oW21pbkxpbmVWYWx1ZSwgbWF4TGluZVZhbHVlXSlcclxuICAgIC5yYW5nZShbaGVpZ2h0LCBtaW5MaW5lVmFsdWVdKTtcclxuXHJcbiAgY29uc3QgeUxpbmVBeGlzID0gZDMuYXhpc1JpZ2h0KGxpbmVZc2NhbGUpXHJcbiAgICAudGlja3Moc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubnVtYmVyT2ZZVGlja3MpXHJcbiAgICAudGlja1NpemUoMClcclxuICAgIC50aWNrRm9ybWF0KHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnlMaW5lQXhpc0xhYmVsRm9tYXR0ZXIpO1xyXG5cclxuICByZXR1cm4geyBsaW5lWXNjYWxlLCB5TGluZUF4aXMgfTtcclxufVxyXG5cclxucHJpdmF0ZSByZW5kZXJHcmlkTGluZXMoc3ZnLCB4LCB5LCBoZWlnaHQsIHdpZHRoLCBzZWxmKSB7XHJcbiAgLy8gWC1heGlzIGdyaWQgYmV0d2VlbiBsYWJlbHNcclxuICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNYZ3JpZEJldHdlZW5MYWJlbHMpIHtcclxuICAgIHN2Zy5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnZ3JpZCcpXHJcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7eC5iYW5kd2lkdGgoKSAvIDJ9LCR7aGVpZ2h0fSlgKVxyXG4gICAgICAuY2FsbChkMy5heGlzQm90dG9tKHgpLnRpY2tTaXplKC1oZWlnaHQpLnRpY2tGb3JtYXQoJycpKVxyXG4gICAgICAuc3R5bGUoJ3N0cm9rZS1kYXNoYXJyYXknLCAnNSA1JylcclxuICAgICAgLnN0eWxlKCdjb2xvcicsICd2YXIoLS1jaGFydC1ncmlkLWNvbG9yLCAjOTk5OTk5KScpXHJcbiAgICAgIC5jYWxsKChnKSA9PiBnLnNlbGVjdCgnLmRvbWFpbicpLnJlbW92ZSgpKTtcclxuICB9XHJcblxyXG4gIC8vIFktYXhpcyBncmlkXHJcbiAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzR3JpZCkge1xyXG4gICAgc3ZnLmFwcGVuZCgnZycpXHJcbiAgICAgIC5jYWxsKGQzLmF4aXNMZWZ0KHkpLnRpY2tzKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLm51bWJlck9mWVRpY2tzKS50aWNrU2l6ZSgtd2lkdGgpKVxyXG4gICAgICAuc3R5bGUoJ2NvbG9yJywgJ3ZhcigtLWNoYXJ0LWF4aXMtY29sb3IsICNCOUI5QjkpJylcclxuICAgICAgLnN0eWxlKCdvcGFjaXR5JywgJzAuNScpXHJcbiAgICAgIC5jYWxsKChnKSA9PiBnLnNlbGVjdCgnLmRvbWFpbicpLnJlbW92ZSgpLnN0eWxlKCdzdHJva2UnLCAndmFyKC0tY2hhcnQtZG9tYWluLWNvbG9yLCAjMDAwMDAwKScpKTtcclxuICB9IGVsc2Uge1xyXG4gICAgc3ZnLmFwcGVuZCgnZycpXHJcbiAgICAgIC5jYWxsKGQzLmF4aXNMZWZ0KHkpLnRpY2tzKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLm51bWJlck9mWVRpY2tzKSlcclxuICAgICAgLnN0eWxlKCdjb2xvcicsICd2YXIoLS1jaGFydC1heGlzLWNvbG9yLCAjQjlCOUI5KScpXHJcbiAgICAgIC5zdHlsZSgnb3BhY2l0eScsICcwLjUnKVxyXG4gICAgICAuY2FsbCgoZykgPT4gZy5zZWxlY3QoJy5kb21haW4nKVxyXG4gICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgJ3ZhcigtLWNoYXJ0LWRvbWFpbi1jb2xvciwgIzAwMDAwMCknKVxyXG4gICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgJzFweCcpKTtcclxuICB9XHJcbn1cclxuXHJcbnByaXZhdGUgc2V0dXBYU3ViZ3JvdXBTY2FsZShzdWJncm91cHMsIHgsIHNlbGYpIHtcclxuICBjb25zdCB4U3ViZ3JvdXAgPSBkMy5zY2FsZUJhbmQoKS5kb21haW4oc3ViZ3JvdXBzKTtcclxuXHJcbiAgaWYgKHN1Ymdyb3Vwcy5sZW5ndGggPiAxICYmICF0aGlzLmlzWm9vbWVkT3V0KSB7XHJcbiAgICB4U3ViZ3JvdXAucmFuZ2UoWzAsIHguYmFuZHdpZHRoKCldKTtcclxuICB9IGVsc2UgaWYgKHN1Ymdyb3Vwcy5sZW5ndGggPT09IDEgJiYgIXRoaXMuaXNab29tZWRPdXQpIHtcclxuICAgIHhTdWJncm91cC5yYW5nZShbMCwgMTAwXSk7XHJcbiAgfSBlbHNlIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc011bHRpQ2hhcnRHcmlkTGluZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICB4U3ViZ3JvdXAucmFuZ2UoWzAsIHguYmFuZHdpZHRoKCldKTtcclxuICB9IGVsc2Uge1xyXG4gICAgeFN1Ymdyb3VwLnJhbmdlKFswLCB4LmJhbmR3aWR0aCgpXSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4geFN1Ymdyb3VwO1xyXG59XHJcblxyXG5wcml2YXRlIHJlbmRlckJhcnMoc3ZnLCBkYXRhLCBzdWJncm91cHMsIHgsIHhTdWJncm91cCwgeSwgaGVpZ2h0LCBjb2xvciwgXHJcbiAgbWV0YURhdGEsIHNlbGYsIGxlZnRBbmRSaWdodFNwYWNlcywgdGVtcFNjYWxlLCBpc3JpYSkge1xyXG4gIFxyXG4gIGNvbnN0IHN0YXRlID0gc3ZnLmFwcGVuZCgnZycpXHJcbiAgICAuc2VsZWN0QWxsKCcuc3RhdGUnKVxyXG4gICAgLmRhdGEoZGF0YSlcclxuICAgIC5lbnRlcigpXHJcbiAgICAuYXBwZW5kKCdnJylcclxuICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAoZCkgPT4gYHRyYW5zbGF0ZSgke3goZC5uYW1lKX0sMClgKTtcclxuXHJcbiAgY29uc3QgYmFycyA9IHN0YXRlLnNlbGVjdEFsbCgncmVjdCcpXHJcbiAgICAuZGF0YSgoZCkgPT4gdGhpcy5wcmVwYXJlQmFyRGF0YShkLCBzdWJncm91cHMpKVxyXG4gICAgLmVudGVyKClcclxuICAgIC5hcHBlbmQoJ3JlY3QnKVxyXG4gICAgLmF0dHIoJ2NsYXNzJywgJ2JhcnMnKVxyXG4gICAgLm9uKCdjbGljaycsIChkKSA9PiB0aGlzLmhhbmRsZUJhckNsaWNrKGQsIG1ldGFEYXRhLCBzZWxmKSlcclxuICAgIC5hdHRyKCd4JywgKGQpID0+IHRoaXMuY2FsY3VsYXRlQmFyWChkLCBkYXRhLCB4LCB4U3ViZ3JvdXAsIHNlbGYsIHRlbXBTY2FsZSkpXHJcbiAgICAuYXR0cigneScsIChkKSA9PiB0aGlzLmNhbGN1bGF0ZUJhclkoZCwgeSwgaGVpZ2h0LCBzZWxmKSlcclxuICAgIC5hdHRyKCd3aWR0aCcsIChkKSA9PiB0aGlzLmNhbGN1bGF0ZUJhcldpZHRoKGQsIGRhdGEsIHN1Ymdyb3VwcywgeCwgeFN1Ymdyb3VwLCBzZWxmLCB0ZW1wU2NhbGUpKVxyXG4gICAgLmF0dHIoJ2hlaWdodCcsIChkKSA9PiB0aGlzLmNhbGN1bGF0ZUJhckhlaWdodChkLCB5LCBoZWlnaHQsIHNlbGYpKVxyXG4gICAgLnN0eWxlKCdjdXJzb3InLCAoKSA9PiAobWV0YURhdGEuaGFzRHJpbGxEb3duICYmICFpc3JpYSkgPyAncG9pbnRlcicgOiAnZGVmYXVsdCcpXHJcbiAgICAuYXR0cignZmlsbCcsIChkKSA9PiB0aGlzLmdldEJhckNvbG9yKGQsIG1ldGFEYXRhLCBzZWxmKSk7XHJcblxyXG4gIC8vIEF0dGFjaCBtb3VzZSBldmVudHMgaWYgbm90IFJJQVxyXG4gIGlmICghaXNyaWEgJiYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmRpc3BsYXlUaXRsZU9uVG9wIHx8IFxyXG4gICAgICAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24udGV4dHNPbkJhciA9PT0gdW5kZWZpbmVkICYmIFxyXG4gICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uZGlzcGxheVRpdGxlT25Ub3AgPT09IHVuZGVmaW5lZCkpKSB7XHJcbiAgICBiYXJzLm9uKCdtb3VzZW91dCcsIChkLCBpKSA9PiB0aGlzLmhhbmRsZU1vdXNlT3V0KHN2ZykpXHJcbiAgICAgICAgLm9uKCdtb3VzZW92ZXInLCAoZCwgaSkgPT4gdGhpcy5oYW5kbGVNb3VzZU92ZXIoZCwgc3ZnLCBkYXRhLCB4LCB5LCBoZWlnaHQsIG1ldGFEYXRhLCBzZWxmLCBsZWZ0QW5kUmlnaHRTcGFjZXMsIHRlbXBTY2FsZSkpO1xyXG4gIH1cclxufVxyXG5cclxucHJpdmF0ZSBwcmVwYXJlQmFyRGF0YShkLCBzdWJncm91cHMpIHtcclxuICBjb25zdCBuZXdMaXN0OiBhbnkgPSBbXTtcclxuICBzdWJncm91cHMuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICBuZXdMaXN0LnB1c2goeyBrZXk6IGtleSwgdmFsdWU6IGRba2V5XSwgbmFtZTogZC5uYW1lIH0pO1xyXG4gIH0pO1xyXG4gIHJldHVybiBuZXdMaXN0O1xyXG59XHJcblxyXG5wcml2YXRlIGhhbmRsZUJhckNsaWNrKGQsIG1ldGFEYXRhLCBzZWxmKSB7XHJcbiAgaWYgKGQua2V5ICE9PSAnVGFyZ2V0Jykge1xyXG4gICAgaWYgKCFtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2sgfHwgIW1ldGFEYXRhLmJhcldpdGhvdXRDbGljay5sZW5ndGggfHxcclxuICAgICAgICAoIW1ldGFEYXRhLmJhcldpdGhvdXRDbGljay5pbmNsdWRlcyhkPy5uYW1lKSAmJiBcclxuICAgICAgICAgIW1ldGFEYXRhLmJhcldpdGhvdXRDbGljay5pbmNsdWRlcyhkPy5rZXkpKSkge1xyXG4gICAgICBzZWxmLmhhbmRsZUNsaWNrKGQpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxucHJpdmF0ZSBjYWxjdWxhdGVCYXJYKGQsIGRhdGEsIHgsIHhTdWJncm91cCwgc2VsZiwgdGVtcFNjYWxlKSB7XHJcbiAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmlzRHJpbGxkb3duQ2hhcnQpIHtcclxuICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZURyaWxsZG93bkJhclgoZCwgZGF0YSwgeCwgc2VsZiwgdGVtcFNjYWxlKTtcclxuICB9XHJcbiAgcmV0dXJuIHhTdWJncm91cChkLmtleSk7XHJcbn1cclxuXHJcbnByaXZhdGUgY2FsY3VsYXRlRHJpbGxkb3duQmFyWChkLCBkYXRhLCB4LCBzZWxmLCB0ZW1wU2NhbGUpIHtcclxuICBkYXRhLmZvckVhY2goKGluZGl2OiBhbnkpID0+IHtcclxuICAgIGlmIChpbmRpdi5uYW1lID09PSBkLm5hbWUpIHtcclxuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGluZGl2KS5maWx0ZXIoKHRlbXAsIGkpID0+IGkgIT09IDApO1xyXG4gICAgICB0ZW1wU2NhbGUgPSBkMy5zY2FsZUJhbmQoKS5kb21haW4oa2V5cykucmFuZ2UoWzAsIHguYmFuZHdpZHRoKCldKTtcclxuICAgICAgXHJcbiAgICAgIGlmICh4LmJhbmR3aWR0aCgpID4gMTAwKSB7XHJcbiAgICAgICAgY29uc3QgcmVkdWNlZEJhcldpZHRoID0gc2VsZi5pc1pvb21lZE91dCA/IDYwIDogMzA7XHJcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gKHguYmFuZHdpZHRoKCkgLSByZWR1Y2VkQmFyV2lkdGgpIC8gMjtcclxuICAgICAgICB0ZW1wU2NhbGUucmFuZ2UoW29mZnNldCwgeC5iYW5kd2lkdGgoKSAtIG9mZnNldF0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgcmV0dXJuIHRlbXBTY2FsZShkLmtleSk7XHJcbn1cclxuXHJcbnByaXZhdGUgY2FsY3VsYXRlQmFyWShkLCB5LCBoZWlnaHQsIHNlbGYpIHtcclxuICBpZiAoZC52YWx1ZSA9PT0gLTEpIHtcclxuICAgIHJldHVybiB5KDApO1xyXG4gIH1cclxuXHJcbiAgaWYgKGQudmFsdWUgPj0gMCkge1xyXG4gICAgY29uc3QgYmFySGVpZ2h0ID0gaGVpZ2h0IC0geShkLnZhbHVlKTtcclxuICAgIGNvbnN0IG1pbkhlaWdodCA9IHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmRlZmF1bHRCYXJIZWlnaHQgfHwgMjtcclxuICAgIHJldHVybiBiYXJIZWlnaHQgPCBtaW5IZWlnaHQgPyB5KDApIC0gbWluSGVpZ2h0IDogeShkLnZhbHVlKTtcclxuICB9XHJcblxyXG4gIHJldHVybiB5KDApO1xyXG59XHJcblxyXG5wcml2YXRlIGNhbGN1bGF0ZUJhcldpZHRoKGQsIGRhdGEsIHN1Ymdyb3VwcywgeCwgeFN1Ymdyb3VwLCBzZWxmLCB0ZW1wU2NhbGUpIHtcclxuICAvLyBEZXZpY2UgZGV0ZWN0aW9uIGZvciByZXNwb25zaXZlIHNpemluZ1xyXG4gIGNvbnN0IGlzTW9iaWxlID0gd2luZG93LmlubmVyV2lkdGggPCA1NzY7XHJcbiAgY29uc3QgaXNUYWJsZXQgPSB3aW5kb3cuaW5uZXJXaWR0aCA+PSA1NzYgJiYgd2luZG93LmlubmVyV2lkdGggPCA5OTI7XHJcblxyXG4gIC8vIEZvciBncm91cGVkIGJhciBjaGFydHMgaW4gem9vbS1pbiB2aWV3XHJcbiAgaWYgKHN1Ymdyb3Vwcy5sZW5ndGggPiAxICYmICFzZWxmLmlzWm9vbWVkT3V0KSB7XHJcbiAgICByZXR1cm4gaXNNb2JpbGUgPyAyMiA6IGlzVGFibGV0ID8gMzYgOiA1MDtcclxuICB9XHJcblxyXG4gIC8vIEZvciBzaW5nbGUtYmFyIGNoYXJ0cyBpbiB6b29tLWluIHZpZXdcclxuICBpZiAoc3ViZ3JvdXBzLmxlbmd0aCA9PT0gMSAmJiAhc2VsZi5pc1pvb21lZE91dCkge1xyXG4gICAgcmV0dXJuIGlzTW9iaWxlID8gNjAgOiA4MDtcclxuICB9XHJcblxyXG4gIC8vIE1pbmltdW0gYmFyIHdpZHRocyBmb3Igem9vbWVkLW91dCBzdGF0ZVxyXG4gIGNvbnN0IG1pbkJhcldpZHRoID0gKCgpID0+IHtcclxuICAgIGlmIChzdWJncm91cHMubGVuZ3RoID4gMikge1xyXG4gICAgICByZXR1cm4gaXNNb2JpbGUgPyAxOCA6IGlzVGFibGV0ID8gMjQgOiAzMDtcclxuICAgIH1cclxuICAgIHJldHVybiBpc01vYmlsZSA/IDEyIDogaXNUYWJsZXQgPyAxNiA6IDIwO1xyXG4gIH0pKCk7XHJcblxyXG4gIC8vIERlZmF1bHQgbG9naWMgZm9yIGRyaWxsZG93biBjaGFydHNcclxuICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCkge1xyXG4gICAgbGV0IGNhbGN1bGF0ZWRTY2FsZSA9IGQzLnNjYWxlQmFuZCgpLmRvbWFpbihbXSkucmFuZ2UoWzAsIDBdKTtcclxuICAgIFxyXG4gICAgZGF0YS5mb3JFYWNoKChpbmRpdjogYW55KSA9PiB7XHJcbiAgICAgIGlmIChpbmRpdi5uYW1lID09PSBkLm5hbWUpIHtcclxuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaW5kaXYpLmZpbHRlcigodGVtcCwgaSkgPT4gaSAhPT0gMCk7XHJcbiAgICAgICAgY2FsY3VsYXRlZFNjYWxlID0gZDMuc2NhbGVCYW5kKCkuZG9tYWluKGtleXMpLnJhbmdlKFswLCB4LmJhbmR3aWR0aCgpXSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHguYmFuZHdpZHRoKCkgPiAxMDApIHtcclxuICAgICAgICAgIGNvbnN0IHJlZHVjZWRCYXJXaWR0aCA9IHNlbGYuaXNab29tZWRPdXQgPyA2MCA6IDEwMDtcclxuICAgICAgICAgIGNvbnN0IG9mZnNldCA9ICh4LmJhbmR3aWR0aCgpIC0gcmVkdWNlZEJhcldpZHRoKSAvIDI7XHJcbiAgICAgICAgICBjYWxjdWxhdGVkU2NhbGUucmFuZ2UoW29mZnNldCwgeC5iYW5kd2lkdGgoKSAtIG9mZnNldF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBcclxuICAgIC8vIEVuc3VyZSBtaW5pbXVtIHdpZHRoIGV2ZW4gaW4gZHJpbGxkb3duIG1vZGVcclxuICAgIHJldHVybiBNYXRoLm1heChjYWxjdWxhdGVkU2NhbGUuYmFuZHdpZHRoKCksIG1pbkJhcldpZHRoKTtcclxuICB9XHJcblxyXG4gIC8vIEZvciByZWd1bGFyIGNoYXJ0cywgZW5zdXJlIG1pbmltdW0gd2lkdGhcclxuICByZXR1cm4gTWF0aC5tYXgoeFN1Ymdyb3VwLmJhbmR3aWR0aCgpLCBtaW5CYXJXaWR0aCk7XHJcbn1cclxuXHJcbnByaXZhdGUgY2FsY3VsYXRlQmFySGVpZ2h0KGQsIHksIGhlaWdodCwgc2VsZikge1xyXG4gIGlmIChkLnZhbHVlID09PSAtMSkge1xyXG4gICAgcmV0dXJuIGhlaWdodCAtIHkoMCk7XHJcbiAgfVxyXG5cclxuICBpZiAoZC52YWx1ZSA+PSAwKSB7XHJcbiAgICBjb25zdCBiYXJIZWlnaHQgPSBoZWlnaHQgLSB5KGQudmFsdWUpO1xyXG4gICAgY29uc3QgbWluSGVpZ2h0ID0gc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uZGVmYXVsdEJhckhlaWdodCB8fCAyO1xyXG4gICAgcmV0dXJuIE1hdGgubWF4KGJhckhlaWdodCwgbWluSGVpZ2h0KTtcclxuICB9XHJcblxyXG4gIHJldHVybiBoZWlnaHQgLSB5KDApO1xyXG59XHJcblxyXG5wcml2YXRlIGdldEJhckNvbG9yKGQsIG1ldGFEYXRhLCBzZWxmKSB7XHJcbiAgaWYgKGQudmFsdWUgJiYgc2VsZi5jaGFydERhdGEudGFyZ2V0TGluZURhdGEgJiYgXHJcbiAgICAgIGQudmFsdWUgPj0gcGFyc2VGbG9hdChzZWxmLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXQpICYmIFxyXG4gICAgICBzZWxmLmNoYXJ0RGF0YS5tZXRhRGF0YS5jb2xvckFib3ZlVGFyZ2V0KSB7XHJcbiAgICBcclxuICAgIGNvbnN0IGtleSA9IGQua2V5LnRvTG93ZXJDYXNlKCk7XHJcbiAgICBjb25zdCBjb2xvckFib3ZlVGFyZ2V0ID0gT2JqZWN0LmtleXMoc2VsZi5jaGFydERhdGEubWV0YURhdGEuY29sb3JBYm92ZVRhcmdldClcclxuICAgICAgLmZpbmQoayA9PiBrLnRvTG93ZXJDYXNlKCkgPT09IGtleSk7XHJcbiAgICBcclxuICAgIGlmIChjb2xvckFib3ZlVGFyZ2V0KSB7XHJcbiAgICAgIHJldHVybiBzZWxmLmNoYXJ0RGF0YS5tZXRhRGF0YS5jb2xvckFib3ZlVGFyZ2V0W2NvbG9yQWJvdmVUYXJnZXRdO1xyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gc2VsZi5jaGFydERhdGEubWV0YURhdGEuY29sb3JzW2Qua2V5XTtcclxufVxyXG5cclxucHJpdmF0ZSByZW5kZXJCYXJMYWJlbHMoc3ZnLCBkYXRhLCBzdWJncm91cHMsIHgsIHhTdWJncm91cCwgeSwgaGVpZ2h0LCBcclxuICBtZXRhRGF0YSwgc2VsZiwgdGVtcFNjYWxlLCBpc3JpYSkge1xyXG4gIFxyXG4gIGNvbnN0IHN0YXRlID0gc3ZnLnNlbGVjdEFsbCgnLnN0YXRlJyk7XHJcbiAgXHJcbiAgY29uc3QgbGFiZWxzID0gc3RhdGUuc2VsZWN0QWxsKCd0ZXh0JylcclxuICAgIC5kYXRhKChkKSA9PiB0aGlzLnByZXBhcmVCYXJEYXRhKGQsIHN1Ymdyb3VwcykpXHJcbiAgICAuZW50ZXIoKVxyXG4gICAgLmFwcGVuZCgndGV4dCcpXHJcbiAgICAuYXR0cignZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpXHJcbiAgICAuYXR0cigneCcsIDApXHJcbiAgICAuYXR0cigneScsIDApXHJcbiAgICAuYXR0cignY2xhc3MnLCAnbGliLWRhdGEtbGFiZWxzLXdlZWtseWNoYXJ0cycpXHJcbiAgICAudGV4dCgoZCkgPT4gdGhpcy5mb3JtYXRCYXJMYWJlbChkKSlcclxuICAgIC5zdHlsZSgnZmlsbCcsICcjMDAwJylcclxuICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnYm9sZCcpXHJcbiAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIChkKSA9PiB0aGlzLmNhbGN1bGF0ZUxhYmVsRm9udFNpemUoc2VsZikpXHJcbiAgICAuYXR0cigndHJhbnNmb3JtJywgKGQpID0+IHRoaXMuY2FsY3VsYXRlTGFiZWxUcmFuc2Zvcm0oZCwgZGF0YSwgeCwgeFN1Ymdyb3VwLCB5LCBzZWxmLCB0ZW1wU2NhbGUpKVxyXG4gICAgLm9uKCdjbGljaycsIChkKSA9PiB0aGlzLmhhbmRsZUJhckNsaWNrKGQsIG1ldGFEYXRhLCBzZWxmKSk7XHJcblxyXG4gIGlmICghaXNyaWEpIHtcclxuICAgIGxhYmVscy5vbignbW91c2VvdXQnLCAoKSA9PiB0aGlzLmhhbmRsZU1vdXNlT3V0KHN2ZykpXHJcbiAgICAgICAgICAub24oJ21vdXNlb3ZlcicsIChkKSA9PiB0aGlzLmhhbmRsZU1vdXNlT3ZlcihkLCBzdmcsIGRhdGEsIHgsIHksIGhlaWdodCwgbWV0YURhdGEsIHNlbGYsIDUwLCB0ZW1wU2NhbGUpKTtcclxuICB9XHJcbn1cclxuXHJcbnByaXZhdGUgZm9ybWF0QmFyTGFiZWwoZCkge1xyXG4gIGlmICghZC5rZXkgfHwgIWQudmFsdWUpIHJldHVybiAnJztcclxuICByZXR1cm4gZC5rZXkubGVuZ3RoID4gMjAgPyBkLmtleS5zdWJzdHJpbmcoMCwgMTcpICsgJy4uLicgOiBkLmtleTtcclxufVxyXG5cclxucHJpdmF0ZSBjYWxjdWxhdGVMYWJlbEZvbnRTaXplKHNlbGYpIHtcclxuICBpZiAoc2VsZi5pc1pvb21lZE91dCkgcmV0dXJuICc5cHgnO1xyXG5cclxuICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCkge1xyXG4gICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoID4gMTkwMCkgcmV0dXJuICcxOHB4JztcclxuICAgIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA8IDE0MDApIHJldHVybiAnMTBweCc7XHJcbiAgICByZXR1cm4gJzE0cHgnO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuICcxNHB4JztcclxufVxyXG5cclxucHJpdmF0ZSBjYWxjdWxhdGVMYWJlbFRyYW5zZm9ybShkLCBkYXRhLCB4LCB4U3ViZ3JvdXAsIHksIHNlbGYsIHRlbXBTY2FsZSkge1xyXG4gIGxldCBjYWxjdWxhdGVkU2NhbGU7XHJcbiAgXHJcbiAgZGF0YS5mb3JFYWNoKChpbmRpdjogYW55KSA9PiB7XHJcbiAgICBpZiAoaW5kaXYubmFtZSA9PT0gZC5uYW1lKSB7XHJcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpbmRpdikuZmlsdGVyKCh0ZW1wLCBpKSA9PiBpICE9PSAwKTtcclxuICAgICAgY2FsY3VsYXRlZFNjYWxlID0gZDMuc2NhbGVCYW5kKCkuZG9tYWluKGtleXMpLnJhbmdlKFswLCB4LmJhbmR3aWR0aCgpXSk7XHJcbiAgICAgIFxyXG4gICAgICBpZiAoeC5iYW5kd2lkdGgoKSA+IDEwMCkge1xyXG4gICAgICAgIGlmIChzZWxmLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgY29uc3QgcmVkdWNlZFdpZHRoID0gT2JqZWN0LmtleXMoc2VsZi5jaGFydERhdGEuZGF0YVswXSkubGVuZ3RoID09PSAyID8gMjAwIDogMzAwO1xyXG4gICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gKHguYmFuZHdpZHRoKCkgLSByZWR1Y2VkV2lkdGgpIC8gMjtcclxuICAgICAgICAgIGNhbGN1bGF0ZWRTY2FsZS5yYW5nZShbb2Zmc2V0LCB4LmJhbmR3aWR0aCgpIC0gb2Zmc2V0XSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IG9mZnNldCA9ICh4LmJhbmR3aWR0aCgpIC0gMTI1KSAvIDI7XHJcbiAgICAgICAgICBjYWxjdWxhdGVkU2NhbGUucmFuZ2UoW29mZnNldCwgeC5iYW5kd2lkdGgoKSAtIG9mZnNldF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0pO1xyXG5cclxuICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24udGV4dEFsd2F5c0hvcml6b250YWwpIHtcclxuICAgIHJldHVybiBgdHJhbnNsYXRlKCR7eFN1Ymdyb3VwKGQua2V5KX0sJHt5KGQudmFsdWUpIC0gM30pYDtcclxuICB9XHJcblxyXG4gIGlmICghaXNOYU4oY2FsY3VsYXRlZFNjYWxlKGQua2V5KSkpIHtcclxuICAgIHJldHVybiBgdHJhbnNsYXRlKCR7Y2FsY3VsYXRlZFNjYWxlKGQua2V5KSArIGNhbGN1bGF0ZWRTY2FsZS5iYW5kd2lkdGgoKSAqIDAuNTV9LCR7eSgwKSAtIDEwfSkgcm90YXRlKDI3MClgO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuICd0cmFuc2xhdGUoMCwwKSc7XHJcbn1cclxuXHJcbnByaXZhdGUgaGFuZGxlTW91c2VPdmVyKGQsIHN2ZywgZGF0YSwgeCwgeSwgaGVpZ2h0LCBtZXRhRGF0YSwgc2VsZiwgbGVmdEFuZFJpZ2h0U3BhY2VzLCB0ZW1wU2NhbGUpIHtcclxuICBzdmcuc2VsZWN0QWxsKCcubGliLXZlcnRpY2Fsc3RhY2stdGl0bGUtb250b3AnKS5yZW1vdmUoKTtcclxuXHJcbiAgbGV0IGNhbGN1bGF0ZWRTY2FsZTtcclxuICBsZXQgZWxlbWVudHNDb3VudGVyO1xyXG5cclxuICBkYXRhLmZvckVhY2goKGluZGl2OiBhbnkpID0+IHtcclxuICAgIGlmIChpbmRpdi5uYW1lID09PSBkLm5hbWUpIHtcclxuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGluZGl2KS5maWx0ZXIoKHRlbXAsIGkpID0+IGkgIT09IDApO1xyXG4gICAgICBlbGVtZW50c0NvdW50ZXIgPSBrZXlzLmxlbmd0aDtcclxuICAgICAgY2FsY3VsYXRlZFNjYWxlID0gZDMuc2NhbGVCYW5kKCkuZG9tYWluKGtleXMpLnJhbmdlKFswLCB4LmJhbmR3aWR0aCgpXSk7XHJcbiAgICAgIFxyXG4gICAgICBpZiAoeC5iYW5kd2lkdGgoKSA+IDEwMCkge1xyXG4gICAgICAgIGlmIChzZWxmLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgY29uc3QgcmVkdWNlZFdpZHRoID0gT2JqZWN0LmtleXMoc2VsZi5jaGFydERhdGEuZGF0YVswXSkubGVuZ3RoID09PSAyID8gMjAwIDogMzAwO1xyXG4gICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gKHguYmFuZHdpZHRoKCkgLSByZWR1Y2VkV2lkdGgpIC8gMjtcclxuICAgICAgICAgIGNhbGN1bGF0ZWRTY2FsZS5yYW5nZShbb2Zmc2V0LCB4LmJhbmR3aWR0aCgpIC0gb2Zmc2V0XSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IG9mZnNldCA9ICh4LmJhbmR3aWR0aCgpIC0gMTI1KSAvIDI7XHJcbiAgICAgICAgICBjYWxjdWxhdGVkU2NhbGUucmFuZ2UoW29mZnNldCwgeC5iYW5kd2lkdGgoKSAtIG9mZnNldF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0pO1xyXG5cclxuICBjb25zdCB4UG9zaXRpb24gPSB0aGlzLmNhbGN1bGF0ZVRvb2x0aXBYKGQsIHgsIGNhbGN1bGF0ZWRTY2FsZSwgbWV0YURhdGEsIGxlZnRBbmRSaWdodFNwYWNlcyk7XHJcbiAgY29uc3Qgd2lkdGggPSB0aGlzLmNhbGN1bGF0ZVRvb2x0aXBXaWR0aChjYWxjdWxhdGVkU2NhbGUsIG1ldGFEYXRhLCBsZWZ0QW5kUmlnaHRTcGFjZXMpO1xyXG5cclxuICBzdmcuYXBwZW5kKCdmb3JlaWduT2JqZWN0JylcclxuICAgIC5hdHRyKCd4JywgeFBvc2l0aW9uKVxyXG4gICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi12ZXJ0aWNhbHN0YWNrLXRpdGxlLW9udG9wJylcclxuICAgIC5hdHRyKCd5JywgeShkLnZhbHVlKSAtIDMgLSA0MCAtIDEwKVxyXG4gICAgLmF0dHIoJ2R5JywgZC5jbGFzcylcclxuICAgIC5hdHRyKCd3aWR0aCcsIHdpZHRoKVxyXG4gICAgLmF0dHIoJ2hlaWdodCcsIDUwKVxyXG4gICAgLmFwcGVuZCgneGh0bWw6ZGl2JylcclxuICAgIC5hdHRyKCdjbGFzcycsICd0aXRsZScpXHJcbiAgICAuc3R5bGUoJ3otaW5kZXgnLCA5OSlcclxuICAgIC5odG1sKCgpID0+IHRoaXMuZ2VuZXJhdGVUb29sdGlwSFRNTChkLCBtZXRhRGF0YSkpO1xyXG59XHJcblxyXG5wcml2YXRlIGNhbGN1bGF0ZVRvb2x0aXBYKGQsIHgsIGNhbGN1bGF0ZWRTY2FsZSwgbWV0YURhdGEsIGxlZnRBbmRSaWdodFNwYWNlcykge1xyXG4gIGlmIChtZXRhRGF0YS5oYXNEcmlsbERvd24pIHtcclxuICAgIGlmIChjYWxjdWxhdGVkU2NhbGUuYmFuZHdpZHRoKCkgKyBsZWZ0QW5kUmlnaHRTcGFjZXMgKiAyID4gMTgwKSB7XHJcbiAgICAgIHJldHVybiB4KGQubmFtZSkgKyBjYWxjdWxhdGVkU2NhbGUoZC5rZXkpICsgY2FsY3VsYXRlZFNjYWxlLmJhbmR3aWR0aCgpIC8gMiAtIDkwO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHgoZC5uYW1lKSArIGNhbGN1bGF0ZWRTY2FsZShkLmtleSkgLSBcclxuICAgICAgICAgICAoY2FsY3VsYXRlZFNjYWxlLmJhbmR3aWR0aCgpICsgbGVmdEFuZFJpZ2h0U3BhY2VzICogMikgLyAyICsgXHJcbiAgICAgICAgICAgY2FsY3VsYXRlZFNjYWxlLmJhbmR3aWR0aCgpIC8gMjtcclxuICB9XHJcbiAgcmV0dXJuIHgoZC5uYW1lKSArIGNhbGN1bGF0ZWRTY2FsZShkLmtleSkgLSBcclxuICAgICAgICAgKGNhbGN1bGF0ZWRTY2FsZS5iYW5kd2lkdGgoKSArIGxlZnRBbmRSaWdodFNwYWNlcyAqIDIpIC8gMiArIFxyXG4gICAgICAgICBjYWxjdWxhdGVkU2NhbGUuYmFuZHdpZHRoKCkgLyAyO1xyXG59XHJcblxyXG5wcml2YXRlIGNhbGN1bGF0ZVRvb2x0aXBXaWR0aChjYWxjdWxhdGVkU2NhbGUsIG1ldGFEYXRhLCBsZWZ0QW5kUmlnaHRTcGFjZXMpIHtcclxuICBpZiAobWV0YURhdGEuaGFzRHJpbGxEb3duKSB7XHJcbiAgICBpZiAoY2FsY3VsYXRlZFNjYWxlLmJhbmR3aWR0aCgpICsgbGVmdEFuZFJpZ2h0U3BhY2VzICogMiA+IDE4MCkge1xyXG4gICAgICByZXR1cm4gJzE4MHB4JztcclxuICAgIH1cclxuICAgIHJldHVybiBjYWxjdWxhdGVkU2NhbGUuYmFuZHdpZHRoKCkgKyBsZWZ0QW5kUmlnaHRTcGFjZXMgKiAyO1xyXG4gIH1cclxuICByZXR1cm4gY2FsY3VsYXRlZFNjYWxlLmJhbmR3aWR0aCgpICsgbGVmdEFuZFJpZ2h0U3BhY2VzICogMjtcclxufVxyXG5cclxucHJpdmF0ZSBnZW5lcmF0ZVRvb2x0aXBIVE1MKGQsIG1ldGFEYXRhKSB7XHJcbiAgY29uc3QgYmFyTGFiZWwgPSBkLmtleTtcclxuICBjb25zdCBkYXRhVHlwZSA9IG1ldGFEYXRhLmRhdGFUeXBlIHx8ICcnO1xyXG4gIGNvbnN0IHZhbHVlID0gZC52YWx1ZTtcclxuICBcclxuICBsZXQgaHRtbCA9IGA8c3BhbiBjbGFzcz1cInRpdGxlLWJhci1uYW1lXCI+JHtiYXJMYWJlbH08L3NwYW4+YDtcclxuICBodG1sICs9IGA8c3BhbiBjbGFzcz1cInRpdGxlLWJhci12YWx1ZVwiPjxzcGFuPiR7dmFsdWV9PC9zcGFuPiR7ZGF0YVR5cGV9PC9zcGFuPmA7XHJcbiAgXHJcbiAgcmV0dXJuIGh0bWw7XHJcbn1cclxuXHJcbnByaXZhdGUgaGFuZGxlTW91c2VPdXQoc3ZnKSB7XHJcbiAgc3ZnLnNlbGVjdEFsbCgnLmxpYi12ZXJ0aWNhbHN0YWNrLXRpdGxlLW9udG9wJykucmVtb3ZlKCk7XHJcbn1cclxuXHJcbnByaXZhdGUgcmVuZGVyWUF4aXMoc3ZnLCBzdmdZQXhpc0xlZnQsIHN2Z1lBeGlzUmlnaHQsIHksIHlMaW5lQXhpcywgbGluZURhdGEsIHNlbGYsIGlzcmlhLCBtYXJnaW4pIHtcclxuICAvLyBIaWRkZW4geS1heGlzIGZvciByZWZlcmVuY2VcclxuICBzdmcuYXBwZW5kKCdnJylcclxuICAgIC5hdHRyKCdjbGFzcycsICdsaWItc3RhY2tlZC15LWF4aXMtdGV4dCB5YXhpcy1kYXNoZWQnKVxyXG4gICAgLmF0dHIoJ3N0eWxlJywgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNDdXN0b21UZXh0U3R5bGVzKVxyXG4gICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoMCwwKScpXHJcbiAgICAuY2FsbCh5KVxyXG4gICAgLnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKTtcclxuXHJcbiAgLy8gTGVmdCB5LWF4aXNcclxuICBzdmdZQXhpc0xlZnQuYXBwZW5kKCdnJylcclxuICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi15YXhpcy1sYWJlbHMtdGV4dHMtZHJpbGxkb3duIHlheGlzLWRhc2hlZCcpXHJcbiAgICAuYXR0cignc3R5bGUnLCBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi55QXhpc0N1c3RvbVRleHRTdHlsZXMpXHJcbiAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgwLDApJylcclxuICAgIC5jYWxsKGQzLmF4aXNMZWZ0KHkpXHJcbiAgICAgIC50aWNrU2l6ZSgwKVxyXG4gICAgICAudGlja3Moc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubnVtYmVyT2ZZVGlja3MpXHJcbiAgICAgIC50aWNrRm9ybWF0KChkKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkID0gc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNMYWJlbEZvbWF0dGVyIFxyXG4gICAgICAgICAgPyBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi55QXhpc0xhYmVsRm9tYXR0ZXIoZCkgXHJcbiAgICAgICAgICA6IGQ7XHJcbiAgICAgICAgcmV0dXJuIGZvcm1hdHRlZCA+PSAxMDAwID8gZm9ybWF0dGVkIC8gMTAwMCArICdrJyA6IGZvcm1hdHRlZDtcclxuICAgICAgfSkpXHJcbiAgICAuY2FsbCgoZykgPT4ge1xyXG4gICAgICBnLnNlbGVjdCgnLmRvbWFpbicpXHJcbiAgICAgICAgLnN0eWxlKCdzdHJva2UnLCAndmFyKC0tY2hhcnQtZG9tYWluLWNvbG9yLCAjMDAwMDAwKScpXHJcbiAgICAgICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCAnMXB4Jyk7XHJcbiAgICB9KVxyXG4gICAgLnNlbGVjdEFsbCgndGV4dCcpXHJcbiAgICAuc3R5bGUoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKTtcclxuXHJcbiAgLy8gUmlnaHQgeS1heGlzIChoaWRkZW4gYnkgZGVmYXVsdClcclxuICBzdmdZQXhpc1JpZ2h0LmFwcGVuZCgnZycpXHJcbiAgICAuYXR0cignY2xhc3MnLCAnbGliLXlheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24geWF4aXMtZGFzaGVkJylcclxuICAgIC5hdHRyKCdzdHlsZScsIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzQ3VzdG9tVGV4dFN0eWxlcylcclxuICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDAsMCknKVxyXG4gICAgLmNhbGwoeSlcclxuICAgIC5zdHlsZSgnZGlzcGxheScsICdub25lJyk7XHJcblxyXG4gIC8vIExpbmUgY2hhcnQgYXhpcyBpZiBhcHBsaWNhYmxlXHJcbiAgaWYgKGxpbmVEYXRhICE9IG51bGwgJiYgbGluZURhdGEgJiYgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uc2hvd0xpbmVDaGFydEF4aXMpIHtcclxuICAgIHN2Z1lBeGlzUmlnaHQuYXBwZW5kKCdnJylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi1zdGFja2VkLXktYXhpcy10ZXh0MScpXHJcbiAgICAgIC5hdHRyKCdzdHlsZScsIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzQ3VzdG9tVGV4dFN0eWxlcylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoMCwwKScpXHJcbiAgICAgIC5jYWxsKHlMaW5lQXhpcyk7XHJcbiAgfVxyXG5cclxuICAvLyBBcHBseSBheGlzIHZpc2liaWxpdHkgY29uZmlndXJhdGlvbnNcclxuICB0aGlzLmFwcGx5QXhpc1Zpc2liaWxpdHlDb25maWcoc2VsZik7XHJcbn1cclxuXHJcbnByaXZhdGUgYXBwbHlBeGlzVmlzaWJpbGl0eUNvbmZpZyhzZWxmKSB7XHJcbiAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmlzWGF4aXNMYWJlbEhpZGRlbikge1xyXG4gICAgZDMuc2VsZWN0QWxsKCdnLmxpYi1saW5lLXgtYXhpcy10ZXh0ID4gZyA+IHRleHQnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGliLWRpc3BsYXktaGlkZGVuJyk7XHJcbiAgfVxyXG5cclxuICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNZYXhpc0xhYmVsSGlkZGVuKSB7XHJcbiAgICBkMy5zZWxlY3RBbGwoJy55YXhpcy1kYXNoZWQgPiBnID4gdGV4dCcpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICdsaWItZGlzcGxheS1oaWRkZW4nKTtcclxuICB9XHJcblxyXG4gIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1lheGlzSGlkZGVuKSB7XHJcbiAgICBkMy5zZWxlY3RBbGwoJy55YXhpcy1kYXNoZWQnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGliLWRpc3BsYXktaGlkZGVuJyk7XHJcbiAgfVxyXG5cclxuICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNZYXhpc0Rhc2hlZCkge1xyXG4gICAgZDMuc2VsZWN0QWxsKCcueWF4aXMtZGFzaGVkJylcclxuICAgICAgLnN0eWxlKCdzdHJva2UtZGFzaGFycmF5JywgJzUgNScpXHJcbiAgICAgIC5zdHlsZSgnY29sb3InLCAndmFyKC0tY2hhcnQtYXhpcy1jb2xvciwgIzk5OTk5OSknKTtcclxuICB9XHJcbn1cclxuXHJcbnByaXZhdGUgcmVuZGVyQXhpc0xhYmVscyhzdmcsIHN2Z1lBeGlzTGVmdCwgc3ZnWUF4aXNSaWdodCwgbWV0YURhdGEsIHdpZHRoLCBoZWlnaHQsIG1hcmdpbiwgc2VsZiwgaXNyaWEsIHJpZ2h0U3ZnV2lkdGgpIHtcclxuICAvLyBZLWF4aXMgbGFiZWxcclxuICBpZiAobWV0YURhdGEueUxhYmVsKSB7XHJcbiAgICBjb25zdCB5UG9zaXRpb24gPSBpc3JpYSA/IDAgLSBtYXJnaW4ubGVmdCAvIDIgLSAzMCA6IDAgLSBtYXJnaW4ubGVmdCAvIDIgLSA0MDtcclxuXHJcbiAgICBzdmdZQXhpc0xlZnQuYXBwZW5kKCd0ZXh0JylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi1heGlzLWdyb3VwLWxhYmVsIGZvbnQtc2l6ZS0xJylcclxuICAgICAgLmF0dHIoJ3N0eWxlJywgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNDdXN0b21sYWJlbFN0eWxlcylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICdyb3RhdGUoLTkwKScpXHJcbiAgICAgIC5hdHRyKCd5JywgeVBvc2l0aW9uKVxyXG4gICAgICAuYXR0cigneCcsIDAgLSBoZWlnaHQgLyAyKVxyXG4gICAgICAuYXR0cignZHknLCAnMWVtJylcclxuICAgICAgLnN0eWxlKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxyXG4gICAgICAuYXR0cignZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpO1xyXG5cclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc011bHRpQ2hhcnRHcmlkTGluZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHN2Z1lBeGlzTGVmdC5zZWxlY3RBbGwoJy5saWItYXhpcy1ncm91cC1sYWJlbCcpXHJcbiAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCAnc21hbGxlcicpXHJcbiAgICAgICAgLnRleHQobWV0YURhdGEueUxhYmVsKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHN2Zy5zZWxlY3RBbGwoJy5saWItYXhpcy1ncm91cC1sYWJlbCcpXHJcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi15bGFiZWwtd2Vla2x5Q2hhcnRzJylcclxuICAgICAgICAudGV4dChtZXRhRGF0YS55TGFiZWwudG9Mb3dlckNhc2UoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBYLWF4aXMgbGFiZWxcclxuICBpZiAobWV0YURhdGEueExhYmVsKSB7XHJcbiAgICBjb25zdCBpc0Fjcm9ueW0gPSB0aGlzLmlzTGFiZWxBY3JvbnltKG1ldGFEYXRhLnhMYWJlbCk7XHJcbiAgICBjb25zdCB4UG9zaXRpb24gPSBpc3JpYSBcclxuICAgICAgPyAoaGVpZ2h0ICsgbWFyZ2luLnRvcCArIG1hcmdpbi5ib3R0b20pIFxyXG4gICAgICA6IChoZWlnaHQgKyBtYXJnaW4udG9wICsgbWFyZ2luLmJvdHRvbSArIDQwKTtcclxuXHJcbiAgICBzdmcuYXBwZW5kKCd0ZXh0JylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgdGhpcy5nZXRYTGFiZWxDbGFzcyhzZWxmKSlcclxuICAgICAgLmF0dHIoJ3N0eWxlJywgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueEF4aXNDdXN0b21sYWJlbFN0eWxlcylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHt3aWR0aCAvIDJ9LCR7eFBvc2l0aW9ufSlgKVxyXG4gICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXHJcbiAgICAgIC5zdHlsZSgnZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpXHJcbiAgICAgIC50ZXh0KGlzQWNyb255bSA/IG1ldGFEYXRhLnhMYWJlbC50b1VwcGVyQ2FzZSgpIDogbWV0YURhdGEueExhYmVsLnRvTG93ZXJDYXNlKCkpXHJcbiAgICAgIC5zdHlsZSgndGV4dC10cmFuc2Zvcm0nLCBpc0Fjcm9ueW0gPyAnbm9uZScgOiAnY2FwaXRhbGl6ZScpO1xyXG4gIH1cclxuXHJcbiAgLy8gTGluZSB5LWF4aXMgbGFiZWxcclxuICBpZiAobWV0YURhdGEubGluZXlMYWJlbCkge1xyXG4gICAgc3ZnWUF4aXNSaWdodC5hcHBlbmQoJ3RleHQnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGliLWF4aXMtZ3JvdXAtbGFiZWwgbGliLWxpbmUtYXhpcycpXHJcbiAgICAgIC5hdHRyKCdmaWxsJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJylcclxuICAgICAgLmF0dHIoJ3N0eWxlJywgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNDdXN0b21sYWJlbFN0eWxlcylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoMCwwKSByb3RhdGUoOTApJylcclxuICAgICAgLmF0dHIoJ3knLCAtMTAwKVxyXG4gICAgICAuYXR0cigneCcsIDEwMClcclxuICAgICAgLmF0dHIoJ2R5JywgJzVlbScpXHJcbiAgICAgIC5zdHlsZSgndGV4dC1hbmNob3InLCAnbWlkZGxlJylcclxuICAgICAgLnN0eWxlKCdmb250LXNpemUnLCAnc21hbGxlcicpXHJcbiAgICAgIC50ZXh0KG1ldGFEYXRhLmxpbmV5TGFiZWwpO1xyXG4gIH1cclxuXHJcbiAgLy8gQXBwbHkgZHJpbGxkb3duIGNoYXJ0IHNwZWNpZmljIHN0eWxlc1xyXG4gIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0RyaWxsZG93bkNoYXJ0KSB7XHJcbiAgICBzdmcuc2VsZWN0QWxsKCdnLngxLmF4aXMxIGcudGljayBsaW5lJykuc3R5bGUoJ2Rpc3BsYXknLCAnbm9uZScpO1xyXG4gIH1cclxufVxyXG5cclxucHJpdmF0ZSBpc0xhYmVsQWNyb255bShsYWJlbCkge1xyXG4gIHJldHVybiAobGFiZWwubGVuZ3RoIDw9IDQgJiYgL15bQS1aXSskLy50ZXN0KGxhYmVsKSkgfHxcclxuICAgICAgICAgKGxhYmVsID09PSBsYWJlbC50b1VwcGVyQ2FzZSgpICYmIC9bQS1aXS8udGVzdChsYWJlbCkpO1xyXG59XHJcblxyXG5wcml2YXRlIGdldFhMYWJlbENsYXNzKHNlbGYpIHtcclxuICBsZXQgYmFzZUNsYXNzID0gJ2xpYi1heGlzLWdyb3VwLWxhYmVsIGZvbnQtc2l6ZS0xJztcclxuICBcclxuICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCkge1xyXG4gICAgcmV0dXJuIGJhc2VDbGFzcyArICcgbGliLXhsYWJlbC1kcmlsbGRvd25jaGFydHMnO1xyXG4gIH1cclxuICBcclxuICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNNdWx0aUNoYXJ0R3JpZExpbmUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgcmV0dXJuIGJhc2VDbGFzcyArICcgbGliLXhsYWJlbC13ZWVrbHlDaGFydHMnO1xyXG4gIH1cclxuICBcclxuICByZXR1cm4gYmFzZUNsYXNzICsgJyBsaWItYXhpcy13YXRlcmZhbGwtbGFiZWwnO1xyXG59XHJcblxyXG5wcml2YXRlIHJlbmRlclRhcmdldExpbmUoc3ZnLCBzdmdZQXhpc1JpZ2h0LCB5LCB3aWR0aCwgcmlnaHRTdmdXaWR0aCwgbWV0YURhdGEsIHNlbGYpIHtcclxuICBjb25zdCB5WmVybyA9IHkodGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEudGFyZ2V0KTtcclxuXHJcbiAgLy8gRHJhdyB0YXJnZXQgbGluZVxyXG4gIHN2Zy5hcHBlbmQoJ2xpbmUnKVxyXG4gICAgLmF0dHIoJ3gxJywgMClcclxuICAgIC5hdHRyKCd4MicsIHdpZHRoKVxyXG4gICAgLmF0dHIoJ3kxJywgeVplcm8pXHJcbiAgICAuYXR0cigneTInLCB5WmVybylcclxuICAgIC5zdHlsZSgnc3Ryb2tlLWRhc2hhcnJheScsICc1IDUnKVxyXG4gICAgLnN0eWxlKCdzdHJva2UnLCB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS5jb2xvcik7XHJcblxyXG4gIC8vIEFkZCB0YXJnZXQgbGFiZWxcclxuICBjb25zdCBkYXRhVHlwZVRlbXAgPSBtZXRhRGF0YS5kYXRhVHlwZSB8fCAnJztcclxuICBjb25zdCB0YXJnZXRMaW5lTmFtZSA9IHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLnRhcmdldE5hbWUgfHwgJ3RhcmdldCc7XHJcblxyXG4gIHN2Z1lBeGlzUmlnaHQuYXBwZW5kKCdmb3JlaWduT2JqZWN0JylcclxuICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsJHt5WmVybyAtIDMwfSlgKVxyXG4gICAgLmF0dHIoJ3dpZHRoJywgcmlnaHRTdmdXaWR0aClcclxuICAgIC5hdHRyKCdoZWlnaHQnLCA1MClcclxuICAgIC5hcHBlbmQoJ3hodG1sOmRpdicpXHJcbiAgICAuYXR0cignY2xhc3MnLCAndGFyZ2V0LWRpc3BsYXknKVxyXG4gICAgLnN0eWxlKCdjb2xvcicsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpXHJcbiAgICAuaHRtbChgPGRpdj4ke3RhcmdldExpbmVOYW1lfTwvZGl2PjxkaXY+JHtzZWxmLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXR9JHtkYXRhVHlwZVRlbXB9PC9kaXY+YCk7XHJcbn1cclxuXHJcbnByaXZhdGUgcmVuZGVyTGluZUNoYXJ0KHN2ZywgbGluZURhdGEsIHgsIGxpbmVZc2NhbGUsIG1ldGFEYXRhLCBzZWxmKSB7XHJcbiAgLy8gRHJhdyBsaW5lIHBhdGhcclxuICBzdmcuYXBwZW5kKCdwYXRoJylcclxuICAgIC5kYXR1bShsaW5lRGF0YSlcclxuICAgIC5hdHRyKCdmaWxsJywgJ25vbmUnKVxyXG4gICAgLmF0dHIoJ3N0cm9rZScsIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmxpbmVHcmFwaENvbG9yKVxyXG4gICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIDEuNSlcclxuICAgIC5hdHRyKCdkJywgZDMubGluZSgpXHJcbiAgICAgIC54KChkKSA9PiB4KGQubmFtZSkgKyB4LmJhbmR3aWR0aCgpIC8gMilcclxuICAgICAgLnkoKGQpID0+IGxpbmVZc2NhbGUoZC52YWx1ZSkpKTtcclxuXHJcbiAgLy8gQWRkIGRvdHNcclxuICBjb25zdCBkb3QgPSBzdmcuc2VsZWN0QWxsKCdteUNpcmNsZXMnKVxyXG4gICAgLmRhdGEobGluZURhdGEpXHJcbiAgICAuZW50ZXIoKVxyXG4gICAgLmFwcGVuZCgnZycpXHJcbiAgICAub24oJ2NsaWNrJywgKGQpID0+IHtcclxuICAgICAgaWYgKCFtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2sgfHwgIW1ldGFEYXRhLmJhcldpdGhvdXRDbGljay5sZW5ndGggfHxcclxuICAgICAgICAgICghbWV0YURhdGEuYmFyV2l0aG91dENsaWNrLmluY2x1ZGVzKGQ/Lm5hbWUpICYmIFxyXG4gICAgICAgICAgICFtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2suaW5jbHVkZXMoZD8ua2V5KSkpIHtcclxuICAgICAgICBzZWxmLmhhbmRsZUNsaWNrKGQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgZG90LmFwcGVuZCgnY2lyY2xlJylcclxuICAgIC5hdHRyKCdmaWxsJywgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubGluZUdyYXBoQ29sb3IpXHJcbiAgICAuYXR0cignc3Ryb2tlJywgJ25vbmUnKVxyXG4gICAgLmF0dHIoJ2N4JywgKGQpID0+IHgoZC5uYW1lKSArIHguYmFuZHdpZHRoKCkgLyAyKVxyXG4gICAgLmF0dHIoJ2N5JywgKGQpID0+IGxpbmVZc2NhbGUoZC52YWx1ZSkpXHJcbiAgICAuc3R5bGUoJ2N1cnNvcicsICgpID0+IHNlbGYuY2hhcnREYXRhLm1ldGFEYXRhLmhhc0RyaWxsRG93biA/ICdwb2ludGVyJyA6ICdkZWZhdWx0JylcclxuICAgIC5hdHRyKCdyJywgMyk7XHJcblxyXG4gIC8vIEFkZCB2YWx1ZSBsYWJlbHNcclxuICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubGluZUdyYXBoQ29sb3IpIHtcclxuICAgIGRvdC5hcHBlbmQoJ3RleHQnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnZG90JylcclxuICAgICAgLmF0dHIoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKVxyXG4gICAgICAuYXR0cignY29sb3InLCBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5saW5lR3JhcGhDb2xvcilcclxuICAgICAgLmF0dHIoJ3N0eWxlJywgJ2ZvbnQtc2l6ZTogLjg1ZW0nKVxyXG4gICAgICAuYXR0cigneCcsIChkKSA9PiB4KGQubmFtZSkgKyB4LmJhbmR3aWR0aCgpIC8gMilcclxuICAgICAgLmF0dHIoJ3knLCAoZCkgPT4gbGluZVlzY2FsZShkLnZhbHVlKSlcclxuICAgICAgLmF0dHIoJ2R5JywgJy0xZW0nKVxyXG4gICAgICAudGV4dCgoZCkgPT4gc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubGFiZWxGb3JtYXR0ZXIoZC52YWx1ZSkpO1xyXG4gIH1cclxufVxyXG5cclxucHJpdmF0ZSBoYW5kbGVab29tT3V0KHN2ZywgaGVpZ2h0LCBtYXJnaW4pIHtcclxuICBzdmcuc2VsZWN0QWxsKCcubGliLXhheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24nKVxyXG4gICAgLmVhY2goKGQsIGksIG5vZGVzKSA9PiB7XHJcbiAgICAgIGNvbnN0IHRleHQgPSBkMy5zZWxlY3Qobm9kZXNbaV0pO1xyXG4gICAgICBjb25zdCBsYWJlbCA9IHRleHQudGV4dCgpO1xyXG4gICAgICBcclxuICAgICAgaWYgKGxhYmVsLmluZGV4T2YoJ1xcbicpID4gLTEpIHtcclxuICAgICAgICBjb25zdCBsaW5lcyA9IGxhYmVsLnNwbGl0KCdcXG4nKTtcclxuICAgICAgICB0ZXh0LnRleHQobnVsbCk7XHJcbiAgICAgICAgbGluZXMuZm9yRWFjaCgobGluZSwgaWR4KSA9PiB7XHJcbiAgICAgICAgICB0ZXh0LmFwcGVuZCgndHNwYW4nKVxyXG4gICAgICAgICAgICAudGV4dChsaW5lKVxyXG4gICAgICAgICAgICAuYXR0cigneCcsIDApXHJcbiAgICAgICAgICAgIC5hdHRyKCdkeScsIGlkeCA9PT0gMCA/ICcxZW0nIDogJzEuMWVtJyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3Qgd29yZHMgPSBsYWJlbC5zcGxpdCgnICcpO1xyXG4gICAgICAgIHRleHQudGV4dChudWxsKTtcclxuICAgICAgICB3b3Jkcy5mb3JFYWNoKCh3b3JkKSA9PiB7XHJcbiAgICAgICAgICB0ZXh0LmFwcGVuZCgndHNwYW4nKS50ZXh0KHdvcmQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgLnN0eWxlKCdmaWxsJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJylcclxuICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBudWxsKTtcclxuXHJcbiAgc3ZnLnNlbGVjdCgnLngtYXhpcycpXHJcbiAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgwLCAke2hlaWdodCAtIG1hcmdpbi5ib3R0b20gKyAxMH0pYCk7XHJcbn1cclxuXHJcbnByaXZhdGUgY2FsY3VsYXRlQ2hhcnREaW1lbnNpb25zKGNoYXJ0Q29udGFpbmVyOiBhbnksIHZlcnRpY2Fsc3RhY2tlZGNvbnRhaW5lcjogYW55LCBtYXJnaW46IGFueSwgc2VsZjogYW55KSB7XHJcbiAgbGV0IHdpZHRoID0gcGFyc2VJbnQoY2hhcnRDb250YWluZXIuc3R5bGUoJ3dpZHRoJykpIC0gbWFyZ2luLmxlZnQgLSBtYXJnaW4ucmlnaHQ7XHJcbiAgY29uc3QgZGF0YUxlbmd0aCA9IHRoaXMuY2hhcnREYXRhLmRhdGEubGVuZ3RoO1xyXG4gIGNvbnN0IHN1Ymdyb3Vwc0NvdW50ID0gKHRoaXMuY2hhcnREYXRhLm1ldGFEYXRhLmtleUxpc3QgYXMgYW55IHx8IFtdKS5sZW5ndGg7XHJcbiAgY29uc3QgaXNNb2JpbGUgPSB3aW5kb3cuaW5uZXJXaWR0aCA8IDU3NjtcclxuICBjb25zdCBpc1RhYmxldCA9IHdpbmRvdy5pbm5lcldpZHRoID49IDU3NiAmJiB3aW5kb3cuaW5uZXJXaWR0aCA8IDk5MjtcclxuXHJcbiAgLy8gTWluaW11bSB3aWR0aCBwZXIgYmFyIGdyb3VwIGJhc2VkIG9uIGRldmljZSBhbmQgbnVtYmVyIG9mIHN1Ymdyb3Vwc1xyXG4gIGNvbnN0IG1pbldpZHRoUGVyR3JvdXAgPSAoKCkgPT4ge1xyXG4gICAgaWYgKHN1Ymdyb3Vwc0NvdW50ID4gMikge1xyXG4gICAgICByZXR1cm4gaXNNb2JpbGUgPyA4MCA6IGlzVGFibGV0ID8gMTAwIDogMTIwOyAvLyBXaWRlciBmb3IgbXVsdGlwbGUgc3ViZ3JvdXBzXHJcbiAgICB9XHJcbiAgICByZXR1cm4gaXNNb2JpbGUgPyA0MCA6IGlzVGFibGV0ID8gNjAgOiA4MDsgLy8gTm9ybWFsIHdpZHRoIGZvciAxLTIgc3ViZ3JvdXBzXHJcbiAgfSkoKTtcclxuXHJcbiAgLy8gQ2FsY3VsYXRlIG1pbmltdW0gcmVxdWlyZWQgd2lkdGggZm9yIGFsbCBncm91cHNcclxuICBjb25zdCBtaW5SZXF1aXJlZFdpZHRoID0gZGF0YUxlbmd0aCAqIG1pbldpZHRoUGVyR3JvdXA7XHJcblxyXG4gIC8vIEluIHpvb21lZC1vdXQgc3RhdGUsIGVuc3VyZSBtaW5pbXVtIHdpZHRoIGZvciByZWFkYWJpbGl0eVxyXG4gIGlmICh0aGlzLmlzWm9vbWVkT3V0KSB7XHJcbiAgICAvLyBJZiB3ZSBoYXZlIG1hbnkgZ3JvdXBzIG9yIG11bHRpcGxlIHN1Ymdyb3VwcywgZW5zdXJlIG1pbmltdW0gd2lkdGhcclxuICAgIGlmIChkYXRhTGVuZ3RoID4gOCB8fCBzdWJncm91cHNDb3VudCA+IDIpIHtcclxuICAgICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgbWluUmVxdWlyZWRXaWR0aCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBJbiB6b29tZWQtaW4gc3RhdGUsIGFsd2F5cyBlbnN1cmUgZ2VuZXJvdXMgc3BhY2luZ1xyXG4gIGlmIChkYXRhTGVuZ3RoID4gOCAmJiAhdGhpcy5pc1pvb21lZE91dCkge1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLmNoYXJ0RGF0YS5kcm9wZG93bkRhdGEyICYmXHJcbiAgICAgIHdpZHRoIDwgZGF0YUxlbmd0aCAqIDI1MFxyXG4gICAgKSB7XHJcbiAgICAgIHdpZHRoID0gZGF0YUxlbmd0aCAqIDI1MDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIEluY3JlYXNlIHdpZHRoIGZvciBtdWx0aXBsZSBzdWJncm91cHNcclxuICAgICAgd2lkdGggPSBkYXRhTGVuZ3RoICogKHN1Ymdyb3Vwc0NvdW50ID4gMiA/IDIwMCA6IDE2MCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tIEhlaWdodCBMb2dpYyAobm8gY2hhbmdlKSAtLS0tXHJcbiAgbGV0IGhlaWdodCA9XHJcbiAgICBwYXJzZUludCh2ZXJ0aWNhbHN0YWNrZWRjb250YWluZXIuc3R5bGUoJ2hlaWdodCcpKSAqXHJcbiAgICAgIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5zdmdIZWlnaHQgLyAxMDApIC1cclxuICAgIG1hcmdpbi50b3AgLVxyXG4gICAgbWFyZ2luLmJvdHRvbTtcclxuXHJcbiAgaWYgKFxyXG4gICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNGdWxsU2NyZWVuICE9PSB1bmRlZmluZWQgJiZcclxuICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzRnVsbFNjcmVlblxyXG4gICkge1xyXG4gICAgaGVpZ2h0ID1cclxuICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uc3ZnSGVpZ2h0ICE9PSA3MFxyXG4gICAgICAgID8gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uc3ZnSGVpZ2h0XHJcbiAgICAgICAgOiBwYXJzZUludCh2ZXJ0aWNhbHN0YWNrZWRjb250YWluZXIuc3R5bGUoJ2hlaWdodCcpKTtcclxuICB9XHJcblxyXG4gIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0RyaWxsZG93bkNoYXJ0ICYmICF0aGlzLmlzSGVhZGVyVmlzaWJsZSkge1xyXG4gICAgaGVpZ2h0ID1cclxuICAgICAgcGFyc2VJbnQodmVydGljYWxzdGFja2VkY29udGFpbmVyLnN0eWxlKCdoZWlnaHQnKSkgLVxyXG4gICAgICBtYXJnaW4udG9wIC1cclxuICAgICAgbWFyZ2luLmJvdHRvbSAtXHJcbiAgICAgIDEzMDtcclxuICB9XHJcblxyXG4gIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0hlYWRlclZpc2libGUpIHtcclxuICAgIGhlaWdodCA9XHJcbiAgICAgIHBhcnNlSW50KHZlcnRpY2Fsc3RhY2tlZGNvbnRhaW5lci5zdHlsZSgnaGVpZ2h0JykpIC1cclxuICAgICAgbWFyZ2luLnRvcCAtXHJcbiAgICAgIG1hcmdpbi5ib3R0b20gLVxyXG4gICAgICAxMDA7XHJcbiAgfVxyXG5cclxuICByZXR1cm4geyB3aWR0aCwgaGVpZ2h0IH07XHJcbn1cclxucHJpdmF0ZSBjcmVhdGVDaGFydENvbnRhaW5lcnMoXHJcbiAgY2hhcnRDb250YWluZXI6IGFueSxcclxuICBtYXJnaW46IGFueSxcclxuICBoZWlnaHQ6IG51bWJlcixcclxuICByaWdodFN2Z1dpZHRoOiBudW1iZXIsXHJcbiAgc2VsZjogYW55LFxyXG4gIHdpZHRoOiBudW1iZXJcclxuKSB7XHJcbiAgLy8gT3V0ZXIgY29udGFpbmVyXHJcbiAgY29uc3Qgb3V0ZXJDb250YWluZXIgPSBjaGFydENvbnRhaW5lclxyXG4gICAgLmFwcGVuZCgnZGl2JylcclxuICAgIC5hdHRyKCdpZCcsIHNlbGYudW5pcXVlSWQpXHJcbiAgICAuYXR0cignY2xhc3MnLCAnb3V0ZXItY29udGFpbmVyJylcclxuICAgIC5zdHlsZSgnd2lkdGgnLCAnMTAwJScpXHJcbiAgICAuc3R5bGUoJ2hlaWdodCcsIGhlaWdodClcclxuICAgIC5zdHlsZSgnb3ZlcmZsb3cnLCAndmlzaWJsZScpIC8vIEFsbG93IG92ZXJmbG93IHRvIHNob3cgc2Nyb2xsYmFyc1xyXG4gICAgLnN0eWxlKCdwYWRkaW5nLWxlZnQnLCBgJHttYXJnaW4ubGVmdH1weGApXHJcbiAgICAuc3R5bGUoJ3BhZGRpbmctcmlnaHQnLCBgJHtyaWdodFN2Z1dpZHRofXB4YClcclxuICAgIC5zdHlsZSgnbWFyZ2luLWxlZnQnLCAnMTVweCcpO1xyXG5cclxuICAvLyBMZWZ0IFktQXhpc1xyXG4gIGNvbnN0IHN2Z1lBeGlzTGVmdCA9IG91dGVyQ29udGFpbmVyXHJcbiAgICAuYXBwZW5kKCdzdmcnKVxyXG4gICAgLmF0dHIoJ3dpZHRoJywgJzEwMCcpXHJcbiAgICAuYXR0cignaGVpZ2h0JywgaGVpZ2h0ICsgbWFyZ2luLnRvcCArIG1hcmdpbi5ib3R0b20gKyAxMClcclxuICAgIC5zdHlsZSgncG9zaXRpb24nLCAnYWJzb2x1dGUnKVxyXG4gICAgLnN0eWxlKCdsZWZ0JywgJzAnKVxyXG4gICAgLnN0eWxlKCd6LWluZGV4JywgMSlcclxuICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHttYXJnaW4ubGVmdCArIDE1fSwke21hcmdpbi50b3B9KWApO1xyXG5cclxuICAvLyBSaWdodCBZLUF4aXNcclxuICBjb25zdCBzdmdZQXhpc1JpZ2h0ID0gb3V0ZXJDb250YWluZXJcclxuICAgIC5hcHBlbmQoJ3N2ZycpXHJcbiAgICAuYXR0cignd2lkdGgnLCByaWdodFN2Z1dpZHRoKVxyXG4gICAgLmF0dHIoJ2hlaWdodCcsIGhlaWdodCArIG1hcmdpbi50b3AgKyBtYXJnaW4uYm90dG9tICsgMTApXHJcbiAgICAuc3R5bGUoJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJylcclxuICAgIC5zdHlsZSgncmlnaHQnLCAnMTJweCcpXHJcbiAgICAuc3R5bGUoJ3otaW5kZXgnLCAxKVxyXG4gICAgLmFwcGVuZCgnZycpXHJcbiAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgwLCR7bWFyZ2luLnRvcH0pYCk7XHJcblxyXG4gIC8vIElubmVyIHNjcm9sbGFibGUgY29udGFpbmVyXHJcbiAgY29uc3QgaW5uZXJDb250YWluZXIgPSBvdXRlckNvbnRhaW5lclxyXG4gICAgLmFwcGVuZCgnZGl2JylcclxuICAgIC5hdHRyKCdjbGFzcycsICdpbm5lci1jb250YWluZXInKVxyXG4gICAgLnN0eWxlKCd3aWR0aCcsICcxMDAlJylcclxuICAgIC5zdHlsZSgnb3ZlcmZsb3cteCcsICdhdXRvJyk7XHJcblxyXG4gIC8vIE1haW4gU1ZHXHJcbiAgY29uc3Qgc3ZnID0gaW5uZXJDb250YWluZXJcclxuICAgIC5hcHBlbmQoJ3N2ZycpXHJcbiAgICAuYXR0cignd2lkdGgnLCBNYXRoLm1heCh3aWR0aCAtIHJpZ2h0U3ZnV2lkdGgsIHdpbmRvdy5pbm5lcldpZHRoICogMC44KSkgLy8gRW5zdXJlIG1pbmltdW0gd2lkdGhcclxuICAgIC5hdHRyKCdoZWlnaHQnLCBoZWlnaHQgKyBtYXJnaW4udG9wICsgbWFyZ2luLmJvdHRvbSArIDYwKVxyXG4gICAgLnN0eWxlKCdtaW4td2lkdGgnLCAnMTAwJScpIC8vIFByZXZlbnQgc3ZnIGZyb20gc2hyaW5raW5nXHJcbiAgICAuYXBwZW5kKCdnJylcclxuICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsJHttYXJnaW4udG9wfSlgKTtcclxuXHJcbiAgcmV0dXJuIHsgb3V0ZXJDb250YWluZXIsIHN2Z1lBeGlzTGVmdCwgc3ZnWUF4aXNSaWdodCwgaW5uZXJDb250YWluZXIsIHN2ZyB9O1xyXG59XHJcbiAgaGFuZGxlQ2xpY2soZDogYW55KSB7XHJcbiAgICBpZiAodGhpcy5jaGFydERhdGEubWV0YURhdGEuaGFzRHJpbGxEb3duIHx8IGQ/LnRvZ2dsZUZyb20pXHJcbiAgICAgIHRoaXMuY2xpY2tFdmVudC5lbWl0KGQpO1xyXG4gIH1cclxuICBoYW5kbGVIZWFkZXJNZW51Q2xpY2soaWQpIHtcclxuICAgIHRoaXMuaGVhZGVyTWVudWNsaWNrRXZlbnQuZW1pdChpZCk7XHJcbiAgfVxyXG4gIGhhbmRsZUREMUNsaWNrKGV2ZW50KSB7XHJcbiAgICB0aGlzLmlzREQxT3BlbiA9IHRydWU7XHJcbiAgICB0aGlzLmlzREQyT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuICBoYW5kbGVERDJDbGljayhldmVudCkge1xyXG4gICAgdGhpcy5pc0REMk9wZW4gPSB0cnVlO1xyXG4gICAgdGhpcy5pc0REMU9wZW4gPSBmYWxzZTtcclxuICB9XHJcbiAgaGFuZGxlQ29tcGFyZUJ5RmlsdGVyU2VsZWN0aW9uKGV2ZW50KSB7XHJcbiAgICB0aGlzLmNsaWNrRXZlbnQuZW1pdChldmVudCk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXZcclxuICAjZ3JvdXBjb250YWluZXJcclxuICBjbGFzcz1cImxpYi1jaGFydC13cmFwcGVyXCJcclxuICBbbmdDbGFzc109XCJ7ICdsaWItbm8tYmFja2dyb3VuZCc6IGlzVHJhbnNwYXJlbnRCYWNrZ3JvdW5kIH1cIlxyXG4gIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY2FyZC1iZyk7XCJcclxuICAocmVzaXplZCk9XCJvblJlc2l6ZWQoJGV2ZW50KVwiXHJcbj5cclxuICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWFsdFwiICpuZ0lmPVwiIWlzSGVhZGVyVmlzaWJsZVwiPlxyXG4gICAgPGxpYi1jaGFydC1oZWFkZXItdjJcclxuICAgICAgW2NoYXJ0RGF0YV09XCJjaGFydERhdGFcIlxyXG4gICAgICBbY2hhcnRDb25maWd1cmF0aW9uXT1cImNoYXJ0Q29uZmlndXJhdGlvblwiXHJcbiAgICAgIChjbGlja0V2ZW50KT1cImhhbmRsZUNsaWNrKCRldmVudClcIlxyXG4gICAgPjwvbGliLWNoYXJ0LWhlYWRlci12Mj5cclxuICAgIDxsaWItY2hhcnQtaGVhZGVyLXYzXHJcbiAgICAgIFtjaGFydERhdGFdPVwiY2hhcnREYXRhXCJcclxuICAgICAgW2NoYXJ0Q29uZmlndXJhdGlvbl09XCJjaGFydENvbmZpZ3VyYXRpb25cIlxyXG4gICAgICAoY29tcGFyZUJ5RmlsdGVyU2VsZWN0aW9uKT1cImhhbmRsZUNvbXBhcmVCeUZpbHRlclNlbGVjdGlvbigkZXZlbnQpXCJcclxuICAgICAgKHpvb21Jblpvb21PdXRDbGljayk9XCJoYW5kbGVab29taW5ab29tb3V0Q2xpY2soJGV2ZW50KVwiXHJcbiAgICA+PC9saWItY2hhcnQtaGVhZGVyLXYzPlxyXG4gIDwvZGl2PlxyXG4gIDxsaWItY2hhcnQtaGVhZGVyLXYxXHJcbiAgICBbdGl0bGVdPVwiY2hhcnREYXRhLm1ldGFEYXRhLnRpdGxlXCJcclxuICAgIFtoYXNEcmlsbERvd25dPVwiY2hhcnREYXRhLm1ldGFEYXRhLmhhc0RyaWxsRG93blwiXHJcbiAgICBbaXNFZGl0RW5hYmxlZF09XCJjaGFydERhdGEubWV0YURhdGEuaXNFZGl0RW5hYmxlZFwiXHJcbiAgICBbbWVudU9wdGlvbnNdPVwiY2hhcnRDb25maWd1cmF0aW9uLmhlYWRlck1lbnVPcHRpb25zXCJcclxuICAgIFtpc3JpYV09XCJjdXN0b21DaGFydENvbmZpZ3VyYXRpb24uaXNSaWFcIlxyXG4gICAgW3NlbGVjdGVkS3BpVG9vbHRvcF09XCJjaGFydENvbmZpZ3VyYXRpb24uc2VsZWN0ZWRLcGlUb29sdG9wXCJcclxuICAgIChtZW51T3B0aW9uQ2xpY2tFdmVudCk9XCJoYW5kbGVIZWFkZXJNZW51Q2xpY2soJGV2ZW50KVwiXHJcbiAgICBbaXNBbGVydEVuYWJsZWRdPVwiaXNBbGVydEVuYWJsZWRcIlxyXG4gICAgKm5nSWY9XCJpc0hlYWRlclZpc2libGVcIlxyXG4gID48L2xpYi1jaGFydC1oZWFkZXItdjE+XHJcbiAgPGRpdlxyXG4gICAgKm5nSWY9XCJcclxuICAgICAgY2hhcnREYXRhICYmXHJcbiAgICAgIGNoYXJ0RGF0YS5tZXRhRGF0YSAmJlxyXG4gICAgICBjaGFydENvbmZpZ3VyYXRpb24ubGVnZW5kSnVzdGlmaWVkICYmXHJcbiAgICAgIGxlZ2VuZFZpc2libGUgJiZcclxuICAgICAgY2hhcnRDb25maWd1cmF0aW9uLmxlZ2VuZEF0VG9wUmlnaHRcclxuICAgIFwiXHJcbiAgICBjbGFzcz1cImxlZ2VuZC1ob2xkZXItcmlnaHRcIlxyXG4gICAgW3N0eWxlLmhlaWdodF09XCJjaGFydENvbmZpZ3VyYXRpb24uZm9vdGVySGVpZ2h0XCJcclxuICA+XHJcbiAgICA8dWwgY2xhc3M9XCJkaXNwbGF5LWZsZXhcIj5cclxuICAgICAgPGxpXHJcbiAgICAgICAgY2xhc3M9XCJsZWdlbmRzLXBvc2l0aW9uaW5nLWlubGluZVwiXHJcbiAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgY2hhcnREYXRhLm1ldGFEYXRhLmNvbG9ycyB8IGtleXZhbHVlIDoga2VlcE9yZGVyXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxzcGFuXHJcbiAgICAgICAgICBjbGFzcz1cImxpYi1kb251dC1qdXN0aWZpZWQtbGFiZWwtaWNvbi1kcmlsbGRvd25cIlxyXG4gICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiaXRlbS52YWx1ZVwiXHJcbiAgICAgICAgPjwvc3BhblxyXG4gICAgICAgID48c3Bhbj57eyBpdGVtLmtleSB9fTwvc3Bhbj5cclxuICAgICAgPC9saT5cclxuICAgIDwvdWw+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdlxyXG4gICAgW3N0eWxlLmhlaWdodF09XCJjaGFydENvbmZpZ3VyYXRpb24uc3ZnSGVpZ2h0XCJcclxuICAgIGlkPVwiZ3JvdXBjaGFydGNvbnRhaW5lclwiXHJcbiAgICAjZ3JvdXBjaGFydGNvbnRhaW5lclxyXG4gICAgY2xhc3M9XCJsaWItY2hhcnQtc3ZnXCJcclxuICA+PC9kaXY+XHJcblxyXG5cclxuICA8IS0tIDxkaXZcclxuICAgICpuZ0lmPVwiXHJcbiAgICAgIGNoYXJ0RGF0YSAmJlxyXG4gICAgICBjaGFydERhdGEubWV0YURhdGEgJiZcclxuICAgICAgY2hhcnRDb25maWd1cmF0aW9uLmxlZ2VuZEp1c3RpZmllZCAmJlxyXG4gICAgICBsZWdlbmRWaXNpYmxlICYmXHJcbiAgICAgICFjaGFydENvbmZpZ3VyYXRpb24ubGVnZW5kQXRUb3BSaWdodFxyXG4gICAgXCJcclxuICAgIGNsYXNzPVwibGliLWRvbnV0LWNoYXJ0LWZvb3RlclwiXHJcbiAgICBbc3R5bGUuaGVpZ2h0XT1cImNoYXJ0Q29uZmlndXJhdGlvbi5mb290ZXJIZWlnaHRcIlxyXG4gID5cclxuICAgIDx1bCBjbGFzcz1cImxpYi1kb251dC1qdXN0aWZpZWQtbGFiZWwtd3JhcHBlclwiPlxyXG4gICAgICA8bGlcclxuICAgICAgICBjbGFzcz1cImxpYi1kb251dC1qdXN0aWZpZWQtbGFiZWwtaXRlbVwiXHJcbiAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgY2hhcnREYXRhLm1ldGFEYXRhLmNvbG9ycyB8IGtleXZhbHVlXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxzcGFuXHJcbiAgICAgICAgICBjbGFzcz1cImxpYi1kb251dC1qdXN0aWZpZWQtbGFiZWwtaWNvblwiXHJcbiAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJpdGVtLnZhbHVlXCJcclxuICAgICAgICA+PC9zcGFuXHJcbiAgICAgICAgPjxzcGFuPnt7IGl0ZW0ua2V5IH19PC9zcGFuPlxyXG4gICAgICA8L2xpPlxyXG4gICAgPC91bD5cclxuICA8L2Rpdj4gLS0+XHJcblxyXG5cclxuICA8IS0tIDxkaXYgKm5nSWY9XCJjaGFydENvbmZpZ3VyYXRpb24/LmlzRGlzcGxheUJhckRldGFpbHNBdEJvdHRvbVwiPlxyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzcz1cImJhci12YWx1ZXMgbGliLWRpc3BsYXktZmxleCBsaWItanVzdGlmeS1jb250ZW50LWNlbnRlciBsaWItYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgICAgKm5nRm9yPVwiXHJcbiAgICAgICAgbGV0IGl0ZW0gb2YgY2hhcnREYXRhLm1ldGFEYXRhLmNvbG9ycyB8IGtleXZhbHVlIDoga2VlcE9yZGVyO1xyXG4gICAgICAgIGxldCBpID0gaW5kZXhcclxuICAgICAgXCI+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cImJhci1uYW1lIGZvbnQtc2l6ZS0xXCJcclxuICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgY2hhcnREYXRhLmRhdGFbMF1baXRlbS5rZXldICYmXHJcbiAgICAgICAgICBpIDw9IGNoYXJ0Q29uZmlndXJhdGlvbi5ob3dtYW55QmFyRGV0YWlsc1RvRGlzcGxheVxyXG4gICAgICAgIFwiXHJcbiAgICAgID5cclxuICAgICAgICB7eyBpdGVtLmtleSB9fVxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwiYmFyLXZhbHVlIGxpYi1kaXNwbGF5LWZsZXggbGliLWFsaWduLWl0ZW1zLWNlbnRlciBmb250LXNpemUtMVwiXHJcbiAgICAgICAgW3N0eWxlLmNvbG9yXT1cIlxyXG4gICAgICAgICAgY2hhcnRDb25maWd1cmF0aW9uLmJhclZhdWxlQ29sb3IgPyBiYXJWYXVsZUNvbG9yIDogaXRlbS52YWx1ZVxyXG4gICAgICAgIFwiXHJcbiAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgIGNoYXJ0RGF0YS5kYXRhWzBdW2l0ZW0ua2V5XSAmJlxyXG4gICAgICAgICAgaSA8PSBjaGFydENvbmZpZ3VyYXRpb24uaG93bWFueUJhckRldGFpbHNUb0Rpc3BsYXlcclxuICAgICAgICBcIlxyXG4gICAgICA+XHJcbiAgICAgICAge3sgY2hhcnREYXRhLmRhdGFbMF1baXRlbS5rZXldIH19XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+IC0tPlxyXG48L2Rpdj5cclxuIl19
|
|
2388
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9yaXpvbnRhbC1ncm91cGVkLWJhci13aXRoLXNjcm9sbC16b29tLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2F4aWRpby1zdHlsZWd1aWRlLWxpYnJhcnkvc3JjL2xpYi9ob3Jpem9udGFsLWdyb3VwZWQtYmFyLXdpdGgtc2Nyb2xsLXpvb20vaG9yaXpvbnRhbC1ncm91cGVkLWJhci13aXRoLXNjcm9sbC16b29tLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2F4aWRpby1zdHlsZWd1aWRlLWxpYnJhcnkvc3JjL2xpYi9ob3Jpem9udGFsLWdyb3VwZWQtYmFyLXdpdGgtc2Nyb2xsLXpvb20vaG9yaXpvbnRhbC1ncm91cGVkLWJhci13aXRoLXNjcm9sbC16b29tLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsU0FBUyxFQUVULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDakQsT0FBTyxXQUFXLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFFekIsT0FBTyxrQkFBa0IsTUFBTSxrQkFBa0IsQ0FBQzs7Ozs7OztBQVdsRCxNQUFNLE9BQU8sMkNBQ1gsU0FBUSxpQkFBaUI7SUF5RXpCO1FBQ0UsS0FBSyxFQUFFLENBQUM7UUEvREEsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDckMseUJBQW9CLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUN6RCxvQkFBZSxHQUFZLElBQUksQ0FBQztRQUNoQyxrQkFBYSxHQUFZLElBQUksQ0FBQztRQUM5Qiw0QkFBdUIsR0FBWSxLQUFLLENBQUM7UUFD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QyxZQUFZLElBQUksQ0FBQyxFQUFFLFVBQVU7WUFDdkQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUNELHFCQUFxQixDQUFDLEVBQUU7UUFDdEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBQ0QsY0FBYyxDQUFDLEtBQUs7UUFDbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDekIsQ0FBQztJQUNELGNBQWMsQ0FBQyxLQUFLO1FBQ2xCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLENBQUM7SUFDRCw4QkFBOEIsQ0FBQyxLQUFLO1FBQ2xDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlCLENBQUM7K0dBN2pGVSwyQ0FBMkM7bUdBQTNDLDJDQUEyQyxnaEJDekJ4RCxrN0hBd0hBOzs0RkQvRmEsMkNBQTJDO2tCQVR2RCxTQUFTOytCQUNFLDZDQUE2QyxpQkFNeEMsaUJBQWlCLENBQUMsSUFBSTt3REFPckMsWUFBWTtzQkFEWCxTQUFTO3VCQUFDLHFCQUFxQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFJbEQsaUJBQWlCO3NCQURoQixTQUFTO3VCQUFDLGdCQUFnQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFHcEMsU0FBUztzQkFBakIsS0FBSztnQkFDRyx3QkFBd0I7c0JBQWhDLEtBQUs7Z0JBQ0ksVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxvQkFBb0I7c0JBQTdCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBPbkluaXQsXHJcbiAgVmlld0NoaWxkLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgSW5wdXQsXHJcbiAgT3V0cHV0LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBWaWV3RW5jYXBzdWxhdGlvbixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tcG9uZW50VW5pcXVlSWQgfSBmcm9tICcuLi91bmlxdWUtaWQnO1xyXG5pbXBvcnQgQ2hhcnRIZWxwZXIgZnJvbSAnLi4vY2hhcnQtaGVscGVyJztcclxuaW1wb3J0ICogYXMgZDMgZnJvbSAnZDMnO1xyXG5pbXBvcnQgeyBSZXNpemVkRXZlbnQgfSBmcm9tICdhbmd1bGFyLXJlc2l6ZS1ldmVudCc7XHJcbmltcG9ydCBIZWFkZXJDb25maWdIZWxwZXIgZnJvbSAnLi4vaGVhZGVyLWNvbmZpZyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1ob3Jpem9udGFsLWdyb3VwZWQtYmFyLXdpdGgtc2Nyb2xsLXpvb20nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9ob3Jpem9udGFsLWdyb3VwZWQtYmFyLXdpdGgtc2Nyb2xsLXpvb20uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogW1xyXG4gICAgJy4vaG9yaXpvbnRhbC1ncm91cGVkLWJhci13aXRoLXNjcm9sbC16b29tLmNvbXBvbmVudC5sZXNzJyxcclxuICAgICcuLi9jb21tb24tc3R5bGVzLmxlc3MnLFxyXG4gIF0sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEhvcml6b250YWxHcm91cGVkQmFyV2l0aFNjcm9sbFpvb21Db21wb25lbnRcclxuICBleHRlbmRzIENvbXBvbmVudFVuaXF1ZUlkXHJcbiAgaW1wbGVtZW50cyBPbkluaXRcclxue1xyXG4gIEBWaWV3Q2hpbGQoJ2dyb3VwY2hhcnRjb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG4gIGNvbnRhaW5lckVsdCE6IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2dyb3VwY29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUgfSlcclxuICBncm91cGNvbnRhaW5lckVsdCE6IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBJbnB1dCgpIGNoYXJ0RGF0YTogYW55O1xyXG4gIEBJbnB1dCgpIGN1c3RvbUNoYXJ0Q29uZmlndXJhdGlvbjogYW55O1xyXG4gIEBPdXRwdXQoKSBjbGlja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGhlYWRlck1lbnVjbGlja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgaXNIZWFkZXJWaXNpYmxlOiBib29sZWFuID0gdHJ1ZTtcclxuICBsZWdlbmRWaXNpYmxlOiBib29sZWFuID0gdHJ1ZTtcclxuICBpc1RyYW5zcGFyZW50QmFja2dyb3VuZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGNoYXJ0Q29uZmlndXJhdGlvbjogYW55ID0ge307XHJcbiAgb2JqZWN0S2V5cyA9IE9iamVjdC5rZXlzO1xyXG5cclxuICBkZWZhdWx0Q29uZmlndXJhdGlvbjogYW55ID0ge1xyXG4gICAgbWFyZ2luOiB7IHRvcDogMjAsIHJpZ2h0OiAyMCwgYm90dG9tOiAyMCwgbGVmdDogNDAgfSxcclxuICAgIGxhYmVsRm9ybWF0dGVyOiBDaGFydEhlbHBlci5kZWZhdWx0Rm9ybWF0dGVyLFxyXG4gICAgc3ZnSGVpZ2h0OiA3MCxcclxuICAgIG51bWJlck9mWVRpY2tzOiA1LFxyXG4gICAgbGVnZW5kSnVzdGlmaWVkOiB0cnVlLFxyXG4gICAgeUxpbmVBeGlzTGFiZWxGb21hdHRlcjogQ2hhcnRIZWxwZXIuZGVmYXVsdEZvcm1hdHRlcixcclxuICAgIHlBeGlzTGFiZWxGb21hdHRlcjogQ2hhcnRIZWxwZXIuZGVmYXVsdEZvcm1hdHRlcixcclxuICAgIGxpbmVHcmFwaENvbG9yOiAnI0Y2RDI4MycsXHJcbiAgICBzaG93TGluZUNoYXJ0QXhpczogdHJ1ZSxcclxuICAgIHNob3dWYWx1ZXM6IHRydWUsXHJcbiAgICBoZWFkZXJNZW51T3B0aW9uczogSGVhZGVyQ29uZmlnSGVscGVyLmhlYWRlckNvbmZpZy5oZWFkZXJNZW51T3B0aW9ucyxcclxuICAgIHhBeGlzR3JpZDogdW5kZWZpbmVkLFxyXG4gICAgeUF4aXNHcmlkOiBmYWxzZSxcclxuICAgIGxlZ2VuZFZpc2libGU6IGZhbHNlLFxyXG4gICAgaXNIZWFkZXJWaXNpYmxlOiB1bmRlZmluZWQsXHJcbiAgICBpc1RyYW5zcGFyZW50QmFja2dyb3VuZDogdW5kZWZpbmVkLFxyXG4gICAgaXNNdWx0aUNoYXJ0R3JpZExpbmU6IHVuZGVmaW5lZCxcclxuICAgIGlzRnVsbFNjcmVlbjogdW5kZWZpbmVkLFxyXG4gICAgY3VzdG9tWXNjYWxlOiB1bmRlZmluZWQsXHJcbiAgICB0ZXh0c09uQmFyOiB1bmRlZmluZWQsXHJcbiAgICBpc1hheGlzTGFiZWxIaWRkZW46IHVuZGVmaW5lZCxcclxuICAgIGlzWWF4aXNMYWJlbEhpZGRlbjogZmFsc2UsXHJcbiAgICBpc1lheGlzSGlkZGVuOiB1bmRlZmluZWQsXHJcbiAgICBpc1lheGlzRGFzaGVkOiB1bmRlZmluZWQsXHJcbiAgICB0ZXh0Rm9ybWF0dGVyOiB1bmRlZmluZWQsXHJcbiAgICBpc05vQWx0ZXJuYXRlWGF4aXNUZXh0OiB1bmRlZmluZWQsXHJcbiAgICBpc1hncmlkQmV0d2VlbkxhYmVsczogdW5kZWZpbmVkLFxyXG4gICAgYmFja2dyb3VuZENvbG9yOiAnI0ZGRkZGRicsXHJcbiAgICBoaWRlTGVnZW5kT25Ub3A6IHRydWUsXHJcbiAgICBpc1hheGlzQ29sb3I6ICcjOTk5OTk5JyxcclxuICAgIGxhYmVsT3ZlcmxhcE1pbm9yRml4OiB0cnVlLFxyXG4gICAgbm9Ib3ZlckVmZmVjdDogdHJ1ZSxcclxuICAgIG5vSG92ZXJEaXNwbGF5RGF0YTogdHJ1ZSxcclxuICAgIHNob3dYYXhpc1RvcDogdHJ1ZSxcclxuICAgIGRpc3BsYXlZYXhpc0xhYmVsczogdW5kZWZpbmVkLFxyXG4gICAgeExhYmVsc09uU2FtZUxpbmU6IHVuZGVmaW5lZCxcclxuICAgIHRleHRBbHdheXNIb3Jpem9udGFsOiB1bmRlZmluZWQsXHJcbiAgICBsZWdlbmRBdFRvcFJpZ2h0OiB1bmRlZmluZWQsXHJcbiAgICBpc0RyaWxsZG93bkNoYXJ0OiB0cnVlLFxyXG4gICAgZGlzcGxheVRpdGxlT25Ub3A6IHVuZGVmaW5lZCxcclxuICAgIGlzVG9nZ2xlVmlzaWJsZTogdW5kZWZpbmVkLFxyXG4gICAgaXNUaXRsZUhpZGRlbjogdW5kZWZpbmVkLFxyXG4gICAgaXNEaXNwbGF5QmFyRGV0YWlsc0F0Qm90dG9tOiB1bmRlZmluZWQsXHJcbiAgICBob3dtYW55QmFyRGV0YWlsc1RvRGlzcGxheTogMCxcclxuICAgIGJhclZhdWxlQ29sb3I6IHVuZGVmaW5lZCxcclxuICAgIGRlZmF1bHRCYXJIZWlnaHQ6IDIsXHJcbiAgfTtcclxuXHJcbiAgdW5pcXVlSWQ6IGFueSA9IHRoaXMuZ2V0VW5pcXVlSWQoKTtcclxuICBpc1pvb21lZE91dDogYm9vbGVhbiA9IHRydWU7XHJcbiAgaXNERDFPcGVuOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNERDJPcGVuOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcblxyXG4gIG9uUmVzaXplZChldmVudDogUmVzaXplZEV2ZW50KSB7XHJcbiAgICBsZXQgc2VsZiA9IHRoaXM7XHJcbiAgICBzZXRUaW1lb3V0KFxyXG4gICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgZDMuc2VsZWN0KCcjJyArIHNlbGYudW5pcXVlSWQpLnJlbW92ZSgpO1xyXG4gICAgICAgIHNlbGYuaW5pdGlhbGl6ZWdyb3VwQ2hhcnQoKTtcclxuICAgICAgfS5iaW5kKHNlbGYpLFxyXG4gICAgICAxMFxyXG4gICAgKTtcclxuICB9XHJcbiAgaXNab29tT3V0U2VsZWN0ZWQoaXNab29tT3V0LCBldmVudCkge1xyXG4gICAgdGhpcy5pc1pvb21lZE91dCA9IGlzWm9vbU91dDtcclxuICAgIHRoaXMub25SZXNpemVkKGV2ZW50KTtcclxuICB9XHJcbiAgaGFuZGxlWm9vbWluWm9vbW91dENsaWNrKHsgaXNab29tT3V0LCBldmVudCB9KSB7XHJcbiAgICB0aGlzLmlzWm9vbU91dFNlbGVjdGVkKGlzWm9vbU91dCwgZXZlbnQpO1xyXG4gIH1cclxuICBuZ09uSW5pdCgpIHt9XHJcbiAgaXNMZWdlbmRWaXNpYmxlKCkge1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLmNoYXJ0RGF0YSAmJlxyXG4gICAgICB0aGlzLmNoYXJ0RGF0YS5tZXRhRGF0YS5jb2xvcnMgJiZcclxuICAgICAgT2JqZWN0LmtleXModGhpcy5jaGFydERhdGEubWV0YURhdGEuY29sb3JzKS5sZW5ndGggPiAxXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG4gIGtlZXBPcmRlciA9IChhLCBiKSA9PiB7XHJcbiAgICByZXR1cm4gYTtcclxuICB9O1xyXG5cclxuICBnZXQgaXNBbGVydEVuYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24/LmhlYWRlck1lbnVPcHRpb25zPy5zb21lKFxyXG4gICAgICAob3B0aW9uKSA9PiBvcHRpb24uaWQgPT09ICdlZGl0QWxlcnQnXHJcbiAgICApO1xyXG4gIH0gIFxyXG4vLyAgIGluaXRpYWxpemVncm91cENoYXJ0KCkge1xyXG4vLyAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4vLyAgICAgbGV0IGRhdGEgPSBbXTtcclxuLy8gICAgIGxldCBtZXRhRGF0YTogYW55ID0gbnVsbDtcclxuLy8gICAgIGxldCBrZXlMaXN0ID0gbnVsbDtcclxuLy8gICAgIGxldCBsaW5lRGF0YSA9IG51bGw7XHJcbi8vICAgICBsZXQgY29sb3JNYXAgPSB7fTtcclxuLy8gICAgIHZhciBmb3JtYXRGcm9tQmFja2VuZDtcclxuLy8gICAgIHZhciBmb3JtYXRGb3JIdWdlTnVtYmVycztcclxuLy8gICAgIGNvbnN0IGlzTW9iaWxlID0gd2luZG93LmlubmVyV2lkdGggPCA1NzY7XHJcbi8vICAgICBjb25zdCBpc1RhYmxldCA9IHdpbmRvdy5pbm5lcldpZHRoID49IDU3NiAmJiB3aW5kb3cuaW5uZXJXaWR0aCA8IDk5MjtcclxuLy8gICAgIGNvbnN0IGlzRGVza3RvcCA9IHdpbmRvdy5pbm5lcldpZHRoID49IDk5MjtcclxuXHJcbi8vICAgIGxldCBpc3JpYSA9IHRoaXMuY3VzdG9tQ2hhcnRDb25maWd1cmF0aW9uLmlzUmlhXHJcblxyXG4vLyAgICAgdmFyIHg6IGFueTtcclxuXHJcbi8vICAgICB2YXIgYWx0ZXJuYXRlX3RleHQgPSBmYWxzZTtcclxuLy8gICAgIHZhciBzaG9ydF90aWNrX2xlbmd0aCA9IDQ7XHJcbi8vICAgICB2YXIgbG9uZ190aWNrX2xlbmd0aCA9IDE2O1xyXG4vLyAgICAgLyoqXHJcbi8vICAgICAgKiBsb25nZXIgdGljayBsZW5ndGggbmVlZGVkIGZvciB3ZWVrbHkgY2hhcnRzXHJcbi8vICAgICAgKi9cclxuLy8gICAgIHZhciBzaG9ydF90aWNrX2xlbmd0aF9iZyA9IDU7XHJcbi8vICAgICB2YXIgbG9uZ190aWNrX2xlbmd0aF9iZyA9IDMwO1xyXG4vLyAgICAgdmFyIGxlZnRBbmRSaWdodFNwYWNlcyA9IDUwO1xyXG4vLyAgICAgdmFyIHJpZ2h0U3ZnV2lkdGggPSA2MDtcclxuLy8gICAgIHZhciB0ZW1wU2NhbGU7XHJcblxyXG4vLyAgICAgZm9yICh2YXIgaSBpbiB0aGlzLmRlZmF1bHRDb25maWd1cmF0aW9uKSB7XHJcbi8vICAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uW2ldID0gQ2hhcnRIZWxwZXIuZ2V0VmFsdWVCeUNvbmZpZ3VyYXRpb25UeXBlKFxyXG4vLyAgICAgICAgIGksXHJcbi8vICAgICAgICAgdGhpcy5kZWZhdWx0Q29uZmlndXJhdGlvbixcclxuLy8gICAgICAgICB0aGlzLmN1c3RvbUNoYXJ0Q29uZmlndXJhdGlvblxyXG4vLyAgICAgICApO1xyXG4vLyAgICAgfVxyXG5cclxuLy8gICAgIGRhdGEgPSB0aGlzLmNoYXJ0RGF0YS5kYXRhO1xyXG4vLyAgICAgbWV0YURhdGEgPSB0aGlzLmNoYXJ0RGF0YS5tZXRhRGF0YTtcclxuLy8gICAgIGxpbmVEYXRhID0gdGhpcy5jaGFydERhdGEubGluZURhdGE7XHJcblxyXG4vLyAgICAgLy8gaWYgKGxpbmVEYXRhIHx8IHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhKSB7XHJcbi8vICAgICAvLyAgIHJpZ2h0U3ZnV2lkdGggPSA2MDtcclxuLy8gICAgIC8vIH1cclxuLy8gICAgIGlmICghbWV0YURhdGEuY29sb3JBYm92ZVRhcmdldCkge1xyXG4vLyAgICAgICBtZXRhRGF0YVsnY29sb3JBYm92ZVRhcmdldCddID0gbWV0YURhdGEuY29sb3JzO1xyXG4vLyAgICAgfVxyXG4vLyAgICAgY29sb3JNYXAgPSBtZXRhRGF0YS5jb2xvcnM7XHJcbi8vICAgICBrZXlMaXN0ID0gbWV0YURhdGEua2V5TGlzdDtcclxuXHJcbi8vICAgICB2YXIgY2hhcnRDb250YWluZXIgPSBkMy5zZWxlY3QodGhpcy5jb250YWluZXJFbHQubmF0aXZlRWxlbWVudCk7XHJcbi8vICAgICB2YXIgdmVydGljYWxzdGFja2VkY29udGFpbmVyID0gZDMuc2VsZWN0KFxyXG4vLyAgICAgICB0aGlzLmdyb3VwY29udGFpbmVyRWx0Lm5hdGl2ZUVsZW1lbnRcclxuLy8gICAgICk7XHJcbi8vICAgICB2YXIgbWFyZ2luID0gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubWFyZ2luO1xyXG4vLyAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSB0aGlzLmNhbGN1bGF0ZUNoYXJ0RGltZW5zaW9ucyhcclxuLy8gICAgIGNoYXJ0Q29udGFpbmVyLFxyXG4vLyAgICAgdmVydGljYWxzdGFja2VkY29udGFpbmVyLFxyXG4vLyAgICAgbWFyZ2luLFxyXG4vLyAgICAgc2VsZlxyXG4vLyAgICk7XHJcbi8vICAgICAvKipcclxuLy8gICAgICAqIGZvciBoaWRpbmcgaGVhZGVyXHJcbi8vICAgICAgKiB1c2VkIGJ5IHdlZWtseSBjaGFydHNcclxuLy8gICAgICAqL1xyXG4vLyAgICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzSGVhZGVyVmlzaWJsZSAhPSB1bmRlZmluZWQpXHJcbi8vICAgICAgIHRoaXMuaXNIZWFkZXJWaXNpYmxlID0gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNIZWFkZXJWaXNpYmxlO1xyXG4vLyAgICAgLyoqXHJcbi8vICAgICAgKiBmb3IgaGlkaW5nIGxlZ2VuZHNcclxuLy8gICAgICAqIHVzZWQgYnkgd2Vla2x5IGNoYXJ0c1xyXG4vLyAgICAgICovXHJcbi8vICAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubGVnZW5kVmlzaWJsZSAhPSB1bmRlZmluZWQpIHtcclxuLy8gICAgICAgdGhpcy5sZWdlbmRWaXNpYmxlID0gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubGVnZW5kVmlzaWJsZTtcclxuLy8gICAgIH1cclxuXHJcbi8vICAgICAvKipcclxuLy8gICAgICAqIGZvciByZW1vdmluZyBiYWNrZ3JvdW5kIGNvbG9yIHNvIHRoYXQgaXQgY2FuIHRha2UgcGFyZW50cyBjb2xvclxyXG4vLyAgICAgICpcclxuLy8gICAgICAqL1xyXG4vLyAgICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzVHJhbnNwYXJlbnRCYWNrZ3JvdW5kICE9IHVuZGVmaW5lZCkge1xyXG4vLyAgICAgICB0aGlzLmlzVHJhbnNwYXJlbnRCYWNrZ3JvdW5kID1cclxuLy8gICAgICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1RyYW5zcGFyZW50QmFja2dyb3VuZDtcclxuLy8gICAgIH1cclxuLy8gICAgIC8qKlxyXG4vLyAgICAgICogZm9ybWF0IGRhdGEgdmFsdWVzIGJhc2VkIG9uIGNvbmZpZ3VyYXRpb24gcmVjZWl2ZWRcclxuLy8gICAgICAqL1xyXG4vLyAgICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnRleHRGb3JtYXR0ZXIgIT0gdW5kZWZpbmVkKSB7XHJcbi8vICAgICAgIGZvcm1hdEZyb21CYWNrZW5kID0gQ2hhcnRIZWxwZXIuZGF0YVZhbHVlRm9ybWF0dGVyKFxyXG4vLyAgICAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnRleHRGb3JtYXR0ZXJcclxuLy8gICAgICAgKTtcclxuLy8gICAgICAgZm9ybWF0Rm9ySHVnZU51bWJlcnMgPSBDaGFydEhlbHBlci5kYXRhVmFsdWVGb3JtYXR0ZXIoJy4ycycpO1xyXG4vLyAgICAgfVxyXG4vLyAgICAgY29uc3Qge1xyXG4vLyAgICAgb3V0ZXJDb250YWluZXIsXHJcbi8vICAgICBzdmdZQXhpc0xlZnQsXHJcbi8vICAgICBzdmdZQXhpc1JpZ2h0LFxyXG4vLyAgICAgaW5uZXJDb250YWluZXIsXHJcbi8vICAgICBzdmdcclxuLy8gICB9ID0gdGhpcy5jcmVhdGVDaGFydENvbnRhaW5lcnMoY2hhcnRDb250YWluZXIsIG1hcmdpbiwgaGVpZ2h0LCByaWdodFN2Z1dpZHRoLCBzZWxmLCB3aWR0aCk7XHJcbi8vICAgICB2YXIgc3ViZ3JvdXBzOiBhbnkgPSBrZXlMaXN0O1xyXG5cclxuLy8gICAgIHZhciBncm91cHMgPSBkM1xyXG4vLyAgICAgICAubWFwKGRhdGEsIGZ1bmN0aW9uIChkKSB7XHJcbi8vICAgICAgICAgcmV0dXJuIGQubmFtZTtcclxuLy8gICAgICAgfSlcclxuLy8gICAgICAgLmtleXMoKTtcclxuXHJcbi8vICAgICAvKipcclxuLy8gICAgICAqIHggYXhpcyByYW5nZSBtYWRlIHNpbWlsYXIgdG8gbGluZSBjaGFydCBvciB2ZXJ0aWNhbCBzdGFjayBzbyB0aGF0IGFsbCB0aGUgY2hhcnRzIHdpbGwgZ2V0IGFsaWduZWQgd2l0aCBlYWNoIG90aGVyLlxyXG4vLyAgICAgICovXHJcbi8vICAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNNdWx0aUNoYXJ0R3JpZExpbmUgIT0gdW5kZWZpbmVkKSB7XHJcbi8vICAgICAgIHggPSBkM1xyXG4vLyAgICAgICAgIC5zY2FsZUJhbmQoKVxyXG4vLyAgICAgICAgIC5yYW5nZVJvdW5kKFt3aWR0aCwgMF0pXHJcbi8vICAgICAgICAgLmFsaWduKDAuNSlcclxuLy8gICAgICAgICAucGFkZGluZyhbMC41XSlcclxuLy8gICAgICAgICAuZG9tYWluKFxyXG4vLyAgICAgICAgICAgZGF0YS5tYXAoZnVuY3Rpb24gKGQ6IGFueSkge1xyXG4vLyAgICAgICAgICAgICByZXR1cm4gZC5uYW1lLnRvTG93ZXJDYXNlKCk7XHJcbi8vICAgICAgICAgICB9KVxyXG4vLyAgICAgICAgICk7XHJcbi8vICAgICB9IGVsc2Uge1xyXG4vLyAgICAgICB4ID0gZDNcclxuLy8gICAgICAgICAuc2NhbGVCYW5kKClcclxuLy8gICAgICAgICAuZG9tYWluKGdyb3VwcylcclxuLy8gICAgICAgICAucmFuZ2UoW2xlZnRBbmRSaWdodFNwYWNlcywgd2lkdGggLSByaWdodFN2Z1dpZHRoIC0gbGVmdEFuZFJpZ2h0U3BhY2VzXSlcclxuLy8gICAgICAgICAucGFkZGluZyhbMC4zXSk7XHJcbi8vICAgICB9XHJcbi8vICAgICAvLyB4LmJhbmR3aWR0aCg5Nik7XHJcbi8vICAgICB2YXIgeFNjYWxlRnJvbU9yaWdpbiA9IGQzXHJcbi8vICAgICAgIC5zY2FsZUJhbmQoKVxyXG4vLyAgICAgICAuZG9tYWluKGdyb3VwcylcclxuLy8gICAgICAgLnJhbmdlKFswLCB3aWR0aCAtIHJpZ2h0U3ZnV2lkdGhdKTtcclxuLy8gICAgIC8vIC5wYWRkaW5nKFswLjJdKTtcclxuXHJcbi8vICAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNNdWx0aUNoYXJ0R3JpZExpbmUgPT0gdW5kZWZpbmVkKSB7XHJcbi8vICAgICAgIC8qKlxyXG4vLyAgICAgICAgKiBub3JtYWwgdGlja3MgZm9yIGFsbCBkYXNoYm9hcmQgY2hhcnRzXHJcbi8vICAgICAgICAqL1xyXG4vLyAgICAgICBzdmdcclxuLy8gICAgICAgICAuYXBwZW5kKCdnJylcclxuLy8gICAgICAgICAuYXR0cignY2xhc3MnLCAneDEgYXhpczEnKVxyXG4vLyAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDAsJyArIGhlaWdodCArICcpJylcclxuLy8gICAgICAgICAuY2FsbChkMy5heGlzQm90dG9tKHgpKVxyXG4vLyAgICAgICAgIC5jYWxsKChnKSA9PiBnLnNlbGVjdCgnLmRvbWFpbicpLnJlbW92ZSgpKTtcclxuXHJcbi8vICAgICAgIHN2Zy5zZWxlY3RBbGwoJ2cueDEuYXhpczEgZy50aWNrIGxpbmUnKS5yZW1vdmUoKTtcclxuXHJcbi8vICAgICAgIC8vIE9ubHkgbW92ZSB4LWF4aXMgbGFiZWxzIGZ1cnRoZXIgZG93biBmb3IgZ3JvdXBlZCBjaGFydHMgaWYgdGhlcmUgaXMgbm8geExhYmVsXHJcbi8vICAgICAgIGlmIChzdWJncm91cHMubGVuZ3RoID4gMSAmJiAhbWV0YURhdGEueExhYmVsKSB7XHJcbi8vICAgICAgICAgc3ZnXHJcbi8vICAgICAgICAgICAuc2VsZWN0QWxsKCdnLngxLmF4aXMxIGcudGljayB0ZXh0JylcclxuLy8gICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdsaWIteGF4aXMtbGFiZWxzLXRleHRzLWRyaWxsZG93bicpXHJcbi8vICAgICAgICAgICAuc3R5bGUoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKVxyXG4vLyAgICAgICAgICAgLmF0dHIoJ3knLCAzMik7IC8vIEluY3JlYXNlIGRpc3RhbmNlIGZyb20gYmFycyAoZGVmYXVsdCBpcyB+OSlcclxuLy8gICAgICAgfSBlbHNlIHtcclxuLy8gICAgICAgICBzdmdcclxuLy8gICAgICAgICAgIC5zZWxlY3RBbGwoJ2cueDEuYXhpczEgZy50aWNrIHRleHQnKVxyXG4vLyAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi14YXhpcy1sYWJlbHMtdGV4dHMtZHJpbGxkb3duJylcclxuLy8gICAgICAgICAgIC5zdHlsZSgnZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpO1xyXG4vLyAgICAgICB9XHJcbi8vICAgICB9IFxyXG4vLyAgICAgZWxzZSB7XHJcbi8vICAgICAgIC8qKlxyXG4vLyAgICAgICAgKiBiaWdnZXIgdGlja3MgZm9yIHdlZWtseSBjaGFydHMgYW5kIG1vcmUgc3BhY2UgZnJvbSB4IGF4aXMgdG8gbGFiZWxzXHJcbi8vICAgICAgICAqL1xyXG4vLyAgICAgICAvKipcclxuLy8gICAgICAgICogZHJhdyB4IGF4aXNcclxuLy8gICAgICAgICovXHJcbi8vICAgICAgIHN2Z1xyXG4vLyAgICAgICAgIC5hcHBlbmQoJ2cnKVxyXG4vLyAgICAgICAgIC5hdHRyKCdjbGFzcycsICd4MSBheGlzMScpXHJcbi8vICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoMCwnICsgaGVpZ2h0ICsgJyknKVxyXG4vLyAgICAgICAgIC5jYWxsKGQzLmF4aXNCb3R0b20oeCkudGlja1NpemUoMCkpXHJcbi8vICAgICAgICAgLmNhbGwoKGcpID0+IGcuc2VsZWN0KCcuZG9tYWluJykuYXR0cignZmlsbCcsICdub25lJykpO1xyXG4vLyAgICAgICAvKipcclxuLy8gICAgICAgICogdGljayBsaW5lIHNpemUgaW4gYWx0ZXJuYXRlIGZhc2hpb25cclxuLy8gICAgICAgICovXHJcbi8vICAgICAgIHN2Zy5zZWxlY3RBbGwoJ2cueDEuYXhpczEgZy50aWNrIGxpbmUnKS5hdHRyKCd5MicsIGZ1bmN0aW9uICgpIHtcclxuLy8gICAgICAgICBpZiAoXHJcbi8vICAgICAgICAgICBhbHRlcm5hdGVfdGV4dCAmJlxyXG4vLyAgICAgICAgICAgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNOb0FsdGVybmF0ZVhheGlzVGV4dCA9PSB1bmRlZmluZWRcclxuLy8gICAgICAgICApIHtcclxuLy8gICAgICAgICAgIGFsdGVybmF0ZV90ZXh0ID0gZmFsc2U7XHJcbi8vICAgICAgICAgICByZXR1cm4gbG9uZ190aWNrX2xlbmd0aF9iZyAtIDc7XHJcbi8vICAgICAgICAgfSBlbHNlIHtcclxuLy8gICAgICAgICAgIGFsdGVybmF0ZV90ZXh0ID0gdHJ1ZTtcclxuLy8gICAgICAgICAgIHJldHVybiBzaG9ydF90aWNrX2xlbmd0aF9iZyAtIDQ7XHJcbi8vICAgICAgICAgfVxyXG4vLyAgICAgICB9KTtcclxuLy8gICAgICAgLyoqXHJcbi8vICAgICAgICAqIHJlc2V0IHRoZSBmbGFnIHNvIHRoYXQgdmFsdWVzIGNhbiBiZSBzaG93biBpbiBzYW1lIGFsdGVybmF0ZSBmYXNoaW9uXHJcbi8vICAgICAgICAqL1xyXG4vLyAgICAgICBhbHRlcm5hdGVfdGV4dCA9IGZhbHNlO1xyXG4vLyAgICAgICAvKipcclxuLy8gICAgICAgICogcHJpbnQgeC1heGlzIGxhYmVsIHRleHRzXHJcbi8vICAgICAgICAqIHVzZWQgYnkgd2Vla2x5IGNoYXJ0c1xyXG4vLyAgICAgICAgKi9cclxuLy8gICAgICAgc3ZnXHJcbi8vICAgICAgICAgLnNlbGVjdEFsbCgnZy54MS5heGlzMSBnLnRpY2sgdGV4dCcpXHJcbi8vICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi14YXhpcy1sYWJlbHMtdGV4dHMtd2Vla2x5Y2hhcnRzJylcclxuLy8gICAgICAgICAuYXR0cigneScsIGZ1bmN0aW9uICgpIHtcclxuLy8gICAgICAgICAgIC8vIE1pbmltaXplIGdhcCBpbiBtYXhpbWl6ZWQgKGZ1bGxzY3JlZW4pIHZpZXcgZm9yIHdlZWtseSBjaGFydHNcclxuLy8gICAgICAgICAgIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0Z1bGxTY3JlZW4pIHtcclxuLy8gICAgICAgICAgICAgcmV0dXJuIHNob3J0X3RpY2tfbGVuZ3RoX2JnO1xyXG4vLyAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgaWYgKGFsdGVybmF0ZV90ZXh0KSB7XHJcbi8vICAgICAgICAgICAgIGFsdGVybmF0ZV90ZXh0ID0gZmFsc2U7XHJcbi8vICAgICAgICAgICAgIHJldHVybiBsb25nX3RpY2tfbGVuZ3RoX2JnO1xyXG4vLyAgICAgICAgICAgfSBlbHNlIHtcclxuLy8gICAgICAgICAgICAgYWx0ZXJuYXRlX3RleHQgPSB0cnVlO1xyXG4vLyAgICAgICAgICAgICByZXR1cm4gc2hvcnRfdGlja19sZW5ndGhfYmc7XHJcbi8vICAgICAgICAgICB9XHJcbi8vICAgICAgICAgfSk7XHJcbi8vICAgICB9XHJcbi8vICAgICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueExhYmVsc09uU2FtZUxpbmUpIHtcclxuLy8gICAgICAgY29uc3QgeEF4aXNMYWJlbHMgPSBzdmdcclxuLy8gICAgICAgICAuc2VsZWN0QWxsKCdnLngxLmF4aXMxIGcudGljayB0ZXh0JylcclxuLy8gICAgICAgICAuYXR0cignY2xhc3MnLCAnbGliLXhheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24nKVxyXG4vLyAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy5pc0hlYWRlclZpc2libGUgPyAnMThweCcgOiAnMTRweCcpXHJcbi8vICAgICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXHJcbi8vICAgICAgICAgLmF0dHIoJ3knLCBmdW5jdGlvbihkKSB7XHJcbi8vICAgICAgICAgICAvLyBGb3IgZ3JvdXBlZCBiYXIgY2hhcnRzIHdpdGggbWFueSBiYXJzIGFuZCB4TGFiZWwgcHJlc2VudCwgb25seSBhZGQgNSBpZiB0aGUgbGFiZWwgaXMgYSBkYXRlXHJcbi8vICAgICAgICAgICBpZiAoc3ViZ3JvdXBzLmxlbmd0aCA+IDEgJiYgZGF0YS5sZW5ndGggPiA4ICYmIG1ldGFEYXRhLnhMYWJlbCkge1xyXG4vLyAgICAgICAgICAgICBjb25zdCBpc0RhdGVMYWJlbCA9IC9cXGR7Miw0fVstXFwvXS8udGVzdChkKTtcclxuLy8gICAgICAgICAgICAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmlzRnVsbFNjcmVlbikge1xyXG4vLyAgICAgICAgICAgICAgIHJldHVybiBpc0RhdGVMYWJlbCA/IHNob3J0X3RpY2tfbGVuZ3RoX2JnICsgMTQgOiBzaG9ydF90aWNrX2xlbmd0aF9iZztcclxuLy8gICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgICByZXR1cm4gaXNEYXRlTGFiZWwgPyBzaG9ydF90aWNrX2xlbmd0aF9iZyArIDE0IDogc2hvcnRfdGlja19sZW5ndGhfYmc7XHJcbi8vICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAvLyBGb3IgZ3JvdXBlZCBiYXIgY2hhcnRzIHdpdGggbWFueSBiYXJzIGFuZCBOTyB4TGFiZWwsIGFkZCBzcGFjZSBhcyBiZWZvcmUsIGJ1dCByZWR1Y2UgaW4gZnVsbHNjcmVlblxyXG4vLyAgICAgICAgICAgaWYgKHN1Ymdyb3Vwcy5sZW5ndGggPiAxICYmIGRhdGEubGVuZ3RoID4gOCAmJiAhbWV0YURhdGEueExhYmVsKSB7XHJcbi8vICAgICAgICAgICAgIGNvbnN0IGNoYXJ0SGFzRXh0cmFCb3R0b20gPSAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubWFyZ2luICYmIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLm1hcmdpbi5ib3R0b20gPj0gNDApO1xyXG4vLyAgICAgICAgICAgICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNGdWxsU2NyZWVuKSB7XHJcbi8vICAgICAgICAgICAgICAgLy8gUmVkdWNlIGV4dHJhIGdhcCBpbiBtYXhpbWl6ZWQgdmlld1xyXG4vLyAgICAgICAgICAgICAgIHJldHVybiBzaG9ydF90aWNrX2xlbmd0aF9iZyArIDI7XHJcbi8vICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgICAgcmV0dXJuIGNoYXJ0SGFzRXh0cmFCb3R0b20gPyBzaG9ydF90aWNrX2xlbmd0aF9iZyA6IHNob3J0X3RpY2tfbGVuZ3RoX2JnICsgMTA7XHJcbi8vICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAvLyBEZWZhdWx0L2ZhbGxiYWNrIGxvZ2ljIGZvciBvdGhlciBjYXNlc1xyXG4vLyAgICAgICAgICAgbGV0IGJhc2VZID0gc2VsZi5pc0hlYWRlclZpc2libGUgPyBzaG9ydF90aWNrX2xlbmd0aF9iZyArIDI1IDogc2hvcnRfdGlja19sZW5ndGhfYmc7XHJcbi8vICAgICAgICAgICBpZiAoXHJcbi8vICAgICAgICAgICAgIHN1Ymdyb3Vwcy5sZW5ndGggPiAxICYmXHJcbi8vICAgICAgICAgICAgICFtZXRhRGF0YS54TGFiZWwgJiZcclxuLy8gICAgICAgICAgICAgKC9cXGR7Miw0fVstXFwvXVxcZHsyfVstXFwvXVxcZHsyLDR9Ly50ZXN0KGQpIHx8IC9cXGR7Miw0fVstXFwvXVxcZHsyLDR9Ly50ZXN0KGQpKVxyXG4vLyAgICAgICAgICAgKSB7XHJcbi8vICAgICAgICAgICAgIGJhc2VZID0gc2VsZi5pc0hlYWRlclZpc2libGUgPyBzaG9ydF90aWNrX2xlbmd0aF9iZyArIDE1IDogc2hvcnRfdGlja19sZW5ndGhfYmcgKyAyNTtcclxuLy8gICAgICAgICAgIH1cclxuLy8gICAgICAgICAgIGlmICgvXFxkezIsNH1bLVxcL11cXGR7Miw0fS8udGVzdChkKSAmJiBkLmluZGV4T2YoJyAnKSA+IC0xKSB7XHJcbi8vICAgICAgICAgICAgIGJhc2VZICs9IDQ7XHJcbi8vICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAvLyBJbiBtYXhpbWl6ZWQgdmlldywgcmVkdWNlIGJhc2VZIHNsaWdodGx5IGZvciBncm91cGVkIGJhcnNcclxuLy8gICAgICAgICAgIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0Z1bGxTY3JlZW4gJiYgc3ViZ3JvdXBzLmxlbmd0aCA+IDEpIHtcclxuLy8gICAgICAgICAgICAgYmFzZVkgPSBNYXRoLm1heChzaG9ydF90aWNrX2xlbmd0aF9iZywgYmFzZVkgLSAxMCk7XHJcbi8vICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICByZXR1cm4gYmFzZVk7XHJcbi8vICAgICAgICAgfSlcclxuLy8gICAgICAgICAuYXR0cigneCcsIGZ1bmN0aW9uIChkKSB7XHJcbi8vICAgICAgICAgICBpZiAoc2VsZi5jaGFydERhdGEuZGF0YS5sZW5ndGggPiA4ICYmICFzZWxmLmlzWm9vbWVkT3V0KSB7XHJcbi8vICAgICAgICAgICAgIHJldHVybiAxOyAvLyBNb3ZlIGZpcnN0IGxpbmUgdGV4dCBzbGlnaHRseSB0byB0aGUgbGVmdCBpbiB6b29tLWluIHZpZXcgZm9yIGJldHRlciBhbGlnbm1lbnRcclxuLy8gICAgICAgICAgIH1cclxuLy8gICAgICAgICAgIHJldHVybiAwOyAvLyBEZWZhdWx0IHBvc2l0aW9uXHJcbi8vICAgICAgICAgfSlcclxuLy8gICAgICAgICAudGV4dChmdW5jdGlvbiAoZCkge1xyXG4vLyAgICAgICAgICAgdmFyIGlzVmFsdWVUb0JlSWdub3JlZCA9IGZhbHNlO1xyXG4vLyAgICAgICAgICAgaWYgKGlzTW9iaWxlICYmICFzZWxmLmlzSGVhZGVyVmlzaWJsZSkge1xyXG4vLyAgICAgICAgICAgICBsZXQgZmlyc3RQYXJ0ID0gZC5zcGxpdCgvW1xcc1xcLV0rLylbMF07XHJcbi8vICAgICAgICAgICAgIHJldHVybiBmaXJzdFBhcnQuc3Vic3RyaW5nKDAsIDMpLnRvTG93ZXJDYXNlKCk7XHJcbi8vICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAoZGF0YSBhcyBhbnlbXSkubWFwKChpbmRpdjogYW55KSA9PiB7XHJcbi8vICAgICAgICAgICAgIGlmIChcclxuLy8gICAgICAgICAgICAgICBpbmRpdi5uYW1lICYmXHJcbi8vICAgICAgICAgICAgICAgaW5kaXYubmFtZS50b0xvd2VyQ2FzZSgpID09IGQudHJpbSgpLnRvTG93ZXJDYXNlKCkgJiZcclxuLy8gICAgICAgICAgICAgICBpbmRpdlttZXRhRGF0YS5rZXlMaXN0WzBdXSA9PSAtMVxyXG4vLyAgICAgICAgICAgICApIHtcclxuLy8gICAgICAgICAgICAgICBpc1ZhbHVlVG9CZUlnbm9yZWQgPSB0cnVlO1xyXG4vLyAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICB9KTtcclxuLy8gICAgICAgICAgIGlmIChpc1ZhbHVlVG9CZUlnbm9yZWQpIHtcclxuLy8gICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4vLyAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgLy8gQWx3YXlzIGFkZCBzcGFjZSBiZWZvcmUgYW5kIGFmdGVyIGh5cGhlbiBmb3IgZGF0ZSByYW5nZSBsYWJlbHMsIGV2ZW4gd2hlbiBoZWFkZXIgaXMgdmlzaWJsZSBhbmQgbGFiZWwgaXMgc2luZ2xlIGxpbmVcclxuLy8gICAgICAgICAgIC8vIEFwcGx5IGZvciBncm91cGVkIGJhciBjaGFydHMgYW5kIHNpbmdsZSBiYXIgY2hhcnRzLCBoZWFkZXIgdmlzaWJsZSwgc2luZ2xlIGxpbmVcclxuLy8gICAgICAgICAgIGNvbnN0IGRhdGVSYW5nZVJlZ2V4ID0gLyhcXGR7Miw0fVstXFwvXVxcZHsyfVstXFwvXVxcZHsyLDR9KVxccyotXFxzKihcXGR7Miw0fVstXFwvXVxcZHsyfVstXFwvXVxcZHsyLDR9KS87XHJcbi8vICAgICAgICAgICBpZiAoZGF0ZVJhbmdlUmVnZXgudGVzdChkLnRyaW0oKSkpIHtcclxuLy8gICAgICAgICAgICAgcmV0dXJuIGQudHJpbSgpLnJlcGxhY2UoZGF0ZVJhbmdlUmVnZXgsIChtLCBkMSwgZDIpID0+IGAke2QxfSAtICR7ZDJ9YCk7XHJcbi8vICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAvLyBTcGxpdCBkYXRlIGFuZCB3ZWVrIGxhYmVscyBpbnRvIHR3byBsaW5lcyBpbiBncm91cGVkIGJhciB6b29tLWluIHZpZXcgKGFuZCBtaW5pbWl6ZWQgdmlldylcclxuLy8gICAgICAgICAgIGNvbnN0IGlzRGF0ZUxhYmVsID0gL1xcZHsyLDR9Wy1cXC9dLy50ZXN0KGQpO1xyXG4vLyAgICAgICAgICAgY29uc3QgaXNXZWVrTGFiZWwgPSAvd2Vla3x3a3x3XFxkKy9pLnRlc3QoZCk7XHJcbi8vICAgICAgICAgICBpZiAoXHJcbi8vICAgICAgICAgICAgIHN1Ymdyb3Vwcy5sZW5ndGggPiAxICYmICFzZWxmLmlzWm9vbWVkT3V0ICYmIGRhdGEubGVuZ3RoID4gOCAmJiBkLmluZGV4T2YoJyAnKSA+IC0xICYmIChpc0RhdGVMYWJlbCB8fCBpc1dlZWtMYWJlbClcclxuLy8gICAgICAgICAgICkge1xyXG4vLyAgICAgICAgICAgICB2YXIgZmlyc3QgPSBkLnN1YnN0cmluZygwLCBkLmluZGV4T2YoJyAnKSk7XHJcbi8vICAgICAgICAgICAgIHZhciBzZWNvbmQgPSBkLnN1YnN0cmluZyhkLmluZGV4T2YoJyAnKSArIDEpLnRyaW0oKTtcclxuLy8gICAgICAgICAgICAgcmV0dXJuIGZpcnN0ICsgJ1xcbicgKyBzZWNvbmQ7XHJcbi8vICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAvLyBBbHNvIGtlZXAgcHJldmlvdXMgbG9naWMgZm9yIG1pbmltaXplZCB2aWV3XHJcbi8vICAgICAgICAgICBpZiAoaXNEYXRlTGFiZWwpIHtcclxuLy8gICAgICAgICAgICAgaWYgKCFzZWxmLmlzSGVhZGVyVmlzaWJsZSAmJiBkYXRhLmxlbmd0aCA+IDggJiYgZC5pbmRleE9mKCcgJykgPiAtMSkge1xyXG4vLyAgICAgICAgICAgICAgIHZhciBmaXJzdCA9IGQuc3Vic3RyaW5nKDAsIGQuaW5kZXhPZignICcpKTtcclxuLy8gICAgICAgICAgICAgICB2YXIgc2Vjb25kID0gZC5zdWJzdHJpbmcoZC5pbmRleE9mKCcgJykgKyAxKS50cmltKCk7XHJcbi8vICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0ICsgJ1xcbicgKyBzZWNvbmQ7XHJcbi8vICAgICAgICAgICAgIH0gZWxzZSB7XHJcbi8vICAgICAgICAgICAgICAgcmV0dXJuIGQ7XHJcbi8vICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgIH1cclxuLy8gICAgICAgICAgIGlmIChkLnRyaW0oKS5pbmRleE9mKCcgJykgPiAtMSkge1xyXG4vLyAgICAgICAgICAgICByZXR1cm4gZC50cmltKCkuc3Vic3RyaW5nKDAsIGQuaW5kZXhPZignICcpKS50b0xvd2VyQ2FzZSgpO1xyXG4vLyAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgcmV0dXJuIGQudG9Mb3dlckNhc2UoKTtcclxuLy8gICAgICAgICAgIC8vIElmIGxhYmVsIGxvb2tzIGxpa2UgYSBkYXRlIChjb250YWlucyBkaWdpdHMgYW5kIC0gb3IgLylcclxuLy8gICAgICAgICAgIGNvbnN0IGlzRGF0ZUxhYmVsMiA9IC9cXGR7Miw0fVstXFwvXS8udGVzdChkKTtcclxuLy8gICAgICAgICAgIC8vIE9ubHkgc3BsaXQgZGF0ZS93ZWVrIGxhYmVscyBpZiB0aGVyZSBhcmUgbWFueSBncm91cGVkIGJhcnMgYW5kIGhlYWRlciBpcyBub3QgdmlzaWJsZVxyXG4vLyAgICAgICAgICAgaWYgKGlzRGF0ZUxhYmVsKSB7XHJcbi8vICAgICAgICAgICAgIGlmICghc2VsZi5pc0hlYWRlclZpc2libGUgJiYgZGF0YS5sZW5ndGggPiA4ICYmIGQuaW5kZXhPZignICcpID4gLTEpIHtcclxuLy8gICAgICAgICAgICAgICB2YXIgZmlyc3QgPSBkLnN1YnN0cmluZygwLCBkLmluZGV4T2YoJyAnKSk7XHJcbi8vICAgICAgICAgICAgICAgdmFyIHNlY29uZCA9IGQuc3Vic3RyaW5nKGQuaW5kZXhPZignICcpICsgMSkudHJpbSgpO1xyXG4vLyAgICAgICAgICAgICAgIHJldHVybiBmaXJzdCArICdcXG4nICsgc2Vjb25kO1xyXG4vLyAgICAgICAgICAgICB9IGVsc2Uge1xyXG4vLyAgICAgICAgICAgICAgIHJldHVybiBkO1xyXG4vLyAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICBpZiAoZC50cmltKCkuaW5kZXhPZignICcpID4gLTEpIHtcclxuLy8gICAgICAgICAgICAgcmV0dXJuIGQudHJpbSgpLnN1YnN0cmluZygwLCBkLmluZGV4T2YoJyAnKSkudG9Mb3dlckNhc2UoKTtcclxuLy8gICAgICAgICAgIH1cclxuLy8gICAgICAgICAgIHJldHVybiBkLnRvTG93ZXJDYXNlKCk7XHJcbi8vICAgICAgICAgfSk7XHJcblxyXG4vLyAgICAgICAvLyBOb3cgYXBwbHkgd3JpdGluZy1tb2RlOiBzaWRld2F5cy1sciBmb3IgZ3JvdXBlZCBjaGFydHMgd2l0aCBkYXRlIGxhYmVscyBpbiB6b29tZWQtb3V0IHZpZXcgYW5kIG1hbnkgYmFyc1xyXG4vLyAgICAgICB4QXhpc0xhYmVscy5lYWNoKGZ1bmN0aW9uKHRoaXM6IFNWR1RleHRFbGVtZW50LCBkOiBhbnkpIHtcclxuLy8gICAgICAgICAvLyBPbmx5IGFwcGx5IHdyaXRpbmctbW9kZSBmb3IgZXhhY3QgZGF0ZSBsYWJlbHMsIG5vdCB0aG9zZSBjb250YWluaW5nICd3ZWVrJyBvciBzaW1pbGFyXHJcbi8vICAgICAgICAgY29uc3QgaXNEYXRlTGFiZWwgPSAvXihcXGR7Miw0fVstXFwvXSk/XFxkezIsNH1bLVxcL11cXGR7Miw0fSQvLnRlc3QoZC50cmltKCkpO1xyXG4vLyAgICAgICAgIGNvbnN0IGlzV2Vla0xhYmVsID0gL3dlZWt8d2t8d1xcZCsvaS50ZXN0KGQpO1xyXG4vLyAgICAgICAgIGlmIChzdWJncm91cHMubGVuZ3RoID4gMSAmJiBzZWxmLmlzWm9vbWVkT3V0ICYmIGRhdGEubGVuZ3RoID4gOCAmJiBpc0RhdGVMYWJlbCAmJiAhaXNXZWVrTGFiZWwpIHtcclxuLy8gICAgICAgICAgIGQzLnNlbGVjdCh0aGlzKS5zdHlsZSgnd3JpdGluZy1tb2RlJywgJ3NpZGV3YXlzLWxyJyk7XHJcbi8vICAgICAgICAgfVxyXG4vLyAgICAgICB9KTtcclxuLy8gICAgICAgaWYgKCFpc01vYmlsZSkge1xyXG4vLyAgICAgICAgIHN2Z1xyXG4vLyAgICAgICAgICAgLnNlbGVjdEFsbCgnZy54MS5heGlzMSBnLnRpY2snKVxyXG4vLyAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoZCkge1xyXG4vLyAgICAgICAgICAgICByZXR1cm4gIS9cXGR7Miw0fVstXFwvXS8udGVzdChkKTsgLy8gT25seSBwcm9jZXNzIG5vbi1kYXRlIGxhYmVsc1xyXG4vLyAgICAgICAgICAgfSlcclxuLy8gICAgICAgICAgIC5hcHBlbmQoJ3RleHQnKVxyXG4vLyAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi14YXhpcy1sYWJlbHMtdGV4dHMtZHJpbGxkb3duJylcclxuLy8gICAgICAgICAgIC5hdHRyKCd5JywgbG9uZ190aWNrX2xlbmd0aF9iZylcclxuLy8gICAgICAgICAgIC5hdHRyKCdmaWxsJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJylcclxuLy8gICAgICAgICAgIC5hdHRyKCd4JywgZnVuY3Rpb24gKGQpIHtcclxuLy8gICAgICAgICAgICAgaWYgKHNlbGYuY2hhcnREYXRhLmRhdGEubGVuZ3RoID4gOCAmJiAhc2VsZi5pc1pvb21lZE91dCkge1xyXG4vLyAgICAgICAgICAgICAgIHJldHVybiAxOyAvLyBNb3ZlIHRleHQgc2xpZ2h0bHkgdG8gdGhlIGxlZnRcclxuLy8gICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgICByZXR1cm4gMDsgLy8gRGVmYXVsdCBwb3NpdGlvblxyXG4vLyAgICAgICAgICAgfSlcclxuLy8gICAgICAgICAgIC50ZXh0KGZ1bmN0aW9uIChkKSB7XHJcbi8vICAgICAgICAgICAgIGlmIChkLnRyaW0oKS5pbmRleE9mKCcgJykgPiAtMSkge1xyXG4vLyAgICAgICAgICAgICAgIHJldHVybiBkLnRyaW0oKS5zdWJzdHJpbmcoZC5pbmRleE9mKCcgJyksIGQubGVuZ3RoKS50b0xvd2VyQ2FzZSgpO1xyXG4vLyAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAgIHJldHVybiAnJztcclxuLy8gICAgICAgICAgIH0pO1xyXG4vLyAgICAgICB9XHJcbi8vICAgICB9XHJcbi8vICAgICAgICAgaWYgKGlzcmlhICYmIHNlbGYuY2hhcnREYXRhLmRhdGEubGVuZ3RoID4gOCkge1xyXG4vLyAgICAgICBzdmdcclxuLy8gICAgICAgICAuc2VsZWN0QWxsKCdnLngxLmF4aXMxIGcudGljayB0ZXh0JylcclxuLy8gICAgICAgICAuY2xhc3NlZCgnbW9iaWxlLXhheGlzLW92ZXJyaWRlJywgdHJ1ZSlcclxuLy8gICAgICAgICAudGV4dChmdW5jdGlvbiAoZDogc3RyaW5nKSB7XHJcbi8vICAgICAgICAgICByZXR1cm4gZC5zdWJzdHJpbmcoMCwgMyk7XHJcbi8vICAgICAgICAgfSlcclxuLy8gICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsICcxMnB4JykgXHJcbi8vICAgICAgICAgLmF0dHIoJ3knLCA1KSAgICAgICAgICAgICAgIFxyXG4vLyAgICAgICAgIC5hdHRyKCd4JywgNSkgICAgICAgICAgICAgICAgXHJcbi8vICAgICAgICAgLnN0eWxlKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKTtcclxuLy8gICAgIH1cclxuLy8gICAgIGlmIChpc01vYmlsZSAmJiAhdGhpcy5pc0hlYWRlclZpc2libGUpIHtcclxuLy8gICAgICAgc3ZnXHJcbi8vICAgICAgICAgLnNlbGVjdEFsbCgnZy54MS5heGlzMSBnLnRpY2sgdGV4dCcpXHJcbi8vICAgICAgICAgLmNsYXNzZWQoJ21vYmlsZS14YXhpcy1vdmVycmlkZScsIHRydWUpO1xyXG4vLyAgICAgfVxyXG4vLyAgICAgLyoqeSBzY2FsZSBmb3IgbGVmdCB5IGF4aXMgKi9cclxuLy8gICAgIHZhciB5ID0gZDMuc2NhbGVMaW5lYXIoKS5yYW5nZVJvdW5kKFtoZWlnaHQsIDBdKTtcclxuLy8gICAgIHZhciBtYXhWYWx1ZSA9IGQzLm1heChkYXRhLCAoZCkgPT4gZDMubWF4KGtleUxpc3QsIChrZXkpID0+ICtkW2tleV0pKTtcclxuLy8gICAgIGlmIChtYXhWYWx1ZSA9PSAwKSB7XHJcbi8vICAgICAgIGlmICh0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YSkge1xyXG4vLyAgICAgICAgIG1heFZhbHVlID0gdGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEudGFyZ2V0ICsgMjA7XHJcbi8vICAgICAgIH0gZWxzZSB7XHJcbi8vICAgICAgICAgbWF4VmFsdWUgPSAxMDA7XHJcbi8vICAgICAgIH1cclxuLy8gICAgIH1cclxuXHJcbi8vICAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uY3VzdG9tWXNjYWxlKSB7XHJcbi8vICAgICAgIC8qKlxyXG4vLyAgICAgICAgKiBpbmNyZWFzZSB5LXNjYWxlIHNvIHRoYXQgdmFsdWVzIHdvbnQgY3Jvc3Mgb3IgZXhjZWVkIG91dCBvZiByYW5nZVxyXG4vLyAgICAgICAgKiB1c2VkIGluIHdlZWtseSBjaGFydHNcclxuLy8gICAgICAgICovXHJcbi8vICAgICAgIG1heFZhbHVlID0gbWF4VmFsdWUgKiB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXN0b21Zc2NhbGU7XHJcbi8vICAgICB9XHJcbi8vICAgICBpZiAoXHJcbi8vICAgICAgIHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhICYmXHJcbi8vICAgICAgIG1heFZhbHVlIDwgdGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEudGFyZ2V0XHJcbi8vICAgICApIHtcclxuLy8gICAgICAgbWF4VmFsdWUgPVxyXG4vLyAgICAgICAgIG1heFZhbHVlIDwgMTAgJiYgdGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEudGFyZ2V0IDwgMTBcclxuLy8gICAgICAgICAgID8gdGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEudGFyZ2V0ICsgM1xyXG4vLyAgICAgICAgICAgOiB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXQgKyAyMDtcclxuLy8gICAgIH1cclxuLy8gICAgIHkuZG9tYWluKFswLCBtYXhWYWx1ZV0pLm5pY2UoKTtcclxuLy8gICAgIGxldCBsaW5lWXNjYWxlO1xyXG5cclxuLy8gICAgIGlmIChsaW5lRGF0YSAhPSBudWxsKSB7XHJcbi8vICAgICAgIGxldCBtYXhMaW5lVmFsdWUgPSBkMy5tYXgobGluZURhdGEsIGZ1bmN0aW9uIChkKSB7XHJcbi8vICAgICAgICAgcmV0dXJuICtkLnZhbHVlO1xyXG4vLyAgICAgICB9KTtcclxuXHJcbi8vICAgICAgIG1heExpbmVWYWx1ZSA9IG1heExpbmVWYWx1ZSAqIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmN1c3RvbVlzY2FsZTtcclxuXHJcbi8vICAgICAgIGxldCBtaW5MaW5lVmFsdWUgPSBkMy5taW4obGluZURhdGEsIGZ1bmN0aW9uIChkKSB7XHJcbi8vICAgICAgICAgcmV0dXJuICtkLnZhbHVlO1xyXG4vLyAgICAgICB9KTtcclxuLy8gICAgICAgaWYgKG1heExpbmVWYWx1ZSA+IDApIG1pbkxpbmVWYWx1ZSA9IG1pbkxpbmVWYWx1ZSAtIDM7XHJcbi8vICAgICAgIGlmIChtaW5MaW5lVmFsdWUgPiAwKSB7XHJcbi8vICAgICAgICAgbWluTGluZVZhbHVlID0gMDtcclxuLy8gICAgICAgfVxyXG4vLyAgICAgICBsaW5lWXNjYWxlID0gZDNcclxuLy8gICAgICAgICAuc2NhbGVMaW5lYXIoKVxyXG4vLyAgICAgICAgIC5kb21haW4oW21pbkxpbmVWYWx1ZSwgbWF4TGluZVZhbHVlXSlcclxuLy8gICAgICAgICAucmFuZ2UoW2hlaWdodCwgbWluTGluZVZhbHVlXSk7XHJcbi8vICAgICB9XHJcbi8vICAgICBsZXQgeUxpbmVBeGlzO1xyXG4vLyAgICAgaWYgKGxpbmVZc2NhbGUgIT0gbnVsbCkge1xyXG4vLyAgICAgICB5TGluZUF4aXMgPSBkM1xyXG4vLyAgICAgICAgIC5heGlzUmlnaHQobGluZVlzY2FsZSlcclxuLy8gICAgICAgICAudGlja3Moc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubnVtYmVyT2ZZVGlja3MpXHJcbi8vICAgICAgICAgLnRpY2tTaXplKDApXHJcbi8vICAgICAgICAgLnRpY2tGb3JtYXQoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueUxpbmVBeGlzTGFiZWxGb21hdHRlcik7XHJcbi8vICAgICB9XHJcbi8vICAgICAvKipcclxuLy8gICAgICAqIHNob3cgeC1heGlzIGdyaWQgYmV0d2VlbiBsYWJlbHNcclxuLy8gICAgICAqIHVzZWQgYnkgd2Vla2x5IGNoYXJ0c1xyXG4vLyAgICAgICovXHJcbi8vICAgICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNYZ3JpZEJldHdlZW5MYWJlbHMpIHtcclxuLy8gICAgICAgc3ZnXHJcbi8vICAgICAgICAgLmFwcGVuZCgnZycpXHJcbi8vICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2dyaWQnKVxyXG4vLyAgICAgICAgIC5hdHRyKFxyXG4vLyAgICAgICAgICAgJ3RyYW5zZm9ybScsXHJcbi8vICAgICAgICAgICAndHJhbnNsYXRlKCcgKyB4LmJhbmR3aWR0aCgpIC8gMiArICcsJyArIGhlaWdodCArICcpJ1xyXG4vLyAgICAgICAgIClcclxuLy8gICAgICAgICAuY2FsbChkMy5heGlzQm90dG9tKHgpLnRpY2tTaXplKC1oZWlnaHQpLnRpY2tGb3JtYXQoJycpKVxyXG4vLyAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLWRhc2hhcnJheScsICc1IDUnKVxyXG4vLyAgICAgICAgIC5zdHlsZSgnY29sb3InLCAndmFyKC0tY2hhcnQtZ3JpZC1jb2xvciwgIzk5OTk5OSknKSAvLyBVc2UgQ1NTIHZhcmlhYmxlXHJcbi8vICAgICAgICAgLmNhbGwoKGcpID0+IGcuc2VsZWN0KCcuZG9tYWluJykucmVtb3ZlKCkpO1xyXG4vLyAgICAgfVxyXG5cclxuLy8gICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi55QXhpc0dyaWQpIHtcclxuLy8gICAgICAgc3ZnXHJcbi8vICAgICAgICAgLmFwcGVuZCgnZycpXHJcbi8vICAgICAgICAgLmNhbGwoXHJcbi8vICAgICAgICAgICBkM1xyXG4vLyAgICAgICAgICAgICAuYXhpc0xlZnQoeSlcclxuLy8gICAgICAgICAgICAgLnRpY2tzKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLm51bWJlck9mWVRpY2tzKVxyXG4vLyAgICAgICAgICAgICAudGlja1NpemUoLXdpZHRoKVxyXG4vLyAgICAgICAgIClcclxuLy8gICAgICAgICAuc3R5bGUoJ2NvbG9yJywgJ3ZhcigtLWNoYXJ0LWF4aXMtY29sb3IsICNCOUI5QjkpJylcclxuLy8gICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAnMC41JylcclxuLy8gICAgICAgICAuY2FsbCgoZykgPT4ge1xyXG4vLyAgICAgICAgICAgZy5zZWxlY3QoJy5kb21haW4nKVxyXG4vLyAgICAgICAgICAgICAucmVtb3ZlKClcclxuLy8gICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCAndmFyKC0tY2hhcnQtZG9tYWluLWNvbG9yLCAjMDAwMDAwKScpOyAvLyBBZGQgQ1NTIHZhcmlhYmxlIGZvciBkb21haW5cclxuLy8gICAgICAgICB9KTtcclxuLy8gICAgIH0gZWxzZSB7XHJcbi8vICAgICAgIHN2Z1xyXG4vLyAgICAgICAgIC5hcHBlbmQoJ2cnKVxyXG4vLyAgICAgICAgIC5jYWxsKGQzLmF4aXNMZWZ0KHkpLnRpY2tzKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLm51bWJlck9mWVRpY2tzKSlcclxuLy8gICAgICAgICAuc3R5bGUoJ2NvbG9yJywgJ3ZhcigtLWNoYXJ0LWF4aXMtY29sb3IsICNCOUI5QjkpJylcclxuLy8gICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAnMC41JylcclxuLy8gICAgICAgICAuY2FsbCgoZykgPT4ge1xyXG4vLyAgICAgICAgICAgZy5zZWxlY3QoJy5kb21haW4nKVxyXG4vLyAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsICd2YXIoLS1jaGFydC1kb21haW4tY29sb3IsICMwMDAwMDApJykgLy8gQWRkIENTUyB2YXJpYWJsZSBmb3IgZG9tYWluXHJcbi8vICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgJzFweCcpOyAvLyBFbnN1cmUgdmlzaWJpbGl0eVxyXG4vLyAgICAgICAgIH0pO1xyXG4vLyAgICAgfVxyXG5cclxuLy8gICAgIHZhciB4U3ViZ3JvdXAgPSBkMy5zY2FsZUJhbmQoKS5kb21haW4oc3ViZ3JvdXBzKTtcclxuLy8gICAgIGlmIChzdWJncm91cHMubGVuZ3RoID4gMSAmJiAhdGhpcy5pc1pvb21lZE91dCkge1xyXG4vLyAgIC8vIEZvciBncm91cGVkIGJhciBjaGFydHMgaW4gem9vbS1pbiB2aWV3LCB1c2UgZnVsbCB4LmJhbmR3aWR0aCgpIGZvciBzdWJncm91cHNcclxuLy8gICB4U3ViZ3JvdXAucmFuZ2UoWzAsIHguYmFuZHdpZHRoKCldKTtcclxuLy8gICAgIH0gZWxzZSBpZiAoc3ViZ3JvdXBzLmxlbmd0aCA9PT0gMSAmJiAhdGhpcy5pc1pvb21lZE91dCkge1xyXG4vLyAgICAgICAvLyBGb3Igc2luZ2xlLWJhciAobm9uLWdyb3VwZWQpIGNoYXJ0cyBpbiB6b29tLWluIHZpZXcsIHNldCBiYXIgd2lkdGggdG8gMTAwIChpbmNyZWFzZWQgZnJvbSA4MClcclxuLy8gICAgICAgeFN1Ymdyb3VwLnJhbmdlKFswLCAxMDBdKTtcclxuLy8gICAgIH0gZWxzZSBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNNdWx0aUNoYXJ0R3JpZExpbmUgPT0gdW5kZWZpbmVkKSB7XHJcbi8vICAgICAgIHhTdWJncm91cC5yYW5nZShbMCwgeC5iYW5kd2lkdGgoKV0pO1xyXG4vLyAgICAgfSBlbHNlIHtcclxuLy8gICAgICAgLy8gdXNlZCB0byBtYWtlIGdyb3VwZWQgYmFycyB3aXRoIGxlc3NlciB3aWR0aCBhcyB3ZSBhcmUgbm90IHVzaW5nIHBhZGRpbmcgZm9yIHdpZHRoXHJcbi8vICAgICAgIHhTdWJncm91cC5yYW5nZShbMCwgeC5iYW5kd2lkdGgoKV0pO1xyXG4vLyAgICAgfVxyXG4vLyAgICAgLy8gaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzRHJpbGxkb3duQ2hhcnQpIHtcclxuXHJcbi8vICAgICAvLyB9XHJcbi8vICAgICB2YXIgY29sb3IgPSBkM1xyXG4vLyAgICAgICAuc2NhbGVPcmRpbmFsKClcclxuLy8gICAgICAgLmRvbWFpbihzdWJncm91cHMpXHJcbi8vICAgICAgIC5yYW5nZShPYmplY3QudmFsdWVzKG1ldGFEYXRhLmNvbG9ycykpO1xyXG4vLyAgICAgLy8gdmFyIGNvbG9yQWJvdmVUYXJnZXQgPSBkM1xyXG4vLyAgICAgLy8gICAuc2NhbGVPcmRpbmFsKClcclxuLy8gICAgIC8vICAgLmRvbWFpbihzdWJncm91cHMpXHJcbi8vICAgICAvLyAgIC5yYW5nZShPYmplY3QudmFsdWVzKG1ldGFEYXRhLmNvbG9yQWJvdmVUYXJnZXQpKTtcclxuLy8gICAgIHZhciBzdGF0ZSA9IHN2Z1xyXG4vLyAgICAgICAuYXBwZW5kKCdnJylcclxuLy8gICAgICAgLnNlbGVjdEFsbCgnLnN0YXRlJylcclxuLy8gICAgICAgLmRhdGEoZGF0YSlcclxuLy8gICAgICAgLmVudGVyKClcclxuLy8gICAgICAgLmFwcGVuZCgnZycpXHJcbi8vICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbiAoZCkge1xyXG4vLyAgICAgICAgIHJldHVybiAndHJhbnNsYXRlKCcgKyB4KGQubmFtZSkgKyAnLDApJztcclxuLy8gICAgICAgfSk7XHJcbi8vICAgICBzdGF0ZVxyXG4vLyAgICAgICAuc2VsZWN0QWxsKCdyZWN0JylcclxuLy8gICAgICAgLmRhdGEoZnVuY3Rpb24gKGQpIHtcclxuLy8gICAgICAgICBsZXQgbmV3TGlzdDogYW55ID0gW107XHJcbi8vICAgICAgICAgc3ViZ3JvdXBzLm1hcChmdW5jdGlvbiAoa2V5KSB7XHJcbi8vICAgICAgICAgICAvLyBpZiAoa2V5ICE9PSBcImdyb3VwXCIpIHtcclxuLy8gICAgICAgICAgIGxldCBvYmo6IGFueSA9IHsga2V5OiBrZXksIHZhbHVlOiBkW2tleV0sIG5hbWU6IGQubmFtZSB9O1xyXG4vLyAgICAgICAgICAgbmV3TGlzdC5wdXNoKG9iaik7XHJcbi8vICAgICAgICAgICAvLyB9XHJcbi8vICAgICAgICAgfSk7XHJcbi8vICAgICAgICAgcmV0dXJuIG5ld0xpc3Q7XHJcbi8vICAgICAgIH0pXHJcbi8vICAgICAgIC5lbnRlcigpXHJcbi8vICAgICAgIC5hcHBlbmQoJ3JlY3QnKVxyXG4vLyAgICAgICAuYXR0cignY2xhc3MnLCAnYmFycycpXHJcbi8vICAgICAgIC5vbignY2xpY2snLCBmdW5jdGlvbiAoZCkge1xyXG4vLyAgICAgICAgIGlmIChkLmtleSAhPSAnVGFyZ2V0Jykge1xyXG4vLyAgICAgICAgICAgaWYgKFxyXG4vLyAgICAgICAgICAgICAhbWV0YURhdGEuYmFyV2l0aG91dENsaWNrIHx8XHJcbi8vICAgICAgICAgICAgICFtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2subGVuZ3RoIHx8XHJcbi8vICAgICAgICAgICAgICghbWV0YURhdGEuYmFyV2l0aG91dENsaWNrLmluY2x1ZGVzKGQ/Lm5hbWUpICYmXHJcbi8vICAgICAgICAgICAgICAgIW1ldGFEYXRhLmJhcldpdGhvdXRDbGljay5pbmNsdWRlcyhkPy5rZXkpKVxyXG4vLyAgICAgICAgICAgKVxyXG4vLyAgICAgICAgICAgICAvLyBzZWxmLmhhbmRsZUNsaWNrKGQuZGF0YS5uYW1lKTtcclxuLy8gICAgICAgICAgICAgc2VsZi5oYW5kbGVDbGljayhkKTtcclxuLy8gICAgICAgICB9XHJcbi8vICAgICAgIH0pXHJcbi8vICAgICAgIC5hdHRyKCd4JywgZnVuY3Rpb24gKGQpIHtcclxuLy8gICAgICAgICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCkge1xyXG4vLyAgICAgICAgICAgZGF0YS5tYXAoKGluZGl2OiBhbnkpID0+IHtcclxuLy8gICAgICAgICAgICAgaWYgKGluZGl2Lm5hbWUgPT0gZC5uYW1lKSB7XHJcbi8vICAgICAgICAgICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhpbmRpdikuZmlsdGVyKCh0ZW1wLCBpKSA9PiBpICE9IDApO1xyXG4vLyAgICAgICAgICAgICAgIHRlbXBTY2FsZSA9IGQzLnNjYWxlQmFuZCgpLmRvbWFpbihrZXlzKS5yYW5nZShbMCwgeC5iYW5kd2lkdGgoKV0pO1xyXG4vLyAgICAgICAgICAgICAgIGlmICh4LmJhbmR3aWR0aCgpID4gMTAwKSB7XHJcbi8vICAgICAgICAgICAgICAgICAvLyBJbmNyZWFzZSBiYXIgd2lkdGggYSBiaXQgaW4gem9vbS1pbiB2aWV3XHJcbi8vICAgICAgICAgICAgICAgICBsZXQgcmVkdWNlZEJhcldpZHRoID0gNjA7XHJcbi8vICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuaXNab29tZWRPdXQpIHtcclxuLy8gICAgICAgICAgICAgICAgICAgcmVkdWNlZEJhcldpZHRoID0gMzA7XHJcbi8vICAgICAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jaGFydERhdGEuZGF0YS5sZW5ndGggPT0gMSkge1xyXG4vLyAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoc2VsZi5jaGFydERhdGEuZGF0YVswXSkubGVuZ3RoID09IDIpIHtcclxuLy8gICAgICAgICAgICAgICAgICAgICB0ZW1wU2NhbGUucmFuZ2UoW1xyXG4vLyAgICAgICAgICAgICAgICAgICAgICAgMCArICh4LmJhbmR3aWR0aCgpIC0gcmVkdWNlZEJhcldpZHRoKSAvIDIsXHJcbi8vICAgICAgICAgICAgICAgICAgICAgICB4LmJhbmR3aWR0aCgpIC0gKHguYmFuZHdpZHRoKCkgLSByZWR1Y2VkQmFyV2lkdGgpIC8gMixcclxuLy8gICAgICAgICAgICAgICAgICAgICBdKTtcclxuLy8gICAgICAgICAgICAgICAgICAgfSBlbHNlXHJcbi8vICAgICAgICAgICAgICAgICAgICAgdGVtcFNjYWxlLnJhbmdlKFtcclxuLy8gICAgICAgICAgICAgICAgICAgICAgIDAgKyAoeC5iYW5kd2lkdGgoKSAtIHJlZHVjZWRCYXJXaWR0aCkgLyAyLFxyXG4vLyAgICAgICAgICAgICAgICAgICAgICAgeC5iYW5kd2lkdGgoKSAtICh4LmJhbmR3aWR0aCgpIC0gcmVkdWNlZEJhcldpZHRoKSAvIDIsXHJcbi8vICAgICAgICAgICAgICAgICAgICAgXSk7XHJcbi8vICAgICAgICAgICAgICAgICB9IGVsc2VcclxuLy8gICAgICAgICAgICAgICAgICAgdGVtcFNjYWxlLnJhbmdlKFtcclxuLy8gICAgICAgICAgICAgICAgICAgICAwICsgKHguYmFuZHdpZHRoKCkgLSByZWR1Y2VkQmFyV2lkdGgpIC8gMixcclxuLy8gICAgICAgICAgICAgICAgICAgICB4LmJhbmR3aWR0aCgpIC0gKHguYmFuZHdpZHRoKCkgLSByZWR1Y2VkQmFyV2lkdGgpIC8gMixcclxuLy8gICAgICAgICAgICAgICAgICAgXSk7XHJcbi8vICAgICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICB9KTtcclxuLy8gICAgICAgICAgIHJldHVybiB0ZW1wU2NhbGUoZC5rZXkpO1xyXG4vLyAgICAgICAgIH1cclxuLy8gICAgICAgICByZXR1cm4geFN1Ymdyb3VwKGQua2V5KTtcclxuLy8gICAgICAgfSlcclxuLy8gICAgICAgLmF0dHIoJ3knLCBmdW5jdGlvbiAoZCkge1xyXG4vLyAgICAgICAgIGlmIChkLnZhbHVlID09IC0xKSB7XHJcbi8vICAgICAgICAgICByZXR1cm4geSgwKTtcclxuLy8gICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgIGlmIChkLnZhbHVlID49IDApIHtcclxuLy8gICAgICAgICAgIGNvbnN0IGJhckhlaWdodCA9IGhlaWdodCAtIHkoZC52YWx1ZSk7XHJcbi8vICAgICAgICAgICBjb25zdCBtaW5IZWlnaHQgPSBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5kZWZhdWx0QmFySGVpZ2h0IHx8IDI7XHJcbi8vICAgICAgICAgICByZXR1cm4gYmFySGVpZ2h0IDwgbWluSGVpZ2h0ID8geSgwKSAtIG1pbkhlaWdodCA6IHkoZC52YWx1ZSk7XHJcbi8vICAgICAgICAgfVxyXG5cclxuLy8gICAgICAgICByZXR1cm4geSgwKTtcclxuLy8gICAgICAgfSlcclxuLy8gICAgICAgLmF0dHIoJ3dpZHRoJywgZnVuY3Rpb24gKGQpIHtcclxuLy8gICAgICAgICAvLyBGb3IgZ3JvdXBlZCBiYXIgY2hhcnRzIGluIHpvb20taW4gdmlldywgc2V0IGJhciB3aWR0aCB0byA1MCBmb3IgbWF4aW11bSB0aGlja25lc3NcclxuLy8gICAgICAgICBpZiAoc3ViZ3JvdXBzLmxlbmd0aCA+IDEgJiYgIXNlbGYuaXNab29tZWRPdXQpIHtcclxuLy8gICAgICAgICAgIHJldHVybiA1MDtcclxuLy8gICAgICAgICB9XHJcbi8vICAgICAgICAgLy8gRm9yIHNpbmdsZS1iYXIgKG5vbi1ncm91cGVkKSBjaGFydHMgaW4gem9vbS1pbiB2aWV3LCBzZXQgYmFyIHdpZHRoIHRvIDgwXHJcbi8vICAgICAgICAgaWYgKHN1Ymdyb3Vwcy5sZW5ndGggPT09IDEgJiYgIXNlbGYuaXNab29tZWRPdXQpIHtcclxuLy8gICAgICAgICAgIHJldHVybiA4MDtcclxuLy8gICAgICAgICB9XHJcbi8vICAgICAgICAgICBsZXQgdGVtcFNjYWxlID0gZDMuc2NhbGVCYW5kKCkuZG9tYWluKFtdKS5yYW5nZShbMCwgMF0pO1xyXG4vLyAgICAgICAgIC8vIERlZmF1bHQgbG9naWMgZm9yIG90aGVyIGNoYXJ0IHR5cGVzXHJcbi8vICAgICAgICAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmlzRHJpbGxkb3duQ2hhcnQpIHtcclxuLy8gICAgICAgICAgIGRhdGEubWFwKChpbmRpdjogYW55KSA9PiB7XHJcbi8vICAgICAgICAgICAgIGlmIChpbmRpdi5uYW1lID09IGQubmFtZSkge1xyXG4vLyAgICAgICAgICAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMoaW5kaXYpLmZpbHRlcigodGVtcCwgaSkgPT4gaSAhPSAwKTtcclxuLy8gICAgICAgICAgICAgICB0ZW1wU2NhbGUgPSBkMy5zY2FsZUJhbmQoKS5kb21haW4oa2V5cykucmFuZ2UoWzAsIHguYmFuZHdpZHRoKCldKTtcclxuLy8gICAgICAgICAgICAgICBpZiAoeC5iYW5kd2lkdGgoKSA+IDEwMCkge1xyXG4vLyAgICAgICAgICAgICAgICAgLy8gSW5jcmVhc2UgYmFyIHdpZHRoIGEgYml0IGluIHpvb20taW4gdmlld1xyXG4vLyAgICAgICAgICAgICAgICAgbGV0IHJlZHVjZWRCYXJXaWR0aCA9IDYwO1xyXG4vLyAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLmlzWm9vbWVkT3V0KSB7XHJcbi8vICAgICAgICAgICAgICAgICAgIHJlZHVjZWRCYXJXaWR0aCA9IDEwMDtcclxuLy8gICAgICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgICAgICAgIGlmIChzZWxmLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aCA9PSAxKSB7XHJcbi8vICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhzZWxmLmNoYXJ0RGF0YS5kYXRhWzBdKS5sZW5ndGggPT0gMikge1xyXG4vLyAgICAgICAgICAgICAgICAgICAgIHRlbXBTY2FsZS5yYW5nZShbXHJcbi8vICAgICAgICAgICAgICAgICAgICAgICAwICsgKHguYmFuZHdpZHRoKCkgLSByZWR1Y2VkQmFyV2lkdGgpIC8gMixcclxuLy8gICAgICAgICAgICAgICAgICAgICAgIHguYmFuZHdpZHRoKCkgLSAoeC5iYW5kd2lkdGgoKSAtIHJlZHVjZWRCYXJXaWR0aCkgLyAyLFxyXG4vLyAgICAgICAgICAgICAgICAgICAgIF0pO1xyXG4vLyAgICAgICAgICAgICAgICAgICB9IGVsc2VcclxuLy8gICAgICAgICAgICAgICAgICAgICB0ZW1wU2NhbGUucmFuZ2UoW1xyXG4vLyAgICAgICAgICAgICAgICAgICAgICAgMCArICh4LmJhbmR3aWR0aCgpIC0gcmVkdWNlZEJhcldpZHRoKSAvIDIsXHJcbi8vICAgICAgICAgICAgICAgICAgICAgICB4LmJhbmR3aWR0aCgpIC0gKHguYmFuZHdpZHRoKCkgLSByZWR1Y2VkQmFyV2lkdGgpIC8gMixcclxuLy8gICAgICAgICAgICAgICAgICAgICBdKTtcclxuLy8gICAgICAgICAgICAgICAgIH0gZWxzZVxyXG4vLyAgICAgICAgICAgICAgICAgICB0ZW1wU2NhbGUucmFuZ2UoW1xyXG4vLyAgICAgICAgICAgICAgICAgICAgIDAgKyAoeC5iYW5kd2lkdGgoKSAtIHJlZHVjZWRCYXJXaWR0aCkgLyAyLFxyXG4vLyAgICAgICAgICAgICAgICAgICAgIHguYmFuZHdpZHRoKCkgLSAoeC5iYW5kd2lkdGgoKSAtIHJlZHVjZWRCYXJXaWR0aCkgLyAyLFxyXG4vLyAgICAgICAgICAgICAgICAgICBdKTtcclxuLy8gICAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgIH0pO1xyXG4vLyAgICAgICAgICAgcmV0dXJuIHNlbGYuaXNab29tZWRPdXRcclxuLy8gICAgICAgICAgICAgPyB0ZW1wU2NhbGUuYmFuZHdpZHRoKClcclxuLy8gICAgICAgICAgICAgOiBzZWxmLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aCAmJiBzZWxmLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aCA+IDhcclxuLy8gICAgICAgICAgICAgPyB0ZW1wU2NhbGUuYmFuZHdpZHRoKCkgXHJcbi8vICAgICAgICAgICAgIDogdGVtcFNjYWxlLmJhbmR3aWR0aCgpO1xyXG4vLyAgICAgICAgIH1cclxuLy8gICAgICAgICByZXR1cm4gc2VsZi5pc1pvb21lZE91dFxyXG4vLyAgICAgICAgICAgPyB0ZW1wU2NhbGUuYmFuZHdpZHRoKClcclxuLy8gICAgICAgICAgIDogc2VsZi5jaGFydERhdGEuZGF0YS5sZW5ndGggJiYgc2VsZi5jaGFydERhdGEuZGF0YS5sZW5ndGggPiA4XHJcbi8vICAgICAgICAgICA/IHRlbXBTY2FsZS5iYW5kd2lkdGgoKVxyXG4vLyAgICAgICAgICAgOiB0ZW1wU2NhbGUuYmFuZHdpZHRoKCk7XHJcbi8vICAgICAgIH0pXHJcbi8vICAgICAgIC5hdHRyKCdoZWlnaHQnLCBmdW5jdGlvbiAoZCkge1xyXG4vLyAgICAgICAgIGlmIChkLnZhbHVlID09IC0xKSB7XHJcbi8vICAgICAgICAgICByZXR1cm4gaGVpZ2h0IC0geSgwKTtcclxuLy8gICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgIGlmIChkLnZhbHVlID49IDApIHtcclxuLy8gICAgICAgICAgIGNvbnN0IGJhckhlaWdodCA9IGhlaWdodCAtIHkoZC52YWx1ZSk7XHJcbi8vICAgICAgICAgICBjb25zdCBtaW5IZWlnaHQgPSBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5kZWZhdWx0QmFySGVpZ2h0IHx8IDI7XHJcbi8vICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgoYmFySGVpZ2h0LCBtaW5IZWlnaHQpO1xyXG4vLyAgICAgICAgIH1cclxuXHJcbi8vICAgICAgICAgcmV0dXJuIGhlaWdodCAtIHkoMCk7XHJcbi8vICAgICAgIH0pXHJcbi8vICAgICAgIC5zdHlsZSgnY3Vyc29yJywgZnVuY3Rpb24gKGQpIHtcclxuLy8gICAgICAgICBpZiAobWV0YURhdGEuaGFzRHJpbGxEb3duICYmICFpc3JpYSkgcmV0dXJuICdwb2ludGVyJztcclxuLy8gICAgICAgICAgIGVsc2UgcmV0dXJuICdkZWZhdWx0JztcclxuLy8gICAgICAgfSlcclxuLy8gICAgICAgLmF0dHIoJ2ZpbGwnLCBmdW5jdGlvbiAoZCkge1xyXG4vLyAgICAgICAgIGlmIChcclxuLy8gICAgICAgICAgIGQudmFsdWUgJiZcclxuLy8gICAgICAgICAgIHNlbGYuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhICYmXHJcbi8vICAgICAgICAgICBkLnZhbHVlID49IHBhcnNlRmxvYXQoc2VsZi5jaGFydERhdGEudGFyZ2V0TGluZURhdGEudGFyZ2V0KSAmJlxyXG4vLyAgICAgICAgICAgc2VsZi5jaGFydERhdGEubWV0YURhdGEuY29sb3JBYm92ZVRhcmdldFxyXG4vLyAgICAgICAgICkge1xyXG4vLyAgICAgICAgICAgY29uc3Qga2V5ID0gZC5rZXkudG9Mb3dlckNhc2UoKTtcclxuLy8gICAgICAgICAgIGNvbnN0IGNvbG9yQWJvdmVUYXJnZXQgPSBPYmplY3Qua2V5cyhzZWxmLmNoYXJ0RGF0YS5tZXRhRGF0YS5jb2xvckFib3ZlVGFyZ2V0KS5maW5kKFxyXG4vLyAgICAgICAgICAgICBrID0+IGsudG9Mb3dlckNhc2UoKSA9PT0ga2V5XHJcbi8vICAgICAgICAgICApO1xyXG4vLyAgICAgICAgICAgaWYgKGNvbG9yQWJvdmVUYXJnZXQpIHtcclxuLy8gICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2hhcnREYXRhLm1ldGFEYXRhLmNvbG9yQWJvdmVUYXJnZXRbY29sb3JBYm92ZVRhcmdldF07XHJcbi8vICAgICAgICAgICB9XHJcbi8vICAgICAgICAgfVxyXG4vLyAgICAgICAgIHJldHVybiBzZWxmLmNoYXJ0RGF0YS5tZXRhRGF0YS5jb2xvcnNbZC5rZXldO1xyXG4vLyAgICAgICB9KTtcclxuXHJcbi8vICAgICAvKipcclxuLy8gICAgICAqIGRpc3BsYXkgYW5nbGVkIHRleHRzIG9uIHRoZSBiYXJzXHJcbi8vICAgICAgKi9cclxuLy8gICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi50ZXh0c09uQmFyICE9IHVuZGVmaW5lZCAmJiAhdGhpcy5pc1pvb21lZE91dCkge1xyXG4vLyAgICAgICBzdGF0ZVxyXG4vLyAgICAgICAgIC5zZWxlY3RBbGwoJ3RleHQnKVxyXG4vLyAgICAgICAgIC5kYXRhKGZ1bmN0aW9uIChkKSB7XHJcbi8vICAgICAgICAgICBsZXQgbmV3TGlzdDogYW55ID0gW107XHJcbi8vICAgICAgICAgICBzdWJncm91cHMubWFwKGZ1bmN0aW9uIChrZXkpIHtcclxuLy8gICAgICAgICAgICAgbGV0IG9iajogYW55ID0geyBrZXk6IGtleSwgdmFsdWU6IGRba2V5XSwgbmFtZTogZC5uYW1lIH07XHJcbi8vICAgICAgICAgICAgIG5ld0xpc3QucHVzaChvYmopO1xyXG4vLyAgICAgICAgICAgfSk7XHJcbi8vICAgICAgICAgICByZXR1cm4gbmV3TGlzdDtcclxuLy8gICAgICAgICB9KVxyXG4vLyAgICAgICAgIC5lbnRlcigpXHJcbi8vICAgICAgICAgLmFwcGVuZCgndGV4dCcpXHJcbi8vICAgICAgICAgLmF0dHIoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKVxyXG4vLyAgICAgICAgIC5hdHRyKCd4JywgZnVuY3Rpb24gKGQpIHtcclxuLy8gICAgICAgICAgIHJldHVybiAwO1xyXG4vLyAgICAgICAgIH0pXHJcbi8vICAgICAgICAgLmF0dHIoJ3knLCBmdW5jdGlvbiAoZCkge1xyXG4vLyAgICAgICAgICAgcmV0dXJuIDA7XHJcbi8vICAgICAgICAgfSlcclxuLy8gICAgICAgICAuYXR0cignY2xhc3MnLCAnbGliLWRhdGEtbGFiZWxzLXdlZWtseWNoYXJ0cycpXHJcbi8vICAgICAgICAgLnRleHQoZnVuY3Rpb24gKGQpIHtcclxuLy8gICAgICAgICAgIHJldHVybiBkLmtleSAmJiBkLnZhbHVlXHJcbi8vICAgICAgICAgICAgID8gZC5rZXkubGVuZ3RoID4gMjBcclxuLy8gICAgICAgICAgICAgICA/IGQua2V5LnN1YnN0cmluZygwLCAxNykgKyAnLi4uJ1xyXG4vLyAgICAgICAgICAgICAgIDogZC5rZXlcclxuLy8gICAgICAgICAgICAgOiAnJztcclxuLy8gICAgICAgICB9KVxyXG4vLyAgICAgICAgIC5zdHlsZSgnZmlsbCcsIGZ1bmN0aW9uIChkKSB7XHJcbi8vICAgICAgICAgICByZXR1cm4gJyMwMDAnO1xyXG4vLyAgICAgICAgIH0pXHJcbi8vICAgICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsICdib2xkJylcclxuLy8gICAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIGZ1bmN0aW9uIChkKSB7XHJcbi8vICAgICAgICAgICBpZiAoc2VsZi5pc1pvb21lZE91dCkge1xyXG4vLyAgICAgICAgICAgICByZXR1cm4gJzlweCc7IC8vIPCfkYggWm9vbWVkIG91dCBtb2RlXHJcbi8vICAgICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgICAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmlzRHJpbGxkb3duQ2hhcnQpIHtcclxuLy8gICAgICAgICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoID4gMTkwMCkge1xyXG4vLyAgICAgICAgICAgICAgIHJldHVybiAnMThweCc7XHJcbi8vICAgICAgICAgICAgIH0gZWxzZSBpZiAod2luZG93LmlubmVyV2lkdGggPCAxNDAwKSB7XHJcbi8vICAgICAgICAgICAgICAgcmV0dXJuICcxMHB4JztcclxuLy8gICAgICAgICAgICAgfSBlbHNlIHtcclxuLy8gICAgICAgICAgICAgICByZXR1cm4gJzE0cHgnO1xyXG4vLyAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICB9IGVsc2Uge1xyXG4vLyAgICAgICAgICAgICByZXR1cm4gJzE0cHgnO1xyXG4vLyAgICAgICAgICAgfVxyXG4vLyAgICAgICAgIH0pXHJcbi8vICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uIChkKSB7XHJcbi8vICAgICAgICAgICBkYXRhLm1hcCgoaW5kaXY6IGFueSkgPT4ge1xyXG4vLyAgICAgICAgICAgICBpZiAoaW5kaXYubmFtZSA9PSBkLm5hbWUpIHtcclxuLy8gICAgICAgICAgICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKGluZGl2KS5maWx0ZXIoKHRlbXAsIGkpID0+IGkgIT0gMCk7XHJcbi8vICAgICAgICAgICAgICAgdmFyIHRlbXA7XHJcbi8vICAgICAgICAgICAgICAgdGVtcFNjYWxlID0gZDMuc2NhbGVCYW5kKCkuZG9tYWluKGtleXMpLnJhbmdlKFswLCB4LmJhbmR3aWR0aCgpXSk7XHJcbi8vICAgICAgICAgICAgICAgaWYgKHguYmFuZHdpZHRoKCkgPiAxMDApIHtcclxuLy8gICAgICAgICAgICAgICAgIGlmIChzZWxmLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aCA9PSAxKSB7XHJcbi8vICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhzZWxmLmNoYXJ0RGF0YS5kYXRhWzBdKS5sZW5ndGggPT0gMikge1xyXG4vLyAgICAgICAgICAgICAgICAgICAgIHRlbXBTY2FsZS5yYW5nZShbXHJcbi8vICAgICAgICAgICAgICAgICAgICAgICAwICsgKHguYmFuZHdpZHRoKCkgLSAyMDApIC8gMixcclxuLy8gICAgICAgICAgICAgICAgICAgICAgIHguYmFuZHdpZHRoKCkgLSAoeC5iYW5kd2lkdGgoKSAtIDIwMCkgLyAyLFxyXG4vLyAgICAgICAgICAgICAgICAgICAgIF0pO1xyXG4vLyAgICAgICAgICAgICAgICAgICAgIC8vIC5wYWRkaW5nKDAuMDUpO1xyXG4vLyAgICAgICAgICAgICAgICAgICB9IGVsc2VcclxuLy8gICAgICAgICAgICAgICAgICAgICB0ZW1wU2NhbGUucmFuZ2UoW1xyXG4vLyAgICAgICAgICAgICAgICAgICAgICAgMCArICh4LmJhbmR3aWR0aCgpIC0gMzAwKSAvIDIsXHJcbi8vICAgICAgICAgICAgICAgICAgICAgICB4LmJhbmR3aWR0aCgpIC0gKHguYmFuZHdpZHRoKCkgLSAzMDApIC8gMixcclxuLy8gICAgICAgICAgICAgICAgICAgICBdKTtcclxuLy8gICAgICAgICAgICAgICAgICAgLy8gLnBhZGRpbmcoMC4wNSk7XHJcbi8vICAgICAgICAgICAgICAgICB9IGVsc2VcclxuLy8gICAgICAgICAgICAgICAgICAgdGVtcFNjYWxlLnJhbmdlKFtcclxuLy8gICAgICAgICAgICAgICAgICAgICAwICsgKHguYmFuZHdpZHRoKCkgLSAxMjUpIC8gMixcclxuLy8gICAgICAgICAgICAgICAgICAgICB4LmJhbmR3aWR0aCgpIC0gKHguYmFuZHdpZHRoKCkgLSAxMjUpIC8gMixcclxuLy8gICAgICAgICAgICAgICAgICAgXSk7XHJcbi8vICAgICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICB9KTtcclxuLy8gICAgICAgICAgIC8qKlxyXG4vLyAgICAgICAgICAgICogaWYgc2V0LCB0aGVuIGFsbCB0ZXh0cyBsbCBiZSBob3Jpem9udGFsXHJcbi8vICAgICAgICAgICAgKi9cclxuLy8gICAgICAgICAgIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi50ZXh0QWx3YXlzSG9yaXpvbnRhbCkge1xyXG4vLyAgICAgICAgICAgICByZXR1cm4gKFxyXG4vLyAgICAgICAgICAgICAgICd0cmFuc2xhdGUoJyArIHhTdWJncm91cChkLmtleSkgKyAnLCcgKyAoeShkLnZhbHVlKSAtIDMpICsgJyknXHJcbi8vICAgICAgICAgICAgICk7XHJcbi8vICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAvKipcclxuLy8gICAgICAgICAgICAqIHJvdGF0ZSB0ZXh0cyBoYXZpbmcgbW9yZSB0aGFuIG9uZSBkaWdpdHNcclxuLy8gICAgICAgICAgICAqL1xyXG4vLyAgICAgICAgICAgLy8gaWYgKGQudmFsdWUgPiA5KVxyXG4vLyAgICAgICAgICAgaWYgKCFpc05hTih0ZW1wU2NhbGUoZC5rZXkpKSlcclxuLy8gICAgICAgICAgICAgcmV0dXJuIChcclxuLy8gICAgICAgICAgICAgICAndHJhbnNsYXRlKCcgK1xyXG4vLyAgICAgICAgICAgICAgICh0ZW1wU2NhbGUoZC5rZXkpICsgdGVtcFNjYWxlLmJhbmR3aWR0aCgpICogMC41NSkgK1xyXG4vLyAgICAgICAgICAgICAgICcsJyArXHJcbi8vICAgICAgICAgICAgICAgKHkoMCkgLSAxMCkgK1xyXG4vLyAgICAgICAgICAgICAgICcpIHJvdGF0ZSgyNzApJ1xyXG4vLyAgICAgICAgICAgICApO1xyXG4vLyAgICAgICAgICAgcmV0dXJuICd0cmFuc2xhdGUoMCwwKSc7XHJcbi8vICAgICAgICAgICAvLyBlbHNlXHJcbi8vICAgICAgICAgICAvLyAgIHJldHVybiAoXHJcbi8vICAgICAgICAgICAvLyAgICAgJ3RyYW5zbGF0ZSgnICtcclxuLy8gICAgICAgICAgIC8vICAgICAodGVtcFNjYWxlKGQua2V5KSArIHRlbXBTY2FsZS5iYW5kd2lkdGgoKSAvIDIpICtcclxuLy8gICAgICAgICAgIC8vICAgICAnLCcgK1xyXG4vLyAgICAgICAgICAgLy8gICAgIHkoMCkgK1xyXG4vLyAgICAgICAgICAgLy8gICAgICcpJ1xyXG4vLyAgICAgICAgICAgLy8gICApO1xyXG4vLyAgICAgICAgIH0pXHJcbi8vICAgICAgICAgLm9uKCdjbGljaycsIGZ1bmN0aW9uIChkKSB7XHJcbi8vICAgICAgICAgICBpZiAoXHJcbi8vICAgICAgICAgICAgICFtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2sgfHxcclxuLy8gICAgICAgICAgICAgIW1ldGFEYXRhLmJhcldpdGhvdXRDbGljay5sZW5ndGggfHxcclxuLy8gICAgICAgICAgICAgKCFtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2suaW5jbHVkZXMoZD8ubmFtZSkgJiZcclxuLy8gICAgICAgICAgICAgICAhbWV0YURhdGEuYmFyV2l0aG91dENsaWNrLmluY2x1ZGVzKGQ/LmtleSkpXHJcbi8vICAgICAgICAgICApXHJcbi8vICAgICAgICAgICAgIHNlbGYuaGFuZGxlQ2xpY2soZCk7XHJcbi8vICAgICAgICAgfSk7XHJcbi8vICAgICAgICAgICAgIGlmICghaXNyaWEpIHtcclxuLy8gICAgICAgICAgICAgICAgICAgICBzdGF0ZVxyXG4vLyAgICAgICAgIC5zZWxlY3RBbGwoJy5saWItZGF0YS1sYWJlbHMtd2Vla2x5Y2hhcnRzJylcclxuLy8gICAgICAgICAub24oJ21vdXNlb3V0JywgaGFuZGxlTW91c2VPdXQpXHJcbi8vICAgICAgICAgLm9uKCdtb3VzZW92ZXInLCBoYW5kbGVNb3VzZU92ZXIpO1xyXG4vLyAgICAgICAgICAgICB9XHJcbi8vICAgICB9XHJcbi8vICAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uZGlzcGxheVRpdGxlT25Ub3AgfHwgKFxyXG4vLyAgICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi50ZXh0c09uQmFyID09IHVuZGVmaW5lZCAmJlxyXG4vLyAgICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5kaXNwbGF5VGl0bGVPblRvcCA9PSB1bmRlZmluZWRcclxuLy8gICAgICkpIHtcclxuXHJcbi8vICAgICAgICAgICAgICAgICAgIGlmICghaXNyaWEpIHtcclxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZVxyXG4vLyAgICAgICAgIC5zZWxlY3RBbGwoJ3JlY3QnKVxyXG4vLyAgICAgICAgIC5vbignbW91c2VvdXQnLCBoYW5kbGVNb3VzZU91dClcclxuLy8gICAgICAgICAub24oJ21vdXNlb3ZlcicsIGhhbmRsZU1vdXNlT3Zlcik7XHJcbi8vICAgICAgICAgICAgICAgICAgIH1cclxuLy8gICAgIH1cclxuLy8gICAgIGZ1bmN0aW9uIGhhbmRsZU1vdXNlT3ZlcihkLCBpKSB7XHJcbi8vICAgICAgIHN2Zy5zZWxlY3RBbGwoJy5saWItdmVydGljYWxzdGFjay10aXRsZS1vbnRvcCcpLnJlbW92ZSgpO1xyXG4vLyAgICAgICBzdmdcclxuLy8gICAgICAgICAuYXBwZW5kKCdmb3JlaWduT2JqZWN0JylcclxuLy8gICAgICAgICAuYXR0cigneCcsIGZ1bmN0aW9uICgpIHtcclxuLy8gICAgICAgICAgIC8vIC4uLmV4aXN0aW5nIGNvZGUgZm9yIHRlbXBTY2FsZSBjYWxjdWxhdGlvbi4uLlxyXG4vLyAgICAgICAgICAgdmFyIGVsZW1lbnRzQ291bnRlcjtcclxuLy8gICAgICAgICAgIGRhdGEubWFwKChpbmRpdjogYW55KSA9PiB7XHJcbi8vICAgICAgICAgICAgIGlmIChpbmRpdi5uYW1lID09IGQubmFtZSkge1xyXG4vLyAgICAgICAgICAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMoaW5kaXYpLmZpbHRlcigodGVtcCwgaSkgPT4gaSAhPSAwKTtcclxuLy8gICAgICAgICAgICAgICBlbGVtZW50c0NvdW50ZXIgPSBrZXlzLmxlbmd0aDtcclxuLy8gICAgICAgICAgICAgICB0ZW1wU2NhbGUgPSBkMy5zY2FsZUJhbmQoKS5kb21haW4oa2V5cykucmFuZ2UoWzAsIHguYmFuZHdpZHRoKCldKTtcclxuLy8gICAgICAgICAgICAgICBpZiAoeC5iYW5kd2lkdGgoKSA+IDEwMCkge1xyXG4vLyAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY2hhcnREYXRhLmRhdGEubGVuZ3RoID09IDEpIHtcclxuLy8gICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHNlbGYuY2hhcnREYXRhLmRhdGFbMF0pLmxlbmd0aCA9PSAyKSB7XHJcbi8vICAgICAgICAgICAgICAgICAgICAgdGVtcFNjYWxlLnJhbmdlKFtcclxuLy8gICAgICAgICAgICAgICAgICAgICAgIDAgKyAoeC5iYW5kd2lkdGgoKSAtIDIwMCkgLyAyLFxyXG4vLyAgICAgICAgICAgICAgICAgICAgICAgeC5iYW5kd2lkdGgoKSAtICh4LmJhbmR3aWR0aCgpIC0gMjAwKSAvIDIsXHJcbi8vICAgICAgICAgICAgICAgICAgICAgXSk7XHJcbi8vICAgICAgICAgICAgICAgICAgIH0gZWxzZVxyXG4vLyAgICAgICAgICAgICAgICAgICAgIHRlbXBTY2FsZS5yYW5nZShbXHJcbi8vICAgICAgICAgICAgICAgICAgICAgICAwICsgKHguYmFuZHdpZHRoKCkgLSAzMDApIC8gMixcclxuLy8gICAgICAgICAgICAgICAgICAgICAgIHguYmFuZHdpZHRoKCkgLSAoeC5iYW5kd2lkdGgoKSAtIDMwMCkgLyAyLFxyXG4vLyAgICAgICAgICAgICAgICAgICAgIF0pO1xyXG4vLyAgICAgICAgICAgICAgICAgfSBlbHNlXHJcbi8vICAgICAgICAgICAgICAgICAgIHRlbXBTY2FsZS5yYW5nZShbXHJcbi8vICAgICAgICAgICAgICAgICAgICAgMCArICh4LmJhbmR3aWR0aCgpIC0gMTI1KSAvIDIsXHJcbi8vICAgICAgICAgICAgICAgICAgICAgeC5iYW5kd2lkdGgoKSAtICh4LmJhbmR3aWR0aCgpIC0gMTI1KSAvIDIsXHJcbi8vICAgICAgICAgICAgICAgICAgIF0pO1xyXG4vLyAgICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgfSk7XHJcbi8vICAgICAgICAgICBpZiAobWV0YURhdGEuaGFzRHJpbGxEb3duKSB7XHJcbi8vICAgICAgICAgICAgIGlmICh0ZW1wU2NhbGUuYmFuZHdpZHRoKCkgKyBsZWZ0QW5kUmlnaHRTcGFjZXMgKiAyID4gMTgwKSB7XHJcbi8vICAgICAgICAgICAgICAgcmV0dXJuIChcclxuLy8gICAgICAgICAgICAgICAgIHgoZC5uYW1lKSArIHRlbXBTY2FsZShkLmtleSkgKyB0ZW1wU2NhbGUuYmFuZHdpZHRoKCkgLyAyIC0gOTBcclxuLy8gICAgICAgICAgICAgICApO1xyXG4vLyAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAgIHJldHVybiAoXHJcbi8vICAgICAgICAgICAgICAgeChkLm5hbWUpICtcclxuLy8gICAgICAgICAgICAgICB0ZW1wU2NhbGUoZC5rZXkpIC1cclxuLy8gICAgICAgICAgICAgICAodGVtcFNjYWxlLmJhbmR3aWR0aCgpICsgbGVmdEFuZFJpZ2h0U3BhY2VzICogMikgLyAyICtcclxuLy8gICAgICAgICAgICAgICB0ZW1wU2NhbGUuYmFuZHdpZHRoKCkgLyAyXHJcbi8vICAgICAgICAgICAgICk7XHJcbi8vICAgICAgICAgICB9IGVsc2UgcmV0dXJuIHgoZC5uYW1lKSArIHRlbXBTY2FsZShkLmtleSkgLSAodGVtcFNjYWxlLmJhbmR3aWR0aCgpICsgbGVmdEFuZFJpZ2h0U3BhY2VzICogMikgLyAyICsgdGVtcFNjYWxlLmJhbmR3aWR0aCgpIC8gMjtcclxuLy8gICAgICAgICB9KVxyXG4vLyAgICAgICAgIC5hdHRyKCdjbGFzcycsICdsaWItdmVydGljYWxzdGFjay10aXRsZS1vbnRvcCcpXHJcbi8vICAgICAgICAgLmF0dHIoJ3knLCBmdW5jdGlvbiAoKSB7XHJcbi8vICAgICAgICAgICByZXR1cm4geShkLnZhbHVlKSAtIDMgLSA0MCAtIDEwO1xyXG4vLyAgICAgICAgIH0pXHJcbi8vICAgICAgICAgLmF0dHIoJ2R5JywgZnVuY3Rpb24gKCkge1xyXG4vLyAgICAgICAgICAgcmV0dXJuIGQuY2xhc3M7XHJcbi8vICAgICAgICAgfSlcclxuLy8gICAgICAgICAuYXR0cignd2lkdGgnLCBmdW5jdGlvbiAoKSB7XHJcbi8vICAgICAgICAgICBkYXRhLm1hcCgoaW5kaXY6IGFueSkgPT4ge1xyXG4vLyAgICAgICAgICAgICBpZiAoaW5kaXYubmFtZSA9PSBkLm5hbWUpIHtcclxuLy8gICAgICAgICAgICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKGluZGl2KS5maWx0ZXIoKHRlbXAsIGkpID0+IGkgIT0gMCk7XHJcbi8vICAgICAgICAgICAgICAgdGVtcFNjYWxlID0gZDMuc2NhbGVCYW5kKCkuZG9tYWluKGtleXMpLnJhbmdlKFswLCB4LmJhbmR3aWR0aCgpXSk7XHJcbi8vICAgICAgICAgICAgICAgaWYgKHguYmFuZHdpZHRoKCkgPiAxMDApIHtcclxuLy8gICAgICAgICAgICAgICAgIGlmIChzZWxmLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aCA9PSAxKSB7XHJcbi8vICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhzZWxmLmNoYXJ0RGF0YS5kYXRhWzBdKS5sZW5ndGggPT0gMikge1xyXG4vLyAgICAgICAgICAgICAgICAgICAgIHRlbXBTY2FsZS5yYW5nZShbXHJcbi8vICAgICAgICAgICAgICAgICAgICAgICAwICsgKHguYmFuZHdpZHRoKCkgLSAyMDApIC8gMixcclxuLy8gICAgICAgICAgICAgICAgICAgICAgIHguYmFuZHdpZHRoKCkgLSAoeC5iYW5kd2lkdGgoKSAtIDIwMCkgLyAyLFxyXG4vLyAgICAgICAgICAgICAgICAgICAgIF0pO1xyXG4vLyAgICAgICAgICAgICAgICAgICB9IGVsc2VcclxuLy8gICAgICAgICAgICAgICAgICAgICB0ZW1wU2NhbGUucmFuZ2UoW1xyXG4vLyAgICAgICAgICAgICAgICAgICAgICAgMCArICh4LmJhbmR3aWR0aCgpIC0gMzAwKSAvIDIsXHJcbi8vICAgICAgICAgICAgICAgICAgICAgICB4LmJhbmR3aWR0aCgpIC0gKHguYmFuZHdpZHRoKCkgLSAzMDApIC8gMixcclxuLy8gICAgICAgICAgICAgICAgICAgICBdKTtcclxuLy8gICAgICAgICAgICAgICAgIH0gZWxzZVxyXG4vLyAgICAgICAgICAgICAgICAgICB0ZW1wU2NhbGUucmFuZ2UoW1xyXG4vLyAgICAgICAgICAgICAgICAgICAgIDAgKyAoeC5iYW5kd2lkdGgoKSAtIDEyNSkgLyAyLFxyXG4vLyAgICAgICAgICAgICAgICAgICAgIHguYmFuZHdpZHRoKCkgLSAoeC5iYW5kd2lkdGgoKSAtIDEyNSkgLyAyLFxyXG4vLyAgICAgICAgICAgICAgICAgICBdKTtcclxuLy8gICAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgIH0pO1xyXG4vLyAgICAgICAgICAgaWYgKG1ldGFEYXRhLmhhc0RyaWxsRG93bikge1xyXG4vLyAgICAgICAgICAgICBpZiAodGVtcFNjYWxlLmJhbmR3aWR0aCgpICsgbGVmdEFuZFJpZ2h0U3BhY2VzICogMiA+IDE4MCkge1xyXG4vLyAgICAgICAgICAgICAgIHJldHVybiAnMTgwcHgnO1xyXG4vLyAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAgIHJldHVybiB0ZW1wU2NhbGUuYmFuZHdpZHRoKCkgKyBsZWZ0QW5kUmlnaHRTcGFjZXMgKiAyO1xyXG4vLyAgICAgICAgICAgfSBlbHNlIHJldHVybiB0ZW1wU2NhbGUuYmFuZHdpZHRoKCkgKyBsZWZ0QW5kUmlnaHRTcGFjZXMgKiAyO1xyXG4vLyAgICAgICAgIH0pXHJcbi8vICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIDUwKVxyXG4vLyAgICAgICAgIC5hcHBlbmQoJ3hodG1sOmRpdicpXHJcbi8vICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ3RpdGxlJylcclxuLy8gICAgICAgICAuc3R5bGUoJ3otaW5kZXgnLCA5OSlcclxuLy8gICAgICAgICAuaHRtbChmdW5jdGlvbiAoKSB7XHJcbi8vICAgICAgICAgICBsZXQgYmFyTGFiZWwgPSBkLmtleTtcclxuLy8gICAgICAgICAgIGxldCBkYXRhVHlwZSA9IG1ldGFEYXRhLmRhdGFUeXBlID8gbWV0YURhdGEuZGF0YVR5cGUgOiAnJztcclxuLy8gICAgICAgICAgIGxldCB2YWx1ZSA9IGQudmFsdWU7XHJcbi8vICAgICAgICAgICBsZXQgZGVzaXJlZFRleHQgPVxyXG4vLyAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJ0aXRsZS1iYXItbmFtZVwiPicgKyBiYXJMYWJlbCArICc8L3NwYW4+JztcclxuLy8gICAgICAgICAgIGRlc2lyZWRUZXh0ICs9XHJcbi8vICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInRpdGxlLWJhci12YWx1ZVwiPjxzcGFuPicgK1xyXG4vLyAgICAgICAgICAgICB2YWx1ZSArXHJcbi8vICAgICAgICAgICAgICc8L3NwYW4+JyArXHJcbi8vICAgICAgICAgICAgIGRhdGFUeXBlICtcclxuLy8gICAgICAgICAgICAgJzwvc3Bhbj4nO1xyXG4vLyAgICAgICAgICAgcmV0dXJuIGRlc2lyZWRUZXh0O1xyXG4vLyAgICAgICAgIH0pO1xyXG4vLyAgICAgfVxyXG4vLyAgICAgZnVuY3Rpb24gaGFuZGxlTW91c2VPdXQoZCwgaSkge1xyXG4vLyAgICAgICBzdmcuc2VsZWN0QWxsKCcubGliLXZlcnRpY2Fsc3RhY2stdGl0bGUtb250b3AnKS5yZW1vdmUoKTtcclxuLy8gICAgIH1cclxuLy8gICAgIHN2Z1xyXG4vLyAgICAgICAuYXBwZW5kKCdnJylcclxuLy8gICAgICAgLmF0dHIoJ2NsYXNzJywgJ3gyIGF4aXMyJylcclxuLy8gICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoMCwnICsgaGVpZ2h0ICsgJyknKVxyXG4vLyAgICAgICAuc3R5bGUoJ2NvbG9yJywgJ3ZhcigtLWNoYXJ0LWF4aXMtY29sb3IsICMwMDApJykgLy8gVXNlIENTUyB2YXJpYWJsZSBpbnN0ZWFkIG9mIGhhcmRjb2RlZCAjMDAwXHJcbi8vICAgICAgIC5jYWxsKGQzLmF4aXNCb3R0b20oeFNjYWxlRnJvbU9yaWdpbikudGlja1NpemUoMCkpXHJcbi8vICAgICAgIC5jYWxsKChnKSA9PiBnLnNlbGVjdCgnLmRvbWFpbicpLmF0dHIoJ2ZpbGwnLCAnbm9uZScpKTtcclxuLy8gICAgIHN2Zy5zZWxlY3RBbGwoJ2cueDIuYXhpczIgZy50aWNrIHRleHQnKS5zdHlsZSgnZGlzcGxheScsICdub25lJyk7XHJcbi8vICAgICBzdmdcclxuLy8gICAgICAgLmFwcGVuZCgnZycpXHJcbi8vICAgICAgIC5hdHRyKCdjbGFzcycsICdsaWItc3RhY2tlZC15LWF4aXMtdGV4dCB5YXhpcy1kYXNoZWQnKVxyXG4vLyAgICAgICAuYXR0cignc3R5bGUnLCBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi55QXhpc0N1c3RvbVRleHRTdHlsZXMpXHJcbi8vICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDAsMCknKVxyXG4vLyAgICAgICAuY2FsbCh5KVxyXG4vLyAgICAgICAuc3R5bGUoJ2Rpc3BsYXknLCAnbm9uZScpO1xyXG4vLyAgICAgc3ZnWUF4aXNMZWZ0XHJcbi8vICAgICAgIC5hcHBlbmQoJ2cnKVxyXG4vLyAgICAgICAuYXBwZW5kKCdnJylcclxuLy8gICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi15YXhpcy1sYWJlbHMtdGV4dHMtZHJpbGxkb3duIHlheGlzLWRhc2hlZCcpXHJcbi8vICAgICAgIC5hdHRyKCdzdHlsZScsIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzQ3VzdG9tVGV4dFN0eWxlcylcclxuLy8gICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoMCwwKScpXHJcbi8vICAgICAgIC5jYWxsKFxyXG4vLyAgICAgICAgIGQzXHJcbi8vICAgICAgICAgICAuYXhpc0xlZnQoeSlcclxuLy8gICAgICAgICAgIC50aWNrU2l6ZSgwKVxyXG4vLyAgICAgICAgICAgLnRpY2tzKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLm51bWJlck9mWVRpY2tzKVxyXG4vLyAgICAgICAgICAgLnRpY2tGb3JtYXQoZnVuY3Rpb24gKGQpIHtcclxuLy8gICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkID0gc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNMYWJlbEZvbWF0dGVyXHJcbi8vICAgICAgICAgICAgICAgPyBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi55QXhpc0xhYmVsRm9tYXR0ZXIoZClcclxuLy8gICAgICAgICAgICAgICA6IGQ7XHJcbi8vICAgICAgICAgICAgIHJldHVybiBmb3JtYXR0ZWQgPj0gMTAwMCA/IGZvcm1hdHRlZCAvIDEwMDAgKyAnaycgOiBmb3JtYXR0ZWQ7XHJcbi8vICAgICAgICAgICB9KVxyXG4vLyAgICAgICApXHJcbi8vICAgICAgIC5jYWxsKChnKSA9PiB7XHJcbi8vICAgICAgICAgLy8gU3R5bGUgdGhlIGRvbWFpbiBsaW5lIGZvciB0aGVtZSBzdXBwb3J0XHJcbi8vICAgICAgICAgZy5zZWxlY3QoJy5kb21haW4nKVxyXG4vLyAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCAndmFyKC0tY2hhcnQtZG9tYWluLWNvbG9yLCAjMDAwMDAwKScpXHJcbi8vICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsICcxcHgnKTtcclxuLy8gICAgICAgfSlcclxuLy8gICAgICAgLnNlbGVjdEFsbCgndGV4dCcpXHJcbi8vICAgICAgIC5zdHlsZSgnZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpO1xyXG4vLyAgICAgc3ZnWUF4aXNSaWdodFxyXG4vLyAgICAgICAuYXBwZW5kKCdnJylcclxuLy8gICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi15YXhpcy1sYWJlbHMtdGV4dHMtZHJpbGxkb3duIHlheGlzLWRhc2hlZCcpXHJcbi8vICAgICAgIC5hdHRyKCdzdHlsZScsIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzQ3VzdG9tVGV4dFN0eWxlcylcclxuLy8gICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoMCwwKScpXHJcbi8vICAgICAgIC5jYWxsKHkpXHJcbi8vICAgICAgIC5zdHlsZSgnZGlzcGxheScsICdub25lJyk7XHJcbi8vICAgICAvKipcclxuLy8gICAgICAqIGhpZGUgeCBheGlzIGxhYmVsc1xyXG4vLyAgICAgICogY29uZmlnIGlzIHRoZXJlIGZvciBmdXR1cmUgdXNlXHJcbi8vICAgICAgKiB1c2VkIGJ5IHdlZWtseSBjaGFydHNcclxuLy8gICAgICAqL1xyXG4vLyAgICAgaWYgKFxyXG4vLyAgICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1hheGlzTGFiZWxIaWRkZW4gIT0gdW5kZWZpbmVkICYmXHJcbi8vICAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzWGF4aXNMYWJlbEhpZGRlblxyXG4vLyAgICAgKSB7XHJcbi8vICAgICAgIGQzLnNlbGVjdEFsbCgnZy5saWItbGluZS14LWF4aXMtdGV4dCA+IGcgPiB0ZXh0JykuYXR0cihcclxuLy8gICAgICAgICAnY2xhc3MnLFxyXG4vLyAgICAgICAgICdsaWItZGlzcGxheS1oaWRkZW4nXHJcbi8vICAgICAgICk7XHJcbi8vICAgICB9XHJcbi8vICAgICAvKipcclxuLy8gICAgICAqIGhpZGUgeSBheGlzIGxhYmVsc1xyXG4vLyAgICAgICogdXNlZCBieSB3ZWVrbHkgY2hhcnRzXHJcbi8vICAgICAgKi9cclxuLy8gICAgIGlmIChcclxuLy8gICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNZYXhpc0xhYmVsSGlkZGVuICE9IHVuZGVmaW5lZCAmJlxyXG4vLyAgICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1lheGlzTGFiZWxIaWRkZW5cclxuLy8gICAgICkge1xyXG4vLyAgICAgICBkMy5zZWxlY3RBbGwoJy55YXhpcy1kYXNoZWQgPiBnID4gdGV4dCcpLmF0dHIoXHJcbi8vICAgICAgICAgJ2NsYXNzJyxcclxuLy8gICAgICAgICAnbGliLWRpc3BsYXktaGlkZGVuJ1xyXG4vLyAgICAgICApO1xyXG4vLyAgICAgfVxyXG4vLyAgICAgLyoqXHJcbi8vICAgICAgKiBoaWRlIHkgYXhpcyBsYWJlbHNcclxuLy8gICAgICAqIGNvbmZpZyBpcyB0aGVyZSBmb3IgZnV0dXJlIHVzZVxyXG4vLyAgICAgICovXHJcbi8vICAgICBpZiAoXHJcbi8vICAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzWWF4aXNIaWRkZW4gIT0gdW5kZWZpbmVkICYmXHJcbi8vICAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzWWF4aXNIaWRkZW5cclxuLy8gICAgICkge1xyXG4vLyAgICAgICBkMy5zZWxlY3RBbGwoJy55YXhpcy1kYXNoZWQnKS5hdHRyKCdjbGFzcycsICdsaWItZGlzcGxheS1oaWRkZW4nKTtcclxuLy8gICAgIH1cclxuLy8gICAgIC8qKlxyXG4vLyAgICAgICogZGFzaGVkIHkgYXhpc1xyXG4vLyAgICAgICogdXNlZCBieSB3ZWVrbHkgY2hhcnRzXHJcbi8vICAgICAgKi9cclxuLy8gICAgIGlmIChcclxuLy8gICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNZYXhpc0Rhc2hlZCAhPSB1bmRlZmluZWQgJiZcclxuLy8gICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNZYXhpc0Rhc2hlZFxyXG4vLyAgICAgKSB7XHJcbi8vICAgICAgIGQzLnNlbGVjdEFsbCgnLnlheGlzLWRhc2hlZCcpXHJcbi8vICAgICAgICAgLnN0eWxlKCdzdHJva2UtZGFzaGFycmF5JywgJzUgNScpXHJcbi8vICAgICAgICAgLnN0eWxlKCdjb2xvcicsICd2YXIoLS1jaGFydC1heGlzLWNvbG9yLCAjOTk5OTk5KScpOyAvLyBVc2UgQ1NTIHZhcmlhYmxlXHJcbi8vICAgICB9XHJcbi8vICAgICBpZiAobGluZURhdGEgIT0gbnVsbCkge1xyXG4vLyAgICAgICBpZiAobGluZURhdGEgJiYgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uc2hvd0xpbmVDaGFydEF4aXMpIHtcclxuLy8gICAgICAgICBzdmdZQXhpc1JpZ2h0XHJcbi8vICAgICAgICAgICAuYXBwZW5kKCdnJylcclxuLy8gICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdsaWItc3RhY2tlZC15LWF4aXMtdGV4dDEnKVxyXG4vLyAgICAgICAgICAgLmF0dHIoJ3N0eWxlJywgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNDdXN0b21UZXh0U3R5bGVzKVxyXG4vLyAgICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyArIDAgKyAnLDApJylcclxuLy8gICAgICAgICAgIC5jYWxsKHlMaW5lQXhpcyk7XHJcbi8vICAgICAgIH1cclxuLy8gICAgIH1cclxuLy8gICAgIC8qKlxyXG4vLyAgICAgICogdXNlZCB0byBkaXNwbGF5IHkgbGFiZWxcclxuLy8gICAgICAqL1xyXG5cclxuLy8gICAgIC8vIGlmICh0aGlzLmlzWm9vbWVkT3V0KSB7XHJcbi8vICAgICAvLyAgIHN2Z1xyXG4vLyAgICAgLy8gICAgIC5zZWxlY3RBbGwoJy5saWIteGF4aXMtbGFiZWxzLXRleHRzLWRyaWxsZG93bicpXHJcbi8vICAgICAvLyAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi1kaXNwbGF5LWhpZGRlbicpO1xyXG4vLyAgICAgLy8gfVxyXG5cclxuLy8gICAgIGlmICh0aGlzLmlzWm9vbWVkT3V0KSB7XHJcbi8vICAgICAgIHN2Z1xyXG4vLyAgICAgICAgIC5zZWxlY3RBbGwoJy5saWIteGF4aXMtbGFiZWxzLXRleHRzLWRyaWxsZG93bicpXHJcbi8vICAgICAgICAgLmVhY2goKGQsIGksIG5vZGVzKSA9PiB7XHJcbi8vICAgICAgICAgICBjb25zdCB0ZXh0ID0gZDMuc2VsZWN0KG5vZGVzW2ldKTtcclxuLy8gICAgICAgICAgIGNvbnN0IGxhYmVsID0gdGV4dC50ZXh0KCk7XHJcbi8vICAgICAgICAgICBpZiAobGFiZWwuaW5kZXhPZignXFxuJykgPiAtMSkge1xyXG4vLyAgICAgICAgICAgICBjb25zdCBsaW5lcyA9IGxhYmVsLnNwbGl0KCdcXG4nKTtcclxuLy8gICAgICAgICAgICAgdGV4dC50ZXh0KG51bGwpO1xyXG4vLyAgICAgICAgICAgICBsaW5lcy5mb3JFYWNoKChsaW5lLCBpZHgpID0+IHtcclxuLy8gICAgICAgICAgICAgICB0ZXh0LmFwcGVuZCgndHNwYW4nKVxyXG4vLyAgICAgICAgICAgICAgICAgLnRleHQobGluZSlcclxuLy8gICAgICAgICAgICAgICAgIC5hdHRyKCd4JywgMClcclxuLy8gICAgICAgICAgICAgICAgIC5hdHRyKCdkeScsIGlkeCA9PT0gMCA/ICcxZW0nIDogJzEuMWVtJyk7XHJcbi8vICAgICAgICAgICAgIH0pO1xyXG4vLyAgICAgICAgICAgfSBlbHNlIHtcclxuLy8gICAgICAgICAgICAgY29uc3Qgd29yZHMgPSBsYWJlbC5zcGxpdCgnICcpO1xyXG4vLyAgICAgICAgICAgICB0ZXh0LnRleHQobnVsbCk7XHJcbi8vICAgICAgICAgICAgIHdvcmRzLmZvckVhY2goKHdvcmQsIGluZGV4KSA9PiB7XHJcbi8vICAgICAgICAgICAgICAgdGV4dC5hcHBlbmQoJ3RzcGFuJykudGV4dCh3b3JkKTtcclxuLy8gICAgICAgICAgICAgfSk7XHJcbi8vICAgICAgICAgICB9XHJcbi8vICAgICAgICAgfSlcclxuLy8gICAgICAgICAuc3R5bGUoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKVxyXG4vLyAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBudWxsKTsgXHJcbi8vICAgICAgIHN2Z1xyXG4vLyAgICAgICAgIC5zZWxlY3QoJy54LWF4aXMnKVxyXG4vLyAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsICR7aGVpZ2h0IC0gbWFyZ2luLmJvdHRvbSArIDEwfSlgKTtcclxuLy8gICAgIH1cclxuXHJcbi8vICAgICAvKipcclxuLy8gICAgICAqIHVzZWQgdG8gd3JpdGUgeSBsYWJlbHMgYmFzZWQgb24gY29uZmlndXJhdGlvblxyXG4vLyAgICAgICovXHJcbi8vIGlmIChtZXRhRGF0YS55TGFiZWwpIHtcclxuLy8gICBjb25zdCB5UG9zaXRpb24gPSBpc3JpYSA/IDAgLSBtYXJnaW4ubGVmdCAvIDIgLSAzMCA6IDAgLSBtYXJnaW4ubGVmdCAvIDIgLSA0MDtcclxuXHJcbi8vICAgc3ZnWUF4aXNMZWZ0XHJcbi8vICAgICAuYXBwZW5kKCd0ZXh0JylcclxuLy8gICAgIC5hdHRyKCdjbGFzcycsICdsaWItYXhpcy1ncm91cC1sYWJlbCBmb250LXNpemUtMScpXHJcbi8vICAgICAuYXR0cignc3R5bGUnLCBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi55QXhpc0N1c3RvbWxhYmVsU3R5bGVzKVxyXG4vLyAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICdyb3RhdGUoLTkwKScpXHJcbi8vICAgICAuYXR0cigneScsIHlQb3NpdGlvbilcclxuLy8gICAgIC5hdHRyKCd4JywgMCAtIGhlaWdodCAvIDIpXHJcbi8vICAgICAuYXR0cignZHknLCAnMWVtJylcclxuLy8gICAgIC5zdHlsZSgndGV4dC1hbmNob3InLCAnbWlkZGxlJylcclxuLy8gICAgIC5hdHRyKCdmaWxsJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJyk7XHJcblxyXG4vLyAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc011bHRpQ2hhcnRHcmlkTGluZSA9PT0gdW5kZWZpbmVkKSB7XHJcbi8vICAgICBzdmdZQXhpc0xlZnRcclxuLy8gICAgICAgLnNlbGVjdEFsbCgnLmxpYi1heGlzLWdyb3VwLWxhYmVsJylcclxuLy8gICAgICAgLnN0eWxlKCdmb250LXNpemUnLCAnc21hbGxlcicpXHJcbi8vICAgICAgIC50ZXh0KG1ldGFEYXRhLnlMYWJlbCk7XHJcbi8vICAgfSBlbHNlIHtcclxuLy8gICAgIHN2Z1xyXG4vLyAgICAgICAuc2VsZWN0QWxsKCcubGliLWF4aXMtZ3JvdXAtbGFiZWwnKVxyXG4vLyAgICAgICAuYXR0cignY2xhc3MnLCAnbGliLXlsYWJlbC13ZWVrbHlDaGFydHMnKVxyXG4vLyAgICAgICAudGV4dChtZXRhRGF0YS55TGFiZWwudG9Mb3dlckNhc2UoKSk7XHJcbi8vICAgfVxyXG4vLyB9XHJcblxyXG4vLyAgICAgaWYgKHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhKSB7XHJcbi8vICAgICAgIGNvbnN0IHlaZXJvID0geSh0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXQpO1xyXG4vLyAgICAgICBzdmdcclxuLy8gICAgICAgICAuYXBwZW5kKCdsaW5lJylcclxuLy8gICAgICAgICAuYXR0cigneDEnLCAwKVxyXG4vLyAgICAgICAgIC5hdHRyKCd4MicsIHdpZHRoKVxyXG4vLyAgICAgICAgIC5hdHRyKCd5MScsIHlaZXJvKVxyXG4vLyAgICAgICAgIC5hdHRyKCd5MicsIHlaZXJvKVxyXG4vLyAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLWRhc2hhcnJheScsICc1IDUnKVxyXG4vLyAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgdGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEuY29sb3IpO1xyXG4vLyAgICAgICAvLyBzdmdZQXhpc1JpZ2h0XHJcbi8vICAgICAgIC8vICAgLmFwcGVuZCgnbGluZScpXHJcbi8vICAgICAgIC8vICAgLmF0dHIoJ3gxJywgMClcclxuLy8gICAgICAgLy8gICAuYXR0cigneDInLCByaWdodFN2Z1dpZHRoKVxyXG4vLyAgICAgICAvLyAgIC5hdHRyKCd5MScsIHlaZXJvKVxyXG4vLyAgICAgICAvLyAgIC5hdHRyKCd5MicsIHlaZXJvKVxyXG4vLyAgICAgICAvLyAgIC5zdHlsZSgnc3Ryb2tlJywgdGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEuY29sb3IpO1xyXG4vLyAgICAgICBzdmdZQXhpc1JpZ2h0XHJcbi8vICAgICAgICAgLmFwcGVuZCgnZm9yZWlnbk9iamVjdCcpXHJcbi8vICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyArIDAgKyAnLCcgKyAoeVplcm8gLSAzMCkgKyAnKScpXHJcbi8vICAgICAgICAgLmF0dHIoJ3dpZHRoJywgcmlnaHRTdmdXaWR0aClcclxuLy8gICAgICAgICAuYXR0cignaGVpZ2h0JywgNTApXHJcbi8vICAgICAgICAgLmFwcGVuZCgneGh0bWw6ZGl2JylcclxuLy8gICAgICAgICAuYXR0cignY2xhc3MnLCAndGFyZ2V0LWRpc3BsYXknKVxyXG4vLyAgICAgICAgIC5zdHlsZSgnY29sb3InLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKVxyXG4vLyAgICAgICAgIC5odG1sKGZ1bmN0aW9uICgpIHtcclxuLy8gICAgICAgICAgIGxldCBkYXRhVHlwZVRlbXAgPSAnJztcclxuLy8gICAgICAgICAgIGxldCB0YXJnZXRMaW5lTmFtZSA9ICd0YXJnZXQnO1xyXG4vLyAgICAgICAgICAgaWYgKG1ldGFEYXRhLmRhdGFUeXBlKSB7XHJcbi8vICAgICAgICAgICAgIGRhdGFUeXBlVGVtcCA9IG1ldGFEYXRhLmRhdGFUeXBlO1xyXG4vLyAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgaWYgKFxyXG4vLyAgICAgICAgICAgICBzZWxmLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YSAmJlxyXG4vLyAgICAgICAgICAgICBzZWxmLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXROYW1lXHJcbi8vICAgICAgICAgICApIHtcclxuLy8gICAgICAgICAgICAgdGFyZ2V0TGluZU5hbWUgPSBzZWxmLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXROYW1lO1xyXG4vLyAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgcmV0dXJuIChcclxuLy8gICAgICAgICAgICAgYDxkaXY+JHt0YXJnZXRMaW5lTmFtZX08L2Rpdj5gICtcclxuLy8gICAgICAgICAgICAgJzxkaXY+JyArXHJcbi8vICAgICAgICAgICAgIHNlbGYuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLnRhcmdldCArXHJcbi8vICAgICAgICAgICAgICcnICtcclxuLy8gICAgICAgICAgICAgZGF0YVR5cGVUZW1wICtcclxuLy8gICAgICAgICAgICAgJzwvZGl2PidcclxuLy8gICAgICAgICAgICk7XHJcbi8vICAgICAgICAgfSk7XHJcbi8vICAgICB9XHJcbi8vICAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCkge1xyXG4vLyAgICAgICAvKipcclxuLy8gICAgICAgICogdXNlZCBieSBkcmlsbGRvd24gY2hhcnRzXHJcbi8vICAgICAgICAqL1xyXG4vLyAgICAgICAvLyBzdmdcclxuLy8gICAgICAgLy8gICAuc2VsZWN0QWxsKCcubGliLWF4aXMtZ3JvdXAtbGFiZWwnKVxyXG4vLyAgICAgICAvLyAgIC5hdHRyKCdjbGFzcycsICdsaWIteWxhYmVsLWRyaWxsZG93bmNoYXJ0cycpXHJcbi8vICAgICAgIC8vICAgLnRleHQobWV0YURhdGEueUxhYmVsLnRvTG93ZXJDYXNlKCkpO1xyXG4vLyAgICAgICBzdmcuc2VsZWN0QWxsKCdnLngxLmF4aXMxIGcudGljayBsaW5lJykuc3R5bGUoJ2Rpc3BsYXknLCAnbm9uZScpO1xyXG4vLyAgICAgfVxyXG5cclxuLy8gICAgIGlmIChtZXRhRGF0YS54TGFiZWwpIHtcclxuLy8gICAgICAgZnVuY3Rpb24gaXNBY3JvbnltKGxhYmVsKSB7XHJcbi8vICAgICAgICAgcmV0dXJuIChcclxuLy8gICAgICAgICAgIChsYWJlbC5sZW5ndGggPD0gNCAmJiAvXltBLVpdKyQvLnRlc3QobGFiZWwpKSB8fFxyXG4vLyAgICAgICAgICAgKGxhYmVsID09PSBsYWJlbC50b1VwcGVyQ2FzZSgpICYmIC9bQS1aXS8udGVzdChsYWJlbCkpXHJcbi8vICAgICAgICAgKTtcclxuLy8gICAgICAgfVxyXG4vLyAgICAgICBjb25zdCB4TGFiZWxUZXh0ID0gbWV0YURhdGEueExhYmVsO1xyXG4vLyAgICAgICBjb25zdCBpc0FjciA9IGlzQWNyb255bSh4TGFiZWxUZXh0LnJlcGxhY2UoL1teQS1aYS16XS9nLCAnJykpO1xyXG5cclxuLy8gICAgICAgICBjb25zdCB4UG9zaXRpb24gPSBpc3JpYSA/IChoZWlnaHQgKyBtYXJnaW4udG9wICsgbWFyZ2luLmJvdHRvbSkgOiAoaGVpZ2h0ICsgbWFyZ2luLnRvcCArIG1hcmdpbi5ib3R0b20gKyA0MCk7XHJcblxyXG4vLyAgICAgICBzdmdcclxuLy8gICAgICAgICAuYXBwZW5kKCd0ZXh0JylcclxuLy8gICAgICAgICAuYXR0cignY2xhc3MnLCBmdW5jdGlvbiAoKSB7XHJcbi8vICAgICAgICAgICBsZXQgYmFzZUNsYXNzID0gJ2xpYi1heGlzLWdyb3VwLWxhYmVsIGZvbnQtc2l6ZS0xJztcclxuLy8gICAgICAgICAgIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0RyaWxsZG93bkNoYXJ0KVxyXG4vLyAgICAgICAgICAgICByZXR1cm4gYmFzZUNsYXNzICsgJyBsaWIteGxhYmVsLWRyaWxsZG93bmNoYXJ0cyc7XHJcbi8vICAgICAgICAgICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNNdWx0aUNoYXJ0R3JpZExpbmUgIT0gdW5kZWZpbmVkKVxyXG4vLyAgICAgICAgICAgICByZXR1cm4gYmFzZUNsYXNzICsgJyBsaWIteGxhYmVsLXdlZWtseUNoYXJ0cyc7XHJcbi8vICAgICAgICAgICByZXR1cm4gYmFzZUNsYXNzICsgJyBsaWItYXhpcy13YXRlcmZhbGwtbGFiZWwnO1xyXG4vLyAgICAgICAgIH0pXHJcbi8vICAgICAgICAgLmF0dHIoJ3N0eWxlJywgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueEF4aXNDdXN0b21sYWJlbFN0eWxlcylcclxuLy8gICAgICAgICAuYXR0cihcclxuLy8gICAgICAgICAgICd0cmFuc2Zvcm0nLFxyXG4vLyAgICAgICAgICAgJ3RyYW5zbGF0ZSgnICsgd2lkdGggLyAyICsgJyAsJyArIHhQb3NpdGlvbiArICcpJ1xyXG4vLyAgICAgICAgIClcclxuLy8gICAgICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXHJcbi8vICAgICAgICAgLnN0eWxlKCdmaWxsJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJylcclxuLy8gICAgICAgICAudGV4dChpc0FjciA/IHhMYWJlbFRleHQudG9VcHBlckNhc2UoKSA6IHhMYWJlbFRleHQudG9Mb3dlckNhc2UoKSlcclxuLy8gICAgICAgICAuc3R5bGUoJ3RleHQtdHJhbnNmb3JtJywgaXNBY3IgPyAnbm9uZScgOiAnY2FwaXRhbGl6ZScpO1xyXG4vLyAgICAgfVxyXG4vLyAgICAgaWYgKG1ldGFEYXRhLmxpbmV5TGFiZWwpIHtcclxuLy8gICAgICAgc3ZnWUF4aXNSaWdodFxyXG4vLyAgICAgICAgIC5hcHBlbmQoJ3RleHQnKVxyXG4vLyAgICAgICAgIC5hdHRyKCdjbGFzcycsICdsaWItYXhpcy1ncm91cC1sYWJlbCBsaWItbGluZS1heGlzJylcclxuLy8gICAgICAgICAuYXR0cignZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpXHJcbi8vICAgICAgICAgLmF0dHIoJ3N0eWxlJywgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNDdXN0b21sYWJlbFN0eWxlcylcclxuLy8gICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgwLDApIHJvdGF0ZSg5MCknKVxyXG4vLyAgICAgICAgIC5hdHRyKCd5JywgMCAtIDEwMClcclxuLy8gICAgICAgICAuYXR0cigneCcsIDAgKyAxMDApXHJcbi8vICAgICAgICAgLmF0dHIoJ2R5JywgJzVlbScpXHJcbi8vICAgICAgICAgLnN0eWxlKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxyXG4vLyAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgJ3NtYWxsZXInKVxyXG4vLyAgICAgICAgIC50ZXh0KG1ldGFEYXRhLmxpbmV5TGFiZWwpO1xyXG4vLyAgICAgfVxyXG4vLyAgICAgaWYgKGxpbmVEYXRhKSB7XHJcbi8vICAgICAgIHN2Z1xyXG4vLyAgICAgICAgIC5hcHBlbmQoJ3BhdGgnKVxyXG4vLyAgICAgICAgIC5kYXR1bShsaW5lRGF0YSlcclxuLy8gICAgICAgICAuYXR0cignZmlsbCcsICdub25lJylcclxuLy8gICAgICAgICAuYXR0cignc3Ryb2tlJywgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubGluZUdyYXBoQ29sb3IpXHJcbi8vICAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIDEuNSlcclxuLy8gICAgICAgICAuYXR0cihcclxuLy8gICAgICAgICAgICdkJyxcclxuLy8gICAgICAgICAgIGQzXHJcbi8vICAgICAgICAgICAgIC5saW5lKClcclxuLy8gICAgICAgICAgICAgLngoZnVuY3Rpb24gKGQpIHtcclxuLy8gICAgICAgICAgICAgICByZXR1cm4geChkLm5hbWUpICsgeC5iYW5kd2lkdGgoKSAvIDI7XHJcbi8vICAgICAgICAgICAgIH0pXHJcbi8vICAgICAgICAgICAgIC55KGZ1bmN0aW9uIChkKSB7XHJcbi8vICAgICAgICAgICAgICAgcmV0dXJuIGxpbmVZc2NhbGUoZC52YWx1ZSk7XHJcbi8vICAgICAgICAgICAgIH0pXHJcbi8vICAgICAgICAgKTtcclxuXHJcbi8vICAgICAgIHZhciBkb3QgPSBzdmdcclxuLy8gICAgICAgICAuc2VsZWN0QWxsKCdteUNpcmNsZXMnKVxyXG4vLyAgICAgICAgIC5kYXRhKGxpbmVEYXRhKVxyXG4vLyAgICAgICAgIC5lbnRlcigpXHJcbi8vICAgICAgICAgLmFwcGVuZCgnZycpXHJcbi8vICAgICAgICAgLm9uKCdjbGljaycsIGZ1bmN0aW9uIChkKSB7XHJcbi8vICAgICAgICAgICBpZiAoXHJcbi8vICAgICAgICAgICAgICFtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2sgfHxcclxuLy8gICAgICAgICAgICAgIW1ldGFEYXRhLmJhcldpdGhvdXRDbGljay5sZW5ndGggfHxcclxuLy8gICAgICAgICAgICAgKCFtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2suaW5jbHVkZXMoZD8ubmFtZSkgJiZcclxuLy8gICAgICAgICAgICAgICAhbWV0YURhdGEuYmFyV2l0aG91dENsaWNrLmluY2x1ZGVzKGQ/LmtleSkpXHJcbi8vICAgICAgICAgICApXHJcbi8vICAgICAgICAgICAgIHNlbGYuaGFuZGxlQ2xpY2soZCk7XHJcbi8vICAgICAgICAgfSk7XHJcblxyXG4vLyAgICAgICBkb3RcclxuLy8gICAgICAgICAuYXBwZW5kKCdjaXJjbGUnKVxyXG4vLyAgICAgICAgIC5hdHRyKCdmaWxsJywgZnVuY3Rpb24gKGQpIHtcclxuLy8gICAgICAgICAgIHJldHVybiBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5saW5lR3JhcGhDb2xvcjtcclxuLy8gICAgICAgICB9KVxyXG4vLyAgICAgICAgIC5hdHRyKCdzdHJva2UnLCAnbm9uZScpXHJcbi8vICAgICAgICAgLmF0dHIoJ2N4JywgZnVuY3Rpb24gKGQpIHtcclxuLy8gICAgICAgICAgIHJldHVybiB4KGQubmFtZSkgKyB4LmJhbmR3aWR0aCgpIC8gMjtcclxuLy8gICAgICAgICB9KVxyXG4vLyAgICAgICAgIC5hdHRyKCdjeScsIGZ1bmN0aW9uIChkKSB7XHJcbi8vICAgICAgICAgICByZXR1cm4gbGluZVlzY2FsZShkLnZhbHVlKTtcclxuLy8gICAgICAgICB9KVxyXG4vLyAgICAgICAgIC5zdHlsZSgnY3Vyc29yJywgKCkgPT5cclxuLy8gICAgICAgICAgIHNlbGYuY2hhcnREYXRhLm1ldGFEYXRhLmhhc0RyaWxsRG93biA/ICdwb2ludGVyJyA6ICdkZWZhdWx0J1xyXG4vLyAgICAgICAgIClcclxuLy8gICAgICAgICAuYXR0cigncicsIDMpO1xyXG5cclxuLy8gICAgICAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmxpbmVHcmFwaENvbG9yKSB7XHJcbi8vICAgICAgICAgZG90XHJcbi8vICAgICAgICAgICAuYXBwZW5kKCd0ZXh0JylcclxuLy8gICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdkb3QnKVxyXG4vLyAgICAgICAgICAgLmF0dHIoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKVxyXG4vLyAgICAgICAgICAgLmF0dHIoJ2NvbG9yJywgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubGluZUdyYXBoQ29sb3IpXHJcbi8vICAgICAgICAgICAuYXR0cignc3R5bGUnLCAnZm9udC1zaXplOiAnICsgJy44NWVtJylcclxuLy8gICAgICAgICAgIC5hdHRyKCd4JywgZnVuY3Rpb24gKGQsIGkpIHtcclxuLy8gICAgICAgICAgICAgcmV0dXJuIHgoZC5uYW1lKSArIHguYmFuZHdpZHRoKCkgLyAyO1xyXG4vLyAgICAgICAgICAgfSlcclxuLy8gICAgICAgICAgIC5hdHRyKCd5JywgZnVuY3Rpb24gKGQpIHtcclxuLy8gICAgICAgICAgICAgcmV0dXJuIGxpbmVZc2NhbGUoZC52YWx1ZSk7XHJcbi8vICAgICAgICAgICB9KVxyXG4vLyAgICAgICAgICAgLmF0dHIoJ2R5JywgJy0xZW0nKVxyXG4vLyAgICAgICAgICAgLnRleHQoZnVuY3Rpb24gKGQpIHtcclxuLy8gICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmxhYmVsRm9ybWF0dGVyKGQudmFsdWUpO1xyXG4vLyAgICAgICAgICAgfSk7XHJcbi8vICAgICAgIH1cclxuLy8gICAgIH1cclxuLy8gICB9XHJcblxyXG5pbml0aWFsaXplZ3JvdXBDaGFydCgpIHtcclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBWQVJJQUJMRSBERUNMQVJBVElPTlMgPT09PT09PT09PT09PT09PT09PT1cclxuICBjb25zdCBzZWxmID0gdGhpcztcclxuICBsZXQgZGF0YSA9IFtdO1xyXG4gIGxldCBtZXRhRGF0YTogYW55ID0gbnVsbDtcclxuICBsZXQga2V5TGlzdCA9IG51bGw7XHJcbiAgbGV0IGxpbmVEYXRhID0gbnVsbDtcclxuICBsZXQgY29sb3JNYXAgPSB7fTtcclxuICBsZXQgZm9ybWF0RnJvbUJhY2tlbmQ7XHJcbiAgbGV0IGZvcm1hdEZvckh1Z2VOdW1iZXJzO1xyXG4gIFxyXG4gIC8vIERldmljZSBkZXRlY3Rpb25cclxuICBjb25zdCBpc01vYmlsZSA9IHdpbmRvdy5pbm5lcldpZHRoIDwgNTc2O1xyXG4gIGNvbnN0IGlzVGFibGV0ID0gd2luZG93LmlubmVyV2lkdGggPj0gNTc2ICYmIHdpbmRvdy5pbm5lcldpZHRoIDwgOTkyO1xyXG4gIGNvbnN0IGlzRGVza3RvcCA9IHdpbmRvdy5pbm5lcldpZHRoID49IDk5MjtcclxuICBjb25zdCBpc3JpYSA9IHRoaXMuY3VzdG9tQ2hhcnRDb25maWd1cmF0aW9uLmlzUmlhO1xyXG5cclxuICAvLyBDaGFydCBzY2FsZSB2YXJpYWJsZXNcclxuICBsZXQgeDogYW55O1xyXG4gIGxldCB0ZW1wU2NhbGU7XHJcblxyXG4gIC8vIFRpY2sgbGVuZ3RoIGNvbnN0YW50c1xyXG4gIGNvbnN0IFNIT1JUX1RJQ0tfTEVOR1RIID0gNDtcclxuICBjb25zdCBMT05HX1RJQ0tfTEVOR1RIID0gMTY7XHJcbiAgY29uc3QgU0hPUlRfVElDS19MRU5HVEhfQkcgPSA1O1xyXG4gIGNvbnN0IExPTkdfVElDS19MRU5HVEhfQkcgPSAzMDtcclxuICBjb25zdCBMRUZUX0FORF9SSUdIVF9TUEFDRVMgPSA1MDtcclxuICBjb25zdCBSSUdIVF9TVkdfV0lEVEggPSA2MDtcclxuICBcclxuICAvLyBGbGFnc1xyXG4gIGxldCBhbHRlcm5hdGVfdGV4dCA9IGZhbHNlO1xyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBDT05GSUdVUkFUSU9OIFNFVFVQID09PT09PT09PT09PT09PT09PT09XHJcbiAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5kZWZhdWx0Q29uZmlndXJhdGlvbikge1xyXG4gICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb25ba2V5XSA9IENoYXJ0SGVscGVyLmdldFZhbHVlQnlDb25maWd1cmF0aW9uVHlwZShcclxuICAgICAga2V5LFxyXG4gICAgICB0aGlzLmRlZmF1bHRDb25maWd1cmF0aW9uLFxyXG4gICAgICB0aGlzLmN1c3RvbUNoYXJ0Q29uZmlndXJhdGlvblxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8vIEV4dHJhY3QgY2hhcnQgZGF0YVxyXG4gIGRhdGEgPSB0aGlzLmNoYXJ0RGF0YS5kYXRhO1xyXG4gIG1ldGFEYXRhID0gdGhpcy5jaGFydERhdGEubWV0YURhdGE7XHJcbiAgbGluZURhdGEgPSB0aGlzLmNoYXJ0RGF0YS5saW5lRGF0YTtcclxuXHJcbiAgLy8gU2V0dXAgY29sb3IgbWFwcGluZ3NcclxuICBpZiAoIW1ldGFEYXRhLmNvbG9yQWJvdmVUYXJnZXQpIHtcclxuICAgIG1ldGFEYXRhWydjb2xvckFib3ZlVGFyZ2V0J10gPSBtZXRhRGF0YS5jb2xvcnM7XHJcbiAgfVxyXG4gIGNvbG9yTWFwID0gbWV0YURhdGEuY29sb3JzO1xyXG4gIGtleUxpc3QgPSBtZXRhRGF0YS5rZXlMaXN0O1xyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBDT05UQUlORVIgU0VUVVAgPT09PT09PT09PT09PT09PT09PT1cclxuICBjb25zdCBjaGFydENvbnRhaW5lciA9IGQzLnNlbGVjdCh0aGlzLmNvbnRhaW5lckVsdC5uYXRpdmVFbGVtZW50KTtcclxuICBjb25zdCB2ZXJ0aWNhbHN0YWNrZWRjb250YWluZXIgPSBkMy5zZWxlY3QodGhpcy5ncm91cGNvbnRhaW5lckVsdC5uYXRpdmVFbGVtZW50KTtcclxuICBjb25zdCBtYXJnaW4gPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5tYXJnaW47XHJcbiAgXHJcbiAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSB0aGlzLmNhbGN1bGF0ZUNoYXJ0RGltZW5zaW9ucyhcclxuICAgIGNoYXJ0Q29udGFpbmVyLFxyXG4gICAgdmVydGljYWxzdGFja2VkY29udGFpbmVyLFxyXG4gICAgbWFyZ2luLFxyXG4gICAgc2VsZlxyXG4gICk7XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IFZJU0lCSUxJVFkgQ09ORklHVVJBVElPTiA9PT09PT09PT09PT09PT09PT09PVxyXG4gIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0hlYWRlclZpc2libGUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5pc0hlYWRlclZpc2libGUgPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0hlYWRlclZpc2libGU7XHJcbiAgfVxyXG5cclxuICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubGVnZW5kVmlzaWJsZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICB0aGlzLmxlZ2VuZFZpc2libGUgPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5sZWdlbmRWaXNpYmxlO1xyXG4gIH1cclxuXHJcbiAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzVHJhbnNwYXJlbnRCYWNrZ3JvdW5kICE9PSB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuaXNUcmFuc3BhcmVudEJhY2tncm91bmQgPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1RyYW5zcGFyZW50QmFja2dyb3VuZDtcclxuICB9XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IERBVEEgRk9STUFUVElORyA9PT09PT09PT09PT09PT09PT09PVxyXG4gIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi50ZXh0Rm9ybWF0dGVyICE9PSB1bmRlZmluZWQpIHtcclxuICAgIGZvcm1hdEZyb21CYWNrZW5kID0gQ2hhcnRIZWxwZXIuZGF0YVZhbHVlRm9ybWF0dGVyKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnRleHRGb3JtYXR0ZXIpO1xyXG4gICAgZm9ybWF0Rm9ySHVnZU51bWJlcnMgPSBDaGFydEhlbHBlci5kYXRhVmFsdWVGb3JtYXR0ZXIoJy4ycycpO1xyXG4gIH1cclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gU1ZHIENPTlRBSU5FUlMgQ1JFQVRJT04gPT09PT09PT09PT09PT09PT09PT1cclxuICBjb25zdCB7XHJcbiAgICBvdXRlckNvbnRhaW5lcixcclxuICAgIHN2Z1lBeGlzTGVmdCxcclxuICAgIHN2Z1lBeGlzUmlnaHQsXHJcbiAgICBpbm5lckNvbnRhaW5lcixcclxuICAgIHN2Z1xyXG4gIH0gPSB0aGlzLmNyZWF0ZUNoYXJ0Q29udGFpbmVycyhjaGFydENvbnRhaW5lciwgbWFyZ2luLCBoZWlnaHQsIFJJR0hUX1NWR19XSURUSCwgc2VsZiwgd2lkdGgpO1xyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBTQ0FMRVMgU0VUVVAgPT09PT09PT09PT09PT09PT09PT1cclxuICBjb25zdCBzdWJncm91cHM6IGFueSA9IGtleUxpc3Q7XHJcbiAgY29uc3QgZ3JvdXBzID0gZDMubWFwKGRhdGEsIChkKSA9PiBkLm5hbWUpLmtleXMoKTtcclxuXHJcbiAgLy8gWC1heGlzIHNjYWxlIGNvbmZpZ3VyYXRpb25cclxuICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNNdWx0aUNoYXJ0R3JpZExpbmUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgeCA9IGQzLnNjYWxlQmFuZCgpXHJcbiAgICAgIC5yYW5nZVJvdW5kKFt3aWR0aCwgMF0pXHJcbiAgICAgIC5hbGlnbigwLjUpXHJcbiAgICAgIC5wYWRkaW5nKFswLjVdKVxyXG4gICAgICAuZG9tYWluKGRhdGEubWFwKChkOiBhbnkpID0+IGQubmFtZS50b0xvd2VyQ2FzZSgpKSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIHggPSBkMy5zY2FsZUJhbmQoKVxyXG4gICAgICAuZG9tYWluKGdyb3VwcylcclxuICAgICAgLnJhbmdlKFtMRUZUX0FORF9SSUdIVF9TUEFDRVMsIHdpZHRoIC0gUklHSFRfU1ZHX1dJRFRIIC0gTEVGVF9BTkRfUklHSFRfU1BBQ0VTXSlcclxuICAgICAgLnBhZGRpbmcoWzAuM10pO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgeFNjYWxlRnJvbU9yaWdpbiA9IGQzLnNjYWxlQmFuZCgpXHJcbiAgICAuZG9tYWluKGdyb3VwcylcclxuICAgIC5yYW5nZShbMCwgd2lkdGggLSBSSUdIVF9TVkdfV0lEVEhdKTtcclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gWC1BWElTIFJFTkRFUklORyA9PT09PT09PT09PT09PT09PT09PVxyXG4gIHRoaXMucmVuZGVyWEF4aXMoc3ZnLCB4LCBoZWlnaHQsIG1ldGFEYXRhLCBzdWJncm91cHMsIGRhdGEsIFxyXG4gICAgU0hPUlRfVElDS19MRU5HVEhfQkcsIExPTkdfVElDS19MRU5HVEhfQkcsIHNlbGYsIGlzcmlhLCBpc01vYmlsZSk7XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IFktQVhJUyBTRVRVUCA9PT09PT09PT09PT09PT09PT09PVxyXG4gIGNvbnN0IHkgPSBkMy5zY2FsZUxpbmVhcigpLnJhbmdlUm91bmQoW2hlaWdodCwgMF0pO1xyXG4gIGxldCBtYXhWYWx1ZSA9IHRoaXMuY2FsY3VsYXRlTWF4VmFsdWUoZGF0YSwga2V5TGlzdCk7XHJcblxyXG4gIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXN0b21Zc2NhbGUpIHtcclxuICAgIG1heFZhbHVlID0gbWF4VmFsdWUgKiB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXN0b21Zc2NhbGU7XHJcbiAgfVxyXG5cclxuICBpZiAodGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEgJiYgbWF4VmFsdWUgPCB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXQpIHtcclxuICAgIG1heFZhbHVlID0gbWF4VmFsdWUgPCAxMCAmJiB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXQgPCAxMFxyXG4gICAgICA/IHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLnRhcmdldCArIDNcclxuICAgICAgOiB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXQgKyAyMDtcclxuICB9XHJcblxyXG4gIHkuZG9tYWluKFswLCBtYXhWYWx1ZV0pLm5pY2UoKTtcclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gTElORSBDSEFSVCBZLVNDQUxFID09PT09PT09PT09PT09PT09PT09XHJcbiAgbGV0IGxpbmVZc2NhbGU7XHJcbiAgbGV0IHlMaW5lQXhpcztcclxuXHJcbiAgaWYgKGxpbmVEYXRhICE9IG51bGwpIHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2V0dXBMaW5lWVNjYWxlKGxpbmVEYXRhLCBoZWlnaHQsIHNlbGYpO1xyXG4gICAgbGluZVlzY2FsZSA9IHJlc3VsdC5saW5lWXNjYWxlO1xyXG4gICAgeUxpbmVBeGlzID0gcmVzdWx0LnlMaW5lQXhpcztcclxuICB9XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IEdSSUQgTElORVMgPT09PT09PT09PT09PT09PT09PT1cclxuICB0aGlzLnJlbmRlckdyaWRMaW5lcyhzdmcsIHgsIHksIGhlaWdodCwgd2lkdGgsIHNlbGYpO1xyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBCQVJTIFJFTkRFUklORyA9PT09PT09PT09PT09PT09PT09PVxyXG4gIGNvbnN0IHhTdWJncm91cCA9IHRoaXMuc2V0dXBYU3ViZ3JvdXBTY2FsZShzdWJncm91cHMsIHgsIHNlbGYpO1xyXG4gIGNvbnN0IGNvbG9yID0gZDMuc2NhbGVPcmRpbmFsKClcclxuICAgIC5kb21haW4oc3ViZ3JvdXBzKVxyXG4gICAgLnJhbmdlKE9iamVjdC52YWx1ZXMobWV0YURhdGEuY29sb3JzKSk7XHJcblxyXG4gIHRoaXMucmVuZGVyQmFycyhzdmcsIGRhdGEsIHN1Ymdyb3VwcywgeCwgeFN1Ymdyb3VwLCB5LCBoZWlnaHQsIGNvbG9yLCBcclxuICAgIG1ldGFEYXRhLCBzZWxmLCBMRUZUX0FORF9SSUdIVF9TUEFDRVMsIHRlbXBTY2FsZSwgaXNyaWEpO1xyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBCQVIgTEFCRUxTID09PT09PT09PT09PT09PT09PT09XHJcbiAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnRleHRzT25CYXIgIT09IHVuZGVmaW5lZCAmJiAhdGhpcy5pc1pvb21lZE91dCkge1xyXG4gICAgdGhpcy5yZW5kZXJCYXJMYWJlbHMoc3ZnLCBkYXRhLCBzdWJncm91cHMsIHgsIHhTdWJncm91cCwgeSwgaGVpZ2h0LCBcclxuICAgICAgbWV0YURhdGEsIHNlbGYsIHRlbXBTY2FsZSwgaXNyaWEpO1xyXG4gIH1cclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gWS1BWElTIFJFTkRFUklORyA9PT09PT09PT09PT09PT09PT09PVxyXG4gIHRoaXMucmVuZGVyWUF4aXMoc3ZnLCBzdmdZQXhpc0xlZnQsIHN2Z1lBeGlzUmlnaHQsIHksIHlMaW5lQXhpcywgXHJcbiAgICBsaW5lRGF0YSwgc2VsZiwgaXNyaWEsIG1hcmdpbik7XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IEFYSVMgTEFCRUxTID09PT09PT09PT09PT09PT09PT09XHJcbiAgdGhpcy5yZW5kZXJBeGlzTGFiZWxzKHN2Zywgc3ZnWUF4aXNMZWZ0LCBzdmdZQXhpc1JpZ2h0LCBtZXRhRGF0YSwgXHJcbiAgICB3aWR0aCwgaGVpZ2h0LCBtYXJnaW4sIHNlbGYsIGlzcmlhLCBSSUdIVF9TVkdfV0lEVEgpO1xyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBUQVJHRVQgTElORSA9PT09PT09PT09PT09PT09PT09PVxyXG4gIGlmICh0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YSkge1xyXG4gICAgdGhpcy5yZW5kZXJUYXJnZXRMaW5lKHN2Zywgc3ZnWUF4aXNSaWdodCwgeSwgd2lkdGgsIFJJR0hUX1NWR19XSURUSCwgXHJcbiAgICAgIG1ldGFEYXRhLCBzZWxmKTtcclxuICB9XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IExJTkUgQ0hBUlQgPT09PT09PT09PT09PT09PT09PT1cclxuICBpZiAobGluZURhdGEpIHtcclxuICAgIHRoaXMucmVuZGVyTGluZUNoYXJ0KHN2ZywgbGluZURhdGEsIHgsIGxpbmVZc2NhbGUsIG1ldGFEYXRhLCBzZWxmKTtcclxuICB9XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IFpPT00gSEFORExJTkcgPT09PT09PT09PT09PT09PT09PT1cclxuICBpZiAodGhpcy5pc1pvb21lZE91dCkge1xyXG4gICAgdGhpcy5oYW5kbGVab29tT3V0KHN2ZywgaGVpZ2h0LCBtYXJnaW4pO1xyXG4gIH1cclxufVxyXG5cclxuLy8gPT09PT09PT09PT09PT09PT09PT0gSEVMUEVSIE1FVEhPRFMgPT09PT09PT09PT09PT09PT09PT1cclxuXHJcbnByaXZhdGUgcmVuZGVyWEF4aXMoc3ZnLCB4LCBoZWlnaHQsIG1ldGFEYXRhLCBzdWJncm91cHMsIGRhdGEsIFxyXG4gIHNob3J0VGlja0xlbmd0aEJnLCBsb25nVGlja0xlbmd0aEJnLCBzZWxmLCBpc3JpYSwgaXNNb2JpbGUpIHtcclxuICBcclxuICBsZXQgYWx0ZXJuYXRlX3RleHQgPSBmYWxzZTtcclxuXHJcbiAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzTXVsdGlDaGFydEdyaWRMaW5lID09PSB1bmRlZmluZWQpIHtcclxuICAgIC8vIE5vcm1hbCB0aWNrcyBmb3IgZGFzaGJvYXJkIGNoYXJ0c1xyXG4gICAgc3ZnLmFwcGVuZCgnZycpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICd4MSBheGlzMScpXHJcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsJHtoZWlnaHR9KWApXHJcbiAgICAgIC5jYWxsKGQzLmF4aXNCb3R0b20oeCkpXHJcbiAgICAgIC5jYWxsKChnKSA9PiBnLnNlbGVjdCgnLmRvbWFpbicpLnJlbW92ZSgpKTtcclxuXHJcbiAgICBzdmcuc2VsZWN0QWxsKCdnLngxLmF4aXMxIGcudGljayBsaW5lJykucmVtb3ZlKCk7XHJcblxyXG4gICAgY29uc3QgeU9mZnNldCA9IHN1Ymdyb3Vwcy5sZW5ndGggPiAxICYmICFtZXRhRGF0YS54TGFiZWwgPyAzMiA6IDA7XHJcbiAgICBzdmcuc2VsZWN0QWxsKCdnLngxLmF4aXMxIGcudGljayB0ZXh0JylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi14YXhpcy1sYWJlbHMtdGV4dHMtZHJpbGxkb3duJylcclxuICAgICAgLnN0eWxlKCdmaWxsJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJylcclxuICAgICAgLmF0dHIoJ3knLCB5T2Zmc2V0IHx8IG51bGwpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICAvLyBCaWdnZXIgdGlja3MgZm9yIHdlZWtseSBjaGFydHNcclxuICAgIHN2Zy5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAneDEgYXhpczEnKVxyXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgwLCR7aGVpZ2h0fSlgKVxyXG4gICAgICAuY2FsbChkMy5heGlzQm90dG9tKHgpLnRpY2tTaXplKDApKVxyXG4gICAgICAuY2FsbCgoZykgPT4gZy5zZWxlY3QoJy5kb21haW4nKS5hdHRyKCdmaWxsJywgJ25vbmUnKSk7XHJcblxyXG4gICAgLy8gQWx0ZXJuYXRlIHRpY2sgbGluZSBzaXplc1xyXG4gICAgc3ZnLnNlbGVjdEFsbCgnZy54MS5heGlzMSBnLnRpY2sgbGluZScpLmF0dHIoJ3kyJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICBpZiAoYWx0ZXJuYXRlX3RleHQgJiYgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNOb0FsdGVybmF0ZVhheGlzVGV4dCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgYWx0ZXJuYXRlX3RleHQgPSBmYWxzZTtcclxuICAgICAgICByZXR1cm4gbG9uZ1RpY2tMZW5ndGhCZyAtIDc7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYWx0ZXJuYXRlX3RleHQgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiBzaG9ydFRpY2tMZW5ndGhCZyAtIDQ7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGFsdGVybmF0ZV90ZXh0ID0gZmFsc2U7XHJcblxyXG4gICAgLy8gWC1heGlzIGxhYmVsIHRleHRzXHJcbiAgICBzdmcuc2VsZWN0QWxsKCdnLngxLmF4aXMxIGcudGljayB0ZXh0JylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi14YXhpcy1sYWJlbHMtdGV4dHMtd2Vla2x5Y2hhcnRzJylcclxuICAgICAgLmF0dHIoJ3knLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmlzRnVsbFNjcmVlbikge1xyXG4gICAgICAgICAgcmV0dXJuIHNob3J0VGlja0xlbmd0aEJnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYWx0ZXJuYXRlX3RleHQpIHtcclxuICAgICAgICAgIGFsdGVybmF0ZV90ZXh0ID0gZmFsc2U7XHJcbiAgICAgICAgICByZXR1cm4gbG9uZ1RpY2tMZW5ndGhCZztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgYWx0ZXJuYXRlX3RleHQgPSB0cnVlO1xyXG4gICAgICAgICAgcmV0dXJuIHNob3J0VGlja0xlbmd0aEJnO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyBBcHBseSBsYWJlbHMgb24gc2FtZSBsaW5lIGNvbmZpZ3VyYXRpb25cclxuICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueExhYmVsc09uU2FtZUxpbmUpIHtcclxuICAgIHRoaXMuYXBwbHlYTGFiZWxzT25TYW1lTGluZShzdmcsIHN1Ymdyb3VwcywgZGF0YSwgbWV0YURhdGEsIHNlbGYsIFxyXG4gICAgICBzaG9ydFRpY2tMZW5ndGhCZywgaXNNb2JpbGUsIGlzcmlhKTtcclxuICB9XHJcblxyXG4gIC8vIE1vYmlsZSBvdmVycmlkZSBmb3IgUklBXHJcbiAgaWYgKGlzcmlhICYmIHNlbGYuY2hhcnREYXRhLmRhdGEubGVuZ3RoID4gOCkge1xyXG4gICAgc3ZnLnNlbGVjdEFsbCgnZy54MS5heGlzMSBnLnRpY2sgdGV4dCcpXHJcbiAgICAgIC5jbGFzc2VkKCdtb2JpbGUteGF4aXMtb3ZlcnJpZGUnLCB0cnVlKVxyXG4gICAgICAudGV4dCgoZDogc3RyaW5nKSA9PiBkLnN1YnN0cmluZygwLCAzKSlcclxuICAgICAgLnN0eWxlKCdmb250LXNpemUnLCAnMTJweCcpXHJcbiAgICAgIC5hdHRyKCd5JywgNSlcclxuICAgICAgLmF0dHIoJ3gnLCA1KVxyXG4gICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpO1xyXG4gIH1cclxuXHJcbiAgLy8gTW9iaWxlIG92ZXJyaWRlIC0gY2hlY2sgZm9yIHNpbmdsZS1ncm91cCBkYXRlIGNoYXJ0cyBmaXJzdFxyXG4gIGlmIChpc01vYmlsZSkge1xyXG4gICAgY29uc3QgdGV4dE5vZGVzID0gc3ZnLnNlbGVjdEFsbCgnZy54MS5heGlzMSBnLnRpY2sgdGV4dCcpO1xyXG4gICAgXHJcbiAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGRhdGVzIGluIHgtYXhpcyBhbmQgc2luZ2xlIGdyb3VwXHJcbiAgICBsZXQgaGFzRGF0ZVZhbHVlcyA9IGZhbHNlO1xyXG4gICAgdGV4dE5vZGVzLmVhY2goZnVuY3Rpb24oZCkge1xyXG4gICAgICAvLyBDaGVjayBmb3IgZGF0ZSB2YWx1ZXMgdXNpbmcgYm90aCBEYXRlLnBhcnNlIGFuZCByZWdleCBmb3IgZGF0ZSBmb3JtYXRcclxuICAgICAgICBjb25zdCBpc0RhdGVTdHJpbmcgPVxyXG4gICAgL15cXGR7MSw0fVstXFwvXVxcZHsxLDJ9Wy1cXC9dXFxkezEsNH0kLy50ZXN0KGQudHJpbSgpKSB8fFxyXG4gICAgL14oXFxkezEsNH1bLVxcL11cXGR7MSwyfVstXFwvXVxcZHsxLDR9KVxccypbLeKAk11cXHMqKFxcZHsxLDR9Wy1cXC9dXFxkezEsMn1bLVxcL11cXGR7MSw0fSkkLy50ZXN0KGQudHJpbSgpKTtcclxuICAgICAgaWYgKCFoYXNEYXRlVmFsdWVzICYmIGlzRGF0ZVN0cmluZykge1xyXG4gICAgICAgIGhhc0RhdGVWYWx1ZXMgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoaGFzRGF0ZVZhbHVlcyAmJiBzdWJncm91cHMgJiYgc3ViZ3JvdXBzLmxlbmd0aCA8IDMpIHtcclxuICAgICAgLy8gRm9yIHNpbmdsZSBjaGFydCB3aXRoIGRhdGVzLCBlbnN1cmUgaG9yaXpvbnRhbCBkaXNwbGF5XHJcbiAgICAgIHRleHROb2Rlc1xyXG4gICAgICAgIC5zdHlsZSgnd3JpdGluZy1tb2RlJywgJ2hvcml6b250YWwtdGInKSAgLy8gRXhwbGljaXRseSBzZXQgaG9yaXpvbnRhbFxyXG4gICAgICAgIC5jbGFzc2VkKCdtb2JpbGUteGF4aXMtb3ZlcnJpZGUnLCBmYWxzZSkgLy8gUmVtb3ZlIHZlcnRpY2FsIGNsYXNzXHJcbiAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICdyb3RhdGUoMCknKSAgICAgICAgICAvLyBSZW1vdmUgYW55IHJvdGF0aW9uXHJcbiAgICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpICAgICAgICAgICAvLyBDZW50ZXIgYWxpZ25cclxuICAgICAgICAuYXR0cigneScsIDIwKSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHVzaCBkb3duIGEgYml0XHJcbiAgICAgICAgLmF0dHIoJ2R4JywgJzAnKSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IGFueSB4IG9mZnNldFxyXG4gICAgICAgIC5hdHRyKCdkeScsICcwJyk7ICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXNldCBhbnkgeSBvZmZzZXRcclxuICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNIZWFkZXJWaXNpYmxlKSB7XHJcbiAgICAgIC8vIERlZmF1bHQgbW9iaWxlIGJlaGF2aW9yIGZvciBub24tZGF0ZSBvciBtdWx0aS1ncm91cFxyXG4gICAgICB0ZXh0Tm9kZXMuY2xhc3NlZCgnbW9iaWxlLXhheGlzLW92ZXJyaWRlJywgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5wcml2YXRlIGFwcGx5WExhYmVsc09uU2FtZUxpbmUoc3ZnLCBzdWJncm91cHMsIGRhdGEsIG1ldGFEYXRhLCBzZWxmLCBcclxuICBzaG9ydFRpY2tMZW5ndGhCZywgaXNNb2JpbGUsIGlzcmlhKSB7XHJcbiAgXHJcbiAgY29uc3QgeEF4aXNMYWJlbHMgPSBzdmcuc2VsZWN0QWxsKCdnLngxLmF4aXMxIGcudGljayB0ZXh0JylcclxuICAgIC5hdHRyKCdjbGFzcycsICdsaWIteGF4aXMtbGFiZWxzLXRleHRzLWRyaWxsZG93bicpXHJcbiAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHRoaXMuaXNIZWFkZXJWaXNpYmxlID8gJzE4cHgnIDogJzE0cHgnKVxyXG4gICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXHJcbiAgICAuYXR0cigneScsIChkKSA9PiB0aGlzLmNhbGN1bGF0ZVhMYWJlbFlQb3NpdGlvbihkLCBzdWJncm91cHMsIGRhdGEsIG1ldGFEYXRhLCBzZWxmLCBzaG9ydFRpY2tMZW5ndGhCZykpXHJcbiAgICAuYXR0cigneCcsIChkKSA9PiAoc2VsZi5jaGFydERhdGEuZGF0YS5sZW5ndGggPiA4ICYmICFzZWxmLmlzWm9vbWVkT3V0KSA/IDEgOiAwKVxyXG4gICAgLnRleHQoKGQpID0+IHRoaXMuZm9ybWF0WExhYmVsVGV4dChkLCBkYXRhLCBtZXRhRGF0YSwgc3ViZ3JvdXBzLCBzZWxmLCBpc01vYmlsZSkpO1xyXG5cclxuICAvLyBBcHBseSB3cml0aW5nLW1vZGUgZm9yIGdyb3VwZWQgY2hhcnRzIHdpdGggZGF0ZSBsYWJlbHMgaW4gem9vbWVkLW91dCB2aWV3XHJcbiAgeEF4aXNMYWJlbHMuZWFjaChmdW5jdGlvbih0aGlzOiBTVkdUZXh0RWxlbWVudCwgZDogYW55KSB7XHJcbiAgICBjb25zdCBpc0RhdGVMYWJlbCA9IC9eKFxcZHsyLDR9Wy1cXC9dKT9cXGR7Miw0fVstXFwvXVxcZHsyLDR9JC8udGVzdChkLnRyaW0oKSk7XHJcbiAgICBjb25zdCBpc1dlZWtMYWJlbCA9IC93ZWVrfHdrfHdcXGQrL2kudGVzdChkKTtcclxuICAgIFxyXG4gICAgaWYgKHN1Ymdyb3Vwcy5sZW5ndGggPiAxICYmIHNlbGYuaXNab29tZWRPdXQgJiYgZGF0YS5sZW5ndGggPiA4ICYmIGlzRGF0ZUxhYmVsICYmICFpc1dlZWtMYWJlbCkge1xyXG4gICAgICBkMy5zZWxlY3QodGhpcykuc3R5bGUoJ3dyaXRpbmctbW9kZScsICdzaWRld2F5cy1scicpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG5cclxuICAvLyBBZGQgc2Vjb25kIGxpbmUgZm9yIG5vbi1kYXRlIGxhYmVscyBvbiBkZXNrdG9wXHJcbiAgaWYgKCFpc01vYmlsZSkge1xyXG4gICAgc3ZnLnNlbGVjdEFsbCgnZy54MS5heGlzMSBnLnRpY2snKVxyXG4gICAgICAuZmlsdGVyKChkKSA9PiAhL1xcZHsyLDR9Wy1cXC9dLy50ZXN0KGQpKVxyXG4gICAgICAuYXBwZW5kKCd0ZXh0JylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi14YXhpcy1sYWJlbHMtdGV4dHMtZHJpbGxkb3duJylcclxuICAgICAgLmF0dHIoJ3knLCAzMClcclxuICAgICAgLmF0dHIoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKVxyXG4gICAgICAuYXR0cigneCcsIChkKSA9PiAoc2VsZi5jaGFydERhdGEuZGF0YS5sZW5ndGggPiA4ICYmICFzZWxmLmlzWm9vbWVkT3V0KSA/IDEgOiAwKVxyXG4gICAgICAudGV4dCgoZCkgPT4ge1xyXG4gICAgICAgIGlmIChkLnRyaW0oKS5pbmRleE9mKCcgJykgPiAtMSkge1xyXG4gICAgICAgICAgcmV0dXJuIGQudHJpbSgpLnN1YnN0cmluZyhkLmluZGV4T2YoJyAnKSwgZC5sZW5ndGgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG5wcml2YXRlIGNhbGN1bGF0ZVhMYWJlbFlQb3NpdGlvbihkLCBzdWJncm91cHMsIGRhdGEsIG1ldGFEYXRhLCBzZWxmLCBzaG9ydFRpY2tMZW5ndGhCZykge1xyXG4gIC8vIEZvciBncm91cGVkIGJhciBjaGFydHMgd2l0aCBtYW55IGJhcnMgYW5kIHhMYWJlbCBwcmVzZW50XHJcbiAgaWYgKHN1Ymdyb3Vwcy5sZW5ndGggPiAxICYmIGRhdGEubGVuZ3RoID4gOCAmJiBtZXRhRGF0YS54TGFiZWwpIHtcclxuICAgIGNvbnN0IGlzRGF0ZUxhYmVsID0gL1xcZHsyLDR9Wy1cXC9dLy50ZXN0KGQpO1xyXG4gICAgcmV0dXJuIGlzRGF0ZUxhYmVsID8gc2hvcnRUaWNrTGVuZ3RoQmcgKyAxNCA6IHNob3J0VGlja0xlbmd0aEJnO1xyXG4gIH1cclxuXHJcbiAgLy8gRm9yIGdyb3VwZWQgYmFyIGNoYXJ0cyB3aXRoIG1hbnkgYmFycyBhbmQgTk8geExhYmVsXHJcbiAgaWYgKHN1Ymdyb3Vwcy5sZW5ndGggPiAxICYmIGRhdGEubGVuZ3RoID4gOCAmJiAhbWV0YURhdGEueExhYmVsKSB7XHJcbiAgICBjb25zdCBjaGFydEhhc0V4dHJhQm90dG9tID0gc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubWFyZ2luICYmIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLm1hcmdpbi5ib3R0b20gPj0gNDA7XHJcbiAgICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNGdWxsU2NyZWVuKSB7XHJcbiAgICAgIHJldHVybiBzaG9ydFRpY2tMZW5ndGhCZyArIDI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2hhcnRIYXNFeHRyYUJvdHRvbSA/IHNob3J0VGlja0xlbmd0aEJnIDogc2hvcnRUaWNrTGVuZ3RoQmcgKyAxMDtcclxuICB9XHJcblxyXG4gIC8vIERlZmF1bHQvZmFsbGJhY2sgbG9naWNcclxuICBsZXQgYmFzZVkgPSBzZWxmLmlzSGVhZGVyVmlzaWJsZSA/IHNob3J0VGlja0xlbmd0aEJnICsgMjUgOiBzaG9ydFRpY2tMZW5ndGhCZztcclxuICBcclxuICBpZiAoc3ViZ3JvdXBzLmxlbmd0aCA+IDEgJiYgIW1ldGFEYXRhLnhMYWJlbCAmJiBcclxuICAgICAgKC9cXGR7Miw0fVstXFwvXVxcZHsyfVstXFwvXVxcZHsyLDR9Ly50ZXN0KGQpIHx8IC9cXGR7Miw0fVstXFwvXVxcZHsyLDR9Ly50ZXN0KGQpKSkge1xyXG4gICAgYmFzZVkgPSBzZWxmLmlzSGVhZGVyVmlzaWJsZSA/IHNob3J0VGlja0xlbmd0aEJnICsgMTUgOiBzaG9ydFRpY2tMZW5ndGhCZyArIDI1O1xyXG4gIH1cclxuXHJcbiAgaWYgKC9cXGR7Miw0fVstXFwvXVxcZHsyLDR9Ly50ZXN0KGQpICYmIGQuaW5kZXhPZignICcpID4gLTEpIHtcclxuICAgIGJhc2VZICs9IDQ7XHJcbiAgfVxyXG5cclxuICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNGdWxsU2NyZWVuICYmIHN1Ymdyb3Vwcy5sZW5ndGggPiAxKSB7XHJcbiAgICBiYXNlWSA9IE1hdGgubWF4KHNob3J0VGlja0xlbmd0aEJnLCBiYXNlWSAtIDEwKTtcclxuICB9XHJcblxyXG4gIHJldHVybiBiYXNlWTtcclxufVxyXG5cclxucHJpdmF0ZSBmb3JtYXRYTGFiZWxUZXh0KGQsIGRhdGEsIG1ldGFEYXRhLCBzdWJncm91cHMsIHNlbGYsIGlzTW9iaWxlKSB7XHJcbiAgLy8gTW9iaWxlIGhhbmRsaW5nOiBrZWVwIGRhdGUgbGFiZWxzIGludGFjdCBmb3Igc2luZ2xlLXNlcmllcyBjaGFydHMgKGRvIG5vdCB0cmltKVxyXG4gIGlmIChpc01vYmlsZSkge1xyXG4gICAgY29uc3QgaXNEYXRlTGFiZWwgPSAvXFxkezIsNH1bLVxcL11cXGR7MSwyfVstXFwvXVxcZHsxLDR9Ly50ZXN0KGQpIHx8ICFpc05hTihEYXRlLnBhcnNlKGQpKTtcclxuXHJcbiAgICBpZiAoaXNEYXRlTGFiZWwgJiYgc3ViZ3JvdXBzICYmIHN1Ymdyb3Vwcy5sZW5ndGggPCAzKSB7XHJcbiAgICAgIC8vIEZvciBzaW5nbGUtc2VyaWVzIGNoYXJ0cyBvbiBtb2JpbGUsIHNob3cgZnVsbCBkYXRlIGxhYmVscyAobm8gdHJpbW1pbmcpXHJcbiAgICAgIHJldHVybiBkO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIGhlYWRlciBpcyBoaWRkZW4gKGNvbXBhY3QgbW9iaWxlKSwgdHJpbSBub24tZGF0ZSBsYWJlbHMgYXMgYmVmb3JlXHJcbiAgICBpZiAoIXNlbGYuaXNIZWFkZXJWaXNpYmxlKSB7XHJcbiAgICAgIGNvbnN0IGZpcnN0UGFydCA9IGQuc3BsaXQoL1tcXHNcXC1dKy8pWzBdO1xyXG4gICAgICByZXR1cm4gZmlyc3RQYXJ0LnN1YnN0cmluZygwLCAzKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gQ2hlY2sgaWYgdmFsdWUgc2hvdWxkIGJlIGlnbm9yZWRcclxuICBjb25zdCBpc1ZhbHVlVG9CZUlnbm9yZWQgPSBkYXRhLnNvbWUoKGluZGl2OiBhbnkpID0+IFxyXG4gICAgaW5kaXYubmFtZSAmJiBpbmRpdi5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGQudHJpbSgpLnRvTG93ZXJDYXNlKCkgJiYgXHJcbiAgICBpbmRpdlttZXRhRGF0YS5rZXlMaXN0WzBdXSA9PT0gLTFcclxuICApO1xyXG5cclxuICBpZiAoaXNWYWx1ZVRvQmVJZ25vcmVkKSB7XHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG5cclxuICAvLyBIYW5kbGUgZGF0ZSByYW5nZSBsYWJlbHNcclxuICBjb25zdCBkYXRlUmFuZ2VSZWdleCA9IC8oXFxkezIsNH1bLVxcL11cXGR7Mn1bLVxcL11cXGR7Miw0fSlcXHMqLVxccyooXFxkezIsNH1bLVxcL11cXGR7Mn1bLVxcL11cXGR7Miw0fSkvO1xyXG4gIGlmIChkYXRlUmFuZ2VSZWdleC50ZXN0KGQudHJpbSgpKSkge1xyXG4gICAgcmV0dXJuIGQudHJpbSgpLnJlcGxhY2UoZGF0ZVJhbmdlUmVnZXgsIChtLCBkMSwgZDIpID0+IGAke2QxfSAtICR7ZDJ9YCk7XHJcbiAgfVxyXG5cclxuICAvLyBTcGxpdCBkYXRlIGFuZCB3ZWVrIGxhYmVscyBpbnRvIHR3byBsaW5lc1xyXG4gIGNvbnN0IGlzRGF0ZUxhYmVsID0gL1xcZHsyLDR9Wy1cXC9dLy50ZXN0KGQpO1xyXG4gIGNvbnN0IGlzV2Vla0xhYmVsID0gL3dlZWt8d2t8d1xcZCsvaS50ZXN0KGQpO1xyXG4gIFxyXG4gIGlmIChzdWJncm91cHMubGVuZ3RoID4gMSAmJiAhc2VsZi5pc1pvb21lZE91dCAmJiBkYXRhLmxlbmd0aCA+IDggJiYgXHJcbiAgICAgIGQuaW5kZXhPZignICcpID4gLTEgJiYgKGlzRGF0ZUxhYmVsIHx8IGlzV2Vla0xhYmVsKSkge1xyXG4gICAgY29uc3QgZmlyc3QgPSBkLnN1YnN0cmluZygwLCBkLmluZGV4T2YoJyAnKSk7XHJcbiAgICBjb25zdCBzZWNvbmQgPSBkLnN1YnN0cmluZyhkLmluZGV4T2YoJyAnKSArIDEpLnRyaW0oKTtcclxuICAgIHJldHVybiBgJHtmaXJzdH1cXG4ke3NlY29uZH1gO1xyXG4gIH1cclxuXHJcbiAgLy8gSGFuZGxlIGRhdGUgbGFiZWxzIGluIG1pbmltaXplZCB2aWV3XHJcbiAgaWYgKGlzRGF0ZUxhYmVsKSB7XHJcbiAgICBpZiAoIXNlbGYuaXNIZWFkZXJWaXNpYmxlICYmIGRhdGEubGVuZ3RoID4gOCAmJiBkLmluZGV4T2YoJyAnKSA+IC0xKSB7XHJcbiAgICAgIGNvbnN0IGZpcnN0ID0gZC5zdWJzdHJpbmcoMCwgZC5pbmRleE9mKCcgJykpO1xyXG4gICAgICBjb25zdCBzZWNvbmQgPSBkLnN1YnN0cmluZyhkLmluZGV4T2YoJyAnKSArIDEpLnRyaW0oKTtcclxuICAgICAgcmV0dXJuIGAke2ZpcnN0fVxcbiR7c2Vjb25kfWA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZDtcclxuICB9XHJcblxyXG4gIC8vIEhhbmRsZSBsYWJlbHMgd2l0aCBzcGFjZXNcclxuICBpZiAoZC50cmltKCkuaW5kZXhPZignICcpID4gLTEpIHtcclxuICAgIHJldHVybiBkLnRyaW0oKS5zdWJzdHJpbmcoMCwgZC5pbmRleE9mKCcgJykpLnRvTG93ZXJDYXNlKCk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gZC50b0xvd2VyQ2FzZSgpO1xyXG59XHJcblxyXG5wcml2YXRlIGNhbGN1bGF0ZU1heFZhbHVlKGRhdGEsIGtleUxpc3QpIHtcclxuICBsZXQgbWF4VmFsdWUgPSBkMy5tYXgoZGF0YSwgKGQpID0+IGQzLm1heChrZXlMaXN0LCAoa2V5KSA9PiArZFtrZXldKSk7XHJcbiAgXHJcbiAgaWYgKG1heFZhbHVlID09PSAwKSB7XHJcbiAgICBpZiAodGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEpIHtcclxuICAgICAgbWF4VmFsdWUgPSB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXQgKyAyMDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG1heFZhbHVlID0gMTAwO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIG1heFZhbHVlO1xyXG59XHJcblxyXG5wcml2YXRlIHNldHVwTGluZVlTY2FsZShsaW5lRGF0YSwgaGVpZ2h0LCBzZWxmKSB7XHJcbiAgbGV0IG1heExpbmVWYWx1ZSA9IGQzLm1heChsaW5lRGF0YSwgKGQpID0+ICtkLnZhbHVlKTtcclxuICBtYXhMaW5lVmFsdWUgPSBtYXhMaW5lVmFsdWUgKiBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXN0b21Zc2NhbGU7XHJcblxyXG4gIGxldCBtaW5MaW5lVmFsdWUgPSBkMy5taW4obGluZURhdGEsIChkKSA9PiArZC52YWx1ZSk7XHJcbiAgaWYgKG1heExpbmVWYWx1ZSA+IDApIG1pbkxpbmVWYWx1ZSA9IG1pbkxpbmVWYWx1ZSAtIDM7XHJcbiAgaWYgKG1pbkxpbmVWYWx1ZSA+IDApIG1pbkxpbmVWYWx1ZSA9IDA7XHJcblxyXG4gIGNvbnN0IGxpbmVZc2NhbGUgPSBkMy5zY2FsZUxpbmVhcigpXHJcbiAgICAuZG9tYWluKFttaW5MaW5lVmFsdWUsIG1heExpbmVWYWx1ZV0pXHJcbiAgICAucmFuZ2UoW2hlaWdodCwgbWluTGluZVZhbHVlXSk7XHJcblxyXG4gIGNvbnN0IHlMaW5lQXhpcyA9IGQzLmF4aXNSaWdodChsaW5lWXNjYWxlKVxyXG4gICAgLnRpY2tzKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLm51bWJlck9mWVRpY2tzKVxyXG4gICAgLnRpY2tTaXplKDApXHJcbiAgICAudGlja0Zvcm1hdChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi55TGluZUF4aXNMYWJlbEZvbWF0dGVyKTtcclxuXHJcbiAgcmV0dXJuIHsgbGluZVlzY2FsZSwgeUxpbmVBeGlzIH07XHJcbn1cclxuXHJcbnByaXZhdGUgcmVuZGVyR3JpZExpbmVzKHN2ZywgeCwgeSwgaGVpZ2h0LCB3aWR0aCwgc2VsZikge1xyXG4gIC8vIFgtYXhpcyBncmlkIGJldHdlZW4gbGFiZWxzXHJcbiAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmlzWGdyaWRCZXR3ZWVuTGFiZWxzKSB7XHJcbiAgICBzdmcuYXBwZW5kKCdnJylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2dyaWQnKVxyXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke3guYmFuZHdpZHRoKCkgLyAyfSwke2hlaWdodH0pYClcclxuICAgICAgLmNhbGwoZDMuYXhpc0JvdHRvbSh4KS50aWNrU2l6ZSgtaGVpZ2h0KS50aWNrRm9ybWF0KCcnKSlcclxuICAgICAgLnN0eWxlKCdzdHJva2UtZGFzaGFycmF5JywgJzUgNScpXHJcbiAgICAgIC5zdHlsZSgnY29sb3InLCAndmFyKC0tY2hhcnQtZ3JpZC1jb2xvciwgIzk5OTk5OSknKVxyXG4gICAgICAuY2FsbCgoZykgPT4gZy5zZWxlY3QoJy5kb21haW4nKS5yZW1vdmUoKSk7XHJcbiAgfVxyXG5cclxuICAvLyBZLWF4aXMgZ3JpZFxyXG4gIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi55QXhpc0dyaWQpIHtcclxuICAgIHN2Zy5hcHBlbmQoJ2cnKVxyXG4gICAgICAuY2FsbChkMy5heGlzTGVmdCh5KS50aWNrcyhzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5udW1iZXJPZllUaWNrcykudGlja1NpemUoLXdpZHRoKSlcclxuICAgICAgLnN0eWxlKCdjb2xvcicsICd2YXIoLS1jaGFydC1heGlzLWNvbG9yLCAjQjlCOUI5KScpXHJcbiAgICAgIC5zdHlsZSgnb3BhY2l0eScsICcwLjUnKVxyXG4gICAgICAuY2FsbCgoZykgPT4gZy5zZWxlY3QoJy5kb21haW4nKS5yZW1vdmUoKS5zdHlsZSgnc3Ryb2tlJywgJ3ZhcigtLWNoYXJ0LWRvbWFpbi1jb2xvciwgIzAwMDAwMCknKSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIHN2Zy5hcHBlbmQoJ2cnKVxyXG4gICAgICAuY2FsbChkMy5heGlzTGVmdCh5KS50aWNrcyhzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5udW1iZXJPZllUaWNrcykpXHJcbiAgICAgIC5zdHlsZSgnY29sb3InLCAndmFyKC0tY2hhcnQtYXhpcy1jb2xvciwgI0I5QjlCOSknKVxyXG4gICAgICAuc3R5bGUoJ29wYWNpdHknLCAnMC41JylcclxuICAgICAgLmNhbGwoKGcpID0+IGcuc2VsZWN0KCcuZG9tYWluJylcclxuICAgICAgICAuc3R5bGUoJ3N0cm9rZScsICd2YXIoLS1jaGFydC1kb21haW4tY29sb3IsICMwMDAwMDApJylcclxuICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsICcxcHgnKSk7XHJcbiAgfVxyXG59XHJcblxyXG5wcml2YXRlIHNldHVwWFN1Ymdyb3VwU2NhbGUoc3ViZ3JvdXBzLCB4LCBzZWxmKSB7XHJcbiAgY29uc3QgeFN1Ymdyb3VwID0gZDMuc2NhbGVCYW5kKCkuZG9tYWluKHN1Ymdyb3Vwcyk7XHJcblxyXG4gIGlmIChzdWJncm91cHMubGVuZ3RoID4gMSAmJiAhdGhpcy5pc1pvb21lZE91dCkge1xyXG4gICAgeFN1Ymdyb3VwLnJhbmdlKFswLCB4LmJhbmR3aWR0aCgpXSk7XHJcbiAgfSBlbHNlIGlmIChzdWJncm91cHMubGVuZ3RoID09PSAxICYmICF0aGlzLmlzWm9vbWVkT3V0KSB7XHJcbiAgICB4U3ViZ3JvdXAucmFuZ2UoWzAsIDEwMF0pO1xyXG4gIH0gZWxzZSBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNNdWx0aUNoYXJ0R3JpZExpbmUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgeFN1Ymdyb3VwLnJhbmdlKFswLCB4LmJhbmR3aWR0aCgpXSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIHhTdWJncm91cC5yYW5nZShbMCwgeC5iYW5kd2lkdGgoKV0pO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHhTdWJncm91cDtcclxufVxyXG5cclxucHJpdmF0ZSByZW5kZXJCYXJzKHN2ZywgZGF0YSwgc3ViZ3JvdXBzLCB4LCB4U3ViZ3JvdXAsIHksIGhlaWdodCwgY29sb3IsIFxyXG4gIG1ldGFEYXRhLCBzZWxmLCBsZWZ0QW5kUmlnaHRTcGFjZXMsIHRlbXBTY2FsZSwgaXNyaWEpIHtcclxuICBcclxuICBjb25zdCBzdGF0ZSA9IHN2Zy5hcHBlbmQoJ2cnKVxyXG4gICAgLnNlbGVjdEFsbCgnLnN0YXRlJylcclxuICAgIC5kYXRhKGRhdGEpXHJcbiAgICAuZW50ZXIoKVxyXG4gICAgLmFwcGVuZCgnZycpXHJcbiAgICAuYXR0cigndHJhbnNmb3JtJywgKGQpID0+IGB0cmFuc2xhdGUoJHt4KGQubmFtZSl9LDApYCk7XHJcblxyXG4gIGNvbnN0IGJhcnMgPSBzdGF0ZS5zZWxlY3RBbGwoJ3JlY3QnKVxyXG4gICAgLmRhdGEoKGQpID0+IHRoaXMucHJlcGFyZUJhckRhdGEoZCwgc3ViZ3JvdXBzKSlcclxuICAgIC5lbnRlcigpXHJcbiAgICAuYXBwZW5kKCdyZWN0JylcclxuICAgIC5hdHRyKCdjbGFzcycsICdiYXJzJylcclxuICAgIC5vbignY2xpY2snLCAoZCkgPT4gdGhpcy5oYW5kbGVCYXJDbGljayhkLCBtZXRhRGF0YSwgc2VsZikpXHJcbiAgICAuYXR0cigneCcsIChkKSA9PiB0aGlzLmNhbGN1bGF0ZUJhclgoZCwgZGF0YSwgeCwgeFN1Ymdyb3VwLCBzZWxmLCB0ZW1wU2NhbGUpKVxyXG4gICAgLmF0dHIoJ3knLCAoZCkgPT4gdGhpcy5jYWxjdWxhdGVCYXJZKGQsIHksIGhlaWdodCwgc2VsZikpXHJcbiAgICAuYXR0cignd2lkdGgnLCAoZCkgPT4gdGhpcy5jYWxjdWxhdGVCYXJXaWR0aChkLCBkYXRhLCBzdWJncm91cHMsIHgsIHhTdWJncm91cCwgc2VsZiwgdGVtcFNjYWxlKSlcclxuICAgIC5hdHRyKCdoZWlnaHQnLCAoZCkgPT4gdGhpcy5jYWxjdWxhdGVCYXJIZWlnaHQoZCwgeSwgaGVpZ2h0LCBzZWxmKSlcclxuICAgIC5zdHlsZSgnY3Vyc29yJywgKCkgPT4gKG1ldGFEYXRhLmhhc0RyaWxsRG93biAmJiAhaXNyaWEpID8gJ3BvaW50ZXInIDogJ2RlZmF1bHQnKVxyXG4gICAgLmF0dHIoJ2ZpbGwnLCAoZCkgPT4gdGhpcy5nZXRCYXJDb2xvcihkLCBtZXRhRGF0YSwgc2VsZikpO1xyXG5cclxuICAvLyBBdHRhY2ggbW91c2UgZXZlbnRzIGlmIG5vdCBSSUFcclxuICBpZiAoIWlzcmlhICYmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5kaXNwbGF5VGl0bGVPblRvcCB8fCBcclxuICAgICAgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnRleHRzT25CYXIgPT09IHVuZGVmaW5lZCAmJiBcclxuICAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmRpc3BsYXlUaXRsZU9uVG9wID09PSB1bmRlZmluZWQpKSkge1xyXG4gICAgYmFycy5vbignbW91c2VvdXQnLCAoZCwgaSkgPT4gdGhpcy5oYW5kbGVNb3VzZU91dChzdmcpKVxyXG4gICAgICAgIC5vbignbW91c2VvdmVyJywgKGQsIGkpID0+IHRoaXMuaGFuZGxlTW91c2VPdmVyKGQsIHN2ZywgZGF0YSwgeCwgeSwgaGVpZ2h0LCBtZXRhRGF0YSwgc2VsZiwgbGVmdEFuZFJpZ2h0U3BhY2VzLCB0ZW1wU2NhbGUpKTtcclxuICB9XHJcbn1cclxuXHJcbnByaXZhdGUgcHJlcGFyZUJhckRhdGEoZCwgc3ViZ3JvdXBzKSB7XHJcbiAgY29uc3QgbmV3TGlzdDogYW55ID0gW107XHJcbiAgc3ViZ3JvdXBzLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgbmV3TGlzdC5wdXNoKHsga2V5OiBrZXksIHZhbHVlOiBkW2tleV0sIG5hbWU6IGQubmFtZSB9KTtcclxuICB9KTtcclxuICByZXR1cm4gbmV3TGlzdDtcclxufVxyXG5cclxucHJpdmF0ZSBoYW5kbGVCYXJDbGljayhkLCBtZXRhRGF0YSwgc2VsZikge1xyXG4gIGlmIChkLmtleSAhPT0gJ1RhcmdldCcpIHtcclxuICAgIGlmICghbWV0YURhdGEuYmFyV2l0aG91dENsaWNrIHx8ICFtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2subGVuZ3RoIHx8XHJcbiAgICAgICAgKCFtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2suaW5jbHVkZXMoZD8ubmFtZSkgJiYgXHJcbiAgICAgICAgICFtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2suaW5jbHVkZXMoZD8ua2V5KSkpIHtcclxuICAgICAgc2VsZi5oYW5kbGVDbGljayhkKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbnByaXZhdGUgY2FsY3VsYXRlQmFyWChkLCBkYXRhLCB4LCB4U3ViZ3JvdXAsIHNlbGYsIHRlbXBTY2FsZSkge1xyXG4gIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0RyaWxsZG93bkNoYXJ0KSB7XHJcbiAgICByZXR1cm4gdGhpcy5jYWxjdWxhdGVEcmlsbGRvd25CYXJYKGQsIGRhdGEsIHgsIHNlbGYsIHRlbXBTY2FsZSk7XHJcbiAgfVxyXG4gIHJldHVybiB4U3ViZ3JvdXAoZC5rZXkpO1xyXG59XHJcblxyXG5wcml2YXRlIGNhbGN1bGF0ZURyaWxsZG93bkJhclgoZCwgZGF0YSwgeCwgc2VsZiwgdGVtcFNjYWxlKSB7XHJcbiAgZGF0YS5mb3JFYWNoKChpbmRpdjogYW55KSA9PiB7XHJcbiAgICBpZiAoaW5kaXYubmFtZSA9PT0gZC5uYW1lKSB7XHJcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpbmRpdikuZmlsdGVyKCh0ZW1wLCBpKSA9PiBpICE9PSAwKTtcclxuICAgICAgdGVtcFNjYWxlID0gZDMuc2NhbGVCYW5kKCkuZG9tYWluKGtleXMpLnJhbmdlKFswLCB4LmJhbmR3aWR0aCgpXSk7XHJcbiAgICAgIFxyXG4gICAgICBpZiAoeC5iYW5kd2lkdGgoKSA+IDEwMCkge1xyXG4gICAgICAgIGNvbnN0IHJlZHVjZWRCYXJXaWR0aCA9IHNlbGYuaXNab29tZWRPdXQgPyA2MCA6IDMwO1xyXG4gICAgICAgIGNvbnN0IG9mZnNldCA9ICh4LmJhbmR3aWR0aCgpIC0gcmVkdWNlZEJhcldpZHRoKSAvIDI7XHJcbiAgICAgICAgdGVtcFNjYWxlLnJhbmdlKFtvZmZzZXQsIHguYmFuZHdpZHRoKCkgLSBvZmZzZXRdKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0pO1xyXG4gIHJldHVybiB0ZW1wU2NhbGUoZC5rZXkpO1xyXG59XHJcblxyXG5wcml2YXRlIGNhbGN1bGF0ZUJhclkoZCwgeSwgaGVpZ2h0LCBzZWxmKSB7XHJcbiAgaWYgKGQudmFsdWUgPT09IC0xKSB7XHJcbiAgICByZXR1cm4geSgwKTtcclxuICB9XHJcblxyXG4gIGlmIChkLnZhbHVlID49IDApIHtcclxuICAgIGNvbnN0IGJhckhlaWdodCA9IGhlaWdodCAtIHkoZC52YWx1ZSk7XHJcbiAgICBjb25zdCBtaW5IZWlnaHQgPSBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5kZWZhdWx0QmFySGVpZ2h0IHx8IDI7XHJcbiAgICByZXR1cm4gYmFySGVpZ2h0IDwgbWluSGVpZ2h0ID8geSgwKSAtIG1pbkhlaWdodCA6IHkoZC52YWx1ZSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4geSgwKTtcclxufVxyXG5cclxucHJpdmF0ZSBjYWxjdWxhdGVCYXJXaWR0aChkLCBkYXRhLCBzdWJncm91cHMsIHgsIHhTdWJncm91cCwgc2VsZiwgdGVtcFNjYWxlKSB7XHJcbiAgLy8gRm9yIGdyb3VwZWQgYmFyIGNoYXJ0cyBpbiB6b29tLWluIHZpZXdcclxuICBpZiAoc3ViZ3JvdXBzLmxlbmd0aCA+IDEgJiYgIXNlbGYuaXNab29tZWRPdXQpIHtcclxuICAgIHJldHVybiA1MDtcclxuICB9XHJcblxyXG4gIC8vIEZvciBzaW5nbGUtYmFyIGNoYXJ0cyBpbiB6b29tLWluIHZpZXdcclxuICBpZiAoc3ViZ3JvdXBzLmxlbmd0aCA9PT0gMSAmJiAhc2VsZi5pc1pvb21lZE91dCkge1xyXG4gICAgcmV0dXJuIDgwO1xyXG4gIH1cclxuXHJcbiAgLy8gRGVmYXVsdCBsb2dpYyBmb3IgZHJpbGxkb3duIGNoYXJ0c1xyXG4gIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0RyaWxsZG93bkNoYXJ0KSB7XHJcbiAgICBsZXQgY2FsY3VsYXRlZFNjYWxlID0gZDMuc2NhbGVCYW5kKCkuZG9tYWluKFtdKS5yYW5nZShbMCwgMF0pO1xyXG4gICAgXHJcbiAgICBkYXRhLmZvckVhY2goKGluZGl2OiBhbnkpID0+IHtcclxuICAgICAgaWYgKGluZGl2Lm5hbWUgPT09IGQubmFtZSkge1xyXG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpbmRpdikuZmlsdGVyKCh0ZW1wLCBpKSA9PiBpICE9PSAwKTtcclxuICAgICAgICBjYWxjdWxhdGVkU2NhbGUgPSBkMy5zY2FsZUJhbmQoKS5kb21haW4oa2V5cykucmFuZ2UoWzAsIHguYmFuZHdpZHRoKCldKTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoeC5iYW5kd2lkdGgoKSA+IDEwMCkge1xyXG4gICAgICAgICAgY29uc3QgcmVkdWNlZEJhcldpZHRoID0gc2VsZi5pc1pvb21lZE91dCA/IDYwIDogMTAwO1xyXG4gICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gKHguYmFuZHdpZHRoKCkgLSByZWR1Y2VkQmFyV2lkdGgpIC8gMjtcclxuICAgICAgICAgIGNhbGN1bGF0ZWRTY2FsZS5yYW5nZShbb2Zmc2V0LCB4LmJhbmR3aWR0aCgpIC0gb2Zmc2V0XSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIFxyXG4gICAgcmV0dXJuIGNhbGN1bGF0ZWRTY2FsZS5iYW5kd2lkdGgoKTtcclxuICB9XHJcblxyXG4gIHJldHVybiB4U3ViZ3JvdXAuYmFuZHdpZHRoKCk7XHJcbn1cclxuXHJcbnByaXZhdGUgY2FsY3VsYXRlQmFySGVpZ2h0KGQsIHksIGhlaWdodCwgc2VsZikge1xyXG4gIGlmIChkLnZhbHVlID09PSAtMSkge1xyXG4gICAgcmV0dXJuIGhlaWdodCAtIHkoMCk7XHJcbiAgfVxyXG5cclxuICBpZiAoZC52YWx1ZSA+PSAwKSB7XHJcbiAgICBjb25zdCBiYXJIZWlnaHQgPSBoZWlnaHQgLSB5KGQudmFsdWUpO1xyXG4gICAgY29uc3QgbWluSGVpZ2h0ID0gc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uZGVmYXVsdEJhckhlaWdodCB8fCAyO1xyXG4gICAgcmV0dXJuIE1hdGgubWF4KGJhckhlaWdodCwgbWluSGVpZ2h0KTtcclxuICB9XHJcblxyXG4gIHJldHVybiBoZWlnaHQgLSB5KDApO1xyXG59XHJcblxyXG5wcml2YXRlIGdldEJhckNvbG9yKGQsIG1ldGFEYXRhLCBzZWxmKSB7XHJcbiAgaWYgKGQudmFsdWUgJiYgc2VsZi5jaGFydERhdGEudGFyZ2V0TGluZURhdGEgJiYgXHJcbiAgICAgIGQudmFsdWUgPj0gcGFyc2VGbG9hdChzZWxmLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXQpICYmIFxyXG4gICAgICBzZWxmLmNoYXJ0RGF0YS5tZXRhRGF0YS5jb2xvckFib3ZlVGFyZ2V0KSB7XHJcbiAgICBcclxuICAgIGNvbnN0IGtleSA9IGQua2V5LnRvTG93ZXJDYXNlKCk7XHJcbiAgICBjb25zdCBjb2xvckFib3ZlVGFyZ2V0ID0gT2JqZWN0LmtleXMoc2VsZi5jaGFydERhdGEubWV0YURhdGEuY29sb3JBYm92ZVRhcmdldClcclxuICAgICAgLmZpbmQoayA9PiBrLnRvTG93ZXJDYXNlKCkgPT09IGtleSk7XHJcbiAgICBcclxuICAgIGlmIChjb2xvckFib3ZlVGFyZ2V0KSB7XHJcbiAgICAgIHJldHVybiBzZWxmLmNoYXJ0RGF0YS5tZXRhRGF0YS5jb2xvckFib3ZlVGFyZ2V0W2NvbG9yQWJvdmVUYXJnZXRdO1xyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gc2VsZi5jaGFydERhdGEubWV0YURhdGEuY29sb3JzW2Qua2V5XTtcclxufVxyXG5cclxucHJpdmF0ZSByZW5kZXJCYXJMYWJlbHMoc3ZnLCBkYXRhLCBzdWJncm91cHMsIHgsIHhTdWJncm91cCwgeSwgaGVpZ2h0LCBcclxuICBtZXRhRGF0YSwgc2VsZiwgdGVtcFNjYWxlLCBpc3JpYSkge1xyXG4gIFxyXG4gIGNvbnN0IHN0YXRlID0gc3ZnLnNlbGVjdEFsbCgnLnN0YXRlJyk7XHJcbiAgXHJcbiAgY29uc3QgbGFiZWxzID0gc3RhdGUuc2VsZWN0QWxsKCd0ZXh0JylcclxuICAgIC5kYXRhKChkKSA9PiB0aGlzLnByZXBhcmVCYXJEYXRhKGQsIHN1Ymdyb3VwcykpXHJcbiAgICAuZW50ZXIoKVxyXG4gICAgLmFwcGVuZCgndGV4dCcpXHJcbiAgICAuYXR0cignZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpXHJcbiAgICAuYXR0cigneCcsIDApXHJcbiAgICAuYXR0cigneScsIDApXHJcbiAgICAuYXR0cignY2xhc3MnLCAnbGliLWRhdGEtbGFiZWxzLXdlZWtseWNoYXJ0cycpXHJcbiAgICAudGV4dCgoZCkgPT4gdGhpcy5mb3JtYXRCYXJMYWJlbChkKSlcclxuICAgIC5zdHlsZSgnZmlsbCcsICcjMDAwJylcclxuICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnYm9sZCcpXHJcbiAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIChkKSA9PiB0aGlzLmNhbGN1bGF0ZUxhYmVsRm9udFNpemUoc2VsZikpXHJcbiAgICAuYXR0cigndHJhbnNmb3JtJywgKGQpID0+IHRoaXMuY2FsY3VsYXRlTGFiZWxUcmFuc2Zvcm0oZCwgZGF0YSwgeCwgeFN1Ymdyb3VwLCB5LCBzZWxmLCB0ZW1wU2NhbGUpKVxyXG4gICAgLm9uKCdjbGljaycsIChkKSA9PiB0aGlzLmhhbmRsZUJhckNsaWNrKGQsIG1ldGFEYXRhLCBzZWxmKSk7XHJcblxyXG4gIGlmICghaXNyaWEpIHtcclxuICAgIGxhYmVscy5vbignbW91c2VvdXQnLCAoKSA9PiB0aGlzLmhhbmRsZU1vdXNlT3V0KHN2ZykpXHJcbiAgICAgICAgICAub24oJ21vdXNlb3ZlcicsIChkKSA9PiB0aGlzLmhhbmRsZU1vdXNlT3ZlcihkLCBzdmcsIGRhdGEsIHgsIHksIGhlaWdodCwgbWV0YURhdGEsIHNlbGYsIDUwLCB0ZW1wU2NhbGUpKTtcclxuICB9XHJcbn1cclxuXHJcbnByaXZhdGUgZm9ybWF0QmFyTGFiZWwoZCkge1xyXG4gIGlmICghZC5rZXkgfHwgIWQudmFsdWUpIHJldHVybiAnJztcclxuICByZXR1cm4gZC5rZXkubGVuZ3RoID4gMjAgPyBkLmtleS5zdWJzdHJpbmcoMCwgMTcpICsgJy4uLicgOiBkLmtleTtcclxufVxyXG5cclxucHJpdmF0ZSBjYWxjdWxhdGVMYWJlbEZvbnRTaXplKHNlbGYpIHtcclxuICBpZiAoc2VsZi5pc1pvb21lZE91dCkgcmV0dXJuICc5cHgnO1xyXG5cclxuICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCkge1xyXG4gICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoID4gMTkwMCkgcmV0dXJuICcxOHB4JztcclxuICAgIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA8IDE0MDApIHJldHVybiAnMTBweCc7XHJcbiAgICByZXR1cm4gJzE0cHgnO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuICcxNHB4JztcclxufVxyXG5cclxucHJpdmF0ZSBjYWxjdWxhdGVMYWJlbFRyYW5zZm9ybShkLCBkYXRhLCB4LCB4U3ViZ3JvdXAsIHksIHNlbGYsIHRlbXBTY2FsZSkge1xyXG4gIGxldCBjYWxjdWxhdGVkU2NhbGU7XHJcbiAgXHJcbiAgZGF0YS5mb3JFYWNoKChpbmRpdjogYW55KSA9PiB7XHJcbiAgICBpZiAoaW5kaXYubmFtZSA9PT0gZC5uYW1lKSB7XHJcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpbmRpdikuZmlsdGVyKCh0ZW1wLCBpKSA9PiBpICE9PSAwKTtcclxuICAgICAgY2FsY3VsYXRlZFNjYWxlID0gZDMuc2NhbGVCYW5kKCkuZG9tYWluKGtleXMpLnJhbmdlKFswLCB4LmJhbmR3aWR0aCgpXSk7XHJcbiAgICAgIFxyXG4gICAgICBpZiAoeC5iYW5kd2lkdGgoKSA+IDEwMCkge1xyXG4gICAgICAgIGlmIChzZWxmLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgY29uc3QgcmVkdWNlZFdpZHRoID0gT2JqZWN0LmtleXMoc2VsZi5jaGFydERhdGEuZGF0YVswXSkubGVuZ3RoID09PSAyID8gMjAwIDogMzAwO1xyXG4gICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gKHguYmFuZHdpZHRoKCkgLSByZWR1Y2VkV2lkdGgpIC8gMjtcclxuICAgICAgICAgIGNhbGN1bGF0ZWRTY2FsZS5yYW5nZShbb2Zmc2V0LCB4LmJhbmR3aWR0aCgpIC0gb2Zmc2V0XSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IG9mZnNldCA9ICh4LmJhbmR3aWR0aCgpIC0gMTI1KSAvIDI7XHJcbiAgICAgICAgICBjYWxjdWxhdGVkU2NhbGUucmFuZ2UoW29mZnNldCwgeC5iYW5kd2lkdGgoKSAtIG9mZnNldF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0pO1xyXG5cclxuICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24udGV4dEFsd2F5c0hvcml6b250YWwpIHtcclxuICAgIHJldHVybiBgdHJhbnNsYXRlKCR7eFN1Ymdyb3VwKGQua2V5KX0sJHt5KGQudmFsdWUpIC0gM30pYDtcclxuICB9XHJcblxyXG4gIGlmICghaXNOYU4oY2FsY3VsYXRlZFNjYWxlKGQua2V5KSkpIHtcclxuICAgIHJldHVybiBgdHJhbnNsYXRlKCR7Y2FsY3VsYXRlZFNjYWxlKGQua2V5KSArIGNhbGN1bGF0ZWRTY2FsZS5iYW5kd2lkdGgoKSAqIDAuNTV9LCR7eSgwKSAtIDEwfSkgcm90YXRlKDI3MClgO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuICd0cmFuc2xhdGUoMCwwKSc7XHJcbn1cclxuXHJcbnByaXZhdGUgaGFuZGxlTW91c2VPdmVyKGQsIHN2ZywgZGF0YSwgeCwgeSwgaGVpZ2h0LCBtZXRhRGF0YSwgc2VsZiwgbGVmdEFuZFJpZ2h0U3BhY2VzLCB0ZW1wU2NhbGUpIHtcclxuICBzdmcuc2VsZWN0QWxsKCcubGliLXZlcnRpY2Fsc3RhY2stdGl0bGUtb250b3AnKS5yZW1vdmUoKTtcclxuXHJcbiAgbGV0IGNhbGN1bGF0ZWRTY2FsZTtcclxuICBsZXQgZWxlbWVudHNDb3VudGVyO1xyXG5cclxuICBkYXRhLmZvckVhY2goKGluZGl2OiBhbnkpID0+IHtcclxuICAgIGlmIChpbmRpdi5uYW1lID09PSBkLm5hbWUpIHtcclxuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGluZGl2KS5maWx0ZXIoKHRlbXAsIGkpID0+IGkgIT09IDApO1xyXG4gICAgICBlbGVtZW50c0NvdW50ZXIgPSBrZXlzLmxlbmd0aDtcclxuICAgICAgY2FsY3VsYXRlZFNjYWxlID0gZDMuc2NhbGVCYW5kKCkuZG9tYWluKGtleXMpLnJhbmdlKFswLCB4LmJhbmR3aWR0aCgpXSk7XHJcbiAgICAgIFxyXG4gICAgICBpZiAoeC5iYW5kd2lkdGgoKSA+IDEwMCkge1xyXG4gICAgICAgIGlmIChzZWxmLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgY29uc3QgcmVkdWNlZFdpZHRoID0gT2JqZWN0LmtleXMoc2VsZi5jaGFydERhdGEuZGF0YVswXSkubGVuZ3RoID09PSAyID8gMjAwIDogMzAwO1xyXG4gICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gKHguYmFuZHdpZHRoKCkgLSByZWR1Y2VkV2lkdGgpIC8gMjtcclxuICAgICAgICAgIGNhbGN1bGF0ZWRTY2FsZS5yYW5nZShbb2Zmc2V0LCB4LmJhbmR3aWR0aCgpIC0gb2Zmc2V0XSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IG9mZnNldCA9ICh4LmJhbmR3aWR0aCgpIC0gMTI1KSAvIDI7XHJcbiAgICAgICAgICBjYWxjdWxhdGVkU2NhbGUucmFuZ2UoW29mZnNldCwgeC5iYW5kd2lkdGgoKSAtIG9mZnNldF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0pO1xyXG5cclxuICBjb25zdCB4UG9zaXRpb24gPSB0aGlzLmNhbGN1bGF0ZVRvb2x0aXBYKGQsIHgsIGNhbGN1bGF0ZWRTY2FsZSwgbWV0YURhdGEsIGxlZnRBbmRSaWdodFNwYWNlcyk7XHJcbiAgY29uc3Qgd2lkdGggPSB0aGlzLmNhbGN1bGF0ZVRvb2x0aXBXaWR0aChjYWxjdWxhdGVkU2NhbGUsIG1ldGFEYXRhLCBsZWZ0QW5kUmlnaHRTcGFjZXMpO1xyXG5cclxuICBzdmcuYXBwZW5kKCdmb3JlaWduT2JqZWN0JylcclxuICAgIC5hdHRyKCd4JywgeFBvc2l0aW9uKVxyXG4gICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi12ZXJ0aWNhbHN0YWNrLXRpdGxlLW9udG9wJylcclxuICAgIC5hdHRyKCd5JywgeShkLnZhbHVlKSAtIDMgLSA0MCAtIDEwKVxyXG4gICAgLmF0dHIoJ2R5JywgZC5jbGFzcylcclxuICAgIC5hdHRyKCd3aWR0aCcsIHdpZHRoKVxyXG4gICAgLmF0dHIoJ2hlaWdodCcsIDUwKVxyXG4gICAgLmFwcGVuZCgneGh0bWw6ZGl2JylcclxuICAgIC5hdHRyKCdjbGFzcycsICd0aXRsZScpXHJcbiAgICAuc3R5bGUoJ3otaW5kZXgnLCA5OSlcclxuICAgIC5odG1sKCgpID0+IHRoaXMuZ2VuZXJhdGVUb29sdGlwSFRNTChkLCBtZXRhRGF0YSkpO1xyXG59XHJcblxyXG5wcml2YXRlIGNhbGN1bGF0ZVRvb2x0aXBYKGQsIHgsIGNhbGN1bGF0ZWRTY2FsZSwgbWV0YURhdGEsIGxlZnRBbmRSaWdodFNwYWNlcykge1xyXG4gIGlmIChtZXRhRGF0YS5oYXNEcmlsbERvd24pIHtcclxuICAgIGlmIChjYWxjdWxhdGVkU2NhbGUuYmFuZHdpZHRoKCkgKyBsZWZ0QW5kUmlnaHRTcGFjZXMgKiAyID4gMTgwKSB7XHJcbiAgICAgIHJldHVybiB4KGQubmFtZSkgKyBjYWxjdWxhdGVkU2NhbGUoZC5rZXkpICsgY2FsY3VsYXRlZFNjYWxlLmJhbmR3aWR0aCgpIC8gMiAtIDkwO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHgoZC5uYW1lKSArIGNhbGN1bGF0ZWRTY2FsZShkLmtleSkgLSBcclxuICAgICAgICAgICAoY2FsY3VsYXRlZFNjYWxlLmJhbmR3aWR0aCgpICsgbGVmdEFuZFJpZ2h0U3BhY2VzICogMikgLyAyICsgXHJcbiAgICAgICAgICAgY2FsY3VsYXRlZFNjYWxlLmJhbmR3aWR0aCgpIC8gMjtcclxuICB9XHJcbiAgcmV0dXJuIHgoZC5uYW1lKSArIGNhbGN1bGF0ZWRTY2FsZShkLmtleSkgLSBcclxuICAgICAgICAgKGNhbGN1bGF0ZWRTY2FsZS5iYW5kd2lkdGgoKSArIGxlZnRBbmRSaWdodFNwYWNlcyAqIDIpIC8gMiArIFxyXG4gICAgICAgICBjYWxjdWxhdGVkU2NhbGUuYmFuZHdpZHRoKCkgLyAyO1xyXG59XHJcblxyXG5wcml2YXRlIGNhbGN1bGF0ZVRvb2x0aXBXaWR0aChjYWxjdWxhdGVkU2NhbGUsIG1ldGFEYXRhLCBsZWZ0QW5kUmlnaHRTcGFjZXMpIHtcclxuICBpZiAobWV0YURhdGEuaGFzRHJpbGxEb3duKSB7XHJcbiAgICBpZiAoY2FsY3VsYXRlZFNjYWxlLmJhbmR3aWR0aCgpICsgbGVmdEFuZFJpZ2h0U3BhY2VzICogMiA+IDE4MCkge1xyXG4gICAgICByZXR1cm4gJzE4MHB4JztcclxuICAgIH1cclxuICAgIHJldHVybiBjYWxjdWxhdGVkU2NhbGUuYmFuZHdpZHRoKCkgKyBsZWZ0QW5kUmlnaHRTcGFjZXMgKiAyO1xyXG4gIH1cclxuICByZXR1cm4gY2FsY3VsYXRlZFNjYWxlLmJhbmR3aWR0aCgpICsgbGVmdEFuZFJpZ2h0U3BhY2VzICogMjtcclxufVxyXG5cclxucHJpdmF0ZSBnZW5lcmF0ZVRvb2x0aXBIVE1MKGQsIG1ldGFEYXRhKSB7XHJcbiAgY29uc3QgYmFyTGFiZWwgPSBkLmtleTtcclxuICBjb25zdCBkYXRhVHlwZSA9IG1ldGFEYXRhLmRhdGFUeXBlIHx8ICcnO1xyXG4gIGNvbnN0IHZhbHVlID0gZC52YWx1ZTtcclxuICBcclxuICBsZXQgaHRtbCA9IGA8c3BhbiBjbGFzcz1cInRpdGxlLWJhci1uYW1lXCI+JHtiYXJMYWJlbH08L3NwYW4+YDtcclxuICBodG1sICs9IGA8c3BhbiBjbGFzcz1cInRpdGxlLWJhci12YWx1ZVwiPjxzcGFuPiR7dmFsdWV9PC9zcGFuPiR7ZGF0YVR5cGV9PC9zcGFuPmA7XHJcbiAgXHJcbiAgcmV0dXJuIGh0bWw7XHJcbn1cclxuXHJcbnByaXZhdGUgaGFuZGxlTW91c2VPdXQoc3ZnKSB7XHJcbiAgc3ZnLnNlbGVjdEFsbCgnLmxpYi12ZXJ0aWNhbHN0YWNrLXRpdGxlLW9udG9wJykucmVtb3ZlKCk7XHJcbn1cclxuXHJcbnByaXZhdGUgcmVuZGVyWUF4aXMoc3ZnLCBzdmdZQXhpc0xlZnQsIHN2Z1lBeGlzUmlnaHQsIHksIHlMaW5lQXhpcywgbGluZURhdGEsIHNlbGYsIGlzcmlhLCBtYXJnaW4pIHtcclxuICAvLyBIaWRkZW4geS1heGlzIGZvciByZWZlcmVuY2VcclxuICBzdmcuYXBwZW5kKCdnJylcclxuICAgIC5hdHRyKCdjbGFzcycsICdsaWItc3RhY2tlZC15LWF4aXMtdGV4dCB5YXhpcy1kYXNoZWQnKVxyXG4gICAgLmF0dHIoJ3N0eWxlJywgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNDdXN0b21UZXh0U3R5bGVzKVxyXG4gICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoMCwwKScpXHJcbiAgICAuY2FsbCh5KVxyXG4gICAgLnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKTtcclxuXHJcbiAgLy8gTGVmdCB5LWF4aXNcclxuICBzdmdZQXhpc0xlZnQuYXBwZW5kKCdnJylcclxuICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi15YXhpcy1sYWJlbHMtdGV4dHMtZHJpbGxkb3duIHlheGlzLWRhc2hlZCcpXHJcbiAgICAuYXR0cignc3R5bGUnLCBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi55QXhpc0N1c3RvbVRleHRTdHlsZXMpXHJcbiAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgwLDApJylcclxuICAgIC5jYWxsKGQzLmF4aXNMZWZ0KHkpXHJcbiAgICAgIC50aWNrU2l6ZSgwKVxyXG4gICAgICAudGlja3Moc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubnVtYmVyT2ZZVGlja3MpXHJcbiAgICAgIC50aWNrRm9ybWF0KChkKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkID0gc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNMYWJlbEZvbWF0dGVyIFxyXG4gICAgICAgICAgPyBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi55QXhpc0xhYmVsRm9tYXR0ZXIoZCkgXHJcbiAgICAgICAgICA6IGQ7XHJcbiAgICAgICAgcmV0dXJuIGZvcm1hdHRlZCA+PSAxMDAwID8gZm9ybWF0dGVkIC8gMTAwMCArICdrJyA6IGZvcm1hdHRlZDtcclxuICAgICAgfSkpXHJcbiAgICAuY2FsbCgoZykgPT4ge1xyXG4gICAgICBnLnNlbGVjdCgnLmRvbWFpbicpXHJcbiAgICAgICAgLnN0eWxlKCdzdHJva2UnLCAndmFyKC0tY2hhcnQtZG9tYWluLWNvbG9yLCAjMDAwMDAwKScpXHJcbiAgICAgICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCAnMXB4Jyk7XHJcbiAgICB9KVxyXG4gICAgLnNlbGVjdEFsbCgndGV4dCcpXHJcbiAgICAuc3R5bGUoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKTtcclxuXHJcbiAgLy8gUmlnaHQgeS1heGlzIChoaWRkZW4gYnkgZGVmYXVsdClcclxuICBzdmdZQXhpc1JpZ2h0LmFwcGVuZCgnZycpXHJcbiAgICAuYXR0cignY2xhc3MnLCAnbGliLXlheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24geWF4aXMtZGFzaGVkJylcclxuICAgIC5hdHRyKCdzdHlsZScsIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzQ3VzdG9tVGV4dFN0eWxlcylcclxuICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDAsMCknKVxyXG4gICAgLmNhbGwoeSlcclxuICAgIC5zdHlsZSgnZGlzcGxheScsICdub25lJyk7XHJcblxyXG4gIC8vIExpbmUgY2hhcnQgYXhpcyBpZiBhcHBsaWNhYmxlXHJcbiAgaWYgKGxpbmVEYXRhICE9IG51bGwgJiYgbGluZURhdGEgJiYgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uc2hvd0xpbmVDaGFydEF4aXMpIHtcclxuICAgIHN2Z1lBeGlzUmlnaHQuYXBwZW5kKCdnJylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi1zdGFja2VkLXktYXhpcy10ZXh0MScpXHJcbiAgICAgIC5hdHRyKCdzdHlsZScsIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzQ3VzdG9tVGV4dFN0eWxlcylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoMCwwKScpXHJcbiAgICAgIC5jYWxsKHlMaW5lQXhpcyk7XHJcbiAgfVxyXG5cclxuICAvLyBBcHBseSBheGlzIHZpc2liaWxpdHkgY29uZmlndXJhdGlvbnNcclxuICB0aGlzLmFwcGx5QXhpc1Zpc2liaWxpdHlDb25maWcoc2VsZik7XHJcbn1cclxuXHJcbnByaXZhdGUgYXBwbHlBeGlzVmlzaWJpbGl0eUNvbmZpZyhzZWxmKSB7XHJcbiAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmlzWGF4aXNMYWJlbEhpZGRlbikge1xyXG4gICAgZDMuc2VsZWN0QWxsKCdnLmxpYi1saW5lLXgtYXhpcy10ZXh0ID4gZyA+IHRleHQnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGliLWRpc3BsYXktaGlkZGVuJyk7XHJcbiAgfVxyXG5cclxuICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNZYXhpc0xhYmVsSGlkZGVuKSB7XHJcbiAgICBkMy5zZWxlY3RBbGwoJy55YXhpcy1kYXNoZWQgPiBnID4gdGV4dCcpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICdsaWItZGlzcGxheS1oaWRkZW4nKTtcclxuICB9XHJcblxyXG4gIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1lheGlzSGlkZGVuKSB7XHJcbiAgICBkMy5zZWxlY3RBbGwoJy55YXhpcy1kYXNoZWQnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGliLWRpc3BsYXktaGlkZGVuJyk7XHJcbiAgfVxyXG5cclxuICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNZYXhpc0Rhc2hlZCkge1xyXG4gICAgZDMuc2VsZWN0QWxsKCcueWF4aXMtZGFzaGVkJylcclxuICAgICAgLnN0eWxlKCdzdHJva2UtZGFzaGFycmF5JywgJzUgNScpXHJcbiAgICAgIC5zdHlsZSgnY29sb3InLCAndmFyKC0tY2hhcnQtYXhpcy1jb2xvciwgIzk5OTk5OSknKTtcclxuICB9XHJcbn1cclxuXHJcbnByaXZhdGUgcmVuZGVyQXhpc0xhYmVscyhzdmcsIHN2Z1lBeGlzTGVmdCwgc3ZnWUF4aXNSaWdodCwgbWV0YURhdGEsIHdpZHRoLCBoZWlnaHQsIG1hcmdpbiwgc2VsZiwgaXNyaWEsIHJpZ2h0U3ZnV2lkdGgpIHtcclxuICAvLyBZLWF4aXMgbGFiZWxcclxuICBpZiAobWV0YURhdGEueUxhYmVsKSB7XHJcbiAgICBjb25zdCB5UG9zaXRpb24gPSBpc3JpYSA/IDAgLSBtYXJnaW4ubGVmdCAvIDIgLSAzMCA6IDAgLSBtYXJnaW4ubGVmdCAvIDIgLSA0MDtcclxuXHJcbiAgICBzdmdZQXhpc0xlZnQuYXBwZW5kKCd0ZXh0JylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi1heGlzLWdyb3VwLWxhYmVsIGZvbnQtc2l6ZS0xJylcclxuICAgICAgLmF0dHIoJ3N0eWxlJywgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNDdXN0b21sYWJlbFN0eWxlcylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICdyb3RhdGUoLTkwKScpXHJcbiAgICAgIC5hdHRyKCd5JywgeVBvc2l0aW9uKVxyXG4gICAgICAuYXR0cigneCcsIDAgLSBoZWlnaHQgLyAyKVxyXG4gICAgICAuYXR0cignZHknLCAnMWVtJylcclxuICAgICAgLnN0eWxlKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxyXG4gICAgICAuYXR0cignZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpO1xyXG5cclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc011bHRpQ2hhcnRHcmlkTGluZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHN2Z1lBeGlzTGVmdC5zZWxlY3RBbGwoJy5saWItYXhpcy1ncm91cC1sYWJlbCcpXHJcbiAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCAnc21hbGxlcicpXHJcbiAgICAgICAgLnRleHQobWV0YURhdGEueUxhYmVsKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHN2Zy5zZWxlY3RBbGwoJy5saWItYXhpcy1ncm91cC1sYWJlbCcpXHJcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi15bGFiZWwtd2Vla2x5Q2hhcnRzJylcclxuICAgICAgICAudGV4dChtZXRhRGF0YS55TGFiZWwudG9Mb3dlckNhc2UoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBYLWF4aXMgbGFiZWxcclxuICBpZiAobWV0YURhdGEueExhYmVsKSB7XHJcbiAgICBjb25zdCBpc0Fjcm9ueW0gPSB0aGlzLmlzTGFiZWxBY3JvbnltKG1ldGFEYXRhLnhMYWJlbCk7XHJcbiAgICBjb25zdCB4UG9zaXRpb24gPSBpc3JpYSBcclxuICAgICAgPyAoaGVpZ2h0ICsgbWFyZ2luLnRvcCArIG1hcmdpbi5ib3R0b20pIFxyXG4gICAgICA6IChoZWlnaHQgKyBtYXJnaW4udG9wICsgbWFyZ2luLmJvdHRvbSArIDQwKTtcclxuXHJcbiAgICBzdmcuYXBwZW5kKCd0ZXh0JylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgdGhpcy5nZXRYTGFiZWxDbGFzcyhzZWxmKSlcclxuICAgICAgLmF0dHIoJ3N0eWxlJywgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueEF4aXNDdXN0b21sYWJlbFN0eWxlcylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHt3aWR0aCAvIDJ9LCR7eFBvc2l0aW9ufSlgKVxyXG4gICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXHJcbiAgICAgIC5zdHlsZSgnZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpXHJcbiAgICAgIC50ZXh0KGlzQWNyb255bSA/IG1ldGFEYXRhLnhMYWJlbC50b1VwcGVyQ2FzZSgpIDogbWV0YURhdGEueExhYmVsLnRvTG93ZXJDYXNlKCkpXHJcbiAgICAgIC5zdHlsZSgndGV4dC10cmFuc2Zvcm0nLCBpc0Fjcm9ueW0gPyAnbm9uZScgOiAnY2FwaXRhbGl6ZScpO1xyXG4gIH1cclxuXHJcbiAgLy8gTGluZSB5LWF4aXMgbGFiZWxcclxuICBpZiAobWV0YURhdGEubGluZXlMYWJlbCkge1xyXG4gICAgc3ZnWUF4aXNSaWdodC5hcHBlbmQoJ3RleHQnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGliLWF4aXMtZ3JvdXAtbGFiZWwgbGliLWxpbmUtYXhpcycpXHJcbiAgICAgIC5hdHRyKCdmaWxsJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJylcclxuICAgICAgLmF0dHIoJ3N0eWxlJywgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNDdXN0b21sYWJlbFN0eWxlcylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoMCwwKSByb3RhdGUoOTApJylcclxuICAgICAgLmF0dHIoJ3knLCAtMTAwKVxyXG4gICAgICAuYXR0cigneCcsIDEwMClcclxuICAgICAgLmF0dHIoJ2R5JywgJzVlbScpXHJcbiAgICAgIC5zdHlsZSgndGV4dC1hbmNob3InLCAnbWlkZGxlJylcclxuICAgICAgLnN0eWxlKCdmb250LXNpemUnLCAnc21hbGxlcicpXHJcbiAgICAgIC50ZXh0KG1ldGFEYXRhLmxpbmV5TGFiZWwpO1xyXG4gIH1cclxuXHJcbiAgLy8gQXBwbHkgZHJpbGxkb3duIGNoYXJ0IHNwZWNpZmljIHN0eWxlc1xyXG4gIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0RyaWxsZG93bkNoYXJ0KSB7XHJcbiAgICBzdmcuc2VsZWN0QWxsKCdnLngxLmF4aXMxIGcudGljayBsaW5lJykuc3R5bGUoJ2Rpc3BsYXknLCAnbm9uZScpO1xyXG4gIH1cclxufVxyXG5cclxucHJpdmF0ZSBpc0xhYmVsQWNyb255bShsYWJlbCkge1xyXG4gIHJldHVybiAobGFiZWwubGVuZ3RoIDw9IDQgJiYgL15bQS1aXSskLy50ZXN0KGxhYmVsKSkgfHxcclxuICAgICAgICAgKGxhYmVsID09PSBsYWJlbC50b1VwcGVyQ2FzZSgpICYmIC9bQS1aXS8udGVzdChsYWJlbCkpO1xyXG59XHJcblxyXG5wcml2YXRlIGdldFhMYWJlbENsYXNzKHNlbGYpIHtcclxuICBsZXQgYmFzZUNsYXNzID0gJ2xpYi1heGlzLWdyb3VwLWxhYmVsIGZvbnQtc2l6ZS0xJztcclxuICBcclxuICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCkge1xyXG4gICAgcmV0dXJuIGJhc2VDbGFzcyArICcgbGliLXhsYWJlbC1kcmlsbGRvd25jaGFydHMnO1xyXG4gIH1cclxuICBcclxuICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNNdWx0aUNoYXJ0R3JpZExpbmUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgcmV0dXJuIGJhc2VDbGFzcyArICcgbGliLXhsYWJlbC13ZWVrbHlDaGFydHMnO1xyXG4gIH1cclxuICBcclxuICByZXR1cm4gYmFzZUNsYXNzICsgJyBsaWItYXhpcy13YXRlcmZhbGwtbGFiZWwnO1xyXG59XHJcblxyXG5wcml2YXRlIHJlbmRlclRhcmdldExpbmUoc3ZnLCBzdmdZQXhpc1JpZ2h0LCB5LCB3aWR0aCwgcmlnaHRTdmdXaWR0aCwgbWV0YURhdGEsIHNlbGYpIHtcclxuICBjb25zdCB5WmVybyA9IHkodGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEudGFyZ2V0KTtcclxuXHJcbiAgLy8gRHJhdyB0YXJnZXQgbGluZVxyXG4gIHN2Zy5hcHBlbmQoJ2xpbmUnKVxyXG4gICAgLmF0dHIoJ3gxJywgMClcclxuICAgIC5hdHRyKCd4MicsIHdpZHRoKVxyXG4gICAgLmF0dHIoJ3kxJywgeVplcm8pXHJcbiAgICAuYXR0cigneTInLCB5WmVybylcclxuICAgIC5zdHlsZSgnc3Ryb2tlLWRhc2hhcnJheScsICc1IDUnKVxyXG4gICAgLnN0eWxlKCdzdHJva2UnLCB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS5jb2xvcik7XHJcblxyXG4gIC8vIEFkZCB0YXJnZXQgbGFiZWxcclxuICBjb25zdCBkYXRhVHlwZVRlbXAgPSBtZXRhRGF0YS5kYXRhVHlwZSB8fCAnJztcclxuICBjb25zdCB0YXJnZXRMaW5lTmFtZSA9IHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLnRhcmdldE5hbWUgfHwgJ3RhcmdldCc7XHJcblxyXG4gIHN2Z1lBeGlzUmlnaHQuYXBwZW5kKCdmb3JlaWduT2JqZWN0JylcclxuICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsJHt5WmVybyAtIDMwfSlgKVxyXG4gICAgLmF0dHIoJ3dpZHRoJywgcmlnaHRTdmdXaWR0aClcclxuICAgIC5hdHRyKCdoZWlnaHQnLCA1MClcclxuICAgIC5hcHBlbmQoJ3hodG1sOmRpdicpXHJcbiAgICAuYXR0cignY2xhc3MnLCAndGFyZ2V0LWRpc3BsYXknKVxyXG4gICAgLnN0eWxlKCdjb2xvcicsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpXHJcbiAgICAuaHRtbChgPGRpdj4ke3RhcmdldExpbmVOYW1lfTwvZGl2PjxkaXY+JHtzZWxmLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXR9JHtkYXRhVHlwZVRlbXB9PC9kaXY+YCk7XHJcbn1cclxuXHJcbnByaXZhdGUgcmVuZGVyTGluZUNoYXJ0KHN2ZywgbGluZURhdGEsIHgsIGxpbmVZc2NhbGUsIG1ldGFEYXRhLCBzZWxmKSB7XHJcbiAgLy8gRHJhdyBsaW5lIHBhdGhcclxuICBzdmcuYXBwZW5kKCdwYXRoJylcclxuICAgIC5kYXR1bShsaW5lRGF0YSlcclxuICAgIC5hdHRyKCdmaWxsJywgJ25vbmUnKVxyXG4gICAgLmF0dHIoJ3N0cm9rZScsIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmxpbmVHcmFwaENvbG9yKVxyXG4gICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIDEuNSlcclxuICAgIC5hdHRyKCdkJywgZDMubGluZSgpXHJcbiAgICAgIC54KChkKSA9PiB4KGQubmFtZSkgKyB4LmJhbmR3aWR0aCgpIC8gMilcclxuICAgICAgLnkoKGQpID0+IGxpbmVZc2NhbGUoZC52YWx1ZSkpKTtcclxuXHJcbiAgLy8gQWRkIGRvdHNcclxuICBjb25zdCBkb3QgPSBzdmcuc2VsZWN0QWxsKCdteUNpcmNsZXMnKVxyXG4gICAgLmRhdGEobGluZURhdGEpXHJcbiAgICAuZW50ZXIoKVxyXG4gICAgLmFwcGVuZCgnZycpXHJcbiAgICAub24oJ2NsaWNrJywgKGQpID0+IHtcclxuICAgICAgaWYgKCFtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2sgfHwgIW1ldGFEYXRhLmJhcldpdGhvdXRDbGljay5sZW5ndGggfHxcclxuICAgICAgICAgICghbWV0YURhdGEuYmFyV2l0aG91dENsaWNrLmluY2x1ZGVzKGQ/Lm5hbWUpICYmIFxyXG4gICAgICAgICAgICFtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2suaW5jbHVkZXMoZD8ua2V5KSkpIHtcclxuICAgICAgICBzZWxmLmhhbmRsZUNsaWNrKGQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgZG90LmFwcGVuZCgnY2lyY2xlJylcclxuICAgIC5hdHRyKCdmaWxsJywgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubGluZUdyYXBoQ29sb3IpXHJcbiAgICAuYXR0cignc3Ryb2tlJywgJ25vbmUnKVxyXG4gICAgLmF0dHIoJ2N4JywgKGQpID0+IHgoZC5uYW1lKSArIHguYmFuZHdpZHRoKCkgLyAyKVxyXG4gICAgLmF0dHIoJ2N5JywgKGQpID0+IGxpbmVZc2NhbGUoZC52YWx1ZSkpXHJcbiAgICAuc3R5bGUoJ2N1cnNvcicsICgpID0+IHNlbGYuY2hhcnREYXRhLm1ldGFEYXRhLmhhc0RyaWxsRG93biA/ICdwb2ludGVyJyA6ICdkZWZhdWx0JylcclxuICAgIC5hdHRyKCdyJywgMyk7XHJcblxyXG4gIC8vIEFkZCB2YWx1ZSBsYWJlbHNcclxuICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubGluZUdyYXBoQ29sb3IpIHtcclxuICAgIGRvdC5hcHBlbmQoJ3RleHQnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnZG90JylcclxuICAgICAgLmF0dHIoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKVxyXG4gICAgICAuYXR0cignY29sb3InLCBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5saW5lR3JhcGhDb2xvcilcclxuICAgICAgLmF0dHIoJ3N0eWxlJywgJ2ZvbnQtc2l6ZTogLjg1ZW0nKVxyXG4gICAgICAuYXR0cigneCcsIChkKSA9PiB4KGQubmFtZSkgKyB4LmJhbmR3aWR0aCgpIC8gMilcclxuICAgICAgLmF0dHIoJ3knLCAoZCkgPT4gbGluZVlzY2FsZShkLnZhbHVlKSlcclxuICAgICAgLmF0dHIoJ2R5JywgJy0xZW0nKVxyXG4gICAgICAudGV4dCgoZCkgPT4gc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubGFiZWxGb3JtYXR0ZXIoZC52YWx1ZSkpO1xyXG4gIH1cclxufVxyXG5cclxucHJpdmF0ZSBoYW5kbGVab29tT3V0KHN2ZywgaGVpZ2h0LCBtYXJnaW4pIHtcclxuICBzdmcuc2VsZWN0QWxsKCcubGliLXhheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24nKVxyXG4gICAgLmVhY2goKGQsIGksIG5vZGVzKSA9PiB7XHJcbiAgICAgIGNvbnN0IHRleHQgPSBkMy5zZWxlY3Qobm9kZXNbaV0pO1xyXG4gICAgICBjb25zdCBsYWJlbCA9IHRleHQudGV4dCgpO1xyXG4gICAgICBcclxuICAgICAgaWYgKGxhYmVsLmluZGV4T2YoJ1xcbicpID4gLTEpIHtcclxuICAgICAgICBjb25zdCBsaW5lcyA9IGxhYmVsLnNwbGl0KCdcXG4nKTtcclxuICAgICAgICB0ZXh0LnRleHQobnVsbCk7XHJcbiAgICAgICAgbGluZXMuZm9yRWFjaCgobGluZSwgaWR4KSA9PiB7XHJcbiAgICAgICAgICB0ZXh0LmFwcGVuZCgndHNwYW4nKVxyXG4gICAgICAgICAgICAudGV4dChsaW5lKVxyXG4gICAgICAgICAgICAuYXR0cigneCcsIDApXHJcbiAgICAgICAgICAgIC5hdHRyKCdkeScsIGlkeCA9PT0gMCA/ICcxZW0nIDogJzEuMWVtJyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3Qgd29yZHMgPSBsYWJlbC5zcGxpdCgnICcpO1xyXG4gICAgICAgIHRleHQudGV4dChudWxsKTtcclxuICAgICAgICB3b3Jkcy5mb3JFYWNoKCh3b3JkKSA9PiB7XHJcbiAgICAgICAgICB0ZXh0LmFwcGVuZCgndHNwYW4nKS50ZXh0KHdvcmQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgLnN0eWxlKCdmaWxsJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJylcclxuICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBudWxsKTtcclxuXHJcbiAgc3ZnLnNlbGVjdCgnLngtYXhpcycpXHJcbiAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgwLCAke2hlaWdodCAtIG1hcmdpbi5ib3R0b20gKyAxMH0pYCk7XHJcbn1cclxuXHJcbnByaXZhdGUgY2FsY3VsYXRlQ2hhcnREaW1lbnNpb25zKGNoYXJ0Q29udGFpbmVyOiBhbnksIHZlcnRpY2Fsc3RhY2tlZGNvbnRhaW5lcjogYW55LCBtYXJnaW46IGFueSwgc2VsZjogYW55KSB7XHJcbiAgbGV0IHdpZHRoID0gcGFyc2VJbnQoY2hhcnRDb250YWluZXIuc3R5bGUoJ3dpZHRoJykpIC0gbWFyZ2luLmxlZnQgLSBtYXJnaW4ucmlnaHQ7XHJcbiAgY29uc3QgZGF0YUxlbmd0aCA9IHRoaXMuY2hhcnREYXRhLmRhdGEubGVuZ3RoO1xyXG5cclxuICAvLyAtLS0tIFdpZHRoIExvZ2ljIChubyBjaGFuZ2UpIC0tLS1cclxuICBpZiAoZGF0YUxlbmd0aCA+IDMwICYmIHRoaXMuaXNab29tZWRPdXQpIHtcclxuICAgIHdpZHRoID1cclxuICAgICAgd2lkdGggPiBkYXRhTGVuZ3RoICogNDBcclxuICAgICAgICA/IHRoaXMuY2hhcnREYXRhLmRyb3Bkb3duRGF0YTFcclxuICAgICAgICAgID8gZGF0YUxlbmd0aCAqIDYwXHJcbiAgICAgICAgICA6IHdpZHRoXHJcbiAgICAgICAgOiB0aGlzLmNoYXJ0RGF0YS5kcm9wZG93bkRhdGExXHJcbiAgICAgICAgPyBkYXRhTGVuZ3RoICogNjBcclxuICAgICAgICA6IGRhdGFMZW5ndGggKiA0MDtcclxuXHJcbiAgICB3aWR0aCA9IHdpZHRoID4gZGF0YUxlbmd0aCAqIDQwID8gd2lkdGggOiBkYXRhTGVuZ3RoICogNDA7XHJcbiAgfVxyXG5cclxuICBpZiAoXHJcbiAgICB0aGlzLmNoYXJ0RGF0YS5kcm9wZG93bkRhdGEyICYmXHJcbiAgICB3aWR0aCA8IGRhdGFMZW5ndGggKiAxMjAgJiZcclxuICAgIHRoaXMuaXNab29tZWRPdXRcclxuICApIHtcclxuICAgIHdpZHRoID0gZGF0YUxlbmd0aCAqIDEyMDtcclxuICB9XHJcblxyXG4gIGlmIChkYXRhTGVuZ3RoID4gOCAmJiAhdGhpcy5pc1pvb21lZE91dCkge1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLmNoYXJ0RGF0YS5kcm9wZG93bkRhdGEyICYmXHJcbiAgICAgIHdpZHRoIDwgZGF0YUxlbmd0aCAqIDI1MFxyXG4gICAgKSB7XHJcbiAgICAgIHdpZHRoID0gZGF0YUxlbmd0aCAqIDI1MDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHdpZHRoID0gZGF0YUxlbmd0aCAqIDE2MDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIC0tLS0gSGVpZ2h0IExvZ2ljIChubyBjaGFuZ2UpIC0tLS1cclxuICBsZXQgaGVpZ2h0ID1cclxuICAgIHBhcnNlSW50KHZlcnRpY2Fsc3RhY2tlZGNvbnRhaW5lci5zdHlsZSgnaGVpZ2h0JykpICpcclxuICAgICAgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnN2Z0hlaWdodCAvIDEwMCkgLVxyXG4gICAgbWFyZ2luLnRvcCAtXHJcbiAgICBtYXJnaW4uYm90dG9tO1xyXG5cclxuICBpZiAoXHJcbiAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0Z1bGxTY3JlZW4gIT09IHVuZGVmaW5lZCAmJlxyXG4gICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNGdWxsU2NyZWVuXHJcbiAgKSB7XHJcbiAgICBoZWlnaHQgPVxyXG4gICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5zdmdIZWlnaHQgIT09IDcwXHJcbiAgICAgICAgPyB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5zdmdIZWlnaHRcclxuICAgICAgICA6IHBhcnNlSW50KHZlcnRpY2Fsc3RhY2tlZGNvbnRhaW5lci5zdHlsZSgnaGVpZ2h0JykpO1xyXG4gIH1cclxuXHJcbiAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzRHJpbGxkb3duQ2hhcnQgJiYgIXRoaXMuaXNIZWFkZXJWaXNpYmxlKSB7XHJcbiAgICBoZWlnaHQgPVxyXG4gICAgICBwYXJzZUludCh2ZXJ0aWNhbHN0YWNrZWRjb250YWluZXIuc3R5bGUoJ2hlaWdodCcpKSAtXHJcbiAgICAgIG1hcmdpbi50b3AgLVxyXG4gICAgICBtYXJnaW4uYm90dG9tIC1cclxuICAgICAgMTMwO1xyXG4gIH1cclxuXHJcbiAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzSGVhZGVyVmlzaWJsZSkge1xyXG4gICAgaGVpZ2h0ID1cclxuICAgICAgcGFyc2VJbnQodmVydGljYWxzdGFja2VkY29udGFpbmVyLnN0eWxlKCdoZWlnaHQnKSkgLVxyXG4gICAgICBtYXJnaW4udG9wIC1cclxuICAgICAgbWFyZ2luLmJvdHRvbSAtXHJcbiAgICAgIDEwMDtcclxuICB9XHJcblxyXG4gIHJldHVybiB7IHdpZHRoLCBoZWlnaHQgfTtcclxufVxyXG5wcml2YXRlIGNyZWF0ZUNoYXJ0Q29udGFpbmVycyhcclxuICBjaGFydENvbnRhaW5lcjogYW55LFxyXG4gIG1hcmdpbjogYW55LFxyXG4gIGhlaWdodDogbnVtYmVyLFxyXG4gIHJpZ2h0U3ZnV2lkdGg6IG51bWJlcixcclxuICBzZWxmOiBhbnksXHJcbiAgd2lkdGg6IG51bWJlclxyXG4pIHtcclxuICAvLyBPdXRlciBjb250YWluZXJcclxuICBjb25zdCBvdXRlckNvbnRhaW5lciA9IGNoYXJ0Q29udGFpbmVyXHJcbiAgICAuYXBwZW5kKCdkaXYnKVxyXG4gICAgLmF0dHIoJ2lkJywgc2VsZi51bmlxdWVJZClcclxuICAgIC5hdHRyKCdjbGFzcycsICdvdXRlci1jb250YWluZXInKVxyXG4gICAgLnN0eWxlKCd3aWR0aCcsICcxMDAlJylcclxuICAgIC5zdHlsZSgnaGVpZ2h0JywgaGVpZ2h0KVxyXG4gICAgLnN0eWxlKCdvdmVyZmxvdy14JywgJ2hpZGRlbicpXHJcbiAgICAuc3R5bGUoJ3BhZGRpbmctbGVmdCcsIGAke21hcmdpbi5sZWZ0fXB4YClcclxuICAgIC5zdHlsZSgncGFkZGluZy1yaWdodCcsIGAke3JpZ2h0U3ZnV2lkdGh9cHhgKVxyXG4gICAgLnN0eWxlKCdtYXJnaW4tbGVmdCcsICcxNXB4Jyk7XHJcblxyXG4gIC8vIExlZnQgWS1BeGlzXHJcbiAgY29uc3Qgc3ZnWUF4aXNMZWZ0ID0gb3V0ZXJDb250YWluZXJcclxuICAgIC5hcHBlbmQoJ3N2ZycpXHJcbiAgICAuYXR0cignd2lkdGgnLCAnMTAwJylcclxuICAgIC5hdHRyKCdoZWlnaHQnLCBoZWlnaHQgKyBtYXJnaW4udG9wICsgbWFyZ2luLmJvdHRvbSArIDEwKVxyXG4gICAgLnN0eWxlKCdwb3NpdGlvbicsICdhYnNvbHV0ZScpXHJcbiAgICAuc3R5bGUoJ2xlZnQnLCAnMCcpXHJcbiAgICAuc3R5bGUoJ3otaW5kZXgnLCAxKVxyXG4gICAgLmFwcGVuZCgnZycpXHJcbiAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke21hcmdpbi5sZWZ0ICsgMTV9LCR7bWFyZ2luLnRvcH0pYCk7XHJcblxyXG4gIC8vIFJpZ2h0IFktQXhpc1xyXG4gIGNvbnN0IHN2Z1lBeGlzUmlnaHQgPSBvdXRlckNvbnRhaW5lclxyXG4gICAgLmFwcGVuZCgnc3ZnJylcclxuICAgIC5hdHRyKCd3aWR0aCcsIHJpZ2h0U3ZnV2lkdGgpXHJcbiAgICAuYXR0cignaGVpZ2h0JywgaGVpZ2h0ICsgbWFyZ2luLnRvcCArIG1hcmdpbi5ib3R0b20gKyAxMClcclxuICAgIC5zdHlsZSgncG9zaXRpb24nLCAnYWJzb2x1dGUnKVxyXG4gICAgLnN0eWxlKCdyaWdodCcsICcxMnB4JylcclxuICAgIC5zdHlsZSgnei1pbmRleCcsIDEpXHJcbiAgICAuYXBwZW5kKCdnJylcclxuICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsJHttYXJnaW4udG9wfSlgKTtcclxuXHJcbiAgLy8gSW5uZXIgc2Nyb2xsYWJsZSBjb250YWluZXJcclxuICBjb25zdCBpbm5lckNvbnRhaW5lciA9IG91dGVyQ29udGFpbmVyXHJcbiAgICAuYXBwZW5kKCdkaXYnKVxyXG4gICAgLmF0dHIoJ2NsYXNzJywgJ2lubmVyLWNvbnRhaW5lcicpXHJcbiAgICAuc3R5bGUoJ3dpZHRoJywgJzEwMCUnKVxyXG4gICAgLnN0eWxlKCdvdmVyZmxvdy14JywgJ2F1dG8nKTtcclxuXHJcbiAgLy8gTWFpbiBTVkdcclxuICBjb25zdCBzdmcgPSBpbm5lckNvbnRhaW5lclxyXG4gICAgLmFwcGVuZCgnc3ZnJylcclxuICAgIC5hdHRyKCd3aWR0aCcsIHdpZHRoIC0gcmlnaHRTdmdXaWR0aClcclxuICAgIC5hdHRyKCdoZWlnaHQnLCBoZWlnaHQgKyBtYXJnaW4udG9wICsgbWFyZ2luLmJvdHRvbSArIDYwKVxyXG4gICAgLmFwcGVuZCgnZycpXHJcbiAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgwLCR7bWFyZ2luLnRvcH0pYCk7XHJcblxyXG4gIHJldHVybiB7IG91dGVyQ29udGFpbmVyLCBzdmdZQXhpc0xlZnQsIHN2Z1lBeGlzUmlnaHQsIGlubmVyQ29udGFpbmVyLCBzdmcgfTtcclxufVxyXG4gIGhhbmRsZUNsaWNrKGQ6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuY2hhcnREYXRhLm1ldGFEYXRhLmhhc0RyaWxsRG93biB8fCBkPy50b2dnbGVGcm9tKVxyXG4gICAgICB0aGlzLmNsaWNrRXZlbnQuZW1pdChkKTtcclxuICB9XHJcbiAgaGFuZGxlSGVhZGVyTWVudUNsaWNrKGlkKSB7XHJcbiAgICB0aGlzLmhlYWRlck1lbnVjbGlja0V2ZW50LmVtaXQoaWQpO1xyXG4gIH1cclxuICBoYW5kbGVERDFDbGljayhldmVudCkge1xyXG4gICAgdGhpcy5pc0REMU9wZW4gPSB0cnVlO1xyXG4gICAgdGhpcy5pc0REMk9wZW4gPSBmYWxzZTtcclxuICB9XHJcbiAgaGFuZGxlREQyQ2xpY2soZXZlbnQpIHtcclxuICAgIHRoaXMuaXNERDJPcGVuID0gdHJ1ZTtcclxuICAgIHRoaXMuaXNERDFPcGVuID0gZmFsc2U7XHJcbiAgfVxyXG4gIGhhbmRsZUNvbXBhcmVCeUZpbHRlclNlbGVjdGlvbihldmVudCkge1xyXG4gICAgdGhpcy5jbGlja0V2ZW50LmVtaXQoZXZlbnQpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2XHJcbiAgI2dyb3VwY29udGFpbmVyXHJcbiAgY2xhc3M9XCJsaWItY2hhcnQtd3JhcHBlclwiXHJcbiAgW25nQ2xhc3NdPVwieyAnbGliLW5vLWJhY2tncm91bmQnOiBpc1RyYW5zcGFyZW50QmFja2dyb3VuZCB9XCJcclxuICBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IHZhcigtLWNhcmQtYmcpO1wiXHJcbiAgKHJlc2l6ZWQpPVwib25SZXNpemVkKCRldmVudClcIlxyXG4+XHJcbiAgPGRpdiBjbGFzcz1cImhlYWRlci1hbHRcIiAqbmdJZj1cIiFpc0hlYWRlclZpc2libGVcIj5cclxuICAgIDxsaWItY2hhcnQtaGVhZGVyLXYyXHJcbiAgICAgIFtjaGFydERhdGFdPVwiY2hhcnREYXRhXCJcclxuICAgICAgW2NoYXJ0Q29uZmlndXJhdGlvbl09XCJjaGFydENvbmZpZ3VyYXRpb25cIlxyXG4gICAgICAoY2xpY2tFdmVudCk9XCJoYW5kbGVDbGljaygkZXZlbnQpXCJcclxuICAgID48L2xpYi1jaGFydC1oZWFkZXItdjI+XHJcbiAgICA8bGliLWNoYXJ0LWhlYWRlci12M1xyXG4gICAgICBbY2hhcnREYXRhXT1cImNoYXJ0RGF0YVwiXHJcbiAgICAgIFtjaGFydENvbmZpZ3VyYXRpb25dPVwiY2hhcnRDb25maWd1cmF0aW9uXCJcclxuICAgICAgKGNvbXBhcmVCeUZpbHRlclNlbGVjdGlvbik9XCJoYW5kbGVDb21wYXJlQnlGaWx0ZXJTZWxlY3Rpb24oJGV2ZW50KVwiXHJcbiAgICAgICh6b29tSW5ab29tT3V0Q2xpY2spPVwiaGFuZGxlWm9vbWluWm9vbW91dENsaWNrKCRldmVudClcIlxyXG4gICAgPjwvbGliLWNoYXJ0LWhlYWRlci12Mz5cclxuICA8L2Rpdj5cclxuICA8bGliLWNoYXJ0LWhlYWRlci12MVxyXG4gICAgW3RpdGxlXT1cImNoYXJ0RGF0YS5tZXRhRGF0YS50aXRsZVwiXHJcbiAgICBbaGFzRHJpbGxEb3duXT1cImNoYXJ0RGF0YS5tZXRhRGF0YS5oYXNEcmlsbERvd25cIlxyXG4gICAgW2lzRWRpdEVuYWJsZWRdPVwiY2hhcnREYXRhLm1ldGFEYXRhLmlzRWRpdEVuYWJsZWRcIlxyXG4gICAgW21lbnVPcHRpb25zXT1cImNoYXJ0Q29uZmlndXJhdGlvbi5oZWFkZXJNZW51T3B0aW9uc1wiXHJcbiAgICBbaXNyaWFdPVwiY3VzdG9tQ2hhcnRDb25maWd1cmF0aW9uLmlzUmlhXCJcclxuICAgIFtzZWxlY3RlZEtwaVRvb2x0b3BdPVwiY2hhcnRDb25maWd1cmF0aW9uLnNlbGVjdGVkS3BpVG9vbHRvcFwiXHJcbiAgICAobWVudU9wdGlvbkNsaWNrRXZlbnQpPVwiaGFuZGxlSGVhZGVyTWVudUNsaWNrKCRldmVudClcIlxyXG4gICAgW2lzQWxlcnRFbmFibGVkXT1cImlzQWxlcnRFbmFibGVkXCJcclxuICAgICpuZ0lmPVwiaXNIZWFkZXJWaXNpYmxlXCJcclxuICA+PC9saWItY2hhcnQtaGVhZGVyLXYxPlxyXG4gIDxkaXZcclxuICAgICpuZ0lmPVwiXHJcbiAgICAgIGNoYXJ0RGF0YSAmJlxyXG4gICAgICBjaGFydERhdGEubWV0YURhdGEgJiZcclxuICAgICAgY2hhcnRDb25maWd1cmF0aW9uLmxlZ2VuZEp1c3RpZmllZCAmJlxyXG4gICAgICBsZWdlbmRWaXNpYmxlICYmXHJcbiAgICAgIGNoYXJ0Q29uZmlndXJhdGlvbi5sZWdlbmRBdFRvcFJpZ2h0XHJcbiAgICBcIlxyXG4gICAgY2xhc3M9XCJsZWdlbmQtaG9sZGVyLXJpZ2h0XCJcclxuICAgIFtzdHlsZS5oZWlnaHRdPVwiY2hhcnRDb25maWd1cmF0aW9uLmZvb3RlckhlaWdodFwiXHJcbiAgPlxyXG4gICAgPHVsIGNsYXNzPVwiZGlzcGxheS1mbGV4XCI+XHJcbiAgICAgIDxsaVxyXG4gICAgICAgIGNsYXNzPVwibGVnZW5kcy1wb3NpdGlvbmluZy1pbmxpbmVcIlxyXG4gICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGNoYXJ0RGF0YS5tZXRhRGF0YS5jb2xvcnMgfCBrZXl2YWx1ZSA6IGtlZXBPcmRlclwiXHJcbiAgICAgID5cclxuICAgICAgICA8c3BhblxyXG4gICAgICAgICAgY2xhc3M9XCJsaWItZG9udXQtanVzdGlmaWVkLWxhYmVsLWljb24tZHJpbGxkb3duXCJcclxuICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cIml0ZW0udmFsdWVcIlxyXG4gICAgICAgID48L3NwYW5cclxuICAgICAgICA+PHNwYW4+e3sgaXRlbS5rZXkgfX08L3NwYW4+XHJcbiAgICAgIDwvbGk+XHJcbiAgICA8L3VsPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXZcclxuICAgIFtzdHlsZS5oZWlnaHRdPVwiY2hhcnRDb25maWd1cmF0aW9uLnN2Z0hlaWdodFwiXHJcbiAgICBpZD1cImdyb3VwY2hhcnRjb250YWluZXJcIlxyXG4gICAgI2dyb3VwY2hhcnRjb250YWluZXJcclxuICAgIGNsYXNzPVwibGliLWNoYXJ0LXN2Z1wiXHJcbiAgPjwvZGl2PlxyXG5cclxuXHJcbiAgPCEtLSA8ZGl2XHJcbiAgICAqbmdJZj1cIlxyXG4gICAgICBjaGFydERhdGEgJiZcclxuICAgICAgY2hhcnREYXRhLm1ldGFEYXRhICYmXHJcbiAgICAgIGNoYXJ0Q29uZmlndXJhdGlvbi5sZWdlbmRKdXN0aWZpZWQgJiZcclxuICAgICAgbGVnZW5kVmlzaWJsZSAmJlxyXG4gICAgICAhY2hhcnRDb25maWd1cmF0aW9uLmxlZ2VuZEF0VG9wUmlnaHRcclxuICAgIFwiXHJcbiAgICBjbGFzcz1cImxpYi1kb251dC1jaGFydC1mb290ZXJcIlxyXG4gICAgW3N0eWxlLmhlaWdodF09XCJjaGFydENvbmZpZ3VyYXRpb24uZm9vdGVySGVpZ2h0XCJcclxuICA+XHJcbiAgICA8dWwgY2xhc3M9XCJsaWItZG9udXQtanVzdGlmaWVkLWxhYmVsLXdyYXBwZXJcIj5cclxuICAgICAgPGxpXHJcbiAgICAgICAgY2xhc3M9XCJsaWItZG9udXQtanVzdGlmaWVkLWxhYmVsLWl0ZW1cIlxyXG4gICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGNoYXJ0RGF0YS5tZXRhRGF0YS5jb2xvcnMgfCBrZXl2YWx1ZVwiXHJcbiAgICAgID5cclxuICAgICAgICA8c3BhblxyXG4gICAgICAgICAgY2xhc3M9XCJsaWItZG9udXQtanVzdGlmaWVkLWxhYmVsLWljb25cIlxyXG4gICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiaXRlbS52YWx1ZVwiXHJcbiAgICAgICAgPjwvc3BhblxyXG4gICAgICAgID48c3Bhbj57eyBpdGVtLmtleSB9fTwvc3Bhbj5cclxuICAgICAgPC9saT5cclxuICAgIDwvdWw+XHJcbiAgPC9kaXY+IC0tPlxyXG5cclxuXHJcbiAgPCEtLSA8ZGl2ICpuZ0lmPVwiY2hhcnRDb25maWd1cmF0aW9uPy5pc0Rpc3BsYXlCYXJEZXRhaWxzQXRCb3R0b21cIj5cclxuICAgIDxkaXZcclxuICAgICAgY2xhc3M9XCJiYXItdmFsdWVzIGxpYi1kaXNwbGF5LWZsZXggbGliLWp1c3RpZnktY29udGVudC1jZW50ZXIgbGliLWFsaWduLWl0ZW1zLWNlbnRlclwiXHJcbiAgICAgICpuZ0Zvcj1cIlxyXG4gICAgICAgIGxldCBpdGVtIG9mIGNoYXJ0RGF0YS5tZXRhRGF0YS5jb2xvcnMgfCBrZXl2YWx1ZSA6IGtlZXBPcmRlcjtcclxuICAgICAgICBsZXQgaSA9IGluZGV4XHJcbiAgICAgIFwiPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJiYXItbmFtZSBmb250LXNpemUtMVwiXHJcbiAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgIGNoYXJ0RGF0YS5kYXRhWzBdW2l0ZW0ua2V5XSAmJlxyXG4gICAgICAgICAgaSA8PSBjaGFydENvbmZpZ3VyYXRpb24uaG93bWFueUJhckRldGFpbHNUb0Rpc3BsYXlcclxuICAgICAgICBcIlxyXG4gICAgICA+XHJcbiAgICAgICAge3sgaXRlbS5rZXkgfX1cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cImJhci12YWx1ZSBsaWItZGlzcGxheS1mbGV4IGxpYi1hbGlnbi1pdGVtcy1jZW50ZXIgZm9udC1zaXplLTFcIlxyXG4gICAgICAgIFtzdHlsZS5jb2xvcl09XCJcclxuICAgICAgICAgIGNoYXJ0Q29uZmlndXJhdGlvbi5iYXJWYXVsZUNvbG9yID8gYmFyVmF1bGVDb2xvciA6IGl0ZW0udmFsdWVcclxuICAgICAgICBcIlxyXG4gICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICBjaGFydERhdGEuZGF0YVswXVtpdGVtLmtleV0gJiZcclxuICAgICAgICAgIGkgPD0gY2hhcnRDb25maWd1cmF0aW9uLmhvd21hbnlCYXJEZXRhaWxzVG9EaXNwbGF5XHJcbiAgICAgICAgXCJcclxuICAgICAgPlxyXG4gICAgICAgIHt7IGNoYXJ0RGF0YS5kYXRhWzBdW2l0ZW0ua2V5XSB9fVxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PiAtLT5cclxuPC9kaXY+XHJcbiJdfQ==
|