@growsober/sdk 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/README.md +276 -0
  2. package/dist/__tests__/e2e.test.d.ts +7 -0
  3. package/dist/__tests__/e2e.test.js +472 -0
  4. package/dist/api/client.d.ts +11 -0
  5. package/dist/api/client.js +61 -0
  6. package/dist/api/mutations/admin.d.ts +167 -0
  7. package/dist/api/mutations/admin.js +326 -0
  8. package/dist/api/mutations/ambassadors.d.ts +52 -0
  9. package/dist/api/mutations/ambassadors.js +148 -0
  10. package/dist/api/mutations/auth.d.ts +267 -0
  11. package/dist/api/mutations/auth.js +332 -0
  12. package/dist/api/mutations/bookings.d.ts +59 -0
  13. package/dist/api/mutations/bookings.js +143 -0
  14. package/dist/api/mutations/event-chat.d.ts +35 -0
  15. package/dist/api/mutations/event-chat.js +147 -0
  16. package/dist/api/mutations/events.d.ts +87 -0
  17. package/dist/api/mutations/events.js +205 -0
  18. package/dist/api/mutations/grow90.d.ts +36 -0
  19. package/dist/api/mutations/grow90.js +132 -0
  20. package/dist/api/mutations/hubs.d.ts +111 -0
  21. package/dist/api/mutations/hubs.js +240 -0
  22. package/dist/api/mutations/index.d.ts +22 -0
  23. package/dist/api/mutations/index.js +39 -0
  24. package/dist/api/mutations/jack.d.ts +61 -0
  25. package/dist/api/mutations/jack.js +104 -0
  26. package/dist/api/mutations/library.d.ts +67 -0
  27. package/dist/api/mutations/library.js +168 -0
  28. package/dist/api/mutations/map.d.ts +153 -0
  29. package/dist/api/mutations/map.js +181 -0
  30. package/dist/api/mutations/matching.d.ts +130 -0
  31. package/dist/api/mutations/matching.js +204 -0
  32. package/dist/api/mutations/notifications.d.ts +63 -0
  33. package/dist/api/mutations/notifications.js +106 -0
  34. package/dist/api/mutations/offers.d.ts +26 -0
  35. package/dist/api/mutations/offers.js +47 -0
  36. package/dist/api/mutations/subscriptions.d.ts +127 -0
  37. package/dist/api/mutations/subscriptions.js +140 -0
  38. package/dist/api/mutations/support.d.ts +165 -0
  39. package/dist/api/mutations/support.js +307 -0
  40. package/dist/api/mutations/users.d.ts +211 -0
  41. package/dist/api/mutations/users.js +261 -0
  42. package/dist/api/queries/admin.d.ts +257 -0
  43. package/dist/api/queries/admin.js +320 -0
  44. package/dist/api/queries/ambassadors.d.ts +53 -0
  45. package/dist/api/queries/ambassadors.js +98 -0
  46. package/dist/api/queries/auth.d.ts +16 -0
  47. package/dist/api/queries/auth.js +25 -0
  48. package/dist/api/queries/bookings.d.ts +91 -0
  49. package/dist/api/queries/bookings.js +102 -0
  50. package/dist/api/queries/businesses.d.ts +212 -0
  51. package/dist/api/queries/businesses.js +154 -0
  52. package/dist/api/queries/event-chat.d.ts +19 -0
  53. package/dist/api/queries/event-chat.js +75 -0
  54. package/dist/api/queries/events.d.ts +322 -0
  55. package/dist/api/queries/events.js +221 -0
  56. package/dist/api/queries/grow90.d.ts +26 -0
  57. package/dist/api/queries/grow90.js +85 -0
  58. package/dist/api/queries/hubs.d.ts +165 -0
  59. package/dist/api/queries/hubs.js +143 -0
  60. package/dist/api/queries/index.d.ts +23 -0
  61. package/dist/api/queries/index.js +40 -0
  62. package/dist/api/queries/jack.d.ts +63 -0
  63. package/dist/api/queries/jack.js +92 -0
  64. package/dist/api/queries/library.d.ts +132 -0
  65. package/dist/api/queries/library.js +120 -0
  66. package/dist/api/queries/map.d.ts +216 -0
  67. package/dist/api/queries/map.js +278 -0
  68. package/dist/api/queries/matching.d.ts +136 -0
  69. package/dist/api/queries/matching.js +161 -0
  70. package/dist/api/queries/notifications.d.ts +78 -0
  71. package/dist/api/queries/notifications.js +88 -0
  72. package/dist/api/queries/offers.d.ts +91 -0
  73. package/dist/api/queries/offers.js +103 -0
  74. package/dist/api/queries/subscriptions.d.ts +56 -0
  75. package/dist/api/queries/subscriptions.js +73 -0
  76. package/dist/api/queries/support.d.ts +106 -0
  77. package/dist/api/queries/support.js +202 -0
  78. package/dist/api/queries/users.d.ts +293 -0
  79. package/dist/api/queries/users.js +370 -0
  80. package/dist/api/types.d.ts +464 -0
  81. package/dist/api/types.js +9 -0
  82. package/dist/hooks/useAuth.d.ts +5 -0
  83. package/dist/hooks/useAuth.js +39 -0
  84. package/dist/hooks/useUser.d.ts +43 -0
  85. package/dist/hooks/useUser.js +44 -0
  86. package/dist/index.d.ts +36 -0
  87. package/dist/index.js +67 -0
  88. package/package.json +62 -0
  89. package/src/__tests__/e2e.test.ts +502 -0
  90. package/src/api/client.ts +71 -0
  91. package/src/api/mutations/admin.ts +531 -0
  92. package/src/api/mutations/ambassadors.ts +185 -0
  93. package/src/api/mutations/auth.ts +350 -0
  94. package/src/api/mutations/bookings.ts +190 -0
  95. package/src/api/mutations/event-chat.ts +177 -0
  96. package/src/api/mutations/events.ts +273 -0
  97. package/src/api/mutations/grow90.ts +169 -0
  98. package/src/api/mutations/hubs.ts +385 -0
  99. package/src/api/mutations/index.ts +23 -0
  100. package/src/api/mutations/jack.ts +130 -0
  101. package/src/api/mutations/library.ts +212 -0
  102. package/src/api/mutations/map.ts +230 -0
  103. package/src/api/mutations/matching.ts +271 -0
  104. package/src/api/mutations/notifications.ts +114 -0
  105. package/src/api/mutations/offers.ts +73 -0
  106. package/src/api/mutations/subscriptions.ts +162 -0
  107. package/src/api/mutations/support.ts +390 -0
  108. package/src/api/mutations/users.ts +271 -0
  109. package/src/api/queries/admin.ts +480 -0
  110. package/src/api/queries/ambassadors.ts +139 -0
  111. package/src/api/queries/auth.ts +24 -0
  112. package/src/api/queries/bookings.ts +135 -0
  113. package/src/api/queries/businesses.ts +203 -0
  114. package/src/api/queries/event-chat.ts +78 -0
  115. package/src/api/queries/events.ts +272 -0
  116. package/src/api/queries/grow90.ts +98 -0
  117. package/src/api/queries/hubs.ts +211 -0
  118. package/src/api/queries/index.ts +24 -0
  119. package/src/api/queries/jack.ts +127 -0
  120. package/src/api/queries/library.ts +166 -0
  121. package/src/api/queries/map.ts +331 -0
  122. package/src/api/queries/matching.ts +238 -0
  123. package/src/api/queries/notifications.ts +103 -0
  124. package/src/api/queries/offers.ts +136 -0
  125. package/src/api/queries/subscriptions.ts +91 -0
  126. package/src/api/queries/support.ts +235 -0
  127. package/src/api/queries/users.ts +393 -0
  128. package/src/api/types.ts +596 -0
  129. package/src/index.ts +57 -0
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.eventChatKeys = void 0;
4
+ exports.useEventChat = useEventChat;
5
+ exports.useEventChatMembers = useEventChatMembers;
6
+ exports.useEventChatMessages = useEventChatMessages;
7
+ const react_query_1 = require("@tanstack/react-query");
8
+ const client_1 = require("../client");
9
+ // ============================================================================
10
+ // QUERY KEYS
11
+ // ============================================================================
12
+ exports.eventChatKeys = {
13
+ all: ['event-chat'],
14
+ chat: (eventId) => [...exports.eventChatKeys.all, 'chat', eventId],
15
+ members: (eventId) => [...exports.eventChatKeys.all, 'members', eventId],
16
+ messages: (eventId) => [...exports.eventChatKeys.all, 'messages', eventId],
17
+ };
18
+ // ============================================================================
19
+ // HOOKS
20
+ // ============================================================================
21
+ /**
22
+ * Get or create chat for an event
23
+ */
24
+ function useEventChat(eventId) {
25
+ return (0, react_query_1.useQuery)({
26
+ queryKey: exports.eventChatKeys.chat(eventId || ''),
27
+ queryFn: async () => {
28
+ if (!eventId)
29
+ throw new Error('Event ID is required');
30
+ const client = (0, client_1.getApiClient)();
31
+ const response = await client.get(`/events/${eventId}/chat`);
32
+ return response.data;
33
+ },
34
+ enabled: !!eventId,
35
+ });
36
+ }
37
+ /**
38
+ * Get chat members
39
+ */
40
+ function useEventChatMembers(eventId) {
41
+ return (0, react_query_1.useQuery)({
42
+ queryKey: exports.eventChatKeys.members(eventId || ''),
43
+ queryFn: async () => {
44
+ if (!eventId)
45
+ throw new Error('Event ID is required');
46
+ const client = (0, client_1.getApiClient)();
47
+ const response = await client.get(`/events/${eventId}/chat/members`);
48
+ return response.data;
49
+ },
50
+ enabled: !!eventId,
51
+ });
52
+ }
53
+ /**
54
+ * Get chat messages with infinite scroll pagination
55
+ */
56
+ function useEventChatMessages(eventId, limit = 50) {
57
+ return (0, react_query_1.useInfiniteQuery)({
58
+ queryKey: exports.eventChatKeys.messages(eventId || ''),
59
+ queryFn: async ({ pageParam }) => {
60
+ if (!eventId)
61
+ throw new Error('Event ID is required');
62
+ const client = (0, client_1.getApiClient)();
63
+ const params = new URLSearchParams({ limit: String(limit) });
64
+ if (pageParam) {
65
+ params.append('cursor', pageParam);
66
+ }
67
+ const response = await client.get(`/events/${eventId}/chat/messages?${params.toString()}`);
68
+ return response.data;
69
+ },
70
+ initialPageParam: undefined,
71
+ getNextPageParam: (lastPage) => lastPage.nextCursor,
72
+ enabled: !!eventId,
73
+ });
74
+ }
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtY2hhdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvcXVlcmllcy9ldmVudC1jaGF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTBCQSxvQ0FXQztBQUtELGtEQVdDO0FBS0Qsb0RBbUJDO0FBN0VELHVEQUFtRTtBQUNuRSxzQ0FBeUM7QUFPekMsK0VBQStFO0FBQy9FLGFBQWE7QUFDYiwrRUFBK0U7QUFFbEUsUUFBQSxhQUFhLEdBQUc7SUFDM0IsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFVO0lBQzVCLElBQUksRUFBRSxDQUFDLE9BQWUsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLHFCQUFhLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQVU7SUFDM0UsT0FBTyxFQUFFLENBQUMsT0FBZSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcscUJBQWEsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVTtJQUNqRixRQUFRLEVBQUUsQ0FBQyxPQUFlLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxxQkFBYSxDQUFDLEdBQUcsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFVO0NBQ3BGLENBQUM7QUFFRiwrRUFBK0U7QUFDL0UsUUFBUTtBQUNSLCtFQUErRTtBQUUvRTs7R0FFRztBQUNILFNBQWdCLFlBQVksQ0FBQyxPQUEyQjtJQUN0RCxPQUFPLElBQUEsc0JBQVEsRUFBQztRQUNkLFFBQVEsRUFBRSxxQkFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO1FBQzNDLE9BQU8sRUFBRSxLQUFLLElBQUksRUFBRTtZQUNsQixJQUFJLENBQUMsT0FBTztnQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFDdEQsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQkFBWSxHQUFFLENBQUM7WUFDOUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsR0FBRyxDQUFvQixXQUFXLE9BQU8sT0FBTyxDQUFDLENBQUM7WUFDaEYsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU87S0FDbkIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQUMsT0FBMkI7SUFDN0QsT0FBTyxJQUFBLHNCQUFRLEVBQUM7UUFDZCxRQUFRLEVBQUUscUJBQWEsQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUM5QyxPQUFPLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDbEIsSUFBSSxDQUFDLE9BQU87Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQ3RELE1BQU0sTUFBTSxHQUFHLElBQUEscUJBQVksR0FBRSxDQUFDO1lBQzlCLE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FBdUIsV0FBVyxPQUFPLGVBQWUsQ0FBQyxDQUFDO1lBQzNGLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQztRQUN2QixDQUFDO1FBQ0QsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPO0tBQ25CLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLG9CQUFvQixDQUFDLE9BQTJCLEVBQUUsS0FBSyxHQUFHLEVBQUU7SUFDMUUsT0FBTyxJQUFBLDhCQUFnQixFQUFDO1FBQ3RCLFFBQVEsRUFBRSxxQkFBYSxDQUFDLFFBQVEsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO1FBQy9DLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO1lBQy9CLElBQUksQ0FBQyxPQUFPO2dCQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztZQUN0RCxNQUFNLE1BQU0sR0FBRyxJQUFBLHFCQUFZLEdBQUUsQ0FBQztZQUM5QixNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzdELElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ2QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDckMsQ0FBQztZQUNELE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FDL0IsV0FBVyxPQUFPLGtCQUFrQixNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FDeEQsQ0FBQztZQUNGLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQztRQUN2QixDQUFDO1FBQ0QsZ0JBQWdCLEVBQUUsU0FBK0I7UUFDakQsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVO1FBQ25ELE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTztLQUNuQixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXNlUXVlcnksIHVzZUluZmluaXRlUXVlcnkgfSBmcm9tICdAdGFuc3RhY2svcmVhY3QtcXVlcnknO1xuaW1wb3J0IHsgZ2V0QXBpQ2xpZW50IH0gZnJvbSAnLi4vY2xpZW50JztcbmltcG9ydCB0eXBlIHtcbiAgRXZlbnRDaGF0UmVzcG9uc2UsXG4gIENoYXRNZW1iZXJSZXNwb25zZSxcbiAgUGFnaW5hdGVkTWVzc2FnZXNSZXNwb25zZSxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBRVUVSWSBLRVlTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBjb25zdCBldmVudENoYXRLZXlzID0ge1xuICBhbGw6IFsnZXZlbnQtY2hhdCddIGFzIGNvbnN0LFxuICBjaGF0OiAoZXZlbnRJZDogc3RyaW5nKSA9PiBbLi4uZXZlbnRDaGF0S2V5cy5hbGwsICdjaGF0JywgZXZlbnRJZF0gYXMgY29uc3QsXG4gIG1lbWJlcnM6IChldmVudElkOiBzdHJpbmcpID0+IFsuLi5ldmVudENoYXRLZXlzLmFsbCwgJ21lbWJlcnMnLCBldmVudElkXSBhcyBjb25zdCxcbiAgbWVzc2FnZXM6IChldmVudElkOiBzdHJpbmcpID0+IFsuLi5ldmVudENoYXRLZXlzLmFsbCwgJ21lc3NhZ2VzJywgZXZlbnRJZF0gYXMgY29uc3QsXG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBIT09LU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEdldCBvciBjcmVhdGUgY2hhdCBmb3IgYW4gZXZlbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUV2ZW50Q2hhdChldmVudElkOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICBxdWVyeUtleTogZXZlbnRDaGF0S2V5cy5jaGF0KGV2ZW50SWQgfHwgJycpLFxuICAgIHF1ZXJ5Rm46IGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghZXZlbnRJZCkgdGhyb3cgbmV3IEVycm9yKCdFdmVudCBJRCBpcyByZXF1aXJlZCcpO1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQ8RXZlbnRDaGF0UmVzcG9uc2U+KGAvZXZlbnRzLyR7ZXZlbnRJZH0vY2hhdGApO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gICAgfSxcbiAgICBlbmFibGVkOiAhIWV2ZW50SWQsXG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCBjaGF0IG1lbWJlcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUV2ZW50Q2hhdE1lbWJlcnMoZXZlbnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IGV2ZW50Q2hhdEtleXMubWVtYmVycyhldmVudElkIHx8ICcnKSxcbiAgICBxdWVyeUZuOiBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIWV2ZW50SWQpIHRocm93IG5ldyBFcnJvcignRXZlbnQgSUQgaXMgcmVxdWlyZWQnKTtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0PENoYXRNZW1iZXJSZXNwb25zZVtdPihgL2V2ZW50cy8ke2V2ZW50SWR9L2NoYXQvbWVtYmVyc2ApO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gICAgfSxcbiAgICBlbmFibGVkOiAhIWV2ZW50SWQsXG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCBjaGF0IG1lc3NhZ2VzIHdpdGggaW5maW5pdGUgc2Nyb2xsIHBhZ2luYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUV2ZW50Q2hhdE1lc3NhZ2VzKGV2ZW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgbGltaXQgPSA1MCkge1xuICByZXR1cm4gdXNlSW5maW5pdGVRdWVyeSh7XG4gICAgcXVlcnlLZXk6IGV2ZW50Q2hhdEtleXMubWVzc2FnZXMoZXZlbnRJZCB8fCAnJyksXG4gICAgcXVlcnlGbjogYXN5bmMgKHsgcGFnZVBhcmFtIH0pID0+IHtcbiAgICAgIGlmICghZXZlbnRJZCkgdGhyb3cgbmV3IEVycm9yKCdFdmVudCBJRCBpcyByZXF1aXJlZCcpO1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHsgbGltaXQ6IFN0cmluZyhsaW1pdCkgfSk7XG4gICAgICBpZiAocGFnZVBhcmFtKSB7XG4gICAgICAgIHBhcmFtcy5hcHBlbmQoJ2N1cnNvcicsIHBhZ2VQYXJhbSk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQ8UGFnaW5hdGVkTWVzc2FnZXNSZXNwb25zZT4oXG4gICAgICAgIGAvZXZlbnRzLyR7ZXZlbnRJZH0vY2hhdC9tZXNzYWdlcz8ke3BhcmFtcy50b1N0cmluZygpfWBcbiAgICAgICk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICB9LFxuICAgIGluaXRpYWxQYWdlUGFyYW06IHVuZGVmaW5lZCBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgZ2V0TmV4dFBhZ2VQYXJhbTogKGxhc3RQYWdlKSA9PiBsYXN0UGFnZS5uZXh0Q3Vyc29yLFxuICAgIGVuYWJsZWQ6ICEhZXZlbnRJZCxcbiAgfSk7XG59XG4iXX0=
@@ -0,0 +1,322 @@
1
+ import { UseQueryOptions } from '@tanstack/react-query';
2
+ import type { EventResponse } from '../types';
3
+ export declare const eventKeys: {
4
+ all: readonly ["events"];
5
+ lists: () => readonly ["events", "list"];
6
+ list: (filters?: EventFilters) => readonly ["events", "list", EventFilters | undefined];
7
+ details: () => readonly ["events", "detail"];
8
+ detail: (id: string) => readonly ["events", "detail", string];
9
+ detailBySlug: (slug: string) => readonly ["events", "detail", "slug", string];
10
+ upcoming: (limit?: number) => readonly ["events", "upcoming", number | undefined];
11
+ featured: (limit?: number) => readonly ["events", "featured", number | undefined];
12
+ ambient: (filters?: AmbientEventFilters) => readonly ["events", "ambient", AmbientEventFilters | undefined];
13
+ bookings: (eventId: string) => readonly ["events", "detail", string, "bookings"];
14
+ };
15
+ export interface EventFilters {
16
+ page?: number;
17
+ limit?: number;
18
+ hubId?: string;
19
+ cityId?: string;
20
+ eventType?: string;
21
+ status?: 'DRAFT' | 'PUBLISHED' | 'CANCELLED';
22
+ startAfter?: string;
23
+ startBefore?: string;
24
+ isFeatured?: boolean;
25
+ isAmbient?: boolean;
26
+ }
27
+ export interface AmbientEventFilters {
28
+ limit?: number;
29
+ cityId?: string;
30
+ }
31
+ export interface PaginatedEventsResponse {
32
+ events: EventResponse[];
33
+ total: number;
34
+ page: number;
35
+ limit: number;
36
+ totalPages: number;
37
+ }
38
+ /**
39
+ * Get paginated list of events with optional filters
40
+ *
41
+ * @param filters - Query parameters for filtering and pagination
42
+ * @param options - TanStack Query options
43
+ *
44
+ * @example
45
+ * ```tsx
46
+ * const { data, isLoading } = useEvents({
47
+ * page: 1,
48
+ * limit: 20,
49
+ * hubId: 'hub-123',
50
+ * isFeatured: true
51
+ * });
52
+ * ```
53
+ */
54
+ export declare function useEvents(filters?: EventFilters, options?: Omit<UseQueryOptions<PaginatedEventsResponse>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<PaginatedEventsResponse, Error>;
55
+ /**
56
+ * Get a single event by ID
57
+ *
58
+ * @param id - Event ID
59
+ * @param options - TanStack Query options
60
+ *
61
+ * @example
62
+ * ```tsx
63
+ * const { data, isLoading } = useEvent('event-123');
64
+ * ```
65
+ */
66
+ export declare function useEvent(id: string, options?: Omit<UseQueryOptions<EventResponse>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<{
67
+ id: string;
68
+ title: string;
69
+ slug?: Record<string, never>;
70
+ description?: Record<string, never>;
71
+ bannerImage?: Record<string, never>;
72
+ startDate: string;
73
+ endDate?: Record<string, never>;
74
+ timezone?: Record<string, never>;
75
+ isRecurring: boolean;
76
+ recurrenceRule?: Record<string, never>;
77
+ locationName?: Record<string, never>;
78
+ locationAddress?: Record<string, never>;
79
+ locationLat?: Record<string, never>;
80
+ locationLong?: Record<string, never>;
81
+ cityId?: Record<string, never>;
82
+ isOnline: boolean;
83
+ onlineUrl?: Record<string, never>;
84
+ totalSpots: number;
85
+ availableSpots: number;
86
+ isFree: boolean;
87
+ price?: Record<string, never>;
88
+ currency: string;
89
+ hubId?: Record<string, never>;
90
+ visibility: "PUBLIC" | "MEMBERS_ONLY" | "INVITE_ONLY";
91
+ requiresApproval: boolean;
92
+ allowWaitlist: boolean;
93
+ whatsappGroup?: Record<string, never>;
94
+ externalUrl?: Record<string, never>;
95
+ status: "DRAFT" | "PUBLISHED" | "CANCELLED" | "COMPLETED";
96
+ isFeatured: boolean;
97
+ isCancelled: boolean;
98
+ isAmbient: boolean;
99
+ ambientCategory?: Record<string, never>;
100
+ bookingCount: number;
101
+ checkinCount: number;
102
+ createdAt: string;
103
+ publishedAt?: Record<string, never>;
104
+ }, Error>;
105
+ /**
106
+ * Get a single event by slug
107
+ *
108
+ * @param slug - Event slug
109
+ * @param options - TanStack Query options
110
+ *
111
+ * @example
112
+ * ```tsx
113
+ * const { data, isLoading } = useEventBySlug('yoga-in-the-park');
114
+ * ```
115
+ */
116
+ export declare function useEventBySlug(slug: string, options?: Omit<UseQueryOptions<EventResponse>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<{
117
+ id: string;
118
+ title: string;
119
+ slug?: Record<string, never>;
120
+ description?: Record<string, never>;
121
+ bannerImage?: Record<string, never>;
122
+ startDate: string;
123
+ endDate?: Record<string, never>;
124
+ timezone?: Record<string, never>;
125
+ isRecurring: boolean;
126
+ recurrenceRule?: Record<string, never>;
127
+ locationName?: Record<string, never>;
128
+ locationAddress?: Record<string, never>;
129
+ locationLat?: Record<string, never>;
130
+ locationLong?: Record<string, never>;
131
+ cityId?: Record<string, never>;
132
+ isOnline: boolean;
133
+ onlineUrl?: Record<string, never>;
134
+ totalSpots: number;
135
+ availableSpots: number;
136
+ isFree: boolean;
137
+ price?: Record<string, never>;
138
+ currency: string;
139
+ hubId?: Record<string, never>;
140
+ visibility: "PUBLIC" | "MEMBERS_ONLY" | "INVITE_ONLY";
141
+ requiresApproval: boolean;
142
+ allowWaitlist: boolean;
143
+ whatsappGroup?: Record<string, never>;
144
+ externalUrl?: Record<string, never>;
145
+ status: "DRAFT" | "PUBLISHED" | "CANCELLED" | "COMPLETED";
146
+ isFeatured: boolean;
147
+ isCancelled: boolean;
148
+ isAmbient: boolean;
149
+ ambientCategory?: Record<string, never>;
150
+ bookingCount: number;
151
+ checkinCount: number;
152
+ createdAt: string;
153
+ publishedAt?: Record<string, never>;
154
+ }, Error>;
155
+ /**
156
+ * Get upcoming events
157
+ *
158
+ * @param limit - Maximum number of events to return (default: 10)
159
+ * @param options - TanStack Query options
160
+ *
161
+ * @example
162
+ * ```tsx
163
+ * const { data, isLoading } = useUpcomingEvents(20);
164
+ * ```
165
+ */
166
+ export declare function useUpcomingEvents(limit?: number, options?: Omit<UseQueryOptions<EventResponse[]>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<{
167
+ id: string;
168
+ title: string;
169
+ slug?: Record<string, never>;
170
+ description?: Record<string, never>;
171
+ bannerImage?: Record<string, never>;
172
+ startDate: string;
173
+ endDate?: Record<string, never>;
174
+ timezone?: Record<string, never>;
175
+ isRecurring: boolean;
176
+ recurrenceRule?: Record<string, never>;
177
+ locationName?: Record<string, never>;
178
+ locationAddress?: Record<string, never>;
179
+ locationLat?: Record<string, never>;
180
+ locationLong?: Record<string, never>;
181
+ cityId?: Record<string, never>;
182
+ isOnline: boolean;
183
+ onlineUrl?: Record<string, never>;
184
+ totalSpots: number;
185
+ availableSpots: number;
186
+ isFree: boolean;
187
+ price?: Record<string, never>;
188
+ currency: string;
189
+ hubId?: Record<string, never>;
190
+ visibility: "PUBLIC" | "MEMBERS_ONLY" | "INVITE_ONLY";
191
+ requiresApproval: boolean;
192
+ allowWaitlist: boolean;
193
+ whatsappGroup?: Record<string, never>;
194
+ externalUrl?: Record<string, never>;
195
+ status: "DRAFT" | "PUBLISHED" | "CANCELLED" | "COMPLETED";
196
+ isFeatured: boolean;
197
+ isCancelled: boolean;
198
+ isAmbient: boolean;
199
+ ambientCategory?: Record<string, never>;
200
+ bookingCount: number;
201
+ checkinCount: number;
202
+ createdAt: string;
203
+ publishedAt?: Record<string, never>;
204
+ }[], Error>;
205
+ /**
206
+ * Get featured events
207
+ *
208
+ * Note: This uses the main events endpoint with isFeatured filter
209
+ *
210
+ * @param limit - Maximum number of events to return (default: 10)
211
+ * @param options - TanStack Query options
212
+ *
213
+ * @example
214
+ * ```tsx
215
+ * const { data, isLoading } = useFeaturedEvents(5);
216
+ * ```
217
+ */
218
+ export declare function useFeaturedEvents(limit?: number, options?: Omit<UseQueryOptions<EventResponse[]>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<{
219
+ id: string;
220
+ title: string;
221
+ slug?: Record<string, never>;
222
+ description?: Record<string, never>;
223
+ bannerImage?: Record<string, never>;
224
+ startDate: string;
225
+ endDate?: Record<string, never>;
226
+ timezone?: Record<string, never>;
227
+ isRecurring: boolean;
228
+ recurrenceRule?: Record<string, never>;
229
+ locationName?: Record<string, never>;
230
+ locationAddress?: Record<string, never>;
231
+ locationLat?: Record<string, never>;
232
+ locationLong?: Record<string, never>;
233
+ cityId?: Record<string, never>;
234
+ isOnline: boolean;
235
+ onlineUrl?: Record<string, never>;
236
+ totalSpots: number;
237
+ availableSpots: number;
238
+ isFree: boolean;
239
+ price?: Record<string, never>;
240
+ currency: string;
241
+ hubId?: Record<string, never>;
242
+ visibility: "PUBLIC" | "MEMBERS_ONLY" | "INVITE_ONLY";
243
+ requiresApproval: boolean;
244
+ allowWaitlist: boolean;
245
+ whatsappGroup?: Record<string, never>;
246
+ externalUrl?: Record<string, never>;
247
+ status: "DRAFT" | "PUBLISHED" | "CANCELLED" | "COMPLETED";
248
+ isFeatured: boolean;
249
+ isCancelled: boolean;
250
+ isAmbient: boolean;
251
+ ambientCategory?: Record<string, never>;
252
+ bookingCount: number;
253
+ checkinCount: number;
254
+ createdAt: string;
255
+ publishedAt?: Record<string, never>;
256
+ }[], Error>;
257
+ /**
258
+ * Get ambient events (auto-generated social activities)
259
+ *
260
+ * @param filters - Optional filters (limit, cityId)
261
+ * @param options - TanStack Query options
262
+ *
263
+ * @example
264
+ * ```tsx
265
+ * const { data, isLoading } = useAmbientEvents({ limit: 10 });
266
+ * ```
267
+ */
268
+ export declare function useAmbientEvents(filters?: AmbientEventFilters, options?: Omit<UseQueryOptions<EventResponse[]>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<{
269
+ id: string;
270
+ title: string;
271
+ slug?: Record<string, never>;
272
+ description?: Record<string, never>;
273
+ bannerImage?: Record<string, never>;
274
+ startDate: string;
275
+ endDate?: Record<string, never>;
276
+ timezone?: Record<string, never>;
277
+ isRecurring: boolean;
278
+ recurrenceRule?: Record<string, never>;
279
+ locationName?: Record<string, never>;
280
+ locationAddress?: Record<string, never>;
281
+ locationLat?: Record<string, never>;
282
+ locationLong?: Record<string, never>;
283
+ cityId?: Record<string, never>;
284
+ isOnline: boolean;
285
+ onlineUrl?: Record<string, never>;
286
+ totalSpots: number;
287
+ availableSpots: number;
288
+ isFree: boolean;
289
+ price?: Record<string, never>;
290
+ currency: string;
291
+ hubId?: Record<string, never>;
292
+ visibility: "PUBLIC" | "MEMBERS_ONLY" | "INVITE_ONLY";
293
+ requiresApproval: boolean;
294
+ allowWaitlist: boolean;
295
+ whatsappGroup?: Record<string, never>;
296
+ externalUrl?: Record<string, never>;
297
+ status: "DRAFT" | "PUBLISHED" | "CANCELLED" | "COMPLETED";
298
+ isFeatured: boolean;
299
+ isCancelled: boolean;
300
+ isAmbient: boolean;
301
+ ambientCategory?: Record<string, never>;
302
+ bookingCount: number;
303
+ checkinCount: number;
304
+ createdAt: string;
305
+ publishedAt?: Record<string, never>;
306
+ }[], Error>;
307
+ /**
308
+ * Get bookings for a specific event
309
+ *
310
+ * Note: This endpoint may not be available in the current API.
311
+ * Consider using admin endpoints or user bookings endpoints instead.
312
+ * This hook is provided for future compatibility.
313
+ *
314
+ * @param eventId - Event ID
315
+ * @param options - TanStack Query options
316
+ *
317
+ * @example
318
+ * ```tsx
319
+ * const { data, isLoading } = useEventBookings('event-123');
320
+ * ```
321
+ */
322
+ export declare function useEventBookings(eventId: string, options?: Omit<UseQueryOptions<any[]>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<any[], Error>;
@@ -0,0 +1,221 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.eventKeys = void 0;
4
+ exports.useEvents = useEvents;
5
+ exports.useEvent = useEvent;
6
+ exports.useEventBySlug = useEventBySlug;
7
+ exports.useUpcomingEvents = useUpcomingEvents;
8
+ exports.useFeaturedEvents = useFeaturedEvents;
9
+ exports.useAmbientEvents = useAmbientEvents;
10
+ exports.useEventBookings = useEventBookings;
11
+ const react_query_1 = require("@tanstack/react-query");
12
+ const client_1 = require("../client");
13
+ // ============================================================================
14
+ // QUERY KEY FACTORY
15
+ // ============================================================================
16
+ exports.eventKeys = {
17
+ all: ['events'],
18
+ lists: () => [...exports.eventKeys.all, 'list'],
19
+ list: (filters) => [...exports.eventKeys.lists(), filters],
20
+ details: () => [...exports.eventKeys.all, 'detail'],
21
+ detail: (id) => [...exports.eventKeys.details(), id],
22
+ detailBySlug: (slug) => [...exports.eventKeys.details(), 'slug', slug],
23
+ upcoming: (limit) => [...exports.eventKeys.all, 'upcoming', limit],
24
+ featured: (limit) => [...exports.eventKeys.all, 'featured', limit],
25
+ ambient: (filters) => [...exports.eventKeys.all, 'ambient', filters],
26
+ bookings: (eventId) => [...exports.eventKeys.detail(eventId), 'bookings'],
27
+ };
28
+ // ============================================================================
29
+ // QUERY HOOKS
30
+ // ============================================================================
31
+ /**
32
+ * Get paginated list of events with optional filters
33
+ *
34
+ * @param filters - Query parameters for filtering and pagination
35
+ * @param options - TanStack Query options
36
+ *
37
+ * @example
38
+ * ```tsx
39
+ * const { data, isLoading } = useEvents({
40
+ * page: 1,
41
+ * limit: 20,
42
+ * hubId: 'hub-123',
43
+ * isFeatured: true
44
+ * });
45
+ * ```
46
+ */
47
+ function useEvents(filters, options) {
48
+ return (0, react_query_1.useQuery)({
49
+ queryKey: exports.eventKeys.list(filters),
50
+ queryFn: async () => {
51
+ const client = (0, client_1.getApiClient)();
52
+ const response = await client.get('/api/v1/events', {
53
+ params: filters,
54
+ });
55
+ return response.data;
56
+ },
57
+ ...options,
58
+ });
59
+ }
60
+ /**
61
+ * Get a single event by ID
62
+ *
63
+ * @param id - Event ID
64
+ * @param options - TanStack Query options
65
+ *
66
+ * @example
67
+ * ```tsx
68
+ * const { data, isLoading } = useEvent('event-123');
69
+ * ```
70
+ */
71
+ function useEvent(id, options) {
72
+ return (0, react_query_1.useQuery)({
73
+ queryKey: exports.eventKeys.detail(id),
74
+ queryFn: async () => {
75
+ const client = (0, client_1.getApiClient)();
76
+ const response = await client.get(`/api/v1/events/${id}`);
77
+ return response.data;
78
+ },
79
+ enabled: !!id,
80
+ ...options,
81
+ });
82
+ }
83
+ /**
84
+ * Get a single event by slug
85
+ *
86
+ * @param slug - Event slug
87
+ * @param options - TanStack Query options
88
+ *
89
+ * @example
90
+ * ```tsx
91
+ * const { data, isLoading } = useEventBySlug('yoga-in-the-park');
92
+ * ```
93
+ */
94
+ function useEventBySlug(slug, options) {
95
+ return (0, react_query_1.useQuery)({
96
+ queryKey: exports.eventKeys.detailBySlug(slug),
97
+ queryFn: async () => {
98
+ const client = (0, client_1.getApiClient)();
99
+ const response = await client.get(`/api/v1/events/slug/${slug}`);
100
+ return response.data;
101
+ },
102
+ enabled: !!slug,
103
+ ...options,
104
+ });
105
+ }
106
+ /**
107
+ * Get upcoming events
108
+ *
109
+ * @param limit - Maximum number of events to return (default: 10)
110
+ * @param options - TanStack Query options
111
+ *
112
+ * @example
113
+ * ```tsx
114
+ * const { data, isLoading } = useUpcomingEvents(20);
115
+ * ```
116
+ */
117
+ function useUpcomingEvents(limit, options) {
118
+ return (0, react_query_1.useQuery)({
119
+ queryKey: exports.eventKeys.upcoming(limit),
120
+ queryFn: async () => {
121
+ const client = (0, client_1.getApiClient)();
122
+ const response = await client.get('/api/v1/events/upcoming', {
123
+ params: { limit },
124
+ });
125
+ return response.data;
126
+ },
127
+ ...options,
128
+ });
129
+ }
130
+ /**
131
+ * Get featured events
132
+ *
133
+ * Note: This uses the main events endpoint with isFeatured filter
134
+ *
135
+ * @param limit - Maximum number of events to return (default: 10)
136
+ * @param options - TanStack Query options
137
+ *
138
+ * @example
139
+ * ```tsx
140
+ * const { data, isLoading } = useFeaturedEvents(5);
141
+ * ```
142
+ */
143
+ function useFeaturedEvents(limit = 10, options) {
144
+ return (0, react_query_1.useQuery)({
145
+ queryKey: exports.eventKeys.featured(limit),
146
+ queryFn: async () => {
147
+ const client = (0, client_1.getApiClient)();
148
+ const response = await client.get('/api/v1/events', {
149
+ params: {
150
+ isFeatured: true,
151
+ limit,
152
+ page: 1,
153
+ },
154
+ });
155
+ return response.data.events || response.data;
156
+ },
157
+ ...options,
158
+ });
159
+ }
160
+ /**
161
+ * Get ambient events (auto-generated social activities)
162
+ *
163
+ * @param filters - Optional filters (limit, cityId)
164
+ * @param options - TanStack Query options
165
+ *
166
+ * @example
167
+ * ```tsx
168
+ * const { data, isLoading } = useAmbientEvents({ limit: 10 });
169
+ * ```
170
+ */
171
+ function useAmbientEvents(filters, options) {
172
+ return (0, react_query_1.useQuery)({
173
+ queryKey: exports.eventKeys.ambient(filters),
174
+ queryFn: async () => {
175
+ const client = (0, client_1.getApiClient)();
176
+ const response = await client.get('/api/v1/events', {
177
+ params: {
178
+ isAmbient: true,
179
+ limit: filters?.limit || 20,
180
+ cityId: filters?.cityId,
181
+ startFrom: new Date().toISOString(),
182
+ sortBy: 'startDate',
183
+ sortOrder: 'asc',
184
+ },
185
+ });
186
+ // API returns { data: { events: [...], meta: {...} }, meta: {...} }
187
+ return response.data.data?.events || response.data.events || response.data;
188
+ },
189
+ ...options,
190
+ });
191
+ }
192
+ /**
193
+ * Get bookings for a specific event
194
+ *
195
+ * Note: This endpoint may not be available in the current API.
196
+ * Consider using admin endpoints or user bookings endpoints instead.
197
+ * This hook is provided for future compatibility.
198
+ *
199
+ * @param eventId - Event ID
200
+ * @param options - TanStack Query options
201
+ *
202
+ * @example
203
+ * ```tsx
204
+ * const { data, isLoading } = useEventBookings('event-123');
205
+ * ```
206
+ */
207
+ function useEventBookings(eventId, options) {
208
+ return (0, react_query_1.useQuery)({
209
+ queryKey: exports.eventKeys.bookings(eventId),
210
+ queryFn: async () => {
211
+ const client = (0, client_1.getApiClient)();
212
+ // Note: This endpoint may not exist in the current API
213
+ // Adjust the path based on your actual API implementation
214
+ const response = await client.get(`/api/v1/events/${eventId}/bookings`);
215
+ return response.data;
216
+ },
217
+ enabled: !!eventId,
218
+ ...options,
219
+ });
220
+ }
221
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaS9xdWVyaWVzL2V2ZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF1RUEsOEJBZUM7QUFhRCw0QkFjQztBQWFELHdDQWNDO0FBYUQsOENBZUM7QUFlRCw4Q0FtQkM7QUFhRCw0Q0F1QkM7QUFpQkQsNENBZ0JDO0FBL1FELHVEQUFrRTtBQUNsRSxzQ0FBeUM7QUFHekMsK0VBQStFO0FBQy9FLG9CQUFvQjtBQUNwQiwrRUFBK0U7QUFFbEUsUUFBQSxTQUFTLEdBQUc7SUFDdkIsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFVO0lBQ3hCLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsaUJBQVMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFVO0lBQ2hELElBQUksRUFBRSxDQUFDLE9BQXNCLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxpQkFBUyxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sQ0FBVTtJQUMxRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLGlCQUFTLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBVTtJQUNwRCxNQUFNLEVBQUUsQ0FBQyxFQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxpQkFBUyxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBVTtJQUM3RCxZQUFZLEVBQUUsQ0FBQyxJQUFZLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxpQkFBUyxDQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQVU7SUFDL0UsUUFBUSxFQUFFLENBQUMsS0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsaUJBQVMsQ0FBQyxHQUFHLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBVTtJQUM1RSxRQUFRLEVBQUUsQ0FBQyxLQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxpQkFBUyxDQUFDLEdBQUcsRUFB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QUFFLENBQUMsV0FBVyxFQUFFO29CQUNuQyxNQUFNLEVBQUUsV0FBVztvQkFDbkIsU0FBUyxFQUFFLEtBQUs7aUJBQ2pCO2FBQ0YsQ0FBQyxDQUFDO1lBQ0gsb0VBQW9FO1lBQ3BFLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDN0UsQ0FBQztRQUNELEdBQUcsT0FBTztLQUNYLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILFNBQWdCLGdCQUFnQixDQUM5QixPQUFlLEVBQ2YsT0FBOEQ7SUFFOUQsT0FBTyxJQUFBLHNCQUFRLEVBQUM7UUFDZCxRQUFRLEVBQUUsaUJBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1FBQ3JDLE9BQU8sRUFBRSxLQUFLLElBQW9CLEVBQUU7WUFDbEMsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQkFBWSxHQUFFLENBQUM7WUFDOUIsdURBQXVEO1lBQ3ZELDBEQUEwRDtZQUMxRCxNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLE9BQU8sV0FBVyxDQUFDLENBQUM7WUFDeEUsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU87UUFDbEIsR0FBRyxPQUFPO0tBQ1gsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVzZVF1ZXJ5LCBVc2VRdWVyeU9wdGlvbnMgfSBmcm9tICdAdGFuc3RhY2svcmVhY3QtcXVlcnknO1xuaW1wb3J0IHsgZ2V0QXBpQ2xpZW50IH0gZnJvbSAnLi4vY2xpZW50JztcbmltcG9ydCB0eXBlIHsgRXZlbnRSZXNwb25zZSB9IGZyb20gJy4uL3R5cGVzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUVVFUlkgS0VZIEZBQ1RPUllcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNvbnN0IGV2ZW50S2V5cyA9IHtcbiAgYWxsOiBbJ2V2ZW50cyddIGFzIGNvbnN0LFxuICBsaXN0czogKCkgPT4gWy4uLmV2ZW50S2V5cy5hbGwsICdsaXN0J10gYXMgY29uc3QsXG4gIGxpc3Q6IChmaWx0ZXJzPzogRXZlbnRGaWx0ZXJzKSA9PiBbLi4uZXZlbnRLZXlzLmxpc3RzKCksIGZpbHRlcnNdIGFzIGNvbnN0LFxuICBkZXRhaWxzOiAoKSA9PiBbLi4uZXZlbnRLZXlzLmFsbCwgJ2RldGFpbCddIGFzIGNvbnN0LFxuICBkZXRhaWw6IChpZDogc3RyaW5nKSA9PiBbLi4uZXZlbnRLZXlzLmRldGFpbHMoKSwgaWRdIGFzIGNvbnN0LFxuICBkZXRhaWxCeVNsdWc6IChzbHVnOiBzdHJpbmcpID0+IFsuLi5ldmVudEtleXMuZGV0YWlscygpLCAnc2x1ZycsIHNsdWddIGFzIGNvbnN0LFxuICB1cGNvbWluZzogKGxpbWl0PzogbnVtYmVyKSA9PiBbLi4uZXZlbnRLZXlzLmFsbCwgJ3VwY29taW5nJywgbGltaXRdIGFzIGNvbnN0LFxuICBmZWF0dXJlZDogKGxpbWl0PzogbnVtYmVyKSA9PiBbLi4uZXZlbnRLZXlzLmFsbCwgJ2ZlYXR1cmVkJywgbGltaXRdIGFzIGNvbnN0LFxuICBhbWJpZW50OiAoZmlsdGVycz86IEFtYmllbnRFdmVudEZpbHRlcnMpID0+IFsuLi5ldmVudEtleXMuYWxsLCAnYW1iaWVudCcsIGZpbHRlcnNdIGFzIGNvbnN0LFxuICBib29raW5nczogKGV2ZW50SWQ6IHN0cmluZykgPT4gWy4uLmV2ZW50S2V5cy5kZXRhaWwoZXZlbnRJZCksICdib29raW5ncyddIGFzIGNvbnN0LFxufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVFlQRVNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBFdmVudEZpbHRlcnMge1xuICBwYWdlPzogbnVtYmVyO1xuICBsaW1pdD86IG51bWJlcjtcbiAgaHViSWQ/OiBzdHJpbmc7XG4gIGNpdHlJZD86IHN0cmluZztcbiAgZXZlbnRUeXBlPzogc3RyaW5nO1xuICBzdGF0dXM/OiAnRFJBRlQnIHwgJ1BVQkxJU0hFRCcgfCAnQ0FOQ0VMTEVEJztcbiAgc3RhcnRBZnRlcj86IHN0cmluZztcbiAgc3RhcnRCZWZvcmU/OiBzdHJpbmc7XG4gIGlzRmVhdHVyZWQ/OiBib29sZWFuO1xuICBpc0FtYmllbnQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFtYmllbnRFdmVudEZpbHRlcnMge1xuICBsaW1pdD86IG51bWJlcjtcbiAgY2l0eUlkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2luYXRlZEV2ZW50c1Jlc3BvbnNlIHtcbiAgZXZlbnRzOiBFdmVudFJlc3BvbnNlW107XG4gIHRvdGFsOiBudW1iZXI7XG4gIHBhZ2U6IG51bWJlcjtcbiAgbGltaXQ6IG51bWJlcjtcbiAgdG90YWxQYWdlczogbnVtYmVyO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBRVUVSWSBIT09LU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEdldCBwYWdpbmF0ZWQgbGlzdCBvZiBldmVudHMgd2l0aCBvcHRpb25hbCBmaWx0ZXJzXG4gKlxuICogQHBhcmFtIGZpbHRlcnMgLSBRdWVyeSBwYXJhbWV0ZXJzIGZvciBmaWx0ZXJpbmcgYW5kIHBhZ2luYXRpb25cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGFuU3RhY2sgUXVlcnkgb3B0aW9uc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgZGF0YSwgaXNMb2FkaW5nIH0gPSB1c2VFdmVudHMoe1xuICogICBwYWdlOiAxLFxuICogICBsaW1pdDogMjAsXG4gKiAgIGh1YklkOiAnaHViLTEyMycsXG4gKiAgIGlzRmVhdHVyZWQ6IHRydWVcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VFdmVudHMoXG4gIGZpbHRlcnM/OiBFdmVudEZpbHRlcnMsXG4gIG9wdGlvbnM/OiBPbWl0PFVzZVF1ZXJ5T3B0aW9uczxQYWdpbmF0ZWRFdmVudHNSZXNwb25zZT4sICdxdWVyeUtleScgfCAncXVlcnlGbic+XG4pIHtcbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICBxdWVyeUtleTogZXZlbnRLZXlzLmxpc3QoZmlsdGVycyksXG4gICAgcXVlcnlGbjogYXN5bmMgKCk6IFByb21pc2U8UGFnaW5hdGVkRXZlbnRzUmVzcG9uc2U+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0KCcvYXBpL3YxL2V2ZW50cycsIHtcbiAgICAgICAgcGFyYW1zOiBmaWx0ZXJzLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCBhIHNpbmdsZSBldmVudCBieSBJRFxuICpcbiAqIEBwYXJhbSBpZCAtIEV2ZW50IElEXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRhblN0YWNrIFF1ZXJ5IG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBjb25zdCB7IGRhdGEsIGlzTG9hZGluZyB9ID0gdXNlRXZlbnQoJ2V2ZW50LTEyMycpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VFdmVudChcbiAgaWQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IE9taXQ8VXNlUXVlcnlPcHRpb25zPEV2ZW50UmVzcG9uc2U+LCAncXVlcnlLZXknIHwgJ3F1ZXJ5Rm4nPlxuKSB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IGV2ZW50S2V5cy5kZXRhaWwoaWQpLFxuICAgIHF1ZXJ5Rm46IGFzeW5jICgpOiBQcm9taXNlPEV2ZW50UmVzcG9uc2U+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0KGAvYXBpL3YxL2V2ZW50cy8ke2lkfWApO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gICAgfSxcbiAgICBlbmFibGVkOiAhIWlkLFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCBhIHNpbmdsZSBldmVudCBieSBzbHVnXG4gKlxuICogQHBhcmFtIHNsdWcgLSBFdmVudCBzbHVnXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRhblN0YWNrIFF1ZXJ5IG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBjb25zdCB7IGRhdGEsIGlzTG9hZGluZyB9ID0gdXNlRXZlbnRCeVNsdWcoJ3lvZ2EtaW4tdGhlLXBhcmsnKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRXZlbnRCeVNsdWcoXG4gIHNsdWc6IHN0cmluZyxcbiAgb3B0aW9ucz86IE9taXQ8VXNlUXVlcnlPcHRpb25zPEV2ZW50UmVzcG9uc2U+LCAncXVlcnlLZXknIHwgJ3F1ZXJ5Rm4nPlxuKSB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IGV2ZW50S2V5cy5kZXRhaWxCeVNsdWcoc2x1ZyksXG4gICAgcXVlcnlGbjogYXN5bmMgKCk6IFByb21pc2U8RXZlbnRSZXNwb25zZT4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQoYC9hcGkvdjEvZXZlbnRzL3NsdWcvJHtzbHVnfWApO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gICAgfSxcbiAgICBlbmFibGVkOiAhIXNsdWcsXG4gICAgLi4ub3B0aW9ucyxcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IHVwY29taW5nIGV2ZW50c1xuICpcbiAqIEBwYXJhbSBsaW1pdCAtIE1heGltdW0gbnVtYmVyIG9mIGV2ZW50cyB0byByZXR1cm4gKGRlZmF1bHQ6IDEwKVxuICogQHBhcmFtIG9wdGlvbnMgLSBUYW5TdGFjayBRdWVyeSBvcHRpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogY29uc3QgeyBkYXRhLCBpc0xvYWRpbmcgfSA9IHVzZVVwY29taW5nRXZlbnRzKDIwKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlVXBjb21pbmdFdmVudHMoXG4gIGxpbWl0PzogbnVtYmVyLFxuICBvcHRpb25zPzogT21pdDxVc2VRdWVyeU9wdGlvbnM8RXZlbnRSZXNwb25zZVtdPiwgJ3F1ZXJ5S2V5JyB8ICdxdWVyeUZuJz5cbikge1xuICByZXR1cm4gdXNlUXVlcnkoe1xuICAgIHF1ZXJ5S2V5OiBldmVudEtleXMudXBjb21pbmcobGltaXQpLFxuICAgIHF1ZXJ5Rm46IGFzeW5jICgpOiBQcm9taXNlPEV2ZW50UmVzcG9uc2VbXT4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQoJy9hcGkvdjEvZXZlbnRzL3VwY29taW5nJywge1xuICAgICAgICBwYXJhbXM6IHsgbGltaXQgfSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gICAgfSxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cblxuLyoqXG4gKiBHZXQgZmVhdHVyZWQgZXZlbnRzXG4gKlxuICogTm90ZTogVGhpcyB1c2VzIHRoZSBtYWluIGV2ZW50cyBlbmRwb2ludCB3aXRoIGlzRmVhdHVyZWQgZmlsdGVyXG4gKlxuICogQHBhcmFtIGxpbWl0IC0gTWF4aW11bSBudW1iZXIgb2YgZXZlbnRzIHRvIHJldHVybiAoZGVmYXVsdDogMTApXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRhblN0YWNrIFF1ZXJ5IG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBjb25zdCB7IGRhdGEsIGlzTG9hZGluZyB9ID0gdXNlRmVhdHVyZWRFdmVudHMoNSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUZlYXR1cmVkRXZlbnRzKFxuICBsaW1pdDogbnVtYmVyID0gMTAsXG4gIG9wdGlvbnM/OiBPbWl0PFVzZVF1ZXJ5T3B0aW9uczxFdmVudFJlc3BvbnNlW10+LCAncXVlcnlLZXknIHwgJ3F1ZXJ5Rm4nPlxuKSB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IGV2ZW50S2V5cy5mZWF0dXJlZChsaW1pdCksXG4gICAgcXVlcnlGbjogYXN5bmMgKCk6IFByb21pc2U8RXZlbnRSZXNwb25zZVtdPiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldCgnL2FwaS92MS9ldmVudHMnLCB7XG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIGlzRmVhdHVyZWQ6IHRydWUsXG4gICAgICAgICAgbGltaXQsXG4gICAgICAgICAgcGFnZTogMSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGEuZXZlbnRzIHx8IHJlc3BvbnNlLmRhdGE7XG4gICAgfSxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cblxuLyoqXG4gKiBHZXQgYW1iaWVudCBldmVudHMgKGF1dG8tZ2VuZXJhdGVkIHNvY2lhbCBhY3Rpdml0aWVzKVxuICpcbiAqIEBwYXJhbSBmaWx0ZXJzIC0gT3B0aW9uYWwgZmlsdGVycyAobGltaXQsIGNpdHlJZClcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGFuU3RhY2sgUXVlcnkgb3B0aW9uc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgZGF0YSwgaXNMb2FkaW5nIH0gPSB1c2VBbWJpZW50RXZlbnRzKHsgbGltaXQ6IDEwIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VBbWJpZW50RXZlbnRzKFxuICBmaWx0ZXJzPzogQW1iaWVudEV2ZW50RmlsdGVycyxcbiAgb3B0aW9ucz86IE9taXQ8VXNlUXVlcnlPcHRpb25zPEV2ZW50UmVzcG9uc2VbXT4sICdxdWVyeUtleScgfCAncXVlcnlGbic+XG4pIHtcbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICBxdWVyeUtleTogZXZlbnRLZXlzLmFtYmllbnQoZmlsdGVycyksXG4gICAgcXVlcnlGbjogYXN5bmMgKCk6IFByb21pc2U8RXZlbnRSZXNwb25zZVtdPiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldCgnL2FwaS92MS9ldmVudHMnLCB7XG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIGlzQW1iaWVudDogdHJ1ZSxcbiAgICAgICAgICBsaW1pdDogZmlsdGVycz8ubGltaXQgfHwgMjAsXG4gICAgICAgICAgY2l0eUlkOiBmaWx0ZXJzPy5jaXR5SWQsXG4gICAgICAgICAgc3RhcnRGcm9tOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgc29ydEJ5OiAnc3RhcnREYXRlJyxcbiAgICAgICAgICBzb3J0T3JkZXI6ICdhc2MnLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICAvLyBBUEkgcmV0dXJucyB7IGRhdGE6IHsgZXZlbnRzOiBbLi4uXSwgbWV0YTogey4uLn0gfSwgbWV0YTogey4uLn0gfVxuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGEuZGF0YT8uZXZlbnRzIHx8IHJlc3BvbnNlLmRhdGEuZXZlbnRzIHx8IHJlc3BvbnNlLmRhdGE7XG4gICAgfSxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cblxuLyoqXG4gKiBHZXQgYm9va2luZ3MgZm9yIGEgc3BlY2lmaWMgZXZlbnRcbiAqXG4gKiBOb3RlOiBUaGlzIGVuZHBvaW50IG1heSBub3QgYmUgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IEFQSS5cbiAqIENvbnNpZGVyIHVzaW5nIGFkbWluIGVuZHBvaW50cyBvciB1c2VyIGJvb2tpbmdzIGVuZHBvaW50cyBpbnN0ZWFkLlxuICogVGhpcyBob29rIGlzIHByb3ZpZGVkIGZvciBmdXR1cmUgY29tcGF0aWJpbGl0eS5cbiAqXG4gKiBAcGFyYW0gZXZlbnRJZCAtIEV2ZW50IElEXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRhblN0YWNrIFF1ZXJ5IG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBjb25zdCB7IGRhdGEsIGlzTG9hZGluZyB9ID0gdXNlRXZlbnRCb29raW5ncygnZXZlbnQtMTIzJyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUV2ZW50Qm9va2luZ3MoXG4gIGV2ZW50SWQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IE9taXQ8VXNlUXVlcnlPcHRpb25zPGFueVtdPiwgJ3F1ZXJ5S2V5JyB8ICdxdWVyeUZuJz5cbikge1xuICByZXR1cm4gdXNlUXVlcnkoe1xuICAgIHF1ZXJ5S2V5OiBldmVudEtleXMuYm9va2luZ3MoZXZlbnRJZCksXG4gICAgcXVlcnlGbjogYXN5bmMgKCk6IFByb21pc2U8YW55W10+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgLy8gTm90ZTogVGhpcyBlbmRwb2ludCBtYXkgbm90IGV4aXN0IGluIHRoZSBjdXJyZW50IEFQSVxuICAgICAgLy8gQWRqdXN0IHRoZSBwYXRoIGJhc2VkIG9uIHlvdXIgYWN0dWFsIEFQSSBpbXBsZW1lbnRhdGlvblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0KGAvYXBpL3YxL2V2ZW50cy8ke2V2ZW50SWR9L2Jvb2tpbmdzYCk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICB9LFxuICAgIGVuYWJsZWQ6ICEhZXZlbnRJZCxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cbiJdfQ==