@sapui5/sap.fe.navigation 1.124.2 → 1.126.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -155,11 +155,12 @@ sap.ui.define(["sap/base/Log", "sap/base/assert", "sap/base/util/extend", "sap/b
|
|
|
155
155
|
* @returns The Navigation service
|
|
156
156
|
* @private
|
|
157
157
|
*/;
|
|
158
|
-
_proto._getAppNavigationServiceAsync = function _getAppNavigationServiceAsync() {
|
|
159
|
-
|
|
158
|
+
_proto._getAppNavigationServiceAsync = async function _getAppNavigationServiceAsync() {
|
|
159
|
+
const ushellContainer = sap.ui.require("sap/ushell/Container");
|
|
160
|
+
return ushellContainer === null || ushellContainer === void 0 ? void 0 : ushellContainer.getServiceAsync("Navigation").then(function (oCrossAppNavService) {
|
|
160
161
|
return oCrossAppNavService;
|
|
161
162
|
}).catch(function () {
|
|
162
|
-
Log.error("NavigationHandler:
|
|
163
|
+
Log.error("NavigationHandler: Navigation is not available.");
|
|
163
164
|
throw new NavError("NavigationHandler.NO.XAPPSERVICE");
|
|
164
165
|
});
|
|
165
166
|
}
|
|
@@ -338,7 +339,7 @@ sap.ui.define(["sap/base/Log", "sap/base/assert", "sap/base/util/extend", "sap/b
|
|
|
338
339
|
oXAppDataObj.selectionVariant = sSelectionVariant;
|
|
339
340
|
}
|
|
340
341
|
const fnNavExplace = function () {
|
|
341
|
-
const sNewHrefPromise = oCrossAppNavService.
|
|
342
|
+
const sNewHrefPromise = oCrossAppNavService.getHref(oNavArguments, oNavHandler.oComponent);
|
|
342
343
|
sNewHrefPromise.then(function (sNewHref) {
|
|
343
344
|
openWindow(sNewHref);
|
|
344
345
|
}).catch(function (oError) {
|
|
@@ -360,7 +361,7 @@ sap.ui.define(["sap/base/Log", "sap/base/assert", "sap/base/util/extend", "sap/b
|
|
|
360
361
|
if (sNavMode == "explace") {
|
|
361
362
|
fnNavExplace();
|
|
362
363
|
} else {
|
|
363
|
-
const ptoExt = oCrossAppNavService.
|
|
364
|
+
const ptoExt = oCrossAppNavService.navigate(oNavArguments, oNavHandler.oComponent);
|
|
364
365
|
// TODO: This is just a temporary solution to allow FE V2 to use toExternal promise.
|
|
365
366
|
if (oNavHandler._navigateCallback) {
|
|
366
367
|
oNavHandler._navigateCallback(ptoExt);
|
|
@@ -385,9 +386,9 @@ sap.ui.define(["sap/base/Log", "sap/base/assert", "sap/base/util/extend", "sap/b
|
|
|
385
386
|
if (sNavMode) {
|
|
386
387
|
oNavArguments.params["sap-ushell-navmode"] = bExPlace ? "explace" : "inplace";
|
|
387
388
|
}
|
|
388
|
-
oNavHandler._getAppNavigationServiceAsync().then(function (oCrossAppNavService) {
|
|
389
|
-
|
|
390
|
-
|
|
389
|
+
oNavHandler._getAppNavigationServiceAsync().then(async function (oCrossAppNavService) {
|
|
390
|
+
try {
|
|
391
|
+
const oTargets = await oCrossAppNavService.isNavigationSupported([oNavArguments], oNavHandler.oComponent);
|
|
391
392
|
if (oTargets[0].supported) {
|
|
392
393
|
if (!bExPlace) {
|
|
393
394
|
fnStoreAndNavigate(oCrossAppNavService);
|
|
@@ -399,14 +400,14 @@ sap.ui.define(["sap/base/Log", "sap/base/assert", "sap/base/util/extend", "sap/b
|
|
|
399
400
|
const oError = new NavError("NavigationHandler.isIntentSupported.notSupported");
|
|
400
401
|
fnOnError(oError);
|
|
401
402
|
}
|
|
402
|
-
})
|
|
403
|
-
|
|
404
|
-
oSupportedPromise.fail(function () {
|
|
403
|
+
} catch (oError) {
|
|
404
|
+
if (fnOnError) {
|
|
405
405
|
// technical error: could not determine if intent is supported
|
|
406
406
|
const oError = oNavHandler._createTechnicalError("NavigationHandler.isIntentSupported.failed");
|
|
407
407
|
fnOnError(oError);
|
|
408
|
-
}
|
|
408
|
+
}
|
|
409
409
|
}
|
|
410
|
+
return;
|
|
410
411
|
}).catch(function (oError) {
|
|
411
412
|
if (fnOnError) {
|
|
412
413
|
fnOnError(oError);
|
|
@@ -553,52 +554,50 @@ sap.ui.define(["sap/base/Log", "sap/base/assert", "sap/base/util/extend", "sap/b
|
|
|
553
554
|
const that = this;
|
|
554
555
|
// inner app state was not found in the AppHash, but xapp state => try to read the xapp state
|
|
555
556
|
this._getAppNavigationServiceAsync().then(function (oCrossAppNavService) {
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
557
|
+
return oCrossAppNavService.getStartupAppState(that.oComponent);
|
|
558
|
+
}).catch(function () {
|
|
559
|
+
const oError = oNavHandler._createTechnicalError("NavigationHandler.getStartupState.failed");
|
|
560
|
+
oMyDeferred.reject(oError, {}, NavType.xAppState);
|
|
561
|
+
}).then(function (oAppState) {
|
|
562
|
+
// get app state from sap-xapp-state,
|
|
563
|
+
// create a copy, not only a reference, because we want to modify the object
|
|
564
|
+
let oAppStateData = oAppState.getData();
|
|
565
|
+
let oError;
|
|
566
|
+
if (oAppStateData) {
|
|
567
|
+
try {
|
|
568
|
+
oAppStateData = JSON.parse(JSON.stringify(oAppStateData));
|
|
569
|
+
} catch (x) {
|
|
570
|
+
oError = oNavHandler._createTechnicalError("NavigationHandler.AppStateData.parseError");
|
|
571
|
+
oMyDeferred.reject(oError, oStartupParameters, NavType.xAppState);
|
|
572
|
+
return oMyDeferred.promise();
|
|
570
573
|
}
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
oMyDeferred.resolve(oAppStateData, oStartupParameters, NavType.xAppState);
|
|
588
|
-
}
|
|
589
|
-
} else if (oStartupParameters) {
|
|
590
|
-
parseUrlParams(oStartupParameters, aDefaultedParameters, oMyDeferred, NavType.xAppState);
|
|
574
|
+
}
|
|
575
|
+
if (oAppStateData) {
|
|
576
|
+
const oSelVar = new SelectionVariant(oAppStateData.selectionVariant);
|
|
577
|
+
const oSelVars = oNavHandler._splitInboundNavigationParameters(oSelVar, oStartupParameters, aDefaultedParameters);
|
|
578
|
+
oAppStateData.selectionVariant = oSelVars.oNavigationSelVar.toJSONString();
|
|
579
|
+
oAppStateData.oSelectionVariant = oSelVars.oNavigationSelVar;
|
|
580
|
+
oAppStateData.oDefaultedSelectionVariant = oSelVars.oDefaultedSelVar;
|
|
581
|
+
oAppStateData.bNavSelVarHasDefaultsOnly = oSelVars.bNavSelVarHasDefaultsOnly;
|
|
582
|
+
const successHandlerHybridState = function (iAppStateData, _ref, navType) {
|
|
583
|
+
oAppStateData.iAppState = iAppStateData;
|
|
584
|
+
oMyDeferred.resolve(oAppStateData, oStartupParameters, navType);
|
|
585
|
+
};
|
|
586
|
+
if (hybridIAppStateKeyParams !== undefined && iAppStateHybridDeferred !== undefined) {
|
|
587
|
+
iAppStateHybridDeferred.done(successHandlerHybridState);
|
|
588
|
+
} else if (oAppStateData[HYBRID_IAPP_STATE_KEY]) {
|
|
589
|
+
that._loadAppState(oAppStateData[HYBRID_IAPP_STATE_KEY], hybridDeferred, NavType.hybrid).done(successHandlerHybridState);
|
|
591
590
|
} else {
|
|
592
|
-
|
|
593
|
-
oError = oNavHandler._createTechnicalError("NavigationHandler.getDataFromAppState.failed");
|
|
594
|
-
oMyDeferred.reject(oError, oStartupParameters || {}, NavType.xAppState);
|
|
591
|
+
oMyDeferred.resolve(oAppStateData, oStartupParameters, NavType.xAppState);
|
|
595
592
|
}
|
|
596
|
-
})
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
593
|
+
} else if (oStartupParameters) {
|
|
594
|
+
parseUrlParams(oStartupParameters, aDefaultedParameters, oMyDeferred, NavType.xAppState);
|
|
595
|
+
} else {
|
|
596
|
+
// sap-xapp-state navigation, but ID has already expired, but URL parameters available
|
|
597
|
+
oError = oNavHandler._createTechnicalError("NavigationHandler.getDataFromAppState.failed");
|
|
598
|
+
oMyDeferred.reject(oError, oStartupParameters || {}, NavType.xAppState);
|
|
599
|
+
}
|
|
600
|
+
return;
|
|
602
601
|
}).catch(function () {
|
|
603
602
|
const oError = oNavHandler._createTechnicalError("NavigationHandler._getAppNavigationServiceAsync.failed");
|
|
604
603
|
oMyDeferred.reject(oError, {}, NavType.xAppState);
|
|
@@ -1329,7 +1328,9 @@ sap.ui.define(["sap/base/Log", "sap/base/assert", "sap/base/util/extend", "sap/b
|
|
|
1329
1328
|
* </code>
|
|
1330
1329
|
* @private
|
|
1331
1330
|
* @ui5-restricted
|
|
1332
|
-
|
|
1331
|
+
*/
|
|
1332
|
+
// eslint-disable-next-line @typescript-eslint/promise-function-async
|
|
1333
|
+
;
|
|
1333
1334
|
_proto._getAppStateKeyAndUrlParameters = function _getAppStateKeyAndUrlParameters(sSelectionVariant) {
|
|
1334
1335
|
return this.processBeforeSmartLinkPopoverOpens(undefined, sSelectionVariant, undefined, undefined);
|
|
1335
1336
|
}
|
|
@@ -1344,7 +1345,9 @@ sap.ui.define(["sap/base/Log", "sap/base/assert", "sap/base/util/extend", "sap/b
|
|
|
1344
1345
|
_proto._getAppSpecificHash = async function _getAppSpecificHash(appHash) {
|
|
1345
1346
|
try {
|
|
1346
1347
|
const crossAppService = await this._getAppNavigationServiceAsync();
|
|
1347
|
-
return crossAppService.
|
|
1348
|
+
return await crossAppService.getHref({
|
|
1349
|
+
appSpecificRoute: appHash
|
|
1350
|
+
});
|
|
1348
1351
|
} catch (error) {
|
|
1349
1352
|
const message = error instanceof Error ? error.message : String(error);
|
|
1350
1353
|
Log.error(`FE : Can not fetch App sepcific URL : ${message}`);
|
|
@@ -1588,7 +1591,7 @@ sap.ui.define(["sap/base/Log", "sap/base/assert", "sap/base/util/extend", "sap/b
|
|
|
1588
1591
|
_proto._fnSaveAppStateAsync = function _fnSaveAppStateAsync(oAppData, fnOnError) {
|
|
1589
1592
|
const oNavHandler = this;
|
|
1590
1593
|
return this._getAppNavigationServiceAsync().then(function (oCrossAppNavService) {
|
|
1591
|
-
return oCrossAppNavService.
|
|
1594
|
+
return oCrossAppNavService.createEmptyAppState(oNavHandler.oComponent);
|
|
1592
1595
|
}).then(function (oAppState) {
|
|
1593
1596
|
return oNavHandler._fnSaveAppStateWithImmediateReturn(oAppData, oAppState, fnOnError);
|
|
1594
1597
|
}).catch(function (oError) {
|
|
@@ -1615,75 +1618,73 @@ sap.ui.define(["sap/base/Log", "sap/base/assert", "sap/base/util/extend", "sap/b
|
|
|
1615
1618
|
_proto._loadAppState = function _loadAppState(sAppStateKey, oDeferred, navType) {
|
|
1616
1619
|
const oNavHandler = this;
|
|
1617
1620
|
this._getAppNavigationServiceAsync().then(function (oCrossAppNavService) {
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
}
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
|
|
1642
|
-
|
|
1643
|
-
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
|
|
1654
|
-
}
|
|
1655
|
-
if (oAppDataLoaded.valueTexts) {
|
|
1656
|
-
oAppData.valueTexts = oAppDataLoaded.valueTexts;
|
|
1657
|
-
}
|
|
1658
|
-
if (oAppDataLoaded.semanticDates) {
|
|
1659
|
-
oAppData.semanticDates = oAppDataLoaded.semanticDates;
|
|
1660
|
-
}
|
|
1661
|
-
/* In V2 case, we need the data in the below format for hybrid case */
|
|
1662
|
-
if (navType === NavType.hybrid) {
|
|
1663
|
-
oAppData.data = oAppDataLoaded;
|
|
1664
|
-
}
|
|
1665
|
-
} else {
|
|
1666
|
-
oAppData = merge(oAppData, oAppDataLoaded);
|
|
1667
|
-
if (oAppDataLoaded.selectionVariant) {
|
|
1668
|
-
/*
|
|
1669
|
-
* In case that we get an object from the stored AppData (=persistency), we need to stringify the JSON object.
|
|
1670
|
-
*/
|
|
1671
|
-
oAppData.selectionVariant = oNavHandler._ensureSelectionVariantFormatString(oAppDataLoaded.selectionVariant);
|
|
1672
|
-
oAppData.oSelectionVariant = new SelectionVariant(oAppData.selectionVariant);
|
|
1673
|
-
}
|
|
1621
|
+
return oCrossAppNavService.getAppState(oNavHandler.oComponent, sAppStateKey);
|
|
1622
|
+
}).catch(function () {
|
|
1623
|
+
const oError = oNavHandler._createTechnicalError("NavigationHandler._getAppNavigationServiceAsync.failed");
|
|
1624
|
+
oDeferred.reject(oError, {}, navType);
|
|
1625
|
+
}).then(function (oAppState) {
|
|
1626
|
+
let oAppData = {};
|
|
1627
|
+
const oAppDataLoaded = oAppState.getData();
|
|
1628
|
+
if (typeof oAppDataLoaded === "undefined") {
|
|
1629
|
+
const oError = oNavHandler._createTechnicalError("NavigationHandler.getDataFromAppState.failed");
|
|
1630
|
+
oDeferred.reject(oError, {}, navType);
|
|
1631
|
+
} else if (oNavHandler._sMode === Mode.ODataV2) {
|
|
1632
|
+
oAppData = {
|
|
1633
|
+
selectionVariant: "{}",
|
|
1634
|
+
oSelectionVariant: new SelectionVariant(),
|
|
1635
|
+
oDefaultedSelectionVariant: new SelectionVariant(),
|
|
1636
|
+
bNavSelVarHasDefaultsOnly: false,
|
|
1637
|
+
tableVariantId: "",
|
|
1638
|
+
customData: {},
|
|
1639
|
+
appStateKey: sAppStateKey,
|
|
1640
|
+
presentationVariant: {},
|
|
1641
|
+
valueTexts: {},
|
|
1642
|
+
semanticDates: {},
|
|
1643
|
+
data: {}
|
|
1644
|
+
};
|
|
1645
|
+
if (oAppDataLoaded.selectionVariant) {
|
|
1646
|
+
/*
|
|
1647
|
+
* In case that we get an object from the stored AppData (=persistency), we need to stringify the JSON object.
|
|
1648
|
+
*/
|
|
1649
|
+
oAppData.selectionVariant = oNavHandler._ensureSelectionVariantFormatString(oAppDataLoaded.selectionVariant);
|
|
1650
|
+
oAppData.oSelectionVariant = new SelectionVariant(oAppData.selectionVariant);
|
|
1651
|
+
}
|
|
1652
|
+
if (oAppDataLoaded.tableVariantId) {
|
|
1653
|
+
oAppData.tableVariantId = oAppDataLoaded.tableVariantId;
|
|
1654
|
+
}
|
|
1655
|
+
if (oAppDataLoaded.customData) {
|
|
1656
|
+
oAppData.customData = oAppDataLoaded.customData;
|
|
1674
1657
|
}
|
|
1658
|
+
if (oAppDataLoaded.presentationVariant) {
|
|
1659
|
+
oAppData.presentationVariant = oAppDataLoaded.presentationVariant;
|
|
1660
|
+
}
|
|
1661
|
+
if (oAppDataLoaded.valueTexts) {
|
|
1662
|
+
oAppData.valueTexts = oAppDataLoaded.valueTexts;
|
|
1663
|
+
}
|
|
1664
|
+
if (oAppDataLoaded.semanticDates) {
|
|
1665
|
+
oAppData.semanticDates = oAppDataLoaded.semanticDates;
|
|
1666
|
+
}
|
|
1667
|
+
/* In V2 case, we need the data in the below format for hybrid case */
|
|
1668
|
+
if (navType === NavType.hybrid) {
|
|
1669
|
+
oAppData.data = oAppDataLoaded;
|
|
1670
|
+
}
|
|
1671
|
+
} else {
|
|
1672
|
+
oAppData = merge(oAppData, oAppDataLoaded);
|
|
1673
|
+
if (oAppDataLoaded.selectionVariant) {
|
|
1674
|
+
/*
|
|
1675
|
+
* In case that we get an object from the stored AppData (=persistency), we need to stringify the JSON object.
|
|
1676
|
+
*/
|
|
1677
|
+
oAppData.selectionVariant = oNavHandler._ensureSelectionVariantFormatString(oAppDataLoaded.selectionVariant);
|
|
1678
|
+
oAppData.oSelectionVariant = new SelectionVariant(oAppData.selectionVariant);
|
|
1679
|
+
}
|
|
1680
|
+
}
|
|
1675
1681
|
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
oAppStatePromise.fail(function () {
|
|
1681
|
-
const oError = oNavHandler._createTechnicalError("NavigationHandler.getAppState.failed");
|
|
1682
|
-
oDeferred.reject(oError, {}, navType);
|
|
1683
|
-
});
|
|
1684
|
-
return oAppStatePromise;
|
|
1682
|
+
// resolve is called on passed Deferred object to trigger a call of the done method, if implemented
|
|
1683
|
+
// the done method will receive the loaded appState and the navigation type as parameters
|
|
1684
|
+
oDeferred.resolve(oAppData, {}, navType);
|
|
1685
|
+
return;
|
|
1685
1686
|
}).catch(function () {
|
|
1686
|
-
const oError = oNavHandler._createTechnicalError("NavigationHandler.
|
|
1687
|
+
const oError = oNavHandler._createTechnicalError("NavigationHandler.getAppState.failed");
|
|
1687
1688
|
oDeferred.reject(oError, {}, navType);
|
|
1688
1689
|
});
|
|
1689
1690
|
return oDeferred;
|
|
@@ -2251,4 +2252,4 @@ sap.ui.define(["sap/base/Log", "sap/base/assert", "sap/base/util/extend", "sap/b
|
|
|
2251
2252
|
const NavigationHandlerUI5Class = BaseObject.extend("sap.fe.navigation.NavigationHandler", NavigationHandler.prototype);
|
|
2252
2253
|
return NavigationHandlerUI5Class;
|
|
2253
2254
|
}, false);
|
|
2254
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOYXZUeXBlIiwiTmF2TGlicmFyeSIsIlBhcmFtSGFuZGxpbmdNb2RlIiwiU3VwcHJlc3Npb25CZWhhdmlvciIsIk1vZGUiLCJJQVBQX1NUQVRFIiwiREVGQVVMVEVEX1BBUkFNRVRFUl9QUk9QRVJUWSIsIkhZQlJJRF9JQVBQX1NUQVRFX0tFWSIsIk5hdmlnYXRpb25IYW5kbGVyIiwib0NvbnRyb2xsZXIiLCJzTW9kZSIsInNQYXJhbUhhbmRsaW5nTW9kZSIsIl9hVGVjaG5pY2FsUGFyYW1hdGVycyIsIl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhIiwic0FwcFN0YXRlS2V5Iiwib0FwcERhdGEiLCJpQ2FjaGVIaXQiLCJpQ2FjaGVNaXNzIiwiX3JJQXBwU3RhdGVPbGQiLCJSZWdFeHAiLCJfcklBcHBTdGF0ZU9sZEF0U3RhcnQiLCJfcklBcHBTdGF0ZU5ldyIsIk5hdkVycm9yIiwiVUlDb21wb25lbnQiLCJvUm91dGVyIiwiZ2V0Um91dGVyIiwib0NvbXBvbmVudCIsImdldE93bmVyQ29tcG9uZW50IiwiX2dldFJvdXRlciIsImdldEFwcENvbXBvbmVudCIsImdldENvbXBvbmVudERhdGEiLCJVUkxQYXJhbVdpbnMiLCJJbnNlcnRJblNlbE9wdCIsIlNlbFZhcldpbnMiLCJPRGF0YVYyIiwiX3NNb2RlIiwiX2dldEFwcE5hdmlnYXRpb25TZXJ2aWNlIiwic2FwIiwidXNoZWxsIiwiQ29udGFpbmVyIiwiZ2V0U2VydmljZSIsIl9nZXRBcHBOYXZpZ2F0aW9uU2VydmljZUFzeW5jIiwiZ2V0U2VydmljZUFzeW5jIiwidGhlbiIsIm9Dcm9zc0FwcE5hdlNlcnZpY2UiLCJjYXRjaCIsIkxvZyIsImVycm9yIiwiZ2V0Um91dGVyRm9yIiwicmVnaXN0ZXJOYXZpZ2F0ZUNhbGxiYWNrIiwiZm5DYWxsYmFjayIsIl9uYXZpZ2F0ZUNhbGxiYWNrIiwibmF2aWdhdGUiLCJzU2VtYW50aWNPYmplY3QiLCJzQWN0aW9uTmFtZSIsInZOYXZpZ2F0aW9uUGFyYW1ldGVycyIsIm9Jbm5lckFwcERhdGEiLCJmbk9uRXJyb3IiLCJvRXh0ZXJuYWxBcHBEYXRhIiwic05hdk1vZGUiLCJzU2VsZWN0aW9uVmFyaWFudCIsIm1QYXJhbWV0ZXJzIiwib1hBcHBEYXRhT2JqIiwib1N0YXJ0dXBQYXJhbWV0ZXJzIiwiYkV4UGxhY2UiLCJvVG1wRGF0YSIsIm9OYXZIYW5kbGVyIiwib0NvbXBvbmVudERhdGEiLCJzdGFydHVwUGFyYW1ldGVycyIsImxlbmd0aCIsInVuZGVmaW5lZCIsIm9FbnJpY2hlZFNlbFZhciIsIl9zcGxpdEluYm91bmROYXZpZ2F0aW9uUGFyYW1ldGVycyIsIlNlbGVjdGlvblZhcmlhbnQiLCJvTmF2aWdhdGlvblNlbFZhciIsInRvSlNPTlN0cmluZyIsInNlbGVjdGlvblZhcmlhbnQiLCJfcmVtb3ZlVGVjaG5pY2FsUGFyYW1ldGVycyIsInRvSlNPTk9iamVjdCIsIl9yZW1vdmVNZWFzdXJlQmFzZWRJbmZvcm1hdGlvbiIsIl9jaGVja0lzUG90ZW50aWFsbHlTZW5zaXRpdmUiLCJfZ2V0VVJMUGFyYW1ldGVyc0Zyb21TZWxlY3Rpb25WYXJpYW50Iiwib05hdkFyZ3VtZW50cyIsInRhcmdldCIsInNlbWFudGljT2JqZWN0IiwiYWN0aW9uIiwicGFyYW1zIiwiZm5OYXZpZ2F0ZSIsImZuTmF2RXhwbGFjZSIsInNOZXdIcmVmUHJvbWlzZSIsImhyZWZGb3JFeHRlcm5hbEFzeW5jIiwic05ld0hyZWYiLCJvcGVuV2luZG93Iiwib0Vycm9yIiwiX2ZuU2F2ZUFwcFN0YXRlQXN5bmMiLCJvU2F2ZUFwcFN0YXRlUmV0dXJuIiwiYXBwU3RhdGVLZXkiLCJwdG9FeHQiLCJ0b0V4dGVybmFsIiwiZm5TdG9yZUFuZE5hdmlnYXRlIiwic3RvcmVJbm5lckFwcFN0YXRlQXN5bmMiLCJyZXBsYWNlSGFzaCIsIm9TdXBwb3J0ZWRQcm9taXNlIiwiaXNOYXZpZ2F0aW9uU3VwcG9ydGVkIiwiZG9uZSIsIm9UYXJnZXRzIiwic3VwcG9ydGVkIiwiZmFpbCIsIl9jcmVhdGVUZWNobmljYWxFcnJvciIsInBhcnNlTmF2aWdhdGlvbiIsInNBcHBIYXNoIiwiSGFzaENoYW5nZXIiLCJnZXRJbnN0YW5jZSIsImdldEhhc2giLCJzSUFwcFN0YXRlIiwiX2dldElubmVyQXBwU3RhdGVLZXkiLCJ3YXJuaW5nIiwiaHlicmlkSUFwcFN0YXRlS2V5UGFyYW1zIiwiaHlicmlkRGVmZXJyZWQiLCJqUXVlcnkiLCJEZWZlcnJlZCIsImlBcHBTdGF0ZUh5YnJpZERlZmVycmVkIiwiX2xvYWRBcHBTdGF0ZSIsImh5YnJpZCIsImFEZWZhdWx0ZWRQYXJhbWV0ZXJzIiwiSlNPTiIsInBhcnNlIiwib015RGVmZXJyZWQiLCJwYXJzZVVybFBhcmFtcyIsIm9TdWJTdGFydHVwUGFyYW1ldGVycyIsImFTdWJEZWZhdWx0ZWRQYXJhbWV0ZXJzIiwib1N1Yk15RGVmZXJyZWQiLCJzTmF2VHlwZSIsIm9TZWxWYXJzIiwiaXNFbXB0eSIsIm9EZWZhdWx0ZWRTZWxWYXIiLCJ4QXBwU3RhdGUiLCJyZWplY3QiLCJyZXNvbHZlIiwiaW5pdGlhbCIsIm9BcHBTdGF0ZURhdGEiLCJvU2VsZWN0aW9uVmFyaWFudCIsIm9EZWZhdWx0ZWRTZWxlY3Rpb25WYXJpYW50IiwiYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seSIsInN1Y2Nlc3NIYW5kbGVySHlicmlkU3RhdGUiLCJpQXBwU3RhdGVEYXRhIiwiX3JlZiIsIm5hdlR5cGUiLCJpQXBwU3RhdGUiLCJmYWlsdXJlSGFuZGxlckh5YnJpZFN0YXRlIiwiYklzWGFwcFN0YXRlTmF2aWdhdGlvbiIsInRoYXQiLCJvU3RhcnR1cFByb21pc2UiLCJnZXRTdGFydHVwQXBwU3RhdGUiLCJvQXBwU3RhdGUiLCJnZXREYXRhIiwic3RyaW5naWZ5IiwieCIsInByb21pc2UiLCJvU2VsVmFyIiwiVVJMUGFyYW1zIiwic2V0VGVjaG5pY2FsUGFyYW1ldGVycyIsImFUZWNobmljYWxQYXJhbWV0ZXJzIiwiQXJyYXkiLCJpc0FycmF5IiwiZ2V0VGVjaG5pY2FsUGFyYW1ldGVycyIsImNvbmNhdCIsIl9pc1RlY2huaWNhbFBhcmFtZXRlciIsInNQYXJhbWV0ZXJOYW1lIiwidG9Mb3dlckNhc2UiLCJpbmRleE9mIiwiX2lzRkVQYXJhbWV0ZXIiLCJzUHJvcE5hbWUiLCJpIiwiYVNlbFZhclByb3BOYW1lcyIsImdldFNlbGVjdE9wdGlvbnNQcm9wZXJ0eU5hbWVzIiwicmVtb3ZlU2VsZWN0T3B0aW9uIiwib1N0YXJ0dXBQYXJhbWV0ZXJzQWRqdXN0ZWQiLCJoYXNPd25Qcm9wZXJ0eSIsImdldFBhcmFtZXRlck5hbWVzIiwibWFzc0FkZFNlbGVjdE9wdGlvbiIsImdldFZhbHVlIiwiX2FkZFBhcmFtZXRlclZhbHVlcyIsImFQcm9wTmFtZXMiLCJvU2VsVmFyaWFudCIsInNTaWduIiwic09wdGlvbiIsIm9WYWx1ZXMiLCJhZGRTZWxlY3RPcHRpb24iLCJvSGFzaENoYW5nZXIiLCJzQXBwSGFzaE9sZCIsInNBcHBIYXNoTmV3IiwiX3JlcGxhY2VJbm5lckFwcFN0YXRlS2V5IiwibUlubmVyQXBwRGF0YSIsImJJbW1lZGlhdGVIYXNoUmVwbGFjZSIsImJTa2lwSGFzaFJlcGxhY2UiLCJmblJlcGxhY2VIYXNoIiwiaXNFbXB0eU9iamVjdCIsInNBcHBTdGF0ZUtleUNhY2hlZCIsImJJbm5lckFwcERhdGFFcXVhbCIsImZuT25BZnRlclNhdmUiLCJfc2F2ZUFwcFN0YXRlQXN5bmMiLCJzdG9yZUlubmVyQXBwU3RhdGUiLCJfc2F2ZUFwcFN0YXRlIiwic3RvcmVJbm5lckFwcFN0YXRlV2l0aEltbWVkaWF0ZVJldHVybiIsIm9BcHBTdGF0ZVByb21pc2UiLCJwcm9jZXNzQmVmb3JlU21hcnRMaW5rUG9wb3Zlck9wZW5zIiwib1RhYmxlRXZlbnRQYXJhbWV0ZXJzIiwibVNlbWFudGljQXR0cmlidXRlcyIsInNlbWFudGljQXR0cmlidXRlcyIsImZuU3RvcmVYYXBwQW5kQ2FsbE9wZW4iLCJtU3ViU2VtYW50aWNBdHRyaWJ1dGVzIiwic1N1YlNlbGVjdGlvblZhcmlhbnQiLCJpU3VwcHJlc3Npb25CZWhhdmlvciIsInJhaXNlRXJyb3JPbk51bGwiLCJyYWlzZUVycm9yT25VbmRlZmluZWQiLCJvTWl4ZWRTZWxWYXIiLCJtaXhBdHRyaWJ1dGVzQW5kU2VsZWN0aW9uVmFyaWFudCIsImZuT25Db250YWluZXJTYXZlIiwic2V0U2VtYW50aWNBdHRyaWJ1dGVzIiwic2V0QXBwU3RhdGVLZXkiLCJvcGVuIiwib1N0b3JlSW5uZXJBcHBTdGF0ZVByb21pc2UiLCJfZ2V0QXBwU3RhdGVLZXlBbmRVcmxQYXJhbWV0ZXJzIiwiX2dldEFwcFNwZWNpZmljSGFzaCIsImFwcEhhc2giLCJjcm9zc0FwcFNlcnZpY2UiLCJocmVmRm9yQXBwU3BlY2lmaWNIYXNoQXN5bmMiLCJtZXNzYWdlIiwiRXJyb3IiLCJTdHJpbmciLCJfbWl4QXR0cmlidXRlc1RvU2VsVmFyaWFudCIsInNQcm9wZXJ0eU5hbWUiLCJ2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZSIsIkRhdGUiLCJ0b0pTT04iLCJ0b1N0cmluZyIsImlnbm9yZUVtcHR5U3RyaW5nIiwiaW5mbyIsInZTZW1hbnRpY0F0dHJpYnV0ZXMiLCJvTmV3U2VsVmFyaWFudCIsImZpbHRlclVybCIsImdldEZpbHRlckNvbnRleHRVcmwiLCJzZXRGaWx0ZXJDb250ZXh0VXJsIiwiY29udGV4dFVybCIsImdldFBhcmFtZXRlckNvbnRleHRVcmwiLCJzZXRQYXJhbWV0ZXJDb250ZXh0VXJsIiwiZm9yRWFjaCIsImFQYXJhbWV0ZXJzIiwiZ2V0U2VsZWN0T3B0aW9uIiwiZ2V0UGFyYW1ldGVyIiwiYVNlbE9wdGlvbk5hbWVzIiwiYVNlbGVjdE9wdGlvbiIsImoiLCJTaWduIiwiT3B0aW9uIiwiTG93IiwiSGlnaCIsIl9lbnN1cmVTZWxlY3Rpb25WYXJpYW50Rm9ybWF0U3RyaW5nIiwidlNlbGVjdGlvblZhcmlhbnQiLCJ2Q29udmVydGVkU2VsZWN0aW9uVmFyaWFudCIsIl9mbkhhbmRsZUFwcFN0YXRlUHJvbWlzZSIsIm9SZXR1cm4iLCJfc2F2ZUFwcFN0YXRlV2l0aEltbWVkaWF0ZVJldHVybiIsIl9mblNhdmVBcHBTdGF0ZVdpdGhJbW1lZGlhdGVSZXR1cm4iLCJnZXRLZXkiLCJvQXBwRGF0YUZvclNhdmUiLCJfZmV0Y2hBcHBEYXRhRm9yU2F2ZSIsInNldERhdGEiLCJvU2F2ZVByb21pc2UiLCJzYXZlIiwiZXh0ZW5kIiwidGFibGVWYXJpYW50SWQiLCJjdXN0b21EYXRhIiwicHJlc2VudGF0aW9uVmFyaWFudCIsInZhbHVlVGV4dHMiLCJzZW1hbnRpY0RhdGVzIiwib0FwcERhdGFDbG9uZSIsIk9iamVjdCIsImFzc2lnbiIsIm1lcmdlIiwiY3JlYXRlRW1wdHlBcHBTdGF0ZUFzeW5jIiwiY3JlYXRlRW1wdHlBcHBTdGF0ZSIsIm9EZWZlcnJlZCIsImdldEFwcFN0YXRlIiwib0FwcERhdGFMb2FkZWQiLCJkYXRhIiwiYU1hdGNoZXMiLCJleGVjIiwic05ld0lBcHBTdGF0ZSIsImZuQXBwZW5kVG9RdWVyeVBhcmFtZXRlciIsInNTdWJBcHBIYXNoIiwidGVzdCIsInJlcGxhY2UiLCJzTmVlZGxlIiwiZm5SZXBsYWNlT2xkQXBwcm9hY2giLCJyT2xkQXBwcm9hY2giLCJhc3NlcnQiLCJtVVJMUGFyYW1ldGVycyIsImFTZWxlY3RQcm9wZXJ0aWVzIiwiYVNlbGVjdE9wdGlvbnMiLCJhUGFyYW1ldGVyTmFtZXMiLCJzUGFyYW1ldGVyVmFsdWUiLCJzRXJyb3JDb2RlIiwic2V0TW9kZWwiLCJvTW9kZWwiLCJfb01vZGVsIiwiX2dldE1vZGVsIiwiZ2V0TW9kZWwiLCJfcmVtb3ZlQWxsUHJvcGVydGllcyIsIm9EYXRhIiwiX3JlbW92ZVByb3BlcnRpZXMiLCJhRmlsdGVyTmFtZSIsImFQYXJhbWV0ZXJOYW1lIiwic05hbWUiLCJTZWxlY3RPcHRpb25zIiwic29tZSIsIm9WYWx1ZSIsIm5JZHgiLCJQcm9wZXJ0eU5hbWUiLCJzcGxpY2UiLCJUZXh0cyIsIm9UZXh0cyIsIlByb3BlcnR5VGV4dHMiLCJEYXRlcyIsIm9EYXRlcyIsIlBhcmFtZXRlcnMiLCJfaXNUZXJtVHJ1ZSIsIm9Qcm9wZXJ0eSIsInNUZXJtIiwiZklzVGVybURlZmF1bHRUcnVlIiwib1Rlcm0iLCJCb29sIiwiX2lzRXhjbHVkZWRGcm9tTmF2aWdhdGlvbkNvbnRleHQiLCJfaXNQb3RlbnRpYWxseVNlbnNpdGl2ZSIsIl9pc01lYXN1cmVQcm9wZXJ0eSIsIl9pc1RvQmVFeGNsdWRlZCIsImNvbnN0cnVjdENvbnRleHRVcmwiLCJzRW50aXR5U2V0TmFtZSIsIl9jb25zdHJ1Y3RDb250ZXh0VXJsIiwic1NlcnZlclVybCIsImlzQSIsIl9nZXRTZXJ2ZXJVcmwiLCJvU2VydmljZVVSSSIsIlVSSSIsImdldFNlcnZpY2VVcmwiLCJhYnNvbHV0ZVRvIiwiZG9jdW1lbnQiLCJiYXNlVVJJIiwibGFzdEluZGV4T2YiLCJzdWJzdHIiLCJzU2VydmljZVVybCIsIm9BZGFwdGVkRGF0YSIsIkZpbHRlckNvbnRleHRVcmwiLCJQYXJhbWV0ZXJDb250ZXh0VXJsIiwiYVNlbnNpdGl2ZUZpbHRlck5hbWUiLCJhU2Vuc2l0aXZlUGFyYW1ldGVyTmFtZSIsIm9FbnRpdHlTZXQiLCJvRW50aXR5RGVmIiwib1N1YkVudGl0eURlZiIsIm9FbmRSb2xlIiwiYUZpbHRlckNvbnRleHRQYXJ0IiwiYVBhcmFtQ29udGV4dFBhcnQiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiZ2V0U2VydmljZU1ldGFkYXRhIiwic3BsaXQiLCJnZXRPRGF0YUVudGl0eVNldCIsImdldE9EYXRhRW50aXR5VHlwZSIsImVudGl0eVR5cGUiLCJwcm9wZXJ0eSIsInB1c2giLCJuYW1lIiwibmF2aWdhdGlvblByb3BlcnR5IiwiZ2V0T0RhdGFBc3NvY2lhdGlvbkVuZCIsInR5cGUiLCJtdWx0aXBsaWNpdHkiLCJfcmVtb3ZlU2Vuc2l0aXZlRGF0YUZvck9EYXRhVjQiLCJfcmVtb3ZlTWVhc3VyZUJhc2VkUHJvcGVydGllcyIsImFNZWFzdXJlRmlsdGVyTmFtZSIsImFNZWFzdXJlUGFyYW1ldGVyTmFtZSIsImJNZWFzdXJlIiwib1NWIiwiZ2V0T2JqZWN0Iiwic0VudGl0eVNldCIsImFQcm9wZXJ0eU5hbWVzIiwiZ2V0UHJvcGVydHlOYW1lcyIsImZuSXNTZW5zaXRpdmVEYXRhIiwic1Byb3AiLCJlc05hbWUiLCJhUHJvcGVydHlBbm5vdGF0aW9ucyIsIl9jaGVja1Byb3BlcnR5QW5ub3RhdGlvbnNGb3JTZW5zaXRpdmVEYXRhIiwib0ZpZWxkQ29udHJvbCIsImsiLCJzUHJvcGVydHkiLCJnZXRJQXBwU3RhdGVLZXkiLCJCYXNlT2JqZWN0IiwiTmF2aWdhdGlvbkhhbmRsZXJVSTVDbGFzcyIsInByb3RvdHlwZSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiTmF2aWdhdGlvbkhhbmRsZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgYXNzZXJ0IGZyb20gXCJzYXAvYmFzZS9hc3NlcnRcIjtcbmltcG9ydCBleHRlbmQgZnJvbSBcInNhcC9iYXNlL3V0aWwvZXh0ZW5kXCI7XG5pbXBvcnQgaXNFbXB0eU9iamVjdCBmcm9tIFwic2FwL2Jhc2UvdXRpbC9pc0VtcHR5T2JqZWN0XCI7XG5pbXBvcnQgbWVyZ2UgZnJvbSBcInNhcC9iYXNlL3V0aWwvbWVyZ2VcIjtcbmltcG9ydCBCYXNlT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9PYmplY3RcIjtcbmltcG9ydCBVSUNvbXBvbmVudCBmcm9tIFwic2FwL3VpL2NvcmUvVUlDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2xsZXIgZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyXCI7XG5pbXBvcnQgSGFzaENoYW5nZXIgZnJvbSBcInNhcC91aS9jb3JlL3JvdXRpbmcvSGFzaENoYW5nZXJcIjtcbmltcG9ydCBWMk9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92Mi9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgVjRPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IFVSSSBmcm9tIFwic2FwL3VpL3RoaXJkcGFydHkvVVJJXCI7XG5pbXBvcnQgalF1ZXJ5IGZyb20gXCJzYXAvdWkvdGhpcmRwYXJ0eS9qcXVlcnlcIjtcbmltcG9ydCBvcGVuV2luZG93IGZyb20gXCJzYXAvdWkvdXRpbC9vcGVuV2luZG93XCI7XG5pbXBvcnQgTmF2RXJyb3IgZnJvbSBcIi4vTmF2RXJyb3JcIjtcbmltcG9ydCB0eXBlIHsgU2VyaWFsaXplZFNlbGVjdGlvblZhcmlhbnQgfSBmcm9tIFwiLi9TZWxlY3Rpb25WYXJpYW50XCI7XG5pbXBvcnQgU2VsZWN0aW9uVmFyaWFudCBmcm9tIFwiLi9TZWxlY3Rpb25WYXJpYW50XCI7XG5pbXBvcnQgTmF2TGlicmFyeSBmcm9tIFwiLi9saWJyYXJ5XCI7XG5cbi8qKlxuICogU3RydWN0dXJlIG9mIHN0b3JlZCBhcHAgc3RhdGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5uZXJBcHBEYXRhIHtcblx0W2tleTogc3RyaW5nXTogdW5rbm93bjtcblx0LyoqXG5cdCAqIFNyaW5naWZpZWQgSlNPTiBvYmplY3QgYXMgcmV0dXJuZWQsIGZvciBleGFtcGxlLCBmcm9tIGdldERhdGFTdWl0ZUZvcm1hdCgpIG9mIHRoZSBTbWFydEZpbHRlckJhciBjb250cm9sXG5cdCAqL1xuXHRzZWxlY3Rpb25WYXJpYW50Pzogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBJRCBvZiB0aGUgU21hcnRUYWJsZSB2YXJpYW50LlxuXHQgKi9cblx0dGFibGVWYXJpYW50SWQ/OiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIE9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHN0b3JlIGFyYml0cmFyeSBkYXRhLlxuXHQgKi9cblx0Y3VzdG9tRGF0YT86IG9iamVjdDtcblxuXHQvKipcblx0ICogT2JqZWN0IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgdWkgc3RhdGUgb2YgdGhlIGFwcC5cblx0ICovXG5cdHByZXNlbnRhdGlvblZhcmlhbnQ/OiBvYmplY3Q7XG5cblx0LyoqXG5cdCAqIE9iamVjdCBjb250YWluaW5nIHZhbHVlIGRlc2NyaXB0aW9ucy5cblx0ICovXG5cdHZhbHVlVGV4dHM/OiBvYmplY3Q7XG5cblx0LyoqXG5cdCAqIE9iamVjdCBjb250YWluaW5nIHNlbWFudGljRGF0ZXMgZmlsdGVyIGluZm9ybWF0aW9uLlxuXHQgKi9cblx0c2VtYW50aWNEYXRlcz86IG9iamVjdDtcbn1cblxuLy8gc2hvcnRjdXRzIGZvciBzYXAudWkuZ2VuZXJpYy5hcHAgZW51bXNcbmNvbnN0IE5hdlR5cGUgPSBOYXZMaWJyYXJ5Lk5hdlR5cGU7XG5jb25zdCBQYXJhbUhhbmRsaW5nTW9kZSA9IE5hdkxpYnJhcnkuUGFyYW1IYW5kbGluZ01vZGU7XG5jb25zdCBTdXBwcmVzc2lvbkJlaGF2aW9yID0gTmF2TGlicmFyeS5TdXBwcmVzc2lvbkJlaGF2aW9yO1xuY29uc3QgTW9kZSA9IE5hdkxpYnJhcnkuTW9kZTtcblxuY29uc3QgSUFQUF9TVEFURSA9IFwic2FwLWlhcHAtc3RhdGVcIjtcbmNvbnN0IERFRkFVTFRFRF9QQVJBTUVURVJfUFJPUEVSVFkgPSBcInNhcC11c2hlbGwtZGVmYXVsdGVkUGFyYW1ldGVyTmFtZXNcIjtcbmNvbnN0IEhZQlJJRF9JQVBQX1NUQVRFX0tFWSA9IFwibmhIeWJyaWRJQXBwU3RhdGVLZXlcIjtcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBzdWNjZXNzb3Igb2Yge0BsaW5rIHNhcC51aS5nZW5lcmljLmFwcC5uYXZpZ2F0aW9uLnNlcnZpY2UuTmF2aWdhdGlvbkhhbmRsZXJ9Ljxicj4gQ3JlYXRlcyBhIG5ldyBOYXZpZ2F0aW9uSGFuZGxlciBjbGFzcyBieSBwcm92aWRpbmcgdGhlIHJlcXVpcmVkIGVudmlyb25tZW50LiA8YnI+XG4gKiBUaGUgPGNvZGU+TmF2aWdhdGlvbkhhbmRsZXI8L2NvZGU+IHN1cHBvcnRzIHRoZSB2ZXJpZmljYXRpb24gb2Ygc2Vuc2l0aXZlIGluZm9ybWF0aW9uLiBBbGwgcHJvcGVydGllcyB0aGF0IGFyZSBwYXJ0IG9mXG4gKiA8Y29kZT5zZWxlY3Rpb25WYXJpYW50PC9jb2RlPiBhbmQgPGNvZGU+dmFsdWVUZXh0czwvY29kZT4gd2lsbCBiZSB2ZXJpZmllZCBpZiB0aGV5IGFyZSBhbm5vdGF0ZWQgYXNcbiAqIDxjb2RlPmNvbS5zYXAudm9jYWJ1bGFyaWVzLlBlcnNvbmFsRGF0YS52MS5Jc1BvdGVudGlhbGx5U2Vuc2l0aXZlPC9jb2RlPiBvclxuICogPGNvZGU+Y29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRXhjbHVkZUZyb21OYXZpZ2F0aW9uQ29udGV4dDwvY29kZT4gYW5kIHdpbGwgYmUgcmVtb3ZlZCBiZWZvcmUgdGhlIGRhdGEgaXMgcGVyc2lzdGVkIGFzIHRoZSBhcHBcbiAqIHN0YXRlLjxicj5cbiAqIEFsc28sIGFsbCBwcm9wZXJ0aWVzIGFubm90YXRlZCBhcyA8Y29kZT5jb20uc2FwLnZvY2FidWxhcmllcy5BbmFseXRpY3MudjEuTWVhc3VyZTwvY29kZT4gd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGRhdGEgc3RvcmVkIGFzIHRoZVxuICogeGFwcCBzdGF0ZS48YnI+XG4gKiBUbyB2ZXJpZnkgdGhlIGluZm9ybWF0aW9uIHRvIGJlIHJlbW92ZWQsIHRoZSA8Y29kZT5OYXZpZ2F0aW9uSGFuZGxlcjwvY29kZT4gcmVxdWlyZXMgYW4gdW5uYW1lZCBtb2RlbCBvZiB0eXBlXG4gKiB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnYyLk9EYXRhTW9kZWx9IG9uIGNvbXBvbmVudCBsZXZlbC4gSXQgaXMgcG9zc2libGUgdG8gc2V0IHN1Y2ggYSBtb2RlbCB1c2luZyB0aGUgPGNvZGU+c2V0TW9kZWw8L2NvZGU+XG4gKiBtZXRob2QuPGJyPlxuICogPGI+Tm90ZTo8L2I+IFRoZSBjaGVjayBmb3IgZXhjbHVkZWQgZGF0YSByZXF1aXJlcyB0aGF0IHRoZSBPRGF0YSBtZXRhZGF0YSBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZCBjb21wbGV0ZWx5Ljxicj5cbiAqIElmIHRoZSBPRGF0YSBtZXRhZGF0YSBtb2RlbCBoYXMgbm90IGJlZW4gbG9hZGVkIGNvbXBsZXRlbHksIGFsbCBwcm9wZXJ0aWVzIGFyZSByZW1vdmVkIGZyb20gdGhlIGFwcGxpY2F0aW9uIGNvbnRleHQuPGJyPlxuICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MgcmVxdWlyZXMgdGhhdCB0aGUgVVNoZWxsIHtAbGluayBzYXAudXNoZWxsLnNlcnZpY2VzLkNyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9ufSBpcyBhdmFpbGFibGUgYW5kIGluaXRpYWxpemVkLlxuICpcbiAqIEBwdWJsaWNcbiAqIEBjbGFzc1xuICogQGV4dGVuZHMgc2FwLnVpLmJhc2UuT2JqZWN0XG4gKiBAc2luY2UgMS44My4wXG4gKiBAbmFtZSBzYXAuZmUubmF2aWdhdGlvbi5OYXZpZ2F0aW9uSGFuZGxlclxuICovXG5leHBvcnQgY2xhc3MgTmF2aWdhdGlvbkhhbmRsZXIgZXh0ZW5kcyBCYXNlT2JqZWN0IHtcblx0cHJpdmF0ZSBvUm91dGVyOiBhbnk7XG5cblx0cHJpdmF0ZSBvQ29tcG9uZW50OiBhbnk7XG5cblx0cHJpdmF0ZSBfb01vZGVsOiBhbnk7XG5cblx0cHJpdmF0ZSBzUGFyYW1IYW5kbGluZ01vZGU6IHN0cmluZztcblxuXHRwcml2YXRlIF9zTW9kZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5cdC8vIGxpc3Qgb2YgdGVjaG5pY2FsIHBhcmFtZXRlcnNcblx0cHJpdmF0ZSBfYVRlY2huaWNhbFBhcmFtYXRlcnMgPSBbXCJoY3BBcHBsaWNhdGlvbklkXCJdO1xuXG5cdHByaXZhdGUgX29MYXN0U2F2ZWRJbm5lckFwcERhdGE6IGFueSA9IHtcblx0XHRzQXBwU3RhdGVLZXk6IFwiXCIsXG5cdFx0b0FwcERhdGE6IHt9LFxuXHRcdGlDYWNoZUhpdDogMCxcblx0XHRpQ2FjaGVNaXNzOiAwXG5cdH07XG5cblx0Lypcblx0ICogVGhlcmUgZXhpc3RzIGEgZ2VuZXJhdGlvbiBvZiBcIm9sZFwiIHNhcC1pYXBwLXN0YXRlcyB3aGljaCBhcmUgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBVUkwgc2NoZW1hOlxuXHQgKiAjU2VtT2JqLWFjdGlvbiYvcm91dGUvc2FwLWlhcHAtc3RhdGU9QUJDMTIzNDU2NzggVGhlIG5ldyBVUkwgc2NoZW1hIGlzOiAjU2VtT2JqLWFjdGlvbiYvcm91dGU/c2FwLWlhcHAtc3RhdGU9QUJDMTIzNDU2NzggKG1pbmQgdGhlXG5cdCAqIGRpZmZlcmVuY2UgYmV0d2VlbiAvIGFuZCA/IGFib3ZlKSwgaS5lLiB0aGUgc2FwLWlhcHAtc3RhdGUgaGFzIGJlY29tZSBhIHBhcmFtZXRlciBvZiB0aGUgcXVlcnkgcGFyYW1ldGVyIHNlY3Rpb24gaW4gdGhlIEFwcEhhc2ggc3RyaW5nLlxuXHQgKiBZZXQsIHRoaXMgdG9vbCBzaGFsbCBiZSBhYmxlIHRvIGRlYWwgZXZlbiB3aXRoIG9sZCBzYXAtaWFwcC1zdGF0ZXMuIFRoZXJlZm9yZSwgd2UgdXNlIHR3byBSZWd1bGFyIEV4cHJlc3Npb25zIChySUFwcFN0YXRlT2xkIGFuZFxuXHQgKiBySUFwcFN0YXRlT2xkQXRTdGFydCkgYXMgZGVmaW5lZCBiZWxvdyB0byBzY2FuIGZvciB0aGVzZSBvbGQgdmFyaWFudHMuIFRoZSBuZXcgdmFyaWFudCBpcyBiZWluZyBzY2FubmVkIHVzaW5nIHJJQXBwU3RhdGVOZXcgYXMgUmVndWxhclxuXHQgKiBFeHByZXNzaW9uIHNlYXJjaCBzdHJpbmcuIENvbXBhdGliaWxpdHkgaXMgY2VudHJhbGx5IGVuc3VyZWQgYnkgdGhlIHR3byBtZXRob2RzIF9nZXRJbm5lckFwcFN0YXRlS2V5IGFuZCBfcmVwbGFjZUlubmVyQXBwU3RhdGVLZXkgKHNlZVxuXHQgKiBiZWxvdykuIE5ldmVyIHVzZSB0aGVzZSBSZWdFeHAgaW4gYSBtZXRob2Qgb24geW91ciBvd24sIGFzIGl0IHR5cGljYWxseSBpbmRpY2F0ZXMgdGhhdCB5b3Ugd2lsbCBmYWxsIGludG8gdGhlIGNvbXBhdGliaWxpdHkgdHJhcCFcblx0ICovXG5cdC8vIFdhcm5pbmchIERvIG5vdCB1c2UgR0xPQkFMIGZsYWdzIGhlcmU7IFJlZ0V4cCBpbiBHTE9CQUwgbW9kZSBzdG9yZSB0aGUgbGFzdEluZGV4IHZhbHVlXG5cdC8vIFRoZXJlZm9yZSwgcmVwZWF0ZWQgY2FsbHMgdG8gdGhlIFJlZ0V4cCB3aWxsIHRoZW4gb25seSBzdGFydCBiZWdpbm5pbmcgd2l0aCB0aGF0IHN0b3JlZFxuXHQvLyBsYXN0SW5kZXguIFRodXMsIG11bHRpcGxlIGNhbGxzIHRoZXJlZm9yZSBjb3VsZCB5aWVsZCBzdHJhbmdlIHJlc3VsdHMuXG5cdC8vIE1vcmVvdmVyLCB0aGVyZSBzaGFsbCBvbmx5IGJlIGV4YWN0bHkgb25lIElBUFBfU1RBVEUgcGVyIFJlZ0V4cCBpbiBhbiBBcHBIYXNoLlxuXHQvLyBUaGVyZWZvcmUsIEdMT0JBTCBzZWFyY2ggc2hvdWxkIGJlIHN1cGVyZmx1b3VzLlxuXHRwcml2YXRlIF9ySUFwcFN0YXRlT2xkID0gbmV3IFJlZ0V4cChcIi9cIiArIElBUFBfU1RBVEUgKyBcIj0oW14vP10rKVwiKTtcblxuXHRwcml2YXRlIF9ySUFwcFN0YXRlT2xkQXRTdGFydCA9IG5ldyBSZWdFeHAoXCJeXCIgKyBJQVBQX1NUQVRFICsgXCI9KFteLz9dKylcIik7XG5cblx0Lypcblx0ICogUmVndWxhciBFeHByZXNzaW9uIGluIHdvcmRzOiBTZWFyY2ggZm9yIHNvbWV0aGluZyB0aGF0IGVpdGhlciBzdGFydHMgd2l0aCA/IG9yICYsIGZvbGxvd2VkIGJ5IHRoZSB0ZXJtIFwic2FwLWlhcHAtc3RhdGVcIi4gVGhhdCBvbmUgaXNcblx0ICogZm9sbG93ZWQgYnkgYW4gZXF1YWwgc2lnbiAoPSkuIFRoZSBzdHVmZiB0aGF0IGlzIGFmdGVyIHRoZSBlcXVhbCBzaWduIGZvcm1zIHRoZSBmaXJzdCByZWdleHAgZ3JvdXAuIFRoaXMgZ3JvdXAgY29uc2lzdHMgb2YgYXQgbGVhc3Qgb25lXG5cdCAqIChvciBhcmJpdHJhcnkgbWFueSkgY2hhcmFjdGVycywgYXMgbG9uZyBhcyBpdCBpcyBub3QgYW4gYW1wZXJzYW5kIHNpZ24gKCYpLiBDaGFyYWN0ZXJzIGFmdGVyIHN1Y2ggYW4gYW1wZXJzYW5kIHdvdWxkIGJlIGlnbm9yZWQgYW5kIGRvXG5cdCAqIG5vdCBiZWxvbmcgdG8gdGhlIGdyb3VwLiBBbHRlcm5hdGl2ZWx5LCB0aGUgc3RyaW5nIGFsc28gbWF5IGVuZC5cblx0ICovXG5cdHByaXZhdGUgX3JJQXBwU3RhdGVOZXcgPSBuZXcgUmVnRXhwKFwiWz8mXVwiICsgSUFQUF9TVEFURSArIFwiPShbXiZdKylcIik7XG5cblx0cHJpdmF0ZSBfbmF2aWdhdGVDYWxsYmFjazogRnVuY3Rpb24gfCB1bmRlZmluZWQ7XG5cblx0LyoqXG5cdCAqIFRlbXBvcmFyaWx5IGFkZGVkIGFnYWluIGJlY2F1c2UgYW4gYXBwbGljYXRpb24gd2FzIChpbGxlZ2lhbGx5KSByZWx5aW5nIG9uIGl0LiBTaG91bGQgYmUgcmVtb3ZlZCBhZ2Fpbiwgb25jZSB0aGUgYXBwIGlzIGNvcnJlY3RlZFxuXHQgKi9cblx0cHJpdmF0ZSBJQVBQX1NUQVRFID0gSUFQUF9TVEFURTtcblxuXHQvKipcblx0ICogQ29uc3RydWN0b3IgcmVxdWlyaW5nIGEgY29udHJvbGxlci9jb21wb25lbnQgb3duaW5nIHRoZSBuYXZpZ2F0aW9uIGhhbmRsZXIuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udHJvbGxlciBVSTUgY29udHJvbGxlciB0aGF0IGNvbnRhaW5zIGEgcm91dGVyIGFuZCBhIGNvbXBvbmVudDsgdHlwaWNhbGx5IHRoZSBtYWluIGNvbnRyb2xsZXIgb2YgeW91ciBhcHBsaWNhdGlvbiwgZm9yXG5cdCAqICAgICAgICBleGFtcGxlLCBhIHN1YmNsYXNzIG9mIHRoZSBzYXAuY2Euc2NmbGQubWQuY29udHJvbGxlci5CYXNlRnVsbHNjcmVlbkNvbnRyb2xsZXIgaWYgc2NhZmZvbGRpbmcgaXMgdXNlZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW3NNb2RlPXNhcC5mZS5uYXZpZ2F0aW9uLk1vZGUuT0RhdGFWNF0gTW9kZSB0byBiZSB1c2VkIHRvIGluZGljYXRlcyB0aGUgT2RhdGEgdmVyc2lvbiB1c2VkIGZvciBydW5ubmluZyB0aGUgTmF2aWdhdGlvbiBIYW5kbGVyLFxuXHQgKiAgICAgICAgc2VlIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5Nb2RlfS48YnI+XG5cdCAqIFx0XHQgIE5vdGU6IE1vZGUgaGFzIHRvIGJlIHNhcC5mZS5uYXZpZ2F0aW9uLk1vZGUuT0RhdGFWMiB3aGVuZXZlciB0aGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBhIE9EYXRhIFYyIGJhc2VkIHNlcnZpY2UuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbc1BhcmFtSGFuZGxpbmdNb2RlPVNlbFZhcldpbnNdIE1vZGUgdG8gYmUgdXNlZCB0byBoYW5kbGUgY29uZmxpY3RzIHdoZW4gbWVyZ2luZyBVUkwgcGFyYW1ldGVycyBhbmQgdGhlIFNlbGVjdGlvblZhcmlhbnQgY2xhc3MsXG5cdCAqICAgICAgICBzZWUge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLlBhcmFtSGFuZGxpbmdNb2RlfVxuXHQgKiBAdGhyb3dzIEFuIGluc3RhbmNlIG9mIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5OYXZFcnJvcn0gaW4gY2FzZSBvZiBpbnB1dCBlcnJvcnMuIFZhbGlkIGVycm9yIGNvZGVzIGFyZTogPHRhYmxlPlxuXHQgKiAgICAgICAgIDx0cj5cblx0ICogICAgICAgICA8dGggYWxpZ249XCJsZWZ0XCI+TmF2RXJyb3IgY29kZTwvdGg+XG5cdCAqICAgICAgICAgPHRoIGFsaWduPVwibGVmdFwiPkRlc2NyaXB0aW9uPC90aD5cblx0ICogICAgICAgICA8L3RyPlxuXHQgKiAgICAgICAgIDx0cj5cblx0ICogICAgICAgICA8dGQ+TmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9JTlBVVDwvdGQ+XG5cdCAqICAgICAgICAgPHRkPkluZGljYXRlcyB0aGF0IHRoZSBpbnB1dCBwYXJhbWV0ZXIgaXMgaW52YWxpZDwvdGQ+XG5cdCAqICAgICAgICAgPC90cj5cblx0ICogICAgICAgICA8L3RhYmxlPlxuXHQgKi9cblx0Y29uc3RydWN0b3Iob0NvbnRyb2xsZXI6IENvbnRyb2xsZXIgfCBVSUNvbXBvbmVudCwgc01vZGU/OiBzdHJpbmcsIHNQYXJhbUhhbmRsaW5nTW9kZT86IHN0cmluZykge1xuXHRcdHN1cGVyKCk7XG5cdFx0aWYgKCFvQ29udHJvbGxlcikge1xuXHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9JTlBVVFwiKTtcblx0XHR9XG5cblx0XHRpZiAob0NvbnRyb2xsZXIgaW5zdGFuY2VvZiBVSUNvbXBvbmVudCkge1xuXHRcdFx0dGhpcy5vUm91dGVyID0gb0NvbnRyb2xsZXIuZ2V0Um91dGVyKCk7XG5cdFx0XHR0aGlzLm9Db21wb25lbnQgPSBvQ29udHJvbGxlcjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHR5cGVvZiBvQ29udHJvbGxlci5nZXRPd25lckNvbXBvbmVudCAhPT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfSU5QVVRcIik7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMub1JvdXRlciA9IHRoaXMuX2dldFJvdXRlcihvQ29udHJvbGxlcik7XG5cdFx0XHR0aGlzLm9Db21wb25lbnQgPSBvQ29udHJvbGxlci5nZXRPd25lckNvbXBvbmVudCgpO1xuXHRcdH1cblxuXHRcdC8vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIFNtYXJ0VGVtcGxhdGVzXG5cdFx0aWYgKHRoaXMub0NvbXBvbmVudCAmJiB0aGlzLm9Db21wb25lbnQuZ2V0QXBwQ29tcG9uZW50KSB7XG5cdFx0XHR0aGlzLm9Db21wb25lbnQgPSB0aGlzLm9Db21wb25lbnQuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0fVxuXG5cdFx0aWYgKFxuXHRcdFx0dHlwZW9mIHRoaXMub1JvdXRlciA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuXHRcdFx0dHlwZW9mIHRoaXMub0NvbXBvbmVudCA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuXHRcdFx0dHlwZW9mIHRoaXMub0NvbXBvbmVudC5nZXRDb21wb25lbnREYXRhICE9PSBcImZ1bmN0aW9uXCJcblx0XHQpIHtcblx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfSU5QVVRcIik7XG5cdFx0fVxuXG5cdFx0aWYgKHNQYXJhbUhhbmRsaW5nTW9kZSA9PT0gUGFyYW1IYW5kbGluZ01vZGUuVVJMUGFyYW1XaW5zIHx8IHNQYXJhbUhhbmRsaW5nTW9kZSA9PT0gUGFyYW1IYW5kbGluZ01vZGUuSW5zZXJ0SW5TZWxPcHQpIHtcblx0XHRcdHRoaXMuc1BhcmFtSGFuZGxpbmdNb2RlID0gc1BhcmFtSGFuZGxpbmdNb2RlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnNQYXJhbUhhbmRsaW5nTW9kZSA9IFBhcmFtSGFuZGxpbmdNb2RlLlNlbFZhcldpbnM7IC8vIGRlZmF1bHRcblx0XHR9XG5cdFx0aWYgKHNNb2RlID09PSBNb2RlLk9EYXRhVjIpIHtcblx0XHRcdHRoaXMuX3NNb2RlID0gc01vZGU7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgc2hlbGwgbmF2aWdhdGlvbiBzZXJ2aWNlLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgTmF2aWdhdGlvbiBzZXJ2aWNlXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfZ2V0QXBwTmF2aWdhdGlvblNlcnZpY2UoKSB7XG5cdFx0cmV0dXJuIHNhcC51c2hlbGwuQ29udGFpbmVyLmdldFNlcnZpY2UoXCJDcm9zc0FwcGxpY2F0aW9uTmF2aWdhdGlvblwiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIHNoZWxsIG5hdmlnYXRpb24gc2VydmljZS5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIE5hdmlnYXRpb24gc2VydmljZVxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2dldEFwcE5hdmlnYXRpb25TZXJ2aWNlQXN5bmMoKTogYW55IHtcblx0XHRyZXR1cm4gc2FwLnVzaGVsbC5Db250YWluZXIuZ2V0U2VydmljZUFzeW5jKFwiQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb25cIilcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChvQ3Jvc3NBcHBOYXZTZXJ2aWNlOiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9Dcm9zc0FwcE5hdlNlcnZpY2U7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXI6IENyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uIGlzIG5vdCBhdmFpbGFibGUuXCIpO1xuXHRcdFx0XHR0aHJvdyBuZXcgTmF2RXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5OTy5YQVBQU0VSVklDRVwiKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgcmVmZXJlbmNlIHRvIHRoZSByb3V0ZXIgb2JqZWN0IGZvciBuYXZpZ2F0aW9uIGZvciB0aGlzIGdpdmVuIENvbnRyb2xsZXIuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29udHJvbGxlciBUaGUgcmVmZXJlbmNlIHRvIHRoZSBDb250cm9sbGVyIGZvciB3aGljaCB0aGUgUm91dGVyIGluc3RhbmNlIHNoYWxsIGJlIGRldGVybWluZWQuXG5cdCAqIEByZXR1cm5zIFRoZSBSb3V0ZXIgZm9yIHRoZSBnaXZlbiBDb250cm9sbGVyXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfZ2V0Um91dGVyKG9Db250cm9sbGVyOiBDb250cm9sbGVyKSB7XG5cdFx0cmV0dXJuIFVJQ29tcG9uZW50LmdldFJvdXRlckZvcihvQ29udHJvbGxlcik7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgaXMgdG8gYmUgdXNlZCBvbmx5IGJ5IEZFIFYyIHRvIGdldCBhY2Nlc3MgdG8gdG9FeHRlcm5hbCBwcm9taXNlLlxuXHQgKlxuXHQgKiBAcGFyYW0gZm5DYWxsYmFjayBDYWxsYmFjayB0byBiZSBjYWxsZWQgYnkgJ25hdmlnYXRlJyBtZXRob2QgaW4gY2FzZSBvZiB0b0V4dGVybmFsIGlzIHVzZWQgdG8gbmF2aWdhdGUuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRyZWdpc3Rlck5hdmlnYXRlQ2FsbGJhY2soZm5DYWxsYmFjazogRnVuY3Rpb24pIHtcblx0XHR0aGlzLl9uYXZpZ2F0ZUNhbGxiYWNrID0gZm5DYWxsYmFjaztcblx0fVxuXG5cdC8qKlxuXHQgKiBUcmlnZ2VycyBhIGNyb3NzLWFwcCBuYXZpZ2F0aW9uIGFmdGVyIHNhdmluZyB0aGUgaW5uZXIgYW5kIHRoZSBjcm9zcy1hcHAgc3RhdGVzLiBUaGUgbmF2aWdhdGlvbiBtb2RlIGJhc2VkIG9uXG5cdCAqIDxjb2RlPnNhcC11c2hlbGwtbmV4dC1uYXZtb2RlPC9jb2RlPiBpcyB0YWtlbiBpbnRvIGFjY291bnQuIElmIHNldCB0byA8Y29kZT5leHBsYWNlPC9jb2RlPiB0aGUgaW5uZXIgYXBwIHN0YXRlIHdpbGwgbm90IGJlIGNoYW5nZWQuXG5cdCAqIDxiPk5vdGU6PC9iPiBUaGUgPGNvZGU+c05hdk1vZGU8L2NvZGU+IGFyZ3VtZW50IGNhbiBiZSB1c2VkIHRvIG92ZXJ3cml0ZSB0aGUgU0FQIEZpb3JpIGxhdW5jaHBhZCBkZWZhdWx0IG5hdmlnYXRpb24gZm9yIG9wZW5pbmcgYSBVUkxcblx0ICogaW4tcGxhY2Ugb3IgZXgtcGxhY2UuXG5cdCAqIDxicj5cblx0ICogPGI+Tm9kZTo8L2I+IElmIHRoZSA8Y29kZT5vRXh0ZXJuYWxBcHBEYXRhPC9jb2RlPiBwYXJhbWV0ZXIgaXMgbm90IHN1cHBsaWVkLCB0aGUgZXh0ZXJuYWwgYXBwIGRhdGEgd2lsbCBiZSBjYWxjdWxhdGVkIGJhc2VkIG9uXG5cdCAqIHRoZSA8Y29kZT5vSW5uZXJBcHBEYXRhPC9jb2RlPiBkYXRhLjxicj5cblx0ICogU21hcnRGaWx0ZXJCYXIgY29udHJvbCA8Yj5QYXJhbWV0ZXJzOjwvYj4gPHRhYmxlPlxuXHQgKiA8dHI+XG5cdCAqIDx0ZCBhbGlnbj1cImNlbnRlclwiPntvYmplY3R9PC90ZD5cblx0ICogPHRkPjxiPm9FcnJvcjwvYj48L3RkPlxuXHQgKiA8dGQ+TmF2RXJyb3Igb2JqZWN0IChpbnN0YW5jZSBvZiB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uTmF2RXJyb3J9KSB0aGF0IGRlc2NyaWJlcyB3aGljaCBraW5kIG9mIGVycm9yIG9jY3VycmVkPC90ZD5cblx0ICogPHRyPlxuXHQgKiA8dGQgYWxpZ249XCJjZW50ZXJcIj57c3RyaW5nfTwvdGQ+XG5cdCAqIDx0ZD48Yj5vRXJyb3IuZXJyb3JDb2RlPC9iPjwvdGQ+XG5cdCAqIDx0ZD5Db2RlIHRvIGlkZW50aWZ5IHRoZSBlcnJvcjwvdGQ+XG5cdCAqIDx0cj5cblx0ICogPHRkIGFsaWduPVwiY2VudGVyXCI+e3N0cmluZ308L3RkPlxuXHQgKiA8dGQ+PGI+b0Vycm9yLnR5cGU8L2I+PC90ZD5cblx0ICogPHRkPlNldmVyaXR5IG9mIHRoZSBlcnJvciAoaW5mby93YXJuaW5nL2Vycm9yKTwvdGQ+XG5cdCAqIDx0cj5cblx0ICogPHRkIGFsaWduPVwiY2VudGVyXCI+e2FycmF5fTwvdGQ+XG5cdCAqIDx0ZD48Yj5vRXJyb3IucGFyYW1zPC9iPjwvdGQ+XG5cdCAqIDx0ZD5BbiBhcnJheSBvZiBvYmplY3RzICh0eXBpY2FsbHkgc3RyaW5ncykgdGhhdCBkZXNjcmliZSBhZGRpdGlvbmFsIHZhbHVlIHBhcmFtZXRlcnMgcmVxdWlyZWQgZm9yIGdlbmVyYXRpbmcgdGhlIG1lc3NhZ2U8L3RkPlxuXHQgKiA8L3RhYmxlPi5cblx0ICpcblx0ICogQHB1YmxpY1xuXHQgKiBAZnVuY3Rpb24gbmF2aWdhdGVcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdmlnYXRpb25IYW5kbGVyLnByb3RvdHlwZVxuXHQgKiBAcGFyYW0gc1NlbWFudGljT2JqZWN0IE5hbWUgb2YgdGhlIHNlbWFudGljIG9iamVjdCBvZiB0aGUgdGFyZ2V0IGFwcFxuXHQgKiBAcGFyYW0gc0FjdGlvbk5hbWUgTmFtZSBvZiB0aGUgYWN0aW9uIG9mIHRoZSB0YXJnZXQgYXBwXG5cdCAqIEBwYXJhbSB2TmF2aWdhdGlvblBhcmFtZXRlcnMgTmF2aWdhdGlvbiBwYXJhbWV0ZXJzIGFzIGFuIG9iamVjdCB3aXRoIGtleS92YWx1ZSBwYWlycyBvciBhcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBzdWNoIGFuIG9iamVjdC4gSWYgcGFzc2VkIGFzIGFuIG9iamVjdCwgdGhlIHByb3BlcnRpZXMgYXJlIG5vdCBjaGVja2VkIGFnYWluc3QgdGhlIDxjb2RlPklzUG90ZW50aWFsU2Vuc2l0aXZlPC9jb2RlPiBvciA8Y29kZT5NZWFzdXJlPC9jb2RlPiB0eXBlLlxuXHQgKiBAcGFyYW0gb0lubmVyQXBwRGF0YSBPYmplY3QgZm9yIHN0b3JpbmcgY3VycmVudCBzdGF0ZSBvZiB0aGUgYXBwXG5cdCAqIEBwYXJhbSBmbk9uRXJyb3IgQ2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBuYXZpZ2F0aW9uIDxicj5cblx0ICogQHBhcmFtIG9FeHRlcm5hbEFwcERhdGEgT2JqZWN0IGZvciBzdG9yaW5nIHRoZSBzdGF0ZSB3aGljaCB3aWxsIGJlIGZvcndhcmRlZCB0byB0aGUgdGFyZ2V0IGNvbXBvbmVudC5cblx0ICogQHBhcmFtIG9FeHRlcm5hbEFwcERhdGEucHJlc2VudGF0aW9uVmFyaWFudCBPYmplY3QgY29udGFpbmluZyB0aGUgY3VycmVudCB1aSBzdGF0ZSBvZiB0aGUgYXBwIHdoaWNoIHdpbGwgYmUgZm9yd2FyZGVkIHRvIHRoZVxuXHQgKiAgICAgICAgdGFyZ2V0IGNvbXBvbmVudC5cblx0ICogQHBhcmFtIG9FeHRlcm5hbEFwcERhdGEudmFsdWVUZXh0cyBPYmplY3QgY29udGFpbmluZyB2YWx1ZSBkZXNjcmlwdGlvbnMgd2hpY2ggd2lsbCBiZSBmb3J3YXJkZWQgdG8gdGhlIHRhcmdldCBjb21wb25lbnQuXG5cdCAqIEBwYXJhbSBvRXh0ZXJuYWxBcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQgU3RyaW5naWZpZWQgSlNPTiBvYmplY3QsIHdoaWNoIHdpbGwgYmUgZm9yd2FyZGVkIHRvIHRoZSB0YXJnZXQgY29tcG9uZW50LiBJZiBub3Rcblx0ICogICAgICAgIHByb3ZpZGVkIHRoZSBzZWxlY3Rpb25WYXJpYW50IHdpbGwgYmUgY29uc3RydWN0ZWQgYmFzZWQgb24gdGhlIHZOYXZpZ2F0aW9uUGFyYW1ldGVycy5cblx0ICogQHBhcmFtIHNOYXZNb2RlIEFyZ3VtZW50IGlzIHVzZWQgdG8gb3ZlcndyaXRlIHRoZSBGTFAtY29uZmlndXJlZCB0YXJnZXQgZm9yIG9wZW5pbmcgYSBVUkwuIElmIHVzZWQsIG9ubHkgdGhlXG5cdCAqICAgICAgICA8Y29kZT5leHBsYWNlPC9jb2RlPiBvciA8Y29kZT5pbnBsYWNlPC9jb2RlPiB2YWx1ZXMgYXJlIGFsbG93ZWQuIEFueSBvdGhlciB2YWx1ZSB3aWxsIGxlYWQgdG8gYW4gZXhjZXB0aW9uXG5cdCAqICAgICAgICA8Y29kZT5OYXZpZ2F0aW9uSGFuZGxlci5JTlZBTElEX05BVl9NT0RFPC9jb2RlPi5cblx0ICogQGV4YW1wbGUgPGNvZGU+XG5cdCAqIHNhcC51aS5kZWZpbmUoW1wic2FwL2ZlL25hdmlnYXRpb24vTmF2aWdhdGlvbkhhbmRsZXJcIiwgXCJzYXAvZmUvbmF2aWdhdGlvbi9TZWxlY3Rpb25WYXJpYW50XCJdLCBmdW5jdGlvbiAoTmF2aWdhdGlvbkhhbmRsZXIsIFNlbGVjdGlvblZhcmlhbnQpIHtcblx0ICogXHR2YXIgb05hdmlnYXRpb25IYW5kbGVyID0gbmV3IE5hdmlnYXRpb25IYW5kbGVyKG9Db250cm9sbGVyKTtcblx0ICogXHR2YXIgc1NlbWFudGljT2JqZWN0ID0gXCJTYWxlc09yZGVyXCI7XG5cdCAqIFx0dmFyIHNBY3Rpb25OYW1lID0gXCJjcmVhdGVcIjtcblx0ICpcblx0ICogXHQvL3NpbXBsZSBwYXJhbWV0ZXJzIGFzIE9iamVjdFxuXHQgKiBcdHZhciB2TmF2aWdhdGlvblBhcmFtZXRlcnMgPSB7XG5cdCAqIFx0XHRDb21wYW55Q29kZSA6IFwiMDAwMVwiLFxuXHQgKiBcdFx0Q3VzdG9tZXIgOiBcIkMwMDAxXCJcblx0ICogXHR9O1xuXHQgKlxuXHQgKiBcdC8vb3IgYXMgc2VsZWN0aW9uIHZhcmlhbnRcblx0ICogXHR2YXIgb1NlbGVjdGlvblZhcmlhbnQgPSBuZXcgU2VsZWN0aW9uVmFyaWFudCgpO1xuXHQgKlx0IG9TZWxlY3Rpb25WYXJpYW50LmFkZFNlbGVjdE9wdGlvbihcIkNvbXBhbnlDb2RlXCIsIFwiSVwiLCBcIkVRXCIsIFwiMDAwMVwiKTtcblx0ICogXHRvU2VsZWN0aW9uVmFyaWFudC5hZGRTZWxlY3RPcHRpb24oXCJDdXN0b21lclwiLCBcIklcIiwgXCJFUVwiLCBcIkMwMDAxXCIpO1xuXHQgKiBcdHZOYXZpZ2F0aW9uUGFyYW1ldGVycyA9IG9TZWxlY3Rpb25WYXJpYW50LnRvSlNPTlN0cmluZygpO1xuXHQgKlxuXHQgKiBcdC8vb3IgZGlyZWN0bHkgZnJvbSBTbWFydEZpbHRlckJhclxuXHQgKiBcdHZOYXZpZ2F0aW9uUGFyYW1ldGVycyA9IG9TbWFydEZpbHRlckJhci5nZXREYXRhU3VpdGVGb3JtYXQoKTtcblx0ICpcblx0ICogXHQvL2FwcCBzdGF0ZSBmb3IgYmFjayBuYXZpZ2F0aW9uXG5cdCAqXHQgdmFyIG9Jbm5lckFwcERhdGEgPSB7XG5cdCAqIFx0XHRzZWxlY3Rpb25WYXJpYW50IDogb1NtYXJ0RmlsdGVyQmFyLmdldERhdGFTdWl0ZUZvcm1hdCgpLFxuXHQgKiBcdFx0dGFibGVWYXJpYW50SWQgOiBvU21hcnRUYWJsZS5nZXRDdXJyZW50VmFyaWFudElkKCksXG5cdCAqIFx0XHRjdXN0b21EYXRhIDogb015Q3VzdG9tRGF0YVxuXHQgKiBcdH07XG5cdCAqXG5cdCAqIFx0Ly8gY2FsbGJhY2sgZnVuY3Rpb24gaW4gY2FzZSBvZiBlcnJvcnNcblx0ICogXHR2YXIgZm5PbkVycm9yID0gZnVuY3Rpb24ob0Vycm9yKXtcblx0ICogXHRcdHZhciBvaTE4biA9IG9Db250cm9sbGVyLmdldFZpZXcoKS5nZXRNb2RlbChcImkxOG5cIikuZ2V0UmVzb3VyY2VCdW5kbGUoKTtcblx0ICogXHRcdG9FcnJvci5zZXRVSVRleHQoe29pMThuIDogb2kxOG4sIHNUZXh0S2V5IDogXCJPVVRCT1VORF9OQVZfRVJST1JcIn0pO1xuXHQgKiBcdFx0b0Vycm9yLnNob3dNZXNzYWdlQm94KCk7XG5cdCAqIFx0fTtcblx0ICpcblx0ICogXHRvTmF2aWdhdGlvbkhhbmRsZXIubmF2aWdhdGUoc1NlbWFudGljT2JqZWN0LCBzQWN0aW9uTmFtZSwgdk5hdmlnYXRpb25QYXJhbWV0ZXJzLCBvSW5uZXJBcHBEYXRhLCBmbk9uRXJyb3IpO1xuXHQgKiB9KTtcblx0ICogPC9jb2RlPlxuXHQgKi9cblx0bmF2aWdhdGUoXG5cdFx0c1NlbWFudGljT2JqZWN0OiBzdHJpbmcsXG5cdFx0c0FjdGlvbk5hbWU6IHN0cmluZyxcblx0XHR2TmF2aWdhdGlvblBhcmFtZXRlcnM6IG9iamVjdCB8IHN0cmluZyxcblx0XHRvSW5uZXJBcHBEYXRhPzogSW5uZXJBcHBEYXRhLFxuXHRcdGZuT25FcnJvcj86IEZ1bmN0aW9uLFxuXHRcdG9FeHRlcm5hbEFwcERhdGE/OiB7XG5cdFx0XHR2YWx1ZVRleHRzPzogb2JqZWN0IHwgdW5kZWZpbmVkO1xuXHRcdFx0cHJlc2VudGF0aW9uVmFyaWFudD86IG9iamVjdCB8IHVuZGVmaW5lZDtcblx0XHRcdHNlbGVjdGlvblZhcmlhbnQ/OiBvYmplY3QgfCB1bmRlZmluZWQ7XG5cdFx0fSxcblx0XHRzTmF2TW9kZT86IHN0cmluZ1xuXHQpIHtcblx0XHRsZXQgc1NlbGVjdGlvblZhcmlhbnQ6IGFueSxcblx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0b1hBcHBEYXRhT2JqOiBhbnksXG5cdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMsXG5cdFx0XHRiRXhQbGFjZSA9IGZhbHNlLFxuXHRcdFx0b1RtcERhdGE6IGFueSA9IHt9O1xuXHRcdGNvbnN0IG9OYXZIYW5kbGVyOiBOYXZpZ2F0aW9uSGFuZGxlciA9IHRoaXM7XG5cblx0XHRjb25zdCBvQ29tcG9uZW50RGF0YSA9IHRoaXMub0NvbXBvbmVudC5nZXRDb21wb25lbnREYXRhKCk7XG5cdFx0Lypcblx0XHQgKiBUaGVyZSBhcmUgc29tZSByYWNlIGNvbmRpdGlvbnMgd2hlcmUgdGhlIG9Db21wb25lbnREYXRhIG1heSBub3QgYmUgc2V0LCBmb3IgZXhhbXBsZSBpbiBjYXNlIHRoZSBVU2hlbGwgd2FzIG5vdCBpbml0aWFsaXplZCBwcm9wZXJseS4gVG9cblx0XHQgKiBtYWtlIHN1cmUgdGhhdCB3ZSBkbyBub3QgZHVtcCBoZXJlIHdpdGggYW4gZXhjZXB0aW9uLCB3ZSB0YWtlIHRoaXMgc3BlY2lhbCBlcnJvciBoYW5kbGluZyBiZWhhdmlvcjpcblx0XHQgKi9cblx0XHRpZiAob0NvbXBvbmVudERhdGEpIHtcblx0XHRcdG9TdGFydHVwUGFyYW1ldGVycyA9IG9Db21wb25lbnREYXRhLnN0YXJ0dXBQYXJhbWV0ZXJzO1xuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdG9TdGFydHVwUGFyYW1ldGVycyAmJlxuXHRcdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnNbXCJzYXAtdXNoZWxsLW5leHQtbmF2bW9kZVwiXSAmJlxuXHRcdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnNbXCJzYXAtdXNoZWxsLW5leHQtbmF2bW9kZVwiXS5sZW5ndGggPiAwXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gYkV4UGxhY2UgPSAoSlNPTi5wYXJzZShvU3RhcnR1cFBhcmFtZXRlcnNbXCJzYXAtdXNoZWxsLW5leHQtbmF2bW9kZVwiXVswXSkgPT09IFwiZXhwbGFjZVwiKTtcblx0XHRcdFx0YkV4UGxhY2UgPSBvU3RhcnR1cFBhcmFtZXRlcnNbXCJzYXAtdXNoZWxsLW5leHQtbmF2bW9kZVwiXVswXSA9PT0gXCJleHBsYWNlXCI7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gb25seSBuYXYtbW9kZSAnaW5wbGFjZScgb3IgJ2V4cGxhY2UnIGFyZSBzdXBwb3J0ZWQuIEFueSBvdGhlciB2YWx1ZSB3aWxsIGxlYWQgdG8gYW4gZXhjZXB0aW9uLlxuXHRcdGlmIChzTmF2TW9kZSAmJiAoc05hdk1vZGUgPT09IFwiaW5wbGFjZVwiIHx8IHNOYXZNb2RlID09PSBcImV4cGxhY2VcIikpIHtcblx0XHRcdGJFeFBsYWNlID0gc05hdk1vZGUgPT09IFwiZXhwbGFjZVwiO1xuXHRcdH0gZWxzZSBpZiAoc05hdk1vZGUpIHtcblx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfTkFWX01PREVcIik7XG5cdFx0fVxuXG5cdFx0aWYgKG9FeHRlcm5hbEFwcERhdGEgPT09IHVuZGVmaW5lZCB8fCBvRXh0ZXJuYWxBcHBEYXRhID09PSBudWxsKSB7XG5cdFx0XHRvWEFwcERhdGFPYmogPSB7fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b1hBcHBEYXRhT2JqID0gb0V4dGVybmFsQXBwRGF0YTtcblx0XHR9XG5cblx0XHQvLyBmb3IgbmF2aWdhdGlvbiB3ZSBuZWVkIFVSTCBwYXJhbWV0ZXJzIChsZWdhY3kgbmF2aWdhdGlvbikgYW5kIHNhcC14YXBwLXN0YXRlLCB0aGVyZWZvcmUgd2UgbmVlZCB0byBjcmVhdGUgdGhlIG1pc3Npbmcgb25lIGZyb20gdGhlXG5cdFx0Ly8gcGFzc2VkIG9uZVxuXHRcdGlmICh0eXBlb2Ygdk5hdmlnYXRpb25QYXJhbWV0ZXJzID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRzU2VsZWN0aW9uVmFyaWFudCA9IHZOYXZpZ2F0aW9uUGFyYW1ldGVycztcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2TmF2aWdhdGlvblBhcmFtZXRlcnMgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdGNvbnN0IG9FbnJpY2hlZFNlbFZhciA9IHRoaXMuX3NwbGl0SW5ib3VuZE5hdmlnYXRpb25QYXJhbWV0ZXJzKFxuXHRcdFx0XHRuZXcgU2VsZWN0aW9uVmFyaWFudCgpLFxuXHRcdFx0XHR2TmF2aWdhdGlvblBhcmFtZXRlcnMsXG5cdFx0XHRcdFtdXG5cdFx0XHQpLm9OYXZpZ2F0aW9uU2VsVmFyO1xuXHRcdFx0c1NlbGVjdGlvblZhcmlhbnQgPSBvRW5yaWNoZWRTZWxWYXIudG9KU09OU3RyaW5nKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfSU5QVVRcIik7XG5cdFx0fVxuXG5cdFx0b1RtcERhdGEuc2VsZWN0aW9uVmFyaWFudCA9IG5ldyBTZWxlY3Rpb25WYXJpYW50KHNTZWxlY3Rpb25WYXJpYW50KTtcblx0XHRpZiAodHlwZW9mIHZOYXZpZ2F0aW9uUGFyYW1ldGVycyA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0b1RtcERhdGEuc2VsZWN0aW9uVmFyaWFudCA9IHRoaXMuX3JlbW92ZVRlY2huaWNhbFBhcmFtZXRlcnMob1RtcERhdGEuc2VsZWN0aW9uVmFyaWFudCk7XG5cdFx0fVxuXHRcdG9UbXBEYXRhLnNlbGVjdGlvblZhcmlhbnQgPSBvVG1wRGF0YS5zZWxlY3Rpb25WYXJpYW50ICYmIG9UbXBEYXRhLnNlbGVjdGlvblZhcmlhbnQudG9KU09OT2JqZWN0KCk7XG5cdFx0b1RtcERhdGEgPSB0aGlzLl9yZW1vdmVNZWFzdXJlQmFzZWRJbmZvcm1hdGlvbihvVG1wRGF0YSk7IC8vIHJlbW92ZSBldmVudHVhbCBtZWFzdXJlc1xuXHRcdG9UbXBEYXRhID0gdGhpcy5fY2hlY2tJc1BvdGVudGlhbGx5U2Vuc2l0aXZlKG9UbXBEYXRhKTsgLy8gcmVtb3ZlIGV2ZW50dWFsIHNlbnNpdGl2ZSBkYXRhXG5cblx0XHRpZiAob1RtcERhdGEuc2VsZWN0aW9uVmFyaWFudCkge1xuXHRcdFx0bVBhcmFtZXRlcnMgPSB0aGlzLl9nZXRVUkxQYXJhbWV0ZXJzRnJvbVNlbGVjdGlvblZhcmlhbnQobmV3IFNlbGVjdGlvblZhcmlhbnQob1RtcERhdGEuc2VsZWN0aW9uVmFyaWFudCkpO1xuXHRcdFx0c1NlbGVjdGlvblZhcmlhbnQgPSBuZXcgU2VsZWN0aW9uVmFyaWFudChvVG1wRGF0YS5zZWxlY3Rpb25WYXJpYW50KS50b0pTT05TdHJpbmcoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bVBhcmFtZXRlcnMgPSB7fTtcblx0XHRcdHNTZWxlY3Rpb25WYXJpYW50ID0gbnVsbDtcblx0XHR9XG5cblx0XHRjb25zdCBvTmF2QXJndW1lbnRzOiBhbnkgPSB7XG5cdFx0XHR0YXJnZXQ6IHtcblx0XHRcdFx0c2VtYW50aWNPYmplY3Q6IHNTZW1hbnRpY09iamVjdCxcblx0XHRcdFx0YWN0aW9uOiBzQWN0aW9uTmFtZVxuXHRcdFx0fSxcblx0XHRcdHBhcmFtczogbVBhcmFtZXRlcnMgfHwge31cblx0XHR9O1xuXG5cdFx0Y29uc3QgZm5OYXZpZ2F0ZSA9IGZ1bmN0aW9uIChvQ3Jvc3NBcHBOYXZTZXJ2aWNlOiBhbnkpIHtcblx0XHRcdGlmICghb1hBcHBEYXRhT2JqLnNlbGVjdGlvblZhcmlhbnQpIHtcblx0XHRcdFx0b1hBcHBEYXRhT2JqLnNlbGVjdGlvblZhcmlhbnQgPSBzU2VsZWN0aW9uVmFyaWFudDtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgZm5OYXZFeHBsYWNlID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRjb25zdCBzTmV3SHJlZlByb21pc2UgPSBvQ3Jvc3NBcHBOYXZTZXJ2aWNlLmhyZWZGb3JFeHRlcm5hbEFzeW5jKG9OYXZBcmd1bWVudHMsIG9OYXZIYW5kbGVyLm9Db21wb25lbnQpO1xuXHRcdFx0XHRzTmV3SHJlZlByb21pc2Vcblx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAoc05ld0hyZWY6IGFueSkge1xuXHRcdFx0XHRcdFx0b3BlbldpbmRvdyhzTmV3SHJlZik7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXRpcmV2aW5nIGhyZWZGb3JFeHRlcm5hbCA6IFwiICsgb0Vycm9yKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH07XG5cblx0XHRcdG9YQXBwRGF0YU9iaiA9IG9OYXZIYW5kbGVyLl9yZW1vdmVNZWFzdXJlQmFzZWRJbmZvcm1hdGlvbihvWEFwcERhdGFPYmopO1xuXHRcdFx0cmV0dXJuIG9OYXZIYW5kbGVyLl9mblNhdmVBcHBTdGF0ZUFzeW5jKG9YQXBwRGF0YU9iaiwgZm5PbkVycm9yKS50aGVuKGZ1bmN0aW9uIChvU2F2ZUFwcFN0YXRlUmV0dXJuOiBhbnkpIHtcblx0XHRcdFx0aWYgKG9TYXZlQXBwU3RhdGVSZXR1cm4pIHtcblx0XHRcdFx0XHRvTmF2QXJndW1lbnRzLmFwcFN0YXRlS2V5ID0gb1NhdmVBcHBTdGF0ZVJldHVybi5hcHBTdGF0ZUtleTtcblxuXHRcdFx0XHRcdC8vIFJlbWFyazpcblx0XHRcdFx0XHQvLyBUaGUgQ3Jvc3MgQXBwIFNlcnZpY2UgdGFrZXMgY2FyZSBvZiBlbmNvZGluZyBwYXJhbWV0ZXIga2V5cyBhbmQgdmFsdWVzLiBFeGFtcGxlOlxuXHRcdFx0XHRcdC8vIG1QYXJhbXMgPSB7IFwiJEAlXCIgOiBcIiYvPVwiIH0gcmVzdWx0cyBpbiB0aGUgVVJMIHBhcmFtZXRlciAlMjUyNCUyNTQwJTI1MjU9JTI1MjYlMjUyRiUyNTNEXG5cdFx0XHRcdFx0Ly8gTm90ZSB0aGUgZG91YmxlIGVuY29kaW5nLCB0aGlzIGlzIGNvcnJlY3QuXG5cblx0XHRcdFx0XHQvLyB0b0V4dGVybmFsIHNldHMgc2FwLXhhcHAtc3RhdGUgaW4gdGhlIFVSTCBpZiBhcHBTdGF0ZUtleSBpcyBwcm92aWRlZCBpbiBvTmF2QXJndW1lbnRzXG5cdFx0XHRcdFx0Ly8gdG9FeHRlcm5hbCBoYXMgaXNzdWVzIG9uIHN0aWNreSBhcHBzIEZJT1JJVEVDSFAxLTE0NDAwLCB0ZW1wIGZpeCB1c2luZyBocmVmRm9yRXh0ZXJuYWxcblx0XHRcdFx0XHRpZiAoc05hdk1vZGUgPT0gXCJleHBsYWNlXCIpIHtcblx0XHRcdFx0XHRcdGZuTmF2RXhwbGFjZSgpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjb25zdCBwdG9FeHQgPSBvQ3Jvc3NBcHBOYXZTZXJ2aWNlLnRvRXh0ZXJuYWwob05hdkFyZ3VtZW50cywgb05hdkhhbmRsZXIub0NvbXBvbmVudCk7XG5cdFx0XHRcdFx0XHQvLyBUT0RPOiBUaGlzIGlzIGp1c3QgYSB0ZW1wb3Jhcnkgc29sdXRpb24gdG8gYWxsb3cgRkUgVjIgdG8gdXNlIHRvRXh0ZXJuYWwgcHJvbWlzZS5cblx0XHRcdFx0XHRcdGlmIChvTmF2SGFuZGxlci5fbmF2aWdhdGVDYWxsYmFjaykge1xuXHRcdFx0XHRcdFx0XHRvTmF2SGFuZGxlci5fbmF2aWdhdGVDYWxsYmFjayhwdG9FeHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSAvLyBlbHNlIDogZXJyb3Igd2FzIGFscmVhZHkgcmVwb3J0ZWRcblx0XHRcdH0pO1xuXHRcdH07XG5cdFx0Y29uc3QgZm5TdG9yZUFuZE5hdmlnYXRlID0gZnVuY3Rpb24gKG9Dcm9zc0FwcE5hdlNlcnZpY2U6IGFueSkge1xuXHRcdFx0b05hdkhhbmRsZXJcblx0XHRcdFx0LnN0b3JlSW5uZXJBcHBTdGF0ZUFzeW5jKG9Jbm5lckFwcERhdGEgYXMgYW55LCB0cnVlKVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAoc0FwcFN0YXRlS2V5OiBhbnkpIHtcblx0XHRcdFx0XHRpZiAoc0FwcFN0YXRlS2V5KSB7XG5cdFx0XHRcdFx0XHRvTmF2SGFuZGxlci5yZXBsYWNlSGFzaChzQXBwU3RhdGVLZXkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gZm5OYXZpZ2F0ZShvQ3Jvc3NBcHBOYXZTZXJ2aWNlKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdGlmIChmbk9uRXJyb3IpIHtcblx0XHRcdFx0XHRcdGZuT25FcnJvcihvRXJyb3IpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0fTtcblx0XHRpZiAoc05hdk1vZGUpIHtcblx0XHRcdG9OYXZBcmd1bWVudHMucGFyYW1zW1wic2FwLXVzaGVsbC1uYXZtb2RlXCJdID0gYkV4UGxhY2UgPyBcImV4cGxhY2VcIiA6IFwiaW5wbGFjZVwiO1xuXHRcdH1cblx0XHRvTmF2SGFuZGxlclxuXHRcdFx0Ll9nZXRBcHBOYXZpZ2F0aW9uU2VydmljZUFzeW5jKClcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChvQ3Jvc3NBcHBOYXZTZXJ2aWNlOiBhbnkpIHtcblx0XHRcdFx0Y29uc3Qgb1N1cHBvcnRlZFByb21pc2UgPSBvQ3Jvc3NBcHBOYXZTZXJ2aWNlLmlzTmF2aWdhdGlvblN1cHBvcnRlZChbb05hdkFyZ3VtZW50c10sIG9OYXZIYW5kbGVyLm9Db21wb25lbnQpO1xuXHRcdFx0XHRvU3VwcG9ydGVkUHJvbWlzZS5kb25lKGZ1bmN0aW9uIChvVGFyZ2V0czogYW55KSB7XG5cdFx0XHRcdFx0aWYgKG9UYXJnZXRzWzBdLnN1cHBvcnRlZCkge1xuXHRcdFx0XHRcdFx0aWYgKCFiRXhQbGFjZSkge1xuXHRcdFx0XHRcdFx0XHRmblN0b3JlQW5kTmF2aWdhdGUob0Nyb3NzQXBwTmF2U2VydmljZSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRmbk5hdmlnYXRlKG9Dcm9zc0FwcE5hdlNlcnZpY2UpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoZm5PbkVycm9yKSB7XG5cdFx0XHRcdFx0XHQvLyBpbnRlbnQgaXMgbm90IHN1cHBvcnRlZFxuXHRcdFx0XHRcdFx0Y29uc3Qgb0Vycm9yID0gbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuaXNJbnRlbnRTdXBwb3J0ZWQubm90U3VwcG9ydGVkXCIpO1xuXHRcdFx0XHRcdFx0Zm5PbkVycm9yKG9FcnJvcik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRpZiAoZm5PbkVycm9yKSB7XG5cdFx0XHRcdFx0b1N1cHBvcnRlZFByb21pc2UuZmFpbChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHQvLyB0ZWNobmljYWwgZXJyb3I6IGNvdWxkIG5vdCBkZXRlcm1pbmUgaWYgaW50ZW50IGlzIHN1cHBvcnRlZFxuXHRcdFx0XHRcdFx0Y29uc3Qgb0Vycm9yID0gb05hdkhhbmRsZXIuX2NyZWF0ZVRlY2huaWNhbEVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuaXNJbnRlbnRTdXBwb3J0ZWQuZmFpbGVkXCIpO1xuXHRcdFx0XHRcdFx0Zm5PbkVycm9yKG9FcnJvcik7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdGlmIChmbk9uRXJyb3IpIHtcblx0XHRcdFx0XHRmbk9uRXJyb3Iob0Vycm9yKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogUGFyc2VzIHRoZSBpbmNvbWluZyBVUkwgYW5kIHJldHVybnMgYSBQcm9taXNlLiBJZiB0aGlzIG1ldGhvZCBkZXRlY3RzIGEgYmFjayBuYXZpZ2F0aW9uLCB0aGUgaW5uZXIgYXBwIHN0YXRlIGlzIHJldHVybmVkIGluIHRoZSByZXNvbHZlZFxuXHQgKiBQcm9taXNlLiBPdGhlcndpc2Ugc3RhcnR1cCBwYXJhbWV0ZXJzIHdpbGwgYmUgbWVyZ2VkIGludG8gdGhlIGFwcCBzdGF0ZSBwcm92aWRlZCBieSBjcm9zcyBhcHAgbmF2aWdhdGlvbiwgYW5kIGEgY29tYmluZWQgYXBwIHN0YXRlIHdpbGwgYmVcblx0ICogcmV0dXJuZWQuIFRoZSBjb25mbGljdCByZXNvbHV0aW9uIGNhbiBiZSBpbmZsdWVuY2VkIHdpdGggc1BhcmFtSGFuZGxpbmdNb2RlIGRlZmluZWQgaW4gdGhlIGNvbnN0cnVjdG9yLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBBIFByb21pc2Ugb2JqZWN0IHRvIG1vbml0b3Igd2hlbiBhbGwgdGhlIGFjdGlvbnMgb2YgdGhlIGZ1bmN0aW9uIGhhdmUgYmVlbiBleGVjdXRlZC4gSWYgdGhlIGV4ZWN1dGlvbiBpcyBzdWNjZXNzZnVsLCB0aGVcblx0ICogICAgICAgICAgZXh0cmFjdGVkIGFwcCBzdGF0ZSwgdGhlIHN0YXJ0dXAgcGFyYW1ldGVycywgYW5kIHRoZSB0eXBlIG9mIG5hdmlnYXRpb24gYXJlIHJldHVybmVkLCBzZWUgYWxzbyB0aGUgZXhhbXBsZSBhYm92ZS4gVGhlIGFwcCBzdGF0ZSBpc1xuXHQgKiAgICAgICAgICBhbiBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOlxuXHQgKiAgICAgICAgICA8dWw+XG5cdCAqICAgICAgICAgIDxsaT48Y29kZT5vQXBwRGF0YS5vU2VsZWN0aW9uVmFyaWFudDwvY29kZT46IEFuIGluc3RhbmNlIG9mIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5TZWxlY3Rpb25WYXJpYW50fVxuXHQgKiAgICAgICAgICBjb250YWluaW5nIG9ubHkgcGFyYW1ldGVycy9zZWxlY3Qgb3B0aW9ucyB0aGF0IGFyZSByZWxhdGVkIHRvIG5hdmlnYXRpb248L2xpPlxuXHQgKiAgICAgICAgICA8bGk+PGNvZGU+b0FwcERhdGEuc2VsZWN0aW9uVmFyaWFudDwvY29kZT46IFRoZSBuYXZpZ2F0aW9uLXJlbGF0ZWQgc2VsZWN0aW9uIHZhcmlhbnQgYXMgYSBKU09OLWZvcm1hdHRlZCBzdHJpbmc8L2xpPlxuXHQgKiAgICAgICAgICA8bGk+PGNvZGU+b0FwcERhdGEub0RlZmF1bHRlZFNlbGVjdGlvblZhcmlhbnQ8L2NvZGU+OiBBbiBpbnN0YW5jZSBvZlxuXHQgKiAgICAgICAgICB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uU2VsZWN0aW9uVmFyaWFudH0gY29udGFpbmluZyBvbmx5IHRoZSBwYXJhbWV0ZXJzL3NlbGVjdCBvcHRpb25zIHRoYXQgYXJlIHNldCBieSB1c2VyXG5cdCAqICAgICAgICAgIGRlZmF1bHQgZGF0YTwvbGk+XG5cdCAqICAgICAgICAgIDxsaT48Y29kZT5vQXBwRGF0YS5iTmF2U2VsVmFySGFzRGVmYXVsdHNPbmx5PC9jb2RlPjogQSBCb29sZWFuIGZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBvbmx5IGRlZmF1bHRlZCBwYXJhbWV0ZXJzIGFuZCBub1xuXHQgKiAgICAgICAgICBuYXZpZ2F0aW9uIHBhcmFtZXRlcnMgYXJlIHByZXNlbnQuPGJyPlxuXHQgKiAgICAgICAgICA8Yj5Ob3RlOjwvYj4gSWYgbm8gbmF2aWdhdGlvbiBwYXJhbWV0ZXJzIGFyZSBhdmFpbGFibGUsIDxjb2RlPmJOYXZTZWxWYXJIYXNEZWZhdWx0c09ubHk8L2NvZGU+IGlzIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPixcblx0ICogICAgICAgICAgZXZlbiB0aG91Z2ggcGFyYW1ldGVycyB3aXRob3V0IGRlZmF1bHQgbWlnaHQgYmUgYXZhaWxhYmxlIGFzIHdlbGwuPC9saT5cblx0ICogICAgICAgICAgPC91bD5cblx0ICogICAgICAgICAgSWYgdGhlIG5hdmlnYXRpb24tcmVsYXRlZCBzZWxlY3Rpb24gdmFyaWFudCBpcyBlbXB0eSwgaXQgaXMgcmVwbGFjZWQgYnkgYSBjb3B5IG9mIHRoZSBkZWZhdWx0ZWQgc2VsZWN0aW9uIHZhcmlhbnQuPGJyPlxuXHQgKiAgICAgICAgICBUaGUgbmF2aWdhdGlvbiB0eXBlIGlzIGFuIGVudW1lcmF0aW9uIHR5cGUgb2YgdHlwZSB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uTmF2VHlwZX0gKHBvc3NpYmxlIHZhbHVlcyBhcmVcblx0ICogICAgICAgICAgaW5pdGlhbCwgVVJMUGFyYW1zLCB4QXBwU3RhdGUsIGFuZCBpQXBwU3RhdGUpLjxicj5cblx0ICogICAgICAgICAgPGI+Tm90ZTo8L2I+IElmIHRoZSBuYXZpZ2F0aW9uIHR5cGUgaXMge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdlR5cGUuaUFwcFN0YXRlfSBvQXBwRGF0YSBoYXMgdHdvXG5cdCAqICAgICAgICAgIGFkZGl0aW9uYWwgcHJvcGVydGllc1xuXHQgKiAgICAgICAgICA8dWw+XG5cdCAqICAgICAgICAgIDxsaT48Y29kZT5vQXBwRGF0YS50YWJsZVZhcmlhbnRJZDwvY29kZT48L2xpPlxuXHQgKiAgICAgICAgICA8bGk+PGNvZGU+b0FwcERhdGEuY3VzdG9tRGF0YTwvY29kZT48L2xpPlxuXHQgKiAgICAgICAgICA8L3VsPlxuXHQgKiAgICAgICAgICB3aGljaCByZXR1cm4gdGhlIGlubmVyIGFwcCBkYXRhIGFzIHN0b3JlZCBpbiB7QGxpbmsgIy5uYXZpZ2F0ZSBuYXZpZ2F0ZX0gb3Ige0BsaW5rICMuc3RvcmVJbm5lckFwcFN0YXRlQXN5bmMgc3RvcmVJbm5lckFwcFN0YXRlQXN5bmN9LlxuXHQgKiAgICAgICAgICA8Y29kZT5vQXBwRGF0YS5vRGVmYXVsdGVkU2VsZWN0aW9uVmFyaWFudDwvY29kZT4gaXMgYW4gZW1wdHkgc2VsZWN0aW9uIHZhcmlhbnQgYW5kXG5cdCAqICAgICAgICAgIDxjb2RlPm9BcHBEYXRhLmJOYXZTZWxWYXJIYXNEZWZhdWx0c09ubHk8L2NvZGU+IGlzIDxjb2RlPmZhbHNlPC9jb2RlPiBpbiB0aGlzIGNhc2UuPGJyPlxuXHQgKiAgICAgICAgICA8Yj5Ob3RlOjwvYj4gSWYgdGhlIG5hdmlnYXRpb24gdHlwZSBpcyB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uTmF2VHlwZS5pbml0aWFsfSBvQXBwRGF0YSBpcyBhbiBlbXB0eSBvYmplY3QhPGJyPlxuXHQgKiAgICAgICAgICBJZiBhbiBlcnJvciBvY2N1cnMsIGFuIGVycm9yIG9iamVjdCBvZiB0eXBlIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5OYXZFcnJvcn0sIFVSTCBwYXJhbWV0ZXJzIChpZiBhdmFpbGFibGUpXG5cdCAqICAgICAgICAgIGFuZCB0aGUgdHlwZSBvZiBuYXZpZ2F0aW9uIGFyZSByZXR1cm5lZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAZXhhbXBsZSA8Y29kZT5cblx0ICogc2FwLnVpLmRlZmluZShbXCJzYXAvZmUvbmF2aWdhdGlvbi9OYXZpZ2F0aW9uSGFuZGxlclwiXSwgZnVuY3Rpb24gKE5hdmlnYXRpb25IYW5kbGVyKSB7XG5cdCAqIFx0dmFyIG9OYXZpZ2F0aW9uSGFuZGxlciA9IG5ldyBOYXZpZ2F0aW9uSGFuZGxlcihvQ29udHJvbGxlcik7XG5cdCAqIFx0dmFyIG9QYXJzZU5hdmlnYXRpb25Qcm9taXNlID0gb05hdmlnYXRpb25IYW5kbGVyLnBhcnNlTmF2aWdhdGlvbigpO1xuXHQgKlxuXHQgKiBcdG9QYXJzZU5hdmlnYXRpb25Qcm9taXNlLmRvbmUoZnVuY3Rpb24ob0FwcERhdGEsIG9TdGFydHVwUGFyYW1ldGVycywgc05hdlR5cGUpe1xuXHQgKiBcdFx0XHRvU21hcnRGaWx0ZXJCYXIuc2V0RGF0YVN1aXRlRm9ybWF0KG9BcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQpO1xuXHQgKiBcdFx0XHQvLyBvQXBwRGF0YS5vU2VsZWN0aW9uVmFyaWFudCBjYW4gYmUgdXNlZCB0byBtYW5pcHVsYXRlIHRoZSBzZWxlY3Rpb24gdmFyaWFudFxuXHQgKiBcdFx0XHQvLyBvQXBwRGF0YS5vRGVmYXVsdGVkU2VsZWN0aW9uVmFyaWFudCBjb250YWlucyB0aGUgcGFyYW1ldGVycyB3aGljaCBhcmUgc2V0IGJ5IHVzZXIgZGVmYXVsdHNcblx0ICogXHRcdFx0Ly8gb0FwcERhdGEuYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seSBpbmRpY2F0ZXMgd2hldGhlciBvbmx5IGRlZmF1bHRlZCBwYXJhbWV0ZXJzIGFuZCBubyBuYXZpZ2F0aW9uIHBhcmFtZXRlcnMgYXJlIHByZXNlbnRcblx0ICogXHR9KTtcblx0ICogXHRvUGFyc2VOYXZpZ2F0aW9uUHJvbWlzZS5mYWlsKGZ1bmN0aW9uKG9FcnJvciwgb1VSTFBhcmFtZXRlcnMsIHNOYXZUeXBlKXtcblx0ICogXHRcdC8vIGlmIGUuZy4gdGhlIHhhcHAgc3RhdGUgY291bGQgbm90IGJlIGxvYWRlZCwgbmV2ZXJ0aGVsZXNzIHRoZXJlIG1heSBiZSBVUkwgcGFyYW1ldGVycyBhdmFpbGFibGVcblx0ICogXHRcdC8vc29tZSBlcnJvciBoYW5kbGluZ1xuXHQgKiBcdH0pO1xuXHQgKiB9KTtcblx0ICogPC9jb2RlPlxuXHQgKi9cblx0cGFyc2VOYXZpZ2F0aW9uKCk6IG9iamVjdCB7XG5cdFx0Y29uc3Qgc0FwcEhhc2ggPSBIYXNoQ2hhbmdlci5nZXRJbnN0YW5jZSgpLmdldEhhc2goKTtcblx0XHQvKlxuXHRcdCAqIHVzZSAuZ2V0SGFzaCgpIGhlcmUgaW5zdGVhZCBvZiAuZ2V0QXBwSGFzaCgpIHRvIGFsc28gYmUgYWJsZSBkZWFsaW5nIHdpdGggZW52aXJvbm1lbnRzIHdoZXJlIG9ubHkgU0FQVUk1IGlzIGxvYWRlZCBhbmQgdGhlIFVTaGVsbCBpc1xuXHRcdCAqIG5vdCBpbml0aWFsaXplZCBwcm9wZXJseS5cblx0XHQgKi9cblx0XHRjb25zdCBzSUFwcFN0YXRlID0gdGhpcy5fZ2V0SW5uZXJBcHBTdGF0ZUtleShzQXBwSGFzaCk7XG5cblx0XHRsZXQgb0NvbXBvbmVudERhdGEgPSB0aGlzLm9Db21wb25lbnQuZ2V0Q29tcG9uZW50RGF0YSgpO1xuXHRcdC8qXG5cdFx0ICogVGhlcmUgYXJlIHNvbWUgcmFjZSBjb25kaXRpb25zIHdoZXJlIHRoZSBvQ29tcG9uZW50RGF0YSBtYXkgbm90IGJlIHNldCwgZm9yIGV4YW1wbGUgaW4gY2FzZSB0aGUgVVNoZWxsIHdhcyBub3QgaW5pdGlhbGl6ZWQgcHJvcGVybHkuIFRvXG5cdFx0ICogbWFrZSBzdXJlIHRoYXQgd2UgZG8gbm90IGR1bXAgaGVyZSB3aXRoIGFuIGV4Y2VwdGlvbiwgd2UgdGFrZSB0aGlzIHNwZWNpYWwgZXJyb3IgaGFuZGxpbmcgYmVoYXZpb3I6XG5cdFx0ICovXG5cdFx0aWYgKG9Db21wb25lbnREYXRhID09PSB1bmRlZmluZWQpIHtcblx0XHRcdExvZy53YXJuaW5nKFwiVGhlIG5hdmlnYXRpb24gQ29tcG9uZW50J3MgZGF0YSB3YXMgbm90IHNldCBwcm9wZXJseTsgYXNzdW1pbmcgaW5zdGVhZCB0aGF0IG5vIHBhcmFtZXRlcnMgYXJlIHByb3ZpZGVkLlwiKTtcblx0XHRcdG9Db21wb25lbnREYXRhID0ge307XG5cdFx0fVxuXG5cdFx0Ly8gUmVtYXJrOlxuXHRcdC8vIFRoZSBzdGFydHVwIHBhcmFtZXRlcnMgYXJlIGFscmVhZHkgZGVjb2RlZC4gRXhhbXBsZTpcblx0XHQvLyBUaGUgb3JpZ2luYWwgVVJMIHBhcmFtZXRlciAlMjUyNCUyNTQwJTI1MjU9JTI1MjYlMjUyRiUyNTNEIHJlc3VsdHMgaW4gb1N0YXJ0dXBQYXJhbWV0ZXJzID0geyBcIiRAJVwiIDogXCImLz1cIiB9XG5cdFx0Ly8gTm90ZSB0aGUgZG91YmxlIGVuY29kaW5nIGluIHRoZSBVUkwsIHRoaXMgaXMgY29ycmVjdC4gQW4gVVJMIHBhcmFtZXRlciBsaWtlIHh5ej0lMjUgY2F1c2VzIGFuIFwiVVJJIG1hbGZvcm1lZFwiIGVycm9yLlxuXHRcdC8vIElmIHRoZSBkZWNvZGVkIHZhbHVlIHNob3VsZCBiZSBlLmcuIFwiJTI1XCIsIHRoZSBwYXJhbWV0ZXIgaW4gdGhlIFVSTCBuZWVkcyB0byBiZTogeHl6PSUyNTI1MjVcblx0XHRjb25zdCBvU3RhcnR1cFBhcmFtZXRlcnMgPSBvQ29tcG9uZW50RGF0YS5zdGFydHVwUGFyYW1ldGVycztcblx0XHRjb25zdCBoeWJyaWRJQXBwU3RhdGVLZXlQYXJhbXM6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9TdGFydHVwUGFyYW1ldGVycz8uW0hZQlJJRF9JQVBQX1NUQVRFX0tFWV0/LlswXTtcblx0XHRjb25zdCBoeWJyaWREZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpO1xuXHRcdGxldCBpQXBwU3RhdGVIeWJyaWREZWZlcnJlZDogalF1ZXJ5LkRlZmVycmVkIHwgdW5kZWZpbmVkO1xuXHRcdGlmIChoeWJyaWRJQXBwU3RhdGVLZXlQYXJhbXMgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aUFwcFN0YXRlSHlicmlkRGVmZXJyZWQgPSB0aGlzLl9sb2FkQXBwU3RhdGUoaHlicmlkSUFwcFN0YXRlS2V5UGFyYW1zLCBoeWJyaWREZWZlcnJlZCwgTmF2VHlwZS5oeWJyaWQpO1xuXHRcdH1cblxuXHRcdGxldCBhRGVmYXVsdGVkUGFyYW1ldGVyczogYW55ID0gW107XG5cdFx0aWYgKFxuXHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzICYmXG5cdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnNbREVGQVVMVEVEX1BBUkFNRVRFUl9QUk9QRVJUWV0gJiZcblx0XHRcdG9TdGFydHVwUGFyYW1ldGVyc1tERUZBVUxURURfUEFSQU1FVEVSX1BST1BFUlRZXS5sZW5ndGggPiAwXG5cdFx0KSB7XG5cdFx0XHRhRGVmYXVsdGVkUGFyYW1ldGVycyA9IEpTT04ucGFyc2Uob1N0YXJ0dXBQYXJhbWV0ZXJzW0RFRkFVTFRFRF9QQVJBTUVURVJfUFJPUEVSVFldWzBdKTtcblx0XHR9XG5cblx0XHRjb25zdCBvTXlEZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpO1xuXG5cdFx0Y29uc3Qgb05hdkhhbmRsZXIgPSB0aGlzO1xuXHRcdGNvbnN0IHBhcnNlVXJsUGFyYW1zID0gZnVuY3Rpb24gKG9TdWJTdGFydHVwUGFyYW1ldGVyczogYW55LCBhU3ViRGVmYXVsdGVkUGFyYW1ldGVyczogYW55LCBvU3ViTXlEZWZlcnJlZDogYW55LCBzTmF2VHlwZTogYW55KSB7XG5cdFx0XHQvLyBzdGFuZGFyZCBVUkwgbmF2aWdhdGlvblxuXHRcdFx0Y29uc3Qgb1NlbFZhcnMgPSBvTmF2SGFuZGxlci5fc3BsaXRJbmJvdW5kTmF2aWdhdGlvblBhcmFtZXRlcnMoXG5cdFx0XHRcdG5ldyBTZWxlY3Rpb25WYXJpYW50KCksXG5cdFx0XHRcdG9TdWJTdGFydHVwUGFyYW1ldGVycyxcblx0XHRcdFx0YVN1YkRlZmF1bHRlZFBhcmFtZXRlcnNcblx0XHRcdCk7XG5cdFx0XHQvLyBGb3Igc2NlbmFyaW8sIHdoZXJlIG9ubHkgaHlicmlkSUFwcFN0YXRlS2V5IGlzIHBhcnQgb2YgdXJsUGFyYW1zLCB3ZSBpZ25vcmUgdGhpcyBjb25kaXRpb25cblx0XHRcdGlmIChvU2VsVmFycy5vTmF2aWdhdGlvblNlbFZhci5pc0VtcHR5KCkgJiYgb1NlbFZhcnMub0RlZmF1bHRlZFNlbFZhci5pc0VtcHR5KCkgJiYgc05hdlR5cGUgIT09IE5hdlR5cGUuaHlicmlkKSB7XG5cdFx0XHRcdC8vIFN0YXJ0dXAgcGFyYW1ldGVycyBjb250YWluIG9ubHkgdGVjaG5pY2FsIHBhcmFtZXRlcnMgKFNBUCBzeXN0ZW0pIHdoaWNoIHdlcmUgZmlsdGVyZWQgb3V0LlxuXHRcdFx0XHQvLyBvTmF2aWdhdGlvblNlbFZhciBhbmQgb0RlZmF1bHRlZFNlbFZhciBhcmUgZW1wdHkuXG5cdFx0XHRcdC8vIFRodXMsIGNvbnNpZGVyIHRoaXMgdHlwZSBvZiBuYXZpZ2F0aW9uIGFzIGFuIGluaXRpYWwgbmF2aWdhdGlvbi5cblx0XHRcdFx0aWYgKHNOYXZUeXBlID09PSBOYXZUeXBlLnhBcHBTdGF0ZSkge1xuXHRcdFx0XHRcdGNvbnN0IG9FcnJvciA9IG9OYXZIYW5kbGVyLl9jcmVhdGVUZWNobmljYWxFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLmdldERhdGFGcm9tQXBwU3RhdGUuZmFpbGVkXCIpO1xuXHRcdFx0XHRcdG9TdWJNeURlZmVycmVkLnJlamVjdChvRXJyb3IsIG9TdWJTdGFydHVwUGFyYW1ldGVycyB8fCB7fSwgTmF2VHlwZS54QXBwU3RhdGUpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG9TdWJNeURlZmVycmVkLnJlc29sdmUoe30sIG9TdWJTdGFydHVwUGFyYW1ldGVycywgTmF2VHlwZS5pbml0aWFsKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgb0FwcFN0YXRlRGF0YTogYW55ID0ge307XG5cdFx0XHRcdG9BcHBTdGF0ZURhdGEuc2VsZWN0aW9uVmFyaWFudCA9IG9TZWxWYXJzLm9OYXZpZ2F0aW9uU2VsVmFyLnRvSlNPTlN0cmluZygpO1xuXHRcdFx0XHRvQXBwU3RhdGVEYXRhLm9TZWxlY3Rpb25WYXJpYW50ID0gb1NlbFZhcnMub05hdmlnYXRpb25TZWxWYXI7XG5cdFx0XHRcdG9BcHBTdGF0ZURhdGEub0RlZmF1bHRlZFNlbGVjdGlvblZhcmlhbnQgPSBvU2VsVmFycy5vRGVmYXVsdGVkU2VsVmFyO1xuXHRcdFx0XHRvQXBwU3RhdGVEYXRhLmJOYXZTZWxWYXJIYXNEZWZhdWx0c09ubHkgPSBvU2VsVmFycy5iTmF2U2VsVmFySGFzRGVmYXVsdHNPbmx5O1xuXG5cdFx0XHRcdC8vIG5vIHNhcC14YXBwLXN0YXRlIGJ1dCBuYXZUeXBlIGlzIGh5YnJpZCwgZXh0cmFjdCB0aGUgSUFwcFN0YXRlRGF0YVxuXHRcdFx0XHRpZiAoc05hdlR5cGUgPT09IE5hdlR5cGUuaHlicmlkKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc3VjY2Vzc0hhbmRsZXJIeWJyaWRTdGF0ZSA9IGZ1bmN0aW9uIChpQXBwU3RhdGVEYXRhOiBvYmplY3QsIF9yZWY6IG9iamVjdCwgbmF2VHlwZTogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRvQXBwU3RhdGVEYXRhLmlBcHBTdGF0ZSA9IGlBcHBTdGF0ZURhdGE7XG5cdFx0XHRcdFx0XHRvU3ViTXlEZWZlcnJlZC5yZXNvbHZlKG9BcHBTdGF0ZURhdGEsIG9TdGFydHVwUGFyYW1ldGVycywgbmF2VHlwZSk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRjb25zdCBmYWlsdXJlSGFuZGxlckh5YnJpZFN0YXRlID0gZnVuY3Rpb24gKG9FcnJvcjogb2JqZWN0LCBfcmVmOiBvYmplY3QsIG5hdlR5cGU6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0b1N1Yk15RGVmZXJyZWQucmVqZWN0KG9FcnJvciwgX3JlZiwgbmF2VHlwZSk7XG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdGlmIChpQXBwU3RhdGVIeWJyaWREZWZlcnJlZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRpQXBwU3RhdGVIeWJyaWREZWZlcnJlZC5kb25lKHN1Y2Nlc3NIYW5kbGVySHlicmlkU3RhdGUpO1xuXHRcdFx0XHRcdFx0aUFwcFN0YXRlSHlicmlkRGVmZXJyZWQuZmFpbChmYWlsdXJlSGFuZGxlckh5YnJpZFN0YXRlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b1N1Yk15RGVmZXJyZWQucmVzb2x2ZShvQXBwU3RhdGVEYXRhLCBvU3ViU3RhcnR1cFBhcmFtZXRlcnMsIHNOYXZUeXBlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdFx0aWYgKHNJQXBwU3RhdGUpIHtcblx0XHRcdC8vIGlubmVyIGFwcCBzdGF0ZSBpcyBhdmFpbGFibGUgaW4gdGhlIEFwcEhhc2ggKGJhY2sgbmF2aWdhdGlvbik7IGV4dHJhY3QgdGhlIHBhcmFtZXRlciB2YWx1ZVxuXHRcdFx0dGhpcy5fbG9hZEFwcFN0YXRlKHNJQXBwU3RhdGUsIG9NeURlZmVycmVkLCBOYXZUeXBlLmlBcHBTdGF0ZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIG5vIGJhY2sgbmF2aWdhdGlvblxuXHRcdFx0Y29uc3QgYklzWGFwcFN0YXRlTmF2aWdhdGlvbiA9IG9Db21wb25lbnREYXRhW1wic2FwLXhhcHAtc3RhdGVcIl0gIT09IHVuZGVmaW5lZDtcblx0XHRcdGlmIChiSXNYYXBwU3RhdGVOYXZpZ2F0aW9uKSB7XG5cdFx0XHRcdGNvbnN0IHRoYXQgPSB0aGlzO1xuXHRcdFx0XHQvLyBpbm5lciBhcHAgc3RhdGUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgQXBwSGFzaCwgYnV0IHhhcHAgc3RhdGUgPT4gdHJ5IHRvIHJlYWQgdGhlIHhhcHAgc3RhdGVcblx0XHRcdFx0dGhpcy5fZ2V0QXBwTmF2aWdhdGlvblNlcnZpY2VBc3luYygpXG5cdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9Dcm9zc0FwcE5hdlNlcnZpY2U6IGFueSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb1N0YXJ0dXBQcm9taXNlID0gb0Nyb3NzQXBwTmF2U2VydmljZS5nZXRTdGFydHVwQXBwU3RhdGUodGhhdC5vQ29tcG9uZW50KTtcblx0XHRcdFx0XHRcdG9TdGFydHVwUHJvbWlzZS5kb25lKGZ1bmN0aW9uIChvQXBwU3RhdGU6IGFueSkge1xuXHRcdFx0XHRcdFx0XHQvLyBnZXQgYXBwIHN0YXRlIGZyb20gc2FwLXhhcHAtc3RhdGUsXG5cdFx0XHRcdFx0XHRcdC8vIGNyZWF0ZSBhIGNvcHksIG5vdCBvbmx5IGEgcmVmZXJlbmNlLCBiZWNhdXNlIHdlIHdhbnQgdG8gbW9kaWZ5IHRoZSBvYmplY3Rcblx0XHRcdFx0XHRcdFx0bGV0IG9BcHBTdGF0ZURhdGEgPSBvQXBwU3RhdGUuZ2V0RGF0YSgpO1xuXHRcdFx0XHRcdFx0XHRsZXQgb0Vycm9yO1xuXHRcdFx0XHRcdFx0XHRpZiAob0FwcFN0YXRlRGF0YSkge1xuXHRcdFx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvQXBwU3RhdGVEYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvQXBwU3RhdGVEYXRhKSk7XG5cdFx0XHRcdFx0XHRcdFx0fSBjYXRjaCAoeCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0b0Vycm9yID0gb05hdkhhbmRsZXIuX2NyZWF0ZVRlY2huaWNhbEVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuQXBwU3RhdGVEYXRhLnBhcnNlRXJyb3JcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHRvTXlEZWZlcnJlZC5yZWplY3Qob0Vycm9yLCBvU3RhcnR1cFBhcmFtZXRlcnMsIE5hdlR5cGUueEFwcFN0YXRlKTtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBvTXlEZWZlcnJlZC5wcm9taXNlKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKG9BcHBTdGF0ZURhdGEpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBvU2VsVmFyID0gbmV3IFNlbGVjdGlvblZhcmlhbnQob0FwcFN0YXRlRGF0YS5zZWxlY3Rpb25WYXJpYW50KTtcblxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9TZWxWYXJzID0gb05hdkhhbmRsZXIuX3NwbGl0SW5ib3VuZE5hdmlnYXRpb25QYXJhbWV0ZXJzKFxuXHRcdFx0XHRcdFx0XHRcdFx0b1NlbFZhcixcblx0XHRcdFx0XHRcdFx0XHRcdG9TdGFydHVwUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdFx0XHRcdGFEZWZhdWx0ZWRQYXJhbWV0ZXJzXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRvQXBwU3RhdGVEYXRhLnNlbGVjdGlvblZhcmlhbnQgPSBvU2VsVmFycy5vTmF2aWdhdGlvblNlbFZhci50b0pTT05TdHJpbmcoKTtcblx0XHRcdFx0XHRcdFx0XHRvQXBwU3RhdGVEYXRhLm9TZWxlY3Rpb25WYXJpYW50ID0gb1NlbFZhcnMub05hdmlnYXRpb25TZWxWYXI7XG5cdFx0XHRcdFx0XHRcdFx0b0FwcFN0YXRlRGF0YS5vRGVmYXVsdGVkU2VsZWN0aW9uVmFyaWFudCA9IG9TZWxWYXJzLm9EZWZhdWx0ZWRTZWxWYXI7XG5cdFx0XHRcdFx0XHRcdFx0b0FwcFN0YXRlRGF0YS5iTmF2U2VsVmFySGFzRGVmYXVsdHNPbmx5ID0gb1NlbFZhcnMuYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seTtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBzdWNjZXNzSGFuZGxlckh5YnJpZFN0YXRlID0gZnVuY3Rpb24gKGlBcHBTdGF0ZURhdGE6IG9iamVjdCwgX3JlZjogb2JqZWN0LCBuYXZUeXBlOiBzdHJpbmcpIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9BcHBTdGF0ZURhdGEuaUFwcFN0YXRlID0gaUFwcFN0YXRlRGF0YTtcblx0XHRcdFx0XHRcdFx0XHRcdG9NeURlZmVycmVkLnJlc29sdmUob0FwcFN0YXRlRGF0YSwgb1N0YXJ0dXBQYXJhbWV0ZXJzLCBuYXZUeXBlKTtcblx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdGlmIChoeWJyaWRJQXBwU3RhdGVLZXlQYXJhbXMgIT09IHVuZGVmaW5lZCAmJiBpQXBwU3RhdGVIeWJyaWREZWZlcnJlZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpQXBwU3RhdGVIeWJyaWREZWZlcnJlZC5kb25lKHN1Y2Nlc3NIYW5kbGVySHlicmlkU3RhdGUpO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAob0FwcFN0YXRlRGF0YVtIWUJSSURfSUFQUF9TVEFURV9LRVldKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0aGF0Ll9sb2FkQXBwU3RhdGUob0FwcFN0YXRlRGF0YVtIWUJSSURfSUFQUF9TVEFURV9LRVldLCBoeWJyaWREZWZlcnJlZCwgTmF2VHlwZS5oeWJyaWQpLmRvbmUoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHN1Y2Nlc3NIYW5kbGVySHlicmlkU3RhdGVcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9NeURlZmVycmVkLnJlc29sdmUob0FwcFN0YXRlRGF0YSwgb1N0YXJ0dXBQYXJhbWV0ZXJzLCBOYXZUeXBlLnhBcHBTdGF0ZSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKG9TdGFydHVwUGFyYW1ldGVycykge1xuXHRcdFx0XHRcdFx0XHRcdHBhcnNlVXJsUGFyYW1zKG9TdGFydHVwUGFyYW1ldGVycywgYURlZmF1bHRlZFBhcmFtZXRlcnMsIG9NeURlZmVycmVkLCBOYXZUeXBlLnhBcHBTdGF0ZSk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gc2FwLXhhcHAtc3RhdGUgbmF2aWdhdGlvbiwgYnV0IElEIGhhcyBhbHJlYWR5IGV4cGlyZWQsIGJ1dCBVUkwgcGFyYW1ldGVycyBhdmFpbGFibGVcblx0XHRcdFx0XHRcdFx0XHRvRXJyb3IgPSBvTmF2SGFuZGxlci5fY3JlYXRlVGVjaG5pY2FsRXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5nZXREYXRhRnJvbUFwcFN0YXRlLmZhaWxlZFwiKTtcblx0XHRcdFx0XHRcdFx0XHRvTXlEZWZlcnJlZC5yZWplY3Qob0Vycm9yLCBvU3RhcnR1cFBhcmFtZXRlcnMgfHwge30sIE5hdlR5cGUueEFwcFN0YXRlKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRvU3RhcnR1cFByb21pc2UuZmFpbChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9FcnJvciA9IG9OYXZIYW5kbGVyLl9jcmVhdGVUZWNobmljYWxFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLmdldFN0YXJ0dXBTdGF0ZS5mYWlsZWRcIik7XG5cdFx0XHRcdFx0XHRcdG9NeURlZmVycmVkLnJlamVjdChvRXJyb3IsIHt9LCBOYXZUeXBlLnhBcHBTdGF0ZSk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdHJldHVybiBvU3RhcnR1cFByb21pc2U7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0Vycm9yID0gb05hdkhhbmRsZXIuX2NyZWF0ZVRlY2huaWNhbEVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuX2dldEFwcE5hdmlnYXRpb25TZXJ2aWNlQXN5bmMuZmFpbGVkXCIpO1xuXHRcdFx0XHRcdFx0b015RGVmZXJyZWQucmVqZWN0KG9FcnJvciwge30sIE5hdlR5cGUueEFwcFN0YXRlKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSBpZiAob1N0YXJ0dXBQYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdC8vIG5vIHNhcC14YXBwLXN0YXRlXG5cdFx0XHRcdHBhcnNlVXJsUGFyYW1zKFxuXHRcdFx0XHRcdG9TdGFydHVwUGFyYW1ldGVycyxcblx0XHRcdFx0XHRhRGVmYXVsdGVkUGFyYW1ldGVycyxcblx0XHRcdFx0XHRvTXlEZWZlcnJlZCxcblx0XHRcdFx0XHRoeWJyaWRJQXBwU3RhdGVLZXlQYXJhbXMgIT09IHVuZGVmaW5lZCA/IE5hdlR5cGUuaHlicmlkIDogTmF2VHlwZS5VUkxQYXJhbXNcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIGluaXRpYWwgbmF2aWdhdGlvblxuXHRcdFx0XHRvTXlEZWZlcnJlZC5yZXNvbHZlKHt9LCB7fSwgTmF2VHlwZS5pbml0aWFsKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gb015RGVmZXJyZWQucHJvbWlzZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGFwcGxpY2F0aW9uIHNwZWNpZmljIHRlY2huaWNhbCBwYXJhbWV0ZXJzLiBUZWNobmljYWwgcGFyYW1ldGVycyB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgc2VsZWN0aW9uIHZhcmlhbnQgcGFzc2VkIHRvIHRoZVxuXHQgKiBhcHBsaWNhdGlvbi4gQXMgYSBkZWZhdWx0IHRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSBjb25zaWRlcmVkIGFzIHRlY2huaWNhbCBwYXJhbWV0ZXJzOlxuXHQgKiA8dWw+XG5cdCAqIDxsaT48Y29kZT5zYXAtc3lzdGVtPC9jb2RlPjwvbGk+XG5cdCAqIDxsaT48Y29kZT5zYXAtdXNoZWxsLWRlZmF1bHRlZFBhcmFtZXRlck5hbWVzPC9jb2RlPjwvbGk+XG5cdCAqIDxsaT48Y29kZT5cImhjcEFwcGxpY2F0aW9uSWRcIjwvY29kZT48L2xpPlxuXHQgKiA8L3VsPi5cblx0ICpcblx0ICogQHB1YmxpY1xuXHQgKiBAZnVuY3Rpb24gc2V0VGVjaG5pY2FsUGFyYW1ldGVyc1xuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLm5hdmlnYXRpb24uTmF2aWdhdGlvbkhhbmRsZXIucHJvdG90eXBlXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFUZWNobmljYWxQYXJhbWV0ZXJzIExpc3Qgb2YgcGFyYW1ldGVyIG5hbWVzIHRvIGJlIGNvbnNpZGVyZWQgYXMgdGVjaG5pY2FsIHBhcmFtZXRlcnMuIDxjb2RlPm51bGw8L2NvZGU+IG9yXG5cdCAqICAgICAgICA8Y29kZT51bmRlZmluZWQ8L2NvZGU+IG1heSBiZSB1c2VkIHRvIHJlc2V0IHRoZSBjb21wbGV0ZSBsaXN0LlxuXHQgKi9cblx0c2V0VGVjaG5pY2FsUGFyYW1ldGVycyhhVGVjaG5pY2FsUGFyYW1ldGVycz86IGFueVtdKSB7XG5cdFx0aWYgKCFhVGVjaG5pY2FsUGFyYW1ldGVycykge1xuXHRcdFx0YVRlY2huaWNhbFBhcmFtZXRlcnMgPSBbXTtcblx0XHR9XG5cblx0XHRpZiAoIUFycmF5LmlzQXJyYXkoYVRlY2huaWNhbFBhcmFtZXRlcnMpKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlcjogcGFyYW1ldGVyIGluY29ycmVjdCwgYXJyYXkgb2Ygc3RyaW5ncyBleHBlY3RlZFwiKTtcblx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfSU5QVVRcIik7XG5cdFx0fVxuXG5cdFx0dGhpcy5fYVRlY2huaWNhbFBhcmFtYXRlcnMgPSBhVGVjaG5pY2FsUGFyYW1ldGVycztcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBhcHBsaWNhdGlvbiBzcGVjaWZpYyB0ZWNobmljYWwgcGFyYW1ldGVycy4gVGVjaG5pY2FsIHBhcmFtZXRlcnMgd2lsbCBub3QgYmUgYWRkZWQgdG8gdGhlIHNlbGVjdGlvbiB2YXJpYW50IHBhc3NlZCB0byB0aGVcblx0ICogYXBwbGljYXRpb24uIEFzIGEgZGVmYXVsdCB0aGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgY29uc2lkZXJlZCBhcyB0ZWNobmljYWwgcGFyYW1ldGVyczpcblx0ICogPHVsPlxuXHQgKiA8bGk+PGNvZGU+c2FwLXN5c3RlbTwvY29kZT48L2xpPlxuXHQgKiA8bGk+PGNvZGU+c2FwLXVzaGVsbC1kZWZhdWx0ZWRQYXJhbWV0ZXJOYW1lczwvY29kZT48L2xpPlxuXHQgKiA8bGk+PGNvZGU+XCJoY3BBcHBsaWNhdGlvbklkXCI8L2NvZGU+PC9saT5cblx0ICogPC91bD4uXG5cdCAqXG5cdCAqIEBwdWJsaWNcblx0ICogQGZ1bmN0aW9uIGdldFRlY2huaWNhbFBhcmFtZXRlcnNcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdmlnYXRpb25IYW5kbGVyLnByb3RvdHlwZVxuXHQgKiBAcmV0dXJucyB7QXJyYXl9IENvbnRhaW5pbmcgdGhlIHRlY2huaWNhbCBwYXJhbWV0ZXJzLlxuXHQgKi9cblx0Z2V0VGVjaG5pY2FsUGFyYW1ldGVycygpOiBzdHJpbmdbXSB7XG5cdFx0cmV0dXJuIHRoaXMuX2FUZWNobmljYWxQYXJhbWF0ZXJzLmNvbmNhdChbXSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZSBwYXNzZWQgcGFyYW1ldGVyIGlzIGNvbnNpZGVyZWQgYXMgdGVjaG5pY2FsIHBhcmFtZXRlci5cblx0ICpcblx0ICogQHBhcmFtIHNQYXJhbWV0ZXJOYW1lIE5hbWUgb2YgYSByZXF1ZXN0IHBhcmFtZXRlciwgY29uc2lkZXJlZCBhcyB0ZWNobmljYWwgcGFyYW1ldGVyLlxuXHQgKiBAcmV0dXJucyBJbmRpY2F0ZXMgaWYgdGhlIHBhcmFtZXRlciBpcyBjb25zaWRlcmVkIGFzIHRlY2huaWNhbCBwYXJhbWV0ZXIgb3Igbm90LlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2lzVGVjaG5pY2FsUGFyYW1ldGVyKHNQYXJhbWV0ZXJOYW1lOiBzdHJpbmcpIHtcblx0XHRpZiAoc1BhcmFtZXRlck5hbWUpIHtcblx0XHRcdGlmIChcblx0XHRcdFx0IShcblx0XHRcdFx0XHRzUGFyYW1ldGVyTmFtZSA9PT0gXCJzYXAtdWktZmUtdmFyaWFudC1pZFwiIHx8XG5cdFx0XHRcdFx0c1BhcmFtZXRlck5hbWUgPT09IFwic2FwLXVpLWZlLXRhYmxlLXZhcmlhbnQtaWRcIiB8fFxuXHRcdFx0XHRcdHNQYXJhbWV0ZXJOYW1lID09PSBcInNhcC11aS1mZS1jaGFydC12YXJpYW50LWlkXCIgfHxcblx0XHRcdFx0XHRzUGFyYW1ldGVyTmFtZSA9PT0gXCJzYXAtdWktZmUtZmlsdGVyYmFyLXZhcmlhbnQtaWRcIlxuXHRcdFx0XHQpXG5cdFx0XHQpIHtcblx0XHRcdFx0aWYgKHNQYXJhbWV0ZXJOYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihcInNhcC1cIikgPT09IDApIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fSBlbHNlIGlmICh0aGlzLl9hVGVjaG5pY2FsUGFyYW1hdGVycy5pbmRleE9mKHNQYXJhbWV0ZXJOYW1lKSA+PSAwKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0X2lzRkVQYXJhbWV0ZXIoc1BhcmFtZXRlck5hbWU6IGFueSkge1xuXHRcdHJldHVybiBzUGFyYW1ldGVyTmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJzYXAtdWktZmVcIikgPT09IDA7XG5cdH1cblxuXHQvKipcblx0ICogUm1vdmVzIGlmIHRoZSBwYXNzZWQgcGFyYW1ldGVyIGlzIGNvbnNpZGVyZWQgYXMgdGVjaG5pY2FsIHBhcmFtZXRlci5cblx0ICpcblx0ICogQHBhcmFtIG9TZWxlY3Rpb25WYXJpYW50IFNlbGVjdGlvbiBWYXJpYW50IHdoaWNoIGNvbnNpc3RzIG9mIHRlY2huaWNhbCBQYXJhbWV0ZXJzLlxuXHQgKiBAcmV0dXJucyBTZWxlY3Rpb24gVmFyaWFudCB3aXRob3V0IHRlY2huaWNhbCBQYXJhbWV0ZXJzLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X3JlbW92ZVRlY2huaWNhbFBhcmFtZXRlcnMob1NlbGVjdGlvblZhcmlhbnQ6IFNlbGVjdGlvblZhcmlhbnQpIHtcblx0XHRsZXQgc1Byb3BOYW1lLCBpO1xuXHRcdGNvbnN0IGFTZWxWYXJQcm9wTmFtZXMgPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcygpO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBhU2VsVmFyUHJvcE5hbWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRzUHJvcE5hbWUgPSBhU2VsVmFyUHJvcE5hbWVzW2ldO1xuXHRcdFx0aWYgKHRoaXMuX2lzVGVjaG5pY2FsUGFyYW1ldGVyKHNQcm9wTmFtZSkpIHtcblx0XHRcdFx0b1NlbGVjdGlvblZhcmlhbnQucmVtb3ZlU2VsZWN0T3B0aW9uKHNQcm9wTmFtZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvU2VsZWN0aW9uVmFyaWFudDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTcGxpdHMgdGhlIHBhcmFtZXRlcnMgcHJvdmlkZWQgZHVyaW5nIGluYm91bmQgbmF2aWdhdGlvbiBhbmQgc2VwYXJhdGVzIHRoZSBjb250ZXh0dWFsIGluZm9ybWF0aW9uIGJldHdlZW4gZGVmYXVsdGVkIHBhcmFtZXRlciB2YWx1ZXMgYW5kXG5cdCAqIG5hdmlnYXRpb24gcGFyYW1ldGVycy5cblx0ICpcblx0ICogQHBhcmFtIG9TZWxlY3Rpb25WYXJpYW50IEluc3RhbmNlIG9mIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5TZWxlY3Rpb25WYXJpYW50fSBjb250YWluaW5nIG5hdmlnYXRpb24gZGF0YSBvZlxuXHQgKiAgICAgICAgdGhlIGFwcFxuXHQgKiBAcGFyYW0gb1N0YXJ0dXBQYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHN0YXJ0dXAgcGFyYW1ldGVycyBvZiB0aGUgYXBwIChkZXJpdmVkIGZyb20gdGhlIGNvbXBvbmVudClcblx0ICogQHBhcmFtIGFEZWZhdWx0ZWRQYXJhbWV0ZXJzIEFycmF5IGNvbnRhaW5pbmcgZGVmYXVsdGVkIHBhcmFtZXRlciBuYW1lc1xuXHQgKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyB0d28gU2VsZWN0aW9uVmFyaWFudHMsIG9uZSBmb3IgbmF2aWdhdGlvbiAob05hdmlnYXRpb25TZWxWYXIpIGFuZCBvbmUgZm9yIGRlZmF1bHRlZCBzdGFydHVwIHBhcmFtZXRlcnNcblx0ICogICAgICAgICAgKG9EZWZhdWx0ZWRTZWxWYXIpLCBhbmQgYSBmbGFnIChiTmF2U2VsVmFySGFzRGVmYXVsdHNPbmx5KSBpbmRpY2F0aW5nIHdoZXRoZXIgYWxsIHBhcmFtZXRlcnMgd2VyZSBkZWZhdWx0ZWQuIFRoZSBmdW5jdGlvbiBpc1xuXHQgKiAgICAgICAgICBoYW5kZWQgdHdvIG9iamVjdHMgY29udGFpbmluZyBwYXJhbWV0ZXJzIChuYW1lcyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyB2YWx1ZXMpLCBvU2VsZWN0aW9uVmFyaWFudCBhbmQgb1N0YXJ0dXBQYXJhbWV0ZXJzLiBBXG5cdCAqICAgICAgICAgIHBhcmFtZXRlciBjb3VsZCBiZSBzdG9yZWQgaW4ganVzdCBvbmUgb2YgdGhlc2UgdHdvIG9iamVjdHMgb3IgaW4gYm90aCBvZiB0aGVtIHNpbXVsdGFuZW91c2x5LiBCZWNhdXNlIG9mIHRoZSBsYXR0ZXIgY2FzZSBhXG5cdCAqICAgICAgICAgIHBhcmFtZXRlciBjb3VsZCBiZSBhc3NvY2lhdGVkIHdpdGggY29uZmxpY3RpbmcgdmFsdWVzIGFuZCBpdCBpcyB0aGUgam9iIG9mIHRoaXMgZnVuY3Rpb24gdG8gcmVzb2x2ZSBhbnkgc3VjaCBjb25mbGljdC4gUGFyYW1ldGVyc1xuXHQgKiAgICAgICAgICBhcmUgYXNzaWduZWQgdG8gdGhlIHR3byByZXR1cm5lZCBTZWxlY3Rpb25WYXJpYW50cywgb05hdmlnYXRpb25TZWxWYXIgYW5kIG9EZWZhdWx0ZWRTZWxWYXIsIGFzIGZvbGxvd3M6IHwgcGFyYW1ldGVyIE5PVCBpbiB8XG5cdCAqICAgICAgICAgIHBhcmFtZXRlciBpbiB8IG9TZWxlY3Rpb25WYXJpYW50IHwgb1NlbGVjdGlvblZhcmlhbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLSBwYXJhbWV0ZXIgTk9UIGluIHxcblx0ICogICAgICAgICAgbm90aGluZyB0byBkbyB8IEFkZCBwYXJhbWV0ZXIgb1N0YXJ0dXBQYXJhbWV0ZXJzIHwgaGVyZSB8IChzZWUgYmVsb3cpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0ICogICAgICAgICAgcGFyYW1ldGVyIGluIHwgQWRkIHBhcmFtZXRlciB8IENvbmZsaWN0IHJlc29sdXRpb24gb1N0YXJ0dXBQYXJhbWV0ZXJzIHwgKHNlZSBiZWxvdykgfCAoc2VlIGJlbG93KSBBZGQgcGFyYW1ldGVyOiBpZiBwYXJhbWV0ZXIgaW5cblx0ICogICAgICAgICAgYURlZmF1bHRlZFBhcmFtZXRlcnM6IGFkZCBwYXJhbWV0ZXIgdG8gb0RlZmF1bHRlZFNlbFZhciBlbHNlOiBhZGQgcGFyYW1ldGVyIHRvIG9OYXZpZ2F0aW9uU2VsVmFyIENvbmZsaWN0IHJlc29sdXRpb246IGlmIHBhcmFtZXRlclxuXHQgKiAgICAgICAgICBpbiBhRGVmYXVsdGVkUGFyYW1ldGVyczogYWRkIHBhcmFtZXRlciB2YWx1ZSBmcm9tIG9TZWxlY3Rpb25WYXJpYW50IHRvIG9OYXZpZ2F0aW9uU2VsVmFyIGFkZCBwYXJhbWV0ZXIgdmFsdWUgZnJvbVxuXHQgKiAgICAgICAgICBvU3RhcnR1cFBhcmFtZXRlcnMgdG8gb0RlZmF1bHRlZFNlbFZhciBOb3RlOiBUaGlzIGNhc2Ugb25seSBvY2N1cnMgaW4gVUk1IDEuMzIuIEluIGxhdGVyIHZlcnNpb25zIFVTaGVsbCBzdG9yZXMgYW55IGRlZmF1bHRlZFxuXHQgKiAgICAgICAgICBwYXJhbWV0ZXIgZWl0aGVyIGluIG9TZWxlY3Rpb25WYXJpYW50IG9yIG9TdGFydHVwUGFyYW1ldGVycyBidXQgbmV2ZXIgc2ltdWx0YW5lb3VzbHkgaW4gYm90aC4gZWxzZTogQ2hvb3NlIDEgb2YgdGhlIGZvbGxvd2luZ1xuXHQgKiAgICAgICAgICBvcHRpb25zIGJhc2VkIG9uIGdpdmVuIGhhbmRsaW5nIG1vZGUgKHRoaXMuc1BhcmFtSGFuZGxpbmdNb2RlKS4gLT4gYWRkIHBhcmFtZXRlciB2YWx1ZSBmcm9tIG9TdGFydHVwUGFyYW1ldGVycyB0b1xuXHQgKiAgICAgICAgICBvTmF2aWdhdGlvblNlbFZhciB8IC0+IGFkZCBwYXJhbWV0ZXIgdmFsdWUgZnJvbSBvQXBwU3RhdGUuc2VsZWN0aW9uVmFyaWFudCB0byBvTmF2aWdhdGlvblNlbFZhciAtPiBhZGQgYm90aCBwYXJhbWV0ZXIgdmFsdWVzIHRvXG5cdCAqICAgICAgICAgIG5hdmlnYXRpb25TZWxWYXIgSWYgbmF2aWdhdGlvblNlbFZhciBpcyBzdGlsbCBlbXB0eSBhdCB0aGUgZW5kIG9mIGV4ZWN1dGlvbiwgbmF2aWdhdGlvblNlbFZhciBpcyByZXBsYWNlZCBieSBhIGNvcHkgb2Zcblx0ICogICAgICAgICAgb0RlZmF1bHRlZFNlbFZhciBhbmQgdGhlIGZsYWcgYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seSBpcyBzZXQgdG8gdHJ1ZS4gVGhlIHNlbGVjdGlvbiB2YXJpYW50IG9EZWZhdWx0ZWRTZWxWYXIgaXRzZWxmIGlzIGFsd2F5c1xuXHQgKiAgICAgICAgICByZXR1cm5lZCBhcyBpcy5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9zcGxpdEluYm91bmROYXZpZ2F0aW9uUGFyYW1ldGVycyhcblx0XHRvU2VsZWN0aW9uVmFyaWFudDogSW5zdGFuY2VUeXBlPHR5cGVvZiBTZWxlY3Rpb25WYXJpYW50Pixcblx0XHRvU3RhcnR1cFBhcmFtZXRlcnM6IHsgW2tleTogc3RyaW5nXTogYW55IH0sXG5cdFx0YURlZmF1bHRlZFBhcmFtZXRlcnM6IGFueVtdXG5cdCkge1xuXHRcdGlmICghQXJyYXkuaXNBcnJheShhRGVmYXVsdGVkUGFyYW1ldGVycykpIHtcblx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfSU5QVVRcIik7XG5cdFx0fVxuXG5cdFx0bGV0IHNQcm9wTmFtZSwgaTtcblx0XHQvLyBGaXJzdCB3ZSBkbyBzb21lIHBhcnNpbmcgb2YgdGhlIFN0YXJ0VXAgUGFyYW1ldGVycy5cblx0XHRjb25zdCBvU3RhcnR1cFBhcmFtZXRlcnNBZGp1c3RlZDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuXHRcdGZvciAoc1Byb3BOYW1lIGluIG9TdGFydHVwUGFyYW1ldGVycykge1xuXHRcdFx0aWYgKCFvU3RhcnR1cFBhcmFtZXRlcnMuaGFzT3duUHJvcGVydHkoc1Byb3BOYW1lKSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gaWYgKHNQcm9wTmFtZSA9PT0gU0FQX1NZU1RFTV9QUk9QRVJUWSB8fCBzUHJvcE5hbWUgPT09IERFRkFVTFRFRF9QQVJBTUVURVJfUFJPUEVSVFkpIHtcblx0XHRcdGlmICh0aGlzLl9pc1RlY2huaWNhbFBhcmFtZXRlcihzUHJvcE5hbWUpIHx8IHRoaXMuX2lzRkVQYXJhbWV0ZXIoc1Byb3BOYW1lKSB8fCBzUHJvcE5hbWUgPT09IEhZQlJJRF9JQVBQX1NUQVRFX0tFWSkge1xuXHRcdFx0XHQvLyBEbyBub3QgYWRkIHRoZSBTQVAgc3lzdGVtIHBhcmFtZXRlciB0byB0aGUgc2VsZWN0aW9uIHZhcmlhbnQgYXMgaXQgaXMgYSB0ZWNobmljYWwgcGFyYW1ldGVyXG5cdFx0XHRcdC8vIG5vdCByZWxldmFudCBmb3IgdGhlIHNlbGVjdGlvbiB2YXJpYW50LlxuXHRcdFx0XHQvLyBEbyBub3QgYWRkIHRoZSBzdGFydHVwIHBhcmFtZXRlciBmb3IgZGVmYXVsdCB2YWx1ZXMgdG8gdGhlIHNlbGVjdGlvbiB2YXJpYW50LiBUaGUgaW5mb3JtYXRpb24sIHdoaWNoIHBhcmFtZXRlcnNcblx0XHRcdFx0Ly8gYXJlIGRlZmF1bHRlZCwgaXMgYXZhaWxhYmxlIGluIHRoZSBkZWZhdWx0ZWQgc2VsZWN0aW9uIHZhcmlhbnQuXG5cdFx0XHRcdC8vIEluIGNhc2UsIEZFIFBhcmFtZXRlcnMgd2Ugc2hhbGwgc2tpcCBpdC4odGhlIGFwcGxpY2F0aW9uIG5lZWRzIHRvIGZldGNoIGl0IGZyb20gVVJMIHBhcmFtcylcblx0XHRcdFx0Ly8gU2tpcCB0aGUgaHlicmlkSUFwcFN0YXRlS2V5IHByZXNlbnQgYXMgcGFydCBvZiAnSHlicmlkJyBuYXZpZ2F0aW9uIHR5cGUgbm90IHJlbGV2YW50IGZvciB0aGUgc2VsZWN0aW9uIHZhcmlhbnRcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFdlIHN1cHBvcnQgcGFyYW1ldGVycyBhcyBhIG1hcCB3aXRoIHN0cmluZ3MgYW5kIGFzIGEgbWFwIHdpdGggdmFsdWUgYXJyYXlzXG5cdFx0XHRpZiAodHlwZW9mIG9TdGFydHVwUGFyYW1ldGVyc1tzUHJvcE5hbWVdID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdG9TdGFydHVwUGFyYW1ldGVyc0FkanVzdGVkW3NQcm9wTmFtZV0gPSBvU3RhcnR1cFBhcmFtZXRlcnNbc1Byb3BOYW1lXTtcblx0XHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvU3RhcnR1cFBhcmFtZXRlcnNbc1Byb3BOYW1lXSkgJiYgb1N0YXJ0dXBQYXJhbWV0ZXJzW3NQcm9wTmFtZV0ubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdG9TdGFydHVwUGFyYW1ldGVyc0FkanVzdGVkW3NQcm9wTmFtZV0gPSBvU3RhcnR1cFBhcmFtZXRlcnNbc1Byb3BOYW1lXVswXTsgLy8gc2luZ2xlLXZhbHVlZCBwYXJhbWV0ZXJzXG5cdFx0XHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob1N0YXJ0dXBQYXJhbWV0ZXJzW3NQcm9wTmFtZV0pICYmIG9TdGFydHVwUGFyYW1ldGVyc1tzUHJvcE5hbWVdLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzQWRqdXN0ZWRbc1Byb3BOYW1lXSA9IG9TdGFydHVwUGFyYW1ldGVyc1tzUHJvcE5hbWVdOyAvLyBtdWx0aS12YWx1ZWQgcGFyYW1ldGVyc1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9JTlBVVFwiKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDb25zdHJ1Y3QgdHdvIHNlbGVjdGlvbiB2YXJpYW50cyBmb3IgZGVmYXVsdHMgYW5kIG5hdmlnYXRpb24gdG8gYmUgcmV0dXJuZWQgYnkgdGhlIGZ1bmN0aW9uLlxuXHRcdGNvbnN0IG9EZWZhdWx0ZWRTZWxWYXIgPSBuZXcgU2VsZWN0aW9uVmFyaWFudCgpO1xuXHRcdGNvbnN0IG9OYXZpZ2F0aW9uU2VsVmFyID0gbmV3IFNlbGVjdGlvblZhcmlhbnQoKTtcblxuXHRcdGNvbnN0IGFTZWxWYXJQcm9wTmFtZXMgPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRQYXJhbWV0ZXJOYW1lcygpLmNvbmNhdChvU2VsZWN0aW9uVmFyaWFudC5nZXRTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcygpKTtcblx0XHRmb3IgKGkgPSAwOyBpIDwgYVNlbFZhclByb3BOYW1lcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0c1Byb3BOYW1lID0gYVNlbFZhclByb3BOYW1lc1tpXTtcblx0XHRcdGlmIChzUHJvcE5hbWUgaW4gb1N0YXJ0dXBQYXJhbWV0ZXJzQWRqdXN0ZWQpIHtcblx0XHRcdFx0Ly8gUmVzb2x2ZSBjb25mbGljdC5cblx0XHRcdFx0aWYgKGFEZWZhdWx0ZWRQYXJhbWV0ZXJzLmluZGV4T2Yoc1Byb3BOYW1lKSA+IC0xKSB7XG5cdFx0XHRcdFx0b05hdmlnYXRpb25TZWxWYXIubWFzc0FkZFNlbGVjdE9wdGlvbihzUHJvcE5hbWUsIG9TZWxlY3Rpb25WYXJpYW50LmdldFZhbHVlKHNQcm9wTmFtZSkhKTtcblx0XHRcdFx0XHR0aGlzLl9hZGRQYXJhbWV0ZXJWYWx1ZXMob0RlZmF1bHRlZFNlbFZhciwgc1Byb3BOYW1lLCBcIklcIiwgXCJFUVwiLCBvU3RhcnR1cFBhcmFtZXRlcnNBZGp1c3RlZFtzUHJvcE5hbWVdKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzd2l0Y2ggKHRoaXMuc1BhcmFtSGFuZGxpbmdNb2RlKSB7XG5cdFx0XHRcdFx0XHRjYXNlIFBhcmFtSGFuZGxpbmdNb2RlLlNlbFZhcldpbnM6XG5cdFx0XHRcdFx0XHRcdG9OYXZpZ2F0aW9uU2VsVmFyLm1hc3NBZGRTZWxlY3RPcHRpb24oc1Byb3BOYW1lLCBvU2VsZWN0aW9uVmFyaWFudC5nZXRWYWx1ZShzUHJvcE5hbWUpISk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSBQYXJhbUhhbmRsaW5nTW9kZS5VUkxQYXJhbVdpbnM6XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2FkZFBhcmFtZXRlclZhbHVlcyhvTmF2aWdhdGlvblNlbFZhciwgc1Byb3BOYW1lLCBcIklcIiwgXCJFUVwiLCBvU3RhcnR1cFBhcmFtZXRlcnNBZGp1c3RlZFtzUHJvcE5hbWVdKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlIFBhcmFtSGFuZGxpbmdNb2RlLkluc2VydEluU2VsT3B0OlxuXHRcdFx0XHRcdFx0XHRvTmF2aWdhdGlvblNlbFZhci5tYXNzQWRkU2VsZWN0T3B0aW9uKHNQcm9wTmFtZSwgb1NlbGVjdGlvblZhcmlhbnQuZ2V0VmFsdWUoc1Byb3BOYW1lKSEpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLl9hZGRQYXJhbWV0ZXJWYWx1ZXMob05hdmlnYXRpb25TZWxWYXIsIHNQcm9wTmFtZSwgXCJJXCIsIFwiRVFcIiwgb1N0YXJ0dXBQYXJhbWV0ZXJzQWRqdXN0ZWRbc1Byb3BOYW1lXSk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9JTlBVVFwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoYURlZmF1bHRlZFBhcmFtZXRlcnMuaW5kZXhPZihzUHJvcE5hbWUpID4gLTEpIHtcblx0XHRcdFx0Ly8gcGFyYW1ldGVyIG9ubHkgaW4gU2VsVmFyXG5cdFx0XHRcdG9EZWZhdWx0ZWRTZWxWYXIubWFzc0FkZFNlbGVjdE9wdGlvbihzUHJvcE5hbWUsIG9TZWxlY3Rpb25WYXJpYW50LmdldFZhbHVlKHNQcm9wTmFtZSkhKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9OYXZpZ2F0aW9uU2VsVmFyLm1hc3NBZGRTZWxlY3RPcHRpb24oc1Byb3BOYW1lLCBvU2VsZWN0aW9uVmFyaWFudC5nZXRWYWx1ZShzUHJvcE5hbWUpISk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Zm9yIChzUHJvcE5hbWUgaW4gb1N0YXJ0dXBQYXJhbWV0ZXJzQWRqdXN0ZWQpIHtcblx0XHRcdC8vIFRoZSBjYXNlIHdoZXJlIHRoZSBwYXJhbWV0ZXIgYXBwZWFycyB0d2ljZSBoYXMgYWxyZWFkeSBiZWVuIHRha2VuIGNhcmUgb2YgYWJvdmUgc28gd2Ugc2tpcCBpdCBoZXJlLlxuXHRcdFx0aWYgKGFTZWxWYXJQcm9wTmFtZXMuaW5kZXhPZihzUHJvcE5hbWUpID4gLTEpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChhRGVmYXVsdGVkUGFyYW1ldGVycy5pbmRleE9mKHNQcm9wTmFtZSkgPiAtMSkge1xuXHRcdFx0XHR0aGlzLl9hZGRQYXJhbWV0ZXJWYWx1ZXMob0RlZmF1bHRlZFNlbFZhciwgc1Byb3BOYW1lLCBcIklcIiwgXCJFUVwiLCBvU3RhcnR1cFBhcmFtZXRlcnNBZGp1c3RlZFtzUHJvcE5hbWVdKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuX2FkZFBhcmFtZXRlclZhbHVlcyhvTmF2aWdhdGlvblNlbFZhciwgc1Byb3BOYW1lLCBcIklcIiwgXCJFUVwiLCBvU3RhcnR1cFBhcmFtZXRlcnNBZGp1c3RlZFtzUHJvcE5hbWVdKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyB0aGUgc2VsZWN0aW9uIHZhcmlhbnQgdXNlZCBmb3IgbmF2aWdhdGlvbiBzaG91bGQgYmUgZmlsbGVkIHdpdGggZGVmYXVsdHMgaW4gY2FzZSB0aGF0IG9ubHkgZGVmYXVsdHMgZXhpc3Rcblx0XHRsZXQgYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seSA9IGZhbHNlO1xuXHRcdGlmIChvTmF2aWdhdGlvblNlbFZhci5pc0VtcHR5KCkpIHtcblx0XHRcdGJOYXZTZWxWYXJIYXNEZWZhdWx0c09ubHkgPSB0cnVlO1xuXHRcdFx0Y29uc3QgYVByb3BOYW1lcyA9IG9EZWZhdWx0ZWRTZWxWYXIuZ2V0U2VsZWN0T3B0aW9uc1Byb3BlcnR5TmFtZXMoKTtcblx0XHRcdGZvciAoaSA9IDA7IGkgPCBhUHJvcE5hbWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdG9OYXZpZ2F0aW9uU2VsVmFyLm1hc3NBZGRTZWxlY3RPcHRpb24oYVByb3BOYW1lc1tpXSwgb0RlZmF1bHRlZFNlbFZhci5nZXRWYWx1ZShhUHJvcE5hbWVzW2ldKSEpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRvTmF2aWdhdGlvblNlbFZhcjogb05hdmlnYXRpb25TZWxWYXIsXG5cdFx0XHRvRGVmYXVsdGVkU2VsVmFyOiBvRGVmYXVsdGVkU2VsVmFyLFxuXHRcdFx0Yk5hdlNlbFZhckhhc0RlZmF1bHRzT25seTogYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seVxuXHRcdH07XG5cdH1cblxuXHRfYWRkUGFyYW1ldGVyVmFsdWVzKG9TZWxWYXJpYW50OiBhbnksIHNQcm9wTmFtZTogYW55LCBzU2lnbjogYW55LCBzT3B0aW9uOiBhbnksIG9WYWx1ZXM6IGFueSkge1xuXHRcdGlmIChBcnJheS5pc0FycmF5KG9WYWx1ZXMpKSB7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG9WYWx1ZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0b1NlbFZhcmlhbnQuYWRkU2VsZWN0T3B0aW9uKHNQcm9wTmFtZSwgc1NpZ24sIHNPcHRpb24sIG9WYWx1ZXNbaV0pO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRvU2VsVmFyaWFudC5hZGRTZWxlY3RPcHRpb24oc1Byb3BOYW1lLCBzU2lnbiwgc09wdGlvbiwgb1ZhbHVlcyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZXMgdGhlIFVSTCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgc0FwcFN0YXRlS2V5LiBBcyBhbiByZWFjdGlvbiByb3V0ZSBjaGFuZ2UgZXZlbnQgd2lsbCBiZSB0cmlnZ2VyZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBzQXBwU3RhdGVLZXkgVGhlIG5ldyBhcHAgc3RhdGUga2V5LlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRyZXBsYWNlSGFzaChzQXBwU3RhdGVLZXk6IHN0cmluZykge1xuXHRcdGNvbnN0IG9IYXNoQ2hhbmdlciA9IHRoaXMub1JvdXRlci5vSGFzaENoYW5nZXIgPyB0aGlzLm9Sb3V0ZXIub0hhc2hDaGFuZ2VyIDogSGFzaENoYW5nZXIuZ2V0SW5zdGFuY2UoKTtcblx0XHRjb25zdCBzQXBwSGFzaE9sZCA9IG9IYXNoQ2hhbmdlci5nZXRIYXNoKCk7XG5cdFx0Lypcblx0XHQgKiB1c2UgLmdldEhhc2goKSBoZXJlIGluc3RlYWQgb2YgLmdldEFwcEhhc2goKSB0byBhbHNvIGJlIGFibGUgZGVhbGluZyB3aXRoIGVudmlyb25tZW50cyB3aGVyZSBvbmx5IFNBUFVJNSBpcyBsb2FkZWQgYW5kIHRoZSBVU2hlbGwgaXNcblx0XHQgKiBub3QgaW5pdGlhbGl6ZWQgcHJvcGVybHkuXG5cdFx0ICovXG5cdFx0Y29uc3Qgc0FwcEhhc2hOZXcgPSB0aGlzLl9yZXBsYWNlSW5uZXJBcHBTdGF0ZUtleShzQXBwSGFzaE9sZCwgc0FwcFN0YXRlS2V5KTtcblx0XHRvSGFzaENoYW5nZXIucmVwbGFjZUhhc2goc0FwcEhhc2hOZXcpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZXMgdGhlIFVSTCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgYXBwIHN0YXRlIGFuZCBzdG9yZXMgdGhlIGFwcCBzdGF0ZSBmb3IgbGF0ZXIgcmV0cmlldmFsLlxuXHQgKlxuXHQgKiBAcGFyYW0gbUlubmVyQXBwRGF0YSBPYmplY3QgY29udGFpbmluZyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYXBwXG5cdCAqIEBwYXJhbSBiSW1tZWRpYXRlSGFzaFJlcGxhY2UgSWYgc2V0IHRvIGZhbHNlLCB0aGUgaW5uZXIgYXBwIGhhc2ggd2lsbCBub3QgYmUgcmVwbGFjZWQgdW50aWwgc3RvcmluZyBpcyBzdWNjZXNzZnVsOyBkbyBub3Rcblx0ICogICAgICAgIHNldCB0byBmYWxzZSBpZiB5b3UgY2Fubm90IHJlYWN0IHRvIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBQcm9taXNlLCBmb3IgZXhhbXBsZSwgd2hlbiBjYWxsaW5nIHRoZSBiZWZvcmVMaW5rUHJlc3NlZCBldmVudFxuXHQgKiBAcGFyYW0gYlNraXBIYXNoUmVwbGFjZSBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGlubmVyIGFwcCBoYXNoIHdpbGwgbm90IGJlIHJlcGxhY2VkIGluIHRoZSBzdG9yZUlubmVyQXBwU3RhdGVBc3luYy4gQWxzbyB0aGUgYkltbWVkaWF0ZUhhc2hSZXBsYWNlXG5cdCAqIFx0XHQgIHdpbGwgYmUgaWdub3JlZC5cblx0ICogQHJldHVybnMgQSBQcm9taXNlIG9iamVjdCB0byBtb25pdG9yIHdoZW4gYWxsIHRoZSBhY3Rpb25zIG9mIHRoZSBmdW5jdGlvbiBoYXZlIGJlZW4gZXhlY3V0ZWQ7IGlmIHRoZSBleGVjdXRpb24gaXMgc3VjY2Vzc2Z1bCwgdGhlXG5cdCAqICAgICAgICAgIGFwcCBzdGF0ZSBrZXkgaXMgcmV0dXJuZWQ7IGlmIGFuIGVycm9yIG9jY3VycywgYW4gb2JqZWN0IG9mIHR5cGUge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdkVycm9yfSBpc1xuXHQgKiAgICAgICAgICByZXR1cm5lZFxuXHQgKiBAcHVibGljXG5cdCAqIEBleGFtcGxlIDxjb2RlPlxuXHQgKiBzYXAudWkuZGVmaW5lKFtcInNhcC9mZS9uYXZpZ2F0aW9uL05hdmlnYXRpb25IYW5kbGVyXCJdLCBmdW5jdGlvbiAoTmF2aWdhdGlvbkhhbmRsZXIpIHtcblx0ICogXHR2YXIgb05hdmlnYXRpb25IYW5kbGVyID0gbmV3IE5hdmlnYXRpb25IYW5kbGVyKG9Db250cm9sbGVyKTtcblx0ICogXHR2YXIgbUlubmVyQXBwRGF0YSA9IHtcblx0ICogXHRcdHNlbGVjdGlvblZhcmlhbnQgOiBvU21hcnRGaWx0ZXJCYXIuZ2V0RGF0YVN1aXRlRm9ybWF0KCksXG5cdCAqIFx0XHR0YWJsZVZhcmlhbnRJZCA6IG9TbWFydFRhYmxlLmdldEN1cnJlbnRWYXJpYW50SWQoKSxcblx0ICogXHRcdGN1c3RvbURhdGEgOiBvTXlDdXN0b21EYXRhXG5cdCAqIFx0fTtcblx0ICpcblx0ICogXHR2YXIgb1N0b3JlSW5uZXJBcHBTdGF0ZVByb21pc2UgPSBvTmF2aWdhdGlvbkhhbmRsZXIuc3RvcmVJbm5lckFwcFN0YXRlQXN5bmMobUlubmVyQXBwRGF0YSk7XG5cdCAqXG5cdCAqIFx0b1N0b3JlSW5uZXJBcHBTdGF0ZVByb21pc2UuZG9uZShmdW5jdGlvbihzQXBwU3RhdGVLZXkpe1xuXHQgKiBcdFx0Ly95b3VyIGlubmVyIGFwcCBzdGF0ZSBpcyBzYXZlZCBub3csIHNBcHBTdGF0ZUtleSB3YXMgYWRkZWQgdG8gVVJMXG5cdCAqIFx0XHQvL3BlcmZvcm0gYWN0aW9ucyB0aGF0IG11c3QgcnVuIGFmdGVyIHNhdmVcblx0ICogXHR9KTtcblx0ICpcblx0ICogXHRvU3RvcmVJbm5lckFwcFN0YXRlUHJvbWlzZS5mYWlsKGZ1bmN0aW9uKG9FcnJvcil7XG5cdCAqIFx0XHQvL3NvbWUgZXJyb3IgaGFuZGxpbmdcblx0ICogXHR9KTtcblx0ICogfSk7XG5cdCAqIDwvY29kZT5cblx0ICovXG5cdHN0b3JlSW5uZXJBcHBTdGF0ZUFzeW5jKFxuXHRcdG1Jbm5lckFwcERhdGE6IElubmVyQXBwRGF0YSxcblx0XHRiSW1tZWRpYXRlSGFzaFJlcGxhY2U/OiBib29sZWFuLFxuXHRcdGJTa2lwSGFzaFJlcGxhY2U/OiBib29sZWFuXG5cdCk6IGpRdWVyeS5Qcm9taXNlPHN0cmluZz4ge1xuXHRcdGlmICh0eXBlb2YgYkltbWVkaWF0ZUhhc2hSZXBsYWNlICE9PSBcImJvb2xlYW5cIikge1xuXHRcdFx0YkltbWVkaWF0ZUhhc2hSZXBsYWNlID0gdHJ1ZTsgLy8gZGVmYXVsdFxuXHRcdH1cblx0XHRjb25zdCBvTmF2SGFuZGxlciA9IHRoaXM7XG5cdFx0Y29uc3Qgb015RGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKTtcblxuXHRcdGNvbnN0IGZuUmVwbGFjZUhhc2ggPSBmdW5jdGlvbiAoc0FwcFN0YXRlS2V5OiBhbnkpIHtcblx0XHRcdGNvbnN0IG9IYXNoQ2hhbmdlciA9IG9OYXZIYW5kbGVyLm9Sb3V0ZXIub0hhc2hDaGFuZ2VyID8gb05hdkhhbmRsZXIub1JvdXRlci5vSGFzaENoYW5nZXIgOiBIYXNoQ2hhbmdlci5nZXRJbnN0YW5jZSgpO1xuXHRcdFx0Y29uc3Qgc0FwcEhhc2hPbGQgPSBvSGFzaENoYW5nZXIuZ2V0SGFzaCgpO1xuXHRcdFx0Lypcblx0XHRcdCAqIHVzZSAuZ2V0SGFzaCgpIGhlcmUgaW5zdGVhZCBvZiAuZ2V0QXBwSGFzaCgpIHRvIGFsc28gYmUgYWJsZSBkZWFsaW5nIHdpdGggZW52aXJvbm1lbnRzIHdoZXJlIG9ubHkgU0FQVUk1IGlzIGxvYWRlZCBhbmQgdGhlIFVTaGVsbFxuXHRcdFx0ICogaXMgbm90IGluaXRpYWxpemVkIHByb3Blcmx5LlxuXHRcdFx0ICovXG5cdFx0XHRjb25zdCBzQXBwSGFzaE5ldyA9IG9OYXZIYW5kbGVyLl9yZXBsYWNlSW5uZXJBcHBTdGF0ZUtleShzQXBwSGFzaE9sZCwgc0FwcFN0YXRlS2V5KTtcblx0XHRcdG9IYXNoQ2hhbmdlci5yZXBsYWNlSGFzaChzQXBwSGFzaE5ldyk7XG5cdFx0fTtcblxuXHRcdC8vIGluIGNhc2UgbUlubmVyQXBwU3RhdGUgaXMgZW1wdHksIGRvIG5vdCBvdmVyd3JpdGUgdGhlIGxhc3Qgc2F2ZWQgc3RhdGVcblx0XHRpZiAoaXNFbXB0eU9iamVjdChtSW5uZXJBcHBEYXRhIGFzIG9iamVjdCkpIHtcblx0XHRcdG9NeURlZmVycmVkLnJlc29sdmUoXCJcIik7XG5cdFx0XHRyZXR1cm4gb015RGVmZXJyZWQucHJvbWlzZSgpO1xuXHRcdH1cblxuXHRcdC8vIGNoZWNrIGlmIHdlIGFscmVhZHkgc2F2ZWQgdGhlIHNhbWUgZGF0YVxuXHRcdGNvbnN0IHNBcHBTdGF0ZUtleUNhY2hlZCA9IHRoaXMuX29MYXN0U2F2ZWRJbm5lckFwcERhdGEuc0FwcFN0YXRlS2V5O1xuXG5cdFx0Y29uc3QgYklubmVyQXBwRGF0YUVxdWFsID0gSlNPTi5zdHJpbmdpZnkobUlubmVyQXBwRGF0YSkgPT09IEpTT04uc3RyaW5naWZ5KHRoaXMuX29MYXN0U2F2ZWRJbm5lckFwcERhdGEub0FwcERhdGEpO1xuXHRcdGlmIChiSW5uZXJBcHBEYXRhRXF1YWwgJiYgc0FwcFN0YXRlS2V5Q2FjaGVkKSB7XG5cdFx0XHQvLyBwYXNzZWQgaW5uZXIgYXBwIHN0YXRlIGZvdW5kIGluIGNhY2hlXG5cdFx0XHR0aGlzLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLmlDYWNoZUhpdCsrO1xuXG5cdFx0XHQvLyByZXBsYWNlIGlubmVyIGFwcCBoYXNoIHdpdGggY2FjaGVkIGFwcFN0YXRlS2V5IGluIHVybCAoanVzdCBpbiBjYXNlIHRoZSBhcHAgaGFzIGNoYW5nZWQgdGhlIGhhc2ggaW4gbWVhbnRpbWUpXG5cdFx0XHRmblJlcGxhY2VIYXNoKHNBcHBTdGF0ZUtleUNhY2hlZCk7XG5cdFx0XHRvTXlEZWZlcnJlZC5yZXNvbHZlKHNBcHBTdGF0ZUtleUNhY2hlZCk7XG5cdFx0XHRyZXR1cm4gb015RGVmZXJyZWQucHJvbWlzZSgpO1xuXHRcdH1cblxuXHRcdC8vIHBhc3NlZCBpbm5lciBhcHAgc3RhdGUgbm90IGZvdW5kIGluIGNhY2hlXG5cdFx0dGhpcy5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5pQ2FjaGVNaXNzKys7XG5cblx0XHRjb25zdCBmbk9uQWZ0ZXJTYXZlID0gZnVuY3Rpb24gKHNBcHBTdGF0ZUtleTogYW55KSB7XG5cdFx0XHQvLyByZXBsYWNlIGlubmVyIGFwcCBoYXNoIHdpdGggbmV3IGFwcFN0YXRlS2V5IGluIHVybFxuXHRcdFx0aWYgKCFiU2tpcEhhc2hSZXBsYWNlICYmICFiSW1tZWRpYXRlSGFzaFJlcGxhY2UpIHtcblx0XHRcdFx0Zm5SZXBsYWNlSGFzaChzQXBwU3RhdGVLZXkpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyByZW1lbWJlciBsYXN0IHNhdmVkIHN0YXRlXG5cdFx0XHRvTmF2SGFuZGxlci5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5vQXBwRGF0YSA9IG1Jbm5lckFwcERhdGE7XG5cdFx0XHRvTmF2SGFuZGxlci5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5zQXBwU3RhdGVLZXkgPSBzQXBwU3RhdGVLZXk7XG5cdFx0XHRvTXlEZWZlcnJlZC5yZXNvbHZlKHNBcHBTdGF0ZUtleSk7XG5cdFx0fTtcblxuXHRcdGNvbnN0IGZuT25FcnJvciA9IGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0b015RGVmZXJyZWQucmVqZWN0KG9FcnJvcik7XG5cdFx0fTtcblxuXHRcdHRoaXMuX3NhdmVBcHBTdGF0ZUFzeW5jKG1Jbm5lckFwcERhdGEsIGZuT25BZnRlclNhdmUsIGZuT25FcnJvcilcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChzQXBwU3RhdGVLZXk6IGFueSkge1xuXHRcdFx0XHQvKiBOb3RlIHRoYXQgX3NhcEFwcFN0YXRlIG1heSByZXR1cm4gJ3VuZGVmaW5lZCcgaW4gY2FzZSB0aGF0IHRoZSBwYXJzaW5nIGhhcyBmYWlsZWQuIEluIHRoaXMgY2FzZSwgd2Ugc2hvdWxkIG5vdCB0cmlnZ2VyIHRoZSByZXBsYWNlbWVudFxuXHRcdFx0XHQgKiBvZiB0aGUgQXBwIEhhc2ggd2l0aCB0aGUgZ2VuZXJhdGVkIGtleSwgYXMgdGhlIGNvbnRhaW5lciB3YXMgbm90IHdyaXR0ZW4gYmVmb3JlLiBOb3RlIGFzIHdlbGwgdGhhdCB0aGUgZXJyb3IgaGFuZGxpbmcgaGFzIGFscmVhZHlcblx0XHRcdFx0ICogaGFwcGVuZWQgYmVmb3JlIGJ5IG1ha2luZyB0aGUgb015RGVmZXJyZWQgcHJvbWlzZSBmYWlsIChzZWUgZm5PbkVycm9yIGFib3ZlKS5cblx0XHRcdFx0ICovXG5cdFx0XHRcdGlmIChzQXBwU3RhdGVLZXkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdC8vIHJlcGxhY2UgaW5uZXIgYXBwIGhhc2ggd2l0aCBuZXcgYXBwU3RhdGVLZXkgaW4gdXJsXG5cdFx0XHRcdFx0Ly8gbm90ZTogd2UgZG8gbm90IHdhaXQgZm9yIHRoZSBzYXZlIHRvIGJlIGNvbXBsZXRlZDogdGhpcyBhc3luY2hyb25vdXNseSBiZWhhdmlvdXIgaXMgbmVjZXNzYXJ5IGlmXG5cdFx0XHRcdFx0Ly8gdGhpcyBtZXRob2QgaXMgY2FsbGVkIGUuZy4gaW4gYSBvbkxpbmtQcmVzc2VkIGV2ZW50IHdpdGggbm8gcG9zc2liaWxpdHkgdG8gd2FpdCBmb3IgdGhlIHByb21pc2UgcmVzb2x1dGlvblxuXHRcdFx0XHRcdGlmICghYlNraXBIYXNoUmVwbGFjZSAmJiBiSW1tZWRpYXRlSGFzaFJlcGxhY2UpIHtcblx0XHRcdFx0XHRcdGZuUmVwbGFjZUhhc2goc0FwcFN0YXRlS2V5KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5fc2F2ZUFwcFN0YXRlQXN5bmMgZmFpbGVkXCIpO1xuXHRcdFx0fSk7XG5cblx0XHRyZXR1cm4gb015RGVmZXJyZWQucHJvbWlzZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZXMgdGhlIFVSTCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgYXBwIHN0YXRlIGFuZCBzdG9yZXMgdGhlIGFwcCBzdGF0ZSBmb3IgbGF0ZXIgcmV0cmlldmFsLlxuXHQgKlxuXHQgKiBAcGFyYW0gbUlubmVyQXBwRGF0YSBPYmplY3QgY29udGFpbmluZyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYXBwXG5cdCAqIEBwYXJhbSBiSW1tZWRpYXRlSGFzaFJlcGxhY2UgSWYgc2V0IHRvIGZhbHNlLCB0aGUgaW5uZXIgYXBwIGhhc2ggd2lsbCBub3QgYmUgcmVwbGFjZWQgdW50aWwgc3RvcmluZyBpcyBzdWNjZXNzZnVsOyBkbyBub3Rcblx0ICogICAgICAgIHNldCB0byBmYWxzZSBpZiB5b3UgY2Fubm90IHJlYWN0IHRvIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBQcm9taXNlLCBmb3IgZXhhbXBsZSwgd2hlbiBjYWxsaW5nIHRoZSBiZWZvcmVMaW5rUHJlc3NlZCBldmVudFxuXHQgKiBAcmV0dXJucyBBIFByb21pc2Ugb2JqZWN0IHRvIG1vbml0b3Igd2hlbiBhbGwgdGhlIGFjdGlvbnMgb2YgdGhlIGZ1bmN0aW9uIGhhdmUgYmVlbiBleGVjdXRlZDsgaWYgdGhlIGV4ZWN1dGlvbiBpcyBzdWNjZXNzZnVsLCB0aGVcblx0ICogICAgICAgICAgYXBwIHN0YXRlIGtleSBpcyByZXR1cm5lZDsgaWYgYW4gZXJyb3Igb2NjdXJzLCBhbiBvYmplY3Qgb2YgdHlwZSB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uTmF2RXJyb3J9IGlzXG5cdCAqICAgICAgICAgIHJldHVybmVkXG5cdCAqIEBwdWJsaWNcblx0ICogQGV4YW1wbGUgPGNvZGU+XG5cdCAqIHNhcC51aS5kZWZpbmUoW1wic2FwL2ZlL25hdmlnYXRpb24vTmF2aWdhdGlvbkhhbmRsZXJcIl0sIGZ1bmN0aW9uIChOYXZpZ2F0aW9uSGFuZGxlcikge1xuXHQgKiBcdHZhciBvTmF2aWdhdGlvbkhhbmRsZXIgPSBuZXcgTmF2aWdhdGlvbkhhbmRsZXIob0NvbnRyb2xsZXIpO1xuXHQgKiBcdHZhciBtSW5uZXJBcHBEYXRhID0ge1xuXHQgKiBcdFx0c2VsZWN0aW9uVmFyaWFudCA6IG9TbWFydEZpbHRlckJhci5nZXREYXRhU3VpdGVGb3JtYXQoKSxcblx0ICogXHRcdHRhYmxlVmFyaWFudElkIDogb1NtYXJ0VGFibGUuZ2V0Q3VycmVudFZhcmlhbnRJZCgpLFxuXHQgKiBcdFx0Y3VzdG9tRGF0YSA6IG9NeUN1c3RvbURhdGFcblx0ICogXHR9O1xuXHQgKlxuXHQgKiBcdHZhciBvU3RvcmVJbm5lckFwcFN0YXRlUHJvbWlzZSA9IG9OYXZpZ2F0aW9uSGFuZGxlci5zdG9yZUlubmVyQXBwU3RhdGUobUlubmVyQXBwRGF0YSk7XG5cdCAqXG5cdCAqIFx0b1N0b3JlSW5uZXJBcHBTdGF0ZVByb21pc2UuZG9uZShmdW5jdGlvbihzQXBwU3RhdGVLZXkpe1xuXHQgKiBcdFx0Ly95b3VyIGlubmVyIGFwcCBzdGF0ZSBpcyBzYXZlZCBub3csIHNBcHBTdGF0ZUtleSB3YXMgYWRkZWQgdG8gVVJMXG5cdCAqIFx0XHQvL3BlcmZvcm0gYWN0aW9ucyB0aGF0IG11c3QgcnVuIGFmdGVyIHNhdmVcblx0ICogXHR9KTtcblx0ICpcblx0ICogXHRvU3RvcmVJbm5lckFwcFN0YXRlUHJvbWlzZS5mYWlsKGZ1bmN0aW9uKG9FcnJvcil7XG5cdCAqIFx0XHQvL3NvbWUgZXJyb3IgaGFuZGxpbmdcblx0ICogXHR9KTtcblx0ICogfSk7XG5cdCAqIDwvY29kZT5cblx0ICogQGRlcHJlY2F0ZWRzaW5jZSAxLjEwNFxuXHQgKiBAZGVwcmVjYXRlZCBVc2UgdGhlIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5OYXZpZ2F0aW9uSGFuZGxlci5zdG9yZUlubmVyQXBwU3RhdGVBc3luY30gaW5zdGVhZC5cblx0ICovXG5cdHN0b3JlSW5uZXJBcHBTdGF0ZShtSW5uZXJBcHBEYXRhOiBJbm5lckFwcERhdGEsIGJJbW1lZGlhdGVIYXNoUmVwbGFjZT86IGJvb2xlYW4pOiBqUXVlcnkuUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRMb2cuZXJyb3IoXG5cdFx0XHRcIkRlcHJlY2F0ZWQgQVBJIGNhbGwgb2YgJ3NhcC5mZS5uYXZpZ2F0aW9uLk5hdmlnYXRpb25IYW5kbGVyLnN0b3JlSW5uZXJBcHBTdGF0ZScuIFBsZWFzZSB1c2UgJ3N0b3JlSW5uZXJBcHBTdGF0ZUFzeW5jJyBpbnN0ZWFkXCIsXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcInNhcC5mZS5uYXZpZ2F0aW9uLk5hdmlnYXRpb25IYW5kbGVyXCJcblx0XHQpO1xuXHRcdGlmICh0eXBlb2YgYkltbWVkaWF0ZUhhc2hSZXBsYWNlICE9PSBcImJvb2xlYW5cIikge1xuXHRcdFx0YkltbWVkaWF0ZUhhc2hSZXBsYWNlID0gdHJ1ZTsgLy8gZGVmYXVsdFxuXHRcdH1cblx0XHRjb25zdCBvTmF2SGFuZGxlciA9IHRoaXM7XG5cdFx0Y29uc3Qgb015RGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKTtcblxuXHRcdGNvbnN0IGZuUmVwbGFjZUhhc2ggPSBmdW5jdGlvbiAoc0FwcFN0YXRlS2V5OiBhbnkpIHtcblx0XHRcdGNvbnN0IG9IYXNoQ2hhbmdlciA9IG9OYXZIYW5kbGVyLm9Sb3V0ZXIub0hhc2hDaGFuZ2VyID8gb05hdkhhbmRsZXIub1JvdXRlci5vSGFzaENoYW5nZXIgOiBIYXNoQ2hhbmdlci5nZXRJbnN0YW5jZSgpO1xuXHRcdFx0Y29uc3Qgc0FwcEhhc2hPbGQgPSBvSGFzaENoYW5nZXIuZ2V0SGFzaCgpO1xuXHRcdFx0Lypcblx0XHRcdCAqIHVzZSAuZ2V0SGFzaCgpIGhlcmUgaW5zdGVhZCBvZiAuZ2V0QXBwSGFzaCgpIHRvIGFsc28gYmUgYWJsZSBkZWFsaW5nIHdpdGggZW52aXJvbm1lbnRzIHdoZXJlIG9ubHkgU0FQVUk1IGlzIGxvYWRlZCBhbmQgdGhlIFVTaGVsbFxuXHRcdFx0ICogaXMgbm90IGluaXRpYWxpemVkIHByb3Blcmx5LlxuXHRcdFx0ICovXG5cdFx0XHRjb25zdCBzQXBwSGFzaE5ldyA9IG9OYXZIYW5kbGVyLl9yZXBsYWNlSW5uZXJBcHBTdGF0ZUtleShzQXBwSGFzaE9sZCwgc0FwcFN0YXRlS2V5KTtcblx0XHRcdG9IYXNoQ2hhbmdlci5yZXBsYWNlSGFzaChzQXBwSGFzaE5ldyk7XG5cdFx0fTtcblxuXHRcdC8vIGluIGNhc2UgbUlubmVyQXBwU3RhdGUgaXMgZW1wdHksIGRvIG5vdCBvdmVyd3JpdGUgdGhlIGxhc3Qgc2F2ZWQgc3RhdGVcblx0XHRpZiAoaXNFbXB0eU9iamVjdChtSW5uZXJBcHBEYXRhIGFzIG9iamVjdCkpIHtcblx0XHRcdG9NeURlZmVycmVkLnJlc29sdmUoXCJcIik7XG5cdFx0XHRyZXR1cm4gb015RGVmZXJyZWQucHJvbWlzZSgpO1xuXHRcdH1cblxuXHRcdC8vIGNoZWNrIGlmIHdlIGFscmVhZHkgc2F2ZWQgdGhlIHNhbWUgZGF0YVxuXHRcdGNvbnN0IHNBcHBTdGF0ZUtleUNhY2hlZCA9IHRoaXMuX29MYXN0U2F2ZWRJbm5lckFwcERhdGEuc0FwcFN0YXRlS2V5O1xuXG5cdFx0Y29uc3QgYklubmVyQXBwRGF0YUVxdWFsID0gSlNPTi5zdHJpbmdpZnkobUlubmVyQXBwRGF0YSkgPT09IEpTT04uc3RyaW5naWZ5KHRoaXMuX29MYXN0U2F2ZWRJbm5lckFwcERhdGEub0FwcERhdGEpO1xuXHRcdGlmIChiSW5uZXJBcHBEYXRhRXF1YWwgJiYgc0FwcFN0YXRlS2V5Q2FjaGVkKSB7XG5cdFx0XHQvLyBwYXNzZWQgaW5uZXIgYXBwIHN0YXRlIGZvdW5kIGluIGNhY2hlXG5cdFx0XHR0aGlzLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLmlDYWNoZUhpdCsrO1xuXG5cdFx0XHQvLyByZXBsYWNlIGlubmVyIGFwcCBoYXNoIHdpdGggY2FjaGVkIGFwcFN0YXRlS2V5IGluIHVybCAoanVzdCBpbiBjYXNlIHRoZSBhcHAgaGFzIGNoYW5nZWQgdGhlIGhhc2ggaW4gbWVhbnRpbWUpXG5cdFx0XHRmblJlcGxhY2VIYXNoKHNBcHBTdGF0ZUtleUNhY2hlZCk7XG5cdFx0XHRvTXlEZWZlcnJlZC5yZXNvbHZlKHNBcHBTdGF0ZUtleUNhY2hlZCk7XG5cdFx0XHRyZXR1cm4gb015RGVmZXJyZWQucHJvbWlzZSgpO1xuXHRcdH1cblxuXHRcdC8vIHBhc3NlZCBpbm5lciBhcHAgc3RhdGUgbm90IGZvdW5kIGluIGNhY2hlXG5cdFx0dGhpcy5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5pQ2FjaGVNaXNzKys7XG5cblx0XHRjb25zdCBmbk9uQWZ0ZXJTYXZlID0gZnVuY3Rpb24gKHNBcHBTdGF0ZUtleTogYW55KSB7XG5cdFx0XHQvLyByZXBsYWNlIGlubmVyIGFwcCBoYXNoIHdpdGggbmV3IGFwcFN0YXRlS2V5IGluIHVybFxuXHRcdFx0aWYgKCFiSW1tZWRpYXRlSGFzaFJlcGxhY2UpIHtcblx0XHRcdFx0Zm5SZXBsYWNlSGFzaChzQXBwU3RhdGVLZXkpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyByZW1lbWJlciBsYXN0IHNhdmVkIHN0YXRlXG5cdFx0XHRvTmF2SGFuZGxlci5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5vQXBwRGF0YSA9IG1Jbm5lckFwcERhdGE7XG5cdFx0XHRvTmF2SGFuZGxlci5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5zQXBwU3RhdGVLZXkgPSBzQXBwU3RhdGVLZXk7XG5cdFx0XHRvTXlEZWZlcnJlZC5yZXNvbHZlKHNBcHBTdGF0ZUtleSk7XG5cdFx0fTtcblxuXHRcdGNvbnN0IGZuT25FcnJvciA9IGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0b015RGVmZXJyZWQucmVqZWN0KG9FcnJvcik7XG5cdFx0fTtcblxuXHRcdGNvbnN0IHNBcHBTdGF0ZUtleSA9IHRoaXMuX3NhdmVBcHBTdGF0ZShtSW5uZXJBcHBEYXRhLCBmbk9uQWZ0ZXJTYXZlLCBmbk9uRXJyb3IpO1xuXHRcdC8qXG5cdFx0ICogTm90ZSB0aGF0IF9zYXBBcHBTdGF0ZSBtYXkgcmV0dXJuICd1bmRlZmluZWQnIGluIGNhc2UgdGhhdCB0aGUgcGFyc2luZyBoYXMgZmFpbGVkLiBJbiB0aGlzIGNhc2UsIHdlIHNob3VsZCBub3QgdHJpZ2dlciB0aGUgcmVwbGFjZW1lbnRcblx0XHQgKiBvZiB0aGUgQXBwIEhhc2ggd2l0aCB0aGUgZ2VuZXJhdGVkIGtleSwgYXMgdGhlIGNvbnRhaW5lciB3YXMgbm90IHdyaXR0ZW4gYmVmb3JlLiBOb3RlIGFzIHdlbGwgdGhhdCB0aGUgZXJyb3IgaGFuZGxpbmcgaGFzIGFscmVhZHlcblx0XHQgKiBoYXBwZW5lZCBiZWZvcmUgYnkgbWFraW5nIHRoZSBvTXlEZWZlcnJlZCBwcm9taXNlIGZhaWwgKHNlZSBmbk9uRXJyb3IgYWJvdmUpLlxuXHRcdCAqL1xuXHRcdGlmIChzQXBwU3RhdGVLZXkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gcmVwbGFjZSBpbm5lciBhcHAgaGFzaCB3aXRoIG5ldyBhcHBTdGF0ZUtleSBpbiB1cmxcblx0XHRcdC8vIG5vdGU6IHdlIGRvIG5vdCB3YWl0IGZvciB0aGUgc2F2ZSB0byBiZSBjb21wbGV0ZWQ6IHRoaXMgYXN5bmNocm9ub3VzbHkgYmVoYXZpb3VyIGlzIG5lY2Vzc2FyeSBpZlxuXHRcdFx0Ly8gdGhpcyBtZXRob2QgaXMgY2FsbGVkIGUuZy4gaW4gYSBvbkxpbmtQcmVzc2VkIGV2ZW50IHdpdGggbm8gcG9zc2liaWxpdHkgdG8gd2FpdCBmb3IgdGhlIHByb21pc2UgcmVzb2x1dGlvblxuXHRcdFx0aWYgKGJJbW1lZGlhdGVIYXNoUmVwbGFjZSkge1xuXHRcdFx0XHRmblJlcGxhY2VIYXNoKHNBcHBTdGF0ZUtleSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9NeURlZmVycmVkLnByb21pc2UoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGFuZ2VzIHRoZSBVUkwgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGFwcCBzdGF0ZSBhbmQgc3RvcmVzIHRoZSBhcHAgc3RhdGUgZm9yIGxhdGVyIHJldHJpZXZhbC5cblx0ICpcblx0ICogQHBhcmFtIG1Jbm5lckFwcERhdGEgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGFwcFxuXHQgKiBAcGFyYW0gYkltbWVkaWF0ZUhhc2hSZXBsYWNlIElmIHNldCB0byBmYWxzZSwgdGhlIGlubmVyIGFwcCBoYXNoIHdpbGwgbm90IGJlIHJlcGxhY2VkIHVudGlsIHN0b3JpbmcgaXMgc3VjY2Vzc2Z1bDsgZG8gbm90XG5cdCAqICAgICAgICBzZXQgdG8gZmFsc2UgaWYgeW91IGNhbm5vdCByZWFjdCB0byB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgUHJvbWlzZSwgZm9yIGV4YW1wbGUsIHdoZW4gY2FsbGluZyB0aGUgYmVmb3JlTGlua1ByZXNzZWQgZXZlbnQuIDxiPk5vdGU6PC9iPklmXG5cdCAqICAgICAgICBub3QgcHJvdmlkZWQgaXQgd2lsbCBiZSB0cmVhdGVkIGFzIHNldCB0byBmYWxzZS4gPGI+Tm90ZTo8L2I+SWYgc2V0IHRvIHRydWUsIHRoZSBjYWxsaW5nIGluc3RhbmNlIGhhcyB0byBlbnN1cmUgdGhhdCBhIGZvbGxvdy1vblxuXHQgKiAgICAgICAgY2FsbCB0byA8Y29kZT5yZXBsYWNlSGFzaDwvY29kZT4gd2lsbCB0YWtlIHBsYWNlIVxuXHQgKiBAcmV0dXJucyBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgYXBwU3RhdGVJZCBhbmQgYSBwcm9taXNlIG9iamVjdCB0byBtb25pdG9yIHdoZW4gYWxsIHRoZSBhY3Rpb25zIG9mIHRoZSBmdW5jdGlvbiBoYXZlIGJlZW5cblx0ICogICAgICAgICAgZXhlY3V0ZWQ7IFBsZWFzZSBub3RlIHRoYXQgdGhlIGFwcFN0YXRlS2V5IG1heSBiZSB1bmRlZmluZWQgb3IgZW1wdHkuXG5cdCAqIEBleGFtcGxlIDxjb2RlPlxuXHQgKiBzYXAudWkuZGVmaW5lKFtcInNhcC9mZS9uYXZpZ2F0aW9uL05hdmlnYXRpb25IYW5kbGVyXCJdLCBmdW5jdGlvbiAoTmF2aWdhdGlvbkhhbmRsZXIpIHtcblx0ICogXHR2YXIgb05hdmlnYXRpb25IYW5kbGVyID0gbmV3IE5hdmlnYXRpb25IYW5kbGVyKG9Db250cm9sbGVyKTtcblx0ICogXHR2YXIgbUlubmVyQXBwRGF0YSA9IHtcblx0ICogXHRcdHNlbGVjdGlvblZhcmlhbnQgOiBvU21hcnRGaWx0ZXJCYXIuZ2V0RGF0YVN1aXRlRm9ybWF0KCksXG5cdCAqIFx0XHR0YWJsZVZhcmlhbnRJZCA6IG9TbWFydFRhYmxlLmdldEN1cnJlbnRWYXJpYW50SWQoKSxcblx0ICogXHRcdGN1c3RvbURhdGEgOiBvTXlDdXN0b21EYXRhXG5cdCAqIFx0fTtcblx0ICpcblx0ICogXHR2YXIgb1N0b3JlSW5uZXJBcHBTdGF0ZSA9IHN0b3JlSW5uZXJBcHBTdGF0ZVdpdGhOb25EZWxheWVkUmV0dXJuKG1Jbm5lckFwcERhdGEpO1xuXHQgKiBcdHZhciBzQXBwU3RhdGVLZXkgPSBvU3RvcmVJbm5lckFwcFN0YXRlLmFwcFN0YXRlS2V5O1xuXHQgKiBcdGlmICghc0FwcFN0YXRlS2V5KSB7XG5cdCAqICAgIC8vIG5vIGFwcFN0YXRlS2V5IG9idGFpbmVkLi4uXG5cdCAqIFx0fTtcblx0ICogXHR2YXIgb1N0b3JlSW5uZXJBcHBTdGF0ZVByb21pc2UgPSBvU3RvcmVJbm5lckFwcFN0YXRlLnByb21pc2U7XG5cdCAqXG5cdCAqIFx0b1N0b3JlSW5uZXJBcHBTdGF0ZVByb21pc2UuZG9uZShmdW5jdGlvbihzQXBwU3RhdGVLZXkpe1xuXHQgKiBcdFx0Ly95b3VyIGlubmVyIGFwcCBzdGF0ZSBpcyBzYXZlZCBub3csIHNBcHBTdGF0ZUtleSB3YXMgYWRkZWQgdG8gVVJMXG5cdCAqIFx0XHQvL3BlcmZvcm0gYWN0aW9ucyB0aGF0IG11c3QgcnVuIGFmdGVyIHNhdmVcblx0ICogXHR9KTtcblx0ICpcblx0ICogXHRvU3RvcmVJbm5lckFwcFN0YXRlUHJvbWlzZS5mYWlsKGZ1bmN0aW9uKG9FcnJvcil7XG5cdCAqIFx0XHQvL3NvbWUgZXJyb3IgaGFuZGxpbmdcblx0ICogXHR9KTtcblx0ICogfSk7XG5cdCAqIDwvY29kZT5cblx0ICogQHB1YmxpY1xuXHQgKiBAZGVwcmVjYXRlZHNpbmNlIDEuMTA0XG5cdCAqIEBkZXByZWNhdGVkIFVzZSB0aGUge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdmlnYXRpb25IYW5kbGVyLnN0b3JlSW5uZXJBcHBTdGF0ZUFzeW5jfSBpbnN0ZWFkLlxuXHQgKi9cblx0c3RvcmVJbm5lckFwcFN0YXRlV2l0aEltbWVkaWF0ZVJldHVybihtSW5uZXJBcHBEYXRhOiBJbm5lckFwcERhdGEsIGJJbW1lZGlhdGVIYXNoUmVwbGFjZT86IGJvb2xlYW4pOiBvYmplY3Qge1xuXHRcdExvZy5lcnJvcihcblx0XHRcdFwiRGVwcmVjYXRlZCBBUEkgY2FsbCBvZiAnc2FwLmZlLm5hdmlnYXRpb24uTmF2aWdhdGlvbkhhbmRsZXIuc3RvcmVJbm5lckFwcFN0YXRlV2l0aEltbWVkaWF0ZVJldHVybicuIFBsZWFzZSB1c2UgJ3N0b3JlSW5uZXJBcHBTdGF0ZUFzeW5jJyBpbnN0ZWFkXCIsXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcInNhcC5mZS5uYXZpZ2F0aW9uLk5hdmlnYXRpb25IYW5kbGVyXCJcblx0XHQpO1xuXHRcdGlmICh0eXBlb2YgYkltbWVkaWF0ZUhhc2hSZXBsYWNlICE9PSBcImJvb2xlYW5cIikge1xuXHRcdFx0YkltbWVkaWF0ZUhhc2hSZXBsYWNlID0gZmFsc2U7IC8vIGRlZmF1bHRcblx0XHR9XG5cblx0XHRjb25zdCBvTmF2SGFuZGxlciA9IHRoaXM7XG5cdFx0Y29uc3Qgb0FwcFN0YXRlUHJvbWlzZSA9IGpRdWVyeS5EZWZlcnJlZCgpO1xuXG5cdFx0Ly8gaW4gY2FzZSBtSW5uZXJBcHBTdGF0ZSBpcyBlbXB0eSwgZG8gbm90IG92ZXJ3cml0ZSB0aGUgbGFzdCBzYXZlZCBzdGF0ZVxuXHRcdGlmIChpc0VtcHR5T2JqZWN0KG1Jbm5lckFwcERhdGEpKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRhcHBTdGF0ZUtleTogXCJcIixcblx0XHRcdFx0cHJvbWlzZTogb0FwcFN0YXRlUHJvbWlzZS5yZXNvbHZlKFwiXCIpXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIGNoZWNrIGlmIHdlIGFscmVhZHkgc2F2ZWQgdGhlIHNhbWUgZGF0YVxuXHRcdGNvbnN0IHNBcHBTdGF0ZUtleUNhY2hlZCA9IHRoaXMuX29MYXN0U2F2ZWRJbm5lckFwcERhdGEuc0FwcFN0YXRlS2V5O1xuXG5cdFx0Y29uc3QgYklubmVyQXBwRGF0YUVxdWFsID0gSlNPTi5zdHJpbmdpZnkobUlubmVyQXBwRGF0YSkgPT09IEpTT04uc3RyaW5naWZ5KHRoaXMuX29MYXN0U2F2ZWRJbm5lckFwcERhdGEub0FwcERhdGEpO1xuXHRcdGlmIChiSW5uZXJBcHBEYXRhRXF1YWwgJiYgc0FwcFN0YXRlS2V5Q2FjaGVkKSB7XG5cdFx0XHQvLyBwYXNzZWQgaW5uZXIgYXBwIHN0YXRlIGZvdW5kIGluIGNhY2hlXG5cdFx0XHR0aGlzLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLmlDYWNoZUhpdCsrO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0YXBwU3RhdGVLZXk6IHNBcHBTdGF0ZUtleUNhY2hlZCxcblx0XHRcdFx0cHJvbWlzZTogb0FwcFN0YXRlUHJvbWlzZS5yZXNvbHZlKHNBcHBTdGF0ZUtleUNhY2hlZClcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Ly8gcGFzc2VkIGlubmVyIGFwcCBzdGF0ZSBub3QgZm91bmQgaW4gY2FjaGVcblx0XHR0aGlzLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLmlDYWNoZU1pc3MrKztcblxuXHRcdGNvbnN0IGZuT25BZnRlclNhdmUgPSBmdW5jdGlvbiAoc0FwcFN0YXRlS2V5OiBhbnkpIHtcblx0XHRcdC8vIHJlcGxhY2UgaW5uZXIgYXBwIGhhc2ggd2l0aCBuZXcgYXBwU3RhdGVLZXkgaW4gdXJsXG5cdFx0XHRpZiAoIWJJbW1lZGlhdGVIYXNoUmVwbGFjZSkge1xuXHRcdFx0XHRvTmF2SGFuZGxlci5yZXBsYWNlSGFzaChzQXBwU3RhdGVLZXkpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyByZW1lbWJlciBsYXN0IHNhdmVkIHN0YXRlXG5cdFx0XHRvTmF2SGFuZGxlci5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5vQXBwRGF0YSA9IG1Jbm5lckFwcERhdGE7XG5cdFx0XHRvTmF2SGFuZGxlci5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5zQXBwU3RhdGVLZXkgPSBzQXBwU3RhdGVLZXk7XG5cdFx0XHRvQXBwU3RhdGVQcm9taXNlLnJlc29sdmUoc0FwcFN0YXRlS2V5KTtcblx0XHR9O1xuXG5cdFx0Y29uc3QgZm5PbkVycm9yID0gZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRvQXBwU3RhdGVQcm9taXNlLnJlamVjdChvRXJyb3IpO1xuXHRcdH07XG5cblx0XHRjb25zdCBzQXBwU3RhdGVLZXkgPSB0aGlzLl9zYXZlQXBwU3RhdGUobUlubmVyQXBwRGF0YSwgZm5PbkFmdGVyU2F2ZSwgZm5PbkVycm9yKTtcblx0XHQvKlxuXHRcdCAqIE5vdGUgdGhhdCBfc2FwQXBwU3RhdGUgbWF5IHJldHVybiAndW5kZWZpbmVkJyBpbiBjYXNlIHRoYXQgdGhlIHBhcnNpbmcgaGFzIGZhaWxlZC4gSW4gdGhpcyBjYXNlLCB3ZSBzaG91bGQgbm90IHRyaWdnZXIgdGhlIHJlcGxhY2VtZW50XG5cdFx0ICogb2YgdGhlIEFwcCBIYXNoIHdpdGggdGhlIGdlbmVyYXRlZCBrZXksIGFzIHRoZSBjb250YWluZXIgd2FzIG5vdCB3cml0dGVuIGJlZm9yZS4gTm90ZSBhcyB3ZWxsIHRoYXQgdGhlIGVycm9yIGhhbmRsaW5nIGhhcyBhbHJlYWR5XG5cdFx0ICogaGFwcGVuZWQgYmVmb3JlIGJ5IG1ha2luZyB0aGUgb015RGVmZXJyZWQgcHJvbWlzZSBmYWlsIChzZWUgZm5PbkVycm9yIGFib3ZlKS5cblx0XHQgKi9cblx0XHQvLyBpZiAoc0FwcFN0YXRlS2V5ICE9PSB1bmRlZmluZWQpIHtcblx0XHQvLyAvL3JlcGxhY2UgaW5uZXIgYXBwIGhhc2ggd2l0aCBuZXcgYXBwU3RhdGVLZXkgaW4gdXJsXG5cdFx0Ly8gLy9ub3RlOiB3ZSBkbyBub3Qgd2FpdCBmb3IgdGhlIHNhdmUgdG8gYmUgY29tcGxldGVkOiB0aGlzIGFzeW5jaHJvbm91c2x5IGJlaGF2aW91ciBpcyBuZWNlc3NhcnkgaWZcblx0XHQvLyAvL3RoaXMgbWV0aG9kIGlzIGNhbGxlZCBlLmcuIGluIGEgb25MaW5rUHJlc3NlZCBldmVudCB3aXRoIG5vIHBvc3NpYmlsaXR5IHRvIHdhaXQgZm9yIHRoZSBwcm9taXNlIHJlc29sdXRpb25cblx0XHQvLyBpZiAoYkltbWVkaWF0ZUhhc2hSZXBsYWNlKSB7XG5cdFx0Ly8gZm5SZXBsYWNlSGFzaChzQXBwU3RhdGVLZXkpO1xuXHRcdC8vIH1cblx0XHQvLyB9XG5cdFx0cmV0dXJuIHtcblx0XHRcdGFwcFN0YXRlS2V5OiBzQXBwU3RhdGVLZXksXG5cdFx0XHRwcm9taXNlOiBvQXBwU3RhdGVQcm9taXNlLnByb21pc2UoKVxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2Vzc2VzIG5hdmlnYXRpb24tcmVsYXRlZCB0YXNrcyByZWxhdGVkIHRvIGJlZm9yZVBvcG92ZXJPcGVucyBldmVudCBoYW5kbGluZyBmb3IgdGhlIFNtYXJ0TGluayBjb250cm9sIGFuZCByZXR1cm5zIGEgUHJvbWlzZSBvYmplY3QuIEluXG5cdCAqIHBhcnRpY3VsYXIsIHRoZSBmb2xsb3dpbmcgdGFza3MgYXJlIHBlcmZvcm1lZCBiZWZvcmUgdGhlIFNtYXJ0TGluayBwb3BvdmVyIGNhbiBiZSBvcGVuZWQ6XG5cdCAqIDx1bD5cblx0ICogPGxpPklmIDxjb2RlPm1Jbm5lckFwcERhdGE8L2NvZGU+IGlzIHByb3ZpZGVkLCB0aGlzIGlubmVyIGFwcCBzdGF0ZSBpcyBzYXZlZCBmb3IgYmFjayBuYXZpZ2F0aW9uIGF0IGEgbGF0ZXIgdGltZS48L2xpPlxuXHQgKiA8bGk+VGhlIHRhYmxlIGV2ZW50IHBhcmFtZXRlcnMgKHNlbWFudGljIGF0dHJpYnV0ZXMpIGFuZCB0aGUgc2VsZWN0aW9uIHZhcmlhbnQgZGF0YSBhcmUgY29tYmluZWQgYnkgY2FsbGluZyB0aGUgbWV0aG9kXG5cdCAqIHtAbGluayAjLm1peEF0dHJpYnV0ZXNBbmRTZWxlY3Rpb25WYXJpYW50IG1peEF0dHJpYnV0ZXNBbmRTZWxlY3Rpb25WYXJpYW50fS48L2xpPlxuXHQgKiA8bGk+VGhlIGNvbWJpbmVkIGRhdGEgaXMgc2F2ZWQgYXMgdGhlIGNyb3NzIGFwcCBzdGF0ZSB0byBiZSBoYW5kZWQgb3ZlciB0byB0aGUgdGFyZ2V0IGFwcCwgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHNhcC14YXBwLXN0YXRlIGtleSBpcyBzZXRcblx0ICogaW4gdGhlIFVSTC48L2xpPlxuXHQgKiA8bGk+QWxsIHNpbmdsZSBzZWxlY3Rpb25zIChcImluY2x1ZGluZyBlcXVhbFwiKSBvZiB0aGUgY29tYmluZWQgc2VsZWN0aW9uIGRhdGEgYXJlIHBhc3NlZCB0byB0aGUgU21hcnRMaW5rIHBvcG92ZXIgYXMgc2VtYW50aWMgYXR0cmlidXRlcy48L2xpPlxuXHQgKiA8bGk+VGhlIG1ldGhvZCA8Y29kZT5vVGFibGVFdmVudFBhcmFtZXRlcnMub3BlbigpPC9jb2RlPiBpcyBjYWxsZWQuIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IHJlYWxseSBvcGVuIHRoZSBwb3BvdmVyLCBidXQgdGhlIFNtYXJ0TGlua1xuXHQgKiBjb250cm9sIHByb2NlZWRzIHdpdGggZmlyaW5nIHRoZSBldmVudCA8Y29kZT5uYXZpZ2F0aW9uVGFyZ2V0c09idGFpbmVkPC9jb2RlPi48L2xpPlxuXHQgKiA8L3VsPi5cblx0ICogPGJyPlxuXHQgKiA8Yj5Ob2RlOjwvYj4gSWYgdGhlIDxjb2RlPm9FeHRlcm5hbEFwcERhdGE8L2NvZGU+IHBhcmFtZXRlciBpcyBub3Qgc3VwcGxpZWQsIHRoZSBleHRlcm5hbCBhcHAgZGF0YSB3aWxsIGJlIGNhbGN1bGF0ZWQgYmFzZWQgb25cblx0ICogdGhlIDxjb2RlPm1Jbm5lckFwcERhdGE8L2NvZGU+IGRhdGEuPGJyPi5cblx0ICpcblx0ICogQHBhcmFtIG9UYWJsZUV2ZW50UGFyYW1ldGVycyBUaGUgcGFyYW1ldGVycyBtYWRlIGF2YWlsYWJsZSBieSB0aGUgU21hcnRUYWJsZSBjb250cm9sIHdoZW4gdGhlIFNtYXJ0TGluayBjb250cm9sIGhhcyBiZWVuIGNsaWNrZWQsXG5cdCAqICAgICAgICBhbiBpbnN0YW5jZSBvZiBhIFBvcE92ZXIgb2JqZWN0XG5cdCAqIEBwYXJhbSBzU2VsZWN0aW9uVmFyaWFudCBTdHJpbmdpZmllZCBKU09OIG9iamVjdCBhcyByZXR1cm5lZCwgZm9yIGV4YW1wbGUsIGZyb20gZ2V0RGF0YVN1aXRlRm9ybWF0KCkgb2YgdGhlIFNtYXJ0RmlsdGVyQmFyIGNvbnRyb2xcblx0ICogQHBhcmFtIG1Jbm5lckFwcERhdGEgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGFwcC4gSWYgcHJvdmlkZWQsIG9wZW5pbmcgdGhlIFBvcG92ZXIgaXMgZGVmZXJyZWQgdW50aWwgdGhlXG5cdCAqICAgICAgICBpbm5lciBhcHAgZGF0YSBpcyBzYXZlZCBpbiBhIGNvbnNpc3RlbnQgd2F5LlxuXHQgKiBAcGFyYW0gb0V4dGVybmFsQXBwRGF0YSBPYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgd2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHRhcmdldCBzY3JlZW4uXG5cdCAqIEBwYXJhbSBvRXh0ZXJuYWxBcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQgT2JqZWN0IGNvbnRhaW5pbmcgc2VsZWN0aW9uVmFyaWFudCwgd2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHRhcmdldCBzY3JlZW4uIElmIG5vdFxuXHQgKiAgICAgICAgc2V0IHRoZSBzU2VsZWN0aW9uVmFyaWFudCB3aWxsIGJlIHVzZWQuXG5cdCAqIEBwYXJhbSBvRXh0ZXJuYWxBcHBEYXRhLnByZXNlbnRhdGlvblZhcmlhbnQgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgdWkgcHJlc2VudGF0aW9uVmFyaWFudCBvZiB0aGUgYXBwLCB3aGljaCB3aWxsIGJlXG5cdCAqICAgICAgICBwYXNzZWQgdG8gdGhlIHRhcmdldCBzY3JlZW5cblx0ICogQHBhcmFtIG9FeHRlcm5hbEFwcERhdGEudmFsdWVUZXh0cyBPYmplY3QgY29udGFpbmluZyB2YWx1ZSBkZXNjcmlwdGlvbnMsIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSB0YXJnZXQgc2NyZWVuXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSBvYmplY3QgdG8gbW9uaXRvciB3aGVuIGFsbCBhY3Rpb25zIG9mIHRoZSBmdW5jdGlvbiBoYXZlIGJlZW4gZXhlY3V0ZWQ7IGlmIHRoZSBleGVjdXRpb24gaXMgc3VjY2Vzc2Z1bCwgdGhlXG5cdCAqICAgICAgICAgIG1vZGlmaWVkIG9UYWJsZUV2ZW50UGFyYW1ldGVycyBpcyByZXR1cm5lZDsgaWYgYW4gZXJyb3Igb2NjdXJzLCBhbiBlcnJvciBvYmplY3Qgb2YgdHlwZVxuXHQgKiAgICAgICAgICB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uTmF2RXJyb3J9IGlzIHJldHVybmVkXG5cdCAqIEBwdWJsaWNcblx0ICogQGV4YW1wbGUgPGNvZGU+XG5cdCAqIHNhcC51aS5kZWZpbmUoW1wic2FwL2ZlL25hdmlnYXRpb24vTmF2aWdhdGlvbkhhbmRsZXJcIiwgXCJzYXAvZmUvbmF2aWdhdGlvbi9TZWxlY3Rpb25WYXJpYW50XCJdLCBmdW5jdGlvbiAoTmF2aWdhdGlvbkhhbmRsZXIsIFNlbGVjdGlvblZhcmlhbnQpIHtcblx0ICogXHQvL2V2ZW50IGhhbmRsZXIgZm9yIHRoZSBzbWFydCBsaW5rIGV2ZW50IFwiYmVmb3JlUG9wb3Zlck9wZW5zXCJcblx0ICogXHRcdG9uQmVmb3JlUG9wb3Zlck9wZW5zOiBmdW5jdGlvbihvRXZlbnQpIHtcblx0ICogXHRcdFx0dmFyIG9UYWJsZUV2ZW50UGFyYW1ldGVycyA9IG9FdmVudC5nZXRQYXJhbWV0ZXJzKCk7XG5cdCAqXG5cdCAqIFx0XHRcdHZhciBtSW5uZXJBcHBEYXRhID0ge1xuXHQgKiBcdFx0XHRcdHNlbGVjdGlvblZhcmlhbnQgOiBvU21hcnRGaWx0ZXJCYXIuZ2V0RGF0YVN1aXRlRm9ybWF0KCksXG5cdCAqIFx0XHRcdFx0dGFibGVWYXJpYW50SWQgOiBvU21hcnRUYWJsZS5nZXRDdXJyZW50VmFyaWFudElkKCksXG5cdCAqIFx0XHRcdFx0Y3VzdG9tRGF0YSA6IG9NeUN1c3RvbURhdGFcblx0ICogXHRcdFx0fTtcblx0ICpcblx0ICogXHRcdFx0dmFyIG9TZWxlY3Rpb25WYXJpYW50ID0gbmV3IFNlbGVjdGlvblZhcmlhbnQoKTtcblx0ICogXHRcdFx0b1NlbGVjdGlvblZhcmlhbnQuYWRkU2VsZWN0T3B0aW9uKFwiQ29tcGFueUNvZGVcIiwgXCJJXCIsIFwiRVFcIiwgXCIwMDAxXCIpO1xuXHQgKiBcdFx0XHRvU2VsZWN0aW9uVmFyaWFudC5hZGRTZWxlY3RPcHRpb24oXCJDdXN0b21lclwiLCBcIklcIiwgXCJFUVwiLCBcIkMwMDAxXCIpO1xuXHQgKiBcdFx0XHR2YXIgc1NlbGVjdGlvblZhcmlhbnQ9IG9TZWxlY3Rpb25WYXJpYW50LnRvSlNPTlN0cmluZygpO1xuXHQgKlxuXHQgKiBcdFx0XHR2YXIgb05hdmlnYXRpb25IYW5kbGVyID0gbmV3IE5hdmlnYXRpb25IYW5kbGVyKG9Db250cm9sbGVyKTtcblx0ICogXHRcdFx0dmFyIG9TbWFydExpbmtQcm9taXNlID0gb05hdmlnYXRpb25IYW5kbGVyLnByb2Nlc3NCZWZvcmVTbWFydExpbmtQb3BvdmVyT3BlbnMob1RhYmxlRXZlbnRQYXJhbWV0ZXJzLCBzU2VsZWN0aW9uVmFyaWFudCwgbUlubmVyQXBwRGF0YSk7XG5cdCAqXG5cdCAqIFx0XHRcdG9TbWFydExpbmtQcm9taXNlLmRvbmUoZnVuY3Rpb24ob1RhYmxlRXZlbnRQYXJhbWV0ZXJzKXtcblx0ICogXHRcdFx0XHQvLyBoZXJlIHlvdSBjYW4gYWRkIGNvZGluZyB0aGF0IHNob3VsZCBydW4gYWZ0ZXIgYWxsIGFwcCBzdGF0ZXMgYXJlIHNhdmVkIGFuZCB0aGUgc2VtYW50aWMgYXR0cmlidXRlcyBhcmUgc2V0XG5cdCAqIFx0XHRcdH0pO1xuXHQgKlxuXHQgKiBcdFx0XHRvU21hcnRMaW5rUHJvbWlzZS5mYWlsKGZ1bmN0aW9uKG9FcnJvcil7XG5cdCAqIFx0XHRcdC8vc29tZSBlcnJvciBoYW5kbGluZ1xuXHQgKiBcdFx0XHR9KTtcblx0ICogXHRcdH07XG5cdCAqIFx0fSk7XG5cdCAqIDwvY29kZT5cblx0ICovXG5cdHByb2Nlc3NCZWZvcmVTbWFydExpbmtQb3BvdmVyT3BlbnMoXG5cdFx0b1RhYmxlRXZlbnRQYXJhbWV0ZXJzOiBhbnksXG5cdFx0c1NlbGVjdGlvblZhcmlhbnQ6IHN0cmluZyxcblx0XHRtSW5uZXJBcHBEYXRhPzogSW5uZXJBcHBEYXRhLFxuXHRcdG9FeHRlcm5hbEFwcERhdGE/OiB7XG5cdFx0XHRzZWxlY3Rpb25WYXJpYW50Pzogb2JqZWN0O1xuXHRcdFx0cHJlc2VudGF0aW9uVmFyaWFudD86IG9iamVjdDtcblx0XHRcdHZhbHVlVGV4dHM/OiBvYmplY3Q7XG5cdFx0fVxuXHQpOiBKUXVlcnkuUHJvbWlzZTxhbnksIGFueSwgYW55PiB7XG5cdFx0Y29uc3Qgb015RGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKTtcblx0XHRsZXQgbVNlbWFudGljQXR0cmlidXRlczogYW55O1xuXHRcdGlmIChvVGFibGVFdmVudFBhcmFtZXRlcnMgIT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRtU2VtYW50aWNBdHRyaWJ1dGVzID0gb1RhYmxlRXZlbnRQYXJhbWV0ZXJzLnNlbWFudGljQXR0cmlidXRlcztcblx0XHR9XG5cblx0XHRsZXQgb1hBcHBEYXRhT2JqOiBhbnk7XG5cdFx0Y29uc3Qgb05hdkhhbmRsZXI6IE5hdmlnYXRpb25IYW5kbGVyID0gdGhpcztcblxuXHRcdGlmIChvRXh0ZXJuYWxBcHBEYXRhID09PSB1bmRlZmluZWQpIHtcblx0XHRcdG9YQXBwRGF0YU9iaiA9IHt9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvWEFwcERhdGFPYmogPSBvRXh0ZXJuYWxBcHBEYXRhO1xuXHRcdH1cblxuXHRcdGNvbnN0IGZuU3RvcmVYYXBwQW5kQ2FsbE9wZW4gPSBmdW5jdGlvbiAobVN1YlNlbWFudGljQXR0cmlidXRlczogYW55LCBzU3ViU2VsZWN0aW9uVmFyaWFudDogYW55KSB7XG5cdFx0XHQvLyBtaXggdGhlIHNlbWFudGljIGF0dHJpYnV0ZXMgKGUuZy4gZnJvbSB0aGUgcm93IGxpbmUpIHdpdGggdGhlIHNlbGVjdGlvbiB2YXJpYW50IChlLmcuIGZyb20gdGhlIGZpbHRlciBiYXIpXG5cdFx0XHRzU3ViU2VsZWN0aW9uVmFyaWFudCA9IG9YQXBwRGF0YU9iai5zZWxlY3Rpb25WYXJpYW50IHx8IHNTdWJTZWxlY3Rpb25WYXJpYW50IHx8IFwie31cIjtcblxuXHRcdFx0Y29uc3QgaVN1cHByZXNzaW9uQmVoYXZpb3IgPSBTdXBwcmVzc2lvbkJlaGF2aW9yLnJhaXNlRXJyb3JPbk51bGwgfCBTdXBwcmVzc2lvbkJlaGF2aW9yLnJhaXNlRXJyb3JPblVuZGVmaW5lZDtcblx0XHRcdC8qXG5cdFx0XHQgKiBjb21wYXRpYmxpdHk6IFVudGlsIFNBUFVJNSAxLjI4LjUgKG9yIGV2ZW4gbGF0ZXIpIHRoZSBTbWFydCBMaW5rIGluIGEgU21hcnQgVGFibGUgaXMgZmlsdGVyaW5nIGFsbCBudWxsLSBhbmQgdW5kZWZpbmVkIHZhbHVlcy5cblx0XHRcdCAqIFRoZXJlZm9yZSwgbVNlbWFudGljQXR0cmlidXRlcyBhcmUgYWxyZWFkeSByZWR1Y2VkIGFwcHJvcHJpYXRlbHkgLS0gdGhpcyBkb2VzIG5vdCBuZWVkIHRvIGJlIGRvbmUgYnlcblx0XHRcdCAqIG1peEF0dHJpYnV0ZXNBbmRTZWxlY3Rpb25WYXJpYW50IGFnYWluLiBUbyBlbnN1cmUgdGhhdCB3ZSBzdGlsbCBoYXZlIHRoZSBvbGQgYmVoYXZpb3VyIChpLmUuIGFuIE5hdkVycm9yIGlzIHJhaXNlZCBpbiBjYXNlIHRoYXRcblx0XHRcdCAqIGJlaGF2aW91ciBvZiB0aGUgU21hcnQgTGluayBjb250cm9sIGhhcyBjaGFuZ2VkKSwgdGhlIFwib2xkXCIgU3VwcHJlc3Npb24gQmVoYXZpb3VyIGlzIHJldGFpbmVkLlxuXHRcdFx0ICovXG5cblx0XHRcdGNvbnN0IG9NaXhlZFNlbFZhciA9IG9OYXZIYW5kbGVyLm1peEF0dHJpYnV0ZXNBbmRTZWxlY3Rpb25WYXJpYW50KFxuXHRcdFx0XHRtU3ViU2VtYW50aWNBdHRyaWJ1dGVzLFxuXHRcdFx0XHRzU3ViU2VsZWN0aW9uVmFyaWFudCxcblx0XHRcdFx0aVN1cHByZXNzaW9uQmVoYXZpb3Jcblx0XHRcdCk7XG5cdFx0XHRzU3ViU2VsZWN0aW9uVmFyaWFudCA9IG9NaXhlZFNlbFZhci50b0pTT05TdHJpbmcoKTtcblxuXHRcdFx0Ly8gZW5yaWNoIHRoZSBzZW1hbnRpYyBhdHRyaWJ1dGVzIHdpdGggc2luZ2xlIHNlbGVjdGlvbnMgZnJvbSB0aGUgc2VsZWN0aW9uIHZhcmlhbnRcblx0XHRcdGxldCBvVG1wRGF0YTogYW55ID0ge307XG5cdFx0XHRvVG1wRGF0YS5zZWxlY3Rpb25WYXJpYW50ID0gb01peGVkU2VsVmFyLnRvSlNPTk9iamVjdCgpO1xuXG5cdFx0XHRvVG1wRGF0YSA9IG9OYXZIYW5kbGVyLl9yZW1vdmVNZWFzdXJlQmFzZWRJbmZvcm1hdGlvbihvVG1wRGF0YSk7XG5cblx0XHRcdG9UbXBEYXRhID0gb05hdkhhbmRsZXIuX2NoZWNrSXNQb3RlbnRpYWxseVNlbnNpdGl2ZShvVG1wRGF0YSk7XG5cblx0XHRcdG1TdWJTZW1hbnRpY0F0dHJpYnV0ZXMgPSBvVG1wRGF0YS5zZWxlY3Rpb25WYXJpYW50XG5cdFx0XHRcdD8gb05hdkhhbmRsZXIuX2dldFVSTFBhcmFtZXRlcnNGcm9tU2VsZWN0aW9uVmFyaWFudChuZXcgU2VsZWN0aW9uVmFyaWFudChvVG1wRGF0YS5zZWxlY3Rpb25WYXJpYW50KSlcblx0XHRcdFx0OiB7fTtcblxuXHRcdFx0Y29uc3QgZm5PbkNvbnRhaW5lclNhdmUgPSBmdW5jdGlvbiAoc0FwcFN0YXRlS2V5OiBhbnkpIHtcblx0XHRcdFx0aWYgKG9UYWJsZUV2ZW50UGFyYW1ldGVycyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0Ly8gSWYgb1RhYmxlRXZlbnRQYXJhbWV0ZXJzIGlzIHVuZGVmaW5lZCwgcmV0dXJuIGJvdGggc2VtYW50aWNBdHRyaWJ1dGVzIGFuZCBhcHBTdGF0ZWtleVxuXHRcdFx0XHRcdG9NeURlZmVycmVkLnJlc29sdmUobVN1YlNlbWFudGljQXR0cmlidXRlcywgc0FwcFN0YXRlS2V5KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBzZXQgdGhlIHN0b3JlZCBkYXRhIGluIHBvcG92ZXIgYW5kIGNhbGwgb3BlbigpXG5cdFx0XHRcdFx0b1RhYmxlRXZlbnRQYXJhbWV0ZXJzLnNldFNlbWFudGljQXR0cmlidXRlcyhtU3ViU2VtYW50aWNBdHRyaWJ1dGVzKTtcblx0XHRcdFx0XHRvVGFibGVFdmVudFBhcmFtZXRlcnMuc2V0QXBwU3RhdGVLZXkoc0FwcFN0YXRlS2V5KTtcblx0XHRcdFx0XHRvVGFibGVFdmVudFBhcmFtZXRlcnMub3BlbigpOyAvLyA+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PiBOb3RlIHRoYXQgXCJvcGVuXCIgZG9lcyBub3Qgb3BlbiB0aGUgcG9wb3ZlciwgYnV0IHByb2NlZWRzXG5cdFx0XHRcdFx0Ly8gd2l0aCBmaXJpbmcgdGhlIG9uTmF2VGFyZ2V0c09idGFpbmVkIGV2ZW50LlxuXHRcdFx0XHRcdG9NeURlZmVycmVkLnJlc29sdmUob1RhYmxlRXZlbnRQYXJhbWV0ZXJzKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdFx0Y29uc3QgZm5PbkVycm9yID0gZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdG9NeURlZmVycmVkLnJlamVjdChvRXJyb3IpO1xuXHRcdFx0fTtcblxuXHRcdFx0b1hBcHBEYXRhT2JqLnNlbGVjdGlvblZhcmlhbnQgPSBzU3ViU2VsZWN0aW9uVmFyaWFudDtcblxuXHRcdFx0b1hBcHBEYXRhT2JqID0gb05hdkhhbmRsZXIuX3JlbW92ZU1lYXN1cmVCYXNlZEluZm9ybWF0aW9uKG9YQXBwRGF0YU9iaik7XG5cblx0XHRcdG9OYXZIYW5kbGVyLl9zYXZlQXBwU3RhdGVBc3luYyhvWEFwcERhdGFPYmosIGZuT25Db250YWluZXJTYXZlLCBmbk9uRXJyb3IpO1xuXHRcdH07XG5cblx0XHRpZiAobUlubmVyQXBwRGF0YSkge1xuXHRcdFx0Y29uc3Qgb1N0b3JlSW5uZXJBcHBTdGF0ZVByb21pc2UgPSB0aGlzLnN0b3JlSW5uZXJBcHBTdGF0ZUFzeW5jKG1Jbm5lckFwcERhdGEsIHRydWUpO1xuXG5cdFx0XHQvLyBpZiB0aGUgaW5uZXIgYXBwIHN0YXRlIHdhcyBzdWNjZXNzZnVsbHkgc3RvcmVkLCBzdG9yZSBhbHNvIHRoZSB4YXBwLXN0YXRlXG5cdFx0XHRvU3RvcmVJbm5lckFwcFN0YXRlUHJvbWlzZS5kb25lKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0Zm5TdG9yZVhhcHBBbmRDYWxsT3BlbihtU2VtYW50aWNBdHRyaWJ1dGVzLCBzU2VsZWN0aW9uVmFyaWFudCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0b1N0b3JlSW5uZXJBcHBTdGF0ZVByb21pc2UuZmFpbChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0b015RGVmZXJyZWQucmVqZWN0KG9FcnJvcik7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gdGhlcmUgaXMgbm8gaW5uZXIgYXBwIHN0YXRlIHRvIHNhdmUsIGp1c3QgcHV0IHRoZSBwYXJhbWV0ZXJzIGludG8geGFwcC1zdGF0ZVxuXHRcdFx0Zm5TdG9yZVhhcHBBbmRDYWxsT3BlbihtU2VtYW50aWNBdHRyaWJ1dGVzLCBzU2VsZWN0aW9uVmFyaWFudCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9NeURlZmVycmVkLnByb21pc2UoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcm9jZXNzZXMgc2VsZWN0aW9uVmFyaWFudCBzdHJpbmcgYW5kIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCAoc2VtYW50aWNBdHRyaWJ1dGVzIGFuZCBBcHBTdGF0ZUtleSkuXG5cdCAqXG5cdCAqIEBwYXJhbSBzU2VsZWN0aW9uVmFyaWFudCBTdHJpbmdpZmllZCBKU09OIG9iamVjdFxuXHQgKiBAcmV0dXJucyBBIFByb21pc2Ugb2JqZWN0IHRvIG1vbml0b3Igd2hlbiBhbGwgYWN0aW9ucyBvZiB0aGUgZnVuY3Rpb24gaGF2ZSBiZWVuIGV4ZWN1dGVkOyBpZiB0aGUgZXhlY3V0aW9uIGlzIHN1Y2Nlc3NmdWwsIHRoZVxuXHQgKiAgICAgICAgICBzZW1hbnRpY0F0dHJpYnV0ZXMgYXMgd2VsbCBhcyB0aGUgYXBwU3RhdGVLZXkgYXJlIHJldHVybmVkOyBpZiBhbiBlcnJvciBvY2N1cnMsIGFuIGVycm9yIG9iamVjdCBvZiB0eXBlXG5cdCAqICAgICAgICAgIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5OYXZFcnJvcn0gaXMgcmV0dXJuZWRcblx0ICogPGJyPlxuXHQgKiBAZXhhbXBsZSA8Y29kZT5cblx0ICogc2FwLnVpLmRlZmluZShbXCJzYXAvZmUvbmF2aWdhdGlvbi9OYXZpZ2F0aW9uSGFuZGxlclwiLCBcInNhcC9mZS9uYXZpZ2F0aW9uL1NlbGVjdGlvblZhcmlhbnRcIl0sIGZ1bmN0aW9uIChOYXZpZ2F0aW9uSGFuZGxlciwgU2VsZWN0aW9uVmFyaWFudCkge1xuXHQgKiBcdFx0dmFyIG9TZWxlY3Rpb25WYXJpYW50ID0gbmV3IFNlbGVjdGlvblZhcmlhbnQoKTtcblx0ICogXHRcdG9TZWxlY3Rpb25WYXJpYW50LmFkZFNlbGVjdE9wdGlvbihcIkNvbXBhbnlDb2RlXCIsIFwiSVwiLCBcIkVRXCIsIFwiMDAwMVwiKTtcblx0ICogXHRcdG9TZWxlY3Rpb25WYXJpYW50LmFkZFNlbGVjdE9wdGlvbihcIkN1c3RvbWVyXCIsIFwiSVwiLCBcIkVRXCIsIFwiQzAwMDFcIik7XG5cdCAqIFx0XHR2YXIgc1NlbGVjdGlvblZhcmlhbnQ9IG9TZWxlY3Rpb25WYXJpYW50LnRvSlNPTlN0cmluZygpO1xuXHQgKlxuXHQgKiBcdFx0dmFyIG9OYXZpZ2F0aW9uSGFuZGxlciA9IG5ldyBOYXZpZ2F0aW9uSGFuZGxlcihvQ29udHJvbGxlcik7XG5cdCAqIFx0XHR2YXIgb1Byb21pc2VPYmplY3QgPSBvTmF2aWdhdGlvbkhhbmRsZXIuX2dldEFwcFN0YXRlS2V5QW5kVXJsUGFyYW1ldGVycyhzU2VsZWN0aW9uVmFyaWFudCk7XG5cdCAqXG5cdCAqIFx0XHRvUHJvbWlzZU9iamVjdC5kb25lKGZ1bmN0aW9uKG9TZW1hbnRpY0F0dHJpYnV0ZXMsIHNBcHBTdGF0ZUtleSl7XG5cdCAqIFx0XHRcdC8vIGhlcmUgeW91IGNhbiBhZGQgY29kaW5nIHRoYXQgc2hvdWxkIHJ1biBhZnRlciBhbGwgYXBwIHN0YXRlIGFuZCB0aGUgc2VtYW50aWMgYXR0cmlidXRlcyBoYXZlIGJlZW4gcmV0dXJuZWQuXG5cdCAqIFx0XHR9KTtcblx0ICpcblx0ICogXHRcdG9Qcm9taXNlT2JqZWN0LmZhaWwoZnVuY3Rpb24ob0Vycm9yKXtcblx0ICogXHRcdFx0Ly9zb21lIGVycm9yIGhhbmRsaW5nXG5cdCAqIFx0XHR9KTtcblx0ICpcdH0pO1xuXHQgKiA8L2NvZGU+XG5cdCAqIEBwcml2YXRlXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKi9cblx0X2dldEFwcFN0YXRlS2V5QW5kVXJsUGFyYW1ldGVycyhzU2VsZWN0aW9uVmFyaWFudDogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIHRoaXMucHJvY2Vzc0JlZm9yZVNtYXJ0TGlua1BvcG92ZXJPcGVucyh1bmRlZmluZWQsIHNTZWxlY3Rpb25WYXJpYW50LCB1bmRlZmluZWQsIHVuZGVmaW5lZCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IEFwcCBzcGVjaWZpYyBoYXNoLlxuXHQgKlxuXHQgKiBAcGFyYW0gYXBwSGFzaCBUaGUgcGF0aCBzdHJpbmdcblx0ICogQHJldHVybnMgQSBzdHJpbmcgcmVwcmVzZW50aW5nIGJhc2UgcGF0aFxuXHQgKlxuXHQgKi9cblx0YXN5bmMgX2dldEFwcFNwZWNpZmljSGFzaChhcHBIYXNoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBjcm9zc0FwcFNlcnZpY2UgPSBhd2FpdCB0aGlzLl9nZXRBcHBOYXZpZ2F0aW9uU2VydmljZUFzeW5jKCk7XG5cdFx0XHRyZXR1cm4gY3Jvc3NBcHBTZXJ2aWNlLmhyZWZGb3JBcHBTcGVjaWZpY0hhc2hBc3luYyhhcHBIYXNoKTtcblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0Y29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcblx0XHRcdExvZy5lcnJvcihgRkUgOiBDYW4gbm90IGZldGNoIEFwcCBzZXBjaWZpYyBVUkwgOiAke21lc3NhZ2V9YCk7XG5cdFx0XHR0aHJvdyBFcnJvcihtZXNzYWdlKTtcblx0XHR9XG5cdH1cblxuXHRfbWl4QXR0cmlidXRlc1RvU2VsVmFyaWFudChtU2VtYW50aWNBdHRyaWJ1dGVzOiBhbnksIG9TZWxWYXJpYW50OiBhbnksIGlTdXBwcmVzc2lvbkJlaGF2aW9yOiBhbnkpIHtcblx0XHQvLyBhZGQgYWxsIHNlbWFudGljIGF0dHJpYnV0ZXMgdG8gdGhlIG1peGVkIHNlbGVjdGlvbiB2YXJpYW50XG5cdFx0Zm9yIChjb25zdCBzUHJvcGVydHlOYW1lIGluIG1TZW1hbnRpY0F0dHJpYnV0ZXMpIHtcblx0XHRcdGlmIChtU2VtYW50aWNBdHRyaWJ1dGVzLmhhc093blByb3BlcnR5KHNQcm9wZXJ0eU5hbWUpKSB7XG5cdFx0XHRcdC8vIEEgdmFsdWUgb2YgYSBzZW1hbnRpYyBhdHRyaWJ1dGUgbWF5IG5vdCBiZSBhIHN0cmluZywgYnV0IGNhbiBiZSBlLmcuIGEgZGF0ZS5cblx0XHRcdFx0Ly8gU2luY2UgdGhlIHNlbGVjdGlvbiB2YXJpYW50IGFjY2VwdHMgb25seSBhIHN0cmluZywgd2UgaGF2ZSB0byBjb252ZXJ0IGl0IGluIGRlcGVuZGVuY2Ugb2YgdGhlIHR5cGUuXG5cdFx0XHRcdGxldCB2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZSA9IG1TZW1hbnRpY0F0dHJpYnV0ZXNbc1Byb3BlcnR5TmFtZV07XG5cdFx0XHRcdGlmICh2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcblx0XHRcdFx0XHQvLyB1c2UgdGhlIHNhbWUgY29udmVyc2lvbiBtZXRob2QgZm9yIGRhdGVzIGFzIHRoZSBTbWFydEZpbHRlckJhcjogdG9KU09OKClcblx0XHRcdFx0XHR2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZSA9IHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlLnRvSlNPTigpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdEFycmF5LmlzQXJyYXkodlNlbWFudGljQXR0cmlidXRlVmFsdWUpIHx8XG5cdFx0XHRcdFx0KHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlICYmIHR5cGVvZiB2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZSA9PT0gXCJvYmplY3RcIilcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0dlNlbWFudGljQXR0cmlidXRlVmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAodHlwZW9mIHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlID09PSBcIm51bWJlclwiIHx8IHR5cGVvZiB2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZSA9PT0gXCJib29sZWFuXCIpIHtcblx0XHRcdFx0XHR2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZSA9IHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlLnRvU3RyaW5nKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodlNlbWFudGljQXR0cmlidXRlVmFsdWUgPT09IFwiXCIpIHtcblx0XHRcdFx0XHRpZiAoaVN1cHByZXNzaW9uQmVoYXZpb3IgJiBTdXBwcmVzc2lvbkJlaGF2aW9yLmlnbm9yZUVtcHR5U3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRMb2cuaW5mbyhcblx0XHRcdFx0XHRcdFx0XCJTZW1hbnRpYyBhdHRyaWJ1dGUgXCIgK1xuXHRcdFx0XHRcdFx0XHRcdHNQcm9wZXJ0eU5hbWUgK1xuXHRcdFx0XHRcdFx0XHRcdFwiIGlzIGFuIGVtcHR5IHN0cmluZyBhbmQgZHVlIHRvIHRoZSBjaG9zZW4gU3VwcHJlc3Npb24gQmVoaWF2b3VyIGlzIGJlaW5nIGlnbm9yZWQuXCJcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodlNlbWFudGljQXR0cmlidXRlVmFsdWUgPT09IG51bGwpIHtcblx0XHRcdFx0XHRpZiAoaVN1cHByZXNzaW9uQmVoYXZpb3IgJiBTdXBwcmVzc2lvbkJlaGF2aW9yLnJhaXNlRXJyb3JPbk51bGwpIHtcblx0XHRcdFx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfSU5QVVRcIik7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdExvZy53YXJuaW5nKFwiU2VtYW50aWMgYXR0cmlidXRlIFwiICsgc1Byb3BlcnR5TmFtZSArIFwiIGlzIG51bGwgYW5kIGlnbm9yZWQgZm9yIG1peCBpbiB0byBzZWxlY3Rpb24gdmFyaWFudFwiKTtcblx0XHRcdFx0XHRcdGNvbnRpbnVlOyAvLyBpZ25vcmUhXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRpZiAoaVN1cHByZXNzaW9uQmVoYXZpb3IgJiBTdXBwcmVzc2lvbkJlaGF2aW9yLnJhaXNlRXJyb3JPblVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9JTlBVVFwiKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0TG9nLndhcm5pbmcoXCJTZW1hbnRpYyBhdHRyaWJ1dGUgXCIgKyBzUHJvcGVydHlOYW1lICsgXCIgaXMgdW5kZWZpbmVkIGFuZCBpZ25vcmVkIGZvciBtaXggaW4gdG8gc2VsZWN0aW9uIHZhcmlhbnRcIik7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodHlwZW9mIHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlID09PSBcInN0cmluZ1wiIHx8IHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7XG5cdFx0XHRcdFx0b1NlbFZhcmlhbnQuYWRkU2VsZWN0T3B0aW9uKHNQcm9wZXJ0eU5hbWUsIFwiSVwiLCBcIkVRXCIsIHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgTmF2RXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5JTlZBTElEX0lOUFVUXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvU2VsVmFyaWFudDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb21iaW5lcyB0aGUgZ2l2ZW4gcGFyYW1ldGVycyBhbmQgc2VsZWN0aW9uIHZhcmlhbnQgaW50byBhIG5ldyBzZWxlY3Rpb24gdmFyaWFudCBjb250YWluaW5nIHByb3BlcnRpZXMgZnJvbSBib3RoLCB3aXRoIHRoZSBwYXJhbWV0ZXJzXG5cdCAqIG92ZXJyaWRpbmcgZXhpc3RpbmcgcHJvcGVydGllcyBpbiB0aGUgc2VsZWN0aW9uIHZhcmlhbnQuIFRoZSBuZXcgc2VsZWN0aW9uIHZhcmlhbnQgZG9lcyBub3QgY29udGFpbiBhbnkgcGFyYW1ldGVycy4gQWxsIHBhcmFtZXRlcnMgYXJlXG5cdCAqIG1lcmdlZCBpbnRvIHNlbGVjdCBvcHRpb25zLiBUaGUgb3V0cHV0IG9mIHRoaXMgZnVuY3Rpb24sIGNvbnZlcnRlZCB0byBhIEpTT04gc3RyaW5nLCBjYW4gYmUgdXNlZCBmb3IgdGhlXG5cdCAqIHtAbGluayAjLm5hdmlnYXRlIE5hdmlnYXRpb25IYW5kbGVyLm5hdmlnYXRlfSBtZXRob2QuXG5cdCAqXG5cdCAqIEBwYXJhbSB2U2VtYW50aWNBdHRyaWJ1dGVzIE9iamVjdC8oQXJyYXkgb2YgT2JqZWN0cykgY29udGFpbmluZyBrZXkvdmFsdWUgcGFpcnNcblx0ICogQHBhcmFtIHNTZWxlY3Rpb25WYXJpYW50IFRoZSBzZWxlY3Rpb24gdmFyaWFudCBpbiBzdHJpbmcgZm9ybWF0IGFzIHByb3ZpZGVkIGJ5IHRoZSBTbWFydEZpbHRlckJhciBjb250cm9sXG5cdCAqIEBwYXJhbSBbaVN1cHByZXNzaW9uQmVoYXZpb3I9c2FwLmZlLm5hdmlnYXRpb24uU3VwcHJlc3Npb25CZWhhdmlvci5zdGFuZGFyZF0gSW5kaWNhdGVzIHdoZXRoZXIgc2VtYW50aWNcblx0ICogICAgICAgIGF0dHJpYnV0ZXMgd2l0aCBzcGVjaWFsIHZhbHVlcyAoc2VlIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5TdXBwcmVzc2lvbkJlaGF2aW9yIHN1cHByZXNzaW9uIGJlaGF2aW9yfSkgbXVzdCBiZVxuXHQgKiAgICAgICAgc3VwcHJlc3NlZCBiZWZvcmUgdGhleSBhcmUgY29tYmluZWQgd2l0aCB0aGUgc2VsZWN0aW9uIHZhcmlhbnQ7IHNldmVyYWxcblx0ICogICAgICAgIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5TdXBwcmVzc2lvbkJlaGF2aW9yIHN1cHByZXNzaW9uIGJlaGF2aW9yc30gY2FuIGJlIGNvbWJpbmVkIHdpdGggdGhlIGJpdHdpc2UgT1Igb3BlcmF0b3Jcblx0ICogICAgICAgICh8KVxuXHQgKiBAcmV0dXJucyBJbnN0YW5jZSBvZiB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uU2VsZWN0aW9uVmFyaWFudH1cblx0ICogQHB1YmxpY1xuXHQgKiBAZXhhbXBsZSA8Y29kZT5cblx0ICogc2FwLnVpLmRlZmluZShbXCJzYXAvZmUvbmF2aWdhdGlvbi9OYXZpZ2F0aW9uSGFuZGxlclwiLCBcInNhcC9mZS9uYXZpZ2F0aW9uL1NlbGVjdGlvblZhcmlhbnRcIl0sIGZ1bmN0aW9uIChOYXZpZ2F0aW9uSGFuZGxlciwgU2VsZWN0aW9uVmFyaWFudCkge1xuXHQgKiBcdHZhciB2U2VtYW50aWNBdHRyaWJ1dGVzID0geyBcIkN1c3RvbWVyXCIgOiBcIkMwMDAxXCIgfTtcblx0ICogXHRvclxuXHQgKiBcdHZhciB2U2VtYW50aWNBdHRyaWJ1dGVzID0gW3sgXCJDdXN0b21lclwiIDogXCJDMDAwMVwiIH0seyBcIkN1c3RvbWVyXCIgOiBcIkMwMDAyXCIgfV07XG5cdCAqIFx0dmFyIHNTZWxlY3Rpb25WYXJpYW50ID0gb1NtYXJ0RmlsdGVyQmFyLmdldERhdGFTdWl0ZUZvcm1hdCgpO1xuXHQgKiBcdHZhciBvTmF2aWdhdGlvbkhhbmRsZXIgPSBuZXcgTmF2aWdhdGlvbkhhbmRsZXIob0NvbnRyb2xsZXIpO1xuXHQgKiBcdHZhciBzTmF2aWdhdGlvblNlbGVjdGlvblZhcmlhbnQgPSBvTmF2aWdhdGlvbkhhbmRsZXIubWl4QXR0cmlidXRlc0FuZFNlbGVjdGlvblZhcmlhbnQodlNlbWFudGljQXR0cmlidXRlcywgc1NlbGVjdGlvblZhcmlhbnQpLnRvSlNPTlN0cmluZygpO1xuXHQgKiBcdC8vIEluIGNhc2Ugb2YgYW4gdlNlbWFudGljQXR0cmlidXRlcyBiZWluZyBhbiBhcnJheSwgdGhlIHNlbWFudGljQXR0cmlidXRlcyBhcmUgbWVyZ2VkIHRvIGEgc2luZ2xlIFNWIGFuZCBjb21wYXJlZCBhZ2FpbnN0IHRoZSBzU2VsZWN0aW9uVmFyaWFudChzZWNvbmQgYWdydW1lbnQpLlxuXHQgKiBcdC8vIE9wdGlvbmFsbHksIHlvdSBjYW4gc3BlY2lmeSBvbmUgb3Igc2V2ZXJhbCBzdXBwcmVzc2lvbiBiZWhhdmlvcnMuIFNldmVyYWwgc3VwcHJlc3Npb24gYmVoYXZpb3JzIGFyZSBjb21iaW5lZCB3aXRoIHRoZSBiaXR3aXNlIE9SIG9wZXJhdG9yLCBlLmcuXG5cdCAqIFx0Ly8gdmFyIGlTdXBwcmVzc2lvbkJlaGF2aW9yID0gc2FwLmZlLm5hdmlnYXRpb24uU3VwcHJlc3Npb25CZWhhdmlvci5yYWlzZUVycm9yT25OdWxsIHwgc2FwLmZlLm5hdmlnYXRpb24uU3VwcHJlc3Npb25CZWhhdmlvci5yYWlzZUVycm9yT25VbmRlZmluZWQ7XG5cdCAqIFx0Ly8gdmFyIHNOYXZpZ2F0aW9uU2VsZWN0aW9uVmFyaWFudCA9IG9OYXZpZ2F0aW9uSGFuZGxlci5taXhBdHRyaWJ1dGVzQW5kU2VsZWN0aW9uVmFyaWFudChtU2VtYW50aWNBdHRyaWJ1dGVzLCBzU2VsZWN0aW9uVmFyaWFudCwgaVN1cHByZXNzaW9uQmVoYXZpb3IpLnRvSlNPTlN0cmluZygpO1xuXHQgKlxuXHQgKiBcdG9OYXZpZ2F0aW9uSGFuZGxlci5uYXZpZ2F0ZShcIlNhbGVzT3JkZXJcIiwgXCJjcmVhdGVcIiwgc05hdmlnYXRpb25TZWxlY3Rpb25WYXJpYW50KTtcblx0ICogfSk7XG5cdCAqIDwvY29kZT5cblx0ICovXG5cdG1peEF0dHJpYnV0ZXNBbmRTZWxlY3Rpb25WYXJpYW50KFxuXHRcdHZTZW1hbnRpY0F0dHJpYnV0ZXM6IG9iamVjdCB8IGFueVtdLFxuXHRcdHNTZWxlY3Rpb25WYXJpYW50OiBzdHJpbmcgfCBTZXJpYWxpemVkU2VsZWN0aW9uVmFyaWFudCxcblx0XHRpU3VwcHJlc3Npb25CZWhhdmlvcj86IG51bWJlclxuXHQpOiBTZWxlY3Rpb25WYXJpYW50IHtcblx0XHRjb25zdCBvU2VsZWN0aW9uVmFyaWFudCA9IG5ldyBTZWxlY3Rpb25WYXJpYW50KHNTZWxlY3Rpb25WYXJpYW50KTtcblx0XHRjb25zdCBvTmV3U2VsVmFyaWFudCA9IG5ldyBTZWxlY3Rpb25WYXJpYW50KCk7XG5cdFx0Y29uc3Qgb05hdkhhbmRsZXIgPSB0aGlzO1xuXG5cdFx0Y29uc3QgZmlsdGVyVXJsID0gb1NlbGVjdGlvblZhcmlhbnQuZ2V0RmlsdGVyQ29udGV4dFVybCgpO1xuXHRcdGlmIChmaWx0ZXJVcmwpIHtcblx0XHRcdG9OZXdTZWxWYXJpYW50LnNldEZpbHRlckNvbnRleHRVcmwoZmlsdGVyVXJsKTtcblx0XHR9XG5cblx0XHRjb25zdCBjb250ZXh0VXJsID0gb1NlbGVjdGlvblZhcmlhbnQuZ2V0UGFyYW1ldGVyQ29udGV4dFVybCgpO1xuXHRcdGlmIChjb250ZXh0VXJsKSB7XG5cdFx0XHRvTmV3U2VsVmFyaWFudC5zZXRQYXJhbWV0ZXJDb250ZXh0VXJsKGNvbnRleHRVcmwpO1xuXHRcdH1cblx0XHRpZiAoQXJyYXkuaXNBcnJheSh2U2VtYW50aWNBdHRyaWJ1dGVzKSkge1xuXHRcdFx0dlNlbWFudGljQXR0cmlidXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChtU2VtYW50aWNBdHRyaWJ1dGVzOiBhbnkpIHtcblx0XHRcdFx0b05hdkhhbmRsZXIuX21peEF0dHJpYnV0ZXNUb1NlbFZhcmlhbnQobVNlbWFudGljQXR0cmlidXRlcywgb05ld1NlbFZhcmlhbnQsIGlTdXBwcmVzc2lvbkJlaGF2aW9yKTtcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLl9taXhBdHRyaWJ1dGVzVG9TZWxWYXJpYW50KHZTZW1hbnRpY0F0dHJpYnV0ZXMsIG9OZXdTZWxWYXJpYW50LCBpU3VwcHJlc3Npb25CZWhhdmlvcik7XG5cdFx0fVxuXG5cdFx0Ly8gYWRkIHBhcmFtZXRlcnMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIG9OZXdTZWxWYXJpYW50IHlldFxuXHRcdGNvbnN0IGFQYXJhbWV0ZXJzID0gb1NlbGVjdGlvblZhcmlhbnQuZ2V0UGFyYW1ldGVyTmFtZXMoKTtcblx0XHRsZXQgaTtcblx0XHRmb3IgKGkgPSAwOyBpIDwgYVBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGlmICghb05ld1NlbFZhcmlhbnQuZ2V0U2VsZWN0T3B0aW9uKGFQYXJhbWV0ZXJzW2ldKSkge1xuXHRcdFx0XHRvTmV3U2VsVmFyaWFudC5hZGRTZWxlY3RPcHRpb24oYVBhcmFtZXRlcnNbaV0sIFwiSVwiLCBcIkVRXCIsIG9TZWxlY3Rpb25WYXJpYW50LmdldFBhcmFtZXRlcihhUGFyYW1ldGVyc1tpXSkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIGFkZCBzZWxPcHRpb25zIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBvTmV3U2VsVmFyaWFudCB5ZXRcblx0XHRjb25zdCBhU2VsT3B0aW9uTmFtZXMgPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcygpO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBhU2VsT3B0aW9uTmFtZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdC8vIGFkZCBzZWxPcHRpb25zIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBvTmV3U2VsVmFyaWFudCB5ZXRcblx0XHRcdGNvbnN0IGFTZWxlY3RPcHRpb246IGFueVtdID0gb1NlbGVjdGlvblZhcmlhbnQuZ2V0U2VsZWN0T3B0aW9uKGFTZWxPcHRpb25OYW1lc1tpXSkhO1xuXHRcdFx0aWYgKCFvTmV3U2VsVmFyaWFudC5nZXRTZWxlY3RPcHRpb24oYVNlbE9wdGlvbk5hbWVzW2ldKSkge1xuXHRcdFx0XHRmb3IgKGxldCBqID0gMDsgaiA8IGFTZWxlY3RPcHRpb24ubGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0XHRvTmV3U2VsVmFyaWFudC5hZGRTZWxlY3RPcHRpb24oXG5cdFx0XHRcdFx0XHRhU2VsT3B0aW9uTmFtZXNbaV0sXG5cdFx0XHRcdFx0XHRhU2VsZWN0T3B0aW9uW2pdLlNpZ24sXG5cdFx0XHRcdFx0XHRhU2VsZWN0T3B0aW9uW2pdLk9wdGlvbixcblx0XHRcdFx0XHRcdGFTZWxlY3RPcHRpb25bal0uTG93LFxuXHRcdFx0XHRcdFx0YVNlbGVjdE9wdGlvbltqXS5IaWdoXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBvTmV3U2VsVmFyaWFudDtcblx0fVxuXG5cdF9lbnN1cmVTZWxlY3Rpb25WYXJpYW50Rm9ybWF0U3RyaW5nKHZTZWxlY3Rpb25WYXJpYW50OiBhbnkpIHtcblx0XHQvKlxuXHRcdCAqIFRoZXJlIGFyZSBsZWdhY3kgQXBwU3RhdGVzIHdoZXJlIHRoZSBTZWxlY3Rpb25WYXJpYW50IGlzIGJlaW5nIHN0b3JlZCBhcyBhIHN0cmluZy4gSG93ZXZlciwgdGhhdCBpcyBub3QgY29tcGxpYW50IHRvIHRoZSBzcGVjaWZpY2F0aW9uLFxuXHRcdCAqIHdoaWNoIHN0YXRlcyB0aGF0IGEgc3RhbmRhcmQgSlMgb2JqZWN0IHNoYWxsIGJlIHByb3ZpZGVkLiBJbnRlcm5hbGx5LCBob3dldmVyLCB0aGUgc2VsZWN0aW9uVmFyaWFudCBpcyBhbHdheXMgb2YgdHlwZSBzdHJpbmcuIFNpdHVhdGlvblxuXHRcdCAqIFBlcnNpc3RlbmN5IGludGVybmFsIEFQSSAtLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gbGVnYWN5IHN0cmluZyBzdHJpbmcgbmV3IGFwcHJvYWNoIChKU09OKSBvYmplY3Rcblx0XHQgKiBzdHJpbmdcblx0XHQgKi9cblxuXHRcdGlmICh2U2VsZWN0aW9uVmFyaWFudCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGxldCB2Q29udmVydGVkU2VsZWN0aW9uVmFyaWFudCA9IHZTZWxlY3Rpb25WYXJpYW50O1xuXG5cdFx0aWYgKHR5cGVvZiB2U2VsZWN0aW9uVmFyaWFudCA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0dkNvbnZlcnRlZFNlbGVjdGlvblZhcmlhbnQgPSBKU09OLnN0cmluZ2lmeSh2U2VsZWN0aW9uVmFyaWFudCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZDb252ZXJ0ZWRTZWxlY3Rpb25WYXJpYW50O1xuXHR9XG5cblx0X2ZuSGFuZGxlQXBwU3RhdGVQcm9taXNlKG9SZXR1cm46IGFueSwgZm5PbkFmdGVyU2F2ZTogYW55LCBmbk9uRXJyb3I6IGFueSkge1xuXHRcdG9SZXR1cm4ucHJvbWlzZS5kb25lKGZ1bmN0aW9uICgpIHtcblx0XHRcdGlmIChmbk9uQWZ0ZXJTYXZlKSB7XG5cdFx0XHRcdGZuT25BZnRlclNhdmUob1JldHVybi5hcHBTdGF0ZUtleSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRpZiAoZm5PbkVycm9yKSB7XG5cdFx0XHRjb25zdCBvTmF2SGFuZGxlciA9IHRoaXM7XG5cdFx0XHRvUmV0dXJuLnByb21pc2UuZmFpbChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGNvbnN0IG9FcnJvciA9IG9OYXZIYW5kbGVyLl9jcmVhdGVUZWNobmljYWxFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLkFwcFN0YXRlU2F2ZS5mYWlsZWRcIik7XG5cdFx0XHRcdGZuT25FcnJvcihvRXJyb3IpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0X3NhdmVBcHBTdGF0ZUFzeW5jKG9BcHBEYXRhOiBhbnksIGZuT25BZnRlclNhdmU6IGFueSwgZm5PbkVycm9yOiBhbnkpIHtcblx0XHRjb25zdCBvTmF2SGFuZGxlciA9IHRoaXM7XG5cdFx0cmV0dXJuIHRoaXMuX2ZuU2F2ZUFwcFN0YXRlQXN5bmMob0FwcERhdGEsIGZuT25FcnJvcikudGhlbihmdW5jdGlvbiAob1JldHVybjogYW55KSB7XG5cdFx0XHRpZiAob1JldHVybikge1xuXHRcdFx0XHRvTmF2SGFuZGxlci5fZm5IYW5kbGVBcHBTdGF0ZVByb21pc2Uob1JldHVybiwgZm5PbkFmdGVyU2F2ZSwgZm5PbkVycm9yKTtcblx0XHRcdFx0cmV0dXJuIG9SZXR1cm4uYXBwU3RhdGVLZXk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fSk7XG5cdH1cblxuXHRfc2F2ZUFwcFN0YXRlKG9BcHBEYXRhOiBhbnksIGZuT25BZnRlclNhdmU6IGFueSwgZm5PbkVycm9yOiBhbnkpIHtcblx0XHRjb25zdCBvUmV0dXJuID0gdGhpcy5fc2F2ZUFwcFN0YXRlV2l0aEltbWVkaWF0ZVJldHVybihvQXBwRGF0YSwgZm5PbkVycm9yKTtcblx0XHRpZiAob1JldHVybikge1xuXHRcdFx0dGhpcy5fZm5IYW5kbGVBcHBTdGF0ZVByb21pc2Uob1JldHVybiwgZm5PbkFmdGVyU2F2ZSwgZm5PbkVycm9yKTtcblx0XHRcdHJldHVybiBvUmV0dXJuLmFwcFN0YXRlS2V5O1xuXHRcdH1cblxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRfZm5TYXZlQXBwU3RhdGVXaXRoSW1tZWRpYXRlUmV0dXJuKG9BcHBEYXRhOiBhbnksIG9BcHBTdGF0ZTogYW55LCBmbk9uRXJyb3I6IGFueSkge1xuXHRcdGNvbnN0IHNBcHBTdGF0ZUtleSA9IG9BcHBTdGF0ZS5nZXRLZXkoKTtcblx0XHRjb25zdCBvQXBwRGF0YUZvclNhdmUgPSB0aGlzLl9mZXRjaEFwcERhdGFGb3JTYXZlKG9BcHBEYXRhLCBmbk9uRXJyb3IpO1xuXHRcdGlmICghb0FwcERhdGFGb3JTYXZlKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRvQXBwU3RhdGUuc2V0RGF0YShvQXBwRGF0YUZvclNhdmUpO1xuXHRcdGNvbnN0IG9TYXZlUHJvbWlzZSA9IG9BcHBTdGF0ZS5zYXZlKCk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0YXBwU3RhdGVLZXk6IHNBcHBTdGF0ZUtleSxcblx0XHRcdHByb21pc2U6IG9TYXZlUHJvbWlzZS5wcm9taXNlKClcblx0XHR9O1xuXHR9XG5cblx0X2ZldGNoQXBwRGF0YUZvclNhdmUob0FwcERhdGE6IElubmVyQXBwRGF0YSwgZm5PbkVycm9yOiBhbnkpIHtcblx0XHRsZXQgb0FwcERhdGFGb3JTYXZlOiBQYXJ0aWFsPElubmVyQXBwRGF0YT4gPSB7fTtcblxuXHRcdGlmIChvQXBwRGF0YS5oYXNPd25Qcm9wZXJ0eShcInNlbGVjdGlvblZhcmlhbnRcIikpIHtcblx0XHRcdG9BcHBEYXRhRm9yU2F2ZS5zZWxlY3Rpb25WYXJpYW50ID0gb0FwcERhdGEuc2VsZWN0aW9uVmFyaWFudDtcblxuXHRcdFx0aWYgKG9BcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQpIHtcblx0XHRcdFx0Lypcblx0XHRcdFx0ICogVGhlIHNwZWNpZmljYXRpb24gc3RhdGVzIHRoYXQgU2VsZWN0aW9uIFZhcmlhbnRzIG5lZWQgdG8gYmUgSlNPTiBvYmplY3RzLiBIb3dldmVyLCBpbnRlcm5hbGx5LCB3ZSB3b3JrIHdpdGggc3RyaW5ncyBmb3Jcblx0XHRcdFx0ICogXCJzZWxlY3Rpb25WYXJpYW50XCIuIFRoZXJlZm9yZSwgaW4gY2FzZSB0aGF0IHRoaXMgaXMgYSBzdHJpbmcsIHdlIG5lZWQgdG8gSlNPTi1wYXJzZSB0aGUgZGF0YS5cblx0XHRcdFx0ICovXG5cdFx0XHRcdGlmICh0eXBlb2Ygb0FwcERhdGEuc2VsZWN0aW9uVmFyaWFudCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRvQXBwRGF0YUZvclNhdmUuc2VsZWN0aW9uVmFyaWFudCA9IEpTT04ucGFyc2Uob0FwcERhdGEuc2VsZWN0aW9uVmFyaWFudCk7XG5cdFx0XHRcdFx0fSBjYXRjaCAoeCkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0Vycm9yID0gdGhpcy5fY3JlYXRlVGVjaG5pY2FsRXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5BcHBTdGF0ZVNhdmUucGFyc2VFcnJvclwiKTtcblx0XHRcdFx0XHRcdGlmIChmbk9uRXJyb3IpIHtcblx0XHRcdFx0XHRcdFx0Zm5PbkVycm9yKG9FcnJvcik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0aGlzLl9zTW9kZSA9PT0gTW9kZS5PRGF0YVYyKSB7XG5cdFx0XHRvQXBwRGF0YUZvclNhdmUgPSBleHRlbmQoXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRzZWxlY3Rpb25WYXJpYW50OiB7fSxcblx0XHRcdFx0XHR0YWJsZVZhcmlhbnRJZDogXCJcIixcblx0XHRcdFx0XHRjdXN0b21EYXRhOiB7fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRvQXBwRGF0YUZvclNhdmVcblx0XHRcdCkgYXMgSW5uZXJBcHBEYXRhO1xuXG5cdFx0XHRpZiAob0FwcERhdGEudGFibGVWYXJpYW50SWQpIHtcblx0XHRcdFx0b0FwcERhdGFGb3JTYXZlLnRhYmxlVmFyaWFudElkID0gb0FwcERhdGEudGFibGVWYXJpYW50SWQ7XG5cdFx0XHR9XG5cdFx0XHRpZiAob0FwcERhdGEuY3VzdG9tRGF0YSkge1xuXHRcdFx0XHRvQXBwRGF0YUZvclNhdmUuY3VzdG9tRGF0YSA9IG9BcHBEYXRhLmN1c3RvbURhdGE7XG5cdFx0XHR9XG5cdFx0XHRpZiAob0FwcERhdGEucHJlc2VudGF0aW9uVmFyaWFudCkge1xuXHRcdFx0XHRvQXBwRGF0YUZvclNhdmUucHJlc2VudGF0aW9uVmFyaWFudCA9IG9BcHBEYXRhLnByZXNlbnRhdGlvblZhcmlhbnQ7XG5cdFx0XHR9XG5cdFx0XHRpZiAob0FwcERhdGEudmFsdWVUZXh0cykge1xuXHRcdFx0XHRvQXBwRGF0YUZvclNhdmUudmFsdWVUZXh0cyA9IG9BcHBEYXRhLnZhbHVlVGV4dHM7XG5cdFx0XHR9XG5cdFx0XHRpZiAob0FwcERhdGEuc2VtYW50aWNEYXRlcykge1xuXHRcdFx0XHRvQXBwRGF0YUZvclNhdmUuc2VtYW50aWNEYXRlcyA9IG9BcHBEYXRhLnNlbWFudGljRGF0ZXM7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IG9BcHBEYXRhQ2xvbmUgPSBPYmplY3QuYXNzaWduKHt9LCBvQXBwRGF0YSk7XG5cdFx0XHRvQXBwRGF0YUZvclNhdmUgPSBtZXJnZShvQXBwRGF0YUNsb25lLCBvQXBwRGF0YUZvclNhdmUpO1xuXHRcdH1cblx0XHRvQXBwRGF0YUZvclNhdmUgPSB0aGlzLl9jaGVja0lzUG90ZW50aWFsbHlTZW5zaXRpdmUob0FwcERhdGFGb3JTYXZlKTtcblx0XHRyZXR1cm4gb0FwcERhdGFGb3JTYXZlO1xuXHR9XG5cblx0X2ZuU2F2ZUFwcFN0YXRlQXN5bmMob0FwcERhdGE6IGFueSwgZm5PbkVycm9yPzogYW55KSB7XG5cdFx0Y29uc3Qgb05hdkhhbmRsZXIgPSB0aGlzO1xuXHRcdHJldHVybiB0aGlzLl9nZXRBcHBOYXZpZ2F0aW9uU2VydmljZUFzeW5jKClcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChvQ3Jvc3NBcHBOYXZTZXJ2aWNlOiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9Dcm9zc0FwcE5hdlNlcnZpY2UuY3JlYXRlRW1wdHlBcHBTdGF0ZUFzeW5jKG9OYXZIYW5kbGVyLm9Db21wb25lbnQpO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChvQXBwU3RhdGU6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb05hdkhhbmRsZXIuX2ZuU2F2ZUFwcFN0YXRlV2l0aEltbWVkaWF0ZVJldHVybihvQXBwRGF0YSwgb0FwcFN0YXRlLCBmbk9uRXJyb3IpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0aWYgKGZuT25FcnJvcikge1xuXHRcdFx0XHRcdGZuT25FcnJvcihvRXJyb3IpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0fVxuXG5cdF9zYXZlQXBwU3RhdGVXaXRoSW1tZWRpYXRlUmV0dXJuKG9BcHBEYXRhOiBhbnksIGZuT25FcnJvcj86IGFueSkge1xuXHRcdGNvbnN0IG9BcHBTdGF0ZSA9IHRoaXMuX2dldEFwcE5hdmlnYXRpb25TZXJ2aWNlKCkuY3JlYXRlRW1wdHlBcHBTdGF0ZSh0aGlzLm9Db21wb25lbnQpO1xuXHRcdHJldHVybiB0aGlzLl9mblNhdmVBcHBTdGF0ZVdpdGhJbW1lZGlhdGVSZXR1cm4ob0FwcERhdGEsIG9BcHBTdGF0ZSwgZm5PbkVycm9yKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIGxvYWRlZCBJQXBwIFN0YXRlIGFuZCBuYXZpZ2F0aW9uIHR5cGUgb25jZSByZXNvbHZlZC5cblx0ICpcblx0ICogQHBhcmFtIHNBcHBTdGF0ZUtleSBUaGUgSUFwcFN0YXRlS2V5IHRvIHJldHJpZXZlIHRoZSBBcHBTdGF0ZSBkYXRhLlxuXHQgKiBAcGFyYW0gb0RlZmVycmVkIEpxdWVyeSBkZWZlcnJlZCBvYmplY3QgdG8gcmVzb2x2ZSB0aGUgQXBwU3RhdGUgZGF0YS5cblx0ICogQHBhcmFtIG5hdlR5cGUgTmF2aWdhdGlvbiB0eXBlIGZvciB3aGljaCBBcHBTdGF0ZSBpcyByZXRyaWV2ZWQuXG5cdCAqIEByZXR1cm5zIFRoZSBkZWZlcnJlZCBvYmplY3Qgd2hpY2ggaXMgcmVzb2x2ZWQgd2l0aCBsb2FkZWQgYXBwIHN0YXRlIGRhdGFcblx0IGFuZCBuYXZpZ2F0aW9uIHR5cGUuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfbG9hZEFwcFN0YXRlKHNBcHBTdGF0ZUtleTogc3RyaW5nLCBvRGVmZXJyZWQ6IGpRdWVyeS5EZWZlcnJlZCwgbmF2VHlwZTogc3RyaW5nKTogalF1ZXJ5LkRlZmVycmVkIHtcblx0XHRjb25zdCBvTmF2SGFuZGxlciA9IHRoaXM7XG5cdFx0dGhpcy5fZ2V0QXBwTmF2aWdhdGlvblNlcnZpY2VBc3luYygpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob0Nyb3NzQXBwTmF2U2VydmljZTogYW55KSB7XG5cdFx0XHRcdGNvbnN0IG9BcHBTdGF0ZVByb21pc2UgPSBvQ3Jvc3NBcHBOYXZTZXJ2aWNlLmdldEFwcFN0YXRlKG9OYXZIYW5kbGVyLm9Db21wb25lbnQsIHNBcHBTdGF0ZUtleSk7XG5cdFx0XHRcdG9BcHBTdGF0ZVByb21pc2UuZG9uZShmdW5jdGlvbiAob0FwcFN0YXRlOiBhbnkpIHtcblx0XHRcdFx0XHRsZXQgb0FwcERhdGE6IGFueSA9IHt9O1xuXHRcdFx0XHRcdGNvbnN0IG9BcHBEYXRhTG9hZGVkID0gb0FwcFN0YXRlLmdldERhdGEoKTtcblxuXHRcdFx0XHRcdGlmICh0eXBlb2Ygb0FwcERhdGFMb2FkZWQgPT09IFwidW5kZWZpbmVkXCIpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9FcnJvciA9IG9OYXZIYW5kbGVyLl9jcmVhdGVUZWNobmljYWxFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLmdldERhdGFGcm9tQXBwU3RhdGUuZmFpbGVkXCIpO1xuXHRcdFx0XHRcdFx0b0RlZmVycmVkLnJlamVjdChvRXJyb3IsIHt9LCBuYXZUeXBlKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKG9OYXZIYW5kbGVyLl9zTW9kZSA9PT0gTW9kZS5PRGF0YVYyKSB7XG5cdFx0XHRcdFx0XHRvQXBwRGF0YSA9IHtcblx0XHRcdFx0XHRcdFx0c2VsZWN0aW9uVmFyaWFudDogXCJ7fVwiLFxuXHRcdFx0XHRcdFx0XHRvU2VsZWN0aW9uVmFyaWFudDogbmV3IFNlbGVjdGlvblZhcmlhbnQoKSxcblx0XHRcdFx0XHRcdFx0b0RlZmF1bHRlZFNlbGVjdGlvblZhcmlhbnQ6IG5ldyBTZWxlY3Rpb25WYXJpYW50KCksXG5cdFx0XHRcdFx0XHRcdGJOYXZTZWxWYXJIYXNEZWZhdWx0c09ubHk6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHR0YWJsZVZhcmlhbnRJZDogXCJcIixcblx0XHRcdFx0XHRcdFx0Y3VzdG9tRGF0YToge30sXG5cdFx0XHRcdFx0XHRcdGFwcFN0YXRlS2V5OiBzQXBwU3RhdGVLZXksXG5cdFx0XHRcdFx0XHRcdHByZXNlbnRhdGlvblZhcmlhbnQ6IHt9LFxuXHRcdFx0XHRcdFx0XHR2YWx1ZVRleHRzOiB7fSxcblx0XHRcdFx0XHRcdFx0c2VtYW50aWNEYXRlczoge30sXG5cdFx0XHRcdFx0XHRcdGRhdGE6IHt9XG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0aWYgKG9BcHBEYXRhTG9hZGVkLnNlbGVjdGlvblZhcmlhbnQpIHtcblx0XHRcdFx0XHRcdFx0Lypcblx0XHRcdFx0XHRcdFx0ICogSW4gY2FzZSB0aGF0IHdlIGdldCBhbiBvYmplY3QgZnJvbSB0aGUgc3RvcmVkIEFwcERhdGEgKD1wZXJzaXN0ZW5jeSksIHdlIG5lZWQgdG8gc3RyaW5naWZ5IHRoZSBKU09OIG9iamVjdC5cblx0XHRcdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0XHRcdG9BcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQgPSBvTmF2SGFuZGxlci5fZW5zdXJlU2VsZWN0aW9uVmFyaWFudEZvcm1hdFN0cmluZyhvQXBwRGF0YUxvYWRlZC5zZWxlY3Rpb25WYXJpYW50KTtcblx0XHRcdFx0XHRcdFx0b0FwcERhdGEub1NlbGVjdGlvblZhcmlhbnQgPSBuZXcgU2VsZWN0aW9uVmFyaWFudChvQXBwRGF0YS5zZWxlY3Rpb25WYXJpYW50KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChvQXBwRGF0YUxvYWRlZC50YWJsZVZhcmlhbnRJZCkge1xuXHRcdFx0XHRcdFx0XHRvQXBwRGF0YS50YWJsZVZhcmlhbnRJZCA9IG9BcHBEYXRhTG9hZGVkLnRhYmxlVmFyaWFudElkO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKG9BcHBEYXRhTG9hZGVkLmN1c3RvbURhdGEpIHtcblx0XHRcdFx0XHRcdFx0b0FwcERhdGEuY3VzdG9tRGF0YSA9IG9BcHBEYXRhTG9hZGVkLmN1c3RvbURhdGE7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAob0FwcERhdGFMb2FkZWQucHJlc2VudGF0aW9uVmFyaWFudCkge1xuXHRcdFx0XHRcdFx0XHRvQXBwRGF0YS5wcmVzZW50YXRpb25WYXJpYW50ID0gb0FwcERhdGFMb2FkZWQucHJlc2VudGF0aW9uVmFyaWFudDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChvQXBwRGF0YUxvYWRlZC52YWx1ZVRleHRzKSB7XG5cdFx0XHRcdFx0XHRcdG9BcHBEYXRhLnZhbHVlVGV4dHMgPSBvQXBwRGF0YUxvYWRlZC52YWx1ZVRleHRzO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKG9BcHBEYXRhTG9hZGVkLnNlbWFudGljRGF0ZXMpIHtcblx0XHRcdFx0XHRcdFx0b0FwcERhdGEuc2VtYW50aWNEYXRlcyA9IG9BcHBEYXRhTG9hZGVkLnNlbWFudGljRGF0ZXM7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQvKiBJbiBWMiBjYXNlLCB3ZSBuZWVkIHRoZSBkYXRhIGluIHRoZSBiZWxvdyBmb3JtYXQgZm9yIGh5YnJpZCBjYXNlICovXG5cdFx0XHRcdFx0XHRpZiAobmF2VHlwZSA9PT0gTmF2VHlwZS5oeWJyaWQpIHtcblx0XHRcdFx0XHRcdFx0b0FwcERhdGEuZGF0YSA9IG9BcHBEYXRhTG9hZGVkO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRvQXBwRGF0YSA9IG1lcmdlKG9BcHBEYXRhLCBvQXBwRGF0YUxvYWRlZCk7XG5cdFx0XHRcdFx0XHRpZiAob0FwcERhdGFMb2FkZWQuc2VsZWN0aW9uVmFyaWFudCkge1xuXHRcdFx0XHRcdFx0XHQvKlxuXHRcdFx0XHRcdFx0XHQgKiBJbiBjYXNlIHRoYXQgd2UgZ2V0IGFuIG9iamVjdCBmcm9tIHRoZSBzdG9yZWQgQXBwRGF0YSAoPXBlcnNpc3RlbmN5KSwgd2UgbmVlZCB0byBzdHJpbmdpZnkgdGhlIEpTT04gb2JqZWN0LlxuXHRcdFx0XHRcdFx0XHQgKi9cblx0XHRcdFx0XHRcdFx0b0FwcERhdGEuc2VsZWN0aW9uVmFyaWFudCA9IG9OYXZIYW5kbGVyLl9lbnN1cmVTZWxlY3Rpb25WYXJpYW50Rm9ybWF0U3RyaW5nKG9BcHBEYXRhTG9hZGVkLnNlbGVjdGlvblZhcmlhbnQpO1xuXHRcdFx0XHRcdFx0XHRvQXBwRGF0YS5vU2VsZWN0aW9uVmFyaWFudCA9IG5ldyBTZWxlY3Rpb25WYXJpYW50KG9BcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIHJlc29sdmUgaXMgY2FsbGVkIG9uIHBhc3NlZCBEZWZlcnJlZCBvYmplY3QgdG8gdHJpZ2dlciBhIGNhbGwgb2YgdGhlIGRvbmUgbWV0aG9kLCBpZiBpbXBsZW1lbnRlZFxuXHRcdFx0XHRcdC8vIHRoZSBkb25lIG1ldGhvZCB3aWxsIHJlY2VpdmUgdGhlIGxvYWRlZCBhcHBTdGF0ZSBhbmQgdGhlIG5hdmlnYXRpb24gdHlwZSBhcyBwYXJhbWV0ZXJzXG5cdFx0XHRcdFx0b0RlZmVycmVkLnJlc29sdmUob0FwcERhdGEsIHt9LCBuYXZUeXBlKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdG9BcHBTdGF0ZVByb21pc2UuZmFpbChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0Vycm9yID0gb05hdkhhbmRsZXIuX2NyZWF0ZVRlY2huaWNhbEVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuZ2V0QXBwU3RhdGUuZmFpbGVkXCIpO1xuXHRcdFx0XHRcdG9EZWZlcnJlZC5yZWplY3Qob0Vycm9yLCB7fSwgbmF2VHlwZSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gb0FwcFN0YXRlUHJvbWlzZTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRjb25zdCBvRXJyb3IgPSBvTmF2SGFuZGxlci5fY3JlYXRlVGVjaG5pY2FsRXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5fZ2V0QXBwTmF2aWdhdGlvblNlcnZpY2VBc3luYy5mYWlsZWRcIik7XG5cdFx0XHRcdG9EZWZlcnJlZC5yZWplY3Qob0Vycm9yLCB7fSwgbmF2VHlwZSk7XG5cdFx0XHR9KTtcblxuXHRcdHJldHVybiBvRGVmZXJyZWQ7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBwYXJhbWV0ZXIgdmFsdWUgb2YgdGhlIHNhcC1pYXBwLXN0YXRlICh0aGUgaW50ZXJuYWwgYXBwcykgZnJvbSB0aGUgQXBwSGFzaCBzdHJpbmcuIEl0IGF1dG9tYXRpY2FsbHkgdGFrZXMgY2FyZSBhYm91dFxuXHQgKiBjb21wYXRpYmlsaXR5IGJldHdlZW4gdGhlIG9sZCBhbmQgdGhlIG5ldyBhcHByb2FjaCBvZiB0aGUgc2FwLWlhcHAtc3RhdGUuIFByZWNlZGVuY2UgaXMgdGhhdCB0aGUgbmV3IGFwcHJvYWNoIGlzIGZhdm91cmVkIGFnYWluc3QgdGhlIG9sZFxuXHQgKiBhcHByb2FjaC5cblx0ICpcblx0ICogQHBhcmFtIHNBcHBIYXNoIFRoZSBBcHBIYXNoLCB3aGljaCBtYXkgY29udGFpbiBhIHNhcC1pYXBwLXN0YXRlIHBhcmFtZXRlciAoYm90aCBvbGQgYW5kL29yIG5ldyBhcHByb2FjaClcblx0ICogQHJldHVybnMgVGhlIHZhbHVlIG9mIHNhcC1pYXBwLXN0YXRlIChpLmUuIHRoZSBuYW1lIG9mIHRoZSBjb250YWluZXIgdG8gcmV0cmlldmUgdGhlIHBhcmFtZXRlcnMpLCBvciA8Y29kZT51bmRlZmluZWQ8L2NvZGU+IGluXG5cdCAqICAgICAgICAgY2FzZSB0aGF0IG5vIHNhcC1pYXBwLXN0YXRlIHdhcyBmb3VuZCBpbiA8Y29kZT5zQXBwSGFzaDwvY29kZT4uXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfZ2V0SW5uZXJBcHBTdGF0ZUtleShzQXBwSGFzaDogc3RyaW5nKSB7XG5cdFx0Ly8gdHJpdmlhbCBjYXNlOiBubyBhcHAgaGFzaCBhdmFpbGFibGUgYXQgYWxsLlxuXHRcdGlmICghc0FwcEhhc2gpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0LyogbmV3IGFwcHJvYWNoOiBzZXBhcmF0ZWQgdmlhIHF1ZXN0aW9uIG1hcmsgLyBwYXJ0IG9mIHRoZSBxdWVyeSBwYXJhbWV0ZXIgb2YgdGhlIEFwcEhhc2ggKi9cblx0XHRsZXQgYU1hdGNoZXMgPSB0aGlzLl9ySUFwcFN0YXRlTmV3LmV4ZWMoc0FwcEhhc2gpO1xuXG5cdFx0Lyogb2xkIGFwcHJvYWNoOiBzcGVhcmF0ZWQgdmlhIHNsYXNoZXMgLyBpLmUuIHBhcnQgb2YgdGhlIHJvdXRlIGl0c2VsZiAqL1xuXHRcdGlmIChhTWF0Y2hlcyA9PT0gbnVsbCkge1xuXHRcdFx0YU1hdGNoZXMgPSB0aGlzLl9ySUFwcFN0YXRlT2xkLmV4ZWMoc0FwcEhhc2gpO1xuXHRcdH1cblxuXHRcdC8qXG5cdFx0ICogb2xkIGFwcHJvYWNoOiBzcGVjaWFsIGNhc2U6IGlmIHRoZXJlIGlzIG5vIGRlZXAgcm91dGUva2V5IGRlZmluZWQsIHRoZSBzYXAtaWFwcC1zdGF0ZSBtYXkgYmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nLCB3aXRob3V0XG5cdFx0ICogYW55IHNlcGFyYXRpb24gd2l0aCB0aGUgc2xhc2hlc1xuXHRcdCAqL1xuXHRcdGlmIChhTWF0Y2hlcyA9PT0gbnVsbCkge1xuXHRcdFx0YU1hdGNoZXMgPSB0aGlzLl9ySUFwcFN0YXRlT2xkQXRTdGFydC5leGVjKHNBcHBIYXNoKTtcblx0XHR9XG5cblx0XHRpZiAoYU1hdGNoZXMgPT09IG51bGwpIHtcblx0XHRcdC8vIHRoZXJlIGlzIG5vICh2YWxpZCkgc2FwLWlhcHAtc3RhdGUgaW4gdGhlIEFwcCBIYXNoXG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdHJldHVybiBhTWF0Y2hlc1sxXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXBsYWNlcyAob3IgaW5zZXJ0cykgYSBwYXJhbWV0ZXIgdmFsdWUgKGFuIEFwcFN0YXRlS2V5KSBmb3IgdGhlIHNhcC1pYXBwLXN0YXRlIGludG8gYW4gZXhpc3RpbmcgQXBwSGFzaCBzdHJpbmcuIE90aGVyIHJvdXRlcy9wYXJhbWV0ZXJzXG5cdCAqIGFyZSBpZ25vcmVkIGFuZCByZXR1cm5lZCB3aXRob3V0IG1vZGlmaWNhdGlvbiAoXCJlbnZpcm9ubWVudGFsIGFnbm9zdGljXCIgcHJvcGVydHkpLiBPbmx5IHRoZSBuZXcgYXBwcm9hY2ggKHNhcC1pYXBwLXN0YXRlIGFzIHF1ZXJ5IHBhcmFtZXRlclxuXHQgKiBpbiB0aGUgQXBwSGFzaCkgaXMgYmVpbmcgaXNzdWVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gc0FwcEhhc2ggVGhlIEFwcEhhc2ggaW50byB3aGljaCB0aGUgc2FwLWlhcHAtc3RhdGUgcGFyYW1ldGVyIHNoYWxsIGJlIG1hZGUgYXZhaWxhYmxlXG5cdCAqIEBwYXJhbSBzQXBwU3RhdGVLZXkgVGhlIGtleSB2YWx1ZSBvZiB0aGUgQXBwU3RhdGUgd2hpY2ggc2hhbGwgYmUgc3RvcmVkIGFzIHBhcmFtZXRlciB2YWx1ZSBvZiB0aGUgc2FwLWlhcHAtc3RhdGUgcHJvcGVydHkuXG5cdCAqIEByZXR1cm5zIFRoZSBtb2RpZmllZCBzQXBwSGFzaCBzdHJpbmcsIHN1Y2ggdGhhdCB0aGUgc2FwLWlhcHAtc3RhdGUgaGFzIGJlZW4gc2V0IGJhc2VkIG9uIHRoZSBuZXcgKHF1ZXJ5IG9wdGlvbi1iYXNlZClcblx0ICogICAgICAgICBzYXAtaWFwcC1zdGF0ZS4gSWYgYSBzYXAtaWFwcC1zdGF0ZSBoYXMgYmVlbiBzcGVjaWZpZWQgYmVmb3JlLCB0aGUga2V5IGlzIHJlcGxhY2VkLiBJZiA8Y29kZT5zQXBwSGFzaDwvY29kZT4gd2FzIG9mIHRoZSBvbGRcblx0ICogICAgICAgICBmb3JtYXQgKHNhcC1pYXBwLXN0YXRlIGFzIHBhcnQgb2YgdGhlIGtleXMvcm91dGUpLCB0aGUgZm9ybWF0IGlzIGNvbnZlcnRlZCB0byB0aGUgbmV3IGZvcm1hdCBiZWZvcmUgdGhlIHJlc3VsdCBpcyByZXR1cm5lZC5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9yZXBsYWNlSW5uZXJBcHBTdGF0ZUtleShzQXBwSGFzaDogc3RyaW5nLCBzQXBwU3RhdGVLZXk6IHN0cmluZykge1xuXHRcdGNvbnN0IHNOZXdJQXBwU3RhdGUgPSBJQVBQX1NUQVRFICsgXCI9XCIgKyBzQXBwU3RhdGVLZXk7XG5cblx0XHQvKlxuXHRcdCAqIGdlbmVyYXRlIHNhcC1pYXBwLXN0YXRlcyB3aXRoIHRoZSBuZXcgd2F5XG5cdFx0ICovXG5cdFx0aWYgKCFzQXBwSGFzaCkge1xuXHRcdFx0Ly8gdGhlcmUncyBubyBzQXBwSGFzaCBrZXkgeWV0XG5cdFx0XHRyZXR1cm4gXCI/XCIgKyBzTmV3SUFwcFN0YXRlO1xuXHRcdH1cblxuXHRcdGNvbnN0IGZuQXBwZW5kVG9RdWVyeVBhcmFtZXRlciA9IGZ1bmN0aW9uIChzU3ViQXBwSGFzaDogYW55KSB7XG5cdFx0XHQvLyB0aGVyZSBpcyBhbiBBcHBIYXNoIGF2YWlsYWJsZSwgYnV0IGl0IGRvZXMgbm90IGNvbnRhaW4gYSBzYXAtaWFwcC1zdGF0ZSBwYXJhbWV0ZXIgeWV0IC0gd2UgbmVlZCB0byBhcHBlbmQgb25lXG5cblx0XHRcdC8vIG5ldyBhcHByb2FjaDogd2UgbmVlZCB0byBjaGVjaywgaWYgYSBzZXQgb2YgcXVlcnkgcGFyYW1ldGVycyBpcyBhbHJlYWR5IGF2YWlsYWJsZVxuXHRcdFx0aWYgKHNTdWJBcHBIYXNoLmluZGV4T2YoXCI/XCIpICE9PSAtMSkge1xuXHRcdFx0XHQvLyB0aGVyZSBhcmUgYWxyZWFkeSBxdWVyeSBwYXJhbWV0ZXJzIGF2YWlsYWJsZSAtIGFwcGVuZCBpdCBhcyBhbm90aGVyIHBhcmFtZXRlclxuXHRcdFx0XHRyZXR1cm4gc1N1YkFwcEhhc2ggKyBcIiZcIiArIHNOZXdJQXBwU3RhdGU7XG5cdFx0XHR9XG5cdFx0XHQvLyB0aGVyZSBhcmUgbm8gYSBxdWVyeSBwYXJhbWV0ZXJzIGF2YWlsYWJsZSB5ZXQ7IGNyZWF0ZSBhIHNldCB3aXRoIGEgc2luZ2xlIHBhcmFtZXRlclxuXHRcdFx0cmV0dXJuIHNTdWJBcHBIYXNoICsgXCI/XCIgKyBzTmV3SUFwcFN0YXRlO1xuXHRcdH07XG5cblx0XHRpZiAoIXRoaXMuX2dldElubmVyQXBwU3RhdGVLZXkoc0FwcEhhc2gpKSB7XG5cdFx0XHRyZXR1cm4gZm5BcHBlbmRUb1F1ZXJ5UGFyYW1ldGVyKHNBcHBIYXNoKTtcblx0XHR9XG5cdFx0Ly8gVGhlcmUgaXMgYW4gQXBwSGFzaCBhdmFpbGFibGUgYW5kIHRoZXJlIGlzIGFscmVhZHkgYW4gc2FwLWlhcHAtc3RhdGUgaW4gdGhlIEFwcEhhc2hcblxuXHRcdGlmICh0aGlzLl9ySUFwcFN0YXRlTmV3LnRlc3Qoc0FwcEhhc2gpKSB7XG5cdFx0XHQvLyB0aGUgbmV3IGFwcHJvYWNoIGlzIGJlaW5nIHVzZWRcblx0XHRcdHJldHVybiBzQXBwSGFzaC5yZXBsYWNlKHRoaXMuX3JJQXBwU3RhdGVOZXcsIGZ1bmN0aW9uIChzTmVlZGxlOiBzdHJpbmcpIHtcblx0XHRcdFx0cmV0dXJuIHNOZWVkbGUucmVwbGFjZSgvWz1dLiovZ2ksIFwiPVwiICsgc0FwcFN0YXRlS2V5KTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdC8vIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBvbGQgQXBwSGFzaCBlbnRpcmVseSBhbmQgcmVwbGFjZSBpdCB3aXRoIGEgbmV3IG9uZS5cblxuXHRcdGNvbnN0IGZuUmVwbGFjZU9sZEFwcHJvYWNoID0gZnVuY3Rpb24gKHJPbGRBcHByb2FjaDogYW55LCBzU3ViQXBwSGFzaDogYW55KSB7XG5cdFx0XHRzU3ViQXBwSGFzaCA9IHNTdWJBcHBIYXNoLnJlcGxhY2Uock9sZEFwcHJvYWNoLCBcIlwiKTtcblx0XHRcdHJldHVybiBmbkFwcGVuZFRvUXVlcnlQYXJhbWV0ZXIoc1N1YkFwcEhhc2gpO1xuXHRcdH07XG5cblx0XHRpZiAodGhpcy5fcklBcHBTdGF0ZU9sZC50ZXN0KHNBcHBIYXNoKSkge1xuXHRcdFx0cmV0dXJuIGZuUmVwbGFjZU9sZEFwcHJvYWNoKHRoaXMuX3JJQXBwU3RhdGVPbGQsIHNBcHBIYXNoKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5fcklBcHBTdGF0ZU9sZEF0U3RhcnQudGVzdChzQXBwSGFzaCkpIHtcblx0XHRcdHJldHVybiBmblJlcGxhY2VPbGRBcHByb2FjaCh0aGlzLl9ySUFwcFN0YXRlT2xkQXRTdGFydCwgc0FwcEhhc2gpO1xuXHRcdH1cblxuXHRcdGFzc2VydChmYWxzZSwgXCJpbnRlcm5hbCBpbmNvbnNpc3RlbmN5OiBBcHByb2FjaCBvZiBzYXAtaWFwcC1zdGF0ZSBub3Qga25vd24sIGJ1dCBfZ2V0SW5uZXJBcHBTdGF0ZUtleSByZXR1cm5lZCBpdFwiKTtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0X2dldFVSTFBhcmFtZXRlcnNGcm9tU2VsZWN0aW9uVmFyaWFudCh2U2VsZWN0aW9uVmFyaWFudDogYW55KSB7XG5cdFx0Y29uc3QgbVVSTFBhcmFtZXRlcnM6IGFueSA9IHt9O1xuXHRcdGxldCBpID0gMDtcblx0XHRsZXQgb1NlbGVjdGlvblZhcmlhbnQ7XG5cblx0XHRpZiAodHlwZW9mIHZTZWxlY3Rpb25WYXJpYW50ID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRvU2VsZWN0aW9uVmFyaWFudCA9IG5ldyBTZWxlY3Rpb25WYXJpYW50KHZTZWxlY3Rpb25WYXJpYW50KTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2U2VsZWN0aW9uVmFyaWFudCA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0b1NlbGVjdGlvblZhcmlhbnQgPSB2U2VsZWN0aW9uVmFyaWFudDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9JTlBVVFwiKTtcblx0XHR9XG5cblx0XHQvLyBhZGQgVVJMcyBwYXJhbWV0ZXJzIGZyb20gU2VsZWN0aW9uVmFyaWFudC5TZWxlY3RPcHRpb25zIChpZiBzaW5nbGUgdmFsdWUpXG5cdFx0Y29uc3QgYVNlbGVjdFByb3BlcnRpZXMgPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcygpO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBhU2VsZWN0UHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3QgYVNlbGVjdE9wdGlvbnMgPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRTZWxlY3RPcHRpb24oYVNlbGVjdFByb3BlcnRpZXNbaV0pO1xuXHRcdFx0aWYgKGFTZWxlY3RPcHRpb25zLmxlbmd0aCA9PT0gMSAmJiBhU2VsZWN0T3B0aW9uc1swXS5TaWduID09PSBcIklcIiAmJiBhU2VsZWN0T3B0aW9uc1swXS5PcHRpb24gPT09IFwiRVFcIikge1xuXHRcdFx0XHRtVVJMUGFyYW1ldGVyc1thU2VsZWN0UHJvcGVydGllc1tpXV0gPSBhU2VsZWN0T3B0aW9uc1swXS5Mb3c7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gYWRkIHBhcmFtZXRlcnMgZnJvbSBTZWxlY3Rpb25WYXJpYW50LlBhcmFtZXRlcnNcblx0XHRjb25zdCBhUGFyYW1ldGVyTmFtZXMgPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRQYXJhbWV0ZXJOYW1lcygpO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBhUGFyYW1ldGVyTmFtZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IHNQYXJhbWV0ZXJWYWx1ZSA9IG9TZWxlY3Rpb25WYXJpYW50LmdldFBhcmFtZXRlcihhUGFyYW1ldGVyTmFtZXNbaV0pO1xuXG5cdFx0XHRtVVJMUGFyYW1ldGVyc1thUGFyYW1ldGVyTmFtZXNbaV1dID0gc1BhcmFtZXRlclZhbHVlO1xuXHRcdH1cblx0XHRyZXR1cm4gbVVSTFBhcmFtZXRlcnM7XG5cdH1cblxuXHRfY3JlYXRlVGVjaG5pY2FsRXJyb3Ioc0Vycm9yQ29kZTogYW55KSB7XG5cdFx0cmV0dXJuIG5ldyBOYXZFcnJvcihzRXJyb3JDb2RlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBtb2RlbCB0aGF0IGlzIHVzZWQgZm9yIHZlcmlmaWNhdGlvbiBvZiBzZW5zaXRpdmUgaW5mb3JtYXRpb24uIElmIHRoZSBtb2RlbCBpcyBub3Qgc2V0LCB0aGUgdW5uYW1lZCBjb21wb25lbnQgbW9kZWwgaXMgdXNlZCBmb3IgdGhlXG5cdCAqIHZlcmlmaWNhdGlvbiBvZiBzZW5zaXRpdmUgaW5mb3JtYXRpb24uXG5cdCAqXG5cdCAqIEBwdWJsaWNcblx0ICogQHBhcmFtIG9Nb2RlbCBGb3IgY2hlY2tpbmcgc2Vuc2l0aXZlIGluZm9ybWF0aW9uXG5cdCAqL1xuXHRzZXRNb2RlbChvTW9kZWw6IFYyT0RhdGFNb2RlbCB8IFY0T0RhdGFNb2RlbCkge1xuXHRcdHRoaXMuX29Nb2RlbCA9IG9Nb2RlbDtcblx0fVxuXG5cdF9nZXRNb2RlbCgpOiBWMk9EYXRhTW9kZWwgfCBWNE9EYXRhTW9kZWwge1xuXHRcdHJldHVybiB0aGlzLl9vTW9kZWwgfHwgdGhpcy5vQ29tcG9uZW50LmdldE1vZGVsKCk7XG5cdH1cblxuXHRfcmVtb3ZlQWxsUHJvcGVydGllcyhvRGF0YTogYW55KSB7XG5cdFx0aWYgKG9EYXRhKSB7XG5cdFx0XHRpZiAob0RhdGEuc2VsZWN0aW9uVmFyaWFudCkge1xuXHRcdFx0XHRvRGF0YS5zZWxlY3Rpb25WYXJpYW50ID0gbnVsbDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG9EYXRhLnZhbHVlVGV4dHMpIHtcblx0XHRcdFx0b0RhdGEudmFsdWVUZXh0cyA9IG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvRGF0YS5zZW1hbnRpY0RhdGVzKSB7XG5cdFx0XHRcdG9EYXRhLnNlbWFudGljRGF0ZXMgPSBudWxsO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdF9yZW1vdmVQcm9wZXJ0aWVzKGFGaWx0ZXJOYW1lOiBhbnksIGFQYXJhbWV0ZXJOYW1lOiBhbnksIG9EYXRhOiBhbnkpIHtcblx0XHRpZiAoYUZpbHRlck5hbWUubGVuZ3RoICYmIG9EYXRhICYmIChvRGF0YS5zZWxlY3Rpb25WYXJpYW50IHx8IG9EYXRhLnZhbHVlVGV4dHMgfHwgb0RhdGEuc2VtYW50aWNEYXRlcykpIHtcblx0XHRcdGFGaWx0ZXJOYW1lLmZvckVhY2goZnVuY3Rpb24gKHNOYW1lOiBhbnkpIHtcblx0XHRcdFx0aWYgKG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuU2VsZWN0T3B0aW9ucykge1xuXHRcdFx0XHRcdG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuU2VsZWN0T3B0aW9ucy5zb21lKGZ1bmN0aW9uIChvVmFsdWU6IGFueSwgbklkeDogYW55KSB7XG5cdFx0XHRcdFx0XHRpZiAoc05hbWUgPT09IG9WYWx1ZS5Qcm9wZXJ0eU5hbWUpIHtcblx0XHRcdFx0XHRcdFx0b0RhdGEuc2VsZWN0aW9uVmFyaWFudC5TZWxlY3RPcHRpb25zLnNwbGljZShuSWR4LCAxKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChvRGF0YS52YWx1ZVRleHRzICYmIG9EYXRhLnZhbHVlVGV4dHMuVGV4dHMpIHtcblx0XHRcdFx0XHRvRGF0YS52YWx1ZVRleHRzLlRleHRzLmZvckVhY2goZnVuY3Rpb24gKG9UZXh0czogYW55KSB7XG5cdFx0XHRcdFx0XHRpZiAob1RleHRzLlByb3BlcnR5VGV4dHMpIHtcblx0XHRcdFx0XHRcdFx0b1RleHRzLlByb3BlcnR5VGV4dHMuc29tZShmdW5jdGlvbiAob1ZhbHVlOiBhbnksIG5JZHg6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChzTmFtZSA9PT0gb1ZhbHVlLlByb3BlcnR5TmFtZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0b1RleHRzLlByb3BlcnR5VGV4dHMuc3BsaWNlKG5JZHgsIDEpO1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChvRGF0YS5zZW1hbnRpY0RhdGVzICYmIG9EYXRhLnNlbWFudGljRGF0ZXMuRGF0ZXMpIHtcblx0XHRcdFx0XHRvRGF0YS5zZW1hbnRpY0RhdGVzLkRhdGVzLmZvckVhY2goZnVuY3Rpb24gKG9EYXRlczogYW55LCBuSWR4OiBhbnkpIHtcblx0XHRcdFx0XHRcdGlmIChzTmFtZSA9PT0gb0RhdGVzLlByb3BlcnR5TmFtZSkge1xuXHRcdFx0XHRcdFx0XHRvRGF0YS5zZW1hbnRpY0RhdGVzLkRhdGVzLnNwbGljZShuSWR4LCAxKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0aWYgKGFQYXJhbWV0ZXJOYW1lLmxlbmd0aCAmJiBvRGF0YSAmJiBvRGF0YS5zZWxlY3Rpb25WYXJpYW50ICYmIG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuUGFyYW1ldGVycykge1xuXHRcdFx0YVBhcmFtZXRlck5hbWUuZm9yRWFjaChmdW5jdGlvbiAoc05hbWU6IGFueSkge1xuXHRcdFx0XHRvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlBhcmFtZXRlcnMuc29tZShmdW5jdGlvbiAob1ZhbHVlOiBhbnksIG5JZHg6IGFueSkge1xuXHRcdFx0XHRcdGlmIChzTmFtZSA9PT0gb1ZhbHVlLlByb3BlcnR5TmFtZSB8fCBcIiRQYXJhbWV0ZXIuXCIgKyBzTmFtZSA9PT0gb1ZhbHVlLlByb3BlcnR5TmFtZSkge1xuXHRcdFx0XHRcdFx0b0RhdGEuc2VsZWN0aW9uVmFyaWFudC5QYXJhbWV0ZXJzLnNwbGljZShuSWR4LCAxKTtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHRfaXNUZXJtVHJ1ZShvUHJvcGVydHk6IGFueSwgc1Rlcm06IGFueSkge1xuXHRcdGNvbnN0IGZJc1Rlcm1EZWZhdWx0VHJ1ZSA9IGZ1bmN0aW9uIChvVGVybTogYW55KSB7XG5cdFx0XHRpZiAob1Rlcm0pIHtcblx0XHRcdFx0cmV0dXJuIG9UZXJtLkJvb2wgPyBvVGVybS5Cb29sICE9PSBcImZhbHNlXCIgOiB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG5cblx0XHRyZXR1cm4gISFvUHJvcGVydHlbc1Rlcm1dICYmIGZJc1Rlcm1EZWZhdWx0VHJ1ZShvUHJvcGVydHlbc1Rlcm1dKTtcblx0fVxuXG5cdF9pc0V4Y2x1ZGVkRnJvbU5hdmlnYXRpb25Db250ZXh0KG9Qcm9wZXJ0eTogYW55KSB7XG5cdFx0cmV0dXJuIHRoaXMuX2lzVGVybVRydWUob1Byb3BlcnR5LCBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkV4Y2x1ZGVGcm9tTmF2aWdhdGlvbkNvbnRleHRcIik7XG5cdH1cblxuXHRfaXNQb3RlbnRpYWxseVNlbnNpdGl2ZShvUHJvcGVydHk6IGFueSkge1xuXHRcdHJldHVybiB0aGlzLl9pc1Rlcm1UcnVlKG9Qcm9wZXJ0eSwgXCJjb20uc2FwLnZvY2FidWxhcmllcy5QZXJzb25hbERhdGEudjEuSXNQb3RlbnRpYWxseVNlbnNpdGl2ZVwiKTtcblx0fVxuXG5cdF9pc01lYXN1cmVQcm9wZXJ0eShvUHJvcGVydHk6IGFueSkge1xuXHRcdHJldHVybiB0aGlzLl9pc1Rlcm1UcnVlKG9Qcm9wZXJ0eSwgXCJjb20uc2FwLnZvY2FidWxhcmllcy5BbmFseXRpY3MudjEuTWVhc3VyZVwiKTtcblx0fVxuXG5cdF9pc1RvQmVFeGNsdWRlZChvUHJvcGVydHk6IGFueSkge1xuXHRcdHJldHVybiB0aGlzLl9pc1BvdGVudGlhbGx5U2Vuc2l0aXZlKG9Qcm9wZXJ0eSkgfHwgdGhpcy5faXNFeGNsdWRlZEZyb21OYXZpZ2F0aW9uQ29udGV4dChvUHJvcGVydHkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBtZXRob2QgY3JlYXRlcyBhIGNvbnRleHQgdXJsIGJhc2VkIG9uIHByb3ZpZGVkIGRhdGEuIFRoaXMgY29udGV4dCB1cmwgY2FuIGVpdGhlciBiZSB1c2VkIGFzXG5cdCAqIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5OYXZpZ2F0aW9uSGFuZGxlciNzZXRQYXJhbWV0ZXJDb250ZXh0VXJsIFBhcmFtZXRlckNvbnRleHRVcmx9IG9yXG5cdCAqIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5OYXZpZ2F0aW9uSGFuZGxlciNzZXRGaWx0ZXJDb250ZXh0VXJsIEZpbHRlckNvbnRleHRVcmx9LlxuXHQgKlxuXHQgKiBAcGFyYW0gc0VudGl0eVNldE5hbWUgVXNlZCBmb3IgdXJsIGRldGVybWluYXRpb25cblx0ICogQHBhcmFtIFtvTW9kZWxdIFVzZWQgZm9yIHVybCBkZXRlcm1pbmF0aW9uLiBJZiBvbWl0dGVkLCB0aGUgTmF2aWdhdGlvbkhhbmRsZXIgbW9kZWwgaXMgdXNlZC5cblx0ICogQHRocm93cyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uTmF2RXJyb3J9IGluIGNhc2Ugb2YgbWlzc2luZyBvciB3cm9uZyBwYXNzZWQgcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBUaGUgY29udGV4dCB1cmwgZm9yIHRoZSBnaXZlbiBlbnRpdGllc1xuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRjb25zdHJ1Y3RDb250ZXh0VXJsKHNFbnRpdHlTZXROYW1lOiBzdHJpbmcsIG9Nb2RlbD86IFYyT0RhdGFNb2RlbCB8IFY0T0RhdGFNb2RlbCk6IHN0cmluZyB7XG5cdFx0aWYgKCFzRW50aXR5U2V0TmFtZSkge1xuXHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuTk9fRU5USVRZX1NFVF9QUk9WSURFRFwiKTtcblx0XHR9XG5cblx0XHRpZiAob01vZGVsID09PSB1bmRlZmluZWQpIHtcblx0XHRcdG9Nb2RlbCA9IHRoaXMuX2dldE1vZGVsKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuX2NvbnN0cnVjdENvbnRleHRVcmwob01vZGVsKSArIFwiI1wiICsgc0VudGl0eVNldE5hbWU7XG5cdH1cblxuXHRfY29uc3RydWN0Q29udGV4dFVybChvTW9kZWw6IFYyT0RhdGFNb2RlbCB8IFY0T0RhdGFNb2RlbCk6IHN0cmluZyB7XG5cdFx0bGV0IHNTZXJ2ZXJVcmw7XG5cblx0XHRpZiAob01vZGVsLmlzQTxWMk9EYXRhTW9kZWw+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnYyLk9EYXRhTW9kZWxcIikpIHtcblx0XHRcdHNTZXJ2ZXJVcmwgPSBvTW9kZWwuX2dldFNlcnZlclVybCgpO1xuXHRcdH0gZWxzZSBpZiAob01vZGVsLmlzQTxWNE9EYXRhTW9kZWw+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWxcIikpIHtcblx0XHRcdGNvbnN0IG9TZXJ2aWNlVVJJID0gbmV3IFVSSShvTW9kZWwuZ2V0U2VydmljZVVybCgpKS5hYnNvbHV0ZVRvKGRvY3VtZW50LmJhc2VVUkkpO1xuXHRcdFx0c1NlcnZlclVybCA9IG5ldyBVUkkoXCIvXCIpLmFic29sdXRlVG8ob1NlcnZpY2VVUkkpLnRvU3RyaW5nKCk7XG5cdFx0fVxuXG5cdFx0aWYgKHNTZXJ2ZXJVcmwgJiYgc1NlcnZlclVybC5sYXN0SW5kZXhPZihcIi9cIikgPT09IHNTZXJ2ZXJVcmwubGVuZ3RoIC0gMSkge1xuXHRcdFx0c1NlcnZlclVybCA9IHNTZXJ2ZXJVcmwuc3Vic3RyKDAsIHNTZXJ2ZXJVcmwubGVuZ3RoIC0gMSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHNTZXJ2ZXJVcmwgKyBvTW9kZWwuc1NlcnZpY2VVcmwgKyBcIi8kbWV0YWRhdGFcIjtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgbWV0aG9kIHZlcmlmaWVzLCBpZiBhbnkgb2YgdGhlIHBhc3NlZCBwYXJhbWV0ZXJzL2ZpbHRlcnMgYXJlIG1hcmtlZCBhcyBzZW5zaXRpdmUsIGFuZCBpZiB0aGlzIGlzIHRoZSBjYXNlIHJlbW92ZSB0aG9zZSBmcm9tIHRoZSBhcHBcblx0ICogZGF0YS4gPGI+Tm90ZTo8L2I+IFRvIHVzZSB0aGlzIG1ldGhvZCwgdGhlIG1ldGFkYXRhIG11c3QgYmUgbG9hZGVkIGZpcnN0LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0RhdGEgV2l0aCBwb3RlbnRpYWwgc2Vuc2l0aXZlIGluZm9ybWF0aW9uIChmb3IgT0RhdGEsIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uIHVzaW5nXG5cdCAqIDxjb2RlPm9TZWxlY3Rpb25WYXJpYW50LnRvSlNPTk9iamVjdCgpPC9jb2RlPiBtdXN0IGJlIHVzZWQpLCB3aXRoIHRoZSA8Y29kZT5GaWx0ZXJDb250ZXh0VXJsPC9jb2RlPiBvclxuXHQgKiA8Y29kZT5QYXJhbWV0ZXJDb250ZXh0VXJsPC9jb2RlPiBwcm9wZXJ0eS5cblx0ICogQHJldHVybnMgRGF0YSB3aXRob3V0IHByb3BlcnRpZXMgbWFya2VkIGFzIHNlbnNpdGl2ZSBvciBhbiBlbXB0eSBvYmplY3QgaWYgdGhlIE9EYXRhIG1ldGFkYXRhIGlzIG5vdCBmdWxseSBsb2FkZWQgeWV0XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfY2hlY2tJc1BvdGVudGlhbGx5U2Vuc2l0aXZlKG9EYXRhOiBhbnkpIHtcblx0XHRsZXQgb0FkYXB0ZWREYXRhID0gb0RhdGE7XG5cdFx0aWYgKFxuXHRcdFx0b0RhdGEgJiZcblx0XHRcdG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgJiZcblx0XHRcdCgob0RhdGEuc2VsZWN0aW9uVmFyaWFudC5GaWx0ZXJDb250ZXh0VXJsICYmIG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuU2VsZWN0T3B0aW9ucykgfHxcblx0XHRcdFx0KG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuUGFyYW1ldGVyQ29udGV4dFVybCAmJiBvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlBhcmFtZXRlcnMpKVxuXHRcdCkge1xuXHRcdFx0Y29uc3Qgb01vZGVsID0gdGhpcy5fZ2V0TW9kZWwoKTtcblx0XHRcdGlmICh0aGlzLm9Db21wb25lbnQgJiYgb01vZGVsICYmIG9Nb2RlbC5pc0E8VjJPRGF0YU1vZGVsPihcInNhcC51aS5tb2RlbC5vZGF0YS52Mi5PRGF0YU1vZGVsXCIpKSB7XG5cdFx0XHRcdGNvbnN0IGFTZW5zaXRpdmVGaWx0ZXJOYW1lID0gW107XG5cdFx0XHRcdGNvbnN0IGFTZW5zaXRpdmVQYXJhbWV0ZXJOYW1lID0gW107XG5cdFx0XHRcdGxldCBpLFxuXHRcdFx0XHRcdG9FbnRpdHlTZXQ6IGFueSxcblx0XHRcdFx0XHRvRW50aXR5RGVmOiBhbnksXG5cdFx0XHRcdFx0b1N1YkVudGl0eURlZjogYW55LFxuXHRcdFx0XHRcdG9FbmRSb2xlOiBhbnksXG5cdFx0XHRcdFx0YUZpbHRlckNvbnRleHRQYXJ0ID0gW10sXG5cdFx0XHRcdFx0YVBhcmFtQ29udGV4dFBhcnQgPSBbXTtcblxuXHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRpZiAob01vZGVsLmdldFNlcnZpY2VNZXRhZGF0YSgpICYmIG9NZXRhTW9kZWw/Lm9Nb2RlbCkge1xuXHRcdFx0XHRcdGlmIChvRGF0YS5zZWxlY3Rpb25WYXJpYW50LkZpbHRlckNvbnRleHRVcmwpIHtcblx0XHRcdFx0XHRcdGFGaWx0ZXJDb250ZXh0UGFydCA9IG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuRmlsdGVyQ29udGV4dFVybC5zcGxpdChcIiNcIik7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0YUZpbHRlckNvbnRleHRQYXJ0Lmxlbmd0aCA9PT0gMiAmJlxuXHRcdFx0XHRcdFx0b0RhdGEuc2VsZWN0aW9uVmFyaWFudC5TZWxlY3RPcHRpb25zICYmXG5cdFx0XHRcdFx0XHR0aGlzLl9jb25zdHJ1Y3RDb250ZXh0VXJsKG9Nb2RlbCkuaW5kZXhPZihhRmlsdGVyQ29udGV4dFBhcnRbMF0pID09PSAwXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRvRW50aXR5U2V0ID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVNldChhRmlsdGVyQ29udGV4dFBhcnRbMV0pO1xuXHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlTZXQpIHtcblx0XHRcdFx0XHRcdFx0b0VudGl0eURlZiA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlUeXBlKG9FbnRpdHlTZXQuZW50aXR5VHlwZSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRvRW50aXR5RGVmID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVR5cGUoYUZpbHRlckNvbnRleHRQYXJ0WzFdKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlEZWYpIHtcblx0XHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlEZWYgJiYgb0VudGl0eURlZi5wcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBvRW50aXR5RGVmLnByb3BlcnR5Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5faXNUb0JlRXhjbHVkZWQob0VudGl0eURlZi5wcm9wZXJ0eVtpXSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0YVNlbnNpdGl2ZUZpbHRlck5hbWUucHVzaChvRW50aXR5RGVmLnByb3BlcnR5W2ldLm5hbWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmIChvRW50aXR5RGVmLm5hdmlnYXRpb25Qcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBvRW50aXR5RGVmLm5hdmlnYXRpb25Qcm9wZXJ0eS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0b0VuZFJvbGUgPSBvTWV0YU1vZGVsLmdldE9EYXRhQXNzb2NpYXRpb25FbmQob0VudGl0eURlZiwgb0VudGl0eURlZi5uYXZpZ2F0aW9uUHJvcGVydHlbaV0ubmFtZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIW9FbmRSb2xlIHx8IG9FbmRSb2xlLnR5cGUgPT09IG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuRmlsdGVyQ29udGV4dFVybCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdC8vIGNoZWNrIGlmIHRoZSBlbmQgcm9sZSBoYXMgY2FyZGluYWxpdHkgMC4uMSBvciAxXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAob0VuZFJvbGUubXVsdGlwbGljaXR5ID09PSBcIjFcIiB8fCBvRW5kUm9sZS5tdWx0aXBsaWNpdHkgPT09IFwiMC4uMVwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9TdWJFbnRpdHlEZWYgPSBvTWV0YU1vZGVsLmdldE9EYXRhRW50aXR5VHlwZShvRW5kUm9sZS50eXBlKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9TdWJFbnRpdHlEZWYgJiYgb1N1YkVudGl0eURlZi5wcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgb1N1YkVudGl0eURlZi5wcm9wZXJ0eS5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuX2lzVG9CZUV4Y2x1ZGVkKG9TdWJFbnRpdHlEZWYucHJvcGVydHlbal0pKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFTZW5zaXRpdmVGaWx0ZXJOYW1lLnB1c2goXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0VudGl0eURlZi5uYXZpZ2F0aW9uUHJvcGVydHlbaV0ubmFtZSArIFwiLlwiICsgb1N1YkVudGl0eURlZi5wcm9wZXJ0eVtqXS5uYW1lXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuUGFyYW1ldGVyQ29udGV4dFVybCkge1xuXHRcdFx0XHRcdFx0YVBhcmFtQ29udGV4dFBhcnQgPSBvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlBhcmFtZXRlckNvbnRleHRVcmwuc3BsaXQoXCIjXCIpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdGFQYXJhbUNvbnRleHRQYXJ0Lmxlbmd0aCA9PT0gMiAmJlxuXHRcdFx0XHRcdFx0b0RhdGEuc2VsZWN0aW9uVmFyaWFudC5QYXJhbWV0ZXJzICYmXG5cdFx0XHRcdFx0XHR0aGlzLl9jb25zdHJ1Y3RDb250ZXh0VXJsKG9Nb2RlbCkuaW5kZXhPZihhUGFyYW1Db250ZXh0UGFydFswXSkgPT09IDBcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdG9FbnRpdHlTZXQgPSBvTWV0YU1vZGVsLmdldE9EYXRhRW50aXR5U2V0KGFQYXJhbUNvbnRleHRQYXJ0WzFdKTtcblx0XHRcdFx0XHRcdGlmIChvRW50aXR5U2V0KSB7XG5cdFx0XHRcdFx0XHRcdG9FbnRpdHlEZWYgPSBvTWV0YU1vZGVsLmdldE9EYXRhRW50aXR5VHlwZShvRW50aXR5U2V0LmVudGl0eVR5cGUpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0b0VudGl0eURlZiA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlUeXBlKGFGaWx0ZXJDb250ZXh0UGFydFsxXSk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChvRW50aXR5RGVmKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChvRW50aXR5RGVmLnByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IG9FbnRpdHlEZWYucHJvcGVydHkubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmICh0aGlzLl9pc1RvQmVFeGNsdWRlZChvRW50aXR5RGVmLnByb3BlcnR5W2ldKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRhU2Vuc2l0aXZlUGFyYW1ldGVyTmFtZS5wdXNoKG9FbnRpdHlEZWYucHJvcGVydHlbaV0ubmFtZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGFTZW5zaXRpdmVGaWx0ZXJOYW1lLmxlbmd0aCB8fCBhU2Vuc2l0aXZlUGFyYW1ldGVyTmFtZS5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdG9BZGFwdGVkRGF0YSA9IGV4dGVuZCh0cnVlIGFzIGFueSwge30sIG9BZGFwdGVkRGF0YSk7XG5cblx0XHRcdFx0XHRcdHRoaXMuX3JlbW92ZVByb3BlcnRpZXMoYVNlbnNpdGl2ZUZpbHRlck5hbWUsIGFTZW5zaXRpdmVQYXJhbWV0ZXJOYW1lLCBvQWRhcHRlZERhdGEpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBhbm5vdGF0aW9ucyBhcmUgbm90IGxvYWRlZFxuXG5cdFx0XHRcdFx0dGhpcy5fcmVtb3ZlQWxsUHJvcGVydGllcyhvQWRhcHRlZERhdGEpO1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyOiBvTWV0YWRhdGEgYXJlIG5vdCBmdWxseSBsb2FkZWQhXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMub0NvbXBvbmVudCAmJiBvTW9kZWwgJiYgb01vZGVsLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsXCIpKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9yZW1vdmVTZW5zaXRpdmVEYXRhRm9yT0RhdGFWNChvQWRhcHRlZERhdGEpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBvQWRhcHRlZERhdGE7XG5cdH1cblxuXHRfcmVtb3ZlTWVhc3VyZUJhc2VkSW5mb3JtYXRpb24ob0FwcERhdGE6IGFueSkge1xuXHRcdGxldCBvQXBwRGF0YUZvclNhdmUgPSBvQXBwRGF0YTtcblxuXHRcdGlmIChvQXBwRGF0YS5zZWxlY3Rpb25WYXJpYW50KSB7XG5cdFx0XHQvKlxuXHRcdFx0ICogVGhlIHNwZWNpZmljYXRpb24gc3RhdGVzIHRoYXQgU2VsZWN0aW9uIFZhcmlhbnRzIG5lZWQgdG8gYmUgSlNPTiBvYmplY3RzLiBIb3dldmVyLCBpbnRlcm5hbGx5LCB3ZSB3b3JrIHdpdGggc3RyaW5ncyBmb3Jcblx0XHRcdCAqIFwic2VsZWN0aW9uVmFyaWFudFwiLiBUaGVyZWZvcmUsIGluIGNhc2UgdGhhdCB0aGlzIGlzIGEgc3RyaW5nLCB3ZSBuZWVkIHRvIEpTT04tcGFyc2UgdGhlIGRhdGEuXG5cdFx0XHQgKi9cblx0XHRcdGlmICh0eXBlb2Ygb0FwcERhdGEuc2VsZWN0aW9uVmFyaWFudCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdG9BcHBEYXRhRm9yU2F2ZS5zZWxlY3Rpb25WYXJpYW50ID0gSlNPTi5wYXJzZShvQXBwRGF0YS5zZWxlY3Rpb25WYXJpYW50KTtcblx0XHRcdFx0fSBjYXRjaCAoeCkge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyOiBfcmVtb3ZlTWVhc3VyZUJhc2VkSW5mb3JtYXRpb24gcGFyc2UgZXJyb3JcIik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0b0FwcERhdGFGb3JTYXZlID0gdGhpcy5fcmVtb3ZlTWVhc3VyZUJhc2VkUHJvcGVydGllcyhvQXBwRGF0YUZvclNhdmUpO1xuXHRcdH1cblxuXHRcdHJldHVybiBvQXBwRGF0YUZvclNhdmU7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIG1ldGhvZCB2ZXJpZmllcyBpZiBhbnkgb2YgdGhlIHBhc3NlZCBwYXJhbWV0ZXJzL2ZpbHRlcnMgYXJlIG1hcmtlZCBhcyBhIG1lYXN1cmUuIElmIHRoaXMgaXMgdGhlIGNhc2UsIHRoZXkgYXJlIHJlbW92ZWQgZnJvbSB0aGUgeGFwcFxuXHQgKiBhcHAgZGF0YS4gPGI+Tm90ZTo8L2I+IFRvIHVzZSB0aGlzIG1ldGhvZCwgdGhlIG1ldGFkYXRhIG11c3QgYmUgbG9hZGVkIGZpcnN0LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0RhdGEgV2l0aCBwb3RlbnRpYWwgc2Vuc2l0aXZlIGluZm9ybWF0aW9uIChmb3IgT0RhdGEsIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uIHVzaW5nXG5cdCAqIDxjb2RlPm9TZWxlY3Rpb25WYXJpYW50LnRvSlNPTk9iamVjdCgpPC9jb2RlPiBtdXN0IGJlIHVzZWQpLCB3aXRoIHRoZSA8Y29kZT5GaWx0ZXJDb250ZXh0VXJsPC9jb2RlPiBvclxuXHQgKiA8Y29kZT5QYXJhbWV0ZXJDb250ZXh0VXJsPC9jb2RlPiBwcm9wZXJ0eS5cblx0ICogQHJldHVybnMgRGF0YSB3aXRob3V0IHByb3BlcnRpZXMgbWFya2VkIGFzIG1lYXN1cmVzIG9yIGFuIGVtcHR5IG9iamVjdCBpZiB0aGUgT0RhdGEgbWV0YWRhdGEgaXMgbm90IGZ1bGx5IGxvYWRlZCB5ZXRcblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9yZW1vdmVNZWFzdXJlQmFzZWRQcm9wZXJ0aWVzKG9EYXRhOiBhbnkpIHtcblx0XHRsZXQgb0FkYXB0ZWREYXRhID0gb0RhdGE7XG5cdFx0Y29uc3QgYU1lYXN1cmVGaWx0ZXJOYW1lID0gW107XG5cdFx0Y29uc3QgYU1lYXN1cmVQYXJhbWV0ZXJOYW1lID0gW107XG5cdFx0bGV0IGksXG5cdFx0XHRvTW9kZWwsXG5cdFx0XHRvTWV0YU1vZGVsLFxuXHRcdFx0b0VudGl0eVNldDogYW55LFxuXHRcdFx0b0VudGl0eURlZjogYW55LFxuXHRcdFx0b1N1YkVudGl0eURlZjogYW55LFxuXHRcdFx0b0VuZFJvbGU6IGFueSxcblx0XHRcdGFGaWx0ZXJDb250ZXh0UGFydCA9IFtdLFxuXHRcdFx0YVBhcmFtQ29udGV4dFBhcnQgPSBbXTtcblxuXHRcdGlmIChcblx0XHRcdG9EYXRhICYmXG5cdFx0XHRvRGF0YS5zZWxlY3Rpb25WYXJpYW50ICYmXG5cdFx0XHQoKG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuRmlsdGVyQ29udGV4dFVybCAmJiBvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlNlbGVjdE9wdGlvbnMpIHx8XG5cdFx0XHRcdChvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlBhcmFtZXRlckNvbnRleHRVcmwgJiYgb0RhdGEuc2VsZWN0aW9uVmFyaWFudC5QYXJhbWV0ZXJzKSlcblx0XHQpIHtcblx0XHRcdG9Nb2RlbCA9IHRoaXMuX2dldE1vZGVsKCk7XG5cdFx0XHRpZiAodGhpcy5vQ29tcG9uZW50ICYmIG9Nb2RlbCAmJiBvTW9kZWwuaXNBPFYyT0RhdGFNb2RlbD4oXCJzYXAudWkubW9kZWwub2RhdGEudjIuT0RhdGFNb2RlbFwiKSkge1xuXHRcdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRpZiAob01vZGVsLmdldFNlcnZpY2VNZXRhZGF0YSgpICYmIG9NZXRhTW9kZWwgJiYgb01ldGFNb2RlbC5vTW9kZWwpIHtcblx0XHRcdFx0XHRpZiAob0RhdGEuc2VsZWN0aW9uVmFyaWFudC5GaWx0ZXJDb250ZXh0VXJsKSB7XG5cdFx0XHRcdFx0XHRhRmlsdGVyQ29udGV4dFBhcnQgPSBvRGF0YS5zZWxlY3Rpb25WYXJpYW50LkZpbHRlckNvbnRleHRVcmwuc3BsaXQoXCIjXCIpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdGFGaWx0ZXJDb250ZXh0UGFydC5sZW5ndGggPT09IDIgJiZcblx0XHRcdFx0XHRcdG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuU2VsZWN0T3B0aW9ucyAmJlxuXHRcdFx0XHRcdFx0dGhpcy5fY29uc3RydWN0Q29udGV4dFVybChvTW9kZWwpLmluZGV4T2YoYUZpbHRlckNvbnRleHRQYXJ0WzBdKSA9PT0gMFxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0b0VudGl0eVNldCA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlTZXQoYUZpbHRlckNvbnRleHRQYXJ0WzFdKTtcblx0XHRcdFx0XHRcdGlmIChvRW50aXR5U2V0KSB7XG5cdFx0XHRcdFx0XHRcdG9FbnRpdHlEZWYgPSBvTWV0YU1vZGVsLmdldE9EYXRhRW50aXR5VHlwZShvRW50aXR5U2V0LmVudGl0eVR5cGUpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0b0VudGl0eURlZiA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlUeXBlKGFGaWx0ZXJDb250ZXh0UGFydFsxXSk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChvRW50aXR5RGVmKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChvRW50aXR5RGVmICYmIG9FbnRpdHlEZWYucHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgb0VudGl0eURlZi5wcm9wZXJ0eS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuX2lzTWVhc3VyZVByb3BlcnR5KG9FbnRpdHlEZWYucHJvcGVydHlbaV0pKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFNZWFzdXJlRmlsdGVyTmFtZS5wdXNoKG9FbnRpdHlEZWYucHJvcGVydHlbaV0ubmFtZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlEZWYubmF2aWdhdGlvblByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IG9FbnRpdHlEZWYubmF2aWdhdGlvblByb3BlcnR5Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvRW5kUm9sZSA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFBc3NvY2lhdGlvbkVuZChvRW50aXR5RGVmLCBvRW50aXR5RGVmLm5hdmlnYXRpb25Qcm9wZXJ0eVtpXS5uYW1lKTtcblx0XHRcdFx0XHRcdFx0XHRcdGlmICghb0VuZFJvbGUgfHwgb0VuZFJvbGUudHlwZSA9PT0gb0RhdGEuc2VsZWN0aW9uVmFyaWFudC5GaWx0ZXJDb250ZXh0VXJsKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gY2hlY2sgaWYgdGhlIGVuZCByb2xlIGhhcyBjYXJkaW5hbGl0eSAwLi4xIG9yIDFcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChvRW5kUm9sZS5tdWx0aXBsaWNpdHkgPT09IFwiMVwiIHx8IG9FbmRSb2xlLm11bHRpcGxpY2l0eSA9PT0gXCIwLi4xXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0b1N1YkVudGl0eURlZiA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlUeXBlKG9FbmRSb2xlLnR5cGUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob1N1YkVudGl0eURlZiAmJiBvU3ViRW50aXR5RGVmLnByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgaiA9IDA7IGogPCBvU3ViRW50aXR5RGVmLnByb3BlcnR5Lmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5faXNNZWFzdXJlUHJvcGVydHkob1N1YkVudGl0eURlZi5wcm9wZXJ0eVtqXSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YU1lYXN1cmVGaWx0ZXJOYW1lLnB1c2goXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0VudGl0eURlZi5uYXZpZ2F0aW9uUHJvcGVydHlbaV0ubmFtZSArIFwiLlwiICsgb1N1YkVudGl0eURlZi5wcm9wZXJ0eVtqXS5uYW1lXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuUGFyYW1ldGVyQ29udGV4dFVybCkge1xuXHRcdFx0XHRcdFx0YVBhcmFtQ29udGV4dFBhcnQgPSBvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlBhcmFtZXRlckNvbnRleHRVcmwuc3BsaXQoXCIjXCIpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdGFQYXJhbUNvbnRleHRQYXJ0Lmxlbmd0aCA9PT0gMiAmJlxuXHRcdFx0XHRcdFx0b0RhdGEuc2VsZWN0aW9uVmFyaWFudC5QYXJhbWV0ZXJzICYmXG5cdFx0XHRcdFx0XHR0aGlzLl9jb25zdHJ1Y3RDb250ZXh0VXJsKG9Nb2RlbCkuaW5kZXhPZihhUGFyYW1Db250ZXh0UGFydFswXSkgPT09IDBcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdG9FbnRpdHlTZXQgPSBvTWV0YU1vZGVsLmdldE9EYXRhRW50aXR5U2V0KGFQYXJhbUNvbnRleHRQYXJ0WzFdKTtcblx0XHRcdFx0XHRcdGlmIChvRW50aXR5U2V0KSB7XG5cdFx0XHRcdFx0XHRcdG9FbnRpdHlEZWYgPSBvTWV0YU1vZGVsLmdldE9EYXRhRW50aXR5VHlwZShvRW50aXR5U2V0LmVudGl0eVR5cGUpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0b0VudGl0eURlZiA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlUeXBlKGFGaWx0ZXJDb250ZXh0UGFydFsxXSk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChvRW50aXR5RGVmKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChvRW50aXR5RGVmLnByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IG9FbnRpdHlEZWYucHJvcGVydHkubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmICh0aGlzLl9pc01lYXN1cmVQcm9wZXJ0eShvRW50aXR5RGVmLnByb3BlcnR5W2ldKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRhTWVhc3VyZVBhcmFtZXRlck5hbWUucHVzaChvRW50aXR5RGVmLnByb3BlcnR5W2ldLm5hbWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChhTWVhc3VyZUZpbHRlck5hbWUubGVuZ3RoIHx8IGFNZWFzdXJlUGFyYW1ldGVyTmFtZS5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdC8vIFRROiBuZWVkcyBhdHRlbnRpb25cblx0XHRcdFx0XHRcdG9BZGFwdGVkRGF0YSA9IGV4dGVuZCh0cnVlIGFzIGFueSwge30sIG9BZGFwdGVkRGF0YSk7XG5cblx0XHRcdFx0XHRcdHRoaXMuX3JlbW92ZVByb3BlcnRpZXMoYU1lYXN1cmVGaWx0ZXJOYW1lLCBhTWVhc3VyZVBhcmFtZXRlck5hbWUsIG9BZGFwdGVkRGF0YSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIGFubm90YXRpb25zIGFyZSBub3QgbG9hZGVkXG5cblx0XHRcdFx0XHR0aGlzLl9yZW1vdmVBbGxQcm9wZXJ0aWVzKG9BZGFwdGVkRGF0YSk7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXI6IG9NZXRhZGF0YSBhcmUgbm90IGZ1bGx5IGxvYWRlZCFcIik7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAodGhpcy5vQ29tcG9uZW50ICYmIG9Nb2RlbCAmJiBvTW9kZWwuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWxcIikpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX3JlbW92ZVNlbnNpdGl2ZURhdGFGb3JPRGF0YVY0KG9BZGFwdGVkRGF0YSwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvQWRhcHRlZERhdGE7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyBzZW5zaXRpdmUgZGF0YSBmcm9tIHRoZSBuYXZpZ2F0aW9uIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvRGF0YSBTZWxlY3Rpb24gdmFyaWFudFxuXHQgKiBAcGFyYW0gYk1lYXN1cmUgU2hvdWxkIG1lYXN1cmVzIGJlIHJlbW92ZWRcblx0ICogQHJldHVybnMgVGhlIHNlbGVjdGlvbiB2YXJpYW50IGFmdGVyIHNlbnNpdGl2ZSBkYXRhIGhhcyBiZWVuIHJlbW92ZWRcblx0ICovXG5cdF9yZW1vdmVTZW5zaXRpdmVEYXRhRm9yT0RhdGFWNChvRGF0YTogYW55LCBiTWVhc3VyZT86IGJvb2xlYW4pIHtcblx0XHRjb25zdCBvTmF2SGFuZGxlciA9IHRoaXMsXG5cdFx0XHRvU1YgPSBuZXcgU2VsZWN0aW9uVmFyaWFudChvRGF0YS5zZWxlY3Rpb25WYXJpYW50KSxcblx0XHRcdG9Nb2RlbCA9IHRoaXMuX2dldE1vZGVsKCk7XG5cdFx0bGV0IGFGaWx0ZXJDb250ZXh0UGFydDogc3RyaW5nW10gfCB1bmRlZmluZWQ7XG5cblx0XHRpZiAoIW9Nb2RlbC5nZXRNZXRhTW9kZWwoKS5nZXRPYmplY3QoXCIvXCIpKSB7XG5cdFx0XHQvLyBhbm5vdGF0aW9ucyBhcmUgbm90IGxvYWRlZFxuXHRcdFx0dGhpcy5fcmVtb3ZlQWxsUHJvcGVydGllcyhvRGF0YSk7XG5cdFx0XHRMb2cuZXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlcjogb01ldGFkYXRhIGFyZSBub3QgZnVsbHkgbG9hZGVkIVwiKTtcblx0XHRcdHJldHVybiBvRGF0YTtcblx0XHR9XG5cblx0XHRpZiAob0RhdGEuc2VsZWN0aW9uVmFyaWFudC5GaWx0ZXJDb250ZXh0VXJsKSB7XG5cdFx0XHRhRmlsdGVyQ29udGV4dFBhcnQgPSBvRGF0YS5zZWxlY3Rpb25WYXJpYW50LkZpbHRlckNvbnRleHRVcmwuc3BsaXQoXCIjXCIpO1xuXHRcdH1cblxuXHRcdGlmIChcblx0XHRcdGFGaWx0ZXJDb250ZXh0UGFydD8ubGVuZ3RoID09PSAyICYmXG5cdFx0XHRvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlNlbGVjdE9wdGlvbnMgJiZcblx0XHRcdHRoaXMuX2NvbnN0cnVjdENvbnRleHRVcmwob01vZGVsKS5pbmRleE9mKGFGaWx0ZXJDb250ZXh0UGFydFswXSkgPT09IDBcblx0XHQpIHtcblx0XHRcdG9TVi5yZW1vdmVTZWxlY3RPcHRpb24oXCJAb2RhdGEuY29udGV4dFwiKTtcblx0XHRcdG9TVi5yZW1vdmVTZWxlY3RPcHRpb24oXCJAb2RhdGEubWV0YWRhdGFFdGFnXCIpO1xuXHRcdFx0b1NWLnJlbW92ZVNlbGVjdE9wdGlvbihcIlNBUF9fTWVzc2FnZXNcIik7XG5cblx0XHRcdGNvbnN0IHNFbnRpdHlTZXQgPSBhRmlsdGVyQ29udGV4dFBhcnRbMV0sXG5cdFx0XHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0XHRcdGFQcm9wZXJ0eU5hbWVzID0gb1NWLmdldFByb3BlcnR5TmFtZXMoKSB8fCBbXSxcblx0XHRcdFx0Zm5Jc1NlbnNpdGl2ZURhdGEgPSBmdW5jdGlvbiAoc1Byb3A6IGFueSwgZXNOYW1lOiBhbnkpIHtcblx0XHRcdFx0XHRlc05hbWUgPSBlc05hbWUgfHwgc0VudGl0eVNldDtcblx0XHRcdFx0XHRjb25zdCBhUHJvcGVydHlBbm5vdGF0aW9ucyA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KFwiL1wiICsgZXNOYW1lICsgXCIvXCIgKyBzUHJvcCArIFwiQFwiKTtcblx0XHRcdFx0XHRpZiAoYVByb3BlcnR5QW5ub3RhdGlvbnMpIHtcblx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0KGJNZWFzdXJlICYmIGFQcm9wZXJ0eUFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkFuYWx5dGljcy52MS5NZWFzdXJlXCJdKSB8fFxuXHRcdFx0XHRcdFx0XHRvTmF2SGFuZGxlci5fY2hlY2tQcm9wZXJ0eUFubm90YXRpb25zRm9yU2Vuc2l0aXZlRGF0YShhUHJvcGVydHlBbm5vdGF0aW9ucylcblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoYVByb3BlcnR5QW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkZpZWxkQ29udHJvbFwiXSkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvRmllbGRDb250cm9sID0gYVByb3BlcnR5QW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkZpZWxkQ29udHJvbFwiXTtcblx0XHRcdFx0XHRcdFx0aWYgKG9GaWVsZENvbnRyb2xbXCIkRW51bU1lbWJlclwiXSAmJiBvRmllbGRDb250cm9sW1wiJEVudW1NZW1iZXJcIl0uc3BsaXQoXCIvXCIpWzFdID09PSBcIkluYXBwbGljYWJsZVwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRmb3IgKGxldCBrID0gMDsgayA8IGFQcm9wZXJ0eU5hbWVzLmxlbmd0aDsgaysrKSB7XG5cdFx0XHRcdGNvbnN0IHNQcm9wZXJ0eSA9IGFQcm9wZXJ0eU5hbWVzW2tdO1xuXHRcdFx0XHQvLyBwcm9wZXJ0aWVzIG9mIHRoZSBlbnRpdHkgc2V0XG5cdFx0XHRcdGlmIChmbklzU2Vuc2l0aXZlRGF0YShzUHJvcGVydHksIHNFbnRpdHlTZXQpKSB7XG5cdFx0XHRcdFx0b1NWLnJlbW92ZVNlbGVjdE9wdGlvbihzUHJvcGVydHkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRvRGF0YS5zZWxlY3Rpb25WYXJpYW50ID0gb1NWLnRvSlNPTk9iamVjdCgpO1xuXHRcdH1cblx0XHRyZXR1cm4gb0RhdGE7XG5cdH1cblxuXHRfY2hlY2tQcm9wZXJ0eUFubm90YXRpb25zRm9yU2Vuc2l0aXZlRGF0YShhUHJvcGVydHlBbm5vdGF0aW9uczogYW55KSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdGFQcm9wZXJ0eUFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlBlcnNvbmFsRGF0YS52MS5Jc1BvdGVudGlhbGx5U2Vuc2l0aXZlXCJdIHx8XG5cdFx0XHRhUHJvcGVydHlBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5FeGNsdWRlRnJvbU5hdmlnYXRpb25Db250ZXh0XCJdXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIHBhcmFtZXRlciB2YWx1ZSBvZiB0aGUgc2FwLWlhcHAtc3RhdGUgKHRoZSBpbnRlcm5hbCBhcHBzKSBmcm9tIHRoZSBBcHBIYXNoIHN0cmluZy4gSXQgYXV0b21hdGljYWxseSB0YWtlcyBjYXJlIGFib3V0XG5cdCAqIGNvbXBhdGliaWxpdHkgYmV0d2VlbiB0aGUgb2xkIGFuZCB0aGUgbmV3IGFwcHJvYWNoIG9mIHRoZSBzYXAtaWFwcC1zdGF0ZS4gUHJlY2VkZW5jZSBpcyB0aGF0IHRoZSBuZXcgYXBwcm9hY2ggaXMgZmF2b3VyZWQgYWdhaW5zdCB0aGUgb2xkXG5cdCAqIGFwcHJvYWNoLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgdmFsdWUgb2Ygc2FwLWlhcHAtc3RhdGUgKGkuZS4gdGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5lciB0byByZXRyaWV2ZSB0aGUgcGFyYW1ldGVycyksIG9yIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4gaW5cblx0ICogICAgICAgICBjYXNlIHRoYXQgbm8gc2FwLWlhcHAtc3RhdGUgd2FzIGZvdW5kIGluIDxjb2RlPnNBcHBIYXNoPC9jb2RlPi5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdGdldElBcHBTdGF0ZUtleSgpIHtcblx0XHRjb25zdCBzQXBwSGFzaCA9IEhhc2hDaGFuZ2VyLmdldEluc3RhbmNlKCkuZ2V0SGFzaCgpO1xuXHRcdHJldHVybiB0aGlzLl9nZXRJbm5lckFwcFN0YXRlS2V5KHNBcHBIYXNoKTtcblx0fVxufVxuXG4vLyBFeHBvcnRpbmcgdGhlIGNsYXNzIGFzIHByb3Blcmx5IHR5cGVkIFVJNUNsYXNzXG5cbmNvbnN0IE5hdmlnYXRpb25IYW5kbGVyVUk1Q2xhc3MgPSBCYXNlT2JqZWN0LmV4dGVuZChcblx0XCJzYXAuZmUubmF2aWdhdGlvbi5OYXZpZ2F0aW9uSGFuZGxlclwiLFxuXHROYXZpZ2F0aW9uSGFuZGxlci5wcm90b3R5cGUgYXMgYW55XG4pIGFzIHR5cGVvZiBOYXZpZ2F0aW9uSGFuZGxlcjtcbnR5cGUgTmF2aWdhdGlvbkhhbmRsZXJVSTVDbGFzcyA9IEluc3RhbmNlVHlwZTx0eXBlb2YgTmF2aWdhdGlvbkhhbmRsZXI+O1xuZXhwb3J0IGRlZmF1bHQgTmF2aWdhdGlvbkhhbmRsZXJVSTVDbGFzcztcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7OztFQXVEQTtFQUNBLE1BQU1BLE9BQU8sR0FBR0MsVUFBVSxDQUFDRCxPQUFPO0VBQ2xDLE1BQU1FLGlCQUFpQixHQUFHRCxVQUFVLENBQUNDLGlCQUFpQjtFQUN0RCxNQUFNQyxtQkFBbUIsR0FBR0YsVUFBVSxDQUFDRSxtQkFBbUI7RUFDMUQsTUFBTUMsSUFBSSxHQUFHSCxVQUFVLENBQUNHLElBQUk7RUFFNUIsTUFBTUMsVUFBVSxHQUFHLGdCQUFnQjtFQUNuQyxNQUFNQyw0QkFBNEIsR0FBRyxvQ0FBb0M7RUFDekUsTUFBTUMscUJBQXFCLEdBQUcsc0JBQXNCOztFQUVwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQXJCQSxJQXNCYUMsaUJBQWlCO0lBQUE7SUFXN0I7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
|
|
2255
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJOYXZUeXBlIiwiTmF2TGlicmFyeSIsIlBhcmFtSGFuZGxpbmdNb2RlIiwiU3VwcHJlc3Npb25CZWhhdmlvciIsIk1vZGUiLCJJQVBQX1NUQVRFIiwiREVGQVVMVEVEX1BBUkFNRVRFUl9QUk9QRVJUWSIsIkhZQlJJRF9JQVBQX1NUQVRFX0tFWSIsIk5hdmlnYXRpb25IYW5kbGVyIiwib0NvbnRyb2xsZXIiLCJzTW9kZSIsInNQYXJhbUhhbmRsaW5nTW9kZSIsIl9hVGVjaG5pY2FsUGFyYW1hdGVycyIsIl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhIiwic0FwcFN0YXRlS2V5Iiwib0FwcERhdGEiLCJpQ2FjaGVIaXQiLCJpQ2FjaGVNaXNzIiwiX3JJQXBwU3RhdGVPbGQiLCJSZWdFeHAiLCJfcklBcHBTdGF0ZU9sZEF0U3RhcnQiLCJfcklBcHBTdGF0ZU5ldyIsIk5hdkVycm9yIiwiVUlDb21wb25lbnQiLCJvUm91dGVyIiwiZ2V0Um91dGVyIiwib0NvbXBvbmVudCIsImdldE93bmVyQ29tcG9uZW50IiwiX2dldFJvdXRlciIsImdldEFwcENvbXBvbmVudCIsImdldENvbXBvbmVudERhdGEiLCJVUkxQYXJhbVdpbnMiLCJJbnNlcnRJblNlbE9wdCIsIlNlbFZhcldpbnMiLCJPRGF0YVYyIiwiX3NNb2RlIiwiX2dldEFwcE5hdmlnYXRpb25TZXJ2aWNlIiwic2FwIiwidXNoZWxsIiwiQ29udGFpbmVyIiwiZ2V0U2VydmljZSIsIl9nZXRBcHBOYXZpZ2F0aW9uU2VydmljZUFzeW5jIiwidXNoZWxsQ29udGFpbmVyIiwidWkiLCJyZXF1aXJlIiwiZ2V0U2VydmljZUFzeW5jIiwidGhlbiIsIm9Dcm9zc0FwcE5hdlNlcnZpY2UiLCJjYXRjaCIsIkxvZyIsImVycm9yIiwiZ2V0Um91dGVyRm9yIiwicmVnaXN0ZXJOYXZpZ2F0ZUNhbGxiYWNrIiwiZm5DYWxsYmFjayIsIl9uYXZpZ2F0ZUNhbGxiYWNrIiwibmF2aWdhdGUiLCJzU2VtYW50aWNPYmplY3QiLCJzQWN0aW9uTmFtZSIsInZOYXZpZ2F0aW9uUGFyYW1ldGVycyIsIm9Jbm5lckFwcERhdGEiLCJmbk9uRXJyb3IiLCJvRXh0ZXJuYWxBcHBEYXRhIiwic05hdk1vZGUiLCJzU2VsZWN0aW9uVmFyaWFudCIsIm1QYXJhbWV0ZXJzIiwib1hBcHBEYXRhT2JqIiwib1N0YXJ0dXBQYXJhbWV0ZXJzIiwiYkV4UGxhY2UiLCJvVG1wRGF0YSIsIm9OYXZIYW5kbGVyIiwib0NvbXBvbmVudERhdGEiLCJzdGFydHVwUGFyYW1ldGVycyIsImxlbmd0aCIsInVuZGVmaW5lZCIsIm9FbnJpY2hlZFNlbFZhciIsIl9zcGxpdEluYm91bmROYXZpZ2F0aW9uUGFyYW1ldGVycyIsIlNlbGVjdGlvblZhcmlhbnQiLCJvTmF2aWdhdGlvblNlbFZhciIsInRvSlNPTlN0cmluZyIsInNlbGVjdGlvblZhcmlhbnQiLCJfcmVtb3ZlVGVjaG5pY2FsUGFyYW1ldGVycyIsInRvSlNPTk9iamVjdCIsIl9yZW1vdmVNZWFzdXJlQmFzZWRJbmZvcm1hdGlvbiIsIl9jaGVja0lzUG90ZW50aWFsbHlTZW5zaXRpdmUiLCJfZ2V0VVJMUGFyYW1ldGVyc0Zyb21TZWxlY3Rpb25WYXJpYW50Iiwib05hdkFyZ3VtZW50cyIsInRhcmdldCIsInNlbWFudGljT2JqZWN0IiwiYWN0aW9uIiwicGFyYW1zIiwiZm5OYXZpZ2F0ZSIsImZuTmF2RXhwbGFjZSIsInNOZXdIcmVmUHJvbWlzZSIsImdldEhyZWYiLCJzTmV3SHJlZiIsIm9wZW5XaW5kb3ciLCJvRXJyb3IiLCJfZm5TYXZlQXBwU3RhdGVBc3luYyIsIm9TYXZlQXBwU3RhdGVSZXR1cm4iLCJhcHBTdGF0ZUtleSIsInB0b0V4dCIsImZuU3RvcmVBbmROYXZpZ2F0ZSIsInN0b3JlSW5uZXJBcHBTdGF0ZUFzeW5jIiwicmVwbGFjZUhhc2giLCJvVGFyZ2V0cyIsImlzTmF2aWdhdGlvblN1cHBvcnRlZCIsInN1cHBvcnRlZCIsIl9jcmVhdGVUZWNobmljYWxFcnJvciIsInBhcnNlTmF2aWdhdGlvbiIsInNBcHBIYXNoIiwiSGFzaENoYW5nZXIiLCJnZXRJbnN0YW5jZSIsImdldEhhc2giLCJzSUFwcFN0YXRlIiwiX2dldElubmVyQXBwU3RhdGVLZXkiLCJ3YXJuaW5nIiwiaHlicmlkSUFwcFN0YXRlS2V5UGFyYW1zIiwiaHlicmlkRGVmZXJyZWQiLCJqUXVlcnkiLCJEZWZlcnJlZCIsImlBcHBTdGF0ZUh5YnJpZERlZmVycmVkIiwiX2xvYWRBcHBTdGF0ZSIsImh5YnJpZCIsImFEZWZhdWx0ZWRQYXJhbWV0ZXJzIiwiSlNPTiIsInBhcnNlIiwib015RGVmZXJyZWQiLCJwYXJzZVVybFBhcmFtcyIsIm9TdWJTdGFydHVwUGFyYW1ldGVycyIsImFTdWJEZWZhdWx0ZWRQYXJhbWV0ZXJzIiwib1N1Yk15RGVmZXJyZWQiLCJzTmF2VHlwZSIsIm9TZWxWYXJzIiwiaXNFbXB0eSIsIm9EZWZhdWx0ZWRTZWxWYXIiLCJ4QXBwU3RhdGUiLCJyZWplY3QiLCJyZXNvbHZlIiwiaW5pdGlhbCIsIm9BcHBTdGF0ZURhdGEiLCJvU2VsZWN0aW9uVmFyaWFudCIsIm9EZWZhdWx0ZWRTZWxlY3Rpb25WYXJpYW50IiwiYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seSIsInN1Y2Nlc3NIYW5kbGVySHlicmlkU3RhdGUiLCJpQXBwU3RhdGVEYXRhIiwiX3JlZiIsIm5hdlR5cGUiLCJpQXBwU3RhdGUiLCJmYWlsdXJlSGFuZGxlckh5YnJpZFN0YXRlIiwiZG9uZSIsImZhaWwiLCJiSXNYYXBwU3RhdGVOYXZpZ2F0aW9uIiwidGhhdCIsImdldFN0YXJ0dXBBcHBTdGF0ZSIsIm9BcHBTdGF0ZSIsImdldERhdGEiLCJzdHJpbmdpZnkiLCJ4IiwicHJvbWlzZSIsIm9TZWxWYXIiLCJVUkxQYXJhbXMiLCJzZXRUZWNobmljYWxQYXJhbWV0ZXJzIiwiYVRlY2huaWNhbFBhcmFtZXRlcnMiLCJBcnJheSIsImlzQXJyYXkiLCJnZXRUZWNobmljYWxQYXJhbWV0ZXJzIiwiY29uY2F0IiwiX2lzVGVjaG5pY2FsUGFyYW1ldGVyIiwic1BhcmFtZXRlck5hbWUiLCJ0b0xvd2VyQ2FzZSIsImluZGV4T2YiLCJfaXNGRVBhcmFtZXRlciIsInNQcm9wTmFtZSIsImkiLCJhU2VsVmFyUHJvcE5hbWVzIiwiZ2V0U2VsZWN0T3B0aW9uc1Byb3BlcnR5TmFtZXMiLCJyZW1vdmVTZWxlY3RPcHRpb24iLCJvU3RhcnR1cFBhcmFtZXRlcnNBZGp1c3RlZCIsImhhc093blByb3BlcnR5IiwiZ2V0UGFyYW1ldGVyTmFtZXMiLCJtYXNzQWRkU2VsZWN0T3B0aW9uIiwiZ2V0VmFsdWUiLCJfYWRkUGFyYW1ldGVyVmFsdWVzIiwiYVByb3BOYW1lcyIsIm9TZWxWYXJpYW50Iiwic1NpZ24iLCJzT3B0aW9uIiwib1ZhbHVlcyIsImFkZFNlbGVjdE9wdGlvbiIsIm9IYXNoQ2hhbmdlciIsInNBcHBIYXNoT2xkIiwic0FwcEhhc2hOZXciLCJfcmVwbGFjZUlubmVyQXBwU3RhdGVLZXkiLCJtSW5uZXJBcHBEYXRhIiwiYkltbWVkaWF0ZUhhc2hSZXBsYWNlIiwiYlNraXBIYXNoUmVwbGFjZSIsImZuUmVwbGFjZUhhc2giLCJpc0VtcHR5T2JqZWN0Iiwic0FwcFN0YXRlS2V5Q2FjaGVkIiwiYklubmVyQXBwRGF0YUVxdWFsIiwiZm5PbkFmdGVyU2F2ZSIsIl9zYXZlQXBwU3RhdGVBc3luYyIsInN0b3JlSW5uZXJBcHBTdGF0ZSIsIl9zYXZlQXBwU3RhdGUiLCJzdG9yZUlubmVyQXBwU3RhdGVXaXRoSW1tZWRpYXRlUmV0dXJuIiwib0FwcFN0YXRlUHJvbWlzZSIsInByb2Nlc3NCZWZvcmVTbWFydExpbmtQb3BvdmVyT3BlbnMiLCJvVGFibGVFdmVudFBhcmFtZXRlcnMiLCJtU2VtYW50aWNBdHRyaWJ1dGVzIiwic2VtYW50aWNBdHRyaWJ1dGVzIiwiZm5TdG9yZVhhcHBBbmRDYWxsT3BlbiIsIm1TdWJTZW1hbnRpY0F0dHJpYnV0ZXMiLCJzU3ViU2VsZWN0aW9uVmFyaWFudCIsImlTdXBwcmVzc2lvbkJlaGF2aW9yIiwicmFpc2VFcnJvck9uTnVsbCIsInJhaXNlRXJyb3JPblVuZGVmaW5lZCIsIm9NaXhlZFNlbFZhciIsIm1peEF0dHJpYnV0ZXNBbmRTZWxlY3Rpb25WYXJpYW50IiwiZm5PbkNvbnRhaW5lclNhdmUiLCJzZXRTZW1hbnRpY0F0dHJpYnV0ZXMiLCJzZXRBcHBTdGF0ZUtleSIsIm9wZW4iLCJvU3RvcmVJbm5lckFwcFN0YXRlUHJvbWlzZSIsIl9nZXRBcHBTdGF0ZUtleUFuZFVybFBhcmFtZXRlcnMiLCJfZ2V0QXBwU3BlY2lmaWNIYXNoIiwiYXBwSGFzaCIsImNyb3NzQXBwU2VydmljZSIsImFwcFNwZWNpZmljUm91dGUiLCJtZXNzYWdlIiwiRXJyb3IiLCJTdHJpbmciLCJfbWl4QXR0cmlidXRlc1RvU2VsVmFyaWFudCIsInNQcm9wZXJ0eU5hbWUiLCJ2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZSIsIkRhdGUiLCJ0b0pTT04iLCJ0b1N0cmluZyIsImlnbm9yZUVtcHR5U3RyaW5nIiwiaW5mbyIsInZTZW1hbnRpY0F0dHJpYnV0ZXMiLCJvTmV3U2VsVmFyaWFudCIsImZpbHRlclVybCIsImdldEZpbHRlckNvbnRleHRVcmwiLCJzZXRGaWx0ZXJDb250ZXh0VXJsIiwiY29udGV4dFVybCIsImdldFBhcmFtZXRlckNvbnRleHRVcmwiLCJzZXRQYXJhbWV0ZXJDb250ZXh0VXJsIiwiZm9yRWFjaCIsImFQYXJhbWV0ZXJzIiwiZ2V0U2VsZWN0T3B0aW9uIiwiZ2V0UGFyYW1ldGVyIiwiYVNlbE9wdGlvbk5hbWVzIiwiYVNlbGVjdE9wdGlvbiIsImoiLCJTaWduIiwiT3B0aW9uIiwiTG93IiwiSGlnaCIsIl9lbnN1cmVTZWxlY3Rpb25WYXJpYW50Rm9ybWF0U3RyaW5nIiwidlNlbGVjdGlvblZhcmlhbnQiLCJ2Q29udmVydGVkU2VsZWN0aW9uVmFyaWFudCIsIl9mbkhhbmRsZUFwcFN0YXRlUHJvbWlzZSIsIm9SZXR1cm4iLCJfc2F2ZUFwcFN0YXRlV2l0aEltbWVkaWF0ZVJldHVybiIsIl9mblNhdmVBcHBTdGF0ZVdpdGhJbW1lZGlhdGVSZXR1cm4iLCJnZXRLZXkiLCJvQXBwRGF0YUZvclNhdmUiLCJfZmV0Y2hBcHBEYXRhRm9yU2F2ZSIsInNldERhdGEiLCJvU2F2ZVByb21pc2UiLCJzYXZlIiwiZXh0ZW5kIiwidGFibGVWYXJpYW50SWQiLCJjdXN0b21EYXRhIiwicHJlc2VudGF0aW9uVmFyaWFudCIsInZhbHVlVGV4dHMiLCJzZW1hbnRpY0RhdGVzIiwib0FwcERhdGFDbG9uZSIsIk9iamVjdCIsImFzc2lnbiIsIm1lcmdlIiwiY3JlYXRlRW1wdHlBcHBTdGF0ZSIsIm9EZWZlcnJlZCIsImdldEFwcFN0YXRlIiwib0FwcERhdGFMb2FkZWQiLCJkYXRhIiwiYU1hdGNoZXMiLCJleGVjIiwic05ld0lBcHBTdGF0ZSIsImZuQXBwZW5kVG9RdWVyeVBhcmFtZXRlciIsInNTdWJBcHBIYXNoIiwidGVzdCIsInJlcGxhY2UiLCJzTmVlZGxlIiwiZm5SZXBsYWNlT2xkQXBwcm9hY2giLCJyT2xkQXBwcm9hY2giLCJhc3NlcnQiLCJtVVJMUGFyYW1ldGVycyIsImFTZWxlY3RQcm9wZXJ0aWVzIiwiYVNlbGVjdE9wdGlvbnMiLCJhUGFyYW1ldGVyTmFtZXMiLCJzUGFyYW1ldGVyVmFsdWUiLCJzRXJyb3JDb2RlIiwic2V0TW9kZWwiLCJvTW9kZWwiLCJfb01vZGVsIiwiX2dldE1vZGVsIiwiZ2V0TW9kZWwiLCJfcmVtb3ZlQWxsUHJvcGVydGllcyIsIm9EYXRhIiwiX3JlbW92ZVByb3BlcnRpZXMiLCJhRmlsdGVyTmFtZSIsImFQYXJhbWV0ZXJOYW1lIiwic05hbWUiLCJTZWxlY3RPcHRpb25zIiwic29tZSIsIm9WYWx1ZSIsIm5JZHgiLCJQcm9wZXJ0eU5hbWUiLCJzcGxpY2UiLCJUZXh0cyIsIm9UZXh0cyIsIlByb3BlcnR5VGV4dHMiLCJEYXRlcyIsIm9EYXRlcyIsIlBhcmFtZXRlcnMiLCJfaXNUZXJtVHJ1ZSIsIm9Qcm9wZXJ0eSIsInNUZXJtIiwiZklzVGVybURlZmF1bHRUcnVlIiwib1Rlcm0iLCJCb29sIiwiX2lzRXhjbHVkZWRGcm9tTmF2aWdhdGlvbkNvbnRleHQiLCJfaXNQb3RlbnRpYWxseVNlbnNpdGl2ZSIsIl9pc01lYXN1cmVQcm9wZXJ0eSIsIl9pc1RvQmVFeGNsdWRlZCIsImNvbnN0cnVjdENvbnRleHRVcmwiLCJzRW50aXR5U2V0TmFtZSIsIl9jb25zdHJ1Y3RDb250ZXh0VXJsIiwic1NlcnZlclVybCIsImlzQSIsIl9nZXRTZXJ2ZXJVcmwiLCJvU2VydmljZVVSSSIsIlVSSSIsImdldFNlcnZpY2VVcmwiLCJhYnNvbHV0ZVRvIiwiZG9jdW1lbnQiLCJiYXNlVVJJIiwibGFzdEluZGV4T2YiLCJzdWJzdHIiLCJzU2VydmljZVVybCIsIm9BZGFwdGVkRGF0YSIsIkZpbHRlckNvbnRleHRVcmwiLCJQYXJhbWV0ZXJDb250ZXh0VXJsIiwiYVNlbnNpdGl2ZUZpbHRlck5hbWUiLCJhU2Vuc2l0aXZlUGFyYW1ldGVyTmFtZSIsIm9FbnRpdHlTZXQiLCJvRW50aXR5RGVmIiwib1N1YkVudGl0eURlZiIsIm9FbmRSb2xlIiwiYUZpbHRlckNvbnRleHRQYXJ0IiwiYVBhcmFtQ29udGV4dFBhcnQiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiZ2V0U2VydmljZU1ldGFkYXRhIiwic3BsaXQiLCJnZXRPRGF0YUVudGl0eVNldCIsImdldE9EYXRhRW50aXR5VHlwZSIsImVudGl0eVR5cGUiLCJwcm9wZXJ0eSIsInB1c2giLCJuYW1lIiwibmF2aWdhdGlvblByb3BlcnR5IiwiZ2V0T0RhdGFBc3NvY2lhdGlvbkVuZCIsInR5cGUiLCJtdWx0aXBsaWNpdHkiLCJfcmVtb3ZlU2Vuc2l0aXZlRGF0YUZvck9EYXRhVjQiLCJfcmVtb3ZlTWVhc3VyZUJhc2VkUHJvcGVydGllcyIsImFNZWFzdXJlRmlsdGVyTmFtZSIsImFNZWFzdXJlUGFyYW1ldGVyTmFtZSIsImJNZWFzdXJlIiwib1NWIiwiZ2V0T2JqZWN0Iiwic0VudGl0eVNldCIsImFQcm9wZXJ0eU5hbWVzIiwiZ2V0UHJvcGVydHlOYW1lcyIsImZuSXNTZW5zaXRpdmVEYXRhIiwic1Byb3AiLCJlc05hbWUiLCJhUHJvcGVydHlBbm5vdGF0aW9ucyIsIl9jaGVja1Byb3BlcnR5QW5ub3RhdGlvbnNGb3JTZW5zaXRpdmVEYXRhIiwib0ZpZWxkQ29udHJvbCIsImsiLCJzUHJvcGVydHkiLCJnZXRJQXBwU3RhdGVLZXkiLCJCYXNlT2JqZWN0IiwiTmF2aWdhdGlvbkhhbmRsZXJVSTVDbGFzcyIsInByb3RvdHlwZSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiTmF2aWdhdGlvbkhhbmRsZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgYXNzZXJ0IGZyb20gXCJzYXAvYmFzZS9hc3NlcnRcIjtcbmltcG9ydCBleHRlbmQgZnJvbSBcInNhcC9iYXNlL3V0aWwvZXh0ZW5kXCI7XG5pbXBvcnQgaXNFbXB0eU9iamVjdCBmcm9tIFwic2FwL2Jhc2UvdXRpbC9pc0VtcHR5T2JqZWN0XCI7XG5pbXBvcnQgbWVyZ2UgZnJvbSBcInNhcC9iYXNlL3V0aWwvbWVyZ2VcIjtcbmltcG9ydCBCYXNlT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9PYmplY3RcIjtcbmltcG9ydCBVSUNvbXBvbmVudCBmcm9tIFwic2FwL3VpL2NvcmUvVUlDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2xsZXIgZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyXCI7XG5pbXBvcnQgSGFzaENoYW5nZXIgZnJvbSBcInNhcC91aS9jb3JlL3JvdXRpbmcvSGFzaENoYW5nZXJcIjtcbmltcG9ydCBWMk9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92Mi9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgVjRPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IFVSSSBmcm9tIFwic2FwL3VpL3RoaXJkcGFydHkvVVJJXCI7XG5pbXBvcnQgalF1ZXJ5IGZyb20gXCJzYXAvdWkvdGhpcmRwYXJ0eS9qcXVlcnlcIjtcbmltcG9ydCBvcGVuV2luZG93IGZyb20gXCJzYXAvdWkvdXRpbC9vcGVuV2luZG93XCI7XG5pbXBvcnQgdHlwZSBDb250YWluZXIgZnJvbSBcInNhcC91c2hlbGwvQ29udGFpbmVyXCI7XG5pbXBvcnQgdHlwZSBOYXZpZ2F0aW9uIGZyb20gXCJzYXAvdXNoZWxsL3NlcnZpY2VzL05hdmlnYXRpb25cIjtcbmltcG9ydCBOYXZFcnJvciBmcm9tIFwiLi9OYXZFcnJvclwiO1xuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemVkU2VsZWN0aW9uVmFyaWFudCB9IGZyb20gXCIuL1NlbGVjdGlvblZhcmlhbnRcIjtcbmltcG9ydCBTZWxlY3Rpb25WYXJpYW50IGZyb20gXCIuL1NlbGVjdGlvblZhcmlhbnRcIjtcbmltcG9ydCBOYXZMaWJyYXJ5IGZyb20gXCIuL2xpYnJhcnlcIjtcblxuLyoqXG4gKiBTdHJ1Y3R1cmUgb2Ygc3RvcmVkIGFwcCBzdGF0ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbm5lckFwcERhdGEge1xuXHRba2V5OiBzdHJpbmddOiB1bmtub3duO1xuXHQvKipcblx0ICogU3JpbmdpZmllZCBKU09OIG9iamVjdCBhcyByZXR1cm5lZCwgZm9yIGV4YW1wbGUsIGZyb20gZ2V0RGF0YVN1aXRlRm9ybWF0KCkgb2YgdGhlIFNtYXJ0RmlsdGVyQmFyIGNvbnRyb2xcblx0ICovXG5cdHNlbGVjdGlvblZhcmlhbnQ/OiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIElEIG9mIHRoZSBTbWFydFRhYmxlIHZhcmlhbnQuXG5cdCAqL1xuXHR0YWJsZVZhcmlhbnRJZD86IHN0cmluZztcblxuXHQvKipcblx0ICogT2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gc3RvcmUgYXJiaXRyYXJ5IGRhdGEuXG5cdCAqL1xuXHRjdXN0b21EYXRhPzogb2JqZWN0O1xuXG5cdC8qKlxuXHQgKiBPYmplY3QgY29udGFpbmluZyB0aGUgY3VycmVudCB1aSBzdGF0ZSBvZiB0aGUgYXBwLlxuXHQgKi9cblx0cHJlc2VudGF0aW9uVmFyaWFudD86IG9iamVjdDtcblxuXHQvKipcblx0ICogT2JqZWN0IGNvbnRhaW5pbmcgdmFsdWUgZGVzY3JpcHRpb25zLlxuXHQgKi9cblx0dmFsdWVUZXh0cz86IG9iamVjdDtcblxuXHQvKipcblx0ICogT2JqZWN0IGNvbnRhaW5pbmcgc2VtYW50aWNEYXRlcyBmaWx0ZXIgaW5mb3JtYXRpb24uXG5cdCAqL1xuXHRzZW1hbnRpY0RhdGVzPzogb2JqZWN0O1xufVxuXG4vLyBzaG9ydGN1dHMgZm9yIHNhcC51aS5nZW5lcmljLmFwcCBlbnVtc1xuY29uc3QgTmF2VHlwZSA9IE5hdkxpYnJhcnkuTmF2VHlwZTtcbmNvbnN0IFBhcmFtSGFuZGxpbmdNb2RlID0gTmF2TGlicmFyeS5QYXJhbUhhbmRsaW5nTW9kZTtcbmNvbnN0IFN1cHByZXNzaW9uQmVoYXZpb3IgPSBOYXZMaWJyYXJ5LlN1cHByZXNzaW9uQmVoYXZpb3I7XG5jb25zdCBNb2RlID0gTmF2TGlicmFyeS5Nb2RlO1xuXG5jb25zdCBJQVBQX1NUQVRFID0gXCJzYXAtaWFwcC1zdGF0ZVwiO1xuY29uc3QgREVGQVVMVEVEX1BBUkFNRVRFUl9QUk9QRVJUWSA9IFwic2FwLXVzaGVsbC1kZWZhdWx0ZWRQYXJhbWV0ZXJOYW1lc1wiO1xuY29uc3QgSFlCUklEX0lBUFBfU1RBVEVfS0VZID0gXCJuaEh5YnJpZElBcHBTdGF0ZUtleVwiO1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHN1Y2Nlc3NvciBvZiB7QGxpbmsgc2FwLnVpLmdlbmVyaWMuYXBwLm5hdmlnYXRpb24uc2VydmljZS5OYXZpZ2F0aW9uSGFuZGxlcn0uPGJyPiBDcmVhdGVzIGEgbmV3IE5hdmlnYXRpb25IYW5kbGVyIGNsYXNzIGJ5IHByb3ZpZGluZyB0aGUgcmVxdWlyZWQgZW52aXJvbm1lbnQuIDxicj5cbiAqIFRoZSA8Y29kZT5OYXZpZ2F0aW9uSGFuZGxlcjwvY29kZT4gc3VwcG9ydHMgdGhlIHZlcmlmaWNhdGlvbiBvZiBzZW5zaXRpdmUgaW5mb3JtYXRpb24uIEFsbCBwcm9wZXJ0aWVzIHRoYXQgYXJlIHBhcnQgb2ZcbiAqIDxjb2RlPnNlbGVjdGlvblZhcmlhbnQ8L2NvZGU+IGFuZCA8Y29kZT52YWx1ZVRleHRzPC9jb2RlPiB3aWxsIGJlIHZlcmlmaWVkIGlmIHRoZXkgYXJlIGFubm90YXRlZCBhc1xuICogPGNvZGU+Y29tLnNhcC52b2NhYnVsYXJpZXMuUGVyc29uYWxEYXRhLnYxLklzUG90ZW50aWFsbHlTZW5zaXRpdmU8L2NvZGU+IG9yXG4gKiA8Y29kZT5jb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5FeGNsdWRlRnJvbU5hdmlnYXRpb25Db250ZXh0PC9jb2RlPiBhbmQgd2lsbCBiZSByZW1vdmVkIGJlZm9yZSB0aGUgZGF0YSBpcyBwZXJzaXN0ZWQgYXMgdGhlIGFwcFxuICogc3RhdGUuPGJyPlxuICogQWxzbywgYWxsIHByb3BlcnRpZXMgYW5ub3RhdGVkIGFzIDxjb2RlPmNvbS5zYXAudm9jYWJ1bGFyaWVzLkFuYWx5dGljcy52MS5NZWFzdXJlPC9jb2RlPiB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgZGF0YSBzdG9yZWQgYXMgdGhlXG4gKiB4YXBwIHN0YXRlLjxicj5cbiAqIFRvIHZlcmlmeSB0aGUgaW5mb3JtYXRpb24gdG8gYmUgcmVtb3ZlZCwgdGhlIDxjb2RlPk5hdmlnYXRpb25IYW5kbGVyPC9jb2RlPiByZXF1aXJlcyBhbiB1bm5hbWVkIG1vZGVsIG9mIHR5cGVcbiAqIHtAbGluayBzYXAudWkubW9kZWwub2RhdGEudjIuT0RhdGFNb2RlbH0gb24gY29tcG9uZW50IGxldmVsLiBJdCBpcyBwb3NzaWJsZSB0byBzZXQgc3VjaCBhIG1vZGVsIHVzaW5nIHRoZSA8Y29kZT5zZXRNb2RlbDwvY29kZT5cbiAqIG1ldGhvZC48YnI+XG4gKiA8Yj5Ob3RlOjwvYj4gVGhlIGNoZWNrIGZvciBleGNsdWRlZCBkYXRhIHJlcXVpcmVzIHRoYXQgdGhlIE9EYXRhIG1ldGFkYXRhIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkIGNvbXBsZXRlbHkuPGJyPlxuICogSWYgdGhlIE9EYXRhIG1ldGFkYXRhIG1vZGVsIGhhcyBub3QgYmVlbiBsb2FkZWQgY29tcGxldGVseSwgYWxsIHByb3BlcnRpZXMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgYXBwbGljYXRpb24gY29udGV4dC48YnI+XG4gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcyByZXF1aXJlcyB0aGF0IHRoZSBVU2hlbGwge0BsaW5rIHNhcC51c2hlbGwuc2VydmljZXMuQ3Jvc3NBcHBsaWNhdGlvbk5hdmlnYXRpb259IGlzIGF2YWlsYWJsZSBhbmQgaW5pdGlhbGl6ZWQuXG4gKlxuICogQHB1YmxpY1xuICogQGNsYXNzXG4gKiBAZXh0ZW5kcyBzYXAudWkuYmFzZS5PYmplY3RcbiAqIEBzaW5jZSAxLjgzLjBcbiAqIEBuYW1lIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdmlnYXRpb25IYW5kbGVyXG4gKi9cbmV4cG9ydCBjbGFzcyBOYXZpZ2F0aW9uSGFuZGxlciBleHRlbmRzIEJhc2VPYmplY3Qge1xuXHRwcml2YXRlIG9Sb3V0ZXI6IGFueTtcblxuXHRwcml2YXRlIG9Db21wb25lbnQ6IGFueTtcblxuXHRwcml2YXRlIF9vTW9kZWw6IGFueTtcblxuXHRwcml2YXRlIHNQYXJhbUhhbmRsaW5nTW9kZTogc3RyaW5nO1xuXG5cdHByaXZhdGUgX3NNb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cblx0Ly8gbGlzdCBvZiB0ZWNobmljYWwgcGFyYW1ldGVyc1xuXHRwcml2YXRlIF9hVGVjaG5pY2FsUGFyYW1hdGVycyA9IFtcImhjcEFwcGxpY2F0aW9uSWRcIl07XG5cblx0cHJpdmF0ZSBfb0xhc3RTYXZlZElubmVyQXBwRGF0YTogYW55ID0ge1xuXHRcdHNBcHBTdGF0ZUtleTogXCJcIixcblx0XHRvQXBwRGF0YToge30sXG5cdFx0aUNhY2hlSGl0OiAwLFxuXHRcdGlDYWNoZU1pc3M6IDBcblx0fTtcblxuXHQvKlxuXHQgKiBUaGVyZSBleGlzdHMgYSBnZW5lcmF0aW9uIG9mIFwib2xkXCIgc2FwLWlhcHAtc3RhdGVzIHdoaWNoIGFyZSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIFVSTCBzY2hlbWE6XG5cdCAqICNTZW1PYmotYWN0aW9uJi9yb3V0ZS9zYXAtaWFwcC1zdGF0ZT1BQkMxMjM0NTY3OCBUaGUgbmV3IFVSTCBzY2hlbWEgaXM6ICNTZW1PYmotYWN0aW9uJi9yb3V0ZT9zYXAtaWFwcC1zdGF0ZT1BQkMxMjM0NTY3OCAobWluZCB0aGVcblx0ICogZGlmZmVyZW5jZSBiZXR3ZWVuIC8gYW5kID8gYWJvdmUpLCBpLmUuIHRoZSBzYXAtaWFwcC1zdGF0ZSBoYXMgYmVjb21lIGEgcGFyYW1ldGVyIG9mIHRoZSBxdWVyeSBwYXJhbWV0ZXIgc2VjdGlvbiBpbiB0aGUgQXBwSGFzaCBzdHJpbmcuXG5cdCAqIFlldCwgdGhpcyB0b29sIHNoYWxsIGJlIGFibGUgdG8gZGVhbCBldmVuIHdpdGggb2xkIHNhcC1pYXBwLXN0YXRlcy4gVGhlcmVmb3JlLCB3ZSB1c2UgdHdvIFJlZ3VsYXIgRXhwcmVzc2lvbnMgKHJJQXBwU3RhdGVPbGQgYW5kXG5cdCAqIHJJQXBwU3RhdGVPbGRBdFN0YXJ0KSBhcyBkZWZpbmVkIGJlbG93IHRvIHNjYW4gZm9yIHRoZXNlIG9sZCB2YXJpYW50cy4gVGhlIG5ldyB2YXJpYW50IGlzIGJlaW5nIHNjYW5uZWQgdXNpbmcgcklBcHBTdGF0ZU5ldyBhcyBSZWd1bGFyXG5cdCAqIEV4cHJlc3Npb24gc2VhcmNoIHN0cmluZy4gQ29tcGF0aWJpbGl0eSBpcyBjZW50cmFsbHkgZW5zdXJlZCBieSB0aGUgdHdvIG1ldGhvZHMgX2dldElubmVyQXBwU3RhdGVLZXkgYW5kIF9yZXBsYWNlSW5uZXJBcHBTdGF0ZUtleSAoc2VlXG5cdCAqIGJlbG93KS4gTmV2ZXIgdXNlIHRoZXNlIFJlZ0V4cCBpbiBhIG1ldGhvZCBvbiB5b3VyIG93biwgYXMgaXQgdHlwaWNhbGx5IGluZGljYXRlcyB0aGF0IHlvdSB3aWxsIGZhbGwgaW50byB0aGUgY29tcGF0aWJpbGl0eSB0cmFwIVxuXHQgKi9cblx0Ly8gV2FybmluZyEgRG8gbm90IHVzZSBHTE9CQUwgZmxhZ3MgaGVyZTsgUmVnRXhwIGluIEdMT0JBTCBtb2RlIHN0b3JlIHRoZSBsYXN0SW5kZXggdmFsdWVcblx0Ly8gVGhlcmVmb3JlLCByZXBlYXRlZCBjYWxscyB0byB0aGUgUmVnRXhwIHdpbGwgdGhlbiBvbmx5IHN0YXJ0IGJlZ2lubmluZyB3aXRoIHRoYXQgc3RvcmVkXG5cdC8vIGxhc3RJbmRleC4gVGh1cywgbXVsdGlwbGUgY2FsbHMgdGhlcmVmb3JlIGNvdWxkIHlpZWxkIHN0cmFuZ2UgcmVzdWx0cy5cblx0Ly8gTW9yZW92ZXIsIHRoZXJlIHNoYWxsIG9ubHkgYmUgZXhhY3RseSBvbmUgSUFQUF9TVEFURSBwZXIgUmVnRXhwIGluIGFuIEFwcEhhc2guXG5cdC8vIFRoZXJlZm9yZSwgR0xPQkFMIHNlYXJjaCBzaG91bGQgYmUgc3VwZXJmbHVvdXMuXG5cdHByaXZhdGUgX3JJQXBwU3RhdGVPbGQgPSBuZXcgUmVnRXhwKFwiL1wiICsgSUFQUF9TVEFURSArIFwiPShbXi8/XSspXCIpO1xuXG5cdHByaXZhdGUgX3JJQXBwU3RhdGVPbGRBdFN0YXJ0ID0gbmV3IFJlZ0V4cChcIl5cIiArIElBUFBfU1RBVEUgKyBcIj0oW14vP10rKVwiKTtcblxuXHQvKlxuXHQgKiBSZWd1bGFyIEV4cHJlc3Npb24gaW4gd29yZHM6IFNlYXJjaCBmb3Igc29tZXRoaW5nIHRoYXQgZWl0aGVyIHN0YXJ0cyB3aXRoID8gb3IgJiwgZm9sbG93ZWQgYnkgdGhlIHRlcm0gXCJzYXAtaWFwcC1zdGF0ZVwiLiBUaGF0IG9uZSBpc1xuXHQgKiBmb2xsb3dlZCBieSBhbiBlcXVhbCBzaWduICg9KS4gVGhlIHN0dWZmIHRoYXQgaXMgYWZ0ZXIgdGhlIGVxdWFsIHNpZ24gZm9ybXMgdGhlIGZpcnN0IHJlZ2V4cCBncm91cC4gVGhpcyBncm91cCBjb25zaXN0cyBvZiBhdCBsZWFzdCBvbmVcblx0ICogKG9yIGFyYml0cmFyeSBtYW55KSBjaGFyYWN0ZXJzLCBhcyBsb25nIGFzIGl0IGlzIG5vdCBhbiBhbXBlcnNhbmQgc2lnbiAoJikuIENoYXJhY3RlcnMgYWZ0ZXIgc3VjaCBhbiBhbXBlcnNhbmQgd291bGQgYmUgaWdub3JlZCBhbmQgZG9cblx0ICogbm90IGJlbG9uZyB0byB0aGUgZ3JvdXAuIEFsdGVybmF0aXZlbHksIHRoZSBzdHJpbmcgYWxzbyBtYXkgZW5kLlxuXHQgKi9cblx0cHJpdmF0ZSBfcklBcHBTdGF0ZU5ldyA9IG5ldyBSZWdFeHAoXCJbPyZdXCIgKyBJQVBQX1NUQVRFICsgXCI9KFteJl0rKVwiKTtcblxuXHRwcml2YXRlIF9uYXZpZ2F0ZUNhbGxiYWNrOiBGdW5jdGlvbiB8IHVuZGVmaW5lZDtcblxuXHQvKipcblx0ICogVGVtcG9yYXJpbHkgYWRkZWQgYWdhaW4gYmVjYXVzZSBhbiBhcHBsaWNhdGlvbiB3YXMgKGlsbGVnaWFsbHkpIHJlbHlpbmcgb24gaXQuIFNob3VsZCBiZSByZW1vdmVkIGFnYWluLCBvbmNlIHRoZSBhcHAgaXMgY29ycmVjdGVkXG5cdCAqL1xuXHRwcml2YXRlIElBUFBfU1RBVEUgPSBJQVBQX1NUQVRFO1xuXG5cdC8qKlxuXHQgKiBDb25zdHJ1Y3RvciByZXF1aXJpbmcgYSBjb250cm9sbGVyL2NvbXBvbmVudCBvd25pbmcgdGhlIG5hdmlnYXRpb24gaGFuZGxlci5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250cm9sbGVyIFVJNSBjb250cm9sbGVyIHRoYXQgY29udGFpbnMgYSByb3V0ZXIgYW5kIGEgY29tcG9uZW50OyB0eXBpY2FsbHkgdGhlIG1haW4gY29udHJvbGxlciBvZiB5b3VyIGFwcGxpY2F0aW9uLCBmb3Jcblx0ICogICAgICAgIGV4YW1wbGUsIGEgc3ViY2xhc3Mgb2YgdGhlIHNhcC5jYS5zY2ZsZC5tZC5jb250cm9sbGVyLkJhc2VGdWxsc2NyZWVuQ29udHJvbGxlciBpZiBzY2FmZm9sZGluZyBpcyB1c2VkXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbc01vZGU9c2FwLmZlLm5hdmlnYXRpb24uTW9kZS5PRGF0YVY0XSBNb2RlIHRvIGJlIHVzZWQgdG8gaW5kaWNhdGVzIHRoZSBPZGF0YSB2ZXJzaW9uIHVzZWQgZm9yIHJ1bm5uaW5nIHRoZSBOYXZpZ2F0aW9uIEhhbmRsZXIsXG5cdCAqICAgICAgICBzZWUge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk1vZGV9Ljxicj5cblx0ICogXHRcdCAgTm90ZTogTW9kZSBoYXMgdG8gYmUgc2FwLmZlLm5hdmlnYXRpb24uTW9kZS5PRGF0YVYyIHdoZW5ldmVyIHRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCB0byBpbml0aWFsaXplIGEgT0RhdGEgVjIgYmFzZWQgc2VydmljZS5cblx0ICogQHBhcmFtIHtzdHJpbmd9IFtzUGFyYW1IYW5kbGluZ01vZGU9U2VsVmFyV2luc10gTW9kZSB0byBiZSB1c2VkIHRvIGhhbmRsZSBjb25mbGljdHMgd2hlbiBtZXJnaW5nIFVSTCBwYXJhbWV0ZXJzIGFuZCB0aGUgU2VsZWN0aW9uVmFyaWFudCBjbGFzcyxcblx0ICogICAgICAgIHNlZSB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uUGFyYW1IYW5kbGluZ01vZGV9XG5cdCAqIEB0aHJvd3MgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdkVycm9yfSBpbiBjYXNlIG9mIGlucHV0IGVycm9ycy4gVmFsaWQgZXJyb3IgY29kZXMgYXJlOiA8dGFibGU+XG5cdCAqICAgICAgICAgPHRyPlxuXHQgKiAgICAgICAgIDx0aCBhbGlnbj1cImxlZnRcIj5OYXZFcnJvciBjb2RlPC90aD5cblx0ICogICAgICAgICA8dGggYWxpZ249XCJsZWZ0XCI+RGVzY3JpcHRpb248L3RoPlxuXHQgKiAgICAgICAgIDwvdHI+XG5cdCAqICAgICAgICAgPHRyPlxuXHQgKiAgICAgICAgIDx0ZD5OYXZpZ2F0aW9uSGFuZGxlci5JTlZBTElEX0lOUFVUPC90ZD5cblx0ICogICAgICAgICA8dGQ+SW5kaWNhdGVzIHRoYXQgdGhlIGlucHV0IHBhcmFtZXRlciBpcyBpbnZhbGlkPC90ZD5cblx0ICogICAgICAgICA8L3RyPlxuXHQgKiAgICAgICAgIDwvdGFibGU+XG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihvQ29udHJvbGxlcjogQ29udHJvbGxlciB8IFVJQ29tcG9uZW50LCBzTW9kZT86IHN0cmluZywgc1BhcmFtSGFuZGxpbmdNb2RlPzogc3RyaW5nKSB7XG5cdFx0c3VwZXIoKTtcblx0XHRpZiAoIW9Db250cm9sbGVyKSB7XG5cdFx0XHR0aHJvdyBuZXcgTmF2RXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5JTlZBTElEX0lOUFVUXCIpO1xuXHRcdH1cblxuXHRcdGlmIChvQ29udHJvbGxlciBpbnN0YW5jZW9mIFVJQ29tcG9uZW50KSB7XG5cdFx0XHR0aGlzLm9Sb3V0ZXIgPSBvQ29udHJvbGxlci5nZXRSb3V0ZXIoKTtcblx0XHRcdHRoaXMub0NvbXBvbmVudCA9IG9Db250cm9sbGVyO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAodHlwZW9mIG9Db250cm9sbGVyLmdldE93bmVyQ29tcG9uZW50ICE9PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9JTlBVVFwiKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5vUm91dGVyID0gdGhpcy5fZ2V0Um91dGVyKG9Db250cm9sbGVyKTtcblx0XHRcdHRoaXMub0NvbXBvbmVudCA9IG9Db250cm9sbGVyLmdldE93bmVyQ29tcG9uZW50KCk7XG5cdFx0fVxuXG5cdFx0Ly8gc3BlY2lhbCBoYW5kbGluZyBmb3IgU21hcnRUZW1wbGF0ZXNcblx0XHRpZiAodGhpcy5vQ29tcG9uZW50ICYmIHRoaXMub0NvbXBvbmVudC5nZXRBcHBDb21wb25lbnQpIHtcblx0XHRcdHRoaXMub0NvbXBvbmVudCA9IHRoaXMub0NvbXBvbmVudC5nZXRBcHBDb21wb25lbnQoKTtcblx0XHR9XG5cblx0XHRpZiAoXG5cdFx0XHR0eXBlb2YgdGhpcy5vUm91dGVyID09PSBcInVuZGVmaW5lZFwiIHx8XG5cdFx0XHR0eXBlb2YgdGhpcy5vQ29tcG9uZW50ID09PSBcInVuZGVmaW5lZFwiIHx8XG5cdFx0XHR0eXBlb2YgdGhpcy5vQ29tcG9uZW50LmdldENvbXBvbmVudERhdGEgIT09IFwiZnVuY3Rpb25cIlxuXHRcdCkge1xuXHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9JTlBVVFwiKTtcblx0XHR9XG5cblx0XHRpZiAoc1BhcmFtSGFuZGxpbmdNb2RlID09PSBQYXJhbUhhbmRsaW5nTW9kZS5VUkxQYXJhbVdpbnMgfHwgc1BhcmFtSGFuZGxpbmdNb2RlID09PSBQYXJhbUhhbmRsaW5nTW9kZS5JbnNlcnRJblNlbE9wdCkge1xuXHRcdFx0dGhpcy5zUGFyYW1IYW5kbGluZ01vZGUgPSBzUGFyYW1IYW5kbGluZ01vZGU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc1BhcmFtSGFuZGxpbmdNb2RlID0gUGFyYW1IYW5kbGluZ01vZGUuU2VsVmFyV2luczsgLy8gZGVmYXVsdFxuXHRcdH1cblx0XHRpZiAoc01vZGUgPT09IE1vZGUuT0RhdGFWMikge1xuXHRcdFx0dGhpcy5fc01vZGUgPSBzTW9kZTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBzaGVsbCBuYXZpZ2F0aW9uIHNlcnZpY2UuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBOYXZpZ2F0aW9uIHNlcnZpY2Vcblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9nZXRBcHBOYXZpZ2F0aW9uU2VydmljZSgpIHtcblx0XHRyZXR1cm4gc2FwLnVzaGVsbC5Db250YWluZXIuZ2V0U2VydmljZShcIkNyb3NzQXBwbGljYXRpb25OYXZpZ2F0aW9uXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgc2hlbGwgbmF2aWdhdGlvbiBzZXJ2aWNlLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgTmF2aWdhdGlvbiBzZXJ2aWNlXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRhc3luYyBfZ2V0QXBwTmF2aWdhdGlvblNlcnZpY2VBc3luYygpOiBQcm9taXNlPE5hdmlnYXRpb24+IHtcblx0XHRjb25zdCB1c2hlbGxDb250YWluZXI6IENvbnRhaW5lciA9IHNhcC51aS5yZXF1aXJlKFwic2FwL3VzaGVsbC9Db250YWluZXJcIik7XG5cdFx0cmV0dXJuIHVzaGVsbENvbnRhaW5lclxuXHRcdFx0Py5nZXRTZXJ2aWNlQXN5bmMoXCJOYXZpZ2F0aW9uXCIpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob0Nyb3NzQXBwTmF2U2VydmljZTogb2JqZWN0KSB7XG5cdFx0XHRcdHJldHVybiBvQ3Jvc3NBcHBOYXZTZXJ2aWNlIGFzIE5hdmlnYXRpb247XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXI6IE5hdmlnYXRpb24gaXMgbm90IGF2YWlsYWJsZS5cIik7XG5cdFx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLk5PLlhBUFBTRVJWSUNFXCIpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSByZWZlcmVuY2UgdG8gdGhlIHJvdXRlciBvYmplY3QgZm9yIG5hdmlnYXRpb24gZm9yIHRoaXMgZ2l2ZW4gQ29udHJvbGxlci5cblx0ICpcblx0ICogQHBhcmFtIG9Db250cm9sbGVyIFRoZSByZWZlcmVuY2UgdG8gdGhlIENvbnRyb2xsZXIgZm9yIHdoaWNoIHRoZSBSb3V0ZXIgaW5zdGFuY2Ugc2hhbGwgYmUgZGV0ZXJtaW5lZC5cblx0ICogQHJldHVybnMgVGhlIFJvdXRlciBmb3IgdGhlIGdpdmVuIENvbnRyb2xsZXJcblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9nZXRSb3V0ZXIob0NvbnRyb2xsZXI6IENvbnRyb2xsZXIpIHtcblx0XHRyZXR1cm4gVUlDb21wb25lbnQuZ2V0Um91dGVyRm9yKG9Db250cm9sbGVyKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBpcyB0byBiZSB1c2VkIG9ubHkgYnkgRkUgVjIgdG8gZ2V0IGFjY2VzcyB0byB0b0V4dGVybmFsIHByb21pc2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBmbkNhbGxiYWNrIENhbGxiYWNrIHRvIGJlIGNhbGxlZCBieSAnbmF2aWdhdGUnIG1ldGhvZCBpbiBjYXNlIG9mIHRvRXh0ZXJuYWwgaXMgdXNlZCB0byBuYXZpZ2F0ZS5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdHJlZ2lzdGVyTmF2aWdhdGVDYWxsYmFjayhmbkNhbGxiYWNrOiBGdW5jdGlvbikge1xuXHRcdHRoaXMuX25hdmlnYXRlQ2FsbGJhY2sgPSBmbkNhbGxiYWNrO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRyaWdnZXJzIGEgY3Jvc3MtYXBwIG5hdmlnYXRpb24gYWZ0ZXIgc2F2aW5nIHRoZSBpbm5lciBhbmQgdGhlIGNyb3NzLWFwcCBzdGF0ZXMuIFRoZSBuYXZpZ2F0aW9uIG1vZGUgYmFzZWQgb25cblx0ICogPGNvZGU+c2FwLXVzaGVsbC1uZXh0LW5hdm1vZGU8L2NvZGU+IGlzIHRha2VuIGludG8gYWNjb3VudC4gSWYgc2V0IHRvIDxjb2RlPmV4cGxhY2U8L2NvZGU+IHRoZSBpbm5lciBhcHAgc3RhdGUgd2lsbCBub3QgYmUgY2hhbmdlZC5cblx0ICogPGI+Tm90ZTo8L2I+IFRoZSA8Y29kZT5zTmF2TW9kZTwvY29kZT4gYXJndW1lbnQgY2FuIGJlIHVzZWQgdG8gb3ZlcndyaXRlIHRoZSBTQVAgRmlvcmkgbGF1bmNocGFkIGRlZmF1bHQgbmF2aWdhdGlvbiBmb3Igb3BlbmluZyBhIFVSTFxuXHQgKiBpbi1wbGFjZSBvciBleC1wbGFjZS5cblx0ICogPGJyPlxuXHQgKiA8Yj5Ob2RlOjwvYj4gSWYgdGhlIDxjb2RlPm9FeHRlcm5hbEFwcERhdGE8L2NvZGU+IHBhcmFtZXRlciBpcyBub3Qgc3VwcGxpZWQsIHRoZSBleHRlcm5hbCBhcHAgZGF0YSB3aWxsIGJlIGNhbGN1bGF0ZWQgYmFzZWQgb25cblx0ICogdGhlIDxjb2RlPm9Jbm5lckFwcERhdGE8L2NvZGU+IGRhdGEuPGJyPlxuXHQgKiBTbWFydEZpbHRlckJhciBjb250cm9sIDxiPlBhcmFtZXRlcnM6PC9iPiA8dGFibGU+XG5cdCAqIDx0cj5cblx0ICogPHRkIGFsaWduPVwiY2VudGVyXCI+e29iamVjdH08L3RkPlxuXHQgKiA8dGQ+PGI+b0Vycm9yPC9iPjwvdGQ+XG5cdCAqIDx0ZD5OYXZFcnJvciBvYmplY3QgKGluc3RhbmNlIG9mIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5OYXZFcnJvcn0pIHRoYXQgZGVzY3JpYmVzIHdoaWNoIGtpbmQgb2YgZXJyb3Igb2NjdXJyZWQ8L3RkPlxuXHQgKiA8dHI+XG5cdCAqIDx0ZCBhbGlnbj1cImNlbnRlclwiPntzdHJpbmd9PC90ZD5cblx0ICogPHRkPjxiPm9FcnJvci5lcnJvckNvZGU8L2I+PC90ZD5cblx0ICogPHRkPkNvZGUgdG8gaWRlbnRpZnkgdGhlIGVycm9yPC90ZD5cblx0ICogPHRyPlxuXHQgKiA8dGQgYWxpZ249XCJjZW50ZXJcIj57c3RyaW5nfTwvdGQ+XG5cdCAqIDx0ZD48Yj5vRXJyb3IudHlwZTwvYj48L3RkPlxuXHQgKiA8dGQ+U2V2ZXJpdHkgb2YgdGhlIGVycm9yIChpbmZvL3dhcm5pbmcvZXJyb3IpPC90ZD5cblx0ICogPHRyPlxuXHQgKiA8dGQgYWxpZ249XCJjZW50ZXJcIj57YXJyYXl9PC90ZD5cblx0ICogPHRkPjxiPm9FcnJvci5wYXJhbXM8L2I+PC90ZD5cblx0ICogPHRkPkFuIGFycmF5IG9mIG9iamVjdHMgKHR5cGljYWxseSBzdHJpbmdzKSB0aGF0IGRlc2NyaWJlIGFkZGl0aW9uYWwgdmFsdWUgcGFyYW1ldGVycyByZXF1aXJlZCBmb3IgZ2VuZXJhdGluZyB0aGUgbWVzc2FnZTwvdGQ+XG5cdCAqIDwvdGFibGU+LlxuXHQgKlxuXHQgKiBAcHVibGljXG5cdCAqIEBmdW5jdGlvbiBuYXZpZ2F0ZVxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLm5hdmlnYXRpb24uTmF2aWdhdGlvbkhhbmRsZXIucHJvdG90eXBlXG5cdCAqIEBwYXJhbSBzU2VtYW50aWNPYmplY3QgTmFtZSBvZiB0aGUgc2VtYW50aWMgb2JqZWN0IG9mIHRoZSB0YXJnZXQgYXBwXG5cdCAqIEBwYXJhbSBzQWN0aW9uTmFtZSBOYW1lIG9mIHRoZSBhY3Rpb24gb2YgdGhlIHRhcmdldCBhcHBcblx0ICogQHBhcmFtIHZOYXZpZ2F0aW9uUGFyYW1ldGVycyBOYXZpZ2F0aW9uIHBhcmFtZXRlcnMgYXMgYW4gb2JqZWN0IHdpdGgga2V5L3ZhbHVlIHBhaXJzIG9yIGFzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHN1Y2ggYW4gb2JqZWN0LiBJZiBwYXNzZWQgYXMgYW4gb2JqZWN0LCB0aGUgcHJvcGVydGllcyBhcmUgbm90IGNoZWNrZWQgYWdhaW5zdCB0aGUgPGNvZGU+SXNQb3RlbnRpYWxTZW5zaXRpdmU8L2NvZGU+IG9yIDxjb2RlPk1lYXN1cmU8L2NvZGU+IHR5cGUuXG5cdCAqIEBwYXJhbSBvSW5uZXJBcHBEYXRhIE9iamVjdCBmb3Igc3RvcmluZyBjdXJyZW50IHN0YXRlIG9mIHRoZSBhcHBcblx0ICogQHBhcmFtIGZuT25FcnJvciBDYWxsYmFjayB0aGF0IGlzIGNhbGxlZCBpZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIG5hdmlnYXRpb24gPGJyPlxuXHQgKiBAcGFyYW0gb0V4dGVybmFsQXBwRGF0YSBPYmplY3QgZm9yIHN0b3JpbmcgdGhlIHN0YXRlIHdoaWNoIHdpbGwgYmUgZm9yd2FyZGVkIHRvIHRoZSB0YXJnZXQgY29tcG9uZW50LlxuXHQgKiBAcGFyYW0gb0V4dGVybmFsQXBwRGF0YS5wcmVzZW50YXRpb25WYXJpYW50IE9iamVjdCBjb250YWluaW5nIHRoZSBjdXJyZW50IHVpIHN0YXRlIG9mIHRoZSBhcHAgd2hpY2ggd2lsbCBiZSBmb3J3YXJkZWQgdG8gdGhlXG5cdCAqICAgICAgICB0YXJnZXQgY29tcG9uZW50LlxuXHQgKiBAcGFyYW0gb0V4dGVybmFsQXBwRGF0YS52YWx1ZVRleHRzIE9iamVjdCBjb250YWluaW5nIHZhbHVlIGRlc2NyaXB0aW9ucyB3aGljaCB3aWxsIGJlIGZvcndhcmRlZCB0byB0aGUgdGFyZ2V0IGNvbXBvbmVudC5cblx0ICogQHBhcmFtIG9FeHRlcm5hbEFwcERhdGEuc2VsZWN0aW9uVmFyaWFudCBTdHJpbmdpZmllZCBKU09OIG9iamVjdCwgd2hpY2ggd2lsbCBiZSBmb3J3YXJkZWQgdG8gdGhlIHRhcmdldCBjb21wb25lbnQuIElmIG5vdFxuXHQgKiAgICAgICAgcHJvdmlkZWQgdGhlIHNlbGVjdGlvblZhcmlhbnQgd2lsbCBiZSBjb25zdHJ1Y3RlZCBiYXNlZCBvbiB0aGUgdk5hdmlnYXRpb25QYXJhbWV0ZXJzLlxuXHQgKiBAcGFyYW0gc05hdk1vZGUgQXJndW1lbnQgaXMgdXNlZCB0byBvdmVyd3JpdGUgdGhlIEZMUC1jb25maWd1cmVkIHRhcmdldCBmb3Igb3BlbmluZyBhIFVSTC4gSWYgdXNlZCwgb25seSB0aGVcblx0ICogICAgICAgIDxjb2RlPmV4cGxhY2U8L2NvZGU+IG9yIDxjb2RlPmlucGxhY2U8L2NvZGU+IHZhbHVlcyBhcmUgYWxsb3dlZC4gQW55IG90aGVyIHZhbHVlIHdpbGwgbGVhZCB0byBhbiBleGNlcHRpb25cblx0ICogICAgICAgIDxjb2RlPk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfTkFWX01PREU8L2NvZGU+LlxuXHQgKiBAZXhhbXBsZSA8Y29kZT5cblx0ICogc2FwLnVpLmRlZmluZShbXCJzYXAvZmUvbmF2aWdhdGlvbi9OYXZpZ2F0aW9uSGFuZGxlclwiLCBcInNhcC9mZS9uYXZpZ2F0aW9uL1NlbGVjdGlvblZhcmlhbnRcIl0sIGZ1bmN0aW9uIChOYXZpZ2F0aW9uSGFuZGxlciwgU2VsZWN0aW9uVmFyaWFudCkge1xuXHQgKiBcdHZhciBvTmF2aWdhdGlvbkhhbmRsZXIgPSBuZXcgTmF2aWdhdGlvbkhhbmRsZXIob0NvbnRyb2xsZXIpO1xuXHQgKiBcdHZhciBzU2VtYW50aWNPYmplY3QgPSBcIlNhbGVzT3JkZXJcIjtcblx0ICogXHR2YXIgc0FjdGlvbk5hbWUgPSBcImNyZWF0ZVwiO1xuXHQgKlxuXHQgKiBcdC8vc2ltcGxlIHBhcmFtZXRlcnMgYXMgT2JqZWN0XG5cdCAqIFx0dmFyIHZOYXZpZ2F0aW9uUGFyYW1ldGVycyA9IHtcblx0ICogXHRcdENvbXBhbnlDb2RlIDogXCIwMDAxXCIsXG5cdCAqIFx0XHRDdXN0b21lciA6IFwiQzAwMDFcIlxuXHQgKiBcdH07XG5cdCAqXG5cdCAqIFx0Ly9vciBhcyBzZWxlY3Rpb24gdmFyaWFudFxuXHQgKiBcdHZhciBvU2VsZWN0aW9uVmFyaWFudCA9IG5ldyBTZWxlY3Rpb25WYXJpYW50KCk7XG5cdCAqXHQgb1NlbGVjdGlvblZhcmlhbnQuYWRkU2VsZWN0T3B0aW9uKFwiQ29tcGFueUNvZGVcIiwgXCJJXCIsIFwiRVFcIiwgXCIwMDAxXCIpO1xuXHQgKiBcdG9TZWxlY3Rpb25WYXJpYW50LmFkZFNlbGVjdE9wdGlvbihcIkN1c3RvbWVyXCIsIFwiSVwiLCBcIkVRXCIsIFwiQzAwMDFcIik7XG5cdCAqIFx0dk5hdmlnYXRpb25QYXJhbWV0ZXJzID0gb1NlbGVjdGlvblZhcmlhbnQudG9KU09OU3RyaW5nKCk7XG5cdCAqXG5cdCAqIFx0Ly9vciBkaXJlY3RseSBmcm9tIFNtYXJ0RmlsdGVyQmFyXG5cdCAqIFx0dk5hdmlnYXRpb25QYXJhbWV0ZXJzID0gb1NtYXJ0RmlsdGVyQmFyLmdldERhdGFTdWl0ZUZvcm1hdCgpO1xuXHQgKlxuXHQgKiBcdC8vYXBwIHN0YXRlIGZvciBiYWNrIG5hdmlnYXRpb25cblx0ICpcdCB2YXIgb0lubmVyQXBwRGF0YSA9IHtcblx0ICogXHRcdHNlbGVjdGlvblZhcmlhbnQgOiBvU21hcnRGaWx0ZXJCYXIuZ2V0RGF0YVN1aXRlRm9ybWF0KCksXG5cdCAqIFx0XHR0YWJsZVZhcmlhbnRJZCA6IG9TbWFydFRhYmxlLmdldEN1cnJlbnRWYXJpYW50SWQoKSxcblx0ICogXHRcdGN1c3RvbURhdGEgOiBvTXlDdXN0b21EYXRhXG5cdCAqIFx0fTtcblx0ICpcblx0ICogXHQvLyBjYWxsYmFjayBmdW5jdGlvbiBpbiBjYXNlIG9mIGVycm9yc1xuXHQgKiBcdHZhciBmbk9uRXJyb3IgPSBmdW5jdGlvbihvRXJyb3Ipe1xuXHQgKiBcdFx0dmFyIG9pMThuID0gb0NvbnRyb2xsZXIuZ2V0VmlldygpLmdldE1vZGVsKFwiaTE4blwiKS5nZXRSZXNvdXJjZUJ1bmRsZSgpO1xuXHQgKiBcdFx0b0Vycm9yLnNldFVJVGV4dCh7b2kxOG4gOiBvaTE4biwgc1RleHRLZXkgOiBcIk9VVEJPVU5EX05BVl9FUlJPUlwifSk7XG5cdCAqIFx0XHRvRXJyb3Iuc2hvd01lc3NhZ2VCb3goKTtcblx0ICogXHR9O1xuXHQgKlxuXHQgKiBcdG9OYXZpZ2F0aW9uSGFuZGxlci5uYXZpZ2F0ZShzU2VtYW50aWNPYmplY3QsIHNBY3Rpb25OYW1lLCB2TmF2aWdhdGlvblBhcmFtZXRlcnMsIG9Jbm5lckFwcERhdGEsIGZuT25FcnJvcik7XG5cdCAqIH0pO1xuXHQgKiA8L2NvZGU+XG5cdCAqL1xuXHRuYXZpZ2F0ZShcblx0XHRzU2VtYW50aWNPYmplY3Q6IHN0cmluZyxcblx0XHRzQWN0aW9uTmFtZTogc3RyaW5nLFxuXHRcdHZOYXZpZ2F0aW9uUGFyYW1ldGVyczogb2JqZWN0IHwgc3RyaW5nLFxuXHRcdG9Jbm5lckFwcERhdGE/OiBJbm5lckFwcERhdGEsXG5cdFx0Zm5PbkVycm9yPzogRnVuY3Rpb24sXG5cdFx0b0V4dGVybmFsQXBwRGF0YT86IHtcblx0XHRcdHZhbHVlVGV4dHM/OiBvYmplY3QgfCB1bmRlZmluZWQ7XG5cdFx0XHRwcmVzZW50YXRpb25WYXJpYW50Pzogb2JqZWN0IHwgdW5kZWZpbmVkO1xuXHRcdFx0c2VsZWN0aW9uVmFyaWFudD86IG9iamVjdCB8IHVuZGVmaW5lZDtcblx0XHR9LFxuXHRcdHNOYXZNb2RlPzogc3RyaW5nXG5cdCkge1xuXHRcdGxldCBzU2VsZWN0aW9uVmFyaWFudDogYW55LFxuXHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRvWEFwcERhdGFPYmo6IGFueSxcblx0XHRcdG9TdGFydHVwUGFyYW1ldGVycyxcblx0XHRcdGJFeFBsYWNlID0gZmFsc2UsXG5cdFx0XHRvVG1wRGF0YTogYW55ID0ge307XG5cdFx0Y29uc3Qgb05hdkhhbmRsZXI6IE5hdmlnYXRpb25IYW5kbGVyID0gdGhpcztcblxuXHRcdGNvbnN0IG9Db21wb25lbnREYXRhID0gdGhpcy5vQ29tcG9uZW50LmdldENvbXBvbmVudERhdGEoKTtcblx0XHQvKlxuXHRcdCAqIFRoZXJlIGFyZSBzb21lIHJhY2UgY29uZGl0aW9ucyB3aGVyZSB0aGUgb0NvbXBvbmVudERhdGEgbWF5IG5vdCBiZSBzZXQsIGZvciBleGFtcGxlIGluIGNhc2UgdGhlIFVTaGVsbCB3YXMgbm90IGluaXRpYWxpemVkIHByb3Blcmx5LiBUb1xuXHRcdCAqIG1ha2Ugc3VyZSB0aGF0IHdlIGRvIG5vdCBkdW1wIGhlcmUgd2l0aCBhbiBleGNlcHRpb24sIHdlIHRha2UgdGhpcyBzcGVjaWFsIGVycm9yIGhhbmRsaW5nIGJlaGF2aW9yOlxuXHRcdCAqL1xuXHRcdGlmIChvQ29tcG9uZW50RGF0YSkge1xuXHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzID0gb0NvbXBvbmVudERhdGEuc3RhcnR1cFBhcmFtZXRlcnM7XG5cblx0XHRcdGlmIChcblx0XHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzICYmXG5cdFx0XHRcdG9TdGFydHVwUGFyYW1ldGVyc1tcInNhcC11c2hlbGwtbmV4dC1uYXZtb2RlXCJdICYmXG5cdFx0XHRcdG9TdGFydHVwUGFyYW1ldGVyc1tcInNhcC11c2hlbGwtbmV4dC1uYXZtb2RlXCJdLmxlbmd0aCA+IDBcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBiRXhQbGFjZSA9IChKU09OLnBhcnNlKG9TdGFydHVwUGFyYW1ldGVyc1tcInNhcC11c2hlbGwtbmV4dC1uYXZtb2RlXCJdWzBdKSA9PT0gXCJleHBsYWNlXCIpO1xuXHRcdFx0XHRiRXhQbGFjZSA9IG9TdGFydHVwUGFyYW1ldGVyc1tcInNhcC11c2hlbGwtbmV4dC1uYXZtb2RlXCJdWzBdID09PSBcImV4cGxhY2VcIjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBvbmx5IG5hdi1tb2RlICdpbnBsYWNlJyBvciAnZXhwbGFjZScgYXJlIHN1cHBvcnRlZC4gQW55IG90aGVyIHZhbHVlIHdpbGwgbGVhZCB0byBhbiBleGNlcHRpb24uXG5cdFx0aWYgKHNOYXZNb2RlICYmIChzTmF2TW9kZSA9PT0gXCJpbnBsYWNlXCIgfHwgc05hdk1vZGUgPT09IFwiZXhwbGFjZVwiKSkge1xuXHRcdFx0YkV4UGxhY2UgPSBzTmF2TW9kZSA9PT0gXCJleHBsYWNlXCI7XG5cdFx0fSBlbHNlIGlmIChzTmF2TW9kZSkge1xuXHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9OQVZfTU9ERVwiKTtcblx0XHR9XG5cblx0XHRpZiAob0V4dGVybmFsQXBwRGF0YSA9PT0gdW5kZWZpbmVkIHx8IG9FeHRlcm5hbEFwcERhdGEgPT09IG51bGwpIHtcblx0XHRcdG9YQXBwRGF0YU9iaiA9IHt9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvWEFwcERhdGFPYmogPSBvRXh0ZXJuYWxBcHBEYXRhO1xuXHRcdH1cblxuXHRcdC8vIGZvciBuYXZpZ2F0aW9uIHdlIG5lZWQgVVJMIHBhcmFtZXRlcnMgKGxlZ2FjeSBuYXZpZ2F0aW9uKSBhbmQgc2FwLXhhcHAtc3RhdGUsIHRoZXJlZm9yZSB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgbWlzc2luZyBvbmUgZnJvbSB0aGVcblx0XHQvLyBwYXNzZWQgb25lXG5cdFx0aWYgKHR5cGVvZiB2TmF2aWdhdGlvblBhcmFtZXRlcnMgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdHNTZWxlY3Rpb25WYXJpYW50ID0gdk5hdmlnYXRpb25QYXJhbWV0ZXJzO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZOYXZpZ2F0aW9uUGFyYW1ldGVycyA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0Y29uc3Qgb0VucmljaGVkU2VsVmFyID0gdGhpcy5fc3BsaXRJbmJvdW5kTmF2aWdhdGlvblBhcmFtZXRlcnMoXG5cdFx0XHRcdG5ldyBTZWxlY3Rpb25WYXJpYW50KCksXG5cdFx0XHRcdHZOYXZpZ2F0aW9uUGFyYW1ldGVycyxcblx0XHRcdFx0W11cblx0XHRcdCkub05hdmlnYXRpb25TZWxWYXI7XG5cdFx0XHRzU2VsZWN0aW9uVmFyaWFudCA9IG9FbnJpY2hlZFNlbFZhci50b0pTT05TdHJpbmcoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9JTlBVVFwiKTtcblx0XHR9XG5cblx0XHRvVG1wRGF0YS5zZWxlY3Rpb25WYXJpYW50ID0gbmV3IFNlbGVjdGlvblZhcmlhbnQoc1NlbGVjdGlvblZhcmlhbnQpO1xuXHRcdGlmICh0eXBlb2Ygdk5hdmlnYXRpb25QYXJhbWV0ZXJzID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRvVG1wRGF0YS5zZWxlY3Rpb25WYXJpYW50ID0gdGhpcy5fcmVtb3ZlVGVjaG5pY2FsUGFyYW1ldGVycyhvVG1wRGF0YS5zZWxlY3Rpb25WYXJpYW50KTtcblx0XHR9XG5cdFx0b1RtcERhdGEuc2VsZWN0aW9uVmFyaWFudCA9IG9UbXBEYXRhLnNlbGVjdGlvblZhcmlhbnQgJiYgb1RtcERhdGEuc2VsZWN0aW9uVmFyaWFudC50b0pTT05PYmplY3QoKTtcblx0XHRvVG1wRGF0YSA9IHRoaXMuX3JlbW92ZU1lYXN1cmVCYXNlZEluZm9ybWF0aW9uKG9UbXBEYXRhKTsgLy8gcmVtb3ZlIGV2ZW50dWFsIG1lYXN1cmVzXG5cdFx0b1RtcERhdGEgPSB0aGlzLl9jaGVja0lzUG90ZW50aWFsbHlTZW5zaXRpdmUob1RtcERhdGEpOyAvLyByZW1vdmUgZXZlbnR1YWwgc2Vuc2l0aXZlIGRhdGFcblxuXHRcdGlmIChvVG1wRGF0YS5zZWxlY3Rpb25WYXJpYW50KSB7XG5cdFx0XHRtUGFyYW1ldGVycyA9IHRoaXMuX2dldFVSTFBhcmFtZXRlcnNGcm9tU2VsZWN0aW9uVmFyaWFudChuZXcgU2VsZWN0aW9uVmFyaWFudChvVG1wRGF0YS5zZWxlY3Rpb25WYXJpYW50KSk7XG5cdFx0XHRzU2VsZWN0aW9uVmFyaWFudCA9IG5ldyBTZWxlY3Rpb25WYXJpYW50KG9UbXBEYXRhLnNlbGVjdGlvblZhcmlhbnQpLnRvSlNPTlN0cmluZygpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtUGFyYW1ldGVycyA9IHt9O1xuXHRcdFx0c1NlbGVjdGlvblZhcmlhbnQgPSBudWxsO1xuXHRcdH1cblxuXHRcdGNvbnN0IG9OYXZBcmd1bWVudHM6IGFueSA9IHtcblx0XHRcdHRhcmdldDoge1xuXHRcdFx0XHRzZW1hbnRpY09iamVjdDogc1NlbWFudGljT2JqZWN0LFxuXHRcdFx0XHRhY3Rpb246IHNBY3Rpb25OYW1lXG5cdFx0XHR9LFxuXHRcdFx0cGFyYW1zOiBtUGFyYW1ldGVycyB8fCB7fVxuXHRcdH07XG5cblx0XHRjb25zdCBmbk5hdmlnYXRlID0gZnVuY3Rpb24gKG9Dcm9zc0FwcE5hdlNlcnZpY2U6IGFueSkge1xuXHRcdFx0aWYgKCFvWEFwcERhdGFPYmouc2VsZWN0aW9uVmFyaWFudCkge1xuXHRcdFx0XHRvWEFwcERhdGFPYmouc2VsZWN0aW9uVmFyaWFudCA9IHNTZWxlY3Rpb25WYXJpYW50O1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBmbk5hdkV4cGxhY2UgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGNvbnN0IHNOZXdIcmVmUHJvbWlzZSA9IG9Dcm9zc0FwcE5hdlNlcnZpY2UuZ2V0SHJlZihvTmF2QXJndW1lbnRzLCBvTmF2SGFuZGxlci5vQ29tcG9uZW50KTtcblx0XHRcdFx0c05ld0hyZWZQcm9taXNlXG5cdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKHNOZXdIcmVmOiBhbnkpIHtcblx0XHRcdFx0XHRcdG9wZW5XaW5kb3coc05ld0hyZWYpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmV0aXJldmluZyBocmVmRm9yRXh0ZXJuYWwgOiBcIiArIG9FcnJvcik7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9O1xuXG5cdFx0XHRvWEFwcERhdGFPYmogPSBvTmF2SGFuZGxlci5fcmVtb3ZlTWVhc3VyZUJhc2VkSW5mb3JtYXRpb24ob1hBcHBEYXRhT2JqKTtcblx0XHRcdHJldHVybiBvTmF2SGFuZGxlci5fZm5TYXZlQXBwU3RhdGVBc3luYyhvWEFwcERhdGFPYmosIGZuT25FcnJvcikudGhlbihmdW5jdGlvbiAob1NhdmVBcHBTdGF0ZVJldHVybjogYW55KSB7XG5cdFx0XHRcdGlmIChvU2F2ZUFwcFN0YXRlUmV0dXJuKSB7XG5cdFx0XHRcdFx0b05hdkFyZ3VtZW50cy5hcHBTdGF0ZUtleSA9IG9TYXZlQXBwU3RhdGVSZXR1cm4uYXBwU3RhdGVLZXk7XG5cblx0XHRcdFx0XHQvLyBSZW1hcms6XG5cdFx0XHRcdFx0Ly8gVGhlIENyb3NzIEFwcCBTZXJ2aWNlIHRha2VzIGNhcmUgb2YgZW5jb2RpbmcgcGFyYW1ldGVyIGtleXMgYW5kIHZhbHVlcy4gRXhhbXBsZTpcblx0XHRcdFx0XHQvLyBtUGFyYW1zID0geyBcIiRAJVwiIDogXCImLz1cIiB9IHJlc3VsdHMgaW4gdGhlIFVSTCBwYXJhbWV0ZXIgJTI1MjQlMjU0MCUyNTI1PSUyNTI2JTI1MkYlMjUzRFxuXHRcdFx0XHRcdC8vIE5vdGUgdGhlIGRvdWJsZSBlbmNvZGluZywgdGhpcyBpcyBjb3JyZWN0LlxuXG5cdFx0XHRcdFx0Ly8gdG9FeHRlcm5hbCBzZXRzIHNhcC14YXBwLXN0YXRlIGluIHRoZSBVUkwgaWYgYXBwU3RhdGVLZXkgaXMgcHJvdmlkZWQgaW4gb05hdkFyZ3VtZW50c1xuXHRcdFx0XHRcdC8vIHRvRXh0ZXJuYWwgaGFzIGlzc3VlcyBvbiBzdGlja3kgYXBwcyBGSU9SSVRFQ0hQMS0xNDQwMCwgdGVtcCBmaXggdXNpbmcgaHJlZkZvckV4dGVybmFsXG5cdFx0XHRcdFx0aWYgKHNOYXZNb2RlID09IFwiZXhwbGFjZVwiKSB7XG5cdFx0XHRcdFx0XHRmbk5hdkV4cGxhY2UoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29uc3QgcHRvRXh0ID0gb0Nyb3NzQXBwTmF2U2VydmljZS5uYXZpZ2F0ZShvTmF2QXJndW1lbnRzLCBvTmF2SGFuZGxlci5vQ29tcG9uZW50KTtcblx0XHRcdFx0XHRcdC8vIFRPRE86IFRoaXMgaXMganVzdCBhIHRlbXBvcmFyeSBzb2x1dGlvbiB0byBhbGxvdyBGRSBWMiB0byB1c2UgdG9FeHRlcm5hbCBwcm9taXNlLlxuXHRcdFx0XHRcdFx0aWYgKG9OYXZIYW5kbGVyLl9uYXZpZ2F0ZUNhbGxiYWNrKSB7XG5cdFx0XHRcdFx0XHRcdG9OYXZIYW5kbGVyLl9uYXZpZ2F0ZUNhbGxiYWNrKHB0b0V4dCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IC8vIGVsc2UgOiBlcnJvciB3YXMgYWxyZWFkeSByZXBvcnRlZFxuXHRcdFx0fSk7XG5cdFx0fTtcblx0XHRjb25zdCBmblN0b3JlQW5kTmF2aWdhdGUgPSBmdW5jdGlvbiAob0Nyb3NzQXBwTmF2U2VydmljZTogYW55KSB7XG5cdFx0XHRvTmF2SGFuZGxlclxuXHRcdFx0XHQuc3RvcmVJbm5lckFwcFN0YXRlQXN5bmMob0lubmVyQXBwRGF0YSBhcyBhbnksIHRydWUpXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChzQXBwU3RhdGVLZXk6IGFueSkge1xuXHRcdFx0XHRcdGlmIChzQXBwU3RhdGVLZXkpIHtcblx0XHRcdFx0XHRcdG9OYXZIYW5kbGVyLnJlcGxhY2VIYXNoKHNBcHBTdGF0ZUtleSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBmbk5hdmlnYXRlKG9Dcm9zc0FwcE5hdlNlcnZpY2UpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0aWYgKGZuT25FcnJvcikge1xuXHRcdFx0XHRcdFx0Zm5PbkVycm9yKG9FcnJvcik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHR9O1xuXHRcdGlmIChzTmF2TW9kZSkge1xuXHRcdFx0b05hdkFyZ3VtZW50cy5wYXJhbXNbXCJzYXAtdXNoZWxsLW5hdm1vZGVcIl0gPSBiRXhQbGFjZSA/IFwiZXhwbGFjZVwiIDogXCJpbnBsYWNlXCI7XG5cdFx0fVxuXHRcdG9OYXZIYW5kbGVyXG5cdFx0XHQuX2dldEFwcE5hdmlnYXRpb25TZXJ2aWNlQXN5bmMoKVxuXHRcdFx0LnRoZW4oYXN5bmMgZnVuY3Rpb24gKG9Dcm9zc0FwcE5hdlNlcnZpY2U6IE5hdmlnYXRpb24pIHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRjb25zdCBvVGFyZ2V0cyA9IGF3YWl0IChvQ3Jvc3NBcHBOYXZTZXJ2aWNlLmlzTmF2aWdhdGlvblN1cHBvcnRlZChcblx0XHRcdFx0XHRcdFtvTmF2QXJndW1lbnRzXSxcblx0XHRcdFx0XHRcdG9OYXZIYW5kbGVyLm9Db21wb25lbnRcblx0XHRcdFx0XHQpIGFzIHVua25vd24gYXMgUHJvbWlzZTx7IHN1cHBvcnRlZDogYm9vbGVhbiB9W10+KTtcblx0XHRcdFx0XHRpZiAob1RhcmdldHNbMF0uc3VwcG9ydGVkKSB7XG5cdFx0XHRcdFx0XHRpZiAoIWJFeFBsYWNlKSB7XG5cdFx0XHRcdFx0XHRcdGZuU3RvcmVBbmROYXZpZ2F0ZShvQ3Jvc3NBcHBOYXZTZXJ2aWNlKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGZuTmF2aWdhdGUob0Nyb3NzQXBwTmF2U2VydmljZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChmbk9uRXJyb3IpIHtcblx0XHRcdFx0XHRcdC8vIGludGVudCBpcyBub3Qgc3VwcG9ydGVkXG5cdFx0XHRcdFx0XHRjb25zdCBvRXJyb3IgPSBuZXcgTmF2RXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5pc0ludGVudFN1cHBvcnRlZC5ub3RTdXBwb3J0ZWRcIik7XG5cdFx0XHRcdFx0XHRmbk9uRXJyb3Iob0Vycm9yKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0XHRcdGlmIChmbk9uRXJyb3IpIHtcblx0XHRcdFx0XHRcdC8vIHRlY2huaWNhbCBlcnJvcjogY291bGQgbm90IGRldGVybWluZSBpZiBpbnRlbnQgaXMgc3VwcG9ydGVkXG5cdFx0XHRcdFx0XHRjb25zdCBvRXJyb3IgPSBvTmF2SGFuZGxlci5fY3JlYXRlVGVjaG5pY2FsRXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5pc0ludGVudFN1cHBvcnRlZC5mYWlsZWRcIik7XG5cdFx0XHRcdFx0XHRmbk9uRXJyb3Iob0Vycm9yKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0aWYgKGZuT25FcnJvcikge1xuXHRcdFx0XHRcdGZuT25FcnJvcihvRXJyb3IpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQYXJzZXMgdGhlIGluY29taW5nIFVSTCBhbmQgcmV0dXJucyBhIFByb21pc2UuIElmIHRoaXMgbWV0aG9kIGRldGVjdHMgYSBiYWNrIG5hdmlnYXRpb24sIHRoZSBpbm5lciBhcHAgc3RhdGUgaXMgcmV0dXJuZWQgaW4gdGhlIHJlc29sdmVkXG5cdCAqIFByb21pc2UuIE90aGVyd2lzZSBzdGFydHVwIHBhcmFtZXRlcnMgd2lsbCBiZSBtZXJnZWQgaW50byB0aGUgYXBwIHN0YXRlIHByb3ZpZGVkIGJ5IGNyb3NzIGFwcCBuYXZpZ2F0aW9uLCBhbmQgYSBjb21iaW5lZCBhcHAgc3RhdGUgd2lsbCBiZVxuXHQgKiByZXR1cm5lZC4gVGhlIGNvbmZsaWN0IHJlc29sdXRpb24gY2FuIGJlIGluZmx1ZW5jZWQgd2l0aCBzUGFyYW1IYW5kbGluZ01vZGUgZGVmaW5lZCBpbiB0aGUgY29uc3RydWN0b3IuXG5cdCAqXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSBvYmplY3QgdG8gbW9uaXRvciB3aGVuIGFsbCB0aGUgYWN0aW9ucyBvZiB0aGUgZnVuY3Rpb24gaGF2ZSBiZWVuIGV4ZWN1dGVkLiBJZiB0aGUgZXhlY3V0aW9uIGlzIHN1Y2Nlc3NmdWwsIHRoZVxuXHQgKiAgICAgICAgICBleHRyYWN0ZWQgYXBwIHN0YXRlLCB0aGUgc3RhcnR1cCBwYXJhbWV0ZXJzLCBhbmQgdGhlIHR5cGUgb2YgbmF2aWdhdGlvbiBhcmUgcmV0dXJuZWQsIHNlZSBhbHNvIHRoZSBleGFtcGxlIGFib3ZlLiBUaGUgYXBwIHN0YXRlIGlzXG5cdCAqICAgICAgICAgIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246XG5cdCAqICAgICAgICAgIDx1bD5cblx0ICogICAgICAgICAgPGxpPjxjb2RlPm9BcHBEYXRhLm9TZWxlY3Rpb25WYXJpYW50PC9jb2RlPjogQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLlNlbGVjdGlvblZhcmlhbnR9XG5cdCAqICAgICAgICAgIGNvbnRhaW5pbmcgb25seSBwYXJhbWV0ZXJzL3NlbGVjdCBvcHRpb25zIHRoYXQgYXJlIHJlbGF0ZWQgdG8gbmF2aWdhdGlvbjwvbGk+XG5cdCAqICAgICAgICAgIDxsaT48Y29kZT5vQXBwRGF0YS5zZWxlY3Rpb25WYXJpYW50PC9jb2RlPjogVGhlIG5hdmlnYXRpb24tcmVsYXRlZCBzZWxlY3Rpb24gdmFyaWFudCBhcyBhIEpTT04tZm9ybWF0dGVkIHN0cmluZzwvbGk+XG5cdCAqICAgICAgICAgIDxsaT48Y29kZT5vQXBwRGF0YS5vRGVmYXVsdGVkU2VsZWN0aW9uVmFyaWFudDwvY29kZT46IEFuIGluc3RhbmNlIG9mXG5cdCAqICAgICAgICAgIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5TZWxlY3Rpb25WYXJpYW50fSBjb250YWluaW5nIG9ubHkgdGhlIHBhcmFtZXRlcnMvc2VsZWN0IG9wdGlvbnMgdGhhdCBhcmUgc2V0IGJ5IHVzZXJcblx0ICogICAgICAgICAgZGVmYXVsdCBkYXRhPC9saT5cblx0ICogICAgICAgICAgPGxpPjxjb2RlPm9BcHBEYXRhLmJOYXZTZWxWYXJIYXNEZWZhdWx0c09ubHk8L2NvZGU+OiBBIEJvb2xlYW4gZmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIG9ubHkgZGVmYXVsdGVkIHBhcmFtZXRlcnMgYW5kIG5vXG5cdCAqICAgICAgICAgIG5hdmlnYXRpb24gcGFyYW1ldGVycyBhcmUgcHJlc2VudC48YnI+XG5cdCAqICAgICAgICAgIDxiPk5vdGU6PC9iPiBJZiBubyBuYXZpZ2F0aW9uIHBhcmFtZXRlcnMgYXJlIGF2YWlsYWJsZSwgPGNvZGU+Yk5hdlNlbFZhckhhc0RlZmF1bHRzT25seTwvY29kZT4gaXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LFxuXHQgKiAgICAgICAgICBldmVuIHRob3VnaCBwYXJhbWV0ZXJzIHdpdGhvdXQgZGVmYXVsdCBtaWdodCBiZSBhdmFpbGFibGUgYXMgd2VsbC48L2xpPlxuXHQgKiAgICAgICAgICA8L3VsPlxuXHQgKiAgICAgICAgICBJZiB0aGUgbmF2aWdhdGlvbi1yZWxhdGVkIHNlbGVjdGlvbiB2YXJpYW50IGlzIGVtcHR5LCBpdCBpcyByZXBsYWNlZCBieSBhIGNvcHkgb2YgdGhlIGRlZmF1bHRlZCBzZWxlY3Rpb24gdmFyaWFudC48YnI+XG5cdCAqICAgICAgICAgIFRoZSBuYXZpZ2F0aW9uIHR5cGUgaXMgYW4gZW51bWVyYXRpb24gdHlwZSBvZiB0eXBlIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5OYXZUeXBlfSAocG9zc2libGUgdmFsdWVzIGFyZVxuXHQgKiAgICAgICAgICBpbml0aWFsLCBVUkxQYXJhbXMsIHhBcHBTdGF0ZSwgYW5kIGlBcHBTdGF0ZSkuPGJyPlxuXHQgKiAgICAgICAgICA8Yj5Ob3RlOjwvYj4gSWYgdGhlIG5hdmlnYXRpb24gdHlwZSBpcyB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uTmF2VHlwZS5pQXBwU3RhdGV9IG9BcHBEYXRhIGhhcyB0d29cblx0ICogICAgICAgICAgYWRkaXRpb25hbCBwcm9wZXJ0aWVzXG5cdCAqICAgICAgICAgIDx1bD5cblx0ICogICAgICAgICAgPGxpPjxjb2RlPm9BcHBEYXRhLnRhYmxlVmFyaWFudElkPC9jb2RlPjwvbGk+XG5cdCAqICAgICAgICAgIDxsaT48Y29kZT5vQXBwRGF0YS5jdXN0b21EYXRhPC9jb2RlPjwvbGk+XG5cdCAqICAgICAgICAgIDwvdWw+XG5cdCAqICAgICAgICAgIHdoaWNoIHJldHVybiB0aGUgaW5uZXIgYXBwIGRhdGEgYXMgc3RvcmVkIGluIHtAbGluayAjLm5hdmlnYXRlIG5hdmlnYXRlfSBvciB7QGxpbmsgIy5zdG9yZUlubmVyQXBwU3RhdGVBc3luYyBzdG9yZUlubmVyQXBwU3RhdGVBc3luY30uXG5cdCAqICAgICAgICAgIDxjb2RlPm9BcHBEYXRhLm9EZWZhdWx0ZWRTZWxlY3Rpb25WYXJpYW50PC9jb2RlPiBpcyBhbiBlbXB0eSBzZWxlY3Rpb24gdmFyaWFudCBhbmRcblx0ICogICAgICAgICAgPGNvZGU+b0FwcERhdGEuYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seTwvY29kZT4gaXMgPGNvZGU+ZmFsc2U8L2NvZGU+IGluIHRoaXMgY2FzZS48YnI+XG5cdCAqICAgICAgICAgIDxiPk5vdGU6PC9iPiBJZiB0aGUgbmF2aWdhdGlvbiB0eXBlIGlzIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5OYXZUeXBlLmluaXRpYWx9IG9BcHBEYXRhIGlzIGFuIGVtcHR5IG9iamVjdCE8YnI+XG5cdCAqICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycywgYW4gZXJyb3Igb2JqZWN0IG9mIHR5cGUge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdkVycm9yfSwgVVJMIHBhcmFtZXRlcnMgKGlmIGF2YWlsYWJsZSlcblx0ICogICAgICAgICAgYW5kIHRoZSB0eXBlIG9mIG5hdmlnYXRpb24gYXJlIHJldHVybmVkLlxuXHQgKiBAcHVibGljXG5cdCAqIEBleGFtcGxlIDxjb2RlPlxuXHQgKiBzYXAudWkuZGVmaW5lKFtcInNhcC9mZS9uYXZpZ2F0aW9uL05hdmlnYXRpb25IYW5kbGVyXCJdLCBmdW5jdGlvbiAoTmF2aWdhdGlvbkhhbmRsZXIpIHtcblx0ICogXHR2YXIgb05hdmlnYXRpb25IYW5kbGVyID0gbmV3IE5hdmlnYXRpb25IYW5kbGVyKG9Db250cm9sbGVyKTtcblx0ICogXHR2YXIgb1BhcnNlTmF2aWdhdGlvblByb21pc2UgPSBvTmF2aWdhdGlvbkhhbmRsZXIucGFyc2VOYXZpZ2F0aW9uKCk7XG5cdCAqXG5cdCAqIFx0b1BhcnNlTmF2aWdhdGlvblByb21pc2UuZG9uZShmdW5jdGlvbihvQXBwRGF0YSwgb1N0YXJ0dXBQYXJhbWV0ZXJzLCBzTmF2VHlwZSl7XG5cdCAqIFx0XHRcdG9TbWFydEZpbHRlckJhci5zZXREYXRhU3VpdGVGb3JtYXQob0FwcERhdGEuc2VsZWN0aW9uVmFyaWFudCk7XG5cdCAqIFx0XHRcdC8vIG9BcHBEYXRhLm9TZWxlY3Rpb25WYXJpYW50IGNhbiBiZSB1c2VkIHRvIG1hbmlwdWxhdGUgdGhlIHNlbGVjdGlvbiB2YXJpYW50XG5cdCAqIFx0XHRcdC8vIG9BcHBEYXRhLm9EZWZhdWx0ZWRTZWxlY3Rpb25WYXJpYW50IGNvbnRhaW5zIHRoZSBwYXJhbWV0ZXJzIHdoaWNoIGFyZSBzZXQgYnkgdXNlciBkZWZhdWx0c1xuXHQgKiBcdFx0XHQvLyBvQXBwRGF0YS5iTmF2U2VsVmFySGFzRGVmYXVsdHNPbmx5IGluZGljYXRlcyB3aGV0aGVyIG9ubHkgZGVmYXVsdGVkIHBhcmFtZXRlcnMgYW5kIG5vIG5hdmlnYXRpb24gcGFyYW1ldGVycyBhcmUgcHJlc2VudFxuXHQgKiBcdH0pO1xuXHQgKiBcdG9QYXJzZU5hdmlnYXRpb25Qcm9taXNlLmZhaWwoZnVuY3Rpb24ob0Vycm9yLCBvVVJMUGFyYW1ldGVycywgc05hdlR5cGUpe1xuXHQgKiBcdFx0Ly8gaWYgZS5nLiB0aGUgeGFwcCBzdGF0ZSBjb3VsZCBub3QgYmUgbG9hZGVkLCBuZXZlcnRoZWxlc3MgdGhlcmUgbWF5IGJlIFVSTCBwYXJhbWV0ZXJzIGF2YWlsYWJsZVxuXHQgKiBcdFx0Ly9zb21lIGVycm9yIGhhbmRsaW5nXG5cdCAqIFx0fSk7XG5cdCAqIH0pO1xuXHQgKiA8L2NvZGU+XG5cdCAqL1xuXHRwYXJzZU5hdmlnYXRpb24oKTogb2JqZWN0IHtcblx0XHRjb25zdCBzQXBwSGFzaCA9IEhhc2hDaGFuZ2VyLmdldEluc3RhbmNlKCkuZ2V0SGFzaCgpO1xuXHRcdC8qXG5cdFx0ICogdXNlIC5nZXRIYXNoKCkgaGVyZSBpbnN0ZWFkIG9mIC5nZXRBcHBIYXNoKCkgdG8gYWxzbyBiZSBhYmxlIGRlYWxpbmcgd2l0aCBlbnZpcm9ubWVudHMgd2hlcmUgb25seSBTQVBVSTUgaXMgbG9hZGVkIGFuZCB0aGUgVVNoZWxsIGlzXG5cdFx0ICogbm90IGluaXRpYWxpemVkIHByb3Blcmx5LlxuXHRcdCAqL1xuXHRcdGNvbnN0IHNJQXBwU3RhdGUgPSB0aGlzLl9nZXRJbm5lckFwcFN0YXRlS2V5KHNBcHBIYXNoKTtcblxuXHRcdGxldCBvQ29tcG9uZW50RGF0YSA9IHRoaXMub0NvbXBvbmVudC5nZXRDb21wb25lbnREYXRhKCk7XG5cdFx0Lypcblx0XHQgKiBUaGVyZSBhcmUgc29tZSByYWNlIGNvbmRpdGlvbnMgd2hlcmUgdGhlIG9Db21wb25lbnREYXRhIG1heSBub3QgYmUgc2V0LCBmb3IgZXhhbXBsZSBpbiBjYXNlIHRoZSBVU2hlbGwgd2FzIG5vdCBpbml0aWFsaXplZCBwcm9wZXJseS4gVG9cblx0XHQgKiBtYWtlIHN1cmUgdGhhdCB3ZSBkbyBub3QgZHVtcCBoZXJlIHdpdGggYW4gZXhjZXB0aW9uLCB3ZSB0YWtlIHRoaXMgc3BlY2lhbCBlcnJvciBoYW5kbGluZyBiZWhhdmlvcjpcblx0XHQgKi9cblx0XHRpZiAob0NvbXBvbmVudERhdGEgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0TG9nLndhcm5pbmcoXCJUaGUgbmF2aWdhdGlvbiBDb21wb25lbnQncyBkYXRhIHdhcyBub3Qgc2V0IHByb3Blcmx5OyBhc3N1bWluZyBpbnN0ZWFkIHRoYXQgbm8gcGFyYW1ldGVycyBhcmUgcHJvdmlkZWQuXCIpO1xuXHRcdFx0b0NvbXBvbmVudERhdGEgPSB7fTtcblx0XHR9XG5cblx0XHQvLyBSZW1hcms6XG5cdFx0Ly8gVGhlIHN0YXJ0dXAgcGFyYW1ldGVycyBhcmUgYWxyZWFkeSBkZWNvZGVkLiBFeGFtcGxlOlxuXHRcdC8vIFRoZSBvcmlnaW5hbCBVUkwgcGFyYW1ldGVyICUyNTI0JTI1NDAlMjUyNT0lMjUyNiUyNTJGJTI1M0QgcmVzdWx0cyBpbiBvU3RhcnR1cFBhcmFtZXRlcnMgPSB7IFwiJEAlXCIgOiBcIiYvPVwiIH1cblx0XHQvLyBOb3RlIHRoZSBkb3VibGUgZW5jb2RpbmcgaW4gdGhlIFVSTCwgdGhpcyBpcyBjb3JyZWN0LiBBbiBVUkwgcGFyYW1ldGVyIGxpa2UgeHl6PSUyNSBjYXVzZXMgYW4gXCJVUkkgbWFsZm9ybWVkXCIgZXJyb3IuXG5cdFx0Ly8gSWYgdGhlIGRlY29kZWQgdmFsdWUgc2hvdWxkIGJlIGUuZy4gXCIlMjVcIiwgdGhlIHBhcmFtZXRlciBpbiB0aGUgVVJMIG5lZWRzIHRvIGJlOiB4eXo9JTI1MjUyNVxuXHRcdGNvbnN0IG9TdGFydHVwUGFyYW1ldGVycyA9IG9Db21wb25lbnREYXRhLnN0YXJ0dXBQYXJhbWV0ZXJzO1xuXHRcdGNvbnN0IGh5YnJpZElBcHBTdGF0ZUtleVBhcmFtczogc3RyaW5nIHwgdW5kZWZpbmVkID0gb1N0YXJ0dXBQYXJhbWV0ZXJzPy5bSFlCUklEX0lBUFBfU1RBVEVfS0VZXT8uWzBdO1xuXHRcdGNvbnN0IGh5YnJpZERlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCk7XG5cdFx0bGV0IGlBcHBTdGF0ZUh5YnJpZERlZmVycmVkOiBqUXVlcnkuRGVmZXJyZWQgfCB1bmRlZmluZWQ7XG5cdFx0aWYgKGh5YnJpZElBcHBTdGF0ZUtleVBhcmFtcyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpQXBwU3RhdGVIeWJyaWREZWZlcnJlZCA9IHRoaXMuX2xvYWRBcHBTdGF0ZShoeWJyaWRJQXBwU3RhdGVLZXlQYXJhbXMsIGh5YnJpZERlZmVycmVkLCBOYXZUeXBlLmh5YnJpZCk7XG5cdFx0fVxuXG5cdFx0bGV0IGFEZWZhdWx0ZWRQYXJhbWV0ZXJzOiBhbnkgPSBbXTtcblx0XHRpZiAoXG5cdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMgJiZcblx0XHRcdG9TdGFydHVwUGFyYW1ldGVyc1tERUZBVUxURURfUEFSQU1FVEVSX1BST1BFUlRZXSAmJlxuXHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzW0RFRkFVTFRFRF9QQVJBTUVURVJfUFJPUEVSVFldLmxlbmd0aCA+IDBcblx0XHQpIHtcblx0XHRcdGFEZWZhdWx0ZWRQYXJhbWV0ZXJzID0gSlNPTi5wYXJzZShvU3RhcnR1cFBhcmFtZXRlcnNbREVGQVVMVEVEX1BBUkFNRVRFUl9QUk9QRVJUWV1bMF0pO1xuXHRcdH1cblxuXHRcdGNvbnN0IG9NeURlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCk7XG5cblx0XHRjb25zdCBvTmF2SGFuZGxlciA9IHRoaXM7XG5cdFx0Y29uc3QgcGFyc2VVcmxQYXJhbXMgPSBmdW5jdGlvbiAob1N1YlN0YXJ0dXBQYXJhbWV0ZXJzOiBhbnksIGFTdWJEZWZhdWx0ZWRQYXJhbWV0ZXJzOiBhbnksIG9TdWJNeURlZmVycmVkOiBhbnksIHNOYXZUeXBlOiBhbnkpIHtcblx0XHRcdC8vIHN0YW5kYXJkIFVSTCBuYXZpZ2F0aW9uXG5cdFx0XHRjb25zdCBvU2VsVmFycyA9IG9OYXZIYW5kbGVyLl9zcGxpdEluYm91bmROYXZpZ2F0aW9uUGFyYW1ldGVycyhcblx0XHRcdFx0bmV3IFNlbGVjdGlvblZhcmlhbnQoKSxcblx0XHRcdFx0b1N1YlN0YXJ0dXBQYXJhbWV0ZXJzLFxuXHRcdFx0XHRhU3ViRGVmYXVsdGVkUGFyYW1ldGVyc1xuXHRcdFx0KTtcblx0XHRcdC8vIEZvciBzY2VuYXJpbywgd2hlcmUgb25seSBoeWJyaWRJQXBwU3RhdGVLZXkgaXMgcGFydCBvZiB1cmxQYXJhbXMsIHdlIGlnbm9yZSB0aGlzIGNvbmRpdGlvblxuXHRcdFx0aWYgKG9TZWxWYXJzLm9OYXZpZ2F0aW9uU2VsVmFyLmlzRW1wdHkoKSAmJiBvU2VsVmFycy5vRGVmYXVsdGVkU2VsVmFyLmlzRW1wdHkoKSAmJiBzTmF2VHlwZSAhPT0gTmF2VHlwZS5oeWJyaWQpIHtcblx0XHRcdFx0Ly8gU3RhcnR1cCBwYXJhbWV0ZXJzIGNvbnRhaW4gb25seSB0ZWNobmljYWwgcGFyYW1ldGVycyAoU0FQIHN5c3RlbSkgd2hpY2ggd2VyZSBmaWx0ZXJlZCBvdXQuXG5cdFx0XHRcdC8vIG9OYXZpZ2F0aW9uU2VsVmFyIGFuZCBvRGVmYXVsdGVkU2VsVmFyIGFyZSBlbXB0eS5cblx0XHRcdFx0Ly8gVGh1cywgY29uc2lkZXIgdGhpcyB0eXBlIG9mIG5hdmlnYXRpb24gYXMgYW4gaW5pdGlhbCBuYXZpZ2F0aW9uLlxuXHRcdFx0XHRpZiAoc05hdlR5cGUgPT09IE5hdlR5cGUueEFwcFN0YXRlKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0Vycm9yID0gb05hdkhhbmRsZXIuX2NyZWF0ZVRlY2huaWNhbEVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuZ2V0RGF0YUZyb21BcHBTdGF0ZS5mYWlsZWRcIik7XG5cdFx0XHRcdFx0b1N1Yk15RGVmZXJyZWQucmVqZWN0KG9FcnJvciwgb1N1YlN0YXJ0dXBQYXJhbWV0ZXJzIHx8IHt9LCBOYXZUeXBlLnhBcHBTdGF0ZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b1N1Yk15RGVmZXJyZWQucmVzb2x2ZSh7fSwgb1N1YlN0YXJ0dXBQYXJhbWV0ZXJzLCBOYXZUeXBlLmluaXRpYWwpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBvQXBwU3RhdGVEYXRhOiBhbnkgPSB7fTtcblx0XHRcdFx0b0FwcFN0YXRlRGF0YS5zZWxlY3Rpb25WYXJpYW50ID0gb1NlbFZhcnMub05hdmlnYXRpb25TZWxWYXIudG9KU09OU3RyaW5nKCk7XG5cdFx0XHRcdG9BcHBTdGF0ZURhdGEub1NlbGVjdGlvblZhcmlhbnQgPSBvU2VsVmFycy5vTmF2aWdhdGlvblNlbFZhcjtcblx0XHRcdFx0b0FwcFN0YXRlRGF0YS5vRGVmYXVsdGVkU2VsZWN0aW9uVmFyaWFudCA9IG9TZWxWYXJzLm9EZWZhdWx0ZWRTZWxWYXI7XG5cdFx0XHRcdG9BcHBTdGF0ZURhdGEuYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seSA9IG9TZWxWYXJzLmJOYXZTZWxWYXJIYXNEZWZhdWx0c09ubHk7XG5cblx0XHRcdFx0Ly8gbm8gc2FwLXhhcHAtc3RhdGUgYnV0IG5hdlR5cGUgaXMgaHlicmlkLCBleHRyYWN0IHRoZSBJQXBwU3RhdGVEYXRhXG5cdFx0XHRcdGlmIChzTmF2VHlwZSA9PT0gTmF2VHlwZS5oeWJyaWQpIHtcblx0XHRcdFx0XHRjb25zdCBzdWNjZXNzSGFuZGxlckh5YnJpZFN0YXRlID0gZnVuY3Rpb24gKGlBcHBTdGF0ZURhdGE6IG9iamVjdCwgX3JlZjogb2JqZWN0LCBuYXZUeXBlOiBzdHJpbmcpIHtcblx0XHRcdFx0XHRcdG9BcHBTdGF0ZURhdGEuaUFwcFN0YXRlID0gaUFwcFN0YXRlRGF0YTtcblx0XHRcdFx0XHRcdG9TdWJNeURlZmVycmVkLnJlc29sdmUob0FwcFN0YXRlRGF0YSwgb1N0YXJ0dXBQYXJhbWV0ZXJzLCBuYXZUeXBlKTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGNvbnN0IGZhaWx1cmVIYW5kbGVySHlicmlkU3RhdGUgPSBmdW5jdGlvbiAob0Vycm9yOiBvYmplY3QsIF9yZWY6IG9iamVjdCwgbmF2VHlwZTogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRvU3ViTXlEZWZlcnJlZC5yZWplY3Qob0Vycm9yLCBfcmVmLCBuYXZUeXBlKTtcblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0aWYgKGlBcHBTdGF0ZUh5YnJpZERlZmVycmVkICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdGlBcHBTdGF0ZUh5YnJpZERlZmVycmVkLmRvbmUoc3VjY2Vzc0hhbmRsZXJIeWJyaWRTdGF0ZSk7XG5cdFx0XHRcdFx0XHRpQXBwU3RhdGVIeWJyaWREZWZlcnJlZC5mYWlsKGZhaWx1cmVIYW5kbGVySHlicmlkU3RhdGUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvU3ViTXlEZWZlcnJlZC5yZXNvbHZlKG9BcHBTdGF0ZURhdGEsIG9TdWJTdGFydHVwUGFyYW1ldGVycywgc05hdlR5cGUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRpZiAoc0lBcHBTdGF0ZSkge1xuXHRcdFx0Ly8gaW5uZXIgYXBwIHN0YXRlIGlzIGF2YWlsYWJsZSBpbiB0aGUgQXBwSGFzaCAoYmFjayBuYXZpZ2F0aW9uKTsgZXh0cmFjdCB0aGUgcGFyYW1ldGVyIHZhbHVlXG5cdFx0XHR0aGlzLl9sb2FkQXBwU3RhdGUoc0lBcHBTdGF0ZSwgb015RGVmZXJyZWQsIE5hdlR5cGUuaUFwcFN0YXRlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gbm8gYmFjayBuYXZpZ2F0aW9uXG5cdFx0XHRjb25zdCBiSXNYYXBwU3RhdGVOYXZpZ2F0aW9uID0gb0NvbXBvbmVudERhdGFbXCJzYXAteGFwcC1zdGF0ZVwiXSAhPT0gdW5kZWZpbmVkO1xuXHRcdFx0aWYgKGJJc1hhcHBTdGF0ZU5hdmlnYXRpb24pIHtcblx0XHRcdFx0Y29uc3QgdGhhdCA9IHRoaXM7XG5cdFx0XHRcdC8vIGlubmVyIGFwcCBzdGF0ZSB3YXMgbm90IGZvdW5kIGluIHRoZSBBcHBIYXNoLCBidXQgeGFwcCBzdGF0ZSA9PiB0cnkgdG8gcmVhZCB0aGUgeGFwcCBzdGF0ZVxuXHRcdFx0XHR0aGlzLl9nZXRBcHBOYXZpZ2F0aW9uU2VydmljZUFzeW5jKClcblx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAob0Nyb3NzQXBwTmF2U2VydmljZTogYW55KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0Nyb3NzQXBwTmF2U2VydmljZS5nZXRTdGFydHVwQXBwU3RhdGUodGhhdC5vQ29tcG9uZW50KTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvRXJyb3IgPSBvTmF2SGFuZGxlci5fY3JlYXRlVGVjaG5pY2FsRXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5nZXRTdGFydHVwU3RhdGUuZmFpbGVkXCIpO1xuXHRcdFx0XHRcdFx0b015RGVmZXJyZWQucmVqZWN0KG9FcnJvciwge30sIE5hdlR5cGUueEFwcFN0YXRlKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChvQXBwU3RhdGU6IGFueSkge1xuXHRcdFx0XHRcdFx0Ly8gZ2V0IGFwcCBzdGF0ZSBmcm9tIHNhcC14YXBwLXN0YXRlLFxuXHRcdFx0XHRcdFx0Ly8gY3JlYXRlIGEgY29weSwgbm90IG9ubHkgYSByZWZlcmVuY2UsIGJlY2F1c2Ugd2Ugd2FudCB0byBtb2RpZnkgdGhlIG9iamVjdFxuXHRcdFx0XHRcdFx0bGV0IG9BcHBTdGF0ZURhdGEgPSBvQXBwU3RhdGUuZ2V0RGF0YSgpO1xuXHRcdFx0XHRcdFx0bGV0IG9FcnJvcjtcblx0XHRcdFx0XHRcdGlmIChvQXBwU3RhdGVEYXRhKSB7XG5cdFx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdFx0b0FwcFN0YXRlRGF0YSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob0FwcFN0YXRlRGF0YSkpO1xuXHRcdFx0XHRcdFx0XHR9IGNhdGNoICh4KSB7XG5cdFx0XHRcdFx0XHRcdFx0b0Vycm9yID0gb05hdkhhbmRsZXIuX2NyZWF0ZVRlY2huaWNhbEVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuQXBwU3RhdGVEYXRhLnBhcnNlRXJyb3JcIik7XG5cdFx0XHRcdFx0XHRcdFx0b015RGVmZXJyZWQucmVqZWN0KG9FcnJvciwgb1N0YXJ0dXBQYXJhbWV0ZXJzLCBOYXZUeXBlLnhBcHBTdGF0ZSk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9NeURlZmVycmVkLnByb21pc2UoKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAob0FwcFN0YXRlRGF0YSkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvU2VsVmFyID0gbmV3IFNlbGVjdGlvblZhcmlhbnQob0FwcFN0YXRlRGF0YS5zZWxlY3Rpb25WYXJpYW50KTtcblxuXHRcdFx0XHRcdFx0XHRjb25zdCBvU2VsVmFycyA9IG9OYXZIYW5kbGVyLl9zcGxpdEluYm91bmROYXZpZ2F0aW9uUGFyYW1ldGVycyhcblx0XHRcdFx0XHRcdFx0XHRvU2VsVmFyLFxuXHRcdFx0XHRcdFx0XHRcdG9TdGFydHVwUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdFx0XHRhRGVmYXVsdGVkUGFyYW1ldGVyc1xuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRvQXBwU3RhdGVEYXRhLnNlbGVjdGlvblZhcmlhbnQgPSBvU2VsVmFycy5vTmF2aWdhdGlvblNlbFZhci50b0pTT05TdHJpbmcoKTtcblx0XHRcdFx0XHRcdFx0b0FwcFN0YXRlRGF0YS5vU2VsZWN0aW9uVmFyaWFudCA9IG9TZWxWYXJzLm9OYXZpZ2F0aW9uU2VsVmFyO1xuXHRcdFx0XHRcdFx0XHRvQXBwU3RhdGVEYXRhLm9EZWZhdWx0ZWRTZWxlY3Rpb25WYXJpYW50ID0gb1NlbFZhcnMub0RlZmF1bHRlZFNlbFZhcjtcblx0XHRcdFx0XHRcdFx0b0FwcFN0YXRlRGF0YS5iTmF2U2VsVmFySGFzRGVmYXVsdHNPbmx5ID0gb1NlbFZhcnMuYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seTtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc3VjY2Vzc0hhbmRsZXJIeWJyaWRTdGF0ZSA9IGZ1bmN0aW9uIChpQXBwU3RhdGVEYXRhOiBvYmplY3QsIF9yZWY6IG9iamVjdCwgbmF2VHlwZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0XHRcdFx0XHRcdFx0b0FwcFN0YXRlRGF0YS5pQXBwU3RhdGUgPSBpQXBwU3RhdGVEYXRhO1xuXHRcdFx0XHRcdFx0XHRcdG9NeURlZmVycmVkLnJlc29sdmUob0FwcFN0YXRlRGF0YSwgb1N0YXJ0dXBQYXJhbWV0ZXJzLCBuYXZUeXBlKTtcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0aWYgKGh5YnJpZElBcHBTdGF0ZUtleVBhcmFtcyAhPT0gdW5kZWZpbmVkICYmIGlBcHBTdGF0ZUh5YnJpZERlZmVycmVkICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0XHRpQXBwU3RhdGVIeWJyaWREZWZlcnJlZC5kb25lKHN1Y2Nlc3NIYW5kbGVySHlicmlkU3RhdGUpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKG9BcHBTdGF0ZURhdGFbSFlCUklEX0lBUFBfU1RBVEVfS0VZXSkge1xuXHRcdFx0XHRcdFx0XHRcdHRoYXQuX2xvYWRBcHBTdGF0ZShvQXBwU3RhdGVEYXRhW0hZQlJJRF9JQVBQX1NUQVRFX0tFWV0sIGh5YnJpZERlZmVycmVkLCBOYXZUeXBlLmh5YnJpZCkuZG9uZShcblx0XHRcdFx0XHRcdFx0XHRcdHN1Y2Nlc3NIYW5kbGVySHlicmlkU3RhdGVcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdG9NeURlZmVycmVkLnJlc29sdmUob0FwcFN0YXRlRGF0YSwgb1N0YXJ0dXBQYXJhbWV0ZXJzLCBOYXZUeXBlLnhBcHBTdGF0ZSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAob1N0YXJ0dXBQYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdFx0XHRcdHBhcnNlVXJsUGFyYW1zKG9TdGFydHVwUGFyYW1ldGVycywgYURlZmF1bHRlZFBhcmFtZXRlcnMsIG9NeURlZmVycmVkLCBOYXZUeXBlLnhBcHBTdGF0ZSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvLyBzYXAteGFwcC1zdGF0ZSBuYXZpZ2F0aW9uLCBidXQgSUQgaGFzIGFscmVhZHkgZXhwaXJlZCwgYnV0IFVSTCBwYXJhbWV0ZXJzIGF2YWlsYWJsZVxuXHRcdFx0XHRcdFx0XHRvRXJyb3IgPSBvTmF2SGFuZGxlci5fY3JlYXRlVGVjaG5pY2FsRXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5nZXREYXRhRnJvbUFwcFN0YXRlLmZhaWxlZFwiKTtcblx0XHRcdFx0XHRcdFx0b015RGVmZXJyZWQucmVqZWN0KG9FcnJvciwgb1N0YXJ0dXBQYXJhbWV0ZXJzIHx8IHt9LCBOYXZUeXBlLnhBcHBTdGF0ZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0Vycm9yID0gb05hdkhhbmRsZXIuX2NyZWF0ZVRlY2huaWNhbEVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuX2dldEFwcE5hdmlnYXRpb25TZXJ2aWNlQXN5bmMuZmFpbGVkXCIpO1xuXHRcdFx0XHRcdFx0b015RGVmZXJyZWQucmVqZWN0KG9FcnJvciwge30sIE5hdlR5cGUueEFwcFN0YXRlKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSBpZiAob1N0YXJ0dXBQYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdC8vIG5vIHNhcC14YXBwLXN0YXRlXG5cdFx0XHRcdHBhcnNlVXJsUGFyYW1zKFxuXHRcdFx0XHRcdG9TdGFydHVwUGFyYW1ldGVycyxcblx0XHRcdFx0XHRhRGVmYXVsdGVkUGFyYW1ldGVycyxcblx0XHRcdFx0XHRvTXlEZWZlcnJlZCxcblx0XHRcdFx0XHRoeWJyaWRJQXBwU3RhdGVLZXlQYXJhbXMgIT09IHVuZGVmaW5lZCA/IE5hdlR5cGUuaHlicmlkIDogTmF2VHlwZS5VUkxQYXJhbXNcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIGluaXRpYWwgbmF2aWdhdGlvblxuXHRcdFx0XHRvTXlEZWZlcnJlZC5yZXNvbHZlKHt9LCB7fSwgTmF2VHlwZS5pbml0aWFsKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gb015RGVmZXJyZWQucHJvbWlzZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGFwcGxpY2F0aW9uIHNwZWNpZmljIHRlY2huaWNhbCBwYXJhbWV0ZXJzLiBUZWNobmljYWwgcGFyYW1ldGVycyB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgc2VsZWN0aW9uIHZhcmlhbnQgcGFzc2VkIHRvIHRoZVxuXHQgKiBhcHBsaWNhdGlvbi4gQXMgYSBkZWZhdWx0IHRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSBjb25zaWRlcmVkIGFzIHRlY2huaWNhbCBwYXJhbWV0ZXJzOlxuXHQgKiA8dWw+XG5cdCAqIDxsaT48Y29kZT5zYXAtc3lzdGVtPC9jb2RlPjwvbGk+XG5cdCAqIDxsaT48Y29kZT5zYXAtdXNoZWxsLWRlZmF1bHRlZFBhcmFtZXRlck5hbWVzPC9jb2RlPjwvbGk+XG5cdCAqIDxsaT48Y29kZT5cImhjcEFwcGxpY2F0aW9uSWRcIjwvY29kZT48L2xpPlxuXHQgKiA8L3VsPi5cblx0ICpcblx0ICogQHB1YmxpY1xuXHQgKiBAZnVuY3Rpb24gc2V0VGVjaG5pY2FsUGFyYW1ldGVyc1xuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLm5hdmlnYXRpb24uTmF2aWdhdGlvbkhhbmRsZXIucHJvdG90eXBlXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFUZWNobmljYWxQYXJhbWV0ZXJzIExpc3Qgb2YgcGFyYW1ldGVyIG5hbWVzIHRvIGJlIGNvbnNpZGVyZWQgYXMgdGVjaG5pY2FsIHBhcmFtZXRlcnMuIDxjb2RlPm51bGw8L2NvZGU+IG9yXG5cdCAqICAgICAgICA8Y29kZT51bmRlZmluZWQ8L2NvZGU+IG1heSBiZSB1c2VkIHRvIHJlc2V0IHRoZSBjb21wbGV0ZSBsaXN0LlxuXHQgKi9cblx0c2V0VGVjaG5pY2FsUGFyYW1ldGVycyhhVGVjaG5pY2FsUGFyYW1ldGVycz86IGFueVtdKSB7XG5cdFx0aWYgKCFhVGVjaG5pY2FsUGFyYW1ldGVycykge1xuXHRcdFx0YVRlY2huaWNhbFBhcmFtZXRlcnMgPSBbXTtcblx0XHR9XG5cblx0XHRpZiAoIUFycmF5LmlzQXJyYXkoYVRlY2huaWNhbFBhcmFtZXRlcnMpKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlcjogcGFyYW1ldGVyIGluY29ycmVjdCwgYXJyYXkgb2Ygc3RyaW5ncyBleHBlY3RlZFwiKTtcblx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfSU5QVVRcIik7XG5cdFx0fVxuXG5cdFx0dGhpcy5fYVRlY2huaWNhbFBhcmFtYXRlcnMgPSBhVGVjaG5pY2FsUGFyYW1ldGVycztcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBhcHBsaWNhdGlvbiBzcGVjaWZpYyB0ZWNobmljYWwgcGFyYW1ldGVycy4gVGVjaG5pY2FsIHBhcmFtZXRlcnMgd2lsbCBub3QgYmUgYWRkZWQgdG8gdGhlIHNlbGVjdGlvbiB2YXJpYW50IHBhc3NlZCB0byB0aGVcblx0ICogYXBwbGljYXRpb24uIEFzIGEgZGVmYXVsdCB0aGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgY29uc2lkZXJlZCBhcyB0ZWNobmljYWwgcGFyYW1ldGVyczpcblx0ICogPHVsPlxuXHQgKiA8bGk+PGNvZGU+c2FwLXN5c3RlbTwvY29kZT48L2xpPlxuXHQgKiA8bGk+PGNvZGU+c2FwLXVzaGVsbC1kZWZhdWx0ZWRQYXJhbWV0ZXJOYW1lczwvY29kZT48L2xpPlxuXHQgKiA8bGk+PGNvZGU+XCJoY3BBcHBsaWNhdGlvbklkXCI8L2NvZGU+PC9saT5cblx0ICogPC91bD4uXG5cdCAqXG5cdCAqIEBwdWJsaWNcblx0ICogQGZ1bmN0aW9uIGdldFRlY2huaWNhbFBhcmFtZXRlcnNcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdmlnYXRpb25IYW5kbGVyLnByb3RvdHlwZVxuXHQgKiBAcmV0dXJucyB7QXJyYXl9IENvbnRhaW5pbmcgdGhlIHRlY2huaWNhbCBwYXJhbWV0ZXJzLlxuXHQgKi9cblx0Z2V0VGVjaG5pY2FsUGFyYW1ldGVycygpOiBzdHJpbmdbXSB7XG5cdFx0cmV0dXJuIHRoaXMuX2FUZWNobmljYWxQYXJhbWF0ZXJzLmNvbmNhdChbXSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZSBwYXNzZWQgcGFyYW1ldGVyIGlzIGNvbnNpZGVyZWQgYXMgdGVjaG5pY2FsIHBhcmFtZXRlci5cblx0ICpcblx0ICogQHBhcmFtIHNQYXJhbWV0ZXJOYW1lIE5hbWUgb2YgYSByZXF1ZXN0IHBhcmFtZXRlciwgY29uc2lkZXJlZCBhcyB0ZWNobmljYWwgcGFyYW1ldGVyLlxuXHQgKiBAcmV0dXJucyBJbmRpY2F0ZXMgaWYgdGhlIHBhcmFtZXRlciBpcyBjb25zaWRlcmVkIGFzIHRlY2huaWNhbCBwYXJhbWV0ZXIgb3Igbm90LlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2lzVGVjaG5pY2FsUGFyYW1ldGVyKHNQYXJhbWV0ZXJOYW1lOiBzdHJpbmcpIHtcblx0XHRpZiAoc1BhcmFtZXRlck5hbWUpIHtcblx0XHRcdGlmIChcblx0XHRcdFx0IShcblx0XHRcdFx0XHRzUGFyYW1ldGVyTmFtZSA9PT0gXCJzYXAtdWktZmUtdmFyaWFudC1pZFwiIHx8XG5cdFx0XHRcdFx0c1BhcmFtZXRlck5hbWUgPT09IFwic2FwLXVpLWZlLXRhYmxlLXZhcmlhbnQtaWRcIiB8fFxuXHRcdFx0XHRcdHNQYXJhbWV0ZXJOYW1lID09PSBcInNhcC11aS1mZS1jaGFydC12YXJpYW50LWlkXCIgfHxcblx0XHRcdFx0XHRzUGFyYW1ldGVyTmFtZSA9PT0gXCJzYXAtdWktZmUtZmlsdGVyYmFyLXZhcmlhbnQtaWRcIlxuXHRcdFx0XHQpXG5cdFx0XHQpIHtcblx0XHRcdFx0aWYgKHNQYXJhbWV0ZXJOYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihcInNhcC1cIikgPT09IDApIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fSBlbHNlIGlmICh0aGlzLl9hVGVjaG5pY2FsUGFyYW1hdGVycy5pbmRleE9mKHNQYXJhbWV0ZXJOYW1lKSA+PSAwKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0X2lzRkVQYXJhbWV0ZXIoc1BhcmFtZXRlck5hbWU6IGFueSkge1xuXHRcdHJldHVybiBzUGFyYW1ldGVyTmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJzYXAtdWktZmVcIikgPT09IDA7XG5cdH1cblxuXHQvKipcblx0ICogUm1vdmVzIGlmIHRoZSBwYXNzZWQgcGFyYW1ldGVyIGlzIGNvbnNpZGVyZWQgYXMgdGVjaG5pY2FsIHBhcmFtZXRlci5cblx0ICpcblx0ICogQHBhcmFtIG9TZWxlY3Rpb25WYXJpYW50IFNlbGVjdGlvbiBWYXJpYW50IHdoaWNoIGNvbnNpc3RzIG9mIHRlY2huaWNhbCBQYXJhbWV0ZXJzLlxuXHQgKiBAcmV0dXJucyBTZWxlY3Rpb24gVmFyaWFudCB3aXRob3V0IHRlY2huaWNhbCBQYXJhbWV0ZXJzLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X3JlbW92ZVRlY2huaWNhbFBhcmFtZXRlcnMob1NlbGVjdGlvblZhcmlhbnQ6IFNlbGVjdGlvblZhcmlhbnQpIHtcblx0XHRsZXQgc1Byb3BOYW1lLCBpO1xuXHRcdGNvbnN0IGFTZWxWYXJQcm9wTmFtZXMgPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcygpO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBhU2VsVmFyUHJvcE5hbWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRzUHJvcE5hbWUgPSBhU2VsVmFyUHJvcE5hbWVzW2ldO1xuXHRcdFx0aWYgKHRoaXMuX2lzVGVjaG5pY2FsUGFyYW1ldGVyKHNQcm9wTmFtZSkpIHtcblx0XHRcdFx0b1NlbGVjdGlvblZhcmlhbnQucmVtb3ZlU2VsZWN0T3B0aW9uKHNQcm9wTmFtZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvU2VsZWN0aW9uVmFyaWFudDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTcGxpdHMgdGhlIHBhcmFtZXRlcnMgcHJvdmlkZWQgZHVyaW5nIGluYm91bmQgbmF2aWdhdGlvbiBhbmQgc2VwYXJhdGVzIHRoZSBjb250ZXh0dWFsIGluZm9ybWF0aW9uIGJldHdlZW4gZGVmYXVsdGVkIHBhcmFtZXRlciB2YWx1ZXMgYW5kXG5cdCAqIG5hdmlnYXRpb24gcGFyYW1ldGVycy5cblx0ICpcblx0ICogQHBhcmFtIG9TZWxlY3Rpb25WYXJpYW50IEluc3RhbmNlIG9mIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5TZWxlY3Rpb25WYXJpYW50fSBjb250YWluaW5nIG5hdmlnYXRpb24gZGF0YSBvZlxuXHQgKiAgICAgICAgdGhlIGFwcFxuXHQgKiBAcGFyYW0gb1N0YXJ0dXBQYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHN0YXJ0dXAgcGFyYW1ldGVycyBvZiB0aGUgYXBwIChkZXJpdmVkIGZyb20gdGhlIGNvbXBvbmVudClcblx0ICogQHBhcmFtIGFEZWZhdWx0ZWRQYXJhbWV0ZXJzIEFycmF5IGNvbnRhaW5pbmcgZGVmYXVsdGVkIHBhcmFtZXRlciBuYW1lc1xuXHQgKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyB0d28gU2VsZWN0aW9uVmFyaWFudHMsIG9uZSBmb3IgbmF2aWdhdGlvbiAob05hdmlnYXRpb25TZWxWYXIpIGFuZCBvbmUgZm9yIGRlZmF1bHRlZCBzdGFydHVwIHBhcmFtZXRlcnNcblx0ICogICAgICAgICAgKG9EZWZhdWx0ZWRTZWxWYXIpLCBhbmQgYSBmbGFnIChiTmF2U2VsVmFySGFzRGVmYXVsdHNPbmx5KSBpbmRpY2F0aW5nIHdoZXRoZXIgYWxsIHBhcmFtZXRlcnMgd2VyZSBkZWZhdWx0ZWQuIFRoZSBmdW5jdGlvbiBpc1xuXHQgKiAgICAgICAgICBoYW5kZWQgdHdvIG9iamVjdHMgY29udGFpbmluZyBwYXJhbWV0ZXJzIChuYW1lcyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyB2YWx1ZXMpLCBvU2VsZWN0aW9uVmFyaWFudCBhbmQgb1N0YXJ0dXBQYXJhbWV0ZXJzLiBBXG5cdCAqICAgICAgICAgIHBhcmFtZXRlciBjb3VsZCBiZSBzdG9yZWQgaW4ganVzdCBvbmUgb2YgdGhlc2UgdHdvIG9iamVjdHMgb3IgaW4gYm90aCBvZiB0aGVtIHNpbXVsdGFuZW91c2x5LiBCZWNhdXNlIG9mIHRoZSBsYXR0ZXIgY2FzZSBhXG5cdCAqICAgICAgICAgIHBhcmFtZXRlciBjb3VsZCBiZSBhc3NvY2lhdGVkIHdpdGggY29uZmxpY3RpbmcgdmFsdWVzIGFuZCBpdCBpcyB0aGUgam9iIG9mIHRoaXMgZnVuY3Rpb24gdG8gcmVzb2x2ZSBhbnkgc3VjaCBjb25mbGljdC4gUGFyYW1ldGVyc1xuXHQgKiAgICAgICAgICBhcmUgYXNzaWduZWQgdG8gdGhlIHR3byByZXR1cm5lZCBTZWxlY3Rpb25WYXJpYW50cywgb05hdmlnYXRpb25TZWxWYXIgYW5kIG9EZWZhdWx0ZWRTZWxWYXIsIGFzIGZvbGxvd3M6IHwgcGFyYW1ldGVyIE5PVCBpbiB8XG5cdCAqICAgICAgICAgIHBhcmFtZXRlciBpbiB8IG9TZWxlY3Rpb25WYXJpYW50IHwgb1NlbGVjdGlvblZhcmlhbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLSBwYXJhbWV0ZXIgTk9UIGluIHxcblx0ICogICAgICAgICAgbm90aGluZyB0byBkbyB8IEFkZCBwYXJhbWV0ZXIgb1N0YXJ0dXBQYXJhbWV0ZXJzIHwgaGVyZSB8IChzZWUgYmVsb3cpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0ICogICAgICAgICAgcGFyYW1ldGVyIGluIHwgQWRkIHBhcmFtZXRlciB8IENvbmZsaWN0IHJlc29sdXRpb24gb1N0YXJ0dXBQYXJhbWV0ZXJzIHwgKHNlZSBiZWxvdykgfCAoc2VlIGJlbG93KSBBZGQgcGFyYW1ldGVyOiBpZiBwYXJhbWV0ZXIgaW5cblx0ICogICAgICAgICAgYURlZmF1bHRlZFBhcmFtZXRlcnM6IGFkZCBwYXJhbWV0ZXIgdG8gb0RlZmF1bHRlZFNlbFZhciBlbHNlOiBhZGQgcGFyYW1ldGVyIHRvIG9OYXZpZ2F0aW9uU2VsVmFyIENvbmZsaWN0IHJlc29sdXRpb246IGlmIHBhcmFtZXRlclxuXHQgKiAgICAgICAgICBpbiBhRGVmYXVsdGVkUGFyYW1ldGVyczogYWRkIHBhcmFtZXRlciB2YWx1ZSBmcm9tIG9TZWxlY3Rpb25WYXJpYW50IHRvIG9OYXZpZ2F0aW9uU2VsVmFyIGFkZCBwYXJhbWV0ZXIgdmFsdWUgZnJvbVxuXHQgKiAgICAgICAgICBvU3RhcnR1cFBhcmFtZXRlcnMgdG8gb0RlZmF1bHRlZFNlbFZhciBOb3RlOiBUaGlzIGNhc2Ugb25seSBvY2N1cnMgaW4gVUk1IDEuMzIuIEluIGxhdGVyIHZlcnNpb25zIFVTaGVsbCBzdG9yZXMgYW55IGRlZmF1bHRlZFxuXHQgKiAgICAgICAgICBwYXJhbWV0ZXIgZWl0aGVyIGluIG9TZWxlY3Rpb25WYXJpYW50IG9yIG9TdGFydHVwUGFyYW1ldGVycyBidXQgbmV2ZXIgc2ltdWx0YW5lb3VzbHkgaW4gYm90aC4gZWxzZTogQ2hvb3NlIDEgb2YgdGhlIGZvbGxvd2luZ1xuXHQgKiAgICAgICAgICBvcHRpb25zIGJhc2VkIG9uIGdpdmVuIGhhbmRsaW5nIG1vZGUgKHRoaXMuc1BhcmFtSGFuZGxpbmdNb2RlKS4gLT4gYWRkIHBhcmFtZXRlciB2YWx1ZSBmcm9tIG9TdGFydHVwUGFyYW1ldGVycyB0b1xuXHQgKiAgICAgICAgICBvTmF2aWdhdGlvblNlbFZhciB8IC0+IGFkZCBwYXJhbWV0ZXIgdmFsdWUgZnJvbSBvQXBwU3RhdGUuc2VsZWN0aW9uVmFyaWFudCB0byBvTmF2aWdhdGlvblNlbFZhciAtPiBhZGQgYm90aCBwYXJhbWV0ZXIgdmFsdWVzIHRvXG5cdCAqICAgICAgICAgIG5hdmlnYXRpb25TZWxWYXIgSWYgbmF2aWdhdGlvblNlbFZhciBpcyBzdGlsbCBlbXB0eSBhdCB0aGUgZW5kIG9mIGV4ZWN1dGlvbiwgbmF2aWdhdGlvblNlbFZhciBpcyByZXBsYWNlZCBieSBhIGNvcHkgb2Zcblx0ICogICAgICAgICAgb0RlZmF1bHRlZFNlbFZhciBhbmQgdGhlIGZsYWcgYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seSBpcyBzZXQgdG8gdHJ1ZS4gVGhlIHNlbGVjdGlvbiB2YXJpYW50IG9EZWZhdWx0ZWRTZWxWYXIgaXRzZWxmIGlzIGFsd2F5c1xuXHQgKiAgICAgICAgICByZXR1cm5lZCBhcyBpcy5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9zcGxpdEluYm91bmROYXZpZ2F0aW9uUGFyYW1ldGVycyhcblx0XHRvU2VsZWN0aW9uVmFyaWFudDogSW5zdGFuY2VUeXBlPHR5cGVvZiBTZWxlY3Rpb25WYXJpYW50Pixcblx0XHRvU3RhcnR1cFBhcmFtZXRlcnM6IHsgW2tleTogc3RyaW5nXTogYW55IH0sXG5cdFx0YURlZmF1bHRlZFBhcmFtZXRlcnM6IGFueVtdXG5cdCkge1xuXHRcdGlmICghQXJyYXkuaXNBcnJheShhRGVmYXVsdGVkUGFyYW1ldGVycykpIHtcblx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfSU5QVVRcIik7XG5cdFx0fVxuXG5cdFx0bGV0IHNQcm9wTmFtZSwgaTtcblx0XHQvLyBGaXJzdCB3ZSBkbyBzb21lIHBhcnNpbmcgb2YgdGhlIFN0YXJ0VXAgUGFyYW1ldGVycy5cblx0XHRjb25zdCBvU3RhcnR1cFBhcmFtZXRlcnNBZGp1c3RlZDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuXHRcdGZvciAoc1Byb3BOYW1lIGluIG9TdGFydHVwUGFyYW1ldGVycykge1xuXHRcdFx0aWYgKCFvU3RhcnR1cFBhcmFtZXRlcnMuaGFzT3duUHJvcGVydHkoc1Byb3BOYW1lKSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gaWYgKHNQcm9wTmFtZSA9PT0gU0FQX1NZU1RFTV9QUk9QRVJUWSB8fCBzUHJvcE5hbWUgPT09IERFRkFVTFRFRF9QQVJBTUVURVJfUFJPUEVSVFkpIHtcblx0XHRcdGlmICh0aGlzLl9pc1RlY2huaWNhbFBhcmFtZXRlcihzUHJvcE5hbWUpIHx8IHRoaXMuX2lzRkVQYXJhbWV0ZXIoc1Byb3BOYW1lKSB8fCBzUHJvcE5hbWUgPT09IEhZQlJJRF9JQVBQX1NUQVRFX0tFWSkge1xuXHRcdFx0XHQvLyBEbyBub3QgYWRkIHRoZSBTQVAgc3lzdGVtIHBhcmFtZXRlciB0byB0aGUgc2VsZWN0aW9uIHZhcmlhbnQgYXMgaXQgaXMgYSB0ZWNobmljYWwgcGFyYW1ldGVyXG5cdFx0XHRcdC8vIG5vdCByZWxldmFudCBmb3IgdGhlIHNlbGVjdGlvbiB2YXJpYW50LlxuXHRcdFx0XHQvLyBEbyBub3QgYWRkIHRoZSBzdGFydHVwIHBhcmFtZXRlciBmb3IgZGVmYXVsdCB2YWx1ZXMgdG8gdGhlIHNlbGVjdGlvbiB2YXJpYW50LiBUaGUgaW5mb3JtYXRpb24sIHdoaWNoIHBhcmFtZXRlcnNcblx0XHRcdFx0Ly8gYXJlIGRlZmF1bHRlZCwgaXMgYXZhaWxhYmxlIGluIHRoZSBkZWZhdWx0ZWQgc2VsZWN0aW9uIHZhcmlhbnQuXG5cdFx0XHRcdC8vIEluIGNhc2UsIEZFIFBhcmFtZXRlcnMgd2Ugc2hhbGwgc2tpcCBpdC4odGhlIGFwcGxpY2F0aW9uIG5lZWRzIHRvIGZldGNoIGl0IGZyb20gVVJMIHBhcmFtcylcblx0XHRcdFx0Ly8gU2tpcCB0aGUgaHlicmlkSUFwcFN0YXRlS2V5IHByZXNlbnQgYXMgcGFydCBvZiAnSHlicmlkJyBuYXZpZ2F0aW9uIHR5cGUgbm90IHJlbGV2YW50IGZvciB0aGUgc2VsZWN0aW9uIHZhcmlhbnRcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFdlIHN1cHBvcnQgcGFyYW1ldGVycyBhcyBhIG1hcCB3aXRoIHN0cmluZ3MgYW5kIGFzIGEgbWFwIHdpdGggdmFsdWUgYXJyYXlzXG5cdFx0XHRpZiAodHlwZW9mIG9TdGFydHVwUGFyYW1ldGVyc1tzUHJvcE5hbWVdID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdG9TdGFydHVwUGFyYW1ldGVyc0FkanVzdGVkW3NQcm9wTmFtZV0gPSBvU3RhcnR1cFBhcmFtZXRlcnNbc1Byb3BOYW1lXTtcblx0XHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvU3RhcnR1cFBhcmFtZXRlcnNbc1Byb3BOYW1lXSkgJiYgb1N0YXJ0dXBQYXJhbWV0ZXJzW3NQcm9wTmFtZV0ubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdG9TdGFydHVwUGFyYW1ldGVyc0FkanVzdGVkW3NQcm9wTmFtZV0gPSBvU3RhcnR1cFBhcmFtZXRlcnNbc1Byb3BOYW1lXVswXTsgLy8gc2luZ2xlLXZhbHVlZCBwYXJhbWV0ZXJzXG5cdFx0XHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob1N0YXJ0dXBQYXJhbWV0ZXJzW3NQcm9wTmFtZV0pICYmIG9TdGFydHVwUGFyYW1ldGVyc1tzUHJvcE5hbWVdLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzQWRqdXN0ZWRbc1Byb3BOYW1lXSA9IG9TdGFydHVwUGFyYW1ldGVyc1tzUHJvcE5hbWVdOyAvLyBtdWx0aS12YWx1ZWQgcGFyYW1ldGVyc1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9JTlBVVFwiKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDb25zdHJ1Y3QgdHdvIHNlbGVjdGlvbiB2YXJpYW50cyBmb3IgZGVmYXVsdHMgYW5kIG5hdmlnYXRpb24gdG8gYmUgcmV0dXJuZWQgYnkgdGhlIGZ1bmN0aW9uLlxuXHRcdGNvbnN0IG9EZWZhdWx0ZWRTZWxWYXIgPSBuZXcgU2VsZWN0aW9uVmFyaWFudCgpO1xuXHRcdGNvbnN0IG9OYXZpZ2F0aW9uU2VsVmFyID0gbmV3IFNlbGVjdGlvblZhcmlhbnQoKTtcblxuXHRcdGNvbnN0IGFTZWxWYXJQcm9wTmFtZXMgPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRQYXJhbWV0ZXJOYW1lcygpLmNvbmNhdChvU2VsZWN0aW9uVmFyaWFudC5nZXRTZWxlY3RPcHRpb25zUHJvcGVydHlOYW1lcygpKTtcblx0XHRmb3IgKGkgPSAwOyBpIDwgYVNlbFZhclByb3BOYW1lcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0c1Byb3BOYW1lID0gYVNlbFZhclByb3BOYW1lc1tpXTtcblx0XHRcdGlmIChzUHJvcE5hbWUgaW4gb1N0YXJ0dXBQYXJhbWV0ZXJzQWRqdXN0ZWQpIHtcblx0XHRcdFx0Ly8gUmVzb2x2ZSBjb25mbGljdC5cblx0XHRcdFx0aWYgKGFEZWZhdWx0ZWRQYXJhbWV0ZXJzLmluZGV4T2Yoc1Byb3BOYW1lKSA+IC0xKSB7XG5cdFx0XHRcdFx0b05hdmlnYXRpb25TZWxWYXIubWFzc0FkZFNlbGVjdE9wdGlvbihzUHJvcE5hbWUsIG9TZWxlY3Rpb25WYXJpYW50LmdldFZhbHVlKHNQcm9wTmFtZSkhKTtcblx0XHRcdFx0XHR0aGlzLl9hZGRQYXJhbWV0ZXJWYWx1ZXMob0RlZmF1bHRlZFNlbFZhciwgc1Byb3BOYW1lLCBcIklcIiwgXCJFUVwiLCBvU3RhcnR1cFBhcmFtZXRlcnNBZGp1c3RlZFtzUHJvcE5hbWVdKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzd2l0Y2ggKHRoaXMuc1BhcmFtSGFuZGxpbmdNb2RlKSB7XG5cdFx0XHRcdFx0XHRjYXNlIFBhcmFtSGFuZGxpbmdNb2RlLlNlbFZhcldpbnM6XG5cdFx0XHRcdFx0XHRcdG9OYXZpZ2F0aW9uU2VsVmFyLm1hc3NBZGRTZWxlY3RPcHRpb24oc1Byb3BOYW1lLCBvU2VsZWN0aW9uVmFyaWFudC5nZXRWYWx1ZShzUHJvcE5hbWUpISk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSBQYXJhbUhhbmRsaW5nTW9kZS5VUkxQYXJhbVdpbnM6XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2FkZFBhcmFtZXRlclZhbHVlcyhvTmF2aWdhdGlvblNlbFZhciwgc1Byb3BOYW1lLCBcIklcIiwgXCJFUVwiLCBvU3RhcnR1cFBhcmFtZXRlcnNBZGp1c3RlZFtzUHJvcE5hbWVdKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlIFBhcmFtSGFuZGxpbmdNb2RlLkluc2VydEluU2VsT3B0OlxuXHRcdFx0XHRcdFx0XHRvTmF2aWdhdGlvblNlbFZhci5tYXNzQWRkU2VsZWN0T3B0aW9uKHNQcm9wTmFtZSwgb1NlbGVjdGlvblZhcmlhbnQuZ2V0VmFsdWUoc1Byb3BOYW1lKSEpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLl9hZGRQYXJhbWV0ZXJWYWx1ZXMob05hdmlnYXRpb25TZWxWYXIsIHNQcm9wTmFtZSwgXCJJXCIsIFwiRVFcIiwgb1N0YXJ0dXBQYXJhbWV0ZXJzQWRqdXN0ZWRbc1Byb3BOYW1lXSk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9JTlBVVFwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoYURlZmF1bHRlZFBhcmFtZXRlcnMuaW5kZXhPZihzUHJvcE5hbWUpID4gLTEpIHtcblx0XHRcdFx0Ly8gcGFyYW1ldGVyIG9ubHkgaW4gU2VsVmFyXG5cdFx0XHRcdG9EZWZhdWx0ZWRTZWxWYXIubWFzc0FkZFNlbGVjdE9wdGlvbihzUHJvcE5hbWUsIG9TZWxlY3Rpb25WYXJpYW50LmdldFZhbHVlKHNQcm9wTmFtZSkhKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9OYXZpZ2F0aW9uU2VsVmFyLm1hc3NBZGRTZWxlY3RPcHRpb24oc1Byb3BOYW1lLCBvU2VsZWN0aW9uVmFyaWFudC5nZXRWYWx1ZShzUHJvcE5hbWUpISk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Zm9yIChzUHJvcE5hbWUgaW4gb1N0YXJ0dXBQYXJhbWV0ZXJzQWRqdXN0ZWQpIHtcblx0XHRcdC8vIFRoZSBjYXNlIHdoZXJlIHRoZSBwYXJhbWV0ZXIgYXBwZWFycyB0d2ljZSBoYXMgYWxyZWFkeSBiZWVuIHRha2VuIGNhcmUgb2YgYWJvdmUgc28gd2Ugc2tpcCBpdCBoZXJlLlxuXHRcdFx0aWYgKGFTZWxWYXJQcm9wTmFtZXMuaW5kZXhPZihzUHJvcE5hbWUpID4gLTEpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChhRGVmYXVsdGVkUGFyYW1ldGVycy5pbmRleE9mKHNQcm9wTmFtZSkgPiAtMSkge1xuXHRcdFx0XHR0aGlzLl9hZGRQYXJhbWV0ZXJWYWx1ZXMob0RlZmF1bHRlZFNlbFZhciwgc1Byb3BOYW1lLCBcIklcIiwgXCJFUVwiLCBvU3RhcnR1cFBhcmFtZXRlcnNBZGp1c3RlZFtzUHJvcE5hbWVdKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuX2FkZFBhcmFtZXRlclZhbHVlcyhvTmF2aWdhdGlvblNlbFZhciwgc1Byb3BOYW1lLCBcIklcIiwgXCJFUVwiLCBvU3RhcnR1cFBhcmFtZXRlcnNBZGp1c3RlZFtzUHJvcE5hbWVdKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyB0aGUgc2VsZWN0aW9uIHZhcmlhbnQgdXNlZCBmb3IgbmF2aWdhdGlvbiBzaG91bGQgYmUgZmlsbGVkIHdpdGggZGVmYXVsdHMgaW4gY2FzZSB0aGF0IG9ubHkgZGVmYXVsdHMgZXhpc3Rcblx0XHRsZXQgYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seSA9IGZhbHNlO1xuXHRcdGlmIChvTmF2aWdhdGlvblNlbFZhci5pc0VtcHR5KCkpIHtcblx0XHRcdGJOYXZTZWxWYXJIYXNEZWZhdWx0c09ubHkgPSB0cnVlO1xuXHRcdFx0Y29uc3QgYVByb3BOYW1lcyA9IG9EZWZhdWx0ZWRTZWxWYXIuZ2V0U2VsZWN0T3B0aW9uc1Byb3BlcnR5TmFtZXMoKTtcblx0XHRcdGZvciAoaSA9IDA7IGkgPCBhUHJvcE5hbWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdG9OYXZpZ2F0aW9uU2VsVmFyLm1hc3NBZGRTZWxlY3RPcHRpb24oYVByb3BOYW1lc1tpXSwgb0RlZmF1bHRlZFNlbFZhci5nZXRWYWx1ZShhUHJvcE5hbWVzW2ldKSEpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRvTmF2aWdhdGlvblNlbFZhcjogb05hdmlnYXRpb25TZWxWYXIsXG5cdFx0XHRvRGVmYXVsdGVkU2VsVmFyOiBvRGVmYXVsdGVkU2VsVmFyLFxuXHRcdFx0Yk5hdlNlbFZhckhhc0RlZmF1bHRzT25seTogYk5hdlNlbFZhckhhc0RlZmF1bHRzT25seVxuXHRcdH07XG5cdH1cblxuXHRfYWRkUGFyYW1ldGVyVmFsdWVzKG9TZWxWYXJpYW50OiBhbnksIHNQcm9wTmFtZTogYW55LCBzU2lnbjogYW55LCBzT3B0aW9uOiBhbnksIG9WYWx1ZXM6IGFueSkge1xuXHRcdGlmIChBcnJheS5pc0FycmF5KG9WYWx1ZXMpKSB7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG9WYWx1ZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0b1NlbFZhcmlhbnQuYWRkU2VsZWN0T3B0aW9uKHNQcm9wTmFtZSwgc1NpZ24sIHNPcHRpb24sIG9WYWx1ZXNbaV0pO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRvU2VsVmFyaWFudC5hZGRTZWxlY3RPcHRpb24oc1Byb3BOYW1lLCBzU2lnbiwgc09wdGlvbiwgb1ZhbHVlcyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZXMgdGhlIFVSTCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgc0FwcFN0YXRlS2V5LiBBcyBhbiByZWFjdGlvbiByb3V0ZSBjaGFuZ2UgZXZlbnQgd2lsbCBiZSB0cmlnZ2VyZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBzQXBwU3RhdGVLZXkgVGhlIG5ldyBhcHAgc3RhdGUga2V5LlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRyZXBsYWNlSGFzaChzQXBwU3RhdGVLZXk6IHN0cmluZykge1xuXHRcdGNvbnN0IG9IYXNoQ2hhbmdlciA9IHRoaXMub1JvdXRlci5vSGFzaENoYW5nZXIgPyB0aGlzLm9Sb3V0ZXIub0hhc2hDaGFuZ2VyIDogSGFzaENoYW5nZXIuZ2V0SW5zdGFuY2UoKTtcblx0XHRjb25zdCBzQXBwSGFzaE9sZCA9IG9IYXNoQ2hhbmdlci5nZXRIYXNoKCk7XG5cdFx0Lypcblx0XHQgKiB1c2UgLmdldEhhc2goKSBoZXJlIGluc3RlYWQgb2YgLmdldEFwcEhhc2goKSB0byBhbHNvIGJlIGFibGUgZGVhbGluZyB3aXRoIGVudmlyb25tZW50cyB3aGVyZSBvbmx5IFNBUFVJNSBpcyBsb2FkZWQgYW5kIHRoZSBVU2hlbGwgaXNcblx0XHQgKiBub3QgaW5pdGlhbGl6ZWQgcHJvcGVybHkuXG5cdFx0ICovXG5cdFx0Y29uc3Qgc0FwcEhhc2hOZXcgPSB0aGlzLl9yZXBsYWNlSW5uZXJBcHBTdGF0ZUtleShzQXBwSGFzaE9sZCwgc0FwcFN0YXRlS2V5KTtcblx0XHRvSGFzaENoYW5nZXIucmVwbGFjZUhhc2goc0FwcEhhc2hOZXcpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZXMgdGhlIFVSTCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgYXBwIHN0YXRlIGFuZCBzdG9yZXMgdGhlIGFwcCBzdGF0ZSBmb3IgbGF0ZXIgcmV0cmlldmFsLlxuXHQgKlxuXHQgKiBAcGFyYW0gbUlubmVyQXBwRGF0YSBPYmplY3QgY29udGFpbmluZyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYXBwXG5cdCAqIEBwYXJhbSBiSW1tZWRpYXRlSGFzaFJlcGxhY2UgSWYgc2V0IHRvIGZhbHNlLCB0aGUgaW5uZXIgYXBwIGhhc2ggd2lsbCBub3QgYmUgcmVwbGFjZWQgdW50aWwgc3RvcmluZyBpcyBzdWNjZXNzZnVsOyBkbyBub3Rcblx0ICogICAgICAgIHNldCB0byBmYWxzZSBpZiB5b3UgY2Fubm90IHJlYWN0IHRvIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBQcm9taXNlLCBmb3IgZXhhbXBsZSwgd2hlbiBjYWxsaW5nIHRoZSBiZWZvcmVMaW5rUHJlc3NlZCBldmVudFxuXHQgKiBAcGFyYW0gYlNraXBIYXNoUmVwbGFjZSBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGlubmVyIGFwcCBoYXNoIHdpbGwgbm90IGJlIHJlcGxhY2VkIGluIHRoZSBzdG9yZUlubmVyQXBwU3RhdGVBc3luYy4gQWxzbyB0aGUgYkltbWVkaWF0ZUhhc2hSZXBsYWNlXG5cdCAqIFx0XHQgIHdpbGwgYmUgaWdub3JlZC5cblx0ICogQHJldHVybnMgQSBQcm9taXNlIG9iamVjdCB0byBtb25pdG9yIHdoZW4gYWxsIHRoZSBhY3Rpb25zIG9mIHRoZSBmdW5jdGlvbiBoYXZlIGJlZW4gZXhlY3V0ZWQ7IGlmIHRoZSBleGVjdXRpb24gaXMgc3VjY2Vzc2Z1bCwgdGhlXG5cdCAqICAgICAgICAgIGFwcCBzdGF0ZSBrZXkgaXMgcmV0dXJuZWQ7IGlmIGFuIGVycm9yIG9jY3VycywgYW4gb2JqZWN0IG9mIHR5cGUge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdkVycm9yfSBpc1xuXHQgKiAgICAgICAgICByZXR1cm5lZFxuXHQgKiBAcHVibGljXG5cdCAqIEBleGFtcGxlIDxjb2RlPlxuXHQgKiBzYXAudWkuZGVmaW5lKFtcInNhcC9mZS9uYXZpZ2F0aW9uL05hdmlnYXRpb25IYW5kbGVyXCJdLCBmdW5jdGlvbiAoTmF2aWdhdGlvbkhhbmRsZXIpIHtcblx0ICogXHR2YXIgb05hdmlnYXRpb25IYW5kbGVyID0gbmV3IE5hdmlnYXRpb25IYW5kbGVyKG9Db250cm9sbGVyKTtcblx0ICogXHR2YXIgbUlubmVyQXBwRGF0YSA9IHtcblx0ICogXHRcdHNlbGVjdGlvblZhcmlhbnQgOiBvU21hcnRGaWx0ZXJCYXIuZ2V0RGF0YVN1aXRlRm9ybWF0KCksXG5cdCAqIFx0XHR0YWJsZVZhcmlhbnRJZCA6IG9TbWFydFRhYmxlLmdldEN1cnJlbnRWYXJpYW50SWQoKSxcblx0ICogXHRcdGN1c3RvbURhdGEgOiBvTXlDdXN0b21EYXRhXG5cdCAqIFx0fTtcblx0ICpcblx0ICogXHR2YXIgb1N0b3JlSW5uZXJBcHBTdGF0ZVByb21pc2UgPSBvTmF2aWdhdGlvbkhhbmRsZXIuc3RvcmVJbm5lckFwcFN0YXRlQXN5bmMobUlubmVyQXBwRGF0YSk7XG5cdCAqXG5cdCAqIFx0b1N0b3JlSW5uZXJBcHBTdGF0ZVByb21pc2UuZG9uZShmdW5jdGlvbihzQXBwU3RhdGVLZXkpe1xuXHQgKiBcdFx0Ly95b3VyIGlubmVyIGFwcCBzdGF0ZSBpcyBzYXZlZCBub3csIHNBcHBTdGF0ZUtleSB3YXMgYWRkZWQgdG8gVVJMXG5cdCAqIFx0XHQvL3BlcmZvcm0gYWN0aW9ucyB0aGF0IG11c3QgcnVuIGFmdGVyIHNhdmVcblx0ICogXHR9KTtcblx0ICpcblx0ICogXHRvU3RvcmVJbm5lckFwcFN0YXRlUHJvbWlzZS5mYWlsKGZ1bmN0aW9uKG9FcnJvcil7XG5cdCAqIFx0XHQvL3NvbWUgZXJyb3IgaGFuZGxpbmdcblx0ICogXHR9KTtcblx0ICogfSk7XG5cdCAqIDwvY29kZT5cblx0ICovXG5cdHN0b3JlSW5uZXJBcHBTdGF0ZUFzeW5jKFxuXHRcdG1Jbm5lckFwcERhdGE6IElubmVyQXBwRGF0YSxcblx0XHRiSW1tZWRpYXRlSGFzaFJlcGxhY2U/OiBib29sZWFuLFxuXHRcdGJTa2lwSGFzaFJlcGxhY2U/OiBib29sZWFuXG5cdCk6IGpRdWVyeS5Qcm9taXNlPHN0cmluZz4ge1xuXHRcdGlmICh0eXBlb2YgYkltbWVkaWF0ZUhhc2hSZXBsYWNlICE9PSBcImJvb2xlYW5cIikge1xuXHRcdFx0YkltbWVkaWF0ZUhhc2hSZXBsYWNlID0gdHJ1ZTsgLy8gZGVmYXVsdFxuXHRcdH1cblx0XHRjb25zdCBvTmF2SGFuZGxlciA9IHRoaXM7XG5cdFx0Y29uc3Qgb015RGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKTtcblxuXHRcdGNvbnN0IGZuUmVwbGFjZUhhc2ggPSBmdW5jdGlvbiAoc0FwcFN0YXRlS2V5OiBhbnkpIHtcblx0XHRcdGNvbnN0IG9IYXNoQ2hhbmdlciA9IG9OYXZIYW5kbGVyLm9Sb3V0ZXIub0hhc2hDaGFuZ2VyID8gb05hdkhhbmRsZXIub1JvdXRlci5vSGFzaENoYW5nZXIgOiBIYXNoQ2hhbmdlci5nZXRJbnN0YW5jZSgpO1xuXHRcdFx0Y29uc3Qgc0FwcEhhc2hPbGQgPSBvSGFzaENoYW5nZXIuZ2V0SGFzaCgpO1xuXHRcdFx0Lypcblx0XHRcdCAqIHVzZSAuZ2V0SGFzaCgpIGhlcmUgaW5zdGVhZCBvZiAuZ2V0QXBwSGFzaCgpIHRvIGFsc28gYmUgYWJsZSBkZWFsaW5nIHdpdGggZW52aXJvbm1lbnRzIHdoZXJlIG9ubHkgU0FQVUk1IGlzIGxvYWRlZCBhbmQgdGhlIFVTaGVsbFxuXHRcdFx0ICogaXMgbm90IGluaXRpYWxpemVkIHByb3Blcmx5LlxuXHRcdFx0ICovXG5cdFx0XHRjb25zdCBzQXBwSGFzaE5ldyA9IG9OYXZIYW5kbGVyLl9yZXBsYWNlSW5uZXJBcHBTdGF0ZUtleShzQXBwSGFzaE9sZCwgc0FwcFN0YXRlS2V5KTtcblx0XHRcdG9IYXNoQ2hhbmdlci5yZXBsYWNlSGFzaChzQXBwSGFzaE5ldyk7XG5cdFx0fTtcblxuXHRcdC8vIGluIGNhc2UgbUlubmVyQXBwU3RhdGUgaXMgZW1wdHksIGRvIG5vdCBvdmVyd3JpdGUgdGhlIGxhc3Qgc2F2ZWQgc3RhdGVcblx0XHRpZiAoaXNFbXB0eU9iamVjdChtSW5uZXJBcHBEYXRhIGFzIG9iamVjdCkpIHtcblx0XHRcdG9NeURlZmVycmVkLnJlc29sdmUoXCJcIik7XG5cdFx0XHRyZXR1cm4gb015RGVmZXJyZWQucHJvbWlzZSgpO1xuXHRcdH1cblxuXHRcdC8vIGNoZWNrIGlmIHdlIGFscmVhZHkgc2F2ZWQgdGhlIHNhbWUgZGF0YVxuXHRcdGNvbnN0IHNBcHBTdGF0ZUtleUNhY2hlZCA9IHRoaXMuX29MYXN0U2F2ZWRJbm5lckFwcERhdGEuc0FwcFN0YXRlS2V5O1xuXG5cdFx0Y29uc3QgYklubmVyQXBwRGF0YUVxdWFsID0gSlNPTi5zdHJpbmdpZnkobUlubmVyQXBwRGF0YSkgPT09IEpTT04uc3RyaW5naWZ5KHRoaXMuX29MYXN0U2F2ZWRJbm5lckFwcERhdGEub0FwcERhdGEpO1xuXHRcdGlmIChiSW5uZXJBcHBEYXRhRXF1YWwgJiYgc0FwcFN0YXRlS2V5Q2FjaGVkKSB7XG5cdFx0XHQvLyBwYXNzZWQgaW5uZXIgYXBwIHN0YXRlIGZvdW5kIGluIGNhY2hlXG5cdFx0XHR0aGlzLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLmlDYWNoZUhpdCsrO1xuXG5cdFx0XHQvLyByZXBsYWNlIGlubmVyIGFwcCBoYXNoIHdpdGggY2FjaGVkIGFwcFN0YXRlS2V5IGluIHVybCAoanVzdCBpbiBjYXNlIHRoZSBhcHAgaGFzIGNoYW5nZWQgdGhlIGhhc2ggaW4gbWVhbnRpbWUpXG5cdFx0XHRmblJlcGxhY2VIYXNoKHNBcHBTdGF0ZUtleUNhY2hlZCk7XG5cdFx0XHRvTXlEZWZlcnJlZC5yZXNvbHZlKHNBcHBTdGF0ZUtleUNhY2hlZCk7XG5cdFx0XHRyZXR1cm4gb015RGVmZXJyZWQucHJvbWlzZSgpO1xuXHRcdH1cblxuXHRcdC8vIHBhc3NlZCBpbm5lciBhcHAgc3RhdGUgbm90IGZvdW5kIGluIGNhY2hlXG5cdFx0dGhpcy5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5pQ2FjaGVNaXNzKys7XG5cblx0XHRjb25zdCBmbk9uQWZ0ZXJTYXZlID0gZnVuY3Rpb24gKHNBcHBTdGF0ZUtleTogYW55KSB7XG5cdFx0XHQvLyByZXBsYWNlIGlubmVyIGFwcCBoYXNoIHdpdGggbmV3IGFwcFN0YXRlS2V5IGluIHVybFxuXHRcdFx0aWYgKCFiU2tpcEhhc2hSZXBsYWNlICYmICFiSW1tZWRpYXRlSGFzaFJlcGxhY2UpIHtcblx0XHRcdFx0Zm5SZXBsYWNlSGFzaChzQXBwU3RhdGVLZXkpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyByZW1lbWJlciBsYXN0IHNhdmVkIHN0YXRlXG5cdFx0XHRvTmF2SGFuZGxlci5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5vQXBwRGF0YSA9IG1Jbm5lckFwcERhdGE7XG5cdFx0XHRvTmF2SGFuZGxlci5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5zQXBwU3RhdGVLZXkgPSBzQXBwU3RhdGVLZXk7XG5cdFx0XHRvTXlEZWZlcnJlZC5yZXNvbHZlKHNBcHBTdGF0ZUtleSk7XG5cdFx0fTtcblxuXHRcdGNvbnN0IGZuT25FcnJvciA9IGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0b015RGVmZXJyZWQucmVqZWN0KG9FcnJvcik7XG5cdFx0fTtcblxuXHRcdHRoaXMuX3NhdmVBcHBTdGF0ZUFzeW5jKG1Jbm5lckFwcERhdGEsIGZuT25BZnRlclNhdmUsIGZuT25FcnJvcilcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChzQXBwU3RhdGVLZXk6IGFueSkge1xuXHRcdFx0XHQvKiBOb3RlIHRoYXQgX3NhcEFwcFN0YXRlIG1heSByZXR1cm4gJ3VuZGVmaW5lZCcgaW4gY2FzZSB0aGF0IHRoZSBwYXJzaW5nIGhhcyBmYWlsZWQuIEluIHRoaXMgY2FzZSwgd2Ugc2hvdWxkIG5vdCB0cmlnZ2VyIHRoZSByZXBsYWNlbWVudFxuXHRcdFx0XHQgKiBvZiB0aGUgQXBwIEhhc2ggd2l0aCB0aGUgZ2VuZXJhdGVkIGtleSwgYXMgdGhlIGNvbnRhaW5lciB3YXMgbm90IHdyaXR0ZW4gYmVmb3JlLiBOb3RlIGFzIHdlbGwgdGhhdCB0aGUgZXJyb3IgaGFuZGxpbmcgaGFzIGFscmVhZHlcblx0XHRcdFx0ICogaGFwcGVuZWQgYmVmb3JlIGJ5IG1ha2luZyB0aGUgb015RGVmZXJyZWQgcHJvbWlzZSBmYWlsIChzZWUgZm5PbkVycm9yIGFib3ZlKS5cblx0XHRcdFx0ICovXG5cdFx0XHRcdGlmIChzQXBwU3RhdGVLZXkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdC8vIHJlcGxhY2UgaW5uZXIgYXBwIGhhc2ggd2l0aCBuZXcgYXBwU3RhdGVLZXkgaW4gdXJsXG5cdFx0XHRcdFx0Ly8gbm90ZTogd2UgZG8gbm90IHdhaXQgZm9yIHRoZSBzYXZlIHRvIGJlIGNvbXBsZXRlZDogdGhpcyBhc3luY2hyb25vdXNseSBiZWhhdmlvdXIgaXMgbmVjZXNzYXJ5IGlmXG5cdFx0XHRcdFx0Ly8gdGhpcyBtZXRob2QgaXMgY2FsbGVkIGUuZy4gaW4gYSBvbkxpbmtQcmVzc2VkIGV2ZW50IHdpdGggbm8gcG9zc2liaWxpdHkgdG8gd2FpdCBmb3IgdGhlIHByb21pc2UgcmVzb2x1dGlvblxuXHRcdFx0XHRcdGlmICghYlNraXBIYXNoUmVwbGFjZSAmJiBiSW1tZWRpYXRlSGFzaFJlcGxhY2UpIHtcblx0XHRcdFx0XHRcdGZuUmVwbGFjZUhhc2goc0FwcFN0YXRlS2V5KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5fc2F2ZUFwcFN0YXRlQXN5bmMgZmFpbGVkXCIpO1xuXHRcdFx0fSk7XG5cblx0XHRyZXR1cm4gb015RGVmZXJyZWQucHJvbWlzZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZXMgdGhlIFVSTCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgYXBwIHN0YXRlIGFuZCBzdG9yZXMgdGhlIGFwcCBzdGF0ZSBmb3IgbGF0ZXIgcmV0cmlldmFsLlxuXHQgKlxuXHQgKiBAcGFyYW0gbUlubmVyQXBwRGF0YSBPYmplY3QgY29udGFpbmluZyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYXBwXG5cdCAqIEBwYXJhbSBiSW1tZWRpYXRlSGFzaFJlcGxhY2UgSWYgc2V0IHRvIGZhbHNlLCB0aGUgaW5uZXIgYXBwIGhhc2ggd2lsbCBub3QgYmUgcmVwbGFjZWQgdW50aWwgc3RvcmluZyBpcyBzdWNjZXNzZnVsOyBkbyBub3Rcblx0ICogICAgICAgIHNldCB0byBmYWxzZSBpZiB5b3UgY2Fubm90IHJlYWN0IHRvIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBQcm9taXNlLCBmb3IgZXhhbXBsZSwgd2hlbiBjYWxsaW5nIHRoZSBiZWZvcmVMaW5rUHJlc3NlZCBldmVudFxuXHQgKiBAcmV0dXJucyBBIFByb21pc2Ugb2JqZWN0IHRvIG1vbml0b3Igd2hlbiBhbGwgdGhlIGFjdGlvbnMgb2YgdGhlIGZ1bmN0aW9uIGhhdmUgYmVlbiBleGVjdXRlZDsgaWYgdGhlIGV4ZWN1dGlvbiBpcyBzdWNjZXNzZnVsLCB0aGVcblx0ICogICAgICAgICAgYXBwIHN0YXRlIGtleSBpcyByZXR1cm5lZDsgaWYgYW4gZXJyb3Igb2NjdXJzLCBhbiBvYmplY3Qgb2YgdHlwZSB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uTmF2RXJyb3J9IGlzXG5cdCAqICAgICAgICAgIHJldHVybmVkXG5cdCAqIEBwdWJsaWNcblx0ICogQGV4YW1wbGUgPGNvZGU+XG5cdCAqIHNhcC51aS5kZWZpbmUoW1wic2FwL2ZlL25hdmlnYXRpb24vTmF2aWdhdGlvbkhhbmRsZXJcIl0sIGZ1bmN0aW9uIChOYXZpZ2F0aW9uSGFuZGxlcikge1xuXHQgKiBcdHZhciBvTmF2aWdhdGlvbkhhbmRsZXIgPSBuZXcgTmF2aWdhdGlvbkhhbmRsZXIob0NvbnRyb2xsZXIpO1xuXHQgKiBcdHZhciBtSW5uZXJBcHBEYXRhID0ge1xuXHQgKiBcdFx0c2VsZWN0aW9uVmFyaWFudCA6IG9TbWFydEZpbHRlckJhci5nZXREYXRhU3VpdGVGb3JtYXQoKSxcblx0ICogXHRcdHRhYmxlVmFyaWFudElkIDogb1NtYXJ0VGFibGUuZ2V0Q3VycmVudFZhcmlhbnRJZCgpLFxuXHQgKiBcdFx0Y3VzdG9tRGF0YSA6IG9NeUN1c3RvbURhdGFcblx0ICogXHR9O1xuXHQgKlxuXHQgKiBcdHZhciBvU3RvcmVJbm5lckFwcFN0YXRlUHJvbWlzZSA9IG9OYXZpZ2F0aW9uSGFuZGxlci5zdG9yZUlubmVyQXBwU3RhdGUobUlubmVyQXBwRGF0YSk7XG5cdCAqXG5cdCAqIFx0b1N0b3JlSW5uZXJBcHBTdGF0ZVByb21pc2UuZG9uZShmdW5jdGlvbihzQXBwU3RhdGVLZXkpe1xuXHQgKiBcdFx0Ly95b3VyIGlubmVyIGFwcCBzdGF0ZSBpcyBzYXZlZCBub3csIHNBcHBTdGF0ZUtleSB3YXMgYWRkZWQgdG8gVVJMXG5cdCAqIFx0XHQvL3BlcmZvcm0gYWN0aW9ucyB0aGF0IG11c3QgcnVuIGFmdGVyIHNhdmVcblx0ICogXHR9KTtcblx0ICpcblx0ICogXHRvU3RvcmVJbm5lckFwcFN0YXRlUHJvbWlzZS5mYWlsKGZ1bmN0aW9uKG9FcnJvcil7XG5cdCAqIFx0XHQvL3NvbWUgZXJyb3IgaGFuZGxpbmdcblx0ICogXHR9KTtcblx0ICogfSk7XG5cdCAqIDwvY29kZT5cblx0ICogQGRlcHJlY2F0ZWRzaW5jZSAxLjEwNFxuXHQgKiBAZGVwcmVjYXRlZCBVc2UgdGhlIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5OYXZpZ2F0aW9uSGFuZGxlci5zdG9yZUlubmVyQXBwU3RhdGVBc3luY30gaW5zdGVhZC5cblx0ICovXG5cdHN0b3JlSW5uZXJBcHBTdGF0ZShtSW5uZXJBcHBEYXRhOiBJbm5lckFwcERhdGEsIGJJbW1lZGlhdGVIYXNoUmVwbGFjZT86IGJvb2xlYW4pOiBqUXVlcnkuUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRMb2cuZXJyb3IoXG5cdFx0XHRcIkRlcHJlY2F0ZWQgQVBJIGNhbGwgb2YgJ3NhcC5mZS5uYXZpZ2F0aW9uLk5hdmlnYXRpb25IYW5kbGVyLnN0b3JlSW5uZXJBcHBTdGF0ZScuIFBsZWFzZSB1c2UgJ3N0b3JlSW5uZXJBcHBTdGF0ZUFzeW5jJyBpbnN0ZWFkXCIsXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcInNhcC5mZS5uYXZpZ2F0aW9uLk5hdmlnYXRpb25IYW5kbGVyXCJcblx0XHQpO1xuXHRcdGlmICh0eXBlb2YgYkltbWVkaWF0ZUhhc2hSZXBsYWNlICE9PSBcImJvb2xlYW5cIikge1xuXHRcdFx0YkltbWVkaWF0ZUhhc2hSZXBsYWNlID0gdHJ1ZTsgLy8gZGVmYXVsdFxuXHRcdH1cblx0XHRjb25zdCBvTmF2SGFuZGxlciA9IHRoaXM7XG5cdFx0Y29uc3Qgb015RGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKTtcblxuXHRcdGNvbnN0IGZuUmVwbGFjZUhhc2ggPSBmdW5jdGlvbiAoc0FwcFN0YXRlS2V5OiBhbnkpIHtcblx0XHRcdGNvbnN0IG9IYXNoQ2hhbmdlciA9IG9OYXZIYW5kbGVyLm9Sb3V0ZXIub0hhc2hDaGFuZ2VyID8gb05hdkhhbmRsZXIub1JvdXRlci5vSGFzaENoYW5nZXIgOiBIYXNoQ2hhbmdlci5nZXRJbnN0YW5jZSgpO1xuXHRcdFx0Y29uc3Qgc0FwcEhhc2hPbGQgPSBvSGFzaENoYW5nZXIuZ2V0SGFzaCgpO1xuXHRcdFx0Lypcblx0XHRcdCAqIHVzZSAuZ2V0SGFzaCgpIGhlcmUgaW5zdGVhZCBvZiAuZ2V0QXBwSGFzaCgpIHRvIGFsc28gYmUgYWJsZSBkZWFsaW5nIHdpdGggZW52aXJvbm1lbnRzIHdoZXJlIG9ubHkgU0FQVUk1IGlzIGxvYWRlZCBhbmQgdGhlIFVTaGVsbFxuXHRcdFx0ICogaXMgbm90IGluaXRpYWxpemVkIHByb3Blcmx5LlxuXHRcdFx0ICovXG5cdFx0XHRjb25zdCBzQXBwSGFzaE5ldyA9IG9OYXZIYW5kbGVyLl9yZXBsYWNlSW5uZXJBcHBTdGF0ZUtleShzQXBwSGFzaE9sZCwgc0FwcFN0YXRlS2V5KTtcblx0XHRcdG9IYXNoQ2hhbmdlci5yZXBsYWNlSGFzaChzQXBwSGFzaE5ldyk7XG5cdFx0fTtcblxuXHRcdC8vIGluIGNhc2UgbUlubmVyQXBwU3RhdGUgaXMgZW1wdHksIGRvIG5vdCBvdmVyd3JpdGUgdGhlIGxhc3Qgc2F2ZWQgc3RhdGVcblx0XHRpZiAoaXNFbXB0eU9iamVjdChtSW5uZXJBcHBEYXRhIGFzIG9iamVjdCkpIHtcblx0XHRcdG9NeURlZmVycmVkLnJlc29sdmUoXCJcIik7XG5cdFx0XHRyZXR1cm4gb015RGVmZXJyZWQucHJvbWlzZSgpO1xuXHRcdH1cblxuXHRcdC8vIGNoZWNrIGlmIHdlIGFscmVhZHkgc2F2ZWQgdGhlIHNhbWUgZGF0YVxuXHRcdGNvbnN0IHNBcHBTdGF0ZUtleUNhY2hlZCA9IHRoaXMuX29MYXN0U2F2ZWRJbm5lckFwcERhdGEuc0FwcFN0YXRlS2V5O1xuXG5cdFx0Y29uc3QgYklubmVyQXBwRGF0YUVxdWFsID0gSlNPTi5zdHJpbmdpZnkobUlubmVyQXBwRGF0YSkgPT09IEpTT04uc3RyaW5naWZ5KHRoaXMuX29MYXN0U2F2ZWRJbm5lckFwcERhdGEub0FwcERhdGEpO1xuXHRcdGlmIChiSW5uZXJBcHBEYXRhRXF1YWwgJiYgc0FwcFN0YXRlS2V5Q2FjaGVkKSB7XG5cdFx0XHQvLyBwYXNzZWQgaW5uZXIgYXBwIHN0YXRlIGZvdW5kIGluIGNhY2hlXG5cdFx0XHR0aGlzLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLmlDYWNoZUhpdCsrO1xuXG5cdFx0XHQvLyByZXBsYWNlIGlubmVyIGFwcCBoYXNoIHdpdGggY2FjaGVkIGFwcFN0YXRlS2V5IGluIHVybCAoanVzdCBpbiBjYXNlIHRoZSBhcHAgaGFzIGNoYW5nZWQgdGhlIGhhc2ggaW4gbWVhbnRpbWUpXG5cdFx0XHRmblJlcGxhY2VIYXNoKHNBcHBTdGF0ZUtleUNhY2hlZCk7XG5cdFx0XHRvTXlEZWZlcnJlZC5yZXNvbHZlKHNBcHBTdGF0ZUtleUNhY2hlZCk7XG5cdFx0XHRyZXR1cm4gb015RGVmZXJyZWQucHJvbWlzZSgpO1xuXHRcdH1cblxuXHRcdC8vIHBhc3NlZCBpbm5lciBhcHAgc3RhdGUgbm90IGZvdW5kIGluIGNhY2hlXG5cdFx0dGhpcy5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5pQ2FjaGVNaXNzKys7XG5cblx0XHRjb25zdCBmbk9uQWZ0ZXJTYXZlID0gZnVuY3Rpb24gKHNBcHBTdGF0ZUtleTogYW55KSB7XG5cdFx0XHQvLyByZXBsYWNlIGlubmVyIGFwcCBoYXNoIHdpdGggbmV3IGFwcFN0YXRlS2V5IGluIHVybFxuXHRcdFx0aWYgKCFiSW1tZWRpYXRlSGFzaFJlcGxhY2UpIHtcblx0XHRcdFx0Zm5SZXBsYWNlSGFzaChzQXBwU3RhdGVLZXkpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyByZW1lbWJlciBsYXN0IHNhdmVkIHN0YXRlXG5cdFx0XHRvTmF2SGFuZGxlci5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5vQXBwRGF0YSA9IG1Jbm5lckFwcERhdGE7XG5cdFx0XHRvTmF2SGFuZGxlci5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5zQXBwU3RhdGVLZXkgPSBzQXBwU3RhdGVLZXk7XG5cdFx0XHRvTXlEZWZlcnJlZC5yZXNvbHZlKHNBcHBTdGF0ZUtleSk7XG5cdFx0fTtcblxuXHRcdGNvbnN0IGZuT25FcnJvciA9IGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0b015RGVmZXJyZWQucmVqZWN0KG9FcnJvcik7XG5cdFx0fTtcblxuXHRcdGNvbnN0IHNBcHBTdGF0ZUtleSA9IHRoaXMuX3NhdmVBcHBTdGF0ZShtSW5uZXJBcHBEYXRhLCBmbk9uQWZ0ZXJTYXZlLCBmbk9uRXJyb3IpO1xuXHRcdC8qXG5cdFx0ICogTm90ZSB0aGF0IF9zYXBBcHBTdGF0ZSBtYXkgcmV0dXJuICd1bmRlZmluZWQnIGluIGNhc2UgdGhhdCB0aGUgcGFyc2luZyBoYXMgZmFpbGVkLiBJbiB0aGlzIGNhc2UsIHdlIHNob3VsZCBub3QgdHJpZ2dlciB0aGUgcmVwbGFjZW1lbnRcblx0XHQgKiBvZiB0aGUgQXBwIEhhc2ggd2l0aCB0aGUgZ2VuZXJhdGVkIGtleSwgYXMgdGhlIGNvbnRhaW5lciB3YXMgbm90IHdyaXR0ZW4gYmVmb3JlLiBOb3RlIGFzIHdlbGwgdGhhdCB0aGUgZXJyb3IgaGFuZGxpbmcgaGFzIGFscmVhZHlcblx0XHQgKiBoYXBwZW5lZCBiZWZvcmUgYnkgbWFraW5nIHRoZSBvTXlEZWZlcnJlZCBwcm9taXNlIGZhaWwgKHNlZSBmbk9uRXJyb3IgYWJvdmUpLlxuXHRcdCAqL1xuXHRcdGlmIChzQXBwU3RhdGVLZXkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gcmVwbGFjZSBpbm5lciBhcHAgaGFzaCB3aXRoIG5ldyBhcHBTdGF0ZUtleSBpbiB1cmxcblx0XHRcdC8vIG5vdGU6IHdlIGRvIG5vdCB3YWl0IGZvciB0aGUgc2F2ZSB0byBiZSBjb21wbGV0ZWQ6IHRoaXMgYXN5bmNocm9ub3VzbHkgYmVoYXZpb3VyIGlzIG5lY2Vzc2FyeSBpZlxuXHRcdFx0Ly8gdGhpcyBtZXRob2QgaXMgY2FsbGVkIGUuZy4gaW4gYSBvbkxpbmtQcmVzc2VkIGV2ZW50IHdpdGggbm8gcG9zc2liaWxpdHkgdG8gd2FpdCBmb3IgdGhlIHByb21pc2UgcmVzb2x1dGlvblxuXHRcdFx0aWYgKGJJbW1lZGlhdGVIYXNoUmVwbGFjZSkge1xuXHRcdFx0XHRmblJlcGxhY2VIYXNoKHNBcHBTdGF0ZUtleSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9NeURlZmVycmVkLnByb21pc2UoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGFuZ2VzIHRoZSBVUkwgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGFwcCBzdGF0ZSBhbmQgc3RvcmVzIHRoZSBhcHAgc3RhdGUgZm9yIGxhdGVyIHJldHJpZXZhbC5cblx0ICpcblx0ICogQHBhcmFtIG1Jbm5lckFwcERhdGEgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGFwcFxuXHQgKiBAcGFyYW0gYkltbWVkaWF0ZUhhc2hSZXBsYWNlIElmIHNldCB0byBmYWxzZSwgdGhlIGlubmVyIGFwcCBoYXNoIHdpbGwgbm90IGJlIHJlcGxhY2VkIHVudGlsIHN0b3JpbmcgaXMgc3VjY2Vzc2Z1bDsgZG8gbm90XG5cdCAqICAgICAgICBzZXQgdG8gZmFsc2UgaWYgeW91IGNhbm5vdCByZWFjdCB0byB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgUHJvbWlzZSwgZm9yIGV4YW1wbGUsIHdoZW4gY2FsbGluZyB0aGUgYmVmb3JlTGlua1ByZXNzZWQgZXZlbnQuIDxiPk5vdGU6PC9iPklmXG5cdCAqICAgICAgICBub3QgcHJvdmlkZWQgaXQgd2lsbCBiZSB0cmVhdGVkIGFzIHNldCB0byBmYWxzZS4gPGI+Tm90ZTo8L2I+SWYgc2V0IHRvIHRydWUsIHRoZSBjYWxsaW5nIGluc3RhbmNlIGhhcyB0byBlbnN1cmUgdGhhdCBhIGZvbGxvdy1vblxuXHQgKiAgICAgICAgY2FsbCB0byA8Y29kZT5yZXBsYWNlSGFzaDwvY29kZT4gd2lsbCB0YWtlIHBsYWNlIVxuXHQgKiBAcmV0dXJucyBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgYXBwU3RhdGVJZCBhbmQgYSBwcm9taXNlIG9iamVjdCB0byBtb25pdG9yIHdoZW4gYWxsIHRoZSBhY3Rpb25zIG9mIHRoZSBmdW5jdGlvbiBoYXZlIGJlZW5cblx0ICogICAgICAgICAgZXhlY3V0ZWQ7IFBsZWFzZSBub3RlIHRoYXQgdGhlIGFwcFN0YXRlS2V5IG1heSBiZSB1bmRlZmluZWQgb3IgZW1wdHkuXG5cdCAqIEBleGFtcGxlIDxjb2RlPlxuXHQgKiBzYXAudWkuZGVmaW5lKFtcInNhcC9mZS9uYXZpZ2F0aW9uL05hdmlnYXRpb25IYW5kbGVyXCJdLCBmdW5jdGlvbiAoTmF2aWdhdGlvbkhhbmRsZXIpIHtcblx0ICogXHR2YXIgb05hdmlnYXRpb25IYW5kbGVyID0gbmV3IE5hdmlnYXRpb25IYW5kbGVyKG9Db250cm9sbGVyKTtcblx0ICogXHR2YXIgbUlubmVyQXBwRGF0YSA9IHtcblx0ICogXHRcdHNlbGVjdGlvblZhcmlhbnQgOiBvU21hcnRGaWx0ZXJCYXIuZ2V0RGF0YVN1aXRlRm9ybWF0KCksXG5cdCAqIFx0XHR0YWJsZVZhcmlhbnRJZCA6IG9TbWFydFRhYmxlLmdldEN1cnJlbnRWYXJpYW50SWQoKSxcblx0ICogXHRcdGN1c3RvbURhdGEgOiBvTXlDdXN0b21EYXRhXG5cdCAqIFx0fTtcblx0ICpcblx0ICogXHR2YXIgb1N0b3JlSW5uZXJBcHBTdGF0ZSA9IHN0b3JlSW5uZXJBcHBTdGF0ZVdpdGhOb25EZWxheWVkUmV0dXJuKG1Jbm5lckFwcERhdGEpO1xuXHQgKiBcdHZhciBzQXBwU3RhdGVLZXkgPSBvU3RvcmVJbm5lckFwcFN0YXRlLmFwcFN0YXRlS2V5O1xuXHQgKiBcdGlmICghc0FwcFN0YXRlS2V5KSB7XG5cdCAqICAgIC8vIG5vIGFwcFN0YXRlS2V5IG9idGFpbmVkLi4uXG5cdCAqIFx0fTtcblx0ICogXHR2YXIgb1N0b3JlSW5uZXJBcHBTdGF0ZVByb21pc2UgPSBvU3RvcmVJbm5lckFwcFN0YXRlLnByb21pc2U7XG5cdCAqXG5cdCAqIFx0b1N0b3JlSW5uZXJBcHBTdGF0ZVByb21pc2UuZG9uZShmdW5jdGlvbihzQXBwU3RhdGVLZXkpe1xuXHQgKiBcdFx0Ly95b3VyIGlubmVyIGFwcCBzdGF0ZSBpcyBzYXZlZCBub3csIHNBcHBTdGF0ZUtleSB3YXMgYWRkZWQgdG8gVVJMXG5cdCAqIFx0XHQvL3BlcmZvcm0gYWN0aW9ucyB0aGF0IG11c3QgcnVuIGFmdGVyIHNhdmVcblx0ICogXHR9KTtcblx0ICpcblx0ICogXHRvU3RvcmVJbm5lckFwcFN0YXRlUHJvbWlzZS5mYWlsKGZ1bmN0aW9uKG9FcnJvcil7XG5cdCAqIFx0XHQvL3NvbWUgZXJyb3IgaGFuZGxpbmdcblx0ICogXHR9KTtcblx0ICogfSk7XG5cdCAqIDwvY29kZT5cblx0ICogQHB1YmxpY1xuXHQgKiBAZGVwcmVjYXRlZHNpbmNlIDEuMTA0XG5cdCAqIEBkZXByZWNhdGVkIFVzZSB0aGUge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdmlnYXRpb25IYW5kbGVyLnN0b3JlSW5uZXJBcHBTdGF0ZUFzeW5jfSBpbnN0ZWFkLlxuXHQgKi9cblx0c3RvcmVJbm5lckFwcFN0YXRlV2l0aEltbWVkaWF0ZVJldHVybihtSW5uZXJBcHBEYXRhOiBJbm5lckFwcERhdGEsIGJJbW1lZGlhdGVIYXNoUmVwbGFjZT86IGJvb2xlYW4pOiBvYmplY3Qge1xuXHRcdExvZy5lcnJvcihcblx0XHRcdFwiRGVwcmVjYXRlZCBBUEkgY2FsbCBvZiAnc2FwLmZlLm5hdmlnYXRpb24uTmF2aWdhdGlvbkhhbmRsZXIuc3RvcmVJbm5lckFwcFN0YXRlV2l0aEltbWVkaWF0ZVJldHVybicuIFBsZWFzZSB1c2UgJ3N0b3JlSW5uZXJBcHBTdGF0ZUFzeW5jJyBpbnN0ZWFkXCIsXG5cdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcInNhcC5mZS5uYXZpZ2F0aW9uLk5hdmlnYXRpb25IYW5kbGVyXCJcblx0XHQpO1xuXHRcdGlmICh0eXBlb2YgYkltbWVkaWF0ZUhhc2hSZXBsYWNlICE9PSBcImJvb2xlYW5cIikge1xuXHRcdFx0YkltbWVkaWF0ZUhhc2hSZXBsYWNlID0gZmFsc2U7IC8vIGRlZmF1bHRcblx0XHR9XG5cblx0XHRjb25zdCBvTmF2SGFuZGxlciA9IHRoaXM7XG5cdFx0Y29uc3Qgb0FwcFN0YXRlUHJvbWlzZSA9IGpRdWVyeS5EZWZlcnJlZCgpO1xuXG5cdFx0Ly8gaW4gY2FzZSBtSW5uZXJBcHBTdGF0ZSBpcyBlbXB0eSwgZG8gbm90IG92ZXJ3cml0ZSB0aGUgbGFzdCBzYXZlZCBzdGF0ZVxuXHRcdGlmIChpc0VtcHR5T2JqZWN0KG1Jbm5lckFwcERhdGEpKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRhcHBTdGF0ZUtleTogXCJcIixcblx0XHRcdFx0cHJvbWlzZTogb0FwcFN0YXRlUHJvbWlzZS5yZXNvbHZlKFwiXCIpXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIGNoZWNrIGlmIHdlIGFscmVhZHkgc2F2ZWQgdGhlIHNhbWUgZGF0YVxuXHRcdGNvbnN0IHNBcHBTdGF0ZUtleUNhY2hlZCA9IHRoaXMuX29MYXN0U2F2ZWRJbm5lckFwcERhdGEuc0FwcFN0YXRlS2V5O1xuXG5cdFx0Y29uc3QgYklubmVyQXBwRGF0YUVxdWFsID0gSlNPTi5zdHJpbmdpZnkobUlubmVyQXBwRGF0YSkgPT09IEpTT04uc3RyaW5naWZ5KHRoaXMuX29MYXN0U2F2ZWRJbm5lckFwcERhdGEub0FwcERhdGEpO1xuXHRcdGlmIChiSW5uZXJBcHBEYXRhRXF1YWwgJiYgc0FwcFN0YXRlS2V5Q2FjaGVkKSB7XG5cdFx0XHQvLyBwYXNzZWQgaW5uZXIgYXBwIHN0YXRlIGZvdW5kIGluIGNhY2hlXG5cdFx0XHR0aGlzLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLmlDYWNoZUhpdCsrO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0YXBwU3RhdGVLZXk6IHNBcHBTdGF0ZUtleUNhY2hlZCxcblx0XHRcdFx0cHJvbWlzZTogb0FwcFN0YXRlUHJvbWlzZS5yZXNvbHZlKHNBcHBTdGF0ZUtleUNhY2hlZClcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Ly8gcGFzc2VkIGlubmVyIGFwcCBzdGF0ZSBub3QgZm91bmQgaW4gY2FjaGVcblx0XHR0aGlzLl9vTGFzdFNhdmVkSW5uZXJBcHBEYXRhLmlDYWNoZU1pc3MrKztcblxuXHRcdGNvbnN0IGZuT25BZnRlclNhdmUgPSBmdW5jdGlvbiAoc0FwcFN0YXRlS2V5OiBhbnkpIHtcblx0XHRcdC8vIHJlcGxhY2UgaW5uZXIgYXBwIGhhc2ggd2l0aCBuZXcgYXBwU3RhdGVLZXkgaW4gdXJsXG5cdFx0XHRpZiAoIWJJbW1lZGlhdGVIYXNoUmVwbGFjZSkge1xuXHRcdFx0XHRvTmF2SGFuZGxlci5yZXBsYWNlSGFzaChzQXBwU3RhdGVLZXkpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyByZW1lbWJlciBsYXN0IHNhdmVkIHN0YXRlXG5cdFx0XHRvTmF2SGFuZGxlci5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5vQXBwRGF0YSA9IG1Jbm5lckFwcERhdGE7XG5cdFx0XHRvTmF2SGFuZGxlci5fb0xhc3RTYXZlZElubmVyQXBwRGF0YS5zQXBwU3RhdGVLZXkgPSBzQXBwU3RhdGVLZXk7XG5cdFx0XHRvQXBwU3RhdGVQcm9taXNlLnJlc29sdmUoc0FwcFN0YXRlS2V5KTtcblx0XHR9O1xuXG5cdFx0Y29uc3QgZm5PbkVycm9yID0gZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRvQXBwU3RhdGVQcm9taXNlLnJlamVjdChvRXJyb3IpO1xuXHRcdH07XG5cblx0XHRjb25zdCBzQXBwU3RhdGVLZXkgPSB0aGlzLl9zYXZlQXBwU3RhdGUobUlubmVyQXBwRGF0YSwgZm5PbkFmdGVyU2F2ZSwgZm5PbkVycm9yKTtcblx0XHQvKlxuXHRcdCAqIE5vdGUgdGhhdCBfc2FwQXBwU3RhdGUgbWF5IHJldHVybiAndW5kZWZpbmVkJyBpbiBjYXNlIHRoYXQgdGhlIHBhcnNpbmcgaGFzIGZhaWxlZC4gSW4gdGhpcyBjYXNlLCB3ZSBzaG91bGQgbm90IHRyaWdnZXIgdGhlIHJlcGxhY2VtZW50XG5cdFx0ICogb2YgdGhlIEFwcCBIYXNoIHdpdGggdGhlIGdlbmVyYXRlZCBrZXksIGFzIHRoZSBjb250YWluZXIgd2FzIG5vdCB3cml0dGVuIGJlZm9yZS4gTm90ZSBhcyB3ZWxsIHRoYXQgdGhlIGVycm9yIGhhbmRsaW5nIGhhcyBhbHJlYWR5XG5cdFx0ICogaGFwcGVuZWQgYmVmb3JlIGJ5IG1ha2luZyB0aGUgb015RGVmZXJyZWQgcHJvbWlzZSBmYWlsIChzZWUgZm5PbkVycm9yIGFib3ZlKS5cblx0XHQgKi9cblx0XHQvLyBpZiAoc0FwcFN0YXRlS2V5ICE9PSB1bmRlZmluZWQpIHtcblx0XHQvLyAvL3JlcGxhY2UgaW5uZXIgYXBwIGhhc2ggd2l0aCBuZXcgYXBwU3RhdGVLZXkgaW4gdXJsXG5cdFx0Ly8gLy9ub3RlOiB3ZSBkbyBub3Qgd2FpdCBmb3IgdGhlIHNhdmUgdG8gYmUgY29tcGxldGVkOiB0aGlzIGFzeW5jaHJvbm91c2x5IGJlaGF2aW91ciBpcyBuZWNlc3NhcnkgaWZcblx0XHQvLyAvL3RoaXMgbWV0aG9kIGlzIGNhbGxlZCBlLmcuIGluIGEgb25MaW5rUHJlc3NlZCBldmVudCB3aXRoIG5vIHBvc3NpYmlsaXR5IHRvIHdhaXQgZm9yIHRoZSBwcm9taXNlIHJlc29sdXRpb25cblx0XHQvLyBpZiAoYkltbWVkaWF0ZUhhc2hSZXBsYWNlKSB7XG5cdFx0Ly8gZm5SZXBsYWNlSGFzaChzQXBwU3RhdGVLZXkpO1xuXHRcdC8vIH1cblx0XHQvLyB9XG5cdFx0cmV0dXJuIHtcblx0XHRcdGFwcFN0YXRlS2V5OiBzQXBwU3RhdGVLZXksXG5cdFx0XHRwcm9taXNlOiBvQXBwU3RhdGVQcm9taXNlLnByb21pc2UoKVxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2Vzc2VzIG5hdmlnYXRpb24tcmVsYXRlZCB0YXNrcyByZWxhdGVkIHRvIGJlZm9yZVBvcG92ZXJPcGVucyBldmVudCBoYW5kbGluZyBmb3IgdGhlIFNtYXJ0TGluayBjb250cm9sIGFuZCByZXR1cm5zIGEgUHJvbWlzZSBvYmplY3QuIEluXG5cdCAqIHBhcnRpY3VsYXIsIHRoZSBmb2xsb3dpbmcgdGFza3MgYXJlIHBlcmZvcm1lZCBiZWZvcmUgdGhlIFNtYXJ0TGluayBwb3BvdmVyIGNhbiBiZSBvcGVuZWQ6XG5cdCAqIDx1bD5cblx0ICogPGxpPklmIDxjb2RlPm1Jbm5lckFwcERhdGE8L2NvZGU+IGlzIHByb3ZpZGVkLCB0aGlzIGlubmVyIGFwcCBzdGF0ZSBpcyBzYXZlZCBmb3IgYmFjayBuYXZpZ2F0aW9uIGF0IGEgbGF0ZXIgdGltZS48L2xpPlxuXHQgKiA8bGk+VGhlIHRhYmxlIGV2ZW50IHBhcmFtZXRlcnMgKHNlbWFudGljIGF0dHJpYnV0ZXMpIGFuZCB0aGUgc2VsZWN0aW9uIHZhcmlhbnQgZGF0YSBhcmUgY29tYmluZWQgYnkgY2FsbGluZyB0aGUgbWV0aG9kXG5cdCAqIHtAbGluayAjLm1peEF0dHJpYnV0ZXNBbmRTZWxlY3Rpb25WYXJpYW50IG1peEF0dHJpYnV0ZXNBbmRTZWxlY3Rpb25WYXJpYW50fS48L2xpPlxuXHQgKiA8bGk+VGhlIGNvbWJpbmVkIGRhdGEgaXMgc2F2ZWQgYXMgdGhlIGNyb3NzIGFwcCBzdGF0ZSB0byBiZSBoYW5kZWQgb3ZlciB0byB0aGUgdGFyZ2V0IGFwcCwgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHNhcC14YXBwLXN0YXRlIGtleSBpcyBzZXRcblx0ICogaW4gdGhlIFVSTC48L2xpPlxuXHQgKiA8bGk+QWxsIHNpbmdsZSBzZWxlY3Rpb25zIChcImluY2x1ZGluZyBlcXVhbFwiKSBvZiB0aGUgY29tYmluZWQgc2VsZWN0aW9uIGRhdGEgYXJlIHBhc3NlZCB0byB0aGUgU21hcnRMaW5rIHBvcG92ZXIgYXMgc2VtYW50aWMgYXR0cmlidXRlcy48L2xpPlxuXHQgKiA8bGk+VGhlIG1ldGhvZCA8Y29kZT5vVGFibGVFdmVudFBhcmFtZXRlcnMub3BlbigpPC9jb2RlPiBpcyBjYWxsZWQuIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IHJlYWxseSBvcGVuIHRoZSBwb3BvdmVyLCBidXQgdGhlIFNtYXJ0TGlua1xuXHQgKiBjb250cm9sIHByb2NlZWRzIHdpdGggZmlyaW5nIHRoZSBldmVudCA8Y29kZT5uYXZpZ2F0aW9uVGFyZ2V0c09idGFpbmVkPC9jb2RlPi48L2xpPlxuXHQgKiA8L3VsPi5cblx0ICogPGJyPlxuXHQgKiA8Yj5Ob2RlOjwvYj4gSWYgdGhlIDxjb2RlPm9FeHRlcm5hbEFwcERhdGE8L2NvZGU+IHBhcmFtZXRlciBpcyBub3Qgc3VwcGxpZWQsIHRoZSBleHRlcm5hbCBhcHAgZGF0YSB3aWxsIGJlIGNhbGN1bGF0ZWQgYmFzZWQgb25cblx0ICogdGhlIDxjb2RlPm1Jbm5lckFwcERhdGE8L2NvZGU+IGRhdGEuPGJyPi5cblx0ICpcblx0ICogQHBhcmFtIG9UYWJsZUV2ZW50UGFyYW1ldGVycyBUaGUgcGFyYW1ldGVycyBtYWRlIGF2YWlsYWJsZSBieSB0aGUgU21hcnRUYWJsZSBjb250cm9sIHdoZW4gdGhlIFNtYXJ0TGluayBjb250cm9sIGhhcyBiZWVuIGNsaWNrZWQsXG5cdCAqICAgICAgICBhbiBpbnN0YW5jZSBvZiBhIFBvcE92ZXIgb2JqZWN0XG5cdCAqIEBwYXJhbSBzU2VsZWN0aW9uVmFyaWFudCBTdHJpbmdpZmllZCBKU09OIG9iamVjdCBhcyByZXR1cm5lZCwgZm9yIGV4YW1wbGUsIGZyb20gZ2V0RGF0YVN1aXRlRm9ybWF0KCkgb2YgdGhlIFNtYXJ0RmlsdGVyQmFyIGNvbnRyb2xcblx0ICogQHBhcmFtIG1Jbm5lckFwcERhdGEgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGFwcC4gSWYgcHJvdmlkZWQsIG9wZW5pbmcgdGhlIFBvcG92ZXIgaXMgZGVmZXJyZWQgdW50aWwgdGhlXG5cdCAqICAgICAgICBpbm5lciBhcHAgZGF0YSBpcyBzYXZlZCBpbiBhIGNvbnNpc3RlbnQgd2F5LlxuXHQgKiBAcGFyYW0gb0V4dGVybmFsQXBwRGF0YSBPYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgd2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHRhcmdldCBzY3JlZW4uXG5cdCAqIEBwYXJhbSBvRXh0ZXJuYWxBcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQgT2JqZWN0IGNvbnRhaW5pbmcgc2VsZWN0aW9uVmFyaWFudCwgd2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHRhcmdldCBzY3JlZW4uIElmIG5vdFxuXHQgKiAgICAgICAgc2V0IHRoZSBzU2VsZWN0aW9uVmFyaWFudCB3aWxsIGJlIHVzZWQuXG5cdCAqIEBwYXJhbSBvRXh0ZXJuYWxBcHBEYXRhLnByZXNlbnRhdGlvblZhcmlhbnQgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgdWkgcHJlc2VudGF0aW9uVmFyaWFudCBvZiB0aGUgYXBwLCB3aGljaCB3aWxsIGJlXG5cdCAqICAgICAgICBwYXNzZWQgdG8gdGhlIHRhcmdldCBzY3JlZW5cblx0ICogQHBhcmFtIG9FeHRlcm5hbEFwcERhdGEudmFsdWVUZXh0cyBPYmplY3QgY29udGFpbmluZyB2YWx1ZSBkZXNjcmlwdGlvbnMsIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSB0YXJnZXQgc2NyZWVuXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSBvYmplY3QgdG8gbW9uaXRvciB3aGVuIGFsbCBhY3Rpb25zIG9mIHRoZSBmdW5jdGlvbiBoYXZlIGJlZW4gZXhlY3V0ZWQ7IGlmIHRoZSBleGVjdXRpb24gaXMgc3VjY2Vzc2Z1bCwgdGhlXG5cdCAqICAgICAgICAgIG1vZGlmaWVkIG9UYWJsZUV2ZW50UGFyYW1ldGVycyBpcyByZXR1cm5lZDsgaWYgYW4gZXJyb3Igb2NjdXJzLCBhbiBlcnJvciBvYmplY3Qgb2YgdHlwZVxuXHQgKiAgICAgICAgICB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uTmF2RXJyb3J9IGlzIHJldHVybmVkXG5cdCAqIEBwdWJsaWNcblx0ICogQGV4YW1wbGUgPGNvZGU+XG5cdCAqIHNhcC51aS5kZWZpbmUoW1wic2FwL2ZlL25hdmlnYXRpb24vTmF2aWdhdGlvbkhhbmRsZXJcIiwgXCJzYXAvZmUvbmF2aWdhdGlvbi9TZWxlY3Rpb25WYXJpYW50XCJdLCBmdW5jdGlvbiAoTmF2aWdhdGlvbkhhbmRsZXIsIFNlbGVjdGlvblZhcmlhbnQpIHtcblx0ICogXHQvL2V2ZW50IGhhbmRsZXIgZm9yIHRoZSBzbWFydCBsaW5rIGV2ZW50IFwiYmVmb3JlUG9wb3Zlck9wZW5zXCJcblx0ICogXHRcdG9uQmVmb3JlUG9wb3Zlck9wZW5zOiBmdW5jdGlvbihvRXZlbnQpIHtcblx0ICogXHRcdFx0dmFyIG9UYWJsZUV2ZW50UGFyYW1ldGVycyA9IG9FdmVudC5nZXRQYXJhbWV0ZXJzKCk7XG5cdCAqXG5cdCAqIFx0XHRcdHZhciBtSW5uZXJBcHBEYXRhID0ge1xuXHQgKiBcdFx0XHRcdHNlbGVjdGlvblZhcmlhbnQgOiBvU21hcnRGaWx0ZXJCYXIuZ2V0RGF0YVN1aXRlRm9ybWF0KCksXG5cdCAqIFx0XHRcdFx0dGFibGVWYXJpYW50SWQgOiBvU21hcnRUYWJsZS5nZXRDdXJyZW50VmFyaWFudElkKCksXG5cdCAqIFx0XHRcdFx0Y3VzdG9tRGF0YSA6IG9NeUN1c3RvbURhdGFcblx0ICogXHRcdFx0fTtcblx0ICpcblx0ICogXHRcdFx0dmFyIG9TZWxlY3Rpb25WYXJpYW50ID0gbmV3IFNlbGVjdGlvblZhcmlhbnQoKTtcblx0ICogXHRcdFx0b1NlbGVjdGlvblZhcmlhbnQuYWRkU2VsZWN0T3B0aW9uKFwiQ29tcGFueUNvZGVcIiwgXCJJXCIsIFwiRVFcIiwgXCIwMDAxXCIpO1xuXHQgKiBcdFx0XHRvU2VsZWN0aW9uVmFyaWFudC5hZGRTZWxlY3RPcHRpb24oXCJDdXN0b21lclwiLCBcIklcIiwgXCJFUVwiLCBcIkMwMDAxXCIpO1xuXHQgKiBcdFx0XHR2YXIgc1NlbGVjdGlvblZhcmlhbnQ9IG9TZWxlY3Rpb25WYXJpYW50LnRvSlNPTlN0cmluZygpO1xuXHQgKlxuXHQgKiBcdFx0XHR2YXIgb05hdmlnYXRpb25IYW5kbGVyID0gbmV3IE5hdmlnYXRpb25IYW5kbGVyKG9Db250cm9sbGVyKTtcblx0ICogXHRcdFx0dmFyIG9TbWFydExpbmtQcm9taXNlID0gb05hdmlnYXRpb25IYW5kbGVyLnByb2Nlc3NCZWZvcmVTbWFydExpbmtQb3BvdmVyT3BlbnMob1RhYmxlRXZlbnRQYXJhbWV0ZXJzLCBzU2VsZWN0aW9uVmFyaWFudCwgbUlubmVyQXBwRGF0YSk7XG5cdCAqXG5cdCAqIFx0XHRcdG9TbWFydExpbmtQcm9taXNlLmRvbmUoZnVuY3Rpb24ob1RhYmxlRXZlbnRQYXJhbWV0ZXJzKXtcblx0ICogXHRcdFx0XHQvLyBoZXJlIHlvdSBjYW4gYWRkIGNvZGluZyB0aGF0IHNob3VsZCBydW4gYWZ0ZXIgYWxsIGFwcCBzdGF0ZXMgYXJlIHNhdmVkIGFuZCB0aGUgc2VtYW50aWMgYXR0cmlidXRlcyBhcmUgc2V0XG5cdCAqIFx0XHRcdH0pO1xuXHQgKlxuXHQgKiBcdFx0XHRvU21hcnRMaW5rUHJvbWlzZS5mYWlsKGZ1bmN0aW9uKG9FcnJvcil7XG5cdCAqIFx0XHRcdC8vc29tZSBlcnJvciBoYW5kbGluZ1xuXHQgKiBcdFx0XHR9KTtcblx0ICogXHRcdH07XG5cdCAqIFx0fSk7XG5cdCAqIDwvY29kZT5cblx0ICovXG5cdHByb2Nlc3NCZWZvcmVTbWFydExpbmtQb3BvdmVyT3BlbnMoXG5cdFx0b1RhYmxlRXZlbnRQYXJhbWV0ZXJzOiBhbnksXG5cdFx0c1NlbGVjdGlvblZhcmlhbnQ6IHN0cmluZyxcblx0XHRtSW5uZXJBcHBEYXRhPzogSW5uZXJBcHBEYXRhLFxuXHRcdG9FeHRlcm5hbEFwcERhdGE/OiB7XG5cdFx0XHRzZWxlY3Rpb25WYXJpYW50Pzogb2JqZWN0O1xuXHRcdFx0cHJlc2VudGF0aW9uVmFyaWFudD86IG9iamVjdDtcblx0XHRcdHZhbHVlVGV4dHM/OiBvYmplY3Q7XG5cdFx0fVxuXHQpOiBKUXVlcnkuUHJvbWlzZTx1bmtub3duLCB1bmtub3duLCB1bmtub3duPiB7XG5cdFx0Y29uc3Qgb015RGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKSBhcyBKUXVlcnkuRGVmZXJyZWQ8dW5rbm93biwgdW5rbm93biwgdW5rbm93bj47XG5cdFx0bGV0IG1TZW1hbnRpY0F0dHJpYnV0ZXM6IGFueTtcblx0XHRpZiAob1RhYmxlRXZlbnRQYXJhbWV0ZXJzICE9IHVuZGVmaW5lZCkge1xuXHRcdFx0bVNlbWFudGljQXR0cmlidXRlcyA9IG9UYWJsZUV2ZW50UGFyYW1ldGVycy5zZW1hbnRpY0F0dHJpYnV0ZXM7XG5cdFx0fVxuXG5cdFx0bGV0IG9YQXBwRGF0YU9iajogYW55O1xuXHRcdGNvbnN0IG9OYXZIYW5kbGVyOiBOYXZpZ2F0aW9uSGFuZGxlciA9IHRoaXM7XG5cblx0XHRpZiAob0V4dGVybmFsQXBwRGF0YSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRvWEFwcERhdGFPYmogPSB7fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b1hBcHBEYXRhT2JqID0gb0V4dGVybmFsQXBwRGF0YTtcblx0XHR9XG5cblx0XHRjb25zdCBmblN0b3JlWGFwcEFuZENhbGxPcGVuID0gZnVuY3Rpb24gKG1TdWJTZW1hbnRpY0F0dHJpYnV0ZXM6IGFueSwgc1N1YlNlbGVjdGlvblZhcmlhbnQ6IGFueSkge1xuXHRcdFx0Ly8gbWl4IHRoZSBzZW1hbnRpYyBhdHRyaWJ1dGVzIChlLmcuIGZyb20gdGhlIHJvdyBsaW5lKSB3aXRoIHRoZSBzZWxlY3Rpb24gdmFyaWFudCAoZS5nLiBmcm9tIHRoZSBmaWx0ZXIgYmFyKVxuXHRcdFx0c1N1YlNlbGVjdGlvblZhcmlhbnQgPSBvWEFwcERhdGFPYmouc2VsZWN0aW9uVmFyaWFudCB8fCBzU3ViU2VsZWN0aW9uVmFyaWFudCB8fCBcInt9XCI7XG5cblx0XHRcdGNvbnN0IGlTdXBwcmVzc2lvbkJlaGF2aW9yID0gU3VwcHJlc3Npb25CZWhhdmlvci5yYWlzZUVycm9yT25OdWxsIHwgU3VwcHJlc3Npb25CZWhhdmlvci5yYWlzZUVycm9yT25VbmRlZmluZWQ7XG5cdFx0XHQvKlxuXHRcdFx0ICogY29tcGF0aWJsaXR5OiBVbnRpbCBTQVBVSTUgMS4yOC41IChvciBldmVuIGxhdGVyKSB0aGUgU21hcnQgTGluayBpbiBhIFNtYXJ0IFRhYmxlIGlzIGZpbHRlcmluZyBhbGwgbnVsbC0gYW5kIHVuZGVmaW5lZCB2YWx1ZXMuXG5cdFx0XHQgKiBUaGVyZWZvcmUsIG1TZW1hbnRpY0F0dHJpYnV0ZXMgYXJlIGFscmVhZHkgcmVkdWNlZCBhcHByb3ByaWF0ZWx5IC0tIHRoaXMgZG9lcyBub3QgbmVlZCB0byBiZSBkb25lIGJ5XG5cdFx0XHQgKiBtaXhBdHRyaWJ1dGVzQW5kU2VsZWN0aW9uVmFyaWFudCBhZ2Fpbi4gVG8gZW5zdXJlIHRoYXQgd2Ugc3RpbGwgaGF2ZSB0aGUgb2xkIGJlaGF2aW91ciAoaS5lLiBhbiBOYXZFcnJvciBpcyByYWlzZWQgaW4gY2FzZSB0aGF0XG5cdFx0XHQgKiBiZWhhdmlvdXIgb2YgdGhlIFNtYXJ0IExpbmsgY29udHJvbCBoYXMgY2hhbmdlZCksIHRoZSBcIm9sZFwiIFN1cHByZXNzaW9uIEJlaGF2aW91ciBpcyByZXRhaW5lZC5cblx0XHRcdCAqL1xuXG5cdFx0XHRjb25zdCBvTWl4ZWRTZWxWYXIgPSBvTmF2SGFuZGxlci5taXhBdHRyaWJ1dGVzQW5kU2VsZWN0aW9uVmFyaWFudChcblx0XHRcdFx0bVN1YlNlbWFudGljQXR0cmlidXRlcyxcblx0XHRcdFx0c1N1YlNlbGVjdGlvblZhcmlhbnQsXG5cdFx0XHRcdGlTdXBwcmVzc2lvbkJlaGF2aW9yXG5cdFx0XHQpO1xuXHRcdFx0c1N1YlNlbGVjdGlvblZhcmlhbnQgPSBvTWl4ZWRTZWxWYXIudG9KU09OU3RyaW5nKCk7XG5cblx0XHRcdC8vIGVucmljaCB0aGUgc2VtYW50aWMgYXR0cmlidXRlcyB3aXRoIHNpbmdsZSBzZWxlY3Rpb25zIGZyb20gdGhlIHNlbGVjdGlvbiB2YXJpYW50XG5cdFx0XHRsZXQgb1RtcERhdGE6IGFueSA9IHt9O1xuXHRcdFx0b1RtcERhdGEuc2VsZWN0aW9uVmFyaWFudCA9IG9NaXhlZFNlbFZhci50b0pTT05PYmplY3QoKTtcblxuXHRcdFx0b1RtcERhdGEgPSBvTmF2SGFuZGxlci5fcmVtb3ZlTWVhc3VyZUJhc2VkSW5mb3JtYXRpb24ob1RtcERhdGEpO1xuXG5cdFx0XHRvVG1wRGF0YSA9IG9OYXZIYW5kbGVyLl9jaGVja0lzUG90ZW50aWFsbHlTZW5zaXRpdmUob1RtcERhdGEpO1xuXG5cdFx0XHRtU3ViU2VtYW50aWNBdHRyaWJ1dGVzID0gb1RtcERhdGEuc2VsZWN0aW9uVmFyaWFudFxuXHRcdFx0XHQ/IG9OYXZIYW5kbGVyLl9nZXRVUkxQYXJhbWV0ZXJzRnJvbVNlbGVjdGlvblZhcmlhbnQobmV3IFNlbGVjdGlvblZhcmlhbnQob1RtcERhdGEuc2VsZWN0aW9uVmFyaWFudCkpXG5cdFx0XHRcdDoge307XG5cblx0XHRcdGNvbnN0IGZuT25Db250YWluZXJTYXZlID0gZnVuY3Rpb24gKHNBcHBTdGF0ZUtleTogYW55KSB7XG5cdFx0XHRcdGlmIChvVGFibGVFdmVudFBhcmFtZXRlcnMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdC8vIElmIG9UYWJsZUV2ZW50UGFyYW1ldGVycyBpcyB1bmRlZmluZWQsIHJldHVybiBib3RoIHNlbWFudGljQXR0cmlidXRlcyBhbmQgYXBwU3RhdGVrZXlcblx0XHRcdFx0XHRvTXlEZWZlcnJlZC5yZXNvbHZlKG1TdWJTZW1hbnRpY0F0dHJpYnV0ZXMsIHNBcHBTdGF0ZUtleSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gc2V0IHRoZSBzdG9yZWQgZGF0YSBpbiBwb3BvdmVyIGFuZCBjYWxsIG9wZW4oKVxuXHRcdFx0XHRcdG9UYWJsZUV2ZW50UGFyYW1ldGVycy5zZXRTZW1hbnRpY0F0dHJpYnV0ZXMobVN1YlNlbWFudGljQXR0cmlidXRlcyk7XG5cdFx0XHRcdFx0b1RhYmxlRXZlbnRQYXJhbWV0ZXJzLnNldEFwcFN0YXRlS2V5KHNBcHBTdGF0ZUtleSk7XG5cdFx0XHRcdFx0b1RhYmxlRXZlbnRQYXJhbWV0ZXJzLm9wZW4oKTsgLy8gPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4gTm90ZSB0aGF0IFwib3BlblwiIGRvZXMgbm90IG9wZW4gdGhlIHBvcG92ZXIsIGJ1dCBwcm9jZWVkc1xuXHRcdFx0XHRcdC8vIHdpdGggZmlyaW5nIHRoZSBvbk5hdlRhcmdldHNPYnRhaW5lZCBldmVudC5cblx0XHRcdFx0XHRvTXlEZWZlcnJlZC5yZXNvbHZlKG9UYWJsZUV2ZW50UGFyYW1ldGVycyk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRcdGNvbnN0IGZuT25FcnJvciA9IGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRvTXlEZWZlcnJlZC5yZWplY3Qob0Vycm9yKTtcblx0XHRcdH07XG5cblx0XHRcdG9YQXBwRGF0YU9iai5zZWxlY3Rpb25WYXJpYW50ID0gc1N1YlNlbGVjdGlvblZhcmlhbnQ7XG5cblx0XHRcdG9YQXBwRGF0YU9iaiA9IG9OYXZIYW5kbGVyLl9yZW1vdmVNZWFzdXJlQmFzZWRJbmZvcm1hdGlvbihvWEFwcERhdGFPYmopO1xuXG5cdFx0XHRvTmF2SGFuZGxlci5fc2F2ZUFwcFN0YXRlQXN5bmMob1hBcHBEYXRhT2JqLCBmbk9uQ29udGFpbmVyU2F2ZSwgZm5PbkVycm9yKTtcblx0XHR9O1xuXG5cdFx0aWYgKG1Jbm5lckFwcERhdGEpIHtcblx0XHRcdGNvbnN0IG9TdG9yZUlubmVyQXBwU3RhdGVQcm9taXNlID0gdGhpcy5zdG9yZUlubmVyQXBwU3RhdGVBc3luYyhtSW5uZXJBcHBEYXRhLCB0cnVlKTtcblxuXHRcdFx0Ly8gaWYgdGhlIGlubmVyIGFwcCBzdGF0ZSB3YXMgc3VjY2Vzc2Z1bGx5IHN0b3JlZCwgc3RvcmUgYWxzbyB0aGUgeGFwcC1zdGF0ZVxuXHRcdFx0b1N0b3JlSW5uZXJBcHBTdGF0ZVByb21pc2UuZG9uZShmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGZuU3RvcmVYYXBwQW5kQ2FsbE9wZW4obVNlbWFudGljQXR0cmlidXRlcywgc1NlbGVjdGlvblZhcmlhbnQpO1xuXHRcdFx0fSk7XG5cblx0XHRcdG9TdG9yZUlubmVyQXBwU3RhdGVQcm9taXNlLmZhaWwoZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdG9NeURlZmVycmVkLnJlamVjdChvRXJyb3IpO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHRoZXJlIGlzIG5vIGlubmVyIGFwcCBzdGF0ZSB0byBzYXZlLCBqdXN0IHB1dCB0aGUgcGFyYW1ldGVycyBpbnRvIHhhcHAtc3RhdGVcblx0XHRcdGZuU3RvcmVYYXBwQW5kQ2FsbE9wZW4obVNlbWFudGljQXR0cmlidXRlcywgc1NlbGVjdGlvblZhcmlhbnQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBvTXlEZWZlcnJlZC5wcm9taXNlKCk7XG5cdH1cblxuXHQvKipcblx0ICogUHJvY2Vzc2VzIHNlbGVjdGlvblZhcmlhbnQgc3RyaW5nIGFuZCByZXR1cm5zIGEgUHJvbWlzZSBvYmplY3QgKHNlbWFudGljQXR0cmlidXRlcyBhbmQgQXBwU3RhdGVLZXkpLlxuXHQgKlxuXHQgKiBAcGFyYW0gc1NlbGVjdGlvblZhcmlhbnQgU3RyaW5naWZpZWQgSlNPTiBvYmplY3Rcblx0ICogQHJldHVybnMgQSBQcm9taXNlIG9iamVjdCB0byBtb25pdG9yIHdoZW4gYWxsIGFjdGlvbnMgb2YgdGhlIGZ1bmN0aW9uIGhhdmUgYmVlbiBleGVjdXRlZDsgaWYgdGhlIGV4ZWN1dGlvbiBpcyBzdWNjZXNzZnVsLCB0aGVcblx0ICogICAgICAgICAgc2VtYW50aWNBdHRyaWJ1dGVzIGFzIHdlbGwgYXMgdGhlIGFwcFN0YXRlS2V5IGFyZSByZXR1cm5lZDsgaWYgYW4gZXJyb3Igb2NjdXJzLCBhbiBlcnJvciBvYmplY3Qgb2YgdHlwZVxuXHQgKiAgICAgICAgICB7QGxpbmsgc2FwLmZlLm5hdmlnYXRpb24uTmF2RXJyb3J9IGlzIHJldHVybmVkXG5cdCAqIDxicj5cblx0ICogQGV4YW1wbGUgPGNvZGU+XG5cdCAqIHNhcC51aS5kZWZpbmUoW1wic2FwL2ZlL25hdmlnYXRpb24vTmF2aWdhdGlvbkhhbmRsZXJcIiwgXCJzYXAvZmUvbmF2aWdhdGlvbi9TZWxlY3Rpb25WYXJpYW50XCJdLCBmdW5jdGlvbiAoTmF2aWdhdGlvbkhhbmRsZXIsIFNlbGVjdGlvblZhcmlhbnQpIHtcblx0ICogXHRcdHZhciBvU2VsZWN0aW9uVmFyaWFudCA9IG5ldyBTZWxlY3Rpb25WYXJpYW50KCk7XG5cdCAqIFx0XHRvU2VsZWN0aW9uVmFyaWFudC5hZGRTZWxlY3RPcHRpb24oXCJDb21wYW55Q29kZVwiLCBcIklcIiwgXCJFUVwiLCBcIjAwMDFcIik7XG5cdCAqIFx0XHRvU2VsZWN0aW9uVmFyaWFudC5hZGRTZWxlY3RPcHRpb24oXCJDdXN0b21lclwiLCBcIklcIiwgXCJFUVwiLCBcIkMwMDAxXCIpO1xuXHQgKiBcdFx0dmFyIHNTZWxlY3Rpb25WYXJpYW50PSBvU2VsZWN0aW9uVmFyaWFudC50b0pTT05TdHJpbmcoKTtcblx0ICpcblx0ICogXHRcdHZhciBvTmF2aWdhdGlvbkhhbmRsZXIgPSBuZXcgTmF2aWdhdGlvbkhhbmRsZXIob0NvbnRyb2xsZXIpO1xuXHQgKiBcdFx0dmFyIG9Qcm9taXNlT2JqZWN0ID0gb05hdmlnYXRpb25IYW5kbGVyLl9nZXRBcHBTdGF0ZUtleUFuZFVybFBhcmFtZXRlcnMoc1NlbGVjdGlvblZhcmlhbnQpO1xuXHQgKlxuXHQgKiBcdFx0b1Byb21pc2VPYmplY3QuZG9uZShmdW5jdGlvbihvU2VtYW50aWNBdHRyaWJ1dGVzLCBzQXBwU3RhdGVLZXkpe1xuXHQgKiBcdFx0XHQvLyBoZXJlIHlvdSBjYW4gYWRkIGNvZGluZyB0aGF0IHNob3VsZCBydW4gYWZ0ZXIgYWxsIGFwcCBzdGF0ZSBhbmQgdGhlIHNlbWFudGljIGF0dHJpYnV0ZXMgaGF2ZSBiZWVuIHJldHVybmVkLlxuXHQgKiBcdFx0fSk7XG5cdCAqXG5cdCAqIFx0XHRvUHJvbWlzZU9iamVjdC5mYWlsKGZ1bmN0aW9uKG9FcnJvcil7XG5cdCAqIFx0XHRcdC8vc29tZSBlcnJvciBoYW5kbGluZ1xuXHQgKiBcdFx0fSk7XG5cdCAqXHR9KTtcblx0ICogPC9jb2RlPlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICovXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJvbWlzZS1mdW5jdGlvbi1hc3luY1xuXHRfZ2V0QXBwU3RhdGVLZXlBbmRVcmxQYXJhbWV0ZXJzKHNTZWxlY3Rpb25WYXJpYW50OiBzdHJpbmcpOiBKUXVlcnkuUHJvbWlzZTx1bmtub3duLCB1bmtub3duLCB1bmtub3duPiB7XG5cdFx0cmV0dXJuIHRoaXMucHJvY2Vzc0JlZm9yZVNtYXJ0TGlua1BvcG92ZXJPcGVucyh1bmRlZmluZWQsIHNTZWxlY3Rpb25WYXJpYW50LCB1bmRlZmluZWQsIHVuZGVmaW5lZCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IEFwcCBzcGVjaWZpYyBoYXNoLlxuXHQgKlxuXHQgKiBAcGFyYW0gYXBwSGFzaCBUaGUgcGF0aCBzdHJpbmdcblx0ICogQHJldHVybnMgQSBzdHJpbmcgcmVwcmVzZW50aW5nIGJhc2UgcGF0aFxuXHQgKlxuXHQgKi9cblx0YXN5bmMgX2dldEFwcFNwZWNpZmljSGFzaChhcHBIYXNoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBjcm9zc0FwcFNlcnZpY2UgPSBhd2FpdCB0aGlzLl9nZXRBcHBOYXZpZ2F0aW9uU2VydmljZUFzeW5jKCk7XG5cdFx0XHRyZXR1cm4gYXdhaXQgY3Jvc3NBcHBTZXJ2aWNlLmdldEhyZWYoeyBhcHBTcGVjaWZpY1JvdXRlOiBhcHBIYXNoIH0pO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHRjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuXHRcdFx0TG9nLmVycm9yKGBGRSA6IENhbiBub3QgZmV0Y2ggQXBwIHNlcGNpZmljIFVSTCA6ICR7bWVzc2FnZX1gKTtcblx0XHRcdHRocm93IEVycm9yKG1lc3NhZ2UpO1xuXHRcdH1cblx0fVxuXG5cdF9taXhBdHRyaWJ1dGVzVG9TZWxWYXJpYW50KG1TZW1hbnRpY0F0dHJpYnV0ZXM6IGFueSwgb1NlbFZhcmlhbnQ6IGFueSwgaVN1cHByZXNzaW9uQmVoYXZpb3I6IGFueSkge1xuXHRcdC8vIGFkZCBhbGwgc2VtYW50aWMgYXR0cmlidXRlcyB0byB0aGUgbWl4ZWQgc2VsZWN0aW9uIHZhcmlhbnRcblx0XHRmb3IgKGNvbnN0IHNQcm9wZXJ0eU5hbWUgaW4gbVNlbWFudGljQXR0cmlidXRlcykge1xuXHRcdFx0aWYgKG1TZW1hbnRpY0F0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHkoc1Byb3BlcnR5TmFtZSkpIHtcblx0XHRcdFx0Ly8gQSB2YWx1ZSBvZiBhIHNlbWFudGljIGF0dHJpYnV0ZSBtYXkgbm90IGJlIGEgc3RyaW5nLCBidXQgY2FuIGJlIGUuZy4gYSBkYXRlLlxuXHRcdFx0XHQvLyBTaW5jZSB0aGUgc2VsZWN0aW9uIHZhcmlhbnQgYWNjZXB0cyBvbmx5IGEgc3RyaW5nLCB3ZSBoYXZlIHRvIGNvbnZlcnQgaXQgaW4gZGVwZW5kZW5jZSBvZiB0aGUgdHlwZS5cblx0XHRcdFx0bGV0IHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlID0gbVNlbWFudGljQXR0cmlidXRlc1tzUHJvcGVydHlOYW1lXTtcblx0XHRcdFx0aWYgKHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuXHRcdFx0XHRcdC8vIHVzZSB0aGUgc2FtZSBjb252ZXJzaW9uIG1ldGhvZCBmb3IgZGF0ZXMgYXMgdGhlIFNtYXJ0RmlsdGVyQmFyOiB0b0pTT04oKVxuXHRcdFx0XHRcdHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlID0gdlNlbWFudGljQXR0cmlidXRlVmFsdWUudG9KU09OKCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0QXJyYXkuaXNBcnJheSh2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZSkgfHxcblx0XHRcdFx0XHQodlNlbWFudGljQXR0cmlidXRlVmFsdWUgJiYgdHlwZW9mIHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlID09PSBcIm9iamVjdFwiKVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHR2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZSA9IEpTT04uc3RyaW5naWZ5KHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlKTtcblx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgdlNlbWFudGljQXR0cmlidXRlVmFsdWUgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlID09PSBcImJvb2xlYW5cIikge1xuXHRcdFx0XHRcdHZTZW1hbnRpY0F0dHJpYnV0ZVZhbHVlID0gdlNlbWFudGljQXR0cmlidXRlVmFsdWUudG9TdHJpbmcoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZSA9PT0gXCJcIikge1xuXHRcdFx0XHRcdGlmIChpU3VwcHJlc3Npb25CZWhhdmlvciAmIFN1cHByZXNzaW9uQmVoYXZpb3IuaWdub3JlRW1wdHlTdHJpbmcpIHtcblx0XHRcdFx0XHRcdExvZy5pbmZvKFxuXHRcdFx0XHRcdFx0XHRcIlNlbWFudGljIGF0dHJpYnV0ZSBcIiArXG5cdFx0XHRcdFx0XHRcdFx0c1Byb3BlcnR5TmFtZSArXG5cdFx0XHRcdFx0XHRcdFx0XCIgaXMgYW4gZW1wdHkgc3RyaW5nIGFuZCBkdWUgdG8gdGhlIGNob3NlbiBTdXBwcmVzc2lvbiBCZWhpYXZvdXIgaXMgYmVpbmcgaWdub3JlZC5cIlxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh2U2VtYW50aWNBdHRyaWJ1dGVWYWx1ZSA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdGlmIChpU3VwcHJlc3Npb25CZWhhdmlvciAmIFN1cHByZXNzaW9uQmVoYXZpb3IucmFpc2VFcnJvck9uTnVsbCkge1xuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IE5hdkVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuSU5WQUxJRF9JTlBVVFwiKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0TG9nLndhcm5pbmcoXCJTZW1hbnRpYyBhdHRyaWJ1dGUgXCIgKyBzUHJvcGVydHlOYW1lICsgXCIgaXMgbnVsbCBhbmQgaWdub3JlZCBmb3IgbWl4IGluIHRvIHNlbGVjdGlvbiB2YXJpYW50XCIpO1xuXHRcdFx0XHRcdFx0Y29udGludWU7IC8vIGlnbm9yZSFcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodlNlbWFudGljQXR0cmlidXRlVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGlmIChpU3VwcHJlc3Npb25CZWhhdmlvciAmIFN1cHByZXNzaW9uQmVoYXZpb3IucmFpc2VFcnJvck9uVW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgTmF2RXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5JTlZBTElEX0lOUFVUXCIpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRMb2cud2FybmluZyhcIlNlbWFudGljIGF0dHJpYnV0ZSBcIiArIHNQcm9wZXJ0eU5hbWUgKyBcIiBpcyB1bmRlZmluZWQgYW5kIGlnbm9yZWQgZm9yIG1peCBpbiB0byBzZWxlY3Rpb24gdmFyaWFudFwiKTtcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh0eXBlb2YgdlNlbWFudGljQXR0cmlidXRlVmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdlNlbWFudGljQXR0cmlidXRlVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHtcblx0XHRcdFx0XHRvU2VsVmFyaWFudC5hZGRTZWxlY3RPcHRpb24oc1Byb3BlcnR5TmFtZSwgXCJJXCIsIFwiRVFcIiwgdlNlbWFudGljQXR0cmlidXRlVmFsdWUpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRocm93IG5ldyBOYXZFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLklOVkFMSURfSU5QVVRcIik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG9TZWxWYXJpYW50O1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbWJpbmVzIHRoZSBnaXZlbiBwYXJhbWV0ZXJzIGFuZCBzZWxlY3Rpb24gdmFyaWFudCBpbnRvIGEgbmV3IHNlbGVjdGlvbiB2YXJpYW50IGNvbnRhaW5pbmcgcHJvcGVydGllcyBmcm9tIGJvdGgsIHdpdGggdGhlIHBhcmFtZXRlcnNcblx0ICogb3ZlcnJpZGluZyBleGlzdGluZyBwcm9wZXJ0aWVzIGluIHRoZSBzZWxlY3Rpb24gdmFyaWFudC4gVGhlIG5ldyBzZWxlY3Rpb24gdmFyaWFudCBkb2VzIG5vdCBjb250YWluIGFueSBwYXJhbWV0ZXJzLiBBbGwgcGFyYW1ldGVycyBhcmVcblx0ICogbWVyZ2VkIGludG8gc2VsZWN0IG9wdGlvbnMuIFRoZSBvdXRwdXQgb2YgdGhpcyBmdW5jdGlvbiwgY29udmVydGVkIHRvIGEgSlNPTiBzdHJpbmcsIGNhbiBiZSB1c2VkIGZvciB0aGVcblx0ICoge0BsaW5rICMubmF2aWdhdGUgTmF2aWdhdGlvbkhhbmRsZXIubmF2aWdhdGV9IG1ldGhvZC5cblx0ICpcblx0ICogQHBhcmFtIHZTZW1hbnRpY0F0dHJpYnV0ZXMgT2JqZWN0LyhBcnJheSBvZiBPYmplY3RzKSBjb250YWluaW5nIGtleS92YWx1ZSBwYWlyc1xuXHQgKiBAcGFyYW0gc1NlbGVjdGlvblZhcmlhbnQgVGhlIHNlbGVjdGlvbiB2YXJpYW50IGluIHN0cmluZyBmb3JtYXQgYXMgcHJvdmlkZWQgYnkgdGhlIFNtYXJ0RmlsdGVyQmFyIGNvbnRyb2xcblx0ICogQHBhcmFtIFtpU3VwcHJlc3Npb25CZWhhdmlvcj1zYXAuZmUubmF2aWdhdGlvbi5TdXBwcmVzc2lvbkJlaGF2aW9yLnN0YW5kYXJkXSBJbmRpY2F0ZXMgd2hldGhlciBzZW1hbnRpY1xuXHQgKiAgICAgICAgYXR0cmlidXRlcyB3aXRoIHNwZWNpYWwgdmFsdWVzIChzZWUge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLlN1cHByZXNzaW9uQmVoYXZpb3Igc3VwcHJlc3Npb24gYmVoYXZpb3J9KSBtdXN0IGJlXG5cdCAqICAgICAgICBzdXBwcmVzc2VkIGJlZm9yZSB0aGV5IGFyZSBjb21iaW5lZCB3aXRoIHRoZSBzZWxlY3Rpb24gdmFyaWFudDsgc2V2ZXJhbFxuXHQgKiAgICAgICAge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLlN1cHByZXNzaW9uQmVoYXZpb3Igc3VwcHJlc3Npb24gYmVoYXZpb3JzfSBjYW4gYmUgY29tYmluZWQgd2l0aCB0aGUgYml0d2lzZSBPUiBvcGVyYXRvclxuXHQgKiAgICAgICAgKHwpXG5cdCAqIEByZXR1cm5zIEluc3RhbmNlIG9mIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5TZWxlY3Rpb25WYXJpYW50fVxuXHQgKiBAcHVibGljXG5cdCAqIEBleGFtcGxlIDxjb2RlPlxuXHQgKiBzYXAudWkuZGVmaW5lKFtcInNhcC9mZS9uYXZpZ2F0aW9uL05hdmlnYXRpb25IYW5kbGVyXCIsIFwic2FwL2ZlL25hdmlnYXRpb24vU2VsZWN0aW9uVmFyaWFudFwiXSwgZnVuY3Rpb24gKE5hdmlnYXRpb25IYW5kbGVyLCBTZWxlY3Rpb25WYXJpYW50KSB7XG5cdCAqIFx0dmFyIHZTZW1hbnRpY0F0dHJpYnV0ZXMgPSB7IFwiQ3VzdG9tZXJcIiA6IFwiQzAwMDFcIiB9O1xuXHQgKiBcdG9yXG5cdCAqIFx0dmFyIHZTZW1hbnRpY0F0dHJpYnV0ZXMgPSBbeyBcIkN1c3RvbWVyXCIgOiBcIkMwMDAxXCIgfSx7IFwiQ3VzdG9tZXJcIiA6IFwiQzAwMDJcIiB9XTtcblx0ICogXHR2YXIgc1NlbGVjdGlvblZhcmlhbnQgPSBvU21hcnRGaWx0ZXJCYXIuZ2V0RGF0YVN1aXRlRm9ybWF0KCk7XG5cdCAqIFx0dmFyIG9OYXZpZ2F0aW9uSGFuZGxlciA9IG5ldyBOYXZpZ2F0aW9uSGFuZGxlcihvQ29udHJvbGxlcik7XG5cdCAqIFx0dmFyIHNOYXZpZ2F0aW9uU2VsZWN0aW9uVmFyaWFudCA9IG9OYXZpZ2F0aW9uSGFuZGxlci5taXhBdHRyaWJ1dGVzQW5kU2VsZWN0aW9uVmFyaWFudCh2U2VtYW50aWNBdHRyaWJ1dGVzLCBzU2VsZWN0aW9uVmFyaWFudCkudG9KU09OU3RyaW5nKCk7XG5cdCAqIFx0Ly8gSW4gY2FzZSBvZiBhbiB2U2VtYW50aWNBdHRyaWJ1dGVzIGJlaW5nIGFuIGFycmF5LCB0aGUgc2VtYW50aWNBdHRyaWJ1dGVzIGFyZSBtZXJnZWQgdG8gYSBzaW5nbGUgU1YgYW5kIGNvbXBhcmVkIGFnYWluc3QgdGhlIHNTZWxlY3Rpb25WYXJpYW50KHNlY29uZCBhZ3J1bWVudCkuXG5cdCAqIFx0Ly8gT3B0aW9uYWxseSwgeW91IGNhbiBzcGVjaWZ5IG9uZSBvciBzZXZlcmFsIHN1cHByZXNzaW9uIGJlaGF2aW9ycy4gU2V2ZXJhbCBzdXBwcmVzc2lvbiBiZWhhdmlvcnMgYXJlIGNvbWJpbmVkIHdpdGggdGhlIGJpdHdpc2UgT1Igb3BlcmF0b3IsIGUuZy5cblx0ICogXHQvLyB2YXIgaVN1cHByZXNzaW9uQmVoYXZpb3IgPSBzYXAuZmUubmF2aWdhdGlvbi5TdXBwcmVzc2lvbkJlaGF2aW9yLnJhaXNlRXJyb3JPbk51bGwgfCBzYXAuZmUubmF2aWdhdGlvbi5TdXBwcmVzc2lvbkJlaGF2aW9yLnJhaXNlRXJyb3JPblVuZGVmaW5lZDtcblx0ICogXHQvLyB2YXIgc05hdmlnYXRpb25TZWxlY3Rpb25WYXJpYW50ID0gb05hdmlnYXRpb25IYW5kbGVyLm1peEF0dHJpYnV0ZXNBbmRTZWxlY3Rpb25WYXJpYW50KG1TZW1hbnRpY0F0dHJpYnV0ZXMsIHNTZWxlY3Rpb25WYXJpYW50LCBpU3VwcHJlc3Npb25CZWhhdmlvcikudG9KU09OU3RyaW5nKCk7XG5cdCAqXG5cdCAqIFx0b05hdmlnYXRpb25IYW5kbGVyLm5hdmlnYXRlKFwiU2FsZXNPcmRlclwiLCBcImNyZWF0ZVwiLCBzTmF2aWdhdGlvblNlbGVjdGlvblZhcmlhbnQpO1xuXHQgKiB9KTtcblx0ICogPC9jb2RlPlxuXHQgKi9cblx0bWl4QXR0cmlidXRlc0FuZFNlbGVjdGlvblZhcmlhbnQoXG5cdFx0dlNlbWFudGljQXR0cmlidXRlczogb2JqZWN0IHwgYW55W10sXG5cdFx0c1NlbGVjdGlvblZhcmlhbnQ6IHN0cmluZyB8IFNlcmlhbGl6ZWRTZWxlY3Rpb25WYXJpYW50LFxuXHRcdGlTdXBwcmVzc2lvbkJlaGF2aW9yPzogbnVtYmVyXG5cdCk6IFNlbGVjdGlvblZhcmlhbnQge1xuXHRcdGNvbnN0IG9TZWxlY3Rpb25WYXJpYW50ID0gbmV3IFNlbGVjdGlvblZhcmlhbnQoc1NlbGVjdGlvblZhcmlhbnQpO1xuXHRcdGNvbnN0IG9OZXdTZWxWYXJpYW50ID0gbmV3IFNlbGVjdGlvblZhcmlhbnQoKTtcblx0XHRjb25zdCBvTmF2SGFuZGxlciA9IHRoaXM7XG5cblx0XHRjb25zdCBmaWx0ZXJVcmwgPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRGaWx0ZXJDb250ZXh0VXJsKCk7XG5cdFx0aWYgKGZpbHRlclVybCkge1xuXHRcdFx0b05ld1NlbFZhcmlhbnQuc2V0RmlsdGVyQ29udGV4dFVybChmaWx0ZXJVcmwpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNvbnRleHRVcmwgPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRQYXJhbWV0ZXJDb250ZXh0VXJsKCk7XG5cdFx0aWYgKGNvbnRleHRVcmwpIHtcblx0XHRcdG9OZXdTZWxWYXJpYW50LnNldFBhcmFtZXRlckNvbnRleHRVcmwoY29udGV4dFVybCk7XG5cdFx0fVxuXHRcdGlmIChBcnJheS5pc0FycmF5KHZTZW1hbnRpY0F0dHJpYnV0ZXMpKSB7XG5cdFx0XHR2U2VtYW50aWNBdHRyaWJ1dGVzLmZvckVhY2goZnVuY3Rpb24gKG1TZW1hbnRpY0F0dHJpYnV0ZXM6IGFueSkge1xuXHRcdFx0XHRvTmF2SGFuZGxlci5fbWl4QXR0cmlidXRlc1RvU2VsVmFyaWFudChtU2VtYW50aWNBdHRyaWJ1dGVzLCBvTmV3U2VsVmFyaWFudCwgaVN1cHByZXNzaW9uQmVoYXZpb3IpO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuX21peEF0dHJpYnV0ZXNUb1NlbFZhcmlhbnQodlNlbWFudGljQXR0cmlidXRlcywgb05ld1NlbFZhcmlhbnQsIGlTdXBwcmVzc2lvbkJlaGF2aW9yKTtcblx0XHR9XG5cblx0XHQvLyBhZGQgcGFyYW1ldGVycyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgb05ld1NlbFZhcmlhbnQgeWV0XG5cdFx0Y29uc3QgYVBhcmFtZXRlcnMgPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRQYXJhbWV0ZXJOYW1lcygpO1xuXHRcdGxldCBpO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBhUGFyYW1ldGVycy5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKCFvTmV3U2VsVmFyaWFudC5nZXRTZWxlY3RPcHRpb24oYVBhcmFtZXRlcnNbaV0pKSB7XG5cdFx0XHRcdG9OZXdTZWxWYXJpYW50LmFkZFNlbGVjdE9wdGlvbihhUGFyYW1ldGVyc1tpXSwgXCJJXCIsIFwiRVFcIiwgb1NlbGVjdGlvblZhcmlhbnQuZ2V0UGFyYW1ldGVyKGFQYXJhbWV0ZXJzW2ldKSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gYWRkIHNlbE9wdGlvbnMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIG9OZXdTZWxWYXJpYW50IHlldFxuXHRcdGNvbnN0IGFTZWxPcHRpb25OYW1lcyA9IG9TZWxlY3Rpb25WYXJpYW50LmdldFNlbGVjdE9wdGlvbnNQcm9wZXJ0eU5hbWVzKCk7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGFTZWxPcHRpb25OYW1lcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Ly8gYWRkIHNlbE9wdGlvbnMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIG9OZXdTZWxWYXJpYW50IHlldFxuXHRcdFx0Y29uc3QgYVNlbGVjdE9wdGlvbjogYW55W10gPSBvU2VsZWN0aW9uVmFyaWFudC5nZXRTZWxlY3RPcHRpb24oYVNlbE9wdGlvbk5hbWVzW2ldKSE7XG5cdFx0XHRpZiAoIW9OZXdTZWxWYXJpYW50LmdldFNlbGVjdE9wdGlvbihhU2VsT3B0aW9uTmFtZXNbaV0pKSB7XG5cdFx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgYVNlbGVjdE9wdGlvbi5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRcdG9OZXdTZWxWYXJpYW50LmFkZFNlbGVjdE9wdGlvbihcblx0XHRcdFx0XHRcdGFTZWxPcHRpb25OYW1lc1tpXSxcblx0XHRcdFx0XHRcdGFTZWxlY3RPcHRpb25bal0uU2lnbixcblx0XHRcdFx0XHRcdGFTZWxlY3RPcHRpb25bal0uT3B0aW9uLFxuXHRcdFx0XHRcdFx0YVNlbGVjdE9wdGlvbltqXS5Mb3csXG5cdFx0XHRcdFx0XHRhU2VsZWN0T3B0aW9uW2pdLkhpZ2hcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9OZXdTZWxWYXJpYW50O1xuXHR9XG5cblx0X2Vuc3VyZVNlbGVjdGlvblZhcmlhbnRGb3JtYXRTdHJpbmcodlNlbGVjdGlvblZhcmlhbnQ6IGFueSkge1xuXHRcdC8qXG5cdFx0ICogVGhlcmUgYXJlIGxlZ2FjeSBBcHBTdGF0ZXMgd2hlcmUgdGhlIFNlbGVjdGlvblZhcmlhbnQgaXMgYmVpbmcgc3RvcmVkIGFzIGEgc3RyaW5nLiBIb3dldmVyLCB0aGF0IGlzIG5vdCBjb21wbGlhbnQgdG8gdGhlIHNwZWNpZmljYXRpb24sXG5cdFx0ICogd2hpY2ggc3RhdGVzIHRoYXQgYSBzdGFuZGFyZCBKUyBvYmplY3Qgc2hhbGwgYmUgcHJvdmlkZWQuIEludGVybmFsbHksIGhvd2V2ZXIsIHRoZSBzZWxlY3Rpb25WYXJpYW50IGlzIGFsd2F5cyBvZiB0eXBlIHN0cmluZy4gU2l0dWF0aW9uXG5cdFx0ICogUGVyc2lzdGVuY3kgaW50ZXJuYWwgQVBJIC0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBsZWdhY3kgc3RyaW5nIHN0cmluZyBuZXcgYXBwcm9hY2ggKEpTT04pIG9iamVjdFxuXHRcdCAqIHN0cmluZ1xuXHRcdCAqL1xuXG5cdFx0aWYgKHZTZWxlY3Rpb25WYXJpYW50ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0bGV0IHZDb252ZXJ0ZWRTZWxlY3Rpb25WYXJpYW50ID0gdlNlbGVjdGlvblZhcmlhbnQ7XG5cblx0XHRpZiAodHlwZW9mIHZTZWxlY3Rpb25WYXJpYW50ID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHR2Q29udmVydGVkU2VsZWN0aW9uVmFyaWFudCA9IEpTT04uc3RyaW5naWZ5KHZTZWxlY3Rpb25WYXJpYW50KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdkNvbnZlcnRlZFNlbGVjdGlvblZhcmlhbnQ7XG5cdH1cblxuXHRfZm5IYW5kbGVBcHBTdGF0ZVByb21pc2Uob1JldHVybjogYW55LCBmbk9uQWZ0ZXJTYXZlOiBhbnksIGZuT25FcnJvcjogYW55KSB7XG5cdFx0b1JldHVybi5wcm9taXNlLmRvbmUoZnVuY3Rpb24gKCkge1xuXHRcdFx0aWYgKGZuT25BZnRlclNhdmUpIHtcblx0XHRcdFx0Zm5PbkFmdGVyU2F2ZShvUmV0dXJuLmFwcFN0YXRlS2V5KTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGlmIChmbk9uRXJyb3IpIHtcblx0XHRcdGNvbnN0IG9OYXZIYW5kbGVyID0gdGhpcztcblx0XHRcdG9SZXR1cm4ucHJvbWlzZS5mYWlsKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0Y29uc3Qgb0Vycm9yID0gb05hdkhhbmRsZXIuX2NyZWF0ZVRlY2huaWNhbEVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuQXBwU3RhdGVTYXZlLmZhaWxlZFwiKTtcblx0XHRcdFx0Zm5PbkVycm9yKG9FcnJvcik7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHRfc2F2ZUFwcFN0YXRlQXN5bmMob0FwcERhdGE6IGFueSwgZm5PbkFmdGVyU2F2ZTogYW55LCBmbk9uRXJyb3I6IGFueSkge1xuXHRcdGNvbnN0IG9OYXZIYW5kbGVyID0gdGhpcztcblx0XHRyZXR1cm4gdGhpcy5fZm5TYXZlQXBwU3RhdGVBc3luYyhvQXBwRGF0YSwgZm5PbkVycm9yKS50aGVuKGZ1bmN0aW9uIChvUmV0dXJuOiBhbnkpIHtcblx0XHRcdGlmIChvUmV0dXJuKSB7XG5cdFx0XHRcdG9OYXZIYW5kbGVyLl9mbkhhbmRsZUFwcFN0YXRlUHJvbWlzZShvUmV0dXJuLCBmbk9uQWZ0ZXJTYXZlLCBmbk9uRXJyb3IpO1xuXHRcdFx0XHRyZXR1cm4gb1JldHVybi5hcHBTdGF0ZUtleTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9KTtcblx0fVxuXG5cdF9zYXZlQXBwU3RhdGUob0FwcERhdGE6IGFueSwgZm5PbkFmdGVyU2F2ZTogYW55LCBmbk9uRXJyb3I6IGFueSkge1xuXHRcdGNvbnN0IG9SZXR1cm4gPSB0aGlzLl9zYXZlQXBwU3RhdGVXaXRoSW1tZWRpYXRlUmV0dXJuKG9BcHBEYXRhLCBmbk9uRXJyb3IpO1xuXHRcdGlmIChvUmV0dXJuKSB7XG5cdFx0XHR0aGlzLl9mbkhhbmRsZUFwcFN0YXRlUHJvbWlzZShvUmV0dXJuLCBmbk9uQWZ0ZXJTYXZlLCBmbk9uRXJyb3IpO1xuXHRcdFx0cmV0dXJuIG9SZXR1cm4uYXBwU3RhdGVLZXk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdF9mblNhdmVBcHBTdGF0ZVdpdGhJbW1lZGlhdGVSZXR1cm4ob0FwcERhdGE6IGFueSwgb0FwcFN0YXRlOiBhbnksIGZuT25FcnJvcjogYW55KSB7XG5cdFx0Y29uc3Qgc0FwcFN0YXRlS2V5ID0gb0FwcFN0YXRlLmdldEtleSgpO1xuXHRcdGNvbnN0IG9BcHBEYXRhRm9yU2F2ZSA9IHRoaXMuX2ZldGNoQXBwRGF0YUZvclNhdmUob0FwcERhdGEsIGZuT25FcnJvcik7XG5cdFx0aWYgKCFvQXBwRGF0YUZvclNhdmUpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdG9BcHBTdGF0ZS5zZXREYXRhKG9BcHBEYXRhRm9yU2F2ZSk7XG5cdFx0Y29uc3Qgb1NhdmVQcm9taXNlID0gb0FwcFN0YXRlLnNhdmUoKTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRhcHBTdGF0ZUtleTogc0FwcFN0YXRlS2V5LFxuXHRcdFx0cHJvbWlzZTogb1NhdmVQcm9taXNlLnByb21pc2UoKVxuXHRcdH07XG5cdH1cblxuXHRfZmV0Y2hBcHBEYXRhRm9yU2F2ZShvQXBwRGF0YTogSW5uZXJBcHBEYXRhLCBmbk9uRXJyb3I6IGFueSkge1xuXHRcdGxldCBvQXBwRGF0YUZvclNhdmU6IFBhcnRpYWw8SW5uZXJBcHBEYXRhPiA9IHt9O1xuXG5cdFx0aWYgKG9BcHBEYXRhLmhhc093blByb3BlcnR5KFwic2VsZWN0aW9uVmFyaWFudFwiKSkge1xuXHRcdFx0b0FwcERhdGFGb3JTYXZlLnNlbGVjdGlvblZhcmlhbnQgPSBvQXBwRGF0YS5zZWxlY3Rpb25WYXJpYW50O1xuXG5cdFx0XHRpZiAob0FwcERhdGEuc2VsZWN0aW9uVmFyaWFudCkge1xuXHRcdFx0XHQvKlxuXHRcdFx0XHQgKiBUaGUgc3BlY2lmaWNhdGlvbiBzdGF0ZXMgdGhhdCBTZWxlY3Rpb24gVmFyaWFudHMgbmVlZCB0byBiZSBKU09OIG9iamVjdHMuIEhvd2V2ZXIsIGludGVybmFsbHksIHdlIHdvcmsgd2l0aCBzdHJpbmdzIGZvclxuXHRcdFx0XHQgKiBcInNlbGVjdGlvblZhcmlhbnRcIi4gVGhlcmVmb3JlLCBpbiBjYXNlIHRoYXQgdGhpcyBpcyBhIHN0cmluZywgd2UgbmVlZCB0byBKU09OLXBhcnNlIHRoZSBkYXRhLlxuXHRcdFx0XHQgKi9cblx0XHRcdFx0aWYgKHR5cGVvZiBvQXBwRGF0YS5zZWxlY3Rpb25WYXJpYW50ID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdG9BcHBEYXRhRm9yU2F2ZS5zZWxlY3Rpb25WYXJpYW50ID0gSlNPTi5wYXJzZShvQXBwRGF0YS5zZWxlY3Rpb25WYXJpYW50KTtcblx0XHRcdFx0XHR9IGNhdGNoICh4KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvRXJyb3IgPSB0aGlzLl9jcmVhdGVUZWNobmljYWxFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLkFwcFN0YXRlU2F2ZS5wYXJzZUVycm9yXCIpO1xuXHRcdFx0XHRcdFx0aWYgKGZuT25FcnJvcikge1xuXHRcdFx0XHRcdFx0XHRmbk9uRXJyb3Iob0Vycm9yKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuX3NNb2RlID09PSBNb2RlLk9EYXRhVjIpIHtcblx0XHRcdG9BcHBEYXRhRm9yU2F2ZSA9IGV4dGVuZChcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHNlbGVjdGlvblZhcmlhbnQ6IHt9LFxuXHRcdFx0XHRcdHRhYmxlVmFyaWFudElkOiBcIlwiLFxuXHRcdFx0XHRcdGN1c3RvbURhdGE6IHt9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdG9BcHBEYXRhRm9yU2F2ZVxuXHRcdFx0KSBhcyBJbm5lckFwcERhdGE7XG5cblx0XHRcdGlmIChvQXBwRGF0YS50YWJsZVZhcmlhbnRJZCkge1xuXHRcdFx0XHRvQXBwRGF0YUZvclNhdmUudGFibGVWYXJpYW50SWQgPSBvQXBwRGF0YS50YWJsZVZhcmlhbnRJZDtcblx0XHRcdH1cblx0XHRcdGlmIChvQXBwRGF0YS5jdXN0b21EYXRhKSB7XG5cdFx0XHRcdG9BcHBEYXRhRm9yU2F2ZS5jdXN0b21EYXRhID0gb0FwcERhdGEuY3VzdG9tRGF0YTtcblx0XHRcdH1cblx0XHRcdGlmIChvQXBwRGF0YS5wcmVzZW50YXRpb25WYXJpYW50KSB7XG5cdFx0XHRcdG9BcHBEYXRhRm9yU2F2ZS5wcmVzZW50YXRpb25WYXJpYW50ID0gb0FwcERhdGEucHJlc2VudGF0aW9uVmFyaWFudDtcblx0XHRcdH1cblx0XHRcdGlmIChvQXBwRGF0YS52YWx1ZVRleHRzKSB7XG5cdFx0XHRcdG9BcHBEYXRhRm9yU2F2ZS52YWx1ZVRleHRzID0gb0FwcERhdGEudmFsdWVUZXh0cztcblx0XHRcdH1cblx0XHRcdGlmIChvQXBwRGF0YS5zZW1hbnRpY0RhdGVzKSB7XG5cdFx0XHRcdG9BcHBEYXRhRm9yU2F2ZS5zZW1hbnRpY0RhdGVzID0gb0FwcERhdGEuc2VtYW50aWNEYXRlcztcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3Qgb0FwcERhdGFDbG9uZSA9IE9iamVjdC5hc3NpZ24oe30sIG9BcHBEYXRhKTtcblx0XHRcdG9BcHBEYXRhRm9yU2F2ZSA9IG1lcmdlKG9BcHBEYXRhQ2xvbmUsIG9BcHBEYXRhRm9yU2F2ZSk7XG5cdFx0fVxuXHRcdG9BcHBEYXRhRm9yU2F2ZSA9IHRoaXMuX2NoZWNrSXNQb3RlbnRpYWxseVNlbnNpdGl2ZShvQXBwRGF0YUZvclNhdmUpO1xuXHRcdHJldHVybiBvQXBwRGF0YUZvclNhdmU7XG5cdH1cblxuXHRfZm5TYXZlQXBwU3RhdGVBc3luYyhvQXBwRGF0YTogYW55LCBmbk9uRXJyb3I/OiBhbnkpIHtcblx0XHRjb25zdCBvTmF2SGFuZGxlciA9IHRoaXM7XG5cdFx0cmV0dXJuIHRoaXMuX2dldEFwcE5hdmlnYXRpb25TZXJ2aWNlQXN5bmMoKVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9Dcm9zc0FwcE5hdlNlcnZpY2U6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb0Nyb3NzQXBwTmF2U2VydmljZS5jcmVhdGVFbXB0eUFwcFN0YXRlKG9OYXZIYW5kbGVyLm9Db21wb25lbnQpO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChvQXBwU3RhdGU6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb05hdkhhbmRsZXIuX2ZuU2F2ZUFwcFN0YXRlV2l0aEltbWVkaWF0ZVJldHVybihvQXBwRGF0YSwgb0FwcFN0YXRlLCBmbk9uRXJyb3IpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0aWYgKGZuT25FcnJvcikge1xuXHRcdFx0XHRcdGZuT25FcnJvcihvRXJyb3IpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0fVxuXG5cdF9zYXZlQXBwU3RhdGVXaXRoSW1tZWRpYXRlUmV0dXJuKG9BcHBEYXRhOiBhbnksIGZuT25FcnJvcj86IGFueSkge1xuXHRcdGNvbnN0IG9BcHBTdGF0ZSA9IHRoaXMuX2dldEFwcE5hdmlnYXRpb25TZXJ2aWNlKCkuY3JlYXRlRW1wdHlBcHBTdGF0ZSh0aGlzLm9Db21wb25lbnQpO1xuXHRcdHJldHVybiB0aGlzLl9mblNhdmVBcHBTdGF0ZVdpdGhJbW1lZGlhdGVSZXR1cm4ob0FwcERhdGEsIG9BcHBTdGF0ZSwgZm5PbkVycm9yKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIGxvYWRlZCBJQXBwIFN0YXRlIGFuZCBuYXZpZ2F0aW9uIHR5cGUgb25jZSByZXNvbHZlZC5cblx0ICpcblx0ICogQHBhcmFtIHNBcHBTdGF0ZUtleSBUaGUgSUFwcFN0YXRlS2V5IHRvIHJldHJpZXZlIHRoZSBBcHBTdGF0ZSBkYXRhLlxuXHQgKiBAcGFyYW0gb0RlZmVycmVkIEpxdWVyeSBkZWZlcnJlZCBvYmplY3QgdG8gcmVzb2x2ZSB0aGUgQXBwU3RhdGUgZGF0YS5cblx0ICogQHBhcmFtIG5hdlR5cGUgTmF2aWdhdGlvbiB0eXBlIGZvciB3aGljaCBBcHBTdGF0ZSBpcyByZXRyaWV2ZWQuXG5cdCAqIEByZXR1cm5zIFRoZSBkZWZlcnJlZCBvYmplY3Qgd2hpY2ggaXMgcmVzb2x2ZWQgd2l0aCBsb2FkZWQgYXBwIHN0YXRlIGRhdGFcblx0IGFuZCBuYXZpZ2F0aW9uIHR5cGUuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfbG9hZEFwcFN0YXRlKHNBcHBTdGF0ZUtleTogc3RyaW5nLCBvRGVmZXJyZWQ6IGpRdWVyeS5EZWZlcnJlZCwgbmF2VHlwZTogc3RyaW5nKTogalF1ZXJ5LkRlZmVycmVkIHtcblx0XHRjb25zdCBvTmF2SGFuZGxlciA9IHRoaXM7XG5cdFx0dGhpcy5fZ2V0QXBwTmF2aWdhdGlvblNlcnZpY2VBc3luYygpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob0Nyb3NzQXBwTmF2U2VydmljZTogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvQ3Jvc3NBcHBOYXZTZXJ2aWNlLmdldEFwcFN0YXRlKG9OYXZIYW5kbGVyLm9Db21wb25lbnQsIHNBcHBTdGF0ZUtleSk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0Y29uc3Qgb0Vycm9yID0gb05hdkhhbmRsZXIuX2NyZWF0ZVRlY2huaWNhbEVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXIuX2dldEFwcE5hdmlnYXRpb25TZXJ2aWNlQXN5bmMuZmFpbGVkXCIpO1xuXHRcdFx0XHRvRGVmZXJyZWQucmVqZWN0KG9FcnJvciwge30sIG5hdlR5cGUpO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChvQXBwU3RhdGU6IGFueSkge1xuXHRcdFx0XHRsZXQgb0FwcERhdGE6IGFueSA9IHt9O1xuXHRcdFx0XHRjb25zdCBvQXBwRGF0YUxvYWRlZCA9IG9BcHBTdGF0ZS5nZXREYXRhKCk7XG5cblx0XHRcdFx0aWYgKHR5cGVvZiBvQXBwRGF0YUxvYWRlZCA9PT0gXCJ1bmRlZmluZWRcIikge1xuXHRcdFx0XHRcdGNvbnN0IG9FcnJvciA9IG9OYXZIYW5kbGVyLl9jcmVhdGVUZWNobmljYWxFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLmdldERhdGFGcm9tQXBwU3RhdGUuZmFpbGVkXCIpO1xuXHRcdFx0XHRcdG9EZWZlcnJlZC5yZWplY3Qob0Vycm9yLCB7fSwgbmF2VHlwZSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAob05hdkhhbmRsZXIuX3NNb2RlID09PSBNb2RlLk9EYXRhVjIpIHtcblx0XHRcdFx0XHRvQXBwRGF0YSA9IHtcblx0XHRcdFx0XHRcdHNlbGVjdGlvblZhcmlhbnQ6IFwie31cIixcblx0XHRcdFx0XHRcdG9TZWxlY3Rpb25WYXJpYW50OiBuZXcgU2VsZWN0aW9uVmFyaWFudCgpLFxuXHRcdFx0XHRcdFx0b0RlZmF1bHRlZFNlbGVjdGlvblZhcmlhbnQ6IG5ldyBTZWxlY3Rpb25WYXJpYW50KCksXG5cdFx0XHRcdFx0XHRiTmF2U2VsVmFySGFzRGVmYXVsdHNPbmx5OiBmYWxzZSxcblx0XHRcdFx0XHRcdHRhYmxlVmFyaWFudElkOiBcIlwiLFxuXHRcdFx0XHRcdFx0Y3VzdG9tRGF0YToge30sXG5cdFx0XHRcdFx0XHRhcHBTdGF0ZUtleTogc0FwcFN0YXRlS2V5LFxuXHRcdFx0XHRcdFx0cHJlc2VudGF0aW9uVmFyaWFudDoge30sXG5cdFx0XHRcdFx0XHR2YWx1ZVRleHRzOiB7fSxcblx0XHRcdFx0XHRcdHNlbWFudGljRGF0ZXM6IHt9LFxuXHRcdFx0XHRcdFx0ZGF0YToge31cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGlmIChvQXBwRGF0YUxvYWRlZC5zZWxlY3Rpb25WYXJpYW50KSB7XG5cdFx0XHRcdFx0XHQvKlxuXHRcdFx0XHRcdFx0ICogSW4gY2FzZSB0aGF0IHdlIGdldCBhbiBvYmplY3QgZnJvbSB0aGUgc3RvcmVkIEFwcERhdGEgKD1wZXJzaXN0ZW5jeSksIHdlIG5lZWQgdG8gc3RyaW5naWZ5IHRoZSBKU09OIG9iamVjdC5cblx0XHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdFx0b0FwcERhdGEuc2VsZWN0aW9uVmFyaWFudCA9IG9OYXZIYW5kbGVyLl9lbnN1cmVTZWxlY3Rpb25WYXJpYW50Rm9ybWF0U3RyaW5nKG9BcHBEYXRhTG9hZGVkLnNlbGVjdGlvblZhcmlhbnQpO1xuXHRcdFx0XHRcdFx0b0FwcERhdGEub1NlbGVjdGlvblZhcmlhbnQgPSBuZXcgU2VsZWN0aW9uVmFyaWFudChvQXBwRGF0YS5zZWxlY3Rpb25WYXJpYW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKG9BcHBEYXRhTG9hZGVkLnRhYmxlVmFyaWFudElkKSB7XG5cdFx0XHRcdFx0XHRvQXBwRGF0YS50YWJsZVZhcmlhbnRJZCA9IG9BcHBEYXRhTG9hZGVkLnRhYmxlVmFyaWFudElkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAob0FwcERhdGFMb2FkZWQuY3VzdG9tRGF0YSkge1xuXHRcdFx0XHRcdFx0b0FwcERhdGEuY3VzdG9tRGF0YSA9IG9BcHBEYXRhTG9hZGVkLmN1c3RvbURhdGE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChvQXBwRGF0YUxvYWRlZC5wcmVzZW50YXRpb25WYXJpYW50KSB7XG5cdFx0XHRcdFx0XHRvQXBwRGF0YS5wcmVzZW50YXRpb25WYXJpYW50ID0gb0FwcERhdGFMb2FkZWQucHJlc2VudGF0aW9uVmFyaWFudDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKG9BcHBEYXRhTG9hZGVkLnZhbHVlVGV4dHMpIHtcblx0XHRcdFx0XHRcdG9BcHBEYXRhLnZhbHVlVGV4dHMgPSBvQXBwRGF0YUxvYWRlZC52YWx1ZVRleHRzO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAob0FwcERhdGFMb2FkZWQuc2VtYW50aWNEYXRlcykge1xuXHRcdFx0XHRcdFx0b0FwcERhdGEuc2VtYW50aWNEYXRlcyA9IG9BcHBEYXRhTG9hZGVkLnNlbWFudGljRGF0ZXM7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8qIEluIFYyIGNhc2UsIHdlIG5lZWQgdGhlIGRhdGEgaW4gdGhlIGJlbG93IGZvcm1hdCBmb3IgaHlicmlkIGNhc2UgKi9cblx0XHRcdFx0XHRpZiAobmF2VHlwZSA9PT0gTmF2VHlwZS5oeWJyaWQpIHtcblx0XHRcdFx0XHRcdG9BcHBEYXRhLmRhdGEgPSBvQXBwRGF0YUxvYWRlZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b0FwcERhdGEgPSBtZXJnZShvQXBwRGF0YSwgb0FwcERhdGFMb2FkZWQpO1xuXHRcdFx0XHRcdGlmIChvQXBwRGF0YUxvYWRlZC5zZWxlY3Rpb25WYXJpYW50KSB7XG5cdFx0XHRcdFx0XHQvKlxuXHRcdFx0XHRcdFx0ICogSW4gY2FzZSB0aGF0IHdlIGdldCBhbiBvYmplY3QgZnJvbSB0aGUgc3RvcmVkIEFwcERhdGEgKD1wZXJzaXN0ZW5jeSksIHdlIG5lZWQgdG8gc3RyaW5naWZ5IHRoZSBKU09OIG9iamVjdC5cblx0XHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdFx0b0FwcERhdGEuc2VsZWN0aW9uVmFyaWFudCA9IG9OYXZIYW5kbGVyLl9lbnN1cmVTZWxlY3Rpb25WYXJpYW50Rm9ybWF0U3RyaW5nKG9BcHBEYXRhTG9hZGVkLnNlbGVjdGlvblZhcmlhbnQpO1xuXHRcdFx0XHRcdFx0b0FwcERhdGEub1NlbGVjdGlvblZhcmlhbnQgPSBuZXcgU2VsZWN0aW9uVmFyaWFudChvQXBwRGF0YS5zZWxlY3Rpb25WYXJpYW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyByZXNvbHZlIGlzIGNhbGxlZCBvbiBwYXNzZWQgRGVmZXJyZWQgb2JqZWN0IHRvIHRyaWdnZXIgYSBjYWxsIG9mIHRoZSBkb25lIG1ldGhvZCwgaWYgaW1wbGVtZW50ZWRcblx0XHRcdFx0Ly8gdGhlIGRvbmUgbWV0aG9kIHdpbGwgcmVjZWl2ZSB0aGUgbG9hZGVkIGFwcFN0YXRlIGFuZCB0aGUgbmF2aWdhdGlvbiB0eXBlIGFzIHBhcmFtZXRlcnNcblx0XHRcdFx0b0RlZmVycmVkLnJlc29sdmUob0FwcERhdGEsIHt9LCBuYXZUeXBlKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGNvbnN0IG9FcnJvciA9IG9OYXZIYW5kbGVyLl9jcmVhdGVUZWNobmljYWxFcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyLmdldEFwcFN0YXRlLmZhaWxlZFwiKTtcblx0XHRcdFx0b0RlZmVycmVkLnJlamVjdChvRXJyb3IsIHt9LCBuYXZUeXBlKTtcblx0XHRcdH0pO1xuXG5cdFx0cmV0dXJuIG9EZWZlcnJlZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIHBhcmFtZXRlciB2YWx1ZSBvZiB0aGUgc2FwLWlhcHAtc3RhdGUgKHRoZSBpbnRlcm5hbCBhcHBzKSBmcm9tIHRoZSBBcHBIYXNoIHN0cmluZy4gSXQgYXV0b21hdGljYWxseSB0YWtlcyBjYXJlIGFib3V0XG5cdCAqIGNvbXBhdGliaWxpdHkgYmV0d2VlbiB0aGUgb2xkIGFuZCB0aGUgbmV3IGFwcHJvYWNoIG9mIHRoZSBzYXAtaWFwcC1zdGF0ZS4gUHJlY2VkZW5jZSBpcyB0aGF0IHRoZSBuZXcgYXBwcm9hY2ggaXMgZmF2b3VyZWQgYWdhaW5zdCB0aGUgb2xkXG5cdCAqIGFwcHJvYWNoLlxuXHQgKlxuXHQgKiBAcGFyYW0gc0FwcEhhc2ggVGhlIEFwcEhhc2gsIHdoaWNoIG1heSBjb250YWluIGEgc2FwLWlhcHAtc3RhdGUgcGFyYW1ldGVyIChib3RoIG9sZCBhbmQvb3IgbmV3IGFwcHJvYWNoKVxuXHQgKiBAcmV0dXJucyBUaGUgdmFsdWUgb2Ygc2FwLWlhcHAtc3RhdGUgKGkuZS4gdGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5lciB0byByZXRyaWV2ZSB0aGUgcGFyYW1ldGVycyksIG9yIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4gaW5cblx0ICogICAgICAgICBjYXNlIHRoYXQgbm8gc2FwLWlhcHAtc3RhdGUgd2FzIGZvdW5kIGluIDxjb2RlPnNBcHBIYXNoPC9jb2RlPi5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9nZXRJbm5lckFwcFN0YXRlS2V5KHNBcHBIYXNoOiBzdHJpbmcpIHtcblx0XHQvLyB0cml2aWFsIGNhc2U6IG5vIGFwcCBoYXNoIGF2YWlsYWJsZSBhdCBhbGwuXG5cdFx0aWYgKCFzQXBwSGFzaCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvKiBuZXcgYXBwcm9hY2g6IHNlcGFyYXRlZCB2aWEgcXVlc3Rpb24gbWFyayAvIHBhcnQgb2YgdGhlIHF1ZXJ5IHBhcmFtZXRlciBvZiB0aGUgQXBwSGFzaCAqL1xuXHRcdGxldCBhTWF0Y2hlcyA9IHRoaXMuX3JJQXBwU3RhdGVOZXcuZXhlYyhzQXBwSGFzaCk7XG5cblx0XHQvKiBvbGQgYXBwcm9hY2g6IHNwZWFyYXRlZCB2aWEgc2xhc2hlcyAvIGkuZS4gcGFydCBvZiB0aGUgcm91dGUgaXRzZWxmICovXG5cdFx0aWYgKGFNYXRjaGVzID09PSBudWxsKSB7XG5cdFx0XHRhTWF0Y2hlcyA9IHRoaXMuX3JJQXBwU3RhdGVPbGQuZXhlYyhzQXBwSGFzaCk7XG5cdFx0fVxuXG5cdFx0Lypcblx0XHQgKiBvbGQgYXBwcm9hY2g6IHNwZWNpYWwgY2FzZTogaWYgdGhlcmUgaXMgbm8gZGVlcCByb3V0ZS9rZXkgZGVmaW5lZCwgdGhlIHNhcC1pYXBwLXN0YXRlIG1heSBiZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcsIHdpdGhvdXRcblx0XHQgKiBhbnkgc2VwYXJhdGlvbiB3aXRoIHRoZSBzbGFzaGVzXG5cdFx0ICovXG5cdFx0aWYgKGFNYXRjaGVzID09PSBudWxsKSB7XG5cdFx0XHRhTWF0Y2hlcyA9IHRoaXMuX3JJQXBwU3RhdGVPbGRBdFN0YXJ0LmV4ZWMoc0FwcEhhc2gpO1xuXHRcdH1cblxuXHRcdGlmIChhTWF0Y2hlcyA9PT0gbnVsbCkge1xuXHRcdFx0Ly8gdGhlcmUgaXMgbm8gKHZhbGlkKSBzYXAtaWFwcC1zdGF0ZSBpbiB0aGUgQXBwIEhhc2hcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFNYXRjaGVzWzFdO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcGxhY2VzIChvciBpbnNlcnRzKSBhIHBhcmFtZXRlciB2YWx1ZSAoYW4gQXBwU3RhdGVLZXkpIGZvciB0aGUgc2FwLWlhcHAtc3RhdGUgaW50byBhbiBleGlzdGluZyBBcHBIYXNoIHN0cmluZy4gT3RoZXIgcm91dGVzL3BhcmFtZXRlcnNcblx0ICogYXJlIGlnbm9yZWQgYW5kIHJldHVybmVkIHdpdGhvdXQgbW9kaWZpY2F0aW9uIChcImVudmlyb25tZW50YWwgYWdub3N0aWNcIiBwcm9wZXJ0eSkuIE9ubHkgdGhlIG5ldyBhcHByb2FjaCAoc2FwLWlhcHAtc3RhdGUgYXMgcXVlcnkgcGFyYW1ldGVyXG5cdCAqIGluIHRoZSBBcHBIYXNoKSBpcyBiZWluZyBpc3N1ZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBzQXBwSGFzaCBUaGUgQXBwSGFzaCBpbnRvIHdoaWNoIHRoZSBzYXAtaWFwcC1zdGF0ZSBwYXJhbWV0ZXIgc2hhbGwgYmUgbWFkZSBhdmFpbGFibGVcblx0ICogQHBhcmFtIHNBcHBTdGF0ZUtleSBUaGUga2V5IHZhbHVlIG9mIHRoZSBBcHBTdGF0ZSB3aGljaCBzaGFsbCBiZSBzdG9yZWQgYXMgcGFyYW1ldGVyIHZhbHVlIG9mIHRoZSBzYXAtaWFwcC1zdGF0ZSBwcm9wZXJ0eS5cblx0ICogQHJldHVybnMgVGhlIG1vZGlmaWVkIHNBcHBIYXNoIHN0cmluZywgc3VjaCB0aGF0IHRoZSBzYXAtaWFwcC1zdGF0ZSBoYXMgYmVlbiBzZXQgYmFzZWQgb24gdGhlIG5ldyAocXVlcnkgb3B0aW9uLWJhc2VkKVxuXHQgKiAgICAgICAgIHNhcC1pYXBwLXN0YXRlLiBJZiBhIHNhcC1pYXBwLXN0YXRlIGhhcyBiZWVuIHNwZWNpZmllZCBiZWZvcmUsIHRoZSBrZXkgaXMgcmVwbGFjZWQuIElmIDxjb2RlPnNBcHBIYXNoPC9jb2RlPiB3YXMgb2YgdGhlIG9sZFxuXHQgKiAgICAgICAgIGZvcm1hdCAoc2FwLWlhcHAtc3RhdGUgYXMgcGFydCBvZiB0aGUga2V5cy9yb3V0ZSksIHRoZSBmb3JtYXQgaXMgY29udmVydGVkIHRvIHRoZSBuZXcgZm9ybWF0IGJlZm9yZSB0aGUgcmVzdWx0IGlzIHJldHVybmVkLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X3JlcGxhY2VJbm5lckFwcFN0YXRlS2V5KHNBcHBIYXNoOiBzdHJpbmcsIHNBcHBTdGF0ZUtleTogc3RyaW5nKSB7XG5cdFx0Y29uc3Qgc05ld0lBcHBTdGF0ZSA9IElBUFBfU1RBVEUgKyBcIj1cIiArIHNBcHBTdGF0ZUtleTtcblxuXHRcdC8qXG5cdFx0ICogZ2VuZXJhdGUgc2FwLWlhcHAtc3RhdGVzIHdpdGggdGhlIG5ldyB3YXlcblx0XHQgKi9cblx0XHRpZiAoIXNBcHBIYXNoKSB7XG5cdFx0XHQvLyB0aGVyZSdzIG5vIHNBcHBIYXNoIGtleSB5ZXRcblx0XHRcdHJldHVybiBcIj9cIiArIHNOZXdJQXBwU3RhdGU7XG5cdFx0fVxuXG5cdFx0Y29uc3QgZm5BcHBlbmRUb1F1ZXJ5UGFyYW1ldGVyID0gZnVuY3Rpb24gKHNTdWJBcHBIYXNoOiBhbnkpIHtcblx0XHRcdC8vIHRoZXJlIGlzIGFuIEFwcEhhc2ggYXZhaWxhYmxlLCBidXQgaXQgZG9lcyBub3QgY29udGFpbiBhIHNhcC1pYXBwLXN0YXRlIHBhcmFtZXRlciB5ZXQgLSB3ZSBuZWVkIHRvIGFwcGVuZCBvbmVcblxuXHRcdFx0Ly8gbmV3IGFwcHJvYWNoOiB3ZSBuZWVkIHRvIGNoZWNrLCBpZiBhIHNldCBvZiBxdWVyeSBwYXJhbWV0ZXJzIGlzIGFscmVhZHkgYXZhaWxhYmxlXG5cdFx0XHRpZiAoc1N1YkFwcEhhc2guaW5kZXhPZihcIj9cIikgIT09IC0xKSB7XG5cdFx0XHRcdC8vIHRoZXJlIGFyZSBhbHJlYWR5IHF1ZXJ5IHBhcmFtZXRlcnMgYXZhaWxhYmxlIC0gYXBwZW5kIGl0IGFzIGFub3RoZXIgcGFyYW1ldGVyXG5cdFx0XHRcdHJldHVybiBzU3ViQXBwSGFzaCArIFwiJlwiICsgc05ld0lBcHBTdGF0ZTtcblx0XHRcdH1cblx0XHRcdC8vIHRoZXJlIGFyZSBubyBhIHF1ZXJ5IHBhcmFtZXRlcnMgYXZhaWxhYmxlIHlldDsgY3JlYXRlIGEgc2V0IHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyXG5cdFx0XHRyZXR1cm4gc1N1YkFwcEhhc2ggKyBcIj9cIiArIHNOZXdJQXBwU3RhdGU7XG5cdFx0fTtcblxuXHRcdGlmICghdGhpcy5fZ2V0SW5uZXJBcHBTdGF0ZUtleShzQXBwSGFzaCkpIHtcblx0XHRcdHJldHVybiBmbkFwcGVuZFRvUXVlcnlQYXJhbWV0ZXIoc0FwcEhhc2gpO1xuXHRcdH1cblx0XHQvLyBUaGVyZSBpcyBhbiBBcHBIYXNoIGF2YWlsYWJsZSBhbmQgdGhlcmUgaXMgYWxyZWFkeSBhbiBzYXAtaWFwcC1zdGF0ZSBpbiB0aGUgQXBwSGFzaFxuXG5cdFx0aWYgKHRoaXMuX3JJQXBwU3RhdGVOZXcudGVzdChzQXBwSGFzaCkpIHtcblx0XHRcdC8vIHRoZSBuZXcgYXBwcm9hY2ggaXMgYmVpbmcgdXNlZFxuXHRcdFx0cmV0dXJuIHNBcHBIYXNoLnJlcGxhY2UodGhpcy5fcklBcHBTdGF0ZU5ldywgZnVuY3Rpb24gKHNOZWVkbGU6IHN0cmluZykge1xuXHRcdFx0XHRyZXR1cm4gc05lZWRsZS5yZXBsYWNlKC9bPV0uKi9naSwgXCI9XCIgKyBzQXBwU3RhdGVLZXkpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0Ly8gd2UgbmVlZCB0byByZW1vdmUgdGhlIG9sZCBBcHBIYXNoIGVudGlyZWx5IGFuZCByZXBsYWNlIGl0IHdpdGggYSBuZXcgb25lLlxuXG5cdFx0Y29uc3QgZm5SZXBsYWNlT2xkQXBwcm9hY2ggPSBmdW5jdGlvbiAock9sZEFwcHJvYWNoOiBhbnksIHNTdWJBcHBIYXNoOiBhbnkpIHtcblx0XHRcdHNTdWJBcHBIYXNoID0gc1N1YkFwcEhhc2gucmVwbGFjZShyT2xkQXBwcm9hY2gsIFwiXCIpO1xuXHRcdFx0cmV0dXJuIGZuQXBwZW5kVG9RdWVyeVBhcmFtZXRlcihzU3ViQXBwSGFzaCk7XG5cdFx0fTtcblxuXHRcdGlmICh0aGlzLl9ySUFwcFN0YXRlT2xkLnRlc3Qoc0FwcEhhc2gpKSB7XG5cdFx0XHRyZXR1cm4gZm5SZXBsYWNlT2xkQXBwcm9hY2godGhpcy5fcklBcHBTdGF0ZU9sZCwgc0FwcEhhc2gpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLl9ySUFwcFN0YXRlT2xkQXRTdGFydC50ZXN0KHNBcHBIYXNoKSkge1xuXHRcdFx0cmV0dXJuIGZuUmVwbGFjZU9sZEFwcHJvYWNoKHRoaXMuX3JJQXBwU3RhdGVPbGRBdFN0YXJ0LCBzQXBwSGFzaCk7XG5cdFx0fVxuXG5cdFx0YXNzZXJ0KGZhbHNlLCBcImludGVybmFsIGluY29uc2lzdGVuY3k6IEFwcHJvYWNoIG9mIHNhcC1pYXBwLXN0YXRlIG5vdCBrbm93biwgYnV0IF9nZXRJbm5lckFwcFN0YXRlS2V5IHJldHVybmVkIGl0XCIpO1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRfZ2V0VVJMUGFyYW1ldGVyc0Zyb21TZWxlY3Rpb25WYXJpYW50KHZTZWxlY3Rpb25WYXJpYW50OiBhbnkpIHtcblx0XHRjb25zdCBtVVJMUGFyYW1ldGVyczogYW55ID0ge307XG5cdFx0bGV0IGkgPSAwO1xuXHRcdGxldCBvU2VsZWN0aW9uVmFyaWFudDtcblxuXHRcdGlmICh0eXBlb2YgdlNlbGVjdGlvblZhcmlhbnQgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdG9TZWxlY3Rpb25WYXJpYW50ID0gbmV3IFNlbGVjdGlvblZhcmlhbnQodlNlbGVjdGlvblZhcmlhbnQpO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZTZWxlY3Rpb25WYXJpYW50ID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRvU2VsZWN0aW9uVmFyaWFudCA9IHZTZWxlY3Rpb25WYXJpYW50O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgTmF2RXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5JTlZBTElEX0lOUFVUXCIpO1xuXHRcdH1cblxuXHRcdC8vIGFkZCBVUkxzIHBhcmFtZXRlcnMgZnJvbSBTZWxlY3Rpb25WYXJpYW50LlNlbGVjdE9wdGlvbnMgKGlmIHNpbmdsZSB2YWx1ZSlcblx0XHRjb25zdCBhU2VsZWN0UHJvcGVydGllcyA9IG9TZWxlY3Rpb25WYXJpYW50LmdldFNlbGVjdE9wdGlvbnNQcm9wZXJ0eU5hbWVzKCk7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGFTZWxlY3RQcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBhU2VsZWN0T3B0aW9ucyA9IG9TZWxlY3Rpb25WYXJpYW50LmdldFNlbGVjdE9wdGlvbihhU2VsZWN0UHJvcGVydGllc1tpXSk7XG5cdFx0XHRpZiAoYVNlbGVjdE9wdGlvbnMubGVuZ3RoID09PSAxICYmIGFTZWxlY3RPcHRpb25zWzBdLlNpZ24gPT09IFwiSVwiICYmIGFTZWxlY3RPcHRpb25zWzBdLk9wdGlvbiA9PT0gXCJFUVwiKSB7XG5cdFx0XHRcdG1VUkxQYXJhbWV0ZXJzW2FTZWxlY3RQcm9wZXJ0aWVzW2ldXSA9IGFTZWxlY3RPcHRpb25zWzBdLkxvdztcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBhZGQgcGFyYW1ldGVycyBmcm9tIFNlbGVjdGlvblZhcmlhbnQuUGFyYW1ldGVyc1xuXHRcdGNvbnN0IGFQYXJhbWV0ZXJOYW1lcyA9IG9TZWxlY3Rpb25WYXJpYW50LmdldFBhcmFtZXRlck5hbWVzKCk7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGFQYXJhbWV0ZXJOYW1lcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3Qgc1BhcmFtZXRlclZhbHVlID0gb1NlbGVjdGlvblZhcmlhbnQuZ2V0UGFyYW1ldGVyKGFQYXJhbWV0ZXJOYW1lc1tpXSk7XG5cblx0XHRcdG1VUkxQYXJhbWV0ZXJzW2FQYXJhbWV0ZXJOYW1lc1tpXV0gPSBzUGFyYW1ldGVyVmFsdWU7XG5cdFx0fVxuXHRcdHJldHVybiBtVVJMUGFyYW1ldGVycztcblx0fVxuXG5cdF9jcmVhdGVUZWNobmljYWxFcnJvcihzRXJyb3JDb2RlOiBhbnkpIHtcblx0XHRyZXR1cm4gbmV3IE5hdkVycm9yKHNFcnJvckNvZGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIG1vZGVsIHRoYXQgaXMgdXNlZCBmb3IgdmVyaWZpY2F0aW9uIG9mIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbi4gSWYgdGhlIG1vZGVsIGlzIG5vdCBzZXQsIHRoZSB1bm5hbWVkIGNvbXBvbmVudCBtb2RlbCBpcyB1c2VkIGZvciB0aGVcblx0ICogdmVyaWZpY2F0aW9uIG9mIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbi5cblx0ICpcblx0ICogQHB1YmxpY1xuXHQgKiBAcGFyYW0gb01vZGVsIEZvciBjaGVja2luZyBzZW5zaXRpdmUgaW5mb3JtYXRpb25cblx0ICovXG5cdHNldE1vZGVsKG9Nb2RlbDogVjJPRGF0YU1vZGVsIHwgVjRPRGF0YU1vZGVsKSB7XG5cdFx0dGhpcy5fb01vZGVsID0gb01vZGVsO1xuXHR9XG5cblx0X2dldE1vZGVsKCk6IFYyT0RhdGFNb2RlbCB8IFY0T0RhdGFNb2RlbCB7XG5cdFx0cmV0dXJuIHRoaXMuX29Nb2RlbCB8fCB0aGlzLm9Db21wb25lbnQuZ2V0TW9kZWwoKTtcblx0fVxuXG5cdF9yZW1vdmVBbGxQcm9wZXJ0aWVzKG9EYXRhOiBhbnkpIHtcblx0XHRpZiAob0RhdGEpIHtcblx0XHRcdGlmIChvRGF0YS5zZWxlY3Rpb25WYXJpYW50KSB7XG5cdFx0XHRcdG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgPSBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAob0RhdGEudmFsdWVUZXh0cykge1xuXHRcdFx0XHRvRGF0YS52YWx1ZVRleHRzID0gbnVsbDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG9EYXRhLnNlbWFudGljRGF0ZXMpIHtcblx0XHRcdFx0b0RhdGEuc2VtYW50aWNEYXRlcyA9IG51bGw7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X3JlbW92ZVByb3BlcnRpZXMoYUZpbHRlck5hbWU6IGFueSwgYVBhcmFtZXRlck5hbWU6IGFueSwgb0RhdGE6IGFueSkge1xuXHRcdGlmIChhRmlsdGVyTmFtZS5sZW5ndGggJiYgb0RhdGEgJiYgKG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgfHwgb0RhdGEudmFsdWVUZXh0cyB8fCBvRGF0YS5zZW1hbnRpY0RhdGVzKSkge1xuXHRcdFx0YUZpbHRlck5hbWUuZm9yRWFjaChmdW5jdGlvbiAoc05hbWU6IGFueSkge1xuXHRcdFx0XHRpZiAob0RhdGEuc2VsZWN0aW9uVmFyaWFudC5TZWxlY3RPcHRpb25zKSB7XG5cdFx0XHRcdFx0b0RhdGEuc2VsZWN0aW9uVmFyaWFudC5TZWxlY3RPcHRpb25zLnNvbWUoZnVuY3Rpb24gKG9WYWx1ZTogYW55LCBuSWR4OiBhbnkpIHtcblx0XHRcdFx0XHRcdGlmIChzTmFtZSA9PT0gb1ZhbHVlLlByb3BlcnR5TmFtZSkge1xuXHRcdFx0XHRcdFx0XHRvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlNlbGVjdE9wdGlvbnMuc3BsaWNlKG5JZHgsIDEpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKG9EYXRhLnZhbHVlVGV4dHMgJiYgb0RhdGEudmFsdWVUZXh0cy5UZXh0cykge1xuXHRcdFx0XHRcdG9EYXRhLnZhbHVlVGV4dHMuVGV4dHMuZm9yRWFjaChmdW5jdGlvbiAob1RleHRzOiBhbnkpIHtcblx0XHRcdFx0XHRcdGlmIChvVGV4dHMuUHJvcGVydHlUZXh0cykge1xuXHRcdFx0XHRcdFx0XHRvVGV4dHMuUHJvcGVydHlUZXh0cy5zb21lKGZ1bmN0aW9uIChvVmFsdWU6IGFueSwgbklkeDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNOYW1lID09PSBvVmFsdWUuUHJvcGVydHlOYW1lKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvVGV4dHMuUHJvcGVydHlUZXh0cy5zcGxpY2UobklkeCwgMSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKG9EYXRhLnNlbWFudGljRGF0ZXMgJiYgb0RhdGEuc2VtYW50aWNEYXRlcy5EYXRlcykge1xuXHRcdFx0XHRcdG9EYXRhLnNlbWFudGljRGF0ZXMuRGF0ZXMuZm9yRWFjaChmdW5jdGlvbiAob0RhdGVzOiBhbnksIG5JZHg6IGFueSkge1xuXHRcdFx0XHRcdFx0aWYgKHNOYW1lID09PSBvRGF0ZXMuUHJvcGVydHlOYW1lKSB7XG5cdFx0XHRcdFx0XHRcdG9EYXRhLnNlbWFudGljRGF0ZXMuRGF0ZXMuc3BsaWNlKG5JZHgsIDEpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRpZiAoYVBhcmFtZXRlck5hbWUubGVuZ3RoICYmIG9EYXRhICYmIG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgJiYgb0RhdGEuc2VsZWN0aW9uVmFyaWFudC5QYXJhbWV0ZXJzKSB7XG5cdFx0XHRhUGFyYW1ldGVyTmFtZS5mb3JFYWNoKGZ1bmN0aW9uIChzTmFtZTogYW55KSB7XG5cdFx0XHRcdG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuUGFyYW1ldGVycy5zb21lKGZ1bmN0aW9uIChvVmFsdWU6IGFueSwgbklkeDogYW55KSB7XG5cdFx0XHRcdFx0aWYgKHNOYW1lID09PSBvVmFsdWUuUHJvcGVydHlOYW1lIHx8IFwiJFBhcmFtZXRlci5cIiArIHNOYW1lID09PSBvVmFsdWUuUHJvcGVydHlOYW1lKSB7XG5cdFx0XHRcdFx0XHRvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlBhcmFtZXRlcnMuc3BsaWNlKG5JZHgsIDEpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdF9pc1Rlcm1UcnVlKG9Qcm9wZXJ0eTogYW55LCBzVGVybTogYW55KSB7XG5cdFx0Y29uc3QgZklzVGVybURlZmF1bHRUcnVlID0gZnVuY3Rpb24gKG9UZXJtOiBhbnkpIHtcblx0XHRcdGlmIChvVGVybSkge1xuXHRcdFx0XHRyZXR1cm4gb1Rlcm0uQm9vbCA/IG9UZXJtLkJvb2wgIT09IFwiZmFsc2VcIiA6IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fTtcblxuXHRcdHJldHVybiAhIW9Qcm9wZXJ0eVtzVGVybV0gJiYgZklzVGVybURlZmF1bHRUcnVlKG9Qcm9wZXJ0eVtzVGVybV0pO1xuXHR9XG5cblx0X2lzRXhjbHVkZWRGcm9tTmF2aWdhdGlvbkNvbnRleHQob1Byb3BlcnR5OiBhbnkpIHtcblx0XHRyZXR1cm4gdGhpcy5faXNUZXJtVHJ1ZShvUHJvcGVydHksIFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRXhjbHVkZUZyb21OYXZpZ2F0aW9uQ29udGV4dFwiKTtcblx0fVxuXG5cdF9pc1BvdGVudGlhbGx5U2Vuc2l0aXZlKG9Qcm9wZXJ0eTogYW55KSB7XG5cdFx0cmV0dXJuIHRoaXMuX2lzVGVybVRydWUob1Byb3BlcnR5LCBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlBlcnNvbmFsRGF0YS52MS5Jc1BvdGVudGlhbGx5U2Vuc2l0aXZlXCIpO1xuXHR9XG5cblx0X2lzTWVhc3VyZVByb3BlcnR5KG9Qcm9wZXJ0eTogYW55KSB7XG5cdFx0cmV0dXJuIHRoaXMuX2lzVGVybVRydWUob1Byb3BlcnR5LCBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkFuYWx5dGljcy52MS5NZWFzdXJlXCIpO1xuXHR9XG5cblx0X2lzVG9CZUV4Y2x1ZGVkKG9Qcm9wZXJ0eTogYW55KSB7XG5cdFx0cmV0dXJuIHRoaXMuX2lzUG90ZW50aWFsbHlTZW5zaXRpdmUob1Byb3BlcnR5KSB8fCB0aGlzLl9pc0V4Y2x1ZGVkRnJvbU5hdmlnYXRpb25Db250ZXh0KG9Qcm9wZXJ0eSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIG1ldGhvZCBjcmVhdGVzIGEgY29udGV4dCB1cmwgYmFzZWQgb24gcHJvdmlkZWQgZGF0YS4gVGhpcyBjb250ZXh0IHVybCBjYW4gZWl0aGVyIGJlIHVzZWQgYXNcblx0ICoge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdmlnYXRpb25IYW5kbGVyI3NldFBhcmFtZXRlckNvbnRleHRVcmwgUGFyYW1ldGVyQ29udGV4dFVybH0gb3Jcblx0ICoge0BsaW5rIHNhcC5mZS5uYXZpZ2F0aW9uLk5hdmlnYXRpb25IYW5kbGVyI3NldEZpbHRlckNvbnRleHRVcmwgRmlsdGVyQ29udGV4dFVybH0uXG5cdCAqXG5cdCAqIEBwYXJhbSBzRW50aXR5U2V0TmFtZSBVc2VkIGZvciB1cmwgZGV0ZXJtaW5hdGlvblxuXHQgKiBAcGFyYW0gW29Nb2RlbF0gVXNlZCBmb3IgdXJsIGRldGVybWluYXRpb24uIElmIG9taXR0ZWQsIHRoZSBOYXZpZ2F0aW9uSGFuZGxlciBtb2RlbCBpcyB1c2VkLlxuXHQgKiBAdGhyb3dzIEFuIGluc3RhbmNlIG9mIHtAbGluayBzYXAuZmUubmF2aWdhdGlvbi5OYXZFcnJvcn0gaW4gY2FzZSBvZiBtaXNzaW5nIG9yIHdyb25nIHBhc3NlZCBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFRoZSBjb250ZXh0IHVybCBmb3IgdGhlIGdpdmVuIGVudGl0aWVzXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdGNvbnN0cnVjdENvbnRleHRVcmwoc0VudGl0eVNldE5hbWU6IHN0cmluZywgb01vZGVsPzogVjJPRGF0YU1vZGVsIHwgVjRPRGF0YU1vZGVsKTogc3RyaW5nIHtcblx0XHRpZiAoIXNFbnRpdHlTZXROYW1lKSB7XG5cdFx0XHR0aHJvdyBuZXcgTmF2RXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlci5OT19FTlRJVFlfU0VUX1BST1ZJREVEXCIpO1xuXHRcdH1cblxuXHRcdGlmIChvTW9kZWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0b01vZGVsID0gdGhpcy5fZ2V0TW9kZWwoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5fY29uc3RydWN0Q29udGV4dFVybChvTW9kZWwpICsgXCIjXCIgKyBzRW50aXR5U2V0TmFtZTtcblx0fVxuXG5cdF9jb25zdHJ1Y3RDb250ZXh0VXJsKG9Nb2RlbDogVjJPRGF0YU1vZGVsIHwgVjRPRGF0YU1vZGVsKTogc3RyaW5nIHtcblx0XHRsZXQgc1NlcnZlclVybDtcblxuXHRcdGlmIChvTW9kZWwuaXNBPFYyT0RhdGFNb2RlbD4oXCJzYXAudWkubW9kZWwub2RhdGEudjIuT0RhdGFNb2RlbFwiKSkge1xuXHRcdFx0c1NlcnZlclVybCA9IG9Nb2RlbC5fZ2V0U2VydmVyVXJsKCk7XG5cdFx0fSBlbHNlIGlmIChvTW9kZWwuaXNBPFY0T0RhdGFNb2RlbD4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbFwiKSkge1xuXHRcdFx0Y29uc3Qgb1NlcnZpY2VVUkkgPSBuZXcgVVJJKG9Nb2RlbC5nZXRTZXJ2aWNlVXJsKCkpLmFic29sdXRlVG8oZG9jdW1lbnQuYmFzZVVSSSk7XG5cdFx0XHRzU2VydmVyVXJsID0gbmV3IFVSSShcIi9cIikuYWJzb2x1dGVUbyhvU2VydmljZVVSSSkudG9TdHJpbmcoKTtcblx0XHR9XG5cblx0XHRpZiAoc1NlcnZlclVybCAmJiBzU2VydmVyVXJsLmxhc3RJbmRleE9mKFwiL1wiKSA9PT0gc1NlcnZlclVybC5sZW5ndGggLSAxKSB7XG5cdFx0XHRzU2VydmVyVXJsID0gc1NlcnZlclVybC5zdWJzdHIoMCwgc1NlcnZlclVybC5sZW5ndGggLSAxKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gc1NlcnZlclVybCArIG9Nb2RlbC5zU2VydmljZVVybCArIFwiLyRtZXRhZGF0YVwiO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBtZXRob2QgdmVyaWZpZXMsIGlmIGFueSBvZiB0aGUgcGFzc2VkIHBhcmFtZXRlcnMvZmlsdGVycyBhcmUgbWFya2VkIGFzIHNlbnNpdGl2ZSwgYW5kIGlmIHRoaXMgaXMgdGhlIGNhc2UgcmVtb3ZlIHRob3NlIGZyb20gdGhlIGFwcFxuXHQgKiBkYXRhLiA8Yj5Ob3RlOjwvYj4gVG8gdXNlIHRoaXMgbWV0aG9kLCB0aGUgbWV0YWRhdGEgbXVzdCBiZSBsb2FkZWQgZmlyc3QuXG5cdCAqXG5cdCAqIEBwYXJhbSBvRGF0YSBXaXRoIHBvdGVudGlhbCBzZW5zaXRpdmUgaW5mb3JtYXRpb24gKGZvciBPRGF0YSwgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24gdXNpbmdcblx0ICogPGNvZGU+b1NlbGVjdGlvblZhcmlhbnQudG9KU09OT2JqZWN0KCk8L2NvZGU+IG11c3QgYmUgdXNlZCksIHdpdGggdGhlIDxjb2RlPkZpbHRlckNvbnRleHRVcmw8L2NvZGU+IG9yXG5cdCAqIDxjb2RlPlBhcmFtZXRlckNvbnRleHRVcmw8L2NvZGU+IHByb3BlcnR5LlxuXHQgKiBAcmV0dXJucyBEYXRhIHdpdGhvdXQgcHJvcGVydGllcyBtYXJrZWQgYXMgc2Vuc2l0aXZlIG9yIGFuIGVtcHR5IG9iamVjdCBpZiB0aGUgT0RhdGEgbWV0YWRhdGEgaXMgbm90IGZ1bGx5IGxvYWRlZCB5ZXRcblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9jaGVja0lzUG90ZW50aWFsbHlTZW5zaXRpdmUob0RhdGE6IGFueSkge1xuXHRcdGxldCBvQWRhcHRlZERhdGEgPSBvRGF0YTtcblx0XHRpZiAoXG5cdFx0XHRvRGF0YSAmJlxuXHRcdFx0b0RhdGEuc2VsZWN0aW9uVmFyaWFudCAmJlxuXHRcdFx0KChvRGF0YS5zZWxlY3Rpb25WYXJpYW50LkZpbHRlckNvbnRleHRVcmwgJiYgb0RhdGEuc2VsZWN0aW9uVmFyaWFudC5TZWxlY3RPcHRpb25zKSB8fFxuXHRcdFx0XHQob0RhdGEuc2VsZWN0aW9uVmFyaWFudC5QYXJhbWV0ZXJDb250ZXh0VXJsICYmIG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuUGFyYW1ldGVycykpXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBvTW9kZWwgPSB0aGlzLl9nZXRNb2RlbCgpO1xuXHRcdFx0aWYgKHRoaXMub0NvbXBvbmVudCAmJiBvTW9kZWwgJiYgb01vZGVsLmlzQTxWMk9EYXRhTW9kZWw+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnYyLk9EYXRhTW9kZWxcIikpIHtcblx0XHRcdFx0Y29uc3QgYVNlbnNpdGl2ZUZpbHRlck5hbWUgPSBbXTtcblx0XHRcdFx0Y29uc3QgYVNlbnNpdGl2ZVBhcmFtZXRlck5hbWUgPSBbXTtcblx0XHRcdFx0bGV0IGksXG5cdFx0XHRcdFx0b0VudGl0eVNldDogYW55LFxuXHRcdFx0XHRcdG9FbnRpdHlEZWY6IGFueSxcblx0XHRcdFx0XHRvU3ViRW50aXR5RGVmOiBhbnksXG5cdFx0XHRcdFx0b0VuZFJvbGU6IGFueSxcblx0XHRcdFx0XHRhRmlsdGVyQ29udGV4dFBhcnQgPSBbXSxcblx0XHRcdFx0XHRhUGFyYW1Db250ZXh0UGFydCA9IFtdO1xuXG5cdFx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdGlmIChvTW9kZWwuZ2V0U2VydmljZU1ldGFkYXRhKCkgJiYgb01ldGFNb2RlbD8ub01vZGVsKSB7XG5cdFx0XHRcdFx0aWYgKG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuRmlsdGVyQ29udGV4dFVybCkge1xuXHRcdFx0XHRcdFx0YUZpbHRlckNvbnRleHRQYXJ0ID0gb0RhdGEuc2VsZWN0aW9uVmFyaWFudC5GaWx0ZXJDb250ZXh0VXJsLnNwbGl0KFwiI1wiKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRhRmlsdGVyQ29udGV4dFBhcnQubGVuZ3RoID09PSAyICYmXG5cdFx0XHRcdFx0XHRvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlNlbGVjdE9wdGlvbnMgJiZcblx0XHRcdFx0XHRcdHRoaXMuX2NvbnN0cnVjdENvbnRleHRVcmwob01vZGVsKS5pbmRleE9mKGFGaWx0ZXJDb250ZXh0UGFydFswXSkgPT09IDBcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdG9FbnRpdHlTZXQgPSBvTWV0YU1vZGVsLmdldE9EYXRhRW50aXR5U2V0KGFGaWx0ZXJDb250ZXh0UGFydFsxXSk7XG5cdFx0XHRcdFx0XHRpZiAob0VudGl0eVNldCkge1xuXHRcdFx0XHRcdFx0XHRvRW50aXR5RGVmID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVR5cGUob0VudGl0eVNldC5lbnRpdHlUeXBlKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdG9FbnRpdHlEZWYgPSBvTWV0YU1vZGVsLmdldE9EYXRhRW50aXR5VHlwZShhRmlsdGVyQ29udGV4dFBhcnRbMV0pO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAob0VudGl0eURlZikge1xuXHRcdFx0XHRcdFx0XHRpZiAob0VudGl0eURlZiAmJiBvRW50aXR5RGVmLnByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IG9FbnRpdHlEZWYucHJvcGVydHkubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmICh0aGlzLl9pc1RvQmVFeGNsdWRlZChvRW50aXR5RGVmLnByb3BlcnR5W2ldKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRhU2Vuc2l0aXZlRmlsdGVyTmFtZS5wdXNoKG9FbnRpdHlEZWYucHJvcGVydHlbaV0ubmFtZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlEZWYubmF2aWdhdGlvblByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IG9FbnRpdHlEZWYubmF2aWdhdGlvblByb3BlcnR5Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvRW5kUm9sZSA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFBc3NvY2lhdGlvbkVuZChvRW50aXR5RGVmLCBvRW50aXR5RGVmLm5hdmlnYXRpb25Qcm9wZXJ0eVtpXS5uYW1lKTtcblx0XHRcdFx0XHRcdFx0XHRcdGlmICghb0VuZFJvbGUgfHwgb0VuZFJvbGUudHlwZSA9PT0gb0RhdGEuc2VsZWN0aW9uVmFyaWFudC5GaWx0ZXJDb250ZXh0VXJsKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gY2hlY2sgaWYgdGhlIGVuZCByb2xlIGhhcyBjYXJkaW5hbGl0eSAwLi4xIG9yIDFcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChvRW5kUm9sZS5tdWx0aXBsaWNpdHkgPT09IFwiMVwiIHx8IG9FbmRSb2xlLm11bHRpcGxpY2l0eSA9PT0gXCIwLi4xXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0b1N1YkVudGl0eURlZiA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlUeXBlKG9FbmRSb2xlLnR5cGUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAob1N1YkVudGl0eURlZiAmJiBvU3ViRW50aXR5RGVmLnByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgaiA9IDA7IGogPCBvU3ViRW50aXR5RGVmLnByb3BlcnR5Lmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5faXNUb0JlRXhjbHVkZWQob1N1YkVudGl0eURlZi5wcm9wZXJ0eVtqXSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YVNlbnNpdGl2ZUZpbHRlck5hbWUucHVzaChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRW50aXR5RGVmLm5hdmlnYXRpb25Qcm9wZXJ0eVtpXS5uYW1lICsgXCIuXCIgKyBvU3ViRW50aXR5RGVmLnByb3BlcnR5W2pdLm5hbWVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAob0RhdGEuc2VsZWN0aW9uVmFyaWFudC5QYXJhbWV0ZXJDb250ZXh0VXJsKSB7XG5cdFx0XHRcdFx0XHRhUGFyYW1Db250ZXh0UGFydCA9IG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuUGFyYW1ldGVyQ29udGV4dFVybC5zcGxpdChcIiNcIik7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0YVBhcmFtQ29udGV4dFBhcnQubGVuZ3RoID09PSAyICYmXG5cdFx0XHRcdFx0XHRvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlBhcmFtZXRlcnMgJiZcblx0XHRcdFx0XHRcdHRoaXMuX2NvbnN0cnVjdENvbnRleHRVcmwob01vZGVsKS5pbmRleE9mKGFQYXJhbUNvbnRleHRQYXJ0WzBdKSA9PT0gMFxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0b0VudGl0eVNldCA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlTZXQoYVBhcmFtQ29udGV4dFBhcnRbMV0pO1xuXHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlTZXQpIHtcblx0XHRcdFx0XHRcdFx0b0VudGl0eURlZiA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlUeXBlKG9FbnRpdHlTZXQuZW50aXR5VHlwZSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRvRW50aXR5RGVmID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVR5cGUoYUZpbHRlckNvbnRleHRQYXJ0WzFdKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlEZWYpIHtcblx0XHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlEZWYucHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgb0VudGl0eURlZi5wcm9wZXJ0eS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuX2lzVG9CZUV4Y2x1ZGVkKG9FbnRpdHlEZWYucHJvcGVydHlbaV0pKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFTZW5zaXRpdmVQYXJhbWV0ZXJOYW1lLnB1c2gob0VudGl0eURlZi5wcm9wZXJ0eVtpXS5uYW1lKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoYVNlbnNpdGl2ZUZpbHRlck5hbWUubGVuZ3RoIHx8IGFTZW5zaXRpdmVQYXJhbWV0ZXJOYW1lLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0b0FkYXB0ZWREYXRhID0gZXh0ZW5kKHRydWUgYXMgYW55LCB7fSwgb0FkYXB0ZWREYXRhKTtcblxuXHRcdFx0XHRcdFx0dGhpcy5fcmVtb3ZlUHJvcGVydGllcyhhU2Vuc2l0aXZlRmlsdGVyTmFtZSwgYVNlbnNpdGl2ZVBhcmFtZXRlck5hbWUsIG9BZGFwdGVkRGF0YSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIGFubm90YXRpb25zIGFyZSBub3QgbG9hZGVkXG5cblx0XHRcdFx0XHR0aGlzLl9yZW1vdmVBbGxQcm9wZXJ0aWVzKG9BZGFwdGVkRGF0YSk7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXI6IG9NZXRhZGF0YSBhcmUgbm90IGZ1bGx5IGxvYWRlZCFcIik7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAodGhpcy5vQ29tcG9uZW50ICYmIG9Nb2RlbCAmJiBvTW9kZWwuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWxcIikpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuX3JlbW92ZVNlbnNpdGl2ZURhdGFGb3JPRGF0YVY0KG9BZGFwdGVkRGF0YSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9BZGFwdGVkRGF0YTtcblx0fVxuXG5cdF9yZW1vdmVNZWFzdXJlQmFzZWRJbmZvcm1hdGlvbihvQXBwRGF0YTogYW55KSB7XG5cdFx0bGV0IG9BcHBEYXRhRm9yU2F2ZSA9IG9BcHBEYXRhO1xuXG5cdFx0aWYgKG9BcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQpIHtcblx0XHRcdC8qXG5cdFx0XHQgKiBUaGUgc3BlY2lmaWNhdGlvbiBzdGF0ZXMgdGhhdCBTZWxlY3Rpb24gVmFyaWFudHMgbmVlZCB0byBiZSBKU09OIG9iamVjdHMuIEhvd2V2ZXIsIGludGVybmFsbHksIHdlIHdvcmsgd2l0aCBzdHJpbmdzIGZvclxuXHRcdFx0ICogXCJzZWxlY3Rpb25WYXJpYW50XCIuIFRoZXJlZm9yZSwgaW4gY2FzZSB0aGF0IHRoaXMgaXMgYSBzdHJpbmcsIHdlIG5lZWQgdG8gSlNPTi1wYXJzZSB0aGUgZGF0YS5cblx0XHRcdCAqL1xuXHRcdFx0aWYgKHR5cGVvZiBvQXBwRGF0YS5zZWxlY3Rpb25WYXJpYW50ID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0b0FwcERhdGFGb3JTYXZlLnNlbGVjdGlvblZhcmlhbnQgPSBKU09OLnBhcnNlKG9BcHBEYXRhLnNlbGVjdGlvblZhcmlhbnQpO1xuXHRcdFx0XHR9IGNhdGNoICh4KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiTmF2aWdhdGlvbkhhbmRsZXI6IF9yZW1vdmVNZWFzdXJlQmFzZWRJbmZvcm1hdGlvbiBwYXJzZSBlcnJvclwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRvQXBwRGF0YUZvclNhdmUgPSB0aGlzLl9yZW1vdmVNZWFzdXJlQmFzZWRQcm9wZXJ0aWVzKG9BcHBEYXRhRm9yU2F2ZSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9BcHBEYXRhRm9yU2F2ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgbWV0aG9kIHZlcmlmaWVzIGlmIGFueSBvZiB0aGUgcGFzc2VkIHBhcmFtZXRlcnMvZmlsdGVycyBhcmUgbWFya2VkIGFzIGEgbWVhc3VyZS4gSWYgdGhpcyBpcyB0aGUgY2FzZSwgdGhleSBhcmUgcmVtb3ZlZCBmcm9tIHRoZSB4YXBwXG5cdCAqIGFwcCBkYXRhLiA8Yj5Ob3RlOjwvYj4gVG8gdXNlIHRoaXMgbWV0aG9kLCB0aGUgbWV0YWRhdGEgbXVzdCBiZSBsb2FkZWQgZmlyc3QuXG5cdCAqXG5cdCAqIEBwYXJhbSBvRGF0YSBXaXRoIHBvdGVudGlhbCBzZW5zaXRpdmUgaW5mb3JtYXRpb24gKGZvciBPRGF0YSwgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24gdXNpbmdcblx0ICogPGNvZGU+b1NlbGVjdGlvblZhcmlhbnQudG9KU09OT2JqZWN0KCk8L2NvZGU+IG11c3QgYmUgdXNlZCksIHdpdGggdGhlIDxjb2RlPkZpbHRlckNvbnRleHRVcmw8L2NvZGU+IG9yXG5cdCAqIDxjb2RlPlBhcmFtZXRlckNvbnRleHRVcmw8L2NvZGU+IHByb3BlcnR5LlxuXHQgKiBAcmV0dXJucyBEYXRhIHdpdGhvdXQgcHJvcGVydGllcyBtYXJrZWQgYXMgbWVhc3VyZXMgb3IgYW4gZW1wdHkgb2JqZWN0IGlmIHRoZSBPRGF0YSBtZXRhZGF0YSBpcyBub3QgZnVsbHkgbG9hZGVkIHlldFxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X3JlbW92ZU1lYXN1cmVCYXNlZFByb3BlcnRpZXMob0RhdGE6IGFueSkge1xuXHRcdGxldCBvQWRhcHRlZERhdGEgPSBvRGF0YTtcblx0XHRjb25zdCBhTWVhc3VyZUZpbHRlck5hbWUgPSBbXTtcblx0XHRjb25zdCBhTWVhc3VyZVBhcmFtZXRlck5hbWUgPSBbXTtcblx0XHRsZXQgaSxcblx0XHRcdG9Nb2RlbCxcblx0XHRcdG9NZXRhTW9kZWwsXG5cdFx0XHRvRW50aXR5U2V0OiBhbnksXG5cdFx0XHRvRW50aXR5RGVmOiBhbnksXG5cdFx0XHRvU3ViRW50aXR5RGVmOiBhbnksXG5cdFx0XHRvRW5kUm9sZTogYW55LFxuXHRcdFx0YUZpbHRlckNvbnRleHRQYXJ0ID0gW10sXG5cdFx0XHRhUGFyYW1Db250ZXh0UGFydCA9IFtdO1xuXG5cdFx0aWYgKFxuXHRcdFx0b0RhdGEgJiZcblx0XHRcdG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgJiZcblx0XHRcdCgob0RhdGEuc2VsZWN0aW9uVmFyaWFudC5GaWx0ZXJDb250ZXh0VXJsICYmIG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuU2VsZWN0T3B0aW9ucykgfHxcblx0XHRcdFx0KG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuUGFyYW1ldGVyQ29udGV4dFVybCAmJiBvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlBhcmFtZXRlcnMpKVxuXHRcdCkge1xuXHRcdFx0b01vZGVsID0gdGhpcy5fZ2V0TW9kZWwoKTtcblx0XHRcdGlmICh0aGlzLm9Db21wb25lbnQgJiYgb01vZGVsICYmIG9Nb2RlbC5pc0E8VjJPRGF0YU1vZGVsPihcInNhcC51aS5tb2RlbC5vZGF0YS52Mi5PRGF0YU1vZGVsXCIpKSB7XG5cdFx0XHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdGlmIChvTW9kZWwuZ2V0U2VydmljZU1ldGFkYXRhKCkgJiYgb01ldGFNb2RlbCAmJiBvTWV0YU1vZGVsLm9Nb2RlbCkge1xuXHRcdFx0XHRcdGlmIChvRGF0YS5zZWxlY3Rpb25WYXJpYW50LkZpbHRlckNvbnRleHRVcmwpIHtcblx0XHRcdFx0XHRcdGFGaWx0ZXJDb250ZXh0UGFydCA9IG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuRmlsdGVyQ29udGV4dFVybC5zcGxpdChcIiNcIik7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0YUZpbHRlckNvbnRleHRQYXJ0Lmxlbmd0aCA9PT0gMiAmJlxuXHRcdFx0XHRcdFx0b0RhdGEuc2VsZWN0aW9uVmFyaWFudC5TZWxlY3RPcHRpb25zICYmXG5cdFx0XHRcdFx0XHR0aGlzLl9jb25zdHJ1Y3RDb250ZXh0VXJsKG9Nb2RlbCkuaW5kZXhPZihhRmlsdGVyQ29udGV4dFBhcnRbMF0pID09PSAwXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRvRW50aXR5U2V0ID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVNldChhRmlsdGVyQ29udGV4dFBhcnRbMV0pO1xuXHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlTZXQpIHtcblx0XHRcdFx0XHRcdFx0b0VudGl0eURlZiA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlUeXBlKG9FbnRpdHlTZXQuZW50aXR5VHlwZSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRvRW50aXR5RGVmID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVR5cGUoYUZpbHRlckNvbnRleHRQYXJ0WzFdKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlEZWYpIHtcblx0XHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlEZWYgJiYgb0VudGl0eURlZi5wcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBvRW50aXR5RGVmLnByb3BlcnR5Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAodGhpcy5faXNNZWFzdXJlUHJvcGVydHkob0VudGl0eURlZi5wcm9wZXJ0eVtpXSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0YU1lYXN1cmVGaWx0ZXJOYW1lLnB1c2gob0VudGl0eURlZi5wcm9wZXJ0eVtpXS5uYW1lKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAob0VudGl0eURlZi5uYXZpZ2F0aW9uUHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgb0VudGl0eURlZi5uYXZpZ2F0aW9uUHJvcGVydHkubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0XHRcdG9FbmRSb2xlID0gb01ldGFNb2RlbC5nZXRPRGF0YUFzc29jaWF0aW9uRW5kKG9FbnRpdHlEZWYsIG9FbnRpdHlEZWYubmF2aWdhdGlvblByb3BlcnR5W2ldLm5hbWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCFvRW5kUm9sZSB8fCBvRW5kUm9sZS50eXBlID09PSBvRGF0YS5zZWxlY3Rpb25WYXJpYW50LkZpbHRlckNvbnRleHRVcmwpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBjaGVjayBpZiB0aGUgZW5kIHJvbGUgaGFzIGNhcmRpbmFsaXR5IDAuLjEgb3IgMVxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9FbmRSb2xlLm11bHRpcGxpY2l0eSA9PT0gXCIxXCIgfHwgb0VuZFJvbGUubXVsdGlwbGljaXR5ID09PSBcIjAuLjFcIikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRvU3ViRW50aXR5RGVmID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVR5cGUob0VuZFJvbGUudHlwZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvU3ViRW50aXR5RGVmICYmIG9TdWJFbnRpdHlEZWYucHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGxldCBqID0gMDsgaiA8IG9TdWJFbnRpdHlEZWYucHJvcGVydHkubGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmICh0aGlzLl9pc01lYXN1cmVQcm9wZXJ0eShvU3ViRW50aXR5RGVmLnByb3BlcnR5W2pdKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhTWVhc3VyZUZpbHRlck5hbWUucHVzaChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRW50aXR5RGVmLm5hdmlnYXRpb25Qcm9wZXJ0eVtpXS5uYW1lICsgXCIuXCIgKyBvU3ViRW50aXR5RGVmLnByb3BlcnR5W2pdLm5hbWVcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAob0RhdGEuc2VsZWN0aW9uVmFyaWFudC5QYXJhbWV0ZXJDb250ZXh0VXJsKSB7XG5cdFx0XHRcdFx0XHRhUGFyYW1Db250ZXh0UGFydCA9IG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuUGFyYW1ldGVyQ29udGV4dFVybC5zcGxpdChcIiNcIik7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0YVBhcmFtQ29udGV4dFBhcnQubGVuZ3RoID09PSAyICYmXG5cdFx0XHRcdFx0XHRvRGF0YS5zZWxlY3Rpb25WYXJpYW50LlBhcmFtZXRlcnMgJiZcblx0XHRcdFx0XHRcdHRoaXMuX2NvbnN0cnVjdENvbnRleHRVcmwob01vZGVsKS5pbmRleE9mKGFQYXJhbUNvbnRleHRQYXJ0WzBdKSA9PT0gMFxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0b0VudGl0eVNldCA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlTZXQoYVBhcmFtQ29udGV4dFBhcnRbMV0pO1xuXHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlTZXQpIHtcblx0XHRcdFx0XHRcdFx0b0VudGl0eURlZiA9IG9NZXRhTW9kZWwuZ2V0T0RhdGFFbnRpdHlUeXBlKG9FbnRpdHlTZXQuZW50aXR5VHlwZSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRvRW50aXR5RGVmID0gb01ldGFNb2RlbC5nZXRPRGF0YUVudGl0eVR5cGUoYUZpbHRlckNvbnRleHRQYXJ0WzFdKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlEZWYpIHtcblx0XHRcdFx0XHRcdFx0aWYgKG9FbnRpdHlEZWYucHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgb0VudGl0eURlZi5wcm9wZXJ0eS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuX2lzTWVhc3VyZVByb3BlcnR5KG9FbnRpdHlEZWYucHJvcGVydHlbaV0pKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFNZWFzdXJlUGFyYW1ldGVyTmFtZS5wdXNoKG9FbnRpdHlEZWYucHJvcGVydHlbaV0ubmFtZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGFNZWFzdXJlRmlsdGVyTmFtZS5sZW5ndGggfHwgYU1lYXN1cmVQYXJhbWV0ZXJOYW1lLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0Ly8gVFE6IG5lZWRzIGF0dGVudGlvblxuXHRcdFx0XHRcdFx0b0FkYXB0ZWREYXRhID0gZXh0ZW5kKHRydWUgYXMgYW55LCB7fSwgb0FkYXB0ZWREYXRhKTtcblxuXHRcdFx0XHRcdFx0dGhpcy5fcmVtb3ZlUHJvcGVydGllcyhhTWVhc3VyZUZpbHRlck5hbWUsIGFNZWFzdXJlUGFyYW1ldGVyTmFtZSwgb0FkYXB0ZWREYXRhKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gYW5ub3RhdGlvbnMgYXJlIG5vdCBsb2FkZWRcblxuXHRcdFx0XHRcdHRoaXMuX3JlbW92ZUFsbFByb3BlcnRpZXMob0FkYXB0ZWREYXRhKTtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJOYXZpZ2F0aW9uSGFuZGxlcjogb01ldGFkYXRhIGFyZSBub3QgZnVsbHkgbG9hZGVkIVwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmICh0aGlzLm9Db21wb25lbnQgJiYgb01vZGVsICYmIG9Nb2RlbC5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbFwiKSkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5fcmVtb3ZlU2Vuc2l0aXZlRGF0YUZvck9EYXRhVjQob0FkYXB0ZWREYXRhLCB0cnVlKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG9BZGFwdGVkRGF0YTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIHNlbnNpdGl2ZSBkYXRhIGZyb20gdGhlIG5hdmlnYXRpb24gY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIG9EYXRhIFNlbGVjdGlvbiB2YXJpYW50XG5cdCAqIEBwYXJhbSBiTWVhc3VyZSBTaG91bGQgbWVhc3VyZXMgYmUgcmVtb3ZlZFxuXHQgKiBAcmV0dXJucyBUaGUgc2VsZWN0aW9uIHZhcmlhbnQgYWZ0ZXIgc2Vuc2l0aXZlIGRhdGEgaGFzIGJlZW4gcmVtb3ZlZFxuXHQgKi9cblx0X3JlbW92ZVNlbnNpdGl2ZURhdGFGb3JPRGF0YVY0KG9EYXRhOiBhbnksIGJNZWFzdXJlPzogYm9vbGVhbikge1xuXHRcdGNvbnN0IG9OYXZIYW5kbGVyID0gdGhpcyxcblx0XHRcdG9TViA9IG5ldyBTZWxlY3Rpb25WYXJpYW50KG9EYXRhLnNlbGVjdGlvblZhcmlhbnQpLFxuXHRcdFx0b01vZGVsID0gdGhpcy5fZ2V0TW9kZWwoKTtcblx0XHRsZXQgYUZpbHRlckNvbnRleHRQYXJ0OiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcblxuXHRcdGlmICghb01vZGVsLmdldE1ldGFNb2RlbCgpLmdldE9iamVjdChcIi9cIikpIHtcblx0XHRcdC8vIGFubm90YXRpb25zIGFyZSBub3QgbG9hZGVkXG5cdFx0XHR0aGlzLl9yZW1vdmVBbGxQcm9wZXJ0aWVzKG9EYXRhKTtcblx0XHRcdExvZy5lcnJvcihcIk5hdmlnYXRpb25IYW5kbGVyOiBvTWV0YWRhdGEgYXJlIG5vdCBmdWxseSBsb2FkZWQhXCIpO1xuXHRcdFx0cmV0dXJuIG9EYXRhO1xuXHRcdH1cblxuXHRcdGlmIChvRGF0YS5zZWxlY3Rpb25WYXJpYW50LkZpbHRlckNvbnRleHRVcmwpIHtcblx0XHRcdGFGaWx0ZXJDb250ZXh0UGFydCA9IG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuRmlsdGVyQ29udGV4dFVybC5zcGxpdChcIiNcIik7XG5cdFx0fVxuXG5cdFx0aWYgKFxuXHRcdFx0YUZpbHRlckNvbnRleHRQYXJ0Py5sZW5ndGggPT09IDIgJiZcblx0XHRcdG9EYXRhLnNlbGVjdGlvblZhcmlhbnQuU2VsZWN0T3B0aW9ucyAmJlxuXHRcdFx0dGhpcy5fY29uc3RydWN0Q29udGV4dFVybChvTW9kZWwpLmluZGV4T2YoYUZpbHRlckNvbnRleHRQYXJ0WzBdKSA9PT0gMFxuXHRcdCkge1xuXHRcdFx0b1NWLnJlbW92ZVNlbGVjdE9wdGlvbihcIkBvZGF0YS5jb250ZXh0XCIpO1xuXHRcdFx0b1NWLnJlbW92ZVNlbGVjdE9wdGlvbihcIkBvZGF0YS5tZXRhZGF0YUV0YWdcIik7XG5cdFx0XHRvU1YucmVtb3ZlU2VsZWN0T3B0aW9uKFwiU0FQX19NZXNzYWdlc1wiKTtcblxuXHRcdFx0Y29uc3Qgc0VudGl0eVNldCA9IGFGaWx0ZXJDb250ZXh0UGFydFsxXSxcblx0XHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdFx0YVByb3BlcnR5TmFtZXMgPSBvU1YuZ2V0UHJvcGVydHlOYW1lcygpIHx8IFtdLFxuXHRcdFx0XHRmbklzU2Vuc2l0aXZlRGF0YSA9IGZ1bmN0aW9uIChzUHJvcDogYW55LCBlc05hbWU6IGFueSkge1xuXHRcdFx0XHRcdGVzTmFtZSA9IGVzTmFtZSB8fCBzRW50aXR5U2V0O1xuXHRcdFx0XHRcdGNvbnN0IGFQcm9wZXJ0eUFubm90YXRpb25zID0gb01ldGFNb2RlbC5nZXRPYmplY3QoXCIvXCIgKyBlc05hbWUgKyBcIi9cIiArIHNQcm9wICsgXCJAXCIpO1xuXHRcdFx0XHRcdGlmIChhUHJvcGVydHlBbm5vdGF0aW9ucykge1xuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHQoYk1lYXN1cmUgJiYgYVByb3BlcnR5QW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQW5hbHl0aWNzLnYxLk1lYXN1cmVcIl0pIHx8XG5cdFx0XHRcdFx0XHRcdG9OYXZIYW5kbGVyLl9jaGVja1Byb3BlcnR5QW5ub3RhdGlvbnNGb3JTZW5zaXRpdmVEYXRhKGFQcm9wZXJ0eUFubm90YXRpb25zKVxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChhUHJvcGVydHlBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRmllbGRDb250cm9sXCJdKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9GaWVsZENvbnRyb2wgPSBhUHJvcGVydHlBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRmllbGRDb250cm9sXCJdO1xuXHRcdFx0XHRcdFx0XHRpZiAob0ZpZWxkQ29udHJvbFtcIiRFbnVtTWVtYmVyXCJdICYmIG9GaWVsZENvbnRyb2xbXCIkRW51bU1lbWJlclwiXS5zcGxpdChcIi9cIilbMV0gPT09IFwiSW5hcHBsaWNhYmxlXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH07XG5cblx0XHRcdGZvciAobGV0IGsgPSAwOyBrIDwgYVByb3BlcnR5TmFtZXMubGVuZ3RoOyBrKyspIHtcblx0XHRcdFx0Y29uc3Qgc1Byb3BlcnR5ID0gYVByb3BlcnR5TmFtZXNba107XG5cdFx0XHRcdC8vIHByb3BlcnRpZXMgb2YgdGhlIGVudGl0eSBzZXRcblx0XHRcdFx0aWYgKGZuSXNTZW5zaXRpdmVEYXRhKHNQcm9wZXJ0eSwgc0VudGl0eVNldCkpIHtcblx0XHRcdFx0XHRvU1YucmVtb3ZlU2VsZWN0T3B0aW9uKHNQcm9wZXJ0eSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdG9EYXRhLnNlbGVjdGlvblZhcmlhbnQgPSBvU1YudG9KU09OT2JqZWN0KCk7XG5cdFx0fVxuXHRcdHJldHVybiBvRGF0YTtcblx0fVxuXG5cdF9jaGVja1Byb3BlcnR5QW5ub3RhdGlvbnNGb3JTZW5zaXRpdmVEYXRhKGFQcm9wZXJ0eUFubm90YXRpb25zOiBhbnkpIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0YVByb3BlcnR5QW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuUGVyc29uYWxEYXRhLnYxLklzUG90ZW50aWFsbHlTZW5zaXRpdmVcIl0gfHxcblx0XHRcdGFQcm9wZXJ0eUFubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkV4Y2x1ZGVGcm9tTmF2aWdhdGlvbkNvbnRleHRcIl1cblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgcGFyYW1ldGVyIHZhbHVlIG9mIHRoZSBzYXAtaWFwcC1zdGF0ZSAodGhlIGludGVybmFsIGFwcHMpIGZyb20gdGhlIEFwcEhhc2ggc3RyaW5nLiBJdCBhdXRvbWF0aWNhbGx5IHRha2VzIGNhcmUgYWJvdXRcblx0ICogY29tcGF0aWJpbGl0eSBiZXR3ZWVuIHRoZSBvbGQgYW5kIHRoZSBuZXcgYXBwcm9hY2ggb2YgdGhlIHNhcC1pYXBwLXN0YXRlLiBQcmVjZWRlbmNlIGlzIHRoYXQgdGhlIG5ldyBhcHByb2FjaCBpcyBmYXZvdXJlZCBhZ2FpbnN0IHRoZSBvbGRcblx0ICogYXBwcm9hY2guXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSB2YWx1ZSBvZiBzYXAtaWFwcC1zdGF0ZSAoaS5lLiB0aGUgbmFtZSBvZiB0aGUgY29udGFpbmVyIHRvIHJldHJpZXZlIHRoZSBwYXJhbWV0ZXJzKSwgb3IgPGNvZGU+dW5kZWZpbmVkPC9jb2RlPiBpblxuXHQgKiAgICAgICAgIGNhc2UgdGhhdCBubyBzYXAtaWFwcC1zdGF0ZSB3YXMgZm91bmQgaW4gPGNvZGU+c0FwcEhhc2g8L2NvZGU+LlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0Z2V0SUFwcFN0YXRlS2V5KCkge1xuXHRcdGNvbnN0IHNBcHBIYXNoID0gSGFzaENoYW5nZXIuZ2V0SW5zdGFuY2UoKS5nZXRIYXNoKCk7XG5cdFx0cmV0dXJuIHRoaXMuX2dldElubmVyQXBwU3RhdGVLZXkoc0FwcEhhc2gpO1xuXHR9XG59XG5cbi8vIEV4cG9ydGluZyB0aGUgY2xhc3MgYXMgcHJvcGVybHkgdHlwZWQgVUk1Q2xhc3NcblxuY29uc3QgTmF2aWdhdGlvbkhhbmRsZXJVSTVDbGFzcyA9IEJhc2VPYmplY3QuZXh0ZW5kKFxuXHRcInNhcC5mZS5uYXZpZ2F0aW9uLk5hdmlnYXRpb25IYW5kbGVyXCIsXG5cdE5hdmlnYXRpb25IYW5kbGVyLnByb3RvdHlwZSBhcyBhbnlcbikgYXMgdHlwZW9mIE5hdmlnYXRpb25IYW5kbGVyO1xudHlwZSBOYXZpZ2F0aW9uSGFuZGxlclVJNUNsYXNzID0gSW5zdGFuY2VUeXBlPHR5cGVvZiBOYXZpZ2F0aW9uSGFuZGxlcj47XG5leHBvcnQgZGVmYXVsdCBOYXZpZ2F0aW9uSGFuZGxlclVJNUNsYXNzO1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7O0VBeURBO0VBQ0EsTUFBTUEsT0FBTyxHQUFHQyxVQUFVLENBQUNELE9BQU87RUFDbEMsTUFBTUUsaUJBQWlCLEdBQUdELFVBQVUsQ0FBQ0MsaUJBQWlCO0VBQ3RELE1BQU1DLG1CQUFtQixHQUFHRixVQUFVLENBQUNFLG1CQUFtQjtFQUMxRCxNQUFNQyxJQUFJLEdBQUdILFVBQVUsQ0FBQ0csSUFBSTtFQUU1QixNQUFNQyxVQUFVLEdBQUcsZ0JBQWdCO0VBQ25DLE1BQU1DLDRCQUE0QixHQUFHLG9DQUFvQztFQUN6RSxNQUFNQyxxQkFBcUIsR0FBRyxzQkFBc0I7O0VBRXBEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBckJBLElBc0JhQyxpQkFBaUI7SUFBQTtJQVc3Qjs7SUFVQTtBQUNE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
|