hpmcp 0.0.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.
@@ -0,0 +1,21 @@
1
+ interface CacheResult {
2
+ value: any;
3
+ expired: boolean;
4
+ exists: boolean;
5
+ }
6
+ export declare class DiskCache {
7
+ private dir;
8
+ private defaultTtl;
9
+ private index;
10
+ private ready;
11
+ constructor(dir: string, defaultTtl: number);
12
+ init(): Promise<void>;
13
+ private key;
14
+ private filePath;
15
+ private loadIndex;
16
+ get(...parts: string[]): Promise<CacheResult>;
17
+ set(parts: string[], value: any, ttl?: number): Promise<void>;
18
+ del(...parts: string[]): Promise<void>;
19
+ clear(): Promise<number>;
20
+ }
21
+ export {};
package/dist/cache.js ADDED
@@ -0,0 +1,88 @@
1
+ import { readFile, writeFile, unlink, readdir, mkdir } from "node:fs/promises";
2
+ import { createHash } from "node:crypto";
3
+ import { join } from "node:path";
4
+ export class DiskCache {
5
+ dir;
6
+ defaultTtl;
7
+ index = new Map();
8
+ ready = false;
9
+ constructor(dir, defaultTtl) {
10
+ this.dir = dir;
11
+ this.defaultTtl = defaultTtl;
12
+ }
13
+ async init() {
14
+ await mkdir(this.dir, { recursive: true });
15
+ await this.loadIndex();
16
+ this.ready = true;
17
+ }
18
+ key(parts) {
19
+ return createHash("sha256").update(parts.join("\0")).digest("hex").slice(0, 16);
20
+ }
21
+ filePath(id) {
22
+ return join(this.dir, `${id}.json`);
23
+ }
24
+ async loadIndex() {
25
+ const files = await readdir(this.dir);
26
+ for (const f of files) {
27
+ if (!f.endsWith(".json"))
28
+ continue;
29
+ try {
30
+ const raw = await readFile(join(this.dir, f), "utf-8");
31
+ const entry = JSON.parse(raw);
32
+ this.index.set(f.replace(".json", ""), { ts: entry.ts, ttl: entry.ttl });
33
+ }
34
+ catch { }
35
+ }
36
+ }
37
+ async get(...parts) {
38
+ if (!this.ready)
39
+ return { value: null, expired: false, exists: false };
40
+ const id = this.key(parts);
41
+ const meta = this.index.get(id);
42
+ if (!meta)
43
+ return { value: null, expired: false, exists: false };
44
+ const now = Date.now() / 1000;
45
+ const expired = now - meta.ts > meta.ttl;
46
+ try {
47
+ const raw = await readFile(this.filePath(id), "utf-8");
48
+ return { value: JSON.parse(raw).value, expired, exists: true };
49
+ }
50
+ catch {
51
+ this.index.delete(id);
52
+ return { value: null, expired: false, exists: false };
53
+ }
54
+ }
55
+ async set(parts, value, ttl) {
56
+ if (!this.ready)
57
+ return;
58
+ const id = this.key(parts);
59
+ const ts = Date.now() / 1000;
60
+ const entry = { value, ts, ttl: ttl ?? this.defaultTtl };
61
+ await writeFile(this.filePath(id), JSON.stringify(entry));
62
+ this.index.set(id, { ts, ttl: entry.ttl });
63
+ }
64
+ async del(...parts) {
65
+ const id = this.key(parts);
66
+ try {
67
+ await unlink(this.filePath(id));
68
+ }
69
+ catch { }
70
+ this.index.delete(id);
71
+ }
72
+ async clear() {
73
+ const files = await readdir(this.dir);
74
+ let n = 0;
75
+ for (const f of files) {
76
+ if (!f.endsWith(".json"))
77
+ continue;
78
+ try {
79
+ await unlink(join(this.dir, f));
80
+ n++;
81
+ }
82
+ catch { }
83
+ }
84
+ this.index.clear();
85
+ return n;
86
+ }
87
+ }
88
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env node
2
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { homedir } from "node:os";
5
+ import { join } from "node:path";
6
+ import { DiskCache } from "./cache.js";
7
+ import { connect } from "./remote.js";
8
+ import { registerHandlers } from "./mcp.js";
9
+ const UPSTREAM = {
10
+ react: "https://hp-mcp-proxy.932324.xyz/mcp",
11
+ native: "https://hp-native-mcp-proxy.932324.xyz/mcp",
12
+ };
13
+ const [channel, token] = [process.argv[2], process.argv[3]];
14
+ if (!channel || !(channel in UPSTREAM)) {
15
+ process.stderr.write(`Usage: hpmcp <react|native> <token>\n`);
16
+ process.exit(1);
17
+ }
18
+ if (!token) {
19
+ process.stderr.write(`Error: token is required\n`);
20
+ process.exit(1);
21
+ }
22
+ const cacheDir = process.env.CACHE_DIR ?? join(homedir(), ".hpmcp", "cache", channel);
23
+ const cacheTtl = parseInt(process.env.CACHE_TTL ?? "1800", 10);
24
+ async function main() {
25
+ const cache = new DiskCache(cacheDir, cacheTtl);
26
+ await cache.init();
27
+ const server = new Server({ name: `hpmcp-${channel}`, version: "0.0.1" }, { capabilities: { tools: {} } });
28
+ registerHandlers(server, cache);
29
+ connect(UPSTREAM[channel], token)
30
+ .then(() => process.stderr.write(`[hpmcp] upstream connected\n`))
31
+ .catch((e) => {
32
+ process.stderr.write(`[hpmcp] upstream failed: ${e.message}\n`);
33
+ process.stderr.write(`[hpmcp] serving from cache\n`);
34
+ });
35
+ const transport = new StdioServerTransport();
36
+ await server.connect(transport);
37
+ }
38
+ main().catch((e) => {
39
+ process.stderr.write(`[hpmcp] fatal: ${e.message}\n`);
40
+ process.exit(1);
41
+ });
42
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C,MAAM,QAAQ,GAA2B;IACvC,KAAK,EAAE,qCAAqC;IAC5C,MAAM,EAAE,4CAA4C;CACrD,CAAC;AAEF,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAE5D,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,IAAI,QAAQ,CAAC,EAAE,CAAC;IACvC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,CAAC,KAAK,EAAE,CAAC;IACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACtF,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;AAE/D,KAAK,UAAU,IAAI;IACjB,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAChD,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;IAEnB,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,SAAS,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAC9C,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAChC,CAAC;IAEF,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAEhC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC;SAC9B,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;SAChE,KAAK,CAAC,CAAC,CAAM,EAAE,EAAE;QAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC;QAChE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEL,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;IACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC;IACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
package/dist/mcp.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
2
+ import { DiskCache } from "./cache.js";
3
+ export declare function registerHandlers(server: Server, cache: DiskCache): void;
package/dist/mcp.js ADDED
@@ -0,0 +1,67 @@
1
+ import { InitializeRequestSchema, ListToolsRequestSchema, CallToolRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
2
+ import { getClient } from "./remote.js";
3
+ export function registerHandlers(server, cache) {
4
+ server.setRequestHandler(InitializeRequestSchema, async () => {
5
+ const cached = await cache.get("init");
6
+ if (cached.exists && !cached.expired)
7
+ return cached.value;
8
+ const c = getClient();
9
+ if (c) {
10
+ try {
11
+ const result = {
12
+ protocolVersion: "2024-11-05",
13
+ capabilities: c.getServerCapabilities() ?? {},
14
+ serverInfo: c.getServerVersion() ?? { name: "hpmcp", version: "0.0.1" },
15
+ };
16
+ await cache.set(["init"], result);
17
+ return result;
18
+ }
19
+ catch { }
20
+ }
21
+ if (cached.exists)
22
+ return cached.value;
23
+ return {
24
+ protocolVersion: "2024-11-05",
25
+ capabilities: { tools: {} },
26
+ serverInfo: { name: "hpmcp", version: "0.0.1" },
27
+ };
28
+ });
29
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
30
+ const cached = await cache.get("tools_list");
31
+ if (cached.exists && !cached.expired)
32
+ return cached.value;
33
+ const c = getClient();
34
+ if (c) {
35
+ try {
36
+ const { tools } = await c.listTools();
37
+ const result = { tools };
38
+ await cache.set(["tools_list"], result);
39
+ return result;
40
+ }
41
+ catch { }
42
+ }
43
+ if (cached.exists)
44
+ return cached.value;
45
+ return { tools: [] };
46
+ });
47
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
48
+ const { name, arguments: args } = request.params;
49
+ const argsKey = JSON.stringify(args ?? {});
50
+ const cached = await cache.get("tool_call", name, argsKey);
51
+ if (cached.exists && !cached.expired)
52
+ return cached.value;
53
+ const c = getClient();
54
+ if (c) {
55
+ try {
56
+ const result = await c.callTool({ name, arguments: args });
57
+ await cache.set(["tool_call", name, argsKey], result);
58
+ return result;
59
+ }
60
+ catch { }
61
+ }
62
+ if (cached.exists)
63
+ return cached.value;
64
+ throw new Error(`Tool call failed: ${name} (remote unavailable, no cache)`);
65
+ });
66
+ }
67
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AACA,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,SAAS,EAAe,MAAM,aAAa,CAAC;AAErD,MAAM,UAAU,gBAAgB,CAAC,MAAc,EAAE,KAAgB;IAC/D,MAAM,CAAC,iBAAiB,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC;QAE1D,MAAM,CAAC,GAAG,SAAS,EAAE,CAAC;QACtB,IAAI,CAAC,EAAE,CAAC;YACN,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG;oBACb,eAAe,EAAE,YAAY;oBAC7B,YAAY,EAAE,CAAC,CAAC,qBAAqB,EAAE,IAAI,EAAE;oBAC7C,UAAU,EAAE,CAAC,CAAC,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE;iBACxE,CAAC;gBACF,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;gBAClC,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;QAED,IAAI,MAAM,CAAC,MAAM;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC;QAEvC,OAAO;YACL,eAAe,EAAE,YAAY;YAC7B,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;YAC3B,UAAU,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE;SAChD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC7C,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC;QAE1D,MAAM,CAAC,GAAG,SAAS,EAAE,CAAC;QACtB,IAAI,CAAC,EAAE,CAAC;YACN,IAAI,CAAC;gBACH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;gBACtC,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,CAAC;gBACzB,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC;gBACxC,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;QAED,IAAI,MAAM,CAAC,MAAM;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC;QACvC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QACjD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAE3C,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3D,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC;QAE1D,MAAM,CAAC,GAAG,SAAS,EAAE,CAAC;QACtB,IAAI,CAAC,EAAE,CAAC;YACN,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC3D,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;gBACtD,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;QAED,IAAI,MAAM,CAAC,MAAM;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,iCAAiC,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
+ export declare function connect(url: string, token: string): Promise<Client>;
3
+ export declare function getClient(): Client | null;
4
+ export declare function isConnected(): boolean;
package/dist/remote.js ADDED
@@ -0,0 +1,29 @@
1
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
+ import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
3
+ let client = null;
4
+ export async function connect(url, token) {
5
+ const controller = new AbortController();
6
+ const timer = setTimeout(() => controller.abort(), 10000);
7
+ try {
8
+ const transport = new SSEClientTransport(new URL(url), {
9
+ requestInit: {
10
+ headers: { "x-heroui-personal-token": token },
11
+ signal: controller.signal,
12
+ },
13
+ });
14
+ client = new Client({ name: "hpmcp", version: "0.0.1" }, { capabilities: {} });
15
+ await client.connect(transport);
16
+ console.error(`[hpmcp] connected to ${url}`);
17
+ return client;
18
+ }
19
+ finally {
20
+ clearTimeout(timer);
21
+ }
22
+ }
23
+ export function getClient() {
24
+ return client;
25
+ }
26
+ export function isConnected() {
27
+ return client != null;
28
+ }
29
+ //# sourceMappingURL=remote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote.js","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAE7E,IAAI,MAAM,GAAkB,IAAI,CAAC;AAEjC,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAW,EAAE,KAAa;IACtD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;IAE1D,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,kBAAkB,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE;YACrD,WAAW,EAAE;gBACX,OAAO,EAAE,EAAE,yBAAyB,EAAE,KAAK,EAAE;gBAC7C,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B;SACF,CAAC,CAAC;QAEH,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/E,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAC;QAC7C,OAAO,MAAM,CAAC;IAChB,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,MAAM,IAAI,IAAI,CAAC;AACxB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "hpmcp",
3
+ "version": "0.0.1",
4
+ "type": "module",
5
+ "bin": {
6
+ "hpmcp": "./dist/index.js"
7
+ },
8
+ "files": [
9
+ "dist"
10
+ ],
11
+ "scripts": {
12
+ "dev": "tsx watch src/index.ts",
13
+ "build": "tsc",
14
+ "start": "node dist/index.js"
15
+ },
16
+ "dependencies": {
17
+ "@modelcontextprotocol/sdk": "^1.12.0"
18
+ },
19
+ "devDependencies": {
20
+ "@types/node": "^22.0.0",
21
+ "tsx": "^4.0.0",
22
+ "typescript": "^5.8.0"
23
+ }
24
+ }