camo-gemini 0.1.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 (139) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +242 -0
  3. package/dist/client/camofox-client.d.ts +21 -0
  4. package/dist/client/camofox-client.d.ts.map +1 -0
  5. package/dist/client/camofox-client.js +260 -0
  6. package/dist/client/camofox-client.js.map +1 -0
  7. package/dist/config.d.ts +3 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +94 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/core/browser-js.d.ts +27 -0
  12. package/dist/core/browser-js.d.ts.map +1 -0
  13. package/dist/core/browser-js.js +172 -0
  14. package/dist/core/browser-js.js.map +1 -0
  15. package/dist/core/constants.d.ts +78 -0
  16. package/dist/core/constants.d.ts.map +1 -0
  17. package/dist/core/constants.js +115 -0
  18. package/dist/core/constants.js.map +1 -0
  19. package/dist/core/error-messages.d.ts +8 -0
  20. package/dist/core/error-messages.d.ts.map +1 -0
  21. package/dist/core/error-messages.js +121 -0
  22. package/dist/core/error-messages.js.map +1 -0
  23. package/dist/core/failover.d.ts +21 -0
  24. package/dist/core/failover.d.ts.map +1 -0
  25. package/dist/core/failover.js +47 -0
  26. package/dist/core/failover.js.map +1 -0
  27. package/dist/core/logger.d.ts +13 -0
  28. package/dist/core/logger.d.ts.map +1 -0
  29. package/dist/core/logger.js +37 -0
  30. package/dist/core/logger.js.map +1 -0
  31. package/dist/core/request-builder.d.ts +20 -0
  32. package/dist/core/request-builder.d.ts.map +1 -0
  33. package/dist/core/request-builder.js +210 -0
  34. package/dist/core/request-builder.js.map +1 -0
  35. package/dist/core/response-parser.d.ts +12 -0
  36. package/dist/core/response-parser.d.ts.map +1 -0
  37. package/dist/core/response-parser.js +221 -0
  38. package/dist/core/response-parser.js.map +1 -0
  39. package/dist/core/retry.d.ts +10 -0
  40. package/dist/core/retry.d.ts.map +1 -0
  41. package/dist/core/retry.js +132 -0
  42. package/dist/core/retry.js.map +1 -0
  43. package/dist/core/stream-parser.d.ts +9 -0
  44. package/dist/core/stream-parser.d.ts.map +1 -0
  45. package/dist/core/stream-parser.js +69 -0
  46. package/dist/core/stream-parser.js.map +1 -0
  47. package/dist/core/token-manager.d.ts +9 -0
  48. package/dist/core/token-manager.d.ts.map +1 -0
  49. package/dist/core/token-manager.js +64 -0
  50. package/dist/core/token-manager.js.map +1 -0
  51. package/dist/core/utils.d.ts +2 -0
  52. package/dist/core/utils.d.ts.map +1 -0
  53. package/dist/core/utils.js +15 -0
  54. package/dist/core/utils.js.map +1 -0
  55. package/dist/dashboard/server.d.ts +31 -0
  56. package/dist/dashboard/server.d.ts.map +1 -0
  57. package/dist/dashboard/server.js +190 -0
  58. package/dist/dashboard/server.js.map +1 -0
  59. package/dist/errors.d.ts +32 -0
  60. package/dist/errors.d.ts.map +1 -0
  61. package/dist/errors.js +59 -0
  62. package/dist/errors.js.map +1 -0
  63. package/dist/index.d.ts +3 -0
  64. package/dist/index.d.ts.map +1 -0
  65. package/dist/index.js +36 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/server.d.ts +31 -0
  68. package/dist/server.d.ts.map +1 -0
  69. package/dist/server.js +54 -0
  70. package/dist/server.js.map +1 -0
  71. package/dist/services/account.d.ts +16 -0
  72. package/dist/services/account.d.ts.map +1 -0
  73. package/dist/services/account.js +55 -0
  74. package/dist/services/account.js.map +1 -0
  75. package/dist/services/auth.d.ts +39 -0
  76. package/dist/services/auth.d.ts.map +1 -0
  77. package/dist/services/auth.js +285 -0
  78. package/dist/services/auth.js.map +1 -0
  79. package/dist/services/chat.d.ts +18 -0
  80. package/dist/services/chat.d.ts.map +1 -0
  81. package/dist/services/chat.js +151 -0
  82. package/dist/services/chat.js.map +1 -0
  83. package/dist/services/cookie-rotation.d.ts +25 -0
  84. package/dist/services/cookie-rotation.d.ts.map +1 -0
  85. package/dist/services/cookie-rotation.js +138 -0
  86. package/dist/services/cookie-rotation.js.map +1 -0
  87. package/dist/services/gems.d.ts +33 -0
  88. package/dist/services/gems.d.ts.map +1 -0
  89. package/dist/services/gems.js +202 -0
  90. package/dist/services/gems.js.map +1 -0
  91. package/dist/services/generate.d.ts +27 -0
  92. package/dist/services/generate.d.ts.map +1 -0
  93. package/dist/services/generate.js +149 -0
  94. package/dist/services/generate.js.map +1 -0
  95. package/dist/services/health.d.ts +20 -0
  96. package/dist/services/health.d.ts.map +1 -0
  97. package/dist/services/health.js +77 -0
  98. package/dist/services/health.js.map +1 -0
  99. package/dist/services/upload.d.ts +17 -0
  100. package/dist/services/upload.d.ts.map +1 -0
  101. package/dist/services/upload.js +120 -0
  102. package/dist/services/upload.js.map +1 -0
  103. package/dist/setup.d.ts +7 -0
  104. package/dist/setup.d.ts.map +1 -0
  105. package/dist/setup.js +165 -0
  106. package/dist/setup.js.map +1 -0
  107. package/dist/state.d.ts +57 -0
  108. package/dist/state.d.ts.map +1 -0
  109. package/dist/state.js +260 -0
  110. package/dist/state.js.map +1 -0
  111. package/dist/tools/account.d.ts +4 -0
  112. package/dist/tools/account.d.ts.map +1 -0
  113. package/dist/tools/account.js +29 -0
  114. package/dist/tools/account.js.map +1 -0
  115. package/dist/tools/auth.d.ts +4 -0
  116. package/dist/tools/auth.d.ts.map +1 -0
  117. package/dist/tools/auth.js +56 -0
  118. package/dist/tools/auth.js.map +1 -0
  119. package/dist/tools/chat.d.ts +4 -0
  120. package/dist/tools/chat.d.ts.map +1 -0
  121. package/dist/tools/chat.js +101 -0
  122. package/dist/tools/chat.js.map +1 -0
  123. package/dist/tools/gems.d.ts +4 -0
  124. package/dist/tools/gems.d.ts.map +1 -0
  125. package/dist/tools/gems.js +93 -0
  126. package/dist/tools/gems.js.map +1 -0
  127. package/dist/tools/health.d.ts +4 -0
  128. package/dist/tools/health.d.ts.map +1 -0
  129. package/dist/tools/health.js +13 -0
  130. package/dist/tools/health.js.map +1 -0
  131. package/dist/tools/media.d.ts +4 -0
  132. package/dist/tools/media.d.ts.map +1 -0
  133. package/dist/tools/media.js +65 -0
  134. package/dist/tools/media.js.map +1 -0
  135. package/dist/types.d.ts +292 -0
  136. package/dist/types.d.ts.map +1 -0
  137. package/dist/types.js +2 -0
  138. package/dist/types.js.map +1 -0
  139. package/package.json +66 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ interface GenerateExpressionParams {
2
+ url: string;
3
+ headers: Record<string, string>;
4
+ body: string;
5
+ bardActivityUrl: string;
6
+ bardActivityHeaders: Record<string, string>;
7
+ bardActivityBody: string;
8
+ }
9
+ interface BatchExpressionParams {
10
+ url: string;
11
+ headers: Record<string, string>;
12
+ body: string;
13
+ }
14
+ interface UploadFinalizeExpressionParams {
15
+ uploadId: string;
16
+ filename: string;
17
+ mimeType: string;
18
+ uploadUrl: string;
19
+ snlm0e: string;
20
+ accountIndex: number;
21
+ }
22
+ export declare function buildGenerateExpression(params: GenerateExpressionParams): string;
23
+ export declare function buildBatchExpression(params: BatchExpressionParams): string;
24
+ export declare function buildUploadChunkPushExpression(uploadId: string, chunk: string, chunkIndex: number): string;
25
+ export declare function buildUploadFinalizeExpression(params: UploadFinalizeExpressionParams): string;
26
+ export {};
27
+ //# sourceMappingURL=browser-js.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-js.d.ts","sourceRoot":"","sources":["../../src/core/browser-js.ts"],"names":[],"mappings":"AAEA,UAAU,wBAAwB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,UAAU,qBAAqB;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,8BAA8B;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB;AAaD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,wBAAwB,GAAG,MAAM,CA0ChF;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM,CA4B1E;AAED,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAM1G;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,8BAA8B,GAAG,MAAM,CAsF5F"}
@@ -0,0 +1,172 @@
1
+ const MAX_EXPRESSION_BYTES = 64 * 1024;
2
+ function assertExpressionSize(expression) {
3
+ const size = Buffer.byteLength(expression, "utf8");
4
+ if (size > MAX_EXPRESSION_BYTES) {
5
+ throw new Error(`Browser expression exceeds 64KB (${size} bytes)`);
6
+ }
7
+ }
8
+ function quote(value) {
9
+ return JSON.stringify(value);
10
+ }
11
+ export function buildGenerateExpression(params) {
12
+ const expression = `(async () => {
13
+ const bardActivityUrl = ${quote(params.bardActivityUrl)};
14
+ const bardActivityHeaders = ${quote(params.bardActivityHeaders)};
15
+ const bardActivityBody = ${quote(params.bardActivityBody)};
16
+ const url = ${quote(params.url)};
17
+ const headers = ${quote(params.headers)};
18
+ const body = ${quote(params.body)};
19
+
20
+ try {
21
+ const bardRes = await fetch(bardActivityUrl, {
22
+ method: 'POST',
23
+ headers: bardActivityHeaders,
24
+ body: bardActivityBody,
25
+ credentials: 'include'
26
+ });
27
+
28
+ if (!bardRes.ok) {
29
+ return { ok: false, error: 'BARD_ACTIVITY failed: ' + bardRes.status };
30
+ }
31
+
32
+ const res = await fetch(url, {
33
+ method: 'POST',
34
+ headers,
35
+ body,
36
+ credentials: 'include'
37
+ });
38
+
39
+ if (!res.ok) {
40
+ return { ok: false, error: 'StreamGenerate failed: ' + res.status };
41
+ }
42
+
43
+ const text = await res.text();
44
+ return { ok: true, data: text };
45
+ } catch (error) {
46
+ const message = error instanceof Error ? error.message : String(error);
47
+ return { ok: false, error: message };
48
+ }
49
+ })()`;
50
+ assertExpressionSize(expression);
51
+ return expression;
52
+ }
53
+ export function buildBatchExpression(params) {
54
+ const expression = `(async () => {
55
+ const url = ${quote(params.url)};
56
+ const headers = ${quote(params.headers)};
57
+ const body = ${quote(params.body)};
58
+
59
+ try {
60
+ const res = await fetch(url, {
61
+ method: 'POST',
62
+ headers,
63
+ body,
64
+ credentials: 'include'
65
+ });
66
+
67
+ if (!res.ok) {
68
+ return { ok: false, error: 'BatchExecute failed: ' + res.status };
69
+ }
70
+
71
+ const text = await res.text();
72
+ return { ok: true, data: text };
73
+ } catch (error) {
74
+ const message = error instanceof Error ? error.message : String(error);
75
+ return { ok: false, error: message };
76
+ }
77
+ })()`;
78
+ assertExpressionSize(expression);
79
+ return expression;
80
+ }
81
+ export function buildUploadChunkPushExpression(uploadId, chunk, chunkIndex) {
82
+ const globalKey = `__cg_upload_${uploadId}`;
83
+ const expression = `(window[${quote(globalKey)}] = window[${quote(globalKey)}] || []).push(${quote(chunk)}); void ${quote(chunkIndex)}; true`;
84
+ assertExpressionSize(expression);
85
+ return expression;
86
+ }
87
+ export function buildUploadFinalizeExpression(params) {
88
+ const globalKey = `__cg_upload_${params.uploadId}`;
89
+ const expression = `(async () => {
90
+ const globalKey = ${quote(globalKey)};
91
+ const uploadUrl = ${quote(params.uploadUrl)};
92
+ const filename = ${quote(params.filename)};
93
+ const mimeType = ${quote(params.mimeType)};
94
+ const snlm0e = ${quote(params.snlm0e)};
95
+ const accountIndex = ${quote(params.accountIndex)};
96
+
97
+ try {
98
+ const chunks = window[globalKey];
99
+ if (!Array.isArray(chunks)) {
100
+ return { ok: false, error: 'Missing upload chunks' };
101
+ }
102
+
103
+ const base64 = chunks.join('');
104
+ const binary = atob(base64);
105
+ const bytes = new Uint8Array(binary.length);
106
+ for (let i = 0; i < binary.length; i++) {
107
+ bytes[i] = binary.charCodeAt(i);
108
+ }
109
+
110
+ const separator = uploadUrl.includes('?') ? '&' : '?';
111
+ const startUrl = uploadUrl + separator + 'authuser=' + encodeURIComponent(String(accountIndex)) + '&at=' + encodeURIComponent(snlm0e);
112
+
113
+ const startHeaders = {
114
+ Origin: 'https://gemini.google.com',
115
+ Referer: 'https://gemini.google.com/',
116
+ 'Push-ID': 'feeds/mcudyrk2a4khkz',
117
+ 'X-Goog-Upload-Command': 'start',
118
+ 'X-Goog-Upload-Protocol': 'resumable',
119
+ 'X-Goog-Upload-Header-Content-Length': String(bytes.byteLength),
120
+ 'X-Goog-Upload-Header-Content-Type': mimeType,
121
+ 'X-Tenant-ID': 'bard-storage'
122
+ };
123
+
124
+ const startRes = await fetch(startUrl, {
125
+ method: 'POST',
126
+ headers: startHeaders,
127
+ body: 'File name: ' + filename,
128
+ credentials: 'include'
129
+ });
130
+
131
+ if (!startRes.ok) {
132
+ return { ok: false, error: 'Upload start failed: ' + startRes.status };
133
+ }
134
+
135
+ const resumableUrl = startRes.headers.get('x-goog-upload-url');
136
+ if (!resumableUrl) {
137
+ return { ok: false, error: 'Missing x-goog-upload-url header' };
138
+ }
139
+
140
+ const finalizeHeaders = {
141
+ Origin: 'https://gemini.google.com',
142
+ Referer: 'https://gemini.google.com/',
143
+ 'Push-ID': 'feeds/mcudyrk2a4khkz',
144
+ 'X-Goog-Upload-Command': 'upload, finalize',
145
+ 'X-Goog-Upload-Offset': '0',
146
+ 'X-Tenant-ID': 'bard-storage'
147
+ };
148
+
149
+ const finalizeRes = await fetch(resumableUrl, {
150
+ method: 'POST',
151
+ headers: finalizeHeaders,
152
+ body: bytes,
153
+ credentials: 'include'
154
+ });
155
+
156
+ if (!finalizeRes.ok) {
157
+ return { ok: false, error: 'Upload finalize failed: ' + finalizeRes.status };
158
+ }
159
+
160
+ const responseText = await finalizeRes.text();
161
+ return { ok: true, data: responseText };
162
+ } catch (error) {
163
+ const message = error instanceof Error ? error.message : String(error);
164
+ return { ok: false, error: message };
165
+ } finally {
166
+ delete window[globalKey];
167
+ }
168
+ })()`;
169
+ assertExpressionSize(expression);
170
+ return expression;
171
+ }
172
+ //# sourceMappingURL=browser-js.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-js.js","sourceRoot":"","sources":["../../src/core/browser-js.ts"],"names":[],"mappings":"AAAA,MAAM,oBAAoB,GAAG,EAAE,GAAG,IAAI,CAAC;AA0BvC,SAAS,oBAAoB,CAAC,UAAkB;IAC9C,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACnD,IAAI,IAAI,GAAG,oBAAoB,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,oCAAoC,IAAI,SAAS,CAAC,CAAC;IACrE,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,KAAc;IAC3B,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAAgC;IACtE,MAAM,UAAU,GAAG;4BACO,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC;gCACzB,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC;6BACpC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC;gBAC3C,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;oBACb,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;iBACxB,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA+B9B,CAAC;IAEJ,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACjC,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAA6B;IAChE,MAAM,UAAU,GAAG;gBACL,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;oBACb,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;iBACxB,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;KAoB9B,CAAC;IAEJ,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACjC,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,QAAgB,EAAE,KAAa,EAAE,UAAkB;IAChG,MAAM,SAAS,GAAG,eAAe,QAAQ,EAAE,CAAC;IAC5C,MAAM,UAAU,GAAG,WAAW,KAAK,CAAC,SAAS,CAAC,cAAc,KAAK,CAAC,SAAS,CAAC,iBAAiB,KAAK,CAAC,KAAK,CAAC,WAAW,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC;IAE9I,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACjC,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,MAAsC;IAClF,MAAM,SAAS,GAAG,eAAe,MAAM,CAAC,QAAQ,EAAE,CAAC;IAEnD,MAAM,UAAU,GAAG;sBACC,KAAK,CAAC,SAAS,CAAC;sBAChB,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC;qBACxB,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;qBACtB,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;mBACxB,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;yBACd,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAyE9C,CAAC;IAEJ,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACjC,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,78 @@
1
+ import type { ChatMetadata } from "../types.js";
2
+ export declare const GEMINI_BASE = "https://gemini.google.com";
3
+ export declare const ANTI_XSSI_PREFIX = ")]}'";
4
+ export declare const UPLOAD_URL = "https://push.clients6.google.com/upload/";
5
+ export declare const MAX_UPLOAD_SIZE_BYTES: number;
6
+ export declare const LOGIN_INITIAL_DELAY_MS = 3000;
7
+ export declare const LOGIN_RETRY_DELAY_MS = 2000;
8
+ export declare const TOKEN_REFRESH_DELAY_MS = 3000;
9
+ export declare const TOKEN_VALIDITY_MS = 600000;
10
+ export declare const DEFAULT_MAX_RETRIES = 5;
11
+ export declare const DEFAULT_RETRY_DELAY_FACTOR = 5;
12
+ export declare const HEALTH_BACKOFF_BASE_MS = 30000;
13
+ export declare const HEALTH_BACKOFF_CAP_MS = 600000;
14
+ export declare function getAccountPrefix(accountIndex: number): string;
15
+ export declare const Endpoint: {
16
+ readonly GOOGLE: "https://www.google.com";
17
+ readonly INIT: (accountIndex?: number) => string;
18
+ readonly GENERATE: (accountIndex?: number) => string;
19
+ readonly BATCH_EXEC: (accountIndex?: number) => string;
20
+ readonly ROTATE_COOKIES: "https://accounts.google.com/RotateCookies";
21
+ readonly UPLOAD: (accountIndex?: number) => string;
22
+ readonly SOURCE_PATH: (accountIndex?: number) => string;
23
+ };
24
+ export declare const GrpcId: {
25
+ readonly LIST_CHATS: "MaZiqc";
26
+ readonly READ_CHAT: "hNvQHb";
27
+ readonly DELETE_CHAT: "GzXR5e";
28
+ readonly LIST_GEMS: "CNgdBe";
29
+ readonly CREATE_GEM: "oMH3Zd";
30
+ readonly UPDATE_GEM: "kHv0Vd";
31
+ readonly DELETE_GEM: "UXcSJb";
32
+ readonly BARD_ACTIVITY: "ESY5D";
33
+ };
34
+ export declare const GEMINI_HEADERS: {
35
+ readonly "Content-Type": "application/x-www-form-urlencoded;charset=utf-8";
36
+ readonly Origin: "https://gemini.google.com";
37
+ readonly Referer: "https://gemini.google.com/";
38
+ readonly "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36";
39
+ readonly "X-Same-Domain": "1";
40
+ };
41
+ export declare const ROTATE_COOKIES_HEADERS: {
42
+ readonly "Content-Type": "application/json";
43
+ };
44
+ export interface GeminiModelDef {
45
+ readonly name: string;
46
+ readonly header: Readonly<Record<string, string>>;
47
+ }
48
+ export declare const MODELS: Readonly<Record<string, GeminiModelDef>>;
49
+ export declare const MODEL_ALIASES: Readonly<Record<string, string>>;
50
+ export declare const API_ERROR_CODES: {
51
+ readonly TEMPORARY_ERROR_1013: 1013;
52
+ readonly USAGE_LIMIT_EXCEEDED: 1037;
53
+ readonly MODEL_INCONSISTENT: 1050;
54
+ readonly MODEL_HEADER_INVALID: 1052;
55
+ readonly IP_TEMPORARILY_BLOCKED: 1060;
56
+ };
57
+ export declare const RATE_LIMIT_PATTERNS: RegExp[];
58
+ export declare const IMAGE_GEN_BLOCKED_PATTERNS: RegExp[];
59
+ export declare const GOOGLE_USER_CONTENT_PATTERN: RegExp;
60
+ export declare const CARD_CONTENT_PATTERN: RegExp;
61
+ export declare const TOKEN_PATTERNS: {
62
+ readonly SNlM0e: RegExp;
63
+ readonly cfb2h: RegExp;
64
+ readonly FdrFJe: RegExp;
65
+ };
66
+ export declare const COOKIE_ROTATION_INTERVAL_MS = 540000;
67
+ export declare const COOKIE_NAMES: {
68
+ readonly PSID: "__Secure-1PSID";
69
+ readonly PSIDTS: "__Secure-1PSIDTS";
70
+ readonly PSIDCC: "__Secure-1PSIDCC";
71
+ };
72
+ export declare const DEFAULT_PARAMS: {
73
+ readonly bl: "boq_assistant-bard-web-server_20250601.00_p0";
74
+ readonly rt: "c";
75
+ };
76
+ export declare const INNER_REQ_LIST_SIZE = 73;
77
+ export declare const NEW_CHAT_METADATA: ChatMetadata;
78
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/core/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,eAAO,MAAM,WAAW,8BAA8B,CAAC;AACvD,eAAO,MAAM,gBAAgB,SAAS,CAAC;AACvC,eAAO,MAAM,UAAU,6CAA6C,CAAC;AACrE,eAAO,MAAM,qBAAqB,QAAmB,CAAC;AAGtD,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAC3C,eAAO,MAAM,oBAAoB,OAAO,CAAC;AACzC,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAC3C,eAAO,MAAM,iBAAiB,SAAU,CAAC;AAGzC,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAG5C,eAAO,MAAM,sBAAsB,QAAQ,CAAC;AAC5C,eAAO,MAAM,qBAAqB,SAAS,CAAC;AAE5C,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,eAAO,MAAM,QAAQ;;;;;;;;CASX,CAAC;AAEX,eAAO,MAAM,MAAM;;;;;;;;;CAST,CAAC;AAEX,eAAO,MAAM,cAAc;;;;;;CAMjB,CAAC;AAEX,eAAO,MAAM,sBAAsB;;CAEzB,CAAC;AAEX,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACnD;AAED,eAAO,MAAM,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAuBlD,CAAC;AAEX,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAIjD,CAAC;AAEX,eAAO,MAAM,eAAe;;;;;;CAMlB,CAAC;AAEX,eAAO,MAAM,mBAAmB,UAI/B,CAAC;AAEF,eAAO,MAAM,0BAA0B,UAMtC,CAAC;AAEF,eAAO,MAAM,2BAA2B,QAAkD,CAAC;AAC3F,eAAO,MAAM,oBAAoB,QAAwD,CAAC;AAE1F,eAAO,MAAM,cAAc;;;;CAIjB,CAAC;AAEX,eAAO,MAAM,2BAA2B,SAAU,CAAC;AAEnD,eAAO,MAAM,YAAY;;;;CAIf,CAAC;AAEX,eAAO,MAAM,cAAc;;;CAGjB,CAAC;AAEX,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAEtC,eAAO,MAAM,iBAAiB,EAAE,YAAmE,CAAC"}
@@ -0,0 +1,115 @@
1
+ export const GEMINI_BASE = "https://gemini.google.com";
2
+ export const ANTI_XSSI_PREFIX = ")]}'";
3
+ export const UPLOAD_URL = "https://push.clients6.google.com/upload/";
4
+ export const MAX_UPLOAD_SIZE_BYTES = 25 * 1024 * 1024;
5
+ // === Timing Constants ===
6
+ export const LOGIN_INITIAL_DELAY_MS = 3000;
7
+ export const LOGIN_RETRY_DELAY_MS = 2000;
8
+ export const TOKEN_REFRESH_DELAY_MS = 3000;
9
+ export const TOKEN_VALIDITY_MS = 600_000;
10
+ // === Retry Constants ===
11
+ export const DEFAULT_MAX_RETRIES = 5;
12
+ export const DEFAULT_RETRY_DELAY_FACTOR = 5;
13
+ // === Health Constants ===
14
+ export const HEALTH_BACKOFF_BASE_MS = 30000;
15
+ export const HEALTH_BACKOFF_CAP_MS = 600000;
16
+ export function getAccountPrefix(accountIndex) {
17
+ return accountIndex > 0 ? `/u/${accountIndex}` : "";
18
+ }
19
+ export const Endpoint = {
20
+ GOOGLE: "https://www.google.com",
21
+ INIT: (accountIndex = 0) => `${GEMINI_BASE}${getAccountPrefix(accountIndex)}/app`,
22
+ GENERATE: (accountIndex = 0) => `${GEMINI_BASE}${getAccountPrefix(accountIndex)}/_/BardChatUi/data/assistant.lamda.BardFrontendService/StreamGenerate`,
23
+ BATCH_EXEC: (accountIndex = 0) => `${GEMINI_BASE}${getAccountPrefix(accountIndex)}/_/BardChatUi/data/batchexecute`,
24
+ ROTATE_COOKIES: "https://accounts.google.com/RotateCookies",
25
+ UPLOAD: (accountIndex = 0) => `${UPLOAD_URL}?authuser=${accountIndex}`,
26
+ SOURCE_PATH: (accountIndex = 0) => `${getAccountPrefix(accountIndex)}/app`
27
+ };
28
+ export const GrpcId = {
29
+ LIST_CHATS: "MaZiqc",
30
+ READ_CHAT: "hNvQHb",
31
+ DELETE_CHAT: "GzXR5e",
32
+ LIST_GEMS: "CNgdBe",
33
+ CREATE_GEM: "oMH3Zd",
34
+ UPDATE_GEM: "kHv0Vd",
35
+ DELETE_GEM: "UXcSJb",
36
+ BARD_ACTIVITY: "ESY5D"
37
+ };
38
+ export const GEMINI_HEADERS = {
39
+ "Content-Type": "application/x-www-form-urlencoded;charset=utf-8",
40
+ Origin: "https://gemini.google.com",
41
+ Referer: "https://gemini.google.com/",
42
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36",
43
+ "X-Same-Domain": "1"
44
+ };
45
+ export const ROTATE_COOKIES_HEADERS = {
46
+ "Content-Type": "application/json"
47
+ };
48
+ export const MODELS = {
49
+ unspecified: {
50
+ name: "unspecified",
51
+ header: {}
52
+ },
53
+ "gemini-3.0-pro": {
54
+ name: "gemini-3.0-pro",
55
+ header: {
56
+ "x-goog-ext-525001261-jspb": '[1,null,null,null,"9d8ca3786ebdfbea",null,null,0,[4],null,null,1]'
57
+ }
58
+ },
59
+ "gemini-3.0-flash": {
60
+ name: "gemini-3.0-flash",
61
+ header: {
62
+ "x-goog-ext-525001261-jspb": '[1,null,null,null,"fbb127bbb056c959",null,null,0,[4],null,null,1]'
63
+ }
64
+ },
65
+ "gemini-3.0-flash-thinking": {
66
+ name: "gemini-3.0-flash-thinking",
67
+ header: {
68
+ "x-goog-ext-525001261-jspb": '[1,null,null,null,"5bf011840784117a",null,null,0,[4],null,null,1]'
69
+ }
70
+ }
71
+ };
72
+ export const MODEL_ALIASES = {
73
+ pro: "gemini-3.0-pro",
74
+ flash: "gemini-3.0-flash",
75
+ thinking: "gemini-3.0-flash-thinking"
76
+ };
77
+ export const API_ERROR_CODES = {
78
+ TEMPORARY_ERROR_1013: 1013,
79
+ USAGE_LIMIT_EXCEEDED: 1037,
80
+ MODEL_INCONSISTENT: 1050,
81
+ MODEL_HEADER_INVALID: 1052,
82
+ IP_TEMPORARILY_BLOCKED: 1060
83
+ };
84
+ export const RATE_LIMIT_PATTERNS = [
85
+ /I couldn't do that because I'm getting a lot of requests right now/i,
86
+ /I'm getting a lot of requests right now/i,
87
+ /Please try again later/i
88
+ ];
89
+ export const IMAGE_GEN_BLOCKED_PATTERNS = [
90
+ /Are you signed in\?.*(?:search for images|can't.*create)/i,
91
+ /can't seem to create any.*for you right now/i,
92
+ /image creation isn't available in your location/i,
93
+ /I can search for images, but can't.*create/i,
94
+ /can't (?:generate|create) (?:more |any )?images/i
95
+ ];
96
+ export const GOOGLE_USER_CONTENT_PATTERN = /http:\/\/googleusercontent\.com\/\w+\/\d+\n*/g;
97
+ export const CARD_CONTENT_PATTERN = /^http:\/\/googleusercontent\.com\/card_content\/\d+/;
98
+ export const TOKEN_PATTERNS = {
99
+ SNlM0e: /"SNlM0e":"(.*?)"/,
100
+ cfb2h: /"cfb2h":"(.*?)"/,
101
+ FdrFJe: /"FdrFJe":"(.*?)"/
102
+ };
103
+ export const COOKIE_ROTATION_INTERVAL_MS = 540_000;
104
+ export const COOKIE_NAMES = {
105
+ PSID: "__Secure-1PSID",
106
+ PSIDTS: "__Secure-1PSIDTS",
107
+ PSIDCC: "__Secure-1PSIDCC"
108
+ };
109
+ export const DEFAULT_PARAMS = {
110
+ bl: "boq_assistant-bard-web-server_20250601.00_p0",
111
+ rt: "c"
112
+ };
113
+ export const INNER_REQ_LIST_SIZE = 73;
114
+ export const NEW_CHAT_METADATA = ["", "", "", null, null, null, null, null, null, ""];
115
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/core/constants.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface FriendlyError {
2
+ code: string;
3
+ message: string;
4
+ suggestion: string;
5
+ }
6
+ export declare function getFriendlyError(error: Error): FriendlyError;
7
+ export declare function formatFriendlyError(error: Error): string;
8
+ //# sourceMappingURL=error-messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-messages.d.ts","sourceRoot":"","sources":["../../src/core/error-messages.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAmFD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,aAAa,CAyC5D;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAGxD"}
@@ -0,0 +1,121 @@
1
+ const errorCatalog = {
2
+ CAMOFOX_UNREACHABLE: {
3
+ code: "CAMOFOX_UNREACHABLE",
4
+ message: "Cannot connect to CamoFox browser",
5
+ suggestion: "Start CamoFox browser: cd camofox-browser && npm start"
6
+ },
7
+ AUTH_REQUIRED: {
8
+ code: "AUTH_REQUIRED",
9
+ message: "No active Gemini session. Please login first.",
10
+ suggestion: "Use gemini_login tool or add an account via gemini_add_account"
11
+ },
12
+ AUTH_FAILED: {
13
+ code: "AUTH_FAILED",
14
+ message: "Google login failed or session expired",
15
+ suggestion: "Try logging in again. Ensure your Google account has Gemini access."
16
+ },
17
+ TOKEN_EXTRACTION_FAILED: {
18
+ code: "TOKEN_EXTRACTION_FAILED",
19
+ message: "Failed to extract Gemini security tokens",
20
+ suggestion: "Session may have expired. Try logging out and back in."
21
+ },
22
+ RATE_LIMITED: {
23
+ code: "RATE_LIMITED",
24
+ message: "Gemini rate limit reached for this account",
25
+ suggestion: "Wait a moment or switch to a different account with gemini_add_account"
26
+ },
27
+ IMAGE_GEN_BLOCKED: {
28
+ code: "IMAGE_GEN_BLOCKED",
29
+ message: "Image generation is blocked for this account",
30
+ suggestion: "Try running gemini_logout then gemini_login to refresh your session. If the issue persists, image generation may require visiting gemini.google.com in a browser first to accept terms."
31
+ },
32
+ RETRY_EXHAUSTED: {
33
+ code: "RETRY_EXHAUSTED",
34
+ message: "Operation failed after multiple retries",
35
+ suggestion: "Check CamoFox browser status and network connectivity. If using multiple accounts, failover was attempted."
36
+ },
37
+ UPLOAD_TOO_LARGE: {
38
+ code: "UPLOAD_TOO_LARGE",
39
+ message: "File exceeds the 25MB upload limit",
40
+ suggestion: "Reduce file size or compress before uploading"
41
+ },
42
+ ACCOUNT_NOT_FOUND: {
43
+ code: "ACCOUNT_NOT_FOUND",
44
+ message: "The specified account is not registered",
45
+ suggestion: "Add the account first with gemini_add_account"
46
+ },
47
+ ACCOUNT_COOLDOWN: {
48
+ code: "ACCOUNT_COOLDOWN",
49
+ message: "This account is in cooldown due to repeated errors",
50
+ suggestion: "Wait for cooldown to expire or use a different account"
51
+ },
52
+ ALL_ACCOUNTS_UNHEALTHY: {
53
+ code: "ALL_ACCOUNTS_UNHEALTHY",
54
+ message: "No healthy accounts available for this operation",
55
+ suggestion: "Check account health with gemini_health. Login to additional accounts or wait for cooldowns to expire."
56
+ },
57
+ NETWORK_ERROR: {
58
+ code: "NETWORK_ERROR",
59
+ message: "Network connection error",
60
+ suggestion: "Check your internet connection and CamoFox browser status"
61
+ },
62
+ INVALID_RESPONSE: {
63
+ code: "INVALID_RESPONSE",
64
+ message: "Received unexpected response from Gemini",
65
+ suggestion: "This may be a temporary issue. Try again in a few seconds."
66
+ },
67
+ CHAT_SESSION_NOT_FOUND: {
68
+ code: "CHAT_SESSION_NOT_FOUND",
69
+ message: "Chat session not found",
70
+ suggestion: "Start a new chat with gemini_chat. Sessions are per-account."
71
+ },
72
+ GEM_NOT_FOUND: {
73
+ code: "GEM_NOT_FOUND",
74
+ message: "The specified Gem was not found",
75
+ suggestion: "List available Gems with gemini_list_gems"
76
+ }
77
+ };
78
+ export function getFriendlyError(error) {
79
+ const code = error.code;
80
+ if (code && errorCatalog[code]) {
81
+ return errorCatalog[code];
82
+ }
83
+ const msg = error.message.toLowerCase();
84
+ if (msg.includes("econnrefused") || msg.includes("fetch failed") || msg.includes("camofox")) {
85
+ return errorCatalog.CAMOFOX_UNREACHABLE;
86
+ }
87
+ if (msg.includes("not logged in") || msg.includes("no active session") || msg.includes("no session")) {
88
+ return errorCatalog.AUTH_REQUIRED;
89
+ }
90
+ if (msg.includes("rate limit") || msg.includes("429") || msg.includes("too many requests")) {
91
+ return errorCatalog.RATE_LIMITED;
92
+ }
93
+ if (msg.includes("retry") && msg.includes("exhausted")) {
94
+ return errorCatalog.RETRY_EXHAUSTED;
95
+ }
96
+ if (msg.includes("upload") && (msg.includes("large") || msg.includes("25mb") || msg.includes("size"))) {
97
+ return errorCatalog.UPLOAD_TOO_LARGE;
98
+ }
99
+ if (msg.includes("network") || msg.includes("failed to fetch") || msg.includes("networkerror")) {
100
+ return errorCatalog.NETWORK_ERROR;
101
+ }
102
+ if (msg.includes("account") && msg.includes("not registered")) {
103
+ return errorCatalog.ACCOUNT_NOT_FOUND;
104
+ }
105
+ if (msg.includes("cooldown")) {
106
+ return errorCatalog.ACCOUNT_COOLDOWN;
107
+ }
108
+ if (msg.includes("chat") && msg.includes("not found")) {
109
+ return errorCatalog.CHAT_SESSION_NOT_FOUND;
110
+ }
111
+ return {
112
+ code: "UNKNOWN",
113
+ message: error.message,
114
+ suggestion: "Check the error details and try again. Use gemini_health to check system status."
115
+ };
116
+ }
117
+ export function formatFriendlyError(error) {
118
+ const friendly = getFriendlyError(error);
119
+ return `Error: ${friendly.message}\nSuggestion: ${friendly.suggestion}`;
120
+ }
121
+ //# sourceMappingURL=error-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-messages.js","sourceRoot":"","sources":["../../src/core/error-messages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { StateManager } from "../state.js";
2
+ export interface FailoverOptions {
3
+ /** Account index to try first */
4
+ accountIndex: number;
5
+ /** Maximum failover attempts (default: 2) */
6
+ maxFailovers?: number;
7
+ }
8
+ export interface FailoverResult<T> {
9
+ result: T;
10
+ /** Account index that actually succeeded */
11
+ usedAccountIndex: number;
12
+ /** Number of failover attempts */
13
+ failoverCount: number;
14
+ }
15
+ /**
16
+ * Execute operation with automatic account failover.
17
+ * On retryable/rate_limited errors, tries next healthy account.
18
+ * On fatal errors, does NOT failover.
19
+ */
20
+ export declare function withFailover<T>(state: StateManager, options: FailoverOptions, operation: (accountIndex: number) => Promise<T>): Promise<FailoverResult<T>>;
21
+ //# sourceMappingURL=failover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"failover.d.ts","sourceRoot":"","sources":["../../src/core/failover.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAKhD,MAAM,WAAW,eAAe;IAC9B,iCAAiC;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,6CAA6C;IAC7C,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,MAAM,EAAE,CAAC,CAAC;IACV,4CAA4C;IAC5C,gBAAgB,EAAE,MAAM,CAAC;IACzB,kCAAkC;IAClC,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAClC,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,eAAe,EACxB,SAAS,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAC9C,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CA0C5B"}
@@ -0,0 +1,47 @@
1
+ import { RetryExhaustedError } from "../errors.js";
2
+ import { classifyError } from "./retry.js";
3
+ import { logger } from "./logger.js";
4
+ /**
5
+ * Execute operation with automatic account failover.
6
+ * On retryable/rate_limited errors, tries next healthy account.
7
+ * On fatal errors, does NOT failover.
8
+ */
9
+ export async function withFailover(state, options, operation) {
10
+ const maxFailovers = options.maxFailovers ?? 2;
11
+ let currentIndex = options.accountIndex;
12
+ let failoverCount = 0;
13
+ let lastError;
14
+ const tried = new Set();
15
+ while (failoverCount <= maxFailovers) {
16
+ tried.add(currentIndex);
17
+ try {
18
+ const result = await operation(currentIndex);
19
+ state.recordSuccess(currentIndex);
20
+ return { result, usedAccountIndex: currentIndex, failoverCount };
21
+ }
22
+ catch (err) {
23
+ const error = err instanceof Error ? err : new Error(String(err));
24
+ lastError = error;
25
+ state.recordError(currentIndex);
26
+ if (!(error instanceof RetryExhaustedError)) {
27
+ const classification = classifyError(error);
28
+ if (classification === "fatal") {
29
+ throw error;
30
+ }
31
+ }
32
+ const next = state.getNextHealthyAccount(currentIndex);
33
+ if (!next || tried.has(next.accountIndex)) {
34
+ throw error;
35
+ }
36
+ logger.warn("failover", "Switching account", {
37
+ fromIndex: currentIndex,
38
+ toIndex: next.accountIndex,
39
+ reason: error.message
40
+ });
41
+ currentIndex = next.accountIndex;
42
+ failoverCount += 1;
43
+ }
44
+ }
45
+ throw lastError ?? new Error("Failover exhausted");
46
+ }
47
+ //# sourceMappingURL=failover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"failover.js","sourceRoot":"","sources":["../../src/core/failover.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAiBrC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,KAAmB,EACnB,OAAwB,EACxB,SAA+C;IAE/C,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC;IAC/C,IAAI,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IACxC,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,SAA4B,CAAC;IACjC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhC,OAAO,aAAa,IAAI,YAAY,EAAE,CAAC;QACrC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,CAAC;YAC7C,KAAK,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;YAClC,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC;QACnE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAClE,SAAS,GAAG,KAAK,CAAC;YAClB,KAAK,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;YAEhC,IAAI,CAAC,CAAC,KAAK,YAAY,mBAAmB,CAAC,EAAE,CAAC;gBAC5C,MAAM,cAAc,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;gBAC5C,IAAI,cAAc,KAAK,OAAO,EAAE,CAAC;oBAC/B,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;YAED,MAAM,IAAI,GAAG,KAAK,CAAC,qBAAqB,CAAC,YAAY,CAAC,CAAC;YACvD,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC1C,MAAM,KAAK,CAAC;YACd,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,mBAAmB,EAAE;gBAC3C,SAAS,EAAE,YAAY;gBACvB,OAAO,EAAE,IAAI,CAAC,YAAY;gBAC1B,MAAM,EAAE,KAAK,CAAC,OAAO;aACtB,CAAC,CAAC;YAEH,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;YACjC,aAAa,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,MAAM,SAAS,IAAI,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;AACrD,CAAC"}