@hashimkarim/usagestat-linux-x64-gnu 2.0.0-alpha.3 → 2.0.0-alpha.4
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/native-manifest.json +731 -65
- package/package.json +112 -1
- package/plugins/UPSTREAM-LICENSES.md +6 -2
- package/plugins/_provider-icons/LICENSE +21 -0
- package/plugins/_provider-icons/NOTICE +12 -0
- package/plugins/_provider-icons/licenses/CodexBar-MIT.txt +21 -0
- package/plugins/_provider-icons/licenses/LobeHub-MIT.txt +21 -0
- package/plugins/_provider-icons/licenses/UsageStat-Bar-MIT.txt +21 -0
- package/plugins/_provider-icons/manifest.json +1219 -0
- package/plugins/_provider-icons/provenance.json +269 -0
- package/plugins/_provider-icons/source.json +4 -0
- package/plugins/abacus-ai/icon-color.svg +18 -0
- package/plugins/aixy/LICENSE +21 -0
- package/plugins/aixy/plugin.js +261 -0
- package/plugins/aixy/plugin.json +24 -0
- package/plugins/antigravity/plugin.js +136 -46
- package/plugins/antigravity-cli/icon-color.svg +1 -0
- package/plugins/antigravity-cli/icon.svg +1 -3
- package/plugins/antigravity-cli/plugin.js +11 -15
- package/plugins/antigravity-ide/icon-color.svg +1 -0
- package/plugins/antigravity-ide/icon.svg +1 -3
- package/plugins/atlascloud/LICENSE +21 -0
- package/plugins/atlascloud/icon-color.svg +1 -0
- package/plugins/atlascloud/icon.svg +1 -0
- package/plugins/atlascloud/plugin.js +49 -0
- package/plugins/atlascloud/plugin.json +23 -0
- package/plugins/augment/icon-color.svg +14 -0
- package/plugins/bifrost/LICENSE +21 -0
- package/plugins/bifrost/plugin.js +361 -0
- package/plugins/bifrost/plugin.json +23 -0
- package/plugins/claude/plugin.js +302 -152
- package/plugins/claude/plugin.json +1 -1
- package/plugins/clinepass/plugin.js +19 -3
- package/plugins/codebuff/icon-color.svg +92 -0
- package/plugins/coderabbit/plugin.js +25 -0
- package/plugins/coderabbit/plugin.json +12 -0
- package/plugins/codex/plugin.js +1 -0
- package/plugins/command-code/icon-color.svg +3 -0
- package/plugins/command-code/plugin.js +7 -3
- package/plugins/copilot/icon.svg +1 -1
- package/plugins/crof/icon-color.svg +3 -0
- package/plugins/crofai/icon-color.svg +3 -0
- package/plugins/crofai/icon.svg +2 -15
- package/plugins/cursor/icon-color.svg +1 -0
- package/plugins/deepinfra/icon-color.svg +1 -0
- package/plugins/deepinfra/icon.svg +1 -4
- package/plugins/deepseek/plugin.js +150 -59
- package/plugins/deepseek/plugin.json +3 -1
- package/plugins/devin/plugin.js +3 -0
- package/plugins/devpass/LICENSE +21 -0
- package/plugins/devpass/plugin.js +115 -0
- package/plugins/devpass/plugin.json +23 -0
- package/plugins/elevenlabs/icon-color.svg +4 -0
- package/plugins/factory/icon-color.svg +1 -0
- package/plugins/fireworks-ai/icon-color.svg +1 -0
- package/plugins/fireworks-ai/icon.svg +1 -6
- package/plugins/gemini-apps/LICENSE +22 -0
- package/plugins/gemini-apps/icon-color.svg +1 -0
- package/plugins/gemini-apps/icon.svg +1 -0
- package/plugins/gemini-apps/plugin.js +470 -0
- package/plugins/gemini-apps/plugin.json +19 -0
- package/plugins/gitkraken/LICENSE +21 -0
- package/plugins/gitkraken/plugin.js +153 -0
- package/plugins/gitkraken/plugin.json +24 -0
- package/plugins/grok/icon-color.svg +1 -0
- package/plugins/groqcloud/icon-color.svg +1 -0
- package/plugins/helmcode/LICENSE +21 -0
- package/plugins/helmcode/plugin.js +188 -0
- package/plugins/helmcode/plugin.json +24 -0
- package/plugins/huggingface/LICENSE +21 -0
- package/plugins/huggingface/icon-color.svg +1 -0
- package/plugins/huggingface/icon.svg +1 -0
- package/plugins/huggingface/plugin.js +293 -0
- package/plugins/huggingface/plugin.json +25 -0
- package/plugins/hyper/LICENSE +21 -0
- package/plugins/hyper/plugin.js +131 -0
- package/plugins/hyper/plugin.json +26 -0
- package/plugins/kilo/icon-color.svg +1 -0
- package/plugins/litellm/plugin.js +54 -3
- package/plugins/llmman/LICENSE +21 -0
- package/plugins/llmman/plugin.js +133 -0
- package/plugins/llmman/plugin.json +23 -0
- package/plugins/longcat/icon-color.svg +1 -0
- package/plugins/longcat/icon.svg +1 -4
- package/plugins/manus/icon-color.svg +6 -0
- package/plugins/mimo/icon-color.svg +4 -0
- package/plugins/mimo/icon.svg +4 -1
- package/plugins/mistral/plugin.js +110 -5
- package/plugins/moonshot/icon-color.svg +1 -0
- package/plugins/muse/LICENSE +21 -0
- package/plugins/muse/plugin.js +319 -0
- package/plugins/muse/plugin.json +26 -0
- package/plugins/nous/LICENSE +21 -0
- package/plugins/nous/icon-color.svg +1 -0
- package/plugins/nous/icon.svg +1 -0
- package/plugins/nous/plugin.js +124 -0
- package/plugins/nous/plugin.json +24 -0
- package/plugins/ollama/icon-color.svg +1 -0
- package/plugins/openai-api/icon-color.svg +1 -0
- package/plugins/opencode/icon-color.svg +1 -0
- package/plugins/opencode-go/icon-color.svg +1 -0
- package/plugins/opencode-go/plugin.js +30 -12
- package/plugins/openrouter/icon-color.svg +1 -0
- package/plugins/pi/plugin.js +113 -0
- package/plugins/pi/plugin.json +11 -0
- package/plugins/qwencloud/icon-color.svg +1 -0
- package/plugins/qwencloud/icon.svg +1 -4
- package/plugins/raycast/LICENSE +21 -0
- package/plugins/raycast/plugin.js +174 -0
- package/plugins/raycast/plugin.json +24 -0
- package/plugins/replicate/LICENSE +21 -0
- package/plugins/replicate/icon-color.svg +1 -0
- package/plugins/replicate/icon.svg +1 -0
- package/plugins/replicate/plugin.js +165 -0
- package/plugins/replicate/plugin.json +24 -0
- package/plugins/synthetic/icon-color.svg +14 -0
- package/plugins/typesafe/LICENSE +21 -0
- package/plugins/typesafe/plugin.js +225 -0
- package/plugins/typesafe/plugin.json +24 -0
- package/plugins/v0/LICENSE +21 -0
- package/plugins/v0/icon-color.svg +1 -0
- package/plugins/v0/icon.svg +1 -0
- package/plugins/v0/plugin.js +214 -0
- package/plugins/v0/plugin.json +24 -0
- package/plugins/venice/plugin.js +50 -1
- package/plugins/venice/plugin.json +2 -1
- package/plugins/vercel/LICENSE +21 -0
- package/plugins/vercel/icon-color.svg +1 -0
- package/plugins/vercel/icon.svg +1 -0
- package/plugins/vercel/plugin.js +55 -0
- package/plugins/vercel/plugin.json +23 -0
- package/plugins/windsurf/icon-color.svg +1 -0
- package/plugins/xai/icon-color.svg +1 -0
- package/plugins/xai/icon.svg +1 -7
- package/plugins/xkiro/LICENSE +21 -0
- package/plugins/xkiro/plugin.js +99 -0
- package/plugins/xkiro/plugin.json +23 -0
- package/plugins/zai/icon-color.svg +1 -0
- package/plugins/zenmux/icon-color.svg +1 -0
- package/plugins/zenmux/icon.svg +1 -3
- package/usagestat +0 -0
- package/usagestatd +0 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"id": "gemini-apps",
|
|
4
|
+
"name": "Gemini Apps",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"entry": "plugin.js",
|
|
7
|
+
"enabledByDefault": false,
|
|
8
|
+
"supportedModes": ["web"],
|
|
9
|
+
"autoMode": "web",
|
|
10
|
+
"webUrl": "https://gemini.google.com",
|
|
11
|
+
"usageDashboardUrl": "https://gemini.google.com/usage",
|
|
12
|
+
"envVars": ["GEMINI_COOKIE"],
|
|
13
|
+
"upstream": {
|
|
14
|
+
"repository": "https://github.com/barramee27/crossusage",
|
|
15
|
+
"revision": "2b90b00be84e06acbf71a7c5c8db22d1c4e83966",
|
|
16
|
+
"path": "plugins/gemini-apps/plugin.js",
|
|
17
|
+
"license": "MIT"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Peter Steinberger
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
// Generated by tools/vendor-codexbar-providers.cjs; see LICENSE.
|
|
2
|
+
globalThis.__usagestat_bundled_options = {"labels":["Personal","Shared pool","Additional"],"defaults":{},"autoMode":"api"};
|
|
3
|
+
function _nullishCoalesce(lhs, rhsFn) {
|
|
4
|
+
if (lhs != null) {
|
|
5
|
+
return lhs;
|
|
6
|
+
} else {
|
|
7
|
+
return rhsFn();
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
function _optionalChain(ops) {
|
|
11
|
+
let lastAccessLHS = undefined;
|
|
12
|
+
let value = ops[0];
|
|
13
|
+
let i = 1;
|
|
14
|
+
while (i < ops.length) {
|
|
15
|
+
const op = ops[i];
|
|
16
|
+
const fn = ops[i + 1];
|
|
17
|
+
i += 2;
|
|
18
|
+
if ((op === "optionalAccess" || op === "optionalCall") && value == null) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
if (op === "access" || op === "optionalAccess") {
|
|
22
|
+
lastAccessLHS = value;
|
|
23
|
+
value = fn(value);
|
|
24
|
+
} else if (op === "call" || op === "optionalCall") {
|
|
25
|
+
value = fn((...args) => value.call(lastAccessLHS, ...args));
|
|
26
|
+
lastAccessLHS = undefined;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
defineProvider({
|
|
33
|
+
id: "gitkraken",
|
|
34
|
+
name: "GitKraken AI",
|
|
35
|
+
endpoints: ["https://api.gitkraken.dev"],
|
|
36
|
+
auth: { type: "bearer", secret: "GITKRAKEN_API_TOKEN" },
|
|
37
|
+
settings: [
|
|
38
|
+
{ key: "GITKRAKEN_API_TOKEN", title: "GitKraken access token", type: "secure" },
|
|
39
|
+
{ key: "GITKRAKEN_ORG_ID", title: "API organization ID", type: "plain" },
|
|
40
|
+
{ key: "CLIENT_VERSION", title: "Client version", type: "plain" },
|
|
41
|
+
],
|
|
42
|
+
capabilities: ["http-status"],
|
|
43
|
+
async fetchUsage(ctx) {
|
|
44
|
+
const token = ctx.settings.getSecret("GITKRAKEN_API_TOKEN");
|
|
45
|
+
if (!token) throw ctx.fail.missingCredential("Set a GitKraken access token in Settings or GITKRAKEN_API_TOKEN.");
|
|
46
|
+
if (!/^[\x21-\x7e]{1,16384}$/.test(token)) {
|
|
47
|
+
throw ctx.fail.authenticationExpired("Invalid GitKraken token. Paste only the value after Bearer.");
|
|
48
|
+
}
|
|
49
|
+
const organization = _optionalChain([
|
|
50
|
+
ctx,
|
|
51
|
+
"access",
|
|
52
|
+
(_) => _.settings,
|
|
53
|
+
"access",
|
|
54
|
+
(_2) => _2.get,
|
|
55
|
+
"call",
|
|
56
|
+
(_3) => _3("GITKRAKEN_ORG_ID"),
|
|
57
|
+
"optionalAccess",
|
|
58
|
+
(_4) => _4.trim,
|
|
59
|
+
"call",
|
|
60
|
+
(_5) => _5(),
|
|
61
|
+
]);
|
|
62
|
+
if (organization && !/^[\x21-\x7e]{1,256}$/.test(organization)) {
|
|
63
|
+
throw ctx.fail.permissionDenied("Invalid GitKraken organization ID. Enter a single ID without whitespace.");
|
|
64
|
+
}
|
|
65
|
+
const headers = {
|
|
66
|
+
"Client-Name": "CodexBar",
|
|
67
|
+
"Client-Version": ctx.settings.get("CLIENT_VERSION") || "0.0.0",
|
|
68
|
+
"User-Agent": "CodexBar",
|
|
69
|
+
};
|
|
70
|
+
if (organization) headers["gk-org-id"] = organization;
|
|
71
|
+
const response = await ctx.http.get("https://api.gitkraken.dev/v1/ai-tasks/usage", { headers });
|
|
72
|
+
if (response.status === 401)
|
|
73
|
+
throw ctx.fail.authenticationExpired("GitKraken access token expired or was rejected.");
|
|
74
|
+
if (response.status === 403)
|
|
75
|
+
throw ctx.fail.permissionDenied("GitKraken denied access to this account or organization.");
|
|
76
|
+
if (response.status === 429) {
|
|
77
|
+
const delay = Number(_nullishCoalesce(response.headers["retry-after"], () => 1));
|
|
78
|
+
throw ctx.fail.rateLimited("GitKraken rate limited usage requests.", {
|
|
79
|
+
retryAfterSeconds: Number.isFinite(delay) && delay >= 0 ? Math.min(delay, 10) : 1,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
if (response.status >= 500) throw ctx.fail.providerUnavailable("GitKraken usage is temporarily unavailable.");
|
|
83
|
+
if (response.status !== 200) throw ctx.fail.apiFailure(`GitKraken returned HTTP ${response.status}.`);
|
|
84
|
+
|
|
85
|
+
function fail() {
|
|
86
|
+
throw ctx.fail.parseFailure("GitKraken returned an unrecognized usage response.");
|
|
87
|
+
}
|
|
88
|
+
function quota(value) {
|
|
89
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) return null;
|
|
90
|
+
const { used, limit } = value;
|
|
91
|
+
if (
|
|
92
|
+
typeof used !== "number" ||
|
|
93
|
+
!Number.isFinite(used) ||
|
|
94
|
+
used < 0 ||
|
|
95
|
+
typeof limit !== "number" ||
|
|
96
|
+
!Number.isFinite(limit) ||
|
|
97
|
+
(limit < 0 && limit !== -1) ||
|
|
98
|
+
(limit > 0 && !Number.isFinite((used / limit) * 100))
|
|
99
|
+
)
|
|
100
|
+
return null;
|
|
101
|
+
return { used, limit };
|
|
102
|
+
}
|
|
103
|
+
let body;
|
|
104
|
+
try {
|
|
105
|
+
body = JSON.parse(response.bodyText);
|
|
106
|
+
} catch (error) {
|
|
107
|
+
void error;
|
|
108
|
+
return fail();
|
|
109
|
+
}
|
|
110
|
+
const data = _optionalChain([body, "optionalAccess", (_6) => _6.data]);
|
|
111
|
+
const personal = quota(data);
|
|
112
|
+
if (_optionalChain([body, "optionalAccess", (_7) => _7.error]) != null || !personal) return fail();
|
|
113
|
+
if (
|
|
114
|
+
typeof data.resetsOn !== "string" ||
|
|
115
|
+
!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$/.test(data.resetsOn)
|
|
116
|
+
)
|
|
117
|
+
return fail();
|
|
118
|
+
const resetsAt = new Date(data.resetsOn);
|
|
119
|
+
if (!Number.isFinite(resetsAt.getTime())) return fail();
|
|
120
|
+
const pool = quota(data.organization);
|
|
121
|
+
const number = (value) => ctx.format.number(value, { maximumFractionDigits: 2 });
|
|
122
|
+
function description(value) {
|
|
123
|
+
if (value.limit <= 0)
|
|
124
|
+
return `${number(value.used)} credits used · ${value.limit === -1 ? "Unlimited" : "No allowance"}`;
|
|
125
|
+
return `${number(value.used)} / ${number(value.limit)} credits used`;
|
|
126
|
+
}
|
|
127
|
+
const rows = [{ label: "Personal", value: description(personal) }];
|
|
128
|
+
if (pool) {
|
|
129
|
+
rows.push({ label: "Shared pool", value: description(pool) });
|
|
130
|
+
// sharedUsed is a slice of the pool, never additional personal usage.
|
|
131
|
+
const shared = data.sharedUsed;
|
|
132
|
+
if (typeof shared === "number" && Number.isFinite(shared) && shared >= 0 && shared <= pool.used) {
|
|
133
|
+
rows.push({ label: "Your shared usage", value: `${number(shared)} credits` });
|
|
134
|
+
rows.push({ label: "Rest of organization", value: `${number(pool.used - shared)} credits` });
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (personal.limit <= 0 && (!pool || pool.limit <= 0)) {
|
|
138
|
+
rows.push({ label: "Reset", value: resetsAt.toISOString() });
|
|
139
|
+
}
|
|
140
|
+
function window(value) {
|
|
141
|
+
return value && value.limit > 0
|
|
142
|
+
? { usedPercent: ctx.pct(value.used, value.limit), windowMinutes: 10080, resetsAt }
|
|
143
|
+
: null;
|
|
144
|
+
}
|
|
145
|
+
return {
|
|
146
|
+
primary: window(personal),
|
|
147
|
+
secondary: window(pool),
|
|
148
|
+
details: [{ title: "Weekly usage", rows }],
|
|
149
|
+
identity: { loginMethod: "API" },
|
|
150
|
+
dataConfidence: "exact",
|
|
151
|
+
};
|
|
152
|
+
},
|
|
153
|
+
});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"id": "gitkraken",
|
|
4
|
+
"name": "GitKraken AI",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"entry": "plugin.js",
|
|
7
|
+
"enabledByDefault": false,
|
|
8
|
+
"supportedModes": [
|
|
9
|
+
"api"
|
|
10
|
+
],
|
|
11
|
+
"autoMode": "api",
|
|
12
|
+
"usageDashboardUrl": "https://gitkraken.dev/account#ai-usage",
|
|
13
|
+
"envVars": [
|
|
14
|
+
"GITKRAKEN_API_TOKEN",
|
|
15
|
+
"GITKRAKEN_ORG_ID"
|
|
16
|
+
],
|
|
17
|
+
"upstream": {
|
|
18
|
+
"repository": "https://github.com/steipete/CodexBar",
|
|
19
|
+
"revision": "78ba5a1e65e6859da59a21b799df95ab91bc0b89",
|
|
20
|
+
"path": "Sources/CodexBarCore/Resources/Plugins/gitkraken.js",
|
|
21
|
+
"sha256": "c583890b74fc4c054cd818e560b30a17dd716c7611b554bd5b559f533a824ca2",
|
|
22
|
+
"license": "MIT"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg fill="currentColor" fill-rule="evenodd" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Grok</title><path d="M6.469 8.776L16.512 23h-4.464L2.005 8.776H6.47zm-.004 7.9l2.233 3.164L6.467 23H2l4.465-6.324zM22 2.582V23h-3.659V7.764L22 2.582zM22 1l-9.952 14.095-2.233-3.163L17.533 1H22z"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg fill="currentColor" fill-rule="evenodd" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Groq</title><path d="M12.036 2c-3.853-.035-7 3-7.036 6.781-.035 3.782 3.055 6.872 6.908 6.907h2.42v-2.566h-2.292c-2.407.028-4.38-1.866-4.408-4.23-.029-2.362 1.901-4.298 4.308-4.326h.1c2.407 0 4.358 1.915 4.365 4.278v6.305c0 2.342-1.944 4.25-4.323 4.279a4.375 4.375 0 01-3.033-1.252l-1.851 1.818A7 7 0 0012.029 22h.092c3.803-.056 6.858-3.083 6.879-6.816v-6.5C18.907 4.963 15.817 2 12.036 2z"></path></svg>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Peter Steinberger
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
// Generated by tools/vendor-codexbar-providers.cjs; see LICENSE.
|
|
2
|
+
globalThis.__usagestat_bundled_options = {"labels":["Model quota","Model quota","Additional"],"defaults":{},"autoMode":"web"};
|
|
3
|
+
function _nullishCoalesce(lhs, rhsFn) {
|
|
4
|
+
if (lhs != null) {
|
|
5
|
+
return lhs;
|
|
6
|
+
} else {
|
|
7
|
+
return rhsFn();
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
function _optionalChain(ops) {
|
|
11
|
+
let lastAccessLHS = undefined;
|
|
12
|
+
let value = ops[0];
|
|
13
|
+
let i = 1;
|
|
14
|
+
while (i < ops.length) {
|
|
15
|
+
const op = ops[i];
|
|
16
|
+
const fn = ops[i + 1];
|
|
17
|
+
i += 2;
|
|
18
|
+
if ((op === "optionalAccess" || op === "optionalCall") && value == null) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
if (op === "access" || op === "optionalAccess") {
|
|
22
|
+
lastAccessLHS = value;
|
|
23
|
+
value = fn(value);
|
|
24
|
+
} else if (op === "call" || op === "optionalCall") {
|
|
25
|
+
value = fn((...args) => value.call(lastAccessLHS, ...args));
|
|
26
|
+
lastAccessLHS = undefined;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
defineProvider({
|
|
32
|
+
id: "helmcode",
|
|
33
|
+
name: "Helmcode",
|
|
34
|
+
endpoints: ["https://cloud-api.helmcode.com", "https://cloud-api.nan.builders"],
|
|
35
|
+
settings: [{ key: "TENANT", title: "Manual cookie tenant", type: "plain" }],
|
|
36
|
+
capabilities: ["browser-cookies", "http-status"],
|
|
37
|
+
cookieDomains: ["helmcode.com", "nan.builders"],
|
|
38
|
+
async fetchUsage(ctx) {
|
|
39
|
+
const tenants = [
|
|
40
|
+
{ domain: "helmcode.com", name: "Helmcode Cloud" },
|
|
41
|
+
{ domain: "nan.builders", name: "NaN Builders" },
|
|
42
|
+
];
|
|
43
|
+
const policy = ctx.browser.availability(tenants[0].domain);
|
|
44
|
+
if (policy === "off") throw ctx.fail.missingCredential("Helmcode dashboard cookies are disabled.");
|
|
45
|
+
// A pasted header has no origin metadata. Never try it against both tenants.
|
|
46
|
+
const candidates = policy === "manual" ? [tenants[ctx.settings.get("TENANT") === "nanBuilders" ? 1 : 0]] : tenants;
|
|
47
|
+
const fail = (field) => {
|
|
48
|
+
throw ctx.fail.parseFailure(`Helmcode quota response format changed: ${field}`);
|
|
49
|
+
};
|
|
50
|
+
const object = (value) =>
|
|
51
|
+
value !== null && typeof value === "object" && !Array.isArray(value) ? value : undefined;
|
|
52
|
+
const parse = (body) => {
|
|
53
|
+
try {
|
|
54
|
+
return _nullishCoalesce(object(JSON.parse(body)), () => fail("expected object"));
|
|
55
|
+
} catch (error) {
|
|
56
|
+
void error;
|
|
57
|
+
return fail("invalid JSON");
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
const integer = (value, field) => {
|
|
61
|
+
if (typeof value !== "number" || !Number.isSafeInteger(value) || value < 0) return fail(field);
|
|
62
|
+
return value;
|
|
63
|
+
};
|
|
64
|
+
const date = (value) => {
|
|
65
|
+
if (typeof value !== "string") return undefined;
|
|
66
|
+
try {
|
|
67
|
+
return ctx.date.iso(value);
|
|
68
|
+
} catch (error) {
|
|
69
|
+
void error;
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
const validate = (response) => {
|
|
74
|
+
const seconds = Number(_nullishCoalesce(response.headers["retry-after"], () => 1));
|
|
75
|
+
const retryAfterSeconds = Number.isFinite(seconds) && seconds >= 0 ? Math.min(10, seconds) : 1;
|
|
76
|
+
if (response.status === 429) throw ctx.fail.rateLimited("Helmcode rate limit reached.", { retryAfterSeconds });
|
|
77
|
+
if (response.status === 408 || response.status >= 500)
|
|
78
|
+
throw ctx.fail.providerUnavailable("Helmcode dashboard is unavailable.", { retryAfterSeconds });
|
|
79
|
+
if (response.status < 200 || response.status >= 300)
|
|
80
|
+
throw ctx.fail.apiFailure(`Helmcode dashboard returned HTTP ${response.status}.`);
|
|
81
|
+
};
|
|
82
|
+
let rejected = false;
|
|
83
|
+
for (const tenant of candidates) {
|
|
84
|
+
let cookie;
|
|
85
|
+
try {
|
|
86
|
+
cookie = await ctx.browser.cookieHeader(tenant.domain);
|
|
87
|
+
} catch (error) {
|
|
88
|
+
void error;
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
const headers = {
|
|
92
|
+
Cookie: cookie,
|
|
93
|
+
Origin: `https://cloud.${tenant.domain}`,
|
|
94
|
+
Referer: `https://cloud.${tenant.domain}/dashboard`,
|
|
95
|
+
};
|
|
96
|
+
const get = (path, timeoutSeconds = 8) =>
|
|
97
|
+
ctx.http.get(`https://cloud-api.${tenant.domain}${path}`, { headers, timeoutSeconds });
|
|
98
|
+
const response = await get("/api/usage/quota");
|
|
99
|
+
if ((response.status >= 300 && response.status < 400) || response.status === 401 || response.status === 403) {
|
|
100
|
+
ctx.browser.rejectCookie(tenant.domain);
|
|
101
|
+
rejected = true;
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
validate(response);
|
|
105
|
+
const quota = parse(response.bodyText);
|
|
106
|
+
if (typeof quota.periodStart !== "string" || !Array.isArray(quota.models)) return fail("periodStart or models");
|
|
107
|
+
const optional = async (path) => {
|
|
108
|
+
try {
|
|
109
|
+
const result = await get(path, 2);
|
|
110
|
+
return result.status === 200 ? parse(result.bodyText) : undefined;
|
|
111
|
+
} catch (error) {
|
|
112
|
+
void error;
|
|
113
|
+
return undefined;
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
const billing = await optional("/api/billing");
|
|
117
|
+
const premium =
|
|
118
|
+
_optionalChain([
|
|
119
|
+
object,
|
|
120
|
+
"call",
|
|
121
|
+
(_) => _(_optionalChain([billing, "optionalAccess", (_2) => _2.subscription])),
|
|
122
|
+
"optionalAccess",
|
|
123
|
+
(_3) => _3.premium,
|
|
124
|
+
]) === true;
|
|
125
|
+
const start = /^(\d{4})-(\d{2})-(\d{2})(?:T|$)/.exec(quota.periodStart);
|
|
126
|
+
const fallback =
|
|
127
|
+
start && Number(start[2]) >= 1 && Number(start[2]) <= 12 && Number(start[3]) >= 1 && Number(start[3]) <= 31
|
|
128
|
+
? new Date(Date.UTC(Number(start[1]), Number(start[2]), 1))
|
|
129
|
+
: undefined;
|
|
130
|
+
const models = quota.models
|
|
131
|
+
.map((value) => {
|
|
132
|
+
const row = _nullishCoalesce(object(value), () => fail("model"));
|
|
133
|
+
if (typeof row.model !== "string" || !ctx.isDetailLabel(row.model)) return fail("model name");
|
|
134
|
+
const cap = integer(row.cap, "cap");
|
|
135
|
+
const used = integer(row.tokensUsed, "tokensUsed");
|
|
136
|
+
const credit = row.creditTokens == null ? 0 : integer(row.creditTokens, "creditTokens");
|
|
137
|
+
const hours = row.windowHours == null ? undefined : integer(row.windowHours, "windowHours");
|
|
138
|
+
if (hours !== undefined && (hours < 1 || hours > 525600 / 60)) return fail("windowHours");
|
|
139
|
+
return {
|
|
140
|
+
name: row.model,
|
|
141
|
+
cap,
|
|
142
|
+
used,
|
|
143
|
+
credit,
|
|
144
|
+
hours,
|
|
145
|
+
resetsAt: _nullishCoalesce(date(row.periodEnd), () => fallback),
|
|
146
|
+
};
|
|
147
|
+
})
|
|
148
|
+
.filter((row) => row.cap > 0 && (row.hours === undefined || premium));
|
|
149
|
+
models.sort((a, b) => b.used / b.cap - a.used / a.cap || (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
|
|
150
|
+
const windows = models.map((row) => ({
|
|
151
|
+
id: `helmcode-${row.name}`,
|
|
152
|
+
title: row.name,
|
|
153
|
+
window: {
|
|
154
|
+
usedPercent: ctx.pct(row.used, row.cap),
|
|
155
|
+
resetsAt: row.resetsAt,
|
|
156
|
+
windowMinutes: row.hours === undefined ? undefined : row.hours * 60,
|
|
157
|
+
resetDescription:
|
|
158
|
+
`${row.name} · ${ctx.format.number(row.used)} / ${ctx.format.number(row.cap)} tokens` +
|
|
159
|
+
(row.credit > 0 ? ` · ${ctx.format.number(row.credit)} credit-funded` : ""),
|
|
160
|
+
},
|
|
161
|
+
}));
|
|
162
|
+
let cost;
|
|
163
|
+
if (tenant.domain === "helmcode.com") {
|
|
164
|
+
const credits = await optional("/api/billing/credits");
|
|
165
|
+
const balance = _optionalChain([credits, "optionalAccess", (_4) => _4.balanceMicros]);
|
|
166
|
+
const currency =
|
|
167
|
+
_optionalChain([credits, "optionalAccess", (_5) => _5.currency]) == null
|
|
168
|
+
? "EUR"
|
|
169
|
+
: typeof credits.currency === "string"
|
|
170
|
+
? credits.currency.toUpperCase()
|
|
171
|
+
: "";
|
|
172
|
+
if (typeof balance === "number" && Number.isSafeInteger(balance) && /^[A-Z]{3}$/.test(currency))
|
|
173
|
+
cost = { used: Math.max(0, balance / 1e6), limit: 0, currency, period: "Prepaid balance" };
|
|
174
|
+
}
|
|
175
|
+
return {
|
|
176
|
+
primary: _optionalChain([windows, "access", (_6) => _6[0], "optionalAccess", (_7) => _7.window]),
|
|
177
|
+
extraWindows: windows.slice(1),
|
|
178
|
+
cost,
|
|
179
|
+
identity: { organization: tenant.name, loginMethod: "Dashboard session" },
|
|
180
|
+
dataConfidence: "exact",
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
if (rejected) throw ctx.fail.authenticationExpired("Helmcode dashboard session expired. Sign in again.");
|
|
184
|
+
throw ctx.fail.missingCredential(
|
|
185
|
+
"Sign in to cloud.helmcode.com or cloud.nan.builders in Chrome, or paste a Cookie header.",
|
|
186
|
+
);
|
|
187
|
+
},
|
|
188
|
+
});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"id": "helmcode",
|
|
4
|
+
"name": "Helmcode",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"entry": "plugin.js",
|
|
7
|
+
"enabledByDefault": false,
|
|
8
|
+
"supportedModes": [
|
|
9
|
+
"web"
|
|
10
|
+
],
|
|
11
|
+
"autoMode": "web",
|
|
12
|
+
"usageDashboardUrl": "https://cloud.helmcode.com/dashboard",
|
|
13
|
+
"webUrl": "https://helmcode.com",
|
|
14
|
+
"envVars": [
|
|
15
|
+
"HELMCODE_COOKIE"
|
|
16
|
+
],
|
|
17
|
+
"upstream": {
|
|
18
|
+
"repository": "https://github.com/steipete/CodexBar",
|
|
19
|
+
"revision": "78ba5a1e65e6859da59a21b799df95ab91bc0b89",
|
|
20
|
+
"path": "Sources/CodexBarCore/Resources/Plugins/helmcode.js",
|
|
21
|
+
"sha256": "475a2002673d59b95ef4da487639f8e2574ba07a0e31e80f10ea3556eeb3427e",
|
|
22
|
+
"license": "MIT"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Peter Steinberger
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>HuggingFace</title><path d="M2.25 11.535c0-3.407 1.847-6.554 4.844-8.258a9.822 9.822 0 019.687 0c2.997 1.704 4.844 4.851 4.844 8.258 0 5.266-4.337 9.535-9.687 9.535S2.25 16.8 2.25 11.535z" fill="#FF9D0B"></path><path d="M11.938 20.086c4.797 0 8.687-3.829 8.687-8.551 0-4.722-3.89-8.55-8.687-8.55-4.798 0-8.688 3.828-8.688 8.55 0 4.722 3.89 8.55 8.688 8.55z" fill="#FFD21E"></path><path d="M11.875 15.113c2.457 0 3.25-2.156 3.25-3.263 0-.576-.393-.394-1.023-.089-.582.283-1.365.675-2.224.675-1.798 0-3.25-1.693-3.25-.586 0 1.107.79 3.263 3.25 3.263h-.003z" fill="#FF323D"></path><path d="M14.76 9.21c.32.108.445.753.767.585.447-.233.707-.708.659-1.204a1.235 1.235 0 00-.879-1.059 1.262 1.262 0 00-1.33.394c-.322.384-.377.92-.14 1.36.153.283.638-.177.925-.079l-.002.003zm-5.887 0c-.32.108-.448.753-.768.585a1.226 1.226 0 01-.658-1.204c.048-.495.395-.913.878-1.059a1.262 1.262 0 011.33.394c.322.384.377.92.14 1.36-.152.283-.64-.177-.925-.079l.003.003zm1.12 5.34a2.166 2.166 0 011.325-1.106c.07-.02.144.06.219.171l.192.306c.069.1.139.175.209.175.074 0 .15-.074.223-.172l.205-.302c.08-.11.157-.188.234-.165.537.168.986.536 1.25 1.026.932-.724 1.275-1.905 1.275-2.633 0-.508-.306-.426-.81-.19l-.616.296c-.52.24-1.148.48-1.824.48-.676 0-1.302-.24-1.823-.48l-.589-.283c-.52-.248-.838-.342-.838.177 0 .703.32 1.831 1.187 2.56l.18.14z" fill="#3A3B45"></path><path d="M17.812 10.366a.806.806 0 00.813-.8c0-.441-.364-.8-.813-.8a.806.806 0 00-.812.8c0 .442.364.8.812.8zm-11.624 0a.806.806 0 00.812-.8c0-.441-.364-.8-.812-.8a.806.806 0 00-.813.8c0 .442.364.8.813.8zM4.515 13.073c-.405 0-.765.162-1.017.46a1.455 1.455 0 00-.333.925 1.801 1.801 0 00-.485-.074c-.387 0-.737.146-.985.409a1.41 1.41 0 00-.2 1.722 1.302 1.302 0 00-.447.694c-.06.222-.12.69.2 1.166a1.267 1.267 0 00-.093 1.236c.238.533.81.958 1.89 1.405l.24.096c.768.3 1.473.492 1.478.494.89.243 1.808.375 2.732.394 1.465 0 2.513-.443 3.115-1.314.93-1.342.842-2.575-.274-3.763l-.151-.154c-.692-.684-1.155-1.69-1.25-1.912-.195-.655-.71-1.383-1.562-1.383-.46.007-.889.233-1.15.605-.25-.31-.495-.553-.715-.694a1.87 1.87 0 00-.993-.312zm14.97 0c.405 0 .767.162 1.017.46.216.262.333.588.333.925.158-.047.322-.071.487-.074.388 0 .738.146.985.409a1.41 1.41 0 01.2 1.722c.22.178.377.422.445.694.06.222.12.69-.2 1.166.244.37.279.836.093 1.236-.238.533-.81.958-1.889 1.405l-.239.096c-.77.3-1.475.492-1.48.494-.89.243-1.808.375-2.732.394-1.465 0-2.513-.443-3.115-1.314-.93-1.342-.842-2.575.274-3.763l.151-.154c.695-.684 1.157-1.69 1.252-1.912.195-.655.708-1.383 1.56-1.383.46.007.889.233 1.15.605.25-.31.495-.553.718-.694.244-.162.523-.265.814-.3l.176-.012z" fill="#FF9D0B"></path><path d="M9.785 20.132c.688-.994.638-1.74-.305-2.667-.945-.928-1.495-2.288-1.495-2.288s-.205-.788-.672-.714c-.468.074-.81 1.25.17 1.971.977.721-.195 1.21-.573.534-.375-.677-1.405-2.416-1.94-2.751-.532-.332-.907-.148-.782.541.125.687 2.357 2.35 2.14 2.707-.218.362-.983-.42-.983-.42S2.953 14.9 2.43 15.46c-.52.558.398 1.026 1.7 1.803 1.308.778 1.41.985 1.225 1.28-.187.295-3.07-2.1-3.34-1.083-.27 1.011 2.943 1.304 2.745 2.006-.2.7-2.265-1.324-2.685-.537-.425.79 2.913 1.718 2.94 1.725 1.075.276 3.813.859 4.77-.522zm4.432 0c-.687-.994-.64-1.74.305-2.667.943-.928 1.493-2.288 1.493-2.288s.205-.788.675-.714c.465.074.807 1.25-.17 1.971-.98.721.195 1.21.57.534.377-.677 1.407-2.416 1.94-2.751.532-.332.91-.148.782.541-.125.687-2.355 2.35-2.137 2.707.215.362.98-.42.98-.42S21.05 14.9 21.57 15.46c.52.558-.395 1.026-1.7 1.803-1.308.778-1.408.985-1.225 1.28.187.295 3.07-2.1 3.34-1.083.27 1.011-2.94 1.304-2.743 2.006.2.7 2.263-1.324 2.685-.537.423.79-2.912 1.718-2.94 1.725-1.077.276-3.815.859-4.77-.522z" fill="#FFD21E"></path></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg fill="currentColor" fill-rule="evenodd" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>HuggingFace</title><path d="M16.781 3.277c2.997 1.704 4.844 4.851 4.844 8.258 0 .995-.155 1.955-.443 2.857a1.332 1.332 0 011.125.4 1.41 1.41 0 01.2 1.723c.204.165.352.385.428.632l.017.062c.06.222.12.69-.2 1.166.244.37.279.836.093 1.236-.255.57-.893 1.018-2.128 1.5l-.202.078-.131.048c-.478.173-.89.295-1.061.345l-.086.024c-.89.243-1.808.375-2.732.394-1.32 0-2.3-.36-2.923-1.067a9.852 9.852 0 01-3.18.018C9.778 21.647 8.802 22 7.494 22a11.249 11.249 0 01-2.541-.343l-.221-.06-.273-.08a16.574 16.574 0 01-1.175-.405c-1.237-.483-1.875-.93-2.13-1.501-.186-.4-.151-.867.093-1.236a1.42 1.42 0 01-.2-1.166c.069-.273.226-.516.447-.694a1.41 1.41 0 01.2-1.722c.233-.248.557-.391.917-.407l.078-.001a9.385 9.385 0 01-.44-2.85c0-3.407 1.847-6.554 4.844-8.258a9.822 9.822 0 019.687 0zM4.188 14.758c.125.687 2.357 2.35 2.14 2.707-.19.315-.796-.239-.948-.386l-.041-.04-.168-.147c-.561-.479-2.304-1.9-2.74-1.432-.43.46.119.859 1.055 1.42l.784.467.136.083c1.045.643 1.12.84.95 1.113-.188.295-3.07-2.1-3.34-1.083-.27 1.011 2.942 1.304 2.744 2.006-.2.7-2.265-1.324-2.685-.537-.425.79 2.913 1.718 2.94 1.725l.16.04.175.042c1.227.284 3.565.65 4.435-.604.673-.973.64-1.709-.248-2.61l-.057-.057c-.945-.928-1.495-2.288-1.495-2.288l-.017-.058-.025-.072c-.082-.22-.284-.639-.63-.584-.46.073-.798 1.21.12 1.933l.05.038c.977.721-.195 1.21-.573.534l-.058-.104-.143-.25c-.463-.799-1.282-2.111-1.739-2.397-.532-.332-.907-.148-.782.541zm14.842-.541c-.533.335-1.563 2.074-1.94 2.751a.613.613 0 01-.687.302.436.436 0 01-.176-.098.303.303 0 01-.049-.06l-.014-.028-.008-.02-.007-.019-.003-.013-.003-.017a.289.289 0 01-.004-.048c0-.12.071-.266.25-.427.026-.024.054-.047.084-.07l.047-.036c.022-.016.043-.032.063-.049.883-.71.573-1.81.131-1.917l-.031-.006-.056-.004a.368.368 0 00-.062.006l-.028.005-.042.014-.039.017-.028.015-.028.019-.036.027-.023.02c-.173.158-.273.428-.31.542l-.016.054s-.53 1.309-1.439 2.234l-.054.054c-.365.358-.596.69-.702 1.018-.143.437-.066.868.21 1.353.055.097.117.195.187.296.882 1.275 3.282.876 4.494.59l.286-.07.25-.074c.276-.084.736-.233 1.2-.42l.188-.077.065-.028.064-.028.124-.056.081-.038c.529-.252.964-.543.994-.827l.001-.036a.299.299 0 00-.037-.139c-.094-.176-.271-.212-.491-.168l-.045.01c-.044.01-.09.024-.136.04l-.097.035-.054.022c-.559.23-1.238.705-1.607.745h.006a.452.452 0 01-.05.003h-.024l-.024-.003-.023-.005c-.068-.016-.116-.06-.14-.142a.22.22 0 01-.005-.1c.062-.345.958-.595 1.713-.91l.066-.028c.528-.224.97-.483.985-.832v-.04a.47.47 0 00-.016-.098c-.048-.18-.175-.251-.36-.251-.785 0-2.55 1.36-2.92 1.36-.025 0-.048-.007-.058-.024a.6.6 0 01-.046-.088c-.1-.238.068-.462 1.06-1.066l.209-.126c.538-.32 1.01-.588 1.341-.831.29-.212.475-.406.503-.6l.003-.028c.008-.113-.038-.227-.147-.344a.266.266 0 00-.07-.054l-.034-.015-.013-.005a.403.403 0 00-.13-.02c-.162 0-.369.07-.595.18-.637.313-1.431.952-1.826 1.285l-.249.215-.033.033c-.08.078-.288.27-.493.386l-.071.037-.041.019a.535.535 0 01-.122.036h.005a.346.346 0 01-.031.003l.01-.001-.013.001c-.079.005-.145-.021-.19-.095a.113.113 0 01-.014-.065c.027-.465 2.034-1.991 2.152-2.642l.009-.048c.1-.65-.271-.817-.791-.493zM11.938 2.984c-4.798 0-8.688 3.829-8.688 8.55 0 .692.083 1.364.24 2.008l.008-.009c.252-.298.612-.46 1.017-.46.355.008.699.117.993.312.22.14.465.384.715.694.261-.372.69-.598 1.15-.605.852 0 1.367.728 1.562 1.383l.047.105.06.127c.192.396.595 1.139 1.143 1.68 1.06 1.04 1.324 2.115.8 3.266a8.865 8.865 0 002.024-.014c-.505-1.12-.26-2.17.74-3.186l.066-.066c.695-.684 1.157-1.69 1.252-1.912.195-.655.708-1.383 1.56-1.383.46.007.889.233 1.15.605.25-.31.495-.553.718-.694a1.87 1.87 0 01.99-.312c.357 0 .682.126.925.36.14-.61.215-1.245.215-1.898 0-4.722-3.89-8.55-8.687-8.55zm1.857 8.926l.439-.212c.553-.264.89-.383.89.152 0 1.093-.771 3.208-3.155 3.262h-.184c-2.325-.052-3.116-2.06-3.156-3.175l-.001-.087c0-1.107 1.452.586 3.25.586.716 0 1.379-.272 1.917-.526zm4.017-3.143c.45 0 .813.358.813.8 0 .441-.364.8-.813.8a.806.806 0 01-.812-.8c0-.442.364-.8.812-.8zm-11.624 0c.448 0 .812.358.812.8 0 .441-.364.8-.812.8a.806.806 0 01-.813-.8c0-.442.364-.8.813-.8zm7.79-.841c.32-.384.846-.54 1.33-.394.483.146.83.564.878 1.06.048.495-.212.97-.659 1.203-.322.168-.447-.477-.767-.585l.002-.003c-.287-.098-.772.362-.925.079a1.215 1.215 0 01.14-1.36zm-4.323 0c.322.384.377.92.14 1.36-.152.283-.64-.177-.925-.079l.003.003c-.108.036-.194.134-.273.24l-.118.165c-.11.15-.22.262-.377.18a1.226 1.226 0 01-.658-1.204c.048-.495.395-.913.878-1.059a1.262 1.262 0 011.33.394z"></path></svg>
|