@magic-xpa/engine 4.801.0-dev481.239 → 4.801.0-dev481.243
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/magic-xpa-engine.umd.js +45 -45
- package/bundles/magic-xpa-engine.umd.js.map +1 -1
- package/bundles/magic-xpa-engine.umd.min.js +2 -2
- package/bundles/magic-xpa-engine.umd.min.js.map +1 -1
- package/esm2015/src/CommandsProcessorBase.js +2 -2
- package/esm2015/src/CurrentClientVersion.js +2 -2
- package/esm2015/src/commands/ClientToServer/BrowserEscEventCommand.js +2 -3
- package/esm2015/src/data/DataView.js +2 -3
- package/esm2015/src/data/Field.js +2 -3
- package/esm2015/src/data/Record.js +2 -3
- package/esm2015/src/env/LanguageData.js +2 -3
- package/esm2015/src/event/EventHandler.js +2 -3
- package/esm2015/src/event/EventHandlerPosition.js +2 -2
- package/esm2015/src/event/EventsManager.js +2 -3
- package/esm2015/src/exp/ExpressionEvaluator.js +2 -3
- package/esm2015/src/gui/MgForm.js +2 -3
- package/esm2015/src/http/client/HttpClientBase.js +2 -3
- package/esm2015/src/remote/RemoteCommandsProcessor.js +2 -3
- package/esm2015/src/remote/ServerError.js +2 -3
- package/esm2015/src/rt/DataviewHeadersSaxHandler.js +2 -3
- package/esm2015/src/tasks/Task.js +2 -3
- package/fesm2015/magic-xpa-engine.js +2 -3
- package/fesm2015/magic-xpa-engine.js.map +1 -1
- package/package.json +4 -4
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { __awaiter } from "tslib";
|
|
2
2
|
import { Base64, JSON_Utils, Logger, Logger_LogLevels, Misc, MsgInterface, OSEnvironment, RequestInfo, StrUtil, XMLConstants } from "@magic-xpa/utils";
|
|
3
|
-
import { Debug, Encoding, Exception, List, NString, RefParam, StringBuilder } from "@magic-xpa/mscorelib";
|
|
3
|
+
import { Debug, Encoding, Exception, List, NString, RefParam, StringBuilder, isNullOrUndefined, isUndefined } from "@magic-xpa/mscorelib";
|
|
4
4
|
import { Commands, RuntimeContextBase, Styles, UsernamePasswordCredentials } from "@magic-xpa/gui";
|
|
5
5
|
import { ExecOperCommand } from '../commands/ClientToServer/ExecOperCommand';
|
|
6
6
|
import { CommandsProcessorBase, CommandsProcessorBase_SendingInstruction, CommandsProcessorBase_SessionStage } from "../CommandsProcessorBase";
|
|
@@ -10,7 +10,6 @@ import { Scrambler } from "../util/Scrambler";
|
|
|
10
10
|
import { ServerError } from "./ServerError";
|
|
11
11
|
import { FlowMonitorQueue } from "../util/FlowMonitorQueue";
|
|
12
12
|
import { OpeningTaskDetails } from "../tasks/TaskBase";
|
|
13
|
-
import { isNullOrUndefined, isUndefined } from "util";
|
|
14
13
|
import { HttpUtility } from "../http/client/HttpUtility";
|
|
15
14
|
import { HttpClientEvents } from "../http/client/HttpClientEvents";
|
|
16
15
|
import { ServerConfig } from "../ServerConfig";
|
|
@@ -899,4 +898,4 @@ class ErrorMessageXml {
|
|
|
899
898
|
return expired;
|
|
900
899
|
}
|
|
901
900
|
}
|
|
902
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbmdpbmUvc3JjL3JlbW90ZS9SZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLE1BQU0sRUFDTixVQUFVLEVBQ1YsTUFBTSxFQUNOLGdCQUFnQixFQUNoQixJQUFJLEVBQ0osWUFBWSxFQUNaLGFBQWEsRUFDYixXQUFXLEVBQ1gsT0FBTyxFQUNQLFlBQVksRUFDYixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RyxPQUFPLEVBRUwsUUFBUSxFQUNSLGtCQUFrQixFQUNsQixNQUFNLEVBQ04sMkJBQTJCLEVBQzVCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLDRDQUE0QyxDQUFDO0FBRTNFLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsd0NBQXdDLEVBQ3hDLGtDQUFrQyxFQUNuQyxNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFMUMsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFDLGtCQUFrQixFQUFXLE1BQU0sbUJBQW1CLENBQUM7QUFDL0QsT0FBTyxFQUFDLGlCQUFpQixFQUFFLFdBQVcs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QU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDOUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNwQixFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2xCO1FBRUQsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVPLHdCQUF3QjtRQUM5QixJQUFJLE9BQU8sR0FBWSxLQUFLLENBQUM7UUFDN0IsSUFBSSxJQUFJLENBQUMsd0JBQXdCLEdBQUcsQ0FBQyxFQUFFO1lBQ3JDLElBQUksYUFBYSxHQUFXLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQ3pELE9BQU8sR0FBRyxDQUFDLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDN0Y7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEJhc2U2NCxcclxuICBKU09OX1V0aWxzLFxyXG4gIExvZ2dlcixcclxuICBMb2dnZXJfTG9nTGV2ZWxzLFxyXG4gIE1pc2MsXHJcbiAgTXNnSW50ZXJmYWNlLFxyXG4gIE9TRW52aXJvbm1lbnQsXHJcbiAgUmVxdWVzdEluZm8sXHJcbiAgU3RyVXRpbCxcclxuICBYTUxDb25zdGFudHNcclxufSBmcm9tIFwiQG1hZ2ljLXhwYS91dGlsc1wiO1xyXG5pbXBvcnQge0RlYnVnLCBFbmNvZGluZywgRXhjZXB0aW9uLCBMaXN0LCBOU3RyaW5nLCBSZWZQYXJhbSwgU3RyaW5nQnVpbGRlcn0gZnJvbSBcIkBtYWdpYy14cGEvbXNjb3JlbGliXCI7XHJcbmltcG9ydCB7XHJcbiAgQXV0aGVudGljYXRpb25EaWFsb2dIYW5kbGVyLFxyXG4gIENvbW1hbmRzLFxyXG4gIFJ1bnRpbWVDb250ZXh0QmFzZSxcclxuICBTdHlsZXMsXHJcbiAgVXNlcm5hbWVQYXNzd29yZENyZWRlbnRpYWxzXHJcbn0gZnJvbSBcIkBtYWdpYy14cGEvZ3VpXCI7XHJcbmltcG9ydCB7RXhlY09wZXJDb21tYW5kfSBmcm9tICcuLi9jb21tYW5kcy9DbGllbnRUb1NlcnZlci9FeGVjT3BlckNvbW1hbmQnO1xyXG5pbXBvcnQge1Rhc2t9IGZyb20gJy4uL3Rhc2tzL1Rhc2snXHJcbmltcG9ydCB7XHJcbiAgQ29tbWFuZHNQcm9jZXNzb3JCYXNlLFxyXG4gIENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24sXHJcbiAgQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1Nlc3Npb25TdGFnZVxyXG59IGZyb20gXCIuLi9Db21tYW5kc1Byb2Nlc3NvckJhc2VcIjtcclxuaW1wb3J0IHtIdHRwTWFuYWdlcn0gZnJvbSBcIi4uL2h0dHAvSHR0cE1hbmFnZXJcIjtcclxuaW1wb3J0IHtDb25zdEludGVyZmFjZX0gZnJvbSBcIi4uL0NvbnN0SW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7U2NyYW1ibGVyfSBmcm9tIFwiLi4vdXRpbC9TY3JhbWJsZXJcIjtcclxuaW1wb3J0IHtTZXJ2ZXJFcnJvcn0gZnJvbSBcIi4vU2VydmVyRXJyb3JcIjtcclxuaW1wb3J0IHtJUmVzdWx0VmFsdWV9IGZyb20gXCIuLi9ydC9JUmVzdWx0VmFsdWVcIjtcclxuaW1wb3J0IHtGbG93TW9uaXRvclF1ZXVlfSBmcm9tIFwiLi4vdXRpbC9GbG93TW9uaXRvclF1ZXVlXCI7XHJcbmltcG9ydCB7T3BlbmluZ1Rhc2tEZXRhaWxzLCBUYXNrQmFzZX0gZnJvbSBcIi4uL3Rhc2tzL1Rhc2tCYXNlXCI7XHJcbmltcG9ydCB7aXNOdWxsT3JVbmRlZmluZWQsIGlzVW5kZWZpbmVkfSBmcm9tIFwidXRpbFwiO1xyXG5pbXBvcnQge0h0dHBVdGlsaXR5fSBmcm9tIFwiLi4vaHR0cC9jbGllbnQvSHR0cFV0aWxpdHlcIjtcclxuaW1wb3J0IHtIdHRwQ2xpZW50RXZlbnRzfSBmcm9tIFwiLi4vaHR0cC9jbGllbnQvSHR0cENsaWVudEV2ZW50c1wiO1xyXG5pbXBvcnQge1NlcnZlckNvbmZpZ30gZnJvbSBcIi4uL1NlcnZlckNvbmZpZ1wiO1xyXG5pbXBvcnQge01HRGF0YX0gZnJvbSBcIi4uL3Rhc2tzL01HRGF0YVwiO1xyXG5pbXBvcnQge0NvbW1hbmRzVGFibGV9IGZyb20gXCIuLi9Db21tYW5kc1RhYmxlXCI7XHJcbmltcG9ydCB7QWNjZXNzSGVscGVyfSBmcm9tIFwiLi4vQWNjZXNzSGVscGVyXCI7XHJcbmltcG9ydCB7RW52aXJvbm1lbnQsIEV2ZW50LCBFdmVudENvbW1hbmQsIEV2ZW50c01hbmFnZXIsIEdVSU1hbmFnZXIsIElDbGllbnRDb21tYW5kLCBSdW5UaW1lRXZlbnR9IGZyb20gXCIuLi8uLi9cIjtcclxuaW1wb3J0IHtJQ2xpZW50VG9TZXJ2ZXJDb21tYW5kSW5mb30gZnJvbSBcIi4uL2NvbW1hbmRzL0lDbGllbnRUb1NlcnZlckNvbW1hbmRJbmZvXCI7XHJcbmltcG9ydCB7TUdEYXRhQ29sbGVjdGlvbn0gZnJvbSBcIi4uL3Rhc2tzL01HRGF0YUNvbGxlY3Rpb25cIjtcclxuaW1wb3J0IHtTdWJzY3JpcHRpb24sIHRpbWVyfSBmcm9tIFwicnhqc1wiO1xyXG5cclxuLy8vIDxzdW1tYXJ5PiBSZXByZXNlbnRzIHRoZSBzdGF0dXMgb2YgYSByZXF1ZXN0IDwvc3VtbWFyeT5cclxuZW51bSAgUmVxdWVzdFN0YXR1c1xyXG57XHJcbiAgSGFuZGxlZCwgLy90aGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IGhhbmRsZWQuXHJcbiAgUmV0cnksICAgLy90aGUgcmVxdWVzdCBzaG91bGQgYmUgcmUtc2VudC5cclxuICBBYm9ydCAgIC8vdGhlIHJlcXVlc3QgY291bGQgbm90IGJlIGhhbmRsZWQgYW5kIHNob3VsZCBiZSBhYm9ydGVkLlxyXG59XHJcblxyXG4vLyBAZHluYW1pY1xyXG5leHBvcnQgY2xhc3MgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IgZXh0ZW5kcyBDb21tYW5kc1Byb2Nlc3NvckJhc2Uge1xyXG4gIHN0YXRpYyByZWFkb25seSBSQ19OT19DT05URVhUX0lEOiBzdHJpbmcgPSAnLTEnO1xyXG4gIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IgPSBudWxsO1xyXG4gIHB1YmxpYyBzdGF0aWMgSXNTZXNzaW9uUmVJbml0aWFsaXppbmcgPSBmYWxzZTtcclxuICBwcml2YXRlIHN0YXRpYyBsYXN0RXhjZXB0aW9uTWVzc2FnZSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgSW5pdGlhbFVybDogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgLy8gVE9ETyAtIG1vdmUgaXQgdG8gY2xhc3NcclxuICBwcml2YXRlIHN0YXRpYyByZXF1ZXN0TnVtYmVyID0gMDtcclxuICBwcml2YXRlIHN0YXRpYyB0b3RhbFRpbWVGb3JIVFRQUmVxdWVzdHMgPSAwO1xyXG4gIHByaXZhdGUgc3RhdGljIHRvdGFsUmVxdWVzdERhdGFMZW5ndGggPSAwO1xyXG4gIHByaXZhdGUgc3RhdGljIHRvdGFsUmVzcG9uc2VEYXRhTGVuZ3RoID0gMDtcclxuXHJcbiAgLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gIC8vICoqKioqKioqIFdoZW4gY2hhbmdpbmcgV0VCX0NPTU1VTklDQVRJT05fUFJPVE9DT0xfVkVSU0lPTiwgcGxlYXNlIGNoYW5nZSBvbiBtb2JpbGUgcGxhdGZvcm1zIGFzIHdlbGw6XHJcbiAgLy8gKioqKioqKiogVzEwTTogUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuY3NcclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBXRUJfQ09NTVVOSUNBVElPTl9QUk9UT0NPTF9WRVJTSU9OOiBzdHJpbmcgPSBcIjE0MDAyXCI7XHJcbiAgLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cclxuICAvLyBUT0RPOiBDaGVjayBpZiB3ZSBuZWVkIF9sb2dBY2N1bXVsYXRvci5cclxuICAvLyBwcml2YXRlIF9sb2dBY2N1bXVsYXRvcjogQ2xpZW50TG9nQWNjdW11bGF0b3IgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIF9sYXN0UmVxdWVzdFRpbWU6IG51bWJlciA9IDA7IC8vIHRoZSB0aW1lIG9mIHRoZSBsYXN0IHJlcXVlc3QgdG8gdGhlIHNlcnZlclxyXG5cclxuICBTZXJ2ZXJVcmw6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgX3Nob3VsZFNjcmFtYmxlQW5kVW5zY3JhbWJsZU1lc3NhZ2VzOiBib29sZWFuID0gZmFsc2U7IC8vIHN0YXRpYyBiZWNhdXNlIGl0IGlzIGluaXRpYWxpemVkIGJlZm9yZSB0aGUgZXhlY3V0aW9uIHByb3BzIGFyZSBhdmFpbGFibGVcclxuXHJcbiAgcHVibGljIFNlc3Npb25JZDogc3RyaW5nO1xyXG5cclxuICBwdWJsaWMgRGVsYXlDb21tYW5kRXhlY3V0aW9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfcmVxdWVzdEluZm8gPSBuZXcgUmVxdWVzdEluZm8oKTtcclxuXHJcbiAgc3RhdGljIEdldEluc3RhbmNlKCk6IFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yIHtcclxuICAgIGlmIChSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5faW5zdGFuY2UgPT09IG51bGwpIHtcclxuICAgICAgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuX2luc3RhbmNlID0gbmV3IFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLl9pbnN0YW5jZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy5TZXJ2ZXJVcmwgPSBTZXJ2ZXJDb25maWcuSW5zdGFuY2UuZ2V0U2VydmVyVVJMKCk7XHJcblxyXG4gICAgSHR0cE1hbmFnZXIuR2V0SW5zdGFuY2UoKTtcclxuXHJcbiAgICB0aGlzLlJlZ2lzdGVyRGVsZWdhdGVzKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENoZWNrcyB0aGF0IHNlc3Npb24gY291bnRlciBpcyBjb25zZWN1dGl2ZSBkdXJpbmcgdGhlIHNlc3Npb24gYW5kIHNldHMgbmV3IHZhbHVlLlxyXG4gIC8vLyBUaGUgb25seSBleGNlcHRpb24gaXMgaW4gY2FzZSB0aGUgY2xpZW50IHNlbnQgdG8gdGhlIHNlcnZlciBDb25zdEludGVyZmFjZS5TRVNTSU9OX0NPVU5URVJfQ0xPU0VfQ1RYX0lORElDQVRJT04sXHJcbiAgLy8vICAgIHRoZSBzZXJ2ZXIgaXMgZXhwZWN0ZWQgdG8gcmV0dXJuIENvbnN0SW50ZXJmYWNlLlNFU1NJT05fQ09VTlRFUl9DTE9TRV9DVFhfSU5ESUNBVElPTiBpbiByZXNwb25zZSAoUmVxdWVzdHNTZXJ2ZXJCYXNlOjpQcm9jZXNzUmVxdWVzdCksIHRvIGFja25vd2xlZGdlIHRoZSByZXF1ZXN0IHRvIGNsb3NlIHRoZSBjb250ZXh0LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibmV3U2Vzc2lvbkNvdW50ZXJcIj4hIS48L3BhcmFtPlxyXG4gIENoZWNrQW5kU2V0U2Vzc2lvbkNvdW50ZXIobmV3U2Vzc2lvbkNvdW50ZXI6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKG5ld1Nlc3Npb25Db3VudGVyID09PSBDb25zdEludGVyZmFjZS5TRVNTSU9OX0NPVU5URVJfQ0xPU0VfQ1RYX0lORElDQVRJT04pIHtcclxuICAgICAgRGVidWcuQXNzZXJ0KHRoaXMuR2V0U2Vzc2lvbkNvdW50ZXIoKSA9PT0gQ29uc3RJbnRlcmZhY2UuU0VTU0lPTl9DT1VOVEVSX0NMT1NFX0NUWF9JTkRJQ0FUSU9OKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBEZWJ1Zy5Bc3NlcnQobmV3U2Vzc2lvbkNvdW50ZXIgPT09IHRoaXMuR2V0U2Vzc2lvbkNvdW50ZXIoKSArIDEpO1xyXG4gICAgICB0aGlzLlNldFNlc3Npb25Db3VudGVyKG5ld1Nlc3Npb25Db3VudGVyKTtcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlU2VydmVyVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJTZXNzaW9uIENvdW50ZXIgLS0+IHswfVwiLCB0aGlzLl9zZXNzaW9uQ291bnRlcikpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBaZXJvIHNlc3Npb24gY291bnRlciB3aGVuIHJlaW5pdGlhbGl6aW5nIHNlcnZlciBjb21tdW5pY2F0aW9uIGRldGFpbHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgQ2xlYXJTZXNzaW9uQ291bnRlcigpOiB2b2lkXHJcbiAge1xyXG4gICAgdGhpcy5fc2Vzc2lvbkNvdW50ZXIgPSAwO1xyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlU2VydmVyVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJTZXNzaW9uIENvdW50ZXIgLS0+IHswfVwiLCB0aGlzLl9zZXNzaW9uQ291bnRlcikpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibmV3U2Vzc2lvbkNvdW50ZXJcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgU2V0U2Vzc2lvbkNvdW50ZXIobmV3U2Vzc2lvbkNvdW50ZXI6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fc2Vzc2lvbkNvdW50ZXIgPSBuZXdTZXNzaW9uQ291bnRlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgR2V0TGFzdFJlcXVlc3RUaW1lKCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fbGFzdFJlcXVlc3RUaW1lO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZVN0YXJ0U2Vzc2lvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgUmVTdGFydFNlc3Npb24oICk6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLklzU2Vzc2lvblJlSW5pdGlhbGl6aW5nID0gdHJ1ZTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLlN0b3JlU2Vzc2lvblJlSW5pdGlhbGl6aW5nRGF0YU9uTG9jYWxTdG9yYWdlKCk7XHJcbiAgICBsZXQgbmF2aWdhdGVSb290Um91dGUgPSBmYWxzZTtcclxuICAgIGlmICghUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlJlbW92ZWRDb250ZXh0RnJvbVNlcnZlcilcclxuICAgICAgbmF2aWdhdGVSb290Um91dGUgPSBFbnZpcm9ubWVudC5JbnN0YW5jZS5nZXRTcGVjaWFsUm91dGVUb1Jvb3RQcm9nT25Db250ZXh0UmVjcmVhdGlvbigpID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgQ29tbWFuZHMuYWRkUmVmcmVzaFBhZ2UobmF2aWdhdGVSb290Um91dGUsIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkluaXRpYWxVcmwpO1xyXG4gICAgLy9zdG9wIHRoZSBleGVjdXRpb24gYnkgdGhyb3dpbmcgZXhjZXB0aW9uLlxyXG4gICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignJyk7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBTdG9yZVNlc3Npb25SZUluaXRpYWxpemluZ0RhdGFPbkxvY2FsU3RvcmFnZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgU3RvcmVTZXNzaW9uUmVJbml0aWFsaXppbmdEYXRhT25Mb2NhbFN0b3JhZ2UgKCkgOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICBsZXQgbWFpblByZ1ZpZXdTdHJpbmdGb3JTZXJ2ZXIgPSBhd2FpdCB0aGlzLkJ1aWxkWE1MRm9yTWFpblByb2dyYW1EYXRhVmlldygpO1xyXG4gICAgbGV0IGdsb2JhbFBhcmFtc1N0cmluZyA9IEFjY2Vzc0hlbHBlci5nbG9iYWxQYXJhbXMubWlycm9yQWxsVG9YTUwoKTtcclxuXHJcbiAgICAvLyBzdG9yZSBtYWluUHJnVmlld1N0cmluZ0ZvclNlcnZlciwgSXNTZXNzaW9uUmVJbml0aWFsaXppbmcgYW5kIGdsb2JhbFBhcmFtc1N0cmluZyBvbiBsb2NhbFxyXG4gICAgLy8gc3RvcmFnZSBpbiBvcmRlciB0byB1c2UgaXQgZm9yIG5leHQgc2Vzc2lvbi5cclxuICAgIGxldCBkYXRhU3RvcmFnZSA9IHdpbmRvdy5sb2NhbFN0b3JhZ2U7XHJcbiAgICBkYXRhU3RvcmFnZS5zZXRJdGVtKENvbnN0SW50ZXJmYWNlLklTX1NFU1NJT05fUkVJTklUSUFMSVpJTkcsIFwidHJ1ZVwiKTtcclxuICAgIGRhdGFTdG9yYWdlLnNldEl0ZW0oQ29uc3RJbnRlcmZhY2UuTUFJTl9QUk9HX1ZJRVcsIG1haW5QcmdWaWV3U3RyaW5nRm9yU2VydmVyLnRvU3RyaW5nKCkpO1xyXG4gICAgZGF0YVN0b3JhZ2Uuc2V0SXRlbShDb25zdEludGVyZmFjZS5HTE9CQUxfUEFSQU1fTElTVCwgZ2xvYmFsUGFyYW1zU3RyaW5nKTtcclxuICAgIGRhdGFTdG9yYWdlLnNldEl0ZW0oQ29uc3RJbnRlcmZhY2UuTEFTVF9FWENFUFRJT04sIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLmxhc3RFeGNlcHRpb25NZXNzYWdlKTtcclxuICAgIGlmIChSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUmVtb3ZlZENvbnRleHRGcm9tU2VydmVyKVxyXG4gICAgICBkYXRhU3RvcmFnZS5zZXRJdGVtKENvbnN0SW50ZXJmYWNlLkNUWF9SRU1PVkVEX0ZST01fU1JWUiwgXCIxXCIpO1xyXG5cclxuICAgIEV2ZW50c01hbmFnZXIuSW5zdGFuY2Uuc3RvcmVMYXN0U2F2ZWRSb3V0ZUV2ZW50T25Mb2NhbFN0b3JhZ2UgKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJlc3RvcmVTZXNzaW9uUmVJbml0aWFsaXppbmdEYXRhRnJvbUxvY2FsU3RvcmFnZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgUmVzdG9yZVNlc3Npb25SZUluaXRpYWxpemluZ0RhdGFGcm9tTG9jYWxTdG9yYWdlIChrZXk6IHN0cmluZyApOnN0cmluZyB7XHJcblxyXG4gICAgbGV0IGRhdGFTdG9yYWdlID0gd2luZG93LmxvY2FsU3RvcmFnZTtcclxuICAgIGxldCB2YWwgPSBkYXRhU3RvcmFnZS5nZXRJdGVtKGtleSk7XHJcbiAgICByZXR1cm4gdmFsO1xyXG4gIH1cclxuXHJcbiAgICAvLy8gPHN1bW1hcnk+UHJlcGFyZSBhbmQgZXhlY3V0ZSB0aGUgMXN0ICYgMm5kIGhhbmRzaGFrZSByZXF1ZXN0czpcclxuICAvLy8gMXN0IHJlcXVlc3Q6ICBVVEY4VFJBTlM9Li4mYXBwbmFtZT0uLiZwcmduYW1lPS4uJmFyZ3VtZW50cz0tQTxSaWNoY2xpZW50PjxSZXF1ZXN0aW5nVmVyc2lvbkRldGFpbHM9XCIuLlwiLz48L1JpY2hjbGllbnQ+XHJcbiAgLy8vICAgICByZXNwb25zZTogaW5zdHJ1Y3Rpb25zIHRvIHRoZSBjbGllbnQgLSB3aGV0aGVyIHRvIGRpc3BsYXkgYXV0aGVudGljYXRpb24gZGlhbG9nLCB0aGUgc2VydmVyJ3MgdmVyc2lvbiwgYW5kIG1vcmUgLi5cclxuICAvLy8gICAgICAgICAgICAgICBlLmcuIDxSaWNoY2xpZW50cmVzcG9uc2U+PENvbnRleHRJRD4xMjAzMDg3ODk3MjYzNzEyMDA8L0NvbnRleHRJRD48RW52aXJvbm1lbnQgSW5wdXRQYXNzd29yZD1cIk5cIiBTeXN0ZW1Mb2dpbj1cIk5cIiBTY3JhbWJsZU1lc3NhZ2VzPVwiTlwiIE1heEludGVybmFsTG9nTGV2ZWw9XCJTZXJ2ZXIjXCIgSHR0cFRpbWVvdXQ9XCIxMFwiIENsaWVudE5ldHdvcmtSZWNvdmVyeUludGVydmFsPVwiMFwiIEZvcndhcmRTbGFzaD1cIndlYlwiLz48L1JpY2hjbGllbnRyZXNwb25zZT5cclxuICAvLy8gMm5kIHJlcXVlc3Q6IGF1dGhlbnRpY2F0aW9uIChvcHRpb25hbCwgZGVwZW5kaW5nIG9uIHRoZSAxc3QgcmVxdWVzdCkuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+dHJ1ZSBvbmx5IGlmIHRoZSBjbGllbnQgc2hvdWxkIGNvbnRpbnVlIHRvIHN0YXJ0IHRoZSBhY3R1YWwgcHJvZ3JhbSAoaS5lLiBhZnRlciBoYW5kc2hha2UpLjwvcmV0dXJucz5cclxuICBhc3luYyBTdGFydFNlc3Npb24oKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgYXV0aGVudGljYXRpb25DYW5jZWxsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBoYW5kc2hha2VSZXNwb25zZTogSGFuZHNoYWtlUmVzcG9uc2UgPSBudWxsO1xyXG4gICAgbGV0IGRpYWxvZzogQXV0aGVudGljYXRpb25EaWFsb2dIYW5kbGVyID0gbnVsbDtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgbGFzdFR5cGVkVXNlcklkOiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICAvLyAxc3QgaGFuZHNoYWtlIHJlcXVlc3Q6IHByZXBhcmUgMXN0IGhhbmRzaGFrZSByZXF1ZXN0IGFuZCBzY3JhbWJsZSBpdFxyXG4gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAgIGxldCBoYW5kc2hha2VJbml0aWFsVG9rZW5zOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgICAgaGFuZHNoYWtlSW5pdGlhbFRva2Vucy5BcHBlbmQoQ29uc3RJbnRlcmZhY2UuVVRGOFRSQU5TICtcclxuICAgICAgICBDb25zdEludGVyZmFjZS5SRVFfQVBQX05BTUUgKyBcIj1cIiArXHJcbiAgICAgICAgSHR0cFV0aWxpdHkuVXJsRW5jb2RlKFNlcnZlckNvbmZpZy5JbnN0YW5jZS5nZXRBcHBOYW1lKCksIEVuY29kaW5nLlVURjgpKTtcclxuXHJcbiAgICAgIGhhbmRzaGFrZUluaXRpYWxUb2tlbnMuQXBwZW5kKFwiJlwiICsgQ29uc3RJbnRlcmZhY2UuUkVRX0FSR1MgKyBcIj1cIiArIENvbnN0SW50ZXJmYWNlLlJFUV9BUkdfQUxQSEEgK1xyXG4gICAgICBcIjxSaWNoY2xpZW50PjxSZXF1aXJlcyBFbmNyeXB0aW9uS2V5PVxcXCJGYWxzZVxcXCIvPjxSSUFQcm90b2NvbFZlcnNpb249XFxcIlwiICsgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuV0VCX0NPTU1VTklDQVRJT05fUFJPVE9DT0xfVkVSU0lPTiArIFwiXFxcIi8+PC9SaWNoY2xpZW50PlwiKTtcclxuXHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiSGFuZHNoYWtlIHJlcXVlc3QgIzEgKG5vdCBzY3JhbWJsZWQpIDogezB9XCIsXHJcbiAgICAgICAgdGhpcy5TZXJ2ZXJVcmwgKyBDb25zdEludGVyZmFjZS5SRVFfQVJHX1NUQVJUICtcclxuICAgICAgICBDb25zdEludGVyZmFjZS5SQ19JTkRJQ0FUSU9OX0lOSVRJQUwgKyBoYW5kc2hha2VJbml0aWFsVG9rZW5zKSk7XHJcblxyXG4gICAgICBsZXQgaGFuZHNoYWtlSW5pdGlhbFVybDogc3RyaW5nID0gdGhpcy5TZXJ2ZXJVcmwgKyBDb25zdEludGVyZmFjZS5SRVFfQVJHX1NUQVJUICtcclxuICAgICAgICBDb25zdEludGVyZmFjZS5SQ19JTkRJQ0FUSU9OX0lOSVRJQUwgK1xyXG4gICAgICAgIENvbnN0SW50ZXJmYWNlLlJDX1RPS0VOX0RBVEEgK1xyXG4gICAgICAgIEh0dHBVdGlsaXR5LlVybEVuY29kZShTY3JhbWJsZXIuU2NyYW1ibGUoaGFuZHNoYWtlSW5pdGlhbFRva2Vucy5Ub1N0cmluZygpKSwgRW5jb2RpbmcuVVRGOCk7XHJcblxyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTZXJ2ZXJNZXNzYWdlc1RvTG9nKFwiXCIpO1xyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTZXJ2ZXJNZXNzYWdlc1RvTG9nKE5TdHJpbmcuRm9ybWF0KFwiSGFuZHNoYWtlIHJlcXVlc3QgIzE6IHswfVwiLCBoYW5kc2hha2VJbml0aWFsVXJsKSk7XHJcblxyXG4gICAgICAvLyBJbml0aWFsaXplIHRlbXAgY3R4R3JvdXAgd2l0aCBDdHhHcm91cCBmcm9tIGV4ZWN1dGlvbi5wcm9wZXJ0aWVzXHJcbiAgICAgIGxldCBjdHhHcm91cDogc3RyaW5nID0gU2VydmVyQ29uZmlnLkluc3RhbmNlLmdldEN0eEdyb3VwKCk7XHJcblxyXG4gICAgICB3aGlsZSAoIWF1dGhlbnRpY2F0aW9uQ2FuY2VsbGVkKSB7XHJcbiAgICAgICAgbGV0IHJlcXVlc3RTdGF0dXM6IFJlZlBhcmFtPFJlcXVlc3RTdGF0dXM+ID0gbmV3IFJlZlBhcmFtKFJlcXVlc3RTdGF0dXMuSGFuZGxlZCk7XHJcbiAgICAgICAgLy8gZXhlY3V0ZSB0aGUgMXN0IHJlcXVlc3RcclxuICAgICAgICBsZXQgcmVzcG9uc2VTdHI6IHN0cmluZyA9IGF3YWl0IHRoaXMuRGlzcGF0Y2hSZXF1ZXN0KGhhbmRzaGFrZUluaXRpYWxVcmwsIG51bGwsIENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZXNzaW9uU3RhZ2UuSEFORFNIQUtFLCByZXF1ZXN0U3RhdHVzKTtcclxuXHJcbiAgICAgICAgLy8gcHJvY2VzcyB0aGUgMXN0IHJlc3BvbnNlIC0gY2hlY2sgaWYgdGhlIHJlc3BvbnNlIGlzIGVycm9yLCB1bnNjcmFtYmxlIGFuZCBwYXJzZSBpdFxyXG4gICAgICAgIGlmIChOU3RyaW5nLklzTnVsbE9yRW1wdHkocmVzcG9uc2VTdHIpKSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgU2VydmVyRXJyb3IoXCJDbGllbnQgZmFpbGVkIHRvIGluaXRpYWxpemUgYSBzZXNzaW9uLlwiICsgT1NFbnZpcm9ubWVudC5Fb2xTZXEgK1xyXG4gICAgICAgICAgICBcIkVtcHR5IHJlc3BvbnNlIHdhcyByZWNlaXZlZCBmcm9tIHRoZSB3ZWIgc2VydmVyLlwiICsgT1NFbnZpcm9ubWVudC5Fb2xTZXEgKyBPU0Vudmlyb25tZW50LkVvbFNlcSArIHRoaXMuU2VydmVyVXJsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVNlcnZlck1lc3NhZ2VzVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJIYW5kc2hha2UgcmVzcG9uc2UgIzE6IHswfVwiLCByZXNwb25zZVN0cikpO1xyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVNlcnZlck1lc3NhZ2VzVG9Mb2coXCJcIik7XHJcblxyXG4gICAgICAgIGhhbmRzaGFrZVJlc3BvbnNlID0gbmV3IEhhbmRzaGFrZVJlc3BvbnNlKHJlc3BvbnNlU3RyKTtcclxuXHJcbiAgICAgICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkNvbnRleHRJRCA9IGhhbmRzaGFrZVJlc3BvbnNlLkNvbnRleHRJZDtcclxuXHJcbiAgICAgICAgLy8gc2F2ZSBzZXNzaW9uIGlkIG9uIGNsaWVudCB3aGljaCBpcyByZWNlaXZlZCBpbiAxc3QgcmVzcG9uc2UuXHJcbiAgICAgICAgdGhpcy5TZXNzaW9uSWQgPSBoYW5kc2hha2VSZXNwb25zZS5HZXRTZXNzaW9uSWQ7XHJcblxyXG4gICAgICAgIEh0dHBNYW5hZ2VyLkdldEluc3RhbmNlKCkuSHR0cENvbW11bmljYXRpb25UaW1lb3V0TVMgPSBoYW5kc2hha2VSZXNwb25zZS5IdHRwVGltZW91dCAqIDEwMDA7XHJcblxyXG4gICAgICAgIC8vIER1cmluZyBhdXRoZW50aWNhdGlvbiwgaWYgYXV0aGVudGljYXRpb24gZmFpbGVkIHRoZW4gc2VydmVyIHVubG9hZHMgY3R4IGFuZCBjcmVhdGVzIG5ldyBjdHggZm9yIG5leHQgYXV0aGVudGljYXRpb24gcmVxdWVzdC5cclxuICAgICAgICAvLyBTbyBldmVyeSB0aW1lIGFmdGVyIGF1dGhlbnRpY2F0aW9uIGZhaWxzIHdlIHJlY2VpdmUgbmV3IGN0eGlkIGZvciBuZXh0IGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QuXHJcbiAgICAgICAgLy8gSGVuY2UgdGFrZSBjdHhncm91cCBpbiBsb2NhbCB2YXJpYWJsZSBhbmQgdXBkYXRlIENsaWVudE1hbmFnZXIgb25seSBhZnRlciBhdXRoZW50aWNhdGlvbiBpcyBkb25lLlxyXG4gICAgICAgIGlmIChOU3RyaW5nLklzTnVsbE9yRW1wdHkoU2VydmVyQ29uZmlnLkluc3RhbmNlLmdldEN0eEdyb3VwKCkpKSB7XHJcbiAgICAgICAgICBjdHhHcm91cCA9IGhhbmRzaGFrZVJlc3BvbnNlLkNvbnRleHRJZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAgICAgLy8gMm5kIGhhbmRzaGFrZSByZXF1ZXN0XHJcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgICBsZXQgY3JlZGVudGlhbHM6IFVzZXJuYW1lUGFzc3dvcmRDcmVkZW50aWFscyA9IG51bGw7XHJcbiAgICAgICAgaWYgKFNlcnZlckNvbmZpZy5JbnN0YW5jZS5nZXRTa2lwQXV0aGVudGljYXRpb25EaWFsb2coKSkge1xyXG4gICAgICAgICAgLy8gc2tpcCBhdXRoZW50aWNhdGlvbiAodG8gdGhlIHJ1bnRpbWUtZW5naW5lKSBkaWFsb2dcclxuICAgICAgICAgIGlmIChTZXJ2ZXJDb25maWcuSW5zdGFuY2UuZ2V0VXNlcm5hbWUoKSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAvLyB1c2VyIHRoZSB1c2VySWQgJiBwYXNzd29yZCB0aGF0IHdlcmUgcGFzc2VkLCBhbmQgcmVzZXQgdGhlbSAodGhleSdsbCBiZSBzZXQgYmVsb3csIGlmIGF1dGhlbnRpY2F0ZWQgYnkgdGhlIHJ1bnRpbWUtZW5naW5lKVxyXG4gICAgICAgICAgICBjcmVkZW50aWFscyA9IG5ldyBVc2VybmFtZVBhc3N3b3JkQ3JlZGVudGlhbHMoU2VydmVyQ29uZmlnLkluc3RhbmNlLmdldFVzZXJuYW1lKCksIFNlcnZlckNvbmZpZy5JbnN0YW5jZS5nZXRQYXNzd29yZCgpKTtcclxuICAgICAgICAgICAgU2VydmVyQ29uZmlnLkluc3RhbmNlLnNldFVzZXJuYW1lKFwiXCIpO1xyXG4gICAgICAgICAgICBTZXJ2ZXJDb25maWcuSW5zdGFuY2Uuc2V0UGFzc3dvcmQoXCJcIik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGhhbmRzaGFrZVJlc3BvbnNlLklucHV0UGFzc3dvcmQgJiYgaGFuZHNoYWtlUmVzcG9uc2UuU3lzdGVtTG9naW4gIT09IEhhbmRzaGFrZVJlc3BvbnNlLlNZU1RFTV9MT0dJTl9BRCkge1xyXG4gICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKHRvIHRoZSBydW50aW1lLWVuZ2luZSkgZGlhbG9nXHJcbiAgICAgICAgICBpZiAobGFzdFR5cGVkVXNlcklkICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGxldCB0aXRsZTogc3RyaW5nID0gQWNjZXNzSGVscGVyLmxhbmd1YWdlRGF0YS5nZXRDb25zdE1lc3NhZ2UoTXNnSW50ZXJmYWNlLkJSS1RBQl9TVFJfRVJST1IpO1xyXG4gICAgICAgICAgICBsZXQgZXJyb3I6IHN0cmluZyA9IEFjY2Vzc0hlbHBlci5sYW5ndWFnZURhdGEuZ2V0Q29uc3RNZXNzYWdlKE1zZ0ludGVyZmFjZS5VU1JJTlBfU1RSX0JBRFBBU1NXKTtcclxuICAgICAgICAgICAgYXdhaXQgR1VJTWFuYWdlci5JbnN0YW5jZS5NZXNzYWdlQm94KHRpdGxlLCBlcnJvciwgU3R5bGVzLk1TR0JPWF9JQ09OX0VSUk9SIHwgU3R5bGVzLk1TR0JPWF9CVVRUT05fT0spO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCBhdXRoZW50aWNhdGlvbiBkaWFsb2dcclxuICAgICAgICAgIC8vIGxldCB1c2VySWQ6IHN0cmluZyA9IGxhc3RUeXBlZFVzZXJJZDtcclxuICAgICAgICAgIC8vXHJcbiAgICAgICAgICAvLyBpZiAoZGlhbG9nID09PSBudWxsKSB7XHJcbiAgICAgICAgICAvLyAgIGRpYWxvZyA9IG5ldyBBdXRoZW50aWNhdGlvbkRpYWxvZ0hhbmRsZXIodXNlcklkLCBHZXRMb2dvbkRpYWxvZ0V4ZWNQcm9wcygpKTtcclxuICAgICAgICAgIC8vIH1cclxuICAgICAgICAgIC8vIGRpYWxvZy5vcGVuRGlhbG9nKCk7XHJcblxyXG4gICAgICAgICAgLy8gY3JlZGVudGlhbHMgPSBkaWFsb2cuZ2V0Q3JlZGVudGlhbHMoKTtcclxuICAgICAgICAgIC8vIGlmIChjcmVkZW50aWFscyAhPT0gbnVsbClcclxuICAgICAgICAgIC8vICAgbGFzdFR5cGVkVXNlcklkID0gY3JlZGVudGlhbHMuVXNlcm5hbWU7XHJcbiAgICAgICAgICAvLyBlbHNlXHJcbiAgICAgICAgICAvLyAgIGF1dGhlbnRpY2F0aW9uQ2FuY2VsbGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIENvbnN0SW50ZXJmYWNlLlNFU1NJT05fQ09VTlRFUl9DTE9TRV9DVFhfSU5ESUNBVElPTiBpbnN0cnVjdHMgdGhlIHNlcnZlciB0byBjbG9zZSB0aGUgY29udGV4dC5cclxuICAgICAgICAvLyAobm90ZTogdW5sb2FkaW5nIGEgY29udGV4dCBwb3N0IGhhbmRzaGFrZSBzaG91bGQgYmUgZG9uZSB1c2luZyBDb21tYW5kLmNyZWF0ZVVubG9hZENvbW1hbmQpLlxyXG4gICAgICAgIGlmIChhdXRoZW50aWNhdGlvbkNhbmNlbGxlZCkge1xyXG4gICAgICAgICAgdGhpcy5TZXRTZXNzaW9uQ291bnRlcihDb25zdEludGVyZmFjZS5TRVNTSU9OX0NPVU5URVJfQ0xPU0VfQ1RYX0lORElDQVRJT04pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGhhbmRzaGFrZUF1dGhVcmw6IHN0cmluZyA9IHRoaXMuUHJlcGFyZUF1dGhlbnRpY2F0aW9uVXJsKGhhbmRzaGFrZVJlc3BvbnNlLkNvbnRleHRJZCwgY3R4R3JvdXAsIHRoaXMuR2V0U2Vzc2lvbkNvdW50ZXIoKSk7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBpZiAoY3JlZGVudGlhbHMgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgbGV0IGNyZWRlbnRpYWxzU3RyOiBzdHJpbmcgPSBjcmVkZW50aWFscy5Vc2VybmFtZSArIFwiOlwiO1xyXG4gICAgICAgICAgICBpZiAoIU5TdHJpbmcuSXNOdWxsT3JFbXB0eShjcmVkZW50aWFscy5QYXNzd29yZCkpIHtcclxuICAgICAgICAgICAgICBjcmVkZW50aWFsc1N0ciA9IGNyZWRlbnRpYWxzU3RyICsgY3JlZGVudGlhbHMuUGFzc3dvcmQgKyBcIjpcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjcmVkZW50aWFsc1N0ciArPSBoYW5kc2hha2VSZXNwb25zZS5Db250ZXh0SWQ7XHJcbiAgICAgICAgICAgIGNyZWRlbnRpYWxzU3RyID0gU2NyYW1ibGVyLlNjcmFtYmxlKGNyZWRlbnRpYWxzU3RyKTtcclxuICAgICAgICAgICAgY3JlZGVudGlhbHNTdHIgPSBCYXNlNjQuZW5jb2RlKGNyZWRlbnRpYWxzU3RyLCB0cnVlLCBFbmNvZGluZy5VVEY4KTtcclxuICAgICAgICAgICAgaGFuZHNoYWtlQXV0aFVybCArPSAoXCImVVNFUk5BTUU9XCIgKyBIdHRwVXRpbGl0eS5VcmxFbmNvZGUoY3JlZGVudGlhbHNTdHIsIEVuY29kaW5nLlVURjgpKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHNlbmQgMm5kIGhhbmRzaGFrZSByZXF1ZXN0IC0gd2l0aCBhdXRoZW50aWNhdGlvblxyXG4gICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTZXJ2ZXJNZXNzYWdlc1RvTG9nKE5TdHJpbmcuRm9ybWF0KFwiSGFuZHNoYWtlIHJlcXVlc3QgIzI6IHswfVwiLCBoYW5kc2hha2VBdXRoVXJsKSk7XHJcbiAgICAgICAgICAgIGxldCBzdGF0dXNSZXF1ZXN0OiBSZWZQYXJhbTxSZXF1ZXN0U3RhdHVzPiA9IG5ldyBSZWZQYXJhbShSZXF1ZXN0U3RhdHVzLkhhbmRsZWQpO1xyXG4gICAgICAgICAgICByZXNwb25zZVN0ciA9IGF3YWl0IHRoaXMuRGlzcGF0Y2hSZXF1ZXN0KGhhbmRzaGFrZUF1dGhVcmwsIG51bGwsIENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZXNzaW9uU3RhZ2UuSEFORFNIQUtFLCBzdGF0dXNSZXF1ZXN0KTtcclxuXHJcbiAgICAgICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoZSByZXNwb25zZSB3YXNuJ3QgcmVwbGF5ZWRcclxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlU3RyLmluZGV4T2YoaGFuZHNoYWtlUmVzcG9uc2UuQ29udGV4dElkKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmVyRXJyb3IoQWNjZXNzSGVscGVyLmxhbmd1YWdlRGF0YS5nZXRDb25zdE1lc3NhZ2UoTXNnSW50ZXJmYWNlLlVTUklOUF9TVFJfQkFEUEFTU1cpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgU2VydmVyQ29uZmlnLkluc3RhbmNlLnNldFVzZXJuYW1lKGNyZWRlbnRpYWxzLlVzZXJuYW1lKTtcclxuICAgICAgICAgICAgU2VydmVyQ29uZmlnLkluc3RhbmNlLnNldFBhc3N3b3JkKGNyZWRlbnRpYWxzLlBhc3N3b3JkKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgcmVxdWVzdFN0YXR1czogUmVmUGFyYW08UmVxdWVzdFN0YXR1cz4gPSBuZXcgUmVmUGFyYW0oUmVxdWVzdFN0YXR1cy5IYW5kbGVkKTtcclxuICAgICAgICAgICAgLy8gc2VuZCAybmQgaGFuZHNoYWtlIHJlcXVlc3QgLSB3aXRob3V0IGF1dGhlbnRpY2F0aW9uXHJcbiAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVNlcnZlck1lc3NhZ2VzVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJIYW5kc2hha2UgcmVxdWVzdCAjMjogezB9XCIsIGhhbmRzaGFrZUF1dGhVcmwpKTtcclxuICAgICAgICAgICAgcmVzcG9uc2VTdHIgPSBhd2FpdCB0aGlzLkRpc3BhdGNoUmVxdWVzdChoYW5kc2hha2VBdXRoVXJsLCBudWxsLCBDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2Vzc2lvblN0YWdlLkhBTkRTSEFLRSwgcmVxdWVzdFN0YXR1cyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTZXJ2ZXJNZXNzYWdlc1RvTG9nKE5TdHJpbmcuRm9ybWF0KFwiSGFuZHNoYWtlIHJlc3BvbnNlICMyOiB7MH1cIiwgcmVzcG9uc2VTdHIpKTtcclxuICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVNlcnZlck1lc3NhZ2VzVG9Mb2coXCJcIik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBTZXJ2ZXJFcnJvcikge1xyXG4gICAgICAgICAgICBsZXQgc2VydmVyRXJyb3I6IFNlcnZlckVycm9yID0gPFNlcnZlckVycm9yPmV4O1xyXG4gICAgICAgICAgICBpZiAoU2VydmVyQ29uZmlnLkluc3RhbmNlLmdldFNraXBBdXRoZW50aWNhdGlvbkRpYWxvZygpKSB7XHJcbiAgICAgICAgICAgICAgc3dpdGNoIChzZXJ2ZXJFcnJvci5HZXRDb2RlKCkpXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBTZXJ2ZXJFcnJvci5FUlJfQUNDRVNTX0RFTklFRDpcclxuICAgICAgICAgICAgICAgIC8vIEV4dGVybmFsIEF1dGhlbnRpY2F0b3IgYXV0aGVudGljYXRlZCB0aGUgdXNlciwgYWNjZXNzIHRvIHRoZSBhcHBsaWNhdGlvbiB3YXNuJ3QgYXV0aG9yaXplZC5cclxuICAgICAgICAgICAgICAgIGNhc2UgU2VydmVyRXJyb3IuRVJSX0FVVEhFTlRJQ0FUSU9OOlxyXG4gICAgICAgICAgICAgICAgICAvLyBFeHRlcm5hbCBBdXRoZW50aWNhdG9yIGF1dGhlbnRpY2F0ZWQgdGhlIHVzZXIgYnV0IGFwcGxpY2F0aW9uIGF1dGhlbnRpY2F0aW9uIGZhaWxlZFxyXG4gICAgICAgICAgICAgICAgICBTZXJ2ZXJDb25maWcuSW5zdGFuY2Uuc2V0U2tpcEF1dGhlbnRpY2F0aW9uRGlhbG9nKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgdGhyb3cgc2VydmVyRXJyb3I7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyB0aGUgc2Vzc2lvbiB3aWxsIG5ldmVyIHByb3ZpZGUgYSB3YXkgdG8gY2hhbmdlIHRoZSBjcmVkZW50aWFscywgdGhlcmVmb3JlIGFib3J0XHJcbiAgICAgICAgICAgIGlmICghaGFuZHNoYWtlUmVzcG9uc2UuSW5wdXRQYXNzd29yZClcclxuICAgICAgICAgICAgICB0aHJvdyBzZXJ2ZXJFcnJvcjtcclxuXHJcbiAgICAgICAgICAgIC8vIEVycm9yLklORl9OT19SRVNVTFQ6XHJcbiAgICAgICAgICAgIC8vICAgIGlmIGF1dGhlbnRpY2F0aW9uIGRpYWxvZyB3YXMgY2FuY2VsZWQsIHRoZSByZXF1ZXN0IHdhcyBzZW50IG9ubHkgdG8gY2xvc2UgdGhlIGNvbnRleHQsXHJcbiAgICAgICAgICAgIC8vICAgIGFuZCB0aGUgc2VydmVyIGlzbid0IGV4cGVjdGVkIHRvIHJldHVybiBhIHJlc3BvbnNlXHJcbiAgICAgICAgICAgIGlmIChzZXJ2ZXJFcnJvci5HZXRDb2RlKCkgIT09IFNlcnZlckVycm9yLkVSUl9BVVRIRU5USUNBVElPTiAmJlxyXG4gICAgICAgICAgICAgICAgKCFhdXRoZW50aWNhdGlvbkNhbmNlbGxlZCB8fCBzZXJ2ZXJFcnJvci5HZXRDb2RlKCkgIT09IFNlcnZlckVycm9yLklORl9OT19SRVNVTFQpKSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgc2VydmVyRXJyb3I7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhyb3cgZXg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBzdG9yZSBhbiBpbmRpY2F0aW9uIHRvIHNraXAgZnV0dXJlIGF1dGhlbnRpY2F0aW9uIChzZXNzaW9uIHJlc3RhcnQsIHBhcmFsbGVsIHByb2dyYW0pXHJcbiAgICAgIFNlcnZlckNvbmZpZy5JbnN0YW5jZS5zZXRTa2lwQXV0aGVudGljYXRpb25EaWFsb2codHJ1ZSk7XHJcblxyXG4gICAgICAvLyBzYXZlIGNvbnRleHQgZ3JvdXBcclxuICAgICAgU2VydmVyQ29uZmlnLkluc3RhbmNlLnNldEN0eEdyb3VwKGN0eEdyb3VwKTtcclxuXHJcbiAgICAgIGlmIChkaWFsb2cgIT09IG51bGwpXHJcbiAgICAgICAgZGlhbG9nLmNsb3NlRGlhbG9nKCk7XHJcblxyXG4gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgLy8gc2V0IHNlc3Npb24gcHJvcGVydGllc1xyXG4gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuU2hvdWxkU2NyYW1ibGVBbmRVbnNjcmFtYmxlTWVzc2FnZXMgPSBoYW5kc2hha2VSZXNwb25zZS5TY3JhbWJsZU1lc3NhZ2VzO1xyXG4gICAgICBpZiAoTG9nZ2VyLkluc3RhbmNlLkxvZ0xldmVsICE9PSBMb2dnZXJfTG9nTGV2ZWxzLkJhc2ljKSB7XHJcbiAgICAgICAgLy8gbWF4aW1hbCB2YWx1ZSBvZiB0aGUgSW50ZXJuYWxMb2dMZXZlbCB0aGF0IGNhbiBiZSBzZXQgYnkgdGhlIGNsaWVudC5cclxuICAgICAgICAvLyBpZiBzZXQsIGl0IGNvbnRyb2xzIHRoZSBtYXhpbWFsIHZhbHVlOyBvdGhlcndpc2UsIGFueSBsb2cgbGV2ZWwgaXMgYWxsb3dlZC5cclxuICAgICAgICBsZXQgbWF4SW50ZXJuYWxMb2dMZXZlbDogc3RyaW5nID0gaGFuZHNoYWtlUmVzcG9uc2UuTWF4SW50ZXJuYWxMb2dMZXZlbDtcclxuICAgICAgICBpZiAobWF4SW50ZXJuYWxMb2dMZXZlbCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgbGV0IG1heExvZ0xldmVsOiBMb2dnZXJfTG9nTGV2ZWxzID0gdGhpcy5wYXJzZUxvZ0xldmVsKG1heEludGVybmFsTG9nTGV2ZWwpO1xyXG4gICAgICAgICAgaWYgKG1heExvZ0xldmVsIDwgTG9nZ2VyLkluc3RhbmNlLkxvZ0xldmVsKSB7XHJcbiAgICAgICAgICAgIC8vIHRleHR1YWwgdmFsdWUgKGFzIGxvYWRlZCBmcm9tIHRoZSBleGVjdXRpb24gcHJvcGVydGllcylcclxuICAgICAgICAgICAgU2VydmVyQ29uZmlnLkluc3RhbmNlLnNldEludGVybmFsTG9nTGV2ZWwobWF4SW50ZXJuYWxMb2dMZXZlbCk7XHJcblxyXG4gICAgICAgICAgICAvLyBzZXQgdGhlIGFjdHVhbCBsb2cgbGV2ZWwgdG8gdGhlIGxldmVsIGFsbG93ZWQgYnkgdGhlIHNlcnZlclxyXG4gICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVUb0xvZyhOU3RyaW5nLkZvcm1hdChcIkludGVybmFsIGxvZyBsZXZlbCB3YXMgcmVzdHJpY3RlZCB0byAnezB9JyBieSB0aGUgTWFnaWMgeHBhIHNlcnZlci5cIiwgbWF4SW50ZXJuYWxMb2dMZXZlbCksIGZhbHNlKTtcclxuICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLkxvZ0xldmVsID0gbWF4TG9nTGV2ZWw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAgIC8vIDNyZCByZXF1ZXN0OiBFeGVjdXRlcyB0aGUgaW5pdGlhbCBwcm9ncmFtIGluIHRoZSBzZXJ2ZXIuXHJcbiAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgaWYgKCFhdXRoZW50aWNhdGlvbkNhbmNlbGxlZCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuRXhlY3V0ZUluaXRpYWxSZXF1ZXN0KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNhdGNoIChleCkge1xyXG4gICAgICBpZiAoZXggaW5zdGFuY2VvZiBTZXJ2ZXJFcnJvcilcclxuICAgICAgICB0aHJvdyBleDtcclxuXHJcbiAgICAgIGlmIChpc051bGxPclVuZGVmaW5lZChleC5Jbm5lckV4Y2VwdGlvbikpXHJcbiAgICAgICAgdGhyb3cgIG5ldyBTZXJ2ZXJFcnJvcihleC5tZXNzYWdlLCBuZXcgRXhjZXB0aW9uKGV4KSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aHJvdyBuZXcgU2VydmVyRXJyb3IoZXgubWVzc2FnZSwgZXguSW5uZXJFeGNlcHRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAhYXV0aGVudGljYXRpb25DYW5jZWxsZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHByZXBhcmVzIGhhbmRzaGFrZSByZXF1ZXN0IHVybCBmb3IgYXV0aGVudGljYXRpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRleHRJZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3R4R3JvdXBcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInNlc3Npb25Db3VudFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIFByZXBhcmVBdXRoZW50aWNhdGlvblVybChjb250ZXh0SWQ6IHN0cmluZywgY3R4R3JvdXA6IHN0cmluZywgc2Vzc2lvbkNvdW50OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IGhhbmRzaGFrZUF1dGhVcmw6IHN0cmluZyA9IHRoaXMuU2VydmVyVXJsICsgQ29uc3RJbnRlcmZhY2UuUkVRX0FSR19TVEFSVCArXHJcbiAgICAgIENvbnN0SW50ZXJmYWNlLlJDX0lORElDQVRJT04gKyBDb25zdEludGVyZmFjZS5VVEY4VFJBTlMgK1xyXG4gICAgICBDb25zdEludGVyZmFjZS5SQ19UT0tFTl9DVFhfSUQgKyBjb250ZXh0SWQ7XHJcblxyXG4gICAgaWYgKCFpc051bGxPclVuZGVmaW5lZCh0aGlzLlNlc3Npb25JZCkpXHJcbiAgICAgIGhhbmRzaGFrZUF1dGhVcmwgKz0gKENvbnN0SW50ZXJmYWNlLlJFUV9BUkdfU0VQQVJBVE9SICsgIENvbnN0SW50ZXJmYWNlLlJDX1RPS0VOX1NFU1NJT05fSUQgKyB0aGlzLlNlc3Npb25JZCk7XHJcblxyXG4gICAgaGFuZHNoYWtlQXV0aFVybCArPSAoQ29uc3RJbnRlcmZhY2UuUkVRX0FSR19TRVBBUkFUT1IgK1xyXG4gICAgICAgIENvbnN0SW50ZXJmYWNlLlJDX1RPS0VOX1NFU1NJT05fQ09VTlQgKyBzZXNzaW9uQ291bnQgK1xyXG4gICAgICAgIENvbnN0SW50ZXJmYWNlLlJFUV9BUkdfU0VQQVJBVE9SICtcclxuICAgICAgICBDb25zdEludGVyZmFjZS5SQ19UT0tFTl9DVFhfR1JPVVAgKyBjdHhHcm91cCArXHJcbiAgICAgICAgQ29uc3RJbnRlcmZhY2UuUkVRX0FSR19TRVBBUkFUT1IgK1xyXG4gICAgICAgIENvbnN0SW50ZXJmYWNlLlJDX0FVVEhFTlRJQ0FUSU9OX1JFUVVFU1QpO1xyXG5cclxuICAgIHJldHVybiBoYW5kc2hha2VBdXRoVXJsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBFeGVjdXRlcyB0aGUgaW5pdGlhbCBwcm9ncmFtIGluIHRoZSBzZXJ2ZXI6XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIEV4ZWN1dGVJbml0aWFsUmVxdWVzdCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIHNlbmQgdGhlIElOSVRJQUwgcmVxdWVzdCB0byB0aGUgc2VydmVyLlxyXG4gICAgYXdhaXQgdGhpcy5FeGVjdXRlXzEoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMsIENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZXNzaW9uU3RhZ2UuSU5JVElBTCwgbnVsbCk7XHJcbiAgfVxyXG5cclxuICAvLyBwcml2YXRlIHN0YXRpYyBHZXRMb2dvbkRpYWxvZ0V4ZWNQcm9wcygpOiBEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiB7XHJcbiAgLy8gICBsZXQgZGljdGlvbmFyeTogRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4oKTtcclxuICAvLyAgIGxldCB2YWx1ZTogc3RyaW5nID0gQ2xpZW50TWFuYWdlci5JbnN0YW5jZS5nZXRMb2dvbldpbmRvd1RpdGxlKCk7XHJcbiAgLy8gICBsZXQgZmxhZzogYm9vbGVhbiA9IE5TdHJpbmcuSXNOdWxsT3JFbXB0eSh2YWx1ZSk7XHJcbiAgLy8gICBpZiAoZmxhZykge1xyXG4gIC8vICAgICB2YWx1ZSA9IFwiTG9nb24gLSBcIiArIENsaWVudE1hbmFnZXIuSW5zdGFuY2UuZ2V0QXBwTmFtZSgpO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgZGljdGlvbmFyeS5BZGQoXCJMb2dvbldpbmRvd1RpdGxlXCIsIHZhbHVlKTtcclxuICAvLyAgIGxldCB0ZXh0OiBzdHJpbmcgPSBDbGllbnRNYW5hZ2VyLkluc3RhbmNlLmdldExvZ29uR3JvdXBUaXRsZSgpO1xyXG4gIC8vICAgbGV0IGZsYWcyOiBib29sZWFuID0gIU5TdHJpbmcuSXNOdWxsT3JFbXB0eSh0ZXh0KTtcclxuICAvLyAgIGlmIChmbGFnMikge1xyXG4gIC8vICAgICB0ZXh0ID0gKCh0ZXh0Lmxlbmd0aCA+IDYyKSA/IE5TdHJpbmcuU3Vic3RyaW5nKHRleHQsIDAsIDYyKSA6IHRleHQpO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgZWxzZSB7XHJcbiAgLy8gICAgIHRleHQgPSBcIkxvZ29uIFBhcmFtZXRlcnNcIjtcclxuICAvLyAgIH1cclxuICAvLyAgIGRpY3Rpb25hcnkuQWRkKFwiTG9nb25Hcm91cFRpdGxlXCIsIHRleHQpO1xyXG4gIC8vICAgbGV0IHRleHQyOiBzdHJpbmcgPSBDbGllbnRNYW5hZ2VyLkluc3RhbmNlLmdldExvZ29uTXNnQ2FwdGlvbigpO1xyXG4gIC8vICAgbGV0IGZsYWczOiBib29sZWFuID0gIU5TdHJpbmcuSXNOdWxsT3JFbXB0eSh0ZXh0Mik7XHJcbiAgLy8gICBpZiAoZmxhZzMpIHtcclxuICAvLyAgICAgdGV4dDIgPSAoKHRleHQyLmxlbmd0aCA+IDU2KSA/IE5TdHJpbmcuU3Vic3RyaW5nKHRleHQyLCAwLCA1NikgOiB0ZXh0Mik7XHJcbiAgLy8gICAgIGRpY3Rpb25hcnkuQWRkKFwiTG9nb25NZXNzYWdlQ2FwdGlvblwiLCB0ZXh0Mik7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBsZXQgbG9nb25XaW5kb3dJY29uVVJMOiBVcmkgPSBDbGllbnRNYW5hZ2VyLkluc3RhbmNlLmdldExvZ29uV2luZG93SWNvblVSTCgpO1xyXG4gIC8vICAgbGV0IGZsYWc0OiBib29sZWFuID0gVXJpLm9wX0luZXF1YWxpdHkobG9nb25XaW5kb3dJY29uVVJMLCBudWxsKSAmJiAhTlN0cmluZy5Jc051bGxPckVtcHR5KGxvZ29uV2luZG93SWNvblVSTC5Ub1N0cmluZygpKTtcclxuICAvLyAgIGlmIChmbGFnNCkge1xyXG4gIC8vICAgICBkaWN0aW9uYXJ5LkFkZChcIkxvZ29uV2luZG93SWNvblVSTFwiLCBsb2dvbldpbmRvd0ljb25VUkwuVG9TdHJpbmcoKSk7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBsZXQgbG9nb25XaW5kb3dJbWFnZVVSTDogVXJpID0gQ2xpZW50TWFuYWdlci5JbnN0YW5jZS5nZXRMb2dvbldpbmRvd0ltYWdlVVJMKCk7XHJcbiAgLy8gICBsZXQgZmxhZzU6IGJvb2xlYW4gPSBVcmkub3BfSW5lcXVhbGl0eShsb2dvbldpbmRvd0ltYWdlVVJMLCBudWxsKSAmJiAhTlN0cmluZy5Jc051bGxPckVtcHR5KGxvZ29uV2luZG93SW1hZ2VVUkwuVG9TdHJpbmcoKSk7XHJcbiAgLy8gICBpZiAoZmxhZzUpIHtcclxuICAvLyAgICAgZGljdGlvbmFyeS5BZGQoXCJMb2dvbkltYWdlVVJMXCIsIGxvZ29uV2luZG93SW1hZ2VVUkwuVG9TdHJpbmcoKSk7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBsZXQgdGV4dDM6IHN0cmluZyA9IENsaWVudE1hbmFnZXIuSW5zdGFuY2UuZ2V0TG9nb25Vc2VySWRDYXB0aW9uKCk7XHJcbiAgLy8gICBsZXQgZmxhZzY6IGJvb2xlYW4gPSAhTlN0cmluZy5Jc051bGxPckVtcHR5KHRleHQzKTtcclxuICAvLyAgIGlmIChmbGFnNikge1xyXG4gIC8vICAgICB0ZXh0MyA9ICgodGV4dDMubGVuZ3RoID4gOSkgPyBOU3RyaW5nLlN1YnN0cmluZyh0ZXh0MywgMCwgOSkgOiB0ZXh0Myk7XHJcbiAgLy8gICAgIGRpY3Rpb25hcnkuQWRkKFwiTG9nb25Vc2VySURDYXB0aW9uXCIsIHRleHQzKTtcclxuICAvLyAgIH1cclxuICAvLyAgIGxldCB0ZXh0NDogc3RyaW5nID0gQ2xpZW50TWFuYWdlci5JbnN0YW5jZS5nZXRMb2dvblBhc3N3b3JkQ2FwdGlvbigpO1xyXG4gIC8vICAgbGV0IGZsYWc3OiBib29sZWFuID0gIU5TdHJpbmcuSXNOdWxsT3JFbXB0eSh0ZXh0NCk7XHJcbiAgLy8gICBpZiAoZmxhZzcpIHtcclxuICAvLyAgICAgdGV4dDQgPSAoKHRleHQ0Lmxlbmd0aCA+IDkpID8gTlN0cmluZy5TdWJzdHJpbmcodGV4dDQsIDAsIDkpIDogdGV4dDQpO1xyXG4gIC8vICAgICBkaWN0aW9uYXJ5LkFkZChcIkxvZ29uUGFzc3dvcmRDYXB0aW9uXCIsIHRleHQ0KTtcclxuICAvLyAgIH1cclxuICAvLyAgIGxldCBsb2dvbk9LQ2FwdGlvbjogc3RyaW5nID0gQ2xpZW50TWFuYWdlci5JbnN0YW5jZS5nZXRMb2dvbk9LQ2FwdGlvbigpO1xyXG4gIC8vICAgbGV0IGZsYWc4OiBib29sZWFuID0gIU5TdHJpbmcuSXNOdWxsT3JFbXB0eShsb2dvbk9LQ2FwdGlvbik7XHJcbiAgLy8gICBpZiAoZmxhZzgpIHtcclxuICAvLyAgICAgZGljdGlvbmFyeS5BZGQoXCJMb2dvbk9LQ2FwdGlvblwiLCBsb2dvbk9LQ2FwdGlvbik7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBsZXQgbG9nb25DYW5jZWxDYXB0aW9uOiBzdHJpbmcgPSBDbGllbnRNYW5hZ2VyLkluc3RhbmNlLmdldExvZ29uQ2FuY2VsQ2FwdGlvbigpO1xyXG4gIC8vICAgbGV0IGZsYWc5OiBib29sZWFuID0gIU5TdHJpbmcuSXNOdWxsT3JFbXB0eShsb2dvbkNhbmNlbENhcHRpb24pO1xyXG4gIC8vICAgaWYgKGZsYWc5KSB7XHJcbiAgLy8gICAgIGRpY3Rpb25hcnkuQWRkKFwiTG9nb25DYW5jZWxDYXB0aW9uXCIsIGxvZ29uQ2FuY2VsQ2FwdGlvbik7XHJcbiAgLy8gICB9XHJcbiAgLy8gICByZXR1cm4gZGljdGlvbmFyeTtcclxuICAvLyB9XHJcblxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBydW50aW1lIHRhc2sgdHJlZSBzdHJ1Y3R1cmUgYnkgZ29pbmcgdXAgZnJvbSB0aGUgY3VycmVudCB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIEdldFRhc2tUcmVlKHRhc2s6IFRhc2spOiBMaXN0PHN0cmluZz4ge1xyXG4gICAgbGV0IHRhc2tUcmVlOiBMaXN0PHN0cmluZz4gPSBuZXcgTGlzdDxzdHJpbmc+KCk7XHJcblxyXG4gICAgd2hpbGUoIWlzTnVsbE9yVW5kZWZpbmVkKHRhc2spKVxyXG4gICAge1xyXG4gICAgICB0YXNrVHJlZS5wdXNoKHRhc2suZ2V0VGFza0luZm8oKSk7XHJcbiAgICAgIHRhc2sgPSA8VGFzaz50YXNrLmdldFBhcmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0YXNrVHJlZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gVXBkYXRlIHRoZSByZXF1ZXN0IGluZm8gb2JqZWN0IHVzaW5nIGluZm9ybWF0aW9uIG9idGFpbmVkIGZyb20gY3VycmVudCBvcGVyYXRpb24gYmVpbmcgZXhlY3V0ZWQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIFVwZGF0ZVJlcXVlc3RJbmZvKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGN1cnJNR0RhdGE6IE1HRGF0YSA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5nZXRDdXJyTUdEYXRhKCk7XHJcbiAgICBsZXQgZXZlbnRzTWFuYWdlcjogRXZlbnRzTWFuYWdlciA9IDxFdmVudHNNYW5hZ2VyPkFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyO1xyXG4gICAgbGV0IG9wZXJFeGVjdXRpb246Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGNtZHNUb1NlcnZlcjogQ29tbWFuZHNUYWJsZSA9IDxDb21tYW5kc1RhYmxlPmN1cnJNR0RhdGEuQ21kc1RvU2VydmVyO1xyXG5cclxuICAgIGZvcihsZXQgaT0wOyBpPCBjbWRzVG9TZXJ2ZXIuZ2V0U2l6ZSgpOyBpKyspXHJcbiAgICB7XHJcbiAgICAgIC8vIFdoZW4gdGhlIHJlcXVlc3QgaXMgYmVpbmcgc2VudCB0byBzZXJ2ZXIgZHVlIHRvIGFuIG9wZXJhdGlvbiBleGVjdXRpb24sIGdldCB0aGUgaW5mb3JtYXRpb24gb2YgY3VycmVudCBvcGVyYXRpb24gZnJvbSBDbWRzVG9TZXJ2ZXJcclxuICAgICAgaWYoY21kc1RvU2VydmVyLmdldENtZChpKSBpbnN0YW5jZW9mIEV4ZWNPcGVyQ29tbWFuZCkge1xyXG4gICAgICAgIGxldCBvcGVyQ21kOkV4ZWNPcGVyQ29tbWFuZCA9IDxFeGVjT3BlckNvbW1hbmQ+KDxDb21tYW5kc1RhYmxlPmN1cnJNR0RhdGEuQ21kc1RvU2VydmVyKS5nZXRDbWQoaSk7XHJcblxyXG4gICAgICAgIHRoaXMuX3JlcXVlc3RJbmZvLnNlcnZlckNhbGxBdCA9IG9wZXJDbWQuZ2V0Q29tbWFuZEluZm8oKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcmVxdWVzdEluZm8ucnVudGltZVRhc2tUcmVlID0gdGhpcy5HZXRUYXNrVHJlZShvcGVyQ21kLmdldFRhc2soKSk7XHJcbiAgICAgICAgb3BlckV4ZWN1dGlvbiA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9yZXF1ZXN0SW5mby5leHRyYUluZm8uY29udGV4dElEID0gUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkNvbnRleHRJRDtcclxuICAgIHRoaXMuX3JlcXVlc3RJbmZvLmV4dHJhSW5mby5zZXNzaW9uQ291bnRlciA9IHRoaXMuR2V0U2Vzc2lvbkNvdW50ZXIoKTtcclxuXHJcbiAgICAvLyBMb2cgaW5mb3JtYXRpb24gYWJvdXQgbWFnaWMgaW50ZXJuYWwgZXZlbnRzIGNhdXNpbmcgcmVxdWVzdHMgdG8gc2VydmVyXHJcbiAgICBpZighb3BlckV4ZWN1dGlvbilcclxuICAgIHtcclxuICAgICAgaWYoZXZlbnRzTWFuYWdlci5nZXRMYXN0UnRFdmVudCgpICE9IG51bGwgJiYgZXZlbnRzTWFuYWdlci5nZXRMYXN0UnRFdmVudCgpLkludGVybmFsRXZlbnQgIT0gMClcclxuICAgICAge1xyXG4gICAgICAgIGxldCBydEV2dDpSdW5UaW1lRXZlbnQgPSBldmVudHNNYW5hZ2VyLmdldExhc3RSdEV2ZW50KCk7XHJcbiAgICAgICAgdGhpcy5fcmVxdWVzdEluZm8ucnVudGltZVRhc2tUcmVlID0gdGhpcy5HZXRUYXNrVHJlZSg8VGFzaz5ydEV2dC5nZXRUYXNrKCkpO1xyXG5cclxuICAgICAgICAvLyByZXR1cm4gZGVzY3JpcHRpb24gYXMgcGVyIG5ldy9vbGQgaW50ZXJuYWwgZXZlbnQgZGVzY1xyXG4gICAgICAgIGxldCBldmVudERlc2NyaXB0aW9uOiBzdHJpbmcgPSAgcnRFdnQuaXNOZXdJbnRlcm5hbEV2ZW50KClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBOU3RyaW5nLlRyaW1FbmQocnRFdnQuZ2V0TmV3SW50ZXJuYWxFdmVudERlc2NyaXB0aW9uKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRXZlbnQuZ2V0SW50ZXJuYWxFdnREZXNjcmlwdGlvbihydEV2dC5JbnRlcm5hbEV2ZW50KTtcclxuXHJcblxyXG4gICAgICAgIC8vIGUuZy4gRXZlbnQgWzxOZXh0IENodW5rPl0gd2hpbGUgZXhlY3V0aW5nIFs8VmlldyBSZWZyZXNoPl1cclxuICAgICAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZCA9IGNtZHNUb1NlcnZlci5nZXRDbWQoY21kc1RvU2VydmVyLmdldFNpemUoKSAtIDEpO1xyXG4gICAgICAgIGlmKGNtZCBhcyBJQ2xpZW50VG9TZXJ2ZXJDb21tYW5kSW5mbykge1xyXG4gICAgICAgICAgbGV0IGNvbW1hbmRJbmZvOiBzdHJpbmcgPSBOU3RyaW5nLklzTnVsbE9yRW1wdHkoKDxJQ2xpZW50VG9TZXJ2ZXJDb21tYW5kSW5mbz5jbWQpLmdldENvbW1hbmRJbmZvKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBOU3RyaW5nLkVtcHR5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoPElDbGllbnRUb1NlcnZlckNvbW1hbmRJbmZvPmNtZCkuZ2V0Q29tbWFuZEluZm8oKTtcclxuXHJcbiAgICAgICAgICAvLyBJbiBjYXNlIHRoZSBydW50aW1lIGV2ZW50IGFuZCBFdmVudCBjb21tYW5kIGFyZSBzYW1lLCBubyBuZWVkIHRvIGxvZyB0aGUgZXh0cmEgaW5mb3JtYXRpb25cclxuICAgICAgICAgIGlmKGNtZCBpbnN0YW5jZW9mIEV2ZW50Q29tbWFuZCAmJiBydEV2dC5JbnRlcm5hbEV2ZW50ID09ICg8RXZlbnRDb21tYW5kPmNtZCkuTWFnaWNFdmVudClcclxuICAgICAgICAgICAgZXZlbnREZXNjcmlwdGlvbiA9IE5TdHJpbmcuRW1wdHk7XHJcblxyXG4gICAgICAgICAgdGhpcy5fcmVxdWVzdEluZm8uc2VydmVyQ2FsbEF0ID0gICdFdmVudCAnICsgY29tbWFuZEluZm8gK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghTlN0cmluZy5Jc051bGxPckVtcHR5KGV2ZW50RGVzY3JpcHRpb24pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gTlN0cmluZy5Gb3JtYXQoJyB3aGlsZSBleGVjdXRpbmcgW3swfV0nLCBldmVudERlc2NyaXB0aW9uKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5TdHJpbmcuRW1wdHkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBCdWlsZCB4bWwgZm9yIG1haW4gcHJvZyBkYXRhdmlldy4gcmVxdWlyZWQgZm9yIHJlLWluaXRpYWxpemluZyBzZXNzaW9uLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhc3luYyBCdWlsZFhNTEZvck1haW5Qcm9ncmFtRGF0YVZpZXcoKTogUHJvbWlzZTxTdHJpbmc+XHJcbiAge1xyXG4gICAgbGV0IG1lc3NhZ2U6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgbGV0IGZpcnN0TWdEYXRhOiBNR0RhdGEgPSBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldE1HRGF0YSgwKTtcclxuICAgIGxldCBtYWluUHJnOiBUYXNrID0gZmlyc3RNZ0RhdGEuZ2V0TWFpblByb2coMCk7XHJcblxyXG4gICAgd2hpbGUgKG1haW5QcmcgIT0gbnVsbClcclxuICAgIHtcclxuICAgICAgYXdhaXQgbWFpblByZy5idWlsZFhNTChtZXNzYWdlKTtcclxuICAgICAgbWFpblByZyA9IGZpcnN0TWdEYXRhLmdldE5leHRNYWluUHJvZyhtYWluUHJnLmdldEN0bElkeCgpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuU2hvdWxkU2NyYW1ibGVBbmRVbnNjcmFtYmxlTWVzc2FnZXMpXHJcbiAgICB7XHJcbiAgICAgIGxldCBzY3JhbWJsZWRDaGFuZ2VzOiBzdHJpbmcgPSBTY3JhbWJsZXIuU2NyYW1ibGUobWVzc2FnZS5Ub1N0cmluZygpKTtcclxuICAgICAgbWVzc2FnZSA9IG5ldyBTdHJpbmdCdWlsZGVyKHNjcmFtYmxlZENoYW5nZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIG1lc3NhZ2UuSW5zZXJ0KDAsIFhNTENvbnN0YW50cy5NR19UQUdfT1BFTik7XHJcbiAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuTUdfVEFHX1hNTF9FTkRfVEFHR0VEKTtcclxuXHJcbiAgICByZXR1cm4gbWVzc2FnZS5Ub1N0cmluZygpO1xyXG4gIH1cclxuXHJcblxyXG4gIGFzeW5jIEV4ZWN1dGVfMShzZW5kaW5nSW5zdHJ1Y3Rpb246IENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24sIHNlc3Npb25TdGFnZTogQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1Nlc3Npb25TdGFnZSwgcmVzOiBJUmVzdWx0VmFsdWUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCByZXFCdWY6IHN0cmluZztcclxuICAgIGxldCBpc0luaXRpYWxDYWxsOiBib29sZWFuID0gc2Vzc2lvblN0YWdlID09PSBDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2Vzc2lvblN0YWdlLklOSVRJQUw7XHJcbiAgICBsZXQgZ2xvYmFsUGFyYW1zU3RyaW5nOiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICAgIGlmICh0aGlzLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbilcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGlmKExvZ2dlci5JbnN0YW5jZS5Mb2dMZXZlbCA9PSBMb2dnZXJfTG9nTGV2ZWxzLlJlcXVlc3RJbmZvICYmICFpc0luaXRpYWxDYWxsKVxyXG4gICAgICBhd2FpdCB0aGlzLlVwZGF0ZVJlcXVlc3RJbmZvKCk7XHJcblxyXG4gICAgaWYgKGlzSW5pdGlhbENhbGwpIHtcclxuICAgICAgbGV0IHZhbCA9IHRoaXMuUmVzdG9yZVNlc3Npb25SZUluaXRpYWxpemluZ0RhdGFGcm9tTG9jYWxTdG9yYWdlKENvbnN0SW50ZXJmYWNlLklTX1NFU1NJT05fUkVJTklUSUFMSVpJTkcpO1xyXG4gICAgICBpZiAodmFsID09PSAndHJ1ZScpIHtcclxuICAgICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5Jc1Nlc3Npb25SZUluaXRpYWxpemluZyA9ICh2YWwgPT09IFwidHJ1ZVwiKSA/IHRydWUgOiBmYWxzZTtcclxuICAgICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5sYXN0RXhjZXB0aW9uTWVzc2FnZSA9IHRoaXMuUmVzdG9yZVNlc3Npb25SZUluaXRpYWxpemluZ0RhdGFGcm9tTG9jYWxTdG9yYWdlKENvbnN0SW50ZXJmYWNlLkxBU1RfRVhDRVBUSU9OKTtcclxuICAgICAgICBsZXQgY3R4UmVtb3ZlZCA9IHRoaXMuUmVzdG9yZVNlc3Npb25SZUluaXRpYWxpemluZ0RhdGFGcm9tTG9jYWxTdG9yYWdlKENvbnN0SW50ZXJmYWNlLkNUWF9SRU1PVkVEX0ZST01fU1JWUik7XHJcblxyXG4gICAgICAgIGlmIChjdHhSZW1vdmVkICE9PSAnMScpIHtcclxuICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUVycm9yVG9Mb2coUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IubGFzdEV4Y2VwdGlvbk1lc3NhZ2UpO1xyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlVG9Mb2coXCJTZXNzaW9uIGlzIHJlaW5pdGlhbGl6aW5nLi4uXCIsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChzZW5kaW5nSW5zdHJ1Y3Rpb24gPT09IENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uTk9fVEFTS1NfT1JfQ09NTUFORFMpXHJcbiAgICAgIHJlcUJ1ZiA9IG51bGw7XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmVxQnVmID0gYXdhaXQgdGhpcy5QcmVwYXJlUmVxdWVzdChzZW5kaW5nSW5zdHJ1Y3Rpb24gPT09IENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uVEFTS1NfQU5EX0NPTU1BTkRTKTtcclxuXHJcbiAgICAgIGlmIChSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5Jc1Nlc3Npb25SZUluaXRpYWxpemluZyB8fCAhaXNJbml0aWFsQ2FsbCkge1xyXG4gICAgICAgIGxldCBjaGFuZ2VzOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgICAgICBsZXQgYnVmZmVyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgICAgICBpZiAoIVJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLklzU2Vzc2lvblJlSW5pdGlhbGl6aW5nKVxyXG4gICAgICAgICAgYnVmZmVyLkFwcGVuZChyZXFCdWYpO1xyXG5cclxuICAgICAgICAvLyBzZW5kIGFjdGl2aXR5IG1vbml0b3IgbG9ncyB0byB0aGUgc2VydmVyXHJcbiAgICAgICAgLy8gaWYgKHRoaXMuX2xvZ0FjY3VtdWxhdG9yICE9PSBudWxsICYmICF0aGlzLl9sb2dBY2N1bXVsYXRvci5FbXB0eSgpKVxyXG4gICAgICAgIC8vICAgYnVmZmVyLkFwcGVuZCh0aGlzLl9sb2dBY2N1bXVsYXRvci5SZWFkKCkpO1xyXG5cclxuICAgICAgICAvLyBzeW5jaHJvbml6ZSBjbGllbnQtc2lkZSBTZXRQYXJhbXMgYW5kIElOSVB1dCBkYXRhIHRvIHRoZSBzZXJ2ZXJcclxuICAgICAgICBpZiAoUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuSXNTZXNzaW9uUmVJbml0aWFsaXppbmcpXHJcbiAgICAgICAgICBnbG9iYWxQYXJhbXNTdHJpbmcgPSB0aGlzLlJlc3RvcmVTZXNzaW9uUmVJbml0aWFsaXppbmdEYXRhRnJvbUxvY2FsU3RvcmFnZShDb25zdEludGVyZmFjZS5HTE9CQUxfUEFSQU1fTElTVCk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgZ2xvYmFsUGFyYW1zU3RyaW5nID0gQWNjZXNzSGVscGVyLmdsb2JhbFBhcmFtcy5taXJyb3JUb1hNTCgpO1xyXG4gICAgICAgIGNoYW5nZXMuQXBwZW5kKGdsb2JhbFBhcmFtc1N0cmluZyk7XHJcbiAgICAgICAgY2hhbmdlcy5BcHBlbmQoQWNjZXNzSGVscGVyLmVudlBhcmFtc1RhYmxlLm1pcnJvclRvWE1MKCkpO1xyXG5cclxuICAgICAgICAvLyBJZiB0aGVyZSBpcyBzdHVmZiB0byBzeW5jaHJvbml6ZSwgd3JhcCBpdCwgc2NyYW1ibGUgaXQgYW5kIGFkZCB0aGUgTUdEQVRBIGZsYWdcclxuICAgICAgICBpZiAoY2hhbmdlcy5MZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBjaGFuZ2VzLkluc2VydCgwLCBcIjxcIiArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19FTlZfQ0hBTkdFUyArIFwiPlwiKTtcclxuICAgICAgICAgIGNoYW5nZXMuQXBwZW5kKFwiPC9cIiArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19FTlZfQ0hBTkdFUyArIFwiPlwiKTtcclxuXHJcbiAgICAgICAgICBpZiAoUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuU2hvdWxkU2NyYW1ibGVBbmRVbnNjcmFtYmxlTWVzc2FnZXMpIHtcclxuICAgICAgICAgICAgbGV0IHNjcmFtYmxlZENoYW5nZXM6IHN0cmluZyA9IFNjcmFtYmxlci5TY3JhbWJsZShjaGFuZ2VzLlRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICBjaGFuZ2VzID0gbmV3IFN0cmluZ0J1aWxkZXIoc2NyYW1ibGVkQ2hhbmdlcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjaGFuZ2VzLkluc2VydCgwLCBYTUxDb25zdGFudHMuTUdfVEFHX09QRU4pO1xyXG4gICAgICAgICAgY2hhbmdlcy5BcHBlbmQoWE1MQ29uc3RhbnRzLk1HX1RBR19YTUxfRU5EX1RBR0dFRCk7XHJcblxyXG4gICAgICAgICAgYnVmZmVyLkFwcGVuZChjaGFuZ2VzLlRvU3RyaW5nKCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmVxQnVmID0gYnVmZmVyLlRvU3RyaW5nKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVxdWVzdFN0YXR1czogUmVmUGFyYW08UmVxdWVzdFN0YXR1cz4gPSBuZXcgUmVmUGFyYW0oUmVxdWVzdFN0YXR1cy5IYW5kbGVkKTtcclxuICAgIGxldCByZXNwQnVmOiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICAgIGlmIChSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5Jc1Nlc3Npb25SZUluaXRpYWxpemluZyApIHtcclxuICAgICAgcmVxQnVmID0gIHJlcUJ1ZiArIHRoaXMuUmVzdG9yZVNlc3Npb25SZUluaXRpYWxpemluZ0RhdGFGcm9tTG9jYWxTdG9yYWdlKENvbnN0SW50ZXJmYWNlLk1BSU5fUFJPR19WSUVXKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlJlbW92ZWRDb250ZXh0RnJvbVNlcnZlcilcclxuICAgICAgcmVxdWVzdFN0YXR1cy52YWx1ZSA9IFJlcXVlc3RTdGF0dXMuUmV0cnk7IC8vdHJ5IHRvIHJlLXN0YXJ0IHNlc3Npb24gZmlyc3RcclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgaWYgKFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5SZW1vdmluZ0NvbnRleHRGcm9tU2VydmVyKVxyXG4gICAgICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5SZW1vdmVkQ29udGV4dEZyb21TZXJ2ZXIgPSB0cnVlO1xyXG5cclxuICAgICAgcmVzcEJ1ZiA9IGF3YWl0IHRoaXMuRGlzcGF0Y2hSZXF1ZXN0KHRoaXMuU2VydmVyVXJsLCByZXFCdWYsIHNlc3Npb25TdGFnZSwgcmVxdWVzdFN0YXR1cyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlcXVlc3RTdGF0dXMudmFsdWUgPT0gUmVxdWVzdFN0YXR1cy5SZXRyeSkge1xyXG4gICAgICBhd2FpdCB0aGlzLlJlU3RhcnRTZXNzaW9uKCk7XHJcbiAgICB9XHJcbiAgICBpZiAocmVzcEJ1ZiA9PSBudWxsKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgaWYgKGlzSW5pdGlhbENhbGwpXHJcbiAgICB7XHJcbiAgICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkluaXRpYWxVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcclxuICAgICAgaWYgKFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLklzU2Vzc2lvblJlSW5pdGlhbGl6aW5nKSB7XHJcbiAgICAgICAgbGV0IGRhdGFTdG9yYWdlID0gd2luZG93LmxvY2FsU3RvcmFnZTtcclxuICAgICAgICBkYXRhU3RvcmFnZS5yZW1vdmVJdGVtKENvbnN0SW50ZXJmYWNlLklTX1NFU1NJT05fUkVJTklUSUFMSVpJTkcpO1xyXG4gICAgICAgIGRhdGFTdG9yYWdlLnJlbW92ZUl0ZW0oQ29uc3RJbnRlcmZhY2UuTUFJTl9QUk9HX1ZJRVcpO1xyXG4gICAgICAgIGRhdGFTdG9yYWdlLnJlbW92ZUl0ZW0oQ29uc3RJbnRlcmZhY2UuR0xPQkFMX1BBUkFNX0xJU1QpO1xyXG4gICAgICAgIGRhdGFTdG9yYWdlLnJlbW92ZUl0ZW0oQ29uc3RJbnRlcmZhY2UuTEFTVF9FWENFUFRJT04pO1xyXG5cclxuXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBGbG93TW9uaXRvclF1ZXVlLkluc3RhbmNlLmVuYWJsZShmYWxzZSk7XHJcbiAgICBhd2FpdCB0aGlzLlByb2Nlc3NSZXNwb25zZShyZXNwQnVmLCBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuY3Vyck1nZElELCBudWxsLCByZXMpO1xyXG5cclxuICAgIGlmIChSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5Jc1Nlc3Npb25SZUluaXRpYWxpemluZykge1xyXG4gICAgICBBY2Nlc3NIZWxwZXIuZ2xvYmFsUGFyYW1zLlJlc3RvcmVHbG9iYWxQYXJhbXMoZ2xvYmFsUGFyYW1zU3RyaW5nKTtcclxuXHJcbiAgICAgIGxldCBkYXRhU3RvcmFnZSA9IHdpbmRvdy5sb2NhbFN0b3JhZ2U7XHJcbiAgICAgIGxldCBjdHhSZW1vdmVkID0gZGF0YVN0b3JhZ2UuZ2V0SXRlbShDb25zdEludGVyZmFjZS5DVFhfUkVNT1ZFRF9GUk9NX1NSVlIpO1xyXG5cclxuICAgICAgaWYgKGN0eFJlbW92ZWQgPT09IFwiMVwiKSB7XHJcblxyXG4gICAgICBFdmVudHNNYW5hZ2VyLkluc3RhbmNlLnJlc3RvcmVMYXN0U2F2ZWRSb3V0ZUV2ZW50RnJvbUxvY2FsU3RvcmFnZSgpO1xyXG5cclxuICAgICAgZGF0YVN0b3JhZ2UucmVtb3ZlSXRlbShDb25zdEludGVyZmFjZS5DVFhfUkVNT1ZFRF9GUk9NX1NSVlIpO1xyXG4gICAgICBkYXRhU3RvcmFnZS5yZW1vdmVJdGVtKENvbnN0SW50ZXJmYWNlLkxBU1RfUk9VVEVfRVZFTlQpO1xyXG4gICAgICBkYXRhU3RvcmFnZS5yZW1vdmVJdGVtKENvbnN0SW50ZXJmYWNlLkxBU1RfUk9VVEVfRVZFTlRfU1JDX1RTSyk7XHJcbiAgICAgIGRhdGFTdG9yYWdlLnJlbW92ZUl0ZW0oQ29uc3RJbnRlcmZhY2UuTEFTVF9ST1VURV9FVkVOVF9BUkdfTElTVCk7XHJcbiAgICB9XHJcblxyXG4gICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5Jc1Nlc3Npb25SZUluaXRpYWxpemluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy8gaWYgKGlzSW5pdGlhbENhbGwpIHtcclxuICAgIC8vICAgLy8gSWYgaXQgd2FzIGluaXRpYWwgY2FsbCwgd2Ugd2lsbCBzZW5kIGFsbCBwZW5kaW5nIGxvZ3MgKEZhaWxlZCBlYXJsaWVyIGV4ZWN1dGlvbiBzY2VuYXJpbylcclxuICAgIC8vICAgLy8gVGhleSB3aWxsIGJlIHNlbnQgaGVyZSwgYWZ0ZXIgZmlyc3QgcmVxdWVzdCBpcyBzZXJ2ZWQuXHJcbiAgICAvLyAgIGlmIChDbGllbnRNYW5hZ2VyLkluc3RhbmNlLmdldExvZ0NsaWVudFNlcXVlbmNlRm9yQWN0aXZpdHlNb25pdG9yKCkgJiYgQ2xpZW50TG9nQWNjdW11bGF0b3IuRXhpc3RpbmdMb2dzRm91bmQoKSkge1xyXG4gICAgLy8gICAgIGxldCBzdWNjZXNzOiBib29sZWFuID0gdGhpcy5TZW5kUGVuZGluZ0xvZ3NUb1NlcnZlcigpO1xyXG4gICAgLy9cclxuICAgIC8vICAgICAvLyBpZiB3ZSBoYXZlIHN1Y2Nlc3NmdWxseSBzZW50IHRoZSBwZW5kaW5nIGxvZ3MgZGVsZXRlIHRoZW1cclxuICAgIC8vICAgICBpZiAoc3VjY2Vzcykge1xyXG4gICAgLy8gICAgICAgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuRGVsZXRlUGVuZGluZ0xvZ3MoKTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH1cclxuICAgIC8vIGVsc2UgaWYgKHRoaXMuX2xvZ0FjY3VtdWxhdG9yICE9PSBudWxsICYmICF0aGlzLl9sb2dBY2N1bXVsYXRvci5FbXB0eSgpKSB7XHJcbiAgICAvLyAgIC8vIEFjY3VtdWxhdGVkIGxvZ3Mgd2VyZSBzZW50LCBzbyByZXNldCAoZGVsZXRlKSB0aGVtIG5vd1xyXG4gICAgLy8gICB0aGlzLl9sb2dBY2N1bXVsYXRvci5SZXNldCgpO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8vIHJlZnJlc2ggdGhlIGRpc3BsYXlzXHJcbiAgICBpZiAoc2VuZGluZ0luc3RydWN0aW9uID09PSBDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLlRBU0tTX0FORF9DT01NQU5EUykge1xyXG4gICAgICBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuc3RhcnRUYXNrc0l0ZXJhdGlvbigpO1xyXG4gICAgICBsZXQgdGFzazogVGFza0Jhc2U7XHJcbiAgICAgIHdoaWxlICgodGFzayA9IDxUYXNrQmFzZT5BY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZ2V0TmV4dFRhc2soKSkgIT09IG51bGwpIHtcclxuICAgICAgICBsZXQgZGF0YVZpZXdXYXNSZXRyaWV2ZWQ6IGJvb2xlYW4gPSB0YXNrLkRhdGFWaWV3V2FzUmV0cmlldmVkO1xyXG4gICAgICAgIGlmIChkYXRhVmlld1dhc1JldHJpZXZlZCkge1xyXG4gICAgICAgICAgYXdhaXQgdGFzay5SZWZyZXNoRGlzcGxheSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChpc0luaXRpYWxDYWxsKVxyXG4gICAgICBTZXJ2ZXJDb25maWcuSW5zdGFuY2Uuc2V0R2xvYmFsUGFyYW1zKG51bGwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PnNlbmQgJ3JlcUJ1ZicgdG8gJ3VybCc7IHJlY2VpdmUgYSByZXNwb25zZS5cclxuICAvLy8gRm9yIE5vcm1hbC9Jbml0aWFsQ2FsbCByZXF1ZXN0cywgdGhlIHVybCBwb2ludHMgdG8gdGhlIHdlYi1yZXF1ZXN0ZXIuXHJcbiAgLy8vIFRoZSBvdGhlciBwYXJhbWV0ZXJzIGFuZCBkYXRhIGdvZXMgYXMgdGhlIGVuY29kZWQgYm9keS5cclxuICAvLy8gVGhpcyBtZWFucyB0aGF0IGl0IGlzIGEgUE9TVCByZXF1ZXN0LlxyXG4gIC8vLyBPbiB0aGUgb3RoZXIgaGFuZCwgSGFuZFNoYWtlIHJlcXVlc3QgaXMgYSBHRVQgcmVxdWVzdCBhbmQgc28gdGhlIHBhcmFtZXRlcnMgYXJlXHJcbiAgLy8vIHNlbnQgaW4gdGhlIFVSTCBpdHNlbGYuIEluIHRoaXMgY2FzZSwgZW5jb2RlZEJvZHkgaGFzIHRvIGJlIG51bGwuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ1cmxcIj5VUkwgdG8gYmUgYWNjZXNzZWQuPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZXFCdWZcIj5kYXRhIHRvIGJlIHNlbnQgdG8gdGhlIHVybDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic2Vzc2lvblN0YWdlXCI+SEFORFNIQUtFIC8gSU5JVElBTCAvIE5PUk1BTC48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5yZXNwb25zZTwvcmV0dXJucz5cclxuICAgcHJpdmF0ZSBhc3luYyBEaXNwYXRjaFJlcXVlc3QodXJsOiBzdHJpbmcsIHJlcUJ1Zjogc3RyaW5nLCBzZXNzaW9uU3RhZ2U6IENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZXNzaW9uU3RhZ2UsIHJlcXVlc3RTdGF0dXM6IFJlZlBhcmFtPFJlcXVlc3RTdGF0dXM+KTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGxldCByZXNwb25zZTogc3RyaW5nID0gbnVsbDtcclxuICAgIGxldCBlbmNvZGVkQm9keTogc3RyaW5nID0gbnVsbDtcclxuICAgIHJlcXVlc3RTdGF0dXMudmFsdWUgPSBSZXF1ZXN0U3RhdHVzLkhhbmRsZWQ7XHJcblxyXG4gICAgaWYgKHVybCA9PT0gbnVsbCkge1xyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJpbiBzZW5kTXNnVG9TcnZyKCkgdW5rbm93biBzZXJ2ZXJcIik7XHJcbiAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2Vzc2lvblN0YWdlICE9PSBDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2Vzc2lvblN0YWdlLkhBTkRTSEFLRSkge1xyXG4gICAgICBsZXQgdXJsU3VmZml4OiBzdHJpbmcgPSB0aGlzLkJ1aWxkVXJsU3VmZml4KHJlcUJ1ZiAhPT0gbnVsbCwgc2Vzc2lvblN0YWdlID09PSBDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2Vzc2lvblN0YWdlLklOSVRJQUwpO1xyXG4gICAgICBsZXQgcmVxQnVmRW5jb2RlZDogc3RyaW5nID0gSHR0cFV0aWxpdHkuVXJsRW5jb2RlKHJlcUJ1ZiwgRW5jb2RpbmcuVVRGOCk7XHJcbiAgICAgIGVuY29kZWRCb2R5ID0gdXJsU3VmZml4ICsgcmVxQnVmRW5jb2RlZDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgIHRyeSB7XHJcbiAgICAgICBpZiAoTG9nZ2VyLkluc3RhbmNlLlNob3VsZExvZ0V4dGVuZGVkU2VydmVyUmVsYXRlZE1lc3NhZ2VzKCkpXHJcbiAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVNlcnZlck1lc3NhZ2VzVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJNRVNTQUdFIFRPIFNFUlZFUjpcXG4gVVJMOiB7MH1cXG4gQk9EWTogezF9XCIsIHVybCwgZW5jb2RlZEJvZHkpKTtcclxuXHJcbiAgICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMuRXhlY3V0ZVJlcXVlc3QodXJsLCBlbmNvZGVkQm9keSk7XHJcblxyXG4gICAgICAgLyogcmVtb3ZlIHRoZSB1bndhbnRlZCBkYXRhIGJlZm9yZSB0aGUgTUdEQVRBIHRhZyAqL1xyXG4gICAgICAgaWYgKCFyZXNwb25zZS50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoXCI8SFRNTFwiKSkge1xyXG4gICAgICAgICBsZXQgc3RhcnRJZHg6IG51bWJlciA9IHJlc3BvbnNlLmluZGV4T2YoXCI8eG1sIGlkPVxcXCJNR0RBVEFcXFwiPlwiKTtcclxuICAgICAgICAgaWYgKHN0YXJ0SWR4ID4gMClcclxuICAgICAgICAgICByZXNwb25zZSA9IHJlc3BvbnNlLnN1YnN0cihzdGFydElkeCk7XHJcbiAgICAgICB9XHJcblxyXG4gICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlU2VydmVyTWVzc2FnZXNUb0xvZyhcIk1FU1NBR0UgRlJPTSBTRVJWRVI6IFwiICsgcmVzcG9uc2UpO1xyXG5cclxuICAgICAgIC8vIGhhbmRzaGFrZSByZXF1ZXN0cyBhcmUgYWx3YXlzIHNjcmFtYmxlZCAodGhlIHNjcmFtYmxpbmcgY2FuIGJlIGRpc2FibGVkIHN0YXJ0aW5nIGZyb20gdGhlIDNyZCByZXF1ZXN0KS5cclxuICAgICAgIGlmIChzZXNzaW9uU3RhZ2UgPT09IENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZXNzaW9uU3RhZ2UuSEFORFNIQUtFIHx8XHJcbiAgICAgICAgIChyZXNwb25zZS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuU2hvdWxkU2NyYW1ibGVBbmRVbnNjcmFtYmxlTWVzc2FnZXMgJiYgcmVzcG9uc2UgIT09IFwiPHhtbCBpZD1cXFwiTUdEQVRBXFxcIj5cXG48L3htbD5cIikpIHtcclxuICAgICAgICAgaWYgKHNlc3Npb25TdGFnZSA9PT0gQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1Nlc3Npb25TdGFnZS5IQU5EU0hBS0UpIHtcclxuICAgICAgICAgICAvLyBoYW5kc2hha2UgcmVxdWVzdHMgYXJlIGFsd2F5cyBzY3JhbWJsZWQuXHJcbiAgICAgICAgICAgRGVidWcuQXNzZXJ0KHJlc3BvbnNlLmxlbmd0aCA+IDAgJiYgcmVzcG9uc2VbMF0gIT09ICc8Jyk7XHJcbiAgICAgICAgIH1cclxuICAgICAgICAgcmVzcG9uc2UgPSBDb21tYW5kc1Byb2Nlc3NvckJhc2UuVW5TY3JhbWJsZShyZXNwb25zZSk7XHJcbiAgICAgICB9XHJcblxyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcIk1FU1NBR0UgRlJPTSBTRVJWRVI6IChzaXplID0gXCIgKyByZXNwb25zZS5sZW5ndGggKyBcIilcIiArIE9TRW52aXJvbm1lbnQuRW9sU2VxICsgcmVzcG9uc2UpO1xyXG5cclxuICAgICAgdGhpcy5fbGFzdFJlcXVlc3RUaW1lID0gTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKTtcclxuICAgICB9XHJcbiAgICAgY2F0Y2ggKGV4KVxyXG4gICAgIHtcclxuICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFNlcnZlckVycm9yKSB7XHJcbiAgICAgICAgIHJlcXVlc3RTdGF0dXMudmFsdWUgPSBSZXF1ZXN0U3RhdHVzLkFib3J0O1xyXG5cclxuXHJcbiAgICAgICAgIGlmIChzZXNzaW9uU3RhZ2UgPT0gQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1Nlc3Npb25TdGFnZS5OT1JNQUwpIHtcclxuICAgICAgICAgICAvLyBJZiBjb250ZXh0IGlzIG5vdCBmb3VuZCBhdCBzZXJ2ZXIgZHVlIHRvIGNyYXNoIG9yIHRocmVhZCBpcyBhYm9ydGVkIGR1ZSB0byBjcmFzaCxcclxuICAgICAgICAgICAvLyBjaGVjayBXZWJDbGllbnRSZWluaXRTZXNzaW9uLiBiYXNlZCBvbiB0aGUgZmxhZywgcmUtaW5pdGlhbGl6aW5nIHJlcXVlc3Qgc2hvdWxkIGJlIHNlbnQgdG8gY3JlYXRlXHJcbiAgICAgICAgICAgLy8gYSBuZXcgY29udGV4dCBhbmQgaXQgc2hvdWxkIGJlIGV4ZWN1dGVkIGluIHRoaXMgbmV3IGNvbnRleHQuXHJcbiAgICAgICAgICAgLy8gc28sIHNldCB0aGUgUmVxdWVzdFN0YXR1cyB0byBSZXRyeSBzbyB0aGF0IHRoZSBjbGllbnQgd2lsbCByZXNlbmQgcmVxdWVzdC5cclxuICAgICAgICAgICBpZiAoZXguR2V0Q29kZSgpID09IFNlcnZlckVycm9yLkVSUl9DVFhfTk9UX0ZPVU5EIHx8IGV4LkdldENvZGUoKSA9PSBTZXJ2ZXJFcnJvci5FUlJfVEhSRUFEX0FCT1JURUQpIHtcclxuICAgICAgICAgICAgIGlmIChSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUmVtb3ZlZENvbnRleHRGcm9tU2VydmVyKSB7XHJcbiAgICAgICAgICAgICAgIHJlcXVlc3RTdGF0dXMudmFsdWUgPSBSZXF1ZXN0U3RhdHVzLlJldHJ5O1xyXG4gICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgIHN3aXRjaCAoRW52aXJvbm1lbnQuSW5zdGFuY2UuZ2V0V2ViQ2xpZW50UmVpbml0U2Vzc2lvbigpKSB7XHJcbiAgICAgICAgICAgICAgICAgY2FzZSAnWScgOlxyXG4gICAgICAgICAgICAgICAgICAgcmVxdWVzdFN0YXR1cy52YWx1ZSA9IFJlcXVlc3RTdGF0dXMuUmV0cnk7XHJcbiAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICBjYXNlICdBJzpcclxuICAgICAgICAgICAgICAgICAgIGxldCByZXR2YWwgPSBhd2FpdCBHVUlNYW5hZ2VyLkluc3RhbmNlLk1lc3NhZ2VCb3goXCJFcnJvclwiLCBcIlVua25vd24gZXJyb3Igb2NjdXJyZWQgYXQgc2VydmVyLXNpZGUuXCIgK1xyXG4gICAgICAgICAgICAgICAgICAgICBcIiBXb3VsZCB5b3UgbGlrZSB0byByZWluaXRpYWxpemUgdGhlIHNlc3Npb24/XCIsIFN0eWxlcy5NU0dCT1hfQlVUVE9OX1lFU19OTyk7XHJcbiAgICAgICAgICAgICAgICAgICByZXF1ZXN0U3RhdHVzLnZhbHVlID0gKHJldHZhbCA9PSBTdHlsZXMuTVNHQk9YX1JFU1VMVF9ZRVMpID8gUmVxdWVzdFN0YXR1cy5SZXRyeSA6IFJlcXVlc3RTdGF0dXMuQWJvcnQ7XHJcbiAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICBjYXNlICdOJzpcclxuICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgcmVxdWVzdFN0YXR1cy52YWx1ZSA9IFJlcXVlc3RTdGF0dXMuQWJvcnQ7XHJcbiAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgaWYgKHJlcXVlc3RTdGF0dXMudmFsdWUgPT0gUmVxdWVzdFN0YXR1cy5BYm9ydClcclxuICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgRW52aXJvbm1lbnQuSW5zdGFuY2Uuc2V0V2ViQ2xpZW50UmVpbml0U2Vzc2lvbignTicpO1xyXG4gICAgICAgICAgICAgICB0aHJvdyAgZXg7XHJcbiAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgbGV0IGVyckZvckNvbnNvbGUgPSBTdHJVdGlsLmdldENvbnNvbGVFcm9yU3RyaW5nKGV4LkdldE1lc3NhZ2UoKSk7XHJcbiAgICAgICAgICAgICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLmxhc3RFeGNlcHRpb25NZXNzYWdlID0gXCJFeGNlcHRpb24gT2NjdXJlZCBhdCBzZXJ2ZXIgc2lkZSA6IFwiICsgZXguR2V0Q29kZSgpLnRvU3RyaW5nKCkgKyBcIiA6IFwiICsgZXJyRm9yQ29uc29sZTtcclxuICAgICAgICAgICAgICAgY29uc29sZS5sb2coUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IubGFzdEV4Y2VwdGlvbk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgfVxyXG4gICAgICAgICB9XHJcbiAgICAgICB9XHJcbiAgICAgICAvL0lmIGFueSBpdGVtcyBhcmUgc3RvcmVkIG9uIGxvY2FsIHN0b3JhZ2UgY2xlYXIgaXQgbm93IGFzIHNlc3Npb24gY2Fubm90IGNvbnRpbnVlZC5cclxuICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UuY2xlYXIoKTtcclxuICAgICAgIHRocm93IGV4O1xyXG4gICAgIH1cclxuICAgIHJldHVybiByZXNwb25zZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gQ2hlY2tzIHRoZSByZXNwb25zZSBzdHJpbmcsIHRocm93cyBhbiBlcnJvciBpZiB0aGUgcmVzcG9uc2Ugc3RyaW5nIGNvbnRhaW5zXHJcbiAgLy8vIGFuIHhtbC9odG1sIGVycm9yPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlc3BvbnNlXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIEhhbmRsZUVycm9yUmVzcG9uc2UocmVzcG9uc2U6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gZXJyb3IgcmVzcG9uc2VzIGFyZSBhbHdheXMgc2NyYW1ibGVkIGJ5IHRoZSB3ZWIgc2VydmVyLlxyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTZXJ2ZXJNZXNzYWdlc1RvTG9nKFwiTUVTU0FHRSBGUk9NIFNFUlZFUjogXCIgKyByZXNwb25zZSk7XHJcbiAgICAgIHJlc3BvbnNlID0gQ29tbWFuZHNQcm9jZXNzb3JCYXNlLlVuU2NyYW1ibGUocmVzcG9uc2UpO1xyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTZXJ2ZXJNZXNzYWdlc1RvTG9nKFwiTUVTU0FHRSBGUk9NIFNFUlZFUjogXCIgKyBTdHJVdGlsLmdldENvbnNvbGVFcm9yU3RyaW5nKHJlc3BvbnNlKSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXgpIHtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVzcG9uc2Uuc3RhcnRzV2l0aChcIjx4bWxlcnJcIikpIHtcclxuICAgICAgICBsZXQgZXJyb3JNZXNzYWdlWG1sOiBFcnJvck1lc3NhZ2VYbWwgPSBuZXcgRXJyb3JNZXNzYWdlWG1sKHJlc3BvbnNlLCB0aGlzLl9sYXN0UmVxdWVzdFRpbWUsIEFjY2Vzc0hlbHBlci5lbnZpcm9ubWVudC5nZXRDb250ZXh0SW5hY3Rpdml0eVRpbWVvdXQoKSk7XHJcbiAgICAgIHRocm93IG5ldyBTZXJ2ZXJFcnJvcihlcnJvck1lc3NhZ2VYbWwuR2V0TWVzc2FnZSgpLCBlcnJvck1lc3NhZ2VYbWwuR2V0Q29kZSgpKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHJlc3BvbnNlLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aChcIjxIVE1MXCIpKSB7XHJcbiAgICAgIHRocm93IG5ldyBTZXJ2ZXJFcnJvcihyZXNwb25zZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+c2VuZCAnZW5jb2RlZEJvZHknIHRvICd1cmwnIGFuZCByZWNlaXZlIGEgcmVzcG9uc2UuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ1cmxcIj5VUkwgdG8gYmUgYWNjZXNzZWQuPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJlbmNvZGVkQm9keVwiPkluIGNhc2Ugb2YgUE9TVCwgY29udGVudCB0byBiZSBzZW50IHRvIHNlcnZlci4gRm9yIG90aGVyIG1ldGhvZHMsIG51bGwuPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+dGhlIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlcjwvcmV0dXJucz5cclxuIHByaXZhdGUgYXN5bmMgRXhlY3V0ZVJlcXVlc3QodXJsOiBzdHJpbmcsIGVuY29kZWRCb2R5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuR2V0Q29udGVudCh1cmwsIGZhbHNlLCBlbmNvZGVkQm9keSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBHZXRDb250ZW50KHJlcXVlc3RlZFVSTDogc3RyaW5nLCB1c2VDYWNoZTogYm9vbGVhbiwgcmVxdWVzdENvbnRlbnQ/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgaWYgKGlzVW5kZWZpbmVkKHJlcXVlc3RDb250ZW50KSlcclxuICAgICAgcmVxdWVzdENvbnRlbnQgPSBudWxsO1xyXG5cclxuICAgIGxldCByZXNwb25zZVN0cjogc3RyaW5nO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIGlmIHJlbGF0aXZlLCBwcmVmaXggd2l0aCB0aGUgJ3Byb3RvY29sOi8vc2VydmVyLycgZnJvbSB3aGljaCB0aGUgcmljaC1jbGllbnQgd2FzIGFjdGl2YXRlZFxyXG4gICAgICBpZiAocmVxdWVzdGVkVVJMLnN0YXJ0c1dpdGgoXCIvXCIpKVxyXG4gICAgICAgIHJlcXVlc3RlZFVSTCA9IFNlcnZlckNvbmZpZy5JbnN0YW5jZS5nZXRQcm90b2NvbCgpICsgXCI6Ly9cIiArIFNlcnZlckNvbmZpZy5JbnN0YW5jZS5nZXRTZXJ2ZXIoKSArIHJlcXVlc3RlZFVSTDtcclxuXHJcbiAgICAgIHZhciBzcGlubmVyVGltZXIgPSB0aW1lcig1MCwgNTApO1xyXG4gICAgICB2YXIgc3Bpbm5lclRpbWVyU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gPSBzcGlubmVyVGltZXIuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5DaGVja0FuZFNob3dTcGlubmVyKHRydWUpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGxldCBpc0Vycm9yOiBSZWZQYXJhbTxib29sZWFuPiA9IG5ldyBSZWZQYXJhbShmYWxzZSk7XHJcblxyXG4gICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5yZXF1ZXN0TnVtYmVyKys7IC8vIGluY3JlYXNlIHRoZSBubyBvZiByZXF1ZXN0c1xyXG4gICAgICByZXNwb25zZVN0ciA9IGF3YWl0IEh0dHBNYW5hZ2VyLkdldEluc3RhbmNlKCkuR2V0Q29udGVudChyZXF1ZXN0ZWRVUkwsIHJlcXVlc3RDb250ZW50LCB1c2VDYWNoZSwgaXNFcnJvcik7XHJcbiAgICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLnRvdGFsUmVzcG9uc2VEYXRhTGVuZ3RoICs9IFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLnRvdGFsUmVzcG9uc2VEYXRhTGVuZ3RoICsgKCFpc051bGxPclVuZGVmaW5lZChyZXNwb25zZVN0cikgPyByZXNwb25zZVN0ci5sZW5ndGggOiAwKTtcclxuXHJcbiAgICAgIHNwaW5uZXJUaW1lclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICBzcGlubmVyVGltZXJTdWJzY3JpcHRpb24gPSBudWxsO1xyXG5cclxuICAgICAgaWYgKGlzRXJyb3IudmFsdWUpIHtcclxuICAgICAgICB0aGlzLkhhbmRsZUVycm9yUmVzcG9uc2UocmVzcG9uc2VTdHIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgLy8gZG9uJ3Qgd3JpdGUgc2VydmVyIGVycm9yIHRvIGxvZyB3aGVuIHRoZSBsb2cgbGV2ZWwgaXMgYmFzaWNcclxuICAgICAgaWYgKCEoZXggaW5zdGFuY2VvZiBTZXJ2ZXJFcnJvcikgfHwgTG9nZ2VyLkluc3RhbmNlLkxvZ0xldmVsICE9PSBMb2dnZXJfTG9nTGV2ZWxzLkJhc2ljKSB7XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2coZXgsIE5TdHJpbmcuRm9ybWF0KFwicmVxdWVzdGVkIFVSTCA9IFxcXCJ7MH1cXFwiXCIsIHJlcXVlc3RlZFVSTCkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyB0aGUgZXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24gYW5kIHRoZSBjYWxsZXJzIHNob3VsZCBoYW5kbGUgaXQuXHJcbiAgICAgIGlmICghKGV4IGluc3RhbmNlb2YgU2VydmVyRXJyb3IpKSB7XHJcbiAgICAgICAgZXggPSBuZXcgU2VydmVyRXJyb3IoZXguTWVzc2FnZSwgZXguSW5uZXJFeGNlcHRpb24gPyBleC5Jbm5lckV4Y2VwdGlvbiA6IGV4KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhyb3cgZXg7XHJcbiAgICB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgaWYgKHNwaW5uZXJUaW1lclN1YnNjcmlwdGlvbiAhPSBudWxsKVxyXG4gICAgICAgIHNwaW5uZXJUaW1lclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXNwb25zZVN0cjtcclxuICB9XHJcblxyXG5cclxuICBDbGllbnRBY3RpdmF0ZWQoKSB7XHJcblxyXG4gICAgLy8gbG9nIHRoZSB2YWx1ZXMgYXMgY2xpZW50IGlzIGFjdGl2ZSBhZ2FpblxyXG4gICAgLy8gVE9ETyAtIGZvcm1hdHRpbmdcclxuICAgIC8vIGNvbnNvbGUubG9nKCdMb2dnaW5nIFN1bW1hcnkgJyArICdcXG4nICtcclxuICAgIC8vICAgJ1RvdGFsIG51bWJlciByZXF1ZXN0cyA6ICcgKyBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5yZXF1ZXN0TnVtYmVyICsgJ1xcbicgK1xyXG4gICAgLy8gICAnVG90YWwgdGltZSBuZWVkZWQgZm9yIGh0dHAgcmVxdWVzdHMgOiAnICsgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IudG90YWxUaW1lRm9ySFRUUFJlcXVlc3RzICsgJyBtcyAnICsgJ1xcbicgK1xyXG4gICAgLy8gICAnVG90YWwgdGltZSBuZWVkZWQgZm9yIGNsaWVudCB0byBnZXQgYWN0aXZlIDogJyArIGV4ZWN1dGlvblRpbWUgKyAnIG1zICcgKyAnXFxuJ1xyXG4gICAgLy8gKTtcclxuICAgIC8vXHJcbiAgICAvLyAvLyBUT0RPIC0gbW92ZSBpdCB0byBtZXRob2RcclxuICAgIC8vIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLnJlcXVlc3ROdW1iZXIgPSAwO1xyXG4gICAgLy8gUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IudG90YWxUaW1lRm9ySFRUUFJlcXVlc3RzID0gMDtcclxuICAgIC8vIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLnRvdGFsUmVxdWVzdERhdGFMZW5ndGggPSAwO1xyXG4gICAgLy8gUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IudG90YWxSZXNwb25zZURhdGFMZW5ndGggPSAwO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBXaGVuIExvZ0NsaWVudFNlcXVlbmNlRm9yQWN0aXZpdHlNb25pdG9yID0gWSB3ZSB3aWxsIGJlIGtlZXBpbmcgdGhlIGxvZ3MgaW4gZmlsZSBhbmQgc2VuZCB0aGUgZmlsZSB3aXRoIG5leHRcclxuICAvLy8gc2VydmVyIGFjY2Vzcy4gSWYgY2xpZW50IGlzIGFibm9ybWFsbHkgdGVybWluYXRlZCB0aGVuIHRoZXJlIGNhbiBiZSAxIG9yIG1vcmUgZmlsZXMgY29udGFpbmluZyBsb2dzIHNpbmNlXHJcbiAgLy8vIGxhc3Qgc2VydmVyIGFjY2Vzcy5Ob3cgdGhlc2UgbG9ncyB3aWxsIGJlIHNlbnQgdG8gc2VydmVyLCB3aGVuIG5leHQgdGltZSBSQyBwcm9ncmFtIGlzIGV4ZWN1dGVkLC48L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBJZiBzZW5kaW5nIHdhcyBzdWNjZXNzZnVsPC9yZXR1cm5zPlxyXG4gIC8vICAgVE9ETzogSGFuZGxlIHBlbmRpbmcgbG9ncy5cclxuICAvLyBwcml2YXRlIFNlbmRQZW5kaW5nTG9nc1RvU2VydmVyKCk6IGJvb2xlYW4ge1xyXG4gIC8vICAgbGV0IHN1Y2Nlc3M6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIC8vXHJcbiAgLy8gICBUaGUgcGVuZGluZyBsb2dzIGNhbm5vdCBiZSByZWFkIGZyb20gdGhlIGZpbGUgc3lzdGVtIHNpbmNlIFdlYkNsaWVudCBkb2Vzbid0IGhhdmUgYWNjZXNzIHRvIHRoYXQuXHJcbiAgLy8gICBNYXliZSwgdGhlIGxvZ3Mgc2hvdWxkIGJlIHdyaXR0ZW4gaW50byBMb2NhbFN0b3JhZ2UgYWQgcmVhZCBmcm9tIHRoZXJlLlxyXG4gIC8vXHJcbiAgLy8gICBsZXQgc3RyaW5nQnVpbGRlcjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKDEwMDApO1xyXG4gIC8vICAgbGV0IGZsb3dNb25pdG9yOiBGbG93TW9uaXRvclF1ZXVlID0gRmxvd01vbml0b3JRdWV1ZS5JbnN0YW5jZTtcclxuICAvL1xyXG4gIC8vICAgLy8gR2V0IGl0ZXJhdG9yIHRvIG5hbWVzIG9mIGxvZyBmaWxlcy5cclxuICAvLyAgIGxldCBlbnVtZXJhdG9yOiBJRW51bWVyYXRvcjxzdHJpbmc+ID0gQ2xpZW50TG9nQWNjdW11bGF0b3IuRXhpc3RpbmdMb2dJdGVyYXRvcigpO1xyXG4gIC8vXHJcbiAgLy8gICAvLyB3aGlsZSB0aGVyZSBhcmUgbW9yZSBmaWxlc1xyXG4gIC8vICAgd2hpbGUgKGVudW1lcmF0b3IuTW92ZU5leHQoKSkge1xyXG4gIC8vICAgICAvLyBUYWtlIG5leHQgZmlsZSBuYW1lXHJcbiAgLy8gICAgIGxldCBsb2dOYW1lOiBzdHJpbmcgPSBlbnVtZXJhdG9yLkN1cnJlbnQ7XHJcbiAgLy8gICAgIC8vIFByZXBhcmUgdGhlIGhlYWRlciBsaW5lIChDbGllbnQgbG9nIGZpbGUgOiA8Q29udGV4dCA6IFhYWFhYWD4pIGFuZCBhZGQgaXQgdG9cclxuICAvLyAgICAgLy8gZmxvdyBtb25pdG9yIGJ1aWxkIG1vbml0b3IgbWVzc2FnZVxyXG4gIC8vICAgICBsZXQgaGVhZGVyTGluZTogc3RyaW5nID0gQ2xpZW50TG9nQWNjdW11bGF0b3IuQnVpbGRMb2dIZWFkZXJMaW5lKGxvZ05hbWUpO1xyXG4gIC8vICAgICBmbG93TW9uaXRvci5hZGRGbG93VmVyaWZ5SW5mbyhoZWFkZXJMaW5lKTtcclxuICAvLyAgICAgbGV0IGxvZ0N0eEJ1ZjogU3RyaW5nQnVpbGRlciA9IFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkJ1aWxkTW9uaXRvck1lc3NhZ2UoKTtcclxuICAvL1xyXG4gIC8vICAgICBsZXQgZmlsZUNvbnRlbnRzOiBzdHJpbmcgPSBIYW5kbGVGaWxlcy5yZWFkVG9TdHJpbmcobG9nTmFtZSk7XHJcbiAgLy8gICAgIGxvZ0N0eEJ1Zi5BcHBlbmQoZmlsZUNvbnRlbnRzKTtcclxuICAvLyAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQobG9nQ3R4QnVmLlRvU3RyaW5nKCkpO1xyXG4gIC8vICAgfVxyXG4gIC8vXHJcbiAgLy8gICBsZXQgcmVzcEJ1Zjogc3RyaW5nID0gbnVsbDtcclxuICAvL1xyXG4gIC8vICAgdHJ5IHtcclxuICAvLyAgICAgcmVzcEJ1ZiA9IHRoaXMuRGlzcGF0Y2hSZXF1ZXN0KHRoaXMuU2VydmVyVXJsLCBzdHJpbmdCdWlsZGVyLlRvU3RyaW5nKCksIENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZXNzaW9uU3RhZ2UuTk9STUFMKTtcclxuICAvLyAgIH1cclxuICAvLyAgIGNhdGNoIChleCkge1xyXG4gIC8vICAgICAvLyBkbyBub3RoaW5nLiBpZiBzZW5kaW5nIGxvZyBmYWlscywgdGhlcmUgaXMgbm8gaGFybS5cclxuICAvLyAgIH1cclxuICAvL1xyXG4gIC8vICAgaWYgKHJlc3BCdWYgPT09IG51bGwpIHtcclxuICAvLyAgICAgc3VjY2VzcyA9IGZhbHNlO1xyXG4gIC8vICAgfVxyXG4gIC8vXHJcbiAgLy8gICByZXR1cm4gc3VjY2VzcztcclxuICAvLyB9XHJcblxyXG4gIC8vIFRPRE86IEhhbmRsZSBwZW5kaW5nIGxvZ3MuXHJcbiAgLy8gcHJpdmF0ZSBzdGF0aWMgRGVsZXRlUGVuZGluZ0xvZ3MoKTogdm9pZCB7XHJcbiAgLy8gICBsZXQgZW51bWVyYXRvcjogSUVudW1lcmF0b3IgPSBDbGllbnRMb2dBY2N1bXVsYXRvci5FeGlzdGluZ0xvZ0l0ZXJhdG9yKCk7XHJcbiAgLy8gICB3aGlsZSAoZW51bWVyYXRvci5Nb3ZlTmV4dCgpKSB7XHJcbiAgLy8gICAgIGxldCBmaWxlbmFtZTogc3RyaW5nID0gPHN0cmluZz5lbnVtZXJhdG9yLkN1cnJlbnQ7XHJcbiAgLy8gICAgIEhhbmRsZUZpbGVzLmRlbGV0ZUZpbGUoZmlsZW5hbWUpO1xyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBnZXQgdGhlIHN1ZmZpeCBvZiB0aGUgVVJMIHRvIGJlIHNlbnQgdG8gdGhlIHNlcnZlci4gVGhpcyBpbmNsdWRlcyB0aGUgQ1RYLCBTRVNTSU9OIGFuZCBEQVRBIHBhcmFtZXRlcnMuPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImhhc0NvbnRlbnRcIj5pZiB0cnVlLCB0aGUgSFRUUCBEQVRBIHBhcmFtZXRlciBjb250YWlucyBzb21ldGhpbmcuPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc0luaXRpYWxDYWxsXCI+aWYgdHJ1ZSB0aGVuIHRoZSBnZW5lcmF0ZWQgc3VmZml4IGhhcyBubyBzcGVjaWZpYyBjb250ZXh0IGRhdGE8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIFVSTCBzdWZmaXggKGkuZS4gXCJDVFg9Li4uJlNFU1NJT049Li4uJkRBVEE9XCI8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBCdWlsZFVybFN1ZmZpeChoYXNDb250ZW50OiBib29sZWFuLCBpc0luaXRpYWxDYWxsOiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIGxldCBwcmVmaXg6IHN0cmluZyA9IENvbnN0SW50ZXJmYWNlLlJDX0lORElDQVRJT04gKyBDb25zdEludGVyZmFjZS5SQ19UT0tFTl9DVFhfSUQgKyBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuQ29udGV4dElEO1xyXG5cclxuICAgIC8vIEFwcGVuZCBzZXNzaW9uIGlkIGluIHVybCBvbmx5IHdoZW4gaXQgaXMgbm90IG51bGwgb3IgZW1wdHlcclxuICAgIC8vIE5PVEU6IHNlc3Npb24gaWQgd2lsbCBiZSBzZW5kIGJ5IHNlcnZlciBvbmx5IGZvciBHUyBhcyBtaWRkbGV3YXJlXHJcbiAgICAvLyAgICAgICBhbmQgd2hlbiBzZXBlY2lhbCBmbGFnIChTcGVjaWFsUklBR2VuZXJhdGVBbmRWYWxpZGF0ZVNlc3Npb25JRCkgaXMgb25cclxuICAgIC8vICAgICAgIHNvIHNlc3Npb24gaWQgd2lsbCBiZSBudWxsIGZvciBicm9rZXIgbWlkZGxld2FyZSBhbmQgd2hlbiBzcGVjaWFsIGZsYWcgaXMgT0ZGLlxyXG4gICAgaWYgKCFpc051bGxPclVuZGVmaW5lZCh0aGlzLlNlc3Npb25JZCkpXHJcbiAgICAgIHByZWZpeCArPSAoQ29uc3RJbnRlcmZhY2UuUkVRX0FSR19TRVBBUkFUT1IgKyBDb25zdEludGVyZmFjZS5SQ19UT0tFTl9TRVNTSU9OX0lEICsgdGhpcy5TZXNzaW9uSWQpO1xyXG5cclxuICAgIGlmIChpc0luaXRpYWxDYWxsKSB7XHJcbiAgICAgIC8vIFRPRE86IEhvdyB0byBnZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzP1xyXG4gICAgICAvLyBsZXQgZW52VmFyczogc3RyaW5nID0gQ2xpZW50TWFuYWdlci5JbnN0YW5jZS5nZXRFbnZWYXJzKCk7XHJcbiAgICAgIC8vIGlmICghTlN0cmluZy5Jc051bGxPckVtcHR5KGVudlZhcnMpKSB7XHJcbiAgICAgIC8vICAgLy8gZW52aXJvbm1lbnQgdmFyaWFibGVzOiBFTlYxLEVOVjIsLi4gLS0+ICZFTlYxPXZhbDEmRU5WMj12YWwyLi4uXHJcbiAgICAgIC8vICAgbGV0IGVudlZhcnNWZWM6IHN0cmluZ1tdID0gZW52VmFycy5zcGxpdChcIixcIik7XHJcbiAgICAgIC8vICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGVudlZhcnNWZWMubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgLy8gICAgIHByZWZpeCArPSAoXCImXCIgKyBlbnZWYXJzVmVjW2ldICsgXCI9XCIgKyBPU0Vudmlyb25tZW50LmdldChlbnZWYXJzVmVjW2ldKSk7XHJcbiAgICAgIC8vICAgfVxyXG4gICAgICAvLyB9XHJcbiAgICAgIGlmIChSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5Jc1Nlc3Npb25SZUluaXRpYWxpemluZylcclxuICAgICAgICBwcmVmaXggKz0gKENvbnN0SW50ZXJmYWNlLlJFUV9BUkdfU0VQQVJBVE9SICsgQ29uc3RJbnRlcmZhY2UuV0VCQ0xJRU5UX1JFSU5JVElBTElaRV9SRVFVRVNUKTtcclxuXHJcbiAgICAgIGxldCBnbG9iYWxQYXJhbXM6IHN0cmluZyA9IFNlcnZlckNvbmZpZy5JbnN0YW5jZS5nZXRHbG9iYWxQYXJhbXMoKTtcclxuICAgICAgaWYgKGdsb2JhbFBhcmFtcyAhPT0gbnVsbCkge1xyXG4gICAgICAgIGdsb2JhbFBhcmFtcyA9IE5TdHJpbmcuUmVwbGFjZShnbG9iYWxQYXJhbXMsIFwiK1wiLCBcIiUyQlwiKTtcclxuICAgICAgICBwcmVmaXggKz0gKFwiJlwiICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0dMT0JBTFBBUkFNUyArIFwiPVwiICsgZ2xvYmFsUGFyYW1zKTtcclxuICAgICAgfVxyXG4gICAgfSAvLyBpc0luaXRpYWxDYWxsXHJcblxyXG4gICAgaWYgKGhhc0NvbnRlbnQpIHtcclxuICAgICAgcHJlZml4ICs9IChcIiZcIiArIENvbnN0SW50ZXJmYWNlLlJDX1RPS0VOX1NFU1NJT05fQ09VTlQgKyB0aGlzLkdldFNlc3Npb25Db3VudGVyKCkgK1xyXG4gICAgICAgIENvbnN0SW50ZXJmYWNlLlJFUV9BUkdfU0VQQVJBVE9SICsgQ29uc3RJbnRlcmZhY2UuUkNfVE9LRU5fREFUQSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHByZWZpeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5zZW5kIE1vbml0b3IgbWVzc2FnaW5nIHRvIHRoZSBzZXJ2ZXI8L3N1bW1hcnk+XHJcbiAgcHVibGljIGFzeW5jIFNlbmRNb25pdG9yT25seSgpOiBQcm9taXNlPHZvaWQ+XHJcbiAge1xyXG4gICAgbGV0IGZsb3dNb25pdG9yOiBGbG93TW9uaXRvclF1ZXVlID0gRmxvd01vbml0b3JRdWV1ZS5JbnN0YW5jZTtcclxuXHJcbiAgICBpZiAoQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlID09IG51bGwgfHwgQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldE1HRGF0YSgwKSA9PSBudWxsIHx8IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5nZXRNR0RhdGEoMCkuSXNBYm9ydGluZylcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGlmICghZmxvd01vbml0b3IuaXNFbXB0eSgpKVxyXG4gICAge1xyXG4gICAgICAvLyBidWlsZCBvdXQgbWVzc2FnZVxyXG4gICAgICBsZXQgYnVmZmVyOiBTdHJpbmdCdWlsZGVyID0gdGhpcy5CdWlsZE1vbml0b3JNZXNzYWdlKCk7XHJcblxyXG4gICAgICAvLyBJZiBjbGllbnQgc2VxdWVuY2UgaXMgdG8gYmUgYWNjdW11bGF0ZWQgdW50aWwgbmV4dCBzZXJ2ZXIgYWNjZXNzLlxyXG4gICAgICBsZXQgc2hvdWxkQWNjdW11bGF0ZUNsaWVudExvZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAvLyBzaG91bGRBY2N1bXVsYXRlQ2xpZW50TG9nID0gQ2xpZW50TWFuYWdlci5JbnN0YW5jZS5nZXRMb2dDbGllbnRTZXF1ZW5jZUZvckFjdGl2aXR5TW9uaXRvcigpO1xyXG4gICAgICAvLyBpZiAoc2hvdWxkQWNjdW11bGF0ZUNsaWVudExvZykge1xyXG4gICAgICAvLyAgIGlmICh0aGlzLl9sb2dBY2N1bXVsYXRvciA9PSBudWxsKVxyXG4gICAgICAvLyAgICAgdGhpcy5fbG9nQWNjdW11bGF0b3IgPSBuZXcgQ2xpZW50TG9nQWNjdW11bGF0b3IoQ2xpZW50TWFuYWdlclJ1bnRpbWUuSW5zdGFuY2UuUnVudGltZUN0eC5Db250ZXh0SUQpO1xyXG4gICAgICAvL1xyXG4gICAgICAvLyAgIC8vIElmIHdlJ3JlIHVuYWJsZSB0byBvcGVuIHRoZSBmaWxlLCBkZWFjdGl2YXRlIGxvZ2dpbmcgYWNjdW11bGF0aW9uLFxyXG4gICAgICAvLyAgIC8vICAgIGFuZCBsZXQgdGhlIG1lc3NhZ2UgYmUgc2VudCB0byB0aGUgc2VydmVyIGFzIGRvbmUgd2l0aG91dCBhY2N1bXVsYXRlZCBsb2dnaW5nXHJcbiAgICAgIC8vICAgaWYgKHRoaXMuX2xvZ0FjY3VtdWxhdG9yLklzRmFpbGVkKCkpXHJcbiAgICAgIC8vICAgICBzaG91bGRBY2N1bXVsYXRlQ2xpZW50TG9nID0gZmFsc2U7XHJcbiAgICAgIC8vIH1cclxuXHJcbiAgICAgIGlmIChzaG91bGRBY2N1bXVsYXRlQ2xpZW50TG9nKSB7XHJcbiAgICAgICAgLy8gV3JpdGUgbWVzc2FnZSB0byBmaWxlLlxyXG4gICAgICAgIC8vIHRoaXMuX2xvZ0FjY3VtdWxhdG9yLldyaXRlKGJ1ZmZlci5Ub1N0cmluZygpKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgbGV0IHJlcXVlc3RTdGF0dXM6IFJlZlBhcmFtPFJlcXVlc3RTdGF0dXM+ID0gbmV3IFJlZlBhcmFtKFJlcXVlc3RTdGF0dXMuSGFuZGxlZCk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLkRpc3BhdGNoUmVxdWVzdCh0aGlzLlNlcnZlclVybCwgYnVmZmVyLlRvU3RyaW5nKCksIENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZXNzaW9uU3RhZ2UuTk9STUFMLCByZXF1ZXN0U3RhdHVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgLy8gZG8gbm90aGluZy4gaWYgc2VuZGluZyBsb2cgZmFpbHMsIHRoZXJlIGlzIG5vIGhhcm0uXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+YnVpbGQgRmxvdyBNb25pdG9yIG1lc3NhZ2U8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBCdWlsZE1vbml0b3JNZXNzYWdlKCk6IFN0cmluZ0J1aWxkZXIge1xyXG4gICAgbGV0IGJ1ZmZlcjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKDEwMDApO1xyXG4gICAgbGV0IGZsb3dNb25pdG9yOiBGbG93TW9uaXRvclF1ZXVlID0gRmxvd01vbml0b3JRdWV1ZS5JbnN0YW5jZTtcclxuXHJcbiAgICBpZiAoIVJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLlNob3VsZFNjcmFtYmxlQW5kVW5zY3JhbWJsZU1lc3NhZ2VzKSB7XHJcbiAgICAgIGJ1ZmZlci5BcHBlbmQoWE1MQ29uc3RhbnRzLk1HX1RBR19PUEVOKTtcclxuICAgICAgZmxvd01vbml0b3IuYnVpbGRYTUwoYnVmZmVyKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBmbG93TW9uaXRvci5idWlsZFhNTChidWZmZXIpO1xyXG4gICAgICBsZXQgc2NyYW1ibGVkT3V0OiBzdHJpbmcgPSBTY3JhbWJsZXIuU2NyYW1ibGUoYnVmZmVyLlRvU3RyaW5nKCkpO1xyXG4gICAgICBidWZmZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigxMDAwKTtcclxuICAgICAgYnVmZmVyLkFwcGVuZChYTUxDb25zdGFudHMuTUdfVEFHX09QRU4gKyBzY3JhbWJsZWRPdXQpO1xyXG4gICAgfVxyXG4gICAgYnVmZmVyLkFwcGVuZChcIjwvXCIgKyBYTUxDb25zdGFudHMuTUdfVEFHX1hNTCArIFhNTENvbnN0YW50cy5UQUdfQ0xPU0UpO1xyXG5cclxuICAgIHJldHVybiBidWZmZXI7XHJcbiAgfVxyXG5cclxuICBSZWdpc3RlckRlbGVnYXRlcygpOiB2b2lkIHtcclxuICAgIEh0dHBDbGllbnRFdmVudHMuR2V0U2Vzc2lvbkNvdW50ZXJfRXZlbnQgPSB0aGlzLkdldFNlc3Npb25Db3VudGVyLmJpbmQodGhpcyk7XHJcbiAgICBIdHRwQ2xpZW50RXZlbnRzLkNoZWNrQW5kU2V0U2Vzc2lvbkNvdW50ZXJfRXZlbnQgPSB0aGlzLkNoZWNrQW5kU2V0U2Vzc2lvbkNvdW50ZXIuYmluZCh0aGlzKTtcclxuICAgIEh0dHBDbGllbnRFdmVudHMuQ29tcHV0ZUFuZExvZ1JlcXVlc3RJbmZvX0V2ZW50ID0gdGhpcy5Db21wdXRlQW5kTG9nUmVxdWVzdEluZm8uYmluZCh0aGlzKTtcclxuICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLlNwaW5uZXJTdG9wcGVkLnN1YnNjcmliZShjbGllbnRCdXN5VGltZSA9PiB0aGlzLkNsaWVudEFjdGl2YXRlZCgpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gTG9nIHRoZSBjdXJyZW50IHJlcXVlc3QgaW5mb3JtYXRpb24gaW4gY29uc29sZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgQ29tcHV0ZUFuZExvZ1JlcXVlc3RJbmZvKGNvbnRlbnRMZW5ndGg6IG51bWJlciwgcm91bmRUcmlwOiBudW1iZXIsIGlzTG9nZ2luZ1Jlc3BvbnNlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZighaXNOdWxsT3JVbmRlZmluZWQodGhpcy5fcmVxdWVzdEluZm8uc2VydmVyQ2FsbEF0KSkge1xyXG5cclxuICAgICAgdGhpcy5fcmVxdWVzdEluZm8uZXh0cmFJbmZvLmNvbnRlbnRMZW5ndGggPSBjb250ZW50TGVuZ3RoO1xyXG4gICAgICB0aGlzLl9yZXF1ZXN0SW5mby5leHRyYUluZm8udGltZVN0YW1wID0gbmV3IERhdGUoKS50b1N0cmluZygpO1xyXG4gICAgICBsZXQgZXh0cmFNZXNzYWdlU3RyOiBzdHJpbmcgPSBpc0xvZ2dpbmdSZXNwb25zZT8gJ1Jlc3BvbnNlIOKktScgOiAnUmVxdWVzdCDipLUnO1xyXG5cclxuICAgICAgaWYgKGlzTG9nZ2luZ1Jlc3BvbnNlKSB7XHJcbiAgICAgICAgdGhpcy5fcmVxdWVzdEluZm8ucm91bmR0cmlwVGltZSA9IHJvdW5kVHJpcDtcclxuICAgICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci50b3RhbFRpbWVGb3JIVFRQUmVxdWVzdHMgKz0gcm91bmRUcmlwOyAvLyBhZGQgdGhlIHJlcXVlc3QgdGltZSB0byB0b3RhbCB0aW1lXHJcbiAgICAgIH0gZWxzZVxyXG4gICAgICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLnRvdGFsUmVxdWVzdERhdGFMZW5ndGggKz0gY29udGVudExlbmd0aDsgLy8gYWRkIHRoZSByZXF1ZXN0IGNvbnRlbnQgdG8gdG90YWwgdGltZVxyXG5cclxuXHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVJlcXVlc3RJbmZvVG9Mb2codGhpcy5fcmVxdWVzdEluZm8sIGV4dHJhTWVzc2FnZVN0cik7XHJcblxyXG4gICAgICAvLyBDbGVhciB0aGUgY2xpZW50IHNlc3Npb24gYWZ0ZXIgbG9nZ2luZyB0aGUgcmVzcG9uc2VcclxuICAgICAgaWYgKGlzTG9nZ2luZ1Jlc3BvbnNlKVxyXG4gICAgICAgIHRoaXMuX3JlcXVlc3RJbmZvLmNsZWFyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFdoZW4gdHJ1ZSwgcmVxdWVzdHMgYXJlIHNjcmFtYmxlZCBhbmQgcmVzcG9uc2VzIGFyZSB1bnNjcmFtYmxlZC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBzZXQgU2hvdWxkU2NyYW1ibGVBbmRVbnNjcmFtYmxlTWVzc2FnZXModmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLl9zaG91bGRTY3JhbWJsZUFuZFVuc2NyYW1ibGVNZXNzYWdlcyA9IHZhbHVlO1xyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlU2VydmVyTWVzc2FnZXNUb0xvZyhOU3RyaW5nLkZvcm1hdChcIlNob3VsZFNjcmFtYmxlQW5kVW5zY3JhbWJsZU1lc3NhZ2VzLlNldDogezB9XCIsIHRoaXMuX3Nob3VsZFNjcmFtYmxlQW5kVW5zY3JhbWJsZU1lc3NhZ2VzKSk7XHJcbiAgfVxyXG4gIHN0YXRpYyBnZXQgU2hvdWxkU2NyYW1ibGVBbmRVbnNjcmFtYmxlTWVzc2FnZXMoKTogYm9vbGVhbiB7XHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTZXJ2ZXJNZXNzYWdlc1RvTG9nKE5TdHJpbmcuRm9ybWF0KFwiU2hvdWxkU2NyYW1ibGVBbmRVbnNjcmFtYmxlTWVzc2FnZXMuR2V0OiB7MH1cIiwgdGhpcy5fc2hvdWxkU2NyYW1ibGVBbmRVbnNjcmFtYmxlTWVzc2FnZXMpKTtcclxuICAgIHJldHVybiBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5fc2hvdWxkU2NyYW1ibGVBbmRVbnNjcmFtYmxlTWVzc2FnZXM7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PnBhcnNlIHRoZSBsb2cgbGV2ZWwgZnJvbSBhIHN0cmluZyB2YWx1ZTwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdHJMb2dMZXZlbFwiPnN0cmluZyB2YWx1ZSBvZiB0aGUgbG9nIGxldmVsPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+bG9nIGxldmVsPC9yZXR1cm5zPlxyXG4gIHBhcnNlTG9nTGV2ZWwoc3RyTG9nTGV2ZWw6IHN0cmluZyk6IExvZ2dlcl9Mb2dMZXZlbHMge1xyXG4gICAgbGV0IGxvZ0xldmVsOiBMb2dnZXJfTG9nTGV2ZWxzID0gTG9nZ2VyX0xvZ0xldmVscy5Ob25lO1xyXG5cclxuICAgIGlmICghTlN0cmluZy5Jc051bGxPckVtcHR5KHN0ckxvZ0xldmVsKSkge1xyXG4gICAgICBpZiAoc3RyTG9nTGV2ZWwudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKCBcIlNFUlZFUlwiKSlcclxuICAgICAgICBsb2dMZXZlbCA9IHN0ckxvZ0xldmVsLmVuZHNXaXRoKFwiI1wiKSA/IExvZ2dlcl9Mb2dMZXZlbHMuU2VydmVyTWVzc2FnZXMgOiBMb2dnZXJfTG9nTGV2ZWxzLlNlcnZlcjsgLy8gb25seSByZXF1ZXN0cyB0byB0aGUgc2VydmVyXHJcbiAgICAgIGVsc2UgaWYgKHN0ckxvZ0xldmVsLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aChcIlNcIikgfHwgc3RyTG9nTGV2ZWwudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKFwiUVwiKSlcclxuICAgICAgICBsb2dMZXZlbCA9IExvZ2dlcl9Mb2dMZXZlbHMuU3VwcG9ydDtcclxuICAgICAgZWxzZSBpZiAoc3RyTG9nTGV2ZWwudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKFwiR1wiKSlcclxuICAgICAgICBsb2dMZXZlbCA9IExvZ2dlcl9Mb2dMZXZlbHMuR3VpO1xyXG4gICAgICBlbHNlIGlmIChzdHJMb2dMZXZlbC50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoXCJEXCIpKVxyXG4gICAgICAgIGxvZ0xldmVsID0gTG9nZ2VyX0xvZ0xldmVscy5EZXZlbG9wbWVudDtcclxuICAgICAgZWxzZSBpZiAoc3RyTG9nTGV2ZWwudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKFwiQlwiKSlcclxuICAgICAgICBsb2dMZXZlbCA9IExvZ2dlcl9Mb2dMZXZlbHMuQmFzaWM7XHJcbiAgICAgIGVsc2UgaWYgKHN0ckxvZ0xldmVsLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aChcIlJcIikpXHJcbiAgICAgICAgbG9nTGV2ZWwgPSBMb2dnZXJfTG9nTGV2ZWxzLlJlcXVlc3RJbmZvO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBsb2dMZXZlbDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGJ1aWxkIHRoZSBYTUwgc3RyaW5nIG9mIHRoZSBkYXRhIHRoYXQgc2hvdWxkIGJlIHNlbnQgdG8gdGhlIHNlcnZlcjwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzZXJpYWxpemVUYXNrc1wiPmlmIHRydWUsIHRhc2tzIGluIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiB3aWxsIGFsc28gYmUgc2VyaWFsaXplZC48L3BhcmFtPlxyXG4gIGFzeW5jIFByZXBhcmVSZXF1ZXN0KHNlcmlhbGl6ZVRhc2tzOiBib29sZWFuKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGxldCB4bWxCdWY6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgeG1sQnVmLkFwcGVuZChYTUxDb25zdGFudHMuTUdfVEFHX09QRU4pO1xyXG5cclxuICAgIC8vIHRoZSBjbGllbnQgbm8gbG9uZ2VyIHNlbmRzIChhbmQgZW1wdGllcykgdGhlIGV2ZW50IHF1ZXVlIHRvIHRoZSBzZXJ2ZXJcclxuICAgIC8vIHNpbmNlIHRoZSBzZXJ2ZXIgaGFzIG5vdGhpbmcgdXNlZnVsIHRvIGRvIHdpdGggdGhlIGNsaWVudCBwZW5kaW5nIGV2ZW50c1xyXG4gICAgaWYgKEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5nZXRDdXJyTUdEYXRhKCkgIT09IG51bGwpIHtcclxuICAgICAgbGV0IHhtbFVuc2NyYW1ibGVkOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmJ1aWxkWE1MKHhtbFVuc2NyYW1ibGVkLCBzZXJpYWxpemVUYXNrcyk7XHJcblxyXG4gICAgICBpZiAoUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuU2hvdWxkU2NyYW1ibGVBbmRVbnNjcmFtYmxlTWVzc2FnZXMpXHJcbiAgICAgICAgeG1sQnVmLkFwcGVuZChTY3JhbWJsZXIuU2NyYW1ibGUoeG1sVW5zY3JhbWJsZWQuVG9TdHJpbmcoKSkpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgeG1sQnVmLkFwcGVuZCh4bWxVbnNjcmFtYmxlZC5Ub1N0cmluZygpKTtcclxuICAgIH1cclxuICAgIHhtbEJ1Zi5BcHBlbmQoXCI8L1wiICsgWE1MQ29uc3RhbnRzLk1HX1RBR19YTUwgKyBYTUxDb25zdGFudHMuVEFHX0NMT1NFKTtcclxuXHJcbiAgICByZXR1cm4geG1sQnVmLlRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PnBhcnNlIGEgcmVzcG9uc2UgKGZyb20gdGhlIFNlcnZlcikgYW5kIGV4ZWN1dGUgY29tbWFuZHMgaWYgcmV0dXJuZWQgd2l0aGluIHRoZSByZXNwb25zZS48L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVzcG9uc2VcIj4oWE1MIGZvcm1hdHRlZCkgcmVzcG9uc2UuPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdXJyTWdkSURcIj5udW1iZXIgb2Ygd2luZG93IGluIGdsb2JhbCBhcnJheTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib3BlbmluZ1Rhc2tEZXRhaWxzXCI+YWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvZiBvcGVuaW5nIHRhc2s8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlc1wiPnJlc3VsdCB0byBiZSByZWFkIGZyb20gY29tbWFuZCByZXR1cm5lZCB3aXRpbiB0aGUgcmVzcG9uc2UuPC9wYXJhbT5cclxuICBhc3luYyBQcm9jZXNzUmVzcG9uc2UocmVzcG9uc2U6IHN0cmluZywgY3Vyck1nZElEOiBudW1iZXIsIG9wZW5pbmdUYXNrRGV0YWlsczogT3BlbmluZ1Rhc2tEZXRhaWxzLCByZXM6IElSZXN1bHRWYWx1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCI8LS0gUHJvY2Vzc1Jlc3BvbnNlIHN0YXJ0ZWQgLS0+XCIpO1xyXG4gICAgaWYob3BlbmluZ1Rhc2tEZXRhaWxzID09PSBudWxsKVxyXG4gICAgICBvcGVuaW5nVGFza0RldGFpbHMgPSBuZXcgT3BlbmluZ1Rhc2tEZXRhaWxzKCk7XHJcblxyXG4gICAgbGV0IHN5c3RlbU1pbGxpc2Vjb25kczogbnVtYmVyID0gTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKTtcclxuICAgIGlmIChyZXNwb25zZSA9PT0gbnVsbCB8fCByZXNwb25zZS50cmltKCkubGVuZ3RoID09PSAwKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmN1cnJNZ2RJRCA9IGN1cnJNZ2RJRDtcclxuXHJcbiAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLnB1c2goKTsgLy8gYWxsb3cgcmVjdXJzaXZlIHBhcnNpbmdcclxuICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuc2V0WE1MZGF0YShyZXNwb25zZSk7XHJcbiAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLnNldEN1cnJJbmRleCgwKTtcclxuXHJcbiAgICBsZXQgY3Vyck1HRGF0YTogTUdEYXRhID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldEN1cnJNR0RhdGEoKTtcclxuICAgIGF3YWl0IGN1cnJNR0RhdGEuZmlsbERhdGEob3BlbmluZ1Rhc2tEZXRhaWxzLCBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyKTtcclxuXHJcbiAgICAvLyBmcmVlIG1lbW9yeVxyXG4gICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5zZXRYTUxkYXRhKG51bGwpO1xyXG4gICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5wb3AoKTtcclxuXHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcIjwtLSBQcm9jZXNzUmVzcG9uc2UgZmluaXNoZWQgLS0+IChcIiArIChNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpIC0gc3lzdGVtTWlsbGlzZWNvbmRzKSArIFwiKVwiKTtcclxuICAgIC8vIGV4ZWN1dGUgdGhlIGNvbW1hbmRzIHRoYXQgd2VyZSByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2VcclxuICAgIGF3YWl0KDxDb21tYW5kc1RhYmxlPmN1cnJNR0RhdGEuQ21kc1RvQ2xpZW50KS5FeGVjdXRlKHJlcyk7XHJcbiAgICBhd2FpdCB0aGlzLlByb2Nlc3NSZWNvdmVyeSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBwcm9jZXNzUmVjb3ZlcnlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIFByb2Nlc3NSZWNvdmVyeSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICAvLyBRQ1IgIzc3MTAxMiAtIHByb2Nlc3MgZGF0YSBlcnJvciByZWNvdmVyeSBvbmx5IGFmdGVyIHRoZSBwYXJzaW5nIHByb2Nlc3MgaXMgb3Zlci5cclxuICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnB1c2hOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICBhd2FpdCBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUucHJvY2Vzc1JlY292ZXJ5KCk7XHJcbiAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5wb3BOZXdFeGVjU3RhY2tzKCk7XHJcbiAgfVxyXG59XHJcblxyXG4vLy8gPHN1bW1hcnk+aGVscGVyIGNsYXNzOiBkZXRhaWxzIGZyb20gdGhlIHJ1bnRpbWUtZW5naW5lIC0gZW52aXJvbm1lbnQgdmFsdWVzLlxyXG4vLy8gSGFuZHNoYWtlIHJlc3BvbnNlOiA8UmljaGNsaWVudHJlc3BvbnNlPiA8Q29udGV4dElEPi4uLjwvQ29udGV4dElEPiA8RW52aXJvbm1lbnQgSW5wdXRQYXNzd29yZD1cIll8TlwiXHJcbi8vLyBTeXN0ZW1Mb2dpbj1cIkZ8TnxEfExcIiAvPiA8L1JpY2hjbGllbnRyZXNwb25zZT5cclxuLy8vIDwvc3VtbWFyeT5cclxuY2xhc3MgSGFuZHNoYWtlUmVzcG9uc2Uge1xyXG4gIHN0YXRpYyByZWFkb25seSBTWVNURU1fTE9HSU5fQUQ6IHN0cmluZyA9ICdEJztcclxuXHJcbiAgcHJpdmF0ZSBfc2NyYW1ibGVNZXNzYWdlczogYm9vbGVhbiA9IHRydWU7IC8vIHRydWUgaWYgbWVzc2FnZXMgc2hvdWxkIGJlIHNjcmFtYmxlZC91bnNjcmFtYmxlZCBieSB0aGUgY2xpZW50IGFuZCBzZXJ2ZXJcclxuICBnZXQgU2NyYW1ibGVNZXNzYWdlcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9zY3JhbWJsZU1lc3NhZ2VzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY29udGV4dElkOiBzdHJpbmcgPSBudWxsO1xyXG4gIGdldCBDb250ZXh0SWQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9jb250ZXh0SWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9wcml2YXRlU2Vzc2lvbklkOiBzdHJpbmcgPSBudWxsO1xyXG4gIGdldCBHZXRTZXNzaW9uSWQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9wcml2YXRlU2Vzc2lvbklkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaW5wdXRQYXNzd29yZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGdldCBJbnB1dFBhc3N3b3JkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lucHV0UGFzc3dvcmQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9odHRwVGltZW91dDogbnVtYmVyID0gMDtcclxuICBnZXQgSHR0cFRpbWVvdXQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9odHRwVGltZW91dDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3N5c3RlbUxvZ2luOiBzdHJpbmcgPSBudWxsO1xyXG4gIGdldCBTeXN0ZW1Mb2dpbigpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N5c3RlbUxvZ2luO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfbWF4SW50ZXJuYWxMb2dMZXZlbDogc3RyaW5nID0gbnVsbDtcclxuICBnZXQgTWF4SW50ZXJuYWxMb2dMZXZlbCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX21heEludGVybmFsTG9nTGV2ZWw7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihyZXNwb25zZVhNTDogc3RyaW5nKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBKU09OX1V0aWxzLkpTT05Gcm9tWE1MKHJlc3BvbnNlWE1MLCB0aGlzLkZpbGxGcm9tSlNPTi5iaW5kKHRoaXMpKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChleCkge1xyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZyhleCwgcmVzcG9uc2VYTUwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBGaWxsRnJvbUpTT04gKGVycm9yLCByZXN1bHQpOiB2b2lkIHtcclxuXHJcbiAgICAvLyBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gcGFyc2luZyB0aGUgWE1MLFxyXG4gICAgaWYgKGVycm9yICE9IG51bGwpIHtcclxuICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJlc3BvbnNlID0gcmVzdWx0WydSaWNoY2xpZW50cmVzcG9uc2UnXTtcclxuXHJcbiAgICBmb3IgKGxldCBlbGVtZW50TmFtZSBpbiByZXNwb25zZSkge1xyXG4gICAgICBpZiAocmVzcG9uc2UuaGFzT3duUHJvcGVydHkoZWxlbWVudE5hbWUpKSB7XHJcblxyXG4gICAgICAgIHN3aXRjaCAoZWxlbWVudE5hbWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY2FzZSBcIkNvbnRleHRJRFwiOlxyXG4gICAgICAgICAgICB0aGlzLl9jb250ZXh0SWQgPSByZXNwb25zZVtlbGVtZW50TmFtZV1bMF07XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBcIlNlc3Npb25JRFwiOlxyXG4gICAgICAgICAgICB0aGlzLl9wcml2YXRlU2Vzc2lvbklkID0gcmVzcG9uc2VbZWxlbWVudE5hbWVdWzBdO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgXCJFbnZpcm9ubWVudFwiOlxyXG4gICAgICAgICAgICBsZXQgZW52QXR0cmlidXRlcyA9IHJlc3BvbnNlW1wiRW52aXJvbm1lbnRcIl1bMF1bJyQnXTtcclxuXHJcbiAgICAgICAgICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQoZW52QXR0cmlidXRlc1tcIlNjcmFtYmxlTWVzc2FnZXNcIl0pKSB7XHJcbiAgICAgICAgICAgICAgRGVidWcuQXNzZXJ0KGVudkF0dHJpYnV0ZXNbXCJTY3JhbWJsZU1lc3NhZ2VzXCJdID09PSBcIk5cIik7XHJcbiAgICAgICAgICAgICAgdGhpcy5fc2NyYW1ibGVNZXNzYWdlcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQoZW52QXR0cmlidXRlc1tcIk1heEludGVybmFsTG9nTGV2ZWxcIl0pKVxyXG4gICAgICAgICAgICAgIHRoaXMuX21heEludGVybmFsTG9nTGV2ZWwgPSBlbnZBdHRyaWJ1dGVzW1wiTWF4SW50ZXJuYWxMb2dMZXZlbFwiXTtcclxuICAgICAgICAgICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChlbnZBdHRyaWJ1dGVzW1wiSW5wdXRQYXNzd29yZFwiXSkgJiYgZW52QXR0cmlidXRlc1tcIklucHV0UGFzc3dvcmRcIl0udG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gXCJ5XCIpXHJcbiAgICAgICAgICAgICAgdGhpcy5faW5wdXRQYXNzd29yZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQoZW52QXR0cmlidXRlc1tcIlN5c3RlbUxvZ2luXCJdKSlcclxuICAgICAgICAgICAgICB0aGlzLl9zeXN0ZW1Mb2dpbiA9IGVudkF0dHJpYnV0ZXNbXCJTeXN0ZW1Mb2dpblwiXTtcclxuICAgICAgICAgICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChlbnZBdHRyaWJ1dGVzW0NvbnN0SW50ZXJmYWNlLk1HX1RBR19IVFRQX0NPTU1VTklDQVRJT05fVElNRU9VVF0pKVxyXG4gICAgICAgICAgICAgIHRoaXMuX2h0dHBUaW1lb3V0ID0gK2VudkF0dHJpYnV0ZXNbQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0hUVFBfQ09NTVVOSUNBVElPTl9USU1FT1VUXTtcclxuICAgICAgICAgICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChlbnZBdHRyaWJ1dGVzW1wiRm9yd2FyZFNsYXNoXCJdKSlcclxuICAgICAgICAgICAgICBBY2Nlc3NIZWxwZXIuZW52aXJvbm1lbnQuRm9yd2FyZFNsYXNoVXNhZ2UgPSBlbnZBdHRyaWJ1dGVzW1wiRm9yd2FyZFNsYXNoXCJdO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8vLyA8c3VtbWFyeT5UaGlzIGNsYXNzIGltcGxlbWVudHMgTWdTQVhIYW5kbGVySW50ZXJmYWNlLCB3aGljaCBtZWFucyB0aGF0IGl0IGRlZmluZXMgYWxsIHRoZSBcImNhbGxiYWNrXCJcclxuLy8vIG1ldGhvZHMgdGhhdCB0aGUgU0FYIHBhcnNlciB3aWxsIGludm9rZSB0byBub3RpZnkgdGhlIGFwcGxpY2F0aW9uLiBJbiB0aGlzIGV4YW1wbGUgd2Ugb3ZlcnJpZGUgdGhlXHJcbi8vLyBtZXRob2RzIHRoYXQgd2UgcmVxdWlyZS48L3N1bW1hcnk+XHJcbmNsYXNzIEVycm9yTWVzc2FnZVhtbCB7XHJcbiAgcHJpdmF0ZSBfbGFzdFJlcXVlc3RUaW1lOiBudW1iZXIgPSAwO1xyXG4gIGNvbnRleHRJbmFjdGl2aXR5VGltZW91dDogbnVtYmVyO1xyXG5cclxuICBwcml2YXRlIF9lcnJvck1lc3NhZ2U6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfZXJyb3JDb2RlOiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgX21pZGRsZXdhcmVBZGRyZXNzOiBzdHJpbmcgPSBudWxsO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX3BhcnNpbmdGYWlsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IoeG1sQ29udGVudDogc3RyaW5nLCBsYXN0UmVxdWVzdFRpbWU6IG51bWJlciwgY29udGV4dEluYWN0aXZpdHlUaW1lb3V0OiBudW1iZXIpIHtcclxuICAgIHRoaXMuX2xhc3RSZXF1ZXN0VGltZSA9IGxhc3RSZXF1ZXN0VGltZTtcclxuICAgIHRoaXMuY29udGV4dEluYWN0aXZpdHlUaW1lb3V0ID0gY29udGV4dEluYWN0aXZpdHlUaW1lb3V0O1xyXG4gICAgdHJ5IHtcclxuICAgICAgSlNPTl9VdGlscy5KU09ORnJvbVhNTCh4bWxDb250ZW50LCB0aGlzLkZpbGxGcm9tSlNPTi5iaW5kKHRoaXMpKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChleCkge1xyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZyhleCk7XHJcbiAgICAgIE1pc2MuV3JpdGVTdGFja1RyYWNlKGV4KTtcclxuICAgICAgdGhpcy5fcGFyc2luZ0ZhaWxlZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIEZpbGxGcm9tSlNPTiAoZXJyb3IsIHJlc3VsdCk6IHZvaWQge1xyXG5cclxuICAgIC8vIElmIHRoZXJlIHdhcyBhbiBlcnJvciBpbiBwYXJzaW5nIHRoZSBYTUwsXHJcbiAgICBpZiAoZXJyb3IgIT0gbnVsbCkge1xyXG4gICAgICB0aHJvdyBlcnJvcjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgeG1sZXJyID0gcmVzdWx0Wyd4bWxlcnInXTtcclxuXHJcbiAgICBmb3IgKGxldCBlbGVtZW50TmFtZSBpbiB4bWxlcnIpIHtcclxuICAgICAgaWYgKHhtbGVyci5oYXNPd25Qcm9wZXJ0eShlbGVtZW50TmFtZSkpIHtcclxuICAgICAgICBzd2l0Y2ggKGVsZW1lbnROYW1lKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGNhc2UgXCJlcnJtc2dcIjpcclxuICAgICAgICAgICAgdGhpcy5fZXJyb3JNZXNzYWdlID0geG1sZXJyW2VsZW1lbnROYW1lXVswXTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFwiZXJyY29kZVwiOlxyXG4gICAgICAgICAgICB0aGlzLl9lcnJvckNvZGUgPSArKHhtbGVycltlbGVtZW50TmFtZV0pO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgXCJzZXJ2ZXJcIjpcclxuICAgICAgICAgICAgdGhpcy5fbWlkZGxld2FyZUFkZHJlc3MgPSB4bWxlcnJbZWxlbWVudE5hbWVdWzBdO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgXCJhcHBuYW1lXCI6IC8vIGlnbm9yZWQgLSB0aGUgY2xpZW50IGxpc3RzIHRoaXMgdmFsdWUgZnJvbSB0aGUgZXhlY3V0aW9uIHByb3BlcnRpZXNcclxuICAgICAgICAgIGNhc2UgXCJwcmduYW1lXCI6IC8vIGlnbm9yZWQgLSB0aGUgY2xpZW50IGxpc3RzIHRoaXMgdmFsdWUgZnJvbSB0aGUgZXhlY3V0aW9uIHByb3BlcnRpZXNcclxuICAgICAgICAgIGNhc2UgXCJhcmd1bWVudHNcIjogLy8gaWdub3JlZFxyXG4gICAgICAgICAgY2FzZSBcInVzZXJuYW1lXCI6ICAvLyBpZ25vcmVkXHJcbiAgICAgICAgICBjYXNlIFwieG1sZXJyXCI6IC8vIGVuZCBvZiB0aGUgZXJyb3IgbWVzc2FnZVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhOU3RyaW5nLkZvcm1hdChcIlVua25vd24gZWxlbWVudDogJ3swfSdcIiwgZWxlbWVudE5hbWUpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBHZXRDb2RlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fZXJyb3JDb2RlO1xyXG4gIH1cclxuXHJcbiAgLy8gYnVpbGQgJiByZXR1cm4gYSBmb3JtYXR0ZWQgZXJyb3IgbWVzc2FnZVxyXG4gIEdldE1lc3NhZ2UoKTogc3RyaW5nIHtcclxuICAgIGxldCBzYjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuX3BhcnNpbmdGYWlsZWQpIHtcclxuICAgICAgc2IuQXBwZW5kKEFjY2Vzc0hlbHBlci5sYW5ndWFnZURhdGEuZ2V0Q29uc3RNZXNzYWdlKE1zZ0ludGVyZmFjZS5SQ19TVFJfRjdfVU5FWFBFQ1RFRF9FUlIpKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBzd2l0Y2ggKHRoaXMuX2Vycm9yQ29kZSkge1xyXG4gICAgICAgIGNhc2UgU2VydmVyRXJyb3IuRVJSX0NUWF9OT1RfRk9VTkQ6XHJcbiAgICAgICAgICBpZiAodGhpcy5JbmFjdGl2aXR5VGltZW91dEV4cGlyZWQoKSlcclxuICAgICAgICAgICAgc2IuQXBwZW5kKE5TdHJpbmcuRm9ybWF0KFwiezB9ICh7MX0gezJ9KVwiLFxyXG4gICAgICAgICAgICAgIEFjY2Vzc0hlbHBlci5sYW5ndWFnZURhdGEuZ2V0Q29uc3RNZXNzYWdlKE1zZ0ludGVyZmFjZS5TVFJfRVJSX1NFU1NJT05fQ0xPU0VEX0lOQUNUSVZJVFkpLFxyXG4gICAgICAgICAgICAgIE1hdGguZmxvb3IodGhpcy5jb250ZXh0SW5hY3Rpdml0eVRpbWVvdXQgLyA2MDApLCAvLyBjb252ZXJzaW9uIGZyb20gMS8xMCBvZiBzZWNvbmRzIHRvIG1pbnV0ZXNcclxuICAgICAgICAgICAgICBBY2Nlc3NIZWxwZXIubGFuZ3VhZ2VEYXRhLmdldENvbnN0TWVzc2FnZShNc2dJbnRlcmZhY2UuU1RSX01JTlVURVMpKSk7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHNiLkFwcGVuZChOU3RyaW5nLkZvcm1hdChcInswfSAoezF9KS5cIiwgQWNjZXNzSGVscGVyLmxhbmd1YWdlRGF0YS5nZXRDb25zdE1lc3NhZ2UoTXNnSW50ZXJmYWNlLlNUUl9FUlJfU0VTU0lPTl9DTE9TRUQpLCB0aGlzLl9lcnJvckNvZGUpKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFNlcnZlckVycm9yLkVSUl9XRUJDTElFTlRfUFJPR1JBTV9SRUxPQURFRDpcclxuICAgICAgICAgIHNiLkFwcGVuZChBY2Nlc3NIZWxwZXIubGFuZ3VhZ2VEYXRhLmdldENvbnN0TWVzc2FnZShNc2dJbnRlcmZhY2UuU1RSX0VSUl9XRUJDTElFTlRfUFJPR1JBTV9SRUxPQURFRCkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgU2VydmVyRXJyb3IuRVJSX0VYRUNVVEVEX1BST0dSQU1fQ0hBTkdFRDpcclxuICAgICAgICAgIHNiLkFwcGVuZChBY2Nlc3NIZWxwZXIubGFuZ3VhZ2VEYXRhLmdldENvbnN0TWVzc2FnZShNc2dJbnRlcmZhY2UuU1RSX0VSUl9FWEVDVVRFRF9QUk9HUkFNX0NIQU5HRUQpKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFNlcnZlckVycm9yLkVSUl9BVVRIRU5USUNBVElPTjpcclxuICAgICAgICAgIHNiLkFwcGVuZChBY2Nlc3NIZWxwZXIubGFuZ3VhZ2VEYXRhLmdldENvbnN0TWVzc2FnZShNc2dJbnRlcmZhY2UuVVNSSU5QX1NUUl9CQURQQVNTVykpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgU2VydmVyRXJyb3IuRVJSX0FDQ0VTU19ERU5JRUQ6XHJcbiAgICAgICAgICBzYi5BcHBlbmQoQWNjZXNzSGVscGVyLmxhbmd1YWdlRGF0YS5nZXRDb25zdE1lc3NhZ2UoTXNnSW50ZXJmYWNlLlNUUl9FUlJfQVVUSE9SSVpBVElPTl9GQUlMVVJFKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIHNiLkFwcGVuZCh0aGlzLl9lcnJvck1lc3NhZ2UpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHNiLkFwcGVuZChPU0Vudmlyb25tZW50LkVvbFNlcSArIE9TRW52aXJvbm1lbnQuRW9sU2VxKTtcclxuXHJcbiAgICAgIGlmICghU2VydmVyQ29uZmlnLkluc3RhbmNlLlNob3VsZERpc3BsYXlHZW5lcmljRXJyb3IoKSkge1xyXG4gICAgICAgIHNiLkFwcGVuZChBY2Nlc3NIZWxwZXIubGFuZ3VhZ2VEYXRhLmdldENvbnN0TWVzc2FnZShNc2dJbnRlcmZhY2UuQlJPV1NFUl9PUFRfSU5GT19TRVJWRVJfU1RSKSArIFwiOiAgIFwiKTtcclxuICAgICAgICBzYi5BcHBlbmQoU2VydmVyQ29uZmlnLkluc3RhbmNlLmdldFNlcnZlcigpKTtcclxuICAgICAgICBpZiAoIU5TdHJpbmcuSXNOdWxsT3JFbXB0eSh0aGlzLl9taWRkbGV3YXJlQWRkcmVzcykpIHtcclxuICAgICAgICAgIHNiLkFwcGVuZChcIiAtLT4gXCIpO1xyXG4gICAgICAgICAgc2IuQXBwZW5kKHRoaXMuX21pZGRsZXdhcmVBZGRyZXNzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2IuQXBwZW5kKE9TRW52aXJvbm1lbnQuRW9sU2VxKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgc2IuQXBwZW5kKEFjY2Vzc0hlbHBlci5sYW5ndWFnZURhdGEuZ2V0Q29uc3RNZXNzYWdlKE1zZ0ludGVyZmFjZS5UQVNLUlVMRV9TVFJfQVBQTElDQVRJT04pICsgXCI6ICAgXFxcIlwiKTtcclxuICAgICAgc2IuQXBwZW5kKFNlcnZlckNvbmZpZy5JbnN0YW5jZS5nZXRBcHBOYW1lKCkpO1xyXG4gICAgICBzYi5BcHBlbmQoXCJcXFwiIChcXFwiXCIpO1xyXG4gICAgICBzYi5BcHBlbmQoXCJcXFwiKVwiKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc2IuVG9TdHJpbmcoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgSW5hY3Rpdml0eVRpbWVvdXRFeHBpcmVkKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGV4cGlyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLmNvbnRleHRJbmFjdGl2aXR5VGltZW91dCA+IDApIHtcclxuICAgICAgbGV0IGN1cnJUaW1lTWlsbGk6IG51bWJlciA9IE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCk7XHJcbiAgICAgIGV4cGlyZWQgPSAoKGN1cnJUaW1lTWlsbGkgLSB0aGlzLl9sYXN0UmVxdWVzdFRpbWUpID4gKHRoaXMuY29udGV4dEluYWN0aXZpdHlUaW1lb3V0ICogMTAwKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZXhwaXJlZDtcclxuICB9XHJcbn1cclxuXHJcbi8vIFRPRE86IEltcGxlbWVudCB0aGlzIGNsYXNzXHJcbi8vIGNsYXNzIENsaWVudExvZ0FjY3VtdWxhdG9yIHtcclxuLy9cclxuLy8gICBwcml2YXRlIHN0YXRpYyBDTElFTlRfTE9HX0hEUl9NU0c6IHN0cmluZyA9IFwiQ2xpZW50IGxvZyBmaWxlXCI7XHJcbi8vICAgcHJpdmF0ZSBzdGF0aWMgX2V4aXN0aW5nTG9nTmFtZXM6IExpc3Q8c3RyaW5nPiA9IG5ldyBMaXN0PHN0cmluZz4oKTtcclxuLy8gICBwcml2YXRlIF9jbGllbnRMb2dPczogU3RyZWFtV3JpdGVyID0gbnVsbDtcclxuLy8gICBwcml2YXRlIF9jb250ZXh0SWQ6IG51bWJlciA9IDA7XHJcbi8vICAgcHJpdmF0ZSBfZmFpbGVkOiBib29sZWFuID0gZmFsc2U7XHJcbi8vICAgcHJpdmF0ZSBfZmlsZU5hbWU6IHN0cmluZyA9IG51bGw7XHJcbi8vXHJcbi8vICAgY29uc3RydWN0b3IoY29udGV4dElEOiBudW1iZXIpIHtcclxuLy8gICAgIHRoaXMuX2NvbnRleHRJZCA9IGNvbnRleHRJRDtcclxuLy8gICAgIHRoaXMuX2ZpbGVOYW1lID0gdGhpcy5CdWlsZEZpbGVOYW1lKCk7XHJcbi8vICAgICB0aGlzLk9wZW5Gb3JXcml0ZSgpO1xyXG4vLyAgIH1cclxuLy9cclxuLy8gICBXcml0ZShidWZmZXI6IHN0cmluZyk6IHZvaWQge1xyXG4vLyAgICAgdHJ5IHtcclxuLy8gICAgICAgbGV0IGZsYWc6IGJvb2xlYW4gPSAhdGhpcy5fZmFpbGVkO1xyXG4vLyAgICAgICBpZiAoIWZsYWcpIHtcclxuLy8gICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oXCJDbGllbnRMb2dTZXF1ZW5jZSA6IExvZ2luZyBjbGllbnQgc2VxdWVuY2UgaXMgZGVhY3RpdmF0ZWRcIik7XHJcbi8vICAgICAgIH1cclxuLy8gICAgICAgbGV0IGZsYWcyOiBib29sZWFuID0gdGhpcy5PcGVuRm9yV3JpdGUoKTtcclxuLy8gICAgICAgaWYgKGZsYWcyKSB7XHJcbi8vICAgICAgICAgdGhpcy5fY2xpZW50TG9nT3MuV3JpdGUoYnVmZmVyKTtcclxuLy8gICAgICAgICB0aGlzLl9jbGllbnRMb2dPcy5DbG9zZSgpO1xyXG4vLyAgICAgICAgIHRoaXMuX2NsaWVudExvZ09zID0gbnVsbDtcclxuLy8gICAgICAgICB0aGlzLk9wZW5Gb3JXcml0ZSgpO1xyXG4vLyAgICAgICB9XHJcbi8vICAgICB9XHJcbi8vICAgICBjYXRjaCAoZXgpIHtcclxuLy8gICAgICAgaWYgKGV4IGluc3RhbmNlb2YgSU9FeGNlcHRpb24pIHtcclxuLy8gICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhleC5NZXNzYWdlKTtcclxuLy8gICAgICAgICBNaXNjLldyaXRlU3RhY2tUcmFjZShleCwgTkNvbnNvbGUuRXJyb3IpO1xyXG4vLyAgICAgICB9XHJcbi8vICAgICAgIGVsc2VcclxuLy8gICAgICAgICB0aHJvdyBleDtcclxuLy8gICAgIH1cclxuLy8gICB9XHJcbi8vXHJcbi8vICAgUmVhZCgpOiBzdHJpbmcge1xyXG4vLyAgICAgbGV0IHJlc3VsdDogc3RyaW5nID0gbnVsbDtcclxuLy8gICAgIHRyeSB7XHJcbi8vICAgICAgIGxldCBmbGFnOiBib29sZWFuID0gIXRoaXMuX2ZhaWxlZDtcclxuLy8gICAgICAgaWYgKCFmbGFnKSB7XHJcbi8vICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKFwiQ2xpZW50TG9nU2VxdWVuY2UgOiBMb2dpbmcgY2xpZW50IHNlcXVlbmNlIGlzIGRlYWN0aXZhdGVkXCIpO1xyXG4vLyAgICAgICB9XHJcbi8vICAgICAgIHRoaXMuX2NsaWVudExvZ09zLkNsb3NlKCk7XHJcbi8vICAgICAgIHRoaXMuX2NsaWVudExvZ09zID0gbnVsbDtcclxuLy8gICAgICAgcmVzdWx0ID0gSGFuZGxlRmlsZXMucmVhZFRvU3RyaW5nKHRoaXMuX2ZpbGVOYW1lLCBFbmNvZGluZy5EZWZhdWx0KTtcclxuLy8gICAgICAgdGhpcy5PcGVuRm9yV3JpdGUoKTtcclxuLy8gICAgIH1cclxuLy8gICAgIGNhdGNoIChleCkge1xyXG4vLyAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikge1xyXG4vLyAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKGV4Lk1lc3NhZ2UpO1xyXG4vLyAgICAgICAgIE1pc2MuV3JpdGVTdGFja1RyYWNlKGV4LCBOQ29uc29sZS5FcnJvcik7XHJcbi8vICAgICAgIH1cclxuLy8gICAgICAgZWxzZVxyXG4vLyAgICAgICAgIHRocm93IGV4O1xyXG4vLyAgICAgfVxyXG4vLyAgICAgcmV0dXJuIHJlc3VsdDtcclxuLy8gICB9XHJcbi8vXHJcbi8vICAgUmVzZXQoKTogdm9pZCB7XHJcbi8vICAgICB0cnkge1xyXG4vLyAgICAgICBsZXQgZmxhZzogYm9vbGVhbiA9ICF0aGlzLl9mYWlsZWQ7XHJcbi8vICAgICAgIGlmICghZmxhZykge1xyXG4vLyAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihcIkNsaWVudExvZ1NlcXVlbmNlIDogTG9naW5nIGNsaWVudCBzZXF1ZW5jZSBpcyBkZWFjdGl2YXRlZFwiKTtcclxuLy8gICAgICAgfVxyXG4vLyAgICAgICB0aGlzLl9jbGllbnRMb2dPcy5DbG9zZSgpO1xyXG4vLyAgICAgICB0aGlzLl9jbGllbnRMb2dPcyA9IG51bGw7XHJcbi8vICAgICAgIEhhbmRsZUZpbGVzLmRlbGV0ZUZpbGUodGhpcy5fZmlsZU5hbWUpO1xyXG4vLyAgICAgfVxyXG4vLyAgICAgY2F0Y2ggKGV4KSB7XHJcbi8vICAgICAgIGlmIChleCBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKSB7XHJcbi8vICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2coZXgpO1xyXG4vLyAgICAgICB9XHJcbi8vICAgICAgIGVsc2VcclxuLy8gICAgICAgICB0aHJvdyBleDtcclxuLy8gICAgIH1cclxuLy8gICB9XHJcbi8vXHJcbi8vICAgc3RhdGljIEV4aXN0aW5nTG9nc0ZvdW5kKCk6IGJvb2xlYW4ge1xyXG4vLyAgICAgbGV0IHJlc3VsdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4vLyAgICAgQ2xpZW50TG9nQWNjdW11bGF0b3IuQnVpbGRleGlzdGluZ0xvZ0xpc3QoKTtcclxuLy8gICAgIGxldCBmbGFnOiBib29sZWFuID0gQ2xpZW50TG9nQWNjdW11bGF0b3IuX2V4aXN0aW5nTG9nTmFtZXMgIT09IG51bGwgJiYgQ2xpZW50TG9nQWNjdW11bGF0b3IuX2V4aXN0aW5nTG9nTmFtZXMuQ291bnQgPiAwO1xyXG4vLyAgICAgaWYgKGZsYWcpIHtcclxuLy8gICAgICAgcmVzdWx0ID0gdHJ1ZTtcclxuLy8gICAgIH1cclxuLy8gICAgIHJldHVybiByZXN1bHQ7XHJcbi8vICAgfVxyXG4vL1xyXG4vLyAgIHN0YXRpYyBFeGlzdGluZ0xvZ0l0ZXJhdG9yKCk6IElFbnVtZXJhdG9yPHN0cmluZz4ge1xyXG4vLyAgICAgcmV0dXJuIENsaWVudExvZ0FjY3VtdWxhdG9yLl9leGlzdGluZ0xvZ05hbWVzLkdldEVudW1lcmF0b3IoKTtcclxuLy8gICB9XHJcbi8vXHJcbi8vICAgc3RhdGljIEJ1aWxkTG9nSGVhZGVyTGluZShsb2dOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4vLyAgICAgbGV0IHN0cmluZ0J1aWxkZXI6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcihcIkNsaWVudCBsb2cgZmlsZVwiKTtcclxuLy8gICAgIGxldCBzdHI6IHN0cmluZyA9IE5TdHJpbmcuU3Vic3RyaW5nKGxvZ05hbWUsIGxvZ05hbWUuTGFzdEluZGV4T2YoTk51bWJlci5Ub1N0cmluZyhQYXRoLkRpcmVjdG9yeVNlcGFyYXRvckNoYXIpICsgXCJDU1wiKSArIDMsIGxvZ05hbWUuTGFzdEluZGV4T2YoXCIubG9nXCIpIC0gKGxvZ05hbWUuTGFzdEluZGV4T2YoTk51bWJlci5Ub1N0cmluZyhQYXRoLkRpcmVjdG9yeVNlcGFyYXRvckNoYXIpICsgXCJDU1wiKSArIDMpKTtcclxuLy8gICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKFwiIChDb250ZXh0IDogXCIpO1xyXG4vLyAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQoc3RyICsgXCIgKSBcIik7XHJcbi8vICAgICByZXR1cm4gc3RyaW5nQnVpbGRlci5Ub1N0cmluZygpO1xyXG4vLyAgIH1cclxuLy9cclxuLy8gICBFbXB0eSgpOiBib29sZWFuIHtcclxuLy8gICAgIHJldHVybiB0aGlzLl9mYWlsZWQgfHwgIUhhbmRsZUZpbGVzLmlzRXhpc3RzKHRoaXMuX2ZpbGVOYW1lKSB8fCBIYW5kbGVGaWxlcy5nZXRGaWxlU2l6ZSh0aGlzLl9maWxlTmFtZSkgPT09IDA7XHJcbi8vICAgfVxyXG4vL1xyXG4vLyAgIElzRmFpbGVkKCk6IGJvb2xlYW4ge1xyXG4vLyAgICAgcmV0dXJuIHRoaXMuX2ZhaWxlZDtcclxuLy8gICB9XHJcbi8vXHJcbi8vICAgcHJpdmF0ZSBzdGF0aWMgQnVpbGRleGlzdGluZ0xvZ0xpc3QoKTogdm9pZCB7XHJcbi8vICAgICBsZXQgZmxhZzogYm9vbGVhbiA9IENsaWVudExvZ0FjY3VtdWxhdG9yLl9leGlzdGluZ0xvZ05hbWVzICE9PSBudWxsICYmIENsaWVudExvZ0FjY3VtdWxhdG9yLl9leGlzdGluZ0xvZ05hbWVzLkNvdW50ID09PSAwO1xyXG4vLyAgICAgaWYgKGZsYWcpIHtcclxuLy8gICAgICAgbGV0IHBhdGg6IHN0cmluZyA9IFwiXCI7XHJcbi8vICAgICAgIENsaWVudExvZ0FjY3VtdWxhdG9yLl9leGlzdGluZ0xvZ05hbWVzLkFkZFJhbmdlKE5BcnJheS5Ub0VudW1lcmFibGUoRGlyZWN0b3J5LkdldEZpbGVzKHBhdGgsIFwiQ1MqLkxPR1wiKSkpO1xyXG4vLyAgICAgfVxyXG4vLyAgIH1cclxuLy9cclxuLy8gICBwcml2YXRlIE9wZW5Gb3JXcml0ZSgpOiBib29sZWFuIHtcclxuLy8gICAgIGxldCBmbGFnOiBib29sZWFuID0gdGhpcy5fY2xpZW50TG9nT3MgPT09IG51bGw7XHJcbi8vICAgICBpZiAoZmxhZykge1xyXG4vLyAgICAgICB0cnkge1xyXG4vLyAgICAgICAgIHRoaXMuX2NsaWVudExvZ09zID0gbmV3IFN0cmVhbVdyaXRlcih0aGlzLl9maWxlTmFtZSwgdHJ1ZSwgRW5jb2RpbmcuRGVmYXVsdCk7XHJcbi8vICAgICAgICAgdGhpcy5fZmFpbGVkID0gZmFsc2U7XHJcbi8vICAgICAgIH1cclxuLy8gICAgICAgY2F0Y2ggKGV4KSB7XHJcbi8vICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgSU9FeGNlcHRpb24pIHtcclxuLy8gICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiQ2xpZW50TG9nU2VxdWVuY2VzIDogXCIgKyBleC5NZXNzYWdlKTtcclxuLy8gICAgICAgICAgIHRoaXMuX2ZhaWxlZCA9IHRydWU7XHJcbi8vICAgICAgICAgICB0aGlzLl9jbGllbnRMb2dPcyA9IG51bGw7XHJcbi8vICAgICAgICAgICB0aGlzLl9jb250ZXh0SWQgPSAtMTtcclxuLy8gICAgICAgICAgIHRoaXMuX2ZpbGVOYW1lID0gbnVsbDtcclxuLy8gICAgICAgICB9XHJcbi8vICAgICAgICAgZWxzZVxyXG4vLyAgICAgICAgICAgdGhyb3cgZXg7XHJcbi8vICAgICAgIH1cclxuLy8gICAgIH1cclxuLy8gICAgIHJldHVybiAhdGhpcy5fZmFpbGVkO1xyXG4vLyAgIH1cclxuLy9cclxuLy8gICBwcml2YXRlIEJ1aWxkRmlsZU5hbWUoKTogc3RyaW5nIHtcclxuLy8gICAgIHJldHVybiBcIlwiO1xyXG4vLyAgIH1cclxuLy8gfVxyXG4iXX0=
|
|
901
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbmdpbmUvc3JjL3JlbW90ZS9SZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLE1BQU0sRUFDTixVQUFVLEVBQ1YsTUFBTSxFQUNOLGdCQUFnQixFQUNoQixJQUFJLEVBQ0osWUFBWSxFQUNaLGFBQWEsRUFDYixXQUFXLEVBQ1gsT0FBTyxFQUNQLFlBQVksRUFDYixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDeEksT0FBTyxFQUVMLFFBQVEsRUFDUixrQkFBa0IsRUFDbEIsTUFBTSxFQUNOLDJCQUEyQixFQUM1QixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSw0Q0FBNEMsQ0FBQztBQUUzRSxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLHdDQUF3QyxFQUN4QyxrQ0FBa0MsRUFDbkMsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUM1QyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRTFDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBQyxrQkFBa0IsRUFBVyxNQUFNLG1CQUFtQixDQUFDO0FBQy9ELE9BQU8s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VSxFQUFFLENBQUMsQ0FBQztZQUM5QyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3BCLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDbEI7UUFFRCxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRU8sd0JBQXdCO1FBQzlCLElBQUksT0FBTyxHQUFZLEtBQUssQ0FBQztRQUM3QixJQUFJLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxDQUFDLEVBQUU7WUFDckMsSUFBSSxhQUFhLEdBQVcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDekQsT0FBTyxHQUFHLENBQUMsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUM3RjtRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQmFzZTY0LFxyXG4gIEpTT05fVXRpbHMsXHJcbiAgTG9nZ2VyLFxyXG4gIExvZ2dlcl9Mb2dMZXZlbHMsXHJcbiAgTWlzYyxcclxuICBNc2dJbnRlcmZhY2UsXHJcbiAgT1NFbnZpcm9ubWVudCxcclxuICBSZXF1ZXN0SW5mbyxcclxuICBTdHJVdGlsLFxyXG4gIFhNTENvbnN0YW50c1xyXG59IGZyb20gXCJAbWFnaWMteHBhL3V0aWxzXCI7XHJcbmltcG9ydCB7RGVidWcsIEVuY29kaW5nLCBFeGNlcHRpb24sIExpc3QsIE5TdHJpbmcsIFJlZlBhcmFtLCBTdHJpbmdCdWlsZGVyLCBpc051bGxPclVuZGVmaW5lZCwgaXNVbmRlZmluZWR9IGZyb20gXCJAbWFnaWMteHBhL21zY29yZWxpYlwiO1xyXG5pbXBvcnQge1xyXG4gIEF1dGhlbnRpY2F0aW9uRGlhbG9nSGFuZGxlcixcclxuICBDb21tYW5kcyxcclxuICBSdW50aW1lQ29udGV4dEJhc2UsXHJcbiAgU3R5bGVzLFxyXG4gIFVzZXJuYW1lUGFzc3dvcmRDcmVkZW50aWFsc1xyXG59IGZyb20gXCJAbWFnaWMteHBhL2d1aVwiO1xyXG5pbXBvcnQge0V4ZWNPcGVyQ29tbWFuZH0gZnJvbSAnLi4vY29tbWFuZHMvQ2xpZW50VG9TZXJ2ZXIvRXhlY09wZXJDb21tYW5kJztcclxuaW1wb3J0IHtUYXNrfSBmcm9tICcuLi90YXNrcy9UYXNrJ1xyXG5pbXBvcnQge1xyXG4gIENvbW1hbmRzUHJvY2Vzc29yQmFzZSxcclxuICBDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLFxyXG4gIENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZXNzaW9uU3RhZ2VcclxufSBmcm9tIFwiLi4vQ29tbWFuZHNQcm9jZXNzb3JCYXNlXCI7XHJcbmltcG9ydCB7SHR0cE1hbmFnZXJ9IGZyb20gXCIuLi9odHRwL0h0dHBNYW5hZ2VyXCI7XHJcbmltcG9ydCB7Q29uc3RJbnRlcmZhY2V9IGZyb20gXCIuLi9Db25zdEludGVyZmFjZVwiO1xyXG5pbXBvcnQge1NjcmFtYmxlcn0gZnJvbSBcIi4uL3V0aWwvU2NyYW1ibGVyXCI7XHJcbmltcG9ydCB7U2VydmVyRXJyb3J9IGZyb20gXCIuL1NlcnZlckVycm9yXCI7XHJcbmltcG9ydCB7SVJlc3VsdFZhbHVlfSBmcm9tIFwiLi4vcnQvSVJlc3VsdFZhbHVlXCI7XHJcbmltcG9ydCB7Rmxvd01vbml0b3JRdWV1ZX0gZnJvbSBcIi4uL3V0aWwvRmxvd01vbml0b3JRdWV1ZVwiO1xyXG5pbXBvcnQge09wZW5pbmdUYXNrRGV0YWlscywgVGFza0Jhc2V9IGZyb20gXCIuLi90YXNrcy9UYXNrQmFzZVwiO1xyXG5pbXBvcnQge0h0dHBVdGlsaXR5fSBmcm9tIFwiLi4vaHR0cC9jbGllbnQvSHR0cFV0aWxpdHlcIjtcclxuaW1wb3J0IHtIdHRwQ2xpZW50RXZlbnRzfSBmcm9tIFwiLi4vaHR0cC9jbGllbnQvSHR0cENsaWVudEV2ZW50c1wiO1xyXG5pbXBvcnQge1NlcnZlckNvbmZpZ30gZnJvbSBcIi4uL1NlcnZlckNvbmZpZ1wiO1xyXG5pbXBvcnQge01HRGF0YX0gZnJvbSBcIi4uL3Rhc2tzL01HRGF0YVwiO1xyXG5pbXBvcnQge0NvbW1hbmRzVGFibGV9IGZyb20gXCIuLi9Db21tYW5kc1RhYmxlXCI7XHJcbmltcG9ydCB7QWNjZXNzSGVscGVyfSBmcm9tIFwiLi4vQWNjZXNzSGVscGVyXCI7XHJcbmltcG9ydCB7RW52aXJvbm1lbnQsIEV2ZW50LCBFdmVudENvbW1hbmQsIEV2ZW50c01hbmFnZXIsIEdVSU1hbmFnZXIsIElDbGllbnRDb21tYW5kLCBSdW5UaW1lRXZlbnR9IGZyb20gXCIuLi8uLi9cIjtcclxuaW1wb3J0IHtJQ2xpZW50VG9TZXJ2ZXJDb21tYW5kSW5mb30gZnJvbSBcIi4uL2NvbW1hbmRzL0lDbGllbnRUb1NlcnZlckNvbW1hbmRJbmZvXCI7XHJcbmltcG9ydCB7TUdEYXRhQ29sbGVjdGlvbn0gZnJvbSBcIi4uL3Rhc2tzL01HRGF0YUNvbGxlY3Rpb25cIjtcclxuaW1wb3J0IHtTdWJzY3JpcHRpb24sIHRpbWVyfSBmcm9tIFwicnhqc1wiO1xyXG5cclxuLy8vIDxzdW1tYXJ5PiBSZXByZXNlbnRzIHRoZSBzdGF0dXMgb2YgYSByZXF1ZXN0IDwvc3VtbWFyeT5cclxuZW51bSAgUmVxdWVzdFN0YXR1c1xyXG57XHJcbiAgSGFuZGxlZCwgLy90aGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IGhhbmRsZWQuXHJcbiAgUmV0cnksICAgLy90aGUgcmVxdWVzdCBzaG91bGQgYmUgcmUtc2VudC5cclxuICBBYm9ydCAgIC8vdGhlIHJlcXVlc3QgY291bGQgbm90IGJlIGhhbmRsZWQgYW5kIHNob3VsZCBiZSBhYm9ydGVkLlxyXG59XHJcblxyXG4vLyBAZHluYW1pY1xyXG5leHBvcnQgY2xhc3MgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IgZXh0ZW5kcyBDb21tYW5kc1Byb2Nlc3NvckJhc2Uge1xyXG4gIHN0YXRpYyByZWFkb25seSBSQ19OT19DT05URVhUX0lEOiBzdHJpbmcgPSAnLTEnO1xyXG4gIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IgPSBudWxsO1xyXG4gIHB1YmxpYyBzdGF0aWMgSXNTZXNzaW9uUmVJbml0aWFsaXppbmcgPSBmYWxzZTtcclxuICBwcml2YXRlIHN0YXRpYyBsYXN0RXhjZXB0aW9uTWVzc2FnZSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgSW5pdGlhbFVybDogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgLy8gVE9ETyAtIG1vdmUgaXQgdG8gY2xhc3NcclxuICBwcml2YXRlIHN0YXRpYyByZXF1ZXN0TnVtYmVyID0gMDtcclxuICBwcml2YXRlIHN0YXRpYyB0b3RhbFRpbWVGb3JIVFRQUmVxdWVzdHMgPSAwO1xyXG4gIHByaXZhdGUgc3RhdGljIHRvdGFsUmVxdWVzdERhdGFMZW5ndGggPSAwO1xyXG4gIHByaXZhdGUgc3RhdGljIHRvdGFsUmVzcG9uc2VEYXRhTGVuZ3RoID0gMDtcclxuXHJcbiAgLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gIC8vICoqKioqKioqIFdoZW4gY2hhbmdpbmcgV0VCX0NPTU1VTklDQVRJT05fUFJPVE9DT0xfVkVSU0lPTiwgcGxlYXNlIGNoYW5nZSBvbiBtb2JpbGUgcGxhdGZvcm1zIGFzIHdlbGw6XHJcbiAgLy8gKioqKioqKiogVzEwTTogUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuY3NcclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBXRUJfQ09NTVVOSUNBVElPTl9QUk9UT0NPTF9WRVJTSU9OOiBzdHJpbmcgPSBcIjE0MDAyXCI7XHJcbiAgLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cclxuICAvLyBUT0RPOiBDaGVjayBpZiB3ZSBuZWVkIF9sb2dBY2N1bXVsYXRvci5cclxuICAvLyBwcml2YXRlIF9sb2dBY2N1bXVsYXRvcjogQ2xpZW50TG9nQWNjdW11bGF0b3IgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIF9sYXN0UmVxdWVzdFRpbWU6IG51bWJlciA9IDA7IC8vIHRoZSB0aW1lIG9mIHRoZSBsYXN0IHJlcXVlc3QgdG8gdGhlIHNlcnZlclxyXG5cclxuICBTZXJ2ZXJVcmw6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgX3Nob3VsZFNjcmFtYmxlQW5kVW5zY3JhbWJsZU1lc3NhZ2VzOiBib29sZWFuID0gZmFsc2U7IC8vIHN0YXRpYyBiZWNhdXNlIGl0IGlzIGluaXRpYWxpemVkIGJlZm9yZSB0aGUgZXhlY3V0aW9uIHByb3BzIGFyZSBhdmFpbGFibGVcclxuXHJcbiAgcHVibGljIFNlc3Npb25JZDogc3RyaW5nO1xyXG5cclxuICBwdWJsaWMgRGVsYXlDb21tYW5kRXhlY3V0aW9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfcmVxdWVzdEluZm8gPSBuZXcgUmVxdWVzdEluZm8oKTtcclxuXHJcbiAgc3RhdGljIEdldEluc3RhbmNlKCk6IFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yIHtcclxuICAgIGlmIChSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5faW5zdGFuY2UgPT09IG51bGwpIHtcclxuICAgICAgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuX2luc3RhbmNlID0gbmV3IFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLl9pbnN0YW5jZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy5TZXJ2ZXJVcmwgPSBTZXJ2ZXJDb25maWcuSW5zdGFuY2UuZ2V0U2VydmVyVVJMKCk7XHJcblxyXG4gICAgSHR0cE1hbmFnZXIuR2V0SW5zdGFuY2UoKTtcclxuXHJcbiAgICB0aGlzLlJlZ2lzdGVyRGVsZWdhdGVzKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIENoZWNrcyB0aGF0IHNlc3Npb24gY291bnRlciBpcyBjb25zZWN1dGl2ZSBkdXJpbmcgdGhlIHNlc3Npb24gYW5kIHNldHMgbmV3IHZhbHVlLlxyXG4gIC8vLyBUaGUgb25seSBleGNlcHRpb24gaXMgaW4gY2FzZSB0aGUgY2xpZW50IHNlbnQgdG8gdGhlIHNlcnZlciBDb25zdEludGVyZmFjZS5TRVNTSU9OX0NPVU5URVJfQ0xPU0VfQ1RYX0lORElDQVRJT04sXHJcbiAgLy8vICAgIHRoZSBzZXJ2ZXIgaXMgZXhwZWN0ZWQgdG8gcmV0dXJuIENvbnN0SW50ZXJmYWNlLlNFU1NJT05fQ09VTlRFUl9DTE9TRV9DVFhfSU5ESUNBVElPTiBpbiByZXNwb25zZSAoUmVxdWVzdHNTZXJ2ZXJCYXNlOjpQcm9jZXNzUmVxdWVzdCksIHRvIGFja25vd2xlZGdlIHRoZSByZXF1ZXN0IHRvIGNsb3NlIHRoZSBjb250ZXh0LlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibmV3U2Vzc2lvbkNvdW50ZXJcIj4hIS48L3BhcmFtPlxyXG4gIENoZWNrQW5kU2V0U2Vzc2lvbkNvdW50ZXIobmV3U2Vzc2lvbkNvdW50ZXI6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKG5ld1Nlc3Npb25Db3VudGVyID09PSBDb25zdEludGVyZmFjZS5TRVNTSU9OX0NPVU5URVJfQ0xPU0VfQ1RYX0lORElDQVRJT04pIHtcclxuICAgICAgRGVidWcuQXNzZXJ0KHRoaXMuR2V0U2Vzc2lvbkNvdW50ZXIoKSA9PT0gQ29uc3RJbnRlcmZhY2UuU0VTU0lPTl9DT1VOVEVSX0NMT1NFX0NUWF9JTkRJQ0FUSU9OKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBEZWJ1Zy5Bc3NlcnQobmV3U2Vzc2lvbkNvdW50ZXIgPT09IHRoaXMuR2V0U2Vzc2lvbkNvdW50ZXIoKSArIDEpO1xyXG4gICAgICB0aGlzLlNldFNlc3Npb25Db3VudGVyKG5ld1Nlc3Npb25Db3VudGVyKTtcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlU2VydmVyVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJTZXNzaW9uIENvdW50ZXIgLS0+IHswfVwiLCB0aGlzLl9zZXNzaW9uQ291bnRlcikpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBaZXJvIHNlc3Npb24gY291bnRlciB3aGVuIHJlaW5pdGlhbGl6aW5nIHNlcnZlciBjb21tdW5pY2F0aW9uIGRldGFpbHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgQ2xlYXJTZXNzaW9uQ291bnRlcigpOiB2b2lkXHJcbiAge1xyXG4gICAgdGhpcy5fc2Vzc2lvbkNvdW50ZXIgPSAwO1xyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlU2VydmVyVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJTZXNzaW9uIENvdW50ZXIgLS0+IHswfVwiLCB0aGlzLl9zZXNzaW9uQ291bnRlcikpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibmV3U2Vzc2lvbkNvdW50ZXJcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgU2V0U2Vzc2lvbkNvdW50ZXIobmV3U2Vzc2lvbkNvdW50ZXI6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fc2Vzc2lvbkNvdW50ZXIgPSBuZXdTZXNzaW9uQ291bnRlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgR2V0TGFzdFJlcXVlc3RUaW1lKCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fbGFzdFJlcXVlc3RUaW1lO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZVN0YXJ0U2Vzc2lvblxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgUmVTdGFydFNlc3Npb24oICk6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLklzU2Vzc2lvblJlSW5pdGlhbGl6aW5nID0gdHJ1ZTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLlN0b3JlU2Vzc2lvblJlSW5pdGlhbGl6aW5nRGF0YU9uTG9jYWxTdG9yYWdlKCk7XHJcbiAgICBsZXQgbmF2aWdhdGVSb290Um91dGUgPSBmYWxzZTtcclxuICAgIGlmICghUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlJlbW92ZWRDb250ZXh0RnJvbVNlcnZlcilcclxuICAgICAgbmF2aWdhdGVSb290Um91dGUgPSBFbnZpcm9ubWVudC5JbnN0YW5jZS5nZXRTcGVjaWFsUm91dGVUb1Jvb3RQcm9nT25Db250ZXh0UmVjcmVhdGlvbigpID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgQ29tbWFuZHMuYWRkUmVmcmVzaFBhZ2UobmF2aWdhdGVSb290Um91dGUsIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkluaXRpYWxVcmwpO1xyXG4gICAgLy9zdG9wIHRoZSBleGVjdXRpb24gYnkgdGhyb3dpbmcgZXhjZXB0aW9uLlxyXG4gICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignJyk7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBTdG9yZVNlc3Npb25SZUluaXRpYWxpemluZ0RhdGFPbkxvY2FsU3RvcmFnZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgU3RvcmVTZXNzaW9uUmVJbml0aWFsaXppbmdEYXRhT25Mb2NhbFN0b3JhZ2UgKCkgOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICBsZXQgbWFpblByZ1ZpZXdTdHJpbmdGb3JTZXJ2ZXIgPSBhd2FpdCB0aGlzLkJ1aWxkWE1MRm9yTWFpblByb2dyYW1EYXRhVmlldygpO1xyXG4gICAgbGV0IGdsb2JhbFBhcmFtc1N0cmluZyA9IEFjY2Vzc0hlbHBlci5nbG9iYWxQYXJhbXMubWlycm9yQWxsVG9YTUwoKTtcclxuXHJcbiAgICAvLyBzdG9yZSBtYWluUHJnVmlld1N0cmluZ0ZvclNlcnZlciwgSXNTZXNzaW9uUmVJbml0aWFsaXppbmcgYW5kIGdsb2JhbFBhcmFtc1N0cmluZyBvbiBsb2NhbFxyXG4gICAgLy8gc3RvcmFnZSBpbiBvcmRlciB0byB1c2UgaXQgZm9yIG5leHQgc2Vzc2lvbi5cclxuICAgIGxldCBkYXRhU3RvcmFnZSA9IHdpbmRvdy5sb2NhbFN0b3JhZ2U7XHJcbiAgICBkYXRhU3RvcmFnZS5zZXRJdGVtKENvbnN0SW50ZXJmYWNlLklTX1NFU1NJT05fUkVJTklUSUFMSVpJTkcsIFwidHJ1ZVwiKTtcclxuICAgIGRhdGFTdG9yYWdlLnNldEl0ZW0oQ29uc3RJbnRlcmZhY2UuTUFJTl9QUk9HX1ZJRVcsIG1haW5QcmdWaWV3U3RyaW5nRm9yU2VydmVyLnRvU3RyaW5nKCkpO1xyXG4gICAgZGF0YVN0b3JhZ2Uuc2V0SXRlbShDb25zdEludGVyZmFjZS5HTE9CQUxfUEFSQU1fTElTVCwgZ2xvYmFsUGFyYW1zU3RyaW5nKTtcclxuICAgIGRhdGFTdG9yYWdlLnNldEl0ZW0oQ29uc3RJbnRlcmZhY2UuTEFTVF9FWENFUFRJT04sIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLmxhc3RFeGNlcHRpb25NZXNzYWdlKTtcclxuICAgIGlmIChSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUmVtb3ZlZENvbnRleHRGcm9tU2VydmVyKVxyXG4gICAgICBkYXRhU3RvcmFnZS5zZXRJdGVtKENvbnN0SW50ZXJmYWNlLkNUWF9SRU1PVkVEX0ZST01fU1JWUiwgXCIxXCIpO1xyXG5cclxuICAgIEV2ZW50c01hbmFnZXIuSW5zdGFuY2Uuc3RvcmVMYXN0U2F2ZWRSb3V0ZUV2ZW50T25Mb2NhbFN0b3JhZ2UgKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJlc3RvcmVTZXNzaW9uUmVJbml0aWFsaXppbmdEYXRhRnJvbUxvY2FsU3RvcmFnZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgUmVzdG9yZVNlc3Npb25SZUluaXRpYWxpemluZ0RhdGFGcm9tTG9jYWxTdG9yYWdlIChrZXk6IHN0cmluZyApOnN0cmluZyB7XHJcblxyXG4gICAgbGV0IGRhdGFTdG9yYWdlID0gd2luZG93LmxvY2FsU3RvcmFnZTtcclxuICAgIGxldCB2YWwgPSBkYXRhU3RvcmFnZS5nZXRJdGVtKGtleSk7XHJcbiAgICByZXR1cm4gdmFsO1xyXG4gIH1cclxuXHJcbiAgICAvLy8gPHN1bW1hcnk+UHJlcGFyZSBhbmQgZXhlY3V0ZSB0aGUgMXN0ICYgMm5kIGhhbmRzaGFrZSByZXF1ZXN0czpcclxuICAvLy8gMXN0IHJlcXVlc3Q6ICBVVEY4VFJBTlM9Li4mYXBwbmFtZT0uLiZwcmduYW1lPS4uJmFyZ3VtZW50cz0tQTxSaWNoY2xpZW50PjxSZXF1ZXN0aW5nVmVyc2lvbkRldGFpbHM9XCIuLlwiLz48L1JpY2hjbGllbnQ+XHJcbiAgLy8vICAgICByZXNwb25zZTogaW5zdHJ1Y3Rpb25zIHRvIHRoZSBjbGllbnQgLSB3aGV0aGVyIHRvIGRpc3BsYXkgYXV0aGVudGljYXRpb24gZGlhbG9nLCB0aGUgc2VydmVyJ3MgdmVyc2lvbiwgYW5kIG1vcmUgLi5cclxuICAvLy8gICAgICAgICAgICAgICBlLmcuIDxSaWNoY2xpZW50cmVzcG9uc2U+PENvbnRleHRJRD4xMjAzMDg3ODk3MjYzNzEyMDA8L0NvbnRleHRJRD48RW52aXJvbm1lbnQgSW5wdXRQYXNzd29yZD1cIk5cIiBTeXN0ZW1Mb2dpbj1cIk5cIiBTY3JhbWJsZU1lc3NhZ2VzPVwiTlwiIE1heEludGVybmFsTG9nTGV2ZWw9XCJTZXJ2ZXIjXCIgSHR0cFRpbWVvdXQ9XCIxMFwiIENsaWVudE5ldHdvcmtSZWNvdmVyeUludGVydmFsPVwiMFwiIEZvcndhcmRTbGFzaD1cIndlYlwiLz48L1JpY2hjbGllbnRyZXNwb25zZT5cclxuICAvLy8gMm5kIHJlcXVlc3Q6IGF1dGhlbnRpY2F0aW9uIChvcHRpb25hbCwgZGVwZW5kaW5nIG9uIHRoZSAxc3QgcmVxdWVzdCkuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+dHJ1ZSBvbmx5IGlmIHRoZSBjbGllbnQgc2hvdWxkIGNvbnRpbnVlIHRvIHN0YXJ0IHRoZSBhY3R1YWwgcHJvZ3JhbSAoaS5lLiBhZnRlciBoYW5kc2hha2UpLjwvcmV0dXJucz5cclxuICBhc3luYyBTdGFydFNlc3Npb24oKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgYXV0aGVudGljYXRpb25DYW5jZWxsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBoYW5kc2hha2VSZXNwb25zZTogSGFuZHNoYWtlUmVzcG9uc2UgPSBudWxsO1xyXG4gICAgbGV0IGRpYWxvZzogQXV0aGVudGljYXRpb25EaWFsb2dIYW5kbGVyID0gbnVsbDtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgbGFzdFR5cGVkVXNlcklkOiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICAvLyAxc3QgaGFuZHNoYWtlIHJlcXVlc3Q6IHByZXBhcmUgMXN0IGhhbmRzaGFrZSByZXF1ZXN0IGFuZCBzY3JhbWJsZSBpdFxyXG4gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAgIGxldCBoYW5kc2hha2VJbml0aWFsVG9rZW5zOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgICAgaGFuZHNoYWtlSW5pdGlhbFRva2Vucy5BcHBlbmQoQ29uc3RJbnRlcmZhY2UuVVRGOFRSQU5TICtcclxuICAgICAgICBDb25zdEludGVyZmFjZS5SRVFfQVBQX05BTUUgKyBcIj1cIiArXHJcbiAgICAgICAgSHR0cFV0aWxpdHkuVXJsRW5jb2RlKFNlcnZlckNvbmZpZy5JbnN0YW5jZS5nZXRBcHBOYW1lKCksIEVuY29kaW5nLlVURjgpKTtcclxuXHJcbiAgICAgIGhhbmRzaGFrZUluaXRpYWxUb2tlbnMuQXBwZW5kKFwiJlwiICsgQ29uc3RJbnRlcmZhY2UuUkVRX0FSR1MgKyBcIj1cIiArIENvbnN0SW50ZXJmYWNlLlJFUV9BUkdfQUxQSEEgK1xyXG4gICAgICBcIjxSaWNoY2xpZW50PjxSZXF1aXJlcyBFbmNyeXB0aW9uS2V5PVxcXCJGYWxzZVxcXCIvPjxSSUFQcm90b2NvbFZlcnNpb249XFxcIlwiICsgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuV0VCX0NPTU1VTklDQVRJT05fUFJPVE9DT0xfVkVSU0lPTiArIFwiXFxcIi8+PC9SaWNoY2xpZW50PlwiKTtcclxuXHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKE5TdHJpbmcuRm9ybWF0KFwiSGFuZHNoYWtlIHJlcXVlc3QgIzEgKG5vdCBzY3JhbWJsZWQpIDogezB9XCIsXHJcbiAgICAgICAgdGhpcy5TZXJ2ZXJVcmwgKyBDb25zdEludGVyZmFjZS5SRVFfQVJHX1NUQVJUICtcclxuICAgICAgICBDb25zdEludGVyZmFjZS5SQ19JTkRJQ0FUSU9OX0lOSVRJQUwgKyBoYW5kc2hha2VJbml0aWFsVG9rZW5zKSk7XHJcblxyXG4gICAgICBsZXQgaGFuZHNoYWtlSW5pdGlhbFVybDogc3RyaW5nID0gdGhpcy5TZXJ2ZXJVcmwgKyBDb25zdEludGVyZmFjZS5SRVFfQVJHX1NUQVJUICtcclxuICAgICAgICBDb25zdEludGVyZmFjZS5SQ19JTkRJQ0FUSU9OX0lOSVRJQUwgK1xyXG4gICAgICAgIENvbnN0SW50ZXJmYWNlLlJDX1RPS0VOX0RBVEEgK1xyXG4gICAgICAgIEh0dHBVdGlsaXR5LlVybEVuY29kZShTY3JhbWJsZXIuU2NyYW1ibGUoaGFuZHNoYWtlSW5pdGlhbFRva2Vucy5Ub1N0cmluZygpKSwgRW5jb2RpbmcuVVRGOCk7XHJcblxyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTZXJ2ZXJNZXNzYWdlc1RvTG9nKFwiXCIpO1xyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTZXJ2ZXJNZXNzYWdlc1RvTG9nKE5TdHJpbmcuRm9ybWF0KFwiSGFuZHNoYWtlIHJlcXVlc3QgIzE6IHswfVwiLCBoYW5kc2hha2VJbml0aWFsVXJsKSk7XHJcblxyXG4gICAgICAvLyBJbml0aWFsaXplIHRlbXAgY3R4R3JvdXAgd2l0aCBDdHhHcm91cCBmcm9tIGV4ZWN1dGlvbi5wcm9wZXJ0aWVzXHJcbiAgICAgIGxldCBjdHhHcm91cDogc3RyaW5nID0gU2VydmVyQ29uZmlnLkluc3RhbmNlLmdldEN0eEdyb3VwKCk7XHJcblxyXG4gICAgICB3aGlsZSAoIWF1dGhlbnRpY2F0aW9uQ2FuY2VsbGVkKSB7XHJcbiAgICAgICAgbGV0IHJlcXVlc3RTdGF0dXM6IFJlZlBhcmFtPFJlcXVlc3RTdGF0dXM+ID0gbmV3IFJlZlBhcmFtKFJlcXVlc3RTdGF0dXMuSGFuZGxlZCk7XHJcbiAgICAgICAgLy8gZXhlY3V0ZSB0aGUgMXN0IHJlcXVlc3RcclxuICAgICAgICBsZXQgcmVzcG9uc2VTdHI6IHN0cmluZyA9IGF3YWl0IHRoaXMuRGlzcGF0Y2hSZXF1ZXN0KGhhbmRzaGFrZUluaXRpYWxVcmwsIG51bGwsIENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZXNzaW9uU3RhZ2UuSEFORFNIQUtFLCByZXF1ZXN0U3RhdHVzKTtcclxuXHJcbiAgICAgICAgLy8gcHJvY2VzcyB0aGUgMXN0IHJlc3BvbnNlIC0gY2hlY2sgaWYgdGhlIHJlc3BvbnNlIGlzIGVycm9yLCB1bnNjcmFtYmxlIGFuZCBwYXJzZSBpdFxyXG4gICAgICAgIGlmIChOU3RyaW5nLklzTnVsbE9yRW1wdHkocmVzcG9uc2VTdHIpKSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgU2VydmVyRXJyb3IoXCJDbGllbnQgZmFpbGVkIHRvIGluaXRpYWxpemUgYSBzZXNzaW9uLlwiICsgT1NFbnZpcm9ubWVudC5Fb2xTZXEgK1xyXG4gICAgICAgICAgICBcIkVtcHR5IHJlc3BvbnNlIHdhcyByZWNlaXZlZCBmcm9tIHRoZSB3ZWIgc2VydmVyLlwiICsgT1NFbnZpcm9ubWVudC5Fb2xTZXEgKyBPU0Vudmlyb25tZW50LkVvbFNlcSArIHRoaXMuU2VydmVyVXJsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVNlcnZlck1lc3NhZ2VzVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJIYW5kc2hha2UgcmVzcG9uc2UgIzE6IHswfVwiLCByZXNwb25zZVN0cikpO1xyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVNlcnZlck1lc3NhZ2VzVG9Mb2coXCJcIik7XHJcblxyXG4gICAgICAgIGhhbmRzaGFrZVJlc3BvbnNlID0gbmV3IEhhbmRzaGFrZVJlc3BvbnNlKHJlc3BvbnNlU3RyKTtcclxuXHJcbiAgICAgICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkNvbnRleHRJRCA9IGhhbmRzaGFrZVJlc3BvbnNlLkNvbnRleHRJZDtcclxuXHJcbiAgICAgICAgLy8gc2F2ZSBzZXNzaW9uIGlkIG9uIGNsaWVudCB3aGljaCBpcyByZWNlaXZlZCBpbiAxc3QgcmVzcG9uc2UuXHJcbiAgICAgICAgdGhpcy5TZXNzaW9uSWQgPSBoYW5kc2hha2VSZXNwb25zZS5HZXRTZXNzaW9uSWQ7XHJcblxyXG4gICAgICAgIEh0dHBNYW5hZ2VyLkdldEluc3RhbmNlKCkuSHR0cENvbW11bmljYXRpb25UaW1lb3V0TVMgPSBoYW5kc2hha2VSZXNwb25zZS5IdHRwVGltZW91dCAqIDEwMDA7XHJcblxyXG4gICAgICAgIC8vIER1cmluZyBhdXRoZW50aWNhdGlvbiwgaWYgYXV0aGVudGljYXRpb24gZmFpbGVkIHRoZW4gc2VydmVyIHVubG9hZHMgY3R4IGFuZCBjcmVhdGVzIG5ldyBjdHggZm9yIG5leHQgYXV0aGVudGljYXRpb24gcmVxdWVzdC5cclxuICAgICAgICAvLyBTbyBldmVyeSB0aW1lIGFmdGVyIGF1dGhlbnRpY2F0aW9uIGZhaWxzIHdlIHJlY2VpdmUgbmV3IGN0eGlkIGZvciBuZXh0IGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QuXHJcbiAgICAgICAgLy8gSGVuY2UgdGFrZSBjdHhncm91cCBpbiBsb2NhbCB2YXJpYWJsZSBhbmQgdXBkYXRlIENsaWVudE1hbmFnZXIgb25seSBhZnRlciBhdXRoZW50aWNhdGlvbiBpcyBkb25lLlxyXG4gICAgICAgIGlmIChOU3RyaW5nLklzTnVsbE9yRW1wdHkoU2VydmVyQ29uZmlnLkluc3RhbmNlLmdldEN0eEdyb3VwKCkpKSB7XHJcbiAgICAgICAgICBjdHhHcm91cCA9IGhhbmRzaGFrZVJlc3BvbnNlLkNvbnRleHRJZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAgICAgLy8gMm5kIGhhbmRzaGFrZSByZXF1ZXN0XHJcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgICBsZXQgY3JlZGVudGlhbHM6IFVzZXJuYW1lUGFzc3dvcmRDcmVkZW50aWFscyA9IG51bGw7XHJcbiAgICAgICAgaWYgKFNlcnZlckNvbmZpZy5JbnN0YW5jZS5nZXRTa2lwQXV0aGVudGljYXRpb25EaWFsb2coKSkge1xyXG4gICAgICAgICAgLy8gc2tpcCBhdXRoZW50aWNhdGlvbiAodG8gdGhlIHJ1bnRpbWUtZW5naW5lKSBkaWFsb2dcclxuICAgICAgICAgIGlmIChTZXJ2ZXJDb25maWcuSW5zdGFuY2UuZ2V0VXNlcm5hbWUoKSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAvLyB1c2VyIHRoZSB1c2VySWQgJiBwYXNzd29yZCB0aGF0IHdlcmUgcGFzc2VkLCBhbmQgcmVzZXQgdGhlbSAodGhleSdsbCBiZSBzZXQgYmVsb3csIGlmIGF1dGhlbnRpY2F0ZWQgYnkgdGhlIHJ1bnRpbWUtZW5naW5lKVxyXG4gICAgICAgICAgICBjcmVkZW50aWFscyA9IG5ldyBVc2VybmFtZVBhc3N3b3JkQ3JlZGVudGlhbHMoU2VydmVyQ29uZmlnLkluc3RhbmNlLmdldFVzZXJuYW1lKCksIFNlcnZlckNvbmZpZy5JbnN0YW5jZS5nZXRQYXNzd29yZCgpKTtcclxuICAgICAgICAgICAgU2VydmVyQ29uZmlnLkluc3RhbmNlLnNldFVzZXJuYW1lKFwiXCIpO1xyXG4gICAgICAgICAgICBTZXJ2ZXJDb25maWcuSW5zdGFuY2Uuc2V0UGFzc3dvcmQoXCJcIik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGhhbmRzaGFrZVJlc3BvbnNlLklucHV0UGFzc3dvcmQgJiYgaGFuZHNoYWtlUmVzcG9uc2UuU3lzdGVtTG9naW4gIT09IEhhbmRzaGFrZVJlc3BvbnNlLlNZU1RFTV9MT0dJTl9BRCkge1xyXG4gICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKHRvIHRoZSBydW50aW1lLWVuZ2luZSkgZGlhbG9nXHJcbiAgICAgICAgICBpZiAobGFzdFR5cGVkVXNlcklkICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGxldCB0aXRsZTogc3RyaW5nID0gQWNjZXNzSGVscGVyLmxhbmd1YWdlRGF0YS5nZXRDb25zdE1lc3NhZ2UoTXNnSW50ZXJmYWNlLkJSS1RBQl9TVFJfRVJST1IpO1xyXG4gICAgICAgICAgICBsZXQgZXJyb3I6IHN0cmluZyA9IEFjY2Vzc0hlbHBlci5sYW5ndWFnZURhdGEuZ2V0Q29uc3RNZXNzYWdlKE1zZ0ludGVyZmFjZS5VU1JJTlBfU1RSX0JBRFBBU1NXKTtcclxuICAgICAgICAgICAgYXdhaXQgR1VJTWFuYWdlci5JbnN0YW5jZS5NZXNzYWdlQm94KHRpdGxlLCBlcnJvciwgU3R5bGVzLk1TR0JPWF9JQ09OX0VSUk9SIHwgU3R5bGVzLk1TR0JPWF9CVVRUT05fT0spO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCBhdXRoZW50aWNhdGlvbiBkaWFsb2dcclxuICAgICAgICAgIC8vIGxldCB1c2VySWQ6IHN0cmluZyA9IGxhc3RUeXBlZFVzZXJJZDtcclxuICAgICAgICAgIC8vXHJcbiAgICAgICAgICAvLyBpZiAoZGlhbG9nID09PSBudWxsKSB7XHJcbiAgICAgICAgICAvLyAgIGRpYWxvZyA9IG5ldyBBdXRoZW50aWNhdGlvbkRpYWxvZ0hhbmRsZXIodXNlcklkLCBHZXRMb2dvbkRpYWxvZ0V4ZWNQcm9wcygpKTtcclxuICAgICAgICAgIC8vIH1cclxuICAgICAgICAgIC8vIGRpYWxvZy5vcGVuRGlhbG9nKCk7XHJcblxyXG4gICAgICAgICAgLy8gY3JlZGVudGlhbHMgPSBkaWFsb2cuZ2V0Q3JlZGVudGlhbHMoKTtcclxuICAgICAgICAgIC8vIGlmIChjcmVkZW50aWFscyAhPT0gbnVsbClcclxuICAgICAgICAgIC8vICAgbGFzdFR5cGVkVXNlcklkID0gY3JlZGVudGlhbHMuVXNlcm5hbWU7XHJcbiAgICAgICAgICAvLyBlbHNlXHJcbiAgICAgICAgICAvLyAgIGF1dGhlbnRpY2F0aW9uQ2FuY2VsbGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIENvbnN0SW50ZXJmYWNlLlNFU1NJT05fQ09VTlRFUl9DTE9TRV9DVFhfSU5ESUNBVElPTiBpbnN0cnVjdHMgdGhlIHNlcnZlciB0byBjbG9zZSB0aGUgY29udGV4dC5cclxuICAgICAgICAvLyAobm90ZTogdW5sb2FkaW5nIGEgY29udGV4dCBwb3N0IGhhbmRzaGFrZSBzaG91bGQgYmUgZG9uZSB1c2luZyBDb21tYW5kLmNyZWF0ZVVubG9hZENvbW1hbmQpLlxyXG4gICAgICAgIGlmIChhdXRoZW50aWNhdGlvbkNhbmNlbGxlZCkge1xyXG4gICAgICAgICAgdGhpcy5TZXRTZXNzaW9uQ291bnRlcihDb25zdEludGVyZmFjZS5TRVNTSU9OX0NPVU5URVJfQ0xPU0VfQ1RYX0lORElDQVRJT04pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGhhbmRzaGFrZUF1dGhVcmw6IHN0cmluZyA9IHRoaXMuUHJlcGFyZUF1dGhlbnRpY2F0aW9uVXJsKGhhbmRzaGFrZVJlc3BvbnNlLkNvbnRleHRJZCwgY3R4R3JvdXAsIHRoaXMuR2V0U2Vzc2lvbkNvdW50ZXIoKSk7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBpZiAoY3JlZGVudGlhbHMgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgbGV0IGNyZWRlbnRpYWxzU3RyOiBzdHJpbmcgPSBjcmVkZW50aWFscy5Vc2VybmFtZSArIFwiOlwiO1xyXG4gICAgICAgICAgICBpZiAoIU5TdHJpbmcuSXNOdWxsT3JFbXB0eShjcmVkZW50aWFscy5QYXNzd29yZCkpIHtcclxuICAgICAgICAgICAgICBjcmVkZW50aWFsc1N0ciA9IGNyZWRlbnRpYWxzU3RyICsgY3JlZGVudGlhbHMuUGFzc3dvcmQgKyBcIjpcIjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjcmVkZW50aWFsc1N0ciArPSBoYW5kc2hha2VSZXNwb25zZS5Db250ZXh0SWQ7XHJcbiAgICAgICAgICAgIGNyZWRlbnRpYWxzU3RyID0gU2NyYW1ibGVyLlNjcmFtYmxlKGNyZWRlbnRpYWxzU3RyKTtcclxuICAgICAgICAgICAgY3JlZGVudGlhbHNTdHIgPSBCYXNlNjQuZW5jb2RlKGNyZWRlbnRpYWxzU3RyLCB0cnVlLCBFbmNvZGluZy5VVEY4KTtcclxuICAgICAgICAgICAgaGFuZHNoYWtlQXV0aFVybCArPSAoXCImVVNFUk5BTUU9XCIgKyBIdHRwVXRpbGl0eS5VcmxFbmNvZGUoY3JlZGVudGlhbHNTdHIsIEVuY29kaW5nLlVURjgpKTtcclxuXHJcbiAgICAgICAgICAgIC8vIHNlbmQgMm5kIGhhbmRzaGFrZSByZXF1ZXN0IC0gd2l0aCBhdXRoZW50aWNhdGlvblxyXG4gICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTZXJ2ZXJNZXNzYWdlc1RvTG9nKE5TdHJpbmcuRm9ybWF0KFwiSGFuZHNoYWtlIHJlcXVlc3QgIzI6IHswfVwiLCBoYW5kc2hha2VBdXRoVXJsKSk7XHJcbiAgICAgICAgICAgIGxldCBzdGF0dXNSZXF1ZXN0OiBSZWZQYXJhbTxSZXF1ZXN0U3RhdHVzPiA9IG5ldyBSZWZQYXJhbShSZXF1ZXN0U3RhdHVzLkhhbmRsZWQpO1xyXG4gICAgICAgICAgICByZXNwb25zZVN0ciA9IGF3YWl0IHRoaXMuRGlzcGF0Y2hSZXF1ZXN0KGhhbmRzaGFrZUF1dGhVcmwsIG51bGwsIENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZXNzaW9uU3RhZ2UuSEFORFNIQUtFLCBzdGF0dXNSZXF1ZXN0KTtcclxuXHJcbiAgICAgICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoZSByZXNwb25zZSB3YXNuJ3QgcmVwbGF5ZWRcclxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlU3RyLmluZGV4T2YoaGFuZHNoYWtlUmVzcG9uc2UuQ29udGV4dElkKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmVyRXJyb3IoQWNjZXNzSGVscGVyLmxhbmd1YWdlRGF0YS5nZXRDb25zdE1lc3NhZ2UoTXNnSW50ZXJmYWNlLlVTUklOUF9TVFJfQkFEUEFTU1cpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgU2VydmVyQ29uZmlnLkluc3RhbmNlLnNldFVzZXJuYW1lKGNyZWRlbnRpYWxzLlVzZXJuYW1lKTtcclxuICAgICAgICAgICAgU2VydmVyQ29uZmlnLkluc3RhbmNlLnNldFBhc3N3b3JkKGNyZWRlbnRpYWxzLlBhc3N3b3JkKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgcmVxdWVzdFN0YXR1czogUmVmUGFyYW08UmVxdWVzdFN0YXR1cz4gPSBuZXcgUmVmUGFyYW0oUmVxdWVzdFN0YXR1cy5IYW5kbGVkKTtcclxuICAgICAgICAgICAgLy8gc2VuZCAybmQgaGFuZHNoYWtlIHJlcXVlc3QgLSB3aXRob3V0IGF1dGhlbnRpY2F0aW9uXHJcbiAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVNlcnZlck1lc3NhZ2VzVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJIYW5kc2hha2UgcmVxdWVzdCAjMjogezB9XCIsIGhhbmRzaGFrZUF1dGhVcmwpKTtcclxuICAgICAgICAgICAgcmVzcG9uc2VTdHIgPSBhd2FpdCB0aGlzLkRpc3BhdGNoUmVxdWVzdChoYW5kc2hha2VBdXRoVXJsLCBudWxsLCBDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2Vzc2lvblN0YWdlLkhBTkRTSEFLRSwgcmVxdWVzdFN0YXR1cyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTZXJ2ZXJNZXNzYWdlc1RvTG9nKE5TdHJpbmcuRm9ybWF0KFwiSGFuZHNoYWtlIHJlc3BvbnNlICMyOiB7MH1cIiwgcmVzcG9uc2VTdHIpKTtcclxuICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVNlcnZlck1lc3NhZ2VzVG9Mb2coXCJcIik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBTZXJ2ZXJFcnJvcikge1xyXG4gICAgICAgICAgICBsZXQgc2VydmVyRXJyb3I6IFNlcnZlckVycm9yID0gPFNlcnZlckVycm9yPmV4O1xyXG4gICAgICAgICAgICBpZiAoU2VydmVyQ29uZmlnLkluc3RhbmNlLmdldFNraXBBdXRoZW50aWNhdGlvbkRpYWxvZygpKSB7XHJcbiAgICAgICAgICAgICAgc3dpdGNoIChzZXJ2ZXJFcnJvci5HZXRDb2RlKCkpXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBTZXJ2ZXJFcnJvci5FUlJfQUNDRVNTX0RFTklFRDpcclxuICAgICAgICAgICAgICAgIC8vIEV4dGVybmFsIEF1dGhlbnRpY2F0b3IgYXV0aGVudGljYXRlZCB0aGUgdXNlciwgYWNjZXNzIHRvIHRoZSBhcHBsaWNhdGlvbiB3YXNuJ3QgYXV0aG9yaXplZC5cclxuICAgICAgICAgICAgICAgIGNhc2UgU2VydmVyRXJyb3IuRVJSX0FVVEhFTlRJQ0FUSU9OOlxyXG4gICAgICAgICAgICAgICAgICAvLyBFeHRlcm5hbCBBdXRoZW50aWNhdG9yIGF1dGhlbnRpY2F0ZWQgdGhlIHVzZXIgYnV0IGFwcGxpY2F0aW9uIGF1dGhlbnRpY2F0aW9uIGZhaWxlZFxyXG4gICAgICAgICAgICAgICAgICBTZXJ2ZXJDb25maWcuSW5zdGFuY2Uuc2V0U2tpcEF1dGhlbnRpY2F0aW9uRGlhbG9nKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgdGhyb3cgc2VydmVyRXJyb3I7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyB0aGUgc2Vzc2lvbiB3aWxsIG5ldmVyIHByb3ZpZGUgYSB3YXkgdG8gY2hhbmdlIHRoZSBjcmVkZW50aWFscywgdGhlcmVmb3JlIGFib3J0XHJcbiAgICAgICAgICAgIGlmICghaGFuZHNoYWtlUmVzcG9uc2UuSW5wdXRQYXNzd29yZClcclxuICAgICAgICAgICAgICB0aHJvdyBzZXJ2ZXJFcnJvcjtcclxuXHJcbiAgICAgICAgICAgIC8vIEVycm9yLklORl9OT19SRVNVTFQ6XHJcbiAgICAgICAgICAgIC8vICAgIGlmIGF1dGhlbnRpY2F0aW9uIGRpYWxvZyB3YXMgY2FuY2VsZWQsIHRoZSByZXF1ZXN0IHdhcyBzZW50IG9ubHkgdG8gY2xvc2UgdGhlIGNvbnRleHQsXHJcbiAgICAgICAgICAgIC8vICAgIGFuZCB0aGUgc2VydmVyIGlzbid0IGV4cGVjdGVkIHRvIHJldHVybiBhIHJlc3BvbnNlXHJcbiAgICAgICAgICAgIGlmIChzZXJ2ZXJFcnJvci5HZXRDb2RlKCkgIT09IFNlcnZlckVycm9yLkVSUl9BVVRIRU5USUNBVElPTiAmJlxyXG4gICAgICAgICAgICAgICAgKCFhdXRoZW50aWNhdGlvbkNhbmNlbGxlZCB8fCBzZXJ2ZXJFcnJvci5HZXRDb2RlKCkgIT09IFNlcnZlckVycm9yLklORl9OT19SRVNVTFQpKSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgc2VydmVyRXJyb3I7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhyb3cgZXg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBzdG9yZSBhbiBpbmRpY2F0aW9uIHRvIHNraXAgZnV0dXJlIGF1dGhlbnRpY2F0aW9uIChzZXNzaW9uIHJlc3RhcnQsIHBhcmFsbGVsIHByb2dyYW0pXHJcbiAgICAgIFNlcnZlckNvbmZpZy5JbnN0YW5jZS5zZXRTa2lwQXV0aGVudGljYXRpb25EaWFsb2codHJ1ZSk7XHJcblxyXG4gICAgICAvLyBzYXZlIGNvbnRleHQgZ3JvdXBcclxuICAgICAgU2VydmVyQ29uZmlnLkluc3RhbmNlLnNldEN0eEdyb3VwKGN0eEdyb3VwKTtcclxuXHJcbiAgICAgIGlmIChkaWFsb2cgIT09IG51bGwpXHJcbiAgICAgICAgZGlhbG9nLmNsb3NlRGlhbG9nKCk7XHJcblxyXG4gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgLy8gc2V0IHNlc3Npb24gcHJvcGVydGllc1xyXG4gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuU2hvdWxkU2NyYW1ibGVBbmRVbnNjcmFtYmxlTWVzc2FnZXMgPSBoYW5kc2hha2VSZXNwb25zZS5TY3JhbWJsZU1lc3NhZ2VzO1xyXG4gICAgICBpZiAoTG9nZ2VyLkluc3RhbmNlLkxvZ0xldmVsICE9PSBMb2dnZXJfTG9nTGV2ZWxzLkJhc2ljKSB7XHJcbiAgICAgICAgLy8gbWF4aW1hbCB2YWx1ZSBvZiB0aGUgSW50ZXJuYWxMb2dMZXZlbCB0aGF0IGNhbiBiZSBzZXQgYnkgdGhlIGNsaWVudC5cclxuICAgICAgICAvLyBpZiBzZXQsIGl0IGNvbnRyb2xzIHRoZSBtYXhpbWFsIHZhbHVlOyBvdGhlcndpc2UsIGFueSBsb2cgbGV2ZWwgaXMgYWxsb3dlZC5cclxuICAgICAgICBsZXQgbWF4SW50ZXJuYWxMb2dMZXZlbDogc3RyaW5nID0gaGFuZHNoYWtlUmVzcG9uc2UuTWF4SW50ZXJuYWxMb2dMZXZlbDtcclxuICAgICAgICBpZiAobWF4SW50ZXJuYWxMb2dMZXZlbCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgbGV0IG1heExvZ0xldmVsOiBMb2dnZXJfTG9nTGV2ZWxzID0gdGhpcy5wYXJzZUxvZ0xldmVsKG1heEludGVybmFsTG9nTGV2ZWwpO1xyXG4gICAgICAgICAgaWYgKG1heExvZ0xldmVsIDwgTG9nZ2VyLkluc3RhbmNlLkxvZ0xldmVsKSB7XHJcbiAgICAgICAgICAgIC8vIHRleHR1YWwgdmFsdWUgKGFzIGxvYWRlZCBmcm9tIHRoZSBleGVjdXRpb24gcHJvcGVydGllcylcclxuICAgICAgICAgICAgU2VydmVyQ29uZmlnLkluc3RhbmNlLnNldEludGVybmFsTG9nTGV2ZWwobWF4SW50ZXJuYWxMb2dMZXZlbCk7XHJcblxyXG4gICAgICAgICAgICAvLyBzZXQgdGhlIGFjdHVhbCBsb2cgbGV2ZWwgdG8gdGhlIGxldmVsIGFsbG93ZWQgYnkgdGhlIHNlcnZlclxyXG4gICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVUb0xvZyhOU3RyaW5nLkZvcm1hdChcIkludGVybmFsIGxvZyBsZXZlbCB3YXMgcmVzdHJpY3RlZCB0byAnezB9JyBieSB0aGUgTWFnaWMgeHBhIHNlcnZlci5cIiwgbWF4SW50ZXJuYWxMb2dMZXZlbCksIGZhbHNlKTtcclxuICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLkxvZ0xldmVsID0gbWF4TG9nTGV2ZWw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAgIC8vIDNyZCByZXF1ZXN0OiBFeGVjdXRlcyB0aGUgaW5pdGlhbCBwcm9ncmFtIGluIHRoZSBzZXJ2ZXIuXHJcbiAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgaWYgKCFhdXRoZW50aWNhdGlvbkNhbmNlbGxlZCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuRXhlY3V0ZUluaXRpYWxSZXF1ZXN0KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNhdGNoIChleCkge1xyXG4gICAgICBpZiAoZXggaW5zdGFuY2VvZiBTZXJ2ZXJFcnJvcilcclxuICAgICAgICB0aHJvdyBleDtcclxuXHJcbiAgICAgIGlmIChpc051bGxPclVuZGVmaW5lZChleC5Jbm5lckV4Y2VwdGlvbikpXHJcbiAgICAgICAgdGhyb3cgIG5ldyBTZXJ2ZXJFcnJvcihleC5tZXNzYWdlLCBuZXcgRXhjZXB0aW9uKGV4KSk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aHJvdyBuZXcgU2VydmVyRXJyb3IoZXgubWVzc2FnZSwgZXguSW5uZXJFeGNlcHRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAhYXV0aGVudGljYXRpb25DYW5jZWxsZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHByZXBhcmVzIGhhbmRzaGFrZSByZXF1ZXN0IHVybCBmb3IgYXV0aGVudGljYXRpb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRleHRJZFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiY3R4R3JvdXBcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInNlc3Npb25Db3VudFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIFByZXBhcmVBdXRoZW50aWNhdGlvblVybChjb250ZXh0SWQ6IHN0cmluZywgY3R4R3JvdXA6IHN0cmluZywgc2Vzc2lvbkNvdW50OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IGhhbmRzaGFrZUF1dGhVcmw6IHN0cmluZyA9IHRoaXMuU2VydmVyVXJsICsgQ29uc3RJbnRlcmZhY2UuUkVRX0FSR19TVEFSVCArXHJcbiAgICAgIENvbnN0SW50ZXJmYWNlLlJDX0lORElDQVRJT04gKyBDb25zdEludGVyZmFjZS5VVEY4VFJBTlMgK1xyXG4gICAgICBDb25zdEludGVyZmFjZS5SQ19UT0tFTl9DVFhfSUQgKyBjb250ZXh0SWQ7XHJcblxyXG4gICAgaWYgKCFpc051bGxPclVuZGVmaW5lZCh0aGlzLlNlc3Npb25JZCkpXHJcbiAgICAgIGhhbmRzaGFrZUF1dGhVcmwgKz0gKENvbnN0SW50ZXJmYWNlLlJFUV9BUkdfU0VQQVJBVE9SICsgIENvbnN0SW50ZXJmYWNlLlJDX1RPS0VOX1NFU1NJT05fSUQgKyB0aGlzLlNlc3Npb25JZCk7XHJcblxyXG4gICAgaGFuZHNoYWtlQXV0aFVybCArPSAoQ29uc3RJbnRlcmZhY2UuUkVRX0FSR19TRVBBUkFUT1IgK1xyXG4gICAgICAgIENvbnN0SW50ZXJmYWNlLlJDX1RPS0VOX1NFU1NJT05fQ09VTlQgKyBzZXNzaW9uQ291bnQgK1xyXG4gICAgICAgIENvbnN0SW50ZXJmYWNlLlJFUV9BUkdfU0VQQVJBVE9SICtcclxuICAgICAgICBDb25zdEludGVyZmFjZS5SQ19UT0tFTl9DVFhfR1JPVVAgKyBjdHhHcm91cCArXHJcbiAgICAgICAgQ29uc3RJbnRlcmZhY2UuUkVRX0FSR19TRVBBUkFUT1IgK1xyXG4gICAgICAgIENvbnN0SW50ZXJmYWNlLlJDX0FVVEhFTlRJQ0FUSU9OX1JFUVVFU1QpO1xyXG5cclxuICAgIHJldHVybiBoYW5kc2hha2VBdXRoVXJsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBFeGVjdXRlcyB0aGUgaW5pdGlhbCBwcm9ncmFtIGluIHRoZSBzZXJ2ZXI6XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIEV4ZWN1dGVJbml0aWFsUmVxdWVzdCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIHNlbmQgdGhlIElOSVRJQUwgcmVxdWVzdCB0byB0aGUgc2VydmVyLlxyXG4gICAgYXdhaXQgdGhpcy5FeGVjdXRlXzEoQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1NlbmRpbmdJbnN0cnVjdGlvbi5UQVNLU19BTkRfQ09NTUFORFMsIENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZXNzaW9uU3RhZ2UuSU5JVElBTCwgbnVsbCk7XHJcbiAgfVxyXG5cclxuICAvLyBwcml2YXRlIHN0YXRpYyBHZXRMb2dvbkRpYWxvZ0V4ZWNQcm9wcygpOiBEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiB7XHJcbiAgLy8gICBsZXQgZGljdGlvbmFyeTogRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4oKTtcclxuICAvLyAgIGxldCB2YWx1ZTogc3RyaW5nID0gQ2xpZW50TWFuYWdlci5JbnN0YW5jZS5nZXRMb2dvbldpbmRvd1RpdGxlKCk7XHJcbiAgLy8gICBsZXQgZmxhZzogYm9vbGVhbiA9IE5TdHJpbmcuSXNOdWxsT3JFbXB0eSh2YWx1ZSk7XHJcbiAgLy8gICBpZiAoZmxhZykge1xyXG4gIC8vICAgICB2YWx1ZSA9IFwiTG9nb24gLSBcIiArIENsaWVudE1hbmFnZXIuSW5zdGFuY2UuZ2V0QXBwTmFtZSgpO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgZGljdGlvbmFyeS5BZGQoXCJMb2dvbldpbmRvd1RpdGxlXCIsIHZhbHVlKTtcclxuICAvLyAgIGxldCB0ZXh0OiBzdHJpbmcgPSBDbGllbnRNYW5hZ2VyLkluc3RhbmNlLmdldExvZ29uR3JvdXBUaXRsZSgpO1xyXG4gIC8vICAgbGV0IGZsYWcyOiBib29sZWFuID0gIU5TdHJpbmcuSXNOdWxsT3JFbXB0eSh0ZXh0KTtcclxuICAvLyAgIGlmIChmbGFnMikge1xyXG4gIC8vICAgICB0ZXh0ID0gKCh0ZXh0Lmxlbmd0aCA+IDYyKSA/IE5TdHJpbmcuU3Vic3RyaW5nKHRleHQsIDAsIDYyKSA6IHRleHQpO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgZWxzZSB7XHJcbiAgLy8gICAgIHRleHQgPSBcIkxvZ29uIFBhcmFtZXRlcnNcIjtcclxuICAvLyAgIH1cclxuICAvLyAgIGRpY3Rpb25hcnkuQWRkKFwiTG9nb25Hcm91cFRpdGxlXCIsIHRleHQpO1xyXG4gIC8vICAgbGV0IHRleHQyOiBzdHJpbmcgPSBDbGllbnRNYW5hZ2VyLkluc3RhbmNlLmdldExvZ29uTXNnQ2FwdGlvbigpO1xyXG4gIC8vICAgbGV0IGZsYWczOiBib29sZWFuID0gIU5TdHJpbmcuSXNOdWxsT3JFbXB0eSh0ZXh0Mik7XHJcbiAgLy8gICBpZiAoZmxhZzMpIHtcclxuICAvLyAgICAgdGV4dDIgPSAoKHRleHQyLmxlbmd0aCA+IDU2KSA/IE5TdHJpbmcuU3Vic3RyaW5nKHRleHQyLCAwLCA1NikgOiB0ZXh0Mik7XHJcbiAgLy8gICAgIGRpY3Rpb25hcnkuQWRkKFwiTG9nb25NZXNzYWdlQ2FwdGlvblwiLCB0ZXh0Mik7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBsZXQgbG9nb25XaW5kb3dJY29uVVJMOiBVcmkgPSBDbGllbnRNYW5hZ2VyLkluc3RhbmNlLmdldExvZ29uV2luZG93SWNvblVSTCgpO1xyXG4gIC8vICAgbGV0IGZsYWc0OiBib29sZWFuID0gVXJpLm9wX0luZXF1YWxpdHkobG9nb25XaW5kb3dJY29uVVJMLCBudWxsKSAmJiAhTlN0cmluZy5Jc051bGxPckVtcHR5KGxvZ29uV2luZG93SWNvblVSTC5Ub1N0cmluZygpKTtcclxuICAvLyAgIGlmIChmbGFnNCkge1xyXG4gIC8vICAgICBkaWN0aW9uYXJ5LkFkZChcIkxvZ29uV2luZG93SWNvblVSTFwiLCBsb2dvbldpbmRvd0ljb25VUkwuVG9TdHJpbmcoKSk7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBsZXQgbG9nb25XaW5kb3dJbWFnZVVSTDogVXJpID0gQ2xpZW50TWFuYWdlci5JbnN0YW5jZS5nZXRMb2dvbldpbmRvd0ltYWdlVVJMKCk7XHJcbiAgLy8gICBsZXQgZmxhZzU6IGJvb2xlYW4gPSBVcmkub3BfSW5lcXVhbGl0eShsb2dvbldpbmRvd0ltYWdlVVJMLCBudWxsKSAmJiAhTlN0cmluZy5Jc051bGxPckVtcHR5KGxvZ29uV2luZG93SW1hZ2VVUkwuVG9TdHJpbmcoKSk7XHJcbiAgLy8gICBpZiAoZmxhZzUpIHtcclxuICAvLyAgICAgZGljdGlvbmFyeS5BZGQoXCJMb2dvbkltYWdlVVJMXCIsIGxvZ29uV2luZG93SW1hZ2VVUkwuVG9TdHJpbmcoKSk7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBsZXQgdGV4dDM6IHN0cmluZyA9IENsaWVudE1hbmFnZXIuSW5zdGFuY2UuZ2V0TG9nb25Vc2VySWRDYXB0aW9uKCk7XHJcbiAgLy8gICBsZXQgZmxhZzY6IGJvb2xlYW4gPSAhTlN0cmluZy5Jc051bGxPckVtcHR5KHRleHQzKTtcclxuICAvLyAgIGlmIChmbGFnNikge1xyXG4gIC8vICAgICB0ZXh0MyA9ICgodGV4dDMubGVuZ3RoID4gOSkgPyBOU3RyaW5nLlN1YnN0cmluZyh0ZXh0MywgMCwgOSkgOiB0ZXh0Myk7XHJcbiAgLy8gICAgIGRpY3Rpb25hcnkuQWRkKFwiTG9nb25Vc2VySURDYXB0aW9uXCIsIHRleHQzKTtcclxuICAvLyAgIH1cclxuICAvLyAgIGxldCB0ZXh0NDogc3RyaW5nID0gQ2xpZW50TWFuYWdlci5JbnN0YW5jZS5nZXRMb2dvblBhc3N3b3JkQ2FwdGlvbigpO1xyXG4gIC8vICAgbGV0IGZsYWc3OiBib29sZWFuID0gIU5TdHJpbmcuSXNOdWxsT3JFbXB0eSh0ZXh0NCk7XHJcbiAgLy8gICBpZiAoZmxhZzcpIHtcclxuICAvLyAgICAgdGV4dDQgPSAoKHRleHQ0Lmxlbmd0aCA+IDkpID8gTlN0cmluZy5TdWJzdHJpbmcodGV4dDQsIDAsIDkpIDogdGV4dDQpO1xyXG4gIC8vICAgICBkaWN0aW9uYXJ5LkFkZChcIkxvZ29uUGFzc3dvcmRDYXB0aW9uXCIsIHRleHQ0KTtcclxuICAvLyAgIH1cclxuICAvLyAgIGxldCBsb2dvbk9LQ2FwdGlvbjogc3RyaW5nID0gQ2xpZW50TWFuYWdlci5JbnN0YW5jZS5nZXRMb2dvbk9LQ2FwdGlvbigpO1xyXG4gIC8vICAgbGV0IGZsYWc4OiBib29sZWFuID0gIU5TdHJpbmcuSXNOdWxsT3JFbXB0eShsb2dvbk9LQ2FwdGlvbik7XHJcbiAgLy8gICBpZiAoZmxhZzgpIHtcclxuICAvLyAgICAgZGljdGlvbmFyeS5BZGQoXCJMb2dvbk9LQ2FwdGlvblwiLCBsb2dvbk9LQ2FwdGlvbik7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBsZXQgbG9nb25DYW5jZWxDYXB0aW9uOiBzdHJpbmcgPSBDbGllbnRNYW5hZ2VyLkluc3RhbmNlLmdldExvZ29uQ2FuY2VsQ2FwdGlvbigpO1xyXG4gIC8vICAgbGV0IGZsYWc5OiBib29sZWFuID0gIU5TdHJpbmcuSXNOdWxsT3JFbXB0eShsb2dvbkNhbmNlbENhcHRpb24pO1xyXG4gIC8vICAgaWYgKGZsYWc5KSB7XHJcbiAgLy8gICAgIGRpY3Rpb25hcnkuQWRkKFwiTG9nb25DYW5jZWxDYXB0aW9uXCIsIGxvZ29uQ2FuY2VsQ2FwdGlvbik7XHJcbiAgLy8gICB9XHJcbiAgLy8gICByZXR1cm4gZGljdGlvbmFyeTtcclxuICAvLyB9XHJcblxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBydW50aW1lIHRhc2sgdHJlZSBzdHJ1Y3R1cmUgYnkgZ29pbmcgdXAgZnJvbSB0aGUgY3VycmVudCB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIEdldFRhc2tUcmVlKHRhc2s6IFRhc2spOiBMaXN0PHN0cmluZz4ge1xyXG4gICAgbGV0IHRhc2tUcmVlOiBMaXN0PHN0cmluZz4gPSBuZXcgTGlzdDxzdHJpbmc+KCk7XHJcblxyXG4gICAgd2hpbGUoIWlzTnVsbE9yVW5kZWZpbmVkKHRhc2spKVxyXG4gICAge1xyXG4gICAgICB0YXNrVHJlZS5wdXNoKHRhc2suZ2V0VGFza0luZm8oKSk7XHJcbiAgICAgIHRhc2sgPSA8VGFzaz50YXNrLmdldFBhcmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0YXNrVHJlZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gVXBkYXRlIHRoZSByZXF1ZXN0IGluZm8gb2JqZWN0IHVzaW5nIGluZm9ybWF0aW9uIG9idGFpbmVkIGZyb20gY3VycmVudCBvcGVyYXRpb24gYmVpbmcgZXhlY3V0ZWQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIFVwZGF0ZVJlcXVlc3RJbmZvKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGN1cnJNR0RhdGE6IE1HRGF0YSA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5nZXRDdXJyTUdEYXRhKCk7XHJcbiAgICBsZXQgZXZlbnRzTWFuYWdlcjogRXZlbnRzTWFuYWdlciA9IDxFdmVudHNNYW5hZ2VyPkFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyO1xyXG4gICAgbGV0IG9wZXJFeGVjdXRpb246Ym9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGNtZHNUb1NlcnZlcjogQ29tbWFuZHNUYWJsZSA9IDxDb21tYW5kc1RhYmxlPmN1cnJNR0RhdGEuQ21kc1RvU2VydmVyO1xyXG5cclxuICAgIGZvcihsZXQgaT0wOyBpPCBjbWRzVG9TZXJ2ZXIuZ2V0U2l6ZSgpOyBpKyspXHJcbiAgICB7XHJcbiAgICAgIC8vIFdoZW4gdGhlIHJlcXVlc3QgaXMgYmVpbmcgc2VudCB0byBzZXJ2ZXIgZHVlIHRvIGFuIG9wZXJhdGlvbiBleGVjdXRpb24sIGdldCB0aGUgaW5mb3JtYXRpb24gb2YgY3VycmVudCBvcGVyYXRpb24gZnJvbSBDbWRzVG9TZXJ2ZXJcclxuICAgICAgaWYoY21kc1RvU2VydmVyLmdldENtZChpKSBpbnN0YW5jZW9mIEV4ZWNPcGVyQ29tbWFuZCkge1xyXG4gICAgICAgIGxldCBvcGVyQ21kOkV4ZWNPcGVyQ29tbWFuZCA9IDxFeGVjT3BlckNvbW1hbmQ+KDxDb21tYW5kc1RhYmxlPmN1cnJNR0RhdGEuQ21kc1RvU2VydmVyKS5nZXRDbWQoaSk7XHJcblxyXG4gICAgICAgIHRoaXMuX3JlcXVlc3RJbmZvLnNlcnZlckNhbGxBdCA9IG9wZXJDbWQuZ2V0Q29tbWFuZEluZm8oKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcmVxdWVzdEluZm8ucnVudGltZVRhc2tUcmVlID0gdGhpcy5HZXRUYXNrVHJlZShvcGVyQ21kLmdldFRhc2soKSk7XHJcbiAgICAgICAgb3BlckV4ZWN1dGlvbiA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9yZXF1ZXN0SW5mby5leHRyYUluZm8uY29udGV4dElEID0gUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLkNvbnRleHRJRDtcclxuICAgIHRoaXMuX3JlcXVlc3RJbmZvLmV4dHJhSW5mby5zZXNzaW9uQ291bnRlciA9IHRoaXMuR2V0U2Vzc2lvbkNvdW50ZXIoKTtcclxuXHJcbiAgICAvLyBMb2cgaW5mb3JtYXRpb24gYWJvdXQgbWFnaWMgaW50ZXJuYWwgZXZlbnRzIGNhdXNpbmcgcmVxdWVzdHMgdG8gc2VydmVyXHJcbiAgICBpZighb3BlckV4ZWN1dGlvbilcclxuICAgIHtcclxuICAgICAgaWYoZXZlbnRzTWFuYWdlci5nZXRMYXN0UnRFdmVudCgpICE9IG51bGwgJiYgZXZlbnRzTWFuYWdlci5nZXRMYXN0UnRFdmVudCgpLkludGVybmFsRXZlbnQgIT0gMClcclxuICAgICAge1xyXG4gICAgICAgIGxldCBydEV2dDpSdW5UaW1lRXZlbnQgPSBldmVudHNNYW5hZ2VyLmdldExhc3RSdEV2ZW50KCk7XHJcbiAgICAgICAgdGhpcy5fcmVxdWVzdEluZm8ucnVudGltZVRhc2tUcmVlID0gdGhpcy5HZXRUYXNrVHJlZSg8VGFzaz5ydEV2dC5nZXRUYXNrKCkpO1xyXG5cclxuICAgICAgICAvLyByZXR1cm4gZGVzY3JpcHRpb24gYXMgcGVyIG5ldy9vbGQgaW50ZXJuYWwgZXZlbnQgZGVzY1xyXG4gICAgICAgIGxldCBldmVudERlc2NyaXB0aW9uOiBzdHJpbmcgPSAgcnRFdnQuaXNOZXdJbnRlcm5hbEV2ZW50KClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBOU3RyaW5nLlRyaW1FbmQocnRFdnQuZ2V0TmV3SW50ZXJuYWxFdmVudERlc2NyaXB0aW9uKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRXZlbnQuZ2V0SW50ZXJuYWxFdnREZXNjcmlwdGlvbihydEV2dC5JbnRlcm5hbEV2ZW50KTtcclxuXHJcblxyXG4gICAgICAgIC8vIGUuZy4gRXZlbnQgWzxOZXh0IENodW5rPl0gd2hpbGUgZXhlY3V0aW5nIFs8VmlldyBSZWZyZXNoPl1cclxuICAgICAgICBsZXQgY21kOiBJQ2xpZW50Q29tbWFuZCA9IGNtZHNUb1NlcnZlci5nZXRDbWQoY21kc1RvU2VydmVyLmdldFNpemUoKSAtIDEpO1xyXG4gICAgICAgIGlmKGNtZCBhcyBJQ2xpZW50VG9TZXJ2ZXJDb21tYW5kSW5mbykge1xyXG4gICAgICAgICAgbGV0IGNvbW1hbmRJbmZvOiBzdHJpbmcgPSBOU3RyaW5nLklzTnVsbE9yRW1wdHkoKDxJQ2xpZW50VG9TZXJ2ZXJDb21tYW5kSW5mbz5jbWQpLmdldENvbW1hbmRJbmZvKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBOU3RyaW5nLkVtcHR5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoPElDbGllbnRUb1NlcnZlckNvbW1hbmRJbmZvPmNtZCkuZ2V0Q29tbWFuZEluZm8oKTtcclxuXHJcbiAgICAgICAgICAvLyBJbiBjYXNlIHRoZSBydW50aW1lIGV2ZW50IGFuZCBFdmVudCBjb21tYW5kIGFyZSBzYW1lLCBubyBuZWVkIHRvIGxvZyB0aGUgZXh0cmEgaW5mb3JtYXRpb25cclxuICAgICAgICAgIGlmKGNtZCBpbnN0YW5jZW9mIEV2ZW50Q29tbWFuZCAmJiBydEV2dC5JbnRlcm5hbEV2ZW50ID09ICg8RXZlbnRDb21tYW5kPmNtZCkuTWFnaWNFdmVudClcclxuICAgICAgICAgICAgZXZlbnREZXNjcmlwdGlvbiA9IE5TdHJpbmcuRW1wdHk7XHJcblxyXG4gICAgICAgICAgdGhpcy5fcmVxdWVzdEluZm8uc2VydmVyQ2FsbEF0ID0gICdFdmVudCAnICsgY29tbWFuZEluZm8gK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghTlN0cmluZy5Jc051bGxPckVtcHR5KGV2ZW50RGVzY3JpcHRpb24pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gTlN0cmluZy5Gb3JtYXQoJyB3aGlsZSBleGVjdXRpbmcgW3swfV0nLCBldmVudERlc2NyaXB0aW9uKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5TdHJpbmcuRW1wdHkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBCdWlsZCB4bWwgZm9yIG1haW4gcHJvZyBkYXRhdmlldy4gcmVxdWlyZWQgZm9yIHJlLWluaXRpYWxpemluZyBzZXNzaW9uLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhc3luYyBCdWlsZFhNTEZvck1haW5Qcm9ncmFtRGF0YVZpZXcoKTogUHJvbWlzZTxTdHJpbmc+XHJcbiAge1xyXG4gICAgbGV0IG1lc3NhZ2U6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgbGV0IGZpcnN0TWdEYXRhOiBNR0RhdGEgPSBNR0RhdGFDb2xsZWN0aW9uLkluc3RhbmNlLmdldE1HRGF0YSgwKTtcclxuICAgIGxldCBtYWluUHJnOiBUYXNrID0gZmlyc3RNZ0RhdGEuZ2V0TWFpblByb2coMCk7XHJcblxyXG4gICAgd2hpbGUgKG1haW5QcmcgIT0gbnVsbClcclxuICAgIHtcclxuICAgICAgYXdhaXQgbWFpblByZy5idWlsZFhNTChtZXNzYWdlKTtcclxuICAgICAgbWFpblByZyA9IGZpcnN0TWdEYXRhLmdldE5leHRNYWluUHJvZyhtYWluUHJnLmdldEN0bElkeCgpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuU2hvdWxkU2NyYW1ibGVBbmRVbnNjcmFtYmxlTWVzc2FnZXMpXHJcbiAgICB7XHJcbiAgICAgIGxldCBzY3JhbWJsZWRDaGFuZ2VzOiBzdHJpbmcgPSBTY3JhbWJsZXIuU2NyYW1ibGUobWVzc2FnZS5Ub1N0cmluZygpKTtcclxuICAgICAgbWVzc2FnZSA9IG5ldyBTdHJpbmdCdWlsZGVyKHNjcmFtYmxlZENoYW5nZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIG1lc3NhZ2UuSW5zZXJ0KDAsIFhNTENvbnN0YW50cy5NR19UQUdfT1BFTik7XHJcbiAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuTUdfVEFHX1hNTF9FTkRfVEFHR0VEKTtcclxuXHJcbiAgICByZXR1cm4gbWVzc2FnZS5Ub1N0cmluZygpO1xyXG4gIH1cclxuXHJcblxyXG4gIGFzeW5jIEV4ZWN1dGVfMShzZW5kaW5nSW5zdHJ1Y3Rpb246IENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24sIHNlc3Npb25TdGFnZTogQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1Nlc3Npb25TdGFnZSwgcmVzOiBJUmVzdWx0VmFsdWUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCByZXFCdWY6IHN0cmluZztcclxuICAgIGxldCBpc0luaXRpYWxDYWxsOiBib29sZWFuID0gc2Vzc2lvblN0YWdlID09PSBDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2Vzc2lvblN0YWdlLklOSVRJQUw7XHJcbiAgICBsZXQgZ2xvYmFsUGFyYW1zU3RyaW5nOiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICAgIGlmICh0aGlzLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbilcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGlmKExvZ2dlci5JbnN0YW5jZS5Mb2dMZXZlbCA9PSBMb2dnZXJfTG9nTGV2ZWxzLlJlcXVlc3RJbmZvICYmICFpc0luaXRpYWxDYWxsKVxyXG4gICAgICBhd2FpdCB0aGlzLlVwZGF0ZVJlcXVlc3RJbmZvKCk7XHJcblxyXG4gICAgaWYgKGlzSW5pdGlhbENhbGwpIHtcclxuICAgICAgbGV0IHZhbCA9IHRoaXMuUmVzdG9yZVNlc3Npb25SZUluaXRpYWxpemluZ0RhdGFGcm9tTG9jYWxTdG9yYWdlKENvbnN0SW50ZXJmYWNlLklTX1NFU1NJT05fUkVJTklUSUFMSVpJTkcpO1xyXG4gICAgICBpZiAodmFsID09PSAndHJ1ZScpIHtcclxuICAgICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5Jc1Nlc3Npb25SZUluaXRpYWxpemluZyA9ICh2YWwgPT09IFwidHJ1ZVwiKSA/IHRydWUgOiBmYWxzZTtcclxuICAgICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5sYXN0RXhjZXB0aW9uTWVzc2FnZSA9IHRoaXMuUmVzdG9yZVNlc3Npb25SZUluaXRpYWxpemluZ0RhdGFGcm9tTG9jYWxTdG9yYWdlKENvbnN0SW50ZXJmYWNlLkxBU1RfRVhDRVBUSU9OKTtcclxuICAgICAgICBsZXQgY3R4UmVtb3ZlZCA9IHRoaXMuUmVzdG9yZVNlc3Npb25SZUluaXRpYWxpemluZ0RhdGFGcm9tTG9jYWxTdG9yYWdlKENvbnN0SW50ZXJmYWNlLkNUWF9SRU1PVkVEX0ZST01fU1JWUik7XHJcblxyXG4gICAgICAgIGlmIChjdHhSZW1vdmVkICE9PSAnMScpIHtcclxuICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUVycm9yVG9Mb2coUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IubGFzdEV4Y2VwdGlvbk1lc3NhZ2UpO1xyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlVG9Mb2coXCJTZXNzaW9uIGlzIHJlaW5pdGlhbGl6aW5nLi4uXCIsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChzZW5kaW5nSW5zdHJ1Y3Rpb24gPT09IENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uTk9fVEFTS1NfT1JfQ09NTUFORFMpXHJcbiAgICAgIHJlcUJ1ZiA9IG51bGw7XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmVxQnVmID0gYXdhaXQgdGhpcy5QcmVwYXJlUmVxdWVzdChzZW5kaW5nSW5zdHJ1Y3Rpb24gPT09IENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZW5kaW5nSW5zdHJ1Y3Rpb24uVEFTS1NfQU5EX0NPTU1BTkRTKTtcclxuXHJcbiAgICAgIGlmIChSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5Jc1Nlc3Npb25SZUluaXRpYWxpemluZyB8fCAhaXNJbml0aWFsQ2FsbCkge1xyXG4gICAgICAgIGxldCBjaGFuZ2VzOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgICAgICBsZXQgYnVmZmVyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgICAgICBpZiAoIVJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLklzU2Vzc2lvblJlSW5pdGlhbGl6aW5nKVxyXG4gICAgICAgICAgYnVmZmVyLkFwcGVuZChyZXFCdWYpO1xyXG5cclxuICAgICAgICAvLyBzZW5kIGFjdGl2aXR5IG1vbml0b3IgbG9ncyB0byB0aGUgc2VydmVyXHJcbiAgICAgICAgLy8gaWYgKHRoaXMuX2xvZ0FjY3VtdWxhdG9yICE9PSBudWxsICYmICF0aGlzLl9sb2dBY2N1bXVsYXRvci5FbXB0eSgpKVxyXG4gICAgICAgIC8vICAgYnVmZmVyLkFwcGVuZCh0aGlzLl9sb2dBY2N1bXVsYXRvci5SZWFkKCkpO1xyXG5cclxuICAgICAgICAvLyBzeW5jaHJvbml6ZSBjbGllbnQtc2lkZSBTZXRQYXJhbXMgYW5kIElOSVB1dCBkYXRhIHRvIHRoZSBzZXJ2ZXJcclxuICAgICAgICBpZiAoUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuSXNTZXNzaW9uUmVJbml0aWFsaXppbmcpXHJcbiAgICAgICAgICBnbG9iYWxQYXJhbXNTdHJpbmcgPSB0aGlzLlJlc3RvcmVTZXNzaW9uUmVJbml0aWFsaXppbmdEYXRhRnJvbUxvY2FsU3RvcmFnZShDb25zdEludGVyZmFjZS5HTE9CQUxfUEFSQU1fTElTVCk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgZ2xvYmFsUGFyYW1zU3RyaW5nID0gQWNjZXNzSGVscGVyLmdsb2JhbFBhcmFtcy5taXJyb3JUb1hNTCgpO1xyXG4gICAgICAgIGNoYW5nZXMuQXBwZW5kKGdsb2JhbFBhcmFtc1N0cmluZyk7XHJcbiAgICAgICAgY2hhbmdlcy5BcHBlbmQoQWNjZXNzSGVscGVyLmVudlBhcmFtc1RhYmxlLm1pcnJvclRvWE1MKCkpO1xyXG5cclxuICAgICAgICAvLyBJZiB0aGVyZSBpcyBzdHVmZiB0byBzeW5jaHJvbml6ZSwgd3JhcCBpdCwgc2NyYW1ibGUgaXQgYW5kIGFkZCB0aGUgTUdEQVRBIGZsYWdcclxuICAgICAgICBpZiAoY2hhbmdlcy5MZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBjaGFuZ2VzLkluc2VydCgwLCBcIjxcIiArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19FTlZfQ0hBTkdFUyArIFwiPlwiKTtcclxuICAgICAgICAgIGNoYW5nZXMuQXBwZW5kKFwiPC9cIiArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19FTlZfQ0hBTkdFUyArIFwiPlwiKTtcclxuXHJcbiAgICAgICAgICBpZiAoUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuU2hvdWxkU2NyYW1ibGVBbmRVbnNjcmFtYmxlTWVzc2FnZXMpIHtcclxuICAgICAgICAgICAgbGV0IHNjcmFtYmxlZENoYW5nZXM6IHN0cmluZyA9IFNjcmFtYmxlci5TY3JhbWJsZShjaGFuZ2VzLlRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICBjaGFuZ2VzID0gbmV3IFN0cmluZ0J1aWxkZXIoc2NyYW1ibGVkQ2hhbmdlcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjaGFuZ2VzLkluc2VydCgwLCBYTUxDb25zdGFudHMuTUdfVEFHX09QRU4pO1xyXG4gICAgICAgICAgY2hhbmdlcy5BcHBlbmQoWE1MQ29uc3RhbnRzLk1HX1RBR19YTUxfRU5EX1RBR0dFRCk7XHJcblxyXG4gICAgICAgICAgYnVmZmVyLkFwcGVuZChjaGFuZ2VzLlRvU3RyaW5nKCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmVxQnVmID0gYnVmZmVyLlRvU3RyaW5nKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVxdWVzdFN0YXR1czogUmVmUGFyYW08UmVxdWVzdFN0YXR1cz4gPSBuZXcgUmVmUGFyYW0oUmVxdWVzdFN0YXR1cy5IYW5kbGVkKTtcclxuICAgIGxldCByZXNwQnVmOiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICAgIGlmIChSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5Jc1Nlc3Npb25SZUluaXRpYWxpemluZyApIHtcclxuICAgICAgcmVxQnVmID0gIHJlcUJ1ZiArIHRoaXMuUmVzdG9yZVNlc3Npb25SZUluaXRpYWxpemluZ0RhdGFGcm9tTG9jYWxTdG9yYWdlKENvbnN0SW50ZXJmYWNlLk1BSU5fUFJPR19WSUVXKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlJlbW92ZWRDb250ZXh0RnJvbVNlcnZlcilcclxuICAgICAgcmVxdWVzdFN0YXR1cy52YWx1ZSA9IFJlcXVlc3RTdGF0dXMuUmV0cnk7IC8vdHJ5IHRvIHJlLXN0YXJ0IHNlc3Npb24gZmlyc3RcclxuICAgIGVsc2VcclxuICAgIHtcclxuICAgICAgaWYgKFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5SZW1vdmluZ0NvbnRleHRGcm9tU2VydmVyKVxyXG4gICAgICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5SZW1vdmVkQ29udGV4dEZyb21TZXJ2ZXIgPSB0cnVlO1xyXG5cclxuICAgICAgcmVzcEJ1ZiA9IGF3YWl0IHRoaXMuRGlzcGF0Y2hSZXF1ZXN0KHRoaXMuU2VydmVyVXJsLCByZXFCdWYsIHNlc3Npb25TdGFnZSwgcmVxdWVzdFN0YXR1cyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlcXVlc3RTdGF0dXMudmFsdWUgPT0gUmVxdWVzdFN0YXR1cy5SZXRyeSkge1xyXG4gICAgICBhd2FpdCB0aGlzLlJlU3RhcnRTZXNzaW9uKCk7XHJcbiAgICB9XHJcbiAgICBpZiAocmVzcEJ1ZiA9PSBudWxsKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgaWYgKGlzSW5pdGlhbENhbGwpXHJcbiAgICB7XHJcbiAgICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkluaXRpYWxVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcclxuICAgICAgaWYgKFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLklzU2Vzc2lvblJlSW5pdGlhbGl6aW5nKSB7XHJcbiAgICAgICAgbGV0IGRhdGFTdG9yYWdlID0gd2luZG93LmxvY2FsU3RvcmFnZTtcclxuICAgICAgICBkYXRhU3RvcmFnZS5yZW1vdmVJdGVtKENvbnN0SW50ZXJmYWNlLklTX1NFU1NJT05fUkVJTklUSUFMSVpJTkcpO1xyXG4gICAgICAgIGRhdGFTdG9yYWdlLnJlbW92ZUl0ZW0oQ29uc3RJbnRlcmZhY2UuTUFJTl9QUk9HX1ZJRVcpO1xyXG4gICAgICAgIGRhdGFTdG9yYWdlLnJlbW92ZUl0ZW0oQ29uc3RJbnRlcmZhY2UuR0xPQkFMX1BBUkFNX0xJU1QpO1xyXG4gICAgICAgIGRhdGFTdG9yYWdlLnJlbW92ZUl0ZW0oQ29uc3RJbnRlcmZhY2UuTEFTVF9FWENFUFRJT04pO1xyXG5cclxuXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBGbG93TW9uaXRvclF1ZXVlLkluc3RhbmNlLmVuYWJsZShmYWxzZSk7XHJcbiAgICBhd2FpdCB0aGlzLlByb2Nlc3NSZXNwb25zZShyZXNwQnVmLCBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuY3Vyck1nZElELCBudWxsLCByZXMpO1xyXG5cclxuICAgIGlmIChSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5Jc1Nlc3Npb25SZUluaXRpYWxpemluZykge1xyXG4gICAgICBBY2Nlc3NIZWxwZXIuZ2xvYmFsUGFyYW1zLlJlc3RvcmVHbG9iYWxQYXJhbXMoZ2xvYmFsUGFyYW1zU3RyaW5nKTtcclxuXHJcbiAgICAgIGxldCBkYXRhU3RvcmFnZSA9IHdpbmRvdy5sb2NhbFN0b3JhZ2U7XHJcbiAgICAgIGxldCBjdHhSZW1vdmVkID0gZGF0YVN0b3JhZ2UuZ2V0SXRlbShDb25zdEludGVyZmFjZS5DVFhfUkVNT1ZFRF9GUk9NX1NSVlIpO1xyXG5cclxuICAgICAgaWYgKGN0eFJlbW92ZWQgPT09IFwiMVwiKSB7XHJcblxyXG4gICAgICBFdmVudHNNYW5hZ2VyLkluc3RhbmNlLnJlc3RvcmVMYXN0U2F2ZWRSb3V0ZUV2ZW50RnJvbUxvY2FsU3RvcmFnZSgpO1xyXG5cclxuICAgICAgZGF0YVN0b3JhZ2UucmVtb3ZlSXRlbShDb25zdEludGVyZmFjZS5DVFhfUkVNT1ZFRF9GUk9NX1NSVlIpO1xyXG4gICAgICBkYXRhU3RvcmFnZS5yZW1vdmVJdGVtKENvbnN0SW50ZXJmYWNlLkxBU1RfUk9VVEVfRVZFTlQpO1xyXG4gICAgICBkYXRhU3RvcmFnZS5yZW1vdmVJdGVtKENvbnN0SW50ZXJmYWNlLkxBU1RfUk9VVEVfRVZFTlRfU1JDX1RTSyk7XHJcbiAgICAgIGRhdGFTdG9yYWdlLnJlbW92ZUl0ZW0oQ29uc3RJbnRlcmZhY2UuTEFTVF9ST1VURV9FVkVOVF9BUkdfTElTVCk7XHJcbiAgICB9XHJcblxyXG4gICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5Jc1Nlc3Npb25SZUluaXRpYWxpemluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy8gaWYgKGlzSW5pdGlhbENhbGwpIHtcclxuICAgIC8vICAgLy8gSWYgaXQgd2FzIGluaXRpYWwgY2FsbCwgd2Ugd2lsbCBzZW5kIGFsbCBwZW5kaW5nIGxvZ3MgKEZhaWxlZCBlYXJsaWVyIGV4ZWN1dGlvbiBzY2VuYXJpbylcclxuICAgIC8vICAgLy8gVGhleSB3aWxsIGJlIHNlbnQgaGVyZSwgYWZ0ZXIgZmlyc3QgcmVxdWVzdCBpcyBzZXJ2ZWQuXHJcbiAgICAvLyAgIGlmIChDbGllbnRNYW5hZ2VyLkluc3RhbmNlLmdldExvZ0NsaWVudFNlcXVlbmNlRm9yQWN0aXZpdHlNb25pdG9yKCkgJiYgQ2xpZW50TG9nQWNjdW11bGF0b3IuRXhpc3RpbmdMb2dzRm91bmQoKSkge1xyXG4gICAgLy8gICAgIGxldCBzdWNjZXNzOiBib29sZWFuID0gdGhpcy5TZW5kUGVuZGluZ0xvZ3NUb1NlcnZlcigpO1xyXG4gICAgLy9cclxuICAgIC8vICAgICAvLyBpZiB3ZSBoYXZlIHN1Y2Nlc3NmdWxseSBzZW50IHRoZSBwZW5kaW5nIGxvZ3MgZGVsZXRlIHRoZW1cclxuICAgIC8vICAgICBpZiAoc3VjY2Vzcykge1xyXG4gICAgLy8gICAgICAgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuRGVsZXRlUGVuZGluZ0xvZ3MoKTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH1cclxuICAgIC8vIGVsc2UgaWYgKHRoaXMuX2xvZ0FjY3VtdWxhdG9yICE9PSBudWxsICYmICF0aGlzLl9sb2dBY2N1bXVsYXRvci5FbXB0eSgpKSB7XHJcbiAgICAvLyAgIC8vIEFjY3VtdWxhdGVkIGxvZ3Mgd2VyZSBzZW50LCBzbyByZXNldCAoZGVsZXRlKSB0aGVtIG5vd1xyXG4gICAgLy8gICB0aGlzLl9sb2dBY2N1bXVsYXRvci5SZXNldCgpO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8vIHJlZnJlc2ggdGhlIGRpc3BsYXlzXHJcbiAgICBpZiAoc2VuZGluZ0luc3RydWN0aW9uID09PSBDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2VuZGluZ0luc3RydWN0aW9uLlRBU0tTX0FORF9DT01NQU5EUykge1xyXG4gICAgICBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuc3RhcnRUYXNrc0l0ZXJhdGlvbigpO1xyXG4gICAgICBsZXQgdGFzazogVGFza0Jhc2U7XHJcbiAgICAgIHdoaWxlICgodGFzayA9IDxUYXNrQmFzZT5BY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZ2V0TmV4dFRhc2soKSkgIT09IG51bGwpIHtcclxuICAgICAgICBsZXQgZGF0YVZpZXdXYXNSZXRyaWV2ZWQ6IGJvb2xlYW4gPSB0YXNrLkRhdGFWaWV3V2FzUmV0cmlldmVkO1xyXG4gICAgICAgIGlmIChkYXRhVmlld1dhc1JldHJpZXZlZCkge1xyXG4gICAgICAgICAgYXdhaXQgdGFzay5SZWZyZXNoRGlzcGxheSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChpc0luaXRpYWxDYWxsKVxyXG4gICAgICBTZXJ2ZXJDb25maWcuSW5zdGFuY2Uuc2V0R2xvYmFsUGFyYW1zKG51bGwpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PnNlbmQgJ3JlcUJ1ZicgdG8gJ3VybCc7IHJlY2VpdmUgYSByZXNwb25zZS5cclxuICAvLy8gRm9yIE5vcm1hbC9Jbml0aWFsQ2FsbCByZXF1ZXN0cywgdGhlIHVybCBwb2ludHMgdG8gdGhlIHdlYi1yZXF1ZXN0ZXIuXHJcbiAgLy8vIFRoZSBvdGhlciBwYXJhbWV0ZXJzIGFuZCBkYXRhIGdvZXMgYXMgdGhlIGVuY29kZWQgYm9keS5cclxuICAvLy8gVGhpcyBtZWFucyB0aGF0IGl0IGlzIGEgUE9TVCByZXF1ZXN0LlxyXG4gIC8vLyBPbiB0aGUgb3RoZXIgaGFuZCwgSGFuZFNoYWtlIHJlcXVlc3QgaXMgYSBHRVQgcmVxdWVzdCBhbmQgc28gdGhlIHBhcmFtZXRlcnMgYXJlXHJcbiAgLy8vIHNlbnQgaW4gdGhlIFVSTCBpdHNlbGYuIEluIHRoaXMgY2FzZSwgZW5jb2RlZEJvZHkgaGFzIHRvIGJlIG51bGwuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ1cmxcIj5VUkwgdG8gYmUgYWNjZXNzZWQuPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZXFCdWZcIj5kYXRhIHRvIGJlIHNlbnQgdG8gdGhlIHVybDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic2Vzc2lvblN0YWdlXCI+SEFORFNIQUtFIC8gSU5JVElBTCAvIE5PUk1BTC48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5yZXNwb25zZTwvcmV0dXJucz5cclxuICAgcHJpdmF0ZSBhc3luYyBEaXNwYXRjaFJlcXVlc3QodXJsOiBzdHJpbmcsIHJlcUJ1Zjogc3RyaW5nLCBzZXNzaW9uU3RhZ2U6IENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZXNzaW9uU3RhZ2UsIHJlcXVlc3RTdGF0dXM6IFJlZlBhcmFtPFJlcXVlc3RTdGF0dXM+KTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGxldCByZXNwb25zZTogc3RyaW5nID0gbnVsbDtcclxuICAgIGxldCBlbmNvZGVkQm9keTogc3RyaW5nID0gbnVsbDtcclxuICAgIHJlcXVlc3RTdGF0dXMudmFsdWUgPSBSZXF1ZXN0U3RhdHVzLkhhbmRsZWQ7XHJcblxyXG4gICAgaWYgKHVybCA9PT0gbnVsbCkge1xyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJpbiBzZW5kTXNnVG9TcnZyKCkgdW5rbm93biBzZXJ2ZXJcIik7XHJcbiAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2Vzc2lvblN0YWdlICE9PSBDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2Vzc2lvblN0YWdlLkhBTkRTSEFLRSkge1xyXG4gICAgICBsZXQgdXJsU3VmZml4OiBzdHJpbmcgPSB0aGlzLkJ1aWxkVXJsU3VmZml4KHJlcUJ1ZiAhPT0gbnVsbCwgc2Vzc2lvblN0YWdlID09PSBDb21tYW5kc1Byb2Nlc3NvckJhc2VfU2Vzc2lvblN0YWdlLklOSVRJQUwpO1xyXG4gICAgICBsZXQgcmVxQnVmRW5jb2RlZDogc3RyaW5nID0gSHR0cFV0aWxpdHkuVXJsRW5jb2RlKHJlcUJ1ZiwgRW5jb2RpbmcuVVRGOCk7XHJcbiAgICAgIGVuY29kZWRCb2R5ID0gdXJsU3VmZml4ICsgcmVxQnVmRW5jb2RlZDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgIHRyeSB7XHJcbiAgICAgICBpZiAoTG9nZ2VyLkluc3RhbmNlLlNob3VsZExvZ0V4dGVuZGVkU2VydmVyUmVsYXRlZE1lc3NhZ2VzKCkpXHJcbiAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVNlcnZlck1lc3NhZ2VzVG9Mb2coTlN0cmluZy5Gb3JtYXQoXCJNRVNTQUdFIFRPIFNFUlZFUjpcXG4gVVJMOiB7MH1cXG4gQk9EWTogezF9XCIsIHVybCwgZW5jb2RlZEJvZHkpKTtcclxuXHJcbiAgICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMuRXhlY3V0ZVJlcXVlc3QodXJsLCBlbmNvZGVkQm9keSk7XHJcblxyXG4gICAgICAgLyogcmVtb3ZlIHRoZSB1bndhbnRlZCBkYXRhIGJlZm9yZSB0aGUgTUdEQVRBIHRhZyAqL1xyXG4gICAgICAgaWYgKCFyZXNwb25zZS50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoXCI8SFRNTFwiKSkge1xyXG4gICAgICAgICBsZXQgc3RhcnRJZHg6IG51bWJlciA9IHJlc3BvbnNlLmluZGV4T2YoXCI8eG1sIGlkPVxcXCJNR0RBVEFcXFwiPlwiKTtcclxuICAgICAgICAgaWYgKHN0YXJ0SWR4ID4gMClcclxuICAgICAgICAgICByZXNwb25zZSA9IHJlc3BvbnNlLnN1YnN0cihzdGFydElkeCk7XHJcbiAgICAgICB9XHJcblxyXG4gICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlU2VydmVyTWVzc2FnZXNUb0xvZyhcIk1FU1NBR0UgRlJPTSBTRVJWRVI6IFwiICsgcmVzcG9uc2UpO1xyXG5cclxuICAgICAgIC8vIGhhbmRzaGFrZSByZXF1ZXN0cyBhcmUgYWx3YXlzIHNjcmFtYmxlZCAodGhlIHNjcmFtYmxpbmcgY2FuIGJlIGRpc2FibGVkIHN0YXJ0aW5nIGZyb20gdGhlIDNyZCByZXF1ZXN0KS5cclxuICAgICAgIGlmIChzZXNzaW9uU3RhZ2UgPT09IENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZXNzaW9uU3RhZ2UuSEFORFNIQUtFIHx8XHJcbiAgICAgICAgIChyZXNwb25zZS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuU2hvdWxkU2NyYW1ibGVBbmRVbnNjcmFtYmxlTWVzc2FnZXMgJiYgcmVzcG9uc2UgIT09IFwiPHhtbCBpZD1cXFwiTUdEQVRBXFxcIj5cXG48L3htbD5cIikpIHtcclxuICAgICAgICAgaWYgKHNlc3Npb25TdGFnZSA9PT0gQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1Nlc3Npb25TdGFnZS5IQU5EU0hBS0UpIHtcclxuICAgICAgICAgICAvLyBoYW5kc2hha2UgcmVxdWVzdHMgYXJlIGFsd2F5cyBzY3JhbWJsZWQuXHJcbiAgICAgICAgICAgRGVidWcuQXNzZXJ0KHJlc3BvbnNlLmxlbmd0aCA+IDAgJiYgcmVzcG9uc2VbMF0gIT09ICc8Jyk7XHJcbiAgICAgICAgIH1cclxuICAgICAgICAgcmVzcG9uc2UgPSBDb21tYW5kc1Byb2Nlc3NvckJhc2UuVW5TY3JhbWJsZShyZXNwb25zZSk7XHJcbiAgICAgICB9XHJcblxyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcIk1FU1NBR0UgRlJPTSBTRVJWRVI6IChzaXplID0gXCIgKyByZXNwb25zZS5sZW5ndGggKyBcIilcIiArIE9TRW52aXJvbm1lbnQuRW9sU2VxICsgcmVzcG9uc2UpO1xyXG5cclxuICAgICAgdGhpcy5fbGFzdFJlcXVlc3RUaW1lID0gTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKTtcclxuICAgICB9XHJcbiAgICAgY2F0Y2ggKGV4KVxyXG4gICAgIHtcclxuICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFNlcnZlckVycm9yKSB7XHJcbiAgICAgICAgIHJlcXVlc3RTdGF0dXMudmFsdWUgPSBSZXF1ZXN0U3RhdHVzLkFib3J0O1xyXG5cclxuXHJcbiAgICAgICAgIGlmIChzZXNzaW9uU3RhZ2UgPT0gQ29tbWFuZHNQcm9jZXNzb3JCYXNlX1Nlc3Npb25TdGFnZS5OT1JNQUwpIHtcclxuICAgICAgICAgICAvLyBJZiBjb250ZXh0IGlzIG5vdCBmb3VuZCBhdCBzZXJ2ZXIgZHVlIHRvIGNyYXNoIG9yIHRocmVhZCBpcyBhYm9ydGVkIGR1ZSB0byBjcmFzaCxcclxuICAgICAgICAgICAvLyBjaGVjayBXZWJDbGllbnRSZWluaXRTZXNzaW9uLiBiYXNlZCBvbiB0aGUgZmxhZywgcmUtaW5pdGlhbGl6aW5nIHJlcXVlc3Qgc2hvdWxkIGJlIHNlbnQgdG8gY3JlYXRlXHJcbiAgICAgICAgICAgLy8gYSBuZXcgY29udGV4dCBhbmQgaXQgc2hvdWxkIGJlIGV4ZWN1dGVkIGluIHRoaXMgbmV3IGNvbnRleHQuXHJcbiAgICAgICAgICAgLy8gc28sIHNldCB0aGUgUmVxdWVzdFN0YXR1cyB0byBSZXRyeSBzbyB0aGF0IHRoZSBjbGllbnQgd2lsbCByZXNlbmQgcmVxdWVzdC5cclxuICAgICAgICAgICBpZiAoZXguR2V0Q29kZSgpID09IFNlcnZlckVycm9yLkVSUl9DVFhfTk9UX0ZPVU5EIHx8IGV4LkdldENvZGUoKSA9PSBTZXJ2ZXJFcnJvci5FUlJfVEhSRUFEX0FCT1JURUQpIHtcclxuICAgICAgICAgICAgIGlmIChSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUmVtb3ZlZENvbnRleHRGcm9tU2VydmVyKSB7XHJcbiAgICAgICAgICAgICAgIHJlcXVlc3RTdGF0dXMudmFsdWUgPSBSZXF1ZXN0U3RhdHVzLlJldHJ5O1xyXG4gICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgIHN3aXRjaCAoRW52aXJvbm1lbnQuSW5zdGFuY2UuZ2V0V2ViQ2xpZW50UmVpbml0U2Vzc2lvbigpKSB7XHJcbiAgICAgICAgICAgICAgICAgY2FzZSAnWScgOlxyXG4gICAgICAgICAgICAgICAgICAgcmVxdWVzdFN0YXR1cy52YWx1ZSA9IFJlcXVlc3RTdGF0dXMuUmV0cnk7XHJcbiAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICBjYXNlICdBJzpcclxuICAgICAgICAgICAgICAgICAgIGxldCByZXR2YWwgPSBhd2FpdCBHVUlNYW5hZ2VyLkluc3RhbmNlLk1lc3NhZ2VCb3goXCJFcnJvclwiLCBcIlVua25vd24gZXJyb3Igb2NjdXJyZWQgYXQgc2VydmVyLXNpZGUuXCIgK1xyXG4gICAgICAgICAgICAgICAgICAgICBcIiBXb3VsZCB5b3UgbGlrZSB0byByZWluaXRpYWxpemUgdGhlIHNlc3Npb24/XCIsIFN0eWxlcy5NU0dCT1hfQlVUVE9OX1lFU19OTyk7XHJcbiAgICAgICAgICAgICAgICAgICByZXF1ZXN0U3RhdHVzLnZhbHVlID0gKHJldHZhbCA9PSBTdHlsZXMuTVNHQk9YX1JFU1VMVF9ZRVMpID8gUmVxdWVzdFN0YXR1cy5SZXRyeSA6IFJlcXVlc3RTdGF0dXMuQWJvcnQ7XHJcbiAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICBjYXNlICdOJzpcclxuICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgcmVxdWVzdFN0YXR1cy52YWx1ZSA9IFJlcXVlc3RTdGF0dXMuQWJvcnQ7XHJcbiAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgaWYgKHJlcXVlc3RTdGF0dXMudmFsdWUgPT0gUmVxdWVzdFN0YXR1cy5BYm9ydClcclxuICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgRW52aXJvbm1lbnQuSW5zdGFuY2Uuc2V0V2ViQ2xpZW50UmVpbml0U2Vzc2lvbignTicpO1xyXG4gICAgICAgICAgICAgICB0aHJvdyAgZXg7XHJcbiAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgbGV0IGVyckZvckNvbnNvbGUgPSBTdHJVdGlsLmdldENvbnNvbGVFcm9yU3RyaW5nKGV4LkdldE1lc3NhZ2UoKSk7XHJcbiAgICAgICAgICAgICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLmxhc3RFeGNlcHRpb25NZXNzYWdlID0gXCJFeGNlcHRpb24gT2NjdXJlZCBhdCBzZXJ2ZXIgc2lkZSA6IFwiICsgZXguR2V0Q29kZSgpLnRvU3RyaW5nKCkgKyBcIiA6IFwiICsgZXJyRm9yQ29uc29sZTtcclxuICAgICAgICAgICAgICAgY29uc29sZS5sb2coUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IubGFzdEV4Y2VwdGlvbk1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgfVxyXG4gICAgICAgICB9XHJcbiAgICAgICB9XHJcbiAgICAgICAvL0lmIGFueSBpdGVtcyBhcmUgc3RvcmVkIG9uIGxvY2FsIHN0b3JhZ2UgY2xlYXIgaXQgbm93IGFzIHNlc3Npb24gY2Fubm90IGNvbnRpbnVlZC5cclxuICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UuY2xlYXIoKTtcclxuICAgICAgIHRocm93IGV4O1xyXG4gICAgIH1cclxuICAgIHJldHVybiByZXNwb25zZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gQ2hlY2tzIHRoZSByZXNwb25zZSBzdHJpbmcsIHRocm93cyBhbiBlcnJvciBpZiB0aGUgcmVzcG9uc2Ugc3RyaW5nIGNvbnRhaW5zXHJcbiAgLy8vIGFuIHhtbC9odG1sIGVycm9yPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlc3BvbnNlXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIEhhbmRsZUVycm9yUmVzcG9uc2UocmVzcG9uc2U6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gZXJyb3IgcmVzcG9uc2VzIGFyZSBhbHdheXMgc2NyYW1ibGVkIGJ5IHRoZSB3ZWIgc2VydmVyLlxyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTZXJ2ZXJNZXNzYWdlc1RvTG9nKFwiTUVTU0FHRSBGUk9NIFNFUlZFUjogXCIgKyByZXNwb25zZSk7XHJcbiAgICAgIHJlc3BvbnNlID0gQ29tbWFuZHNQcm9jZXNzb3JCYXNlLlVuU2NyYW1ibGUocmVzcG9uc2UpO1xyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTZXJ2ZXJNZXNzYWdlc1RvTG9nKFwiTUVTU0FHRSBGUk9NIFNFUlZFUjogXCIgKyBTdHJVdGlsLmdldENvbnNvbGVFcm9yU3RyaW5nKHJlc3BvbnNlKSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXgpIHtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVzcG9uc2Uuc3RhcnRzV2l0aChcIjx4bWxlcnJcIikpIHtcclxuICAgICAgICBsZXQgZXJyb3JNZXNzYWdlWG1sOiBFcnJvck1lc3NhZ2VYbWwgPSBuZXcgRXJyb3JNZXNzYWdlWG1sKHJlc3BvbnNlLCB0aGlzLl9sYXN0UmVxdWVzdFRpbWUsIEFjY2Vzc0hlbHBlci5lbnZpcm9ubWVudC5nZXRDb250ZXh0SW5hY3Rpdml0eVRpbWVvdXQoKSk7XHJcbiAgICAgIHRocm93IG5ldyBTZXJ2ZXJFcnJvcihlcnJvck1lc3NhZ2VYbWwuR2V0TWVzc2FnZSgpLCBlcnJvck1lc3NhZ2VYbWwuR2V0Q29kZSgpKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHJlc3BvbnNlLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aChcIjxIVE1MXCIpKSB7XHJcbiAgICAgIHRocm93IG5ldyBTZXJ2ZXJFcnJvcihyZXNwb25zZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+c2VuZCAnZW5jb2RlZEJvZHknIHRvICd1cmwnIGFuZCByZWNlaXZlIGEgcmVzcG9uc2UuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ1cmxcIj5VUkwgdG8gYmUgYWNjZXNzZWQuPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJlbmNvZGVkQm9keVwiPkluIGNhc2Ugb2YgUE9TVCwgY29udGVudCB0byBiZSBzZW50IHRvIHNlcnZlci4gRm9yIG90aGVyIG1ldGhvZHMsIG51bGwuPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+dGhlIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlcjwvcmV0dXJucz5cclxuIHByaXZhdGUgYXN5bmMgRXhlY3V0ZVJlcXVlc3QodXJsOiBzdHJpbmcsIGVuY29kZWRCb2R5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuR2V0Q29udGVudCh1cmwsIGZhbHNlLCBlbmNvZGVkQm9keSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBHZXRDb250ZW50KHJlcXVlc3RlZFVSTDogc3RyaW5nLCB1c2VDYWNoZTogYm9vbGVhbiwgcmVxdWVzdENvbnRlbnQ/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgaWYgKGlzVW5kZWZpbmVkKHJlcXVlc3RDb250ZW50KSlcclxuICAgICAgcmVxdWVzdENvbnRlbnQgPSBudWxsO1xyXG5cclxuICAgIGxldCByZXNwb25zZVN0cjogc3RyaW5nO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIGlmIHJlbGF0aXZlLCBwcmVmaXggd2l0aCB0aGUgJ3Byb3RvY29sOi8vc2VydmVyLycgZnJvbSB3aGljaCB0aGUgcmljaC1jbGllbnQgd2FzIGFjdGl2YXRlZFxyXG4gICAgICBpZiAocmVxdWVzdGVkVVJMLnN0YXJ0c1dpdGgoXCIvXCIpKVxyXG4gICAgICAgIHJlcXVlc3RlZFVSTCA9IFNlcnZlckNvbmZpZy5JbnN0YW5jZS5nZXRQcm90b2NvbCgpICsgXCI6Ly9cIiArIFNlcnZlckNvbmZpZy5JbnN0YW5jZS5nZXRTZXJ2ZXIoKSArIHJlcXVlc3RlZFVSTDtcclxuXHJcbiAgICAgIHZhciBzcGlubmVyVGltZXIgPSB0aW1lcig1MCwgNTApO1xyXG4gICAgICB2YXIgc3Bpbm5lclRpbWVyU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gPSBzcGlubmVyVGltZXIuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5DaGVja0FuZFNob3dTcGlubmVyKHRydWUpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGxldCBpc0Vycm9yOiBSZWZQYXJhbTxib29sZWFuPiA9IG5ldyBSZWZQYXJhbShmYWxzZSk7XHJcblxyXG4gICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5yZXF1ZXN0TnVtYmVyKys7IC8vIGluY3JlYXNlIHRoZSBubyBvZiByZXF1ZXN0c1xyXG4gICAgICByZXNwb25zZVN0ciA9IGF3YWl0IEh0dHBNYW5hZ2VyLkdldEluc3RhbmNlKCkuR2V0Q29udGVudChyZXF1ZXN0ZWRVUkwsIHJlcXVlc3RDb250ZW50LCB1c2VDYWNoZSwgaXNFcnJvcik7XHJcbiAgICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLnRvdGFsUmVzcG9uc2VEYXRhTGVuZ3RoICs9IFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLnRvdGFsUmVzcG9uc2VEYXRhTGVuZ3RoICsgKCFpc051bGxPclVuZGVmaW5lZChyZXNwb25zZVN0cikgPyByZXNwb25zZVN0ci5sZW5ndGggOiAwKTtcclxuXHJcbiAgICAgIHNwaW5uZXJUaW1lclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICBzcGlubmVyVGltZXJTdWJzY3JpcHRpb24gPSBudWxsO1xyXG5cclxuICAgICAgaWYgKGlzRXJyb3IudmFsdWUpIHtcclxuICAgICAgICB0aGlzLkhhbmRsZUVycm9yUmVzcG9uc2UocmVzcG9uc2VTdHIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgLy8gZG9uJ3Qgd3JpdGUgc2VydmVyIGVycm9yIHRvIGxvZyB3aGVuIHRoZSBsb2cgbGV2ZWwgaXMgYmFzaWNcclxuICAgICAgaWYgKCEoZXggaW5zdGFuY2VvZiBTZXJ2ZXJFcnJvcikgfHwgTG9nZ2VyLkluc3RhbmNlLkxvZ0xldmVsICE9PSBMb2dnZXJfTG9nTGV2ZWxzLkJhc2ljKSB7XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2coZXgsIE5TdHJpbmcuRm9ybWF0KFwicmVxdWVzdGVkIFVSTCA9IFxcXCJ7MH1cXFwiXCIsIHJlcXVlc3RlZFVSTCkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyB0aGUgZXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24gYW5kIHRoZSBjYWxsZXJzIHNob3VsZCBoYW5kbGUgaXQuXHJcbiAgICAgIGlmICghKGV4IGluc3RhbmNlb2YgU2VydmVyRXJyb3IpKSB7XHJcbiAgICAgICAgZXggPSBuZXcgU2VydmVyRXJyb3IoZXguTWVzc2FnZSwgZXguSW5uZXJFeGNlcHRpb24gPyBleC5Jbm5lckV4Y2VwdGlvbiA6IGV4KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhyb3cgZXg7XHJcbiAgICB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgaWYgKHNwaW5uZXJUaW1lclN1YnNjcmlwdGlvbiAhPSBudWxsKVxyXG4gICAgICAgIHNwaW5uZXJUaW1lclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXNwb25zZVN0cjtcclxuICB9XHJcblxyXG5cclxuICBDbGllbnRBY3RpdmF0ZWQoKSB7XHJcblxyXG4gICAgLy8gbG9nIHRoZSB2YWx1ZXMgYXMgY2xpZW50IGlzIGFjdGl2ZSBhZ2FpblxyXG4gICAgLy8gVE9ETyAtIGZvcm1hdHRpbmdcclxuICAgIC8vIGNvbnNvbGUubG9nKCdMb2dnaW5nIFN1bW1hcnkgJyArICdcXG4nICtcclxuICAgIC8vICAgJ1RvdGFsIG51bWJlciByZXF1ZXN0cyA6ICcgKyBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5yZXF1ZXN0TnVtYmVyICsgJ1xcbicgK1xyXG4gICAgLy8gICAnVG90YWwgdGltZSBuZWVkZWQgZm9yIGh0dHAgcmVxdWVzdHMgOiAnICsgUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IudG90YWxUaW1lRm9ySFRUUFJlcXVlc3RzICsgJyBtcyAnICsgJ1xcbicgK1xyXG4gICAgLy8gICAnVG90YWwgdGltZSBuZWVkZWQgZm9yIGNsaWVudCB0byBnZXQgYWN0aXZlIDogJyArIGV4ZWN1dGlvblRpbWUgKyAnIG1zICcgKyAnXFxuJ1xyXG4gICAgLy8gKTtcclxuICAgIC8vXHJcbiAgICAvLyAvLyBUT0RPIC0gbW92ZSBpdCB0byBtZXRob2RcclxuICAgIC8vIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLnJlcXVlc3ROdW1iZXIgPSAwO1xyXG4gICAgLy8gUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IudG90YWxUaW1lRm9ySFRUUFJlcXVlc3RzID0gMDtcclxuICAgIC8vIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLnRvdGFsUmVxdWVzdERhdGFMZW5ndGggPSAwO1xyXG4gICAgLy8gUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IudG90YWxSZXNwb25zZURhdGFMZW5ndGggPSAwO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBXaGVuIExvZ0NsaWVudFNlcXVlbmNlRm9yQWN0aXZpdHlNb25pdG9yID0gWSB3ZSB3aWxsIGJlIGtlZXBpbmcgdGhlIGxvZ3MgaW4gZmlsZSBhbmQgc2VuZCB0aGUgZmlsZSB3aXRoIG5leHRcclxuICAvLy8gc2VydmVyIGFjY2Vzcy4gSWYgY2xpZW50IGlzIGFibm9ybWFsbHkgdGVybWluYXRlZCB0aGVuIHRoZXJlIGNhbiBiZSAxIG9yIG1vcmUgZmlsZXMgY29udGFpbmluZyBsb2dzIHNpbmNlXHJcbiAgLy8vIGxhc3Qgc2VydmVyIGFjY2Vzcy5Ob3cgdGhlc2UgbG9ncyB3aWxsIGJlIHNlbnQgdG8gc2VydmVyLCB3aGVuIG5leHQgdGltZSBSQyBwcm9ncmFtIGlzIGV4ZWN1dGVkLC48L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiBJZiBzZW5kaW5nIHdhcyBzdWNjZXNzZnVsPC9yZXR1cm5zPlxyXG4gIC8vICAgVE9ETzogSGFuZGxlIHBlbmRpbmcgbG9ncy5cclxuICAvLyBwcml2YXRlIFNlbmRQZW5kaW5nTG9nc1RvU2VydmVyKCk6IGJvb2xlYW4ge1xyXG4gIC8vICAgbGV0IHN1Y2Nlc3M6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIC8vXHJcbiAgLy8gICBUaGUgcGVuZGluZyBsb2dzIGNhbm5vdCBiZSByZWFkIGZyb20gdGhlIGZpbGUgc3lzdGVtIHNpbmNlIFdlYkNsaWVudCBkb2Vzbid0IGhhdmUgYWNjZXNzIHRvIHRoYXQuXHJcbiAgLy8gICBNYXliZSwgdGhlIGxvZ3Mgc2hvdWxkIGJlIHdyaXR0ZW4gaW50byBMb2NhbFN0b3JhZ2UgYWQgcmVhZCBmcm9tIHRoZXJlLlxyXG4gIC8vXHJcbiAgLy8gICBsZXQgc3RyaW5nQnVpbGRlcjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKDEwMDApO1xyXG4gIC8vICAgbGV0IGZsb3dNb25pdG9yOiBGbG93TW9uaXRvclF1ZXVlID0gRmxvd01vbml0b3JRdWV1ZS5JbnN0YW5jZTtcclxuICAvL1xyXG4gIC8vICAgLy8gR2V0IGl0ZXJhdG9yIHRvIG5hbWVzIG9mIGxvZyBmaWxlcy5cclxuICAvLyAgIGxldCBlbnVtZXJhdG9yOiBJRW51bWVyYXRvcjxzdHJpbmc+ID0gQ2xpZW50TG9nQWNjdW11bGF0b3IuRXhpc3RpbmdMb2dJdGVyYXRvcigpO1xyXG4gIC8vXHJcbiAgLy8gICAvLyB3aGlsZSB0aGVyZSBhcmUgbW9yZSBmaWxlc1xyXG4gIC8vICAgd2hpbGUgKGVudW1lcmF0b3IuTW92ZU5leHQoKSkge1xyXG4gIC8vICAgICAvLyBUYWtlIG5leHQgZmlsZSBuYW1lXHJcbiAgLy8gICAgIGxldCBsb2dOYW1lOiBzdHJpbmcgPSBlbnVtZXJhdG9yLkN1cnJlbnQ7XHJcbiAgLy8gICAgIC8vIFByZXBhcmUgdGhlIGhlYWRlciBsaW5lIChDbGllbnQgbG9nIGZpbGUgOiA8Q29udGV4dCA6IFhYWFhYWD4pIGFuZCBhZGQgaXQgdG9cclxuICAvLyAgICAgLy8gZmxvdyBtb25pdG9yIGJ1aWxkIG1vbml0b3IgbWVzc2FnZVxyXG4gIC8vICAgICBsZXQgaGVhZGVyTGluZTogc3RyaW5nID0gQ2xpZW50TG9nQWNjdW11bGF0b3IuQnVpbGRMb2dIZWFkZXJMaW5lKGxvZ05hbWUpO1xyXG4gIC8vICAgICBmbG93TW9uaXRvci5hZGRGbG93VmVyaWZ5SW5mbyhoZWFkZXJMaW5lKTtcclxuICAvLyAgICAgbGV0IGxvZ0N0eEJ1ZjogU3RyaW5nQnVpbGRlciA9IFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLkJ1aWxkTW9uaXRvck1lc3NhZ2UoKTtcclxuICAvL1xyXG4gIC8vICAgICBsZXQgZmlsZUNvbnRlbnRzOiBzdHJpbmcgPSBIYW5kbGVGaWxlcy5yZWFkVG9TdHJpbmcobG9nTmFtZSk7XHJcbiAgLy8gICAgIGxvZ0N0eEJ1Zi5BcHBlbmQoZmlsZUNvbnRlbnRzKTtcclxuICAvLyAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQobG9nQ3R4QnVmLlRvU3RyaW5nKCkpO1xyXG4gIC8vICAgfVxyXG4gIC8vXHJcbiAgLy8gICBsZXQgcmVzcEJ1Zjogc3RyaW5nID0gbnVsbDtcclxuICAvL1xyXG4gIC8vICAgdHJ5IHtcclxuICAvLyAgICAgcmVzcEJ1ZiA9IHRoaXMuRGlzcGF0Y2hSZXF1ZXN0KHRoaXMuU2VydmVyVXJsLCBzdHJpbmdCdWlsZGVyLlRvU3RyaW5nKCksIENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZXNzaW9uU3RhZ2UuTk9STUFMKTtcclxuICAvLyAgIH1cclxuICAvLyAgIGNhdGNoIChleCkge1xyXG4gIC8vICAgICAvLyBkbyBub3RoaW5nLiBpZiBzZW5kaW5nIGxvZyBmYWlscywgdGhlcmUgaXMgbm8gaGFybS5cclxuICAvLyAgIH1cclxuICAvL1xyXG4gIC8vICAgaWYgKHJlc3BCdWYgPT09IG51bGwpIHtcclxuICAvLyAgICAgc3VjY2VzcyA9IGZhbHNlO1xyXG4gIC8vICAgfVxyXG4gIC8vXHJcbiAgLy8gICByZXR1cm4gc3VjY2VzcztcclxuICAvLyB9XHJcblxyXG4gIC8vIFRPRE86IEhhbmRsZSBwZW5kaW5nIGxvZ3MuXHJcbiAgLy8gcHJpdmF0ZSBzdGF0aWMgRGVsZXRlUGVuZGluZ0xvZ3MoKTogdm9pZCB7XHJcbiAgLy8gICBsZXQgZW51bWVyYXRvcjogSUVudW1lcmF0b3IgPSBDbGllbnRMb2dBY2N1bXVsYXRvci5FeGlzdGluZ0xvZ0l0ZXJhdG9yKCk7XHJcbiAgLy8gICB3aGlsZSAoZW51bWVyYXRvci5Nb3ZlTmV4dCgpKSB7XHJcbiAgLy8gICAgIGxldCBmaWxlbmFtZTogc3RyaW5nID0gPHN0cmluZz5lbnVtZXJhdG9yLkN1cnJlbnQ7XHJcbiAgLy8gICAgIEhhbmRsZUZpbGVzLmRlbGV0ZUZpbGUoZmlsZW5hbWUpO1xyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBnZXQgdGhlIHN1ZmZpeCBvZiB0aGUgVVJMIHRvIGJlIHNlbnQgdG8gdGhlIHNlcnZlci4gVGhpcyBpbmNsdWRlcyB0aGUgQ1RYLCBTRVNTSU9OIGFuZCBEQVRBIHBhcmFtZXRlcnMuPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImhhc0NvbnRlbnRcIj5pZiB0cnVlLCB0aGUgSFRUUCBEQVRBIHBhcmFtZXRlciBjb250YWlucyBzb21ldGhpbmcuPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc0luaXRpYWxDYWxsXCI+aWYgdHJ1ZSB0aGVuIHRoZSBnZW5lcmF0ZWQgc3VmZml4IGhhcyBubyBzcGVjaWZpYyBjb250ZXh0IGRhdGE8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIFVSTCBzdWZmaXggKGkuZS4gXCJDVFg9Li4uJlNFU1NJT049Li4uJkRBVEE9XCI8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBCdWlsZFVybFN1ZmZpeChoYXNDb250ZW50OiBib29sZWFuLCBpc0luaXRpYWxDYWxsOiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIGxldCBwcmVmaXg6IHN0cmluZyA9IENvbnN0SW50ZXJmYWNlLlJDX0lORElDQVRJT04gKyBDb25zdEludGVyZmFjZS5SQ19UT0tFTl9DVFhfSUQgKyBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuQ29udGV4dElEO1xyXG5cclxuICAgIC8vIEFwcGVuZCBzZXNzaW9uIGlkIGluIHVybCBvbmx5IHdoZW4gaXQgaXMgbm90IG51bGwgb3IgZW1wdHlcclxuICAgIC8vIE5PVEU6IHNlc3Npb24gaWQgd2lsbCBiZSBzZW5kIGJ5IHNlcnZlciBvbmx5IGZvciBHUyBhcyBtaWRkbGV3YXJlXHJcbiAgICAvLyAgICAgICBhbmQgd2hlbiBzZXBlY2lhbCBmbGFnIChTcGVjaWFsUklBR2VuZXJhdGVBbmRWYWxpZGF0ZVNlc3Npb25JRCkgaXMgb25cclxuICAgIC8vICAgICAgIHNvIHNlc3Npb24gaWQgd2lsbCBiZSBudWxsIGZvciBicm9rZXIgbWlkZGxld2FyZSBhbmQgd2hlbiBzcGVjaWFsIGZsYWcgaXMgT0ZGLlxyXG4gICAgaWYgKCFpc051bGxPclVuZGVmaW5lZCh0aGlzLlNlc3Npb25JZCkpXHJcbiAgICAgIHByZWZpeCArPSAoQ29uc3RJbnRlcmZhY2UuUkVRX0FSR19TRVBBUkFUT1IgKyBDb25zdEludGVyZmFjZS5SQ19UT0tFTl9TRVNTSU9OX0lEICsgdGhpcy5TZXNzaW9uSWQpO1xyXG5cclxuICAgIGlmIChpc0luaXRpYWxDYWxsKSB7XHJcbiAgICAgIC8vIFRPRE86IEhvdyB0byBnZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzP1xyXG4gICAgICAvLyBsZXQgZW52VmFyczogc3RyaW5nID0gQ2xpZW50TWFuYWdlci5JbnN0YW5jZS5nZXRFbnZWYXJzKCk7XHJcbiAgICAgIC8vIGlmICghTlN0cmluZy5Jc051bGxPckVtcHR5KGVudlZhcnMpKSB7XHJcbiAgICAgIC8vICAgLy8gZW52aXJvbm1lbnQgdmFyaWFibGVzOiBFTlYxLEVOVjIsLi4gLS0+ICZFTlYxPXZhbDEmRU5WMj12YWwyLi4uXHJcbiAgICAgIC8vICAgbGV0IGVudlZhcnNWZWM6IHN0cmluZ1tdID0gZW52VmFycy5zcGxpdChcIixcIik7XHJcbiAgICAgIC8vICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGVudlZhcnNWZWMubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgLy8gICAgIHByZWZpeCArPSAoXCImXCIgKyBlbnZWYXJzVmVjW2ldICsgXCI9XCIgKyBPU0Vudmlyb25tZW50LmdldChlbnZWYXJzVmVjW2ldKSk7XHJcbiAgICAgIC8vICAgfVxyXG4gICAgICAvLyB9XHJcbiAgICAgIGlmIChSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5Jc1Nlc3Npb25SZUluaXRpYWxpemluZylcclxuICAgICAgICBwcmVmaXggKz0gKENvbnN0SW50ZXJmYWNlLlJFUV9BUkdfU0VQQVJBVE9SICsgQ29uc3RJbnRlcmZhY2UuV0VCQ0xJRU5UX1JFSU5JVElBTElaRV9SRVFVRVNUKTtcclxuXHJcbiAgICAgIGxldCBnbG9iYWxQYXJhbXM6IHN0cmluZyA9IFNlcnZlckNvbmZpZy5JbnN0YW5jZS5nZXRHbG9iYWxQYXJhbXMoKTtcclxuICAgICAgaWYgKGdsb2JhbFBhcmFtcyAhPT0gbnVsbCkge1xyXG4gICAgICAgIGdsb2JhbFBhcmFtcyA9IE5TdHJpbmcuUmVwbGFjZShnbG9iYWxQYXJhbXMsIFwiK1wiLCBcIiUyQlwiKTtcclxuICAgICAgICBwcmVmaXggKz0gKFwiJlwiICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0dMT0JBTFBBUkFNUyArIFwiPVwiICsgZ2xvYmFsUGFyYW1zKTtcclxuICAgICAgfVxyXG4gICAgfSAvLyBpc0luaXRpYWxDYWxsXHJcblxyXG4gICAgaWYgKGhhc0NvbnRlbnQpIHtcclxuICAgICAgcHJlZml4ICs9IChcIiZcIiArIENvbnN0SW50ZXJmYWNlLlJDX1RPS0VOX1NFU1NJT05fQ09VTlQgKyB0aGlzLkdldFNlc3Npb25Db3VudGVyKCkgK1xyXG4gICAgICAgIENvbnN0SW50ZXJmYWNlLlJFUV9BUkdfU0VQQVJBVE9SICsgQ29uc3RJbnRlcmZhY2UuUkNfVE9LRU5fREFUQSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHByZWZpeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5zZW5kIE1vbml0b3IgbWVzc2FnaW5nIHRvIHRoZSBzZXJ2ZXI8L3N1bW1hcnk+XHJcbiAgcHVibGljIGFzeW5jIFNlbmRNb25pdG9yT25seSgpOiBQcm9taXNlPHZvaWQ+XHJcbiAge1xyXG4gICAgbGV0IGZsb3dNb25pdG9yOiBGbG93TW9uaXRvclF1ZXVlID0gRmxvd01vbml0b3JRdWV1ZS5JbnN0YW5jZTtcclxuXHJcbiAgICBpZiAoQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlID09IG51bGwgfHwgQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldE1HRGF0YSgwKSA9PSBudWxsIHx8IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5nZXRNR0RhdGEoMCkuSXNBYm9ydGluZylcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGlmICghZmxvd01vbml0b3IuaXNFbXB0eSgpKVxyXG4gICAge1xyXG4gICAgICAvLyBidWlsZCBvdXQgbWVzc2FnZVxyXG4gICAgICBsZXQgYnVmZmVyOiBTdHJpbmdCdWlsZGVyID0gdGhpcy5CdWlsZE1vbml0b3JNZXNzYWdlKCk7XHJcblxyXG4gICAgICAvLyBJZiBjbGllbnQgc2VxdWVuY2UgaXMgdG8gYmUgYWNjdW11bGF0ZWQgdW50aWwgbmV4dCBzZXJ2ZXIgYWNjZXNzLlxyXG4gICAgICBsZXQgc2hvdWxkQWNjdW11bGF0ZUNsaWVudExvZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAvLyBzaG91bGRBY2N1bXVsYXRlQ2xpZW50TG9nID0gQ2xpZW50TWFuYWdlci5JbnN0YW5jZS5nZXRMb2dDbGllbnRTZXF1ZW5jZUZvckFjdGl2aXR5TW9uaXRvcigpO1xyXG4gICAgICAvLyBpZiAoc2hvdWxkQWNjdW11bGF0ZUNsaWVudExvZykge1xyXG4gICAgICAvLyAgIGlmICh0aGlzLl9sb2dBY2N1bXVsYXRvciA9PSBudWxsKVxyXG4gICAgICAvLyAgICAgdGhpcy5fbG9nQWNjdW11bGF0b3IgPSBuZXcgQ2xpZW50TG9nQWNjdW11bGF0b3IoQ2xpZW50TWFuYWdlclJ1bnRpbWUuSW5zdGFuY2UuUnVudGltZUN0eC5Db250ZXh0SUQpO1xyXG4gICAgICAvL1xyXG4gICAgICAvLyAgIC8vIElmIHdlJ3JlIHVuYWJsZSB0byBvcGVuIHRoZSBmaWxlLCBkZWFjdGl2YXRlIGxvZ2dpbmcgYWNjdW11bGF0aW9uLFxyXG4gICAgICAvLyAgIC8vICAgIGFuZCBsZXQgdGhlIG1lc3NhZ2UgYmUgc2VudCB0byB0aGUgc2VydmVyIGFzIGRvbmUgd2l0aG91dCBhY2N1bXVsYXRlZCBsb2dnaW5nXHJcbiAgICAgIC8vICAgaWYgKHRoaXMuX2xvZ0FjY3VtdWxhdG9yLklzRmFpbGVkKCkpXHJcbiAgICAgIC8vICAgICBzaG91bGRBY2N1bXVsYXRlQ2xpZW50TG9nID0gZmFsc2U7XHJcbiAgICAgIC8vIH1cclxuXHJcbiAgICAgIGlmIChzaG91bGRBY2N1bXVsYXRlQ2xpZW50TG9nKSB7XHJcbiAgICAgICAgLy8gV3JpdGUgbWVzc2FnZSB0byBmaWxlLlxyXG4gICAgICAgIC8vIHRoaXMuX2xvZ0FjY3VtdWxhdG9yLldyaXRlKGJ1ZmZlci5Ub1N0cmluZygpKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgbGV0IHJlcXVlc3RTdGF0dXM6IFJlZlBhcmFtPFJlcXVlc3RTdGF0dXM+ID0gbmV3IFJlZlBhcmFtKFJlcXVlc3RTdGF0dXMuSGFuZGxlZCk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLkRpc3BhdGNoUmVxdWVzdCh0aGlzLlNlcnZlclVybCwgYnVmZmVyLlRvU3RyaW5nKCksIENvbW1hbmRzUHJvY2Vzc29yQmFzZV9TZXNzaW9uU3RhZ2UuTk9STUFMLCByZXF1ZXN0U3RhdHVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgLy8gZG8gbm90aGluZy4gaWYgc2VuZGluZyBsb2cgZmFpbHMsIHRoZXJlIGlzIG5vIGhhcm0uXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+YnVpbGQgRmxvdyBNb25pdG9yIG1lc3NhZ2U8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBCdWlsZE1vbml0b3JNZXNzYWdlKCk6IFN0cmluZ0J1aWxkZXIge1xyXG4gICAgbGV0IGJ1ZmZlcjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKDEwMDApO1xyXG4gICAgbGV0IGZsb3dNb25pdG9yOiBGbG93TW9uaXRvclF1ZXVlID0gRmxvd01vbml0b3JRdWV1ZS5JbnN0YW5jZTtcclxuXHJcbiAgICBpZiAoIVJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLlNob3VsZFNjcmFtYmxlQW5kVW5zY3JhbWJsZU1lc3NhZ2VzKSB7XHJcbiAgICAgIGJ1ZmZlci5BcHBlbmQoWE1MQ29uc3RhbnRzLk1HX1RBR19PUEVOKTtcclxuICAgICAgZmxvd01vbml0b3IuYnVpbGRYTUwoYnVmZmVyKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBmbG93TW9uaXRvci5idWlsZFhNTChidWZmZXIpO1xyXG4gICAgICBsZXQgc2NyYW1ibGVkT3V0OiBzdHJpbmcgPSBTY3JhbWJsZXIuU2NyYW1ibGUoYnVmZmVyLlRvU3RyaW5nKCkpO1xyXG4gICAgICBidWZmZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigxMDAwKTtcclxuICAgICAgYnVmZmVyLkFwcGVuZChYTUxDb25zdGFudHMuTUdfVEFHX09QRU4gKyBzY3JhbWJsZWRPdXQpO1xyXG4gICAgfVxyXG4gICAgYnVmZmVyLkFwcGVuZChcIjwvXCIgKyBYTUxDb25zdGFudHMuTUdfVEFHX1hNTCArIFhNTENvbnN0YW50cy5UQUdfQ0xPU0UpO1xyXG5cclxuICAgIHJldHVybiBidWZmZXI7XHJcbiAgfVxyXG5cclxuICBSZWdpc3RlckRlbGVnYXRlcygpOiB2b2lkIHtcclxuICAgIEh0dHBDbGllbnRFdmVudHMuR2V0U2Vzc2lvbkNvdW50ZXJfRXZlbnQgPSB0aGlzLkdldFNlc3Npb25Db3VudGVyLmJpbmQodGhpcyk7XHJcbiAgICBIdHRwQ2xpZW50RXZlbnRzLkNoZWNrQW5kU2V0U2Vzc2lvbkNvdW50ZXJfRXZlbnQgPSB0aGlzLkNoZWNrQW5kU2V0U2Vzc2lvbkNvdW50ZXIuYmluZCh0aGlzKTtcclxuICAgIEh0dHBDbGllbnRFdmVudHMuQ29tcHV0ZUFuZExvZ1JlcXVlc3RJbmZvX0V2ZW50ID0gdGhpcy5Db21wdXRlQW5kTG9nUmVxdWVzdEluZm8uYmluZCh0aGlzKTtcclxuICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLlNwaW5uZXJTdG9wcGVkLnN1YnNjcmliZShjbGllbnRCdXN5VGltZSA9PiB0aGlzLkNsaWVudEFjdGl2YXRlZCgpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gTG9nIHRoZSBjdXJyZW50IHJlcXVlc3QgaW5mb3JtYXRpb24gaW4gY29uc29sZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgQ29tcHV0ZUFuZExvZ1JlcXVlc3RJbmZvKGNvbnRlbnRMZW5ndGg6IG51bWJlciwgcm91bmRUcmlwOiBudW1iZXIsIGlzTG9nZ2luZ1Jlc3BvbnNlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZighaXNOdWxsT3JVbmRlZmluZWQodGhpcy5fcmVxdWVzdEluZm8uc2VydmVyQ2FsbEF0KSkge1xyXG5cclxuICAgICAgdGhpcy5fcmVxdWVzdEluZm8uZXh0cmFJbmZvLmNvbnRlbnRMZW5ndGggPSBjb250ZW50TGVuZ3RoO1xyXG4gICAgICB0aGlzLl9yZXF1ZXN0SW5mby5leHRyYUluZm8udGltZVN0YW1wID0gbmV3IERhdGUoKS50b1N0cmluZygpO1xyXG4gICAgICBsZXQgZXh0cmFNZXNzYWdlU3RyOiBzdHJpbmcgPSBpc0xvZ2dpbmdSZXNwb25zZT8gJ1Jlc3BvbnNlIOKktScgOiAnUmVxdWVzdCDipLUnO1xyXG5cclxuICAgICAgaWYgKGlzTG9nZ2luZ1Jlc3BvbnNlKSB7XHJcbiAgICAgICAgdGhpcy5fcmVxdWVzdEluZm8ucm91bmR0cmlwVGltZSA9IHJvdW5kVHJpcDtcclxuICAgICAgICBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci50b3RhbFRpbWVGb3JIVFRQUmVxdWVzdHMgKz0gcm91bmRUcmlwOyAvLyBhZGQgdGhlIHJlcXVlc3QgdGltZSB0byB0b3RhbCB0aW1lXHJcbiAgICAgIH0gZWxzZVxyXG4gICAgICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLnRvdGFsUmVxdWVzdERhdGFMZW5ndGggKz0gY29udGVudExlbmd0aDsgLy8gYWRkIHRoZSByZXF1ZXN0IGNvbnRlbnQgdG8gdG90YWwgdGltZVxyXG5cclxuXHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVJlcXVlc3RJbmZvVG9Mb2codGhpcy5fcmVxdWVzdEluZm8sIGV4dHJhTWVzc2FnZVN0cik7XHJcblxyXG4gICAgICAvLyBDbGVhciB0aGUgY2xpZW50IHNlc3Npb24gYWZ0ZXIgbG9nZ2luZyB0aGUgcmVzcG9uc2VcclxuICAgICAgaWYgKGlzTG9nZ2luZ1Jlc3BvbnNlKVxyXG4gICAgICAgIHRoaXMuX3JlcXVlc3RJbmZvLmNsZWFyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFdoZW4gdHJ1ZSwgcmVxdWVzdHMgYXJlIHNjcmFtYmxlZCBhbmQgcmVzcG9uc2VzIGFyZSB1bnNjcmFtYmxlZC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHN0YXRpYyBzZXQgU2hvdWxkU2NyYW1ibGVBbmRVbnNjcmFtYmxlTWVzc2FnZXModmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yLl9zaG91bGRTY3JhbWJsZUFuZFVuc2NyYW1ibGVNZXNzYWdlcyA9IHZhbHVlO1xyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlU2VydmVyTWVzc2FnZXNUb0xvZyhOU3RyaW5nLkZvcm1hdChcIlNob3VsZFNjcmFtYmxlQW5kVW5zY3JhbWJsZU1lc3NhZ2VzLlNldDogezB9XCIsIHRoaXMuX3Nob3VsZFNjcmFtYmxlQW5kVW5zY3JhbWJsZU1lc3NhZ2VzKSk7XHJcbiAgfVxyXG4gIHN0YXRpYyBnZXQgU2hvdWxkU2NyYW1ibGVBbmRVbnNjcmFtYmxlTWVzc2FnZXMoKTogYm9vbGVhbiB7XHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTZXJ2ZXJNZXNzYWdlc1RvTG9nKE5TdHJpbmcuRm9ybWF0KFwiU2hvdWxkU2NyYW1ibGVBbmRVbnNjcmFtYmxlTWVzc2FnZXMuR2V0OiB7MH1cIiwgdGhpcy5fc2hvdWxkU2NyYW1ibGVBbmRVbnNjcmFtYmxlTWVzc2FnZXMpKTtcclxuICAgIHJldHVybiBSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5fc2hvdWxkU2NyYW1ibGVBbmRVbnNjcmFtYmxlTWVzc2FnZXM7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PnBhcnNlIHRoZSBsb2cgbGV2ZWwgZnJvbSBhIHN0cmluZyB2YWx1ZTwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzdHJMb2dMZXZlbFwiPnN0cmluZyB2YWx1ZSBvZiB0aGUgbG9nIGxldmVsPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+bG9nIGxldmVsPC9yZXR1cm5zPlxyXG4gIHBhcnNlTG9nTGV2ZWwoc3RyTG9nTGV2ZWw6IHN0cmluZyk6IExvZ2dlcl9Mb2dMZXZlbHMge1xyXG4gICAgbGV0IGxvZ0xldmVsOiBMb2dnZXJfTG9nTGV2ZWxzID0gTG9nZ2VyX0xvZ0xldmVscy5Ob25lO1xyXG5cclxuICAgIGlmICghTlN0cmluZy5Jc051bGxPckVtcHR5KHN0ckxvZ0xldmVsKSkge1xyXG4gICAgICBpZiAoc3RyTG9nTGV2ZWwudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKCBcIlNFUlZFUlwiKSlcclxuICAgICAgICBsb2dMZXZlbCA9IHN0ckxvZ0xldmVsLmVuZHNXaXRoKFwiI1wiKSA/IExvZ2dlcl9Mb2dMZXZlbHMuU2VydmVyTWVzc2FnZXMgOiBMb2dnZXJfTG9nTGV2ZWxzLlNlcnZlcjsgLy8gb25seSByZXF1ZXN0cyB0byB0aGUgc2VydmVyXHJcbiAgICAgIGVsc2UgaWYgKHN0ckxvZ0xldmVsLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aChcIlNcIikgfHwgc3RyTG9nTGV2ZWwudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKFwiUVwiKSlcclxuICAgICAgICBsb2dMZXZlbCA9IExvZ2dlcl9Mb2dMZXZlbHMuU3VwcG9ydDtcclxuICAgICAgZWxzZSBpZiAoc3RyTG9nTGV2ZWwudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKFwiR1wiKSlcclxuICAgICAgICBsb2dMZXZlbCA9IExvZ2dlcl9Mb2dMZXZlbHMuR3VpO1xyXG4gICAgICBlbHNlIGlmIChzdHJMb2dMZXZlbC50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoXCJEXCIpKVxyXG4gICAgICAgIGxvZ0xldmVsID0gTG9nZ2VyX0xvZ0xldmVscy5EZXZlbG9wbWVudDtcclxuICAgICAgZWxzZSBpZiAoc3RyTG9nTGV2ZWwudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKFwiQlwiKSlcclxuICAgICAgICBsb2dMZXZlbCA9IExvZ2dlcl9Mb2dMZXZlbHMuQmFzaWM7XHJcbiAgICAgIGVsc2UgaWYgKHN0ckxvZ0xldmVsLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aChcIlJcIikpXHJcbiAgICAgICAgbG9nTGV2ZWwgPSBMb2dnZXJfTG9nTGV2ZWxzLlJlcXVlc3RJbmZvO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBsb2dMZXZlbDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+IGJ1aWxkIHRoZSBYTUwgc3RyaW5nIG9mIHRoZSBkYXRhIHRoYXQgc2hvdWxkIGJlIHNlbnQgdG8gdGhlIHNlcnZlcjwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzZXJpYWxpemVUYXNrc1wiPmlmIHRydWUsIHRhc2tzIGluIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiB3aWxsIGFsc28gYmUgc2VyaWFsaXplZC48L3BhcmFtPlxyXG4gIGFzeW5jIFByZXBhcmVSZXF1ZXN0KHNlcmlhbGl6ZVRhc2tzOiBib29sZWFuKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGxldCB4bWxCdWY6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgeG1sQnVmLkFwcGVuZChYTUxDb25zdGFudHMuTUdfVEFHX09QRU4pO1xyXG5cclxuICAgIC8vIHRoZSBjbGllbnQgbm8gbG9uZ2VyIHNlbmRzIChhbmQgZW1wdGllcykgdGhlIGV2ZW50IHF1ZXVlIHRvIHRoZSBzZXJ2ZXJcclxuICAgIC8vIHNpbmNlIHRoZSBzZXJ2ZXIgaGFzIG5vdGhpbmcgdXNlZnVsIHRvIGRvIHdpdGggdGhlIGNsaWVudCBwZW5kaW5nIGV2ZW50c1xyXG4gICAgaWYgKEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5nZXRDdXJyTUdEYXRhKCkgIT09IG51bGwpIHtcclxuICAgICAgbGV0IHhtbFVuc2NyYW1ibGVkOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmJ1aWxkWE1MKHhtbFVuc2NyYW1ibGVkLCBzZXJpYWxpemVUYXNrcyk7XHJcblxyXG4gICAgICBpZiAoUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuU2hvdWxkU2NyYW1ibGVBbmRVbnNjcmFtYmxlTWVzc2FnZXMpXHJcbiAgICAgICAgeG1sQnVmLkFwcGVuZChTY3JhbWJsZXIuU2NyYW1ibGUoeG1sVW5zY3JhbWJsZWQuVG9TdHJpbmcoKSkpO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgeG1sQnVmLkFwcGVuZCh4bWxVbnNjcmFtYmxlZC5Ub1N0cmluZygpKTtcclxuICAgIH1cclxuICAgIHhtbEJ1Zi5BcHBlbmQoXCI8L1wiICsgWE1MQ29uc3RhbnRzLk1HX1RBR19YTUwgKyBYTUxDb25zdGFudHMuVEFHX0NMT1NFKTtcclxuXHJcbiAgICByZXR1cm4geG1sQnVmLlRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PnBhcnNlIGEgcmVzcG9uc2UgKGZyb20gdGhlIFNlcnZlcikgYW5kIGV4ZWN1dGUgY29tbWFuZHMgaWYgcmV0dXJuZWQgd2l0aGluIHRoZSByZXNwb25zZS48L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVzcG9uc2VcIj4oWE1MIGZvcm1hdHRlZCkgcmVzcG9uc2UuPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjdXJyTWdkSURcIj5udW1iZXIgb2Ygd2luZG93IGluIGdsb2JhbCBhcnJheTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwib3BlbmluZ1Rhc2tEZXRhaWxzXCI+YWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvZiBvcGVuaW5nIHRhc2s8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlc1wiPnJlc3VsdCB0byBiZSByZWFkIGZyb20gY29tbWFuZCByZXR1cm5lZCB3aXRpbiB0aGUgcmVzcG9uc2UuPC9wYXJhbT5cclxuICBhc3luYyBQcm9jZXNzUmVzcG9uc2UocmVzcG9uc2U6IHN0cmluZywgY3Vyck1nZElEOiBudW1iZXIsIG9wZW5pbmdUYXNrRGV0YWlsczogT3BlbmluZ1Rhc2tEZXRhaWxzLCByZXM6IElSZXN1bHRWYWx1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCI8LS0gUHJvY2Vzc1Jlc3BvbnNlIHN0YXJ0ZWQgLS0+XCIpO1xyXG4gICAgaWYob3BlbmluZ1Rhc2tEZXRhaWxzID09PSBudWxsKVxyXG4gICAgICBvcGVuaW5nVGFza0RldGFpbHMgPSBuZXcgT3BlbmluZ1Rhc2tEZXRhaWxzKCk7XHJcblxyXG4gICAgbGV0IHN5c3RlbU1pbGxpc2Vjb25kczogbnVtYmVyID0gTWlzYy5nZXRTeXN0ZW1NaWxsaXNlY29uZHMoKTtcclxuICAgIGlmIChyZXNwb25zZSA9PT0gbnVsbCB8fCByZXNwb25zZS50cmltKCkubGVuZ3RoID09PSAwKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmN1cnJNZ2RJRCA9IGN1cnJNZ2RJRDtcclxuXHJcbiAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLnB1c2goKTsgLy8gYWxsb3cgcmVjdXJzaXZlIHBhcnNpbmdcclxuICAgIFJ1bnRpbWVDb250ZXh0QmFzZS5JbnN0YW5jZS5QYXJzZXIuc2V0WE1MZGF0YShyZXNwb25zZSk7XHJcbiAgICBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyLnNldEN1cnJJbmRleCgwKTtcclxuXHJcbiAgICBsZXQgY3Vyck1HRGF0YTogTUdEYXRhID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldEN1cnJNR0RhdGEoKTtcclxuICAgIGF3YWl0IGN1cnJNR0RhdGEuZmlsbERhdGEob3BlbmluZ1Rhc2tEZXRhaWxzLCBSdW50aW1lQ29udGV4dEJhc2UuSW5zdGFuY2UuUGFyc2VyKTtcclxuXHJcbiAgICAvLyBmcmVlIG1lbW9yeVxyXG4gICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5zZXRYTUxkYXRhKG51bGwpO1xyXG4gICAgUnVudGltZUNvbnRleHRCYXNlLkluc3RhbmNlLlBhcnNlci5wb3AoKTtcclxuXHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhcIjwtLSBQcm9jZXNzUmVzcG9uc2UgZmluaXNoZWQgLS0+IChcIiArIChNaXNjLmdldFN5c3RlbU1pbGxpc2Vjb25kcygpIC0gc3lzdGVtTWlsbGlzZWNvbmRzKSArIFwiKVwiKTtcclxuICAgIC8vIGV4ZWN1dGUgdGhlIGNvbW1hbmRzIHRoYXQgd2VyZSByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2VcclxuICAgIGF3YWl0KDxDb21tYW5kc1RhYmxlPmN1cnJNR0RhdGEuQ21kc1RvQ2xpZW50KS5FeGVjdXRlKHJlcyk7XHJcbiAgICBhd2FpdCB0aGlzLlByb2Nlc3NSZWNvdmVyeSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBwcm9jZXNzUmVjb3ZlcnlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIFByb2Nlc3NSZWNvdmVyeSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICAvLyBRQ1IgIzc3MTAxMiAtIHByb2Nlc3MgZGF0YSBlcnJvciByZWNvdmVyeSBvbmx5IGFmdGVyIHRoZSBwYXJzaW5nIHByb2Nlc3MgaXMgb3Zlci5cclxuICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLnB1c2hOZXdFeGVjU3RhY2tzKCk7XHJcbiAgICBhd2FpdCBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUucHJvY2Vzc1JlY292ZXJ5KCk7XHJcbiAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5wb3BOZXdFeGVjU3RhY2tzKCk7XHJcbiAgfVxyXG59XHJcblxyXG4vLy8gPHN1bW1hcnk+aGVscGVyIGNsYXNzOiBkZXRhaWxzIGZyb20gdGhlIHJ1bnRpbWUtZW5naW5lIC0gZW52aXJvbm1lbnQgdmFsdWVzLlxyXG4vLy8gSGFuZHNoYWtlIHJlc3BvbnNlOiA8UmljaGNsaWVudHJlc3BvbnNlPiA8Q29udGV4dElEPi4uLjwvQ29udGV4dElEPiA8RW52aXJvbm1lbnQgSW5wdXRQYXNzd29yZD1cIll8TlwiXHJcbi8vLyBTeXN0ZW1Mb2dpbj1cIkZ8TnxEfExcIiAvPiA8L1JpY2hjbGllbnRyZXNwb25zZT5cclxuLy8vIDwvc3VtbWFyeT5cclxuY2xhc3MgSGFuZHNoYWtlUmVzcG9uc2Uge1xyXG4gIHN0YXRpYyByZWFkb25seSBTWVNURU1fTE9HSU5fQUQ6IHN0cmluZyA9ICdEJztcclxuXHJcbiAgcHJpdmF0ZSBfc2NyYW1ibGVNZXNzYWdlczogYm9vbGVhbiA9IHRydWU7IC8vIHRydWUgaWYgbWVzc2FnZXMgc2hvdWxkIGJlIHNjcmFtYmxlZC91bnNjcmFtYmxlZCBieSB0aGUgY2xpZW50IGFuZCBzZXJ2ZXJcclxuICBnZXQgU2NyYW1ibGVNZXNzYWdlcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9zY3JhbWJsZU1lc3NhZ2VzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY29udGV4dElkOiBzdHJpbmcgPSBudWxsO1xyXG4gIGdldCBDb250ZXh0SWQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9jb250ZXh0SWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9wcml2YXRlU2Vzc2lvbklkOiBzdHJpbmcgPSBudWxsO1xyXG4gIGdldCBHZXRTZXNzaW9uSWQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9wcml2YXRlU2Vzc2lvbklkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaW5wdXRQYXNzd29yZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGdldCBJbnB1dFBhc3N3b3JkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lucHV0UGFzc3dvcmQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9odHRwVGltZW91dDogbnVtYmVyID0gMDtcclxuICBnZXQgSHR0cFRpbWVvdXQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9odHRwVGltZW91dDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3N5c3RlbUxvZ2luOiBzdHJpbmcgPSBudWxsO1xyXG4gIGdldCBTeXN0ZW1Mb2dpbigpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N5c3RlbUxvZ2luO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfbWF4SW50ZXJuYWxMb2dMZXZlbDogc3RyaW5nID0gbnVsbDtcclxuICBnZXQgTWF4SW50ZXJuYWxMb2dMZXZlbCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX21heEludGVybmFsTG9nTGV2ZWw7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihyZXNwb25zZVhNTDogc3RyaW5nKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBKU09OX1V0aWxzLkpTT05Gcm9tWE1MKHJlc3BvbnNlWE1MLCB0aGlzLkZpbGxGcm9tSlNPTi5iaW5kKHRoaXMpKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChleCkge1xyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZyhleCwgcmVzcG9uc2VYTUwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBGaWxsRnJvbUpTT04gKGVycm9yLCByZXN1bHQpOiB2b2lkIHtcclxuXHJcbiAgICAvLyBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gcGFyc2luZyB0aGUgWE1MLFxyXG4gICAgaWYgKGVycm9yICE9IG51bGwpIHtcclxuICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJlc3BvbnNlID0gcmVzdWx0WydSaWNoY2xpZW50cmVzcG9uc2UnXTtcclxuXHJcbiAgICBmb3IgKGxldCBlbGVtZW50TmFtZSBpbiByZXNwb25zZSkge1xyXG4gICAgICBpZiAocmVzcG9uc2UuaGFzT3duUHJvcGVydHkoZWxlbWVudE5hbWUpKSB7XHJcblxyXG4gICAgICAgIHN3aXRjaCAoZWxlbWVudE5hbWUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY2FzZSBcIkNvbnRleHRJRFwiOlxyXG4gICAgICAgICAgICB0aGlzLl9jb250ZXh0SWQgPSByZXNwb25zZVtlbGVtZW50TmFtZV1bMF07XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBcIlNlc3Npb25JRFwiOlxyXG4gICAgICAgICAgICB0aGlzLl9wcml2YXRlU2Vzc2lvbklkID0gcmVzcG9uc2VbZWxlbWVudE5hbWVdWzBdO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgXCJFbnZpcm9ubWVudFwiOlxyXG4gICAgICAgICAgICBsZXQgZW52QXR0cmlidXRlcyA9IHJlc3BvbnNlW1wiRW52aXJvbm1lbnRcIl1bMF1bJyQnXTtcclxuXHJcbiAgICAgICAgICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQoZW52QXR0cmlidXRlc1tcIlNjcmFtYmxlTWVzc2FnZXNcIl0pKSB7XHJcbiAgICAgICAgICAgICAgRGVidWcuQXNzZXJ0KGVudkF0dHJpYnV0ZXNbXCJTY3JhbWJsZU1lc3NhZ2VzXCJdID09PSBcIk5cIik7XHJcbiAgICAgICAgICAgICAgdGhpcy5fc2NyYW1ibGVNZXNzYWdlcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQoZW52QXR0cmlidXRlc1tcIk1heEludGVybmFsTG9nTGV2ZWxcIl0pKVxyXG4gICAgICAgICAgICAgIHRoaXMuX21heEludGVybmFsTG9nTGV2ZWwgPSBlbnZBdHRyaWJ1dGVzW1wiTWF4SW50ZXJuYWxMb2dMZXZlbFwiXTtcclxuICAgICAgICAgICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChlbnZBdHRyaWJ1dGVzW1wiSW5wdXRQYXNzd29yZFwiXSkgJiYgZW52QXR0cmlidXRlc1tcIklucHV0UGFzc3dvcmRcIl0udG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gXCJ5XCIpXHJcbiAgICAgICAgICAgICAgdGhpcy5faW5wdXRQYXNzd29yZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQoZW52QXR0cmlidXRlc1tcIlN5c3RlbUxvZ2luXCJdKSlcclxuICAgICAgICAgICAgICB0aGlzLl9zeXN0ZW1Mb2dpbiA9IGVudkF0dHJpYnV0ZXNbXCJTeXN0ZW1Mb2dpblwiXTtcclxuICAgICAgICAgICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChlbnZBdHRyaWJ1dGVzW0NvbnN0SW50ZXJmYWNlLk1HX1RBR19IVFRQX0NPTU1VTklDQVRJT05fVElNRU9VVF0pKVxyXG4gICAgICAgICAgICAgIHRoaXMuX2h0dHBUaW1lb3V0ID0gK2VudkF0dHJpYnV0ZXNbQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0hUVFBfQ09NTVVOSUNBVElPTl9USU1FT1VUXTtcclxuICAgICAgICAgICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChlbnZBdHRyaWJ1dGVzW1wiRm9yd2FyZFNsYXNoXCJdKSlcclxuICAgICAgICAgICAgICBBY2Nlc3NIZWxwZXIuZW52aXJvbm1lbnQuRm9yd2FyZFNsYXNoVXNhZ2UgPSBlbnZBdHRyaWJ1dGVzW1wiRm9yd2FyZFNsYXNoXCJdO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8vLyA8c3VtbWFyeT5UaGlzIGNsYXNzIGltcGxlbWVudHMgTWdTQVhIYW5kbGVySW50ZXJmYWNlLCB3aGljaCBtZWFucyB0aGF0IGl0IGRlZmluZXMgYWxsIHRoZSBcImNhbGxiYWNrXCJcclxuLy8vIG1ldGhvZHMgdGhhdCB0aGUgU0FYIHBhcnNlciB3aWxsIGludm9rZSB0byBub3RpZnkgdGhlIGFwcGxpY2F0aW9uLiBJbiB0aGlzIGV4YW1wbGUgd2Ugb3ZlcnJpZGUgdGhlXHJcbi8vLyBtZXRob2RzIHRoYXQgd2UgcmVxdWlyZS48L3N1bW1hcnk+XHJcbmNsYXNzIEVycm9yTWVzc2FnZVhtbCB7XHJcbiAgcHJpdmF0ZSBfbGFzdFJlcXVlc3RUaW1lOiBudW1iZXIgPSAwO1xyXG4gIGNvbnRleHRJbmFjdGl2aXR5VGltZW91dDogbnVtYmVyO1xyXG5cclxuICBwcml2YXRlIF9lcnJvck1lc3NhZ2U6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfZXJyb3JDb2RlOiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgX21pZGRsZXdhcmVBZGRyZXNzOiBzdHJpbmcgPSBudWxsO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX3BhcnNpbmdGYWlsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IoeG1sQ29udGVudDogc3RyaW5nLCBsYXN0UmVxdWVzdFRpbWU6IG51bWJlciwgY29udGV4dEluYWN0aXZpdHlUaW1lb3V0OiBudW1iZXIpIHtcclxuICAgIHRoaXMuX2xhc3RSZXF1ZXN0VGltZSA9IGxhc3RSZXF1ZXN0VGltZTtcclxuICAgIHRoaXMuY29udGV4dEluYWN0aXZpdHlUaW1lb3V0ID0gY29udGV4dEluYWN0aXZpdHlUaW1lb3V0O1xyXG4gICAgdHJ5IHtcclxuICAgICAgSlNPTl9VdGlscy5KU09ORnJvbVhNTCh4bWxDb250ZW50LCB0aGlzLkZpbGxGcm9tSlNPTi5iaW5kKHRoaXMpKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChleCkge1xyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZyhleCk7XHJcbiAgICAgIE1pc2MuV3JpdGVTdGFja1RyYWNlKGV4KTtcclxuICAgICAgdGhpcy5fcGFyc2luZ0ZhaWxlZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIEZpbGxGcm9tSlNPTiAoZXJyb3IsIHJlc3VsdCk6IHZvaWQge1xyXG5cclxuICAgIC8vIElmIHRoZXJlIHdhcyBhbiBlcnJvciBpbiBwYXJzaW5nIHRoZSBYTUwsXHJcbiAgICBpZiAoZXJyb3IgIT0gbnVsbCkge1xyXG4gICAgICB0aHJvdyBlcnJvcjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgeG1sZXJyID0gcmVzdWx0Wyd4bWxlcnInXTtcclxuXHJcbiAgICBmb3IgKGxldCBlbGVtZW50TmFtZSBpbiB4bWxlcnIpIHtcclxuICAgICAgaWYgKHhtbGVyci5oYXNPd25Qcm9wZXJ0eShlbGVtZW50TmFtZSkpIHtcclxuICAgICAgICBzd2l0Y2ggKGVsZW1lbnROYW1lKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGNhc2UgXCJlcnJtc2dcIjpcclxuICAgICAgICAgICAgdGhpcy5fZXJyb3JNZXNzYWdlID0geG1sZXJyW2VsZW1lbnROYW1lXVswXTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFwiZXJyY29kZVwiOlxyXG4gICAgICAgICAgICB0aGlzLl9lcnJvckNvZGUgPSArKHhtbGVycltlbGVtZW50TmFtZV0pO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgXCJzZXJ2ZXJcIjpcclxuICAgICAgICAgICAgdGhpcy5fbWlkZGxld2FyZUFkZHJlc3MgPSB4bWxlcnJbZWxlbWVudE5hbWVdWzBdO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgXCJhcHBuYW1lXCI6IC8vIGlnbm9yZWQgLSB0aGUgY2xpZW50IGxpc3RzIHRoaXMgdmFsdWUgZnJvbSB0aGUgZXhlY3V0aW9uIHByb3BlcnRpZXNcclxuICAgICAgICAgIGNhc2UgXCJwcmduYW1lXCI6IC8vIGlnbm9yZWQgLSB0aGUgY2xpZW50IGxpc3RzIHRoaXMgdmFsdWUgZnJvbSB0aGUgZXhlY3V0aW9uIHByb3BlcnRpZXNcclxuICAgICAgICAgIGNhc2UgXCJhcmd1bWVudHNcIjogLy8gaWdub3JlZFxyXG4gICAgICAgICAgY2FzZSBcInVzZXJuYW1lXCI6ICAvLyBpZ25vcmVkXHJcbiAgICAgICAgICBjYXNlIFwieG1sZXJyXCI6IC8vIGVuZCBvZiB0aGUgZXJyb3IgbWVzc2FnZVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhOU3RyaW5nLkZvcm1hdChcIlVua25vd24gZWxlbWVudDogJ3swfSdcIiwgZWxlbWVudE5hbWUpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBHZXRDb2RlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fZXJyb3JDb2RlO1xyXG4gIH1cclxuXHJcbiAgLy8gYnVpbGQgJiByZXR1cm4gYSBmb3JtYXR0ZWQgZXJyb3IgbWVzc2FnZVxyXG4gIEdldE1lc3NhZ2UoKTogc3RyaW5nIHtcclxuICAgIGxldCBzYjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuX3BhcnNpbmdGYWlsZWQpIHtcclxuICAgICAgc2IuQXBwZW5kKEFjY2Vzc0hlbHBlci5sYW5ndWFnZURhdGEuZ2V0Q29uc3RNZXNzYWdlKE1zZ0ludGVyZmFjZS5SQ19TVFJfRjdfVU5FWFBFQ1RFRF9FUlIpKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBzd2l0Y2ggKHRoaXMuX2Vycm9yQ29kZSkge1xyXG4gICAgICAgIGNhc2UgU2VydmVyRXJyb3IuRVJSX0NUWF9OT1RfRk9VTkQ6XHJcbiAgICAgICAgICBpZiAodGhpcy5JbmFjdGl2aXR5VGltZW91dEV4cGlyZWQoKSlcclxuICAgICAgICAgICAgc2IuQXBwZW5kKE5TdHJpbmcuRm9ybWF0KFwiezB9ICh7MX0gezJ9KVwiLFxyXG4gICAgICAgICAgICAgIEFjY2Vzc0hlbHBlci5sYW5ndWFnZURhdGEuZ2V0Q29uc3RNZXNzYWdlKE1zZ0ludGVyZmFjZS5TVFJfRVJSX1NFU1NJT05fQ0xPU0VEX0lOQUNUSVZJVFkpLFxyXG4gICAgICAgICAgICAgIE1hdGguZmxvb3IodGhpcy5jb250ZXh0SW5hY3Rpdml0eVRpbWVvdXQgLyA2MDApLCAvLyBjb252ZXJzaW9uIGZyb20gMS8xMCBvZiBzZWNvbmRzIHRvIG1pbnV0ZXNcclxuICAgICAgICAgICAgICBBY2Nlc3NIZWxwZXIubGFuZ3VhZ2VEYXRhLmdldENvbnN0TWVzc2FnZShNc2dJbnRlcmZhY2UuU1RSX01JTlVURVMpKSk7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHNiLkFwcGVuZChOU3RyaW5nLkZvcm1hdChcInswfSAoezF9KS5cIiwgQWNjZXNzSGVscGVyLmxhbmd1YWdlRGF0YS5nZXRDb25zdE1lc3NhZ2UoTXNnSW50ZXJmYWNlLlNUUl9FUlJfU0VTU0lPTl9DTE9TRUQpLCB0aGlzLl9lcnJvckNvZGUpKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFNlcnZlckVycm9yLkVSUl9XRUJDTElFTlRfUFJPR1JBTV9SRUxPQURFRDpcclxuICAgICAgICAgIHNiLkFwcGVuZChBY2Nlc3NIZWxwZXIubGFuZ3VhZ2VEYXRhLmdldENvbnN0TWVzc2FnZShNc2dJbnRlcmZhY2UuU1RSX0VSUl9XRUJDTElFTlRfUFJPR1JBTV9SRUxPQURFRCkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgU2VydmVyRXJyb3IuRVJSX0VYRUNVVEVEX1BST0dSQU1fQ0hBTkdFRDpcclxuICAgICAgICAgIHNiLkFwcGVuZChBY2Nlc3NIZWxwZXIubGFuZ3VhZ2VEYXRhLmdldENvbnN0TWVzc2FnZShNc2dJbnRlcmZhY2UuU1RSX0VSUl9FWEVDVVRFRF9QUk9HUkFNX0NIQU5HRUQpKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFNlcnZlckVycm9yLkVSUl9BVVRIRU5USUNBVElPTjpcclxuICAgICAgICAgIHNiLkFwcGVuZChBY2Nlc3NIZWxwZXIubGFuZ3VhZ2VEYXRhLmdldENvbnN0TWVzc2FnZShNc2dJbnRlcmZhY2UuVVNSSU5QX1NUUl9CQURQQVNTVykpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgU2VydmVyRXJyb3IuRVJSX0FDQ0VTU19ERU5JRUQ6XHJcbiAgICAgICAgICBzYi5BcHBlbmQoQWNjZXNzSGVscGVyLmxhbmd1YWdlRGF0YS5nZXRDb25zdE1lc3NhZ2UoTXNnSW50ZXJmYWNlLlNUUl9FUlJfQVVUSE9SSVpBVElPTl9GQUlMVVJFKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIHNiLkFwcGVuZCh0aGlzLl9lcnJvck1lc3NhZ2UpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHNiLkFwcGVuZChPU0Vudmlyb25tZW50LkVvbFNlcSArIE9TRW52aXJvbm1lbnQuRW9sU2VxKTtcclxuXHJcbiAgICAgIGlmICghU2VydmVyQ29uZmlnLkluc3RhbmNlLlNob3VsZERpc3BsYXlHZW5lcmljRXJyb3IoKSkge1xyXG4gICAgICAgIHNiLkFwcGVuZChBY2Nlc3NIZWxwZXIubGFuZ3VhZ2VEYXRhLmdldENvbnN0TWVzc2FnZShNc2dJbnRlcmZhY2UuQlJPV1NFUl9PUFRfSU5GT19TRVJWRVJfU1RSKSArIFwiOiAgIFwiKTtcclxuICAgICAgICBzYi5BcHBlbmQoU2VydmVyQ29uZmlnLkluc3RhbmNlLmdldFNlcnZlcigpKTtcclxuICAgICAgICBpZiAoIU5TdHJpbmcuSXNOdWxsT3JFbXB0eSh0aGlzLl9taWRkbGV3YXJlQWRkcmVzcykpIHtcclxuICAgICAgICAgIHNiLkFwcGVuZChcIiAtLT4gXCIpO1xyXG4gICAgICAgICAgc2IuQXBwZW5kKHRoaXMuX21pZGRsZXdhcmVBZGRyZXNzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2IuQXBwZW5kKE9TRW52aXJvbm1lbnQuRW9sU2VxKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgc2IuQXBwZW5kKEFjY2Vzc0hlbHBlci5sYW5ndWFnZURhdGEuZ2V0Q29uc3RNZXNzYWdlKE1zZ0ludGVyZmFjZS5UQVNLUlVMRV9TVFJfQVBQTElDQVRJT04pICsgXCI6ICAgXFxcIlwiKTtcclxuICAgICAgc2IuQXBwZW5kKFNlcnZlckNvbmZpZy5JbnN0YW5jZS5nZXRBcHBOYW1lKCkpO1xyXG4gICAgICBzYi5BcHBlbmQoXCJcXFwiIChcXFwiXCIpO1xyXG4gICAgICBzYi5BcHBlbmQoXCJcXFwiKVwiKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc2IuVG9TdHJpbmcoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgSW5hY3Rpdml0eVRpbWVvdXRFeHBpcmVkKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGV4cGlyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLmNvbnRleHRJbmFjdGl2aXR5VGltZW91dCA+IDApIHtcclxuICAgICAgbGV0IGN1cnJUaW1lTWlsbGk6IG51bWJlciA9IE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCk7XHJcbiAgICAgIGV4cGlyZWQgPSAoKGN1cnJUaW1lTWlsbGkgLSB0aGlzLl9sYXN0UmVxdWVzdFRpbWUpID4gKHRoaXMuY29udGV4dEluYWN0aXZpdHlUaW1lb3V0ICogMTAwKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZXhwaXJlZDtcclxuICB9XHJcbn1cclxuXHJcbi8vIFRPRE86IEltcGxlbWVudCB0aGlzIGNsYXNzXHJcbi8vIGNsYXNzIENsaWVudExvZ0FjY3VtdWxhdG9yIHtcclxuLy9cclxuLy8gICBwcml2YXRlIHN0YXRpYyBDTElFTlRfTE9HX0hEUl9NU0c6IHN0cmluZyA9IFwiQ2xpZW50IGxvZyBmaWxlXCI7XHJcbi8vICAgcHJpdmF0ZSBzdGF0aWMgX2V4aXN0aW5nTG9nTmFtZXM6IExpc3Q8c3RyaW5nPiA9IG5ldyBMaXN0PHN0cmluZz4oKTtcclxuLy8gICBwcml2YXRlIF9jbGllbnRMb2dPczogU3RyZWFtV3JpdGVyID0gbnVsbDtcclxuLy8gICBwcml2YXRlIF9jb250ZXh0SWQ6IG51bWJlciA9IDA7XHJcbi8vICAgcHJpdmF0ZSBfZmFpbGVkOiBib29sZWFuID0gZmFsc2U7XHJcbi8vICAgcHJpdmF0ZSBfZmlsZU5hbWU6IHN0cmluZyA9IG51bGw7XHJcbi8vXHJcbi8vICAgY29uc3RydWN0b3IoY29udGV4dElEOiBudW1iZXIpIHtcclxuLy8gICAgIHRoaXMuX2NvbnRleHRJZCA9IGNvbnRleHRJRDtcclxuLy8gICAgIHRoaXMuX2ZpbGVOYW1lID0gdGhpcy5CdWlsZEZpbGVOYW1lKCk7XHJcbi8vICAgICB0aGlzLk9wZW5Gb3JXcml0ZSgpO1xyXG4vLyAgIH1cclxuLy9cclxuLy8gICBXcml0ZShidWZmZXI6IHN0cmluZyk6IHZvaWQge1xyXG4vLyAgICAgdHJ5IHtcclxuLy8gICAgICAgbGV0IGZsYWc6IGJvb2xlYW4gPSAhdGhpcy5fZmFpbGVkO1xyXG4vLyAgICAgICBpZiAoIWZsYWcpIHtcclxuLy8gICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oXCJDbGllbnRMb2dTZXF1ZW5jZSA6IExvZ2luZyBjbGllbnQgc2VxdWVuY2UgaXMgZGVhY3RpdmF0ZWRcIik7XHJcbi8vICAgICAgIH1cclxuLy8gICAgICAgbGV0IGZsYWcyOiBib29sZWFuID0gdGhpcy5PcGVuRm9yV3JpdGUoKTtcclxuLy8gICAgICAgaWYgKGZsYWcyKSB7XHJcbi8vICAgICAgICAgdGhpcy5fY2xpZW50TG9nT3MuV3JpdGUoYnVmZmVyKTtcclxuLy8gICAgICAgICB0aGlzLl9jbGllbnRMb2dPcy5DbG9zZSgpO1xyXG4vLyAgICAgICAgIHRoaXMuX2NsaWVudExvZ09zID0gbnVsbDtcclxuLy8gICAgICAgICB0aGlzLk9wZW5Gb3JXcml0ZSgpO1xyXG4vLyAgICAgICB9XHJcbi8vICAgICB9XHJcbi8vICAgICBjYXRjaCAoZXgpIHtcclxuLy8gICAgICAgaWYgKGV4IGluc3RhbmNlb2YgSU9FeGNlcHRpb24pIHtcclxuLy8gICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZyhleC5NZXNzYWdlKTtcclxuLy8gICAgICAgICBNaXNjLldyaXRlU3RhY2tUcmFjZShleCwgTkNvbnNvbGUuRXJyb3IpO1xyXG4vLyAgICAgICB9XHJcbi8vICAgICAgIGVsc2VcclxuLy8gICAgICAgICB0aHJvdyBleDtcclxuLy8gICAgIH1cclxuLy8gICB9XHJcbi8vXHJcbi8vICAgUmVhZCgpOiBzdHJpbmcge1xyXG4vLyAgICAgbGV0IHJlc3VsdDogc3RyaW5nID0gbnVsbDtcclxuLy8gICAgIHRyeSB7XHJcbi8vICAgICAgIGxldCBmbGFnOiBib29sZWFuID0gIXRoaXMuX2ZhaWxlZDtcclxuLy8gICAgICAgaWYgKCFmbGFnKSB7XHJcbi8vICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKFwiQ2xpZW50TG9nU2VxdWVuY2UgOiBMb2dpbmcgY2xpZW50IHNlcXVlbmNlIGlzIGRlYWN0aXZhdGVkXCIpO1xyXG4vLyAgICAgICB9XHJcbi8vICAgICAgIHRoaXMuX2NsaWVudExvZ09zLkNsb3NlKCk7XHJcbi8vICAgICAgIHRoaXMuX2NsaWVudExvZ09zID0gbnVsbDtcclxuLy8gICAgICAgcmVzdWx0ID0gSGFuZGxlRmlsZXMucmVhZFRvU3RyaW5nKHRoaXMuX2ZpbGVOYW1lLCBFbmNvZGluZy5EZWZhdWx0KTtcclxuLy8gICAgICAgdGhpcy5PcGVuRm9yV3JpdGUoKTtcclxuLy8gICAgIH1cclxuLy8gICAgIGNhdGNoIChleCkge1xyXG4vLyAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikge1xyXG4vLyAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKGV4Lk1lc3NhZ2UpO1xyXG4vLyAgICAgICAgIE1pc2MuV3JpdGVTdGFja1RyYWNlKGV4LCBOQ29uc29sZS5FcnJvcik7XHJcbi8vICAgICAgIH1cclxuLy8gICAgICAgZWxzZVxyXG4vLyAgICAgICAgIHRocm93IGV4O1xyXG4vLyAgICAgfVxyXG4vLyAgICAgcmV0dXJuIHJlc3VsdDtcclxuLy8gICB9XHJcbi8vXHJcbi8vICAgUmVzZXQoKTogdm9pZCB7XHJcbi8vICAgICB0cnkge1xyXG4vLyAgICAgICBsZXQgZmxhZzogYm9vbGVhbiA9ICF0aGlzLl9mYWlsZWQ7XHJcbi8vICAgICAgIGlmICghZmxhZykge1xyXG4vLyAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihcIkNsaWVudExvZ1NlcXVlbmNlIDogTG9naW5nIGNsaWVudCBzZXF1ZW5jZSBpcyBkZWFjdGl2YXRlZFwiKTtcclxuLy8gICAgICAgfVxyXG4vLyAgICAgICB0aGlzLl9jbGllbnRMb2dPcy5DbG9zZSgpO1xyXG4vLyAgICAgICB0aGlzLl9jbGllbnRMb2dPcyA9IG51bGw7XHJcbi8vICAgICAgIEhhbmRsZUZpbGVzLmRlbGV0ZUZpbGUodGhpcy5fZmlsZU5hbWUpO1xyXG4vLyAgICAgfVxyXG4vLyAgICAgY2F0Y2ggKGV4KSB7XHJcbi8vICAgICAgIGlmIChleCBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKSB7XHJcbi8vICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2coZXgpO1xyXG4vLyAgICAgICB9XHJcbi8vICAgICAgIGVsc2VcclxuLy8gICAgICAgICB0aHJvdyBleDtcclxuLy8gICAgIH1cclxuLy8gICB9XHJcbi8vXHJcbi8vICAgc3RhdGljIEV4aXN0aW5nTG9nc0ZvdW5kKCk6IGJvb2xlYW4ge1xyXG4vLyAgICAgbGV0IHJlc3VsdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4vLyAgICAgQ2xpZW50TG9nQWNjdW11bGF0b3IuQnVpbGRleGlzdGluZ0xvZ0xpc3QoKTtcclxuLy8gICAgIGxldCBmbGFnOiBib29sZWFuID0gQ2xpZW50TG9nQWNjdW11bGF0b3IuX2V4aXN0aW5nTG9nTmFtZXMgIT09IG51bGwgJiYgQ2xpZW50TG9nQWNjdW11bGF0b3IuX2V4aXN0aW5nTG9nTmFtZXMuQ291bnQgPiAwO1xyXG4vLyAgICAgaWYgKGZsYWcpIHtcclxuLy8gICAgICAgcmVzdWx0ID0gdHJ1ZTtcclxuLy8gICAgIH1cclxuLy8gICAgIHJldHVybiByZXN1bHQ7XHJcbi8vICAgfVxyXG4vL1xyXG4vLyAgIHN0YXRpYyBFeGlzdGluZ0xvZ0l0ZXJhdG9yKCk6IElFbnVtZXJhdG9yPHN0cmluZz4ge1xyXG4vLyAgICAgcmV0dXJuIENsaWVudExvZ0FjY3VtdWxhdG9yLl9leGlzdGluZ0xvZ05hbWVzLkdldEVudW1lcmF0b3IoKTtcclxuLy8gICB9XHJcbi8vXHJcbi8vICAgc3RhdGljIEJ1aWxkTG9nSGVhZGVyTGluZShsb2dOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4vLyAgICAgbGV0IHN0cmluZ0J1aWxkZXI6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcihcIkNsaWVudCBsb2cgZmlsZVwiKTtcclxuLy8gICAgIGxldCBzdHI6IHN0cmluZyA9IE5TdHJpbmcuU3Vic3RyaW5nKGxvZ05hbWUsIGxvZ05hbWUuTGFzdEluZGV4T2YoTk51bWJlci5Ub1N0cmluZyhQYXRoLkRpcmVjdG9yeVNlcGFyYXRvckNoYXIpICsgXCJDU1wiKSArIDMsIGxvZ05hbWUuTGFzdEluZGV4T2YoXCIubG9nXCIpIC0gKGxvZ05hbWUuTGFzdEluZGV4T2YoTk51bWJlci5Ub1N0cmluZyhQYXRoLkRpcmVjdG9yeVNlcGFyYXRvckNoYXIpICsgXCJDU1wiKSArIDMpKTtcclxuLy8gICAgIHN0cmluZ0J1aWxkZXIuQXBwZW5kKFwiIChDb250ZXh0IDogXCIpO1xyXG4vLyAgICAgc3RyaW5nQnVpbGRlci5BcHBlbmQoc3RyICsgXCIgKSBcIik7XHJcbi8vICAgICByZXR1cm4gc3RyaW5nQnVpbGRlci5Ub1N0cmluZygpO1xyXG4vLyAgIH1cclxuLy9cclxuLy8gICBFbXB0eSgpOiBib29sZWFuIHtcclxuLy8gICAgIHJldHVybiB0aGlzLl9mYWlsZWQgfHwgIUhhbmRsZUZpbGVzLmlzRXhpc3RzKHRoaXMuX2ZpbGVOYW1lKSB8fCBIYW5kbGVGaWxlcy5nZXRGaWxlU2l6ZSh0aGlzLl9maWxlTmFtZSkgPT09IDA7XHJcbi8vICAgfVxyXG4vL1xyXG4vLyAgIElzRmFpbGVkKCk6IGJvb2xlYW4ge1xyXG4vLyAgICAgcmV0dXJuIHRoaXMuX2ZhaWxlZDtcclxuLy8gICB9XHJcbi8vXHJcbi8vICAgcHJpdmF0ZSBzdGF0aWMgQnVpbGRleGlzdGluZ0xvZ0xpc3QoKTogdm9pZCB7XHJcbi8vICAgICBsZXQgZmxhZzogYm9vbGVhbiA9IENsaWVudExvZ0FjY3VtdWxhdG9yLl9leGlzdGluZ0xvZ05hbWVzICE9PSBudWxsICYmIENsaWVudExvZ0FjY3VtdWxhdG9yLl9leGlzdGluZ0xvZ05hbWVzLkNvdW50ID09PSAwO1xyXG4vLyAgICAgaWYgKGZsYWcpIHtcclxuLy8gICAgICAgbGV0IHBhdGg6IHN0cmluZyA9IFwiXCI7XHJcbi8vICAgICAgIENsaWVudExvZ0FjY3VtdWxhdG9yLl9leGlzdGluZ0xvZ05hbWVzLkFkZFJhbmdlKE5BcnJheS5Ub0VudW1lcmFibGUoRGlyZWN0b3J5LkdldEZpbGVzKHBhdGgsIFwiQ1MqLkxPR1wiKSkpO1xyXG4vLyAgICAgfVxyXG4vLyAgIH1cclxuLy9cclxuLy8gICBwcml2YXRlIE9wZW5Gb3JXcml0ZSgpOiBib29sZWFuIHtcclxuLy8gICAgIGxldCBmbGFnOiBib29sZWFuID0gdGhpcy5fY2xpZW50TG9nT3MgPT09IG51bGw7XHJcbi8vICAgICBpZiAoZmxhZykge1xyXG4vLyAgICAgICB0cnkge1xyXG4vLyAgICAgICAgIHRoaXMuX2NsaWVudExvZ09zID0gbmV3IFN0cmVhbVdyaXRlcih0aGlzLl9maWxlTmFtZSwgdHJ1ZSwgRW5jb2RpbmcuRGVmYXVsdCk7XHJcbi8vICAgICAgICAgdGhpcy5fZmFpbGVkID0gZmFsc2U7XHJcbi8vICAgICAgIH1cclxuLy8gICAgICAgY2F0Y2ggKGV4KSB7XHJcbi8vICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgSU9FeGNlcHRpb24pIHtcclxuLy8gICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKFwiQ2xpZW50TG9nU2VxdWVuY2VzIDogXCIgKyBleC5NZXNzYWdlKTtcclxuLy8gICAgICAgICAgIHRoaXMuX2ZhaWxlZCA9IHRydWU7XHJcbi8vICAgICAgICAgICB0aGlzLl9jbGllbnRMb2dPcyA9IG51bGw7XHJcbi8vICAgICAgICAgICB0aGlzLl9jb250ZXh0SWQgPSAtMTtcclxuLy8gICAgICAgICAgIHRoaXMuX2ZpbGVOYW1lID0gbnVsbDtcclxuLy8gICAgICAgICB9XHJcbi8vICAgICAgICAgZWxzZVxyXG4vLyAgICAgICAgICAgdGhyb3cgZXg7XHJcbi8vICAgICAgIH1cclxuLy8gICAgIH1cclxuLy8gICAgIHJldHVybiAhdGhpcy5fZmFpbGVkO1xyXG4vLyAgIH1cclxuLy9cclxuLy8gICBwcml2YXRlIEJ1aWxkRmlsZU5hbWUoKTogc3RyaW5nIHtcclxuLy8gICAgIHJldHVybiBcIlwiO1xyXG4vLyAgIH1cclxuLy8gfVxyXG4iXX0=
|