@magic-xpa/engine 4.1100.0-dev4110.18 → 4.1100.0-dev4110.182
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 → esm2022}/index.mjs +188 -188
- package/{esm2020 → esm2022}/magic-xpa-engine.mjs +1 -1
- package/esm2022/src/AccessHelper.mjs +15 -0
- package/esm2022/src/ClientManager.mjs +399 -0
- package/esm2022/src/CommandsProcessorBase.mjs +56 -0
- package/esm2022/src/CommandsProcessorManager.mjs +26 -0
- package/esm2022/src/CommandsTable.mjs +162 -0
- package/esm2022/src/ConstInterface.mjs +516 -0
- package/{esm2020 → esm2022}/src/CurrentClientVersion.mjs +2 -2
- package/esm2022/src/FlowMonitorInterface.mjs +16 -0
- package/esm2022/src/GUIManager.mjs +62 -0
- package/esm2022/src/GlobalCommandsManager.mjs +34 -0
- package/esm2022/src/GuiEventsProcessor.mjs +154 -0
- package/{esm2020 → esm2022}/src/ICommandsTable.mjs +1 -1
- package/esm2022/src/ServerConfig.mjs +118 -0
- package/{esm2020 → esm2022}/src/bridge/IGuiEvent.mjs +19 -19
- package/{esm2020 → esm2022}/src/bridge/MagicBridge.mjs +40 -40
- package/esm2022/src/commands/ClientOriginatedCommandTaskTag.mjs +12 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/AddUserLocateDataViewCommand.mjs +8 -8
- package/{esm2020 → esm2022}/src/commands/ClientToServer/AddUserRangeDataviewCommand.mjs +9 -9
- package/{esm2020 → esm2022}/src/commands/ClientToServer/AddUserSortDataViewCommand.mjs +9 -9
- package/{esm2020 → esm2022}/src/commands/ClientToServer/BrowserEscEventCommand.mjs +23 -23
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ClientOriginatedCommand.mjs +14 -14
- package/esm2022/src/commands/ClientToServer/ClientOriginatedCommandSerializer.mjs +60 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ColumnSortEventCommand.mjs +26 -26
- package/esm2022/src/commands/ClientToServer/CommandFactory.mjs +260 -0
- package/esm2022/src/commands/ClientToServer/CommandSerializationHelper.mjs +67 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ComputeEventCommand.mjs +23 -23
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ContextTerminationEventCommand.mjs +20 -20
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ContextTimeoutResetCommand.mjs +19 -19
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ControlItemsRefreshCommand.mjs +8 -8
- package/esm2022/src/commands/ClientToServer/DataViewOutputCommand.mjs +13 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/DataviewCommand.mjs +44 -44
- package/esm2022/src/commands/ClientToServer/EvaluateCommand.mjs +37 -0
- package/esm2022/src/commands/ClientToServer/EventCommand.mjs +40 -0
- package/esm2022/src/commands/ClientToServer/ExecOperCommand.mjs +67 -0
- package/esm2022/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs +22 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/GlobalParamsQueryCommand.mjs +10 -10
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ICommandTaskTag.mjs +1 -1
- package/{esm2020 → esm2022}/src/commands/ClientToServer/IndexChangeEventCommand.mjs +21 -21
- package/esm2022/src/commands/ClientToServer/IniputForceWriteCommand.mjs +23 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/NonReversibleExitEventCommand.mjs +23 -23
- package/{esm2020 → esm2022}/src/commands/ClientToServer/QueryCommand.mjs +20 -20
- package/esm2022/src/commands/ClientToServer/RecomputeCommand.mjs +27 -0
- package/esm2022/src/commands/ClientToServer/RefreshEventCommand.mjs +27 -0
- package/esm2022/src/commands/ClientToServer/RefreshScreenEventCommand.mjs +24 -0
- package/esm2022/src/commands/ClientToServer/RollbackEventCommand.mjs +40 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/SelectProgramCommand.mjs +14 -14
- package/{esm2020 → esm2022}/src/commands/ClientToServer/SetTransactionStateDataviewCommand.mjs +9 -9
- package/{esm2020 → esm2022}/src/commands/ClientToServer/SubformOpenEventCommand.mjs +21 -21
- package/esm2022/src/commands/ClientToServer/SubformRefreshEventCommand.mjs +24 -0
- package/esm2022/src/commands/ClientToServer/TransactionCommand.mjs +30 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/UnloadCommand.mjs +14 -14
- package/esm2022/src/commands/ClientToServer/WriteMessageToServerLogCommand.mjs +18 -0
- package/esm2022/src/commands/DataViewCommandBase.mjs +8 -0
- package/{esm2020 → esm2022}/src/commands/IClientCommand.mjs +1 -1
- package/esm2022/src/commands/IClientTargetedCommand.mjs +13 -0
- package/{esm2020 → esm2022}/src/commands/IClientToServerCommandInfo.mjs +1 -1
- package/esm2022/src/commands/ServerToClient/AbortCommand.mjs +65 -0
- package/{esm2020 → esm2022}/src/commands/ServerToClient/AddLocateCommand.mjs +21 -21
- package/esm2022/src/commands/ServerToClient/AddRangeCommand.mjs +62 -0
- package/esm2022/src/commands/ServerToClient/AddSortCommand.mjs +33 -0
- package/esm2022/src/commands/ServerToClient/ClientRefreshCommand.mjs +25 -0
- package/esm2022/src/commands/ServerToClient/ClientTargetedCommandBase.mjs +24 -0
- package/esm2022/src/commands/ServerToClient/EnhancedVerifyCommand.mjs +45 -0
- package/esm2022/src/commands/ServerToClient/OpenURLCommand.mjs +221 -0
- package/{esm2020 → esm2022}/src/commands/ServerToClient/ResetLocateCommand.mjs +14 -14
- package/{esm2020 → esm2022}/src/commands/ServerToClient/ResetRangeCommand.mjs +14 -14
- package/{esm2020 → esm2022}/src/commands/ServerToClient/ResetSortCommand.mjs +14 -14
- package/esm2022/src/commands/ServerToClient/ResultCommand.mjs +37 -0
- package/esm2022/src/commands/ServerToClient/VerifyCommand.mjs +83 -0
- package/esm2022/src/commands/ServerToClient/XMLBasedCommandBuilder.mjs +132 -0
- package/{esm2020 → esm2022}/src/communications/IConnectionStateManager.mjs +1 -1
- package/esm2022/src/communications/InteractiveCommunicationsFailureHandler.mjs +15 -0
- package/{esm2020 → esm2022}/src/data/DataSourceIdKey.mjs +2 -2
- package/esm2022/src/data/DataView.mjs +1611 -0
- package/{esm2020 → esm2022}/src/data/DataViewBase.mjs +3 -3
- package/esm2022/src/data/DataviewManager.mjs +28 -0
- package/esm2022/src/data/DataviewManagerBase.mjs +15 -0
- package/esm2022/src/data/DvCache.mjs +67 -0
- package/esm2022/src/data/Field.mjs +646 -0
- package/esm2022/src/data/FieldBase.mjs +15 -0
- package/esm2022/src/data/FieldsTable.mjs +103 -0
- package/{esm2020 → esm2022}/src/data/IRecordsTable.mjs +1 -1
- package/esm2022/src/data/Key.mjs +88 -0
- package/esm2022/src/data/Record.mjs +866 -0
- package/{esm2020 → esm2022}/src/data/RecordOutOfDataViewException.mjs +15 -15
- package/esm2022/src/data/RecordsTable.mjs +267 -0
- package/esm2022/src/data/TaskTransactionManager.mjs +103 -0
- package/esm2022/src/data/XMLBasedDcValuesBuilder.mjs +74 -0
- package/{esm2020 → esm2022}/src/enums.mjs +23 -23
- package/esm2022/src/env/EnvVariablesTable.mjs +340 -0
- package/esm2022/src/env/Environment.mjs +487 -0
- package/{esm2020 → esm2022}/src/env/ILanguageData.mjs +1 -1
- package/esm2022/src/env/LanguageData.mjs +226 -0
- package/esm2022/src/env/MirrorString.mjs +65 -0
- package/esm2022/src/event/ActionManager.mjs +91 -0
- package/esm2022/src/event/Event.mjs +1333 -0
- package/esm2022/src/event/EventHandler.mjs +766 -0
- package/esm2022/src/event/EventHandlerPosition.mjs +204 -0
- package/esm2022/src/event/EventsManager.mjs +2975 -0
- package/{esm2020 → esm2022}/src/event/IEventsManager.mjs +6 -6
- package/esm2022/src/event/RunTimeEvent.mjs +392 -0
- package/{esm2020 → esm2022}/src/event/RunTimeEventBase.mjs +3 -3
- package/esm2022/src/event/UserEventsTable.mjs +47 -0
- package/esm2022/src/exp/ExpTable.mjs +57 -0
- package/esm2022/src/exp/Expression.mjs +200 -0
- package/esm2022/src/exp/ExpressionDict.mjs +727 -0
- package/esm2022/src/exp/ExpressionEvaluator.mjs +4206 -0
- package/esm2022/src/exp/ExpressionLocalJpn.mjs +314 -0
- package/esm2022/src/exp/GlobalParamsTable.mjs +85 -0
- package/esm2022/src/exp/YesNoExp.mjs +36 -0
- package/esm2022/src/gui/CreatedFormVector.mjs +23 -0
- package/esm2022/src/gui/FormsTable.mjs +66 -0
- package/esm2022/src/gui/MgControl.mjs +363 -0
- package/esm2022/src/gui/MgForm.mjs +1181 -0
- package/esm2022/src/http/HttpManager.mjs +97 -0
- package/esm2022/src/http/client/HttpClientAsync.mjs +68 -0
- package/esm2022/src/http/client/HttpClientBase.mjs +132 -0
- package/esm2022/src/http/client/HttpClientEvents.mjs +39 -0
- package/esm2022/src/http/client/HttpClientSync.mjs +42 -0
- package/esm2022/src/http/client/HttpUtility.mjs +84 -0
- package/{esm2020 → esm2022}/src/http/client/ICommunicationsFailureHandler.mjs +1 -1
- package/esm2022/src/remote/AddUserLocateRemoteDataViewCommand.mjs +18 -0
- package/esm2022/src/remote/AddUserRangeRemoteDataViewCommand.mjs +18 -0
- package/esm2022/src/remote/AddUserSortRemoteDataViewCommand.mjs +18 -0
- package/esm2022/src/remote/RemoteCommandsProcessor.mjs +882 -0
- package/esm2022/src/remote/RemoteControlItemsRefreshCommand.mjs +25 -0
- package/esm2022/src/remote/RemoteDataViewCommandBase.mjs +24 -0
- package/esm2022/src/remote/RemoteDataViewCommandFactory.mjs +61 -0
- package/{esm2020 → esm2022}/src/remote/RemoteDataViewCommandUpdateNonModifiable.mjs +15 -15
- package/{esm2020 → esm2022}/src/remote/RemoteDataviewManager.mjs +17 -17
- package/{esm2020 → esm2022}/src/remote/RemoteInitDataViewCommand.mjs +10 -10
- package/esm2022/src/remote/ResetUserLocateRemoteDataviewCommand.mjs +17 -0
- package/{esm2020 → esm2022}/src/remote/ResetUserRangeRemoteDataviewCommand.mjs +12 -12
- package/esm2022/src/remote/ResetUserSortRemoteDataviewCommand.mjs +16 -0
- package/esm2022/src/remote/ServerError.mjs +40 -0
- package/esm2022/src/remote/SetTransactionStateRemoteDataViewCommand.mjs +20 -0
- package/esm2022/src/rt/Argument.mjs +265 -0
- package/esm2022/src/rt/ArgumentsList.mjs +103 -0
- package/esm2022/src/rt/Boundary.mjs +152 -0
- package/esm2022/src/rt/CompMainPrgTable.mjs +63 -0
- package/{esm2020 → esm2022}/src/rt/DataviewHeaderBase.mjs +98 -96
- package/{esm2020 → esm2022}/src/rt/DataviewHeaderFactory.mjs +6 -6
- package/esm2022/src/rt/DataviewHeaders.mjs +53 -0
- package/esm2022/src/rt/DataviewHeadersSaxHandler.mjs +38 -0
- package/esm2022/src/rt/ExecutionStack.mjs +94 -0
- package/{esm2020 → esm2022}/src/rt/ExecutionStackEntry.mjs +17 -17
- package/esm2022/src/rt/HandlersTable.mjs +96 -0
- package/{esm2020 → esm2022}/src/rt/IDataSourceViewDefinition.mjs +1 -1
- package/{esm2020 → esm2022}/src/rt/IDataviewHeader.mjs +1 -1
- package/{esm2020 → esm2022}/src/rt/IResultValue.mjs +1 -1
- package/esm2022/src/rt/LastFocusedManager.mjs +65 -0
- package/esm2022/src/rt/Operation.mjs +735 -0
- package/esm2022/src/rt/OperationTable.mjs +67 -0
- package/esm2022/src/rt/Recompute.mjs +355 -0
- package/esm2022/src/rt/RecomputeTable.mjs +63 -0
- package/esm2022/src/rt/RemoteDataviewHeader.mjs +108 -0
- package/esm2022/src/rt/ResultValue.mjs +10 -0
- package/esm2022/src/rt/TableCache.mjs +177 -0
- package/esm2022/src/rt/TableCacheManager.mjs +67 -0
- package/esm2022/src/rt/Transaction.mjs +53 -0
- package/esm2022/src/security/UserDetails.mjs +71 -0
- package/{esm2020 → esm2022}/src/tasks/IMGDataCollection.mjs +1 -1
- package/esm2022/src/tasks/MGData.mjs +552 -0
- package/esm2022/src/tasks/MGDataCollection.mjs +252 -0
- package/esm2022/src/tasks/RCTimer.mjs +63 -0
- package/esm2022/src/tasks/RemoteTaskService.mjs +45 -0
- package/esm2022/src/tasks/Task.mjs +2497 -0
- package/esm2022/src/tasks/TaskBase.mjs +83 -0
- package/esm2022/src/tasks/TaskServiceBase.mjs +25 -0
- package/esm2022/src/tasks/TasksTable.mjs +80 -0
- package/esm2022/src/tasks/sort/Sort.mjs +5 -0
- package/esm2022/src/tasks/sort/SortCollection.mjs +67 -0
- package/esm2022/src/util/ConstUtils.mjs +14 -0
- package/esm2022/src/util/FlowMonitorQueue.mjs +451 -0
- package/esm2022/src/util/HeapSort.mjs +70 -0
- package/{esm2020 → esm2022}/src/util/IMirrorXML.mjs +1 -1
- package/{esm2020 → esm2022}/src/util/IServerConfig.mjs +1 -1
- package/{esm2020 → esm2022}/src/util/MgBlockingQueue.mjs +1 -1
- package/esm2022/src/util/MgPriorityBlockingQueue.mjs +74 -0
- package/esm2022/src/util/MgPriorityQueue.mjs +66 -0
- package/{esm2020 → esm2022}/src/util/ParamParseResult.mjs +7 -7
- package/esm2022/src/util/PrmMap.mjs +152 -0
- package/esm2022/src/util/ReturnResult.mjs +46 -0
- package/esm2022/src/util/ReturnResultBase.mjs +18 -0
- package/esm2022/src/util/Scrambler.mjs +89 -0
- package/esm2022/src/util/UniqueIDUtils.mjs +13 -0
- package/esm2022/src/util/cookie.service.mjs +92 -0
- package/{fesm2020 → fesm2022}/magic-xpa-engine.mjs +29711 -29693
- package/fesm2022/magic-xpa-engine.mjs.map +1 -0
- package/index.d.ts +187 -187
- package/package.json +8 -14
- package/src/AccessHelper.d.ts +20 -20
- package/src/ClientManager.d.ts +32 -32
- package/src/CommandsProcessorBase.d.ts +23 -23
- package/src/CommandsProcessorManager.d.ts +6 -6
- package/src/CommandsTable.d.ts +22 -22
- package/src/ConstInterface.d.ts +515 -515
- package/src/CurrentClientVersion.d.ts +1 -1
- package/src/FlowMonitorInterface.d.ts +15 -15
- package/src/GUIManager.d.ts +17 -17
- package/src/GlobalCommandsManager.d.ts +17 -17
- package/src/GuiEventsProcessor.d.ts +24 -24
- package/src/ICommandsTable.d.ts +9 -9
- package/src/ServerConfig.d.ts +34 -34
- package/src/bridge/IGuiEvent.d.ts +19 -19
- package/src/bridge/MagicBridge.d.ts +16 -16
- package/src/commands/ClientOriginatedCommandTaskTag.d.ts +8 -8
- package/src/commands/ClientToServer/AddUserLocateDataViewCommand.d.ts +4 -4
- package/src/commands/ClientToServer/AddUserRangeDataviewCommand.d.ts +6 -6
- package/src/commands/ClientToServer/AddUserSortDataViewCommand.d.ts +6 -6
- package/src/commands/ClientToServer/BrowserEscEventCommand.d.ts +8 -8
- package/src/commands/ClientToServer/ClientOriginatedCommand.d.ts +8 -8
- package/src/commands/ClientToServer/ClientOriginatedCommandSerializer.d.ts +6 -6
- package/src/commands/ClientToServer/ColumnSortEventCommand.d.ts +10 -10
- package/src/commands/ClientToServer/CommandFactory.d.ts +64 -64
- package/src/commands/ClientToServer/CommandSerializationHelper.d.ts +20 -20
- package/src/commands/ClientToServer/ComputeEventCommand.d.ts +8 -8
- package/src/commands/ClientToServer/ContextTerminationEventCommand.d.ts +7 -7
- package/src/commands/ClientToServer/ContextTimeoutResetCommand.d.ts +7 -7
- package/src/commands/ClientToServer/ControlItemsRefreshCommand.d.ts +6 -6
- package/src/commands/ClientToServer/DataViewOutputCommand.d.ts +9 -9
- package/src/commands/ClientToServer/DataviewCommand.d.ts +32 -32
- package/src/commands/ClientToServer/EvaluateCommand.d.ts +15 -15
- package/src/commands/ClientToServer/EventCommand.d.ts +15 -15
- package/src/commands/ClientToServer/ExecOperCommand.d.ts +23 -23
- package/src/commands/ClientToServer/FetchDataControlValuesEventCommand.d.ts +8 -8
- package/src/commands/ClientToServer/GlobalParamsQueryCommand.d.ts +5 -5
- package/src/commands/ClientToServer/ICommandTaskTag.d.ts +3 -3
- package/src/commands/ClientToServer/IndexChangeEventCommand.d.ts +8 -8
- package/src/commands/ClientToServer/IniputForceWriteCommand.d.ts +10 -10
- package/src/commands/ClientToServer/NonReversibleExitEventCommand.d.ts +8 -8
- package/src/commands/ClientToServer/QueryCommand.d.ts +8 -8
- package/src/commands/ClientToServer/RecomputeCommand.d.ts +11 -11
- package/src/commands/ClientToServer/RefreshEventCommand.d.ts +12 -12
- package/src/commands/ClientToServer/RefreshScreenEventCommand.d.ts +10 -10
- package/src/commands/ClientToServer/RollbackEventCommand.d.ts +14 -14
- package/src/commands/ClientToServer/SelectProgramCommand.d.ts +6 -6
- package/src/commands/ClientToServer/SetTransactionStateDataviewCommand.d.ts +5 -5
- package/src/commands/ClientToServer/SubformOpenEventCommand.d.ts +8 -8
- package/src/commands/ClientToServer/SubformRefreshEventCommand.d.ts +9 -9
- package/src/commands/ClientToServer/TransactionCommand.d.ts +12 -12
- package/src/commands/ClientToServer/UnloadCommand.d.ts +7 -7
- package/src/commands/ClientToServer/WriteMessageToServerLogCommand.d.ts +6 -6
- package/src/commands/DataViewCommandBase.d.ts +6 -6
- package/src/commands/IClientCommand.d.ts +2 -2
- package/src/commands/IClientTargetedCommand.d.ts +12 -12
- package/src/commands/IClientToServerCommandInfo.d.ts +3 -3
- package/src/commands/ServerToClient/AbortCommand.d.ts +11 -11
- package/src/commands/ServerToClient/AddLocateCommand.d.ts +6 -6
- package/src/commands/ServerToClient/AddRangeCommand.d.ts +10 -10
- package/src/commands/ServerToClient/AddSortCommand.d.ts +9 -9
- package/src/commands/ServerToClient/ClientRefreshCommand.d.ts +7 -7
- package/src/commands/ServerToClient/ClientTargetedCommandBase.d.ts +12 -12
- package/src/commands/ServerToClient/EnhancedVerifyCommand.d.ts +13 -13
- package/src/commands/ServerToClient/OpenURLCommand.d.ts +21 -21
- package/src/commands/ServerToClient/ResetLocateCommand.d.ts +6 -6
- package/src/commands/ServerToClient/ResetRangeCommand.d.ts +6 -6
- package/src/commands/ServerToClient/ResetSortCommand.d.ts +6 -6
- package/src/commands/ServerToClient/ResultCommand.d.ts +10 -10
- package/src/commands/ServerToClient/VerifyCommand.d.ts +17 -17
- package/src/commands/ServerToClient/XMLBasedCommandBuilder.d.ts +11 -11
- package/src/communications/IConnectionStateManager.d.ts +4 -4
- package/src/communications/InteractiveCommunicationsFailureHandler.d.ts +6 -6
- package/src/data/DataSourceIdKey.d.ts +2 -2
- package/src/data/DataView.d.ts +162 -162
- package/src/data/DataViewBase.d.ts +12 -12
- package/src/data/DataviewManager.d.ts +14 -14
- package/src/data/DataviewManagerBase.d.ts +11 -11
- package/src/data/DvCache.d.ts +15 -15
- package/src/data/Field.d.ts +103 -103
- package/src/data/FieldBase.d.ts +23 -23
- package/src/data/FieldsTable.d.ts +27 -27
- package/src/data/IRecordsTable.d.ts +7 -7
- package/src/data/Key.d.ts +15 -15
- package/src/data/Record.d.ts +156 -156
- package/src/data/RecordOutOfDataViewException.d.ts +10 -10
- package/src/data/RecordsTable.d.ts +38 -38
- package/src/data/TaskTransactionManager.d.ts +17 -17
- package/src/data/XMLBasedDcValuesBuilder.d.ts +11 -11
- package/src/enums.d.ts +21 -21
- package/src/env/EnvVariablesTable.d.ts +17 -17
- package/src/env/Environment.d.ts +118 -118
- package/src/env/ILanguageData.d.ts +3 -3
- package/src/env/LanguageData.d.ts +20 -20
- package/src/env/MirrorString.d.ts +15 -15
- package/src/event/ActionManager.d.ts +14 -14
- package/src/event/Event.d.ts +79 -79
- package/src/event/EventHandler.d.ts +66 -66
- package/src/event/EventHandlerPosition.d.ts +25 -25
- package/src/event/EventsManager.d.ts +204 -204
- package/src/event/IEventsManager.d.ts +77 -77
- package/src/event/RunTimeEvent.d.ts +123 -123
- package/src/event/RunTimeEventBase.d.ts +5 -5
- package/src/event/UserEventsTable.d.ts +11 -11
- package/src/exp/ExpTable.d.ts +11 -11
- package/src/exp/Expression.d.ts +37 -37
- package/src/exp/ExpressionDict.d.ts +12 -12
- package/src/exp/ExpressionEvaluator.d.ts +198 -198
- package/src/exp/ExpressionLocalJpn.d.ts +18 -18
- package/src/exp/GlobalParamsTable.d.ts +19 -19
- package/src/exp/YesNoExp.d.ts +9 -9
- package/src/gui/CreatedFormVector.d.ts +10 -10
- package/src/gui/FormsTable.d.ts +15 -15
- package/src/gui/MgControl.d.ts +60 -60
- package/src/gui/MgForm.d.ts +93 -93
- package/src/http/HttpManager.d.ts +25 -25
- package/src/http/client/HttpClientAsync.d.ts +16 -16
- package/src/http/client/HttpClientBase.d.ts +30 -30
- package/src/http/client/HttpClientEvents.d.ts +18 -18
- package/src/http/client/HttpClientSync.d.ts +17 -17
- package/src/http/client/HttpUtility.d.ts +10 -10
- package/src/http/client/ICommunicationsFailureHandler.d.ts +5 -5
- package/src/remote/AddUserLocateRemoteDataViewCommand.d.ts +8 -8
- package/src/remote/AddUserRangeRemoteDataViewCommand.d.ts +8 -8
- package/src/remote/AddUserSortRemoteDataViewCommand.d.ts +8 -8
- package/src/remote/RemoteCommandsProcessor.d.ts +51 -51
- package/src/remote/RemoteControlItemsRefreshCommand.d.ts +8 -8
- package/src/remote/RemoteDataViewCommandBase.d.ts +10 -10
- package/src/remote/RemoteDataViewCommandFactory.d.ts +6 -6
- package/src/remote/RemoteDataViewCommandUpdateNonModifiable.d.ts +8 -8
- package/src/remote/RemoteDataviewManager.d.ts +9 -9
- package/src/remote/RemoteInitDataViewCommand.d.ts +7 -7
- package/src/remote/ResetUserLocateRemoteDataviewCommand.d.ts +7 -7
- package/src/remote/ResetUserRangeRemoteDataviewCommand.d.ts +7 -7
- package/src/remote/ResetUserSortRemoteDataviewCommand.d.ts +7 -7
- package/src/remote/ServerError.d.ts +16 -16
- package/src/remote/SetTransactionStateRemoteDataViewCommand.d.ts +8 -8
- package/src/rt/Argument.d.ts +36 -36
- package/src/rt/ArgumentsList.d.ts +24 -24
- package/src/rt/Boundary.d.ts +27 -27
- package/src/rt/CompMainPrgTable.d.ts +10 -10
- package/src/rt/DataviewHeaderBase.d.ts +34 -34
- package/src/rt/DataviewHeaderFactory.d.ts +5 -5
- package/src/rt/DataviewHeaders.d.ts +12 -12
- package/src/rt/DataviewHeadersSaxHandler.d.ts +10 -10
- package/src/rt/ExecutionStack.d.ts +22 -22
- package/src/rt/ExecutionStackEntry.d.ts +7 -7
- package/src/rt/HandlersTable.d.ts +19 -19
- package/src/rt/IDataSourceViewDefinition.d.ts +6 -6
- package/src/rt/IDataviewHeader.d.ts +10 -10
- package/src/rt/IResultValue.d.ts +4 -4
- package/src/rt/LastFocusedManager.d.ts +23 -23
- package/src/rt/Operation.d.ts +97 -97
- package/src/rt/OperationTable.d.ts +15 -15
- package/src/rt/Recompute.d.ts +41 -41
- package/src/rt/RecomputeTable.d.ts +9 -9
- package/src/rt/RemoteDataviewHeader.d.ts +14 -14
- package/src/rt/ResultValue.d.ts +7 -7
- package/src/rt/TableCache.d.ts +29 -29
- package/src/rt/TableCacheManager.d.ts +10 -10
- package/src/rt/Transaction.d.ts +23 -23
- package/src/security/UserDetails.d.ts +16 -16
- package/src/tasks/IMGDataCollection.d.ts +26 -26
- package/src/tasks/MGData.d.ts +63 -63
- package/src/tasks/MGDataCollection.d.ts +42 -42
- package/src/tasks/RCTimer.d.ts +13 -13
- package/src/tasks/RemoteTaskService.d.ts +16 -16
- package/src/tasks/Task.d.ts +312 -312
- package/src/tasks/TaskBase.d.ts +123 -123
- package/src/tasks/TaskServiceBase.d.ts +16 -16
- package/src/tasks/TasksTable.d.ts +21 -21
- package/src/tasks/sort/Sort.d.ts +4 -4
- package/src/tasks/sort/SortCollection.d.ts +11 -11
- package/src/util/ConstUtils.d.ts +3 -3
- package/src/util/FlowMonitorQueue.d.ts +70 -70
- package/src/util/HeapSort.d.ts +6 -6
- package/src/util/IMirrorXML.d.ts +6 -6
- package/src/util/IServerConfig.d.ts +11 -11
- package/src/util/MgBlockingQueue.d.ts +5 -5
- package/src/util/MgPriorityBlockingQueue.d.ts +17 -17
- package/src/util/MgPriorityQueue.d.ts +13 -13
- package/src/util/ParamParseResult.d.ts +6 -6
- package/src/util/PrmMap.d.ts +28 -28
- package/src/util/ReturnResult.d.ts +18 -18
- package/src/util/ReturnResultBase.d.ts +11 -11
- package/src/util/Scrambler.d.ts +10 -10
- package/src/util/UniqueIDUtils.d.ts +4 -4
- package/src/util/cookie.service.d.ts +8 -8
- package/esm2020/src/AccessHelper.mjs +0 -9
- package/esm2020/src/ClientManager.mjs +0 -399
- package/esm2020/src/CommandsProcessorBase.mjs +0 -58
- package/esm2020/src/CommandsProcessorManager.mjs +0 -26
- package/esm2020/src/CommandsTable.mjs +0 -162
- package/esm2020/src/ConstInterface.mjs +0 -516
- package/esm2020/src/FlowMonitorInterface.mjs +0 -16
- package/esm2020/src/GUIManager.mjs +0 -62
- package/esm2020/src/GlobalCommandsManager.mjs +0 -34
- package/esm2020/src/GuiEventsProcessor.mjs +0 -154
- package/esm2020/src/ServerConfig.mjs +0 -117
- package/esm2020/src/commands/ClientOriginatedCommandTaskTag.mjs +0 -11
- package/esm2020/src/commands/ClientToServer/ClientOriginatedCommandSerializer.mjs +0 -60
- package/esm2020/src/commands/ClientToServer/CommandFactory.mjs +0 -260
- package/esm2020/src/commands/ClientToServer/CommandSerializationHelper.mjs +0 -69
- package/esm2020/src/commands/ClientToServer/DataViewOutputCommand.mjs +0 -13
- package/esm2020/src/commands/ClientToServer/EvaluateCommand.mjs +0 -36
- package/esm2020/src/commands/ClientToServer/EventCommand.mjs +0 -40
- package/esm2020/src/commands/ClientToServer/ExecOperCommand.mjs +0 -67
- package/esm2020/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs +0 -22
- package/esm2020/src/commands/ClientToServer/IniputForceWriteCommand.mjs +0 -23
- package/esm2020/src/commands/ClientToServer/RecomputeCommand.mjs +0 -27
- package/esm2020/src/commands/ClientToServer/RefreshEventCommand.mjs +0 -27
- package/esm2020/src/commands/ClientToServer/RefreshScreenEventCommand.mjs +0 -24
- package/esm2020/src/commands/ClientToServer/RollbackEventCommand.mjs +0 -39
- package/esm2020/src/commands/ClientToServer/SubformRefreshEventCommand.mjs +0 -24
- package/esm2020/src/commands/ClientToServer/TransactionCommand.mjs +0 -28
- package/esm2020/src/commands/ClientToServer/WriteMessageToServerLogCommand.mjs +0 -18
- package/esm2020/src/commands/DataViewCommandBase.mjs +0 -10
- package/esm2020/src/commands/IClientTargetedCommand.mjs +0 -9
- package/esm2020/src/commands/ServerToClient/AbortCommand.mjs +0 -65
- package/esm2020/src/commands/ServerToClient/AddRangeCommand.mjs +0 -62
- package/esm2020/src/commands/ServerToClient/AddSortCommand.mjs +0 -33
- package/esm2020/src/commands/ServerToClient/ClientRefreshCommand.mjs +0 -25
- package/esm2020/src/commands/ServerToClient/ClientTargetedCommandBase.mjs +0 -27
- package/esm2020/src/commands/ServerToClient/EnhancedVerifyCommand.mjs +0 -45
- package/esm2020/src/commands/ServerToClient/OpenURLCommand.mjs +0 -221
- package/esm2020/src/commands/ServerToClient/ResultCommand.mjs +0 -37
- package/esm2020/src/commands/ServerToClient/VerifyCommand.mjs +0 -83
- package/esm2020/src/commands/ServerToClient/XMLBasedCommandBuilder.mjs +0 -132
- package/esm2020/src/communications/InteractiveCommunicationsFailureHandler.mjs +0 -17
- package/esm2020/src/data/DataView.mjs +0 -1610
- package/esm2020/src/data/DataviewManager.mjs +0 -28
- package/esm2020/src/data/DataviewManagerBase.mjs +0 -15
- package/esm2020/src/data/DvCache.mjs +0 -67
- package/esm2020/src/data/Field.mjs +0 -646
- package/esm2020/src/data/FieldBase.mjs +0 -18
- package/esm2020/src/data/FieldsTable.mjs +0 -103
- package/esm2020/src/data/Key.mjs +0 -88
- package/esm2020/src/data/Record.mjs +0 -846
- package/esm2020/src/data/RecordsTable.mjs +0 -267
- package/esm2020/src/data/TaskTransactionManager.mjs +0 -103
- package/esm2020/src/data/XMLBasedDcValuesBuilder.mjs +0 -74
- package/esm2020/src/env/EnvVariablesTable.mjs +0 -340
- package/esm2020/src/env/Environment.mjs +0 -489
- package/esm2020/src/env/LanguageData.mjs +0 -226
- package/esm2020/src/env/MirrorString.mjs +0 -65
- package/esm2020/src/event/ActionManager.mjs +0 -91
- package/esm2020/src/event/Event.mjs +0 -1333
- package/esm2020/src/event/EventHandler.mjs +0 -766
- package/esm2020/src/event/EventHandlerPosition.mjs +0 -204
- package/esm2020/src/event/EventsManager.mjs +0 -2975
- package/esm2020/src/event/RunTimeEvent.mjs +0 -392
- package/esm2020/src/event/UserEventsTable.mjs +0 -47
- package/esm2020/src/exp/ExpTable.mjs +0 -59
- package/esm2020/src/exp/Expression.mjs +0 -200
- package/esm2020/src/exp/ExpressionDict.mjs +0 -727
- package/esm2020/src/exp/ExpressionEvaluator.mjs +0 -4212
- package/esm2020/src/exp/ExpressionLocalJpn.mjs +0 -314
- package/esm2020/src/exp/GlobalParamsTable.mjs +0 -85
- package/esm2020/src/exp/YesNoExp.mjs +0 -36
- package/esm2020/src/gui/CreatedFormVector.mjs +0 -23
- package/esm2020/src/gui/FormsTable.mjs +0 -66
- package/esm2020/src/gui/MgControl.mjs +0 -353
- package/esm2020/src/gui/MgForm.mjs +0 -1181
- package/esm2020/src/http/HttpManager.mjs +0 -97
- package/esm2020/src/http/client/HttpClientAsync.mjs +0 -67
- package/esm2020/src/http/client/HttpClientBase.mjs +0 -132
- package/esm2020/src/http/client/HttpClientEvents.mjs +0 -39
- package/esm2020/src/http/client/HttpClientSync.mjs +0 -42
- package/esm2020/src/http/client/HttpUtility.mjs +0 -84
- package/esm2020/src/remote/AddUserLocateRemoteDataViewCommand.mjs +0 -18
- package/esm2020/src/remote/AddUserRangeRemoteDataViewCommand.mjs +0 -18
- package/esm2020/src/remote/AddUserSortRemoteDataViewCommand.mjs +0 -18
- package/esm2020/src/remote/RemoteCommandsProcessor.mjs +0 -880
- package/esm2020/src/remote/RemoteControlItemsRefreshCommand.mjs +0 -25
- package/esm2020/src/remote/RemoteDataViewCommandBase.mjs +0 -24
- package/esm2020/src/remote/RemoteDataViewCommandFactory.mjs +0 -61
- package/esm2020/src/remote/ResetUserLocateRemoteDataviewCommand.mjs +0 -17
- package/esm2020/src/remote/ResetUserSortRemoteDataviewCommand.mjs +0 -16
- package/esm2020/src/remote/ServerError.mjs +0 -40
- package/esm2020/src/remote/SetTransactionStateRemoteDataViewCommand.mjs +0 -20
- package/esm2020/src/rt/Argument.mjs +0 -265
- package/esm2020/src/rt/ArgumentsList.mjs +0 -103
- package/esm2020/src/rt/Boundary.mjs +0 -152
- package/esm2020/src/rt/CompMainPrgTable.mjs +0 -65
- package/esm2020/src/rt/DataviewHeaders.mjs +0 -53
- package/esm2020/src/rt/DataviewHeadersSaxHandler.mjs +0 -38
- package/esm2020/src/rt/ExecutionStack.mjs +0 -94
- package/esm2020/src/rt/HandlersTable.mjs +0 -96
- package/esm2020/src/rt/LastFocusedManager.mjs +0 -67
- package/esm2020/src/rt/Operation.mjs +0 -735
- package/esm2020/src/rt/OperationTable.mjs +0 -67
- package/esm2020/src/rt/Recompute.mjs +0 -355
- package/esm2020/src/rt/RecomputeTable.mjs +0 -63
- package/esm2020/src/rt/RemoteDataviewHeader.mjs +0 -108
- package/esm2020/src/rt/ResultValue.mjs +0 -12
- package/esm2020/src/rt/TableCache.mjs +0 -177
- package/esm2020/src/rt/TableCacheManager.mjs +0 -67
- package/esm2020/src/rt/Transaction.mjs +0 -53
- package/esm2020/src/security/UserDetails.mjs +0 -71
- package/esm2020/src/tasks/MGData.mjs +0 -552
- package/esm2020/src/tasks/MGDataCollection.mjs +0 -252
- package/esm2020/src/tasks/RCTimer.mjs +0 -63
- package/esm2020/src/tasks/RemoteTaskService.mjs +0 -45
- package/esm2020/src/tasks/Task.mjs +0 -2495
- package/esm2020/src/tasks/TaskBase.mjs +0 -87
- package/esm2020/src/tasks/TaskServiceBase.mjs +0 -25
- package/esm2020/src/tasks/TasksTable.mjs +0 -80
- package/esm2020/src/tasks/sort/Sort.mjs +0 -7
- package/esm2020/src/tasks/sort/SortCollection.mjs +0 -67
- package/esm2020/src/util/ConstUtils.mjs +0 -14
- package/esm2020/src/util/FlowMonitorQueue.mjs +0 -453
- package/esm2020/src/util/HeapSort.mjs +0 -70
- package/esm2020/src/util/MgPriorityBlockingQueue.mjs +0 -74
- package/esm2020/src/util/MgPriorityQueue.mjs +0 -66
- package/esm2020/src/util/PrmMap.mjs +0 -151
- package/esm2020/src/util/ReturnResult.mjs +0 -46
- package/esm2020/src/util/ReturnResultBase.mjs +0 -18
- package/esm2020/src/util/Scrambler.mjs +0 -89
- package/esm2020/src/util/UniqueIDUtils.mjs +0 -12
- package/esm2020/src/util/cookie.service.mjs +0 -92
- package/fesm2015/magic-xpa-engine.mjs +0 -30835
- package/fesm2015/magic-xpa-engine.mjs.map +0 -1
- package/fesm2020/magic-xpa-engine.mjs.map +0 -1
@@ -0,0 +1,1611 @@
|
|
1
|
+
import { ApplicationException, Debug, Int32, Int64, isNullOrUndefined, List, NNumber } from '@magic-xpa/mscorelib';
|
2
|
+
import { Constants, InternalInterface, Logger, Misc, StorageAttribute, XMLConstants, XmlParser } from '@magic-xpa/utils';
|
3
|
+
import { DataModificationTypes, DisplayConvertor, PIC, PropInterface } from '@magic-xpa/gui';
|
4
|
+
import { ConstInterface } from '../ConstInterface';
|
5
|
+
import { RecordsTable } from './RecordsTable';
|
6
|
+
import { Record } from './Record';
|
7
|
+
import { TaskBase } from '../tasks/TaskBase';
|
8
|
+
import { FieldsTableExt as FieldsTable } from './FieldsTable';
|
9
|
+
import { RecordOutOfDataViewException, RecordOutOfDataViewException_ExceptionType } from './RecordOutOfDataViewException';
|
10
|
+
import { CommandFactory } from '../commands/ClientToServer/CommandFactory';
|
11
|
+
import { XMLBasedDcValuesBuilder } from './XMLBasedDcValuesBuilder';
|
12
|
+
import { Field } from './Field';
|
13
|
+
import { EventSubType } from '../enums';
|
14
|
+
import { RemoteCommandsProcessor } from '../remote/RemoteCommandsProcessor';
|
15
|
+
import { FieldBase } from './FieldBase';
|
16
|
+
import { CommandsProcessorManager } from '../CommandsProcessorManager';
|
17
|
+
import { DataViewBase } from './DataViewBase';
|
18
|
+
import { AccessHelper, ClearEventsOnStopExecution } from '../AccessHelper';
|
19
|
+
import { MGDataCollection } from '../tasks/MGDataCollection';
|
20
|
+
export const SET_DISPLAYLINE_BY_DV = Int32.MinValue;
|
21
|
+
const COMPUTE_NEWREC_ON_CLIENT = 'C';
|
22
|
+
const UNKNOWN_RCMPS_NOT_INITED = 'M';
|
23
|
+
const UNKNOWN_RCMPS_FOUND = 'Y';
|
24
|
+
const INVOKED_FROM_OFFLINE_TASK = '-99999';
|
25
|
+
const CHUNK_CACHE_NEXT = 'N';
|
26
|
+
const CHUNK_CACHE_PREV = 'P';
|
27
|
+
const CHUNK_DV_BOTTOM = 'B';
|
28
|
+
const CHUNK_DV_TOP = 'T';
|
29
|
+
const COMPUTE_FLUSH_UPDATES = 'H';
|
30
|
+
const COMPUTE_NEWREC_ON_SERVER = 'S';
|
31
|
+
const END_DV_TAG = '</' + ConstInterface.MG_TAG_DATAVIEW + '>';
|
32
|
+
const RECOVERY_ACT_BEGIN_SCREEN = 'S';
|
33
|
+
const RECOVERY_ACT_BEGIN_TABLE = 'T';
|
34
|
+
const RECOVERY_ACT_CANCEL = 'C';
|
35
|
+
const RECOVERY_ACT_MOVE_DIRECTION_BEGIN = 'B';
|
36
|
+
const RECOVERY_ACT_NONE = 'N';
|
37
|
+
const TRANS_STAT_CLOSED = 'C';
|
38
|
+
const TRANS_STAT_OPENED = 'O';
|
39
|
+
export class DataView extends DataViewBase {
|
40
|
+
_cacheLruTimeStamp = 0;
|
41
|
+
_changed = false;
|
42
|
+
_chunkSize = 30;
|
43
|
+
_computeBy = '\0';
|
44
|
+
_currRecId = 0;
|
45
|
+
_currRecIdx = 0;
|
46
|
+
_dvPosValue = 0;
|
47
|
+
_firstDv = true;
|
48
|
+
_flushUpdates = false;
|
49
|
+
_hasMainTable = true;
|
50
|
+
_insertAt = ' ';
|
51
|
+
set InsertAt(value) {
|
52
|
+
this._insertAt = value;
|
53
|
+
}
|
54
|
+
get InsertAt() {
|
55
|
+
return this._insertAt;
|
56
|
+
}
|
57
|
+
InLocalDataviewCommand = false;
|
58
|
+
_lastCreatedRecId = 0;
|
59
|
+
_lastSessionCounter = Int64.MinValue;
|
60
|
+
_locateFirstRec = -1;
|
61
|
+
_modifiedRecordsTab = null;
|
62
|
+
_oldTopRecIdx = Int32.MinValue;
|
63
|
+
_original = null;
|
64
|
+
_pendingRecovery = RECOVERY_ACT_NONE;
|
65
|
+
_prevCurrRec = null;
|
66
|
+
_recordsTab = null;
|
67
|
+
_recovery = ConstInterface.RECOVERY_NONE;
|
68
|
+
_rmIdx = 0;
|
69
|
+
_rmSize = 0;
|
70
|
+
_skipParsing = false;
|
71
|
+
_topRecId = 0;
|
72
|
+
_topRecIdx = Int32.MinValue;
|
73
|
+
_topRecIdxModified = false;
|
74
|
+
_transCleared = false;
|
75
|
+
_unknownRcmp = UNKNOWN_RCMPS_NOT_INITED;
|
76
|
+
IsOneWayKey = false;
|
77
|
+
_includesFirst = false;
|
78
|
+
_includesLast = false;
|
79
|
+
_serverTransCacheEmpty = true;
|
80
|
+
_currRec_DO_NOT_USE_DIRECTLY_USE_SETTER_GETTER = null;
|
81
|
+
get CurrRec() {
|
82
|
+
return this._currRec_DO_NOT_USE_DIRECTLY_USE_SETTER_GETTER;
|
83
|
+
}
|
84
|
+
set CurrRec(value) {
|
85
|
+
if (this._currRec_DO_NOT_USE_DIRECTLY_USE_SETTER_GETTER !== null && value === null) {
|
86
|
+
this._currRec_DO_NOT_USE_DIRECTLY_USE_SETTER_GETTER.resetDcValueId();
|
87
|
+
}
|
88
|
+
this._currRec_DO_NOT_USE_DIRECTLY_USE_SETTER_GETTER = value;
|
89
|
+
if (this._currRec_DO_NOT_USE_DIRECTLY_USE_SETTER_GETTER !== null) {
|
90
|
+
this._currRec_DO_NOT_USE_DIRECTLY_USE_SETTER_GETTER.SetDcValueId();
|
91
|
+
}
|
92
|
+
}
|
93
|
+
get FlushUpdates() {
|
94
|
+
return this._flushUpdates;
|
95
|
+
}
|
96
|
+
get HasMainTable() {
|
97
|
+
return this._hasMainTable;
|
98
|
+
}
|
99
|
+
DBViewSize = 0;
|
100
|
+
taskModeFromCache;
|
101
|
+
get CurrentRecId() {
|
102
|
+
return this._currRecId;
|
103
|
+
}
|
104
|
+
Dvcount = 0;
|
105
|
+
TotalRecordsCount = 0;
|
106
|
+
RecordsBeforeCurrentView = 0;
|
107
|
+
get FirstRecord() {
|
108
|
+
return this._recordsTab.getRecByIdx(0);
|
109
|
+
}
|
110
|
+
get LastRecord() {
|
111
|
+
return this._recordsTab.getRecByIdx(this._recordsTab.getSize() - 1);
|
112
|
+
}
|
113
|
+
constructor(taskOrDataView) {
|
114
|
+
super();
|
115
|
+
if (taskOrDataView instanceof TaskBase) {
|
116
|
+
this._task = taskOrDataView;
|
117
|
+
this._fieldsTab = new FieldsTable();
|
118
|
+
this._recordsTab = new RecordsTable(true);
|
119
|
+
this._modifiedRecordsTab = new RecordsTable(false);
|
120
|
+
}
|
121
|
+
else {
|
122
|
+
Object.assign(this, taskOrDataView);
|
123
|
+
}
|
124
|
+
}
|
125
|
+
Init() {
|
126
|
+
this.init();
|
127
|
+
}
|
128
|
+
IncludesFirst() {
|
129
|
+
return this._includesFirst;
|
130
|
+
}
|
131
|
+
get ServerTransactionCacheEmpty() {
|
132
|
+
return this._serverTransCacheEmpty;
|
133
|
+
}
|
134
|
+
IncludesLast() {
|
135
|
+
return this._includesLast;
|
136
|
+
}
|
137
|
+
fillHeaderData(parser) {
|
138
|
+
while (this.initHeaderInnerObjects(parser, parser.getNextTag())) {
|
139
|
+
}
|
140
|
+
this.Dvcount = this._task.ctl_itm_4_parent_vee(0, 1);
|
141
|
+
}
|
142
|
+
initHeaderInnerObjects(parser, foundTagName) {
|
143
|
+
if (foundTagName === null)
|
144
|
+
return false;
|
145
|
+
if (foundTagName === XMLConstants.MG_TAG_DVHEADER) {
|
146
|
+
Logger.Instance.WriteDevToLog('dvheader found');
|
147
|
+
this.getHeaderAttributes(parser);
|
148
|
+
this._fieldsTab.fillData(parser, this);
|
149
|
+
this._fieldsTab.setRMPos(this._rmSize, this._rmIdx);
|
150
|
+
}
|
151
|
+
else if (foundTagName === ('/' + XMLConstants.MG_TAG_DVHEADER)) {
|
152
|
+
parser.setCurrIndex2EndOfTag();
|
153
|
+
return false;
|
154
|
+
}
|
155
|
+
else
|
156
|
+
return false;
|
157
|
+
return true;
|
158
|
+
}
|
159
|
+
getHeaderAttributes(parser) {
|
160
|
+
let tokensVector;
|
161
|
+
let tag;
|
162
|
+
let attribute;
|
163
|
+
let valueStr;
|
164
|
+
let endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex());
|
165
|
+
if (endContext !== -1 && endContext < parser.getXMLdata().length) {
|
166
|
+
tag = parser.getXMLsubstring(endContext);
|
167
|
+
parser.add2CurrIndex(tag.indexOf(XMLConstants.MG_TAG_DVHEADER) + XMLConstants.MG_TAG_DVHEADER.length);
|
168
|
+
tokensVector = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
|
169
|
+
for (let j = 0; j < tokensVector.length; j += 2) {
|
170
|
+
attribute = (tokensVector.get_Item(j));
|
171
|
+
valueStr = (tokensVector.get_Item(j + 1));
|
172
|
+
switch (attribute) {
|
173
|
+
case ConstInterface.MG_ATTR_RMPOS: {
|
174
|
+
let i = valueStr.indexOf(',');
|
175
|
+
if (i > -1) {
|
176
|
+
this._rmSize = NNumber.Parse(valueStr.substr(0, i));
|
177
|
+
this._rmIdx = NNumber.Parse(valueStr.substr(i + 1));
|
178
|
+
}
|
179
|
+
break;
|
180
|
+
}
|
181
|
+
case ConstInterface.MG_ATTR_COMPUTE_BY:
|
182
|
+
this._computeBy = valueStr[0];
|
183
|
+
if (this._computeBy === COMPUTE_FLUSH_UPDATES) {
|
184
|
+
this._computeBy = COMPUTE_NEWREC_ON_SERVER;
|
185
|
+
this._flushUpdates = true;
|
186
|
+
}
|
187
|
+
else
|
188
|
+
this._flushUpdates = false;
|
189
|
+
break;
|
190
|
+
case ConstInterface.MG_ATTR_HAS_MAIN_TBL:
|
191
|
+
this._hasMainTable = XmlParser.getBoolean(valueStr);
|
192
|
+
break;
|
193
|
+
case ConstInterface.MG_ATTR_CHUNK_SIZE:
|
194
|
+
this._chunkSize = XmlParser.getInt(valueStr);
|
195
|
+
break;
|
196
|
+
case ConstInterface.MG_ATTR_CHUNK_SIZE_EXPRESSION:
|
197
|
+
break;
|
198
|
+
default:
|
199
|
+
Logger.Instance.WriteExceptionToLogWithMsg('Unknown attribute for <' + XMLConstants.MG_TAG_DVHEADER + '> tag: ' +
|
200
|
+
attribute);
|
201
|
+
break;
|
202
|
+
}
|
203
|
+
}
|
204
|
+
parser.setCurrIndex(++endContext);
|
205
|
+
return;
|
206
|
+
}
|
207
|
+
Logger.Instance.WriteExceptionToLogWithMsg('in DataView.getHeaderAttributes(): out of bounds');
|
208
|
+
}
|
209
|
+
async fillData(parser) {
|
210
|
+
this._skipParsing = false;
|
211
|
+
while (await this.initInnerObjects(parser, parser.getNextTag())) {
|
212
|
+
}
|
213
|
+
this.ResetFirstDv();
|
214
|
+
}
|
215
|
+
GetTransactionBegin() {
|
216
|
+
let transBegin = '\0';
|
217
|
+
let transBeginProp = this._task.getProp(PropInterface.PROP_TYPE_TRASACTION_BEGIN);
|
218
|
+
if (transBeginProp !== null) {
|
219
|
+
transBegin = (transBeginProp.GetComputedValue()).charAt(0);
|
220
|
+
}
|
221
|
+
return transBegin;
|
222
|
+
}
|
223
|
+
async initInnerObjects(parser, foundTagName) {
|
224
|
+
let form = this._task.getForm();
|
225
|
+
if (foundTagName == null)
|
226
|
+
return false;
|
227
|
+
if (foundTagName === (ConstInterface.MG_TAG_DATAVIEW)) {
|
228
|
+
let invalidate = await this.getAttributes(parser);
|
229
|
+
if (this._skipParsing) {
|
230
|
+
let endContext = parser.getXMLdata().indexOf(END_DV_TAG, parser.getCurrIndex());
|
231
|
+
parser.setCurrIndex(endContext + END_DV_TAG.length);
|
232
|
+
}
|
233
|
+
else {
|
234
|
+
this.fillExecStack(parser);
|
235
|
+
this.fillDataDc(parser);
|
236
|
+
if (invalidate && form != null)
|
237
|
+
form.SetTableItemsCount(0, true);
|
238
|
+
let taskRefreshType = this._recordsTab.fillData(this, this._insertAt, parser);
|
239
|
+
if (form != null) {
|
240
|
+
if (form.Opened) {
|
241
|
+
if (this._insertAt === 'B' && (invalidate || this._recordsTab.InsertedRecordsCount > 0)) {
|
242
|
+
if (invalidate || !this._task.getForm().isTableWithPagination()) {
|
243
|
+
form.SetTableItemsCount(0, true);
|
244
|
+
form.setTableItemsCount(false);
|
245
|
+
}
|
246
|
+
else
|
247
|
+
form.InsertTableItems(0, this._recordsTab.InsertedRecordsCount);
|
248
|
+
}
|
249
|
+
else
|
250
|
+
form.setTableItemsCount(false);
|
251
|
+
}
|
252
|
+
}
|
253
|
+
if (this.CurrRec != null && this.CurrRec.InRecompute && taskRefreshType === Constants.TASK_REFRESH_NONE)
|
254
|
+
taskRefreshType = Constants.TASK_REFRESH_CURR_REC;
|
255
|
+
if (invalidate) {
|
256
|
+
taskRefreshType = Constants.TASK_REFRESH_FORM;
|
257
|
+
if (this._task.IsSubForm)
|
258
|
+
this.getTask().DoSubformPrefixSuffix = true;
|
259
|
+
}
|
260
|
+
this.getTask().SetRefreshType(taskRefreshType);
|
261
|
+
this.UpdateDataviewAfterInsert();
|
262
|
+
let newRecId = this._recordsTab.getInitialCurrRecId();
|
263
|
+
if (newRecId !== Int32.MinValue && (this._recovery === ConstInterface.RECOVERY_NONE || this._firstDv)) {
|
264
|
+
if (this._firstDv && this._recovery === ConstInterface.RECOVERY_NONE &&
|
265
|
+
(this._task.getLevel().charCodeAt(0) === 0 || this._task.getLevel() === Constants.TASK_LEVEL_TASK))
|
266
|
+
this._task.setLevel(Constants.TASK_LEVEL_TASK);
|
267
|
+
this._fieldsTab.invalidate(true, Field.LEAVE_FLAGS);
|
268
|
+
if (newRecId !== this._currRecId) {
|
269
|
+
await this.setCurrRec(newRecId, !this._firstDv);
|
270
|
+
this._original = this.CurrRec.replicate();
|
271
|
+
if (this._firstDv)
|
272
|
+
this.takeFldValsFromCurrRec();
|
273
|
+
if (this._task.getForm() != null)
|
274
|
+
(this._task.getForm()).updateDisplayLineByDV();
|
275
|
+
}
|
276
|
+
else
|
277
|
+
this.takeFldValsFromCurrRec();
|
278
|
+
}
|
279
|
+
else if (invalidate && this._recordsTab.getSize() > 0) {
|
280
|
+
if (form == null || form.isScreenMode()) {
|
281
|
+
try {
|
282
|
+
await this.setCurrRecByIdx(0, false, true, false, 0);
|
283
|
+
}
|
284
|
+
catch (exception) {
|
285
|
+
if (exception instanceof RecordOutOfDataViewException) {
|
286
|
+
}
|
287
|
+
else
|
288
|
+
throw exception;
|
289
|
+
}
|
290
|
+
}
|
291
|
+
else {
|
292
|
+
this._fieldsTab.invalidate(true, Field.LEAVE_FLAGS);
|
293
|
+
this.setTopRecIdx(0);
|
294
|
+
if (this._task.getForm() != null)
|
295
|
+
this._task.getForm().SetTableTopIndex();
|
296
|
+
try {
|
297
|
+
await this.setCurrRecByIdx(0, false, true, true, 0);
|
298
|
+
if (this._task.getForm() != null)
|
299
|
+
(this._task.getForm()).updateDisplayLineByDV();
|
300
|
+
}
|
301
|
+
catch (exception) {
|
302
|
+
if (exception instanceof RecordOutOfDataViewException) {
|
303
|
+
}
|
304
|
+
else
|
305
|
+
throw exception;
|
306
|
+
}
|
307
|
+
if (this._task.getLevel() === Constants.TASK_LEVEL_CONTROL && this._task.getLastParkedCtrl() != null)
|
308
|
+
this._task.getLastParkedCtrl().resetPrevVal();
|
309
|
+
}
|
310
|
+
this.saveOriginal();
|
311
|
+
this._fieldsTab.invalidate(true, FieldBase.CLEAR_FLAGS);
|
312
|
+
}
|
313
|
+
if (this._firstDv)
|
314
|
+
this.setPrevCurrRec();
|
315
|
+
if (invalidate && this._task.IsSubForm)
|
316
|
+
this._task.getForm().getSubFormCtrl().RefreshOnVisible = false;
|
317
|
+
if (this._recovery === ConstInterface.RECOVERY_NONE) {
|
318
|
+
if (this.getTask().getAfterRetry(ConstInterface.RECOVERY_RETRY) &&
|
319
|
+
!this.getTask().IsAfterRetryBeforeBuildXML)
|
320
|
+
this._task.setLevel(Constants.TASK_LEVEL_RECORD);
|
321
|
+
}
|
322
|
+
else {
|
323
|
+
let transBegin = this.GetTransactionBegin();
|
324
|
+
let stopExecution = true;
|
325
|
+
switch (this._recovery) {
|
326
|
+
case ConstInterface.RECOVERY_ROLLBACK:
|
327
|
+
if (transBegin === ConstInterface.TRANS_RECORD_PREFIX) {
|
328
|
+
if (this._task.getMode() === Constants.TASK_MODE_DELETE ||
|
329
|
+
!this._task.IsInteractive)
|
330
|
+
stopExecution = false;
|
331
|
+
else {
|
332
|
+
this.getTask().setAfterRetry(ConstInterface.RECOVERY_ROLLBACK);
|
333
|
+
this.CurrRec.restart(this.CurrRec.getMode());
|
334
|
+
this.CurrRec.resetModified();
|
335
|
+
this._original = this.CurrRec.replicate();
|
336
|
+
this._pendingRecovery = RECOVERY_ACT_CANCEL;
|
337
|
+
}
|
338
|
+
}
|
339
|
+
else if (transBegin !== ConstInterface.TRANS_NONE) {
|
340
|
+
this._task.setLevel(Constants.TASK_LEVEL_TASK);
|
341
|
+
this._pendingRecovery = RECOVERY_ACT_BEGIN_TABLE;
|
342
|
+
this.getTask().setAfterRetry(ConstInterface.RECOVERY_ROLLBACK);
|
343
|
+
}
|
344
|
+
break;
|
345
|
+
case ConstInterface.RECOVERY_RETRY:
|
346
|
+
this.RecoveryRetry(transBegin);
|
347
|
+
break;
|
348
|
+
}
|
349
|
+
if (stopExecution) {
|
350
|
+
AccessHelper.eventsManager.setStopExecution(true);
|
351
|
+
this.getTask().TaskSuffixExecuted = false;
|
352
|
+
}
|
353
|
+
}
|
354
|
+
}
|
355
|
+
}
|
356
|
+
else if (foundTagName === '/' + ConstInterface.MG_TAG_DATAVIEW) {
|
357
|
+
if (this._includesFirst && this._includesLast && this.isEmpty()) {
|
358
|
+
this._currRecId = Int32.MinValue;
|
359
|
+
this._currRecIdx = Int32.MinValue;
|
360
|
+
this.CurrRec = null;
|
361
|
+
this.setTopRecIdx(Int32.MinValue);
|
362
|
+
}
|
363
|
+
parser.setCurrIndex2EndOfTag();
|
364
|
+
return false;
|
365
|
+
}
|
366
|
+
else
|
367
|
+
return false;
|
368
|
+
return true;
|
369
|
+
}
|
370
|
+
RecoveryRetry(transBegin) {
|
371
|
+
if (transBegin === ConstInterface.TRANS_RECORD_PREFIX) {
|
372
|
+
this._task.setLevel(Constants.TASK_LEVEL_RECORD);
|
373
|
+
this.getTask().setTransactionFailed(true);
|
374
|
+
this.getTask().setAfterRetry(ConstInterface.RECOVERY_RETRY);
|
375
|
+
this.CurrRec.restart(this.CurrRec.getMode());
|
376
|
+
if (!this._firstDv) {
|
377
|
+
this.takeFldValsFromCurrRec();
|
378
|
+
this._pendingRecovery = RECOVERY_ACT_MOVE_DIRECTION_BEGIN;
|
379
|
+
}
|
380
|
+
}
|
381
|
+
else if (transBegin !== ConstInterface.TRANS_NONE) {
|
382
|
+
this._task.setLevel(Constants.TASK_LEVEL_TASK);
|
383
|
+
this._pendingRecovery = RECOVERY_ACT_BEGIN_SCREEN;
|
384
|
+
this.getTask().setAfterRetry(ConstInterface.RECOVERY_RETRY);
|
385
|
+
this.getTask().setTransactionFailed(true);
|
386
|
+
}
|
387
|
+
}
|
388
|
+
UpdateDataviewAfterInsert() {
|
389
|
+
if (this._insertAt === 'B') {
|
390
|
+
let newRecs = this._recordsTab.InsertedRecordsCount;
|
391
|
+
if (this._currRecIdx !== Int32.MinValue)
|
392
|
+
this._currRecIdx += newRecs;
|
393
|
+
if (this._topRecIdx !== Int32.MinValue)
|
394
|
+
this._topRecIdx += newRecs;
|
395
|
+
if (this._oldTopRecIdx !== Int32.MinValue)
|
396
|
+
this._oldTopRecIdx += newRecs;
|
397
|
+
}
|
398
|
+
}
|
399
|
+
async getAttributes(parser) {
|
400
|
+
let tokensVector;
|
401
|
+
let tag;
|
402
|
+
let boolVal;
|
403
|
+
let dataViewCommand = null;
|
404
|
+
let isEmptyDataview = false;
|
405
|
+
this._recovery = ConstInterface.RECOVERY_NONE;
|
406
|
+
let endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex());
|
407
|
+
if (endContext !== -1 && endContext < parser.getXMLdata().length) {
|
408
|
+
tag = parser.getXMLsubstring(endContext);
|
409
|
+
parser.add2CurrIndex(tag.indexOf(ConstInterface.MG_TAG_DATAVIEW) + ConstInterface.MG_TAG_DATAVIEW.length);
|
410
|
+
tokensVector = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
|
411
|
+
this._insertAt = ' ';
|
412
|
+
let invalidate = this.peekInvalidate(tokensVector);
|
413
|
+
this._locateFirstRec = 0;
|
414
|
+
for (let j = 0; j < tokensVector.length; j += 2) {
|
415
|
+
let attribute = (tokensVector.get_Item(j));
|
416
|
+
let valueStr = (tokensVector.get_Item(j + 1));
|
417
|
+
switch (attribute) {
|
418
|
+
case ConstInterface.MG_ATTR_INSERT_AT:
|
419
|
+
this._insertAt = valueStr[0];
|
420
|
+
break;
|
421
|
+
case ConstInterface.MG_ATTR_INCLUDE_FIRST:
|
422
|
+
boolVal = XmlParser.getBoolean(valueStr);
|
423
|
+
this.SetIncludesFirst(boolVal);
|
424
|
+
break;
|
425
|
+
case ConstInterface.MG_ATTR_INCLUDE_LAST:
|
426
|
+
boolVal = XmlParser.getBoolean(valueStr);
|
427
|
+
this.SetIncludesLast(boolVal);
|
428
|
+
break;
|
429
|
+
case ConstInterface.MG_ATTR_IS_ONEWAY_KEY:
|
430
|
+
boolVal = XmlParser.getBoolean(valueStr);
|
431
|
+
this.SetOneWayKey(boolVal);
|
432
|
+
break;
|
433
|
+
case ConstInterface.MG_ATTR_DBVIEWSIZE:
|
434
|
+
this.DBViewSize = XmlParser.getInt(valueStr);
|
435
|
+
break;
|
436
|
+
case ConstInterface.MG_ATTR_INVALIDATE:
|
437
|
+
{
|
438
|
+
}
|
439
|
+
break;
|
440
|
+
case ConstInterface.MG_ATTR_TOP_REC_ID:
|
441
|
+
this._topRecId = NNumber.Parse(valueStr);
|
442
|
+
break;
|
443
|
+
case ConstInterface.MG_ATTR_TASKMODE:
|
444
|
+
if (this._task.getOriginalTaskMode() === Constants.TASK_MODE_NONE || invalidate)
|
445
|
+
this._task.setOriginalTaskMode(valueStr);
|
446
|
+
this._task.setProp(PropInterface.PROP_TYPE_TASK_MODE, valueStr);
|
447
|
+
break;
|
448
|
+
case ConstInterface.MG_ATTR_EMPTY_DATAVIEW:
|
449
|
+
isEmptyDataview = true;
|
450
|
+
break;
|
451
|
+
case XMLConstants.MG_ATTR_TASKID:
|
452
|
+
continue;
|
453
|
+
case ConstInterface.MG_ATTR_LOW_ID:
|
454
|
+
this._lastCreatedRecId = NNumber.Parse(valueStr);
|
455
|
+
break;
|
456
|
+
case ConstInterface.MG_ATTR_TRANS_STAT:
|
457
|
+
let transStat = valueStr[0];
|
458
|
+
switch (transStat) {
|
459
|
+
case TRANS_STAT_OPENED:
|
460
|
+
dataViewCommand = CommandFactory.CreateSetTransactionStateDataviewCommand(this.getTask().getTaskTag(), true);
|
461
|
+
await this.getTask().DataviewManager.RemoteDataviewManager.Execute(dataViewCommand);
|
462
|
+
break;
|
463
|
+
case TRANS_STAT_CLOSED:
|
464
|
+
dataViewCommand = CommandFactory.CreateSetTransactionStateDataviewCommand(this.getTask().getTaskTag(), false);
|
465
|
+
await this.getTask().DataviewManager.RemoteDataviewManager.Execute(dataViewCommand);
|
466
|
+
this.getTask().setTransactionFailed(false);
|
467
|
+
break;
|
468
|
+
default:
|
469
|
+
break;
|
470
|
+
}
|
471
|
+
break;
|
472
|
+
case ConstInterface.MG_ATTR_RECOVERY:
|
473
|
+
if (this._task.IsTryingToStop)
|
474
|
+
this.getTask().setTryingToStop(false);
|
475
|
+
this.getTask().resetExecEndTask();
|
476
|
+
this._recovery = valueStr[0];
|
477
|
+
break;
|
478
|
+
case ConstInterface.MG_ATTR_DVPOS_VALUE:
|
479
|
+
this._dvPosValue = NNumber.Parse(valueStr);
|
480
|
+
break;
|
481
|
+
case ConstInterface.MG_ATTR_LOCATE_FIRST_ID:
|
482
|
+
this._locateFirstRec = NNumber.Parse(valueStr);
|
483
|
+
break;
|
484
|
+
case ConstInterface.MG_ATTR_OFFSET:
|
485
|
+
break;
|
486
|
+
case ConstInterface.MG_ATTR_USER_SORT:
|
487
|
+
let form = this._task.getForm();
|
488
|
+
form.clearTableColumnSortMark(XmlParser.getBoolean(valueStr));
|
489
|
+
break;
|
490
|
+
case ConstInterface.MG_ATTR_VAL_TOTAL_RECORDS_COUNT:
|
491
|
+
this.TotalRecordsCount = XmlParser.getInt(valueStr);
|
492
|
+
break;
|
493
|
+
case ConstInterface.MG_ATTR_VAL_RECORDS_BEFORE_CURRENT_VIEW:
|
494
|
+
this.RecordsBeforeCurrentView = XmlParser.getInt(valueStr);
|
495
|
+
break;
|
496
|
+
case ConstInterface.MG_ATTR_VAL_SERVER_TRANS_CACHE_EMPTY:
|
497
|
+
this._serverTransCacheEmpty = XmlParser.getBoolean(valueStr);
|
498
|
+
break;
|
499
|
+
default:
|
500
|
+
Logger.Instance.WriteExceptionToLogWithMsg('Unknown attribute for <' + ConstInterface.MG_TAG_DATAVIEW + '> tag: ' + attribute);
|
501
|
+
break;
|
502
|
+
}
|
503
|
+
}
|
504
|
+
this.setEmptyDataview(isEmptyDataview);
|
505
|
+
parser.setCurrIndex(++endContext);
|
506
|
+
return invalidate;
|
507
|
+
}
|
508
|
+
Logger.Instance.WriteExceptionToLogWithMsg('in DataView.getAttributes(): out of bounds');
|
509
|
+
return false;
|
510
|
+
}
|
511
|
+
SetOneWayKey(val) {
|
512
|
+
this.IsOneWayKey = val;
|
513
|
+
}
|
514
|
+
SetIncludesLast(val) {
|
515
|
+
this._includesLast = val;
|
516
|
+
}
|
517
|
+
SetIncludesFirst(val) {
|
518
|
+
let prevIncludeFirst = this._includesFirst;
|
519
|
+
this._includesFirst = val;
|
520
|
+
if (this._includesFirst !== prevIncludeFirst) {
|
521
|
+
let form = this._task.getForm();
|
522
|
+
if (form !== null) {
|
523
|
+
form.SetTableItemsCount(0, true);
|
524
|
+
}
|
525
|
+
}
|
526
|
+
}
|
527
|
+
fillDataDc(parser) {
|
528
|
+
let dcvBuilder = new XMLBasedDcValuesBuilder();
|
529
|
+
let foundTagName = parser.getNextTag();
|
530
|
+
while (foundTagName !== null && foundTagName === ConstInterface.MG_TAG_DC_VALS) {
|
531
|
+
let dcValsPosition = parser.getCurrIndex();
|
532
|
+
dcvBuilder.SerializedDCVals = parser.ReadToEndOfCurrentElement();
|
533
|
+
let dcv = dcvBuilder.Build();
|
534
|
+
if (dcv !== null)
|
535
|
+
this.AddDcValues(dcv);
|
536
|
+
else
|
537
|
+
Logger.Instance.WriteExceptionToLogWithMsg('Error while parsing DC values at position ' + dcValsPosition);
|
538
|
+
foundTagName = parser.getNextTag();
|
539
|
+
}
|
540
|
+
}
|
541
|
+
AddDcValues(dcv) {
|
542
|
+
this._dcValsCollection.Add(dcv.getId().toString(), dcv);
|
543
|
+
}
|
544
|
+
fillExecStack(parser) {
|
545
|
+
let foundTagName = parser.getNextTag();
|
546
|
+
let execStackTagExists = false;
|
547
|
+
while (foundTagName !== null && foundTagName === ConstInterface.MG_TAG_EXEC_STACK_ENTRY) {
|
548
|
+
this.fillInnerExecStack(parser);
|
549
|
+
foundTagName = parser.getNextTag();
|
550
|
+
execStackTagExists = true;
|
551
|
+
}
|
552
|
+
if (execStackTagExists) {
|
553
|
+
AccessHelper.eventsManager.reverseServerExecStack();
|
554
|
+
}
|
555
|
+
}
|
556
|
+
fillInnerExecStack(parser) {
|
557
|
+
let tokensVector;
|
558
|
+
const endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_TERM, parser.getCurrIndex());
|
559
|
+
let attribute;
|
560
|
+
let taskId = '';
|
561
|
+
let handlerId = '';
|
562
|
+
let operIdx = 0;
|
563
|
+
if (endContext !== -1 && endContext < parser.getXMLdata().length) {
|
564
|
+
let tag = parser.getXMLsubstring(endContext);
|
565
|
+
parser.add2CurrIndex(tag.indexOf(ConstInterface.MG_TAG_EXEC_STACK_ENTRY) + ConstInterface.MG_TAG_EXEC_STACK_ENTRY.length);
|
566
|
+
tokensVector = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
|
567
|
+
for (let j = 0; j < tokensVector.length; j += 2) {
|
568
|
+
attribute = (tokensVector.get_Item(j));
|
569
|
+
let valueStr = (tokensVector.get_Item(j + 1));
|
570
|
+
switch (attribute) {
|
571
|
+
case XMLConstants.MG_ATTR_TASKID:
|
572
|
+
taskId = valueStr;
|
573
|
+
break;
|
574
|
+
case ConstInterface.MG_ATTR_HANDLERID:
|
575
|
+
handlerId = valueStr;
|
576
|
+
break;
|
577
|
+
case ConstInterface.MG_ATTR_OPER_IDX:
|
578
|
+
operIdx = XmlParser.getInt(valueStr);
|
579
|
+
break;
|
580
|
+
}
|
581
|
+
}
|
582
|
+
AccessHelper.eventsManager.pushServerExecStack(taskId, handlerId, operIdx);
|
583
|
+
parser.setCurrIndex(endContext + XMLConstants.TAG_TERM.length);
|
584
|
+
}
|
585
|
+
else
|
586
|
+
Logger.Instance.WriteExceptionToLogWithMsg('in DataView.fillInnerExecStack() out of bounds');
|
587
|
+
}
|
588
|
+
peekInvalidate(tokensVector) {
|
589
|
+
let sessionCounter = CommandsProcessorManager.GetCommandsProcessor().GetSessionCounter();
|
590
|
+
for (let j = 0; j < tokensVector.length; j += 2) {
|
591
|
+
let attribute = tokensVector.get_Item(j);
|
592
|
+
if (attribute === (ConstInterface.MG_ATTR_INVALIDATE)) {
|
593
|
+
let valueStr = tokensVector.get_Item(j + 1);
|
594
|
+
if (XmlParser.getBoolean(valueStr)) {
|
595
|
+
if (sessionCounter < this._lastSessionCounter)
|
596
|
+
this._skipParsing = true;
|
597
|
+
else {
|
598
|
+
this._lastSessionCounter = sessionCounter;
|
599
|
+
this.clear();
|
600
|
+
return true;
|
601
|
+
}
|
602
|
+
}
|
603
|
+
return false;
|
604
|
+
}
|
605
|
+
}
|
606
|
+
return false;
|
607
|
+
}
|
608
|
+
getFieldByName(fldName) {
|
609
|
+
if (this._fieldsTab !== null)
|
610
|
+
return this._fieldsTab.getField(fldName);
|
611
|
+
Logger.Instance.WriteExceptionToLogWithMsg('in DataView.getField(String): There is no fieldsTab object');
|
612
|
+
return null;
|
613
|
+
}
|
614
|
+
async buildXML(message) {
|
615
|
+
let dcv;
|
616
|
+
let taskTag = this._task.getTaskTag();
|
617
|
+
let brkLevelIndex = this._task.getBrkLevelIndex();
|
618
|
+
let currRecDeleted = false;
|
619
|
+
let serverParent;
|
620
|
+
let contextTask = (this.getTask().GetContextTask());
|
621
|
+
let invokingTaskTag = contextTask.IsOffline ? INVOKED_FROM_OFFLINE_TASK : contextTask.getTaskTag();
|
622
|
+
message.Append('\n <' + ConstInterface.MG_TAG_DATAVIEW + ' ' + XMLConstants.MG_ATTR_TASKID + '="' +
|
623
|
+
taskTag + '"');
|
624
|
+
message.Append(' ' + ConstInterface.MG_ATTR_TASKLEVEL + '="' + brkLevelIndex + '"');
|
625
|
+
serverParent = '0';
|
626
|
+
let triggeringTask = this.getTask().getTriggeringTask();
|
627
|
+
if (triggeringTask != null) {
|
628
|
+
if (triggeringTask.IsOffline) {
|
629
|
+
let ctlIdx = triggeringTask.getCtlIdx();
|
630
|
+
let mainPrg = AccessHelper.mgDataTable.GetMainProgByCtlIdx(-1, ctlIdx);
|
631
|
+
serverParent = mainPrg.getTaskTag();
|
632
|
+
}
|
633
|
+
else
|
634
|
+
serverParent = triggeringTask.getTaskTag();
|
635
|
+
}
|
636
|
+
if (this._currRecId > Int32.MinValue) {
|
637
|
+
if (this.CurrRec != null)
|
638
|
+
message.Append(' ' + ConstInterface.MG_ATTR_CURR_REC + '="' + this._currRecId + '"');
|
639
|
+
message.Append(' ' + ConstInterface.MG_ATTR_TASKMODE + '="' + this._task.getMode() + '"');
|
640
|
+
if (this._transCleared && !(MGDataCollection.Instance.StartupMgData.getFirstTask().InEndTask && MGDataCollection.Instance.StartupMgData.getFirstTask().ClosingFormUI)) {
|
641
|
+
message.Append(' ' + ConstInterface.MG_ATTR_TRANS_CLEARED + '="1"');
|
642
|
+
this._transCleared = false;
|
643
|
+
}
|
644
|
+
message.Append(' ' + ConstInterface.MG_ATTR_INVOKER_ID + '="' + invokingTaskTag + ',' + serverParent + '"');
|
645
|
+
if (await this.getTask().isCached())
|
646
|
+
message.Append(' ' + ConstInterface.MG_ATTR_DVPOS_VALUE + '="' + this._dvPosValue + '"');
|
647
|
+
message.Append(' ' + ConstInterface.MG_ATTR_LOOP_COUNTER + '="' + this.getTask().getLoopCounter() + '"');
|
648
|
+
if (this._task.IsSubForm) {
|
649
|
+
let subformCtrl = this._task.getForm().getSubFormCtrl();
|
650
|
+
if (!subformCtrl.isVisible() &&
|
651
|
+
!await subformCtrl.checkProp(PropInterface.PROP_TYPE_REFRESH_WHEN_HIDDEN, false))
|
652
|
+
message.Append(' ' + ConstInterface.MG_ATTR_SUBFORM_VISIBLE + '="0"');
|
653
|
+
}
|
654
|
+
if (!this._task.IsInteractive)
|
655
|
+
message.Append(' ' + ConstInterface.MG_ATTR_TASK_COUNTER + '="' + this.getTask().getCounter() + '"');
|
656
|
+
if (this._task != null && this._task.GetComputedProperty(PropInterface.PROP_TYPE_PRELOAD_VIEW).GetComputedValueBoolean()) {
|
657
|
+
message.Append(' ' + ConstInterface.MG_ATTR_LAST_REC_ID + '="' +
|
658
|
+
(this._recordsTab.getRecByIdx(this.getSize() - 1).getId()) + '"');
|
659
|
+
message.Append(' ' + ConstInterface.MG_ATTR_OLD_FIRST_REC_ID + '="' +
|
660
|
+
this._recordsTab.getRecByIdx(0).getId() + '"');
|
661
|
+
}
|
662
|
+
if (this._task.IsInteractive) {
|
663
|
+
let form = this._task.getForm();
|
664
|
+
if (form != null && this._recordsTab.getSize() > 1) {
|
665
|
+
message.Append(' ' + ConstInterface.MG_ATTR_CURR_REC_POS_IN_FORM + '="' +
|
666
|
+
form.getCurrRecPosInForm() + '"');
|
667
|
+
}
|
668
|
+
}
|
669
|
+
message.Append(XMLConstants.TAG_CLOSE);
|
670
|
+
if (this.getTask().ResetRange || this.getTask().UserRngs != null) {
|
671
|
+
message.Append(XMLConstants.START_TAG + ConstInterface.USER_RANGES);
|
672
|
+
if (this.getTask().ResetRange) {
|
673
|
+
message.Append(' ' + ConstInterface.CLEAR_RANGE + '="1"');
|
674
|
+
this.getTask().ResetRange = false;
|
675
|
+
}
|
676
|
+
if (this.getTask().UserRngs != null) {
|
677
|
+
this.getTask().buildXMLForRngs(message, this.getTask().UserRngs, false);
|
678
|
+
this.getTask().UserRngs.Clear();
|
679
|
+
this.getTask().UserRngs = null;
|
680
|
+
}
|
681
|
+
else
|
682
|
+
message.Append(XMLConstants.TAG_TERM);
|
683
|
+
}
|
684
|
+
if (this.getTask().ResetLocate || this.getTask().UserLocs != null) {
|
685
|
+
message.Append(XMLConstants.START_TAG + ConstInterface.USER_LOCATES);
|
686
|
+
if (this.getTask().ResetLocate) {
|
687
|
+
message.Append(' ' + ConstInterface.CLEAR_LOCATES + '="1"');
|
688
|
+
this.getTask().ResetLocate = false;
|
689
|
+
}
|
690
|
+
if (this.getTask().UserLocs != null) {
|
691
|
+
this.getTask().buildXMLForRngs(message, this.getTask().UserLocs, true);
|
692
|
+
this.getTask().UserLocs.Clear();
|
693
|
+
this.getTask().UserLocs = null;
|
694
|
+
}
|
695
|
+
else
|
696
|
+
message.Append(XMLConstants.TAG_TERM);
|
697
|
+
}
|
698
|
+
if (this.getTask().ResetSort || this.getTask().UserSorts != null) {
|
699
|
+
message.Append(XMLConstants.START_TAG + ConstInterface.MG_TAG_SORTS);
|
700
|
+
if (this.getTask().ResetSort) {
|
701
|
+
message.Append(' ' + ConstInterface.CLEAR_SORTS + '="1"');
|
702
|
+
this.getTask().ResetSort = false;
|
703
|
+
}
|
704
|
+
if (this.getTask().UserSorts != null)
|
705
|
+
this.getTask().buildXMLForSorts(message);
|
706
|
+
else
|
707
|
+
message.Append(XMLConstants.TAG_TERM);
|
708
|
+
}
|
709
|
+
if (await this.getTask().isCached()) {
|
710
|
+
let delList = this.getTask().getTaskCache().getDeletedListToXML();
|
711
|
+
if (delList !== '') {
|
712
|
+
message.Append(XMLConstants.START_TAG + ConstInterface.MG_TAG_DEL_LIST);
|
713
|
+
message.Append(' ' + XMLConstants.MG_ATTR_ID + '="' + this._task.getTaskTag() + '"');
|
714
|
+
message.Append(' ' + ConstInterface.MG_ATTR_REMOVE + '="' + delList + '"');
|
715
|
+
message.Append(XMLConstants.TAG_TERM);
|
716
|
+
if (this.getTask().getTaskCache().isDeleted(this._dvPosValue))
|
717
|
+
this.setChanged(true);
|
718
|
+
this.getTask().getTaskCache().clearDeletedList();
|
719
|
+
}
|
720
|
+
}
|
721
|
+
let dcValKeys = this._dcValsCollection.Keys;
|
722
|
+
dcValKeys.forEach((dcValKey) => {
|
723
|
+
dcv = this._dcValsCollection.get_Item(dcValKey);
|
724
|
+
if (!dcv.HasReferences) {
|
725
|
+
message.Append(XMLConstants.START_TAG + ConstInterface.MG_TAG_DC_VALS);
|
726
|
+
message.Append(' ' + XMLConstants.MG_ATTR_ID + '="' + dcv.getId() + '"');
|
727
|
+
message.Append(' ' + ConstInterface.MG_ATTR_REMOVE + '="1"');
|
728
|
+
message.Append(XMLConstants.TAG_TERM);
|
729
|
+
this._dcValsCollection.Remove(dcValKey);
|
730
|
+
}
|
731
|
+
});
|
732
|
+
if (this.CurrRec != null)
|
733
|
+
currRecDeleted = (this.CurrRec.getMode() === DataModificationTypes.Delete
|
734
|
+
&& this._modifiedRecordsTab.getRecord(this.CurrRec.getId()) != null && this.CurrRec.SendToServer);
|
735
|
+
let skipCurrRec = false;
|
736
|
+
if (this.CurrRec != null && this._modifiedRecordsTab.getRecord(this.CurrRec.getId()) != null)
|
737
|
+
skipCurrRec = AccessHelper.eventsManager.isForceExitPreRecordUpdate(this.getTask());
|
738
|
+
this._modifiedRecordsTab.buildXML(message, skipCurrRec, this.CurrRec.getId());
|
739
|
+
if (this._original != null)
|
740
|
+
this._original.clearMode();
|
741
|
+
for (let i = this._modifiedRecordsTab.getSize() - 1; i >= 0; i--) {
|
742
|
+
if (skipCurrRec && this._modifiedRecordsTab.getRecByIdx(i).getId() === this.CurrRec.getId())
|
743
|
+
continue;
|
744
|
+
this._modifiedRecordsTab.getRecByIdx(i).clearFlagsHistory();
|
745
|
+
this._modifiedRecordsTab.removeRecord(i);
|
746
|
+
}
|
747
|
+
if (this.CurrRec != null && !currRecDeleted) {
|
748
|
+
let forceBuild = (this._task.isMainProg() && (RemoteCommandsProcessor.IsSessionReInitializing));
|
749
|
+
this.CurrRec.buildXML(message, true, forceBuild);
|
750
|
+
}
|
751
|
+
}
|
752
|
+
else {
|
753
|
+
message.Append(' ' + ConstInterface.MG_ATTR_INVOKER_ID + '="' + invokingTaskTag + ',' + serverParent + '"' +
|
754
|
+
XMLConstants.TAG_CLOSE);
|
755
|
+
}
|
756
|
+
message.Append('\n </' + ConstInterface.MG_TAG_DATAVIEW + XMLConstants.TAG_CLOSE);
|
757
|
+
}
|
758
|
+
getCurrRec() {
|
759
|
+
if (this.CurrRec === null && this._currRecId > Int32.MinValue) {
|
760
|
+
Logger.Instance.WriteExceptionToLogWithMsg('DataView.getCurrRec(): record ' + this._currRecId + ' not found');
|
761
|
+
}
|
762
|
+
return this.CurrRec;
|
763
|
+
}
|
764
|
+
getPrevCurrRec() {
|
765
|
+
return this._prevCurrRec;
|
766
|
+
}
|
767
|
+
getOriginalRec() {
|
768
|
+
if (this._original === null || this._original.getId() !== this.CurrRec.getId())
|
769
|
+
return this.CurrRec;
|
770
|
+
return this._original;
|
771
|
+
}
|
772
|
+
async setCurrRec(id, compute) {
|
773
|
+
let oldRecId = this._currRecId;
|
774
|
+
if (id > Int32.MinValue) {
|
775
|
+
let newIdx = this._recordsTab.getRecIdx(id);
|
776
|
+
if (newIdx === -1)
|
777
|
+
this._original = null;
|
778
|
+
else {
|
779
|
+
try {
|
780
|
+
let ignoreCurrRec = this._currRecId === Int32.MinValue;
|
781
|
+
await this.setCurrRecByIdx(newIdx, !ignoreCurrRec, ignoreCurrRec, compute, Int32.MinValue);
|
782
|
+
if (id !== oldRecId)
|
783
|
+
this.saveOriginal();
|
784
|
+
return true;
|
785
|
+
}
|
786
|
+
catch (exception) {
|
787
|
+
if (exception instanceof RecordOutOfDataViewException) {
|
788
|
+
}
|
789
|
+
else
|
790
|
+
throw exception;
|
791
|
+
}
|
792
|
+
}
|
793
|
+
}
|
794
|
+
else {
|
795
|
+
this.CurrRec = null;
|
796
|
+
this._original = null;
|
797
|
+
this._currRecId = Int32.MinValue;
|
798
|
+
}
|
799
|
+
return false;
|
800
|
+
}
|
801
|
+
async setCurrRecByIdx(newIdx, doSuffix, ignoreCurrRec, compute, newDisplayLine) {
|
802
|
+
let lastRecIdx = this._recordsTab.getSize() - 1;
|
803
|
+
let oldFirstRec, nextRec;
|
804
|
+
let recordSuff = false;
|
805
|
+
if (newIdx === Constants.MG_DATAVIEW_FIRST_RECORD) {
|
806
|
+
if (this.getTask().isTableWithAbsolutesScrollbar()) {
|
807
|
+
this.RecordsBeforeCurrentView = 0;
|
808
|
+
}
|
809
|
+
if (this._includesFirst) {
|
810
|
+
if (this._currRecIdx >= 0 || this._currRecIdx === Int32.MinValue) {
|
811
|
+
newIdx = 0;
|
812
|
+
recordSuff = true;
|
813
|
+
}
|
814
|
+
else
|
815
|
+
throw new RecordOutOfDataViewException(RecordOutOfDataViewException_ExceptionType.TOP);
|
816
|
+
}
|
817
|
+
else {
|
818
|
+
await this.fetchChunkFromServer(CHUNK_DV_TOP, doSuffix);
|
819
|
+
await this.setCurrRecByIdx(newIdx, false, ignoreCurrRec, compute, SET_DISPLAYLINE_BY_DV);
|
820
|
+
return;
|
821
|
+
}
|
822
|
+
}
|
823
|
+
else if (newIdx === Constants.MG_DATAVIEW_LAST_RECORD) {
|
824
|
+
if (this._includesLast) {
|
825
|
+
if (this._currRecIdx <= lastRecIdx) {
|
826
|
+
newIdx = lastRecIdx;
|
827
|
+
recordSuff = true;
|
828
|
+
}
|
829
|
+
else
|
830
|
+
throw new RecordOutOfDataViewException(RecordOutOfDataViewException_ExceptionType.BOTTOM);
|
831
|
+
}
|
832
|
+
else {
|
833
|
+
if (this.getTask().isTableWithAbsolutesScrollbar())
|
834
|
+
this.RecordsBeforeCurrentView = this.TotalRecordsCount;
|
835
|
+
await this.fetchChunkFromServer(CHUNK_DV_BOTTOM, doSuffix);
|
836
|
+
if (!this._includesLast)
|
837
|
+
throw new RecordOutOfDataViewException(RecordOutOfDataViewException_ExceptionType.BOTTOM);
|
838
|
+
let form = this._task.getForm();
|
839
|
+
if (form != null) {
|
840
|
+
while (!this._includesFirst && form.getRowsInPage() >= this.getSize()) {
|
841
|
+
await this.fetchChunkFromServer(CHUNK_CACHE_PREV, false);
|
842
|
+
}
|
843
|
+
}
|
844
|
+
await this.setCurrRecByIdx(newIdx, false, ignoreCurrRec, compute, SET_DISPLAYLINE_BY_DV);
|
845
|
+
return;
|
846
|
+
}
|
847
|
+
}
|
848
|
+
else if (newIdx < 0) {
|
849
|
+
if (this._includesFirst)
|
850
|
+
throw new RecordOutOfDataViewException(RecordOutOfDataViewException_ExceptionType.TOP);
|
851
|
+
oldFirstRec = this._recordsTab.getRecByIdx(0);
|
852
|
+
if (this._recordsTab.getSize() > 0 || this.IncludesLast())
|
853
|
+
await this.fetchChunkFromServer(CHUNK_CACHE_PREV, doSuffix);
|
854
|
+
else if (this._recordsTab.getSize() === 0 && this.IncludesFirst())
|
855
|
+
await this.fetchChunkFromServer(CHUNK_DV_TOP, doSuffix);
|
856
|
+
else
|
857
|
+
Logger.Instance.WriteExceptionToLogWithMsg('in DataView.fetchChunkFromServer() wrong option');
|
858
|
+
let oldFirstNewIdx = oldFirstRec != null
|
859
|
+
? this._recordsTab.getRecIdx(oldFirstRec.getId())
|
860
|
+
: this._recordsTab.getSize();
|
861
|
+
if (oldFirstNewIdx !== 0)
|
862
|
+
await this.setCurrRecByIdx(oldFirstNewIdx + newIdx, false, ignoreCurrRec, compute, SET_DISPLAYLINE_BY_DV);
|
863
|
+
return;
|
864
|
+
}
|
865
|
+
else if (newIdx > lastRecIdx) {
|
866
|
+
if (this._includesLast)
|
867
|
+
throw new RecordOutOfDataViewException(RecordOutOfDataViewException_ExceptionType.BOTTOM);
|
868
|
+
if (this.getForm().isRowCreated(newIdx))
|
869
|
+
this.getForm().markRowNOTCreated(newIdx);
|
870
|
+
await this.fetchChunkFromServer(CHUNK_CACHE_NEXT, doSuffix);
|
871
|
+
await this.setCurrRecByIdx(newIdx, false, ignoreCurrRec, compute, SET_DISPLAYLINE_BY_DV);
|
872
|
+
return;
|
873
|
+
}
|
874
|
+
let isCreateLineAboveAct = false;
|
875
|
+
let lastEvent = isNullOrUndefined(AccessHelper.eventsManager.getLastRtEvent()) ? 0 :
|
876
|
+
AccessHelper.eventsManager.getLastRtEvent().getInternalCode();
|
877
|
+
if (newIdx >= 0 && !this.getTask().transactionFailed(ConstInterface.TRANS_RECORD_PREFIX) &&
|
878
|
+
lastEvent === InternalInterface.MG_ACT_CRELINE_ABOVE) {
|
879
|
+
if ((this.getTask().getInCreateLine()) && newIdx == this._currRecIdx) {
|
880
|
+
let newRec = this._recordsTab.getRecByIdx(newIdx);
|
881
|
+
if (newRec.getMode() == DataModificationTypes.Insert)
|
882
|
+
isCreateLineAboveAct = true;
|
883
|
+
}
|
884
|
+
}
|
885
|
+
if (recordSuff || isCreateLineAboveAct || newIdx !== this._currRecIdx || ignoreCurrRec && compute) {
|
886
|
+
if (!ignoreCurrRec && doSuffix && this.CurrRec != null) {
|
887
|
+
let oldRecTabSize = this._recordsTab.getSize();
|
888
|
+
nextRec = this._recordsTab.getRecByIdx(newIdx);
|
889
|
+
if (nextRec.isNewRec()) {
|
890
|
+
if (this._task.getMode() !== Constants.TASK_MODE_CREATE &&
|
891
|
+
!await this._task.checkProp(PropInterface.PROP_TYPE_ALLOW_CREATE, true))
|
892
|
+
AccessHelper.eventsManager.setStopExecution(true);
|
893
|
+
}
|
894
|
+
if (!AccessHelper.eventsManager.GetStopExecutionFlag()) {
|
895
|
+
let orgTopRecIdx = 0;
|
896
|
+
if (this._topRecIdxModified) {
|
897
|
+
orgTopRecIdx = this.getTopRecIdx();
|
898
|
+
this.restoreTopRecIdx();
|
899
|
+
}
|
900
|
+
await AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_REC_SUFFIX);
|
901
|
+
if (this._topRecIdxModified)
|
902
|
+
this.setTopRecIdx(orgTopRecIdx);
|
903
|
+
}
|
904
|
+
if (AccessHelper.eventsManager.GetStopExecutionFlag())
|
905
|
+
throw new RecordOutOfDataViewException(RecordOutOfDataViewException_ExceptionType.REC_SUFFIX_FAILED);
|
906
|
+
if (nextRec !== this.CurrRec && this.getTask().getAfterRetry())
|
907
|
+
this._task.setLevel(Constants.TASK_LEVEL_TASK);
|
908
|
+
if (oldRecTabSize - 1 === this._recordsTab.getSize() && this._currRecIdx < newIdx)
|
909
|
+
newIdx--;
|
910
|
+
if (newIdx === this._currRecIdx) {
|
911
|
+
if (this._task.getMode() === Constants.TASK_MODE_CREATE && !this.CurrRec.isNewRec() &&
|
912
|
+
!this._task.getForm().inRefreshDisplay())
|
913
|
+
this._task.setMode(Constants.TASK_MODE_MODIFY);
|
914
|
+
return;
|
915
|
+
}
|
916
|
+
}
|
917
|
+
this.CurrRec = this._recordsTab.getRecByIdx(newIdx);
|
918
|
+
if (this.CurrRec == null)
|
919
|
+
throw new ApplicationException('in DataView.setCurrRecByIdx() current record not found!');
|
920
|
+
this._currRecId = this.CurrRec.getId();
|
921
|
+
this._currRecIdx = newIdx;
|
922
|
+
if (this._task.getForm() != null) {
|
923
|
+
if (newDisplayLine === SET_DISPLAYLINE_BY_DV) {
|
924
|
+
(this._task.getForm()).updateDisplayLineByDV();
|
925
|
+
}
|
926
|
+
else
|
927
|
+
this._task.getForm().DisplayLine = newDisplayLine;
|
928
|
+
}
|
929
|
+
if (this._task.getMode() === Constants.TASK_MODE_CREATE && !this.CurrRec.isNewRec() &&
|
930
|
+
!this._task.getForm().inRefreshDisplay())
|
931
|
+
this._task.setMode(Constants.TASK_MODE_MODIFY);
|
932
|
+
if (compute)
|
933
|
+
await this.currRecCompute(false);
|
934
|
+
}
|
935
|
+
}
|
936
|
+
async currRecCompute(forceClientCompute) {
|
937
|
+
this._fieldsTab.invalidate(false, true);
|
938
|
+
await this.compute(false, forceClientCompute);
|
939
|
+
}
|
940
|
+
saveOriginal() {
|
941
|
+
if (!this.CurrRec.Modified)
|
942
|
+
this._original = this.CurrRec.replicate();
|
943
|
+
}
|
944
|
+
async fetchChunkFromServer(chunkId, doSuffix) {
|
945
|
+
this._task.getForm().FormRefreshed = true;
|
946
|
+
if (doSuffix && this.CurrRec != null) {
|
947
|
+
await AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_REC_SUFFIX);
|
948
|
+
if (AccessHelper.eventsManager.GetStopExecutionFlag() || this._task.isAborting())
|
949
|
+
throw new RecordOutOfDataViewException(RecordOutOfDataViewException_ExceptionType.REC_SUFFIX_FAILED);
|
950
|
+
this._task.getForm().setSuffixDone();
|
951
|
+
}
|
952
|
+
let eventCode;
|
953
|
+
let clientRecId = this._currRecId;
|
954
|
+
switch (chunkId) {
|
955
|
+
case CHUNK_DV_TOP:
|
956
|
+
eventCode = InternalInterface.MG_ACT_DATAVIEW_TOP;
|
957
|
+
break;
|
958
|
+
case CHUNK_DV_BOTTOM:
|
959
|
+
eventCode = InternalInterface.MG_ACT_DATAVIEW_BOTTOM;
|
960
|
+
break;
|
961
|
+
case CHUNK_CACHE_PREV:
|
962
|
+
clientRecId = this.FirstRecord == null ? 0 : this.FirstRecord.getId();
|
963
|
+
eventCode = InternalInterface.MG_ACT_CACHE_PREV;
|
964
|
+
break;
|
965
|
+
case CHUNK_CACHE_NEXT:
|
966
|
+
eventCode = InternalInterface.MG_ACT_CACHE_NEXT;
|
967
|
+
clientRecId = this.LastRecord == null ? 0 : this.LastRecord.getId();
|
968
|
+
break;
|
969
|
+
default:
|
970
|
+
Logger.Instance.WriteExceptionToLogWithMsg('in DataView.fetchChunkFromServer() unknown chunk id: ' + chunkId);
|
971
|
+
return;
|
972
|
+
}
|
973
|
+
let cmd = CommandFactory.CreateEventCommand(this._task.getTaskTag(), eventCode);
|
974
|
+
cmd.ClientRecId = clientRecId;
|
975
|
+
await this.getTask().DataviewManager.Execute(cmd);
|
976
|
+
}
|
977
|
+
async FetchRecordsAheadFromServer() {
|
978
|
+
if (!this._includesLast)
|
979
|
+
await this.fetchChunkFromServer(CHUNK_CACHE_NEXT, false);
|
980
|
+
else if (!this._includesFirst)
|
981
|
+
await this.fetchChunkFromServer(CHUNK_CACHE_PREV, false);
|
982
|
+
}
|
983
|
+
recExists(recIdx) {
|
984
|
+
let lastRecIdx = this._recordsTab.getSize() - 1;
|
985
|
+
return recIdx >= 0 && recIdx <= lastRecIdx;
|
986
|
+
}
|
987
|
+
checkFirst(locateFirst) {
|
988
|
+
return this._recordsTab.getRecord(locateFirst) !== null;
|
989
|
+
}
|
990
|
+
getCurrRecIdx() {
|
991
|
+
if (this._currRecIdx === Int32.MinValue) {
|
992
|
+
if (!this.setCurrRec(this._currRecId, true)) {
|
993
|
+
Logger.Instance.WriteWarningToLogWithMsg('DataView.getCurrRecIdx(): _task ' +
|
994
|
+
(this.getTask()).PreviouslyActiveTaskId +
|
995
|
+
', record ' + this._currRecId + ' not found');
|
996
|
+
}
|
997
|
+
}
|
998
|
+
return this._currRecIdx;
|
999
|
+
}
|
1000
|
+
getCurrDBViewRowIdx() {
|
1001
|
+
return this.CurrRec.getDBViewRowIdx();
|
1002
|
+
}
|
1003
|
+
setTopRecIdx(newTopRecIdx) {
|
1004
|
+
this._oldTopRecIdx = this.getTopRecIdx();
|
1005
|
+
this._topRecIdx = newTopRecIdx;
|
1006
|
+
}
|
1007
|
+
getTopRecIdx() {
|
1008
|
+
return this._topRecIdx;
|
1009
|
+
}
|
1010
|
+
setTopRecIdxModified(val) {
|
1011
|
+
this._topRecIdxModified = val;
|
1012
|
+
}
|
1013
|
+
getChunkSize() {
|
1014
|
+
return this._chunkSize;
|
1015
|
+
}
|
1016
|
+
restoreTopRecIdx() {
|
1017
|
+
this._topRecIdx = this._oldTopRecIdx;
|
1018
|
+
}
|
1019
|
+
clear() {
|
1020
|
+
this._recordsTab.removeAll();
|
1021
|
+
this._original = null;
|
1022
|
+
let mgForm = this._task.getForm();
|
1023
|
+
if (mgForm !== null) {
|
1024
|
+
this._task.getForm().SetTableItemsCount(0, true);
|
1025
|
+
}
|
1026
|
+
this._modifiedRecordsTab.removeAll();
|
1027
|
+
this.init();
|
1028
|
+
}
|
1029
|
+
init() {
|
1030
|
+
this._currRecId = Int32.MinValue;
|
1031
|
+
this._currRecIdx = Int32.MinValue;
|
1032
|
+
this.CurrRec = null;
|
1033
|
+
this._prevCurrRec = null;
|
1034
|
+
this._includesFirst = false;
|
1035
|
+
this._includesLast = false;
|
1036
|
+
this.IsOneWayKey = false;
|
1037
|
+
this.setTopRecIdx(Int32.MinValue);
|
1038
|
+
this._fieldsTab.invalidate(false, true);
|
1039
|
+
}
|
1040
|
+
async computeSubForms() {
|
1041
|
+
if (await this.getTask().prepareCache(true)) {
|
1042
|
+
if (!await this.getTask().testAndSet(true))
|
1043
|
+
await this.compute(true, false);
|
1044
|
+
}
|
1045
|
+
else
|
1046
|
+
await this.compute(true, false);
|
1047
|
+
}
|
1048
|
+
async compute(subForms, forceClientCompute) {
|
1049
|
+
let tmpRec = null;
|
1050
|
+
let computeByServer = !this.computeByClient();
|
1051
|
+
let orgComputeBy = this._computeBy;
|
1052
|
+
if (forceClientCompute)
|
1053
|
+
this._computeBy = COMPUTE_NEWREC_ON_CLIENT;
|
1054
|
+
try {
|
1055
|
+
this.CurrRec.setInCompute(true);
|
1056
|
+
if (!subForms) {
|
1057
|
+
if (this.CurrRec.isNewRec()) {
|
1058
|
+
if (this._task.getMode() !== Constants.TASK_MODE_CREATE && !super.isEmptyDataview()) {
|
1059
|
+
this._task.setMode(Constants.TASK_MODE_CREATE);
|
1060
|
+
}
|
1061
|
+
}
|
1062
|
+
else if (this._task.getMode() === Constants.TASK_MODE_CREATE) {
|
1063
|
+
this._task.setMode(Constants.TASK_MODE_MODIFY);
|
1064
|
+
}
|
1065
|
+
}
|
1066
|
+
let getRecordData = computeByServer;
|
1067
|
+
if (subForms || (getRecordData && !this.CurrRec.isComputed() && !forceClientCompute)) {
|
1068
|
+
let command = CommandFactory.CreateComputeEventCommand(this._task.getTaskTag(), subForms, this._currRecId);
|
1069
|
+
await this._task.DataviewManager.Execute(command);
|
1070
|
+
}
|
1071
|
+
else {
|
1072
|
+
if (getRecordData) {
|
1073
|
+
tmpRec = new Record(this.CurrRec.getId(), this);
|
1074
|
+
tmpRec.Initialize();
|
1075
|
+
tmpRec.setInitialFldVals(true, true);
|
1076
|
+
}
|
1077
|
+
this._fieldsTab.setServerRcmp(false);
|
1078
|
+
let from = this._fieldsTab.getRMIdx();
|
1079
|
+
let size = this._fieldsTab.getRMSize();
|
1080
|
+
for (let i = from; i < from + size; i = i + 1) {
|
1081
|
+
let fld = this._fieldsTab.getField(i);
|
1082
|
+
if (getRecordData && this._fieldsTab.serverRcmpDone() && fld.IsVirtual && !fld.VirAsReal && !fld.hasInitExp()) {
|
1083
|
+
let currRec2 = this.CurrRec;
|
1084
|
+
this.CurrRec = tmpRec;
|
1085
|
+
try {
|
1086
|
+
fld.takeValFromRec();
|
1087
|
+
}
|
1088
|
+
finally {
|
1089
|
+
this.CurrRec = currRec2;
|
1090
|
+
}
|
1091
|
+
}
|
1092
|
+
if (!this._task.getForm().TransferringDataToGUI)
|
1093
|
+
await fld.compute(false);
|
1094
|
+
}
|
1095
|
+
}
|
1096
|
+
}
|
1097
|
+
finally {
|
1098
|
+
this.CurrRec.setInCompute(false);
|
1099
|
+
this.CurrRec.setLateCompute(false);
|
1100
|
+
this._computeBy = orgComputeBy;
|
1101
|
+
}
|
1102
|
+
}
|
1103
|
+
async addRecord(doSuffix, ignoreCurrRec, isCrelineAbove) {
|
1104
|
+
let newCurrRecId = (--this._lastCreatedRecId);
|
1105
|
+
let mode = DataModificationTypes.Insert;
|
1106
|
+
return await this.addRecord_1(doSuffix, ignoreCurrRec, false, newCurrRecId, mode, isCrelineAbove);
|
1107
|
+
}
|
1108
|
+
async addRecord_1(doSuffix, ignoreCurrRec, isFirstRecord, newCurrRecId, mode, isCrelineAbove) {
|
1109
|
+
let rec = new Record(newCurrRecId, this);
|
1110
|
+
rec.Initialize();
|
1111
|
+
rec.setInitialFldVals(false, !isFirstRecord);
|
1112
|
+
let newCurrRecIdx = 0;
|
1113
|
+
if (isCrelineAbove) {
|
1114
|
+
newCurrRecIdx = (this._currRecIdx >= 0
|
1115
|
+
? this._currRecIdx
|
1116
|
+
: 0);
|
1117
|
+
}
|
1118
|
+
else
|
1119
|
+
newCurrRecIdx = (this._currRecIdx != Int32.MinValue
|
1120
|
+
? this._currRecIdx + 1
|
1121
|
+
: 0);
|
1122
|
+
this._recordsTab.insertRecord(rec, newCurrRecIdx);
|
1123
|
+
rec.setMode(mode);
|
1124
|
+
try {
|
1125
|
+
let compute = !isFirstRecord;
|
1126
|
+
await this.setCurrRecByIdx(newCurrRecIdx, doSuffix, ignoreCurrRec, compute, Int32.MinValue);
|
1127
|
+
if (isFirstRecord && this.getTask().getMode() !== Constants.TASK_MODE_CREATE)
|
1128
|
+
rec.setOldRec();
|
1129
|
+
}
|
1130
|
+
catch (execption) {
|
1131
|
+
if (execption instanceof RecordOutOfDataViewException) {
|
1132
|
+
if (AccessHelper.eventsManager.GetStopExecutionFlag())
|
1133
|
+
newCurrRecIdx = -1;
|
1134
|
+
else
|
1135
|
+
throw new ApplicationException('in DataView.addRecord() invalid exception');
|
1136
|
+
}
|
1137
|
+
else
|
1138
|
+
throw execption;
|
1139
|
+
}
|
1140
|
+
return newCurrRecIdx;
|
1141
|
+
}
|
1142
|
+
async removeCurrRec() {
|
1143
|
+
let mgForm = this._task.getForm();
|
1144
|
+
let onDelete;
|
1145
|
+
if (this.CurrRec.getMode() === DataModificationTypes.Insert &&
|
1146
|
+
!this.getTask().transactionFailed(ConstInterface.TRANS_RECORD_PREFIX)) {
|
1147
|
+
this._modifiedRecordsTab.removeRecord(this.CurrRec);
|
1148
|
+
onDelete = false;
|
1149
|
+
}
|
1150
|
+
else {
|
1151
|
+
this.CurrRec.clearMode();
|
1152
|
+
this.CurrRec.setMode(DataModificationTypes.Delete);
|
1153
|
+
onDelete = true;
|
1154
|
+
}
|
1155
|
+
this.CurrRec.removeRecFromDc();
|
1156
|
+
this._recordsTab.removeRecord(this._currRecIdx);
|
1157
|
+
this.setChanged(true);
|
1158
|
+
if (this.isEmpty() && !this._task.IsTryingToStop) {
|
1159
|
+
await this.MoveToEmptyDataviewIfAllowed();
|
1160
|
+
}
|
1161
|
+
let newDisplayLine = this.calcLineToMove(onDelete);
|
1162
|
+
try {
|
1163
|
+
if (mgForm.isScreenMode()) {
|
1164
|
+
await this.setCurrRecByIdx(newDisplayLine, false, false, true, SET_DISPLAYLINE_BY_DV);
|
1165
|
+
}
|
1166
|
+
else {
|
1167
|
+
await mgForm.setCurrRowByDisplayLine(newDisplayLine, false, true);
|
1168
|
+
}
|
1169
|
+
}
|
1170
|
+
catch (exception) {
|
1171
|
+
if (exception instanceof RecordOutOfDataViewException) {
|
1172
|
+
try {
|
1173
|
+
if (!super.isEmptyDataview())
|
1174
|
+
newDisplayLine = mgForm.getPrevLine(newDisplayLine);
|
1175
|
+
if (mgForm.isScreenMode())
|
1176
|
+
await this.setCurrRecByIdx(newDisplayLine, false, false, true, SET_DISPLAYLINE_BY_DV);
|
1177
|
+
else
|
1178
|
+
await mgForm.setCurrRowByDisplayLine(newDisplayLine, false, true);
|
1179
|
+
}
|
1180
|
+
catch (exception) {
|
1181
|
+
if (exception instanceof RecordOutOfDataViewException) {
|
1182
|
+
this.reset();
|
1183
|
+
}
|
1184
|
+
else
|
1185
|
+
throw exception;
|
1186
|
+
}
|
1187
|
+
}
|
1188
|
+
else
|
1189
|
+
throw exception;
|
1190
|
+
}
|
1191
|
+
}
|
1192
|
+
RemoveRecord(record) {
|
1193
|
+
let recIdx = this._recordsTab.getRecIdx(record.getId());
|
1194
|
+
if (this._topRecIdx > recIdx)
|
1195
|
+
this._topRecIdx--;
|
1196
|
+
if (this._oldTopRecIdx > recIdx)
|
1197
|
+
this._oldTopRecIdx--;
|
1198
|
+
if (this._currRecIdx > recIdx)
|
1199
|
+
this._currRecIdx--;
|
1200
|
+
this._recordsTab.removeRecord(record);
|
1201
|
+
}
|
1202
|
+
async MoveToEmptyDataviewIfAllowed() {
|
1203
|
+
if (!super.isEmptyDataview() && this._task.getMode() !== Constants.TASK_MODE_CREATE) {
|
1204
|
+
if (await this._task.checkProp(PropInterface.PROP_TYPE_ALLOW_EMPTY_DATAVIEW, true))
|
1205
|
+
super.setEmptyDataview(true);
|
1206
|
+
}
|
1207
|
+
else {
|
1208
|
+
if (this._task.getMode() === Constants.TASK_MODE_CREATE && super.isEmptyDataview())
|
1209
|
+
super.setEmptyDataview(false);
|
1210
|
+
}
|
1211
|
+
}
|
1212
|
+
calcLineToMove(onDelete) {
|
1213
|
+
let newDisplayLine;
|
1214
|
+
if (onDelete)
|
1215
|
+
newDisplayLine = this._currRecIdx;
|
1216
|
+
else {
|
1217
|
+
if (this._currRecIdx > 0)
|
1218
|
+
newDisplayLine = this._currRecIdx - 1;
|
1219
|
+
else
|
1220
|
+
newDisplayLine = this._currRecIdx;
|
1221
|
+
}
|
1222
|
+
return newDisplayLine;
|
1223
|
+
}
|
1224
|
+
reset() {
|
1225
|
+
this._currRecId = Int32.MinValue;
|
1226
|
+
this._currRecIdx = Int32.MinValue;
|
1227
|
+
this.CurrRec = null;
|
1228
|
+
this.setTopRecIdx(Int32.MinValue);
|
1229
|
+
this.SetIncludesFirst(true);
|
1230
|
+
this.SetIncludesLast(true);
|
1231
|
+
}
|
1232
|
+
async cancelEdit(onlyReal, recomputeUnknowns) {
|
1233
|
+
let tempCurrRec = null;
|
1234
|
+
let recRemoved = false;
|
1235
|
+
let inEndTask = this._task.InEndTask;
|
1236
|
+
if (inEndTask)
|
1237
|
+
onlyReal = true;
|
1238
|
+
if (this.CurrRec.getMode() === DataModificationTypes.Insert && this.CurrRec.isNewRec()) {
|
1239
|
+
if ((this._includesFirst && this._includesLast && (this._recordsTab === null || this._recordsTab.getSize() === 1)) || !this.HasMainTable) {
|
1240
|
+
if (this._original !== null) {
|
1241
|
+
this.CurrRec.setSameAs(this._original, onlyReal);
|
1242
|
+
}
|
1243
|
+
}
|
1244
|
+
else {
|
1245
|
+
await this.removeCurrRec();
|
1246
|
+
recRemoved = true;
|
1247
|
+
this._original = this.CurrRec.replicate();
|
1248
|
+
}
|
1249
|
+
}
|
1250
|
+
else {
|
1251
|
+
if (!this.CurrRec.Modified) {
|
1252
|
+
let currCtrl = this._task.getLastParkedCtrl();
|
1253
|
+
if (currCtrl !== null)
|
1254
|
+
currCtrl.resetPrevVal();
|
1255
|
+
}
|
1256
|
+
if (recomputeUnknowns)
|
1257
|
+
tempCurrRec = this.CurrRec.replicate();
|
1258
|
+
if (this._original !== null)
|
1259
|
+
this.CurrRec.setSameAs(this._original, onlyReal);
|
1260
|
+
if ((this._original !== null && recomputeUnknowns) && !this.CurrRec.isSameRecData(tempCurrRec, false, false))
|
1261
|
+
await this.execUnknownRcmps(this._original);
|
1262
|
+
this.takeFldValsFromCurrRec();
|
1263
|
+
this._original = this.CurrRec.replicate();
|
1264
|
+
}
|
1265
|
+
return recRemoved;
|
1266
|
+
}
|
1267
|
+
isEmpty() {
|
1268
|
+
return this._includesFirst && this._includesLast && (this._recordsTab === null || this._recordsTab.getSize() === 0);
|
1269
|
+
}
|
1270
|
+
async addCurrToModified(setRecToOld) {
|
1271
|
+
if (isNullOrUndefined(setRecToOld)) {
|
1272
|
+
await this.addCurrToModified_0();
|
1273
|
+
return;
|
1274
|
+
}
|
1275
|
+
await this.addCurrToModified_1(setRecToOld);
|
1276
|
+
}
|
1277
|
+
async addCurrToModified_0() {
|
1278
|
+
await this.addCurrToModified(true);
|
1279
|
+
}
|
1280
|
+
async addCurrToModified_1(setRecToOld) {
|
1281
|
+
this._modifiedRecordsTab.addRecord(this.CurrRec);
|
1282
|
+
if (setRecToOld) {
|
1283
|
+
this.CurrRec.setOldRec();
|
1284
|
+
}
|
1285
|
+
let command = CommandFactory.CreateSetTransactionStateDataviewCommand(this.getTask().getTaskTag(), true);
|
1286
|
+
await this.getTask().DataviewManager.RemoteDataviewManager.Execute(command);
|
1287
|
+
}
|
1288
|
+
takeFldValsFromCurrRec() {
|
1289
|
+
this._fieldsTab.takeValsFromRec();
|
1290
|
+
}
|
1291
|
+
currEqualsPrev(fldList) {
|
1292
|
+
if (this.CurrRec !== null && this._prevCurrRec !== null) {
|
1293
|
+
if (this.CurrRec === this._prevCurrRec)
|
1294
|
+
return true;
|
1295
|
+
for (let i = 0; i < fldList.length; i = i + 1) {
|
1296
|
+
if (!this.CurrRec.fldValsEqual(this._prevCurrRec, fldList[i]))
|
1297
|
+
return false;
|
1298
|
+
}
|
1299
|
+
}
|
1300
|
+
else if (this.CurrRec !== this._prevCurrRec)
|
1301
|
+
return false;
|
1302
|
+
return true;
|
1303
|
+
}
|
1304
|
+
getTask() {
|
1305
|
+
Debug.Assert(this._task instanceof TaskBase);
|
1306
|
+
return this._task;
|
1307
|
+
}
|
1308
|
+
getForm() {
|
1309
|
+
return this._task.getForm();
|
1310
|
+
}
|
1311
|
+
modifiedRecordsNumber() {
|
1312
|
+
return this._modifiedRecordsTab.getSize();
|
1313
|
+
}
|
1314
|
+
getSize() {
|
1315
|
+
return this._recordsTab.getSize();
|
1316
|
+
}
|
1317
|
+
computeByClient() {
|
1318
|
+
return this._computeBy === COMPUTE_NEWREC_ON_CLIENT;
|
1319
|
+
}
|
1320
|
+
recExistsById(id) {
|
1321
|
+
return this._recordsTab.getRecord(id) !== null;
|
1322
|
+
}
|
1323
|
+
ParametersExist(iPos, iLen) {
|
1324
|
+
if (arguments.length === 2)
|
1325
|
+
return this.ParametersExist_0(iPos, iLen);
|
1326
|
+
return this.ParametersExist_1();
|
1327
|
+
}
|
1328
|
+
ParametersExist_0(iPos, iLen) {
|
1329
|
+
for (let i = iPos; i < iPos + iLen; i = i + 1) {
|
1330
|
+
if (super.getField(i).isParam())
|
1331
|
+
return true;
|
1332
|
+
}
|
1333
|
+
return false;
|
1334
|
+
}
|
1335
|
+
ParametersExist_1() {
|
1336
|
+
return this.ParametersExist(this._rmIdx, this._rmSize);
|
1337
|
+
}
|
1338
|
+
recInModifiedTab(id) {
|
1339
|
+
let record = this._modifiedRecordsTab.getRecord(id);
|
1340
|
+
return record !== null;
|
1341
|
+
}
|
1342
|
+
setPrevCurrRec(rec) {
|
1343
|
+
if (arguments.length === 0) {
|
1344
|
+
this.setPrevCurrRec_0();
|
1345
|
+
return;
|
1346
|
+
}
|
1347
|
+
this.setPrevCurrRec_1(rec);
|
1348
|
+
}
|
1349
|
+
setPrevCurrRec_0() {
|
1350
|
+
this._prevCurrRec = this.CurrRec;
|
1351
|
+
}
|
1352
|
+
setPrevCurrRec_1(rec) {
|
1353
|
+
this._prevCurrRec = rec;
|
1354
|
+
}
|
1355
|
+
isPrevCurrRecNull() {
|
1356
|
+
return this._prevCurrRec === null;
|
1357
|
+
}
|
1358
|
+
async execUnknownRcmps(orgRec) {
|
1359
|
+
let i;
|
1360
|
+
let from = this._fieldsTab.getRMIdx();
|
1361
|
+
let size = this._fieldsTab.getRMSize();
|
1362
|
+
let rec = this.getCurrRec();
|
1363
|
+
if (this._unknownRcmp === UNKNOWN_RCMPS_NOT_INITED) {
|
1364
|
+
for (i = from; i < from + size && this._unknownRcmp === UNKNOWN_RCMPS_NOT_INITED; i++) {
|
1365
|
+
let field = this._fieldsTab.getField(i);
|
1366
|
+
if (field.IsVirtual && !field.hasInitExp() && field.isServerRcmp())
|
1367
|
+
this._unknownRcmp = UNKNOWN_RCMPS_FOUND;
|
1368
|
+
}
|
1369
|
+
}
|
1370
|
+
if (this._unknownRcmp === UNKNOWN_RCMPS_FOUND && rec !== null) {
|
1371
|
+
for (i = from; i < from + size; i = i + 1) {
|
1372
|
+
let field = this._fieldsTab.getField(i);
|
1373
|
+
if (field.IsVirtual && !field.hasInitExp() && field.isServerRcmp() && !rec.fldValsEqual(orgRec, i)) {
|
1374
|
+
let fieldValue = rec.GetFieldValue(i);
|
1375
|
+
let isNullFld = rec.IsNull(i);
|
1376
|
+
rec.setFieldValue(i, orgRec.GetFieldValue(i), false);
|
1377
|
+
await field.setValueAndStartRecompute(fieldValue, isNullFld, false, false, false);
|
1378
|
+
}
|
1379
|
+
}
|
1380
|
+
}
|
1381
|
+
}
|
1382
|
+
setTransCleared() {
|
1383
|
+
this._transCleared = true;
|
1384
|
+
}
|
1385
|
+
async processRecovery() {
|
1386
|
+
if (!this._task.isAborting()) {
|
1387
|
+
let orgAction = this._pendingRecovery;
|
1388
|
+
let orgStopExecution = AccessHelper.eventsManager.GetStopExecutionFlag();
|
1389
|
+
this._pendingRecovery = RECOVERY_ACT_NONE;
|
1390
|
+
if (orgStopExecution)
|
1391
|
+
AccessHelper.eventsManager.setStopExecution(false);
|
1392
|
+
let temporaryResetInCtrlPrefix = this._task.InCtrlPrefix;
|
1393
|
+
if (temporaryResetInCtrlPrefix)
|
1394
|
+
this._task.InCtrlPrefix = false;
|
1395
|
+
switch (orgAction) {
|
1396
|
+
case RECOVERY_ACT_CANCEL:
|
1397
|
+
(this._task.DataView.getCurrRec()).resetUpdated();
|
1398
|
+
this.getTask().getTaskCache().clearCache();
|
1399
|
+
if (this.getSize() === 1 && this._task.getMode() === Constants.TASK_MODE_CREATE) {
|
1400
|
+
this.CurrRec.resetModified();
|
1401
|
+
this.CurrRec.clearMode();
|
1402
|
+
this.CurrRec.setMode(DataModificationTypes.Insert);
|
1403
|
+
this.CurrRec.setNewRec();
|
1404
|
+
this._original.setSameAs(this.CurrRec, false);
|
1405
|
+
}
|
1406
|
+
await AccessHelper.eventsManager.handleInternalEventWithTaskAndEventSubtype(this.getTask(), InternalInterface.MG_ACT_CANCEL, EventSubType.CancelWithNoRollback);
|
1407
|
+
break;
|
1408
|
+
case RECOVERY_ACT_MOVE_DIRECTION_BEGIN:
|
1409
|
+
let lastParkedControl = this._task.getLastParkedCtrl();
|
1410
|
+
if (lastParkedControl !== null)
|
1411
|
+
await lastParkedControl.invoke();
|
1412
|
+
break;
|
1413
|
+
case RECOVERY_ACT_BEGIN_SCREEN:
|
1414
|
+
this.getTask().setPreventRecordSuffix(true);
|
1415
|
+
await AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_TBL_BEGPAGE);
|
1416
|
+
this.getTask().setPreventRecordSuffix(false);
|
1417
|
+
break;
|
1418
|
+
case RECOVERY_ACT_BEGIN_TABLE:
|
1419
|
+
this._task.ActionManager.enable(InternalInterface.MG_ACT_TBL_BEGTBL, true);
|
1420
|
+
await AccessHelper.eventsManager.handleInternalEventWithTask(this._task, InternalInterface.MG_ACT_TBL_BEGTBL);
|
1421
|
+
this.getTask().getTaskCache().clearCache();
|
1422
|
+
break;
|
1423
|
+
default:
|
1424
|
+
AccessHelper.eventsManager.setStopExecution(orgStopExecution);
|
1425
|
+
break;
|
1426
|
+
}
|
1427
|
+
if (temporaryResetInCtrlPrefix)
|
1428
|
+
this._task.InCtrlPrefix = true;
|
1429
|
+
if (orgAction !== RECOVERY_ACT_NONE)
|
1430
|
+
AccessHelper.eventsManager.setStopExecution(true, orgAction !== RECOVERY_ACT_BEGIN_TABLE ? ClearEventsOnStopExecution.ALL : ClearEventsOnStopExecution.SERVER);
|
1431
|
+
}
|
1432
|
+
}
|
1433
|
+
replicate() {
|
1434
|
+
let rep = new DataView(this);
|
1435
|
+
rep._recordsTab = this._recordsTab.replicate();
|
1436
|
+
rep._currRecId = rep._recordsTab.getRecByIdx(0).getId();
|
1437
|
+
rep._currRecIdx = 0;
|
1438
|
+
rep.CurrRec = rep._recordsTab.getRecByIdx(0);
|
1439
|
+
rep._prevCurrRec = rep._recordsTab.getRecByIdx(0);
|
1440
|
+
rep._original = rep._recordsTab.getRecByIdx(0);
|
1441
|
+
rep.setTopRecIdx(Int32.MinValue);
|
1442
|
+
return rep;
|
1443
|
+
}
|
1444
|
+
getDvPosValue() {
|
1445
|
+
return this._dvPosValue;
|
1446
|
+
}
|
1447
|
+
getFirstDv() {
|
1448
|
+
return this._firstDv;
|
1449
|
+
}
|
1450
|
+
ResetFirstDv() {
|
1451
|
+
this._firstDv = false;
|
1452
|
+
}
|
1453
|
+
getCacheLRU() {
|
1454
|
+
return this._cacheLruTimeStamp;
|
1455
|
+
}
|
1456
|
+
setCacheLRU() {
|
1457
|
+
this._cacheLruTimeStamp = Misc.getSystemMilliseconds();
|
1458
|
+
}
|
1459
|
+
async setSameAs(newDv) {
|
1460
|
+
this._rmSize = newDv._rmSize;
|
1461
|
+
this._rmIdx = newDv._rmIdx;
|
1462
|
+
this._computeBy = newDv._computeBy;
|
1463
|
+
this._flushUpdates = newDv._flushUpdates;
|
1464
|
+
this._currRecId = newDv._currRecId;
|
1465
|
+
this._currRecIdx = newDv._currRecIdx;
|
1466
|
+
this._topRecId = newDv._topRecId;
|
1467
|
+
this.CurrRec = newDv.CurrRec;
|
1468
|
+
this._original = newDv._original;
|
1469
|
+
this._prevCurrRec = null;
|
1470
|
+
this._fieldsTab = newDv._fieldsTab;
|
1471
|
+
this._recordsTab = newDv._recordsTab;
|
1472
|
+
this._modifiedRecordsTab = newDv._modifiedRecordsTab;
|
1473
|
+
this._includesFirst = newDv._includesFirst;
|
1474
|
+
this._includesLast = newDv._includesLast;
|
1475
|
+
this._insertAt = newDv._insertAt;
|
1476
|
+
this._lastCreatedRecId = newDv._lastCreatedRecId;
|
1477
|
+
this._task = newDv._task;
|
1478
|
+
this._dcValsCollection = newDv._dcValsCollection;
|
1479
|
+
this._recovery = newDv._recovery;
|
1480
|
+
this._pendingRecovery = newDv._pendingRecovery;
|
1481
|
+
this._hasMainTable = newDv._hasMainTable;
|
1482
|
+
this._chunkSize = newDv._chunkSize;
|
1483
|
+
this._firstDv = newDv._firstDv;
|
1484
|
+
this._lastSessionCounter = newDv._lastSessionCounter;
|
1485
|
+
this._skipParsing = newDv._skipParsing;
|
1486
|
+
this._unknownRcmp = newDv._unknownRcmp;
|
1487
|
+
this._transCleared = newDv._transCleared;
|
1488
|
+
this._dvPosValue = newDv._dvPosValue;
|
1489
|
+
this._cacheLruTimeStamp = newDv._cacheLruTimeStamp;
|
1490
|
+
this._changed = newDv._changed;
|
1491
|
+
this._locateFirstRec = newDv._locateFirstRec;
|
1492
|
+
super.setEmptyDataview(newDv.isEmptyDataview());
|
1493
|
+
this._task.setMode(newDv.taskModeFromCache);
|
1494
|
+
try {
|
1495
|
+
if (this.getTask().HasLoacte()) {
|
1496
|
+
await this.setCurrRec(this._locateFirstRec, true);
|
1497
|
+
this.setTopRecIdx(this._recordsTab.getRecIdx(this._locateFirstRec));
|
1498
|
+
}
|
1499
|
+
else {
|
1500
|
+
this.getTask().setPreventRecordSuffix(true);
|
1501
|
+
await this.setCurrRecByIdx(Int32.MinValue, true, false, true, Int32.MinValue);
|
1502
|
+
this.getTask().setPreventRecordSuffix(false);
|
1503
|
+
this.setTopRecIdx(0);
|
1504
|
+
}
|
1505
|
+
if (!this._task.getForm().isScreenMode()) {
|
1506
|
+
if (this._task.getForm().isTableWithPagination()) {
|
1507
|
+
this.TotalRecordsCount = newDv.TotalRecordsCount;
|
1508
|
+
this.RecordsBeforeCurrentView = newDv.RecordsBeforeCurrentView;
|
1509
|
+
}
|
1510
|
+
await this.setCurrRecByIdx(this._topRecIdx, true, false, true, Int32.MinValue);
|
1511
|
+
}
|
1512
|
+
if (this._task.getForm() !== null)
|
1513
|
+
this._task.getForm().updateDisplayLineByDV();
|
1514
|
+
}
|
1515
|
+
catch (ex) {
|
1516
|
+
if (ex instanceof RecordOutOfDataViewException) {
|
1517
|
+
Logger.Instance.WriteDevToLog('wrong top record idx in DataView.setSameAs' + ex.Message);
|
1518
|
+
}
|
1519
|
+
else
|
1520
|
+
throw ex;
|
1521
|
+
}
|
1522
|
+
}
|
1523
|
+
setChanged(val) {
|
1524
|
+
this._changed = val;
|
1525
|
+
}
|
1526
|
+
getChanged() {
|
1527
|
+
return this._changed;
|
1528
|
+
}
|
1529
|
+
getLocateFirstRec() {
|
1530
|
+
return this._locateFirstRec;
|
1531
|
+
}
|
1532
|
+
setLocateFirstRec(newFirst) {
|
1533
|
+
this._locateFirstRec = newFirst;
|
1534
|
+
}
|
1535
|
+
getRecByIdx(idx) {
|
1536
|
+
return this._recordsTab.getRecByIdx(idx);
|
1537
|
+
}
|
1538
|
+
getServerCurrRec() {
|
1539
|
+
return this._recordsTab.getServerCurrRec();
|
1540
|
+
}
|
1541
|
+
zeroServerCurrRec() {
|
1542
|
+
this._recordsTab.zeroServerCurrRec();
|
1543
|
+
}
|
1544
|
+
inRollback() {
|
1545
|
+
let inRollback = false;
|
1546
|
+
if (this._recovery === ConstInterface.RECOVERY_ROLLBACK && this.getTask().isTransactionOwner()) {
|
1547
|
+
inRollback = true;
|
1548
|
+
}
|
1549
|
+
return inRollback;
|
1550
|
+
}
|
1551
|
+
getRecIdx(id) {
|
1552
|
+
return this._recordsTab.getRecIdx(id);
|
1553
|
+
}
|
1554
|
+
backupCurrent() {
|
1555
|
+
return this.CurrRec.replicate();
|
1556
|
+
}
|
1557
|
+
restoreCurrent(recBackup) {
|
1558
|
+
Debug.Assert(recBackup !== null);
|
1559
|
+
this._currRecId = recBackup.getId();
|
1560
|
+
this._currRecIdx = this._recordsTab.getRecIdx(this._currRecId);
|
1561
|
+
this.CurrRec = this._recordsTab.getRecByIdx(this._currRecIdx);
|
1562
|
+
this.CurrRec.setSameAs(recBackup, false);
|
1563
|
+
this.takeFldValsFromCurrRec();
|
1564
|
+
}
|
1565
|
+
GetCurrentRecId() {
|
1566
|
+
return this._currRecId;
|
1567
|
+
}
|
1568
|
+
DataviewBoundriesAreChanged(orgIncludesFirst, orgIncludesLast) {
|
1569
|
+
return orgIncludesFirst !== this.IncludesFirst() || orgIncludesLast !== this.IncludesLast();
|
1570
|
+
}
|
1571
|
+
GetRouteParams() {
|
1572
|
+
let params = new List();
|
1573
|
+
for (let i = 0; i < this._fieldsTab.getSize(); i++) {
|
1574
|
+
let field = this._fieldsTab.getField(i);
|
1575
|
+
let val;
|
1576
|
+
if (field.IsExposedRouteParam && !field.isNull()) {
|
1577
|
+
switch (field.getType()) {
|
1578
|
+
case StorageAttribute.ALPHA:
|
1579
|
+
case StorageAttribute.UNICODE:
|
1580
|
+
{
|
1581
|
+
val = field.getDispValue();
|
1582
|
+
if (field.isNull())
|
1583
|
+
val = field.getNullDisplay();
|
1584
|
+
val = val.trim();
|
1585
|
+
params.push(val.length === 0 ? ' ' : val);
|
1586
|
+
}
|
1587
|
+
break;
|
1588
|
+
case StorageAttribute.BOOLEAN:
|
1589
|
+
{
|
1590
|
+
if (field.isNull())
|
1591
|
+
params.push(false);
|
1592
|
+
else
|
1593
|
+
params.push((field.getDispValue()).charAt(0) === '1');
|
1594
|
+
}
|
1595
|
+
break;
|
1596
|
+
case StorageAttribute.NUMERIC: {
|
1597
|
+
val = field.getDispValue();
|
1598
|
+
if (field.isNull())
|
1599
|
+
val = field.getNullDisplay();
|
1600
|
+
let pic = new PIC(field.getPicture(), field.getType(), this.getTask().getCompIdx());
|
1601
|
+
val = DisplayConvertor.Instance.mg2disp(val, '', pic, true, 0, false);
|
1602
|
+
params.push(val);
|
1603
|
+
break;
|
1604
|
+
}
|
1605
|
+
}
|
1606
|
+
}
|
1607
|
+
}
|
1608
|
+
return (params.length > 0) ? params : null;
|
1609
|
+
}
|
1610
|
+
}
|
1611
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGF0YVZpZXcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbmdpbmUvc3JjL2RhdGEvRGF0YVZpZXcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixLQUFLLEVBQ0wsS0FBSyxFQUNMLEtBQUssRUFDTCxpQkFBaUIsRUFDakIsSUFBSSxFQUNKLE9BQU8sRUFFUixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFDTCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDTixJQUFJLEVBQ0osZ0JBQWdCLEVBQ2hCLFlBQVksRUFDWixTQUFTLEVBQ1YsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wscUJBQXFCLEVBRXJCLGdCQUFnQixFQUloQixHQUFHLEVBRUgsYUFBYSxFQUNkLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUU3QyxPQUFPLEVBQUUsY0FBYyxJQUFJLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RCxPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLDBDQUEwQyxFQUMzQyxNQUFNLGdDQUFnQyxDQUFDO0FBRXhDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFeEMsT0FBTyxF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LEtBQUssR0FBRyxDQUFDLENBQUM7d0JBQzFELENBQUM7d0JBQ0MsTUFBTTtvQkFFUixLQUFLLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7d0JBQzlCLEdBQUcsR0FBRyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7d0JBQzNCLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRTs0QkFDaEIsR0FBRyxHQUFHLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQzt3QkFDL0IsSUFBSSxHQUFHLEdBQVEsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQzt3QkFDekYsR0FBRyxHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQzt3QkFDdEUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDakIsTUFBTTtvQkFDUixDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUM3QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFwcGxpY2F0aW9uRXhjZXB0aW9uLFxyXG4gIERlYnVnLFxyXG4gIEludDMyLFxyXG4gIEludDY0LFxyXG4gIGlzTnVsbE9yVW5kZWZpbmVkLFxyXG4gIExpc3QsXHJcbiAgTk51bWJlcixcclxuICBTdHJpbmdCdWlsZGVyXHJcbn0gZnJvbSAnQG1hZ2ljLXhwYS9tc2NvcmVsaWInO1xyXG5pbXBvcnQge1xyXG4gIENvbnN0YW50cyxcclxuICBJbnRlcm5hbEludGVyZmFjZSxcclxuICBMb2dnZXIsXHJcbiAgTWlzYyxcclxuICBTdG9yYWdlQXR0cmlidXRlLFxyXG4gIFhNTENvbnN0YW50cyxcclxuICBYbWxQYXJzZXJcclxufSBmcm9tICdAbWFnaWMteHBhL3V0aWxzJztcclxuaW1wb3J0IHtcclxuICBEYXRhTW9kaWZpY2F0aW9uVHlwZXMsXHJcbiAgRGNWYWx1ZXMsXHJcbiAgRGlzcGxheUNvbnZlcnRvcixcclxuICBJUmVjb3JkLFxyXG4gIE1nQ29udHJvbEJhc2UsXHJcbiAgTWdGb3JtQmFzZSxcclxuICBQSUMsXHJcbiAgUHJvcGVydHksXHJcbiAgUHJvcEludGVyZmFjZVxyXG59IGZyb20gJ0BtYWdpYy14cGEvZ3VpJztcclxuaW1wb3J0IHsgQ29uc3RJbnRlcmZhY2UgfSBmcm9tICcuLi9Db25zdEludGVyZmFjZSc7XHJcbmltcG9ydCB7IFJlY29yZHNUYWJsZSB9IGZyb20gJy4vUmVjb3Jkc1RhYmxlJztcclxuaW1wb3J0IHsgUmVjb3JkIH0gZnJvbSAnLi9SZWNvcmQnO1xyXG5pbXBvcnQgeyBUYXNrQmFzZSB9IGZyb20gJy4uL3Rhc2tzL1Rhc2tCYXNlJztcclxuaW1wb3J0IHsgTWdGb3JtIH0gZnJvbSAnLi4vZ3VpL01nRm9ybSc7XHJcbmltcG9ydCB7IEZpZWxkc1RhYmxlRXh0IGFzIEZpZWxkc1RhYmxlIH0gZnJvbSAnLi9GaWVsZHNUYWJsZSc7XHJcbmltcG9ydCB7XHJcbiAgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbixcclxuICBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uX0V4Y2VwdGlvblR5cGVcclxufSBmcm9tICcuL1JlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24nO1xyXG5pbXBvcnQgeyBJQ2xpZW50Q29tbWFuZCB9IGZyb20gJy4uL2NvbW1hbmRzL0lDbGllbnRDb21tYW5kJztcclxuaW1wb3J0IHsgQ29tbWFuZEZhY3RvcnkgfSBmcm9tICcuLi9jb21tYW5kcy9DbGllbnRUb1NlcnZlci9Db21tYW5kRmFjdG9yeSc7XHJcbmltcG9ydCB7IFhNTEJhc2VkRGNWYWx1ZXNCdWlsZGVyIH0gZnJvbSAnLi9YTUxCYXNlZERjVmFsdWVzQnVpbGRlcic7XHJcbmltcG9ydCB7IEZpZWxkIH0gZnJvbSAnLi9GaWVsZCc7XHJcbmltcG9ydCB7IE1nQ29udHJvbCB9IGZyb20gJy4uL2d1aS9NZ0NvbnRyb2wnO1xyXG5pbXBvcnQgeyBFdmVudFN1YlR5cGUgfSBmcm9tICcuLi9lbnVtcyc7XHJcbmltcG9ydCB7IEV2ZW50Q29tbWFuZCB9IGZyb20gJy4uL2NvbW1hbmRzL0NsaWVudFRvU2VydmVyL0V2ZW50Q29tbWFuZCc7XHJcbmltcG9ydCB7IFJlbW90ZUNvbW1hbmRzUHJvY2Vzc29yIH0gZnJvbSAnLi4vcmVtb3RlL1JlbW90ZUNvbW1hbmRzUHJvY2Vzc29yJztcclxuaW1wb3J0IHsgRmllbGRCYXNlIH0gZnJvbSAnLi9GaWVsZEJhc2UnO1xyXG5pbXBvcnQgeyBDb21tYW5kc1Byb2Nlc3Nvck1hbmFnZXIgfSBmcm9tICcuLi9Db21tYW5kc1Byb2Nlc3Nvck1hbmFnZXInO1xyXG5pbXBvcnQgeyBEYXRhVmlld0Jhc2UgfSBmcm9tICcuL0RhdGFWaWV3QmFzZSc7XHJcbmltcG9ydCB7IEFjY2Vzc0hlbHBlciwgQ2xlYXJFdmVudHNPblN0b3BFeGVjdXRpb24gfSBmcm9tICcuLi9BY2Nlc3NIZWxwZXInO1xyXG5pbXBvcnQgeyBNR0RhdGFDb2xsZWN0aW9uIH0gZnJvbSAnLi4vdGFza3MvTUdEYXRhQ29sbGVjdGlvbic7XHJcbmltcG9ydCB7IFRhc2sgfSBmcm9tICcuLi90YXNrcy9UYXNrJztcclxuXHJcblxyXG4vLyBDT05TVEFOVFNcclxuZXhwb3J0IGNvbnN0IFNFVF9ESVNQTEFZTElORV9CWV9EVjogbnVtYmVyID0gSW50MzIuTWluVmFsdWU7XHJcbmNvbnN0IENPTVBVVEVfTkVXUkVDX09OX0NMSUVOVDogc3RyaW5nID0gJ0MnO1xyXG5jb25zdCBVTktOT1dOX1JDTVBTX05PVF9JTklURUQ6IHN0cmluZyA9ICdNJztcclxuY29uc3QgVU5LTk9XTl9SQ01QU19GT1VORDogc3RyaW5nID0gJ1knO1xyXG5cclxuY29uc3QgSU5WT0tFRF9GUk9NX09GRkxJTkVfVEFTSzogc3RyaW5nID0gJy05OTk5OSc7XHJcblxyXG5jb25zdCBDSFVOS19DQUNIRV9ORVhUOiBzdHJpbmcgPSAnTic7XHJcbmNvbnN0IENIVU5LX0NBQ0hFX1BSRVY6IHN0cmluZyA9ICdQJztcclxuY29uc3QgQ0hVTktfRFZfQk9UVE9NOiBzdHJpbmcgPSAnQic7XHJcbmNvbnN0IENIVU5LX0RWX1RPUDogc3RyaW5nID0gJ1QnO1xyXG5cclxuY29uc3QgQ09NUFVURV9GTFVTSF9VUERBVEVTOiBzdHJpbmcgPSAnSCc7XHJcblxyXG5jb25zdCBDT01QVVRFX05FV1JFQ19PTl9TRVJWRVI6IHN0cmluZyA9ICdTJztcclxuY29uc3QgRU5EX0RWX1RBRzogc3RyaW5nID0gJzwvJyArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19EQVRBVklFVyArICc+JztcclxuY29uc3QgUkVDT1ZFUllfQUNUX0JFR0lOX1NDUkVFTjogc3RyaW5nID0gJ1MnO1xyXG5cclxuLy8gcmVjb3ZlcnkgYWN0aW9uIHRha2VuIGJ5IHRoZSBjbGllbnQgaW4gcmVzcG9uc2UgdG8gcmVjb3ZlcnkgdHlwZVxyXG5jb25zdCBSRUNPVkVSWV9BQ1RfQkVHSU5fVEFCTEU6IHN0cmluZyA9ICdUJztcclxuY29uc3QgUkVDT1ZFUllfQUNUX0NBTkNFTDogc3RyaW5nID0gJ0MnO1xyXG5jb25zdCBSRUNPVkVSWV9BQ1RfTU9WRV9ESVJFQ1RJT05fQkVHSU46IHN0cmluZyA9ICdCJztcclxuY29uc3QgUkVDT1ZFUllfQUNUX05PTkU6IHN0cmluZyA9ICdOJztcclxuY29uc3QgVFJBTlNfU1RBVF9DTE9TRUQ6IHN0cmluZyA9ICdDJztcclxuY29uc3QgVFJBTlNfU1RBVF9PUEVORUQ6IHN0cmluZyA9ICdPJztcclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgdGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBkYXRhdmlldyBvZiBhIHRhc2tcclxuZXhwb3J0IGNsYXNzIERhdGFWaWV3IGV4dGVuZHMgRGF0YVZpZXdCYXNlIHtcclxuICBwcml2YXRlIF9jYWNoZUxydVRpbWVTdGFtcDogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIF9jaGFuZ2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfY2h1bmtTaXplOiBudW1iZXIgPSAzMDtcclxuICBwcml2YXRlIF9jb21wdXRlQnk6IHN0cmluZyA9ICdcXDAnOyAvLyB0ZWxscyB0aGUgY2xpZW50IHRvIGV4ZWN1dGUgdGhlIGNvbXB1dGUgb2YgbmV3IHJlY29yZHMgb24gdGhlIGNsaWVudCBvciBvbiB0aGUgc2VydmVyXHJcbiAgcHJpdmF0ZSBfY3VyclJlY0lkOiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgX2N1cnJSZWNJZHg6IG51bWJlciA9IDA7XHJcbiAgcHJpdmF0ZSBfZHZQb3NWYWx1ZTogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIF9maXJzdER2OiBib29sZWFuID0gdHJ1ZTtcclxuICBwcml2YXRlIF9mbHVzaFVwZGF0ZXM6IGJvb2xlYW4gPSBmYWxzZTsgLy8gVFJVRSBtZWFucyB0aGF0IHdoZW5ldmVyIGEgcmVjb3JkIGlzIGNoYW5nZWQgd2UgbXVzdCBzZW5kIGl0IHRvIHRoZSBzZXJ2ZXJcclxuICBwcml2YXRlIF9oYXNNYWluVGFibGU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBwcml2YXRlIF9pbnNlcnRBdDogc3RyaW5nID0gJyAnO1xyXG5cclxuICBzZXQgSW5zZXJ0QXQodmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5faW5zZXJ0QXQgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBJbnNlcnRBdCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luc2VydEF0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyB0cnVlLCBpZiB3ZSBhcmUgZXhlY3V0aW5nIGxvY2FsIGRhdGF2aWV3IGNvbW1hbmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIEluTG9jYWxEYXRhdmlld0NvbW1hbmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9sYXN0Q3JlYXRlZFJlY0lkOiBudW1iZXIgPSAwOyAvLyB0aGUgcmVjb3JkIGlkIG9mIHRoZSBsYXN0IGNyZWF0ZWQgcmVjb3JkIGlkXHJcbiAgcHJpdmF0ZSBfbGFzdFNlc3Npb25Db3VudGVyOiBudW1iZXIgPSBJbnQ2NC5NaW5WYWx1ZTtcclxuICBwcml2YXRlIF9sb2NhdGVGaXJzdFJlYzogbnVtYmVyID0gLTE7XHJcbiAgcHJpdmF0ZSBfbW9kaWZpZWRSZWNvcmRzVGFiOiBSZWNvcmRzVGFibGUgPSBudWxsOyAvLyBhZnRlciBzZW5kaW5nIHRoZXNlIHJlY29yZHMgdG8gdGhlIHNlcnZlciB0aGUgbGlzdCBpcyBjbGVhcmVkXHJcblxyXG4gIHByaXZhdGUgX29sZFRvcFJlY0lkeDogbnVtYmVyID0gSW50MzIuTWluVmFsdWU7XHJcbiAgcHJpdmF0ZSBfb3JpZ2luYWw6IFJlY29yZCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcGVuZGluZ1JlY292ZXJ5OiBzdHJpbmcgPSBSRUNPVkVSWV9BQ1RfTk9ORTsgLy8gd2hlbiBkaWZmZXJlbnQgdGhhbiBOT05FLCBtZWFucyB0aGUgc2VydmVyIG9yZGVyIGZvciByZWNvdmVyeSB3YXMgbm90IHBlcmZvcm1lZCAoeWV0KS5cclxuICBwcml2YXRlIF9wcmV2Q3VyclJlYzogUmVjb3JkID0gbnVsbDtcclxuICBwcml2YXRlIF9yZWNvcmRzVGFiOiBSZWNvcmRzVGFibGUgPSBudWxsOyAvLyA8ZGF0YXZpZXc+IC4uLjwvZGF0YXZpZXc+IHRhZ1xyXG4gIHByaXZhdGUgX3JlY292ZXJ5OiBzdHJpbmcgPSBDb25zdEludGVyZmFjZS5SRUNPVkVSWV9OT05FOyAvLyByZWNvdmVyeSBhY3Rpb24gcmVxdWVzdCwgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyXHJcbiAgcHJpdmF0ZSBfcm1JZHg6IG51bWJlciA9IDA7IC8vIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZmllbGQgaW4gdGhlIHJlY29yZCBtYWluXHJcbiAgcHJpdmF0ZSBfcm1TaXplOiBudW1iZXIgPSAwOyAvLyBudW1iZXIgb2YgXCJzZWxlY3RcInMgaW4gdGhlIHJlY29yZCBtYWluXHJcbiAgcHJpdmF0ZSBfc2tpcFBhcnNpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF90b3BSZWNJZDogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIF90b3BSZWNJZHg6IG51bWJlciA9IEludDMyLk1pblZhbHVlO1xyXG4gIHByaXZhdGUgX3RvcFJlY0lkeE1vZGlmaWVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfdHJhbnNDbGVhcmVkOiBib29sZWFuID0gZmFsc2U7IC8vIElmIHRydWUsIF90YXNrIGlzIHRoZSBvd25lciBvZiBhIFJlYyBsZXZlbCB0cmFuc2FjdGlvbiBhbmQgdGhlIF90YXNrIGlzIGluIF90YXNrIHN1ZmZpeFxyXG4gIHByaXZhdGUgX3Vua25vd25SY21wOiBzdHJpbmcgPSBVTktOT1dOX1JDTVBTX05PVF9JTklURUQ7IC8vIHNpZ25hbHMgaWYgYSB2aXJ0dWFsIGZpZWxkIHdpdGhvdXQgaW5pdCBleHByZXNzaW9uIGhhcyBzZXJ2ZXIgcmNtcCBhY3Rpb25cclxuXHJcbiAgSXNPbmVXYXlLZXk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgX2luY2x1ZGVzRmlyc3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBfaW5jbHVkZXNMYXN0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgX3NlcnZlclRyYW5zQ2FjaGVFbXB0eTogYm9vbGVhbiA9IHRydWU7IC8vIGluZGljYXRpb24gd2hldGhlciB0aGUgc2VydmVyIHNpZGUgdHJhbnNhY3Rpb24gY2FjaGUgaXMgZW1wdHlcclxuXHJcbiAgcHJpdmF0ZSBfY3VyclJlY19ET19OT1RfVVNFX0RJUkVDVExZX1VTRV9TRVRURVJfR0VUVEVSOiBSZWNvcmQgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIGdldCBDdXJyUmVjKCk6IFJlY29yZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VyclJlY19ET19OT1RfVVNFX0RJUkVDVExZX1VTRV9TRVRURVJfR0VUVEVSO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXQgQ3VyclJlYyh2YWx1ZTogUmVjb3JkKSB7XHJcbiAgICAvLyByZXNldCB0aGUgcHJldiBkY1ZhbElkcyBpbiBtZ2NvbnRyb2xcclxuICAgIGlmICh0aGlzLl9jdXJyUmVjX0RPX05PVF9VU0VfRElSRUNUTFlfVVNFX1NFVFRFUl9HRVRURVIgIT09IG51bGwgJiYgdmFsdWUgPT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fY3VyclJlY19ET19OT1RfVVNFX0RJUkVDVExZX1VTRV9TRVRURVJfR0VUVEVSLnJlc2V0RGNWYWx1ZUlkKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9jdXJyUmVjX0RPX05PVF9VU0VfRElSRUNUTFlfVVNFX1NFVFRFUl9HRVRURVIgPSB2YWx1ZTtcclxuXHJcbiAgICAvLyBzZXQgdGhlIGRjVmFsSWRzIGluIG1nY29udHJvbFxyXG4gICAgaWYgKHRoaXMuX2N1cnJSZWNfRE9fTk9UX1VTRV9ESVJFQ1RMWV9VU0VfU0VUVEVSX0dFVFRFUiAhPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9jdXJyUmVjX0RPX05PVF9VU0VfRElSRUNUTFlfVVNFX1NFVFRFUl9HRVRURVIuU2V0RGNWYWx1ZUlkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgRmx1c2hVcGRhdGVzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZsdXNoVXBkYXRlcztcclxuICB9XHJcblxyXG4gIGdldCBIYXNNYWluVGFibGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faGFzTWFpblRhYmxlO1xyXG4gIH1cclxuXHJcbiAgREJWaWV3U2l6ZTogbnVtYmVyID0gMDtcclxuICB0YXNrTW9kZUZyb21DYWNoZTogc3RyaW5nO1xyXG5cclxuICBnZXQgQ3VycmVudFJlY0lkKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VyclJlY0lkO1xyXG4gIH1cclxuXHJcbiAgRHZjb3VudDogbnVtYmVyID0gMDtcclxuICBUb3RhbFJlY29yZHNDb3VudDogbnVtYmVyID0gMDtcclxuICBSZWNvcmRzQmVmb3JlQ3VycmVudFZpZXc6IG51bWJlciA9IDA7XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZmlyc3QgRGF0YXZpZXcgUmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXQgRmlyc3RSZWNvcmQoKTogSVJlY29yZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmVjb3Jkc1RhYi5nZXRSZWNCeUlkeCgwKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gbGFzdCBkYXRhdmlldyByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldCBMYXN0UmVjb3JkKCk6IElSZWNvcmQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlY29yZHNUYWIuZ2V0UmVjQnlJZHgodGhpcy5fcmVjb3Jkc1RhYi5nZXRTaXplKCkgLSAxKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBDVE9SXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjb25zdHJ1Y3Rvcih0YXNrOiBUYXNrQmFzZSk7XHJcbiAgY29uc3RydWN0b3IoRGF0YVZpZXc6IERhdGFWaWV3KTtcclxuICBjb25zdHJ1Y3Rvcih0YXNrT3JEYXRhVmlldzogRGF0YVZpZXcgfCBUYXNrQmFzZSkge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIGlmICh0YXNrT3JEYXRhVmlldyBpbnN0YW5jZW9mIFRhc2tCYXNlKSB7XHJcbiAgICAgIHRoaXMuX3Rhc2sgPSA8VGFza0Jhc2U+dGFza09yRGF0YVZpZXc7XHJcbiAgICAgIHRoaXMuX2ZpZWxkc1RhYiA9IG5ldyBGaWVsZHNUYWJsZSgpO1xyXG4gICAgICB0aGlzLl9yZWNvcmRzVGFiID0gbmV3IFJlY29yZHNUYWJsZSh0cnVlKTtcclxuICAgICAgdGhpcy5fbW9kaWZpZWRSZWNvcmRzVGFiID0gbmV3IFJlY29yZHNUYWJsZShmYWxzZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMsIHRhc2tPckRhdGFWaWV3KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5pbml0KCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2tzIGlmIHRoZSBmaXJzdCByb3cgb2YgZGF0YSBpcyBleGlzdHMgaW4gdGhlIGNsaWVudCdzIGRhdGEgdmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlIGlzIHRoZSBmaXJzdCByb3cgb2YgZGF0YSBpcyBpbmNsdWRlZCBpbiB0aGUgY2xpZW50IDwvcmV0dXJucz5cclxuICBJbmNsdWRlc0ZpcnN0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luY2x1ZGVzRmlyc3Q7XHJcbiAgfVxyXG5cclxuICBnZXQgU2VydmVyVHJhbnNhY3Rpb25DYWNoZUVtcHR5KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NlcnZlclRyYW5zQ2FjaGVFbXB0eTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVja3MgaWYgdGhlIGxhc3Qgcm93IG9mIGRhdGEgaXMgaW5jbHVkZWQgaW4gdGhlIGNsaWVudCdzIGRhdGEgdmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0cnVlIGlmIHRoZSBsYXN0IHJvdyBvZiBkYXRhIGlzIGluY2x1ZGVkIGluIHRoZSBjbGllbnQncyBkYXRhIHZpZXcgPC9yZXR1cm5zPlxyXG4gIEluY2x1ZGVzTGFzdCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pbmNsdWRlc0xhc3Q7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcGFyc2UgdGhlIERWSEVBREVSIHRhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZmlsbEhlYWRlckRhdGEocGFyc2VyOiBYbWxQYXJzZXIpOiB2b2lkIHtcclxuICAgIHdoaWxlICh0aGlzLmluaXRIZWFkZXJJbm5lck9iamVjdHMocGFyc2VyLCBwYXJzZXIuZ2V0TmV4dFRhZygpKSkge1xyXG4gICAgfVxyXG4gICAgdGhpcy5EdmNvdW50ID0gKDxUYXNrQmFzZT50aGlzLl90YXNrKS5jdGxfaXRtXzRfcGFyZW50X3ZlZSgwLCAxKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwYXJzZSB0aGUgRFZIRUFERVIgaW5uZXIgb2JqZWN0c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmb3VuZFRhZ05hbWVcIj4gIG5hbWUgb2YgdGFnLCBvZiBvYmplY3QsIHdoaWNoIG5lZWQgYmUgYWxsb2NhdGVkPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGlzIGZpbmlzaGVkIGlubmVyIHRhZzwvcmV0dXJucz5cclxuICBwcml2YXRlIGluaXRIZWFkZXJJbm5lck9iamVjdHMocGFyc2VyOiBYbWxQYXJzZXIsIGZvdW5kVGFnTmFtZTogU3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09PSBudWxsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKGZvdW5kVGFnTmFtZSA9PT0gWE1MQ29uc3RhbnRzLk1HX1RBR19EVkhFQURFUikge1xyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVEZXZUb0xvZygnZHZoZWFkZXIgZm91bmQnKTtcclxuICAgICAgdGhpcy5nZXRIZWFkZXJBdHRyaWJ1dGVzKHBhcnNlcik7XHJcbiAgICAgIHRoaXMuX2ZpZWxkc1RhYi5maWxsRGF0YShwYXJzZXIsIHRoaXMpO1xyXG4gICAgICAoPEZpZWxkc1RhYmxlPnRoaXMuX2ZpZWxkc1RhYikuc2V0Uk1Qb3ModGhpcy5fcm1TaXplLCB0aGlzLl9ybUlkeCk7XHJcbiAgICB9IGVsc2UgaWYgKGZvdW5kVGFnTmFtZSA9PT0gKCcvJyArIFhNTENvbnN0YW50cy5NR19UQUdfRFZIRUFERVIpKSB7XHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgyRW5kT2ZUYWcoKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSBlbHNlIHJldHVybiBmYWxzZTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgRFZIRUFERVIgdGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGdldEhlYWRlckF0dHJpYnV0ZXMocGFyc2VyOiBYbWxQYXJzZXIpOiB2b2lkIHtcclxuICAgIGxldCB0b2tlbnNWZWN0b3I6IExpc3Q8c3RyaW5nPjtcclxuICAgIGxldCB0YWc6IHN0cmluZztcclxuICAgIGxldCBhdHRyaWJ1dGU6IHN0cmluZztcclxuICAgIGxldCB2YWx1ZVN0cjogc3RyaW5nO1xyXG5cclxuICAgIGxldCBlbmRDb250ZXh0OiBudW1iZXIgPSBwYXJzZXIuZ2V0WE1MZGF0YSgpLmluZGV4T2YoWE1MQ29uc3RhbnRzLlRBR19DTE9TRSwgcGFyc2VyLmdldEN1cnJJbmRleCgpKTtcclxuICAgIGlmIChlbmRDb250ZXh0ICE9PSAtMSAmJiBlbmRDb250ZXh0IDwgcGFyc2VyLmdldFhNTGRhdGEoKS5sZW5ndGgpIHtcclxuICAgICAgLy8gbGFzdCBwb3NpdGlvbiBvZiBpdHMgdGFnXHJcbiAgICAgIHRhZyA9IHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCk7XHJcbiAgICAgIHBhcnNlci5hZGQyQ3VyckluZGV4KHRhZy5pbmRleE9mKFhNTENvbnN0YW50cy5NR19UQUdfRFZIRUFERVIpICsgWE1MQ29uc3RhbnRzLk1HX1RBR19EVkhFQURFUi5sZW5ndGgpO1xyXG4gICAgICB0b2tlbnNWZWN0b3IgPSBYbWxQYXJzZXIuZ2V0VG9rZW5zKHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCksIFhNTENvbnN0YW50cy5YTUxfQVRUUl9ERUxJTSk7XHJcblxyXG4gICAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgdG9rZW5zVmVjdG9yLmxlbmd0aDsgaiArPSAyKSB7XHJcbiAgICAgICAgYXR0cmlidXRlID0gKHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqKSk7XHJcbiAgICAgICAgdmFsdWVTdHIgPSAodG9rZW5zVmVjdG9yLmdldF9JdGVtKGogKyAxKSk7XHJcblxyXG4gICAgICAgIHN3aXRjaCAoYXR0cmlidXRlKSB7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfUk1QT1M6IHtcclxuICAgICAgICAgICAgbGV0IGk6IG51bWJlciA9IHZhbHVlU3RyLmluZGV4T2YoJywnKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChpID4gLTEpIHtcclxuICAgICAgICAgICAgICB0aGlzLl9ybVNpemUgPSBOTnVtYmVyLlBhcnNlKHZhbHVlU3RyLnN1YnN0cigwLCBpKSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5fcm1JZHggPSBOTnVtYmVyLlBhcnNlKHZhbHVlU3RyLnN1YnN0cihpICsgMSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0NPTVBVVEVfQlk6XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbXB1dGVCeSA9IHZhbHVlU3RyWzBdO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX2NvbXB1dGVCeSA9PT0gQ09NUFVURV9GTFVTSF9VUERBVEVTKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5fY29tcHV0ZUJ5ID0gQ09NUFVURV9ORVdSRUNfT05fU0VSVkVSO1xyXG4gICAgICAgICAgICAgIHRoaXMuX2ZsdXNoVXBkYXRlcyA9IHRydWU7XHJcbiAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgIHRoaXMuX2ZsdXNoVXBkYXRlcyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfSEFTX01BSU5fVEJMOlxyXG4gICAgICAgICAgICB0aGlzLl9oYXNNYWluVGFibGUgPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0NIVU5LX1NJWkU6XHJcbiAgICAgICAgICAgIHRoaXMuX2NodW5rU2l6ZSA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9DSFVOS19TSVpFX0VYUFJFU1NJT046XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKCdVbmtub3duIGF0dHJpYnV0ZSBmb3IgPCcgKyBYTUxDb25zdGFudHMuTUdfVEFHX0RWSEVBREVSICsgJz4gdGFnOiAnICtcclxuICAgICAgICAgICAgICBhdHRyaWJ1dGUpOyAvLyB0byBkZWxldGUgXCI+XCIgdG9vXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4KCsrZW5kQ29udGV4dCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZygnaW4gRGF0YVZpZXcuZ2V0SGVhZGVyQXR0cmlidXRlcygpOiBvdXQgb2YgYm91bmRzJyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcGFyc2UgdGhlIERBVEFWSUVXIHRhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgZmlsbERhdGEocGFyc2VyOiBYbWxQYXJzZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX3NraXBQYXJzaW5nID0gZmFsc2U7XHJcbiAgICB3aGlsZSAoYXdhaXQgdGhpcy5pbml0SW5uZXJPYmplY3RzKHBhcnNlciwgcGFyc2VyLmdldE5leHRUYWcoKSkpIHtcclxuICAgIH1cclxuICAgIHRoaXMuUmVzZXRGaXJzdER2KCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGdldCB0cmFuc2FjdGlvbiBiZWdpbiBvZiB0aGUgdGFza1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIEdldFRyYW5zYWN0aW9uQmVnaW4oKTogc3RyaW5nIHtcclxuICAgIGxldCB0cmFuc0JlZ2luOiBzdHJpbmcgPSAnXFwwJztcclxuICAgIGxldCB0cmFuc0JlZ2luUHJvcDogUHJvcGVydHkgPSB0aGlzLl90YXNrLmdldFByb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfVFJBU0FDVElPTl9CRUdJTik7XHJcbiAgICBpZiAodHJhbnNCZWdpblByb3AgIT09IG51bGwpIHtcclxuICAgICAgdHJhbnNCZWdpbiA9ICh0cmFuc0JlZ2luUHJvcC5HZXRDb21wdXRlZFZhbHVlKCkpLmNoYXJBdCgwKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJhbnNCZWdpbjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwYXJzZSB0aGUgREFUQVZJRVcgaW5uZXIgb2JqZWN0c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmb3VuZFRhZ05hbWVcIj4gIG5hbWUgb2YgdGFnLCBvZiBvYmplY3QsIHdoaWNoIG5lZWQgYmUgYWxsb2NhdGVkPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGlzIGZpbmlzaGVkIGlubmVyIHRhZzwvcmV0dXJucz5cclxuICBwcml2YXRlIGFzeW5jIGluaXRJbm5lck9iamVjdHMocGFyc2VyOiBYbWxQYXJzZXIsIGZvdW5kVGFnTmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgZm9ybTogTWdGb3JtID0gPE1nRm9ybT50aGlzLl90YXNrLmdldEZvcm0oKTtcclxuXHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAoZm91bmRUYWdOYW1lID09PSAoQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0RBVEFWSUVXKSkge1xyXG4gICAgICBsZXQgaW52YWxpZGF0ZTogYm9vbGVhbiA9IGF3YWl0IHRoaXMuZ2V0QXR0cmlidXRlcyhwYXJzZXIpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX3NraXBQYXJzaW5nKSB7XHJcbiAgICAgICAgbGV0IGVuZENvbnRleHQ6IG51bWJlciA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihFTkRfRFZfVEFHLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG4gICAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgoZW5kQ29udGV4dCArIEVORF9EVl9UQUcubGVuZ3RoKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvLyBwYXJzZSB0aGUgZXhlYyBzdGFjayBlbnRyaWVzIHZhbHVlc1xyXG4gICAgICAgIHRoaXMuZmlsbEV4ZWNTdGFjayhwYXJzZXIpO1xyXG5cclxuICAgICAgICAvLyBwYXJzZSB0aGUgZGF0YSBjb250cm9scyB2YWx1ZXNcclxuICAgICAgICB0aGlzLmZpbGxEYXRhRGMocGFyc2VyKTtcclxuICAgICAgICBpZiAoaW52YWxpZGF0ZSAmJiBmb3JtICE9IG51bGwpXHJcbiAgICAgICAgICAgZm9ybS5TZXRUYWJsZUl0ZW1zQ291bnQoMCwgdHJ1ZSk7XHJcblxyXG4gICAgICAgIGxldCB0YXNrUmVmcmVzaFR5cGU6IHN0cmluZyA9IHRoaXMuX3JlY29yZHNUYWIuZmlsbERhdGEodGhpcywgdGhpcy5faW5zZXJ0QXQsIHBhcnNlcik7XHJcblxyXG4gICAgICAgIGlmIChmb3JtICE9IG51bGwpIHtcclxuICAgICAgICAgIC8vIEZvciB0aGUgZmlyc3QgdGltZSwgYXMgdGhlIHRhYmxlIGNvbnRyb2wgaXMgbm90IHlldCBjcmVhdGVkLCBubyBuZWVkIHRvIHVwZGF0ZSB0aGUgdGFibGUgaXRlbSdzIGNvdW50LlxyXG4gICAgICAgICAgLy8gU2V0IHRoZSB1cGRhdGVkIHRhYmxlIGl0ZW1zIGNvdW50IG9ubHkgd2hlbiBmb3JtIGlzIGFscmVhZHkgb3BlbmVkLlxyXG4gICAgICAgICAgaWYgKGZvcm0uT3BlbmVkKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9pbnNlcnRBdCA9PT0gJ0InICYmIChpbnZhbGlkYXRlIHx8IHRoaXMuX3JlY29yZHNUYWIuSW5zZXJ0ZWRSZWNvcmRzQ291bnQgPiAwKSlcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGlmIChpbnZhbGlkYXRlIHx8ICEoPE1nRm9ybT50aGlzLl90YXNrLmdldEZvcm0oKSkuaXNUYWJsZVdpdGhQYWdpbmF0aW9uKCkpIHtcclxuICAgICAgICAgICAgICAgIGZvcm0uU2V0VGFibGVJdGVtc0NvdW50KDAsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgZm9ybS5zZXRUYWJsZUl0ZW1zQ291bnQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBmb3JtLkluc2VydFRhYmxlSXRlbXMoMCwgdGhpcy5fcmVjb3Jkc1RhYi5JbnNlcnRlZFJlY29yZHNDb3VudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgIGZvcm0uc2V0VGFibGVJdGVtc0NvdW50KGZhbHNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuQ3VyclJlYyAhPSBudWxsICYmIHRoaXMuQ3VyclJlYy5JblJlY29tcHV0ZSAmJiB0YXNrUmVmcmVzaFR5cGUgPT09IENvbnN0YW50cy5UQVNLX1JFRlJFU0hfTk9ORSlcclxuICAgICAgICAgIHRhc2tSZWZyZXNoVHlwZSA9IENvbnN0YW50cy5UQVNLX1JFRlJFU0hfQ1VSUl9SRUM7XHJcblxyXG4gICAgICAgIGlmIChpbnZhbGlkYXRlKSB7XHJcbiAgICAgICAgICB0YXNrUmVmcmVzaFR5cGUgPSBDb25zdGFudHMuVEFTS19SRUZSRVNIX0ZPUk07XHJcbiAgICAgICAgICBpZiAodGhpcy5fdGFzay5Jc1N1YkZvcm0pXHJcbiAgICAgICAgICAgIHRoaXMuZ2V0VGFzaygpLkRvU3ViZm9ybVByZWZpeFN1ZmZpeCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmdldFRhc2soKS5TZXRSZWZyZXNoVHlwZSh0YXNrUmVmcmVzaFR5cGUpO1xyXG4gICAgICAgIHRoaXMuVXBkYXRlRGF0YXZpZXdBZnRlckluc2VydCgpO1xyXG5cclxuICAgICAgICAvKlxyXG4gICAgICAgICAgICAgKiB0aGUgcmVjb3JkcyB0YWJsZSBtaWdodCBzZXQgYSBuZXcgY3VycmVudCByZWNvcmQuIEl0XHJcbiAgICAgICAgICAgICAqIGFjdHVhbGx5IGJlY29tZXMgdGhlIGN1cnJlbnQgcmVjb3JkIGJ5IGNhbGxpbmcgc2V0Q3VyclJlYygpXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgIGxldCBuZXdSZWNJZDogbnVtYmVyID0gdGhpcy5fcmVjb3Jkc1RhYi5nZXRJbml0aWFsQ3VyclJlY0lkKCk7XHJcblxyXG4gICAgICAgIGlmIChuZXdSZWNJZCAhPT0gSW50MzIuTWluVmFsdWUgJiYgKHRoaXMuX3JlY292ZXJ5ID09PSBDb25zdEludGVyZmFjZS5SRUNPVkVSWV9OT05FIHx8IHRoaXMuX2ZpcnN0RHYpKSB7XHJcblxyXG4gICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBjbGllbnQgcGVyZm9ybXMgdGhlIGZpcnN0IHJlY29yZCBwcmVmaXhcclxuICAgICAgICAgIGlmICh0aGlzLl9maXJzdER2ICYmIHRoaXMuX3JlY292ZXJ5ID09PSBDb25zdEludGVyZmFjZS5SRUNPVkVSWV9OT05FICYmXHJcbiAgICAgICAgICAgICh0aGlzLl90YXNrLmdldExldmVsKCkuY2hhckNvZGVBdCgwKSA9PT0gMCB8fCB0aGlzLl90YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spKVxyXG4gICAgICAgICAgICB0aGlzLl90YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG5cclxuICAgICAgICAgIC8vIElmIHRoZSBzZXJ2ZXIgc2VudCB1cyBhbiB1cGRhdGVkIGN1cnJSZWMgdGhlbiBpbnZhbGlkYXRlIGFsbCBjdXJyZW50IHZhbHVlcy5cclxuICAgICAgICAgIC8vIHRoaXMgd2lsbCBmb3JjZSBhbGwgbmV3IHZhbHVlcyB0byBiZSBjb3BpZWQgZnJvbSB0aGUgY3VyclJlYyB0byB0aGUgZGF0YXZpZXcsXHJcbiAgICAgICAgICAvLyBlc3BlY2lhbGx5IHZpcnR1YWwgZmllbGRzIHdpdGggbm8gaW5pdCBleHByZXNzaW9uLlxyXG4gICAgICAgICAgKDxGaWVsZHNUYWJsZT50aGlzLl9maWVsZHNUYWIpLmludmFsaWRhdGUodHJ1ZSwgRmllbGQuTEVBVkVfRkxBR1MpO1xyXG5cclxuICAgICAgICAgIGlmIChuZXdSZWNJZCAhPT0gdGhpcy5fY3VyclJlY0lkKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJlYyhuZXdSZWNJZCwgIXRoaXMuX2ZpcnN0RHYpO1xyXG4gICAgICAgICAgICB0aGlzLl9vcmlnaW5hbCA9IHRoaXMuQ3VyclJlYy5yZXBsaWNhdGUoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGZpeCBidWcgIzc3OTg1ODogZm9yY2UgY29tcHV0ZSBmb3IgdGhlIGZpcnN0IHJlY29yZCBpbiBhIHNjcmVlbiBtb2RlIF90YXNrXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9maXJzdER2KVxyXG4gICAgICAgICAgICAgIHRoaXMudGFrZUZsZFZhbHNGcm9tQ3VyclJlYygpO1xyXG5cclxuICAgICAgICAgICAgLy8gUUNSICM5ODEzMjA6IG1ha2Ugc3VyZSB0aGF0IHZpcnR1YWxzIHdpdGggbm8gaW5pdCBvciBjb250cm9sIGFyZSBpbml0aWFsaXplZFxyXG4gICAgICAgICAgICBpZiAodGhpcy5fdGFzay5nZXRGb3JtKCkgIT0gbnVsbClcclxuICAgICAgICAgICAgICAoPE1nRm9ybT4odGhpcy5fdGFzay5nZXRGb3JtKCkpKS51cGRhdGVEaXNwbGF5TGluZUJ5RFYoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgdGhpcy50YWtlRmxkVmFsc0Zyb21DdXJyUmVjKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGludmFsaWRhdGUgJiYgdGhpcy5fcmVjb3Jkc1RhYi5nZXRTaXplKCkgPiAwKSB7XHJcbiAgICAgICAgICBpZiAoZm9ybSA9PSBudWxsIHx8IGZvcm0uaXNTY3JlZW5Nb2RlKCkpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSZWNCeUlkeCgwLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcclxuICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9uIGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB0aHJvdyBleGNlcHRpb247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG5cclxuICAgICAgICAgICAgLy8gUUNSICM0MzE2MzA6IEZvciBmb3JtcyBpbiBsaW5lIG1vZGUgdGhlcmUgd2FzIGEgc2l0dWF0aW9uIGluIHdoaWNoXHJcbiAgICAgICAgICAgIC8vIGFmdGVyIGludmFsaWRhdGlvbiwgdGhlIGN1cnJlbnQgcmVjb3JkIHdhcyBzZXQgdG8gYmUgdGhlIGZpcnN0IG9mXHJcbiAgICAgICAgICAgIC8vIHRoZSBkYXRhdmlldyBidXQgdGhlIGN1cnJlbnQgbGluZSBvZiB0aGUgZm9ybSB3YXMgZ3JlYXRlciB0aGFuIDAuXHJcbiAgICAgICAgICAgIC8vIEl0IGNhdXNlZCBzYXZpbmcgYW4gb3JpZ2luYWwgcmVjb3JkIHdoaWNoIGlzIGRpZmZlcmVudCB0aGFuIHRoZVxyXG4gICAgICAgICAgICAvLyBvcmlnaW5hbCBvZiB0aGUgY3VycmVudCBmb3JtIGxpbmUuIFRvIHNvbHZlIHRoaXMgcHJvYmxlbSB3ZSBmaXJzdFxyXG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgY3Vyc29yIHBhcmtzIG9uIHRoZSBmaXJzdCByb3cgb2YgdGhlIGRhdGF2aWV3LlxyXG4gICAgICAgICAgICAoPEZpZWxkc1RhYmxlPnRoaXMuX2ZpZWxkc1RhYikuaW52YWxpZGF0ZSh0cnVlLCBGaWVsZC5MRUFWRV9GTEFHUyk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0VG9wUmVjSWR4KDApO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3Rhc2suZ2V0Rm9ybSgpICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgKDxNZ0Zvcm0+dGhpcy5fdGFzay5nZXRGb3JtKCkpLlNldFRhYmxlVG9wSW5kZXgoKTtcclxuXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUmVjQnlJZHgoMCwgZmFsc2UsIHRydWUsIHRydWUsIDApO1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLl90YXNrLmdldEZvcm0oKSAhPSBudWxsKVxyXG4gICAgICAgICAgICAgIC8vIHRvIHVwZGF0ZSB0cmVlIHdlIG5lZWQgdG8gbG9hZCBub2RlcyBmaXJzdFxyXG4gICAgICAgICAgICAgICAgKDxNZ0Zvcm0+KHRoaXMuX3Rhc2suZ2V0Rm9ybSgpKSkudXBkYXRlRGlzcGxheUxpbmVCeURWKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGV4Y2VwdGlvbikge1xyXG4gICAgICAgICAgICAgIGlmIChleGNlcHRpb24gaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3Rhc2suZ2V0TGV2ZWwoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTEVWRUxfQ09OVFJPTCAmJiB0aGlzLl90YXNrLmdldExhc3RQYXJrZWRDdHJsKCkgIT0gbnVsbClcclxuICAgICAgICAgICAgICB0aGlzLl90YXNrLmdldExhc3RQYXJrZWRDdHJsKCkucmVzZXRQcmV2VmFsKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnNhdmVPcmlnaW5hbCgpOyAvLyBBZnRlciBpbnZhbGlkYXRpb24sIHdlIG11c3Qgc2F2ZSB0aGUgb3JpZ2luYWwgcmVjb3JkIHRvb1xyXG4gICAgICAgICAgKDxGaWVsZHNUYWJsZT50aGlzLl9maWVsZHNUYWIpLmludmFsaWRhdGUodHJ1ZSwgRmllbGRCYXNlLkNMRUFSX0ZMQUdTKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFFDUiAjNzYxODQ4IHByZXZDdXJyUmVjIHNob3VsZCBzZXQgdGhlIGZpcnN0IHRpbWUgdGhlIGRhdGF2aWV3IGlzIGluaXRpYWxpemVkXHJcbiAgICAgICAgaWYgKHRoaXMuX2ZpcnN0RHYpXHJcbiAgICAgICAgICB0aGlzLnNldFByZXZDdXJyUmVjKCk7XHJcblxyXG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBzdWIgZm9ybXMgYXJlIG5vdCB1bm5lY2Vzc2FyaWx5IHJlZnJlc2hlZDpcclxuICAgICAgICAvLyBBZnRlciBzZXR0aW5nIHRoZSBjdXJyZW50IHJlY29yZCBhbmQgYmVmb3JlIGV4ZWN1dGluZyByZWNvcmQgcHJlZml4XHJcbiAgICAgICAgLy8gd2Ugc2F2ZSB0aGUgY3VycmVudCByZWNvcmQgYXMgdGhlIHByZXZpb3VzIHJlY29yZCBzbyB3aGVuIHRoZSByZWNvcmQgcHJlZml4XHJcbiAgICAgICAgLy8gaXMgZXhlY3V0ZWQgaXQgd2lsbCBza2lwIHJlZnJlc2hpbmcgdGhlIHN1YiBmb3Jtcy4gV2UgZG8gdGhhdCBiZWNhdXNlXHJcbiAgICAgICAgLy8gdGhlIHNlcnZlciBhbHJlYWR5IHBhc3NlcyBiYWNrIHRvIHRoZSBjbGllbnQgYWxsIHRoZSBkYXRhdmlld3Mgb2YgdGhlXHJcbiAgICAgICAgLy8gc3ViIGZvcm1zIGluIGEgc2luZ2xlIGl0ZXJhdGlvbi5cclxuICAgICAgICBpZiAoaW52YWxpZGF0ZSAmJiB0aGlzLl90YXNrLklzU3ViRm9ybSlcclxuICAgICAgICAgICg8TWdDb250cm9sQmFzZT50aGlzLl90YXNrLmdldEZvcm0oKS5nZXRTdWJGb3JtQ3RybCgpKS5SZWZyZXNoT25WaXNpYmxlID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9yZWNvdmVyeSA9PT0gQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfTk9ORSkge1xyXG4gICAgICAgICAgLy8gTm8gbmVlZCB0byBwZXJmb3JtIHJlY29yZCBwcmVmaXggYWZ0ZXIgYSByZWNvcmQgbGV2ZWwgdHJhbnNhY3Rpb24gcmV0cnlcclxuICAgICAgICAgIGlmICh0aGlzLmdldFRhc2soKS5nZXRBZnRlclJldHJ5KENvbnN0SW50ZXJmYWNlLlJFQ09WRVJZX1JFVFJZKSAmJlxyXG4gICAgICAgICAgICAhdGhpcy5nZXRUYXNrKCkuSXNBZnRlclJldHJ5QmVmb3JlQnVpbGRYTUwpXHJcbiAgICAgICAgICAgIHRoaXMuX3Rhc2suc2V0TGV2ZWwoQ29uc3RhbnRzLlRBU0tfTEVWRUxfUkVDT1JEKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBsZXQgdHJhbnNCZWdpbiA9IDxzdHJpbmc+IHRoaXMuR2V0VHJhbnNhY3Rpb25CZWdpbigpO1xyXG5cclxuICAgICAgICAgIGxldCBzdG9wRXhlY3V0aW9uOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICBzd2l0Y2ggKHRoaXMuX3JlY292ZXJ5KSB7XHJcbiAgICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfUk9MTEJBQ0s6XHJcblxyXG4gICAgICAgICAgICAgIGlmICh0cmFuc0JlZ2luID09PSBDb25zdEludGVyZmFjZS5UUkFOU19SRUNPUkRfUFJFRklYKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBRQ1IgIzc0NzMxNiBjYW4ndCByb2xsYmFjayBhIGxvc3QgcmVjb3JkXHJcbiAgICAgICAgICAgICAgICAvLyBBbHNvLCBpbiBjYXNlIG9mIG5vbiBpbnRlcmFjdGl2ZSBfdGFzaywgc2tpcCB0byB0aGUgbmV4dCByZWNvcmQuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fdGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfREVMRVRFIHx8XHJcbiAgICAgICAgICAgICAgICAgICF0aGlzLl90YXNrLklzSW50ZXJhY3RpdmUpXHJcbiAgICAgICAgICAgICAgICAgIHN0b3BFeGVjdXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmdldFRhc2soKS5zZXRBZnRlclJldHJ5KENvbnN0SW50ZXJmYWNlLlJFQ09WRVJZX1JPTExCQUNLKTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5DdXJyUmVjLnJlc3RhcnQodGhpcy5DdXJyUmVjLmdldE1vZGUoKSk7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuQ3VyclJlYy5yZXNldE1vZGlmaWVkKCk7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuX29yaWdpbmFsID0gdGhpcy5DdXJyUmVjLnJlcGxpY2F0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLl9wZW5kaW5nUmVjb3ZlcnkgPSBSRUNPVkVSWV9BQ1RfQ0FOQ0VMO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIGlmICh0cmFuc0JlZ2luICE9PSBDb25zdEludGVyZmFjZS5UUkFOU19OT05FKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl90YXNrLnNldExldmVsKENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcGVuZGluZ1JlY292ZXJ5ID0gUkVDT1ZFUllfQUNUX0JFR0lOX1RBQkxFO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRUYXNrKCkuc2V0QWZ0ZXJSZXRyeShDb25zdEludGVyZmFjZS5SRUNPVkVSWV9ST0xMQkFDSyk7XHJcbiAgICAgICAgICAgICAgICAvLyBlbnN1cmUgX3Rhc2sgY2xvc2UgYWN0aW9uIGlzIHN0b3BwZWQgKHRhc2tFbmQpXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5SRUNPVkVSWV9SRVRSWTpcclxuICAgICAgICAgICAgICB0aGlzLlJlY292ZXJ5UmV0cnkodHJhbnNCZWdpbik7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoc3RvcEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG4gICAgICAgICAgICAvLyBpbiBjYXNlIHRoZSB0YXNrIHN1ZmZpeCB3YXMgYWxyZWFkeSBleGVjdXRlZCwgbmVlZCB0byBzZXQgdGhpcyBmbGFnIHRvIGZhbHNlIGluIG9yZGVyIHRvIGVuYWJsZSBpdCB0byBleGVjdXRlIFRTIGFnYWluLlxyXG4gICAgICAgICAgICB0aGlzLmdldFRhc2soKS5UYXNrU3VmZml4RXhlY3V0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGZvdW5kVGFnTmFtZSA9PT0gJy8nICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0RBVEFWSUVXKSB7XHJcbiAgICAgIGlmICh0aGlzLl9pbmNsdWRlc0ZpcnN0ICYmIHRoaXMuX2luY2x1ZGVzTGFzdCAmJiB0aGlzLmlzRW1wdHkoKSkge1xyXG4gICAgICAgIHRoaXMuX2N1cnJSZWNJZCA9IEludDMyLk1pblZhbHVlO1xyXG4gICAgICAgIHRoaXMuX2N1cnJSZWNJZHggPSBJbnQzMi5NaW5WYWx1ZTtcclxuICAgICAgICB0aGlzLkN1cnJSZWMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuc2V0VG9wUmVjSWR4KEludDMyLk1pblZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgICBwYXJzZXIuc2V0Q3VyckluZGV4MkVuZE9mVGFnKCk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRyYW5zQmVnaW5cIj48L3BhcmFtPlxyXG4gIHByaXZhdGUgUmVjb3ZlcnlSZXRyeSh0cmFuc0JlZ2luOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0cmFuc0JlZ2luID09PSBDb25zdEludGVyZmFjZS5UUkFOU19SRUNPUkRfUFJFRklYKSB7XHJcbiAgICAgIC8vIE5vIG5lZWQgdG8gcmUtcGVyZm9ybSByZWNvcmQgcHJlZml4IGR1cmluZyByZXRyeS5cclxuICAgICAgdGhpcy5fdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9SRUNPUkQpO1xyXG5cclxuICAgICAgLy8gZW5zdXJlIHRoYXQgdGhlIHJlY29yZCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgc2VydmVyIGFmdGVyIGNvcnJlY3Rpb25cclxuICAgICAgdGhpcy5nZXRUYXNrKCkuc2V0VHJhbnNhY3Rpb25GYWlsZWQodHJ1ZSk7XHJcblxyXG4gICAgICAvLyBlbnN1cmUgcmVjb3JkIHByZWZpeCBpcyBub3QgZXhlY3V0ZWQgZm9yIGFsbCB0YXNrcyB3aGljaCBwYXJ0aWNpcGF0ZSBpbiB0aGUgdHJhbnNhY3Rpb25cclxuICAgICAgdGhpcy5nZXRUYXNrKCkuc2V0QWZ0ZXJSZXRyeShDb25zdEludGVyZmFjZS5SRUNPVkVSWV9SRVRSWSk7XHJcblxyXG4gICAgICAvLyBRQ1IgIzQ3OTY4Njogbm8gbmVlZCB0byBhZGQgdGhlIGN1cnIgcmVjIHRvIHRoZSBsaXN0IGFueW1vcmVcclxuICAgICAgLy8gYmVjYXVzZSB0aGUgaW5zZXJ0L21vZGlmeSBtYXkgYmUgY2FuY2VsZWQgYW5kIGEgcm9sbGJhY2sgZXZlbnRcclxuICAgICAgLy8gd291bGQgYmUgc2VudCB0byB0aGUgc2VydmVyXHJcbiAgICAgIHRoaXMuQ3VyclJlYy5yZXN0YXJ0KHRoaXMuQ3VyclJlYy5nZXRNb2RlKCkpO1xyXG5cclxuICAgICAgLy8gQW4gZXJyb3Igd2hlbiBpbml0aWFsaXppbmcgdGhlIF90YXNrIG5lZWRzIG5vIG1vdmVtZW50IChlcnJvciBpbiByZWMtcHJlZml4KVxyXG4gICAgICBpZiAoIXRoaXMuX2ZpcnN0RHYpIHtcclxuICAgICAgICB0aGlzLnRha2VGbGRWYWxzRnJvbUN1cnJSZWMoKTtcclxuICAgICAgICB0aGlzLl9wZW5kaW5nUmVjb3ZlcnkgPSBSRUNPVkVSWV9BQ1RfTU9WRV9ESVJFQ1RJT05fQkVHSU47XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRyYW5zQmVnaW4gIT09IENvbnN0SW50ZXJmYWNlLlRSQU5TX05PTkUpIHtcclxuICAgICAgdGhpcy5fdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuICAgICAgdGhpcy5fcGVuZGluZ1JlY292ZXJ5ID0gUkVDT1ZFUllfQUNUX0JFR0lOX1NDUkVFTjtcclxuICAgICAgdGhpcy5nZXRUYXNrKCkuc2V0QWZ0ZXJSZXRyeShDb25zdEludGVyZmFjZS5SRUNPVkVSWV9SRVRSWSk7XHJcbiAgICAgIC8vIGVuc3VyZSBfdGFzayBjbG9zZSBhY3Rpb24gaXMgc3RvcHBlZCAodGFza0VuZClcclxuICAgICAgdGhpcy5nZXRUYXNrKCkuc2V0VHJhbnNhY3Rpb25GYWlsZWQodHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gdXBkYXRlIERhdGF2aWV3IEFmdGVyIGluc2VydFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBVcGRhdGVEYXRhdmlld0FmdGVySW5zZXJ0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2luc2VydEF0ID09PSAnQicvKidCJyovKSB7XHJcblxyXG4gICAgICBsZXQgbmV3UmVjczogbnVtYmVyID0gdGhpcy5fcmVjb3Jkc1RhYi5JbnNlcnRlZFJlY29yZHNDb3VudDtcclxuICAgICAgaWYgKHRoaXMuX2N1cnJSZWNJZHggIT09IEludDMyLk1pblZhbHVlKVxyXG4gICAgICAgIHRoaXMuX2N1cnJSZWNJZHggKz0gbmV3UmVjcztcclxuXHJcbiAgICAgIGlmICh0aGlzLl90b3BSZWNJZHggIT09IEludDMyLk1pblZhbHVlKVxyXG4gICAgICAgIHRoaXMuX3RvcFJlY0lkeCArPSBuZXdSZWNzO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX29sZFRvcFJlY0lkeCAhPT0gSW50MzIuTWluVmFsdWUpXHJcbiAgICAgICAgdGhpcy5fb2xkVG9wUmVjSWR4ICs9IG5ld1JlY3M7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBEQVRBVklFVyB0YWdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0QXR0cmlidXRlcyhwYXJzZXI6IFhtbFBhcnNlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+O1xyXG4gICAgbGV0IHRhZzogU3RyaW5nO1xyXG4gICAgbGV0IGJvb2xWYWw6IGJvb2xlYW47XHJcbiAgICBsZXQgZGF0YVZpZXdDb21tYW5kOiBJQ2xpZW50Q29tbWFuZCA9IG51bGw7XHJcbiAgICBsZXQgaXNFbXB0eURhdGF2aWV3ID0gZmFsc2U7XHJcblxyXG4gICAgdGhpcy5fcmVjb3ZlcnkgPSBDb25zdEludGVyZmFjZS5SRUNPVkVSWV9OT05FO1xyXG4gICAgbGV0IGVuZENvbnRleHQ6IG51bWJlciA9IHBhcnNlci5nZXRYTUxkYXRhKCkuaW5kZXhPZihYTUxDb25zdGFudHMuVEFHX0NMT1NFLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG4gICAgaWYgKGVuZENvbnRleHQgIT09IC0xICYmIGVuZENvbnRleHQgPCBwYXJzZXIuZ2V0WE1MZGF0YSgpLmxlbmd0aCkge1xyXG5cclxuICAgICAgLy8gbGFzdCBwb3NpdGlvbiBvZiBpdHMgdGFnXHJcbiAgICAgIHRhZyA9IHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCk7XHJcbiAgICAgIHBhcnNlci5hZGQyQ3VyckluZGV4KHRhZy5pbmRleE9mKENvbnN0SW50ZXJmYWNlLk1HX1RBR19EQVRBVklFVykgKyBDb25zdEludGVyZmFjZS5NR19UQUdfREFUQVZJRVcubGVuZ3RoKTtcclxuICAgICAgdG9rZW5zVmVjdG9yID0gWG1sUGFyc2VyLmdldFRva2VucyhwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpLCBYTUxDb25zdGFudHMuWE1MX0FUVFJfREVMSU0pO1xyXG5cclxuICAgICAgdGhpcy5faW5zZXJ0QXQgPSAnICc7XHJcbiAgICAgIC8vIGZpbmQgYW5kIGV4ZWN1dGUgaW52YWxpZGF0ZSBpbW1lZGlhdGVseVxyXG4gICAgICBsZXQgaW52YWxpZGF0ZTogYm9vbGVhbiA9IHRoaXMucGVla0ludmFsaWRhdGUodG9rZW5zVmVjdG9yKTtcclxuXHJcblxyXG5cclxuICAgICAgLy8gbG9jYXRlRmlyc3RSZWMgaXMgc2VudCBieSBzZXJ2ZXIgb25seSBpZiByZWNvcmRzIGFyZSBsb2NhdGVkIGZvciB0aGUgc3ViZm9ybS5cclxuICAgICAgLy8gU28sIGl0IHNob3VsZCBiZSBpbml0aWFsaXplZCB0byAwLlxyXG4gICAgICB0aGlzLl9sb2NhdGVGaXJzdFJlYyA9IDA7XHJcblxyXG4gICAgICBmb3IgKGxldCBqOiBudW1iZXIgPSAwOyBqIDwgdG9rZW5zVmVjdG9yLmxlbmd0aDsgaiArPSAyKSB7XHJcbiAgICAgICAgbGV0IGF0dHJpYnV0ZTogc3RyaW5nID0gKHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqKSk7XHJcbiAgICAgICAgbGV0IHZhbHVlU3RyOiBzdHJpbmcgPSAodG9rZW5zVmVjdG9yLmdldF9JdGVtKGogKyAxKSk7XHJcblxyXG4gICAgICAgIHN3aXRjaCAoYXR0cmlidXRlKSB7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfSU5TRVJUX0FUOlxyXG4gICAgICAgICAgICB0aGlzLl9pbnNlcnRBdCA9IHZhbHVlU3RyWzBdO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9JTkNMVURFX0ZJUlNUOlxyXG4gICAgICAgICAgICBib29sVmFsID0gWG1sUGFyc2VyLmdldEJvb2xlYW4odmFsdWVTdHIpO1xyXG4gICAgICAgICAgICB0aGlzLlNldEluY2x1ZGVzRmlyc3QoYm9vbFZhbCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0lOQ0xVREVfTEFTVDpcclxuICAgICAgICAgICAgYm9vbFZhbCA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICAgICAgdGhpcy5TZXRJbmNsdWRlc0xhc3QoYm9vbFZhbCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0lTX09ORVdBWV9LRVk6XHJcbiAgICAgICAgICAgIGJvb2xWYWwgPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgICAgICAgICAgIHRoaXMuU2V0T25lV2F5S2V5KGJvb2xWYWwpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9EQlZJRVdTSVpFOlxyXG4gICAgICAgICAgICB0aGlzLkRCVmlld1NpemUgPSBYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfSU5WQUxJREFURToge1xyXG5cclxuICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVE9QX1JFQ19JRDpcclxuICAgICAgICAgICAgdGhpcy5fdG9wUmVjSWQgPSBOTnVtYmVyLlBhcnNlKHZhbHVlU3RyKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVEFTS01PREU6XHJcbiAgICAgICAgICAgIGlmICgoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLmdldE9yaWdpbmFsVGFza01vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9OT05FIHx8IGludmFsaWRhdGUpXHJcbiAgICAgICAgICAgICAgKDxUYXNrQmFzZT50aGlzLl90YXNrKS5zZXRPcmlnaW5hbFRhc2tNb2RlKHZhbHVlU3RyKTtcclxuICAgICAgICAgICAgdGhpcy5fdGFzay5zZXRQcm9wKFByb3BJbnRlcmZhY2UuUFJPUF9UWVBFX1RBU0tfTU9ERSwgdmFsdWVTdHIpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9FTVBUWV9EQVRBVklFVzpcclxuICAgICAgICAgICAgaXNFbXB0eURhdGF2aWV3ID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIFhNTENvbnN0YW50cy5NR19BVFRSX1RBU0tJRDpcclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfTE9XX0lEOlxyXG4gICAgICAgICAgICB0aGlzLl9sYXN0Q3JlYXRlZFJlY0lkID0gTk51bWJlci5QYXJzZSh2YWx1ZVN0cik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1RSQU5TX1NUQVQ6XHJcbiAgICAgICAgICAgIGxldCB0cmFuc1N0YXQ6IHN0cmluZyA9IHZhbHVlU3RyWzBdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKHRyYW5zU3RhdCkge1xyXG4gICAgICAgICAgICAgIGNhc2UgVFJBTlNfU1RBVF9PUEVORUQ6XHJcbiAgICAgICAgICAgICAgICBkYXRhVmlld0NvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVTZXRUcmFuc2FjdGlvblN0YXRlRGF0YXZpZXdDb21tYW5kKHRoaXMuZ2V0VGFzaygpLmdldFRhc2tUYWcoKSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmdldFRhc2soKS5EYXRhdmlld01hbmFnZXIuUmVtb3RlRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoZGF0YVZpZXdDb21tYW5kKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIGNhc2UgVFJBTlNfU1RBVF9DTE9TRUQ6XHJcbiAgICAgICAgICAgICAgICBkYXRhVmlld0NvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVTZXRUcmFuc2FjdGlvblN0YXRlRGF0YXZpZXdDb21tYW5kKHRoaXMuZ2V0VGFzaygpLmdldFRhc2tUYWcoKSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRUYXNrKCkuRGF0YXZpZXdNYW5hZ2VyLlJlbW90ZURhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGRhdGFWaWV3Q29tbWFuZCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFRhc2soKS5zZXRUcmFuc2FjdGlvbkZhaWxlZChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfUkVDT1ZFUlk6XHJcbiAgICAgICAgICAgIGlmICgoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLklzVHJ5aW5nVG9TdG9wKVxyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0VGFzaygpLnNldFRyeWluZ1RvU3RvcChmYWxzZSk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0VGFzaygpLnJlc2V0RXhlY0VuZFRhc2soKTtcclxuICAgICAgICAgICAgdGhpcy5fcmVjb3ZlcnkgPSB2YWx1ZVN0clswXTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfRFZQT1NfVkFMVUU6XHJcbiAgICAgICAgICAgIHRoaXMuX2R2UG9zVmFsdWUgPSBOTnVtYmVyLlBhcnNlKHZhbHVlU3RyKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfTE9DQVRFX0ZJUlNUX0lEOlxyXG4gICAgICAgICAgICB0aGlzLl9sb2NhdGVGaXJzdFJlYyA9IE5OdW1iZXIuUGFyc2UodmFsdWVTdHIpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9PRkZTRVQ6XHJcblxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9VU0VSX1NPUlQ6XHJcbiAgICAgICAgICAgIC8vIFFDUiAjIDkyMzM4MDpHZXR0aW5nIHRoZSB2YWx1ZSBvZiB1c2VyU29ydCBmcm9tIHRoZSBkYXRhdmlldyBoZWFkZXIuSWYgdHJ1ZSB0aGVuIHNvcnQgc2lnbiB3aWxsIGJlIHJlbW92ZWQgb3IgZWxzZSBzaG93bi5cclxuICAgICAgICAgICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGhpcy5fdGFzay5nZXRGb3JtKCk7XHJcbiAgICAgICAgICAgIGZvcm0uY2xlYXJUYWJsZUNvbHVtblNvcnRNYXJrKFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1ZBTF9UT1RBTF9SRUNPUkRTX0NPVU5UOlxyXG4gICAgICAgICAgICB0aGlzLlRvdGFsUmVjb3Jkc0NvdW50ID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1ZBTF9SRUNPUkRTX0JFRk9SRV9DVVJSRU5UX1ZJRVc6XHJcbiAgICAgICAgICAgIHRoaXMuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3ID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9WQUxfU0VSVkVSX1RSQU5TX0NBQ0hFX0VNUFRZOlxyXG4gICAgICAgICAgICB0aGlzLl9zZXJ2ZXJUcmFuc0NhY2hlRW1wdHkgPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZygnVW5rbm93biBhdHRyaWJ1dGUgZm9yIDwnICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0RBVEFWSUVXICsgJz4gdGFnOiAnICsgYXR0cmlidXRlKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnNldEVtcHR5RGF0YXZpZXcoaXNFbXB0eURhdGF2aWV3KTtcclxuXHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgoKytlbmRDb250ZXh0KTtcclxuICAgICAgcmV0dXJuIGludmFsaWRhdGU7XHJcbiAgICB9XHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coJ2luIERhdGFWaWV3LmdldEF0dHJpYnV0ZXMoKTogb3V0IG9mIGJvdW5kcycpO1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcblxyXG4gIFNldE9uZVdheUtleSh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuSXNPbmVXYXlLZXkgPSB2YWw7XHJcbiAgfVxyXG5cclxuICBTZXRJbmNsdWRlc0xhc3QodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl9pbmNsdWRlc0xhc3QgPSB2YWw7XHJcbiAgfVxyXG5cclxuICBTZXRJbmNsdWRlc0ZpcnN0KHZhbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IHByZXZJbmNsdWRlRmlyc3Q6IGJvb2xlYW4gPSB0aGlzLl9pbmNsdWRlc0ZpcnN0O1xyXG4gICAgdGhpcy5faW5jbHVkZXNGaXJzdCA9IHZhbDtcclxuXHJcbiAgICBpZiAodGhpcy5faW5jbHVkZXNGaXJzdCAhPT0gcHJldkluY2x1ZGVGaXJzdCkge1xyXG4gICAgICBsZXQgZm9ybTogTWdGb3JtQmFzZSA9IHRoaXMuX3Rhc2suZ2V0Rm9ybSgpO1xyXG4gICAgICBpZiAoZm9ybSAhPT0gbnVsbCkge1xyXG4gICAgICAgICBmb3JtLlNldFRhYmxlSXRlbXNDb3VudCgwLCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBhcnNlIGFuZCBmaWxsIGlubmVyIGRhdGEgZm9yIGFsbCA8ZGNfdmFsPiB0YWdzIGFyZSBjb250YWluZWQgaW50byB0aGUgPGRhdGF2aWV3PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBmaWxsRGF0YURjKHBhcnNlcjogWG1sUGFyc2VyKTogdm9pZCB7XHJcblxyXG4gICAgLy8gQ3JlYXRlIGEgREMgdmFsdWVzIGJ1aWxkZXIuXHJcbiAgICBsZXQgZGN2QnVpbGRlcjogWE1MQmFzZWREY1ZhbHVlc0J1aWxkZXIgPSBuZXcgWE1MQmFzZWREY1ZhbHVlc0J1aWxkZXIoKTtcclxuXHJcbiAgICAvLyBMb29wIHRocm91Z2ggYWxsIFwiZGNfdmFsc1wiIHRhZ3MuXHJcbiAgICBsZXQgZm91bmRUYWdOYW1lOiBzdHJpbmcgPSBwYXJzZXIuZ2V0TmV4dFRhZygpO1xyXG5cclxuICAgIHdoaWxlIChmb3VuZFRhZ05hbWUgIT09IG51bGwgJiYgZm91bmRUYWdOYW1lID09PSBDb25zdEludGVyZmFjZS5NR19UQUdfRENfVkFMUykge1xyXG5cclxuICAgICAgLy8gU2F2ZSBjdXJyZW50IGluZGV4IGZvciBmdXR1cmUgcmVmZXJlbmNlLCBpbiBjYXNlIG9mIGFuIGVycm9yLlxyXG4gICAgICBsZXQgZGNWYWxzUG9zaXRpb246IG51bWJlciA9IHBhcnNlci5nZXRDdXJySW5kZXgoKTtcclxuXHJcbiAgICAgIGRjdkJ1aWxkZXIuU2VyaWFsaXplZERDVmFscyA9IHBhcnNlci5SZWFkVG9FbmRPZkN1cnJlbnRFbGVtZW50KCk7XHJcbiAgICAgIGxldCBkY3Y6IERjVmFsdWVzID0gZGN2QnVpbGRlci5CdWlsZCgpO1xyXG5cclxuICAgICAgaWYgKGRjdiAhPT0gbnVsbClcclxuICAgICAgICB0aGlzLkFkZERjVmFsdWVzKGRjdik7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coJ0Vycm9yIHdoaWxlIHBhcnNpbmcgREMgdmFsdWVzIGF0IHBvc2l0aW9uICcgKyBkY1ZhbHNQb3NpdGlvbik7XHJcblxyXG4gICAgICBmb3VuZFRhZ05hbWUgPSBwYXJzZXIuZ2V0TmV4dFRhZygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQWRkRGNWYWx1ZXMoZGN2OiBEY1ZhbHVlcyk6IHZvaWQge1xyXG4gICAgdGhpcy5fZGNWYWxzQ29sbGVjdGlvbi5BZGQoZGN2LmdldElkKCkudG9TdHJpbmcoKSwgZGN2KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBwYXJzZSBhbmQgZmlsbCBpbm5lciBkYXRhIGZvciBhbGwgPGV4ZWNzdGFja2VudHJ5PiB0YWdzIGFyZSBjb250YWluZWQgaW50byB0aGUgPGRhdGF2aWV3PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBmaWxsRXhlY1N0YWNrKHBhcnNlcjogWG1sUGFyc2VyKTogdm9pZCB7XHJcbiAgICBsZXQgZm91bmRUYWdOYW1lOiBzdHJpbmcgPSBwYXJzZXIuZ2V0TmV4dFRhZygpO1xyXG4gICAgbGV0IGV4ZWNTdGFja1RhZ0V4aXN0czogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHdoaWxlIChmb3VuZFRhZ05hbWUgIT09IG51bGwgJiYgZm91bmRUYWdOYW1lID09PSBDb25zdEludGVyZmFjZS5NR19UQUdfRVhFQ19TVEFDS19FTlRSWSkge1xyXG4gICAgICB0aGlzLmZpbGxJbm5lckV4ZWNTdGFjayhwYXJzZXIpO1xyXG4gICAgICBmb3VuZFRhZ05hbWUgPSBwYXJzZXIuZ2V0TmV4dFRhZygpO1xyXG4gICAgICBleGVjU3RhY2tUYWdFeGlzdHMgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKGV4ZWNTdGFja1RhZ0V4aXN0cykge1xyXG4gICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5yZXZlcnNlU2VydmVyRXhlY1N0YWNrKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZmlsbCBpbm5lciBvYmplY3RzIG9mIDxleGVjc3RhY2tlbnRyeT4gdGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGZpbGxJbm5lckV4ZWNTdGFjayhwYXJzZXI6IFhtbFBhcnNlcik6IHZvaWQge1xyXG4gICAgbGV0IHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+O1xyXG4gICAgY29uc3QgZW5kQ29udGV4dDogbnVtYmVyID0gcGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKFhNTENvbnN0YW50cy5UQUdfVEVSTSwgcGFyc2VyLmdldEN1cnJJbmRleCgpKTtcclxuICAgIGxldCBhdHRyaWJ1dGU6IHN0cmluZztcclxuICAgIGxldCB0YXNrSWQ6IHN0cmluZyA9ICcnO1xyXG4gICAgbGV0IGhhbmRsZXJJZDogc3RyaW5nID0gJyc7XHJcbiAgICBsZXQgb3BlcklkeDogbnVtYmVyID0gMDtcclxuXHJcbiAgICBpZiAoZW5kQ29udGV4dCAhPT0gLTEgJiYgZW5kQ29udGV4dCA8IHBhcnNlci5nZXRYTUxkYXRhKCkubGVuZ3RoKSB7XHJcbiAgICAgIC8vIGxhc3QgcG9zaXRpb24gb2YgaXRzIHRhZ1xyXG4gICAgICBsZXQgdGFnOiBzdHJpbmcgPSBwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpO1xyXG4gICAgICBwYXJzZXIuYWRkMkN1cnJJbmRleCh0YWcuaW5kZXhPZihDb25zdEludGVyZmFjZS5NR19UQUdfRVhFQ19TVEFDS19FTlRSWSkgKyBDb25zdEludGVyZmFjZS5NR19UQUdfRVhFQ19TVEFDS19FTlRSWS5sZW5ndGgpO1xyXG5cclxuICAgICAgdG9rZW5zVmVjdG9yID0gWG1sUGFyc2VyLmdldFRva2VucyhwYXJzZXIuZ2V0WE1Mc3Vic3RyaW5nKGVuZENvbnRleHQpLCBYTUxDb25zdGFudHMuWE1MX0FUVFJfREVMSU0pO1xyXG5cclxuICAgICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IHRva2Vuc1ZlY3Rvci5sZW5ndGg7IGogKz0gMikge1xyXG4gICAgICAgIGF0dHJpYnV0ZSA9ICh0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaikpO1xyXG4gICAgICAgIGxldCB2YWx1ZVN0cjogc3RyaW5nID0gKHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqICsgMSkpO1xyXG5cclxuICAgICAgICBzd2l0Y2ggKGF0dHJpYnV0ZSkge1xyXG4gICAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9UQVNLSUQ6XHJcbiAgICAgICAgICAgIHRhc2tJZCA9IHZhbHVlU3RyO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9IQU5ETEVSSUQ6XHJcbiAgICAgICAgICAgIGhhbmRsZXJJZCA9IHZhbHVlU3RyO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9PUEVSX0lEWDpcclxuICAgICAgICAgICAgb3BlcklkeCA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIucHVzaFNlcnZlckV4ZWNTdGFjayh0YXNrSWQsIGhhbmRsZXJJZCwgb3BlcklkeCk7XHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgoZW5kQ29udGV4dCArIFhNTENvbnN0YW50cy5UQUdfVEVSTS5sZW5ndGgpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coJ2luIERhdGFWaWV3LmZpbGxJbm5lckV4ZWNTdGFjaygpIG91dCBvZiBib3VuZHMnKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZWFyY2ggZm9yIHRoZSBpbnZhbGlkYXRlIGF0dHJpYnV0ZSBhbmQgaWYgaXQgaXMgdHJ1ZSB0aGVuIGl0IGFsc28gY2xlYXJzIHRoZSBkYXRhdmlld1xyXG4gIC8vLyAgIGV4ZWN1dGUgdGhpcyBtZXRob2QgQkVGT1JFIHBhcnNpbmcgdGhlIHJlY29yZHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidG9rZW5zVmVjdG9yXCI+b2YgYWxsIGF0dHJpYnV0ZXMgYW5kIHZhbHVlczwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBwZWVrSW52YWxpZGF0ZSh0b2tlbnNWZWN0b3I6IExpc3Q8c3RyaW5nPik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHNlc3Npb25Db3VudGVyOiBudW1iZXIgPSBDb21tYW5kc1Byb2Nlc3Nvck1hbmFnZXIuR2V0Q29tbWFuZHNQcm9jZXNzb3IoKS5HZXRTZXNzaW9uQ291bnRlcigpO1xyXG5cclxuICAgIGZvciAobGV0IGo6IG51bWJlciA9IDA7IGogPCB0b2tlbnNWZWN0b3IubGVuZ3RoOyBqICs9IDIpIHtcclxuICAgICAgbGV0IGF0dHJpYnV0ZSA9IHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqKTtcclxuICAgICAgaWYgKGF0dHJpYnV0ZSA9PT0gKENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfSU5WQUxJREFURSkpIHtcclxuICAgICAgICBsZXQgdmFsdWVTdHIgPSB0b2tlbnNWZWN0b3IuZ2V0X0l0ZW0oaiArIDEpO1xyXG5cclxuICAgICAgICBpZiAoWG1sUGFyc2VyLmdldEJvb2xlYW4odmFsdWVTdHIpKSB7XHJcblxyXG4gICAgICAgICAgLy8gUUNSICMyODYzOiBXaGVuIGV4ZWN1dGluZyBSRUNVUlNJVkUgY2FsbHMgdG8gdGhlIHNlcnZlciB0aGVyZSB3ZXJlIGNhc2VzXHJcbiAgICAgICAgICAvLyBpbiB3aGljaCBhbiBvbGRlciBkYXRhdmlldyBzdXBlcnNlZHMgYSBuZXcgb25lIGJlY2F1c2UgaXRzIHBhcnNpbmcgY29tZXNcclxuICAgICAgICAgIC8vIGFmdGVyIHRoZSBwYXJzaW5nIG9mIHRoZSBuZXcgZGF0YXZpZXcuIFRoZSBzb2x1dGlvbiBpcyB0byBza2lwIHRoZVxyXG4gICAgICAgICAgLy8gcGFyc2luZyBvZiB0aGUgb2xkZXIgZGF0YXZpZXcgaWYgdGhlIG5ld2VyIGRhdGF2aWV3IGhhcyBpbnZhbGlkYXRlPXRydWVcclxuICAgICAgICAgIGlmIChzZXNzaW9uQ291bnRlciA8IHRoaXMuX2xhc3RTZXNzaW9uQ291bnRlcilcclxuICAgICAgICAgICAgdGhpcy5fc2tpcFBhcnNpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xhc3RTZXNzaW9uQ291bnRlciA9IHNlc3Npb25Db3VudGVyO1xyXG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgYSBmaWVsZCBieSBpdHMgbmFtZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmbGROYW1lXCI+b2YgdGhlIGZpZWxkIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiByZXF1aXJlZCBmaWVsZCAob3IgbnVsbCBpZiBub3QgZm91bmQpIDwvcmV0dXJucz5cclxuICBnZXRGaWVsZEJ5TmFtZShmbGROYW1lOiBzdHJpbmcpOiBGaWVsZCB7XHJcblxyXG4gICAgaWYgKHRoaXMuX2ZpZWxkc1RhYiAhPT0gbnVsbClcclxuICAgICAgcmV0dXJuIDxGaWVsZD50aGlzLl9maWVsZHNUYWIuZ2V0RmllbGQoZmxkTmFtZSk7XHJcblxyXG4gICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKCdpbiBEYXRhVmlldy5nZXRGaWVsZChTdHJpbmcpOiBUaGVyZSBpcyBubyBmaWVsZHNUYWIgb2JqZWN0Jyk7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBidWlsZCB0aGUgWE1MIHN0cmluZyBmb3IgdGhlIGRhdGF2aWV3XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1lc3NhZ2VcIj50aGUgbWVzc2FnZSBidWZmZXJcclxuICAvLy8gPC9wYXJhbT5cclxuICBwdWJsaWMgYXN5bmMgYnVpbGRYTUwobWVzc2FnZTogU3RyaW5nQnVpbGRlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGRjdjogRGNWYWx1ZXM7XHJcbiAgICBsZXQgdGFza1RhZzogU3RyaW5nID0gdGhpcy5fdGFzay5nZXRUYXNrVGFnKCk7XHJcbiAgICBsZXQgYnJrTGV2ZWxJbmRleDogbnVtYmVyID0gdGhpcy5fdGFzay5nZXRCcmtMZXZlbEluZGV4KCk7XHJcbiAgICBsZXQgY3VyclJlY0RlbGV0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBzZXJ2ZXJQYXJlbnQ6IFN0cmluZztcclxuXHJcbiAgICBsZXQgY29udGV4dFRhc2s6IFRhc2tCYXNlID0gPFRhc2tCYXNlPih0aGlzLmdldFRhc2soKS5HZXRDb250ZXh0VGFzaygpKTtcclxuICAgIGxldCBpbnZva2luZ1Rhc2tUYWc6IHN0cmluZyA9IGNvbnRleHRUYXNrLklzT2ZmbGluZSA/IElOVk9LRURfRlJPTV9PRkZMSU5FX1RBU0sgOiBjb250ZXh0VGFzay5nZXRUYXNrVGFnKCk7XHJcblxyXG4gICAgLy8gcHV0IHRoZSBkYXRhdmlldyB0YWcgZXZlbiBpZiB0aGVyZSBhcmUgbm8gbW9kaWZpZWQgcmVjb3JkcyBqdXN0IHRvIGxldFxyXG4gICAgLy8gdGhlIHNlcnZlciBrbm93IHRoZSBjdXJyZW50IHJlY29yZFxyXG4gICAgbWVzc2FnZS5BcHBlbmQoJ1xcbiAgICAgIDwnICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0RBVEFWSUVXICsgJyAnICsgWE1MQ29uc3RhbnRzLk1HX0FUVFJfVEFTS0lEICsgJz1cIicgK1xyXG4gICAgICB0YXNrVGFnICsgJ1wiJyk7XHJcblxyXG4gICAgLy8gUUNSIDQyMzA2NCBwdXRzIHRoZSBjdXJyZW50IGV4ZWN1dGluZyBoYW5kbGVyIGluZGV4XHJcbiAgICBtZXNzYWdlLkFwcGVuZCgnICcgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX1RBU0tMRVZFTCArICc9XCInICsgYnJrTGV2ZWxJbmRleCArICdcIicpO1xyXG5cclxuICAgIC8vIElmIHRoZSB0cmlnZ2VyIHRhc2sgaXMgYW4gT2ZmbGluZSBwcm9ncmFtLCB0aGUgcGFyZW50IG9uIHRoZSBzZXJ2ZXIgc2hvdWxkIGJlXHJcbiAgICAvLyB0aGUgTWFpbiBQcm9ncmFtIG9mIHRoZSBjdXJyZW50IENUTC5cclxuICAgIHNlcnZlclBhcmVudCA9ICcwJztcclxuICAgIGxldCB0cmlnZ2VyaW5nVGFzazogVGFza0Jhc2UgPSB0aGlzLmdldFRhc2soKS5nZXRUcmlnZ2VyaW5nVGFzaygpO1xyXG4gICAgaWYgKHRyaWdnZXJpbmdUYXNrICE9IG51bGwpIHtcclxuICAgICAgaWYgKHRyaWdnZXJpbmdUYXNrLklzT2ZmbGluZSkge1xyXG4gICAgICAgIGxldCBjdGxJZHg6IG51bWJlciA9IHRyaWdnZXJpbmdUYXNrLmdldEN0bElkeCgpO1xyXG4gICAgICAgIGxldCBtYWluUHJnOiBUYXNrQmFzZSA9IDxUYXNrQmFzZT4gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLkdldE1haW5Qcm9nQnlDdGxJZHgoLTEsIGN0bElkeCk7XHJcbiAgICAgICAgc2VydmVyUGFyZW50ID0gbWFpblByZy5nZXRUYXNrVGFnKCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHNlcnZlclBhcmVudCA9IHRyaWdnZXJpbmdUYXNrLmdldFRhc2tUYWcoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fY3VyclJlY0lkID4gSW50MzIuTWluVmFsdWUpIHtcclxuICAgICAgaWYgKHRoaXMuQ3VyclJlYyAhPSBudWxsKVxyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKCcgJyArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfQ1VSUl9SRUMgKyAnPVwiJyArIHRoaXMuX2N1cnJSZWNJZCArICdcIicpO1xyXG4gICAgICBtZXNzYWdlLkFwcGVuZCgnICcgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX1RBU0tNT0RFICsgJz1cIicgKyB0aGlzLl90YXNrLmdldE1vZGUoKSArICdcIicpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX3RyYW5zQ2xlYXJlZCAmJiAhKE1HRGF0YUNvbGxlY3Rpb24uSW5zdGFuY2UuU3RhcnR1cE1nRGF0YS5nZXRGaXJzdFRhc2soKS5JbkVuZFRhc2sgJiYgTUdEYXRhQ29sbGVjdGlvbi5JbnN0YW5jZS5TdGFydHVwTWdEYXRhLmdldEZpcnN0VGFzaygpLkNsb3NpbmdGb3JtVUkpKSB7XHJcbiAgICAgICAgbWVzc2FnZS5BcHBlbmQoJyAnICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9UUkFOU19DTEVBUkVEICsgJz1cIjFcIicpO1xyXG4gICAgICAgIHRoaXMuX3RyYW5zQ2xlYXJlZCA9IGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBRQ1IgNzc5OTgyIHB1dHMgdGhlIGludm9raW5nIF90YXNrIGlkIGFuZCB0aGUgZGlyZWN0IHBhcmVudCBfdGFzayBpZFxyXG4gICAgICBtZXNzYWdlLkFwcGVuZCgnICcgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX0lOVk9LRVJfSUQgKyAnPVwiJyArIGludm9raW5nVGFza1RhZyArICcsJyArIHNlcnZlclBhcmVudCArICdcIicpO1xyXG5cclxuLy8gcHV0IHRoZSBjdXJyZW50ICgoRGF0YVZpZXcpZGF0YVZpZXcpIGR2UG9zIHZhbHVlXHJcbiAgICAgIGlmIChhd2FpdCB0aGlzLmdldFRhc2soKS5pc0NhY2hlZCgpKVxyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKCcgJyArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfRFZQT1NfVkFMVUUgKyAnPVwiJyArIHRoaXMuX2R2UG9zVmFsdWUgKyAnXCInKTtcclxuXHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKCcgJyArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfTE9PUF9DT1VOVEVSICsgJz1cIicgKyB0aGlzLmdldFRhc2soKS5nZXRMb29wQ291bnRlcigpICsgJ1wiJyk7XHJcblxyXG4gICAgICAvLyBzZW5kIHN1YmZvcm0gdmlzaWJpbGl0eSBvbmx5IGlmIHRoZSBzdWJmb3JtIHdpdGggcHJvcGVydHkgXCJSZWZyZXNoV2hlbkhpZGRlbj1OXCIgYW5kIGl0IGlzIG5vdCB2aXNpYmxlLFxyXG4gICAgICAvLyBpLmUuIG5vdCBuZWVkZWQgcmVmcmVzaCBmcm9tIHRoZSBzZXJ2ZXJcclxuICAgICAgaWYgKHRoaXMuX3Rhc2suSXNTdWJGb3JtKSB7XHJcbiAgICAgICAgbGV0IHN1YmZvcm1DdHJsOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPnRoaXMuX3Rhc2suZ2V0Rm9ybSgpLmdldFN1YkZvcm1DdHJsKCk7XHJcbiAgICAgICAgaWYgKCFzdWJmb3JtQ3RybC5pc1Zpc2libGUoKSAmJlxyXG4gICAgICAgICAgISBhd2FpdCBzdWJmb3JtQ3RybC5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfUkVGUkVTSF9XSEVOX0hJRERFTiwgZmFsc2UpKVxyXG4gICAgICAgICAgbWVzc2FnZS5BcHBlbmQoJyAnICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9TVUJGT1JNX1ZJU0lCTEUgKyAnPVwiMFwiJyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGhpcy5fdGFzay5Jc0ludGVyYWN0aXZlKVxyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKCcgJyArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVEFTS19DT1VOVEVSICsgJz1cIicgKyB0aGlzLmdldFRhc2soKS5nZXRDb3VudGVyKCkgKyAnXCInKTtcclxuXHJcbiAgICAgIC8vIFFDUiM1OTE5NzM6IGxhc3RSZWNpZCBhbmQgb2xkRmlyc3RSZWNJRCBzaG91bGQgYmUgc2VudCBieSBjbGllbnQuXHJcbiAgICAgIC8vIEluIGNhc2Ugb2YgbW91c2Ugc2Nyb2xsaW5nLCB3ZSBwYXJrIG9uIHRoZSBzYW1lIHJlY29yZCAoZG9uJ3QgbGVhdmUgdGhlIGN1cnJlbnQgcmVjb3JkKS4gU28gb24gc2VydmVyIHdlIGdldCBjdXJyIHJlY29yZCBvbiB3aGljaFxyXG4gICAgICAvLyB3ZSB3ZXJlIHBhcmtlZCBiZWZvcmUgc2Nyb2xsaW5nLiBTbyB3ZSBjYW4gbm90IHVzZSB0aGlzIGluZGV4IHRvIGZldGNoIHRoZSByZWNvcmQuXHJcbiAgICAgIC8vIEluIHRoaXMgY2FzZSwgd2UgbmVlZCB0byBzZW5kIHRoZSBsYXN0IGZldGNoZWQgcmVjb3JkJ3MgaWR4IGZyb20gY2xpZW50IGluIGNhc2Ugb2Ygc2Nyb2xsIGRvd25cclxuICAgICAgLy8gYW5kIG9sZEZpcnN0UmVjSUQgKGZpcnN0IHJlY29yZCBvZiBsYXN0IHNlbnQgY2h1bmspIGluIGNhc2Ugb2Ygc2Nyb2xsIHVwLCBmcm9tIHdoaWNoIHdlIG5lZWQgdG8gZmV0Y2ggdGhlIGNodW5rIG9mIHJlY29yZHMuXHJcbiAgICAgIGlmICh0aGlzLl90YXNrICE9IG51bGwgJiYgIHRoaXMuX3Rhc2suR2V0Q29tcHV0ZWRQcm9wZXJ0eShQcm9wSW50ZXJmYWNlLlBST1BfVFlQRV9QUkVMT0FEX1ZJRVcpLkdldENvbXB1dGVkVmFsdWVCb29sZWFuKCkpIHtcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZCgnICcgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX0xBU1RfUkVDX0lEICsgJz1cIicgK1xyXG4gICAgICAgICAgKHRoaXMuX3JlY29yZHNUYWIuZ2V0UmVjQnlJZHgodGhpcy5nZXRTaXplKCkgLSAxKS5nZXRJZCgpKSArICdcIicpO1xyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKCcgJyArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfT0xEX0ZJUlNUX1JFQ19JRCArICc9XCInICtcclxuICAgICAgICAgIHRoaXMuX3JlY29yZHNUYWIuZ2V0UmVjQnlJZHgoMCkuZ2V0SWQoKSArICdcIicpO1xyXG4gICAgICB9XHJcblxyXG5cclxuICAgICAgLy8gc2VuZCB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCByZWMgaW4gdGhlIGZvcm1zIHRhYmxlLlxyXG4gICAgICAvLyBpdCBjYW4gYmUgdXNlZCBieSB0aGUgc2VydmVyIHRvIGtlZXAgdGhlIHJlY29yZCBpbiB0aGlzIHBvc2l0aW9uIGFmdGVyIHRoZSB2aWV3IHJlZnJlc2guXHJcbiAgICAgIGlmICh0aGlzLl90YXNrLklzSW50ZXJhY3RpdmUpIHtcclxuICAgICAgICBsZXQgZm9ybTogTWdGb3JtID0gPE1nRm9ybT50aGlzLl90YXNrLmdldEZvcm0oKTtcclxuICAgICAgICBpZiAoZm9ybSAhPSBudWxsICYmIHRoaXMuX3JlY29yZHNUYWIuZ2V0U2l6ZSgpID4gMSkge1xyXG4gICAgICAgICAgbWVzc2FnZS5BcHBlbmQoJyAnICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9DVVJSX1JFQ19QT1NfSU5fRk9STSArICc9XCInICtcclxuICAgICAgICAgICAgZm9ybS5nZXRDdXJyUmVjUG9zSW5Gb3JtKCkgKyAnXCInKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlRBR19DTE9TRSk7XHJcblxyXG4gICAgICAvLyBBZGQgVXNlciBSYW5nZXNcclxuICAgICAgaWYgKHRoaXMuZ2V0VGFzaygpLlJlc2V0UmFuZ2UgfHwgdGhpcy5nZXRUYXNrKCkuVXNlclJuZ3MgIT0gbnVsbCkge1xyXG4gICAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5TVEFSVF9UQUcgKyBDb25zdEludGVyZmFjZS5VU0VSX1JBTkdFUyk7XHJcbiAgICAgICAgaWYgKHRoaXMuZ2V0VGFzaygpLlJlc2V0UmFuZ2UpIHtcclxuICAgICAgICAgIG1lc3NhZ2UuQXBwZW5kKCcgJyArIENvbnN0SW50ZXJmYWNlLkNMRUFSX1JBTkdFICsgJz1cIjFcIicpO1xyXG4gICAgICAgICAgdGhpcy5nZXRUYXNrKCkuUmVzZXRSYW5nZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5nZXRUYXNrKCkuVXNlclJuZ3MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgdGhpcy5nZXRUYXNrKCkuYnVpbGRYTUxGb3JSbmdzKG1lc3NhZ2UsIHRoaXMuZ2V0VGFzaygpLlVzZXJSbmdzLCBmYWxzZSk7XHJcbiAgICAgICAgICB0aGlzLmdldFRhc2soKS5Vc2VyUm5ncy5DbGVhcigpO1xyXG4gICAgICAgICAgdGhpcy5nZXRUYXNrKCkuVXNlclJuZ3MgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5UQUdfVEVSTSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEFkZCBVc2VyIExvY2F0ZXNcclxuICAgICAgaWYgKHRoaXMuZ2V0VGFzaygpLlJlc2V0TG9jYXRlIHx8IHRoaXMuZ2V0VGFzaygpLlVzZXJMb2NzICE9IG51bGwpIHtcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuU1RBUlRfVEFHICsgQ29uc3RJbnRlcmZhY2UuVVNFUl9MT0NBVEVTKTtcclxuICAgICAgICBpZiAodGhpcy5nZXRUYXNrKCkuUmVzZXRMb2NhdGUpIHtcclxuICAgICAgICAgIG1lc3NhZ2UuQXBwZW5kKCcgJyArIENvbnN0SW50ZXJmYWNlLkNMRUFSX0xPQ0FURVMgKyAnPVwiMVwiJyk7XHJcbiAgICAgICAgICB0aGlzLmdldFRhc2soKS5SZXNldExvY2F0ZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5nZXRUYXNrKCkuVXNlckxvY3MgIT0gbnVsbCkge1xyXG4gICAgICAgICAgdGhpcy5nZXRUYXNrKCkuYnVpbGRYTUxGb3JSbmdzKG1lc3NhZ2UsIHRoaXMuZ2V0VGFzaygpLlVzZXJMb2NzLCB0cnVlKTtcclxuICAgICAgICAgIHRoaXMuZ2V0VGFzaygpLlVzZXJMb2NzLkNsZWFyKCk7XHJcbiAgICAgICAgICB0aGlzLmdldFRhc2soKS5Vc2VyTG9jcyA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlRBR19URVJNKTtcclxuICAgICAgfVxyXG5cclxuXHJcbiAgICAgIC8vIEFkZCBVc2VyIFNvcnRzXHJcbiAgICAgIGlmICh0aGlzLmdldFRhc2soKS5SZXNldFNvcnQgfHwgdGhpcy5nZXRUYXNrKCkuVXNlclNvcnRzICE9IG51bGwpIHtcclxuICAgICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuU1RBUlRfVEFHICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX1NPUlRTKTtcclxuICAgICAgICBpZiAodGhpcy5nZXRUYXNrKCkuUmVzZXRTb3J0KSB7XHJcbiAgICAgICAgICBtZXNzYWdlLkFwcGVuZCgnICcgKyBDb25zdEludGVyZmFjZS5DTEVBUl9TT1JUUyArICc9XCIxXCInKTtcclxuICAgICAgICAgIHRoaXMuZ2V0VGFzaygpLlJlc2V0U29ydCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5nZXRUYXNrKCkuVXNlclNvcnRzICE9IG51bGwpXHJcbiAgICAgICAgICB0aGlzLmdldFRhc2soKS5idWlsZFhNTEZvclNvcnRzKG1lc3NhZ2UpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5UQUdfVEVSTSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHNlbmQgZGVsZXRlZCBjYWNoZSBlbnRyaWVzXHJcbiAgICAgIGlmIChhd2FpdCB0aGlzLmdldFRhc2soKS5pc0NhY2hlZCgpKSB7XHJcbiAgICAgICAgbGV0IGRlbExpc3Q6IFN0cmluZyA9IHRoaXMuZ2V0VGFzaygpLmdldFRhc2tDYWNoZSgpLmdldERlbGV0ZWRMaXN0VG9YTUwoKTtcclxuICAgICAgICBpZiAoZGVsTGlzdCAhPT0gJycpIHtcclxuICAgICAgICAgIG1lc3NhZ2UuQXBwZW5kKFhNTENvbnN0YW50cy5TVEFSVF9UQUcgKyBDb25zdEludGVyZmFjZS5NR19UQUdfREVMX0xJU1QpO1xyXG4gICAgICAgICAgbWVzc2FnZS5BcHBlbmQoJyAnICsgWE1MQ29uc3RhbnRzLk1HX0FUVFJfSUQgKyAnPVwiJyArIHRoaXMuX3Rhc2suZ2V0VGFza1RhZygpICsgJ1wiJyk7XHJcbiAgICAgICAgICBtZXNzYWdlLkFwcGVuZCgnICcgKyBDb25zdEludGVyZmFjZS5NR19BVFRSX1JFTU9WRSArICc9XCInICsgZGVsTGlzdCArICdcIicpO1xyXG4gICAgICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlRBR19URVJNKTtcclxuXHJcbiAgICAgICAgICAvLyBpZiB0aGUgY3VycmVudCBhY3RpdmUgZGF0YXZpZXcgaXMgaW4gdGhlIGRlbHRlZGUgbGlzdCBtYXJrIGl0IGFzIHVuLXZhbGlkIHNvXHJcbiAgICAgICAgICAvLyBpdCB3b250IGVudGVyIHRoZSBjYWNoZSBvbiByZXR1cm4gZnJvbSBzZXJ2ZXJcclxuICAgICAgICAgIGlmICh0aGlzLmdldFRhc2soKS5nZXRUYXNrQ2FjaGUoKS5pc0RlbGV0ZWQodGhpcy5fZHZQb3NWYWx1ZSkpXHJcbiAgICAgICAgICAgIHRoaXMuc2V0Q2hhbmdlZCh0cnVlKTtcclxuICAgICAgICAgIHRoaXMuZ2V0VGFzaygpLmdldFRhc2tDYWNoZSgpLmNsZWFyRGVsZXRlZExpc3QoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHJlbW92ZSB1bm5lY2Vzc2FyeSBkYXRhIGNvbnRyb2wgdmFsdWVzXHJcbiAgICAgIGxldCBkY1ZhbEtleXM6IHN0cmluZ1tdID0gdGhpcy5fZGNWYWxzQ29sbGVjdGlvbi5LZXlzO1xyXG5cclxuICAgICAgZGNWYWxLZXlzLmZvckVhY2goKGRjVmFsS2V5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICBkY3YgPSB0aGlzLl9kY1ZhbHNDb2xsZWN0aW9uLmdldF9JdGVtKGRjVmFsS2V5KTtcclxuXHJcbiAgICAgICAgaWYgKCFkY3YuSGFzUmVmZXJlbmNlcykge1xyXG4gICAgICAgICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlNUQVJUX1RBRyArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19EQ19WQUxTKTtcclxuICAgICAgICAgIG1lc3NhZ2UuQXBwZW5kKCcgJyArIFhNTENvbnN0YW50cy5NR19BVFRSX0lEICsgJz1cIicgKyBkY3YuZ2V0SWQoKSArICdcIicpO1xyXG4gICAgICAgICAgbWVzc2FnZS5BcHBlbmQoJyAnICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9SRU1PVkUgKyAnPVwiMVwiJyk7XHJcbiAgICAgICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuVEFHX1RFUk0pO1xyXG5cclxuICAgICAgICAgIHRoaXMuX2RjVmFsc0NvbGxlY3Rpb24uUmVtb3ZlKGRjVmFsS2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKHRoaXMuQ3VyclJlYyAhPSBudWxsKVxyXG4gICAgICAgIGN1cnJSZWNEZWxldGVkID0gKHRoaXMuQ3VyclJlYy5nZXRNb2RlKCkgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5EZWxldGVcclxuICAgICAgICAgICYmIHRoaXMuX21vZGlmaWVkUmVjb3Jkc1RhYi5nZXRSZWNvcmQodGhpcy5DdXJyUmVjLmdldElkKCkpICE9IG51bGwgJiYgdGhpcy5DdXJyUmVjLlNlbmRUb1NlcnZlcik7XHJcblxyXG4gICAgICAvLyBJZiB0aGUgY3VycmVudCB1c2VyIGV2ZW50IGJlaW5nIGhhbmRsZWQgaGFzIEZvcmNlIGV4aXQgPSAnUHJlIFJlY29yZCBVcGRhdGUnLCB0aGVuXHJcbiAgICAgIC8vIGRvIG5vdCBhZGQgY3VycmVudCByZWNvcmQgdG8gdGhlIG1vZGlmaWVkIHJlY29yZHMgbGlzdC4gV2UgYW55d2F5IHNlbmQgY3VycmVudFxyXG4gICAgICAvLyByZWNvcmQgc2VwYXJhdGVseS5cclxuICAgICAgbGV0IHNraXBDdXJyUmVjOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgICBpZiAodGhpcy5DdXJyUmVjICE9IG51bGwgJiYgdGhpcy5fbW9kaWZpZWRSZWNvcmRzVGFiLmdldFJlY29yZCh0aGlzLkN1cnJSZWMuZ2V0SWQoKSkgIT0gbnVsbClcclxuICAgICAgICBza2lwQ3VyclJlYyA9IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmlzRm9yY2VFeGl0UHJlUmVjb3JkVXBkYXRlKHRoaXMuZ2V0VGFzaygpKTtcclxuXHJcbiAgICAgIHRoaXMuX21vZGlmaWVkUmVjb3Jkc1RhYi5idWlsZFhNTCggbWVzc2FnZSwgc2tpcEN1cnJSZWMsIHRoaXMuQ3VyclJlYy5nZXRJZCgpKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9vcmlnaW5hbCAhPSBudWxsKVxyXG4gICAgICAgIHRoaXMuX29yaWdpbmFsLmNsZWFyTW9kZSgpO1xyXG5cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gdGhpcy5fbW9kaWZpZWRSZWNvcmRzVGFiLmdldFNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgaWYgKHNraXBDdXJyUmVjICYmIHRoaXMuX21vZGlmaWVkUmVjb3Jkc1RhYi5nZXRSZWNCeUlkeChpKS5nZXRJZCgpID09PSB0aGlzLkN1cnJSZWMuZ2V0SWQoKSlcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICB0aGlzLl9tb2RpZmllZFJlY29yZHNUYWIuZ2V0UmVjQnlJZHgoaSkuY2xlYXJGbGFnc0hpc3RvcnkoKTtcclxuICAgICAgICB0aGlzLl9tb2RpZmllZFJlY29yZHNUYWIucmVtb3ZlUmVjb3JkKGkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5DdXJyUmVjICE9IG51bGwgJiYgIWN1cnJSZWNEZWxldGVkKSB7XHJcblxyXG4gICAgICAgIC8vIFdoZW4gd2UgcmVjb25uZWN0IHRvIHRoZSBzZXJ2ZXIgb25jZSBpdCBpcyBkaXNjb25uZWN0ZWQsIHNlcnZlciB3aWxsIGNyZWF0ZSBhIG5ldyBjb250ZXh0IGFuZFxyXG4gICAgICAgIC8vIHRoZXJlZm9yZSBNUCB2YXJpYWJsZXMgYXJlIHdpdGggdGhlaXIgaW50aWFsIChlbXB0eSkgdmFsdWUgYW5kIG5vdCB3aXRoIHRoZWlyIHJlYWwgdmFsdWVzLlxyXG4gICAgICAgIC8vIFNvLCB3ZSBtdXN0IGFsd2F5cyBzZW5kIE1haW4gcHJvZ3JhbSdzIGZpZWxkJ3MgbGF0ZXN0ICB2YWx1ZXMgdG8gdGhlIHNlcnZlci5cclxuICAgICAgICBsZXQgZm9yY2VCdWlsZDogYm9vbGVhbiA9ICh0aGlzLl90YXNrLmlzTWFpblByb2coKSAmJiAoUmVtb3RlQ29tbWFuZHNQcm9jZXNzb3IuSXNTZXNzaW9uUmVJbml0aWFsaXppbmcpKTtcclxuICAgICAgICB0aGlzLkN1cnJSZWMuYnVpbGRYTUwobWVzc2FnZSwgdHJ1ZSwgZm9yY2VCdWlsZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBRQ1IgNzc5OTgyIGlmIHdlIGhhdmUgbWFpbiBwcm9nIHdpdGggbm8gc2VsZWN0J3Mgc2VuZCB0aGUgaW52b2tlciBhbmQgcGFyZW50IF90YXNrXHJcbiAgICBlbHNlIHtcclxuICAgICAgbWVzc2FnZS5BcHBlbmQoJyAnICsgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9JTlZPS0VSX0lEICsgJz1cIicgKyBpbnZva2luZ1Rhc2tUYWcgKyAnLCcgKyBzZXJ2ZXJQYXJlbnQgKyAnXCInICtcclxuICAgICAgICBYTUxDb25zdGFudHMuVEFHX0NMT1NFKTtcclxuICAgIH1cclxuICAgIG1lc3NhZ2UuQXBwZW5kKCdcXG4gICAgICA8LycgKyBDb25zdEludGVyZmFjZS5NR19UQUdfREFUQVZJRVcgKyBYTUxDb25zdGFudHMuVEFHX0NMT1NFKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IFJlY29yZCBpcyB0aGUgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IHJlY29yZCA8L3JldHVybnM+XHJcbiAgZ2V0Q3VyclJlYygpOiBSZWNvcmQge1xyXG4gICAgaWYgKHRoaXMuQ3VyclJlYyA9PT0gbnVsbCAmJiB0aGlzLl9jdXJyUmVjSWQgPiBJbnQzMi5NaW5WYWx1ZSkge1xyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZygnRGF0YVZpZXcuZ2V0Q3VyclJlYygpOiByZWNvcmQgJyArIHRoaXMuX2N1cnJSZWNJZCArICcgbm90IGZvdW5kJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5DdXJyUmVjO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBhIHJlZmVyZW5jZSB0byB0aGUgcHJldmlvdXMgY3VycmVudCByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gUmVjb3JkIGlzIHRoZSByZWZlcmVuY2UgdG8gdGhlIHByZXZpb3VzIGN1cnJlbnQgcmVjb3JkIDwvcmV0dXJucz5cclxuICBnZXRQcmV2Q3VyclJlYygpOiBSZWNvcmQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ByZXZDdXJyUmVjO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCBhIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+IFJlY29yZCBpcyB0aGUgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCByZWNvcmRcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGdldE9yaWdpbmFsUmVjKCk6IFJlY29yZCB7XHJcblxyXG4gICAgaWYgKHRoaXMuX29yaWdpbmFsID09PSBudWxsIHx8IHRoaXMuX29yaWdpbmFsLmdldElkKCkgIT09IHRoaXMuQ3VyclJlYy5nZXRJZCgpKVxyXG4gICAgICByZXR1cm4gdGhpcy5DdXJyUmVjO1xyXG4gICAgcmV0dXJuIHRoaXMuX29yaWdpbmFsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgY3VycmVudCByZWNvcmQgLSByZXR1cm5zIHRydWUgb24gc3VjY2Vzc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZFwiPnRoZSByZWNvcmQgaWRcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNvbXB1dGVcIj5pZiB0cnVlIHRoZW4gZXhlY3V0ZSBjb21wdXRlIGZvciB0aGUgbmV3IHJlY29yZFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIGFzeW5jIHNldEN1cnJSZWMoaWQ6IG51bWJlciwgY29tcHV0ZTogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgbGV0IG9sZFJlY0lkOiBudW1iZXIgPSB0aGlzLl9jdXJyUmVjSWQ7XHJcbiAgICBpZiAoaWQgPiBJbnQzMi5NaW5WYWx1ZSkge1xyXG4gICAgICBsZXQgbmV3SWR4OiBudW1iZXIgPSB0aGlzLl9yZWNvcmRzVGFiLmdldFJlY0lkeChpZCk7XHJcblxyXG4gICAgICBpZiAobmV3SWR4ID09PSAtMSlcclxuICAgICAgICB0aGlzLl9vcmlnaW5hbCA9IG51bGw7XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBsZXQgaWdub3JlQ3VyclJlYzogYm9vbGVhbiA9IHRoaXMuX2N1cnJSZWNJZCA9PT0gSW50MzIuTWluVmFsdWU7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSZWNCeUlkeChuZXdJZHgsICFpZ25vcmVDdXJyUmVjLCBpZ25vcmVDdXJyUmVjLCBjb21wdXRlLCBJbnQzMi5NaW5WYWx1ZSk7XHJcbiAgICAgICAgICBpZiAoaWQgIT09IG9sZFJlY0lkKVxyXG4gICAgICAgICAgICB0aGlzLnNhdmVPcmlnaW5hbCgpO1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcclxuICAgICAgICAgIGlmIChleGNlcHRpb24gaW5zdGFuY2VvZiBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyBkbyBub3QgcG9pbnQgdG8gYW55IGN1cnJlbnQgcmVjb3JkXHJcbiAgICAgIHRoaXMuQ3VyclJlYyA9IG51bGw7XHJcbiAgICAgIHRoaXMuX29yaWdpbmFsID0gbnVsbDtcclxuICAgICAgdGhpcy5fY3VyclJlY0lkID0gSW50MzIuTWluVmFsdWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgU2V0IHRoZSBjdXJyZW50IHJlY29yZCBpbmRleCBhbmQgcmV0dXJucyB0cnVlIGZvciBzdWNjZXNzXHJcbiAgLy8vICAgVXNlIHRoZSBNR19EQVRBVklFV19GSVJTVF9SRUNPUkQgYW5kIE1HX0RBVEFWSUVXX0xBU1RfUkVDT1JEIGNvbnN0YW50c1xyXG4gIC8vLyAgIHRvIHJldHJpZXZlIHRoZSBmaXJzdCBvciB0aGUgbGFzdCByZWNvcmQgcmVzcGVjdGl2ZWx5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld0lkeFwiPnRoZSBuZXcgaW5kZXggPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImRvU3VmZml4XCI+aWYgdHJ1ZSB0aGVuIGRvIHRoZSByZWNvcmQgc3VmZml4IGZvciB0aGUgcHJldmlvdXMgcmVjb3JkIHdoZW4gdGhlIHJlY29yZCB3YXMgY2hhbmdlZCA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWdub3JlQ3VyclJlY1wiPmlmIHRydWUgYWxsIHRoZSBvcGVyYXRpb25zIGFyZSBkb25lIGlzIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgcmVjb3JkIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjb21wdXRlXCI+aWYgdHJ1ZSB0aGVuIGV4ZWN1dGUgY29tcHV0ZSBmb3IgdGhlIG5ldyByZWNvcmQgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld0Rpc3BsYXlMaW5lXCI+dG8gdXBkYXRlIGZvcm0gPC9wYXJhbT5cclxuICBhc3luYyBzZXRDdXJyUmVjQnlJZHgobmV3SWR4OiBudW1iZXIsIGRvU3VmZml4OiBib29sZWFuLCBpZ25vcmVDdXJyUmVjOiBib29sZWFuLCBjb21wdXRlOiBib29sZWFuLCBuZXdEaXNwbGF5TGluZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgbGFzdFJlY0lkeDogbnVtYmVyID0gdGhpcy5fcmVjb3Jkc1RhYi5nZXRTaXplKCkgLSAxO1xyXG4gICAgbGV0IG9sZEZpcnN0UmVjOiBSZWNvcmQsIG5leHRSZWM6IFJlY29yZDtcclxuXHJcbiAgICAvLyBRQ1IgIzk4NDk2MDogdGhlIHZhcmlhYmxlIHJlY29yZFN1ZmYgaXMgdXNlZCB0byByZWNvZ25pemUgaWYgd2UgaGF2ZSBwcmVzc2VkXHJcbiAgICAvLyBjdHJsK2hvbWUgb3IgY3RybCtlbmQgaW4gdGhlc2UgY2FzZXMgd2UgbXVzdCBpbml0aWF0ZSByZWNvcmQgc3VmZml4XHJcbiAgICAvLyB0aGUgY29ycmVjdCB3YXkgdG8gZG8gdGhpcyBpcyB1c2luZyB0aGUgZG9TdWZmaXggcGFyYW1ldGVyIGJ1dCBzaW5jZSBpdCBpcyB1c2VkXHJcbiAgICAvLyBpbiBhIGxvdCBvZiBjYXNlcyBzb21ldGltZSBub3QgaW4gYSBjb3JyZWN0IHdheSwgZm9yY2luZyByZWNvcmQgc3VmZml4XHJcbiAgICAvLyB1c2luZyBkb1N1ZmZpeCB3aWxsIGNhdXNlIG1hbnkgY2hhbmdlcyBpbiB0aGUgY29kZS5cclxuICAgIGxldCByZWNvcmRTdWZmOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKG5ld0lkeCA9PT0gQ29uc3RhbnRzLk1HX0RBVEFWSUVXX0ZJUlNUX1JFQ09SRCkge1xyXG5cclxuICAgICAgLy8gQXMgbW92aW5nIHRvIGZpcnN0IHJlY29yZCBpbiB0aGUgdmlldywgcmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3IHNob3VsZCBiZSAwLlxyXG4gICAgICBpZiAodGhpcy5nZXRUYXNrKCkuaXNUYWJsZVdpdGhBYnNvbHV0ZXNTY3JvbGxiYXIoKSkge1xyXG4gICAgICAgIHRoaXMuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3ID0gMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuX2luY2x1ZGVzRmlyc3QpIHtcclxuICAgICAgICAvLyBjaGVjayBpZiB0aGUgY3VycmVudCByZWNvcmQgaXMgYWxyZWFkeSB0aGUgZmlyc3QgcmVjb3JkIG9mIHRoZSBkYXRhIHZpZXdcclxuICAgICAgICBpZiAodGhpcy5fY3VyclJlY0lkeCA+PSAwIHx8IHRoaXMuX2N1cnJSZWNJZHggPT09IEludDMyLk1pblZhbHVlKSB7XHJcbiAgICAgICAgICBuZXdJZHggPSAwO1xyXG5cclxuICAgICAgICAgIC8vIGN0cmwraG9tZSB3YXNlIHByZXNzZWRcclxuICAgICAgICAgIHJlY29yZFN1ZmYgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0aHJvdyBuZXcgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbihSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uX0V4Y2VwdGlvblR5cGUuVE9QKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmZldGNoQ2h1bmtGcm9tU2VydmVyKENIVU5LX0RWX1RPUCwgZG9TdWZmaXgpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJlY0J5SWR4KG5ld0lkeCwgZmFsc2UsIGlnbm9yZUN1cnJSZWMsIGNvbXB1dGUsIFNFVF9ESVNQTEFZTElORV9CWV9EVik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChuZXdJZHggPT09IENvbnN0YW50cy5NR19EQVRBVklFV19MQVNUX1JFQ09SRCkge1xyXG4gICAgICBpZiAodGhpcy5faW5jbHVkZXNMYXN0KSB7XHJcbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGN1cnJlbnQgcmVjb3JkIGlzIGFscmVhZHkgdGhlIGxhc3QgcmVjb3JkIG9mIHRoZSBkYXRhIHZpZXdcclxuICAgICAgICBpZiAodGhpcy5fY3VyclJlY0lkeCA8PSBsYXN0UmVjSWR4KSB7XHJcbiAgICAgICAgICBuZXdJZHggPSBsYXN0UmVjSWR4O1xyXG4gICAgICAgICAgLy8gY3RybCtlbmQgd2FzIHByZXNzZWRcclxuICAgICAgICAgIHJlY29yZFN1ZmYgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHRocm93IG5ldyBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb25fRXhjZXB0aW9uVHlwZS5CT1RUT00pO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIElmIGxhc3QgcmVjb3JkIGlzIG5vdCBpbiB0aGUgdmlldywgYW5kIGJlaW5nIGZldGNoZWQgZnJvbSB0aGUgc2VydmVyLCBSZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcgPSBUb3RhbFJlY29yZHNDb3VudC4gQW5kIGFzIHRoaXMgY2h1bmsgZ2V0IGFkZGVkXHJcbiAgICAgICAgLy8gaW50byByZWNvcmRzIHRhYmxlLCB0aGUgUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3IHdpbGwgYmUgZGVjcmVtZW50ZWQgYnkgbm8gb2Ygcm93cyBpbiB2aWV3LlxyXG4gICAgICAgIC8vIFRoaXMgaXMgYmVjYXVzZSwgd2Ugb3BlbiB0aGUgY3Vyc29yIHdpdGggcmV2ZXJzZSBkaXJlY3Rpb24gZm9yIHdoaWNoIGRvIG5vdCBicmluZyB0aGUgY291bnRzIGZyb20gZ2F0ZXdheS5cclxuICAgICAgICBpZiAodGhpcy5nZXRUYXNrKCkuaXNUYWJsZVdpdGhBYnNvbHV0ZXNTY3JvbGxiYXIoKSlcclxuICAgICAgICAgIHRoaXMuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3ID0gdGhpcy5Ub3RhbFJlY29yZHNDb3VudDtcclxuXHJcbiAgICAgICAgYXdhaXQgdGhpcy5mZXRjaENodW5rRnJvbVNlcnZlcihDSFVOS19EVl9CT1RUT00sIGRvU3VmZml4KTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9pbmNsdWRlc0xhc3QpXHJcbiAgICAgICAgICB0aHJvdyBuZXcgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbihSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uX0V4Y2VwdGlvblR5cGUuQk9UVE9NKTtcclxuXHJcbiAgICAgICAgbGV0IGZvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGhpcy5fdGFzay5nZXRGb3JtKCk7XHJcbiAgICAgICAgaWYgKGZvcm0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgd2hpbGUgKCF0aGlzLl9pbmNsdWRlc0ZpcnN0ICYmIGZvcm0uZ2V0Um93c0luUGFnZSgpID49IHRoaXMuZ2V0U2l6ZSgpKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZmV0Y2hDaHVua0Zyb21TZXJ2ZXIoQ0hVTktfQ0FDSEVfUFJFViwgZmFsc2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSZWNCeUlkeChuZXdJZHgsIGZhbHNlLCBpZ25vcmVDdXJyUmVjLCBjb21wdXRlLCBTRVRfRElTUExBWUxJTkVfQllfRFYpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gY2hlY2sgd2hldGhlciB0aGUgcmVjb3JkIHdhcyBub3QgZm91bmQgYmV5b25kIHRoZSBUT1AgZW5kXHJcbiAgICBlbHNlIGlmIChuZXdJZHggPCAwKSB7XHJcbiAgICAgIGlmICh0aGlzLl9pbmNsdWRlc0ZpcnN0KVxyXG4gICAgICAgIHRocm93IG5ldyBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb25fRXhjZXB0aW9uVHlwZS5UT1ApO1xyXG5cclxuICAgICAgb2xkRmlyc3RSZWMgPSB0aGlzLl9yZWNvcmRzVGFiLmdldFJlY0J5SWR4KDApO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX3JlY29yZHNUYWIuZ2V0U2l6ZSgpID4gMCB8fCB0aGlzLkluY2x1ZGVzTGFzdCgpKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuZmV0Y2hDaHVua0Zyb21TZXJ2ZXIoQ0hVTktfQ0FDSEVfUFJFViwgZG9TdWZmaXgpO1xyXG4gICAgICAvLyBpZiBubyByZWNvcmRzIGFuZCBpdHMgZmlyc3Qgc2ltdWxhdGUgc3RhcnQgdGFibGVcclxuICAgICAgZWxzZSBpZiAodGhpcy5fcmVjb3Jkc1RhYi5nZXRTaXplKCkgPT09IDAgJiYgdGhpcy5JbmNsdWRlc0ZpcnN0KCkpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5mZXRjaENodW5rRnJvbVNlcnZlcihDSFVOS19EVl9UT1AsIGRvU3VmZml4KTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZygnaW4gRGF0YVZpZXcuZmV0Y2hDaHVua0Zyb21TZXJ2ZXIoKSB3cm9uZyBvcHRpb24nKTtcclxuXHJcbiAgICAgIC8vIGdldCB0aGUgbmV3IGluZGV4IG9mIHRoZSByZWNvcmQgd2hpY2ggd2FzIGZpcnN0IGJlZm9yZSB0aGUgZmV0Y2hcclxuICAgICAgbGV0IG9sZEZpcnN0TmV3SWR4OiBudW1iZXIgPSBvbGRGaXJzdFJlYyAhPSBudWxsXHJcbiAgICAgICAgPyB0aGlzLl9yZWNvcmRzVGFiLmdldFJlY0lkeChvbGRGaXJzdFJlYy5nZXRJZCgpKVxyXG4gICAgICAgIDogdGhpcy5fcmVjb3Jkc1RhYi5nZXRTaXplKCk7XHJcbiAgICAgIGlmIChvbGRGaXJzdE5ld0lkeCAhPT0gMClcclxuICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSZWNCeUlkeChvbGRGaXJzdE5ld0lkeCArIG5ld0lkeCwgZmFsc2UsIGlnbm9yZUN1cnJSZWMsIGNvbXB1dGUsIFNFVF9ESVNQTEFZTElORV9CWV9EVik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIGNoZWNrIHdoZXRoZXIgdGhlIHJlY29yZCB3YXMgbm90IGZvdW5kIGJleW9uZCB0aGUgQk9UVE9NIGVuZFxyXG4gICAgZWxzZSBpZiAobmV3SWR4ID4gbGFzdFJlY0lkeCkge1xyXG4gICAgICBpZiAodGhpcy5faW5jbHVkZXNMYXN0KVxyXG4gICAgICAgIHRocm93IG5ldyBSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uKFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb25fRXhjZXB0aW9uVHlwZS5CT1RUT00pO1xyXG4gICAgICAvL3RoZSByb3cgaXMgYWN0dWFsbHkgbm90IGNyZWF0ZWQgeWV0IGluIFVJLCBpdCB3aWxsIGJlIGNyZWF0ZWQgb25seSBhZnRlciB3ZSBicmluZyB0aGUgbmV3IGNodW5rXHJcbiAgICAgIGlmICh0aGlzLmdldEZvcm0oKS5pc1Jvd0NyZWF0ZWQobmV3SWR4KSlcclxuICAgICAgICB0aGlzLmdldEZvcm0oKS5tYXJrUm93Tk9UQ3JlYXRlZChuZXdJZHgpO1xyXG5cclxuICAgICAgYXdhaXQgdGhpcy5mZXRjaENodW5rRnJvbVNlcnZlcihDSFVOS19DQUNIRV9ORVhULCBkb1N1ZmZpeCk7XHJcbiAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJlY0J5SWR4KG5ld0lkeCwgZmFsc2UsIGlnbm9yZUN1cnJSZWMsIGNvbXB1dGUsIFNFVF9ESVNQTEFZTElORV9CWV9EVik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgIGlzQ3JlYXRlTGluZUFib3ZlQWN0IDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGxhc3RFdmVudCA6IG51bWJlciA9IGlzTnVsbE9yVW5kZWZpbmVkKEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmdldExhc3RSdEV2ZW50KCkpID8gMCA6XHJcbiAgICAgIEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmdldExhc3RSdEV2ZW50KCkuZ2V0SW50ZXJuYWxDb2RlKCk7XHJcblxyXG4gICAgaWYgKG5ld0lkeCA+PSAwICYmICF0aGlzLmdldFRhc2soKS50cmFuc2FjdGlvbkZhaWxlZChDb25zdEludGVyZmFjZS5UUkFOU19SRUNPUkRfUFJFRklYKSAmJlxyXG4gICAgbGFzdEV2ZW50ID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1JFTElORV9BQk9WRSkge1xyXG4gICAgICBpZiAoKCg8VGFzaz50aGlzLmdldFRhc2soKSkuZ2V0SW5DcmVhdGVMaW5lKCkpICYmIG5ld0lkeCA9PSB0aGlzLl9jdXJyUmVjSWR4KSB7XHJcbiAgICAgICAgbGV0IG5ld1JlYzogUmVjb3JkID0gdGhpcy5fcmVjb3Jkc1RhYi5nZXRSZWNCeUlkeChuZXdJZHgpO1xyXG4gICAgICAgIGlmIChuZXdSZWMuZ2V0TW9kZSgpID09IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQpXHJcbiAgICAgICAgICBpc0NyZWF0ZUxpbmVBYm92ZUFjdCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBRQ1IgIyA5ODQ5NjAgLSBzZWUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIHZhcmlhYmxlIHJlY29yZFN1ZmYgaW4gdGhlIHRvcCBvZiB0aGlzIG1ldGhvZFxyXG4gICAgaWYgKHJlY29yZFN1ZmYgfHwgaXNDcmVhdGVMaW5lQWJvdmVBY3QgfHwgbmV3SWR4ICE9PSB0aGlzLl9jdXJyUmVjSWR4IHx8IGlnbm9yZUN1cnJSZWMgJiYgY29tcHV0ZSkge1xyXG4gICAgICBpZiAoIWlnbm9yZUN1cnJSZWMgJiYgZG9TdWZmaXggJiYgdGhpcy5DdXJyUmVjICE9IG51bGwpIHtcclxuICAgICAgICBsZXQgb2xkUmVjVGFiU2l6ZTogbnVtYmVyID0gdGhpcy5fcmVjb3Jkc1RhYi5nZXRTaXplKCk7XHJcblxyXG4gICAgICAgIG5leHRSZWMgPSB0aGlzLl9yZWNvcmRzVGFiLmdldFJlY0J5SWR4KG5ld0lkeCk7XHJcbiAgICAgICAgaWYgKG5leHRSZWMuaXNOZXdSZWMoKSkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuX3Rhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSAmJlxyXG4gICAgICAgICAgICAhYXdhaXQgdGhpcy5fdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfQ1JFQVRFLCB0cnVlKSlcclxuICAgICAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0U3RvcEV4ZWN1dGlvbih0cnVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkge1xyXG4gICAgICAgICAgbGV0IG9yZ1RvcFJlY0lkeDogbnVtYmVyID0gMDtcclxuICAgICAgICAgIGlmICh0aGlzLl90b3BSZWNJZHhNb2RpZmllZCkge1xyXG4gICAgICAgICAgICBvcmdUb3BSZWNJZHggPSB0aGlzLmdldFRvcFJlY0lkeCgpO1xyXG4gICAgICAgICAgICB0aGlzLnJlc3RvcmVUb3BSZWNJZHgoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFzayh0aGlzLl90YXNrLCBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCk7XHJcbiAgICAgICAgICBpZiAodGhpcy5fdG9wUmVjSWR4TW9kaWZpZWQpXHJcbiAgICAgICAgICAgIHRoaXMuc2V0VG9wUmVjSWR4KG9yZ1RvcFJlY0lkeCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICAgICAgdGhyb3cgbmV3IFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24oUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbl9FeGNlcHRpb25UeXBlLlJFQ19TVUZGSVhfRkFJTEVEKTtcclxuXHJcbiAgICAgICAgLy8gUUNSICMyMDQ2OiB3aGVuIHRoZSBuZXh0IHJlY29yZCBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgY3VycmVudCBvbmUgd2Ugc2hvdWxkXHJcbiAgICAgICAgLy8gYWxsb3cgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgcmVjb3JkIHByZWZpeCBieSBzZXR0aW5nIHRoZSBfdGFzayBsZXZlbCB0byBUQVNLLlxyXG4gICAgICAgIGlmIChuZXh0UmVjICE9PSB0aGlzLkN1cnJSZWMgJiYgdGhpcy5nZXRUYXNrKCkuZ2V0QWZ0ZXJSZXRyeSgpKVxyXG4gICAgICAgICAgdGhpcy5fdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9UQVNLKTtcclxuXHJcbiAgICAgICAgLy8gaWYgdGhlIHJlY29yZHMgdGFibGUgc2l6ZSB3YXMgZGVjcmVhc2VkIGR1cmluZyBoYW5kbGluZyB0aGVcclxuICAgICAgICAvLyByZWNvcmQgc3VmZml4IChlLmcuIGNhbmNlbCBlZGl0KSBhbmQgdGhlIHVzZXIgdHJpZXMgdG8gbW92ZSB0b1xyXG4gICAgICAgIC8vIGEgcmVjb3JkIHdpdGggYSBoaWdoZXIgaW5kZXggdGhlbiB3ZSBzaG91bGQgYWxzbyBkZWNyZWFzZSB0aGVcclxuICAgICAgICAvLyBuZXdJZHggdG8gcmVmbGVjdCB0aGUgY2hhbmdlXHJcbiAgICAgICAgaWYgKG9sZFJlY1RhYlNpemUgLSAxID09PSB0aGlzLl9yZWNvcmRzVGFiLmdldFNpemUoKSAmJiB0aGlzLl9jdXJyUmVjSWR4IDwgbmV3SWR4KVxyXG4gICAgICAgICAgbmV3SWR4LS07XHJcblxyXG4gICAgICAgIC8vIHRoZSBuZXcgY3VyciByZWMgbWF5IGJlIGFscmVhZHkgc2V0IGJ5IHRoZSBldmVudHMgY2hhaW4gdHJpZ2dlcmVkIGJ5IHRoZVxyXG4gICAgICAgIC8vIHJlY29yZCBzdWZmaXggYWJvdmUgLSBpbiB0aGF0IGNhc2UgdGhlcmUgaXMgbm8gbmVlZCB0byBjb250aW51ZVxyXG4gICAgICAgIGlmIChuZXdJZHggPT09IHRoaXMuX2N1cnJSZWNJZHgpIHtcclxuXHJcbiAgICAgICAgICAvLyBRQ1IgOTE4OTgzIGNoYW5nZXMgdG8gdGhlIF90YXNrIG1vZGUgbXVzdCBiZSBkb25lIGJlZm9yZSByZWNvbXB1dGVcclxuICAgICAgICAgIGlmICh0aGlzLl90YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUgJiYgIXRoaXMuQ3VyclJlYy5pc05ld1JlYygpICYmXHJcbiAgICAgICAgICAgICF0aGlzLl90YXNrLmdldEZvcm0oKS5pblJlZnJlc2hEaXNwbGF5KCkpXHJcbiAgICAgICAgICAgIHRoaXMuX3Rhc2suc2V0TW9kZShDb25zdGFudHMuVEFTS19NT0RFX01PRElGWSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuQ3VyclJlYyA9IHRoaXMuX3JlY29yZHNUYWIuZ2V0UmVjQnlJZHgobmV3SWR4KTtcclxuXHJcbiAgICAgIGlmICh0aGlzLkN1cnJSZWMgPT0gbnVsbClcclxuICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oJ2luIERhdGFWaWV3LnNldEN1cnJSZWNCeUlkeCgpIGN1cnJlbnQgcmVjb3JkIG5vdCBmb3VuZCEnKTtcclxuXHJcbiAgICAgIHRoaXMuX2N1cnJSZWNJZCA9IHRoaXMuQ3VyclJlYy5nZXRJZCgpO1xyXG4gICAgICB0aGlzLl9jdXJyUmVjSWR4ID0gbmV3SWR4O1xyXG5cclxuICAgICAgaWYgKHRoaXMuX3Rhc2suZ2V0Rm9ybSgpICE9IG51bGwpIHtcclxuXHJcbiAgICAgICAgLy8gUUNSICMxMDc5MjYsIHdlIG11c3QgdXBkYXRlIGRpc3BsYXkgbGluZSBoZXJlLCBzaW5jZSBjdXJyUmVjQ29tcHV0ZSB3aGljaCBpcyBhY3RpdmF0ZWQgbGF0ZXJcclxuICAgICAgICAvLyBtYXkgZ28gdG8gc2VydmVyIGFuZCBjYXVzZSByZWZyZXNoIGRpc3BsYXkuXHJcbiAgICAgICAgLy8gSW4gY2FzZSBvZiBhZGRpbmcgbmV3IG5vZGUgdG8gdGhlIHRyZWUsIHRoZSBub2RlIG11c3QgYmUgYWN0dWFsbHkgYWRkZWQgdG8gdGhlIHRyZWUuXHJcbiAgICAgICAgaWYgKG5ld0Rpc3BsYXlMaW5lID09PSBTRVRfRElTUExBWUxJTkVfQllfRFYpIHtcclxuICAgICAgICAgICg8TWdGb3JtPih0aGlzLl90YXNrLmdldEZvcm0oKSkpLnVwZGF0ZURpc3BsYXlMaW5lQnlEVigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0aGlzLl90YXNrLmdldEZvcm0oKS5EaXNwbGF5TGluZSA9IG5ld0Rpc3BsYXlMaW5lO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIFFDUiA5MTg5ODMgY2hhbmdlcyB0byB0aGUgX3Rhc2sgbW9kZSBtdXN0IGJlIGRvbmUgYmVmb3JlIHJlY29tcHV0ZVxyXG4gICAgICBpZiAodGhpcy5fdGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFICYmICF0aGlzLkN1cnJSZWMuaXNOZXdSZWMoKSAmJlxyXG4gICAgICAgICF0aGlzLl90YXNrLmdldEZvcm0oKS5pblJlZnJlc2hEaXNwbGF5KCkpXHJcbiAgICAgICAgdGhpcy5fdGFzay5zZXRNb2RlKENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZKTtcclxuXHJcbiAgICAgIGlmIChjb21wdXRlKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuY3VyclJlY0NvbXB1dGUoZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlY29tcHV0ZSBBTEwgdGhlIGluaXQgZXhwcmVzc2lvbnMgb2YgdGhlIGN1cnJlbnQgcmVjb3JkIC0gY2FsbCB0aGlzIG1ldGhvZCB3aGVuXHJcbiAgLy8vICAgZW50ZXJpbmcgYSByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZm9yY2VDbGllbnRDb21wdXRlXCI+aWYgVFJVRSBmb3JjZXMgdGhlIGNsaWVudCB0byBjb21wdXRlIHRoZSByZWNvcmQgZXZlbiBpZiBpdCBpcyBmbGFnZ2VkXHJcbiAgLy8vICAgYXMgXCJzZXJ2ZXIgY29tcHV0ZWRcIi5cclxuICAvLy8gPC9wYXJhbT5cclxuICBhc3luYyBjdXJyUmVjQ29tcHV0ZShmb3JjZUNsaWVudENvbXB1dGU6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICg8RmllbGRzVGFibGU+dGhpcy5fZmllbGRzVGFiKS5pbnZhbGlkYXRlKGZhbHNlLCB0cnVlKTtcclxuICAgIGF3YWl0IHRoaXMuY29tcHV0ZShmYWxzZSwgZm9yY2VDbGllbnRDb21wdXRlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzYXZlcyBhIHJlcGxpY2F0aW9uIG9mIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2F2ZU9yaWdpbmFsKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLkN1cnJSZWMuTW9kaWZpZWQpXHJcbiAgICAgIHRoaXMuX29yaWdpbmFsID0gdGhpcy5DdXJyUmVjLnJlcGxpY2F0ZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGZldGNoIGEgY2h1bmsgb2YgcmVjb3JkcyBmcm9tIHRoZSBzZXJ2ZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG5cclxuICBwdWJsaWMgYXN5bmMgZmV0Y2hDaHVua0Zyb21TZXJ2ZXIoY2h1bmtJZDogc3RyaW5nLCBkb1N1ZmZpeDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgIC8vIFFDUiAjNDMwMTM0OiBpZiB0aGUgc2VydmVyIHNlbnQgdXMgcmVjb3JkcyBmZXdlciB0aGFuIHRoZSBudW1iZXIgdGhhdCBmaXRzIGludG8gYSB0YWJsZVxyXG4gICAgLy8gdGhlbiB3ZSBnbyBiYWNrIHRvIHRoZSBzZXJ2ZXIgYW5kIG11c3QgcmVmcmVzaCB0aGUgc2NyZWVuLlxyXG4gICAgKDxNZ0Zvcm0+dGhpcy5fdGFzay5nZXRGb3JtKCkpLkZvcm1SZWZyZXNoZWQgPSB0cnVlO1xyXG5cclxuICAgIGlmIChkb1N1ZmZpeCAmJiB0aGlzLkN1cnJSZWMgIT0gbnVsbCkge1xyXG4gICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVJbnRlcm5hbEV2ZW50V2l0aFRhc2sodGhpcy5fdGFzaywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19TVUZGSVgpO1xyXG4gICAgICBpZiAoQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSB8fCB0aGlzLl90YXNrLmlzQWJvcnRpbmcoKSlcclxuICAgICAgICB0aHJvdyBuZXcgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbihSZWNvcmRPdXRPZkRhdGFWaWV3RXhjZXB0aW9uX0V4Y2VwdGlvblR5cGUuUkVDX1NVRkZJWF9GQUlMRUQpO1xyXG4gICAgICAoPE1nRm9ybT50aGlzLl90YXNrLmdldEZvcm0oKSkuc2V0U3VmZml4RG9uZSgpOyAvLyBRQ1IgNzU4NjM5XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGV2ZW50Q29kZTogbnVtYmVyO1xyXG4gICAgbGV0IGNsaWVudFJlY0lkOiBudW1iZXIgPSB0aGlzLl9jdXJyUmVjSWQ7XHJcbiAgICBzd2l0Y2ggKGNodW5rSWQpIHtcclxuICAgICAgY2FzZSBDSFVOS19EVl9UT1A6XHJcbiAgICAgICAgZXZlbnRDb2RlID0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0RBVEFWSUVXX1RPUDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDSFVOS19EVl9CT1RUT006XHJcbiAgICAgICAgZXZlbnRDb2RlID0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0RBVEFWSUVXX0JPVFRPTTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDSFVOS19DQUNIRV9QUkVWOlxyXG4gICAgICAgIGNsaWVudFJlY0lkID0gdGhpcy5GaXJzdFJlY29yZCA9PSBudWxsID8gMCA6IHRoaXMuRmlyc3RSZWNvcmQuZ2V0SWQoKTtcclxuICAgICAgICBldmVudENvZGUgPSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0FDSEVfUFJFVjtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDSFVOS19DQUNIRV9ORVhUOlxyXG4gICAgICAgIGV2ZW50Q29kZSA9IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DQUNIRV9ORVhUO1xyXG4gICAgICAgIGNsaWVudFJlY0lkID0gdGhpcy5MYXN0UmVjb3JkID09IG51bGwgPyAwIDogdGhpcy5MYXN0UmVjb3JkLmdldElkKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKCdpbiBEYXRhVmlldy5mZXRjaENodW5rRnJvbVNlcnZlcigpIHVua25vd24gY2h1bmsgaWQ6ICcgKyBjaHVua0lkKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBsZXQgY21kOiBFdmVudENvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVFdmVudENvbW1hbmQodGhpcy5fdGFzay5nZXRUYXNrVGFnKCksIGV2ZW50Q29kZSk7XHJcbiAgICBjbWQuQ2xpZW50UmVjSWQgPSBjbGllbnRSZWNJZDtcclxuICAgIGF3YWl0IHRoaXMuZ2V0VGFzaygpLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGNtZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgRmV0Y2hlcyB0aGUgY2h1bmsgZnJvbSBzZXJ2ZXIsXHJcbiAgLy8vICAgSWYgdGhlIGxhc3QgcmVjb3JkcyBpcyBub3QgeWV0IGZldGNoZWQgaXQgZmV0Y2hlcyB0aGUgbmV4dCBjaHVuayxcclxuICAvLy8gICBFbHNlLCBmZXRjaGVzIHRoZSBwcmV2aW91cyBjaHVua1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXN5bmMgRmV0Y2hSZWNvcmRzQWhlYWRGcm9tU2VydmVyKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCF0aGlzLl9pbmNsdWRlc0xhc3QpXHJcbiAgICAgIGF3YWl0IHRoaXMuZmV0Y2hDaHVua0Zyb21TZXJ2ZXIoQ0hVTktfQ0FDSEVfTkVYVCwgZmFsc2UpO1xyXG4gICAgZWxzZSBpZiAoIXRoaXMuX2luY2x1ZGVzRmlyc3QpXHJcbiAgICAgIGF3YWl0IHRoaXMuZmV0Y2hDaHVua0Zyb21TZXJ2ZXIoQ0hVTktfQ0FDSEVfUFJFViwgZmFsc2UpO1xyXG4gIH1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgYSByZWNvcmQgd2l0aCB0aGUgZ2l2ZW4gaW5kZXggZXhpc3RcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVjSWR4XCI+aW5kZXggdG8gY2hlY2sgPC9wYXJhbT5cclxuICByZWNFeGlzdHMocmVjSWR4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCBsYXN0UmVjSWR4OiBudW1iZXIgPSB0aGlzLl9yZWNvcmRzVGFiLmdldFNpemUoKSAtIDE7XHJcbiAgICByZXR1cm4gcmVjSWR4ID49IDAgJiYgcmVjSWR4IDw9IGxhc3RSZWNJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2tzIGlmIHRoZSBpZiB0aGUgY3VycmVudCBmaXJzdCByZWNvcmQgZXhpc3RcclxuICAvLy8gICBpbiBjYXNlIHRoZXJlIGlzIG5vIGxvY2F0ZSBjaGVjayBpbmNsdWRlIGZpcnN0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBjaGVja0ZpcnN0KGxvY2F0ZUZpcnN0OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9yZWNvcmRzVGFiLmdldFJlY29yZChsb2NhdGVGaXJzdCkgIT09IG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBjdXJyZW50IHJlY29yZCBpbmRleFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgcmVjb3JkIGluZGV4IDwvcmV0dXJucz5cclxuICBnZXRDdXJyUmVjSWR4KCk6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy5fY3VyclJlY0lkeCA9PT0gSW50MzIuTWluVmFsdWUpIHtcclxuICAgICAgaWYgKCF0aGlzLnNldEN1cnJSZWModGhpcy5fY3VyclJlY0lkLCB0cnVlKSkge1xyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVdhcm5pbmdUb0xvZ1dpdGhNc2coJ0RhdGFWaWV3LmdldEN1cnJSZWNJZHgoKTogX3Rhc2sgJyArXHJcbiAgICAgICAgICAodGhpcy5nZXRUYXNrKCkpLlByZXZpb3VzbHlBY3RpdmVUYXNrSWQgK1xyXG4gICAgICAgICAgJywgcmVjb3JkICcgKyB0aGlzLl9jdXJyUmVjSWQgKyAnIG5vdCBmb3VuZCcpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fY3VyclJlY0lkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gcmV0dXJuIHRoZSBkYnZpZXdyb3dpZCBmb3IgdGhlIGN1cnJlbnQgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRDdXJyREJWaWV3Um93SWR4KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5DdXJyUmVjLmdldERCVmlld1Jvd0lkeCgpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHRvcCByZWNvcmQgaW5kZXggYW5kIHNhdmVzIHRoZSBvbGQgdmFsdWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmV3VG9wUmVjSWR4XCI+dGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHRvcCByZWNvcmQgaW5kZXggPC9wYXJhbT5cclxuICBzZXRUb3BSZWNJZHgobmV3VG9wUmVjSWR4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX29sZFRvcFJlY0lkeCA9IHRoaXMuZ2V0VG9wUmVjSWR4KCk7XHJcbiAgICB0aGlzLl90b3BSZWNJZHggPSBuZXdUb3BSZWNJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSB0b3AgcmVjb3JkIGluZGV4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRUb3BSZWNJZHgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl90b3BSZWNJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSB0b3AgcmVjb3JkIGluZGV4IG1vZGlmaWVkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbFwiPnRoZSBuZXcgdmFsdWUgZm9yIHRvcFJlY0lkeE1vZGlmaWVkIDwvcGFyYW0+XHJcbiAgc2V0VG9wUmVjSWR4TW9kaWZpZWQodmFsOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLl90b3BSZWNJZHhNb2RpZmllZCA9IHZhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGNodW5rIHNpemUgaW5kZXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldENodW5rU2l6ZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NodW5rU2l6ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXN0b3JlIHRoZSBvbGQgc2F2ZWQgdmFsdWUgb2YgdGhlIHRvcCByZWNvcmQgaW5kZXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJlc3RvcmVUb3BSZWNJZHgoKTogdm9pZCB7XHJcbiAgICB0aGlzLl90b3BSZWNJZHggPSB0aGlzLl9vbGRUb3BSZWNJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVtb3ZlcyBhbGwgdGhlIHJlY29yZHMgZnJvbSB0aGUgRGF0YXZpZXdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNsZWFyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fcmVjb3Jkc1RhYi5yZW1vdmVBbGwoKTtcclxuICAgIHRoaXMuX29yaWdpbmFsID0gbnVsbDtcclxuICAgIGxldCBtZ0Zvcm06IE1nRm9ybSA9IDxNZ0Zvcm0+dGhpcy5fdGFzay5nZXRGb3JtKCk7XHJcbiAgICBpZiAobWdGb3JtICE9PSBudWxsKSB7XHJcbiAgICAgICB0aGlzLl90YXNrLmdldEZvcm0oKS5TZXRUYWJsZUl0ZW1zQ291bnQoMCwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9tb2RpZmllZFJlY29yZHNUYWIucmVtb3ZlQWxsKCk7XHJcbiAgICB0aGlzLmluaXQoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpbml0aWFsaXplIHRoZSBjbGFzcyBtZW1iZXJzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jdXJyUmVjSWQgPSBJbnQzMi5NaW5WYWx1ZTtcclxuICAgIHRoaXMuX2N1cnJSZWNJZHggPSBJbnQzMi5NaW5WYWx1ZTtcclxuICAgIHRoaXMuQ3VyclJlYyA9IG51bGw7XHJcbiAgICB0aGlzLl9wcmV2Q3VyclJlYyA9IG51bGw7XHJcbiAgICB0aGlzLl9pbmNsdWRlc0ZpcnN0ID0gZmFsc2U7XHJcbiAgICB0aGlzLl9pbmNsdWRlc0xhc3QgPSBmYWxzZTtcclxuICAgIHRoaXMuSXNPbmVXYXlLZXkgPSBmYWxzZTtcclxuICAgIHRoaXMuc2V0VG9wUmVjSWR4KEludDMyLk1pblZhbHVlKTtcclxuICAgICg8RmllbGRzVGFibGU+dGhpcy5fZmllbGRzVGFiKS5pbnZhbGlkYXRlKGZhbHNlLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWZyZXNoZXMgdGhlIHN1YkZvcm1zXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAgYXN5bmMgY29tcHV0ZVN1YkZvcm1zKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgIC8vIHdlIGRvIG5vdCBuZWVkIHRvIGdvIHRvIHRoZSBzZXJ2ZXIgZHVlIHRvIHVwZGF0ZXNcclxuICAgICBpZiAoYXdhaXQgdGhpcy5nZXRUYXNrKCkucHJlcGFyZUNhY2hlKHRydWUpKSB7XHJcblxyXG4gICAgICAgLy8gb25lIG9mIHRoZSBuZWVkZWQgZC52IHdhcyBub3QgZm91bmQgaW4gdGhlIGNhY2hlXHJcbiAgICAgICBpZiAoIWF3YWl0IHRoaXMuZ2V0VGFzaygpLnRlc3RBbmRTZXQodHJ1ZSkpXHJcbiAgICAgICAgIGF3YWl0IHRoaXMuY29tcHV0ZSh0cnVlLCBmYWxzZSk7XHJcbiAgICAgfVxyXG4gICAgIGVsc2VcclxuICAgICAgIGF3YWl0IHRoaXMuY29tcHV0ZSh0cnVlLCBmYWxzZSk7XHJcbiAgIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNvbXB1dGUgdGhlIHZhbHVlcyBvZiB0aGUgZmllbGRzIHdpdGhvdXQgdXBkYXRpbmcgdGhlIGRpc3BsYXlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3ViRm9ybXNcIj5pZiB0cnVlIHRoZSBhIHN1YkZvcm1zIGNvbXB1dGUgaXMgdG8gYmUgZG9uZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJmb3JjZUNsaWVudENvbXB1dGVcIj5pZiBUUlVFIGZvcmNlcyB0aGUgY2xpZW50IHRvIGNvbXB1dGUgdGhlIHJlY29yZCBldmVuIGlmIGl0IGlzIGZsYWdnZWRcclxuICAvLy8gICBhcyBcInNlcnZlciBjb21wdXRlZFwiLlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgY29tcHV0ZShzdWJGb3JtczogYm9vbGVhbiwgZm9yY2VDbGllbnRDb21wdXRlOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgdG1wUmVjOiBSZWNvcmQgPSBudWxsO1xyXG4gICAgbGV0IGNvbXB1dGVCeVNlcnZlcjogYm9vbGVhbiA9ICF0aGlzLmNvbXB1dGVCeUNsaWVudCgpO1xyXG4gICAgbGV0IG9yZ0NvbXB1dGVCeTogc3RyaW5nID0gdGhpcy5fY29tcHV0ZUJ5O1xyXG4gICAgLyonQycqL1xyXG4gICAgaWYgKGZvcmNlQ2xpZW50Q29tcHV0ZSlcclxuICAgICAgdGhpcy5fY29tcHV0ZUJ5ID0gQ09NUFVURV9ORVdSRUNfT05fQ0xJRU5ULyonQycqLztcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLkN1cnJSZWMuc2V0SW5Db21wdXRlKHRydWUpO1xyXG5cclxuICAgICAgaWYgKCFzdWJGb3Jtcykge1xyXG4gICAgICAgIGlmICh0aGlzLkN1cnJSZWMuaXNOZXdSZWMoKSkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuX3Rhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSAvKidDJyovICYmICFzdXBlci5pc0VtcHR5RGF0YXZpZXcoKSkge1xyXG4gICAgICAgICAgICB0aGlzLl90YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpLyonQycqLztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5fdGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcbiAgICAgICAgICB0aGlzLl90YXNrLnNldE1vZGUoQ29uc3RhbnRzLlRBU0tfTU9ERV9NT0RJRlkpLyonTScqLztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBnZXRSZWNvcmREYXRhOiBib29sZWFuID0gY29tcHV0ZUJ5U2VydmVyO1xyXG4gICAgICAvLyBmb3IgbmV3bHkgY3JlYXRlZCByZWNvcmRzIC0gZ28gdG8gdGhlIHNlcnZlciAoaWYgdGhleSB3ZXJlIG5vdCBjb21wdXRlZCBhbHJlYWR5KVxyXG4gICAgICBpZiAoc3ViRm9ybXMgfHwgKGdldFJlY29yZERhdGEgJiYgIXRoaXMuQ3VyclJlYy5pc0NvbXB1dGVkKCkgJiYgIWZvcmNlQ2xpZW50Q29tcHV0ZSkpIHtcclxuICAgICAgICBsZXQgY29tbWFuZDogSUNsaWVudENvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVDb21wdXRlRXZlbnRDb21tYW5kKHRoaXMuX3Rhc2suZ2V0VGFza1RhZygpLCBzdWJGb3JtcywgdGhpcy5fY3VyclJlY0lkKTtcclxuICAgICAgICBhd2FpdCAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLkRhdGF2aWV3TWFuYWdlci5FeGVjdXRlKGNvbW1hbmQpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIFFDUiAjOTIxNDc1IC0gcmVsaW5rIGR1cmluZyBjb21wdXRlIGRlc3Ryb3lzIHZhbHVlcyBvZiB2aXJ0dWFsIGZpZWxkcyB3aXRoIG5vIGluaXQgZXhwLlxyXG4gICAgICAgIC8vIHRodXMgd2Ugc2F2ZSB0aGVtIGJlZm9yZSB0aGUgY29tcHV0ZSBhbmQgcmVzdG9yZSB0aGVtIGR1cmluZyB0aGUgbG9vcC5cclxuICAgICAgICBpZiAoZ2V0UmVjb3JkRGF0YSkge1xyXG4gICAgICAgICAgdG1wUmVjID0gbmV3IFJlY29yZCh0aGlzLkN1cnJSZWMuZ2V0SWQoKSwgdGhpcyk7XHJcbiAgICAgICAgICB0bXBSZWMuSW5pdGlhbGl6ZSgpO1xyXG4gICAgICAgICAgdG1wUmVjLnNldEluaXRpYWxGbGRWYWxzKHRydWUsIHRydWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgKDxGaWVsZHNUYWJsZT50aGlzLl9maWVsZHNUYWIpLnNldFNlcnZlclJjbXAoZmFsc2UpO1xyXG4gICAgICAgIGxldCBmcm9tOiBudW1iZXIgPSAoPEZpZWxkc1RhYmxlPnRoaXMuX2ZpZWxkc1RhYikuZ2V0Uk1JZHgoKTtcclxuICAgICAgICBsZXQgc2l6ZTogbnVtYmVyID0gKDxGaWVsZHNUYWJsZT50aGlzLl9maWVsZHNUYWIpLmdldFJNU2l6ZSgpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSBmcm9tOyBpIDwgZnJvbSArIHNpemU7IGkgPSBpICsgMSkge1xyXG4gICAgICAgICAgbGV0IGZsZDogRmllbGQgPSA8RmllbGQ+dGhpcy5fZmllbGRzVGFiLmdldEZpZWxkKGkpO1xyXG4gICAgICAgICAgaWYgKGdldFJlY29yZERhdGEgJiYgKDxGaWVsZHNUYWJsZT50aGlzLl9maWVsZHNUYWIpLnNlcnZlclJjbXBEb25lKCkgJiYgZmxkLklzVmlydHVhbCAmJiAhZmxkLlZpckFzUmVhbCAmJiAhZmxkLmhhc0luaXRFeHAoKSkge1xyXG4gICAgICAgICAgICBsZXQgY3VyclJlYzI6IFJlY29yZCA9IHRoaXMuQ3VyclJlYztcclxuICAgICAgICAgICAgdGhpcy5DdXJyUmVjID0gdG1wUmVjO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIGZsZC50YWtlVmFsRnJvbVJlYygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZpbmFsbHkge1xyXG4gICAgICAgICAgICAgIHRoaXMuQ3VyclJlYyA9IGN1cnJSZWMyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy9UT0RPOiBDaGVjayBpZiB3ZSBjYW4gdXNlIGFub3RoZXIgKG1heWJlLCBuZXcpIGZ1bmN0aW9uIHRvIGdldCB0aGUgZGF0YSB3aGlsZSB0cmFuc2ZlcnJpbmcgdGhlbSB0byBVSSBpbnN0ZWFkIG9mIGNvbXB1dGUoKS5cclxuICAgICAgICAgIGlmICghKDxNZ0Zvcm0+dGhpcy5fdGFzay5nZXRGb3JtKCkpLlRyYW5zZmVycmluZ0RhdGFUb0dVSSlcclxuICAgICAgICAgICAgYXdhaXQgZmxkLmNvbXB1dGUoZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgIHRoaXMuQ3VyclJlYy5zZXRJbkNvbXB1dGUoZmFsc2UpO1xyXG4gICAgICB0aGlzLkN1cnJSZWMuc2V0TGF0ZUNvbXB1dGUoZmFsc2UpO1xyXG4gICAgICB0aGlzLl9jb21wdXRlQnkgPSBvcmdDb21wdXRlQnk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBhZGRSZWNvcmQoZG9TdWZmaXg6IGJvb2xlYW4sIGlnbm9yZUN1cnJSZWM6IGJvb2xlYW4sIGlzQ3JlbGluZUFib3ZlOiBib29sZWFuKTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgIGxldCBuZXdDdXJyUmVjSWQ6IG51bWJlciA9ICgtLXRoaXMuX2xhc3RDcmVhdGVkUmVjSWQpO1xyXG4gICAgbGV0IG1vZGU6IERhdGFNb2RpZmljYXRpb25UeXBlcyA9IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQ7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5hZGRSZWNvcmRfMShkb1N1ZmZpeCwgaWdub3JlQ3VyclJlYywgZmFsc2UsIG5ld0N1cnJSZWNJZCwgbW9kZSwgaXNDcmVsaW5lQWJvdmUpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZG9TdWZmaXhcIj5pZiB0cnVlIHRoZW4gZG8gdGhlIHN1ZmZpeCBvZiB0aGUgcHJldmlvdXMgcmVjb3JkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpZ25vcmVDdXJyUmVjXCI+aWYgdHJ1ZSB0aGVuIGRvIHRoZSBzdWZmaXggb2YgdGhlIHByZXZpb3VzIHJlY29yZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNGaXJzdFJlY29yZFwiPiBpcyBmaXJzdCByZWNvcmQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm5ld0N1cnJSZWNJZFwiPiBuZXcgcmVjb3JkIGlkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtb2RlXCI+IG9wZXJhdGlvbiBtb2RlPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+dGhlIG5ldyByZWMgaW5kZXg8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBhZGRSZWNvcmRfMShkb1N1ZmZpeDogYm9vbGVhbiwgaWdub3JlQ3VyclJlYzogYm9vbGVhbiwgaXNGaXJzdFJlY29yZDogYm9vbGVhbiwgbmV3Q3VyclJlY0lkOiBudW1iZXIsIG1vZGU6IERhdGFNb2RpZmljYXRpb25UeXBlcywgaXNDcmVsaW5lQWJvdmU6IGJvb2xlYW4pOiBQcm9taXNlPG51bWJlcj4ge1xyXG5cclxuICAgIC8vIGdpdmUgdGhlIG5ldyByZWNvcmQgYSBuZWdhdGl2ZSBpZFxyXG4gICAgbGV0IHJlYzogUmVjb3JkID0gbmV3IFJlY29yZChuZXdDdXJyUmVjSWQsIHRoaXMpO1xyXG4gICAgcmVjLkluaXRpYWxpemUoKTtcclxuICAgIHJlYy5zZXRJbml0aWFsRmxkVmFscyhmYWxzZSwgIWlzRmlyc3RSZWNvcmQpO1xyXG5cclxuICAgIGxldCBuZXdDdXJyUmVjSWR4OiBudW1iZXIgPSAwO1xyXG4gICAgaWYgKGlzQ3JlbGluZUFib3ZlKVxyXG4gICAge1xyXG4gICAgICBuZXdDdXJyUmVjSWR4ID0gKHRoaXMuX2N1cnJSZWNJZHggPj0gMFxyXG4gICAgICAgID8gdGhpcy5fY3VyclJlY0lkeFxyXG4gICAgICAgIDogMCk7XHJcblxyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICBuZXdDdXJyUmVjSWR4ID0gKHRoaXMuX2N1cnJSZWNJZHggIT0gSW50MzIuTWluVmFsdWVcclxuICAgICAgICA/IHRoaXMuX2N1cnJSZWNJZHggKyAxXHJcbiAgICAgICAgOiAwKTtcclxuXHJcblxyXG4gICAgLy9sZXQgbmV3Q3VyclJlY0lkeDogbnVtYmVyID0gKHRoaXMuX2N1cnJSZWNJZHggIT09IEludDMyLk1pblZhbHVlKSA/XHJcbiAgICAgIC8vKHRoaXMuX2N1cnJSZWNJZHggKyAxKVxyXG4gICAgICAvLzogMDtcclxuXHJcbiAgICB0aGlzLl9yZWNvcmRzVGFiLmluc2VydFJlY29yZChyZWMsIG5ld0N1cnJSZWNJZHgpO1xyXG4gICAgcmVjLnNldE1vZGUobW9kZSk7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IGNvbXB1dGU6IGJvb2xlYW4gPSAhaXNGaXJzdFJlY29yZDtcclxuICAgICAgYXdhaXQgdGhpcy5zZXRDdXJyUmVjQnlJZHgobmV3Q3VyclJlY0lkeCwgZG9TdWZmaXgsIGlnbm9yZUN1cnJSZWMsIGNvbXB1dGUsIEludDMyLk1pblZhbHVlKTtcclxuXHJcbiAgICAgIC8vIHdoaWxlIHdlIGluIGNyZWF0ZSBtb2RlIGRvbid0IHNldCByZXNldCB0byBfbmV3UmVjXHJcbiAgICAgIGlmIChpc0ZpcnN0UmVjb3JkICYmIHRoaXMuZ2V0VGFzaygpLmdldE1vZGUoKSAhPT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpXHJcbiAgICAgICAgcmVjLnNldE9sZFJlYygpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGV4ZWNwdGlvbikge1xyXG4gICAgICBpZiAoZXhlY3B0aW9uIGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgIGlmIChBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKVxyXG4gICAgICAgICAgbmV3Q3VyclJlY0lkeCA9IC0xO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbignaW4gRGF0YVZpZXcuYWRkUmVjb3JkKCkgaW52YWxpZCBleGNlcHRpb24nKTtcclxuXHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRocm93IGV4ZWNwdGlvbjtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXdDdXJyUmVjSWR4O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlbW92ZSB0aGUgY3VycmVudCByZWNvcmQgZnJvbSB0aGUgZGF0YXZpZXdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIHJlbW92ZUN1cnJSZWMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgbWdGb3JtOiBNZ0Zvcm0gPSA8TWdGb3JtPnRoaXMuX3Rhc2suZ2V0Rm9ybSgpO1xyXG4gICAgbGV0IG9uRGVsZXRlOiBib29sZWFuOyAvLyB0cnVlIGlmIHdlIGFyZSByZW1vdmluZyB0aGUgcmVjb3JkIGR1ZSB0byBkZWxldGUuIGZhbHNlIGlmIGR1ZSB0byBjYW5jZWwgb24gaW5zZXJ0XHJcblxyXG4gICAgaWYgKHRoaXMuQ3VyclJlYy5nZXRNb2RlKCkgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQgJiZcclxuICAgICAgIXRoaXMuZ2V0VGFzaygpLnRyYW5zYWN0aW9uRmFpbGVkKENvbnN0SW50ZXJmYWNlLlRSQU5TX1JFQ09SRF9QUkVGSVgpKSB7XHJcbiAgICAgIC8vIHRoZSByZWNvcmQgd2FzIGNyZWF0ZWQgYnkgdGhlIGNsaWVudCBzbyBpdCBoYXMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZVxyXG4gICAgICAvLyBtb2RpZmllZCByZWNvcmRzIHRhYmxlIChpZiBpdCBpcyBhbHJlYWR5IHRoZXJlKSBiZWNhdXNlIHRoZSBzZXJ2ZXJcclxuICAgICAgLy8gZG9lc24ndCBoYXZlIHRvIGtub3cgYW55dGhpbmcgYWJvdXQgaXRcclxuICAgICAgdGhpcy5fbW9kaWZpZWRSZWNvcmRzVGFiLnJlbW92ZVJlY29yZCh0aGlzLkN1cnJSZWMpO1xyXG4gICAgICBvbkRlbGV0ZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIC8vIG1vdmUgdGhlIGN1cnJlbnQgcmVjb3JkIGZyb20gdGhlIHJlY29yZHMgdGFibGUgdG8gdGhlIG1vZGlmaWVkIHRhYmxlXHJcbiAgICAgIHRoaXMuQ3VyclJlYy5jbGVhck1vZGUoKTtcclxuICAgICAgdGhpcy5DdXJyUmVjLnNldE1vZGUoRGF0YU1vZGlmaWNhdGlvblR5cGVzLkRlbGV0ZSk7XHJcbiAgICAgIG9uRGVsZXRlID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHRoaXMuQ3VyclJlYy5yZW1vdmVSZWNGcm9tRGMoKTtcclxuICAgIHRoaXMuX3JlY29yZHNUYWIucmVtb3ZlUmVjb3JkKHRoaXMuX2N1cnJSZWNJZHgpO1xyXG4gICAgdGhpcy5zZXRDaGFuZ2VkKHRydWUpO1xyXG5cclxuICAgIGlmICh0aGlzLmlzRW1wdHkoKSAmJiAhKDxUYXNrQmFzZT50aGlzLl90YXNrKS5Jc1RyeWluZ1RvU3RvcCkge1xyXG4gICAgICBhd2FpdCB0aGlzLk1vdmVUb0VtcHR5RGF0YXZpZXdJZkFsbG93ZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbmV3RGlzcGxheUxpbmU6IG51bWJlciA9IHRoaXMuY2FsY0xpbmVUb01vdmUob25EZWxldGUpO1xyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKG1nRm9ybS5pc1NjcmVlbk1vZGUoKSkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0Q3VyclJlY0J5SWR4KG5ld0Rpc3BsYXlMaW5lLCBmYWxzZSwgZmFsc2UsIHRydWUsIFNFVF9ESVNQTEFZTElORV9CWV9EVik7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgYXdhaXQgbWdGb3JtLnNldEN1cnJSb3dCeURpc3BsYXlMaW5lKG5ld0Rpc3BsYXlMaW5lLCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNhdGNoIChleGNlcHRpb24pIHtcclxuICAgICAgaWYgKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuICAgICAgICAvLyBpZiB0aGUgY3VycmVudCBpbmRleCBpcyBiZXlvbmQgdGhlIGJvdHRvbSBlbmQgb2YgdGhlIGRhdGF2aWV3XHJcbiAgICAgICAgLy8gdHJ5IHRvIHNldCBpdCB0byB0aGUgcHJlY2VkaW5nIHJlY29yZFxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBpZiAoIXN1cGVyLmlzRW1wdHlEYXRhdmlldygpKVxyXG4gICAgICAgICAgICBuZXdEaXNwbGF5TGluZSA9IG1nRm9ybS5nZXRQcmV2TGluZShuZXdEaXNwbGF5TGluZSk7XHJcbiAgICAgICAgICBpZiAobWdGb3JtLmlzU2NyZWVuTW9kZSgpKVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSZWNCeUlkeChuZXdEaXNwbGF5TGluZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBTRVRfRElTUExBWUxJTkVfQllfRFYpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBhd2FpdCBtZ0Zvcm0uc2V0Q3VyclJvd0J5RGlzcGxheUxpbmUobmV3RGlzcGxheUxpbmUsIGZhbHNlLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGV4Y2VwdGlvbikge1xyXG4gICAgICAgICAgaWYgKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIFJlY29yZE91dE9mRGF0YVZpZXdFeGNlcHRpb24pIHtcclxuXHJcbiAgICAgICAgICAgIC8vIG5vIG1vcmUgcmVjb3JkcyBpbiB0aGUgZGF0YXZpZXdcclxuICAgICAgICAgICAgLy8gb3Igbm8gbm9kZXMgaW4gdGhlIHRyZWVcclxuICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aHJvdyBleGNlcHRpb247XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aHJvdyBleGNlcHRpb247XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJlbW92ZSByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlY29yZFwiPjwvcGFyYW0+XHJcbiAgUmVtb3ZlUmVjb3JkKHJlY29yZDogUmVjb3JkKTogdm9pZCB7XHJcbiAgICBsZXQgcmVjSWR4OiBudW1iZXIgPSB0aGlzLl9yZWNvcmRzVGFiLmdldFJlY0lkeChyZWNvcmQuZ2V0SWQoKSk7XHJcblxyXG4gICAgaWYgKHRoaXMuX3RvcFJlY0lkeCA+IHJlY0lkeClcclxuICAgICAgdGhpcy5fdG9wUmVjSWR4LS07XHJcbiAgICBpZiAodGhpcy5fb2xkVG9wUmVjSWR4ID4gcmVjSWR4KVxyXG4gICAgICB0aGlzLl9vbGRUb3BSZWNJZHgtLTtcclxuICAgIGlmICh0aGlzLl9jdXJyUmVjSWR4ID4gcmVjSWR4KVxyXG4gICAgICB0aGlzLl9jdXJyUmVjSWR4LS07XHJcbiAgICB0aGlzLl9yZWNvcmRzVGFiLnJlbW92ZVJlY29yZChyZWNvcmQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBtb3ZlIHRvIGVtcHR5IGRhdGF2aWV3IGlmIGFsbG93ZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIE1vdmVUb0VtcHR5RGF0YXZpZXdJZkFsbG93ZWQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXN1cGVyLmlzRW1wdHlEYXRhdmlldygpICYmIHRoaXMuX3Rhc2suZ2V0TW9kZSgpICE9PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSkge1xyXG4gICAgICBpZiAoYXdhaXQgdGhpcy5fdGFzay5jaGVja1Byb3AoUHJvcEludGVyZmFjZS5QUk9QX1RZUEVfQUxMT1dfRU1QVFlfREFUQVZJRVcsIHRydWUpKVxyXG4gICAgICAgIHN1cGVyLnNldEVtcHR5RGF0YXZpZXcodHJ1ZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuX3Rhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX0NSRUFURSAmJiBzdXBlci5pc0VtcHR5RGF0YXZpZXcoKSlcclxuICAgICAgICBzdXBlci5zZXRFbXB0eURhdGF2aWV3KGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIGRpc3BsYXkgbGluZSB0byBtb3ZlIGFmdGVyIGRlbGV0ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvbkRlbGV0ZVwiPnRydWUgaWYgd2UgYXJlIHJlbW92aW5nIHRoZSByZWNvcmQgZHVlIHRvIGRlbGV0ZS4gZmFsc2UgaWYgZHVlIHRvIGNhbmNlbCBvbiBpbnNlcnRcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+XHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIGNhbGNMaW5lVG9Nb3ZlKG9uRGVsZXRlOiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGxldCBuZXdEaXNwbGF5TGluZTogbnVtYmVyO1xyXG5cclxuICAgIC8vIGlmIHRoZSByZWNvcmQgaXMgcmVtb3ZlZCBkdWUgdG8gaXRzIGRlbGV0aW9uLCB3ZSBuZWVkIHRvIGdvdCB0byB0aGUgbmV4dCByZWNvcmQgaW4gdGhlIHZpZXcgLVxyXG4gICAgLy8gbm93IHRoYXQgd2UgZGVsZXRlZCB0aGUgY3VycmVudCByZWNvcmQsIHRoZSBpbmRleCBvZiB0aGUgbmV4dCByZWNvcmQgaXMgdGhlIHNhbWUgaW5kZXggdGhhdCB3YXNcclxuICAgIC8vIG9mIHRoZSByZWNvcmQgdGhhdCB3YXMgZGVsZXRlZC5cclxuXHJcbiAgICBpZiAob25EZWxldGUpXHJcbiAgICAgIG5ld0Rpc3BsYXlMaW5lID0gdGhpcy5fY3VyclJlY0lkeDtcclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyAjNzUwMTkwIFNoYXlhXHJcbiAgICAgIC8vIG1vdmUgdG8gdGhlIFBSRVYgcmVjb3JkIGFmdGVyIGNhbmNlbFxyXG4gICAgICBpZiAodGhpcy5fY3VyclJlY0lkeCA+IDApXHJcbiAgICAgICAgbmV3RGlzcGxheUxpbmUgPSB0aGlzLl9jdXJyUmVjSWR4IC0gMTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIG5ld0Rpc3BsYXlMaW5lID0gdGhpcy5fY3VyclJlY0lkeDtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXdEaXNwbGF5TGluZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXNldCB2YWx1ZXMgaWYgdGhlcmUgaXMgbm8gY3VycmVudCByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHJlc2V0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY3VyclJlY0lkID0gSW50MzIuTWluVmFsdWU7XHJcbiAgICB0aGlzLl9jdXJyUmVjSWR4ID0gSW50MzIuTWluVmFsdWU7XHJcbiAgICB0aGlzLkN1cnJSZWMgPSBudWxsO1xyXG4gICAgdGhpcy5zZXRUb3BSZWNJZHgoSW50MzIuTWluVmFsdWUpO1xyXG4gICAgdGhpcy5TZXRJbmNsdWRlc0ZpcnN0KHRydWUpO1xyXG4gICAgdGhpcy5TZXRJbmNsdWRlc0xhc3QodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2FuY2VsIHRoZSBlZGl0aW5nIG9mIHRoZSBjdXJyZW50IHJlY29yZCBhbmQgcmVzdG9yZSB0aGUgb2xkIHZhbHVlcyBvZlxyXG4gIC8vLyAgIHRoZSBmaWVsZHNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwib25seVJlYWxcIj5pZiB0cnVlIG9ubHkgcmVzdG9yZXMgdGhlIHZhbHVlcyBvZiB0aGUgcmVhbCBmaWVsZHMuIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZWNvbXB1dGVVbmtub3duc1wiPnJlLXBlcmZvcm0gdW5rbm93biByZWNvbXB1dGVzLiA8L3BhcmFtPlxyXG4gIGFzeW5jIGNhbmNlbEVkaXQob25seVJlYWw6IGJvb2xlYW4sIHJlY29tcHV0ZVVua25vd25zOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgdGVtcEN1cnJSZWM6IFJlY29yZCA9IG51bGw7XHJcbiAgICBsZXQgcmVjUmVtb3ZlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGluRW5kVGFzazogYm9vbGVhbiA9ICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuSW5FbmRUYXNrO1xyXG5cclxuICAgIC8vIFFDUiAjMzYyOTAzIC0gQXQgX3Rhc2sgc3VmZml4LCB3ZSB3YW50IHRvIHByZXNlcnZlIHRoZSBsYXN0IHZhbHVlcyBvZiB0aGUgdmlydHVhbHMuXHJcbiAgICBpZiAoaW5FbmRUYXNrKVxyXG4gICAgICBvbmx5UmVhbCA9IHRydWU7XHJcblxyXG4gICAgaWYgKHRoaXMuQ3VyclJlYy5nZXRNb2RlKCkgPT09IERhdGFNb2RpZmljYXRpb25UeXBlcy5JbnNlcnQgJiYgdGhpcy5DdXJyUmVjLmlzTmV3UmVjKCkpIHtcclxuICAgICAgaWYgKCh0aGlzLl9pbmNsdWRlc0ZpcnN0ICYmIHRoaXMuX2luY2x1ZGVzTGFzdCAmJiAodGhpcy5fcmVjb3Jkc1RhYiA9PT0gbnVsbCB8fCB0aGlzLl9yZWNvcmRzVGFiLmdldFNpemUoKSA9PT0gMSkpIHx8ICF0aGlzLkhhc01haW5UYWJsZSkge1xyXG5cclxuICAgICAgICAvLyBkZWZlY3QgMTIxOTY4LiBXaGVuIGZyb20gdGhlIHBhcmVudCB0YXNrIFwiVmlld1JlZnJlc2hcIiBvciBcIkNhbmNlbFwiIGFyZSBkb25lIGFuZCB0aGUgc3ViZm9ybSBpcyBpbiBDcmVhdGUgbm9kZVxyXG4gICAgICAgIC8vIGFuZCB0aGUgc3ViZm9ybSBoYXMgbm8gcmVjb3JkcywgX29yaWdpbmFsIGlzIG51bGwuIFNvIHBhc3MgaXQuXHJcbiAgICAgICAgaWYgKHRoaXMuX29yaWdpbmFsICE9PSBudWxsKSB7XHJcbiAgICAgICAgICB0aGlzLkN1cnJSZWMuc2V0U2FtZUFzKHRoaXMuX29yaWdpbmFsLCBvbmx5UmVhbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGF3YWl0IHRoaXMucmVtb3ZlQ3VyclJlYygpO1xyXG4gICAgICAgIHJlY1JlbW92ZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX29yaWdpbmFsID0gdGhpcy5DdXJyUmVjLnJlcGxpY2F0ZSgpOyAvLyBtdXN0IGNvcHkgYWdhaW4gdG8gcHJldmVudCBhbHRlcmluZyB0aGUgb3JpZ2luYWwgdmFsdWVzXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGlmIChjdXJyUmVjLm1vZGlmaWVkKCkpXHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKCF0aGlzLkN1cnJSZWMuTW9kaWZpZWQpIHtcclxuICAgICAgICBsZXQgY3VyckN0cmw6IE1nQ29udHJvbCA9IDxNZ0NvbnRyb2w+dGhpcy5fdGFzay5nZXRMYXN0UGFya2VkQ3RybCgpO1xyXG4gICAgICAgIGlmIChjdXJyQ3RybCAhPT0gbnVsbClcclxuICAgICAgICAgIGN1cnJDdHJsLnJlc2V0UHJldlZhbCgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAocmVjb21wdXRlVW5rbm93bnMpXHJcbiAgICAgICAgdGVtcEN1cnJSZWMgPSB0aGlzLkN1cnJSZWMucmVwbGljYXRlKCk7XHJcblxyXG4gICAgICAvLyBBVFRFTlRJT04gISEhXHJcbiAgICAgIC8vIHdlIGRvbid0IHN0ZXAgb3ZlciB0aGUgY3VyclJlYyByZWZlcmVuY2Ugd2l0aCB0aGUgb3JpZ2luYWwgcmVjb3JkXHJcbiAgICAgIC8vIHRvIGFzc3VyZSB0aGF0IGlmIHRoaXMgcmVjb3JkIGlzIGJvdGggaW4gdGhlIHJlY29yZHMgdGFibGUgYW5kIGluXHJcbiAgICAgIC8vIHRoZSBtb2RpZmllZCB0YWJsZSB0aGVzZSB0YWJsZXMgd2lsbCBrZWVwIHJlZmVyZW5jaW5nIHRoZSBzYW1lIGluc3RhbmNlXHJcbiAgICAgIGlmICh0aGlzLl9vcmlnaW5hbCAhPT0gbnVsbClcclxuICAgICAgICB0aGlzLkN1cnJSZWMuc2V0U2FtZUFzKHRoaXMuX29yaWdpbmFsLCBvbmx5UmVhbCk7XHJcblxyXG4gICAgICBpZiAoKHRoaXMuX29yaWdpbmFsICE9PSBudWxsICYmIHJlY29tcHV0ZVVua25vd25zKSAmJiAhdGhpcy5DdXJyUmVjLmlzU2FtZVJlY0RhdGEodGVtcEN1cnJSZWMsIGZhbHNlLCBmYWxzZSkpXHJcbiAgICAgICAgYXdhaXQgdGhpcy5leGVjVW5rbm93blJjbXBzKHRoaXMuX29yaWdpbmFsKTtcclxuXHJcbiAgICAgIHRoaXMudGFrZUZsZFZhbHNGcm9tQ3VyclJlYygpO1xyXG4gICAgICB0aGlzLl9vcmlnaW5hbCA9IHRoaXMuQ3VyclJlYy5yZXBsaWNhdGUoKTsgLy8gbXVzdCBjb3B5IGFnYWluIHRvIHByZXZlbnQgYWx0ZXJpbmcgdGhlIG9yaWdpbmFsIHZhbHVlc1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlY1JlbW92ZWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgaWYgdGhlcmUgYXJlIG5vIHJlY29yZHMgaW4gdGhlIGRhdGF2aWV3XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc0VtcHR5KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luY2x1ZGVzRmlyc3QgJiYgdGhpcy5faW5jbHVkZXNMYXN0ICYmICh0aGlzLl9yZWNvcmRzVGFiID09PSBudWxsIHx8IHRoaXMuX3JlY29yZHNUYWIuZ2V0U2l6ZSgpID09PSAwKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGFkZEN1cnJUb01vZGlmaWVkKCk6IFByb21pc2U8dm9pZD4gO1xyXG4gIGFzeW5jIGFkZEN1cnJUb01vZGlmaWVkKHNldFJlY1RvT2xkOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiA7XHJcbiAgYXN5bmMgYWRkQ3VyclRvTW9kaWZpZWQoc2V0UmVjVG9PbGQ/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoaXNOdWxsT3JVbmRlZmluZWQoc2V0UmVjVG9PbGQpKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuYWRkQ3VyclRvTW9kaWZpZWRfMCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBhd2FpdCB0aGlzLmFkZEN1cnJUb01vZGlmaWVkXzEoc2V0UmVjVG9PbGQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFkZCB0aGUgY3VycmVudCByZWNvcmQgdG8gdGhlIG1vZGlmaWVkIHJlY29yZHMgdGFibGUgLSBpZiBpdCBpcyBub3QgYWxyZWFkeSB0aGVyZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBhc3luYyBhZGRDdXJyVG9Nb2RpZmllZF8wKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5hZGRDdXJyVG9Nb2RpZmllZCh0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhZGQgdGhlIGN1cnJlbnQgcmVjb3JkIHRvIHRoZSBtb2RpZmllZCByZWNvcmRzIHRhYmxlIC0gaWYgaXQgaXMgbm90IGFscmVhZHkgdGhlcmVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzU2V0T2xkUmVjXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIGFkZEN1cnJUb01vZGlmaWVkXzEoc2V0UmVjVG9PbGQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX21vZGlmaWVkUmVjb3Jkc1RhYi5hZGRSZWNvcmQodGhpcy5DdXJyUmVjKTtcclxuICAgIGlmIChzZXRSZWNUb09sZCkge1xyXG4gICAgICB0aGlzLkN1cnJSZWMuc2V0T2xkUmVjKCk7XHJcbiAgICB9XHJcbiAgICBsZXQgY29tbWFuZDogSUNsaWVudENvbW1hbmQgPSBDb21tYW5kRmFjdG9yeS5DcmVhdGVTZXRUcmFuc2FjdGlvblN0YXRlRGF0YXZpZXdDb21tYW5kKHRoaXMuZ2V0VGFzaygpLmdldFRhc2tUYWcoKSwgdHJ1ZSk7XHJcbiAgICBhd2FpdCB0aGlzLmdldFRhc2soKS5EYXRhdmlld01hbmFnZXIuUmVtb3RlRGF0YXZpZXdNYW5hZ2VyLkV4ZWN1dGUoY29tbWFuZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdGFrZSB0aGUgZmllbGQgdmFsdWVzIGZyb20gdGhlIGN1cnJlbnQgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICB0YWtlRmxkVmFsc0Zyb21DdXJyUmVjKCk6IHZvaWQge1xyXG4gICAgKDxGaWVsZHNUYWJsZT50aGlzLl9maWVsZHNUYWIpLnRha2VWYWxzRnJvbVJlYygpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNvbXBhcmUgYSBzZWxlY3RlZCBmaWVsZHMgdmFsdWVzIGJldHdlZW4gdGhlIGN1cnJlbnQgcmVjb3JkIGFuZCB0aGUgcHJldmlvdXMgcmVjb3JkXHJcbiAgLy8vICAgYW5kIHJldHVybiB0cnVlIGlmIHRoZWlyIHZhbHVlcyBhcmUgZXF1YWxcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkTGlzdFwiPnRoZSBsaXN0IG9mIGZpZWxkIGluZGV4ZXMgdG8gY29tcGFyZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIGN1cnJFcXVhbHNQcmV2KGZsZExpc3Q6IG51bWJlcltdKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5DdXJyUmVjICE9PSBudWxsICYmIHRoaXMuX3ByZXZDdXJyUmVjICE9PSBudWxsKSB7XHJcbiAgICAgIGlmICh0aGlzLkN1cnJSZWMgPT09IHRoaXMuX3ByZXZDdXJyUmVjKVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG5cclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGZsZExpc3QubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgICBpZiAoIXRoaXMuQ3VyclJlYy5mbGRWYWxzRXF1YWwodGhpcy5fcHJldkN1cnJSZWMsIGZsZExpc3RbaV0pKVxyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLkN1cnJSZWMgIT09IHRoaXMuX3ByZXZDdXJyUmVjKVxyXG4gIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIF90YXNrIG9mIHRoaXMgZGF0YXZpZXdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFRhc2soKTogVGFza0Jhc2Uge1xyXG4gICAgRGVidWcuQXNzZXJ0KHRoaXMuX3Rhc2sgaW5zdGFuY2VvZiBUYXNrQmFzZSk7XHJcbiAgICByZXR1cm4gPFRhc2tCYXNlPnRoaXMuX3Rhc2s7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBmb3JtIGZvciBfdGFzayBvZiB0aGlzIGRhdGF2aWV3XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRGb3JtKCk6IE1nRm9ybSB7XHJcbiAgICByZXR1cm4gPE1nRm9ybT50aGlzLl90YXNrLmdldEZvcm0oKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIG51bWJlciBvZiByZWNvcmRzIGluIHRoZSBtb2RpZmllZCByZWNvcmRzIHRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBtb2RpZmllZFJlY29yZHNOdW1iZXIoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9tb2RpZmllZFJlY29yZHNUYWIuZ2V0U2l6ZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgbnVtYmVyIG9mIHJlY29yZHMgaW4gdGhlIGRhdGF2aWV3XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRTaXplKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmVjb3Jkc1RhYi5nZXRTaXplKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoZSBjbGllbnQga25vd3MgaG93IHRvIGluaXQgYSBuZXcgcmVjb3JkLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgY29tcHV0ZUJ5Q2xpZW50KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbXB1dGVCeSA9PT0gQ09NUFVURV9ORVdSRUNfT05fQ0xJRU5ULyonQycqLztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpcyBSZWNvcmQgZXhpc3RzIGluIHRoZSBEYXRhVmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZFwiPm9mIG5lZWRlZCByZWNvcmQgPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaWYgdGhlIHJlY29yZCBleGlzdHMgPC9yZXR1cm5zPlxyXG4gIHJlY0V4aXN0c0J5SWQoaWQ6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlY29yZHNUYWIuZ2V0UmVjb3JkKGlkKSAhPT0gbnVsbDtcclxuICB9XHJcblxyXG5cclxuICBQYXJhbWV0ZXJzRXhpc3QoaVBvczogbnVtYmVyLCBpTGVuOiBudW1iZXIpOiBib29sZWFuO1xyXG4gIFBhcmFtZXRlcnNFeGlzdCgpOiBib29sZWFuO1xyXG4gIFBhcmFtZXRlcnNFeGlzdChpUG9zPzogbnVtYmVyLCBpTGVuPzogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMilcclxuICAgICAgcmV0dXJuIHRoaXMuUGFyYW1ldGVyc0V4aXN0XzAoaVBvcywgaUxlbik7XHJcbiAgICByZXR1cm4gdGhpcy5QYXJhbWV0ZXJzRXhpc3RfMSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrIGlmIHRoZXJlIGFyZSBwYXJhbXMgaW4gdGhlIHNwZWNpZmllZCByYW5nZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpUG9zXCI+cG9zaXRpb24gb2YgZmlyc3QgZmllbGQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaUxlblwiPm51bWJlciBvZiBmaWVsZHMgaW4gdGhlIHJhbmdlPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgPSB0aGVyZSBhcmUgcGFyYW1ldGVycyBpbiB0aGUgcmFuZ2U8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBQYXJhbWV0ZXJzRXhpc3RfMChpUG9zOiBudW1iZXIsIGlMZW46IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gaVBvczsgaSA8IGlQb3MgKyBpTGVuOyBpID0gaSArIDEpIHtcclxuICAgICAgaWYgKCg8RmllbGQ+c3VwZXIuZ2V0RmllbGQoaSkpLmlzUGFyYW0oKSlcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gY2hlY2sgaWYgdGhlcmUgYXJlIHBhcmFtcyBpbiBEYXRhdmlldyB0YWJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBQYXJhbWV0ZXJzRXhpc3RfMSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLlBhcmFtZXRlcnNFeGlzdCh0aGlzLl9ybUlkeCwgdGhpcy5fcm1TaXplKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgYSByZWNvcmQgaXMgaW4gdGhlIG1vZGlmaWVkIHJlY29yZHMgdGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWRcIj50aGUgaWQgb2YgdGhlIHJlY29yZDwvcGFyYW0+XHJcbiAgcmVjSW5Nb2RpZmllZFRhYihpZDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgcmVjb3JkOiBSZWNvcmQgPSB0aGlzLl9tb2RpZmllZFJlY29yZHNUYWIuZ2V0UmVjb3JkKGlkKTtcclxuICAgIHJldHVybiByZWNvcmQgIT09IG51bGw7XHJcbiAgfVxyXG5cclxuICBzZXRQcmV2Q3VyclJlYygpOiB2b2lkO1xyXG4gIHNldFByZXZDdXJyUmVjKHJlYzogUmVjb3JkKTogdm9pZDtcclxuICBzZXRQcmV2Q3VyclJlYyhyZWM/OiBSZWNvcmQpOiB2b2lkIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMuc2V0UHJldkN1cnJSZWNfMCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldFByZXZDdXJyUmVjXzEocmVjKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzYXZlcyB0aGUgY3VycmVudCByZWNvcmQgYXMgdGhlIHByZXZpb3VzIGN1cnJlbnQgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIHNldFByZXZDdXJyUmVjXzAoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wcmV2Q3VyclJlYyA9IHRoaXMuQ3VyclJlYztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0UHJldkN1cnJSZWNfMShyZWM6IFJlY29yZCk6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJldkN1cnJSZWMgPSByZWM7XHJcbiAgfVxyXG5cclxuICBpc1ByZXZDdXJyUmVjTnVsbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9wcmV2Q3VyclJlYyA9PT0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZWNvbXB1dGUgYWxsIHZpcnR1YWxzIHdpdGggbm8gaW5pdCBleHByZXNzaW9uIHdoaWNoIGhhdmUgc2VydmVyIHJlY29tcHV0ZSBkZWZpbmVkIGZvciB0aGVtLlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJvcmdSZWNcIj5jb250YWlucyB0aGUgdmlydHVhbCdzIG9yaWdpbmFsIHZhbHVlIDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBleGVjVW5rbm93blJjbXBzKG9yZ1JlYzogUmVjb3JkKTogUHJvbWlzZTx2b2lkPiB7XHJcblxyXG4gICAgbGV0IGk6IG51bWJlcjtcclxuICAgIGxldCBmcm9tOiBudW1iZXIgPSAoPEZpZWxkc1RhYmxlPnRoaXMuX2ZpZWxkc1RhYikuZ2V0Uk1JZHgoKTtcclxuICAgIGxldCBzaXplOiBudW1iZXIgPSAoPEZpZWxkc1RhYmxlPnRoaXMuX2ZpZWxkc1RhYikuZ2V0Uk1TaXplKCk7XHJcblxyXG4gICAgbGV0IHJlYzogUmVjb3JkID0gdGhpcy5nZXRDdXJyUmVjKCk7XHJcblxyXG4gICAgLy8gRmlyc3QgdGltZSAtIGluaXRpYWxpemUgdW5rbm93blJjbXAgdmFsdWVcclxuICAgIGlmICh0aGlzLl91bmtub3duUmNtcCA9PT0gVU5LTk9XTl9SQ01QU19OT1RfSU5JVEVEKSB7XHJcblxyXG4gICAgICBmb3IgKGkgPSBmcm9tO1xyXG4gICAgICAgICAgIGkgPCBmcm9tICsgc2l6ZSAmJiB0aGlzLl91bmtub3duUmNtcCA9PT0gVU5LTk9XTl9SQ01QU19OT1RfSU5JVEVEO1xyXG4gICAgICAgICAgIGkrKykge1xyXG5cclxuICAgICAgICBsZXQgZmllbGQ6IEZpZWxkID0gPEZpZWxkPnRoaXMuX2ZpZWxkc1RhYi5nZXRGaWVsZChpKTtcclxuXHJcbiAgICAgICAgaWYgKGZpZWxkLklzVmlydHVhbCAmJiAhZmllbGQuaGFzSW5pdEV4cCgpICYmIGZpZWxkLmlzU2VydmVyUmNtcCgpKVxyXG4gICAgICAgICAgdGhpcy5fdW5rbm93blJjbXAgPSBVTktOT1dOX1JDTVBTX0ZPVU5ELyonWScqLztcclxuXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fdW5rbm93blJjbXAgPT09IFVOS05PV05fUkNNUFNfRk9VTkQgLyonWScqLyAmJiByZWMgIT09IG51bGwpIHtcclxuICAgICAgZm9yIChpID0gZnJvbTsgaSA8IGZyb20gKyBzaXplOyBpID0gaSArIDEpIHtcclxuXHJcbiAgICAgICAgbGV0IGZpZWxkOiBGaWVsZCA9IDxGaWVsZD50aGlzLl9maWVsZHNUYWIuZ2V0RmllbGQoaSk7XHJcbiAgICAgICAgaWYgKGZpZWxkLklzVmlydHVhbCAmJiAhZmllbGQuaGFzSW5pdEV4cCgpICYmIGZpZWxkLmlzU2VydmVyUmNtcCgpICYmICFyZWMuZmxkVmFsc0VxdWFsKG9yZ1JlYywgaSkpIHtcclxuICAgICAgICAgIGxldCBmaWVsZFZhbHVlOiBzdHJpbmcgPSByZWMuR2V0RmllbGRWYWx1ZShpKTtcclxuICAgICAgICAgIGxldCBpc051bGxGbGQ6IGJvb2xlYW4gPSByZWMuSXNOdWxsKGkpO1xyXG4gICAgICAgICAgcmVjLnNldEZpZWxkVmFsdWUoaSwgb3JnUmVjLkdldEZpZWxkVmFsdWUoaSksIGZhbHNlKTtcclxuICAgICAgICAgIGF3YWl0IGZpZWxkLnNldFZhbHVlQW5kU3RhcnRSZWNvbXB1dGUoZmllbGRWYWx1ZSwgaXNOdWxsRmxkLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHRyYW5zQ2xlYXJlZCBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRUcmFuc0NsZWFyZWQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl90cmFuc0NsZWFyZWQgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBlcmZvcm0gYW55IGRhdGEgZXJyb3IgcmVjb3ZlcnkgYWN0aW9uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwdWJsaWMgYXN5bmMgcHJvY2Vzc1JlY292ZXJ5KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCF0aGlzLl90YXNrLmlzQWJvcnRpbmcoKSkge1xyXG4gICAgICBsZXQgb3JnQWN0aW9uOiBzdHJpbmcgPSB0aGlzLl9wZW5kaW5nUmVjb3Zlcnk7XHJcbiAgICAgIGxldCBvcmdTdG9wRXhlY3V0aW9uOiBib29sZWFuID0gQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKTtcclxuXHJcbiAgICAgIHRoaXMuX3BlbmRpbmdSZWNvdmVyeSA9IFJFQ09WRVJZX0FDVF9OT05FO1xyXG4gICAgICBpZiAob3JnU3RvcEV4ZWN1dGlvbilcclxuICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRTdG9wRXhlY3V0aW9uKGZhbHNlKTtcclxuXHJcbiAgICAgIGxldCB0ZW1wb3JhcnlSZXNldEluQ3RybFByZWZpeDogYm9vbGVhbiA9ICg8VGFza0Jhc2U+dGhpcy5fdGFzaykuSW5DdHJsUHJlZml4O1xyXG5cclxuICAgICAgLy8gaWYgdGhlIGVycm9yIGZyb20gd2hpY2ggd2UgcmVjb3ZlciBoYXBwZW5lZCB3aGlsZSBpbiBjdHJsIHByZWZpeCwgcmVzZXQgaXQgZm9yIHRoZSBhY3Rpb24gdG8gYmUgZXhlY3V0ZWQgaGVyZSxcclxuICAgICAgLy8gc28gdGhhdCBlbnRlcmluZyBhIG5ldyBjb250cm9sIHdpbGwgd29yayAoRGVmZWN0IDEyMjM4NykuXHJcbiAgICAgIGlmICh0ZW1wb3JhcnlSZXNldEluQ3RybFByZWZpeClcclxuICAgICAgICAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLkluQ3RybFByZWZpeCA9IGZhbHNlO1xyXG5cclxuICAgICAgc3dpdGNoIChvcmdBY3Rpb24pIHtcclxuICAgICAgICBjYXNlIFJFQ09WRVJZX0FDVF9DQU5DRUw6XHJcbiAgICAgICAgICAoKDxEYXRhVmlldz50aGlzLl90YXNrLkRhdGFWaWV3KS5nZXRDdXJyUmVjKCkpLnJlc2V0VXBkYXRlZCgpO1xyXG5cclxuICAgICAgICAgIC8vIFFDUiAjNzczOTc5ICh1cGRhdGVkIHJlY29yZCBjYW50IGJlIGNhbmNlbGVkKVxyXG5cclxuICAgICAgICAgIC8vIGNsZWFyIHRoZSBjYWNoZVxyXG4gICAgICAgICAgdGhpcy5nZXRUYXNrKCkuZ2V0VGFza0NhY2hlKCkuY2xlYXJDYWNoZSgpO1xyXG5cclxuICAgICAgICAgIC8vIHFjciAjNzc2OTUyLiBjcmVhdGUgbW9kZSBhbmQgb25seSAxIHJlYyBvbiBkdi4gVGhlIHNlcnZlciBoYXMgb3JkZXJlZFxyXG4gICAgICAgICAgLy8gYSByb2xsYmFjay4gSGVyZSwgd2UgcmVzZXQgb3JpZ2luYWwgcmVjIGFuZCBjdXJyIHJlYyB0byBpbnNlcnQgbW9kZSxcclxuICAgICAgICAgIC8vIG90aGVyd2lzZSwgbmV4dCB0aW1lIHRoZSBjbGllbnQgd2lsbCBzZXQgdXBkYXRlIG1vZGUgZm9yIHRoZSByZWMgaW5zdGVhZCBvZiBpbnNlcnQuXHJcbiAgICAgICAgICBpZiAodGhpcy5nZXRTaXplKCkgPT09IDEgJiYgdGhpcy5fdGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQ3VyclJlYy5yZXNldE1vZGlmaWVkKCk7XHJcbiAgICAgICAgICAgIHRoaXMuQ3VyclJlYy5jbGVhck1vZGUoKTtcclxuICAgICAgICAgICAgdGhpcy5DdXJyUmVjLnNldE1vZGUoRGF0YU1vZGlmaWNhdGlvblR5cGVzLkluc2VydCk7XHJcbiAgICAgICAgICAgIHRoaXMuQ3VyclJlYy5zZXROZXdSZWMoKTtcclxuICAgICAgICAgICAgdGhpcy5fb3JpZ2luYWwuc2V0U2FtZUFzKHRoaXMuQ3VyclJlYywgZmFsc2UpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIFRoZSBjYW5jZWwgaGFuZGxlZCBoZXJlIHdpbGwgbm90IGNhdXNlZCBhIHJvbGxiYWNrIHNpbmNlIGl0IHdhcyByYWlzZWQgYnkgcm9sbGJhY2suIChyb2xsYiBhbHJlYWR5IGRvbmUgaW4gc2VydmVyKS5cclxuICAgICAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmhhbmRsZUludGVybmFsRXZlbnRXaXRoVGFza0FuZEV2ZW50U3VidHlwZSh0aGlzLmdldFRhc2soKSwgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NBTkNFTCxcclxuICAgICAgICAgICAgRXZlbnRTdWJUeXBlLkNhbmNlbFdpdGhOb1JvbGxiYWNrKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFJFQ09WRVJZX0FDVF9NT1ZFX0RJUkVDVElPTl9CRUdJTjpcclxuICAgICAgICAgIC8vIERlZmVjdCAxNTIzMjA6IFdoZW4gRGF0YWJhc2UgZXJyb3Igb2NjdXJzIHdlIG5lZWQgbm90IGNhbGwgUmVjb3JkIHN1ZmZpeCBhZ2FpbiBhcyB0aGlzIGlzIGNhbGxlZCBmcm9tIFJlY29yZCBzdWZmaXguXHJcbiAgICAgICAgICAvLyBXZSBuZWVkIHRvIGF0dGVtcHQgdG8gcGFyayBvbiBsYXN0cGFya2VkQ3RybCBhbmQgd2FpdCB0aGVyZVxyXG4gICAgICAgICAgbGV0IGxhc3RQYXJrZWRDb250cm9sOiBNZ0NvbnRyb2wgPSA8TWdDb250cm9sPnRoaXMuX3Rhc2suZ2V0TGFzdFBhcmtlZEN0cmwoKTtcclxuICAgICAgICAgIGlmKGxhc3RQYXJrZWRDb250cm9sICE9PSBudWxsKVxyXG4gICAgICAgICAgICBhd2FpdCBsYXN0UGFya2VkQ29udHJvbC5pbnZva2UoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFJFQ09WRVJZX0FDVF9CRUdJTl9TQ1JFRU46XHJcbiAgICAgICAgICB0aGlzLmdldFRhc2soKS5zZXRQcmV2ZW50UmVjb3JkU3VmZml4KHRydWUpO1xyXG4gICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMuX3Rhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfQkVHUEFHRSk7XHJcbiAgICAgICAgICB0aGlzLmdldFRhc2soKS5zZXRQcmV2ZW50UmVjb3JkU3VmZml4KGZhbHNlKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIFJFQ09WRVJZX0FDVF9CRUdJTl9UQUJMRTpcclxuICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgYWN0aW9uIGlzIGVuYWJsZWQgbm8gbWF0dGVyIG91ciBsb2NhdGlvbiBpbiB0aGUgdGFibGUuIG90aGVyd2lzZSwgcmVjIHByZWZpeCB3aWxsIG5vdCBiZSBleGVjdXRlZCBhZnRlciByb2xsYmFjay5cclxuICAgICAgICAgIHRoaXMuX3Rhc2suQWN0aW9uTWFuYWdlci5lbmFibGUoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RCTF9CRUdUQkwsIHRydWUpO1xyXG4gICAgICAgICAgYXdhaXQgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuaGFuZGxlSW50ZXJuYWxFdmVudFdpdGhUYXNrKHRoaXMuX3Rhc2ssIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQkxfQkVHVEJMKTtcclxuICAgICAgICAgIC8vIGNsZWFyIHRoZSBjYWNoZVxyXG4gICAgICAgICAgdGhpcy5nZXRUYXNrKCkuZ2V0VGFza0NhY2hlKCkuY2xlYXJDYWNoZSgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuc2V0U3RvcEV4ZWN1dGlvbihvcmdTdG9wRXhlY3V0aW9uKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0ZW1wb3JhcnlSZXNldEluQ3RybFByZWZpeClcclxuICAgICAgICAoPFRhc2tCYXNlPnRoaXMuX3Rhc2spLkluQ3RybFByZWZpeCA9IHRydWU7XHJcblxyXG4gICAgICBpZiAob3JnQWN0aW9uICE9PSBSRUNPVkVSWV9BQ1RfTk9ORSlcclxuICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRTdG9wRXhlY3V0aW9uKHRydWUsIG9yZ0FjdGlvbiAhPT0gUkVDT1ZFUllfQUNUX0JFR0lOX1RBQkxFID8gQ2xlYXJFdmVudHNPblN0b3BFeGVjdXRpb24uQUxMIDogQ2xlYXJFdmVudHNPblN0b3BFeGVjdXRpb24uU0VSVkVSKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXBsZWNpYXRlcyB0aGUgY3VycmVudCBkYXRhdmlld1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcmVwbGljYXRlKCk6IERhdGFWaWV3IHtcclxuICAgIGxldCByZXA6IERhdGFWaWV3ID0gbmV3IERhdGFWaWV3KHRoaXMpO1xyXG4gICAgcmVwLl9yZWNvcmRzVGFiID0gdGhpcy5fcmVjb3Jkc1RhYi5yZXBsaWNhdGUoKTtcclxuICAgIHJlcC5fY3VyclJlY0lkID0gcmVwLl9yZWNvcmRzVGFiLmdldFJlY0J5SWR4KDApLmdldElkKCk7XHJcbiAgICByZXAuX2N1cnJSZWNJZHggPSAwO1xyXG4gICAgcmVwLkN1cnJSZWMgPSByZXAuX3JlY29yZHNUYWIuZ2V0UmVjQnlJZHgoMCk7XHJcbiAgICByZXAuX3ByZXZDdXJyUmVjID0gcmVwLl9yZWNvcmRzVGFiLmdldFJlY0J5SWR4KDApO1xyXG4gICAgcmVwLl9vcmlnaW5hbCA9IHJlcC5fcmVjb3Jkc1RhYi5nZXRSZWNCeUlkeCgwKTtcclxuICAgIHJlcC5zZXRUb3BSZWNJZHgoSW50MzIuTWluVmFsdWUpO1xyXG4gICAgLy8gd2UgbXVzdCBjaGVjayBkY1ZhbHMgaWYgaXQgbmVlZCB0byBiZSByZXBsaWNhdGVkIGFzIHdlbGwgY3VycmVudHkgd2UgdGhpbmsgbm90XHJcbiAgICByZXR1cm4gcmVwO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGR2UG9zIHZhbHVlIG5vbiBoYXNoZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldER2UG9zVmFsdWUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9kdlBvc1ZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrIGlzIGl0IGlzIHRoZSBmaXJzdCB0aW1lIHRoZSBkLnYgaXMgcGFyc2VkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRGaXJzdER2KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZpcnN0RHY7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmVzZXQgaXMgdGhlIGZpcnN0IHRpbWUgdGhlIGQudiBpcyBwYXJzZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIFJlc2V0Rmlyc3REdigpOiB2b2lkIHtcclxuICAgIHRoaXMuX2ZpcnN0RHYgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhpcyBkYXRhdmlldyBjYWNoZSB0aW1lIHN0YW1wXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRDYWNoZUxSVSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlTHJ1VGltZVN0YW1wO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldHMgdGhlIHRpbWUgc3RhbXAgb2YgdGhlIGRhdGF2aWV3XHJcbiAgLy8vICAgdXNlZCB3aGVuIGluc2VydGluZyBkYXRhdmlldyBpbiBjYWNoZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0Q2FjaGVMUlUoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jYWNoZUxydVRpbWVTdGFtcCA9IE1pc2MuZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgbmV3cyB0byB0YWtlIHRoZSB2YWx1ZXMgZnJvbSB0aGUgZ2l2ZW4gZHYgYW5kIHRvIHNldCB0aGVtIGFzIHRoZSBjdXJyZW50IHZhbHVlc1xyXG4gIC8vLyAgIHRoZSBnaXZlbiBkdiBpcyB1c3VhbGx5IGNyZWF0ZWQgdmlhIGRhdGF2aWV3LnJlcGxpY2F0ZSgpXHJcbiAgLy8vICAgdGhpcyBtZXRob2QgZG9lcyBub3QgdGFrZSB0aGUgdmFsdWVzIG9mICBsYXN0U2Vzc2lvbkNvdW50IGFuZCBjYWNoZUxSVVRpbWVTdGFtcFxyXG4gIC8vLyAgIGZyb20gdGhlIGdpdmVuIGR2IHNpbmNlIHRoZXkgc2hvdWxkIGJlIHByb3BhZ2F0ZWQgZnJvbSBvbmUgY3VycmVudCBkdiB0byB0aGUgb3RoZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIHNldFNhbWVBcyhuZXdEdjogRGF0YVZpZXcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX3JtU2l6ZSA9IG5ld0R2Ll9ybVNpemU7XHJcbiAgICB0aGlzLl9ybUlkeCA9IG5ld0R2Ll9ybUlkeDtcclxuICAgIHRoaXMuX2NvbXB1dGVCeSA9IG5ld0R2Ll9jb21wdXRlQnk7XHJcbiAgICB0aGlzLl9mbHVzaFVwZGF0ZXMgPSBuZXdEdi5fZmx1c2hVcGRhdGVzO1xyXG4gICAgdGhpcy5fY3VyclJlY0lkID0gbmV3RHYuX2N1cnJSZWNJZDtcclxuICAgIHRoaXMuX2N1cnJSZWNJZHggPSBuZXdEdi5fY3VyclJlY0lkeDtcclxuICAgIHRoaXMuX3RvcFJlY0lkID0gbmV3RHYuX3RvcFJlY0lkO1xyXG4gICAgdGhpcy5DdXJyUmVjID0gbmV3RHYuQ3VyclJlYztcclxuICAgIHRoaXMuX29yaWdpbmFsID0gbmV3RHYuX29yaWdpbmFsO1xyXG4gICAgdGhpcy5fcHJldkN1cnJSZWMgPSBudWxsO1xyXG4gICAgdGhpcy5fZmllbGRzVGFiID0gbmV3RHYuX2ZpZWxkc1RhYjtcclxuICAgIHRoaXMuX3JlY29yZHNUYWIgPSBuZXdEdi5fcmVjb3Jkc1RhYjtcclxuICAgIHRoaXMuX21vZGlmaWVkUmVjb3Jkc1RhYiA9IG5ld0R2Ll9tb2RpZmllZFJlY29yZHNUYWI7XHJcbiAgICB0aGlzLl9pbmNsdWRlc0ZpcnN0ID0gbmV3RHYuX2luY2x1ZGVzRmlyc3Q7XHJcbiAgICB0aGlzLl9pbmNsdWRlc0xhc3QgPSBuZXdEdi5faW5jbHVkZXNMYXN0O1xyXG4gICAgdGhpcy5faW5zZXJ0QXQgPSBuZXdEdi5faW5zZXJ0QXQ7XHJcbiAgICB0aGlzLl9sYXN0Q3JlYXRlZFJlY0lkID0gbmV3RHYuX2xhc3RDcmVhdGVkUmVjSWQ7XHJcbiAgICB0aGlzLl90YXNrID0gbmV3RHYuX3Rhc2s7XHJcbiAgICB0aGlzLl9kY1ZhbHNDb2xsZWN0aW9uID0gbmV3RHYuX2RjVmFsc0NvbGxlY3Rpb247XHJcbiAgICB0aGlzLl9yZWNvdmVyeSA9IG5ld0R2Ll9yZWNvdmVyeTtcclxuICAgIHRoaXMuX3BlbmRpbmdSZWNvdmVyeSA9IG5ld0R2Ll9wZW5kaW5nUmVjb3Zlcnk7XHJcbiAgICB0aGlzLl9oYXNNYWluVGFibGUgPSBuZXdEdi5faGFzTWFpblRhYmxlO1xyXG4gICAgdGhpcy5fY2h1bmtTaXplID0gbmV3RHYuX2NodW5rU2l6ZTtcclxuICAgIHRoaXMuX2ZpcnN0RHYgPSBuZXdEdi5fZmlyc3REdjtcclxuICAgIHRoaXMuX2xhc3RTZXNzaW9uQ291bnRlciA9IG5ld0R2Ll9sYXN0U2Vzc2lvbkNvdW50ZXI7XHJcbiAgICB0aGlzLl9za2lwUGFyc2luZyA9IG5ld0R2Ll9za2lwUGFyc2luZztcclxuICAgIHRoaXMuX3Vua25vd25SY21wID0gbmV3RHYuX3Vua25vd25SY21wO1xyXG4gICAgdGhpcy5fdHJhbnNDbGVhcmVkID0gbmV3RHYuX3RyYW5zQ2xlYXJlZDtcclxuICAgIHRoaXMuX2R2UG9zVmFsdWUgPSBuZXdEdi5fZHZQb3NWYWx1ZTtcclxuICAgIHRoaXMuX2NhY2hlTHJ1VGltZVN0YW1wID0gbmV3RHYuX2NhY2hlTHJ1VGltZVN0YW1wO1xyXG4gICAgdGhpcy5fY2hhbmdlZCA9IG5ld0R2Ll9jaGFuZ2VkO1xyXG4gICAgdGhpcy5fbG9jYXRlRmlyc3RSZWMgPSBuZXdEdi5fbG9jYXRlRmlyc3RSZWM7XHJcbiAgICBzdXBlci5zZXRFbXB0eURhdGF2aWV3KG5ld0R2LmlzRW1wdHlEYXRhdmlldygpKTtcclxuICAgIHRoaXMuX3Rhc2suc2V0TW9kZShuZXdEdi50YXNrTW9kZUZyb21DYWNoZSk7XHJcblxyXG4gICAgLy8gVVBEQVRFIFRIRSBUQUJMRSBESVNQTEFZXHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAodGhpcy5nZXRUYXNrKCkuSGFzTG9hY3RlKCkpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSZWModGhpcy5fbG9jYXRlRmlyc3RSZWMsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuc2V0VG9wUmVjSWR4KHRoaXMuX3JlY29yZHNUYWIuZ2V0UmVjSWR4KHRoaXMuX2xvY2F0ZUZpcnN0UmVjKSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5nZXRUYXNrKCkuc2V0UHJldmVudFJlY29yZFN1ZmZpeCh0cnVlKTtcclxuICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSZWNCeUlkeChJbnQzMi5NaW5WYWx1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUsIEludDMyLk1pblZhbHVlKTtcclxuICAgICAgICB0aGlzLmdldFRhc2soKS5zZXRQcmV2ZW50UmVjb3JkU3VmZml4KGZhbHNlKTtcclxuICAgICAgICB0aGlzLnNldFRvcFJlY0lkeCgwKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCF0aGlzLl90YXNrLmdldEZvcm0oKS5pc1NjcmVlbk1vZGUoKSkge1xyXG4gICAgICAgIGlmICgoPE1nRm9ybT50aGlzLl90YXNrLmdldEZvcm0oKSkuaXNUYWJsZVdpdGhQYWdpbmF0aW9uKCkpIHtcclxuICAgICAgICAgIHRoaXMuVG90YWxSZWNvcmRzQ291bnQgPSBuZXdEdi5Ub3RhbFJlY29yZHNDb3VudDtcclxuICAgICAgICAgIHRoaXMuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3ID0gbmV3RHYuUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3O1xyXG4gICAgICAgIH1cclxuICAgICAgICBhd2FpdCB0aGlzLnNldEN1cnJSZWNCeUlkeCh0aGlzLl90b3BSZWNJZHgsIHRydWUsIGZhbHNlLCB0cnVlLCBJbnQzMi5NaW5WYWx1ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLl90YXNrLmdldEZvcm0oKSAhPT0gbnVsbClcclxuICAgICAgICAoPE1nRm9ybT50aGlzLl90YXNrLmdldEZvcm0oKSkudXBkYXRlRGlzcGxheUxpbmVCeURWKCk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXgpIHtcclxuICAgICAgaWYgKGV4IGluc3RhbmNlb2YgUmVjb3JkT3V0T2ZEYXRhVmlld0V4Y2VwdGlvbikge1xyXG4gICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKCd3cm9uZyB0b3AgcmVjb3JkIGlkeCBpbiBEYXRhVmlldy5zZXRTYW1lQXMnICsgZXguTWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRocm93IGV4O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0Q2hhbmdlZCh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuX2NoYW5nZWQgPSB2YWw7XHJcbiAgfVxyXG5cclxuICBnZXRDaGFuZ2VkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NoYW5nZWQ7XHJcbiAgfVxyXG5cclxuICBnZXRMb2NhdGVGaXJzdFJlYygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2xvY2F0ZUZpcnN0UmVjO1xyXG4gIH1cclxuXHJcbiAgc2V0TG9jYXRlRmlyc3RSZWMobmV3Rmlyc3Q6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fbG9jYXRlRmlyc3RSZWMgPSBuZXdGaXJzdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIGEgcmVjb3JkIGJ5IGl0cyBpZHhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFJlY0J5SWR4KGlkeDogbnVtYmVyKTogUmVjb3JkIHtcclxuICAgIHJldHVybiB0aGlzLl9yZWNvcmRzVGFiLmdldFJlY0J5SWR4KGlkeCk7XHJcbiAgfVxyXG5cclxuICBnZXRTZXJ2ZXJDdXJyUmVjKCk6IFJlY29yZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmVjb3Jkc1RhYi5nZXRTZXJ2ZXJDdXJyUmVjKCk7XHJcbiAgfVxyXG5cclxuICB6ZXJvU2VydmVyQ3VyclJlYygpOiB2b2lkIHtcclxuICAgIHRoaXMuX3JlY29yZHNUYWIuemVyb1NlcnZlckN1cnJSZWMoKTtcclxuICB9XHJcblxyXG4gIGluUm9sbGJhY2soKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaW5Sb2xsYmFjazogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGlmICh0aGlzLl9yZWNvdmVyeSA9PT0gQ29uc3RJbnRlcmZhY2UuUkVDT1ZFUllfUk9MTEJBQ0sgLyonUicqLyAmJiB0aGlzLmdldFRhc2soKS5pc1RyYW5zYWN0aW9uT3duZXIoKSkge1xyXG4gICAgICBpblJvbGxiYWNrID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBpblJvbGxiYWNrO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZFwiPiA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gPC9yZXR1cm5zPlxyXG4gIGdldFJlY0lkeChpZDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9yZWNvcmRzVGFiLmdldFJlY0lkeChpZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgYmFja3VwIGN1cnJlbnQgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBiYWNrdXBDdXJyZW50KCk6IFJlY29yZCB7XHJcbiAgICByZXR1cm4gdGhpcy5DdXJyUmVjLnJlcGxpY2F0ZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc3RvcmUgY3VycmVudCByZWNvcmQgZnJvbSBiYWNrdXBcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVjQmFja3VwXCI+YmFja3VwIG9mIHByZXZpb3VzIGN1cnJlbnQgcmVjb3JkIDwvcGFyYW0+XHJcbiAgcmVzdG9yZUN1cnJlbnQocmVjQmFja3VwOiBSZWNvcmQpOiB2b2lkIHtcclxuICAgIERlYnVnLkFzc2VydChyZWNCYWNrdXAgIT09IG51bGwpO1xyXG4gICAgdGhpcy5fY3VyclJlY0lkID0gcmVjQmFja3VwLmdldElkKCk7XHJcbiAgICB0aGlzLl9jdXJyUmVjSWR4ID0gdGhpcy5fcmVjb3Jkc1RhYi5nZXRSZWNJZHgodGhpcy5fY3VyclJlY0lkKTtcclxuICAgIHRoaXMuQ3VyclJlYyA9IHRoaXMuX3JlY29yZHNUYWIuZ2V0UmVjQnlJZHgodGhpcy5fY3VyclJlY0lkeCk7XHJcbiAgICB0aGlzLkN1cnJSZWMuc2V0U2FtZUFzKHJlY0JhY2t1cCwgZmFsc2UpO1xyXG4gICAgdGhpcy50YWtlRmxkVmFsc0Zyb21DdXJyUmVjKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyByZXR1cm4gdGhlIGlkIG9mIHRoZSBjdXJyZW50IHJlY29yZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBHZXRDdXJyZW50UmVjSWQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jdXJyUmVjSWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGRhdGF2aWV3IGJvdW5kYXJpZXMgYXJlIGNoYW5nZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm9yZ0luY2x1ZGVzRmlyc3RcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIm9yZ0luY2x1ZGVzTGFzdFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBEYXRhdmlld0JvdW5kcmllc0FyZUNoYW5nZWQob3JnSW5jbHVkZXNGaXJzdDogYm9vbGVhbiwgb3JnSW5jbHVkZXNMYXN0OiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gb3JnSW5jbHVkZXNGaXJzdCAhPT0gdGhpcy5JbmNsdWRlc0ZpcnN0KCkgfHwgb3JnSW5jbHVkZXNMYXN0ICE9PSB0aGlzLkluY2x1ZGVzTGFzdCgpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgcm91dGUgcGFyYW1zXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBHZXRSb3V0ZVBhcmFtcygpOiBMaXN0PGFueT4ge1xyXG4gICAgbGV0IHBhcmFtczogTGlzdDxhbnk+ID0gbmV3IExpc3QoKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fZmllbGRzVGFiLmdldFNpemUoKTsgaSsrKSB7XHJcblxyXG4gICAgICBsZXQgZmllbGQ6IEZpZWxkID0gPEZpZWxkPnRoaXMuX2ZpZWxkc1RhYi5nZXRGaWVsZChpKTtcclxuICAgICAgbGV0IHZhbDogYW55O1xyXG4gICAgICBpZiAoZmllbGQuSXNFeHBvc2VkUm91dGVQYXJhbSAmJiAhZmllbGQuaXNOdWxsKCkpIHtcclxuICAgICAgICBzd2l0Y2ggKGZpZWxkLmdldFR5cGUoKSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE6XHJcbiAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVU5JQ09ERToge1xyXG4gICAgICAgICAgICB2YWwgPSBmaWVsZC5nZXREaXNwVmFsdWUoKTtcclxuICAgICAgICAgICAgaWYgKGZpZWxkLmlzTnVsbCgpKVxyXG4gICAgICAgICAgICAgIHZhbCA9IGZpZWxkLmdldE51bGxEaXNwbGF5KCk7XHJcbiAgICAgICAgICAgIHZhbCA9IHZhbC50cmltKCk7XHJcbiAgICAgICAgICAgIHBhcmFtcy5wdXNoKCg8c3RyaW5nPnZhbCkubGVuZ3RoID09PSAwID8gJyAnIDogdmFsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOOiB7XHJcbiAgICAgICAgICAgIGlmIChmaWVsZC5pc051bGwoKSlcclxuICAgICAgICAgICAgICBwYXJhbXMucHVzaChmYWxzZSk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICBwYXJhbXMucHVzaCgoZmllbGQuZ2V0RGlzcFZhbHVlKCkpLmNoYXJBdCgwKSA9PT0gJzEnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUM6IHtcclxuICAgICAgICAgICAgdmFsID0gZmllbGQuZ2V0RGlzcFZhbHVlKCk7XHJcbiAgICAgICAgICAgIGlmIChmaWVsZC5pc051bGwoKSlcclxuICAgICAgICAgICAgICB2YWwgPSBmaWVsZC5nZXROdWxsRGlzcGxheSgpO1xyXG4gICAgICAgICAgICBsZXQgcGljOiBQSUMgPSBuZXcgUElDKGZpZWxkLmdldFBpY3R1cmUoKSwgZmllbGQuZ2V0VHlwZSgpLCB0aGlzLmdldFRhc2soKS5nZXRDb21wSWR4KCkpO1xyXG4gICAgICAgICAgICB2YWwgPSBEaXNwbGF5Q29udmVydG9yLkluc3RhbmNlLm1nMmRpc3AodmFsLCAnJywgcGljLCB0cnVlLCAwLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIHBhcmFtcy5wdXNoKHZhbCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIChwYXJhbXMubGVuZ3RoID4gMCkgPyBwYXJhbXMgOiBudWxsO1xyXG4gIH1cclxufVxyXG4iXX0=
|