@nlabs/reaktor 1.8.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 (283) hide show
  1. package/README.md +62 -1
  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 -0
  77. package/lib/index.js +2 -1
  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 -2
  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 +26 -25
@@ -0,0 +1,161 @@
1
+ import { get, post } from '@nlabs/rip-hunter';
2
+ import { get as httpsGet } from 'node:https';
3
+ import { validateGeminiVideoInput } from '../adapters/geminiGenerationAdapter.js';
4
+ import { Config } from '../config.js';
5
+ export class GeminiGenerationRejectedError extends Error {
6
+ }
7
+ const origin = 'https://generativelanguage.googleapis.com';
8
+ const operationPattern = /^(?:models\/[a-zA-Z0-9._-]+\/)?operations\/[a-zA-Z0-9_-]+$/;
9
+ const getKey = (config)=>{
10
+ const key = config?.key || Config.get('contentGeneration.geminiKey');
11
+ if (!key) {
12
+ throw new GeminiGenerationRejectedError('Gemini video generation is not configured.');
13
+ }
14
+ return key;
15
+ };
16
+ const operationUrl = (name)=>{
17
+ if (!operationPattern.test(name)) {
18
+ throw new Error('Invalid Gemini operation identifier.');
19
+ }
20
+ return `${origin}/v1beta/${name}`;
21
+ };
22
+ /** Submit once; an unconfirmed response must be reconciled rather than retried. */ export const generateGeminiVideo = async (_context, input, config)=>{
23
+ const validated = validateGeminiVideoInput(input);
24
+ const key = getKey(config);
25
+ const model = validated.model || config?.model || 'veo-3.1-generate-preview';
26
+ if (!/^[a-zA-Z0-9._-]+$/.test(model)) {
27
+ throw new GeminiGenerationRejectedError('Invalid Gemini video model.');
28
+ }
29
+ const result = await post(`${origin}/v1beta/models/${model}:predictLongRunning`, {
30
+ instances: [
31
+ {
32
+ prompt: validated.prompt
33
+ }
34
+ ],
35
+ parameters: {
36
+ ...validated.aspectRatio ? {
37
+ aspectRatio: validated.aspectRatio
38
+ } : {},
39
+ durationSeconds: validated.duration,
40
+ resolution: validated.resolution,
41
+ sampleCount: 1
42
+ }
43
+ }, {
44
+ cache: false,
45
+ headers: new Headers({
46
+ 'x-goog-api-key': key
47
+ }),
48
+ timeout: 120_000
49
+ });
50
+ if (result.error && [
51
+ 400,
52
+ 401,
53
+ 403,
54
+ 404
55
+ ].includes(result.error.code || 0)) {
56
+ throw new GeminiGenerationRejectedError('Gemini rejected the video request. Check model access and settings.');
57
+ }
58
+ if (result.error || !result.name) {
59
+ throw new Error('Gemini video submission could not be confirmed.');
60
+ }
61
+ return {
62
+ provider: 'gemini',
63
+ requestId: result.name,
64
+ status: 'queued',
65
+ statusUrl: operationUrl(result.name)
66
+ };
67
+ };
68
+ export const getGeminiVideoStatus = async (requestId, config)=>{
69
+ const result = await get(operationUrl(requestId), undefined, {
70
+ cache: false,
71
+ headers: new Headers({
72
+ 'x-goog-api-key': getKey(config)
73
+ }),
74
+ timeout: 30_000
75
+ });
76
+ if (result.done !== true) {
77
+ if (result.error) {
78
+ throw new Error('Gemini video status could not be confirmed.');
79
+ }
80
+ return {
81
+ status: 'processing'
82
+ };
83
+ }
84
+ if (result.error || result.response?.generateVideoResponse?.raiMediaFilteredCount) {
85
+ return {
86
+ error: 'Gemini video generation failed or was filtered.',
87
+ status: 'failed'
88
+ };
89
+ }
90
+ const mediaUrl = result.response?.generateVideoResponse?.generatedSamples?.[0]?.video?.uri;
91
+ if (!mediaUrl) {
92
+ throw new Error('Gemini completed without verifiable video output.');
93
+ }
94
+ validateDownloadUrl(mediaUrl, false);
95
+ return {
96
+ mediaUrl,
97
+ status: 'succeeded'
98
+ };
99
+ };
100
+ const validateDownloadUrl = (value, redirected)=>{
101
+ const url = new URL(value);
102
+ const allowed = url.origin === origin && /^\/(?:download\/)?v1beta\/files\/[a-zA-Z0-9_-]+(?::download)?$/.test(url.pathname);
103
+ const storage = redirected && (url.hostname === 'storage.googleapis.com' || url.hostname.endsWith('.googleusercontent.com'));
104
+ if (url.protocol !== 'https:' || url.port || url.username || url.password || url.hash || url.searchParams.has('key') || !(allowed || storage)) {
105
+ throw new Error('Invalid Gemini video download URL.');
106
+ }
107
+ return url;
108
+ };
109
+ /** Binary downloads use HTTPS streams because Rip-Hunter currently decodes non-JSON bodies as text. */ export const downloadGeminiVideo = async (mediaUrl, config)=>{
110
+ const key = getKey(config);
111
+ const download = (value, redirects)=>new Promise((resolve, reject)=>{
112
+ const url = validateDownloadUrl(value, redirects > 0);
113
+ const request = httpsGet(url, {
114
+ headers: url.origin === origin ? {
115
+ 'x-goog-api-key': key
116
+ } : {},
117
+ timeout: 60_000
118
+ }, (response)=>{
119
+ if ([
120
+ 301,
121
+ 302,
122
+ 303,
123
+ 307,
124
+ 308
125
+ ].includes(response.statusCode || 0) && response.headers.location && redirects < 3) {
126
+ response.resume();
127
+ download(new URL(response.headers.location, url).href, redirects + 1).then(resolve, reject);
128
+ return;
129
+ }
130
+ if (response.statusCode !== 200) {
131
+ response.resume();
132
+ reject(new Error('Gemini video download failed.'));
133
+ return;
134
+ }
135
+ const chunks = [];
136
+ let length = 0;
137
+ response.on('data', (chunk)=>{
138
+ length += chunk.length;
139
+ if (length > 128 * 1024 * 1024) {
140
+ response.destroy(new Error('Gemini video exceeds the download limit.'));
141
+ } else {
142
+ chunks.push(chunk);
143
+ }
144
+ });
145
+ response.on('error', reject);
146
+ response.on('end', ()=>{
147
+ const bytes = Buffer.concat(chunks);
148
+ if (bytes.subarray(4, 8).toString('ascii') !== 'ftyp') {
149
+ reject(new Error('Gemini did not return MP4 video bytes.'));
150
+ return;
151
+ }
152
+ resolve(bytes);
153
+ });
154
+ });
155
+ request.on('error', reject);
156
+ request.on('timeout', ()=>request.destroy(new Error('Gemini video download timed out.')));
157
+ });
158
+ return download(mediaUrl, 0);
159
+ };
160
+
161
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9nZW1pbmlWaWRlby50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2dldCwgcG9zdH0gZnJvbSAnQG5sYWJzL3JpcC1odW50ZXInO1xuaW1wb3J0IHtnZXQgYXMgaHR0cHNHZXR9IGZyb20gJ25vZGU6aHR0cHMnO1xuXG5pbXBvcnQge3ZhbGlkYXRlR2VtaW5pVmlkZW9JbnB1dH0gZnJvbSAnLi4vYWRhcHRlcnMvZ2VtaW5pR2VuZXJhdGlvbkFkYXB0ZXIuanMnO1xuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uL2NvbmZpZy5qcyc7XG5cbmltcG9ydCB0eXBlIHtHZW1pbmlWaWRlb0lucHV0fSBmcm9tICcuLi9hZGFwdGVycy9nZW1pbmlHZW5lcmF0aW9uQWRhcHRlci5qcyc7XG5pbXBvcnQgdHlwZSB7QXBpQ29udGV4dH0gZnJvbSAnLi4vdHlwZXMvYXV0aC50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7VmlkZW9HZW5lcmF0aW9uUmVzdWx0fSBmcm9tICcuL3ZpZGVvR2VuZXJhdGlvbi5qcyc7XG5cbmV4cG9ydCBjbGFzcyBHZW1pbmlHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvciBleHRlbmRzIEVycm9yIHt9XG5leHBvcnQgaW50ZXJmYWNlIEdlbWluaVZpZGVvQ29uZmlnIHtrZXk/OiBzdHJpbmc7IG1vZGVsPzogc3RyaW5nfVxuZXhwb3J0IGludGVyZmFjZSBHZW1pbmlWaWRlb1N0YXR1cyB7ZXJyb3I/OiBzdHJpbmc7IG1lZGlhVXJsPzogc3RyaW5nOyBzdGF0dXM6ICdmYWlsZWQnIHwgJ3Byb2Nlc3NpbmcnIHwgJ3N1Y2NlZWRlZCd9XG5jb25zdCBvcmlnaW4gPSAnaHR0cHM6Ly9nZW5lcmF0aXZlbGFuZ3VhZ2UuZ29vZ2xlYXBpcy5jb20nO1xuY29uc3Qgb3BlcmF0aW9uUGF0dGVybiA9IC9eKD86bW9kZWxzXFwvW2EtekEtWjAtOS5fLV0rXFwvKT9vcGVyYXRpb25zXFwvW2EtekEtWjAtOV8tXSskLztcbmNvbnN0IGdldEtleSA9IChjb25maWc/OiBHZW1pbmlWaWRlb0NvbmZpZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGtleSA9IGNvbmZpZz8ua2V5IHx8IENvbmZpZy5nZXQ8c3RyaW5nPignY29udGVudEdlbmVyYXRpb24uZ2VtaW5pS2V5Jyk7XG4gIGlmKCFrZXkpIHtcbiAgICB0aHJvdyBuZXcgR2VtaW5pR2VuZXJhdGlvblJlamVjdGVkRXJyb3IoJ0dlbWluaSB2aWRlbyBnZW5lcmF0aW9uIGlzIG5vdCBjb25maWd1cmVkLicpO1xuICB9XG4gIHJldHVybiBrZXk7XG59O1xuY29uc3Qgb3BlcmF0aW9uVXJsID0gKG5hbWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGlmKCFvcGVyYXRpb25QYXR0ZXJuLnRlc3QobmFtZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgR2VtaW5pIG9wZXJhdGlvbiBpZGVudGlmaWVyLicpO1xuICB9XG4gIHJldHVybiBgJHtvcmlnaW59L3YxYmV0YS8ke25hbWV9YDtcbn07XG5cbi8qKiBTdWJtaXQgb25jZTsgYW4gdW5jb25maXJtZWQgcmVzcG9uc2UgbXVzdCBiZSByZWNvbmNpbGVkIHJhdGhlciB0aGFuIHJldHJpZWQuICovXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVHZW1pbmlWaWRlbyA9IGFzeW5jIChcbiAgX2NvbnRleHQ6IEFwaUNvbnRleHQsIGlucHV0OiBHZW1pbmlWaWRlb0lucHV0LCBjb25maWc/OiBHZW1pbmlWaWRlb0NvbmZpZ1xuKTogUHJvbWlzZTxWaWRlb0dlbmVyYXRpb25SZXN1bHQ+ID0+IHtcbiAgY29uc3QgdmFsaWRhdGVkID0gdmFsaWRhdGVHZW1pbmlWaWRlb0lucHV0KGlucHV0KTtcbiAgY29uc3Qga2V5ID0gZ2V0S2V5KGNvbmZpZyk7XG4gIGNvbnN0IG1vZGVsID0gdmFsaWRhdGVkLm1vZGVsIHx8IGNvbmZpZz8ubW9kZWwgfHwgJ3Zlby0zLjEtZ2VuZXJhdGUtcHJldmlldyc7XG4gIGlmKCEvXlthLXpBLVowLTkuXy1dKyQvLnRlc3QobW9kZWwpKSB7XG4gICAgdGhyb3cgbmV3IEdlbWluaUdlbmVyYXRpb25SZWplY3RlZEVycm9yKCdJbnZhbGlkIEdlbWluaSB2aWRlbyBtb2RlbC4nKTtcbiAgfVxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBwb3N0KGAke29yaWdpbn0vdjFiZXRhL21vZGVscy8ke21vZGVsfTpwcmVkaWN0TG9uZ1J1bm5pbmdgLCB7XG4gICAgaW5zdGFuY2VzOiBbe3Byb21wdDogdmFsaWRhdGVkLnByb21wdH1dLFxuICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgIC4uLih2YWxpZGF0ZWQuYXNwZWN0UmF0aW8gPyB7YXNwZWN0UmF0aW86IHZhbGlkYXRlZC5hc3BlY3RSYXRpb30gOiB7fSksXG4gICAgICBkdXJhdGlvblNlY29uZHM6IHZhbGlkYXRlZC5kdXJhdGlvbixcbiAgICAgIHJlc29sdXRpb246IHZhbGlkYXRlZC5yZXNvbHV0aW9uLFxuICAgICAgc2FtcGxlQ291bnQ6IDFcbiAgICB9XG4gIH0sIHtjYWNoZTogZmFsc2UsIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHsneC1nb29nLWFwaS1rZXknOiBrZXl9KSwgdGltZW91dDogMTIwXzAwMH0pIGFzIHtlcnJvcj86IHtjb2RlPzogbnVtYmVyfTsgbmFtZT86IHN0cmluZ307XG4gIGlmKHJlc3VsdC5lcnJvciAmJiBbNDAwLCA0MDEsIDQwMywgNDA0XS5pbmNsdWRlcyhyZXN1bHQuZXJyb3IuY29kZSB8fCAwKSkge1xuICAgIHRocm93IG5ldyBHZW1pbmlHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvcignR2VtaW5pIHJlamVjdGVkIHRoZSB2aWRlbyByZXF1ZXN0LiBDaGVjayBtb2RlbCBhY2Nlc3MgYW5kIHNldHRpbmdzLicpO1xuICB9XG4gIGlmKHJlc3VsdC5lcnJvciB8fCAhcmVzdWx0Lm5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0dlbWluaSB2aWRlbyBzdWJtaXNzaW9uIGNvdWxkIG5vdCBiZSBjb25maXJtZWQuJyk7XG4gIH1cbiAgcmV0dXJuIHtwcm92aWRlcjogJ2dlbWluaScsIHJlcXVlc3RJZDogcmVzdWx0Lm5hbWUsIHN0YXR1czogJ3F1ZXVlZCcsIHN0YXR1c1VybDogb3BlcmF0aW9uVXJsKHJlc3VsdC5uYW1lKX07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0R2VtaW5pVmlkZW9TdGF0dXMgPSBhc3luYyAoXG4gIHJlcXVlc3RJZDogc3RyaW5nLCBjb25maWc/OiBHZW1pbmlWaWRlb0NvbmZpZ1xuKTogUHJvbWlzZTxHZW1pbmlWaWRlb1N0YXR1cz4gPT4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXQob3BlcmF0aW9uVXJsKHJlcXVlc3RJZCksIHVuZGVmaW5lZCwge1xuICAgIGNhY2hlOiBmYWxzZSwgaGVhZGVyczogbmV3IEhlYWRlcnMoeyd4LWdvb2ctYXBpLWtleSc6IGdldEtleShjb25maWcpfSksIHRpbWVvdXQ6IDMwXzAwMFxuICB9KSBhcyB7XG4gICAgZG9uZT86IGJvb2xlYW47XG4gICAgZXJyb3I/OiB7Y29kZT86IG51bWJlcn07XG4gICAgcmVzcG9uc2U/OiB7Z2VuZXJhdGVWaWRlb1Jlc3BvbnNlPzoge1xuICAgICAgZ2VuZXJhdGVkU2FtcGxlcz86IHt2aWRlbz86IHt1cmk/OiBzdHJpbmd9fVtdOyByYWlNZWRpYUZpbHRlcmVkQ291bnQ/OiBudW1iZXI7XG4gICAgfTt9O1xuICB9O1xuICBpZihyZXN1bHQuZG9uZSAhPT0gdHJ1ZSkge1xuICAgIGlmKHJlc3VsdC5lcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZW1pbmkgdmlkZW8gc3RhdHVzIGNvdWxkIG5vdCBiZSBjb25maXJtZWQuJyk7XG4gICAgfVxuICAgIHJldHVybiB7c3RhdHVzOiAncHJvY2Vzc2luZyd9O1xuICB9XG4gIGlmKHJlc3VsdC5lcnJvciB8fCByZXN1bHQucmVzcG9uc2U/LmdlbmVyYXRlVmlkZW9SZXNwb25zZT8ucmFpTWVkaWFGaWx0ZXJlZENvdW50KSB7XG4gICAgcmV0dXJuIHtlcnJvcjogJ0dlbWluaSB2aWRlbyBnZW5lcmF0aW9uIGZhaWxlZCBvciB3YXMgZmlsdGVyZWQuJywgc3RhdHVzOiAnZmFpbGVkJ307XG4gIH1cbiAgY29uc3QgbWVkaWFVcmwgPSByZXN1bHQucmVzcG9uc2U/LmdlbmVyYXRlVmlkZW9SZXNwb25zZT8uZ2VuZXJhdGVkU2FtcGxlcz8uWzBdPy52aWRlbz8udXJpO1xuICBpZighbWVkaWFVcmwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0dlbWluaSBjb21wbGV0ZWQgd2l0aG91dCB2ZXJpZmlhYmxlIHZpZGVvIG91dHB1dC4nKTtcbiAgfVxuICB2YWxpZGF0ZURvd25sb2FkVXJsKG1lZGlhVXJsLCBmYWxzZSk7XG4gIHJldHVybiB7bWVkaWFVcmwsIHN0YXR1czogJ3N1Y2NlZWRlZCd9O1xufTtcblxuY29uc3QgdmFsaWRhdGVEb3dubG9hZFVybCA9ICh2YWx1ZTogc3RyaW5nLCByZWRpcmVjdGVkOiBib29sZWFuKTogVVJMID0+IHtcbiAgY29uc3QgdXJsID0gbmV3IFVSTCh2YWx1ZSk7XG4gIGNvbnN0IGFsbG93ZWQgPSB1cmwub3JpZ2luID09PSBvcmlnaW4gJiYgL15cXC8oPzpkb3dubG9hZFxcLyk/djFiZXRhXFwvZmlsZXNcXC9bYS16QS1aMC05Xy1dKyg/Ojpkb3dubG9hZCk/JC8udGVzdCh1cmwucGF0aG5hbWUpO1xuICBjb25zdCBzdG9yYWdlID0gcmVkaXJlY3RlZCAmJiAodXJsLmhvc3RuYW1lID09PSAnc3RvcmFnZS5nb29nbGVhcGlzLmNvbScgfHwgdXJsLmhvc3RuYW1lLmVuZHNXaXRoKCcuZ29vZ2xldXNlcmNvbnRlbnQuY29tJykpO1xuICBpZih1cmwucHJvdG9jb2wgIT09ICdodHRwczonIHx8IHVybC5wb3J0IHx8IHVybC51c2VybmFtZSB8fCB1cmwucGFzc3dvcmQgfHwgdXJsLmhhc2ggfHwgdXJsLnNlYXJjaFBhcmFtcy5oYXMoJ2tleScpIHx8ICEoYWxsb3dlZCB8fCBzdG9yYWdlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBHZW1pbmkgdmlkZW8gZG93bmxvYWQgVVJMLicpO1xuICB9XG4gIHJldHVybiB1cmw7XG59O1xuXG4vKiogQmluYXJ5IGRvd25sb2FkcyB1c2UgSFRUUFMgc3RyZWFtcyBiZWNhdXNlIFJpcC1IdW50ZXIgY3VycmVudGx5IGRlY29kZXMgbm9uLUpTT04gYm9kaWVzIGFzIHRleHQuICovXG5leHBvcnQgY29uc3QgZG93bmxvYWRHZW1pbmlWaWRlbyA9IGFzeW5jIChtZWRpYVVybDogc3RyaW5nLCBjb25maWc/OiBHZW1pbmlWaWRlb0NvbmZpZyk6IFByb21pc2U8QnVmZmVyPiA9PiB7XG4gIGNvbnN0IGtleSA9IGdldEtleShjb25maWcpO1xuICBjb25zdCBkb3dubG9hZCA9ICh2YWx1ZTogc3RyaW5nLCByZWRpcmVjdHM6IG51bWJlcik6IFByb21pc2U8QnVmZmVyPiA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgdXJsID0gdmFsaWRhdGVEb3dubG9hZFVybCh2YWx1ZSwgcmVkaXJlY3RzID4gMCk7XG4gICAgY29uc3QgcmVxdWVzdCA9IGh0dHBzR2V0KHVybCwge1xuICAgICAgaGVhZGVyczogdXJsLm9yaWdpbiA9PT0gb3JpZ2luID8geyd4LWdvb2ctYXBpLWtleSc6IGtleX0gOiB7fSwgdGltZW91dDogNjBfMDAwXG4gICAgfSwgKHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZihbMzAxLCAzMDIsIDMwMywgMzA3LCAzMDhdLmluY2x1ZGVzKHJlc3BvbnNlLnN0YXR1c0NvZGUgfHwgMCkgJiYgcmVzcG9uc2UuaGVhZGVycy5sb2NhdGlvbiAmJiByZWRpcmVjdHMgPCAzKSB7XG4gICAgICAgIHJlc3BvbnNlLnJlc3VtZSgpO1xuICAgICAgICBkb3dubG9hZChuZXcgVVJMKHJlc3BvbnNlLmhlYWRlcnMubG9jYXRpb24sIHVybCkuaHJlZiwgcmVkaXJlY3RzICsgMSkudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZihyZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDApIHtcbiAgICAgICAgcmVzcG9uc2UucmVzdW1lKCk7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0dlbWluaSB2aWRlbyBkb3dubG9hZCBmYWlsZWQuJykpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBjaHVua3M6IEJ1ZmZlcltdID0gW107XG4gICAgICBsZXQgbGVuZ3RoID0gMDtcbiAgICAgIHJlc3BvbnNlLm9uKCdkYXRhJywgKGNodW5rOiBCdWZmZXIpID0+IHtcbiAgICAgICAgbGVuZ3RoICs9IGNodW5rLmxlbmd0aDtcbiAgICAgICAgaWYobGVuZ3RoID4gMTI4ICogMTAyNCAqIDEwMjQpIHtcbiAgICAgICAgICByZXNwb25zZS5kZXN0cm95KG5ldyBFcnJvcignR2VtaW5pIHZpZGVvIGV4Y2VlZHMgdGhlIGRvd25sb2FkIGxpbWl0LicpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmVzcG9uc2Uub24oJ2Vycm9yJywgcmVqZWN0KTtcbiAgICAgIHJlc3BvbnNlLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJ5dGVzID0gQnVmZmVyLmNvbmNhdChjaHVua3MpO1xuICAgICAgICBpZihieXRlcy5zdWJhcnJheSg0LCA4KS50b1N0cmluZygnYXNjaWknKSAhPT0gJ2Z0eXAnKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignR2VtaW5pIGRpZCBub3QgcmV0dXJuIE1QNCB2aWRlbyBieXRlcy4nKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoYnl0ZXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmVxdWVzdC5vbignZXJyb3InLCByZWplY3QpO1xuICAgIHJlcXVlc3Qub24oJ3RpbWVvdXQnLCAoKSA9PiByZXF1ZXN0LmRlc3Ryb3kobmV3IEVycm9yKCdHZW1pbmkgdmlkZW8gZG93bmxvYWQgdGltZWQgb3V0LicpKSk7XG4gIH0pO1xuICByZXR1cm4gZG93bmxvYWQobWVkaWFVcmwsIDApO1xufTtcbiJdLCJuYW1lcyI6WyJnZXQiLCJwb3N0IiwiaHR0cHNHZXQiLCJ2YWxpZGF0ZUdlbWluaVZpZGVvSW5wdXQiLCJDb25maWciLCJHZW1pbmlHZW5lcmF0aW9uUmVqZWN0ZWRFcnJvciIsIkVycm9yIiwib3JpZ2luIiwib3BlcmF0aW9uUGF0dGVybiIsImdldEtleSIsImNvbmZpZyIsImtleSIsIm9wZXJhdGlvblVybCIsIm5hbWUiLCJ0ZXN0IiwiZ2VuZXJhdGVHZW1pbmlWaWRlbyIsIl9jb250ZXh0IiwiaW5wdXQiLCJ2YWxpZGF0ZWQiLCJtb2RlbCIsInJlc3VsdCIsImluc3RhbmNlcyIsInByb21wdCIsInBhcmFtZXRlcnMiLCJhc3BlY3RSYXRpbyIsImR1cmF0aW9uU2Vjb25kcyIsImR1cmF0aW9uIiwicmVzb2x1dGlvbiIsInNhbXBsZUNvdW50IiwiY2FjaGUiLCJoZWFkZXJzIiwiSGVhZGVycyIsInRpbWVvdXQiLCJlcnJvciIsImluY2x1ZGVzIiwiY29kZSIsInByb3ZpZGVyIiwicmVxdWVzdElkIiwic3RhdHVzIiwic3RhdHVzVXJsIiwiZ2V0R2VtaW5pVmlkZW9TdGF0dXMiLCJ1bmRlZmluZWQiLCJkb25lIiwicmVzcG9uc2UiLCJnZW5lcmF0ZVZpZGVvUmVzcG9uc2UiLCJyYWlNZWRpYUZpbHRlcmVkQ291bnQiLCJtZWRpYVVybCIsImdlbmVyYXRlZFNhbXBsZXMiLCJ2aWRlbyIsInVyaSIsInZhbGlkYXRlRG93bmxvYWRVcmwiLCJ2YWx1ZSIsInJlZGlyZWN0ZWQiLCJ1cmwiLCJVUkwiLCJhbGxvd2VkIiwicGF0aG5hbWUiLCJzdG9yYWdlIiwiaG9zdG5hbWUiLCJlbmRzV2l0aCIsInByb3RvY29sIiwicG9ydCIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJoYXNoIiwic2VhcmNoUGFyYW1zIiwiaGFzIiwiZG93bmxvYWRHZW1pbmlWaWRlbyIsImRvd25sb2FkIiwicmVkaXJlY3RzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJyZXF1ZXN0Iiwic3RhdHVzQ29kZSIsImxvY2F0aW9uIiwicmVzdW1lIiwiaHJlZiIsInRoZW4iLCJjaHVua3MiLCJsZW5ndGgiLCJvbiIsImNodW5rIiwiZGVzdHJveSIsInB1c2giLCJieXRlcyIsIkJ1ZmZlciIsImNvbmNhdCIsInN1YmFycmF5IiwidG9TdHJpbmciXSwibWFwcGluZ3MiOiJBQUFBLFNBQVFBLEdBQUcsRUFBRUMsSUFBSSxRQUFPLG9CQUFvQjtBQUM1QyxTQUFRRCxPQUFPRSxRQUFRLFFBQU8sYUFBYTtBQUUzQyxTQUFRQyx3QkFBd0IsUUFBTyx5Q0FBeUM7QUFDaEYsU0FBUUMsTUFBTSxRQUFPLGVBQWU7QUFNcEMsT0FBTyxNQUFNQyxzQ0FBc0NDO0FBQU87QUFHMUQsTUFBTUMsU0FBUztBQUNmLE1BQU1DLG1CQUFtQjtBQUN6QixNQUFNQyxTQUFTLENBQUNDO0lBQ2QsTUFBTUMsTUFBTUQsUUFBUUMsT0FBT1AsT0FBT0osR0FBRyxDQUFTO0lBQzlDLElBQUcsQ0FBQ1csS0FBSztRQUNQLE1BQU0sSUFBSU4sOEJBQThCO0lBQzFDO0lBQ0EsT0FBT007QUFDVDtBQUNBLE1BQU1DLGVBQWUsQ0FBQ0M7SUFDcEIsSUFBRyxDQUFDTCxpQkFBaUJNLElBQUksQ0FBQ0QsT0FBTztRQUMvQixNQUFNLElBQUlQLE1BQU07SUFDbEI7SUFDQSxPQUFPLEdBQUdDLE9BQU8sUUFBUSxFQUFFTSxNQUFNO0FBQ25DO0FBRUEsaUZBQWlGLEdBQ2pGLE9BQU8sTUFBTUUsc0JBQXNCLE9BQ2pDQyxVQUFzQkMsT0FBeUJQO0lBRS9DLE1BQU1RLFlBQVlmLHlCQUF5QmM7SUFDM0MsTUFBTU4sTUFBTUYsT0FBT0M7SUFDbkIsTUFBTVMsUUFBUUQsVUFBVUMsS0FBSyxJQUFJVCxRQUFRUyxTQUFTO0lBQ2xELElBQUcsQ0FB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
@@ -277,4 +277,4 @@ export const isGrouped = (context, userId, groupId)=>{
277
277
  }).then(()=>null));
