@arizeai/phoenix-otel 0.1.0 → 0.2.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.
- package/dist/esm/createNoOpProvider.d.ts +6 -0
- package/dist/esm/createNoOpProvider.d.ts.map +1 -0
- package/dist/esm/createNoOpProvider.js +9 -0
- package/dist/esm/createNoOpProvider.js.map +1 -0
- package/dist/esm/index.d.ts +5 -2
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +5 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/register.d.ts +13 -1
- package/dist/esm/register.d.ts.map +1 -1
- package/dist/esm/register.js +9 -2
- package/dist/esm/register.js.map +1 -1
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/esm/utils.d.ts +3 -0
- package/dist/esm/utils.d.ts.map +1 -0
- package/dist/esm/utils.js +4 -0
- package/dist/esm/utils.js.map +1 -0
- package/dist/src/createNoOpProvider.d.ts +6 -0
- package/dist/src/createNoOpProvider.d.ts.map +1 -0
- package/dist/src/createNoOpProvider.js +12 -0
- package/dist/src/createNoOpProvider.js.map +1 -0
- package/dist/src/index.d.ts +5 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +21 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/register.d.ts +13 -1
- package/dist/src/register.d.ts.map +1 -1
- package/dist/src/register.js +9 -2
- package/dist/src/register.js.map +1 -1
- package/dist/src/utils.d.ts +3 -0
- package/dist/src/utils.d.ts.map +1 -0
- package/dist/src/utils.js +7 -0
- package/dist/src/utils.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/createNoOpProvider.ts +10 -0
- package/src/index.ts +13 -2
- package/src/register.ts +21 -1
- package/src/utils.ts +9 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClE,GAAG,EAAE,CAAC,GACL,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAIhC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,kBAAkB,CAChC,GAAM;IAEN,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CACzB,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createNoOpProvider.d.ts","sourceRoot":"","sources":["../../src/createNoOpProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAEnE;;GAEG;AACH,wBAAgB,kBAAkB,uBAIjC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createNoOpProvider = createNoOpProvider;
|
|
4
|
+
const sdk_trace_node_1 = require("@opentelemetry/sdk-trace-node");
|
|
5
|
+
/**
|
|
6
|
+
* For dry runs we create a provider that doesn't export traces.
|
|
7
|
+
*/
|
|
8
|
+
function createNoOpProvider() {
|
|
9
|
+
const provider = new sdk_trace_node_1.NodeTracerProvider({});
|
|
10
|
+
return provider;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=createNoOpProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createNoOpProvider.js","sourceRoot":"","sources":["../../src/createNoOpProvider.ts"],"names":[],"mappings":";;AAKA,gDAIC;AATD,kEAAmE;AAEnE;;GAEG;AACH,SAAgB,kBAAkB;IAChC,MAAM,QAAQ,GAAG,IAAI,mCAAkB,CAAC,EAAE,CAAC,CAAC;IAE5C,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
export { trace } from "@opentelemetry/api";
|
|
1
|
+
export { trace, context, type DiagLogLevel, type Tracer, SpanStatusCode, } from "@opentelemetry/api";
|
|
2
2
|
export { registerInstrumentations } from "@opentelemetry/instrumentation";
|
|
3
|
-
export { type RegisterParams, register } from "./register";
|
|
4
3
|
export { type Instrumentation } from "@opentelemetry/instrumentation";
|
|
4
|
+
export { type NodeTracerProvider } from "@opentelemetry/sdk-trace-node";
|
|
5
|
+
export * from "./createNoOpProvider";
|
|
6
|
+
export * from "./register";
|
|
7
|
+
export * from "./utils";
|
|
5
8
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,OAAO,EACP,KAAK,YAAY,EACjB,KAAK,MAAM,EACX,cAAc,GACf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAGxE,cAAc,sBAAsB,CAAC;AACrC,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC"}
|
package/dist/src/index.js
CHANGED
|
@@ -1,10 +1,28 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
2
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
17
|
+
exports.registerInstrumentations = exports.SpanStatusCode = exports.context = exports.trace = void 0;
|
|
4
18
|
var api_1 = require("@opentelemetry/api");
|
|
5
19
|
Object.defineProperty(exports, "trace", { enumerable: true, get: function () { return api_1.trace; } });
|
|
20
|
+
Object.defineProperty(exports, "context", { enumerable: true, get: function () { return api_1.context; } });
|
|
21
|
+
Object.defineProperty(exports, "SpanStatusCode", { enumerable: true, get: function () { return api_1.SpanStatusCode; } });
|
|
6
22
|
var instrumentation_1 = require("@opentelemetry/instrumentation");
|
|
7
23
|
Object.defineProperty(exports, "registerInstrumentations", { enumerable: true, get: function () { return instrumentation_1.registerInstrumentations; } });
|
|
8
|
-
|
|
9
|
-
|
|
24
|
+
// Phoenix abstractions
|
|
25
|
+
__exportStar(require("./createNoOpProvider"), exports);
|
|
26
|
+
__exportStar(require("./register"), exports);
|
|
27
|
+
__exportStar(require("./utils"), exports);
|
|
10
28
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,0CAM4B;AAL1B,4FAAA,KAAK,OAAA;AACL,8FAAA,OAAO,OAAA;AAGP,qGAAA,cAAc,OAAA;AAEhB,kEAA0E;AAAjE,2HAAA,wBAAwB,OAAA;AAIjC,uBAAuB;AACvB,uDAAqC;AACrC,6CAA2B;AAC3B,0CAAwB"}
|
package/dist/src/register.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { NodeTracerProvider } from "@opentelemetry/sdk-trace-node";
|
|
2
2
|
import { Instrumentation } from "@opentelemetry/instrumentation";
|
|
3
|
+
import { DiagLogLevel } from "@opentelemetry/api";
|
|
4
|
+
export type Headers = Record<string, string>;
|
|
3
5
|
/**
|
|
4
6
|
* Configuration parameters for registering Phoenix OpenTelemetry tracing
|
|
5
7
|
*/
|
|
@@ -20,6 +22,10 @@ export type RegisterParams = {
|
|
|
20
22
|
* If not provided, environment variables are checked.
|
|
21
23
|
*/
|
|
22
24
|
apiKey?: string;
|
|
25
|
+
/**
|
|
26
|
+
* Headers to be used when communicating with the OTLP collector
|
|
27
|
+
*/
|
|
28
|
+
headers?: Headers;
|
|
23
29
|
/**
|
|
24
30
|
* Whether to use batching for span processing.
|
|
25
31
|
* It is recommended to use batching in production environments
|
|
@@ -36,6 +42,11 @@ export type RegisterParams = {
|
|
|
36
42
|
* @default true
|
|
37
43
|
*/
|
|
38
44
|
global?: boolean;
|
|
45
|
+
/**
|
|
46
|
+
* The diag log level to set for the built in DiagConsoleLogger instance.
|
|
47
|
+
* Omit to disable built in logging.
|
|
48
|
+
*/
|
|
49
|
+
diagLogLevel?: DiagLogLevel;
|
|
39
50
|
};
|
|
40
51
|
/**
|
|
41
52
|
* Registers Phoenix OpenTelemetry tracing with the specified configuration
|
|
@@ -47,6 +58,7 @@ export type RegisterParams = {
|
|
|
47
58
|
* @param params.instrumentations - A list of instrumentation to register
|
|
48
59
|
* @param params.batch - Whether to use batching for span processing
|
|
49
60
|
* @param params.global - Whether to set the tracer as a global provider
|
|
61
|
+
* @param params.diagLogLevel - the diagnostics log level
|
|
50
62
|
* @returns {NodeTracerProvider} The configured NodeTracerProvider instance
|
|
51
63
|
*
|
|
52
64
|
* @example
|
|
@@ -61,7 +73,7 @@ export type RegisterParams = {
|
|
|
61
73
|
* });
|
|
62
74
|
* ```
|
|
63
75
|
*/
|
|
64
|
-
export declare function register({ url: paramsUrl, apiKey: paramsApiKey, projectName, instrumentations, batch, global, }: RegisterParams): NodeTracerProvider;
|
|
76
|
+
export declare function register({ url: paramsUrl, apiKey: paramsApiKey, headers: paramsHeaders, projectName, instrumentations, batch, global, diagLogLevel, }: RegisterParams): NodeTracerProvider;
|
|
65
77
|
/**
|
|
66
78
|
* A utility method to normalize the URL to be HTTP compatible.
|
|
67
79
|
* Assumes we are using HTTP over gRPC and ensures the URL ends with the correct traces endpoint.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/register.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,kBAAkB,EAEnB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACL,eAAe,EAEhB,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/register.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,kBAAkB,EAEnB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACL,eAAe,EAEhB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAA2B,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE3E,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE7C;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;IACrC;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,QAAQ,CAAC,EACvB,GAAG,EAAE,SAAS,EACd,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,aAAkB,EAC3B,WAAuB,EACvB,gBAAgB,EAChB,KAAY,EACZ,MAAa,EACb,YAAY,GACb,EAAE,cAAc,GAAG,kBAAkB,CA0CrC;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK3D"}
|
package/dist/src/register.js
CHANGED
|
@@ -9,6 +9,7 @@ const resources_1 = require("@opentelemetry/resources");
|
|
|
9
9
|
const sdk_trace_node_1 = require("@opentelemetry/sdk-trace-node");
|
|
10
10
|
const config_1 = require("./config");
|
|
11
11
|
const instrumentation_1 = require("@opentelemetry/instrumentation");
|
|
12
|
+
const api_1 = require("@opentelemetry/api");
|
|
12
13
|
/**
|
|
13
14
|
* Registers Phoenix OpenTelemetry tracing with the specified configuration
|
|
14
15
|
*
|
|
@@ -19,6 +20,7 @@ const instrumentation_1 = require("@opentelemetry/instrumentation");
|
|
|
19
20
|
* @param params.instrumentations - A list of instrumentation to register
|
|
20
21
|
* @param params.batch - Whether to use batching for span processing
|
|
21
22
|
* @param params.global - Whether to set the tracer as a global provider
|
|
23
|
+
* @param params.diagLogLevel - the diagnostics log level
|
|
22
24
|
* @returns {NodeTracerProvider} The configured NodeTracerProvider instance
|
|
23
25
|
*
|
|
24
26
|
* @example
|
|
@@ -33,10 +35,15 @@ const instrumentation_1 = require("@opentelemetry/instrumentation");
|
|
|
33
35
|
* });
|
|
34
36
|
* ```
|
|
35
37
|
*/
|
|
36
|
-
function register({ url: paramsUrl, apiKey: paramsApiKey, projectName = "default", instrumentations, batch = true, global = true, }) {
|
|
38
|
+
function register({ url: paramsUrl, apiKey: paramsApiKey, headers: paramsHeaders = {}, projectName = "default", instrumentations, batch = true, global = true, diagLogLevel, }) {
|
|
39
|
+
if (diagLogLevel) {
|
|
40
|
+
api_1.diag.setLogger(new api_1.DiagConsoleLogger(), diagLogLevel);
|
|
41
|
+
}
|
|
37
42
|
const url = ensureCollectorEndpoint(paramsUrl || (0, config_1.getEnvCollectorURL)() || "http://localhost:6006");
|
|
38
43
|
const apiKey = paramsApiKey || (0, config_1.getEnvApiKey)();
|
|
39
|
-
const headers =
|
|
44
|
+
const headers = Array.isArray(paramsHeaders)
|
|
45
|
+
? Object.fromEntries(paramsHeaders)
|
|
46
|
+
: paramsHeaders;
|
|
40
47
|
const configureHeaders = typeof apiKey == "string";
|
|
41
48
|
if (configureHeaders) {
|
|
42
49
|
headers["authorization"] = `Bearer ${apiKey}`;
|
package/dist/src/register.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/register.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/register.ts"],"names":[],"mappings":";;AA4FA,4BAmDC;AASD,0DAKC;AA7JD,oGAAuF;AACvF,wEAGuC;AACvC,wFAA6E;AAC7E,wDAAkE;AAClE,kEAGuC;AACvC,qCAA4D;AAC5D,oEAGwC;AACxC,4CAA2E;AAmD3E;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,SAAgB,QAAQ,CAAC,EACvB,GAAG,EAAE,SAAS,EACd,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,aAAa,GAAG,EAAE,EAC3B,WAAW,GAAG,SAAS,EACvB,gBAAgB,EAChB,KAAK,GAAG,IAAI,EACZ,MAAM,GAAG,IAAI,EACb,YAAY,GACG;IACf,IAAI,YAAY,EAAE,CAAC;QACjB,UAAI,CAAC,SAAS,CAAC,IAAI,uBAAiB,EAAE,EAAE,YAAY,CAAC,CAAC;IACxD,CAAC;IACD,MAAM,GAAG,GAAG,uBAAuB,CACjC,SAAS,IAAI,IAAA,2BAAkB,GAAE,IAAI,uBAAuB,CAC7D,CAAC;IACF,MAAM,MAAM,GAAG,YAAY,IAAI,IAAA,qBAAY,GAAE,CAAC;IAC9C,MAAM,OAAO,GAAY,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC;QACnD,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC;QACnC,CAAC,CAAC,aAAa,CAAC;IAClB,MAAM,gBAAgB,GAAG,OAAO,MAAM,IAAI,QAAQ,CAAC;IACnD,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,MAAM,EAAE,CAAC;IAChD,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,6CAAiB,CAAC;QACrC,GAAG;QACH,OAAO;KACR,CAAC,CAAC;IACH,IAAI,aAA4B,CAAC;IACjC,IAAI,KAAK,EAAE,CAAC;QACV,aAAa,GAAG,IAAI,sDAA+B,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;IACpE,CAAC;SAAM,CAAC;QACN,aAAa,GAAG,IAAI,uDAAgC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,mCAAkB,CAAC;QACtC,QAAQ,EAAE,IAAA,kCAAsB,EAAC;YAC/B,CAAC,6DAAwB,CAAC,EAAE,WAAW;SACxC,CAAC;QACF,cAAc,EAAE,CAAC,aAAa,CAAC;KAChC,CAAC,CAAC;IAEH,IAAI,gBAAgB,EAAE,CAAC;QACrB,IAAA,0CAAwB,EAAC;YACvB,gBAAgB;YAChB,cAAc,EAAE,QAAQ;SACzB,CAAC,CAAC;IACL,CAAC;IACD,IAAI,MAAM,EAAE,CAAC;QACX,QAAQ,CAAC,QAAQ,EAAE,CAAC;IACtB,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,uBAAuB,CAAC,GAAW;IACjD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC/C,CAAC;IACD,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClE,GAAG,EAAE,CAAC,GACL,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAIhC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.objectAsAttributes = objectAsAttributes;
|
|
4
|
+
function objectAsAttributes(obj) {
|
|
5
|
+
return Object.fromEntries(Object.entries(obj).filter(([_, value]) => value !== null));
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":";;AAEA,gDAMC;AAND,SAAgB,kBAAkB,CAChC,GAAM;IAEN,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CACzB,CAAC;AACtC,CAAC"}
|