@magic-xpa/engine 4.800.0 → 4.801.0-dev000.0

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 (379) 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/esm2020/src/GuiEventsProcessor.mjs +171 -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/esm2020/src/commands/ClientToServer/BrowserEscEventCommand.mjs +23 -0
  23. package/esm2020/src/commands/ClientToServer/ClientOriginatedCommand.mjs +15 -0
  24. package/esm2020/src/commands/ClientToServer/ClientOriginatedCommandSerializer.mjs +60 -0
  25. package/esm2020/src/commands/ClientToServer/ColumnSortEventCommand.mjs +26 -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/esm2020/src/commands/ClientToServer/ComputeEventCommand.mjs +23 -0
  29. package/esm2020/src/commands/ClientToServer/ContextTerminationEventCommand.mjs +21 -0
  30. package/esm2020/src/commands/ClientToServer/ContextTimeoutResetCommand.mjs +20 -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} +2 -2
  34. package/esm2020/src/commands/ClientToServer/EvaluateCommand.mjs +36 -0
  35. package/esm2020/src/commands/ClientToServer/EventCommand.mjs +40 -0
  36. package/esm2020/src/commands/ClientToServer/ExecOperCommand.mjs +67 -0
  37. package/esm2020/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs +22 -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/esm2020/src/commands/ClientToServer/IndexChangeEventCommand.mjs +21 -0
  41. package/esm2020/src/commands/ClientToServer/IniputForceWriteCommand.mjs +23 -0
  42. package/esm2020/src/commands/ClientToServer/NonReversibleExitEventCommand.mjs +23 -0
  43. package/esm2020/src/commands/ClientToServer/QueryCommand.mjs +21 -0
  44. package/esm2020/src/commands/ClientToServer/RecomputeCommand.mjs +27 -0
  45. package/esm2020/src/commands/ClientToServer/RefreshEventCommand.mjs +27 -0
  46. package/esm2020/src/commands/ClientToServer/RefreshScreenEventCommand.mjs +24 -0
  47. package/esm2020/src/commands/ClientToServer/RollbackEventCommand.mjs +39 -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/esm2020/src/commands/ClientToServer/SubformOpenEventCommand.mjs +21 -0
  51. package/esm2020/src/commands/ClientToServer/SubformRefreshEventCommand.mjs +24 -0
  52. package/esm2020/src/commands/ClientToServer/TransactionCommand.mjs +28 -0
  53. package/{esm2015/src/commands/ClientToServer/UnloadCommand.js → esm2020/src/commands/ClientToServer/UnloadCommand.mjs} +0 -0
  54. package/esm2020/src/commands/ClientToServer/WriteMessageToServerLogCommand.mjs +18 -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/esm2020/src/data/Record.mjs +846 -0
  87. package/{esm2015/src/data/RecordOutOfDataViewException.js → esm2020/src/data/RecordOutOfDataViewException.mjs} +0 -0
  88. package/esm2020/src/data/RecordsTable.mjs +267 -0
  89. package/esm2020/src/data/TaskTransactionManager.mjs +103 -0
  90. package/esm2020/src/data/XMLBasedDcValuesBuilder.mjs +74 -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/esm2020/src/event/EventHandlerPosition.mjs +201 -0
  101. package/esm2020/src/event/EventsManager.mjs +2983 -0
  102. package/esm2020/src/event/IEventsManager.mjs +7 -0
  103. package/esm2020/src/event/RunTimeEvent.mjs +406 -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/esm2020/src/exp/ExpressionLocalJpn.mjs +314 -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/esm2020/src/remote/ServerError.mjs +44 -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/esm2020/src/rt/DataviewHeaderFactory.mjs +7 -0
  145. package/{esm2015/src/rt/DataviewHeaders.js → esm2020/src/rt/DataviewHeaders.mjs} +0 -0
  146. package/esm2020/src/rt/DataviewHeadersSaxHandler.mjs +39 -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/esm2020/src/rt/Transaction.mjs +54 -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/esm2020/src/tasks/RemoteTaskService.mjs +45 -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/esm2020/src/tasks/sort/SortCollection.mjs +72 -0
  176. package/{esm2015/src/util/ConstUtils.js → esm2020/src/util/ConstUtils.mjs} +0 -0
  177. package/{esm2015/src/util/FlowMonitorQueue.js → esm2020/src/util/FlowMonitorQueue.mjs} +15 -18
  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/esm2020/src/util/Process.mjs +7 -0
  187. package/esm2020/src/util/ReturnResult.mjs +46 -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} +267 -254
  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/GuiEventsProcessor.d.ts +1 -1
  201. package/src/commands/ClientToServer/BrowserEscEventCommand.d.ts +1 -2
  202. package/src/commands/ClientToServer/ClientOriginatedCommand.d.ts +1 -2
  203. package/src/commands/ClientToServer/ColumnSortEventCommand.d.ts +1 -2
  204. package/src/commands/ClientToServer/ComputeEventCommand.d.ts +1 -2
  205. package/src/commands/ClientToServer/ContextTerminationEventCommand.d.ts +1 -2
  206. package/src/commands/ClientToServer/ContextTimeoutResetCommand.d.ts +1 -2
  207. package/src/commands/ClientToServer/DataviewCommand.d.ts +1 -2
  208. package/src/commands/ClientToServer/EvaluateCommand.d.ts +1 -2
  209. package/src/commands/ClientToServer/EventCommand.d.ts +1 -2
  210. package/src/commands/ClientToServer/ExecOperCommand.d.ts +1 -2
  211. package/src/commands/ClientToServer/FetchDataControlValuesEventCommand.d.ts +1 -2
  212. package/src/commands/ClientToServer/IndexChangeEventCommand.d.ts +1 -2
  213. package/src/commands/ClientToServer/IniputForceWriteCommand.d.ts +1 -2
  214. package/src/commands/ClientToServer/NonReversibleExitEventCommand.d.ts +1 -2
  215. package/src/commands/ClientToServer/QueryCommand.d.ts +1 -2
  216. package/src/commands/ClientToServer/RecomputeCommand.d.ts +1 -2
  217. package/src/commands/ClientToServer/RefreshEventCommand.d.ts +1 -2
  218. package/src/commands/ClientToServer/RefreshScreenEventCommand.d.ts +1 -2
  219. package/src/commands/ClientToServer/RollbackEventCommand.d.ts +1 -2
  220. package/src/commands/ClientToServer/SubformOpenEventCommand.d.ts +1 -2
  221. package/src/commands/ClientToServer/SubformRefreshEventCommand.d.ts +1 -2
  222. package/src/commands/ClientToServer/TransactionCommand.d.ts +1 -2
  223. package/src/commands/ClientToServer/WriteMessageToServerLogCommand.d.ts +1 -2
  224. package/src/commands/DataViewCommandBase.d.ts +2 -2
  225. package/src/commands/IClientTargetedCommand.d.ts +1 -1
  226. package/src/commands/ServerToClient/ClientTargetedCommandBase.d.ts +1 -1
  227. package/src/data/FieldBase.d.ts +3 -3
  228. package/src/data/Record.d.ts +2 -9
  229. package/src/data/RecordsTable.d.ts +1 -2
  230. package/src/data/XMLBasedDcValuesBuilder.d.ts +1 -1
  231. package/src/env/EnvVariablesTable.d.ts +2 -15
  232. package/src/env/Environment.d.ts +0 -3
  233. package/src/env/MirrorString.d.ts +15 -0
  234. package/src/event/Event.d.ts +0 -3
  235. package/src/event/EventsManager.d.ts +7 -8
  236. package/src/event/IEventsManager.d.ts +5 -6
  237. package/src/exp/ExpressionEvaluator.d.ts +2 -2
  238. package/src/exp/ExpressionLocalJpn.d.ts +2 -2
  239. package/src/exp/GlobalParamsTable.d.ts +2 -1
  240. package/src/gui/MgControl.d.ts +0 -2
  241. package/src/gui/MgForm.d.ts +4 -4
  242. package/src/http/client/HttpClientAsync.d.ts +2 -2
  243. package/src/http/client/HttpClientBase.d.ts +3 -3
  244. package/src/http/client/HttpClientSync.d.ts +2 -2
  245. package/src/remote/RemoteCommandsProcessor.d.ts +1 -1
  246. package/src/rt/DataviewHeaderBase.d.ts +2 -2
  247. package/src/rt/DataviewHeaderFactory.d.ts +1 -1
  248. package/src/rt/Operation.d.ts +3 -1
  249. package/src/rt/RemoteDataviewHeader.d.ts +1 -2
  250. package/src/rt/Transaction.d.ts +1 -1
  251. package/src/tasks/RemoteTaskService.d.ts +2 -3
  252. package/src/tasks/Task.d.ts +1 -1
  253. package/src/tasks/TaskBase.d.ts +7 -7
  254. package/src/tasks/TaskServiceBase.d.ts +2 -4
  255. package/src/tasks/sort/SortCollection.d.ts +2 -3
  256. package/src/util/FlowMonitorQueue.d.ts +1 -1
  257. package/src/util/IMirrorXML.d.ts +1 -1
  258. package/src/util/ParamParseResult.d.ts +6 -0
  259. package/src/util/PrmMap.d.ts +0 -6
  260. package/src/util/Process.d.ts +1 -1
  261. package/bundles/magic-xpa-engine.umd.js +0 -38066
  262. package/bundles/magic-xpa-engine.umd.js.map +0 -1
  263. package/bundles/magic-xpa-engine.umd.min.js +0 -16
  264. package/bundles/magic-xpa-engine.umd.min.js.map +0 -1
  265. package/esm2015/index.js +0 -188
  266. package/esm2015/src/AccessHelper.js +0 -3
  267. package/esm2015/src/ClientManager.js +0 -412
  268. package/esm2015/src/CommandsProcessorBase.js +0 -54
  269. package/esm2015/src/CommandsProcessorManager.js +0 -31
  270. package/esm2015/src/CommandsTable.js +0 -166
  271. package/esm2015/src/GUIManager.js +0 -72
  272. package/esm2015/src/GuiEventsProcessor.js +0 -171
  273. package/esm2015/src/bridge/MagicBridge.js +0 -44
  274. package/esm2015/src/commands/ClientToServer/BrowserEscEventCommand.js +0 -24
  275. package/esm2015/src/commands/ClientToServer/ClientOriginatedCommand.js +0 -15
  276. package/esm2015/src/commands/ClientToServer/ClientOriginatedCommandSerializer.js +0 -60
  277. package/esm2015/src/commands/ClientToServer/ColumnSortEventCommand.js +0 -26
  278. package/esm2015/src/commands/ClientToServer/CommandFactory.js +0 -283
  279. package/esm2015/src/commands/ClientToServer/ComputeEventCommand.js +0 -23
  280. package/esm2015/src/commands/ClientToServer/ContextTerminationEventCommand.js +0 -21
  281. package/esm2015/src/commands/ClientToServer/ContextTimeoutResetCommand.js +0 -20
  282. package/esm2015/src/commands/ClientToServer/EvaluateCommand.js +0 -36
  283. package/esm2015/src/commands/ClientToServer/EventCommand.js +0 -40
  284. package/esm2015/src/commands/ClientToServer/ExecOperCommand.js +0 -67
  285. package/esm2015/src/commands/ClientToServer/FetchDataControlValuesEventCommand.js +0 -22
  286. package/esm2015/src/commands/ClientToServer/IndexChangeEventCommand.js +0 -21
  287. package/esm2015/src/commands/ClientToServer/IniputForceWriteCommand.js +0 -23
  288. package/esm2015/src/commands/ClientToServer/NonReversibleExitEventCommand.js +0 -23
  289. package/esm2015/src/commands/ClientToServer/QueryCommand.js +0 -21
  290. package/esm2015/src/commands/ClientToServer/RecomputeCommand.js +0 -27
  291. package/esm2015/src/commands/ClientToServer/RefreshEventCommand.js +0 -27
  292. package/esm2015/src/commands/ClientToServer/RefreshScreenEventCommand.js +0 -24
  293. package/esm2015/src/commands/ClientToServer/RollbackEventCommand.js +0 -39
  294. package/esm2015/src/commands/ClientToServer/SubformOpenEventCommand.js +0 -21
  295. package/esm2015/src/commands/ClientToServer/SubformRefreshEventCommand.js +0 -24
  296. package/esm2015/src/commands/ClientToServer/TransactionCommand.js +0 -28
  297. package/esm2015/src/commands/ClientToServer/WriteMessageToServerLogCommand.js +0 -18
  298. package/esm2015/src/commands/DataViewCommandBase.js +0 -6
  299. package/esm2015/src/commands/IClientTargetedCommand.js +0 -6
  300. package/esm2015/src/commands/ServerToClient/AbortCommand.js +0 -68
  301. package/esm2015/src/commands/ServerToClient/AddLocateCommand.js +0 -25
  302. package/esm2015/src/commands/ServerToClient/AddRangeCommand.js +0 -65
  303. package/esm2015/src/commands/ServerToClient/AddSortCommand.js +0 -36
  304. package/esm2015/src/commands/ServerToClient/ClientTargetedCommandBase.js +0 -24
  305. package/esm2015/src/commands/ServerToClient/EnhancedVerifyCommand.js +0 -48
  306. package/esm2015/src/commands/ServerToClient/OpenURLCommand.js +0 -225
  307. package/esm2015/src/commands/ServerToClient/ResetLocateCommand.js +0 -18
  308. package/esm2015/src/commands/ServerToClient/ResetRangeCommand.js +0 -18
  309. package/esm2015/src/commands/ServerToClient/ResetSortCommand.js +0 -18
  310. package/esm2015/src/commands/ServerToClient/ResultCommand.js +0 -40
  311. package/esm2015/src/commands/ServerToClient/VerifyCommand.js +0 -88
  312. package/esm2015/src/communications/InteractiveCommunicationsFailureHandler.js +0 -20
  313. package/esm2015/src/data/DataView.js +0 -1693
  314. package/esm2015/src/data/DataviewManager.js +0 -31
  315. package/esm2015/src/data/DataviewManagerBase.js +0 -18
  316. package/esm2015/src/data/Field.js +0 -672
  317. package/esm2015/src/data/FieldBase.js +0 -9
  318. package/esm2015/src/data/Record.js +0 -914
  319. package/esm2015/src/data/RecordsTable.js +0 -267
  320. package/esm2015/src/data/TaskTransactionManager.js +0 -110
  321. package/esm2015/src/data/XMLBasedDcValuesBuilder.js +0 -74
  322. package/esm2015/src/env/EnvVariablesTable.js +0 -408
  323. package/esm2015/src/env/Environment.js +0 -563
  324. package/esm2015/src/env/LanguageData.js +0 -230
  325. package/esm2015/src/event/Event.js +0 -1449
  326. package/esm2015/src/event/EventHandler.js +0 -787
  327. package/esm2015/src/event/EventHandlerPosition.js +0 -201
  328. package/esm2015/src/event/EventsManager.js +0 -3107
  329. package/esm2015/src/event/IEventsManager.js +0 -7
  330. package/esm2015/src/event/RunTimeEvent.js +0 -406
  331. package/esm2015/src/exp/Expression.js +0 -209
  332. package/esm2015/src/exp/ExpressionEvaluator.js +0 -4441
  333. package/esm2015/src/exp/ExpressionLocalJpn.js +0 -314
  334. package/esm2015/src/exp/GlobalParamsTable.js +0 -84
  335. package/esm2015/src/exp/YesNoExp.js +0 -44
  336. package/esm2015/src/gui/FormsTable.js +0 -73
  337. package/esm2015/src/gui/MgControl.js +0 -438
  338. package/esm2015/src/gui/MgForm.js +0 -1292
  339. package/esm2015/src/http/HttpManager.js +0 -100
  340. package/esm2015/src/http/client/HttpClientAsync.js +0 -72
  341. package/esm2015/src/http/client/HttpClientBase.js +0 -148
  342. package/esm2015/src/http/client/HttpClientSync.js +0 -47
  343. package/esm2015/src/remote/AddUserLocateRemoteDataViewCommand.js +0 -21
  344. package/esm2015/src/remote/AddUserRangeRemoteDataViewCommand.js +0 -21
  345. package/esm2015/src/remote/AddUserSortRemoteDataViewCommand.js +0 -21
  346. package/esm2015/src/remote/RemoteCommandsProcessor.js +0 -903
  347. package/esm2015/src/remote/RemoteControlItemsRefreshCommand.js +0 -28
  348. package/esm2015/src/remote/RemoteDataViewCommandBase.js +0 -27
  349. package/esm2015/src/remote/RemoteDataViewCommandUpdateNonModifiable.js +0 -19
  350. package/esm2015/src/remote/RemoteDataviewManager.js +0 -23
  351. package/esm2015/src/remote/RemoteInitDataViewCommand.js +0 -14
  352. package/esm2015/src/remote/ResetUserLocateRemoteDataviewCommand.js +0 -20
  353. package/esm2015/src/remote/ResetUserRangeRemoteDataviewCommand.js +0 -16
  354. package/esm2015/src/remote/ResetUserSortRemoteDataviewCommand.js +0 -19
  355. package/esm2015/src/remote/ServerError.js +0 -45
  356. package/esm2015/src/rt/Argument.js +0 -281
  357. package/esm2015/src/rt/ArgumentsList.js +0 -108
  358. package/esm2015/src/rt/Boundary.js +0 -161
  359. package/esm2015/src/rt/DataviewHeaderBase.js +0 -96
  360. package/esm2015/src/rt/DataviewHeaderFactory.js +0 -7
  361. package/esm2015/src/rt/DataviewHeadersSaxHandler.js +0 -40
  362. package/esm2015/src/rt/Operation.js +0 -769
  363. package/esm2015/src/rt/Recompute.js +0 -372
  364. package/esm2015/src/rt/RemoteDataviewHeader.js +0 -114
  365. package/esm2015/src/rt/TableCache.js +0 -182
  366. package/esm2015/src/rt/TableCacheManager.js +0 -70
  367. package/esm2015/src/rt/Transaction.js +0 -54
  368. package/esm2015/src/tasks/MGData.js +0 -561
  369. package/esm2015/src/tasks/MGDataCollection.js +0 -270
  370. package/esm2015/src/tasks/RemoteTaskService.js +0 -45
  371. package/esm2015/src/tasks/Task.js +0 -2593
  372. package/esm2015/src/tasks/TaskServiceBase.js +0 -30
  373. package/esm2015/src/tasks/TasksTable.js +0 -87
  374. package/esm2015/src/tasks/sort/SortCollection.js +0 -72
  375. package/esm2015/src/util/MgPriorityBlockingQueue.js +0 -79
  376. package/esm2015/src/util/PrmMap.js +0 -157
  377. package/esm2015/src/util/Process.js +0 -7
  378. package/esm2015/src/util/ReturnResult.js +0 -46
  379. package/fesm2015/magic-xpa-engine.js.map +0 -1
