@magic-xpa/engine 4.801.0-dev481.243 → 4.801.0-dev481.249

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