@nlabs/reaktor 1.9.0 → 1.9.1

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 (301) hide show
  1. package/README.md +58 -72
  2. package/docs/GENERATION.md +63 -0
  3. package/lib/actions/analytics.js +1 -1
  4. package/lib/actions/apps.d.ts +2 -2
  5. package/lib/actions/apps.js +1 -1
  6. package/lib/actions/connections.js +1 -1
  7. package/lib/actions/content.js +1 -1
  8. package/lib/actions/contentGeneration.d.ts +40 -0
  9. package/lib/actions/contentGeneration.js +206 -0
  10. package/lib/actions/conversations.js +1 -1
  11. package/lib/actions/crm.js +1 -1
  12. package/lib/actions/crud.d.ts +2 -2
  13. package/lib/actions/crud.js +1 -1
  14. package/lib/actions/dynamodb.js +1 -1
  15. package/lib/actions/email.js +1 -1
  16. package/lib/actions/files.d.ts +42 -4
  17. package/lib/actions/files.js +1 -1
  18. package/lib/actions/flags.js +1 -1
  19. package/lib/actions/geminiVideo.d.ts +19 -0
  20. package/lib/actions/geminiVideo.js +161 -0
  21. package/lib/actions/groups.js +1 -1
  22. package/lib/actions/higgsfield.d.ts +20 -0
  23. package/lib/actions/higgsfield.js +148 -0
  24. package/lib/actions/imageGeneration.d.ts +37 -0
  25. package/lib/actions/imageGeneration.js +121 -0
  26. package/lib/actions/images.js +1 -1
  27. package/lib/actions/index.d.ts +5 -0
  28. package/lib/actions/index.js +6 -1
  29. package/lib/actions/ios.js +1 -1
  30. package/lib/actions/locations.js +1 -1
  31. package/lib/actions/messages.js +1 -1
  32. package/lib/actions/notifications.js +1 -1
  33. package/lib/actions/payments.js +27 -26
  34. package/lib/actions/personas.d.ts +4 -4
  35. package/lib/actions/personas.js +1 -1
  36. package/lib/actions/posts.js +1 -1
  37. package/lib/actions/query.js +1 -1
  38. package/lib/actions/reactions.d.ts +6 -6
  39. package/lib/actions/reactions.js +1 -1
  40. package/lib/actions/rum.js +1 -1
  41. package/lib/actions/s3.d.ts +4 -4
  42. package/lib/actions/s3.js +22 -6
  43. package/lib/actions/search.js +1 -1
  44. package/lib/actions/sms.js +1 -1
  45. package/lib/actions/statistics.js +1 -1
  46. package/lib/actions/subscriptions.js +1 -1
  47. package/lib/actions/tags.d.ts +2 -2
  48. package/lib/actions/tags.js +1 -1
  49. package/lib/actions/users.d.ts +2 -2
  50. package/lib/actions/users.js +1 -1
  51. package/lib/actions/videoGeneration.d.ts +20 -0
  52. package/lib/actions/videoGeneration.js +32 -0
  53. package/lib/actions/videos.js +1 -1
  54. package/lib/adapters/arangoAdapter.js +1 -1
  55. package/lib/adapters/contentAdapter.js +1 -1
  56. package/lib/adapters/fileAdapter.js +1 -1
  57. package/lib/adapters/geminiGenerationAdapter.d.ts +34 -0
  58. package/lib/adapters/geminiGenerationAdapter.js +41 -0
  59. package/lib/adapters/higgsfieldAdapter.d.ts +120 -0
  60. package/lib/adapters/higgsfieldAdapter.js +131 -0
  61. package/lib/adapters/imageAdapter.js +1 -1
  62. package/lib/adapters/imageGenerationAdapter.d.ts +17 -0
  63. package/lib/adapters/imageGenerationAdapter.js +18 -0
  64. package/lib/adapters/index.d.ts +3 -0
  65. package/lib/adapters/index.js +4 -1
  66. package/lib/adapters/messageAdapter.js +1 -1
  67. package/lib/adapters/postAdapter.js +1 -1
  68. package/lib/adapters/reaktorAdapter.js +1 -1
  69. package/lib/adapters/tagAdapter.js +1 -1
  70. package/lib/adapters/userAdapter.d.ts +76 -1
  71. package/lib/adapters/userAdapter.js +1 -1
  72. package/lib/config.d.ts +19 -14
  73. package/lib/config.js +9 -1
  74. package/lib/constants/collections.js +1 -1
  75. package/lib/handlers/graphqlHandler.js +1 -1
  76. package/lib/index.d.ts +1 -1
  77. package/lib/index.js +2 -2
  78. package/lib/lambdas/actions/websockets.d.ts +5 -0
  79. package/lib/lambdas/actions/websockets.js +16 -1
  80. package/lib/lambdas/authorizer.js +1 -1
  81. package/lib/lambdas/connection.d.ts +2 -2
  82. package/lib/lambdas/connection.js +1 -1
  83. package/lib/lambdas/utils/message.js +1 -1
  84. package/lib/lambdas/utils/websocket.d.ts +4 -4
  85. package/lib/lambdas/utils/websocket.js +1 -1
  86. package/lib/mocks/conversation.js +1 -1
  87. package/lib/mocks/file.js +1 -1
  88. package/lib/mocks/group.js +1 -1
  89. package/lib/mocks/image.js +1 -1
  90. package/lib/mocks/post.js +1 -1
  91. package/lib/mocks/tag.js +1 -1
  92. package/lib/mocks/user.js +1 -1
  93. package/lib/mocks/video.js +1 -1
  94. package/lib/mutations/analytics/analytics.js +1 -1
  95. package/lib/mutations/content/content.js +15 -1
  96. package/lib/mutations/crm/crm.js +1 -1
  97. package/lib/mutations/events/events.js +1 -1
  98. package/lib/mutations/flags/flags.js +1 -1
  99. package/lib/mutations/groups/groups.js +1 -1
  100. package/lib/mutations/higgsfield/higgsfield.d.ts +1 -0
  101. package/lib/mutations/higgsfield/higgsfield.js +62 -0
  102. package/lib/mutations/images/images.js +10 -1
  103. package/lib/mutations/index.d.ts +2 -1
  104. package/lib/mutations/index.js +11 -2
  105. package/lib/mutations/locations/locations.js +1 -1
  106. package/lib/mutations/messages/messages.js +1 -1
  107. package/lib/mutations/personas/personas.js +1 -1
  108. package/lib/mutations/posts/posts.js +1 -1
  109. package/lib/mutations/reactions/reactions.js +1 -1
  110. package/lib/mutations/rum/rum.js +1 -1
  111. package/lib/mutations/statistics/statistics.js +1 -1
  112. package/lib/mutations/subscriptions/subscriptions.js +1 -1
  113. package/lib/mutations/tags/tags.js +1 -1
  114. package/lib/mutations/users/users.js +1 -1
  115. package/lib/mutations/videos/videos.js +24 -10
  116. package/lib/objectTypes/analytics.js +1 -1
  117. package/lib/objectTypes/app.js +1 -1
  118. package/lib/objectTypes/bankAccount.js +1 -1
  119. package/lib/objectTypes/connection.js +1 -1
  120. package/lib/objectTypes/content.js +1 -1
  121. package/lib/objectTypes/contentGeneration.d.ts +2 -0
  122. package/lib/objectTypes/contentGeneration.js +30 -0
  123. package/lib/objectTypes/conversation.js +1 -1
  124. package/lib/objectTypes/creditCard.js +1 -1
  125. package/lib/objectTypes/crm.js +1 -1
  126. package/lib/objectTypes/document.js +1 -1
  127. package/lib/objectTypes/error.js +1 -1
  128. package/lib/objectTypes/event.js +1 -1
  129. package/lib/objectTypes/external.js +1 -1
  130. package/lib/objectTypes/file.js +1 -1
  131. package/lib/objectTypes/filter.js +1 -1
  132. package/lib/objectTypes/flag.js +1 -1
  133. package/lib/objectTypes/group.js +1 -1
  134. package/lib/objectTypes/higgsfield.d.ts +5 -0
  135. package/lib/objectTypes/higgsfield.js +149 -0
  136. package/lib/objectTypes/iapSubscription.js +1 -1
  137. package/lib/objectTypes/image.js +1 -1
  138. package/lib/objectTypes/imageGeneration.d.ts +2 -0
  139. package/lib/objectTypes/imageGeneration.js +33 -0
  140. package/lib/objectTypes/index.d.ts +2 -0
  141. package/lib/objectTypes/index.js +3 -1
  142. package/lib/objectTypes/location.js +1 -1
  143. package/lib/objectTypes/message.js +1 -1
  144. package/lib/objectTypes/passcode.js +1 -1
  145. package/lib/objectTypes/persona.d.ts +37 -2
  146. package/lib/objectTypes/persona.js +1 -1
  147. package/lib/objectTypes/plan.js +1 -1
  148. package/lib/objectTypes/post.js +1 -1
  149. package/lib/objectTypes/query.js +1 -1
  150. package/lib/objectTypes/reaction.js +1 -1
  151. package/lib/objectTypes/relation.js +1 -1
  152. package/lib/objectTypes/rum.js +1 -1
  153. package/lib/objectTypes/search.js +1 -1
  154. package/lib/objectTypes/statistics.js +1 -1
  155. package/lib/objectTypes/subscription.js +1 -1
  156. package/lib/objectTypes/tag.js +1 -1
  157. package/lib/objectTypes/user.js +1 -1
  158. package/lib/objectTypes/video.js +1 -1
  159. package/lib/objectTypes/videoGeneration.d.ts +2 -0
  160. package/lib/objectTypes/videoGeneration.js +31 -0
  161. package/lib/queries/analytics/analytics.js +1 -1
  162. package/lib/queries/content/content.js +1 -1
  163. package/lib/queries/crm/crm.js +1 -1
  164. package/lib/queries/events/events.js +1 -1
  165. package/lib/queries/flags/flags.js +1 -1
  166. package/lib/queries/groups/groups.js +1 -1
  167. package/lib/queries/higgsfield/higgsfield.d.ts +1 -0
  168. package/lib/queries/higgsfield/higgsfield.js +22 -0
  169. package/lib/queries/images/images.js +1 -1
  170. package/lib/queries/index.d.ts +2 -1
  171. package/lib/queries/index.js +7 -2
  172. package/lib/queries/locations/locations.js +1 -1
  173. package/lib/queries/messages/messages.js +1 -1
  174. package/lib/queries/personas/personas.js +1 -1
  175. package/lib/queries/posts/posts.js +1 -1
  176. package/lib/queries/query/query.js +1 -1
  177. package/lib/queries/reactions/reactions.js +1 -1
  178. package/lib/queries/statistics/statistics.js +1 -1
  179. package/lib/queries/subscriptions/subscriptions.js +1 -1
  180. package/lib/queries/tags/tags.js +1 -1
  181. package/lib/queries/users/users.js +1 -1
  182. package/lib/queries/videos/videos.js +1 -1
  183. package/lib/templates/email/layout.js +1 -1
  184. package/lib/templates/email/passwordForgot.js +1 -1
  185. package/lib/templates/email/passwordRecovery.js +1 -1
  186. package/lib/templates/email/verifyEmail.js +1 -1
  187. package/lib/templates/email/welcome.js +1 -1
  188. package/lib/templates/sms/passwordForgot.js +1 -1
  189. package/lib/templates/sms/passwordRecovery.js +1 -1
  190. package/lib/templates/sms/verifyEmail.js +1 -1
  191. package/lib/templates/sms/verifyPhone.js +1 -1
  192. package/lib/templates/sms/welcome.js +1 -1
  193. package/lib/types/analytics.types.d.ts +16 -16
  194. package/lib/types/analytics.types.js +1 -1
  195. package/lib/types/apps.types.d.ts +4 -4
  196. package/lib/types/apps.types.js +1 -1
  197. package/lib/types/arangodb.types.d.ts +20 -20
  198. package/lib/types/arangodb.types.js +1 -1
  199. package/lib/types/auth.types.js +1 -1
  200. package/lib/types/connections.types.d.ts +2 -2
  201. package/lib/types/connections.types.js +1 -1
  202. package/lib/types/content.types.d.ts +6 -6
  203. package/lib/types/content.types.js +1 -1
  204. package/lib/types/conversations.types.d.ts +2 -2
  205. package/lib/types/conversations.types.js +1 -1
  206. package/lib/types/crm.types.d.ts +30 -30
  207. package/lib/types/crm.types.js +1 -1
  208. package/lib/types/email.types.d.ts +2 -2
  209. package/lib/types/email.types.js +1 -1
  210. package/lib/types/error.types.d.ts +1 -0
  211. package/lib/types/error.types.js +2 -1
  212. package/lib/types/files.types.d.ts +2 -2
  213. package/lib/types/files.types.js +1 -1
  214. package/lib/types/flags.types.d.ts +8 -8
  215. package/lib/types/flags.types.js +1 -1
  216. package/lib/types/google.types.js +1 -1
  217. package/lib/types/groups.types.d.ts +2 -2
  218. package/lib/types/groups.types.js +1 -1
  219. package/lib/types/images.types.d.ts +2 -2
  220. package/lib/types/images.types.js +1 -1
  221. package/lib/types/index.js +1 -1
  222. package/lib/types/locations.types.d.ts +2 -2
  223. package/lib/types/locations.types.js +1 -1
  224. package/lib/types/messages.types.d.ts +2 -2
  225. package/lib/types/messages.types.js +1 -1
  226. package/lib/types/notifications.types.js +1 -1
  227. package/lib/types/payments.types.d.ts +14 -14
  228. package/lib/types/payments.types.js +1 -1
  229. package/lib/types/personas.types.d.ts +2 -2
  230. package/lib/types/personas.types.js +1 -1
  231. package/lib/types/posts.types.d.ts +2 -2
  232. package/lib/types/posts.types.js +1 -1
  233. package/lib/types/rum.types.d.ts +6 -6
  234. package/lib/types/rum.types.js +1 -1
  235. package/lib/types/statistics.types.js +1 -1
  236. package/lib/types/tags.types.d.ts +4 -4
  237. package/lib/types/tags.types.js +1 -1
  238. package/lib/types/users.types.d.ts +2 -2
  239. package/lib/types/users.types.js +1 -1
  240. package/lib/types/videos.types.d.ts +2 -2
  241. package/lib/types/videos.types.js +1 -1
  242. package/lib/types/websockets.types.d.ts +4 -4
  243. package/lib/types/websockets.types.js +1 -1
  244. package/lib/upload.js +1 -1
  245. package/lib/utils/adapterUtils.js +1 -1
  246. package/lib/utils/analyticsUtils.js +1 -1
  247. package/lib/utils/appContext.js +1 -1
  248. package/lib/utils/aqlHelpers.js +1 -1
  249. package/lib/utils/arangodbUtils.js +1 -1
  250. package/lib/utils/authUtils.js +1 -1
  251. package/lib/utils/awsUtils.js +1 -1
  252. package/lib/utils/collectionRegistry.d.ts +2 -2
  253. package/lib/utils/collectionRegistry.js +1 -1
  254. package/lib/utils/contextUtils.js +1 -1
  255. package/lib/utils/dbI18n.example.js +1 -1
  256. package/lib/utils/dbI18n.js +1 -1
  257. package/lib/utils/googleTranslate.js +1 -1
  258. package/lib/utils/graphqlUtils.js +1 -1
  259. package/lib/utils/imageUtils.js +1 -1
  260. package/lib/utils/index.d.ts +3 -0
  261. package/lib/utils/index.js +4 -1
  262. package/lib/utils/languageDetection.js +1 -1
  263. package/lib/utils/localeUtils.example.js +1 -1
  264. package/lib/utils/localeUtils.js +1 -1
  265. package/lib/utils/mediaAccess.d.ts +5 -0
  266. package/lib/utils/mediaAccess.js +57 -0
  267. package/lib/utils/middlewareUtils.js +1 -1
  268. package/lib/utils/nodeRealtime.d.ts +14 -0
  269. package/lib/utils/nodeRealtime.js +84 -0
  270. package/lib/utils/opaqueToken.d.ts +4 -0
  271. package/lib/utils/opaqueToken.js +7 -0
  272. package/lib/utils/queryBuilder.js +1 -1
  273. package/lib/utils/schemaUtils.js +1 -1
  274. package/lib/utils/sessionUtils.js +1 -1
  275. package/lib/utils/stripeUtils.d.ts +1 -1
  276. package/lib/utils/stripeUtils.js +2 -3
  277. package/lib/utils/stripeUtils.ts.bak +12 -0
  278. package/lib/utils/templateUtils.js +1 -1
  279. package/lib/utils/testUtils.js +1 -1
  280. package/lib/utils/translationQueue.example.js +1 -1
  281. package/lib/utils/translationQueue.js +1 -1
  282. package/lib/videoProcessing.js +1 -1
  283. package/package.json +24 -23
  284. package/lib/durableChat/conversations.d.ts +0 -62
  285. package/lib/durableChat/conversations.js +0 -729
  286. package/lib/durableChat/errors.d.ts +0 -6
  287. package/lib/durableChat/errors.js +0 -11
  288. package/lib/durableChat/events.d.ts +0 -22
  289. package/lib/durableChat/events.js +0 -50
  290. package/lib/durableChat/index.d.ts +0 -8
  291. package/lib/durableChat/index.js +0 -10
  292. package/lib/durableChat/membership.d.ts +0 -24
  293. package/lib/durableChat/membership.js +0 -85
  294. package/lib/durableChat/messageTypes.d.ts +0 -76
  295. package/lib/durableChat/messageTypes.js +0 -3
  296. package/lib/durableChat/messages.d.ts +0 -16
  297. package/lib/durableChat/messages.js +0 -257
  298. package/lib/durableChat/transaction.d.ts +0 -10
  299. package/lib/durableChat/transaction.js +0 -53
  300. package/lib/durableChat/types.d.ts +0 -81
  301. package/lib/durableChat/types.js +0 -3
@@ -925,4 +925,4 @@ export const getCustomerNotificationsByUser = (context, userId)=>{
925
925
  return useDb(context.databaseName).query(query).then((cursor)=>cursor.all());
926
926
  };
927
927
 
