@magic-xpa/engine 4.1100.0-dev4110.99 → 4.1101.0-dev4111.271
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +7 -7
- 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 +421 -0
- package/esm2022/src/CommandsProcessorBase.mjs +56 -0
- package/{esm2020 → esm2022}/src/CommandsProcessorManager.mjs +25 -25
- package/esm2022/src/CommandsTable.mjs +162 -0
- package/esm2022/src/ConstInterface.mjs +517 -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 +156 -0
- package/{esm2020 → esm2022}/src/ICommandsTable.mjs +1 -1
- package/esm2022/src/ServerConfig.mjs +122 -0
- package/{esm2020 → esm2022}/src/bridge/IGuiEvent.mjs +19 -19
- package/esm2022/src/bridge/MagicBridge.mjs +41 -0
- 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/esm2022/src/commands/ClientToServer/BrowserEscEventCommand.mjs +26 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ClientOriginatedCommand.mjs +14 -14
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ClientOriginatedCommandSerializer.mjs +59 -59
- package/esm2022/src/commands/ClientToServer/ColumnSortEventCommand.mjs +29 -0
- package/esm2022/src/commands/ClientToServer/CommandFactory.mjs +261 -0
- package/esm2022/src/commands/ClientToServer/CommandSerializationHelper.mjs +67 -0
- package/esm2022/src/commands/ClientToServer/ComputeEventCommand.mjs +26 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ContextTerminationEventCommand.mjs +24 -21
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ContextTimeoutResetCommand.mjs +23 -20
- 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 +40 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/EventCommand.mjs +43 -40
- package/esm2022/src/commands/ClientToServer/ExecOperCommand.mjs +70 -0
- package/esm2022/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs +25 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/GlobalParamsQueryCommand.mjs +10 -10
- package/{esm2020 → esm2022}/src/commands/ClientToServer/ICommandTaskTag.mjs +1 -1
- package/esm2022/src/commands/ClientToServer/IndexChangeEventCommand.mjs +24 -0
- package/esm2022/src/commands/ClientToServer/IniputForceWriteCommand.mjs +26 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/NonReversibleExitEventCommand.mjs +26 -23
- package/{esm2020 → esm2022}/src/commands/ClientToServer/QueryCommand.mjs +20 -20
- package/esm2022/src/commands/ClientToServer/RecomputeCommand.mjs +30 -0
- package/esm2022/src/commands/ClientToServer/RefreshEventCommand.mjs +30 -0
- package/esm2022/src/commands/ClientToServer/RefreshScreenEventCommand.mjs +27 -0
- package/esm2022/src/commands/ClientToServer/RollbackEventCommand.mjs +43 -0
- package/esm2022/src/commands/ClientToServer/SelectProgramCommand.mjs +19 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/SetTransactionStateDataviewCommand.mjs +9 -9
- package/esm2022/src/commands/ClientToServer/SubformOpenEventCommand.mjs +24 -0
- package/esm2022/src/commands/ClientToServer/SubformRefreshEventCommand.mjs +27 -0
- package/esm2022/src/commands/ClientToServer/TransactionCommand.mjs +34 -0
- package/{esm2020 → esm2022}/src/commands/ClientToServer/UnloadCommand.mjs +18 -15
- 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 +2 -2
- package/esm2022/src/commands/ServerToClient/AbortCommand.mjs +65 -0
- package/{esm2020 → esm2022}/src/commands/ServerToClient/AddLocateCommand.mjs +21 -21
- package/{esm2020 → esm2022}/src/commands/ServerToClient/AddRangeCommand.mjs +62 -62
- package/{esm2020 → esm2022}/src/commands/ServerToClient/AddSortCommand.mjs +33 -33
- 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/{esm2020 → esm2022}/src/commands/ServerToClient/XMLBasedCommandBuilder.mjs +132 -132
- 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 +1613 -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/{esm2020 → esm2022}/src/data/Key.mjs +88 -88
- package/esm2022/src/data/Record.mjs +880 -0
- package/{esm2020 → esm2022}/src/data/RecordOutOfDataViewException.mjs +15 -15
- package/esm2022/src/data/RecordsTable.mjs +267 -0
- package/{esm2020 → esm2022}/src/data/TaskTransactionManager.mjs +107 -103
- package/{esm2020 → esm2022}/src/data/XMLBasedDcValuesBuilder.mjs +74 -74
- 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 +227 -0
- package/{esm2020 → esm2022}/src/env/MirrorString.mjs +65 -65
- 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 +2988 -0
- package/{esm2020 → esm2022}/src/event/IEventsManager.mjs +6 -6
- package/esm2022/src/event/RunTimeEvent.mjs +399 -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/{esm2020 → esm2022}/src/exp/GlobalParamsTable.mjs +85 -85
- 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 +1224 -0
- package/esm2022/src/http/HttpManager.mjs +97 -0
- package/esm2022/src/http/client/HttpClientAsync.mjs +68 -0
- package/{esm2020 → esm2022}/src/http/client/HttpClientBase.mjs +132 -132
- 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/{esm2020 → esm2022}/src/remote/AddUserLocateRemoteDataViewCommand.mjs +18 -18
- package/{esm2020 → esm2022}/src/remote/AddUserRangeRemoteDataViewCommand.mjs +18 -18
- package/{esm2020 → esm2022}/src/remote/AddUserSortRemoteDataViewCommand.mjs +18 -18
- package/esm2022/src/remote/RemoteCommandsProcessor.mjs +883 -0
- package/{esm2020 → esm2022}/src/remote/RemoteControlItemsRefreshCommand.mjs +25 -25
- package/{esm2020 → esm2022}/src/remote/RemoteDataViewCommandBase.mjs +24 -24
- package/{esm2020 → esm2022}/src/remote/RemoteDataViewCommandFactory.mjs +60 -60
- 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/{esm2020 → esm2022}/src/remote/ResetUserLocateRemoteDataviewCommand.mjs +16 -16
- package/{esm2020 → esm2022}/src/remote/ResetUserRangeRemoteDataviewCommand.mjs +12 -12
- package/{esm2020 → esm2022}/src/remote/ResetUserSortRemoteDataviewCommand.mjs +15 -15
- package/esm2022/src/remote/ServerError.mjs +40 -0
- package/{esm2020 → esm2022}/src/remote/SetTransactionStateRemoteDataViewCommand.mjs +19 -19
- 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/esm2022/src/rt/DataviewHeaderBase.mjs +98 -0
- package/{esm2020 → esm2022}/src/rt/DataviewHeaderFactory.mjs +6 -6
- package/esm2022/src/rt/DataviewHeaders.mjs +53 -0
- package/{esm2020 → esm2022}/src/rt/DataviewHeadersSaxHandler.mjs +38 -38
- package/{esm2020 → esm2022}/src/rt/ExecutionStack.mjs +94 -94
- package/{esm2020 → esm2022}/src/rt/ExecutionStackEntry.mjs +17 -17
- package/{esm2020 → esm2022}/src/rt/HandlersTable.mjs +96 -96
- 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/{esm2020 → esm2022}/src/rt/RecomputeTable.mjs +62 -62
- package/{esm2020 → esm2022}/src/rt/RemoteDataviewHeader.mjs +108 -108
- 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/{esm2020 → esm2022}/src/tasks/RemoteTaskService.mjs +44 -44
- package/esm2022/src/tasks/Task.mjs +2499 -0
- package/esm2022/src/tasks/TaskBase.mjs +83 -0
- package/{esm2020 → esm2022}/src/tasks/TaskServiceBase.mjs +24 -24
- package/esm2022/src/tasks/TasksTable.mjs +80 -0
- package/esm2022/src/tasks/sort/Sort.mjs +5 -0
- package/{esm2020 → esm2022}/src/tasks/sort/SortCollection.mjs +67 -67
- package/{esm2020 → esm2022}/src/util/ConstUtils.mjs +13 -13
- package/esm2022/src/util/FlowMonitorQueue.mjs +451 -0
- package/{esm2020 → esm2022}/src/util/HeapSort.mjs +69 -69
- 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/{esm2020 → esm2022}/src/util/cookie.service.mjs +92 -92
- package/{fesm2020 → fesm2022}/magic-xpa-engine.mjs +29888 -29690
- 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 +35 -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 +516 -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 +35 -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 +9 -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 +11 -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 +9 -8
- package/src/commands/ClientToServer/ContextTerminationEventCommand.d.ts +8 -7
- package/src/commands/ClientToServer/ContextTimeoutResetCommand.d.ts +8 -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 +16 -15
- package/src/commands/ClientToServer/EventCommand.d.ts +16 -15
- package/src/commands/ClientToServer/ExecOperCommand.d.ts +24 -23
- package/src/commands/ClientToServer/FetchDataControlValuesEventCommand.d.ts +9 -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 +9 -8
- package/src/commands/ClientToServer/IniputForceWriteCommand.d.ts +11 -10
- package/src/commands/ClientToServer/NonReversibleExitEventCommand.d.ts +9 -8
- package/src/commands/ClientToServer/QueryCommand.d.ts +8 -8
- package/src/commands/ClientToServer/RecomputeCommand.d.ts +12 -11
- package/src/commands/ClientToServer/RefreshEventCommand.d.ts +13 -12
- package/src/commands/ClientToServer/RefreshScreenEventCommand.d.ts +11 -10
- package/src/commands/ClientToServer/RollbackEventCommand.d.ts +15 -14
- package/src/commands/ClientToServer/SelectProgramCommand.d.ts +7 -6
- package/src/commands/ClientToServer/SetTransactionStateDataviewCommand.d.ts +5 -5
- package/src/commands/ClientToServer/SubformOpenEventCommand.d.ts +9 -8
- package/src/commands/ClientToServer/SubformRefreshEventCommand.d.ts +10 -9
- package/src/commands/ClientToServer/TransactionCommand.d.ts +14 -12
- package/src/commands/ClientToServer/UnloadCommand.d.ts +8 -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 +4 -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 +157 -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 +205 -204
- package/src/event/IEventsManager.d.ts +77 -77
- package/src/event/RunTimeEvent.d.ts +126 -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 +96 -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/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/bridge/MagicBridge.mjs +0 -41
- package/esm2020/src/commands/ClientOriginatedCommandTaskTag.mjs +0 -11
- package/esm2020/src/commands/ClientToServer/BrowserEscEventCommand.mjs +0 -23
- package/esm2020/src/commands/ClientToServer/ColumnSortEventCommand.mjs +0 -26
- package/esm2020/src/commands/ClientToServer/CommandFactory.mjs +0 -260
- package/esm2020/src/commands/ClientToServer/CommandSerializationHelper.mjs +0 -69
- package/esm2020/src/commands/ClientToServer/ComputeEventCommand.mjs +0 -23
- package/esm2020/src/commands/ClientToServer/DataViewOutputCommand.mjs +0 -13
- package/esm2020/src/commands/ClientToServer/EvaluateCommand.mjs +0 -36
- package/esm2020/src/commands/ClientToServer/ExecOperCommand.mjs +0 -67
- package/esm2020/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs +0 -22
- package/esm2020/src/commands/ClientToServer/IndexChangeEventCommand.mjs +0 -21
- 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/SelectProgramCommand.mjs +0 -15
- package/esm2020/src/commands/ClientToServer/SubformOpenEventCommand.mjs +0 -21
- 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/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/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/Record.mjs +0 -846
- package/esm2020/src/data/RecordsTable.mjs +0 -267
- 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/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 -4208
- package/esm2020/src/exp/ExpressionLocalJpn.mjs +0 -314
- 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/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/RemoteCommandsProcessor.mjs +0 -880
- package/esm2020/src/remote/ServerError.mjs +0 -40
- 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/DataviewHeaderBase.mjs +0 -96
- package/esm2020/src/rt/DataviewHeaders.mjs +0 -53
- 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/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/Task.mjs +0 -2496
- package/esm2020/src/tasks/TaskBase.mjs +0 -87
- package/esm2020/src/tasks/TasksTable.mjs +0 -80
- package/esm2020/src/tasks/sort/Sort.mjs +0 -7
- package/esm2020/src/util/FlowMonitorQueue.mjs +0 -453
- 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/fesm2015/magic-xpa-engine.mjs +0 -30837
- package/fesm2015/magic-xpa-engine.mjs.map +0 -1
- package/fesm2020/magic-xpa-engine.mjs.map +0 -1
@@ -0,0 +1,646 @@
|
|
1
|
+
import { ApplicationException, Debug, List, NNumber, NString, RefParam, isNullOrUndefined } from "@magic-xpa/mscorelib";
|
2
|
+
import { Constants, InternalInterface, Logger, MsgInterface, PICInterface, StorageAttribute, StrUtil, UtilStrByteMode, XMLConstants, XmlParser } from "@magic-xpa/utils";
|
3
|
+
import { BlobType, DisplayConvertor, ExpVal, FieldDef, NUM_TYPE, PIC, VectorType } from "@magic-xpa/gui";
|
4
|
+
import { YesNoExp } from "../exp/YesNoExp";
|
5
|
+
import { ExpressionEvaluator } from "../exp/ExpressionEvaluator";
|
6
|
+
import { Recompute, Recompute_RcmpBy } from "../rt/Recompute";
|
7
|
+
import { Boundary } from "../rt/Boundary";
|
8
|
+
import { ArgumentsList } from "../rt/ArgumentsList";
|
9
|
+
import { ConstInterface } from "../ConstInterface";
|
10
|
+
import { RunTimeEvent } from "../event/RunTimeEvent";
|
11
|
+
import { Record } from "./Record";
|
12
|
+
import { Environment } from "../env/Environment";
|
13
|
+
import { FieldBase } from "./FieldBase";
|
14
|
+
import { LastFocusedManager } from "../rt/LastFocusedManager";
|
15
|
+
import { LanguageData } from "../env/LanguageData";
|
16
|
+
import { AccessHelper } from "../AccessHelper";
|
17
|
+
export class Field extends FieldBase {
|
18
|
+
static LEAVE_FLAGS = false;
|
19
|
+
static NUM0 = null;
|
20
|
+
static NUM1 = null;
|
21
|
+
_linkExp = null;
|
22
|
+
_recompute = null;
|
23
|
+
CacheTableFldIdx = 0;
|
24
|
+
_causeTableInvalidation = false;
|
25
|
+
_form = null;
|
26
|
+
_hasChangeEvent = false;
|
27
|
+
_hasZoomHandler = false;
|
28
|
+
_inEvalProcess = false;
|
29
|
+
_initExp = null;
|
30
|
+
_invalidValue = true;
|
31
|
+
_isLinkFld = false;
|
32
|
+
_isVirtual = false;
|
33
|
+
_dataviewHeaderId = -1;
|
34
|
+
_linkCreate = false;
|
35
|
+
Locate = null;
|
36
|
+
Range = null;
|
37
|
+
_isParam = false;
|
38
|
+
_isExposedRouteParam = false;
|
39
|
+
_isExposedToClient = true;
|
40
|
+
_prevIsNull = false;
|
41
|
+
_prevValue = null;
|
42
|
+
_tableName = null;
|
43
|
+
_indexInTable = -1;
|
44
|
+
_virAsReal = false;
|
45
|
+
_val = null;
|
46
|
+
modifiedAtLeastOnce = false;
|
47
|
+
_isNull = false;
|
48
|
+
_clearVectorType = true;
|
49
|
+
_vectorType = null;
|
50
|
+
static _variableChangeEvts = new List();
|
51
|
+
constructor(dataview, id) {
|
52
|
+
super(id);
|
53
|
+
if (Field.NUM0 === null) {
|
54
|
+
Field.NUM0 = new NUM_TYPE();
|
55
|
+
Field.NUM1 = new NUM_TYPE();
|
56
|
+
Field.NUM0.NUM_4_LONG(0);
|
57
|
+
Field.NUM1.NUM_4_LONG(1);
|
58
|
+
}
|
59
|
+
this._dataview = dataview;
|
60
|
+
this._linkExp = new YesNoExp(false);
|
61
|
+
FieldDef._default_date = DisplayConvertor.Instance.disp2mg(PICInterface.DEFAULT_DATE, new PIC("6", StorageAttribute.NUMERIC, super.getTask().getCompIdx()), super.getTask().getCompIdx(), BlobType.CONTENT_TYPE_UNKNOWN);
|
62
|
+
}
|
63
|
+
get VirAsReal() {
|
64
|
+
return this._virAsReal;
|
65
|
+
}
|
66
|
+
get IsVirtual() {
|
67
|
+
return this._isVirtual;
|
68
|
+
}
|
69
|
+
get IsExposedRouteParam() {
|
70
|
+
return this._isExposedRouteParam;
|
71
|
+
}
|
72
|
+
get IsExposedToClient() {
|
73
|
+
return this._isExposedToClient;
|
74
|
+
}
|
75
|
+
get IndexInTable() {
|
76
|
+
return this._indexInTable;
|
77
|
+
}
|
78
|
+
setAttribute(attribute, valueStr) {
|
79
|
+
let isTagProcessed = super.setAttribute(attribute, valueStr);
|
80
|
+
if (!isTagProcessed) {
|
81
|
+
let data = StrUtil.tokenize(valueStr, ",");
|
82
|
+
isTagProcessed = true;
|
83
|
+
switch (attribute) {
|
84
|
+
case ConstInterface.MG_ATTR_VIRTUAL:
|
85
|
+
this._isVirtual = (XmlParser.getInt(valueStr) !== 0);
|
86
|
+
break;
|
87
|
+
case ConstInterface.MG_ATTR_PARAM:
|
88
|
+
this._isParam = (XmlParser.getInt(valueStr) !== 0);
|
89
|
+
if (!this._isVirtual && this._isParam)
|
90
|
+
throw new ApplicationException("in Field.initElements(): non virtual field is defined as a parameter");
|
91
|
+
break;
|
92
|
+
case ConstInterface.MG_ATTR_EXPOSED_ROUTE_PARAMS:
|
93
|
+
this._isExposedRouteParam = (XmlParser.getInt(valueStr) !== 0);
|
94
|
+
if (!this._isParam && this._isExposedRouteParam)
|
95
|
+
throw new ApplicationException("in Field.initElements(): non parameter field is defined as a exposed route parameter");
|
96
|
+
break;
|
97
|
+
case ConstInterface.MG_ATTR_EXPOSED_TO_CLIENT:
|
98
|
+
if (XmlParser.getInt(valueStr) == 0)
|
99
|
+
this._isExposedToClient = false;
|
100
|
+
break;
|
101
|
+
case ConstInterface.MG_ATTR_VIR_AS_REAL:
|
102
|
+
this._virAsReal = XmlParser.getBoolean(valueStr);
|
103
|
+
break;
|
104
|
+
case ConstInterface.MG_ATTR_LNK_CREATE:
|
105
|
+
this._linkCreate = XmlParser.getBoolean(valueStr);
|
106
|
+
break;
|
107
|
+
case ConstInterface.MG_ATTR_LNKEXP:
|
108
|
+
this._linkExp.setVal((this.getTask()), valueStr);
|
109
|
+
break;
|
110
|
+
case ConstInterface.MG_ATTR_TABLE_NAME:
|
111
|
+
this._tableName = XmlParser.unescape(valueStr);
|
112
|
+
break;
|
113
|
+
case ConstInterface.MG_ATTR_INDEX_IN_TABLE:
|
114
|
+
this._indexInTable = XmlParser.getInt(valueStr);
|
115
|
+
break;
|
116
|
+
case ConstInterface.MG_ATTR_INIT:
|
117
|
+
let expNum = XmlParser.getInt(valueStr);
|
118
|
+
this._initExp = this.getTask().getExpById(expNum);
|
119
|
+
break;
|
120
|
+
case XMLConstants.MG_ATTR_NAME:
|
121
|
+
{
|
122
|
+
}
|
123
|
+
break;
|
124
|
+
case ConstInterface.MG_ATTR_CHACHED_FLD_ID:
|
125
|
+
if (data[0] != "")
|
126
|
+
this.CacheTableFldIdx = NNumber.Parse(data[1]);
|
127
|
+
break;
|
128
|
+
case ConstInterface.MG_ATTR_LOCATE:
|
129
|
+
this.Locate = new Boundary(this.getTask(), NNumber.Parse(data[1]), NNumber.Parse(data[0]), this.getType(), this.getSize(), this.CacheTableFldIdx);
|
130
|
+
break;
|
131
|
+
case ConstInterface.MG_ATTR_RANGE:
|
132
|
+
this.Range = new Boundary(this.getTask(), NNumber.Parse(data[1]), NNumber.Parse(data[0]), this.getType(), this.getSize(), this.CacheTableFldIdx);
|
133
|
+
break;
|
134
|
+
case ConstInterface.MG_ATTR_LINK:
|
135
|
+
this._dataviewHeaderId = NNumber.Parse(valueStr);
|
136
|
+
break;
|
137
|
+
case ConstInterface.MG_ATTR_IS_LINK_FIELD:
|
138
|
+
this._isLinkFld = XmlParser.getBoolean(valueStr);
|
139
|
+
break;
|
140
|
+
default:
|
141
|
+
isTagProcessed = false;
|
142
|
+
Logger.Instance.WriteExceptionToLogWithMsg(NString.Format("Unrecognized attribute: '{0}'", attribute));
|
143
|
+
break;
|
144
|
+
}
|
145
|
+
}
|
146
|
+
return isTagProcessed;
|
147
|
+
}
|
148
|
+
setRecompute(recompRef) {
|
149
|
+
this._recompute = recompRef;
|
150
|
+
}
|
151
|
+
RemoveSubformFromRecompute(subformTask) {
|
152
|
+
if (this._recompute !== null) {
|
153
|
+
this._recompute.RemoveSubform(subformTask);
|
154
|
+
}
|
155
|
+
}
|
156
|
+
AddSubformRecompute(subformTask) {
|
157
|
+
if (this._recompute === null) {
|
158
|
+
this._recompute = new Recompute();
|
159
|
+
this._recompute.Task = super.getTask();
|
160
|
+
this._recompute.OwnerFld = this;
|
161
|
+
this._recompute.RcmpMode = Recompute_RcmpBy.CLIENT;
|
162
|
+
}
|
163
|
+
this._recompute.AddSubform(subformTask);
|
164
|
+
}
|
165
|
+
SetControl(ctrl) {
|
166
|
+
super.SetControl(ctrl);
|
167
|
+
if (this._isVirtual && ctrl.IsRepeatable && this._initExp === null) {
|
168
|
+
this._causeTableInvalidation = true;
|
169
|
+
}
|
170
|
+
}
|
171
|
+
async compute(recompute) {
|
172
|
+
let result = new RefParam(this.getValue(false));
|
173
|
+
let isNullFld = new RefParam(this._isNull);
|
174
|
+
let rec = this._dataview.getCurrRec();
|
175
|
+
let task = super.getTask();
|
176
|
+
let zeroReal = this._linkCreate && rec.InCompute && !recompute && task.getMode() === Constants.TASK_MODE_CREATE;
|
177
|
+
if (this._form == null)
|
178
|
+
this._form = task.getForm();
|
179
|
+
if ((this._form != null && this._form.InRestore) || AccessHelper.eventsManager.GetStopExecutionFlag())
|
180
|
+
zeroReal = false;
|
181
|
+
let rtEvt = AccessHelper.eventsManager.getLastRtEvent();
|
182
|
+
let computeOnCancelEvent = false;
|
183
|
+
if (rtEvt != null)
|
184
|
+
computeOnCancelEvent = rtEvt.getInternalCode() === InternalInterface.MG_ACT_CANCEL;
|
185
|
+
if (!this._virAsReal && (this._form == null || !this._form.InRestore) &&
|
186
|
+
((this._isVirtual || (task.getMode() === Constants.TASK_MODE_CREATE && computeOnCancelEvent)) || recompute ||
|
187
|
+
zeroReal || rec.isNewRec() && !rec.isComputed())) {
|
188
|
+
if (!task.DataView.isEmptyDataview() || (task.DataView.isEmptyDataview() && !this.PartOfDataview)) {
|
189
|
+
if ((this._isVirtual || task.getMode() === Constants.TASK_MODE_CREATE) || this._dataview.computeByClient() ||
|
190
|
+
!rec.InCompute || zeroReal || rec.lateCompute()) {
|
191
|
+
if (this._initExp != null) {
|
192
|
+
await this.EvaluateInitExpression(result, isNullFld);
|
193
|
+
}
|
194
|
+
else if (zeroReal)
|
195
|
+
result.value = this.getDefaultValue();
|
196
|
+
}
|
197
|
+
}
|
198
|
+
}
|
199
|
+
if (this._invalidValue) {
|
200
|
+
this._prevValue = result.value;
|
201
|
+
this._prevIsNull = isNullFld.value;
|
202
|
+
}
|
203
|
+
await this.setValue(result.value, isNullFld.value, recompute, false, recompute && !this._isVirtual, false, false);
|
204
|
+
}
|
205
|
+
async EvaluateInitExpression(result, isNullFld) {
|
206
|
+
Debug.Assert(this._initExp !== null);
|
207
|
+
try {
|
208
|
+
this._inEvalProcess = true;
|
209
|
+
result.value = await this._initExp.evaluateWithResultTypeAndLength(this._type, this._size);
|
210
|
+
}
|
211
|
+
finally {
|
212
|
+
this._inEvalProcess = false;
|
213
|
+
}
|
214
|
+
isNullFld.value = (result.value === null);
|
215
|
+
if (isNullFld.value && this.NullAllowed) {
|
216
|
+
result.value = this.getValue(false);
|
217
|
+
}
|
218
|
+
}
|
219
|
+
getValue(checkNullArithmetic) {
|
220
|
+
if (super.getTask().getEvalOldValues())
|
221
|
+
return this.getOriginalValue();
|
222
|
+
if (this._invalidValue)
|
223
|
+
this.takeValFromRec();
|
224
|
+
if (this._isNull)
|
225
|
+
this._val = this.getValueForNull(checkNullArithmetic);
|
226
|
+
return this._val;
|
227
|
+
}
|
228
|
+
isChanged(newValue, isNull) {
|
229
|
+
return this._prevValue !== null && (!(this._prevValue === newValue) || this._prevIsNull !== isNull);
|
230
|
+
}
|
231
|
+
takeValFromRec() {
|
232
|
+
let rec = this._dataview.getCurrRec();
|
233
|
+
if (rec !== null) {
|
234
|
+
this._val = rec.GetFieldValue(this._id);
|
235
|
+
this._isNull = rec.IsNull(this._id);
|
236
|
+
}
|
237
|
+
if (this._invalidValue) {
|
238
|
+
if (rec !== null && this._causeTableInvalidation && this.isChanged(this._val, this._isNull) && this._form !== null) {
|
239
|
+
rec.setCauseInvalidation(true);
|
240
|
+
}
|
241
|
+
this._prevValue = this._val;
|
242
|
+
this._prevIsNull = this._isNull;
|
243
|
+
this._invalidValue = false;
|
244
|
+
}
|
245
|
+
this._vectorType = null;
|
246
|
+
}
|
247
|
+
getOriginalValue() {
|
248
|
+
let originalRec = this._dataview.getOriginalRec();
|
249
|
+
if (originalRec.IsNull(this._id))
|
250
|
+
return this.getMagicDefaultValue();
|
251
|
+
return originalRec.GetFieldValue(this._id);
|
252
|
+
}
|
253
|
+
isOriginalValueNull() {
|
254
|
+
let originalRec = this._dataview.getOriginalRec();
|
255
|
+
return originalRec.IsNull(this._id);
|
256
|
+
}
|
257
|
+
getValueByRecIdx(idx) {
|
258
|
+
let rec = this._dataview.getRecByIdx(idx);
|
259
|
+
let fieldValue = rec.GetFieldValue(this._id);
|
260
|
+
return rec.IsNull(this._id) ? this.getValueForNull(false) : fieldValue;
|
261
|
+
}
|
262
|
+
getModifiedAtLeastOnce() {
|
263
|
+
return this.modifiedAtLeastOnce;
|
264
|
+
}
|
265
|
+
isNullByRecIdx(idx) {
|
266
|
+
let rec = this._dataview.getRecByIdx(idx);
|
267
|
+
return rec.IsNull(this._id);
|
268
|
+
}
|
269
|
+
isEqual(mgValue, isNullFld, type, recIdx) {
|
270
|
+
let rec = (this._dataview.getRecByIdx(recIdx));
|
271
|
+
let valsEqual = false;
|
272
|
+
if (rec != null) {
|
273
|
+
let fieldValue = rec.GetFieldValue(this._id);
|
274
|
+
let fielsIsNull = rec.IsNull(this._id);
|
275
|
+
valsEqual = ExpressionEvaluator.mgValsEqual(fieldValue, fielsIsNull, this._type, mgValue, isNullFld, type);
|
276
|
+
}
|
277
|
+
return valsEqual;
|
278
|
+
}
|
279
|
+
getNewRecValue(clobberedOnly) {
|
280
|
+
if (this._isVirtual && this._initExp == null)
|
281
|
+
return this._val;
|
282
|
+
return !clobberedOnly ? this.getDefaultValue() : null;
|
283
|
+
}
|
284
|
+
async setValueAndStartRecompute(val, isNullFld, recompute, setRecordUpdated, isArgUpdate, enforceVariableChange) {
|
285
|
+
if (isNullOrUndefined(enforceVariableChange))
|
286
|
+
enforceVariableChange = false;
|
287
|
+
await this.setValueAndStartRecompute_1(val, isNullFld, recompute, setRecordUpdated, isArgUpdate, false);
|
288
|
+
}
|
289
|
+
async setValueAndStartRecompute_1(val, isNullFld, recompute, setRecordUpdated, isArgUpdate, enforceVariableChange) {
|
290
|
+
let task = this.getTask();
|
291
|
+
if (task != null)
|
292
|
+
task.VewFirst++;
|
293
|
+
let valueWasUpdated = await this.setValue(val, isNullFld, recompute, setRecordUpdated, !this._isVirtual, isArgUpdate, enforceVariableChange);
|
294
|
+
if (task !== null && task.VewFirst === 1 && this._form !== null && !this.IsEventHandlerField) {
|
295
|
+
if (recompute && valueWasUpdated)
|
296
|
+
await this._form.refreshOnExpressions();
|
297
|
+
}
|
298
|
+
if (task != null)
|
299
|
+
task.VewFirst--;
|
300
|
+
}
|
301
|
+
async setValue(newVal, isNullFld, recompute, setRecordModified, setCrsrModified, isArgUpdate, enforceValiableChange) {
|
302
|
+
let rec;
|
303
|
+
let recFldVal;
|
304
|
+
let valsEqual = false;
|
305
|
+
let remainder;
|
306
|
+
let zeroReal;
|
307
|
+
let args = null;
|
308
|
+
let mainCtrl = this.getCtrl();
|
309
|
+
let pendingEvents;
|
310
|
+
let evts;
|
311
|
+
let forceUpdate = false;
|
312
|
+
let checkForVariableChange = recompute || enforceValiableChange;
|
313
|
+
let task = this.getTask();
|
314
|
+
if (this._form === null)
|
315
|
+
this._form = task.getForm();
|
316
|
+
if (isNullFld && !this.NullAllowed && this._type !== StorageAttribute.BLOB_VECTOR) {
|
317
|
+
newVal = this.getDefaultValue();
|
318
|
+
isNullFld = false;
|
319
|
+
}
|
320
|
+
if (this._type === StorageAttribute.NUMERIC && newVal != null && !NUM_TYPE.numHexStrIsLong(newVal)) {
|
321
|
+
let numVal = new NUM_TYPE(newVal);
|
322
|
+
let pic = new PIC(this._picture, this._type, super.getTask().getCompIdx());
|
323
|
+
let decs = pic.getDec();
|
324
|
+
numVal.round(decs);
|
325
|
+
newVal = numVal.toXMLrecord();
|
326
|
+
}
|
327
|
+
rec = this._dataview.getCurrRec();
|
328
|
+
if (rec == null)
|
329
|
+
throw new ApplicationException(LanguageData.Instance.getConstMessage(MsgInterface.RT_STR_NO_RECS_IN_RNG));
|
330
|
+
if (!this.IsVirtual &&
|
331
|
+
(task.getMode() === Constants.TASK_MODE_QUERY &&
|
332
|
+
!Environment.Instance.allowUpdateInQueryMode(task.getCompIdx())
|
333
|
+
|| rec.InForceUpdate && rec.InCompute))
|
334
|
+
return !valsEqual;
|
335
|
+
if (checkForVariableChange && this.getHasChangeEvent()) {
|
336
|
+
let argsList = new Array(2);
|
337
|
+
argsList[0] = new ExpVal(StorageAttribute.NUMERIC, false, (mainCtrl !== null && mainCtrl.IsInteractiveUpdate
|
338
|
+
? Field.NUM0.toXMLrecord()
|
339
|
+
: Field.NUM1.toXMLrecord()));
|
340
|
+
argsList[1] = new ExpVal(this.getType(), this.isNull(), this.getValue(false));
|
341
|
+
args = new ArgumentsList(argsList);
|
342
|
+
}
|
343
|
+
if (mainCtrl != null)
|
344
|
+
mainCtrl.IsInteractiveUpdate = false;
|
345
|
+
if (this._type !== StorageAttribute.UNICODE && UtilStrByteMode.isLocaleDefLangDBCS()) {
|
346
|
+
if (newVal != null)
|
347
|
+
remainder = this._size - UtilStrByteMode.lenB(newVal);
|
348
|
+
else
|
349
|
+
remainder = 0;
|
350
|
+
if (newVal != null && this._type !== StorageAttribute.BLOB && this._type !== StorageAttribute.BLOB_VECTOR &&
|
351
|
+
remainder < 0)
|
352
|
+
this._val = UtilStrByteMode.leftB(newVal, this._size);
|
353
|
+
else if (this._type === StorageAttribute.ALPHA && remainder > 0)
|
354
|
+
this._val = newVal + NString.FromChars(this._spaces, 0, remainder);
|
355
|
+
else if (this._type === StorageAttribute.BLOB)
|
356
|
+
this._val = BlobType.copyBlob(this._val, newVal);
|
357
|
+
else
|
358
|
+
this._val = newVal;
|
359
|
+
}
|
360
|
+
else {
|
361
|
+
if (newVal != null)
|
362
|
+
remainder = this._size - newVal.length;
|
363
|
+
else
|
364
|
+
remainder = 0;
|
365
|
+
if (newVal != null && this._type !== StorageAttribute.BLOB && this._type !== StorageAttribute.BLOB_VECTOR && remainder < 0)
|
366
|
+
this._val = newVal.substr(0, this._size);
|
367
|
+
else if ((this._type === StorageAttribute.ALPHA || this._type === StorageAttribute.UNICODE) && remainder > 0)
|
368
|
+
this._val = newVal + NString.FromChars(this._spaces, 0, remainder);
|
369
|
+
else if (this._type === StorageAttribute.BLOB) {
|
370
|
+
if (this._val === null)
|
371
|
+
this._val = this.getMagicDefaultValue();
|
372
|
+
this._val = BlobType.copyBlob(this._val, newVal);
|
373
|
+
}
|
374
|
+
else
|
375
|
+
this._val = newVal;
|
376
|
+
}
|
377
|
+
{
|
378
|
+
recFldVal = rec.GetFieldValue(this._id);
|
379
|
+
let oldNullVal = this._isNull;
|
380
|
+
if (!recompute && !isArgUpdate && this._initExp == null)
|
381
|
+
oldNullVal = rec.IsNull(this._id);
|
382
|
+
try {
|
383
|
+
valsEqual = ExpressionEvaluator.mgValsEqual(this._val, isNullFld, this._type, recFldVal, oldNullVal, this._type);
|
384
|
+
}
|
385
|
+
catch (exception) {
|
386
|
+
this._val = this.getMagicDefaultValue();
|
387
|
+
valsEqual = false;
|
388
|
+
}
|
389
|
+
}
|
390
|
+
if (this._clearVectorType)
|
391
|
+
this._vectorType = null;
|
392
|
+
if (this._invalidValue) {
|
393
|
+
this._invalidValue = false;
|
394
|
+
rec.clearFlag(this._id, Record.FLAG_UPDATED);
|
395
|
+
rec.clearFlag(this._id, Record.FLAG_MODIFIED);
|
396
|
+
}
|
397
|
+
zeroReal = this._linkCreate && rec.InCompute && !recompute && (this._form == null || !this._form.InRestore) &&
|
398
|
+
!AccessHelper.eventsManager.GetStopExecutionFlag();
|
399
|
+
if ((this._isVirtual || zeroReal) && !rec.isNewRec() && !valsEqual)
|
400
|
+
forceUpdate = true;
|
401
|
+
if (checkForVariableChange || forceUpdate || rec.isNewRec()) {
|
402
|
+
this.UpdateNull(isNullFld, rec);
|
403
|
+
if (setCrsrModified)
|
404
|
+
rec.setFlag(this._id, Record.FLAG_CRSR_MODIFIED);
|
405
|
+
rec.setFieldValue(this._id, this._val, setRecordModified);
|
406
|
+
evts = Field._variableChangeEvts;
|
407
|
+
pendingEvents = evts.length;
|
408
|
+
if (checkForVariableChange && this.getHasChangeEvent() && !evts.Contains(this) && !valsEqual) {
|
409
|
+
let rtEvt = new RunTimeEvent(this);
|
410
|
+
rtEvt.setInternal(InternalInterface.MG_ACT_VARIABLE);
|
411
|
+
rtEvt.setArgList(args);
|
412
|
+
evts.push(this);
|
413
|
+
evts.push(rtEvt);
|
414
|
+
}
|
415
|
+
if (this._recompute != null && (recompute || forceUpdate) && !this._dataview.InLocalDataviewCommand) {
|
416
|
+
try {
|
417
|
+
if (forceUpdate)
|
418
|
+
rec.InForceUpdate = true;
|
419
|
+
await this._recompute.execute(rec);
|
420
|
+
}
|
421
|
+
finally {
|
422
|
+
if (forceUpdate)
|
423
|
+
rec.InForceUpdate = false;
|
424
|
+
}
|
425
|
+
}
|
426
|
+
if (this._causeTableInvalidation && this.isChanged(this._val, isNullFld))
|
427
|
+
rec.setCauseInvalidation(true);
|
428
|
+
if ((recompute || forceUpdate) && !this._dataview.InLocalDataviewCommand && mainCtrl != null) {
|
429
|
+
if (mainCtrl.isChoiceControl())
|
430
|
+
await this.updateDisplay();
|
431
|
+
}
|
432
|
+
if (pendingEvents === 0 && checkForVariableChange && this.getHasChangeEvent()) {
|
433
|
+
while (evts.length > 0) {
|
434
|
+
let evt = evts.get_Item(1);
|
435
|
+
evts.RemoveAt(0);
|
436
|
+
evts.RemoveAt(0);
|
437
|
+
if (LastFocusedManager.Instance.getLastFocusedTask() == null)
|
438
|
+
evt.setTask(this.getTask());
|
439
|
+
else {
|
440
|
+
let taskRef = LastFocusedManager.Instance.getLastFocusedTask();
|
441
|
+
if (taskRef.TaskSuffixExecuted) {
|
442
|
+
taskRef = (taskRef.PathParentTask != null) ? taskRef.PathParentTask : taskRef;
|
443
|
+
}
|
444
|
+
evt.setTask(taskRef);
|
445
|
+
}
|
446
|
+
evt.setCtrl(LastFocusedManager.getLastFocusedControl());
|
447
|
+
await AccessHelper.eventsManager.handleEvent(evt, false);
|
448
|
+
}
|
449
|
+
}
|
450
|
+
}
|
451
|
+
if (recompute && !valsEqual)
|
452
|
+
this.setModified();
|
453
|
+
return !valsEqual;
|
454
|
+
}
|
455
|
+
UpdateNull(isNullFld, rec) {
|
456
|
+
if (isNullFld)
|
457
|
+
rec.setFlag(this._id, Record.FLAG_NULL);
|
458
|
+
else
|
459
|
+
rec.clearFlag(this._id, Record.FLAG_NULL);
|
460
|
+
this._isNull = isNullFld;
|
461
|
+
}
|
462
|
+
async setCellVecValue(idx, newVal, valIsNull) {
|
463
|
+
let res = false;
|
464
|
+
if (this._type === StorageAttribute.BLOB_VECTOR) {
|
465
|
+
if (this._vectorType == null) {
|
466
|
+
this._vectorType = this.isNull()
|
467
|
+
? new VectorType(this._vecCellsType, this._vecCellsContentType, this.DefaultValue, this.isNullDefault(), this.NullAllowed, this._vecCellsSize)
|
468
|
+
: new VectorType(this._val);
|
469
|
+
}
|
470
|
+
if (this._vecCellsType === StorageAttribute.BLOB) {
|
471
|
+
let tmpNewVal = this.getCellDefualtValue();
|
472
|
+
newVal = BlobType.copyBlob(tmpNewVal, newVal);
|
473
|
+
}
|
474
|
+
res = this._vectorType.setVecCell(idx, newVal, valIsNull);
|
475
|
+
if (res) {
|
476
|
+
this._clearVectorType = false;
|
477
|
+
await this.setValueAndStartRecompute(this._vectorType.toString(), false, true, false, false);
|
478
|
+
this._clearVectorType = true;
|
479
|
+
}
|
480
|
+
}
|
481
|
+
return res;
|
482
|
+
}
|
483
|
+
getVecCellValue(idx) {
|
484
|
+
if (this._type === StorageAttribute.BLOB_VECTOR) {
|
485
|
+
if (this._vectorType == null)
|
486
|
+
this._vectorType = new VectorType(this._val);
|
487
|
+
return this._vectorType.getVecCell(idx);
|
488
|
+
}
|
489
|
+
return null;
|
490
|
+
}
|
491
|
+
setRecomputed() {
|
492
|
+
}
|
493
|
+
invalidate(forceInvalidate, clearFlags) {
|
494
|
+
let rec = this._dataview.getCurrRec();
|
495
|
+
if (!this._isVirtual || this._virAsReal || this._initExp !== null || forceInvalidate) {
|
496
|
+
this._invalidValue = true;
|
497
|
+
}
|
498
|
+
if (clearFlags && rec !== null) {
|
499
|
+
rec.clearFlag(this._id, Record.FLAG_UPDATED);
|
500
|
+
rec.clearFlag(this._id, Record.FLAG_MODIFIED);
|
501
|
+
}
|
502
|
+
}
|
503
|
+
getTableName() {
|
504
|
+
if (this._tableName == null)
|
505
|
+
return "";
|
506
|
+
return this._tableName;
|
507
|
+
}
|
508
|
+
getName() {
|
509
|
+
if (this._isParam)
|
510
|
+
return "Parameter." + this.getVarName();
|
511
|
+
else if (this._isVirtual)
|
512
|
+
return "Virtual." + this.getVarName();
|
513
|
+
else
|
514
|
+
return this.getTableName() + "." + this.getVarName();
|
515
|
+
}
|
516
|
+
isNull() {
|
517
|
+
if (super.getTask().getEvalOldValues())
|
518
|
+
return this.isOriginalValueNull();
|
519
|
+
else if (this._invalidValue)
|
520
|
+
this.takeValFromRec();
|
521
|
+
return this._isNull;
|
522
|
+
}
|
523
|
+
PrevIsNull() {
|
524
|
+
return this._prevIsNull;
|
525
|
+
}
|
526
|
+
isModified() {
|
527
|
+
let currRec = this._dataview.getCurrRec();
|
528
|
+
return currRec.isFldModified(this._id);
|
529
|
+
}
|
530
|
+
setModified() {
|
531
|
+
let rec = (this._dataview.getCurrRec());
|
532
|
+
rec.setFlag(this._id, Record.FLAG_MODIFIED);
|
533
|
+
rec.setFlag(this._id, Record.FLAG_MODIFIED_ATLEAST_ONCE);
|
534
|
+
if (this.IsVirtual)
|
535
|
+
this.modifiedAtLeastOnce = true;
|
536
|
+
}
|
537
|
+
setUpdated() {
|
538
|
+
let currRec = this._dataview.getCurrRec();
|
539
|
+
currRec.setFlag(this._id, Record.FLAG_UPDATED);
|
540
|
+
currRec.setUpdated();
|
541
|
+
}
|
542
|
+
isParam() {
|
543
|
+
return this._isParam;
|
544
|
+
}
|
545
|
+
isInEvalProcess() {
|
546
|
+
return this._inEvalProcess;
|
547
|
+
}
|
548
|
+
hasInitExp() {
|
549
|
+
return this._initExp !== null;
|
550
|
+
}
|
551
|
+
isServerRcmp() {
|
552
|
+
return this._recompute !== null && this._recompute.isServerRcmp();
|
553
|
+
}
|
554
|
+
getPicture() {
|
555
|
+
return this._picture;
|
556
|
+
}
|
557
|
+
getDataviewHeaderId() {
|
558
|
+
return this._dataviewHeaderId;
|
559
|
+
}
|
560
|
+
get IsLinkField() {
|
561
|
+
return this._isLinkFld;
|
562
|
+
}
|
563
|
+
async getInitExpVal(res, isNull) {
|
564
|
+
if (this._initExp != null)
|
565
|
+
await this.EvaluateInitExpression(res, isNull);
|
566
|
+
else
|
567
|
+
res.value = this.getDefaultValue();
|
568
|
+
}
|
569
|
+
setHasChangeEvent() {
|
570
|
+
this._hasChangeEvent = true;
|
571
|
+
}
|
572
|
+
getHasChangeEvent() {
|
573
|
+
return this._hasChangeEvent;
|
574
|
+
}
|
575
|
+
setHasZoomHandler() {
|
576
|
+
this._hasZoomHandler = true;
|
577
|
+
}
|
578
|
+
getHasZoomHandler() {
|
579
|
+
return this._hasZoomHandler;
|
580
|
+
}
|
581
|
+
isCauseTableInvalidation() {
|
582
|
+
return this._causeTableInvalidation;
|
583
|
+
}
|
584
|
+
causeTableInvalidation(causeTableInvalidation) {
|
585
|
+
this._causeTableInvalidation = causeTableInvalidation;
|
586
|
+
}
|
587
|
+
getValueForNull(checkNullArithmetic) {
|
588
|
+
let val;
|
589
|
+
if (this.NullAllowed) {
|
590
|
+
if (checkNullArithmetic && super.getTask().getNullArithmetic() === Constants.NULL_ARITH_NULLIFY) {
|
591
|
+
val = null;
|
592
|
+
}
|
593
|
+
else {
|
594
|
+
if (this._nullValue === null) {
|
595
|
+
this._nullValue = super.getMagicDefaultValue();
|
596
|
+
}
|
597
|
+
val = this._nullValue;
|
598
|
+
}
|
599
|
+
}
|
600
|
+
else {
|
601
|
+
val = super.getMagicDefaultValue();
|
602
|
+
}
|
603
|
+
return val;
|
604
|
+
}
|
605
|
+
getCtrl() {
|
606
|
+
let ctrl;
|
607
|
+
if (this._controls != null) {
|
608
|
+
for (let i = 0; i < this._controls.length; i++) {
|
609
|
+
ctrl = this._controls.get_Item(i);
|
610
|
+
if (ctrl.getForm().getTask() === this.getTask())
|
611
|
+
return ctrl;
|
612
|
+
}
|
613
|
+
}
|
614
|
+
return null;
|
615
|
+
}
|
616
|
+
async updateDisplay() {
|
617
|
+
await super.updateDisplayWithValue(this.getDispValue(), this.isNull());
|
618
|
+
}
|
619
|
+
getDispValue() {
|
620
|
+
if (this.isNull()) {
|
621
|
+
if (this._nullDisplay != null)
|
622
|
+
return this.getNullDisplay();
|
623
|
+
else
|
624
|
+
return super.getMagicDefaultValue();
|
625
|
+
}
|
626
|
+
else
|
627
|
+
return this.getValue(false);
|
628
|
+
}
|
629
|
+
get ShouldCheckRangeInCompute() {
|
630
|
+
return this.IsLinkField || (this.IsVirtual && this._dataview.HasMainTable);
|
631
|
+
}
|
632
|
+
IsForArgument(taskHasParameters) {
|
633
|
+
if (taskHasParameters) {
|
634
|
+
if (!this.isParam()) {
|
635
|
+
return false;
|
636
|
+
}
|
637
|
+
}
|
638
|
+
else {
|
639
|
+
if (!this.IsVirtual) {
|
640
|
+
return false;
|
641
|
+
}
|
642
|
+
}
|
643
|
+
return true;
|
644
|
+
}
|
645
|
+
}
|
646
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmllbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbmdpbmUvc3JjL2RhdGEvRmllbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLG9CQUFvQixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUN0SCxPQUFPLEVBQ0wsU0FBUyxFQUNULGlCQUFpQixFQUNqQixNQUFNLEVBQ04sWUFBWSxFQUNaLFlBQVksRUFDWixnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLGVBQWUsRUFDZixZQUFZLEVBQ1osU0FBUyxFQUNWLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUNMLFFBQVEsRUFDUixnQkFBZ0IsRUFDaEIsTUFBTSxFQUNOLFFBQVEsRUFFUixRQUFRLEVBQ1IsR0FBRyxFQUNILFVBQVUsRUFDWCxNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUcvRCxPQUFPLEVBQUMsU0FBUyxFQUFFLGdCQUFnQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFakQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ25ELE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFFaEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2pELE9BQU8sRUFB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QVk7UUFDakIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDakIsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUk7Z0JBQzNCLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDOztnQkFDMUIsT0FBTyxLQUFLLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztTQUMxQzs7WUFDSSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUtELElBQUkseUJBQXlCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQWUsSUFBSSxDQUFDLFNBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBRUQsYUFBYSxDQUFDLGlCQUEwQjtRQUV0QyxJQUFJLGlCQUFpQixFQUFFO1lBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQ25CLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7U0FDRjthQUNJO1lBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ25CLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7U0FDRjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QXBwbGljYXRpb25FeGNlcHRpb24sIERlYnVnLCBMaXN0LCBOTnVtYmVyLCBOU3RyaW5nLCBSZWZQYXJhbSwgaXNOdWxsT3JVbmRlZmluZWR9IGZyb20gXCJAbWFnaWMteHBhL21zY29yZWxpYlwiO1xyXG5pbXBvcnQge1xyXG4gIENvbnN0YW50cyxcclxuICBJbnRlcm5hbEludGVyZmFjZSxcclxuICBMb2dnZXIsXHJcbiAgTXNnSW50ZXJmYWNlLFxyXG4gIFBJQ0ludGVyZmFjZSxcclxuICBTdG9yYWdlQXR0cmlidXRlLFxyXG4gIFN0clV0aWwsXHJcbiAgVXRpbFN0ckJ5dGVNb2RlLFxyXG4gIFhNTENvbnN0YW50cyxcclxuICBYbWxQYXJzZXJcclxufSBmcm9tIFwiQG1hZ2ljLXhwYS91dGlsc1wiO1xyXG5pbXBvcnQge1xyXG4gIEJsb2JUeXBlLFxyXG4gIERpc3BsYXlDb252ZXJ0b3IsXHJcbiAgRXhwVmFsLFxyXG4gIEZpZWxkRGVmLFxyXG4gIE1nQ29udHJvbEJhc2UsXHJcbiAgTlVNX1RZUEUsXHJcbiAgUElDLFxyXG4gIFZlY3RvclR5cGVcclxufSBmcm9tIFwiQG1hZ2ljLXhwYS9ndWlcIjtcclxuXHJcbmltcG9ydCB7WWVzTm9FeHB9IGZyb20gXCIuLi9leHAvWWVzTm9FeHBcIjtcclxuaW1wb3J0IHtFeHByZXNzaW9ufSBmcm9tIFwiLi4vZXhwL0V4cHJlc3Npb25cIjtcclxuaW1wb3J0IHtFeHByZXNzaW9uRXZhbHVhdG9yfSBmcm9tIFwiLi4vZXhwL0V4cHJlc3Npb25FdmFsdWF0b3JcIjtcclxuaW1wb3J0IHtNZ0Zvcm19IGZyb20gXCIuLi9ndWkvTWdGb3JtXCI7XHJcbmltcG9ydCB7TWdDb250cm9sfSBmcm9tIFwiLi4vZ3VpL01nQ29udHJvbFwiO1xyXG5pbXBvcnQge1JlY29tcHV0ZSwgUmVjb21wdXRlX1JjbXBCeX0gZnJvbSBcIi4uL3J0L1JlY29tcHV0ZVwiO1xyXG5pbXBvcnQge0JvdW5kYXJ5fSBmcm9tIFwiLi4vcnQvQm91bmRhcnlcIjtcclxuaW1wb3J0IHtBcmd1bWVudHNMaXN0fSBmcm9tIFwiLi4vcnQvQXJndW1lbnRzTGlzdFwiO1xyXG5pbXBvcnQge0NvbnN0SW50ZXJmYWNlfSBmcm9tIFwiLi4vQ29uc3RJbnRlcmZhY2VcIjtcclxuaW1wb3J0IHtUYXNrfSBmcm9tIFwiLi4vdGFza3MvVGFza1wiO1xyXG5pbXBvcnQge1J1blRpbWVFdmVudH0gZnJvbSBcIi4uL2V2ZW50L1J1blRpbWVFdmVudFwiO1xyXG5pbXBvcnQge1JlY29yZH0gZnJvbSBcIi4vUmVjb3JkXCI7XHJcbmltcG9ydCB7RGF0YVZpZXd9IGZyb20gXCIuL0RhdGFWaWV3XCI7XHJcbmltcG9ydCB7IEVudmlyb25tZW50IH0gZnJvbSBcIi4uL2Vudi9FbnZpcm9ubWVudFwiO1xyXG5pbXBvcnQgeyBGaWVsZEJhc2UgfSBmcm9tIFwiLi9GaWVsZEJhc2VcIjtcclxuaW1wb3J0IHsgTGFzdEZvY3VzZWRNYW5hZ2VyIH0gZnJvbSBcIi4uL3J0L0xhc3RGb2N1c2VkTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBMYW5ndWFnZURhdGEgfSBmcm9tIFwiLi4vZW52L0xhbmd1YWdlRGF0YVwiO1xyXG5pbXBvcnQgeyBBY2Nlc3NIZWxwZXIgfSBmcm9tIFwiLi4vQWNjZXNzSGVscGVyXCI7XHJcblxyXG4vLy8gPHN1bW1hcnk+XHJcbi8vLyAgIGRhdGEgZm9yIDxmbGRoIC4uLj5cclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGNsYXNzIEZpZWxkIGV4dGVuZHMgRmllbGRCYXNlIHtcclxuICBzdGF0aWMgTEVBVkVfRkxBR1M6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgTlVNMDogTlVNX1RZUEUgPSBudWxsO1xyXG4gIHByaXZhdGUgc3RhdGljIE5VTTE6IE5VTV9UWVBFID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBfbGlua0V4cDogWWVzTm9FeHAgPSBudWxsO1xyXG4gIHByaXZhdGUgX3JlY29tcHV0ZTogUmVjb21wdXRlID0gbnVsbDtcclxuICBDYWNoZVRhYmxlRmxkSWR4OiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgX2NhdXNlVGFibGVJbnZhbGlkYXRpb246IGJvb2xlYW4gPSBmYWxzZTsgLy8gY2hhbmdlIGluIHRoaXMgZmllbGQgd2lsbCBjYXVzZSBpbnZhbGlkYXRpb24gb2YgYWxsIHJvd3MgaW4gdGFibGVcclxuICBwcml2YXRlIF9mb3JtOiBNZ0Zvcm0gPSBudWxsO1xyXG4gIHByaXZhdGUgX2hhc0NoYW5nZUV2ZW50OiBib29sZWFuID0gZmFsc2U7IC8vIGlmIFRSVUUsIHRoZXJlIGlzIGEgaGFuZGxlciB0byBydW4gd2hlbiB0aGlzIGZpZWxkIGlzIHVwZGF0ZWRcclxuICBwcml2YXRlIF9oYXNab29tSGFuZGxlcjogYm9vbGVhbiA9IGZhbHNlOyAvLyBpZiBUUlVFLCB0aGVyZSBpcyBhIHpvb20gaGFuZGxlciBmb3IgdGhpcyBmaWVsZFxyXG4gIHByaXZhdGUgX2luRXZhbFByb2Nlc3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9pbml0RXhwOiBFeHByZXNzaW9uID0gbnVsbDtcclxuICBwcml2YXRlIF9pbnZhbGlkVmFsdWU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHByaXZhdGUgX2lzTGlua0ZsZDogYm9vbGVhbiA9IGZhbHNlOyAvLyBpZiBUUlVFLCBpdCBtZWFucyB0aGF0IHRoZSBmaWVsZCBiZWxvbmdzIHRvIGEgbGlua1xyXG4gIHByaXZhdGUgX2lzVmlydHVhbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2RhdGF2aWV3SGVhZGVySWQ6IG51bWJlciA9IC0xOyAgLy8gbWVtYmVycyByZWxhdGVkIHRvIHRhYmxlIGNhY2hlXHJcbiAgcHJpdmF0ZSBfbGlua0NyZWF0ZTogYm9vbGVhbiA9IGZhbHNlOyAvLyBJZiB0cnVlIHRoZW4gaXQncyBhIHJlYWwgZmllbGQgd2hpY2ggYmVsb25ncyB0byBsaW5rIGNyZWF0ZS5cclxuICBMb2NhdGU6IEJvdW5kYXJ5ID0gbnVsbDtcclxuICBSYW5nZTogQm91bmRhcnkgPSBudWxsO1xyXG4gIHByaXZhdGUgX2lzUGFyYW06IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9pc0V4cG9zZWRSb3V0ZVBhcmFtOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfaXNFeHBvc2VkVG9DbGllbnQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHByaXZhdGUgX3ByZXZJc051bGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9wcmV2VmFsdWU6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfdGFibGVOYW1lOiBzdHJpbmcgPSBudWxsO1xyXG4gIHByaXZhdGUgX2luZGV4SW5UYWJsZTogbnVtYmVyID0gLTE7XHJcblxyXG4gIHByaXZhdGUgX3ZpckFzUmVhbDogYm9vbGVhbiA9IGZhbHNlOyAvLyBJZiB0cnVlIHRoZW4gYSB2aXJ0dWFsIGZpZWxkIGlzIGNvbXB1dGVkIGFzIHJlYWwgKG5lZWRlZCBmb3IgbGluayByZXQgdmFsdWUpXHJcbiAgcHJvdGVjdGVkIF92YWw6IHN0cmluZyA9IG51bGw7XHJcbiAgcHJpdmF0ZSBtb2RpZmllZEF0TGVhc3RPbmNlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfaXNOdWxsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfY2xlYXJWZWN0b3JUeXBlOiBib29sZWFuID0gdHJ1ZTsgLy8gZG8gd2UgbmVlZCB0byB1cGRhdGUgdGhlIHZlY3RvciBvYmplY3RcclxuICBwcml2YXRlIF92ZWN0b3JUeXBlOiBWZWN0b3JUeXBlID0gbnVsbDsgLy8gdGhlIHZlY3RvciByZXByZXNlbnRhdGlvblxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBfdmFyaWFibGVDaGFuZ2VFdnRzOiBMaXN0PEZpZWxkIHwgUnVuVGltZUV2ZW50PiA9IG5ldyBMaXN0KCk7IC8vIGZvciBWYXJpYWJsZSBDaGFuZ2UgZXZlbnQgZXhlY3V0aW9uLCBwcmV2aW91c2x5IHVzZWQgdmlhIGdldFBlbmRpbmdWYXJDaGFuZ2VFdmVudHNcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENUT1JcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGF0YXZpZXdcIj5hIHJlZmVyZW5jZSB0byB0aGUgZGF0YXZpZXc8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWRcIj5jb3VudGVyIG9mIHRoZSBmaWVsZCBpbiBGaWVsZFRhYmxlPC9wYXJhbT5cclxuICBjb25zdHJ1Y3RvcihkYXRhdmlldzogRGF0YVZpZXcsIGlkOiBudW1iZXIpIHtcclxuICAgIHN1cGVyKGlkKTtcclxuICAgIGlmIChGaWVsZC5OVU0wID09PSBudWxsKSB7XHJcbiAgICAgIEZpZWxkLk5VTTAgPSBuZXcgTlVNX1RZUEUoKTtcclxuICAgICAgRmllbGQuTlVNMSA9IG5ldyBOVU1fVFlQRSgpO1xyXG4gICAgICBGaWVsZC5OVU0wLk5VTV80X0xPTkcoMCk7XHJcbiAgICAgIEZpZWxkLk5VTTEuTlVNXzRfTE9ORygxKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9kYXRhdmlldyA9IGRhdGF2aWV3O1xyXG4gICAgdGhpcy5fbGlua0V4cCA9IG5ldyBZZXNOb0V4cChmYWxzZSk7XHJcbiAgICBGaWVsZERlZi5fZGVmYXVsdF9kYXRlID0gRGlzcGxheUNvbnZlcnRvci5JbnN0YW5jZS5kaXNwMm1nKFBJQ0ludGVyZmFjZS5ERUZBVUxUX0RBVEUsXHJcbiAgICAgIG5ldyBQSUMoXCI2XCIsIFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQywgc3VwZXIuZ2V0VGFzaygpLmdldENvbXBJZHgoKSksXHJcbiAgICAgIHN1cGVyLmdldFRhc2soKS5nZXRDb21wSWR4KCksXHJcbiAgICAgIEJsb2JUeXBlLkNPTlRFTlRfVFlQRV9VTktOT1dOKTtcclxuICB9XHJcblxyXG5cclxuICBnZXQgVmlyQXNSZWFsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ZpckFzUmVhbDtcclxuICB9XHJcblxyXG4gIGdldCBJc1ZpcnR1YWwoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNWaXJ0dWFsO1xyXG4gIH1cclxuXHJcbiAgZ2V0IElzRXhwb3NlZFJvdXRlUGFyYW0oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNFeHBvc2VkUm91dGVQYXJhbTtcclxuICB9XHJcblxyXG4gIGdldCBJc0V4cG9zZWRUb0NsaWVudCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc0V4cG9zZWRUb0NsaWVudDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gaW5kZXggaW4gdGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldCBJbmRleEluVGFibGUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9pbmRleEluVGFibGU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSBmaWVsZCBhdHRyaWJ1dGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByb3RlY3RlZCBzZXRBdHRyaWJ1dGUoYXR0cmlidXRlOiBzdHJpbmcsIHZhbHVlU3RyOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGxldCBpc1RhZ1Byb2Nlc3NlZDogYm9vbGVhbiA9IHN1cGVyLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHZhbHVlU3RyKTtcclxuICAgIGlmICghaXNUYWdQcm9jZXNzZWQpIHtcclxuICAgICAgbGV0IGRhdGE6IHN0cmluZ1tdID0gU3RyVXRpbC50b2tlbml6ZSh2YWx1ZVN0ciwgXCIsXCIpO1xyXG4gICAgICBpc1RhZ1Byb2Nlc3NlZCA9IHRydWU7XHJcbiAgICAgIHN3aXRjaCAoYXR0cmlidXRlKSB7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1ZJUlRVQUw6XHJcbiAgICAgICAgICB0aGlzLl9pc1ZpcnR1YWwgPSAoWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cikgIT09IDApO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1BBUkFNOlxyXG4gICAgICAgICAgdGhpcy5faXNQYXJhbSA9IChYbWxQYXJzZXIuZ2V0SW50KHZhbHVlU3RyKSAhPT0gMCk7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuX2lzVmlydHVhbCAmJiB0aGlzLl9pc1BhcmFtKVxyXG4gICAgICAgICAgLy8gcG9zc2libGUgZXJyb3IgLSB3ZSByZWx5IG9uIHRoZSBvcmRlciBvZiBYTUwgYXR0cmlidXRlc1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXHJcbiAgICAgICAgICAgICAgXCJpbiBGaWVsZC5pbml0RWxlbWVudHMoKTogbm9uIHZpcnR1YWwgZmllbGQgaXMgZGVmaW5lZCBhcyBhIHBhcmFtZXRlclwiKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9FWFBPU0VEX1JPVVRFX1BBUkFNUzpcclxuICAgICAgICAgIHRoaXMuX2lzRXhwb3NlZFJvdXRlUGFyYW0gPSAoWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cikgIT09IDApO1xyXG4gICAgICAgICAgaWYgKCF0aGlzLl9pc1BhcmFtICYmIHRoaXMuX2lzRXhwb3NlZFJvdXRlUGFyYW0pXHJcbiAgICAgICAgICAvLyBwb3NzaWJsZSBlcnJvciAtIHdlIHJlbHkgb24gdGhlIG9yZGVyIG9mIFhNTCBhdHRyaWJ1dGVzXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcclxuICAgICAgICAgICAgICBcImluIEZpZWxkLmluaXRFbGVtZW50cygpOiBub24gcGFyYW1ldGVyIGZpZWxkIGlzIGRlZmluZWQgYXMgYSBleHBvc2VkIHJvdXRlIHBhcmFtZXRlclwiKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9FWFBPU0VEX1RPX0NMSUVOVDpcclxuICAgICAgICAgIC8vIFRoZSBmbGFnIHdhcyBzZXJpYWxpemVkIG9ubHkgZm9yIHNlcnZlciB2YXJpYWJsZSAoZXhwb3NlIHRvIGNsaWVudCA9IDAgKVxyXG4gICAgICAgICAgaWYgKFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpID09IDApXHJcbiAgICAgICAgICAgIHRoaXMuX2lzRXhwb3NlZFRvQ2xpZW50ID0gZmFsc2U7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVklSX0FTX1JFQUw6XHJcbiAgICAgICAgICB0aGlzLl92aXJBc1JlYWwgPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfTE5LX0NSRUFURTpcclxuICAgICAgICAgIHRoaXMuX2xpbmtDcmVhdGUgPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfTE5LRVhQOlxyXG4gICAgICAgICAgdGhpcy5fbGlua0V4cC5zZXRWYWwoPFRhc2s+KHRoaXMuZ2V0VGFzaygpKSwgdmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1RBQkxFX05BTUU6XHJcbiAgICAgICAgICB0aGlzLl90YWJsZU5hbWUgPSBYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0lOREVYX0lOX1RBQkxFOlxyXG4gICAgICAgICAgdGhpcy5faW5kZXhJblRhYmxlID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfSU5JVDpcclxuICAgICAgICAgIGxldCBleHBOdW06IG51bWJlciA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpO1xyXG4gICAgICAgICAgdGhpcy5faW5pdEV4cCA9ICg8VGFzaz50aGlzLmdldFRhc2soKSkuZ2V0RXhwQnlJZChleHBOdW0pO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBYTUxDb25zdGFudHMuTUdfQVRUUl9OQU1FOiB7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9DSEFDSEVEX0ZMRF9JRDpcclxuICAgICAgICAgIC8vIE1HX0FUVFJfQ0hBQ0hFRF9GTEQgaXMgaW4gdGhlIGZvcm1hdCBvZiBjYWNoZWRUYWJsZUlkLGZsZFxyXG4gICAgICAgICAgaWYgKGRhdGFbMF0gIT0gXCJcIilcclxuICAgICAgICAgICAgdGhpcy5DYWNoZVRhYmxlRmxkSWR4ID0gTk51bWJlci5QYXJzZShkYXRhWzFdKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9MT0NBVEU6XHJcbiAgICAgICAgICAvLyBsb2NhdGUgaXMgaW4gdGhlIGZvcm1hdCBvZiBtYXgsbWluIGV4cHJlc3Npb24gbnVtICgtMSBpZiBub24gZXhpc3RzKVxyXG4gICAgICAgICAgdGhpcy5Mb2NhdGUgPSBuZXcgQm91bmRhcnkoPFRhc2s+dGhpcy5nZXRUYXNrKCksIE5OdW1iZXIuUGFyc2UoZGF0YVsxXSksIE5OdW1iZXIuUGFyc2UoZGF0YVswXSksIHRoaXMuZ2V0VHlwZSgpLCB0aGlzLmdldFNpemUoKSwgdGhpcy5DYWNoZVRhYmxlRmxkSWR4KTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9SQU5HRTpcclxuICAgICAgICAgIC8vIHJhbmdlIGlzIGluIHRoZSBmb3JtYXQgb2YgbWF4LG1pbiBleHByZXNzaW9uIG51bSAoLTEgaWYgbm9uIGV4aXN0cylcclxuICAgICAgICAgIHRoaXMuUmFuZ2UgPSBuZXcgQm91bmRhcnkoPFRhc2s+dGhpcy5nZXRUYXNrKCksIE5OdW1iZXIuUGFyc2UoZGF0YVsxXSksIE5OdW1iZXIuUGFyc2UoZGF0YVswXSksIHRoaXMuZ2V0VHlwZSgpLCB0aGlzLmdldFNpemUoKSwgdGhpcy5DYWNoZVRhYmxlRmxkSWR4KTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9MSU5LOlxyXG4gICAgICAgICAgdGhpcy5fZGF0YXZpZXdIZWFkZXJJZCA9IE5OdW1iZXIuUGFyc2UodmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0lTX0xJTktfRklFTEQ6XHJcbiAgICAgICAgICB0aGlzLl9pc0xpbmtGbGQgPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgaXNUYWdQcm9jZXNzZWQgPSBmYWxzZTtcclxuICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nV2l0aE1zZyhOU3RyaW5nLkZvcm1hdChcIlVucmVjb2duaXplZCBhdHRyaWJ1dGU6ICd7MH0nXCIsIGF0dHJpYnV0ZSkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBpc1RhZ1Byb2Nlc3NlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgYSByZWZlcmVuY2UgdG8gdGhlIFJlY29tcHV0ZSBPYmplY3Qgb2YgdGhpcyBmaWVsZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJyZWNvbXBSZWZcIj5yZWZlcmVuY2UgdG8gUmVjb21wdXRlIE9iamVjdDwvcGFyYW0+XHJcbiAgc2V0UmVjb21wdXRlKHJlY29tcFJlZjogUmVjb21wdXRlKTogdm9pZCB7XHJcbiAgICB0aGlzLl9yZWNvbXB1dGUgPSByZWNvbXBSZWY7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJlbW92ZXMgdGhlIHNwZWNpZmljIHN1YmZvcm0gdGFzayBmcm9tIHRoZSByZWNvbXB1dGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN1YmZvcm1UYXNrXCI+PC9wYXJhbT5cclxuICBSZW1vdmVTdWJmb3JtRnJvbVJlY29tcHV0ZShzdWJmb3JtVGFzazogVGFzayk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3JlY29tcHV0ZSAhPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9yZWNvbXB1dGUuUmVtb3ZlU3ViZm9ybShzdWJmb3JtVGFzayk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIEluc2VydCB0aGUgc3BlY2lmaWMgc3ViZm9ybSB0YXNrIGludG8gdGhlIGZpZWxkIHJlY29tcHV0ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3ViZm9ybVRhc2tcIj48L3BhcmFtPlxyXG4gIEFkZFN1YmZvcm1SZWNvbXB1dGUoc3ViZm9ybVRhc2s6IFRhc2spOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9yZWNvbXB1dGUgPT09IG51bGwpIHtcclxuICAgICAgdGhpcy5fcmVjb21wdXRlID0gbmV3IFJlY29tcHV0ZSgpO1xyXG4gICAgICB0aGlzLl9yZWNvbXB1dGUuVGFzayA9IDxUYXNrPnN1cGVyLmdldFRhc2soKTtcclxuICAgICAgdGhpcy5fcmVjb21wdXRlLk93bmVyRmxkID0gdGhpcztcclxuICAgICAgdGhpcy5fcmVjb21wdXRlLlJjbXBNb2RlID0gUmVjb21wdXRlX1JjbXBCeS5DTElFTlQ7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9yZWNvbXB1dGUuQWRkU3ViZm9ybShzdWJmb3JtVGFzayk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBhIHJlZmVyZW5jZSB0byBhIGNvbnRyb2wgYXR0YWNoZWQgdG8gdGhpcyBmaWVsZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjdHJsXCI+dGhlIGNvbnRyb2wgd2hpY2ggaXMgYXR0YWNoZWQgdG8gdGhpcyBmaWVsZDwvcGFyYW0+XHJcbiAgU2V0Q29udHJvbChjdHJsOiBNZ0NvbnRyb2xCYXNlKTogdm9pZCB7XHJcbiAgICBzdXBlci5TZXRDb250cm9sKGN0cmwpO1xyXG5cclxuICAgIGlmICh0aGlzLl9pc1ZpcnR1YWwgJiYgY3RybC5Jc1JlcGVhdGFibGUgJiYgdGhpcy5faW5pdEV4cCA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9jYXVzZVRhYmxlSW52YWxpZGF0aW9uID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjb21wdXRlIHRoZSBmaWVsZCBpbml0IGV4cHJlc3Npb24gb3IgZ2V0IGl0cyB2YWx1ZSBmcm9tIHRoZSBkYXRhdmlldywgc2V0XHJcbiAgLy8vICAgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCAoYW5kIHVwZGF0ZSB0aGUgZGlzcGxheSlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmVjb21wdXRlXCI+dGVsbHMgdGhlIGNvbXB1dGUgdG8gc3RhcnQgdGhlIHJlY29tcHV0ZSBjaGFpbiBhbmQgcmVjb21wdXRlXHJcbiAgLy8vICAgdGhlIGV4cHJlc3Npb24gb2YgdGhpcyBmaWVsZCAoaWYgaXQgaXMgcmVhbClcclxuICAvLy8gPC9wYXJhbT5cclxuICBwdWJsaWMgYXN5bmMgY29tcHV0ZShyZWNvbXB1dGU6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCByZXN1bHQ6IFJlZlBhcmFtPHN0cmluZz4gPSBuZXcgUmVmUGFyYW0odGhpcy5nZXRWYWx1ZShmYWxzZSkpO1xyXG4gICAgbGV0IGlzTnVsbEZsZDogUmVmUGFyYW08Ym9vbGVhbj4gPSBuZXcgUmVmUGFyYW0odGhpcy5faXNOdWxsKTtcclxuICAgIGxldCByZWMgPSAoPERhdGFWaWV3PnRoaXMuX2RhdGF2aWV3KS5nZXRDdXJyUmVjKCk7XHJcbiAgICBsZXQgdGFzayA9IDxUYXNrPnN1cGVyLmdldFRhc2soKTtcclxuXHJcbiAgICBsZXQgemVyb1JlYWw6IGJvb2xlYW4gPSB0aGlzLl9saW5rQ3JlYXRlICYmIHJlYy5JbkNvbXB1dGUgJiYgIXJlY29tcHV0ZSAmJiB0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEU7XHJcbiAgICAvLyBRQ1IgIzk5OTAyNCAtIHplcm8gbG5rIGNyZWF0ZSB2YWx1ZXMgZHVyaW5nIGNvbXB1dGVcclxuXHJcbiAgICBpZiAodGhpcy5fZm9ybSA9PSBudWxsKVxyXG4gICAgICB0aGlzLl9mb3JtID0gPE1nRm9ybT50YXNrLmdldEZvcm0oKTtcclxuXHJcbiAgICAvLyBubyBuZWVkIHRvIHplcm8gcmVhbHMgaWYgd2UgYXJlIHJlY292ZXJpbmcgYSByZWNvcmQuXHJcbiAgICBpZiAoKHRoaXMuX2Zvcm0gIT0gbnVsbCAmJiB0aGlzLl9mb3JtLkluUmVzdG9yZSkgfHwgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSlcclxuICAgICAgemVyb1JlYWwgPSBmYWxzZTtcclxuXHJcbiAgICBsZXQgcnRFdnQ6IFJ1blRpbWVFdmVudCA9IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmdldExhc3RSdEV2ZW50KCk7XHJcbiAgICBsZXQgY29tcHV0ZU9uQ2FuY2VsRXZlbnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmIChydEV2dCAhPSBudWxsKVxyXG4gICAgICBjb21wdXRlT25DYW5jZWxFdmVudCA9IHJ0RXZ0LmdldEludGVybmFsQ29kZSgpID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ0FOQ0VMO1xyXG5cclxuICAgIC8vIHZpcnR1YWwgYXMgcmVhbCBpcyBlc3BlY2lhbGx5IGZvciBmaWVsZHMgd2hpY2ggYXJlIHVzZWQgYXMgYSBcInJldHVybiB2YWx1ZVwiXHJcbiAgICAvLyBvZiBhIGxpbmsuIFRoZWlyIHZhbHVlIGlzIHJldHVybmVkIGJ5IHRoZSBsaW5rIHJlc3VsdCBhbmQgbm90IGJ5IHRoZSBpbml0IGV4cHJlc3Npb24uXHJcbiAgICAvLyB3aGVuIHRoZSBmb3JtIGlzIHJlc3RvcmluZyB0aGUgY3VyciByb3cgd2Ugc2hvdWxkbid0IGNvbXB1dGUgdGhlIGluaXQgZXhwcmVzc2lvblxyXG4gICAgLy8gYnV0IHRvIHVzZSB0aGUgdmFsdWUgZnJvbSB0aGUgcmVjb3JkIChieSBnZXRWYWx1ZSlcclxuICAgIC8vIFFDUiM5MjY3NTg6IFdoZW4gVGFzaydzIG1vZGUgaXMgQ3JlYXRlLCBpbml0IGZvciByZWFsIGZpZWxkIHNob3VsZCBiZSBldmFsdWF0ZWQgb25seSB3aGVuIGl0IGNvbWVzIGZvciBjYW5jZWwgZXZlbnQobGFzdCBydW50aW1lIGV2ZW50IGlzIGNhbmNlbCBldmVudCkuXHJcbiAgICAvLyBXaGlsZSBjcmVhdGluZyBhIG5ldyByZWNvcmQsIGluaXQgd2lsbCBiZSBldmFsdWF0ZWQgYmVjYXVzZSBvZiBjb25kaXRpb24gcmVjLmlzTmV3UmVjKCkuIChJdCBpcyB0aGUgcmVmaXggb2YgUUNSIzk5NDA3MilcclxuICAgIGlmICghdGhpcy5fdmlyQXNSZWFsICYmICh0aGlzLl9mb3JtID09IG51bGwgfHwgIXRoaXMuX2Zvcm0uSW5SZXN0b3JlKSAmJlxyXG4gICAgICAoKHRoaXMuX2lzVmlydHVhbCB8fCAodGFzay5nZXRNb2RlKCkgPT09IENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFICYmIGNvbXB1dGVPbkNhbmNlbEV2ZW50KSkgfHwgcmVjb21wdXRlIHx8XHJcbiAgICAgICAgemVyb1JlYWwgfHwgcmVjLmlzTmV3UmVjKCkgJiYgIXJlYy5pc0NvbXB1dGVkKCkpKSB7XHJcbiAgICAgIGlmICghdGFzay5EYXRhVmlldy5pc0VtcHR5RGF0YXZpZXcoKSB8fCAodGFzay5EYXRhVmlldy5pc0VtcHR5RGF0YXZpZXcoKSAmJiAhdGhpcy5QYXJ0T2ZEYXRhdmlldykpIHtcclxuICAgICAgICAvLyBRQ1IgIzc3NTUwODogZm9yIGRhdGF2aWV3cywgd2hpY2ggYXJlIGNvbXB1dGVkIGJ5IHRoZSBzZXJ2ZXIsIHByZXZlbnRcclxuICAgICAgICAvLyBjb21wdXRpbmcgdGhlIGluaXQgZXhwcmVzc2lvbiB3aGlsZSBpbiBjb21wdXRlIG9mIHRoZSByZWNvcmQgYmVjYXVzZSB0aGVcclxuICAgICAgICAvLyBzZXJ2ZXIgaGF2ZSBhbHJlYWR5IGRvbmUgaXRcclxuICAgICAgICBpZiAoKHRoaXMuX2lzVmlydHVhbCB8fCB0YXNrLmdldE1vZGUoKSA9PT0gQ29uc3RhbnRzLlRBU0tfTU9ERV9DUkVBVEUpIHx8ICg8RGF0YVZpZXc+dGhpcy5fZGF0YXZpZXcpLmNvbXB1dGVCeUNsaWVudCgpIHx8XHJcbiAgICAgICAgICAhcmVjLkluQ29tcHV0ZSB8fCB6ZXJvUmVhbCB8fCByZWMubGF0ZUNvbXB1dGUoKSkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuX2luaXRFeHAgIT0gbnVsbCkge1xyXG5cclxuXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuRXZhbHVhdGVJbml0RXhwcmVzc2lvbihyZXN1bHQsIGlzTnVsbEZsZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmICh6ZXJvUmVhbClcclxuICAgICAgICAgICAgcmVzdWx0LnZhbHVlID0gdGhpcy5nZXREZWZhdWx0VmFsdWUoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLl9pbnZhbGlkVmFsdWUpIHtcclxuICAgICAgdGhpcy5fcHJldlZhbHVlID0gcmVzdWx0LnZhbHVlO1xyXG4gICAgICB0aGlzLl9wcmV2SXNOdWxsID0gaXNOdWxsRmxkLnZhbHVlO1xyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5zZXRWYWx1ZShyZXN1bHQudmFsdWUsIGlzTnVsbEZsZC52YWx1ZSwgcmVjb21wdXRlLCBmYWxzZSwgcmVjb21wdXRlICYmICF0aGlzLl9pc1ZpcnR1YWwsIGZhbHNlLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBldmFsdWF0ZSBpbml0IGV4cHJlc3Npb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInJlc3VsdFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNOdWxsRmxkXCI+PC9wYXJhbT5cclxuICBhc3luYyBFdmFsdWF0ZUluaXRFeHByZXNzaW9uKHJlc3VsdDogUmVmUGFyYW08c3RyaW5nPiwgaXNOdWxsRmxkOiBSZWZQYXJhbTxib29sZWFuPik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgRGVidWcuQXNzZXJ0KHRoaXMuX2luaXRFeHAgIT09IG51bGwpO1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5faW5FdmFsUHJvY2VzcyA9IHRydWU7XHJcbiAgICAgIHJlc3VsdC52YWx1ZSA9IGF3YWl0IHRoaXMuX2luaXRFeHAuZXZhbHVhdGVXaXRoUmVzdWx0VHlwZUFuZExlbmd0aCh0aGlzLl90eXBlLCB0aGlzLl9zaXplKTtcclxuICAgIH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICB0aGlzLl9pbkV2YWxQcm9jZXNzID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaXNOdWxsRmxkLnZhbHVlID0gKHJlc3VsdC52YWx1ZSA9PT0gbnVsbCk7XHJcbiAgICBpZiAoaXNOdWxsRmxkLnZhbHVlICYmIHRoaXMuTnVsbEFsbG93ZWQpIHtcclxuICAgICAgcmVzdWx0LnZhbHVlID0gdGhpcy5nZXRWYWx1ZShmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8vLyA8c3VtbWFyeT5cclxuICAvLy8vL1xyXG4gIC8vLy8vIDwvc3VtbWFyeT5cclxuICAvLy8vLyA8cGFyYW0gbmFtZT1cInJlY29tcHV0ZVwiPjwvcGFyYW0+XHJcbiAgLy8vLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIC8vIGJvb2wgU2hvdWxkUmVjb21wdXRlKGJvb2wgcmVjb21wdXRlKVxyXG4gIC8vIHtcclxuICAvLyAgIGlmIChyZWNvbXB1dGUpXHJcbiAgLy8gICB7XHJcbiAgLy8gICAgICBib29sIGNvbXB1dGVkQnlGZXRjaCA9ICFJc1ZpcnR1YWwgfHwgVmlyQXNSZWFsO1xyXG4gIC8vICAgICAgaWYgKGNvbXB1dGVkQnlGZXRjaClcclxuICAvLyAgICAgIHtcclxuICAvLyAgICAgICAgIFRhc2sgdGFzayA9IChUYXNrKWdldFRhc2soKTtcclxuICAvLyAgICAgICAgIERhdGF2aWV3SGVhZGVyQmFzZSBoZWFkZXIgPSB0YXNrLmdldERhdGF2aWV3SGVhZGVycygpLmdldERhdGF2aWV3SGVhZGVyQnlJZChfZGF0YXZpZXdIZWFkZXJJZCk7XHJcbiAgLy8gICAgICAgICAvL2xvY2FsIGRhdGF2YXNlIGFscmVhZHkgY29tcHV0ZWQgdGhlIHJlY29yZCBhcyBzZXJ2ZXIgZG9lc1xyXG4gIC8vICAgICAgICAgaWYgKGhlYWRlciBpcyBMb2NhbERhdGF2aWV3SGVhZGVyKVxyXG4gIC8vICAgICAgICAge1xyXG4gIC8vICAgICAgICAgICAgIHZhciByZWMgPSAoKERhdGFWaWV3KV9kYXRhdmlldykuZ2V0Q3VyclJlYygpO1xyXG4gIC8vICAgICAgICAgICAgIHJldHVybiAhcmVjLkluQ29tcHV0ZTtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgIH1cclxuICAvLyAgIH1cclxuICAvLyAgIHJldHVybiByZWNvbXB1dGU7XHJcbiAgLy8gfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgZnJvbSB0aGUgY3VycmVudCByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiY2hlY2tOdWxsQXJpdGhtZXRpY1wiPmlmIHRydWUgdGhlbiB0aGUgbnVsbCBhcml0aG1ldGljIGVudmlyb25tZW50XHJcbiAgLy8vICAgc2V0dGluZyBpcyB1c2VkIHRvIHJldHVybiBudWxsIHdoZW4gXCJudWxsaWZ5XCIgY29tcHV0YXRpb24gaXMgbmVlZGVkXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgZ2V0VmFsdWUoY2hlY2tOdWxsQXJpdGhtZXRpYzogYm9vbGVhbik6IHN0cmluZyB7XHJcbiAgICAvLyBpZiB3ZSBuZWVkIHRvIHJldHVybiB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgdGhlIGZpZWxkXHJcbiAgICBpZiAoKDxUYXNrPnN1cGVyLmdldFRhc2soKSkuZ2V0RXZhbE9sZFZhbHVlcygpKVxyXG4gICAgICByZXR1cm4gdGhpcy5nZXRPcmlnaW5hbFZhbHVlKCk7XHJcbiAgICBpZiAodGhpcy5faW52YWxpZFZhbHVlKVxyXG4gICAgICB0aGlzLnRha2VWYWxGcm9tUmVjKCk7XHJcbiAgICBpZiAodGhpcy5faXNOdWxsKVxyXG4gICAgICB0aGlzLl92YWwgPSB0aGlzLmdldFZhbHVlRm9yTnVsbChjaGVja051bGxBcml0aG1ldGljKTtcclxuICAgIHJldHVybiB0aGlzLl92YWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm5ld1ZhbHVlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlzTnVsbFwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBwcml2YXRlIGlzQ2hhbmdlZChuZXdWYWx1ZTogc3RyaW5nLCBpc051bGw6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9wcmV2VmFsdWUgIT09IG51bGwgJiYgKCEodGhpcy5fcHJldlZhbHVlID09PSBuZXdWYWx1ZSkgfHwgdGhpcy5fcHJldklzTnVsbCAhPT0gaXNOdWxsKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBieSB0YWtpbmcgaXQgZnJvbSB0aGUgY3VycmVudCByZWNvcmRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHRha2VWYWxGcm9tUmVjKCk6IHZvaWQge1xyXG4gICAgbGV0IHJlYzogUmVjb3JkID0gKDxEYXRhVmlldz50aGlzLl9kYXRhdmlldykuZ2V0Q3VyclJlYygpO1xyXG4gICAgaWYgKHJlYyAhPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl92YWwgPSByZWMuR2V0RmllbGRWYWx1ZSh0aGlzLl9pZCk7XHJcbiAgICAgIHRoaXMuX2lzTnVsbCA9IHJlYy5Jc051bGwodGhpcy5faWQpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX2ludmFsaWRWYWx1ZSkge1xyXG4gICAgICBpZiAocmVjICE9PSBudWxsICYmIHRoaXMuX2NhdXNlVGFibGVJbnZhbGlkYXRpb24gJiYgdGhpcy5pc0NoYW5nZWQodGhpcy5fdmFsLCB0aGlzLl9pc051bGwpICYmIHRoaXMuX2Zvcm0gIT09IG51bGwpIHtcclxuICAgICAgICByZWMuc2V0Q2F1c2VJbnZhbGlkYXRpb24odHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fcHJldlZhbHVlID0gdGhpcy5fdmFsO1xyXG4gICAgICB0aGlzLl9wcmV2SXNOdWxsID0gdGhpcy5faXNOdWxsO1xyXG4gICAgICB0aGlzLl9pbnZhbGlkVmFsdWUgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIC8vIFpFUk8gVEhFIFZFQ1RPUiBPQkpFQ1RcclxuICAgIHRoaXMuX3ZlY3RvclR5cGUgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgdGhlIGZpZWxkIHdpdGhvdXQgdXBkYXRpbmcgdGhlIGZpZWxkIHZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRPcmlnaW5hbFZhbHVlKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgb3JpZ2luYWxSZWM6IFJlY29yZCA9ICg8RGF0YVZpZXc+dGhpcy5fZGF0YXZpZXcpLmdldE9yaWdpbmFsUmVjKCk7XHJcblxyXG4gICAgaWYgKG9yaWdpbmFsUmVjLklzTnVsbCh0aGlzLl9pZCkpXHJcbiAgICAgIHJldHVybiB0aGlzLmdldE1hZ2ljRGVmYXVsdFZhbHVlKCk7XHJcblxyXG4gICAgcmV0dXJuIG9yaWdpbmFsUmVjLkdldEZpZWxkVmFsdWUodGhpcy5faWQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGlzIG9yaWdpbmFsIHZhbHVlIG9mIHRoZSBmaWVsZCB3YXMgbnVsbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgaXNPcmlnaW5hbFZhbHVlTnVsbCgpOiBib29sZWFuIHtcclxuICAgIGxldCBvcmlnaW5hbFJlYzogUmVjb3JkID0gKDxEYXRhVmlldz50aGlzLl9kYXRhdmlldykuZ2V0T3JpZ2luYWxSZWMoKTtcclxuICAgIHJldHVybiBvcmlnaW5hbFJlYy5Jc051bGwodGhpcy5faWQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB2YWx1ZSBieSByZWMgaWR4XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkeFwiPnJlY29yZCBpZHg8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgZ2V0VmFsdWVCeVJlY0lkeChpZHg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgcmVjOiBSZWNvcmQgPSAoPERhdGFWaWV3PnRoaXMuX2RhdGF2aWV3KS5nZXRSZWNCeUlkeChpZHgpO1xyXG4gICAgbGV0IGZpZWxkVmFsdWU6IHN0cmluZyA9IHJlYy5HZXRGaWVsZFZhbHVlKHRoaXMuX2lkKTtcclxuICAgIHJldHVybiByZWMuSXNOdWxsKHRoaXMuX2lkKSA/IHRoaXMuZ2V0VmFsdWVGb3JOdWxsKGZhbHNlKSA6IGZpZWxkVmFsdWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IG1vZGlmaWVkQXRMZWFzdE9uY2UgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBnZXRNb2RpZmllZEF0TGVhc3RPbmNlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMubW9kaWZpZWRBdExlYXN0T25jZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gbnVsbCBpZiB2YWx1ZSBvZiBmaWVsZCBmb3IgdGhlIHJlY29yZCBpcyBudWxsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkeFwiPnJlY29yZCBpZHg8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgaXNOdWxsQnlSZWNJZHgoaWR4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGxldCByZWM6IFJlY29yZCA9ICg8RGF0YVZpZXc+dGhpcy5fZGF0YXZpZXcpLmdldFJlY0J5SWR4KGlkeCk7XHJcbiAgICByZXR1cm4gcmVjLklzTnVsbCh0aGlzLl9pZCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIGZpZWxkJ3MgdmFsdWUgZm9yIHJlY29yZCBpZHggcmVjaWR4IGVxdWFscyB0byBtZ1ZhbHVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJtZ1ZhbHVlXCI+dmFsdWUgdG8gY29tcGFyZSAgPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc051bGxGbGRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInR5cGVcIj50eXBlIG9mIHZhbHVlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZWNJZHhcIj5yZWNJZHggb2YgdGhlIHJlY29yZDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBpc0VxdWFsKG1nVmFsdWU6IHN0cmluZywgaXNOdWxsRmxkOiBib29sZWFuLCB0eXBlOiBTdG9yYWdlQXR0cmlidXRlLCByZWNJZHg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJlYyA9IDxSZWNvcmQ+KCg8RGF0YVZpZXc+dGhpcy5fZGF0YXZpZXcpLmdldFJlY0J5SWR4KHJlY0lkeCkpO1xyXG4gICAgbGV0IHZhbHNFcXVhbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgaWYgKHJlYyAhPSBudWxsKSB7XHJcbiAgICAgIGxldCBmaWVsZFZhbHVlOiBzdHJpbmcgPSByZWMuR2V0RmllbGRWYWx1ZSh0aGlzLl9pZCk7XHJcbiAgICAgIGxldCBmaWVsc0lzTnVsbDogYm9vbGVhbiA9IHJlYy5Jc051bGwodGhpcy5faWQpO1xyXG4gICAgICB2YWxzRXF1YWwgPSBFeHByZXNzaW9uRXZhbHVhdG9yLm1nVmFsc0VxdWFsKGZpZWxkVmFsdWUsIGZpZWxzSXNOdWxsLCB0aGlzLl90eXBlLCBtZ1ZhbHVlLCBpc051bGxGbGQsIHR5cGUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHNFcXVhbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIHdoaWNoIHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIGEgbmV3IHJlYywgd2hlbiBpdFxyXG4gIC8vLyAgIGlzIGNyZWF0ZWQuIFRoaXMgd2lsbCB1c3VhbGx5IGJlIHRoZSBmaWVsZCdzIGRlZmF1bHQgdmFsdWUsIHVubGVzcyB0aGVyZSBpcyBhXHJcbiAgLy8vICAgdmlydHVhbCBmaWVsZCB3aXRob3V0IGFuIGluaXQgZXhwcmVzc2lvbi4gSW4gdGhpcyBjYXNlLCB0aGUgY3VycmVudCB2YWx1ZSB3aWxsIGJlXHJcbiAgLy8vICAgcmV0dXJuZWQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjbG9iYmVyZWRPbmx5XCI+Y2xvYmJlcmVkT25seSBpcyB0cnVlIGlmIHdlIHdhbnQgdG8gb25seSB0YWtlIHRoZSB2YWx1ZXMgb2YgdGhlIHZpcnR1YWxzIHdpdGggbm8gaW5pdCBleHByZXNzaW9uPC9wYXJhbT5cclxuICBnZXROZXdSZWNWYWx1ZShjbG9iYmVyZWRPbmx5OiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLl9pc1ZpcnR1YWwgJiYgdGhpcy5faW5pdEV4cCA9PSBudWxsKVxyXG4gICAgICByZXR1cm4gdGhpcy5fdmFsO1xyXG4gICAgcmV0dXJuICFjbG9iYmVyZWRPbmx5ID8gdGhpcy5nZXREZWZhdWx0VmFsdWUoKSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBhc3luYyBzZXRWYWx1ZUFuZFN0YXJ0UmVjb21wdXRlKHZhbDogc3RyaW5nLCBpc051bGxGbGQ6IGJvb2xlYW4sIHJlY29tcHV0ZTogYm9vbGVhbiwgc2V0UmVjb3JkVXBkYXRlZDogYm9vbGVhbiwgaXNBcmdVcGRhdGU6IGJvb2xlYW4sIGVuZm9yY2VWYXJpYWJsZUNoYW5nZT86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmIChpc051bGxPclVuZGVmaW5lZChlbmZvcmNlVmFyaWFibGVDaGFuZ2UpKVxyXG4gICAgICBlbmZvcmNlVmFyaWFibGVDaGFuZ2UgPSBmYWxzZTtcclxuICAgIGF3YWl0IHRoaXMuc2V0VmFsdWVBbmRTdGFydFJlY29tcHV0ZV8xKHZhbCwgaXNOdWxsRmxkLCByZWNvbXB1dGUsIHNldFJlY29yZFVwZGF0ZWQsIGlzQXJnVXBkYXRlLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2FsbCB0aGUgc2V0IHZhbHVlIGZ1bmN0aW9uIGZyb20gdGhlIFwib3V0ZXJcIiB3b3JsZC4gVGhpcyB3aWxsIHRyaWdnZXIgdGhlIHJlY29tcHV0ZVxyXG4gIC8vLyAgIGNoYWluLiBXaGVuIHJlY29tcHV0ZSBpcyBkb25lIC0gcmVmcmVzaCBjb250cm9scyB3aGljaCBhcmUgZXhwcmVzc2lvbiBkZXBlbmRlbnQuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWxcIj50aGUgbmV3IHZhbHVlIG9mIHRoZSBmaWVsZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNOdWxsRmxkXCI+aWYgdHJ1ZSB0aGVuIHRoZSB2YWx1ZSBpcyBudWxsPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZWNvbXB1dGVcIj5zdGF0ZXMgd2hldGhlciB0byBleGVjdXRlIHJlY29tcHV0ZSB3aGVuIHNldHRpbmcgdGhlIHZhbHVlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJyZWNvbXB1dGVPbmx5V2hlblVwZGF0ZVZhbHVlXCI+OiBkbyB0aGUgcmVjb21wdXRlIG9ubHkgd2hlbiB0aGUgdmFsdWUgd2FzIHVwZGF0ZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic2V0UmVjb3JkVXBkYXRlZFwiPnRlbGxzIHdoZXRoZXIgdG8gZGVmaW5lIHRoZSByZWNvcmQgYXMgdXBkYXRlZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaXNBcmdVcGRhdGVcIj50cnVlIGlmIGNhbGxlZCBmb3IgaGFuZGxlciBhcmd1bWVudC1wYXJhbWV0ZXIgY29weTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiZW5mb3JjZVZhcmlhYmxlQ2hhbmdlXCI+ZXhlY3V0ZSB2YWlhYmxlIGNoYW5nZSBldmVuIHdoZW4gcmVjb21wdXRlIGlzIGZhbHNlPC9wYXJhbT5cclxuICBwcml2YXRlIGFzeW5jIHNldFZhbHVlQW5kU3RhcnRSZWNvbXB1dGVfMSh2YWw6IHN0cmluZywgaXNOdWxsRmxkOiBib29sZWFuLCByZWNvbXB1dGU6IGJvb2xlYW4sIHNldFJlY29yZFVwZGF0ZWQ6IGJvb2xlYW4sIGlzQXJnVXBkYXRlOiBib29sZWFuLCBlbmZvcmNlVmFyaWFibGVDaGFuZ2U6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCB0YXNrID0gPFRhc2s+dGhpcy5nZXRUYXNrKCk7XHJcbiAgICBpZiAodGFzayAhPSBudWxsKVxyXG4gICAgICB0YXNrLlZld0ZpcnN0Kys7XHJcblxyXG4gICAgbGV0IHZhbHVlV2FzVXBkYXRlZDogYm9vbGVhbiA9IGF3YWl0IHRoaXMuc2V0VmFsdWUodmFsLCBpc051bGxGbGQsIHJlY29tcHV0ZSwgc2V0UmVjb3JkVXBkYXRlZCwgIXRoaXMuX2lzVmlydHVhbCwgaXNBcmdVcGRhdGUsIGVuZm9yY2VWYXJpYWJsZUNoYW5nZSk7XHJcblxyXG4gICAgLy8gQSBmaWVsZCB0aGF0IGlzIGFuIGV2ZW50IGhhbmRsZXIgZmllbGQgY2Fubm90IGFwcGVhciBhcyBhIHByb3BlcnR5IGluIGd1aS4gbm8gbmVlZCB0byByZWZyZXNoIGFsbFxyXG4gICAgLy8gZm9ybStjb250cm9scyBwcm9wZXJ0aWVzIGV4cHJlc3Npb25zIGZvciBpdC5cclxuICAgIGlmICh0YXNrICE9PSBudWxsICYmIHRhc2suVmV3Rmlyc3QgPT09IDEgJiYgdGhpcy5fZm9ybSAhPT0gbnVsbCAmJiAhdGhpcy5Jc0V2ZW50SGFuZGxlckZpZWxkKSB7XHJcbiAgICAgIGlmIChyZWNvbXB1dGUgJiYgdmFsdWVXYXNVcGRhdGVkKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuX2Zvcm0ucmVmcmVzaE9uRXhwcmVzc2lvbnMoKTtcclxuXHJcbiAgICB9XHJcbiAgICBpZiAodGFzayAhPSBudWxsKVxyXG4gICAgICB0YXNrLlZld0ZpcnN0LS07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgaW4gdGhlIGN1cnJlbnQgcmVjb3JkIGFuZCB1cGRhdGUgdGhlIGRpc3BsYXlcclxuICAvLy8gICB0aGUgZmllbGQgbXVzdCBiZSBpbiBhIG1hZ2ljIGludGVybmFsIGZvcm1hdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibmV3VmFsXCI+dGhlIG5ldyB2YWx1ZSBvZiB0aGUgZmllbGQ8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImlzTnVsbEZsZFwiPmlmIHRydWUgdGhlbiB0aGUgdmFsdWUgaXMgbnVsbDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwicmVjb21wdXRlXCI+c3RhdGVzIHdoZXRoZXIgdG8gZXhlY3V0ZSByZWNvbXB1dGUgd2hlbiBzZXR0aW5nIHRoZSB2YWx1ZTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic2V0UmVjb3JkTW9kaWZpZWRcIj5zdGF0ZXMgd2hldGhlciB0byBkZWZpbmUgdGhlIHJlY29yZCBhcyBtb2RpZmllZDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic2V0Q3Jzck1vZGlmaWVkXCI+c3RhdGVzIHdoZXRoZXIgdG8gZGVmaW5lIHRoZSBjdXJzb3Igb2YgdGhlIGZpZWxkIGFzIG1vZGlmaWVkPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc0FyZ1VwZGF0ZVwiPnRydWUgaWYgY2FsbGVkIGZvciBoYW5kbGVyIGFyZ3VtZW50LXBhcmFtZXRlciBjb3B5PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+dGhlIHJldHVybiB2YWx1ZSB3YXMgdXBkYXRlZCA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBzZXRWYWx1ZShuZXdWYWw6IHN0cmluZywgaXNOdWxsRmxkOiBib29sZWFuLCByZWNvbXB1dGU6IGJvb2xlYW4sIHNldFJlY29yZE1vZGlmaWVkOiBib29sZWFuLCBzZXRDcnNyTW9kaWZpZWQ6IGJvb2xlYW4sIGlzQXJnVXBkYXRlOiBib29sZWFuLCBlbmZvcmNlVmFsaWFibGVDaGFuZ2U6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxldCByZWM6IFJlY29yZDtcclxuICAgIGxldCByZWNGbGRWYWw6IHN0cmluZztcclxuICAgIGxldCB2YWxzRXF1YWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCByZW1haW5kZXI6IG51bWJlcjtcclxuICAgIGxldCB6ZXJvUmVhbDogYm9vbGVhbjtcclxuICAgIGxldCBhcmdzOiBBcmd1bWVudHNMaXN0ID0gbnVsbDtcclxuICAgIGxldCBtYWluQ3RybCA9IHRoaXMuZ2V0Q3RybCgpO1xyXG4gICAgbGV0IHBlbmRpbmdFdmVudHM6IG51bWJlcjtcclxuICAgIGxldCBldnRzOiBMaXN0PEZpZWxkIHwgUnVuVGltZUV2ZW50PjtcclxuICAgIGxldCBmb3JjZVVwZGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGNoZWNrRm9yVmFyaWFibGVDaGFuZ2U6IGJvb2xlYW4gPSByZWNvbXB1dGUgfHwgZW5mb3JjZVZhbGlhYmxlQ2hhbmdlO1xyXG5cclxuICAgIGxldCB0YXNrID0gPFRhc2s+dGhpcy5nZXRUYXNrKCk7XHJcbiAgICBpZiAodGhpcy5fZm9ybSA9PT0gbnVsbClcclxuICAgICAgdGhpcy5fZm9ybSA9IDxNZ0Zvcm0+dGFzay5nZXRGb3JtKCk7XHJcblxyXG4gICAgaWYgKGlzTnVsbEZsZCAmJiAhdGhpcy5OdWxsQWxsb3dlZCAmJiB0aGlzLl90eXBlICE9PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SKSB7XHJcbiAgICAgIG5ld1ZhbCA9IHRoaXMuZ2V0RGVmYXVsdFZhbHVlKCk7XHJcbiAgICAgIGlzTnVsbEZsZCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFFDUiM4MDUzNjQ6IEZvciBhbnkgZmllbGQsIHdlIHN0b3JlIHRoZSB2YWx1ZSBpbiBmaWVsZCBhcyBpdCBpcyAod2l0aG91dCBjaGVja2luZyB0aGUgcGljdHVyZSkuXHJcbiAgICAvLyBCdXQgZm9yIE51bWVyaWMgZmllbGQsIGlmIHBpY3R1cmUgZG9lcyBub3QgY29udGFpbiBkZWNpbWFscyB0aGVuIHdlIHNob3VsZCByb3VuZCBvZmYgdGhlIHZhbHVlIGFuZCB0aGVuIHNhdmUgdGhpcyB2YWx1ZSBpbiBmaWVsZFxyXG4gICAgLy8gb3RoZXJ3aXNlIGl0IHdpbGwgZ2l2ZSB3cm9uZyBjYWxjdWxhdGlvbi4gU28gYWx3YXlzIHJvdW5kIG9mZiB0aGUgdmFsdWUgZGVwZW5kaW5nIG9uIHBpY3R1cmUncyBkZWNpbWFsLlxyXG4gICAgLy8gY2hlY2sgaWYgbmV3VmFsIGlzIFwibG9uZ1wiIHNpbmNlIHRoZXJlIGlzIG5vIHJlYXNvbiB0byByb3VuZCBhbiBhbHJlYWR5IHdob2xlIG51bWJlclxyXG4gICAgaWYgKHRoaXMuX3R5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQyAmJiBuZXdWYWwgIT0gbnVsbCAmJiAhTlVNX1RZUEUubnVtSGV4U3RySXNMb25nKG5ld1ZhbCkpIHtcclxuICAgICAgbGV0IG51bVZhbCA9IG5ldyBOVU1fVFlQRShuZXdWYWwpO1xyXG4gICAgICBsZXQgcGljID0gbmV3IFBJQyh0aGlzLl9waWN0dXJlLCB0aGlzLl90eXBlLCBzdXBlci5nZXRUYXNrKCkuZ2V0Q29tcElkeCgpKTtcclxuICAgICAgbGV0IGRlY3M6IG51bWJlciA9IHBpYy5nZXREZWMoKTtcclxuICAgICAgbnVtVmFsLnJvdW5kKGRlY3MpO1xyXG4gICAgICBuZXdWYWwgPSBudW1WYWwudG9YTUxyZWNvcmQoKTtcclxuICAgIH1cclxuXHJcbiAgICByZWMgPSAoPERhdGFWaWV3PnRoaXMuX2RhdGF2aWV3KS5nZXRDdXJyUmVjKCk7XHJcbiAgICBpZiAocmVjID09IG51bGwpXHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihMYW5ndWFnZURhdGEuSW5zdGFuY2UuZ2V0Q29uc3RNZXNzYWdlKE1zZ0ludGVyZmFjZS5SVF9TVFJfTk9fUkVDU19JTl9STkcpKTtcclxuXHJcbiAgICAvLyBkb24ndCBhbGxvdyB1cGRhdGluZyBSRUFMIGZpZWxkcywgdW5sZXNzICdhbGxvdyB1cGRhdGUgaW4gcXVlcnkgbW9kZScgaXMgc2V0IHRvIFRSVUVcclxuICAgIGlmICghdGhpcy5Jc1ZpcnR1YWwgJiZcclxuICAgICAgKHRhc2suZ2V0TW9kZSgpID09PSBDb25zdGFudHMuVEFTS19NT0RFX1FVRVJZICYmXHJcbiAgICAgICAgIUVudmlyb25tZW50Lkluc3RhbmNlLmFsbG93VXBkYXRlSW5RdWVyeU1vZGUodGFzay5nZXRDb21wSWR4KCkpXHJcbiAgICAgICAgfHwgcmVjLkluRm9yY2VVcGRhdGUgJiYgcmVjLkluQ29tcHV0ZSkpXHJcbiAgICAgIHJldHVybiAhdmFsc0VxdWFsO1xyXG5cclxuICAgIGlmIChjaGVja0ZvclZhcmlhYmxlQ2hhbmdlICYmIHRoaXMuZ2V0SGFzQ2hhbmdlRXZlbnQoKSkge1xyXG4gICAgICBsZXQgYXJnc0xpc3QgPSBuZXcgQXJyYXkoMik7XHJcbiAgICAgIGFyZ3NMaXN0WzBdID0gbmV3IEV4cFZhbChTdG9yYWdlQXR0cmlidXRlLk5VTUVSSUMsIGZhbHNlLFxyXG4gICAgICAgIChtYWluQ3RybCAhPT0gbnVsbCAmJiBtYWluQ3RybC5Jc0ludGVyYWN0aXZlVXBkYXRlXHJcbiAgICAgICAgICA/IEZpZWxkLk5VTTAudG9YTUxyZWNvcmQoKVxyXG4gICAgICAgICAgOiBGaWVsZC5OVU0xLnRvWE1McmVjb3JkKCkpKTtcclxuICAgICAgYXJnc0xpc3RbMV0gPSBuZXcgRXhwVmFsKHRoaXMuZ2V0VHlwZSgpLCB0aGlzLmlzTnVsbCgpLCB0aGlzLmdldFZhbHVlKGZhbHNlKSk7XHJcbiAgICAgIGFyZ3MgPSBuZXcgQXJndW1lbnRzTGlzdChhcmdzTGlzdCk7XHJcbiAgICB9XHJcbiAgICBpZiAobWFpbkN0cmwgIT0gbnVsbClcclxuICAgICAgbWFpbkN0cmwuSXNJbnRlcmFjdGl2ZVVwZGF0ZSA9IGZhbHNlO1xyXG5cclxuICAgIC8vIHVwZGF0ZSB0aGUgZmllbGQgaW4gdGhlIGN1cnJlbnQgcmVjb3JkXHJcbiAgICBpZiAodGhpcy5fdHlwZSAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5VTklDT0RFICYmIFV0aWxTdHJCeXRlTW9kZS5pc0xvY2FsZURlZkxhbmdEQkNTKCkpIHtcclxuICAgICAgLy8gY291bnQgdGhlIG51bWJlciBvZiBieXRlcywgbm90IGNoYXJhY3RlcnMgKEpQTjogREJDUyBzdXBwb3J0KVxyXG4gICAgICBpZiAobmV3VmFsICE9IG51bGwpXHJcbiAgICAgICAgcmVtYWluZGVyID0gdGhpcy5fc2l6ZSAtIFV0aWxTdHJCeXRlTW9kZS5sZW5CKG5ld1ZhbCk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICByZW1haW5kZXIgPSAwO1xyXG5cclxuICAgICAgaWYgKG5ld1ZhbCAhPSBudWxsICYmIHRoaXMuX3R5cGUgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQiAmJiB0aGlzLl90eXBlICE9PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SICYmXHJcbiAgICAgICAgcmVtYWluZGVyIDwgMClcclxuICAgICAgICB0aGlzLl92YWwgPSBVdGlsU3RyQnl0ZU1vZGUubGVmdEIobmV3VmFsLCB0aGlzLl9zaXplKTtcclxuICAgICAgZWxzZSBpZiAodGhpcy5fdHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSAmJiByZW1haW5kZXIgPiAwKVxyXG4gICAgICAgIHRoaXMuX3ZhbCA9IG5ld1ZhbCArIE5TdHJpbmcuRnJvbUNoYXJzKHRoaXMuX3NwYWNlcywgMCAsIHJlbWFpbmRlcik7XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMuX3R5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQilcclxuICAgICAgICB0aGlzLl92YWwgPSBCbG9iVHlwZS5jb3B5QmxvYih0aGlzLl92YWwsIG5ld1ZhbCk7XHJcbiAgICAgIGVsc2UgdGhpcy5fdmFsID0gbmV3VmFsO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChuZXdWYWwgIT0gbnVsbClcclxuICAgICAgICByZW1haW5kZXIgPSB0aGlzLl9zaXplIC0gbmV3VmFsLmxlbmd0aDtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIHJlbWFpbmRlciA9IDA7XHJcblxyXG4gICAgICBpZiAobmV3VmFsICE9IG51bGwgJiYgdGhpcy5fdHlwZSAhPT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CICYmIHRoaXMuX3R5cGUgIT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1IgJiYgcmVtYWluZGVyIDwgMClcclxuICAgICAgICB0aGlzLl92YWwgPSBuZXdWYWwuc3Vic3RyKDAsIHRoaXMuX3NpemUpO1xyXG4gICAgICBlbHNlIGlmICgodGhpcy5fdHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5BTFBIQSB8fCB0aGlzLl90eXBlID09PSBTdG9yYWdlQXR0cmlidXRlLlVOSUNPREUpICYmIHJlbWFpbmRlciA+IDApXHJcbiAgICAgICAgdGhpcy5fdmFsID0gbmV3VmFsICsgIE5TdHJpbmcuRnJvbUNoYXJzKHRoaXMuX3NwYWNlcywgMCAsIHJlbWFpbmRlcik7XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMuX3R5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQikge1xyXG4gICAgICAgIC8vIEVuc3VyZSBfdmFsIGlzIG5vdCBudWxsLCBzbyB0aGF0IHRoZSBibG9iIGNvcHkgd2lsbCBiZVxyXG4gICAgICAgIC8vIGRvbmUgY29ycmVjdGx5LCBhY2NvcmRpbmcgdG8gdGhlIGZpZWxkJ3MgYmxvYiB0eXBlLlxyXG4gICAgICAgIGlmICh0aGlzLl92YWwgPT09IG51bGwpXHJcbiAgICAgICAgICB0aGlzLl92YWwgPSB0aGlzLmdldE1hZ2ljRGVmYXVsdFZhbHVlKCk7XHJcbiAgICAgICAgdGhpcy5fdmFsID0gQmxvYlR5cGUuY29weUJsb2IodGhpcy5fdmFsLCBuZXdWYWwpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgdGhpcy5fdmFsID0gbmV3VmFsO1xyXG4gICAgfVxyXG4gICAgLy8gSWYgZG90bmV0IHZhciBpcyB1cGRhdGVkIHdpdGggbmV3IGJsb2JwcmVmaXgsIHZhbHNFcXVhbCBpcyBmYWxzZSwgd2Ugc2hvdWxkIG5vdCBjaGVjayBpbiByZWNvcmQuXHJcbiAgICB7XHJcbiAgICAgIHJlY0ZsZFZhbCA9IHJlYy5HZXRGaWVsZFZhbHVlKHRoaXMuX2lkKTtcclxuXHJcbiAgICAgIC8vIEluIG9yZGVyIHRvIGNvbXBhcmUsIElmIHZpcnR1YWwncyBvbGQgdmFsdWUgaXMgdGFrZW4gZnJvbSByZWNvcmQsIHRoZW4gb2xkIGlzTnVsbCB2YWx1ZSBhbHNvIHNob3VsZCBiZSB0YWtlbiBmcm9tIHJlY29yZC5cclxuICAgICAgLy8gVGhpcyBzaG91bGQgYmUgZG9uZSBvbmx5IGlmIG5vdCBpbiByZS1jb21wdXRlIC8gbm90IGFyZ3VtZW50IC8gbm8gaW5pdEV4cC4pXHJcbiAgICAgIC8vIE1haW5seSAsIHRoaXMgaXMgbmVlZGVkLCB3aGVuIGN1cnNvciBpcyBwYXJrZWQgb24gb25lIHJlY29yZCBhbmQgdmlydHVhbCBpcyBtb2RpZmllZCBmcm9tIG51bGwgdG8gbm9ubnVsbCBvciB2aWNldmVyc2EgYW5kXHJcbiAgICAgIC8vIG5vdyBpZiBjdXJzb3IgbW92ZXMgZnJvbSBvbmUgcmVjb3JkIHRvIG5leHQgcmVjb3JkLCBXZSBuZWVkIHRvICBnZXQgdGhlIG9sZCBudWxsIHZhbHVlIGZyb20gcmVjb3JkLlxyXG5cclxuICAgICAgbGV0IG9sZE51bGxWYWw6IGJvb2xlYW4gPSB0aGlzLl9pc051bGw7XHJcbiAgICAgIGlmICghcmVjb21wdXRlICYmICFpc0FyZ1VwZGF0ZSAmJiB0aGlzLl9pbml0RXhwID09IG51bGwpXHJcbiAgICAgICAgb2xkTnVsbFZhbCA9IHJlYy5Jc051bGwodGhpcy5faWQpO1xyXG5cclxuICAgICAgdHJ5IHtcclxuICAgICAgICB2YWxzRXF1YWwgPSBFeHByZXNzaW9uRXZhbHVhdG9yLm1nVmFsc0VxdWFsKHRoaXMuX3ZhbCwgaXNOdWxsRmxkLCB0aGlzLl90eXBlLCByZWNGbGRWYWwsIG9sZE51bGxWYWwsIHRoaXMuX3R5cGUpO1xyXG4gICAgICB9XHJcbiAgICAgIGNhdGNoIChleGNlcHRpb24pIHtcclxuICAgICAgICB0aGlzLl92YWwgPSB0aGlzLmdldE1hZ2ljRGVmYXVsdFZhbHVlKCk7XHJcbiAgICAgICAgdmFsc0VxdWFsID0gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcbiAgICAvLyB6ZXJvIHRoZSB2ZWN0b3JcclxuICAgIGlmICh0aGlzLl9jbGVhclZlY3RvclR5cGUpXHJcbiAgICAgIHRoaXMuX3ZlY3RvclR5cGUgPSBudWxsO1xyXG4gICAgaWYgKHRoaXMuX2ludmFsaWRWYWx1ZSkge1xyXG4gICAgICB0aGlzLl9pbnZhbGlkVmFsdWUgPSBmYWxzZTtcclxuICAgICAgcmVjLmNsZWFyRmxhZyh0aGlzLl9pZCwgUmVjb3JkLkZMQUdfVVBEQVRFRCk7XHJcbiAgICAgIHJlYy5jbGVhckZsYWcodGhpcy5faWQsIFJlY29yZC5GTEFHX01PRElGSUVEKTtcclxuICAgIH1cclxuICAgIC8vIGR1cmluZyBjb21wdXRlLCB3ZSBzaG91bGQgemVybyBmaWVsZHMgd2hpY2ggYmVsb25nIHRvIGxpbmsgY3JlYXRlLlxyXG4gICAgemVyb1JlYWwgPSB0aGlzLl9saW5rQ3JlYXRlICYmIHJlYy5JbkNvbXB1dGUgJiYgIXJlY29tcHV0ZSAmJiAodGhpcy5fZm9ybSA9PSBudWxsIHx8ICF0aGlzLl9mb3JtLkluUmVzdG9yZSkgJiZcclxuICAgICAgIUFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkdldFN0b3BFeGVjdXRpb25GbGFnKCk7XHJcblxyXG4gICAgLy8gVmlydHVhbHMgd2l0aG91dCBpbml0IGV4cHJlc3Npb24gYXJlIGNvcGllZCBmcm9tIG9uZSByZWNvcmQgdG8gYW5vdGhlciwgZXZlbiBhdFxyXG4gICAgLy8gY29tcHV0ZSB0aW1lIChubyByZWNvbXB1dGUpLiBOZXZlcnRoZWxlc3MsIGluIGNhc2UgdGhlaXIgdmFsdWUgY2hhbmdlcywgd2UgbXVzdFxyXG4gICAgLy8gcGVyZm9ybSByZWNvbXB1dGUuXHJcbiAgICBpZiAoKHRoaXMuX2lzVmlydHVhbCB8fCB6ZXJvUmVhbCkgJiYgIXJlYy5pc05ld1JlYygpICYmICF2YWxzRXF1YWwpXHJcbiAgICAgIGZvcmNlVXBkYXRlID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBpZiB0aGUgcmVjb21wdXRlIGlzIGZhbHNlIGl0IG1lYW5zIHRoYXQgdGhlIHVzZXIgaXMgc2V0dGluZyBhIHZhbHVlXHJcbiAgICAvLyB0aGF0IGl0cyBzb3VyY2UgaXMgdGhlIHJlY29yZCwgdGh1cywgd2UgZG9uJ3QgaGF2ZSB0byB1cGRhdGUgdGhlIHJlY29yZC5cclxuICAgIC8vIGlmIHRoZSByZWNvbXB1dGUgaXMgdHJ1ZSwgZ28gYWhlYWQgYW5kIHVwZGF0ZSB0aGUgcmVjb3JkLlxyXG4gICAgaWYgKGNoZWNrRm9yVmFyaWFibGVDaGFuZ2UgfHwgZm9yY2VVcGRhdGUgfHwgcmVjLmlzTmV3UmVjKCkpIHtcclxuICAgICAgdGhpcy5VcGRhdGVOdWxsKGlzTnVsbEZsZCwgcmVjKTtcclxuXHJcbiAgICAgIGlmIChzZXRDcnNyTW9kaWZpZWQpXHJcbiAgICAgICAgcmVjLnNldEZsYWcodGhpcy5faWQsIFJlY29yZC5GTEFHX0NSU1JfTU9ESUZJRUQpO1xyXG4gICAgICByZWMuc2V0RmllbGRWYWx1ZSh0aGlzLl9pZCwgdGhpcy5fdmFsLCBzZXRSZWNvcmRNb2RpZmllZCk7XHJcbiAgICAgIGV2dHMgPSBGaWVsZC5fdmFyaWFibGVDaGFuZ2VFdnRzO1xyXG4gICAgICBwZW5kaW5nRXZlbnRzID0gZXZ0cy5sZW5ndGg7XHJcbiAgICAgIGlmIChjaGVja0ZvclZhcmlhYmxlQ2hhbmdlICYmIHRoaXMuZ2V0SGFzQ2hhbmdlRXZlbnQoKSAmJiAhZXZ0cy5Db250YWlucyh0aGlzKSAmJiAhdmFsc0VxdWFsKSB7XHJcbiAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSB2YXJpYWJsZSBjaGFuZ2UgaGFuZGxlciAtIHNhdmUgdmFsdWUgYW5kIHByZXBhcmUgcGFyYW1zXHJcbiAgICAgICAgbGV0IHJ0RXZ0ID0gbmV3IFJ1blRpbWVFdmVudCh0aGlzKTtcclxuICAgICAgICBydEV2dC5zZXRJbnRlcm5hbChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVkFSSUFCTEUpO1xyXG4gICAgICAgIHJ0RXZ0LnNldEFyZ0xpc3QoYXJncyk7XHJcbiAgICAgICAgZXZ0cy5wdXNoKHRoaXMpO1xyXG4gICAgICAgIGV2dHMucHVzaChydEV2dCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGNoZWNrIGZvciByZWNvbXB1dGUgYW5kIGV4ZWN1dGUgaXRcclxuICAgICAgLy8gUUNSICMyOTk2MDksIGlmIHdlIGFyZSBpbiBsb2NhbCBkYXRhdmlldyBtYW5hZ2VyLCB3ZSBjYW4gb25seSBjb21wdXRlLlxyXG4gICAgICAvLyBSZWNvbXB1dGUgaXMgbm90IGFsbG93ZWQsIHNpbmNlIGl0IHdpbGwgYmUgZXhlY3V0ZWQgbXVsdGlwbGUgdGltZXNcclxuICAgICAgaWYgKHRoaXMuX3JlY29tcHV0ZSAhPSBudWxsICYmIChyZWNvbXB1dGUgfHwgZm9yY2VVcGRhdGUpICYmICEoPERhdGFWaWV3PnRoaXMuX2RhdGF2aWV3KS5JbkxvY2FsRGF0YXZpZXdDb21tYW5kKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIC8vIGlmIGZpZWxkIGNhdXNlZCB0YWJsZSBpbnZhbGlkYXRpb24gYW5kIGl0J3MgdmFsdWUgd2FzIGNoYW5nZWRcclxuICAgICAgICAgIGlmIChmb3JjZVVwZGF0ZSlcclxuICAgICAgICAgICAgcmVjLkluRm9yY2VVcGRhdGUgPSB0cnVlO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5fcmVjb21wdXRlLmV4ZWN1dGUocmVjKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZpbmFsbHkge1xyXG4gICAgICAgICAgaWYgKGZvcmNlVXBkYXRlKVxyXG4gICAgICAgICAgICByZWMuSW5Gb3JjZVVwZGF0ZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5fY2F1c2VUYWJsZUludmFsaWRhdGlvbiAmJiB0aGlzLmlzQ2hhbmdlZCh0aGlzLl92YWwsIGlzTnVsbEZsZCkpXHJcbiAgICAgICAgcmVjLnNldENhdXNlSW52YWxpZGF0aW9uKHRydWUpO1xyXG5cclxuICAgICAgLy8gRG9uJ3QgdXBkYXRlIGNvbnRyb2xzIHdoaWxlIGZldGNoaW5nIHJlY29yZHMgZnJvbSBsb2NhbCBkYXRhYmFzZS4gSWYgdGhlIHRhc2sgaGFzIGEgdGFibGUgY29udHJvbCwgdGhlbiBhY3R1YWwgY29udHJvbHMgb24gdGhlXHJcbiAgICAgIC8vIHJvd3MgYXJlIGNyZWF0ZWQgYWZ0ZXIgbm8uIG9mIHJvd3MgaXMga25vd24gKGFuZCB0aGlzIGlzIGFmdGVyIHRoZSBkYXRhIGlzIGF2YWlhbGFibGUpLiBTbywgd2hpbGUgZmV0Y2hpbmcgcmVjb3JkcywgY29udHJvbHMgaW5cclxuICAgICAgLy8gdGFibGUgYXJlIG5vdCB5ZXQgY3JlYXRlZCBhbmQgaGVuY2UgdGhlcmUgaXMgYW4gYXNzZXJ0IHdoaWxlIHRyeWluZyB0byB1cGRhdGUgdGhlIGNvbnRyb2xzLiBBZnRlciBza2lwcGluZyB0aGlzIHVwZGF0ZSwgdGhlIGNvbnRyb2xzXHJcbiAgICAgIC8vIGFyZSB1cGRhdGVkIGZyb20gb3RoZXIgcGxhY2VzIChyZWZyZXNoVGFibGUsIGNvbW1vbkhhbmRsZXJCZWZvcmUsIGhhbmRsZVJvd0RhdGFDdXJQYWdlIGV0YyBsaWtlIGl0IGhhcHBlbnMgZm9yIHNlcnZlciBkYXRhKVxyXG4gICAgICBpZiAoKHJlY29tcHV0ZSB8fCBmb3JjZVVwZGF0ZSkgJiYgISg8RGF0YVZpZXc+dGhpcy5fZGF0YXZpZXcpLkluTG9jYWxEYXRhdmlld0NvbW1hbmQgJiYgbWFpbkN0cmwgIT0gbnVsbCkge1xyXG4gICAgICAgIGlmIChtYWluQ3RybC5pc0Nob2ljZUNvbnRyb2woKSlcclxuICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlRGlzcGxheSgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBSaWdodCBhZnRlciB3ZSBleGl0IHRoZSB0b3Btb3N0IHVwZGF0ZSAtIGV4ZWN1dGUgYWxsIHZhcmlhYmxlIGNoYW5nZSBldmVudHMuXHJcbiAgICAgIC8vIG5vdGUgdGhhdCBkdXJpbmcgdGhpcyBleGVjdXRpb24sIG5ldyBvbmVzIG1heSBiZSBjcmVhdGVkLlxyXG4gICAgICBpZiAocGVuZGluZ0V2ZW50cyA9PT0gMCAmJiBjaGVja0ZvclZhcmlhYmxlQ2hhbmdlICYmIHRoaXMuZ2V0SGFzQ2hhbmdlRXZlbnQoKSkge1xyXG4gICAgICAgIHdoaWxlIChldnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGxldCBldnQgPSA8UnVuVGltZUV2ZW50PmV2dHMuZ2V0X0l0ZW0oMSk7XHJcbiAgICAgICAgICBldnRzLlJlbW92ZUF0KDApO1xyXG4gICAgICAgICAgZXZ0cy5SZW1vdmVBdCgwKTtcclxuICAgICAgICAgIGlmIChMYXN0Rm9jdXNlZE1hbmFnZXIuSW5zdGFuY2UuZ2V0TGFzdEZvY3VzZWRUYXNrKCkgPT0gbnVsbClcclxuICAgICAgICAgICAgZXZ0LnNldFRhc2soPFRhc2s+dGhpcy5nZXRUYXNrKCkpO1xyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCB0YXNrUmVmOiBUYXNrID0gTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpO1xyXG4gICAgICAgICAgICAvLyBJZiB3ZSBhcmUgaW4gdmFyaWFibGUgY2hhbmdlIGV2ZW50IGFuZCBUYXNrU3VmZml4IGlzIGV4ZWN1dGVkLCBpdCBtZWFucyB3ZSBhcmUgaGVyZSBmcm9tXHJcbiAgICAgICAgICAgIC8vIHVwZGF0ZSBhcmd1bWVudHMgd2hpbGUgY2xvc2luZyB0aGUgdGFzay4gSW4gc3VjaCBjYXNlLCB3ZSBzaG91bGQgc2V0IHRoZSBldmVudCB0YXNrIGFzIFBhdGhQYXJlbnRUYXNrXHJcbiAgICAgICAgICAgIC8vIGFuZCBub3QgdGhlIHRhc2sgaXRzZWxmLlxyXG4gICAgICAgICAgICBpZiAodGFza1JlZi5UYXNrU3VmZml4RXhlY3V0ZWQpIHtcclxuICAgICAgICAgICAgICB0YXNrUmVmID0gKHRhc2tSZWYuUGF0aFBhcmVudFRhc2sgIT0gbnVsbCkgPyA8VGFzaz50YXNrUmVmLlBhdGhQYXJlbnRUYXNrIDogdGFza1JlZjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBldnQuc2V0VGFzayh0YXNrUmVmKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGV2dC5zZXRDdHJsKExhc3RGb2N1c2VkTWFuYWdlci5nZXRMYXN0Rm9jdXNlZENvbnRyb2woKSk7XHJcbiAgICAgICAgICBhd2FpdCBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5oYW5kbGVFdmVudChldnQsIGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vICM3NzYwMzEgLSB0aGUgZmllbGQgc2hvdWxkIGJlIG1hcmtlZCBtb2RpZmllZCBvbmx5IGlmIHZhbCBhcmUgbm90IGVxdWFsLiBPdGhlcndpc2UsIGV2ZW4gZm9yIG51bGwgZmllbGQgcGFyYW10ZXIgcGFzc2luZ1xyXG4gICAgLy8gb3Igc2FtZSB2YWx1ZSB1cGRhdGUsIGl0IGlzIG1hcmtlZCBhcyBtb2RpZmllZCBhbmQgUlMgaXMgZXhlY3V0ZWQuXHJcbiAgICBpZiAocmVjb21wdXRlICYmICF2YWxzRXF1YWwpXHJcbiAgICAgIHRoaXMuc2V0TW9kaWZpZWQoKTtcclxuICAgIHJldHVybiAhdmFsc0VxdWFsO1xyXG4gIH1cclxuXHJcbiAgVXBkYXRlTnVsbChpc051bGxGbGQ6IGJvb2xlYW4sIHJlYzogUmVjb3JkKTogdm9pZCB7XHJcbiAgICBpZiAoaXNOdWxsRmxkKVxyXG4gICAgICByZWMuc2V0RmxhZyh0aGlzLl9pZCwgUmVjb3JkLkZMQUdfTlVMTCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJlYy5jbGVhckZsYWcodGhpcy5faWQsIFJlY29yZC5GTEFHX05VTEwpO1xyXG4gICAgdGhpcy5faXNOdWxsID0gaXNOdWxsRmxkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBhIHZlYyBjZWxsXHJcbiAgLy8vICAgY2FuIG5vdCBiZSBleGVjdXRlZCB3aXRob3V0IHRoZSBsb2dpYyBmcm9tIGV2YWxfb3BfdmVjR2V0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImlkeFwiPnRoZSBjZWxsIGluZGV4IGluIHRoZSB2ZWN0b3Igc3RyYXRzIGZyb20gMTwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJuZXdWYWxcIj50aGUgbmV3IHZhbHVlPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInZhbElzTnVsbFwiPmlzIHRoZSBiZXcgdmFsdWUgbnVsbDwvcGFyYW0+XHJcbiAgYXN5bmMgc2V0Q2VsbFZlY1ZhbHVlKGlkeDogbnVtYmVyLCBuZXdWYWw6IHN0cmluZywgdmFsSXNOdWxsOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBsZXQgcmVzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5fdHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5CTE9CX1ZFQ1RPUikge1xyXG4gICAgICAvLyBpbml0aWFsaXplZCB0aGUgdmVjdG9yIG9iamVjdCBpZiBuZWVkZWRcclxuICAgICAgaWYgKHRoaXMuX3ZlY3RvclR5cGUgPT0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMuX3ZlY3RvclR5cGUgPSB0aGlzLmlzTnVsbCgpXHJcbiAgICAgICAgICA/IG5ldyBWZWN0b3JUeXBlKHRoaXMuX3ZlY0NlbGxzVHlwZSwgdGhpcy5fdmVjQ2VsbHNDb250ZW50VHlwZSwgdGhpcy5EZWZhdWx0VmFsdWUsIHRoaXMuaXNOdWxsRGVmYXVsdCgpLFxyXG4gICAgICAgICAgdGhpcy5OdWxsQWxsb3dlZCwgdGhpcy5fdmVjQ2VsbHNTaXplKVxyXG4gICAgICAgICAgOiBuZXcgVmVjdG9yVHlwZSh0aGlzLl92YWwpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIGlmIHZlY0NlbGxzVHlwZSBpcyBCTE9CLCBjb252ZXJ0IGRhdGEgaW50byBibG9iXHJcbiAgICAgIGlmICh0aGlzLl92ZWNDZWxsc1R5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQikge1xyXG4gICAgICAgIGxldCB0bXBOZXdWYWw6IHN0cmluZyA9IHRoaXMuZ2V0Q2VsbERlZnVhbHRWYWx1ZSgpO1xyXG4gICAgICAgIG5ld1ZhbCA9IEJsb2JUeXBlLmNvcHlCbG9iKHRtcE5ld1ZhbCwgbmV3VmFsKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmVzID0gdGhpcy5fdmVjdG9yVHlwZS5zZXRWZWNDZWxsKGlkeCwgbmV3VmFsLCB2YWxJc051bGwpO1xyXG4gICAgICAvLyBzdGFydCByZWNvbXB1dGVcclxuICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgIHRoaXMuX2NsZWFyVmVjdG9yVHlwZSA9IGZhbHNlO1xyXG4gICAgICAgIC8vIFFDUiA5ODQ1NjMgZG8gbm90IHNldCB0aGUgcmVjb3JkIGFzIGNoYW5nZWRcclxuICAgICAgICBhd2FpdCB0aGlzLnNldFZhbHVlQW5kU3RhcnRSZWNvbXB1dGUodGhpcy5fdmVjdG9yVHlwZS50b1N0cmluZygpLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTtcclxuICAgICAgICB0aGlzLl9jbGVhclZlY3RvclR5cGUgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGNlbGwgdmFsdWUgb2YgYSBnaXZlbiBjZWxsIGluIHRoZSB2ZWN0b3JcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cmV0dXJucz4gdGhlIGNlbGwncyB2YWx1ZSBhcyBzdHJpbmc8L3JldHVybnM+XHJcbiAgZ2V0VmVjQ2VsbFZhbHVlKGlkeDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLl90eXBlID09PSBTdG9yYWdlQXR0cmlidXRlLkJMT0JfVkVDVE9SKSB7XHJcbiAgICAgIC8vIGlmIHdlIGFyZSBoZXJlIHRoYW4gdGhlIGZpbGVkIG11c3QgaGF2ZSBub25lIG51bGwgdmFsdWUgb2YgYSB2ZWN0b3JcclxuICAgICAgaWYgKHRoaXMuX3ZlY3RvclR5cGUgPT0gbnVsbClcclxuICAgICAgICB0aGlzLl92ZWN0b3JUeXBlID0gbmV3IFZlY3RvclR5cGUodGhpcy5fdmFsKTtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLl92ZWN0b3JUeXBlLmdldFZlY0NlbGwoaWR4KTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgcmVjb21wdXRlZCB2YXJpYWJsZSB0byB0cnVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRSZWNvbXB1dGVkKCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGludmFsaWRhdGUgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC4gQW4gaW52YWxpZCB2YWx1ZSBmb3JjZXMgdXMgdG8gcmUtY2FsY3VsYXRlIHRoZSBmaWVsZCdzXHJcbiAgLy8vICAgdmFsdWUgYnkgY29weWluZyBpdCBmcm9tIHRoZSBkYXRhdmlldy5cclxuICAvLy8gICB1c2VkIHdoZW4gc3dpdGNoaW5nIHRvIGFub3RoZXIgcmVjb3JkXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImZvcmNlSW52YWxpZGF0ZVwiPi0gRG9udCBjaGVjayB0aGUgZmllbGQncyB0eXBlIGFuZCBtYWtlIGl0IGludmFsaWQgKHVzdWFsbHkgVmlydHVhbHNcclxuICAvLy8gICB3aXRob3V0IGluaXQgZXhwcmVzc2lvbiBhcmUgbmV2ZXIgaW52YWxpZGF0ZWQsIHNpbmNlIHRoZXkgcmV0YWluIHRoZWlyIHZhbHVlIHdoZW4gbW92aW5nXHJcbiAgLy8vICAgYmV0d2VlbiByZWNvcmRzKS5cclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjbGVhckZsYWdzXCI+PC9wYXJhbT5cclxuICBpbnZhbGlkYXRlKGZvcmNlSW52YWxpZGF0ZTogYm9vbGVhbiwgY2xlYXJGbGFnczogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IHJlYzogUmVjb3JkID0gKDxEYXRhVmlldz50aGlzLl9kYXRhdmlldykuZ2V0Q3VyclJlYygpO1xyXG5cclxuICAgIGlmICghdGhpcy5faXNWaXJ0dWFsIHx8IHRoaXMuX3ZpckFzUmVhbCB8fCB0aGlzLl9pbml0RXhwICE9PSBudWxsIHx8IGZvcmNlSW52YWxpZGF0ZSkge1xyXG4gICAgICB0aGlzLl9pbnZhbGlkVmFsdWUgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKGNsZWFyRmxhZ3MgJiYgcmVjICE9PSBudWxsKSB7XHJcbiAgICAgIHJlYy5jbGVhckZsYWcodGhpcy5faWQsIFJlY29yZC5GTEFHX1VQREFURUQpO1xyXG4gICAgICByZWMuY2xlYXJGbGFnKHRoaXMuX2lkLCBSZWNvcmQuRkxBR19NT0RJRklFRCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IE5hbWUgb2YgdGFibGVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBnZXRUYWJsZU5hbWUoKTogU3RyaW5nIHtcclxuICAgIGlmICh0aGlzLl90YWJsZU5hbWUgPT0gbnVsbClcclxuICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICByZXR1cm4gdGhpcy5fdGFibGVOYW1lO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGZvciBnZXQgVkFSTkFNRSBmdW5jdGlvbiB1c2VcclxuICAvLy8gICBBIHN0cmluZyBjb250YWluaW5nIHRoZSB0YWJsZSBuYW1lIHdoZXJlIHRoZSB2YXJpYWJsZSBvcmlnaW5hdGVzLFxyXG4gIC8vLyAgIGNvbmNhdGVuYXRlZCB3aXRoICcuJyBhbmQgdGhlIHZhcmlhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSB2YXJpYWJsZSBpbiB0aGF0IHRhYmxlLlxyXG4gIC8vLyAgIElmIHRoZSB2YXJpYWJsZSBpcyBhIHZpcnR1YWwgb25lLCB0aGVuIHRoZSB0YWJsZSBuYW1lIHdvdWxkIGluZGljYXRlICdWaXJ0dWFsJy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBnZXROYW1lKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5faXNQYXJhbSlcclxuICAgICAgcmV0dXJuIFwiUGFyYW1ldGVyLlwiICsgdGhpcy5nZXRWYXJOYW1lKCk7XHJcbiAgICBlbHNlIGlmICh0aGlzLl9pc1ZpcnR1YWwpXHJcbiAgICAgIHJldHVybiBcIlZpcnR1YWwuXCIgKyB0aGlzLmdldFZhck5hbWUoKTtcclxuICAgIGVsc2UgcmV0dXJuIHRoaXMuZ2V0VGFibGVOYW1lKCkgKyBcIi5cIiArIHRoaXMuZ2V0VmFyTmFtZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHRlc3QgZm9yIGEgbnVsbGl0eVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVibGljIGlzTnVsbCgpOiBib29sZWFuIHtcclxuICAgIGlmICgoPFRhc2s+c3VwZXIuZ2V0VGFzaygpKS5nZXRFdmFsT2xkVmFsdWVzKCkpXHJcbiAgICAgIHJldHVybiB0aGlzLmlzT3JpZ2luYWxWYWx1ZU51bGwoKTtcclxuICAgIGVsc2UgaWYgKHRoaXMuX2ludmFsaWRWYWx1ZSlcclxuICAgICAgdGhpcy50YWtlVmFsRnJvbVJlYygpO1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzTnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIFByZXZJc051bGwoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcHJldklzTnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICB0ZXN0IGZvciBhbiBtb2RpZmllZCBmbGFnXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc01vZGlmaWVkKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGN1cnJSZWM6IFJlY29yZCA9ICg8RGF0YVZpZXc+dGhpcy5fZGF0YXZpZXcpLmdldEN1cnJSZWMoKTtcclxuICAgIHJldHVybiBjdXJyUmVjLmlzRmxkTW9kaWZpZWQodGhpcy5faWQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgbW9kaWZpZWQgZmxhZ1xyXG4gIC8vLyAgIHBsZWFzZSBub3RlIHRoYXQgY2xlYXJpbmcgdGhlIGZsYWcgaXMgZG9uZSBleHBsaWNpdGx5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzZXRNb2RpZmllZCgpOiB2b2lkIHtcclxuICAgIGxldCByZWM6IFJlY29yZCA9ICgoPERhdGFWaWV3PnRoaXMuX2RhdGF2aWV3KS5nZXRDdXJyUmVjKCkpO1xyXG4gICAgcmVjLnNldEZsYWcodGhpcy5faWQsIFJlY29yZC5GTEFHX01PRElGSUVEKTtcclxuXHJcbiAgICAvLyBUaGlzIGZsYWcgd2lsbCBiZSBzZXQgYXMgRkxBR19NT0RJRklFRCBhbmQgbmV2ZXIgY2xlYXJlZC4gUWNyICM5MjY4MTVcclxuICAgIHJlYy5zZXRGbGFnKHRoaXMuX2lkLCBSZWNvcmQuRkxBR19NT0RJRklFRF9BVExFQVNUX09OQ0UpO1xyXG4gICAgaWYgKHRoaXMuSXNWaXJ0dWFsKVxyXG4gICAgICB0aGlzLm1vZGlmaWVkQXRMZWFzdE9uY2UgPSB0cnVlO1xyXG4gICAgLy8gdGhlIHNldHRpbmcgb2YgdGhlIHJlY29yZCBtb2RpZmllZCBmbGFnIGlzIGRvbmUgZXhwbGljaXRseVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCB0aGUgdXBkYXRlZCBmbGFnXHJcbiAgLy8vICAgcGxlYXNlIG5vdGUgdGhhdCBjbGVhcmluZyB0aGUgZmxhZyBpcyBkb25lIGV4cGxpY2l0bHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldFVwZGF0ZWQoKTogdm9pZCB7XHJcbiAgICBsZXQgY3VyclJlYzogUmVjb3JkID0gKDxEYXRhVmlldz50aGlzLl9kYXRhdmlldykuZ2V0Q3VyclJlYygpO1xyXG4gICAgY3VyclJlYy5zZXRGbGFnKHRoaXMuX2lkLCBSZWNvcmQuRkxBR19VUERBVEVEKTtcclxuICAgIGN1cnJSZWMuc2V0VXBkYXRlZCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGlzIGZpZWxkIGlzIGEgcGFyYW1ldGVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc1BhcmFtKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzUGFyYW07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyBpZiB0aGUgZmllbGQgaW4gZXZhbHVhdGlvbiBwcm9jZXNzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc0luRXZhbFByb2Nlc3MoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faW5FdmFsUHJvY2VzcztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhlIGZpZWxkIGhhcyBhbiBpbml0IGV4cHJlc3Npb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGhhc0luaXRFeHAoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faW5pdEV4cCAhPT0gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRydWUgaWYgdGhlIHNlcnZlciByZWNvbXB1dGVzIHRoaXMgZmllbGRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGlzU2VydmVyUmNtcCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9yZWNvbXB1dGUgIT09IG51bGwgJiYgdGhpcy5fcmVjb21wdXRlLmlzU2VydmVyUmNtcCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIHBpY3R1cmUgb2YgdGhlIGZpZWxkIGFzIGEgc3RyaW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRQaWN0dXJlKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGljdHVyZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSB0aGUgaWQgb2YgdGhlIGxpbmsgdGhpcyBmaWVsZCBiZWxvbmcgdG9cclxuICAvLy8gICBpZiBkb2VzIG5vdCBiZWxvbmcgdG8gYW55IGxpbmsgcmV0dXJuIC0xXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXREYXRhdmlld0hlYWRlcklkKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGF0YXZpZXdIZWFkZXJJZDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB3aGV0aGVyIHRoZSBmaWVsZCBiZWxvbmdzIHRvIGEgbGluayBvciBub3RcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldCBJc0xpbmtGaWVsZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc0xpbmtGbGQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZXZhbHVhdGVzIGFuZCByZXR1cm5zIHRoZSBpbml0IGV4cHJlc3Npb24gdmFsdWUgb2YgdGhpcyBmaWVsZCAobnVsbCBpZiB0aGVyZSBpcyBub24pXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwdWJsaWMgYXN5bmMgZ2V0SW5pdEV4cFZhbChyZXM6IFJlZlBhcmFtPHN0cmluZz4sIGlzTnVsbDogUmVmUGFyYW08Ym9vbGVhbj4pOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICBpZiAodGhpcy5faW5pdEV4cCAhPSBudWxsKVxyXG4gICAgICBhd2FpdCB0aGlzLkV2YWx1YXRlSW5pdEV4cHJlc3Npb24ocmVzLCBpc051bGwpO1xyXG4gICAgZWxzZVxyXG4gICAgICByZXMudmFsdWUgPSB0aGlzLmdldERlZmF1bHRWYWx1ZSgpO1xyXG4gIH1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXRzIHRoZSBoYXNDaGFuZ2VFdmVudCBmbGFnIHRvIFRSVUVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHNldEhhc0NoYW5nZUV2ZW50KCk6IHZvaWQge1xyXG4gICAgdGhpcy5faGFzQ2hhbmdlRXZlbnQgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHJpZXZlcyB0aGUgaGFzQ2hhbmdlRXZlbnQgZmxhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBnZXRIYXNDaGFuZ2VFdmVudCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9oYXNDaGFuZ2VFdmVudDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgaGFzWm9vbUhhbmRsZXIgdG8gdHJ1ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0SGFzWm9vbUhhbmRsZXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9oYXNab29tSGFuZGxlciA9IHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHJldHVybnM+IHRoZSBoYXNab29tSGFuZGxlclxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgZ2V0SGFzWm9vbUhhbmRsZXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faGFzWm9vbUhhbmRsZXI7XHJcbiAgfVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiBpbiB0aGlzIGZpZWxkIHdpbGwgY2F1c2UgaW52YWxpZGF0aW9uIG9mIGFsbCByb3dzIGluIHRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGlzQ2F1c2VUYWJsZUludmFsaWRhdGlvbigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9jYXVzZVRhYmxlSW52YWxpZGF0aW9uO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHNldCBjYXVzZSBUYWJsZSBJbnZhbGlkYXRpb24gbWVtYmVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImNhdXNlVGFibGVJbnZhbGlkYXRpb25cIj48L3BhcmFtPlxyXG4gIGNhdXNlVGFibGVJbnZhbGlkYXRpb24oY2F1c2VUYWJsZUludmFsaWRhdGlvbjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5fY2F1c2VUYWJsZUludmFsaWRhdGlvbiA9IGNhdXNlVGFibGVJbnZhbGlkYXRpb247XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgd2hlbiB2YWx1ZSBpcyBudWxsLCBnZXQgdmFsdWUgdGhhdCByZXByZXNlbnQgbnVsbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJjaGVja051bGxBcml0aG1ldGljXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGdldFZhbHVlRm9yTnVsbChjaGVja051bGxBcml0aG1ldGljOiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgIGxldCB2YWw6IHN0cmluZztcclxuICAgIGlmICh0aGlzLk51bGxBbGxvd2VkKSB7XHJcblxyXG4gICAgICBpZiAoY2hlY2tOdWxsQXJpdGhtZXRpYyAmJiBzdXBlci5nZXRUYXNrKCkuZ2V0TnVsbEFyaXRobWV0aWMoKSA9PT0gQ29uc3RhbnRzLk5VTExfQVJJVEhfTlVMTElGWSkge1xyXG4gICAgICAgIHZhbCA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX251bGxWYWx1ZSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgdGhpcy5fbnVsbFZhbHVlID0gc3VwZXIuZ2V0TWFnaWNEZWZhdWx0VmFsdWUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFsID0gdGhpcy5fbnVsbFZhbHVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdmFsID0gc3VwZXIuZ2V0TWFnaWNEZWZhdWx0VmFsdWUoKTtcclxuICAgIH1cclxuICAgIHJldHVybiB2YWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgY29udHJvbCB3aGljaCBpcyBhdHRhY2hlZCB0byB0aGUgZmllbGQgYW5kIHJlc2lkZXMgb24gdGhlIHNhbWUgdGFza1xyXG4gIC8vLyAgIG9mIG9mIHRoZSBmaWVsZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHVibGljIGdldEN0cmwoKTogTWdDb250cm9sIHtcclxuICAgIGxldCBjdHJsOiBNZ0NvbnRyb2w7XHJcblxyXG4gICAgaWYgKHRoaXMuX2NvbnRyb2xzICE9IG51bGwpIHtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuX2NvbnRyb2xzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY3RybCA9IDxNZ0NvbnRyb2w+dGhpcy5fY29udHJvbHMuZ2V0X0l0ZW0oaSk7XHJcbiAgICAgICAgaWYgKGN0cmwuZ2V0Rm9ybSgpLmdldFRhc2soKSA9PT0gdGhpcy5nZXRUYXNrKCkpXHJcbiAgICAgICAgICByZXR1cm4gY3RybDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdXBkYXRlIHRoZSBkaXNwbGF5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBhc3luYyB1cGRhdGVEaXNwbGF5KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgc3VwZXIudXBkYXRlRGlzcGxheVdpdGhWYWx1ZSh0aGlzLmdldERpc3BWYWx1ZSgpLCB0aGlzLmlzTnVsbCgpKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIHZhbHVlIHRvIGRpc3BsYXlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHB1YmxpYyBnZXREaXNwVmFsdWUoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLmlzTnVsbCgpKSB7XHJcbiAgICAgIGlmICh0aGlzLl9udWxsRGlzcGxheSAhPSBudWxsKVxyXG4gICAgICAgIHJldHVybiB0aGlzLmdldE51bGxEaXNwbGF5KCk7XHJcbiAgICAgIGVsc2UgcmV0dXJuIHN1cGVyLmdldE1hZ2ljRGVmYXVsdFZhbHVlKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHJldHVybiB0aGlzLmdldFZhbHVlKGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gdHJ1ZSwgaWYgcmFuZ2UgY29uZGl0aW9uIHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoZSBpZWxkIGR1cmluZyBjb21wdXRlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXQgU2hvdWxkQ2hlY2tSYW5nZUluQ29tcHV0ZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLklzTGlua0ZpZWxkIHx8ICh0aGlzLklzVmlydHVhbCAmJiAoPERhdGFWaWV3PnRoaXMuX2RhdGF2aWV3KS5IYXNNYWluVGFibGUpO1xyXG4gIH1cclxuXHJcbiAgSXNGb3JBcmd1bWVudCh0YXNrSGFzUGFyYW1ldGVyczogYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgLy8gSWYgd2UgbmVlZCBhIHBhcmFtZXRlciBhbmQgdGhlIGZpZWxkIGlzIG5vdCBvbmVcclxuICAgIGlmICh0YXNrSGFzUGFyYW1ldGVycykge1xyXG4gICAgICBpZiAoIXRoaXMuaXNQYXJhbSgpKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKCF0aGlzLklzVmlydHVhbCkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|