@magic-xpa/engine 4.1200.0-dev4120.19 → 4.1200.0-dev4120.191

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 (213) hide show
  1. package/fesm2022/magic-xpa-engine.mjs +11347 -1307
  2. package/fesm2022/magic-xpa-engine.mjs.map +1 -1
  3. package/index.d.ts +4 -0
  4. package/package.json +5 -7
  5. package/src/ClientManager.d.ts +2 -0
  6. package/src/CommandsProcessorBase.d.ts +2 -1
  7. package/src/CommandsProcessorManager.d.ts +2 -1
  8. package/src/ConstInterface.d.ts +7 -0
  9. package/src/bridge/MagicBridge.d.ts +2 -0
  10. package/src/commands/ClientToServer/CachedFileQueryCommand.d.ts +9 -0
  11. package/src/commands/ClientToServer/CommandFactory.d.ts +4 -2
  12. package/src/commands/ClientToServer/ControlItemsRefreshCommand.d.ts +1 -0
  13. package/src/commands/ClientToServer/FetchDataControlValuesEventCommand.d.ts +1 -0
  14. package/src/event/EventHandler.d.ts +5 -0
  15. package/src/event/EventsManager.d.ts +4 -0
  16. package/src/exp/ExpressionEvaluator.d.ts +5 -0
  17. package/src/http/HttpManager.d.ts +2 -1
  18. package/src/http/client/HttpClientAsync.d.ts +2 -2
  19. package/src/http/client/HttpClientBase.d.ts +3 -3
  20. package/src/http/client/HttpClientSync.d.ts +2 -2
  21. package/src/remote/RemoteCommandsProcessor.d.ts +9 -2
  22. package/src/remote/RemoteControlItemsRefreshCommand.d.ts +1 -0
  23. package/src/rt/Operation.d.ts +3 -1
  24. package/src/util/ParamParseResult.d.ts +3 -3
  25. package/esm2022/index.mjs +0 -188
  26. package/esm2022/magic-xpa-engine.mjs +0 -2
  27. package/esm2022/src/AccessHelper.mjs +0 -15
  28. package/esm2022/src/ClientManager.mjs +0 -420
  29. package/esm2022/src/CommandsProcessorBase.mjs +0 -56
  30. package/esm2022/src/CommandsProcessorManager.mjs +0 -26
  31. package/esm2022/src/CommandsTable.mjs +0 -162
  32. package/esm2022/src/ConstInterface.mjs +0 -517
  33. package/esm2022/src/CurrentClientVersion.mjs +0 -2
  34. package/esm2022/src/FlowMonitorInterface.mjs +0 -16
  35. package/esm2022/src/GUIManager.mjs +0 -62
  36. package/esm2022/src/GlobalCommandsManager.mjs +0 -34
  37. package/esm2022/src/GuiEventsProcessor.mjs +0 -156
  38. package/esm2022/src/ICommandsTable.mjs +0 -2
  39. package/esm2022/src/ServerConfig.mjs +0 -122
  40. package/esm2022/src/bridge/IGuiEvent.mjs +0 -20
  41. package/esm2022/src/bridge/MagicBridge.mjs +0 -41
  42. package/esm2022/src/commands/ClientOriginatedCommandTaskTag.mjs +0 -12
  43. package/esm2022/src/commands/ClientToServer/AddUserLocateDataViewCommand.mjs +0 -9
  44. package/esm2022/src/commands/ClientToServer/AddUserRangeDataviewCommand.mjs +0 -9
  45. package/esm2022/src/commands/ClientToServer/AddUserSortDataViewCommand.mjs +0 -9
  46. package/esm2022/src/commands/ClientToServer/BrowserEscEventCommand.mjs +0 -26
  47. package/esm2022/src/commands/ClientToServer/ClientOriginatedCommand.mjs +0 -15
  48. package/esm2022/src/commands/ClientToServer/ClientOriginatedCommandSerializer.mjs +0 -60
  49. package/esm2022/src/commands/ClientToServer/ColumnSortEventCommand.mjs +0 -29
  50. package/esm2022/src/commands/ClientToServer/CommandFactory.mjs +0 -261
  51. package/esm2022/src/commands/ClientToServer/CommandSerializationHelper.mjs +0 -67
  52. package/esm2022/src/commands/ClientToServer/ComputeEventCommand.mjs +0 -26
  53. package/esm2022/src/commands/ClientToServer/ContextTerminationEventCommand.mjs +0 -24
  54. package/esm2022/src/commands/ClientToServer/ContextTimeoutResetCommand.mjs +0 -23
  55. package/esm2022/src/commands/ClientToServer/ControlItemsRefreshCommand.mjs +0 -8
  56. package/esm2022/src/commands/ClientToServer/DataViewOutputCommand.mjs +0 -13
  57. package/esm2022/src/commands/ClientToServer/DataviewCommand.mjs +0 -44
  58. package/esm2022/src/commands/ClientToServer/EvaluateCommand.mjs +0 -40
  59. package/esm2022/src/commands/ClientToServer/EventCommand.mjs +0 -43
  60. package/esm2022/src/commands/ClientToServer/ExecOperCommand.mjs +0 -70
  61. package/esm2022/src/commands/ClientToServer/FetchDataControlValuesEventCommand.mjs +0 -25
  62. package/esm2022/src/commands/ClientToServer/GlobalParamsQueryCommand.mjs +0 -11
  63. package/esm2022/src/commands/ClientToServer/ICommandTaskTag.mjs +0 -2
  64. package/esm2022/src/commands/ClientToServer/IndexChangeEventCommand.mjs +0 -24
  65. package/esm2022/src/commands/ClientToServer/IniputForceWriteCommand.mjs +0 -26
  66. package/esm2022/src/commands/ClientToServer/NonReversibleExitEventCommand.mjs +0 -26
  67. package/esm2022/src/commands/ClientToServer/QueryCommand.mjs +0 -21
  68. package/esm2022/src/commands/ClientToServer/RecomputeCommand.mjs +0 -30
  69. package/esm2022/src/commands/ClientToServer/RefreshEventCommand.mjs +0 -30
  70. package/esm2022/src/commands/ClientToServer/RefreshScreenEventCommand.mjs +0 -27
  71. package/esm2022/src/commands/ClientToServer/RollbackEventCommand.mjs +0 -43
  72. package/esm2022/src/commands/ClientToServer/SelectProgramCommand.mjs +0 -19
  73. package/esm2022/src/commands/ClientToServer/SetTransactionStateDataviewCommand.mjs +0 -9
  74. package/esm2022/src/commands/ClientToServer/SubformOpenEventCommand.mjs +0 -24
  75. package/esm2022/src/commands/ClientToServer/SubformRefreshEventCommand.mjs +0 -27
  76. package/esm2022/src/commands/ClientToServer/TransactionCommand.mjs +0 -34
  77. package/esm2022/src/commands/ClientToServer/UnloadCommand.mjs +0 -18
  78. package/esm2022/src/commands/ClientToServer/WriteMessageToServerLogCommand.mjs +0 -18
  79. package/esm2022/src/commands/DataViewCommandBase.mjs +0 -8
  80. package/esm2022/src/commands/IClientCommand.mjs +0 -2
  81. package/esm2022/src/commands/IClientTargetedCommand.mjs +0 -13
  82. package/esm2022/src/commands/IClientToServerCommandInfo.mjs +0 -2
  83. package/esm2022/src/commands/ServerToClient/AbortCommand.mjs +0 -65
  84. package/esm2022/src/commands/ServerToClient/AddLocateCommand.mjs +0 -22
  85. package/esm2022/src/commands/ServerToClient/AddRangeCommand.mjs +0 -62
  86. package/esm2022/src/commands/ServerToClient/AddSortCommand.mjs +0 -33
  87. package/esm2022/src/commands/ServerToClient/ClientRefreshCommand.mjs +0 -25
  88. package/esm2022/src/commands/ServerToClient/ClientTargetedCommandBase.mjs +0 -24
  89. package/esm2022/src/commands/ServerToClient/EnhancedVerifyCommand.mjs +0 -45
  90. package/esm2022/src/commands/ServerToClient/OpenURLCommand.mjs +0 -221
  91. package/esm2022/src/commands/ServerToClient/ResetLocateCommand.mjs +0 -15
  92. package/esm2022/src/commands/ServerToClient/ResetRangeCommand.mjs +0 -15
  93. package/esm2022/src/commands/ServerToClient/ResetSortCommand.mjs +0 -15
  94. package/esm2022/src/commands/ServerToClient/ResultCommand.mjs +0 -37
  95. package/esm2022/src/commands/ServerToClient/VerifyCommand.mjs +0 -83
  96. package/esm2022/src/commands/ServerToClient/XMLBasedCommandBuilder.mjs +0 -132
  97. package/esm2022/src/communications/IConnectionStateManager.mjs +0 -2
  98. package/esm2022/src/communications/InteractiveCommunicationsFailureHandler.mjs +0 -15
  99. package/esm2022/src/data/DataSourceIdKey.mjs +0 -3
  100. package/esm2022/src/data/DataView.mjs +0 -1613
  101. package/esm2022/src/data/DataViewBase.mjs +0 -4
  102. package/esm2022/src/data/DataviewManager.mjs +0 -28
  103. package/esm2022/src/data/DataviewManagerBase.mjs +0 -15
  104. package/esm2022/src/data/DvCache.mjs +0 -67
  105. package/esm2022/src/data/Field.mjs +0 -646
  106. package/esm2022/src/data/FieldBase.mjs +0 -15
  107. package/esm2022/src/data/FieldsTable.mjs +0 -103
  108. package/esm2022/src/data/IRecordsTable.mjs +0 -2
  109. package/esm2022/src/data/Key.mjs +0 -88
  110. package/esm2022/src/data/Record.mjs +0 -880
  111. package/esm2022/src/data/RecordOutOfDataViewException.mjs +0 -16
  112. package/esm2022/src/data/RecordsTable.mjs +0 -267
  113. package/esm2022/src/data/TaskTransactionManager.mjs +0 -107
  114. package/esm2022/src/data/XMLBasedDcValuesBuilder.mjs +0 -74
  115. package/esm2022/src/enums.mjs +0 -24
  116. package/esm2022/src/env/EnvVariablesTable.mjs +0 -340
  117. package/esm2022/src/env/Environment.mjs +0 -487
  118. package/esm2022/src/env/ILanguageData.mjs +0 -2
  119. package/esm2022/src/env/LanguageData.mjs +0 -227
  120. package/esm2022/src/env/MirrorString.mjs +0 -67
  121. package/esm2022/src/event/ActionManager.mjs +0 -91
  122. package/esm2022/src/event/Event.mjs +0 -1333
  123. package/esm2022/src/event/EventHandler.mjs +0 -766
  124. package/esm2022/src/event/EventHandlerPosition.mjs +0 -204
  125. package/esm2022/src/event/EventsManager.mjs +0 -2988
  126. package/esm2022/src/event/IEventsManager.mjs +0 -7
  127. package/esm2022/src/event/RunTimeEvent.mjs +0 -399
  128. package/esm2022/src/event/RunTimeEventBase.mjs +0 -4
  129. package/esm2022/src/event/UserEventsTable.mjs +0 -47
  130. package/esm2022/src/exp/ExpTable.mjs +0 -57
  131. package/esm2022/src/exp/Expression.mjs +0 -200
  132. package/esm2022/src/exp/ExpressionDict.mjs +0 -727
  133. package/esm2022/src/exp/ExpressionEvaluator.mjs +0 -4206
  134. package/esm2022/src/exp/ExpressionLocalJpn.mjs +0 -314
  135. package/esm2022/src/exp/GlobalParamsTable.mjs +0 -85
  136. package/esm2022/src/exp/YesNoExp.mjs +0 -36
  137. package/esm2022/src/gui/CreatedFormVector.mjs +0 -23
  138. package/esm2022/src/gui/FormsTable.mjs +0 -66
  139. package/esm2022/src/gui/MgControl.mjs +0 -363
  140. package/esm2022/src/gui/MgForm.mjs +0 -1224
  141. package/esm2022/src/http/HttpManager.mjs +0 -97
  142. package/esm2022/src/http/client/HttpClientAsync.mjs +0 -68
  143. package/esm2022/src/http/client/HttpClientBase.mjs +0 -132
  144. package/esm2022/src/http/client/HttpClientEvents.mjs +0 -39
  145. package/esm2022/src/http/client/HttpClientSync.mjs +0 -42
  146. package/esm2022/src/http/client/HttpUtility.mjs +0 -84
  147. package/esm2022/src/http/client/ICommunicationsFailureHandler.mjs +0 -2
  148. package/esm2022/src/remote/AddUserLocateRemoteDataViewCommand.mjs +0 -18
  149. package/esm2022/src/remote/AddUserRangeRemoteDataViewCommand.mjs +0 -18
  150. package/esm2022/src/remote/AddUserSortRemoteDataViewCommand.mjs +0 -18
  151. package/esm2022/src/remote/RemoteCommandsProcessor.mjs +0 -883
  152. package/esm2022/src/remote/RemoteControlItemsRefreshCommand.mjs +0 -25
  153. package/esm2022/src/remote/RemoteDataViewCommandBase.mjs +0 -24
  154. package/esm2022/src/remote/RemoteDataViewCommandFactory.mjs +0 -61
  155. package/esm2022/src/remote/RemoteDataViewCommandUpdateNonModifiable.mjs +0 -16
  156. package/esm2022/src/remote/RemoteDataviewManager.mjs +0 -17
  157. package/esm2022/src/remote/RemoteInitDataViewCommand.mjs +0 -11
  158. package/esm2022/src/remote/ResetUserLocateRemoteDataviewCommand.mjs +0 -17
  159. package/esm2022/src/remote/ResetUserRangeRemoteDataviewCommand.mjs +0 -13
  160. package/esm2022/src/remote/ResetUserSortRemoteDataviewCommand.mjs +0 -16
  161. package/esm2022/src/remote/ServerError.mjs +0 -40
  162. package/esm2022/src/remote/SetTransactionStateRemoteDataViewCommand.mjs +0 -20
  163. package/esm2022/src/rt/Argument.mjs +0 -265
  164. package/esm2022/src/rt/ArgumentsList.mjs +0 -103
  165. package/esm2022/src/rt/Boundary.mjs +0 -152
  166. package/esm2022/src/rt/CompMainPrgTable.mjs +0 -63
  167. package/esm2022/src/rt/DataviewHeaderBase.mjs +0 -98
  168. package/esm2022/src/rt/DataviewHeaderFactory.mjs +0 -7
  169. package/esm2022/src/rt/DataviewHeaders.mjs +0 -53
  170. package/esm2022/src/rt/DataviewHeadersSaxHandler.mjs +0 -38
  171. package/esm2022/src/rt/ExecutionStack.mjs +0 -94
  172. package/esm2022/src/rt/ExecutionStackEntry.mjs +0 -17
  173. package/esm2022/src/rt/HandlersTable.mjs +0 -96
  174. package/esm2022/src/rt/IDataSourceViewDefinition.mjs +0 -2
  175. package/esm2022/src/rt/IDataviewHeader.mjs +0 -2
  176. package/esm2022/src/rt/IResultValue.mjs +0 -2
  177. package/esm2022/src/rt/LastFocusedManager.mjs +0 -65
  178. package/esm2022/src/rt/Operation.mjs +0 -735
  179. package/esm2022/src/rt/OperationTable.mjs +0 -67
  180. package/esm2022/src/rt/Recompute.mjs +0 -355
  181. package/esm2022/src/rt/RecomputeTable.mjs +0 -63
  182. package/esm2022/src/rt/RemoteDataviewHeader.mjs +0 -108
  183. package/esm2022/src/rt/ResultValue.mjs +0 -10
  184. package/esm2022/src/rt/TableCache.mjs +0 -177
  185. package/esm2022/src/rt/TableCacheManager.mjs +0 -67
  186. package/esm2022/src/rt/Transaction.mjs +0 -53
  187. package/esm2022/src/security/UserDetails.mjs +0 -71
  188. package/esm2022/src/tasks/IMGDataCollection.mjs +0 -2
  189. package/esm2022/src/tasks/MGData.mjs +0 -552
  190. package/esm2022/src/tasks/MGDataCollection.mjs +0 -252
  191. package/esm2022/src/tasks/RCTimer.mjs +0 -63
  192. package/esm2022/src/tasks/RemoteTaskService.mjs +0 -45
  193. package/esm2022/src/tasks/Task.mjs +0 -2499
  194. package/esm2022/src/tasks/TaskBase.mjs +0 -83
  195. package/esm2022/src/tasks/TaskServiceBase.mjs +0 -25
  196. package/esm2022/src/tasks/TasksTable.mjs +0 -80
  197. package/esm2022/src/tasks/sort/Sort.mjs +0 -5
  198. package/esm2022/src/tasks/sort/SortCollection.mjs +0 -67
  199. package/esm2022/src/util/ConstUtils.mjs +0 -14
  200. package/esm2022/src/util/FlowMonitorQueue.mjs +0 -451
  201. package/esm2022/src/util/HeapSort.mjs +0 -70
  202. package/esm2022/src/util/IMirrorXML.mjs +0 -2
  203. package/esm2022/src/util/IServerConfig.mjs +0 -2
  204. package/esm2022/src/util/MgBlockingQueue.mjs +0 -2
  205. package/esm2022/src/util/MgPriorityBlockingQueue.mjs +0 -74
  206. package/esm2022/src/util/MgPriorityQueue.mjs +0 -66
  207. package/esm2022/src/util/ParamParseResult.mjs +0 -8
  208. package/esm2022/src/util/PrmMap.mjs +0 -153
  209. package/esm2022/src/util/ReturnResult.mjs +0 -46
  210. package/esm2022/src/util/ReturnResultBase.mjs +0 -18
  211. package/esm2022/src/util/Scrambler.mjs +0 -89
  212. package/esm2022/src/util/UniqueIDUtils.mjs +0 -13
  213. package/esm2022/src/util/cookie.service.mjs +0 -92