278
278
  };
279
279
 
280
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL3JlYWt0b3IvcmVha3Rvci9wYWNrYWdlcy9yZWFrdG9yL3NyYy9hY3Rpb25zL2dyb3Vwcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOS1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2UgaXMgc3ViamVjdCB0byB0aGUgYWNjb21wYW55aW5nIGNvbW1lcmNpYWwgTElDRU5TRS5cbiAqL1xuaW1wb3J0IHtmbGF0dGVufSBmcm9tICdAbmxhYnMvdXRpbHMvYXJyYXlzL2ZsYXR0ZW4nO1xuaW1wb3J0IHt1bmlxQnl9IGZyb20gJ0BubGFicy91dGlscy9hcnJheXMvdW5pcSc7XG5pbXBvcnQge2NyZWF0ZUhhc2gsIHBhcnNlQXJhbmdvSWQsIHBhcnNlQ2hhciwgcGFyc2VJZH0gZnJvbSAnQG5sYWJzL3V0aWxzL3BhcnNlcnMvc3RyaW5ncyc7XG5pbXBvcnQge2FxbH0gZnJvbSAnYXJhbmdvanMnO1xuaW1wb3J0IHtBcWxRdWVyeSwgbGl0ZXJhbH0gZnJvbSAnYXJhbmdvanMvYXFsJztcblxuaW1wb3J0IHtDT0xMRUNUSU9OUywgRURHRVN9IGZyb20gJy4uL2NvbnN0YW50cy9jb2xsZWN0aW9ucy5qcyc7XG5pbXBvcnQge0Vycm9yVHlwZXN9IGZyb20gJy4uL3R5cGVzL2Vycm9yLnR5cGVzLmpzJztcbmltcG9ydCB7bG9nRXJyb3J9IGZyb20gJy4uL3V0aWxzL2FuYWx5dGljc1V0aWxzLmpzJztcbmltcG9ydCB7dXNlRGJ9IGZyb20gJy4uL3V0aWxzL2FyYW5nb2RiVXRpbHMuanMnO1xuaW1wb3J0IHthZGRJdGVtLCBkZWxldGVJdGVtLCBnZXRJdGVtQnksIHVwZGF0ZUl0ZW19IGZyb20gJy4vY3J1ZC5qcyc7XG5pbXBvcnQge2V4dHJhY3RUYWdzLCBnZXRUYWdMaXN0QnlOYW1lLCB1cGRhdGVUYWdzSW5JdGVtfSBmcm9tICcuL3RhZ3MuanMnO1xuXG5pbXBvcnQgdHlwZSB7RWRnZUNvbGxlY3Rpb259IGZyb20gJ2FyYW5nb2pzL2NvbGxlY3Rpb25zJztcbmltcG9ydCB0eXBlIHtBcGlDb250ZXh0fSBmcm9tICcuLi90eXBlcy9hdXRoLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtHcm91cEVkZ2VUeXBlLCBHcm91cFR5cGUsIEdyb3VwVXNlcn0gZnJvbSAnLi4vdHlwZXMvZ3JvdXBzLnR5cGVzLmpzJztcblxuY29uc3QgZXZlbnRDYXRlZ29yeSA9ICdncm91cHMnO1xuY29uc3QgZ3JvdXBzQ29sbGVjdGlvbiA9IGxpdGVyYWwoQ09MTEVDVElPTlMuR1JPVVBTKTtcbmNvbnN0IHVzZXJzQ29sbGVjdGlvbiA9IGxpdGVyYWwoQ09MTEVDVElPTlMuVVNFUlMpO1xuY29uc3QgaGFzQ29ubmVjdGlvbkNvbGxlY3Rpb24gPSBsaXRlcmFsKEVER0VTLkhBU19DT05ORUNUSU9OKTtcbmNvbnN0IGlzVGFnZ2VkQ29sbGVjdGlvbiA9IGxpdGVyYWwoRURHRVMuSVNfVEFHR0VEKTtcblxuLyoqXG4gKiBHZXQgYWxsIGdyb3VwcyBmb3IgdGhlIGFwcCB3aXRoIHRoZWlyIHVzZXJzXG4gKiBOb3RlOiBVc2VzIGN1c3RvbSBxdWVyeSBmb3IgZWRnZSB0cmF2ZXJzYWwgdG8gaW5jbHVkZSB1c2Vyc1xuICovXG5leHBvcnQgY29uc3QgZ2V0R3JvdXBMaXN0QnlBcHAgPSAoY29udGV4dDogQXBpQ29udGV4dCwgZnJvbT86IG51bWJlciwgdG8/OiBudW1iZXIpOiBQcm9taXNlPEdyb3VwVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRHcm91cExpc3RCeUFwcCc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcblxuICAvLyBDb21wbGV4IGVkZ2UgdHJhdmVyc2FsIHF1ZXJ5IC0ga2VlcCBjdXN0b20gaW1wbGVtZW50YXRpb25cbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICBGT1IgZyBJTiAke2dyb3Vwc0NvbGxlY3Rpb259XG4gICAgICBMRVQgdXNlcnMgPSAoXG4gICAgICAgIEZPUiB1LCBsIElOIE9VVEJPVU5EIGcuX2lkICR7aGFzQ29ubmVjdGlvbkNvbGxlY3Rpb259XG4gICAgICAgIFJFVFVSTiBNRVJHRSh1LCB7dHlwZTogbC50eXBlfSlcbiAgICAgIClcbiAgICAgICR7ZnJvbSAhPT0gdW5kZWZpbmVkICYmIHRvICE9PSB1bmRlZmluZWQgPyBsaXRlcmFsKGBMSU1JVCAke2Zyb219LCAke3RvIC0gZnJvbX1gKSA6IGxpdGVyYWwoJycpfVxuICAgICAgU09SVCBnLmFkZGVkXG4gICAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UoZywge3VzZXJzfSlcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKTtcblxuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEdyb3VwTGlzdEJ5VXNlciA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdXNlcklkOiBzdHJpbmcsXG4gIGZyb206IG51bWJlcixcbiAgdG86IG51bWJlclxuKTogUHJvbWlzZTxHcm91cFR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0R3JvdXBMaXN0QnlVc2VyJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuXG4gIC8vIENvbXBsZXggZWRnZSB0cmF2ZXJzYWwgcXVlcnkgd2l0aCB1c2VyIGZpbHRlcmluZyAtIGtlZXAgY3VzdG9tIGltcGxlbWVudGF0aW9uXG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgXG4gICAgRk9SIGcsIGUgSU4gSU5CT1VORCAke2B1c2Vycy8ke3VzZXJJZH1gfSAke2hhc0Nvbm5lY3Rpb25Db2xsZWN0aW9ufVxuICAgICAgTEVUIHVzZXJzID0gKFxuICAgICAgICBGT1IgdSwgbCBJTiBPVVRCT1VORCBnLl9pZCAke2hhc0Nvbm5lY3Rpb25Db2xsZWN0aW9ufVxuICAgICAgICBSRVRVUk4gTUVSR0UodSwge3R5cGU6IGwudHlwZX0pXG4gICAgICApXG4gICAgICAke2Zyb20gIT09IHVuZGVmaW5lZCAmJiB0byAhPT0gdW5kZWZpbmVkID8gbGl0ZXJhbChgTElNSVQgJHtmcm9tfSwgJHt0byAtIGZyb219YCkgOiBsaXRlcmFsKCcnKX1cbiAgICAgIFNPUlQgZy5hZGRlZFxuICAgICAgUkVUVVJOIERJU1RJTkNUIE1FUkdFKGcsIHt1c2Vyc30pXG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCk7XG5cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRHcm91cExpc3RCeVRhZ3MgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHRhZ05hbWVzOiBzdHJpbmdbXSxcbiAgZnJvbTogbnVtYmVyLFxuICB0bzogbnVtYmVyXG4pOiBQcm9taXNlPEdyb3VwVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdnZXRMaXN0QnlUYWdzJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuXG4gIC8vIENvbXBsZXggbXVsdGktdGFnIHF1ZXJ5IHdpdGggZWRnZSB0cmF2ZXJzYWwgLSBrZWVwIGN1c3RvbSBpbXBsZW1lbnRhdGlvblxuICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgdGFnTmFtZXMubWFwKCh0YWdOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGZvcm1hdFRhZ05hbWUgPSBwYXJzZUlkKHRhZ05hbWUpO1xuICAgICAgY29uc3QgbGltaXRDbGF1c2UgPSBmcm9tICE9PSB1bmRlZmluZWQgJiYgdG8gIT09IHVuZGVmaW5lZCA/IGBMSU1JVCAke2Zyb219LCAke3RvIC0gZnJvbX1gIDogJyc7XG4gICAgICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiBwLCBlIElOIE9VVEJPVU5EICR7YHRhZ3MvJHtmb3JtYXRUYWdOYW1lfWB9ICR7aXNUYWdnZWRDb2xsZWN0aW9ufVxuICAgICAgICAgIEZPUiB1IElOICR7dXNlcnNDb2xsZWN0aW9ufVxuICAgICAgICAgIExFVCBsaWtlcyA9IChcbiAgICAgICAgICAgIEZPUiBwb3N0LCBsaWtlIElOIElOQk9VTkQgcC5faWQgbGlrZXNcbiAgICAgICAgICAgIEZJTFRFUiBsaWtlLnZhbHVlID09ICdsaWtlJ1xuICAgICAgICAgICAgUkVUVVJOIGxpa2VcbiAgICAgICAgICApXG4gICAgICAgICAgTEVUIGRpc2xpa2VzID0gKFxuICAgICAgICAgICAgRk9SIHBvc3QsIGxpa2UgSU4gSU5CT1VORCBwLl9pZCBsaWtlc1xuICAgICAgICAgICAgRklMVEVSIGxpa2UudmFsdWUgPT0gJ2Rpc2xpa2UnXG4gICAgICAgICAgICBSRVRVUk4gbGlrZVxuICAgICAgICAgIClcbiAgICAgICAgICBGSUxURVIgZS50eXBlID09ICdwb3N0JyAmJiBwLnVzZXJJZCA9PSB1Ll9rZXlcbiAgICAgICAgICAke2xpdGVyYWwobGltaXRDbGF1c2UpfVxuICAgICAgICAgIFNPUlQgcC5hZGRlZFxuICAgICAgICAgIFJFVFVSTiBESVNUSU5DVCBNRVJHRShwLCB7dXNlcjp1LCBsaWtlczpMRU5HVEgobGlrZXMpLCBkaXNsaWtlczpMRU5HVEgoZGlzbGlrZXMpfSlgO1xuXG4gICAgICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgICAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKTtcblxuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfSk7XG4gICAgfSlcbiAgKVxuICAgIC50aGVuKChyZXN1bHRzKSA9PiB1bmlxQnkoZmxhdHRlbihyZXN1bHRzKSwgKGl0ZW06IGFueSkgPT4gaXRlbS5fa2V5KSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRHcm91cEJ5SWQgPSAoY29udGV4dDogQXBpQ29udGV4dCwgaXRlbUlkOiBzdHJpbmcpOiBQcm9taXNlPEdyb3VwVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0SXRlbSc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb259ID0gY29udGV4dDtcbiAgY29uc3Qgc2Vzc2lvbklkID0gc2Vzc2lvbj8udXNlcklkIHx8ICcnO1xuICBjb25zdCBmb3JtYXRJdGVtSWQgPSBwYXJzZUlkKGl0ZW1JZCk7XG5cbiAgLy8gQ29tcGxleCBlZGdlIHRyYXZlcnNhbCB3aXRoIHVzZXIgb3duZXJzaGlwIGNoZWNrIC0ga2VlcCBjdXN0b20gaW1wbGVtZW50YXRpb25cbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgZywgZSBJTiBPVVRCT1VORCAke2B1c2Vycy8ke3Nlc3Npb25JZH1gfSBoYXNDb25uZWN0aW9uXG4gICAgICBGSUxURVIgZy5fa2V5ID09ICR7Zm9ybWF0SXRlbUlkfVxuICAgICAgTEVUIHVzZXJzID0gKFxuICAgICAgICBGT1IgdSwgbCBJTiBPVVRCT1VORCBnLl9pZCBoYXNDb25uZWN0aW9uXG4gICAgICAgIFJFVFVSTiBNRVJHRSAodSwge3R5cGU6bC50eXBlfSlcbiAgICAgIClcbiAgICAgIExJTUlUIDFcbiAgICAgIFJFVFVSTiBESVNUSU5DVCBNRVJHRShnLCB7dXNlcnM6dXNlcnN9KWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKGdyb3VwOiBHcm91cFR5cGUpID0+IGdyb3VwKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEdyb3VwRGV0YWlscyA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBncm91cElkOiBzdHJpbmcpOiBQcm9taXNlPEdyb3VwVHlwZT4gPT4ge1xuICBjb25zdCBmb3JtYXRHcm91cElkID0gcGFyc2VJZChncm91cElkKTtcbiAgcmV0dXJuIGdldEl0ZW1CeTxHcm91cFR5cGU+KGNvbnRleHQsIENPTExFQ1RJT05TLkdST1VQUywge19rZXk6IGZvcm1hdEdyb3VwSWR9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVHcm91cEVkZ2UgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHVzZXJEb2NJZDogc3RyaW5nLFxuICBncm91cERvY0lkOiBzdHJpbmdcbik6IFByb21pc2U8R3JvdXBFZGdlVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnY3JlYXRlR3JvdXBFZGdlJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRVc2VEb2NJZCA9IHBhcnNlQXJhbmdvSWQodXNlckRvY0lkKTtcbiAgY29uc3QgZm9ybWF0R3JvdXBEb2NJZCA9IHBhcnNlQXJhbmdvSWQoZ3JvdXBEb2NJZCk7XG5cbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgZWRnZUNvbGxlY3Rpb246IEVkZ2VDb2xsZWN0aW9uID0gdXNlRGIoZGF0YWJhc2VOYW1lKS5jb2xsZWN0aW9uKCdoYXNDb25uZWN0aW9uJyk7XG4gIGNvbnN0IGVkZ2VJZCA9IGNyZWF0ZUhhc2goYGdyb3VwLSR7Zm9ybWF0VXNlRG9jSWR9LSR7Zm9ybWF0R3JvdXBEb2NJZH1gKTtcbiAgY29uc3QgZWRnZTogYW55ID0ge1xuICAgIF9mcm9tOiBmb3JtYXRVc2VEb2NJZCxcbiAgICBfa2V5OiBlZGdlSWQsXG4gICAgX3RvOiBmb3JtYXRHcm91cERvY0lkLFxuICAgIGFkZGVkOiBub3csXG4gICAgdHlwZTogJ2dyb3VwcydcbiAgfTtcblxuICByZXR1cm4gZWRnZUNvbGxlY3Rpb24uc2F2ZShlZGdlLCB7cmV0dXJuTmV3OiB0cnVlfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCB7c2Vzc2lvbjoge3VzZXJJZDogZm9ybWF0VXNlRG9jSWR9fSkudGhlbigoKSA9PiBudWxsKSk7XG59O1xuXG5jb25zdCBidWlsZEdyb3VwTXV0YXRpb24gPSAoe2Rlc2NyaXB0aW9uID0gJycsIG5hbWUgPSAnVW50aXRsZWQnLCB0eXBlfTogR3JvdXBUeXBlKTogUGFydGlhbDxHcm91cFR5cGU+ID0+ICh7XG4gIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbi5zdWJzdHJpbmcoMCwgNjQwKSxcbiAgbmFtZSxcbiAgdHlwZTogcGFyc2VDaGFyKHR5cGUsIDE2KSB8fCAncHJpdmF0ZSdcbn0pO1xuXG5leHBvcnQgY29uc3QgYWRkR3JvdXAgPSAoY29udGV4dDogQXBpQ29udGV4dCwgaXRlbTogR3JvdXBUeXBlKTogUHJvbWlzZTxHcm91cFR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2FkZCc7XG4gIGNvbnN0IHtzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHNlc3Npb25Eb2NJZCA9IGAke0NPTExFQ1RJT05TLlVTRVJTfS8ke3Nlc3Npb25JZH1gO1xuICBjb25zdCB7ZGVzY3JpcHRpb24gPSAnJ306IEdyb3VwVHlwZSA9IGl0ZW07XG4gIGNvbnN0IGlkID0gY3JlYXRlSGFzaChgZ3JvdXAtJHtzZXNzaW9uSWR9YCk7XG4gIGNvbnN0IGluc2VydDogR3JvdXBUeXBlID0ge1xuICAgIF9rZXk6IGlkLFxuICAgIC4uLmJ1aWxkR3JvdXBNdXRhdGlvbihpdGVtKVxuICB9O1xuXG4gIHJldHVybiBhZGRJdGVtPEdyb3VwVHlwZT4oY29udGV4dCwgQ09MTEVDVElPTlMuR1JPVVBTLCBpbnNlcnQpXG4gICAgLnRoZW4oKGdyb3VwOiBHcm91cFR5cGUpID0+IHtcbiAgICAgIC8vIFVwZGF0ZSBsaW5rZWQgdGFnc1xuICAgICAgY29uc3Qge19pZDogZ3JvdXBEb2NJZH06IEdyb3VwVHlwZSA9IGdyb3VwO1xuXG4gICAgICAvLyBWYWxpZGF0ZSBzZXNzaW9uRG9jSWQgYW5kIGdyb3VwRG9jSWRcbiAgICAgIGlmICghc2Vzc2lvbkRvY0lkIHx8IHR5cGVvZiBzZXNzaW9uRG9jSWQgIT09ICdzdHJpbmcnIHx8ICFzZXNzaW9uRG9jSWQuc3RhcnRzV2l0aCgndXNlcnMvJykpIHtcbiAgICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5JTlZBTElEX0lOUFVUXG4gICAgICAgIH0sIG5ldyBFcnJvcignSW52YWxpZCBvciBtaXNzaW5nIHNlc3Npb25Eb2NJZCBmb3IgZWRnZSBjcmVhdGlvbicpLCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoIWdyb3VwRG9jSWQgfHwgdHlwZW9mIGdyb3VwRG9jSWQgIT09ICdzdHJpbmcnIHx8ICFncm91cERvY0lkLnN0YXJ0c1dpdGgoJ2dyb3Vwcy8nKSkge1xuICAgICAgICBsb2dFcnJvcih7XG4gICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgIGxhYmVsOiBFcnJvclR5cGVzLklOVkFMSURfSU5QVVRcbiAgICAgICAgfSwgbmV3IEVycm9yKCdJbnZhbGlkIG9yIG1pc3NpbmcgZ3JvdXBEb2NJZCBmb3IgZWRnZSBjcmVhdGlvbicpLCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRhZ05hbWVzID0gZXh0cmFjdFRhZ3MoZGVzY3JpcHRpb24pO1xuICAgICAgcmV0dXJuIGdldFRhZ0xpc3RCeU5hbWUoY29udGV4dCwgdGFnTmFtZXMpXG4gICAgICAgIC50aGVuKChyZXNvbHZlZFRhZ3MpID0+IHVwZGF0ZVRhZ3NJbkl0ZW0oY29udGV4dCwge2l0ZW1Eb2NJZDogZ3JvdXBEb2NJZCwgdGFnczogcmVzb2x2ZWRUYWdzfSkpXG4gICAgICAgIC50aGVuKCgpID0+IGNyZWF0ZUdyb3VwRWRnZShjb250ZXh0LCBzZXNzaW9uRG9jSWQsIGdyb3VwRG9jSWQpXG4gICAgICAgIC50aGVuKCgpID0+IGdyb3VwKSk7XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVHcm91cCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBpdGVtOiBHcm91cFR5cGUpOiBQcm9taXNlPEdyb3VwVHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAndXBkYXRlJztcbiAgY29uc3Qge1xuICAgIGRlc2NyaXB0aW9uID0gJycsXG4gICAgaWRcbiAgfTogR3JvdXBUeXBlID0gaXRlbTtcbiAgY29uc3QgaXRlbUlkID0gcGFyc2VJZChpZCk7XG5cbiAgcmV0dXJuIHVwZGF0ZUl0ZW08R3JvdXBUeXBlPihjb250ZXh0LCBDT0xMRUNUSU9OUy5HUk9VUFMsIGl0ZW1JZCwgYnVpbGRHcm91cE11dGF0aW9uKGl0ZW0pKVxuICAgIC50aGVuKChncm91cDogR3JvdXBUeXBlKSA9PiB7XG4gICAgICBjb25zdCB7X2lkOiBncm91cERvY0lkfSA9IGdyb3VwO1xuXG4gICAgICAvLyBVcGRhdGUgbGlua2VkIHRhZ3NcbiAgICAgIGNvbnN0IHRhZ05hbWVzID0gZXh0cmFjdFRhZ3MoZGVzY3JpcHRpb24pO1xuICAgICAgcmV0dXJuIGdldFRhZ0xpc3RCeU5hbWUoY29udGV4dCwgdGFnTmFtZXMpXG4gICAgICAgIC50aGVuKChyZXNvbHZlZFRhZ3MpID0+IHVwZGF0ZVRhZ3NJbkl0ZW0oY29udGV4dCwge2l0ZW1Eb2NJZDogZ3JvdXBEb2NJZCwgdGFnczogcmVzb2x2ZWRUYWdzfSkpXG4gICAgICAgIC50aGVuKCgpID0+IGdyb3VwKTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZUdyb3VwID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGl0ZW1JZDogc3RyaW5nKTogUHJvbWlzZTxHcm91cFR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2RlbGV0ZSc7XG4gIGNvbnN0IGZvcm1hdEl0ZW1JZCA9IHBhcnNlSWQoaXRlbUlkKTtcblxuICByZXR1cm4gZGVsZXRlSXRlbTxHcm91cFR5cGU+KGNvbnRleHQsIENPTExFQ1RJT05TLkdST1VQUywgZm9ybWF0SXRlbUlkKVxuICAgIC50aGVuKChncm91cCkgPT4gZ3JvdXAgfHwgKHtfa2V5OiBmb3JtYXRJdGVtSWR9IGFzIEdyb3VwVHlwZSkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0R3JvdXBzQnlSZWFjdGlvbiA9IChjb250ZXh0OiBBcGlDb250ZXh0LCByZWFjdGlvbjogc3RyaW5nKTogUHJvbWlzZTxHcm91cFR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0R3JvdXBzQnlSZWFjdGlvbic7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0UmVhY3Rpb24gPSBwYXJzZUNoYXIocmVhY3Rpb24sIDMyKTtcbiAgY29uc3QgdXNlckRvY0lkID0gYHVzZXJzLyR7c2Vzc2lvbklkfWA7XG5cbiAgLy8gUXVlcnlcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgdSwgciBJTiBPVVRCT1VORCAke3VzZXJEb2NJZH0gaGFzUmVhY3Rpb25cbiAgICAgIEZJTFRFUiByLnZhbHVlID09ICR7Zm9ybWF0UmVhY3Rpb259XG4gICAgICBDT0xMRUNUIHJlYWN0aW9uTmFtZSA9IHIudmFsdWUgSU5UTyByZWFjdGlvbkl0ZW1zXG4gICAgICBSRVRVUk4ge3ZhbHVlOiByZWFjdGlvbk5hbWUsIGNvdW50OiBMRU5HVEgocmVhY3Rpb25JdGVtc1sqXS5yLnZhbHVlKX1gO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNHcm91cGVkID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHVzZXJJZDogc3RyaW5nLCBncm91cElkOiBzdHJpbmcpOiBQcm9taXNlPEdyb3VwVXNlcj4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnaXNHcm91cGVkJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRVc2VySWQgPSBwYXJzZUlkKHVzZXJJZCk7XG4gIGNvbnN0IGZvcm1hdEdyb3VwSWQgPSBwYXJzZUlkKGdyb3VwSWQpO1xuXG4gIC8vIENvbXBsZXggZWRnZSB0cmF2ZXJzYWwgdG8gY2hlY2sgZ3JvdXAgbWVtYmVyc2hpcCAtIGtlZXAgY3VzdG9tIGltcGxlbWVudGF0aW9uXG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIGcgSU4gJHtncm91cHNDb2xsZWN0aW9ufVxuICAgIEZJTFRFUiBnLl9rZXkgPT0gJHtmb3JtYXRHcm91cElkfVxuICAgIEZPUiB1IElOIElOQk9VTkQgZy5faWQgJHtoYXNDb25uZWN0aW9uQ29sbGVjdGlvbn1cbiAgICBGSUxURVIgdS5fa2V5ID09ICR7Zm9ybWF0VXNlcklkfVxuICAgIExJTUlUIDFcbiAgICBSRVRVUk4gdWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAudGhlbigocmVzdWx0cyA9IFtdKSA9PiB7XG4gICAgICBjb25zdCBpc1ZhbGlkID0gISFyZXN1bHRzLmxlbmd0aDtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZ3JvdXBJZCxcbiAgICAgICAgaXNWYWxpZCxcbiAgICAgICAgdXNlcklkXG4gICAgICB9O1xuICAgIH0pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwge3Nlc3Npb246IHt1c2VySWR9fSkudGhlbigoKSA9PiBudWxsKSk7XG59O1xuIl0sIm5hbWVzIjpbImZsYXR0ZW4iLCJ1bmlxQnkiLCJjcmVhdGVIYXNoIiwicGFyc2VBcmFuZ29JZCIsInBhcnNlQ2hhciIsInBhcnNlSWQiLCJhcWwiLCJsaXRlcmFsIiwiQ09MTEVDVElPTlMiLCJFREdFUyIsIkVycm9yVHlwZXMiLCJsb2dFcnJvciIsInVzZURiIiwiYWRkSXRlbSIsImRlbGV0ZUl0ZW0iLCJnZXRJdGVtQnkiLCJ1cGRhdGVJdGVtIiwiZXh0cmFjdFRhZ3MiLCJnZXRUYWdMaXN0QnlOYW1lIiwidXBkYXRlVGFnc0luSXRlbSIsImV2ZW50Q2F0ZWdvcnkiLCJncm91cHNDb2xsZWN0aW9uIiwiR1JPVVBTIiwidXNlcnNDb2xsZWN0aW9uIiwiVVNFUlMiLCJoYXNDb25uZWN0aW9uQ29sbGVjdGlvbiIsIkhBU19DT05ORUNUSU9OIiwiaXNUYWdnZWRDb2xsZWN0aW9uIiwiSVNfVEFHR0VEIiwiZ2V0R3JvdXBMaXN0QnlBcHAiLCJjb250ZXh0IiwiZnJvbSIsInRvIiwiYWN0aW9uIiwiZGF0YWJhc2VOYW1lIiwiYXFsUXJ5IiwidW5kZWZpbmVkIiwicXVlcnkiLCJ0aGVuIiwiY3Vyc29yIiwiYWxsIiwiY2F0Y2giLCJlcnJvciIsImNhdGVnb3J5IiwibGFiZWwiLCJEQVRBQkFTRV9FUlJPUiIsImdldEdyb3VwTGlzdEJ5VXNlciIsInVzZXJJZCIsImdldEdyb3VwTGlzdEJ5VGFncyIsInRhZ05hbWVzIiwiUHJvbWlzZSIsIm1hcCIsInRhZ05hbWUiLCJmb3JtYXRUYWdOYW1lIiwibGltaXRDbGF1c2UiLCJyZXN1bHRzIiwiaXRlbSIsIl9rZXkiLCJnZXRHcm91cEJ5SWQiLCJpdGVtSWQiLCJzZXNzaW9uIiwic2Vzc2lvbklkIiwiZm9ybWF0SXRlbUlkIiwibmV4dCIsImdyb3VwIiwiZ2V0R3JvdXBEZXRhaWxzIiwiZ3JvdXBJZCIsImZvcm1hdEdyb3VwSWQiLCJjcmVhdGVHcm91cEVkZ2UiLCJ1c2VyRG9jSWQiLCJncm91cERvY0lkIiwiZm9ybWF0VXNlRG9jSWQiLCJmb3JtYXRHcm91cERvY0lkIiwibm93IiwiRGF0ZSIsImVkZ2VDb2xsZWN0aW9uIiwiY29sbGVjdGlvbiIsImVkZ2VJZCIsImVkZ2UiLCJfZnJvbSIsIl90byIsImFkZGVkIiwidHlwZSIsInNhdmUiLCJyZXR1cm5OZXciLCJidWlsZEdyb3VwTXV0YXRpb24iLCJkZXNjcmlwdGlvbiIsIm5hbWUiLCJzdWJzdHJpbmciLCJhZGRHcm91cCIsInNlc3Npb25Eb2NJZCIsImlkIiwiaW5zZXJ0IiwiX2lkIiwic3RhcnRzV2l0aCIsIklOVkFMSURfSU5QVVQiLCJFcnJvciIsInJlc29sdmVkVGFncyIsIml0ZW1Eb2NJZCIsInRhZ3MiLCJ1cGRhdGVHcm91cCIsImRlbGV0ZUdyb3VwIiwiZ2V0R3JvdXBzQnlSZWFjdGlvbiIsInJlYWN0aW9uIiwiZm9ybWF0UmVhY3Rpb24iLCJpc0dyb3VwZWQiLCJmb3JtYXRVc2VySWQiLCJpc1ZhbGlkIiwibGVuZ3RoIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0NBR0MsR0FDRCxTQUFRQSxPQUFPLFFBQU8sOEJBQThCO0FBQ3BELFNBQVFDLE1BQU0sUUFBTywyQkFBMkI7QUFDaEQsU0FBUUMsVUFBVSxFQUFFQyxhQUFhLEVBQUVDLFNBQVMsRUFBRUMsT0FBTyxRQUFPLCtCQUErQjtBQUMzRixTQUFRQyxHQUFHLFFBQU8sV0FBVztBQUM3QixTQUFrQkMsT0FBTyxRQUFPLGVBQWU7QUFFL0MsU0FBUUMsV0FBVyxFQUFFQyxLQUFLLFFBQU8sOEJBQThCO0FBQy9ELFNBQVFDLFVBQVUsUUFBTywwQkFBMEI7QUFDbkQsU0FBUUMsUUFBUSxRQUFPLDZCQUE2QjtBQUNwRCxTQUFRQyxLQUFLLFFBQU8sNEJBQTRCO0FBQ2hELFNBQVFDLE9BQU8sRUFBRUMsVUFBVSxFQUFFQyxTQUFTLEVBQUVDLFVBQVUsUUFBTyxZQUFZO0FBQ3JFLFNBQVFDLFdBQVcsRUFBRUMsZ0JBQWdCLEVBQUVDLGdCQUFnQixRQUFPLFlBQVk7QUFNMUUsTUFBTUMsZ0JBQWdCO0FBQ3RCLE1BQU1DLG1CQUFtQmQsUUFBUUMsWUFBWWMsTUFBTTtBQUNuRCxNQUFNQyxrQkFBa0JoQixRQUFRQyxZQUFZZ0IsS0FBSztBQUNqRCxNQUFNQywwQkFBMEJsQixRQUFRRSxNQUFNaUIsY0FBYztBQUM1RCxNQUFNQyxxQkFBcUJwQixRQUFRRSxNQUFNbUIsU0FB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
280
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9ncm91cHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTktUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIGlzIHN1YmplY3QgdG8gdGhlIGFjY29tcGFueWluZyBjb21tZXJjaWFsIExJQ0VOU0UuXG4gKi9cbmltcG9ydCB7ZmxhdHRlbn0gZnJvbSAnQG5sYWJzL3V0aWxzL2FycmF5cy9mbGF0dGVuJztcbmltcG9ydCB7dW5pcUJ5fSBmcm9tICdAbmxhYnMvdXRpbHMvYXJyYXlzL3VuaXEnO1xuaW1wb3J0IHtjcmVhdGVIYXNoLCBwYXJzZUFyYW5nb0lkLCBwYXJzZUNoYXIsIHBhcnNlSWR9IGZyb20gJ0BubGFicy91dGlscy9wYXJzZXJzL3N0cmluZ3MnO1xuaW1wb3J0IHthcWx9IGZyb20gJ2FyYW5nb2pzJztcbmltcG9ydCB7QXFsUXVlcnksIGxpdGVyYWx9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5cbmltcG9ydCB7Q09MTEVDVElPTlMsIEVER0VTfSBmcm9tICcuLi9jb25zdGFudHMvY29sbGVjdGlvbnMuanMnO1xuaW1wb3J0IHtFcnJvclR5cGVzfSBmcm9tICcuLi90eXBlcy9lcnJvci50eXBlcy5qcyc7XG5pbXBvcnQge2xvZ0Vycm9yfSBmcm9tICcuLi91dGlscy9hbmFseXRpY3NVdGlscy5qcyc7XG5pbXBvcnQge3VzZURifSBmcm9tICcuLi91dGlscy9hcmFuZ29kYlV0aWxzLmpzJztcbmltcG9ydCB7YWRkSXRlbSwgZGVsZXRlSXRlbSwgZ2V0SXRlbUJ5LCB1cGRhdGVJdGVtfSBmcm9tICcuL2NydWQuanMnO1xuaW1wb3J0IHtleHRyYWN0VGFncywgZ2V0VGFnTGlzdEJ5TmFtZSwgdXBkYXRlVGFnc0luSXRlbX0gZnJvbSAnLi90YWdzLmpzJztcblxuaW1wb3J0IHR5cGUge0VkZ2VDb2xsZWN0aW9ufSBmcm9tICdhcmFuZ29qcy9jb2xsZWN0aW9ucyc7XG5pbXBvcnQgdHlwZSB7QXBpQ29udGV4dH0gZnJvbSAnLi4vdHlwZXMvYXV0aC50eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7R3JvdXBFZGdlVHlwZSwgR3JvdXBUeXBlLCBHcm91cFVzZXJ9IGZyb20gJy4uL3R5cGVzL2dyb3Vwcy50eXBlcy5qcyc7XG5cbmNvbnN0IGV2ZW50Q2F0ZWdvcnkgPSAnZ3JvdXBzJztcbmNvbnN0IGdyb3Vwc0NvbGxlY3Rpb24gPSBsaXRlcmFsKENPTExFQ1RJT05TLkdST1VQUyk7XG5jb25zdCB1c2Vyc0NvbGxlY3Rpb24gPSBsaXRlcmFsKENPTExFQ1RJT05TLlVTRVJTKTtcbmNvbnN0IGhhc0Nvbm5lY3Rpb25Db2xsZWN0aW9uID0gbGl0ZXJhbChFREdFUy5IQVNfQ09OTkVDVElPTik7XG5jb25zdCBpc1RhZ2dlZENvbGxlY3Rpb24gPSBsaXRlcmFsKEVER0VTLklTX1RBR0dFRCk7XG5cbi8qKlxuICogR2V0IGFsbCBncm91cHMgZm9yIHRoZSBhcHAgd2l0aCB0aGVpciB1c2Vyc1xuICogTm90ZTogVXNlcyBjdXN0b20gcXVlcnkgZm9yIGVkZ2UgdHJhdmVyc2FsIHRvIGluY2x1ZGUgdXNlcnNcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEdyb3VwTGlzdEJ5QXBwID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGZyb20/OiBudW1iZXIsIHRvPzogbnVtYmVyKTogUHJvbWlzZTxHcm91cFR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0R3JvdXBMaXN0QnlBcHAnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG5cbiAgLy8gQ29tcGxleCBlZGdlIHRyYXZlcnNhbCBxdWVyeSAtIGtlZXAgY3VzdG9tIGltcGxlbWVudGF0aW9uXG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgXG4gICAgRk9SIGcgSU4gJHtncm91cHNDb2xsZWN0aW9ufVxuICAgICAgTEVUIHVzZXJzID0gKFxuICAgICAgICBGT1IgdSwgbCBJTiBPVVRCT1VORCBnLl9pZCAke2hhc0Nvbm5lY3Rpb25Db2xsZWN0aW9ufVxuICAgICAgICBSRVRVUk4gTUVSR0UodSwge3R5cGU6IGwudHlwZX0pXG4gICAgICApXG4gICAgICAke2Zyb20gIT09IHVuZGVmaW5lZCAmJiB0byAhPT0gdW5kZWZpbmVkID8gbGl0ZXJhbChgTElNSVQgJHtmcm9tfSwgJHt0byAtIGZyb219YCkgOiBsaXRlcmFsKCcnKX1cbiAgICAgIFNPUlQgZy5hZGRlZFxuICAgICAgUkVUVVJOIERJU1RJTkNUIE1FUkdFKGcsIHt1c2Vyc30pXG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCk7XG5cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRHcm91cExpc3RCeVVzZXIgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHVzZXJJZDogc3RyaW5nLFxuICBmcm9tOiBudW1iZXIsXG4gIHRvOiBudW1iZXJcbik6IFByb21pc2U8R3JvdXBUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldEdyb3VwTGlzdEJ5VXNlcic7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcblxuICAvLyBDb21wbGV4IGVkZ2UgdHJhdmVyc2FsIHF1ZXJ5IHdpdGggdXNlciBmaWx0ZXJpbmcgLSBrZWVwIGN1c3RvbSBpbXBsZW1lbnRhdGlvblxuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBnLCBlIElOIElOQk9VTkQgJHtgdXNlcnMvJHt1c2VySWR9YH0gJHtoYXNDb25uZWN0aW9uQ29sbGVjdGlvbn1cbiAgICAgIExFVCB1c2VycyA9IChcbiAgICAgICAgRk9SIHUsIGwgSU4gT1VUQk9VTkQgZy5faWQgJHtoYXNDb25uZWN0aW9uQ29sbGVjdGlvbn1cbiAgICAgICAgUkVUVVJOIE1FUkdFKHUsIHt0eXBlOiBsLnR5cGV9KVxuICAgICAgKVxuICAgICAgJHtmcm9tICE9PSB1bmRlZmluZWQgJiYgdG8gIT09IHVuZGVmaW5lZCA/IGxpdGVyYWwoYExJTUlUICR7ZnJvbX0sICR7dG8gLSBmcm9tfWApIDogbGl0ZXJhbCgnJyl9XG4gICAgICBTT1JUIGcuYWRkZWRcbiAgICAgIFJFVFVSTiBESVNUSU5DVCBNRVJHRShnLCB7dXNlcnN9KVxuICBgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpO1xuXG4gICAgICByZXR1cm4gW107XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0R3JvdXBMaXN0QnlUYWdzID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB0YWdOYW1lczogc3RyaW5nW10sXG4gIGZyb206IG51bWJlcixcbiAgdG86IG51bWJlclxuKTogUHJvbWlzZTxHcm91cFR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0TGlzdEJ5VGFncyc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcblxuICAvLyBDb21wbGV4IG11bHRpLXRhZyBxdWVyeSB3aXRoIGVkZ2UgdHJhdmVyc2FsIC0ga2VlcCBjdXN0b20gaW1wbGVtZW50YXRpb25cbiAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgIHRhZ05hbWVzLm1hcCgodGFnTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBmb3JtYXRUYWdOYW1lID0gcGFyc2VJZCh0YWdOYW1lKTtcbiAgICAgIGNvbnN0IGxpbWl0Q2xhdXNlID0gZnJvbSAhPT0gdW5kZWZpbmVkICYmIHRvICE9PSB1bmRlZmluZWQgPyBgTElNSVQgJHtmcm9tfSwgJHt0byAtIGZyb219YCA6ICcnO1xuICAgICAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgcCwgZSBJTiBPVVRCT1VORCAke2B0YWdzLyR7Zm9ybWF0VGFnTmFtZX1gfSAke2lzVGFnZ2VkQ29sbGVjdGlvbn1cbiAgICAgICAgICBGT1IgdSBJTiAke3VzZXJzQ29sbGVjdGlvbn1cbiAgICAgICAgICBMRVQgbGlrZXMgPSAoXG4gICAgICAgICAgICBGT1IgcG9zdCwgbGlrZSBJTiBJTkJPVU5EIHAuX2lkIGxpa2VzXG4gICAgICAgICAgICBGSUxURVIgbGlrZS52YWx1ZSA9PSAnbGlrZSdcbiAgICAgICAgICAgIFJFVFVSTiBsaWtlXG4gICAgICAgICAgKVxuICAgICAgICAgIExFVCBkaXNsaWtlcyA9IChcbiAgICAgICAgICAgIEZPUiBwb3N0LCBsaWtlIElOIElOQk9VTkQgcC5faWQgbGlrZXNcbiAgICAgICAgICAgIEZJTFRFUiBsaWtlLnZhbHVlID09ICdkaXNsaWtlJ1xuICAgICAgICAgICAgUkVUVVJOIGxpa2VcbiAgICAgICAgICApXG4gICAgICAgICAgRklMVEVSIGUudHlwZSA9PSAncG9zdCcgJiYgcC51c2VySWQgPT0gdS5fa2V5XG4gICAgICAgICAgJHtsaXRlcmFsKGxpbWl0Q2xhdXNlKX1cbiAgICAgICAgICBTT1JUIHAuYWRkZWRcbiAgICAgICAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwge3VzZXI6dSwgbGlrZXM6TEVOR1RIKGxpa2VzKSwgZGlzbGlrZXM6TEVOR1RIKGRpc2xpa2VzKX0pYDtcblxuICAgICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICBsb2dFcnJvcih7XG4gICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICAgICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCk7XG5cbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH0pO1xuICAgIH0pXG4gIClcbiAgICAudGhlbigocmVzdWx0cykgPT4gdW5pcUJ5KGZsYXR0ZW4ocmVzdWx0cyksIChpdGVtOiBhbnkpID0+IGl0ZW0uX2tleSkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0R3JvdXBCeUlkID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGl0ZW1JZDogc3RyaW5nKTogUHJvbWlzZTxHcm91cFR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldEl0ZW0nO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9ufSA9IGNvbnRleHQ7XG4gIGNvbnN0IHNlc3Npb25JZCA9IHNlc3Npb24/LnVzZXJJZCB8fCAnJztcbiAgY29uc3QgZm9ybWF0SXRlbUlkID0gcGFyc2VJZChpdGVtSWQpO1xuXG4gIC8vIENvbXBsZXggZWRnZSB0cmF2ZXJzYWwgd2l0aCB1c2VyIG93bmVyc2hpcCBjaGVjayAtIGtlZXAgY3VzdG9tIGltcGxlbWVudGF0aW9uXG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIGcsIGUgSU4gT1VUQk9VTkQgJHtgdXNlcnMvJHtzZXNzaW9uSWR9YH0gaGFzQ29ubmVjdGlvblxuICAgICAgRklMVEVSIGcuX2tleSA9PSAke2Zvcm1hdEl0ZW1JZH1cbiAgICAgIExFVCB1c2VycyA9IChcbiAgICAgICAgRk9SIHUsIGwgSU4gT1VUQk9VTkQgZy5faWQgaGFzQ29ubmVjdGlvblxuICAgICAgICBSRVRVUk4gTUVSR0UgKHUsIHt0eXBlOmwudHlwZX0pXG4gICAgICApXG4gICAgICBMSU1JVCAxXG4gICAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UoZywge3VzZXJzOnVzZXJzfSlgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChncm91cDogR3JvdXBUeXBlKSA9PiBncm91cClcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRHcm91cERldGFpbHMgPSAoY29udGV4dDogQXBpQ29udGV4dCwgZ3JvdXBJZDogc3RyaW5nKTogUHJvbWlzZTxHcm91cFR5cGU+ID0+IHtcbiAgY29uc3QgZm9ybWF0R3JvdXBJZCA9IHBhcnNlSWQoZ3JvdXBJZCk7XG4gIHJldHVybiBnZXRJdGVtQnk8R3JvdXBUeXBlPihjb250ZXh0LCBDT0xMRUNUSU9OUy5HUk9VUFMsIHtfa2V5OiBmb3JtYXRHcm91cElkfSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlR3JvdXBFZGdlID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB1c2VyRG9jSWQ6IHN0cmluZyxcbiAgZ3JvdXBEb2NJZDogc3RyaW5nXG4pOiBQcm9taXNlPEdyb3VwRWRnZVR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2NyZWF0ZUdyb3VwRWRnZSc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0VXNlRG9jSWQgPSBwYXJzZUFyYW5nb0lkKHVzZXJEb2NJZCk7XG4gIGNvbnN0IGZvcm1hdEdyb3VwRG9jSWQgPSBwYXJzZUFyYW5nb0lkKGdyb3VwRG9jSWQpO1xuXG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGNvbnN0IGVkZ2VDb2xsZWN0aW9uOiBFZGdlQ29sbGVjdGlvbiA9IHVzZURiKGRhdGFiYXNlTmFtZSkuY29sbGVjdGlvbignaGFzQ29ubmVjdGlvbicpO1xuICBjb25zdCBlZGdlSWQgPSBjcmVhdGVIYXNoKGBncm91cC0ke2Zvcm1hdFVzZURvY0lkfS0ke2Zvcm1hdEdyb3VwRG9jSWR9YCk7XG4gIGNvbnN0IGVkZ2U6IGFueSA9IHtcbiAgICBfZnJvbTogZm9ybWF0VXNlRG9jSWQsXG4gICAgX2tleTogZWRnZUlkLFxuICAgIF90bzogZm9ybWF0R3JvdXBEb2NJZCxcbiAgICBhZGRlZDogbm93LFxuICAgIHR5cGU6ICdncm91cHMnXG4gIH07XG5cbiAgcmV0dXJuIGVkZ2VDb2xsZWN0aW9uLnNhdmUoZWRnZSwge3JldHVybk5ldzogdHJ1ZX0pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwge3Nlc3Npb246IHt1c2VySWQ6IGZvcm1hdFVzZURvY0lkfX0pLnRoZW4oKCkgPT4gbnVsbCkpO1xufTtcblxuY29uc3QgYnVpbGRHcm91cE11dGF0aW9uID0gKHtkZXNjcmlwdGlvbiA9ICcnLCBuYW1lID0gJ1VudGl0bGVkJywgdHlwZX06IEdyb3VwVHlwZSk6IFBhcnRpYWw8R3JvdXBUeXBlPiA9PiAoe1xuICBkZXNjcmlwdGlvbjogZGVzY3JpcHRpb24uc3Vic3RyaW5nKDAsIDY0MCksXG4gIG5hbWUsXG4gIHR5cGU6IHBhcnNlQ2hhcih0eXBlLCAxNikgfHwgJ3ByaXZhdGUnXG59KTtcblxuZXhwb3J0IGNvbnN0IGFkZEdyb3VwID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGl0ZW06IEdyb3VwVHlwZSk6IFByb21pc2U8R3JvdXBUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdhZGQnO1xuICBjb25zdCB7c2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCBzZXNzaW9uRG9jSWQgPSBgJHtDT0xMRUNUSU9OUy5VU0VSU30vJHtzZXNzaW9uSWR9YDtcbiAgY29uc3Qge2Rlc2NyaXB0aW9uID0gJyd9OiBHcm91cFR5cGUgPSBpdGVtO1xuICBjb25zdCBpZCA9IGNyZWF0ZUhhc2goYGdyb3VwLSR7c2Vzc2lvbklkfWApO1xuICBjb25zdCBpbnNlcnQ6IEdyb3VwVHlwZSA9IHtcbiAgICBfa2V5OiBpZCxcbiAgICAuLi5idWlsZEdyb3VwTXV0YXRpb24oaXRlbSlcbiAgfTtcblxuICByZXR1cm4gYWRkSXRlbTxHcm91cFR5cGU+KGNvbnRleHQsIENPTExFQ1RJT05TLkdST1VQUywgaW5zZXJ0KVxuICAgIC50aGVuKChncm91cDogR3JvdXBUeXBlKSA9PiB7XG4gICAgICAvLyBVcGRhdGUgbGlua2VkIHRhZ3NcbiAgICAgIGNvbnN0IHtfaWQ6IGdyb3VwRG9jSWR9OiBHcm91cFR5cGUgPSBncm91cDtcblxuICAgICAgLy8gVmFsaWRhdGUgc2Vzc2lvbkRvY0lkIGFuZCBncm91cERvY0lkXG4gICAgICBpZiAoIXNlc3Npb25Eb2NJZCB8fCB0eXBlb2Ygc2Vzc2lvbkRvY0lkICE9PSAnc3RyaW5nJyB8fCAhc2Vzc2lvbkRvY0lkLnN0YXJ0c1dpdGgoJ3VzZXJzLycpKSB7XG4gICAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgICAgbGFiZWw6IEVycm9yVHlwZXMuSU5WQUxJRF9JTlBVVFxuICAgICAgICB9LCBuZXcgRXJyb3IoJ0ludmFsaWQgb3IgbWlzc2luZyBzZXNzaW9uRG9jSWQgZm9yIGVkZ2UgY3JlYXRpb24nKSwgY29udGV4dCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKCFncm91cERvY0lkIHx8IHR5cGVvZiBncm91cERvY0lkICE9PSAnc3RyaW5nJyB8fCAhZ3JvdXBEb2NJZC5zdGFydHNXaXRoKCdncm91cHMvJykpIHtcbiAgICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5JTlZBTElEX0lOUFVUXG4gICAgICAgIH0sIG5ldyBFcnJvcignSW52YWxpZCBvciBtaXNzaW5nIGdyb3VwRG9jSWQgZm9yIGVkZ2UgY3JlYXRpb24nKSwgY29udGV4dCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0YWdOYW1lcyA9IGV4dHJhY3RUYWdzKGRlc2NyaXB0aW9uKTtcbiAgICAgIHJldHVybiBnZXRUYWdMaXN0QnlOYW1lKGNvbnRleHQsIHRhZ05hbWVzKVxuICAgICAgICAudGhlbigocmVzb2x2ZWRUYWdzKSA9PiB1cGRhdGVUYWdzSW5JdGVtKGNvbnRleHQsIHtpdGVtRG9jSWQ6IGdyb3VwRG9jSWQsIHRhZ3M6IHJlc29sdmVkVGFnc30pKVxuICAgICAgICAudGhlbigoKSA9PiBjcmVhdGVHcm91cEVkZ2UoY29udGV4dCwgc2Vzc2lvbkRvY0lkLCBncm91cERvY0lkKVxuICAgICAgICAudGhlbigoKSA9PiBncm91cCkpO1xuICAgIH0pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlR3JvdXAgPSAoY29udGV4dDogQXBpQ29udGV4dCwgaXRlbTogR3JvdXBUeXBlKTogUHJvbWlzZTxHcm91cFR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ3VwZGF0ZSc7XG4gIGNvbnN0IHtcbiAgICBkZXNjcmlwdGlvbiA9ICcnLFxuICAgIGlkXG4gIH06IEdyb3VwVHlwZSA9IGl0ZW07XG4gIGNvbnN0IGl0ZW1JZCA9IHBhcnNlSWQoaWQpO1xuXG4gIHJldHVybiB1cGRhdGVJdGVtPEdyb3VwVHlwZT4oY29udGV4dCwgQ09MTEVDVElPTlMuR1JPVVBTLCBpdGVtSWQsIGJ1aWxkR3JvdXBNdXRhdGlvbihpdGVtKSlcbiAgICAudGhlbigoZ3JvdXA6IEdyb3VwVHlwZSkgPT4ge1xuICAgICAgY29uc3Qge19pZDogZ3JvdXBEb2NJZH0gPSBncm91cDtcblxuICAgICAgLy8gVXBkYXRlIGxpbmtlZCB0YWdzXG4gICAgICBjb25zdCB0YWdOYW1lcyA9IGV4dHJhY3RUYWdzKGRlc2NyaXB0aW9uKTtcbiAgICAgIHJldHVybiBnZXRUYWdMaXN0QnlOYW1lKGNvbnRleHQsIHRhZ05hbWVzKVxuICAgICAgICAudGhlbigocmVzb2x2ZWRUYWdzKSA9PiB1cGRhdGVUYWdzSW5JdGVtKGNvbnRleHQsIHtpdGVtRG9jSWQ6IGdyb3VwRG9jSWQsIHRhZ3M6IHJlc29sdmVkVGFnc30pKVxuICAgICAgICAudGhlbigoKSA9PiBncm91cCk7XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBkZWxldGVHcm91cCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBpdGVtSWQ6IHN0cmluZyk6IFByb21pc2U8R3JvdXBUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdkZWxldGUnO1xuICBjb25zdCBmb3JtYXRJdGVtSWQgPSBwYXJzZUlkKGl0ZW1JZCk7XG5cbiAgcmV0dXJuIGRlbGV0ZUl0ZW08R3JvdXBUeXBlPihjb250ZXh0LCBDT0xMRUNUSU9OUy5HUk9VUFMsIGZvcm1hdEl0ZW1JZClcbiAgICAudGhlbigoZ3JvdXApID0+IGdyb3VwIHx8ICh7X2tleTogZm9ybWF0SXRlbUlkfSBhcyBHcm91cFR5cGUpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEdyb3Vwc0J5UmVhY3Rpb24gPSAoY29udGV4dDogQXBpQ29udGV4dCwgcmVhY3Rpb246IHN0cmluZyk6IFByb21pc2U8R3JvdXBUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldEdyb3Vwc0J5UmVhY3Rpb24nO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdFJlYWN0aW9uID0gcGFyc2VDaGFyKHJlYWN0aW9uLCAzMik7XG4gIGNvbnN0IHVzZXJEb2NJZCA9IGB1c2Vycy8ke3Nlc3Npb25JZH1gO1xuXG4gIC8vIFF1ZXJ5XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIHUsIHIgSU4gT1VUQk9VTkQgJHt1c2VyRG9jSWR9IGhhc1JlYWN0aW9uXG4gICAgICBGSUxURVIgci52YWx1ZSA9PSAke2Zvcm1hdFJlYWN0aW9ufVxuICAgICAgQ09MTEVDVCByZWFjdGlvbk5hbWUgPSByLnZhbHVlIElOVE8gcmVhY3Rpb25JdGVtc1xuICAgICAgUkVUVVJOIHt2YWx1ZTogcmVhY3Rpb25OYW1lLCBjb3VudDogTEVOR1RIKHJlYWN0aW9uSXRlbXNbKl0uci52YWx1ZSl9YDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzR3JvdXBlZCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCB1c2VySWQ6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nKTogUHJvbWlzZTxHcm91cFVzZXI+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2lzR3JvdXBlZCc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0VXNlcklkID0gcGFyc2VJZCh1c2VySWQpO1xuICBjb25zdCBmb3JtYXRHcm91cElkID0gcGFyc2VJZChncm91cElkKTtcblxuICAvLyBDb21wbGV4IGVkZ2UgdHJhdmVyc2FsIHRvIGNoZWNrIGdyb3VwIG1lbWJlcnNoaXAgLSBrZWVwIGN1c3RvbSBpbXBsZW1lbnRhdGlvblxuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiBnIElOICR7Z3JvdXBzQ29sbGVjdGlvbn1cbiAgICBGSUxURVIgZy5fa2V5ID09ICR7Zm9ybWF0R3JvdXBJZH1cbiAgICBGT1IgdSBJTiBJTkJPVU5EIGcuX2lkICR7aGFzQ29ubmVjdGlvbkNvbGxlY3Rpb259XG4gICAgRklMVEVSIHUuX2tleSA9PSAke2Zvcm1hdFVzZXJJZH1cbiAgICBMSU1JVCAxXG4gICAgUkVUVVJOIHVgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLnRoZW4oKHJlc3VsdHMgPSBbXSkgPT4ge1xuICAgICAgY29uc3QgaXNWYWxpZCA9ICEhcmVzdWx0cy5sZW5ndGg7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGdyb3VwSWQsXG4gICAgICAgIGlzVmFsaWQsXG4gICAgICAgIHVzZXJJZFxuICAgICAgfTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIHtzZXNzaW9uOiB7dXNlcklkfX0pLnRoZW4oKCkgPT4gbnVsbCkpO1xufTtcbiJdLCJuYW1lcyI6WyJmbGF0dGVuIiwidW5pcUJ5IiwiY3JlYXRlSGFzaCIsInBhcnNlQXJhbmdvSWQiLCJwYXJzZUNoYXIiLCJwYXJzZUlkIiwiYXFsIiwibGl0ZXJhbCIsIkNPTExFQ1RJT05TIiwiRURHRVMiLCJFcnJvclR5cGVzIiwibG9nRXJyb3IiLCJ1c2VEYiIsImFkZEl0ZW0iLCJkZWxldGVJdGVtIiwiZ2V0SXRlbUJ5IiwidXBkYXRlSXRlbSIsImV4dHJhY3RUYWdzIiwiZ2V0VGFnTGlzdEJ5TmFtZSIsInVwZGF0ZVRhZ3NJbkl0ZW0iLCJldmVudENhdGVnb3J5IiwiZ3JvdXBzQ29sbGVjdGlvbiIsIkdST1VQUyIsInVzZXJzQ29sbGVjdGlvbiIsIlVTRVJTIiwiaGFzQ29ubmVjdGlvbkNvbGxlY3Rpb24iLCJIQVNfQ09OTkVDVElPTiIsImlzVGFnZ2VkQ29sbGVjdGlvbiIsIklTX1RBR0dFRCIsImdldEdyb3VwTGlzdEJ5QXBwIiwiY29udGV4dCIsImZyb20iLCJ0byIsImFjdGlvbiIsImRhdGFiYXNlTmFtZSIsImFxbFFyeSIsInVuZGVmaW5lZCIsInF1ZXJ5IiwidGhlbiIsImN1cnNvciIsImFsbCIsImNhdGNoIiwiZXJyb3IiLCJjYXRlZ29yeSIsImxhYmVsIiwiREFUQUJBU0VfRVJST1IiLCJnZXRHcm91cExpc3RCeVVzZXIiLCJ1c2VySWQiLCJnZXRHcm91cExpc3RCeVRhZ3MiLCJ0YWdOYW1lcyIsIlByb21pc2UiLCJtYXAiLCJ0YWdOYW1lIiwiZm9ybWF0VGFnTmFtZSIsImxpbWl0Q2xhdXNlIiwicmVzdWx0cyIsIml0ZW0iLCJfa2V5IiwiZ2V0R3JvdXBCeUlkIiwiaXRlbUlkIiwic2Vzc2lvbiIsInNlc3Npb25JZCIsImZvcm1hdEl0ZW1JZCIsIm5leHQiLCJncm91cCIsImdldEdyb3VwRGV0YWlscyIsImdyb3VwSWQiLCJmb3JtYXRHcm91cElkIiwiY3JlYXRlR3JvdXBFZGdlIiwidXNlckRvY0lkIiwiZ3JvdXBEb2NJZCIsImZvcm1hdFVzZURvY0lkIiwiZm9ybWF0R3JvdXBEb2NJZCIsIm5vdyIsIkRhdGUiLCJlZGdlQ29sbGVjdGlvbiIsImNvbGxlY3Rpb24iLCJlZGdlSWQiLCJlZGdlIiwiX2Zyb20iLCJfdG8iLCJhZGRlZCIsInR5cGUiLCJzYXZlIiwicmV0dXJuTmV3IiwiYnVpbGRHcm91cE11dGF0aW9uIiwiZGVzY3JpcHRpb24iLCJuYW1lIiwic3Vic3RyaW5nIiwiYWRkR3JvdXAiLCJzZXNzaW9uRG9jSWQiLCJpZCIsImluc2VydCIsIl9pZCIsInN0YXJ0c1dpdGgiLCJJTlZBTElEX0lOUFVUIiwiRXJyb3IiLCJyZXNvbHZlZFRhZ3MiLCJpdGVtRG9jSWQiLCJ0YWdzIiwidXBkYXRlR3JvdXAiLCJkZWxldGVHcm91cCIsImdldEdyb3Vwc0J5UmVhY3Rpb24iLCJyZWFjdGlvbiIsImZvcm1hdFJlYWN0aW9uIiwiaXNHcm91cGVkIiwiZm9ybWF0VXNlcklkIiwiaXNWYWxpZCIsImxlbmd0aCJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0QsU0FBUUEsT0FBTyxRQUFPLDhCQUE4QjtBQUNwRCxTQUFRQyxNQUFNLFFBQU8sMkJBQTJCO0FBQ2hELFNBQVFDLFVBQVUsRUFBRUMsYUFBYSxFQUFFQyxTQUFTLEVBQUVDLE9BQU8sUUFBTywrQkFBK0I7QUFDM0YsU0FBUUMsR0FBRyxRQUFPLFdBQVc7QUFDN0IsU0FBa0JDLE9BQU8sUUFBTyxlQUFlO0FBRS9DLFNBQVFDLFdBQVcsRUFBRUMsS0FBSyxRQUFPLDhCQUE4QjtBQUMvRCxTQUFRQyxVQUFVLFFBQU8sMEJBQTBCO0FBQ25ELFNBQVFDLFFBQVEsUUFBTyw2QkFBNkI7QUFDcEQsU0FBUUMsS0FBSyxRQUFPLDRCQUE0QjtBQUNoRCxTQUFRQyxPQUFPLEVBQUVDLFVBQVUsRUFBRUMsU0FBUyxFQUFFQyxVQUFVLFFBQU8sWUFBWTtBQUNyRSxTQUFRQyxXQUFXLEVBQUVDLGdCQUFnQixFQUFFQyxnQkFBZ0IsUUFBTyxZQUFZO0FBTTFFLE1BQU1DLGdCQUFnQjtBQUN0QixNQUFNQyxtQkFBbUJkLFFBQVFDLFlBQVljLE1BQU07QUFDbkQsTUFBTUMsa0JBQWtCaEIsUUFBUUMsWUFBWWdCLEtBQUs7QUFDakQsTUFBTUMsMEJBQTBCbEIsUUFBUUUsTUFBTWlCLGNBQWM7QUFDNUQsTUFBTUMscUJBQXFCcEIsUUFBUUUsTUFBTW1CLFNB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
@@ -0,0 +1,20 @@
1
+ import type { MarketingStudioImageInput, SeedanceReferenceVideoInput, SeedanceVideoInput, SoulImageInput } from '../adapters/higgsfieldAdapter.js';
2
+ import type { ApiContext } from '../types/auth.types.js';
3
+ export interface HiggsfieldRequestResult {
4
+ cancelUrl?: string;
5
+ requestId: string;
6
+ statusUrl: string;
7
+ }
8
+ export interface HiggsfieldStatusResult {
9
+ error?: string;
10
+ mediaUrl?: string;
11
+ mediaUrls?: string[];
12
+ requestId: string;
13
+ status: string;
14
+ }
15
+ export declare const generateSoulImage: (context: ApiContext, input: SoulImageInput, webhookUrl?: string) => Promise<HiggsfieldRequestResult>;
16
+ export declare const generateSeedanceVideo: (context: ApiContext, input: SeedanceVideoInput, webhookUrl?: string) => Promise<HiggsfieldRequestResult>;
17
+ export declare const generateSeedanceReferenceVideo: (context: ApiContext, input: SeedanceReferenceVideoInput, webhookUrl?: string) => Promise<HiggsfieldRequestResult>;
18
+ export declare const generateMarketingStudioImage: (context: ApiContext, input: MarketingStudioImageInput, webhookUrl?: string) => Promise<HiggsfieldRequestResult>;
19
+ export declare const getHiggsfieldRequestStatus: (context: ApiContext, requestId: string) => Promise<HiggsfieldStatusResult>;
20
+ export declare const cancelHiggsfieldRequest: (context: ApiContext, requestId: string) => Promise<boolean>;
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Copyright (c) 2026-Present, Nitrogen Labs, Inc.
3
+ * All rights reserved. Use is subject to the accompanying commercial LICENSE.
4
+ */ import { get, post } from '@nlabs/rip-hunter';
5
+ import { validateMarketingStudioImageInput, validateSeedanceReferenceVideoInput, validateSeedanceVideoInput, validateSoulImageInput } from '../adapters/higgsfieldAdapter.js';
6
+ import { Config } from '../config.js';
7
+ import { ErrorTypes } from '../types/error.types.js';
8
+ import { logError } from '../utils/analyticsUtils.js';
9
+ const eventCategory = 'higgsfield';
10
+ const HIGGSFIELD_ORIGIN = 'https://api.higgsfield.ai';
11
+ const SOUL_IMAGE_ENDPOINT = `${HIGGSFIELD_ORIGIN}/higgsfield-ai/soul/v2/standard`;
12
+ const SEEDANCE_VIDEO_ENDPOINT = `${HIGGSFIELD_ORIGIN}/bytedance/seedance-2.5/image-to-video`;
13
+ const SEEDANCE_REFERENCE_VIDEO_ENDPOINT = `${HIGGSFIELD_ORIGIN}/bytedance/seedance-2.5/reference-to-video`;
14
+ const MARKETING_STUDIO_IMAGE_ENDPOINT = `${HIGGSFIELD_ORIGIN}/marketing-studio/image`;
15
+ /** Never send API credentials to a provider-supplied third-party polling/cancel URL. */ const validateHiggsfieldUrl = (value, requestId, action)=>{
16
+ const url = new URL(value);
17
+ if (url.origin !== HIGGSFIELD_ORIGIN || url.username || url.password || url.pathname !== `/requests/${requestId}/${action}` || url.search || url.hash) {
18
+ throw new Error(`Higgsfield returned an invalid ${action} URL. Reconcile the request manually.`);
19
+ }
20
+ return url.href;
21
+ };
22
+ const authHeaders = ()=>{
23
+ const keyId = Config.get('higgsfield.keyId');
24
+ const keySecret = Config.get('higgsfield.keySecret');
25
+ if (!keyId || !keySecret) {
26
+ throw new Error('Higgsfield is not configured. Set HIGGSFIELD_KEY_ID and HIGGSFIELD_KEY_SECRET.');
27
+ }
28
+ return new Headers({
29
+ Authorization: `Key ${keyId}:${keySecret}`,
30
+ 'Content-Type': 'application/json'
31
+ });
32
+ };
33
+ const withWebhook = (endpoint, webhookUrl)=>webhookUrl ? `${endpoint}?hf_webhook=${encodeURIComponent(webhookUrl)}` : endpoint;
34
+ const submit = async (context, action, endpoint, body)=>{
35
+ try {
36
+ const data = await post(endpoint, body, {
37
+ cache: false,
38
+ headers: authHeaders()
39
+ });
40
+ if (!data.request_id || !data.status_url) {
41
+ throw new Error('Higgsfield submission outcome is unknown: missing request_id or status_url.');
42
+ }
43
+ return {
44
+ cancelUrl: data.cancel_url ? validateHiggsfieldUrl(data.cancel_url, data.request_id, 'cancel') : undefined,
45
+ requestId: data.request_id,
46
+ statusUrl: validateHiggsfieldUrl(data.status_url, data.request_id, 'status')
47
+ };
48
+ } catch (error) {
49
+ return logError({
50
+ action,
51
+ category: eventCategory,
52
+ value: ErrorTypes.EXTERNAL_API_ERROR
53
+ }, error, context);
54
+ }
55
+ };
56
+ export const generateSoulImage = (context, input, webhookUrl)=>{
57
+ const validated = validateSoulImageInput(input);
58
+ return submit(context, 'generateSoulImage', withWebhook(SOUL_IMAGE_ENDPOINT, webhookUrl), {
59
+ aspect_ratio: validated.aspectRatio,
60
+ batch_size: validated.batchSize,
61
+ enhance_prompt: validated.enhancePrompt,
62
+ prompt: validated.prompt,
63
+ resolution: validated.resolution,
64
+ seed: validated.seed,
65
+ style_id: validated.styleId
66
+ });
67
+ };
68
+ export const generateSeedanceVideo = (context, input, webhookUrl)=>{
69
+ const validated = validateSeedanceVideoInput(input);
70
+ return submit(context, 'generateSeedanceVideo', withWebhook(SEEDANCE_VIDEO_ENDPOINT, webhookUrl), {
71
+ duration: validated.duration,
72
+ end_image_url: validated.endImageUrl,
73
+ generate_audio: validated.generateAudio,
74
+ image_url: validated.imageUrl,
75
+ output_format: validated.outputFormat,
76
+ prompt: validated.prompt,
77
+ resolution: validated.resolution
78
+ });
79
+ };
80
+ export const generateSeedanceReferenceVideo = (context, input, webhookUrl)=>{
81
+ const validated = validateSeedanceReferenceVideoInput(input);
82
+ return submit(context, 'generateSeedanceReferenceVideo', withWebhook(SEEDANCE_REFERENCE_VIDEO_ENDPOINT, webhookUrl), {
83
+ aspect_ratio: validated.aspectRatio,
84
+ audio_urls: validated.audioUrls,
85
+ duration: validated.duration,
86
+ generate_audio: validated.generateAudio,
87
+ image_urls: validated.imageUrls,
88
+ output_format: validated.outputFormat,
89
+ prompt: validated.prompt,
90
+ resolution: validated.resolution,
91
+ video_urls: validated.videoUrls
92
+ });
93
+ };
94
+ export const generateMarketingStudioImage = (context, input, webhookUrl)=>{
95
+ const validated = validateMarketingStudioImageInput(input);
96
+ return submit(context, 'generateMarketingStudioImage', withWebhook(MARKETING_STUDIO_IMAGE_ENDPOINT, webhookUrl), {
97
+ aspect_ratio: validated.aspectRatio,
98
+ enhance_prompt: validated.enhancePrompt,
99
+ image_urls: validated.imageUrls,
100
+ preset_id: validated.presetId,
101
+ prompt: validated.prompt,
102
+ quality: validated.quality,
103
+ resolution: validated.resolution
104
+ });
105
+ };
106
+ export const getHiggsfieldRequestStatus = async (context, requestId)=>{
107
+ try {
108
+ const statusUrl = validateHiggsfieldUrl(`${HIGGSFIELD_ORIGIN}/requests/${requestId}/status`, requestId, 'status');
109
+ const data = await get(statusUrl, {}, {
110
+ cache: false,
111
+ headers: authHeaders()
112
+ });
113
+ if (data.request_id !== requestId) {
114
+ throw new Error('Higgsfield status response returned an unexpected request identifier.');
115
+ }
116
+ return {
117
+ error: data.error,
118
+ mediaUrl: data.video?.url || data.images?.[0]?.url,
119
+ mediaUrls: data.images?.map((image)=>image.url).filter((url)=>Boolean(url)),
120
+ requestId,
121
+ status: data.status || 'unknown'
122
+ };
123
+ } catch (error) {
124
+ return logError({
125
+ action: 'getHiggsfieldRequestStatus',
126
+ category: eventCategory,
127
+ value: ErrorTypes.EXTERNAL_API_ERROR
128
+ }, error, context);
129
+ }
130
+ };
131
+ export const cancelHiggsfieldRequest = async (context, requestId)=>{
132
+ try {
133
+ const cancelUrl = validateHiggsfieldUrl(`${HIGGSFIELD_ORIGIN}/requests/${requestId}/cancel`, requestId, 'cancel');
134
+ await post(cancelUrl, {}, {
135
+ cache: false,
136
+ headers: authHeaders()
137
+ });
138
+ return (await getHiggsfieldRequestStatus(context, requestId)).status === 'canceled';
139
+ } catch (error) {
140
+ return logError({
141
+ action: 'cancelHiggsfieldRequest',
142
+ category: eventCategory,
143
+ value: ErrorTypes.EXTERNAL_API_ERROR
144
+ }, error, context);
145
+ }
146
+ };
147
+
148
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9oaWdnc2ZpZWxkLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDI2LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBpcyBzdWJqZWN0IHRvIHRoZSBhY2NvbXBhbnlpbmcgY29tbWVyY2lhbCBMSUNFTlNFLlxuICovXG5pbXBvcnQge2dldCwgcG9zdH0gZnJvbSAnQG5sYWJzL3JpcC1odW50ZXInO1xuXG5pbXBvcnQge1xuICB2YWxpZGF0ZU1hcmtldGluZ1N0dWRpb0ltYWdlSW5wdXQsXG4gIHZhbGlkYXRlU2VlZGFuY2VSZWZlcmVuY2VWaWRlb0lucHV0LFxuICB2YWxpZGF0ZVNlZWRhbmNlVmlkZW9JbnB1dCxcbiAgdmFsaWRhdGVTb3VsSW1hZ2VJbnB1dFxufSBmcm9tICcuLi9hZGFwdGVycy9oaWdnc2ZpZWxkQWRhcHRlci5qcyc7XG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vY29uZmlnLmpzJztcbmltcG9ydCB7RXJyb3JUeXBlc30gZnJvbSAnLi4vdHlwZXMvZXJyb3IudHlwZXMuanMnO1xuaW1wb3J0IHtsb2dFcnJvcn0gZnJvbSAnLi4vdXRpbHMvYW5hbHl0aWNzVXRpbHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7XG4gIE1hcmtldGluZ1N0dWRpb0ltYWdlSW5wdXQsXG4gIFNlZWRhbmNlUmVmZXJlbmNlVmlkZW9JbnB1dCxcbiAgU2VlZGFuY2VWaWRlb0lucHV0LFxuICBTb3VsSW1hZ2VJbnB1dFxufSBmcm9tICcuLi9hZGFwdGVycy9oaWdnc2ZpZWxkQWRhcHRlci5qcyc7XG5pbXBvcnQgdHlwZSB7QXBpQ29udGV4dH0gZnJvbSAnLi4vdHlwZXMvYXV0aC50eXBlcy5qcyc7XG5cbmNvbnN0IGV2ZW50Q2F0ZWdvcnkgPSAnaGlnZ3NmaWVsZCc7XG5jb25zdCBISUdHU0ZJRUxEX09SSUdJTiA9ICdodHRwczovL2FwaS5oaWdnc2ZpZWxkLmFpJztcbmNvbnN0IFNPVUxfSU1BR0VfRU5EUE9JTlQgPSBgJHtISUdHU0ZJRUxEX09SSUdJTn0vaGlnZ3NmaWVsZC1haS9zb3VsL3YyL3N0YW5kYXJkYDtcbmNvbnN0IFNFRURBTkNFX1ZJREVPX0VORFBPSU5UID0gYCR7SElHR1NGSUVMRF9PUklHSU59L2J5dGVkYW5jZS9zZWVkYW5jZS0yLjUvaW1hZ2UtdG8tdmlkZW9gO1xuY29uc3QgU0VFREFOQ0VfUkVGRVJFTkNFX1ZJREVPX0VORFBPSU5UID0gYCR7SElHR1NGSUVMRF9PUklHSU59L2J5dGVkYW5jZS9zZWVkYW5jZS0yLjUvcmVmZXJlbmNlLXRvLXZpZGVvYDtcbmNvbnN0IE1BUktFVElOR19TVFVESU9fSU1BR0VfRU5EUE9JTlQgPSBgJHtISUdHU0ZJRUxEX09SSUdJTn0vbWFya2V0aW5nLXN0dWRpby9pbWFnZWA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGlnZ3NmaWVsZFJlcXVlc3RSZXN1bHQge1xuICBjYW5jZWxVcmw/OiBzdHJpbmc7XG4gIHJlcXVlc3RJZDogc3RyaW5nO1xuICBzdGF0dXNVcmw6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIaWdnc2ZpZWxkU3RhdHVzUmVzdWx0IHtcbiAgZXJyb3I/OiBzdHJpbmc7XG4gIG1lZGlhVXJsPzogc3RyaW5nO1xuICBtZWRpYVVybHM/OiBzdHJpbmdbXTtcbiAgcmVxdWVzdElkOiBzdHJpbmc7XG4gIHN0YXR1czogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgSGlnZ3NmaWVsZFJlc3BvbnNlQm9keSB7XG4gIGNhbmNlbF91cmw/OiBzdHJpbmc7XG4gIGRldGFpbD86IHVua25vd247XG4gIGVycm9yPzogc3RyaW5nO1xuICBpbWFnZXM/OiB7dXJsPzogc3RyaW5nfVtdO1xuICByZXF1ZXN0X2lkPzogc3RyaW5nO1xuICBzdGF0dXM/OiBzdHJpbmc7XG4gIHN0YXR1c191cmw/OiBzdHJpbmc7XG4gIHZpZGVvPzoge3VybD86IHN0cmluZ307XG59XG5cbi8qKiBOZXZlciBzZW5kIEFQSSBjcmVkZW50aWFscyB0byBhIHByb3ZpZGVyLXN1cHBsaWVkIHRoaXJkLXBhcnR5IHBvbGxpbmcvY2FuY2VsIFVSTC4gKi9cbmNvbnN0IHZhbGlkYXRlSGlnZ3NmaWVsZFVybCA9ICh2YWx1ZTogc3RyaW5nLCByZXF1ZXN0SWQ6IHN0cmluZywgYWN0aW9uOiAnc3RhdHVzJyB8ICdjYW5jZWwnKTogc3RyaW5nID0+IHtcbiAgY29uc3QgdXJsID0gbmV3IFVSTCh2YWx1ZSk7XG5cbiAgaWYodXJsLm9yaWdpbiAhPT0gSElHR1NGSUVMRF9PUklHSU4gfHwgdXJsLnVzZXJuYW1lIHx8IHVybC5wYXNzd29yZCB8fFxuICAgIHVybC5wYXRobmFtZSAhPT0gYC9yZXF1ZXN0cy8ke3JlcXVlc3RJZH0vJHthY3Rpb259YCB8fCB1cmwuc2VhcmNoIHx8IHVybC5oYXNoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBIaWdnc2ZpZWxkIHJldHVybmVkIGFuIGludmFsaWQgJHthY3Rpb259IFVSTC4gUmVjb25jaWxlIHRoZSByZXF1ZXN0IG1hbnVhbGx5LmApO1xuICB9XG5cbiAgcmV0dXJuIHVybC5ocmVmO1xufTtcblxuY29uc3QgYXV0aEhlYWRlcnMgPSAoKTogSGVhZGVycyA9PiB7XG4gIGNvbnN0IGtleUlkID0gQ29uZmlnLmdldDxzdHJpbmc+KCdoaWdnc2ZpZWxkLmtleUlkJyk7XG4gIGNvbnN0IGtleVNlY3JldCA9IENvbmZpZy5nZXQ8c3RyaW5nPignaGlnZ3NmaWVsZC5rZXlTZWNyZXQnKTtcblxuICBpZigha2V5SWQgfHwgIWtleVNlY3JldCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSGlnZ3NmaWVsZCBpcyBub3QgY29uZmlndXJlZC4gU2V0IEhJR0dTRklFTERfS0VZX0lEIGFuZCBISUdHU0ZJRUxEX0tFWV9TRUNSRVQuJyk7XG4gIH1cblxuICByZXR1cm4gbmV3IEhlYWRlcnMoe1xuICAgIEF1dGhvcml6YXRpb246IGBLZXkgJHtrZXlJZH06JHtrZXlTZWNyZXR9YCxcbiAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gIH0pO1xufTtcblxuY29uc3Qgd2l0aFdlYmhvb2sgPSAoZW5kcG9pbnQ6IHN0cmluZywgd2ViaG9va1VybD86IHN0cmluZyk6IHN0cmluZyA9PlxuICAod2ViaG9va1VybCA/IGAke2VuZHBvaW50fT9oZl93ZWJob29rPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHdlYmhvb2tVcmwpfWAgOiBlbmRwb2ludCk7XG5cbmNvbnN0IHN1Ym1pdCA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCwgYWN0aW9uOiBzdHJpbmcsIGVuZHBvaW50OiBzdHJpbmcsIGJvZHk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4pOiBQcm9taXNlPEhpZ2dzZmllbGRSZXF1ZXN0UmVzdWx0PiA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHBvc3QoZW5kcG9pbnQsIGJvZHksIHtjYWNoZTogZmFsc2UsIGhlYWRlcnM6IGF1dGhIZWFkZXJzKCl9KSBhcyBIaWdnc2ZpZWxkUmVzcG9uc2VCb2R5O1xuXG4gICAgaWYoIWRhdGEucmVxdWVzdF9pZCB8fCAhZGF0YS5zdGF0dXNfdXJsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0hpZ2dzZmllbGQgc3VibWlzc2lvbiBvdXRjb21lIGlzIHVua25vd246IG1pc3NpbmcgcmVxdWVzdF9pZCBvciBzdGF0dXNfdXJsLicpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjYW5jZWxVcmw6IGRhdGEuY2FuY2VsX3VybCA/IHZhbGlkYXRlSGlnZ3NmaWVsZFVybChkYXRhLmNhbmNlbF91cmwsIGRhdGEucmVxdWVzdF9pZCwgJ2NhbmNlbCcpIDogdW5kZWZpbmVkLFxuICAgICAgcmVxdWVzdElkOiBkYXRhLnJlcXVlc3RfaWQsXG4gICAgICBzdGF0dXNVcmw6IHZhbGlkYXRlSGlnZ3NmaWVsZFVybChkYXRhLnN0YXR1c191cmwsIGRhdGEucmVxdWVzdF9pZCwgJ3N0YXR1cycpXG4gICAgfTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHJldHVybiBsb2dFcnJvcihcbiAgICAgIHthY3Rpb24sIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LCB2YWx1ZTogRXJyb3JUeXBlcy5FWFRFUk5BTF9BUElfRVJST1J9LCBlcnJvciBhcyBFcnJvciwgY29udGV4dFxuICAgICkgYXMgUHJvbWlzZTxuZXZlcj47XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZVNvdWxJbWFnZSA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCwgaW5wdXQ6IFNvdWxJbWFnZUlucHV0LCB3ZWJob29rVXJsPzogc3RyaW5nXG4pOiBQcm9taXNlPEhpZ2dzZmllbGRSZXF1ZXN0UmVzdWx0PiA9PiB7XG4gIGNvbnN0IHZhbGlkYXRlZCA9IHZhbGlkYXRlU291bEltYWdlSW5wdXQoaW5wdXQpO1xuXG4gIHJldHVybiBzdWJtaXQoY29udGV4dCwgJ2dlbmVyYXRlU291bEltYWdlJywgd2l0aFdlYmhvb2soU09VTF9JTUFHRV9FTkRQT0lOVCwgd2ViaG9va1VybCksIHtcbiAgICBhc3BlY3RfcmF0aW86IHZhbGlkYXRlZC5hc3BlY3RSYXRpbyxcbiAgICBiYXRjaF9zaXplOiB2YWxpZGF0ZWQuYmF0Y2hTaXplLFxuICAgIGVuaGFuY2VfcHJvbXB0OiB2YWxpZGF0ZWQuZW5oYW5jZVByb21wdCxcbiAgICBwcm9tcHQ6IHZhbGlkYXRlZC5wcm9tcHQsXG4gICAgcmVzb2x1dGlvbjogdmFsaWRhdGVkLnJlc29sdXRpb24sXG4gICAgc2VlZDogdmFsaWRhdGVkLnNlZWQsXG4gICAgc3R5bGVfaWQ6IHZhbGlkYXRlZC5zdHlsZUlkXG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlU2VlZGFuY2VWaWRlbyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCwgaW5wdXQ6IFNlZWRhbmNlVmlkZW9JbnB1dCwgd2ViaG9va1VybD86IHN0cmluZ1xuKTogUHJvbWlzZTxIaWdnc2ZpZWxkUmVxdWVzdFJlc3VsdD4gPT4ge1xuICBjb25zdCB2YWxpZGF0ZWQgPSB2YWxpZGF0ZVNlZWRhbmNlVmlkZW9JbnB1dChpbnB1dCk7XG5cbiAgcmV0dXJuIHN1Ym1pdChjb250ZXh0LCAnZ2VuZXJhdGVTZWVkYW5jZVZpZGVvJywgd2l0aFdlYmhvb2soU0VFREFOQ0VfVklERU9fRU5EUE9JTlQsIHdlYmhvb2tVcmwpLCB7XG4gICAgZHVyYXRpb246IHZhbGlkYXRlZC5kdXJhdGlvbixcbiAgICBlbmRfaW1hZ2VfdXJsOiB2YWxpZGF0ZWQuZW5kSW1hZ2VVcmwsXG4gICAgZ2VuZXJhdGVfYXVkaW86IHZhbGlkYXRlZC5nZW5lcmF0ZUF1ZGlvLFxuICAgIGltYWdlX3VybDogdmFsaWRhdGVkLmltYWdlVXJsLFxuICAgIG91dHB1dF9mb3JtYXQ6IHZhbGlkYXRlZC5vdXRwdXRGb3JtYXQsXG4gICAgcHJvbXB0OiB2YWxpZGF0ZWQucHJvbXB0LFxuICAgIHJlc29sdXRpb246IHZhbGlkYXRlZC5yZXNvbHV0aW9uXG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlU2VlZGFuY2VSZWZlcmVuY2VWaWRlbyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCwgaW5wdXQ6IFNlZWRhbmNlUmVmZXJlbmNlVmlkZW9JbnB1dCwgd2ViaG9va1VybD86IHN0cmluZ1xuKTogUHJvbWlzZTxIaWdnc2ZpZWxkUmVxdWVzdFJlc3VsdD4gPT4ge1xuICBjb25zdCB2YWxpZGF0ZWQgPSB2YWxpZGF0ZVNlZWRhbmNlUmVmZXJlbmNlVmlkZW9JbnB1dChpbnB1dCk7XG5cbiAgcmV0dXJuIHN1Ym1pdChjb250ZXh0LCAnZ2VuZXJhdGVTZWVkYW5jZVJlZmVyZW5jZVZpZGVvJywgd2l0aFdlYmhvb2soU0VFREFOQ0VfUkVGRVJFTkNFX1ZJREVPX0VORFBPSU5ULCB3ZWJob29rVXJsKSwge1xuICAgIGFzcGVjdF9yYXRpbzogdmFsaWRhdGVkLmFzcGVjdFJhdGlvLFxuICAgIGF1ZGlvX3VybHM6IHZhbGlkYXRlZC5hdWRpb1VybHMsXG4gICAgZHVyYXRpb246IHZhbGlkYXRlZC5kdXJhdGlvbixcbiAgICBnZW5lcmF0ZV9hdWRpbzogdmFsaWRhdGVkLmdlbmVyYXRlQXVkaW8sXG4gICAgaW1hZ2VfdXJsczogdmFsaWRhdGVkLmltYWdlVXJscyxcbiAgICBvdXRwdXRfZm9ybWF0OiB2YWxpZGF0ZWQub3V0cHV0Rm9ybWF0LFxuICAgIHByb21wdDogdmFsaWRhdGVkLnByb21wdCxcbiAgICByZXNvbHV0aW9uOiB2YWxpZGF0ZWQucmVzb2x1dGlvbixcbiAgICB2aWRlb191cmxzOiB2YWxpZGF0ZWQudmlkZW9VcmxzXG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlTWFya2V0aW5nU3R1ZGlvSW1hZ2UgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsIGlucHV0OiBNYXJrZXRpbmdTdHVkaW9JbWFnZUlucHV0LCB3ZWJob29rVXJsPzogc3RyaW5nXG4pOiBQcm9taXNlPEhpZ2dzZmllbGRSZXF1ZXN0UmVzdWx0PiA9PiB7XG4gIGNvbnN0IHZhbGlkYXRlZCA9IHZhbGlkYXRlTWFya2V0aW5nU3R1ZGlvSW1hZ2VJbnB1dChpbnB1dCk7XG5cbiAgcmV0dXJuIHN1Ym1pdChjb250ZXh0LCAnZ2VuZXJhdGVNYXJrZXRpbmdTdHVkaW9JbWFnZScsIHdpdGhXZWJob29rKE1BUktFVElOR19TVFVESU9fSU1BR0VfRU5EUE9JTlQsIHdlYmhvb2tVcmwpLCB7XG4gICAgYXNwZWN0X3JhdGlvOiB2YWxpZGF0ZWQuYXNwZWN0UmF0aW8sXG4gICAgZW5oYW5jZV9wcm9tcHQ6IHZhbGlkYXRlZC5lbmhhbmNlUHJvbXB0LFxuICAgIGltYWdlX3VybHM6IHZhbGlkYXRlZC5pbWFnZVVybHMsXG4gICAgcHJlc2V0X2lkOiB2YWxpZGF0ZWQucHJlc2V0SWQsXG4gICAgcHJvbXB0OiB2YWxpZGF0ZWQucHJvbXB0LFxuICAgIHF1YWxpdHk6IHZhbGlkYXRlZC5xdWFsaXR5LFxuICAgIHJlc29sdXRpb246IHZhbGlkYXRlZC5yZXNvbHV0aW9uXG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEhpZ2dzZmllbGRSZXF1ZXN0U3RhdHVzID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LCByZXF1ZXN0SWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxIaWdnc2ZpZWxkU3RhdHVzUmVzdWx0PiA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdHVzVXJsID0gdmFsaWRhdGVIaWdnc2ZpZWxkVXJsKGAke0hJR0dTRklFTERfT1JJR0lOfS9yZXF1ZXN0cy8ke3JlcXVlc3RJZH0vc3RhdHVzYCwgcmVxdWVzdElkLCAnc3RhdHVzJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IGdldChzdGF0dXNVcmwsIHt9LCB7Y2FjaGU6IGZhbHNlLCBoZWFkZXJzOiBhdXRoSGVhZGVycygpfSkgYXMgSGlnZ3NmaWVsZFJlc3BvbnNlQm9keTtcblxuICAgIGlmKGRhdGEucmVxdWVzdF9pZCAhPT0gcmVxdWVzdElkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0hpZ2dzZmllbGQgc3RhdHVzIHJlc3BvbnNlIHJldHVybmVkIGFuIHVuZXhwZWN0ZWQgcmVxdWVzdCBpZGVudGlmaWVyLicpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjogZGF0YS5lcnJvcixcbiAgICAgIG1lZGlhVXJsOiBkYXRhLnZpZGVvPy51cmwgfHwgZGF0YS5pbWFnZXM/LlswXT8udXJsLFxuICAgICAgbWVkaWFVcmxzOiBkYXRhLmltYWdlcz8ubWFwKChpbWFnZSkgPT4gaW1hZ2UudXJsKS5maWx0ZXIoKHVybCk6IHVybCBpcyBzdHJpbmcgPT4gQm9vbGVhbih1cmwpKSxcbiAgICAgIHJlcXVlc3RJZCxcbiAgICAgIHN0YXR1czogZGF0YS5zdGF0dXMgfHwgJ3Vua25vd24nXG4gICAgfTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIHJldHVybiBsb2dFcnJvcihcbiAgICAgIHthY3Rpb246ICdnZXRIaWdnc2ZpZWxkUmVxdWVzdFN0YXR1cycsIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LCB2YWx1ZTogRXJyb3JUeXBlcy5FWFRFUk5BTF9BUElfRVJST1J9LCBlcnJvciBhcyBFcnJvciwgY29udGV4dFxuICAgICkgYXMgUHJvbWlzZTxuZXZlcj47XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBjYW5jZWxIaWdnc2ZpZWxkUmVxdWVzdCA9IGFzeW5jIChjb250ZXh0OiBBcGlDb250ZXh0LCByZXF1ZXN0SWQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IGNhbmNlbFVybCA9IHZhbGlkYXRlSGlnZ3NmaWVsZFVybChgJHtISUdHU0ZJRUxEX09SSUdJTn0vcmVxdWVzdHMvJHtyZXF1ZXN0SWR9L2NhbmNlbGAsIHJlcXVlc3RJZCwgJ2NhbmNlbCcpO1xuICAgIGF3YWl0IHBvc3QoY2FuY2VsVXJsLCB7fSwge2NhY2hlOiBmYWxzZSwgaGVhZGVyczogYXV0aEhlYWRlcnMoKX0pO1xuXG4gICAgcmV0dXJuIChhd2FpdCBnZXRIaWdnc2ZpZWxkUmVxdWVzdFN0YXR1cyhjb250ZXh0LCByZXF1ZXN0SWQpKS5zdGF0dXMgPT09ICdjYW5jZWxlZCc7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICByZXR1cm4gbG9nRXJyb3IoXG4gICAgICB7YWN0aW9uOiAnY2FuY2VsSGlnZ3NmaWVsZFJlcXVlc3QnLCBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSwgdmFsdWU6IEVycm9yVHlwZXMuRVhURVJOQUxfQVBJX0VSUk9SfSwgZXJyb3IgYXMgRXJyb3IsIGNvbnRleHRcbiAgICApIGFzIFByb21pc2U8bmV2ZXI+O1xuICB9XG59O1xuIl0sIm5hbWVzIjpbImdldCIsInBvc3QiLCJ2YWxpZGF0ZU1hcmtldGluZ1N0dWRpb0ltYWdlSW5wdXQiLCJ2YWxpZGF0ZVNlZWRhbmNlUmVmZXJlbmNlVmlkZW9JbnB1dCIsInZhbGlkYXRlU2VlZGFuY2VWaWRlb0lucHV0IiwidmFsaWRhdGVTb3VsSW1hZ2VJbnB1dCIsIkNvbmZpZyIsIkVycm9yVHlwZXMiLCJsb2dFcnJvciIsImV2ZW50Q2F0ZWdvcnkiLCJISUdHU0ZJRUxEX09SSUdJTiIsIlNPVUxfSU1BR0VfRU5EUE9JTlQiLCJTRUVEQU5DRV9WSURFT19FTkRQT0lOVCIsIlNFRURBTkNFX1JFRkVSRU5DRV9WSURFT19FTkRQT0lOVCIsIk1BUktFVElOR19TVFVESU9fSU1BR0VfRU5EUE9JTlQiLCJ2YWxpZGF0ZUhpZ2dzZmllbGRVcmwiLCJ2YWx1ZSIsInJlcXVlc3RJZCIsImFjdGlvbiIsInVybCIsIlVSTCIsIm9yaWdpbiIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJwYXRobmFtZSIsInNlYXJjaCIsImhhc2giLCJFcnJvciIsImhyZWYiLCJhdXRoSGVhZGVycyIsImtleUlkIiwia2V5U2VjcmV0IiwiSGVhZGVycyIsIkF1dGhvcml6YXRpb24iLCJ3aXRoV2ViaG9vayIsImVuZHBvaW50Iiwid2ViaG9va1VybCIsImVuY29kZVVSSUNvbXBvbmVudCIsInN1Ym1pdCIsImNvbnRleHQiLCJib2R5IiwiZGF0YSIsImNhY2hlIiwiaGVhZGVycyIsInJlcXVlc3RfaWQiLCJzdGF0dXNfdXJsIiwiY2FuY2VsVXJsIiwiY2FuY2VsX3VybCIsInVuZGVmaW5lZCIsInN0YXR1c1VybCIsImVycm9yIiwiY2F0ZWdvcnkiLCJFWFRFUk5BTF9BUElfRVJST1IiLCJnZW5lcmF0ZVNvdWxJbWFnZSIsImlucHV0IiwidmFsaWRhdGVkIiwiYXNwZWN0X3JhdGlvIiwiYXNwZWN0UmF0aW8iLCJiYXRjaF9zaXplIiwiYmF0Y2hTaXplIiwiZW5oYW5jZV9wcm9tcHQiLCJlbmhhbmNlUHJvbXB0IiwicHJvbXB0IiwicmVzb2x1dGlvbiIsInNlZWQiLCJzdHlsZV9pZCIsInN0eWxlSWQiLCJnZW5lcmF0ZVNlZWRhbmNlVmlkZW8iLCJkdXJhdGlvbiIsImVuZF9pbWFnZV91cmwiLCJlbmRJbWFnZVVybCIsImdlbmVyYXRlX2F1ZGlvIiwiZ2VuZXJhdGVBdWRpbyIsImltYWdlX3VybCIsImltYWdlVXJsIiwib3V0cHV0X2Zvcm1hdCIsIm91dHB1dEZvcm1hdCIsImdlbmVyYXRlU2VlZGFuY2VSZWZlcmVuY2VWaWRlbyIsImF1ZGlvX3VybHMiLCJhdWRpb1VybHMiLCJpbWFnZV91cmxzIiwiaW1hZ2VVcmxzIiwidmlkZW9fdXJscyIsInZpZGVvVXJscyIsImdlbmVyYXRlTWFya2V0aW5nU3R1ZGlvSW1hZ2UiLCJwcmVzZXRfaWQiLCJwcmVzZXRJZCIsInF1YWxpdHkiLCJnZXRIaWdnc2ZpZWxkUmVxdWVzdFN0YXR1cyIsIm1lZGlhVXJsIiwidmlkZW8iLCJpbWFnZXMiLCJtZWRpYVVybHMiLCJtYXAiLCJpbWFnZSIsImZpbHRlciIsIkJvb2xlYW4iLCJzdGF0dXMiLCJjYW5jZWxIaWdnc2ZpZWxkUmVxdWVzdCJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0QsU0FBUUEsR0FBRyxFQUFFQyxJQUFJLFFBQU8sb0JBQW9CO0FBRTVDLFNBQ0VDLGlDQUFpQyxFQUNqQ0MsbUNBQW1DLEVBQ25DQywwQkFBMEIsRUFDMUJDLHNCQUFzQixRQUNqQixtQ0FBbUM7QUFDMUMsU0FBUUMsTUFBTSxRQUFPLGVBQWU7QUFDcEMsU0FBUUMsVUFBVSxRQUFPLDBCQUEwQjtBQUNuRCxTQUFRQyxRQUFRLFFBQU8sNkJBQTZCO0FBVXBELE1BQU1DLGdCQUFnQjtBQUN0QixNQUFNQyxvQkFBb0I7QUFDMUIsTUFBTUMsc0JBQXNCLEdBQUdELGtCQUFrQiwrQkFBK0IsQ0FBQztBQUNqRixNQUFNRSwwQkFBMEIsR0FBR0Ysa0JBQWtCLHNDQUFzQyxDQUFDO0FBQzVGLE1BQU1HLG9DQUFvQyxHQUFHSCxrQkFBa0IsMENBQTBDLENBQUM7QUFDMUcsTUFBTUksa0NBQWtDLEdBQUdKLGtCQUFrQix1QkFBdUIsQ0FBQztBQTJCckYsc0ZBQXNGLEdBQ3RGLE1BQU1LLHdCQUF3QixDQUFDQyxPQUFlQyxXQUFtQkM7SUFDL0QsTUFBTUMsTUFBTSxJQUFJQyxJQUFJSjtJQUVwQixJQUFHRyxJQUFJ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
@@ -0,0 +1,37 @@
1
+ import type { GeminiImageInput } from '../adapters/geminiGenerationAdapter.js';
2
+ import type { MarketingStudioImageInput, SoulImageInput } from '../adapters/higgsfieldAdapter.js';
3
+ import type { OpenAIImageInput } from '../adapters/imageGenerationAdapter.js';
4
+ import type { ApiContext } from '../types/auth.types.js';
5
+ /** Only an explicit provider rejection proves it is safe to release a reservation. */
6
+ export declare class ImageGenerationRejectedError extends Error {
7
+ }
8
+ export type GenerateImageInput = (GeminiImageInput & {
9
+ provider: 'gemini';
10
+ }) | (OpenAIImageInput & {
11
+ provider: 'openai';
12
+ }) | (SoulImageInput & {
13
+ provider: 'higgsfield';
14
+ imageUrls?: undefined;
15
+ }) | (MarketingStudioImageInput & {
16
+ provider: 'higgsfield';
17
+ });
18
+ export interface ImageGenerationResult {
19
+ cancelUrl?: string;
20
+ imageBase64?: string;
21
+ mimeType?: 'image/jpeg' | 'image/png';
22
+ provider: 'gemini' | 'higgsfield' | 'openai';
23
+ requestId: string;
24
+ status: 'queued' | 'completed';
25
+ statusUrl?: string;
26
+ }
27
+ export declare const generateOpenAIImage: (_context: ApiContext, input: OpenAIImageInput, config?: {
28
+ key?: string;
29
+ model?: string;
30
+ }) => Promise<ImageGenerationResult>;
31
+ /** Provider selection is data; credentials and paid-job orchestration stay server-side. */
32
+ export declare const generateImage: (context: ApiContext, input: GenerateImageInput) => Promise<ImageGenerationResult>;
33
+ /** Reuses the Gemini content protocol while preserving the generic image result shape. */
34
+ export declare const generateGeminiImage: (_context: ApiContext, input: GeminiImageInput, config?: {
35
+ key?: string;
36
+ model?: string;
37
+ }) => Promise<ImageGenerationResult>;