@activepieces/piece-open-router 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.
- package/README.md +7 -0
- package/package.json +18 -0
- package/src/index.d.ts +2 -0
- package/src/index.js +54 -0
- package/src/index.js.map +1 -0
- package/src/lib/actions/ask-open-router.d.ts +7 -0
- package/src/lib/actions/ask-open-router.js +72 -0
- package/src/lib/actions/ask-open-router.js.map +1 -0
- package/src/lib/common/index.d.ts +11 -0
- package/src/lib/common/index.js +33 -0
- package/src/lib/common/index.js.map +1 -0
package/README.md
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@activepieces/piece-open-router",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"dependencies": {
|
|
5
|
+
"@sinclair/typebox": "^0.26.3",
|
|
6
|
+
"axios": "1.4.0",
|
|
7
|
+
"dayjs": "^1.11.8",
|
|
8
|
+
"is-base64": "^1.1.0",
|
|
9
|
+
"nanoid": "^3.3.4",
|
|
10
|
+
"semver": "7.5.4",
|
|
11
|
+
"@activepieces/pieces-common": "0.2.2",
|
|
12
|
+
"@activepieces/pieces-framework": "0.6.16",
|
|
13
|
+
"@activepieces/shared": "0.8.1",
|
|
14
|
+
"tslib": "2.6.1"
|
|
15
|
+
},
|
|
16
|
+
"main": "./src/index.js",
|
|
17
|
+
"types": "./src/index.d.ts"
|
|
18
|
+
}
|
package/src/index.d.ts
ADDED
package/src/index.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.openRouter = exports.openRouterAuth = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const pieces_framework_1 = require("@activepieces/pieces-framework");
|
|
6
|
+
const ask_open_router_1 = require("./lib/actions/ask-open-router");
|
|
7
|
+
const pieces_common_1 = require("@activepieces/pieces-common");
|
|
8
|
+
const markdownDescription = `
|
|
9
|
+
Follow these instructions to get your OpenAI API Key:
|
|
10
|
+
|
|
11
|
+
1. Visit the following website: https://openrouter.ai/keys.
|
|
12
|
+
2. Once on the website, click on create a key.
|
|
13
|
+
3. Once you have created a key, copy it and use it for the Api key field on the site.
|
|
14
|
+
`;
|
|
15
|
+
exports.openRouterAuth = pieces_framework_1.PieceAuth.SecretText({
|
|
16
|
+
description: markdownDescription,
|
|
17
|
+
displayName: 'Api Key',
|
|
18
|
+
required: true,
|
|
19
|
+
validate: ({ auth }) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
|
|
20
|
+
// we send a get request to https://openrouter.ai/api/v1/auth/key with the key as a header
|
|
21
|
+
// if the response is 200, then the key is valid
|
|
22
|
+
// if the response is 401, then the key is invalid
|
|
23
|
+
try {
|
|
24
|
+
const request = {
|
|
25
|
+
url: 'https://openrouter.ai/api/v1/auth/key',
|
|
26
|
+
method: pieces_common_1.HttpMethod.GET,
|
|
27
|
+
authentication: {
|
|
28
|
+
type: pieces_common_1.AuthenticationType.BEARER_TOKEN,
|
|
29
|
+
token: auth,
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
yield pieces_common_1.httpClient.sendRequest(request);
|
|
33
|
+
return {
|
|
34
|
+
valid: true,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
return {
|
|
39
|
+
valid: false,
|
|
40
|
+
error: "Invalid API Key",
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
})
|
|
44
|
+
});
|
|
45
|
+
exports.openRouter = (0, pieces_framework_1.createPiece)({
|
|
46
|
+
displayName: "Open-router",
|
|
47
|
+
auth: exports.openRouterAuth,
|
|
48
|
+
minimumSupportedRelease: '0.8.0',
|
|
49
|
+
logoUrl: "https://cdn.activepieces.com/pieces/open-router.png",
|
|
50
|
+
authors: ["Salem-Alaa"],
|
|
51
|
+
actions: [ask_open_router_1.askOpenRouterAction],
|
|
52
|
+
triggers: [],
|
|
53
|
+
});
|
|
54
|
+
//# sourceMappingURL=index.js.map
|
package/src/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/pieces/open-router/src/index.ts"],"names":[],"mappings":";;;;AACA,qEAAwE;AACxE,mEAAoE;AACpE,+DAAsG;AAEtG,MAAM,mBAAmB,GAAG;;;;;;CAM3B,CAAC;AACW,QAAA,cAAc,GAAG,4BAAS,CAAC,UAAU,CAAC;IAC/C,WAAW,EAAE,mBAAmB;IAChC,WAAW,EAAE,SAAS;IACtB,QAAQ,EAAE,IAAI;IACd,QAAQ,EAAE,CAAO,EAAE,IAAI,EAAE,EAAE,EAAE;QACzB,0FAA0F;QAC1F,gDAAgD;QAChD,kDAAkD;QAClD,IAAI;YACA,MAAM,OAAO,GAAgB;gBACzB,GAAG,EAAE,uCAAuC;gBAC5C,MAAM,EAAE,0BAAU,CAAC,GAAG;gBACtB,cAAc,EAAE;oBACZ,IAAI,EAAE,kCAAkB,CAAC,YAAY;oBACrC,KAAK,EAAE,IAAI;iBACd;aACJ,CAAC;YACF,MAAM,0BAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YACtC,OAAO;gBACH,KAAK,EAAE,IAAI;aACd,CAAC;SACL;QAAC,OAAO,KAAK,EAAE;YACZ,OAAO;gBACH,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,iBAAiB;aAC3B,CAAC;SACL;IACL,CAAC,CAAA;CACJ,CAAC,CAAC;AAEU,QAAA,UAAU,GAAG,IAAA,8BAAW,EAAC;IAClC,WAAW,EAAE,aAAa;IAC1B,IAAI,EAAE,sBAAc;IACpB,uBAAuB,EAAE,OAAO;IAChC,OAAO,EAAE,qDAAqD;IAC9D,OAAO,EAAE,CAAC,YAAY,CAAC;IACvB,OAAO,EAAE,CAAE,qCAAmB,CAAE;IAChC,QAAQ,EAAE,EAAE;CACf,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const askOpenRouterAction: import("@activepieces/pieces-framework").IAction<import("@activepieces/pieces-framework").SecretTextProperty<true>, {
|
|
2
|
+
model: import("@activepieces/pieces-framework").StaticDropdownProperty<string, true>;
|
|
3
|
+
prompt: import("@activepieces/pieces-framework").LongTextProperty<true>;
|
|
4
|
+
temperature: import("@activepieces/pieces-framework").NumberProperty<false>;
|
|
5
|
+
maxTokens: import("@activepieces/pieces-framework").NumberProperty<false>;
|
|
6
|
+
topP: import("@activepieces/pieces-framework").NumberProperty<false>;
|
|
7
|
+
}>;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.askOpenRouterAction = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const index_1 = require("../../index");
|
|
6
|
+
const pieces_framework_1 = require("@activepieces/pieces-framework");
|
|
7
|
+
const common_1 = require("../common");
|
|
8
|
+
const pieces_common_1 = require("@activepieces/pieces-common");
|
|
9
|
+
exports.askOpenRouterAction = (0, pieces_framework_1.createAction)({
|
|
10
|
+
name: 'ask-lmm',
|
|
11
|
+
displayName: 'Ask Open Router',
|
|
12
|
+
description: 'Ask any model supported by Open Router.',
|
|
13
|
+
auth: index_1.openRouterAuth,
|
|
14
|
+
props: {
|
|
15
|
+
model: pieces_framework_1.Property.StaticDropdown({
|
|
16
|
+
displayName: 'Model',
|
|
17
|
+
required: true,
|
|
18
|
+
description: 'The model which will generate the completion. Some models are suitable for natural language tasks, others specialize in code.',
|
|
19
|
+
options: { options: common_1.openRouterModels },
|
|
20
|
+
defaultValue: 'pygmalionai/mythalion-13b'
|
|
21
|
+
}),
|
|
22
|
+
prompt: pieces_framework_1.Property.LongText({
|
|
23
|
+
displayName: 'Prompt',
|
|
24
|
+
required: true,
|
|
25
|
+
description: 'The prompt to send to the model.'
|
|
26
|
+
}),
|
|
27
|
+
temperature: pieces_framework_1.Property.Number({
|
|
28
|
+
displayName: 'Temperature',
|
|
29
|
+
required: false,
|
|
30
|
+
description: 'Controls randomness: Lowering results in less random completions. As the temperature approaches zero, the model will become deterministic and repetitive.',
|
|
31
|
+
validators: [pieces_framework_1.Validators.minValue(0), pieces_framework_1.Validators.maxValue(1.0)]
|
|
32
|
+
}),
|
|
33
|
+
maxTokens: pieces_framework_1.Property.Number({
|
|
34
|
+
displayName: 'Maximum Tokens',
|
|
35
|
+
required: false,
|
|
36
|
+
description: "The maximum number of tokens to generate. Requests can use up to 2,048 or 4,096 tokens shared between prompt and completion, don't set the value to maximum and leave some tokens for the input. The exact limit varies by model. (One token is roughly 4 characters for normal English text)"
|
|
37
|
+
}),
|
|
38
|
+
topP: pieces_framework_1.Property.Number({
|
|
39
|
+
displayName: 'Top P',
|
|
40
|
+
required: false,
|
|
41
|
+
description: 'An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered.',
|
|
42
|
+
validators: [pieces_framework_1.Validators.minValue(0), pieces_framework_1.Validators.maxValue(1.0)]
|
|
43
|
+
}),
|
|
44
|
+
},
|
|
45
|
+
run(context) {
|
|
46
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
47
|
+
const openRouterModel = context.propsValue.model;
|
|
48
|
+
const prompt = context.propsValue.prompt;
|
|
49
|
+
const request = {
|
|
50
|
+
url: 'https://openrouter.ai/api/v1/chat/completions',
|
|
51
|
+
method: pieces_common_1.HttpMethod.POST,
|
|
52
|
+
body: {
|
|
53
|
+
prompt: prompt,
|
|
54
|
+
model: openRouterModel,
|
|
55
|
+
temperature: context.propsValue.temperature,
|
|
56
|
+
max_tokens: context.propsValue.maxTokens,
|
|
57
|
+
top_p: context.propsValue.topP,
|
|
58
|
+
},
|
|
59
|
+
authentication: {
|
|
60
|
+
type: pieces_common_1.AuthenticationType.BEARER_TOKEN,
|
|
61
|
+
token: context.auth,
|
|
62
|
+
},
|
|
63
|
+
headers: {
|
|
64
|
+
'HTTP-Referer': 'https://openrouter.ai/playground',
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
const response = yield pieces_common_1.httpClient.sendRequest(request);
|
|
68
|
+
return response.body.choices[0].text;
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
//# sourceMappingURL=ask-open-router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask-open-router.js","sourceRoot":"","sources":["../../../../../../../packages/pieces/open-router/src/lib/actions/ask-open-router.ts"],"names":[],"mappings":";;;;AAAA,uCAA6C;AAC7C,qEAAoF;AACpF,sCAA6D;AAC7D,+DAAsG;AAGzF,QAAA,mBAAmB,GAAG,IAAA,+BAAY,EAAC;IAC5C,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,iBAAiB;IAC9B,WAAW,EAAE,yCAAyC;IACtD,IAAI,EAAE,sBAAc;IACpB,KAAK,EAAE;QACH,KAAK,EAAG,2BAAQ,CAAC,cAAc,CAAC;YAC5B,WAAW,EAAE,OAAO;YACpB,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,+HAA+H;YAC5I,OAAO,EAAE,EAAE,OAAO,EAAE,yBAAgB,EAAE;YACtC,YAAY,EAAE,2BAA2B;SAC5C,CAAC;QACF,MAAM,EAAG,2BAAQ,CAAC,QAAQ,CAAC;YACvB,WAAW,EAAE,QAAQ;YACrB,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,kCAAkC;SAClD,CAAC;QACF,WAAW,EAAE,2BAAQ,CAAC,MAAM,CAAC;YACzB,WAAW,EAAE,aAAa;YAC1B,QAAQ,EAAE,KAAK;YACf,WAAW,EACT,2JAA2J;YAC7J,UAAU,EAAE,CAAC,6BAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,6BAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;SAC/D,CAAC;QACF,SAAS,EAAE,2BAAQ,CAAC,MAAM,CAAC;YACzB,WAAW,EAAE,gBAAgB;YAC7B,QAAQ,EAAE,KAAK;YACf,WAAW,EACT,+RAA+R;SAClS,CAAC;QACF,IAAI,EAAE,2BAAQ,CAAC,MAAM,CAAC;YACpB,WAAW,EAAE,OAAO;YACpB,QAAQ,EAAE,KAAK;YACf,WAAW,EACT,6OAA6O;YAC7O,UAAU,EAAE,CAAC,6BAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,6BAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;SACjE,CAAC;KACP;IACK,GAAG,CAAE,OAAO;;YACd,MAAM,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC;YACjD,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;YACzC,MAAM,OAAO,GAAiB;gBAC1B,GAAG,EAAE,+CAA+C;gBACpD,MAAM,EAAE,0BAAU,CAAC,IAAI;gBACvB,IAAI,EAAE;oBACF,MAAM,EAAE,MAAM;oBACd,KAAK,EAAE,eAAe;oBACtB,WAAW,EAAE,OAAO,CAAC,UAAU,CAAC,WAAW;oBAC3C,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,SAAS;oBACxC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,IAAI;iBACjC;gBACD,cAAc,EAAE;oBACZ,IAAI,EAAG,kCAAkB,CAAC,YAAY;oBACtC,KAAK,EAAE,OAAO,CAAC,IAAI;iBACtB;gBACD,OAAO,EAAE;oBACL,cAAc,EAAE,kCAAkC;iBACrD;aACJ,CAAC;YACF,MAAM,QAAQ,GAAG,MAAM,0BAAU,CAAC,WAAW,CAAiB,OAAO,CAAC,CAAC;YACvE,OAAQ,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1C,CAAC;KAAA;CACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.openRouterModels = void 0;
|
|
4
|
+
exports.openRouterModels = [
|
|
5
|
+
{ label: 'OpenAI: GPT-3.5 Turbo', value: 'openai/gpt-3.5-turbo' },
|
|
6
|
+
{ label: 'OpenAI: GPT-3.5 Turbo 16k', value: 'openai/gpt-3.5-turbo-16k' },
|
|
7
|
+
{ label: 'OpenAI: GPT-4', value: 'openai/gpt-4' },
|
|
8
|
+
{ label: 'OpenAI: GPT-4 32k', value: 'openai/gpt-4-32k' },
|
|
9
|
+
{ label: 'Anthropic: Claude v2', value: 'anthropic/claude-2' },
|
|
10
|
+
{ label: 'Anthropic: Claude Instant v1', value: 'anthropic/claude-instant-v1' },
|
|
11
|
+
{ label: 'Google: PaLM 2 Bison', value: 'google/palm-2-chat-bison' },
|
|
12
|
+
{ label: 'Google: PaLM 2 Bison (Code Chat)', value: 'google/palm-2-codechat-bison' },
|
|
13
|
+
{ label: 'Meta: Llama v2 13B Chat (beta)', value: 'meta-llama/llama-2-13b-chat' },
|
|
14
|
+
{ label: 'Meta: Llama v2 70B Chat (beta)', value: 'meta-llama/llama-2-70b-chat' },
|
|
15
|
+
{ label: 'Meta: CodeLlama 34B Instruct (beta)', value: 'meta-llama/codellama-34b-instruct' },
|
|
16
|
+
{ label: 'Nous: Hermes Llama2 13B (beta)', value: 'nousresearch/nous-hermes-llama2-13b' },
|
|
17
|
+
{ label: 'Mancer: Weaver 12k (alpha)', value: 'mancer/weaver' },
|
|
18
|
+
{ label: 'MythoMax L2 13B (beta)', value: 'gryphe/mythomax-l2-13b' },
|
|
19
|
+
{ label: 'Airoboros L2 70B (beta)', value: 'jondurbin/airoboros-l2-70b-2.1' },
|
|
20
|
+
{ label: 'ReMM SLERP L2 13B (beta)', value: 'undi95/remm-slerp-l2-13b' },
|
|
21
|
+
{ label: 'Mythalion 13B (NEW)', value: 'pygmalionai/mythalion-13b' },
|
|
22
|
+
{ label: 'OpenAI: GPT-3.5 Turbo (older v0301)', value: 'openai/gpt-3.5-turbo-0301' },
|
|
23
|
+
{ label: 'OpenAI: GPT-4 (older v0314)', value: 'openai/gpt-4-0314' },
|
|
24
|
+
{ label: 'OpenAI: GPT-4 32k (older v0314)', value: 'openai/gpt-4-32k-0314' },
|
|
25
|
+
{ label: 'OpenAI: Davinci (No RL)', value: 'openai/text-davinci-002' },
|
|
26
|
+
{ label: 'Anthropic: Claude v1', value: 'anthropic/claude-v1' },
|
|
27
|
+
{ label: 'Anthropic: Claude (older v1)', value: 'anthropic/claude-1.2' },
|
|
28
|
+
{ label: 'Anthropic: Claude Instant 100k v1', value: 'anthropic/claude-instant-v1-100k' },
|
|
29
|
+
{ label: 'Anthropic: Claude 100k v1', value: 'anthropic/claude-v1-100k' },
|
|
30
|
+
{ label: 'Anthropic: Claude Instant (older v1)', value: 'anthropic/claude-instant-1.0' },
|
|
31
|
+
{ label: 'OpenAI: Shap-e (beta)', value: 'openai/shap-e' },
|
|
32
|
+
];
|
|
33
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../packages/pieces/open-router/src/lib/common/index.ts"],"names":[],"mappings":";;;AAAa,QAAA,gBAAgB,GAAI;IAC7B,EAAE,KAAK,EAAE,uBAAuB,EAAG,KAAK,EAAE,sBAAsB,EAAE;IAClE,EAAE,KAAK,EAAE,2BAA2B,EAAG,KAAK,EAAE,0BAA0B,EAAE;IAC1E,EAAE,KAAK,EAAE,eAAe,EAAG,KAAK,EAAE,cAAc,EAAE;IAClD,EAAE,KAAK,EAAE,mBAAmB,EAAG,KAAK,EAAE,kBAAkB,EAAE;IAC1D,EAAE,KAAK,EAAE,sBAAsB,EAAG,KAAK,EAAE,oBAAoB,EAAE;IAC/D,EAAE,KAAK,EAAE,8BAA8B,EAAG,KAAK,EAAE,6BAA6B,EAAE;IAChF,EAAE,KAAK,EAAE,sBAAsB,EAAG,KAAK,EAAE,0BAA0B,EAAE;IACrE,EAAE,KAAK,EAAE,kCAAkC,EAAG,KAAK,EAAE,8BAA8B,EAAE;IACrF,EAAE,KAAK,EAAE,gCAAgC,EAAG,KAAK,EAAE,6BAA6B,EAAE;IAClF,EAAE,KAAK,EAAE,gCAAgC,EAAG,KAAK,EAAE,6BAA6B,EAAE;IAClF,EAAE,KAAK,EAAE,qCAAqC,EAAG,KAAK,EAAE,mCAAmC,EAAE;IAC7F,EAAE,KAAK,EAAE,gCAAgC,EAAG,KAAK,EAAE,qCAAqC,EAAE;IAC1F,EAAE,KAAK,EAAE,4BAA4B,EAAG,KAAK,EAAE,eAAe,EAAE;IAChE,EAAE,KAAK,EAAE,wBAAwB,EAAG,KAAK,EAAE,wBAAwB,EAAE;IACrE,EAAE,KAAK,EAAE,yBAAyB,EAAG,KAAK,EAAE,gCAAgC,EAAE;IAC9E,EAAE,KAAK,EAAE,0BAA0B,EAAG,KAAK,EAAE,0BAA0B,EAAE;IACzE,EAAE,KAAK,EAAE,qBAAqB,EAAG,KAAK,EAAE,2BAA2B,EAAE;IACrE,EAAE,KAAK,EAAE,qCAAqC,EAAG,KAAK,EAAE,2BAA2B,EAAE;IACrF,EAAE,KAAK,EAAE,6BAA6B,EAAG,KAAK,EAAE,mBAAmB,EAAE;IACrE,EAAE,KAAK,EAAE,iCAAiC,EAAG,KAAK,EAAE,uBAAuB,EAAE;IAC7E,EAAE,KAAK,EAAE,yBAAyB,EAAG,KAAK,EAAE,yBAAyB,EAAE;IACvE,EAAE,KAAK,EAAE,sBAAsB,EAAG,KAAK,EAAE,qBAAqB,EAAE;IAChE,EAAE,KAAK,EAAE,8BAA8B,EAAG,KAAK,EAAE,sBAAsB,EAAE;IACzE,EAAE,KAAK,EAAE,mCAAmC,EAAG,KAAK,EAAE,kCAAkC,EAAE;IAC1F,EAAE,KAAK,EAAE,2BAA2B,EAAG,KAAK,EAAE,0BAA0B,EAAE;IAC1E,EAAE,KAAK,EAAE,sCAAsC,EAAG,KAAK,EAAE,8BAA8B,EAAE;IACzF,EAAE,KAAK,EAAE,uBAAuB,EAAG,KAAK,EAAE,eAAe,EAAE;CAC9D,CAAC"}
|