@atria/server 0.0.7 → 0.0.8
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 -2
- package/dist/server.d.ts +1 -1
- package/dist/server.js +50 -14
- package/dist/server.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -29,7 +29,9 @@ await server.close();
|
|
|
29
29
|
|
|
30
30
|
- Serves `localhost` from `<projectRoot>/public`.
|
|
31
31
|
- Serves `admin.localhost` from `<projectRoot>/.atria/runtime`.
|
|
32
|
-
- Responds to `GET /api/health` with `{ "ok": true, "site": "public" | "admin" }`.
|
|
33
|
-
-
|
|
32
|
+
- Responds to `GET /api/health` with `{ "ok": true, "site": "public" | "admin", "publicOutputPublished": boolean }`.
|
|
33
|
+
- If `public/` has no files, `GET /` returns `503 Service Unavailable`.
|
|
34
|
+
- If `public/` has no files, other public routes return `404 Not Found`.
|
|
35
|
+
- For published output, missing public files/routes return `404` (serving `public/404.html` when present).
|
|
34
36
|
- Uses SPA-style `index.html` fallback only for `admin.localhost` non-file routes.
|
|
35
37
|
- Blocks path traversal attempts outside the configured public/admin roots.
|
package/dist/server.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ export interface DevServerHandle {
|
|
|
9
9
|
adminUrl: string;
|
|
10
10
|
servingPublicDir: string;
|
|
11
11
|
servingAdminDir: string;
|
|
12
|
-
|
|
12
|
+
publicOutputPublished: boolean;
|
|
13
13
|
close: () => Promise<void>;
|
|
14
14
|
}
|
|
15
15
|
export declare const startDevServer: (options: StartDevServerOptions) => Promise<DevServerHandle>;
|
package/dist/server.js
CHANGED
|
@@ -13,16 +13,27 @@ const MIME_TYPES = {
|
|
|
13
13
|
".ico": "image/x-icon",
|
|
14
14
|
".txt": "text/plain; charset=utf-8"
|
|
15
15
|
};
|
|
16
|
+
const DEFAULT_NOT_FOUND_TEXT = "404: The requested page was not found.";
|
|
17
|
+
const DEFAULT_PUBLIC_UNAVAILABLE_TEXT = "503: Public site output is not published yet.";
|
|
16
18
|
const PUBLIC_HOST_ALIASES = new Set(["localhost", "127.0.0.1", "[::1]", "::1"]);
|
|
17
19
|
const ADMIN_HOST_ALIASES = new Set(["admin.localhost"]);
|
|
18
20
|
const isInsideDirectory = (basePath, targetPath) => {
|
|
19
21
|
const relativePath = path.relative(basePath, targetPath);
|
|
20
22
|
return relativePath !== "" && !relativePath.startsWith("..") && !path.isAbsolute(relativePath);
|
|
21
23
|
};
|
|
22
|
-
const
|
|
24
|
+
const directoryHasFiles = async (directoryPath) => {
|
|
23
25
|
try {
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
+
const entries = await fs.readdir(directoryPath, { withFileTypes: true });
|
|
27
|
+
for (const entry of entries) {
|
|
28
|
+
const entryPath = path.join(directoryPath, entry.name);
|
|
29
|
+
if (entry.isFile() || entry.isSymbolicLink()) {
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
if (entry.isDirectory() && (await directoryHasFiles(entryPath))) {
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return false;
|
|
26
37
|
}
|
|
27
38
|
catch {
|
|
28
39
|
return false;
|
|
@@ -113,7 +124,22 @@ const respondWithPublicNotFound = async (response, publicDir) => {
|
|
|
113
124
|
// Fall back to plain text when public/404.html is unavailable.
|
|
114
125
|
}
|
|
115
126
|
response.writeHead(404, { "content-type": MIME_TYPES[".txt"] });
|
|
116
|
-
response.end(
|
|
127
|
+
response.end(DEFAULT_NOT_FOUND_TEXT);
|
|
128
|
+
};
|
|
129
|
+
const respondWithDefaultNotFound = (response) => {
|
|
130
|
+
response.writeHead(404, { "content-type": MIME_TYPES[".txt"] });
|
|
131
|
+
response.end(DEFAULT_NOT_FOUND_TEXT);
|
|
132
|
+
};
|
|
133
|
+
const respondWithPublicUnavailable = (response) => {
|
|
134
|
+
response.writeHead(503, {
|
|
135
|
+
"content-type": MIME_TYPES[".txt"],
|
|
136
|
+
"retry-after": "60"
|
|
137
|
+
});
|
|
138
|
+
response.end(DEFAULT_PUBLIC_UNAVAILABLE_TEXT);
|
|
139
|
+
};
|
|
140
|
+
const isRootPublicPath = (requestPath) => {
|
|
141
|
+
const normalizedPath = requestPath.replace(/\/+$/, "");
|
|
142
|
+
return normalizedPath.length === 0 || normalizedPath === "/index.html";
|
|
117
143
|
};
|
|
118
144
|
const closeServer = async (server) => new Promise((resolve, reject) => {
|
|
119
145
|
server.close((error) => {
|
|
@@ -129,23 +155,35 @@ export const startDevServer = async (options) => {
|
|
|
129
155
|
const runtimeDir = path.join(options.projectRoot, ATRIA_RUNTIME_DIR);
|
|
130
156
|
const publicOutputDir = path.join(options.projectRoot, PUBLIC_OUTPUT_DIR);
|
|
131
157
|
await fs.access(runtimeDir);
|
|
132
|
-
const hasPublicOutput = await
|
|
158
|
+
const hasPublicOutput = await directoryHasFiles(publicOutputDir);
|
|
133
159
|
const publicDir = publicOutputDir;
|
|
134
|
-
const
|
|
160
|
+
const publicOutputPublished = hasPublicOutput;
|
|
135
161
|
const server = createServer(async (request, response) => {
|
|
136
162
|
try {
|
|
137
163
|
const hostname = parseRequestHostname(request.headers.host);
|
|
138
164
|
const siteTarget = resolveSiteTarget(hostname);
|
|
139
165
|
if (!siteTarget) {
|
|
140
|
-
response
|
|
141
|
-
response.end(`Unknown host. Use ${DEV_PUBLIC_HOST} or ${DEV_ADMIN_HOST}.`);
|
|
166
|
+
respondWithDefaultNotFound(response);
|
|
142
167
|
return;
|
|
143
168
|
}
|
|
144
169
|
const requestHost = hostname ?? DEV_PUBLIC_HOST;
|
|
145
170
|
const requestUrl = new URL(request.url ?? "/", `http://${requestHost}:${options.port}`);
|
|
146
171
|
if (requestUrl.pathname === "/api/health") {
|
|
147
172
|
response.writeHead(200, { "content-type": MIME_TYPES[".json"] });
|
|
148
|
-
response.end(JSON.stringify({
|
|
173
|
+
response.end(JSON.stringify({
|
|
174
|
+
ok: true,
|
|
175
|
+
site: siteTarget,
|
|
176
|
+
publicOutputPublished
|
|
177
|
+
}));
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
if (siteTarget === "public" && !publicOutputPublished) {
|
|
181
|
+
if (isRootPublicPath(requestUrl.pathname)) {
|
|
182
|
+
respondWithPublicUnavailable(response);
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
await respondWithPublicNotFound(response, publicDir);
|
|
186
|
+
}
|
|
149
187
|
return;
|
|
150
188
|
}
|
|
151
189
|
const rootDir = siteTarget === "admin" ? runtimeDir : publicDir;
|
|
@@ -161,8 +199,7 @@ export const startDevServer = async (options) => {
|
|
|
161
199
|
await respondWithPublicNotFound(response, publicDir);
|
|
162
200
|
return;
|
|
163
201
|
}
|
|
164
|
-
response
|
|
165
|
-
response.end("Not Found");
|
|
202
|
+
respondWithDefaultNotFound(response);
|
|
166
203
|
return;
|
|
167
204
|
}
|
|
168
205
|
const fileBuffer = await fs.readFile(targetFile.filePath);
|
|
@@ -172,8 +209,7 @@ export const startDevServer = async (options) => {
|
|
|
172
209
|
response.end(fileBuffer);
|
|
173
210
|
}
|
|
174
211
|
catch {
|
|
175
|
-
response
|
|
176
|
-
response.end("Not Found");
|
|
212
|
+
respondWithDefaultNotFound(response);
|
|
177
213
|
}
|
|
178
214
|
});
|
|
179
215
|
await new Promise((resolve, reject) => {
|
|
@@ -189,7 +225,7 @@ export const startDevServer = async (options) => {
|
|
|
189
225
|
adminUrl: `http://${DEV_ADMIN_HOST}:${options.port}`,
|
|
190
226
|
servingPublicDir: publicDir,
|
|
191
227
|
servingAdminDir: runtimeDir,
|
|
192
|
-
|
|
228
|
+
publicOutputPublished,
|
|
193
229
|
close: () => closeServer(server)
|
|
194
230
|
};
|
|
195
231
|
};
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAoC,MAAM,WAAW,CAAC;AAC3E,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACrE,MAAM,eAAe,GAAG,WAAW,CAAC;AACpC,MAAM,cAAc,GAAG,iBAAiB,CAAC;AA0BzC,MAAM,UAAU,GAA2B;IACzC,OAAO,EAAE,0BAA0B;IACnC,KAAK,EAAE,gCAAgC;IACvC,MAAM,EAAE,yBAAyB;IACjC,OAAO,EAAE,iCAAiC;IAC1C,MAAM,EAAE,eAAe;IACvB,MAAM,EAAE,cAAc;IACtB,MAAM,EAAE,2BAA2B;CACpC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAoC,MAAM,WAAW,CAAC;AAC3E,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACrE,MAAM,eAAe,GAAG,WAAW,CAAC;AACpC,MAAM,cAAc,GAAG,iBAAiB,CAAC;AA0BzC,MAAM,UAAU,GAA2B;IACzC,OAAO,EAAE,0BAA0B;IACnC,KAAK,EAAE,gCAAgC;IACvC,MAAM,EAAE,yBAAyB;IACjC,OAAO,EAAE,iCAAiC;IAC1C,MAAM,EAAE,eAAe;IACvB,MAAM,EAAE,cAAc;IACtB,MAAM,EAAE,2BAA2B;CACpC,CAAC;AACF,MAAM,sBAAsB,GAAG,wCAAwC,CAAC;AACxE,MAAM,+BAA+B,GAAG,+CAA+C,CAAC;AAExF,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;AAChF,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAExD,MAAM,iBAAiB,GAAG,CAAC,QAAgB,EAAE,UAAkB,EAAW,EAAE;IAC1E,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACzD,OAAO,YAAY,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjG,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,KAAK,EAAE,aAAqB,EAAoB,EAAE;IAC1E,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACzE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACvD,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;gBAC7C,OAAO,IAAI,CAAC;YACd,CAAC;YACD,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;gBAChE,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,UAA8B,EAAiB,EAAE;IAC7E,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IACnD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,UAAU,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACtD,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,QAAuB,EAAqB,EAAE;IACvE,IAAI,QAAQ,KAAK,IAAI,IAAI,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3D,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,KAAK,EAAE,OAAe,EAAiC,EAAE;IACpF,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACvD,IAAI,CAAC;QACH,MAAM,cAAc,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACpD,IAAI,cAAc,CAAC,MAAM,EAAE,EAAE,CAAC;YAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;QACnD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,4BAA4B;IAC9B,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;AAC/B,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,KAAK,EAC9B,OAAe,EACf,WAAmB,EACnB,IAAwB,EACO,EAAE;IACjC,MAAM,cAAc,GAAG,WAAW,KAAK,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC5F,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IAEpD,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC1C,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAC/B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC;YAC5B,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YAC7D,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,CAAC,EAAE,CAAC;gBACpD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;YAC/B,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,mBAAmB,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBAC9D,IAAI,mBAAmB,CAAC,MAAM,EAAE,EAAE,CAAC;oBACjC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE,CAAC;gBACxD,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,8CAA8C;YAChD,CAAC;YAED,OAAO,IAAI,KAAK,cAAc,CAAC,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;QACzF,CAAC;QAED,IAAI,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;YACvB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QACpC,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,IAAI,KAAK,cAAc,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;YAC7D,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,yBAAyB,GAAG,KAAK,EACrC,QAAwB,EACxB,SAAiB,EACF,EAAE;IACjB,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAC1D,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QACzD,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACjE,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC3B,OAAO;IACT,CAAC;IAAC,MAAM,CAAC;QACP,+DAA+D;IACjE,CAAC;IAED,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAChE,QAAQ,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,0BAA0B,GAAG,CAAC,QAAwB,EAAQ,EAAE;IACpE,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAChE,QAAQ,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,4BAA4B,GAAG,CAAC,QAAwB,EAAQ,EAAE;IACtE,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE;QACtB,cAAc,EAAE,UAAU,CAAC,MAAM,CAAC;QAClC,aAAa,EAAE,IAAI;KACpB,CAAC,CAAC;IACH,QAAQ,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;AAChD,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,WAAmB,EAAW,EAAE;IACxD,MAAM,cAAc,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACvD,OAAO,cAAc,CAAC,MAAM,KAAK,CAAC,IAAI,cAAc,KAAK,aAAa,CAAC;AACzE,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,KAAK,EAAE,MAAc,EAAiB,EAAE,CAC1D,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;IAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACrB,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,CAAC,KAAK,CAAC,CAAC;YACd,OAAO;QACT,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,OAA8B,EACJ,EAAE;IAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC;IACzC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;IACrE,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;IAE1E,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC5B,MAAM,eAAe,GAAG,MAAM,iBAAiB,CAAC,eAAe,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,eAAe,CAAC;IAClC,MAAM,qBAAqB,GAAG,eAAe,CAAC;IAE9C,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE;QACtD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC5D,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YAC/C,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,0BAA0B,CAAC,QAAQ,CAAC,CAAC;gBACrC,OAAO;YACT,CAAC;YAED,MAAM,WAAW,GAAG,QAAQ,IAAI,eAAe,CAAC;YAChD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,WAAW,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YAExF,IAAI,UAAU,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;gBAC1C,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBACjE,QAAQ,CAAC,GAAG,CACV,IAAI,CAAC,SAAS,CAAC;oBACb,EAAE,EAAE,IAAI;oBACR,IAAI,EAAE,UAAU;oBAChB,qBAAqB;iBACtB,CAAC,CACH,CAAC;gBACF,OAAO;YACT,CAAC;YAED,IAAI,UAAU,KAAK,QAAQ,IAAI,CAAC,qBAAqB,EAAE,CAAC;gBACtD,IAAI,gBAAgB,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC1C,4BAA4B,CAAC,QAAQ,CAAC,CAAC;gBACzC,CAAC;qBAAM,CAAC;oBACN,MAAM,yBAAyB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;gBACvD,CAAC;gBACD,OAAO;YACT,CAAC;YAED,MAAM,OAAO,GAAG,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;YAChE,MAAM,IAAI,GAAG,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC;YAChE,MAAM,UAAU,GAAG,MAAM,kBAAkB,CACzC,OAAO,EACP,kBAAkB,CAAC,UAAU,CAAC,QAAQ,CAAC,EACvC,IAAI,CACL,CAAC;YAEF,IAAI,UAAU,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACpC,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAChE,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBAC1B,OAAO;YACT,CAAC;YAED,IAAI,UAAU,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACpC,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;oBAC5B,MAAM,yBAAyB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;oBACrD,OAAO;gBACT,CAAC;gBAED,0BAA0B,CAAC,QAAQ,CAAC,CAAC;gBACrC,OAAO;YACT,CAAC;YAED,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACpD,MAAM,WAAW,GAAG,UAAU,CAAC,SAAS,CAAC,IAAI,0BAA0B,CAAC;YAExE,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;YACzD,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B,CAAC,QAAQ,CAAC,CAAC;QACvC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;YACrC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC5B,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,GAAG,EAAE,UAAU,eAAe,IAAI,OAAO,CAAC,IAAI,EAAE;QAChD,SAAS,EAAE,UAAU,eAAe,IAAI,OAAO,CAAC,IAAI,EAAE;QACtD,QAAQ,EAAE,UAAU,cAAc,IAAI,OAAO,CAAC,IAAI,EAAE;QACpD,gBAAgB,EAAE,SAAS;QAC3B,eAAe,EAAE,UAAU;QAC3B,qBAAqB;QACrB,KAAK,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC;KACjC,CAAC;AACJ,CAAC,CAAC"}
|