fa-consul 1.0.1 → 1.0.3
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 +4 -4
- package/dist/constants.d.ts +1 -1
- package/dist/constants.js +2 -2
- package/dist/cyclic-register.js +1 -1
- package/dist/get-register-config.js +2 -2
- package/dist/prepare-consul-api.js +1 -1
- package/package.json +1 -1
- package/src/constants.ts +2 -2
- package/src/cyclic-register.ts +1 -1
- package/src/prepare-consul-api.ts +1 -1
- package/dist/__tests__/lib/logger.d.ts +0 -3
- package/dist/__tests__/lib/logger.d.ts.map +0 -1
- package/dist/__tests__/lib/logger.js +0 -25
- package/dist/__tests__/lib/logger.js.map +0 -1
- package/dist/src/get-register-config.d.ts +0 -4
- package/dist/src/get-register-config.d.ts.map +0 -1
- package/dist/src/get-register-config.js +0 -94
- package/dist/src/get-register-config.js.map +0 -1
package/README.md
CHANGED
|
@@ -75,7 +75,7 @@ const config = {
|
|
|
75
75
|
name: e.CONSUL_SERVICE_NAME || 'fa-consul',
|
|
76
76
|
instance: e.CONSUL_SERVICE_INSTANCE || 'test',
|
|
77
77
|
version: e.CONSUL_SERVICE_VERSION || '0.0.1',
|
|
78
|
-
description: e.CONSUL_SERVICE_DESCRIPTION || '
|
|
78
|
+
description: e.CONSUL_SERVICE_DESCRIPTION || 'FA-CONSUL TEST',
|
|
79
79
|
tags: e.CONSUL_SERVICE_TAGS || ['af', 'consul', 'test'],
|
|
80
80
|
meta: e.CONSUL_SERVICE_META || { CONSUL_TEST: 12345, line_yellow: 'straight' },
|
|
81
81
|
host: e.CONSUL_SERVICE_HOST || null,
|
|
@@ -95,7 +95,7 @@ const config = {
|
|
|
95
95
|
- Polling ${CONSUL_ID}
|
|
96
96
|
- The data is up-to-date ${CONSUL_ID}
|
|
97
97
|
|
|
98
|
-
|
|
98
|
+
fa-consul
|
|
99
99
|
`${yellow} REGISTER CONFIG:\n${JSON.stringify(registerConfig, undefined, 2)}\n${reset}`
|
|
100
100
|
`CONSUL AGENT OPTIONS:\n${JSON.stringify(fullConsulAgentOptions, undefined, 2)}`
|
|
101
101
|
`${rqId}HTTP Status: ${statusCode}`
|
|
@@ -103,10 +103,10 @@ const config = {
|
|
|
103
103
|
`No info about service ID ${cyan}${serviceName}`
|
|
104
104
|
`${prefixG} Skip registration check after health check`
|
|
105
105
|
|
|
106
|
-
|
|
106
|
+
fa-consul:curl
|
|
107
107
|
const msg = dbg.curl ? getCurl(request, true) : getHttpRequestText(request);
|
|
108
108
|
`[${request._id_}] ${yellow}${msg}${reset}`
|
|
109
109
|
|
|
110
|
-
|
|
110
|
+
fa-consul:reg
|
|
111
111
|
`${PREFIX}: updated ${updatedCount.length} access point(s)`
|
|
112
112
|
`${prefixG} Service ${cyan}${registerConfig.id}${reset} registration check...`
|
package/dist/constants.d.ts
CHANGED
package/dist/constants.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export const PREFIX = '
|
|
1
|
+
export const PREFIX = 'FA-CONSUL';
|
|
2
2
|
export const MAX_API_CACHED = 3;
|
|
3
3
|
export const CONSUL_AP_UPDATE_TIMEOUT_MILLIS = Number(process.env.CONSUL_AP_UPDATE_TIMEOUT_MILLIS) || 10_000;
|
|
4
4
|
export const DEBUG = (String(process.env.DEBUG || '')).trim();
|
|
5
|
-
export const CONSUL_DEBUG_ON = DEBUG.split(/[ ,]/).some((v) => /
|
|
5
|
+
export const CONSUL_DEBUG_ON = DEBUG.split(/[ ,]/).some((v) => /fa-consul/i.test(v) || v === '*');
|
|
6
6
|
export const FORCE_EVERY_REGISTER_ATTEMPT = !!process.env.FORCE_EVERY_REGISTER_ATTEMPT;
|
|
7
7
|
//# sourceMappingURL=constants.js.map
|
package/dist/cyclic-register.js
CHANGED
|
@@ -7,7 +7,7 @@ import { toMills } from './lib/utils';
|
|
|
7
7
|
const prefix = 'CONSUL-REG:';
|
|
8
8
|
const prefixG = `${green}${prefix}${reset}`;
|
|
9
9
|
const DEFAULT_INTERVAL = 60_000;
|
|
10
|
-
const isDebugReg = /\
|
|
10
|
+
const isDebugReg = /\bfa-consul:(reg|\*)/i.test(DEBUG) || /\bfa-consul:\*/i.test(DEBUG);
|
|
11
11
|
const debug = (msg) => {
|
|
12
12
|
if (isDebugReg) {
|
|
13
13
|
console.log(`${magenta}${PREFIX}${reset}: ${msg}`);
|
|
@@ -52,8 +52,8 @@ export const getRegisterConfig = async (options) => {
|
|
|
52
52
|
metaObj.pj_name = packageJson.name;
|
|
53
53
|
metaObj.pj_version = packageJson.version;
|
|
54
54
|
}
|
|
55
|
-
if (metaObj.pj_name !== 'fa-
|
|
56
|
-
packageJson = getPackageJson('/node_modules/fa-
|
|
55
|
+
if (metaObj.pj_name !== 'fa-consul') {
|
|
56
|
+
packageJson = getPackageJson('/node_modules/fa-consul');
|
|
57
57
|
if (packageJson) {
|
|
58
58
|
metaObj.af_consul_version = packageJson.version;
|
|
59
59
|
}
|
|
@@ -13,7 +13,7 @@ import { minimizeCache, parseBoolean, serviceConfigDiff } from './lib/utils';
|
|
|
13
13
|
const mutex = new Mutex();
|
|
14
14
|
const dbg = {
|
|
15
15
|
on: CONSUL_DEBUG_ON,
|
|
16
|
-
curl: /
|
|
16
|
+
curl: /fa-consul:curl/i.test(DEBUG),
|
|
17
17
|
};
|
|
18
18
|
const debug = (msg) => {
|
|
19
19
|
if (dbg.on) {
|
package/package.json
CHANGED
package/src/constants.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export const PREFIX = '
|
|
1
|
+
export const PREFIX = 'FA-CONSUL';
|
|
2
2
|
export const MAX_API_CACHED = 3;
|
|
3
3
|
|
|
4
4
|
export const CONSUL_AP_UPDATE_TIMEOUT_MILLIS = Number(process.env.CONSUL_AP_UPDATE_TIMEOUT_MILLIS) || 10_000;
|
|
5
5
|
export const DEBUG = (String(process.env.DEBUG || '')).trim();
|
|
6
|
-
export const CONSUL_DEBUG_ON = DEBUG.split(/[ ,]/).some((v) => /
|
|
6
|
+
export const CONSUL_DEBUG_ON = DEBUG.split(/[ ,]/).some((v) => /fa-consul/i.test(v) || v === '*');
|
|
7
7
|
export const FORCE_EVERY_REGISTER_ATTEMPT = !!process.env.FORCE_EVERY_REGISTER_ATTEMPT;
|
package/src/cyclic-register.ts
CHANGED
|
@@ -12,7 +12,7 @@ const prefixG = `${green}${prefix}${reset}`;
|
|
|
12
12
|
|
|
13
13
|
const DEFAULT_INTERVAL = 60_000;
|
|
14
14
|
|
|
15
|
-
const isDebugReg = /\
|
|
15
|
+
const isDebugReg = /\bfa-consul:(reg|\*)/i.test(DEBUG) || /\bfa-consul:\*/i.test(DEBUG);
|
|
16
16
|
const debug = (msg: string) => {
|
|
17
17
|
if (isDebugReg) {
|
|
18
18
|
console.log(`${magenta}${PREFIX}${reset}: ${msg}`);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../__tests__/lib/logger.ts"],"names":[],"mappings":"AA0BA,QAAA,MAAQ,MAAM,8BAAgC,CAAC;AAE/C,OAAO,EAAE,MAAM,EAAE,CAAC"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { getAFLogger } from 'af-logger';
|
|
2
|
-
const minLevel = 'silly';
|
|
3
|
-
const prefix = 'fa-consul';
|
|
4
|
-
const logDir = './_log';
|
|
5
|
-
const loggerSettings = {
|
|
6
|
-
minLevel,
|
|
7
|
-
name: prefix,
|
|
8
|
-
filePrefix: prefix,
|
|
9
|
-
logDir,
|
|
10
|
-
minLogSize: 0,
|
|
11
|
-
minErrorLogSize: 0,
|
|
12
|
-
// displayLoggerName: true,
|
|
13
|
-
// displayFunctionName: true,
|
|
14
|
-
// displayFilePath: 'displayAll',
|
|
15
|
-
// emitter: em,
|
|
16
|
-
fileLoggerMap: {
|
|
17
|
-
silly: 'info',
|
|
18
|
-
info: 'info',
|
|
19
|
-
error: 'error',
|
|
20
|
-
fatal: 'error',
|
|
21
|
-
},
|
|
22
|
-
};
|
|
23
|
-
const { logger } = getAFLogger(loggerSettings);
|
|
24
|
-
export { logger };
|
|
25
|
-
//# sourceMappingURL=logger.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../__tests__/lib/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAGxC,MAAM,QAAQ,GAAG,OAAO,CAAC;AACzB,MAAM,MAAM,GAAG,WAAW,CAAC;AAC3B,MAAM,MAAM,GAAG,QAAQ,CAAC;AAExB,MAAM,cAAc,GAAoB;IACtC,QAAQ;IACR,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,MAAM;IAClB,MAAM;IACN,UAAU,EAAE,CAAC;IACb,eAAe,EAAE,CAAC;IAClB,2BAA2B;IAC3B,6BAA6B;IAC7B,iCAAiC;IACjC,eAAe;IACf,aAAa,EAAE;QACb,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,OAAO;QACd,KAAK,EAAE,OAAO;KACf;CACF,CAAC;AAEF,MAAM,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;AAE/C,OAAO,EAAE,MAAM,EAAE,CAAC"}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { ICLOptions, IRegisterConfig } from './interfaces';
|
|
2
|
-
export declare const getServiceID: (name: string, instance: string, envCode?: string) => string;
|
|
3
|
-
export declare const getRegisterConfig: (options: ICLOptions) => Promise<IRegisterConfig>;
|
|
4
|
-
//# sourceMappingURL=get-register-config.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-register-config.d.ts","sourceRoot":"","sources":["../../src/get-register-config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAI3D,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,EAAE,UAAU,MAAM,EAAE,UAAS,MAAW,WAGhF,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAU,SAAS,UAAU,KAAG,OAAO,CAAC,eAAe,CA2FpF,CAAC"}
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
import { PREFIX } from './constants';
|
|
2
|
-
import { getFQDNCached } from './lib/fqdn';
|
|
3
|
-
import { getPackageJson, parseMeta, parseTags, removeAroundQuotas } from './lib/utils';
|
|
4
|
-
export const getServiceID = (name, instance, envCode = '') => {
|
|
5
|
-
const p = (process.env.NODE_CONSUL_ENV || process.env.NODE_ENV) === 'production';
|
|
6
|
-
return `${p ? 'prd' : 'dev'}-${envCode}-${name}-${instance}`.toLowerCase();
|
|
7
|
-
};
|
|
8
|
-
export const getRegisterConfig = async (options) => {
|
|
9
|
-
const { config, envCode = '' } = options;
|
|
10
|
-
const { webServer } = config;
|
|
11
|
-
const consulServiceConfig = config?.consul?.service ?? {};
|
|
12
|
-
const { id, host } = consulServiceConfig;
|
|
13
|
-
let { name, instance, version, description, tags, meta, port } = consulServiceConfig;
|
|
14
|
-
name = removeAroundQuotas(name);
|
|
15
|
-
instance = removeAroundQuotas(instance);
|
|
16
|
-
version = removeAroundQuotas(version);
|
|
17
|
-
description = removeAroundQuotas(description);
|
|
18
|
-
tags = parseTags(tags);
|
|
19
|
-
tags = [name, version, ...(tags)];
|
|
20
|
-
if (envCode) {
|
|
21
|
-
tags.push(envCode);
|
|
22
|
-
}
|
|
23
|
-
port = Number(port) || Number(webServer.port);
|
|
24
|
-
if (!port) {
|
|
25
|
-
throw new Error(`${PREFIX}: Port is empty!`);
|
|
26
|
-
}
|
|
27
|
-
const serviceId = id || process.env.CONSUL_SERVICE_ID || getServiceID(name, instance, envCode);
|
|
28
|
-
const address = host || (await getFQDNCached());
|
|
29
|
-
if (!address) {
|
|
30
|
-
throw new Error(`${PREFIX}: Address is empty!`);
|
|
31
|
-
}
|
|
32
|
-
meta = parseMeta(meta, { serviceId, name, instance, address, port });
|
|
33
|
-
const metaObj = {
|
|
34
|
-
host: address,
|
|
35
|
-
port: String(port),
|
|
36
|
-
NODE_ENV: process.env.NODE_ENV || '',
|
|
37
|
-
};
|
|
38
|
-
if (name) {
|
|
39
|
-
metaObj.name = name;
|
|
40
|
-
}
|
|
41
|
-
if (version) {
|
|
42
|
-
metaObj.version = version;
|
|
43
|
-
}
|
|
44
|
-
if (description) {
|
|
45
|
-
metaObj.description = description;
|
|
46
|
-
}
|
|
47
|
-
if (instance) {
|
|
48
|
-
metaObj.instance = instance;
|
|
49
|
-
}
|
|
50
|
-
let packageJson = getPackageJson();
|
|
51
|
-
if (packageJson) {
|
|
52
|
-
metaObj.pj_name = packageJson.name;
|
|
53
|
-
metaObj.pj_version = packageJson.version;
|
|
54
|
-
}
|
|
55
|
-
if (metaObj.pj_name !== 'fa-consul') {
|
|
56
|
-
packageJson = getPackageJson('/node_modules/fa-consul');
|
|
57
|
-
if (packageJson) {
|
|
58
|
-
metaObj.af_consul_version = packageJson.version;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
const registerConfig = {
|
|
62
|
-
id: serviceId,
|
|
63
|
-
name: serviceId,
|
|
64
|
-
port,
|
|
65
|
-
address,
|
|
66
|
-
tags,
|
|
67
|
-
// @ts-ignore
|
|
68
|
-
meta: { ...metaObj, ...meta },
|
|
69
|
-
};
|
|
70
|
-
const check = { ...(config.consul?.check || {}) };
|
|
71
|
-
[['name', `Service '${name}-${instance}'`], ['timeout', '5s'], ['deregistercriticalserviceafter', '3m']]
|
|
72
|
-
.forEach(([n, v]) => {
|
|
73
|
-
// @ts-ignore
|
|
74
|
-
if (!check[n]) {
|
|
75
|
-
// @ts-ignore
|
|
76
|
-
check[n] = v;
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
if (!(check.http || check.tcp || check.script || check.shell)) {
|
|
80
|
-
check.http = `http://${address}:${port}/health`;
|
|
81
|
-
}
|
|
82
|
-
if ((check.http || check.script) && !check.interval) {
|
|
83
|
-
check.interval = '10s';
|
|
84
|
-
}
|
|
85
|
-
registerConfig.check = check;
|
|
86
|
-
if (!config.service) {
|
|
87
|
-
config.service = {};
|
|
88
|
-
}
|
|
89
|
-
config.service.id = serviceId;
|
|
90
|
-
config.service.address = address;
|
|
91
|
-
config.service.fromService = `${serviceId} / ${address}`;
|
|
92
|
-
return registerConfig;
|
|
93
|
-
};
|
|
94
|
-
//# sourceMappingURL=get-register-config.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-register-config.js","sourceRoot":"","sources":["../../src/get-register-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEvF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,QAAgB,EAAE,UAAkB,EAAE,EAAE,EAAE;IACnF,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,YAAY,CAAC;IACjF,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,OAAO,IAAI,IAAI,IAAI,QAAQ,EAAE,CAAC,WAAW,EAAE,CAAC;AAC7E,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,OAAmB,EAA4B,EAAE;IACvF,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;IACzC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;IAC7B,MAAM,mBAAmB,GAAG,MAAM,EAAE,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC;IAC1D,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,mBAAmB,CAAC;IACzC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,mBAAmB,CAAC;IACrF,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAChC,QAAQ,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACxC,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACtC,WAAW,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAC9C,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAClC,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrB,CAAC;IACD,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,kBAAkB,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,SAAS,GAAG,EAAE,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAE/F,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,MAAM,aAAa,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,qBAAqB,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,MAAM,OAAO,GAA2B;QACtC,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;QAClB,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE;KACrC,CAAC;IACF,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IACtB,CAAC;IACD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;IAC5B,CAAC;IACD,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,CAAC,WAAW,GAAG,WAAW,CAAC;IACpC,CAAC;IACD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC9B,CAAC;IAED,IAAI,WAAW,GAAG,cAAc,EAAE,CAAC;IACnC,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,CAAC,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC;QACnC,OAAO,CAAC,UAAU,GAAG,WAAW,CAAC,OAAO,CAAC;IAC3C,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,KAAK,WAAW,EAAE,CAAC;QACpC,WAAW,GAAG,cAAc,CAAC,yBAAyB,CAAC,CAAC;QACxD,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,iBAAiB,GAAG,WAAW,CAAC,OAAO,CAAC;QAClD,CAAC;IACH,CAAC;IACD,MAAM,cAAc,GAAoB;QACtC,EAAE,EAAE,SAAS;QACb,IAAI,EAAE,SAAS;QACf,IAAI;QACJ,OAAO;QACP,IAAI;QACJ,aAAa;QACb,IAAI,EAA0B,EAAE,GAAG,OAAO,EAAE,GAAG,IAAI,EAAE;KACtD,CAAC;IACF,MAAM,KAAK,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;IAClD,CAAC,CAAC,MAAM,EAAE,YAAY,IAAI,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,gCAAgC,EAAE,IAAI,CAAC,CAAC;SACrG,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;QAClB,aAAa;QACb,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACd,aAAa;YACb,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACf,CAAC;IACH,CAAC,CAAC,CAAC;IACL,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9D,KAAK,CAAC,IAAI,GAAG,UAAU,OAAO,IAAI,IAAI,SAAS,CAAC;IAClD,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACpD,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC;IACzB,CAAC;IACD,cAAc,CAAC,KAAK,GAAG,KAAK,CAAC;IAE7B,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,CAAC,OAAO,GAAG,EAAE,CAAC;IACtB,CAAC;IACD,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC;IAC9B,MAAM,CAAC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;IACjC,MAAM,CAAC,OAAO,CAAC,WAAW,GAAG,GAAG,SAAS,MAAM,OAAO,EAAE,CAAC;IAEzD,OAAO,cAAc,CAAC;AACxB,CAAC,CAAC"}
|