@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,61 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.apiClient = void 0;
7
+ exports.configureSDK = configureSDK;
8
+ exports.getApiClient = getApiClient;
9
+ const axios_1 = __importDefault(require("axios"));
10
+ let config = null;
11
+ let apiClient = null;
12
+ exports.apiClient = apiClient;
13
+ function configureSDK(sdkConfig) {
14
+ config = sdkConfig;
15
+ exports.apiClient = apiClient = createApiClient(sdkConfig);
16
+ }
17
+ function getApiClient() {
18
+ if (!apiClient) {
19
+ throw new Error('SDK not configured. Call configureSDK() first.');
20
+ }
21
+ return apiClient;
22
+ }
23
+ function createApiClient(sdkConfig) {
24
+ const client = axios_1.default.create({
25
+ baseURL: sdkConfig.baseURL,
26
+ headers: {
27
+ 'Content-Type': 'application/json',
28
+ },
29
+ });
30
+ // Request interceptor - add auth token
31
+ client.interceptors.request.use(async (requestConfig) => {
32
+ const token = await sdkConfig.getAccessToken();
33
+ if (token) {
34
+ requestConfig.headers.Authorization = `Bearer ${token}`;
35
+ }
36
+ return requestConfig;
37
+ }, (error) => Promise.reject(error));
38
+ // Response interceptor - handle 401
39
+ client.interceptors.response.use((response) => response, async (error) => {
40
+ if (error.response?.status === 401) {
41
+ if (sdkConfig.refreshAccessToken) {
42
+ try {
43
+ const newToken = await sdkConfig.refreshAccessToken();
44
+ if (newToken && error.config) {
45
+ error.config.headers.Authorization = `Bearer ${newToken}`;
46
+ return client.request(error.config);
47
+ }
48
+ }
49
+ catch {
50
+ sdkConfig.onUnauthorized?.();
51
+ }
52
+ }
53
+ else {
54
+ sdkConfig.onUnauthorized?.();
55
+ }
56
+ }
57
+ return Promise.reject(error);
58
+ });
59
+ return client;
60
+ }
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBWUEsb0NBR0M7QUFFRCxvQ0FLQztBQXRCRCxrREFBcUY7QUFTckYsSUFBSSxNQUFNLEdBQXFCLElBQUksQ0FBQztBQUNwQyxJQUFJLFNBQVMsR0FBeUIsSUFBSSxDQUFDO0FBNERsQyw4QkFBUztBQTFEbEIsU0FBZ0IsWUFBWSxDQUFDLFNBQW9CO0lBQy9DLE1BQU0sR0FBRyxTQUFTLENBQUM7SUFDbkIsb0JBQUEsU0FBUyxHQUFHLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBRUQsU0FBZ0IsWUFBWTtJQUMxQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDZixNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FBQyxTQUFvQjtJQUMzQyxNQUFNLE1BQU0sR0FBRyxlQUFLLENBQUMsTUFBTSxDQUFDO1FBQzFCLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTztRQUMxQixPQUFPLEVBQUU7WUFDUCxjQUFjLEVBQUUsa0JBQWtCO1NBQ25DO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsdUNBQXVDO0lBQ3ZDLE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FDN0IsS0FBSyxFQUFFLGFBQXlDLEVBQUUsRUFBRTtRQUNsRCxNQUFNLEtBQUssR0FBRyxNQUFNLFNBQVMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUMvQyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsYUFBYSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEdBQUcsVUFBVSxLQUFLLEVBQUUsQ0FBQztRQUMxRCxDQUFDO1FBQ0QsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQyxFQUNELENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUNqQyxDQUFDO0lBRUYsb0NBQW9DO0lBQ3BDLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FDOUIsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFDdEIsS0FBSyxFQUFFLEtBQWlCLEVBQUUsRUFBRTtRQUMxQixJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ25DLElBQUksU0FBUyxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQ2pDLElBQUksQ0FBQztvQkFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO29CQUN0RCxJQUFJLFFBQVEsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7d0JBQzdCLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsR0FBRyxVQUFVLFFBQVEsRUFBRSxDQUFDO3dCQUMxRCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUN0QyxDQUFDO2dCQUNILENBQUM7Z0JBQUMsTUFBTSxDQUFDO29CQUNQLFNBQVMsQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDO2dCQUMvQixDQUFDO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFNBQVMsQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDO1lBQy9CLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUMsQ0FDRixDQUFDO0lBRUYsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBheGlvcywgeyBBeGlvc0luc3RhbmNlLCBBeGlvc0Vycm9yLCBJbnRlcm5hbEF4aW9zUmVxdWVzdENvbmZpZyB9IGZyb20gJ2F4aW9zJztcblxuZXhwb3J0IGludGVyZmFjZSBTREtDb25maWcge1xuICBiYXNlVVJMOiBzdHJpbmc7XG4gIGdldEFjY2Vzc1Rva2VuOiAoKSA9PiBzdHJpbmcgfCBudWxsIHwgUHJvbWlzZTxzdHJpbmcgfCBudWxsPjtcbiAgcmVmcmVzaEFjY2Vzc1Rva2VuPzogKCkgPT4gUHJvbWlzZTxzdHJpbmc+O1xuICBvblVuYXV0aG9yaXplZD86ICgpID0+IHZvaWQ7XG59XG5cbmxldCBjb25maWc6IFNES0NvbmZpZyB8IG51bGwgPSBudWxsO1xubGV0IGFwaUNsaWVudDogQXhpb3NJbnN0YW5jZSB8IG51bGwgPSBudWxsO1xuXG5leHBvcnQgZnVuY3Rpb24gY29uZmlndXJlU0RLKHNka0NvbmZpZzogU0RLQ29uZmlnKTogdm9pZCB7XG4gIGNvbmZpZyA9IHNka0NvbmZpZztcbiAgYXBpQ2xpZW50ID0gY3JlYXRlQXBpQ2xpZW50KHNka0NvbmZpZyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBcGlDbGllbnQoKTogQXhpb3NJbnN0YW5jZSB7XG4gIGlmICghYXBpQ2xpZW50KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTREsgbm90IGNvbmZpZ3VyZWQuIENhbGwgY29uZmlndXJlU0RLKCkgZmlyc3QuJyk7XG4gIH1cbiAgcmV0dXJuIGFwaUNsaWVudDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQXBpQ2xpZW50KHNka0NvbmZpZzogU0RLQ29uZmlnKTogQXhpb3NJbnN0YW5jZSB7XG4gIGNvbnN0IGNsaWVudCA9IGF4aW9zLmNyZWF0ZSh7XG4gICAgYmFzZVVSTDogc2RrQ29uZmlnLmJhc2VVUkwsXG4gICAgaGVhZGVyczoge1xuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICB9LFxuICB9KTtcblxuICAvLyBSZXF1ZXN0IGludGVyY2VwdG9yIC0gYWRkIGF1dGggdG9rZW5cbiAgY2xpZW50LmludGVyY2VwdG9ycy5yZXF1ZXN0LnVzZShcbiAgICBhc3luYyAocmVxdWVzdENvbmZpZzogSW50ZXJuYWxBeGlvc1JlcXVlc3RDb25maWcpID0+IHtcbiAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgc2RrQ29uZmlnLmdldEFjY2Vzc1Rva2VuKCk7XG4gICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgcmVxdWVzdENvbmZpZy5oZWFkZXJzLkF1dGhvcml6YXRpb24gPSBgQmVhcmVyICR7dG9rZW59YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXF1ZXN0Q29uZmlnO1xuICAgIH0sXG4gICAgKGVycm9yKSA9PiBQcm9taXNlLnJlamVjdChlcnJvcilcbiAgKTtcblxuICAvLyBSZXNwb25zZSBpbnRlcmNlcHRvciAtIGhhbmRsZSA0MDFcbiAgY2xpZW50LmludGVyY2VwdG9ycy5yZXNwb25zZS51c2UoXG4gICAgKHJlc3BvbnNlKSA9PiByZXNwb25zZSxcbiAgICBhc3luYyAoZXJyb3I6IEF4aW9zRXJyb3IpID0+IHtcbiAgICAgIGlmIChlcnJvci5yZXNwb25zZT8uc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgaWYgKHNka0NvbmZpZy5yZWZyZXNoQWNjZXNzVG9rZW4pIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbmV3VG9rZW4gPSBhd2FpdCBzZGtDb25maWcucmVmcmVzaEFjY2Vzc1Rva2VuKCk7XG4gICAgICAgICAgICBpZiAobmV3VG9rZW4gJiYgZXJyb3IuY29uZmlnKSB7XG4gICAgICAgICAgICAgIGVycm9yLmNvbmZpZy5oZWFkZXJzLkF1dGhvcml6YXRpb24gPSBgQmVhcmVyICR7bmV3VG9rZW59YDtcbiAgICAgICAgICAgICAgcmV0dXJuIGNsaWVudC5yZXF1ZXN0KGVycm9yLmNvbmZpZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICBzZGtDb25maWcub25VbmF1dGhvcml6ZWQ/LigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZGtDb25maWcub25VbmF1dGhvcml6ZWQ/LigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgIH1cbiAgKTtcblxuICByZXR1cm4gY2xpZW50O1xufVxuXG5leHBvcnQgeyBhcGlDbGllbnQgfTtcbiJdfQ==
@@ -0,0 +1,167 @@
1
+ /**
2
+ * Admin Mutation Hooks
3
+ *
4
+ * TanStack Query mutation hooks for admin-related write operations.
5
+ * These hooks handle admin actions like user management, content moderation,
6
+ * and business verification.
7
+ *
8
+ * @module api/mutations/admin
9
+ */
10
+ import { UseMutationOptions, UseMutationResult } from '@tanstack/react-query';
11
+ import type { UserResponse, HubResponse, EventResponse, BusinessResponse, LibraryContentResponse, CreateHubRequest, UpdateHubRequest, UpdateEventRequest } from '../types';
12
+ export interface AdminUpdateUserRequest {
13
+ displayName?: string;
14
+ email?: string;
15
+ role?: string;
16
+ isPremium?: boolean;
17
+ isSuspended?: boolean;
18
+ }
19
+ export interface AdminCreateContentRequest {
20
+ title: string;
21
+ type: string;
22
+ category: string;
23
+ description?: string;
24
+ content?: string;
25
+ mediaUrl?: string;
26
+ thumbnailUrl?: string;
27
+ duration?: number;
28
+ isPremium?: boolean;
29
+ isFeatured?: boolean;
30
+ sortOrder?: number;
31
+ }
32
+ export interface AdminUpdateContentRequest extends Partial<AdminCreateContentRequest> {
33
+ }
34
+ export interface AdminVerifyBusinessRequest {
35
+ isVerified: boolean;
36
+ notes?: string;
37
+ }
38
+ export interface AdminActionResponse {
39
+ success: boolean;
40
+ message: string;
41
+ }
42
+ /**
43
+ * Update user (admin)
44
+ *
45
+ * @endpoint PUT /api/v1/admin/users/{id}
46
+ */
47
+ export declare function useAdminUpdateUser(options?: Omit<UseMutationOptions<UserResponse, Error, {
48
+ id: string;
49
+ data: AdminUpdateUserRequest;
50
+ }>, 'mutationFn'>): UseMutationResult<UserResponse, Error, {
51
+ id: string;
52
+ data: AdminUpdateUserRequest;
53
+ }>;
54
+ /**
55
+ * Suspend user (admin)
56
+ *
57
+ * @endpoint POST /api/v1/admin/users/{id}/suspend
58
+ */
59
+ export declare function useAdminSuspendUser(options?: Omit<UseMutationOptions<AdminActionResponse, Error, {
60
+ id: string;
61
+ reason?: string;
62
+ }>, 'mutationFn'>): UseMutationResult<AdminActionResponse, Error, {
63
+ id: string;
64
+ reason?: string;
65
+ }>;
66
+ /**
67
+ * Activate user (admin)
68
+ *
69
+ * @endpoint POST /api/v1/admin/users/{id}/activate
70
+ */
71
+ export declare function useAdminActivateUser(options?: Omit<UseMutationOptions<AdminActionResponse, Error, string>, 'mutationFn'>): UseMutationResult<AdminActionResponse, Error, string>;
72
+ /**
73
+ * Delete user (admin)
74
+ *
75
+ * @endpoint DELETE /api/v1/admin/users/{id}
76
+ */
77
+ export declare function useAdminDeleteUser(options?: Omit<UseMutationOptions<AdminActionResponse, Error, string>, 'mutationFn'>): UseMutationResult<AdminActionResponse, Error, string>;
78
+ /**
79
+ * Create hub (admin)
80
+ *
81
+ * @endpoint POST /api/v1/admin/hubs
82
+ */
83
+ export declare function useAdminCreateHub(options?: Omit<UseMutationOptions<HubResponse, Error, CreateHubRequest>, 'mutationFn'>): UseMutationResult<HubResponse, Error, CreateHubRequest>;
84
+ /**
85
+ * Update hub (admin)
86
+ *
87
+ * @endpoint PUT /api/v1/admin/hubs/{id}
88
+ */
89
+ export declare function useAdminUpdateHub(options?: Omit<UseMutationOptions<HubResponse, Error, {
90
+ id: string;
91
+ data: UpdateHubRequest;
92
+ }>, 'mutationFn'>): UseMutationResult<HubResponse, Error, {
93
+ id: string;
94
+ data: UpdateHubRequest;
95
+ }>;
96
+ /**
97
+ * Delete hub (admin)
98
+ *
99
+ * @endpoint DELETE /api/v1/admin/hubs/{id}
100
+ */
101
+ export declare function useAdminDeleteHub(options?: Omit<UseMutationOptions<AdminActionResponse, Error, string>, 'mutationFn'>): UseMutationResult<AdminActionResponse, Error, string>;
102
+ /**
103
+ * Update event (admin)
104
+ *
105
+ * @endpoint PUT /api/v1/admin/events/{id}
106
+ */
107
+ export declare function useAdminUpdateEvent(options?: Omit<UseMutationOptions<EventResponse, Error, {
108
+ id: string;
109
+ data: UpdateEventRequest;
110
+ }>, 'mutationFn'>): UseMutationResult<EventResponse, Error, {
111
+ id: string;
112
+ data: UpdateEventRequest;
113
+ }>;
114
+ /**
115
+ * Cancel event (admin)
116
+ *
117
+ * @endpoint POST /api/v1/admin/events/{id}/cancel
118
+ */
119
+ export declare function useAdminCancelEvent(options?: Omit<UseMutationOptions<AdminActionResponse, Error, {
120
+ id: string;
121
+ reason?: string;
122
+ }>, 'mutationFn'>): UseMutationResult<AdminActionResponse, Error, {
123
+ id: string;
124
+ reason?: string;
125
+ }>;
126
+ /**
127
+ * Verify business (admin)
128
+ *
129
+ * @endpoint POST /api/v1/admin/businesses/{id}/verify
130
+ */
131
+ export declare function useAdminVerifyBusiness(options?: Omit<UseMutationOptions<BusinessResponse, Error, {
132
+ id: string;
133
+ data: AdminVerifyBusinessRequest;
134
+ }>, 'mutationFn'>): UseMutationResult<BusinessResponse, Error, {
135
+ id: string;
136
+ data: AdminVerifyBusinessRequest;
137
+ }>;
138
+ /**
139
+ * Delete business (admin)
140
+ *
141
+ * @endpoint DELETE /api/v1/admin/businesses/{id}
142
+ */
143
+ export declare function useAdminDeleteBusiness(options?: Omit<UseMutationOptions<AdminActionResponse, Error, string>, 'mutationFn'>): UseMutationResult<AdminActionResponse, Error, string>;
144
+ /**
145
+ * Create content (admin)
146
+ *
147
+ * @endpoint POST /api/v1/admin/content
148
+ */
149
+ export declare function useAdminCreateContent(options?: Omit<UseMutationOptions<LibraryContentResponse, Error, AdminCreateContentRequest>, 'mutationFn'>): UseMutationResult<LibraryContentResponse, Error, AdminCreateContentRequest>;
150
+ /**
151
+ * Update content (admin)
152
+ *
153
+ * @endpoint PUT /api/v1/admin/content/{id}
154
+ */
155
+ export declare function useAdminUpdateContent(options?: Omit<UseMutationOptions<LibraryContentResponse, Error, {
156
+ id: string;
157
+ data: AdminUpdateContentRequest;
158
+ }>, 'mutationFn'>): UseMutationResult<LibraryContentResponse, Error, {
159
+ id: string;
160
+ data: AdminUpdateContentRequest;
161
+ }>;
162
+ /**
163
+ * Delete content (admin)
164
+ *
165
+ * @endpoint DELETE /api/v1/admin/content/{id}
166
+ */
167
+ export declare function useAdminDeleteContent(options?: Omit<UseMutationOptions<AdminActionResponse, Error, string>, 'mutationFn'>): UseMutationResult<AdminActionResponse, Error, string>;
@@ -0,0 +1,326 @@
1
+ "use strict";
2
+ /**
3
+ * Admin Mutation Hooks
4
+ *
5
+ * TanStack Query mutation hooks for admin-related write operations.
6
+ * These hooks handle admin actions like user management, content moderation,
7
+ * and business verification.
8
+ *
9
+ * @module api/mutations/admin
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.useAdminUpdateUser = useAdminUpdateUser;
13
+ exports.useAdminSuspendUser = useAdminSuspendUser;
14
+ exports.useAdminActivateUser = useAdminActivateUser;
15
+ exports.useAdminDeleteUser = useAdminDeleteUser;
16
+ exports.useAdminCreateHub = useAdminCreateHub;
17
+ exports.useAdminUpdateHub = useAdminUpdateHub;
18
+ exports.useAdminDeleteHub = useAdminDeleteHub;
19
+ exports.useAdminUpdateEvent = useAdminUpdateEvent;
20
+ exports.useAdminCancelEvent = useAdminCancelEvent;
21
+ exports.useAdminVerifyBusiness = useAdminVerifyBusiness;
22
+ exports.useAdminDeleteBusiness = useAdminDeleteBusiness;
23
+ exports.useAdminCreateContent = useAdminCreateContent;
24
+ exports.useAdminUpdateContent = useAdminUpdateContent;
25
+ exports.useAdminDeleteContent = useAdminDeleteContent;
26
+ const react_query_1 = require("@tanstack/react-query");
27
+ const client_1 = require("../client");
28
+ const admin_1 = require("../queries/admin");
29
+ // ============================================================================
30
+ // USER MUTATIONS
31
+ // ============================================================================
32
+ /**
33
+ * Update user (admin)
34
+ *
35
+ * @endpoint PUT /api/v1/admin/users/{id}
36
+ */
37
+ function useAdminUpdateUser(options) {
38
+ const queryClient = (0, react_query_1.useQueryClient)();
39
+ return (0, react_query_1.useMutation)({
40
+ mutationFn: async ({ id, data, }) => {
41
+ const client = (0, client_1.getApiClient)();
42
+ const response = await client.put(`/api/v1/admin/users/${id}`, data);
43
+ return response.data;
44
+ },
45
+ onSuccess: (_, variables) => {
46
+ queryClient.invalidateQueries({ queryKey: admin_1.adminKeys.users.detail(variables.id) });
47
+ queryClient.invalidateQueries({ queryKey: admin_1.adminKeys.users.list() });
48
+ queryClient.invalidateQueries({ queryKey: admin_1.adminKeys.dashboard() });
49
+ },
50
+ ...options,
51
+ });
52
+ }
53
+ /**
54
+ * Suspend user (admin)
55
+ *
56
+ * @endpoint POST /api/v1/admin/users/{id}/suspend
57
+ */
58
+ function useAdminSuspendUser(options) {
59
+ const queryClient = (0, react_query_1.useQueryClient)();
60
+ return (0, react_query_1.useMutation)({
61
+ mutationFn: async ({ id, reason, }) => {
62
+ const client = (0, client_1.getApiClient)();
63
+ const response = await client.post(`/api/v1/admin/users/${id}/suspend`, { reason });
64
+ return response.data;
65
+ },
66
+ onSuccess: (_, variables) => {
67
+ queryClient.invalidateQueries({ queryKey: admin_1.adminKeys.users.detail(variables.id) });
68
+ queryClient.invalidateQueries({ queryKey: admin_1.adminKeys.users.list() });
69
+ },
70
+ ...options,
71
+ });
72
+ }
73
+ /**
74
+ * Activate user (admin)
75
+ *
76
+ * @endpoint POST /api/v1/admin/users/{id}/activate
77
+ */
78
+ function useAdminActivateUser(options) {
79
+ const queryClient = (0, react_query_1.useQueryClient)();
80
+ return (0, react_query_1.useMutation)({
81
+ mutationFn: async (id) => {
82
+ const client = (0, client_1.getApiClient)();
83
+ const response = await client.post(`/api/v1/admin/users/${id}/activate`);
84
+ return response.data;
85
+ },
86
+ onSuccess: (_, id) => {
87
+ queryClient.invalidateQueries({ queryKey: admin_1.adminKeys.users.detail(id) });
88
+ queryClient.invalidateQueries({ queryKey: admin_1.adminKeys.users.list() });
89
+ },
90
+ ...options,
91
+ });
92
+ }
93
+ /**
94
+ * Delete user (admin)
95
+ *
96
+ * @endpoint DELETE /api/v1/admin/users/{id}
97
+ */
98
+ function useAdminDeleteUser(options) {
99
+ const queryClient = (0, react_query_1.useQueryClient)();
100
+ return (0, react_query_1.useMutation)({
101
+ mutationFn: async (id) => {
102
+ const client = (0, client_1.getApiClient)();
103
+ const response = await client.delete(`/api/v1/admin/users/${id}`);
104
+ return response.data;
105
+ },
106
+ onSuccess: () => {
107
+ queryClient.invalidateQueries({ queryKey: admin_1.adminKeys.users.list() });
108
+ queryClient.invalidateQueries({ queryKey: admin_1.adminKeys.dashboard() });
109
+ },
110
+ ...options,
111
+ });
112
+ }
113
+ // ============================================================================
114
+ // HUB MUTATIONS
115
+ // ============================================================================
116
+ /**
117
+ * Create hub (admin)
118
+ *
119
+ * @endpoint POST /api/v1/admin/hubs
120
+ */
121
+ function useAdminCreateHub(options) {
122
+ const queryClient = (0, react_query_1.useQueryClient)();
123
+ return (0, react_query_1.useMutation)({
124
+ mutationFn: async (data) => {
125
+ const client = (0, client_1.getApiClient)();
126
+ const response = await client.post('/api/v1/admin/hubs', data);
127
+ return response.data;
128
+ },
129
+ onSuccess: () => {
130
+ queryClient.invalidateQueries({ queryKey: admin_1.adminKeys.hubs.list() });
131
+ queryClient.invalidateQueries({ queryKey: admin_1.adminKeys.dashboard() });
132
+ },
133
+ ...options,
134
+ });
135
+ }
136
+ /**
137
+ * Update hub (admin)
138
+ *
139
+ * @endpoint PUT /api/v1/admin/hubs/{id}
140
+ */
141
+ function useAdminUpdateHub(options) {
142
+ const queryClient = (0, react_query_1.useQueryClient)();
143
+ return (0, react_query_1.useMutation)({
144
+ mutationFn: async ({ id, data, }) => {
145
+ const client = (0, client_1.getApiClient)();
146
+ const response = await client.put(`/api/v1/admin/hubs/${id}`, data);
147
+ return response.data;
148
+ },
149
+ onSuccess: (_, variables) => {
150
+ queryClient.invalidateQueries({ queryKey: admin_1.adminKeys.hubs.detail(variables.id) });
151
+ queryClient.invalidateQueries({ queryKey: admin_1.adminKeys.hubs.list() });
152
+ },
153
+ ...options,
154
+ });
155
+ }
156
+ /**
157
+ * Delete hub (admin)
158
+ *
159
+ * @endpoint DELETE /api/v1/admin/hubs/{id}
160
+ */
161
+ function useAdminDeleteHub(options) {
162
+ const queryClient = (0, react_query_1.useQueryClient)();
163
+ return (0, react_query_1.useMutation)({
164
+ mutationFn: async (id) => {
165
+ const client = (0, client_1.getApiClient)();
166
+ const response = await client.delete(`/api/v1/admin/hubs/${id}`);
167
+ return response.data;
168
+ },
169
+ onSuccess: () => {
170
+ queryClient.invalidateQueries({ queryKey: admin_1.adminKeys.hubs.list() });
171
+ queryClient.invalidateQueries({ queryKey: admin_1.adminKeys.dashboard() });
172
+ },
173
+ ...options,
174
+ });
175
+ }
176
+ // ============================================================================
177
+ // EVENT MUTATIONS
178
+ // ============================================================================
179
+ /**
180
+ * Update event (admin)
181
+ *
182
+ * @endpoint PUT /api/v1/admin/events/{id}
183
+ */
184
+ function useAdminUpdateEvent(options) {
185
+ const queryClient = (0, react_query_1.useQueryClient)();
186
+ return (0, react_query_1.useMutation)({
187
+ mutationFn: async ({ id, data, }) => {
188
+ const client = (0, client_1.getApiClient)();
189
+ const response = await client.put(`/api/v1/admin/events/${id}`, data);
190
+ return response.data;
191
+ },
192
+ onSuccess: (_, variables) => {
193
+ queryClient.invalidateQueries({ queryKey: admin_1.adminKeys.events.detail(variables.id) });
194
+ queryClient.invalidateQueries({ queryKey: admin_1.adminKeys.events.list() });
195
+ },
196
+ ...options,
197
+ });
198
+ }
199
+ /**
200
+ * Cancel event (admin)
201
+ *
202
+ * @endpoint POST /api/v1/admin/events/{id}/cancel
203
+ */
204
+ function useAdminCancelEvent(options) {
205
+ const queryClient = (0, react_query_1.useQueryClient)();
206
+ return (0, react_query_1.useMutation)({
207
+ mutationFn: async ({ id, reason, }) => {
208
+ const client = (0, client_1.getApiClient)();
209
+ const response = await client.post(`/api/v1/admin/events/${id}/cancel`, { reason });
210
+ return response.data;
211
+ },
212
+ onSuccess: (_, variables) => {
213
+ queryClient.invalidateQueries({ queryKey: admin_1.adminKeys.events.detail(variables.id) });
214
+ queryClient.invalidateQueries({ queryKey: admin_1.adminKeys.events.list() });
215
+ },
216
+ ...options,
217
+ });
218
+ }
219
+ // ============================================================================
220
+ // BUSINESS MUTATIONS
221
+ // ============================================================================
222
+ /**
223
+ * Verify business (admin)
224
+ *
225
+ * @endpoint POST /api/v1/admin/businesses/{id}/verify
226
+ */
227
+ function useAdminVerifyBusiness(options) {
228
+ const queryClient = (0, react_query_1.useQueryClient)();
229
+ return (0, react_query_1.useMutation)({
230
+ mutationFn: async ({ id, data, }) => {
231
+ const client = (0, client_1.getApiClient)();
232
+ const response = await client.post(`/api/v1/admin/businesses/${id}/verify`, data);
233
+ return response.data;
234
+ },
235
+ onSuccess: (_, variables) => {
236
+ queryClient.invalidateQueries({
237
+ queryKey: admin_1.adminKeys.businesses.detail(variables.id),
238
+ });
239
+ queryClient.invalidateQueries({ queryKey: admin_1.adminKeys.businesses.list() });
240
+ queryClient.invalidateQueries({ queryKey: admin_1.adminKeys.dashboard() });
241
+ },
242
+ ...options,
243
+ });
244
+ }
245
+ /**
246
+ * Delete business (admin)
247
+ *
248
+ * @endpoint DELETE /api/v1/admin/businesses/{id}
249
+ */
250
+ function useAdminDeleteBusiness(options) {
251
+ const queryClient = (0, react_query_1.useQueryClient)();
252
+ return (0, react_query_1.useMutation)({
253
+ mutationFn: async (id) => {
254
+ const client = (0, client_1.getApiClient)();
255
+ const response = await client.delete(`/api/v1/admin/businesses/${id}`);
256
+ return response.data;
257
+ },
258
+ onSuccess: () => {
259
+ queryClient.invalidateQueries({ queryKey: admin_1.adminKeys.businesses.list() });
260
+ queryClient.invalidateQueries({ queryKey: admin_1.adminKeys.dashboard() });
261
+ },
262
+ ...options,
263
+ });
264
+ }
265
+ // ============================================================================
266
+ // CONTENT MUTATIONS
267
+ // ============================================================================
268
+ /**
269
+ * Create content (admin)
270
+ *
271
+ * @endpoint POST /api/v1/admin/content
272
+ */
273
+ function useAdminCreateContent(options) {
274
+ const queryClient = (0, react_query_1.useQueryClient)();
275
+ return (0, react_query_1.useMutation)({
276
+ mutationFn: async (data) => {
277
+ const client = (0, client_1.getApiClient)();
278
+ const response = await client.post('/api/v1/admin/content', data);
279
+ return response.data;
280
+ },
281
+ onSuccess: () => {
282
+ queryClient.invalidateQueries({ queryKey: admin_1.adminKeys.content.list() });
283
+ },
284
+ ...options,
285
+ });
286
+ }
287
+ /**
288
+ * Update content (admin)
289
+ *
290
+ * @endpoint PUT /api/v1/admin/content/{id}
291
+ */
292
+ function useAdminUpdateContent(options) {
293
+ const queryClient = (0, react_query_1.useQueryClient)();
294
+ return (0, react_query_1.useMutation)({
295
+ mutationFn: async ({ id, data, }) => {
296
+ const client = (0, client_1.getApiClient)();
297
+ const response = await client.put(`/api/v1/admin/content/${id}`, data);
298
+ return response.data;
299
+ },
300
+ onSuccess: (_, variables) => {
301
+ queryClient.invalidateQueries({ queryKey: admin_1.adminKeys.content.detail(variables.id) });
302
+ queryClient.invalidateQueries({ queryKey: admin_1.adminKeys.content.list() });
303
+ },
304
+ ...options,
305
+ });
306
+ }
307
+ /**
308
+ * Delete content (admin)
309
+ *
310
+ * @endpoint DELETE /api/v1/admin/content/{id}
311
+ */
312
+ function useAdminDeleteContent(options) {
313
+ const queryClient = (0, react_query_1.useQueryClient)();
314
+ return (0, react_query_1.useMutation)({
315
+ mutationFn: async (id) => {
316
+ const client = (0, client_1.getApiClient)();
317
+ const response = await client.delete(`/api/v1/admin/content/${id}`);
318
+ return response.data;
319
+ },
320
+ onSuccess: () => {
321
+ queryClient.invalidateQueries({ queryKey: admin_1.adminKeys.content.list() });
322
+ },
323
+ ...options,
324
+ });
325
+ }
326
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRtaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpL211dGF0aW9ucy9hZG1pbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7O0dBUUc7O0FBd0VILGdEQTJCQztBQU9ELGtEQTZCQztBQU9ELG9EQW1CQztBQU9ELGdEQWlCQztBQVdELDhDQWlCQztBQU9ELDhDQTBCQztBQU9ELDhDQWlCQztBQVdELGtEQTBCQztBQU9ELGtEQTZCQztBQVdELHdEQXdDQztBQU9ELHdEQW1CQztBQVdELHNEQXNCQztBQU9ELHNEQXFDQztBQU9ELHNEQWtCQztBQXhnQkQsdURBSytCO0FBQy9CLHNDQUF5QztBQUN6Qyw0Q0FBNkM7QUFzRDdDLCtFQUErRTtBQUMvRSxpQkFBaUI7QUFDakIsK0VBQStFO0FBRS9FOzs7O0dBSUc7QUFDSCxTQUFnQixrQkFBa0IsQ0FDaEMsT0FHQztJQUVELE1BQU0sV0FBVyxHQUFHLElBQUEsNEJBQWMsR0FBRSxDQUFDO0lBRXJDLE9BQU8sSUFBQSx5QkFBVyxFQUFDO1FBQ2pCLFVBQVUsRUFBRSxLQUFLLEVBQUUsRUFDakIsRUFBRSxFQUNGLElBQUksR0FJTCxFQUF5QixFQUFFO1lBQzFCLE1BQU0sTUFBTSxHQUFHLElBQUEscUJBQVksR0FBRSxDQUFDO1lBQzlCLE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FBZSx1QkFBdUIsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbkYsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLEVBQUU7WUFDMUIsV0FBVyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsUUFBUSxFQUFFLGlCQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2xGLFdBQVcsQ0FBQyxp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IFF1ZXJ5IG11dGF0aW9uIGhvb2tzIGZvciBhZG1pbi1yZWxhdGVkIHdyaXRlIG9wZXJhdGlvbnMuXG4gKiBUaGVzZSBob29rcyBoYW5kbGUgYWRtaW4gYWN0aW9ucyBsaWtlIHVzZXIgbWFuYWdlbWVudCwgY29udGVudCBtb2RlcmF0aW9uLFxuICogYW5kIGJ1c2luZXNzIHZlcmlmaWNhdGlvbi5cbiAqXG4gKiBAbW9kdWxlIGFwaS9tdXRhdGlvbnMvYWRtaW5cbiAqL1xuXG5pbXBvcnQge1xuICB1c2VNdXRhdGlvbixcbiAgVXNlTXV0YXRpb25PcHRpb25zLFxuICBVc2VNdXRhdGlvblJlc3VsdCxcbiAgdXNlUXVlcnlDbGllbnQsXG59IGZyb20gJ0B0YW5zdGFjay9yZWFjdC1xdWVyeSc7XG5pbXBvcnQgeyBnZXRBcGlDbGllbnQgfSBmcm9tICcuLi9jbGllbnQnO1xuaW1wb3J0IHsgYWRtaW5LZXlzIH0gZnJvbSAnLi4vcXVlcmllcy9hZG1pbic7XG5pbXBvcnQgdHlwZSB7XG4gIFVzZXJSZXNwb25zZSxcbiAgSHViUmVzcG9uc2UsXG4gIEV2ZW50UmVzcG9uc2UsXG4gIEJ1c2luZXNzUmVzcG9uc2UsXG4gIExpYnJhcnlDb250ZW50UmVzcG9uc2UsXG4gIENyZWF0ZUh1YlJlcXVlc3QsXG4gIFVwZGF0ZUh1YlJlcXVlc3QsXG4gIFVwZGF0ZUV2ZW50UmVxdWVzdCxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBSRVFVRVNUIFRZUEVTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRtaW5VcGRhdGVVc2VyUmVxdWVzdCB7XG4gIGRpc3BsYXlOYW1lPzogc3RyaW5nO1xuICBlbWFpbD86IHN0cmluZztcbiAgcm9sZT86IHN0cmluZztcbiAgaXNQcmVtaXVtPzogYm9vbGVhbjtcbiAgaXNTdXNwZW5kZWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFkbWluQ3JlYXRlQ29udGVudFJlcXVlc3Qge1xuICB0aXRsZTogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIGNhdGVnb3J5OiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBjb250ZW50Pzogc3RyaW5nO1xuICBtZWRpYVVybD86IHN0cmluZztcbiAgdGh1bWJuYWlsVXJsPzogc3RyaW5nO1xuICBkdXJhdGlvbj86IG51bWJlcjtcbiAgaXNQcmVtaXVtPzogYm9vbGVhbjtcbiAgaXNGZWF0dXJlZD86IGJvb2xlYW47XG4gIHNvcnRPcmRlcj86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBZG1pblVwZGF0ZUNvbnRlbnRSZXF1ZXN0IGV4dGVuZHMgUGFydGlhbDxBZG1pbkNyZWF0ZUNvbnRlbnRSZXF1ZXN0PiB7fVxuXG5leHBvcnQgaW50ZXJmYWNlIEFkbWluVmVyaWZ5QnVzaW5lc3NSZXF1ZXN0IHtcbiAgaXNWZXJpZmllZDogYm9vbGVhbjtcbiAgbm90ZXM/OiBzdHJpbmc7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJFU1BPTlNFIFRZUEVTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRtaW5BY3Rpb25SZXNwb25zZSB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIG1lc3NhZ2U6IHN0cmluZztcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVVNFUiBNVVRBVElPTlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBVcGRhdGUgdXNlciAoYWRtaW4pXG4gKlxuICogQGVuZHBvaW50IFBVVCAvYXBpL3YxL2FkbWluL3VzZXJzL3tpZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUFkbWluVXBkYXRlVXNlcihcbiAgb3B0aW9ucz86IE9taXQ8XG4gICAgVXNlTXV0YXRpb25PcHRpb25zPFVzZXJSZXNwb25zZSwgRXJyb3IsIHsgaWQ6IHN0cmluZzsgZGF0YTogQWRtaW5VcGRhdGVVc2VyUmVxdWVzdCB9PixcbiAgICAnbXV0YXRpb25GbidcbiAgPlxuKTogVXNlTXV0YXRpb25SZXN1bHQ8VXNlclJlc3BvbnNlLCBFcnJvciwgeyBpZDogc3RyaW5nOyBkYXRhOiBBZG1pblVwZGF0ZVVzZXJSZXF1ZXN0IH0+IHtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpO1xuXG4gIHJldHVybiB1c2VNdXRhdGlvbih7XG4gICAgbXV0YXRpb25GbjogYXN5bmMgKHtcbiAgICAgIGlkLFxuICAgICAgZGF0YSxcbiAgICB9OiB7XG4gICAgICBpZDogc3RyaW5nO1xuICAgICAgZGF0YTogQWRtaW5VcGRhdGVVc2VyUmVxdWVzdDtcbiAgICB9KTogUHJvbWlzZTxVc2VyUmVzcG9uc2U+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQucHV0PFVzZXJSZXNwb25zZT4oYC9hcGkvdjEvYWRtaW4vdXNlcnMvJHtpZH1gLCBkYXRhKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICAgIH0sXG4gICAgb25TdWNjZXNzOiAoXywgdmFyaWFibGVzKSA9PiB7XG4gICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7IHF1ZXJ5S2V5OiBhZG1pbktleXMudXNlcnMuZGV0YWlsKHZhcmlhYmxlcy5pZCkgfSk7XG4gICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7IHF1ZXJ5S2V5OiBhZG1pbktleXMudXNlcnMubGlzdCgpIH0pO1xuICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoeyBxdWVyeUtleTogYWRtaW5LZXlzLmRhc2hib2FyZCgpIH0pO1xuICAgIH0sXG4gICAgLi4ub3B0aW9ucyxcbiAgfSk7XG59XG5cbi8qKlxuICogU3VzcGVuZCB1c2VyIChhZG1pbilcbiAqXG4gKiBAZW5kcG9pbnQgUE9TVCAvYXBpL3YxL2FkbWluL3VzZXJzL3tpZH0vc3VzcGVuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQWRtaW5TdXNwZW5kVXNlcihcbiAgb3B0aW9ucz86IE9taXQ8XG4gICAgVXNlTXV0YXRpb25PcHRpb25zPEFkbWluQWN0aW9uUmVzcG9uc2UsIEVycm9yLCB7IGlkOiBzdHJpbmc7IHJlYXNvbj86IHN0cmluZyB9PixcbiAgICAnbXV0YXRpb25GbidcbiAgPlxuKTogVXNlTXV0YXRpb25SZXN1bHQ8QWRtaW5BY3Rpb25SZXNwb25zZSwgRXJyb3IsIHsgaWQ6IHN0cmluZzsgcmVhc29uPzogc3RyaW5nIH0+IHtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpO1xuXG4gIHJldHVybiB1c2VNdXRhdGlvbih7XG4gICAgbXV0YXRpb25GbjogYXN5bmMgKHtcbiAgICAgIGlkLFxuICAgICAgcmVhc29uLFxuICAgIH06IHtcbiAgICAgIGlkOiBzdHJpbmc7XG4gICAgICByZWFzb24/OiBzdHJpbmc7XG4gICAgfSk6IFByb21pc2U8QWRtaW5BY3Rpb25SZXNwb25zZT4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0PEFkbWluQWN0aW9uUmVzcG9uc2U+KFxuICAgICAgICBgL2FwaS92MS9hZG1pbi91c2Vycy8ke2lkfS9zdXNwZW5kYCxcbiAgICAgICAgeyByZWFzb24gfVxuICAgICAgKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICAgIH0sXG4gICAgb25TdWNjZXNzOiAoXywgdmFyaWFibGVzKSA9PiB7XG4gICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7IHF1ZXJ5S2V5OiBhZG1pbktleXMudXNlcnMuZGV0YWlsKHZhcmlhYmxlcy5pZCkgfSk7XG4gICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7IHF1ZXJ5S2V5OiBhZG1pbktleXMudXNlcnMubGlzdCgpIH0pO1xuICAgIH0sXG4gICAgLi4ub3B0aW9ucyxcbiAgfSk7XG59XG5cbi8qKlxuICogQWN0aXZhdGUgdXNlciAoYWRtaW4pXG4gKlxuICogQGVuZHBvaW50IFBPU1QgL2FwaS92MS9hZG1pbi91c2Vycy97aWR9L2FjdGl2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VBZG1pbkFjdGl2YXRlVXNlcihcbiAgb3B0aW9ucz86IE9taXQ8VXNlTXV0YXRpb25PcHRpb25zPEFkbWluQWN0aW9uUmVzcG9uc2UsIEVycm9yLCBzdHJpbmc+LCAnbXV0YXRpb25Gbic+XG4pOiBVc2VNdXRhdGlvblJlc3VsdDxBZG1pbkFjdGlvblJlc3BvbnNlLCBFcnJvciwgc3RyaW5nPiB7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKTtcblxuICByZXR1cm4gdXNlTXV0YXRpb24oe1xuICAgIG11dGF0aW9uRm46IGFzeW5jIChpZDogc3RyaW5nKTogUHJvbWlzZTxBZG1pbkFjdGlvblJlc3BvbnNlPiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnBvc3Q8QWRtaW5BY3Rpb25SZXNwb25zZT4oXG4gICAgICAgIGAvYXBpL3YxL2FkbWluL3VzZXJzLyR7aWR9L2FjdGl2YXRlYFxuICAgICAgKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICAgIH0sXG4gICAgb25TdWNjZXNzOiAoXywgaWQpID0+IHtcbiAgICAgIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHsgcXVlcnlLZXk6IGFkbWluS2V5cy51c2Vycy5kZXRhaWwoaWQpIH0pO1xuICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoeyBxdWVyeUtleTogYWRtaW5LZXlzLnVzZXJzLmxpc3QoKSB9KTtcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIERlbGV0ZSB1c2VyIChhZG1pbilcbiAqXG4gKiBAZW5kcG9pbnQgREVMRVRFIC9hcGkvdjEvYWRtaW4vdXNlcnMve2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQWRtaW5EZWxldGVVc2VyKFxuICBvcHRpb25zPzogT21pdDxVc2VNdXRhdGlvbk9wdGlvbnM8QWRtaW5BY3Rpb25SZXNwb25zZSwgRXJyb3IsIHN0cmluZz4sICdtdXRhdGlvbkZuJz5cbik6IFVzZU11dGF0aW9uUmVzdWx0PEFkbWluQWN0aW9uUmVzcG9uc2UsIEVycm9yLCBzdHJpbmc+IHtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpO1xuXG4gIHJldHVybiB1c2VNdXRhdGlvbih7XG4gICAgbXV0YXRpb25GbjogYXN5bmMgKGlkOiBzdHJpbmcpOiBQcm9taXNlPEFkbWluQWN0aW9uUmVzcG9uc2U+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZGVsZXRlPEFkbWluQWN0aW9uUmVzcG9uc2U+KGAvYXBpL3YxL2FkbWluL3VzZXJzLyR7aWR9YCk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICB9LFxuICAgIG9uU3VjY2VzczogKCkgPT4ge1xuICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoeyBxdWVyeUtleTogYWRtaW5LZXlzLnVzZXJzLmxpc3QoKSB9KTtcbiAgICAgIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHsgcXVlcnlLZXk6IGFkbWluS2V5cy5kYXNoYm9hcmQoKSB9KTtcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBIVUIgTVVUQVRJT05TXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ3JlYXRlIGh1YiAoYWRtaW4pXG4gKlxuICogQGVuZHBvaW50IFBPU1QgL2FwaS92MS9hZG1pbi9odWJzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VBZG1pbkNyZWF0ZUh1YihcbiAgb3B0aW9ucz86IE9taXQ8VXNlTXV0YXRpb25PcHRpb25zPEh1YlJlc3BvbnNlLCBFcnJvciwgQ3JlYXRlSHViUmVxdWVzdD4sICdtdXRhdGlvbkZuJz5cbik6IFVzZU11dGF0aW9uUmVzdWx0PEh1YlJlc3BvbnNlLCBFcnJvciwgQ3JlYXRlSHViUmVxdWVzdD4ge1xuICBjb25zdCBxdWVyeUNsaWVudCA9IHVzZVF1ZXJ5Q2xpZW50KCk7XG5cbiAgcmV0dXJuIHVzZU11dGF0aW9uKHtcbiAgICBtdXRhdGlvbkZuOiBhc3luYyAoZGF0YTogQ3JlYXRlSHViUmVxdWVzdCk6IFByb21pc2U8SHViUmVzcG9uc2U+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQucG9zdDxIdWJSZXNwb25zZT4oJy9hcGkvdjEvYWRtaW4vaHVicycsIGRhdGEpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gICAgfSxcbiAgICBvblN1Y2Nlc3M6ICgpID0+IHtcbiAgICAgIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHsgcXVlcnlLZXk6IGFkbWluS2V5cy5odWJzLmxpc3QoKSB9KTtcbiAgICAgIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHsgcXVlcnlLZXk6IGFkbWluS2V5cy5kYXNoYm9hcmQoKSB9KTtcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBodWIgKGFkbWluKVxuICpcbiAqIEBlbmRwb2ludCBQVVQgL2FwaS92MS9hZG1pbi9odWJzL3tpZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUFkbWluVXBkYXRlSHViKFxuICBvcHRpb25zPzogT21pdDxcbiAgICBVc2VNdXRhdGlvbk9wdGlvbnM8SHViUmVzcG9uc2UsIEVycm9yLCB7IGlkOiBzdHJpbmc7IGRhdGE6IFVwZGF0ZUh1YlJlcXVlc3QgfT4sXG4gICAgJ211dGF0aW9uRm4nXG4gID5cbik6IFVzZU11dGF0aW9uUmVzdWx0PEh1YlJlc3BvbnNlLCBFcnJvciwgeyBpZDogc3RyaW5nOyBkYXRhOiBVcGRhdGVIdWJSZXF1ZXN0IH0+IHtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpO1xuXG4gIHJldHVybiB1c2VNdXRhdGlvbih7XG4gICAgbXV0YXRpb25GbjogYXN5bmMgKHtcbiAgICAgIGlkLFxuICAgICAgZGF0YSxcbiAgICB9OiB7XG4gICAgICBpZDogc3RyaW5nO1xuICAgICAgZGF0YTogVXBkYXRlSHViUmVxdWVzdDtcbiAgICB9KTogUHJvbWlzZTxIdWJSZXNwb25zZT4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wdXQ8SHViUmVzcG9uc2U+KGAvYXBpL3YxL2FkbWluL2h1YnMvJHtpZH1gLCBkYXRhKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICAgIH0sXG4gICAgb25TdWNjZXNzOiAoXywgdmFyaWFibGVzKSA9PiB7XG4gICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7IHF1ZXJ5S2V5OiBhZG1pbktleXMuaHVicy5kZXRhaWwodmFyaWFibGVzLmlkKSB9KTtcbiAgICAgIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHsgcXVlcnlLZXk6IGFkbWluS2V5cy5odWJzLmxpc3QoKSB9KTtcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIERlbGV0ZSBodWIgKGFkbWluKVxuICpcbiAqIEBlbmRwb2ludCBERUxFVEUgL2FwaS92MS9hZG1pbi9odWJzL3tpZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUFkbWluRGVsZXRlSHViKFxuICBvcHRpb25zPzogT21pdDxVc2VNdXRhdGlvbk9wdGlvbnM8QWRtaW5BY3Rpb25SZXNwb25zZSwgRXJyb3IsIHN0cmluZz4sICdtdXRhdGlvbkZuJz5cbik6IFVzZU11dGF0aW9uUmVzdWx0PEFkbWluQWN0aW9uUmVzcG9uc2UsIEVycm9yLCBzdHJpbmc+IHtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpO1xuXG4gIHJldHVybiB1c2VNdXRhdGlvbih7XG4gICAgbXV0YXRpb25GbjogYXN5bmMgKGlkOiBzdHJpbmcpOiBQcm9taXNlPEFkbWluQWN0aW9uUmVzcG9uc2U+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZGVsZXRlPEFkbWluQWN0aW9uUmVzcG9uc2U+KGAvYXBpL3YxL2FkbWluL2h1YnMvJHtpZH1gKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICAgIH0sXG4gICAgb25TdWNjZXNzOiAoKSA9PiB7XG4gICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7IHF1ZXJ5S2V5OiBhZG1pbktleXMuaHVicy5saXN0KCkgfSk7XG4gICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7IHF1ZXJ5S2V5OiBhZG1pbktleXMuZGFzaGJvYXJkKCkgfSk7XG4gICAgfSxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRVZFTlQgTVVUQVRJT05TXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogVXBkYXRlIGV2ZW50IChhZG1pbilcbiAqXG4gKiBAZW5kcG9pbnQgUFVUIC9hcGkvdjEvYWRtaW4vZXZlbnRzL3tpZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUFkbWluVXBkYXRlRXZlbnQoXG4gIG9wdGlvbnM/OiBPbWl0PFxuICAgIFVzZU11dGF0aW9uT3B0aW9uczxFdmVudFJlc3BvbnNlLCBFcnJvciwgeyBpZDogc3RyaW5nOyBkYXRhOiBVcGRhdGVFdmVudFJlcXVlc3QgfT4sXG4gICAgJ211dGF0aW9uRm4nXG4gID5cbik6IFVzZU11dGF0aW9uUmVzdWx0PEV2ZW50UmVzcG9uc2UsIEVycm9yLCB7IGlkOiBzdHJpbmc7IGRhdGE6IFVwZGF0ZUV2ZW50UmVxdWVzdCB9PiB7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKTtcblxuICByZXR1cm4gdXNlTXV0YXRpb24oe1xuICAgIG11dGF0aW9uRm46IGFzeW5jICh7XG4gICAgICBpZCxcbiAgICAgIGRhdGEsXG4gICAgfToge1xuICAgICAgaWQ6IHN0cmluZztcbiAgICAgIGRhdGE6IFVwZGF0ZUV2ZW50UmVxdWVzdDtcbiAgICB9KTogUHJvbWlzZTxFdmVudFJlc3BvbnNlPiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnB1dDxFdmVudFJlc3BvbnNlPihgL2FwaS92MS9hZG1pbi9ldmVudHMvJHtpZH1gLCBkYXRhKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICAgIH0sXG4gICAgb25TdWNjZXNzOiAoXywgdmFyaWFibGVzKSA9PiB7XG4gICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7IHF1ZXJ5S2V5OiBhZG1pbktleXMuZXZlbnRzLmRldGFpbCh2YXJpYWJsZXMuaWQpIH0pO1xuICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoeyBxdWVyeUtleTogYWRtaW5LZXlzLmV2ZW50cy5saXN0KCkgfSk7XG4gICAgfSxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cblxuLyoqXG4gKiBDYW5jZWwgZXZlbnQgKGFkbWluKVxuICpcbiAqIEBlbmRwb2ludCBQT1NUIC9hcGkvdjEvYWRtaW4vZXZlbnRzL3tpZH0vY2FuY2VsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VBZG1pbkNhbmNlbEV2ZW50KFxuICBvcHRpb25zPzogT21pdDxcbiAgICBVc2VNdXRhdGlvbk9wdGlvbnM8QWRtaW5BY3Rpb25SZXNwb25zZSwgRXJyb3IsIHsgaWQ6IHN0cmluZzsgcmVhc29uPzogc3RyaW5nIH0+LFxuICAgICdtdXRhdGlvbkZuJ1xuICA+XG4pOiBVc2VNdXRhdGlvblJlc3VsdDxBZG1pbkFjdGlvblJlc3BvbnNlLCBFcnJvciwgeyBpZDogc3RyaW5nOyByZWFzb24/OiBzdHJpbmcgfT4ge1xuICBjb25zdCBxdWVyeUNsaWVudCA9IHVzZVF1ZXJ5Q2xpZW50KCk7XG5cbiAgcmV0dXJuIHVzZU11dGF0aW9uKHtcbiAgICBtdXRhdGlvbkZuOiBhc3luYyAoe1xuICAgICAgaWQsXG4gICAgICByZWFzb24sXG4gICAgfToge1xuICAgICAgaWQ6IHN0cmluZztcbiAgICAgIHJlYXNvbj86IHN0cmluZztcbiAgICB9KTogUHJvbWlzZTxBZG1pbkFjdGlvblJlc3BvbnNlPiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnBvc3Q8QWRtaW5BY3Rpb25SZXNwb25zZT4oXG4gICAgICAgIGAvYXBpL3YxL2FkbWluL2V2ZW50cy8ke2lkfS9jYW5jZWxgLFxuICAgICAgICB7IHJlYXNvbiB9XG4gICAgICApO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gICAgfSxcbiAgICBvblN1Y2Nlc3M6IChfLCB2YXJpYWJsZXMpID0+IHtcbiAgICAgIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHsgcXVlcnlLZXk6IGFkbWluS2V5cy5ldmVudHMuZGV0YWlsKHZhcmlhYmxlcy5pZCkgfSk7XG4gICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7IHF1ZXJ5S2V5OiBhZG1pbktleXMuZXZlbnRzLmxpc3QoKSB9KTtcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBCVVNJTkVTUyBNVVRBVElPTlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBWZXJpZnkgYnVzaW5lc3MgKGFkbWluKVxuICpcbiAqIEBlbmRwb2ludCBQT1NUIC9hcGkvdjEvYWRtaW4vYnVzaW5lc3Nlcy97aWR9L3ZlcmlmeVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQWRtaW5WZXJpZnlCdXNpbmVzcyhcbiAgb3B0aW9ucz86IE9taXQ8XG4gICAgVXNlTXV0YXRpb25PcHRpb25zPFxuICAgICAgQnVzaW5lc3NSZXNwb25zZSxcbiAgICAgIEVycm9yLFxuICAgICAgeyBpZDogc3RyaW5nOyBkYXRhOiBBZG1pblZlcmlmeUJ1c2luZXNzUmVxdWVzdCB9XG4gICAgPixcbiAgICAnbXV0YXRpb25GbidcbiAgPlxuKTogVXNlTXV0YXRpb25SZXN1bHQ8XG4gIEJ1c2luZXNzUmVzcG9uc2UsXG4gIEVycm9yLFxuICB7IGlkOiBzdHJpbmc7IGRhdGE6IEFkbWluVmVyaWZ5QnVzaW5lc3NSZXF1ZXN0IH1cbj4ge1xuICBjb25zdCBxdWVyeUNsaWVudCA9IHVzZVF1ZXJ5Q2xpZW50KCk7XG5cbiAgcmV0dXJuIHVzZU11dGF0aW9uKHtcbiAgICBtdXRhdGlvbkZuOiBhc3luYyAoe1xuICAgICAgaWQsXG4gICAgICBkYXRhLFxuICAgIH06IHtcbiAgICAgIGlkOiBzdHJpbmc7XG4gICAgICBkYXRhOiBBZG1pblZlcmlmeUJ1c2luZXNzUmVxdWVzdDtcbiAgICB9KTogUHJvbWlzZTxCdXNpbmVzc1Jlc3BvbnNlPiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnBvc3Q8QnVzaW5lc3NSZXNwb25zZT4oXG4gICAgICAgIGAvYXBpL3YxL2FkbWluL2J1c2luZXNzZXMvJHtpZH0vdmVyaWZ5YCxcbiAgICAgICAgZGF0YVxuICAgICAgKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICAgIH0sXG4gICAgb25TdWNjZXNzOiAoXywgdmFyaWFibGVzKSA9PiB7XG4gICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7XG4gICAgICAgIHF1ZXJ5S2V5OiBhZG1pbktleXMuYnVzaW5lc3Nlcy5kZXRhaWwodmFyaWFibGVzLmlkKSxcbiAgICAgIH0pO1xuICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoeyBxdWVyeUtleTogYWRtaW5LZXlzLmJ1c2luZXNzZXMubGlzdCgpIH0pO1xuICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoeyBxdWVyeUtleTogYWRtaW5LZXlzLmRhc2hib2FyZCgpIH0pO1xuICAgIH0sXG4gICAgLi4ub3B0aW9ucyxcbiAgfSk7XG59XG5cbi8qKlxuICogRGVsZXRlIGJ1c2luZXNzIChhZG1pbilcbiAqXG4gKiBAZW5kcG9pbnQgREVMRVRFIC9hcGkvdjEvYWRtaW4vYnVzaW5lc3Nlcy97aWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VBZG1pbkRlbGV0ZUJ1c2luZXNzKFxuICBvcHRpb25zPzogT21pdDxVc2VNdXRhdGlvbk9wdGlvbnM8QWRtaW5BY3Rpb25SZXNwb25zZSwgRXJyb3IsIHN0cmluZz4sICdtdXRhdGlvbkZuJz5cbik6IFVzZU11dGF0aW9uUmVzdWx0PEFkbWluQWN0aW9uUmVzcG9uc2UsIEVycm9yLCBzdHJpbmc+IHtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpO1xuXG4gIHJldHVybiB1c2VNdXRhdGlvbih7XG4gICAgbXV0YXRpb25GbjogYXN5bmMgKGlkOiBzdHJpbmcpOiBQcm9taXNlPEFkbWluQWN0aW9uUmVzcG9uc2U+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZGVsZXRlPEFkbWluQWN0aW9uUmVzcG9uc2U+KFxuICAgICAgICBgL2FwaS92MS9hZG1pbi9idXNpbmVzc2VzLyR7aWR9YFxuICAgICAgKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICAgIH0sXG4gICAgb25TdWNjZXNzOiAoKSA9PiB7XG4gICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7IHF1ZXJ5S2V5OiBhZG1pbktleXMuYnVzaW5lc3Nlcy5saXN0KCkgfSk7XG4gICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7IHF1ZXJ5S2V5OiBhZG1pbktleXMuZGFzaGJvYXJkKCkgfSk7XG4gICAgfSxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ09OVEVOVCBNVVRBVElPTlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBDcmVhdGUgY29udGVudCAoYWRtaW4pXG4gKlxuICogQGVuZHBvaW50IFBPU1QgL2FwaS92MS9hZG1pbi9jb250ZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VBZG1pbkNyZWF0ZUNvbnRlbnQoXG4gIG9wdGlvbnM/OiBPbWl0PFxuICAgIFVzZU11dGF0aW9uT3B0aW9uczxMaWJyYXJ5Q29udGVudFJlc3BvbnNlLCBFcnJvciwgQWRtaW5DcmVhdGVDb250ZW50UmVxdWVzdD4sXG4gICAgJ211dGF0aW9uRm4nXG4gID5cbik6IFVzZU11dGF0aW9uUmVzdWx0PExpYnJhcnlDb250ZW50UmVzcG9uc2UsIEVycm9yLCBBZG1pbkNyZWF0ZUNvbnRlbnRSZXF1ZXN0PiB7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKTtcblxuICByZXR1cm4gdXNlTXV0YXRpb24oe1xuICAgIG11dGF0aW9uRm46IGFzeW5jIChkYXRhOiBBZG1pbkNyZWF0ZUNvbnRlbnRSZXF1ZXN0KTogUHJvbWlzZTxMaWJyYXJ5Q29udGVudFJlc3BvbnNlPiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnBvc3Q8TGlicmFyeUNvbnRlbnRSZXNwb25zZT4oXG4gICAgICAgICcvYXBpL3YxL2FkbWluL2NvbnRlbnQnLFxuICAgICAgICBkYXRhXG4gICAgICApO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gICAgfSxcbiAgICBvblN1Y2Nlc3M6ICgpID0+IHtcbiAgICAgIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHsgcXVlcnlLZXk6IGFkbWluS2V5cy5jb250ZW50Lmxpc3QoKSB9KTtcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBjb250ZW50IChhZG1pbilcbiAqXG4gKiBAZW5kcG9pbnQgUFVUIC9hcGkvdjEvYWRtaW4vY29udGVudC97aWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VBZG1pblVwZGF0ZUNvbnRlbnQoXG4gIG9wdGlvbnM/OiBPbWl0PFxuICAgIFVzZU11dGF0aW9uT3B0aW9uczxcbiAgICAgIExpYnJhcnlDb250ZW50UmVzcG9uc2UsXG4gICAgICBFcnJvcixcbiAgICAgIHsgaWQ6IHN0cmluZzsgZGF0YTogQWRtaW5VcGRhdGVDb250ZW50UmVxdWVzdCB9XG4gICAgPixcbiAgICAnbXV0YXRpb25GbidcbiAgPlxuKTogVXNlTXV0YXRpb25SZXN1bHQ8XG4gIExpYnJhcnlDb250ZW50UmVzcG9uc2UsXG4gIEVycm9yLFxuICB7IGlkOiBzdHJpbmc7IGRhdGE6IEFkbWluVXBkYXRlQ29udGVudFJlcXVlc3QgfVxuPiB7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKTtcblxuICByZXR1cm4gdXNlTXV0YXRpb24oe1xuICAgIG11dGF0aW9uRm46IGFzeW5jICh7XG4gICAgICBpZCxcbiAgICAgIGRhdGEsXG4gICAgfToge1xuICAgICAgaWQ6IHN0cmluZztcbiAgICAgIGRhdGE6IEFkbWluVXBkYXRlQ29udGVudFJlcXVlc3Q7XG4gICAgfSk6IFByb21pc2U8TGlicmFyeUNvbnRlbnRSZXNwb25zZT4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wdXQ8TGlicmFyeUNvbnRlbnRSZXNwb25zZT4oXG4gICAgICAgIGAvYXBpL3YxL2FkbWluL2NvbnRlbnQvJHtpZH1gLFxuICAgICAgICBkYXRhXG4gICAgICApO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gICAgfSxcbiAgICBvblN1Y2Nlc3M6IChfLCB2YXJpYWJsZXMpID0+IHtcbiAgICAgIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHsgcXVlcnlLZXk6IGFkbWluS2V5cy5jb250ZW50LmRldGFpbCh2YXJpYWJsZXMuaWQpIH0pO1xuICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoeyBxdWVyeUtleTogYWRtaW5LZXlzLmNvbnRlbnQubGlzdCgpIH0pO1xuICAgIH0sXG4gICAgLi4ub3B0aW9ucyxcbiAgfSk7XG59XG5cbi8qKlxuICogRGVsZXRlIGNvbnRlbnQgKGFkbWluKVxuICpcbiAqIEBlbmRwb2ludCBERUxFVEUgL2FwaS92MS9hZG1pbi9jb250ZW50L3tpZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUFkbWluRGVsZXRlQ29udGVudChcbiAgb3B0aW9ucz86IE9taXQ8VXNlTXV0YXRpb25PcHRpb25zPEFkbWluQWN0aW9uUmVzcG9uc2UsIEVycm9yLCBzdHJpbmc+LCAnbXV0YXRpb25Gbic+XG4pOiBVc2VNdXRhdGlvblJlc3VsdDxBZG1pbkFjdGlvblJlc3BvbnNlLCBFcnJvciwgc3RyaW5nPiB7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKTtcblxuICByZXR1cm4gdXNlTXV0YXRpb24oe1xuICAgIG11dGF0aW9uRm46IGFzeW5jIChpZDogc3RyaW5nKTogUHJvbWlzZTxBZG1pbkFjdGlvblJlc3BvbnNlPiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmRlbGV0ZTxBZG1pbkFjdGlvblJlc3BvbnNlPihcbiAgICAgICAgYC9hcGkvdjEvYWRtaW4vY29udGVudC8ke2lkfWBcbiAgICAgICk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICB9LFxuICAgIG9uU3VjY2VzczogKCkgPT4ge1xuICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoeyBxdWVyeUtleTogYWRtaW5LZXlzLmNvbnRlbnQubGlzdCgpIH0pO1xuICAgIH0sXG4gICAgLi4ub3B0aW9ucyxcbiAgfSk7XG59XG4iXX0=