@cartanova/qgrid-cli 2.4.8 → 2.5.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 (735) hide show
  1. package/README.ko.md +18 -11
  2. package/README.md +18 -11
  3. package/bundle/.env +0 -0
  4. package/bundle/dist/_virtual/{_@oxc-project_runtime@0.122.0/helpers → _@oxc-project_runtime@0.140.0/helpers/esm}/decorate.js +2 -2
  5. package/bundle/dist/_virtual/{_@oxc-project_runtime@0.122.0/helpers → _@oxc-project_runtime@0.140.0/helpers/esm}/decorateMetadata.js +2 -2
  6. package/bundle/dist/_virtual/_rolldown/runtime.js +2 -3
  7. package/bundle/dist/application/monit/log-buffer.js +3 -2
  8. package/bundle/dist/application/monit/monit.frame.js +5 -6
  9. package/bundle/dist/application/monit/monit.types.js +1 -2
  10. package/bundle/dist/application/qgrid/conv-routing.js +1 -2
  11. package/bundle/dist/application/qgrid/oauth.js +1 -2
  12. package/bundle/dist/application/qgrid/qgrid-image-generation.js +1 -2
  13. package/bundle/dist/application/qgrid/qgrid-response-format.js +1 -2
  14. package/bundle/dist/application/qgrid/qgrid-run-lifecycle.js +76 -47
  15. package/bundle/dist/application/qgrid/qgrid.dispatcher.js +1 -2
  16. package/bundle/dist/application/qgrid/qgrid.frame.js +73 -97
  17. package/bundle/dist/application/qgrid/qgrid.types.js +11 -10
  18. package/bundle/dist/application/qgrid/token-subscriber.js +3 -2
  19. package/bundle/dist/application/qgrid/token-trigger-setup.js +1 -2
  20. package/bundle/dist/application/qgrid/tool-emulation.js +1 -2
  21. package/bundle/dist/application/queries.generated.js +1 -2
  22. package/bundle/dist/application/request-log/request-log.model.js +116 -47
  23. package/bundle/dist/application/request-log/request-log.types.js +1 -2
  24. package/bundle/dist/application/request-log-step/request-log-step.model.js +3 -4
  25. package/bundle/dist/application/request-log-step/request-log-step.types.js +1 -2
  26. package/bundle/dist/application/sonamu.generated.js +14 -15
  27. package/bundle/dist/application/sonamu.generated.sso.js +1 -2
  28. package/bundle/dist/application/token/token.model.js +3 -4
  29. package/bundle/dist/application/token/token.types.js +1 -2
  30. package/bundle/dist/codex-protocol/AbsolutePathBuf.js +0 -1
  31. package/bundle/dist/codex-protocol/AgentPath.js +0 -1
  32. package/bundle/dist/codex-protocol/ApplyPatchApprovalParams.js +0 -1
  33. package/bundle/dist/codex-protocol/ApplyPatchApprovalResponse.js +0 -1
  34. package/bundle/dist/codex-protocol/AuthMode.js +0 -1
  35. package/bundle/dist/codex-protocol/ClientInfo.js +0 -1
  36. package/bundle/dist/codex-protocol/ClientNotification.js +0 -1
  37. package/bundle/dist/codex-protocol/ClientRequest.js +0 -1
  38. package/bundle/dist/codex-protocol/CollaborationMode.js +0 -1
  39. package/bundle/dist/codex-protocol/ContentItem.js +0 -1
  40. package/bundle/dist/codex-protocol/ConversationGitInfo.js +0 -1
  41. package/bundle/dist/codex-protocol/ConversationSummary.js +0 -1
  42. package/bundle/dist/codex-protocol/ExecCommandApprovalParams.js +0 -1
  43. package/bundle/dist/codex-protocol/ExecCommandApprovalResponse.js +0 -1
  44. package/bundle/dist/codex-protocol/ExecPolicyAmendment.js +0 -1
  45. package/bundle/dist/codex-protocol/FileChange.js +0 -1
  46. package/bundle/dist/codex-protocol/ForcedLoginMethod.js +0 -1
  47. package/bundle/dist/codex-protocol/FunctionCallOutputBody.js +0 -1
  48. package/bundle/dist/codex-protocol/FunctionCallOutputContentItem.js +0 -1
  49. package/bundle/dist/codex-protocol/FuzzyFileSearchMatchType.js +0 -1
  50. package/bundle/dist/codex-protocol/FuzzyFileSearchParams.js +0 -1
  51. package/bundle/dist/codex-protocol/FuzzyFileSearchResponse.js +0 -1
  52. package/bundle/dist/codex-protocol/FuzzyFileSearchResult.js +0 -1
  53. package/bundle/dist/codex-protocol/FuzzyFileSearchSessionCompletedNotification.js +0 -1
  54. package/bundle/dist/codex-protocol/FuzzyFileSearchSessionUpdatedNotification.js +0 -1
  55. package/bundle/dist/codex-protocol/GetAuthStatusParams.js +0 -1
  56. package/bundle/dist/codex-protocol/GetAuthStatusResponse.js +0 -1
  57. package/bundle/dist/codex-protocol/GetConversationSummaryParams.js +0 -1
  58. package/bundle/dist/codex-protocol/GetConversationSummaryResponse.js +0 -1
  59. package/bundle/dist/codex-protocol/GitDiffToRemoteParams.js +0 -1
  60. package/bundle/dist/codex-protocol/GitDiffToRemoteResponse.js +0 -1
  61. package/bundle/dist/codex-protocol/GitSha.js +0 -1
  62. package/bundle/dist/codex-protocol/ImageDetail.js +0 -1
  63. package/bundle/dist/codex-protocol/InitializeCapabilities.js +0 -1
  64. package/bundle/dist/codex-protocol/InitializeParams.js +0 -1
  65. package/bundle/dist/codex-protocol/InitializeResponse.js +0 -1
  66. package/bundle/dist/codex-protocol/InputModality.js +0 -1
  67. package/bundle/dist/codex-protocol/InternalSessionSource.js +0 -1
  68. package/bundle/dist/codex-protocol/LocalShellAction.js +0 -1
  69. package/bundle/dist/codex-protocol/LocalShellExecAction.js +0 -1
  70. package/bundle/dist/codex-protocol/LocalShellStatus.js +0 -1
  71. package/bundle/dist/codex-protocol/MessagePhase.js +0 -1
  72. package/bundle/dist/codex-protocol/ModeKind.js +0 -1
  73. package/bundle/dist/codex-protocol/NetworkPolicyAmendment.js +0 -1
  74. package/bundle/dist/codex-protocol/NetworkPolicyRuleAction.js +0 -1
  75. package/bundle/dist/codex-protocol/ParsedCommand.js +0 -1
  76. package/bundle/dist/codex-protocol/Personality.js +0 -1
  77. package/bundle/dist/codex-protocol/PlanType.js +0 -1
  78. package/bundle/dist/codex-protocol/RealtimeConversationVersion.js +0 -1
  79. package/bundle/dist/codex-protocol/RealtimeOutputModality.js +0 -1
  80. package/bundle/dist/codex-protocol/RealtimeVoice.js +0 -1
  81. package/bundle/dist/codex-protocol/RealtimeVoicesList.js +0 -1
  82. package/bundle/dist/codex-protocol/ReasoningEffort.js +0 -1
  83. package/bundle/dist/codex-protocol/ReasoningItemContent.js +0 -1
  84. package/bundle/dist/codex-protocol/ReasoningItemReasoningSummary.js +0 -1
  85. package/bundle/dist/codex-protocol/ReasoningSummary.js +0 -1
  86. package/bundle/dist/codex-protocol/RequestId.js +0 -1
  87. package/bundle/dist/codex-protocol/Resource.js +0 -1
  88. package/bundle/dist/codex-protocol/ResourceContent.js +0 -1
  89. package/bundle/dist/codex-protocol/ResourceTemplate.js +0 -1
  90. package/bundle/dist/codex-protocol/ResponseItem.js +0 -1
  91. package/bundle/dist/codex-protocol/ReviewDecision.js +0 -1
  92. package/bundle/dist/codex-protocol/ServerNotification.js +0 -1
  93. package/bundle/dist/codex-protocol/ServerRequest.js +0 -1
  94. package/bundle/dist/codex-protocol/SessionSource.js +0 -1
  95. package/bundle/dist/codex-protocol/Settings.js +0 -1
  96. package/bundle/dist/codex-protocol/SubAgentSource.js +0 -1
  97. package/bundle/dist/codex-protocol/ThreadId.js +0 -1
  98. package/bundle/dist/codex-protocol/ThreadMemoryMode.js +0 -1
  99. package/bundle/dist/codex-protocol/Tool.js +0 -1
  100. package/bundle/dist/codex-protocol/Verbosity.js +0 -1
  101. package/bundle/dist/codex-protocol/WebSearchAction.js +0 -1
  102. package/bundle/dist/codex-protocol/WebSearchContextSize.js +0 -1
  103. package/bundle/dist/codex-protocol/WebSearchLocation.js +0 -1
  104. package/bundle/dist/codex-protocol/WebSearchMode.js +0 -1
  105. package/bundle/dist/codex-protocol/WebSearchToolConfig.js +0 -1
  106. package/bundle/dist/codex-protocol/index.js +0 -1
  107. package/bundle/dist/codex-protocol/serde_json/JsonValue.js +0 -1
  108. package/bundle/dist/codex-protocol/v2/Account.js +0 -1
  109. package/bundle/dist/codex-protocol/v2/AccountLoginCompletedNotification.js +0 -1
  110. package/bundle/dist/codex-protocol/v2/AccountRateLimitsUpdatedNotification.js +0 -1
  111. package/bundle/dist/codex-protocol/v2/AccountUpdatedNotification.js +0 -1
  112. package/bundle/dist/codex-protocol/v2/ActivePermissionProfile.js +0 -1
  113. package/bundle/dist/codex-protocol/v2/ActivePermissionProfileModification.js +0 -1
  114. package/bundle/dist/codex-protocol/v2/AddCreditsNudgeCreditType.js +0 -1
  115. package/bundle/dist/codex-protocol/v2/AddCreditsNudgeEmailStatus.js +0 -1
  116. package/bundle/dist/codex-protocol/v2/AdditionalFileSystemPermissions.js +0 -1
  117. package/bundle/dist/codex-protocol/v2/AdditionalNetworkPermissions.js +0 -1
  118. package/bundle/dist/codex-protocol/v2/AdditionalPermissionProfile.js +0 -1
  119. package/bundle/dist/codex-protocol/v2/AgentMessageDeltaNotification.js +0 -1
  120. package/bundle/dist/codex-protocol/v2/AnalyticsConfig.js +0 -1
  121. package/bundle/dist/codex-protocol/v2/AppBranding.js +0 -1
  122. package/bundle/dist/codex-protocol/v2/AppInfo.js +0 -1
  123. package/bundle/dist/codex-protocol/v2/AppListUpdatedNotification.js +0 -1
  124. package/bundle/dist/codex-protocol/v2/AppMetadata.js +0 -1
  125. package/bundle/dist/codex-protocol/v2/AppReview.js +0 -1
  126. package/bundle/dist/codex-protocol/v2/AppScreenshot.js +0 -1
  127. package/bundle/dist/codex-protocol/v2/AppSummary.js +0 -1
  128. package/bundle/dist/codex-protocol/v2/AppToolApproval.js +0 -1
  129. package/bundle/dist/codex-protocol/v2/AppToolsConfig.js +0 -1
  130. package/bundle/dist/codex-protocol/v2/ApprovalsReviewer.js +0 -1
  131. package/bundle/dist/codex-protocol/v2/AppsConfig.js +0 -1
  132. package/bundle/dist/codex-protocol/v2/AppsDefaultConfig.js +0 -1
  133. package/bundle/dist/codex-protocol/v2/AppsListParams.js +0 -1
  134. package/bundle/dist/codex-protocol/v2/AppsListResponse.js +0 -1
  135. package/bundle/dist/codex-protocol/v2/AskForApproval.js +0 -1
  136. package/bundle/dist/codex-protocol/v2/AutoReviewDecisionSource.js +0 -1
  137. package/bundle/dist/codex-protocol/v2/ByteRange.js +0 -1
  138. package/bundle/dist/codex-protocol/v2/CancelLoginAccountParams.js +0 -1
  139. package/bundle/dist/codex-protocol/v2/CancelLoginAccountResponse.js +0 -1
  140. package/bundle/dist/codex-protocol/v2/CancelLoginAccountStatus.js +0 -1
  141. package/bundle/dist/codex-protocol/v2/ChatgptAuthTokensRefreshParams.js +0 -1
  142. package/bundle/dist/codex-protocol/v2/ChatgptAuthTokensRefreshReason.js +0 -1
  143. package/bundle/dist/codex-protocol/v2/ChatgptAuthTokensRefreshResponse.js +0 -1
  144. package/bundle/dist/codex-protocol/v2/CodexErrorInfo.js +0 -1
  145. package/bundle/dist/codex-protocol/v2/CollabAgentState.js +0 -1
  146. package/bundle/dist/codex-protocol/v2/CollabAgentStatus.js +0 -1
  147. package/bundle/dist/codex-protocol/v2/CollabAgentTool.js +0 -1
  148. package/bundle/dist/codex-protocol/v2/CollabAgentToolCallStatus.js +0 -1
  149. package/bundle/dist/codex-protocol/v2/CollaborationModeMask.js +0 -1
  150. package/bundle/dist/codex-protocol/v2/CommandAction.js +0 -1
  151. package/bundle/dist/codex-protocol/v2/CommandExecOutputDeltaNotification.js +0 -1
  152. package/bundle/dist/codex-protocol/v2/CommandExecOutputStream.js +0 -1
  153. package/bundle/dist/codex-protocol/v2/CommandExecParams.js +0 -1
  154. package/bundle/dist/codex-protocol/v2/CommandExecResizeParams.js +0 -1
  155. package/bundle/dist/codex-protocol/v2/CommandExecResizeResponse.js +0 -1
  156. package/bundle/dist/codex-protocol/v2/CommandExecResponse.js +0 -1
  157. package/bundle/dist/codex-protocol/v2/CommandExecTerminalSize.js +0 -1
  158. package/bundle/dist/codex-protocol/v2/CommandExecTerminateParams.js +0 -1
  159. package/bundle/dist/codex-protocol/v2/CommandExecTerminateResponse.js +0 -1
  160. package/bundle/dist/codex-protocol/v2/CommandExecWriteParams.js +0 -1
  161. package/bundle/dist/codex-protocol/v2/CommandExecWriteResponse.js +0 -1
  162. package/bundle/dist/codex-protocol/v2/CommandExecutionApprovalDecision.js +0 -1
  163. package/bundle/dist/codex-protocol/v2/CommandExecutionOutputDeltaNotification.js +0 -1
  164. package/bundle/dist/codex-protocol/v2/CommandExecutionRequestApprovalParams.js +0 -1
  165. package/bundle/dist/codex-protocol/v2/CommandExecutionRequestApprovalResponse.js +0 -1
  166. package/bundle/dist/codex-protocol/v2/CommandExecutionSource.js +0 -1
  167. package/bundle/dist/codex-protocol/v2/CommandExecutionStatus.js +0 -1
  168. package/bundle/dist/codex-protocol/v2/CommandMigration.js +0 -1
  169. package/bundle/dist/codex-protocol/v2/Config.js +0 -1
  170. package/bundle/dist/codex-protocol/v2/ConfigBatchWriteParams.js +0 -1
  171. package/bundle/dist/codex-protocol/v2/ConfigEdit.js +0 -1
  172. package/bundle/dist/codex-protocol/v2/ConfigLayer.js +0 -1
  173. package/bundle/dist/codex-protocol/v2/ConfigLayerMetadata.js +0 -1
  174. package/bundle/dist/codex-protocol/v2/ConfigLayerSource.js +0 -1
  175. package/bundle/dist/codex-protocol/v2/ConfigReadParams.js +0 -1
  176. package/bundle/dist/codex-protocol/v2/ConfigReadResponse.js +0 -1
  177. package/bundle/dist/codex-protocol/v2/ConfigRequirements.js +0 -1
  178. package/bundle/dist/codex-protocol/v2/ConfigRequirementsReadResponse.js +0 -1
  179. package/bundle/dist/codex-protocol/v2/ConfigValueWriteParams.js +0 -1
  180. package/bundle/dist/codex-protocol/v2/ConfigWarningNotification.js +0 -1
  181. package/bundle/dist/codex-protocol/v2/ConfigWriteResponse.js +0 -1
  182. package/bundle/dist/codex-protocol/v2/ConfiguredHookHandler.js +0 -1
  183. package/bundle/dist/codex-protocol/v2/ConfiguredHookMatcherGroup.js +0 -1
  184. package/bundle/dist/codex-protocol/v2/ContextCompactedNotification.js +0 -1
  185. package/bundle/dist/codex-protocol/v2/CreditsSnapshot.js +0 -1
  186. package/bundle/dist/codex-protocol/v2/DeprecationNoticeNotification.js +0 -1
  187. package/bundle/dist/codex-protocol/v2/DynamicToolCallOutputContentItem.js +0 -1
  188. package/bundle/dist/codex-protocol/v2/DynamicToolCallParams.js +0 -1
  189. package/bundle/dist/codex-protocol/v2/DynamicToolCallResponse.js +0 -1
  190. package/bundle/dist/codex-protocol/v2/DynamicToolCallStatus.js +0 -1
  191. package/bundle/dist/codex-protocol/v2/DynamicToolSpec.js +0 -1
  192. package/bundle/dist/codex-protocol/v2/ErrorNotification.js +0 -1
  193. package/bundle/dist/codex-protocol/v2/ExecPolicyAmendment.js +0 -1
  194. package/bundle/dist/codex-protocol/v2/ExperimentalFeature.js +0 -1
  195. package/bundle/dist/codex-protocol/v2/ExperimentalFeatureEnablementSetParams.js +0 -1
  196. package/bundle/dist/codex-protocol/v2/ExperimentalFeatureEnablementSetResponse.js +0 -1
  197. package/bundle/dist/codex-protocol/v2/ExperimentalFeatureListParams.js +0 -1
  198. package/bundle/dist/codex-protocol/v2/ExperimentalFeatureListResponse.js +0 -1
  199. package/bundle/dist/codex-protocol/v2/ExperimentalFeatureStage.js +0 -1
  200. package/bundle/dist/codex-protocol/v2/ExternalAgentConfigDetectParams.js +0 -1
  201. package/bundle/dist/codex-protocol/v2/ExternalAgentConfigDetectResponse.js +0 -1
  202. package/bundle/dist/codex-protocol/v2/ExternalAgentConfigImportCompletedNotification.js +0 -1
  203. package/bundle/dist/codex-protocol/v2/ExternalAgentConfigImportParams.js +0 -1
  204. package/bundle/dist/codex-protocol/v2/ExternalAgentConfigImportResponse.js +0 -1
  205. package/bundle/dist/codex-protocol/v2/ExternalAgentConfigMigrationItem.js +0 -1
  206. package/bundle/dist/codex-protocol/v2/ExternalAgentConfigMigrationItemType.js +0 -1
  207. package/bundle/dist/codex-protocol/v2/FeedbackUploadParams.js +0 -1
  208. package/bundle/dist/codex-protocol/v2/FeedbackUploadResponse.js +0 -1
  209. package/bundle/dist/codex-protocol/v2/FileChangeApprovalDecision.js +0 -1
  210. package/bundle/dist/codex-protocol/v2/FileChangeOutputDeltaNotification.js +0 -1
  211. package/bundle/dist/codex-protocol/v2/FileChangePatchUpdatedNotification.js +0 -1
  212. package/bundle/dist/codex-protocol/v2/FileChangeRequestApprovalParams.js +0 -1
  213. package/bundle/dist/codex-protocol/v2/FileChangeRequestApprovalResponse.js +0 -1
  214. package/bundle/dist/codex-protocol/v2/FileSystemAccessMode.js +0 -1
  215. package/bundle/dist/codex-protocol/v2/FileSystemPath.js +0 -1
  216. package/bundle/dist/codex-protocol/v2/FileSystemSandboxEntry.js +0 -1
  217. package/bundle/dist/codex-protocol/v2/FileSystemSpecialPath.js +0 -1
  218. package/bundle/dist/codex-protocol/v2/FileUpdateChange.js +0 -1
  219. package/bundle/dist/codex-protocol/v2/FsChangedNotification.js +0 -1
  220. package/bundle/dist/codex-protocol/v2/FsCopyParams.js +0 -1
  221. package/bundle/dist/codex-protocol/v2/FsCopyResponse.js +0 -1
  222. package/bundle/dist/codex-protocol/v2/FsCreateDirectoryParams.js +0 -1
  223. package/bundle/dist/codex-protocol/v2/FsCreateDirectoryResponse.js +0 -1
  224. package/bundle/dist/codex-protocol/v2/FsGetMetadataParams.js +0 -1
  225. package/bundle/dist/codex-protocol/v2/FsGetMetadataResponse.js +0 -1
  226. package/bundle/dist/codex-protocol/v2/FsReadDirectoryEntry.js +0 -1
  227. package/bundle/dist/codex-protocol/v2/FsReadDirectoryParams.js +0 -1
  228. package/bundle/dist/codex-protocol/v2/FsReadDirectoryResponse.js +0 -1
  229. package/bundle/dist/codex-protocol/v2/FsReadFileParams.js +0 -1
  230. package/bundle/dist/codex-protocol/v2/FsReadFileResponse.js +0 -1
  231. package/bundle/dist/codex-protocol/v2/FsRemoveParams.js +0 -1
  232. package/bundle/dist/codex-protocol/v2/FsRemoveResponse.js +0 -1
  233. package/bundle/dist/codex-protocol/v2/FsUnwatchParams.js +0 -1
  234. package/bundle/dist/codex-protocol/v2/FsUnwatchResponse.js +0 -1
  235. package/bundle/dist/codex-protocol/v2/FsWatchParams.js +0 -1
  236. package/bundle/dist/codex-protocol/v2/FsWatchResponse.js +0 -1
  237. package/bundle/dist/codex-protocol/v2/FsWriteFileParams.js +0 -1
  238. package/bundle/dist/codex-protocol/v2/FsWriteFileResponse.js +0 -1
  239. package/bundle/dist/codex-protocol/v2/GetAccountParams.js +0 -1
  240. package/bundle/dist/codex-protocol/v2/GetAccountRateLimitsResponse.js +0 -1
  241. package/bundle/dist/codex-protocol/v2/GetAccountResponse.js +0 -1
  242. package/bundle/dist/codex-protocol/v2/GitInfo.js +0 -1
  243. package/bundle/dist/codex-protocol/v2/GrantedPermissionProfile.js +0 -1
  244. package/bundle/dist/codex-protocol/v2/GuardianApprovalReview.js +0 -1
  245. package/bundle/dist/codex-protocol/v2/GuardianApprovalReviewAction.js +0 -1
  246. package/bundle/dist/codex-protocol/v2/GuardianApprovalReviewStatus.js +0 -1
  247. package/bundle/dist/codex-protocol/v2/GuardianCommandSource.js +0 -1
  248. package/bundle/dist/codex-protocol/v2/GuardianRiskLevel.js +0 -1
  249. package/bundle/dist/codex-protocol/v2/GuardianUserAuthorization.js +0 -1
  250. package/bundle/dist/codex-protocol/v2/GuardianWarningNotification.js +0 -1
  251. package/bundle/dist/codex-protocol/v2/HookCompletedNotification.js +0 -1
  252. package/bundle/dist/codex-protocol/v2/HookErrorInfo.js +0 -1
  253. package/bundle/dist/codex-protocol/v2/HookEventName.js +0 -1
  254. package/bundle/dist/codex-protocol/v2/HookExecutionMode.js +0 -1
  255. package/bundle/dist/codex-protocol/v2/HookHandlerType.js +0 -1
  256. package/bundle/dist/codex-protocol/v2/HookMetadata.js +0 -1
  257. package/bundle/dist/codex-protocol/v2/HookMigration.js +0 -1
  258. package/bundle/dist/codex-protocol/v2/HookOutputEntry.js +0 -1
  259. package/bundle/dist/codex-protocol/v2/HookOutputEntryKind.js +0 -1
  260. package/bundle/dist/codex-protocol/v2/HookPromptFragment.js +0 -1
  261. package/bundle/dist/codex-protocol/v2/HookRunStatus.js +0 -1
  262. package/bundle/dist/codex-protocol/v2/HookRunSummary.js +0 -1
  263. package/bundle/dist/codex-protocol/v2/HookScope.js +0 -1
  264. package/bundle/dist/codex-protocol/v2/HookSource.js +0 -1
  265. package/bundle/dist/codex-protocol/v2/HookStartedNotification.js +0 -1
  266. package/bundle/dist/codex-protocol/v2/HookTrustStatus.js +0 -1
  267. package/bundle/dist/codex-protocol/v2/HooksListEntry.js +0 -1
  268. package/bundle/dist/codex-protocol/v2/HooksListParams.js +0 -1
  269. package/bundle/dist/codex-protocol/v2/HooksListResponse.js +0 -1
  270. package/bundle/dist/codex-protocol/v2/ItemCompletedNotification.js +0 -1
  271. package/bundle/dist/codex-protocol/v2/ItemGuardianApprovalReviewCompletedNotification.js +0 -1
  272. package/bundle/dist/codex-protocol/v2/ItemGuardianApprovalReviewStartedNotification.js +0 -1
  273. package/bundle/dist/codex-protocol/v2/ItemStartedNotification.js +0 -1
  274. package/bundle/dist/codex-protocol/v2/ListMcpServerStatusParams.js +0 -1
  275. package/bundle/dist/codex-protocol/v2/ListMcpServerStatusResponse.js +0 -1
  276. package/bundle/dist/codex-protocol/v2/LoginAccountParams.js +0 -1
  277. package/bundle/dist/codex-protocol/v2/LoginAccountResponse.js +0 -1
  278. package/bundle/dist/codex-protocol/v2/LogoutAccountResponse.js +0 -1
  279. package/bundle/dist/codex-protocol/v2/ManagedHooksRequirements.js +0 -1
  280. package/bundle/dist/codex-protocol/v2/MarketplaceAddParams.js +0 -1
  281. package/bundle/dist/codex-protocol/v2/MarketplaceAddResponse.js +0 -1
  282. package/bundle/dist/codex-protocol/v2/MarketplaceInterface.js +0 -1
  283. package/bundle/dist/codex-protocol/v2/MarketplaceLoadErrorInfo.js +0 -1
  284. package/bundle/dist/codex-protocol/v2/MarketplaceRemoveParams.js +0 -1
  285. package/bundle/dist/codex-protocol/v2/MarketplaceRemoveResponse.js +0 -1
  286. package/bundle/dist/codex-protocol/v2/MarketplaceUpgradeErrorInfo.js +0 -1
  287. package/bundle/dist/codex-protocol/v2/MarketplaceUpgradeParams.js +0 -1
  288. package/bundle/dist/codex-protocol/v2/MarketplaceUpgradeResponse.js +0 -1
  289. package/bundle/dist/codex-protocol/v2/McpAuthStatus.js +0 -1
  290. package/bundle/dist/codex-protocol/v2/McpElicitationArrayType.js +0 -1
  291. package/bundle/dist/codex-protocol/v2/McpElicitationBooleanSchema.js +0 -1
  292. package/bundle/dist/codex-protocol/v2/McpElicitationBooleanType.js +0 -1
  293. package/bundle/dist/codex-protocol/v2/McpElicitationConstOption.js +0 -1
  294. package/bundle/dist/codex-protocol/v2/McpElicitationEnumSchema.js +0 -1
  295. package/bundle/dist/codex-protocol/v2/McpElicitationLegacyTitledEnumSchema.js +0 -1
  296. package/bundle/dist/codex-protocol/v2/McpElicitationMultiSelectEnumSchema.js +0 -1
  297. package/bundle/dist/codex-protocol/v2/McpElicitationNumberSchema.js +0 -1
  298. package/bundle/dist/codex-protocol/v2/McpElicitationNumberType.js +0 -1
  299. package/bundle/dist/codex-protocol/v2/McpElicitationObjectType.js +0 -1
  300. package/bundle/dist/codex-protocol/v2/McpElicitationPrimitiveSchema.js +0 -1
  301. package/bundle/dist/codex-protocol/v2/McpElicitationSchema.js +0 -1
  302. package/bundle/dist/codex-protocol/v2/McpElicitationSingleSelectEnumSchema.js +0 -1
  303. package/bundle/dist/codex-protocol/v2/McpElicitationStringFormat.js +0 -1
  304. package/bundle/dist/codex-protocol/v2/McpElicitationStringSchema.js +0 -1
  305. package/bundle/dist/codex-protocol/v2/McpElicitationStringType.js +0 -1
  306. package/bundle/dist/codex-protocol/v2/McpElicitationTitledEnumItems.js +0 -1
  307. package/bundle/dist/codex-protocol/v2/McpElicitationTitledMultiSelectEnumSchema.js +0 -1
  308. package/bundle/dist/codex-protocol/v2/McpElicitationTitledSingleSelectEnumSchema.js +0 -1
  309. package/bundle/dist/codex-protocol/v2/McpElicitationUntitledEnumItems.js +0 -1
  310. package/bundle/dist/codex-protocol/v2/McpElicitationUntitledMultiSelectEnumSchema.js +0 -1
  311. package/bundle/dist/codex-protocol/v2/McpElicitationUntitledSingleSelectEnumSchema.js +0 -1
  312. package/bundle/dist/codex-protocol/v2/McpResourceReadParams.js +0 -1
  313. package/bundle/dist/codex-protocol/v2/McpResourceReadResponse.js +0 -1
  314. package/bundle/dist/codex-protocol/v2/McpServerElicitationAction.js +0 -1
  315. package/bundle/dist/codex-protocol/v2/McpServerElicitationRequestParams.js +0 -1
  316. package/bundle/dist/codex-protocol/v2/McpServerElicitationRequestResponse.js +0 -1
  317. package/bundle/dist/codex-protocol/v2/McpServerMigration.js +0 -1
  318. package/bundle/dist/codex-protocol/v2/McpServerOauthLoginCompletedNotification.js +0 -1
  319. package/bundle/dist/codex-protocol/v2/McpServerOauthLoginParams.js +0 -1
  320. package/bundle/dist/codex-protocol/v2/McpServerOauthLoginResponse.js +0 -1
  321. package/bundle/dist/codex-protocol/v2/McpServerRefreshResponse.js +0 -1
  322. package/bundle/dist/codex-protocol/v2/McpServerStartupState.js +0 -1
  323. package/bundle/dist/codex-protocol/v2/McpServerStatus.js +0 -1
  324. package/bundle/dist/codex-protocol/v2/McpServerStatusDetail.js +0 -1
  325. package/bundle/dist/codex-protocol/v2/McpServerStatusUpdatedNotification.js +0 -1
  326. package/bundle/dist/codex-protocol/v2/McpServerToolCallParams.js +0 -1
  327. package/bundle/dist/codex-protocol/v2/McpServerToolCallResponse.js +0 -1
  328. package/bundle/dist/codex-protocol/v2/McpToolCallError.js +0 -1
  329. package/bundle/dist/codex-protocol/v2/McpToolCallProgressNotification.js +0 -1
  330. package/bundle/dist/codex-protocol/v2/McpToolCallResult.js +0 -1
  331. package/bundle/dist/codex-protocol/v2/McpToolCallStatus.js +0 -1
  332. package/bundle/dist/codex-protocol/v2/MemoryCitation.js +0 -1
  333. package/bundle/dist/codex-protocol/v2/MemoryCitationEntry.js +0 -1
  334. package/bundle/dist/codex-protocol/v2/MergeStrategy.js +0 -1
  335. package/bundle/dist/codex-protocol/v2/MigrationDetails.js +0 -1
  336. package/bundle/dist/codex-protocol/v2/Model.js +0 -1
  337. package/bundle/dist/codex-protocol/v2/ModelAvailabilityNux.js +0 -1
  338. package/bundle/dist/codex-protocol/v2/ModelListParams.js +0 -1
  339. package/bundle/dist/codex-protocol/v2/ModelListResponse.js +0 -1
  340. package/bundle/dist/codex-protocol/v2/ModelProviderCapabilitiesReadParams.js +0 -1
  341. package/bundle/dist/codex-protocol/v2/ModelProviderCapabilitiesReadResponse.js +0 -1
  342. package/bundle/dist/codex-protocol/v2/ModelRerouteReason.js +0 -1
  343. package/bundle/dist/codex-protocol/v2/ModelReroutedNotification.js +0 -1
  344. package/bundle/dist/codex-protocol/v2/ModelServiceTier.js +0 -1
  345. package/bundle/dist/codex-protocol/v2/ModelUpgradeInfo.js +0 -1
  346. package/bundle/dist/codex-protocol/v2/ModelVerification.js +0 -1
  347. package/bundle/dist/codex-protocol/v2/ModelVerificationNotification.js +0 -1
  348. package/bundle/dist/codex-protocol/v2/NetworkAccess.js +0 -1
  349. package/bundle/dist/codex-protocol/v2/NetworkApprovalContext.js +0 -1
  350. package/bundle/dist/codex-protocol/v2/NetworkApprovalProtocol.js +0 -1
  351. package/bundle/dist/codex-protocol/v2/NetworkDomainPermission.js +0 -1
  352. package/bundle/dist/codex-protocol/v2/NetworkPolicyAmendment.js +0 -1
  353. package/bundle/dist/codex-protocol/v2/NetworkPolicyRuleAction.js +0 -1
  354. package/bundle/dist/codex-protocol/v2/NetworkRequirements.js +0 -1
  355. package/bundle/dist/codex-protocol/v2/NetworkUnixSocketPermission.js +0 -1
  356. package/bundle/dist/codex-protocol/v2/NonSteerableTurnKind.js +0 -1
  357. package/bundle/dist/codex-protocol/v2/OverriddenMetadata.js +0 -1
  358. package/bundle/dist/codex-protocol/v2/PatchApplyStatus.js +0 -1
  359. package/bundle/dist/codex-protocol/v2/PatchChangeKind.js +0 -1
  360. package/bundle/dist/codex-protocol/v2/PermissionGrantScope.js +0 -1
  361. package/bundle/dist/codex-protocol/v2/PermissionProfile.js +0 -1
  362. package/bundle/dist/codex-protocol/v2/PermissionProfileFileSystemPermissions.js +0 -1
  363. package/bundle/dist/codex-protocol/v2/PermissionProfileModificationParams.js +0 -1
  364. package/bundle/dist/codex-protocol/v2/PermissionProfileNetworkPermissions.js +0 -1
  365. package/bundle/dist/codex-protocol/v2/PermissionProfileSelectionParams.js +0 -1
  366. package/bundle/dist/codex-protocol/v2/PermissionsRequestApprovalParams.js +0 -1
  367. package/bundle/dist/codex-protocol/v2/PermissionsRequestApprovalResponse.js +0 -1
  368. package/bundle/dist/codex-protocol/v2/PlanDeltaNotification.js +0 -1
  369. package/bundle/dist/codex-protocol/v2/PluginAuthPolicy.js +0 -1
  370. package/bundle/dist/codex-protocol/v2/PluginAvailability.js +0 -1
  371. package/bundle/dist/codex-protocol/v2/PluginDetail.js +0 -1
  372. package/bundle/dist/codex-protocol/v2/PluginHookSummary.js +0 -1
  373. package/bundle/dist/codex-protocol/v2/PluginInstallParams.js +0 -1
  374. package/bundle/dist/codex-protocol/v2/PluginInstallPolicy.js +0 -1
  375. package/bundle/dist/codex-protocol/v2/PluginInstallResponse.js +0 -1
  376. package/bundle/dist/codex-protocol/v2/PluginInterface.js +0 -1
  377. package/bundle/dist/codex-protocol/v2/PluginListMarketplaceKind.js +0 -1
  378. package/bundle/dist/codex-protocol/v2/PluginListParams.js +0 -1
  379. package/bundle/dist/codex-protocol/v2/PluginListResponse.js +0 -1
  380. package/bundle/dist/codex-protocol/v2/PluginMarketplaceEntry.js +0 -1
  381. package/bundle/dist/codex-protocol/v2/PluginReadParams.js +0 -1
  382. package/bundle/dist/codex-protocol/v2/PluginReadResponse.js +0 -1
  383. package/bundle/dist/codex-protocol/v2/PluginShareContext.js +0 -1
  384. package/bundle/dist/codex-protocol/v2/PluginShareDeleteParams.js +0 -1
  385. package/bundle/dist/codex-protocol/v2/PluginShareDeleteResponse.js +0 -1
  386. package/bundle/dist/codex-protocol/v2/PluginShareDiscoverability.js +0 -1
  387. package/bundle/dist/codex-protocol/v2/PluginShareListItem.js +0 -1
  388. package/bundle/dist/codex-protocol/v2/PluginShareListParams.js +0 -1
  389. package/bundle/dist/codex-protocol/v2/PluginShareListResponse.js +0 -1
  390. package/bundle/dist/codex-protocol/v2/PluginSharePrincipal.js +0 -1
  391. package/bundle/dist/codex-protocol/v2/PluginSharePrincipalType.js +0 -1
  392. package/bundle/dist/codex-protocol/v2/PluginShareSaveParams.js +0 -1
  393. package/bundle/dist/codex-protocol/v2/PluginShareSaveResponse.js +0 -1
  394. package/bundle/dist/codex-protocol/v2/PluginShareTarget.js +0 -1
  395. package/bundle/dist/codex-protocol/v2/PluginShareUpdateDiscoverability.js +0 -1
  396. package/bundle/dist/codex-protocol/v2/PluginShareUpdateTargetsParams.js +0 -1
  397. package/bundle/dist/codex-protocol/v2/PluginShareUpdateTargetsResponse.js +0 -1
  398. package/bundle/dist/codex-protocol/v2/PluginSkillReadParams.js +0 -1
  399. package/bundle/dist/codex-protocol/v2/PluginSkillReadResponse.js +0 -1
  400. package/bundle/dist/codex-protocol/v2/PluginSource.js +0 -1
  401. package/bundle/dist/codex-protocol/v2/PluginSummary.js +0 -1
  402. package/bundle/dist/codex-protocol/v2/PluginUninstallParams.js +0 -1
  403. package/bundle/dist/codex-protocol/v2/PluginUninstallResponse.js +0 -1
  404. package/bundle/dist/codex-protocol/v2/PluginsMigration.js +0 -1
  405. package/bundle/dist/codex-protocol/v2/ProcessExitedNotification.js +0 -1
  406. package/bundle/dist/codex-protocol/v2/ProcessOutputDeltaNotification.js +0 -1
  407. package/bundle/dist/codex-protocol/v2/ProcessOutputStream.js +0 -1
  408. package/bundle/dist/codex-protocol/v2/ProcessTerminalSize.js +0 -1
  409. package/bundle/dist/codex-protocol/v2/ProfileV2.js +0 -1
  410. package/bundle/dist/codex-protocol/v2/RateLimitReachedType.js +0 -1
  411. package/bundle/dist/codex-protocol/v2/RateLimitSnapshot.js +0 -1
  412. package/bundle/dist/codex-protocol/v2/RateLimitWindow.js +0 -1
  413. package/bundle/dist/codex-protocol/v2/RawResponseItemCompletedNotification.js +0 -1
  414. package/bundle/dist/codex-protocol/v2/ReasoningEffortOption.js +0 -1
  415. package/bundle/dist/codex-protocol/v2/ReasoningSummaryPartAddedNotification.js +0 -1
  416. package/bundle/dist/codex-protocol/v2/ReasoningSummaryTextDeltaNotification.js +0 -1
  417. package/bundle/dist/codex-protocol/v2/ReasoningTextDeltaNotification.js +0 -1
  418. package/bundle/dist/codex-protocol/v2/RemoteControlConnectionStatus.js +0 -1
  419. package/bundle/dist/codex-protocol/v2/RemoteControlStatusChangedNotification.js +0 -1
  420. package/bundle/dist/codex-protocol/v2/RequestPermissionProfile.js +0 -1
  421. package/bundle/dist/codex-protocol/v2/ResidencyRequirement.js +0 -1
  422. package/bundle/dist/codex-protocol/v2/ReviewDelivery.js +0 -1
  423. package/bundle/dist/codex-protocol/v2/ReviewStartParams.js +0 -1
  424. package/bundle/dist/codex-protocol/v2/ReviewStartResponse.js +0 -1
  425. package/bundle/dist/codex-protocol/v2/ReviewTarget.js +0 -1
  426. package/bundle/dist/codex-protocol/v2/SandboxMode.js +0 -1
  427. package/bundle/dist/codex-protocol/v2/SandboxPolicy.js +0 -1
  428. package/bundle/dist/codex-protocol/v2/SandboxWorkspaceWrite.js +0 -1
  429. package/bundle/dist/codex-protocol/v2/SendAddCreditsNudgeEmailParams.js +0 -1
  430. package/bundle/dist/codex-protocol/v2/SendAddCreditsNudgeEmailResponse.js +0 -1
  431. package/bundle/dist/codex-protocol/v2/ServerRequestResolvedNotification.js +0 -1
  432. package/bundle/dist/codex-protocol/v2/SessionMigration.js +0 -1
  433. package/bundle/dist/codex-protocol/v2/SessionSource.js +0 -1
  434. package/bundle/dist/codex-protocol/v2/SkillDependencies.js +0 -1
  435. package/bundle/dist/codex-protocol/v2/SkillErrorInfo.js +0 -1
  436. package/bundle/dist/codex-protocol/v2/SkillInterface.js +0 -1
  437. package/bundle/dist/codex-protocol/v2/SkillMetadata.js +0 -1
  438. package/bundle/dist/codex-protocol/v2/SkillScope.js +0 -1
  439. package/bundle/dist/codex-protocol/v2/SkillSummary.js +0 -1
  440. package/bundle/dist/codex-protocol/v2/SkillToolDependency.js +0 -1
  441. package/bundle/dist/codex-protocol/v2/SkillsChangedNotification.js +0 -1
  442. package/bundle/dist/codex-protocol/v2/SkillsConfigWriteParams.js +0 -1
  443. package/bundle/dist/codex-protocol/v2/SkillsConfigWriteResponse.js +0 -1
  444. package/bundle/dist/codex-protocol/v2/SkillsListEntry.js +0 -1
  445. package/bundle/dist/codex-protocol/v2/SkillsListParams.js +0 -1
  446. package/bundle/dist/codex-protocol/v2/SkillsListResponse.js +0 -1
  447. package/bundle/dist/codex-protocol/v2/SortDirection.js +0 -1
  448. package/bundle/dist/codex-protocol/v2/SubagentMigration.js +0 -1
  449. package/bundle/dist/codex-protocol/v2/TerminalInteractionNotification.js +0 -1
  450. package/bundle/dist/codex-protocol/v2/TextElement.js +0 -1
  451. package/bundle/dist/codex-protocol/v2/TextPosition.js +0 -1
  452. package/bundle/dist/codex-protocol/v2/TextRange.js +0 -1
  453. package/bundle/dist/codex-protocol/v2/Thread.js +0 -1
  454. package/bundle/dist/codex-protocol/v2/ThreadActiveFlag.js +0 -1
  455. package/bundle/dist/codex-protocol/v2/ThreadApproveGuardianDeniedActionParams.js +0 -1
  456. package/bundle/dist/codex-protocol/v2/ThreadApproveGuardianDeniedActionResponse.js +0 -1
  457. package/bundle/dist/codex-protocol/v2/ThreadArchiveParams.js +0 -1
  458. package/bundle/dist/codex-protocol/v2/ThreadArchiveResponse.js +0 -1
  459. package/bundle/dist/codex-protocol/v2/ThreadArchivedNotification.js +0 -1
  460. package/bundle/dist/codex-protocol/v2/ThreadClosedNotification.js +0 -1
  461. package/bundle/dist/codex-protocol/v2/ThreadCompactStartParams.js +0 -1
  462. package/bundle/dist/codex-protocol/v2/ThreadCompactStartResponse.js +0 -1
  463. package/bundle/dist/codex-protocol/v2/ThreadForkParams.js +0 -1
  464. package/bundle/dist/codex-protocol/v2/ThreadForkResponse.js +0 -1
  465. package/bundle/dist/codex-protocol/v2/ThreadGoal.js +0 -1
  466. package/bundle/dist/codex-protocol/v2/ThreadGoalClearedNotification.js +0 -1
  467. package/bundle/dist/codex-protocol/v2/ThreadGoalStatus.js +0 -1
  468. package/bundle/dist/codex-protocol/v2/ThreadGoalUpdatedNotification.js +0 -1
  469. package/bundle/dist/codex-protocol/v2/ThreadInjectItemsParams.js +0 -1
  470. package/bundle/dist/codex-protocol/v2/ThreadInjectItemsResponse.js +0 -1
  471. package/bundle/dist/codex-protocol/v2/ThreadItem.js +0 -1
  472. package/bundle/dist/codex-protocol/v2/ThreadListParams.js +0 -1
  473. package/bundle/dist/codex-protocol/v2/ThreadListResponse.js +0 -1
  474. package/bundle/dist/codex-protocol/v2/ThreadLoadedListParams.js +0 -1
  475. package/bundle/dist/codex-protocol/v2/ThreadLoadedListResponse.js +0 -1
  476. package/bundle/dist/codex-protocol/v2/ThreadMetadataGitInfoUpdateParams.js +0 -1
  477. package/bundle/dist/codex-protocol/v2/ThreadMetadataUpdateParams.js +0 -1
  478. package/bundle/dist/codex-protocol/v2/ThreadMetadataUpdateResponse.js +0 -1
  479. package/bundle/dist/codex-protocol/v2/ThreadNameUpdatedNotification.js +0 -1
  480. package/bundle/dist/codex-protocol/v2/ThreadReadParams.js +0 -1
  481. package/bundle/dist/codex-protocol/v2/ThreadReadResponse.js +0 -1
  482. package/bundle/dist/codex-protocol/v2/ThreadRealtimeAudioChunk.js +0 -1
  483. package/bundle/dist/codex-protocol/v2/ThreadRealtimeClosedNotification.js +0 -1
  484. package/bundle/dist/codex-protocol/v2/ThreadRealtimeErrorNotification.js +0 -1
  485. package/bundle/dist/codex-protocol/v2/ThreadRealtimeItemAddedNotification.js +0 -1
  486. package/bundle/dist/codex-protocol/v2/ThreadRealtimeOutputAudioDeltaNotification.js +0 -1
  487. package/bundle/dist/codex-protocol/v2/ThreadRealtimeSdpNotification.js +0 -1
  488. package/bundle/dist/codex-protocol/v2/ThreadRealtimeStartTransport.js +0 -1
  489. package/bundle/dist/codex-protocol/v2/ThreadRealtimeStartedNotification.js +0 -1
  490. package/bundle/dist/codex-protocol/v2/ThreadRealtimeTranscriptDeltaNotification.js +0 -1
  491. package/bundle/dist/codex-protocol/v2/ThreadRealtimeTranscriptDoneNotification.js +0 -1
  492. package/bundle/dist/codex-protocol/v2/ThreadResumeParams.js +0 -1
  493. package/bundle/dist/codex-protocol/v2/ThreadResumeResponse.js +0 -1
  494. package/bundle/dist/codex-protocol/v2/ThreadRollbackParams.js +0 -1
  495. package/bundle/dist/codex-protocol/v2/ThreadRollbackResponse.js +0 -1
  496. package/bundle/dist/codex-protocol/v2/ThreadSetNameParams.js +0 -1
  497. package/bundle/dist/codex-protocol/v2/ThreadSetNameResponse.js +0 -1
  498. package/bundle/dist/codex-protocol/v2/ThreadShellCommandParams.js +0 -1
  499. package/bundle/dist/codex-protocol/v2/ThreadShellCommandResponse.js +0 -1
  500. package/bundle/dist/codex-protocol/v2/ThreadSortKey.js +0 -1
  501. package/bundle/dist/codex-protocol/v2/ThreadSource.js +0 -1
  502. package/bundle/dist/codex-protocol/v2/ThreadSourceKind.js +0 -1
  503. package/bundle/dist/codex-protocol/v2/ThreadStartParams.js +0 -1
  504. package/bundle/dist/codex-protocol/v2/ThreadStartResponse.js +0 -1
  505. package/bundle/dist/codex-protocol/v2/ThreadStartSource.js +0 -1
  506. package/bundle/dist/codex-protocol/v2/ThreadStartedNotification.js +0 -1
  507. package/bundle/dist/codex-protocol/v2/ThreadStatus.js +0 -1
  508. package/bundle/dist/codex-protocol/v2/ThreadStatusChangedNotification.js +0 -1
  509. package/bundle/dist/codex-protocol/v2/ThreadTokenUsage.js +0 -1
  510. package/bundle/dist/codex-protocol/v2/ThreadTokenUsageUpdatedNotification.js +0 -1
  511. package/bundle/dist/codex-protocol/v2/ThreadUnarchiveParams.js +0 -1
  512. package/bundle/dist/codex-protocol/v2/ThreadUnarchiveResponse.js +0 -1
  513. package/bundle/dist/codex-protocol/v2/ThreadUnarchivedNotification.js +0 -1
  514. package/bundle/dist/codex-protocol/v2/ThreadUnsubscribeParams.js +0 -1
  515. package/bundle/dist/codex-protocol/v2/ThreadUnsubscribeResponse.js +0 -1
  516. package/bundle/dist/codex-protocol/v2/ThreadUnsubscribeStatus.js +0 -1
  517. package/bundle/dist/codex-protocol/v2/TokenUsageBreakdown.js +0 -1
  518. package/bundle/dist/codex-protocol/v2/ToolRequestUserInputAnswer.js +0 -1
  519. package/bundle/dist/codex-protocol/v2/ToolRequestUserInputOption.js +0 -1
  520. package/bundle/dist/codex-protocol/v2/ToolRequestUserInputParams.js +0 -1
  521. package/bundle/dist/codex-protocol/v2/ToolRequestUserInputQuestion.js +0 -1
  522. package/bundle/dist/codex-protocol/v2/ToolRequestUserInputResponse.js +0 -1
  523. package/bundle/dist/codex-protocol/v2/ToolsV2.js +0 -1
  524. package/bundle/dist/codex-protocol/v2/Turn.js +0 -1
  525. package/bundle/dist/codex-protocol/v2/TurnCompletedNotification.js +0 -1
  526. package/bundle/dist/codex-protocol/v2/TurnDiffUpdatedNotification.js +0 -1
  527. package/bundle/dist/codex-protocol/v2/TurnEnvironmentParams.js +0 -1
  528. package/bundle/dist/codex-protocol/v2/TurnError.js +0 -1
  529. package/bundle/dist/codex-protocol/v2/TurnInterruptParams.js +0 -1
  530. package/bundle/dist/codex-protocol/v2/TurnInterruptResponse.js +0 -1
  531. package/bundle/dist/codex-protocol/v2/TurnItemsView.js +0 -1
  532. package/bundle/dist/codex-protocol/v2/TurnPlanStep.js +0 -1
  533. package/bundle/dist/codex-protocol/v2/TurnPlanStepStatus.js +0 -1
  534. package/bundle/dist/codex-protocol/v2/TurnPlanUpdatedNotification.js +0 -1
  535. package/bundle/dist/codex-protocol/v2/TurnStartParams.js +0 -1
  536. package/bundle/dist/codex-protocol/v2/TurnStartResponse.js +0 -1
  537. package/bundle/dist/codex-protocol/v2/TurnStartedNotification.js +0 -1
  538. package/bundle/dist/codex-protocol/v2/TurnStatus.js +0 -1
  539. package/bundle/dist/codex-protocol/v2/TurnSteerParams.js +0 -1
  540. package/bundle/dist/codex-protocol/v2/TurnSteerResponse.js +0 -1
  541. package/bundle/dist/codex-protocol/v2/UserInput.js +0 -1
  542. package/bundle/dist/codex-protocol/v2/WarningNotification.js +0 -1
  543. package/bundle/dist/codex-protocol/v2/WebSearchAction.js +0 -1
  544. package/bundle/dist/codex-protocol/v2/WindowsSandboxReadiness.js +0 -1
  545. package/bundle/dist/codex-protocol/v2/WindowsSandboxReadinessResponse.js +0 -1
  546. package/bundle/dist/codex-protocol/v2/WindowsSandboxSetupCompletedNotification.js +0 -1
  547. package/bundle/dist/codex-protocol/v2/WindowsSandboxSetupMode.js +0 -1
  548. package/bundle/dist/codex-protocol/v2/WindowsSandboxSetupStartParams.js +0 -1
  549. package/bundle/dist/codex-protocol/v2/WindowsSandboxSetupStartResponse.js +0 -1
  550. package/bundle/dist/codex-protocol/v2/WindowsWorldWritableWarningNotification.js +0 -1
  551. package/bundle/dist/codex-protocol/v2/WriteStatus.js +0 -1
  552. package/bundle/dist/i18n/en.js +1 -2
  553. package/bundle/dist/i18n/ko.js +1 -2
  554. package/bundle/dist/i18n/sd.generated.js +54 -21
  555. package/bundle/dist/index.js +1 -2
  556. package/bundle/dist/migrations/20260410171405_create__request_logs.js +1 -2
  557. package/bundle/dist/migrations/20260410171406_create__tokens.js +1 -2
  558. package/bundle/dist/migrations/20260411120624_alter_tokens_alter2.js +1 -2
  559. package/bundle/dist/migrations/20260415113716_alter_tokens_add_ord.js +1 -2
  560. package/bundle/dist/migrations/20260415134649_alter_request_logs_alter1.js +1 -2
  561. package/bundle/dist/migrations/20260421223627_alter_request_logs_add1_alter1.js +1 -2
  562. package/bundle/dist/migrations/20260423180818_alter_request_logs_add1_alter1.js +1 -2
  563. package/bundle/dist/migrations/20260423182017_alter_request_logs_add2_drop1_alter1.js +1 -2
  564. package/bundle/dist/migrations/20260423183613_alter_request_logs_add1_alter1.js +1 -2
  565. package/bundle/dist/migrations/20260518145411_alter_tokens_add2_drop4_alter1.js +1 -2
  566. package/bundle/dist/migrations/20260520112853_alter_request_logs_add3_alter1.js +1 -2
  567. package/bundle/dist/migrations/20260520124755_alter_request_logs_drop1_alter1.js +1 -2
  568. package/bundle/dist/migrations/20260520130420_create__request_log_steps.js +1 -2
  569. package/bundle/dist/migrations/20260520134908_alter_request_logs_add2_alter8.js +1 -2
  570. package/bundle/dist/migrations/20260520134909_alter_request_log_steps_add1_alter3.js +1 -2
  571. package/bundle/dist/migrations/20260520141449_alter_request_logs_add1_alter1.js +1 -2
  572. package/bundle/dist/migrations/20260521134025_alter_request_log_steps_alter1.js +1 -2
  573. package/bundle/dist/migrations/20260521134026_alter_request_log_steps_foreigns.js +1 -2
  574. package/bundle/dist/migrations/20260522181721_alter_request_log_steps_add2_alter1.js +1 -2
  575. package/bundle/dist/migrations/20260630223950_alter_tokens_add1_alter1.js +1 -2
  576. package/bundle/dist/migrations/20260701105327_alter_request_logs_add1_alter1.js +1 -2
  577. package/bundle/dist/migrations/20260701105328_alter_request_log_steps_add1_alter1.js +1 -2
  578. package/bundle/dist/migrations/20260705140614_alter_request_logs_add1_alter1.js +1 -2
  579. package/bundle/dist/migrations/20260706120000_alter_request_logs_add_image_cost.js +1 -2
  580. package/bundle/dist/migrations/20260710090000_alter_tokens_add_weight.js +1 -2
  581. package/bundle/dist/migrations/20260718180824_alter_request_logs_add5_alter1.js +1 -2
  582. package/bundle/dist/migrations/20260718180825_alter_request_log_steps_add7_alter1.js +1 -2
  583. package/bundle/dist/migrations/20260722174410_alter_request_logs_alter3.js +17 -0
  584. package/bundle/dist/migrations/20260722174411_alter_request_log_steps_alter3.js +17 -0
  585. package/bundle/dist/node_modules/.pnpm/@jridgewell_sourcemap-codec@1.5.5/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.js +255 -4
  586. package/bundle/dist/node_modules/.pnpm/@vitest_expect@4.1.10/node_modules/@vitest/expect/dist/index.js +1507 -0
  587. package/bundle/dist/node_modules/.pnpm/@vitest_pretty-format@4.1.10/node_modules/@vitest/pretty-format/dist/index.js +887 -0
  588. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/chunk-artifact.js +2756 -0
  589. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/index.js +8 -0
  590. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/utils.js +8 -0
  591. package/bundle/dist/node_modules/.pnpm/@vitest_snapshot@4.1.10/node_modules/@vitest/snapshot/dist/index.js +922 -0
  592. package/bundle/dist/node_modules/.pnpm/@vitest_spy@4.1.10/node_modules/@vitest/spy/dist/index.js +386 -0
  593. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/chunk-pathe.M-eThtNZ.js +121 -0
  594. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/constants.js +51 -0
  595. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/diff.js +1317 -0
  596. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/display.js +561 -0
  597. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/error.js +40 -0
  598. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/helpers.js +272 -0
  599. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/offset.js +27 -0
  600. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/serialize.js +77 -0
  601. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/source-map.js +381 -0
  602. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/timers.js +51 -0
  603. package/bundle/dist/node_modules/.pnpm/chai@6.2.2/node_modules/chai/index.js +103 -3
  604. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/branding.js +1 -1
  605. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/index.js +1 -1
  606. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/messages.js +1 -1
  607. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/overloads.js +1 -1
  608. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/utils.js +1 -1
  609. package/bundle/dist/node_modules/.pnpm/magic-string@0.30.21/node_modules/magic-string/dist/magic-string.es.js +2 -3
  610. package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/index.js +4 -4
  611. package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/shared/pathe.M-eThtNZ.js +2 -2
  612. package/bundle/dist/node_modules/.pnpm/tinybench@2.9.0/node_modules/tinybench/dist/index.js +18 -7
  613. package/bundle/dist/node_modules/.pnpm/tinyrainbow@3.1.0/node_modules/tinyrainbow/dist/index.js +18 -3
  614. package/bundle/dist/node_modules/.pnpm/vite@8.0.3_@emnapi_core@1.11.2_@emnapi_runtime@1.11.2_@types_node@25.0.7_esbuild@0.27.4_2519c2e8d8013fcbc7b443879bc9da6d/node_modules/vite/dist/node/module-runner.js +1265 -0
  615. package/bundle/dist/node_modules/.pnpm/{vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_msw@2.13.3_@types_node@25.0.7__ba64bc4dd2e2bdde58df187864f65496 → vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_ms_f9cfcfeddd63e656d4010c98521af26c}/node_modules/vitest/dist/chunks/_commonjsHelpers.D26ty3Ew.js +6 -3
  616. package/bundle/dist/node_modules/.pnpm/{vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_msw@2.13.3_@types_node@25.0.7__ba64bc4dd2e2bdde58df187864f65496 → vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_ms_f9cfcfeddd63e656d4010c98521af26c}/node_modules/vitest/dist/chunks/benchmark.CX_oY03V.js +8 -8
  617. package/bundle/dist/node_modules/.pnpm/{vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_msw@2.13.3_@types_node@25.0.7__ba64bc4dd2e2bdde58df187864f65496 → vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_ms_f9cfcfeddd63e656d4010c98521af26c}/node_modules/vitest/dist/chunks/evaluatedModules.Dg1zASAC.js +5 -5
  618. package/bundle/dist/node_modules/.pnpm/{vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_msw@2.13.3_@types_node@25.0.7__ba64bc4dd2e2bdde58df187864f65496 → vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_ms_f9cfcfeddd63e656d4010c98521af26c}/node_modules/vitest/dist/chunks/index.Chj8NDwU.js +3 -3
  619. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_ms_f9cfcfeddd63e656d4010c98521af26c/node_modules/vitest/dist/chunks/index.DdgEv5B1.js +46 -0
  620. package/bundle/dist/node_modules/.pnpm/{vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_msw@2.13.3_@types_node@25.0.7__ba64bc4dd2e2bdde58df187864f65496 → vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_ms_f9cfcfeddd63e656d4010c98521af26c}/node_modules/vitest/dist/chunks/rpc.MzXet3jl.js +66 -6
  621. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_ms_f9cfcfeddd63e656d4010c98521af26c/node_modules/vitest/dist/chunks/test.DNmyFkvJ.js +3044 -0
  622. package/bundle/dist/node_modules/.pnpm/{vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_msw@2.13.3_@types_node@25.0.7__ba64bc4dd2e2bdde58df187864f65496 → vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_ms_f9cfcfeddd63e656d4010c98521af26c}/node_modules/vitest/dist/chunks/utils.BX5Fg8C4.js +19 -4
  623. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_ms_f9cfcfeddd63e656d4010c98521af26c/node_modules/vitest/dist/index.js +28 -0
  624. package/bundle/dist/server-bootstrap.js +1 -2
  625. package/bundle/dist/sonamu.config.js +11 -27
  626. package/bundle/dist/startup-migrations.js +1 -2
  627. package/bundle/dist/testing/fixture.js +1 -2
  628. package/bundle/dist/testing/global.js +6 -7
  629. package/bundle/dist/testing/setup-mocks.js +3 -4
  630. package/bundle/dist/testing/test-database-name.js +5 -8
  631. package/bundle/dist/utils/providers/anthropic/anthropic-constants.js +8 -8
  632. package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +1 -2
  633. package/bundle/dist/utils/providers/anthropic/anthropic-quota.js +1 -2
  634. package/bundle/dist/utils/providers/anthropic/claude-session.js +5 -7
  635. package/bundle/dist/utils/providers/anthropic/stream-json-adapter.js +1 -2
  636. package/bundle/dist/utils/providers/common/credentials.js +1 -2
  637. package/bundle/dist/utils/providers/common/model-cost.js +3 -3
  638. package/bundle/dist/utils/providers/common/provider-dispatcher.js +0 -1
  639. package/bundle/dist/utils/providers/common/smooth-weighted-round-robin.js +1 -2
  640. package/bundle/dist/utils/providers/common/strictifier.js +2 -2
  641. package/bundle/dist/utils/providers/common/token-picker.js +1 -2
  642. package/bundle/dist/utils/providers/common/ttft.js +1 -2
  643. package/bundle/dist/utils/providers/openai/codex-rpc.js +4 -2
  644. package/bundle/dist/utils/providers/openai/codex-worker.js +2 -2
  645. package/bundle/dist/utils/providers/openai/openai-constants.js +1 -2
  646. package/bundle/dist/utils/providers/openai/openai-dispatcher.js +103 -40
  647. package/bundle/dist/utils/providers/openai/openai-quota.js +1 -2
  648. package/bundle/dist/utils/providers/openai/openai-refresh.js +1 -2
  649. package/bundle/dist/utils/subset-loaders.js +1 -2
  650. package/bundle/src/application/monit/monit.frame.test.ts +2 -2
  651. package/bundle/src/application/monit/monit.frame.ts +2 -2
  652. package/bundle/src/application/qgrid/qgrid-run-lifecycle.test.ts +242 -8
  653. package/bundle/src/application/qgrid/qgrid-run-lifecycle.ts +97 -57
  654. package/bundle/src/application/qgrid/qgrid.frame.test.ts +400 -96
  655. package/bundle/src/application/qgrid/qgrid.frame.ts +85 -123
  656. package/bundle/src/application/qgrid/qgrid.types.ts +35 -27
  657. package/bundle/src/application/request-log/request-log.entity.json +2 -2
  658. package/bundle/src/application/request-log/request-log.model.test.ts +325 -21
  659. package/bundle/src/application/request-log/request-log.model.ts +233 -125
  660. package/bundle/src/application/request-log-step/request-log-step.entity.json +2 -2
  661. package/bundle/src/application/sonamu.generated.http +2 -2
  662. package/bundle/src/application/sonamu.generated.ts +13 -13
  663. package/bundle/src/i18n/sd.generated.ts +83 -14
  664. package/bundle/src/migrations/20260722174410_alter_request_logs_alter3.ts +19 -0
  665. package/bundle/src/migrations/20260722174411_alter_request_log_steps_alter3.ts +19 -0
  666. package/bundle/src/sonamu.config.ts +5 -23
  667. package/bundle/src/testing/global.ts +5 -5
  668. package/bundle/src/testing/test-database-name.test.ts +5 -5
  669. package/bundle/src/testing/test-database-name.ts +9 -8
  670. package/bundle/src/utils/providers/anthropic/anthropic-constants.test.ts +10 -6
  671. package/bundle/src/utils/providers/anthropic/anthropic-constants.ts +9 -5
  672. package/bundle/src/utils/providers/anthropic/claude-session.test.ts +18 -3
  673. package/bundle/src/utils/providers/anthropic/claude-session.ts +4 -4
  674. package/bundle/src/utils/providers/common/model-cost.test.ts +1 -0
  675. package/bundle/src/utils/providers/common/model-cost.ts +1 -0
  676. package/bundle/src/utils/providers/openai/openai-dispatcher.test.ts +440 -0
  677. package/bundle/src/utils/providers/openai/openai-dispatcher.ts +143 -45
  678. package/bundle/web-dist/client/assets/{index-CmuPjbCl.js → index-B8Qj0LZK.js} +3 -3
  679. package/bundle/web-dist/client/assets/logs-C7R8Hvyy.js +1 -0
  680. package/bundle/web-dist/client/assets/{monit-B5Edhvy-.js → monit-Cj2KSodR.js} +1 -1
  681. package/bundle/web-dist/client/assets/{routes-UPWScORY.js → routes-DI1rjqGY.js} +1 -1
  682. package/bundle/web-dist/client/assets/{sd.generated-DYuKzBY6.js → sd.generated-DbBC73_z.js} +1 -1
  683. package/bundle/web-dist/client/assets/{services.generated-D_SkWOo-.js → services.generated-BWyAypSh.js} +1 -1
  684. package/bundle/web-dist/client/assets/{show-pRp-eZIK.js → show-B9hDSX9F.js} +2 -2
  685. package/bundle/web-dist/client/assets/{tokens-DJlttxCM.js → tokens-xUexYz3u.js} +1 -1
  686. package/bundle/web-dist/client/assets/{use-update-token-mutation-CpFGLWUl.js → use-update-token-mutation-DeDBiZiM.js} +1 -1
  687. package/bundle/web-dist/client/index.html +2 -2
  688. package/bundle/web-dist/server/assets/{lazyRouteComponent-Cu6IkL8A.js → lazyRouteComponent-BCJr868T.js} +1 -1
  689. package/bundle/web-dist/server/assets/{logs-Dx2knN2T.js → logs-33YNafdW.js} +32 -11
  690. package/bundle/web-dist/server/assets/{monit-DU6PLatf.js → monit--9mVsjNU.js} +2 -2
  691. package/bundle/web-dist/server/assets/{routes-CTco1oJZ.js → routes-BK3Xh1UB.js} +3 -3
  692. package/bundle/web-dist/server/assets/{sd.generated-qzuRe35X.js → sd.generated-C3gcvRcU.js} +1 -0
  693. package/bundle/web-dist/server/assets/{services.generated-C8q1M41a.js → services.generated-B2_Auwvk.js} +1 -1
  694. package/bundle/web-dist/server/assets/{show-B3q8_GDh.js → show-Dxxxe608.js} +15 -9
  695. package/bundle/web-dist/server/assets/{tokens-Bvjn15h9.js → tokens-BWPVvdfi.js} +3 -3
  696. package/bundle/web-dist/server/assets/{use-update-token-mutation-BlZo6swF.js → use-update-token-mutation-CNBgTysy.js} +1 -1
  697. package/bundle/web-dist/server/entry-server.generated.js +23 -23
  698. package/dist/cli.d.ts +1 -0
  699. package/dist/cli.js +18 -12
  700. package/package.json +6 -6
  701. package/skills/qgrid/SKILL.md +4 -0
  702. package/skills/qgrid/references/ai-sdk-provider-contract.md +28 -2
  703. package/skills/qgrid/references/anthropic-claude-code-runtime.md +5 -4
  704. package/skills/qgrid/references/cli-env-and-server-boot.md +20 -8
  705. package/skills/qgrid/references/decision-rationale.md +4 -0
  706. package/skills/qgrid/references/docs-workflow.md +10 -0
  707. package/skills/qgrid/references/openai-codex-runtime.md +11 -3
  708. package/skills/qgrid/references/provider-runtime-differences.md +3 -3
  709. package/skills/qgrid/references/request-log-run-lifecycle.md +46 -28
  710. package/skills/qgrid/references/sonamu-api-web-flow.md +4 -0
  711. package/skills/qgrid/references/token-auth-quota-lifecycle.md +6 -0
  712. package/skills/qgrid/references/tool-calling-and-multiturn.md +8 -7
  713. package/skills/qgrid/references/verification-and-debugging.md +1 -1
  714. package/bundle/dist/node_modules/.pnpm/@vitest_expect@4.1.2/node_modules/@vitest/expect/dist/index.js +0 -1484
  715. package/bundle/dist/node_modules/.pnpm/@vitest_pretty-format@4.1.2/node_modules/@vitest/pretty-format/dist/index.js +0 -887
  716. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.2/node_modules/@vitest/runner/dist/chunk-artifact.js +0 -2746
  717. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.2/node_modules/@vitest/runner/dist/index.js +0 -8
  718. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.2/node_modules/@vitest/runner/dist/utils.js +0 -8
  719. package/bundle/dist/node_modules/.pnpm/@vitest_snapshot@4.1.2/node_modules/@vitest/snapshot/dist/index.js +0 -662
  720. package/bundle/dist/node_modules/.pnpm/@vitest_spy@4.1.2/node_modules/@vitest/spy/dist/index.js +0 -386
  721. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/chunk-pathe.M-eThtNZ.js +0 -82
  722. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/constants.js +0 -48
  723. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/diff.js +0 -1307
  724. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/display.js +0 -558
  725. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/error.js +0 -33
  726. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/helpers.js +0 -226
  727. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/offset.js +0 -27
  728. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/serialize.js +0 -77
  729. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/source-map.js +0 -374
  730. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/timers.js +0 -37
  731. package/bundle/dist/node_modules/.pnpm/vite@8.0.3_@emnapi_core@1.9.2_@emnapi_runtime@1.9.2_@types_node@25.0.7_esbuild@0.27.4_jiti@2.6.1_sass@1.98.0_tsx@4.21.0/node_modules/vite/dist/node/module-runner.js +0 -426
  732. package/bundle/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_msw@2.13.3_@types_node@25.0.7__ba64bc4dd2e2bdde58df187864f65496/node_modules/vitest/dist/chunks/index.DOa3dzoN.js +0 -16
  733. package/bundle/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_msw@2.13.3_@types_node@25.0.7__ba64bc4dd2e2bdde58df187864f65496/node_modules/vitest/dist/chunks/test.p_J6dB8a.js +0 -2910
  734. package/bundle/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_msw@2.13.3_@types_node@25.0.7__ba64bc4dd2e2bdde58df187864f65496/node_modules/vitest/dist/index.js +0 -28
  735. package/bundle/web-dist/client/assets/logs-cXOsDli3.js +0 -1