@@ -0,0 +1,773 @@
1
+ import { ApplicationException, Exception, NString, RefParam, StringBuilder, isNullOrUndefined } from "@magic-xpa/mscorelib";
2
+ import { BrkScope, Constants, InternalInterface, Logger, Logger_LogLevels, StorageAttributeCheck, XMLConstants, XmlParser } from "@magic-xpa/utils";
3
+ import { Event } from "./Event";
4
+ import { FieldBase } from "../data/FieldBase";
5
+ import { OperationTable } from "../rt/OperationTable";
6
+ import { FlowMonitorQueue } from "../util/FlowMonitorQueue";
7
+ import { ServerError } from "../remote/ServerError";
8
+ import { YesNoExp } from "../exp/YesNoExp";
9
+ import { ConstInterface } from "../ConstInterface";
10
+ import { FlowMonitorInterface } from "../FlowMonitorInterface";
11
+ import { LastFocusedManager } from "../rt/LastFocusedManager";
12
+ import { AccessHelper } from "../AccessHelper";
13
+ import { RemoteCommandsProcessor } from "../remote/RemoteCommandsProcessor";
14
+ export class EventHandler {
15
+ constructor() {
16
+ this._enabledExp = new YesNoExp(true);
17
+ this._operationTab = null;
18
+ this._propagateExp = new YesNoExp(true);
19
+ this._isHandlerOnForm = false;
20
+ this._ctrl = null;
21
+ this._ctrlName = null;
22
+ this._dvLen = 0;
23
+ this._dvPos = 0;
24
+ this._evt = null;
25
+ this._handledByClient = false;
26
+ this._handlerFld = null;
27
+ this._hasParameters = false;
28
+ this._id = 0;
29
+ this._level = '\0';
30
+ this._scope = null;
31
+ this._task = null;
32
+ this._taskMgdID = -1;
33
+ this._operationTab = new OperationTable();
34
+ }
35
+ getCtrlName() {
36
+ return this._ctrlName;
37
+ }
38
+ fillData(taskRef, parser) {
39
+ if (this._task === null) {
40
+ this._task = taskRef;
41
+ this._taskMgdID = this._task.getMgdID();
42
+ }
43
+ while (this.initInnerObjects(parser, parser.getNextTag())) {
44
+ }
45
+ let dataView = this._task.DataView;
46
+ this._hasParameters = dataView.ParametersExist(this._dvPos, this._dvLen);
47
+ }
48
+ initInnerObjects(parser, foundTagName) {
49
+ if (foundTagName === null)
50
+ return false;
51
+ if (foundTagName === ConstInterface.MG_TAG_HANDLER)
52
+ this.initInnerElements(parser, this._task);
53
+ else if (foundTagName === ConstInterface.MG_TAG_OPER)
54
+ this._operationTab.fillData(this._task, this, parser);
55
+ else if (foundTagName === ConstInterface.MG_TAG_EVENT && this._evt === null) {
56
+ this._evt = new Event();
57
+ this._evt.fillData(parser, this._task);
58
+ if (this._evt.getType() === ConstInterface.EVENT_TYPE_TIMER ||
59
+ (this._evt.getType() === ConstInterface.EVENT_TYPE_USER && this._evt.getUserEventType() === ConstInterface.EVENT_TYPE_TIMER))
60
+ this._task.getMGData().addTimerHandler(this);
61
+ if (((this._evt.getType() === ConstInterface.EVENT_TYPE_INTERNAL && this._evt.getInternalCode() === InternalInterface.MG_ACT_ZOOM) || (this._evt.getType() === ConstInterface.EVENT_TYPE_USER && this._evt.getUserEvent() !== null && this._evt.getUserEventType() === ConstInterface.EVENT_TYPE_INTERNAL && this._evt.getUserEvent().getInternalCode() === InternalInterface.MG_ACT_ZOOM)) && !this._task.getEnableZoomHandler()) {
62
+ if (this._handlerFld !== null)
63
+ this._handlerFld.setHasZoomHandler();
64
+ else if (this._ctrl !== null)
65
+ this._ctrl.HasZoomHandler = true;
66
+ else
67
+ this._task.setEnableZoomHandler();
68
+ }
69
+ }
70
+ else if (foundTagName === '/' + ConstInterface.MG_TAG_HANDLER) {
71
+ parser.setCurrIndex2EndOfTag();
72
+ return false;
73
+ }
74
+ else {
75
+ Logger.Instance.WriteExceptionToLogWithMsg("there is no such tag in EventHandler.initInnerObjects() " + foundTagName);
76
+ return false;
77
+ }
78
+ return true;
79
+ }
80
+ initInnerElements(parser, taskRef) {
81
+ let endContext = parser.getXMLdata().indexOf(XMLConstants.TAG_CLOSE, parser.getCurrIndex());
82
+ if (endContext !== -1 && endContext < parser.getXMLdata().length) {
83
+ let tag = parser.getXMLsubstring(endContext);
84
+ parser.add2CurrIndex(tag.indexOf(ConstInterface.MG_TAG_HANDLER) + ConstInterface.MG_TAG_HANDLER.length);
85
+ let tokensVector = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
86
+ this.initElements(tokensVector, taskRef);
87
+ parser.setCurrIndex(++endContext);
88
+ return;
89
+ }
90
+ Logger.Instance.WriteExceptionToLogWithMsg("in Handler.FillData() out of string bounds");
91
+ }
92
+ initElements(tokensVector, taskRef) {
93
+ for (let j = 0; j < tokensVector.length; j += 2) {
94
+ let attribute = (tokensVector.get_Item(j));
95
+ let valueStr = (tokensVector.get_Item(j + 1));
96
+ switch (attribute) {
97
+ case ConstInterface.MG_ATTR_HANDLEDBY:
98
+ this._handledByClient = (valueStr.toUpperCase() === "C".toUpperCase());
99
+ break;
100
+ case XMLConstants.MG_ATTR_ID:
101
+ this._id = XmlParser.getInt(valueStr);
102
+ break;
103
+ case ConstInterface.MG_ATTR_LEVEL:
104
+ this._level = valueStr[0];
105
+ break;
106
+ case ConstInterface.MG_ATTR_OBJECT:
107
+ let valueStringCtrlName = XmlParser.unescape(valueStr);
108
+ this._ctrlName = XmlParser.unescape(valueStringCtrlName).toUpperCase();
109
+ this.calculateCtrlFromControlName(taskRef);
110
+ break;
111
+ case ConstInterface.MG_ATTR_VARIABLE:
112
+ this._handlerFld = this._task.DataView.getField(XmlParser.getInt(valueStr));
113
+ this._handlerFld.setHasChangeEvent();
114
+ break;
115
+ case ConstInterface.MG_ATTR_SCOPE:
116
+ this._scope = valueStr[0];
117
+ break;
118
+ case ConstInterface.MG_ATTR_PROPAGATE:
119
+ this._propagateExp.setVal(taskRef, valueStr);
120
+ break;
121
+ case ConstInterface.MG_ATTR_ENABLED:
122
+ this._enabledExp.setVal(taskRef, valueStr);
123
+ break;
124
+ case ConstInterface.MG_ATTR_DVPOS:
125
+ let i = valueStr.indexOf(",");
126
+ if (i > -1) {
127
+ this._dvLen = XmlParser.getInt(valueStr.substr(0, i));
128
+ this._dvPos = XmlParser.getInt(valueStr.substr(i + 1));
129
+ for (let fldIdx = this._dvPos; fldIdx < this._dvPos + this._dvLen; fldIdx++) {
130
+ let field = this._task.DataView.getField(fldIdx);
131
+ field.IsEventHandlerField = true;
132
+ }
133
+ }
134
+ break;
135
+ case ConstInterface.MG_ATTR_HANDLER_ONFORM:
136
+ this._isHandlerOnForm = XmlParser.getBoolean(valueStr);
137
+ break;
138
+ default:
139
+ Logger.Instance.WriteExceptionToLogWithMsg("There is no such tag in EventHandler class. Insert case to EventHandler.initElements for " + attribute);
140
+ break;
141
+ }
142
+ }
143
+ }
144
+ calculateCtrlFromControlName(taskRef) {
145
+ if (!NString.IsNullOrEmpty(this._ctrlName)) {
146
+ this._ctrl = ((taskRef.getForm() !== null) ? taskRef.getForm().getCtrlByCtrlName(this._ctrlName) : null);
147
+ }
148
+ }
149
+ isSpecificHandlerOf(rtEvt) {
150
+ if (this._ctrl === null && this._ctrlName === null && this._handlerFld === null && !this._isHandlerOnForm)
151
+ return false;
152
+ if (this._scope === BrkScope.Task && this._task !== rtEvt.getTask())
153
+ return false;
154
+ if (this._evt.equals(rtEvt)) {
155
+ if (this._handlerFld !== null) {
156
+ return (this._handlerFld === rtEvt.getFld());
157
+ }
158
+ if (rtEvt.Control !== null && !this._isHandlerOnForm) {
159
+ let eventCtrlName = rtEvt.Control.getControlNameForHandlerSearch();
160
+ if (eventCtrlName !== null && this._ctrlName.toLowerCase() === eventCtrlName.toLowerCase())
161
+ return true;
162
+ }
163
+ else if (rtEvt.Control === null && this._isHandlerOnForm)
164
+ return true;
165
+ }
166
+ return false;
167
+ }
168
+ isNonSpecificHandlerOf(rtEvt) {
169
+ if (this._ctrl !== null || this._ctrlName !== null || this._handlerFld !== null || this._isHandlerOnForm)
170
+ return false;
171
+ if (this._scope === BrkScope.Task && this._task !== rtEvt.getTask() && rtEvt.getType() !== ConstInterface.EVENT_TYPE_TIMER)
172
+ return false;
173
+ if (this._scope === BrkScope.Global && this._task !== rtEvt.getTask())
174
+ return false;
175
+ if (this._evt.getType() === ConstInterface.EVENT_TYPE_USER && this._evt.getUserEventType() === ConstInterface.EVENT_TYPE_NOTINITED) {
176
+ try {
177
+ this._evt.findUserEvent();
178
+ }
179
+ catch (applicationException) {
180
+ if (applicationException instanceof ApplicationException) {
181
+ }
182
+ else
183
+ throw applicationException;
184
+ }
185
+ }
186
+ return this._evt.equals(rtEvt);
187
+ }
188
+ isGlobalHandlerOf(rtEvt) {
189
+ if (this._scope !== BrkScope.Global)
190
+ return false;
191
+ if (this._ctrl != null || this._ctrlName != null || this._handlerFld != null || this._isHandlerOnForm)
192
+ return false;
193
+ return this._evt.equals(rtEvt);
194
+ }
195
+ isGlobalSpecificHandlerOf(rtEvt) {
196
+ if (this._scope !== BrkScope.Global)
197
+ return false;
198
+ if (this._ctrl == null && this._ctrlName == null && this._handlerFld == null)
199
+ return false;
200
+ return (this._ctrlName != null && this._evt.equals(rtEvt) &&
201
+ NString.Equals(this._ctrlName, rtEvt.Control.Name, true));
202
+ }
203
+ async execute(rtEvt, returnedFromServer, enabledCndCheckedAndTrue) {
204
+ let ctrl = null;
205
+ let retVal;
206
+ let depth = 0;
207
+ let taskEnd = false;
208
+ let brkLevel = this._task.getBrkLevel();
209
+ let brkLevelIndex = this._task.getBrkLevelIndex();
210
+ let initialLoopStackSize = 0;
211
+ if (taskEnd !== null && this._evt.getType() !== ConstInterface.EVENT_TYPE_EXPRESSION && (this._evt.getType() !== ConstInterface.EVENT_TYPE_USER || (this._evt.getUserEvent().getType() !== ConstInterface.EVENT_TYPE_EXPRESSION && this._evt.getUserEvent().getType() !== ConstInterface.EVENT_TYPE_TIMER))) {
212
+ if (this._evt.getType() !== ConstInterface.EVENT_TYPE_USER_FUNC)
213
+ this._task.setBrkLevel(rtEvt.getBrkLevel(), this._id);
214
+ }
215
+ else
216
+ this._task.setBrkLevel(this._evt.getBrkLevel(), this._id);
217
+ let args = rtEvt.getArgList();
218
+ try {
219
+ let flowMonitor = FlowMonitorQueue.Instance;
220
+ if (rtEvt.getType() === ConstInterface.EVENT_TYPE_INTERNAL && rtEvt.getInternalCode() === InternalInterface.MG_ACT_WEBCLIENT_ROUTE) {
221
+ if (!this._task.IsRoute() && this._task !== AccessHelper.mgDataTable.StartupMgData.getFirstTask()) {
222
+ return new RetVals(true, true);
223
+ }
224
+ }
225
+ let nextOperIdx = -1;
226
+ if (returnedFromServer) {
227
+ nextOperIdx = AccessHelper.eventsManager.getNextOperIdx(this._operationTab.getOperation(0), false);
228
+ }
229
+ if (nextOperIdx === -1 && !enabledCndCheckedAndTrue && !await this.isEnabled())
230
+ return new RetVals(true, false);
231
+ if (this._scope === BrkScope.Task && (rtEvt.getType() === ConstInterface.EVENT_TYPE_TIMER || rtEvt.getType() === ConstInterface.EVENT_TYPE_EXPRESSION)) {
232
+ let currTask = LastFocusedManager.Instance.getLastFocusedTask();
233
+ if (this._task !== currTask)
234
+ return new RetVals(true, true);
235
+ }
236
+ if (!this._handledByClient) {
237
+ return new RetVals(false, true);
238
+ }
239
+ if (rtEvt.getType() !== ConstInterface.EVENT_TYPE_USER && !await this._evt.dataEventIsTrue())
240
+ return new RetVals(false, true);
241
+ if (rtEvt.getType() === ConstInterface.EVENT_TYPE_INTERNAL && rtEvt.getInternalCode() === InternalInterface.MG_ACT_TASK_SUFFIX)
242
+ taskEnd = true;
243
+ if (rtEvt.getType() === ConstInterface.EVENT_TYPE_INTERNAL) {
244
+ switch (rtEvt.getInternalCode()) {
245
+ case InternalInterface.MG_ACT_REC_PREFIX:
246
+ flowMonitor.addTaskFlowRec(InternalInterface.MG_ACT_REC_PREFIX, FlowMonitorInterface.FLWMTR_START, this._task.GetTaskDetails());
247
+ break;
248
+ case InternalInterface.MG_ACT_REC_SUFFIX:
249
+ flowMonitor.addTaskFlowRec(InternalInterface.MG_ACT_REC_SUFFIX, FlowMonitorInterface.FLWMTR_START, this._task.GetTaskDetails());
250
+ break;
251
+ case InternalInterface.MG_ACT_CTRL_SUFFIX:
252
+ flowMonitor.addTaskFlowCtrl(InternalInterface.MG_ACT_CTRL_SUFFIX, rtEvt.Control.Name, FlowMonitorInterface.FLWMTR_START, this._task.GetTaskDetails());
253
+ break;
254
+ case InternalInterface.MG_ACT_CTRL_PREFIX:
255
+ flowMonitor.addTaskFlowCtrl(InternalInterface.MG_ACT_CTRL_PREFIX, rtEvt.Control.Name, FlowMonitorInterface.FLWMTR_START, this._task.GetTaskDetails());
256
+ break;
257
+ case InternalInterface.MG_ACT_VARIABLE:
258
+ flowMonitor.addTaskFlowFld(InternalInterface.MG_ACT_VARIABLE, rtEvt.getFld().getName(), FlowMonitorInterface.FLWMTR_START, this._task.GetTaskDetails());
259
+ break;
260
+ case InternalInterface.MG_ACT_CTRL_VERIFICATION:
261
+ flowMonitor.addTaskFlowCtrl(InternalInterface.MG_ACT_CTRL_VERIFICATION, rtEvt.Control.Name, FlowMonitorInterface.FLWMTR_START, this._task.GetTaskDetails());
262
+ break;
263
+ case InternalInterface.MG_ACT_TASK_PREFIX:
264
+ flowMonitor.addTaskFlowRec(InternalInterface.MG_ACT_TASK_PREFIX, FlowMonitorInterface.FLWMTR_START, this._task.GetTaskDetails());
265
+ break;
266
+ case InternalInterface.MG_ACT_TASK_SUFFIX:
267
+ flowMonitor.addTaskFlowRec(InternalInterface.MG_ACT_TASK_SUFFIX, FlowMonitorInterface.FLWMTR_START, this._task.GetTaskDetails());
268
+ break;
269
+ default:
270
+ flowMonitor.addTaskFlowHandler(this._evt.getBrkLevel(true), FlowMonitorInterface.FLWMTR_START, this._task.GetTaskDetails());
271
+ break;
272
+ }
273
+ }
274
+ else
275
+ flowMonitor.addTaskFlowHandler(this._evt.getBrkLevel(true), FlowMonitorInterface.FLWMTR_START, this._task.GetTaskDetails());
276
+ try {
277
+ if (taskEnd !== null)
278
+ ctrl = rtEvt.Control;
279
+ let mgdID = AccessHelper.mgDataTable.currMgdID;
280
+ let isChangedCurrWnd = false;
281
+ let isChangedCurrWndRef = new RefParam(isChangedCurrWnd);
282
+ if (this._evt.getType() === ConstInterface.EVENT_TYPE_TIMER && mgdID !== rtEvt.getMgdID()) {
283
+ AccessHelper.mgDataTable.currMgdID = rtEvt.getMgdID();
284
+ isChangedCurrWndRef.value = true;
285
+ }
286
+ await this.resetLocalVariables(args);
287
+ initialLoopStackSize = this._task.getLoopStackSize();
288
+ let retVals = null;
289
+ if (this._operationTab.getSize() > 0)
290
+ retVals = await this.executeOperations(0, this._operationTab.getSize() - 1, taskEnd, mgdID, depth, isChangedCurrWndRef, false, false, -1);
291
+ isChangedCurrWnd = isChangedCurrWndRef.value;
292
+ if (retVals !== null)
293
+ return retVals;
294
+ if (!taskEnd)
295
+ await this._task.evalEndCond(ConstInterface.END_COND_EVAL_IMMIDIATE);
296
+ if (isChangedCurrWnd) {
297
+ let oldMgd = AccessHelper.mgDataTable.getMGData(mgdID);
298
+ if (oldMgd !== null && !oldMgd.IsAborting)
299
+ AccessHelper.mgDataTable.currMgdID = mgdID;
300
+ }
301
+ }
302
+ catch (ex) {
303
+ if (ex instanceof ServerError) {
304
+ if (Logger.Instance.LogLevel !== Logger_LogLevels.Basic)
305
+ Logger.Instance.WriteExceptionToLog(ex);
306
+ throw ex;
307
+ }
308
+ else if (ex instanceof Exception) {
309
+ Logger.Instance.WriteExceptionToLog(ex);
310
+ return new RetVals(false, true);
311
+ }
312
+ else
313
+ throw ex;
314
+ }
315
+ finally {
316
+ retVal = await this._propagateExp.getVal();
317
+ let currLoopStackSize = this._task.getLoopStackSize();
318
+ for (; currLoopStackSize > initialLoopStackSize; currLoopStackSize = currLoopStackSize--)
319
+ this._task.popLoopCounter();
320
+ }
321
+ if (args !== null)
322
+ await this.getArgValsFromFlds(args);
323
+ if (rtEvt.getType() === ConstInterface.EVENT_TYPE_INTERNAL) {
324
+ switch (rtEvt.getInternalCode()) {
325
+ case InternalInterface.MG_ACT_REC_PREFIX:
326
+ flowMonitor.addTaskFlowRec(InternalInterface.MG_ACT_REC_PREFIX, FlowMonitorInterface.FLWMTR_END, this._task.GetTaskDetails());
327
+ break;
328
+ case InternalInterface.MG_ACT_REC_SUFFIX:
329
+ flowMonitor.addTaskFlowRec(InternalInterface.MG_ACT_REC_SUFFIX, FlowMonitorInterface.FLWMTR_END, this._task.GetTaskDetails());
330
+ break;
331
+ case InternalInterface.MG_ACT_TASK_PREFIX:
332
+ flowMonitor.addTaskFlowRec(InternalInterface.MG_ACT_TASK_PREFIX, FlowMonitorInterface.FLWMTR_END, this._task.GetTaskDetails());
333
+ break;
334
+ case InternalInterface.MG_ACT_TASK_SUFFIX:
335
+ flowMonitor.addTaskFlowRec(InternalInterface.MG_ACT_TASK_SUFFIX, FlowMonitorInterface.FLWMTR_END, this._task.GetTaskDetails());
336
+ break;
337
+ case InternalInterface.MG_ACT_CTRL_SUFFIX:
338
+ flowMonitor.addTaskFlowCtrl(InternalInterface.MG_ACT_CTRL_SUFFIX, ctrl.Name, FlowMonitorInterface.FLWMTR_END, this._task.GetTaskDetails());
339
+ break;
340
+ case InternalInterface.MG_ACT_CTRL_PREFIX:
341
+ flowMonitor.addTaskFlowCtrl(InternalInterface.MG_ACT_CTRL_PREFIX, ctrl.Name, FlowMonitorInterface.FLWMTR_END, this._task.GetTaskDetails());
342
+ break;
343
+ case InternalInterface.MG_ACT_VARIABLE:
344
+ flowMonitor.addTaskFlowFld(InternalInterface.MG_ACT_VARIABLE, rtEvt.getFld().getName(), FlowMonitorInterface.FLWMTR_END, this._task.GetTaskDetails());
345
+ break;
346
+ case InternalInterface.MG_ACT_CTRL_VERIFICATION:
347
+ flowMonitor.addTaskFlowCtrl(InternalInterface.MG_ACT_CTRL_VERIFICATION, ctrl.Name, FlowMonitorInterface.FLWMTR_END, this._task.GetTaskDetails());
348
+ break;
349
+ default:
350
+ flowMonitor.addTaskFlowHandler(this._evt.getBrkLevel(true), FlowMonitorInterface.FLWMTR_END, this._task.GetTaskDetails());
351
+ break;
352
+ }
353
+ }
354
+ else
355
+ flowMonitor.addTaskFlowHandler(this._evt.getBrkLevel(true), 1, this._task.GetTaskDetails());
356
+ }
357
+ finally {
358
+ this._task.setBrkLevel(brkLevel, brkLevelIndex);
359
+ }
360
+ return new RetVals(retVal, true);
361
+ }
362
+ async executeOperations(fromIdx, toIdx, taskEnd, mgdID, depth, isChangedCurrWndRef, inBlockIf, inReturnedFromServer, inNextOperIdx) {
363
+ let oper;
364
+ let operType;
365
+ let nextOperIdx = -1;
366
+ let returnedFromServer = false;
367
+ let mgd = this._task.getMGData();
368
+ let execFlowIdx = fromIdx;
369
+ let retvals;
370
+ let blockIfReturnedFromServer = false;
371
+ let executeBlock;
372
+ let blockLoopExeconServer;
373
+ let flowMonitor = FlowMonitorQueue.Instance;
374
+ let routeOperationExecuted = false;
375
+ if (!inReturnedFromServer) {
376
+ oper = this._operationTab.getOperation(execFlowIdx);
377
+ nextOperIdx = AccessHelper.eventsManager.getNextOperIdx(oper, true);
378
+ if (nextOperIdx > -1) {
379
+ returnedFromServer = true;
380
+ if (inBlockIf)
381
+ blockIfReturnedFromServer = true;
382
+ }
383
+ else
384
+ returnedFromServer = false;
385
+ }
386
+ else {
387
+ returnedFromServer = inReturnedFromServer;
388
+ nextOperIdx = inNextOperIdx;
389
+ }
390
+ for (; execFlowIdx <= toIdx &&
391
+ (!AccessHelper.eventsManager.GetStopExecutionFlag()) &&
392
+ !mgd.IsAborting && !routeOperationExecuted; execFlowIdx += 1) {
393
+ if (inBlockIf && blockIfReturnedFromServer && this._operationTab.getOperation(toIdx).getServerId() < nextOperIdx)
394
+ break;
395
+ oper = this._operationTab.getOperation(execFlowIdx);
396
+ operType = oper.getType();
397
+ blockIfReturnedFromServer = false;
398
+ if (RemoteCommandsProcessor.GetInstance().DelayCommandExecution) {
399
+ this._task.setUseLoopStack(depth > 0);
400
+ await oper.operServer(null);
401
+ break;
402
+ }
403
+ if (returnedFromServer && oper.getServerId() < nextOperIdx)
404
+ if (operType !== ConstInterface.MG_OPER_BLOCK)
405
+ continue;
406
+ else if (this._operationTab.getOperation(oper.getBlockEnd()).getServerId() < nextOperIdx)
407
+ continue;
408
+ if (!taskEnd)
409
+ await this._task.evalEndCond(ConstInterface.END_COND_EVAL_IMMIDIATE);
410
+ if (this._taskMgdID !== mgdID)
411
+ isChangedCurrWndRef.value = true;
412
+ if (!this._task.isMainProg() && this._task.isOpenWin())
413
+ AccessHelper.mgDataTable.currMgdID = this._taskMgdID;
414
+ await AccessHelper.eventsManager.CheckAndShowSpinner(true);
415
+ switch (operType) {
416
+ case ConstInterface.MG_OPER_VERIFY:
417
+ if (await oper.execute(returnedFromServer)) {
418
+ if (!(this._task.getBrkLevel() === "TS")) {
419
+ AccessHelper.eventsManager.setStopExecution(true);
420
+ }
421
+ if (this._task.getInRecordSuffix() && this._task.getLevel() === Constants.TASK_LEVEL_TASK)
422
+ this._task.setLevel(Constants.TASK_LEVEL_RECORD);
423
+ return new RetVals(false, true);
424
+ }
425
+ break;
426
+ case ConstInterface.MG_OPER_LOOP:
427
+ this._task.enterLoop();
428
+ this._task.increaseLoopCounter();
429
+ this._task.setUseLoopStack(true);
430
+ await flowMonitor.addFlowFieldOperation(oper, true, this._task.GetTaskDetails());
431
+ blockLoopExeconServer = false;
432
+ if (!oper.getExecOnServer()) {
433
+ while (await oper.execute(false)) {
434
+ retvals = await this.executeOperations(execFlowIdx + 1, oper.getBlockClose() - 1, taskEnd, mgdID, depth + 1, isChangedCurrWndRef, false, false, -1);
435
+ if (retvals !== null)
436
+ return retvals;
437
+ if ((mgd.IsAborting || AccessHelper.eventsManager.GetStopExecutionFlag()))
438
+ break;
439
+ this._task.increaseLoopCounter();
440
+ this._task.setUseLoopStack(true);
441
+ }
442
+ }
443
+ else {
444
+ if (await oper.execute(false))
445
+ blockLoopExeconServer = true;
446
+ }
447
+ if (!blockLoopExeconServer)
448
+ execFlowIdx = oper.getBlockEnd() - 1;
449
+ this._task.leaveLoop();
450
+ break;
451
+ case ConstInterface.MG_OPER_BLOCK:
452
+ let startBlockIdx = execFlowIdx;
453
+ if (!oper.getExecOnServer() || (returnedFromServer && oper.getServerId() < nextOperIdx)) {
454
+ this._task.setUseLoopStack(true);
455
+ if (!returnedFromServer || oper.getServerId() >= nextOperIdx)
456
+ execFlowIdx = await this.getSignificantBlock(execFlowIdx, oper.getBlockEnd());
457
+ else
458
+ execFlowIdx = this.getStartBlockIfIdxByOper(execFlowIdx, nextOperIdx);
459
+ }
460
+ else {
461
+ this._task.setUseLoopStack(depth > 0);
462
+ await oper.operServer(null);
463
+ nextOperIdx = AccessHelper.eventsManager.getNextOperIdx(oper, true);
464
+ if (nextOperIdx > -1) {
465
+ returnedFromServer = true;
466
+ if (inBlockIf)
467
+ blockIfReturnedFromServer = true;
468
+ if (nextOperIdx < this._operationTab.getOperation(oper.getBlockEnd()).getServerId()) {
469
+ while (this._operationTab.getOperation(oper.getBlockClose()).getServerId() < nextOperIdx) {
470
+ execFlowIdx = oper.getBlockClose();
471
+ oper = this._operationTab.getOperation(execFlowIdx);
472
+ }
473
+ }
474
+ }
475
+ else {
476
+ returnedFromServer = false;
477
+ execFlowIdx = -1;
478
+ }
479
+ }
480
+ if (execFlowIdx !== -1) {
481
+ executeBlock = true;
482
+ oper = this._operationTab.getOperation(execFlowIdx);
483
+ if (returnedFromServer) {
484
+ if (this._operationTab.getOperation(oper.getBlockClose()).getServerId() <= nextOperIdx) {
485
+ executeBlock = false;
486
+ blockIfReturnedFromServer = true;
487
+ }
488
+ }
489
+ if (executeBlock) {
490
+ retvals = await this.executeOperations(execFlowIdx + 1, oper.getBlockClose() - 1, taskEnd, mgdID, depth + 1, isChangedCurrWndRef, true, returnedFromServer, nextOperIdx);
491
+ if (retvals !== null)
492
+ if (!retvals.ReturnedFromServer)
493
+ return retvals;
494
+ else {
495
+ returnedFromServer = retvals.ReturnedFromServer;
496
+ nextOperIdx = retvals.NextOperIdx;
497
+ blockIfReturnedFromServer = retvals.BlockIfReturnedFromServer;
498
+ execFlowIdx = oper.getBlockEnd() - 1;
499
+ continue;
500
+ }
501
+ }
502
+ }
503
+ execFlowIdx = oper.getBlockEnd() - 1;
504
+ break;
505
+ case ConstInterface.MG_OPER_ENDBLOCK:
506
+ await flowMonitor.addFlowFieldOperation(oper, true, this._task.GetTaskDetails());
507
+ break;
508
+ case ConstInterface.MG_OPER_CALL:
509
+ this._task.setUseLoopStack(depth > 0);
510
+ routeOperationExecuted = await oper.execute(returnedFromServer);
511
+ break;
512
+ default:
513
+ this._task.setUseLoopStack(depth > 0);
514
+ await oper.execute(returnedFromServer);
515
+ break;
516
+ }
517
+ if (!blockIfReturnedFromServer) {
518
+ nextOperIdx = AccessHelper.eventsManager.getNextOperIdx(oper, true);
519
+ if (nextOperIdx > -1) {
520
+ returnedFromServer = true;
521
+ if (inBlockIf)
522
+ blockIfReturnedFromServer = true;
523
+ }
524
+ else
525
+ returnedFromServer = false;
526
+ }
527
+ }
528
+ if (routeOperationExecuted)
529
+ retvals = new RetVals(false, true);
530
+ else if (blockIfReturnedFromServer)
531
+ retvals = new RetVals(nextOperIdx, returnedFromServer, blockIfReturnedFromServer);
532
+ else
533
+ retvals = null;
534
+ return retvals;
535
+ }
536
+ async getSignificantBlock(startBlockIdx, endIdx) {
537
+ let retIdx = -1;
538
+ while (startBlockIdx < endIdx) {
539
+ let oper = this._operationTab.getOperation(startBlockIdx);
540
+ let operType = oper.getType();
541
+ if (operType !== ConstInterface.MG_OPER_BLOCK && operType !== ConstInterface.MG_OPER_ELSE && operType !== ConstInterface.MG_OPER_SERVER)
542
+ break;
543
+ if (await oper.execute(false)) {
544
+ retIdx = startBlockIdx;
545
+ break;
546
+ }
547
+ else
548
+ startBlockIdx = oper.getBlockClose();
549
+ }
550
+ return retIdx;
551
+ }
552
+ getStartBlockIdxByEnd(endIdx) {
553
+ let retIdx = -1;
554
+ let found = false;
555
+ let j;
556
+ for (j = endIdx - 1; j >= 0 && !found; j--) {
557
+ let oper = this._operationTab.getOperation(j);
558
+ let operType = oper.getType();
559
+ if (operType === ConstInterface.MG_OPER_BLOCK || operType === ConstInterface.MG_OPER_LOOP) {
560
+ if (oper.getBlockEnd() === endIdx) {
561
+ retIdx = j;
562
+ found = true;
563
+ }
564
+ }
565
+ }
566
+ return retIdx;
567
+ }
568
+ getStartBlockIdxByElse(elseIdx) {
569
+ let retIdx = -1;
570
+ let found = false;
571
+ let elseBlockEnd = this._operationTab.getOperation(elseIdx).getBlockEnd();
572
+ let j;
573
+ for (j = elseIdx - 1; j >= 0 && !found; j--) {
574
+ let oper = this._operationTab.getOperation(j);
575
+ let operType = oper.getType();
576
+ if (operType === ConstInterface.MG_OPER_BLOCK) {
577
+ if (oper.getBlockEnd() === elseBlockEnd) {
578
+ retIdx = j;
579
+ found = true;
580
+ }
581
+ }
582
+ }
583
+ return retIdx;
584
+ }
585
+ getStartBlockIfIdxByOper(blockOperIdx, srvrOperIdx) {
586
+ let retIdx = -1;
587
+ let found = false;
588
+ let j = this._operationTab.serverId2operIdx(srvrOperIdx, blockOperIdx) - 1;
589
+ if (j === -2) {
590
+ j = this._operationTab.serverId2FollowingOperIdx(srvrOperIdx, blockOperIdx) - 1;
591
+ }
592
+ while (j >= 0 && !found) {
593
+ let oper = this._operationTab.getOperation(j);
594
+ let operType = oper.getType();
595
+ if (operType === ConstInterface.MG_OPER_BLOCK) {
596
+ if (j === blockOperIdx) {
597
+ retIdx = j;
598
+ found = true;
599
+ }
600
+ else
601
+ j--;
602
+ }
603
+ else if (operType === ConstInterface.MG_OPER_ELSE) {
604
+ let blockStrt = this.getStartBlockIdxByElse(j);
605
+ if (blockStrt === blockOperIdx) {
606
+ retIdx = j;
607
+ found = true;
608
+ }
609
+ else
610
+ j = blockStrt - 1;
611
+ }
612
+ else if (operType === ConstInterface.MG_OPER_ENDBLOCK)
613
+ j = this.getStartBlockIdxByEnd(j) - 1;
614
+ else
615
+ j--;
616
+ }
617
+ return retIdx;
618
+ }
619
+ getLevel() {
620
+ return this._level;
621
+ }
622
+ getEvent() {
623
+ return this._evt;
624
+ }
625
+ getId() {
626
+ return this._id;
627
+ }
628
+ getStaticCtrl() {
629
+ return this._ctrl;
630
+ }
631
+ getRunTimeCtrl() {
632
+ return AccessHelper.eventsManager.getLastRtEvent().Control;
633
+ }
634
+ async isEnabled() {
635
+ return await this._enabledExp.getVal();
636
+ }
637
+ async resetLocalVariables(args) {
638
+ let dv = this._task.DataView;
639
+ let argIdx = 0;
640
+ try {
641
+ for (let fieldIdx = this._dvPos; fieldIdx < this._dvPos + this._dvLen; fieldIdx++) {
642
+ let aField = dv.getField(fieldIdx);
643
+ let varIsParm = !this._hasParameters || aField.isParam();
644
+ if ((args !== null && argIdx < args.getSize()) && varIsParm) {
645
+ if (!args.getArg(argIdx).skipArg()) {
646
+ await args.getArg(argIdx).setValueToField(aField);
647
+ }
648
+ else {
649
+ aField.invalidate(true, FieldBase.CLEAR_FLAGS);
650
+ await aField.compute(false);
651
+ }
652
+ argIdx++;
653
+ }
654
+ else {
655
+ aField.invalidate(true, FieldBase.CLEAR_FLAGS);
656
+ await aField.compute(false);
657
+ }
658
+ await aField.updateDisplay();
659
+ }
660
+ }
661
+ catch (exception) {
662
+ throw exception;
663
+ }
664
+ }
665
+ async getArgValsFromFlds(args) {
666
+ let dv = this._task.DataView;
667
+ let k = 0;
668
+ let j;
669
+ for (j = this._dvPos; j < this._dvPos + this._dvLen && k < args.getSize(); j++) {
670
+ let aField = dv.getField(j);
671
+ if (!this._hasParameters || aField.isParam()) {
672
+ let arg = args.getArg(k);
673
+ if (arg.getType() === ConstInterface.ARG_TYPE_FIELD) {
674
+ let argFld = arg.getField();
675
+ if (argFld.getTask() !== null && !argFld.getTask().isAborting()) {
676
+ let val = aField.getValue(false);
677
+ await argFld.setValueAndStartRecompute(val, aField.isNull(), true, aField.isModified(), false);
678
+ await argFld.updateDisplay();
679
+ }
680
+ }
681
+ k++;
682
+ }
683
+ }
684
+ }
685
+ getTask() {
686
+ return this._task;
687
+ }
688
+ argsMatch(Exp_params) {
689
+ let argsMatched = true;
690
+ let dv = this._task.DataView;
691
+ let j = 0;
692
+ let paramCount = 0;
693
+ for (let i = this._dvPos; i < this._dvPos + this._dvLen; i++) {
694
+ let field = dv.getField(i);
695
+ if (field.isParam()) {
696
+ paramCount++;
697
+ if (j < Exp_params.length) {
698
+ let fieldAttr = field.getType();
699
+ let argAttr = Exp_params[j].Attr;
700
+ if (!Exp_params[j].IsNull && !StorageAttributeCheck.isTheSameType(fieldAttr, argAttr) && !StorageAttributeCheck.StorageFldAlphaUnicodeOrBlob(fieldAttr, argAttr)) {
701
+ argsMatched = false;
702
+ break;
703
+ }
704
+ j++;
705
+ }
706
+ }
707
+ }
708
+ if (paramCount !== Exp_params.length) {
709
+ argsMatched = false;
710
+ }
711
+ return argsMatched;
712
+ }
713
+ getOperationTab() {
714
+ return this._operationTab;
715
+ }
716
+ getControlNameForControlHeader() {
717
+ if (this.getEvent().getType() == ConstInterface.EVENT_TYPE_INTERNAL) {
718
+ if (this.getEvent().isControlHeader() && !isNullOrUndefined(this._ctrl))
719
+ return this.getCtrlName();
720
+ }
721
+ return NString.Empty;
722
+ }
723
+ getVarNameForVariableHeader() {
724
+ if (this.getEvent().isVariableHeader() && !isNullOrUndefined(this._handlerFld))
725
+ return this._handlerFld.getVarName().toUpperCase();
726
+ return NString.Empty;
727
+ }
728
+ getEventHandlerInfo() {
729
+ let eventDescription = new StringBuilder();
730
+ this.getEvent().AppendDescription(eventDescription);
731
+ let headerAdditionalInfo = this.getControlNameForControlHeader() + this.getVarNameForVariableHeader();
732
+ eventDescription.Append(headerAdditionalInfo);
733
+ if (!NString.IsNullOrEmpty(eventDescription.toString()))
734
+ eventDescription = new StringBuilder(' ' + eventDescription.toString(), eventDescription.toString().length + 1);
735
+ return NString.Format("Handler {0}{1}", this.getEvent().getEventType(), eventDescription);
736
+ }
737
+ checkTaskScope(isSameTask) {
738
+ if (this._scope === BrkScope.Task && !isSameTask)
739
+ return false;
740
+ return true;
741
+ }
742
+ toString() {
743
+ return NString.Format("(Handler for {0} on task {1}, scope {2})", this._evt, this._task, this._scope);
744
+ }
745
+ }
746
+ export class RetVals {
747
+ constructor(pOrOperIdx, eOrInReturnedFromServer, inBlockIfReturnedFromServer) {
748
+ this.BlockIfReturnedFromServer = false;
749
+ this.Enabled = false;
750
+ this.NextOperIdx = 0;
751
+ this.Propagate = false;
752
+ this.ReturnedFromServer = false;
753
+ if (arguments.length === 2)
754
+ this.constructor_0(pOrOperIdx, eOrInReturnedFromServer);
755
+ else
756
+ this.constructor_1(pOrOperIdx, eOrInReturnedFromServer, inBlockIfReturnedFromServer);
757
+ }
758
+ constructor_0(p, e) {
759
+ this.Propagate = p;
760
+ this.Enabled = e;
761
+ this.NextOperIdx = 0;
762
+ this.ReturnedFromServer = false;
763
+ this.BlockIfReturnedFromServer = false;
764
+ }
765
+ constructor_1(operIdx, inReturnedFromServer, inBlockIfReturnedFromServer) {
766
+ this.Propagate = false;
767
+ this.Enabled = true;
768
+ this.NextOperIdx = operIdx;
769
+ this.ReturnedFromServer = inReturnedFromServer;
770
+ this.BlockIfReturnedFromServer = inBlockIfReturnedFromServer;
771
+ }
772
+ }
773
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXZlbnRIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZW5naW5lL3NyYy9ldmVudC9FdmVudEhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLG9CQUFvQixFQUFFLFNBQVMsRUFBUSxPQUFPLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2hJLE9BQU8sRUFDTCxRQUFRLEVBQ1IsU0FBUyxFQUNULGlCQUFpQixFQUNqQixNQUFNLEVBQ04sZ0JBQWdCLEVBRWhCLHFCQUFxQixFQUNyQixZQUFZLEVBQ1osU0FBUyxFQUNWLE1BQU0sa0JBQWtCLENBQUM7QUFFMUIsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDNUMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBS3BELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBRTFELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUdsRCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFHekMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUUxRSxNQUFNLE9BQU8sWUFBWTtJQXNCdkI7UUFyQlEsZ0JBQVcsR0FBYSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQyxrQkFBYSxHQUFtQixJQUFJLENBQUM7UUFDckMsa0JBQWEsR0FBYSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QyxxQkFBZ0IsR0FBWSxLQUFLLENBQUM7UUFDbEMsVUFBSyxHQUFjLElBQUksQ0FBQztRQUN4QixjQUFTLEdBQVcsSUFBSSxDQUFDO1FBQ3pCLFdBQU0sR0FBVyxDQUFDLENBQUM7UUFDbkIsV0FBTSxHQUFXLENBQUMsQ0FBQztRQUNuQixTQUFJLEdBQVUsSUFBSSxDQUFDO1FBQ25CLHFCQUFnQixHQUFZLEtBQUssQ0FBQztRQUNsQyxnQkFBVyxHQUFjLElBQUksQ0FBQztRQUM5QixtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUNoQyxRQUFHLEdBQVcsQ0FBQyxDQUFDO1FBQ2hCLFdBQU0sR0FBVyxJQUFJLENBQUM7UUFDdEIsV0FBTSxHQUFhLElBQUksQ0FBQztRQUN4QixVQUFLLEdBQVMsSUFBSSxDQUFDO1FBQ25CLGVBQVUsR0FBVyxDQUFDLENBQUMsQ0FBQztRQU05QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUVELFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUtELFFBQVEsQ0FBQyxPQUFhLEVBQUUsTUFBaUI7UUFDdkMsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksRUFBRTtZQUN2QixJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQztZQUNyQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDekM7UUFFRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUU7U0FDMUQ7UUFDRCxJQUFJLFFBQVEsR0FBdUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDdkQsSUFBSSxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFLTyxnQkFBZ0IsQ0FBQyxNQUFpQixFQUFFLFlBQW9CO1FBRTlELElBQUksWUFBWSxLQUFLLElBQUk7WUFDdkIsT0FBTyxLQUFLLENBQUM7UUFFZixJQUFJLFlBQVksS0FBSyxjQUFjLENBQUMsY0FBYztZQUNoRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUV4QyxJQUFJLFlBQVksS0FBSyxjQUFjLENBQUMsV0FBVztZQUNsRCxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQzthQUVuRCxJQUFJLFlBQVksS0FBSyxjQUFjLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFO1lBQzNFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxjQUFjLENBQUMsZ0JBQWdCO2dCQUN6RCxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssY0FBYyxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEtBQUssY0FBYyxDQUFDLGdCQUFnQixDQUFDO2dCQUM1SCxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUsvQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLGNBQWMsQ0FBQyxtQkFBbUIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxLQUFLLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxjQUFjLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxjQUFjLENBQUMsbUJBQW1CLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxlQUFlLEVBQUUsS0FBSyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxFQUFFO2dCQUVqYSxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssSUFBSTtvQkFDM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO3FCQUVsQyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSTtvQkFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDOztvQkFHakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2FBQ3JDO1NBQ0Y7YUFDSSxJQUFJLFlBQVksS0FBSyxHQUFHLEdBQUcsY0FBYyxDQUFDLGNBQWMsRUFBRTtZQUM3RCxNQUFNLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUMvQixPQUFPLEtBQUssQ0FBQztTQUVkO2FBQ0k7WUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLDBCQUEwQixDQUFDLDBEQUEwRCxHQUFHLFlBQVksQ0FBQyxDQUFDO1lBQ3RILE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFNTyxpQkFBaUIsQ0FBQyxNQUFpQixFQUFFLE9BQWE7UUFDeEQsSUFBSSxVQUFVLEdBQVcsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sQ0FBRSxZQUFZLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQ3JHLElBQUksVUFBVSxLQUFLLENBQUMsQ0FBQyxJQUFJLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsTUFBTSxFQUFFO1lBRWhFLElBQUksR0FBRyxHQUFXLE1BQU0sQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDckQsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFFLGNBQWMsQ0FBQyxjQUFjLENBQUMsR0FBRyxjQUFjLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRXpHLElBQUksWUFBWSxHQUFpQixTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLEVBQUUsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3RILElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNsQyxPQUFPO1NBQ1I7UUFDRCxNQUFNLENBQUMsUUFBUSxDQUFDLDBCQUEwQixDQUFDLDRDQUE0QyxDQUFDLENBQUM7SUFDM0YsQ0FBQztJQU9PLFlBQVksQ0FBQyxZQUEwQixFQUFFLE9BQWE7UUFDNUQsS0FBSyxJQUFJLENBQUMsR0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN2RCxJQUFJLFNBQVMsR0FBVyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuRCxJQUFJLFFBQVEsR0FBVyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFdEQsUUFBUSxTQUFTLEVBQUU7Z0JBQ2pCLEtBQUssY0FBYyxDQUFDLGlCQUFpQjtvQkFDbkMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO29CQUN2RSxNQUFNO2dCQUVSLEtBQUssWUFBWSxDQUFDLFVBQVU7b0JBQzFCLElBQUksQ0FBQyxHQUFHLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDdEMsTUFBTTtnQkFFUixLQUFLLGNBQWMsQ0FBQyxhQUFhO29CQUMvQixJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDMUIsTUFBTTtnQkFFUixLQUFLLGNBQWMsQ0FBQyxjQUFjO29CQUNoQyxJQUFJLG1CQUFtQixHQUFXLFNBQVMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQy9ELElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUN2RSxJQUFJLENBQUMsNEJBQTRCLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQzNDLE1BQU07Z0JBRVIsS0FBSyxjQUFjLENBQUMsZ0JBQWdCO29CQUNsQyxJQUFJLENBQUMsV0FBVyxHQUFjLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7b0JBQ3ZGLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztvQkFDckMsTUFBTTtnQkFFUixLQUFLLGNBQWMsQ0FBQyxhQUFhO29CQUMvQixJQUFJLENBQUMsTUFBTSxHQUFhLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDcEMsTUFBTTtnQkFFUixLQUFLLGNBQWMsQ0FBQyxpQkFBaUI7b0JBQ25DLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztvQkFDN0MsTUFBTTtnQkFFUixLQUFLLGNBQWMsQ0FBQyxlQUFlO29CQUNqQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7b0JBQzNDLE1BQU07Z0JBRVIsS0FBSyxjQUFjLENBQUMsYUFBYTtvQkFDL0IsSUFBSSxDQUFDLEdBQVcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDdEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7d0JBQ1YsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ3RELElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUN2RCxLQUFLLElBQUksTUFBTSxHQUFXLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRTs0QkFDbkYsSUFBSSxLQUFLLEdBQTBCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUUsQ0FBQzs0QkFDekUsS0FBSyxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQzt5QkFDbEM7cUJBQ0Y7b0JBQ0QsTUFBTTtnQkFFUixLQUFLLGNBQWMsQ0FBQyxzQkFBc0I7b0JBQ3hDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUN2RCxNQUFNO2dCQUVSO29CQUNFLE1BQU0sQ0FBQyxRQUFRLENBQUMsMEJBQTBCLENBQUMsMkZBQTJGLEdBQUcsU0FBUyxDQUFDLENBQUM7b0JBQ3BKLE1BQU07YUFDVDtTQUNGO0lBQ0gsQ0FBQztJQVFELDRCQUE0QixDQUFDLE9BQWE7UUFDeEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQzFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQVUsT0FBTyxDQUFDLE9BQU8sRUFBRyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDcEg7SUFDSCxDQUFDO0lBT0QsbUJBQW1CLENBQUMsS0FBbUI7UUFFckMsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0I7WUFDdkcsT0FBTyxLQUFLLENBQUM7UUFHZixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssUUFBUSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxPQUFPLEVBQUU7WUFDakUsT0FBTyxLQUFLLENBQUM7UUFLZixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBRTNCLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJLEVBQUU7Z0JBQzdCLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxLQUFLLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO2FBQzlDO1lBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDcEQsSUFBSSxhQUFhLEdBQVcsS0FBSyxDQUFDLE9BQU8sQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO2dCQUMzRSxJQUFJLGFBQWEsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxhQUFhLENBQUMsV0FBVyxFQUFFO29CQUN4RixPQUFPLElBQUksQ0FBQzthQUNmO2lCQUNJLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLGdCQUFnQjtnQkFDdEQsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQVNELHNCQUFzQixDQUFDLEtBQW1CO1FBR3hDLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLGdCQUFnQjtZQUN0RyxPQUFPLEtBQUssQ0FBQztRQUVmLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsSUFBSSxJQUFLLElBQUksQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxjQUFjLENBQUMsZ0JBQWdCO1lBQzdILE9BQU8sS0FBSyxDQUFDO1FBRVgsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsT0FBTyxFQUFFO1lBQ25FLE9BQU8sS0FBSyxDQUFDO1FBR2YsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLGNBQWMsQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLGNBQWMsQ0FBQyxvQkFBb0IsRUFBRTtZQUNsSSxJQUFJO2dCQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7YUFDM0I7WUFDRCxPQUFPLG9CQUFvQixFQUFFO2dCQUMzQixJQUFJLG9CQUFvQixZQUFZLG9CQUFvQixFQUFFO2lCQUN6RDs7b0JBRUMsTUFBTSxvQkFBb0IsQ0FBQzthQUM5QjtTQUNGO1FBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBU0QsaUJBQWlCLENBQUMsS0FBbUI7UUFFbkMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxNQUFNO1lBQ2pDLE9BQU8sS0FBSyxDQUFDO1FBR2YsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsZ0JBQWdCO1lBQ25HLE9BQU8sS0FBSyxDQUFDO1FBR2YsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBU0QseUJBQXlCLENBQUMsS0FBbUI7UUFFM0MsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxNQUFNO1lBQ2pDLE9BQU8sS0FBSyxDQUFDO1FBRWYsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUk7WUFDMUUsT0FBTyxLQUFLLENBQUM7UUFHZixPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQ3ZELE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFpQkYsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFtQixFQUFFLGtCQUEyQixFQUFFLHdCQUFpQztRQUU5RixJQUFJLElBQUksR0FBYyxJQUFJLENBQUM7UUFDM0IsSUFBSSxNQUFlLENBQUM7UUFDcEIsSUFBSSxLQUFLLEdBQVcsQ0FBQyxDQUFDO1FBQ3RCLElBQUksT0FBTyxHQUFZLEtBQUssQ0FBQztRQUM3QixJQUFJLFFBQVEsR0FBVyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2hELElBQUksYUFBYSxHQUFXLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUMxRCxJQUFJLG9CQUFvQixHQUFXLENBQUMsQ0FBQztRQUdyQyxJQUFJLE9BQU8sS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxjQUFjLENBQUMscUJBQXFCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLGNBQWMsQ0FBQyxlQUFlLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLGNBQWMsQ0FBQyxxQkFBcUIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUU7WUFFM1MsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLGNBQWMsQ0FBQyxvQkFBb0I7Z0JBQzdELElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FFekQ7O1lBRUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFNUQsSUFBSSxJQUFJLEdBQWtCLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUU3QyxJQUFJO1lBQ0YsSUFBSSxXQUFXLEdBQXFCLGdCQUFnQixDQUFDLFFBQVEsQ0FBQztZQUc5RCxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxjQUFjLENBQUMsbUJBQW1CLElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRSxLQUFLLGlCQUFpQixDQUFDLHNCQUFzQixFQUFFO2dCQUNsSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFlBQVksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxFQUFFO29CQUNqRyxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztpQkFDaEM7YUFDRjtZQUlELElBQUksV0FBVyxHQUFXLENBQUMsQ0FBQyxDQUFDO1lBQzdCLElBQUksa0JBQWtCLEVBQUU7Z0JBTXRCLFdBQVcsR0FBRyxZQUFZLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQzthQUNwRztZQUNELElBQUksV0FBVyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQzVFLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBR2xDLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLGNBQWMsQ0FBQyxnQkFBZ0IsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssY0FBYyxDQUFDLHFCQUFxQixDQUFDLEVBQUU7Z0JBQ3RKLElBQUksUUFBUSxHQUFTLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dCQUN0RSxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUTtvQkFDekIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDbEM7WUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFO2dCQUcxQixPQUFPLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQzthQUNqQztZQUVELElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLGNBQWMsQ0FBQyxlQUFlLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFO2dCQUMxRixPQUFPLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztZQUVsQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxjQUFjLENBQUMsbUJBQW1CLElBQUksS0FBSyxDQUFDLGVBQWUsRUFBRSxLQUFLLGlCQUFpQixDQUFDLGtCQUFrQjtnQkFDNUgsT0FBTyxHQUFHLElBQUksQ0FBQztZQUVqQixJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxjQUFjLENBQUMsbUJBQW1CLEVBQUU7Z0JBQzFELFFBQVEsS0FBSyxDQUFDLGVBQWUsRUFBRSxFQUFFO29CQUMvQixLQUFLLGlCQUFpQixDQUFDLGlCQUFpQjt3QkFDdEMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsRUFBRSxvQkFBb0IsQ0FBQyxZQUFZLEVBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO3dCQUNqSSxNQUFNO29CQUNSLEtBQUssaUJBQWlCLENBQUMsaUJBQWlCO3dCQUN0QyxXQUFXLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixFQUFFLG9CQUFvQixDQUFDLFlBQVksRUFBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7d0JBQ2pJLE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxrQkFBa0I7d0JBQ3ZDLFdBQVcsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQ3hELG9CQUFvQixDQUFDLFlBQVksRUFBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7d0JBQzdGLE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxrQkFBa0I7d0JBQ3ZDLFdBQVcsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQ3hELG9CQUFvQixDQUFDLFlBQVksRUFBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7d0JBQzdGLE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxlQUFlO3dCQUNwQyxXQUFXLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQzNELG9CQUFvQixDQUFDLFlBQVksRUFBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7d0JBQzVGLE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyx3QkFBd0I7d0JBQzdDLFdBQVcsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsd0JBQXdCLEVBQ3BFLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLG9CQUFvQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7d0JBQ3RGLE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxrQkFBa0I7d0JBQ3ZDLFdBQVcsQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLEVBQUUsb0JBQW9CLENBQUMsWUFBWSxFQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQzt3QkFDbEksTUFBTTtvQkFFUixLQUFLLGlCQUFpQixDQUFDLGtCQUFrQjt3QkFDdkMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsRUFBRSxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO3dCQUNqSSxNQUFNO29CQUVSO3dCQUNFLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO3dCQUM1SCxNQUFNO2lCQUNUO2FBQ0Y7O2dCQUVDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1lBRTlILElBQUk7Z0JBRUYsSUFBSSxPQUFPLEtBQUssSUFBSTtvQkFDbEIsSUFBSSxHQUFjLEtBQUssQ0FBQyxPQUFPLENBQUM7Z0JBRWxDLElBQUksS0FBSyxHQUFXLFlBQVksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDO2dCQUN2RCxJQUFJLGdCQUFnQixHQUFZLEtBQUssQ0FBQztnQkFDdEMsSUFBSSxtQkFBbUIsR0FBc0IsSUFBSSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFNNUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLGNBQWMsQ0FBQyxnQkFBZ0IsSUFBSSxLQUFLLEtBQUssS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFO29CQUV6RixZQUFZLENBQUMsV0FBVyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ3RELG1CQUFtQixDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7aUJBQ2xDO2dCQUdELE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUVyQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3JELElBQUksT0FBTyxHQUFZLElBQUksQ0FBQztnQkFDNUIsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUM7b0JBQ2xDLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUU1SSxnQkFBZ0IsR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUM7Z0JBRTdDLElBQUksT0FBTyxLQUFLLElBQUk7b0JBQ2xCLE9BQU8sT0FBTyxDQUFDO2dCQUdqQixJQUFJLENBQUMsT0FBTztvQkFDVixNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO2dCQUd2RSxJQUFJLGdCQUFnQixFQUFFO29CQUNwQixJQUFJLE1BQU0sR0FBVyxZQUFZLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDL0QsSUFBSSxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVU7d0JBQ3ZDLFlBQVksQ0FBQyxXQUFXLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztpQkFDOUM7YUFDRjtZQUVELE9BQU8sRUFBRSxFQUFFO2dCQUNULElBQUksRUFBRSxZQUFZLFdBQVcsRUFBRTtvQkFDN0IsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsS0FBSyxnQkFBZ0IsQ0FBQyxLQUFLO3dCQUNyRCxNQUFNLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUMxQyxNQUFNLEVBQUUsQ0FBQztpQkFDVjtxQkFDSSxJQUFJLEVBQUUsWUFBWSxTQUFTLEVBQUU7b0JBQ2hDLE1BQU0sQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ3hDLE9BQU8sSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUNqQzs7b0JBRUMsTUFBTSxFQUFFLENBQUM7YUFDWjtvQkFFTztnQkFFTixNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUkzQyxJQUFJLGlCQUFpQixHQUFXLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDOUQsT0FBTyxpQkFBaUIsR0FBRyxvQkFBb0IsRUFBRSxpQkFBaUIsR0FBRyxpQkFBaUIsRUFBRTtvQkFDdEYsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQzthQUMvQjtZQUdELElBQUksSUFBSSxLQUFLLElBQUk7Z0JBQ2YsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFdEMsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssY0FBYyxDQUFDLG1CQUFtQixFQUFFO2dCQUMxRCxRQUFRLEtBQUssQ0FBQyxlQUFlLEVBQUUsRUFBRTtvQkFDL0IsS0FBSyxpQkFBaUIsQ0FBQyxpQkFBaUI7d0JBQ3RDLFdBQVcsQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLEVBQUUsb0JBQW9CLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQzt3QkFDOUgsTUFBTTtvQkFFUixLQUFLLGlCQUFpQixDQUFDLGlCQUFpQjt3QkFDdEMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsRUFBRSxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO3dCQUM5SCxNQUFNO29CQUVSLEtBQUssaUJBQWlCLENBQUMsa0JBQWtCO3dCQUN2QyxXQUFXLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixFQUFFLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7d0JBQy9ILE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxrQkFBa0I7d0JBQ3ZDLFdBQVcsQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLEVBQUUsb0JBQW9CLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQzt3QkFDL0gsTUFBTTtvQkFFUixLQUFLLGlCQUFpQixDQUFDLGtCQUFrQjt3QkFDdkMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7d0JBQzNJLE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyxrQkFBa0I7d0JBQ3ZDLFdBQVcsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO3dCQUMzSSxNQUFNO29CQUVSLEtBQUssaUJBQWlCLENBQUMsZUFBZTt3QkFDcEMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7d0JBQ3RKLE1BQU07b0JBRVIsS0FBSyxpQkFBaUIsQ0FBQyx3QkFBd0I7d0JBQzdDLFdBQVcsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsd0JBQXdCLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO3dCQUNqSixNQUFNO29CQUVSO3dCQUNFLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO3dCQUMxSCxNQUFNO2lCQUNUO2FBQ0Y7O2dCQUVDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1NBQy9GO2dCQUNPO1lBRU4sSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1NBQ2pEO1FBQ0QsT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUtPLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxPQUFlLEVBQUUsS0FBYSxFQUFFLE9BQWdCLEVBQUUsS0FBYSxFQUFFLEtBQWEsRUFDcEYsbUJBQXNDLEVBQUUsU0FBa0IsRUFBRSxvQkFBNkIsRUFDekYsYUFBcUI7UUFDN0MsSUFBSSxJQUFlLENBQUM7UUFDcEIsSUFBSSxRQUFnQixDQUFDO1FBQ3JCLElBQUksV0FBVyxHQUFXLENBQUMsQ0FBQyxDQUFDO1FBQzdCLElBQUksa0JBQWtCLEdBQVksS0FBSyxDQUFDO1FBQ3hDLElBQUksR0FBRyxHQUFXLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDekMsSUFBSSxXQUFXLEdBQVcsT0FBTyxDQUFDO1FBQ2xDLElBQUksT0FBZ0IsQ0FBQztRQUNyQixJQUFJLHlCQUF5QixHQUFZLEtBQUssQ0FBQztRQUMvQyxJQUFJLFlBQXFCLENBQUM7UUFDMUIsSUFBSSxxQkFBOEIsQ0FBQztRQUNuQyxJQUFJLFdBQVcsR0FBcUIsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO1FBQzlELElBQUksc0JBQXNCLEdBQVksS0FBSyxDQUFDO1FBRTVDLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUV6QixJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDcEQsV0FBVyxHQUFHLFlBQVksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNwRSxJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUMsRUFBRTtnQkFDcEIsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO2dCQUMxQixJQUFJLFNBQVM7b0JBQ1gseUJBQXlCLEdBQUcsSUFBSSxDQUFDO2FBQ3BDOztnQkFDSSxrQkFBa0IsR0FBRyxLQUFLLENBQUM7U0FDakM7YUFDSTtZQUNILGtCQUFrQixHQUFHLG9CQUFvQixDQUFDO1lBQzFDLFdBQVcsR0FBRyxhQUFhLENBQUM7U0FDN0I7UUFFRCxPQUFPLFdBQVcsSUFBSSxLQUFLO1lBQ3BCLENBQUMsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDcEQsQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLENBQUMsc0JBQXNCLEVBQzFDLFdBQVcsSUFBSSxDQUFDLEVBQUU7WUFDdkIsSUFBSSxTQUFTLElBQUkseUJBQXlCLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsV0FBVztnQkFDOUcsTUFBTTtZQUVSLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUVwRCxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBRTFCLHlCQUF5QixHQUFHLEtBQUssQ0FBQztZQUlsQyxJQUFJLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxDQUFDLHFCQUFxQixFQUFFO2dCQUMvRCxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDNUIsTUFBTTthQUNQO1lBR0QsSUFBSSxrQkFBa0IsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUcsV0FBVztnQkFDeEQsSUFBSSxRQUFRLEtBQUssY0FBYyxDQUFDLGFBQWE7b0JBQzNDLFNBQVM7cUJBQ04sSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxXQUFXO29CQUN0RixTQUFTO1lBRWIsSUFBSSxDQUFDLE9BQU87Z0JBQ1YsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsdUJBQXVCLENBQUMsQ0FBQztZQUV2RSxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssS0FBSztnQkFDM0IsbUJBQW1CLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztZQUVuQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRTtnQkFDcEQsWUFBWSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUV2RCxNQUFNLFlBQVksQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFM0QsUUFBUSxRQUFRLEVBQUU7Z0JBQ2hCLEtBQUssY0FBYyxDQUFDLGNBQWM7b0JBRWhDLElBQUksTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLEVBQUU7d0JBQzFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUU7NEJBQ3hDLFlBQVksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7eUJBRW5EO3dCQUVELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEtBQUssU0FBUyxDQUFDLGVBQWU7NEJBQ3ZGLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO3dCQU1uRCxPQUFPLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztxQkFDakM7b0JBQ0QsTUFBTTtnQkFFUixLQUFLLGNBQWMsQ0FBQyxZQUFZO29CQUc5QixJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixFQUFFLENBQUM7b0JBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUVqQyxNQUFNLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztvQkFFakYscUJBQXFCLEdBQUcsS0FBSyxDQUFDO29CQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFO3dCQUUzQixPQUFPLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTs0QkFFaEMsT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQ3pHLG1CQUFtQixFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDekMsSUFBSSxPQUFPLEtBQUssSUFBSTtnQ0FDbEIsT0FBTyxPQUFPLENBQUM7NEJBR2pCLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLFlBQVksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztnQ0FDdkUsTUFBTTs0QkFFUixJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixFQUFFLENBQUM7NEJBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO3lCQUNsQztxQkFDRjt5QkFDSTt3QkFDSCxJQUFJLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7NEJBQzNCLHFCQUFxQixHQUFHLElBQUksQ0FBQztxQkFDaEM7b0JBQ0QsSUFBSSxDQUFDLHFCQUFxQjt3QkFLeEIsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7b0JBQ3ZDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQ3ZCLE1BQU07Z0JBRVIsS0FBSyxjQUFjLENBQUMsYUFBYTtvQkFHL0IsSUFBSSxhQUFhLEdBQVcsV0FBVyxDQUFDO29CQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLFdBQVcsQ0FBQyxFQUFFO3dCQUN2RixJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDakMsSUFBSSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxXQUFXOzRCQUUxRCxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDOzs0QkFFOUUsV0FBVyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7cUJBQ3pFO3lCQUNJO3dCQUNILElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQzt3QkFDdEMsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUM1QixXQUFXLEdBQUcsWUFBWSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO3dCQUNwRSxJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUMsRUFBRTs0QkFDcEIsa0JBQWtCLEdBQUcsSUFBSSxDQUFDOzRCQUMxQixJQUFJLFNBQVM7Z0NBQ1gseUJBQXlCLEdBQUcsSUFBSSxDQUFDOzRCQUVuQyxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQ0FFbkYsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxXQUFXLEVBQUU7b0NBQ3hGLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7b0NBQ25DLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztpQ0FDckQ7NkJBQ0Y7eUJBQ0Y7NkJBQ0k7NEJBQ0gsa0JBQWtCLEdBQUcsS0FBSyxDQUFDOzRCQUMzQixXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUM7eUJBQ2xCO3FCQUNGO29CQUNELElBQUksV0FBVyxLQUFLLENBQUMsQ0FBQyxFQUFFO3dCQUN0QixZQUFZLEdBQUcsSUFBSSxDQUFDO3dCQUNwQixJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7d0JBRXBELElBQUksa0JBQWtCLEVBQUU7NEJBQ3RCLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLElBQUksV0FBVyxFQUFFO2dDQUN0RixZQUFZLEdBQUcsS0FBSyxDQUFDO2dDQUNyQix5QkFBeUIsR0FBRyxJQUFJLENBQUM7NkJBQ2xDO3lCQUNGO3dCQUVELElBQUksWUFBWSxFQUFFOzRCQUVoQixPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFDekcsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLFdBQVcsQ0FBQyxDQUFDOzRCQUM5RCxJQUFJLE9BQU8sS0FBSyxJQUFJO2dDQUNsQixJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQjtvQ0FDN0IsT0FBTyxPQUFPLENBQUM7cUNBQ1o7b0NBQ0gsa0JBQWtCLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDO29DQUNoRCxXQUFXLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQztvQ0FDbEMseUJBQXlCLEdBQUcsT0FBTyxDQUFDLHlCQUF5QixDQUFDO29DQUM5RCxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQztvQ0FDckMsU0FBUztpQ0FDVjt5QkFDSjtxQkFDRjtvQkFPRCxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQztvQkFDckMsTUFBTTtnQkFFUixLQUFLLGNBQWMsQ0FBQyxnQkFBZ0I7b0JBQ2xDLE1BQU0sV0FBVyxDQUFDLHFCQUFxQixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO29CQUNqRixNQUFNO2dCQUVSLEtBQUssY0FBYyxDQUFDLFlBQVk7b0JBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFFdEMsc0JBQXNCLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUM7b0JBQ2hFLE1BQU07Z0JBRVI7b0JBRUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUN0QyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQztvQkFDdkMsTUFBTTthQUNUO1lBSUQsSUFBSSxDQUFDLHlCQUF5QixFQUFFO2dCQUM5QixXQUFXLEdBQUcsWUFBWSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNwRSxJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUMsRUFBRTtvQkFDcEIsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO29CQUMxQixJQUFJLFNBQVM7d0JBQ1gseUJBQXlCLEdBQUcsSUFBSSxDQUFDO2lCQUNwQzs7b0JBQ0ksa0JBQWtCLEdBQUcsS0FBSyxDQUFDO2FBQ2pDO1NBRUY7UUFFRCxJQUFJLHNCQUFzQjtZQUN4QixPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQ2hDLElBQUkseUJBQXlCO1lBQ2hDLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQyxXQUFXLEVBQUUsa0JBQWtCLEVBQUUseUJBQXlCLENBQUMsQ0FBQzs7WUFFbEYsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNqQixPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBVU8sS0FBSyxDQUFDLG1CQUFtQixDQUFDLGFBQXFCLEVBQUUsTUFBYztRQUNyRSxJQUFJLE1BQU0sR0FBVyxDQUFDLENBQUMsQ0FBQztRQUV4QixPQUFPLGFBQWEsR0FBRyxNQUFNLEVBQUU7WUFDN0IsSUFBSSxJQUFJLEdBQWMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDckUsSUFBSSxRQUFRLEdBQVcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBRXRDLElBQUksUUFBUSxLQUFLLGNBQWMsQ0FBQyxhQUFhLElBQUksUUFBUSxLQUFLLGNBQWMsQ0FBQyxZQUFZLElBQUksUUFBUSxLQUFLLGNBQWMsQ0FBQyxjQUFjO2dCQUNySSxNQUFNO1lBRVIsSUFBSSxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQzdCLE1BQU0sR0FBRyxhQUFhLENBQUM7Z0JBQ3ZCLE1BQU07YUFDUDs7Z0JBRUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUN4QztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFTTyxxQkFBcUIsQ0FBQyxNQUFjO1FBQzFDLElBQUksTUFBTSxHQUFXLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLElBQUksS0FBSyxHQUFZLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQVMsQ0FBQztRQUNkLEtBQUssQ0FBQyxHQUFHLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMxQyxJQUFJLElBQUksR0FBYyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6RCxJQUFJLFFBQVEsR0FBVyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFFdEMsSUFBSSxRQUFRLEtBQUssY0FBYyxDQUFDLGFBQWEsSUFBSSxRQUFRLEtBQUssY0FBYyxDQUFDLFlBQVksRUFBRTtnQkFDekYsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssTUFBTSxFQUFFO29CQUNqQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO29CQUNYLEtBQUssR0FBRyxJQUFJLENBQUM7aUJBQ2Q7YUFDRjtTQUNGO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQVVPLHNCQUFzQixDQUFDLE9BQWU7UUFDNUMsSUFBSSxNQUFNLEdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDeEIsSUFBSSxLQUFLLEdBQVksS0FBSyxDQUFDO1FBQzNCLElBQUksWUFBWSxHQUFXLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2xGLElBQUksQ0FBUyxDQUFDO1FBQ2QsS0FBSyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzNDLElBQUksSUFBSSxHQUFjLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pELElBQUksUUFBUSxHQUFXLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUV0QyxJQUFJLFFBQVEsS0FBSyxjQUFjLENBQUMsYUFBYSxFQUFFO2dCQUM3QyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxZQUFZLEVBQUU7b0JBQ3ZDLE1BQU0sR0FBRyxDQUFDLENBQUM7b0JBQ1gsS0FBSyxHQUFHLElBQUksQ0FBQztpQkFDZDthQUNGO1NBQ0Y7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBV08sd0JBQXdCLENBQUMsWUFBb0IsRUFBRSxXQUFtQjtRQUN4RSxJQUFJLE1BQU0sR0FBVyxDQUFDLENBQUMsQ0FBQztRQUN4QixJQUFJLEtBQUssR0FBWSxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFDLEdBQVcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRW5GLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ1osQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMseUJBQXlCLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNqRjtRQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUN2QixJQUFJLElBQUksR0FBYyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6RCxJQUFJLFFBQVEsR0FBVyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdEMsSUFBSSxRQUFRLEtBQUssY0FBYyxDQUFDLGFBQWEsRUFBRTtnQkFDN0MsSUFBSSxDQUFDLEtBQUssWUFBWSxFQUFFO29CQUN0QixNQUFNLEdBQUcsQ0FBQyxDQUFDO29CQUNYLEtBQUssR0FBRyxJQUFJLENBQUM7aUJBQ2Q7O29CQUVDLENBQUMsRUFBRSxDQUFDO2FBQ1A7aUJBQ0ksSUFBSSxRQUFRLEtBQUssY0FBYyxDQUFDLFlBQVksRUFBRTtnQkFDakQsSUFBSSxTQUFTLEdBQVcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN2RCxJQUFJLFNBQVMsS0FBSyxZQUFZLEVBQUU7b0JBQzlCLE1BQU0sR0FBRyxDQUFDLENBQUM7b0JBQ1gsS0FBSyxHQUFHLElBQUksQ0FBQztpQkFDZDs7b0JBRUMsQ0FBQyxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUM7YUFDckI7aUJBQ0ksSUFBSSxRQUFRLEtBQUssY0FBYyxDQUFDLGdCQUFnQjtnQkFDbkQsQ0FBQyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7O2dCQUV0QyxDQUFDLEVBQUUsQ0FBQztTQUNQO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQU1ELFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUtELFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUtELEtBQUs7UUFDSCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDbEIsQ0FBQztJQUtELGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVELGNBQWM7UUFDWixPQUFrQixZQUFZLENBQUMsYUFBYSxDQUFDLGNBQWMsRUFBRSxDQUFDLE9BQU8sQ0FBQztJQUN4RSxDQUFDO0lBS0QsS0FBSyxDQUFDLFNBQVM7UUFDYixPQUFPLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBT08sS0FBSyxDQUFDLG1CQUFtQixDQUFDLElBQW1CO1FBQ25ELElBQUksRUFBRSxHQUF1QixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUNqRCxJQUFJLE1BQU0sR0FBVyxDQUFDLENBQUM7UUFFdkIsSUFBSTtZQUNGLEtBQUssSUFBSSxRQUFRLEdBQVcsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxFQUFFO2dCQUN6RixJQUFJLE1BQU0sR0FBeUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDekQsSUFBSSxTQUFTLEdBQVksQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFHbEUsSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLFNBQVMsRUFBRTtvQkFDM0QsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7d0JBQ2xDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7cUJBQ25EO3lCQUNJO3dCQUNILE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQzt3QkFDL0MsTUFBTSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO3FCQUM3QjtvQkFDRCxNQUFNLEVBQUUsQ0FBQztpQkFDVjtxQkFDSTtvQkFDSCxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQy9DLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDN0I7Z0JBQ0QsTUFBTSxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7YUFDOUI7U0FDRjtRQUNELE9BQU8sU0FBUyxFQUFFO1lBQ2hCLE1BQU0sU0FBUyxDQUFDO1NBQ2pCO0lBQ0gsQ0FBQztJQU1PLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFtQjtRQUNsRCxJQUFJLEVBQUUsR0FBdUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDakQsSUFBSSxDQUFDLEdBQVcsQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBUyxDQUFDO1FBRWQsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDOUUsSUFBSSxNQUFNLEdBQXlCLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUM1QyxJQUFJLEdBQUcsR0FBYSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNuQyxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxjQUFjLENBQUMsY0FBYyxFQUFFO29CQUVuRCxJQUFJLE1BQU0sR0FBeUIsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQVFsRCxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBUSxNQUFNLENBQUMsT0FBTyxFQUFHLENBQUMsVUFBVSxFQUFFLEVBQUU7d0JBQ3ZFLElBQUksR0FBRyxHQUFXLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ3pDLE1BQU0sTUFBTSxDQUFDLHlCQUF5QixDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQzt3QkFDL0YsTUFBTSxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7cUJBQzlCO2lCQUNGO2dCQUNELENBQUMsRUFBRSxDQUFDO2FBQ0w7U0FDRjtJQUNILENBQUM7SUFLRCxPQUFPO1FBQ0wsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFLRCxTQUFTLENBQUMsVUFBb0I7UUFDNUIsSUFBSSxXQUFXLEdBQVksSUFBSSxDQUFDO1FBQ2hDLElBQUksRUFBRSxHQUF1QixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUNqRCxJQUFJLENBQUMsR0FBVyxDQUFDLENBQUM7UUFDbEIsSUFBSSxVQUFVLEdBQVcsQ0FBQyxDQUFDO1FBRTNCLEtBQUssSUFBSSxDQUFDLEdBQVcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3BFLElBQUksS0FBSyxHQUF5QixFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pELElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUNuQixVQUFVLEVBQUUsQ0FBQztnQkFDYixJQUFJLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFO29CQUN6QixJQUFJLFNBQVMsR0FBcUIsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNsRCxJQUFJLE9BQU8sR0FBcUIsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztvQkFPbkQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsNEJBQTRCLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxFQUFFO3dCQUNoSyxXQUFXLEdBQUcsS0FBSyxDQUFDO3dCQUNwQixNQUFNO3FCQUNQO29CQUNELENBQUMsRUFBRSxDQUFDO2lCQUNMO2FBQ0Y7U0FDRjtRQUVELElBQUksVUFBVSxLQUFLLFVBQVUsQ0FBQyxNQUFNLEVBQUU7WUFDcEMsV0FBVyxHQUFHLEtBQUssQ0FBQztTQUNyQjtRQUNELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFLRCxlQUFlO1FBQ2IsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFLRCw4QkFBOEI7UUFDNUIsSUFBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxFQUFFLElBQUksY0FBYyxDQUFDLG1CQUFtQixFQUFFO1lBR2xFLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztnQkFDckUsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDN0I7UUFDRCxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDdkIsQ0FBQztJQUtELDJCQUEyQjtRQUUxQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUMzRSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFdEQsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQ3RCLENBQUM7SUFLRCxtQkFBbUI7UUFDakIsSUFBSSxnQkFBZ0IsR0FBa0IsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUUxRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUdwRCxJQUFJLG9CQUFvQixHQUFXLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxHQUFHLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1FBRTlHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBSzlDLElBQUcsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3BELGdCQUFnQixHQUFHLElBQUksYUFBYSxDQUFDLEdBQUcsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsRUFBRSxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFbEgsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxZQUFZLEVBQUUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzVGLENBQUM7SUFPRCxjQUFjLENBQUMsVUFBbUI7UUFDaEMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVO1lBQzlDLE9BQU8sS0FBSyxDQUFDO1FBQ2YsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQywwQ0FBMEMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3hHLENBQUM7Q0FDRjtBQUtELE1BQU0sT0FBTyxPQUFPO0lBU2xCLFlBQVksVUFBZSxFQUFFLHVCQUFnQyxFQUFFLDJCQUFxQztRQVJwRyw4QkFBeUIsR0FBWSxLQUFLLENBQUM7UUFDM0MsWUFBTyxHQUFZLEtBQUssQ0FBQztRQUN6QixnQkFBVyxHQUFXLENBQUMsQ0FBQztRQUN4QixjQUFTLEdBQVksS0FBSyxDQUFDO1FBQzNCLHVCQUFrQixHQUFZLEtBQUssQ0FBQztRQUtsQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUN4QixJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDOztZQUV4RCxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSx1QkFBdUIsRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFLTyxhQUFhLENBQUMsQ0FBVSxFQUFFLENBQVU7UUFDMUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDbkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztRQUNoQyxJQUFJLENBQUMseUJBQXlCLEdBQUcsS0FBSyxDQUFDO0lBQ3pDLENBQUM7SUFRTyxhQUFhLENBQUMsT0FBZSxFQUFFLG9CQUE2QixFQUFFLDJCQUFvQztRQUN4RyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQztRQUMzQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsb0JBQW9CLENBQUM7UUFDL0MsSUFBSSxDQUFDLHlCQUF5QixHQUFHLDJCQUEyQixDQUFDO0lBQy9ELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QXBwbGljYXRpb25FeGNlcHRpb24sIEV4Y2VwdGlvbiwgTGlzdCwgTlN0cmluZywgUmVmUGFyYW0sIFN0cmluZ0J1aWxkZXIsIGlzTnVsbE9yVW5kZWZpbmVkfSBmcm9tIFwiQG1hZ2ljLXhwYS9tc2NvcmVsaWJcIjtcclxuaW1wb3J0IHtcclxuICBCcmtTY29wZSxcclxuICBDb25zdGFudHMsXHJcbiAgSW50ZXJuYWxJbnRlcmZhY2UsXHJcbiAgTG9nZ2VyLFxyXG4gIExvZ2dlcl9Mb2dMZXZlbHMsXHJcbiAgU3RvcmFnZUF0dHJpYnV0ZSxcclxuICBTdG9yYWdlQXR0cmlidXRlQ2hlY2ssXHJcbiAgWE1MQ29uc3RhbnRzLFxyXG4gIFhtbFBhcnNlclxyXG59IGZyb20gXCJAbWFnaWMteHBhL3V0aWxzXCI7XHJcbmltcG9ydCB7RXhwVmFsLCBNYW5hZ2VyfSBmcm9tIFwiQG1hZ2ljLXhwYS9ndWlcIjtcclxuaW1wb3J0IHtFdmVudH0gZnJvbSBcIi4vRXZlbnRcIjtcclxuaW1wb3J0IHtGaWVsZEJhc2V9IGZyb20gXCIuLi9kYXRhL0ZpZWxkQmFzZVwiO1xyXG5pbXBvcnQge09wZXJhdGlvblRhYmxlfSBmcm9tIFwiLi4vcnQvT3BlcmF0aW9uVGFibGVcIjtcclxuaW1wb3J0IHtBcmd1bWVudH0gZnJvbSBcIi4uL3J0L0FyZ3VtZW50XCI7XHJcbmltcG9ydCB7QXJndW1lbnRzTGlzdH0gZnJvbSBcIi4uL3J0L0FyZ3VtZW50c0xpc3RcIjtcclxuaW1wb3J0IHtNZ0NvbnRyb2x9IGZyb20gXCIuLi9ndWkvTWdDb250cm9sXCI7XHJcbmltcG9ydCB7T3BlcmF0aW9ufSBmcm9tIFwiLi4vcnQvT3BlcmF0aW9uXCI7XHJcbmltcG9ydCB7Rmxvd01vbml0b3JRdWV1ZX0gZnJvbSBcIi4uL3V0aWwvRmxvd01vbml0b3JRdWV1ZVwiO1xyXG5pbXBvcnQge01HRGF0YX0gZnJvbSBcIi4uL3Rhc2tzL01HRGF0YVwiO1xyXG5pbXBvcnQge1NlcnZlckVycm9yfSBmcm9tIFwiLi4vcmVtb3RlL1NlcnZlckVycm9yXCI7XHJcbmltcG9ydCB7UnVuVGltZUV2ZW50fSBmcm9tIFwiLi9SdW5UaW1lRXZlbnRcIjtcclxuaW1wb3J0IHtNZ0Zvcm19IGZyb20gXCIuLi9ndWkvTWdGb3JtXCI7XHJcbmltcG9ydCB7WWVzTm9FeHB9IGZyb20gXCIuLi9leHAvWWVzTm9FeHBcIjtcclxuaW1wb3J0IHtUYXNrfSBmcm9tIFwiLi4vdGFza3MvVGFza1wiO1xyXG5pbXBvcnQge0RhdGFWaWV3fSBmcm9tIFwiLi4vZGF0YS9EYXRhVmlld1wiO1xyXG5pbXBvcnQge0NvbnN0SW50ZXJmYWNlfSBmcm9tIFwiLi4vQ29uc3RJbnRlcmZhY2VcIjtcclxuaW1wb3J0IHtGbG93TW9uaXRvckludGVyZmFjZX0gZnJvbSBcIi4uL0Zsb3dNb25pdG9ySW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7IExhc3RGb2N1c2VkTWFuYWdlciB9IGZyb20gXCIuLi9ydC9MYXN0Rm9jdXNlZE1hbmFnZXJcIjtcclxuaW1wb3J0IHsgQWNjZXNzSGVscGVyIH0gZnJvbSBcIi4uL0FjY2Vzc0hlbHBlclwiO1xyXG5pbXBvcnQge1JlbW90ZUNvbW1hbmRzUHJvY2Vzc29yfSBmcm9tIFwiLi4vcmVtb3RlL1JlbW90ZUNvbW1hbmRzUHJvY2Vzc29yXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRXZlbnRIYW5kbGVyIHtcclxuICBwcml2YXRlIF9lbmFibGVkRXhwOiBZZXNOb0V4cCA9IG5ldyBZZXNOb0V4cCh0cnVlKTsgLy8gZGVmYXVsdCBpcyB0cnVlIGFsd2F5c1xyXG4gIHByaXZhdGUgX29wZXJhdGlvblRhYjogT3BlcmF0aW9uVGFibGUgPSBudWxsO1xyXG4gIHByaXZhdGUgX3Byb3BhZ2F0ZUV4cDogWWVzTm9FeHAgPSBuZXcgWWVzTm9FeHAodHJ1ZSk7XHJcbiAgcHJpdmF0ZSBfaXNIYW5kbGVyT25Gb3JtOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfY3RybDogTWdDb250cm9sID0gbnVsbDtcclxuICBwcml2YXRlIF9jdHJsTmFtZTogc3RyaW5nID0gbnVsbDtcclxuICBwcml2YXRlIF9kdkxlbjogbnVtYmVyID0gMDsgLy8gVGhlIOKAnGR2cG9zwoFFY29udGFpbnMgdGhlIG51bWJlciBvZiBmaWVsZHMgc2VsZWN0ZWQgaW4gdGhlIGhhbmRsZXJcclxuICBwcml2YXRlIF9kdlBvczogbnVtYmVyID0gMDsgLy8gYW5kIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZmllbGQgb2YgaXQgaW4gdGhlIERhdGF2aWV3LlxyXG4gIHByaXZhdGUgX2V2dDogRXZlbnQgPSBudWxsO1xyXG4gIHByaXZhdGUgX2hhbmRsZWRCeUNsaWVudDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2hhbmRsZXJGbGQ6IEZpZWxkQmFzZSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfaGFzUGFyYW1ldGVyczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2lkOiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgX2xldmVsOiBzdHJpbmcgPSAnXFwwJzsgLy8gQ29udHJvbCB8IEhhbmRsZXIgfCBSZWNvcmQgfCBUYXNrIHwgVmFyaWFibGVcclxuICBwcml2YXRlIF9zY29wZTogQnJrU2NvcGUgPSBudWxsOyAvLyBUYXNrfFN1YnRhc2t8R2xvYmFsXHJcbiAgcHJpdmF0ZSBfdGFzazogVGFzayA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfdGFza01nZElEOiBudW1iZXIgPSAtMTtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIENUT1JcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5fb3BlcmF0aW9uVGFiID0gbmV3IE9wZXJhdGlvblRhYmxlKCk7XHJcbiAgfVxyXG5cclxuICBnZXRDdHJsTmFtZSgpIDogc3RyaW5ne1xyXG4gICAgcmV0dXJuIHRoaXMuX2N0cmxOYW1lO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBhcnNlIHRoZSBldmVudCBoYW5kbGVyIGFuZCBpdHMgc3ViLXN0cnVjdHVyZXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGZpbGxEYXRhKHRhc2tSZWY6IFRhc2ssIHBhcnNlcjogWG1sUGFyc2VyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdGFzayA9PT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl90YXNrID0gdGFza1JlZjtcclxuICAgICAgdGhpcy5fdGFza01nZElEID0gdGhpcy5fdGFzay5nZXRNZ2RJRCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHdoaWxlICh0aGlzLmluaXRJbm5lck9iamVjdHMocGFyc2VyLCBwYXJzZXIuZ2V0TmV4dFRhZygpKSkge1xyXG4gICAgfVxyXG4gICAgbGV0IGRhdGFWaWV3OiBEYXRhVmlldyA9IDxEYXRhVmlldz50aGlzLl90YXNrLkRhdGFWaWV3O1xyXG4gICAgdGhpcy5faGFzUGFyYW1ldGVycyA9IGRhdGFWaWV3LlBhcmFtZXRlcnNFeGlzdCh0aGlzLl9kdlBvcywgdGhpcy5fZHZMZW4pO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGluaXRpYWxpemluZyBvZiBpbm5lciBvYmplY3RzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBwcml2YXRlIGluaXRJbm5lck9iamVjdHMocGFyc2VyOiBYbWxQYXJzZXIsIGZvdW5kVGFnTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcblxyXG4gICAgaWYgKGZvdW5kVGFnTmFtZSA9PT0gbnVsbClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGlmIChmb3VuZFRhZ05hbWUgPT09IENvbnN0SW50ZXJmYWNlLk1HX1RBR19IQU5ETEVSKVxyXG4gICAgICB0aGlzLmluaXRJbm5lckVsZW1lbnRzKHBhcnNlciwgdGhpcy5fdGFzayk7XHJcblxyXG4gICAgZWxzZSBpZiAoZm91bmRUYWdOYW1lID09PSBDb25zdEludGVyZmFjZS5NR19UQUdfT1BFUilcclxuICAgICAgdGhpcy5fb3BlcmF0aW9uVGFiLmZpbGxEYXRhKHRoaXMuX3Rhc2ssIHRoaXMsIHBhcnNlcik7XHJcblxyXG4gICAgZWxzZSBpZiAoZm91bmRUYWdOYW1lID09PSBDb25zdEludGVyZmFjZS5NR19UQUdfRVZFTlQgJiYgdGhpcy5fZXZ0ID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX2V2dCA9IG5ldyBFdmVudCgpO1xyXG4gICAgICB0aGlzLl9ldnQuZmlsbERhdGEocGFyc2VyLCB0aGlzLl90YXNrKTtcclxuICAgICAgaWYgKHRoaXMuX2V2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVElNRVIgfHxcclxuICAgICAgICAodGhpcy5fZXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9VU0VSICYmIHRoaXMuX2V2dC5nZXRVc2VyRXZlbnRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVElNRVIpKVxyXG4gICAgICAgIHRoaXMuX3Rhc2suZ2V0TUdEYXRhKCkuYWRkVGltZXJIYW5kbGVyKHRoaXMpO1xyXG5cclxuICAgICAgLy8gZm9yIGVuYWJsZSBNR19BQ1RfWk9PTSBhY3Rpb25cclxuICAgICAgLy8gMS4gaGFuZGxlciBvbiB6b29tIGFjdGlvbi5cclxuICAgICAgLy8gMi4gaGFuZGxlciBvbiBhIHVzZXIgZGVmaW5lZCBoYW5kbGVyIHdpdGggYSB0cmlnZ2VyIG9mIHpvb20gYWN0aW9uLlxyXG4gICAgICBpZiAoKCh0aGlzLl9ldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMICYmIHRoaXMuX2V2dC5nZXRJbnRlcm5hbENvZGUoKSA9PT0gSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1pPT00pIHx8ICh0aGlzLl9ldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1VTRVIgJiYgdGhpcy5fZXZ0LmdldFVzZXJFdmVudCgpICE9PSBudWxsICYmIHRoaXMuX2V2dC5nZXRVc2VyRXZlbnRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgJiYgdGhpcy5fZXZ0LmdldFVzZXJFdmVudCgpLmdldEludGVybmFsQ29kZSgpID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfWk9PTSkpICYmICF0aGlzLl90YXNrLmdldEVuYWJsZVpvb21IYW5kbGVyKCkpIHtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2hhbmRsZXJGbGQgIT09IG51bGwpXHJcbiAgICAgICAgICB0aGlzLl9oYW5kbGVyRmxkLnNldEhhc1pvb21IYW5kbGVyKCk7XHJcblxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX2N0cmwgIT09IG51bGwpXHJcbiAgICAgICAgICB0aGlzLl9jdHJsLkhhc1pvb21IYW5kbGVyID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhpcy5fdGFzay5zZXRFbmFibGVab29tSGFuZGxlcigpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChmb3VuZFRhZ05hbWUgPT09ICcvJyArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19IQU5ETEVSKSB7XHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgyRW5kT2ZUYWcoKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJ0aGVyZSBpcyBubyBzdWNoIHRhZyBpbiBFdmVudEhhbmRsZXIuaW5pdElubmVyT2JqZWN0cygpIFwiICsgZm91bmRUYWdOYW1lKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgSW5pdGlhbGl6aW5nIG9mIGlubmVyIGF0dHJpYnV0ZXMgb2YgPGhhbmRsZXI+IHRhZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrUmVmXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGluaXRJbm5lckVsZW1lbnRzKHBhcnNlcjogWG1sUGFyc2VyLCB0YXNrUmVmOiBUYXNrKTogdm9pZCB7XHJcbiAgICBsZXQgZW5kQ29udGV4dDogbnVtYmVyID0gcGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKCBYTUxDb25zdGFudHMuVEFHX0NMT1NFLCBwYXJzZXIuZ2V0Q3VyckluZGV4KCkpO1xyXG4gICAgaWYgKGVuZENvbnRleHQgIT09IC0xICYmIGVuZENvbnRleHQgPCBwYXJzZXIuZ2V0WE1MZGF0YSgpLmxlbmd0aCkge1xyXG4gICAgICAvLyBsYXN0IHBvc2l0aW9uIG9mIGl0cyB0YWdcclxuICAgICAgbGV0IHRhZzogc3RyaW5nID0gcGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KTtcclxuICAgICAgcGFyc2VyLmFkZDJDdXJySW5kZXgodGFnLmluZGV4T2YoIENvbnN0SW50ZXJmYWNlLk1HX1RBR19IQU5ETEVSKSArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19IQU5ETEVSLmxlbmd0aCk7XHJcblxyXG4gICAgICBsZXQgdG9rZW5zVmVjdG9yOiBMaXN0PHN0cmluZz4gPSBYbWxQYXJzZXIuZ2V0VG9rZW5zKHBhcnNlci5nZXRYTUxzdWJzdHJpbmcoZW5kQ29udGV4dCksIFhNTENvbnN0YW50cy5YTUxfQVRUUl9ERUxJTSk7XHJcbiAgICAgIHRoaXMuaW5pdEVsZW1lbnRzKHRva2Vuc1ZlY3RvciwgdGFza1JlZik7XHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgoKytlbmRDb250ZXh0KTsgLy8gdG8gZGVsZXRlIFwiPlwiIHRvb1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJpbiBIYW5kbGVyLkZpbGxEYXRhKCkgb3V0IG9mIHN0cmluZyBib3VuZHNcIik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgTWFrZSBpbml0aWFsaXphdGlvbiBvZiBwcml2YXRlIGVsZW1lbnRzIGJ5IGZvdW5kIHRva2Vuc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0b2tlbnNWZWN0b3JcIj5mb3VuZCB0b2tlbnMsIHdoaWNoIGNvbnNpc3QgYXR0cmlidXRlL3ZhbHVlIG9mIGV2ZXJ5IGZvdW5kXHRlbGVtZW50IDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0YXNrUmVmXCI+IDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBpbml0RWxlbWVudHModG9rZW5zVmVjdG9yOiBMaXN0PHN0cmluZz4sIHRhc2tSZWY6IFRhc2spOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGo6IG51bWJlciA9IDA7IGogPCB0b2tlbnNWZWN0b3IubGVuZ3RoOyBqICs9IDIpIHtcclxuICAgICAgbGV0IGF0dHJpYnV0ZTogc3RyaW5nID0gKHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqKSk7XHJcbiAgICAgIGxldCB2YWx1ZVN0cjogc3RyaW5nID0gKHRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqICsgMSkpO1xyXG5cclxuICAgICAgc3dpdGNoIChhdHRyaWJ1dGUpIHtcclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfSEFORExFREJZOlxyXG4gICAgICAgICAgdGhpcy5faGFuZGxlZEJ5Q2xpZW50ID0gKHZhbHVlU3RyLnRvVXBwZXJDYXNlKCkgPT09IFwiQ1wiLnRvVXBwZXJDYXNlKCkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgWE1MQ29uc3RhbnRzLk1HX0FUVFJfSUQ6XHJcbiAgICAgICAgICB0aGlzLl9pZCA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9MRVZFTDpcclxuICAgICAgICAgIHRoaXMuX2xldmVsID0gdmFsdWVTdHJbMF07XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX09CSkVDVDpcclxuICAgICAgICAgIGxldCB2YWx1ZVN0cmluZ0N0cmxOYW1lOiBzdHJpbmcgPSBYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHIpO1xyXG4gICAgICAgICAgdGhpcy5fY3RybE5hbWUgPSBYbWxQYXJzZXIudW5lc2NhcGUodmFsdWVTdHJpbmdDdHJsTmFtZSkudG9VcHBlckNhc2UoKTsgLy8gcmVsZXZhbnQgZm9yIHVzZXIgaGFuZGxlcnMgb25seVxyXG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVDdHJsRnJvbUNvbnRyb2xOYW1lKHRhc2tSZWYpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9WQVJJQUJMRTpcclxuICAgICAgICAgIHRoaXMuX2hhbmRsZXJGbGQgPSA8RmllbGRCYXNlPnRoaXMuX3Rhc2suRGF0YVZpZXcuZ2V0RmllbGQoWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0cikpO1xyXG4gICAgICAgICAgdGhpcy5faGFuZGxlckZsZC5zZXRIYXNDaGFuZ2VFdmVudCgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9TQ09QRTpcclxuICAgICAgICAgIHRoaXMuX3Njb3BlID0gPEJya1Njb3BlPnZhbHVlU3RyWzBdO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9QUk9QQUdBVEU6XHJcbiAgICAgICAgICB0aGlzLl9wcm9wYWdhdGVFeHAuc2V0VmFsKHRhc2tSZWYsIHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfRU5BQkxFRDpcclxuICAgICAgICAgIHRoaXMuX2VuYWJsZWRFeHAuc2V0VmFsKHRhc2tSZWYsIHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfRFZQT1M6XHJcbiAgICAgICAgICBsZXQgaTogbnVtYmVyID0gdmFsdWVTdHIuaW5kZXhPZihcIixcIik7XHJcbiAgICAgICAgICBpZiAoaSA+IC0xKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2R2TGVuID0gWG1sUGFyc2VyLmdldEludCh2YWx1ZVN0ci5zdWJzdHIoMCwgaSkpO1xyXG4gICAgICAgICAgICB0aGlzLl9kdlBvcyA9IFhtbFBhcnNlci5nZXRJbnQodmFsdWVTdHIuc3Vic3RyKGkgKyAxKSk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGZsZElkeDogbnVtYmVyID0gdGhpcy5fZHZQb3M7IGZsZElkeCA8IHRoaXMuX2R2UG9zICsgdGhpcy5fZHZMZW47IGZsZElkeCsrKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGZpZWxkOiBGaWVsZEJhc2UgPSAoPEZpZWxkQmFzZT50aGlzLl90YXNrLkRhdGFWaWV3LmdldEZpZWxkKGZsZElkeCkpO1xyXG4gICAgICAgICAgICAgIGZpZWxkLklzRXZlbnRIYW5kbGVyRmllbGQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0hBTkRMRVJfT05GT1JNOlxyXG4gICAgICAgICAgdGhpcy5faXNIYW5kbGVyT25Gb3JtID0gWG1sUGFyc2VyLmdldEJvb2xlYW4odmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJUaGVyZSBpcyBubyBzdWNoIHRhZyBpbiBFdmVudEhhbmRsZXIgY2xhc3MuIEluc2VydCBjYXNlIHRvIEV2ZW50SGFuZGxlci5pbml0RWxlbWVudHMgZm9yIFwiICsgYXR0cmlidXRlKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBjYWxjdWxhdGUgdGhlIGN0cmwgcHJvcGVydHkgZnJvbSBjdHJsIG5hbWUgcHJvcGVydHlcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInRhc2tSZWZcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbHVlU3RyaW5nQ3RybE5hbWVcIj48L3BhcmFtPlxyXG5cclxuICBjYWxjdWxhdGVDdHJsRnJvbUNvbnRyb2xOYW1lKHRhc2tSZWY6IFRhc2spOiB2b2lkIHtcclxuICAgIGlmICghTlN0cmluZy5Jc051bGxPckVtcHR5KHRoaXMuX2N0cmxOYW1lKSkge1xyXG4gICAgICB0aGlzLl9jdHJsID0gKCh0YXNrUmVmLmdldEZvcm0oKSAhPT0gbnVsbCkgPyAoPE1nRm9ybT50YXNrUmVmLmdldEZvcm0oKSkuZ2V0Q3RybEJ5Q3RybE5hbWUodGhpcy5fY3RybE5hbWUpIDogbnVsbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgaWYgdGhpcyBldmVudCBoYW5kbGVyIGlzIGEgc3BlY2lmaWMgaGFuZGxlciBvZiBhbiBldmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJydEV2dFwiPnRoZSBldmVudCB0byBjaGVjazwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBib29sZWFuIHRydWUgaWYgdGhlIGV2ZW50cyBtYXRjaDwvcmV0dXJucz5cclxuICBpc1NwZWNpZmljSGFuZGxlck9mKHJ0RXZ0OiBSdW5UaW1lRXZlbnQpOiBib29sZWFuIHtcclxuXHJcbiAgICBpZiAodGhpcy5fY3RybCA9PT0gbnVsbCAmJiB0aGlzLl9jdHJsTmFtZSA9PT0gbnVsbCAmJiB0aGlzLl9oYW5kbGVyRmxkID09PSBudWxsICYmICF0aGlzLl9pc0hhbmRsZXJPbkZvcm0pXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAvLyBjaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIHNjb3BlXHJcbiAgICBpZiAodGhpcy5fc2NvcGUgPT09IEJya1Njb3BlLlRhc2sgJiYgdGhpcy5fdGFzayAhPT0gcnRFdnQuZ2V0VGFzaygpKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgLy8gaWYgdGhlIGhhbmRsZXJzIGV2ZW50IGFuZCB0aGUgY2hlY2tlZCBldmVudCBhcmUgZXF1YWwgYW5kXHJcbiAgICAvLyB0aGUgaGFuZGxlciBoYW5kbGVzIHRoZSBjb250cm9sIGF0dGFjaGVkIHRvIHRoZSBjaGVja2VkIGV2ZW50LCByZXR1cm4gdHJ1ZVxyXG4gICAgLy8gY29tcGFyZSBjb250cm9sIG5hbWUgd2l0aCB0aGUgbmFtZSBvZiB0aGUgY29udHJvbCBpbiB0aGUgZXZlbnRcclxuICAgIGlmICh0aGlzLl9ldnQuZXF1YWxzKHJ0RXZ0KSkge1xyXG4gICAgICAvLyBWYXJpYWJsZSBjaGFuZ2UgaGFuZGxlcnMgZG8gbm90IGhhdmUgY29udHJvbCBuYW1lcy4gT25seSBmaWVsZHMgbmVlZCB0byBiZSBjb21wYXJlZFxyXG4gICAgICBpZiAodGhpcy5faGFuZGxlckZsZCAhPT0gbnVsbCkge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5faGFuZGxlckZsZCA9PT0gcnRFdnQuZ2V0RmxkKCkpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChydEV2dC5Db250cm9sICE9PSBudWxsICYmICF0aGlzLl9pc0hhbmRsZXJPbkZvcm0pIHtcclxuICAgICAgICBsZXQgZXZlbnRDdHJsTmFtZTogc3RyaW5nID0gcnRFdnQuQ29udHJvbC5nZXRDb250cm9sTmFtZUZvckhhbmRsZXJTZWFyY2goKTtcclxuICAgICAgICBpZiAoZXZlbnRDdHJsTmFtZSAhPT0gbnVsbCAmJiB0aGlzLl9jdHJsTmFtZS50b0xvd2VyQ2FzZSgpID09PSBldmVudEN0cmxOYW1lLnRvTG93ZXJDYXNlKCkpXHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChydEV2dC5Db250cm9sID09PSBudWxsICYmIHRoaXMuX2lzSGFuZGxlck9uRm9ybSlcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgaWYgdGhpcyBldmVudCBoYW5kbGVyIGlzIGEgbm9uLXNwZWNpZmljIG9yIGdsb2JhbCBoYW5kbGVyIG9mIGFuIGV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJ0RXZ0XCI+dGhlIGV2ZW50IHRvIGNoZWNrXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBib29sZWFuIHRydWUgaWYgdGhlIGV2ZW50cyBtYXRjaFxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgaXNOb25TcGVjaWZpY0hhbmRsZXJPZihydEV2dDogUnVuVGltZUV2ZW50KTogYm9vbGVhbiB7XHJcblxyXG4gICAgLy8gaWYgdGhlIGhhbmRsZXIgaGFuZGxlcyBhIGNvbnRyb2wgcmV0dXJuIGZhbHNlXHJcbiAgICBpZiAodGhpcy5fY3RybCAhPT0gbnVsbCB8fCB0aGlzLl9jdHJsTmFtZSAhPT0gbnVsbCB8fCB0aGlzLl9oYW5kbGVyRmxkICE9PSBudWxsIHx8IHRoaXMuX2lzSGFuZGxlck9uRm9ybSlcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgLy8gY2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSBzY29wZVxyXG4gICAgaWYgKHRoaXMuX3Njb3BlID09PSBCcmtTY29wZS5UYXNrICYmICB0aGlzLl90YXNrICE9PSBydEV2dC5nZXRUYXNrKCkgJiYgcnRFdnQuZ2V0VHlwZSgpICE9PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1RJTUVSKVxyXG4gIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAodGhpcy5fc2NvcGUgPT09IEJya1Njb3BlLkdsb2JhbCAmJiB0aGlzLl90YXNrICE9PSBydEV2dC5nZXRUYXNrKCkpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAvLyBpZiB0aGUgaGFuZGxlcnMgZXZlbnQgYW5kIHRoZSBjaGVja2VkIGV2ZW50IGFyZSBlcXVhbCByZXR1cm4gdHJ1ZVxyXG4gICAgaWYgKHRoaXMuX2V2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVVNFUiAmJiB0aGlzLl9ldnQuZ2V0VXNlckV2ZW50VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX05PVElOSVRFRCkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHRoaXMuX2V2dC5maW5kVXNlckV2ZW50KCk7XHJcbiAgICAgIH1cclxuICAgICAgY2F0Y2ggKGFwcGxpY2F0aW9uRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgaWYgKGFwcGxpY2F0aW9uRXhjZXB0aW9uIGluc3RhbmNlb2YgQXBwbGljYXRpb25FeGNlcHRpb24pIHtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhyb3cgYXBwbGljYXRpb25FeGNlcHRpb247XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9ldnQuZXF1YWxzKHJ0RXZ0KTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBjaGVjayBpZiB0aGlzIGV2ZW50IGhhbmRsZXIgaXMgYSBnbG9iYWwgaGFuZGxlciBvZiBhbiBldmVudFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJydEV2dFwiPnRoZSBldmVudCB0byBjaGVja1xyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gYm9vbGVhbiB0cnVlIGlmIHRoZSBldmVudHMgbWF0Y2hcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIGlzR2xvYmFsSGFuZGxlck9mKHJ0RXZ0OiBSdW5UaW1lRXZlbnQpOiBib29sZWFuIHtcclxuICAgIC8vIGNoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgc2NvcGVcclxuICAgIGlmICh0aGlzLl9zY29wZSAhPT0gQnJrU2NvcGUuR2xvYmFsKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgLy8gaWYgdGhlIGhhbmRsZXIgaGFuZGxlcyBhIGNvbnRyb2wgcmV0dXJuIGZhbHNlXHJcbiAgICBpZiAodGhpcy5fY3RybCAhPSBudWxsIHx8IHRoaXMuX2N0cmxOYW1lICE9IG51bGwgfHwgdGhpcy5faGFuZGxlckZsZCAhPSBudWxsIHx8IHRoaXMuX2lzSGFuZGxlck9uRm9ybSlcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIC8vIGlmIHRoZSBoYW5kbGVycyBldmVudCBhbmQgdGhlIGNoZWNrZWQgZXZlbnQgYXJlIGVxdWFsLCByZXR1cm4gdHJ1ZVxyXG4gICAgcmV0dXJuIHRoaXMuX2V2dC5lcXVhbHMocnRFdnQpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGNoZWNrIGlmIHRoaXMgZXZlbnQgaGFuZGxlciBpcyBhIHNwZWNpZmljIGdsb2JhbCBoYW5kbGVyIG9mIGFuIGV2ZW50XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInJ0RXZ0XCI+dGhlIGV2ZW50IHRvIGNoZWNrXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBib29sZWFuIHRydWUgaWYgdGhlIGV2ZW50cyBtYXRjaFxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgaXNHbG9iYWxTcGVjaWZpY0hhbmRsZXJPZihydEV2dDogUnVuVGltZUV2ZW50KTogYm9vbGVhbiB7XHJcbiAgICAvLyBjaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIHNjb3BlXHJcbiAgICBpZiAodGhpcy5fc2NvcGUgIT09IEJya1Njb3BlLkdsb2JhbClcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGlmICh0aGlzLl9jdHJsID09IG51bGwgJiYgdGhpcy5fY3RybE5hbWUgPT0gbnVsbCAmJiB0aGlzLl9oYW5kbGVyRmxkID09IG51bGwpXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAvLyBpZiB0aGUgaGFuZGxlcnMgZXZlbnQgYW5kIHRoZSBjaGVja2VkIGV2ZW50IGFyZSBlcXVhbCwgcmV0dXJuIHRydWVcclxuICAgIHJldHVybiAodGhpcy5fY3RybE5hbWUgIT0gbnVsbCAmJiB0aGlzLl9ldnQuZXF1YWxzKHJ0RXZ0KSAmJlxyXG4gICAgICBOU3RyaW5nLkVxdWFscyh0aGlzLl9jdHJsTmFtZSwgcnRFdnQuQ29udHJvbC5OYW1lLCB0cnVlKSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZXhlY3V0ZSB0aGUgZXZlbnQgaGFuZGxlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJydEV2dFwiPnRoZSBldmVudCBvbiB3aGljaCB0aGUgaGFuZGxlciBpcyBleGVjdXRlZFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwicmV0dXJuZWRGcm9tU2VydmVyXCI+aW5kaWNhdGVzIHdoZXRoZXIgd2UgcmV0dXJuZWQgZnJvbSB0aGUgc2VydmVyIGFuZFxyXG4gIC8vLyAgIHRoZXJlZm9yZSBtaWdodCBub3QgbmVlZCB0byBjaGVjayB0aGUgZW5hYmxlZCBjb25kaXRpb25cclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImVuYWJsZWRDbmRDaGVja2VkQW5kVHJ1ZVwiPmluZGljYXRlcyB0aGF0IHRoZSBlbmFibGVkIGNvbmRpdGlvbiB3YXMgYWxyZWFkeSBjaGVja2VkIGFuZCB0aGVyZSdzIG5vXHJcbiAgLy8vICAgbmVlZCB0byByZS1jaGVjayBpdCAoYmVjYXVzZSBpdCBtaWdodCBiZSBmYWxzZSBub3csIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvXHJcbiAgLy8vICAgZXhlY3V0ZSB0aGUgaGFuZGxlcilcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGJvb2xlYW4gdGhpcyBpcyB0aGUgcmV0dXJuIGNvZGUgb2YgdGhlIGhhbmRsZXIsIGlmIHRydWUgdGhlbiB0aGUgZXZlbnRzXHJcbiAgLy8vICAgbWFuYWdlciBtdXN0IGNvbnRpbnVlIHNlYXJjaGluZyBmb3IgdGhlIG5leHQgZXZlbnQgaGFuZGxlciBmb3IgdGhlIGV2ZW50XHJcbiAgLy8vIDwvcmV0dXJucz5cclxuIGFzeW5jIGV4ZWN1dGUocnRFdnQ6IFJ1blRpbWVFdmVudCwgcmV0dXJuZWRGcm9tU2VydmVyOiBib29sZWFuLCBlbmFibGVkQ25kQ2hlY2tlZEFuZFRydWU6IGJvb2xlYW4pOiBQcm9taXNlPFJldFZhbHM+IHtcclxuXHJcbiAgICBsZXQgY3RybDogTWdDb250cm9sID0gbnVsbDtcclxuICAgIGxldCByZXRWYWw6IGJvb2xlYW47XHJcbiAgICBsZXQgZGVwdGg6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgdGFza0VuZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGJya0xldmVsOiBzdHJpbmcgPSB0aGlzLl90YXNrLmdldEJya0xldmVsKCk7XHJcbiAgICBsZXQgYnJrTGV2ZWxJbmRleDogbnVtYmVyID0gdGhpcy5fdGFzay5nZXRCcmtMZXZlbEluZGV4KCk7XHJcbiAgICBsZXQgaW5pdGlhbExvb3BTdGFja1NpemU6IG51bWJlciA9IDA7XHJcblxyXG4gICAgLy8gc2V0IGxldmVsIGZvciBMRVZFTCBmdW5jdGlvblxyXG4gICAgaWYgKHRhc2tFbmQgIT09IG51bGwgJiYgdGhpcy5fZXZ0LmdldFR5cGUoKSAhPT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9FWFBSRVNTSU9OICYmICh0aGlzLl9ldnQuZ2V0VHlwZSgpICE9PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1VTRVIgfHwgKHRoaXMuX2V2dC5nZXRVc2VyRXZlbnQoKS5nZXRUeXBlKCkgIT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfRVhQUkVTU0lPTiAmJiB0aGlzLl9ldnQuZ2V0VXNlckV2ZW50KCkuZ2V0VHlwZSgpICE9PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1RJTUVSKSkpIHtcclxuICAgICAgLy8gVW5saWtlIGEgaGFuZGxlciwgdGhlIHVzZXIgZnVuY3Rpb24gc2hvdWxkIG5vdCBjaGFuZ2UgdGhlIGxldmVsIG9mIHRoZSB0YXNrLlxyXG4gICAgICBpZiAodGhpcy5fZXZ0LmdldFR5cGUoKSAhPT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9VU0VSX0ZVTkMpXHJcbiAgICAgICAgdGhpcy5fdGFzay5zZXRCcmtMZXZlbChydEV2dC5nZXRCcmtMZXZlbCgpLCB0aGlzLl9pZCk7XHJcblxyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLl90YXNrLnNldEJya0xldmVsKHRoaXMuX2V2dC5nZXRCcmtMZXZlbCgpLCB0aGlzLl9pZCk7XHJcblxyXG4gICAgbGV0IGFyZ3M6IEFyZ3VtZW50c0xpc3QgPSBydEV2dC5nZXRBcmdMaXN0KCk7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IGZsb3dNb25pdG9yOiBGbG93TW9uaXRvclF1ZXVlID0gRmxvd01vbml0b3JRdWV1ZS5JbnN0YW5jZTtcclxuXHJcbiAgICAgIC8vIFJvdXRlIGV2ZW50IGNhbiBvbmx5IGJlIGhhbmRsZWQgaW4gYSB0YXNrIHdoaWNoIGlzIG9wZW5lZCBhcyByb3V0ZXIgbGluayBvciB0aGUgcm9vdCB0YXNrLlxyXG4gICAgICBpZiAocnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMICYmIHJ0RXZ0LmdldEludGVybmFsQ29kZSgpID09PSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfV0VCQ0xJRU5UX1JPVVRFKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl90YXNrLklzUm91dGUoKSAmJiB0aGlzLl90YXNrICE9PSBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuU3RhcnR1cE1nRGF0YS5nZXRGaXJzdFRhc2soKSkge1xyXG4gICAgICAgICAgcmV0dXJuIG5ldyBSZXRWYWxzKHRydWUsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gY2hlY2sgaWYgdGhlIGhhbmRsZXIgaXMgZW5hYmxlZC4gaWYgbm90LCByZXR1cm4gdHJ1ZSB0byBjb250aW51ZSBzZWFyY2hpbmdcclxuICAgICAgLy8gZm9yIHRoZSBuZXh0IGV2ZW50IGhhbmRsZXJcclxuICAgICAgbGV0IG5leHRPcGVySWR4OiBudW1iZXIgPSAtMTtcclxuICAgICAgaWYgKHJldHVybmVkRnJvbVNlcnZlcikge1xyXG4gICAgICAgIC8vIGlmIHdlIHJldHVybmVkIGZyb20gdGhlIHNlcnZlciAtIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIG5leHQgb3BlcmF0aW9uIGlzIG9uIHRoZSBjdXJyZW50XHJcbiAgICAgICAgLy8gaGFuZGxlciAodXNpbmcgYSBjYWxsIHRvIGdldE5leHRPcGVySWR4KCkgd2l0aCBmYWxzZSBpbiB0aGUgY2xlYXJXaGVuRm91bmQgcGFyYW1ldGVyKVxyXG4gICAgICAgIC8vIGFuZCBpZiBpdCBpcyAtIGRvIG5vdCBjaGVjayB0aGUgZW5hYmxlZCBjb25kaXRpb24sIGJlY2F1c2UgaXQgbWlnaHQgaGF2ZSBjaGFuZ2VkXHJcbiAgICAgICAgLy8gc2luY2UgaXQgd2FzIGV2YWx1YXRlZCBvbiB0aGUgc2VydmVyLiB3ZSBuZWVkIHRvIGdvIGludG8gdGhpcyBoYW5kbGVyIGV2ZW4gaWYgaXQgaXMgbm90XHJcbiAgICAgICAgLy8gY3VycmVudGx5IGVuYWJsZWRcclxuICAgICAgICBuZXh0T3BlcklkeCA9IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLmdldE5leHRPcGVySWR4KHRoaXMuX29wZXJhdGlvblRhYi5nZXRPcGVyYXRpb24oMCksIGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobmV4dE9wZXJJZHggPT09IC0xICYmICFlbmFibGVkQ25kQ2hlY2tlZEFuZFRydWUgJiYgIWF3YWl0IHRoaXMuaXNFbmFibGVkKCkpXHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZXRWYWxzKHRydWUsIGZhbHNlKTtcclxuXHJcbiAgICAgIC8vIGNoZWNrIHRoZSBzY29wZSBmb3IgRXhwcmVzc2lvbiBhbmQgVGltZXIgaGFuZGxlcnNcclxuICAgICAgaWYgKHRoaXMuX3Njb3BlID09PSBCcmtTY29wZS5UYXNrICYmIChydEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfVElNRVIgfHwgcnRFdnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0VYUFJFU1NJT04pKSB7XHJcbiAgICAgICAgbGV0IGN1cnJUYXNrOiBUYXNrID0gTGFzdEZvY3VzZWRNYW5hZ2VyLkluc3RhbmNlLmdldExhc3RGb2N1c2VkVGFzaygpO1xyXG4gICAgICAgIGlmICh0aGlzLl90YXNrICE9PSBjdXJyVGFzaylcclxuICAgICAgICAgIHJldHVybiBuZXcgUmV0VmFscyh0cnVlLCB0cnVlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCF0aGlzLl9oYW5kbGVkQnlDbGllbnQpIHtcclxuICAgICAgICAvLyByZXR1cm4gZmFsc2UgdG8gc3RvcCBzZWFyY2hpbmcgZm9yIHRoZSBtb3JlIGhhbmRsZXJzIGJlY2F1c2VcclxuICAgICAgICAvLyB0aGUgc2VydmVyIGhhZCB0YWtlbiBjYXJlIG9mIGFsbCBvZiB0aGVtXHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZXRWYWxzKGZhbHNlLCB0cnVlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHJ0RXZ0LmdldFR5cGUoKSAhPT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9VU0VSICYmICFhd2FpdCB0aGlzLl9ldnQuZGF0YUV2ZW50SXNUcnVlKCkpXHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZXRWYWxzKGZhbHNlLCB0cnVlKTtcclxuXHJcbiAgICAgIGlmIChydEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwgJiYgcnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkgPT09IEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1NVRkZJWClcclxuICAgICAgICB0YXNrRW5kID0gdHJ1ZTtcclxuXHJcbiAgICAgIGlmIChydEV2dC5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkVWRU5UX1RZUEVfSU5URVJOQUwpIHtcclxuICAgICAgICBzd2l0Y2ggKHJ0RXZ0LmdldEludGVybmFsQ29kZSgpKSB7XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd1JlYyhJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1BSRUZJWCwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1NUQVJULCAgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd1JlYyhJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1NUQVJULCAgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVg6XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93Q3RybChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVgsIHJ0RXZ0LkNvbnRyb2wuTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9TVEFSVCwgIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd0N0cmwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfUFJFRklYLCBydEV2dC5Db250cm9sLk5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfU1RBUlQsICB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9WQVJJQUJMRTpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dGbGQoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1ZBUklBQkxFLCBydEV2dC5nZXRGbGQoKS5nZXROYW1lKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9TVEFSVCwgIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfVkVSSUZJQ0FUSU9OOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd0N0cmwoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfVkVSSUZJQ0FUSU9OLFxyXG4gICAgICAgICAgICAgIHJ0RXZ0LkNvbnRyb2wuTmFtZSwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1NUQVJULCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1BSRUZJWDpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dSZWMoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfUFJFRklYLCBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfU1RBUlQsICB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1NVRkZJWDpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dSZWMoSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfU1VGRklYLCBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfU1RBUlQsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93SGFuZGxlcih0aGlzLl9ldnQuZ2V0QnJrTGV2ZWwodHJ1ZSksIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9TVEFSVCwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd0hhbmRsZXIodGhpcy5fZXZ0LmdldEJya0xldmVsKHRydWUpLCBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfU1RBUlQsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcblxyXG4gICAgICB0cnkge1xyXG5cclxuICAgICAgICBpZiAodGFza0VuZCAhPT0gbnVsbClcclxuICAgICAgICAgIGN0cmwgPSA8TWdDb250cm9sPnJ0RXZ0LkNvbnRyb2w7XHJcblxyXG4gICAgICAgIGxldCBtZ2RJRDogbnVtYmVyID0gQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmN1cnJNZ2RJRDtcclxuICAgICAgICBsZXQgaXNDaGFuZ2VkQ3VyclduZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBpc0NoYW5nZWRDdXJyV25kUmVmOiBSZWZQYXJhbTxib29sZWFuPiA9IG5ldyBSZWZQYXJhbShpc0NoYW5nZWRDdXJyV25kKTtcclxuXHJcblxyXG4gICAgICAgIC8vIGZvciB0aW1lciBldmVudHMgY2hlY2sgaWYgdGhlIHRhc2sgb2YgdGhlIGV2ZW50IGlzIGluIHRoZVxyXG4gICAgICAgIC8vIGN1cnJlbnQgd2luZG93IGFuZCBpZiBub3QgdGhlbiBjaGFuZ2UgdGhlIGN1cnJlbnQgd2luZG93XHJcbiAgICAgICAgLy8gdGVtcG9yYXJpbHkgdGlsbCB0aGUgaGFuZGxlciBmaW5pc2hlc1xyXG4gICAgICAgIGlmICh0aGlzLl9ldnQuZ2V0VHlwZSgpID09PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX1RJTUVSICYmIG1nZElEICE9PSBydEV2dC5nZXRNZ2RJRCgpKSB7XHJcbiAgICAgICAgICAvLyBzZXQgbnVtYmVyIG9mIHdpbmRvdyBmb3IgdGltZXIgZXZlbnRcclxuICAgICAgICAgIEFjY2Vzc0hlbHBlci5tZ0RhdGFUYWJsZS5jdXJyTWdkSUQgPSBydEV2dC5nZXRNZ2RJRCgpO1xyXG4gICAgICAgICAgaXNDaGFuZ2VkQ3VyclduZFJlZi52YWx1ZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBwdXQgaW5pdGlhbCB2YWx1ZXMgdG8gdGhlIGxvY2FsIHZhcmlhYmxlc1xyXG4gICAgICAgIGF3YWl0IHRoaXMucmVzZXRMb2NhbFZhcmlhYmxlcyhhcmdzKTtcclxuXHJcbiAgICAgICAgaW5pdGlhbExvb3BTdGFja1NpemUgPSB0aGlzLl90YXNrLmdldExvb3BTdGFja1NpemUoKTtcclxuICAgICAgICBsZXQgcmV0VmFsczogUmV0VmFscyA9IG51bGw7XHJcbiAgICAgICAgaWYgKHRoaXMuX29wZXJhdGlvblRhYi5nZXRTaXplKCkgPiAwKVxyXG4gICAgICAgICAgcmV0VmFscyA9IGF3YWl0IHRoaXMuZXhlY3V0ZU9wZXJhdGlvbnMoMCwgdGhpcy5fb3BlcmF0aW9uVGFiLmdldFNpemUoKSAtIDEsIHRhc2tFbmQsIG1nZElELCBkZXB0aCwgaXNDaGFuZ2VkQ3VyclduZFJlZiwgZmFsc2UsIGZhbHNlLCAtMSk7XHJcblxyXG4gICAgICAgIGlzQ2hhbmdlZEN1cnJXbmQgPSBpc0NoYW5nZWRDdXJyV25kUmVmLnZhbHVlO1xyXG5cclxuICAgICAgICBpZiAocmV0VmFscyAhPT0gbnVsbClcclxuICAgICAgICAgIHJldHVybiByZXRWYWxzO1xyXG5cclxuICAgICAgICAvLyBjaGVjayB0aGUgZW5kdGFzayBjb25kaXRpb24gb25jZSBhZ2FpbiBhdCB0aGUgZW5kIG9mIHRoZSBoYW5kbGVyXHJcbiAgICAgICAgaWYgKCF0YXNrRW5kKVxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5fdGFzay5ldmFsRW5kQ29uZChDb25zdEludGVyZmFjZS5FTkRfQ09ORF9FVkFMX0lNTUlESUFURSk7XHJcblxyXG4gICAgICAgIC8vIGNoYW5nZSBjdXJyZW50IHdpbmRvdyBiYWNrIGlmIGl0IHdhcyBjaGFuZ2VkIGZvciBUaW1lclxyXG4gICAgICAgIGlmIChpc0NoYW5nZWRDdXJyV25kKSB7XHJcbiAgICAgICAgICBsZXQgb2xkTWdkOiBNR0RhdGEgPSBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuZ2V0TUdEYXRhKG1nZElEKTtcclxuICAgICAgICAgIGlmIChvbGRNZ2QgIT09IG51bGwgJiYgIW9sZE1nZC5Jc0Fib3J0aW5nKVxyXG4gICAgICAgICAgICBBY2Nlc3NIZWxwZXIubWdEYXRhVGFibGUuY3Vyck1nZElEID0gbWdkSUQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIC8vIGVuZCB3aGlsZSBvcGVyYXRpb24gYmxvY2tcclxuICAgICAgY2F0Y2ggKGV4KSB7XHJcbiAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgU2VydmVyRXJyb3IpIHtcclxuICAgICAgICAgIGlmIChMb2dnZXIuSW5zdGFuY2UuTG9nTGV2ZWwgIT09IExvZ2dlcl9Mb2dMZXZlbHMuQmFzaWMpXHJcbiAgICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZUV4Y2VwdGlvblRvTG9nKGV4KTtcclxuICAgICAgICAgIHRocm93IGV4O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChleCBpbnN0YW5jZW9mIEV4Y2VwdGlvbikge1xyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2coZXgpO1xyXG4gICAgICAgICAgcmV0dXJuIG5ldyBSZXRWYWxzKGZhbHNlLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgdGhyb3cgZXg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZpbmFsbHkge1xyXG4gICAgICAgIC8vIGdldCB0aGUgcHJvcGFnYXRlIHZhbHVlXHJcbiAgICAgICAgcmV0VmFsID0gYXdhaXQgdGhpcy5fcHJvcGFnYXRlRXhwLmdldFZhbCgpO1xyXG5cclxuICAgICAgICAvLyByZW1vdmUgbG9vcCBjb3VudGVycyB0aGF0IHdlcmUgbGVmdCB1bnVzZWQgaW4gdGhlIHN0YWNrIGR1ZSB0byBsZWF2aW5nXHJcbiAgICAgICAgLy8gdGhlIGhhbmRsZXIgb24gXCJzdG9wRXhlY3V0aW9uKCkgPT0gdHJ1ZVwiXHJcbiAgICAgICAgbGV0IGN1cnJMb29wU3RhY2tTaXplOiBudW1iZXIgPSB0aGlzLl90YXNrLmdldExvb3BTdGFja1NpemUoKTtcclxuICAgICAgICBmb3IgKDsgY3Vyckxvb3BTdGFja1NpemUgPiBpbml0aWFsTG9vcFN0YWNrU2l6ZTsgY3Vyckxvb3BTdGFja1NpemUgPSBjdXJyTG9vcFN0YWNrU2l6ZS0tKVxyXG4gICAgICAgICAgdGhpcy5fdGFzay5wb3BMb29wQ291bnRlcigpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBhZnRlciBleGVjdXRpbmcgdGhlIG9wZXJhdGlvbnMgdXBkYXRlIHRoZSBhcmd1bWVudHMgYmFjayBhbmQgcmVjb21wdXRlXHJcbiAgICAgIGlmIChhcmdzICE9PSBudWxsKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuZ2V0QXJnVmFsc0Zyb21GbGRzKGFyZ3MpO1xyXG5cclxuICAgICAgaWYgKHJ0RXZ0LmdldFR5cGUoKSA9PT0gQ29uc3RJbnRlcmZhY2UuRVZFTlRfVFlQRV9JTlRFUk5BTCkge1xyXG4gICAgICAgIHN3aXRjaCAocnRFdnQuZ2V0SW50ZXJuYWxDb2RlKCkpIHtcclxuICAgICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVg6XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93UmVjKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfUFJFRklYLCBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfRU5ELCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9SRUNfU1VGRklYOlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd1JlYyhJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWCwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX0VORCwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19QUkVGSVg6XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93UmVjKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1BSRUZJWCwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX0VORCwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVEFTS19TVUZGSVg6XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93UmVjKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1NVRkZJWCwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX0VORCwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVg6XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93Q3RybChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9TVUZGSVgsIGN0cmwuTmFtZSwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX0VORCwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9QUkVGSVg6XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93Q3RybChJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfQ1RSTF9QUkVGSVgsIGN0cmwuTmFtZSwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX0VORCwgdGhpcy5fdGFzay5HZXRUYXNrRGV0YWlscygpKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfVkFSSUFCTEU6XHJcbiAgICAgICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93RmxkKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9WQVJJQUJMRSwgcnRFdnQuZ2V0RmxkKCkuZ2V0TmFtZSgpLCBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfRU5ELCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1ZFUklGSUNBVElPTjpcclxuICAgICAgICAgICAgZmxvd01vbml0b3IuYWRkVGFza0Zsb3dDdHJsKEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1ZFUklGSUNBVElPTiwgY3RybC5OYW1lLCBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfRU5ELCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBmbG93TW9uaXRvci5hZGRUYXNrRmxvd0hhbmRsZXIodGhpcy5fZXZ0LmdldEJya0xldmVsKHRydWUpLCBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfRU5ELCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIGZsb3dNb25pdG9yLmFkZFRhc2tGbG93SGFuZGxlcih0aGlzLl9ldnQuZ2V0QnJrTGV2ZWwodHJ1ZSksIDEsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgLy8gcmVzdG9yaW5nICB0aGUgb3JpZ2luYWwgYnJlYWsgbGV2ZWwgc3RhdGUgYW5kIGN1cnJlbnQgZXhlY3V0aW5nIGNvbnRyb2wgaW5kZXhcclxuICAgICAgdGhpcy5fdGFzay5zZXRCcmtMZXZlbChicmtMZXZlbCwgYnJrTGV2ZWxJbmRleCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFJldFZhbHMocmV0VmFsLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBleGVjdXRlIHRoZSBvcGVyYXRpb25zIHN0YXJ0aW5nIGZyb20gZnJvbUlkeCBhbmQgZW5kaW5nIGF0IGVuZElkeC5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZU9wZXJhdGlvbnMoZnJvbUlkeDogbnVtYmVyLCB0b0lkeDogbnVtYmVyLCB0YXNrRW5kOiBib29sZWFuLCBtZ2RJRDogbnVtYmVyLCBkZXB0aDogbnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDaGFuZ2VkQ3VyclduZFJlZjogUmVmUGFyYW08Ym9vbGVhbj4sIGluQmxvY2tJZjogYm9vbGVhbiwgaW5SZXR1cm5lZEZyb21TZXJ2ZXI6IGJvb2xlYW4sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk5leHRPcGVySWR4OiBudW1iZXIpOiBQcm9taXNlIDxSZXRWYWxzPiB7XHJcbiAgICBsZXQgb3BlcjogT3BlcmF0aW9uO1xyXG4gICAgbGV0IG9wZXJUeXBlOiBudW1iZXI7XHJcbiAgICBsZXQgbmV4dE9wZXJJZHg6IG51bWJlciA9IC0xO1xyXG4gICAgbGV0IHJldHVybmVkRnJvbVNlcnZlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IG1nZDogTUdEYXRhID0gdGhpcy5fdGFzay5nZXRNR0RhdGEoKTtcclxuICAgIGxldCBleGVjRmxvd0lkeDogbnVtYmVyID0gZnJvbUlkeDtcclxuICAgIGxldCByZXR2YWxzOiBSZXRWYWxzO1xyXG4gICAgbGV0IGJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBleGVjdXRlQmxvY2s6IGJvb2xlYW47XHJcbiAgICBsZXQgYmxvY2tMb29wRXhlY29uU2VydmVyOiBib29sZWFuO1xyXG4gICAgbGV0IGZsb3dNb25pdG9yOiBGbG93TW9uaXRvclF1ZXVlID0gRmxvd01vbml0b3JRdWV1ZS5JbnN0YW5jZTtcclxuICAgIGxldCByb3V0ZU9wZXJhdGlvbkV4ZWN1dGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKCFpblJldHVybmVkRnJvbVNlcnZlcikge1xyXG4gICAgICAvLyB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBzZXJ2ZXIgYWxyZWFkeSBzdGFydGVkIHJ1bm5pbmcgdGhpcyBoYW5kbGVyXHJcbiAgICAgIG9wZXIgPSB0aGlzLl9vcGVyYXRpb25UYWIuZ2V0T3BlcmF0aW9uKGV4ZWNGbG93SWR4KTtcclxuICAgICAgbmV4dE9wZXJJZHggPSBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5nZXROZXh0T3BlcklkeChvcGVyLCB0cnVlKTtcclxuICAgICAgaWYgKG5leHRPcGVySWR4ID4gLTEpIHtcclxuICAgICAgICByZXR1cm5lZEZyb21TZXJ2ZXIgPSB0cnVlO1xyXG4gICAgICAgIGlmIChpbkJsb2NrSWYpXHJcbiAgICAgICAgICBibG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHJldHVybmVkRnJvbVNlcnZlciA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJldHVybmVkRnJvbVNlcnZlciA9IGluUmV0dXJuZWRGcm9tU2VydmVyO1xyXG4gICAgICBuZXh0T3BlcklkeCA9IGluTmV4dE9wZXJJZHg7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yICg7IGV4ZWNGbG93SWR4IDw9IHRvSWR4ICYmXHJcbiAgICAgICAgICAgKCFBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5HZXRTdG9wRXhlY3V0aW9uRmxhZygpKSAmJlxyXG4gICAgICAgICAgICFtZ2QuSXNBYm9ydGluZyAmJiAhcm91dGVPcGVyYXRpb25FeGVjdXRlZDtcclxuICAgICAgICAgICBleGVjRmxvd0lkeCArPSAxKSB7XHJcbiAgICAgIGlmIChpbkJsb2NrSWYgJiYgYmxvY2tJZlJldHVybmVkRnJvbVNlcnZlciAmJiB0aGlzLl9vcGVyYXRpb25UYWIuZ2V0T3BlcmF0aW9uKHRvSWR4KS5nZXRTZXJ2ZXJJZCgpIDwgbmV4dE9wZXJJZHgpXHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBvcGVyID0gdGhpcy5fb3BlcmF0aW9uVGFiLmdldE9wZXJhdGlvbihleGVjRmxvd0lkeCk7XHJcblxyXG4gICAgICBvcGVyVHlwZSA9IG9wZXIuZ2V0VHlwZSgpO1xyXG5cclxuICAgICAgYmxvY2tJZlJldHVybmVkRnJvbVNlcnZlciA9IGZhbHNlO1xyXG5cclxuICAgICAgLy8gSWYgRGVsYXlDb21tYW5kRXhlY3V0aW9uID0gdHJ1ZSwgaXQgbWVhbnMgd2UgYXJlIGhlcmUgVFMgb2YgY2xvc2luZyB0YXNrLlxyXG4gICAgICAvLyBTbywgc2V0IGZpcnN0IG9wZXJhdGlvbiBvZiBoYW5kbGVyIGFzIHNlcnZlci4gcmV0dXJuIGJhY2suXHJcbiAgICAgIGlmIChSZW1vdGVDb21tYW5kc1Byb2Nlc3Nvci5HZXRJbnN0YW5jZSgpLkRlbGF5Q29tbWFuZEV4ZWN1dGlvbikge1xyXG4gICAgICAgIHRoaXMuX3Rhc2suc2V0VXNlTG9vcFN0YWNrKGRlcHRoID4gMCk7XHJcbiAgICAgICAgYXdhaXQgb3Blci5vcGVyU2VydmVyKG51bGwpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBza2lwIHRvIHRoZSBjb3JyZWN0IG9wZXJhdGlvbiBhZnRlciByZXR1cm5pbmcgZnJvbSB0aGUgc2VydmVyXHJcbiAgICAgIGlmIChyZXR1cm5lZEZyb21TZXJ2ZXIgJiYgb3Blci5nZXRTZXJ2ZXJJZCgpIDwgbmV4dE9wZXJJZHgpXHJcbiAgICAgICAgaWYgKG9wZXJUeXBlICE9PSBDb25zdEludGVyZmFjZS5NR19PUEVSX0JMT0NLKVxyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5fb3BlcmF0aW9uVGFiLmdldE9wZXJhdGlvbihvcGVyLmdldEJsb2NrRW5kKCkpLmdldFNlcnZlcklkKCkgPCBuZXh0T3BlcklkeClcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgaWYgKCF0YXNrRW5kKVxyXG4gICAgICAgIGF3YWl0IHRoaXMuX3Rhc2suZXZhbEVuZENvbmQoQ29uc3RJbnRlcmZhY2UuRU5EX0NPTkRfRVZBTF9JTU1JRElBVEUpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX3Rhc2tNZ2RJRCAhPT0gbWdkSUQpXHJcbiAgICAgICAgaXNDaGFuZ2VkQ3VyclduZFJlZi52YWx1ZSA9IHRydWU7XHJcblxyXG4gICAgICBpZiAoIXRoaXMuX3Rhc2suaXNNYWluUHJvZygpICYmIHRoaXMuX3Rhc2suaXNPcGVuV2luKCkpXHJcbiAgICAgICAgQWNjZXNzSGVscGVyLm1nRGF0YVRhYmxlLmN1cnJNZ2RJRCA9IHRoaXMuX3Rhc2tNZ2RJRDtcclxuXHJcbiAgICAgIGF3YWl0IEFjY2Vzc0hlbHBlci5ldmVudHNNYW5hZ2VyLkNoZWNrQW5kU2hvd1NwaW5uZXIodHJ1ZSk7XHJcblxyXG4gICAgICBzd2l0Y2ggKG9wZXJUeXBlKSB7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19PUEVSX1ZFUklGWTpcclxuICAgICAgICAgIC8vIGlmIHRydWUgcmV0dXJuZWQgdGhlbiB0aGUgdmVyaWZ5IGNvbmRpdGlvbiB3YXMgdHJ1ZSBhbmQgdGhlIG1vZGUgaXMgRXJyb3JcclxuICAgICAgICAgIGlmIChhd2FpdCBvcGVyLmV4ZWN1dGUocmV0dXJuZWRGcm9tU2VydmVyKSkge1xyXG4gICAgICAgICAgICBpZiAoISh0aGlzLl90YXNrLmdldEJya0xldmVsKCkgPT09IFwiVFNcIikpIHtcclxuICAgICAgICAgICAgICBBY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5zZXRTdG9wRXhlY3V0aW9uKHRydWUpO1xyXG5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3Rhc2suZ2V0SW5SZWNvcmRTdWZmaXgoKSAmJiB0aGlzLl90YXNrLmdldExldmVsKCkgPT09IENvbnN0YW50cy5UQVNLX0xFVkVMX1RBU0spXHJcbiAgICAgICAgICAgICAgdGhpcy5fdGFzay5zZXRMZXZlbChDb25zdGFudHMuVEFTS19MRVZFTF9SRUNPUkQpO1xyXG4gICAgICAgICAgICAvLyBRQ1IgIzk5NTEwOCAtIHZlcmlmeSBlcnJvciBpbiBSUyBzaG91bGRuJ3QgdHJpZ2dlciBSUFxyXG4gICAgICAgICAgICAvKlxyXG4gICAgICAgICAgICAgKiBpZiB3ZSBhcmUgaW4gdGhlIHJldmVydCBtb2RlLCBkb250IHN0b3AgaW1tZWRpYXRlbHkuXHJcbiAgICAgICAgICAgICAqIGV4ZWN1dGUgdGhlIG9wZXJhdGlvbnMgb2YgdGhlIGhhbmRsZXIgaW4gdGhlIHJldmVyc2Ugb3JkZXIgYW5kIHRoZW4gc3RvcC5cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmV0VmFscyhmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19PUEVSX0xPT1A6XHJcbiAgICAgICAgICAvLyBvbiBnZXR0aW5nIGEgQmxvY2tMb29wLCBleGVjdXRlIHRoZSBsb29wIGZvciB0aGUgbnVtYmVyIG9mIHRpbWVzIGludGVuZGVkLFxyXG4gICAgICAgICAgLy8gYW5kIHRoZW4gbW92ZSB0byBCbG9ja0VuZC5cclxuICAgICAgICAgIHRoaXMuX3Rhc2suZW50ZXJMb29wKCk7XHJcbiAgICAgICAgICB0aGlzLl90YXNrLmluY3JlYXNlTG9vcENvdW50ZXIoKTtcclxuICAgICAgICAgIHRoaXMuX3Rhc2suc2V0VXNlTG9vcFN0YWNrKHRydWUpO1xyXG5cclxuICAgICAgICAgIGF3YWl0IGZsb3dNb25pdG9yLmFkZEZsb3dGaWVsZE9wZXJhdGlvbihvcGVyLCB0cnVlLCB0aGlzLl90YXNrLkdldFRhc2tEZXRhaWxzKCkpO1xyXG5cclxuICAgICAgICAgIGJsb2NrTG9vcEV4ZWNvblNlcnZlciA9IGZhbHNlO1xyXG4gICAgICAgICAgaWYgKCFvcGVyLmdldEV4ZWNPblNlcnZlcigpKSB7XHJcbiAgICAgICAgICAgIC8vIGV4ZWN1dGUgdGhlIGxvb3AgZm9yIHRoZSBudW1iZXIgb2YgdGltZXMgaW50ZW5kZWRcclxuICAgICAgICAgICAgd2hpbGUgKGF3YWl0IG9wZXIuZXhlY3V0ZShmYWxzZSkpIHtcclxuICAgICAgICAgICAgICAvLyBjYWxsIGV4ZWN1dGVPcGVyYXRpb25zKCkgdG8gZXhlY3V0ZSB0aGUgb3BlcmF0aW9ucyB3aXRoaW4gYSBCbG9ja0xvb3BcclxuICAgICAgICAgICAgICByZXR2YWxzID0gYXdhaXQgdGhpcy5leGVjdXRlT3BlcmF0aW9ucyhleGVjRmxvd0lkeCArIDEsIG9wZXIuZ2V0QmxvY2tDbG9zZSgpIC0gMSwgdGFza0VuZCwgbWdkSUQsIGRlcHRoICsgMSxcclxuICAgICAgICAgICAgICAgIGlzQ2hhbmdlZEN1cnJXbmRSZWYsIGZhbHNlLCBmYWxzZSwgLTEpO1xyXG4gICAgICAgICAgICAgIGlmIChyZXR2YWxzICE9PSBudWxsKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbHM7XHJcblxyXG4gICAgICAgICAgICAgIC8vIGlmIHdlIGdldCBhIHJldmVydCBpbnNpZGUgYSBsb29wLCBicmVhayB0aGUgbG9vcFxyXG4gICAgICAgICAgICAgIGlmICgobWdkLklzQWJvcnRpbmcgfHwgQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuR2V0U3RvcEV4ZWN1dGlvbkZsYWcoKSkpXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgdGhpcy5fdGFzay5pbmNyZWFzZUxvb3BDb3VudGVyKCk7XHJcbiAgICAgICAgICAgICAgdGhpcy5fdGFzay5zZXRVc2VMb29wU3RhY2sodHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoYXdhaXQgb3Blci5leGVjdXRlKGZhbHNlKSlcclxuICAgICAgICAgICAgICBibG9ja0xvb3BFeGVjb25TZXJ2ZXIgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKCFibG9ja0xvb3BFeGVjb25TZXJ2ZXIpXHJcbiAgICAgICAgICAvKlxyXG4gICAgICAgICAgICogT25jZSB3ZSBmaW5pc2ggZXhlY3V0aW5nIHRoZSBsb29wLFxyXG4gICAgICAgICAgICogaWYgd2UgYXJlIG1vdmluZyBpbiB0aGUgZm9yd2FyZCBkaXJlY3Rpb24sIG1vdmUgdG8gQmxvY2tFbmQuXHJcbiAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgZXhlY0Zsb3dJZHggPSBvcGVyLmdldEJsb2NrRW5kKCkgLSAxO1xyXG4gICAgICAgICAgdGhpcy5fdGFzay5sZWF2ZUxvb3AoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX09QRVJfQkxPQ0s6XHJcbiAgICAgICAgICAvLyBvbiBnZXR0aW5nIGEgQmxvY2sgSUYsIGV4ZWN1dGUgdGhlIGV4ZWN1dGFibGUgYmxvY2sgKGlmIG9yIGVsc2UpXHJcbiAgICAgICAgICAvLyBhbmQgdGhlbiBtb3ZlIHRvIEJsb2NrRW5kLlxyXG4gICAgICAgICAgbGV0IHN0YXJ0QmxvY2tJZHg6IG51bWJlciA9IGV4ZWNGbG93SWR4O1xyXG4gICAgICAgICAgaWYgKCFvcGVyLmdldEV4ZWNPblNlcnZlcigpIHx8IChyZXR1cm5lZEZyb21TZXJ2ZXIgJiYgb3Blci5nZXRTZXJ2ZXJJZCgpIDwgbmV4dE9wZXJJZHgpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Rhc2suc2V0VXNlTG9vcFN0YWNrKHRydWUpO1xyXG4gICAgICAgICAgICBpZiAoIXJldHVybmVkRnJvbVNlcnZlciB8fCBvcGVyLmdldFNlcnZlcklkKCkgPj0gbmV4dE9wZXJJZHgpXHJcbiAgICAgICAgICAgIC8vIGdldCB0aGUgZXhlY3V0YWJsZSBibG9jayBiZXR3ZWVuIEJsb2NrIElGIGFuZCBCbG9jayBFTkRcclxuICAgICAgICAgICAgICBleGVjRmxvd0lkeCA9IGF3YWl0IHRoaXMuZ2V0U2lnbmlmaWNhbnRCbG9jayhleGVjRmxvd0lkeCwgb3Blci5nZXRCbG9ja0VuZCgpKTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgIGV4ZWNGbG93SWR4ID0gdGhpcy5nZXRTdGFydEJsb2NrSWZJZHhCeU9wZXIoZXhlY0Zsb3dJZHgsIG5leHRPcGVySWR4KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl90YXNrLnNldFVzZUxvb3BTdGFjayhkZXB0aCA+IDApO1xyXG4gICAgICAgICAgICBhd2FpdCBvcGVyLm9wZXJTZXJ2ZXIobnVsbCk7XHJcbiAgICAgICAgICAgIG5leHRPcGVySWR4ID0gQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuZ2V0TmV4dE9wZXJJZHgob3BlciwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGlmIChuZXh0T3BlcklkeCA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuZWRGcm9tU2VydmVyID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBpZiAoaW5CbG9ja0lmKVxyXG4gICAgICAgICAgICAgICAgYmxvY2tJZlJldHVybmVkRnJvbVNlcnZlciA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChuZXh0T3BlcklkeCA8IHRoaXMuX29wZXJhdGlvblRhYi5nZXRPcGVyYXRpb24ob3Blci5nZXRCbG9ja0VuZCgpKS5nZXRTZXJ2ZXJJZCgpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBzaWduaWZpY2FudCBibG9jayBpbiB3aGljaCB0aGUgbmV4dCBvcGVyYXRpb24gaXNcclxuICAgICAgICAgICAgICAgIHdoaWxlICh0aGlzLl9vcGVyYXRpb25UYWIuZ2V0T3BlcmF0aW9uKG9wZXIuZ2V0QmxvY2tDbG9zZSgpKS5nZXRTZXJ2ZXJJZCgpIDwgbmV4dE9wZXJJZHgpIHtcclxuICAgICAgICAgICAgICAgICAgZXhlY0Zsb3dJZHggPSBvcGVyLmdldEJsb2NrQ2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgb3BlciA9IHRoaXMuX29wZXJhdGlvblRhYi5nZXRPcGVyYXRpb24oZXhlY0Zsb3dJZHgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICByZXR1cm5lZEZyb21TZXJ2ZXIgPSBmYWxzZTtcclxuICAgICAgICAgICAgICBleGVjRmxvd0lkeCA9IC0xO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoZXhlY0Zsb3dJZHggIT09IC0xKSB7XHJcbiAgICAgICAgICAgIGV4ZWN1dGVCbG9jayA9IHRydWU7XHJcbiAgICAgICAgICAgIG9wZXIgPSB0aGlzLl9vcGVyYXRpb25UYWIuZ2V0T3BlcmF0aW9uKGV4ZWNGbG93SWR4KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChyZXR1cm5lZEZyb21TZXJ2ZXIpIHtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5fb3BlcmF0aW9uVGFiLmdldE9wZXJhdGlvbihvcGVyLmdldEJsb2NrQ2xvc2UoKSkuZ2V0U2VydmVySWQoKSA8PSBuZXh0T3BlcklkeCkge1xyXG4gICAgICAgICAgICAgICAgZXhlY3V0ZUJsb2NrID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBibG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChleGVjdXRlQmxvY2spIHtcclxuICAgICAgICAgICAgICAvLyBjYWxsIGV4ZWN1dGVPcGVyYXRpb25zKCkgdG8gZXhlY3V0ZSB0aGUgb3BlcmF0aW9ucyBpbiB0aGUgZXhlY3V0YWJsZSBibG9ja1xyXG4gICAgICAgICAgICAgIHJldHZhbHMgPSBhd2FpdCB0aGlzLmV4ZWN1dGVPcGVyYXRpb25zKGV4ZWNGbG93SWR4ICsgMSwgb3Blci5nZXRCbG9ja0Nsb3NlKCkgLSAxLCB0YXNrRW5kLCBtZ2RJRCwgZGVwdGggKyAxLFxyXG4gICAgICAgICAgICAgICAgaXNDaGFuZ2VkQ3VyclduZFJlZiwgdHJ1ZSwgcmV0dXJuZWRGcm9tU2VydmVyLCBuZXh0T3BlcklkeCk7XHJcbiAgICAgICAgICAgICAgaWYgKHJldHZhbHMgIT09IG51bGwpXHJcbiAgICAgICAgICAgICAgICBpZiAoIXJldHZhbHMuUmV0dXJuZWRGcm9tU2VydmVyKVxyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFscztcclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm5lZEZyb21TZXJ2ZXIgPSByZXR2YWxzLlJldHVybmVkRnJvbVNlcnZlcjtcclxuICAgICAgICAgICAgICAgICAgbmV4dE9wZXJJZHggPSByZXR2YWxzLk5leHRPcGVySWR4O1xyXG4gICAgICAgICAgICAgICAgICBibG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyID0gcmV0dmFscy5CbG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyO1xyXG4gICAgICAgICAgICAgICAgICBleGVjRmxvd0lkeCA9IG9wZXIuZ2V0QmxvY2tFbmQoKSAtIDE7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLypcclxuICAgICAgICAgICAqIE9uY2Ugd2UgZmluaXNoIGV4ZWN1dGluZyB0aGUgYmxvY2ssXHJcbiAgICAgICAgICAgKiBpZiB3ZSBhcmUgbW92aW5nIGluIHRoZSBmb3J3YXJkIGRpcmVjdGlvbiwgbW92ZSB0byBCbG9ja0VuZC5cclxuICAgICAgICAgICAqIG90aGVyd2lzZSwgbW92ZSB0byBCbG9jayBJRlxyXG4gICAgICAgICAgICovXHJcbiAgICAgICAgICBleGVjRmxvd0lkeCA9IG9wZXIuZ2V0QmxvY2tFbmQoKSAtIDE7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19PUEVSX0VOREJMT0NLOlxyXG4gICAgICAgICAgYXdhaXQgZmxvd01vbml0b3IuYWRkRmxvd0ZpZWxkT3BlcmF0aW9uKG9wZXIsIHRydWUsIHRoaXMuX3Rhc2suR2V0VGFza0RldGFpbHMoKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19PUEVSX0NBTEw6XHJcbiAgICAgICAgICB0aGlzLl90YXNrLnNldFVzZUxvb3BTdGFjayhkZXB0aCA+IDApO1xyXG4gICAgICAgICAgLy8gaWYgZmFsc2UgaXMgcmV0dXJuZWQsIGl0IG1lYW5zIHRoYXQgYSByb3V0ZSBvcGVyYXRpb24gd2FzIGV4ZWN1dGVkLlxyXG4gICAgICAgICAgcm91dGVPcGVyYXRpb25FeGVjdXRlZCA9IGF3YWl0IG9wZXIuZXhlY3V0ZShyZXR1cm5lZEZyb21TZXJ2ZXIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAvLyB0aGUgcmVzdCBvZiB0aGUgb3BlcmF0aW9ucyAodGhvc2UgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBmbG93KVxyXG4gICAgICAgICAgdGhpcy5fdGFzay5zZXRVc2VMb29wU3RhY2soZGVwdGggPiAwKTtcclxuICAgICAgICAgIGF3YWl0IG9wZXIuZXhlY3V0ZShyZXR1cm5lZEZyb21TZXJ2ZXIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGlmIHRoZSBzZXJ2ZXIgaGF2ZSBleGVjdXRlZCBhIGJsb2NrIG9mIG9wZXJhdGlvbnMgdGhlbiBnZXQgdGhlIG5leHRcclxuICAgICAgLy8gb3BlcmF0aW9uIGluZGV4XHJcbiAgICAgIGlmICghYmxvY2tJZlJldHVybmVkRnJvbVNlcnZlcikge1xyXG4gICAgICAgIG5leHRPcGVySWR4ID0gQWNjZXNzSGVscGVyLmV2ZW50c01hbmFnZXIuZ2V0TmV4dE9wZXJJZHgob3BlciwgdHJ1ZSk7XHJcbiAgICAgICAgaWYgKG5leHRPcGVySWR4ID4gLTEpIHtcclxuICAgICAgICAgIHJldHVybmVkRnJvbVNlcnZlciA9IHRydWU7XHJcbiAgICAgICAgICBpZiAoaW5CbG9ja0lmKVxyXG4gICAgICAgICAgICBibG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSByZXR1cm5lZEZyb21TZXJ2ZXIgPSBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBpZiAocm91dGVPcGVyYXRpb25FeGVjdXRlZClcclxuICAgICAgcmV0dmFscyA9IG5ldyBSZXRWYWxzKGZhbHNlLCB0cnVlKTtcclxuICAgIGVsc2UgaWYgKGJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXIpXHJcbiAgICAgIHJldHZhbHMgPSBuZXcgUmV0VmFscyhuZXh0T3BlcklkeCwgcmV0dXJuZWRGcm9tU2VydmVyLCBibG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyKTtcclxuICAgIGVsc2VcclxuICAgICAgcmV0dmFscyA9IG51bGw7XHJcbiAgICByZXR1cm4gcmV0dmFscztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGV4ZWN1dGFibGUgQmxvY2sgKElGIG9yIEVMU0UpXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN0YXJ0QmxvY2tJZHhcIj50aGUgaW5kZXggb2YgdGhlIEJsb2NrIElGPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImVuZElkeFwiPnRoZSBCbG9jayBFbmQgSW5kZXggb2YgdGhlIEJsb2NrIElGPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+VGhlIGluZGV4IG9mIHRoZSBibG9jayAoSUYgb3IgRUxTRSBvciBuZXh0IEVMU0UgLi4uKXRoYXQgY2FuIGJlIGV4ZWN1dGVkLlxyXG4gIC8vLyAgIElmIG5vIGJsb2NrcyBjYW4gYmUgZXhlY3V0ZWQsIHJldHVybiAtMVxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRTaWduaWZpY2FudEJsb2NrKHN0YXJ0QmxvY2tJZHg6IG51bWJlciwgZW5kSWR4OiBudW1iZXIpOiBQcm9taXNlPG51bWJlcj4ge1xyXG4gICAgbGV0IHJldElkeDogbnVtYmVyID0gLTE7XHJcblxyXG4gICAgd2hpbGUgKHN0YXJ0QmxvY2tJZHggPCBlbmRJZHgpIHtcclxuICAgICAgbGV0IG9wZXI6IE9wZXJhdGlvbiA9IHRoaXMuX29wZXJhdGlvblRhYi5nZXRPcGVyYXRpb24oc3RhcnRCbG9ja0lkeCk7XHJcbiAgICAgIGxldCBvcGVyVHlwZTogbnVtYmVyID0gb3Blci5nZXRUeXBlKCk7XHJcblxyXG4gICAgICBpZiAob3BlclR5cGUgIT09IENvbnN0SW50ZXJmYWNlLk1HX09QRVJfQkxPQ0sgJiYgb3BlclR5cGUgIT09IENvbnN0SW50ZXJmYWNlLk1HX09QRVJfRUxTRSAmJiBvcGVyVHlwZSAhPT0gQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9TRVJWRVIpXHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBpZiAoYXdhaXQgb3Blci5leGVjdXRlKGZhbHNlKSkge1xyXG4gICAgICAgIHJldElkeCA9IHN0YXJ0QmxvY2tJZHg7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHN0YXJ0QmxvY2tJZHggPSBvcGVyLmdldEJsb2NrQ2xvc2UoKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXRJZHg7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBpZHggb2YgdGhlIEJsb2NrIElGXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImVuZElkeFwiPi0tLSB0aGUgaW5kZXggb2YgdGhlIEJsb2NrIEVuZFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gLS0tIFRoZSBpbmRleCBvZiB0aGUgYmxvY2sgSUYgd2hvc2UgQmxvY2tFbmQgSWR4IG1hdGNoZXMgd2l0aCB0aGUgZW5kSWR4XHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBwcml2YXRlIGdldFN0YXJ0QmxvY2tJZHhCeUVuZChlbmRJZHg6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgcmV0SWR4OiBudW1iZXIgPSAtMTtcclxuICAgIGxldCBmb3VuZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgbGV0IGo6IG51bWJlcjtcclxuICAgIGZvciAoaiA9IGVuZElkeCAtIDE7IGogPj0gMCAmJiAhZm91bmQ7IGotLSkge1xyXG4gICAgICBsZXQgb3BlcjogT3BlcmF0aW9uID0gdGhpcy5fb3BlcmF0aW9uVGFiLmdldE9wZXJhdGlvbihqKTtcclxuICAgICAgbGV0IG9wZXJUeXBlOiBudW1iZXIgPSBvcGVyLmdldFR5cGUoKTtcclxuXHJcbiAgICAgIGlmIChvcGVyVHlwZSA9PT0gQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9CTE9DSyB8fCBvcGVyVHlwZSA9PT0gQ29uc3RJbnRlcmZhY2UuTUdfT1BFUl9MT09QKSB7XHJcbiAgICAgICAgaWYgKG9wZXIuZ2V0QmxvY2tFbmQoKSA9PT0gZW5kSWR4KSB7XHJcbiAgICAgICAgICByZXRJZHggPSBqO1xyXG4gICAgICAgICAgZm91bmQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldElkeDtcclxuICB9XHJcblxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBpZHggb2YgdGhlIEJsb2NrIElGXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImVsc2VJZHhcIj4tLS0gdGhlIGluZGV4IG9mIHRoZSBCbG9jayBFbHNlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiAtLS0gVGhlIGluZGV4IG9mIHRoZSBibG9jayBJRiB3aG9zZSBCbG9ja0VuZCBJZHggbWF0Y2hlcyB3aXRoIHRoZSBlbmRJZHhcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0U3RhcnRCbG9ja0lkeEJ5RWxzZShlbHNlSWR4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgbGV0IHJldElkeDogbnVtYmVyID0gLTE7XHJcbiAgICBsZXQgZm91bmQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBlbHNlQmxvY2tFbmQ6IG51bWJlciA9IHRoaXMuX29wZXJhdGlvblRhYi5nZXRPcGVyYXRpb24oZWxzZUlkeCkuZ2V0QmxvY2tFbmQoKTtcclxuICAgIGxldCBqOiBudW1iZXI7XHJcbiAgICBmb3IgKGogPSBlbHNlSWR4IC0gMTsgaiA+PSAwICYmICFmb3VuZDsgai0tKSB7XHJcbiAgICAgIGxldCBvcGVyOiBPcGVyYXRpb24gPSB0aGlzLl9vcGVyYXRpb25UYWIuZ2V0T3BlcmF0aW9uKGopO1xyXG4gICAgICBsZXQgb3BlclR5cGU6IG51bWJlciA9IG9wZXIuZ2V0VHlwZSgpO1xyXG5cclxuICAgICAgaWYgKG9wZXJUeXBlID09PSBDb25zdEludGVyZmFjZS5NR19PUEVSX0JMT0NLKSB7XHJcbiAgICAgICAgaWYgKG9wZXIuZ2V0QmxvY2tFbmQoKSA9PT0gZWxzZUJsb2NrRW5kKSB7XHJcbiAgICAgICAgICByZXRJZHggPSBqO1xyXG4gICAgICAgICAgZm91bmQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJldElkeDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGluZGV4IG9mIHRoZSBCbG9jayBJRiBvciBFbHNlIGFjY29yZGluZyB0byB0aGUgaW5kZXggb2Ygb25lIG9mIHRoZSBvZiBvcGVyYXRpb25zIGluIGl0XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImJsb2NrT3BlcklkeFwiPi0tLSBpbmRleCBvZiB0aGUgaWYgYmxvY2sgZm9yIHdoaWNoIHdlIGhhdmUgdG8gZmluZCB0aGUgYXBwcm9wcmlhdGUgYmxvY2sgdG8gZXhlY3V0ZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3J2ck9wZXJJZHhcIj4tLS0gdGhlIHNlcnZlciBpZCBvZiB0aGUgbmV4dCBvcGVyYXRpb24gd2hpY2ggdGhlIGNsaWVudCBzaG91bGQgZXhlY3V0ZVxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gLS0tIFRoZSBpbmRleCBvZiB0aGUgYmxvY2sgSUYgb3IgRWxzZSB3aGljaCBob2xkIHRoZSBvcGVyYXRpb24gd2hpY2ggb3BlcklkeCBpcyBpdHMgaW5kZXhcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgZ2V0U3RhcnRCbG9ja0lmSWR4QnlPcGVyKGJsb2NrT3BlcklkeDogbnVtYmVyLCBzcnZyT3BlcklkeDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGxldCByZXRJZHg6IG51bWJlciA9IC0xO1xyXG4gICAgbGV0IGZvdW5kOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBsZXQgajogbnVtYmVyID0gdGhpcy5fb3BlcmF0aW9uVGFiLnNlcnZlcklkMm9wZXJJZHgoc3J2ck9wZXJJZHgsIGJsb2NrT3BlcklkeCkgLSAxO1xyXG5cclxuICAgIGlmIChqID09PSAtMikge1xyXG4gICAgICBqID0gdGhpcy5fb3BlcmF0aW9uVGFiLnNlcnZlcklkMkZvbGxvd2luZ09wZXJJZHgoc3J2ck9wZXJJZHgsIGJsb2NrT3BlcklkeCkgLSAxO1xyXG4gICAgfVxyXG5cclxuICAgIHdoaWxlIChqID49IDAgJiYgIWZvdW5kKSB7XHJcbiAgICAgIGxldCBvcGVyOiBPcGVyYXRpb24gPSB0aGlzLl9vcGVyYXRpb25UYWIuZ2V0T3BlcmF0aW9uKGopO1xyXG4gICAgICBsZXQgb3BlclR5cGU6IG51bWJlciA9IG9wZXIuZ2V0VHlwZSgpO1xyXG4gICAgICBpZiAob3BlclR5cGUgPT09IENvbnN0SW50ZXJmYWNlLk1HX09QRVJfQkxPQ0spIHtcclxuICAgICAgICBpZiAoaiA9PT0gYmxvY2tPcGVySWR4KSB7XHJcbiAgICAgICAgICByZXRJZHggPSBqO1xyXG4gICAgICAgICAgZm91bmQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBqLS07XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAob3BlclR5cGUgPT09IENvbnN0SW50ZXJmYWNlLk1HX09QRVJfRUxTRSkge1xyXG4gICAgICAgIGxldCBibG9ja1N0cnQ6IG51bWJlciA9IHRoaXMuZ2V0U3RhcnRCbG9ja0lkeEJ5RWxzZShqKTtcclxuICAgICAgICBpZiAoYmxvY2tTdHJ0ID09PSBibG9ja09wZXJJZHgpIHtcclxuICAgICAgICAgIHJldElkeCA9IGo7XHJcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGogPSBibG9ja1N0cnQgLSAxO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKG9wZXJUeXBlID09PSBDb25zdEludGVyZmFjZS5NR19PUEVSX0VOREJMT0NLKVxyXG4gICAgICAgIGogPSB0aGlzLmdldFN0YXJ0QmxvY2tJZHhCeUVuZChqKSAtIDE7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBqLS07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0SWR4O1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXQgdGhlIGxldmVsXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRMZXZlbCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX2xldmVsO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybiB0aGUgZXZlbnQgb2YgdGhpcyBoYW5kbGVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRFdmVudCgpOiBFdmVudCB7XHJcbiAgICByZXR1cm4gdGhpcy5fZXZ0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGdldCB0aGUgSWQgb2YgdGhlIGV2ZW50IGhhbmRsZXJcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldElkKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5faWQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgZ2V0IHRoZSBjb250cm9sIG9mIHRoZSBldmVudCBoYW5kbGVyXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRTdGF0aWNDdHJsKCk6IE1nQ29udHJvbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3RybDtcclxuICB9XHJcblxyXG4gIGdldFJ1blRpbWVDdHJsKCk6IE1nQ29udHJvbCB7XHJcbiAgICByZXR1cm4gPE1nQ29udHJvbD5BY2Nlc3NIZWxwZXIuZXZlbnRzTWFuYWdlci5nZXRMYXN0UnRFdmVudCgpLkNvbnRyb2w7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlIGlmIHRoZSBoYW5kbGVyIGlzIGVuYWJsZWRcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGFzeW5jIGlzRW5hYmxlZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLl9lbmFibGVkRXhwLmdldFZhbCgpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJlc2V0IHRoZSB2YWx1ZXMgb2YgdGhlIGxvY2FsIHZhcmlhYmxlcyB1c2luZyB0aGUgYXJndW1lbnQgdmFsdWVzIG9yIHRoZSBkZWZhdWx0XHJcbiAgLy8vICAgdmFsdWVzIG9yIHRoZSBpbml0IGV4cHJlc3Npb25cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYXJnc1wiPnRoZSBhcmd1bWVudHMgbGlzdCA8L3BhcmFtPlxyXG4gIHByaXZhdGUgYXN5bmMgcmVzZXRMb2NhbFZhcmlhYmxlcyhhcmdzOiBBcmd1bWVudHNMaXN0KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgZHY6IERhdGFWaWV3ID0gPERhdGFWaWV3PnRoaXMuX3Rhc2suRGF0YVZpZXc7XHJcbiAgICBsZXQgYXJnSWR4OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGZvciAobGV0IGZpZWxkSWR4OiBudW1iZXIgPSB0aGlzLl9kdlBvczsgZmllbGRJZHggPCB0aGlzLl9kdlBvcyArIHRoaXMuX2R2TGVuOyBmaWVsZElkeCsrKSB7XHJcbiAgICAgICAgbGV0IGFGaWVsZDogRmllbGRCYXNlID0gPEZpZWxkQmFzZT5kdi5nZXRGaWVsZChmaWVsZElkeCk7XHJcbiAgICAgICAgbGV0IHZhcklzUGFybTogYm9vbGVhbiA9ICF0aGlzLl9oYXNQYXJhbWV0ZXJzIHx8IGFGaWVsZC5pc1BhcmFtKCk7XHJcblxyXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBmaWVsZCBzaG91bGQgZ2V0IGl0cyB2YWx1ZSBmcm9tIGFuIGFyZ3VtZW50XHJcbiAgICAgICAgaWYgKChhcmdzICE9PSBudWxsICYmIGFyZ0lkeCA8IGFyZ3MuZ2V0U2l6ZSgpKSAmJiB2YXJJc1Bhcm0pIHtcclxuICAgICAgICAgIGlmICghYXJncy5nZXRBcmcoYXJnSWR4KS5za2lwQXJnKCkpIHtcclxuICAgICAgICAgICAgYXdhaXQgYXJncy5nZXRBcmcoYXJnSWR4KS5zZXRWYWx1ZVRvRmllbGQoYUZpZWxkKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBhRmllbGQuaW52YWxpZGF0ZSh0cnVlLCBGaWVsZEJhc2UuQ0xFQVJfRkxBR1MpO1xyXG4gICAgICAgICAgICBhd2FpdCBhRmllbGQuY29tcHV0ZShmYWxzZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBhcmdJZHgrKztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBhRmllbGQuaW52YWxpZGF0ZSh0cnVlLCBGaWVsZEJhc2UuQ0xFQVJfRkxBR1MpO1xyXG4gICAgICAgICAgYXdhaXQgYUZpZWxkLmNvbXB1dGUoZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhd2FpdCBhRmllbGQudXBkYXRlRGlzcGxheSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXhjZXB0aW9uKSB7XHJcbiAgICAgIHRocm93IGV4Y2VwdGlvbjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIHJlc3VsdCB2YWx1ZXMgdG8gdGhlIGZpZWxkIGFyZ3VtZW50c1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJhcmdzXCI+dGhlIGFyZ3VtZW50cyBsaXN0IDwvcGFyYW0+XHJcbiAgcHJpdmF0ZSBhc3luYyBnZXRBcmdWYWxzRnJvbUZsZHMoYXJnczogQXJndW1lbnRzTGlzdCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGR2OiBEYXRhVmlldyA9IDxEYXRhVmlldz50aGlzLl90YXNrLkRhdGFWaWV3O1xyXG4gICAgbGV0IGs6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgajogbnVtYmVyO1xyXG5cclxuICAgIGZvciAoaiA9IHRoaXMuX2R2UG9zOyBqIDwgdGhpcy5fZHZQb3MgKyB0aGlzLl9kdkxlbiAmJiBrIDwgYXJncy5nZXRTaXplKCk7IGorKykge1xyXG4gICAgICBsZXQgYUZpZWxkOiBGaWVsZEJhc2UgPSA8RmllbGRCYXNlPmR2LmdldEZpZWxkKGopO1xyXG4gICAgICBpZiAoIXRoaXMuX2hhc1BhcmFtZXRlcnMgfHwgYUZpZWxkLmlzUGFyYW0oKSkge1xyXG4gICAgICAgIGxldCBhcmc6IEFyZ3VtZW50ID0gYXJncy5nZXRBcmcoayk7XHJcbiAgICAgICAgaWYgKGFyZy5nZXRUeXBlKCkgPT09IENvbnN0SW50ZXJmYWNlLkFSR19UWVBFX0ZJRUxEKSB7XHJcbiAgICAgICAgICAvLyB1cGRhdGUgdGhlIGZpZWxkIHZhbHVlIGZyb20gdGhlIHRoZSBQYXJhbVxyXG4gICAgICAgICAgbGV0IGFyZ0ZsZDogRmllbGRCYXNlID0gPEZpZWxkQmFzZT5hcmcuZ2V0RmllbGQoKTtcclxuXHJcbiAgICAgICAgICAvLyBBIGhhbmRsZXIgY2FuIGJlIGNhbGxlZCBlaXRoZXIgZnJvbSB0aGUgc2FtZSB0YXNrIChvZiB0aGUgaGFuZGxlcikgb3IgZnJvbSBhXHJcbiAgICAgICAgICAvLyB0YXNrIGxvd2VyIGRvd24gaW4gdGhlIGhpZXJhcmNoeS5cclxuICAgICAgICAgIC8vIEhlcmUgd2UgYXJlIGNvcHlpbmcgdmFsdWUgZnJvbSB0aGUgaGFuZGxlciB0YXNrIHRvIHRoZSBpbnZva2VyIHRhc2suXHJcbiAgICAgICAgICAvLyBDb3B5aW5nIHNob3VsZCBub3QgYmUgZG9uZSBpZiBhbnkgb25lIG9mIHRoZSB0YXNrIGlzIGFib3J0aW5nLlxyXG4gICAgICAgICAgLy8gQnV0IGNoZWNraW5nIG9ubHkgdGhlIGludm9rZXIgdGFzaydzIGlzQWJvcnRpbmcgaXMgc3VmZmljaWVudCBoZXJlIGJlY2F1c2UsXHJcbiAgICAgICAgICAvLyBpdCB3aWxsIGJlIHRydWUgZXZlbiBpZiB0aGUgaGFuZGxlciB0YXNrIGlzIGFib3J0aW5nLlxyXG4gICAgICAgICAgaWYgKGFyZ0ZsZC5nZXRUYXNrKCkgIT09IG51bGwgJiYgISg8VGFzaz5hcmdGbGQuZ2V0VGFzaygpKS5pc0Fib3J0aW5nKCkpIHtcclxuICAgICAgICAgICAgbGV0IHZhbDogc3RyaW5nID0gYUZpZWxkLmdldFZhbHVlKGZhbHNlKTtcclxuICAgICAgICAgICAgYXdhaXQgYXJnRmxkLnNldFZhbHVlQW5kU3RhcnRSZWNvbXB1dGUodmFsLCBhRmllbGQuaXNOdWxsKCksIHRydWUsIGFGaWVsZC5pc01vZGlmaWVkKCksIGZhbHNlKTtcclxuICAgICAgICAgICAgYXdhaXQgYXJnRmxkLnVwZGF0ZURpc3BsYXkoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaysrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0aGUgaGFuZGxlcidzIHRhc2tcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldFRhc2soKTogVGFzayB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGFzaztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBleHBlY3RlZCBieSB0aGUgaGFuZGxlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYXJnc01hdGNoKEV4cF9wYXJhbXM6IEV4cFZhbFtdKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgYXJnc01hdGNoZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgbGV0IGR2OiBEYXRhVmlldyA9IDxEYXRhVmlldz50aGlzLl90YXNrLkRhdGFWaWV3O1xyXG4gICAgbGV0IGo6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgcGFyYW1Db3VudDogbnVtYmVyID0gMDtcclxuXHJcbiAgICBmb3IgKGxldCBpOiBudW1iZXIgPSB0aGlzLl9kdlBvczsgaSA8IHRoaXMuX2R2UG9zICsgdGhpcy5fZHZMZW47IGkrKykge1xyXG4gICAgICBsZXQgZmllbGQ6IEZpZWxkQmFzZSA9IDxGaWVsZEJhc2U+ZHYuZ2V0RmllbGQoaSk7XHJcbiAgICAgIGlmIChmaWVsZC5pc1BhcmFtKCkpIHtcclxuICAgICAgICBwYXJhbUNvdW50Kys7XHJcbiAgICAgICAgaWYgKGogPCBFeHBfcGFyYW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgbGV0IGZpZWxkQXR0cjogU3RvcmFnZUF0dHJpYnV0ZSA9IGZpZWxkLmdldFR5cGUoKTtcclxuICAgICAgICAgIGxldCBhcmdBdHRyOiBTdG9yYWdlQXR0cmlidXRlID0gRXhwX3BhcmFtc1tqXS5BdHRyO1xyXG5cclxuXHJcbiAgICAgICAgICAvLyBhcmd1bWVudCBhbmQgcGFyYW1ldGVyIHdpbGwgbm90IG1hdGNoIGlmIDpcclxuICAgICAgICAgIC8vIDEuIFRoZXkgYXJlIG5vdCBvZiB0aGUgc2FtZSB0eXBlXHJcbiAgICAgICAgICAvLyAyLiBUaGV5IENhbm5vdCBiZSBjYXN0IChhbHBoYSBjYW4gYmUgY2FzdCB0byB1bmljb2RlKVxyXG4gICAgICAgICAgLy8gMy4gQWxsIHRob3NlIGFwcGx5IGlmIHRoZSBwYXJhbWV0ZXIgaXMgbm90IG51bGwuIGlmIHRoZSBwYXJhbSB2YWwgaXMgbnVsbCBpdCBjYW4gZ28gaW50byBhbnkgdHlwZSBvZiBwYXJhbWV0ZXIuXHJcbiAgICAgICAgICBpZiAoIUV4cF9wYXJhbXNbal0uSXNOdWxsICYmICFTdG9yYWdlQXR0cmlidXRlQ2hlY2suaXNUaGVTYW1lVHlwZShmaWVsZEF0dHIsIGFyZ0F0dHIpICYmICFTdG9yYWdlQXR0cmlidXRlQ2hlY2suU3RvcmFnZUZsZEFscGhhVW5pY29kZU9yQmxvYihmaWVsZEF0dHIsIGFyZ0F0dHIpKSB7XHJcbiAgICAgICAgICAgIGFyZ3NNYXRjaGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaisrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChwYXJhbUNvdW50ICE9PSBFeHBfcGFyYW1zLmxlbmd0aCkge1xyXG4gICAgICBhcmdzTWF0Y2hlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyZ3NNYXRjaGVkO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIE9wZXJhdGlvblRhYmxlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXRPcGVyYXRpb25UYWIoKTogT3BlcmF0aW9uVGFibGUge1xyXG4gICAgcmV0dXJuIHRoaXMuX29wZXJhdGlvblRhYjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gSW4gY2FzZSBvZiBDb250cm9sIGhlYWRlcnMsIHJldHVybiBjb250cm9sIG5hbWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldENvbnRyb2xOYW1lRm9yQ29udHJvbEhlYWRlcigpOiBzdHJpbmcge1xyXG4gICAgaWYodGhpcy5nZXRFdmVudCgpLmdldFR5cGUoKSA9PSBDb25zdEludGVyZmFjZS5FVkVOVF9UWVBFX0lOVEVSTkFMKSB7XHJcblxyXG4gICAgICAvLyBSZXR1cm4gdGhlIGNvbnRyb2wgbmFtZSBmb3IgQ29udHJvbCBIZWFkZXJzXHJcbiAgICAgIGlmICh0aGlzLmdldEV2ZW50KCkuaXNDb250cm9sSGVhZGVyKCkgJiYgIWlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuX2N0cmwpKVxyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEN0cmxOYW1lKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gTlN0cmluZy5FbXB0eTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gSW4gY2FzZSBvZiBWYXJpYWJsZSBoZWFkZXJzLCByZXR1cm4gZmllbGQgbmFtZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0VmFyTmFtZUZvclZhcmlhYmxlSGVhZGVyKCk6IHN0cmluZyB7XHJcbiAgICAvLyBSZXR1cm4gdGhlIEZpZWxkIG5hbWUgZm9yIFZhcmlhYmxlIEhlYWRlcnNcclxuICAgaWYgKHRoaXMuZ2V0RXZlbnQoKS5pc1ZhcmlhYmxlSGVhZGVyKCkgJiYgIWlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuX2hhbmRsZXJGbGQpKVxyXG4gICAgICByZXR1cm4gdGhpcy5faGFuZGxlckZsZC5nZXRWYXJOYW1lKCkudG9VcHBlckNhc2UoKTtcclxuXHJcbiAgIHJldHVybiBOU3RyaW5nLkVtcHR5O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm4gdGhlIGV2ZW50IGhhbmRsZXIgaW5mb3JtYXRpb24gdG8gYmUgZGlzcGxheWVkIGluIGNhc2Ugb2YgJ1JlcXVlc3RJbmZvJyBsb2cgbGV2ZWxcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGdldEV2ZW50SGFuZGxlckluZm8oKTogc3RyaW5nIHtcclxuICAgIGxldCBldmVudERlc2NyaXB0aW9uOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuXHJcbiAgICB0aGlzLmdldEV2ZW50KCkuQXBwZW5kRGVzY3JpcHRpb24oZXZlbnREZXNjcmlwdGlvbik7XHJcblxyXG4gICAgLy8gQXBwZW5kIGNvbnRyb2wvdmFyaWFibGUgbmFtZSBpbiBDb250cm9sL1ZhcmlhYmxlIGhlYWRlcnNcclxuICAgIGxldCBoZWFkZXJBZGRpdGlvbmFsSW5mbzogc3RyaW5nID0gdGhpcy5nZXRDb250cm9sTmFtZUZvckNvbnRyb2xIZWFkZXIoKSArIHRoaXMuZ2V0VmFyTmFtZUZvclZhcmlhYmxlSGVhZGVyKCk7XHJcblxyXG4gICAgZXZlbnREZXNjcmlwdGlvbi5BcHBlbmQoaGVhZGVyQWRkaXRpb25hbEluZm8pO1xyXG5cclxuICAgIC8vIEZvciBzb21lIGhlYWRlcnMgbGlrZSBSUC9UUCwgdGhlIGV2ZW50IGRlc2NyaXB0aW9uIGlzIGVtcHR5LlxyXG4gICAgLy8gRm9yIG90aGVycyBlbXB0eSBzcGFjZSBzaG91bGQgYmUgYWRkZWQgYmV0d2VlbiBldmVudCB0eXBlIGFuZCBkZXNjcmlwdGlvbi5cclxuICAgIC8vIFRoaXMgaXMgZG9uZSB0byBhdm9pZCB1bm5lY2Vzc2FyeSBibGFuayBzcGFjZSBhdCB0aGUgZW5kIG9mIHRoZSBldmVudCBoYW5kbGVyIHR5cGVcclxuICAgIGlmKCFOU3RyaW5nLklzTnVsbE9yRW1wdHkoZXZlbnREZXNjcmlwdGlvbi50b1N0cmluZygpKSlcclxuICAgICAgZXZlbnREZXNjcmlwdGlvbiA9IG5ldyBTdHJpbmdCdWlsZGVyKCcgJyArIGV2ZW50RGVzY3JpcHRpb24udG9TdHJpbmcoKSwgZXZlbnREZXNjcmlwdGlvbi50b1N0cmluZygpLmxlbmd0aCArIDEpO1xyXG5cclxuICAgIHJldHVybiBOU3RyaW5nLkZvcm1hdChcIkhhbmRsZXIgezB9ezF9XCIsIHRoaXMuZ2V0RXZlbnQoKS5nZXRFdmVudFR5cGUoKSwgZXZlbnREZXNjcmlwdGlvbik7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgY2hlY2sgaXMgdGFzayBzY29wZSBpcyBhcHByb3ByaWF0ZVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpc1NhbWVUYXNrXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIGNoZWNrVGFza1Njb3BlKGlzU2FtZVRhc2s6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLl9zY29wZSA9PT0gQnJrU2NvcGUuVGFzayAmJiAhaXNTYW1lVGFzaylcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICB0b1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIE5TdHJpbmcuRm9ybWF0KFwiKEhhbmRsZXIgZm9yIHswfSBvbiB0YXNrIHsxfSwgc2NvcGUgezJ9KVwiLCB0aGlzLl9ldnQsIHRoaXMuX3Rhc2ssIHRoaXMuX3Njb3BlKTtcclxuICB9XHJcbn1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuLy8vICAgdXNlZCB0byByZXR1cm4gdGhlIHJlc3VsdHMgb2YgdGhlIGV4ZWN1dGUoKSBtZXRob2RcclxuLy8vIDwvc3VtbWFyeT5cclxuZXhwb3J0IGNsYXNzIFJldFZhbHMgIHtcclxuICBCbG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgRW5hYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIE5leHRPcGVySWR4OiBudW1iZXIgPSAwO1xyXG4gIFByb3BhZ2F0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIFJldHVybmVkRnJvbVNlcnZlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihwOiBib29sZWFuLCBlOiBib29sZWFuKTtcclxuICBjb25zdHJ1Y3RvcihvcGVySWR4OiBudW1iZXIsIGluUmV0dXJuZWRGcm9tU2VydmVyOiBib29sZWFuLCBpbkJsb2NrSWZSZXR1cm5lZEZyb21TZXJ2ZXI6IGJvb2xlYW4pO1xyXG4gIGNvbnN0cnVjdG9yKHBPck9wZXJJZHg6IGFueSwgZU9ySW5SZXR1cm5lZEZyb21TZXJ2ZXI6IGJvb2xlYW4sIGluQmxvY2tJZlJldHVybmVkRnJvbVNlcnZlcj86IGJvb2xlYW4pIHtcclxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKVxyXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXzAocE9yT3BlcklkeCwgZU9ySW5SZXR1cm5lZEZyb21TZXJ2ZXIpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLmNvbnN0cnVjdG9yXzEocE9yT3BlcklkeCwgZU9ySW5SZXR1cm5lZEZyb21TZXJ2ZXIsIGluQmxvY2tJZlJldHVybmVkRnJvbVNlcnZlcik7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJwXCI+cHJvcGFnYXRlIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJlXCI+ZW5hYmxlZCA8L3BhcmFtPlxyXG4gIHByaXZhdGUgY29uc3RydWN0b3JfMChwOiBib29sZWFuLCBlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLlByb3BhZ2F0ZSA9IHA7XHJcbiAgICB0aGlzLkVuYWJsZWQgPSBlO1xyXG4gICAgdGhpcy5OZXh0T3BlcklkeCA9IDA7XHJcbiAgICB0aGlzLlJldHVybmVkRnJvbVNlcnZlciA9IGZhbHNlO1xyXG4gICAgdGhpcy5CbG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJvcGVySWR4XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpblJldHVybmVkRnJvbVNlcnZlclwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiaW5CbG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyXCI+PC9wYXJhbT5cclxuICBwcml2YXRlIGNvbnN0cnVjdG9yXzEob3BlcklkeDogbnVtYmVyLCBpblJldHVybmVkRnJvbVNlcnZlcjogYm9vbGVhbiwgaW5CbG9ja0lmUmV0dXJuZWRGcm9tU2VydmVyOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLlByb3BhZ2F0ZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5FbmFibGVkID0gdHJ1ZTtcclxuICAgIHRoaXMuTmV4dE9wZXJJZHggPSBvcGVySWR4O1xyXG4gICAgdGhpcy5SZXR1cm5lZEZyb21TZXJ2ZXIgPSBpblJldHVybmVkRnJvbVNlcnZlcjtcclxuICAgIHRoaXMuQmxvY2tJZlJldHVybmVkRnJvbVNlcnZlciA9IGluQmxvY2tJZlJldHVybmVkRnJvbVNlcnZlcjtcclxuICB9XHJcbn1cclxuXHJcbiJdfQ==