@magic-xpa/engine 4.1000.0-dev4100.109 → 4.1000.0-dev4100.116
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/esm2020/src/ClientManager.mjs +11 -11
- package/esm2020/src/ConstInterface.mjs +3 -1
- package/esm2020/src/CurrentClientVersion.mjs +2 -2
- package/esm2020/src/commands/ClientToServer/DataviewCommand.mjs +6 -6
- package/esm2020/src/commands/ClientToServer/EvaluateCommand.mjs +4 -4
- package/esm2020/src/commands/ClientToServer/EventCommand.mjs +8 -8
- package/esm2020/src/commands/ClientToServer/ExecOperCommand.mjs +4 -4
- package/esm2020/src/commands/ClientToServer/IniputForceWriteCommand.mjs +5 -5
- package/esm2020/src/commands/ClientToServer/RecomputeCommand.mjs +7 -7
- package/esm2020/src/commands/ClientToServer/TransactionCommand.mjs +6 -6
- package/esm2020/src/commands/ServerToClient/EnhancedVerifyCommand.mjs +8 -8
- package/esm2020/src/commands/ServerToClient/ResultCommand.mjs +7 -7
- package/esm2020/src/data/DataView.mjs +34 -34
- package/esm2020/src/data/DataviewManager.mjs +7 -7
- package/esm2020/src/data/Record.mjs +10 -10
- package/esm2020/src/data/TaskTransactionManager.mjs +4 -4
- package/esm2020/src/data/XMLBasedDcValuesBuilder.mjs +5 -5
- package/esm2020/src/env/Environment.mjs +14 -7
- package/esm2020/src/env/MirrorString.mjs +2 -3
- package/esm2020/src/event/EventHandler.mjs +6 -3
- package/esm2020/src/event/EventHandlerPosition.mjs +5 -1
- package/esm2020/src/event/RunTimeEvent.mjs +16 -16
- package/esm2020/src/gui/FormsTable.mjs +8 -8
- package/esm2020/src/gui/MgControl.mjs +10 -10
- package/esm2020/src/gui/MgForm.mjs +3 -6
- package/esm2020/src/http/HttpManager.mjs +8 -8
- package/esm2020/src/remote/RemoteCommandsProcessor.mjs +35 -26
- package/esm2020/src/rt/DataviewHeaderBase.mjs +16 -16
- package/esm2020/src/security/UserDetails.mjs +12 -12
- package/esm2020/src/tasks/MGData.mjs +4 -4
- package/esm2020/src/tasks/RCTimer.mjs +10 -10
- package/esm2020/src/tasks/Task.mjs +42 -42
- package/esm2020/src/util/FlowMonitorQueue.mjs +107 -2
- package/esm2020/src/util/PrmMap.mjs +6 -6
- package/esm2020/src/util/ReturnResult.mjs +7 -7
- package/fesm2015/magic-xpa-engine.mjs +404 -281
- package/fesm2015/magic-xpa-engine.mjs.map +1 -1
- package/fesm2020/magic-xpa-engine.mjs +404 -281
- package/fesm2020/magic-xpa-engine.mjs.map +1 -1
- package/package.json +6 -6
- package/src/ConstInterface.d.ts +2 -0
- package/src/env/Environment.d.ts +2 -0
- package/src/util/FlowMonitorQueue.d.ts +8 -0
- package/src/util/PrmMap.d.ts +1 -1
- package/magic-xpa-engine.d.ts +0 -2
|
@@ -11,6 +11,7 @@ import { FlowMonitorInterface } from "../FlowMonitorInterface";
|
|
|
11
11
|
import { LastFocusedManager } from "../rt/LastFocusedManager";
|
|
12
12
|
import { AccessHelper } from "../AccessHelper";
|
|
13
13
|
import { RemoteCommandsProcessor } from "../remote/RemoteCommandsProcessor";
|
|
14
|
+
import { Environment } from "../env/Environment";
|
|
14
15
|
export class EventHandler {
|
|
15
16
|
constructor() {
|
|
16
17
|
this._enabledExp = new YesNoExp(true);
|
|
@@ -405,8 +406,10 @@ export class EventHandler {
|
|
|
405
406
|
continue;
|
|
406
407
|
else if (this._operationTab.getOperation(oper.getBlockEnd()).getServerId() < nextOperIdx)
|
|
407
408
|
continue;
|
|
408
|
-
if (!taskEnd)
|
|
409
|
-
await this._task.evalEndCond(ConstInterface.END_COND_EVAL_IMMIDIATE)
|
|
409
|
+
if (!taskEnd) {
|
|
410
|
+
if (await this._task.evalEndCond(ConstInterface.END_COND_EVAL_IMMIDIATE) && Environment.Instance.getSpecialImmediateHandlerEnd())
|
|
411
|
+
break;
|
|
412
|
+
}
|
|
410
413
|
if (this._taskMgdID !== mgdID)
|
|
411
414
|
isChangedCurrWndRef.value = true;
|
|
412
415
|
if (!this._task.isMainProg() && this._task.isOpenWin())
|
|
@@ -758,4 +761,4 @@ export class RetVals {
|
|
|
758
761
|
this.BlockIfReturnedFromServer = inBlockIfReturnedFromServer;
|
|
759
762
|
}
|
|
760
763
|
}
|
|
761
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXZlbnRIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZW5naW5lL3NyYy9ldmVudC9FdmVudEhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLG9CQUFvQixFQUFFLFNBQVMsRUFBUSxPQUFPLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2hJLE9BQU8sRUFDTCxRQUFRLEVBQ1IsU0FBUyxFQUNULGlCQUFpQixFQUNqQixNQUFNLEVBQ04sZ0JBQWdCLEVBRWhCLHFCQUFxQixFQUNyQixZQUFZLEVBQ1osU0FBUyxFQUNWLE1BQU0sa0JBQWtCLENBQUM7QUFFMUIsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDNUMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBS3BELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBRTFELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUdsRCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFHekMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUUxRSxNQUFNLE9BQU8sWUFBWTtJQXNCdkI7UUFyQlEsZ0JBQVcsR0FBYSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQyxrQkFBYSxHQUFtQixJQUFJLENBQUM7UUFDckMsa0JBQWEsR0FBYSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QyxxQkFBZ0IsR0FBWSxLQUFLLENBQUM7UUFDbEMsVUFBSyxHQUFjLElBQUksQ0FBQztRQUN4QixjQUFTLEdBQVcsSUFBSSxDQUFDO1FBQ3pCLFdBQU0sR0FBVyxDQUFDLENBQUM7UUFDbkIsV0FBTSxHQUFXLENBQUMsQ0FBQztRQUNuQixTQUFJLEdBQVUsSUFBSSxDQUFDO1FBQ25CLHFCQUFnQixHQUFZLEtBQUssQ0FBQztRQUNsQyxnQkFBVyxHQUFjLElBQUksQ0FBQztRQUM5QixtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUNoQyxRQUFHLEdBQVcsQ0FBQyxDQUFDO1FBQ2hCLFdBQU0sR0FBVyxJQUFJLENBQUM7UUFDdEIsV0FBTSxHQUFhLElBQUksQ0FBQztRQUN4QixVQUFLLEdBQVMsSUFBSSxDQUFDO1FBQ25CLGVBQVUsR0FBVyxDQUFDLENBQUMsQ0FBQztRQU05QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUVELFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUtELFFBQVEsQ0FBQyxPQUFhLEVBQUUsTUFBaUI7UUFDdkMsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksRUFBRTtZQUN2QixJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQztZQUNyQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDekM7UUFFRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUU7U0FDMUQ7UUFDRCxJQUFJLFFBQVEsR0FBdUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDdkQsSUFBSSxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFLTyxnQkFBZ0IsQ0FBQyxNQUFpQixFQUFFLFlBQW9CO1FBRTlELElBQUksWUFBWSxLQUFLLElBQUk7WUFDdkIsT0FBTyxLQUFLLENBQUM7UUFFZixJQUFJLFlBQVksS0FBSyxjQUFjLENBQUMsY0FBYztZQUNoRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUV4QyxJQUFJLFlBQVksS0FBSyxjQUFjLENBQUMsV0FBVztZQUNsRCxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQzthQUVuRCxJQUFJLFlBQVksS0FBSyxjQUFjLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFO1lBQzNFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxjQUFjLENBQUMsZ0JBQWdCO2dCQUN6RCxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssY0FBYyxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEtBQUssY0FBYyxDQUFDLGdCQUFnQixDQUFDO2dCQUM1SCxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUsvQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLGNBQWMsQ0FBQyxtQkFBbUIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxLQUFLLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxjQUFjLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxjQUFjLENBQUMsbUJBQW1CLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxlQUFlLEVBQUUsS0FBSyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxFQUFFO2dCQUVqYSxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssSUFBSTtvQkFDM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO3FCQUVsQyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSTtvQkFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDOztvQkFHakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2FBQ3JDO1NBQ0Y7YUFDSSxJQUFJLFlBQVksS0FBSyxHQUFHLEdBQUcsY0FBYyxDQUFDLGNBQWMsRUFBRTtZQUM3RCxNQUFNLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUMvQixPQUFPLEtBQUssQ0FBQztTQUVkO2FBQ0k7WUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLDBCQUEwQixDQUFDLDBEQUEwRCxHQUFHLFlBQVksQ0FBQyxDQUFDO1lBQ3RILE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFNTyxpQkFBaUIsQ0FBQyxNQUFpQixFQUFFLE9BQWE7UUFDeEQsSUFBSSxVQUFVLEdBQVcsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sQ0FBRSxZQUFZLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQ3JHLElBQUksVUFBVSxLQUFLLENBQUMsQ0FBQyxJQUFJLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsTUFBTSxFQUFFO1lBRWhFLElBQUksR0FBRyxHQUFXLE1BQU0sQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDckQsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFFLGNBQWMsQ0FBQyxjQUFjLENBQUMsR0FBRyxjQUFjLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRXpHLElBQUksWUFBWSxHQUFpQixTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLEVBQUUsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3RILElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNsQyxPQUFPO1NBQ1I7UUFDRCxNQUFNLENBQUMsUUFBUSxDQUFDLDBCQUEwQixDQUFDLDRDQUE0QyxDQUFDLENBQUM7SUFDM0YsQ0FBQztJQU9PLFlBQVksQ0FBQyxZQUEwQixFQUFFLE9BQWE7UUFDNUQsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN2RCxJQUFJLFNBQVMsR0FBVyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuRCxJQUFJLFFBQVEsR0FBVyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFdEQsUUFBUSxTQUFTLEVBQUU7Z0JBQ2pCLEtBQUssY0FBYyxDQUFDLGlCQUFpQjtvQkFDbkMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO29CQUN2RSxNQUFNO2dCQUVSLEtBQUssWUFBWSxDQUFDLFVBQVU7b0JBQzFCLElBQUksQ0FBQyxHQUFHLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDdEMsTUFBTTtnQkFFUixLQUFLLGNBQWMsQ0FBQyxhQUFhO29CQUMvQixJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDMUIsTUFBTTtnQkFFUixLQUFLLGNBQWMsQ0FBQyxjQUFjO29CQUNoQyxJQUFJLG1CQUFtQixHQUFXLFNBQVMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQy9ELElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUN2RSxJQUFJLENBQUMsNEJBQTRCLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQzNDLE1BQU07Z0JBRVIsS0FBSyxjQUFjLENBQUMsZ0JBQWdCO29CQUNsQyxJQUFJLENBQUMsV0FBVyxHQUFjLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7b0JBQ3ZGLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztvQkFDckMsTUFBTTtnQkFFUixLQUFLLGNBQWMsQ0FBQyxhQUFhO29CQUMvQixJQUFJLENBQUMsTUFBTSxHQUFhLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDcEMsTUFBTTtnQkFFUixLQUFLLGNBQWMsQ0FBQyxpQkFBaUI7b0JBQ25DLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztvQkFDN0MsTUFBTTtnQkFFUixLQUFLLGNBQWMsQ0FBQyxlQUFlO29CQUNqQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7b0JBQzNDLE1BQU07Z0JBRVIsS0FBSyxjQUFjLENBQUMsYUFBYTtvQkFDL0IsSUFBSSxDQUFDLEdBQVcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDdEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7d0JBQ1YsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ3RELElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUN2RCxLQUFLLElBQUksTUFBTSxHQUFXLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRTs0QkFDbkYsSUFBSSxLQUFLLEdBQTBCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUUsQ0FBQzs0QkFDekUsS0FBSyxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQzt5QkFDbEM7cUJBQ0Y7b0JBQ0QsTUFBTTtnQkFFUixLQUFLLGNBQWMsQ0FBQyxzQkFBc0I7b0JBQ3hDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUN2RCxNQUFNO2dCQUVSO29CQUNFLE1BQU0sQ0FBQyxRQUFRLENBQUMsMEJBQTBCLENBQUMsMkZBQTJGLEdBQUcsU0FBUyxDQUFDLENBQUM7b0JBQ3BKLE1BQU07YUFDVDtTQUNGO0lBQ0gsQ0FBQztJQVFELDRCQUE0QixDQUFDLE9BQWE7UUFDeEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQzFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQVUsT0FBTyxDQUFDLE9BQU8sRUFBRyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDcEg7SUFDSCxDQUFDO0lBT0QsbUJBQW1CLENBQUMsS0FBbUI7UUFFckMsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0I7WUFDdkcsT0FBTyxLQUFLLENBQUM7UUFHZixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssUUFBUSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxPQUFPLEVBQUU7WUFDakUsT0FBTyxLQUFLLENBQUM7UUFLZixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBRTNCLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJLEVBQUU7Z0JBQzdCLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxLQUFLLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO2FBQzlDO1lBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDcEQsSUFBSSxhQUFhLEdBQVcsS0FBSyxDQUFDLE9BQU8sQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO2dCQUMzRSxJQUFJLGFBQWEsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxhQUFhLENBQUMsV0FBVyxFQUFFO29CQUN4RixPQUFPLElBQUksQ0FBQzthQUNmO2lCQUNJLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLGdCQUFnQjtnQkFDdEQsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQVNELHNCQUFzQixDQUFDLEtBQW1CO1FBR3hDLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLGdCQUFnQjtZQUN0RyxPQUFPLEtBQUssQ0FBQztRQUVmLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsSUFBSSxJQUFLLElBQUksQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxjQUFjLENBQUMsZ0JBQWdCO1lBQzdILE9BQU8sS0FBSyxDQUFDO1FBRVgsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsT0FBTyxFQUFFO1lBQ25FLE9BQU8sS0FBSyxDQUFDO1FBR2YsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLGNBQWMsQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLGNBQWMsQ0FBQyxvQkFBb0IsRUFBRTtZQUNsSSxJQUFJO2dCQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7YUFDM0I7WUFDRCxPQUFPLG9CQUFvQixFQUFFO2dCQUMzQixJQUFJLG9CQUFvQixZQUFZLG9CQUFvQixFQUFFO2lCQUN6RDs7b0JBRUMsTUFBTSxvQkFBb0IsQ0FBQzthQUM5QjtTQUNGO1FBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBU0QsaUJBQWlCLENBQUMsS0FBbUI7UUFFbkMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxNQUFNO1lBQ2pDLE9BQU8sS0FBSyxDQUFDO1FBR2YsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsZ0JBQWdCO1lBQ25HLE9BQU8sS0FBSyxDQUFDO1FBR2YsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBU0QseUJBQXlCLENBQUMsS0FBbUI7UUFFM0MsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxNQUFNO1lBQ2pDLE9BQU8sS0FBSyxDQUFDO1FBRWYsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUk7WUFDMUUsT0FBTyxLQUFLLENBQUM7UUFHZixPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQ3ZELE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFpQkYsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFtQixFQUFFLGtCQUEyQixFQUFFLHdCQUFpQztRQUU5RixJQUFJLElBQUksR0FBYyxJQUFJLENBQUM7UUFDM0IsSUFBSSxNQUFlLENBQUM7UUFDcEIsSUFBSSxLQUFLLEdBQVcsQ0FBQyxDQUFDO1FBQ3RCLElBQUksT0FBTyxHQUFZLEtBQUssQ0FBQztRQUM3QixJQUFJLFFBQVEsR0FBVyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2hELElBQUksYUFBYSxHQUFXLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUMxRCxJQUFJLG9CQUFvQixHQUFXLENBQUMsQ0FBQztRQUdyQyxJQUFJLE9BQU8sS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxjQUFjLENBQUMscUJBQXFCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLGNBQWMsQ0FBQyxlQUFlLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLGNBQWMsQ0FBQyxxQkFBcUIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUU7WUFFM1MsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLGNBQWMsQ0FBQyxvQkFBb0I7Z0JBQzdELElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FFekQ7O1lBRUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFNUQsSUFBSSxJQUFJLEdBQWtCLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUU3QyxJQUFJO1lBQ0YsSUFBSSxXQUFXLEdBQXFCLGdCQUFnQixDQUFDLFFBQVEsQ0FBQztZQUc5RCxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxjQUFjLENBQUMsbUJBQW1CLElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRSxLQUFLLGlCQUFpQixDQUFDLHNCQUFzQixFQUFFO2dCQUNsSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFlBQVksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxFQUFFO29CQUNqRyxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztpQkFDaEM7YUFDRjtZQUlELElBQUksV0FBVyxHQUFXLENBQUMsQ0FBQyxDQUFDO1lBQzdCLElBQUksa0JBQWtCLEVBQUU7Z0JBTXRCLFdBQVcsR0FBRyxZQUFZLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQzthQUNwRztZQUNELElBQUksV0FBVyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQzVFLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBR2xDLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLGNBQWMsQ0FBQyxnQkFBZ0IsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssY0FBYyxDQUFDLHFCQUFxQixDQUFDLEVBQUU7Z0JBQ3RKLElBQUksUUFBUSxHQUFTLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dCQUN0RSxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUTtvQkFDekIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDbEM7WUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFO2dCQUcxQixPQUFPLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQzthQUNqQztZQUVELElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLGNBQWMsQ0FBQyxlQUFlLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFO2dCQUMxRixPQUFPLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztZQUVsQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxjQUFjLENBQUMsbUJBQW1CLElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRSxLQUFLLGlCQUFpQixDQUFDLGtCQUFrQjtnQkFDNUgsT0FBTyxHQUFHLElBQUksQ0FBQztZQUVqQixJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxjQUFjLENBQUMsbUJBQW1CLEVBQUU7Z0JBQzFELFFBQVEsS0FBSyxDQUFDLGVBQWUsRUFBRSxFQUFFO29CQUMvQixLQUFLLGlCQUFpQixDQUFDLGlCQUFpQjt3QkFDdEMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsRUFBRSxvQkFBb0IsQ0FBQyxZQUFZLEVBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO3dCQUNqSSxNQUFNO29CQUNSLEtBQUssaUJBQWlCLENBQUMsaUJBQWlCO3dCQUN0QyxXQUFXLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixFQUFFLG9CQUFvQixDQUFDLFlBQVksRUFBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7d0JBQ2pJLE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxrQkFBa0I7d0JBQ3ZDLFdBQVcsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQ3hELG9CQUFvQixDQUFDLFlBQVksRUFBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7d0JBQzdGLE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxrQkFBa0I7d0JBQ3ZDLFdBQVcsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQ3hELG9CQUFvQixDQUFDLFlBQVksRUFBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7d0JBQzdGLE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxlQUFlO3dCQUNwQyxXQUFXLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQzNELG9CQUFvQixDQUFDLFlBQVksRUFBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7d0JBQzVGLE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyx3QkFBd0I7d0JBQzdDLFdBQVcsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsd0JBQXdCLEVBQ3BFLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLG9CQUFvQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7d0JBQ3RGLE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxrQkFBa0I7d0JBQ3ZDLFdBQVcsQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLEVBQUUsb0JBQW9CLENBQUMsWUFBWSxFQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQzt3QkFDbEksTUFBTTtvQkFFUixLQUFLLGlCQUFpQixDQUFDLGtCQUFrQjt3QkFDdkMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsRUFBRSxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO3dCQUNqSSxNQUFNO29CQUVSO3dCQUNFLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO3dCQUM1SCxNQUFNO2lCQUNUO2FBQ0Y7O2dCQUVDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1lBRTlILElBQUk7Z0JBRUYsSUFBSSxPQUFPLEtBQUssSUFBSTtvQkFDbEIsSUFBSSxHQUFjLEtBQUssQ0FBQyxPQUFPLENBQUM7Z0JBRWxDLElBQUksS0FBSyxHQUFXLFlBQVksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDO2dCQUN2RCxJQUFJLGdCQUFnQixHQUFZLEtBQUssQ0FBQztnQkFDdEMsSUFBSSxtQkFBbUIsR0FBc0IsSUFBSSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFNNUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLGNBQWMsQ0FBQyxnQkFBZ0IsSUFBSSxLQUFLLEtBQUssS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFO29CQUV6RixZQUFZLENBQUMsV0FBVyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ3RELG1CQUFtQixDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7aUJBQ2xDO2dCQUdELE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUVyQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3JELElBQUksT0FBTyxHQUFZLElBQUksQ0FBQztnQkFDNUIsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUM7b0JBQ2xDLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUU1SSxnQkFBZ0IsR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUM7Z0JBRTdDLElBQUksT0FBTyxLQUFLLElBQUk7b0JBQ2xCLE9BQU8sT0FBTyxDQUFDO2dCQUdqQixJQUFJLENBQUMsT0FBTztvQkFDVixNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO2dCQUd2RSxJQUFJLGdCQUFnQixFQUFFO29CQUNwQixJQUFJLE1BQU0sR0FBVyxZQUFZLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDL0QsSUFBSSxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVU7d0JBQ3ZDLFlBQVksQ0FBQyxXQUFXLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztpQkFDOUM7YUFDRjtZQUVELE9BQU8sRUFBRSxFQUFFO2dCQUNULElBQUksRUFBRSxZQUFZLFdBQVcsRUFBRTtvQkFDN0IsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsS0FBSyxnQkFBZ0IsQ0FBQyxLQUFLO3dCQUNyRCxNQUFNLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUMxQyxNQUFNLEVBQUUsQ0FBQztpQkFDVjtxQkFDSSxJQUFJLEVBQUUsWUFBWSxTQUFTLEVBQUU7b0JBQ2hDLE1BQU0sQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ3hDLE9BQU8sSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUNqQzs7b0JBRUMsTUFBTSxFQUFFLENBQUM7YUFDWjtvQkFFTztnQkFFTixNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUkzQyxJQUFJLGlCQUFpQixHQUFXLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDOUQsT0FBTyxpQkFBaUIsR0FBRyxvQkFBb0IsRUFBRSxpQkFBaUIsR0FBRyxpQkFBaUIsRUFBRTtvQkFDdEYsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQzthQUMvQjtZQUdELElBQUksSUFBSSxLQUFLLElBQUk7Z0JBQ2YsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFdEMsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssY0FBYyxDQUFDLG1CQUFtQixFQUFFO2dCQUMxRCxRQUFRLEtBQUssQ0FBQyxlQUFlLEVBQUUsRUFBRTtvQkFDL0IsS0FBSyxpQkFBaUIsQ0FBQyxpQkFBaUI7d0JBQ3RDLFdBQVcsQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLEVBQUUsb0JBQW9CLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQzt3QkFDOUgsTUFBTTtvQkFFUixLQUFLLGlCQUFpQixDQUFDLGlCQUFpQjt3QkFDdEMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsRUFBRSxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO3dCQUM5SCxNQUFNO29CQUVSLEtBQUssaUJBQWlCLENBQUMsa0JBQWtCO3dCQUN2QyxXQUFXLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixFQUFFLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7d0JBQy9ILE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxrQkFBa0I7d0JBQ3ZDLFdBQVcsQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLEVBQUUsb0JBQW9CLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQzt3QkFDL0gsTUFBTTtvQkFFUixLQUFLLGlCQUFpQixDQUFDLGtCQUFrQjt3QkFDdkMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7d0JBQzNJLE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxrQkFBa0I7d0JBQ3ZDLFdBQVcsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO3dCQUMzSSxNQUFNO29CQUVSLEtBQUssaUJBQWlCLENBQUMsZUFBZTt3QkFDcEMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7d0JBQ3RKLE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyx3QkFBd0I7d0JBQzdDLFdBQVcsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsd0JBQXdCLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO3dCQUNqSixNQUFNO29CQUVSO3dCQUNFLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO3dCQUMxSCxNQUFNO2lCQUNUO2FBQ0Y7O2dCQUVDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1NBQy9GO2dCQUNPO1lBRU4sSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1NBQ2pEO1FBQ0QsT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUtPLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxPQUFlLEVBQUUsS0FBYSxFQUFFLE9BQWdCLEVBQUUsS0FBYSxFQUFFLEtBQWEsRUFDcEYsbUJBQXNDLEVBQUUsU0FBa0IsRUFBRSxvQkFBNkIsRUFDekYsYUFBcUI7UUFDN0MsSUFBSSxJQUFlLENBQUM7UUFDcEIsSUFBSSxRQUFnQixDQUFDO1FBQ3JCLElBQUksV0FBVyxHQUFXLENBQUMsQ0FBQyxDQUFDO1FBQzdCLElBQUksa0JBQWtCLEdBQVksS0FBSyxDQUFDO1FBQ3hDLElBQUksR0FBRyxHQUFXLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDekMsSUFBSSxXQUFXLEdBQVcsT0FBTyxDQUFDO1FBQ2xDLElBQUksT0FBZ0IsQ0FBQztRQUNyQixJQUFJLHlCQUF5QixHQUFZLEtBQUssQ0FBQztRQUMvQyxJQUFJLFlBQXFCLENBQUM7UUFDMUIsSUFBSSxxQkFBOEIsQ0FBQztRQUNuQyxJQUFJLFdBQVcsR0FBcUIsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO1FBQzlELElBQUksc0JBQXNCLEdBQVksS0FBSyxDQUFDO1FBRTVDLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUV6QixJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDcEQsV0FBVyxHQUFHLFlBQVksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNwRSxJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUMsRUFBRTtnQkFDcEIsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO2dCQUMxQixJQUFJLFNBQVM7b0JBQ1gseUJBQXlCLEdBQUcsSUFBSSxDQUFDO2FBQ3BDOztnQkFDSSxrQkFBa0IsR0FBRyxLQUFLLENBQUM7U0FDakM7YUFDSTtZQUNILGtCQUFrQixHQUFHLG9CQUFvQixDQUFDO1lBQzFDLFdBQVcsR0FBRyxhQUFhLENBQUM7U0FDN0I7UUFFRCxPQUFPLFdBQVcsSUFBSSxLQUFLO1lBQ3BCLENBQUMsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDcEQsQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLENBQUMsc0JBQXNCLEVBQzFDLFdBQVcsSUFBSSxDQUFDLEVBQUU7WUFDdkIsSUFBSSxTQUFTLElBQUkseUJBQXlCLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsV0FBVztnQkFDOUcsTUFBTTtZQUVSLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUVwRCxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBRTFCLHlCQUF5QixHQUFHLEtBQUssQ0FBQztZQUlsQyxJQUFJLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxDQUFDLHFCQUFxQixFQUFFO2dCQUMvRCxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDNUIsTUFBTTthQUNQO1lBR0QsSUFBSSxrQkFBa0IsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUcsV0FBVztnQkFDeEQsSUFBSSxRQUFRLEtBQUssY0FBYyxDQUFDLGFBQWE7b0JBQzNDLFNBQVM7cUJBQ04sSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxXQUFXO29CQUN0RixTQUFTO1lBRWIsSUFBSSxDQUFDLE9BQU87Z0JBQ1YsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsdUJBQXVCLENBQUMsQ0FBQztZQUV2RSxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssS0FBSztnQkFDM0IsbUJBQW1CLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztZQUVuQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRTtnQkFDcEQsWUFBWSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUV2RCxNQUFNLFlBQVksQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFM0QsUUFBUSxRQUFRLEVBQUU7Z0JBQ2hCLEtBQUssY0FBYyxDQUFDLGNBQWM7b0JBRWhDLElBQUksTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLEVBQUU7d0JBQzFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUU7NEJBQ3hDLFlBQVksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7eUJBRW5EO3dCQUVELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEtBQUssU0FBUyxDQUFDLGVBQWU7NEJBQ3ZGLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO3dCQU1uRCxPQUFPLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztxQkFDakM7b0JBQ0QsTUFBTTtnQkFFUixLQUFLLGNBQWMsQ0FBQyxZQUFZO29CQUc5QixJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixFQUFFLENBQUM7b0JBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUVqQyxNQUFNLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztvQkFFakYscUJBQXFCLEdBQUcsS0FBSyxDQUFDO29CQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFO3dCQUUzQixPQUFPLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTs0QkFFaEMsT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQ3pHLG1CQUFtQixFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDekMsSUFBSSxPQUFPLEtBQUssSUFBSTtnQ0FDbEIsT0FBTyxPQUFPLENBQUM7NEJBR2pCLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLFlBQVksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztnQ0FDdkUsTUFBTTs0QkFFUixJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixFQUFFLENBQUM7NEJBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO3lCQUNsQztxQkFDRjt5QkFDSTt3QkFDSCxJQUFJLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7NEJBQzNCLHFCQUFxQixHQUFHLElBQUksQ0FBQztxQkFDaEM7b0JBQ0QsSUFBSSxDQUFDLHFCQUFxQjt3QkFLeEIsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7b0JBQ3ZDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQ3ZCLE1BQU07Z0JBRVIsS0FBSyxjQUFjLENBQUMsYUFBYTtvQkFHL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxXQUFXLENBQUMsRUFBRTt3QkFDdkYsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ2pDLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksV0FBVzs0QkFFMUQsV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQzs7NEJBRTlFLFdBQVcsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO3FCQUN6RTt5QkFDSTt3QkFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7d0JBQ3RDLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDNUIsV0FBVyxHQUFHLFlBQVksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQzt3QkFDcEUsSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDLEVBQUU7NEJBQ3BCLGtCQUFrQixHQUFHLElBQUksQ0FBQzs0QkFDMUIsSUFBSSxTQUFTO2dDQUNYLHlCQUF5QixHQUFHLElBQUksQ0FBQzs0QkFFbkMsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUU7Z0NBRW5GLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsV0FBVyxFQUFFO29DQUN4RixXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO29DQUNuQyxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7aUNBQ3JEOzZCQUNGO3lCQUNGOzZCQUNJOzRCQUNILGtCQUFrQixHQUFHLEtBQUssQ0FBQzs0QkFDM0IsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDO3lCQUNsQjtxQkFDRjtvQkFDRCxJQUFJLFdBQVcsS0FBSyxDQUFDLENBQUMsRUFBRTt3QkFDdEIsWUFBWSxHQUFHLElBQUksQ0FBQzt3QkFDcEIsSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO3dCQUVwRCxJQUFJLGtCQUFrQixFQUFFOzRCQUN0QixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxJQUFJLFdBQVcsRUFBRTtnQ0FDdEYsWUFBWSxHQUFHLEtBQUssQ0FBQztnQ0FDckIseUJBQXlCLEdBQUcsSUFBSSxDQUFDOzZCQUNsQzt5QkFDRjt3QkFFRCxJQUFJLFlBQVksRUFBRTs0QkFFaEIsT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQ3pHLG1CQUFtQixFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxXQUFXLENBQUMsQ0FBQzs0QkFDOUQsSUFBSSxPQUFPLEtBQUssSUFBSTtnQ0FDbEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0I7b0NBQzdCLE9BQU8sT0FBTyxDQUFDO3FDQUNaO29DQUNILGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztvQ0FDaEQsV0FBVyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUM7b0NBQ2xDLHlCQUF5QixHQUFHLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQztvQ0FDOUQsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7b0NBQ3JDLFNBQVM7aUNBQ1Y7eUJBQ0o7cUJBQ0Y7b0JBT0QsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7b0JBQ3JDLE1BQU07Z0JBRVIsS0FBSyxjQUFjLENBQUMsZ0JBQWdCO29CQUNsQyxNQUFNLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztvQkFDakYsTUFBTTtnQkFFUixLQUFLLGNBQWMsQ0FBQyxZQUFZO29CQUM5QixJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBRXRDLHNCQUFzQixHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO29CQUNoRSxNQUFNO2dCQUVSO29CQUVFLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDdEMsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUM7b0JBQ3ZDLE1BQU07YUFDVDtZQUlELElBQUksQ0FBQyx5QkFBeUIsRUFBRTtnQkFDOUIsV0FBVyxHQUFHLFlBQVksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDcEUsSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDLEVBQUU7b0JBQ3BCLGtCQUFrQixHQUFHLElBQUksQ0FBQztvQkFDMUIsSUFBSSxTQUFTO3dCQUNYLHlCQUF5QixHQUFHLElBQUksQ0FBQztpQkFDcEM7O29CQUNJLGtCQUFrQixHQUFHLEtBQUssQ0FBQzthQUNqQztTQUVGO1FBRUQsSUFBSSxzQkFBc0I7WUFDeEIsT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQzthQUNoQyxJQUFJLHlCQUF5QjtZQUNoQyxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUMsV0FBVyxFQUFFLGtCQUFrQixFQUFFLHlCQUF5QixDQUFDLENBQUM7O1lBRWxGLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDakIsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQVVPLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxhQUFxQixFQUFFLE1BQWM7UUFDckUsSUFBSSxNQUFNLEdBQVcsQ0FBQyxDQUFDLENBQUM7UUFFeEIsT0FBTyxhQUFhLEdBQUcsTUFBTSxFQUFFO1lBQzdCLElBQUksSUFBSSxHQUFjLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3JFLElBQUksUUFBUSxHQUFXLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUV0QyxJQUFJLFFBQVEsS0FBSyxjQUFjLENBQUMsYUFBYSxJQUFJLFFBQVEsS0FBSyxjQUFjLENBQUMsWUFBWSxJQUFJLFFBQVEsS0FBSyxjQUFjLENBQUMsY0FBYztnQkFDckksTUFBTTtZQUVSLElBQUksTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUM3QixNQUFNLEdBQUcsYUFBYSxDQUFDO2dCQUN2QixNQUFNO2FBQ1A7O2dCQUVDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDeEM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBU08scUJBQXFCLENBQUMsTUFBYztRQUMxQyxJQUFJLE1BQU0sR0FBVyxDQUFDLENBQUMsQ0FBQztRQUN4QixJQUFJLEtBQUssR0FBWSxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFTLENBQUM7UUFDZCxLQUFLLENBQUMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDMUMsSUFBSSxJQUFJLEdBQWMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekQsSUFBSSxRQUFRLEdBQVcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBRXRDLElBQUksUUFBUSxLQUFLLGNBQWMsQ0FBQyxhQUFhLElBQUksUUFBUSxLQUFLLGNBQWMsQ0FBQyxZQUFZLEVBQUU7Z0JBQ3pGLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLE1BQU0sRUFBRTtvQkFDakMsTUFBTSxHQUFHLENBQUMsQ0FBQztvQkFDWCxLQUFLLEdBQUcsSUFBSSxDQUFDO2lCQUNkO2FBQ0Y7U0FDRjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFVTyxzQkFBc0IsQ0FBQyxPQUFlO1FBQzVDLElBQUksTUFBTSxHQUFXLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLElBQUksS0FBSyxHQUFZLEtBQUssQ0FBQztRQUMzQixJQUFJLFlBQVksR0FBVyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNsRixJQUFJLENBQVMsQ0FBQztRQUNkLEtBQUssQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMzQyxJQUFJLElBQUksR0FBYyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6RCxJQUFJLFFBQVEsR0FBVyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFFdEMsSUFBSSxRQUFRLEtBQUssY0FBYyxDQUFDLGFBQWEsRUFBRTtnQkFDN0MsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssWUFBWSxFQUFFO29CQUN2QyxNQUFNLEdBQUcsQ0FBQyxDQUFDO29CQUNYLEtBQUssR0FBRyxJQUFJLENBQUM7aUJBQ2Q7YUFDRjtTQUNGO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQVdPLHdCQUF3QixDQUFDLFlBQW9CLEVBQUUsV0FBbUI7UUFDeEUsSUFBSSxNQUFNLEdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDeEIsSUFBSSxLQUFLLEdBQVksS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxHQUFXLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVuRixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNaLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLHlCQUF5QixDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDakY7UUFFRCxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDdkIsSUFBSSxJQUFJLEdBQWMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekQsSUFBSSxRQUFRLEdBQVcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3RDLElBQUksUUFBUSxLQUFLLGNBQWMsQ0FBQyxhQUFhLEVBQUU7Z0JBQzdDLElBQUksQ0FBQyxLQUFLLFlBQVksRUFBRTtvQkFDdEIsTUFBTSxHQUFHLENBQUMsQ0FBQztvQkFDWCxLQUFLLEdBQUcsSUFBSSxDQUFDO2lCQUNkOztvQkFFQyxDQUFDLEVBQUUsQ0FBQzthQUNQO2lCQUNJLElBQUksUUFBUSxLQUFLLGNBQWMsQ0FBQyxZQUFZLEVBQUU7Z0JBQ2pELElBQUksU0FBUyxHQUFXLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdkQsSUFBSSxTQUFTLEtBQUssWUFBWSxFQUFFO29CQUM5QixNQUFNLEdBQUcsQ0FBQyxDQUFDO29CQUNYLEtBQUssR0FBRyxJQUFJLENBQUM7aUJBQ2Q7O29CQUVDLENBQUMsR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDO2FBQ3JCO2lCQUNJLElBQUksUUFBUSxLQUFLLGNBQWMsQ0FBQyxnQkFBZ0I7Z0JBQ25ELENBQUMsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztnQkFFdEMsQ0FBQyxFQUFFLENBQUM7U0FDUDtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFNRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFLRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFLRCxLQUFLO1FBQ0gsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ2xCLENBQUM7SUFLRCxLQUFLLENBQUMsU0FBUztRQUNiLE9BQU8sTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFPTyxLQUFLLENBQUMsbUJBQW1CLENBQUMsSUFBbUI7UUFDbkQsSUFBSSxFQUFFLEdBQXVCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQ2pELElBQUksTUFBTSxHQUFXLENBQUMsQ0FBQztRQUV2QixJQUFJO1lBQ0YsS0FBSyxJQUFJLFFBQVEsR0FBVyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLEVBQUU7Z0JBQ3pGLElBQUksTUFBTSxHQUF5QixFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN6RCxJQUFJLFNBQVMsR0FBWSxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUdsRSxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksU0FBUyxFQUFFO29CQUMzRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTt3QkFDbEMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztxQkFDbkQ7eUJBQ0k7d0JBQ0gsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO3dCQUMvQyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQzdCO29CQUNELE1BQU0sRUFBRSxDQUFDO2lCQUNWO3FCQUNJO29CQUNILE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztvQkFDL0MsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUM3QjtnQkFDRCxNQUFNLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQzthQUM5QjtTQUNGO1FBQ0QsT0FBTyxTQUFTLEVBQUU7WUFDaEIsTUFBTSxTQUFTLENBQUM7U0FDakI7SUFDSCxDQUFDO0lBTU8sS0FBSyxDQUFDLGtCQUFrQixDQUFDLElBQW1CO1FBQ2xELElBQUksRUFBRSxHQUF1QixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUNqRCxJQUFJLENBQUMsR0FBVyxDQUFDLENBQUM7UUFDbEIsSUFBSSxDQUFTLENBQUM7UUFFZCxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM5RSxJQUFJLE1BQU0sR0FBeUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQzVDLElBQUksR0FBRyxHQUFhLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25DLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRSxLQUFLLGNBQWMsQ0FBQyxjQUFjLEVBQUU7b0JBRW5ELElBQUksTUFBTSxHQUF5QixHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBUWxELElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxLQUFLLElBQUksSUFBSSxDQUFRLE1BQU0sQ0FBQyxPQUFPLEVBQUcsQ0FBQyxVQUFVLEVBQUUsRUFBRTt3QkFDdkUsSUFBSSxHQUFHLEdBQVcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDekMsTUFBTSxNQUFNLENBQUMseUJBQXlCLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO3dCQUMvRixNQUFNLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztxQkFDOUI7aUJBQ0Y7Z0JBQ0QsQ0FBQyxFQUFFLENBQUM7YUFDTDtTQUNGO0lBQ0gsQ0FBQztJQUtELE9BQU87UUFDTCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUtELFNBQVMsQ0FBQyxVQUFvQjtRQUM1QixJQUFJLFdBQVcsR0FBWSxJQUFJLENBQUM7UUFDaEMsSUFBSSxFQUFFLEdBQXVCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQ2pELElBQUksQ0FBQyxHQUFXLENBQUMsQ0FBQztRQUNsQixJQUFJLFVBQVUsR0FBVyxDQUFDLENBQUM7UUFFM0IsS0FBSyxJQUFJLENBQUMsR0FBVyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDcEUsSUFBSSxLQUFLLEdBQXlCLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakQsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQ25CLFVBQVUsRUFBRSxDQUFDO2dCQUNiLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUU7b0JBQ3pCLElBQUksU0FBUyxHQUFxQixLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ2xELElBQUksT0FBTyxHQUFxQixVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO29CQU9uRCxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyw0QkFBNEIsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLEVBQUU7d0JBQ2hLLFdBQVcsR0FBRyxLQUFLLENBQUM7d0JBQ3BCLE1BQU07cUJBQ1A7b0JBQ0QsQ0FBQyxFQUFFLENBQUM7aUJBQ0w7YUFDRjtTQUNGO1FBRUQsSUFBSSxVQUFVLEtBQUssVUFBVSxDQUFDLE1BQU0sRUFBRTtZQUNwQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1NBQ3JCO1FBQ0QsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUtELGVBQWU7UUFDYixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQUtELDhCQUE4QjtRQUM1QixJQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxjQUFjLENBQUMsbUJBQW1CLEVBQUU7WUFHbEUsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO2dCQUNyRSxPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUM3QjtRQUNELE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQztJQUN2QixDQUFDO0lBS0QsMkJBQTJCO1FBRTFCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQzNFLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUV0RCxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUtELG1CQUFtQjtRQUNqQixJQUFJLGdCQUFnQixHQUFrQixJQUFJLGFBQWEsRUFBRSxDQUFDO1FBRTFELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBR3BELElBQUksb0JBQW9CLEdBQVcsSUFBSSxDQUFDLDhCQUE4QixFQUFFLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFFOUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFLOUMsSUFBRyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDcEQsZ0JBQWdCLEdBQUcsSUFBSSxhQUFhLENBQUMsR0FBRyxHQUFHLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxFQUFFLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUVsSCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLFlBQVksRUFBRSxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDNUYsQ0FBQztJQUdELFFBQVE7UUFDTixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsMENBQTBDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4RyxDQUFDO0NBQ0Y7QUFLRCxNQUFNLE9BQU8sT0FBTztJQVNsQixZQUFZLFVBQWUsRUFBRSx1QkFBZ0MsRUFBRSwyQkFBcUM7UUFScEcsOEJBQXlCLEdBQVksS0FBSyxDQUFDO1FBQzNDLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFDekIsZ0JBQVcsR0FBVyxDQUFDLENBQUM7UUFDeEIsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQix1QkFBa0IsR0FBWSxLQUFLLENBQUM7UUFLbEMsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUM7WUFDeEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsdUJBQXVCLENBQUMsQ0FBQzs7WUFFeEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsdUJBQXVCLEVBQUUsMkJBQTJCLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBS08sYUFBYSxDQUFDLENBQVUsRUFBRSxDQUFVO1FBQzFDLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDaEMsSUFBSSxDQUFDLHlCQUF5QixHQUFHLEtBQUssQ0FBQztJQUN6QyxDQUFDO0lBUU8sYUFBYSxDQUFDLE9BQWUsRUFBRSxvQkFBNkIsRUFBRSwyQkFBb0M7UUFDeEcsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7UUFDM0IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLG9CQUFvQixDQUFDO1FBQy9DLElBQUksQ0FBQyx5QkFBeUIsR0FBRywyQkFBMkIsQ0FBQztJQUMvRCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FwcGxpY2F0aW9uRXhjZXB0aW9uLCBFeGNlcHRpb24sIExpc3QsIE5TdHJpbmcsIFJlZlBhcmFtLCBTdHJpbmdCdWlsZGVyLCBpc051bGxPclVuZGVmaW5lZH0gZnJvbSBcIkBtYWdpYy14cGEvbXNjb3JlbGliXCI7XHJcbmltcG9ydCB7XHJcbiAgQnJrU2NvcGUsXHJcbiAgQ29uc3RhbnRzLFxyXG4gIEludGVybmFsSW50ZXJmYWNlLFxyXG4gIExvZ2dlcixcclxuICBMb2dnZXJfTG9nTGV2ZWxzLFxyXG4gIFN0b3JhZ2VBdHRyaWJ1dGUsXHJcbiAgU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLFxyXG4gIFhNTENvbnN0YW50cyxcclxuICBYbWxQYXJzZXJcclxufSBmcm9tIFwiQG1hZ2ljLXhwYS91dGlsc1wiO1xyXG5pbXBvcnQge0V4cFZhbH0gZnJvbSBcIkBtYWdpYy14cGEvZ3VpXCI7XHJcbmltcG9ydCB7RXZlbnR9IGZyb20gXCIuL0V2ZW50XCI7XHJcbmltcG9ydCB7RmllbGRCYXNlfSBmcm9tIFwiLi4vZGF0YS9GaWVsZEJhc2VcIjtcclxuaW1wb3J0IHtPcGVyYXRpb25UYWJsZX0gZnJvbSBcIi4uL3J0L09wZXJhdGlvblRhYmxlXCI7XHJcbmltcG9ydCB7QXJndW1lbnR9IGZyb20gXCIuLi9ydC9Bcmd1bWVudFwiO1xyXG5pbXBvcnQge0FyZ3VtZW50c0xpc3R9IGZyb20gXCIuLi9ydC9Bcmd1bWVudHNMaXN0XCI7XHJcbmltcG9ydCB7TWdDb250cm9sfSBmcm9tIFwiLi4vZ3VpL01nQ29udHJvbFwiO1xyXG5pbXBvcnQge09wZXJhdGlvbn0gZnJvbSBcIi4uL3J0L09wZXJhdGlvblwiO1xyXG5pbXBvcnQge0Zsb3dNb25pdG9yUXVldWV9IGZyb20gXCIuLi91dGlsL0Zsb3dNb25pdG9yUXVldWVcIjtcclxuaW1wb3J0IHtNR0RhdGF9IGZyb20gXCIuLi90YXNrcy9NR0RhdGFcIjtcclxuaW1wb3J0IHtTZXJ2ZXJFcnJvcn0gZnJvbSBcIi4uL3JlbW90ZS9TZXJ2ZXJFcnJvclwiO1xyXG5pbXBvcnQge1J1blRpbWVFdmVudH0gZnJvbSBcIi4vUnVuVGltZUV2ZW50XCI7XHJcbmltcG9ydCB7TWdGb3JtfSBmcm9tIFwiLi4vZ3VpL01nRm9ybVwiO1xyXG5pbXBvcnQge1llc05vRXhwfSBmcm9tIFwiLi4vZXhwL1llc05vRXhwXCI7XHJcbmltcG9ydCB7VGFza30gZnJvbSBcIi4uL3Rhc2tzL1Rhc2tcIjtcclxuaW1wb3J0IHtEYXRhVmlld30gZnJvbSBcIi4uL2RhdGEvRGF0YVZpZXdcIjtcclxuaW1wb3J0IHtDb25zdEludGVyZmFjZX0gZnJvbSBcIi4uL0NvbnN0SW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7Rmxvd01vbml0b3JJbnRlcmZhY2V9IGZyb20gXCIuLi9GbG93TW9uaXRvckludGVyZmFjZVwiO1xyXG5pbXBvcnQgeyBMYXN0Rm9jdXNlZE1hbmFnZXIgfSBmcm9tIFwiLi4vcnQvTGFzdEZvY3VzZWRNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IEFjY2Vzc0hlbHBlciB9IGZyb20gXCIuLi9BY2Nlc3NIZWxwZXJcIjtcclxuaW1wb3J0IHtSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvcn0gZnJvbSBcIi4uL3JlbW90ZS9SZW1vdGVDb21tYW5kc1Byb2Nlc3NvclwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEV2ZW50SGFuZGxlciB7XHJcbiAgcHJpdmF0ZSBfZW5hYmxlZEV4cDogWWVzTm9FeHAgPSBuZXcgWWVzTm9FeHAodHJ1ZSk7IC8vIGRlZmF1bHQgaXMgdHJ1ZSBhbHdheXNcclxuICBwcml2YXRlIF9vcGVyYXRpb25UYWI6IE9wZXJhdGlvblRhYmxlID0gbnVsbDtcclxuICBwcml2YXRlIF9wcm9wYWdhdGVFeHA6IFllc05vRXhwID0gbmV3IFllc05vRXhwKHRydWUpO1xyXG4gIHByaXZhdGUgX2lzSGFuZGxlck9uRm9ybTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2N0cmw6IE1nQ29udHJvbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfY3RybE5hbWU6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfZHZMZW46IG51bWJlciA9IDA7IC8vIFRoZSDigJxkdnBvc8KBRWNvbnRhaW5zIHRoZSBudW1iZXIgb2YgZmllbGRzIHNlbGVjdGVkIGluIHRoZSBoYW5kbGVyXHJcbiAgcHJpdmF0ZSBfZHZQb3M6IG51bWJlciA9IDA7IC8vIGFuZCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGZpZWxkIG9mIGl0IGluIHRoZSBEYXRhdmlldy5cclxuICBwcml2YXRlIF9ldnQ6IEV2ZW50ID0gbnVsbDtcclxuICBwcml2YXRlIF9oYW5kbGVkQnlDbGllbnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9oYW5kbGVyRmxkOiBGaWVsZEJhc2UgPSBudWxsO1xyXG4gIHByaXZhdGUgX2hhc1BhcmFtZXRlcnM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9pZDogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIF9sZXZlbDogc3RyaW5nID0gJ1xcMCc7IC8vIENvbnRyb2wgfCBIYW5kbGVyIHwgUmVjb3JkIHwgVGFzayB8IFZhcmlhYmxlXHJcbiAgcHJpdmF0ZSBfc2NvcGU6IEJya1Njb3BlID0gbnVsbDsgLy8gVGFza3xTdWJ0YXNrfEdsb2JhbFxyXG4gIHByaXZhdGUgX3Rhc2s6IFRhc2sgPSBudWxsO1xyXG4gIHByaXZhdGUgX3Rhc2tNZ2RJRDogbnVtYmVyID0gLTE7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDVE9SXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMuX29wZXJhdGlvblRhYiA9IG5ldyBPcGVyYXRpb25UYWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q3RybE5hbWUoKSA6IHN0cmluZ3tcclxuICAgIHJldHVybiB0aGlzLl9jdHJsTmFtZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwYXJzZSB0aGUgZXZlbnQgaGFuZGxlciBhbmQgaXRzIHN1Yi1zdHJ1Y3R1cmVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBmaWxsRGF0YSh0YXNrUmVmOiBUYXNrLCBwYXJzZXI6IFhtbFBhcnNlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3Rhc2sgPT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fdGFzayA9IHRhc2tSZWY7XHJcbiAgICAgIHRoaXMuX3Rhc2tNZ2RJRCA9IHRoaXMuX3Rhc2suZ2V0TWdkSUQoKTtcclxuICAgIH1cclxuXHJcbiAgICB3aGlsZSAodGhpcy5pbml0SW5uZXJPYmplY3RzKHBhcnNlciwgcGFyc2VyLmdldE5leHRUYWcoKSkpIHtcclxuICAgIH1cclxuICAgIGxldCBkYXRhVmlldzogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGhpcy5fdGFzay5EYXRhVmlldztcclxuICAgIHRoaXMuX2hhc1BhcmFtZXRlcnMgPSBkYXRhVmlldy5QYXJhbWV0ZXJzRXhpc3QodGhpcy5fZHZQb3MsIHRoaXMuX2R2TGVuKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpbml0aWFsaXppbmcgb2YgaW5uZXIgb2JqZWN0c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBpbml0SW5uZXJPYmplY3RzKHBhcnNlcjogWG1sUGFyc2VyLCBmb3VuZFRhZ05hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG5cclxuICAgIGlmIChmb3VuZFRhZ05hbWUgPT09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09PSBDb25zdEludGVyZmFjZS5NR19UQUdfSEFORExFUilcclxuICAgICAgdGhpcy5pbml0SW5uZXJFbGVtZW50cyhwYXJzZXIsIHRoaXMuX3Rhc2spO1xyXG5cclxuICAgIGVsc2UgaWYgKGZvdW5kVGFnTmFtZSA9PT0gQ29uc3RJbnRlcmZhY2UuTUdfVEFHX09QRVIpXHJcbiAgICAgIHRoaXMuX29wZXJhdGlvblRhYi5maWxsRGF0YSh0aGlzLl90YXNrLCB0aGlzLCBwYXJzZXIpO1xyXG5cclxuICAgIGVsc2UgaWYgKGZvdW5kVGFnTmFtZSA9PT0gQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0VWRU5UICYmIHRoaXMuX2V2dCA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9ldnQgPSBuZXcgRXZlbnQoKTtcclxuICAgICAgdGhpcy5fZXZ0LmZpbGxEYXRhKHBhcnNlciwgdGhpcy5fdGFzayk7XHJcbiAgICAgIGlmICh0aGlzLl9ldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1RJTUVSIHx8XHJcbiAgICAgICAgKHRoaXMuX2V2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVVNFUiAmJiB0aGlzLl9ldnQuZ2V0VXNlckV2ZW50VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1RJTUVSKSlcclxuICAgICAgICB0aGlzLl90YXNrLmdldE1HRGF0YSgpLmFkZFRpbWVySGFuZGxlcih0aGlzKTtcclxuXHJcbiAgICAgIC8vIGZvciBlbmFibGUgTUdfQUNUX1pPT00gYWN0aW9uXHJcbiAgICAgIC8vIDEuIGhhbmRsZXIgb24gem9vbSBhY3Rpb24uXHJcbiAgICAgIC8vIDIuIGhhbmRsZXIgb24gYSB1c2VyIGRlZmluZWQgaGFuZGxlciB3aXRoIGEgdHJpZ2dlciBvZiB6b29tIGFjdGlvbi5cclxuICAgICAgaWYgKCgodGhpcy5fZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCAmJiB0aGlzLl9ldnQuZ2V0SW50ZXJuYWxDb2RlKCkgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9aT09NKSB8fCAodGhpcy5fZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9VU0VSICYmIHRoaXMuX2V2dC5nZXRVc2VyRXZlbnQoKSAhPT0gbnVsbCAmJiB0aGlzLl9ldnQuZ2V0VXNlckV2ZW50VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMICYmIHRoaXMuX2V2dC5nZXRVc2VyRXZlbnQoKS5nZXRJbnRlcm5hbENvZGUoKSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT00pKSAmJiAhdGhpcy5fdGFzay5nZXRFbmFibGVab29tSGFuZGxlcigpKSB7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9oYW5kbGVyRmxkICE9PSBudWxsKVxyXG4gICAgICAgICAgdGhpcy5faGFuZGxlckZsZC5zZXRIYXNab29tSGFuZGxlcigpO1xyXG5cclxuICAgICAgICBlbHNlIGlmICh0aGlzLl9jdHJsICE9PSBudWxsKVxyXG4gICAgICAgICAgdGhpcy5fY3RybC5IYXNab29tSGFuZGxlciA9IHRydWU7XHJcblxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRoaXMuX3Rhc2suc2V0RW5hYmxlWm9vbUhhbmRsZXIoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoZm91bmRUYWdOYW1lID09PSAnLycgKyBDb25zdEludGVyZmFjZS5NR19UQUdfSEFORExFUikge1xyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4MkVuZE9mVGFnKCk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwidGhlcmUgaXMgbm8gc3VjaCB0YWcgaW4gRXZlbnRIYW5kbGVyLmluaXRJbm5lck9iamVjdHMoKSBcIiArIGZvdW5kVGFnTmFtZSk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEluaXRpYWxpemluZyBvZiBpbm5lciBhdHRyaWJ1dGVzIG9mIDxoYW5kbGVyPiB0YWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1JlZlwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBpbml0SW5uZXJFbGVtZW50cyhwYXJzZXI6IFhtbFBhcnNlciwgdGFza1JlZjogVGFzayk6IHZvaWQge1xyXG4gICAgbGV0IGVuZENvbnRleHQ6IG51bWJlciA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZiggWE1MQ29uc3RhbnRzLlRBR19DTE9TRSwgcGFyc2VyLmdldEN1cnJJbmRleCgpKTtcclxuICAgIGlmIChlbmRDb250ZXh0ICE9PSAtMSAmJiBlbmRDb250ZXh0IDwgcGFyc2VyLmdldFhNTGRhdGEoKS5sZW5ndGgpIHtcclxuICAgICAgLy8gbGFzdCBwb3NpdGlvbiBvZiBpdHMgdGFnXHJcbiAgICAgIGxldCB0YWc6IHN0cmluZyA9IHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCk7XHJcbiAgICAgIHBhcnNlci5hZGQyQ3VyckluZGV4KHRhZy5pbmRleE9mKCBDb25zdEludGVyZmFjZS5NR19UQUdfSEFORExFUikgKyBDb25zdEludGVyZmFjZS5NR19UQUdfSEFORExFUi5sZW5ndGgpO1xyXG5cclxuICAgICAgbGV0IHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+ID0gWG1sUGFyc2VyLmdldFRva2VucyhwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpLCBYTUxDb25zdGFudHMuWE1MX0FUVFJfREVMSU0pO1xyXG4gICAgICB0aGlzLmluaXRFbGVtZW50cyh0b2tlbnNWZWN0b3IsIHRhc2tSZWYpO1xyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KCsrZW5kQ29udGV4dCk7IC8vIHRvIGRlbGV0ZSBcIj5cIiB0b29cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwiaW4gSGFuZGxlci5GaWxsRGF0YSgpIG91dCBvZiBzdHJpbmcgYm91bmRzXCIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIE1ha2UgaW5pdGlhbGl6YXRpb24gb2YgcHJpdmF0ZSBlbGVtZW50cyBieSBmb3VuZCB0b2tlbnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidG9rZW5zVmVjdG9yXCI+Zm91bmQgdG9rZW5zLCB3aGljaCBjb25zaXN0IGF0dHJpYnV0ZS92YWx1ZSBvZiBldmVyeSBmb3VuZFx0ZWxlbWVudCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1JlZlwiPiA8L3BhcmFtPlxyXG4gIHByaXZhdGUgaW5pdEVsZW1lbnRzKHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+LCB0YXNrUmVmOiBUYXNrKTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgdG9rZW5zVmVjdG9yLmxlbmd0aDsgaiArPSAyKSB7XHJcbiAgICAgIGxldCBhdHRyaWJ1dGU6IHN0cmluZyA9ICh0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaikpO1xyXG4gICAgICBsZXQgdmFsdWVTdHI6IHN0cmluZyA9ICh0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaiArIDEpKTtcclxuXHJcbiAgICAgIHN3aXRjaCAoYXR0cmlidXRlKSB7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0hBTkRMRURCWTpcclxuICAgICAgICAgIHRoaXMuX2hhbmRsZWRCeUNsaWVudCA9ICh2YWx1ZVN0ci50b1VwcGVyQ2FzZSgpID09PSBcIkNcIi50b1VwcGVyQ2FzZSgpKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0lEOlxyXG4gICAgICAgICAgdGhpcy5faWQgPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfTEVWRUw6XHJcbiAgICAgICAgICB0aGlzLl9sZXZlbCA9IHZhbHVlU3RyWzBdO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9PQkpFQ1Q6XHJcbiAgICAgICAgICBsZXQgdmFsdWVTdHJpbmdDdHJsTmFtZTogc3RyaW5nID0gWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKTtcclxuICAgICAgICAgIHRoaXMuX2N0cmxOYW1lID0gWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyaW5nQ3RybE5hbWUpLnRvVXBwZXJDYXNlKCk7IC8vIHJlbGV2YW50IGZvciB1c2VyIGhhbmRsZXJzIG9ubHlcclxuICAgICAgICAgIHRoaXMuY2FsY3VsYXRlQ3RybEZyb21Db250cm9sTmFtZSh0YXNrUmVmKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVkFSSUFCTEU6XHJcbiAgICAgICAgICB0aGlzLl9oYW5kbGVyRmxkID0gPEZpZWxkQmFzZT50aGlzLl90YXNrLkRhdGFWaWV3LmdldEZpZWxkKFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpKTtcclxuICAgICAgICAgIHRoaXMuX2hhbmRsZXJGbGQuc2V0SGFzQ2hhbmdlRXZlbnQoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfU0NPUEU6XHJcbiAgICAgICAgICB0aGlzLl9zY29wZSA9IDxCcmtTY29wZT52YWx1ZVN0clswXTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfUFJPUEFHQVRFOlxyXG4gICAgICAgICAgdGhpcy5fcHJvcGFnYXRlRXhwLnNldFZhbCh0YXNrUmVmLCB2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0VOQUJMRUQ6XHJcbiAgICAgICAgICB0aGlzLl9lbmFibGVkRXhwLnNldFZhbCh0YXNrUmVmLCB2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0RWUE9TOlxyXG4gICAgICAgICAgbGV0IGk6IG51bWJlciA9IHZhbHVlU3RyLmluZGV4T2YoXCIsXCIpO1xyXG4gICAgICAgICAgaWYgKGkgPiAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLl9kdkxlbiA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIuc3Vic3RyKDAsIGkpKTtcclxuICAgICAgICAgICAgdGhpcy5fZHZQb3MgPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyLnN1YnN0cihpICsgMSkpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBmbGRJZHg6IG51bWJlciA9IHRoaXMuX2R2UG9zOyBmbGRJZHggPCB0aGlzLl9kdlBvcyArIHRoaXMuX2R2TGVuOyBmbGRJZHgrKykge1xyXG4gICAgICAgICAgICAgIGxldCBmaWVsZDogRmllbGRCYXNlID0gKDxGaWVsZEJhc2U+dGhpcy5fdGFzay5EYXRhVmlldy5nZXRGaWVsZChmbGRJZHgpKTtcclxuICAgICAgICAgICAgICBmaWVsZC5Jc0V2ZW50SGFuZGxlckZpZWxkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9IQU5ETEVSX09ORk9STTpcclxuICAgICAgICAgIHRoaXMuX2lzSGFuZGxlck9uRm9ybSA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwiVGhlcmUgaXMgbm8gc3VjaCB0YWcgaW4gRXZlbnRIYW5kbGVyIGNsYXNzLiBJbnNlcnQgY2FzZSB0byBFdmVudEhhbmRsZXIuaW5pdEVsZW1lbnRzIGZvciBcIiArIGF0dHJpYnV0ZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuICAvLy8gY2FsY3VsYXRlIHRoZSBjdHJsIHByb3BlcnR5IGZyb20gY3RybCBuYW1lIHByb3BlcnR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrUmVmXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWx1ZVN0cmluZ0N0cmxOYW1lXCI+PC9wYXJhbT5cclxuXHJcbiAgY2FsY3VsYXRlQ3RybEZyb21Db250cm9sTmFtZSh0YXNrUmVmOiBUYXNrKTogdm9pZCB7XHJcbiAgICBpZiAoIU5TdHJpbmcuSXNOdWxsT3JFbXB0eSh0aGlzLl9jdHJsTmFtZSkpIHtcclxuICAgICAgdGhpcy5fY3RybCA9ICgodGFza1JlZi5nZXRGb3JtKCkgIT09IG51bGwpID8gKDxNZ0Zvcm0+dGFza1JlZi5nZXRGb3JtKCkpLmdldEN0cmxCeUN0cmxOYW1lKHRoaXMuX2N0cmxOYW1lKSA6IG51bGwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrIGlmIHRoaXMgZXZlbnQgaGFuZGxlciBpcyBhIHNwZWNpZmljIGhhbmRsZXIgb2YgYW4gZXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicnRFdnRcIj50aGUgZXZlbnQgdG8gY2hlY2s8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gYm9vbGVhbiB0cnVlIGlmIHRoZSBldmVudHMgbWF0Y2g8L3JldHVybnM+XHJcbiAgaXNTcGVjaWZpY0hhbmRsZXJPZihydEV2dDogUnVuVGltZUV2ZW50KTogYm9vbGVhbiB7XHJcblxyXG4gICAgaWYgKHRoaXMuX2N0cmwgPT09IG51bGwgJiYgdGhpcy5fY3RybE5hbWUgPT09IG51bGwgJiYgdGhpcy5faGFuZGxlckZsZCA9PT0gbnVsbCAmJiAhdGhpcy5faXNIYW5kbGVyT25Gb3JtKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgLy8gY2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSBzY29wZVxyXG4gICAgaWYgKHRoaXMuX3Njb3BlID09PSBCcmtTY29wZS5UYXNrICYmIHRoaXMuX3Rhc2sgIT09IHJ0RXZ0LmdldFRhc2soKSlcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIC8vIGlmIHRoZSBoYW5kbGVycyBldmVudCBhbmQgdGhlIGNoZWNrZWQgZXZlbnQgYXJlIGVxdWFsIGFuZFxyXG4gICAgLy8gdGhlIGhhbmRsZXIgaGFuZGxlcyB0aGUgY29udHJvbCBhdHRhY2hlZCB0byB0aGUgY2hlY2tlZCBldmVudCwgcmV0dXJuIHRydWVcclxuICAgIC8vIGNvbXBhcmUgY29udHJvbCBuYW1lIHdpdGggdGhlIG5hbWUgb2YgdGhlIGNvbnRyb2wgaW4gdGhlIGV2ZW50XHJcbiAgICBpZiAodGhpcy5fZXZ0LmVxdWFscyhydEV2dCkpIHtcclxuICAgICAgLy8gVmFyaWFibGUgY2hhbmdlIGhhbmRsZXJzIGRvIG5vdCBoYXZlIGNvbnRyb2wgbmFtZXMuIE9ubHkgZmllbGRzIG5lZWQgdG8gYmUgY29tcGFyZWRcclxuICAgICAgaWYgKHRoaXMuX2hhbmRsZXJGbGQgIT09IG51bGwpIHtcclxuICAgICAgICByZXR1cm4gKHRoaXMuX2hhbmRsZXJGbGQgPT09IHJ0RXZ0LmdldEZsZCgpKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAocnRFdnQuQ29udHJvbCAhPT0gbnVsbCAmJiAhdGhpcy5faXNIYW5kbGVyT25Gb3JtKSB7XHJcbiAgICAgICAgbGV0IGV2ZW50Q3RybE5hbWU6IHN0cmluZyA9IHJ0RXZ0LkNvbnRyb2wuZ2V0Q29udHJvbE5hbWVGb3JIYW5kbGVyU2VhcmNoKCk7XHJcbiAgICAgICAgaWYgKGV2ZW50Q3RybE5hbWUgIT09IG51bGwgJiYgdGhpcy5fY3RybE5hbWUudG9Mb3dlckNhc2UoKSA9PT0gZXZlbnRDdHJsTmFtZS50b0xvd2VyQ2FzZSgpKVxyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAocnRFdnQuQ29udHJvbCA9PT0gbnVsbCAmJiB0aGlzLl9pc0hhbmRsZXJPbkZvcm0pXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrIGlmIHRoaXMgZXZlbnQgaGFuZGxlciBpcyBhIG5vbi1zcGVjaWZpYyBvciBnbG9iYWwgaGFuZGxlciBvZiBhbiBldmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJydEV2dFwiPnRoZSBldmVudCB0byBjaGVja1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gYm9vbGVhbiB0cnVlIGlmIHRoZSBldmVudHMgbWF0Y2hcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGlzTm9uU3BlY2lmaWNIYW5kbGVyT2YocnRFdnQ6IFJ1blRpbWVFdmVudCk6IGJvb2xlYW4ge1xyXG5cclxuICAgIC8vIGlmIHRoZSBoYW5kbGVyIGhhbmRsZXMgYSBjb250cm9sIHJldHVybiBmYWxzZVxyXG4gICAgaWYgKHRoaXMuX2N0cmwgIT09IG51bGwgfHwgdGhpcy5fY3RybE5hbWUgIT09IG51bGwgfHwgdGhpcy5faGFuZGxlckZsZCAhPT0gbnVsbCB8fCB0aGlzLl9pc0hhbmRsZXJPbkZvcm0pXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIC8vIGNoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgc2NvcGVcclxuICAgIGlmICh0aGlzLl9zY29wZSA9PT0gQnJrU2NvcGUuVGFzayAmJiAgdGhpcy5fdGFzayAhPT0gcnRFdnQuZ2V0VGFzaygpICYmIHJ0RXZ0LmdldFR5cGUoKSAhPT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9USU1FUilcclxuICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuX3Njb3BlID09PSBCcmtTY29wZS5HbG9iYWwgJiYgdGhpcy5fdGFzayAhPT0gcnRFdnQuZ2V0VGFzaygpKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgLy8gaWYgdGhlIGhhbmRsZXJzIGV2ZW50IGFuZCB0aGUgY2hlY2tlZCBldmVudCBhcmUgZXF1YWwgcmV0dXJuIHRydWVcclxuICAgIGlmICh0aGlzLl9ldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1VTRVIgJiYgdGhpcy5fZXZ0LmdldFVzZXJFdmVudFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9OT1RJTklURUQpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0aGlzLl9ldnQuZmluZFVzZXJFdmVudCgpO1xyXG4gICAgICB9XHJcbiAgICAgIGNhdGNoIChhcHBsaWNhdGlvbkV4Y2VwdGlvbikge1xyXG4gICAgICAgIGlmIChhcHBsaWNhdGlvbkV4Y2VwdGlvbiBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRocm93IGFwcGxpY2F0aW9uRXhjZXB0aW9uO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fZXZ0LmVxdWFscyhydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgaWYgdGhpcyBldmVudCBoYW5kbGVyIGlzIGEgZ2xvYmFsIGhhbmRsZXIgb2YgYW4gZXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicnRFdnRcIj50aGUgZXZlbnQgdG8gY2hlY2tcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGJvb2xlYW4gdHJ1ZSBpZiB0aGUgZXZlbnRzIG1hdGNoXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBpc0dsb2JhbEhhbmRsZXJPZihydEV2dDogUnVuVGltZUV2ZW50KTogYm9vbGVhbiB7XHJcbiAgICAvLyBjaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIHNjb3BlXHJcbiAgICBpZiAodGhpcy5fc2NvcGUgIT09IEJya1Njb3BlLkdsb2JhbClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIC8vIGlmIHRoZSBoYW5kbGVyIGhhbmRsZXMgYSBjb250cm9sIHJldHVybiBmYWxzZVxyXG4gICAgaWYgKHRoaXMuX2N0cmwgIT0gbnVsbCB8fCB0aGlzLl9jdHJsTmFtZSAhPSBudWxsIHx8IHRoaXMuX2hhbmRsZXJGbGQgIT0gbnVsbCB8fCB0aGlzLl9pc0hhbmRsZXJPbkZvcm0pXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAvLyBpZiB0aGUgaGFuZGxlcnMgZXZlbnQgYW5kIHRoZSBjaGVja2VkIGV2ZW50IGFyZSBlcXVhbCwgcmV0dXJuIHRydWVcclxuICAgIHJldHVybiB0aGlzLl9ldnQuZXF1YWxzKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVjayBpZiB0aGlzIGV2ZW50IGhhbmRsZXIgaXMgYSBzcGVjaWZpYyBnbG9iYWwgaGFuZGxlciBvZiBhbiBldmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJydEV2dFwiPnRoZSBldmVudCB0byBjaGVja1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gYm9vbGVhbiB0cnVlIGlmIHRoZSBldmVudHMgbWF0Y2hcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGlzR2xvYmFsU3BlY2lmaWNIYW5kbGVyT2YocnRFdnQ6IFJ1blRpbWVFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgLy8gY2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSBzY29wZVxyXG4gICAgaWYgKHRoaXMuX3Njb3BlICE9PSBCcmtTY29wZS5HbG9iYWwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5fY3RybCA9PSBudWxsICYmIHRoaXMuX2N0cmxOYW1lID09IG51bGwgJiYgdGhpcy5faGFuZGxlckZsZCA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgLy8gaWYgdGhlIGhhbmRsZXJzIGV2ZW50IGFuZCB0aGUgY2hlY2tlZCBldmVudCBhcmUgZXF1YWwsIHJldHVybiB0cnVlXHJcbiAgICByZXR1cm4gKHRoaXMuX2N0cmxOYW1lICE9IG51bGwgJiYgdGhpcy5fZXZ0LmVxdWFscyhydEV2dCkgJiZcclxuICAgICAgTlN0cmluZy5FcXVhbHModGhpcy5fY3RybE5hbWUsIHJ0RXZ0LkNvbnRyb2wuTmFtZSwgdHJ1ZSkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGV4ZWN1dGUgdGhlIGV2ZW50IGhhbmRsZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicnRFdnRcIj50aGUgZXZlbnQgb24gd2hpY2ggdGhlIGhhbmRsZXIgaXMgZXhlY3V0ZWRcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJldHVybmVkRnJvbVNlcnZlclwiPmluZGljYXRlcyB3aGV0aGVyIHdlIHJldHVybmVkIGZyb20gdGhlIHNlcnZlciBhbmRcclxuICAvLy8gICB0aGVyZWZvcmUgbWlnaHQgbm90IG5lZWQgdG8gY2hlY2sgdGhlIGVuYWJsZWQgY29uZGl0aW9uXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJlbmFibGVkQ25kQ2hlY2tlZEFuZFRydWVcIj5pbmRpY2F0ZXMgdGhhdCB0aGUgZW5hYmxlZCBjb25kaXRpb24gd2FzIGFscmVhZHkgY2hlY2tlZCBhbmQgdGhlcmUncyBub1xyXG4gIC8vLyAgIG5lZWQgdG8gcmUtY2hlY2sgaXQgKGJlY2F1c2UgaXQgbWlnaHQgYmUgZmFsc2Ugbm93LCBidXQgd2Ugc3RpbGwgbmVlZCB0b1xyXG4gIC8vLyAgIGV4ZWN1dGUgdGhlIGhhbmRsZXIpXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBib29sZWFuIHRoaXMgaXMgdGhlIHJldHVybiBjb2RlIG9mIHRoZSBoYW5kbGVyLCBpZiB0cnVlIHRoZW4gdGhlIGV2ZW50c1xyXG4gIC8vLyAgIG1hbmFnZXIgbXVzdCBjb250aW51ZSBzZWFyY2hpbmcgZm9yIHRoZSBuZXh0IGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBldmVudFxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiBhc3luYyBleGVjdXRlKHJ0RXZ0OiBSdW5UaW1lRXZlbnQsIHJldHVybmVkRnJvbVNlcnZlcjogYm9vbGVhbiwgZW5hYmxlZENuZENoZWNrZWRBbmRUcnVlOiBib29sZWFuKTogUHJvbWlzZTxSZXRWYWxzPiB7XHJcblxyXG4gICAgbGV0IGN0cmw6IE1nQ29udHJvbCA9IG51bGw7XHJcbiAgICBsZXQgcmV0VmFsOiBib29sZWFuO1xyXG4gICAgbGV0IGRlcHRoOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IHRhc2tFbmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBicmtMZXZlbDogc3RyaW5nID0gdGhpcy5fdGFzay5nZXRCcmtMZXZlbCgpO1xyXG4gICAgbGV0IGJya0xldmVsSW5kZXg6IG51bWJlciA9IHRoaXMuX3Rhc2suZ2V0QnJrTGV2ZWxJbmRleCgpO1xyXG4gICAgbGV0IGluaXRpYWxMb29wU3RhY2tTaXplOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8vIHNldCBsZXZlbCBmb3IgTEVWRUwgZnVuY3Rpb25cclxuICAgIGlmICh0YXNrRW5kICE9PSBudWxsICYmIHRoaXMuX2V2dC5nZXRUeXBlKCkgIT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfRVhQUkVTU0lPTiAmJiAodGhpcy5fZXZ0LmdldFR5cGUoKSAhPT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9VU0VSIHx8ICh0aGlzLl9ldnQuZ2V0VXNlckV2ZW50KCkuZ2V0VHlwZSgpICE9PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0VYUFJFU1NJT04gJiYgdGhpcy5fZXZ0LmdldFVzZXJFdmVudCgpLmdldFR5cGUoKSAhPT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9USU1FUikpKSB7XHJcbiAgICAgIC8vIFVubGlrZSBhIGhhbmRsZXIsIHRoZSB1c2VyIGZ1bmN0aW9uIHNob3VsZCBub3QgY2hhbmdlIHRoZSBsZXZlbCBvZiB0aGUgdGFzay5cclxuICAgICAgaWYgKHRoaXMuX2V2dC5nZXRUeXBlKCkgIT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVVNFUl9GVU5DKVxyXG4gICAgICAgIHRoaXMuX3Rhc2suc2V0QnJrTGV2ZWwocnRFdnQuZ2V0QnJrTGV2ZWwoKSwgdGhpcy5faWQpO1xyXG5cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5fdGFzay5zZXRCcmtMZXZlbCh0aGlzLl9ldnQuZ2V0QnJrTGV2ZWwoKSwgdGhpcy5faWQpO1xyXG5cclxuICAgIGxldCBhcmdzOiBBcmd1bWVudHNMaXN0ID0gcnRFdnQuZ2V0QXJnTGlzdCgpO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGxldCBmbG93TW9uaXRvcjogRmxvd01vbml0b3JRdWV1ZSA9IEZsb3dNb25pdG9yUXVldWUuSW5zdGFuY2U7XHJcblxyXG4gICAgICAvLyBSb3V0ZSBldmVudCBjYW4gb25seSBiZSBoYW5kbGVkIGluIGEgdGFzayB3aGljaCBpcyBvcGVuZWQgYXMgcm91dGVyIGxpbmsgb3IgdGhlIHJvb3QgdGFzay5cclxuICAgICAgaWYgKHJ0RXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCAmJiBydEV2dC5nZXRJbnRlcm5hbENvZGUoKSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1dFQkNMSUVOVF9ST1VURSkge1xyXG4gICAgICAgIGlmICghdGhpcy5fdGFzay5Jc1JvdXRlKCkgJiYgdGhpcy5fdGFzayAhPT0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkpIHtcclxuICAgICAgICAgIHJldHVybiBuZXcgUmV0VmFscyh0cnVlLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGNoZWNrIGlmIHRoZSBoYW5kbGVyIGlzIGVuYWJsZWQuIGlmIG5vdCwgcmV0dXJuIHRydWUgdG8gY29udGludWUgc2VhcmNoaW5nXHJcbiAgICAgIC8vIGZvciB0aGUgbmV4dCBldmVudCBoYW5kbGVyXHJcbiAgICAgIGxldCBuZXh0T3BlcklkeDogbnVtYmVyID0gLTE7XHJcbiAgICAgIGlmIChyZXR1cm5lZEZyb21TZXJ2ZXIpIHtcclxuICAgICAgICAvLyBpZiB3ZSByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIgLSB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBuZXh0IG9wZXJhdGlvbiBpcyBvbiB0aGUgY3VycmVudFxyXG4gICAgICAgIC8vIGhhbmRsZXIgKHVzaW5nIGEgY2FsbCB0byBnZXROZXh0T3BlcklkeCgpIHdpdGggZmFsc2UgaW4gdGhlIGNsZWFyV2hlbkZvdW5kIHBhcmFtZXRlcilcclxuICAgICAgICAvLyBhbmQgaWYgaXQgaXMgLSBkbyBub3QgY2hlY2sgdGhlIGVuYWJsZWQgY29uZGl0aW9uLCBiZWNhdXNlIGl0IG1pZ2h0IGhhdmUgY2hhbmdlZFxyXG4gICAgICAgIC8vIHNpbmNlIGl0IHdhcyBldmFsdWF0ZWQgb24gdGhlIHNlcnZlci4gd2UgbmVlZCB0byBnbyBpbnRvIHRoaXMgaGFuZGxlciBldmVuIGlmIGl0IGlzIG5vdFxyXG4gICAgICAgIC8vIGN1cnJlbnRseSBlbmFibGVkXHJcbiAgICAgICAgbmV4dE9wZXJJZHggPSBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5nZXROZXh0T3BlcklkeCh0aGlzLl9vcGVyYXRpb25UYWIuZ2V0T3BlcmF0aW9uKDApLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5leHRPcGVySWR4ID09PSAtMSAmJiAhZW5hYmxlZENuZENoZWNrZWRBbmRUcnVlICYmICFhd2FpdCB0aGlzLmlzRW5hYmxlZCgpKVxyXG4gICAgICAgIHJldHVybiBuZXcgUmV0VmFscyh0cnVlLCBmYWxzZSk7XHJcblxyXG4gICAgICAvLyBjaGVjayB0aGUgc2NvcGUgZm9yIEV4cHJlc3Npb24gYW5kIFRpbWVyIGhhbmRsZXJzXHJcbiAgICAgIGlmICh0aGlzLl9zY29wZSA9PT0gQnJrU2NvcGUuVGFzayAmJiAocnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1RJTUVSIHx8IHJ0RXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9FWFBSRVNTSU9OKSkge1xyXG4gICAgICAgIGxldCBjdXJyVGFzazogVGFzayA9IExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKTtcclxuICAgICAgICBpZiAodGhpcy5fdGFzayAhPT0gY3VyclRhc2spXHJcbiAgICAgICAgICByZXR1cm4gbmV3IFJldFZhbHModHJ1ZSwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGhpcy5faGFuZGxlZEJ5Q2xpZW50KSB7XHJcbiAgICAgICAgLy8gcmV0dXJuIGZhbHNlIHRvIHN0b3Agc2VhcmNoaW5nIGZvciB0aGUgbW9yZSBoYW5kbGVycyBiZWNhdXNlXHJcbiAgICAgICAgLy8gdGhlIHNlcnZlciBoYWQgdGFrZW4gY2FyZSBvZiBhbGwgb2YgdGhlbVxyXG4gICAgICAgIHJldHVybiBuZXcgUmV0VmFscyhmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChydEV2dC5nZXRUeXBlKCkgIT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVVNFUiAmJiAhYXdhaXQgdGhpcy5fZXZ0LmRhdGFFdmVudElzVHJ1ZSgpKVxyXG4gICAgICAgIHJldHVybiBuZXcgUmV0VmFscyhmYWxzZSwgdHJ1ZSk7XHJcblxyXG4gICAgICBpZiAocnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMICYmIHJ0RXZ0LmdldEludGVybmFsQ29kZSgpID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19TVUZGSVgpXHJcbiAgICAgICAgdGFza0VuZCA9IHRydWU7XHJcblxyXG4gICAgICBpZiAocnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMKSB7XHJcbiAgICAgICAgc3dpdGNoIChydEV2dC5nZXRJbnRlcm5hbENvZGUoKSkge1xyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWDpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dSZWMoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgsIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9TVEFSVCwgIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWDpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dSZWMoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgsIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9TVEFSVCwgIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd0N0cmwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYLCBydEV2dC5Db250cm9sLk5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfU1RBUlQsICB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWDpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dDdHJsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWCwgcnRFdnQuQ29udHJvbC5OYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1NUQVJULCAgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVkFSSUFCTEU6XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93RmxkKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9WQVJJQUJMRSwgcnRFdnQuZ2V0RmxkKCkuZ2V0TmFtZSgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfU1RBUlQsICB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1ZFUklGSUNBVElPTjpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dDdHJsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1ZFUklGSUNBVElPTixcclxuICAgICAgICAgICAgICBydEV2dC5Db250cm9sLk5hbWUsIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9TVEFSVCwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19QUkVGSVg6XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93UmVjKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1BSRUZJWCwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1NUQVJULCAgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19TVUZGSVg6XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93UmVjKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1NVRkZJWCwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1NUQVJULCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd0hhbmRsZXIodGhpcy5fZXZ0LmdldEJya0xldmVsKHRydWUpLCBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfU1RBUlQsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dIYW5kbGVyKHRoaXMuX2V2dC5nZXRCcmtMZXZlbCh0cnVlKSwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1NUQVJULCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG5cclxuICAgICAgdHJ5IHtcclxuXHJcbiAgICAgICAgaWYgKHRhc2tFbmQgIT09IG51bGwpXHJcbiAgICAgICAgICBjdHJsID0gPE1nQ29udHJvbD5ydEV2dC5Db250cm9sO1xyXG5cclxuICAgICAgICBsZXQgbWdkSUQ6IG51bWJlciA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5jdXJyTWdkSUQ7XHJcbiAgICAgICAgbGV0IGlzQ2hhbmdlZEN1cnJXbmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICBsZXQgaXNDaGFuZ2VkQ3VyclduZFJlZjogUmVmUGFyYW08Ym9vbGVhbj4gPSBuZXcgUmVmUGFyYW0oaXNDaGFuZ2VkQ3VyclduZCk7XHJcblxyXG5cclxuICAgICAgICAvLyBmb3IgdGltZXIgZXZlbnRzIGNoZWNrIGlmIHRoZSB0YXNrIG9mIHRoZSBldmVudCBpcyBpbiB0aGVcclxuICAgICAgICAvLyBjdXJyZW50IHdpbmRvdyBhbmQgaWYgbm90IHRoZW4gY2hhbmdlIHRoZSBjdXJyZW50IHdpbmRvd1xyXG4gICAgICAgIC8vIHRlbXBvcmFyaWx5IHRpbGwgdGhlIGhhbmRsZXIgZmluaXNoZXNcclxuICAgICAgICBpZiAodGhpcy5fZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9USU1FUiAmJiBtZ2RJRCAhPT0gcnRFdnQuZ2V0TWdkSUQoKSkge1xyXG4gICAgICAgICAgLy8gc2V0IG51bWJlciBvZiB3aW5kb3cgZm9yIHRpbWVyIGV2ZW50XHJcbiAgICAgICAgICBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuY3Vyck1nZElEID0gcnRFdnQuZ2V0TWdkSUQoKTtcclxuICAgICAgICAgIGlzQ2hhbmdlZEN1cnJXbmRSZWYudmFsdWUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gcHV0IGluaXRpYWwgdmFsdWVzIHRvIHRoZSBsb2NhbCB2YXJpYWJsZXNcclxuICAgICAgICBhd2FpdCB0aGlzLnJlc2V0TG9jYWxWYXJpYWJsZXMoYXJncyk7XHJcblxyXG4gICAgICAgIGluaXRpYWxMb29wU3RhY2tTaXplID0gdGhpcy5fdGFzay5nZXRMb29wU3RhY2tTaXplKCk7XHJcbiAgICAgICAgbGV0IHJldFZhbHM6IFJldFZhbHMgPSBudWxsO1xyXG4gICAgICAgIGlmICh0aGlzLl9vcGVyYXRpb25UYWIuZ2V0U2l6ZSgpID4gMClcclxuICAgICAgICAgIHJldFZhbHMgPSBhd2FpdCB0aGlzLmV4ZWN1dGVPcGVyYXRpb25zKDAsIHRoaXMuX29wZXJhdGlvblRhYi5nZXRTaXplKCkgLSAxLCB0YXNrRW5kLCBtZ2RJRCwgZGVwdGgsIGlzQ2hhbmdlZEN1cnJXbmRSZWYsIGZhbHNlLCBmYWxzZSwgLTEpO1xyXG5cclxuICAgICAgICBpc0NoYW5nZWRDdXJyV25kID0gaXNDaGFuZ2VkQ3VyclduZFJlZi52YWx1ZTtcclxuXHJcbiAgICAgICAgaWYgKHJldFZhbHMgIT09IG51bGwpXHJcbiAgICAgICAgICByZXR1cm4gcmV0VmFscztcclxuXHJcbiAgICAgICAgLy8gY2hlY2sgdGhlIGVuZHRhc2sgY29uZGl0aW9uIG9uY2UgYWdhaW4gYXQgdGhlIGVuZCBvZiB0aGUgaGFuZGxlclxyXG4gICAgICAgIGlmICghdGFza0VuZClcclxuICAgICAgICAgIGF3YWl0IHRoaXMuX3Rhc2suZXZhbEVuZENvbmQoQ29uc3RJbnRlcmZhY2UuRU5EX0NPTkRfRVZBTF9JTU1JRElBVEUpO1xyXG5cclxuICAgICAgICAvLyBjaGFuZ2UgY3VycmVudCB3aW5kb3cgYmFjayBpZiBpdCB3YXMgY2hhbmdlZCBmb3IgVGltZXJcclxuICAgICAgICBpZiAoaXNDaGFuZ2VkQ3VyclduZCkge1xyXG4gICAgICAgICAgbGV0IG9sZE1nZDogTUdEYXRhID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldE1HRGF0YShtZ2RJRCk7XHJcbiAgICAgICAgICBpZiAob2xkTWdkICE9PSBudWxsICYmICFvbGRNZ2QuSXNBYm9ydGluZylcclxuICAgICAgICAgICAgQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmN1cnJNZ2RJRCA9IG1nZElEO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyBlbmQgd2hpbGUgb3BlcmF0aW9uIGJsb2NrXHJcbiAgICAgIGNhdGNoIChleCkge1xyXG4gICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFNlcnZlckVycm9yKSB7XHJcbiAgICAgICAgICBpZiAoTG9nZ2VyLkluc3RhbmNlLkxvZ0xldmVsICE9PSBMb2dnZXJfTG9nTGV2ZWxzLkJhc2ljKVxyXG4gICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZyhleCk7XHJcbiAgICAgICAgICB0aHJvdyBleDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoZXggaW5zdGFuY2VvZiBFeGNlcHRpb24pIHtcclxuICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nKGV4KTtcclxuICAgICAgICAgIHJldHVybiBuZXcgUmV0VmFscyhmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRocm93IGV4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmaW5hbGx5IHtcclxuICAgICAgICAvLyBnZXQgdGhlIHByb3BhZ2F0ZSB2YWx1ZVxyXG4gICAgICAgIHJldFZhbCA9IGF3YWl0IHRoaXMuX3Byb3BhZ2F0ZUV4cC5nZXRWYWwoKTtcclxuXHJcbiAgICAgICAgLy8gcmVtb3ZlIGxvb3AgY291bnRlcnMgdGhhdCB3ZXJlIGxlZnQgdW51c2VkIGluIHRoZSBzdGFjayBkdWUgdG8gbGVhdmluZ1xyXG4gICAgICAgIC8vIHRoZSBoYW5kbGVyIG9uIFwic3RvcEV4ZWN1dGlvbigpID09IHRydWVcIlxyXG4gICAgICAgIGxldCBjdXJyTG9vcFN0YWNrU2l6ZTogbnVtYmVyID0gdGhpcy5fdGFzay5nZXRMb29wU3RhY2tTaXplKCk7XHJcbiAgICAgICAgZm9yICg7IGN1cnJMb29wU3RhY2tTaXplID4gaW5pdGlhbExvb3BTdGFja1NpemU7IGN1cnJMb29wU3RhY2tTaXplID0gY3Vyckxvb3BTdGFja1NpemUtLSlcclxuICAgICAgICAgIHRoaXMuX3Rhc2sucG9wTG9vcENvdW50ZXIoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gYWZ0ZXIgZXhlY3V0aW5nIHRoZSBvcGVyYXRpb25zIHVwZGF0ZSB0aGUgYXJndW1lbnRzIGJhY2sgYW5kIHJlY29tcHV0ZVxyXG4gICAgICBpZiAoYXJncyAhPT0gbnVsbClcclxuICAgICAgICBhd2FpdCB0aGlzLmdldEFyZ1ZhbHNGcm9tRmxkcyhhcmdzKTtcclxuXHJcbiAgICAgIGlmIChydEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwpIHtcclxuICAgICAgICBzd2l0Y2ggKHJ0RXZ0LmdldEludGVybmFsQ29kZSgpKSB7XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd1JlYyhJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX0VORCwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWDpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dSZWMoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgsIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9FTkQsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfUFJFRklYOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd1JlYyhJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19QUkVGSVgsIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9FTkQsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfU1VGRklYOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd1JlYyhJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19TVUZGSVgsIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9FTkQsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd0N0cmwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYLCBjdHJsLk5hbWUsIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9FTkQsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd0N0cmwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYLCBjdHJsLk5hbWUsIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9FTkQsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1ZBUklBQkxFOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd0ZsZChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVkFSSUFCTEUsIHJ0RXZ0LmdldEZsZCgpLmdldE5hbWUoKSwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX0VORCwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9WRVJJRklDQVRJT046XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93Q3RybChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9WRVJJRklDQVRJT04sIGN0cmwuTmFtZSwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX0VORCwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dIYW5kbGVyKHRoaXMuX2V2dC5nZXRCcmtMZXZlbCh0cnVlKSwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX0VORCwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd0hhbmRsZXIodGhpcy5fZXZ0LmdldEJya0xldmVsKHRydWUpLCAxLCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgIC8vIHJlc3RvcmluZyAgdGhlIG9yaWdpbmFsIGJyZWFrIGxldmVsIHN0YXRlIGFuZCBjdXJyZW50IGV4ZWN1dGluZyBjb250cm9sIGluZGV4XHJcbiAgICAgIHRoaXMuX3Rhc2suc2V0QnJrTGV2ZWwoYnJrTGV2ZWwsIGJya0xldmVsSW5kZXgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBSZXRWYWxzKHJldFZhbCwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZXhlY3V0ZSB0aGUgb3BlcmF0aW9ucyBzdGFydGluZyBmcm9tIGZyb21JZHggYW5kIGVuZGluZyBhdCBlbmRJZHguXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVPcGVyYXRpb25zKGZyb21JZHg6IG51bWJlciwgdG9JZHg6IG51bWJlciwgdGFza0VuZDogYm9vbGVhbiwgbWdkSUQ6IG51bWJlciwgZGVwdGg6IG51bWJlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2hhbmdlZEN1cnJXbmRSZWY6IFJlZlBhcmFtPGJvb2xlYW4+LCBpbkJsb2NrSWY6IGJvb2xlYW4sIGluUmV0dXJuZWRGcm9tU2VydmVyOiBib29sZWFuLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5OZXh0T3BlcklkeDogbnVtYmVyKTogUHJvbWlzZSA8UmV0VmFscz4ge1xyXG4gICAgbGV0IG9wZXI6IE9wZXJhdGlvbjtcclxuICAgIGxldCBvcGVyVHlwZTogbnVtYmVyO1xyXG4gICAgbGV0IG5leHRPcGVySWR4OiBudW1iZXIgPSAtMTtcclxuICAgIGxldCByZXR1cm5lZEZyb21TZXJ2ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBtZ2Q6IE1HRGF0YSA9IHRoaXMuX3Rhc2suZ2V0TUdEYXRhKCk7XHJcbiAgICBsZXQgZXhlY0Zsb3dJZHg6IG51bWJlciA9IGZyb21JZHg7XHJcbiAgICBsZXQgcmV0dmFsczogUmV0VmFscztcclxuICAgIGxldCBibG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgZXhlY3V0ZUJsb2NrOiBib29sZWFuO1xyXG4gICAgbGV0IGJsb2NrTG9vcEV4ZWNvblNlcnZlcjogYm9vbGVhbjtcclxuICAgIGxldCBmbG93TW9uaXRvcjogRmxvd01vbml0b3JRdWV1ZSA9IEZsb3dNb25pdG9yUXVldWUuSW5zdGFuY2U7XHJcbiAgICBsZXQgcm91dGVPcGVyYXRpb25FeGVjdXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGlmICghaW5SZXR1cm5lZEZyb21TZXJ2ZXIpIHtcclxuICAgICAgLy8gd2UgbmVlZCB0byBjaGVjayBpZiB0aGUgc2VydmVyIGFscmVhZHkgc3RhcnRlZCBydW5uaW5nIHRoaXMgaGFuZGxlclxyXG4gICAgICBvcGVyID0gdGhpcy5fb3BlcmF0aW9uVGFiLmdldE9wZXJhdGlvbihleGVjRmxvd0lkeCk7XHJcbiAgICAgIG5leHRPcGVySWR4ID0gQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuZ2V0TmV4dE9wZXJJZHgob3BlciwgdHJ1ZSk7XHJcbiAgICAgIGlmIChuZXh0T3BlcklkeCA+IC0xKSB7XHJcbiAgICAgICAgcmV0dXJuZWRGcm9tU2VydmVyID0gdHJ1ZTtcclxuICAgICAgICBpZiAoaW5CbG9ja0lmKVxyXG4gICAgICAgICAgYmxvY2tJZlJldHVybmVkRnJvbVNlcnZlciA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSByZXR1cm5lZEZyb21TZXJ2ZXIgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm5lZEZyb21TZXJ2ZXIgPSBpblJldHVybmVkRnJvbVNlcnZlcjtcclxuICAgICAgbmV4dE9wZXJJZHggPSBpbk5leHRPcGVySWR4O1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAoOyBleGVjRmxvd0lkeCA8PSB0b0lkeCAmJlxyXG4gICAgICAgICAgICghQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkgJiZcclxuICAgICAgICAgICAhbWdkLklzQWJvcnRpbmcgJiYgIXJvdXRlT3BlcmF0aW9uRXhlY3V0ZWQ7XHJcbiAgICAgICAgICAgZXhlY0Zsb3dJZHggKz0gMSkge1xyXG4gICAgICBpZiAoaW5CbG9ja0lmICYmIGJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXIgJiYgdGhpcy5fb3BlcmF0aW9uVGFiLmdldE9wZXJhdGlvbih0b0lkeCkuZ2V0U2VydmVySWQoKSA8IG5leHRPcGVySWR4KVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgb3BlciA9IHRoaXMuX29wZXJhdGlvblRhYi5nZXRPcGVyYXRpb24oZXhlY0Zsb3dJZHgpO1xyXG5cclxuICAgICAgb3BlclR5cGUgPSBvcGVyLmdldFR5cGUoKTtcclxuXHJcbiAgICAgIGJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXIgPSBmYWxzZTtcclxuXHJcbiAgICAgIC8vIElmIERlbGF5Q29tbWFuZEV4ZWN1dGlvbiA9IHRydWUsIGl0IG1lYW5zIHdlIGFyZSBoZXJlIFRTIG9mIGNsb3NpbmcgdGFzay5cclxuICAgICAgLy8gU28sIHNldCBmaXJzdCBvcGVyYXRpb24gb2YgaGFuZGxlciBhcyBzZXJ2ZXIuIHJldHVybiBiYWNrLlxyXG4gICAgICBpZiAoUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuR2V0SW5zdGFuY2UoKS5EZWxheUNvbW1hbmRFeGVjdXRpb24pIHtcclxuICAgICAgICB0aGlzLl90YXNrLnNldFVzZUxvb3BTdGFjayhkZXB0aCA+IDApO1xyXG4gICAgICAgIGF3YWl0IG9wZXIub3BlclNlcnZlcihudWxsKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gc2tpcCB0byB0aGUgY29ycmVjdCBvcGVyYXRpb24gYWZ0ZXIgcmV0dXJuaW5nIGZyb20gdGhlIHNlcnZlclxyXG4gICAgICBpZiAocmV0dXJuZWRGcm9tU2VydmVyICYmIG9wZXIuZ2V0U2VydmVySWQoKSA8IG5leHRPcGVySWR4KVxyXG4gICAgICAgIGlmIChvcGVyVHlwZSAhPT0gQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9CTE9DSylcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX29wZXJhdGlvblRhYi5nZXRPcGVyYXRpb24ob3Blci5nZXRCbG9ja0VuZCgpKS5nZXRTZXJ2ZXJJZCgpIDwgbmV4dE9wZXJJZHgpXHJcbiAgICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgIGlmICghdGFza0VuZClcclxuICAgICAgICBhd2FpdCB0aGlzLl90YXNrLmV2YWxFbmRDb25kKENvbnN0SW50ZXJmYWNlLkVORF9DT05EX0VWQUxfSU1NSURJQVRFKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl90YXNrTWdkSUQgIT09IG1nZElEKVxyXG4gICAgICAgIGlzQ2hhbmdlZEN1cnJXbmRSZWYudmFsdWUgPSB0cnVlO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLl90YXNrLmlzTWFpblByb2coKSAmJiB0aGlzLl90YXNrLmlzT3BlbldpbigpKVxyXG4gICAgICAgIEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5jdXJyTWdkSUQgPSB0aGlzLl90YXNrTWdkSUQ7XHJcblxyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5DaGVja0FuZFNob3dTcGlubmVyKHRydWUpO1xyXG5cclxuICAgICAgc3dpdGNoIChvcGVyVHlwZSkge1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9WRVJJRlk6XHJcbiAgICAgICAgICAvLyBpZiB0cnVlIHJldHVybmVkIHRoZW4gdGhlIHZlcmlmeSBjb25kaXRpb24gd2FzIHRydWUgYW5kIHRoZSBtb2RlIGlzIEVycm9yXHJcbiAgICAgICAgICBpZiAoYXdhaXQgb3Blci5leGVjdXRlKHJldHVybmVkRnJvbVNlcnZlcikpIHtcclxuICAgICAgICAgICAgaWYgKCEodGhpcy5fdGFzay5nZXRCcmtMZXZlbCgpID09PSBcIlRTXCIpKSB7XHJcbiAgICAgICAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl90YXNrLmdldEluUmVjb3JkU3VmZml4KCkgJiYgdGhpcy5fdGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKVxyXG4gICAgICAgICAgICAgIHRoaXMuX3Rhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfUkVDT1JEKTtcclxuICAgICAgICAgICAgLy8gUUNSICM5OTUxMDggLSB2ZXJpZnkgZXJyb3IgaW4gUlMgc2hvdWxkbid0IHRyaWdnZXIgUlBcclxuICAgICAgICAgICAgLypcclxuICAgICAgICAgICAgICogaWYgd2UgYXJlIGluIHRoZSByZXZlcnQgbW9kZSwgZG9udCBzdG9wIGltbWVkaWF0ZWx5LlxyXG4gICAgICAgICAgICAgKiBleGVjdXRlIHRoZSBvcGVyYXRpb25zIG9mIHRoZSBoYW5kbGVyIGluIHRoZSByZXZlcnNlIG9yZGVyIGFuZCB0aGVuIHN0b3AuXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFJldFZhbHMoZmFsc2UsIHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9MT09QOlxyXG4gICAgICAgICAgLy8gb24gZ2V0dGluZyBhIEJsb2NrTG9vcCwgZXhlY3V0ZSB0aGUgbG9vcCBmb3IgdGhlIG51bWJlciBvZiB0aW1lcyBpbnRlbmRlZCxcclxuICAgICAgICAgIC8vIGFuZCB0aGVuIG1vdmUgdG8gQmxvY2tFbmQuXHJcbiAgICAgICAgICB0aGlzLl90YXNrLmVudGVyTG9vcCgpO1xyXG4gICAgICAgICAgdGhpcy5fdGFzay5pbmNyZWFzZUxvb3BDb3VudGVyKCk7XHJcbiAgICAgICAgICB0aGlzLl90YXNrLnNldFVzZUxvb3BTdGFjayh0cnVlKTtcclxuXHJcbiAgICAgICAgICBhd2FpdCBmbG93TW9uaXRvci5hZGRGbG93RmllbGRPcGVyYXRpb24ob3BlciwgdHJ1ZSwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuXHJcbiAgICAgICAgICBibG9ja0xvb3BFeGVjb25TZXJ2ZXIgPSBmYWxzZTtcclxuICAgICAgICAgIGlmICghb3Blci5nZXRFeGVjT25TZXJ2ZXIoKSkge1xyXG4gICAgICAgICAgICAvLyBleGVjdXRlIHRoZSBsb29wIGZvciB0aGUgbnVtYmVyIG9mIHRpbWVzIGludGVuZGVkXHJcbiAgICAgICAgICAgIHdoaWxlIChhd2FpdCBvcGVyLmV4ZWN1dGUoZmFsc2UpKSB7XHJcbiAgICAgICAgICAgICAgLy8gY2FsbCBleGVjdXRlT3BlcmF0aW9ucygpIHRvIGV4ZWN1dGUgdGhlIG9wZXJhdGlvbnMgd2l0aGluIGEgQmxvY2tMb29wXHJcbiAgICAgICAgICAgICAgcmV0dmFscyA9IGF3YWl0IHRoaXMuZXhlY3V0ZU9wZXJhdGlvbnMoZXhlY0Zsb3dJZHggKyAxLCBvcGVyLmdldEJsb2NrQ2xvc2UoKSAtIDEsIHRhc2tFbmQsIG1nZElELCBkZXB0aCArIDEsXHJcbiAgICAgICAgICAgICAgICBpc0NoYW5nZWRDdXJyV25kUmVmLCBmYWxzZSwgZmFsc2UsIC0xKTtcclxuICAgICAgICAgICAgICBpZiAocmV0dmFscyAhPT0gbnVsbClcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWxzO1xyXG5cclxuICAgICAgICAgICAgICAvLyBpZiB3ZSBnZXQgYSByZXZlcnQgaW5zaWRlIGEgbG9vcCwgYnJlYWsgdGhlIGxvb3BcclxuICAgICAgICAgICAgICBpZiAoKG1nZC5Jc0Fib3J0aW5nIHx8IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpKVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMuX3Rhc2suaW5jcmVhc2VMb29wQ291bnRlcigpO1xyXG4gICAgICAgICAgICAgIHRoaXMuX3Rhc2suc2V0VXNlTG9vcFN0YWNrKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGF3YWl0IG9wZXIuZXhlY3V0ZShmYWxzZSkpXHJcbiAgICAgICAgICAgICAgYmxvY2tMb29wRXhlY29uU2VydmVyID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICghYmxvY2tMb29wRXhlY29uU2VydmVyKVxyXG4gICAgICAgICAgLypcclxuICAgICAgICAgICAqIE9uY2Ugd2UgZmluaXNoIGV4ZWN1dGluZyB0aGUgbG9vcCxcclxuICAgICAgICAgICAqIGlmIHdlIGFyZSBtb3ZpbmcgaW4gdGhlIGZvcndhcmQgZGlyZWN0aW9uLCBtb3ZlIHRvIEJsb2NrRW5kLlxyXG4gICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGV4ZWNGbG93SWR4ID0gb3Blci5nZXRCbG9ja0VuZCgpIC0gMTtcclxuICAgICAgICAgIHRoaXMuX3Rhc2subGVhdmVMb29wKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19PUEVSX0JMT0NLOlxyXG4gICAgICAgICAgLy8gb24gZ2V0dGluZyBhIEJsb2NrIElGLCBleGVjdXRlIHRoZSBleGVjdXRhYmxlIGJsb2NrIChpZiBvciBlbHNlKVxyXG4gICAgICAgICAgLy8gYW5kIHRoZW4gbW92ZSB0byBCbG9ja0VuZC5cclxuICAgICAgICAgIGlmICghb3Blci5nZXRFeGVjT25TZXJ2ZXIoKSB8fCAocmV0dXJuZWRGcm9tU2VydmVyICYmIG9wZXIuZ2V0U2VydmVySWQoKSA8IG5leHRPcGVySWR4KSkge1xyXG4gICAgICAgICAgICB0aGlzLl90YXNrLnNldFVzZUxvb3BTdGFjayh0cnVlKTtcclxuICAgICAgICAgICAgaWYgKCFyZXR1cm5lZEZyb21TZXJ2ZXIgfHwgb3Blci5nZXRTZXJ2ZXJJZCgpID49IG5leHRPcGVySWR4KVxyXG4gICAgICAgICAgICAvLyBnZXQgdGhlIGV4ZWN1dGFibGUgYmxvY2sgYmV0d2VlbiBCbG9jayBJRiBhbmQgQmxvY2sgRU5EXHJcbiAgICAgICAgICAgICAgZXhlY0Zsb3dJZHggPSBhd2FpdCB0aGlzLmdldFNpZ25pZmljYW50QmxvY2soZXhlY0Zsb3dJZHgsIG9wZXIuZ2V0QmxvY2tFbmQoKSk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICBleGVjRmxvd0lkeCA9IHRoaXMuZ2V0U3RhcnRCbG9ja0lmSWR4QnlPcGVyKGV4ZWNGbG93SWR4LCBuZXh0T3BlcklkeCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fdGFzay5zZXRVc2VMb29wU3RhY2soZGVwdGggPiAwKTtcclxuICAgICAgICAgICAgYXdhaXQgb3Blci5vcGVyU2VydmVyKG51bGwpO1xyXG4gICAgICAgICAgICBuZXh0T3BlcklkeCA9IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmdldE5leHRPcGVySWR4KG9wZXIsIHRydWUpO1xyXG4gICAgICAgICAgICBpZiAobmV4dE9wZXJJZHggPiAtMSkge1xyXG4gICAgICAgICAgICAgIHJldHVybmVkRnJvbVNlcnZlciA9IHRydWU7XHJcbiAgICAgICAgICAgICAgaWYgKGluQmxvY2tJZilcclxuICAgICAgICAgICAgICAgIGJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXIgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICBpZiAobmV4dE9wZXJJZHggPCB0aGlzLl9vcGVyYXRpb25UYWIuZ2V0T3BlcmF0aW9uKG9wZXIuZ2V0QmxvY2tFbmQoKSkuZ2V0U2VydmVySWQoKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgc2lnbmlmaWNhbnQgYmxvY2sgaW4gd2hpY2ggdGhlIG5leHQgb3BlcmF0aW9uIGlzXHJcbiAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy5fb3BlcmF0aW9uVGFiLmdldE9wZXJhdGlvbihvcGVyLmdldEJsb2NrQ2xvc2UoKSkuZ2V0U2VydmVySWQoKSA8IG5leHRPcGVySWR4KSB7XHJcbiAgICAgICAgICAgICAgICAgIGV4ZWNGbG93SWR4ID0gb3Blci5nZXRCbG9ja0Nsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICAgIG9wZXIgPSB0aGlzLl9vcGVyYXRpb25UYWIuZ2V0T3BlcmF0aW9uKGV4ZWNGbG93SWR4KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuZWRGcm9tU2VydmVyID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgZXhlY0Zsb3dJZHggPSAtMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGV4ZWNGbG93SWR4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICBleGVjdXRlQmxvY2sgPSB0cnVlO1xyXG4gICAgICAgICAgICBvcGVyID0gdGhpcy5fb3BlcmF0aW9uVGFiLmdldE9wZXJhdGlvbihleGVjRmxvd0lkeCk7XHJcblxyXG4gICAgICAgICAgICBpZiAocmV0dXJuZWRGcm9tU2VydmVyKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX29wZXJhdGlvblRhYi5nZXRPcGVyYXRpb24ob3Blci5nZXRCbG9ja0Nsb3NlKCkpLmdldFNlcnZlcklkKCkgPD0gbmV4dE9wZXJJZHgpIHtcclxuICAgICAgICAgICAgICAgIGV4ZWN1dGVCbG9jayA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYmxvY2tJZlJldHVybmVkRnJvbVNlcnZlciA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZXhlY3V0ZUJsb2NrKSB7XHJcbiAgICAgICAgICAgICAgLy8gY2FsbCBleGVjdXRlT3BlcmF0aW9ucygpIHRvIGV4ZWN1dGUgdGhlIG9wZXJhdGlvbnMgaW4gdGhlIGV4ZWN1dGFibGUgYmxvY2tcclxuICAgICAgICAgICAgICByZXR2YWxzID0gYXdhaXQgdGhpcy5leGVjdXRlT3BlcmF0aW9ucyhleGVjRmxvd0lkeCArIDEsIG9wZXIuZ2V0QmxvY2tDbG9zZSgpIC0gMSwgdGFza0VuZCwgbWdkSUQsIGRlcHRoICsgMSxcclxuICAgICAgICAgICAgICAgIGlzQ2hhbmdlZEN1cnJXbmRSZWYsIHRydWUsIHJldHVybmVkRnJvbVNlcnZlciwgbmV4dE9wZXJJZHgpO1xyXG4gICAgICAgICAgICAgIGlmIChyZXR2YWxzICE9PSBudWxsKVxyXG4gICAgICAgICAgICAgICAgaWYgKCFyZXR2YWxzLlJldHVybmVkRnJvbVNlcnZlcilcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbHM7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuZWRGcm9tU2VydmVyID0gcmV0dmFscy5SZXR1cm5lZEZyb21TZXJ2ZXI7XHJcbiAgICAgICAgICAgICAgICAgIG5leHRPcGVySWR4ID0gcmV0dmFscy5OZXh0T3BlcklkeDtcclxuICAgICAgICAgICAgICAgICAgYmxvY2tJZlJldHVybmVkRnJvbVNlcnZlciA9IHJldHZhbHMuQmxvY2tJZlJldHVybmVkRnJvbVNlcnZlcjtcclxuICAgICAgICAgICAgICAgICAgZXhlY0Zsb3dJZHggPSBvcGVyLmdldEJsb2NrRW5kKCkgLSAxO1xyXG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgKiBPbmNlIHdlIGZpbmlzaCBleGVjdXRpbmcgdGhlIGJsb2NrLFxyXG4gICAgICAgICAgICogaWYgd2UgYXJlIG1vdmluZyBpbiB0aGUgZm9yd2FyZCBkaXJlY3Rpb24sIG1vdmUgdG8gQmxvY2tFbmQuXHJcbiAgICAgICAgICAgKiBvdGhlcndpc2UsIG1vdmUgdG8gQmxvY2sgSUZcclxuICAgICAgICAgICAqL1xyXG4gICAgICAgICAgZXhlY0Zsb3dJZHggPSBvcGVyLmdldEJsb2NrRW5kKCkgLSAxO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9FTkRCTE9DSzpcclxuICAgICAgICAgIGF3YWl0IGZsb3dNb25pdG9yLmFkZEZsb3dGaWVsZE9wZXJhdGlvbihvcGVyLCB0cnVlLCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9DQUxMOlxyXG4gICAgICAgICAgdGhpcy5fdGFzay5zZXRVc2VMb29wU3RhY2soZGVwdGggPiAwKTtcclxuICAgICAgICAgIC8vIGlmIGZhbHNlIGlzIHJldHVybmVkLCBpdCBtZWFucyB0aGF0IGEgcm91dGUgb3BlcmF0aW9uIHdhcyBleGVjdXRlZC5cclxuICAgICAgICAgIHJvdXRlT3BlcmF0aW9uRXhlY3V0ZWQgPSBhd2FpdCBvcGVyLmV4ZWN1dGUocmV0dXJuZWRGcm9tU2VydmVyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgLy8gdGhlIHJlc3Qgb2YgdGhlIG9wZXJhdGlvbnMgKHRob3NlIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgZmxvdylcclxuICAgICAgICAgIHRoaXMuX3Rhc2suc2V0VXNlTG9vcFN0YWNrKGRlcHRoID4gMCk7XHJcbiAgICAgICAgICBhd2FpdCBvcGVyLmV4ZWN1dGUocmV0dXJuZWRGcm9tU2VydmVyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBpZiB0aGUgc2VydmVyIGhhdmUgZXhlY3V0ZWQgYSBibG9jayBvZiBvcGVyYXRpb25zIHRoZW4gZ2V0IHRoZSBuZXh0XHJcbiAgICAgIC8vIG9wZXJhdGlvbiBpbmRleFxyXG4gICAgICBpZiAoIWJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXIpIHtcclxuICAgICAgICBuZXh0T3BlcklkeCA9IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmdldE5leHRPcGVySWR4KG9wZXIsIHRydWUpO1xyXG4gICAgICAgIGlmIChuZXh0T3BlcklkeCA+IC0xKSB7XHJcbiAgICAgICAgICByZXR1cm5lZEZyb21TZXJ2ZXIgPSB0cnVlO1xyXG4gICAgICAgICAgaWYgKGluQmxvY2tJZilcclxuICAgICAgICAgICAgYmxvY2tJZlJldHVybmVkRnJvbVNlcnZlciA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgcmV0dXJuZWRGcm9tU2VydmVyID0gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJvdXRlT3BlcmF0aW9uRXhlY3V0ZWQpXHJcbiAgICAgIHJldHZhbHMgPSBuZXcgUmV0VmFscyhmYWxzZSwgdHJ1ZSk7XHJcbiAgICBlbHNlIGlmIChibG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyKVxyXG4gICAgICByZXR2YWxzID0gbmV3IFJldFZhbHMobmV4dE9wZXJJZHgsIHJldHVybmVkRnJvbVNlcnZlciwgYmxvY2tJZlJldHVybmVkRnJvbVNlcnZlcik7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHZhbHMgPSBudWxsO1xyXG4gICAgcmV0dXJuIHJldHZhbHM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBleGVjdXRhYmxlIEJsb2NrIChJRiBvciBFTFNFKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdGFydEJsb2NrSWR4XCI+dGhlIGluZGV4IG9mIHRoZSBCbG9jayBJRjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJlbmRJZHhcIj50aGUgQmxvY2sgRW5kIEluZGV4IG9mIHRoZSBCbG9jayBJRjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPlRoZSBpbmRleCBvZiB0aGUgYmxvY2sgKElGIG9yIEVMU0Ugb3IgbmV4dCBFTFNFIC4uLil0aGF0IGNhbiBiZSBleGVjdXRlZC5cclxuICAvLy8gICBJZiBubyBibG9ja3MgY2FuIGJlIGV4ZWN1dGVkLCByZXR1cm4gLTFcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0U2lnbmlmaWNhbnRCbG9jayhzdGFydEJsb2NrSWR4OiBudW1iZXIsIGVuZElkeDogbnVtYmVyKTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgIGxldCByZXRJZHg6IG51bWJlciA9IC0xO1xyXG5cclxuICAgIHdoaWxlIChzdGFydEJsb2NrSWR4IDwgZW5kSWR4KSB7XHJcbiAgICAgIGxldCBvcGVyOiBPcGVyYXRpb24gPSB0aGlzLl9vcGVyYXRpb25UYWIuZ2V0T3BlcmF0aW9uKHN0YXJ0QmxvY2tJZHgpO1xyXG4gICAgICBsZXQgb3BlclR5cGU6IG51bWJlciA9IG9wZXIuZ2V0VHlwZSgpO1xyXG5cclxuICAgICAgaWYgKG9wZXJUeXBlICE9PSBDb25zdEludGVyZmFjZS5NR19PUEVSX0JMT0NLICYmIG9wZXJUeXBlICE9PSBDb25zdEludGVyZmFjZS5NR19PUEVSX0VMU0UgJiYgb3BlclR5cGUgIT09IENvbnN0SW50ZXJmYWNlLk1HX09QRVJfU0VSVkVSKVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgaWYgKGF3YWl0IG9wZXIuZXhlY3V0ZShmYWxzZSkpIHtcclxuICAgICAgICByZXRJZHggPSBzdGFydEJsb2NrSWR4O1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBzdGFydEJsb2NrSWR4ID0gb3Blci5nZXRCbG9ja0Nsb3NlKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0SWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgaWR4IG9mIHRoZSBCbG9jayBJRlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJlbmRJZHhcIj4tLS0gdGhlIGluZGV4IG9mIHRoZSBCbG9jayBFbmRcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IC0tLSBUaGUgaW5kZXggb2YgdGhlIGJsb2NrIElGIHdob3NlIEJsb2NrRW5kIElkeCBtYXRjaGVzIHdpdGggdGhlIGVuZElkeFxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXRTdGFydEJsb2NrSWR4QnlFbmQoZW5kSWR4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IHJldElkeDogbnVtYmVyID0gLTE7XHJcbiAgICBsZXQgZm91bmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBqOiBudW1iZXI7XHJcbiAgICBmb3IgKGogPSBlbmRJZHggLSAxOyBqID49IDAgJiYgIWZvdW5kOyBqLS0pIHtcclxuICAgICAgbGV0IG9wZXI6IE9wZXJhdGlvbiA9IHRoaXMuX29wZXJhdGlvblRhYi5nZXRPcGVyYXRpb24oaik7XHJcbiAgICAgIGxldCBvcGVyVHlwZTogbnVtYmVyID0gb3Blci5nZXRUeXBlKCk7XHJcblxyXG4gICAgICBpZiAob3BlclR5cGUgPT09IENvbnN0SW50ZXJmYWNlLk1HX09QRVJfQkxPQ0sgfHwgb3BlclR5cGUgPT09IENvbnN0SW50ZXJmYWNlLk1HX09QRVJfTE9PUCkge1xyXG4gICAgICAgIGlmIChvcGVyLmdldEJsb2NrRW5kKCkgPT09IGVuZElkeCkge1xyXG4gICAgICAgICAgcmV0SWR4ID0gajtcclxuICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXRJZHg7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgaWR4IG9mIHRoZSBCbG9jayBJRlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJlbHNlSWR4XCI+LS0tIHRoZSBpbmRleCBvZiB0aGUgQmxvY2sgRWxzZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gLS0tIFRoZSBpbmRleCBvZiB0aGUgYmxvY2sgSUYgd2hvc2UgQmxvY2tFbmQgSWR4IG1hdGNoZXMgd2l0aCB0aGUgZW5kSWR4XHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldFN0YXJ0QmxvY2tJZHhCeUVsc2UoZWxzZUlkeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCByZXRJZHg6IG51bWJlciA9IC0xO1xyXG4gICAgbGV0IGZvdW5kOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgZWxzZUJsb2NrRW5kOiBudW1iZXIgPSB0aGlzLl9vcGVyYXRpb25UYWIuZ2V0T3BlcmF0aW9uKGVsc2VJZHgpLmdldEJsb2NrRW5kKCk7XHJcbiAgICBsZXQgajogbnVtYmVyO1xyXG4gICAgZm9yIChqID0gZWxzZUlkeCAtIDE7IGogPj0gMCAmJiAhZm91bmQ7IGotLSkge1xyXG4gICAgICBsZXQgb3BlcjogT3BlcmF0aW9uID0gdGhpcy5fb3BlcmF0aW9uVGFiLmdldE9wZXJhdGlvbihqKTtcclxuICAgICAgbGV0IG9wZXJUeXBlOiBudW1iZXIgPSBvcGVyLmdldFR5cGUoKTtcclxuXHJcbiAgICAgIGlmIChvcGVyVHlwZSA9PT0gQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9CTE9DSykge1xyXG4gICAgICAgIGlmIChvcGVyLmdldEJsb2NrRW5kKCkgPT09IGVsc2VCbG9ja0VuZCkge1xyXG4gICAgICAgICAgcmV0SWR4ID0gajtcclxuICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXRJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBpbmRleCBvZiB0aGUgQmxvY2sgSUYgb3IgRWxzZSBhY2NvcmRpbmcgdG8gdGhlIGluZGV4IG9mIG9uZSBvZiB0aGUgb2Ygb3BlcmF0aW9ucyBpbiBpdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJibG9ja09wZXJJZHhcIj4tLS0gaW5kZXggb2YgdGhlIGlmIGJsb2NrIGZvciB3aGljaCB3ZSBoYXZlIHRvIGZpbmQgdGhlIGFwcHJvcHJpYXRlIGJsb2NrIHRvIGV4ZWN1dGVcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInNydnJPcGVySWR4XCI+LS0tIHRoZSBzZXJ2ZXIgaWQgb2YgdGhlIG5leHQgb3BlcmF0aW9uIHdoaWNoIHRoZSBjbGllbnQgc2hvdWxkIGV4ZWN1dGVcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IC0tLSBUaGUgaW5kZXggb2YgdGhlIGJsb2NrIElGIG9yIEVsc2Ugd2hpY2ggaG9sZCB0aGUgb3BlcmF0aW9uIHdoaWNoIG9wZXJJZHggaXMgaXRzIGluZGV4XHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldFN0YXJ0QmxvY2tJZklkeEJ5T3BlcihibG9ja09wZXJJZHg6IG51bWJlciwgc3J2ck9wZXJJZHg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgcmV0SWR4OiBudW1iZXIgPSAtMTtcclxuICAgIGxldCBmb3VuZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGo6IG51bWJlciA9IHRoaXMuX29wZXJhdGlvblRhYi5zZXJ2ZXJJZDJvcGVySWR4KHNydnJPcGVySWR4LCBibG9ja09wZXJJZHgpIC0gMTtcclxuXHJcbiAgICBpZiAoaiA9PT0gLTIpIHtcclxuICAgICAgaiA9IHRoaXMuX29wZXJhdGlvblRhYi5zZXJ2ZXJJZDJGb2xsb3dpbmdPcGVySWR4KHNydnJPcGVySWR4LCBibG9ja09wZXJJZHgpIC0gMTtcclxuICAgIH1cclxuXHJcbiAgICB3aGlsZSAoaiA+PSAwICYmICFmb3VuZCkge1xyXG4gICAgICBsZXQgb3BlcjogT3BlcmF0aW9uID0gdGhpcy5fb3BlcmF0aW9uVGFiLmdldE9wZXJhdGlvbihqKTtcclxuICAgICAgbGV0IG9wZXJUeXBlOiBudW1iZXIgPSBvcGVyLmdldFR5cGUoKTtcclxuICAgICAgaWYgKG9wZXJUeXBlID09PSBDb25zdEludGVyZmFjZS5NR19PUEVSX0JMT0NLKSB7XHJcbiAgICAgICAgaWYgKGogPT09IGJsb2NrT3BlcklkeCkge1xyXG4gICAgICAgICAgcmV0SWR4ID0gajtcclxuICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgai0tO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKG9wZXJUeXBlID09PSBDb25zdEludGVyZmFjZS5NR19PUEVSX0VMU0UpIHtcclxuICAgICAgICBsZXQgYmxvY2tTdHJ0OiBudW1iZXIgPSB0aGlzLmdldFN0YXJ0QmxvY2tJZHhCeUVsc2Uoaik7XHJcbiAgICAgICAgaWYgKGJsb2NrU3RydCA9PT0gYmxvY2tPcGVySWR4KSB7XHJcbiAgICAgICAgICByZXRJZHggPSBqO1xyXG4gICAgICAgICAgZm91bmQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBqID0gYmxvY2tTdHJ0IC0gMTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChvcGVyVHlwZSA9PT0gQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9FTkRCTE9DSylcclxuICAgICAgICBqID0gdGhpcy5nZXRTdGFydEJsb2NrSWR4QnlFbmQoaikgLSAxO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgai0tO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldElkeDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBsZXZlbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0TGV2ZWwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9sZXZlbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIGV2ZW50IG9mIHRoaXMgaGFuZGxlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0RXZlbnQoKTogRXZlbnQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2V2dDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIElkIG9mIHRoZSBldmVudCBoYW5kbGVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRJZCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGUgaGFuZGxlciBpcyBlbmFibGVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBpc0VuYWJsZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fZW5hYmxlZEV4cC5nZXRWYWwoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXNldCB0aGUgdmFsdWVzIG9mIHRoZSBsb2NhbCB2YXJpYWJsZXMgdXNpbmcgdGhlIGFyZ3VtZW50IHZhbHVlcyBvciB0aGUgZGVmYXVsdFxyXG4gIC8vLyAgIHZhbHVlcyBvciB0aGUgaW5pdCBleHByZXNzaW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImFyZ3NcIj50aGUgYXJndW1lbnRzIGxpc3QgPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIHJlc2V0TG9jYWxWYXJpYWJsZXMoYXJnczogQXJndW1lbnRzTGlzdCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGR2OiBEYXRhVmlldyA9IDxEYXRhVmlldz50aGlzLl90YXNrLkRhdGFWaWV3O1xyXG4gICAgbGV0IGFyZ0lkeDogbnVtYmVyID0gMDtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBmb3IgKGxldCBmaWVsZElkeDogbnVtYmVyID0gdGhpcy5fZHZQb3M7IGZpZWxkSWR4IDwgdGhpcy5fZHZQb3MgKyB0aGlzLl9kdkxlbjsgZmllbGRJZHgrKykge1xyXG4gICAgICAgIGxldCBhRmllbGQ6IEZpZWxkQmFzZSA9IDxGaWVsZEJhc2U+ZHYuZ2V0RmllbGQoZmllbGRJZHgpO1xyXG4gICAgICAgIGxldCB2YXJJc1Bhcm06IGJvb2xlYW4gPSAhdGhpcy5faGFzUGFyYW1ldGVycyB8fCBhRmllbGQuaXNQYXJhbSgpO1xyXG5cclxuICAgICAgICAvLyBjaGVjayBpZiB0aGUgZmllbGQgc2hvdWxkIGdldCBpdHMgdmFsdWUgZnJvbSBhbiBhcmd1bWVudFxyXG4gICAgICAgIGlmICgoYXJncyAhPT0gbnVsbCAmJiBhcmdJZHggPCBhcmdzLmdldFNpemUoKSkgJiYgdmFySXNQYXJtKSB7XHJcbiAgICAgICAgICBpZiAoIWFyZ3MuZ2V0QXJnKGFyZ0lkeCkuc2tpcEFyZygpKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGFyZ3MuZ2V0QXJnKGFyZ0lkeCkuc2V0VmFsdWVUb0ZpZWxkKGFGaWVsZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgYUZpZWxkLmludmFsaWRhdGUodHJ1ZSwgRmllbGRCYXNlLkNMRUFSX0ZMQUdTKTtcclxuICAgICAgICAgICAgYXdhaXQgYUZpZWxkLmNvbXB1dGUoZmFsc2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYXJnSWR4Kys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgYUZpZWxkLmludmFsaWRhdGUodHJ1ZSwgRmllbGRCYXNlLkNMRUFSX0ZMQUdTKTtcclxuICAgICAgICAgIGF3YWl0IGFGaWVsZC5jb21wdXRlKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgYUZpZWxkLnVwZGF0ZURpc3BsYXkoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGV4Y2VwdGlvbikge1xyXG4gICAgICB0aHJvdyBleGNlcHRpb247XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSByZXN1bHQgdmFsdWVzIHRvIHRoZSBmaWVsZCBhcmd1bWVudHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYXJnc1wiPnRoZSBhcmd1bWVudHMgbGlzdCA8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0QXJnVmFsc0Zyb21GbGRzKGFyZ3M6IEFyZ3VtZW50c0xpc3QpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBkdjogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGhpcy5fdGFzay5EYXRhVmlldztcclxuICAgIGxldCBrOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGo6IG51bWJlcjtcclxuXHJcbiAgICBmb3IgKGogPSB0aGlzLl9kdlBvczsgaiA8IHRoaXMuX2R2UG9zICsgdGhpcy5fZHZMZW4gJiYgayA8IGFyZ3MuZ2V0U2l6ZSgpOyBqKyspIHtcclxuICAgICAgbGV0IGFGaWVsZDogRmllbGRCYXNlID0gPEZpZWxkQmFzZT5kdi5nZXRGaWVsZChqKTtcclxuICAgICAgaWYgKCF0aGlzLl9oYXNQYXJhbWV0ZXJzIHx8IGFGaWVsZC5pc1BhcmFtKCkpIHtcclxuICAgICAgICBsZXQgYXJnOiBBcmd1bWVudCA9IGFyZ3MuZ2V0QXJnKGspO1xyXG4gICAgICAgIGlmIChhcmcuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5BUkdfVFlQRV9GSUVMRCkge1xyXG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSB0aGUgUGFyYW1cclxuICAgICAgICAgIGxldCBhcmdGbGQ6IEZpZWxkQmFzZSA9IDxGaWVsZEJhc2U+YXJnLmdldEZpZWxkKCk7XHJcblxyXG4gICAgICAgICAgLy8gQSBoYW5kbGVyIGNhbiBiZSBjYWxsZWQgZWl0aGVyIGZyb20gdGhlIHNhbWUgdGFzayAob2YgdGhlIGhhbmRsZXIpIG9yIGZyb20gYVxyXG4gICAgICAgICAgLy8gdGFzayBsb3dlciBkb3duIGluIHRoZSBoaWVyYXJjaHkuXHJcbiAgICAgICAgICAvLyBIZXJlIHdlIGFyZSBjb3B5aW5nIHZhbHVlIGZyb20gdGhlIGhhbmRsZXIgdGFzayB0byB0aGUgaW52b2tlciB0YXNrLlxyXG4gICAgICAgICAgLy8gQ29weWluZyBzaG91bGQgbm90IGJlIGRvbmUgaWYgYW55IG9uZSBvZiB0aGUgdGFzayBpcyBhYm9ydGluZy5cclxuICAgICAgICAgIC8vIEJ1dCBjaGVja2luZyBvbmx5IHRoZSBpbnZva2VyIHRhc2sncyBpc0Fib3J0aW5nIGlzIHN1ZmZpY2llbnQgaGVyZSBiZWNhdXNlLFxyXG4gICAgICAgICAgLy8gaXQgd2lsbCBiZSB0cnVlIGV2ZW4gaWYgdGhlIGhhbmRsZXIgdGFzayBpcyBhYm9ydGluZy5cclxuICAgICAgICAgIGlmIChhcmdGbGQuZ2V0VGFzaygpICE9PSBudWxsICYmICEoPFRhc2s+YXJnRmxkLmdldFRhc2soKSkuaXNBYm9ydGluZygpKSB7XHJcbiAgICAgICAgICAgIGxldCB2YWw6IHN0cmluZyA9IGFGaWVsZC5nZXRWYWx1ZShmYWxzZSk7XHJcbiAgICAgICAgICAgIGF3YWl0IGFyZ0ZsZC5zZXRWYWx1ZUFuZFN0YXJ0UmVjb21wdXRlKHZhbCwgYUZpZWxkLmlzTnVsbCgpLCB0cnVlLCBhRmllbGQuaXNNb2RpZmllZCgpLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIGF3YWl0IGFyZ0ZsZC51cGRhdGVEaXNwbGF5KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGsrKztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGhhbmRsZXIncyB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRUYXNrKCk6IFRhc2sge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Rhc2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgZXhwZWN0ZWQgYnkgdGhlIGhhbmRsZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFyZ3NNYXRjaChFeHBfcGFyYW1zOiBFeHBWYWxbXSk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGFyZ3NNYXRjaGVkOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIGxldCBkdjogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGhpcy5fdGFzay5EYXRhVmlldztcclxuICAgIGxldCBqOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IHBhcmFtQ291bnQ6IG51bWJlciA9IDA7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gdGhpcy5fZHZQb3M7IGkgPCB0aGlzLl9kdlBvcyArIHRoaXMuX2R2TGVuOyBpKyspIHtcclxuICAgICAgbGV0IGZpZWxkOiBGaWVsZEJhc2UgPSA8RmllbGRCYXNlPmR2LmdldEZpZWxkKGkpO1xyXG4gICAgICBpZiAoZmllbGQuaXNQYXJhbSgpKSB7XHJcbiAgICAgICAgcGFyYW1Db3VudCsrO1xyXG4gICAgICAgIGlmIChqIDwgRXhwX3BhcmFtcy5sZW5ndGgpIHtcclxuICAgICAgICAgIGxldCBmaWVsZEF0dHI6IFN0b3JhZ2VBdHRyaWJ1dGUgPSBmaWVsZC5nZXRUeXBlKCk7XHJcbiAgICAgICAgICBsZXQgYXJnQXR0cjogU3RvcmFnZUF0dHJpYnV0ZSA9IEV4cF9wYXJhbXNbal0uQXR0cjtcclxuXHJcblxyXG4gICAgICAgICAgLy8gYXJndW1lbnQgYW5kIHBhcmFtZXRlciB3aWxsIG5vdCBtYXRjaCBpZiA6XHJcbiAgICAgICAgICAvLyAxLiBUaGV5IGFyZSBub3Qgb2YgdGhlIHNhbWUgdHlwZVxyXG4gICAgICAgICAgLy8gMi4gVGhleSBDYW5ub3QgYmUgY2FzdCAoYWxwaGEgY2FuIGJlIGNhc3QgdG8gdW5pY29kZSlcclxuICAgICAgICAgIC8vIDMuIEFsbCB0aG9zZSBhcHBseSBpZiB0aGUgcGFyYW1ldGVyIGlzIG5vdCBudWxsLiBpZiB0aGUgcGFyYW0gdmFsIGlzIG51bGwgaXQgY2FuIGdvIGludG8gYW55IHR5cGUgb2YgcGFyYW1ldGVyLlxyXG4gICAgICAgICAgaWYgKCFFeHBfcGFyYW1zW2pdLklzTnVsbCAmJiAhU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLmlzVGhlU2FtZVR5cGUoZmllbGRBdHRyLCBhcmdBdHRyKSAmJiAhU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLlN0b3JhZ2VGbGRBbHBoYVVuaWNvZGVPckJsb2IoZmllbGRBdHRyLCBhcmdBdHRyKSkge1xyXG4gICAgICAgICAgICBhcmdzTWF0Y2hlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGorKztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAocGFyYW1Db3VudCAhPT0gRXhwX3BhcmFtcy5sZW5ndGgpIHtcclxuICAgICAgYXJnc01hdGNoZWQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiBhcmdzTWF0Y2hlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBPcGVyYXRpb25UYWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0T3BlcmF0aW9uVGFiKCk6IE9wZXJhdGlvblRhYmxlIHtcclxuICAgIHJldHVybiB0aGlzLl9vcGVyYXRpb25UYWI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEluIGNhc2Ugb2YgQ29udHJvbCBoZWFkZXJzLCByZXR1cm4gY29udHJvbCBuYW1lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRDb250cm9sTmFtZUZvckNvbnRyb2xIZWFkZXIoKTogc3RyaW5nIHtcclxuICAgIGlmKHRoaXMuZ2V0RXZlbnQoKS5nZXRUeXBlKCkgPT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCkge1xyXG5cclxuICAgICAgLy8gUmV0dXJuIHRoZSBjb250cm9sIG5hbWUgZm9yIENvbnRyb2wgSGVhZGVyc1xyXG4gICAgICBpZiAodGhpcy5nZXRFdmVudCgpLmlzQ29udHJvbEhlYWRlcigpICYmICFpc051bGxPclVuZGVmaW5lZCh0aGlzLl9jdHJsKSlcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRDdHJsTmFtZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIE5TdHJpbmcuRW1wdHk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEluIGNhc2Ugb2YgVmFyaWFibGUgaGVhZGVycywgcmV0dXJuIGZpZWxkIG5hbWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFZhck5hbWVGb3JWYXJpYWJsZUhlYWRlcigpOiBzdHJpbmcge1xyXG4gICAgLy8gUmV0dXJuIHRoZSBGaWVsZCBuYW1lIGZvciBWYXJpYWJsZSBIZWFkZXJzXHJcbiAgIGlmICh0aGlzLmdldEV2ZW50KCkuaXNWYXJpYWJsZUhlYWRlcigpICYmICFpc051bGxPclVuZGVmaW5lZCh0aGlzLl9oYW5kbGVyRmxkKSlcclxuICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZXJGbGQuZ2V0VmFyTmFtZSgpLnRvVXBwZXJDYXNlKCk7XHJcblxyXG4gICByZXR1cm4gTlN0cmluZy5FbXB0eTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmV0dXJuIHRoZSBldmVudCBoYW5kbGVyIGluZm9ybWF0aW9uIHRvIGJlIGRpc3BsYXllZCBpbiBjYXNlIG9mICdSZXF1ZXN0SW5mbycgbG9nIGxldmVsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRFdmVudEhhbmRsZXJJbmZvKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgZXZlbnREZXNjcmlwdGlvbjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcblxyXG4gICAgdGhpcy5nZXRFdmVudCgpLkFwcGVuZERlc2NyaXB0aW9uKGV2ZW50RGVzY3JpcHRpb24pO1xyXG5cclxuICAgIC8vIEFwcGVuZCBjb250cm9sL3ZhcmlhYmxlIG5hbWUgaW4gQ29udHJvbC9WYXJpYWJsZSBoZWFkZXJzXHJcbiAgICBsZXQgaGVhZGVyQWRkaXRpb25hbEluZm86IHN0cmluZyA9IHRoaXMuZ2V0Q29udHJvbE5hbWVGb3JDb250cm9sSGVhZGVyKCkgKyB0aGlzLmdldFZhck5hbWVGb3JWYXJpYWJsZUhlYWRlcigpO1xyXG5cclxuICAgIGV2ZW50RGVzY3JpcHRpb24uQXBwZW5kKGhlYWRlckFkZGl0aW9uYWxJbmZvKTtcclxuXHJcbiAgICAvLyBGb3Igc29tZSBoZWFkZXJzIGxpa2UgUlAvVFAsIHRoZSBldmVudCBkZXNjcmlwdGlvbiBpcyBlbXB0eS5cclxuICAgIC8vIEZvciBvdGhlcnMgZW1wdHkgc3BhY2Ugc2hvdWxkIGJlIGFkZGVkIGJldHdlZW4gZXZlbnQgdHlwZSBhbmQgZGVzY3JpcHRpb24uXHJcbiAgICAvLyBUaGlzIGlzIGRvbmUgdG8gYXZvaWQgdW5uZWNlc3NhcnkgYmxhbmsgc3BhY2UgYXQgdGhlIGVuZCBvZiB0aGUgZXZlbnQgaGFuZGxlciB0eXBlXHJcbiAgICBpZighTlN0cmluZy5Jc051bGxPckVtcHR5KGV2ZW50RGVzY3JpcHRpb24udG9TdHJpbmcoKSkpXHJcbiAgICAgIGV2ZW50RGVzY3JpcHRpb24gPSBuZXcgU3RyaW5nQnVpbGRlcignICcgKyBldmVudERlc2NyaXB0aW9uLnRvU3RyaW5nKCksIGV2ZW50RGVzY3JpcHRpb24udG9TdHJpbmcoKS5sZW5ndGggKyAxKTtcclxuXHJcbiAgICByZXR1cm4gTlN0cmluZy5Gb3JtYXQoXCJIYW5kbGVyIHswfXsxfVwiLCB0aGlzLmdldEV2ZW50KCkuZ2V0RXZlbnRUeXBlKCksIGV2ZW50RGVzY3JpcHRpb24pO1xyXG4gIH1cclxuXHJcblxyXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gTlN0cmluZy5Gb3JtYXQoXCIoSGFuZGxlciBmb3IgezB9IG9uIHRhc2sgezF9LCBzY29wZSB7Mn0pXCIsIHRoaXMuX2V2dCwgdGhpcy5fdGFzaywgdGhpcy5fc2NvcGUpO1xyXG4gIH1cclxufVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICB1c2VkIHRvIHJldHVybiB0aGUgcmVzdWx0cyBvZiB0aGUgZXhlY3V0ZSgpIG1ldGhvZFxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgY2xhc3MgUmV0VmFscyAge1xyXG4gIEJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBFbmFibGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgTmV4dE9wZXJJZHg6IG51bWJlciA9IDA7XHJcbiAgUHJvcGFnYXRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgUmV0dXJuZWRGcm9tU2VydmVyOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHA6IGJvb2xlYW4sIGU6IGJvb2xlYW4pO1xyXG4gIGNvbnN0cnVjdG9yKG9wZXJJZHg6IG51bWJlciwgaW5SZXR1cm5lZEZyb21TZXJ2ZXI6IGJvb2xlYW4sIGluQmxvY2tJZlJldHVybmVkRnJvbVNlcnZlcjogYm9vbGVhbik7XHJcbiAgY29uc3RydWN0b3IocE9yT3BlcklkeDogYW55LCBlT3JJblJldHVybmVkRnJvbVNlcnZlcjogYm9vbGVhbiwgaW5CbG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyPzogYm9vbGVhbikge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpXHJcbiAgICAgIHRoaXMuY29uc3RydWN0b3JfMChwT3JPcGVySWR4LCBlT3JJblJldHVybmVkRnJvbVNlcnZlcik7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuY29uc3RydWN0b3JfMShwT3JPcGVySWR4LCBlT3JJblJldHVybmVkRnJvbVNlcnZlciwgaW5CbG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBcIj5wcm9wYWdhdGUgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImVcIj5lbmFibGVkIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8wKHA6IGJvb2xlYW4sIGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuUHJvcGFnYXRlID0gcDtcclxuICAgIHRoaXMuRW5hYmxlZCA9IGU7XHJcbiAgICB0aGlzLk5leHRPcGVySWR4ID0gMDtcclxuICAgIHRoaXMuUmV0dXJuZWRGcm9tU2VydmVyID0gZmFsc2U7XHJcbiAgICB0aGlzLkJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXIgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm9wZXJJZHhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImluUmV0dXJuZWRGcm9tU2VydmVyXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpbkJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXJcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMShvcGVySWR4OiBudW1iZXIsIGluUmV0dXJuZWRGcm9tU2VydmVyOiBib29sZWFuLCBpbkJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXI6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuUHJvcGFnYXRlID0gZmFsc2U7XHJcbiAgICB0aGlzLkVuYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5OZXh0T3BlcklkeCA9IG9wZXJJZHg7XHJcbiAgICB0aGlzLlJldHVybmVkRnJvbVNlcnZlciA9IGluUmV0dXJuZWRGcm9tU2VydmVyO1xyXG4gICAgdGhpcy5CbG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyID0gaW5CbG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyO1xyXG4gIH1cclxufVxyXG5cclxuIl19
|
|
764
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXZlbnRIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZW5naW5lL3NyYy9ldmVudC9FdmVudEhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLG9CQUFvQixFQUFFLFNBQVMsRUFBUSxPQUFPLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2hJLE9BQU8sRUFDTCxRQUFRLEVBQ1IsU0FBUyxFQUNULGlCQUFpQixFQUNqQixNQUFNLEVBQ04sZ0JBQWdCLEVBRWhCLHFCQUFxQixFQUNyQixZQUFZLEVBQ1osU0FBUyxFQUNWLE1BQU0sa0JBQWtCLENBQUM7QUFFMUIsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDNUMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBS3BELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBRTFELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUdsRCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFHekMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFakQsTUFB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QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsb0JBQW9CLENBQUM7UUFDL0MsSUFBSSxDQUFDLHlCQUF5QixHQUFHLDJCQUEyQixDQUFDO0lBQy9ELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QXBwbGljYXRpb25FeGNlcHRpb24sIEV4Y2VwdGlvbiwgTGlzdCwgTlN0cmluZywgUmVmUGFyYW0sIFN0cmluZ0J1aWxkZXIsIGlzTnVsbE9yVW5kZWZpbmVkfSBmcm9tIFwiQG1hZ2ljLXhwYS9tc2NvcmVsaWJcIjtcclxuaW1wb3J0IHtcclxuICBCcmtTY29wZSxcclxuICBDb25zdGFudHMsXHJcbiAgSW50ZXJuYWxJbnRlcmZhY2UsXHJcbiAgTG9nZ2VyLFxyXG4gIExvZ2dlcl9Mb2dMZXZlbHMsXHJcbiAgU3RvcmFnZUF0dHJpYnV0ZSxcclxuICBTdG9yYWdlQXR0cmlidXRlQ2hlY2ssXHJcbiAgWE1MQ29uc3RhbnRzLFxyXG4gIFhtbFBhcnNlclxyXG59IGZyb20gXCJAbWFnaWMteHBhL3V0aWxzXCI7XHJcbmltcG9ydCB7RXhwVmFsfSBmcm9tIFwiQG1hZ2ljLXhwYS9ndWlcIjtcclxuaW1wb3J0IHtFdmVudH0gZnJvbSBcIi4vRXZlbnRcIjtcclxuaW1wb3J0IHtGaWVsZEJhc2V9IGZyb20gXCIuLi9kYXRhL0ZpZWxkQmFzZVwiO1xyXG5pbXBvcnQge09wZXJhdGlvblRhYmxlfSBmcm9tIFwiLi4vcnQvT3BlcmF0aW9uVGFibGVcIjtcclxuaW1wb3J0IHtBcmd1bWVudH0gZnJvbSBcIi4uL3J0L0FyZ3VtZW50XCI7XHJcbmltcG9ydCB7QXJndW1lbnRzTGlzdH0gZnJvbSBcIi4uL3J0L0FyZ3VtZW50c0xpc3RcIjtcclxuaW1wb3J0IHtNZ0NvbnRyb2x9IGZyb20gXCIuLi9ndWkvTWdDb250cm9sXCI7XHJcbmltcG9ydCB7T3BlcmF0aW9ufSBmcm9tIFwiLi4vcnQvT3BlcmF0aW9uXCI7XHJcbmltcG9ydCB7Rmxvd01vbml0b3JRdWV1ZX0gZnJvbSBcIi4uL3V0aWwvRmxvd01vbml0b3JRdWV1ZVwiO1xyXG5pbXBvcnQge01HRGF0YX0gZnJvbSBcIi4uL3Rhc2tzL01HRGF0YVwiO1xyXG5pbXBvcnQge1NlcnZlckVycm9yfSBmcm9tIFwiLi4vcmVtb3RlL1NlcnZlckVycm9yXCI7XHJcbmltcG9ydCB7UnVuVGltZUV2ZW50fSBmcm9tIFwiLi9SdW5UaW1lRXZlbnRcIjtcclxuaW1wb3J0IHtNZ0Zvcm19IGZyb20gXCIuLi9ndWkvTWdGb3JtXCI7XHJcbmltcG9ydCB7WWVzTm9FeHB9IGZyb20gXCIuLi9leHAvWWVzTm9FeHBcIjtcclxuaW1wb3J0IHtUYXNrfSBmcm9tIFwiLi4vdGFza3MvVGFza1wiO1xyXG5pbXBvcnQge0RhdGFWaWV3fSBmcm9tIFwiLi4vZGF0YS9EYXRhVmlld1wiO1xyXG5pbXBvcnQge0NvbnN0SW50ZXJmYWNlfSBmcm9tIFwiLi4vQ29uc3RJbnRlcmZhY2VcIjtcclxuaW1wb3J0IHtGbG93TW9uaXRvckludGVyZmFjZX0gZnJvbSBcIi4uL0Zsb3dNb25pdG9ySW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7IExhc3RGb2N1c2VkTWFuYWdlciB9IGZyb20gXCIuLi9ydC9MYXN0Rm9jdXNlZE1hbmFnZXJcIjtcclxuaW1wb3J0IHsgQWNjZXNzSGVscGVyIH0gZnJvbSBcIi4uL0FjY2Vzc0hlbHBlclwiO1xyXG5pbXBvcnQge1JlbW90ZUNvbW1hbmRzUHJvY2Vzc29yfSBmcm9tIFwiLi4vcmVtb3RlL1JlbW90ZUNvbW1hbmRzUHJvY2Vzc29yXCI7XHJcbmltcG9ydCB7IEVudmlyb25tZW50IH0gZnJvbSBcIi4uL2Vudi9FbnZpcm9ubWVudFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEV2ZW50SGFuZGxlciB7XHJcbiAgcHJpdmF0ZSBfZW5hYmxlZEV4cDogWWVzTm9FeHAgPSBuZXcgWWVzTm9FeHAodHJ1ZSk7IC8vIGRlZmF1bHQgaXMgdHJ1ZSBhbHdheXNcclxuICBwcml2YXRlIF9vcGVyYXRpb25UYWI6IE9wZXJhdGlvblRhYmxlID0gbnVsbDtcclxuICBwcml2YXRlIF9wcm9wYWdhdGVFeHA6IFllc05vRXhwID0gbmV3IFllc05vRXhwKHRydWUpO1xyXG4gIHByaXZhdGUgX2lzSGFuZGxlck9uRm9ybTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2N0cmw6IE1nQ29udHJvbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfY3RybE5hbWU6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfZHZMZW46IG51bWJlciA9IDA7IC8vIFRoZSDigJxkdnBvc8KBRWNvbnRhaW5zIHRoZSBudW1iZXIgb2YgZmllbGRzIHNlbGVjdGVkIGluIHRoZSBoYW5kbGVyXHJcbiAgcHJpdmF0ZSBfZHZQb3M6IG51bWJlciA9IDA7IC8vIGFuZCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGZpZWxkIG9mIGl0IGluIHRoZSBEYXRhdmlldy5cclxuICBwcml2YXRlIF9ldnQ6IEV2ZW50ID0gbnVsbDtcclxuICBwcml2YXRlIF9oYW5kbGVkQnlDbGllbnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9oYW5kbGVyRmxkOiBGaWVsZEJhc2UgPSBudWxsO1xyXG4gIHByaXZhdGUgX2hhc1BhcmFtZXRlcnM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9pZDogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIF9sZXZlbDogc3RyaW5nID0gJ1xcMCc7IC8vIENvbnRyb2wgfCBIYW5kbGVyIHwgUmVjb3JkIHwgVGFzayB8IFZhcmlhYmxlXHJcbiAgcHJpdmF0ZSBfc2NvcGU6IEJya1Njb3BlID0gbnVsbDsgLy8gVGFza3xTdWJ0YXNrfEdsb2JhbFxyXG4gIHByaXZhdGUgX3Rhc2s6IFRhc2sgPSBudWxsO1xyXG4gIHByaXZhdGUgX3Rhc2tNZ2RJRDogbnVtYmVyID0gLTE7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDVE9SXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMuX29wZXJhdGlvblRhYiA9IG5ldyBPcGVyYXRpb25UYWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q3RybE5hbWUoKSA6IHN0cmluZ3tcclxuICAgIHJldHVybiB0aGlzLl9jdHJsTmFtZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwYXJzZSB0aGUgZXZlbnQgaGFuZGxlciBhbmQgaXRzIHN1Yi1zdHJ1Y3R1cmVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBmaWxsRGF0YSh0YXNrUmVmOiBUYXNrLCBwYXJzZXI6IFhtbFBhcnNlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3Rhc2sgPT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fdGFzayA9IHRhc2tSZWY7XHJcbiAgICAgIHRoaXMuX3Rhc2tNZ2RJRCA9IHRoaXMuX3Rhc2suZ2V0TWdkSUQoKTtcclxuICAgIH1cclxuXHJcbiAgICB3aGlsZSAodGhpcy5pbml0SW5uZXJPYmplY3RzKHBhcnNlciwgcGFyc2VyLmdldE5leHRUYWcoKSkpIHtcclxuICAgIH1cclxuICAgIGxldCBkYXRhVmlldzogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGhpcy5fdGFzay5EYXRhVmlldztcclxuICAgIHRoaXMuX2hhc1BhcmFtZXRlcnMgPSBkYXRhVmlldy5QYXJhbWV0ZXJzRXhpc3QodGhpcy5fZHZQb3MsIHRoaXMuX2R2TGVuKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpbml0aWFsaXppbmcgb2YgaW5uZXIgb2JqZWN0c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBpbml0SW5uZXJPYmplY3RzKHBhcnNlcjogWG1sUGFyc2VyLCBmb3VuZFRhZ05hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG5cclxuICAgIGlmIChmb3VuZFRhZ05hbWUgPT09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09PSBDb25zdEludGVyZmFjZS5NR19UQUdfSEFORExFUilcclxuICAgICAgdGhpcy5pbml0SW5uZXJFbGVtZW50cyhwYXJzZXIsIHRoaXMuX3Rhc2spO1xyXG5cclxuICAgIGVsc2UgaWYgKGZvdW5kVGFnTmFtZSA9PT0gQ29uc3RJbnRlcmZhY2UuTUdfVEFHX09QRVIpXHJcbiAgICAgIHRoaXMuX29wZXJhdGlvblRhYi5maWxsRGF0YSh0aGlzLl90YXNrLCB0aGlzLCBwYXJzZXIpO1xyXG5cclxuICAgIGVsc2UgaWYgKGZvdW5kVGFnTmFtZSA9PT0gQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0VWRU5UICYmIHRoaXMuX2V2dCA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9ldnQgPSBuZXcgRXZlbnQoKTtcclxuICAgICAgdGhpcy5fZXZ0LmZpbGxEYXRhKHBhcnNlciwgdGhpcy5fdGFzayk7XHJcbiAgICAgIGlmICh0aGlzLl9ldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1RJTUVSIHx8XHJcbiAgICAgICAgKHRoaXMuX2V2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVVNFUiAmJiB0aGlzLl9ldnQuZ2V0VXNlckV2ZW50VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1RJTUVSKSlcclxuICAgICAgICB0aGlzLl90YXNrLmdldE1HRGF0YSgpLmFkZFRpbWVySGFuZGxlcih0aGlzKTtcclxuXHJcbiAgICAgIC8vIGZvciBlbmFibGUgTUdfQUNUX1pPT00gYWN0aW9uXHJcbiAgICAgIC8vIDEuIGhhbmRsZXIgb24gem9vbSBhY3Rpb24uXHJcbiAgICAgIC8vIDIuIGhhbmRsZXIgb24gYSB1c2VyIGRlZmluZWQgaGFuZGxlciB3aXRoIGEgdHJpZ2dlciBvZiB6b29tIGFjdGlvbi5cclxuICAgICAgaWYgKCgodGhpcy5fZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCAmJiB0aGlzLl9ldnQuZ2V0SW50ZXJuYWxDb2RlKCkgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9aT09NKSB8fCAodGhpcy5fZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9VU0VSICYmIHRoaXMuX2V2dC5nZXRVc2VyRXZlbnQoKSAhPT0gbnVsbCAmJiB0aGlzLl9ldnQuZ2V0VXNlckV2ZW50VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMICYmIHRoaXMuX2V2dC5nZXRVc2VyRXZlbnQoKS5nZXRJbnRlcm5hbENvZGUoKSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT00pKSAmJiAhdGhpcy5fdGFzay5nZXRFbmFibGVab29tSGFuZGxlcigpKSB7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9oYW5kbGVyRmxkICE9PSBudWxsKVxyXG4gICAgICAgICAgdGhpcy5faGFuZGxlckZsZC5zZXRIYXNab29tSGFuZGxlcigpO1xyXG5cclxuICAgICAgICBlbHNlIGlmICh0aGlzLl9jdHJsICE9PSBudWxsKVxyXG4gICAgICAgICAgdGhpcy5fY3RybC5IYXNab29tSGFuZGxlciA9IHRydWU7XHJcblxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRoaXMuX3Rhc2suc2V0RW5hYmxlWm9vbUhhbmRsZXIoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoZm91bmRUYWdOYW1lID09PSAnLycgKyBDb25zdEludGVyZmFjZS5NR19UQUdfSEFORExFUikge1xyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4MkVuZE9mVGFnKCk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwidGhlcmUgaXMgbm8gc3VjaCB0YWcgaW4gRXZlbnRIYW5kbGVyLmluaXRJbm5lck9iamVjdHMoKSBcIiArIGZvdW5kVGFnTmFtZSk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEluaXRpYWxpemluZyBvZiBpbm5lciBhdHRyaWJ1dGVzIG9mIDxoYW5kbGVyPiB0YWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1JlZlwiPjwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBpbml0SW5uZXJFbGVtZW50cyhwYXJzZXI6IFhtbFBhcnNlciwgdGFza1JlZjogVGFzayk6IHZvaWQge1xyXG4gICAgbGV0IGVuZENvbnRleHQ6IG51bWJlciA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZiggWE1MQ29uc3RhbnRzLlRBR19DTE9TRSwgcGFyc2VyLmdldEN1cnJJbmRleCgpKTtcclxuICAgIGlmIChlbmRDb250ZXh0ICE9PSAtMSAmJiBlbmRDb250ZXh0IDwgcGFyc2VyLmdldFhNTGRhdGEoKS5sZW5ndGgpIHtcclxuICAgICAgLy8gbGFzdCBwb3NpdGlvbiBvZiBpdHMgdGFnXHJcbiAgICAgIGxldCB0YWc6IHN0cmluZyA9IHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCk7XHJcbiAgICAgIHBhcnNlci5hZGQyQ3VyckluZGV4KHRhZy5pbmRleE9mKCBDb25zdEludGVyZmFjZS5NR19UQUdfSEFORExFUikgKyBDb25zdEludGVyZmFjZS5NR19UQUdfSEFORExFUi5sZW5ndGgpO1xyXG5cclxuICAgICAgbGV0IHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+ID0gWG1sUGFyc2VyLmdldFRva2VucyhwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpLCBYTUxDb25zdGFudHMuWE1MX0FUVFJfREVMSU0pO1xyXG4gICAgICB0aGlzLmluaXRFbGVtZW50cyh0b2tlbnNWZWN0b3IsIHRhc2tSZWYpO1xyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KCsrZW5kQ29udGV4dCk7IC8vIHRvIGRlbGV0ZSBcIj5cIiB0b29cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwiaW4gSGFuZGxlci5GaWxsRGF0YSgpIG91dCBvZiBzdHJpbmcgYm91bmRzXCIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIE1ha2UgaW5pdGlhbGl6YXRpb24gb2YgcHJpdmF0ZSBlbGVtZW50cyBieSBmb3VuZCB0b2tlbnNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidG9rZW5zVmVjdG9yXCI+Zm91bmQgdG9rZW5zLCB3aGljaCBjb25zaXN0IGF0dHJpYnV0ZS92YWx1ZSBvZiBldmVyeSBmb3VuZFx0ZWxlbWVudCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidGFza1JlZlwiPiA8L3BhcmFtPlxyXG4gIHByaXZhdGUgaW5pdEVsZW1lbnRzKHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+LCB0YXNrUmVmOiBUYXNrKTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgdG9rZW5zVmVjdG9yLmxlbmd0aDsgaiArPSAyKSB7XHJcbiAgICAgIGxldCBhdHRyaWJ1dGU6IHN0cmluZyA9ICh0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaikpO1xyXG4gICAgICBsZXQgdmFsdWVTdHI6IHN0cmluZyA9ICh0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaiArIDEpKTtcclxuXHJcbiAgICAgIHN3aXRjaCAoYXR0cmlidXRlKSB7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0hBTkRMRURCWTpcclxuICAgICAgICAgIHRoaXMuX2hhbmRsZWRCeUNsaWVudCA9ICh2YWx1ZVN0ci50b1VwcGVyQ2FzZSgpID09PSBcIkNcIi50b1VwcGVyQ2FzZSgpKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX0lEOlxyXG4gICAgICAgICAgdGhpcy5faWQgPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfTEVWRUw6XHJcbiAgICAgICAgICB0aGlzLl9sZXZlbCA9IHZhbHVlU3RyWzBdO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9PQkpFQ1Q6XHJcbiAgICAgICAgICBsZXQgdmFsdWVTdHJpbmdDdHJsTmFtZTogc3RyaW5nID0gWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyKTtcclxuICAgICAgICAgIHRoaXMuX2N0cmxOYW1lID0gWG1sUGFyc2VyLnVuZXNjYXBlKHZhbHVlU3RyaW5nQ3RybE5hbWUpLnRvVXBwZXJDYXNlKCk7IC8vIHJlbGV2YW50IGZvciB1c2VyIGhhbmRsZXJzIG9ubHlcclxuICAgICAgICAgIHRoaXMuY2FsY3VsYXRlQ3RybEZyb21Db250cm9sTmFtZSh0YXNrUmVmKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVkFSSUFCTEU6XHJcbiAgICAgICAgICB0aGlzLl9oYW5kbGVyRmxkID0gPEZpZWxkQmFzZT50aGlzLl90YXNrLkRhdGFWaWV3LmdldEZpZWxkKFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpKTtcclxuICAgICAgICAgIHRoaXMuX2hhbmRsZXJGbGQuc2V0SGFzQ2hhbmdlRXZlbnQoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfU0NPUEU6XHJcbiAgICAgICAgICB0aGlzLl9zY29wZSA9IDxCcmtTY29wZT52YWx1ZVN0clswXTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfUFJPUEFHQVRFOlxyXG4gICAgICAgICAgdGhpcy5fcHJvcGFnYXRlRXhwLnNldFZhbCh0YXNrUmVmLCB2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0VOQUJMRUQ6XHJcbiAgICAgICAgICB0aGlzLl9lbmFibGVkRXhwLnNldFZhbCh0YXNrUmVmLCB2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0RWUE9TOlxyXG4gICAgICAgICAgbGV0IGk6IG51bWJlciA9IHZhbHVlU3RyLmluZGV4T2YoXCIsXCIpO1xyXG4gICAgICAgICAgaWYgKGkgPiAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLl9kdkxlbiA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIuc3Vic3RyKDAsIGkpKTtcclxuICAgICAgICAgICAgdGhpcy5fZHZQb3MgPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyLnN1YnN0cihpICsgMSkpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBmbGRJZHg6IG51bWJlciA9IHRoaXMuX2R2UG9zOyBmbGRJZHggPCB0aGlzLl9kdlBvcyArIHRoaXMuX2R2TGVuOyBmbGRJZHgrKykge1xyXG4gICAgICAgICAgICAgIGxldCBmaWVsZDogRmllbGRCYXNlID0gKDxGaWVsZEJhc2U+dGhpcy5fdGFzay5EYXRhVmlldy5nZXRGaWVsZChmbGRJZHgpKTtcclxuICAgICAgICAgICAgICBmaWVsZC5Jc0V2ZW50SGFuZGxlckZpZWxkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9IQU5ETEVSX09ORk9STTpcclxuICAgICAgICAgIHRoaXMuX2lzSGFuZGxlck9uRm9ybSA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwiVGhlcmUgaXMgbm8gc3VjaCB0YWcgaW4gRXZlbnRIYW5kbGVyIGNsYXNzLiBJbnNlcnQgY2FzZSB0byBFdmVudEhhbmRsZXIuaW5pdEVsZW1lbnRzIGZvciBcIiArIGF0dHJpYnV0ZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuICAvLy8gY2FsY3VsYXRlIHRoZSBjdHJsIHByb3BlcnR5IGZyb20gY3RybCBuYW1lIHByb3BlcnR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0YXNrUmVmXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWx1ZVN0cmluZ0N0cmxOYW1lXCI+PC9wYXJhbT5cclxuXHJcbiAgY2FsY3VsYXRlQ3RybEZyb21Db250cm9sTmFtZSh0YXNrUmVmOiBUYXNrKTogdm9pZCB7XHJcbiAgICBpZiAoIU5TdHJpbmcuSXNOdWxsT3JFbXB0eSh0aGlzLl9jdHJsTmFtZSkpIHtcclxuICAgICAgdGhpcy5fY3RybCA9ICgodGFza1JlZi5nZXRGb3JtKCkgIT09IG51bGwpID8gKDxNZ0Zvcm0+dGFza1JlZi5nZXRGb3JtKCkpLmdldEN0cmxCeUN0cmxOYW1lKHRoaXMuX2N0cmxOYW1lKSA6IG51bGwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrIGlmIHRoaXMgZXZlbnQgaGFuZGxlciBpcyBhIHNwZWNpZmljIGhhbmRsZXIgb2YgYW4gZXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicnRFdnRcIj50aGUgZXZlbnQgdG8gY2hlY2s8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gYm9vbGVhbiB0cnVlIGlmIHRoZSBldmVudHMgbWF0Y2g8L3JldHVybnM+XHJcbiAgaXNTcGVjaWZpY0hhbmRsZXJPZihydEV2dDogUnVuVGltZUV2ZW50KTogYm9vbGVhbiB7XHJcblxyXG4gICAgaWYgKHRoaXMuX2N0cmwgPT09IG51bGwgJiYgdGhpcy5fY3RybE5hbWUgPT09IG51bGwgJiYgdGhpcy5faGFuZGxlckZsZCA9PT0gbnVsbCAmJiAhdGhpcy5faXNIYW5kbGVyT25Gb3JtKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgLy8gY2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSBzY29wZVxyXG4gICAgaWYgKHRoaXMuX3Njb3BlID09PSBCcmtTY29wZS5UYXNrICYmIHRoaXMuX3Rhc2sgIT09IHJ0RXZ0LmdldFRhc2soKSlcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIC8vIGlmIHRoZSBoYW5kbGVycyBldmVudCBhbmQgdGhlIGNoZWNrZWQgZXZlbnQgYXJlIGVxdWFsIGFuZFxyXG4gICAgLy8gdGhlIGhhbmRsZXIgaGFuZGxlcyB0aGUgY29udHJvbCBhdHRhY2hlZCB0byB0aGUgY2hlY2tlZCBldmVudCwgcmV0dXJuIHRydWVcclxuICAgIC8vIGNvbXBhcmUgY29udHJvbCBuYW1lIHdpdGggdGhlIG5hbWUgb2YgdGhlIGNvbnRyb2wgaW4gdGhlIGV2ZW50XHJcbiAgICBpZiAodGhpcy5fZXZ0LmVxdWFscyhydEV2dCkpIHtcclxuICAgICAgLy8gVmFyaWFibGUgY2hhbmdlIGhhbmRsZXJzIGRvIG5vdCBoYXZlIGNvbnRyb2wgbmFtZXMuIE9ubHkgZmllbGRzIG5lZWQgdG8gYmUgY29tcGFyZWRcclxuICAgICAgaWYgKHRoaXMuX2hhbmRsZXJGbGQgIT09IG51bGwpIHtcclxuICAgICAgICByZXR1cm4gKHRoaXMuX2hhbmRsZXJGbGQgPT09IHJ0RXZ0LmdldEZsZCgpKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAocnRFdnQuQ29udHJvbCAhPT0gbnVsbCAmJiAhdGhpcy5faXNIYW5kbGVyT25Gb3JtKSB7XHJcbiAgICAgICAgbGV0IGV2ZW50Q3RybE5hbWU6IHN0cmluZyA9IHJ0RXZ0LkNvbnRyb2wuZ2V0Q29udHJvbE5hbWVGb3JIYW5kbGVyU2VhcmNoKCk7XHJcbiAgICAgICAgaWYgKGV2ZW50Q3RybE5hbWUgIT09IG51bGwgJiYgdGhpcy5fY3RybE5hbWUudG9Mb3dlckNhc2UoKSA9PT0gZXZlbnRDdHJsTmFtZS50b0xvd2VyQ2FzZSgpKVxyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAocnRFdnQuQ29udHJvbCA9PT0gbnVsbCAmJiB0aGlzLl9pc0hhbmRsZXJPbkZvcm0pXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrIGlmIHRoaXMgZXZlbnQgaGFuZGxlciBpcyBhIG5vbi1zcGVjaWZpYyBvciBnbG9iYWwgaGFuZGxlciBvZiBhbiBldmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJydEV2dFwiPnRoZSBldmVudCB0byBjaGVja1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gYm9vbGVhbiB0cnVlIGlmIHRoZSBldmVudHMgbWF0Y2hcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGlzTm9uU3BlY2lmaWNIYW5kbGVyT2YocnRFdnQ6IFJ1blRpbWVFdmVudCk6IGJvb2xlYW4ge1xyXG5cclxuICAgIC8vIGlmIHRoZSBoYW5kbGVyIGhhbmRsZXMgYSBjb250cm9sIHJldHVybiBmYWxzZVxyXG4gICAgaWYgKHRoaXMuX2N0cmwgIT09IG51bGwgfHwgdGhpcy5fY3RybE5hbWUgIT09IG51bGwgfHwgdGhpcy5faGFuZGxlckZsZCAhPT0gbnVsbCB8fCB0aGlzLl9pc0hhbmRsZXJPbkZvcm0pXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIC8vIGNoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgc2NvcGVcclxuICAgIGlmICh0aGlzLl9zY29wZSA9PT0gQnJrU2NvcGUuVGFzayAmJiAgdGhpcy5fdGFzayAhPT0gcnRFdnQuZ2V0VGFzaygpICYmIHJ0RXZ0LmdldFR5cGUoKSAhPT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9USU1FUilcclxuICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuX3Njb3BlID09PSBCcmtTY29wZS5HbG9iYWwgJiYgdGhpcy5fdGFzayAhPT0gcnRFdnQuZ2V0VGFzaygpKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgLy8gaWYgdGhlIGhhbmRsZXJzIGV2ZW50IGFuZCB0aGUgY2hlY2tlZCBldmVudCBhcmUgZXF1YWwgcmV0dXJuIHRydWVcclxuICAgIGlmICh0aGlzLl9ldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1VTRVIgJiYgdGhpcy5fZXZ0LmdldFVzZXJFdmVudFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9OT1RJTklURUQpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0aGlzLl9ldnQuZmluZFVzZXJFdmVudCgpO1xyXG4gICAgICB9XHJcbiAgICAgIGNhdGNoIChhcHBsaWNhdGlvbkV4Y2VwdGlvbikge1xyXG4gICAgICAgIGlmIChhcHBsaWNhdGlvbkV4Y2VwdGlvbiBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRocm93IGFwcGxpY2F0aW9uRXhjZXB0aW9uO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fZXZ0LmVxdWFscyhydEV2dCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgaWYgdGhpcyBldmVudCBoYW5kbGVyIGlzIGEgZ2xvYmFsIGhhbmRsZXIgb2YgYW4gZXZlbnRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicnRFdnRcIj50aGUgZXZlbnQgdG8gY2hlY2tcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGJvb2xlYW4gdHJ1ZSBpZiB0aGUgZXZlbnRzIG1hdGNoXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBpc0dsb2JhbEhhbmRsZXJPZihydEV2dDogUnVuVGltZUV2ZW50KTogYm9vbGVhbiB7XHJcbiAgICAvLyBjaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIHNjb3BlXHJcbiAgICBpZiAodGhpcy5fc2NvcGUgIT09IEJya1Njb3BlLkdsb2JhbClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIC8vIGlmIHRoZSBoYW5kbGVyIGhhbmRsZXMgYSBjb250cm9sIHJldHVybiBmYWxzZVxyXG4gICAgaWYgKHRoaXMuX2N0cmwgIT0gbnVsbCB8fCB0aGlzLl9jdHJsTmFtZSAhPSBudWxsIHx8IHRoaXMuX2hhbmRsZXJGbGQgIT0gbnVsbCB8fCB0aGlzLl9pc0hhbmRsZXJPbkZvcm0pXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAvLyBpZiB0aGUgaGFuZGxlcnMgZXZlbnQgYW5kIHRoZSBjaGVja2VkIGV2ZW50IGFyZSBlcXVhbCwgcmV0dXJuIHRydWVcclxuICAgIHJldHVybiB0aGlzLl9ldnQuZXF1YWxzKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVjayBpZiB0aGlzIGV2ZW50IGhhbmRsZXIgaXMgYSBzcGVjaWZpYyBnbG9iYWwgaGFuZGxlciBvZiBhbiBldmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJydEV2dFwiPnRoZSBldmVudCB0byBjaGVja1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gYm9vbGVhbiB0cnVlIGlmIHRoZSBldmVudHMgbWF0Y2hcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGlzR2xvYmFsU3BlY2lmaWNIYW5kbGVyT2YocnRFdnQ6IFJ1blRpbWVFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgLy8gY2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSBzY29wZVxyXG4gICAgaWYgKHRoaXMuX3Njb3BlICE9PSBCcmtTY29wZS5HbG9iYWwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5fY3RybCA9PSBudWxsICYmIHRoaXMuX2N0cmxOYW1lID09IG51bGwgJiYgdGhpcy5faGFuZGxlckZsZCA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgLy8gaWYgdGhlIGhhbmRsZXJzIGV2ZW50IGFuZCB0aGUgY2hlY2tlZCBldmVudCBhcmUgZXF1YWwsIHJldHVybiB0cnVlXHJcbiAgICByZXR1cm4gKHRoaXMuX2N0cmxOYW1lICE9IG51bGwgJiYgdGhpcy5fZXZ0LmVxdWFscyhydEV2dCkgJiZcclxuICAgICAgTlN0cmluZy5FcXVhbHModGhpcy5fY3RybE5hbWUsIHJ0RXZ0LkNvbnRyb2wuTmFtZSwgdHJ1ZSkpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGV4ZWN1dGUgdGhlIGV2ZW50IGhhbmRsZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicnRFdnRcIj50aGUgZXZlbnQgb24gd2hpY2ggdGhlIGhhbmRsZXIgaXMgZXhlY3V0ZWRcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJldHVybmVkRnJvbVNlcnZlclwiPmluZGljYXRlcyB3aGV0aGVyIHdlIHJldHVybmVkIGZyb20gdGhlIHNlcnZlciBhbmRcclxuICAvLy8gICB0aGVyZWZvcmUgbWlnaHQgbm90IG5lZWQgdG8gY2hlY2sgdGhlIGVuYWJsZWQgY29uZGl0aW9uXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJlbmFibGVkQ25kQ2hlY2tlZEFuZFRydWVcIj5pbmRpY2F0ZXMgdGhhdCB0aGUgZW5hYmxlZCBjb25kaXRpb24gd2FzIGFscmVhZHkgY2hlY2tlZCBhbmQgdGhlcmUncyBub1xyXG4gIC8vLyAgIG5lZWQgdG8gcmUtY2hlY2sgaXQgKGJlY2F1c2UgaXQgbWlnaHQgYmUgZmFsc2Ugbm93LCBidXQgd2Ugc3RpbGwgbmVlZCB0b1xyXG4gIC8vLyAgIGV4ZWN1dGUgdGhlIGhhbmRsZXIpXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBib29sZWFuIHRoaXMgaXMgdGhlIHJldHVybiBjb2RlIG9mIHRoZSBoYW5kbGVyLCBpZiB0cnVlIHRoZW4gdGhlIGV2ZW50c1xyXG4gIC8vLyAgIG1hbmFnZXIgbXVzdCBjb250aW51ZSBzZWFyY2hpbmcgZm9yIHRoZSBuZXh0IGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBldmVudFxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiBhc3luYyBleGVjdXRlKHJ0RXZ0OiBSdW5UaW1lRXZlbnQsIHJldHVybmVkRnJvbVNlcnZlcjogYm9vbGVhbiwgZW5hYmxlZENuZENoZWNrZWRBbmRUcnVlOiBib29sZWFuKTogUHJvbWlzZTxSZXRWYWxzPiB7XHJcblxyXG4gICAgbGV0IGN0cmw6IE1nQ29udHJvbCA9IG51bGw7XHJcbiAgICBsZXQgcmV0VmFsOiBib29sZWFuO1xyXG4gICAgbGV0IGRlcHRoOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IHRhc2tFbmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBicmtMZXZlbDogc3RyaW5nID0gdGhpcy5fdGFzay5nZXRCcmtMZXZlbCgpO1xyXG4gICAgbGV0IGJya0xldmVsSW5kZXg6IG51bWJlciA9IHRoaXMuX3Rhc2suZ2V0QnJrTGV2ZWxJbmRleCgpO1xyXG4gICAgbGV0IGluaXRpYWxMb29wU3RhY2tTaXplOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIC8vIHNldCBsZXZlbCBmb3IgTEVWRUwgZnVuY3Rpb25cclxuICAgIGlmICh0YXNrRW5kICE9PSBudWxsICYmIHRoaXMuX2V2dC5nZXRUeXBlKCkgIT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfRVhQUkVTU0lPTiAmJiAodGhpcy5fZXZ0LmdldFR5cGUoKSAhPT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9VU0VSIHx8ICh0aGlzLl9ldnQuZ2V0VXNlckV2ZW50KCkuZ2V0VHlwZSgpICE9PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0VYUFJFU1NJT04gJiYgdGhpcy5fZXZ0LmdldFVzZXJFdmVudCgpLmdldFR5cGUoKSAhPT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9USU1FUikpKSB7XHJcbiAgICAgIC8vIFVubGlrZSBhIGhhbmRsZXIsIHRoZSB1c2VyIGZ1bmN0aW9uIHNob3VsZCBub3QgY2hhbmdlIHRoZSBsZXZlbCBvZiB0aGUgdGFzay5cclxuICAgICAgaWYgKHRoaXMuX2V2dC5nZXRUeXBlKCkgIT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVVNFUl9GVU5DKVxyXG4gICAgICAgIHRoaXMuX3Rhc2suc2V0QnJrTGV2ZWwocnRFdnQuZ2V0QnJrTGV2ZWwoKSwgdGhpcy5faWQpO1xyXG5cclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5fdGFzay5zZXRCcmtMZXZlbCh0aGlzLl9ldnQuZ2V0QnJrTGV2ZWwoKSwgdGhpcy5faWQpO1xyXG5cclxuICAgIGxldCBhcmdzOiBBcmd1bWVudHNMaXN0ID0gcnRFdnQuZ2V0QXJnTGlzdCgpO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGxldCBmbG93TW9uaXRvcjogRmxvd01vbml0b3JRdWV1ZSA9IEZsb3dNb25pdG9yUXVldWUuSW5zdGFuY2U7XHJcblxyXG4gICAgICAvLyBSb3V0ZSBldmVudCBjYW4gb25seSBiZSBoYW5kbGVkIGluIGEgdGFzayB3aGljaCBpcyBvcGVuZWQgYXMgcm91dGVyIGxpbmsgb3IgdGhlIHJvb3QgdGFzay5cclxuICAgICAgaWYgKHJ0RXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCAmJiBydEV2dC5nZXRJbnRlcm5hbENvZGUoKSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1dFQkNMSUVOVF9ST1VURSkge1xyXG4gICAgICAgIGlmICghdGhpcy5fdGFzay5Jc1JvdXRlKCkgJiYgdGhpcy5fdGFzayAhPT0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLlN0YXJ0dXBNZ0RhdGEuZ2V0Rmlyc3RUYXNrKCkpIHtcclxuICAgICAgICAgIHJldHVybiBuZXcgUmV0VmFscyh0cnVlLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGNoZWNrIGlmIHRoZSBoYW5kbGVyIGlzIGVuYWJsZWQuIGlmIG5vdCwgcmV0dXJuIHRydWUgdG8gY29udGludWUgc2VhcmNoaW5nXHJcbiAgICAgIC8vIGZvciB0aGUgbmV4dCBldmVudCBoYW5kbGVyXHJcbiAgICAgIGxldCBuZXh0T3BlcklkeDogbnVtYmVyID0gLTE7XHJcbiAgICAgIGlmIChyZXR1cm5lZEZyb21TZXJ2ZXIpIHtcclxuICAgICAgICAvLyBpZiB3ZSByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIgLSB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBuZXh0IG9wZXJhdGlvbiBpcyBvbiB0aGUgY3VycmVudFxyXG4gICAgICAgIC8vIGhhbmRsZXIgKHVzaW5nIGEgY2FsbCB0byBnZXROZXh0T3BlcklkeCgpIHdpdGggZmFsc2UgaW4gdGhlIGNsZWFyV2hlbkZvdW5kIHBhcmFtZXRlcilcclxuICAgICAgICAvLyBhbmQgaWYgaXQgaXMgLSBkbyBub3QgY2hlY2sgdGhlIGVuYWJsZWQgY29uZGl0aW9uLCBiZWNhdXNlIGl0IG1pZ2h0IGhhdmUgY2hhbmdlZFxyXG4gICAgICAgIC8vIHNpbmNlIGl0IHdhcyBldmFsdWF0ZWQgb24gdGhlIHNlcnZlci4gd2UgbmVlZCB0byBnbyBpbnRvIHRoaXMgaGFuZGxlciBldmVuIGlmIGl0IGlzIG5vdFxyXG4gICAgICAgIC8vIGN1cnJlbnRseSBlbmFibGVkXHJcbiAgICAgICAgbmV4dE9wZXJJZHggPSBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5nZXROZXh0T3BlcklkeCh0aGlzLl9vcGVyYXRpb25UYWIuZ2V0T3BlcmF0aW9uKDApLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5leHRPcGVySWR4ID09PSAtMSAmJiAhZW5hYmxlZENuZENoZWNrZWRBbmRUcnVlICYmICFhd2FpdCB0aGlzLmlzRW5hYmxlZCgpKVxyXG4gICAgICAgIHJldHVybiBuZXcgUmV0VmFscyh0cnVlLCBmYWxzZSk7XHJcblxyXG4gICAgICAvLyBjaGVjayB0aGUgc2NvcGUgZm9yIEV4cHJlc3Npb24gYW5kIFRpbWVyIGhhbmRsZXJzXHJcbiAgICAgIGlmICh0aGlzLl9zY29wZSA9PT0gQnJrU2NvcGUuVGFzayAmJiAocnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1RJTUVSIHx8IHJ0RXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9FWFBSRVNTSU9OKSkge1xyXG4gICAgICAgIGxldCBjdXJyVGFzazogVGFzayA9IExhc3RGb2N1c2VkTWFuYWdlci5JbnN0YW5jZS5nZXRMYXN0Rm9jdXNlZFRhc2soKTtcclxuICAgICAgICBpZiAodGhpcy5fdGFzayAhPT0gY3VyclRhc2spXHJcbiAgICAgICAgICByZXR1cm4gbmV3IFJldFZhbHModHJ1ZSwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGhpcy5faGFuZGxlZEJ5Q2xpZW50KSB7XHJcbiAgICAgICAgLy8gcmV0dXJuIGZhbHNlIHRvIHN0b3Agc2VhcmNoaW5nIGZvciB0aGUgbW9yZSBoYW5kbGVycyBiZWNhdXNlXHJcbiAgICAgICAgLy8gdGhlIHNlcnZlciBoYWQgdGFrZW4gY2FyZSBvZiBhbGwgb2YgdGhlbVxyXG4gICAgICAgIHJldHVybiBuZXcgUmV0VmFscyhmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChydEV2dC5nZXRUeXBlKCkgIT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVVNFUiAmJiAhYXdhaXQgdGhpcy5fZXZ0LmRhdGFFdmVudElzVHJ1ZSgpKVxyXG4gICAgICAgIHJldHVybiBuZXcgUmV0VmFscyhmYWxzZSwgdHJ1ZSk7XHJcblxyXG4gICAgICBpZiAocnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMICYmIHJ0RXZ0LmdldEludGVybmFsQ29kZSgpID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19TVUZGSVgpXHJcbiAgICAgICAgdGFza0VuZCA9IHRydWU7XHJcblxyXG4gICAgICBpZiAocnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMKSB7XHJcbiAgICAgICAgc3dpdGNoIChydEV2dC5nZXRJbnRlcm5hbENvZGUoKSkge1xyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWDpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dSZWMoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgsIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9TVEFSVCwgIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWDpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dSZWMoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgsIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9TVEFSVCwgIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd0N0cmwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYLCBydEV2dC5Db250cm9sLk5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfU1RBUlQsICB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWDpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dDdHJsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWCwgcnRFdnQuQ29udHJvbC5OYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1NUQVJULCAgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVkFSSUFCTEU6XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93RmxkKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9WQVJJQUJMRSwgcnRFdnQuZ2V0RmxkKCkuZ2V0TmFtZSgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfU1RBUlQsICB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1ZFUklGSUNBVElPTjpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dDdHJsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1ZFUklGSUNBVElPTixcclxuICAgICAgICAgICAgICBydEV2dC5Db250cm9sLk5hbWUsIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9TVEFSVCwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19QUkVGSVg6XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93UmVjKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1BSRUZJWCwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1NUQVJULCAgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19TVUZGSVg6XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93UmVjKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1NVRkZJWCwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1NUQVJULCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd0hhbmRsZXIodGhpcy5fZXZ0LmdldEJya0xldmVsKHRydWUpLCBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfU1RBUlQsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dIYW5kbGVyKHRoaXMuX2V2dC5nZXRCcmtMZXZlbCh0cnVlKSwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1NUQVJULCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG5cclxuICAgICAgdHJ5IHtcclxuXHJcbiAgICAgICAgaWYgKHRhc2tFbmQgIT09IG51bGwpXHJcbiAgICAgICAgICBjdHJsID0gPE1nQ29udHJvbD5ydEV2dC5Db250cm9sO1xyXG5cclxuICAgICAgICBsZXQgbWdkSUQ6IG51bWJlciA9IEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5jdXJyTWdkSUQ7XHJcbiAgICAgICAgbGV0IGlzQ2hhbmdlZEN1cnJXbmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgICAgICBsZXQgaXNDaGFuZ2VkQ3VyclduZFJlZjogUmVmUGFyYW08Ym9vbGVhbj4gPSBuZXcgUmVmUGFyYW0oaXNDaGFuZ2VkQ3VyclduZCk7XHJcblxyXG5cclxuICAgICAgICAvLyBmb3IgdGltZXIgZXZlbnRzIGNoZWNrIGlmIHRoZSB0YXNrIG9mIHRoZSBldmVudCBpcyBpbiB0aGVcclxuICAgICAgICAvLyBjdXJyZW50IHdpbmRvdyBhbmQgaWYgbm90IHRoZW4gY2hhbmdlIHRoZSBjdXJyZW50IHdpbmRvd1xyXG4gICAgICAgIC8vIHRlbXBvcmFyaWx5IHRpbGwgdGhlIGhhbmRsZXIgZmluaXNoZXNcclxuICAgICAgICBpZiAodGhpcy5fZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9USU1FUiAmJiBtZ2RJRCAhPT0gcnRFdnQuZ2V0TWdkSUQoKSkge1xyXG4gICAgICAgICAgLy8gc2V0IG51bWJlciBvZiB3aW5kb3cgZm9yIHRpbWVyIGV2ZW50XHJcbiAgICAgICAgICBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuY3Vyck1nZElEID0gcnRFdnQuZ2V0TWdkSUQoKTtcclxuICAgICAgICAgIGlzQ2hhbmdlZEN1cnJXbmRSZWYudmFsdWUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gcHV0IGluaXRpYWwgdmFsdWVzIHRvIHRoZSBsb2NhbCB2YXJpYWJsZXNcclxuICAgICAgICBhd2FpdCB0aGlzLnJlc2V0TG9jYWxWYXJpYWJsZXMoYXJncyk7XHJcblxyXG4gICAgICAgIGluaXRpYWxMb29wU3RhY2tTaXplID0gdGhpcy5fdGFzay5nZXRMb29wU3RhY2tTaXplKCk7XHJcbiAgICAgICAgbGV0IHJldFZhbHM6IFJldFZhbHMgPSBudWxsO1xyXG4gICAgICAgIGlmICh0aGlzLl9vcGVyYXRpb25UYWIuZ2V0U2l6ZSgpID4gMClcclxuICAgICAgICAgIHJldFZhbHMgPSBhd2FpdCB0aGlzLmV4ZWN1dGVPcGVyYXRpb25zKDAsIHRoaXMuX29wZXJhdGlvblRhYi5nZXRTaXplKCkgLSAxLCB0YXNrRW5kLCBtZ2RJRCwgZGVwdGgsIGlzQ2hhbmdlZEN1cnJXbmRSZWYsIGZhbHNlLCBmYWxzZSwgLTEpO1xyXG5cclxuICAgICAgICBpc0NoYW5nZWRDdXJyV25kID0gaXNDaGFuZ2VkQ3VyclduZFJlZi52YWx1ZTtcclxuXHJcbiAgICAgICAgaWYgKHJldFZhbHMgIT09IG51bGwpXHJcbiAgICAgICAgICByZXR1cm4gcmV0VmFscztcclxuXHJcbiAgICAgICAgLy8gY2hlY2sgdGhlIGVuZHRhc2sgY29uZGl0aW9uIG9uY2UgYWdhaW4gYXQgdGhlIGVuZCBvZiB0aGUgaGFuZGxlclxyXG4gICAgICAgIGlmICghdGFza0VuZClcclxuICAgICAgICAgIGF3YWl0IHRoaXMuX3Rhc2suZXZhbEVuZENvbmQoQ29uc3RJbnRlcmZhY2UuRU5EX0NPTkRfRVZBTF9JTU1JRElBVEUpO1xyXG5cclxuICAgICAgICAvLyBjaGFuZ2UgY3VycmVudCB3aW5kb3cgYmFjayBpZiBpdCB3YXMgY2hhbmdlZCBmb3IgVGltZXJcclxuICAgICAgICBpZiAoaXNDaGFuZ2VkQ3VyclduZCkge1xyXG4gICAgICAgICAgbGV0IG9sZE1nZDogTUdEYXRhID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmdldE1HRGF0YShtZ2RJRCk7XHJcbiAgICAgICAgICBpZiAob2xkTWdkICE9PSBudWxsICYmICFvbGRNZ2QuSXNBYm9ydGluZylcclxuICAgICAgICAgICAgQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmN1cnJNZ2RJRCA9IG1nZElEO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyBlbmQgd2hpbGUgb3BlcmF0aW9uIGJsb2NrXHJcbiAgICAgIGNhdGNoIChleCkge1xyXG4gICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFNlcnZlckVycm9yKSB7XHJcbiAgICAgICAgICBpZiAoTG9nZ2VyLkluc3RhbmNlLkxvZ0xldmVsICE9PSBMb2dnZXJfTG9nTGV2ZWxzLkJhc2ljKVxyXG4gICAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZyhleCk7XHJcbiAgICAgICAgICB0aHJvdyBleDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoZXggaW5zdGFuY2VvZiBFeGNlcHRpb24pIHtcclxuICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nKGV4KTtcclxuICAgICAgICAgIHJldHVybiBuZXcgUmV0VmFscyhmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRocm93IGV4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmaW5hbGx5IHtcclxuICAgICAgICAvLyBnZXQgdGhlIHByb3BhZ2F0ZSB2YWx1ZVxyXG4gICAgICAgIHJldFZhbCA9IGF3YWl0IHRoaXMuX3Byb3BhZ2F0ZUV4cC5nZXRWYWwoKTtcclxuXHJcbiAgICAgICAgLy8gcmVtb3ZlIGxvb3AgY291bnRlcnMgdGhhdCB3ZXJlIGxlZnQgdW51c2VkIGluIHRoZSBzdGFjayBkdWUgdG8gbGVhdmluZ1xyXG4gICAgICAgIC8vIHRoZSBoYW5kbGVyIG9uIFwic3RvcEV4ZWN1dGlvbigpID09IHRydWVcIlxyXG4gICAgICAgIGxldCBjdXJyTG9vcFN0YWNrU2l6ZTogbnVtYmVyID0gdGhpcy5fdGFzay5nZXRMb29wU3RhY2tTaXplKCk7XHJcbiAgICAgICAgZm9yICg7IGN1cnJMb29wU3RhY2tTaXplID4gaW5pdGlhbExvb3BTdGFja1NpemU7IGN1cnJMb29wU3RhY2tTaXplID0gY3Vyckxvb3BTdGFja1NpemUtLSlcclxuICAgICAgICAgIHRoaXMuX3Rhc2sucG9wTG9vcENvdW50ZXIoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gYWZ0ZXIgZXhlY3V0aW5nIHRoZSBvcGVyYXRpb25zIHVwZGF0ZSB0aGUgYXJndW1lbnRzIGJhY2sgYW5kIHJlY29tcHV0ZVxyXG4gICAgICBpZiAoYXJncyAhPT0gbnVsbClcclxuICAgICAgICBhd2FpdCB0aGlzLmdldEFyZ1ZhbHNGcm9tRmxkcyhhcmdzKTtcclxuXHJcbiAgICAgIGlmIChydEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwpIHtcclxuICAgICAgICBzd2l0Y2ggKHJ0RXZ0LmdldEludGVybmFsQ29kZSgpKSB7XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd1JlYyhJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX0VORCwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWDpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dSZWMoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgsIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9FTkQsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfUFJFRklYOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd1JlYyhJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19QUkVGSVgsIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9FTkQsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfU1VGRklYOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd1JlYyhJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19TVUZGSVgsIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9FTkQsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd0N0cmwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYLCBjdHJsLk5hbWUsIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9FTkQsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd0N0cmwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYLCBjdHJsLk5hbWUsIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9FTkQsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1ZBUklBQkxFOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd0ZsZChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVkFSSUFCTEUsIHJ0RXZ0LmdldEZsZCgpLmdldE5hbWUoKSwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX0VORCwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9WRVJJRklDQVRJT046XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93Q3RybChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9WRVJJRklDQVRJT04sIGN0cmwuTmFtZSwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX0VORCwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dIYW5kbGVyKHRoaXMuX2V2dC5nZXRCcmtMZXZlbCh0cnVlKSwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX0VORCwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd0hhbmRsZXIodGhpcy5fZXZ0LmdldEJya0xldmVsKHRydWUpLCAxLCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgIC8vIHJlc3RvcmluZyAgdGhlIG9yaWdpbmFsIGJyZWFrIGxldmVsIHN0YXRlIGFuZCBjdXJyZW50IGV4ZWN1dGluZyBjb250cm9sIGluZGV4XHJcbiAgICAgIHRoaXMuX3Rhc2suc2V0QnJrTGV2ZWwoYnJrTGV2ZWwsIGJya0xldmVsSW5kZXgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBSZXRWYWxzKHJldFZhbCwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZXhlY3V0ZSB0aGUgb3BlcmF0aW9ucyBzdGFydGluZyBmcm9tIGZyb21JZHggYW5kIGVuZGluZyBhdCBlbmRJZHguXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVPcGVyYXRpb25zKGZyb21JZHg6IG51bWJlciwgdG9JZHg6IG51bWJlciwgdGFza0VuZDogYm9vbGVhbiwgbWdkSUQ6IG51bWJlciwgZGVwdGg6IG51bWJlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2hhbmdlZEN1cnJXbmRSZWY6IFJlZlBhcmFtPGJvb2xlYW4+LCBpbkJsb2NrSWY6IGJvb2xlYW4sIGluUmV0dXJuZWRGcm9tU2VydmVyOiBib29sZWFuLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5OZXh0T3BlcklkeDogbnVtYmVyKTogUHJvbWlzZSA8UmV0VmFscz4ge1xyXG4gICAgbGV0IG9wZXI6IE9wZXJhdGlvbjtcclxuICAgIGxldCBvcGVyVHlwZTogbnVtYmVyO1xyXG4gICAgbGV0IG5leHRPcGVySWR4OiBudW1iZXIgPSAtMTtcclxuICAgIGxldCByZXR1cm5lZEZyb21TZXJ2ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBtZ2Q6IE1HRGF0YSA9IHRoaXMuX3Rhc2suZ2V0TUdEYXRhKCk7XHJcbiAgICBsZXQgZXhlY0Zsb3dJZHg6IG51bWJlciA9IGZyb21JZHg7XHJcbiAgICBsZXQgcmV0dmFsczogUmV0VmFscztcclxuICAgIGxldCBibG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgZXhlY3V0ZUJsb2NrOiBib29sZWFuO1xyXG4gICAgbGV0IGJsb2NrTG9vcEV4ZWNvblNlcnZlcjogYm9vbGVhbjtcclxuICAgIGxldCBmbG93TW9uaXRvcjogRmxvd01vbml0b3JRdWV1ZSA9IEZsb3dNb25pdG9yUXVldWUuSW5zdGFuY2U7XHJcbiAgICBsZXQgcm91dGVPcGVyYXRpb25FeGVjdXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGlmICghaW5SZXR1cm5lZEZyb21TZXJ2ZXIpIHtcclxuICAgICAgLy8gd2UgbmVlZCB0byBjaGVjayBpZiB0aGUgc2VydmVyIGFscmVhZHkgc3RhcnRlZCBydW5uaW5nIHRoaXMgaGFuZGxlclxyXG4gICAgICBvcGVyID0gdGhpcy5fb3BlcmF0aW9uVGFiLmdldE9wZXJhdGlvbihleGVjRmxvd0lkeCk7XHJcbiAgICAgIG5leHRPcGVySWR4ID0gQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuZ2V0TmV4dE9wZXJJZHgob3BlciwgdHJ1ZSk7XHJcbiAgICAgIGlmIChuZXh0T3BlcklkeCA+IC0xKSB7XHJcbiAgICAgICAgcmV0dXJuZWRGcm9tU2VydmVyID0gdHJ1ZTtcclxuICAgICAgICBpZiAoaW5CbG9ja0lmKVxyXG4gICAgICAgICAgYmxvY2tJZlJldHVybmVkRnJvbVNlcnZlciA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSByZXR1cm5lZEZyb21TZXJ2ZXIgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm5lZEZyb21TZXJ2ZXIgPSBpblJldHVybmVkRnJvbVNlcnZlcjtcclxuICAgICAgbmV4dE9wZXJJZHggPSBpbk5leHRPcGVySWR4O1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAoOyBleGVjRmxvd0lkeCA8PSB0b0lkeCAmJlxyXG4gICAgICAgICAgICghQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkgJiZcclxuICAgICAgICAgICAhbWdkLklzQWJvcnRpbmcgJiYgIXJvdXRlT3BlcmF0aW9uRXhlY3V0ZWQ7XHJcbiAgICAgICAgICAgZXhlY0Zsb3dJZHggKz0gMSkge1xyXG4gICAgICBpZiAoaW5CbG9ja0lmICYmIGJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXIgJiYgdGhpcy5fb3BlcmF0aW9uVGFiLmdldE9wZXJhdGlvbih0b0lkeCkuZ2V0U2VydmVySWQoKSA8IG5leHRPcGVySWR4KVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgb3BlciA9IHRoaXMuX29wZXJhdGlvblRhYi5nZXRPcGVyYXRpb24oZXhlY0Zsb3dJZHgpO1xyXG5cclxuICAgICAgb3BlclR5cGUgPSBvcGVyLmdldFR5cGUoKTtcclxuXHJcbiAgICAgIGJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXIgPSBmYWxzZTtcclxuXHJcbiAgICAgIC8vIElmIERlbGF5Q29tbWFuZEV4ZWN1dGlvbiA9IHRydWUsIGl0IG1lYW5zIHdlIGFyZSBoZXJlIFRTIG9mIGNsb3NpbmcgdGFzay5cclxuICAgICAgLy8gU28sIHNldCBmaXJzdCBvcGVyYXRpb24gb2YgaGFuZGxlciBhcyBzZXJ2ZXIuIHJldHVybiBiYWNrLlxyXG4gICAgICBpZiAoUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuR2V0SW5zdGFuY2UoKS5EZWxheUNvbW1hbmRFeGVjdXRpb24pIHtcclxuICAgICAgICB0aGlzLl90YXNrLnNldFVzZUxvb3BTdGFjayhkZXB0aCA+IDApO1xyXG4gICAgICAgIGF3YWl0IG9wZXIub3BlclNlcnZlcihudWxsKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gc2tpcCB0byB0aGUgY29ycmVjdCBvcGVyYXRpb24gYWZ0ZXIgcmV0dXJuaW5nIGZyb20gdGhlIHNlcnZlclxyXG4gICAgICBpZiAocmV0dXJuZWRGcm9tU2VydmVyICYmIG9wZXIuZ2V0U2VydmVySWQoKSA8IG5leHRPcGVySWR4KVxyXG4gICAgICAgIGlmIChvcGVyVHlwZSAhPT0gQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9CTE9DSylcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX29wZXJhdGlvblRhYi5nZXRPcGVyYXRpb24ob3Blci5nZXRCbG9ja0VuZCgpKS5nZXRTZXJ2ZXJJZCgpIDwgbmV4dE9wZXJJZHgpXHJcbiAgICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgIGlmICghdGFza0VuZClcclxuICAgICAge1xyXG4gICAgICAgIGlmKGF3YWl0IHRoaXMuX3Rhc2suZXZhbEVuZENvbmQoQ29uc3RJbnRlcmZhY2UuRU5EX0NPTkRfRVZBTF9JTU1JRElBVEUpICYmIEVudmlyb25tZW50Lkluc3RhbmNlLmdldFNwZWNpYWxJbW1lZGlhdGVIYW5kbGVyRW5kKCkpXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLl90YXNrTWdkSUQgIT09IG1nZElEKVxyXG4gICAgICAgIGlzQ2hhbmdlZEN1cnJXbmRSZWYudmFsdWUgPSB0cnVlO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLl90YXNrLmlzTWFpblByb2coKSAmJiB0aGlzLl90YXNrLmlzT3BlbldpbigpKVxyXG4gICAgICAgIEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5jdXJyTWdkSUQgPSB0aGlzLl90YXNrTWdkSUQ7XHJcblxyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5DaGVja0FuZFNob3dTcGlubmVyKHRydWUpO1xyXG5cclxuICAgICAgc3dpdGNoIChvcGVyVHlwZSkge1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9WRVJJRlk6XHJcbiAgICAgICAgICAvLyBpZiB0cnVlIHJldHVybmVkIHRoZW4gdGhlIHZlcmlmeSBjb25kaXRpb24gd2FzIHRydWUgYW5kIHRoZSBtb2RlIGlzIEVycm9yXHJcbiAgICAgICAgICBpZiAoYXdhaXQgb3Blci5leGVjdXRlKHJldHVybmVkRnJvbVNlcnZlcikpIHtcclxuICAgICAgICAgICAgaWYgKCEodGhpcy5fdGFzay5nZXRCcmtMZXZlbCgpID09PSBcIlRTXCIpKSB7XHJcbiAgICAgICAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl90YXNrLmdldEluUmVjb3JkU3VmZml4KCkgJiYgdGhpcy5fdGFzay5nZXRMZXZlbCgpID09PSBDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKVxyXG4gICAgICAgICAgICAgIHRoaXMuX3Rhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfUkVDT1JEKTtcclxuICAgICAgICAgICAgLy8gUUNSICM5OTUxMDggLSB2ZXJpZnkgZXJyb3IgaW4gUlMgc2hvdWxkbid0IHRyaWdnZXIgUlBcclxuICAgICAgICAgICAgLypcclxuICAgICAgICAgICAgICogaWYgd2UgYXJlIGluIHRoZSByZXZlcnQgbW9kZSwgZG9udCBzdG9wIGltbWVkaWF0ZWx5LlxyXG4gICAgICAgICAgICAgKiBleGVjdXRlIHRoZSBvcGVyYXRpb25zIG9mIHRoZSBoYW5kbGVyIGluIHRoZSByZXZlcnNlIG9yZGVyIGFuZCB0aGVuIHN0b3AuXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFJldFZhbHMoZmFsc2UsIHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9MT09QOlxyXG4gICAgICAgICAgLy8gb24gZ2V0dGluZyBhIEJsb2NrTG9vcCwgZXhlY3V0ZSB0aGUgbG9vcCBmb3IgdGhlIG51bWJlciBvZiB0aW1lcyBpbnRlbmRlZCxcclxuICAgICAgICAgIC8vIGFuZCB0aGVuIG1vdmUgdG8gQmxvY2tFbmQuXHJcbiAgICAgICAgICB0aGlzLl90YXNrLmVudGVyTG9vcCgpO1xyXG4gICAgICAgICAgdGhpcy5fdGFzay5pbmNyZWFzZUxvb3BDb3VudGVyKCk7XHJcbiAgICAgICAgICB0aGlzLl90YXNrLnNldFVzZUxvb3BTdGFjayh0cnVlKTtcclxuXHJcbiAgICAgICAgICBhd2FpdCBmbG93TW9uaXRvci5hZGRGbG93RmllbGRPcGVyYXRpb24ob3BlciwgdHJ1ZSwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuXHJcbiAgICAgICAgICBibG9ja0xvb3BFeGVjb25TZXJ2ZXIgPSBmYWxzZTtcclxuICAgICAgICAgIGlmICghb3Blci5nZXRFeGVjT25TZXJ2ZXIoKSkge1xyXG4gICAgICAgICAgICAvLyBleGVjdXRlIHRoZSBsb29wIGZvciB0aGUgbnVtYmVyIG9mIHRpbWVzIGludGVuZGVkXHJcbiAgICAgICAgICAgIHdoaWxlIChhd2FpdCBvcGVyLmV4ZWN1dGUoZmFsc2UpKSB7XHJcbiAgICAgICAgICAgICAgLy8gY2FsbCBleGVjdXRlT3BlcmF0aW9ucygpIHRvIGV4ZWN1dGUgdGhlIG9wZXJhdGlvbnMgd2l0aGluIGEgQmxvY2tMb29wXHJcbiAgICAgICAgICAgICAgcmV0dmFscyA9IGF3YWl0IHRoaXMuZXhlY3V0ZU9wZXJhdGlvbnMoZXhlY0Zsb3dJZHggKyAxLCBvcGVyLmdldEJsb2NrQ2xvc2UoKSAtIDEsIHRhc2tFbmQsIG1nZElELCBkZXB0aCArIDEsXHJcbiAgICAgICAgICAgICAgICBpc0NoYW5nZWRDdXJyV25kUmVmLCBmYWxzZSwgZmFsc2UsIC0xKTtcclxuICAgICAgICAgICAgICBpZiAocmV0dmFscyAhPT0gbnVsbClcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWxzO1xyXG5cclxuICAgICAgICAgICAgICAvLyBpZiB3ZSBnZXQgYSByZXZlcnQgaW5zaWRlIGEgbG9vcCwgYnJlYWsgdGhlIGxvb3BcclxuICAgICAgICAgICAgICBpZiAoKG1nZC5Jc0Fib3J0aW5nIHx8IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCkpKVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMuX3Rhc2suaW5jcmVhc2VMb29wQ291bnRlcigpO1xyXG4gICAgICAgICAgICAgIHRoaXMuX3Rhc2suc2V0VXNlTG9vcFN0YWNrKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGF3YWl0IG9wZXIuZXhlY3V0ZShmYWxzZSkpXHJcbiAgICAgICAgICAgICAgYmxvY2tMb29wRXhlY29uU2VydmVyID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICghYmxvY2tMb29wRXhlY29uU2VydmVyKVxyXG4gICAgICAgICAgLypcclxuICAgICAgICAgICAqIE9uY2Ugd2UgZmluaXNoIGV4ZWN1dGluZyB0aGUgbG9vcCxcclxuICAgICAgICAgICAqIGlmIHdlIGFyZSBtb3ZpbmcgaW4gdGhlIGZvcndhcmQgZGlyZWN0aW9uLCBtb3ZlIHRvIEJsb2NrRW5kLlxyXG4gICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGV4ZWNGbG93SWR4ID0gb3Blci5nZXRCbG9ja0VuZCgpIC0gMTtcclxuICAgICAgICAgIHRoaXMuX3Rhc2subGVhdmVMb29wKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19PUEVSX0JMT0NLOlxyXG4gICAgICAgICAgLy8gb24gZ2V0dGluZyBhIEJsb2NrIElGLCBleGVjdXRlIHRoZSBleGVjdXRhYmxlIGJsb2NrIChpZiBvciBlbHNlKVxyXG4gICAgICAgICAgLy8gYW5kIHRoZW4gbW92ZSB0byBCbG9ja0VuZC5cclxuICAgICAgICAgIGlmICghb3Blci5nZXRFeGVjT25TZXJ2ZXIoKSB8fCAocmV0dXJuZWRGcm9tU2VydmVyICYmIG9wZXIuZ2V0U2VydmVySWQoKSA8IG5leHRPcGVySWR4KSkge1xyXG4gICAgICAgICAgICB0aGlzLl90YXNrLnNldFVzZUxvb3BTdGFjayh0cnVlKTtcclxuICAgICAgICAgICAgaWYgKCFyZXR1cm5lZEZyb21TZXJ2ZXIgfHwgb3Blci5nZXRTZXJ2ZXJJZCgpID49IG5leHRPcGVySWR4KVxyXG4gICAgICAgICAgICAvLyBnZXQgdGhlIGV4ZWN1dGFibGUgYmxvY2sgYmV0d2VlbiBCbG9jayBJRiBhbmQgQmxvY2sgRU5EXHJcbiAgICAgICAgICAgICAgZXhlY0Zsb3dJZHggPSBhd2FpdCB0aGlzLmdldFNpZ25pZmljYW50QmxvY2soZXhlY0Zsb3dJZHgsIG9wZXIuZ2V0QmxvY2tFbmQoKSk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICBleGVjRmxvd0lkeCA9IHRoaXMuZ2V0U3RhcnRCbG9ja0lmSWR4QnlPcGVyKGV4ZWNGbG93SWR4LCBuZXh0T3BlcklkeCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fdGFzay5zZXRVc2VMb29wU3RhY2soZGVwdGggPiAwKTtcclxuICAgICAgICAgICAgYXdhaXQgb3Blci5vcGVyU2VydmVyKG51bGwpO1xyXG4gICAgICAgICAgICBuZXh0T3BlcklkeCA9IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmdldE5leHRPcGVySWR4KG9wZXIsIHRydWUpO1xyXG4gICAgICAgICAgICBpZiAobmV4dE9wZXJJZHggPiAtMSkge1xyXG4gICAgICAgICAgICAgIHJldHVybmVkRnJvbVNlcnZlciA9IHRydWU7XHJcbiAgICAgICAgICAgICAgaWYgKGluQmxvY2tJZilcclxuICAgICAgICAgICAgICAgIGJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXIgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICBpZiAobmV4dE9wZXJJZHggPCB0aGlzLl9vcGVyYXRpb25UYWIuZ2V0T3BlcmF0aW9uKG9wZXIuZ2V0QmxvY2tFbmQoKSkuZ2V0U2VydmVySWQoKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgc2lnbmlmaWNhbnQgYmxvY2sgaW4gd2hpY2ggdGhlIG5leHQgb3BlcmF0aW9uIGlzXHJcbiAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy5fb3BlcmF0aW9uVGFiLmdldE9wZXJhdGlvbihvcGVyLmdldEJsb2NrQ2xvc2UoKSkuZ2V0U2VydmVySWQoKSA8IG5leHRPcGVySWR4KSB7XHJcbiAgICAgICAgICAgICAgICAgIGV4ZWNGbG93SWR4ID0gb3Blci5nZXRCbG9ja0Nsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICAgIG9wZXIgPSB0aGlzLl9vcGVyYXRpb25UYWIuZ2V0T3BlcmF0aW9uKGV4ZWNGbG93SWR4KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuZWRGcm9tU2VydmVyID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgZXhlY0Zsb3dJZHggPSAtMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGV4ZWNGbG93SWR4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICBleGVjdXRlQmxvY2sgPSB0cnVlO1xyXG4gICAgICAgICAgICBvcGVyID0gdGhpcy5fb3BlcmF0aW9uVGFiLmdldE9wZXJhdGlvbihleGVjRmxvd0lkeCk7XHJcblxyXG4gICAgICAgICAgICBpZiAocmV0dXJuZWRGcm9tU2VydmVyKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX29wZXJhdGlvblRhYi5nZXRPcGVyYXRpb24ob3Blci5nZXRCbG9ja0Nsb3NlKCkpLmdldFNlcnZlcklkKCkgPD0gbmV4dE9wZXJJZHgpIHtcclxuICAgICAgICAgICAgICAgIGV4ZWN1dGVCbG9jayA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYmxvY2tJZlJldHVybmVkRnJvbVNlcnZlciA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZXhlY3V0ZUJsb2NrKSB7XHJcbiAgICAgICAgICAgICAgLy8gY2FsbCBleGVjdXRlT3BlcmF0aW9ucygpIHRvIGV4ZWN1dGUgdGhlIG9wZXJhdGlvbnMgaW4gdGhlIGV4ZWN1dGFibGUgYmxvY2tcclxuICAgICAgICAgICAgICByZXR2YWxzID0gYXdhaXQgdGhpcy5leGVjdXRlT3BlcmF0aW9ucyhleGVjRmxvd0lkeCArIDEsIG9wZXIuZ2V0QmxvY2tDbG9zZSgpIC0gMSwgdGFza0VuZCwgbWdkSUQsIGRlcHRoICsgMSxcclxuICAgICAgICAgICAgICAgIGlzQ2hhbmdlZEN1cnJXbmRSZWYsIHRydWUsIHJldHVybmVkRnJvbVNlcnZlciwgbmV4dE9wZXJJZHgpO1xyXG4gICAgICAgICAgICAgIGlmIChyZXR2YWxzICE9PSBudWxsKVxyXG4gICAgICAgICAgICAgICAgaWYgKCFyZXR2YWxzLlJldHVybmVkRnJvbVNlcnZlcilcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbHM7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuZWRGcm9tU2VydmVyID0gcmV0dmFscy5SZXR1cm5lZEZyb21TZXJ2ZXI7XHJcbiAgICAgICAgICAgICAgICAgIG5leHRPcGVySWR4ID0gcmV0dmFscy5OZXh0T3BlcklkeDtcclxuICAgICAgICAgICAgICAgICAgYmxvY2tJZlJldHVybmVkRnJvbVNlcnZlciA9IHJldHZhbHMuQmxvY2tJZlJldHVybmVkRnJvbVNlcnZlcjtcclxuICAgICAgICAgICAgICAgICAgZXhlY0Zsb3dJZHggPSBvcGVyLmdldEJsb2NrRW5kKCkgLSAxO1xyXG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgKiBPbmNlIHdlIGZpbmlzaCBleGVjdXRpbmcgdGhlIGJsb2NrLFxyXG4gICAgICAgICAgICogaWYgd2UgYXJlIG1vdmluZyBpbiB0aGUgZm9yd2FyZCBkaXJlY3Rpb24sIG1vdmUgdG8gQmxvY2tFbmQuXHJcbiAgICAgICAgICAgKiBvdGhlcndpc2UsIG1vdmUgdG8gQmxvY2sgSUZcclxuICAgICAgICAgICAqL1xyXG4gICAgICAgICAgZXhlY0Zsb3dJZHggPSBvcGVyLmdldEJsb2NrRW5kKCkgLSAxO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9FTkRCTE9DSzpcclxuICAgICAgICAgIGF3YWl0IGZsb3dNb25pdG9yLmFkZEZsb3dGaWVsZE9wZXJhdGlvbihvcGVyLCB0cnVlLCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9DQUxMOlxyXG4gICAgICAgICAgdGhpcy5fdGFzay5zZXRVc2VMb29wU3RhY2soZGVwdGggPiAwKTtcclxuICAgICAgICAgIC8vIGlmIGZhbHNlIGlzIHJldHVybmVkLCBpdCBtZWFucyB0aGF0IGEgcm91dGUgb3BlcmF0aW9uIHdhcyBleGVjdXRlZC5cclxuICAgICAgICAgIHJvdXRlT3BlcmF0aW9uRXhlY3V0ZWQgPSBhd2FpdCBvcGVyLmV4ZWN1dGUocmV0dXJuZWRGcm9tU2VydmVyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgLy8gdGhlIHJlc3Qgb2YgdGhlIG9wZXJhdGlvbnMgKHRob3NlIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgZmxvdylcclxuICAgICAgICAgIHRoaXMuX3Rhc2suc2V0VXNlTG9vcFN0YWNrKGRlcHRoID4gMCk7XHJcbiAgICAgICAgICBhd2FpdCBvcGVyLmV4ZWN1dGUocmV0dXJuZWRGcm9tU2VydmVyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBpZiB0aGUgc2VydmVyIGhhdmUgZXhlY3V0ZWQgYSBibG9jayBvZiBvcGVyYXRpb25zIHRoZW4gZ2V0IHRoZSBuZXh0XHJcbiAgICAgIC8vIG9wZXJhdGlvbiBpbmRleFxyXG4gICAgICBpZiAoIWJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXIpIHtcclxuICAgICAgICBuZXh0T3BlcklkeCA9IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmdldE5leHRPcGVySWR4KG9wZXIsIHRydWUpO1xyXG4gICAgICAgIGlmIChuZXh0T3BlcklkeCA+IC0xKSB7XHJcbiAgICAgICAgICByZXR1cm5lZEZyb21TZXJ2ZXIgPSB0cnVlO1xyXG4gICAgICAgICAgaWYgKGluQmxvY2tJZilcclxuICAgICAgICAgICAgYmxvY2tJZlJldHVybmVkRnJvbVNlcnZlciA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgcmV0dXJuZWRGcm9tU2VydmVyID0gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJvdXRlT3BlcmF0aW9uRXhlY3V0ZWQpXHJcbiAgICAgIHJldHZhbHMgPSBuZXcgUmV0VmFscyhmYWxzZSwgdHJ1ZSk7XHJcbiAgICBlbHNlIGlmIChibG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyKVxyXG4gICAgICByZXR2YWxzID0gbmV3IFJldFZhbHMobmV4dE9wZXJJZHgsIHJldHVybmVkRnJvbVNlcnZlciwgYmxvY2tJZlJldHVybmVkRnJvbVNlcnZlcik7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHZhbHMgPSBudWxsO1xyXG4gICAgcmV0dXJuIHJldHZhbHM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBleGVjdXRhYmxlIEJsb2NrIChJRiBvciBFTFNFKVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdGFydEJsb2NrSWR4XCI+dGhlIGluZGV4IG9mIHRoZSBCbG9jayBJRjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJlbmRJZHhcIj50aGUgQmxvY2sgRW5kIEluZGV4IG9mIHRoZSBCbG9jayBJRjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPlRoZSBpbmRleCBvZiB0aGUgYmxvY2sgKElGIG9yIEVMU0Ugb3IgbmV4dCBFTFNFIC4uLil0aGF0IGNhbiBiZSBleGVjdXRlZC5cclxuICAvLy8gICBJZiBubyBibG9ja3MgY2FuIGJlIGV4ZWN1dGVkLCByZXR1cm4gLTFcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0U2lnbmlmaWNhbnRCbG9jayhzdGFydEJsb2NrSWR4OiBudW1iZXIsIGVuZElkeDogbnVtYmVyKTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgIGxldCByZXRJZHg6IG51bWJlciA9IC0xO1xyXG5cclxuICAgIHdoaWxlIChzdGFydEJsb2NrSWR4IDwgZW5kSWR4KSB7XHJcbiAgICAgIGxldCBvcGVyOiBPcGVyYXRpb24gPSB0aGlzLl9vcGVyYXRpb25UYWIuZ2V0T3BlcmF0aW9uKHN0YXJ0QmxvY2tJZHgpO1xyXG4gICAgICBsZXQgb3BlclR5cGU6IG51bWJlciA9IG9wZXIuZ2V0VHlwZSgpO1xyXG5cclxuICAgICAgaWYgKG9wZXJUeXBlICE9PSBDb25zdEludGVyZmFjZS5NR19PUEVSX0JMT0NLICYmIG9wZXJUeXBlICE9PSBDb25zdEludGVyZmFjZS5NR19PUEVSX0VMU0UgJiYgb3BlclR5cGUgIT09IENvbnN0SW50ZXJmYWNlLk1HX09QRVJfU0VSVkVSKVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgaWYgKGF3YWl0IG9wZXIuZXhlY3V0ZShmYWxzZSkpIHtcclxuICAgICAgICByZXRJZHggPSBzdGFydEJsb2NrSWR4O1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBzdGFydEJsb2NrSWR4ID0gb3Blci5nZXRCbG9ja0Nsb3NlKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0SWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgaWR4IG9mIHRoZSBCbG9jayBJRlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJlbmRJZHhcIj4tLS0gdGhlIGluZGV4IG9mIHRoZSBCbG9jayBFbmRcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IC0tLSBUaGUgaW5kZXggb2YgdGhlIGJsb2NrIElGIHdob3NlIEJsb2NrRW5kIElkeCBtYXRjaGVzIHdpdGggdGhlIGVuZElkeFxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBnZXRTdGFydEJsb2NrSWR4QnlFbmQoZW5kSWR4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IHJldElkeDogbnVtYmVyID0gLTE7XHJcbiAgICBsZXQgZm91bmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBqOiBudW1iZXI7XHJcbiAgICBmb3IgKGogPSBlbmRJZHggLSAxOyBqID49IDAgJiYgIWZvdW5kOyBqLS0pIHtcclxuICAgICAgbGV0IG9wZXI6IE9wZXJhdGlvbiA9IHRoaXMuX29wZXJhdGlvblRhYi5nZXRPcGVyYXRpb24oaik7XHJcbiAgICAgIGxldCBvcGVyVHlwZTogbnVtYmVyID0gb3Blci5nZXRUeXBlKCk7XHJcblxyXG4gICAgICBpZiAob3BlclR5cGUgPT09IENvbnN0SW50ZXJmYWNlLk1HX09QRVJfQkxPQ0sgfHwgb3BlclR5cGUgPT09IENvbnN0SW50ZXJmYWNlLk1HX09QRVJfTE9PUCkge1xyXG4gICAgICAgIGlmIChvcGVyLmdldEJsb2NrRW5kKCkgPT09IGVuZElkeCkge1xyXG4gICAgICAgICAgcmV0SWR4ID0gajtcclxuICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXRJZHg7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgaWR4IG9mIHRoZSBCbG9jayBJRlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJlbHNlSWR4XCI+LS0tIHRoZSBpbmRleCBvZiB0aGUgQmxvY2sgRWxzZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gLS0tIFRoZSBpbmRleCBvZiB0aGUgYmxvY2sgSUYgd2hvc2UgQmxvY2tFbmQgSWR4IG1hdGNoZXMgd2l0aCB0aGUgZW5kSWR4XHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldFN0YXJ0QmxvY2tJZHhCeUVsc2UoZWxzZUlkeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCByZXRJZHg6IG51bWJlciA9IC0xO1xyXG4gICAgbGV0IGZvdW5kOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgZWxzZUJsb2NrRW5kOiBudW1iZXIgPSB0aGlzLl9vcGVyYXRpb25UYWIuZ2V0T3BlcmF0aW9uKGVsc2VJZHgpLmdldEJsb2NrRW5kKCk7XHJcbiAgICBsZXQgajogbnVtYmVyO1xyXG4gICAgZm9yIChqID0gZWxzZUlkeCAtIDE7IGogPj0gMCAmJiAhZm91bmQ7IGotLSkge1xyXG4gICAgICBsZXQgb3BlcjogT3BlcmF0aW9uID0gdGhpcy5fb3BlcmF0aW9uVGFiLmdldE9wZXJhdGlvbihqKTtcclxuICAgICAgbGV0IG9wZXJUeXBlOiBudW1iZXIgPSBvcGVyLmdldFR5cGUoKTtcclxuXHJcbiAgICAgIGlmIChvcGVyVHlwZSA9PT0gQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9CTE9DSykge1xyXG4gICAgICAgIGlmIChvcGVyLmdldEJsb2NrRW5kKCkgPT09IGVsc2VCbG9ja0VuZCkge1xyXG4gICAgICAgICAgcmV0SWR4ID0gajtcclxuICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXRJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBpbmRleCBvZiB0aGUgQmxvY2sgSUYgb3IgRWxzZSBhY2NvcmRpbmcgdG8gdGhlIGluZGV4IG9mIG9uZSBvZiB0aGUgb2Ygb3BlcmF0aW9ucyBpbiBpdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJibG9ja09wZXJJZHhcIj4tLS0gaW5kZXggb2YgdGhlIGlmIGJsb2NrIGZvciB3aGljaCB3ZSBoYXZlIHRvIGZpbmQgdGhlIGFwcHJvcHJpYXRlIGJsb2NrIHRvIGV4ZWN1dGVcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInNydnJPcGVySWR4XCI+LS0tIHRoZSBzZXJ2ZXIgaWQgb2YgdGhlIG5leHQgb3BlcmF0aW9uIHdoaWNoIHRoZSBjbGllbnQgc2hvdWxkIGV4ZWN1dGVcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IC0tLSBUaGUgaW5kZXggb2YgdGhlIGJsb2NrIElGIG9yIEVsc2Ugd2hpY2ggaG9sZCB0aGUgb3BlcmF0aW9uIHdoaWNoIG9wZXJJZHggaXMgaXRzIGluZGV4XHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldFN0YXJ0QmxvY2tJZklkeEJ5T3BlcihibG9ja09wZXJJZHg6IG51bWJlciwgc3J2ck9wZXJJZHg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgcmV0SWR4OiBudW1iZXIgPSAtMTtcclxuICAgIGxldCBmb3VuZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGo6IG51bWJlciA9IHRoaXMuX29wZXJhdGlvblRhYi5zZXJ2ZXJJZDJvcGVySWR4KHNydnJPcGVySWR4LCBibG9ja09wZXJJZHgpIC0gMTtcclxuXHJcbiAgICBpZiAoaiA9PT0gLTIpIHtcclxuICAgICAgaiA9IHRoaXMuX29wZXJhdGlvblRhYi5zZXJ2ZXJJZDJGb2xsb3dpbmdPcGVySWR4KHNydnJPcGVySWR4LCBibG9ja09wZXJJZHgpIC0gMTtcclxuICAgIH1cclxuXHJcbiAgICB3aGlsZSAoaiA+PSAwICYmICFmb3VuZCkge1xyXG4gICAgICBsZXQgb3BlcjogT3BlcmF0aW9uID0gdGhpcy5fb3BlcmF0aW9uVGFiLmdldE9wZXJhdGlvbihqKTtcclxuICAgICAgbGV0IG9wZXJUeXBlOiBudW1iZXIgPSBvcGVyLmdldFR5cGUoKTtcclxuICAgICAgaWYgKG9wZXJUeXBlID09PSBDb25zdEludGVyZmFjZS5NR19PUEVSX0JMT0NLKSB7XHJcbiAgICAgICAgaWYgKGogPT09IGJsb2NrT3BlcklkeCkge1xyXG4gICAgICAgICAgcmV0SWR4ID0gajtcclxuICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgai0tO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKG9wZXJUeXBlID09PSBDb25zdEludGVyZmFjZS5NR19PUEVSX0VMU0UpIHtcclxuICAgICAgICBsZXQgYmxvY2tTdHJ0OiBudW1iZXIgPSB0aGlzLmdldFN0YXJ0QmxvY2tJZHhCeUVsc2Uoaik7XHJcbiAgICAgICAgaWYgKGJsb2NrU3RydCA9PT0gYmxvY2tPcGVySWR4KSB7XHJcbiAgICAgICAgICByZXRJZHggPSBqO1xyXG4gICAgICAgICAgZm91bmQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBqID0gYmxvY2tTdHJ0IC0gMTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChvcGVyVHlwZSA9PT0gQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9FTkRCTE9DSylcclxuICAgICAgICBqID0gdGhpcy5nZXRTdGFydEJsb2NrSWR4QnlFbmQoaikgLSAxO1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgai0tO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldElkeDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBsZXZlbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0TGV2ZWwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9sZXZlbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIGV2ZW50IG9mIHRoaXMgaGFuZGxlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0RXZlbnQoKTogRXZlbnQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2V2dDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIElkIG9mIHRoZSBldmVudCBoYW5kbGVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRJZCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGUgaGFuZGxlciBpcyBlbmFibGVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyBpc0VuYWJsZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fZW5hYmxlZEV4cC5nZXRWYWwoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXNldCB0aGUgdmFsdWVzIG9mIHRoZSBsb2NhbCB2YXJpYWJsZXMgdXNpbmcgdGhlIGFyZ3VtZW50IHZhbHVlcyBvciB0aGUgZGVmYXVsdFxyXG4gIC8vLyAgIHZhbHVlcyBvciB0aGUgaW5pdCBleHByZXNzaW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImFyZ3NcIj50aGUgYXJndW1lbnRzIGxpc3QgPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIHJlc2V0TG9jYWxWYXJpYWJsZXMoYXJnczogQXJndW1lbnRzTGlzdCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGR2OiBEYXRhVmlldyA9IDxEYXRhVmlldz50aGlzLl90YXNrLkRhdGFWaWV3O1xyXG4gICAgbGV0IGFyZ0lkeDogbnVtYmVyID0gMDtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBmb3IgKGxldCBmaWVsZElkeDogbnVtYmVyID0gdGhpcy5fZHZQb3M7IGZpZWxkSWR4IDwgdGhpcy5fZHZQb3MgKyB0aGlzLl9kdkxlbjsgZmllbGRJZHgrKykge1xyXG4gICAgICAgIGxldCBhRmllbGQ6IEZpZWxkQmFzZSA9IDxGaWVsZEJhc2U+ZHYuZ2V0RmllbGQoZmllbGRJZHgpO1xyXG4gICAgICAgIGxldCB2YXJJc1Bhcm06IGJvb2xlYW4gPSAhdGhpcy5faGFzUGFyYW1ldGVycyB8fCBhRmllbGQuaXNQYXJhbSgpO1xyXG5cclxuICAgICAgICAvLyBjaGVjayBpZiB0aGUgZmllbGQgc2hvdWxkIGdldCBpdHMgdmFsdWUgZnJvbSBhbiBhcmd1bWVudFxyXG4gICAgICAgIGlmICgoYXJncyAhPT0gbnVsbCAmJiBhcmdJZHggPCBhcmdzLmdldFNpemUoKSkgJiYgdmFySXNQYXJtKSB7XHJcbiAgICAgICAgICBpZiAoIWFyZ3MuZ2V0QXJnKGFyZ0lkeCkuc2tpcEFyZygpKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGFyZ3MuZ2V0QXJnKGFyZ0lkeCkuc2V0VmFsdWVUb0ZpZWxkKGFGaWVsZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgYUZpZWxkLmludmFsaWRhdGUodHJ1ZSwgRmllbGRCYXNlLkNMRUFSX0ZMQUdTKTtcclxuICAgICAgICAgICAgYXdhaXQgYUZpZWxkLmNvbXB1dGUoZmFsc2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYXJnSWR4Kys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgYUZpZWxkLmludmFsaWRhdGUodHJ1ZSwgRmllbGRCYXNlLkNMRUFSX0ZMQUdTKTtcclxuICAgICAgICAgIGF3YWl0IGFGaWVsZC5jb21wdXRlKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgYUZpZWxkLnVwZGF0ZURpc3BsYXkoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGV4Y2VwdGlvbikge1xyXG4gICAgICB0aHJvdyBleGNlcHRpb247XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIHRoZSByZXN1bHQgdmFsdWVzIHRvIHRoZSBmaWVsZCBhcmd1bWVudHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYXJnc1wiPnRoZSBhcmd1bWVudHMgbGlzdCA8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0QXJnVmFsc0Zyb21GbGRzKGFyZ3M6IEFyZ3VtZW50c0xpc3QpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBkdjogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGhpcy5fdGFzay5EYXRhVmlldztcclxuICAgIGxldCBrOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IGo6IG51bWJlcjtcclxuXHJcbiAgICBmb3IgKGogPSB0aGlzLl9kdlBvczsgaiA8IHRoaXMuX2R2UG9zICsgdGhpcy5fZHZMZW4gJiYgayA8IGFyZ3MuZ2V0U2l6ZSgpOyBqKyspIHtcclxuICAgICAgbGV0IGFGaWVsZDogRmllbGRCYXNlID0gPEZpZWxkQmFzZT5kdi5nZXRGaWVsZChqKTtcclxuICAgICAgaWYgKCF0aGlzLl9oYXNQYXJhbWV0ZXJzIHx8IGFGaWVsZC5pc1BhcmFtKCkpIHtcclxuICAgICAgICBsZXQgYXJnOiBBcmd1bWVudCA9IGFyZ3MuZ2V0QXJnKGspO1xyXG4gICAgICAgIGlmIChhcmcuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5BUkdfVFlQRV9GSUVMRCkge1xyXG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSB0aGUgUGFyYW1cclxuICAgICAgICAgIGxldCBhcmdGbGQ6IEZpZWxkQmFzZSA9IDxGaWVsZEJhc2U+YXJnLmdldEZpZWxkKCk7XHJcblxyXG4gICAgICAgICAgLy8gQSBoYW5kbGVyIGNhbiBiZSBjYWxsZWQgZWl0aGVyIGZyb20gdGhlIHNhbWUgdGFzayAob2YgdGhlIGhhbmRsZXIpIG9yIGZyb20gYVxyXG4gICAgICAgICAgLy8gdGFzayBsb3dlciBkb3duIGluIHRoZSBoaWVyYXJjaHkuXHJcbiAgICAgICAgICAvLyBIZXJlIHdlIGFyZSBjb3B5aW5nIHZhbHVlIGZyb20gdGhlIGhhbmRsZXIgdGFzayB0byB0aGUgaW52b2tlciB0YXNrLlxyXG4gICAgICAgICAgLy8gQ29weWluZyBzaG91bGQgbm90IGJlIGRvbmUgaWYgYW55IG9uZSBvZiB0aGUgdGFzayBpcyBhYm9ydGluZy5cclxuICAgICAgICAgIC8vIEJ1dCBjaGVja2luZyBvbmx5IHRoZSBpbnZva2VyIHRhc2sncyBpc0Fib3J0aW5nIGlzIHN1ZmZpY2llbnQgaGVyZSBiZWNhdXNlLFxyXG4gICAgICAgICAgLy8gaXQgd2lsbCBiZSB0cnVlIGV2ZW4gaWYgdGhlIGhhbmRsZXIgdGFzayBpcyBhYm9ydGluZy5cclxuICAgICAgICAgIGlmIChhcmdGbGQuZ2V0VGFzaygpICE9PSBudWxsICYmICEoPFRhc2s+YXJnRmxkLmdldFRhc2soKSkuaXNBYm9ydGluZygpKSB7XHJcbiAgICAgICAgICAgIGxldCB2YWw6IHN0cmluZyA9IGFGaWVsZC5nZXRWYWx1ZShmYWxzZSk7XHJcbiAgICAgICAgICAgIGF3YWl0IGFyZ0ZsZC5zZXRWYWx1ZUFuZFN0YXJ0UmVjb21wdXRlKHZhbCwgYUZpZWxkLmlzTnVsbCgpLCB0cnVlLCBhRmllbGQuaXNNb2RpZmllZCgpLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIGF3YWl0IGFyZ0ZsZC51cGRhdGVEaXNwbGF5KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGsrKztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGhhbmRsZXIncyB0YXNrXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRUYXNrKCk6IFRhc2sge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Rhc2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgZXhwZWN0ZWQgYnkgdGhlIGhhbmRsZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFyZ3NNYXRjaChFeHBfcGFyYW1zOiBFeHBWYWxbXSk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGFyZ3NNYXRjaGVkOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIGxldCBkdjogRGF0YVZpZXcgPSA8RGF0YVZpZXc+dGhpcy5fdGFzay5EYXRhVmlldztcclxuICAgIGxldCBqOiBudW1iZXIgPSAwO1xyXG4gICAgbGV0IHBhcmFtQ291bnQ6IG51bWJlciA9IDA7XHJcblxyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gdGhpcy5fZHZQb3M7IGkgPCB0aGlzLl9kdlBvcyArIHRoaXMuX2R2TGVuOyBpKyspIHtcclxuICAgICAgbGV0IGZpZWxkOiBGaWVsZEJhc2UgPSA8RmllbGRCYXNlPmR2LmdldEZpZWxkKGkpO1xyXG4gICAgICBpZiAoZmllbGQuaXNQYXJhbSgpKSB7XHJcbiAgICAgICAgcGFyYW1Db3VudCsrO1xyXG4gICAgICAgIGlmIChqIDwgRXhwX3BhcmFtcy5sZW5ndGgpIHtcclxuICAgICAgICAgIGxldCBmaWVsZEF0dHI6IFN0b3JhZ2VBdHRyaWJ1dGUgPSBmaWVsZC5nZXRUeXBlKCk7XHJcbiAgICAgICAgICBsZXQgYXJnQXR0cjogU3RvcmFnZUF0dHJpYnV0ZSA9IEV4cF9wYXJhbXNbal0uQXR0cjtcclxuXHJcblxyXG4gICAgICAgICAgLy8gYXJndW1lbnQgYW5kIHBhcmFtZXRlciB3aWxsIG5vdCBtYXRjaCBpZiA6XHJcbiAgICAgICAgICAvLyAxLiBUaGV5IGFyZSBub3Qgb2YgdGhlIHNhbWUgdHlwZVxyXG4gICAgICAgICAgLy8gMi4gVGhleSBDYW5ub3QgYmUgY2FzdCAoYWxwaGEgY2FuIGJlIGNhc3QgdG8gdW5pY29kZSlcclxuICAgICAgICAgIC8vIDMuIEFsbCB0aG9zZSBhcHBseSBpZiB0aGUgcGFyYW1ldGVyIGlzIG5vdCBudWxsLiBpZiB0aGUgcGFyYW0gdmFsIGlzIG51bGwgaXQgY2FuIGdvIGludG8gYW55IHR5cGUgb2YgcGFyYW1ldGVyLlxyXG4gICAgICAgICAgaWYgKCFFeHBfcGFyYW1zW2pdLklzTnVsbCAmJiAhU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLmlzVGhlU2FtZVR5cGUoZmllbGRBdHRyLCBhcmdBdHRyKSAmJiAhU3RvcmFnZUF0dHJpYnV0ZUNoZWNrLlN0b3JhZ2VGbGRBbHBoYVVuaWNvZGVPckJsb2IoZmllbGRBdHRyLCBhcmdBdHRyKSkge1xyXG4gICAgICAgICAgICBhcmdzTWF0Y2hlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGorKztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAocGFyYW1Db3VudCAhPT0gRXhwX3BhcmFtcy5sZW5ndGgpIHtcclxuICAgICAgYXJnc01hdGNoZWQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiBhcmdzTWF0Y2hlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBPcGVyYXRpb25UYWJsZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0T3BlcmF0aW9uVGFiKCk6IE9wZXJhdGlvblRhYmxlIHtcclxuICAgIHJldHVybiB0aGlzLl9vcGVyYXRpb25UYWI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEluIGNhc2Ugb2YgQ29udHJvbCBoZWFkZXJzLCByZXR1cm4gY29udHJvbCBuYW1lXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRDb250cm9sTmFtZUZvckNvbnRyb2xIZWFkZXIoKTogc3RyaW5nIHtcclxuICAgIGlmKHRoaXMuZ2V0RXZlbnQoKS5nZXRUeXBlKCkgPT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCkge1xyXG5cclxuICAgICAgLy8gUmV0dXJuIHRoZSBjb250cm9sIG5hbWUgZm9yIENvbnRyb2wgSGVhZGVyc1xyXG4gICAgICBpZiAodGhpcy5nZXRFdmVudCgpLmlzQ29udHJvbEhlYWRlcigpICYmICFpc051bGxPclVuZGVmaW5lZCh0aGlzLl9jdHJsKSlcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRDdHJsTmFtZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIE5TdHJpbmcuRW1wdHk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEluIGNhc2Ugb2YgVmFyaWFibGUgaGVhZGVycywgcmV0dXJuIGZpZWxkIG5hbWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFZhck5hbWVGb3JWYXJpYWJsZUhlYWRlcigpOiBzdHJpbmcge1xyXG4gICAgLy8gUmV0dXJuIHRoZSBGaWVsZCBuYW1lIGZvciBWYXJpYWJsZSBIZWFkZXJzXHJcbiAgIGlmICh0aGlzLmdldEV2ZW50KCkuaXNWYXJpYWJsZUhlYWRlcigpICYmICFpc051bGxPclVuZGVmaW5lZCh0aGlzLl9oYW5kbGVyRmxkKSlcclxuICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZXJGbGQuZ2V0VmFyTmFtZSgpLnRvVXBwZXJDYXNlKCk7XHJcblxyXG4gICByZXR1cm4gTlN0cmluZy5FbXB0eTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmV0dXJuIHRoZSBldmVudCBoYW5kbGVyIGluZm9ybWF0aW9uIHRvIGJlIGRpc3BsYXllZCBpbiBjYXNlIG9mICdSZXF1ZXN0SW5mbycgbG9nIGxldmVsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRFdmVudEhhbmRsZXJJbmZvKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgZXZlbnREZXNjcmlwdGlvbjogU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7XHJcblxyXG4gICAgdGhpcy5nZXRFdmVudCgpLkFwcGVuZERlc2NyaXB0aW9uKGV2ZW50RGVzY3JpcHRpb24pO1xyXG5cclxuICAgIC8vIEFwcGVuZCBjb250cm9sL3ZhcmlhYmxlIG5hbWUgaW4gQ29udHJvbC9WYXJpYWJsZSBoZWFkZXJzXHJcbiAgICBsZXQgaGVhZGVyQWRkaXRpb25hbEluZm86IHN0cmluZyA9IHRoaXMuZ2V0Q29udHJvbE5hbWVGb3JDb250cm9sSGVhZGVyKCkgKyB0aGlzLmdldFZhck5hbWVGb3JWYXJpYWJsZUhlYWRlcigpO1xyXG5cclxuICAgIGV2ZW50RGVzY3JpcHRpb24uQXBwZW5kKGhlYWRlckFkZGl0aW9uYWxJbmZvKTtcclxuXHJcbiAgICAvLyBGb3Igc29tZSBoZWFkZXJzIGxpa2UgUlAvVFAsIHRoZSBldmVudCBkZXNjcmlwdGlvbiBpcyBlbXB0eS5cclxuICAgIC8vIEZvciBvdGhlcnMgZW1wdHkgc3BhY2Ugc2hvdWxkIGJlIGFkZGVkIGJldHdlZW4gZXZlbnQgdHlwZSBhbmQgZGVzY3JpcHRpb24uXHJcbiAgICAvLyBUaGlzIGlzIGRvbmUgdG8gYXZvaWQgdW5uZWNlc3NhcnkgYmxhbmsgc3BhY2UgYXQgdGhlIGVuZCBvZiB0aGUgZXZlbnQgaGFuZGxlciB0eXBlXHJcbiAgICBpZighTlN0cmluZy5Jc051bGxPckVtcHR5KGV2ZW50RGVzY3JpcHRpb24udG9TdHJpbmcoKSkpXHJcbiAgICAgIGV2ZW50RGVzY3JpcHRpb24gPSBuZXcgU3RyaW5nQnVpbGRlcignICcgKyBldmVudERlc2NyaXB0aW9uLnRvU3RyaW5nKCksIGV2ZW50RGVzY3JpcHRpb24udG9TdHJpbmcoKS5sZW5ndGggKyAxKTtcclxuXHJcbiAgICByZXR1cm4gTlN0cmluZy5Gb3JtYXQoXCJIYW5kbGVyIHswfXsxfVwiLCB0aGlzLmdldEV2ZW50KCkuZ2V0RXZlbnRUeXBlKCksIGV2ZW50RGVzY3JpcHRpb24pO1xyXG4gIH1cclxuXHJcblxyXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gTlN0cmluZy5Gb3JtYXQoXCIoSGFuZGxlciBmb3IgezB9IG9uIHRhc2sgezF9LCBzY29wZSB7Mn0pXCIsIHRoaXMuX2V2dCwgdGhpcy5fdGFzaywgdGhpcy5fc2NvcGUpO1xyXG4gIH1cclxufVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICB1c2VkIHRvIHJldHVybiB0aGUgcmVzdWx0cyBvZiB0aGUgZXhlY3V0ZSgpIG1ldGhvZFxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgY2xhc3MgUmV0VmFscyAge1xyXG4gIEJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBFbmFibGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgTmV4dE9wZXJJZHg6IG51bWJlciA9IDA7XHJcbiAgUHJvcGFnYXRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgUmV0dXJuZWRGcm9tU2VydmVyOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHA6IGJvb2xlYW4sIGU6IGJvb2xlYW4pO1xyXG4gIGNvbnN0cnVjdG9yKG9wZXJJZHg6IG51bWJlciwgaW5SZXR1cm5lZEZyb21TZXJ2ZXI6IGJvb2xlYW4sIGluQmxvY2tJZlJldHVybmVkRnJvbVNlcnZlcjogYm9vbGVhbik7XHJcbiAgY29uc3RydWN0b3IocE9yT3BlcklkeDogYW55LCBlT3JJblJldHVybmVkRnJvbVNlcnZlcjogYm9vbGVhbiwgaW5CbG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyPzogYm9vbGVhbikge1xyXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpXHJcbiAgICAgIHRoaXMuY29uc3RydWN0b3JfMChwT3JPcGVySWR4LCBlT3JJblJldHVybmVkRnJvbVNlcnZlcik7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuY29uc3RydWN0b3JfMShwT3JPcGVySWR4LCBlT3JJblJldHVybmVkRnJvbVNlcnZlciwgaW5CbG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyKTtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInBcIj5wcm9wYWdhdGUgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImVcIj5lbmFibGVkIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcl8wKHA6IGJvb2xlYW4sIGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuUHJvcGFnYXRlID0gcDtcclxuICAgIHRoaXMuRW5hYmxlZCA9IGU7XHJcbiAgICB0aGlzLk5leHRPcGVySWR4ID0gMDtcclxuICAgIHRoaXMuUmV0dXJuZWRGcm9tU2VydmVyID0gZmFsc2U7XHJcbiAgICB0aGlzLkJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXIgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm9wZXJJZHhcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImluUmV0dXJuZWRGcm9tU2VydmVyXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpbkJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXJcIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMShvcGVySWR4OiBudW1iZXIsIGluUmV0dXJuZWRGcm9tU2VydmVyOiBib29sZWFuLCBpbkJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXI6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuUHJvcGFnYXRlID0gZmFsc2U7XHJcbiAgICB0aGlzLkVuYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5OZXh0T3BlcklkeCA9IG9wZXJJZHg7XHJcbiAgICB0aGlzLlJldHVybmVkRnJvbVNlcnZlciA9IGluUmV0dXJuZWRGcm9tU2VydmVyO1xyXG4gICAgdGhpcy5CbG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyID0gaW5CbG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyO1xyXG4gIH1cclxufVxyXG5cclxuIl19
|