opencode-antigravity-auth 1.3.1 → 1.3.2-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -0
- package/dist/src/antigravity/oauth.d.ts.map +1 -1
- package/dist/src/antigravity/oauth.js +10 -4
- package/dist/src/antigravity/oauth.js.map +1 -1
- package/dist/src/constants.d.ts +30 -3
- package/dist/src/constants.d.ts.map +1 -1
- package/dist/src/constants.js +80 -3
- package/dist/src/constants.js.map +1 -1
- package/dist/src/plugin/accounts.d.ts +42 -3
- package/dist/src/plugin/accounts.d.ts.map +1 -1
- package/dist/src/plugin/accounts.js +178 -20
- package/dist/src/plugin/accounts.js.map +1 -1
- package/dist/src/plugin/cli.d.ts +17 -12
- package/dist/src/plugin/cli.d.ts.map +1 -1
- package/dist/src/plugin/cli.js +56 -15
- package/dist/src/plugin/cli.js.map +1 -1
- package/dist/src/plugin/config/loader.d.ts.map +1 -1
- package/dist/src/plugin/config/loader.js +0 -13
- package/dist/src/plugin/config/loader.js.map +1 -1
- package/dist/src/plugin/config/schema.d.ts +38 -319
- package/dist/src/plugin/config/schema.d.ts.map +1 -1
- package/dist/src/plugin/config/schema.js +66 -27
- package/dist/src/plugin/config/schema.js.map +1 -1
- package/dist/src/plugin/core/streaming/transformer.d.ts.map +1 -1
- package/dist/src/plugin/core/streaming/transformer.js +37 -6
- package/dist/src/plugin/core/streaming/transformer.js.map +1 -1
- package/dist/src/plugin/core/streaming/types.d.ts.map +1 -1
- package/dist/src/plugin/debug.d.ts.map +1 -1
- package/dist/src/plugin/debug.js +14 -1
- package/dist/src/plugin/debug.js.map +1 -1
- package/dist/src/plugin/fingerprint.d.ts +70 -0
- package/dist/src/plugin/fingerprint.d.ts.map +1 -0
- package/dist/src/plugin/fingerprint.js +155 -0
- package/dist/src/plugin/fingerprint.js.map +1 -0
- package/dist/src/plugin/quota.d.ts +25 -0
- package/dist/src/plugin/quota.d.ts.map +1 -0
- package/dist/src/plugin/quota.js +192 -0
- package/dist/src/plugin/quota.js.map +1 -0
- package/dist/src/plugin/request-helpers.d.ts.map +1 -1
- package/dist/src/plugin/request-helpers.js +61 -23
- package/dist/src/plugin/request-helpers.js.map +1 -1
- package/dist/src/plugin/request.d.ts +4 -1
- package/dist/src/plugin/request.d.ts.map +1 -1
- package/dist/src/plugin/request.js +60 -13
- package/dist/src/plugin/request.js.map +1 -1
- package/dist/src/plugin/rotation.d.ts +5 -4
- package/dist/src/plugin/rotation.d.ts.map +1 -1
- package/dist/src/plugin/rotation.js +35 -9
- package/dist/src/plugin/rotation.js.map +1 -1
- package/dist/src/plugin/search.d.ts +32 -0
- package/dist/src/plugin/search.d.ts.map +1 -0
- package/dist/src/plugin/search.js +197 -0
- package/dist/src/plugin/search.js.map +1 -0
- package/dist/src/plugin/storage.d.ts +3 -0
- package/dist/src/plugin/storage.d.ts.map +1 -1
- package/dist/src/plugin/storage.js +15 -2
- package/dist/src/plugin/storage.js.map +1 -1
- package/dist/src/plugin/transform/gemini.d.ts +1 -13
- package/dist/src/plugin/transform/gemini.d.ts.map +1 -1
- package/dist/src/plugin/transform/gemini.js +49 -12
- package/dist/src/plugin/transform/gemini.js.map +1 -1
- package/dist/src/plugin/transform/model-resolver.d.ts.map +1 -1
- package/dist/src/plugin/transform/model-resolver.js +4 -2
- package/dist/src/plugin/transform/model-resolver.js.map +1 -1
- package/dist/src/plugin/transform/types.d.ts +5 -0
- package/dist/src/plugin/transform/types.d.ts.map +1 -1
- package/dist/src/plugin/types.d.ts +1 -0
- package/dist/src/plugin/types.d.ts.map +1 -1
- package/dist/src/plugin/ui/ansi.d.ts +32 -0
- package/dist/src/plugin/ui/ansi.d.ts.map +1 -0
- package/dist/src/plugin/ui/ansi.js +52 -0
- package/dist/src/plugin/ui/ansi.js.map +1 -0
- package/dist/src/plugin/ui/auth-menu.d.ts +29 -0
- package/dist/src/plugin/ui/auth-menu.d.ts.map +1 -0
- package/dist/src/plugin/ui/auth-menu.js +97 -0
- package/dist/src/plugin/ui/auth-menu.js.map +1 -0
- package/dist/src/plugin/ui/confirm.d.ts +2 -0
- package/dist/src/plugin/ui/confirm.d.ts.map +1 -0
- package/dist/src/plugin/ui/confirm.js +15 -0
- package/dist/src/plugin/ui/confirm.js.map +1 -0
- package/dist/src/plugin/ui/select.d.ts +14 -0
- package/dist/src/plugin/ui/select.d.ts.map +1 -0
- package/dist/src/plugin/ui/select.js +174 -0
- package/dist/src/plugin/ui/select.js.map +1 -0
- package/dist/src/plugin.d.ts.map +1 -1
- package/dist/src/plugin.js +404 -78
- package/dist/src/plugin.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { ANTIGRAVITY_ENDPOINT_PROD, ANTIGRAVITY_HEADERS, ANTIGRAVITY_PROVIDER_ID, } from "../constants";
|
|
2
|
+
import { accessTokenExpired, formatRefreshParts, parseRefreshParts } from "./auth";
|
|
3
|
+
import { ensureProjectContext } from "./project";
|
|
4
|
+
import { refreshAccessToken } from "./token";
|
|
5
|
+
import { getModelFamily } from "./transform/model-resolver";
|
|
6
|
+
const FETCH_TIMEOUT_MS = 10000;
|
|
7
|
+
function buildAuthFromAccount(account) {
|
|
8
|
+
return {
|
|
9
|
+
type: "oauth",
|
|
10
|
+
refresh: formatRefreshParts({
|
|
11
|
+
refreshToken: account.refreshToken,
|
|
12
|
+
projectId: account.projectId,
|
|
13
|
+
managedProjectId: account.managedProjectId,
|
|
14
|
+
}),
|
|
15
|
+
access: undefined,
|
|
16
|
+
expires: undefined,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function normalizeRemainingFraction(value) {
|
|
20
|
+
if (typeof value !== "number" || !Number.isFinite(value)) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
if (value < 0)
|
|
24
|
+
return 0;
|
|
25
|
+
if (value > 1)
|
|
26
|
+
return 1;
|
|
27
|
+
return value;
|
|
28
|
+
}
|
|
29
|
+
function parseResetTime(resetTime) {
|
|
30
|
+
if (!resetTime)
|
|
31
|
+
return null;
|
|
32
|
+
const timestamp = Date.parse(resetTime);
|
|
33
|
+
if (!Number.isFinite(timestamp)) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
return timestamp;
|
|
37
|
+
}
|
|
38
|
+
function classifyQuotaGroup(modelName, displayName) {
|
|
39
|
+
const combined = `${modelName} ${displayName ?? ""}`.toLowerCase();
|
|
40
|
+
if (combined.includes("claude")) {
|
|
41
|
+
return "claude";
|
|
42
|
+
}
|
|
43
|
+
const isGemini3 = combined.includes("gemini-3") || combined.includes("gemini 3");
|
|
44
|
+
if (!isGemini3) {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
const family = getModelFamily(modelName);
|
|
48
|
+
return family === "gemini-flash" ? "gemini-flash" : "gemini-pro";
|
|
49
|
+
}
|
|
50
|
+
function aggregateQuota(models) {
|
|
51
|
+
const groups = {};
|
|
52
|
+
if (!models) {
|
|
53
|
+
return { groups, modelCount: 0 };
|
|
54
|
+
}
|
|
55
|
+
let totalCount = 0;
|
|
56
|
+
for (const [modelName, entry] of Object.entries(models)) {
|
|
57
|
+
const group = classifyQuotaGroup(modelName, entry.displayName ?? entry.modelName);
|
|
58
|
+
if (!group) {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
const quotaInfo = entry.quotaInfo;
|
|
62
|
+
const remainingFraction = quotaInfo
|
|
63
|
+
? normalizeRemainingFraction(quotaInfo.remainingFraction ?? 0)
|
|
64
|
+
: undefined;
|
|
65
|
+
const resetTime = quotaInfo?.resetTime;
|
|
66
|
+
const resetTimestamp = parseResetTime(resetTime);
|
|
67
|
+
totalCount += 1;
|
|
68
|
+
const existing = groups[group];
|
|
69
|
+
const nextCount = (existing?.modelCount ?? 0) + 1;
|
|
70
|
+
const nextRemaining = remainingFraction === undefined
|
|
71
|
+
? existing?.remainingFraction
|
|
72
|
+
: existing?.remainingFraction === undefined
|
|
73
|
+
? remainingFraction
|
|
74
|
+
: Math.min(existing.remainingFraction, remainingFraction);
|
|
75
|
+
let nextResetTime = existing?.resetTime;
|
|
76
|
+
if (resetTimestamp !== null) {
|
|
77
|
+
if (!existing?.resetTime) {
|
|
78
|
+
nextResetTime = resetTime;
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
const existingTimestamp = parseResetTime(existing.resetTime);
|
|
82
|
+
if (existingTimestamp === null || resetTimestamp < existingTimestamp) {
|
|
83
|
+
nextResetTime = resetTime;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
groups[group] = {
|
|
88
|
+
remainingFraction: nextRemaining,
|
|
89
|
+
resetTime: nextResetTime,
|
|
90
|
+
modelCount: nextCount,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
return { groups, modelCount: totalCount };
|
|
94
|
+
}
|
|
95
|
+
async function fetchWithTimeout(url, options, timeoutMs = FETCH_TIMEOUT_MS) {
|
|
96
|
+
const controller = new AbortController();
|
|
97
|
+
const timeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
98
|
+
try {
|
|
99
|
+
return await fetch(url, { ...options, signal: controller.signal });
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
clearTimeout(timeout);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async function fetchAvailableModels(accessToken, projectId) {
|
|
106
|
+
const endpoint = ANTIGRAVITY_ENDPOINT_PROD;
|
|
107
|
+
const quotaUserAgent = ANTIGRAVITY_HEADERS["User-Agent"] || "antigravity/windows/amd64";
|
|
108
|
+
const errors = [];
|
|
109
|
+
const body = projectId ? { project: projectId } : {};
|
|
110
|
+
const response = await fetchWithTimeout(`${endpoint}/v1internal:fetchAvailableModels`, {
|
|
111
|
+
method: "POST",
|
|
112
|
+
headers: {
|
|
113
|
+
Authorization: `Bearer ${accessToken}`,
|
|
114
|
+
"Content-Type": "application/json",
|
|
115
|
+
"User-Agent": quotaUserAgent,
|
|
116
|
+
},
|
|
117
|
+
body: JSON.stringify(body),
|
|
118
|
+
});
|
|
119
|
+
if (response.ok) {
|
|
120
|
+
return (await response.json());
|
|
121
|
+
}
|
|
122
|
+
const message = await response.text().catch(() => "");
|
|
123
|
+
const snippet = message.trim().slice(0, 200);
|
|
124
|
+
errors.push(`fetchAvailableModels ${response.status} at ${endpoint}${snippet ? `: ${snippet}` : ""}`);
|
|
125
|
+
throw new Error(errors.join("; ") || "fetchAvailableModels failed");
|
|
126
|
+
}
|
|
127
|
+
function applyAccountUpdates(account, auth) {
|
|
128
|
+
const parts = parseRefreshParts(auth.refresh);
|
|
129
|
+
if (!parts.refreshToken) {
|
|
130
|
+
return undefined;
|
|
131
|
+
}
|
|
132
|
+
const updated = {
|
|
133
|
+
...account,
|
|
134
|
+
refreshToken: parts.refreshToken,
|
|
135
|
+
projectId: parts.projectId ?? account.projectId,
|
|
136
|
+
managedProjectId: parts.managedProjectId ?? account.managedProjectId,
|
|
137
|
+
};
|
|
138
|
+
const changed = updated.refreshToken !== account.refreshToken ||
|
|
139
|
+
updated.projectId !== account.projectId ||
|
|
140
|
+
updated.managedProjectId !== account.managedProjectId;
|
|
141
|
+
return changed ? updated : undefined;
|
|
142
|
+
}
|
|
143
|
+
export async function checkAccountsQuota(accounts, client, providerId = ANTIGRAVITY_PROVIDER_ID) {
|
|
144
|
+
const results = [];
|
|
145
|
+
for (const [index, account] of accounts.entries()) {
|
|
146
|
+
const disabled = account.enabled === false;
|
|
147
|
+
let auth = buildAuthFromAccount(account);
|
|
148
|
+
try {
|
|
149
|
+
if (accessTokenExpired(auth)) {
|
|
150
|
+
const refreshed = await refreshAccessToken(auth, client, providerId);
|
|
151
|
+
if (!refreshed) {
|
|
152
|
+
throw new Error("Token refresh failed");
|
|
153
|
+
}
|
|
154
|
+
auth = refreshed;
|
|
155
|
+
}
|
|
156
|
+
const projectContext = await ensureProjectContext(auth);
|
|
157
|
+
auth = projectContext.auth;
|
|
158
|
+
const updatedAccount = applyAccountUpdates(account, auth);
|
|
159
|
+
let quotaResult;
|
|
160
|
+
try {
|
|
161
|
+
const response = await fetchAvailableModels(auth.access ?? "", projectContext.effectiveProjectId);
|
|
162
|
+
quotaResult = aggregateQuota(response.models);
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
quotaResult = {
|
|
166
|
+
groups: {},
|
|
167
|
+
modelCount: 0,
|
|
168
|
+
error: error instanceof Error ? error.message : String(error),
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
results.push({
|
|
172
|
+
index,
|
|
173
|
+
email: account.email,
|
|
174
|
+
status: "ok",
|
|
175
|
+
disabled,
|
|
176
|
+
quota: quotaResult,
|
|
177
|
+
updatedAccount,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
results.push({
|
|
182
|
+
index,
|
|
183
|
+
email: account.email,
|
|
184
|
+
status: "error",
|
|
185
|
+
disabled,
|
|
186
|
+
error: error instanceof Error ? error.message : String(error),
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return results;
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=quota.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quota.js","sourceRoot":"","sources":["../../../src/plugin/quota.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-helpers.d.ts","sourceRoot":"","sources":["../../../src/plugin/request-helpers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"request-helpers.d.ts","sourceRoot":"","sources":["../../../src/plugin/request-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { getKeepThinking } from "./config";
|
|
2
2
|
import { createLogger } from "./logger";
|
|
3
|
+
import { cacheSignature } from "./cache";
|
|
3
4
|
import { EMPTY_SCHEMA_PLACEHOLDER_NAME, EMPTY_SCHEMA_PLACEHOLDER_DESCRIPTION, SKIP_THOUGHT_SIGNATURE, } from "../constants";
|
|
4
5
|
import { processImageData } from "./image-saver";
|
|
5
6
|
const log = createLogger("request-helpers");
|
|
@@ -910,25 +911,29 @@ function filterContentArray(contentArray, sessionId, getCachedSignatureFn, isCla
|
|
|
910
911
|
continue;
|
|
911
912
|
}
|
|
912
913
|
// For the LAST assistant message with thinking blocks:
|
|
913
|
-
// - If signature is
|
|
914
|
-
// -
|
|
914
|
+
// - If signature is OUR cached signature, pass through unchanged
|
|
915
|
+
// - Otherwise inject sentinel to bypass Antigravity validation
|
|
916
|
+
// NOTE: We can't trust signatures just because they're >= 50 chars - Claude returns
|
|
917
|
+
// its own signatures which are long but invalid for Antigravity.
|
|
915
918
|
if (isLastAssistantMessage && (isThinking || hasSignature)) {
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
// Invalid or missing signature - inject sentinel
|
|
923
|
-
const thinkingText = getThinkingText(item) || "";
|
|
924
|
-
log.debug("Injecting sentinel signature for invalid last-message thinking block");
|
|
925
|
-
const sentinelPart = {
|
|
926
|
-
type: item.type || "thinking",
|
|
927
|
-
thinking: thinkingText,
|
|
928
|
-
signature: SKIP_THOUGHT_SIGNATURE,
|
|
929
|
-
};
|
|
930
|
-
filtered.push(sentinelPart);
|
|
919
|
+
// First check if it's our cached signature
|
|
920
|
+
if (isOurCachedSignature(item, sessionId, getCachedSignatureFn)) {
|
|
921
|
+
const sanitized = sanitizeThinkingPart(item);
|
|
922
|
+
if (sanitized)
|
|
923
|
+
filtered.push(sanitized);
|
|
924
|
+
continue;
|
|
931
925
|
}
|
|
926
|
+
// Not our signature (or no signature) - inject sentinel
|
|
927
|
+
const thinkingText = getThinkingText(item) || "";
|
|
928
|
+
const existingSignature = item.signature || item.thoughtSignature;
|
|
929
|
+
const signatureInfo = existingSignature ? `foreign signature (${String(existingSignature).length} chars)` : "no signature";
|
|
930
|
+
log.debug(`Injecting sentinel for last-message thinking block with ${signatureInfo}`);
|
|
931
|
+
const sentinelPart = {
|
|
932
|
+
type: item.type || "thinking",
|
|
933
|
+
thinking: thinkingText,
|
|
934
|
+
signature: SKIP_THOUGHT_SIGNATURE,
|
|
935
|
+
};
|
|
936
|
+
filtered.push(sentinelPart);
|
|
932
937
|
continue;
|
|
933
938
|
}
|
|
934
939
|
if (isOurCachedSignature(item, sessionId, getCachedSignatureFn)) {
|
|
@@ -1061,10 +1066,20 @@ function transformGeminiCandidate(candidate) {
|
|
|
1061
1066
|
}
|
|
1062
1067
|
// Handle Gemini-style: thought: true
|
|
1063
1068
|
if (part.thought === true) {
|
|
1064
|
-
|
|
1069
|
+
const thinkingText = part.text || "";
|
|
1070
|
+
thinkingTexts.push(thinkingText);
|
|
1065
1071
|
const transformed = { ...part, type: "reasoning" };
|
|
1066
1072
|
if (part.cache_control)
|
|
1067
1073
|
transformed.cache_control = part.cache_control;
|
|
1074
|
+
// Convert signature to providerMetadata format for OpenCode
|
|
1075
|
+
const sig = part.signature || part.thoughtSignature;
|
|
1076
|
+
if (sig) {
|
|
1077
|
+
transformed.providerMetadata = {
|
|
1078
|
+
anthropic: { signature: sig }
|
|
1079
|
+
};
|
|
1080
|
+
delete transformed.signature;
|
|
1081
|
+
delete transformed.thoughtSignature;
|
|
1082
|
+
}
|
|
1068
1083
|
return transformed;
|
|
1069
1084
|
}
|
|
1070
1085
|
// Handle Anthropic-style in candidates: type: "thinking"
|
|
@@ -1079,12 +1094,25 @@ function transformGeminiCandidate(candidate) {
|
|
|
1079
1094
|
};
|
|
1080
1095
|
if (part.cache_control)
|
|
1081
1096
|
transformed.cache_control = part.cache_control;
|
|
1097
|
+
// Convert signature to providerMetadata format for OpenCode
|
|
1098
|
+
const sig = part.signature || part.thoughtSignature;
|
|
1099
|
+
if (sig) {
|
|
1100
|
+
transformed.providerMetadata = {
|
|
1101
|
+
anthropic: { signature: sig }
|
|
1102
|
+
};
|
|
1103
|
+
delete transformed.signature;
|
|
1104
|
+
delete transformed.thoughtSignature;
|
|
1105
|
+
}
|
|
1082
1106
|
return transformed;
|
|
1083
1107
|
}
|
|
1084
|
-
// Handle functionCall: parse JSON strings in args
|
|
1108
|
+
// Handle functionCall: parse JSON strings in args and ensure args is always defined
|
|
1085
1109
|
// (Ported from LLM-API-Key-Proxy's _extract_tool_call)
|
|
1086
|
-
|
|
1087
|
-
|
|
1110
|
+
// Fix: When Claude calls a tool with no parameters, args may be undefined.
|
|
1111
|
+
// opencode expects state.input to be a record, so we must ensure args: {} as fallback.
|
|
1112
|
+
if (part.functionCall) {
|
|
1113
|
+
const parsedArgs = part.functionCall.args
|
|
1114
|
+
? recursivelyParseJsonStrings(part.functionCall.args)
|
|
1115
|
+
: {};
|
|
1088
1116
|
return {
|
|
1089
1117
|
...part,
|
|
1090
1118
|
functionCall: {
|
|
@@ -1130,12 +1158,22 @@ export function transformThinkingParts(response) {
|
|
|
1130
1158
|
if (block && typeof block === "object" && block.type === "thinking") {
|
|
1131
1159
|
const thinkingText = block.thinking || block.text || "";
|
|
1132
1160
|
reasoningTexts.push(thinkingText);
|
|
1133
|
-
|
|
1161
|
+
const transformed = {
|
|
1134
1162
|
...block,
|
|
1135
1163
|
type: "reasoning",
|
|
1136
1164
|
text: thinkingText,
|
|
1137
1165
|
thought: true,
|
|
1138
|
-
}
|
|
1166
|
+
};
|
|
1167
|
+
// Convert signature to providerMetadata format for OpenCode
|
|
1168
|
+
const sig = block.signature || block.thoughtSignature;
|
|
1169
|
+
if (sig) {
|
|
1170
|
+
transformed.providerMetadata = {
|
|
1171
|
+
anthropic: { signature: sig }
|
|
1172
|
+
};
|
|
1173
|
+
delete transformed.signature;
|
|
1174
|
+
delete transformed.thoughtSignature;
|
|
1175
|
+
}
|
|
1176
|
+
transformedContent.push(transformed);
|
|
1139
1177
|
}
|
|
1140
1178
|
else {
|
|
1141
1179
|
transformedContent.push(block);
|