928
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50Ly5jb2RleC13b3JrdHJlZXMvcmVha3Rvci1waGFudGF6ZS1jaGF0L3BhY2thZ2VzL3JlYWt0b3Ivc3JjL2FjdGlvbnMvY3JtLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDI2LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBpcyBzdWJqZWN0IHRvIHRoZSBhY2NvbXBhbnlpbmcgY29tbWVyY2lhbCBMSUNFTlNFLlxuICovXG5pbXBvcnQge2NyZWF0ZUhhc2gsIHBhcnNlSWQsIHBhcnNlUGhvbmUsIHBhcnNlU3RyaW5nfSBmcm9tICdAbmxhYnMvdXRpbHMvcGFyc2Vycy9zdHJpbmdzJztcbmltcG9ydCB7YXFsfSBmcm9tICdhcmFuZ29qcyc7XG5pbXBvcnQge2xpdGVyYWx9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5cbmltcG9ydCB7Q09MTEVDVElPTlMsIEVER0VTfSBmcm9tICcuLi9jb25zdGFudHMvY29sbGVjdGlvbnMuanMnO1xuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uL2NvbmZpZy5qcyc7XG5pbXBvcnQge3VzZURifSBmcm9tICcuLi91dGlscy9hcmFuZ29kYlV0aWxzLmpzJztcbmltcG9ydCB7aXNBZG1pblVzZXJ9IGZyb20gJy4uL3V0aWxzL3Nlc3Npb25VdGlscy5qcyc7XG5pbXBvcnQge3Nlc1NlbmR9IGZyb20gJy4vZW1haWwuanMnO1xuXG5pbXBvcnQgdHlwZSB7QXFsUXVlcnl9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5pbXBvcnQgdHlwZSB7QXBpQ29udGV4dH0gZnJvbSAnLi4vdHlwZXMvYXV0aC50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEN1c3RvbWVyTm90aWZpY2F0aW9uVHlwZSxcbiAgQ3VzdG9tZXJPcmRlclR5cGUsXG4gIENybUNhbXBhaWduSW5wdXQsXG4gIENybUNhbXBhaWduVHlwZSxcbiAgQ3JtQ29udGFjdEZpbHRlcixcbiAgQ3JtRm9ybVN1Ym1pc3Npb25JbnB1dCxcbiAgQ3JtRm9ybVN1Ym1pc3Npb25UeXBlLFxuICBNYWlsaW5nTGlzdFR5cGUsXG4gIFB1YmxpY1N1cHBvcnRUaWNrZXRGZWVkLFxuICBQdWJsaWNTdXBwb3J0VGlja2V0SW5wdXQsXG4gIFNob3BpZnlDdXN0b21lck9yZGVySW5wdXQsXG4gIFN1cHBvcnRUaWNrZXRFdmVudFR5cGUsXG4gIFN1cHBvcnRUaWNrZXRNZXNzYWdlVHlwZSxcbiAgU3VwcG9ydFRpY2tldFN0YXR1cyxcbiAgU3VwcG9ydFRpY2tldFR5cGVEYXRhXG59IGZyb20gJy4uL3R5cGVzL2NybS50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7VXNlclR5cGV9IGZyb20gJy4uL3R5cGVzL3VzZXJzLnR5cGVzLmpzJztcblxuY29uc3Qgbm93ID0gKCk6IG51bWJlciA9PiBEYXRlLm5vdygpO1xuY29uc3QgY29sbGVjdGlvbiA9IChuYW1lOiBzdHJpbmcpID0+IGxpdGVyYWwobmFtZSk7XG5jb25zdCBkb2NLZXkgPSAodmFsdWUgPSAnJyk6IHN0cmluZyA9PiBwYXJzZUlkKFN0cmluZyh2YWx1ZSkpO1xuY29uc3QgZG9jSWQgPSAoY29sbGVjdGlvbk5hbWU6IHN0cmluZywga2V5ID0gJycpOiBzdHJpbmcgPT4gYCR7Y29sbGVjdGlvbk5hbWV9LyR7ZG9jS2V5KGtleSl9YDtcbmNvbnN0IGV4dGVybmFsS2V5ID0gKHByZWZpeDogc3RyaW5nLCBpZCA9ICcnKTogc3RyaW5nID0+IGNyZWF0ZUhhc2goYCR7cHJlZml4fS0ke1N0cmluZyhpZCl9YCwgbnVsbCk7XG5jb25zdCBjbGVhblN0cmluZyA9ICh2YWx1ZTogdW5rbm93biwgbGVuZ3RoID0gNjQwKTogc3RyaW5nID0+IHBhcnNlU3RyaW5nKFN0cmluZyh2YWx1ZSB8fCAnJyksIGxlbmd0aCk7XG5jb25zdCBjbGVhbkV4dGVybmFsSWQgPSAodmFsdWU6IHVua25vd24sIGxlbmd0aCA9IDMyMCk6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUgfHwgJycpLnRyaW0oKS5zbGljZSgwLCBsZW5ndGgpO1xuY29uc3QgZW5zdXJlRG9jdW1lbnRDb2xsZWN0aW9uID0gYXN5bmMgKGRhdGFiYXNlOiBSZXR1cm5UeXBlPHR5cGVvZiB1c2VEYj4sIG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCB0YXJnZXQgPSBkYXRhYmFzZS5jb2xsZWN0aW9uKG5hbWUpO1xuICBpZihhd2FpdCB0YXJnZXQuZXhpc3RzKCkpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBhd2FpdCBkYXRhYmFzZS5jcmVhdGVDb2xsZWN0aW9uKG5hbWUpO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgaWYoIWF3YWl0IHRhcmdldC5leGlzdHMoKSkgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5jb25zdCBlbnN1cmVFZGdlQ29sbGVjdGlvbiA9IGFzeW5jIChkYXRhYmFzZTogUmV0dXJuVHlwZTx0eXBlb2YgdXNlRGI+LCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgdGFyZ2V0ID0gZGF0YWJhc2UuY29sbGVjdGlvbihuYW1lKTtcbiAgaWYoYXdhaXQgdGFyZ2V0LmV4aXN0cygpKSByZXR1cm47XG4gIHRyeSB7XG4gICAgYXdhaXQgZGF0YWJhc2UuY3JlYXRlRWRnZUNvbGxlY3Rpb24obmFtZSk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBpZighYXdhaXQgdGFyZ2V0LmV4aXN0cygpKSB0aHJvdyBlcnJvcjtcbiAgfVxufTtcblxuY29uc3QgcmVxdWlyZUNybUFkbWluID0gKGNvbnRleHQ6IEFwaUNvbnRleHQpOiB2b2lkID0+IHtcbiAgaWYoIWlzQWRtaW5Vc2VyKGNvbnRleHQuc2Vzc2lvbiBhcyBhbnkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdhZG1pbmlzdHJhdG9yX2FjY2Vzc19yZXF1aXJlZCcpO1xuICB9XG59O1xuZXhwb3J0IGNvbnN0IHJlcXVpcmVDcm1BZG1pbmlzdHJhdG9yID0gcmVxdWlyZUNybUFkbWluO1xuXG5jb25zdCBhbGxvd2VkQ29udGFjdEZpZWxkcyA9IG5ldyBTZXQoWydlbWFpbCcsICdmaXJzdE5hbWUnLCAnbGFzdE5hbWUnLCAncGhvbmUnLCAnbWFya2V0aW5nQ29uc2VudFNvdXJjZScsICdjcm1Tb3VyY2UnXSk7XG5jb25zdCBzdXBwb3J0UHJpb3JpdGllcyA9IG5ldyBTZXQoWydsb3cnLCAnbm9ybWFsJywgJ2hpZ2gnLCAndXJnZW50J10pO1xuY29uc3Qgc3VwcG9ydFN0YXR1c2VzID0gbmV3IFNldChbJ3N1Ym1pdHRlZCcsICdpbl9wcm9ncmVzcycsICdkb25lJywgJ2NvbXBsZXRlZCddKTtcbmNvbnN0IHN1cHBvcnRUeXBlcyA9IG5ldyBTZXQoWydkZWxpdmVyeV9pc3N1ZScsICdyZWZ1bmRfcmVxdWVzdCcsICdidWdfcmVwb3J0JywgJ2FjY291bnRfaXNzdWUnLCAnZ2VuZXJhbF9zdXBwb3J0J10pO1xuY29uc3QgZW1haWxQYXR0ZXJuID0gL15bXlxcc0BdK0BbXlxcc0BdK1xcLlteXFxzQF0rJC91O1xuY29uc3QgZXNjYXBlSHRtbCA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+IHZhbHVlLnJlcGxhY2UoLyYvZywgJyZhbXA7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKS5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7Jyk7XG5jb25zdCBzYW5pdGl6ZUh0bWwgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4gU3RyaW5nKHZhbHVlIHx8ICcnKVxuICAucmVwbGFjZSgvPChzY3JpcHR8aWZyYW1lfG9iamVjdHxlbWJlZClcXGJbXj5dKj5bXFxzXFxTXSo/PFxcL1xcMT4vZ2ksICcnKVxuICAucmVwbGFjZSgvXFxzb25cXHcrXFxzKj1cXHMqKD86XCJbXlwiXSpcInwnW14nXSonfFteXFxzPl0rKS9naSwgJycpO1xuY29uc3Qgc2FuaXRpemVDc3MgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4gU3RyaW5nKHZhbHVlIHx8ICcnKVxuICAucmVwbGFjZSgvPFxcLz9zdHlsZVxcYltePl0qPi9naSwgJycpXG4gIC5yZXBsYWNlKC9AaW1wb3J0XFxzK1teO10rOz8vZ2ksICcnKVxuICAucmVwbGFjZSgvdXJsXFxzKlxcKFxccyooWydcIl0/KWphdmFzY3JpcHQ6W14pXStcXCkvZ2ksICcnKTtcbmNvbnN0IGh0bWxUb1RleHQgPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZyA9PiB2YWx1ZS5yZXBsYWNlKC88W14+XSs+L2csICcgJykucmVwbGFjZSgvXFxzKy9nLCAnICcpLnRyaW0oKTtcbmNvbnN0IGNodW5rID0gPFQ+KGl0ZW1zOiByZWFkb25seSBUW10sIHNpemU6IG51bWJlcik6IFRbXVtdID0+IHtcbiAgY29uc3QgZ3JvdXBzOiBUW11bXSA9IFtdO1xuICBmb3IobGV0IGluZGV4ID0gMDsgaW5kZXggPCBpdGVtcy5sZW5ndGg7IGluZGV4ICs9IHNpemUpIGdyb3Vwcy5wdXNoKGl0ZW1zLnNsaWNlKGluZGV4LCBpbmRleCArIHNpemUpKTtcbiAgcmV0dXJuIGdyb3Vwcztcbn07XG5cbmV4cG9ydCBjb25zdCBzdWJtaXRDcm1Gb3JtID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBpbnB1dDogQ3JtRm9ybVN1Ym1pc3Npb25JbnB1dFxuKTogUHJvbWlzZTxDcm1Gb3JtU3VibWlzc2lvblR5cGU+ID0+IHtcbiAgaWYodHlwZW9mIGlucHV0Py5tYXJrZXRpbmdPcHRJbiAhPT0gJ2Jvb2xlYW4nKSB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkX21hcmtldGluZ09wdEluJyk7XG4gIGNvbnN0IGVtYWlsID0gY2xlYW5TdHJpbmcoaW5wdXQuZW1haWwsIDMyMCkudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgcmF3UGhvbmUgPSBjbGVhblN0cmluZyhpbnB1dC5waG9uZSwgODApO1xuICBjb25zdCBwaG9uZSA9IHJhd1Bob25lID8gKHBhcnNlUGhvbmUocmF3UGhvbmUpIHx8IHJhd1Bob25lKSA6ICcnO1xuICBpZighZW1haWwgJiYgIXBob25lKSB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkX2VtYWlsX29yX3Bob25lJyk7XG5cbiAgY29uc3QgZGF0YWJhc2UgPSB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSk7XG4gIGF3YWl0IGVuc3VyZURvY3VtZW50Q29sbGVjdGlvbihkYXRhYmFzZSwgQ09MTEVDVElPTlMuQ1JNX0ZPUk1fU1VCTUlTU0lPTlMpO1xuICBjb25zdCB0aW1lc3RhbXAgPSBub3coKTtcbiAgY29uc3Qgc291cmNlID0gY2xlYW5TdHJpbmcoaW5wdXQuc291cmNlIHx8IGlucHV0LmZvcm1JZCB8fCAnZm9ybScsIDE2MCk7XG4gIGNvbnN0IHZhbHVlcyA9IGlucHV0LnZhbHVlcyB8fCB7fTtcbiAgY29uc3QgZmlyc3ROYW1lID0gY2xlYW5TdHJpbmcoaW5wdXQuZmlyc3ROYW1lIHx8IHZhbHVlcy5maXJzdE5hbWUsIDE2MCk7XG4gIGNvbnN0IGxhc3ROYW1lID0gY2xlYW5TdHJpbmcoaW5wdXQubGFzdE5hbWUgfHwgdmFsdWVzLmxhc3ROYW1lLCAxNjApO1xuICBjb25zdCBnZW5lcmF0ZWRVc2VyS2V5ID0gY3JlYXRlSGFzaChlbWFpbCB8fCBwaG9uZSwgbnVsbCk7XG4gIGNvbnN0IGNvbnNlbnQgPSBpbnB1dC5tYXJrZXRpbmdPcHRJblxuICAgID8ge21hcmtldGluZ09wdEluQXQ6IHRpbWVzdGFtcCwgbWFya2V0aW5nT3B0T3V0QXQ6IG51bGx9XG4gICAgOiB7bWFya2V0aW5nT3B0T3V0QXQ6IHRpbWVzdGFtcH07XG4gIGNvbnN0IHVzZXJJbnNlcnQgPSB7XG4gICAgX2tleTogZ2VuZXJhdGVkVXNlcktleSxcbiAgICBhY3RpdmU6IGZhbHNlLFxuICAgIGFkZGVkOiB0aW1lc3RhbXAsXG4gICAgZW1haWwsXG4gICAgZmlyc3ROYW1lLFxuICAgIGxhc3ROYW1lLFxuICAgIG1haWxpbmdMaXN0OiBpbnB1dC5tYXJrZXRpbmdPcHRJbixcbiAgICBtYXJrZXRpbmdDb25zZW50U291cmNlOiBzb3VyY2UsXG4gICAgbWFya2V0aW5nT3B0SW46IGlucHV0Lm1hcmtldGluZ09wdEluLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgcGhvbmUsXG4gICAgdHlwZTogJ2NybUNvbnRhY3QnLFxuICAgIHVzZXJBY2Nlc3M6IDAsXG4gICAgdXNlcklkOiBnZW5lcmF0ZWRVc2VyS2V5LFxuICAgIHZlcmlmaWVkRW1haWw6IGZhbHNlLFxuICAgIHZlcmlmaWVkUGhvbmU6IGZhbHNlLFxuICAgIC4uLmNvbnNlbnRcbiAgfTtcbiAgY29uc3QgdXNlclVwZGF0ZSA9IHtcbiAgICAuLi4oZW1haWwgPyB7ZW1haWx9IDoge30pLFxuICAgIC4uLihmaXJzdE5hbWUgPyB7Zmlyc3ROYW1lfSA6IHt9KSxcbiAgICAuLi4obGFzdE5hbWUgPyB7bGFzdE5hbWV9IDoge30pLFxuICAgIC4uLihwaG9uZSA/IHtwaG9uZX0gOiB7fSksXG4gICAgbWFpbGluZ0xpc3Q6IGlucHV0Lm1hcmtldGluZ09wdEluLFxuICAgIG1hcmtldGluZ0NvbnNlbnRTb3VyY2U6IHNvdXJjZSxcbiAgICBtYXJrZXRpbmdPcHRJbjogaW5wdXQubWFya2V0aW5nT3B0SW4sXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICAuLi5jb25zZW50XG4gIH07XG4gIGNvbnN0IHVzZXIgPSBhd2FpdCBkYXRhYmFzZS5xdWVyeShhcWxgXG4gICAgTEVUIGV4aXN0aW5nID0gRklSU1QoXG4gICAgICBGT1IgdXNlciBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuVVNFUlMpfVxuICAgICAgICBGSUxURVIgKCR7ZW1haWx9ICE9IFwiXCIgJiYgTE9XRVIodXNlci5lbWFpbCB8fCBcIlwiKSA9PSAke2VtYWlsfSlcbiAgICAgICAgICB8fCAoJHtwaG9uZX0gIT0gXCJcIiAmJiB1c2VyLnBob25lID09ICR7cGhvbmV9KVxuICAgICAgICBMSU1JVCAxXG4gICAgICAgIFJFVFVSTiB1c2VyXG4gICAgKVxuICAgIExFVCB1c2VyS2V5ID0gZXhpc3RpbmcgPyBleGlzdGluZy5fa2V5IDogJHtnZW5lcmF0ZWRVc2VyS2V5fVxuICAgIFVQU0VSVCB7X2tleTogdXNlcktleX1cbiAgICBJTlNFUlQgTUVSR0UoJHt1c2VySW5zZXJ0fSwge19rZXk6IHVzZXJLZXksIHVzZXJJZDogdXNlcktleX0pXG4gICAgVVBEQVRFICR7dXNlclVwZGF0ZX0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlVTRVJTKX1cbiAgICBSRVRVUk4gTkVXXG4gIGApLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSkgYXMgVXNlclR5cGUgfCBudWxsO1xuICBjb25zdCB1c2VySWQgPSBkb2NLZXkoU3RyaW5nKHVzZXI/Ll9rZXkgfHwgdXNlcj8udXNlcklkIHx8IGdlbmVyYXRlZFVzZXJLZXkpKTtcblxuICBjb25zdCBzdWJtaXNzaW9uSWQgPSBjcmVhdGVIYXNoKGBjcm0tc3VibWlzc2lvbi0ke3RpbWVzdGFtcH0tJHtlbWFpbH0tJHtwaG9uZX1gLCBudWxsKTtcbiAgY29uc3Qgc3VibWlzc2lvbiA9IHtcbiAgICBfa2V5OiBzdWJtaXNzaW9uSWQsXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICBlbWFpbCxcbiAgICBmb3JtSWQ6IGNsZWFuU3RyaW5nKGlucHV0LmZvcm1JZCwgMTYwKSxcbiAgICBtYXJrZXRpbmdPcHRJbjogaW5wdXQubWFya2V0aW5nT3B0SW4sXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBwaG9uZSxcbiAgICBzb3VyY2UsXG4gICAgc3VibWlzc2lvbklkLFxuICAgIHVzZXJJZCxcbiAgICB2YWx1ZXNcbiAgfTtcbiAgY29uc3Qgc2F2ZWQgPSBhd2FpdCBkYXRhYmFzZS5xdWVyeShhcWxgXG4gICAgSU5TRVJUICR7c3VibWlzc2lvbn0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLkNSTV9GT1JNX1NVQk1JU1NJT05TKX1cbiAgICBSRVRVUk4gTkVXXG4gIGApLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSk7XG5cbiAgcmV0dXJuIHNhdmVkO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENybUZvcm1TdWJtaXNzaW9ucyA9IChjb250ZXh0OiBBcGlDb250ZXh0KTogUHJvbWlzZTxDcm1Gb3JtU3VibWlzc2lvblR5cGVbXT4gPT4ge1xuICByZXF1aXJlQ3JtQWRtaW4oY29udGV4dCk7XG4gIGNvbnN0IGRhdGFiYXNlID0gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpO1xuICByZXR1cm4gKGFzeW5jICgpID0+IHtcbiAgICBpZighYXdhaXQgZGF0YWJhc2UuY29sbGVjdGlvbihDT0xMRUNUSU9OUy5DUk1fRk9STV9TVUJNSVNTSU9OUykuZXhpc3RzKCkpIHJldHVybiBbXTtcbiAgICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsYFxuICAgICAgRk9SIHN1Ym1pc3Npb24gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLkNSTV9GT1JNX1NVQk1JU1NJT05TKX1cbiAgICAgICAgU09SVCBzdWJtaXNzaW9uLmFkZGVkIERFU0NcbiAgICAgICAgTElNSVQgNTAwXG4gICAgICAgIFJFVFVSTiBzdWJtaXNzaW9uXG4gICAgYCkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpO1xuICB9KSgpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENybUNvbnRhY3RzID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGZpbHRlcjogQ3JtQ29udGFjdEZpbHRlciA9IHt9KTogUHJvbWlzZTxVc2VyVHlwZVtdPiA9PiB7XG4gIHJlcXVpcmVDcm1BZG1pbihjb250ZXh0KTtcbiAgY29uc3Qgc2VhcmNoID0gY2xlYW5TdHJpbmcoZmlsdGVyLnNlYXJjaCwgMzIwKS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBmaWVsZCA9IGFsbG93ZWRDb250YWN0RmllbGRzLmhhcyhmaWx0ZXIuZmllbGQgfHwgJycpID8gU3RyaW5nKGZpbHRlci5maWVsZCkgOiAnJztcbiAgY29uc3QgdmFsdWUgPSBjbGVhblN0cmluZyhmaWx0ZXIudmFsdWUsIDMyMCkudG9Mb3dlckNhc2UoKTtcbiAgY29uc3Qgb3B0ZWRJbk9ubHkgPSBmaWx0ZXIub3B0ZWRJbk9ubHkgIT09IGZhbHNlO1xuICBjb25zdCBvcGVyYXRvciA9IFsnY29udGFpbnMnLCAnZXF1YWxzJywgJ2V4aXN0cyddLmluY2x1ZGVzKGZpbHRlci5vcGVyYXRvciB8fCAnJykgPyBmaWx0ZXIub3BlcmF0b3IgOiAnY29udGFpbnMnO1xuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbGBcbiAgICBGT1IgdXNlciBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuVVNFUlMpfVxuICAgICAgRklMVEVSICR7IW9wdGVkSW5Pbmx5fSB8fCB1c2VyLm1hcmtldGluZ09wdEluID09IHRydWVcbiAgICAgIEZJTFRFUiAkeyFzZWFyY2h9IHx8IENPTlRBSU5TKExPV0VSKENPTkNBVF9TRVBBUkFUT1IoXCIgXCIsIHVzZXIuZmlyc3ROYW1lLCB1c2VyLmxhc3ROYW1lLCB1c2VyLmVtYWlsLCB1c2VyLnBob25lKSksICR7c2VhcmNofSlcbiAgICAgIEZJTFRFUiAkeyFmaWVsZH0gfHwgKCR7b3BlcmF0b3IgPT09ICdleGlzdHMnfVxuICAgICAgICA/IEhBUyh1c2VyLCAke2ZpZWxkfSlcbiAgICAgICAgOiAoJHtvcGVyYXRvciA9PT0gJ2VxdWFscyd9ID8gTE9XRVIoVE9fU1RSSU5HKHVzZXJbJHtmaWVsZH1dKSkgPT0gJHt2YWx1ZX0gOiBDT05UQUlOUyhMT1dFUihUT19TVFJJTkcodXNlclske2ZpZWxkfV0pKSwgJHt2YWx1ZX0pKSlcbiAgICAgIFNPUlQgdXNlci5hZGRlZCBERVNDXG4gICAgICBMSU1JVCAxMDAwXG4gICAgICBSRVRVUk4gTUVSR0UodXNlciwge2NybVNvdXJjZTogdXNlci5tYXJrZXRpbmdDb25zZW50U291cmNlfSlcbiAgYCkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IHNlbmRDcm1DYW1wYWlnbiA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaW5wdXQ6IENybUNhbXBhaWduSW5wdXRcbik6IFByb21pc2U8Q3JtQ2FtcGFpZ25UeXBlPiA9PiB7XG4gIHJlcXVpcmVDcm1BZG1pbihjb250ZXh0KTtcbiAgY29uc3Qgc3ViamVjdCA9IGNsZWFuU3RyaW5nKGlucHV0LnN1YmplY3QsIDMyMCk7XG4gIGNvbnN0IGJvZHlIdG1sID0gc2FuaXRpemVIdG1sKGlucHV0Lmh0bWwpO1xuICBjb25zdCBjc3MgPSBzYW5pdGl6ZUNzcyhpbnB1dC5jc3MpO1xuICBpZighc3ViamVjdCB8fCAhYm9keUh0bWwpIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWRfY2FtcGFpZ25fY29udGVudCcpO1xuXG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBhd2FpdCBnZXRDcm1Db250YWN0cyhjb250ZXh0LCB7Li4uaW5wdXQuZmlsdGVyLCBvcHRlZEluT25seTogdHJ1ZX0pO1xuICBjb25zdCBzZWxlY3RlZElkcyA9IG5ldyBTZXQoKGlucHV0LnVzZXJJZHMgfHwgW10pLm1hcCgoaWQpID0+IGRvY0tleShpZCkpKTtcbiAgY29uc3QgcmVjaXBpZW50cyA9IGNhbmRpZGF0ZXMuZmlsdGVyKCh1c2VyKSA9PlxuICAgIEJvb2xlYW4odXNlci5lbWFpbCkgJiYgKCFzZWxlY3RlZElkcy5zaXplIHx8IHNlbGVjdGVkSWRzLmhhcyhkb2NLZXkodXNlci51c2VySWQgfHwgdXNlci5fa2V5KSkpKTtcbiAgY29uc3QgdGltZXN0YW1wID0gbm93KCk7XG4gIGNvbnN0IGNhbXBhaWduSWQgPSBjcmVhdGVIYXNoKGBjcm0tY2FtcGFpZ24tJHt0aW1lc3RhbXB9LSR7c3ViamVjdH1gLCBudWxsKTtcbiAgY29uc3QgZGF0YWJhc2UgPSB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSk7XG4gIGNvbnN0IGNhbXBhaWduID0ge1xuICAgIF9rZXk6IGNhbXBhaWduSWQsXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICBjYW1wYWlnbklkLFxuICAgIGNzcyxcbiAgICBmYWlsZWRDb3VudDogMCxcbiAgICBodG1sOiBib2R5SHRtbCxcbiAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgIHJlY2lwaWVudENvdW50OiByZWNpcGllbnRzLmxlbmd0aCxcbiAgICBzZW50Q291bnQ6IDAsXG4gICAgc3RhdHVzOiAnc2VuZGluZycsXG4gICAgc3ViamVjdFxuICB9O1xuICBhd2FpdCBkYXRhYmFzZS5xdWVyeShhcWxgSU5TRVJUICR7Y2FtcGFpZ259IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5DUk1fQ0FNUEFJR05TKX1gKTtcblxuICBsZXQgZmFpbGVkQ291bnQgPSAwO1xuICBsZXQgc2VudENvdW50ID0gMDtcbiAgZm9yKGNvbnN0IHJlY2lwaWVudHNCYXRjaCBvZiBjaHVuayhyZWNpcGllbnRzLCA1MCkpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2VzU2VuZCh7XG4gICAgICAgIERlc3RpbmF0aW9uOiB7QmNjQWRkcmVzc2VzOiByZWNpcGllbnRzQmF0Y2gubWFwKChyZWNpcGllbnQpID0+IFN0cmluZyhyZWNpcGllbnQuZW1haWwpKX0sXG4gICAgICAgIE1lc3NhZ2U6IHtcbiAgICAgICAgICBCb2R5OiB7SHRtbDoge0RhdGE6IGA8c3R5bGU+JHtjc3N9PC9zdHlsZT4ke2JvZHlIdG1sfWB9LCBUZXh0OiB7RGF0YTogaHRtbFRvVGV4dChib2R5SHRtbCl9fSxcbiAgICAgICAgICBTdWJqZWN0OiB7RGF0YTogc3ViamVjdH1cbiAgICAgICAgfSxcbiAgICAgICAgU291cmNlOiBgXCIke2NvbnRleHQuY29uZmlnPy5kZXRhaWxzPy5zdXBwb3J0TmFtZSB8fCAnUmVha3Rvcid9XCIgPCR7Y29udGV4dC5jb25maWc/LmRldGFpbHM/LnN1cHBvcnRFbWFpbCB8fCAnc3VwcG9ydEByZWFrdG9yLmlvJ30+YFxuICAgICAgfSk7XG4gICAgICBzZW50Q291bnQgKz0gcmVjaXBpZW50c0JhdGNoLmxlbmd0aDtcbiAgICB9IGNhdGNoKF9lcnJvcikge1xuICAgICAgZmFpbGVkQ291bnQgKz0gcmVjaXBpZW50c0JhdGNoLmxlbmd0aDtcbiAgICB9XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gey4uLmNhbXBhaWduLCBmYWlsZWRDb3VudCwgc2VudEF0OiBub3coKSwgc2VudENvdW50LCBzdGF0dXM6IGZhaWxlZENvdW50ID8gKHNlbnRDb3VudCA/ICdwYXJ0aWFsJyA6ICdmYWlsZWQnKSA6ICdzZW50J307XG4gIGF3YWl0IGRhdGFiYXNlLnF1ZXJ5KGFxbGBcbiAgICBVUERBVEUgJHtjYW1wYWlnbklkfSBXSVRIICR7e1xuICAgICAgZmFpbGVkQ291bnQ6IHJlc3VsdC5mYWlsZWRDb3VudCxcbiAgICAgIG1vZGlmaWVkOiByZXN1bHQuc2VudEF0LFxuICAgICAgc2VudEF0OiByZXN1bHQuc2VudEF0LFxuICAgICAgc2VudENvdW50OiByZXN1bHQuc2VudENvdW50LFxuICAgICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzXG4gICAgfX0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLkNSTV9DQU1QQUlHTlMpfVxuICBgKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmNvbnN0IHNhdmVFZGdlID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBlZGdlQ29sbGVjdGlvbjogc3RyaW5nLFxuICBlZGdlS2V5OiBzdHJpbmcsXG4gIGZyb206IHN0cmluZyxcbiAgdG86IHN0cmluZyxcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCBlZGdlID0ge1xuICAgIF9mcm9tOiBmcm9tLFxuICAgIF9rZXk6IGVkZ2VLZXksXG4gICAgX3RvOiB0byxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgLi4uZGF0YVxuICB9O1xuICBjb25zdCBxdWVyeTogQXFsUXVlcnkgPSBhcWxgXG4gICAgVVBTRVJUIHtfa2V5OiAke2VkZ2VLZXl9fVxuICAgIElOU0VSVCAke2VkZ2V9XG4gICAgVVBEQVRFICR7ZGF0YX0gSU4gJHtjb2xsZWN0aW9uKGVkZ2VDb2xsZWN0aW9uKX1cbiAgYDtcblxuICBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZU1haWxpbmdMaXN0ID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBpbnB1dDogUGFydGlhbDxNYWlsaW5nTGlzdFR5cGU+XG4pOiBQcm9taXNlPE1haWxpbmdMaXN0VHlwZT4gPT4ge1xuICBjb25zdCB0aW1lc3RhbXAgPSBub3coKTtcbiAgY29uc3QgbWFpbGluZ0xpc3RJZCA9IGRvY0tleShTdHJpbmcoaW5wdXQ/Lm1haWxpbmdMaXN0SWQgfHwgY3JlYXRlSGFzaChgbWFpbGluZy1saXN0LSR7aW5wdXQ/Lm5hbWV9LSR7dGltZXN0YW1wfWApKSk7XG4gIGNvbnN0IG1haWxpbmdMaXN0ID0ge1xuICAgIF9rZXk6IG1haWxpbmdMaXN0SWQsXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICBjcmVhdGVkQnlVc2VySWQ6IGRvY0tleShTdHJpbmcoY29udGV4dD8uc2Vzc2lvbj8udXNlcklkIHx8ICcnKSksXG4gICAgZGVzY3JpcHRpb246IGNsZWFuU3RyaW5nKGlucHV0Py5kZXNjcmlwdGlvbiwgMjAwMCksXG4gICAgbWFpbGluZ0xpc3RJZCxcbiAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgIG5hbWU6IGNsZWFuU3RyaW5nKGlucHV0Py5uYW1lLCAxNjApLFxuICAgIHN0YXR1czogaW5wdXQ/LnN0YXR1cyB8fCAnYWN0aXZlJ1xuICB9O1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBVUFNFUlQge19rZXk6ICR7bWFpbGluZ0xpc3RJZH19XG4gICAgSU5TRVJUICR7bWFpbGluZ0xpc3R9XG4gICAgVVBEQVRFICR7e1xuICAgICAgZGVzY3JpcHRpb246IG1haWxpbmdMaXN0LmRlc2NyaXB0aW9uLFxuICAgICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICAgIG5hbWU6IG1haWxpbmdMaXN0Lm5hbWUsXG4gICAgICBzdGF0dXM6IG1haWxpbmdMaXN0LnN0YXR1c1xuICAgIH19IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5NQUlMSU5HX0xJU1RTKX1cbiAgICBSRVRVUk4gTkVXXG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRNYWlsaW5nTGlzdHMgPSAoY29udGV4dDogQXBpQ29udGV4dCk6IFByb21pc2U8TWFpbGluZ0xpc3RUeXBlW10+ID0+IHtcbiAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgRk9SIGxpc3QgSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLk1BSUxJTkdfTElTVFMpfVxuICAgICAgRklMVEVSIGxpc3Quc3RhdHVzICE9IFwiYXJjaGl2ZWRcIlxuICAgICAgU09SVCBsaXN0LmFkZGVkIERFU0NcbiAgICAgIFJFVFVSTiBsaXN0XG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZFVzZXJUb01haWxpbmdMaXN0ID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB1c2VySWQ6IHN0cmluZyxcbiAgbWFpbGluZ0xpc3RJZDogc3RyaW5nLFxuICBzb3VyY2UgPSAnbWFudWFsJ1xuKTogUHJvbWlzZTxNYWlsaW5nTGlzdFR5cGUgfCBudWxsPiA9PiB7XG4gIGNvbnN0IHVzZXJLZXkgPSBkb2NLZXkodXNlcklkKTtcbiAgY29uc3QgbGlzdEtleSA9IGRvY0tleShtYWlsaW5nTGlzdElkKTtcbiAgY29uc3QgZWRnZUtleSA9IGNyZWF0ZUhhc2goYGhhc01haWxpbmdMaXN0LSR7dXNlcktleX0tJHtsaXN0S2V5fWApO1xuXG4gIGF3YWl0IHNhdmVFZGdlKFxuICAgIGNvbnRleHQsXG4gICAgRURHRVMuSEFTX01BSUxJTkdfTElTVCxcbiAgICBlZGdlS2V5LFxuICAgIGRvY0lkKENPTExFQ1RJT05TLlVTRVJTLCB1c2VyS2V5KSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5NQUlMSU5HX0xJU1RTLCBsaXN0S2V5KSxcbiAgICB7XG4gICAgICBhZGRlZEJ5VXNlcklkOiBkb2NLZXkoU3RyaW5nKGNvbnRleHQ/LnNlc3Npb24/LnVzZXJJZCB8fCAnJykpLFxuICAgICAgc291cmNlOiBjbGVhblN0cmluZyhzb3VyY2UsIDgwKSxcbiAgICAgIHN0YXR1czogJ2FjdGl2ZSdcbiAgICB9XG4gICk7XG5cbiAgcmV0dXJuIHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKVxuICAgIC5xdWVyeShhcWxgUkVUVVJOIERPQ1VNRU5UKCR7ZG9jSWQoQ09MTEVDVElPTlMuTUFJTElOR19MSVNUUywgbGlzdEtleSl9KWApXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgcmVtb3ZlVXNlckZyb21NYWlsaW5nTGlzdCA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdXNlcklkOiBzdHJpbmcsXG4gIG1haWxpbmdMaXN0SWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGNvbnN0IHVzZXJLZXkgPSBkb2NLZXkodXNlcklkKTtcbiAgY29uc3QgbGlzdEtleSA9IGRvY0tleShtYWlsaW5nTGlzdElkKTtcbiAgY29uc3QgZWRnZUtleSA9IGNyZWF0ZUhhc2goYGhhc01haWxpbmdMaXN0LSR7dXNlcktleX0tJHtsaXN0S2V5fWApO1xuICBjb25zdCB1cGRhdGUgPSB7XG4gICAgbW9kaWZpZWQ6IG5vdygpLFxuICAgIHJlbW92ZWRBdDogbm93KCksXG4gICAgc3RhdHVzOiAncmVtb3ZlZCdcbiAgfTtcbiAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgVVBEQVRFICR7ZWRnZUtleX0gV0lUSCAke3VwZGF0ZX0gSU4gJHtjb2xsZWN0aW9uKEVER0VTLkhBU19NQUlMSU5HX0xJU1QpfVxuICAgIFJFVFVSTiBORVdcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpLnRoZW4oQm9vbGVhbik7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TWFpbGluZ0xpc3RVc2VycyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgbWFpbGluZ0xpc3RJZDogc3RyaW5nXG4pOiBQcm9taXNlPFVzZXJUeXBlW10+ID0+IHtcbiAgY29uc3QgbGlzdElkID0gZG9jSWQoQ09MTEVDVElPTlMuTUFJTElOR19MSVNUUywgbWFpbGluZ0xpc3RJZCk7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiB1c2VyLCBlZGdlIElOIDEuLjEgSU5CT1VORCAke2xpc3RJZH0gJHtjb2xsZWN0aW9uKEVER0VTLkhBU19NQUlMSU5HX0xJU1QpfVxuICAgICAgRklMVEVSIGVkZ2Uuc3RhdHVzID09IFwiYWN0aXZlXCJcbiAgICAgIFNPUlQgdXNlci5lbWFpbCBBU0NcbiAgICAgIFJFVFVSTiB1c2VyXG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXJzQnlQdXJjaGFzZWRQcm9kdWN0ID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBwcm9kdWN0SWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxVc2VyVHlwZVtdPiA9PiB7XG4gIGNvbnN0IHByb2R1Y3RLZXkgPSBleHRlcm5hbEtleSgnc2hvcGlmeS1wcm9kdWN0JywgcHJvZHVjdElkKTtcbiAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgRk9SIG9yZGVyIElOIDEuLjEgSU5CT1VORCAke2RvY0lkKENPTExFQ1RJT05TLlNIT1BJRllfUFJPRFVDVFMsIHByb2R1Y3RLZXkpfSAke2NvbGxlY3Rpb24oRURHRVMuSEFTX1BVUkNIQVNFRF9QUk9EVUNUKX1cbiAgICAgIEZPUiB1c2VyIElOIDEuLjEgSU5CT1VORCBvcmRlci5faWQgJHtjb2xsZWN0aW9uKEVER0VTLkhBU19DVVNUT01FUl9PUkRFUil9XG4gICAgICAgIFNPUlQgdXNlci5lbWFpbCBBU0NcbiAgICAgICAgUkVUVVJOIERJU1RJTkNUIHVzZXJcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RWxpZ2libGVNYWlsaW5nVXNlcnMgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIG9wdGlvbnM6IHtyZWFkb25seSBtYWlsaW5nTGlzdElkPzogc3RyaW5nOyByZWFkb25seSBwcm9kdWN0SWQ/OiBzdHJpbmc7IHJlYWRvbmx5IGV4Y2x1ZGVPcGVuU3VwcG9ydFRpY2tldHM/OiBib29sZWFufSA9IHt9XG4pOiBQcm9taXNlPFVzZXJUeXBlW10+ID0+IHtcbiAgY29uc3QgZXhjbHVkZU9wZW5TdXBwb3J0VGlja2V0cyA9IG9wdGlvbnMuZXhjbHVkZU9wZW5TdXBwb3J0VGlja2V0cyAhPT0gZmFsc2U7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIExFVCBiYXNlVXNlcnMgPSAoXG4gICAgICBGT1IgdXNlciBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuVVNFUlMpfVxuICAgICAgICBGSUxURVIgdXNlci5tYXJrZXRpbmdPcHRJbiA9PSB0cnVlXG4gICAgICAgIEZJTFRFUiB1c2VyLmVtYWlsICE9IG51bGwgJiYgdXNlci5lbWFpbCAhPSBcIlwiXG4gICAgICAgIEZJTFRFUiB1c2VyLmVtYWlsRGVsaXZlcnlTdGF0dXMgPT0gbnVsbCB8fCB1c2VyLmVtYWlsRGVsaXZlcnlTdGF0dXMgPT0gXCJ2YWxpZFwiXG4gICAgICAgICR7b3B0aW9ucy5tYWlsaW5nTGlzdElkID8gYXFsYFxuICAgICAgICAgIEZJTFRFUiBMRU5HVEgoXG4gICAgICAgICAgICBGT1IgbGlzdCBJTiAxLi4xIE9VVEJPVU5EIHVzZXIuX2lkICR7Y29sbGVjdGlvbihFREdFUy5IQVNfTUFJTElOR19MSVNUKX1cbiAgICAgICAgICAgICAgRklMVEVSIGxpc3QuX2tleSA9PSAke2RvY0tleShvcHRpb25zLm1haWxpbmdMaXN0SWQpfVxuICAgICAgICAgICAgICBSRVRVUk4gbGlzdFxuICAgICAgICAgICkgPiAwXG4gICAgICAgIGAgOiBhcWxgYH1cbiAgICAgICAgJHtvcHRpb25zLnByb2R1Y3RJZCA/IGFxbGBcbiAgICAgICAgICBGSUxURVIgTEVOR1RIKFxuICAgICAgICAgICAgRk9SIG9yZGVyIElOIDEuLjEgT1VUQk9VTkQgdXNlci5faWQgJHtjb2xsZWN0aW9uKEVER0VTLkhBU19DVVNUT01FUl9PUkRFUil9XG4gICAgICAgICAgICAgIEZPUiBwcm9kdWN0IElOIDEuLjEgT1VUQk9VTkQgb3JkZXIuX2lkICR7Y29sbGVjdGlvbihFREdFUy5IQVNfUFVSQ0hBU0VEX1BST0RVQ1QpfVxuICAgICAgICAgICAgICAgIEZJTFRFUiBwcm9kdWN0LnByb2R1Y3RJZCA9PSAke1N0cmluZyhvcHRpb25zLnByb2R1Y3RJZCl9XG4gICAgICAgICAgICAgICAgUkVUVVJOIHByb2R1Y3RcbiAgICAgICAgICApID4gMFxuICAgICAgICBgIDogYXFsYGB9XG4gICAgICAgICR7ZXhjbHVkZU9wZW5TdXBwb3J0VGlja2V0cyA/IGFxbGBcbiAgICAgICAgICBGSUxURVIgTEVOR1RIKFxuICAgICAgICAgICAgRk9SIHRpY2tldCBJTiAxLi4xIE9VVEJPVU5EIHVzZXIuX2lkICR7Y29sbGVjdGlvbihFREdFUy5IQVNfU1VQUE9SVF9USUNLRVQpfVxuICAgICAgICAgICAgICBGSUxURVIgdGlja2V0LnN0YXR1cyBJTiBbXCJvcGVuXCIsIFwiaW5fcHJvZ3Jlc3NcIiwgXCJ3YWl0aW5nX29uX2N1c3RvbWVyXCIsIFwid2FpdGluZ19vbl9pbnRlcm5hbFwiXVxuICAgICAgICAgICAgICBGSUxURVIgdGlja2V0LnByaW9yaXR5IElOIFtcImhpZ2hcIiwgXCJ1cmdlbnRcIl1cbiAgICAgICAgICAgICAgUkVUVVJOIHRpY2tldFxuICAgICAgICAgICkgPT0gMFxuICAgICAgICBgIDogYXFsYGB9XG4gICAgICAgIFJFVFVSTiB1c2VyXG4gICAgKVxuICAgIEZPUiB1c2VyIElOIGJhc2VVc2Vyc1xuICAgICAgU09SVCB1c2VyLmVtYWlsIEFTQ1xuICAgICAgUkVUVVJOIERJU1RJTkNUIHVzZXJcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgaW5nZXN0U2hvcGlmeUN1c3RvbWVyT3JkZXIgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBTaG9waWZ5Q3VzdG9tZXJPcmRlcklucHV0XG4pOiBQcm9taXNlPEN1c3RvbWVyT3JkZXJUeXBlPiA9PiB7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCBzaG9waWZ5Q3VzdG9tZXJJZCA9IGNsZWFuRXh0ZXJuYWxJZChpbnB1dC5zaG9waWZ5Q3VzdG9tZXJJZCwgMTYwKTtcbiAgY29uc3Qgc2hvcGlmeU9yZGVySWQgPSBjbGVhbkV4dGVybmFsSWQoaW5wdXQuc2hvcGlmeU9yZGVySWQsIDE2MCk7XG4gIGNvbnN0IGN1c3RvbWVyID0gaW5wdXQuY3VzdG9tZXIgfHwge307XG4gIGNvbnN0IGVtYWlsID0gY2xlYW5TdHJpbmcoY3VzdG9tZXIuZW1haWwsIDMyMCkudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgcHJvZHVjdElkcyA9IEFycmF5LmZyb20obmV3IFNldChbLi4uKGlucHV0LnByb2R1Y3RJZHMgfHwgW10pLCAuLi4oaW5wdXQucHJvZHVjdHMgfHwgW10pLm1hcCgocHJvZHVjdCkgPT4gcHJvZHVjdC5wcm9kdWN0SWQpXVxuICAgIC5tYXAoKHByb2R1Y3RJZCkgPT4gY2xlYW5FeHRlcm5hbElkKHByb2R1Y3RJZCwgMzIwKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pKSk7XG5cbiAgaWYoIXNob3BpZnlDdXN0b21lcklkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZF9zaG9waWZ5Q3VzdG9tZXJJZCcpO1xuICB9XG4gIGlmKCFzaG9waWZ5T3JkZXJJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWRfc2hvcGlmeU9yZGVySWQnKTtcbiAgfVxuICBpZighZW1haWwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkX2N1c3RvbWVyRW1haWwnKTtcbiAgfVxuXG4gIGNvbnN0IHVzZXJLZXkgPSBleHRlcm5hbEtleSgnc2hvcGlmeS11c2VyJywgc2hvcGlmeUN1c3RvbWVySWQpO1xuICBjb25zdCB1c2VySW5zZXJ0ID0ge1xuICAgIF9rZXk6IHVzZXJLZXksXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICBlbWFpbCxcbiAgICBmaXJzdE5hbWU6IGNsZWFuU3RyaW5nKGN1c3RvbWVyLmZpcnN0TmFtZSwgMTYwKSxcbiAgICBsYXN0TmFtZTogY2xlYW5TdHJpbmcoY3VzdG9tZXIubGFzdE5hbWUsIDE2MCksXG4gICAgbWFya2V0aW5nQ29uc2VudFNvdXJjZTogJ3Nob3BpZnknLFxuICAgIG1hcmtldGluZ09wdEluOiBjdXN0b21lci5tYXJrZXRpbmdPcHRJbiA9PT0gdHJ1ZSxcbiAgICBtYXJrZXRpbmdPcHRJbkF0OiBjdXN0b21lci5tYXJrZXRpbmdPcHRJbiA9PT0gdHJ1ZSA/IHRpbWVzdGFtcCA6IHVuZGVmaW5lZCxcbiAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgIHNob3BpZnlDdXN0b21lcklkLFxuICAgIHR5cGU6ICdjcm1Db250YWN0JyxcbiAgICB1c2VySWQ6IHVzZXJLZXlcbiAgfTtcbiAgY29uc3QgdXNlclVwZGF0ZSA9IHtcbiAgICBlbWFpbCxcbiAgICBmaXJzdE5hbWU6IGNsZWFuU3RyaW5nKGN1c3RvbWVyLmZpcnN0TmFtZSwgMTYwKSxcbiAgICBsYXN0TmFtZTogY2xlYW5TdHJpbmcoY3VzdG9tZXIubGFzdE5hbWUsIDE2MCksXG4gICAgbGFzdFB1cmNoYXNlZEF0OiBpbnB1dC5wdXJjaGFzZWRBdCB8fCB0aW1lc3RhbXAsXG4gICAgbWFya2V0aW5nQ29uc2VudFNvdXJjZTogJ3Nob3BpZnknLFxuICAgIG1hcmtldGluZ09wdEluOiBjdXN0b21lci5tYXJrZXRpbmdPcHRJbiA9PT0gdHJ1ZSxcbiAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgIHNob3BpZnlDdXN0b21lcklkXG4gIH07XG4gIGNvbnN0IHVzZXJRdWVyeSA9IGFxbGBcbiAgICBMRVQgZXhpc3RpbmcgPSBGSVJTVChcbiAgICAgIEZPUiB1c2VyIElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5VU0VSUyl9XG4gICAgICAgIEZJTFRFUiB1c2VyLnNob3BpZnlDdXN0b21lcklkID09ICR7c2hvcGlmeUN1c3RvbWVySWR9IHx8IHVzZXIuZW1haWwgPT0gJHtlbWFpbH1cbiAgICAgICAgTElNSVQgMVxuICAgICAgICBSRVRVUk4gdXNlclxuICAgIClcbiAgICBMRVQgdXNlcktleSA9IGV4aXN0aW5nID8gZXhpc3RpbmcuX2tleSA6ICR7dXNlcktleX1cbiAgICBVUFNFUlQge19rZXk6IHVzZXJLZXl9XG4gICAgSU5TRVJUIE1FUkdFKCR7dXNlckluc2VydH0sIHtfa2V5OiB1c2VyS2V5LCB1c2VySWQ6IHVzZXJLZXl9KVxuICAgIFVQREFURSAke3VzZXJVcGRhdGV9IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5VU0VSUyl9XG4gICAgUkVUVVJOIE5FV1xuICBgO1xuICBjb25zdCB1c2VyID0gYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHVzZXJRdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKSBhcyBVc2VyVHlwZTtcbiAgY29uc3QgcmVzb2x2ZWRVc2VyS2V5ID0gZG9jS2V5KFN0cmluZyh1c2VyPy5fa2V5IHx8IHVzZXI/LnVzZXJJZCB8fCB1c2VyS2V5KSk7XG4gIGNvbnN0IG9yZGVyS2V5ID0gZXh0ZXJuYWxLZXkoJ3Nob3BpZnktb3JkZXInLCBzaG9waWZ5T3JkZXJJZCk7XG4gIGNvbnN0IG9yZGVyID0ge1xuICAgIF9rZXk6IG9yZGVyS2V5LFxuICAgIGFkZGVkOiB0aW1lc3RhbXAsXG4gICAgY3VycmVuY3k6IGNsZWFuU3RyaW5nKGlucHV0LmN1cnJlbmN5LCAzKS50b1VwcGVyQ2FzZSgpLFxuICAgIGN1c3RvbWVyT3JkZXJJZDogb3JkZXJLZXksXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBwcm9kdWN0SWRzLFxuICAgIHB1cmNoYXNlZEF0OiBpbnB1dC5wdXJjaGFzZWRBdCB8fCB0aW1lc3RhbXAsXG4gICAgc2hvcGlmeUN1c3RvbWVySWQsXG4gICAgc2hvcGlmeU9yZGVySWQsXG4gICAgdG90YWxQcmljZTogTnVtYmVyKGlucHV0LnRvdGFsUHJpY2UgfHwgMCksXG4gICAgdXNlcklkOiByZXNvbHZlZFVzZXJLZXlcbiAgfTtcbiAgY29uc3Qgb3JkZXJRdWVyeSA9IGFxbGBcbiAgICBVUFNFUlQge19rZXk6ICR7b3JkZXJLZXl9fVxuICAgIElOU0VSVCAke29yZGVyfVxuICAgIFVQREFURSAke3tcbiAgICAgIGN1cnJlbmN5OiBvcmRlci5jdXJyZW5jeSxcbiAgICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgICBwcm9kdWN0SWRzLFxuICAgICAgcHVyY2hhc2VkQXQ6IG9yZGVyLnB1cmNoYXNlZEF0LFxuICAgICAgdG90YWxQcmljZTogb3JkZXIudG90YWxQcmljZSxcbiAgICAgIHVzZXJJZDogcmVzb2x2ZWRVc2VyS2V5XG4gICAgfX0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLkNVU1RPTUVSX09SREVSUyl9XG4gICAgUkVUVVJOIE5FV1xuICBgO1xuICBjb25zdCBzYXZlZE9yZGVyID0gYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KG9yZGVyUXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSkgYXMgQ3VzdG9tZXJPcmRlclR5cGU7XG5cbiAgYXdhaXQgc2F2ZUVkZ2UoXG4gICAgY29udGV4dCxcbiAgICBFREdFUy5IQVNfQ1VTVE9NRVJfT1JERVIsXG4gICAgY3JlYXRlSGFzaChgaGFzQ3VzdG9tZXJPcmRlci0ke3Jlc29sdmVkVXNlcktleX0tJHtvcmRlcktleX1gKSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5VU0VSUywgcmVzb2x2ZWRVc2VyS2V5KSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5DVVNUT01FUl9PUkRFUlMsIG9yZGVyS2V5KSxcbiAgICB7cHVyY2hhc2VkQXQ6IG9yZGVyLnB1cmNoYXNlZEF0LCBzaG9waWZ5Q3VzdG9tZXJJZCwgc2hvcGlmeU9yZGVySWR9XG4gICk7XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwocHJvZHVjdElkcy5tYXAoYXN5bmMgKHByb2R1Y3RJZCkgPT4ge1xuICAgIGNvbnN0IHByb2R1Y3QgPSAoaW5wdXQucHJvZHVjdHMgfHwgW10pLmZpbmQoKGl0ZW0pID0+IGl0ZW0ucHJvZHVjdElkID09PSBwcm9kdWN0SWQpIHx8IHtwcm9kdWN0SWR9O1xuICAgIGNvbnN0IHByb2R1Y3RLZXkgPSBleHRlcm5hbEtleSgnc2hvcGlmeS1wcm9kdWN0JywgcHJvZHVjdElkKTtcbiAgICBjb25zdCBwcm9kdWN0RG9jID0ge1xuICAgICAgX2tleTogcHJvZHVjdEtleSxcbiAgICAgIGFkZGVkOiB0aW1lc3RhbXAsXG4gICAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgICAgcHJvZHVjdElkLFxuICAgICAgdGl0bGU6IGNsZWFuU3RyaW5nKHByb2R1Y3QudGl0bGUsIDMyMCksXG4gICAgICB2YXJpYW50SWQ6IGNsZWFuRXh0ZXJuYWxJZChwcm9kdWN0LnZhcmlhbnRJZCwgMTYwKVxuICAgIH07XG4gICAgY29uc3QgcHJvZHVjdFF1ZXJ5ID0gYXFsYFxuICAgICAgVVBTRVJUIHtfa2V5OiAke3Byb2R1Y3RLZXl9fVxuICAgICAgSU5TRVJUICR7cHJvZHVjdERvY31cbiAgICAgIFVQREFURSAke3tcbiAgICAgICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICAgICAgdGl0bGU6IHByb2R1Y3REb2MudGl0bGUsXG4gICAgICAgIHZhcmlhbnRJZDogcHJvZHVjdERvYy52YXJpYW50SWRcbiAgICAgIH19IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5TSE9QSUZZX1BST0RVQ1RTKX1cbiAgICBgO1xuICAgIGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShwcm9kdWN0UXVlcnkpO1xuICAgIGF3YWl0IHNhdmVFZGdlKFxuICAgICAgY29udGV4dCxcbiAgICAgIEVER0VTLkhBU19QVVJDSEFTRURfUFJPRFVDVCxcbiAgICAgIGNyZWF0ZUhhc2goYGhhc1B1cmNoYXNlZFByb2R1Y3QtJHtvcmRlcktleX0tJHtwcm9kdWN0S2V5fWApLFxuICAgICAgZG9jSWQoQ09MTEVDVElPTlMuQ1VTVE9NRVJfT1JERVJTLCBvcmRlcktleSksXG4gICAgICBkb2NJZChDT0xMRUNUSU9OUy5TSE9QSUZZX1BST0RVQ1RTLCBwcm9kdWN0S2V5KSxcbiAgICAgIHtwcm9kdWN0SWQsIHB1cmNoYXNlZEF0OiBvcmRlci5wdXJjaGFzZWRBdH1cbiAgICApO1xuICB9KSk7XG5cbiAgYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbGBcbiAgICBVUERBVEUgJHtyZXNvbHZlZFVzZXJLZXl9XG4gICAgV0lUSCB7XG4gICAgICBsYXN0UHVyY2hhc2VkQXQ6ICR7b3JkZXIucHVyY2hhc2VkQXR9LFxuICAgICAgdG90YWxPcmRlckNvdW50OiBMRU5HVEgoXG4gICAgICAgIEZPUiBvcmRlciBJTiAxLi4xIE9VVEJPVU5EICR7ZG9jSWQoQ09MTEVDVElPTlMuVVNFUlMsIHJlc29sdmVkVXNlcktleSl9ICR7Y29sbGVjdGlvbihFREdFUy5IQVNfQ1VTVE9NRVJfT1JERVIpfVxuICAgICAgICAgIFJFVFVSTiBvcmRlclxuICAgICAgKSxcbiAgICAgIHRvdGFsU3BlbmQ6IFNVTShcbiAgICAgICAgRk9SIG9yZGVyIElOIDEuLjEgT1VUQk9VTkQgJHtkb2NJZChDT0xMRUNUSU9OUy5VU0VSUywgcmVzb2x2ZWRVc2VyS2V5KX0gJHtjb2xsZWN0aW9uKEVER0VTLkhBU19DVVNUT01FUl9PUkRFUil9XG4gICAgICAgICAgUkVUVVJOIFRPX05VTUJFUihvcmRlci50b3RhbFByaWNlKVxuICAgICAgKVxuICAgIH0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlVTRVJTKX1cbiAgYCk7XG5cbiAgcmV0dXJuIHNhdmVkT3JkZXI7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q3VzdG9tZXJPcmRlcnNCeVVzZXIgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHVzZXJJZDogc3RyaW5nXG4pOiBQcm9taXNlPEN1c3RvbWVyT3JkZXJUeXBlW10+ID0+IHtcbiAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgRk9SIG9yZGVyIElOIDEuLjEgT1VUQk9VTkQgJHtkb2NJZChDT0xMRUNUSU9OUy5VU0VSUywgdXNlcklkKX0gJHtjb2xsZWN0aW9uKEVER0VTLkhBU19DVVNUT01FUl9PUkRFUil9XG4gICAgICBTT1JUIG9yZGVyLnB1cmNoYXNlZEF0IERFU0NcbiAgICAgIFJFVFVSTiBvcmRlclxuICBgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbn07XG5cbmNvbnN0IHNlbmRTdXBwb3J0VGlja2V0RW1haWwgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHRpY2tldDogU3VwcG9ydFRpY2tldFR5cGVEYXRhLFxuICBkZXRhaWxzOiBzdHJpbmcsXG4gIGhlYWRpbmc6IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHVzZXIgPSBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkoYXFsYFxuICAgIFJFVFVSTiBET0NVTUVOVCgke2RvY0lkKENPTExFQ1RJT05TLlVTRVJTLCB0aWNrZXQudXNlcklkKX0pXG4gIGApLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSkgYXMgVXNlclR5cGUgfCBudWxsO1xuICBpZighdXNlcj8uZW1haWwpIHJldHVybjtcbiAgY29uc3Qgc3VwcG9ydE5hbWUgPSBjb250ZXh0LmNvbmZpZz8uZGV0YWlscz8uc3VwcG9ydE5hbWUgfHwgQ29uZmlnLmdldCgnZGV0YWlscy5zdXBwb3J0TmFtZScpIHx8ICdSZWFrdG9yIFN1cHBvcnQnO1xuICBjb25zdCBzdXBwb3J0RW1haWwgPSBjb250ZXh0LmNvbmZpZz8uZGV0YWlscz8uc3VwcG9ydEVtYWlsIHx8IENvbmZpZy5nZXQoJ2RldGFpbHMuc3VwcG9ydEVtYWlsJykgfHwgJ3N1cHBvcnRAcmVha3Rvci5pbyc7XG4gIGNvbnN0IHRpY2tldE51bWJlciA9IFN0cmluZyh0aWNrZXQudGlja2V0TnVtYmVyIHx8IHRpY2tldC5zdXBwb3J0VGlja2V0SWQgfHwgdGlja2V0Ll9rZXkgfHwgJycpO1xuICBjb25zdCBzdGF0dXNVcmwgPSBgaHR0cHM6Ly9jcm0ucmVha3Rvci5pby9zdXBwb3J0L3N0YXR1cz90aWNrZXQ9JHtlbmNvZGVVUklDb21wb25lbnQodGlja2V0TnVtYmVyKX1gO1xuICBjb25zdCB0ZXh0ID0gYCR7aGVhZGluZ31cXG5cXG5UaWNrZXQ6ICR7dGlja2V0TnVtYmVyfVxcblN0YXR1czogJHt0aWNrZXQuc3RhdHVzIHx8ICdzdWJtaXR0ZWQnfVxcblxcbiR7ZGV0YWlsc31cXG5cXG5UcmFjayB0aGlzIHRpY2tldDogJHtzdGF0dXNVcmx9YDtcbiAgYXdhaXQgc2VzU2VuZCh7XG4gICAgRGVzdGluYXRpb246IHtUb0FkZHJlc3NlczogW1N0cmluZyh1c2VyLmVtYWlsKV19LFxuICAgIE1lc3NhZ2U6IHtcbiAgICAgIEJvZHk6IHtIdG1sOiB7RGF0YTogYDxoMT4ke2VzY2FwZUh0bWwoaGVhZGluZyl9PC9oMT48cD48c3Ryb25nPlRpY2tldDo8L3N0cm9uZz4gJHtlc2NhcGVIdG1sKHRpY2tldE51bWJlcil9PC9wPjxwPjxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiAke2VzY2FwZUh0bWwoU3RyaW5nKHRpY2tldC5zdGF0dXMgfHwgJ3N1Ym1pdHRlZCcpKX08L3A+PHByZSBzdHlsZT1cIndoaXRlLXNwYWNlOnByZS13cmFwO2ZvbnQtZmFtaWx5OmluaGVyaXRcIj4ke2VzY2FwZUh0bWwoZGV0YWlscyl9PC9wcmU+PHA+PGEgaHJlZj1cIiR7ZXNjYXBlSHRtbChzdGF0dXNVcmwpfVwiPlRyYWNrIHRoaXMgdGlja2V0IG9ubGluZTwvYT48L3A+YH0sIFRleHQ6IHtEYXRhOiB0ZXh0fX0sXG4gICAgICBTdWJqZWN0OiB7RGF0YTogYFske3RpY2tldE51bWJlcn1dICR7aGVhZGluZ31gfVxuICAgIH0sXG4gICAgU291cmNlOiBgXCIke3N1cHBvcnROYW1lfVwiIDwke3N1cHBvcnRFbWFpbH0+YFxuICB9KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVN1cHBvcnRUaWNrZXQgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBQYXJ0aWFsPFN1cHBvcnRUaWNrZXRUeXBlRGF0YT5cbik6IFByb21pc2U8U3VwcG9ydFRpY2tldFR5cGVEYXRhPiA9PiB7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCB1c2VyS2V5ID0gZG9jS2V5KFN0cmluZyhpbnB1dC51c2VySWQgfHwgJycpKTtcbiAgY29uc3QgdGlja2V0S2V5ID0gZG9jS2V5KFN0cmluZyhpbnB1dC5zdXBwb3J0VGlja2V0SWQgfHwgY3JlYXRlSGFzaChgc3VwcG9ydC10aWNrZXQtJHt1c2VyS2V5fS0ke3RpbWVzdGFtcH1gKSkpO1xuICBjb25zdCB0aWNrZXROdW1iZXIgPSBjbGVhblN0cmluZyhpbnB1dC50aWNrZXROdW1iZXIsIDgwKSB8fCBgUktULSR7bmV3IERhdGUodGltZXN0YW1wKS50b0lTT1N0cmluZygpLnNsaWNlKDAsIDEwKS5yZXBsYWNlKC8tL2csICcnKX0tJHt0aWNrZXRLZXkuc2xpY2UoMCwgOCkudG9VcHBlckNhc2UoKX1gO1xuICBjb25zdCB0aWNrZXQgPSB7XG4gICAgX2tleTogdGlja2V0S2V5LFxuICAgIGFkZGVkOiB0aW1lc3RhbXAsXG4gICAgYXNzaWduZWRUb1VzZXJJZDogZG9jS2V5KFN0cmluZyhpbnB1dC5hc3NpZ25lZFRvVXNlcklkIHx8ICcnKSksXG4gICAgZGVzY3JpcHRpb246IGNsZWFuU3RyaW5nKGlucHV0LmRlc2NyaXB0aW9uLCA0MDAwKSxcbiAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgIHByaW9yaXR5OiBpbnB1dC5wcmlvcml0eSB8fCAnbm9ybWFsJyxcbiAgICBwcm9kdWN0SWQ6IGNsZWFuRXh0ZXJuYWxJZChpbnB1dC5wcm9kdWN0SWQsIDMyMCksXG4gICAgc2hvcGlmeU9yZGVySWQ6IGNsZWFuU3RyaW5nKGlucHV0LnNob3BpZnlPcmRlcklkLCAxNjApLFxuICAgIHN0YXR1czogJ3N1Ym1pdHRlZCcsXG4gICAgc3ViamVjdDogY2xlYW5TdHJpbmcoaW5wdXQuc3ViamVjdCwgMzIwKSxcbiAgICBzdXBwb3J0VGlja2V0SWQ6IHRpY2tldEtleSxcbiAgICB0aWNrZXROdW1iZXIsXG4gICAgdHlwZTogaW5wdXQudHlwZSB8fCAnZ2VuZXJhbF9zdXBwb3J0JyxcbiAgICB1c2VySWQ6IHVzZXJLZXlcbiAgfTtcbiAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgSU5TRVJUICR7dGlja2V0fSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRTKX1cbiAgICBSRVRVUk4gTkVXXG4gIGA7XG4gIGNvbnN0IHNhdmVkVGlja2V0ID0gYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xuXG4gIGF3YWl0IHNhdmVFZGdlKFxuICAgIGNvbnRleHQsXG4gICAgRURHRVMuSEFTX1NVUFBPUlRfVElDS0VULFxuICAgIGNyZWF0ZUhhc2goYGhhc1N1cHBvcnRUaWNrZXQtJHt1c2VyS2V5fS0ke3RpY2tldEtleX1gKSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5VU0VSUywgdXNlcktleSksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRTLCB0aWNrZXRLZXkpLFxuICAgIHtwcmlvcml0eTogdGlja2V0LnByaW9yaXR5LCBzdGF0dXM6IHRpY2tldC5zdGF0dXMsIHR5cGU6IHRpY2tldC50eXBlfVxuICApO1xuICBhd2FpdCBhZGRTdXBwb3J0VGlja2V0RXZlbnQoY29udGV4dCwge1xuICAgIGFjdG9yVXNlcklkOiBkb2NLZXkoU3RyaW5nKGNvbnRleHQ/LnNlc3Npb24/LnVzZXJJZCB8fCB1c2VyS2V5KSksXG4gICAgZXZlbnRUeXBlOiAnc3VibWl0dGVkJyxcbiAgICBtZXRhZGF0YToge2RldGFpbHM6IHRpY2tldC5kZXNjcmlwdGlvbn0sXG4gICAgc3VwcG9ydFRpY2tldElkOiB0aWNrZXRLZXksXG4gICAgdG9WYWx1ZTogdGlja2V0LnN0YXR1c1xuICB9KTtcblxuICByZXR1cm4gc2F2ZWRUaWNrZXQ7XG59O1xuXG5leHBvcnQgY29uc3Qgc3VibWl0UHVibGljU3VwcG9ydFRpY2tldCA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaW5wdXQ6IFB1YmxpY1N1cHBvcnRUaWNrZXRJbnB1dFxuKTogUHJvbWlzZTxTdXBwb3J0VGlja2V0VHlwZURhdGE+ID0+IHtcbiAgY29uc3QgZW1haWwgPSBjbGVhblN0cmluZyhpbnB1dC5lbWFpbCwgMzIwKS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBkZXNjcmlwdGlvbiA9IGNsZWFuU3RyaW5nKGlucHV0LmRlc2NyaXB0aW9uLCA0MDAwKTtcbiAgY29uc3Qgc3ViamVjdCA9IGNsZWFuU3RyaW5nKGlucHV0LnN1YmplY3QsIDMyMCk7XG4gIGlmKCFlbWFpbFBhdHRlcm4udGVzdChlbWFpbCkpIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWRfdmFsaWRfZW1haWwnKTtcbiAgaWYoIXN1YmplY3QpIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWRfc3ViamVjdCcpO1xuICBpZighZGVzY3JpcHRpb24pIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWRfZGVzY3JpcHRpb24nKTtcblxuICBjb25zdCBkYXRhYmFzZSA9IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUX0VWRU5UUyxcbiAgICBDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVF9NRVNTQUdFUyxcbiAgICBDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsXG4gICAgQ09MTEVDVElPTlMuVVNFUlNcbiAgXS5tYXAoKG5hbWUpID0+IGVuc3VyZURvY3VtZW50Q29sbGVjdGlvbihkYXRhYmFzZSwgbmFtZSkpKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIEVER0VTLkhBU19TVVBQT1JUX1RJQ0tFVCxcbiAgICBFREdFUy5IQVNfU1VQUE9SVF9USUNLRVRfRVZFTlQsXG4gICAgRURHRVMuSEFTX1NVUFBPUlRfVElDS0VUX01FU1NBR0VcbiAgXS5tYXAoKG5hbWUpID0+IGVuc3VyZUVkZ2VDb2xsZWN0aW9uKGRhdGFiYXNlLCBuYW1lKSkpO1xuXG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCBnZW5lcmF0ZWRVc2VyS2V5ID0gY3JlYXRlSGFzaChlbWFpbCwgbnVsbCk7XG4gIGNvbnN0IG9wdGVkSW4gPSBpbnB1dC5tYXJrZXRpbmdPcHRJbiA9PT0gdHJ1ZTtcbiAgY29uc3QgdXNlckluc2VydCA9IHtcbiAgICBfa2V5OiBnZW5lcmF0ZWRVc2VyS2V5LFxuICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICBlbWFpbCxcbiAgICBmaXJzdE5hbWU6IGNsZWFuU3RyaW5nKGlucHV0LmZpcnN0TmFtZSwgMTYwKSxcbiAgICBsYXN0TmFtZTogY2xlYW5TdHJpbmcoaW5wdXQubGFzdE5hbWUsIDE2MCksXG4gICAgbWFpbGluZ0xpc3Q6IG9wdGVkSW4sXG4gICAgbWFya2V0aW5nT3B0SW46IG9wdGVkSW4sXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICB1c2VySWQ6IGdlbmVyYXRlZFVzZXJLZXlcbiAgfTtcbiAgY29uc3QgdXNlclVwZGF0ZSA9IHtcbiAgICAuLi4ob3B0ZWRJbiA/IHttYWlsaW5nTGlzdDogdHJ1ZSwgbWFya2V0aW5nT3B0SW46IHRydWUsIG1hcmtldGluZ09wdEluQXQ6IHRpbWVzdGFtcH0gOiB7fSksXG4gICAgZmlyc3ROYW1lOiBjbGVhblN0cmluZyhpbnB1dC5maXJzdE5hbWUsIDE2MCkgfHwgdW5kZWZpbmVkLFxuICAgIGxhc3ROYW1lOiBjbGVhblN0cmluZyhpbnB1dC5sYXN0TmFtZSwgMTYwKSB8fCB1bmRlZmluZWQsXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcFxuICB9O1xuICBjb25zdCB1c2VyID0gYXdhaXQgZGF0YWJhc2UucXVlcnkoYXFsYFxuICAgIFVQU0VSVCB7ZW1haWw6ICR7ZW1haWx9fVxuICAgICAgSU5TRVJUICR7dXNlckluc2VydH1cbiAgICAgIFVQREFURSAke3VzZXJVcGRhdGV9XG4gICAgICBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuVVNFUlMpfVxuICAgICAgUkVUVVJOIE5FV1xuICBgKS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpIGFzIFVzZXJUeXBlO1xuICBjb25zdCB0aWNrZXQgPSBhd2FpdCBjcmVhdGVTdXBwb3J0VGlja2V0KGNvbnRleHQsIHtcbiAgICBkZXNjcmlwdGlvbixcbiAgICBwcmlvcml0eTogc3VwcG9ydFByaW9yaXRpZXMuaGFzKFN0cmluZyhpbnB1dC5wcmlvcml0eSkpID8gaW5wdXQucHJpb3JpdHkgOiAnbm9ybWFsJyxcbiAgICBzdWJqZWN0LFxuICAgIHR5cGU6IHN1cHBvcnRUeXBlcy5oYXMoU3RyaW5nKGlucHV0LnR5cGUpKSA/IGlucHV0LnR5cGUgOiAnZ2VuZXJhbF9zdXBwb3J0JyxcbiAgICB1c2VySWQ6IFN0cmluZyh1c2VyPy5fa2V5IHx8IHVzZXI/LnVzZXJJZCB8fCBnZW5lcmF0ZWRVc2VyS2V5KVxuICB9KTtcbiAgYXdhaXQgc2VuZFN1cHBvcnRUaWNrZXRFbWFpbChjb250ZXh0LCB0aWNrZXQsIGRlc2NyaXB0aW9uLCAnV2UgcmVjZWl2ZWQgeW91ciBzdXBwb3J0IHRpY2tldCcpO1xuICByZXR1cm4gdGlja2V0O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFB1YmxpY1N1cHBvcnRUaWNrZXQgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHRpY2tldE51bWJlcjogc3RyaW5nLFxuICBlbWFpbEFkZHJlc3M6IHN0cmluZ1xuKTogUHJvbWlzZTxQdWJsaWNTdXBwb3J0VGlja2V0RmVlZCB8IG51bGw+ID0+IHtcbiAgY29uc3QgZW1haWwgPSBjbGVhblN0cmluZyhlbWFpbEFkZHJlc3MsIDMyMCkudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgbnVtYmVyID0gY2xlYW5TdHJpbmcodGlja2V0TnVtYmVyLCA4MCkudG9VcHBlckNhc2UoKTtcbiAgaWYoIWVtYWlsUGF0dGVybi50ZXN0KGVtYWlsKSB8fCAhbnVtYmVyKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgZGF0YWJhc2UgPSB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSk7XG4gIGlmKCFhd2FpdCBkYXRhYmFzZS5jb2xsZWN0aW9uKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUUykuZXhpc3RzKCkpIHJldHVybiBudWxsO1xuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsYFxuICAgIEZPUiB0aWNrZXQgSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUUyl9XG4gICAgICBGSUxURVIgVVBQRVIodGlja2V0LnRpY2tldE51bWJlcikgPT0gJHtudW1iZXJ9XG4gICAgICBMRVQgdXNlciA9IERPQ1VNRU5UKCR7Q09MTEVDVElPTlMuVVNFUlN9LCB0aWNrZXQudXNlcklkKVxuICAgICAgRklMVEVSIExPV0VSKHVzZXIuZW1haWwpID09ICR7ZW1haWx9XG4gICAgICBMRVQgbWVzc2FnZXMgPSAoXG4gICAgICAgIEZPUiBtZXNzYWdlIElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVF9NRVNTQUdFUyl9XG4gICAgICAgICAgRklMVEVSIG1lc3NhZ2Uuc3VwcG9ydFRpY2tldElkID09IHRpY2tldC5fa2V5IEFORCBtZXNzYWdlLnZpc2liaWxpdHkgPT0gXCJjdXN0b21lclwiXG4gICAgICAgICAgU09SVCBtZXNzYWdlLmFkZGVkIEFTQ1xuICAgICAgICAgIFJFVFVSTiBtZXNzYWdlXG4gICAgICApXG4gICAgICBMRVQgZXZlbnRzID0gKFxuICAgICAgICBGT1IgZXZlbnQgSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUX0VWRU5UUyl9XG4gICAgICAgICAgRklMVEVSIGV2ZW50LnN1cHBvcnRUaWNrZXRJZCA9PSB0aWNrZXQuX2tleVxuICAgICAgICAgIFNPUlQgZXZlbnQuYWRkZWQgQVNDXG4gICAgICAgICAgUkVUVVJOIGV2ZW50XG4gICAgICApXG4gICAgICBMSU1JVCAxXG4gICAgICBSRVRVUk4ge3RpY2tldCwgbWVzc2FnZXMsIGV2ZW50c31cbiAgYCkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKSBhcyBQcm9taXNlPFB1YmxpY1N1cHBvcnRUaWNrZXRGZWVkIHwgbnVsbD47XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U3VwcG9ydFRpY2tldHMgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGZpbHRlcnM6IHtyZWFkb25seSBzdGF0dXM/OiBzdHJpbmc7IHJlYWRvbmx5IHVzZXJJZD86IHN0cmluZ30gPSB7fVxuKTogUHJvbWlzZTxTdXBwb3J0VGlja2V0VHlwZURhdGFbXT4gPT4ge1xuICBjb25zdCBkYXRhYmFzZSA9IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKTtcbiAgcmV0dXJuIChhc3luYyAoKSA9PiB7XG4gICAgaWYoIWF3YWl0IGRhdGFiYXNlLmNvbGxlY3Rpb24oQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRTKS5leGlzdHMoKSkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgICAgRk9SIHRpY2tldCBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRTKX1cbiAgICAgICAgJHtmaWx0ZXJzLnN0YXR1cyA/IGFxbGBGSUxURVIgdGlja2V0LnN0YXR1cyA9PSAke2ZpbHRlcnMuc3RhdHVzfWAgOiBhcWxgYH1cbiAgICAgICAgJHtmaWx0ZXJzLnVzZXJJZCA/IGFxbGBGSUxURVIgdGlja2V0LnVzZXJJZCA9PSAke2RvY0tleShmaWx0ZXJzLnVzZXJJZCl9YCA6IGFxbGBgfVxuICAgICAgICBMRVQgdXNlciA9IERPQ1VNRU5UKCR7Q09MTEVDVElPTlMuVVNFUlN9LCB0aWNrZXQudXNlcklkKVxuICAgICAgICBTT1JUIHRpY2tldC5hZGRlZCBERVNDXG4gICAgICAgIFJFVFVSTiBNRVJHRSh0aWNrZXQsIHt1c2VyfSlcbiAgICBgO1xuICAgIHJldHVybiBkYXRhYmFzZS5xdWVyeShxdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpO1xuICB9KSgpO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZVN1cHBvcnRUaWNrZXRTdGF0dXMgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHN1cHBvcnRUaWNrZXRJZDogc3RyaW5nLFxuICBzdGF0dXM6IFN1cHBvcnRUaWNrZXRTdGF0dXMsXG4gIHJlc29sdXRpb25TdW1tYXJ5ID0gJydcbik6IFByb21pc2U8U3VwcG9ydFRpY2tldFR5cGVEYXRhPiA9PiB7XG4gIGNvbnN0IHRpY2tldEtleSA9IGRvY0tleShzdXBwb3J0VGlja2V0SWQpO1xuICBjb25zdCB0aW1lc3RhbXAgPSBub3coKTtcbiAgY29uc3QgcHJldmlvdXMgPSBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSlcbiAgICAucXVlcnkoYXFsYFJFVFVSTiBET0NVTUVOVCgke2RvY0lkKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUUywgdGlja2V0S2V5KX0pYClcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKSBhcyBTdXBwb3J0VGlja2V0VHlwZURhdGEgfCBudWxsO1xuICBjb25zdCB1cGRhdGUgPSB7XG4gICAgLi4uKHN0YXR1cyA9PT0gJ2NvbXBsZXRlZCcgJiYge2NvbXBsZXRlZEF0OiB0aW1lc3RhbXAsIHJlc29sdXRpb25TdW1tYXJ5OiBjbGVhblN0cmluZyhyZXNvbHV0aW9uU3VtbWFyeSwgNDAwMCl9KSxcbiAgICAuLi4oc3RhdHVzID09PSAnZG9uZScgJiYge2RvbmVBdDogdGltZXN0YW1wLCByZXNvbHV0aW9uU3VtbWFyeTogY2xlYW5TdHJpbmcocmVzb2x1dGlvblN1bW1hcnksIDQwMDApfSksXG4gICAgLi4uKHN0YXR1cyA9PT0gJ3Jlc29sdmVkJyAmJiB7cmVzb2x2ZWRBdDogdGltZXN0YW1wLCByZXNvbHV0aW9uU3VtbWFyeTogY2xlYW5TdHJpbmcocmVzb2x1dGlvblN1bW1hcnksIDQwMDApfSksXG4gICAgLi4uKHN0YXR1cyA9PT0gJ2Nsb3NlZCcgJiYge2Nsb3NlZEF0OiB0aW1lc3RhbXB9KSxcbiAgICBsYXN0VXBkYXRlRGV0YWlsczogY2xlYW5TdHJpbmcocmVzb2x1dGlvblN1bW1hcnksIDQwMDApLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgc3RhdHVzXG4gIH07XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIFVQREFURSAke3RpY2tldEtleX0gV0lUSCAke3VwZGF0ZX0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUUyl9XG4gICAgUkVUVVJOIE5FV1xuICBgO1xuICBjb25zdCB0aWNrZXQgPSBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSkgYXMgU3VwcG9ydFRpY2tldFR5cGVEYXRhO1xuXG4gIGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxgXG4gICAgRk9SIGVkZ2UgSU4gJHtjb2xsZWN0aW9uKEVER0VTLkhBU19TVVBQT1JUX1RJQ0tFVCl9XG4gICAgICBGSUxURVIgZWRnZS5fdG8gPT0gJHtkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIHRpY2tldEtleSl9XG4gICAgICBVUERBVEUgZWRnZSBXSVRIICR7e1xuICAgICAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgICAgICByZXNvbHZlZEF0OiBzdGF0dXMgPT09ICdyZXNvbHZlZCcgPyB0aW1lc3RhbXAgOiB1bmRlZmluZWQsXG4gICAgICAgIHN0YXR1c1xuICAgICAgfX0gSU4gJHtjb2xsZWN0aW9uKEVER0VTLkhBU19TVVBQT1JUX1RJQ0tFVCl9XG4gIGApO1xuICBhd2FpdCBhZGRTdXBwb3J0VGlja2V0RXZlbnQoY29udGV4dCwge1xuICAgIGFjdG9yVXNlcklkOiBkb2NLZXkoU3RyaW5nKGNvbnRleHQ/LnNlc3Npb24/LnVzZXJJZCB8fCAnJykpLFxuICAgIGV2ZW50VHlwZTogJ3N0YXR1c19jaGFuZ2VkJyxcbiAgICBmcm9tVmFsdWU6IHByZXZpb3VzPy5zdGF0dXMsXG4gICAgc3VwcG9ydFRpY2tldElkOiB0aWNrZXRLZXksXG4gICAgdG9WYWx1ZTogc3RhdHVzXG4gIH0pO1xuXG4gIGlmKHN0YXR1cyA9PT0gJ3Jlc29sdmVkJykge1xuICAgIGF3YWl0IGNyZWF0ZUN1c3RvbWVyTm90aWZpY2F0aW9uKGNvbnRleHQsIHtcbiAgICAgIGJvZHk6IGNsZWFuU3RyaW5nKHJlc29sdXRpb25TdW1tYXJ5IHx8ICdZb3VyIHN1cHBvcnQgdGlja2V0IGhhcyBiZWVuIHJlc29sdmVkLicsIDQwMDApLFxuICAgICAgc3RhdHVzOiAncXVldWVkJyxcbiAgICAgIHN1YmplY3Q6IGBSZXNvbHZlZDogJHt0aWNrZXQuc3ViamVjdCB8fCAnU3VwcG9ydCB0aWNrZXQnfWAsXG4gICAgICBzdXBwb3J0VGlja2V0SWQ6IHRpY2tldEtleSxcbiAgICAgIHR5cGU6ICdzdXBwb3J0X3RpY2tldF9yZXNvbHZlZCcsXG4gICAgICB1c2VySWQ6IHRpY2tldC51c2VySWRcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0aWNrZXQ7XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlU3VwcG9ydFRpY2tldFByb2dyZXNzID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBzdXBwb3J0VGlja2V0SWQ6IHN0cmluZyxcbiAgc3RhdHVzOiBTdXBwb3J0VGlja2V0U3RhdHVzLFxuICBkZXRhaWxzOiBzdHJpbmdcbik6IFByb21pc2U8U3VwcG9ydFRpY2tldFR5cGVEYXRhPiA9PiB7XG4gIHJlcXVpcmVDcm1BZG1pbihjb250ZXh0KTtcbiAgaWYoIXN1cHBvcnRTdGF0dXNlcy5oYXMoc3RhdHVzKSkgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkX3N1cHBvcnRfdGlja2V0X3N0YXR1cycpO1xuICBjb25zdCBtYXJrZG93biA9IGNsZWFuU3RyaW5nKGRldGFpbHMsIDQwMDApO1xuICBpZighbWFya2Rvd24pIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWRfdXBkYXRlX2RldGFpbHMnKTtcbiAgY29uc3QgdGlja2V0ID0gYXdhaXQgdXBkYXRlU3VwcG9ydFRpY2tldFN0YXR1cyhjb250ZXh0LCBzdXBwb3J0VGlja2V0SWQsIHN0YXR1cywgbWFya2Rvd24pO1xuICBhd2FpdCBhZGRTdXBwb3J0VGlja2V0TWVzc2FnZShjb250ZXh0LCB7XG4gICAgYXV0aG9yVXNlcklkOiBTdHJpbmcoY29udGV4dC5zZXNzaW9uPy51c2VySWQgfHwgJycpLFxuICAgIGJvZHk6IG1hcmtkb3duLFxuICAgIHN1cHBvcnRUaWNrZXRJZCxcbiAgICB2aXNpYmlsaXR5OiAnY3VzdG9tZXInXG4gIH0pO1xuICBhd2FpdCBjcmVhdGVDdXN0b21lck5vdGlmaWNhdGlvbihjb250ZXh0LCB7XG4gICAgYm9keTogbWFya2Rvd24sXG4gICAgc3RhdHVzOiAnc2VudCcsXG4gICAgc3ViamVjdDogYFRpY2tldCAke3RpY2tldC50aWNrZXROdW1iZXIgfHwgc3VwcG9ydFRpY2tldElkfTogJHtzdGF0dXMucmVwbGFjZSgvXy9nLCAnICcpfWAsXG4gICAgc3VwcG9ydFRpY2tldElkLFxuICAgIHR5cGU6ICdzdXBwb3J0X3RpY2tldF9wcm9ncmVzcycsXG4gICAgdXNlcklkOiB0aWNrZXQudXNlcklkXG4gIH0pO1xuICBhd2FpdCBzZW5kU3VwcG9ydFRpY2tldEVtYWlsKGNvbnRleHQsIHRpY2tldCwgbWFya2Rvd24sIGBTdXBwb3J0IHRpY2tldCAke3N0YXR1cy5yZXBsYWNlKC9fL2csICcgJyl9YCk7XG4gIHJldHVybiB0aWNrZXQ7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkU3VwcG9ydFRpY2tldE1lc3NhZ2UgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBQYXJ0aWFsPFN1cHBvcnRUaWNrZXRNZXNzYWdlVHlwZT5cbik6IFByb21pc2U8U3VwcG9ydFRpY2tldE1lc3NhZ2VUeXBlPiA9PiB7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCB0aWNrZXRLZXkgPSBkb2NLZXkoU3RyaW5nKGlucHV0LnN1cHBvcnRUaWNrZXRJZCB8fCAnJykpO1xuICBjb25zdCBtZXNzYWdlS2V5ID0gZG9jS2V5KFN0cmluZyhpbnB1dC5zdXBwb3J0VGlja2V0TWVzc2FnZUlkIHx8IGNyZWF0ZUhhc2goYHN1cHBvcnQtdGlja2V0LW1lc3NhZ2UtJHt0aWNrZXRLZXl9LSR7dGltZXN0YW1wfWApKSk7XG4gIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgX2tleTogbWVzc2FnZUtleSxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIGF1dGhvclVzZXJJZDogZG9jS2V5KFN0cmluZyhpbnB1dC5hdXRob3JVc2VySWQgfHwgY29udGV4dD8uc2Vzc2lvbj8udXNlcklkIHx8ICcnKSksXG4gICAgYm9keTogY2xlYW5TdHJpbmcoaW5wdXQuYm9keSwgNDAwMCksXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBzdXBwb3J0VGlja2V0SWQ6IHRpY2tldEtleSxcbiAgICBzdXBwb3J0VGlja2V0TWVzc2FnZUlkOiBtZXNzYWdlS2V5LFxuICAgIHZpc2liaWxpdHk6IGlucHV0LnZpc2liaWxpdHkgfHwgJ2N1c3RvbWVyJ1xuICB9O1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBJTlNFUlQgJHttZXNzYWdlfSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRfTUVTU0FHRVMpfVxuICAgIFJFVFVSTiBORVdcbiAgYDtcbiAgY29uc3Qgc2F2ZWRNZXNzYWdlID0gYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xuXG4gIGF3YWl0IHNhdmVFZGdlKFxuICAgIGNvbnRleHQsXG4gICAgRURHRVMuSEFTX1NVUFBPUlRfVElDS0VUX01FU1NBR0UsXG4gICAgY3JlYXRlSGFzaChgaGFzU3VwcG9ydFRpY2tldE1lc3NhZ2UtJHt0aWNrZXRLZXl9LSR7bWVzc2FnZUtleX1gKSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIHRpY2tldEtleSksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRfTUVTU0FHRVMsIG1lc3NhZ2VLZXkpLFxuICAgIHthdXRob3JVc2VySWQ6IG1lc3NhZ2UuYXV0aG9yVXNlcklkLCB2aXNpYmlsaXR5OiBtZXNzYWdlLnZpc2liaWxpdHl9XG4gICk7XG5cbiAgcmV0dXJuIHNhdmVkTWVzc2FnZTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTdXBwb3J0VGlja2V0TWVzc2FnZXMgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHN1cHBvcnRUaWNrZXRJZDogc3RyaW5nXG4pOiBQcm9taXNlPFN1cHBvcnRUaWNrZXRNZXNzYWdlVHlwZVtdPiA9PiB7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBtZXNzYWdlIElOIDEuLjEgT1VUQk9VTkQgJHtkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIHN1cHBvcnRUaWNrZXRJZCl9ICR7Y29sbGVjdGlvbihFREdFUy5IQVNfU1VQUE9SVF9USUNLRVRfTUVTU0FHRSl9XG4gICAgICBTT1JUIG1lc3NhZ2UuYWRkZWQgQVNDXG4gICAgICBSRVRVUk4gbWVzc2FnZVxuICBgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRTdXBwb3J0VGlja2V0RXZlbnQgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBQYXJ0aWFsPFN1cHBvcnRUaWNrZXRFdmVudFR5cGU+XG4pOiBQcm9taXNlPFN1cHBvcnRUaWNrZXRFdmVudFR5cGU+ID0+IHtcbiAgY29uc3QgdGltZXN0YW1wID0gbm93KCk7XG4gIGNvbnN0IHRpY2tldEtleSA9IGRvY0tleShTdHJpbmcoaW5wdXQuc3VwcG9ydFRpY2tldElkIHx8ICcnKSk7XG4gIGNvbnN0IGV2ZW50S2V5ID0gZG9jS2V5KFN0cmluZyhpbnB1dC5zdXBwb3J0VGlja2V0RXZlbnRJZCB8fCBjcmVhdGVIYXNoKGBzdXBwb3J0LXRpY2tldC1ldmVudC0ke3RpY2tldEtleX0tJHt0aW1lc3RhbXB9LSR7aW5wdXQuZXZlbnRUeXBlfWApKSk7XG4gIGNvbnN0IGV2ZW50ID0ge1xuICAgIF9rZXk6IGV2ZW50S2V5LFxuICAgIGFkZGVkOiB0aW1lc3RhbXAsXG4gICAgYWN0b3JVc2VySWQ6IGRvY0tleShTdHJpbmcoaW5wdXQuYWN0b3JVc2VySWQgfHwgJycpKSxcbiAgICBldmVudFR5cGU6IGNsZWFuU3RyaW5nKGlucHV0LmV2ZW50VHlwZSwgMTYwKSxcbiAgICBmcm9tVmFsdWU6IGNsZWFuU3RyaW5nKGlucHV0LmZyb21WYWx1ZSwgMzIwKSxcbiAgICBtZXRhZGF0YTogaW5wdXQubWV0YWRhdGEgfHwge30sXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBzdXBwb3J0VGlja2V0RXZlbnRJZDogZXZlbnRLZXksXG4gICAgc3VwcG9ydFRpY2tldElkOiB0aWNrZXRLZXksXG4gICAgdG9WYWx1ZTogY2xlYW5TdHJpbmcoaW5wdXQudG9WYWx1ZSwgMzIwKVxuICB9O1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBJTlNFUlQgJHtldmVudH0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUX0VWRU5UUyl9XG4gICAgUkVUVVJOIE5FV1xuICBgO1xuICBjb25zdCBzYXZlZEV2ZW50ID0gYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xuXG4gIGF3YWl0IHNhdmVFZGdlKFxuICAgIGNvbnRleHQsXG4gICAgRURHRVMuSEFTX1NVUFBPUlRfVElDS0VUX0VWRU5ULFxuICAgIGNyZWF0ZUhhc2goYGhhc1N1cHBvcnRUaWNrZXRFdmVudC0ke3RpY2tldEtleX0tJHtldmVudEtleX1gKSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIHRpY2tldEtleSksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRfRVZFTlRTLCBldmVudEtleSksXG4gICAge2FjdG9yVXNlcklkOiBldmVudC5hY3RvclVzZXJJZCwgZXZlbnRUeXBlOiBldmVudC5ldmVudFR5cGV9XG4gICk7XG5cbiAgcmV0dXJuIHNhdmVkRXZlbnQ7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U3VwcG9ydFRpY2tldEV2ZW50cyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgc3VwcG9ydFRpY2tldElkOiBzdHJpbmdcbik6IFByb21pc2U8U3VwcG9ydFRpY2tldEV2ZW50VHlwZVtdPiA9PiB7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBldmVudCBJTiAxLi4xIE9VVEJPVU5EICR7ZG9jSWQoQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRTLCBzdXBwb3J0VGlja2V0SWQpfSAke2NvbGxlY3Rpb24oRURHRVMuSEFTX1NVUFBPUlRfVElDS0VUX0VWRU5UKX1cbiAgICAgIFNPUlQgZXZlbnQuYWRkZWQgQVNDXG4gICAgICBSRVRVUk4gZXZlbnRcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlQ3VzdG9tZXJOb3RpZmljYXRpb24gPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBQYXJ0aWFsPEN1c3RvbWVyTm90aWZpY2F0aW9uVHlwZT5cbik6IFByb21pc2U8Q3VzdG9tZXJOb3RpZmljYXRpb25UeXBlPiA9PiB7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCB1c2VyS2V5ID0gZG9jS2V5KFN0cmluZyhpbnB1dC51c2VySWQgfHwgJycpKTtcbiAgY29uc3Qgbm90aWZpY2F0aW9uS2V5ID0gZG9jS2V5KFN0cmluZyhpbnB1dC5jdXN0b21lck5vdGlmaWNhdGlvbklkIHx8IGNyZWF0ZUhhc2goYGN1c3RvbWVyLW5vdGlmaWNhdGlvbi0ke3VzZXJLZXl9LSR7dGltZXN0YW1wfWApKSk7XG4gIGNvbnN0IG5vdGlmaWNhdGlvbiA9IHtcbiAgICBfa2V5OiBub3RpZmljYXRpb25LZXksXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICBib2R5OiBjbGVhblN0cmluZyhpbnB1dC5ib2R5LCA0MDAwKSxcbiAgICBjdXN0b21lck5vdGlmaWNhdGlvbklkOiBub3RpZmljYXRpb25LZXksXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBzZW50QXQ6IGlucHV0LnNlbnRBdCxcbiAgICBzdGF0dXM6IGlucHV0LnN0YXR1cyB8fCAncXVldWVkJyxcbiAgICBzdWJqZWN0OiBjbGVhblN0cmluZyhpbnB1dC5zdWJqZWN0LCAzMjApLFxuICAgIHN1cHBvcnRUaWNrZXRJZDogZG9jS2V5KFN0cmluZyhpbnB1dC5zdXBwb3J0VGlja2V0SWQgfHwgJycpKSxcbiAgICB0eXBlOiBjbGVhblN0cmluZyhpbnB1dC50eXBlLCAxNjApLFxuICAgIHVzZXJJZDogdXNlcktleVxuICB9O1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBJTlNFUlQgJHtub3RpZmljYXRpb259IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5DVVNUT01FUl9OT1RJRklDQVRJT05TKX1cbiAgICBSRVRVUk4gTkVXXG4gIGA7XG4gIGNvbnN0IHNhdmVkTm90aWZpY2F0aW9uID0gYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xuXG4gIGF3YWl0IHNhdmVFZGdlKFxuICAgIGNvbnRleHQsXG4gICAgRURHRVMuSEFTX0NVU1RPTUVSX05PVElGSUNBVElPTixcbiAgICBjcmVhdGVIYXNoKGBoYXNDdXN0b21lck5vdGlmaWNhdGlvbi0ke3VzZXJLZXl9LSR7bm90aWZpY2F0aW9uS2V5fWApLFxuICAgIGRvY0lkKENPTExFQ1RJT05TLlVTRVJTLCB1c2VyS2V5KSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5DVVNUT01FUl9OT1RJRklDQVRJT05TLCBub3RpZmljYXRpb25LZXkpLFxuICAgIHtcbiAgICAgIHN0YXR1czogbm90aWZpY2F0aW9uLnN0YXR1cyxcbiAgICAgIHN1cHBvcnRUaWNrZXRJZDogbm90aWZpY2F0aW9uLnN1cHBvcnRUaWNrZXRJZCxcbiAgICAgIHR5cGU6IG5vdGlmaWNhdGlvbi50eXBlXG4gICAgfVxuICApO1xuXG4gIHJldHVybiBzYXZlZE5vdGlmaWNhdGlvbjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDdXN0b21lck5vdGlmaWNhdGlvbnNCeVVzZXIgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHVzZXJJZDogc3RyaW5nXG4pOiBQcm9taXNlPEN1c3RvbWVyTm90aWZpY2F0aW9uVHlwZVtdPiA9PiB7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBub3RpZmljYXRpb24gSU4gMS4uMSBPVVRCT1VORCAke2RvY0lkKENPTExFQ1RJT05TLlVTRVJTLCB1c2VySWQpfSAke2NvbGxlY3Rpb24oRURHRVMuSEFTX0NVU1RPTUVSX05PVElGSUNBVElPTil9XG4gICAgICBTT1JUIG5vdGlmaWNhdGlvbi5hZGRlZCBERVNDXG4gICAgICBSRVRVUk4gbm90aWZpY2F0aW9uXG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpO1xufTtcbiJdLCJuYW1lcyI6WyJjcmVhdGVIYXNoIiwicGFyc2VJZCIsInBhcnNlUGhvbmUiLCJwYXJzZVN0cmluZyIsImFxbCIsImxpdGVyYWwiLCJDT0xMRUNUSU9OUyIsIkVER0VTIiwiQ29uZmlnIiwidXNlRGIiLCJpc0FkbWluVXNlciIsInNlc1NlbmQiLCJub3ciLCJEYXRlIiwiY29sbGVjdGlvbiIsIm5hbWUiLCJkb2NLZXkiLCJ2YWx1ZSIsIlN0cmluZyIsImRvY0lkIiwiY29sbGVjdGlvbk5hbWUiLCJrZXkiLCJleHRlcm5hbEtleSIsInByZWZpeCIsImlkIiwiY2xlYW5TdHJpbmciLCJsZW5ndGgiLCJjbGVhbkV4dGVybmFsSWQiLCJ0cmltIiwic2xpY2UiLCJlbnN1cmVEb2N1bWVudENvbGxlY3Rpb24iLCJkYXRhYmFzZSIsInRhcmdldCIsImV4aXN0cyIsImNyZWF0ZUNvbGxlY3Rpb24iLCJlcnJvciIsImVuc3VyZUVkZ2VDb2xsZWN0aW9uIiwiY3JlYXRlRWRnZUNvbGxlY3Rpb24iLCJyZXF1aXJlQ3JtQWRtaW4iLCJjb250ZXh0Iiwic2Vzc2lvbiIsIkVycm9yIiwicmVxdWlyZUNybUFkbWluaXN0cmF0b3IiLCJhbGxvd2VkQ29udGFjdEZpZWxkcyIsIlNldCIsInN1cHBvcnRQcmlvcml0aWVzIiwic3VwcG9ydFN0YXR1c2VzIiwic3VwcG9ydFR5cGVzIiwiZW1haWxQYXR0ZXJuIiwiZXNjYXBlSHRtbCIsInJlcGxhY2UiLCJzYW5pdGl6ZUh0bWwiLCJzYW5pdGl6ZUNzcyIsImh0bWxUb1RleHQiLCJjaHVuayIsIml0ZW1zIiwic2l6ZSIsImdyb3VwcyIsImluZGV4IiwicHVzaCIsInN1Ym1pdENybUZvcm0iLCJpbnB1dCIsIm1hcmtldGluZ09wdEluIiwiZW1haWwiLCJ0b0xvd2VyQ2FzZSIsInJhd1Bob25lIiwicGhvbmUiLCJkYXRhYmFzZU5hbWUiLCJDUk1fRk9STV9TVUJNSVNTSU9OUyIsInRpbWVzdGFtcCIsInNvdXJjZSIsImZvcm1JZCIsInZhbHVlcyIsImZpcnN0TmFtZSIsImxhc3ROYW1lIiwiZ2VuZXJhdGVkVXNlcktleSIsImNvbnNlbnQiLCJtYXJrZXRpbmdPcHRJbkF0IiwibWFya2V0aW5nT3B0T3V0QXQiLCJ1c2VySW5zZXJ0IiwiX2tleSIsImFjdGl2ZSIsImFkZGVkIiwibWFpbGluZ0xpc3QiLCJtYXJrZXRpbmdDb25zZW50U291cmNlIiwibW9kaWZpZWQiLCJ0eXBlIiwidXNlckFjY2VzcyIsInVzZXJJZCIsInZlcmlmaWVkRW1haWwiLCJ2ZXJpZmllZFBob25lIiwidXNlclVwZGF0ZSIsInVzZXIiLCJxdWVyeSIsIlVTRVJTIiwidGhlbiIsImN1cnNvciIsIm5leHQiLCJzdWJtaXNzaW9uSWQiLCJzdWJtaXNzaW9uIiwic2F2ZWQiLCJnZXRDcm1Gb3JtU3VibWlzc2lvbnMiLCJhbGwiLCJnZXRDcm1Db250YWN0cyIsImZpbHRlciIsInNlYXJjaCIsImZpZWxkIiwiaGFzIiwib3B0ZWRJbk9ubHkiLCJvcGVyYXRvciIsImluY2x1ZGVzIiwic2VuZENybUNhbXBhaWduIiwic3ViamVjdCIsImJvZHlIdG1sIiwiaHRtbCIsImNzcyIsImNhbmRpZGF0ZXMiLCJzZWxlY3RlZElkcyIsInVzZXJJZHMiLCJtYXAiLCJyZWNpcGllbnRzIiwiQm9vbGVhbiIsImNhbXBhaWduSWQiLCJjYW1wYWlnbiIsImZhaWxlZENvdW50IiwicmVjaXBpZW50Q291bnQiLCJzZW50Q291bnQiLCJzdGF0dXMiLCJDUk1fQ0FNUEFJR05TIiwicmVjaXBpZW50c0JhdGNoIiwiRGVzdGluYXRpb24iLCJCY2NBZGRyZXNzZXMiLCJyZWNpcGllbnQiLCJNZXNzYWdlIiwiQm9keSIsIkh0bWwiLCJEYXRhIiwiVGV4dCIsIlN1YmplY3QiLCJTb3VyY2UiLCJjb25maWciLCJkZXRhaWxzIiwic3VwcG9ydE5hbWUiLCJzdXBwb3J0RW1haWwiLCJfZXJyb3IiLCJyZXN1bHQiLCJzZW50QXQiLCJzYXZlRWRnZSIsImVkZ2VDb2xsZWN0aW9uIiwiZWRnZUtleSIsImZyb20iLCJ0byIsImRhdGEiLCJlZGdlIiwiX2Zyb20iLCJfdG8iLCJjcmVhdGVNYWlsaW5nTGlzdCIsIm1haWxpbmdMaXN0SWQiLCJjcmVhdGVkQnlVc2VySWQiLCJkZXNjcmlwdGlvbiIsIk1BSUxJTkdfTElTVFMiLCJnZXRNYWlsaW5nTGlzdHMiLCJhZGRVc2VyVG9NYWlsaW5nTGlzdCIsInVzZXJLZXkiLCJsaXN0S2V5IiwiSEFTX01BSUxJTkdfTElTVCIsImFkZGVkQnlVc2VySWQiLCJyZW1vdmVVc2VyRnJvbU1haWxpbmdMaXN0IiwidXBkYXRlIiwicmVtb3ZlZEF0IiwiZ2V0TWFpbGluZ0xpc3RVc2VycyIsImxpc3RJZCIsImdldFVzZXJzQnlQdXJjaGFzZWRQcm9kdWN0IiwicHJvZHVjdElkIiwicHJvZHVjdEtleSIsIlNIT1BJRllfUFJPRFVDVFMiLCJIQVNfUFVSQ0hBU0VEX1BST0RVQ1QiLCJIQVNfQ1VTVE9NRVJfT1JERVIiLCJnZXRFbGlnaWJsZU1haWxpbmdVc2VycyIsIm9wdGlvbnMiLCJleGNsdWRlT3BlblN1cHBvcnRUaWNrZXRzIiwiSEFTX1NVUFBPUlRfVElDS0VUIiwiaW5nZXN0U2hvcGlmeUN1c3RvbWVyT3JkZXIiLCJzaG9waWZ5Q3VzdG9tZXJJZCIsInNob3BpZnlPcmRlcklkIiwiY3VzdG9tZXIiLCJwcm9kdWN0SWRzIiwiQXJyYXkiLCJwcm9kdWN0cyIsInByb2R1Y3QiLCJ1bmRlZmluZWQiLCJsYXN0UHVyY2hhc2VkQXQiLCJwdXJjaGFzZWRBdCIsInVzZXJRdWVyeSIsInJlc29sdmVkVXNlcktleSIsIm9yZGVyS2V5Iiwib3JkZXIiLCJjdXJyZW5jeSIsInRvVXBwZXJDYXNlIiwiY3VzdG9tZXJPcmRlcklkIiwidG90YWxQcmljZSIsIk51bWJlciIsIm9yZGVyUXVlcnkiLCJDVVNUT01FUl9PUkRFUlMiLCJzYXZlZE9yZGVyIiwiUHJvbWlzZSIsImZpbmQiLCJpdGVtIiwicHJvZHVjdERvYyIsInRpdGxlIiwidmFyaWFudElkIiwicHJvZHVjdFF1ZXJ5IiwiZ2V0Q3VzdG9tZXJPcmRlcnNCeVVzZXIiLCJzZW5kU3VwcG9ydFRpY2tldEVtYWlsIiwidGlja2V0IiwiaGVhZGluZyIsImdldCIsInRpY2tldE51bWJlciIsInN1cHBvcnRUaWNrZXRJZCIsInN0YXR1c1VybCIsImVuY29kZVVSSUNvbXBvbmVudCIsInRleHQiLCJUb0FkZHJlc3NlcyIsImNhdGNoIiwiY3JlYXRlU3VwcG9ydFRpY2tldCIsInRpY2tldEtleSIsInRvSVNPU3RyaW5nIiwiYXNzaWduZWRUb1VzZXJJZCIsInByaW9yaXR5IiwiU1VQUE9SVF9USUNLRVRTIiwic2F2ZWRUaWNrZXQiLCJhZGRTdXBwb3J0VGlja2V0RXZlbnQiLCJhY3RvclVzZXJJZCIsImV2ZW50VHlwZSIsIm1ldGFkYXRhIiwidG9WYWx1ZSIsInN1Ym1pdFB1YmxpY1N1cHBvcnRUaWNrZXQiLCJ0ZXN0IiwiU1VQUE9SVF9USUNLRVRfRVZFTlRTIiwiU1VQUE9SVF9USUNLRVRfTUVTU0FHRVMiLCJIQVNfU1VQUE9SVF9USUNLRVRfRVZFTlQiLCJIQVNfU1VQUE9SVF9USUNLRVRfTUVTU0FHRSIsIm9wdGVkSW4iLCJnZXRQdWJsaWNTdXBwb3J0VGlja2V0IiwiZW1haWxBZGRyZXNzIiwibnVtYmVyIiwiZ2V0U3VwcG9ydFRpY2tldHMiLCJmaWx0ZXJzIiwidXBkYXRlU3VwcG9ydFRpY2tldFN0YXR1cyIsInJlc29sdXRpb25TdW1tYXJ5IiwicHJldmlvdXMiLCJjb21wbGV0ZWRBdCIsImRvbmVBdCIsInJlc29sdmVkQXQiLCJjbG9zZWRBdCIsImxhc3RVcGRhdGVEZXRhaWxzIiwiZnJvbVZhbHVlIiwiY3JlYXRlQ3VzdG9tZXJOb3RpZmljYXRpb24iLCJib2R5IiwidXBkYXRlU3VwcG9ydFRpY2tldFByb2dyZXNzIiwibWFya2Rvd24iLCJhZGRTdXBwb3J0VGlja2V0TWVzc2FnZSIsImF1dGhvclVzZXJJZCIsInZpc2liaWxpdHkiLCJtZXNzYWdlS2V5Iiwic3VwcG9ydFRpY2tldE1lc3NhZ2VJZCIsIm1lc3NhZ2UiLCJzYXZlZE1lc3NhZ2UiLCJnZXRTdXBwb3J0VGlja2V0TWVzc2FnZXMiLCJldmVudEtleSIsInN1cHBvcnRUaWNrZXRFdmVudElkIiwiZXZlbnQiLCJzYXZlZEV2ZW50IiwiZ2V0U3VwcG9ydFRpY2tldEV2ZW50cyIsIm5vdGlmaWNhdGlvbktleSIsImN1c3RvbWVyTm90aWZpY2F0aW9uSWQiLCJub3RpZmljYXRpb24iLCJDVVNUT01FUl9OT1RJRklDQVRJT05TIiwic2F2ZWROb3RpZmljYXRpb24iLCJIQVNfQ1VTVE9NRVJfTk9USUZJQ0FUSU9OIiwiZ2V0Q3VzdG9tZXJOb3RpZmljYXRpb25zQnlVc2VyIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0NBR0MsR0FDRCxTQUFRQSxVQUFVLEVBQUVDLE9BQU8sRUFBRUMsVUFBVSxFQUFFQyxXQUFXLFFBQU8sK0JBQStCO0FBQzFGLFNBQVFDLEdBQUcsUUFBTyxXQUFXO0FBQzdCLFNBQVFDLE9BQU8sUUFBTyxlQUFlO0FBRXJDLFNBQVFDLFdBQVcsRUFBRUMsS0FBSyxRQUFPLDhCQUE4QjtBQUMvRCxTQUFRQyxNQUFNLFFBQU8sZUFBZTtBQUNwQyxTQUFRQyxLQUFLLFFBQU8sNEJBQTRCO0FBQ2hELFNBQVFDLFdBQVcsUUFBTywyQkFBMkI7QUFDckQsU0FBUUMsT0FBTyxRQUFPLGFBQWE7QUF1Qm5DLE1BQU1DLE1BQU0sSUFBY0MsS0FBS0QsR0FBRztBQUNsQyxNQUFNRSxhQUFhLENBQUNDLE9BQWlCVixRQUFRVTtBQUM3QyxNQUFNQyxTQUFTLENBQUNDLFFBQVEsRUFBRSxHQUFhaEIsUUFBUWlCLE9BQU9EO0FBQ3RELE1BQU1FLFFBQVEsQ0FBQ0MsZ0JBQXdCQyxNQUFNLEVBQUUsR0FBYSxHQUFHRCxlQUFlLENBQUMsRUFBRUosT0FBT0ssTUFBTTtBQUM5RixNQUFNQyxjQUFjLENBQUNDLFFBQWdCQyxLQUFLLEVBQUUsR0FBYXhCLFdBQVcsR0FBR3VCLE9BQU8sQ0FBQyxFQUFFTCxPQUFPTSxLQUFLLEVBQUU7QUFDL0YsTUFBTUMsY0FBYyxDQUFDUixPQUFnQlMsU0FBUyxHQUFHLEdBQWF2QixZQUFZZSxPQUFPRCxTQUFTLEtBQUtTO0FBQy9GLE1BQU1DLGtCQUFrQixDQUFDVixPQUFnQlMsU0FBUyxHQUFHLEdBQWFSLE9BQU9ELFNBQVMsSUFBSVcsSUFBSSxHQUFHQyxLQUFLLENBQUMs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
928
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9jcm0udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjYtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIGlzIHN1YmplY3QgdG8gdGhlIGFjY29tcGFueWluZyBjb21tZXJjaWFsIExJQ0VOU0UuXG4gKi9cbmltcG9ydCB7Y3JlYXRlSGFzaCwgcGFyc2VJZCwgcGFyc2VQaG9uZSwgcGFyc2VTdHJpbmd9IGZyb20gJ0BubGFicy91dGlscy9wYXJzZXJzL3N0cmluZ3MnO1xuaW1wb3J0IHthcWx9IGZyb20gJ2FyYW5nb2pzJztcbmltcG9ydCB7bGl0ZXJhbH0gZnJvbSAnYXJhbmdvanMvYXFsJztcblxuaW1wb3J0IHtDT0xMRUNUSU9OUywgRURHRVN9IGZyb20gJy4uL2NvbnN0YW50cy9jb2xsZWN0aW9ucy5qcyc7XG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vY29uZmlnLmpzJztcbmltcG9ydCB7dXNlRGJ9IGZyb20gJy4uL3V0aWxzL2FyYW5nb2RiVXRpbHMuanMnO1xuaW1wb3J0IHtpc0FkbWluVXNlcn0gZnJvbSAnLi4vdXRpbHMvc2Vzc2lvblV0aWxzLmpzJztcbmltcG9ydCB7c2VzU2VuZH0gZnJvbSAnLi9lbWFpbC5qcyc7XG5cbmltcG9ydCB0eXBlIHtBcWxRdWVyeX0gZnJvbSAnYXJhbmdvanMvYXFsJztcbmltcG9ydCB0eXBlIHtBcGlDb250ZXh0fSBmcm9tICcuLi90eXBlcy9hdXRoLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgQ3VzdG9tZXJOb3RpZmljYXRpb25UeXBlLFxuICBDdXN0b21lck9yZGVyVHlwZSxcbiAgQ3JtQ2FtcGFpZ25JbnB1dCxcbiAgQ3JtQ2FtcGFpZ25UeXBlLFxuICBDcm1Db250YWN0RmlsdGVyLFxuICBDcm1Gb3JtU3VibWlzc2lvbklucHV0LFxuICBDcm1Gb3JtU3VibWlzc2lvblR5cGUsXG4gIE1haWxpbmdMaXN0VHlwZSxcbiAgUHVibGljU3VwcG9ydFRpY2tldEZlZWQsXG4gIFB1YmxpY1N1cHBvcnRUaWNrZXRJbnB1dCxcbiAgU2hvcGlmeUN1c3RvbWVyT3JkZXJJbnB1dCxcbiAgU3VwcG9ydFRpY2tldEV2ZW50VHlwZSxcbiAgU3VwcG9ydFRpY2tldE1lc3NhZ2VUeXBlLFxuICBTdXBwb3J0VGlja2V0U3RhdHVzLFxuICBTdXBwb3J0VGlja2V0VHlwZURhdGFcbn0gZnJvbSAnLi4vdHlwZXMvY3JtLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtVc2VyVHlwZX0gZnJvbSAnLi4vdHlwZXMvdXNlcnMudHlwZXMuanMnO1xuXG5jb25zdCBub3cgPSAoKTogbnVtYmVyID0+IERhdGUubm93KCk7XG5jb25zdCBjb2xsZWN0aW9uID0gKG5hbWU6IHN0cmluZykgPT4gbGl0ZXJhbChuYW1lKTtcbmNvbnN0IGRvY0tleSA9ICh2YWx1ZSA9ICcnKTogc3RyaW5nID0+IHBhcnNlSWQoU3RyaW5nKHZhbHVlKSk7XG5jb25zdCBkb2NJZCA9IChjb2xsZWN0aW9uTmFtZTogc3RyaW5nLCBrZXkgPSAnJyk6IHN0cmluZyA9PiBgJHtjb2xsZWN0aW9uTmFtZX0vJHtkb2NLZXkoa2V5KX1gO1xuY29uc3QgZXh0ZXJuYWxLZXkgPSAocHJlZml4OiBzdHJpbmcsIGlkID0gJycpOiBzdHJpbmcgPT4gY3JlYXRlSGFzaChgJHtwcmVmaXh9LSR7U3RyaW5nKGlkKX1gLCBudWxsKTtcbmNvbnN0IGNsZWFuU3RyaW5nID0gKHZhbHVlOiB1bmtub3duLCBsZW5ndGggPSA2NDApOiBzdHJpbmcgPT4gcGFyc2VTdHJpbmcoU3RyaW5nKHZhbHVlIHx8ICcnKSwgbGVuZ3RoKTtcbmNvbnN0IGNsZWFuRXh0ZXJuYWxJZCA9ICh2YWx1ZTogdW5rbm93biwgbGVuZ3RoID0gMzIwKTogc3RyaW5nID0+IFN0cmluZyh2YWx1ZSB8fCAnJykudHJpbSgpLnNsaWNlKDAsIGxlbmd0aCk7XG5jb25zdCBlbnN1cmVEb2N1bWVudENvbGxlY3Rpb24gPSBhc3luYyAoZGF0YWJhc2U6IFJldHVyblR5cGU8dHlwZW9mIHVzZURiPiwgbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHRhcmdldCA9IGRhdGFiYXNlLmNvbGxlY3Rpb24obmFtZSk7XG4gIGlmKGF3YWl0IHRhcmdldC5leGlzdHMoKSkgcmV0dXJuO1xuICB0cnkge1xuICAgIGF3YWl0IGRhdGFiYXNlLmNyZWF0ZUNvbGxlY3Rpb24obmFtZSk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBpZighYXdhaXQgdGFyZ2V0LmV4aXN0cygpKSB0aHJvdyBlcnJvcjtcbiAgfVxufTtcbmNvbnN0IGVuc3VyZUVkZ2VDb2xsZWN0aW9uID0gYXN5bmMgKGRhdGFiYXNlOiBSZXR1cm5UeXBlPHR5cGVvZiB1c2VEYj4sIG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCB0YXJnZXQgPSBkYXRhYmFzZS5jb2xsZWN0aW9uKG5hbWUpO1xuICBpZihhd2FpdCB0YXJnZXQuZXhpc3RzKCkpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBhd2FpdCBkYXRhYmFzZS5jcmVhdGVFZGdlQ29sbGVjdGlvbihuYW1lKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGlmKCFhd2FpdCB0YXJnZXQuZXhpc3RzKCkpIHRocm93IGVycm9yO1xuICB9XG59O1xuXG5jb25zdCByZXF1aXJlQ3JtQWRtaW4gPSAoY29udGV4dDogQXBpQ29udGV4dCk6IHZvaWQgPT4ge1xuICBpZighaXNBZG1pblVzZXIoY29udGV4dC5zZXNzaW9uIGFzIGFueSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2FkbWluaXN0cmF0b3JfYWNjZXNzX3JlcXVpcmVkJyk7XG4gIH1cbn07XG5leHBvcnQgY29uc3QgcmVxdWlyZUNybUFkbWluaXN0cmF0b3IgPSByZXF1aXJlQ3JtQWRtaW47XG5cbmNvbnN0IGFsbG93ZWRDb250YWN0RmllbGRzID0gbmV3IFNldChbJ2VtYWlsJywgJ2ZpcnN0TmFtZScsICdsYXN0TmFtZScsICdwaG9uZScsICdtYXJrZXRpbmdDb25zZW50U291cmNlJywgJ2NybVNvdXJjZSddKTtcbmNvbnN0IHN1cHBvcnRQcmlvcml0aWVzID0gbmV3IFNldChbJ2xvdycsICdub3JtYWwnLCAnaGlnaCcsICd1cmdlbnQnXSk7XG5jb25zdCBzdXBwb3J0U3RhdHVzZXMgPSBuZXcgU2V0KFsnc3VibWl0dGVkJywgJ2luX3Byb2dyZXNzJywgJ2RvbmUnLCAnY29tcGxldGVkJ10pO1xuY29uc3Qgc3VwcG9ydFR5cGVzID0gbmV3IFNldChbJ2RlbGl2ZXJ5X2lzc3VlJywgJ3JlZnVuZF9yZXF1ZXN0JywgJ2J1Z19yZXBvcnQnLCAnYWNjb3VudF9pc3N1ZScsICdnZW5lcmFsX3N1cHBvcnQnXSk7XG5jb25zdCBlbWFpbFBhdHRlcm4gPSAvXlteXFxzQF0rQFteXFxzQF0rXFwuW15cXHNAXSskL3U7XG5jb25zdCBlc2NhcGVIdG1sID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgPT4gdmFsdWUucmVwbGFjZSgvJi9nLCAnJmFtcDsnKS5yZXBsYWNlKC88L2csICcmbHQ7JykucmVwbGFjZSgvPi9nLCAnJmd0OycpLnJlcGxhY2UoL1wiL2csICcmcXVvdDsnKTtcbmNvbnN0IHNhbml0aXplSHRtbCA9ICh2YWx1ZTogdW5rbm93bik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUgfHwgJycpXG4gIC5yZXBsYWNlKC88KHNjcmlwdHxpZnJhbWV8b2JqZWN0fGVtYmVkKVxcYltePl0qPltcXHNcXFNdKj88XFwvXFwxPi9naSwgJycpXG4gIC5yZXBsYWNlKC9cXHNvblxcdytcXHMqPVxccyooPzpcIlteXCJdKlwifCdbXiddKid8W15cXHM+XSspL2dpLCAnJyk7XG5jb25zdCBzYW5pdGl6ZUNzcyA9ICh2YWx1ZTogdW5rbm93bik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUgfHwgJycpXG4gIC5yZXBsYWNlKC88XFwvP3N0eWxlXFxiW14+XSo+L2dpLCAnJylcbiAgLnJlcGxhY2UoL0BpbXBvcnRcXHMrW147XSs7Py9naSwgJycpXG4gIC5yZXBsYWNlKC91cmxcXHMqXFwoXFxzKihbJ1wiXT8pamF2YXNjcmlwdDpbXildK1xcKS9naSwgJycpO1xuY29uc3QgaHRtbFRvVGV4dCA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+IHZhbHVlLnJlcGxhY2UoLzxbXj5dKz4vZywgJyAnKS5yZXBsYWNlKC9cXHMrL2csICcgJykudHJpbSgpO1xuY29uc3QgY2h1bmsgPSA8VD4oaXRlbXM6IHJlYWRvbmx5IFRbXSwgc2l6ZTogbnVtYmVyKTogVFtdW10gPT4ge1xuICBjb25zdCBncm91cHM6IFRbXVtdID0gW107XG4gIGZvcihsZXQgaW5kZXggPSAwOyBpbmRleCA8IGl0ZW1zLmxlbmd0aDsgaW5kZXggKz0gc2l6ZSkgZ3JvdXBzLnB1c2goaXRlbXMuc2xpY2UoaW5kZXgsIGluZGV4ICsgc2l6ZSkpO1xuICByZXR1cm4gZ3JvdXBzO1xufTtcblxuZXhwb3J0IGNvbnN0IHN1Ym1pdENybUZvcm0gPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBDcm1Gb3JtU3VibWlzc2lvbklucHV0XG4pOiBQcm9taXNlPENybUZvcm1TdWJtaXNzaW9uVHlwZT4gPT4ge1xuICBpZih0eXBlb2YgaW5wdXQ/Lm1hcmtldGluZ09wdEluICE9PSAnYm9vbGVhbicpIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWRfbWFya2V0aW5nT3B0SW4nKTtcbiAgY29uc3QgZW1haWwgPSBjbGVhblN0cmluZyhpbnB1dC5lbWFpbCwgMzIwKS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCByYXdQaG9uZSA9IGNsZWFuU3RyaW5nKGlucHV0LnBob25lLCA4MCk7XG4gIGNvbnN0IHBob25lID0gcmF3UGhvbmUgPyAocGFyc2VQaG9uZShyYXdQaG9uZSkgfHwgcmF3UGhvbmUpIDogJyc7XG4gIGlmKCFlbWFpbCAmJiAhcGhvbmUpIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWRfZW1haWxfb3JfcGhvbmUnKTtcblxuICBjb25zdCBkYXRhYmFzZSA9IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKTtcbiAgYXdhaXQgZW5zdXJlRG9jdW1lbnRDb2xsZWN0aW9uKGRhdGFiYXNlLCBDT0xMRUNUSU9OUy5DUk1fRk9STV9TVUJNSVNTSU9OUyk7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCBzb3VyY2UgPSBjbGVhblN0cmluZyhpbnB1dC5zb3VyY2UgfHwgaW5wdXQuZm9ybUlkIHx8ICdmb3JtJywgMTYwKTtcbiAgY29uc3QgdmFsdWVzID0gaW5wdXQudmFsdWVzIHx8IHt9O1xuICBjb25zdCBmaXJzdE5hbWUgPSBjbGVhblN0cmluZyhpbnB1dC5maXJzdE5hbWUgfHwgdmFsdWVzLmZpcnN0TmFtZSwgMTYwKTtcbiAgY29uc3QgbGFzdE5hbWUgPSBjbGVhblN0cmluZyhpbnB1dC5sYXN0TmFtZSB8fCB2YWx1ZXMubGFzdE5hbWUsIDE2MCk7XG4gIGNvbnN0IGdlbmVyYXRlZFVzZXJLZXkgPSBjcmVhdGVIYXNoKGVtYWlsIHx8IHBob25lLCBudWxsKTtcbiAgY29uc3QgY29uc2VudCA9IGlucHV0Lm1hcmtldGluZ09wdEluXG4gICAgPyB7bWFya2V0aW5nT3B0SW5BdDogdGltZXN0YW1wLCBtYXJrZXRpbmdPcHRPdXRBdDogbnVsbH1cbiAgICA6IHttYXJrZXRpbmdPcHRPdXRBdDogdGltZXN0YW1wfTtcbiAgY29uc3QgdXNlckluc2VydCA9IHtcbiAgICBfa2V5OiBnZW5lcmF0ZWRVc2VyS2V5LFxuICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICBlbWFpbCxcbiAgICBmaXJzdE5hbWUsXG4gICAgbGFzdE5hbWUsXG4gICAgbWFpbGluZ0xpc3Q6IGlucHV0Lm1hcmtldGluZ09wdEluLFxuICAgIG1hcmtldGluZ0NvbnNlbnRTb3VyY2U6IHNvdXJjZSxcbiAgICBtYXJrZXRpbmdPcHRJbjogaW5wdXQubWFya2V0aW5nT3B0SW4sXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBwaG9uZSxcbiAgICB0eXBlOiAnY3JtQ29udGFjdCcsXG4gICAgdXNlckFjY2VzczogMCxcbiAgICB1c2VySWQ6IGdlbmVyYXRlZFVzZXJLZXksXG4gICAgdmVyaWZpZWRFbWFpbDogZmFsc2UsXG4gICAgdmVyaWZpZWRQaG9uZTogZmFsc2UsXG4gICAgLi4uY29uc2VudFxuICB9O1xuICBjb25zdCB1c2VyVXBkYXRlID0ge1xuICAgIC4uLihlbWFpbCA/IHtlbWFpbH0gOiB7fSksXG4gICAgLi4uKGZpcnN0TmFtZSA/IHtmaXJzdE5hbWV9IDoge30pLFxuICAgIC4uLihsYXN0TmFtZSA/IHtsYXN0TmFtZX0gOiB7fSksXG4gICAgLi4uKHBob25lID8ge3Bob25lfSA6IHt9KSxcbiAgICBtYWlsaW5nTGlzdDogaW5wdXQubWFya2V0aW5nT3B0SW4sXG4gICAgbWFya2V0aW5nQ29uc2VudFNvdXJjZTogc291cmNlLFxuICAgIG1hcmtldGluZ09wdEluOiBpbnB1dC5tYXJrZXRpbmdPcHRJbixcbiAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgIC4uLmNvbnNlbnRcbiAgfTtcbiAgY29uc3QgdXNlciA9IGF3YWl0IGRhdGFiYXNlLnF1ZXJ5KGFxbGBcbiAgICBMRVQgZXhpc3RpbmcgPSBGSVJTVChcbiAgICAgIEZPUiB1c2VyIElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5VU0VSUyl9XG4gICAgICAgIEZJTFRFUiAoJHtlbWFpbH0gIT0gXCJcIiAmJiBMT1dFUih1c2VyLmVtYWlsIHx8IFwiXCIpID09ICR7ZW1haWx9KVxuICAgICAgICAgIHx8ICgke3Bob25lfSAhPSBcIlwiICYmIHVzZXIucGhvbmUgPT0gJHtwaG9uZX0pXG4gICAgICAgIExJTUlUIDFcbiAgICAgICAgUkVUVVJOIHVzZXJcbiAgICApXG4gICAgTEVUIHVzZXJLZXkgPSBleGlzdGluZyA/IGV4aXN0aW5nLl9rZXkgOiAke2dlbmVyYXRlZFVzZXJLZXl9XG4gICAgVVBTRVJUIHtfa2V5OiB1c2VyS2V5fVxuICAgIElOU0VSVCBNRVJHRSgke3VzZXJJbnNlcnR9LCB7X2tleTogdXNlcktleSwgdXNlcklkOiB1c2VyS2V5fSlcbiAgICBVUERBVEUgJHt1c2VyVXBkYXRlfSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuVVNFUlMpfVxuICAgIFJFVFVSTiBORVdcbiAgYCkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKSBhcyBVc2VyVHlwZSB8IG51bGw7XG4gIGNvbnN0IHVzZXJJZCA9IGRvY0tleShTdHJpbmcodXNlcj8uX2tleSB8fCB1c2VyPy51c2VySWQgfHwgZ2VuZXJhdGVkVXNlcktleSkpO1xuXG4gIGNvbnN0IHN1Ym1pc3Npb25JZCA9IGNyZWF0ZUhhc2goYGNybS1zdWJtaXNzaW9uLSR7dGltZXN0YW1wfS0ke2VtYWlsfS0ke3Bob25lfWAsIG51bGwpO1xuICBjb25zdCBzdWJtaXNzaW9uID0ge1xuICAgIF9rZXk6IHN1Ym1pc3Npb25JZCxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIGVtYWlsLFxuICAgIGZvcm1JZDogY2xlYW5TdHJpbmcoaW5wdXQuZm9ybUlkLCAxNjApLFxuICAgIG1hcmtldGluZ09wdEluOiBpbnB1dC5tYXJrZXRpbmdPcHRJbixcbiAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgIHBob25lLFxuICAgIHNvdXJjZSxcbiAgICBzdWJtaXNzaW9uSWQsXG4gICAgdXNlcklkLFxuICAgIHZhbHVlc1xuICB9O1xuICBjb25zdCBzYXZlZCA9IGF3YWl0IGRhdGFiYXNlLnF1ZXJ5KGFxbGBcbiAgICBJTlNFUlQgJHtzdWJtaXNzaW9ufSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuQ1JNX0ZPUk1fU1VCTUlTU0lPTlMpfVxuICAgIFJFVFVSTiBORVdcbiAgYCkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKTtcblxuICByZXR1cm4gc2F2ZWQ7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q3JtRm9ybVN1Ym1pc3Npb25zID0gKGNvbnRleHQ6IEFwaUNvbnRleHQpOiBQcm9taXNlPENybUZvcm1TdWJtaXNzaW9uVHlwZVtdPiA9PiB7XG4gIHJlcXVpcmVDcm1BZG1pbihjb250ZXh0KTtcbiAgY29uc3QgZGF0YWJhc2UgPSB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSk7XG4gIHJldHVybiAoYXN5bmMgKCkgPT4ge1xuICAgIGlmKCFhd2FpdCBkYXRhYmFzZS5jb2xsZWN0aW9uKENPTExFQ1RJT05TLkNSTV9GT1JNX1NVQk1JU1NJT05TKS5leGlzdHMoKSkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxgXG4gICAgICBGT1Igc3VibWlzc2lvbiBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuQ1JNX0ZPUk1fU1VCTUlTU0lPTlMpfVxuICAgICAgICBTT1JUIHN1Ym1pc3Npb24uYWRkZWQgREVTQ1xuICAgICAgICBMSU1JVCA1MDBcbiAgICAgICAgUkVUVVJOIHN1Ym1pc3Npb25cbiAgICBgKS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG4gIH0pKCk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q3JtQ29udGFjdHMgPSAoY29udGV4dDogQXBpQ29udGV4dCwgZmlsdGVyOiBDcm1Db250YWN0RmlsdGVyID0ge30pOiBQcm9taXNlPFVzZXJUeXBlW10+ID0+IHtcbiAgcmVxdWlyZUNybUFkbWluKGNvbnRleHQpO1xuICBjb25zdCBzZWFyY2ggPSBjbGVhblN0cmluZyhmaWx0ZXIuc2VhcmNoLCAzMjApLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IGZpZWxkID0gYWxsb3dlZENvbnRhY3RGaWVsZHMuaGFzKGZpbHRlci5maWVsZCB8fCAnJykgPyBTdHJpbmcoZmlsdGVyLmZpZWxkKSA6ICcnO1xuICBjb25zdCB2YWx1ZSA9IGNsZWFuU3RyaW5nKGZpbHRlci52YWx1ZSwgMzIwKS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBvcHRlZEluT25seSA9IGZpbHRlci5vcHRlZEluT25seSAhPT0gZmFsc2U7XG4gIGNvbnN0IG9wZXJhdG9yID0gWydjb250YWlucycsICdlcXVhbHMnLCAnZXhpc3RzJ10uaW5jbHVkZXMoZmlsdGVyLm9wZXJhdG9yIHx8ICcnKSA/IGZpbHRlci5vcGVyYXRvciA6ICdjb250YWlucyc7XG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkoYXFsYFxuICAgIEZPUiB1c2VyIElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5VU0VSUyl9XG4gICAgICBGSUxURVIgJHshb3B0ZWRJbk9ubHl9IHx8IHVzZXIubWFya2V0aW5nT3B0SW4gPT0gdHJ1ZVxuICAgICAgRklMVEVSICR7IXNlYXJjaH0gfHwgQ09OVEFJTlMoTE9XRVIoQ09OQ0FUX1NFUEFSQVRPUihcIiBcIiwgdXNlci5maXJzdE5hbWUsIHVzZXIubGFzdE5hbWUsIHVzZXIuZW1haWwsIHVzZXIucGhvbmUpKSwgJHtzZWFyY2h9KVxuICAgICAgRklMVEVSICR7IWZpZWxkfSB8fCAoJHtvcGVyYXRvciA9PT0gJ2V4aXN0cyd9XG4gICAgICAgID8gSEFTKHVzZXIsICR7ZmllbGR9KVxuICAgICAgICA6ICgke29wZXJhdG9yID09PSAnZXF1YWxzJ30gPyBMT1dFUihUT19TVFJJTkcodXNlclske2ZpZWxkfV0pKSA9PSAke3ZhbHVlfSA6IENPTlRBSU5TKExPV0VSKFRPX1NUUklORyh1c2VyWyR7ZmllbGR9XSkpLCAke3ZhbHVlfSkpKVxuICAgICAgU09SVCB1c2VyLmFkZGVkIERFU0NcbiAgICAgIExJTUlUIDEwMDBcbiAgICAgIFJFVFVSTiBNRVJHRSh1c2VyLCB7Y3JtU291cmNlOiB1c2VyLm1hcmtldGluZ0NvbnNlbnRTb3VyY2V9KVxuICBgKS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2VuZENybUNhbXBhaWduID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBpbnB1dDogQ3JtQ2FtcGFpZ25JbnB1dFxuKTogUHJvbWlzZTxDcm1DYW1wYWlnblR5cGU+ID0+IHtcbiAgcmVxdWlyZUNybUFkbWluKGNvbnRleHQpO1xuICBjb25zdCBzdWJqZWN0ID0gY2xlYW5TdHJpbmcoaW5wdXQuc3ViamVjdCwgMzIwKTtcbiAgY29uc3QgYm9keUh0bWwgPSBzYW5pdGl6ZUh0bWwoaW5wdXQuaHRtbCk7XG4gIGNvbnN0IGNzcyA9IHNhbml0aXplQ3NzKGlucHV0LmNzcyk7XG4gIGlmKCFzdWJqZWN0IHx8ICFib2R5SHRtbCkgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZF9jYW1wYWlnbl9jb250ZW50Jyk7XG5cbiAgY29uc3QgY2FuZGlkYXRlcyA9IGF3YWl0IGdldENybUNvbnRhY3RzKGNvbnRleHQsIHsuLi5pbnB1dC5maWx0ZXIsIG9wdGVkSW5Pbmx5OiB0cnVlfSk7XG4gIGNvbnN0IHNlbGVjdGVkSWRzID0gbmV3IFNldCgoaW5wdXQudXNlcklkcyB8fCBbXSkubWFwKChpZCkgPT4gZG9jS2V5KGlkKSkpO1xuICBjb25zdCByZWNpcGllbnRzID0gY2FuZGlkYXRlcy5maWx0ZXIoKHVzZXIpID0+XG4gICAgQm9vbGVhbih1c2VyLmVtYWlsKSAmJiAoIXNlbGVjdGVkSWRzLnNpemUgfHwgc2VsZWN0ZWRJZHMuaGFzKGRvY0tleSh1c2VyLnVzZXJJZCB8fCB1c2VyLl9rZXkpKSkpO1xuICBjb25zdCB0aW1lc3RhbXAgPSBub3coKTtcbiAgY29uc3QgY2FtcGFpZ25JZCA9IGNyZWF0ZUhhc2goYGNybS1jYW1wYWlnbi0ke3RpbWVzdGFtcH0tJHtzdWJqZWN0fWAsIG51bGwpO1xuICBjb25zdCBkYXRhYmFzZSA9IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKTtcbiAgY29uc3QgY2FtcGFpZ24gPSB7XG4gICAgX2tleTogY2FtcGFpZ25JZCxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIGNhbXBhaWduSWQsXG4gICAgY3NzLFxuICAgIGZhaWxlZENvdW50OiAwLFxuICAgIGh0bWw6IGJvZHlIdG1sLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgcmVjaXBpZW50Q291bnQ6IHJlY2lwaWVudHMubGVuZ3RoLFxuICAgIHNlbnRDb3VudDogMCxcbiAgICBzdGF0dXM6ICdzZW5kaW5nJyxcbiAgICBzdWJqZWN0XG4gIH07XG4gIGF3YWl0IGRhdGFiYXNlLnF1ZXJ5KGFxbGBJTlNFUlQgJHtjYW1wYWlnbn0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLkNSTV9DQU1QQUlHTlMpfWApO1xuXG4gIGxldCBmYWlsZWRDb3VudCA9IDA7XG4gIGxldCBzZW50Q291bnQgPSAwO1xuICBmb3IoY29uc3QgcmVjaXBpZW50c0JhdGNoIG9mIGNodW5rKHJlY2lwaWVudHMsIDUwKSkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZXNTZW5kKHtcbiAgICAgICAgRGVzdGluYXRpb246IHtCY2NBZGRyZXNzZXM6IHJlY2lwaWVudHNCYXRjaC5tYXAoKHJlY2lwaWVudCkgPT4gU3RyaW5nKHJlY2lwaWVudC5lbWFpbCkpfSxcbiAgICAgICAgTWVzc2FnZToge1xuICAgICAgICAgIEJvZHk6IHtIdG1sOiB7RGF0YTogYDxzdHlsZT4ke2Nzc308L3N0eWxlPiR7Ym9keUh0bWx9YH0sIFRleHQ6IHtEYXRhOiBodG1sVG9UZXh0KGJvZHlIdG1sKX19LFxuICAgICAgICAgIFN1YmplY3Q6IHtEYXRhOiBzdWJqZWN0fVxuICAgICAgICB9LFxuICAgICAgICBTb3VyY2U6IGBcIiR7Y29udGV4dC5jb25maWc/LmRldGFpbHM/LnN1cHBvcnROYW1lIHx8ICdSZWFrdG9yJ31cIiA8JHtjb250ZXh0LmNvbmZpZz8uZGV0YWlscz8uc3VwcG9ydEVtYWlsIHx8ICdzdXBwb3J0QHJlYWt0b3IuaW8nfT5gXG4gICAgICB9KTtcbiAgICAgIHNlbnRDb3VudCArPSByZWNpcGllbnRzQmF0Y2gubGVuZ3RoO1xuICAgIH0gY2F0Y2goX2Vycm9yKSB7XG4gICAgICBmYWlsZWRDb3VudCArPSByZWNpcGllbnRzQmF0Y2gubGVuZ3RoO1xuICAgIH1cbiAgfVxuICBjb25zdCByZXN1bHQgPSB7Li4uY2FtcGFpZ24sIGZhaWxlZENvdW50LCBzZW50QXQ6IG5vdygpLCBzZW50Q291bnQsIHN0YXR1czogZmFpbGVkQ291bnQgPyAoc2VudENvdW50ID8gJ3BhcnRpYWwnIDogJ2ZhaWxlZCcpIDogJ3NlbnQnfTtcbiAgYXdhaXQgZGF0YWJhc2UucXVlcnkoYXFsYFxuICAgIFVQREFURSAke2NhbXBhaWduSWR9IFdJVEggJHt7XG4gICAgICBmYWlsZWRDb3VudDogcmVzdWx0LmZhaWxlZENvdW50LFxuICAgICAgbW9kaWZpZWQ6IHJlc3VsdC5zZW50QXQsXG4gICAgICBzZW50QXQ6IHJlc3VsdC5zZW50QXQsXG4gICAgICBzZW50Q291bnQ6IHJlc3VsdC5zZW50Q291bnQsXG4gICAgICBzdGF0dXM6IHJlc3VsdC5zdGF0dXNcbiAgICB9fSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuQ1JNX0NBTVBBSUdOUyl9XG4gIGApO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuY29uc3Qgc2F2ZUVkZ2UgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGVkZ2VDb2xsZWN0aW9uOiBzdHJpbmcsXG4gIGVkZ2VLZXk6IHN0cmluZyxcbiAgZnJvbTogc3RyaW5nLFxuICB0bzogc3RyaW5nLFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgdGltZXN0YW1wID0gbm93KCk7XG4gIGNvbnN0IGVkZ2UgPSB7XG4gICAgX2Zyb206IGZyb20sXG4gICAgX2tleTogZWRnZUtleSxcbiAgICBfdG86IHRvLFxuICAgIGFkZGVkOiB0aW1lc3RhbXAsXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICAuLi5kYXRhXG4gIH07XG4gIGNvbnN0IHF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICBVUFNFUlQge19rZXk6ICR7ZWRnZUtleX19XG4gICAgSU5TRVJUICR7ZWRnZX1cbiAgICBVUERBVEUgJHtkYXRhfSBJTiAke2NvbGxlY3Rpb24oZWRnZUNvbGxlY3Rpb24pfVxuICBgO1xuXG4gIGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlTWFpbGluZ0xpc3QgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBQYXJ0aWFsPE1haWxpbmdMaXN0VHlwZT5cbik6IFByb21pc2U8TWFpbGluZ0xpc3RUeXBlPiA9PiB7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCBtYWlsaW5nTGlzdElkID0gZG9jS2V5KFN0cmluZyhpbnB1dD8ubWFpbGluZ0xpc3RJZCB8fCBjcmVhdGVIYXNoKGBtYWlsaW5nLWxpc3QtJHtpbnB1dD8ubmFtZX0tJHt0aW1lc3RhbXB9YCkpKTtcbiAgY29uc3QgbWFpbGluZ0xpc3QgPSB7XG4gICAgX2tleTogbWFpbGluZ0xpc3RJZCxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIGNyZWF0ZWRCeVVzZXJJZDogZG9jS2V5KFN0cmluZyhjb250ZXh0Py5zZXNzaW9uPy51c2VySWQgfHwgJycpKSxcbiAgICBkZXNjcmlwdGlvbjogY2xlYW5TdHJpbmcoaW5wdXQ/LmRlc2NyaXB0aW9uLCAyMDAwKSxcbiAgICBtYWlsaW5nTGlzdElkLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgbmFtZTogY2xlYW5TdHJpbmcoaW5wdXQ/Lm5hbWUsIDE2MCksXG4gICAgc3RhdHVzOiBpbnB1dD8uc3RhdHVzIHx8ICdhY3RpdmUnXG4gIH07XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIFVQU0VSVCB7X2tleTogJHttYWlsaW5nTGlzdElkfX1cbiAgICBJTlNFUlQgJHttYWlsaW5nTGlzdH1cbiAgICBVUERBVEUgJHt7XG4gICAgICBkZXNjcmlwdGlvbjogbWFpbGluZ0xpc3QuZGVzY3JpcHRpb24sXG4gICAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgICAgbmFtZTogbWFpbGluZ0xpc3QubmFtZSxcbiAgICAgIHN0YXR1czogbWFpbGluZ0xpc3Quc3RhdHVzXG4gICAgfX0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLk1BSUxJTkdfTElTVFMpfVxuICAgIFJFVFVSTiBORVdcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE1haWxpbmdMaXN0cyA9IChjb250ZXh0OiBBcGlDb250ZXh0KTogUHJvbWlzZTxNYWlsaW5nTGlzdFR5cGVbXT4gPT4ge1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBGT1IgbGlzdCBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuTUFJTElOR19MSVNUUyl9XG4gICAgICBGSUxURVIgbGlzdC5zdGF0dXMgIT0gXCJhcmNoaXZlZFwiXG4gICAgICBTT1JUIGxpc3QuYWRkZWQgREVTQ1xuICAgICAgUkVUVVJOIGxpc3RcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkVXNlclRvTWFpbGluZ0xpc3QgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHVzZXJJZDogc3RyaW5nLFxuICBtYWlsaW5nTGlzdElkOiBzdHJpbmcsXG4gIHNvdXJjZSA9ICdtYW51YWwnXG4pOiBQcm9taXNlPE1haWxpbmdMaXN0VHlwZSB8IG51bGw+ID0+IHtcbiAgY29uc3QgdXNlcktleSA9IGRvY0tleSh1c2VySWQpO1xuICBjb25zdCBsaXN0S2V5ID0gZG9jS2V5KG1haWxpbmdMaXN0SWQpO1xuICBjb25zdCBlZGdlS2V5ID0gY3JlYXRlSGFzaChgaGFzTWFpbGluZ0xpc3QtJHt1c2VyS2V5fS0ke2xpc3RLZXl9YCk7XG5cbiAgYXdhaXQgc2F2ZUVkZ2UoXG4gICAgY29udGV4dCxcbiAgICBFREdFUy5IQVNfTUFJTElOR19MSVNULFxuICAgIGVkZ2VLZXksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuVVNFUlMsIHVzZXJLZXkpLFxuICAgIGRvY0lkKENPTExFQ1RJT05TLk1BSUxJTkdfTElTVFMsIGxpc3RLZXkpLFxuICAgIHtcbiAgICAgIGFkZGVkQnlVc2VySWQ6IGRvY0tleShTdHJpbmcoY29udGV4dD8uc2Vzc2lvbj8udXNlcklkIHx8ICcnKSksXG4gICAgICBzb3VyY2U6IGNsZWFuU3RyaW5nKHNvdXJjZSwgODApLFxuICAgICAgc3RhdHVzOiAnYWN0aXZlJ1xuICAgIH1cbiAgKTtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpXG4gICAgLnF1ZXJ5KGFxbGBSRVRVUk4gRE9DVU1FTlQoJHtkb2NJZChDT0xMRUNUSU9OUy5NQUlMSU5HX0xJU1RTLCBsaXN0S2V5KX0pYClcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCByZW1vdmVVc2VyRnJvbU1haWxpbmdMaXN0ID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB1c2VySWQ6IHN0cmluZyxcbiAgbWFpbGluZ0xpc3RJZDogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgY29uc3QgdXNlcktleSA9IGRvY0tleSh1c2VySWQpO1xuICBjb25zdCBsaXN0S2V5ID0gZG9jS2V5KG1haWxpbmdMaXN0SWQpO1xuICBjb25zdCBlZGdlS2V5ID0gY3JlYXRlSGFzaChgaGFzTWFpbGluZ0xpc3QtJHt1c2VyS2V5fS0ke2xpc3RLZXl9YCk7XG4gIGNvbnN0IHVwZGF0ZSA9IHtcbiAgICBtb2RpZmllZDogbm93KCksXG4gICAgcmVtb3ZlZEF0OiBub3coKSxcbiAgICBzdGF0dXM6ICdyZW1vdmVkJ1xuICB9O1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBVUERBVEUgJHtlZGdlS2V5fSBXSVRIICR7dXBkYXRlfSBJTiAke2NvbGxlY3Rpb24oRURHRVMuSEFTX01BSUxJTkdfTElTVCl9XG4gICAgUkVUVVJOIE5FV1xuICBgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSkudGhlbihCb29sZWFuKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRNYWlsaW5nTGlzdFVzZXJzID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBtYWlsaW5nTGlzdElkOiBzdHJpbmdcbik6IFByb21pc2U8VXNlclR5cGVbXT4gPT4ge1xuICBjb25zdCBsaXN0SWQgPSBkb2NJZChDT0xMRUNUSU9OUy5NQUlMSU5HX0xJU1RTLCBtYWlsaW5nTGlzdElkKTtcbiAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgRk9SIHVzZXIsIGVkZ2UgSU4gMS4uMSBJTkJPVU5EICR7bGlzdElkfSAke2NvbGxlY3Rpb24oRURHRVMuSEFTX01BSUxJTkdfTElTVCl9XG4gICAgICBGSUxURVIgZWRnZS5zdGF0dXMgPT0gXCJhY3RpdmVcIlxuICAgICAgU09SVCB1c2VyLmVtYWlsIEFTQ1xuICAgICAgUkVUVVJOIHVzZXJcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlcnNCeVB1cmNoYXNlZFByb2R1Y3QgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHByb2R1Y3RJZDogc3RyaW5nXG4pOiBQcm9taXNlPFVzZXJUeXBlW10+ID0+IHtcbiAgY29uc3QgcHJvZHVjdEtleSA9IGV4dGVybmFsS2V5KCdzaG9waWZ5LXByb2R1Y3QnLCBwcm9kdWN0SWQpO1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBGT1Igb3JkZXIgSU4gMS4uMSBJTkJPVU5EICR7ZG9jSWQoQ09MTEVDVElPTlMuU0hPUElGWV9QUk9EVUNUUywgcHJvZHVjdEtleSl9ICR7Y29sbGVjdGlvbihFREdFUy5IQVNfUFVSQ0hBU0VEX1BST0RVQ1QpfVxuICAgICAgRk9SIHVzZXIgSU4gMS4uMSBJTkJPVU5EIG9yZGVyLl9pZCAke2NvbGxlY3Rpb24oRURHRVMuSEFTX0NVU1RPTUVSX09SREVSKX1cbiAgICAgICAgU09SVCB1c2VyLmVtYWlsIEFTQ1xuICAgICAgICBSRVRVUk4gRElTVElOQ1QgdXNlclxuICBgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRFbGlnaWJsZU1haWxpbmdVc2VycyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgb3B0aW9uczoge3JlYWRvbmx5IG1haWxpbmdMaXN0SWQ/OiBzdHJpbmc7IHJlYWRvbmx5IHByb2R1Y3RJZD86IHN0cmluZzsgcmVhZG9ubHkgZXhjbHVkZU9wZW5TdXBwb3J0VGlja2V0cz86IGJvb2xlYW59ID0ge31cbik6IFByb21pc2U8VXNlclR5cGVbXT4gPT4ge1xuICBjb25zdCBleGNsdWRlT3BlblN1cHBvcnRUaWNrZXRzID0gb3B0aW9ucy5leGNsdWRlT3BlblN1cHBvcnRUaWNrZXRzICE9PSBmYWxzZTtcbiAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgTEVUIGJhc2VVc2VycyA9IChcbiAgICAgIEZPUiB1c2VyIElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5VU0VSUyl9XG4gICAgICAgIEZJTFRFUiB1c2VyLm1hcmtldGluZ09wdEluID09IHRydWVcbiAgICAgICAgRklMVEVSIHVzZXIuZW1haWwgIT0gbnVsbCAmJiB1c2VyLmVtYWlsICE9IFwiXCJcbiAgICAgICAgRklMVEVSIHVzZXIuZW1haWxEZWxpdmVyeVN0YXR1cyA9PSBudWxsIHx8IHVzZXIuZW1haWxEZWxpdmVyeVN0YXR1cyA9PSBcInZhbGlkXCJcbiAgICAgICAgJHtvcHRpb25zLm1haWxpbmdMaXN0SWQgPyBhcWxgXG4gICAgICAgICAgRklMVEVSIExFTkdUSChcbiAgICAgICAgICAgIEZPUiBsaXN0IElOIDEuLjEgT1VUQk9VTkQgdXNlci5faWQgJHtjb2xsZWN0aW9uKEVER0VTLkhBU19NQUlMSU5HX0xJU1QpfVxuICAgICAgICAgICAgICBGSUxURVIgbGlzdC5fa2V5ID09ICR7ZG9jS2V5KG9wdGlvbnMubWFpbGluZ0xpc3RJZCl9XG4gICAgICAgICAgICAgIFJFVFVSTiBsaXN0XG4gICAgICAgICAgKSA+IDBcbiAgICAgICAgYCA6IGFxbGBgfVxuICAgICAgICAke29wdGlvbnMucHJvZHVjdElkID8gYXFsYFxuICAgICAgICAgIEZJTFRFUiBMRU5HVEgoXG4gICAgICAgICAgICBGT1Igb3JkZXIgSU4gMS4uMSBPVVRCT1VORCB1c2VyLl9pZCAke2NvbGxlY3Rpb24oRURHRVMuSEFTX0NVU1RPTUVSX09SREVSKX1cbiAgICAgICAgICAgICAgRk9SIHByb2R1Y3QgSU4gMS4uMSBPVVRCT1VORCBvcmRlci5faWQgJHtjb2xsZWN0aW9uKEVER0VTLkhBU19QVVJDSEFTRURfUFJPRFVDVCl9XG4gICAgICAgICAgICAgICAgRklMVEVSIHByb2R1Y3QucHJvZHVjdElkID09ICR7U3RyaW5nKG9wdGlvbnMucHJvZHVjdElkKX1cbiAgICAgICAgICAgICAgICBSRVRVUk4gcHJvZHVjdFxuICAgICAgICAgICkgPiAwXG4gICAgICAgIGAgOiBhcWxgYH1cbiAgICAgICAgJHtleGNsdWRlT3BlblN1cHBvcnRUaWNrZXRzID8gYXFsYFxuICAgICAgICAgIEZJTFRFUiBMRU5HVEgoXG4gICAgICAgICAgICBGT1IgdGlja2V0IElOIDEuLjEgT1VUQk9VTkQgdXNlci5faWQgJHtjb2xsZWN0aW9uKEVER0VTLkhBU19TVVBQT1JUX1RJQ0tFVCl9XG4gICAgICAgICAgICAgIEZJTFRFUiB0aWNrZXQuc3RhdHVzIElOIFtcIm9wZW5cIiwgXCJpbl9wcm9ncmVzc1wiLCBcIndhaXRpbmdfb25fY3VzdG9tZXJcIiwgXCJ3YWl0aW5nX29uX2ludGVybmFsXCJdXG4gICAgICAgICAgICAgIEZJTFRFUiB0aWNrZXQucHJpb3JpdHkgSU4gW1wiaGlnaFwiLCBcInVyZ2VudFwiXVxuICAgICAgICAgICAgICBSRVRVUk4gdGlja2V0XG4gICAgICAgICAgKSA9PSAwXG4gICAgICAgIGAgOiBhcWxgYH1cbiAgICAgICAgUkVUVVJOIHVzZXJcbiAgICApXG4gICAgRk9SIHVzZXIgSU4gYmFzZVVzZXJzXG4gICAgICBTT1JUIHVzZXIuZW1haWwgQVNDXG4gICAgICBSRVRVUk4gRElTVElOQ1QgdXNlclxuICBgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpbmdlc3RTaG9waWZ5Q3VzdG9tZXJPcmRlciA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaW5wdXQ6IFNob3BpZnlDdXN0b21lck9yZGVySW5wdXRcbik6IFByb21pc2U8Q3VzdG9tZXJPcmRlclR5cGU+ID0+IHtcbiAgY29uc3QgdGltZXN0YW1wID0gbm93KCk7XG4gIGNvbnN0IHNob3BpZnlDdXN0b21lcklkID0gY2xlYW5FeHRlcm5hbElkKGlucHV0LnNob3BpZnlDdXN0b21lcklkLCAxNjApO1xuICBjb25zdCBzaG9waWZ5T3JkZXJJZCA9IGNsZWFuRXh0ZXJuYWxJZChpbnB1dC5zaG9waWZ5T3JkZXJJZCwgMTYwKTtcbiAgY29uc3QgY3VzdG9tZXIgPSBpbnB1dC5jdXN0b21lciB8fCB7fTtcbiAgY29uc3QgZW1haWwgPSBjbGVhblN0cmluZyhjdXN0b21lci5lbWFpbCwgMzIwKS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBwcm9kdWN0SWRzID0gQXJyYXkuZnJvbShuZXcgU2V0KFsuLi4oaW5wdXQucHJvZHVjdElkcyB8fCBbXSksIC4uLihpbnB1dC5wcm9kdWN0cyB8fCBbXSkubWFwKChwcm9kdWN0KSA9PiBwcm9kdWN0LnByb2R1Y3RJZCldXG4gICAgLm1hcCgocHJvZHVjdElkKSA9PiBjbGVhbkV4dGVybmFsSWQocHJvZHVjdElkLCAzMjApKVxuICAgIC5maWx0ZXIoQm9vbGVhbikpKTtcblxuICBpZighc2hvcGlmeUN1c3RvbWVySWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkX3Nob3BpZnlDdXN0b21lcklkJyk7XG4gIH1cbiAgaWYoIXNob3BpZnlPcmRlcklkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZF9zaG9waWZ5T3JkZXJJZCcpO1xuICB9XG4gIGlmKCFlbWFpbCkge1xuICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWRfY3VzdG9tZXJFbWFpbCcpO1xuICB9XG5cbiAgY29uc3QgdXNlcktleSA9IGV4dGVybmFsS2V5KCdzaG9waWZ5LXVzZXInLCBzaG9waWZ5Q3VzdG9tZXJJZCk7XG4gIGNvbnN0IHVzZXJJbnNlcnQgPSB7XG4gICAgX2tleTogdXNlcktleSxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIGVtYWlsLFxuICAgIGZpcnN0TmFtZTogY2xlYW5TdHJpbmcoY3VzdG9tZXIuZmlyc3ROYW1lLCAxNjApLFxuICAgIGxhc3ROYW1lOiBjbGVhblN0cmluZyhjdXN0b21lci5sYXN0TmFtZSwgMTYwKSxcbiAgICBtYXJrZXRpbmdDb25zZW50U291cmNlOiAnc2hvcGlmeScsXG4gICAgbWFya2V0aW5nT3B0SW46IGN1c3RvbWVyLm1hcmtldGluZ09wdEluID09PSB0cnVlLFxuICAgIG1hcmtldGluZ09wdEluQXQ6IGN1c3RvbWVyLm1hcmtldGluZ09wdEluID09PSB0cnVlID8gdGltZXN0YW1wIDogdW5kZWZpbmVkLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgc2hvcGlmeUN1c3RvbWVySWQsXG4gICAgdHlwZTogJ2NybUNvbnRhY3QnLFxuICAgIHVzZXJJZDogdXNlcktleVxuICB9O1xuICBjb25zdCB1c2VyVXBkYXRlID0ge1xuICAgIGVtYWlsLFxuICAgIGZpcnN0TmFtZTogY2xlYW5TdHJpbmcoY3VzdG9tZXIuZmlyc3ROYW1lLCAxNjApLFxuICAgIGxhc3ROYW1lOiBjbGVhblN0cmluZyhjdXN0b21lci5sYXN0TmFtZSwgMTYwKSxcbiAgICBsYXN0UHVyY2hhc2VkQXQ6IGlucHV0LnB1cmNoYXNlZEF0IHx8IHRpbWVzdGFtcCxcbiAgICBtYXJrZXRpbmdDb25zZW50U291cmNlOiAnc2hvcGlmeScsXG4gICAgbWFya2V0aW5nT3B0SW46IGN1c3RvbWVyLm1hcmtldGluZ09wdEluID09PSB0cnVlLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgc2hvcGlmeUN1c3RvbWVySWRcbiAgfTtcbiAgY29uc3QgdXNlclF1ZXJ5ID0gYXFsYFxuICAgIExFVCBleGlzdGluZyA9IEZJUlNUKFxuICAgICAgRk9SIHVzZXIgSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlVTRVJTKX1cbiAgICAgICAgRklMVEVSIHVzZXIuc2hvcGlmeUN1c3RvbWVySWQgPT0gJHtzaG9waWZ5Q3VzdG9tZXJJZH0gfHwgdXNlci5lbWFpbCA9PSAke2VtYWlsfVxuICAgICAgICBMSU1JVCAxXG4gICAgICAgIFJFVFVSTiB1c2VyXG4gICAgKVxuICAgIExFVCB1c2VyS2V5ID0gZXhpc3RpbmcgPyBleGlzdGluZy5fa2V5IDogJHt1c2VyS2V5fVxuICAgIFVQU0VSVCB7X2tleTogdXNlcktleX1cbiAgICBJTlNFUlQgTUVSR0UoJHt1c2VySW5zZXJ0fSwge19rZXk6IHVzZXJLZXksIHVzZXJJZDogdXNlcktleX0pXG4gICAgVVBEQVRFICR7dXNlclVwZGF0ZX0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlVTRVJTKX1cbiAgICBSRVRVUk4gTkVXXG4gIGA7XG4gIGNvbnN0IHVzZXIgPSBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkodXNlclF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpIGFzIFVzZXJUeXBlO1xuICBjb25zdCByZXNvbHZlZFVzZXJLZXkgPSBkb2NLZXkoU3RyaW5nKHVzZXI/Ll9rZXkgfHwgdXNlcj8udXNlcklkIHx8IHVzZXJLZXkpKTtcbiAgY29uc3Qgb3JkZXJLZXkgPSBleHRlcm5hbEtleSgnc2hvcGlmeS1vcmRlcicsIHNob3BpZnlPcmRlcklkKTtcbiAgY29uc3Qgb3JkZXIgPSB7XG4gICAgX2tleTogb3JkZXJLZXksXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICBjdXJyZW5jeTogY2xlYW5TdHJpbmcoaW5wdXQuY3VycmVuY3ksIDMpLnRvVXBwZXJDYXNlKCksXG4gICAgY3VzdG9tZXJPcmRlcklkOiBvcmRlcktleSxcbiAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgIHByb2R1Y3RJZHMsXG4gICAgcHVyY2hhc2VkQXQ6IGlucHV0LnB1cmNoYXNlZEF0IHx8IHRpbWVzdGFtcCxcbiAgICBzaG9waWZ5Q3VzdG9tZXJJZCxcbiAgICBzaG9waWZ5T3JkZXJJZCxcbiAgICB0b3RhbFByaWNlOiBOdW1iZXIoaW5wdXQudG90YWxQcmljZSB8fCAwKSxcbiAgICB1c2VySWQ6IHJlc29sdmVkVXNlcktleVxuICB9O1xuICBjb25zdCBvcmRlclF1ZXJ5ID0gYXFsYFxuICAgIFVQU0VSVCB7X2tleTogJHtvcmRlcktleX19XG4gICAgSU5TRVJUICR7b3JkZXJ9XG4gICAgVVBEQVRFICR7e1xuICAgICAgY3VycmVuY3k6IG9yZGVyLmN1cnJlbmN5LFxuICAgICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICAgIHByb2R1Y3RJZHMsXG4gICAgICBwdXJjaGFzZWRBdDogb3JkZXIucHVyY2hhc2VkQXQsXG4gICAgICB0b3RhbFByaWNlOiBvcmRlci50b3RhbFByaWNlLFxuICAgICAgdXNlcklkOiByZXNvbHZlZFVzZXJLZXlcbiAgICB9fSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuQ1VTVE9NRVJfT1JERVJTKX1cbiAgICBSRVRVUk4gTkVXXG4gIGA7XG4gIGNvbnN0IHNhdmVkT3JkZXIgPSBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkob3JkZXJRdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKSBhcyBDdXN0b21lck9yZGVyVHlwZTtcblxuICBhd2FpdCBzYXZlRWRnZShcbiAgICBjb250ZXh0LFxuICAgIEVER0VTLkhBU19DVVNUT01FUl9PUkRFUixcbiAgICBjcmVhdGVIYXNoKGBoYXNDdXN0b21lck9yZGVyLSR7cmVzb2x2ZWRVc2VyS2V5fS0ke29yZGVyS2V5fWApLFxuICAgIGRvY0lkKENPTExFQ1RJT05TLlVTRVJTLCByZXNvbHZlZFVzZXJLZXkpLFxuICAgIGRvY0lkKENPTExFQ1RJT05TLkNVU1RPTUVSX09SREVSUywgb3JkZXJLZXkpLFxuICAgIHtwdXJjaGFzZWRBdDogb3JkZXIucHVyY2hhc2VkQXQsIHNob3BpZnlDdXN0b21lcklkLCBzaG9waWZ5T3JkZXJJZH1cbiAgKTtcblxuICBhd2FpdCBQcm9taXNlLmFsbChwcm9kdWN0SWRzLm1hcChhc3luYyAocHJvZHVjdElkKSA9PiB7XG4gICAgY29uc3QgcHJvZHVjdCA9IChpbnB1dC5wcm9kdWN0cyB8fCBbXSkuZmluZCgoaXRlbSkgPT4gaXRlbS5wcm9kdWN0SWQgPT09IHByb2R1Y3RJZCkgfHwge3Byb2R1Y3RJZH07XG4gICAgY29uc3QgcHJvZHVjdEtleSA9IGV4dGVybmFsS2V5KCdzaG9waWZ5LXByb2R1Y3QnLCBwcm9kdWN0SWQpO1xuICAgIGNvbnN0IHByb2R1Y3REb2MgPSB7XG4gICAgICBfa2V5OiBwcm9kdWN0S2V5LFxuICAgICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgICBwcm9kdWN0SWQsXG4gICAgICB0aXRsZTogY2xlYW5TdHJpbmcocHJvZHVjdC50aXRsZSwgMzIwKSxcbiAgICAgIHZhcmlhbnRJZDogY2xlYW5FeHRlcm5hbElkKHByb2R1Y3QudmFyaWFudElkLCAxNjApXG4gICAgfTtcbiAgICBjb25zdCBwcm9kdWN0UXVlcnkgPSBhcWxgXG4gICAgICBVUFNFUlQge19rZXk6ICR7cHJvZHVjdEtleX19XG4gICAgICBJTlNFUlQgJHtwcm9kdWN0RG9jfVxuICAgICAgVVBEQVRFICR7e1xuICAgICAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgICAgICB0aXRsZTogcHJvZHVjdERvYy50aXRsZSxcbiAgICAgICAgdmFyaWFudElkOiBwcm9kdWN0RG9jLnZhcmlhbnRJZFxuICAgICAgfX0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlNIT1BJRllfUFJPRFVDVFMpfVxuICAgIGA7XG4gICAgYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHByb2R1Y3RRdWVyeSk7XG4gICAgYXdhaXQgc2F2ZUVkZ2UoXG4gICAgICBjb250ZXh0LFxuICAgICAgRURHRVMuSEFTX1BVUkNIQVNFRF9QUk9EVUNULFxuICAgICAgY3JlYXRlSGFzaChgaGFzUHVyY2hhc2VkUHJvZHVjdC0ke29yZGVyS2V5fS0ke3Byb2R1Y3RLZXl9YCksXG4gICAgICBkb2NJZChDT0xMRUNUSU9OUy5DVVNUT01FUl9PUkRFUlMsIG9yZGVyS2V5KSxcbiAgICAgIGRvY0lkKENPTExFQ1RJT05TLlNIT1BJRllfUFJPRFVDVFMsIHByb2R1Y3RLZXkpLFxuICAgICAge3Byb2R1Y3RJZCwgcHVyY2hhc2VkQXQ6IG9yZGVyLnB1cmNoYXNlZEF0fVxuICAgICk7XG4gIH0pKTtcblxuICBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkoYXFsYFxuICAgIFVQREFURSAke3Jlc29sdmVkVXNlcktleX1cbiAgICBXSVRIIHtcbiAgICAgIGxhc3RQdXJjaGFzZWRBdDogJHtvcmRlci5wdXJjaGFzZWRBdH0sXG4gICAgICB0b3RhbE9yZGVyQ291bnQ6IExFTkdUSChcbiAgICAgICAgRk9SIG9yZGVyIElOIDEuLjEgT1VUQk9VTkQgJHtkb2NJZChDT0xMRUNUSU9OUy5VU0VSUywgcmVzb2x2ZWRVc2VyS2V5KX0gJHtjb2xsZWN0aW9uKEVER0VTLkhBU19DVVNUT01FUl9PUkRFUil9XG4gICAgICAgICAgUkVUVVJOIG9yZGVyXG4gICAgICApLFxuICAgICAgdG90YWxTcGVuZDogU1VNKFxuICAgICAgICBGT1Igb3JkZXIgSU4gMS4uMSBPVVRCT1VORCAke2RvY0lkKENPTExFQ1RJT05TLlVTRVJTLCByZXNvbHZlZFVzZXJLZXkpfSAke2NvbGxlY3Rpb24oRURHRVMuSEFTX0NVU1RPTUVSX09SREVSKX1cbiAgICAgICAgICBSRVRVUk4gVE9fTlVNQkVSKG9yZGVyLnRvdGFsUHJpY2UpXG4gICAgICApXG4gICAgfSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuVVNFUlMpfVxuICBgKTtcblxuICByZXR1cm4gc2F2ZWRPcmRlcjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDdXN0b21lck9yZGVyc0J5VXNlciA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdXNlcklkOiBzdHJpbmdcbik6IFByb21pc2U8Q3VzdG9tZXJPcmRlclR5cGVbXT4gPT4ge1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBGT1Igb3JkZXIgSU4gMS4uMSBPVVRCT1VORCAke2RvY0lkKENPTExFQ1RJT05TLlVTRVJTLCB1c2VySWQpfSAke2NvbGxlY3Rpb24oRURHRVMuSEFTX0NVU1RPTUVSX09SREVSKX1cbiAgICAgIFNPUlQgb3JkZXIucHVyY2hhc2VkQXQgREVTQ1xuICAgICAgUkVUVVJOIG9yZGVyXG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpO1xufTtcblxuY29uc3Qgc2VuZFN1cHBvcnRUaWNrZXRFbWFpbCA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdGlja2V0OiBTdXBwb3J0VGlja2V0VHlwZURhdGEsXG4gIGRldGFpbHM6IHN0cmluZyxcbiAgaGVhZGluZzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgdXNlciA9IGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxgXG4gICAgUkVUVVJOIERPQ1VNRU5UKCR7ZG9jSWQoQ09MTEVDVElPTlMuVVNFUlMsIHRpY2tldC51c2VySWQpfSlcbiAgYCkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKSBhcyBVc2VyVHlwZSB8IG51bGw7XG4gIGlmKCF1c2VyPy5lbWFpbCkgcmV0dXJuO1xuICBjb25zdCBzdXBwb3J0TmFtZSA9IGNvbnRleHQuY29uZmlnPy5kZXRhaWxzPy5zdXBwb3J0TmFtZSB8fCBDb25maWcuZ2V0KCdkZXRhaWxzLnN1cHBvcnROYW1lJykgfHwgJ1JlYWt0b3IgU3VwcG9ydCc7XG4gIGNvbnN0IHN1cHBvcnRFbWFpbCA9IGNvbnRleHQuY29uZmlnPy5kZXRhaWxzPy5zdXBwb3J0RW1haWwgfHwgQ29uZmlnLmdldCgnZGV0YWlscy5zdXBwb3J0RW1haWwnKSB8fCAnc3VwcG9ydEByZWFrdG9yLmlvJztcbiAgY29uc3QgdGlja2V0TnVtYmVyID0gU3RyaW5nKHRpY2tldC50aWNrZXROdW1iZXIgfHwgdGlja2V0LnN1cHBvcnRUaWNrZXRJZCB8fCB0aWNrZXQuX2tleSB8fCAnJyk7XG4gIGNvbnN0IHN0YXR1c1VybCA9IGBodHRwczovL2NybS5yZWFrdG9yLmlvL3N1cHBvcnQvc3RhdHVzP3RpY2tldD0ke2VuY29kZVVSSUNvbXBvbmVudCh0aWNrZXROdW1iZXIpfWA7XG4gIGNvbnN0IHRleHQgPSBgJHtoZWFkaW5nfVxcblxcblRpY2tldDogJHt0aWNrZXROdW1iZXJ9XFxuU3RhdHVzOiAke3RpY2tldC5zdGF0dXMgfHwgJ3N1Ym1pdHRlZCd9XFxuXFxuJHtkZXRhaWxzfVxcblxcblRyYWNrIHRoaXMgdGlja2V0OiAke3N0YXR1c1VybH1gO1xuICBhd2FpdCBzZXNTZW5kKHtcbiAgICBEZXN0aW5hdGlvbjoge1RvQWRkcmVzc2VzOiBbU3RyaW5nKHVzZXIuZW1haWwpXX0sXG4gICAgTWVzc2FnZToge1xuICAgICAgQm9keToge0h0bWw6IHtEYXRhOiBgPGgxPiR7ZXNjYXBlSHRtbChoZWFkaW5nKX08L2gxPjxwPjxzdHJvbmc+VGlja2V0Ojwvc3Ryb25nPiAke2VzY2FwZUh0bWwodGlja2V0TnVtYmVyKX08L3A+PHA+PHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+ICR7ZXNjYXBlSHRtbChTdHJpbmcodGlja2V0LnN0YXR1cyB8fCAnc3VibWl0dGVkJykpfTwvcD48cHJlIHN0eWxlPVwid2hpdGUtc3BhY2U6cHJlLXdyYXA7Zm9udC1mYW1pbHk6aW5oZXJpdFwiPiR7ZXNjYXBlSHRtbChkZXRhaWxzKX08L3ByZT48cD48YSBocmVmPVwiJHtlc2NhcGVIdG1sKHN0YXR1c1VybCl9XCI+VHJhY2sgdGhpcyB0aWNrZXQgb25saW5lPC9hPjwvcD5gfSwgVGV4dDoge0RhdGE6IHRleHR9fSxcbiAgICAgIFN1YmplY3Q6IHtEYXRhOiBgWyR7dGlja2V0TnVtYmVyfV0gJHtoZWFkaW5nfWB9XG4gICAgfSxcbiAgICBTb3VyY2U6IGBcIiR7c3VwcG9ydE5hbWV9XCIgPCR7c3VwcG9ydEVtYWlsfT5gXG4gIH0pLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlU3VwcG9ydFRpY2tldCA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaW5wdXQ6IFBhcnRpYWw8U3VwcG9ydFRpY2tldFR5cGVEYXRhPlxuKTogUHJvbWlzZTxTdXBwb3J0VGlja2V0VHlwZURhdGE+ID0+IHtcbiAgY29uc3QgdGltZXN0YW1wID0gbm93KCk7XG4gIGNvbnN0IHVzZXJLZXkgPSBkb2NLZXkoU3RyaW5nKGlucHV0LnVzZXJJZCB8fCAnJykpO1xuICBjb25zdCB0aWNrZXRLZXkgPSBkb2NLZXkoU3RyaW5nKGlucHV0LnN1cHBvcnRUaWNrZXRJZCB8fCBjcmVhdGVIYXNoKGBzdXBwb3J0LXRpY2tldC0ke3VzZXJLZXl9LSR7dGltZXN0YW1wfWApKSk7XG4gIGNvbnN0IHRpY2tldE51bWJlciA9IGNsZWFuU3RyaW5nKGlucHV0LnRpY2tldE51bWJlciwgODApIHx8IGBSS1QtJHtuZXcgRGF0ZSh0aW1lc3RhbXApLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTApLnJlcGxhY2UoLy0vZywgJycpfS0ke3RpY2tldEtleS5zbGljZSgwLCA4KS50b1VwcGVyQ2FzZSgpfWA7XG4gIGNvbnN0IHRpY2tldCA9IHtcbiAgICBfa2V5OiB0aWNrZXRLZXksXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICBhc3NpZ25lZFRvVXNlcklkOiBkb2NLZXkoU3RyaW5nKGlucHV0LmFzc2lnbmVkVG9Vc2VySWQgfHwgJycpKSxcbiAgICBkZXNjcmlwdGlvbjogY2xlYW5TdHJpbmcoaW5wdXQuZGVzY3JpcHRpb24sIDQwMDApLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgcHJpb3JpdHk6IGlucHV0LnByaW9yaXR5IHx8ICdub3JtYWwnLFxuICAgIHByb2R1Y3RJZDogY2xlYW5FeHRlcm5hbElkKGlucHV0LnByb2R1Y3RJZCwgMzIwKSxcbiAgICBzaG9waWZ5T3JkZXJJZDogY2xlYW5TdHJpbmcoaW5wdXQuc2hvcGlmeU9yZGVySWQsIDE2MCksXG4gICAgc3RhdHVzOiAnc3VibWl0dGVkJyxcbiAgICBzdWJqZWN0OiBjbGVhblN0cmluZyhpbnB1dC5zdWJqZWN0LCAzMjApLFxuICAgIHN1cHBvcnRUaWNrZXRJZDogdGlja2V0S2V5LFxuICAgIHRpY2tldE51bWJlcixcbiAgICB0eXBlOiBpbnB1dC50eXBlIHx8ICdnZW5lcmFsX3N1cHBvcnQnLFxuICAgIHVzZXJJZDogdXNlcktleVxuICB9O1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBJTlNFUlQgJHt0aWNrZXR9IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMpfVxuICAgIFJFVFVSTiBORVdcbiAgYDtcbiAgY29uc3Qgc2F2ZWRUaWNrZXQgPSBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSk7XG5cbiAgYXdhaXQgc2F2ZUVkZ2UoXG4gICAgY29udGV4dCxcbiAgICBFREdFUy5IQVNfU1VQUE9SVF9USUNLRVQsXG4gICAgY3JlYXRlSGFzaChgaGFzU3VwcG9ydFRpY2tldC0ke3VzZXJLZXl9LSR7dGlja2V0S2V5fWApLFxuICAgIGRvY0lkKENPTExFQ1RJT05TLlVTRVJTLCB1c2VyS2V5KSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIHRpY2tldEtleSksXG4gICAge3ByaW9yaXR5OiB0aWNrZXQucHJpb3JpdHksIHN0YXR1czogdGlja2V0LnN0YXR1cywgdHlwZTogdGlja2V0LnR5cGV9XG4gICk7XG4gIGF3YWl0IGFkZFN1cHBvcnRUaWNrZXRFdmVudChjb250ZXh0LCB7XG4gICAgYWN0b3JVc2VySWQ6IGRvY0tleShTdHJpbmcoY29udGV4dD8uc2Vzc2lvbj8udXNlcklkIHx8IHVzZXJLZXkpKSxcbiAgICBldmVudFR5cGU6ICdzdWJtaXR0ZWQnLFxuICAgIG1ldGFkYXRhOiB7ZGV0YWlsczogdGlja2V0LmRlc2NyaXB0aW9ufSxcbiAgICBzdXBwb3J0VGlja2V0SWQ6IHRpY2tldEtleSxcbiAgICB0b1ZhbHVlOiB0aWNrZXQuc3RhdHVzXG4gIH0pO1xuXG4gIHJldHVybiBzYXZlZFRpY2tldDtcbn07XG5cbmV4cG9ydCBjb25zdCBzdWJtaXRQdWJsaWNTdXBwb3J0VGlja2V0ID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBpbnB1dDogUHVibGljU3VwcG9ydFRpY2tldElucHV0XG4pOiBQcm9taXNlPFN1cHBvcnRUaWNrZXRUeXBlRGF0YT4gPT4ge1xuICBjb25zdCBlbWFpbCA9IGNsZWFuU3RyaW5nKGlucHV0LmVtYWlsLCAzMjApLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gY2xlYW5TdHJpbmcoaW5wdXQuZGVzY3JpcHRpb24sIDQwMDApO1xuICBjb25zdCBzdWJqZWN0ID0gY2xlYW5TdHJpbmcoaW5wdXQuc3ViamVjdCwgMzIwKTtcbiAgaWYoIWVtYWlsUGF0dGVybi50ZXN0KGVtYWlsKSkgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZF92YWxpZF9lbWFpbCcpO1xuICBpZighc3ViamVjdCkgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZF9zdWJqZWN0Jyk7XG4gIGlmKCFkZXNjcmlwdGlvbikgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZF9kZXNjcmlwdGlvbicpO1xuXG4gIGNvbnN0IGRhdGFiYXNlID0gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpO1xuICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRfRVZFTlRTLFxuICAgIENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUX01FU1NBR0VTLFxuICAgIENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUUyxcbiAgICBDT0xMRUNUSU9OUy5VU0VSU1xuICBdLm1hcCgobmFtZSkgPT4gZW5zdXJlRG9jdW1lbnRDb2xsZWN0aW9uKGRhdGFiYXNlLCBuYW1lKSkpO1xuICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgRURHRVMuSEFTX1NVUFBPUlRfVElDS0VULFxuICAgIEVER0VTLkhBU19TVVBQT1JUX1RJQ0tFVF9FVkVOVCxcbiAgICBFREdFUy5IQVNfU1VQUE9SVF9USUNLRVRfTUVTU0FHRVxuICBdLm1hcCgobmFtZSkgPT4gZW5zdXJlRWRnZUNvbGxlY3Rpb24oZGF0YWJhc2UsIG5hbWUpKSk7XG5cbiAgY29uc3QgdGltZXN0YW1wID0gbm93KCk7XG4gIGNvbnN0IGdlbmVyYXRlZFVzZXJLZXkgPSBjcmVhdGVIYXNoKGVtYWlsLCBudWxsKTtcbiAgY29uc3Qgb3B0ZWRJbiA9IGlucHV0Lm1hcmtldGluZ09wdEluID09PSB0cnVlO1xuICBjb25zdCB1c2VySW5zZXJ0ID0ge1xuICAgIF9rZXk6IGdlbmVyYXRlZFVzZXJLZXksXG4gICAgYWN0aXZlOiBmYWxzZSxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIGVtYWlsLFxuICAgIGZpcnN0TmFtZTogY2xlYW5TdHJpbmcoaW5wdXQuZmlyc3ROYW1lLCAxNjApLFxuICAgIGxhc3ROYW1lOiBjbGVhblN0cmluZyhpbnB1dC5sYXN0TmFtZSwgMTYwKSxcbiAgICBtYWlsaW5nTGlzdDogb3B0ZWRJbixcbiAgICBtYXJrZXRpbmdPcHRJbjogb3B0ZWRJbixcbiAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgIHVzZXJJZDogZ2VuZXJhdGVkVXNlcktleVxuICB9O1xuICBjb25zdCB1c2VyVXBkYXRlID0ge1xuICAgIC4uLihvcHRlZEluID8ge21haWxpbmdMaXN0OiB0cnVlLCBtYXJrZXRpbmdPcHRJbjogdHJ1ZSwgbWFya2V0aW5nT3B0SW5BdDogdGltZXN0YW1wfSA6IHt9KSxcbiAgICBmaXJzdE5hbWU6IGNsZWFuU3RyaW5nKGlucHV0LmZpcnN0TmFtZSwgMTYwKSB8fCB1bmRlZmluZWQsXG4gICAgbGFzdE5hbWU6IGNsZWFuU3RyaW5nKGlucHV0Lmxhc3ROYW1lLCAxNjApIHx8IHVuZGVmaW5lZCxcbiAgICBtb2RpZmllZDogdGltZXN0YW1wXG4gIH07XG4gIGNvbnN0IHVzZXIgPSBhd2FpdCBkYXRhYmFzZS5xdWVyeShhcWxgXG4gICAgVVBTRVJUIHtlbWFpbDogJHtlbWFpbH19XG4gICAgICBJTlNFUlQgJHt1c2VySW5zZXJ0fVxuICAgICAgVVBEQVRFICR7dXNlclVwZGF0ZX1cbiAgICAgIElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5VU0VSUyl9XG4gICAgICBSRVRVUk4gTkVXXG4gIGApLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSkgYXMgVXNlclR5cGU7XG4gIGNvbnN0IHRpY2tldCA9IGF3YWl0IGNyZWF0ZVN1cHBvcnRUaWNrZXQoY29udGV4dCwge1xuICAgIGRlc2NyaXB0aW9uLFxuICAgIHByaW9yaXR5OiBzdXBwb3J0UHJpb3JpdGllcy5oYXMoU3RyaW5nKGlucHV0LnByaW9yaXR5KSkgPyBpbnB1dC5wcmlvcml0eSA6ICdub3JtYWwnLFxuICAgIHN1YmplY3QsXG4gICAgdHlwZTogc3VwcG9ydFR5cGVzLmhhcyhTdHJpbmcoaW5wdXQudHlwZSkpID8gaW5wdXQudHlwZSA6ICdnZW5lcmFsX3N1cHBvcnQnLFxuICAgIHVzZXJJZDogU3RyaW5nKHVzZXI/Ll9rZXkgfHwgdXNlcj8udXNlcklkIHx8IGdlbmVyYXRlZFVzZXJLZXkpXG4gIH0pO1xuICBhd2FpdCBzZW5kU3VwcG9ydFRpY2tldEVtYWlsKGNvbnRleHQsIHRpY2tldCwgZGVzY3JpcHRpb24sICdXZSByZWNlaXZlZCB5b3VyIHN1cHBvcnQgdGlja2V0Jyk7XG4gIHJldHVybiB0aWNrZXQ7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UHVibGljU3VwcG9ydFRpY2tldCA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdGlja2V0TnVtYmVyOiBzdHJpbmcsXG4gIGVtYWlsQWRkcmVzczogc3RyaW5nXG4pOiBQcm9taXNlPFB1YmxpY1N1cHBvcnRUaWNrZXRGZWVkIHwgbnVsbD4gPT4ge1xuICBjb25zdCBlbWFpbCA9IGNsZWFuU3RyaW5nKGVtYWlsQWRkcmVzcywgMzIwKS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBudW1iZXIgPSBjbGVhblN0cmluZyh0aWNrZXROdW1iZXIsIDgwKS50b1VwcGVyQ2FzZSgpO1xuICBpZighZW1haWxQYXR0ZXJuLnRlc3QoZW1haWwpIHx8ICFudW1iZXIpIHJldHVybiBudWxsO1xuICBjb25zdCBkYXRhYmFzZSA9IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKTtcbiAgaWYoIWF3YWl0IGRhdGFiYXNlLmNvbGxlY3Rpb24oQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRTKS5leGlzdHMoKSkgcmV0dXJuIG51bGw7XG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxgXG4gICAgRk9SIHRpY2tldCBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRTKX1cbiAgICAgIEZJTFRFUiBVUFBFUih0aWNrZXQudGlja2V0TnVtYmVyKSA9PSAke251bWJlcn1cbiAgICAgIExFVCB1c2VyID0gRE9DVU1FTlQoJHtDT0xMRUNUSU9OUy5VU0VSU30sIHRpY2tldC51c2VySWQpXG4gICAgICBGSUxURVIgTE9XRVIodXNlci5lbWFpbCkgPT0gJHtlbWFpbH1cbiAgICAgIExFVCBtZXNzYWdlcyA9IChcbiAgICAgICAgRk9SIG1lc3NhZ2UgSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUX01FU1NBR0VTKX1cbiAgICAgICAgICBGSUxURVIgbWVzc2FnZS5zdXBwb3J0VGlja2V0SWQgPT0gdGlja2V0Ll9rZXkgQU5EIG1lc3NhZ2UudmlzaWJpbGl0eSA9PSBcImN1c3RvbWVyXCJcbiAgICAgICAgICBTT1JUIG1lc3NhZ2UuYWRkZWQgQVNDXG4gICAgICAgICAgUkVUVVJOIG1lc3NhZ2VcbiAgICAgIClcbiAgICAgIExFVCBldmVudHMgPSAoXG4gICAgICAgIEZPUiBldmVudCBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRfRVZFTlRTKX1cbiAgICAgICAgICBGSUxURVIgZXZlbnQuc3VwcG9ydFRpY2tldElkID09IHRpY2tldC5fa2V5XG4gICAgICAgICAgU09SVCBldmVudC5hZGRlZCBBU0NcbiAgICAgICAgICBSRVRVUk4gZXZlbnRcbiAgICAgIClcbiAgICAgIExJTUlUIDFcbiAgICAgIFJFVFVSTiB7dGlja2V0LCBtZXNzYWdlcywgZXZlbnRzfVxuICBgKS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpIGFzIFByb21pc2U8UHVibGljU3VwcG9ydFRpY2tldEZlZWQgfCBudWxsPjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTdXBwb3J0VGlja2V0cyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgZmlsdGVyczoge3JlYWRvbmx5IHN0YXR1cz86IHN0cmluZzsgcmVhZG9ubHkgdXNlcklkPzogc3RyaW5nfSA9IHt9XG4pOiBQcm9taXNlPFN1cHBvcnRUaWNrZXRUeXBlRGF0YVtdPiA9PiB7XG4gIGNvbnN0IGRhdGFiYXNlID0gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpO1xuICByZXR1cm4gKGFzeW5jICgpID0+IHtcbiAgICBpZighYXdhaXQgZGF0YWJhc2UuY29sbGVjdGlvbihDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMpLmV4aXN0cygpKSByZXR1cm4gW107XG4gICAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgICBGT1IgdGlja2V0IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMpfVxuICAgICAgICAke2ZpbHRlcnMuc3RhdHVzID8gYXFsYEZJTFRFUiB0aWNrZXQuc3RhdHVzID09ICR7ZmlsdGVycy5zdGF0dXN9YCA6IGFxbGBgfVxuICAgICAgICAke2ZpbHRlcnMudXNlcklkID8gYXFsYEZJTFRFUiB0aWNrZXQudXNlcklkID09ICR7ZG9jS2V5KGZpbHRlcnMudXNlcklkKX1gIDogYXFsYGB9XG4gICAgICAgIExFVCB1c2VyID0gRE9DVU1FTlQoJHtDT0xMRUNUSU9OUy5VU0VSU30sIHRpY2tldC51c2VySWQpXG4gICAgICAgIFNPUlQgdGlja2V0LmFkZGVkIERFU0NcbiAgICAgICAgUkVUVVJOIE1FUkdFKHRpY2tldCwge3VzZXJ9KVxuICAgIGA7XG4gICAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG4gIH0pKCk7XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlU3VwcG9ydFRpY2tldFN0YXR1cyA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgc3VwcG9ydFRpY2tldElkOiBzdHJpbmcsXG4gIHN0YXR1czogU3VwcG9ydFRpY2tldFN0YXR1cyxcbiAgcmVzb2x1dGlvblN1bW1hcnkgPSAnJ1xuKTogUHJvbWlzZTxTdXBwb3J0VGlja2V0VHlwZURhdGE+ID0+IHtcbiAgY29uc3QgdGlja2V0S2V5ID0gZG9jS2V5KHN1cHBvcnRUaWNrZXRJZCk7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCBwcmV2aW91cyA9IGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKVxuICAgIC5xdWVyeShhcWxgUkVUVVJOIERPQ1VNRU5UKCR7ZG9jSWQoQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRTLCB0aWNrZXRLZXkpfSlgKVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpIGFzIFN1cHBvcnRUaWNrZXRUeXBlRGF0YSB8IG51bGw7XG4gIGNvbnN0IHVwZGF0ZSA9IHtcbiAgICAuLi4oc3RhdHVzID09PSAnY29tcGxldGVkJyAmJiB7Y29tcGxldGVkQXQ6IHRpbWVzdGFtcCwgcmVzb2x1dGlvblN1bW1hcnk6IGNsZWFuU3RyaW5nKHJlc29sdXRpb25TdW1tYXJ5LCA0MDAwKX0pLFxuICAgIC4uLihzdGF0dXMgPT09ICdkb25lJyAmJiB7ZG9uZUF0OiB0aW1lc3RhbXAsIHJlc29sdXRpb25TdW1tYXJ5OiBjbGVhblN0cmluZyhyZXNvbHV0aW9uU3VtbWFyeSwgNDAwMCl9KSxcbiAgICAuLi4oc3RhdHVzID09PSAncmVzb2x2ZWQnICYmIHtyZXNvbHZlZEF0OiB0aW1lc3RhbXAsIHJlc29sdXRpb25TdW1tYXJ5OiBjbGVhblN0cmluZyhyZXNvbHV0aW9uU3VtbWFyeSwgNDAwMCl9KSxcbiAgICAuLi4oc3RhdHVzID09PSAnY2xvc2VkJyAmJiB7Y2xvc2VkQXQ6IHRpbWVzdGFtcH0pLFxuICAgIGxhc3RVcGRhdGVEZXRhaWxzOiBjbGVhblN0cmluZyhyZXNvbHV0aW9uU3VtbWFyeSwgNDAwMCksXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBzdGF0dXNcbiAgfTtcbiAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgVVBEQVRFICR7dGlja2V0S2V5fSBXSVRIICR7dXBkYXRlfSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRTKX1cbiAgICBSRVRVUk4gTkVXXG4gIGA7XG4gIGNvbnN0IHRpY2tldCA9IGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKSBhcyBTdXBwb3J0VGlja2V0VHlwZURhdGE7XG5cbiAgYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbGBcbiAgICBGT1IgZWRnZSBJTiAke2NvbGxlY3Rpb24oRURHRVMuSEFTX1NVUFBPUlRfVElDS0VUKX1cbiAgICAgIEZJTFRFUiBlZGdlLl90byA9PSAke2RvY0lkKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUUywgdGlja2V0S2V5KX1cbiAgICAgIFVQREFURSBlZGdlIFdJVEggJHt7XG4gICAgICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgICAgIHJlc29sdmVkQXQ6IHN0YXR1cyA9PT0gJ3Jlc29sdmVkJyA/IHRpbWVzdGFtcCA6IHVuZGVmaW5lZCxcbiAgICAgICAgc3RhdHVzXG4gICAgICB9fSBJTiAke2NvbGxlY3Rpb24oRURHRVMuSEFTX1NVUFBPUlRfVElDS0VUKX1cbiAgYCk7XG4gIGF3YWl0IGFkZFN1cHBvcnRUaWNrZXRFdmVudChjb250ZXh0LCB7XG4gICAgYWN0b3JVc2VySWQ6IGRvY0tleShTdHJpbmcoY29udGV4dD8uc2Vzc2lvbj8udXNlcklkIHx8ICcnKSksXG4gICAgZXZlbnRUeXBlOiAnc3RhdHVzX2NoYW5nZWQnLFxuICAgIGZyb21WYWx1ZTogcHJldmlvdXM/LnN0YXR1cyxcbiAgICBzdXBwb3J0VGlja2V0SWQ6IHRpY2tldEtleSxcbiAgICB0b1ZhbHVlOiBzdGF0dXNcbiAgfSk7XG5cbiAgaWYoc3RhdHVzID09PSAncmVzb2x2ZWQnKSB7XG4gICAgYXdhaXQgY3JlYXRlQ3VzdG9tZXJOb3RpZmljYXRpb24oY29udGV4dCwge1xuICAgICAgYm9keTogY2xlYW5TdHJpbmcocmVzb2x1dGlvblN1bW1hcnkgfHwgJ1lvdXIgc3VwcG9ydCB0aWNrZXQgaGFzIGJlZW4gcmVzb2x2ZWQuJywgNDAwMCksXG4gICAgICBzdGF0dXM6ICdxdWV1ZWQnLFxuICAgICAgc3ViamVjdDogYFJlc29sdmVkOiAke3RpY2tldC5zdWJqZWN0IHx8ICdTdXBwb3J0IHRpY2tldCd9YCxcbiAgICAgIHN1cHBvcnRUaWNrZXRJZDogdGlja2V0S2V5LFxuICAgICAgdHlwZTogJ3N1cHBvcnRfdGlja2V0X3Jlc29sdmVkJyxcbiAgICAgIHVzZXJJZDogdGlja2V0LnVzZXJJZFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHRpY2tldDtcbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVTdXBwb3J0VGlja2V0UHJvZ3Jlc3MgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHN1cHBvcnRUaWNrZXRJZDogc3RyaW5nLFxuICBzdGF0dXM6IFN1cHBvcnRUaWNrZXRTdGF0dXMsXG4gIGRldGFpbHM6IHN0cmluZ1xuKTogUHJvbWlzZTxTdXBwb3J0VGlja2V0VHlwZURhdGE+ID0+IHtcbiAgcmVxdWlyZUNybUFkbWluKGNvbnRleHQpO1xuICBpZighc3VwcG9ydFN0YXR1c2VzLmhhcyhzdGF0dXMpKSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWRfc3VwcG9ydF90aWNrZXRfc3RhdHVzJyk7XG4gIGNvbnN0IG1hcmtkb3duID0gY2xlYW5TdHJpbmcoZGV0YWlscywgNDAwMCk7XG4gIGlmKCFtYXJrZG93bikgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZF91cGRhdGVfZGV0YWlscycpO1xuICBjb25zdCB0aWNrZXQgPSBhd2FpdCB1cGRhdGVTdXBwb3J0VGlja2V0U3RhdHVzKGNvbnRleHQsIHN1cHBvcnRUaWNrZXRJZCwgc3RhdHVzLCBtYXJrZG93bik7XG4gIGF3YWl0IGFkZFN1cHBvcnRUaWNrZXRNZXNzYWdlKGNvbnRleHQsIHtcbiAgICBhdXRob3JVc2VySWQ6IFN0cmluZyhjb250ZXh0LnNlc3Npb24/LnVzZXJJZCB8fCAnJyksXG4gICAgYm9keTogbWFya2Rvd24sXG4gICAgc3VwcG9ydFRpY2tldElkLFxuICAgIHZpc2liaWxpdHk6ICdjdXN0b21lcidcbiAgfSk7XG4gIGF3YWl0IGNyZWF0ZUN1c3RvbWVyTm90aWZpY2F0aW9uKGNvbnRleHQsIHtcbiAgICBib2R5OiBtYXJrZG93bixcbiAgICBzdGF0dXM6ICdzZW50JyxcbiAgICBzdWJqZWN0OiBgVGlja2V0ICR7dGlja2V0LnRpY2tldE51bWJlciB8fCBzdXBwb3J0VGlja2V0SWR9OiAke3N0YXR1cy5yZXBsYWNlKC9fL2csICcgJyl9YCxcbiAgICBzdXBwb3J0VGlja2V0SWQsXG4gICAgdHlwZTogJ3N1cHBvcnRfdGlja2V0X3Byb2dyZXNzJyxcbiAgICB1c2VySWQ6IHRpY2tldC51c2VySWRcbiAgfSk7XG4gIGF3YWl0IHNlbmRTdXBwb3J0VGlja2V0RW1haWwoY29udGV4dCwgdGlja2V0LCBtYXJrZG93biwgYFN1cHBvcnQgdGlja2V0ICR7c3RhdHVzLnJlcGxhY2UoL18vZywgJyAnKX1gKTtcbiAgcmV0dXJuIHRpY2tldDtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRTdXBwb3J0VGlja2V0TWVzc2FnZSA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaW5wdXQ6IFBhcnRpYWw8U3VwcG9ydFRpY2tldE1lc3NhZ2VUeXBlPlxuKTogUHJvbWlzZTxTdXBwb3J0VGlja2V0TWVzc2FnZVR5cGU+ID0+IHtcbiAgY29uc3QgdGltZXN0YW1wID0gbm93KCk7XG4gIGNvbnN0IHRpY2tldEtleSA9IGRvY0tleShTdHJpbmcoaW5wdXQuc3VwcG9ydFRpY2tldElkIHx8ICcnKSk7XG4gIGNvbnN0IG1lc3NhZ2VLZXkgPSBkb2NLZXkoU3RyaW5nKGlucHV0LnN1cHBvcnRUaWNrZXRNZXNzYWdlSWQgfHwgY3JlYXRlSGFzaChgc3VwcG9ydC10aWNrZXQtbWVzc2FnZS0ke3RpY2tldEtleX0tJHt0aW1lc3RhbXB9YCkpKTtcbiAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICBfa2V5OiBtZXNzYWdlS2V5LFxuICAgIGFkZGVkOiB0aW1lc3RhbXAsXG4gICAgYXV0aG9yVXNlcklkOiBkb2NLZXkoU3RyaW5nKGlucHV0LmF1dGhvclVzZXJJZCB8fCBjb250ZXh0Py5zZXNzaW9uPy51c2VySWQgfHwgJycpKSxcbiAgICBib2R5OiBjbGVhblN0cmluZyhpbnB1dC5ib2R5LCA0MDAwKSxcbiAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgIHN1cHBvcnRUaWNrZXRJZDogdGlja2V0S2V5LFxuICAgIHN1cHBvcnRUaWNrZXRNZXNzYWdlSWQ6IG1lc3NhZ2VLZXksXG4gICAgdmlzaWJpbGl0eTogaW5wdXQudmlzaWJpbGl0eSB8fCAnY3VzdG9tZXInXG4gIH07XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIElOU0VSVCAke21lc3NhZ2V9IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVF9NRVNTQUdFUyl9XG4gICAgUkVUVVJOIE5FV1xuICBgO1xuICBjb25zdCBzYXZlZE1lc3NhZ2UgPSBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSk7XG5cbiAgYXdhaXQgc2F2ZUVkZ2UoXG4gICAgY29udGV4dCxcbiAgICBFREdFUy5IQVNfU1VQUE9SVF9USUNLRVRfTUVTU0FHRSxcbiAgICBjcmVhdGVIYXNoKGBoYXNTdXBwb3J0VGlja2V0TWVzc2FnZS0ke3RpY2tldEtleX0tJHttZXNzYWdlS2V5fWApLFxuICAgIGRvY0lkKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUUywgdGlja2V0S2V5KSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVF9NRVNTQUdFUywgbWVzc2FnZUtleSksXG4gICAge2F1dGhvclVzZXJJZDogbWVzc2FnZS5hdXRob3JVc2VySWQsIHZpc2liaWxpdHk6IG1lc3NhZ2UudmlzaWJpbGl0eX1cbiAgKTtcblxuICByZXR1cm4gc2F2ZWRNZXNzYWdlO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFN1cHBvcnRUaWNrZXRNZXNzYWdlcyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgc3VwcG9ydFRpY2tldElkOiBzdHJpbmdcbik6IFByb21pc2U8U3VwcG9ydFRpY2tldE1lc3NhZ2VUeXBlW10+ID0+IHtcbiAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgRk9SIG1lc3NhZ2UgSU4gMS4uMSBPVVRCT1VORCAke2RvY0lkKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUUywgc3VwcG9ydFRpY2tldElkKX0gJHtjb2xsZWN0aW9uKEVER0VTLkhBU19TVVBQT1JUX1RJQ0tFVF9NRVNTQUdFKX1cbiAgICAgIFNPUlQgbWVzc2FnZS5hZGRlZCBBU0NcbiAgICAgIFJFVFVSTiBtZXNzYWdlXG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZFN1cHBvcnRUaWNrZXRFdmVudCA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaW5wdXQ6IFBhcnRpYWw8U3VwcG9ydFRpY2tldEV2ZW50VHlwZT5cbik6IFByb21pc2U8U3VwcG9ydFRpY2tldEV2ZW50VHlwZT4gPT4ge1xuICBjb25zdCB0aW1lc3RhbXAgPSBub3coKTtcbiAgY29uc3QgdGlja2V0S2V5ID0gZG9jS2V5KFN0cmluZyhpbnB1dC5zdXBwb3J0VGlja2V0SWQgfHwgJycpKTtcbiAgY29uc3QgZXZlbnRLZXkgPSBkb2NLZXkoU3RyaW5nKGlucHV0LnN1cHBvcnRUaWNrZXRFdmVudElkIHx8IGNyZWF0ZUhhc2goYHN1cHBvcnQtdGlja2V0LWV2ZW50LSR7dGlja2V0S2V5fS0ke3RpbWVzdGFtcH0tJHtpbnB1dC5ldmVudFR5cGV9YCkpKTtcbiAgY29uc3QgZXZlbnQgPSB7XG4gICAgX2tleTogZXZlbnRLZXksXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICBhY3RvclVzZXJJZDogZG9jS2V5KFN0cmluZyhpbnB1dC5hY3RvclVzZXJJZCB8fCAnJykpLFxuICAgIGV2ZW50VHlwZTogY2xlYW5TdHJpbmcoaW5wdXQuZXZlbnRUeXBlLCAxNjApLFxuICAgIGZyb21WYWx1ZTogY2xlYW5TdHJpbmcoaW5wdXQuZnJvbVZhbHVlLCAzMjApLFxuICAgIG1ldGFkYXRhOiBpbnB1dC5tZXRhZGF0YSB8fCB7fSxcbiAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgIHN1cHBvcnRUaWNrZXRFdmVudElkOiBldmVudEtleSxcbiAgICBzdXBwb3J0VGlja2V0SWQ6IHRpY2tldEtleSxcbiAgICB0b1ZhbHVlOiBjbGVhblN0cmluZyhpbnB1dC50b1ZhbHVlLCAzMjApXG4gIH07XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIElOU0VSVCAke2V2ZW50fSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRfRVZFTlRTKX1cbiAgICBSRVRVUk4gTkVXXG4gIGA7XG4gIGNvbnN0IHNhdmVkRXZlbnQgPSBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSk7XG5cbiAgYXdhaXQgc2F2ZUVkZ2UoXG4gICAgY29udGV4dCxcbiAgICBFREdFUy5IQVNfU1VQUE9SVF9USUNLRVRfRVZFTlQsXG4gICAgY3JlYXRlSGFzaChgaGFzU3VwcG9ydFRpY2tldEV2ZW50LSR7dGlja2V0S2V5fS0ke2V2ZW50S2V5fWApLFxuICAgIGRvY0lkKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUUywgdGlja2V0S2V5KSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVF9FVkVOVFMsIGV2ZW50S2V5KSxcbiAgICB7YWN0b3JVc2VySWQ6IGV2ZW50LmFjdG9yVXNlcklkLCBldmVudFR5cGU6IGV2ZW50LmV2ZW50VHlwZX1cbiAgKTtcblxuICByZXR1cm4gc2F2ZWRFdmVudDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTdXBwb3J0VGlja2V0RXZlbnRzID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBzdXBwb3J0VGlja2V0SWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxTdXBwb3J0VGlja2V0RXZlbnRUeXBlW10+ID0+IHtcbiAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgRk9SIGV2ZW50IElOIDEuLjEgT1VUQk9VTkQgJHtkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIHN1cHBvcnRUaWNrZXRJZCl9ICR7Y29sbGVjdGlvbihFREdFUy5IQVNfU1VQUE9SVF9USUNLRVRfRVZFTlQpfVxuICAgICAgU09SVCBldmVudC5hZGRlZCBBU0NcbiAgICAgIFJFVFVSTiBldmVudFxuICBgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVDdXN0b21lck5vdGlmaWNhdGlvbiA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaW5wdXQ6IFBhcnRpYWw8Q3VzdG9tZXJOb3RpZmljYXRpb25UeXBlPlxuKTogUHJvbWlzZTxDdXN0b21lck5vdGlmaWNhdGlvblR5cGU+ID0+IHtcbiAgY29uc3QgdGltZXN0YW1wID0gbm93KCk7XG4gIGNvbnN0IHVzZXJLZXkgPSBkb2NLZXkoU3RyaW5nKGlucHV0LnVzZXJJZCB8fCAnJykpO1xuICBjb25zdCBub3RpZmljYXRpb25LZXkgPSBkb2NLZXkoU3RyaW5nKGlucHV0LmN1c3RvbWVyTm90aWZpY2F0aW9uSWQgfHwgY3JlYXRlSGFzaChgY3VzdG9tZXItbm90aWZpY2F0aW9uLSR7dXNlcktleX0tJHt0aW1lc3RhbXB9YCkpKTtcbiAgY29uc3Qgbm90aWZpY2F0aW9uID0ge1xuICAgIF9rZXk6IG5vdGlmaWNhdGlvbktleSxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIGJvZHk6IGNsZWFuU3RyaW5nKGlucHV0LmJvZHksIDQwMDApLFxuICAgIGN1c3RvbWVyTm90aWZpY2F0aW9uSWQ6IG5vdGlmaWNhdGlvbktleSxcbiAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgIHNlbnRBdDogaW5wdXQuc2VudEF0LFxuICAgIHN0YXR1czogaW5wdXQuc3RhdHVzIHx8ICdxdWV1ZWQnLFxuICAgIHN1YmplY3Q6IGNsZWFuU3RyaW5nKGlucHV0LnN1YmplY3QsIDMyMCksXG4gICAgc3VwcG9ydFRpY2tldElkOiBkb2NLZXkoU3RyaW5nKGlucHV0LnN1cHBvcnRUaWNrZXRJZCB8fCAnJykpLFxuICAgIHR5cGU6IGNsZWFuU3RyaW5nKGlucHV0LnR5cGUsIDE2MCksXG4gICAgdXNlcklkOiB1c2VyS2V5XG4gIH07XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIElOU0VSVCAke25vdGlmaWNhdGlvbn0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLkNVU1RPTUVSX05PVElGSUNBVElPTlMpfVxuICAgIFJFVFVSTiBORVdcbiAgYDtcbiAgY29uc3Qgc2F2ZWROb3RpZmljYXRpb24gPSBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSk7XG5cbiAgYXdhaXQgc2F2ZUVkZ2UoXG4gICAgY29udGV4dCxcbiAgICBFREdFUy5IQVNfQ1VTVE9NRVJfTk9USUZJQ0FUSU9OLFxuICAgIGNyZWF0ZUhhc2goYGhhc0N1c3RvbWVyTm90aWZpY2F0aW9uLSR7dXNlcktleX0tJHtub3RpZmljYXRpb25LZXl9YCksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuVVNFUlMsIHVzZXJLZXkpLFxuICAgIGRvY0lkKENPTExFQ1RJT05TLkNVU1RPTUVSX05PVElGSUNBVElPTlMsIG5vdGlmaWNhdGlvbktleSksXG4gICAge1xuICAgICAgc3RhdHVzOiBub3RpZmljYXRpb24uc3RhdHVzLFxuICAgICAgc3VwcG9ydFRpY2tldElkOiBub3RpZmljYXRpb24uc3VwcG9ydFRpY2tldElkLFxuICAgICAgdHlwZTogbm90aWZpY2F0aW9uLnR5cGVcbiAgICB9XG4gICk7XG5cbiAgcmV0dXJuIHNhdmVkTm90aWZpY2F0aW9uO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEN1c3RvbWVyTm90aWZpY2F0aW9uc0J5VXNlciA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdXNlcklkOiBzdHJpbmdcbik6IFByb21pc2U8Q3VzdG9tZXJOb3RpZmljYXRpb25UeXBlW10+ID0+IHtcbiAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgRk9SIG5vdGlmaWNhdGlvbiBJTiAxLi4xIE9VVEJPVU5EICR7ZG9jSWQoQ09MTEVDVElPTlMuVVNFUlMsIHVzZXJJZCl9ICR7Y29sbGVjdGlvbihFREdFUy5IQVNfQ1VTVE9NRVJfTk9USUZJQ0FUSU9OKX1cbiAgICAgIFNPUlQgbm90aWZpY2F0aW9uLmFkZGVkIERFU0NcbiAgICAgIFJFVFVSTiBub3RpZmljYXRpb25cbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG59O1xuIl0sIm5hbWVzIjpbImNyZWF0ZUhhc2giLCJwYXJzZUlkIiwicGFyc2VQaG9uZSIsInBhcnNlU3RyaW5nIiwiYXFsIiwibGl0ZXJhbCIsIkNPTExFQ1RJT05TIiwiRURHRVMiLCJDb25maWciLCJ1c2VEYiIsImlzQWRtaW5Vc2VyIiwic2VzU2VuZCIsIm5vdyIsIkRhdGUiLCJjb2xsZWN0aW9uIiwibmFtZSIsImRvY0tleSIsInZhbHVlIiwiU3RyaW5nIiwiZG9jSWQiLCJjb2xsZWN0aW9uTmFtZSIsImtleSIsImV4dGVybmFsS2V5IiwicHJlZml4IiwiaWQiLCJjbGVhblN0cmluZyIsImxlbmd0aCIsImNsZWFuRXh0ZXJuYWxJZCIsInRyaW0iLCJzbGljZSIsImVuc3VyZURvY3VtZW50Q29sbGVjdGlvbiIsImRhdGFiYXNlIiwidGFyZ2V0IiwiZXhpc3RzIiwiY3JlYXRlQ29sbGVjdGlvbiIsImVycm9yIiwiZW5zdXJlRWRnZUNvbGxlY3Rpb24iLCJjcmVhdGVFZGdlQ29sbGVjdGlvbiIsInJlcXVpcmVDcm1BZG1pbiIsImNvbnRleHQiLCJzZXNzaW9uIiwiRXJyb3IiLCJyZXF1aXJlQ3JtQWRtaW5pc3RyYXRvciIsImFsbG93ZWRDb250YWN0RmllbGRzIiwiU2V0Iiwic3VwcG9ydFByaW9yaXRpZXMiLCJzdXBwb3J0U3RhdHVzZXMiLCJzdXBwb3J0VHlwZXMiLCJlbWFpbFBhdHRlcm4iLCJlc2NhcGVIdG1sIiwicmVwbGFjZSIsInNhbml0aXplSHRtbCIsInNhbml0aXplQ3NzIiwiaHRtbFRvVGV4dCIsImNodW5rIiwiaXRlbXMiLCJzaXplIiwiZ3JvdXBzIiwiaW5kZXgiLCJwdXNoIiwic3VibWl0Q3JtRm9ybSIsImlucHV0IiwibWFya2V0aW5nT3B0SW4iLCJlbWFpbCIsInRvTG93ZXJDYXNlIiwicmF3UGhvbmUiLCJwaG9uZSIsImRhdGFiYXNlTmFtZSIsIkNSTV9GT1JNX1NVQk1JU1NJT05TIiwidGltZXN0YW1wIiwic291cmNlIiwiZm9ybUlkIiwidmFsdWVzIiwiZmlyc3ROYW1lIiwibGFzdE5hbWUiLCJnZW5lcmF0ZWRVc2VyS2V5IiwiY29uc2VudCIsIm1hcmtldGluZ09wdEluQXQiLCJtYXJrZXRpbmdPcHRPdXRBdCIsInVzZXJJbnNlcnQiLCJfa2V5IiwiYWN0aXZlIiwiYWRkZWQiLCJtYWlsaW5nTGlzdCIsIm1hcmtldGluZ0NvbnNlbnRTb3VyY2UiLCJtb2RpZmllZCIsInR5cGUiLCJ1c2VyQWNjZXNzIiwidXNlcklkIiwidmVyaWZpZWRFbWFpbCIsInZlcmlmaWVkUGhvbmUiLCJ1c2VyVXBkYXRlIiwidXNlciIsInF1ZXJ5IiwiVVNFUlMiLCJ0aGVuIiwiY3Vyc29yIiwibmV4dCIsInN1Ym1pc3Npb25JZCIsInN1Ym1pc3Npb24iLCJzYXZlZCIsImdldENybUZvcm1TdWJtaXNzaW9ucyIsImFsbCIsImdldENybUNvbnRhY3RzIiwiZmlsdGVyIiwic2VhcmNoIiwiZmllbGQiLCJoYXMiLCJvcHRlZEluT25seSIsIm9wZXJhdG9yIiwiaW5jbHVkZXMiLCJzZW5kQ3JtQ2FtcGFpZ24iLCJzdWJqZWN0IiwiYm9keUh0bWwiLCJodG1sIiwiY3NzIiwiY2FuZGlkYXRlcyIsInNlbGVjdGVkSWRzIiwidXNlcklkcyIsIm1hcCIsInJlY2lwaWVudHMiLCJCb29sZWFuIiwiY2FtcGFpZ25JZCIsImNhbXBhaWduIiwiZmFpbGVkQ291bnQiLCJyZWNpcGllbnRDb3VudCIsInNlbnRDb3VudCIsInN0YXR1cyIsIkNSTV9DQU1QQUlHTlMiLCJyZWNpcGllbnRzQmF0Y2giLCJEZXN0aW5hdGlvbiIsIkJjY0FkZHJlc3NlcyIsInJlY2lwaWVudCIsIk1lc3NhZ2UiLCJCb2R5IiwiSHRtbCIsIkRhdGEiLCJUZXh0IiwiU3ViamVjdCIsIlNvdXJjZSIsImNvbmZpZyIsImRldGFpbHMiLCJzdXBwb3J0TmFtZSIsInN1cHBvcnRFbWFpbCIsIl9lcnJvciIsInJlc3VsdCIsInNlbnRBdCIsInNhdmVFZGdlIiwiZWRnZUNvbGxlY3Rpb24iLCJlZGdlS2V5IiwiZnJvbSIsInRvIiwiZGF0YSIsImVkZ2UiLCJfZnJvbSIsIl90byIsImNyZWF0ZU1haWxpbmdMaXN0IiwibWFpbGluZ0xpc3RJZCIsImNyZWF0ZWRCeVVzZXJJZCIsImRlc2NyaXB0aW9uIiwiTUFJTElOR19MSVNUUyIsImdldE1haWxpbmdMaXN0cyIsImFkZFVzZXJUb01haWxpbmdMaXN0IiwidXNlcktleSIsImxpc3RLZXkiLCJIQVNfTUFJTElOR19MSVNUIiwiYWRkZWRCeVVzZXJJZCIsInJlbW92ZVVzZXJGcm9tTWFpbGluZ0xpc3QiLCJ1cGRhdGUiLCJyZW1vdmVkQXQiLCJnZXRNYWlsaW5nTGlzdFVzZXJzIiwibGlzdElkIiwiZ2V0VXNlcnNCeVB1cmNoYXNlZFByb2R1Y3QiLCJwcm9kdWN0SWQiLCJwcm9kdWN0S2V5IiwiU0hPUElGWV9QUk9EVUNUUyIsIkhBU19QVVJDSEFTRURfUFJPRFVDVCIsIkhBU19DVVNUT01FUl9PUkRFUiIsImdldEVsaWdpYmxlTWFpbGluZ1VzZXJzIiwib3B0aW9ucyIsImV4Y2x1ZGVPcGVuU3VwcG9ydFRpY2tldHMiLCJIQVNfU1VQUE9SVF9USUNLRVQiLCJpbmdlc3RTaG9waWZ5Q3VzdG9tZXJPcmRlciIsInNob3BpZnlDdXN0b21lcklkIiwic2hvcGlmeU9yZGVySWQiLCJjdXN0b21lciIsInByb2R1Y3RJZHMiLCJBcnJheSIsInByb2R1Y3RzIiwicHJvZHVjdCIsInVuZGVmaW5lZCIsImxhc3RQdXJjaGFzZWRBdCIsInB1cmNoYXNlZEF0IiwidXNlclF1ZXJ5IiwicmVzb2x2ZWRVc2VyS2V5Iiwib3JkZXJLZXkiLCJvcmRlciIsImN1cnJlbmN5IiwidG9VcHBlckNhc2UiLCJjdXN0b21lck9yZGVySWQiLCJ0b3RhbFByaWNlIiwiTnVtYmVyIiwib3JkZXJRdWVyeSIsIkNVU1RPTUVSX09SREVSUyIsInNhdmVkT3JkZXIiLCJQcm9taXNlIiwiZmluZCIsIml0ZW0iLCJwcm9kdWN0RG9jIiwidGl0bGUiLCJ2YXJpYW50SWQiLCJwcm9kdWN0UXVlcnkiLCJnZXRDdXN0b21lck9yZGVyc0J5VXNlciIsInNlbmRTdXBwb3J0VGlja2V0RW1haWwiLCJ0aWNrZXQiLCJoZWFkaW5nIiwiZ2V0IiwidGlja2V0TnVtYmVyIiwic3VwcG9ydFRpY2tldElkIiwic3RhdHVzVXJsIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwidGV4dCIsIlRvQWRkcmVzc2VzIiwiY2F0Y2giLCJjcmVhdGVTdXBwb3J0VGlja2V0IiwidGlja2V0S2V5IiwidG9JU09TdHJpbmciLCJhc3NpZ25lZFRvVXNlcklkIiwicHJpb3JpdHkiLCJTVVBQT1JUX1RJQ0tFVFMiLCJzYXZlZFRpY2tldCIsImFkZFN1cHBvcnRUaWNrZXRFdmVudCIsImFjdG9yVXNlcklkIiwiZXZlbnRUeXBlIiwibWV0YWRhdGEiLCJ0b1ZhbHVlIiwic3VibWl0UHVibGljU3VwcG9ydFRpY2tldCIsInRlc3QiLCJTVVBQT1JUX1RJQ0tFVF9FVkVOVFMiLCJTVVBQT1JUX1RJQ0tFVF9NRVNTQUdFUyIsIkhBU19TVVBQT1JUX1RJQ0tFVF9FVkVOVCIsIkhBU19TVVBQT1JUX1RJQ0tFVF9NRVNTQUdFIiwib3B0ZWRJbiIsImdldFB1YmxpY1N1cHBvcnRUaWNrZXQiLCJlbWFpbEFkZHJlc3MiLCJudW1iZXIiLCJnZXRTdXBwb3J0VGlja2V0cyIsImZpbHRlcnMiLCJ1cGRhdGVTdXBwb3J0VGlja2V0U3RhdHVzIiwicmVzb2x1dGlvblN1bW1hcnkiLCJwcmV2aW91cyIsImNvbXBsZXRlZEF0IiwiZG9uZUF0IiwicmVzb2x2ZWRBdCIsImNsb3NlZEF0IiwibGFzdFVwZGF0ZURldGFpbHMiLCJmcm9tVmFsdWUiLCJjcmVhdGVDdXN0b21lck5vdGlmaWNhdGlvbiIsImJvZHkiLCJ1cGRhdGVTdXBwb3J0VGlja2V0UHJvZ3Jlc3MiLCJtYXJrZG93biIsImFkZFN1cHBvcnRUaWNrZXRNZXNzYWdlIiwiYXV0aG9yVXNlcklkIiwidmlzaWJpbGl0eSIsIm1lc3NhZ2VLZXkiLCJzdXBwb3J0VGlja2V0TWVzc2FnZUlkIiwibWVzc2FnZSIsInNhdmVkTWVzc2FnZSIsImdldFN1cHBvcnRUaWNrZXRNZXNzYWdlcyIsImV2ZW50S2V5Iiwic3VwcG9ydFRpY2tldEV2ZW50SWQiLCJldmVudCIsInNhdmVkRXZlbnQiLCJnZXRTdXBwb3J0VGlja2V0RXZlbnRzIiwibm90aWZpY2F0aW9uS2V5IiwiY3VzdG9tZXJOb3RpZmljYXRpb25JZCIsIm5vdGlmaWNhdGlvbiIsIkNVU1RPTUVSX05PVElGSUNBVElPTlMiLCJzYXZlZE5vdGlmaWNhdGlvbiIsIkhBU19DVVNUT01FUl9OT1RJRklDQVRJT04iLCJnZXRDdXN0b21lck5vdGlmaWNhdGlvbnNCeVVzZXIiXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELFNBQVFBLFVBQVUsRUFBRUMsT0FBTyxFQUFFQyxVQUFVLEVBQUVDLFdBQVcsUUFBTywrQkFBK0I7QUFDMUYsU0FBUUMsR0FBRyxRQUFPLFdBQVc7QUFDN0IsU0FBUUMsT0FBTyxRQUFPLGVBQWU7QUFFckMsU0FBUUMsV0FBVyxFQUFFQyxLQUFLLFFBQU8sOEJBQThCO0FBQy9ELFNBQVFDLE1BQU0sUUFBTyxlQUFlO0FBQ3BDLFNBQVFDLEtBQUssUUFBTyw0QkFBNEI7QUFDaEQsU0FBUUMsV0FBVyxRQUFPLDJCQUEyQjtBQUNyRCxTQUFRQyxPQUFPLFFBQU8sYUFBYTtBQXVCbkMsTUFBTUMsTUFBTSxJQUFjQyxLQUFLRCxHQUFHO0FBQ2xDLE1BQU1FLGFBQWEsQ0FBQ0MsT0FBaUJWLFFBQVFVO0FBQzdDLE1BQU1DLFNBQVMsQ0FBQ0MsUUFBUSxFQUFFLEdBQWFoQixRQUFRaUIsT0FBT0Q7QUFDdEQsTUFBTUUsUUFBUSxDQUFDQyxnQkFBd0JDLE1BQU0sRUFBRSxHQUFhLEdBQUdELGVBQWUsQ0FBQyxFQUFFSixPQUFPSyxNQUFNO0FBQzlGLE1BQU1DLGNBQWMsQ0FBQ0MsUUFBZ0JDLEtBQUssRUFBRSxHQUFheEIsV0FBVyxHQUFHdUIsT0FBTyxDQUFDLEVBQUVMLE9BQU9NLEtBQUssRUFBRTtBQUMvRixNQUFNQyxjQUFjLENBQUNSLE9BQWdCUyxTQUFTLEdBQUcsR0FBYXZCLFlBQVllLE9BQU9ELFNBQVMsS0FBS1M7QUFDL0YsTUFBTUMsa0JBQWtCLENBQUNWLE9BQWdCUyxTQUFTLEdBQUcsR0FBYVIsT0FBT0QsU0FBUyxJQUFJVyxJQUFJLEdBQUdDLEtBQUssQ0FBQyxHQUFHSDtBQUN0RyxNQUFNSSwyQkFBMkIsT0FBT0Ms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
@@ -3,7 +3,7 @@ import type { ApiContext } from '../types/auth.types.js';
3
3
  /**
4
4
  * Options for CRUD operations
5
5
  */
6
- export interface CrudOptions {
6
+ export type CrudOptions = Readonly<{
7
7
  readonly sort?: ReadonlyArray<{
8
8
  readonly field: string;
9
9
  readonly direction: 'ASC' | 'DESC';
@@ -18,7 +18,7 @@ export interface CrudOptions {
18
18
  readonly ownership?: boolean;
19
19
  readonly customQueries?: ReadonlyArray<string>;
20
20
  readonly customObjects?: ReadonlyArray<string>;
21
- }
21
+ }>;
22
22
  /**
23
23
  * Get a single item from any collection by filters
24
24
  */