@@ -1,4 +1,3 @@
1
- import "../../../_virtual/_rolldown/runtime.js";
2
1
  import { QuotaThresholdExceededError } from "../../../application/qgrid/qgrid.types.js";
3
2
  import { TokenModel } from "../../../application/token/token.model.js";
4
3
  import { SmoothWeightedRoundRobin } from "../common/smooth-weighted-round-robin.js";
@@ -19,6 +18,7 @@ import { getLogger } from "@logtape/logtape";
19
18
  */
20
19
  const logger = getLogger(["qgrid", "openai-dispatcher"]);
21
20
  var ImageGenerationError = class extends Error {
21
+ kind;
22
22
  constructor(kind, message) {
23
23
  super(message);
24
24
  this.kind = kind;
@@ -88,6 +88,8 @@ var OpenAIDispatcher = class OpenAIDispatcher {
88
88
  tokenMetadata = /* @__PURE__ */ new Map();
89
89
  queue = [];
90
90
  poolConfig;
91
+ quotaBlockedTokenIds = /* @__PURE__ */ new Set();
92
+ rateLimitsGenerationByToken = /* @__PURE__ */ new Map();
91
93
  weightedSelector = new SmoothWeightedRoundRobin();
92
94
  workerCursorByToken = /* @__PURE__ */ new Map();
93
95
  getHostAvailableGiB;
@@ -131,8 +133,12 @@ var OpenAIDispatcher = class OpenAIDispatcher {
131
133
  this.workerCursorByToken.clear();
132
134
  this.weightedSelector.resetScores();
133
135
  this.rateLimitsCache.clear();
136
+ this.rateLimitsGenerationByToken.clear();
137
+ this.quotaBlockedTokenIds.clear();
134
138
  }
135
139
  async onTokenAdded(id, name, credentials, quotaThreshold, weight = 1) {
140
+ this.quotaBlockedTokenIds.delete(id);
141
+ this.invalidateRateLimitsCache(id);
136
142
  this.setTokenMetadata(id, name, credentials, quotaThreshold, weight);
137
143
  if (this.workerPool.has(id)) return;
138
144
  await this.spawnWorkers(id, name, credentials, quotaThreshold, weight);
@@ -144,7 +150,8 @@ var OpenAIDispatcher = class OpenAIDispatcher {
144
150
  this.tokenMetadata.delete(id);
145
151
  this.weightedSelector.removeToken(id);
146
152
  this.workerCursorByToken.delete(id);
147
- this.rateLimitsCache.delete(id);
153
+ this.invalidateRateLimitsCache(id);
154
+ this.quotaBlockedTokenIds.delete(id);
148
155
  await Promise.allSettled(workers.map((w) => w.kill()));
149
156
  if (this.getAllReadyActiveWorkers().length === 0) this.rejectAllQueued("NO_OPENAI_WORKERS");
150
157
  if (workers.length > 0) {
@@ -154,10 +161,10 @@ var OpenAIDispatcher = class OpenAIDispatcher {
154
161
  }
155
162
  async onTokenUpdated(id, name, credentials, quotaThreshold, weight = 1) {
156
163
  const existing = this.workerPool.get(id) ?? [];
157
- const renamed = existing.some((w) => w.tokenName !== name);
164
+ if (this.getQuotaThreshold(id) !== quotaThreshold) this.quotaBlockedTokenIds.delete(id);
158
165
  this.setTokenMetadata(id, name, credentials, quotaThreshold, weight);
159
- if (renamed) this.rateLimitsCache.delete(id);
160
166
  if (existing.length === 0) {
167
+ this.invalidateRateLimitsCache(id);
161
168
  await this.spawnWorkers(id, name, credentials, quotaThreshold, weight);
162
169
  return;
163
170
  }
@@ -168,7 +175,8 @@ var OpenAIDispatcher = class OpenAIDispatcher {
168
175
  return;
169
176
  }
170
177
  this.workerPool.delete(id);
171
- this.rateLimitsCache.delete(id);
178
+ this.invalidateRateLimitsCache(id);
179
+ this.quotaBlockedTokenIds.delete(id);
172
180
  await Promise.allSettled(existing.map((w) => w.kill()));
173
181
  await this.spawnWorkers(id, name, credentials, quotaThreshold, weight);
174
182
  }
@@ -176,7 +184,11 @@ var OpenAIDispatcher = class OpenAIDispatcher {
176
184
  const workers = this.workerPool.get(id) ?? [];
177
185
  const tokenName = workers[0]?.tokenName;
178
186
  const metadata = this.tokenMetadata.get(id);
179
- if (metadata) metadata.active = false;
187
+ if (metadata?.active) this.tokenMetadata.set(id, {
188
+ ...metadata,
189
+ active: false
190
+ });
191
+ this.quotaBlockedTokenIds.delete(id);
180
192
  const changed = workers.some((worker) => worker.active);
181
193
  workers.forEach((w) => {
182
194
  w.active = false;
@@ -190,7 +202,10 @@ var OpenAIDispatcher = class OpenAIDispatcher {
190
202
  const workers = this.workerPool.get(id) ?? [];
191
203
  const tokenName = workers[0]?.tokenName;
192
204
  const metadata = this.tokenMetadata.get(id);
193
- if (metadata) metadata.active = true;
205
+ if (metadata && !metadata.active) this.tokenMetadata.set(id, {
206
+ ...metadata,
207
+ active: true
208
+ });
194
209
  const changed = workers.some((worker) => !worker.active);
195
210
  workers.forEach((w) => {
196
211
  w.active = true;
@@ -254,10 +269,18 @@ var OpenAIDispatcher = class OpenAIDispatcher {
254
269
  if (!worker || !worker.isReady || !worker.active) return null;
255
270
  if (worker.epoch !== epoch) return null;
256
271
  if (!worker.hasThread(threadId)) return null;
272
+ const quotaMetadata = this.tokenMetadata.get(worker.tokenId);
257
273
  if (!await this.isTokenQuotaEligible(worker.tokenId, worker.tokenName, excludedTokenIds)) return null;
274
+ if (!worker.isReady || !worker.active || this.tokenMetadata.get(worker.tokenId) !== quotaMetadata || this.quotaBlockedTokenIds.has(worker.tokenId)) {
275
+ if (this.quotaBlockedTokenIds.has(worker.tokenId)) excludedTokenIds.add(worker.tokenId);
276
+ return null;
277
+ }
258
278
  const deadline = Date.now() + REUSE_WORKER_WAIT_MS;
259
279
  for (;;) {
260
- if (worker.epoch !== epoch || !worker.hasThread(threadId)) return null;
280
+ if (!worker.isReady || !worker.active || worker.epoch !== epoch || !worker.hasThread(threadId) || this.tokenMetadata.get(worker.tokenId) !== quotaMetadata || this.quotaBlockedTokenIds.has(worker.tokenId)) {
281
+ if (this.quotaBlockedTokenIds.has(worker.tokenId)) excludedTokenIds.add(worker.tokenId);
282
+ return null;
283
+ }
261
284
  if (worker.tryAcquireTurn()) return worker;
262
285
  if (Date.now() >= deadline) return null;
263
286
  await sleep(REUSE_WORKER_POLL_MS);
@@ -493,7 +516,7 @@ var OpenAIDispatcher = class OpenAIDispatcher {
493
516
  if (!this.poolConfig.autoscale || this.stopped) return;
494
517
  await this.runScaling(async () => {
495
518
  const candidates = [...this.tokenMetadata.entries()].filter(([tokenId, metadata]) => {
496
- if (!metadata.active) return false;
519
+ if (!metadata.active || this.quotaBlockedTokenIds.has(tokenId)) return false;
497
520
  return (this.workerPool.get(tokenId)?.length ?? 0) < this.poolConfig.maxWorkersPerToken;
498
521
  });
499
522
  if (candidates.length === 0) return;
@@ -515,7 +538,7 @@ var OpenAIDispatcher = class OpenAIDispatcher {
515
538
  if (!worker) return null;
516
539
  const currentMetadata = this.tokenMetadata.get(tokenId);
517
540
  const currentWorkers = this.workerPool.get(tokenId);
518
- if (!currentMetadata?.active || currentMetadata !== metadata || !currentWorkers || currentWorkers.some((entry) => entry.workerIndex === workerIndex)) {
541
+ if (!currentMetadata?.active || this.quotaBlockedTokenIds.has(tokenId) || currentMetadata !== metadata || !currentWorkers || currentWorkers.some((entry) => entry.workerIndex === workerIndex)) {
519
542
  await worker.kill().catch(() => {});
520
543
  return null;
521
544
  }
@@ -570,20 +593,32 @@ var OpenAIDispatcher = class OpenAIDispatcher {
570
593
  rateLimitsCache = /* @__PURE__ */ new Map();
571
594
  static RATE_LIMITS_CACHE_TTL = 6e4;
572
595
  async getRateLimitsByTokenId(tokenId) {
596
+ const generation = this.rateLimitsGenerationByToken.get(tokenId) ?? 0;
573
597
  const cached = this.rateLimitsCache.get(tokenId);
574
- if (cached && Date.now() - cached.cachedAt < OpenAIDispatcher.RATE_LIMITS_CACHE_TTL) return cached;
598
+ if (cached && cached.generation === generation && Date.now() - cached.cachedAt < OpenAIDispatcher.RATE_LIMITS_CACHE_TTL) return {
599
+ data: cached.data,
600
+ cachedAt: cached.cachedAt
601
+ };
575
602
  const worker = (this.workerPool.get(tokenId) ?? []).find((w) => w.isReady);
576
603
  if (!worker) throw new Error("no ready openai workers");
577
604
  const entry = {
578
605
  data: await worker.getRateLimits(),
579
- cachedAt: Date.now()
606
+ cachedAt: Date.now(),
607
+ generation
608
+ };
609
+ if ((this.rateLimitsGenerationByToken.get(tokenId) ?? 0) === generation) this.rateLimitsCache.set(tokenId, entry);
610
+ return {
611
+ data: entry.data,
612
+ cachedAt: entry.cachedAt
580
613
  };
581
- this.rateLimitsCache.set(tokenId, entry);
582
- return entry;
583
614
  }
584
615
  requestDrainQueue() {
585
616
  this.drainQueue().catch((e) => logger.warn(`drainQueue failed: ${e.message}`));
586
617
  }
618
+ invalidateRateLimitsCache(tokenId) {
619
+ this.rateLimitsCache.delete(tokenId);
620
+ this.rateLimitsGenerationByToken.set(tokenId, (this.rateLimitsGenerationByToken.get(tokenId) ?? 0) + 1);
621
+ }
587
622
  setTokenMetadata(id, name, credentials, quotaThreshold, weight) {
588
623
  this.tokenMetadata.set(id, {
589
624
  name,
@@ -657,28 +692,41 @@ var OpenAIDispatcher = class OpenAIDispatcher {
657
692
  };
658
693
  }
659
694
  async isTokenQuotaEligible(tokenId, tokenName, excludedTokenIds) {
660
- const threshold = this.getQuotaThreshold(tokenId);
661
- if (threshold === void 0 || threshold === null) return true;
662
- let result;
663
- try {
664
- result = await readOpenAIQuotaUsage(() => this.getRateLimitsByTokenId(tokenId));
665
- } catch (e) {
666
- this.logQuotaLookupFailOpen(tokenId, tokenName, e.message);
667
- return true;
668
- }
669
- if (result.kind === "lookup_failed") {
670
- this.logQuotaLookupFailOpen(tokenId, tokenName, result.reason);
695
+ for (;;) {
696
+ const tokenMetadata = this.tokenMetadata.get(tokenId);
697
+ const threshold = tokenMetadata?.quotaThreshold;
698
+ if (!tokenMetadata?.active || threshold === void 0 || threshold === null) {
699
+ this.quotaBlockedTokenIds.delete(tokenId);
700
+ return true;
701
+ }
702
+ let result;
703
+ try {
704
+ result = await readOpenAIQuotaUsage(() => this.getRateLimitsByTokenId(tokenId));
705
+ } catch (e) {
706
+ if (this.tokenMetadata.get(tokenId) !== tokenMetadata) continue;
707
+ this.quotaBlockedTokenIds.delete(tokenId);
708
+ this.logQuotaLookupFailOpen(tokenId, tokenMetadata.name ?? tokenName, e.message);
709
+ return true;
710
+ }
711
+ if (this.tokenMetadata.get(tokenId) !== tokenMetadata) continue;
712
+ if (result.kind === "lookup_failed") {
713
+ this.quotaBlockedTokenIds.delete(tokenId);
714
+ this.logQuotaLookupFailOpen(tokenId, tokenMetadata.name ?? tokenName, result.reason);
715
+ return true;
716
+ }
717
+ if (result.utilizationPct >= threshold) {
718
+ const transitioned = !this.quotaBlockedTokenIds.has(tokenId);
719
+ this.quotaBlockedTokenIds.add(tokenId);
720
+ if (transitioned) this.logQuotaOverThreshold(tokenId, tokenMetadata.name ?? tokenName, threshold, result);
721
+ excludedTokenIds?.add(tokenId);
722
+ return false;
723
+ }
724
+ if (this.quotaBlockedTokenIds.delete(tokenId)) this.logQuotaRecovered(tokenId, tokenMetadata.name ?? tokenName, threshold, result);
671
725
  return true;
672
726
  }
673
- if (result.utilizationPct >= threshold) {
674
- this.logQuotaOverThreshold(tokenId, tokenName, threshold, result);
675
- excludedTokenIds?.add(tokenId);
676
- return false;
677
- }
678
- return true;
679
727
  }
680
728
  logQuotaOverThreshold(tokenId, tokenName, threshold, result) {
681
- logger.info("quota_threshold gate: over_threshold", {
729
+ logger.info(`quota_threshold gate: over_threshold ${tokenName}[${tokenId}] (${result.utilizationPct}% >= ${threshold}%)`, {
682
730
  tokenId,
683
731
  tokenName,
684
732
  provider: "openai",
@@ -691,6 +739,20 @@ var OpenAIDispatcher = class OpenAIDispatcher {
691
739
  reason: "over_threshold"
692
740
  });
693
741
  }
742
+ logQuotaRecovered(tokenId, tokenName, threshold, result) {
743
+ logger.info(`quota_threshold gate: recovered ${tokenName}[${tokenId}] (${result.utilizationPct}% < ${threshold}%)`, {
744
+ tokenId,
745
+ tokenName,
746
+ provider: "openai",
747
+ threshold,
748
+ cachedUtilization: result.utilizationPct,
749
+ cacheAge: result.cacheAgeMs,
750
+ windowDurationMins: result.windowDurationMins,
751
+ resetsAt: result.resetsAt,
752
+ limitId: result.limitId,
753
+ reason: "recovered"
754
+ });
755
+ }
694
756
  logQuotaLookupFailOpen(tokenId, tokenName, reason) {
695
757
  const threshold = this.getQuotaThreshold(tokenId);
696
758
  logger.warn("quota_threshold gate: lookup_fail_open", {
@@ -726,16 +788,17 @@ var OpenAIDispatcher = class OpenAIDispatcher {
726
788
  accountId: ""
727
789
  });
728
790
  const authUrl = await worker.startBrowserLogin();
791
+ const timer = setTimeout(() => {
792
+ if (this.pendingLogin?.worker === worker) {
793
+ logger.warn(`browser login timeout for ${name}, killing worker`);
794
+ worker.kill().catch(() => {});
795
+ this.pendingLogin = null;
796
+ }
797
+ }, 3e5);
729
798
  this.pendingLogin = {
730
799
  worker,
731
800
  name,
732
- timer: setTimeout(() => {
733
- if (this.pendingLogin?.worker === worker) {
734
- logger.warn(`browser login timeout for ${name}, killing worker`);
735
- worker.kill().catch(() => {});
736
- this.pendingLogin = null;
737
- }
738
- }, 3e5)
801
+ timer
739
802
  };
740
803
  return { authUrl };
741
804
  }
@@ -775,4 +838,4 @@ var OpenAIDispatcher = class OpenAIDispatcher {
775
838
  //#endregion
776
839
  export { ImageGenerationError, MAX_OPENAI_WORKERS_PER_TOKEN, OPENAI_WORKER_BASE_RSS_GIB, OPENAI_WORKER_RSS_GIB, OpenAIDispatcher, estimateOpenAIWorkerRssGiB, makeOpenAIWorkerId, resolveOpenAIWorkerPoolConfig };
777
840
 
778
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWRpc3BhdGNoZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWRpc3BhdGNoZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBPcGVuQUlEaXNwYXRjaGVyIOKAlCBjb2RleCBhcHAtc2VydmVyIHdvcmtlciBwb29sICsg7Yag7YGwIOudvOyasO2MhS5cbiAqXG4gKiAtIO2GoO2BsOuLuSBOIHdvcmtlciAoQ29kZXhBcHBTZXJ2ZXJXb3JrZXIpLCDquLDrs7ggM1xuICogLSBpZGxlIHdvcmtlciByb3VuZC1yb2JpbiDshKDtg50gKyDtgZAg64yA6riwICjsoITrtoAgYnVzeSDsi5wpXG4gKiAtIFRva2VuU3Vic2NyaWJlciDsnbTrsqTtirjroZwgd29ya2VyIHBvb2wg64+Z6riw7ZmUXG4gKiAtIGJhY2twcmVzc3VyZTog7YGQIGZ1bGwg65iQ64qUIHRpbWVvdXQg7IucIFNFUlZFUl9CVVNZXG4gKi9cbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBmcmVlbWVtIH0gZnJvbSBcIm5vZGU6b3NcIjtcblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcblxuaW1wb3J0IHsgUXVvdGFUaHJlc2hvbGRFeGNlZWRlZEVycm9yIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLnR5cGVzXCI7XG5pbXBvcnQgeyBUb2tlbk1vZGVsIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLm1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIE9wZW5BSUNyZWRlbnRpYWxzIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIEdldEFjY291bnRSYXRlTGltaXRzUmVzcG9uc2UgfSBmcm9tIFwiLi4vLi4vLi4vY29kZXgtcHJvdG9jb2wvdjIvR2V0QWNjb3VudFJhdGVMaW1pdHNSZXNwb25zZVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBHZW5lcmF0ZVJlcXVlc3QsXG4gIHR5cGUgR2VuZXJhdGVSZXN1bHQsXG4gIHR5cGUgR2VuZXJhdGVTdHJlYW1DYWxsYmFja3MsXG4gIHR5cGUgUHJvdmlkZXJEaXNwYXRjaGVyLFxufSBmcm9tIFwiLi4vY29tbW9uL3Byb3ZpZGVyLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IFNtb290aFdlaWdodGVkUm91bmRSb2JpbiB9IGZyb20gXCIuLi9jb21tb24vc21vb3RoLXdlaWdodGVkLXJvdW5kLXJvYmluXCI7XG5pbXBvcnQgeyBDb2RleEFwcFNlcnZlcldvcmtlciwgdHlwZSBTdHJlYW1DYWxsYmFja3MsIHR5cGUgVHVyblJlcXVlc3QgfSBmcm9tIFwiLi9jb2RleC13b3JrZXJcIjtcbmltcG9ydCB7XG4gIHJlYWRPcGVuQUlRdW90YVVzYWdlLFxuICB0eXBlIE9wZW5BSVF1b3RhVXNhZ2VSZXN1bHQsXG4gIHR5cGUgT3BlbkFJUmF0ZUxpbWl0c1dpdGhNZXRhLFxufSBmcm9tIFwiLi9vcGVuYWktcXVvdGFcIjtcbmltcG9ydCB7IGhhbmRsZUNoYXRncHRBdXRoVG9rZW5zUmVmcmVzaCB9IGZyb20gXCIuL29wZW5haS1yZWZyZXNoXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcIm9wZW5haS1kaXNwYXRjaGVyXCJdKTtcblxuLy8g7J2066+47KeAIOyDneyEsSDsmpTssq3snbQg6rKM7J207Yq4L+yDneyEseyXkCDsi6TtjKjtlojsnYQg65WM7J2YIOq1rOu2hOyekC5cbi8vIC0gXCJnYXRlXCI6IOyCrOyghCDqsoDspp0g7Iuk7YyoKGNhcGFiaWxpdHkv66qo6424IOupgO2LsOuqqOuLrCDrtojstqnsobEpIOKAlCB0dXJuIOuvuOyLpO2WiS5cbi8vIC0gXCJub3RfY2FsbGVkXCI6IHR1cm4g7J2AIOyEseqzte2WiOycvOuCmCDrqqjrjbjsnbQgaW1hZ2UgdG9vbCDsnYQg7Zi47LacIOyViCDtlagg4oCUIOyerOyLnOuPhCDrrLTsnbUo7ZSE66Gs7ZSE7Yq4IOusuOygnCkuXG4vLyAtIFwiaW5jb21wbGV0ZVwiOiB0b29sIOyLnOuPhOuQkOycvOuCmCDsmYTshLEg7J2066+47KeAIOuvuOuPhOywqSDigJQg7J6s7Iuc64+EIO2bhOuztCjshJzrsoTsuKEg7Iuk7YyoL+qxsOu2gCkuXG5leHBvcnQgdHlwZSBJbWFnZUZhaWx1cmVLaW5kID0gXCJnYXRlXCIgfCBcIm5vdF9jYWxsZWRcIiB8IFwiaW5jb21wbGV0ZVwiO1xuXG5leHBvcnQgY2xhc3MgSW1hZ2VHZW5lcmF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IGtpbmQ6IEltYWdlRmFpbHVyZUtpbmQsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSBcIkltYWdlR2VuZXJhdGlvbkVycm9yXCI7XG4gIH1cbn1cblxuY29uc3QgREVGQVVMVF9FRkZPUlQgPSBcImxvd1wiO1xuZXhwb3J0IGNvbnN0IE1BWF9PUEVOQUlfV09SS0VSU19QRVJfVE9LRU4gPSAyMDtcbmNvbnN0IERFRkFVTFRfT1BFTkFJX01JTl9XT1JLRVJTX1BFUl9UT0tFTiA9IDU7XG5jb25zdCBERUZBVUxUX09QRU5BSV9NQVhfV09SS0VSU19QRVJfVE9LRU4gPSAxNTtcbmNvbnN0IFFVRVVFX1RJTUVPVVRfTVMgPSA2MF8wMDA7XG5jb25zdCBNQVhfUVVFVUVfU0laRSA9IDUwO1xuY29uc3QgU1BBV05fSU5URVJWQUxfTVMgPSA1MDA7XG5cbmV4cG9ydCBjb25zdCBPUEVOQUlfV09SS0VSX0JBU0VfUlNTX0dJQiA9IDAuNzE7XG5leHBvcnQgY29uc3QgT1BFTkFJX1dPUktFUl9SU1NfR0lCID0gMC4xNTc7XG5cbmV4cG9ydCB0eXBlIE9wZW5BSVdvcmtlclBvb2xDb25maWcgPSB7XG4gIGF1dG9zY2FsZTogYm9vbGVhbjtcbiAgbWluV29ya2Vyc1BlclRva2VuOiBudW1iZXI7XG4gIG1heFdvcmtlcnNQZXJUb2tlbjogbnVtYmVyO1xuICBzY2FsZUludGVydmFsTXM6IG51bWJlcjtcbiAgc2NhbGVEb3duSWRsZU1zOiBudW1iZXI7XG4gIG1heEVzdGltYXRlZFJzc0dpQjogbnVtYmVyO1xuICBtaW5Ib3N0QXZhaWxhYmxlR2lCOiBudW1iZXI7XG59O1xuXG5mdW5jdGlvbiBib3VuZGVkSW50ZWdlcihcbiAgdmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgZmFsbGJhY2s6IG51bWJlcixcbiAgbWluOiBudW1iZXIsXG4gIG1heDogbnVtYmVyLFxuKTogbnVtYmVyIHtcbiAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHZhbHVlKTtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSkgcmV0dXJuIGZhbGxiYWNrO1xuICByZXR1cm4gTWF0aC5tYXgobWluLCBNYXRoLm1pbihNYXRoLmZsb29yKHBhcnNlZCksIG1heCkpO1xufVxuXG5mdW5jdGlvbiBib3VuZGVkTnVtYmVyKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQsIGZhbGxiYWNrOiBudW1iZXIsIG1pbjogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHZhbHVlKTtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSkgcmV0dXJuIGZhbGxiYWNrO1xuICByZXR1cm4gTWF0aC5tYXgobWluLCBwYXJzZWQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU9wZW5BSVdvcmtlclBvb2xDb25maWcoXG4gIGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiA9IHByb2Nlc3MuZW52LFxuKTogT3BlbkFJV29ya2VyUG9vbENvbmZpZyB7XG4gIGNvbnN0IGF1dG9zY2FsZSA9IGVudi5RR1JJRF9PUEVOQUlfQVVUT1NDQUxFICE9PSBcImZhbHNlXCIgJiYgZW52LlFHUklEX09QRU5BSV9BVVRPU0NBTEUgIT09IFwiMFwiO1xuICBjb25zdCBsZWdhY3lXb3JrZXJzID0gYm91bmRlZEludGVnZXIoXG4gICAgZW52LlFHUklEX1dPUktFUlNfUEVSX1RPS0VOLFxuICAgIERFRkFVTFRfT1BFTkFJX01JTl9XT1JLRVJTX1BFUl9UT0tFTixcbiAgICAxLFxuICAgIE1BWF9PUEVOQUlfV09SS0VSU19QRVJfVE9LRU4sXG4gICk7XG4gIGNvbnN0IG1pbldvcmtlcnNQZXJUb2tlbiA9IGJvdW5kZWRJbnRlZ2VyKFxuICAgIGVudi5RR1JJRF9PUEVOQUlfTUlOX1dPUktFUlNfUEVSX1RPS0VOLFxuICAgIGxlZ2FjeVdvcmtlcnMsXG4gICAgMSxcbiAgICBNQVhfT1BFTkFJX1dPUktFUlNfUEVSX1RPS0VOLFxuICApO1xuICBjb25zdCBjb25maWd1cmVkTWF4ID0gYm91bmRlZEludGVnZXIoXG4gICAgZW52LlFHUklEX09QRU5BSV9NQVhfV09SS0VSU19QRVJfVE9LRU4sXG4gICAgYXV0b3NjYWxlID8gREVGQVVMVF9PUEVOQUlfTUFYX1dPUktFUlNfUEVSX1RPS0VOIDogbWluV29ya2Vyc1BlclRva2VuLFxuICAgIDEsXG4gICAgTUFYX09QRU5BSV9XT1JLRVJTX1BFUl9UT0tFTixcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIGF1dG9zY2FsZSxcbiAgICBtaW5Xb3JrZXJzUGVyVG9rZW4sXG4gICAgbWF4V29ya2Vyc1BlclRva2VuOiBhdXRvc2NhbGVcbiAgICAgID8gTWF0aC5tYXgobWluV29ya2Vyc1BlclRva2VuLCBjb25maWd1cmVkTWF4KVxuICAgICAgOiBtaW5Xb3JrZXJzUGVyVG9rZW4sXG4gICAgc2NhbGVJbnRlcnZhbE1zOiBib3VuZGVkSW50ZWdlcihlbnYuUUdSSURfT1BFTkFJX1NDQUxFX0lOVEVSVkFMX01TLCA1XzAwMCwgMjUwLCAzMDBfMDAwKSxcbiAgICBzY2FsZURvd25JZGxlTXM6IGJvdW5kZWRJbnRlZ2VyKFxuICAgICAgZW52LlFHUklEX09QRU5BSV9TQ0FMRV9ET1dOX0lETEVfTVMsXG4gICAgICAxMCAqIDYwXzAwMCxcbiAgICAgIDFfMDAwLFxuICAgICAgMjQgKiA2MCAqIDYwXzAwMCxcbiAgICApLFxuICAgIG1heEVzdGltYXRlZFJzc0dpQjogYm91bmRlZE51bWJlcihlbnYuUUdSSURfT1BFTkFJX01BWF9FU1RJTUFURURfUlNTX0dJQiwgMTYsIDEpLFxuICAgIG1pbkhvc3RBdmFpbGFibGVHaUI6IGJvdW5kZWROdW1iZXIoZW52LlFHUklEX09QRU5BSV9NSU5fSE9TVF9BVkFJTEFCTEVfR0lCLCAyMCwgMCksXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlc3RpbWF0ZU9wZW5BSVdvcmtlclJzc0dpQih0b3RhbFdvcmtlcnM6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBPUEVOQUlfV09SS0VSX0JBU0VfUlNTX0dJQiArIE9QRU5BSV9XT1JLRVJfUlNTX0dJQiAqIHRvdGFsV29ya2Vycztcbn1cblxuZnVuY3Rpb24gcmVhZEhvc3RBdmFpbGFibGVHaUIoKTogbnVtYmVyIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBtYXRjaCA9IHJlYWRGaWxlU3luYyhcIi9wcm9jL21lbWluZm9cIiwgXCJ1dGY4XCIpLm1hdGNoKC9eTWVtQXZhaWxhYmxlOlxccysoXFxkKylcXHMra0IkL20pO1xuICAgIGlmIChtYXRjaD8uWzFdKSByZXR1cm4gTnVtYmVyKG1hdGNoWzFdKSAvIDEwMjQgLyAxMDI0O1xuICB9IGNhdGNoIHt9XG4gIHJldHVybiBmcmVlbWVtKCkgLyAxMDI0IC8gMTAyNCAvIDEwMjQ7XG59XG5cbi8vIHRocmVhZCDsnqzsgqzsmqkocHJvbXB0IGNhY2hlIOqzoOyglSkuIOuBhOuptCDquLDsobQgXCLrp6QgdHVybiDsg4ggdGhyZWFkICsgaGlzdG9yeSBpbmplY3RcIiDrj5nsnpEuXG5jb25zdCBUSFJFQURfUkVVU0VfRU5BQkxFRCA9IHByb2Nlc3MuZW52LlFHUklEX09QRU5BSV9USFJFQURfUkVVU0UgIT09IFwiZmFsc2VcIjtcbi8vIOyijO2RnCB3b3JrZXIg6rCAIGJ1c3kg7J28IOuVjCBmcmVlIOulvCDquLDri6TrpqzripQg7LWc64yAIOyLnOqwhC4g7LSI6rO8IOyLnCDsg4ggdGhyZWFkIOuhnCDtj7TrsLEuXG5jb25zdCBSRVVTRV9XT1JLRVJfV0FJVF9NUyA9IDVfMDAwO1xuY29uc3QgUkVVU0VfV09SS0VSX1BPTExfTVMgPSA1MDtcblxuLy8gd29ya2VySWQg7ZWp7ISxOiB0b2tlbklkIOyZgCB3b3JrZXJJbmRleCgwLi4xOSkg66W8IO2VmOuCmOydmCDslYjsoJUg7Iir7J6Q66GcIOyduOy9lOuUqS5cbmNvbnN0IE9QRU5BSV9XT1JLRVJfSURfU1RSSURFID0gMTAwO1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VPcGVuQUlXb3JrZXJJZCh0b2tlbklkOiBudW1iZXIsIHdvcmtlckluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gdG9rZW5JZCAqIE9QRU5BSV9XT1JLRVJfSURfU1RSSURFICsgd29ya2VySW5kZXg7XG59XG5cbmZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG5cbmZ1bmN0aW9uIHF1b3RhVGhyZXNob2xkRXhjZWVkZWRNZXNzYWdlKFxuICBwcm92aWRlcjogc3RyaW5nLFxuICB0b2tlbnM6IEFycmF5PHsgdG9rZW5OYW1lOiBzdHJpbmc7IHRocmVzaG9sZDogbnVtYmVyIH0+LFxuKTogc3RyaW5nIHtcbiAgY29uc3QgZGV0YWlscyA9IHRva2Vuc1xuICAgIC5tYXAoKHRva2VuKSA9PiBgJHt0b2tlbi50b2tlbk5hbWV9ICh0aHJlc2hvbGQgJHt0b2tlbi50aHJlc2hvbGR9JSlgKVxuICAgIC5qb2luKFwiLCBcIik7XG4gIHJldHVybiBkZXRhaWxzLmxlbmd0aCA+IDBcbiAgICA/IGBBbGwgJHtwcm92aWRlcn0gdG9rZW5zIGV4Y2VlZGVkIHF1b3RhIHRocmVzaG9sZDogJHtkZXRhaWxzfWBcbiAgICA6IGBBbGwgJHtwcm92aWRlcn0gdG9rZW5zIGV4Y2VlZGVkIHF1b3RhIHRocmVzaG9sZGA7XG59XG5cbnR5cGUgUXVldWVJdGVtID0ge1xuICByZXNvbHZlOiAod29ya2VyOiBDb2RleEFwcFNlcnZlcldvcmtlcikgPT4gdm9pZDtcbiAgcmVqZWN0OiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xuICB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gIGFib3J0Q2xlYW51cD86ICgpID0+IHZvaWQ7XG4gIGV4Y2x1ZGVkVG9rZW5JZHM6IFNldDxudW1iZXI+O1xufTtcblxudHlwZSBUb2tlbk1ldGFkYXRhID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGNyZWRlbnRpYWxzOiBPcGVuQUlDcmVkZW50aWFscztcbiAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsO1xuICB3ZWlnaHQ6IG51bWJlcjtcbiAgYWN0aXZlOiBib29sZWFuO1xufTtcblxudHlwZSBUb2tlbkVsaWdpYmlsaXR5ID0ge1xuICByZWFkeUFjdGl2ZVRva2VuSWRzOiBTZXQ8bnVtYmVyPjtcbiAgZWxpZ2libGVUb2tlbklkczogU2V0PG51bWJlcj47XG4gIG92ZXJUaHJlc2hvbGRUb2tlbnM6IEFycmF5PHsgdG9rZW5OYW1lOiBzdHJpbmc7IHRocmVzaG9sZDogbnVtYmVyIH0+O1xuICB0aHJlc2hvbGRlZFRva2VuQ291bnQ6IG51bWJlcjtcbn07XG5cbmV4cG9ydCBjbGFzcyBPcGVuQUlEaXNwYXRjaGVyIGltcGxlbWVudHMgUHJvdmlkZXJEaXNwYXRjaGVyIHtcbiAgd29ya2VyUG9vbCA9IG5ldyBNYXA8bnVtYmVyLCBDb2RleEFwcFNlcnZlcldvcmtlcltdPigpO1xuICB0b2tlbk1ldGFkYXRhID0gbmV3IE1hcDxudW1iZXIsIFRva2VuTWV0YWRhdGE+KCk7XG4gIHF1ZXVlOiBRdWV1ZUl0ZW1bXSA9IFtdO1xuICByZWFkb25seSBwb29sQ29uZmlnOiBPcGVuQUlXb3JrZXJQb29sQ29uZmlnO1xuICBwcml2YXRlIHJlYWRvbmx5IHdlaWdodGVkU2VsZWN0b3IgPSBuZXcgU21vb3RoV2VpZ2h0ZWRSb3VuZFJvYmluKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgd29ya2VyQ3Vyc29yQnlUb2tlbiA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZ2V0SG9zdEF2YWlsYWJsZUdpQjogKCkgPT4gbnVtYmVyO1xuICBwcml2YXRlIGRyYWluaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgZHJhaW5BZ2FpbiA9IGZhbHNlO1xuICBwcml2YXRlIHNjYWxlclRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzY2FsaW5nUHJvbWlzZTogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxhc3RSZXF1ZXN0QXQgPSBEYXRlLm5vdygpO1xuICBwcml2YXRlIHN0b3BwZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwb29sQ29uZmlnOiBPcGVuQUlXb3JrZXJQb29sQ29uZmlnID0gcmVzb2x2ZU9wZW5BSVdvcmtlclBvb2xDb25maWcoKSxcbiAgICBnZXRIb3N0QXZhaWxhYmxlR2lCOiAoKSA9PiBudW1iZXIgPSByZWFkSG9zdEF2YWlsYWJsZUdpQixcbiAgKSB7XG4gICAgdGhpcy5wb29sQ29uZmlnID0gcG9vbENvbmZpZztcbiAgICB0aGlzLmdldEhvc3RBdmFpbGFibGVHaUIgPSBnZXRIb3N0QXZhaWxhYmxlR2lCO1xuICB9XG5cbiAgYXN5bmMgc3RhcnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zdG9wcGVkID0gZmFsc2U7XG4gICAgY29uc3QgeyByb3dzIH0gPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRNYW55KFwiQVwiKTtcbiAgICBjb25zdCBvcGVuYWlUb2tlbnMgPSByb3dzLmZpbHRlcigodCkgPT4gdC5wcm92aWRlciA9PT0gXCJvcGVuYWlcIik7XG4gICAgbG9nZ2VyLmluZm8oXG4gICAgICB0aGlzLnBvb2xDb25maWcuYXV0b3NjYWxlXG4gICAgICAgID8gYHN0YXJ0aW5nICR7b3BlbmFpVG9rZW5zLmxlbmd0aH0gb3BlbmFpIHRva2VucyAoJHt0aGlzLnBvb2xDb25maWcubWluV29ya2Vyc1BlclRva2VufS0ke3RoaXMucG9vbENvbmZpZy5tYXhXb3JrZXJzUGVyVG9rZW59IHdvcmtlcnMgZWFjaCwgYXV0b3NjYWxlKWBcbiAgICAgICAgOiBgc3RhcnRpbmcgJHtvcGVuYWlUb2tlbnMubGVuZ3RofSBvcGVuYWkgdG9rZW5zICgke3RoaXMucG9vbENvbmZpZy5taW5Xb3JrZXJzUGVyVG9rZW59IHdvcmtlcnMgZWFjaClgLFxuICAgICk7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICBvcGVuYWlUb2tlbnMubWFwKGFzeW5jICh0KSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3Bhd25Xb3JrZXJzKFxuICAgICAgICAgIHQuaWQsXG4gICAgICAgICAgdC5uYW1lLFxuICAgICAgICAgIHQuY3JlZGVudGlhbHMgYXMgT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgICAgICAgdC5xdW90YV90aHJlc2hvbGQsXG4gICAgICAgICAgdC53ZWlnaHQsXG4gICAgICAgICk7XG4gICAgICAgIGlmICghdC5hY3RpdmUpIHRoaXMub25Ub2tlbkRlYWN0aXZhdGVkKHQuaWQpO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIGlmICh0aGlzLnBvb2xDb25maWcuYXV0b3NjYWxlKSB7XG4gICAgICB0aGlzLnNjYWxlclRpbWVyID0gc2V0SW50ZXJ2YWwoXG4gICAgICAgICgpID0+IHRoaXMucmVxdWVzdEF1dG9zY2FsZUV2YWx1YXRpb24oKSxcbiAgICAgICAgdGhpcy5wb29sQ29uZmlnLnNjYWxlSW50ZXJ2YWxNcyxcbiAgICAgICk7XG4gICAgICB0aGlzLnNjYWxlclRpbWVyLnVucmVmPy4oKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RvcHBlZCA9IHRydWU7XG4gICAgaWYgKHRoaXMuc2NhbGVyVGltZXIpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5zY2FsZXJUaW1lcik7XG4gICAgICB0aGlzLnNjYWxlclRpbWVyID0gbnVsbDtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5zY2FsaW5nUHJvbWlzZT8uY2F0Y2goKCkgPT4ge30pO1xuICAgIHRoaXMucmVqZWN0QWxsUXVldWVkKFwiRElTUEFUQ0hFUl9TSFVURE9XTlwiKTtcbiAgICBjb25zdCBraWxscyA9IFsuLi50aGlzLndvcmtlclBvb2wudmFsdWVzKCldLmZsYXQoKS5tYXAoKHcpID0+IHcua2lsbCgpKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoa2lsbHMpO1xuICAgIGZvciAoY29uc3QgaWQgb2YgdGhpcy50b2tlbk1ldGFkYXRhLmtleXMoKSkgdGhpcy53ZWlnaHRlZFNlbGVjdG9yLnJlbW92ZVRva2VuKGlkKTtcbiAgICB0aGlzLndvcmtlclBvb2wuY2xlYXIoKTtcbiAgICB0aGlzLnRva2VuTWV0YWRhdGEuY2xlYXIoKTtcbiAgICB0aGlzLndvcmtlckN1cnNvckJ5VG9rZW4uY2xlYXIoKTtcbiAgICB0aGlzLndlaWdodGVkU2VsZWN0b3IucmVzZXRTY29yZXMoKTtcbiAgICB0aGlzLnJhdGVMaW1pdHNDYWNoZS5jbGVhcigpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFRva2VuIGV2ZW50cyAoZnJvbSBUb2tlblN1YnNjcmliZXIpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIG9uVG9rZW5BZGRlZChcbiAgICBpZDogbnVtYmVyLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsLFxuICAgIHdlaWdodCA9IDEsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc2V0VG9rZW5NZXRhZGF0YShpZCwgbmFtZSwgY3JlZGVudGlhbHMsIHF1b3RhVGhyZXNob2xkLCB3ZWlnaHQpO1xuICAgIGlmICh0aGlzLndvcmtlclBvb2wuaGFzKGlkKSkgcmV0dXJuO1xuICAgIGF3YWl0IHRoaXMuc3Bhd25Xb3JrZXJzKGlkLCBuYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCk7XG4gIH1cblxuICBhc3luYyBvblRva2VuUmVtb3ZlZChpZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgd29ya2VycyA9IHRoaXMud29ya2VyUG9vbC5nZXQoaWQpID8/IFtdO1xuICAgIGNvbnN0IHRva2VuTmFtZSA9IHdvcmtlcnNbMF0/LnRva2VuTmFtZTtcbiAgICB0aGlzLndvcmtlclBvb2wuZGVsZXRlKGlkKTtcbiAgICB0aGlzLnRva2VuTWV0YWRhdGEuZGVsZXRlKGlkKTtcbiAgICB0aGlzLndlaWdodGVkU2VsZWN0b3IucmVtb3ZlVG9rZW4oaWQpO1xuICAgIHRoaXMud29ya2VyQ3Vyc29yQnlUb2tlbi5kZWxldGUoaWQpO1xuICAgIHRoaXMucmF0ZUxpbWl0c0NhY2hlLmRlbGV0ZShpZCk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHdvcmtlcnMubWFwKCh3KSA9PiB3LmtpbGwoKSkpO1xuICAgIGlmICh0aGlzLmdldEFsbFJlYWR5QWN0aXZlV29ya2VycygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5yZWplY3RBbGxRdWV1ZWQoXCJOT19PUEVOQUlfV09SS0VSU1wiKTtcbiAgICB9XG4gICAgaWYgKHdvcmtlcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbGFiZWwgPSB0b2tlbk5hbWUgPz8gYHRva2VuICR7aWR9YDtcbiAgICAgIGxvZ2dlci5pbmZvKGB3b3JrZXJzIHJlbW92ZWQ6ICR7bGFiZWx9ICgke3dvcmtlcnMubGVuZ3RofSlgKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBvblRva2VuVXBkYXRlZChcbiAgICBpZDogbnVtYmVyLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsLFxuICAgIHdlaWdodCA9IDEsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy53b3JrZXJQb29sLmdldChpZCkgPz8gW107XG4gICAgY29uc3QgcmVuYW1lZCA9IGV4aXN0aW5nLnNvbWUoKHcpID0+IHcudG9rZW5OYW1lICE9PSBuYW1lKTtcbiAgICB0aGlzLnNldFRva2VuTWV0YWRhdGEoaWQsIG5hbWUsIGNyZWRlbnRpYWxzLCBxdW90YVRocmVzaG9sZCwgd2VpZ2h0KTtcbiAgICBpZiAocmVuYW1lZCkgdGhpcy5yYXRlTGltaXRzQ2FjaGUuZGVsZXRlKGlkKTtcblxuICAgIGlmIChleGlzdGluZy5sZW5ndGggPT09IDApIHtcbiAgICAgIGF3YWl0IHRoaXMuc3Bhd25Xb3JrZXJzKGlkLCBuYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV4aXN0aW5nLmV2ZXJ5KCh3KSA9PiB3LmNhblJldXNlRm9yVG9rZW4obmFtZSwgY3JlZGVudGlhbHMpKSkge1xuICAgICAgZXhpc3RpbmcuZm9yRWFjaCgodykgPT4gdy51cGRhdGVUb2tlblN0YXRlKG5hbWUsIGNyZWRlbnRpYWxzKSk7XG4gICAgICBsb2dnZXIuaW5mbyhgd29ya2VycyB1cGRhdGVkIGluLXBsYWNlOiAke25hbWV9YCk7XG4gICAgICB0aGlzLnJlcXVlc3REcmFpblF1ZXVlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy53b3JrZXJQb29sLmRlbGV0ZShpZCk7XG4gICAgdGhpcy5yYXRlTGltaXRzQ2FjaGUuZGVsZXRlKGlkKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoZXhpc3RpbmcubWFwKCh3KSA9PiB3LmtpbGwoKSkpO1xuICAgIGF3YWl0IHRoaXMuc3Bhd25Xb3JrZXJzKGlkLCBuYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCk7XG4gIH1cblxuICBvblRva2VuRGVhY3RpdmF0ZWQoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHdvcmtlcnMgPSB0aGlzLndvcmtlclBvb2wuZ2V0KGlkKSA/PyBbXTtcbiAgICBjb25zdCB0b2tlbk5hbWUgPSB3b3JrZXJzWzBdPy50b2tlbk5hbWU7XG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KGlkKTtcbiAgICBpZiAobWV0YWRhdGEpIG1ldGFkYXRhLmFjdGl2ZSA9IGZhbHNlO1xuICAgIGNvbnN0IGNoYW5nZWQgPSB3b3JrZXJzLnNvbWUoKHdvcmtlcikgPT4gd29ya2VyLmFjdGl2ZSk7XG4gICAgd29ya2Vycy5mb3JFYWNoKCh3KSA9PiB7XG4gICAgICB3LmFjdGl2ZSA9IGZhbHNlO1xuICAgIH0pO1xuICAgIGlmIChjaGFuZ2VkKSB0aGlzLndlaWdodGVkU2VsZWN0b3IucmVzZXRTY29yZXMoKTtcbiAgICBpZiAodGhpcy5nZXRBbGxSZWFkeUFjdGl2ZVdvcmtlcnMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMucmVqZWN0QWxsUXVldWVkKFwiTk9fQUNUSVZFX1dPUktFUlNcIik7XG4gICAgfVxuICAgIGNvbnN0IGxhYmVsID0gdG9rZW5OYW1lID8/IGB0b2tlbiAke2lkfWA7XG4gICAgbG9nZ2VyLmluZm8oYHdvcmtlcnMgZGVhY3RpdmF0ZWQ6ICR7bGFiZWx9YCk7XG4gIH1cblxuICBvblRva2VuQWN0aXZhdGVkKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB3b3JrZXJzID0gdGhpcy53b3JrZXJQb29sLmdldChpZCkgPz8gW107XG4gICAgY29uc3QgdG9rZW5OYW1lID0gd29ya2Vyc1swXT8udG9rZW5OYW1lO1xuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy50b2tlbk1ldGFkYXRhLmdldChpZCk7XG4gICAgaWYgKG1ldGFkYXRhKSBtZXRhZGF0YS5hY3RpdmUgPSB0cnVlO1xuICAgIGNvbnN0IGNoYW5nZWQgPSB3b3JrZXJzLnNvbWUoKHdvcmtlcikgPT4gIXdvcmtlci5hY3RpdmUpO1xuICAgIHdvcmtlcnMuZm9yRWFjaCgodykgPT4ge1xuICAgICAgdy5hY3RpdmUgPSB0cnVlO1xuICAgIH0pO1xuICAgIGlmIChjaGFuZ2VkKSB0aGlzLndlaWdodGVkU2VsZWN0b3IucmVzZXRTY29yZXMoKTtcbiAgICB0aGlzLnJlcXVlc3REcmFpblF1ZXVlKCk7XG4gICAgY29uc3QgbGFiZWwgPSB0b2tlbk5hbWUgPz8gYHRva2VuICR7aWR9YDtcbiAgICBsb2dnZXIuaW5mbyhgd29ya2VycyBhY3RpdmF0ZWQ6ICR7bGFiZWx9YCk7XG4gIH1cblxuICBhc3luYyByZXBsYWNlVG9rZW5zKFxuICAgIHJvd3M6IEFycmF5PHtcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHM7XG4gICAgICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGw7XG4gICAgICB3ZWlnaHQ6IG51bWJlcjtcbiAgICB9PixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbmV4dCA9IG5ldyBTZXQocm93cy5tYXAoKHIpID0+IHIuaWQpKTtcbiAgICBmb3IgKGNvbnN0IGlkIG9mIEFycmF5LmZyb20odGhpcy53b3JrZXJQb29sLmtleXMoKSkpIHtcbiAgICAgIGlmICghbmV4dC5oYXMoaWQpKSBhd2FpdCB0aGlzLm9uVG9rZW5SZW1vdmVkKGlkKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICBpZiAodGhpcy53b3JrZXJQb29sLmhhcyhyb3cuaWQpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMub25Ub2tlblVwZGF0ZWQoXG4gICAgICAgICAgcm93LmlkLFxuICAgICAgICAgIHJvdy5uYW1lLFxuICAgICAgICAgIHJvdy5jcmVkZW50aWFscyxcbiAgICAgICAgICByb3cucXVvdGFUaHJlc2hvbGQsXG4gICAgICAgICAgcm93LndlaWdodCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMub25Ub2tlbkFkZGVkKHJvdy5pZCwgcm93Lm5hbWUsIHJvdy5jcmVkZW50aWFscywgcm93LnF1b3RhVGhyZXNob2xkLCByb3cud2VpZ2h0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMub25Ub2tlbkFjdGl2YXRlZChyb3cuaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBHZW5lcmF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhc3luYyBnZW5lcmF0ZShyZXE6IEdlbmVyYXRlUmVxdWVzdCk6IFByb21pc2U8R2VuZXJhdGVSZXN1bHQ+IHtcbiAgICB0aGlzLmxhc3RSZXF1ZXN0QXQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGV4Y2x1ZGVkVG9rZW5JZHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICAvLyB0aHJlYWQg7J6s7IKs7JqpIOqyveuhnDog7KKM7ZGcIHdvcmtlciDrpbwg7KCQ7Jyg7ZW0IOq4sOyhtCB0aHJlYWQg7JeQIHR1cm4g66eMIOyLpO2WiS5cbiAgICBjb25zdCByZXVzZVdvcmtlciA9IGF3YWl0IHRoaXMuYWNxdWlyZVJldXNlV29ya2VyKHJlcSwgZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKHJldXNlV29ya2VyKSB7XG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgYOKGuyAke3JldXNlV29ya2VyLnRva2VuTmFtZX1bJHtyZXVzZVdvcmtlci50b2tlbklkfV0gKHJldXNlIHRocmVhZCwgJHtyZXEubW9kZWx9KWAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUFuZFJlbGVhc2UocmV1c2VXb3JrZXIsICh3KSA9PlxuICAgICAgICB0aGlzLmV4ZWN1dGVUdXJuKHcsIHJlcSwgcmVxLnJldXNlIS50aHJlYWRJZCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IHRoaXMuYWNxdWlyZUlkbGVXb3JrZXIoZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKHdvcmtlcikge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGkiAke3dvcmtlci50b2tlbk5hbWV9WyR7d29ya2VyLnRva2VuSWR9XSAobW9kZWw6ICR7cmVxLm1vZGVsfSlgKTtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVBbmRSZWxlYXNlKHdvcmtlciwgKHcpID0+IHRoaXMuZXhlY3V0ZVR1cm4odywgcmVxKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmVucXVldWUoKHcpID0+IHtcbiAgICAgIGxvZ2dlci5pbmZvKGDihpIgJHt3LnRva2VuTmFtZX1bJHt3LnRva2VuSWR9XSAobW9kZWw6ICR7cmVxLm1vZGVsfSwgcXVldWVkKWApO1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVR1cm4odywgcmVxKTtcbiAgICB9LCBleGNsdWRlZFRva2VuSWRzKTtcbiAgfVxuXG4gIGFzeW5jIGdlbmVyYXRlU3RyZWFtKHJlcTogR2VuZXJhdGVSZXF1ZXN0LCBjYjogR2VuZXJhdGVTdHJlYW1DYWxsYmFja3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxhc3RSZXF1ZXN0QXQgPSBEYXRlLm5vdygpO1xuICAgIC8vIOydtOuvuOyngCDsg53shLHsnYAgbm9uLXN0cmVhbSDsoITsmqkoUjIpOiBjb2RleCDqsIAg7J2066+47KeAIOuNuO2DgOulvCDso7zsp4Ag7JWK6rOgIOyZhOyEsSBiYXNlNjQg66W8XG4gICAgLy8g7ZWcIOuyiOyXkCDspIDri6QuIOyKpO2KuOumrOuwjSDqsr3roZzroZwg7J2066+47KeAIOyalOyyreydtCDsmKTrqbQg66qF7Iuc7KCBIOyXkOufrC5cbiAgICBpZiAocmVxLmltYWdlR2VuZXJhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFxuICAgICAgICBcImdhdGVcIixcbiAgICAgICAgXCJpbWFnZSBnZW5lcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIHN0cmVhbWluZyBwYXRoXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBleGNsdWRlZFRva2VuSWRzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgY29uc3QgcmV1c2VXb3JrZXIgPSBhd2FpdCB0aGlzLmFjcXVpcmVSZXVzZVdvcmtlcihyZXEsIGV4Y2x1ZGVkVG9rZW5JZHMpO1xuICAgIGlmIChyZXVzZVdvcmtlcikge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGuyAke3JldXNlV29ya2VyLnRva2VuTmFtZX1bJHtyZXVzZVdvcmtlci50b2tlbklkfV0gKHJldXNlIHRocmVhZCwgW3N0cmVhbV0pYCk7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQW5kUmVsZWFzZShyZXVzZVdvcmtlciwgKHcpID0+XG4gICAgICAgIHRoaXMuZXhlY3V0ZVN0cmVhbVR1cm4odywgcmVxLCBjYiwgcmVxLnJldXNlIS50aHJlYWRJZCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IHRoaXMuYWNxdWlyZUlkbGVXb3JrZXIoZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKHdvcmtlcikge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGkiAke3dvcmtlci50b2tlbk5hbWV9WyR7d29ya2VyLnRva2VuSWR9XSAobW9kZWw6ICR7cmVxLm1vZGVsfSwgW3N0cmVhbV0pYCk7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQW5kUmVsZWFzZSh3b3JrZXIsICh3KSA9PiB0aGlzLmV4ZWN1dGVTdHJlYW1UdXJuKHcsIHJlcSwgY2IpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZW5xdWV1ZSgodykgPT4ge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGkiAke3cudG9rZW5OYW1lfVske3cudG9rZW5JZH1dIChtb2RlbDogJHtyZXEubW9kZWx9LCBbc3RyZWFtXSwgcXVldWVkKWApO1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVN0cmVhbVR1cm4odywgcmVxLCBjYik7XG4gICAgfSwgZXhjbHVkZWRUb2tlbklkcyk7XG4gIH1cblxuICAvLyByZXVzZSDsooztkZzqsIAg7Jyg7Zqo7ZWY66m0IOq3uCB3b3JrZXIg66W8IGJ1c3kg7KCQ7Jyg7ZW0IOuwmO2ZmC4g7JeG6rGw64KYIO2PtOuwsSDrjIDsg4HsnbTrqbQgbnVsbC5cbiAgLy8g7Y+067CxIOyCrOycoDog6riw64qlIG9mZiAvIOyijO2RnCDsl4bsnYwgLyB3b3JrZXIg67aA7J6swrfso73snYwgLyBlcG9jaCDrtojsnbzsuZgocmVzdGFydCkgLyB0aHJlYWQg7IaM66m4IC9cbiAgLy8gICAgICAgICAgICBidXN5IOuMgOq4sCDtg4DsnoTslYTsm4MuIG51bGwg67CY7ZmYIOyLnCDtmLjstpzrtoDripQg7IOIIHRocmVhZCDqsr3roZzroZwg7KeE7ZaJLlxuICBhc3luYyBhY3F1aXJlUmV1c2VXb3JrZXIoXG4gICAgcmVxOiBHZW5lcmF0ZVJlcXVlc3QsXG4gICAgZXhjbHVkZWRUb2tlbklkcyA9IG5ldyBTZXQ8bnVtYmVyPigpLFxuICApOiBQcm9taXNlPENvZGV4QXBwU2VydmVyV29ya2VyIHwgbnVsbD4ge1xuICAgIC8vIOydtOuvuOyngCDsmpTssq3snYAg7ZWt7IOBIGNvbGQgdGhyZWFkKFI4KTog7J6s7IKs7JqpIOyijO2RnOqwgCDsnojslrTrj4Qg6rG064SI65u064ukLlxuICAgIC8vIGJhc2U2NCDqsIAgdGhyZWFkIOuplOuqqOumrMK37LqQ7IucIHByZWZpeCDsl5Ag7IOB7KO87ZWY64qUIOqyg+ydhCDrp4nripTri6QuXG4gICAgaWYgKHJlcS5pbWFnZUdlbmVyYXRpb24pIHJldHVybiBudWxsO1xuICAgIGlmICghVEhSRUFEX1JFVVNFX0VOQUJMRUQgfHwgIXJlcS5yZXVzZSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgeyB3b3JrZXJJZCwgdGhyZWFkSWQsIGVwb2NoIH0gPSByZXEucmV1c2U7XG5cbiAgICBjb25zdCB3b3JrZXIgPSB0aGlzLmZpbmRXb3JrZXJCeUlkKHdvcmtlcklkKTtcbiAgICBpZiAoIXdvcmtlciB8fCAhd29ya2VyLmlzUmVhZHkgfHwgIXdvcmtlci5hY3RpdmUpIHJldHVybiBudWxsO1xuICAgIGlmICh3b3JrZXIuZXBvY2ggIT09IGVwb2NoKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoIXdvcmtlci5oYXNUaHJlYWQodGhyZWFkSWQpKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoIShhd2FpdCB0aGlzLmlzVG9rZW5RdW90YUVsaWdpYmxlKHdvcmtlci50b2tlbklkLCB3b3JrZXIudG9rZW5OYW1lLCBleGNsdWRlZFRva2VuSWRzKSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIFJFVVNFX1dPUktFUl9XQUlUX01TO1xuICAgIGZvciAoOzspIHtcbiAgICAgIC8vIHJlc3RhcnQoZXBvY2gg67OA6rK9KSAvIHRocmVhZCDshozrqbjsnbQg64yA6riwIOykkeyXkCDrsJzsg53tlZjrqbQg7Y+067CxLlxuICAgICAgaWYgKHdvcmtlci5lcG9jaCAhPT0gZXBvY2ggfHwgIXdvcmtlci5oYXNUaHJlYWQodGhyZWFkSWQpKSByZXR1cm4gbnVsbDtcbiAgICAgIGlmICh3b3JrZXIudHJ5QWNxdWlyZVR1cm4oKSkgcmV0dXJuIHdvcmtlcjtcbiAgICAgIGlmIChEYXRlLm5vdygpID49IGRlYWRsaW5lKSByZXR1cm4gbnVsbDtcbiAgICAgIGF3YWl0IHNsZWVwKFJFVVNFX1dPUktFUl9QT0xMX01TKTtcbiAgICB9XG4gIH1cblxuICBmaW5kV29ya2VyQnlJZCh3b3JrZXJJZDogbnVtYmVyKTogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIgfCBudWxsIHtcbiAgICBmb3IgKGNvbnN0IHdvcmtlcnMgb2YgdGhpcy53b3JrZXJQb29sLnZhbHVlcygpKSB7XG4gICAgICBmb3IgKGNvbnN0IHcgb2Ygd29ya2Vycykge1xuICAgICAgICBpZiAobWFrZU9wZW5BSVdvcmtlcklkKHcudG9rZW5JZCwgdy53b3JrZXJJbmRleCkgPT09IHdvcmtlcklkKSByZXR1cm4gdztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBhc3luYyBpbnRlcnJ1cHRXb3JrZXJUdXJuKHRocmVhZElkOiBzdHJpbmcsIHR1cm5JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYWxsV29ya2VycyA9IFsuLi50aGlzLndvcmtlclBvb2wudmFsdWVzKCldLmZsYXQoKS5maWx0ZXIoKHcpID0+IHcuaXNSZWFkeSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGFsbFdvcmtlcnMubWFwKCh3KSA9PiB3LmludGVycnVwdFR1cm4odGhyZWFkSWQsIHR1cm5JZCkpKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBXb3JrZXIgc2VsZWN0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBRdW90YS1lbGlnaWJsZSBpZGxlIHRva2Vu7J2EIHdlaWdodOuhnCDqs6Drpbgg65KkLCDqt7ggdG9rZW4g7JWI7JeQ7IScIHdvcmtlcuulvCDsiJztmZjtlZzri6QuXG4gIGFzeW5jIGFjcXVpcmVJZGxlV29ya2VyKFxuICAgIGV4Y2x1ZGVkVG9rZW5JZHMgPSBuZXcgU2V0PG51bWJlcj4oKSxcbiAgKTogUHJvbWlzZTxDb2RleEFwcFNlcnZlcldvcmtlciB8IG51bGw+IHtcbiAgICBjb25zdCBlbGlnaWJpbGl0eSA9IGF3YWl0IHRoaXMucmVzb2x2ZVRva2VuRWxpZ2liaWxpdHkoZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKGVsaWdpYmlsaXR5LnJlYWR5QWN0aXZlVG9rZW5JZHMuc2l6ZSA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgaWYgKGVsaWdpYmlsaXR5LmVsaWdpYmxlVG9rZW5JZHMuc2l6ZSA9PT0gMCkgdGhpcy50aHJvd1F1b3RhVGhyZXNob2xkRXhjZWVkZWQoZWxpZ2liaWxpdHkpO1xuXG4gICAgY29uc3Qgd29ya2Vyc0J5VG9rZW4gPSBuZXcgTWFwPG51bWJlciwgQ29kZXhBcHBTZXJ2ZXJXb3JrZXJbXT4oKTtcbiAgICBmb3IgKGNvbnN0IHdvcmtlciBvZiB0aGlzLmdldEFsbFJlYWR5QWN0aXZlV29ya2VycygpKSB7XG4gICAgICBpZiAoIWVsaWdpYmlsaXR5LmVsaWdpYmxlVG9rZW5JZHMuaGFzKHdvcmtlci50b2tlbklkKSB8fCAhd29ya2VyLmhhc0NhcGFjaXR5KSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHdvcmtlcnMgPSB3b3JrZXJzQnlUb2tlbi5nZXQod29ya2VyLnRva2VuSWQpID8/IFtdO1xuICAgICAgd29ya2Vycy5wdXNoKHdvcmtlcik7XG4gICAgICB3b3JrZXJzQnlUb2tlbi5zZXQod29ya2VyLnRva2VuSWQsIHdvcmtlcnMpO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdGVkVG9rZW5JZCA9IHRoaXMud2VpZ2h0ZWRTZWxlY3Rvci5zZWxlY3QobmV3IFNldCh3b3JrZXJzQnlUb2tlbi5rZXlzKCkpKTtcbiAgICBpZiAoc2VsZWN0ZWRUb2tlbklkID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB3b3JrZXJzID0gd29ya2Vyc0J5VG9rZW4uZ2V0KHNlbGVjdGVkVG9rZW5JZCkhO1xuICAgIGNvbnN0IGN1cnNvciA9IHRoaXMud29ya2VyQ3Vyc29yQnlUb2tlbi5nZXQoc2VsZWN0ZWRUb2tlbklkKSA/PyAwO1xuICAgIGZvciAobGV0IG9mZnNldCA9IDA7IG9mZnNldCA8IHdvcmtlcnMubGVuZ3RoOyBvZmZzZXQrKykge1xuICAgICAgY29uc3QgaW5kZXggPSAoY3Vyc29yICsgb2Zmc2V0KSAlIHdvcmtlcnMubGVuZ3RoO1xuICAgICAgY29uc3Qgd29ya2VyID0gd29ya2Vyc1tpbmRleF0hO1xuICAgICAgaWYgKHdvcmtlci50cnlBY3F1aXJlVHVybigpKSB7XG4gICAgICAgIHRoaXMud29ya2VyQ3Vyc29yQnlUb2tlbi5zZXQoc2VsZWN0ZWRUb2tlbklkLCAoaW5kZXggKyAxKSAlIHdvcmtlcnMubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIHdvcmtlcjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHdlaWdodGVkIHRva2VuICR7c2VsZWN0ZWRUb2tlbklkfSBsb3N0IGlkbGUgY2FwYWNpdHkgZHVyaW5nIHN5bmNocm9ub3VzIGFjcXVpcmVgLFxuICAgICk7XG4gIH1cblxuICBnZXRBbGxSZWFkeUFjdGl2ZVdvcmtlcnMoKTogQ29kZXhBcHBTZXJ2ZXJXb3JrZXJbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLndvcmtlclBvb2wudmFsdWVzKCldLmZsYXQoKS5maWx0ZXIoKHcpID0+IHcuaXNSZWFkeSAmJiB3LmFjdGl2ZSk7XG4gIH1cblxuICAvLyDilIDilIAgUXVldWUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYXN5bmMgZW5xdWV1ZTxUPihcbiAgICBleGVjdXRlOiAod29ya2VyOiBDb2RleEFwcFNlcnZlcldvcmtlcikgPT4gUHJvbWlzZTxUPixcbiAgICBleGNsdWRlZFRva2VuSWRzID0gbmV3IFNldDxudW1iZXI+KCksXG4gICk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IGVsaWdpYmlsaXR5ID0gYXdhaXQgdGhpcy5yZXNvbHZlVG9rZW5FbGlnaWJpbGl0eShleGNsdWRlZFRva2VuSWRzKTtcbiAgICBpZiAoZWxpZ2liaWxpdHkucmVhZHlBY3RpdmVUb2tlbklkcy5zaXplID09PSAwKSB0aHJvdyBuZXcgRXJyb3IoXCJOT19PUEVOQUlfV09SS0VSU1wiKTtcbiAgICBpZiAoZWxpZ2liaWxpdHkuZWxpZ2libGVUb2tlbklkcy5zaXplID09PSAwKSB0aGlzLnRocm93UXVvdGFUaHJlc2hvbGRFeGNlZWRlZChlbGlnaWJpbGl0eSk7XG4gICAgaWYgKHRoaXMucXVldWUubGVuZ3RoID49IE1BWF9RVUVVRV9TSVpFKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTRVJWRVJfQlVTWVwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2U8VD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgaXRlbTogUXVldWVJdGVtID0ge1xuICAgICAgICByZXNvbHZlOiAod29ya2VyKSA9PiB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KGl0ZW0udGltZXIpO1xuICAgICAgICAgIGl0ZW0uYWJvcnRDbGVhbnVwPy4oKTtcbiAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5leGVjdXRlQW5kUmVsZWFzZSh3b3JrZXIsIGV4ZWN1dGUpKVxuICAgICAgICAgICAgLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVqZWN0OiAoZXJyKSA9PiB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KGl0ZW0udGltZXIpO1xuICAgICAgICAgIGl0ZW0uYWJvcnRDbGVhbnVwPy4oKTtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSxcbiAgICAgICAgdGltZXI6IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMucmVtb3ZlRnJvbVF1ZXVlKGl0ZW0pO1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJTRVJWRVJfQlVTWVwiKSk7XG4gICAgICAgIH0sIFFVRVVFX1RJTUVPVVRfTVMpLFxuICAgICAgICBleGNsdWRlZFRva2VuSWRzOiBuZXcgU2V0KGV4Y2x1ZGVkVG9rZW5JZHMpLFxuICAgICAgfTtcblxuICAgICAgdGhpcy5xdWV1ZS5wdXNoKGl0ZW0pO1xuICAgICAgdGhpcy5yZXF1ZXN0QXV0b3NjYWxlRXZhbHVhdGlvbigpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlRnJvbVF1ZXVlKGl0ZW06IFF1ZXVlSXRlbSk6IHZvaWQge1xuICAgIGNsZWFyVGltZW91dChpdGVtLnRpbWVyKTtcbiAgICBpdGVtLmFib3J0Q2xlYW51cD8uKCk7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5xdWV1ZS5pbmRleE9mKGl0ZW0pO1xuICAgIGlmIChpZHggIT09IC0xKSB0aGlzLnF1ZXVlLnNwbGljZShpZHgsIDEpO1xuICB9XG5cbiAgcmVqZWN0QWxsUXVldWVkKHJlYXNvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZXJyID0gbmV3IEVycm9yKHJlYXNvbik7XG4gICAgdGhpcy5xdWV1ZS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQoaXRlbS50aW1lcik7XG4gICAgICBpdGVtLmFib3J0Q2xlYW51cD8uKCk7XG4gICAgICBpdGVtLnJlamVjdChlcnIpO1xuICAgIH0pO1xuICAgIHRoaXMucXVldWUgPSBbXTtcbiAgfVxuXG4gIGFzeW5jIGRyYWluUXVldWUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuZHJhaW5pbmcpIHtcbiAgICAgIHRoaXMuZHJhaW5BZ2FpbiA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kcmFpbmluZyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGRvIHtcbiAgICAgICAgdGhpcy5kcmFpbkFnYWluID0gZmFsc2U7XG4gICAgICAgIGF3YWl0IHRoaXMuZHJhaW5RdWV1ZU9uY2UoKTtcbiAgICAgIH0gd2hpbGUgKHRoaXMuZHJhaW5BZ2Fpbik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nZ2VyLndhcm4oYGRyYWluUXVldWUgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmRyYWluaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkcmFpblF1ZXVlT25jZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB3aGlsZSAodGhpcy5xdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBuZXh0ID0gdGhpcy5xdWV1ZVswXSE7XG4gICAgICBsZXQgd29ya2VyOiBDb2RleEFwcFNlcnZlcldvcmtlciB8IG51bGw7XG4gICAgICB0cnkge1xuICAgICAgICB3b3JrZXIgPSBhd2FpdCB0aGlzLmFjcXVpcmVJZGxlV29ya2VyKG5leHQuZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgUXVvdGFUaHJlc2hvbGRFeGNlZWRlZEVycm9yKSB7XG4gICAgICAgICAgdGhpcy5xdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgIG5leHQucmVqZWN0KGUpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICBpZiAoIXdvcmtlcikgYnJlYWs7XG4gICAgICB0aGlzLnF1ZXVlLnNoaWZ0KCk7XG4gICAgICBuZXh0LnJlc29sdmUod29ya2VyKTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgRXhlY3V0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIGV4ZWN1dGVBbmRSZWxlYXNlPFQ+KFxuICAgIHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIsXG4gICAgZXhlY3V0ZTogKHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIpID0+IFByb21pc2U8VD4sXG4gICk6IFByb21pc2U8VD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZXhlY3V0ZSh3b3JrZXIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB3b3JrZXIucmVsZWFzZVR1cm4oKTtcbiAgICAgIHRoaXMucmVxdWVzdERyYWluUXVldWUoKTtcbiAgICB9XG4gIH1cblxuICAvLyByZXVzZVRocmVhZElkIOqwgCDsnojsnLzrqbQg6riw7KG0IHRocmVhZCDsl5AgZGVsdGEocmV1c2VJbnB1dCnrp4wsIOyXhuycvOuptCDsg4ggdGhyZWFkIOyXkCDsoITssrRcbiAgLy8gcHJvbXB0KGNvbGRJbnB1dCkgKyBoaXN0b3J5IGluamVjdC4gcmV1c2Ug6rCAIGRpc3BhdGNoZXIg64uo7JeQ7IScIO2PtOuwseuQmOuptCDtm4TsnpDroZwg65ao7Ja07KeE64ukLlxuICBwcml2YXRlIGJ1aWxkVHVyblJlcXVlc3QocmVxOiBHZW5lcmF0ZVJlcXVlc3QsIHJldXNlVGhyZWFkSWQ/OiBzdHJpbmcpOiBUdXJuUmVxdWVzdCB7XG4gICAgY29uc3QgcmV1c2luZyA9IHJldXNlVGhyZWFkSWQgIT09IHVuZGVmaW5lZDtcbiAgICByZXR1cm4ge1xuICAgICAgaW5wdXQ6IHJldXNpbmcgJiYgcmVxLnJldXNlSW5wdXQgPyByZXEucmV1c2VJbnB1dCA6IHJlcS5jb2xkSW5wdXQsXG4gICAgICBoaXN0b3J5OiByZXVzaW5nID8gdW5kZWZpbmVkIDogcmVxLmNvbGRIaXN0b3J5LFxuICAgICAgZGV2ZWxvcGVySW5zdHJ1Y3Rpb25zOiByZXEuc3lzdGVtUHJvbXB0LFxuICAgICAgb3V0cHV0U2NoZW1hOiByZXEub3V0cHV0U2NoZW1hLFxuICAgICAgZWZmb3J0OiByZXEuZWZmb3J0ID8/IERFRkFVTFRfRUZGT1JULFxuICAgICAgbW9kZWw6IHJlcS5tb2RlbCxcbiAgICAgIHZlcmJvc2l0eTogcmVxLnZlcmJvc2l0eSxcbiAgICAgIHJlYXNvbmluZ1N1bW1hcnk6IHJlcS5yZWFzb25pbmdTdW1tYXJ5LFxuICAgICAgc2VydmljZVRpZXI6IHJlcS5zZXJ2aWNlVGllcixcbiAgICAgIGltYWdlR2VuZXJhdGlvbjogcmVxLmltYWdlR2VuZXJhdGlvbixcbiAgICAgIGltYWdlR2VuZXJhdGlvbk9wdGlvbnM6IHJlcS5pbWFnZUdlbmVyYXRpb25PcHRpb25zLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBleGVjdXRlVHVybihcbiAgICB3b3JrZXI6IENvZGV4QXBwU2VydmVyV29ya2VyLFxuICAgIHJlcTogR2VuZXJhdGVSZXF1ZXN0LFxuICAgIHJldXNlVGhyZWFkSWQ/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8R2VuZXJhdGVSZXN1bHQ+IHtcbiAgICAvLyDsnbTrr7jsp4Ag7JqU7LKtIOyCrOyghCDqsozsnbTtirgoUjUpOiDrsLDsoJXrkJwgd29ya2VyIOydmCBjYXBhYmlsaXR5ICsg7KCB7JqpIOuqqOuNuCDrqYDti7Drqqjri6wuXG4gICAgLy8g67aI7Lap7KGx7J2066m0IHR1cm4g7J2EIOyLpO2Wie2VmOyngCDslYrqs6Ag66qF7Iuc7KCBIOyXkOufrC5cbiAgICBpZiAocmVxLmltYWdlR2VuZXJhdGlvbikge1xuICAgICAgY29uc3QgcmVhc29uID0gYXdhaXQgd29ya2VyLmNoZWNrSW1hZ2VHZW5lcmF0aW9uU3VwcG9ydChyZXEubW9kZWwpO1xuICAgICAgaWYgKHJlYXNvbikgdGhyb3cgbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFwiZ2F0ZVwiLCByZWFzb24pO1xuICAgIH1cblxuICAgIGNvbnN0IHR1cm5SZXEgPSB0aGlzLmJ1aWxkVHVyblJlcXVlc3QocmVxLCByZXVzZVRocmVhZElkKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3b3JrZXIuZXhlY3V0ZVR1cm4odHVyblJlcSwgcmV1c2VUaHJlYWRJZCk7XG5cbiAgICAvLyDsnbTrr7jsp4AgMOqwnCDsi6TtjKgg67aE66WYKFI2KTogdG9vbCDrr7jtmLjstpwo7J6s7Iuc64+EIOustOydtSkgdnMg7Iuc64+EIO2bhCDrr7jsmYTshLEo7J6s7Iuc64+EIO2bhOuztCkuXG4gICAgaWYgKHJlcS5pbWFnZUdlbmVyYXRpb24gJiYgKCFyZXN1bHQuaW1hZ2VzIHx8IHJlc3VsdC5pbWFnZXMubGVuZ3RoID09PSAwKSkge1xuICAgICAgdGhyb3cgcmVzdWx0LmltYWdlQXR0ZW1wdGVkXG4gICAgICAgID8gbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFwiaW5jb21wbGV0ZVwiLCBcImltYWdlIHRvb2wgcmFuIGJ1dCBwcm9kdWNlZCBubyBjb21wbGV0ZWQgaW1hZ2VcIilcbiAgICAgICAgOiBuZXcgSW1hZ2VHZW5lcmF0aW9uRXJyb3IoXCJub3RfY2FsbGVkXCIsIFwibW9kZWwgZGlkIG5vdCBjYWxsIHRoZSBpbWFnZV9nZW5lcmF0aW9uIHRvb2xcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRleHQ6IHJlc3VsdC50ZXh0LFxuICAgICAgdG9rZW5OYW1lOiB3b3JrZXIudG9rZW5OYW1lLFxuICAgICAgdXNhZ2U6IHJlc3VsdC51c2FnZSxcbiAgICAgIGR1cmF0aW9uTXM6IHJlc3VsdC5kdXJhdGlvbk1zLFxuICAgICAgdHRmdE1zOiByZXN1bHQudHRmdE1zLFxuICAgICAgbW9kZWw6IHJlc3VsdC5tb2RlbCxcbiAgICAgIHRocmVhZENvb3JkOiB7XG4gICAgICAgIHdvcmtlcklkOiBtYWtlT3BlbkFJV29ya2VySWQod29ya2VyLnRva2VuSWQsIHdvcmtlci53b3JrZXJJbmRleCksXG4gICAgICAgIHRocmVhZElkOiByZXN1bHQudGhyZWFkSWQsXG4gICAgICAgIGVwb2NoOiB3b3JrZXIuZXBvY2gsXG4gICAgICB9LFxuICAgICAgaW1hZ2VzOiByZXN1bHQuaW1hZ2VzLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBleGVjdXRlU3RyZWFtVHVybihcbiAgICB3b3JrZXI6IENvZGV4QXBwU2VydmVyV29ya2VyLFxuICAgIHJlcTogR2VuZXJhdGVSZXF1ZXN0LFxuICAgIGNiOiBHZW5lcmF0ZVN0cmVhbUNhbGxiYWNrcyxcbiAgICByZXVzZVRocmVhZElkPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0dXJuUmVxID0gdGhpcy5idWlsZFR1cm5SZXF1ZXN0KHJlcSwgcmV1c2VUaHJlYWRJZCk7XG4gICAgLy8gd29ya2VyIOydmCBUdXJuUmVzdWx0IOyXkCB0b2tlbk5hbWUvdGhyZWFkQ29vcmQg66W8IOu2meyXrCDsg4HsnIQoR2VuZXJhdGVSZXN1bHQp66GcIOyYrOumsOuLpC5cbiAgICAvLyB0aHJlYWRJZCDripQg7IOIIHRocmVhZCDrqbQgb25UaHJlYWRJZCDroZwg7ZmV7KCV65CY66+A66GcIOuvuOumrCDrs7TqtIDtlbQg65GQ6rOgIG9uQ29tcGxldGUg65WMIOydveuKlOuLpC5cbiAgICBsZXQgcmVzb2x2ZWRUaHJlYWRJZCA9IHJldXNlVGhyZWFkSWQgPz8gXCJcIjtcbiAgICBjb25zdCB3cmFwcGVkQ2I6IFN0cmVhbUNhbGxiYWNrcyA9IHtcbiAgICAgIC4uLmNiLFxuICAgICAgb25UaHJlYWRJZDogKHRocmVhZElkKSA9PiB7XG4gICAgICAgIHJlc29sdmVkVGhyZWFkSWQgPSB0aHJlYWRJZDtcbiAgICAgICAgY2Iub25UaHJlYWRJZD8uKHRocmVhZElkKTtcbiAgICAgIH0sXG4gICAgICBvbkNvbXBsZXRlOiAocmVzdWx0KSA9PiB7XG4gICAgICAgIGNiLm9uQ29tcGxldGUoe1xuICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgICB0b2tlbk5hbWU6IHdvcmtlci50b2tlbk5hbWUsXG4gICAgICAgICAgdGhyZWFkQ29vcmQ6IHtcbiAgICAgICAgICAgIHdvcmtlcklkOiBtYWtlT3BlbkFJV29ya2VySWQod29ya2VyLnRva2VuSWQsIHdvcmtlci53b3JrZXJJbmRleCksXG4gICAgICAgICAgICB0aHJlYWRJZDogcmVzb2x2ZWRUaHJlYWRJZCxcbiAgICAgICAgICAgIGVwb2NoOiB3b3JrZXIuZXBvY2gsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH07XG4gICAgYXdhaXQgd29ya2VyLmV4ZWN1dGVUdXJuU3RyZWFtKHR1cm5SZXEsIHdyYXBwZWRDYiwgcmV1c2VUaHJlYWRJZCk7XG4gIH1cblxuICAvLyDilIDilIAgU3Bhd24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYXN5bmMgc3Bhd25Xb3JrZXJzKFxuICAgIHRva2VuSWQ6IG51bWJlcixcbiAgICB0b2tlbk5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsLFxuICAgIHdlaWdodCA9IDEsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc2V0VG9rZW5NZXRhZGF0YSh0b2tlbklkLCB0b2tlbk5hbWUsIGNyZWRlbnRpYWxzLCBxdW90YVRocmVzaG9sZCwgd2VpZ2h0KTtcbiAgICBjb25zdCB3b3JrZXJzOiBDb2RleEFwcFNlcnZlcldvcmtlcltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBvb2xDb25maWcubWluV29ya2Vyc1BlclRva2VuOyBpKyspIHtcbiAgICAgIGlmIChpID4gMCkgYXdhaXQgc2xlZXAoU1BBV05fSU5URVJWQUxfTVMpO1xuICAgICAgY29uc3Qgd29ya2VyID0gYXdhaXQgdGhpcy5zcGF3blNpbmdsZVdvcmtlcih0b2tlbklkLCB0b2tlbk5hbWUsIGNyZWRlbnRpYWxzLCBpKTtcbiAgICAgIGlmICh3b3JrZXIpIHdvcmtlcnMucHVzaCh3b3JrZXIpO1xuICAgIH1cbiAgICBpZiAod29ya2Vycy5sZW5ndGggPiAwKSB0aGlzLndvcmtlclBvb2wuc2V0KHRva2VuSWQsIHdvcmtlcnMpO1xuICB9XG5cbiAgYXN5bmMgc3Bhd25TaW5nbGVXb3JrZXIoXG4gICAgdG9rZW5JZDogbnVtYmVyLFxuICAgIHRva2VuTmFtZTogc3RyaW5nLFxuICAgIGNyZWRlbnRpYWxzOiBPcGVuQUlDcmVkZW50aWFscyxcbiAgICB3b3JrZXJJbmRleDogbnVtYmVyLFxuICApOiBQcm9taXNlPENvZGV4QXBwU2VydmVyV29ya2VyIHwgbnVsbD4ge1xuICAgIGNvbnN0IHdvcmtlciA9IG5ldyBDb2RleEFwcFNlcnZlcldvcmtlcih7XG4gICAgICB0b2tlbklkLFxuICAgICAgdG9rZW5OYW1lLFxuICAgICAgYWNjZXNzVG9rZW46IGNyZWRlbnRpYWxzLmFjY2Vzc1Rva2VuLFxuICAgICAgYWNjb3VudElkOiBjcmVkZW50aWFscy5hY2NvdW50SWQsXG4gICAgICBwbGFuVHlwZTogY3JlZGVudGlhbHMucGxhblR5cGUsXG4gICAgICB3b3JrZXJJbmRleCxcbiAgICB9KTtcblxuICAgIHdvcmtlci5vblJlYWR5ID0gKCkgPT4gdGhpcy5yZXF1ZXN0RHJhaW5RdWV1ZSgpO1xuXG4gICAgd29ya2VyLnNldFNlcnZlclJlcXVlc3RIYW5kbGVyKGFzeW5jIChtZXRob2QpID0+IHtcbiAgICAgIGlmIChtZXRob2QgPT09IFwiYWNjb3VudC9jaGF0Z3B0QXV0aFRva2Vucy9yZWZyZXNoXCIpIHtcbiAgICAgICAgcmV0dXJuIGhhbmRsZUNoYXRncHRBdXRoVG9rZW5zUmVmcmVzaCh0b2tlbklkKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihgdW5oYW5kbGVkIHNlcnZlci1yZXF1ZXN0OiAke21ldGhvZH1gKTtcbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB3b3JrZXIuaW5pdGlhbGl6ZSgpO1xuICAgICAgbG9nZ2VyLmluZm8oYHdvcmtlciBzcGF3bmVkOiAke3Rva2VuTmFtZX1bJHt3b3JrZXJJbmRleH1dYCk7XG4gICAgICByZXR1cm4gd29ya2VyO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2dlci53YXJuKGB3b3JrZXIgc3Bhd24gZmFpbGVkOiAke3Rva2VuTmFtZX1bJHt3b3JrZXJJbmRleH1dOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgYXdhaXQgd29ya2VyLmtpbGwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBldmFsdWF0ZUF1dG9zY2FsaW5nKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5wb29sQ29uZmlnLmF1dG9zY2FsZSB8fCB0aGlzLnN0b3BwZWQpIHJldHVybjtcbiAgICBpZiAodGhpcy5xdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICBhd2FpdCB0aGlzLnNjYWxlVXBPbmVTdGVwKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChEYXRlLm5vdygpIC0gdGhpcy5sYXN0UmVxdWVzdEF0ID49IHRoaXMucG9vbENvbmZpZy5zY2FsZURvd25JZGxlTXMpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2NhbGVEb3duT25lU3RlcCgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNjYWxlVXBPbmVTdGVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5wb29sQ29uZmlnLmF1dG9zY2FsZSB8fCB0aGlzLnN0b3BwZWQpIHJldHVybjtcbiAgICBhd2FpdCB0aGlzLnJ1blNjYWxpbmcoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IFsuLi50aGlzLnRva2VuTWV0YWRhdGEuZW50cmllcygpXS5maWx0ZXIoKFt0b2tlbklkLCBtZXRhZGF0YV0pID0+IHtcbiAgICAgICAgaWYgKCFtZXRhZGF0YS5hY3RpdmUpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuICh0aGlzLndvcmtlclBvb2wuZ2V0KHRva2VuSWQpPy5sZW5ndGggPz8gMCkgPCB0aGlzLnBvb2xDb25maWcubWF4V29ya2Vyc1BlclRva2VuO1xuICAgICAgfSk7XG4gICAgICBpZiAoY2FuZGlkYXRlcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3QgcHJvamVjdGVkV29ya2VyQ291bnQgPSB0aGlzLndvcmtlckNvdW50ICsgY2FuZGlkYXRlcy5sZW5ndGg7XG4gICAgICBjb25zdCBwcm9qZWN0ZWRSc3NHaUIgPSBlc3RpbWF0ZU9wZW5BSVdvcmtlclJzc0dpQihwcm9qZWN0ZWRXb3JrZXJDb3VudCk7XG4gICAgICBpZiAocHJvamVjdGVkUnNzR2lCID4gdGhpcy5wb29sQ29uZmlnLm1heEVzdGltYXRlZFJzc0dpQikge1xuICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICBgb3BlbmFpIGF1dG9zY2FsZSBibG9ja2VkOiBlc3RpbWF0ZWQgUlNTICR7cHJvamVjdGVkUnNzR2lCLnRvRml4ZWQoMil9R2lCIGV4Y2VlZHMgJHt0aGlzLnBvb2xDb25maWcubWF4RXN0aW1hdGVkUnNzR2lCLnRvRml4ZWQoMil9R2lCYCxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBob3N0QXZhaWxhYmxlR2lCID0gdGhpcy5nZXRIb3N0QXZhaWxhYmxlR2lCKCk7XG4gICAgICBpZiAoaG9zdEF2YWlsYWJsZUdpQiA8IHRoaXMucG9vbENvbmZpZy5taW5Ib3N0QXZhaWxhYmxlR2lCKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIGBvcGVuYWkgYXV0b3NjYWxlIGJsb2NrZWQ6IGhvc3QgYXZhaWxhYmxlICR7aG9zdEF2YWlsYWJsZUdpQi50b0ZpeGVkKDIpfUdpQiBiZWxvdyAke3RoaXMucG9vbENvbmZpZy5taW5Ib3N0QXZhaWxhYmxlR2lCLnRvRml4ZWQoMil9R2lCYCxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzcGF3bmVkID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGNhbmRpZGF0ZXMubWFwKGFzeW5jIChbdG9rZW5JZCwgbWV0YWRhdGFdKSA9PiB7XG4gICAgICAgICAgY29uc3Qgd29ya2VycyA9IHRoaXMud29ya2VyUG9vbC5nZXQodG9rZW5JZCkgPz8gW107XG4gICAgICAgICAgY29uc3Qgd29ya2VySW5kZXggPSB0aGlzLm5leHRBdmFpbGFibGVXb3JrZXJJbmRleCh3b3JrZXJzKTtcbiAgICAgICAgICBpZiAod29ya2VySW5kZXggPj0gdGhpcy5wb29sQ29uZmlnLm1heFdvcmtlcnNQZXJUb2tlbikgcmV0dXJuIG51bGw7XG4gICAgICAgICAgY29uc3Qgd29ya2VyID0gYXdhaXQgdGhpcy5zcGF3blNpbmdsZVdvcmtlcihcbiAgICAgICAgICAgIHRva2VuSWQsXG4gICAgICAgICAgICBtZXRhZGF0YS5uYW1lLFxuICAgICAgICAgICAgbWV0YWRhdGEuY3JlZGVudGlhbHMsXG4gICAgICAgICAgICB3b3JrZXJJbmRleCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghd29ya2VyKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAgIGNvbnN0IGN1cnJlbnRNZXRhZGF0YSA9IHRoaXMudG9rZW5NZXRhZGF0YS5nZXQodG9rZW5JZCk7XG4gICAgICAgICAgY29uc3QgY3VycmVudFdvcmtlcnMgPSB0aGlzLndvcmtlclBvb2wuZ2V0KHRva2VuSWQpO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICFjdXJyZW50TWV0YWRhdGE/LmFjdGl2ZSB8fFxuICAgICAgICAgICAgY3VycmVudE1ldGFkYXRhICE9PSBtZXRhZGF0YSB8fFxuICAgICAgICAgICAgIWN1cnJlbnRXb3JrZXJzIHx8XG4gICAgICAgICAgICBjdXJyZW50V29ya2Vycy5zb21lKChlbnRyeSkgPT4gZW50cnkud29ya2VySW5kZXggPT09IHdvcmtlckluZGV4KVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgYXdhaXQgd29ya2VyLmtpbGwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY3VycmVudFdvcmtlcnMucHVzaCh3b3JrZXIpO1xuICAgICAgICAgIGN1cnJlbnRXb3JrZXJzLnNvcnQoKGEsIGIpID0+IGEud29ya2VySW5kZXggLSBiLndvcmtlckluZGV4KTtcbiAgICAgICAgICByZXR1cm4gd29ya2VyO1xuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGFkZGVkID0gc3Bhd25lZC5maWx0ZXIoKHdvcmtlcikgPT4gd29ya2VyICE9PSBudWxsKS5sZW5ndGg7XG4gICAgICBpZiAoYWRkZWQgPiAwKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgIGBvcGVuYWkgYXV0b3NjYWxlIHVwOiArJHthZGRlZH0gd29ya2VycyAoJHt0aGlzLndvcmtlckNvdW50fSB0b3RhbCwgcXVldWUgJHt0aGlzLnF1ZXVlLmxlbmd0aH0pYCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0RHJhaW5RdWV1ZSgpO1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgKCkgPT4gdGhpcy5yZXF1ZXN0QXV0b3NjYWxlRXZhbHVhdGlvbigpLFxuICAgICAgICAgICAgTWF0aC5taW4odGhpcy5wb29sQ29uZmlnLnNjYWxlSW50ZXJ2YWxNcywgMV8wMDApLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGltZXIudW5yZWY/LigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBzY2FsZURvd25PbmVTdGVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5wb29sQ29uZmlnLmF1dG9zY2FsZSB8fCB0aGlzLnN0b3BwZWQpIHJldHVybjtcbiAgICBhd2FpdCB0aGlzLnJ1blNjYWxpbmcoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVtb3ZlZDogQ29kZXhBcHBTZXJ2ZXJXb3JrZXJbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCB0b2tlbklkIG9mIHRoaXMudG9rZW5NZXRhZGF0YS5rZXlzKCkpIHtcbiAgICAgICAgY29uc3Qgd29ya2VycyA9IHRoaXMud29ya2VyUG9vbC5nZXQodG9rZW5JZCkgPz8gW107XG4gICAgICAgIGlmICh3b3JrZXJzLmxlbmd0aCA8PSB0aGlzLnBvb2xDb25maWcubWluV29ya2Vyc1BlclRva2VuKSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCB3b3JrZXIgPSB3b3JrZXJzXG4gICAgICAgICAgLnRvU29ydGVkKChhLCBiKSA9PiBiLndvcmtlckluZGV4IC0gYS53b3JrZXJJbmRleClcbiAgICAgICAgICAuZmluZCgoZW50cnkpID0+IGVudHJ5Lmhhc0NhcGFjaXR5KTtcbiAgICAgICAgaWYgKCF3b3JrZXIpIGNvbnRpbnVlO1xuXG4gICAgICAgIHRoaXMud29ya2VyUG9vbC5zZXQoXG4gICAgICAgICAgdG9rZW5JZCxcbiAgICAgICAgICB3b3JrZXJzLmZpbHRlcigoZW50cnkpID0+IGVudHJ5ICE9PSB3b3JrZXIpLFxuICAgICAgICApO1xuICAgICAgICByZW1vdmVkLnB1c2god29ya2VyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlbW92ZWQubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQocmVtb3ZlZC5tYXAoKHdvcmtlcikgPT4gd29ya2VyLmtpbGwoKSkpO1xuICAgICAgbG9nZ2VyLmluZm8oYG9wZW5haSBhdXRvc2NhbGUgZG93bjogLSR7cmVtb3ZlZC5sZW5ndGh9IHdvcmtlcnMgKCR7dGhpcy53b3JrZXJDb3VudH0gdG90YWwpYCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG5leHRBdmFpbGFibGVXb3JrZXJJbmRleCh3b3JrZXJzOiBDb2RleEFwcFNlcnZlcldvcmtlcltdKTogbnVtYmVyIHtcbiAgICBjb25zdCB1c2VkID0gbmV3IFNldCh3b3JrZXJzLm1hcCgod29ya2VyKSA9PiB3b3JrZXIud29ya2VySW5kZXgpKTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5wb29sQ29uZmlnLm1heFdvcmtlcnNQZXJUb2tlbjsgaW5kZXgrKykge1xuICAgICAgaWYgKCF1c2VkLmhhcyhpbmRleCkpIHJldHVybiBpbmRleDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucG9vbENvbmZpZy5tYXhXb3JrZXJzUGVyVG9rZW47XG4gIH1cblxuICBwcml2YXRlIHJlcXVlc3RBdXRvc2NhbGVFdmFsdWF0aW9uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wb29sQ29uZmlnLmF1dG9zY2FsZSB8fCB0aGlzLnN0b3BwZWQpIHJldHVybjtcbiAgICB2b2lkIHRoaXMuZXZhbHVhdGVBdXRvc2NhbGluZygpLmNhdGNoKChlKSA9PlxuICAgICAgbG9nZ2VyLndhcm4oYG9wZW5haSBhdXRvc2NhbGUgZXZhbHVhdGlvbiBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuU2NhbGluZyh0YXNrOiAoKSA9PiBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuc2NhbGluZ1Byb21pc2UpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2NhbGluZ1Byb21pc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNjYWxpbmcgPSB0YXNrKCkuZmluYWxseSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5zY2FsaW5nUHJvbWlzZSA9PT0gc2NhbGluZykgdGhpcy5zY2FsaW5nUHJvbWlzZSA9IG51bGw7XG4gICAgfSk7XG4gICAgdGhpcy5zY2FsaW5nUHJvbWlzZSA9IHNjYWxpbmc7XG4gICAgYXdhaXQgc2NhbGluZztcbiAgfVxuXG4gIC8vIOKUgOKUgCBSYXRlIGxpbWl0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICByYXRlTGltaXRzQ2FjaGUgPSBuZXcgTWFwPG51bWJlciwgeyBkYXRhOiBHZXRBY2NvdW50UmF0ZUxpbWl0c1Jlc3BvbnNlOyBjYWNoZWRBdDogbnVtYmVyIH0+KCk7XG4gIHN0YXRpYyByZWFkb25seSBSQVRFX0xJTUlUU19DQUNIRV9UVEwgPSA2MF8wMDA7XG5cbiAgYXN5bmMgZ2V0UmF0ZUxpbWl0c0J5VG9rZW5JZCh0b2tlbklkOiBudW1iZXIpOiBQcm9taXNlPE9wZW5BSVJhdGVMaW1pdHNXaXRoTWV0YT4ge1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMucmF0ZUxpbWl0c0NhY2hlLmdldCh0b2tlbklkKTtcbiAgICBpZiAoY2FjaGVkICYmIERhdGUubm93KCkgLSBjYWNoZWQuY2FjaGVkQXQgPCBPcGVuQUlEaXNwYXRjaGVyLlJBVEVfTElNSVRTX0NBQ0hFX1RUTCkge1xuICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG5cbiAgICBjb25zdCB3b3JrZXIgPSAodGhpcy53b3JrZXJQb29sLmdldCh0b2tlbklkKSA/PyBbXSkuZmluZCgodykgPT4gdy5pc1JlYWR5KTtcbiAgICBpZiAoIXdvcmtlcikgdGhyb3cgbmV3IEVycm9yKFwibm8gcmVhZHkgb3BlbmFpIHdvcmtlcnNcIik7XG4gICAgY29uc3QgZGF0YSA9IChhd2FpdCB3b3JrZXIuZ2V0UmF0ZUxpbWl0cygpKSBhcyBHZXRBY2NvdW50UmF0ZUxpbWl0c1Jlc3BvbnNlO1xuICAgIGNvbnN0IGVudHJ5ID0geyBkYXRhLCBjYWNoZWRBdDogRGF0ZS5ub3coKSB9O1xuICAgIHRoaXMucmF0ZUxpbWl0c0NhY2hlLnNldCh0b2tlbklkLCBlbnRyeSk7XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG5cbiAgcHJpdmF0ZSByZXF1ZXN0RHJhaW5RdWV1ZSgpOiB2b2lkIHtcbiAgICB2b2lkIHRoaXMuZHJhaW5RdWV1ZSgpLmNhdGNoKChlKSA9PiBsb2dnZXIud2FybihgZHJhaW5RdWV1ZSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRUb2tlbk1ldGFkYXRhKFxuICAgIGlkOiBudW1iZXIsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNyZWRlbnRpYWxzOiBPcGVuQUlDcmVkZW50aWFscyxcbiAgICBxdW90YVRocmVzaG9sZDogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgICB3ZWlnaHQ6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgdGhpcy50b2tlbk1ldGFkYXRhLnNldChpZCwge1xuICAgICAgbmFtZSxcbiAgICAgIGNyZWRlbnRpYWxzLFxuICAgICAgcXVvdGFUaHJlc2hvbGQsXG4gICAgICB3ZWlnaHQsXG4gICAgICBhY3RpdmU6IHRoaXMudG9rZW5NZXRhZGF0YS5nZXQoaWQpPy5hY3RpdmUgPz8gdHJ1ZSxcbiAgICB9KTtcbiAgICB0aGlzLndlaWdodGVkU2VsZWN0b3Iuc2V0VG9rZW4oaWQsIHdlaWdodCk7XG4gIH1cblxuICBwcml2YXRlIGdldFF1b3RhVGhyZXNob2xkKHRva2VuSWQ6IG51bWJlcik6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KHRva2VuSWQpPy5xdW90YVRocmVzaG9sZDtcbiAgfVxuXG4gIHByaXZhdGUgaGFzUXVvdGFUaHJlc2hvbGQodG9rZW5JZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdGhyZXNob2xkID0gdGhpcy5nZXRRdW90YVRocmVzaG9sZCh0b2tlbklkKTtcbiAgICByZXR1cm4gdGhyZXNob2xkICE9PSB1bmRlZmluZWQgJiYgdGhyZXNob2xkICE9PSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZXNvbHZlVG9rZW5FbGlnaWJpbGl0eShleGNsdWRlZFRva2VuSWRzOiBTZXQ8bnVtYmVyPik6IFByb21pc2U8VG9rZW5FbGlnaWJpbGl0eT4ge1xuICAgIGNvbnN0IHdvcmtlcnMgPSB0aGlzLmdldEFsbFJlYWR5QWN0aXZlV29ya2VycygpO1xuICAgIGNvbnN0IGJ5VG9rZW4gPSBuZXcgTWFwPG51bWJlciwgc3RyaW5nPigpO1xuICAgIGZvciAoY29uc3Qgd29ya2VyIG9mIHdvcmtlcnMpIHtcbiAgICAgIGlmICghYnlUb2tlbi5oYXMod29ya2VyLnRva2VuSWQpKSBieVRva2VuLnNldCh3b3JrZXIudG9rZW5JZCwgd29ya2VyLnRva2VuTmFtZSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVhZHlBY3RpdmVUb2tlbklkcyA9IG5ldyBTZXQoYnlUb2tlbi5rZXlzKCkpO1xuICAgIGNvbnN0IGVsaWdpYmxlVG9rZW5JZHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICBjb25zdCBvdmVyVGhyZXNob2xkVG9rZW5zOiBBcnJheTx7IHRva2VuTmFtZTogc3RyaW5nOyB0aHJlc2hvbGQ6IG51bWJlciB9PiA9IFtdO1xuICAgIGxldCB0aHJlc2hvbGRlZFRva2VuQ291bnQgPSAwO1xuXG4gICAgY29uc3QgZW50cmllcyA9IEFycmF5LmZyb20oYnlUb2tlbi5lbnRyaWVzKCkpO1xuICAgIGNvbnN0IGNoZWNrcyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgIGVudHJpZXMubWFwKGFzeW5jIChbdG9rZW5JZCwgdG9rZW5OYW1lXSkgPT4ge1xuICAgICAgICBpZiAoZXhjbHVkZWRUb2tlbklkcy5oYXModG9rZW5JZCkpIHtcbiAgICAgICAgICB0aHJlc2hvbGRlZFRva2VuQ291bnQrKztcbiAgICAgICAgICByZXR1cm4geyB0b2tlbklkLCB0b2tlbk5hbWUsIGVsaWdpYmxlOiBmYWxzZSB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5oYXNRdW90YVRocmVzaG9sZCh0b2tlbklkKSkge1xuICAgICAgICAgIHJldHVybiB7IHRva2VuSWQsIHRva2VuTmFtZSwgZWxpZ2libGU6IHRydWUgfTtcbiAgICAgICAgfVxuICAgICAgICB0aHJlc2hvbGRlZFRva2VuQ291bnQrKztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0b2tlbklkLFxuICAgICAgICAgIHRva2VuTmFtZSxcbiAgICAgICAgICBlbGlnaWJsZTogYXdhaXQgdGhpcy5pc1Rva2VuUXVvdGFFbGlnaWJsZSh0b2tlbklkLCB0b2tlbk5hbWUpLFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIGNoZWNrcy5mb3JFYWNoKChjaGVjaywgaW5kZXgpID0+IHtcbiAgICAgIGlmIChjaGVjay5zdGF0dXMgPT09IFwiZnVsZmlsbGVkXCIpIHtcbiAgICAgICAgaWYgKGNoZWNrLnZhbHVlLmVsaWdpYmxlKSB7XG4gICAgICAgICAgZWxpZ2libGVUb2tlbklkcy5hZGQoY2hlY2sudmFsdWUudG9rZW5JZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgdGhyZXNob2xkID0gdGhpcy5nZXRRdW90YVRocmVzaG9sZChjaGVjay52YWx1ZS50b2tlbklkKTtcbiAgICAgICAgICBpZiAodGhyZXNob2xkICE9PSB1bmRlZmluZWQgJiYgdGhyZXNob2xkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBvdmVyVGhyZXNob2xkVG9rZW5zLnB1c2goeyB0b2tlbk5hbWU6IGNoZWNrLnZhbHVlLnRva2VuTmFtZSwgdGhyZXNob2xkIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgY29uc3QgW3Rva2VuSWQsIHRva2VuTmFtZV0gPSBlbnRyeTtcbiAgICAgICAgdGhpcy5sb2dRdW90YUxvb2t1cEZhaWxPcGVuKHRva2VuSWQsIHRva2VuTmFtZSwgU3RyaW5nKGNoZWNrLnJlYXNvbikpO1xuICAgICAgICBlbGlnaWJsZVRva2VuSWRzLmFkZCh0b2tlbklkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB7IHJlYWR5QWN0aXZlVG9rZW5JZHMsIGVsaWdpYmxlVG9rZW5JZHMsIG92ZXJUaHJlc2hvbGRUb2tlbnMsIHRocmVzaG9sZGVkVG9rZW5Db3VudCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpc1Rva2VuUXVvdGFFbGlnaWJsZShcbiAgICB0b2tlbklkOiBudW1iZXIsXG4gICAgdG9rZW5OYW1lOiBzdHJpbmcsXG4gICAgZXhjbHVkZWRUb2tlbklkcz86IFNldDxudW1iZXI+LFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB0aHJlc2hvbGQgPSB0aGlzLmdldFF1b3RhVGhyZXNob2xkKHRva2VuSWQpO1xuICAgIGlmICh0aHJlc2hvbGQgPT09IHVuZGVmaW5lZCB8fCB0aHJlc2hvbGQgPT09IG51bGwpIHJldHVybiB0cnVlO1xuXG4gICAgbGV0IHJlc3VsdDogT3BlbkFJUXVvdGFVc2FnZVJlc3VsdDtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgcmVhZE9wZW5BSVF1b3RhVXNhZ2UoKCkgPT4gdGhpcy5nZXRSYXRlTGltaXRzQnlUb2tlbklkKHRva2VuSWQpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZ1F1b3RhTG9va3VwRmFpbE9wZW4odG9rZW5JZCwgdG9rZW5OYW1lLCAoZSBhcyBFcnJvcikubWVzc2FnZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0LmtpbmQgPT09IFwibG9va3VwX2ZhaWxlZFwiKSB7XG4gICAgICB0aGlzLmxvZ1F1b3RhTG9va3VwRmFpbE9wZW4odG9rZW5JZCwgdG9rZW5OYW1lLCByZXN1bHQucmVhc29uKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQudXRpbGl6YXRpb25QY3QgPj0gdGhyZXNob2xkKSB7XG4gICAgICB0aGlzLmxvZ1F1b3RhT3ZlclRocmVzaG9sZCh0b2tlbklkLCB0b2tlbk5hbWUsIHRocmVzaG9sZCwgcmVzdWx0KTtcbiAgICAgIGV4Y2x1ZGVkVG9rZW5JZHM/LmFkZCh0b2tlbklkKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nUXVvdGFPdmVyVGhyZXNob2xkKFxuICAgIHRva2VuSWQ6IG51bWJlcixcbiAgICB0b2tlbk5hbWU6IHN0cmluZyxcbiAgICB0aHJlc2hvbGQ6IG51bWJlcixcbiAgICByZXN1bHQ6IEV4dHJhY3Q8T3BlbkFJUXVvdGFVc2FnZVJlc3VsdCwgeyBraW5kOiBcIm9rXCIgfT4sXG4gICk6IHZvaWQge1xuICAgIGxvZ2dlci5pbmZvKFwicXVvdGFfdGhyZXNob2xkIGdhdGU6IG92ZXJfdGhyZXNob2xkXCIsIHtcbiAgICAgIHRva2VuSWQsXG4gICAgICB0b2tlbk5hbWUsXG4gICAgICBwcm92aWRlcjogXCJvcGVuYWlcIixcbiAgICAgIHRocmVzaG9sZCxcbiAgICAgIGNhY2hlZFV0aWxpemF0aW9uOiByZXN1bHQudXRpbGl6YXRpb25QY3QsXG4gICAgICBjYWNoZUFnZTogcmVzdWx0LmNhY2hlQWdlTXMsXG4gICAgICB3aW5kb3dEdXJhdGlvbk1pbnM6IHJlc3VsdC53aW5kb3dEdXJhdGlvbk1pbnMsXG4gICAgICByZXNldHNBdDogcmVzdWx0LnJlc2V0c0F0LFxuICAgICAgbGltaXRJZDogcmVzdWx0LmxpbWl0SWQsXG4gICAgICByZWFzb246IFwib3Zlcl90aHJlc2hvbGRcIixcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nUXVvdGFMb29rdXBGYWlsT3Blbih0b2tlbklkOiBudW1iZXIsIHRva2VuTmFtZTogc3RyaW5nLCByZWFzb246IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHRocmVzaG9sZCA9IHRoaXMuZ2V0UXVvdGFUaHJlc2hvbGQodG9rZW5JZCk7XG4gICAgbG9nZ2VyLndhcm4oXCJxdW90YV90aHJlc2hvbGQgZ2F0ZTogbG9va3VwX2ZhaWxfb3BlblwiLCB7XG4gICAgICB0b2tlbklkLFxuICAgICAgdG9rZW5OYW1lLFxuICAgICAgcHJvdmlkZXI6IFwib3BlbmFpXCIsXG4gICAgICB0aHJlc2hvbGQsXG4gICAgICByZWFzb246IFwibG9va3VwX2ZhaWxfb3BlblwiLFxuICAgICAgbG9va3VwUmVhc29uOiByZWFzb24sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHRocm93UXVvdGFUaHJlc2hvbGRFeGNlZWRlZChlbGlnaWJpbGl0eTogVG9rZW5FbGlnaWJpbGl0eSk6IG5ldmVyIHtcbiAgICBsb2dnZXIud2FybihcInF1b3RhX3RocmVzaG9sZCBnYXRlOiBhbGxfZXhjZWVkZWRcIiwge1xuICAgICAgcHJvdmlkZXI6IFwib3BlbmFpXCIsXG4gICAgICB0b2tlbkNvdW50OiBlbGlnaWJpbGl0eS5yZWFkeUFjdGl2ZVRva2VuSWRzLnNpemUsXG4gICAgICB0aHJlc2hvbGRlZFRva2VuQ291bnQ6IGVsaWdpYmlsaXR5LnRocmVzaG9sZGVkVG9rZW5Db3VudCxcbiAgICAgIG92ZXJUaHJlc2hvbGRUb2tlbnM6IGVsaWdpYmlsaXR5Lm92ZXJUaHJlc2hvbGRUb2tlbnMsXG4gICAgICByZWFzb246IFwiYWxsX2V4Y2VlZGVkXCIsXG4gICAgfSk7XG4gICAgdGhyb3cgbmV3IFF1b3RhVGhyZXNob2xkRXhjZWVkZWRFcnJvcihcbiAgICAgIHF1b3RhVGhyZXNob2xkRXhjZWVkZWRNZXNzYWdlKFwib3BlbmFpXCIsIGVsaWdpYmlsaXR5Lm92ZXJUaHJlc2hvbGRUb2tlbnMpLFxuICAgICk7XG4gIH1cblxuICAvLyDilIDilIAgQnJvd3NlciBsb2dpbiBmbG93IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHBlbmRpbmdMb2dpbjoge1xuICAgIHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXI7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgfSB8IG51bGwgPSBudWxsO1xuXG4gIGFzeW5jIHN0YXJ0QnJvd3NlckxvZ2luKG5hbWU6IHN0cmluZyk6IFByb21pc2U8eyBhdXRoVXJsOiBzdHJpbmcgfT4ge1xuICAgIGlmICh0aGlzLnBlbmRpbmdMb2dpbikge1xuICAgICAgdGhpcy5wZW5kaW5nTG9naW4ud29ya2VyLmtpbGwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5wZW5kaW5nTG9naW4udGltZXIpO1xuICAgICAgdGhpcy5wZW5kaW5nTG9naW4gPSBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBJZCA9IERhdGUubm93KCk7XG4gICAgY29uc3Qgd29ya2VyID0gbmV3IENvZGV4QXBwU2VydmVyV29ya2VyKHtcbiAgICAgIHRva2VuSWQ6IHRlbXBJZCxcbiAgICAgIHRva2VuTmFtZTogbmFtZSxcbiAgICAgIGFjY2Vzc1Rva2VuOiBcIlwiLFxuICAgICAgYWNjb3VudElkOiBcIlwiLFxuICAgIH0pO1xuXG4gICAgY29uc3QgYXV0aFVybCA9IGF3YWl0IHdvcmtlci5zdGFydEJyb3dzZXJMb2dpbigpO1xuXG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnBlbmRpbmdMb2dpbj8ud29ya2VyID09PSB3b3JrZXIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYGJyb3dzZXIgbG9naW4gdGltZW91dCBmb3IgJHtuYW1lfSwga2lsbGluZyB3b3JrZXJgKTtcbiAgICAgICAgd29ya2VyLmtpbGwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgIHRoaXMucGVuZGluZ0xvZ2luID0gbnVsbDtcbiAgICAgIH1cbiAgICB9LCAzMDBfMDAwKTtcblxuICAgIHRoaXMucGVuZGluZ0xvZ2luID0geyB3b3JrZXIsIG5hbWUsIHRpbWVyIH07XG4gICAgcmV0dXJuIHsgYXV0aFVybCB9O1xuICB9XG5cbiAgZ2V0IHBlbmRpbmdMb2dpbk5hbWUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucGVuZGluZ0xvZ2luPy5uYW1lID8/IG51bGw7XG4gIH1cblxuICBhc3luYyBjb21wbGV0ZUJyb3dzZXJMb2dpbigpOiBQcm9taXNlPHtcbiAgICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xuICAgIGlkVG9rZW4/OiBzdHJpbmc7XG4gICAgYWNjb3VudElkOiBzdHJpbmc7XG4gIH0+IHtcbiAgICBpZiAoIXRoaXMucGVuZGluZ0xvZ2luKSB0aHJvdyBuZXcgRXJyb3IoXCJubyBwZW5kaW5nIGxvZ2luXCIpO1xuICAgIGNvbnN0IHsgd29ya2VyLCB0aW1lciB9ID0gdGhpcy5wZW5kaW5nTG9naW47XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd29ya2VyLndhaXRGb3JCcm93c2VyTG9naW5Db21wbGV0ZSgpO1xuICAgICAgY29uc3QgY3JlZHMgPSBhd2FpdCB3b3JrZXIucmVhZE1hbmFnZWRDcmVkZW50aWFscygpO1xuICAgICAgaWYgKCFjcmVkcykgdGhyb3cgbmV3IEVycm9yKFwiZmFpbGVkIHRvIHJlYWQgY3JlZGVudGlhbHMgYWZ0ZXIgbG9naW5cIik7XG4gICAgICByZXR1cm4gY3JlZHM7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB0aGlzLnBlbmRpbmdMb2dpbiA9IG51bGw7XG4gICAgICBhd2FpdCB3b3JrZXIua2lsbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgU3RhdHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZ2V0IHdvcmtlckNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIFsuLi50aGlzLndvcmtlclBvb2wudmFsdWVzKCldLmZsYXQoKS5sZW5ndGg7XG4gIH1cblxuICBnZXQgcmVhZHlXb3JrZXJDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkuZmlsdGVyKCh3KSA9PiB3LmlzUmVhZHkpLmxlbmd0aDtcbiAgfVxuXG4gIGdldCBxdWV1ZUxlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmxlbmd0aDtcbiAgfVxuXG4gIC8vIE1vbml0IO2RnOyLnOyaqSDigJQg7Yag7YGw67OEIO2YhOyerCDsm4zsu6Qg7IiYIOyKpOuDheyDtyAo7J2066aE7IicIOygleugrClcbiAgZ2V0IHdvcmtlckNvdW50c0J5VG9rZW4oKTogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGNvdW50OiBudW1iZXIgfT4ge1xuICAgIHJldHVybiBbLi4udGhpcy53b3JrZXJQb29sLmVudHJpZXMoKV1cbiAgICAgIC5tYXAoKFt0b2tlbklkLCB3b3JrZXJzXSkgPT4gKHtcbiAgICAgICAgbmFtZTogd29ya2Vyc1swXT8udG9rZW5OYW1lID8/IGB0b2tlbiAke3Rva2VuSWR9YCxcbiAgICAgICAgY291bnQ6IHdvcmtlcnMubGVuZ3RoLFxuICAgICAgfSkpXG4gICAgICAuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkuY291bnQgPiAwKVxuICAgICAgLnRvU29ydGVkKChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0NBLE1BQU0sU0FBUyxVQUFVLENBQUMsU0FBUyxvQkFBb0IsQ0FBQztBQVF4RCxJQUFhLHVCQUFiLGNBQTBDLE1BQU07Q0FDOUMsWUFDRSxNQUNBLFNBQ0E7QUFDQSxRQUFNLFFBQVE7QUFITCxPQUFBLE9BQUE7QUFJVCxPQUFLLE9BQU87OztBQUloQixNQUFNLGlCQUFpQjtBQUN2QixNQUFhLCtCQUErQjtBQUM1QyxNQUFNLHVDQUF1QztBQUM3QyxNQUFNLHVDQUF1QztBQUM3QyxNQUFNLG1CQUFtQjtBQUN6QixNQUFNLGlCQUFpQjtBQUN2QixNQUFNLG9CQUFvQjtBQUUxQixNQUFhLDZCQUE2QjtBQUMxQyxNQUFhLHdCQUF3QjtBQVlyQyxTQUFTLGVBQ1AsT0FDQSxVQUNBLEtBQ0EsS0FDUTtDQUNSLE1BQU0sU0FBUyxPQUFPLE1BQU07QUFDNUIsS0FBSSxDQUFDLE9BQU8sU0FBUyxPQUFPLENBQUUsUUFBTztBQUNyQyxRQUFPLEtBQUssSUFBSSxLQUFLLEtBQUssSUFBSSxLQUFLLE1BQU0sT0FBTyxFQUFFLElBQUksQ0FBQzs7QUFHekQsU0FBUyxjQUFjLE9BQTJCLFVBQWtCLEtBQXFCO0NBQ3ZGLE1BQU0sU0FBUyxPQUFPLE1BQU07QUFDNUIsS0FBSSxDQUFDLE9BQU8sU0FBUyxPQUFPLENBQUUsUUFBTztBQUNyQyxRQUFPLEtBQUssSUFBSSxLQUFLLE9BQU87O0FBRzlCLFNBQWdCLDhCQUNkLE1BQTBDLFFBQVEsS0FDMUI7Q0FDeEIsTUFBTSxZQUFZLElBQUksMkJB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
841
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWRpc3BhdGNoZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWRpc3BhdGNoZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBPcGVuQUlEaXNwYXRjaGVyIOKAlCBjb2RleCBhcHAtc2VydmVyIHdvcmtlciBwb29sICsg7Yag7YGwIOudvOyasO2MhS5cbiAqXG4gKiAtIO2GoO2BsOuLuSBOIHdvcmtlciAoQ29kZXhBcHBTZXJ2ZXJXb3JrZXIpLCDquLDrs7ggM1xuICogLSBpZGxlIHdvcmtlciByb3VuZC1yb2JpbiDshKDtg50gKyDtgZAg64yA6riwICjsoITrtoAgYnVzeSDsi5wpXG4gKiAtIFRva2VuU3Vic2NyaWJlciDsnbTrsqTtirjroZwgd29ya2VyIHBvb2wg64+Z6riw7ZmUXG4gKiAtIGJhY2twcmVzc3VyZTog7YGQIGZ1bGwg65iQ64qUIHRpbWVvdXQg7IucIFNFUlZFUl9CVVNZXG4gKi9cbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBmcmVlbWVtIH0gZnJvbSBcIm5vZGU6b3NcIjtcblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcblxuaW1wb3J0IHsgUXVvdGFUaHJlc2hvbGRFeGNlZWRlZEVycm9yIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLnR5cGVzXCI7XG5pbXBvcnQgeyBUb2tlbk1vZGVsIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLm1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIE9wZW5BSUNyZWRlbnRpYWxzIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIEdldEFjY291bnRSYXRlTGltaXRzUmVzcG9uc2UgfSBmcm9tIFwiLi4vLi4vLi4vY29kZXgtcHJvdG9jb2wvdjIvR2V0QWNjb3VudFJhdGVMaW1pdHNSZXNwb25zZVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBHZW5lcmF0ZVJlcXVlc3QsXG4gIHR5cGUgR2VuZXJhdGVSZXN1bHQsXG4gIHR5cGUgR2VuZXJhdGVTdHJlYW1DYWxsYmFja3MsXG4gIHR5cGUgUHJvdmlkZXJEaXNwYXRjaGVyLFxufSBmcm9tIFwiLi4vY29tbW9uL3Byb3ZpZGVyLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IFNtb290aFdlaWdodGVkUm91bmRSb2JpbiB9IGZyb20gXCIuLi9jb21tb24vc21vb3RoLXdlaWdodGVkLXJvdW5kLXJvYmluXCI7XG5pbXBvcnQgeyBDb2RleEFwcFNlcnZlcldvcmtlciwgdHlwZSBTdHJlYW1DYWxsYmFja3MsIHR5cGUgVHVyblJlcXVlc3QgfSBmcm9tIFwiLi9jb2RleC13b3JrZXJcIjtcbmltcG9ydCB7XG4gIHJlYWRPcGVuQUlRdW90YVVzYWdlLFxuICB0eXBlIE9wZW5BSVF1b3RhVXNhZ2VSZXN1bHQsXG4gIHR5cGUgT3BlbkFJUmF0ZUxpbWl0c1dpdGhNZXRhLFxufSBmcm9tIFwiLi9vcGVuYWktcXVvdGFcIjtcbmltcG9ydCB7IGhhbmRsZUNoYXRncHRBdXRoVG9rZW5zUmVmcmVzaCB9IGZyb20gXCIuL29wZW5haS1yZWZyZXNoXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcIm9wZW5haS1kaXNwYXRjaGVyXCJdKTtcblxuLy8g7J2066+47KeAIOyDneyEsSDsmpTssq3snbQg6rKM7J207Yq4L+yDneyEseyXkCDsi6TtjKjtlojsnYQg65WM7J2YIOq1rOu2hOyekC5cbi8vIC0gXCJnYXRlXCI6IOyCrOyghCDqsoDspp0g7Iuk7YyoKGNhcGFiaWxpdHkv66qo6424IOupgO2LsOuqqOuLrCDrtojstqnsobEpIOKAlCB0dXJuIOuvuOyLpO2WiS5cbi8vIC0gXCJub3RfY2FsbGVkXCI6IHR1cm4g7J2AIOyEseqzte2WiOycvOuCmCDrqqjrjbjsnbQgaW1hZ2UgdG9vbCDsnYQg7Zi47LacIOyViCDtlagg4oCUIOyerOyLnOuPhCDrrLTsnbUo7ZSE66Gs7ZSE7Yq4IOusuOygnCkuXG4vLyAtIFwiaW5jb21wbGV0ZVwiOiB0b29sIOyLnOuPhOuQkOycvOuCmCDsmYTshLEg7J2066+47KeAIOuvuOuPhOywqSDigJQg7J6s7Iuc64+EIO2bhOuztCjshJzrsoTsuKEg7Iuk7YyoL+qxsOu2gCkuXG5leHBvcnQgdHlwZSBJbWFnZUZhaWx1cmVLaW5kID0gXCJnYXRlXCIgfCBcIm5vdF9jYWxsZWRcIiB8IFwiaW5jb21wbGV0ZVwiO1xuXG5leHBvcnQgY2xhc3MgSW1hZ2VHZW5lcmF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IGtpbmQ6IEltYWdlRmFpbHVyZUtpbmQsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSBcIkltYWdlR2VuZXJhdGlvbkVycm9yXCI7XG4gIH1cbn1cblxuY29uc3QgREVGQVVMVF9FRkZPUlQgPSBcImxvd1wiO1xuZXhwb3J0IGNvbnN0IE1BWF9PUEVOQUlfV09SS0VSU19QRVJfVE9LRU4gPSAyMDtcbmNvbnN0IERFRkFVTFRfT1BFTkFJX01JTl9XT1JLRVJTX1BFUl9UT0tFTiA9IDU7XG5jb25zdCBERUZBVUxUX09QRU5BSV9NQVhfV09SS0VSU19QRVJfVE9LRU4gPSAxNTtcbmNvbnN0IFFVRVVFX1RJTUVPVVRfTVMgPSA2MF8wMDA7XG5jb25zdCBNQVhfUVVFVUVfU0laRSA9IDUwO1xuY29uc3QgU1BBV05fSU5URVJWQUxfTVMgPSA1MDA7XG5cbmV4cG9ydCBjb25zdCBPUEVOQUlfV09SS0VSX0JBU0VfUlNTX0dJQiA9IDAuNzE7XG5leHBvcnQgY29uc3QgT1BFTkFJX1dPUktFUl9SU1NfR0lCID0gMC4xNTc7XG5cbmV4cG9ydCB0eXBlIE9wZW5BSVdvcmtlclBvb2xDb25maWcgPSB7XG4gIGF1dG9zY2FsZTogYm9vbGVhbjtcbiAgbWluV29ya2Vyc1BlclRva2VuOiBudW1iZXI7XG4gIG1heFdvcmtlcnNQZXJUb2tlbjogbnVtYmVyO1xuICBzY2FsZUludGVydmFsTXM6IG51bWJlcjtcbiAgc2NhbGVEb3duSWRsZU1zOiBudW1iZXI7XG4gIG1heEVzdGltYXRlZFJzc0dpQjogbnVtYmVyO1xuICBtaW5Ib3N0QXZhaWxhYmxlR2lCOiBudW1iZXI7XG59O1xuXG5mdW5jdGlvbiBib3VuZGVkSW50ZWdlcihcbiAgdmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgZmFsbGJhY2s6IG51bWJlcixcbiAgbWluOiBudW1iZXIsXG4gIG1heDogbnVtYmVyLFxuKTogbnVtYmVyIHtcbiAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHZhbHVlKTtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSkgcmV0dXJuIGZhbGxiYWNrO1xuICByZXR1cm4gTWF0aC5tYXgobWluLCBNYXRoLm1pbihNYXRoLmZsb29yKHBhcnNlZCksIG1heCkpO1xufVxuXG5mdW5jdGlvbiBib3VuZGVkTnVtYmVyKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQsIGZhbGxiYWNrOiBudW1iZXIsIG1pbjogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHZhbHVlKTtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSkgcmV0dXJuIGZhbGxiYWNrO1xuICByZXR1cm4gTWF0aC5tYXgobWluLCBwYXJzZWQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU9wZW5BSVdvcmtlclBvb2xDb25maWcoXG4gIGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiA9IHByb2Nlc3MuZW52LFxuKTogT3BlbkFJV29ya2VyUG9vbENvbmZpZyB7XG4gIGNvbnN0IGF1dG9zY2FsZSA9IGVudi5RR1JJRF9PUEVOQUlfQVVUT1NDQUxFICE9PSBcImZhbHNlXCIgJiYgZW52LlFHUklEX09QRU5BSV9BVVRPU0NBTEUgIT09IFwiMFwiO1xuICBjb25zdCBsZWdhY3lXb3JrZXJzID0gYm91bmRlZEludGVnZXIoXG4gICAgZW52LlFHUklEX1dPUktFUlNfUEVSX1RPS0VOLFxuICAgIERFRkFVTFRfT1BFTkFJX01JTl9XT1JLRVJTX1BFUl9UT0tFTixcbiAgICAxLFxuICAgIE1BWF9PUEVOQUlfV09SS0VSU19QRVJfVE9LRU4sXG4gICk7XG4gIGNvbnN0IG1pbldvcmtlcnNQZXJUb2tlbiA9IGJvdW5kZWRJbnRlZ2VyKFxuICAgIGVudi5RR1JJRF9PUEVOQUlfTUlOX1dPUktFUlNfUEVSX1RPS0VOLFxuICAgIGxlZ2FjeVdvcmtlcnMsXG4gICAgMSxcbiAgICBNQVhfT1BFTkFJX1dPUktFUlNfUEVSX1RPS0VOLFxuICApO1xuICBjb25zdCBjb25maWd1cmVkTWF4ID0gYm91bmRlZEludGVnZXIoXG4gICAgZW52LlFHUklEX09QRU5BSV9NQVhfV09SS0VSU19QRVJfVE9LRU4sXG4gICAgYXV0b3NjYWxlID8gREVGQVVMVF9PUEVOQUlfTUFYX1dPUktFUlNfUEVSX1RPS0VOIDogbWluV29ya2Vyc1BlclRva2VuLFxuICAgIDEsXG4gICAgTUFYX09QRU5BSV9XT1JLRVJTX1BFUl9UT0tFTixcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIGF1dG9zY2FsZSxcbiAgICBtaW5Xb3JrZXJzUGVyVG9rZW4sXG4gICAgbWF4V29ya2Vyc1BlclRva2VuOiBhdXRvc2NhbGVcbiAgICAgID8gTWF0aC5tYXgobWluV29ya2Vyc1BlclRva2VuLCBjb25maWd1cmVkTWF4KVxuICAgICAgOiBtaW5Xb3JrZXJzUGVyVG9rZW4sXG4gICAgc2NhbGVJbnRlcnZhbE1zOiBib3VuZGVkSW50ZWdlcihlbnYuUUdSSURfT1BFTkFJX1NDQUxFX0lOVEVSVkFMX01TLCA1XzAwMCwgMjUwLCAzMDBfMDAwKSxcbiAgICBzY2FsZURvd25JZGxlTXM6IGJvdW5kZWRJbnRlZ2VyKFxuICAgICAgZW52LlFHUklEX09QRU5BSV9TQ0FMRV9ET1dOX0lETEVfTVMsXG4gICAgICAxMCAqIDYwXzAwMCxcbiAgICAgIDFfMDAwLFxuICAgICAgMjQgKiA2MCAqIDYwXzAwMCxcbiAgICApLFxuICAgIG1heEVzdGltYXRlZFJzc0dpQjogYm91bmRlZE51bWJlcihlbnYuUUdSSURfT1BFTkFJX01BWF9FU1RJTUFURURfUlNTX0dJQiwgMTYsIDEpLFxuICAgIG1pbkhvc3RBdmFpbGFibGVHaUI6IGJvdW5kZWROdW1iZXIoZW52LlFHUklEX09QRU5BSV9NSU5fSE9TVF9BVkFJTEFCTEVfR0lCLCAyMCwgMCksXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlc3RpbWF0ZU9wZW5BSVdvcmtlclJzc0dpQih0b3RhbFdvcmtlcnM6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBPUEVOQUlfV09SS0VSX0JBU0VfUlNTX0dJQiArIE9QRU5BSV9XT1JLRVJfUlNTX0dJQiAqIHRvdGFsV29ya2Vycztcbn1cblxuZnVuY3Rpb24gcmVhZEhvc3RBdmFpbGFibGVHaUIoKTogbnVtYmVyIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBtYXRjaCA9IHJlYWRGaWxlU3luYyhcIi9wcm9jL21lbWluZm9cIiwgXCJ1dGY4XCIpLm1hdGNoKC9eTWVtQXZhaWxhYmxlOlxccysoXFxkKylcXHMra0IkL20pO1xuICAgIGlmIChtYXRjaD8uWzFdKSByZXR1cm4gTnVtYmVyKG1hdGNoWzFdKSAvIDEwMjQgLyAxMDI0O1xuICB9IGNhdGNoIHt9XG4gIHJldHVybiBmcmVlbWVtKCkgLyAxMDI0IC8gMTAyNCAvIDEwMjQ7XG59XG5cbi8vIHRocmVhZCDsnqzsgqzsmqkocHJvbXB0IGNhY2hlIOqzoOyglSkuIOuBhOuptCDquLDsobQgXCLrp6QgdHVybiDsg4ggdGhyZWFkICsgaGlzdG9yeSBpbmplY3RcIiDrj5nsnpEuXG5jb25zdCBUSFJFQURfUkVVU0VfRU5BQkxFRCA9IHByb2Nlc3MuZW52LlFHUklEX09QRU5BSV9USFJFQURfUkVVU0UgIT09IFwiZmFsc2VcIjtcbi8vIOyijO2RnCB3b3JrZXIg6rCAIGJ1c3kg7J28IOuVjCBmcmVlIOulvCDquLDri6TrpqzripQg7LWc64yAIOyLnOqwhC4g7LSI6rO8IOyLnCDsg4ggdGhyZWFkIOuhnCDtj7TrsLEuXG5jb25zdCBSRVVTRV9XT1JLRVJfV0FJVF9NUyA9IDVfMDAwO1xuY29uc3QgUkVVU0VfV09SS0VSX1BPTExfTVMgPSA1MDtcblxuLy8gd29ya2VySWQg7ZWp7ISxOiB0b2tlbklkIOyZgCB3b3JrZXJJbmRleCgwLi4xOSkg66W8IO2VmOuCmOydmCDslYjsoJUg7Iir7J6Q66GcIOyduOy9lOuUqS5cbmNvbnN0IE9QRU5BSV9XT1JLRVJfSURfU1RSSURFID0gMTAwO1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VPcGVuQUlXb3JrZXJJZCh0b2tlbklkOiBudW1iZXIsIHdvcmtlckluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gdG9rZW5JZCAqIE9QRU5BSV9XT1JLRVJfSURfU1RSSURFICsgd29ya2VySW5kZXg7XG59XG5cbmZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG5cbmZ1bmN0aW9uIHF1b3RhVGhyZXNob2xkRXhjZWVkZWRNZXNzYWdlKFxuICBwcm92aWRlcjogc3RyaW5nLFxuICB0b2tlbnM6IEFycmF5PHsgdG9rZW5OYW1lOiBzdHJpbmc7IHRocmVzaG9sZDogbnVtYmVyIH0+LFxuKTogc3RyaW5nIHtcbiAgY29uc3QgZGV0YWlscyA9IHRva2Vuc1xuICAgIC5tYXAoKHRva2VuKSA9PiBgJHt0b2tlbi50b2tlbk5hbWV9ICh0aHJlc2hvbGQgJHt0b2tlbi50aHJlc2hvbGR9JSlgKVxuICAgIC5qb2luKFwiLCBcIik7XG4gIHJldHVybiBkZXRhaWxzLmxlbmd0aCA+IDBcbiAgICA/IGBBbGwgJHtwcm92aWRlcn0gdG9rZW5zIGV4Y2VlZGVkIHF1b3RhIHRocmVzaG9sZDogJHtkZXRhaWxzfWBcbiAgICA6IGBBbGwgJHtwcm92aWRlcn0gdG9rZW5zIGV4Y2VlZGVkIHF1b3RhIHRocmVzaG9sZGA7XG59XG5cbnR5cGUgUXVldWVJdGVtID0ge1xuICByZXNvbHZlOiAod29ya2VyOiBDb2RleEFwcFNlcnZlcldvcmtlcikgPT4gdm9pZDtcbiAgcmVqZWN0OiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xuICB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gIGFib3J0Q2xlYW51cD86ICgpID0+IHZvaWQ7XG4gIGV4Y2x1ZGVkVG9rZW5JZHM6IFNldDxudW1iZXI+O1xufTtcblxudHlwZSBUb2tlbk1ldGFkYXRhID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGNyZWRlbnRpYWxzOiBPcGVuQUlDcmVkZW50aWFscztcbiAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsO1xuICB3ZWlnaHQ6IG51bWJlcjtcbiAgYWN0aXZlOiBib29sZWFuO1xufTtcblxudHlwZSBUb2tlbkVsaWdpYmlsaXR5ID0ge1xuICByZWFkeUFjdGl2ZVRva2VuSWRzOiBTZXQ8bnVtYmVyPjtcbiAgZWxpZ2libGVUb2tlbklkczogU2V0PG51bWJlcj47XG4gIG92ZXJUaHJlc2hvbGRUb2tlbnM6IEFycmF5PHsgdG9rZW5OYW1lOiBzdHJpbmc7IHRocmVzaG9sZDogbnVtYmVyIH0+O1xuICB0aHJlc2hvbGRlZFRva2VuQ291bnQ6IG51bWJlcjtcbn07XG5cbnR5cGUgUmF0ZUxpbWl0c0NhY2hlRW50cnkgPSBPcGVuQUlSYXRlTGltaXRzV2l0aE1ldGEgJiB7XG4gIGdlbmVyYXRpb246IG51bWJlcjtcbn07XG5cbmV4cG9ydCBjbGFzcyBPcGVuQUlEaXNwYXRjaGVyIGltcGxlbWVudHMgUHJvdmlkZXJEaXNwYXRjaGVyIHtcbiAgd29ya2VyUG9vbCA9IG5ldyBNYXA8bnVtYmVyLCBDb2RleEFwcFNlcnZlcldvcmtlcltdPigpO1xuICB0b2tlbk1ldGFkYXRhID0gbmV3IE1hcDxudW1iZXIsIFRva2VuTWV0YWRhdGE+KCk7XG4gIHF1ZXVlOiBRdWV1ZUl0ZW1bXSA9IFtdO1xuICByZWFkb25seSBwb29sQ29uZmlnOiBPcGVuQUlXb3JrZXJQb29sQ29uZmlnO1xuICBwcml2YXRlIHJlYWRvbmx5IHF1b3RhQmxvY2tlZFRva2VuSWRzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmF0ZUxpbWl0c0dlbmVyYXRpb25CeVRva2VuID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSB3ZWlnaHRlZFNlbGVjdG9yID0gbmV3IFNtb290aFdlaWdodGVkUm91bmRSb2JpbigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHdvcmtlckN1cnNvckJ5VG9rZW4gPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGdldEhvc3RBdmFpbGFibGVHaUI6ICgpID0+IG51bWJlcjtcbiAgcHJpdmF0ZSBkcmFpbmluZyA9IGZhbHNlO1xuICBwcml2YXRlIGRyYWluQWdhaW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBzY2FsZXJUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc2NhbGluZ1Byb21pc2U6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsYXN0UmVxdWVzdEF0ID0gRGF0ZS5ub3coKTtcbiAgcHJpdmF0ZSBzdG9wcGVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcG9vbENvbmZpZzogT3BlbkFJV29ya2VyUG9vbENvbmZpZyA9IHJlc29sdmVPcGVuQUlXb3JrZXJQb29sQ29uZmlnKCksXG4gICAgZ2V0SG9zdEF2YWlsYWJsZUdpQjogKCkgPT4gbnVtYmVyID0gcmVhZEhvc3RBdmFpbGFibGVHaUIsXG4gICkge1xuICAgIHRoaXMucG9vbENvbmZpZyA9IHBvb2xDb25maWc7XG4gICAgdGhpcy5nZXRIb3N0QXZhaWxhYmxlR2lCID0gZ2V0SG9zdEF2YWlsYWJsZUdpQjtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RvcHBlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kTWFueShcIkFcIik7XG4gICAgY29uc3Qgb3BlbmFpVG9rZW5zID0gcm93cy5maWx0ZXIoKHQpID0+IHQucHJvdmlkZXIgPT09IFwib3BlbmFpXCIpO1xuICAgIGxvZ2dlci5pbmZvKFxuICAgICAgdGhpcy5wb29sQ29uZmlnLmF1dG9zY2FsZVxuICAgICAgICA/IGBzdGFydGluZyAke29wZW5haVRva2Vucy5sZW5ndGh9IG9wZW5haSB0b2tlbnMgKCR7dGhpcy5wb29sQ29uZmlnLm1pbldvcmtlcnNQZXJUb2tlbn0tJHt0aGlzLnBvb2xDb25maWcubWF4V29ya2Vyc1BlclRva2VufSB3b3JrZXJzIGVhY2gsIGF1dG9zY2FsZSlgXG4gICAgICAgIDogYHN0YXJ0aW5nICR7b3BlbmFpVG9rZW5zLmxlbmd0aH0gb3BlbmFpIHRva2VucyAoJHt0aGlzLnBvb2xDb25maWcubWluV29ya2Vyc1BlclRva2VufSB3b3JrZXJzIGVhY2gpYCxcbiAgICApO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgb3BlbmFpVG9rZW5zLm1hcChhc3luYyAodCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnNwYXduV29ya2VycyhcbiAgICAgICAgICB0LmlkLFxuICAgICAgICAgIHQubmFtZSxcbiAgICAgICAgICB0LmNyZWRlbnRpYWxzIGFzIE9wZW5BSUNyZWRlbnRpYWxzLFxuICAgICAgICAgIHQucXVvdGFfdGhyZXNob2xkLFxuICAgICAgICAgIHQud2VpZ2h0LFxuICAgICAgICApO1xuICAgICAgICBpZiAoIXQuYWN0aXZlKSB0aGlzLm9uVG9rZW5EZWFjdGl2YXRlZCh0LmlkKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBpZiAodGhpcy5wb29sQ29uZmlnLmF1dG9zY2FsZSkge1xuICAgICAgdGhpcy5zY2FsZXJUaW1lciA9IHNldEludGVydmFsKFxuICAgICAgICAoKSA9PiB0aGlzLnJlcXVlc3RBdXRvc2NhbGVFdmFsdWF0aW9uKCksXG4gICAgICAgIHRoaXMucG9vbENvbmZpZy5zY2FsZUludGVydmFsTXMsXG4gICAgICApO1xuICAgICAgdGhpcy5zY2FsZXJUaW1lci51bnJlZj8uKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RvcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnN0b3BwZWQgPSB0cnVlO1xuICAgIGlmICh0aGlzLnNjYWxlclRpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuc2NhbGVyVGltZXIpO1xuICAgICAgdGhpcy5zY2FsZXJUaW1lciA9IG51bGw7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuc2NhbGluZ1Byb21pc2U/LmNhdGNoKCgpID0+IHt9KTtcbiAgICB0aGlzLnJlamVjdEFsbFF1ZXVlZChcIkRJU1BBVENIRVJfU0hVVERPV05cIik7XG4gICAgY29uc3Qga2lsbHMgPSBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkubWFwKCh3KSA9PiB3LmtpbGwoKSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGtpbGxzKTtcbiAgICBmb3IgKGNvbnN0IGlkIG9mIHRoaXMudG9rZW5NZXRhZGF0YS5rZXlzKCkpIHRoaXMud2VpZ2h0ZWRTZWxlY3Rvci5yZW1vdmVUb2tlbihpZCk7XG4gICAgdGhpcy53b3JrZXJQb29sLmNsZWFyKCk7XG4gICAgdGhpcy50b2tlbk1ldGFkYXRhLmNsZWFyKCk7XG4gICAgdGhpcy53b3JrZXJDdXJzb3JCeVRva2VuLmNsZWFyKCk7XG4gICAgdGhpcy53ZWlnaHRlZFNlbGVjdG9yLnJlc2V0U2NvcmVzKCk7XG4gICAgdGhpcy5yYXRlTGltaXRzQ2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLnJhdGVMaW1pdHNHZW5lcmF0aW9uQnlUb2tlbi5jbGVhcigpO1xuICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuY2xlYXIoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBUb2tlbiBldmVudHMgKGZyb20gVG9rZW5TdWJzY3JpYmVyKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhc3luYyBvblRva2VuQWRkZWQoXG4gICAgaWQ6IG51bWJlcixcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY3JlZGVudGlhbHM6IE9wZW5BSUNyZWRlbnRpYWxzLFxuICAgIHF1b3RhVGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbCxcbiAgICB3ZWlnaHQgPSAxLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnF1b3RhQmxvY2tlZFRva2VuSWRzLmRlbGV0ZShpZCk7XG4gICAgdGhpcy5pbnZhbGlkYXRlUmF0ZUxpbWl0c0NhY2hlKGlkKTtcbiAgICB0aGlzLnNldFRva2VuTWV0YWRhdGEoaWQsIG5hbWUsIGNyZWRlbnRpYWxzLCBxdW90YVRocmVzaG9sZCwgd2VpZ2h0KTtcbiAgICBpZiAodGhpcy53b3JrZXJQb29sLmhhcyhpZCkpIHJldHVybjtcbiAgICBhd2FpdCB0aGlzLnNwYXduV29ya2VycyhpZCwgbmFtZSwgY3JlZGVudGlhbHMsIHF1b3RhVGhyZXNob2xkLCB3ZWlnaHQpO1xuICB9XG5cbiAgYXN5bmMgb25Ub2tlblJlbW92ZWQoaWQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHdvcmtlcnMgPSB0aGlzLndvcmtlclBvb2wuZ2V0KGlkKSA/PyBbXTtcbiAgICBjb25zdCB0b2tlbk5hbWUgPSB3b3JrZXJzWzBdPy50b2tlbk5hbWU7XG4gICAgdGhpcy53b3JrZXJQb29sLmRlbGV0ZShpZCk7XG4gICAgdGhpcy50b2tlbk1ldGFkYXRhLmRlbGV0ZShpZCk7XG4gICAgdGhpcy53ZWlnaHRlZFNlbGVjdG9yLnJlbW92ZVRva2VuKGlkKTtcbiAgICB0aGlzLndvcmtlckN1cnNvckJ5VG9rZW4uZGVsZXRlKGlkKTtcbiAgICB0aGlzLmludmFsaWRhdGVSYXRlTGltaXRzQ2FjaGUoaWQpO1xuICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuZGVsZXRlKGlkKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQod29ya2Vycy5tYXAoKHcpID0+IHcua2lsbCgpKSk7XG4gICAgaWYgKHRoaXMuZ2V0QWxsUmVhZHlBY3RpdmVXb3JrZXJzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnJlamVjdEFsbFF1ZXVlZChcIk5PX09QRU5BSV9XT1JLRVJTXCIpO1xuICAgIH1cbiAgICBpZiAod29ya2Vycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBsYWJlbCA9IHRva2VuTmFtZSA/PyBgdG9rZW4gJHtpZH1gO1xuICAgICAgbG9nZ2VyLmluZm8oYHdvcmtlcnMgcmVtb3ZlZDogJHtsYWJlbH0gKCR7d29ya2Vycy5sZW5ndGh9KWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9uVG9rZW5VcGRhdGVkKFxuICAgIGlkOiBudW1iZXIsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNyZWRlbnRpYWxzOiBPcGVuQUlDcmVkZW50aWFscyxcbiAgICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGwsXG4gICAgd2VpZ2h0ID0gMSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLndvcmtlclBvb2wuZ2V0KGlkKSA/PyBbXTtcbiAgICBjb25zdCB0aHJlc2hvbGRDaGFuZ2VkID0gdGhpcy5nZXRRdW90YVRocmVzaG9sZChpZCkgIT09IHF1b3RhVGhyZXNob2xkO1xuICAgIGlmICh0aHJlc2hvbGRDaGFuZ2VkKSB0aGlzLnF1b3RhQmxvY2tlZFRva2VuSWRzLmRlbGV0ZShpZCk7XG4gICAgdGhpcy5zZXRUb2tlbk1ldGFkYXRhKGlkLCBuYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCk7XG5cbiAgICBpZiAoZXhpc3RpbmcubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmludmFsaWRhdGVSYXRlTGltaXRzQ2FjaGUoaWQpO1xuICAgICAgYXdhaXQgdGhpcy5zcGF3bldvcmtlcnMoaWQsIG5hbWUsIGNyZWRlbnRpYWxzLCBxdW90YVRocmVzaG9sZCwgd2VpZ2h0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXhpc3RpbmcuZXZlcnkoKHcpID0+IHcuY2FuUmV1c2VGb3JUb2tlbihuYW1lLCBjcmVkZW50aWFscykpKSB7XG4gICAgICBleGlzdGluZy5mb3JFYWNoKCh3KSA9PiB3LnVwZGF0ZVRva2VuU3RhdGUobmFtZSwgY3JlZGVudGlhbHMpKTtcbiAgICAgIGxvZ2dlci5pbmZvKGB3b3JrZXJzIHVwZGF0ZWQgaW4tcGxhY2U6ICR7bmFtZX1gKTtcbiAgICAgIHRoaXMucmVxdWVzdERyYWluUXVldWUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLndvcmtlclBvb2wuZGVsZXRlKGlkKTtcbiAgICB0aGlzLmludmFsaWRhdGVSYXRlTGltaXRzQ2FjaGUoaWQpO1xuICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuZGVsZXRlKGlkKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoZXhpc3RpbmcubWFwKCh3KSA9PiB3LmtpbGwoKSkpO1xuICAgIGF3YWl0IHRoaXMuc3Bhd25Xb3JrZXJzKGlkLCBuYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCk7XG4gIH1cblxuICBvblRva2VuRGVhY3RpdmF0ZWQoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHdvcmtlcnMgPSB0aGlzLndvcmtlclBvb2wuZ2V0KGlkKSA/PyBbXTtcbiAgICBjb25zdCB0b2tlbk5hbWUgPSB3b3JrZXJzWzBdPy50b2tlbk5hbWU7XG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KGlkKTtcbiAgICBpZiAobWV0YWRhdGE/LmFjdGl2ZSkgdGhpcy50b2tlbk1ldGFkYXRhLnNldChpZCwgeyAuLi5tZXRhZGF0YSwgYWN0aXZlOiBmYWxzZSB9KTtcbiAgICB0aGlzLnF1b3RhQmxvY2tlZFRva2VuSWRzLmRlbGV0ZShpZCk7XG4gICAgY29uc3QgY2hhbmdlZCA9IHdvcmtlcnMuc29tZSgod29ya2VyKSA9PiB3b3JrZXIuYWN0aXZlKTtcbiAgICB3b3JrZXJzLmZvckVhY2goKHcpID0+IHtcbiAgICAgIHcuYWN0aXZlID0gZmFsc2U7XG4gICAgfSk7XG4gICAgaWYgKGNoYW5nZWQpIHRoaXMud2VpZ2h0ZWRTZWxlY3Rvci5yZXNldFNjb3JlcygpO1xuICAgIGlmICh0aGlzLmdldEFsbFJlYWR5QWN0aXZlV29ya2VycygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5yZWplY3RBbGxRdWV1ZWQoXCJOT19BQ1RJVkVfV09SS0VSU1wiKTtcbiAgICB9XG4gICAgY29uc3QgbGFiZWwgPSB0b2tlbk5hbWUgPz8gYHRva2VuICR7aWR9YDtcbiAgICBsb2dnZXIuaW5mbyhgd29ya2VycyBkZWFjdGl2YXRlZDogJHtsYWJlbH1gKTtcbiAgfVxuXG4gIG9uVG9rZW5BY3RpdmF0ZWQoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHdvcmtlcnMgPSB0aGlzLndvcmtlclBvb2wuZ2V0KGlkKSA/PyBbXTtcbiAgICBjb25zdCB0b2tlbk5hbWUgPSB3b3JrZXJzWzBdPy50b2tlbk5hbWU7XG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KGlkKTtcbiAgICBpZiAobWV0YWRhdGEgJiYgIW1ldGFkYXRhLmFjdGl2ZSkgdGhpcy50b2tlbk1ldGFkYXRhLnNldChpZCwgeyAuLi5tZXRhZGF0YSwgYWN0aXZlOiB0cnVlIH0pO1xuICAgIGNvbnN0IGNoYW5nZWQgPSB3b3JrZXJzLnNvbWUoKHdvcmtlcikgPT4gIXdvcmtlci5hY3RpdmUpO1xuICAgIHdvcmtlcnMuZm9yRWFjaCgodykgPT4ge1xuICAgICAgdy5hY3RpdmUgPSB0cnVlO1xuICAgIH0pO1xuICAgIGlmIChjaGFuZ2VkKSB0aGlzLndlaWdodGVkU2VsZWN0b3IucmVzZXRTY29yZXMoKTtcbiAgICB0aGlzLnJlcXVlc3REcmFpblF1ZXVlKCk7XG4gICAgY29uc3QgbGFiZWwgPSB0b2tlbk5hbWUgPz8gYHRva2VuICR7aWR9YDtcbiAgICBsb2dnZXIuaW5mbyhgd29ya2VycyBhY3RpdmF0ZWQ6ICR7bGFiZWx9YCk7XG4gIH1cblxuICBhc3luYyByZXBsYWNlVG9rZW5zKFxuICAgIHJvd3M6IEFycmF5PHtcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHM7XG4gICAgICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGw7XG4gICAgICB3ZWlnaHQ6IG51bWJlcjtcbiAgICB9PixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbmV4dCA9IG5ldyBTZXQocm93cy5tYXAoKHIpID0+IHIuaWQpKTtcbiAgICBmb3IgKGNvbnN0IGlkIG9mIEFycmF5LmZyb20odGhpcy53b3JrZXJQb29sLmtleXMoKSkpIHtcbiAgICAgIGlmICghbmV4dC5oYXMoaWQpKSBhd2FpdCB0aGlzLm9uVG9rZW5SZW1vdmVkKGlkKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICBpZiAodGhpcy53b3JrZXJQb29sLmhhcyhyb3cuaWQpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMub25Ub2tlblVwZGF0ZWQoXG4gICAgICAgICAgcm93LmlkLFxuICAgICAgICAgIHJvdy5uYW1lLFxuICAgICAgICAgIHJvdy5jcmVkZW50aWFscyxcbiAgICAgICAgICByb3cucXVvdGFUaHJlc2hvbGQsXG4gICAgICAgICAgcm93LndlaWdodCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMub25Ub2tlbkFkZGVkKHJvdy5pZCwgcm93Lm5hbWUsIHJvdy5jcmVkZW50aWFscywgcm93LnF1b3RhVGhyZXNob2xkLCByb3cud2VpZ2h0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMub25Ub2tlbkFjdGl2YXRlZChyb3cuaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBHZW5lcmF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhc3luYyBnZW5lcmF0ZShyZXE6IEdlbmVyYXRlUmVxdWVzdCk6IFByb21pc2U8R2VuZXJhdGVSZXN1bHQ+IHtcbiAgICB0aGlzLmxhc3RSZXF1ZXN0QXQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGV4Y2x1ZGVkVG9rZW5JZHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICAvLyB0aHJlYWQg7J6s7IKs7JqpIOqyveuhnDog7KKM7ZGcIHdvcmtlciDrpbwg7KCQ7Jyg7ZW0IOq4sOyhtCB0aHJlYWQg7JeQIHR1cm4g66eMIOyLpO2WiS5cbiAgICBjb25zdCByZXVzZVdvcmtlciA9IGF3YWl0IHRoaXMuYWNxdWlyZVJldXNlV29ya2VyKHJlcSwgZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKHJldXNlV29ya2VyKSB7XG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgYOKGuyAke3JldXNlV29ya2VyLnRva2VuTmFtZX1bJHtyZXVzZVdvcmtlci50b2tlbklkfV0gKHJldXNlIHRocmVhZCwgJHtyZXEubW9kZWx9KWAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUFuZFJlbGVhc2UocmV1c2VXb3JrZXIsICh3KSA9PlxuICAgICAgICB0aGlzLmV4ZWN1dGVUdXJuKHcsIHJlcSwgcmVxLnJldXNlIS50aHJlYWRJZCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IHRoaXMuYWNxdWlyZUlkbGVXb3JrZXIoZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKHdvcmtlcikge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGkiAke3dvcmtlci50b2tlbk5hbWV9WyR7d29ya2VyLnRva2VuSWR9XSAobW9kZWw6ICR7cmVxLm1vZGVsfSlgKTtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVBbmRSZWxlYXNlKHdvcmtlciwgKHcpID0+IHRoaXMuZXhlY3V0ZVR1cm4odywgcmVxKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmVucXVldWUoKHcpID0+IHtcbiAgICAgIGxvZ2dlci5pbmZvKGDihpIgJHt3LnRva2VuTmFtZX1bJHt3LnRva2VuSWR9XSAobW9kZWw6ICR7cmVxLm1vZGVsfSwgcXVldWVkKWApO1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVR1cm4odywgcmVxKTtcbiAgICB9LCBleGNsdWRlZFRva2VuSWRzKTtcbiAgfVxuXG4gIGFzeW5jIGdlbmVyYXRlU3RyZWFtKHJlcTogR2VuZXJhdGVSZXF1ZXN0LCBjYjogR2VuZXJhdGVTdHJlYW1DYWxsYmFja3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxhc3RSZXF1ZXN0QXQgPSBEYXRlLm5vdygpO1xuICAgIC8vIOydtOuvuOyngCDsg53shLHsnYAgbm9uLXN0cmVhbSDsoITsmqkoUjIpOiBjb2RleCDqsIAg7J2066+47KeAIOuNuO2DgOulvCDso7zsp4Ag7JWK6rOgIOyZhOyEsSBiYXNlNjQg66W8XG4gICAgLy8g7ZWcIOuyiOyXkCDspIDri6QuIOyKpO2KuOumrOuwjSDqsr3roZzroZwg7J2066+47KeAIOyalOyyreydtCDsmKTrqbQg66qF7Iuc7KCBIOyXkOufrC5cbiAgICBpZiAocmVxLmltYWdlR2VuZXJhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFxuICAgICAgICBcImdhdGVcIixcbiAgICAgICAgXCJpbWFnZSBnZW5lcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIHN0cmVhbWluZyBwYXRoXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBleGNsdWRlZFRva2VuSWRzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgY29uc3QgcmV1c2VXb3JrZXIgPSBhd2FpdCB0aGlzLmFjcXVpcmVSZXVzZVdvcmtlcihyZXEsIGV4Y2x1ZGVkVG9rZW5JZHMpO1xuICAgIGlmIChyZXVzZVdvcmtlcikge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGuyAke3JldXNlV29ya2VyLnRva2VuTmFtZX1bJHtyZXVzZVdvcmtlci50b2tlbklkfV0gKHJldXNlIHRocmVhZCwgW3N0cmVhbV0pYCk7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQW5kUmVsZWFzZShyZXVzZVdvcmtlciwgKHcpID0+XG4gICAgICAgIHRoaXMuZXhlY3V0ZVN0cmVhbVR1cm4odywgcmVxLCBjYiwgcmVxLnJldXNlIS50aHJlYWRJZCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IHRoaXMuYWNxdWlyZUlkbGVXb3JrZXIoZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKHdvcmtlcikge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGkiAke3dvcmtlci50b2tlbk5hbWV9WyR7d29ya2VyLnRva2VuSWR9XSAobW9kZWw6ICR7cmVxLm1vZGVsfSwgW3N0cmVhbV0pYCk7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQW5kUmVsZWFzZSh3b3JrZXIsICh3KSA9PiB0aGlzLmV4ZWN1dGVTdHJlYW1UdXJuKHcsIHJlcSwgY2IpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZW5xdWV1ZSgodykgPT4ge1xuICAgICAgbG9nZ2VyLmluZm8oYOKGkiAke3cudG9rZW5OYW1lfVske3cudG9rZW5JZH1dIChtb2RlbDogJHtyZXEubW9kZWx9LCBbc3RyZWFtXSwgcXVldWVkKWApO1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVN0cmVhbVR1cm4odywgcmVxLCBjYik7XG4gICAgfSwgZXhjbHVkZWRUb2tlbklkcyk7XG4gIH1cblxuICAvLyByZXVzZSDsooztkZzqsIAg7Jyg7Zqo7ZWY66m0IOq3uCB3b3JrZXIg66W8IGJ1c3kg7KCQ7Jyg7ZW0IOuwmO2ZmC4g7JeG6rGw64KYIO2PtOuwsSDrjIDsg4HsnbTrqbQgbnVsbC5cbiAgLy8g7Y+067CxIOyCrOycoDog6riw64qlIG9mZiAvIOyijO2RnCDsl4bsnYwgLyB3b3JrZXIg67aA7J6swrfso73snYwgLyBlcG9jaCDrtojsnbzsuZgocmVzdGFydCkgLyB0aHJlYWQg7IaM66m4IC9cbiAgLy8gICAgICAgICAgICBidXN5IOuMgOq4sCDtg4DsnoTslYTsm4MuIG51bGwg67CY7ZmYIOyLnCDtmLjstpzrtoDripQg7IOIIHRocmVhZCDqsr3roZzroZwg7KeE7ZaJLlxuICBhc3luYyBhY3F1aXJlUmV1c2VXb3JrZXIoXG4gICAgcmVxOiBHZW5lcmF0ZVJlcXVlc3QsXG4gICAgZXhjbHVkZWRUb2tlbklkcyA9IG5ldyBTZXQ8bnVtYmVyPigpLFxuICApOiBQcm9taXNlPENvZGV4QXBwU2VydmVyV29ya2VyIHwgbnVsbD4ge1xuICAgIC8vIOydtOuvuOyngCDsmpTssq3snYAg7ZWt7IOBIGNvbGQgdGhyZWFkKFI4KTog7J6s7IKs7JqpIOyijO2RnOqwgCDsnojslrTrj4Qg6rG064SI65u064ukLlxuICAgIC8vIGJhc2U2NCDqsIAgdGhyZWFkIOuplOuqqOumrMK37LqQ7IucIHByZWZpeCDsl5Ag7IOB7KO87ZWY64qUIOqyg+ydhCDrp4nripTri6QuXG4gICAgaWYgKHJlcS5pbWFnZUdlbmVyYXRpb24pIHJldHVybiBudWxsO1xuICAgIGlmICghVEhSRUFEX1JFVVNFX0VOQUJMRUQgfHwgIXJlcS5yZXVzZSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgeyB3b3JrZXJJZCwgdGhyZWFkSWQsIGVwb2NoIH0gPSByZXEucmV1c2U7XG5cbiAgICBjb25zdCB3b3JrZXIgPSB0aGlzLmZpbmRXb3JrZXJCeUlkKHdvcmtlcklkKTtcbiAgICBpZiAoIXdvcmtlciB8fCAhd29ya2VyLmlzUmVhZHkgfHwgIXdvcmtlci5hY3RpdmUpIHJldHVybiBudWxsO1xuICAgIGlmICh3b3JrZXIuZXBvY2ggIT09IGVwb2NoKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoIXdvcmtlci5oYXNUaHJlYWQodGhyZWFkSWQpKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBxdW90YU1ldGFkYXRhID0gdGhpcy50b2tlbk1ldGFkYXRhLmdldCh3b3JrZXIudG9rZW5JZCk7XG4gICAgaWYgKCEoYXdhaXQgdGhpcy5pc1Rva2VuUXVvdGFFbGlnaWJsZSh3b3JrZXIudG9rZW5JZCwgd29ya2VyLnRva2VuTmFtZSwgZXhjbHVkZWRUb2tlbklkcykpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgIXdvcmtlci5pc1JlYWR5IHx8XG4gICAgICAhd29ya2VyLmFjdGl2ZSB8fFxuICAgICAgdGhpcy50b2tlbk1ldGFkYXRhLmdldCh3b3JrZXIudG9rZW5JZCkgIT09IHF1b3RhTWV0YWRhdGEgfHxcbiAgICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuaGFzKHdvcmtlci50b2tlbklkKVxuICAgICkge1xuICAgICAgaWYgKHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuaGFzKHdvcmtlci50b2tlbklkKSkge1xuICAgICAgICBleGNsdWRlZFRva2VuSWRzLmFkZCh3b3JrZXIudG9rZW5JZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBSRVVTRV9XT1JLRVJfV0FJVF9NUztcbiAgICBmb3IgKDs7KSB7XG4gICAgICAvLyByZXN0YXJ0KGVwb2NoIOuzgOqyvSkgLyB0aHJlYWQg7IaM66m47J20IOuMgOq4sCDspJHsl5Ag67Cc7IOd7ZWY66m0IO2PtOuwsS5cbiAgICAgIGlmIChcbiAgICAgICAgIXdvcmtlci5pc1JlYWR5IHx8XG4gICAgICAgICF3b3JrZXIuYWN0aXZlIHx8XG4gICAgICAgIHdvcmtlci5lcG9jaCAhPT0gZXBvY2ggfHxcbiAgICAgICAgIXdvcmtlci5oYXNUaHJlYWQodGhyZWFkSWQpIHx8XG4gICAgICAgIHRoaXMudG9rZW5NZXRhZGF0YS5nZXQod29ya2VyLnRva2VuSWQpICE9PSBxdW90YU1ldGFkYXRhIHx8XG4gICAgICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuaGFzKHdvcmtlci50b2tlbklkKVxuICAgICAgKSB7XG4gICAgICAgIGlmICh0aGlzLnF1b3RhQmxvY2tlZFRva2VuSWRzLmhhcyh3b3JrZXIudG9rZW5JZCkpIHtcbiAgICAgICAgICBleGNsdWRlZFRva2VuSWRzLmFkZCh3b3JrZXIudG9rZW5JZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAod29ya2VyLnRyeUFjcXVpcmVUdXJuKCkpIHJldHVybiB3b3JrZXI7XG4gICAgICBpZiAoRGF0ZS5ub3coKSA+PSBkZWFkbGluZSkgcmV0dXJuIG51bGw7XG4gICAgICBhd2FpdCBzbGVlcChSRVVTRV9XT1JLRVJfUE9MTF9NUyk7XG4gICAgfVxuICB9XG5cbiAgZmluZFdvcmtlckJ5SWQod29ya2VySWQ6IG51bWJlcik6IENvZGV4QXBwU2VydmVyV29ya2VyIHwgbnVsbCB7XG4gICAgZm9yIChjb25zdCB3b3JrZXJzIG9mIHRoaXMud29ya2VyUG9vbC52YWx1ZXMoKSkge1xuICAgICAgZm9yIChjb25zdCB3IG9mIHdvcmtlcnMpIHtcbiAgICAgICAgaWYgKG1ha2VPcGVuQUlXb3JrZXJJZCh3LnRva2VuSWQsIHcud29ya2VySW5kZXgpID09PSB3b3JrZXJJZCkgcmV0dXJuIHc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgYXN5bmMgaW50ZXJydXB0V29ya2VyVHVybih0aHJlYWRJZDogc3RyaW5nLCB0dXJuSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFsbFdvcmtlcnMgPSBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkuZmlsdGVyKCh3KSA9PiB3LmlzUmVhZHkpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChhbGxXb3JrZXJzLm1hcCgodykgPT4gdy5pbnRlcnJ1cHRUdXJuKHRocmVhZElkLCB0dXJuSWQpKSk7XG4gIH1cblxuICAvLyDilIDilIAgV29ya2VyIHNlbGVjdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gUXVvdGEtZWxpZ2libGUgaWRsZSB0b2tlbuydhCB3ZWlnaHTroZwg6rOg66W4IOuSpCwg6re4IHRva2VuIOyViOyXkOyEnCB3b3JrZXLrpbwg7Iic7ZmY7ZWc64ukLlxuICBhc3luYyBhY3F1aXJlSWRsZVdvcmtlcihcbiAgICBleGNsdWRlZFRva2VuSWRzID0gbmV3IFNldDxudW1iZXI+KCksXG4gICk6IFByb21pc2U8Q29kZXhBcHBTZXJ2ZXJXb3JrZXIgfCBudWxsPiB7XG4gICAgY29uc3QgZWxpZ2liaWxpdHkgPSBhd2FpdCB0aGlzLnJlc29sdmVUb2tlbkVsaWdpYmlsaXR5KGV4Y2x1ZGVkVG9rZW5JZHMpO1xuICAgIGlmIChlbGlnaWJpbGl0eS5yZWFkeUFjdGl2ZVRva2VuSWRzLnNpemUgPT09IDApIHJldHVybiBudWxsO1xuICAgIGlmIChlbGlnaWJpbGl0eS5lbGlnaWJsZVRva2VuSWRzLnNpemUgPT09IDApIHRoaXMudGhyb3dRdW90YVRocmVzaG9sZEV4Y2VlZGVkKGVsaWdpYmlsaXR5KTtcblxuICAgIGNvbnN0IHdvcmtlcnNCeVRva2VuID0gbmV3IE1hcDxudW1iZXIsIENvZGV4QXBwU2VydmVyV29ya2VyW10+KCk7XG4gICAgZm9yIChjb25zdCB3b3JrZXIgb2YgdGhpcy5nZXRBbGxSZWFkeUFjdGl2ZVdvcmtlcnMoKSkge1xuICAgICAgaWYgKCFlbGlnaWJpbGl0eS5lbGlnaWJsZVRva2VuSWRzLmhhcyh3b3JrZXIudG9rZW5JZCkgfHwgIXdvcmtlci5oYXNDYXBhY2l0eSkgY29udGludWU7XG4gICAgICBjb25zdCB3b3JrZXJzID0gd29ya2Vyc0J5VG9rZW4uZ2V0KHdvcmtlci50b2tlbklkKSA/PyBbXTtcbiAgICAgIHdvcmtlcnMucHVzaCh3b3JrZXIpO1xuICAgICAgd29ya2Vyc0J5VG9rZW4uc2V0KHdvcmtlci50b2tlbklkLCB3b3JrZXJzKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RlZFRva2VuSWQgPSB0aGlzLndlaWdodGVkU2VsZWN0b3Iuc2VsZWN0KG5ldyBTZXQod29ya2Vyc0J5VG9rZW4ua2V5cygpKSk7XG4gICAgaWYgKHNlbGVjdGVkVG9rZW5JZCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgd29ya2VycyA9IHdvcmtlcnNCeVRva2VuLmdldChzZWxlY3RlZFRva2VuSWQpITtcbiAgICBjb25zdCBjdXJzb3IgPSB0aGlzLndvcmtlckN1cnNvckJ5VG9rZW4uZ2V0KHNlbGVjdGVkVG9rZW5JZCkgPz8gMDtcbiAgICBmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCB3b3JrZXJzLmxlbmd0aDsgb2Zmc2V0KyspIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gKGN1cnNvciArIG9mZnNldCkgJSB3b3JrZXJzLmxlbmd0aDtcbiAgICAgIGNvbnN0IHdvcmtlciA9IHdvcmtlcnNbaW5kZXhdITtcbiAgICAgIGlmICh3b3JrZXIudHJ5QWNxdWlyZVR1cm4oKSkge1xuICAgICAgICB0aGlzLndvcmtlckN1cnNvckJ5VG9rZW4uc2V0KHNlbGVjdGVkVG9rZW5JZCwgKGluZGV4ICsgMSkgJSB3b3JrZXJzLmxlbmd0aCk7XG4gICAgICAgIHJldHVybiB3b3JrZXI7XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGB3ZWlnaHRlZCB0b2tlbiAke3NlbGVjdGVkVG9rZW5JZH0gbG9zdCBpZGxlIGNhcGFjaXR5IGR1cmluZyBzeW5jaHJvbm91cyBhY3F1aXJlYCxcbiAgICApO1xuICB9XG5cbiAgZ2V0QWxsUmVhZHlBY3RpdmVXb3JrZXJzKCk6IENvZGV4QXBwU2VydmVyV29ya2VyW10ge1xuICAgIHJldHVybiBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkuZmlsdGVyKCh3KSA9PiB3LmlzUmVhZHkgJiYgdy5hY3RpdmUpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFF1ZXVlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIGVucXVldWU8VD4oXG4gICAgZXhlY3V0ZTogKHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIpID0+IFByb21pc2U8VD4sXG4gICAgZXhjbHVkZWRUb2tlbklkcyA9IG5ldyBTZXQ8bnVtYmVyPigpLFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBlbGlnaWJpbGl0eSA9IGF3YWl0IHRoaXMucmVzb2x2ZVRva2VuRWxpZ2liaWxpdHkoZXhjbHVkZWRUb2tlbklkcyk7XG4gICAgaWYgKGVsaWdpYmlsaXR5LnJlYWR5QWN0aXZlVG9rZW5JZHMuc2l6ZSA9PT0gMCkgdGhyb3cgbmV3IEVycm9yKFwiTk9fT1BFTkFJX1dPUktFUlNcIik7XG4gICAgaWYgKGVsaWdpYmlsaXR5LmVsaWdpYmxlVG9rZW5JZHMuc2l6ZSA9PT0gMCkgdGhpcy50aHJvd1F1b3RhVGhyZXNob2xkRXhjZWVkZWQoZWxpZ2liaWxpdHkpO1xuICAgIGlmICh0aGlzLnF1ZXVlLmxlbmd0aCA+PSBNQVhfUVVFVUVfU0laRSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU0VSVkVSX0JVU1lcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGl0ZW06IFF1ZXVlSXRlbSA9IHtcbiAgICAgICAgcmVzb2x2ZTogKHdvcmtlcikgPT4ge1xuICAgICAgICAgIGNsZWFyVGltZW91dChpdGVtLnRpbWVyKTtcbiAgICAgICAgICBpdGVtLmFib3J0Q2xlYW51cD8uKCk7XG4gICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMuZXhlY3V0ZUFuZFJlbGVhc2Uod29ya2VyLCBleGVjdXRlKSlcbiAgICAgICAgICAgIC50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlamVjdDogKGVycikgPT4ge1xuICAgICAgICAgIGNsZWFyVGltZW91dChpdGVtLnRpbWVyKTtcbiAgICAgICAgICBpdGVtLmFib3J0Q2xlYW51cD8uKCk7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0sXG4gICAgICAgIHRpbWVyOiBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUZyb21RdWV1ZShpdGVtKTtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwiU0VSVkVSX0JVU1lcIikpO1xuICAgICAgICB9LCBRVUVVRV9USU1FT1VUX01TKSxcbiAgICAgICAgZXhjbHVkZWRUb2tlbklkczogbmV3IFNldChleGNsdWRlZFRva2VuSWRzKSxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMucXVldWUucHVzaChpdGVtKTtcbiAgICAgIHRoaXMucmVxdWVzdEF1dG9zY2FsZUV2YWx1YXRpb24oKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlbW92ZUZyb21RdWV1ZShpdGVtOiBRdWV1ZUl0ZW0pOiB2b2lkIHtcbiAgICBjbGVhclRpbWVvdXQoaXRlbS50aW1lcik7XG4gICAgaXRlbS5hYm9ydENsZWFudXA/LigpO1xuICAgIGNvbnN0IGlkeCA9IHRoaXMucXVldWUuaW5kZXhPZihpdGVtKTtcbiAgICBpZiAoaWR4ICE9PSAtMSkgdGhpcy5xdWV1ZS5zcGxpY2UoaWR4LCAxKTtcbiAgfVxuXG4gIHJlamVjdEFsbFF1ZXVlZChyZWFzb246IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihyZWFzb24pO1xuICAgIHRoaXMucXVldWUuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgY2xlYXJUaW1lb3V0KGl0ZW0udGltZXIpO1xuICAgICAgaXRlbS5hYm9ydENsZWFudXA/LigpO1xuICAgICAgaXRlbS5yZWplY3QoZXJyKTtcbiAgICB9KTtcbiAgICB0aGlzLnF1ZXVlID0gW107XG4gIH1cblxuICBhc3luYyBkcmFpblF1ZXVlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmRyYWluaW5nKSB7XG4gICAgICB0aGlzLmRyYWluQWdhaW4gPSB0cnVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZHJhaW5pbmcgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBkbyB7XG4gICAgICAgIHRoaXMuZHJhaW5BZ2FpbiA9IGZhbHNlO1xuICAgICAgICBhd2FpdCB0aGlzLmRyYWluUXVldWVPbmNlKCk7XG4gICAgICB9IHdoaWxlICh0aGlzLmRyYWluQWdhaW4pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBkcmFpblF1ZXVlIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5kcmFpbmluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZHJhaW5RdWV1ZU9uY2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgd2hpbGUgKHRoaXMucXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbmV4dCA9IHRoaXMucXVldWVbMF0hO1xuICAgICAgbGV0IHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXIgfCBudWxsO1xuICAgICAgdHJ5IHtcbiAgICAgICAgd29ya2VyID0gYXdhaXQgdGhpcy5hY3F1aXJlSWRsZVdvcmtlcihuZXh0LmV4Y2x1ZGVkVG9rZW5JZHMpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFF1b3RhVGhyZXNob2xkRXhjZWVkZWRFcnJvcikge1xuICAgICAgICAgIHRoaXMucXVldWUuc2hpZnQoKTtcbiAgICAgICAgICBuZXh0LnJlamVjdChlKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgaWYgKCF3b3JrZXIpIGJyZWFrO1xuICAgICAgdGhpcy5xdWV1ZS5zaGlmdCgpO1xuICAgICAgbmV4dC5yZXNvbHZlKHdvcmtlcik7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIEV4ZWN1dGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhc3luYyBleGVjdXRlQW5kUmVsZWFzZTxUPihcbiAgICB3b3JrZXI6IENvZGV4QXBwU2VydmVyV29ya2VyLFxuICAgIGV4ZWN1dGU6ICh3b3JrZXI6IENvZGV4QXBwU2VydmVyV29ya2VyKSA9PiBQcm9taXNlPFQ+LFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGV4ZWN1dGUod29ya2VyKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgd29ya2VyLnJlbGVhc2VUdXJuKCk7XG4gICAgICB0aGlzLnJlcXVlc3REcmFpblF1ZXVlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gcmV1c2VUaHJlYWRJZCDqsIAg7J6I7Jy866m0IOq4sOyhtCB0aHJlYWQg7JeQIGRlbHRhKHJldXNlSW5wdXQp66eMLCDsl4bsnLzrqbQg7IOIIHRocmVhZCDsl5Ag7KCE7LK0XG4gIC8vIHByb21wdChjb2xkSW5wdXQpICsgaGlzdG9yeSBpbmplY3QuIHJldXNlIOqwgCBkaXNwYXRjaGVyIOuLqOyXkOyEnCDtj7TrsLHrkJjrqbQg7ZuE7J6Q66GcIOuWqOyWtOynhOuLpC5cbiAgcHJpdmF0ZSBidWlsZFR1cm5SZXF1ZXN0KHJlcTogR2VuZXJhdGVSZXF1ZXN0LCByZXVzZVRocmVhZElkPzogc3RyaW5nKTogVHVyblJlcXVlc3Qge1xuICAgIGNvbnN0IHJldXNpbmcgPSByZXVzZVRocmVhZElkICE9PSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0OiByZXVzaW5nICYmIHJlcS5yZXVzZUlucHV0ID8gcmVxLnJldXNlSW5wdXQgOiByZXEuY29sZElucHV0LFxuICAgICAgaGlzdG9yeTogcmV1c2luZyA/IHVuZGVmaW5lZCA6IHJlcS5jb2xkSGlzdG9yeSxcbiAgICAgIGRldmVsb3Blckluc3RydWN0aW9uczogcmVxLnN5c3RlbVByb21wdCxcbiAgICAgIG91dHB1dFNjaGVtYTogcmVxLm91dHB1dFNjaGVtYSxcbiAgICAgIGVmZm9ydDogcmVxLmVmZm9ydCA/PyBERUZBVUxUX0VGRk9SVCxcbiAgICAgIG1vZGVsOiByZXEubW9kZWwsXG4gICAgICB2ZXJib3NpdHk6IHJlcS52ZXJib3NpdHksXG4gICAgICByZWFzb25pbmdTdW1tYXJ5OiByZXEucmVhc29uaW5nU3VtbWFyeSxcbiAgICAgIHNlcnZpY2VUaWVyOiByZXEuc2VydmljZVRpZXIsXG4gICAgICBpbWFnZUdlbmVyYXRpb246IHJlcS5pbWFnZUdlbmVyYXRpb24sXG4gICAgICBpbWFnZUdlbmVyYXRpb25PcHRpb25zOiByZXEuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZVR1cm4oXG4gICAgd29ya2VyOiBDb2RleEFwcFNlcnZlcldvcmtlcixcbiAgICByZXE6IEdlbmVyYXRlUmVxdWVzdCxcbiAgICByZXVzZVRocmVhZElkPzogc3RyaW5nLFxuICApOiBQcm9taXNlPEdlbmVyYXRlUmVzdWx0PiB7XG4gICAgLy8g7J2066+47KeAIOyalOyyrSDsgqzsoIQg6rKM7J207Yq4KFI1KTog67Cw7KCV65CcIHdvcmtlciDsnZggY2FwYWJpbGl0eSArIOyggeyaqSDrqqjrjbgg66mA7Yuw66qo64usLlxuICAgIC8vIOu2iOy2qeyhseydtOuptCB0dXJuIOydhCDsi6TtlontlZjsp4Ag7JWK6rOgIOuqheyLnOyggSDsl5Drn6wuXG4gICAgaWYgKHJlcS5pbWFnZUdlbmVyYXRpb24pIHtcbiAgICAgIGNvbnN0IHJlYXNvbiA9IGF3YWl0IHdvcmtlci5jaGVja0ltYWdlR2VuZXJhdGlvblN1cHBvcnQocmVxLm1vZGVsKTtcbiAgICAgIGlmIChyZWFzb24pIHRocm93IG5ldyBJbWFnZUdlbmVyYXRpb25FcnJvcihcImdhdGVcIiwgcmVhc29uKTtcbiAgICB9XG5cbiAgICBjb25zdCB0dXJuUmVxID0gdGhpcy5idWlsZFR1cm5SZXF1ZXN0KHJlcSwgcmV1c2VUaHJlYWRJZCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd29ya2VyLmV4ZWN1dGVUdXJuKHR1cm5SZXEsIHJldXNlVGhyZWFkSWQpO1xuXG4gICAgLy8g7J2066+47KeAIDDqsJwg7Iuk7YyoIOu2hOulmChSNik6IHRvb2wg66+47Zi47LacKOyerOyLnOuPhCDrrLTsnbUpIHZzIOyLnOuPhCDtm4Qg66+47JmE7ISxKOyerOyLnOuPhCDtm4Trs7QpLlxuICAgIGlmIChyZXEuaW1hZ2VHZW5lcmF0aW9uICYmICghcmVzdWx0LmltYWdlcyB8fCByZXN1bHQuaW1hZ2VzLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgIHRocm93IHJlc3VsdC5pbWFnZUF0dGVtcHRlZFxuICAgICAgICA/IG5ldyBJbWFnZUdlbmVyYXRpb25FcnJvcihcImluY29tcGxldGVcIiwgXCJpbWFnZSB0b29sIHJhbiBidXQgcHJvZHVjZWQgbm8gY29tcGxldGVkIGltYWdlXCIpXG4gICAgICAgIDogbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFwibm90X2NhbGxlZFwiLCBcIm1vZGVsIGRpZCBub3QgY2FsbCB0aGUgaW1hZ2VfZ2VuZXJhdGlvbiB0b29sXCIpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0ZXh0OiByZXN1bHQudGV4dCxcbiAgICAgIHRva2VuTmFtZTogd29ya2VyLnRva2VuTmFtZSxcbiAgICAgIHVzYWdlOiByZXN1bHQudXNhZ2UsXG4gICAgICBkdXJhdGlvbk1zOiByZXN1bHQuZHVyYXRpb25NcyxcbiAgICAgIHR0ZnRNczogcmVzdWx0LnR0ZnRNcyxcbiAgICAgIG1vZGVsOiByZXN1bHQubW9kZWwsXG4gICAgICB0aHJlYWRDb29yZDoge1xuICAgICAgICB3b3JrZXJJZDogbWFrZU9wZW5BSVdvcmtlcklkKHdvcmtlci50b2tlbklkLCB3b3JrZXIud29ya2VySW5kZXgpLFxuICAgICAgICB0aHJlYWRJZDogcmVzdWx0LnRocmVhZElkLFxuICAgICAgICBlcG9jaDogd29ya2VyLmVwb2NoLFxuICAgICAgfSxcbiAgICAgIGltYWdlczogcmVzdWx0LmltYWdlcyxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZVN0cmVhbVR1cm4oXG4gICAgd29ya2VyOiBDb2RleEFwcFNlcnZlcldvcmtlcixcbiAgICByZXE6IEdlbmVyYXRlUmVxdWVzdCxcbiAgICBjYjogR2VuZXJhdGVTdHJlYW1DYWxsYmFja3MsXG4gICAgcmV1c2VUaHJlYWRJZD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdHVyblJlcSA9IHRoaXMuYnVpbGRUdXJuUmVxdWVzdChyZXEsIHJldXNlVGhyZWFkSWQpO1xuICAgIC8vIHdvcmtlciDsnZggVHVyblJlc3VsdCDsl5AgdG9rZW5OYW1lL3RocmVhZENvb3JkIOulvCDrtpnsl6wg7IOB7JyEKEdlbmVyYXRlUmVzdWx0KeuhnCDsmKzrprDri6QuXG4gICAgLy8gdGhyZWFkSWQg64qUIOyDiCB0aHJlYWQg66m0IG9uVGhyZWFkSWQg66GcIO2ZleygleuQmOuvgOuhnCDrr7jrpqwg67O06rSA7ZW0IOuRkOqzoCBvbkNvbXBsZXRlIOuVjCDsnb3ripTri6QuXG4gICAgbGV0IHJlc29sdmVkVGhyZWFkSWQgPSByZXVzZVRocmVhZElkID8/IFwiXCI7XG4gICAgY29uc3Qgd3JhcHBlZENiOiBTdHJlYW1DYWxsYmFja3MgPSB7XG4gICAgICAuLi5jYixcbiAgICAgIG9uVGhyZWFkSWQ6ICh0aHJlYWRJZCkgPT4ge1xuICAgICAgICByZXNvbHZlZFRocmVhZElkID0gdGhyZWFkSWQ7XG4gICAgICAgIGNiLm9uVGhyZWFkSWQ/Lih0aHJlYWRJZCk7XG4gICAgICB9LFxuICAgICAgb25Db21wbGV0ZTogKHJlc3VsdCkgPT4ge1xuICAgICAgICBjYi5vbkNvbXBsZXRlKHtcbiAgICAgICAgICAuLi5yZXN1bHQsXG4gICAgICAgICAgdG9rZW5OYW1lOiB3b3JrZXIudG9rZW5OYW1lLFxuICAgICAgICAgIHRocmVhZENvb3JkOiB7XG4gICAgICAgICAgICB3b3JrZXJJZDogbWFrZU9wZW5BSVdvcmtlcklkKHdvcmtlci50b2tlbklkLCB3b3JrZXIud29ya2VySW5kZXgpLFxuICAgICAgICAgICAgdGhyZWFkSWQ6IHJlc29sdmVkVGhyZWFkSWQsXG4gICAgICAgICAgICBlcG9jaDogd29ya2VyLmVwb2NoLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9O1xuICAgIGF3YWl0IHdvcmtlci5leGVjdXRlVHVyblN0cmVhbSh0dXJuUmVxLCB3cmFwcGVkQ2IsIHJldXNlVGhyZWFkSWQpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNwYXduIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIHNwYXduV29ya2VycyhcbiAgICB0b2tlbklkOiBudW1iZXIsXG4gICAgdG9rZW5OYW1lOiBzdHJpbmcsXG4gICAgY3JlZGVudGlhbHM6IE9wZW5BSUNyZWRlbnRpYWxzLFxuICAgIHF1b3RhVGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbCxcbiAgICB3ZWlnaHQgPSAxLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnNldFRva2VuTWV0YWRhdGEodG9rZW5JZCwgdG9rZW5OYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCk7XG4gICAgY29uc3Qgd29ya2VyczogQ29kZXhBcHBTZXJ2ZXJXb3JrZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wb29sQ29uZmlnLm1pbldvcmtlcnNQZXJUb2tlbjsgaSsrKSB7XG4gICAgICBpZiAoaSA+IDApIGF3YWl0IHNsZWVwKFNQQVdOX0lOVEVSVkFMX01TKTtcbiAgICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IHRoaXMuc3Bhd25TaW5nbGVXb3JrZXIodG9rZW5JZCwgdG9rZW5OYW1lLCBjcmVkZW50aWFscywgaSk7XG4gICAgICBpZiAod29ya2VyKSB3b3JrZXJzLnB1c2god29ya2VyKTtcbiAgICB9XG4gICAgaWYgKHdvcmtlcnMubGVuZ3RoID4gMCkgdGhpcy53b3JrZXJQb29sLnNldCh0b2tlbklkLCB3b3JrZXJzKTtcbiAgfVxuXG4gIGFzeW5jIHNwYXduU2luZ2xlV29ya2VyKFxuICAgIHRva2VuSWQ6IG51bWJlcixcbiAgICB0b2tlbk5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgd29ya2VySW5kZXg6IG51bWJlcixcbiAgKTogUHJvbWlzZTxDb2RleEFwcFNlcnZlcldvcmtlciB8IG51bGw+IHtcbiAgICBjb25zdCB3b3JrZXIgPSBuZXcgQ29kZXhBcHBTZXJ2ZXJXb3JrZXIoe1xuICAgICAgdG9rZW5JZCxcbiAgICAgIHRva2VuTmFtZSxcbiAgICAgIGFjY2Vzc1Rva2VuOiBjcmVkZW50aWFscy5hY2Nlc3NUb2tlbixcbiAgICAgIGFjY291bnRJZDogY3JlZGVudGlhbHMuYWNjb3VudElkLFxuICAgICAgcGxhblR5cGU6IGNyZWRlbnRpYWxzLnBsYW5UeXBlLFxuICAgICAgd29ya2VySW5kZXgsXG4gICAgfSk7XG5cbiAgICB3b3JrZXIub25SZWFkeSA9ICgpID0+IHRoaXMucmVxdWVzdERyYWluUXVldWUoKTtcblxuICAgIHdvcmtlci5zZXRTZXJ2ZXJSZXF1ZXN0SGFuZGxlcihhc3luYyAobWV0aG9kKSA9PiB7XG4gICAgICBpZiAobWV0aG9kID09PSBcImFjY291bnQvY2hhdGdwdEF1dGhUb2tlbnMvcmVmcmVzaFwiKSB7XG4gICAgICAgIHJldHVybiBoYW5kbGVDaGF0Z3B0QXV0aFRva2Vuc1JlZnJlc2godG9rZW5JZCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuaGFuZGxlZCBzZXJ2ZXItcmVxdWVzdDogJHttZXRob2R9YCk7XG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd29ya2VyLmluaXRpYWxpemUoKTtcbiAgICAgIGxvZ2dlci5pbmZvKGB3b3JrZXIgc3Bhd25lZDogJHt0b2tlbk5hbWV9WyR7d29ya2VySW5kZXh9XWApO1xuICAgICAgcmV0dXJuIHdvcmtlcjtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIud2Fybihgd29ya2VyIHNwYXduIGZhaWxlZDogJHt0b2tlbk5hbWV9WyR7d29ya2VySW5kZXh9XTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgIGF3YWl0IHdvcmtlci5raWxsKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZXZhbHVhdGVBdXRvc2NhbGluZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMucG9vbENvbmZpZy5hdXRvc2NhbGUgfHwgdGhpcy5zdG9wcGVkKSByZXR1cm47XG4gICAgaWYgKHRoaXMucXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgYXdhaXQgdGhpcy5zY2FsZVVwT25lU3RlcCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoRGF0ZS5ub3coKSAtIHRoaXMubGFzdFJlcXVlc3RBdCA+PSB0aGlzLnBvb2xDb25maWcuc2NhbGVEb3duSWRsZU1zKSB7XG4gICAgICBhd2FpdCB0aGlzLnNjYWxlRG93bk9uZVN0ZXAoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzY2FsZVVwT25lU3RlcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMucG9vbENvbmZpZy5hdXRvc2NhbGUgfHwgdGhpcy5zdG9wcGVkKSByZXR1cm47XG4gICAgYXdhaXQgdGhpcy5ydW5TY2FsaW5nKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBbLi4udGhpcy50b2tlbk1ldGFkYXRhLmVudHJpZXMoKV0uZmlsdGVyKChbdG9rZW5JZCwgbWV0YWRhdGFdKSA9PiB7XG4gICAgICAgIGlmICghbWV0YWRhdGEuYWN0aXZlIHx8IHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuaGFzKHRva2VuSWQpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiAodGhpcy53b3JrZXJQb29sLmdldCh0b2tlbklkKT8ubGVuZ3RoID8/IDApIDwgdGhpcy5wb29sQ29uZmlnLm1heFdvcmtlcnNQZXJUb2tlbjtcbiAgICAgIH0pO1xuICAgICAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHByb2plY3RlZFdvcmtlckNvdW50ID0gdGhpcy53b3JrZXJDb3VudCArIGNhbmRpZGF0ZXMubGVuZ3RoO1xuICAgICAgY29uc3QgcHJvamVjdGVkUnNzR2lCID0gZXN0aW1hdGVPcGVuQUlXb3JrZXJSc3NHaUIocHJvamVjdGVkV29ya2VyQ291bnQpO1xuICAgICAgaWYgKHByb2plY3RlZFJzc0dpQiA+IHRoaXMucG9vbENvbmZpZy5tYXhFc3RpbWF0ZWRSc3NHaUIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgYG9wZW5haSBhdXRvc2NhbGUgYmxvY2tlZDogZXN0aW1hdGVkIFJTUyAke3Byb2plY3RlZFJzc0dpQi50b0ZpeGVkKDIpfUdpQiBleGNlZWRzICR7dGhpcy5wb29sQ29uZmlnLm1heEVzdGltYXRlZFJzc0dpQi50b0ZpeGVkKDIpfUdpQmAsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaG9zdEF2YWlsYWJsZUdpQiA9IHRoaXMuZ2V0SG9zdEF2YWlsYWJsZUdpQigpO1xuICAgICAgaWYgKGhvc3RBdmFpbGFibGVHaUIgPCB0aGlzLnBvb2xDb25maWcubWluSG9zdEF2YWlsYWJsZUdpQikge1xuICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICBgb3BlbmFpIGF1dG9zY2FsZSBibG9ja2VkOiBob3N0IGF2YWlsYWJsZSAke2hvc3RBdmFpbGFibGVHaUIudG9GaXhlZCgyKX1HaUIgYmVsb3cgJHt0aGlzLnBvb2xDb25maWcubWluSG9zdEF2YWlsYWJsZUdpQi50b0ZpeGVkKDIpfUdpQmAsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3Bhd25lZCA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBjYW5kaWRhdGVzLm1hcChhc3luYyAoW3Rva2VuSWQsIG1ldGFkYXRhXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHdvcmtlcnMgPSB0aGlzLndvcmtlclBvb2wuZ2V0KHRva2VuSWQpID8/IFtdO1xuICAgICAgICAgIGNvbnN0IHdvcmtlckluZGV4ID0gdGhpcy5uZXh0QXZhaWxhYmxlV29ya2VySW5kZXgod29ya2Vycyk7XG4gICAgICAgICAgaWYgKHdvcmtlckluZGV4ID49IHRoaXMucG9vbENvbmZpZy5tYXhXb3JrZXJzUGVyVG9rZW4pIHJldHVybiBudWxsO1xuICAgICAgICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IHRoaXMuc3Bhd25TaW5nbGVXb3JrZXIoXG4gICAgICAgICAgICB0b2tlbklkLFxuICAgICAgICAgICAgbWV0YWRhdGEubmFtZSxcbiAgICAgICAgICAgIG1ldGFkYXRhLmNyZWRlbnRpYWxzLFxuICAgICAgICAgICAgd29ya2VySW5kZXgsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIXdvcmtlcikgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICBjb25zdCBjdXJyZW50TWV0YWRhdGEgPSB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KHRva2VuSWQpO1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRXb3JrZXJzID0gdGhpcy53b3JrZXJQb29sLmdldCh0b2tlbklkKTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhY3VycmVudE1ldGFkYXRhPy5hY3RpdmUgfHxcbiAgICAgICAgICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuaGFzKHRva2VuSWQpIHx8XG4gICAgICAgICAgICBjdXJyZW50TWV0YWRhdGEgIT09IG1ldGFkYXRhIHx8XG4gICAgICAgICAgICAhY3VycmVudFdvcmtlcnMgfHxcbiAgICAgICAgICAgIGN1cnJlbnRXb3JrZXJzLnNvbWUoKGVudHJ5KSA9PiBlbnRyeS53b3JrZXJJbmRleCA9PT0gd29ya2VySW5kZXgpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBhd2FpdCB3b3JrZXIua2lsbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50V29ya2Vycy5wdXNoKHdvcmtlcik7XG4gICAgICAgICAgY3VycmVudFdvcmtlcnMuc29ydCgoYSwgYikgPT4gYS53b3JrZXJJbmRleCAtIGIud29ya2VySW5kZXgpO1xuICAgICAgICAgIHJldHVybiB3b3JrZXI7XG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgYWRkZWQgPSBzcGF3bmVkLmZpbHRlcigod29ya2VyKSA9PiB3b3JrZXIgIT09IG51bGwpLmxlbmd0aDtcbiAgICAgIGlmIChhZGRlZCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgYG9wZW5haSBhdXRvc2NhbGUgdXA6ICske2FkZGVkfSB3b3JrZXJzICgke3RoaXMud29ya2VyQ291bnR9IHRvdGFsLCBxdWV1ZSAke3RoaXMucXVldWUubGVuZ3RofSlgLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnJlcXVlc3REcmFpblF1ZXVlKCk7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoXG4gICAgICAgICAgICAoKSA9PiB0aGlzLnJlcXVlc3RBdXRvc2NhbGVFdmFsdWF0aW9uKCksXG4gICAgICAgICAgICBNYXRoLm1pbih0aGlzLnBvb2xDb25maWcuc2NhbGVJbnRlcnZhbE1zLCAxXzAwMCksXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aW1lci51bnJlZj8uKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHNjYWxlRG93bk9uZVN0ZXAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLnBvb2xDb25maWcuYXV0b3NjYWxlIHx8IHRoaXMuc3RvcHBlZCkgcmV0dXJuO1xuICAgIGF3YWl0IHRoaXMucnVuU2NhbGluZyhhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZW1vdmVkOiBDb2RleEFwcFNlcnZlcldvcmtlcltdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHRva2VuSWQgb2YgdGhpcy50b2tlbk1ldGFkYXRhLmtleXMoKSkge1xuICAgICAgICBjb25zdCB3b3JrZXJzID0gdGhpcy53b3JrZXJQb29sLmdldCh0b2tlbklkKSA/PyBbXTtcbiAgICAgICAgaWYgKHdvcmtlcnMubGVuZ3RoIDw9IHRoaXMucG9vbENvbmZpZy5taW5Xb3JrZXJzUGVyVG9rZW4pIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IHdvcmtlciA9IHdvcmtlcnNcbiAgICAgICAgICAudG9Tb3J0ZWQoKGEsIGIpID0+IGIud29ya2VySW5kZXggLSBhLndvcmtlckluZGV4KVxuICAgICAgICAgIC5maW5kKChlbnRyeSkgPT4gZW50cnkuaGFzQ2FwYWNpdHkpO1xuICAgICAgICBpZiAoIXdvcmtlcikgY29udGludWU7XG5cbiAgICAgICAgdGhpcy53b3JrZXJQb29sLnNldChcbiAgICAgICAgICB0b2tlbklkLFxuICAgICAgICAgIHdvcmtlcnMuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkgIT09IHdvcmtlciksXG4gICAgICAgICk7XG4gICAgICAgIHJlbW92ZWQucHVzaCh3b3JrZXIpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVtb3ZlZC5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChyZW1vdmVkLm1hcCgod29ya2VyKSA9PiB3b3JrZXIua2lsbCgpKSk7XG4gICAgICBsb2dnZXIuaW5mbyhgb3BlbmFpIGF1dG9zY2FsZSBkb3duOiAtJHtyZW1vdmVkLmxlbmd0aH0gd29ya2VycyAoJHt0aGlzLndvcmtlckNvdW50fSB0b3RhbClgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbmV4dEF2YWlsYWJsZVdvcmtlckluZGV4KHdvcmtlcnM6IENvZGV4QXBwU2VydmVyV29ya2VyW10pOiBudW1iZXIge1xuICAgIGNvbnN0IHVzZWQgPSBuZXcgU2V0KHdvcmtlcnMubWFwKCh3b3JrZXIpID0+IHdvcmtlci53b3JrZXJJbmRleCkpO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLnBvb2xDb25maWcubWF4V29ya2Vyc1BlclRva2VuOyBpbmRleCsrKSB7XG4gICAgICBpZiAoIXVzZWQuaGFzKGluZGV4KSkgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wb29sQ29uZmlnLm1heFdvcmtlcnNQZXJUb2tlbjtcbiAgfVxuXG4gIHByaXZhdGUgcmVxdWVzdEF1dG9zY2FsZUV2YWx1YXRpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBvb2xDb25maWcuYXV0b3NjYWxlIHx8IHRoaXMuc3RvcHBlZCkgcmV0dXJuO1xuICAgIHZvaWQgdGhpcy5ldmFsdWF0ZUF1dG9zY2FsaW5nKCkuY2F0Y2goKGUpID0+XG4gICAgICBsb2dnZXIud2Fybihgb3BlbmFpIGF1dG9zY2FsZSBldmFsdWF0aW9uIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW5TY2FsaW5nKHRhc2s6ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5zY2FsaW5nUHJvbWlzZSkge1xuICAgICAgYXdhaXQgdGhpcy5zY2FsaW5nUHJvbWlzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2NhbGluZyA9IHRhc2soKS5maW5hbGx5KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnNjYWxpbmdQcm9taXNlID09PSBzY2FsaW5nKSB0aGlzLnNjYWxpbmdQcm9taXNlID0gbnVsbDtcbiAgICB9KTtcbiAgICB0aGlzLnNjYWxpbmdQcm9taXNlID0gc2NhbGluZztcbiAgICBhd2FpdCBzY2FsaW5nO1xuICB9XG5cbiAgLy8g4pSA4pSAIFJhdGUgbGltaXRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHJhdGVMaW1pdHNDYWNoZSA9IG5ldyBNYXA8bnVtYmVyLCBSYXRlTGltaXRzQ2FjaGVFbnRyeT4oKTtcbiAgc3RhdGljIHJlYWRvbmx5IFJBVEVfTElNSVRTX0NBQ0hFX1RUTCA9IDYwXzAwMDtcblxuICBhc3luYyBnZXRSYXRlTGltaXRzQnlUb2tlbklkKHRva2VuSWQ6IG51bWJlcik6IFByb21pc2U8T3BlbkFJUmF0ZUxpbWl0c1dpdGhNZXRhPiB7XG4gICAgY29uc3QgZ2VuZXJhdGlvbiA9IHRoaXMucmF0ZUxpbWl0c0dlbmVyYXRpb25CeVRva2VuLmdldCh0b2tlbklkKSA/PyAwO1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMucmF0ZUxpbWl0c0NhY2hlLmdldCh0b2tlbklkKTtcbiAgICBpZiAoXG4gICAgICBjYWNoZWQgJiZcbiAgICAgIGNhY2hlZC5nZW5lcmF0aW9uID09PSBnZW5lcmF0aW9uICYmXG4gICAgICBEYXRlLm5vdygpIC0gY2FjaGVkLmNhY2hlZEF0IDwgT3BlbkFJRGlzcGF0Y2hlci5SQVRFX0xJTUlUU19DQUNIRV9UVExcbiAgICApIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IGNhY2hlZC5kYXRhLCBjYWNoZWRBdDogY2FjaGVkLmNhY2hlZEF0IH07XG4gICAgfVxuXG4gICAgY29uc3Qgd29ya2VyID0gKHRoaXMud29ya2VyUG9vbC5nZXQodG9rZW5JZCkgPz8gW10pLmZpbmQoKHcpID0+IHcuaXNSZWFkeSk7XG4gICAgaWYgKCF3b3JrZXIpIHRocm93IG5ldyBFcnJvcihcIm5vIHJlYWR5IG9wZW5haSB3b3JrZXJzXCIpO1xuICAgIGNvbnN0IGRhdGEgPSAoYXdhaXQgd29ya2VyLmdldFJhdGVMaW1pdHMoKSkgYXMgR2V0QWNjb3VudFJhdGVMaW1pdHNSZXNwb25zZTtcbiAgICBjb25zdCBlbnRyeTogUmF0ZUxpbWl0c0NhY2hlRW50cnkgPSB7IGRhdGEsIGNhY2hlZEF0OiBEYXRlLm5vdygpLCBnZW5lcmF0aW9uIH07XG4gICAgaWYgKCh0aGlzLnJhdGVMaW1pdHNHZW5lcmF0aW9uQnlUb2tlbi5nZXQodG9rZW5JZCkgPz8gMCkgPT09IGdlbmVyYXRpb24pIHtcbiAgICAgIHRoaXMucmF0ZUxpbWl0c0NhY2hlLnNldCh0b2tlbklkLCBlbnRyeSk7XG4gICAgfVxuICAgIHJldHVybiB7IGRhdGE6IGVudHJ5LmRhdGEsIGNhY2hlZEF0OiBlbnRyeS5jYWNoZWRBdCB9O1xuICB9XG5cbiAgcHJpdmF0ZSByZXF1ZXN0RHJhaW5RdWV1ZSgpOiB2b2lkIHtcbiAgICB2b2lkIHRoaXMuZHJhaW5RdWV1ZSgpLmNhdGNoKChlKSA9PiBsb2dnZXIud2FybihgZHJhaW5RdWV1ZSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbnZhbGlkYXRlUmF0ZUxpbWl0c0NhY2hlKHRva2VuSWQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucmF0ZUxpbWl0c0NhY2hlLmRlbGV0ZSh0b2tlbklkKTtcbiAgICB0aGlzLnJhdGVMaW1pdHNHZW5lcmF0aW9uQnlUb2tlbi5zZXQoXG4gICAgICB0b2tlbklkLFxuICAgICAgKHRoaXMucmF0ZUxpbWl0c0dlbmVyYXRpb25CeVRva2VuLmdldCh0b2tlbklkKSA/PyAwKSArIDEsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0VG9rZW5NZXRhZGF0YShcbiAgICBpZDogbnVtYmVyLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgcXVvdGFUaHJlc2hvbGQ6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsXG4gICAgd2VpZ2h0OiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIHRoaXMudG9rZW5NZXRhZGF0YS5zZXQoaWQsIHtcbiAgICAgIG5hbWUsXG4gICAgICBjcmVkZW50aWFscyxcbiAgICAgIHF1b3RhVGhyZXNob2xkLFxuICAgICAgd2VpZ2h0LFxuICAgICAgYWN0aXZlOiB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KGlkKT8uYWN0aXZlID8/IHRydWUsXG4gICAgfSk7XG4gICAgdGhpcy53ZWlnaHRlZFNlbGVjdG9yLnNldFRva2VuKGlkLCB3ZWlnaHQpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRRdW90YVRocmVzaG9sZCh0b2tlbklkOiBudW1iZXIpOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbk1ldGFkYXRhLmdldCh0b2tlbklkKT8ucXVvdGFUaHJlc2hvbGQ7XG4gIH1cblxuICBwcml2YXRlIGhhc1F1b3RhVGhyZXNob2xkKHRva2VuSWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRocmVzaG9sZCA9IHRoaXMuZ2V0UXVvdGFUaHJlc2hvbGQodG9rZW5JZCk7XG4gICAgcmV0dXJuIHRocmVzaG9sZCAhPT0gdW5kZWZpbmVkICYmIHRocmVzaG9sZCAhPT0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZVRva2VuRWxpZ2liaWxpdHkoZXhjbHVkZWRUb2tlbklkczogU2V0PG51bWJlcj4pOiBQcm9taXNlPFRva2VuRWxpZ2liaWxpdHk+IHtcbiAgICBjb25zdCB3b3JrZXJzID0gdGhpcy5nZXRBbGxSZWFkeUFjdGl2ZVdvcmtlcnMoKTtcbiAgICBjb25zdCBieVRva2VuID0gbmV3IE1hcDxudW1iZXIsIHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHdvcmtlciBvZiB3b3JrZXJzKSB7XG4gICAgICBpZiAoIWJ5VG9rZW4uaGFzKHdvcmtlci50b2tlbklkKSkgYnlUb2tlbi5zZXQod29ya2VyLnRva2VuSWQsIHdvcmtlci50b2tlbk5hbWUpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlYWR5QWN0aXZlVG9rZW5JZHMgPSBuZXcgU2V0KGJ5VG9rZW4ua2V5cygpKTtcbiAgICBjb25zdCBlbGlnaWJsZVRva2VuSWRzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgY29uc3Qgb3ZlclRocmVzaG9sZFRva2VuczogQXJyYXk8eyB0b2tlbk5hbWU6IHN0cmluZzsgdGhyZXNob2xkOiBudW1iZXIgfT4gPSBbXTtcbiAgICBsZXQgdGhyZXNob2xkZWRUb2tlbkNvdW50ID0gMDtcblxuICAgIGNvbnN0IGVudHJpZXMgPSBBcnJheS5mcm9tKGJ5VG9rZW4uZW50cmllcygpKTtcbiAgICBjb25zdCBjaGVja3MgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICBlbnRyaWVzLm1hcChhc3luYyAoW3Rva2VuSWQsIHRva2VuTmFtZV0pID0+IHtcbiAgICAgICAgaWYgKGV4Y2x1ZGVkVG9rZW5JZHMuaGFzKHRva2VuSWQpKSB7XG4gICAgICAgICAgdGhyZXNob2xkZWRUb2tlbkNvdW50Kys7XG4gICAgICAgICAgcmV0dXJuIHsgdG9rZW5JZCwgdG9rZW5OYW1lLCBlbGlnaWJsZTogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuaGFzUXVvdGFUaHJlc2hvbGQodG9rZW5JZCkpIHtcbiAgICAgICAgICByZXR1cm4geyB0b2tlbklkLCB0b2tlbk5hbWUsIGVsaWdpYmxlOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhyZXNob2xkZWRUb2tlbkNvdW50Kys7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdG9rZW5JZCxcbiAgICAgICAgICB0b2tlbk5hbWUsXG4gICAgICAgICAgZWxpZ2libGU6IGF3YWl0IHRoaXMuaXNUb2tlblF1b3RhRWxpZ2libGUodG9rZW5JZCwgdG9rZW5OYW1lKSxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBjaGVja3MuZm9yRWFjaCgoY2hlY2ssIGluZGV4KSA9PiB7XG4gICAgICBpZiAoY2hlY2suc3RhdHVzID09PSBcImZ1bGZpbGxlZFwiKSB7XG4gICAgICAgIGlmIChjaGVjay52YWx1ZS5lbGlnaWJsZSkge1xuICAgICAgICAgIGVsaWdpYmxlVG9rZW5JZHMuYWRkKGNoZWNrLnZhbHVlLnRva2VuSWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHRocmVzaG9sZCA9IHRoaXMuZ2V0UXVvdGFUaHJlc2hvbGQoY2hlY2sudmFsdWUudG9rZW5JZCk7XG4gICAgICAgICAgaWYgKHRocmVzaG9sZCAhPT0gdW5kZWZpbmVkICYmIHRocmVzaG9sZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgb3ZlclRocmVzaG9sZFRva2Vucy5wdXNoKHsgdG9rZW5OYW1lOiBjaGVjay52YWx1ZS50b2tlbk5hbWUsIHRocmVzaG9sZCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgIGNvbnN0IFt0b2tlbklkLCB0b2tlbk5hbWVdID0gZW50cnk7XG4gICAgICAgIHRoaXMubG9nUXVvdGFMb29rdXBGYWlsT3Blbih0b2tlbklkLCB0b2tlbk5hbWUsIFN0cmluZyhjaGVjay5yZWFzb24pKTtcbiAgICAgICAgZWxpZ2libGVUb2tlbklkcy5hZGQodG9rZW5JZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4geyByZWFkeUFjdGl2ZVRva2VuSWRzLCBlbGlnaWJsZVRva2VuSWRzLCBvdmVyVGhyZXNob2xkVG9rZW5zLCB0aHJlc2hvbGRlZFRva2VuQ291bnQgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaXNUb2tlblF1b3RhRWxpZ2libGUoXG4gICAgdG9rZW5JZDogbnVtYmVyLFxuICAgIHRva2VuTmFtZTogc3RyaW5nLFxuICAgIGV4Y2x1ZGVkVG9rZW5JZHM/OiBTZXQ8bnVtYmVyPixcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgZm9yICg7Oykge1xuICAgICAgY29uc3QgdG9rZW5NZXRhZGF0YSA9IHRoaXMudG9rZW5NZXRhZGF0YS5nZXQodG9rZW5JZCk7XG4gICAgICBjb25zdCB0aHJlc2hvbGQgPSB0b2tlbk1ldGFkYXRhPy5xdW90YVRocmVzaG9sZDtcbiAgICAgIGlmICghdG9rZW5NZXRhZGF0YT8uYWN0aXZlIHx8IHRocmVzaG9sZCA9PT0gdW5kZWZpbmVkIHx8IHRocmVzaG9sZCA9PT0gbnVsbCkge1xuICAgICAgICB0aGlzLnF1b3RhQmxvY2tlZFRva2VuSWRzLmRlbGV0ZSh0b2tlbklkKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGxldCByZXN1bHQ6IE9wZW5BSVF1b3RhVXNhZ2VSZXN1bHQ7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCByZWFkT3BlbkFJUXVvdGFVc2FnZSgoKSA9PiB0aGlzLmdldFJhdGVMaW1pdHNCeVRva2VuSWQodG9rZW5JZCkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAodGhpcy50b2tlbk1ldGFkYXRhLmdldCh0b2tlbklkKSAhPT0gdG9rZW5NZXRhZGF0YSkgY29udGludWU7XG4gICAgICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuZGVsZXRlKHRva2VuSWQpO1xuICAgICAgICB0aGlzLmxvZ1F1b3RhTG9va3VwRmFpbE9wZW4odG9rZW5JZCwgdG9rZW5NZXRhZGF0YS5uYW1lID8/IHRva2VuTmFtZSwgKGUgYXMgRXJyb3IpLm1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMudG9rZW5NZXRhZGF0YS5nZXQodG9rZW5JZCkgIT09IHRva2VuTWV0YWRhdGEpIGNvbnRpbnVlO1xuXG4gICAgICBpZiAocmVzdWx0LmtpbmQgPT09IFwibG9va3VwX2ZhaWxlZFwiKSB7XG4gICAgICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuZGVsZXRlKHRva2VuSWQpO1xuICAgICAgICB0aGlzLmxvZ1F1b3RhTG9va3VwRmFpbE9wZW4odG9rZW5JZCwgdG9rZW5NZXRhZGF0YS5uYW1lID8/IHRva2VuTmFtZSwgcmVzdWx0LnJlYXNvbik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzdWx0LnV0aWxpemF0aW9uUGN0ID49IHRocmVzaG9sZCkge1xuICAgICAgICBjb25zdCB0cmFuc2l0aW9uZWQgPSAhdGhpcy5xdW90YUJsb2NrZWRUb2tlbklkcy5oYXModG9rZW5JZCk7XG4gICAgICAgIHRoaXMucXVvdGFCbG9ja2VkVG9rZW5JZHMuYWRkKHRva2VuSWQpO1xuICAgICAgICBpZiAodHJhbnNpdGlvbmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2dRdW90YU92ZXJUaHJlc2hvbGQodG9rZW5JZCwgdG9rZW5NZXRhZGF0YS5uYW1lID8/IHRva2VuTmFtZSwgdGhyZXNob2xkLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIGV4Y2x1ZGVkVG9rZW5JZHM/LmFkZCh0b2tlbklkKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5xdW90YUJsb2NrZWRUb2tlbklkcy5kZWxldGUodG9rZW5JZCkpIHtcbiAgICAgICAgdGhpcy5sb2dRdW90YVJlY292ZXJlZCh0b2tlbklkLCB0b2tlbk1ldGFkYXRhLm5hbWUgPz8gdG9rZW5OYW1lLCB0aHJlc2hvbGQsIHJlc3VsdCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGxvZ1F1b3RhT3ZlclRocmVzaG9sZChcbiAgICB0b2tlbklkOiBudW1iZXIsXG4gICAgdG9rZW5OYW1lOiBzdHJpbmcsXG4gICAgdGhyZXNob2xkOiBudW1iZXIsXG4gICAgcmVzdWx0OiBFeHRyYWN0PE9wZW5BSVF1b3RhVXNhZ2VSZXN1bHQsIHsga2luZDogXCJva1wiIH0+LFxuICApOiB2b2lkIHtcbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIGBxdW90YV90aHJlc2hvbGQgZ2F0ZTogb3Zlcl90aHJlc2hvbGQgJHt0b2tlbk5hbWV9WyR7dG9rZW5JZH1dICgke3Jlc3VsdC51dGlsaXphdGlvblBjdH0lID49ICR7dGhyZXNob2xkfSUpYCxcbiAgICAgIHtcbiAgICAgICAgdG9rZW5JZCxcbiAgICAgICAgdG9rZW5OYW1lLFxuICAgICAgICBwcm92aWRlcjogXCJvcGVuYWlcIixcbiAgICAgICAgdGhyZXNob2xkLFxuICAgICAgICBjYWNoZWRVdGlsaXphdGlvbjogcmVzdWx0LnV0aWxpemF0aW9uUGN0LFxuICAgICAgICBjYWNoZUFnZTogcmVzdWx0LmNhY2hlQWdlTXMsXG4gICAgICAgIHdpbmRvd0R1cmF0aW9uTWluczogcmVzdWx0LndpbmRvd0R1cmF0aW9uTWlucyxcbiAgICAgICAgcmVzZXRzQXQ6IHJlc3VsdC5yZXNldHNBdCxcbiAgICAgICAgbGltaXRJZDogcmVzdWx0LmxpbWl0SWQsXG4gICAgICAgIHJlYXNvbjogXCJvdmVyX3RocmVzaG9sZFwiLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2dRdW90YVJlY292ZXJlZChcbiAgICB0b2tlbklkOiBudW1iZXIsXG4gICAgdG9rZW5OYW1lOiBzdHJpbmcsXG4gICAgdGhyZXNob2xkOiBudW1iZXIsXG4gICAgcmVzdWx0OiBFeHRyYWN0PE9wZW5BSVF1b3RhVXNhZ2VSZXN1bHQsIHsga2luZDogXCJva1wiIH0+LFxuICApOiB2b2lkIHtcbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIGBxdW90YV90aHJlc2hvbGQgZ2F0ZTogcmVjb3ZlcmVkICR7dG9rZW5OYW1lfVske3Rva2VuSWR9XSAoJHtyZXN1bHQudXRpbGl6YXRpb25QY3R9JSA8ICR7dGhyZXNob2xkfSUpYCxcbiAgICAgIHtcbiAgICAgICAgdG9rZW5JZCxcbiAgICAgICAgdG9rZW5OYW1lLFxuICAgICAgICBwcm92aWRlcjogXCJvcGVuYWlcIixcbiAgICAgICAgdGhyZXNob2xkLFxuICAgICAgICBjYWNoZWRVdGlsaXphdGlvbjogcmVzdWx0LnV0aWxpemF0aW9uUGN0LFxuICAgICAgICBjYWNoZUFnZTogcmVzdWx0LmNhY2hlQWdlTXMsXG4gICAgICAgIHdpbmRvd0R1cmF0aW9uTWluczogcmVzdWx0LndpbmRvd0R1cmF0aW9uTWlucyxcbiAgICAgICAgcmVzZXRzQXQ6IHJlc3VsdC5yZXNldHNBdCxcbiAgICAgICAgbGltaXRJZDogcmVzdWx0LmxpbWl0SWQsXG4gICAgICAgIHJlYXNvbjogXCJyZWNvdmVyZWRcIixcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nUXVvdGFMb29rdXBGYWlsT3Blbih0b2tlbklkOiBudW1iZXIsIHRva2VuTmFtZTogc3RyaW5nLCByZWFzb246IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHRocmVzaG9sZCA9IHRoaXMuZ2V0UXVvdGFUaHJlc2hvbGQodG9rZW5JZCk7XG4gICAgbG9nZ2VyLndhcm4oXCJxdW90YV90aHJlc2hvbGQgZ2F0ZTogbG9va3VwX2ZhaWxfb3BlblwiLCB7XG4gICAgICB0b2tlbklkLFxuICAgICAgdG9rZW5OYW1lLFxuICAgICAgcHJvdmlkZXI6IFwib3BlbmFpXCIsXG4gICAgICB0aHJlc2hvbGQsXG4gICAgICByZWFzb246IFwibG9va3VwX2ZhaWxfb3BlblwiLFxuICAgICAgbG9va3VwUmVhc29uOiByZWFzb24sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHRocm93UXVvdGFUaHJlc2hvbGRFeGNlZWRlZChlbGlnaWJpbGl0eTogVG9rZW5FbGlnaWJpbGl0eSk6IG5ldmVyIHtcbiAgICBsb2dnZXIud2FybihcInF1b3RhX3RocmVzaG9sZCBnYXRlOiBhbGxfZXhjZWVkZWRcIiwge1xuICAgICAgcHJvdmlkZXI6IFwib3BlbmFpXCIsXG4gICAgICB0b2tlbkNvdW50OiBlbGlnaWJpbGl0eS5yZWFkeUFjdGl2ZVRva2VuSWRzLnNpemUsXG4gICAgICB0aHJlc2hvbGRlZFRva2VuQ291bnQ6IGVsaWdpYmlsaXR5LnRocmVzaG9sZGVkVG9rZW5Db3VudCxcbiAgICAgIG92ZXJUaHJlc2hvbGRUb2tlbnM6IGVsaWdpYmlsaXR5Lm92ZXJUaHJlc2hvbGRUb2tlbnMsXG4gICAgICByZWFzb246IFwiYWxsX2V4Y2VlZGVkXCIsXG4gICAgfSk7XG4gICAgdGhyb3cgbmV3IFF1b3RhVGhyZXNob2xkRXhjZWVkZWRFcnJvcihcbiAgICAgIHF1b3RhVGhyZXNob2xkRXhjZWVkZWRNZXNzYWdlKFwib3BlbmFpXCIsIGVsaWdpYmlsaXR5Lm92ZXJUaHJlc2hvbGRUb2tlbnMpLFxuICAgICk7XG4gIH1cblxuICAvLyDilIDilIAgQnJvd3NlciBsb2dpbiBmbG93IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHBlbmRpbmdMb2dpbjoge1xuICAgIHdvcmtlcjogQ29kZXhBcHBTZXJ2ZXJXb3JrZXI7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgfSB8IG51bGwgPSBudWxsO1xuXG4gIGFzeW5jIHN0YXJ0QnJvd3NlckxvZ2luKG5hbWU6IHN0cmluZyk6IFByb21pc2U8eyBhdXRoVXJsOiBzdHJpbmcgfT4ge1xuICAgIGlmICh0aGlzLnBlbmRpbmdMb2dpbikge1xuICAgICAgdGhpcy5wZW5kaW5nTG9naW4ud29ya2VyLmtpbGwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5wZW5kaW5nTG9naW4udGltZXIpO1xuICAgICAgdGhpcy5wZW5kaW5nTG9naW4gPSBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBJZCA9IERhdGUubm93KCk7XG4gICAgY29uc3Qgd29ya2VyID0gbmV3IENvZGV4QXBwU2VydmVyV29ya2VyKHtcbiAgICAgIHRva2VuSWQ6IHRlbXBJZCxcbiAgICAgIHRva2VuTmFtZTogbmFtZSxcbiAgICAgIGFjY2Vzc1Rva2VuOiBcIlwiLFxuICAgICAgYWNjb3VudElkOiBcIlwiLFxuICAgIH0pO1xuXG4gICAgY29uc3QgYXV0aFVybCA9IGF3YWl0IHdvcmtlci5zdGFydEJyb3dzZXJMb2dpbigpO1xuXG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnBlbmRpbmdMb2dpbj8ud29ya2VyID09PSB3b3JrZXIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYGJyb3dzZXIgbG9naW4gdGltZW91dCBmb3IgJHtuYW1lfSwga2lsbGluZyB3b3JrZXJgKTtcbiAgICAgICAgd29ya2VyLmtpbGwoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgIHRoaXMucGVuZGluZ0xvZ2luID0gbnVsbDtcbiAgICAgIH1cbiAgICB9LCAzMDBfMDAwKTtcblxuICAgIHRoaXMucGVuZGluZ0xvZ2luID0geyB3b3JrZXIsIG5hbWUsIHRpbWVyIH07XG4gICAgcmV0dXJuIHsgYXV0aFVybCB9O1xuICB9XG5cbiAgZ2V0IHBlbmRpbmdMb2dpbk5hbWUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucGVuZGluZ0xvZ2luPy5uYW1lID8/IG51bGw7XG4gIH1cblxuICBhc3luYyBjb21wbGV0ZUJyb3dzZXJMb2dpbigpOiBQcm9taXNlPHtcbiAgICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xuICAgIGlkVG9rZW4/OiBzdHJpbmc7XG4gICAgYWNjb3VudElkOiBzdHJpbmc7XG4gIH0+IHtcbiAgICBpZiAoIXRoaXMucGVuZGluZ0xvZ2luKSB0aHJvdyBuZXcgRXJyb3IoXCJubyBwZW5kaW5nIGxvZ2luXCIpO1xuICAgIGNvbnN0IHsgd29ya2VyLCB0aW1lciB9ID0gdGhpcy5wZW5kaW5nTG9naW47XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd29ya2VyLndhaXRGb3JCcm93c2VyTG9naW5Db21wbGV0ZSgpO1xuICAgICAgY29uc3QgY3JlZHMgPSBhd2FpdCB3b3JrZXIucmVhZE1hbmFnZWRDcmVkZW50aWFscygpO1xuICAgICAgaWYgKCFjcmVkcykgdGhyb3cgbmV3IEVycm9yKFwiZmFpbGVkIHRvIHJlYWQgY3JlZGVudGlhbHMgYWZ0ZXIgbG9naW5cIik7XG4gICAgICByZXR1cm4gY3JlZHM7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB0aGlzLnBlbmRpbmdMb2dpbiA9IG51bGw7XG4gICAgICBhd2FpdCB3b3JrZXIua2lsbCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgU3RhdHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZ2V0IHdvcmtlckNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIFsuLi50aGlzLndvcmtlclBvb2wudmFsdWVzKCldLmZsYXQoKS5sZW5ndGg7XG4gIH1cblxuICBnZXQgcmVhZHlXb3JrZXJDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiBbLi4udGhpcy53b3JrZXJQb29sLnZhbHVlcygpXS5mbGF0KCkuZmlsdGVyKCh3KSA9PiB3LmlzUmVhZHkpLmxlbmd0aDtcbiAgfVxuXG4gIGdldCBxdWV1ZUxlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnF1ZXVlLmxlbmd0aDtcbiAgfVxuXG4gIC8vIE1vbml0IO2RnOyLnOyaqSDigJQg7Yag7YGw67OEIO2YhOyerCDsm4zsu6Qg7IiYIOyKpOuDheyDtyAo7J2066aE7IicIOygleugrClcbiAgZ2V0IHdvcmtlckNvdW50c0J5VG9rZW4oKTogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGNvdW50OiBudW1iZXIgfT4ge1xuICAgIHJldHVybiBbLi4udGhpcy53b3JrZXJQb29sLmVudHJpZXMoKV1cbiAgICAgIC5tYXAoKFt0b2tlbklkLCB3b3JrZXJzXSkgPT4gKHtcbiAgICAgICAgbmFtZTogd29ya2Vyc1swXT8udG9rZW5OYW1lID8/IGB0b2tlbiAke3Rva2VuSWR9YCxcbiAgICAgICAgY291bnQ6IHdvcmtlcnMubGVuZ3RoLFxuICAgICAgfSkpXG4gICAgICAuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkuY291bnQgPiAwKVxuICAgICAgLnRvU29ydGVkKChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQ0EsTUFBTSxTQUFTLFVBQVUsQ0FBQyxTQUFTLG1CQUFtQixDQUFDO0FBUXZELElBQWEsdUJBQWIsY0FBMEMsTUFBTTtDQUVuQztDQURYLFlBQ0UsTUFDQSxTQUNBO0VBQ0EsTUFBTSxPQUFPO0VBSEosS0FBQSxPQUFBO0VBSVQsS0FBSyxPQUFPO0NBQ2Q7QUFDRjtBQUVBLE1BQU0saUJBQWlCO0FBQ3ZCLE1BQWEsK0JBQStCO0FBQzVDLE1BQU0sdUNBQXVDO0FBQzdDLE1BQU0sdUNBQXVDO0FBQzdDLE1BQU0sbUJBQW1CO0FBQ3pCLE1BQU0saUJBQWlCO0FBQ3ZCLE1BQU0sb0JBQW9CO0FBRTFCLE1BQWEsNkJBQTZCO0FBQzFDLE1BQWEsd0JBQXdCO0FBWXJDLFNBQVMsZUFDUCxPQUNBLFVBQ0EsS0FDQSxLQUNRO0NBQ1IsTUFBTSxTQUFTLE9BQU8sS0FBSztDQUMzQixJQUFJLENBQUMsT0FBTyxTQUFTLE1BQU0sR0FBRyxPQUFPO0NBQ3JDLE9BQU8sS0FBSyxJQUFJLEtBQUssS0FBSyxJQUFJLEtBQUssTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDO0FBQ3hEO0FBRUEsU0FBUyxjQUFjLE9BQTJCLFVBQWtCLEtB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