@@ -1,451 +0,0 @@
1
- import { BlobType, DisplayConvertor, PIC, VectorType } from '@magic-xpa/gui';
2
- import { DateTime, NString, StringBuilder } from '@magic-xpa/mscorelib';
3
- import { Constants, DateTimeUtils, InternalInterface, Logger, Queue, StorageAttribute, XMLConstants, XmlParser } from '@magic-xpa/utils';
4
- import { FlowMonitorInterface } from '../FlowMonitorInterface';
5
- import { ConstInterface } from '../ConstInterface';
6
- export class FlowMonitorQueue {
7
- static _instance = null;
8
- static UNPRINTABLE_STR_LOG = "#UNPRINTABLE#";
9
- static S_EVENT_STR1 = ">>Starts ";
10
- static S_EVENT_STR2 = " Event";
11
- static S_EVENT_PROPAGATED = "Event was propagated";
12
- static E_EVENT_STR = "<<Ends Event";
13
- static S_RECPRF_STR = "Starts Record Prefix";
14
- static E_RECPRF_STR = "Ends Record Prefix";
15
- static S_RECSUF_STR = "Starts Record Suffix";
16
- static E_RECSUF_STR = "Ends Record Suffix";
17
- static S_TASKSUF_STR = "Starts Task Suffix";
18
- static E_TASKSUF_STR = "Ends Task Suffix";
19
- static S_TASKPRF_STR = "Starts Task Prefix";
20
- static E_TASKPRF_STR = "Ends Task Prefix";
21
- static S_CTRLPRF_STR = "Starts Control Prefix - ";
22
- static E_CTRLPRF_STR = "Ends Control Prefix - ";
23
- static S_CTRLSUF_STR = "Starts Control Suffix - ";
24
- static E_CTRLSUF_STR = "Ends Control Suffix - ";
25
- static S_HANDLER_STR = "Starts handling event {0}";
26
- static E_HANDLER_STR = "Ends handling event {0}";
27
- static S_CTRLVER_STR = "Starts Control Verification for Control - ";
28
- static E_CTRLVER_STR = "Ends Control Verification for Control - ";
29
- static RECOMP_STR = "Recomputes - ";
30
- static S_VARIABLE_STR = "Starts Variable Change - ";
31
- static E_VARIABLE_STR = "Ends Variable Change - ";
32
- static VARIABLE_REASON_STR = " - Reason - Previous value";
33
- static FLW_PERFIX = "Flow - ";
34
- static ACT_TASK = 'T';
35
- static ACT_TASK_FLW = 'F';
36
- static ACT_RECOMPUTE = 'R';
37
- static ACT_FLW_OPER = 'T';
38
- static LongTimePattern = "HH:mm:ss:SSS";
39
- _queue = new Queue();
40
- _enabled = false;
41
- _isFlowOperation = false;
42
- _isRecompute = false;
43
- _isTask = false;
44
- _isTaskFlow = false;
45
- _isDataView = false;
46
- ShouldSerialize = false;
47
- static get Instance() {
48
- if (FlowMonitorQueue._instance === null)
49
- FlowMonitorQueue._instance = new FlowMonitorQueue();
50
- return FlowMonitorQueue._instance;
51
- }
52
- addTaskCngMode(newTaskMode, taskInfo) {
53
- let info = "Task Mode Change - ";
54
- if (this._enabled && this._isTask) {
55
- let activityItem = new ActivityItem(this, FlowMonitorQueue.ACT_TASK, FlowMonitorInterface.FLWMTR_CHNG_MODE);
56
- switch (newTaskMode) {
57
- case Constants.TASK_MODE_MODIFY:
58
- info += "Modify";
59
- break;
60
- case Constants.TASK_MODE_CREATE:
61
- info += "Create";
62
- break;
63
- case Constants.TASK_MODE_DELETE:
64
- info += "Delete";
65
- break;
66
- case Constants.TASK_MODE_QUERY:
67
- info += "Query";
68
- break;
69
- default:
70
- info = null;
71
- break;
72
- }
73
- activityItem.setInfo(info);
74
- this._queue.put(activityItem);
75
- Logger.Instance.WriteSupportToLog(taskInfo + ": " + info, true);
76
- }
77
- }
78
- fillData(parser) {
79
- let endContext = parser.getXMLdata().indexOf("/>", parser.getCurrIndex());
80
- if (endContext !== -1 && endContext < parser.getXMLdata().length) {
81
- let tag = parser.getXMLsubstring(endContext);
82
- parser.add2CurrIndex(tag.indexOf("flwmtr_config") + "flwmtr_config".length);
83
- let tokens = XmlParser.getTokens(parser.getXMLsubstring(endContext), XMLConstants.XML_ATTR_DELIM);
84
- Logger.Instance.WriteDevToLog("in FlowMonitorQueue.FillData: " + tokens.toString());
85
- this.initElements(tokens);
86
- parser.setCurrIndex(endContext + XMLConstants.TAG_TERM.length);
87
- return;
88
- }
89
- Logger.Instance.WriteExceptionToLogWithMsg("in FlowMonitorQueue.FillData() out of string bounds");
90
- }
91
- initElements(tokensVector) {
92
- for (let j = 0; j < tokensVector.length; j = j + 2) {
93
- let attribute = tokensVector.get_Item(j);
94
- let valueStr = tokensVector.get_Item(j + 1);
95
- Logger.Instance.WriteDevToLog(attribute + " value: " + valueStr);
96
- switch (attribute) {
97
- case ConstInterface.MG_ATTR_TASK:
98
- this._isTask = XmlParser.getBoolean(valueStr);
99
- break;
100
- case ConstInterface.MG_ATTR_TASKFLW:
101
- this._isTaskFlow = XmlParser.getBoolean(valueStr);
102
- break;
103
- case ConstInterface.MG_TAG_DATAVIEW:
104
- this._isDataView = XmlParser.getBoolean(valueStr);
105
- break;
106
- case ConstInterface.MG_ATTR_RECOMP:
107
- this._isRecompute = XmlParser.getBoolean(valueStr);
108
- break;
109
- case ConstInterface.MG_ATTR_FLWOP:
110
- this._isFlowOperation = XmlParser.getBoolean(valueStr);
111
- break;
112
- case ConstInterface.MG_ATTR_ENABLED:
113
- this.enable(XmlParser.getBoolean(valueStr));
114
- break;
115
- default:
116
- Logger.Instance.WriteExceptionToLogWithMsg("in FlowMonitorQueue.initElements(): unknown attribute: " + attribute);
117
- break;
118
- }
119
- }
120
- }
121
- buildXML(message) {
122
- if (!this._queue.isEmpty() && this.ShouldSerialize) {
123
- message.Append(XMLConstants.START_TAG + ConstInterface.MG_TAG_FLWMTR_MSG + XMLConstants.TAG_CLOSE);
124
- while (!this._queue.isEmpty()) {
125
- let currAct = this._queue.get();
126
- currAct.buildXML(message);
127
- }
128
- message.Append("</" + ConstInterface.MG_TAG_FLWMTR_MSG + XMLConstants.TAG_CLOSE);
129
- }
130
- }
131
- isEmpty() {
132
- return this._queue.isEmpty();
133
- }
134
- enable(value) {
135
- let wasEnabled = this._enabled;
136
- this._enabled = value;
137
- this.ShouldSerialize = this._enabled;
138
- return wasEnabled;
139
- }
140
- addTaskEvent(triggeredBy, state, taskInfo) {
141
- if (this._enabled && this._isTask) {
142
- let act = new ActivityItem(this, FlowMonitorQueue.ACT_TASK, FlowMonitorInterface.FLWMTR_EVENT);
143
- let info;
144
- switch (state) {
145
- case FlowMonitorInterface.FLWMTR_START:
146
- info = FlowMonitorQueue.S_EVENT_STR1 + triggeredBy + FlowMonitorQueue.S_EVENT_STR2;
147
- break;
148
- case FlowMonitorInterface.FLWMTR_END:
149
- info = FlowMonitorQueue.E_EVENT_STR + triggeredBy;
150
- break;
151
- case FlowMonitorInterface.FLWMTR_PROPAGATE:
152
- info = FlowMonitorQueue.S_EVENT_PROPAGATED;
153
- break;
154
- default:
155
- info = null;
156
- break;
157
- }
158
- act.setInfo(info);
159
- this._queue.put(act);
160
- Logger.Instance.WriteSupportToLog(taskInfo + ": " + info, true);
161
- }
162
- }
163
- appendVirtualsAndParameters(currentValues) {
164
- let act = new ActivityItem(this, FlowMonitorQueue.ACT_TASK_FLW, InternalInterface.MG_ACT_REC_PREFIX);
165
- act.setInfo(currentValues);
166
- this._queue.put(act);
167
- }
168
- addDataViewFlow(task) {
169
- if (this._isDataView) {
170
- let fldTab = task.DataView.GetFieldsTab();
171
- let preparedDisplayString = "";
172
- let finaldisplayData = "\n";
173
- let fldValue;
174
- let data = "";
175
- for (let i = 0; i < fldTab.getSize(); i++) {
176
- let fldDef = fldTab.getField(i);
177
- if (!fldDef.IsEventHandlerField && (fldDef.IsVirtual && !fldDef.VirAsReal) || fldDef.isParam()) {
178
- fldValue = fldDef.isNull() ? fldDef.getNullValue() : fldDef.getValue(true);
179
- data = this.getFieldData(fldDef.getType(), fldValue, fldDef.getPicture(), fldDef.getCellsType(), task);
180
- preparedDisplayString = this.PrepareDisplayString(fldDef.isParam(), fldDef.getVarName(), data, true);
181
- finaldisplayData = finaldisplayData + preparedDisplayString + "\n";
182
- }
183
- }
184
- this.appendVirtualsAndParameters(finaldisplayData);
185
- }
186
- }
187
- getFieldData(Storagetype, data, picture, vecCellType, task) {
188
- switch (Storagetype) {
189
- case StorageAttribute.DOTNET:
190
- data = FlowMonitorQueue.UNPRINTABLE_STR_LOG;
191
- break;
192
- case StorageAttribute.BLOB:
193
- {
194
- if (BlobType.isValidBlob(data)) {
195
- let contentType = BlobType.getContentType(data);
196
- if (contentType == BlobType.CONTENT_TYPE_ANSI || contentType == BlobType.CONTENT_TYPE_UNICODE)
197
- data = data != null ? BlobType.getString(data) : "";
198
- else
199
- data = FlowMonitorQueue.UNPRINTABLE_STR_LOG;
200
- }
201
- else
202
- data = "";
203
- }
204
- break;
205
- case StorageAttribute.NUMERIC:
206
- case StorageAttribute.DATE:
207
- case StorageAttribute.TIME:
208
- let conv = DisplayConvertor.Instance;
209
- data = conv.mg2disp(data, " ", new PIC(picture, Storagetype, task.getCompIdx()), false, task.getCompIdx(), false);
210
- break;
211
- case StorageAttribute.BLOB_VECTOR:
212
- let vecOutData;
213
- if (data == null) {
214
- vecOutData = "[]";
215
- }
216
- else {
217
- let cellAtt = vecCellType;
218
- let vector = new VectorType(data);
219
- if (cellAtt == StorageAttribute.BLOB && !VectorType.validateBlobContents(data))
220
- vecOutData = "[]";
221
- else {
222
- let vecSize = VectorType.getVecSize(data);
223
- let cellPicture = (cellAtt == StorageAttribute.NUMERIC || cellAtt == StorageAttribute.DATE || cellAtt == StorageAttribute.TIME) ? PIC.buildPicture(cellAtt, vector.getVecCell(1), task.getCompIdx(), true).getFormat() : picture;
224
- vecOutData = "[";
225
- for (let i = 0; i < vecSize; i++) {
226
- vecOutData += this.getFieldData(cellAtt, vector.getVecCell(i + 1), cellPicture, vecCellType, task);
227
- vecOutData += i < vecSize - 1 ? "," : "]";
228
- }
229
- }
230
- }
231
- data = vecOutData;
232
- break;
233
- case StorageAttribute.BOOLEAN:
234
- data = data == "1" ? "TRUE" : "FALSE";
235
- break;
236
- }
237
- return data;
238
- }
239
- PrepareDisplayString(mode, name, valueContent, addDoubleQuotes) {
240
- let str = "";
241
- let finalStringToDisplay = "";
242
- if (addDoubleQuotes)
243
- finalStringToDisplay = finalStringToDisplay + "\"";
244
- finalStringToDisplay = finalStringToDisplay + name;
245
- if (addDoubleQuotes)
246
- finalStringToDisplay = finalStringToDisplay + "\"";
247
- let paddedName = this.padRight(name, 34);
248
- let formatOfStringVirtual = `Virtual`;
249
- let formatOfStringParameter = `Parameter`;
250
- str = (mode ? formatOfStringParameter : formatOfStringVirtual) + " : " + `${paddedName}` + " : " + `${valueContent.trim()}`;
251
- return str;
252
- }
253
- padRight = (string, length, character = ' ') => {
254
- let result = "";
255
- let totalLength = length - string.length;
256
- for (let i = 0; i < totalLength; i++) {
257
- result = character + result;
258
- }
259
- result = result + string;
260
- return result;
261
- };
262
- addTaskFlowRec(id, state, taskInfo) {
263
- if (this._enabled && this._isTaskFlow) {
264
- let info;
265
- switch (id) {
266
- case InternalInterface.MG_ACT_REC_PREFIX:
267
- info = state === FlowMonitorInterface.FLWMTR_START
268
- ? FlowMonitorQueue.S_RECPRF_STR
269
- : FlowMonitorQueue.E_RECPRF_STR;
270
- id = FlowMonitorInterface.FLWMTR_PREFIX;
271
- break;
272
- case InternalInterface.MG_ACT_REC_SUFFIX:
273
- info = state === FlowMonitorInterface.FLWMTR_START
274
- ? FlowMonitorQueue.S_RECSUF_STR
275
- : FlowMonitorQueue.E_RECSUF_STR;
276
- id = FlowMonitorInterface.FLWMTR_SUFFIX;
277
- break;
278
- case InternalInterface.MG_ACT_TASK_PREFIX:
279
- info = state === FlowMonitorInterface.FLWMTR_START
280
- ? FlowMonitorQueue.S_TASKPRF_STR
281
- : FlowMonitorQueue.E_TASKPRF_STR;
282
- id = FlowMonitorInterface.FLWMTR_PREFIX;
283
- break;
284
- case InternalInterface.MG_ACT_TASK_SUFFIX:
285
- info = state === FlowMonitorInterface.FLWMTR_START
286
- ? FlowMonitorQueue.S_TASKSUF_STR
287
- : FlowMonitorQueue.E_TASKSUF_STR;
288
- id = FlowMonitorInterface.FLWMTR_SUFFIX;
289
- break;
290
- default:
291
- info = null;
292
- break;
293
- }
294
- let act = new ActivityItem(this, FlowMonitorQueue.ACT_TASK_FLW, id);
295
- act.setInfo(info);
296
- this._queue.put(act);
297
- Logger.Instance.WriteSupportToLog(taskInfo + ": " + info, true);
298
- }
299
- }
300
- addTaskFlowFld(id, fldName, state, taskInfo) {
301
- this.addTaskFlowCtrl(id, fldName, state, taskInfo);
302
- }
303
- addTaskFlowCtrl(id, ctrlName, state, taskInfo) {
304
- if (this._enabled && this._isTaskFlow) {
305
- let info;
306
- switch (id) {
307
- case InternalInterface.MG_ACT_VARIABLE:
308
- info = state === FlowMonitorInterface.FLWMTR_START
309
- ? FlowMonitorQueue.S_VARIABLE_STR
310
- : FlowMonitorQueue.E_VARIABLE_STR;
311
- id = FlowMonitorInterface.FLWMTR_VARCHG_VALUE;
312
- break;
313
- case InternalInterface.MG_ACT_CTRL_PREFIX:
314
- info = state === FlowMonitorInterface.FLWMTR_START
315
- ? FlowMonitorQueue.S_CTRLPRF_STR
316
- : FlowMonitorQueue.E_CTRLPRF_STR;
317
- id = FlowMonitorInterface.FLWMTR_CTRL_PREFIX;
318
- break;
319
- case InternalInterface.MG_ACT_CTRL_SUFFIX:
320
- info = state === FlowMonitorInterface.FLWMTR_START
321
- ? FlowMonitorQueue.S_CTRLSUF_STR
322
- : FlowMonitorQueue.E_CTRLSUF_STR;
323
- id = FlowMonitorInterface.FLWMTR_CTRL_SUFFIX;
324
- break;
325
- case InternalInterface.MG_ACT_CTRL_VERIFICATION:
326
- info = state === FlowMonitorInterface.FLWMTR_START
327
- ? FlowMonitorQueue.S_CTRLVER_STR
328
- : FlowMonitorQueue.E_CTRLVER_STR;
329
- id = FlowMonitorInterface.FLWMTR_CTRL_SUFFIX;
330
- break;
331
- default:
332
- info = null;
333
- break;
334
- }
335
- let act = new ActivityItem(this, FlowMonitorQueue.ACT_TASK_FLW, id);
336
- if (info !== null) {
337
- info = info + ctrlName;
338
- if (id === FlowMonitorInterface.FLWMTR_VARCHG_VALUE && state === FlowMonitorInterface.FLWMTR_START)
339
- info = info + FlowMonitorQueue.VARIABLE_REASON_STR;
340
- act.setInfo(info);
341
- Logger.Instance.WriteSupportToLog(taskInfo + ": " + info, true);
342
- }
343
- this._queue.put(act);
344
- }
345
- }
346
- addTaskFlowHandler(handlerId, state, taskInfo) {
347
- if (this._enabled && this._isTaskFlow) {
348
- let act = new ActivityItem(this, FlowMonitorQueue.ACT_TASK_FLW, FlowMonitorInterface.FLWMTR_TSK_HANDLER);
349
- let info;
350
- switch (state) {
351
- case FlowMonitorInterface.FLWMTR_START:
352
- info = NString.Format(FlowMonitorQueue.S_HANDLER_STR, handlerId);
353
- break;
354
- case FlowMonitorInterface.FLWMTR_END:
355
- info = NString.Format(FlowMonitorQueue.E_HANDLER_STR, handlerId);
356
- break;
357
- default:
358
- info = null;
359
- break;
360
- }
361
- if (info !== null) {
362
- act.setInfo(info);
363
- Logger.Instance.WriteSupportToLog(taskInfo + ": " + info, true);
364
- }
365
- this._queue.put(act);
366
- }
367
- }
368
- addRecompute(triggeredByVarName, taskInfo) {
369
- if (this._enabled && this._isRecompute) {
370
- let act = new ActivityItem(this, FlowMonitorQueue.ACT_RECOMPUTE, FlowMonitorInterface.FLWMTR_RECOMP);
371
- let info = FlowMonitorQueue.RECOMP_STR + triggeredByVarName;
372
- act.setInfo(info);
373
- this._queue.put(act);
374
- Logger.Instance.WriteSupportToLog(taskInfo + ": " + info, true);
375
- }
376
- }
377
- async addFlowFieldOperation(oper, bExecuted, taskInfo) {
378
- if (this._enabled && this._isFlowOperation) {
379
- let act = new ActivityItem(this, FlowMonitorQueue.ACT_FLW_OPER, FlowMonitorInterface.FLWMTR_DATA_OPER);
380
- let buffer = new StringBuilder(FlowMonitorQueue.FLW_PERFIX);
381
- await oper.AddFlowDescription(buffer);
382
- buffer.Append(' ');
383
- if (!bExecuted)
384
- buffer.Append("[Not Executed]");
385
- let info = buffer.ToString();
386
- act.setInfo(info);
387
- this._queue.put(act);
388
- Logger.Instance.WriteSupportToLog(taskInfo + ": " + info, true);
389
- }
390
- }
391
- addFlowOperationUpdate(state, taskInfo) {
392
- if (this._enabled && this._isFlowOperation) {
393
- let act = new ActivityItem(this, FlowMonitorQueue.ACT_FLW_OPER, FlowMonitorInterface.FLWMTR_DATA_OPER);
394
- let info;
395
- if (state === FlowMonitorInterface.FLWMTR_START)
396
- info = "Starts Update";
397
- else
398
- info = "Ends Update";
399
- act.setInfo(info);
400
- this._queue.put(act);
401
- Logger.Instance.WriteSupportToLog(taskInfo + ": " + info, true);
402
- }
403
- }
404
- addFlowVerifyInfo(info, taskInfo) {
405
- this.addFlowInfo(info, taskInfo);
406
- }
407
- addFlowInvokeOsInfo(info, taskInfo) {
408
- this.addFlowInfo(info, taskInfo);
409
- }
410
- addFlowInfo(info, taskInfo) {
411
- if (!this._enabled)
412
- return;
413
- let act = new ActivityItem(this, FlowMonitorQueue.ACT_FLW_OPER, FlowMonitorInterface.FLWMTR_DATA_OPER);
414
- let buffer = new StringBuilder("");
415
- if (!(info === "")) {
416
- buffer.Append(" >> INFORMATION >> ");
417
- buffer.Append(info);
418
- }
419
- let newInfo = buffer.ToString();
420
- act.setInfo(newInfo);
421
- this._queue.put(act);
422
- Logger.Instance.WriteSupportToLog(taskInfo + ": " + newInfo, true);
423
- }
424
- }
425
- class ActivityItem {
426
- _id = 0;
427
- _type = null;
428
- _info = null;
429
- _time = null;
430
- constructor(enclosingInstance, type, id) {
431
- this._type = type;
432
- this._id = id;
433
- this.setTime();
434
- }
435
- setTime() {
436
- this._time = DateTimeUtils.ToString(DateTime.Now, FlowMonitorQueue.LongTimePattern, Logger.Instance);
437
- }
438
- setInfo(info_) {
439
- this._info = ((info_ !== null) ? XmlParser.escape(info_) : info_);
440
- }
441
- buildXML(message) {
442
- message.Append(XMLConstants.START_TAG + ConstInterface.MG_TAG_FLWMTR_ACT);
443
- message.Append(" " + XMLConstants.MG_ATTR_TYPE + "=\"" + this._type + "\"");
444
- message.Append(" " + XMLConstants.MG_ATTR_ID + "=\"" + this._id + "\"");
445
- if (this._info != null)
446
- message.Append(" " + ConstInterface.MG_ATTR_INFO + "=\"" + this._info + "\"");
447
- message.Append(" " + ConstInterface.MG_ATTR_TIME + "=\"" + this._time + "\"");
448
- message.Append(XMLConstants.TAG_TERM);
449
- }
450
- }
451
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd01vbml0b3JRdWV1ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VuZ2luZS9zcmMvdXRpbC9GbG93TW9uaXRvclF1ZXVlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxRQUFRLEVBQUUsZ0JBQWdCLEVBQWtDLEdBQUcsRUFBRSxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRyxPQUFPLEVBQUMsUUFBUSxFQUFRLE9BQU8sRUFBRSxhQUFhLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUM1RSxPQUFPLEVBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUV2SSxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFLakQsTUFBTSxPQUFPLGdCQUFnQjtJQUNuQixNQUFNLENBQUMsU0FBUyxHQUFxQixJQUFJLENBQUM7SUFDMUMsTUFBTSxDQUFDLG1CQUFtQixHQUFXLGVBQWUsQ0FBQztJQUNyRCxNQUFNLENBQUMsWUFBWSxHQUFXLFdBQVcsQ0FBQztJQUMxQyxNQUFNLENBQUMsWUFBWSxHQUFXLFFBQVEsQ0FBQztJQUN2QyxNQUFNLENBQUMsa0JBQWtCLEdBQVcsc0JBQXNCLENBQUM7SUFDM0QsTUFBTSxDQUFDLFdBQVcsR0FBVyxjQUFjLENBQUM7SUFFNUMsTUFBTSxDQUFDLFlBQVksR0FBVyxzQkFBc0IsQ0FBQztJQUNyRCxNQUFNLENBQUMsWUFBWSxHQUFXLG9CQUFvQixDQUFDO0lBQ25ELE1BQU0sQ0FBQyxZQUFZLEdBQVcsc0JBQXNCLENBQUM7SUFDckQsTUFBTSxDQUFDLFlBQVksR0FBVyxvQkFBb0IsQ0FBQztJ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QyxZQUFZLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDaEYsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsY0FBYyxDQUFDLFlBQVksR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQztRQUM5RSxPQUFPLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN4QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0Jsb2JUeXBlLCBEaXNwbGF5Q29udmVydG9yLCBGaWVsZHNUYWJsZSwgSUZsb3dNb25pdG9yUXVldWUsIFBJQywgVmVjdG9yVHlwZX0gZnJvbSAnQG1hZ2ljLXhwYS9ndWknO1xyXG5pbXBvcnQge0RhdGVUaW1lLCBMaXN0LCBOU3RyaW5nLCBTdHJpbmdCdWlsZGVyfSBmcm9tICdAbWFnaWMteHBhL21zY29yZWxpYic7XHJcbmltcG9ydCB7Q29uc3RhbnRzLCBEYXRlVGltZVV0aWxzLCBJbnRlcm5hbEludGVyZmFjZSwgTG9nZ2VyLCBRdWV1ZSwgU3RvcmFnZUF0dHJpYnV0ZSwgWE1MQ29uc3RhbnRzLCBYbWxQYXJzZXJ9IGZyb20gJ0BtYWdpYy14cGEvdXRpbHMnO1xyXG5pbXBvcnQge09wZXJhdGlvbn0gZnJvbSAnLi4vcnQvT3BlcmF0aW9uJztcclxuaW1wb3J0IHtGbG93TW9uaXRvckludGVyZmFjZX0gZnJvbSAnLi4vRmxvd01vbml0b3JJbnRlcmZhY2UnO1xyXG5pbXBvcnQge0NvbnN0SW50ZXJmYWNlfSBmcm9tICcuLi9Db25zdEludGVyZmFjZSc7XHJcbmltcG9ydCB7IFRhc2sgfSBmcm9tICcuLi90YXNrcy9UYXNrJztcclxuaW1wb3J0IHsgRmllbGQgfSBmcm9tICcuLi9kYXRhL0ZpZWxkJztcclxuXHJcbi8vIEBkeW5hbWljXHJcbmV4cG9ydCBjbGFzcyBGbG93TW9uaXRvclF1ZXVlIGltcGxlbWVudHMgSUZsb3dNb25pdG9yUXVldWUge1xyXG4gIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogRmxvd01vbml0b3JRdWV1ZSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgVU5QUklOVEFCTEVfU1RSX0xPRzogc3RyaW5nID0gXCIjVU5QUklOVEFCTEUjXCI7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgU19FVkVOVF9TVFIxOiBzdHJpbmcgPSBcIj4+U3RhcnRzIFwiO1xyXG4gIHByaXZhdGUgc3RhdGljIFNfRVZFTlRfU1RSMjogc3RyaW5nID0gXCIgRXZlbnRcIjtcclxuICBwcml2YXRlIHN0YXRpYyBTX0VWRU5UX1BST1BBR0FURUQ6IHN0cmluZyA9IFwiRXZlbnQgd2FzIHByb3BhZ2F0ZWRcIjtcclxuICBwcml2YXRlIHN0YXRpYyBFX0VWRU5UX1NUUjogc3RyaW5nID0gXCI8PEVuZHMgRXZlbnRcIjtcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgU19SRUNQUkZfU1RSOiBzdHJpbmcgPSBcIlN0YXJ0cyBSZWNvcmQgUHJlZml4XCI7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgRV9SRUNQUkZfU1RSOiBzdHJpbmcgPSBcIkVuZHMgUmVjb3JkIFByZWZpeFwiO1xyXG4gIHByaXZhdGUgc3RhdGljIFNfUkVDU1VGX1NUUjogc3RyaW5nID0gXCJTdGFydHMgUmVjb3JkIFN1ZmZpeFwiO1xyXG4gIHByaXZhdGUgc3RhdGljIEVfUkVDU1VGX1NUUjogc3RyaW5nID0gXCJFbmRzIFJlY29yZCBTdWZmaXhcIjtcclxuICBwcml2YXRlIHN0YXRpYyBTX1RBU0tTVUZfU1RSOiBzdHJpbmcgPSBcIlN0YXJ0cyBUYXNrIFN1ZmZpeFwiO1xyXG4gIHByaXZhdGUgc3RhdGljIEVfVEFTS1NVRl9TVFI6IHN0cmluZyA9IFwiRW5kcyBUYXNrIFN1ZmZpeFwiO1xyXG4gIHByaXZhdGUgc3RhdGljIFNfVEFTS1BSRl9TVFI6IHN0cmluZyA9IFwiU3RhcnRzIFRhc2sgUHJlZml4XCI7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgRV9UQVNLUFJGX1NUUjogc3RyaW5nID0gXCJFbmRzIFRhc2sgUHJlZml4XCI7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgU19DVFJMUFJGX1NUUjogc3RyaW5nID0gXCJTdGFydHMgQ29udHJvbCBQcmVmaXggLSBcIjtcclxuICBwcml2YXRlIHN0YXRpYyBFX0NUUkxQUkZfU1RSOiBzdHJpbmcgPSBcIkVuZHMgQ29udHJvbCBQcmVmaXggLSBcIjtcclxuICBwcml2YXRlIHN0YXRpYyBTX0NUUkxTVUZfU1RSOiBzdHJpbmcgPSBcIlN0YXJ0cyBDb250cm9sIFN1ZmZpeCAtIFwiO1xyXG4gIHByaXZhdGUgc3RhdGljIEVfQ1RSTFNVRl9TVFI6IHN0cmluZyA9IFwiRW5kcyBDb250cm9sIFN1ZmZpeCAtIFwiO1xyXG4gIHByaXZhdGUgc3RhdGljIFNfSEFORExFUl9TVFI6IHN0cmluZyA9IFwiU3RhcnRzIGhhbmRsaW5nIGV2ZW50IHswfVwiO1xyXG4gIHByaXZhdGUgc3RhdGljIEVfSEFORExFUl9TVFI6IHN0cmluZyA9IFwiRW5kcyBoYW5kbGluZyBldmVudCB7MH1cIjtcclxuICBwcml2YXRlIHN0YXRpYyBTX0NUUkxWRVJfU1RSOiBzdHJpbmcgPSBcIlN0YXJ0cyBDb250cm9sIFZlcmlmaWNhdGlvbiBmb3IgQ29udHJvbCAtIFwiO1xyXG4gIHByaXZhdGUgc3RhdGljIEVfQ1RSTFZFUl9TVFI6IHN0cmluZyA9IFwiRW5kcyBDb250cm9sIFZlcmlmaWNhdGlvbiBmb3IgQ29udHJvbCAtIFwiO1xyXG4gIHByaXZhdGUgc3RhdGljIFJFQ09NUF9TVFI6IHN0cmluZyA9IFwiUmVjb21wdXRlcyAtIFwiO1xyXG4gIHByaXZhdGUgc3RhdGljIFNfVkFSSUFCTEVfU1RSOiBzdHJpbmcgPSBcIlN0YXJ0cyBWYXJpYWJsZSBDaGFuZ2UgLSBcIjtcclxuICBwcml2YXRlIHN0YXRpYyBFX1ZBUklBQkxFX1NUUjogc3RyaW5nID0gXCJFbmRzIFZhcmlhYmxlIENoYW5nZSAtIFwiO1xyXG4gIHByaXZhdGUgc3RhdGljIFZBUklBQkxFX1JFQVNPTl9TVFI6IHN0cmluZyA9IFwiIC0gUmVhc29uIC0gUHJldmlvdXMgdmFsdWVcIjtcclxuXHJcblxyXG4gIHByaXZhdGUgc3RhdGljIEZMV19QRVJGSVg6IHN0cmluZyA9IFwiRmxvdyAtIFwiO1xyXG5cclxuICBwcml2YXRlIHN0YXRpYyBBQ1RfVEFTSzogc3RyaW5nID0gJ1QnO1xyXG4gIHByaXZhdGUgc3RhdGljIEFDVF9UQVNLX0ZMVzogc3RyaW5nID0gJ0YnO1xyXG4gIHByaXZhdGUgc3RhdGljIEFDVF9SRUNPTVBVVEU6IHN0cmluZyA9ICdSJztcclxuICBwcml2YXRlIHN0YXRpYyBBQ1RfRkxXX09QRVI6IHN0cmluZyA9ICdUJztcclxuXHJcbiAgc3RhdGljIExvbmdUaW1lUGF0dGVybiA9IFwiSEg6bW06c3M6U1NTXCI7XHJcbiAgcHJpdmF0ZSBfcXVldWU6IFF1ZXVlPEFjdGl2aXR5SXRlbT4gPSBuZXcgUXVldWU8QWN0aXZpdHlJdGVtPigpO1xyXG4gIHByaXZhdGUgX2VuYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9pc0Zsb3dPcGVyYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9pc1JlY29tcHV0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2lzVGFzazogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2lzVGFza0Zsb3c6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9pc0RhdGFWaWV3OiBib29sZWFuID0gZmFsc2U7XHJcbiAgU2hvdWxkU2VyaWFsaXplOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTogRmxvd01vbml0b3JRdWV1ZSB7XHJcbiAgICBpZiAoRmxvd01vbml0b3JRdWV1ZS5faW5zdGFuY2UgPT09IG51bGwpXHJcbiAgICAgIEZsb3dNb25pdG9yUXVldWUuX2luc3RhbmNlID0gbmV3IEZsb3dNb25pdG9yUXVldWUoKTtcclxuXHJcbiAgICByZXR1cm4gRmxvd01vbml0b3JRdWV1ZS5faW5zdGFuY2U7XHJcbiAgfVxyXG5cclxuICBhZGRUYXNrQ25nTW9kZShuZXdUYXNrTW9kZTogc3RyaW5nLCB0YXNrSW5mbzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgaW5mbzogc3RyaW5nID0gXCJUYXNrIE1vZGUgQ2hhbmdlIC0gXCI7XHJcbiAgICBpZiAodGhpcy5fZW5hYmxlZCAmJiB0aGlzLl9pc1Rhc2spIHtcclxuICAgICAgbGV0IGFjdGl2aXR5SXRlbTogQWN0aXZpdHlJdGVtID0gbmV3IEFjdGl2aXR5SXRlbSh0aGlzLCBGbG93TW9uaXRvclF1ZXVlLkFDVF9UQVNLLCBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfQ0hOR19NT0RFKTtcclxuXHJcbiAgICAgIHN3aXRjaCAobmV3VGFza01vZGUpIHtcclxuICAgICAgICBjYXNlIENvbnN0YW50cy5UQVNLX01PREVfTU9ESUZZOlxyXG4gICAgICAgICAgaW5mbyArPSBcIk1vZGlmeVwiO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgICBjYXNlIENvbnN0YW50cy5UQVNLX01PREVfQ1JFQVRFOlxyXG4gICAgICAgICAgaW5mbyArPSBcIkNyZWF0ZVwiO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgICBjYXNlIENvbnN0YW50cy5UQVNLX01PREVfREVMRVRFOlxyXG4gICAgICAgICAgaW5mbyArPSBcIkRlbGV0ZVwiO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgICBjYXNlIENvbnN0YW50cy5UQVNLX01PREVfUVVFUlk6XHJcbiAgICAgICAgICBpbmZvICs9IFwiUXVlcnlcIjtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGluZm8gPSBudWxsO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGFjdGl2aXR5SXRlbS5zZXRJbmZvKGluZm8pO1xyXG4gICAgICB0aGlzLl9xdWV1ZS5wdXQoYWN0aXZpdHlJdGVtKTtcclxuXHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVN1cHBvcnRUb0xvZyh0YXNrSW5mbyArXCI6IFwiICsgaW5mbywgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcGFyc2UgdGhlIGRhdGFcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIGZpbGxEYXRhKHBhcnNlcjogWG1sUGFyc2VyKTogdm9pZCB7XHJcbiAgICBsZXQgZW5kQ29udGV4dDogbnVtYmVyID0gcGFyc2VyLmdldFhNTGRhdGEoKS5pbmRleE9mKFwiLz5cIiwgcGFyc2VyLmdldEN1cnJJbmRleCgpKTtcclxuICAgIGlmIChlbmRDb250ZXh0ICE9PSAtMSAmJiBlbmRDb250ZXh0IDwgcGFyc2VyLmdldFhNTGRhdGEoKS5sZW5ndGgpIHtcclxuICAgICAgLy8gZmluZCBsYXN0IHBvc2l0aW9uIG9mIGl0cyB0YWdcclxuICAgICAgbGV0IHRhZzogc3RyaW5nID0gcGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KTtcclxuICAgICAgcGFyc2VyLmFkZDJDdXJySW5kZXgodGFnLmluZGV4T2YoXCJmbHdtdHJfY29uZmlnXCIpICsgXCJmbHdtdHJfY29uZmlnXCIubGVuZ3RoKTtcclxuXHJcbiAgICAgIGxldCB0b2tlbnM6IExpc3Q8c3RyaW5nPiA9IFhtbFBhcnNlci5nZXRUb2tlbnMocGFyc2VyLmdldFhNTHN1YnN0cmluZyhlbmRDb250ZXh0KSwgWE1MQ29uc3RhbnRzLlhNTF9BVFRSX0RFTElNKTtcclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRGV2VG9Mb2coXCJpbiBGbG93TW9uaXRvclF1ZXVlLkZpbGxEYXRhOiBcIiArIHRva2Vucy50b1N0cmluZygpKTtcclxuXHJcbiAgICAgIHRoaXMuaW5pdEVsZW1lbnRzKHRva2Vucyk7XHJcbiAgICAgIHBhcnNlci5zZXRDdXJySW5kZXgoZW5kQ29udGV4dCArIFhNTENvbnN0YW50cy5UQUdfVEVSTS5sZW5ndGgpOyAvLyB0byBkZWxldGUgXCIvPlwiIHRvb1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVFeGNlcHRpb25Ub0xvZ1dpdGhNc2coXCJpbiAgRmxvd01vbml0b3JRdWV1ZS5GaWxsRGF0YSgpIG91dCBvZiBzdHJpbmcgYm91bmRzXCIpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHBhcnNlIHRoZSBYTUwgZGF0YVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0b2tlbnNWZWN0b3JcIj5hdHRyaWJ1dGUvdmFsdWUvLi4uYXR0cmlidXRlL3ZhbHVlLyB2ZWN0b3I8L3BhcmFtPlxyXG4gIHByaXZhdGUgaW5pdEVsZW1lbnRzKHRva2Vuc1ZlY3RvcjogTGlzdDxzdHJpbmc+KTogdm9pZCB7XHJcblxyXG4gICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IHRva2Vuc1ZlY3Rvci5sZW5ndGg7IGogPSBqICsgMikge1xyXG4gICAgICBsZXQgYXR0cmlidXRlOiBzdHJpbmcgPSA8c3RyaW5nPnRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqKTtcclxuICAgICAgbGV0IHZhbHVlU3RyOiBzdHJpbmcgPSA8c3RyaW5nPnRva2Vuc1ZlY3Rvci5nZXRfSXRlbShqICsgMSk7XHJcbiAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZURldlRvTG9nKGF0dHJpYnV0ZSArIFwiIHZhbHVlOiBcIiArIHZhbHVlU3RyKTtcclxuXHJcbiAgICAgIHN3aXRjaCAoYXR0cmlidXRlKSB7XHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1RBU0s6XHJcbiAgICAgICAgICB0aGlzLl9pc1Rhc2sgPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX1RBU0tGTFc6XHJcbiAgICAgICAgICB0aGlzLl9pc1Rhc2tGbG93ID0gWG1sUGFyc2VyLmdldEJvb2xlYW4odmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0RBVEFWSUVXOlxyXG4gICAgICAgICAgdGhpcy5faXNEYXRhVmlldyA9IFhtbFBhcnNlci5nZXRCb29sZWFuKHZhbHVlU3RyKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfUkVDT01QOlxyXG4gICAgICAgICAgdGhpcy5faXNSZWNvbXB1dGUgPSBYbWxQYXJzZXIuZ2V0Qm9vbGVhbih2YWx1ZVN0cik7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBDb25zdEludGVyZmFjZS5NR19BVFRSX0ZMV09QOlxyXG4gICAgICAgICAgdGhpcy5faXNGbG93T3BlcmF0aW9uID0gWG1sUGFyc2VyLmdldEJvb2xlYW4odmFsdWVTdHIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgQ29uc3RJbnRlcmZhY2UuTUdfQVRUUl9FTkFCTEVEOlxyXG4gICAgICAgICAgdGhpcy5lbmFibGUoWG1sUGFyc2VyLmdldEJvb2xlYW4odmFsdWVTdHIpKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlRXhjZXB0aW9uVG9Mb2dXaXRoTXNnKFwiaW4gRmxvd01vbml0b3JRdWV1ZS5pbml0RWxlbWVudHMoKTogdW5rbm93biAgYXR0cmlidXRlOiBcIiArIGF0dHJpYnV0ZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGJ1aWxkIFhNTCBhbmQgZW1wdHkgdGhlIGlubmVyIHF1ZXVlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBidWlsZFhNTChtZXNzYWdlOiBTdHJpbmdCdWlsZGVyKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuX3F1ZXVlLmlzRW1wdHkoKSAmJiB0aGlzLlNob3VsZFNlcmlhbGl6ZSkge1xyXG4gICAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuU1RBUlRfVEFHICsgQ29uc3RJbnRlcmZhY2UuTUdfVEFHX0ZMV01UUl9NU0cgKyBYTUxDb25zdGFudHMuVEFHX0NMT1NFKTtcclxuXHJcbiAgICAgIHdoaWxlICghdGhpcy5fcXVldWUuaXNFbXB0eSgpKSB7XHJcbiAgICAgICAgbGV0IGN1cnJBY3Q6IEFjdGl2aXR5SXRlbSA9IDxBY3Rpdml0eUl0ZW0+dGhpcy5fcXVldWUuZ2V0KCk7XHJcbiAgICAgICAgY3VyckFjdC5idWlsZFhNTChtZXNzYWdlKTtcclxuICAgICAgfSAvLyBmaWxsIGFjdGl2aXRpZXNcclxuXHJcbiAgICAgIG1lc3NhZ2UuQXBwZW5kKFwiPC9cIiArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19GTFdNVFJfTVNHICsgWE1MQ29uc3RhbnRzLlRBR19DTE9TRSk7XHJcbiAgICB9IC8vIHRoZSBxdWV1ZSBpcyBub3QgZW1wdHlcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBpcyB0aGUgRmxvdyBNb25pdG9yIFF1ZXVlIGVtcHR5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBpc0VtcHR5KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3F1ZXVlLmlzRW1wdHkoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBlbmFibGUgdGhlIGZsb3cgbW9uaXRvclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPnRoZSBwcmV2aW91cyBzdGF0ZSAoZW5hYmxlZC9kaXNhYmxlZCk8L3JldHVybnM+XHJcbiAgZW5hYmxlKHZhbHVlOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgd2FzRW5hYmxlZDogYm9vbGVhbiA9IHRoaXMuX2VuYWJsZWQ7XHJcbiAgICB0aGlzLl9lbmFibGVkID0gdmFsdWU7XHJcbiAgICB0aGlzLlNob3VsZFNlcmlhbGl6ZSA9IHRoaXMuX2VuYWJsZWQ7XHJcbiAgICByZXR1cm4gd2FzRW5hYmxlZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBhZGQgQWN0aXZpdGllcyB0byB0aGUgcXVldWVcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwidHJpZ2dlcmVkQnlcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3RhdGVcIj5vZiB0aGUgZXZlbnQgdGFzayBhY3Rpdml0aWU8L3BhcmFtPlxyXG4gIGFkZFRhc2tFdmVudCh0cmlnZ2VyZWRCeTogc3RyaW5nLCBzdGF0ZTogbnVtYmVyLCB0YXNrSW5mbzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fZW5hYmxlZCAmJiB0aGlzLl9pc1Rhc2spIHtcclxuICAgICAgbGV0IGFjdDogQWN0aXZpdHlJdGVtID0gbmV3IEFjdGl2aXR5SXRlbSh0aGlzLCBGbG93TW9uaXRvclF1ZXVlLkFDVF9UQVNLLCBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfRVZFTlQpO1xyXG5cclxuICAgICAgbGV0IGluZm86IHN0cmluZztcclxuICAgICAgc3dpdGNoIChzdGF0ZSkge1xyXG4gICAgICAgIGNhc2UgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1NUQVJUOlxyXG4gICAgICAgICAgaW5mbyA9IEZsb3dNb25pdG9yUXVldWUuU19FVkVOVF9TVFIxICsgdHJpZ2dlcmVkQnkgKyBGbG93TW9uaXRvclF1ZXVlLlNfRVZFTlRfU1RSMjtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9FTkQ6XHJcbiAgICAgICAgICBpbmZvID0gRmxvd01vbml0b3JRdWV1ZS5FX0VWRU5UX1NUUiArIHRyaWdnZXJlZEJ5O1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1BST1BBR0FURTpcclxuICAgICAgICAgIGluZm8gPSBGbG93TW9uaXRvclF1ZXVlLlNfRVZFTlRfUFJPUEFHQVRFRDtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgaW5mbyA9IG51bGw7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgYWN0LnNldEluZm8oaW5mbyk7XHJcbiAgICAgIHRoaXMuX3F1ZXVlLnB1dChhY3QpO1xyXG5cclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlU3VwcG9ydFRvTG9nKHRhc2tJbmZvICtcIjogXCIgKyBpbmZvLCB0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwZW5kVmlydHVhbHNBbmRQYXJhbWV0ZXJzKGN1cnJlbnRWYWx1ZXM6IHN0cmluZykgOiB2b2lkXHJcbiAge1xyXG4gICAgbGV0IGFjdDogQWN0aXZpdHlJdGVtID0gbmV3IEFjdGl2aXR5SXRlbSh0aGlzLCBGbG93TW9uaXRvclF1ZXVlLkFDVF9UQVNLX0ZMVywgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVgpO1xyXG4gICAgYWN0LnNldEluZm8oY3VycmVudFZhbHVlcyk7XHJcbiAgICB0aGlzLl9xdWV1ZS5wdXQoYWN0KTtcclxuICB9XHJcblxyXG4gIC8vIC8vLyA8c3VtbWFyeT5cclxuICAvLyAvLy8gICBhZGQgdmlydHVhbCBhbmQgcGFyYW1ldGVyIGluZm9ybWF0aW9uIGFuZCBzZW5kIGl0IHRvIHNlcnZlciBvbiByZWNvcmQgcHJlZml4XHJcbiAgLy8gLy8vIDwvc3VtbWFyeT5cclxuICAvLyAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj5cclxuICAvLyAvLy8gPC9wYXJhbT5cclxuICBhZGREYXRhVmlld0Zsb3codGFzazogVGFzaykgOiB2b2lkXHJcbiAgeyBcclxuICAgICAgaWYgKHRoaXMuX2lzRGF0YVZpZXcpXHJcbiAgICAgIHtcclxuICAgICAgICAgIGxldCBmbGRUYWI6IEZpZWxkc1RhYmxlID0gdGFzay5EYXRhVmlldy5HZXRGaWVsZHNUYWIoKTtcclxuICAgICAgICAgIGxldCBwcmVwYXJlZERpc3BsYXlTdHJpbmc6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgICBsZXQgZmluYWxkaXNwbGF5RGF0YTogc3RyaW5nID0gXCJcXG5cIjtcclxuICAgICAgICAgIGxldCBmbGRWYWx1ZTogc3RyaW5nO1xyXG4gICAgICAgICAgbGV0IGRhdGE6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgZmxkVGFiLmdldFNpemUoKTsgaSsrKVxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGxldCBmbGREZWY6IEZpZWxkID0gPEZpZWxkPmZsZFRhYi5nZXRGaWVsZChpKTtcclxuICAgICAgICAgICAgICBpZiAoIWZsZERlZi5Jc0V2ZW50SGFuZGxlckZpZWxkICYmIChmbGREZWYuSXNWaXJ0dWFsICYmICFmbGREZWYuVmlyQXNSZWFsKSB8fCBmbGREZWYuaXNQYXJhbSgpKVxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgZmxkVmFsdWUgPSBmbGREZWYuaXNOdWxsKCkgPyBmbGREZWYuZ2V0TnVsbFZhbHVlKCkgOiBmbGREZWYuZ2V0VmFsdWUodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgIGRhdGEgPSB0aGlzLmdldEZpZWxkRGF0YShmbGREZWYuZ2V0VHlwZSgpLCBmbGRWYWx1ZSwgZmxkRGVmLmdldFBpY3R1cmUoKSwgZmxkRGVmLmdldENlbGxzVHlwZSgpLCB0YXNrKTtcclxuICAgICAgICAgICAgICAgICAgcHJlcGFyZWREaXNwbGF5U3RyaW5nID0gdGhpcy5QcmVwYXJlRGlzcGxheVN0cmluZyhmbGREZWYuaXNQYXJhbSgpLCBmbGREZWYuZ2V0VmFyTmFtZSgpLCBkYXRhLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgZmluYWxkaXNwbGF5RGF0YSA9IGZpbmFsZGlzcGxheURhdGEgKyBwcmVwYXJlZERpc3BsYXlTdHJpbmcgKyBcIlxcblwiO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuYXBwZW5kVmlydHVhbHNBbmRQYXJhbWV0ZXJzKGZpbmFsZGlzcGxheURhdGEpO1xyXG4gICAgICB9XHJcbiAgIH1cclxuXHJcbiAgLy8gLy8vIDxzdW1tYXJ5PlxyXG4gIC8vIC8vLyAgIEdldCB2aXJ0dWFscyBhbmQgcGFyYW1ldGVyIHZhbHVlcy5cclxuICAvLyAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vIC8vLyA8cGFyYW0gbmFtZSA9IFwiU3RvcmFnZXR5cGVcIj48L3BhcmFtPlxyXG4gIC8vIC8vLyA8cGFyYW0gbmFtZSA9IFwiZGF0YVwiPjwvcGFyYW0+XHJcbiAgLy8gLy8vIDxwYXJhbSBuYW1lID0gXCJwaWN0dXJlXCI+PC9wYXJhbT5cclxuICAvLyAvLy8gPHBhcmFtIG5hbWUgPSBcInZlY0NlbGxUeXBlXCI+PC9wYXJhbT5cclxuICAvLyAvLy8gPHBhcmFtIG5hbWUgPSBcInRhc2tcIj48L3BhcmFtPlxyXG4gIC8vIC8vLyA8L3BhcmFtPlxyXG4gIHByaXZhdGUgZ2V0RmllbGREYXRhKFN0b3JhZ2V0eXBlOiBTdG9yYWdlQXR0cmlidXRlLCBkYXRhOiBzdHJpbmcsIHBpY3R1cmU6IHN0cmluZywgdmVjQ2VsbFR5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUsIHRhc2s6IFRhc2spOiBzdHJpbmdcclxuICB7XHJcbiAgICAgIHN3aXRjaCAoU3RvcmFnZXR5cGUpXHJcbiAgICAgIHtcclxuICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5ET1RORVQ6XHJcbiAgICAgICAgICAgICAgZGF0YSA9IEZsb3dNb25pdG9yUXVldWUuVU5QUklOVEFCTEVfU1RSX0xPRztcclxuICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQjpcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZihCbG9iVHlwZS5pc1ZhbGlkQmxvYihkYXRhKSlcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnRUeXBlOiBzdHJpbmcgPSBCbG9iVHlwZS5nZXRDb250ZW50VHlwZShkYXRhKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlID09IEJsb2JUeXBlLkNPTlRFTlRfVFlQRV9BTlNJIHx8IGNvbnRlbnRUeXBlID09IEJsb2JUeXBlLkNPTlRFTlRfVFlQRV9VTklDT0RFKVxyXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEgIT0gbnVsbCA/IEJsb2JUeXBlLmdldFN0cmluZyhkYXRhKSA6IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBGbG93TW9uaXRvclF1ZXVlLlVOUFJJTlRBQkxFX1NUUl9MT0c7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgIGRhdGEgPSBcIlwiO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQzpcclxuICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5EQVRFOlxyXG4gICAgICAgICAgY2FzZSBTdG9yYWdlQXR0cmlidXRlLlRJTUU6XHJcbiAgICAgICAgICAgICAgbGV0IGNvbnY6IERpc3BsYXlDb252ZXJ0b3I9IERpc3BsYXlDb252ZXJ0b3IuSW5zdGFuY2U7XHJcbiAgICAgICAgICAgICAgZGF0YSA9IGNvbnYubWcyZGlzcChkYXRhLCBcIiBcIiwgbmV3IFBJQyhwaWN0dXJlLCBTdG9yYWdldHlwZSwgdGFzay5nZXRDb21wSWR4KCkpLCBmYWxzZSwgdGFzay5nZXRDb21wSWR4KCksIGZhbHNlKTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQkxPQl9WRUNUT1I6XHJcbiAgICAgICAgICAgICAgbGV0IHZlY091dERhdGE6IHN0cmluZztcclxuICAgICAgICAgICAgICBpZiAoZGF0YSA9PSBudWxsKVxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgdmVjT3V0RGF0YSA9IFwiW11cIjtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgbGV0IGNlbGxBdHQ6IFN0b3JhZ2VBdHRyaWJ1dGUgPSB2ZWNDZWxsVHlwZTtcclxuICAgICAgICAgICAgICAgICAgbGV0IHZlY3RvcjogVmVjdG9yVHlwZSA9IG5ldyBWZWN0b3JUeXBlKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAoY2VsbEF0dCA9PSBTdG9yYWdlQXR0cmlidXRlLkJMT0IgJiYgIVZlY3RvclR5cGUudmFsaWRhdGVCbG9iQ29udGVudHMoZGF0YSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICB2ZWNPdXREYXRhID0gXCJbXVwiO1xyXG4gICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGxldCB2ZWNTaXplOiBudW1iZXIgPSBWZWN0b3JUeXBlLmdldFZlY1NpemUoZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgY2VsbFBpY3R1cmU6IHN0cmluZyA9IChjZWxsQXR0ID09IFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQyB8fCBjZWxsQXR0ID09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSB8fCBjZWxsQXR0ID09IFN0b3JhZ2VBdHRyaWJ1dGUuVElNRSkgPyBQSUMuYnVpbGRQaWN0dXJlKGNlbGxBdHQsIHZlY3Rvci5nZXRWZWNDZWxsKDEpLCB0YXNrLmdldENvbXBJZHgoKSwgdHJ1ZSkuZ2V0Rm9ybWF0KCkgOiBwaWN0dXJlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgdmVjT3V0RGF0YSA9IFwiW1wiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA6IG51bWJlciA9IDA7IGkgPCB2ZWNTaXplOyBpKyspXHJcbiAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjT3V0RGF0YSArPSB0aGlzLmdldEZpZWxkRGF0YShjZWxsQXR0LCB2ZWN0b3IuZ2V0VmVjQ2VsbChpICsgMSksIGNlbGxQaWN0dXJlLCB2ZWNDZWxsVHlwZSwgdGFzayk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjT3V0RGF0YSArPSBpIDwgdmVjU2l6ZSAtIDEgPyBcIixcIiA6IFwiXVwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGRhdGEgPSB2ZWNPdXREYXRhO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5CT09MRUFOOlxyXG4gICAgICAgICAgICAgIGRhdGEgPSBkYXRhID09IFwiMVwiID8gXCJUUlVFXCIgOiBcIkZBTFNFXCI7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgUHJlcGFyZSBkaXNwbGF5IHN0cmluZyB0aGF0IHdpbGwgYmUgc2VudCB0byB0aGUgc2VydmVyIG9uIHJlY29yZCBwcmVmaXguXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm1vZGVcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwibmFtZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ2YWx1ZUNvbnRlbnRcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYWRkRG91YmxlUXVvdGVzXCI+PC9wYXJhbT5cclxuICAvLy8gPC9wYXJhbT5cclxuICBwcml2YXRlIFByZXBhcmVEaXNwbGF5U3RyaW5nKG1vZGU6IGJvb2xlYW4sIG5hbWU6IHN0cmluZywgdmFsdWVDb250ZW50OiBzdHJpbmcsIGFkZERvdWJsZVF1b3RlczogYm9vbGVhbik6IHN0cmluZ1xyXG4gIHtcclxuICAgICAgbGV0ICBzdHI6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgIGxldCBmaW5hbFN0cmluZ1RvRGlzcGxheTogc3RyaW5nID0gXCJcIjtcclxuICAgICAgaWYgKGFkZERvdWJsZVF1b3RlcylcclxuICAgICAgICAgIGZpbmFsU3RyaW5nVG9EaXNwbGF5ID0gZmluYWxTdHJpbmdUb0Rpc3BsYXkgKyBcIlxcXCJcIjtcclxuICAgICAgZmluYWxTdHJpbmdUb0Rpc3BsYXkgPSBmaW5hbFN0cmluZ1RvRGlzcGxheSArIG5hbWU7XHJcbiAgICAgIGlmIChhZGREb3VibGVRdW90ZXMpXHJcbiAgICAgICAgICBmaW5hbFN0cmluZ1RvRGlzcGxheSA9IGZpbmFsU3RyaW5nVG9EaXNwbGF5ICsgXCJcXFwiXCI7XHJcblxyXG4gICAgICBsZXQgcGFkZGVkTmFtZSA9IHRoaXMucGFkUmlnaHQobmFtZSwzNCk7XHJcbiAgICAgIGxldCBmb3JtYXRPZlN0cmluZ1ZpcnR1YWw6c3RyaW5nID0gYFZpcnR1YWxgIDsvLzogJHtwYWRkZWROYW1lfSA6ICR7dmFsdWVDb250ZW50fWA7XHJcbiAgICAgIGxldCBmb3JtYXRPZlN0cmluZ1BhcmFtZXRlcjogc3RyaW5nID0gYFBhcmFtZXRlcmA7Ly9gIDogJHtwYWRkZWROYW1lfSA6ICR7dmFsdWVDb250ZW50fWA7XHJcbiAgICAgXHJcbiAgICAgIHN0ciA9IChtb2RlID8gZm9ybWF0T2ZTdHJpbmdQYXJhbWV0ZXIgOiBmb3JtYXRPZlN0cmluZ1ZpcnR1YWwpICsgXCIgOiBcIiArYCR7cGFkZGVkTmFtZX1gKyBcIiA6IFwiK2Ake3ZhbHVlQ29udGVudC50cmltKCl9YDtcclxuXHJcbiAgICAgIHJldHVybiBzdHI7XHJcbiAgfVxyXG5cclxuICAgcHJpdmF0ZSBwYWRSaWdodCA9IChzdHJpbmc6IHN0cmluZywgbGVuZ3RoOiBudW1iZXIsIGNoYXJhY3Rlcjogc3RyaW5nID0gJyAnKTogc3RyaW5nID0+IHtcclxuICAgIGxldCByZXN1bHQgPSBcIlwiO1xyXG4gICAgbGV0IHRvdGFsTGVuZ3RoID0gbGVuZ3RoIC0gc3RyaW5nLmxlbmd0aDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG90YWxMZW5ndGg7IGkrKykge1xyXG4gICAgICByZXN1bHQgPSBjaGFyYWN0ZXIgKyByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICByZXN1bHQgPSByZXN1bHQgKyBzdHJpbmc7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH07XHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIGFkZCB0YXNrIGZsb3cgZm9yIHJlY29yZCBwcmVmaXggb3Igc3VmaXhcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWRcIj5pcyBGTFdNVFJfUFJFRklYIG9yIEZMV01UUl9TVUZGSVhcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN0YXRlXCI+b2YgdGhlIGV2ZW50IHRhc2sgYWN0aXZpdGllXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgYWRkVGFza0Zsb3dSZWMoaWQ6IG51bWJlciwgc3RhdGU6IG51bWJlciwgdGFza0luZm86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2VuYWJsZWQgJiYgdGhpcy5faXNUYXNrRmxvdykge1xyXG4gICAgICBsZXQgaW5mbzogc3RyaW5nO1xyXG5cclxuICAgICAgc3dpdGNoIChpZCkge1xyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1JFQ19QUkVGSVg6XHJcbiAgICAgICAgICBpbmZvID0gc3RhdGUgPT09IEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9TVEFSVFxyXG4gICAgICAgICAgICA/IEZsb3dNb25pdG9yUXVldWUuU19SRUNQUkZfU1RSXHJcbiAgICAgICAgICAgIDogRmxvd01vbml0b3JRdWV1ZS5FX1JFQ1BSRl9TVFI7XHJcbiAgICAgICAgICBpZCA9IEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9QUkVGSVg7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBJbnRlcm5hbEludGVyZmFjZS5NR19BQ1RfUkVDX1NVRkZJWDpcclxuICAgICAgICAgIGluZm8gPSBzdGF0ZSA9PT0gRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1NUQVJUXHJcbiAgICAgICAgICAgID8gRmxvd01vbml0b3JRdWV1ZS5TX1JFQ1NVRl9TVFJcclxuICAgICAgICAgICAgOiBGbG93TW9uaXRvclF1ZXVlLkVfUkVDU1VGX1NUUjtcclxuICAgICAgICAgIGlkID0gRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1NVRkZJWDtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9UQVNLX1BSRUZJWDpcclxuICAgICAgICAgIGluZm8gPSBzdGF0ZSA9PT0gRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1NUQVJUXHJcbiAgICAgICAgICAgID8gRmxvd01vbml0b3JRdWV1ZS5TX1RBU0tQUkZfU1RSXHJcbiAgICAgICAgICAgIDogRmxvd01vbml0b3JRdWV1ZS5FX1RBU0tQUkZfU1RSO1xyXG4gICAgICAgICAgaWQgPSBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfUFJFRklYO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1RBU0tfU1VGRklYOlxyXG4gICAgICAgICAgaW5mbyA9IHN0YXRlID09PSBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfU1RBUlRcclxuICAgICAgICAgICAgPyBGbG93TW9uaXRvclF1ZXVlLlNfVEFTS1NVRl9TVFJcclxuICAgICAgICAgICAgOiBGbG93TW9uaXRvclF1ZXVlLkVfVEFTS1NVRl9TVFI7XHJcbiAgICAgICAgICBpZCA9IEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9TVUZGSVg7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGluZm8gPSBudWxsO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBhY3Q6IEFjdGl2aXR5SXRlbSA9IG5ldyBBY3Rpdml0eUl0ZW0odGhpcywgRmxvd01vbml0b3JRdWV1ZS5BQ1RfVEFTS19GTFcsIGlkKTtcclxuICAgICAgYWN0LnNldEluZm8oaW5mbyk7XHJcbiAgICAgIHRoaXMuX3F1ZXVlLnB1dChhY3QpO1xyXG5cclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlU3VwcG9ydFRvTG9nKHRhc2tJbmZvICtcIjogXCIgKyBpbmZvLCB0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWRcIj5pcyBNR19BQ1RfVkFSSUFCTEU8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiZmxkTmFtZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzdGF0ZVwiPm9mIHRoZSBldmVudCB0YXNrIGFjdGl2aXRpZTwvcGFyYW0+XHJcbiAgYWRkVGFza0Zsb3dGbGQoaWQ6IG51bWJlciwgZmxkTmFtZTogc3RyaW5nLCBzdGF0ZTogbnVtYmVyLCB0YXNrSW5mbzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmFkZFRhc2tGbG93Q3RybChpZCwgZmxkTmFtZSwgc3RhdGUsIHRhc2tJbmZvKTtcclxuICB9XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaWRcIj5pcyBGTFdNVFJfQ1RSTF9QUkVGSVggb3IgRkxXTVRSX0NUUkxfU1VGRklYPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImN0cmxOYW1lXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcInN0YXRlXCI+b2YgdGhlIGV2ZW50IHRhc2sgYWN0aXZpdGllPC9wYXJhbT5cclxuICBhZGRUYXNrRmxvd0N0cmwoaWQ6IG51bWJlciwgY3RybE5hbWU6IHN0cmluZywgc3RhdGU6IG51bWJlciwgdGFza0luZm86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2VuYWJsZWQgJiYgdGhpcy5faXNUYXNrRmxvdykge1xyXG4gICAgICBsZXQgaW5mbzogc3RyaW5nO1xyXG5cclxuICAgICAgc3dpdGNoIChpZCkge1xyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX1ZBUklBQkxFOlxyXG4gICAgICAgICAgaW5mbyA9IHN0YXRlID09PSBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfU1RBUlRcclxuICAgICAgICAgICAgPyBGbG93TW9uaXRvclF1ZXVlLlNfVkFSSUFCTEVfU1RSXHJcbiAgICAgICAgICAgIDogRmxvd01vbml0b3JRdWV1ZS5FX1ZBUklBQkxFX1NUUjtcclxuICAgICAgICAgIGlkID0gRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1ZBUkNIR19WQUxVRTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1BSRUZJWDpcclxuICAgICAgICAgIGluZm8gPSBzdGF0ZSA9PT0gRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1NUQVJUXHJcbiAgICAgICAgICAgID8gRmxvd01vbml0b3JRdWV1ZS5TX0NUUkxQUkZfU1RSXHJcbiAgICAgICAgICAgIDogRmxvd01vbml0b3JRdWV1ZS5FX0NUUkxQUkZfU1RSO1xyXG4gICAgICAgICAgaWQgPSBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfQ1RSTF9QUkVGSVg7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcblxyXG4gICAgICAgIGNhc2UgSW50ZXJuYWxJbnRlcmZhY2UuTUdfQUNUX0NUUkxfU1VGRklYOlxyXG4gICAgICAgICAgaW5mbyA9IHN0YXRlID09PSBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfU1RBUlRcclxuICAgICAgICAgICAgPyBGbG93TW9uaXRvclF1ZXVlLlNfQ1RSTFNVRl9TVFJcclxuICAgICAgICAgICAgOiBGbG93TW9uaXRvclF1ZXVlLkVfQ1RSTFNVRl9TVFI7XHJcbiAgICAgICAgICBpZCA9IEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9DVFJMX1NVRkZJWDtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlIEludGVybmFsSW50ZXJmYWNlLk1HX0FDVF9DVFJMX1ZFUklGSUNBVElPTjpcclxuICAgICAgICAgIGluZm8gPSBzdGF0ZSA9PT0gRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1NUQVJUXHJcbiAgICAgICAgICAgID8gRmxvd01vbml0b3JRdWV1ZS5TX0NUUkxWRVJfU1RSXHJcbiAgICAgICAgICAgIDogRmxvd01vbml0b3JRdWV1ZS5FX0NUUkxWRVJfU1RSO1xyXG4gICAgICAgICAgaWQgPSBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfQ1RSTF9TVUZGSVg7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGluZm8gPSBudWxsO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBhY3Q6IEFjdGl2aXR5SXRlbSA9IG5ldyBBY3Rpdml0eUl0ZW0odGhpcywgRmxvd01vbml0b3JRdWV1ZS5BQ1RfVEFTS19GTFcsIGlkKTtcclxuICAgICAgaWYgKGluZm8gIT09IG51bGwpIHtcclxuICAgICAgICBpbmZvID0gaW5mbyArIGN0cmxOYW1lO1xyXG4gICAgICAgIGlmIChpZCA9PT0gRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1ZBUkNIR19WQUxVRSAmJiBzdGF0ZSA9PT0gRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1NUQVJUKVxyXG4gICAgICAgICAgaW5mbyA9IGluZm8gKyBGbG93TW9uaXRvclF1ZXVlLlZBUklBQkxFX1JFQVNPTl9TVFI7XHJcbiAgICAgICAgYWN0LnNldEluZm8oaW5mbyk7XHJcbiAgICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlU3VwcG9ydFRvTG9nKHRhc2tJbmZvICtcIjogXCIgKyBpbmZvLCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9xdWV1ZS5wdXQoYWN0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaGFuZGxlcklkXCI+aXNpZCBvZiB0aGUgaGFuZGxlclxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3RhdGVcIj5vZiB0aGUgZXZlbnQgdGFzayBhY3Rpdml0aWVcclxuICAvLy8gPC9wYXJhbT5cclxuICBhZGRUYXNrRmxvd0hhbmRsZXIoaGFuZGxlcklkOiBzdHJpbmcsIHN0YXRlOiBudW1iZXIsIHRhc2tJbmZvOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9lbmFibGVkICYmIHRoaXMuX2lzVGFza0Zsb3cpIHtcclxuICAgICAgbGV0IGFjdDogQWN0aXZpdHlJdGVtID0gbmV3IEFjdGl2aXR5SXRlbSh0aGlzLCBGbG93TW9uaXRvclF1ZXVlLkFDVF9UQVNLX0ZMVywgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1RTS19IQU5ETEVSKTtcclxuICAgICAgbGV0IGluZm86IHN0cmluZztcclxuXHJcbiAgICAgIHN3aXRjaCAoc3RhdGUpIHtcclxuICAgICAgICBjYXNlIEZsb3dNb25pdG9ySW50ZXJmYWNlLkZMV01UUl9TVEFSVDpcclxuICAgICAgICAgIGluZm8gPSBOU3RyaW5nLkZvcm1hdChGbG93TW9uaXRvclF1ZXVlLlNfSEFORExFUl9TVFIsIGhhbmRsZXJJZCk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSBGbG93TW9uaXRvckludGVyZmFjZS5GTFdNVFJfRU5EOlxyXG4gICAgICAgICAgaW5mbyA9IE5TdHJpbmcuRm9ybWF0KEZsb3dNb25pdG9yUXVldWUuRV9IQU5ETEVSX1NUUiwgaGFuZGxlcklkKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgaW5mbyA9IG51bGw7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGluZm8gIT09IG51bGwpIHtcclxuICAgICAgICAvLyBCUktfTEVWRUxfSEFORExFUl9JTlRFUk5BTCxCUktfTEVWRUxfSEFORExFUl9TWVNURU0sQlJLX0xFVkVMX0hBTkRMRVJfVElNRVJcclxuICAgICAgICAvLyBCUktfTEVWRUxfSEFORExFUl9FWFBSRVNTSU9OLEJSS19MRVZFTF9IQU5ETEVSX0VSUk9SLEJSS19MRVZFTF9IQU5ETEVSX1VTRVJcclxuICAgICAgICBhY3Quc2V0SW5mbyhpbmZvKTtcclxuICAgICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTdXBwb3J0VG9Mb2codGFza0luZm8gK1wiOiBcIiArIGluZm8sIHRydWUpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX3F1ZXVlLnB1dChhY3QpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0cmlnZ2VyZWRCeVZhck5hbWVcIj52YXIgbmFtZSAsIGhhcyB0cmlnZ2VyZWQgUmVjb21wdXRlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgYWRkUmVjb21wdXRlKHRyaWdnZXJlZEJ5VmFyTmFtZTogc3RyaW5nLCB0YXNrSW5mbzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fZW5hYmxlZCAmJiB0aGlzLl9pc1JlY29tcHV0ZSkge1xyXG4gICAgICBsZXQgYWN0OiBBY3Rpdml0eUl0ZW0gPSBuZXcgQWN0aXZpdHlJdGVtKHRoaXMsIEZsb3dNb25pdG9yUXVldWUuQUNUX1JFQ09NUFVURSwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1JFQ09NUCk7XHJcbiAgICAgIGxldCBpbmZvID0gRmxvd01vbml0b3JRdWV1ZS5SRUNPTVBfU1RSICsgdHJpZ2dlcmVkQnlWYXJOYW1lO1xyXG4gICAgICBhY3Quc2V0SW5mbyhpbmZvKTtcclxuICAgICAgdGhpcy5fcXVldWUucHV0KGFjdCk7XHJcblxyXG4gICAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTdXBwb3J0VG9Mb2codGFza0luZm8gK1wiOiBcIiArIGluZm8sIHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIEFkZCBhIGZpZWxkIGZsb3cgb3BlcmF0aW9uIGFjdGl2aXR5IGl0ZW0uXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcIm9wZXJcIj5UaGUgb3BlcmF0aW9uIGJlaW5nIGxvZ2dlZC48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiYkV4ZWN1dGVkXCI+V2lsbCB0aGUgb3BlcmF0aW9uIGJlIGV4ZWN1dGVkLjwvcGFyYW0+XHJcbiAgYXN5bmMgYWRkRmxvd0ZpZWxkT3BlcmF0aW9uKG9wZXI6IE9wZXJhdGlvbiwgYkV4ZWN1dGVkOiBib29sZWFuLCB0YXNrSW5mbzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5fZW5hYmxlZCAmJiB0aGlzLl9pc0Zsb3dPcGVyYXRpb24pIHtcclxuICAgICAgbGV0IGFjdDogQWN0aXZpdHlJdGVtID0gbmV3IEFjdGl2aXR5SXRlbSh0aGlzLCBGbG93TW9uaXRvclF1ZXVlLkFDVF9GTFdfT1BFUiwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX0RBVEFfT1BFUik7XHJcbiAgICAgIGxldCBidWZmZXI6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcihGbG93TW9uaXRvclF1ZXVlLkZMV19QRVJGSVgpO1xyXG4gICAgICBhd2FpdCBvcGVyLkFkZEZsb3dEZXNjcmlwdGlvbihidWZmZXIpO1xyXG4gICAgICBidWZmZXIuQXBwZW5kKCcgJyk7XHJcblxyXG5cclxuICAgICAgaWYgKCFiRXhlY3V0ZWQpXHJcbiAgICAgICAgYnVmZmVyLkFwcGVuZChcIltOb3QgRXhlY3V0ZWRdXCIpO1xyXG5cclxuICAgICAgbGV0IGluZm8gPSBidWZmZXIuVG9TdHJpbmcoKTtcclxuICAgICAgYWN0LnNldEluZm8oaW5mbyk7XHJcbiAgICAgIHRoaXMuX3F1ZXVlLnB1dChhY3QpO1xyXG5cclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlU3VwcG9ydFRvTG9nKHRhc2tJbmZvICtcIjogXCIgKyBpbmZvLCB0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwic3RhdGVcIj5vZiB0aGUgdXBkYXRlXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgYWRkRmxvd09wZXJhdGlvblVwZGF0ZShzdGF0ZTogbnVtYmVyLCB0YXNrSW5mbzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fZW5hYmxlZCAmJiB0aGlzLl9pc0Zsb3dPcGVyYXRpb24pIHtcclxuICAgICAgbGV0IGFjdDogQWN0aXZpdHlJdGVtID0gbmV3IEFjdGl2aXR5SXRlbSh0aGlzLCBGbG93TW9uaXRvclF1ZXVlLkFDVF9GTFdfT1BFUiwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX0RBVEFfT1BFUik7IC8vIE1HX09QRVJfVVBEQVRFXHJcbiAgICAgIGxldCBpbmZvOiBzdHJpbmc7XHJcbiAgICAgIGlmIChzdGF0ZSA9PT0gRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX1NUQVJUKVxyXG4gICAgICAgIGluZm8gPSBcIlN0YXJ0cyBVcGRhdGVcIjtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIGluZm8gPSAgXCJFbmRzIFVwZGF0ZVwiO1xyXG5cclxuICAgICAgYWN0LnNldEluZm8oaW5mbyk7XHJcbiAgICAgIHRoaXMuX3F1ZXVlLnB1dChhY3QpO1xyXG5cclxuICAgICAgTG9nZ2VyLkluc3RhbmNlLldyaXRlU3VwcG9ydFRvTG9nKHRhc2tJbmZvICtcIjogXCIgKyBpbmZvLCB0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaW5mb1wiPnN0cmluZyBwYXNzZWQgdG8gc3RhdHVzIGxpbmUgdmVyaWZ5IGFjdGlvbjwvcGFyYW0+XHJcbiAgYWRkRmxvd1ZlcmlmeUluZm8oaW5mbzogc3RyaW5nLCB0YXNrSW5mbzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmFkZEZsb3dJbmZvKGluZm8sIHRhc2tJbmZvKTtcclxuICB9XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaW5mb1wiPnN0cmluZyBhZGRlZCB0byBmbG93IG1vbml0b3IgcXVldWUgZm9yIEludm9rZU9zPC9wYXJhbT5cclxuICBhZGRGbG93SW52b2tlT3NJbmZvKGluZm86IHN0cmluZywgdGFza0luZm86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5hZGRGbG93SW5mbyhpbmZvLCB0YXNrSW5mbyk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgdXNlciBzdHJpbmcgcGFzc2VkIHRvIHN0YXR1cyBsaW5lIGZvciBhY3Rpb25zXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWUgPSBcImluZm9cIj5cclxuICAvLy8gPC9wYXJhbT5cclxuICBwcml2YXRlIGFkZEZsb3dJbmZvKGluZm86IHN0cmluZywgdGFza0luZm86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLl9lbmFibGVkKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgbGV0IGFjdDogQWN0aXZpdHlJdGVtID0gbmV3IEFjdGl2aXR5SXRlbSh0aGlzLCBGbG93TW9uaXRvclF1ZXVlLkFDVF9GTFdfT1BFUiwgRmxvd01vbml0b3JJbnRlcmZhY2UuRkxXTVRSX0RBVEFfT1BFUik7XHJcbiAgICBsZXQgYnVmZmVyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoXCJcIik7XHJcblxyXG4gICAgaWYgKCEoaW5mbyA9PT0gXCJcIikpIHtcclxuICAgICAgYnVmZmVyLkFwcGVuZChcIiA+PiBJTkZPUk1BVElPTiA+PiBcIik7XHJcbiAgICAgIGJ1ZmZlci5BcHBlbmQoaW5mbyk7XHJcbiAgICB9XHJcbiAgICBsZXQgbmV3SW5mbyA9IGJ1ZmZlci5Ub1N0cmluZygpO1xyXG4gICAgYWN0LnNldEluZm8obmV3SW5mbyk7XHJcbiAgICB0aGlzLl9xdWV1ZS5wdXQoYWN0KTtcclxuXHJcbiAgICBMb2dnZXIuSW5zdGFuY2UuV3JpdGVTdXBwb3J0VG9Mb2codGFza0luZm8gK1wiOiBcIiArIG5ld0luZm8sIHRydWUpO1xyXG4gIH1cclxufVxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gICBhbGwgaW5mb3JtYXRpb24gYWJvdXQgY3VycmVudCBBY3Rpdml0eVxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5jbGFzcyBBY3Rpdml0eUl0ZW0ge1xyXG4gIHByaXZhdGUgX2lkOiBudW1iZXIgPSAwO1xyXG4gIHByaXZhdGUgX3R5cGU6IHN0cmluZyA9IG51bGw7IC8vIEFDVFlfVEFTS3xBQ1RfVEFTS19GTFd8QUNUX0RBVEFWSUVXfEFDVF9SRUNPTVBVVEV8QUNUX0ZMV19PUEVSXHJcbiAgcHJpdmF0ZSBfaW5mbzogc3RyaW5nID0gbnVsbDtcclxuICBwcml2YXRlIF90aW1lOiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICBjb25zdHJ1Y3RvcihlbmNsb3NpbmdJbnN0YW5jZTogRmxvd01vbml0b3JRdWV1ZSwgdHlwZTogc3RyaW5nLCBpZDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl90eXBlID0gdHlwZTtcclxuICAgIHRoaXMuX2lkID0gaWQ7XHJcbiAgICB0aGlzLnNldFRpbWUoKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzYXZlIGN1cnJlbnQgdGltZSBpbiB0aGUgbmVlZGVkIGZvcm1hdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgcHJpdmF0ZSBzZXRUaW1lKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fdGltZSA9IERhdGVUaW1lVXRpbHMuVG9TdHJpbmcoRGF0ZVRpbWUuTm93LCBGbG93TW9uaXRvclF1ZXVlLkxvbmdUaW1lUGF0dGVybiwgTG9nZ2VyLkluc3RhbmNlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBzZXQgYWRkZWQgaW5mb3JtYXRpb24gZm9yIHRoZSBhY3Rpdml0eVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgc2V0SW5mbyhpbmZvXzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLl9pbmZvID0gKChpbmZvXyAhPT0gbnVsbCkgPyBYbWxQYXJzZXIuZXNjYXBlKGluZm9fKSA6IGluZm9fKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBidWlsZCBYTUwgc3RyaW5nIGZvciB0aGUgYWN0aXZpdHkgaXRlbVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgYnVpbGRYTUwobWVzc2FnZTogU3RyaW5nQnVpbGRlcik6IHZvaWQge1xyXG4gICAgbWVzc2FnZS5BcHBlbmQoWE1MQ29uc3RhbnRzLlNUQVJUX1RBRyArIENvbnN0SW50ZXJmYWNlLk1HX1RBR19GTFdNVFJfQUNUKTtcclxuICAgIG1lc3NhZ2UuQXBwZW5kKFwiIFwiICsgWE1MQ29uc3RhbnRzLk1HX0FUVFJfVFlQRSArIFwiPVxcXCJcIiArIHRoaXMuX3R5cGUgKyBcIlxcXCJcIik7XHJcbiAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIFhNTENvbnN0YW50cy5NR19BVFRSX0lEICsgXCI9XFxcIlwiICsgdGhpcy5faWQgKyBcIlxcXCJcIik7XHJcbiAgICBpZiAodGhpcy5faW5mbyAhPSBudWxsKVxyXG4gICAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfSU5GTyArIFwiPVxcXCJcIiArIHRoaXMuX2luZm8gKyBcIlxcXCJcIik7XHJcbiAgICBtZXNzYWdlLkFwcGVuZChcIiBcIiArIENvbnN0SW50ZXJmYWNlLk1HX0FUVFJfVElNRSArIFwiPVxcXCJcIiArIHRoaXMuX3RpbWUgKyBcIlxcXCJcIik7XHJcbiAgICBtZXNzYWdlLkFwcGVuZChYTUxDb25zdGFudHMuVEFHX1RFUk0pO1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -1,70 +0,0 @@
1
- export class HeapSort {
2
- static left(i) {
3
- return 2 * i + 1;
4
- }
5
- static right(i) {
6
- return 2 * i + 2;
7
- }
8
- static sort(array) {
9
- let sortsize = array.length;
10
- let temp;
11
- let largest, i, l, r;
12
- if (sortsize <= 1)
13
- return;
14
- let top = sortsize - 1;
15
- let t = Math.floor(sortsize / 2);
16
- do {
17
- t = t - 1;
18
- largest = t;
19
- do {
20
- i = largest;
21
- l = HeapSort.left(largest);
22
- r = HeapSort.right(largest);
23
- if (l <= top) {
24
- if (array[l].CompareTo(array[i]) > 0)
25
- largest = l;
26
- }
27
- if (r <= top) {
28
- if (array[r].CompareTo(array[largest]) > 0)
29
- largest = r;
30
- }
31
- if (largest !== i) {
32
- temp = array[largest];
33
- array[largest] = array[i];
34
- array[i] = temp;
35
- }
36
- } while (largest !== i);
37
- } while (t > 0);
38
- t = sortsize;
39
- do {
40
- top = top - 1;
41
- t = t - 1;
42
- let here = t;
43
- temp = array[here];
44
- array[here] = array[0];
45
- array[0] = temp;
46
- largest = 0;
47
- do {
48
- i = largest;
49
- l = HeapSort.left(largest);
50
- r = HeapSort.right(largest);
51
- if (l <= top) {
52
- if (array[l].CompareTo(array[i]) > 0) {
53
- largest = l;
54
- }
55
- }
56
- if (r <= top) {
57
- if (array[r].CompareTo(array[largest]) > 0) {
58
- largest = r;
59
- }
60
- }
61
- if (largest !== i) {
62
- temp = array[largest];
63
- array[largest] = array[i];
64
- array[i] = temp;
65
- }
66
- } while (largest !== i);
67
- } while (t > 1);
68
- }
69
- }
70
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGVhcFNvcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbmdpbmUvc3JjL3V0aWwvSGVhcFNvcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsTUFBTSxPQUFPLFFBQVE7SUFDWCxNQUFNLENBQUMsSUFBSSxDQUFDLENBQVM7UUFDM0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuQixDQUFDO0lBRU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFTO1FBQzVCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkIsQ0FBQztJQUtELE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBb0I7UUFDOUIsSUFBSSxRQUFRLEdBQVcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUNwQyxJQUFJLElBQWlCLENBQUM7UUFDdEIsSUFBSSxPQUFlLEVBQUUsQ0FBUyxFQUFFLENBQVMsRUFBRSxDQUFTLENBQUM7UUFFckQsSUFBSSxRQUFRLElBQUksQ0FBQztZQUNmLE9BQU87UUFFVCxJQUFJLEdBQUcsR0FBVyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxHQUFXLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRXpDLEdBQUc7WUFDRCxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNWLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFJWixHQUFHO2dCQUNELENBQUMsR0FBRyxPQUFPLENBQUM7Z0JBQ1osQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzNCLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUU1QixJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUU7b0JBQ1osSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7d0JBQ2xDLE9BQU8sR0FBRyxDQUFDLENBQUM7aUJBQ2Y7Z0JBQ0QsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFO29CQUNaLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDO3dCQUN4QyxPQUFPLEdBQUcsQ0FBQyxDQUFDO2lCQUNmO2dCQUNELElBQUksT0FBTyxLQUFLLENBQUMsRUFBRTtvQkFDakIsSUFBSSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDdEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDMUIsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztpQkFDakI7YUFDRixRQUNNLE9BQU8sS0FBSyxDQUFDLEVBQUU7U0FDdkIsUUFDTSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBRWQsQ0FBQyxHQUFHLFFBQVEsQ0FBQztRQUViLEdBQUc7WUFDRCxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUNkLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRVYsSUFBSSxJQUFJLEdBQVcsQ0FBQyxDQUFDO1lBRXJCLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkIsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2QixLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBRWhCLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFFWixHQUFHO2dCQUNELENBQUMsR0FBRyxPQUFPLENBQUM7Z0JBQ1osQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzNCLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUU1QixJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUU7b0JBQ1osSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRTt3QkFDcEMsT0FBTyxHQUFHLENBQUMsQ0FBQztxQkFDYjtpQkFDRjtnQkFDRCxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUU7b0JBQ1osSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRTt3QkFDMUMsT0FBTyxHQUFHLENBQUMsQ0FBQztxQkFDYjtpQkFDRjtnQkFDRCxJQUFJLE9BQU8sS0FBSyxDQUFDLEVBQUU7b0JBQ2pCLElBQUksR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ3RCLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzFCLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7aUJBQ2pCO2FBQ0YsUUFDTSxPQUFPLEtBQUssQ0FBQyxFQUFFO1NBQ3ZCLFFBQ00sQ0FBQyxHQUFHLENBQUMsRUFBRTtJQUNoQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0lDb21wYXJhYmxlfSBmcm9tIFwiQG1hZ2ljLXhwYS9tc2NvcmVsaWJcIjtcclxuXHJcbi8vLyA8c3VtbWFyeT5DbGFzcyBmb3IgSkFWQSAxLjEgY29udGFpbmluZyBzdGF0aWMgbWV0aG9kcyB0byBzb3J0IGFuIGFyYml0cmFyeSBhcnJheVxyXG4vLy8gb2YgSkFWQSBvYmplY3RzIHdoaWNoIGltcGxlbWVudCB0aGUgSUNvbXBhcmFibGUgaW50ZXJmYWNlLlxyXG4vLy8gPC9zdW1tYXJ5PlxyXG5leHBvcnQgY2xhc3MgSGVhcFNvcnQge1xyXG4gIHByaXZhdGUgc3RhdGljIGxlZnQoaTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiAyICogaSArIDE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyByaWdodChpOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIDIgKiBpICsgMjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5Tb3J0IGFycmF5LCByZWFycmFuZ2luZyB0aGUgZW50cmllcyBpbiBhcnJheSB0byBiZSBpblxyXG4gIC8vLyBzb3J0ZWQgb3JkZXIuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBzdGF0aWMgc29ydChhcnJheTogSUNvbXBhcmFibGVbXSk6IHZvaWQge1xyXG4gICAgbGV0IHNvcnRzaXplOiBudW1iZXIgPSBhcnJheS5sZW5ndGg7XHJcbiAgICBsZXQgdGVtcDogSUNvbXBhcmFibGU7XHJcbiAgICBsZXQgbGFyZ2VzdDogbnVtYmVyLCBpOiBudW1iZXIsIGw6IG51bWJlciwgcjogbnVtYmVyO1xyXG5cclxuICAgIGlmIChzb3J0c2l6ZSA8PSAxKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgbGV0IHRvcDogbnVtYmVyID0gc29ydHNpemUgLSAxO1xyXG4gICAgbGV0IHQ6IG51bWJlciA9IE1hdGguZmxvb3Ioc29ydHNpemUgLyAyKTtcclxuXHJcbiAgICBkbyB7XHJcbiAgICAgIHQgPSB0IC0gMTtcclxuICAgICAgbGFyZ2VzdCA9IHQ7XHJcblxyXG4gICAgICAvKiBoZWFwaWZ5ICovXHJcblxyXG4gICAgICBkbyB7XHJcbiAgICAgICAgaSA9IGxhcmdlc3Q7XHJcbiAgICAgICAgbCA9IEhlYXBTb3J0LmxlZnQobGFyZ2VzdCk7XHJcbiAgICAgICAgciA9IEhlYXBTb3J0LnJpZ2h0KGxhcmdlc3QpO1xyXG5cclxuICAgICAgICBpZiAobCA8PSB0b3ApIHtcclxuICAgICAgICAgIGlmIChhcnJheVtsXS5Db21wYXJlVG8oYXJyYXlbaV0pID4gMClcclxuICAgICAgICAgICAgbGFyZ2VzdCA9IGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyIDw9IHRvcCkge1xyXG4gICAgICAgICAgaWYgKGFycmF5W3JdLkNvbXBhcmVUbyhhcnJheVtsYXJnZXN0XSkgPiAwKVxyXG4gICAgICAgICAgICBsYXJnZXN0ID0gcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGxhcmdlc3QgIT09IGkpIHtcclxuICAgICAgICAgIHRlbXAgPSBhcnJheVtsYXJnZXN0XTtcclxuICAgICAgICAgIGFycmF5W2xhcmdlc3RdID0gYXJyYXlbaV07XHJcbiAgICAgICAgICBhcnJheVtpXSA9IHRlbXA7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHdoaWxlIChsYXJnZXN0ICE9PSBpKTtcclxuICAgIH1cclxuICAgIHdoaWxlICh0ID4gMCk7XHJcblxyXG4gICAgdCA9IHNvcnRzaXplO1xyXG5cclxuICAgIGRvIHtcclxuICAgICAgdG9wID0gdG9wIC0gMTtcclxuICAgICAgdCA9IHQgLSAxO1xyXG5cclxuICAgICAgbGV0IGhlcmU6IG51bWJlciA9IHQ7XHJcblxyXG4gICAgICB0ZW1wID0gYXJyYXlbaGVyZV07XHJcbiAgICAgIGFycmF5W2hlcmVdID0gYXJyYXlbMF07XHJcbiAgICAgIGFycmF5WzBdID0gdGVtcDtcclxuXHJcbiAgICAgIGxhcmdlc3QgPSAwO1xyXG5cclxuICAgICAgZG8ge1xyXG4gICAgICAgIGkgPSBsYXJnZXN0O1xyXG4gICAgICAgIGwgPSBIZWFwU29ydC5sZWZ0KGxhcmdlc3QpO1xyXG4gICAgICAgIHIgPSBIZWFwU29ydC5yaWdodChsYXJnZXN0KTtcclxuXHJcbiAgICAgICAgaWYgKGwgPD0gdG9wKSB7XHJcbiAgICAgICAgICBpZiAoYXJyYXlbbF0uQ29tcGFyZVRvKGFycmF5W2ldKSA+IDApIHtcclxuICAgICAgICAgICAgbGFyZ2VzdCA9IGw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyIDw9IHRvcCkge1xyXG4gICAgICAgICAgaWYgKGFycmF5W3JdLkNvbXBhcmVUbyhhcnJheVtsYXJnZXN0XSkgPiAwKSB7XHJcbiAgICAgICAgICAgIGxhcmdlc3QgPSByO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobGFyZ2VzdCAhPT0gaSkge1xyXG4gICAgICAgICAgdGVtcCA9IGFycmF5W2xhcmdlc3RdO1xyXG4gICAgICAgICAgYXJyYXlbbGFyZ2VzdF0gPSBhcnJheVtpXTtcclxuICAgICAgICAgIGFycmF5W2ldID0gdGVtcDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgd2hpbGUgKGxhcmdlc3QgIT09IGkpO1xyXG4gICAgfVxyXG4gICAgd2hpbGUgKHQgPiAxKTtcclxuICB9XHJcbn1cclxuXHJcbiJdfQ==