@nlabs/lex 1.59.5 → 2.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.
Files changed (40) hide show
  1. package/.storybook/main.ts +3 -47
  2. package/README.md +13 -19
  3. package/__mocks__/build.js +3 -3
  4. package/config.json +3 -1
  5. package/examples/lex.config.js +3 -7
  6. package/lib/LexConfig.d.ts +2 -6
  7. package/lib/LexConfig.js +2 -2
  8. package/lib/commands/ai/ai.js +3 -3
  9. package/lib/commands/build/build.d.ts +5 -3
  10. package/lib/commands/build/build.js +66 -156
  11. package/lib/commands/config/config.js +9 -7
  12. package/lib/commands/dev/dev.d.ts +0 -2
  13. package/lib/commands/dev/dev.js +24 -115
  14. package/lib/commands/migrate/migrate.js +2 -2
  15. package/lib/commands/serverless-dev/serverless-dev.js +2 -2
  16. package/lib/commands/versions/versions.d.ts +1 -1
  17. package/lib/commands/versions/versions.js +4 -4
  18. package/lib/lex.js +10 -11
  19. package/lib/types.d.ts +1 -1
  20. package/lib/types.js +1 -1
  21. package/lib/utils/app.d.ts +0 -2
  22. package/lib/utils/app.js +2 -29
  23. package/lib/utils/{webpack/LexSvgSpritemapPlugin.d.ts → assets/LexSvgSpritemap.d.ts} +6 -8
  24. package/lib/utils/assets/LexSvgSpritemap.js +219 -0
  25. package/lib/utils/file.d.ts +0 -4
  26. package/lib/utils/file.js +4 -100
  27. package/lib/utils/staticSite.d.ts +15 -0
  28. package/lib/utils/staticSite.js +80 -0
  29. package/lib/utils/vite/assets.d.ts +19 -0
  30. package/lib/utils/vite/assets.js +249 -0
  31. package/lib/utils/vite/config.d.ts +12 -0
  32. package/lib/utils/vite/config.js +272 -0
  33. package/package.json +14 -66
  34. package/postcss.config.js +1 -2
  35. package/tsconfig.lint.json +0 -1
  36. package/tsconfig.test.json +0 -1
  37. package/lib/utils/webpack/LexSvgSpritemapPlugin.js +0 -255
  38. package/scripts/test-webpack.js +0 -453
  39. package/webpack.config.d.ts +0 -2
  40. package/webpack.config.js +0 -960
@@ -0,0 +1,249 @@
1
+ /**
2
+ * Copyright (c) 2018-Present, Nitrogen Labs, Inc.
3
+ * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
4
+ */ import { gzipSync } from 'zlib';
5
+ import favicons from 'favicons';
6
+ import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from 'fs';
7
+ import { sync as globSync } from 'glob';
8
+ import { extname, join, relative, resolve } from 'path';
9
+ import sharp from 'sharp';
10
+ import { optimize } from 'svgo';
11
+ import { LexSvgSpritemap } from '../assets/LexSvgSpritemap.js';
12
+ const COMPRESSIBLE_FILE = /\.(css|html|js|json|svg|txt|xml)$/i;
13
+ const IMAGE_FILE = /\.(gif|jpe?g|png|svg|webp)$/i;
14
+ const MINIMUM_GZIP_SIZE = 8192;
15
+ const faviconCache = new Map();
16
+ const copyDirectory = (source, destination, exclude)=>{
17
+ if (!existsSync(source)) return;
18
+ for (const entry of readdirSync(source, {
19
+ withFileTypes: true
20
+ })){
21
+ const sourcePath = join(source, entry.name);
22
+ const destinationPath = join(destination, entry.name);
23
+ if (exclude?.test(sourcePath)) continue;
24
+ if (entry.isDirectory()) {
25
+ copyDirectory(sourcePath, destinationPath, exclude);
26
+ } else {
27
+ mkdirSync(resolve(destinationPath, '..'), {
28
+ recursive: true
29
+ });
30
+ writeFileSync(destinationPath, readFileSync(sourcePath));
31
+ }
32
+ }
33
+ };
34
+ const getAssetDirectories = (config)=>{
35
+ const sourcePath = config.sourceFullPath || resolve(process.cwd(), config.sourcePath || './src');
36
+ const staticPath = config.vite?.staticPath || './src/static';
37
+ return [
38
+ {
39
+ destination: '',
40
+ source: resolve(process.cwd(), staticPath)
41
+ },
42
+ {
43
+ destination: 'images',
44
+ source: resolve(sourcePath, 'images')
45
+ },
46
+ {
47
+ destination: 'fonts',
48
+ source: resolve(sourcePath, 'fonts')
49
+ },
50
+ {
51
+ destination: 'docs',
52
+ source: resolve(sourcePath, 'docs')
53
+ },
54
+ {
55
+ destination: 'icons',
56
+ exclude: /\.svg$/i,
57
+ source: resolve(sourcePath, 'icons')
58
+ }
59
+ ];
60
+ };
61
+ export const generateLexFavicons = async (config)=>{
62
+ const sourcePath = config.sourceFullPath || resolve(process.cwd(), config.sourcePath || './src');
63
+ const logoPath = resolve(sourcePath, 'images/logo.png');
64
+ if (!existsSync(logoPath)) return null;
65
+ const modifiedAt = statSync(logoPath).mtimeMs;
66
+ const cached = faviconCache.get(logoPath);
67
+ if (cached?.modifiedAt === modifiedAt) return cached.response;
68
+ const generated = await favicons(logoPath, {
69
+ icons: {
70
+ android: true,
71
+ appleIcon: true,
72
+ appleStartup: false,
73
+ favicons: true,
74
+ windows: false,
75
+ yandex: false
76
+ },
77
+ path: '/'
78
+ });
79
+ const [openGraphImage, twitterImage] = await Promise.all([
80
+ sharp(logoPath).resize(1200, 630, {
81
+ fit: 'contain'
82
+ }).png().toBuffer(),
83
+ sharp(logoPath).resize(1200, 675, {
84
+ fit: 'contain'
85
+ }).png().toBuffer()
86
+ ]);
87
+ const response = {
88
+ ...generated,
89
+ html: [
90
+ ...generated.html,
91
+ '<meta property="og:image" content="/open-graph.png">',
92
+ '<meta name="twitter:image" content="/twitter.png">'
93
+ ],
94
+ images: [
95
+ ...generated.images,
96
+ {
97
+ contents: openGraphImage,
98
+ name: 'open-graph.png'
99
+ },
100
+ {
101
+ contents: twitterImage,
102
+ name: 'twitter.png'
103
+ }
104
+ ]
105
+ };
106
+ faviconCache.set(logoPath, {
107
+ modifiedAt,
108
+ response
109
+ });
110
+ return response;
111
+ };
112
+ export const copyLexWebAssets = async (config)=>{
113
+ const outputPath = config.outputFullPath || resolve(process.cwd(), config.outputPath || './lib');
114
+ for (const assetDirectory of getAssetDirectories(config)){
115
+ copyDirectory(assetDirectory.source, resolve(outputPath, assetDirectory.destination), assetDirectory.exclude);
116
+ }
117
+ const sourcePath = config.sourceFullPath || resolve(process.cwd(), config.sourcePath || './src');
118
+ const spritemap = new LexSvgSpritemap(resolve(sourcePath, 'icons/**/*.svg'), {
119
+ filename: 'icons/icons.svg',
120
+ prefix: false
121
+ }).buildSpritemap();
122
+ for (const warning of spritemap.warnings)console.warn(warning.message);
123
+ if (spritemap.content) {
124
+ const spritePath = resolve(outputPath, 'icons/icons.svg');
125
+ mkdirSync(resolve(spritePath, '..'), {
126
+ recursive: true
127
+ });
128
+ writeFileSync(spritePath, spritemap.content);
129
+ }
130
+ const generatedFavicons = await generateLexFavicons(config);
131
+ if (generatedFavicons) {
132
+ for (const image of generatedFavicons.images){
133
+ const imagePath = resolve(outputPath, image.name);
134
+ mkdirSync(resolve(imagePath, '..'), {
135
+ recursive: true
136
+ });
137
+ writeFileSync(imagePath, image.contents);
138
+ }
139
+ for (const file of generatedFavicons.files){
140
+ const filePath = resolve(outputPath, file.name);
141
+ mkdirSync(resolve(filePath, '..'), {
142
+ recursive: true
143
+ });
144
+ writeFileSync(filePath, file.contents);
145
+ }
146
+ const indexPath = resolve(outputPath, 'index.html');
147
+ if (existsSync(indexPath)) {
148
+ const html = readFileSync(indexPath, 'utf8');
149
+ const faviconHtml = generatedFavicons.html.join('\n ');
150
+ writeFileSync(indexPath, html.replace('</head>', ` ${faviconHtml}\n </head>`));
151
+ }
152
+ }
153
+ };
154
+ const optimizeImage = async (filePath)=>{
155
+ const extension = extname(filePath).toLowerCase();
156
+ const source = readFileSync(filePath);
157
+ if (extension === '.svg') {
158
+ const isSpritemap = filePath.endsWith('/icons/icons.svg');
159
+ const result = optimize(source.toString(), {
160
+ multipass: true,
161
+ path: filePath,
162
+ plugins: isSpritemap ? [
163
+ {
164
+ name: 'preset-default',
165
+ params: {
166
+ overrides: {
167
+ cleanupIds: false,
168
+ removeHiddenElems: false
169
+ }
170
+ }
171
+ }
172
+ ] : [
173
+ 'preset-default'
174
+ ]
175
+ });
176
+ writeFileSync(filePath, result.data);
177
+ return;
178
+ }
179
+ let image = sharp(source);
180
+ if (extension === '.jpg' || extension === '.jpeg') image = image.jpeg({
181
+ progressive: true,
182
+ quality: 65
183
+ });
184
+ if (extension === '.png') image = image.png({
185
+ quality: 90
186
+ });
187
+ if (extension === '.webp') image = image.webp({
188
+ quality: 75
189
+ });
190
+ if (extension === '.gif') image = image.gif();
191
+ const optimized = await image.toBuffer();
192
+ if (optimized.length < source.length) writeFileSync(filePath, optimized);
193
+ };
194
+ export const optimizeLexWebAssets = async (config)=>{
195
+ const outputPath = config.outputFullPath || resolve(process.cwd(), config.outputPath || './lib');
196
+ if (!existsSync(outputPath)) return;
197
+ const imageFiles = globSync('**/*.{gif,jpg,jpeg,png,svg,webp}', {
198
+ absolute: true,
199
+ cwd: outputPath,
200
+ nodir: true
201
+ });
202
+ await Promise.all(imageFiles.filter((filePath)=>IMAGE_FILE.test(filePath)).map(optimizeImage));
203
+ };
204
+ export const compressLexWebAssets = (config)=>{
205
+ const outputPath = config.outputFullPath || resolve(process.cwd(), config.outputPath || './lib');
206
+ if (!existsSync(outputPath)) return;
207
+ const files = globSync('**/*', {
208
+ absolute: true,
209
+ cwd: outputPath,
210
+ nodir: true
211
+ });
212
+ for (const filePath of files){
213
+ if (!COMPRESSIBLE_FILE.test(filePath) || statSync(filePath).size < MINIMUM_GZIP_SIZE) continue;
214
+ writeFileSync(`${filePath}.gz`, gzipSync(readFileSync(filePath)));
215
+ }
216
+ };
217
+ export const getDevAsset = async (config, requestPath)=>{
218
+ const normalizedPath = requestPath.split('?')[0].replace(/^\/+/, '');
219
+ if (normalizedPath.includes('..')) return null;
220
+ if (normalizedPath === 'icons/icons.svg') {
221
+ const sourcePath = config.sourceFullPath || resolve(process.cwd(), config.sourcePath || './src');
222
+ const spritemap = new LexSvgSpritemap(resolve(sourcePath, 'icons/**/*.svg'), {
223
+ prefix: false
224
+ }).buildSpritemap();
225
+ return spritemap.content ? Buffer.from(spritemap.content) : null;
226
+ }
227
+ const generatedFavicons = await generateLexFavicons(config);
228
+ const generatedImage = generatedFavicons?.images.find(({ name })=>name === normalizedPath);
229
+ if (generatedImage) return generatedImage.contents;
230
+ const generatedFile = generatedFavicons?.files.find(({ name })=>name === normalizedPath);
231
+ if (generatedFile) return Buffer.from(generatedFile.contents);
232
+ for (const assetDirectory of getAssetDirectories(config)){
233
+ const prefix = assetDirectory.destination ? `${assetDirectory.destination}/` : '';
234
+ if (!normalizedPath.startsWith(prefix)) continue;
235
+ const relativePath = normalizedPath.slice(prefix.length);
236
+ const filePath = resolve(assetDirectory.source, relativePath);
237
+ if (filePath.startsWith(resolve(assetDirectory.source)) && existsSync(filePath) && statSync(filePath).isFile()) {
238
+ if (assetDirectory.exclude?.test(filePath)) continue;
239
+ return readFileSync(filePath);
240
+ }
241
+ }
242
+ return null;
243
+ };
244
+ export const getAssetRelativePath = (config, filePath)=>{
245
+ const outputPath = config.outputFullPath || resolve(process.cwd(), config.outputPath || './lib');
246
+ return relative(outputPath, filePath);
247
+ };
248
+
249
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy92aXRlL2Fzc2V0cy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHtnemlwU3luY30gZnJvbSAnemxpYic7XG5pbXBvcnQgZmF2aWNvbnMgZnJvbSAnZmF2aWNvbnMnO1xuaW1wb3J0IHtleGlzdHNTeW5jLCBta2RpclN5bmMsIHJlYWRGaWxlU3luYywgcmVhZGRpclN5bmMsIHN0YXRTeW5jLCB3cml0ZUZpbGVTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQge3N5bmMgYXMgZ2xvYlN5bmN9IGZyb20gJ2dsb2InO1xuaW1wb3J0IHtleHRuYW1lLCBqb2luLCByZWxhdGl2ZSwgcmVzb2x2ZX0gZnJvbSAncGF0aCc7XG5pbXBvcnQgc2hhcnAgZnJvbSAnc2hhcnAnO1xuaW1wb3J0IHtvcHRpbWl6ZX0gZnJvbSAnc3Znbyc7XG5cbmltcG9ydCB0eXBlIHtMZXhDb25maWdUeXBlfSBmcm9tICcuLi8uLi9MZXhDb25maWcuanMnO1xuaW1wb3J0IHtMZXhTdmdTcHJpdGVtYXB9IGZyb20gJy4uL2Fzc2V0cy9MZXhTdmdTcHJpdGVtYXAuanMnO1xuXG5jb25zdCBDT01QUkVTU0lCTEVfRklMRSA9IC9cXC4oY3NzfGh0bWx8anN8anNvbnxzdmd8dHh0fHhtbCkkL2k7XG5jb25zdCBJTUFHRV9GSUxFID0gL1xcLihnaWZ8anBlP2d8cG5nfHN2Z3x3ZWJwKSQvaTtcbmNvbnN0IE1JTklNVU1fR1pJUF9TSVpFID0gODE5MjtcblxuaW50ZXJmYWNlIEdlbmVyYXRlZEZhdmljb25zIHtcbiAgcmVhZG9ubHkgZmlsZXM6IFJlYWRvbmx5QXJyYXk8e2NvbnRlbnRzOiBzdHJpbmc7IG5hbWU6IHN0cmluZ30+O1xuICByZWFkb25seSBodG1sOiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgaW1hZ2VzOiBSZWFkb25seUFycmF5PHtjb250ZW50czogQnVmZmVyOyBuYW1lOiBzdHJpbmd9Pjtcbn1cblxuY29uc3QgZmF2aWNvbkNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHttb2RpZmllZEF0OiBudW1iZXI7IHJlc3BvbnNlOiBHZW5lcmF0ZWRGYXZpY29uc30+KCk7XG5cbmNvbnN0IGNvcHlEaXJlY3RvcnkgPSAoc291cmNlOiBzdHJpbmcsIGRlc3RpbmF0aW9uOiBzdHJpbmcsIGV4Y2x1ZGU/OiBSZWdFeHApOiB2b2lkID0+IHtcbiAgaWYoIWV4aXN0c1N5bmMoc291cmNlKSkgcmV0dXJuO1xuXG4gIGZvcihjb25zdCBlbnRyeSBvZiByZWFkZGlyU3luYyhzb3VyY2UsIHt3aXRoRmlsZVR5cGVzOiB0cnVlfSkpIHtcbiAgICBjb25zdCBzb3VyY2VQYXRoID0gam9pbihzb3VyY2UsIGVudHJ5Lm5hbWUpO1xuICAgIGNvbnN0IGRlc3RpbmF0aW9uUGF0aCA9IGpvaW4oZGVzdGluYXRpb24sIGVudHJ5Lm5hbWUpO1xuXG4gICAgaWYoZXhjbHVkZT8udGVzdChzb3VyY2VQYXRoKSkgY29udGludWU7XG5cbiAgICBpZihlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBjb3B5RGlyZWN0b3J5KHNvdXJjZVBhdGgsIGRlc3RpbmF0aW9uUGF0aCwgZXhjbHVkZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1rZGlyU3luYyhyZXNvbHZlKGRlc3RpbmF0aW9uUGF0aCwgJy4uJyksIHtyZWN1cnNpdmU6IHRydWV9KTtcbiAgICAgIHdyaXRlRmlsZVN5bmMoZGVzdGluYXRpb25QYXRoLCByZWFkRmlsZVN5bmMoc291cmNlUGF0aCkpO1xuICAgIH1cbiAgfVxufTtcblxuY29uc3QgZ2V0QXNzZXREaXJlY3RvcmllcyA9IChjb25maWc6IExleENvbmZpZ1R5cGUpOiBBcnJheTx7ZGVzdGluYXRpb246IHN0cmluZzsgZXhjbHVkZT86IFJlZ0V4cDsgc291cmNlOiBzdHJpbmd9PiA9PiB7XG4gIGNvbnN0IHNvdXJjZVBhdGggPSBjb25maWcuc291cmNlRnVsbFBhdGggfHwgcmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBjb25maWcuc291cmNlUGF0aCB8fCAnLi9zcmMnKTtcbiAgY29uc3Qgc3RhdGljUGF0aCA9IGNvbmZpZy52aXRlPy5zdGF0aWNQYXRoIHx8ICcuL3NyYy9zdGF0aWMnO1xuXG4gIHJldHVybiBbXG4gICAge2Rlc3RpbmF0aW9uOiAnJywgc291cmNlOiByZXNvbHZlKHByb2Nlc3MuY3dkKCksIHN0YXRpY1BhdGgpfSxcbiAgICB7ZGVzdGluYXRpb246ICdpbWFnZXMnLCBzb3VyY2U6IHJlc29sdmUoc291cmNlUGF0aCwgJ2ltYWdlcycpfSxcbiAgICB7ZGVzdGluYXRpb246ICdmb250cycsIHNvdXJjZTogcmVzb2x2ZShzb3VyY2VQYXRoLCAnZm9udHMnKX0sXG4gICAge2Rlc3RpbmF0aW9uOiAnZG9jcycsIHNvdXJjZTogcmVzb2x2ZShzb3VyY2VQYXRoLCAnZG9jcycpfSxcbiAgICB7ZGVzdGluYXRpb246ICdpY29ucycsIGV4Y2x1ZGU6IC9cXC5zdmckL2ksIHNvdXJjZTogcmVzb2x2ZShzb3VyY2VQYXRoLCAnaWNvbnMnKX1cbiAgXTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZUxleEZhdmljb25zID0gYXN5bmMgKGNvbmZpZzogTGV4Q29uZmlnVHlwZSk6IFByb21pc2U8R2VuZXJhdGVkRmF2aWNvbnMgfCBudWxsPiA9PiB7XG4gIGNvbnN0IHNvdXJjZVBhdGggPSBjb25maWcuc291cmNlRnVsbFBhdGggfHwgcmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBjb25maWcuc291cmNlUGF0aCB8fCAnLi9zcmMnKTtcbiAgY29uc3QgbG9nb1BhdGggPSByZXNvbHZlKHNvdXJjZVBhdGgsICdpbWFnZXMvbG9nby5wbmcnKTtcblxuICBpZighZXhpc3RzU3luYyhsb2dvUGF0aCkpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IG1vZGlmaWVkQXQgPSBzdGF0U3luYyhsb2dvUGF0aCkubXRpbWVNcztcbiAgY29uc3QgY2FjaGVkID0gZmF2aWNvbkNhY2hlLmdldChsb2dvUGF0aCk7XG4gIGlmKGNhY2hlZD8ubW9kaWZpZWRBdCA9PT0gbW9kaWZpZWRBdCkgcmV0dXJuIGNhY2hlZC5yZXNwb25zZTtcblxuICBjb25zdCBnZW5lcmF0ZWQgPSBhd2FpdCBmYXZpY29ucyhsb2dvUGF0aCwge1xuICAgIGljb25zOiB7XG4gICAgICBhbmRyb2lkOiB0cnVlLFxuICAgICAgYXBwbGVJY29uOiB0cnVlLFxuICAgICAgYXBwbGVTdGFydHVwOiBmYWxzZSxcbiAgICAgIGZhdmljb25zOiB0cnVlLFxuICAgICAgd2luZG93czogZmFsc2UsXG4gICAgICB5YW5kZXg6IGZhbHNlXG4gICAgfSxcbiAgICBwYXRoOiAnLydcbiAgfSk7XG4gIGNvbnN0IFtvcGVuR3JhcGhJbWFnZSwgdHdpdHRlckltYWdlXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBzaGFycChsb2dvUGF0aCkucmVzaXplKDEyMDAsIDYzMCwge2ZpdDogJ2NvbnRhaW4nfSkucG5nKCkudG9CdWZmZXIoKSxcbiAgICBzaGFycChsb2dvUGF0aCkucmVzaXplKDEyMDAsIDY3NSwge2ZpdDogJ2NvbnRhaW4nfSkucG5nKCkudG9CdWZmZXIoKVxuICBdKTtcbiAgY29uc3QgcmVzcG9uc2U6IEdlbmVyYXRlZEZhdmljb25zID0ge1xuICAgIC4uLmdlbmVyYXRlZCxcbiAgICBodG1sOiBbXG4gICAgICAuLi5nZW5lcmF0ZWQuaHRtbCxcbiAgICAgICc8bWV0YSBwcm9wZXJ0eT1cIm9nOmltYWdlXCIgY29udGVudD1cIi9vcGVuLWdyYXBoLnBuZ1wiPicsXG4gICAgICAnPG1ldGEgbmFtZT1cInR3aXR0ZXI6aW1hZ2VcIiBjb250ZW50PVwiL3R3aXR0ZXIucG5nXCI+J1xuICAgIF0sXG4gICAgaW1hZ2VzOiBbXG4gICAgICAuLi5nZW5lcmF0ZWQuaW1hZ2VzLFxuICAgICAge2NvbnRlbnRzOiBvcGVuR3JhcGhJbWFnZSwgbmFtZTogJ29wZW4tZ3JhcGgucG5nJ30sXG4gICAgICB7Y29udGVudHM6IHR3aXR0ZXJJbWFnZSwgbmFtZTogJ3R3aXR0ZXIucG5nJ31cbiAgICBdXG4gIH07XG4gIGZhdmljb25DYWNoZS5zZXQobG9nb1BhdGgsIHttb2RpZmllZEF0LCByZXNwb25zZX0pO1xuICByZXR1cm4gcmVzcG9uc2U7XG59O1xuXG5leHBvcnQgY29uc3QgY29weUxleFdlYkFzc2V0cyA9IGFzeW5jIChjb25maWc6IExleENvbmZpZ1R5cGUpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3Qgb3V0cHV0UGF0aCA9IGNvbmZpZy5vdXRwdXRGdWxsUGF0aCB8fCByZXNvbHZlKHByb2Nlc3MuY3dkKCksIGNvbmZpZy5vdXRwdXRQYXRoIHx8ICcuL2xpYicpO1xuXG4gIGZvcihjb25zdCBhc3NldERpcmVjdG9yeSBvZiBnZXRBc3NldERpcmVjdG9yaWVzKGNvbmZpZykpIHtcbiAgICBjb3B5RGlyZWN0b3J5KGFzc2V0RGlyZWN0b3J5LnNvdXJjZSwgcmVzb2x2ZShvdXRwdXRQYXRoLCBhc3NldERpcmVjdG9yeS5kZXN0aW5hdGlvbiksIGFzc2V0RGlyZWN0b3J5LmV4Y2x1ZGUpO1xuICB9XG5cbiAgY29uc3Qgc291cmNlUGF0aCA9IGNvbmZpZy5zb3VyY2VGdWxsUGF0aCB8fCByZXNvbHZlKHByb2Nlc3MuY3dkKCksIGNvbmZpZy5zb3VyY2VQYXRoIHx8ICcuL3NyYycpO1xuICBjb25zdCBzcHJpdGVtYXAgPSBuZXcgTGV4U3ZnU3ByaXRlbWFwKHJlc29sdmUoc291cmNlUGF0aCwgJ2ljb25zLyoqLyouc3ZnJyksIHtcbiAgICBmaWxlbmFtZTogJ2ljb25zL2ljb25zLnN2ZycsXG4gICAgcHJlZml4OiBmYWxzZVxuICB9KS5idWlsZFNwcml0ZW1hcCgpO1xuXG4gIGZvcihjb25zdCB3YXJuaW5nIG9mIHNwcml0ZW1hcC53YXJuaW5ncykgY29uc29sZS53YXJuKHdhcm5pbmcubWVzc2FnZSk7XG5cbiAgaWYoc3ByaXRlbWFwLmNvbnRlbnQpIHtcbiAgICBjb25zdCBzcHJpdGVQYXRoID0gcmVzb2x2ZShvdXRwdXRQYXRoLCAnaWNvbnMvaWNvbnMuc3ZnJyk7XG4gICAgbWtkaXJTeW5jKHJlc29sdmUoc3ByaXRlUGF0aCwgJy4uJyksIHtyZWN1cnNpdmU6IHRydWV9KTtcbiAgICB3cml0ZUZpbGVTeW5jKHNwcml0ZVBhdGgsIHNwcml0ZW1hcC5jb250ZW50KTtcbiAgfVxuXG4gIGNvbnN0IGdlbmVyYXRlZEZhdmljb25zID0gYXdhaXQgZ2VuZXJhdGVMZXhGYXZpY29ucyhjb25maWcpO1xuICBpZihnZW5lcmF0ZWRGYXZpY29ucykge1xuICAgIGZvcihjb25zdCBpbWFnZSBvZiBnZW5lcmF0ZWRGYXZpY29ucy5pbWFnZXMpIHtcbiAgICAgIGNvbnN0IGltYWdlUGF0aCA9IHJlc29sdmUob3V0cHV0UGF0aCwgaW1hZ2UubmFtZSk7XG4gICAgICBta2RpclN5bmMocmVzb2x2ZShpbWFnZVBhdGgsICcuLicpLCB7cmVjdXJzaXZlOiB0cnVlfSk7XG4gICAgICB3cml0ZUZpbGVTeW5jKGltYWdlUGF0aCwgaW1hZ2UuY29udGVudHMpO1xuICAgIH1cbiAgICBmb3IoY29uc3QgZmlsZSBvZiBnZW5lcmF0ZWRGYXZpY29ucy5maWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSByZXNvbHZlKG91dHB1dFBhdGgsIGZpbGUubmFtZSk7XG4gICAgICBta2RpclN5bmMocmVzb2x2ZShmaWxlUGF0aCwgJy4uJyksIHtyZWN1cnNpdmU6IHRydWV9KTtcbiAgICAgIHdyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIGZpbGUuY29udGVudHMpO1xuICAgIH1cblxuICAgIGNvbnN0IGluZGV4UGF0aCA9IHJlc29sdmUob3V0cHV0UGF0aCwgJ2luZGV4Lmh0bWwnKTtcbiAgICBpZihleGlzdHNTeW5jKGluZGV4UGF0aCkpIHtcbiAgICAgIGNvbnN0IGh0bWwgPSByZWFkRmlsZVN5bmMoaW5kZXhQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgZmF2aWNvbkh0bWwgPSBnZW5lcmF0ZWRGYXZpY29ucy5odG1sLmpvaW4oJ1xcbiAgICAnKTtcbiAgICAgIHdyaXRlRmlsZVN5bmMoaW5kZXhQYXRoLCBodG1sLnJlcGxhY2UoJzwvaGVhZD4nLCBgICAgICR7ZmF2aWNvbkh0bWx9XFxuICA8L2hlYWQ+YCkpO1xuICAgIH1cbiAgfVxufTtcblxuY29uc3Qgb3B0aW1pemVJbWFnZSA9IGFzeW5jIChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IGV4dGVuc2lvbiA9IGV4dG5hbWUoZmlsZVBhdGgpLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHNvdXJjZSA9IHJlYWRGaWxlU3luYyhmaWxlUGF0aCk7XG5cbiAgaWYoZXh0ZW5zaW9uID09PSAnLnN2ZycpIHtcbiAgICBjb25zdCBpc1Nwcml0ZW1hcCA9IGZpbGVQYXRoLmVuZHNXaXRoKCcvaWNvbnMvaWNvbnMuc3ZnJyk7XG4gICAgY29uc3QgcmVzdWx0ID0gb3B0aW1pemUoc291cmNlLnRvU3RyaW5nKCksIHtcbiAgICAgIG11bHRpcGFzczogdHJ1ZSxcbiAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgcGx1Z2luczogaXNTcHJpdGVtYXBcbiAgICAgICAgPyBbe25hbWU6ICdwcmVzZXQtZGVmYXVsdCcsIHBhcmFtczoge292ZXJyaWRlczoge2NsZWFudXBJZHM6IGZhbHNlLCByZW1vdmVIaWRkZW5FbGVtczogZmFsc2V9fX1dXG4gICAgICAgIDogWydwcmVzZXQtZGVmYXVsdCddXG4gICAgfSk7XG4gICAgd3JpdGVGaWxlU3luYyhmaWxlUGF0aCwgcmVzdWx0LmRhdGEpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBpbWFnZSA9IHNoYXJwKHNvdXJjZSk7XG4gIGlmKGV4dGVuc2lvbiA9PT0gJy5qcGcnIHx8IGV4dGVuc2lvbiA9PT0gJy5qcGVnJykgaW1hZ2UgPSBpbWFnZS5qcGVnKHtwcm9ncmVzc2l2ZTogdHJ1ZSwgcXVhbGl0eTogNjV9KTtcbiAgaWYoZXh0ZW5zaW9uID09PSAnLnBuZycpIGltYWdlID0gaW1hZ2UucG5nKHtxdWFsaXR5OiA5MH0pO1xuICBpZihleHRlbnNpb24gPT09ICcud2VicCcpIGltYWdlID0gaW1hZ2Uud2VicCh7cXVhbGl0eTogNzV9KTtcbiAgaWYoZXh0ZW5zaW9uID09PSAnLmdpZicpIGltYWdlID0gaW1hZ2UuZ2lmKCk7XG5cbiAgY29uc3Qgb3B0aW1pemVkID0gYXdhaXQgaW1hZ2UudG9CdWZmZXIoKTtcbiAgaWYob3B0aW1pemVkLmxlbmd0aCA8IHNvdXJjZS5sZW5ndGgpIHdyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIG9wdGltaXplZCk7XG59O1xuXG5leHBvcnQgY29uc3Qgb3B0aW1pemVMZXhXZWJBc3NldHMgPSBhc3luYyAoY29uZmlnOiBMZXhDb25maWdUeXBlKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IG91dHB1dFBhdGggPSBjb25maWcub3V0cHV0RnVsbFBhdGggfHwgcmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBjb25maWcub3V0cHV0UGF0aCB8fCAnLi9saWInKTtcbiAgaWYoIWV4aXN0c1N5bmMob3V0cHV0UGF0aCkpIHJldHVybjtcblxuICBjb25zdCBpbWFnZUZpbGVzID0gZ2xvYlN5bmMoJyoqLyoue2dpZixqcGcsanBlZyxwbmcsc3ZnLHdlYnB9Jywge1xuICAgIGFic29sdXRlOiB0cnVlLFxuICAgIGN3ZDogb3V0cHV0UGF0aCxcbiAgICBub2RpcjogdHJ1ZVxuICB9KTtcblxuICBhd2FpdCBQcm9taXNlLmFsbChpbWFnZUZpbGVzLmZpbHRlcigoZmlsZVBhdGgpID0+IElNQUdFX0ZJTEUudGVzdChmaWxlUGF0aCkpLm1hcChvcHRpbWl6ZUltYWdlKSk7XG59O1xuXG5leHBvcnQgY29uc3QgY29tcHJlc3NMZXhXZWJBc3NldHMgPSAoY29uZmlnOiBMZXhDb25maWdUeXBlKTogdm9pZCA9PiB7XG4gIGNvbnN0IG91dHB1dFBhdGggPSBjb25maWcub3V0cHV0RnVsbFBhdGggfHwgcmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBjb25maWcub3V0cHV0UGF0aCB8fCAnLi9saWInKTtcbiAgaWYoIWV4aXN0c1N5bmMob3V0cHV0UGF0aCkpIHJldHVybjtcblxuICBjb25zdCBmaWxlcyA9IGdsb2JTeW5jKCcqKi8qJywge2Fic29sdXRlOiB0cnVlLCBjd2Q6IG91dHB1dFBhdGgsIG5vZGlyOiB0cnVlfSk7XG4gIGZvcihjb25zdCBmaWxlUGF0aCBvZiBmaWxlcykge1xuICAgIGlmKCFDT01QUkVTU0lCTEVfRklMRS50ZXN0KGZpbGVQYXRoKSB8fCBzdGF0U3luYyhmaWxlUGF0aCkuc2l6ZSA8IE1JTklNVU1fR1pJUF9TSVpFKSBjb250aW51ZTtcbiAgICB3cml0ZUZpbGVTeW5jKGAke2ZpbGVQYXRofS5nemAsIGd6aXBTeW5jKHJlYWRGaWxlU3luYyhmaWxlUGF0aCkpKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdldERldkFzc2V0ID0gYXN5bmMgKGNvbmZpZzogTGV4Q29uZmlnVHlwZSwgcmVxdWVzdFBhdGg6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyIHwgbnVsbD4gPT4ge1xuICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHJlcXVlc3RQYXRoLnNwbGl0KCc/JylbMF0ucmVwbGFjZSgvXlxcLysvLCAnJyk7XG4gIGlmKG5vcm1hbGl6ZWRQYXRoLmluY2x1ZGVzKCcuLicpKSByZXR1cm4gbnVsbDtcblxuICBpZihub3JtYWxpemVkUGF0aCA9PT0gJ2ljb25zL2ljb25zLnN2ZycpIHtcbiAgICBjb25zdCBzb3VyY2VQYXRoID0gY29uZmlnLnNvdXJjZUZ1bGxQYXRoIHx8IHJlc29sdmUocHJvY2Vzcy5jd2QoKSwgY29uZmlnLnNvdXJjZVBhdGggfHwgJy4vc3JjJyk7XG4gICAgY29uc3Qgc3ByaXRlbWFwID0gbmV3IExleFN2Z1Nwcml0ZW1hcChyZXNvbHZlKHNvdXJjZVBhdGgsICdpY29ucy8qKi8qLnN2ZycpLCB7cHJlZml4OiBmYWxzZX0pLmJ1aWxkU3ByaXRlbWFwKCk7XG4gICAgcmV0dXJuIHNwcml0ZW1hcC5jb250ZW50ID8gQnVmZmVyLmZyb20oc3ByaXRlbWFwLmNvbnRlbnQpIDogbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGdlbmVyYXRlZEZhdmljb25zID0gYXdhaXQgZ2VuZXJhdGVMZXhGYXZpY29ucyhjb25maWcpO1xuICBjb25zdCBnZW5lcmF0ZWRJbWFnZSA9IGdlbmVyYXRlZEZhdmljb25zPy5pbWFnZXMuZmluZCgoe25hbWV9KSA9PiBuYW1lID09PSBub3JtYWxpemVkUGF0aCk7XG4gIGlmKGdlbmVyYXRlZEltYWdlKSByZXR1cm4gZ2VuZXJhdGVkSW1hZ2UuY29udGVudHM7XG4gIGNvbnN0IGdlbmVyYXRlZEZpbGUgPSBnZW5lcmF0ZWRGYXZpY29ucz8uZmlsZXMuZmluZCgoe25hbWV9KSA9PiBuYW1lID09PSBub3JtYWxpemVkUGF0aCk7XG4gIGlmKGdlbmVyYXRlZEZpbGUpIHJldHVybiBCdWZmZXIuZnJvbShnZW5lcmF0ZWRGaWxlLmNvbnRlbnRzKTtcblxuICBmb3IoY29uc3QgYXNzZXREaXJlY3Rvcnkgb2YgZ2V0QXNzZXREaXJlY3Rvcmllcyhjb25maWcpKSB7XG4gICAgY29uc3QgcHJlZml4ID0gYXNzZXREaXJlY3RvcnkuZGVzdGluYXRpb24gPyBgJHthc3NldERpcmVjdG9yeS5kZXN0aW5hdGlvbn0vYCA6ICcnO1xuICAgIGlmKCFub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKHByZWZpeCkpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gbm9ybWFsaXplZFBhdGguc2xpY2UocHJlZml4Lmxlbmd0aCk7XG4gICAgY29uc3QgZmlsZVBhdGggPSByZXNvbHZlKGFzc2V0RGlyZWN0b3J5LnNvdXJjZSwgcmVsYXRpdmVQYXRoKTtcbiAgICBpZihmaWxlUGF0aC5zdGFydHNXaXRoKHJlc29sdmUoYXNzZXREaXJlY3Rvcnkuc291cmNlKSkgJiYgZXhpc3RzU3luYyhmaWxlUGF0aCkgJiYgc3RhdFN5bmMoZmlsZVBhdGgpLmlzRmlsZSgpKSB7XG4gICAgICBpZihhc3NldERpcmVjdG9yeS5leGNsdWRlPy50ZXN0KGZpbGVQYXRoKSkgY29udGludWU7XG4gICAgICByZXR1cm4gcmVhZEZpbGVTeW5jKGZpbGVQYXRoKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBc3NldFJlbGF0aXZlUGF0aCA9IChjb25maWc6IExleENvbmZpZ1R5cGUsIGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBvdXRwdXRQYXRoID0gY29uZmlnLm91dHB1dEZ1bGxQYXRoIHx8IHJlc29sdmUocHJvY2Vzcy5jd2QoKSwgY29uZmlnLm91dHB1dFBhdGggfHwgJy4vbGliJyk7XG4gIHJldHVybiByZWxhdGl2ZShvdXRwdXRQYXRoLCBmaWxlUGF0aCk7XG59O1xuIl0sIm5hbWVzIjpbImd6aXBTeW5jIiwiZmF2aWNvbnMiLCJleGlzdHNTeW5jIiwibWtkaXJTeW5jIiwicmVhZEZpbGVTeW5jIiwicmVhZGRpclN5bmMiLCJzdGF0U3luYyIsIndyaXRlRmlsZVN5bmMiLCJzeW5jIiwiZ2xvYlN5bmMiLCJleHRuYW1lIiwiam9pbiIsInJlbGF0aXZlIiwicmVzb2x2ZSIsInNoYXJwIiwib3B0aW1pemUiLCJMZXhTdmdTcHJpdGVtYXAiLCJDT01QUkVTU0lCTEVfRklMRSIsIklNQUdFX0ZJTEUiLCJNSU5JTVVNX0daSVBfU0laRSIsImZhdmljb25DYWNoZSIsIk1hcCIsImNvcHlEaXJlY3RvcnkiLCJzb3VyY2UiLCJkZXN0aW5hdGlvbiIsImV4Y2x1ZGUiLCJlbnRyeSIsIndpdGhGaWxlVHlwZXMiLCJzb3VyY2VQYXRoIiwibmFtZSIsImRlc3RpbmF0aW9uUGF0aCIsInRlc3QiLCJpc0RpcmVjdG9yeSIsInJlY3Vyc2l2ZSIsImdldEFzc2V0RGlyZWN0b3JpZXMiLCJjb25maWciLCJzb3VyY2VGdWxsUGF0aCIsInByb2Nlc3MiLCJjd2QiLCJzdGF0aWNQYXRoIiwidml0ZSIsImdlbmVyYXRlTGV4RmF2aWNvbnMiLCJsb2dvUGF0aCIsIm1vZGlmaWVkQXQiLCJtdGltZU1zIiwiY2FjaGVkIiwiZ2V0IiwicmVzcG9uc2UiLCJnZW5lcmF0ZWQiLCJpY29ucyIsImFuZHJvaWQiLCJhcHBsZUljb24iLCJhcHBsZVN0YXJ0dXAiLCJ3aW5kb3dzIiwieWFuZGV4IiwicGF0aCIsIm9wZW5HcmFwaEltYWdlIiwidHdpdHRlckltYWdlIiwiUHJvbWlzZSIsImFsbCIsInJlc2l6ZSIsImZpdCIsInBuZyIsInRvQnVmZmVyIiwiaHRtbCIsImltYWdlcyIsImNvbnRlbnRzIiwic2V0IiwiY29weUxleFdlYkFzc2V0cyIsIm91dHB1dFBhdGgiLCJvdXRwdXRGdWxsUGF0aCIsImFzc2V0RGlyZWN0b3J5Iiwic3ByaXRlbWFwIiwiZmlsZW5hbWUiLCJwcmVmaXgiLCJidWlsZFNwcml0ZW1hcCIsIndhcm5pbmciLCJ3YXJuaW5ncyIsImNvbnNvbGUiLCJ3YXJuIiwibWVzc2FnZSIsImNvbnRlbnQiLCJzcHJpdGVQYXRoIiwiZ2VuZXJhdGVkRmF2aWNvbnMiLCJpbWFnZSIsImltYWdlUGF0aCIsImZpbGUiLCJmaWxlcyIsImZpbGVQYXRoIiwiaW5kZXhQYXRoIiwiZmF2aWNvbkh0bWwiLCJyZXBsYWNlIiwib3B0aW1pemVJbWFnZSIsImV4dGVuc2lvbiIsInRvTG93ZXJDYXNlIiwiaXNTcHJpdGVtYXAiLCJlbmRzV2l0aCIsInJlc3VsdCIsInRvU3RyaW5nIiwibXVsdGlwYXNzIiwicGx1Z2lucyIsInBhcmFtcyIsIm92ZXJyaWRlcyIsImNsZWFudXBJZHMiLCJyZW1vdmVIaWRkZW5FbGVtcyIsImRhdGEiLCJqcGVnIiwicHJvZ3Jlc3NpdmUiLCJxdWFsaXR5Iiwid2VicCIsImdpZiIsIm9wdGltaXplZCIsImxlbmd0aCIsIm9wdGltaXplTGV4V2ViQXNzZXRzIiwiaW1hZ2VGaWxlcyIsImFic29sdXRlIiwibm9kaXIiLCJmaWx0ZXIiLCJtYXAiLCJjb21wcmVzc0xleFdlYkFzc2V0cyIsInNpemUiLCJnZXREZXZBc3NldCIsInJlcXVlc3RQYXRoIiwibm9ybWFsaXplZFBhdGgiLCJzcGxpdCIsImluY2x1ZGVzIiwiQnVmZmVyIiwiZnJvbSIsImdlbmVyYXRlZEltYWdlIiwiZmluZCIsImdlbmVyYXRlZEZpbGUiLCJzdGFydHNXaXRoIiwicmVsYXRpdmVQYXRoIiwic2xpY2UiLCJpc0ZpbGUiLCJnZXRBc3NldFJlbGF0aXZlUGF0aCJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0QsU0FBUUEsUUFBUSxRQUFPLE9BQU87QUFDOUIsT0FBT0MsY0FBYyxXQUFXO0FBQ2hDLFNBQVFDLFVBQVUsRUFBRUMsU0FBUyxFQUFFQyxZQUFZLEVBQUVDLFdBQVcsRUFBRUMsUUFBUSxFQUFFQyxhQUFhLFFBQU8sS0FBSztBQUM3RixTQUFRQyxRQUFRQyxRQUFRLFFBQU8sT0FBTztBQUN0QyxTQUFRQyxPQUFPLEVBQUVDLElBQUksRUFBRUMsUUFBUSxFQUFFQyxPQUFPLFFBQU8sT0FBTztBQUN0RCxPQUFPQyxXQUFXLFFBQVE7QUFDMUIsU0FBUUMsUUFBUSxRQUFPLE9BQU87QUFHOUIsU0FBUUMsZUFBZSxRQUFPLCtCQUErQjtBQUU3RCxNQUFNQyxvQkFBb0I7QUFDMUIsTUFBTUMsYUFBYTtBQUNuQixNQUFNQyxvQkFBb0I7QUFRMUIsTUFBTUMsZUFBZSxJQUFJQztBQUV6QixNQUFNQyxnQkFBZ0IsQ0FBQ0MsUUFBZ0JDLGFBQXFCQztJQUMxRCxJQUFHLENBQUN2QixXQUFXcUIsU0FBUztJQUV4QixLQUFJLE1BQU1HLFNBQVNyQixZQUFZa0IsUUFBUTtRQUFDSSxlQUFlO0lBQUksR0FBSTtRQUM3RCxNQUFNQyxhQUFhakIsS0FBS1ksUUFBUUcsTUFBTUcsSUFBSTtRQUMxQyxNQUFNQyxrQkFBa0JuQixLQUFLYSxhQUFhRSxNQUFNRyxJQUFJO1FBRXBELElBQUdKLFNBQVNNLEtBQUtILGFBQWE7UUFFOUIsSUFBR0YsTUFBTU0sV0FBVyxJQUFJO1lBQ3RCVixjQUFjTSxZQUFZRSxpQkFB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
@@ -0,0 +1,12 @@
1
+ import type { InlineConfig } from 'vite';
2
+ export interface LexViteOptions {
3
+ readonly analyze?: boolean;
4
+ readonly command: 'build' | 'serve';
5
+ readonly entry?: string;
6
+ readonly mode?: string;
7
+ readonly open?: boolean;
8
+ readonly port?: number;
9
+ readonly quiet?: boolean;
10
+ readonly ssr?: boolean;
11
+ }
12
+ export declare const createLexViteConfig: (options: LexViteOptions) => InlineConfig;
@@ -0,0 +1,272 @@
1
+ /**
2
+ * Copyright (c) 2018-Present, Nitrogen Labs, Inc.
3
+ * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
4
+ */ import { transform } from '@swc/core';
5
+ import inject from '@rollup/plugin-inject';
6
+ import { existsSync, readFileSync } from 'fs';
7
+ import { extname, resolve } from 'path';
8
+ import { mergeConfig } from 'vite';
9
+ import { LexConfig } from '../../LexConfig.js';
10
+ import { generateLexFavicons, getDevAsset } from './assets.js';
11
+ const createInjectPlugin = inject;
12
+ const contentTypes = {
13
+ '.css': 'text/css',
14
+ '.gif': 'image/gif',
15
+ '.html': 'text/html',
16
+ '.ico': 'image/x-icon',
17
+ '.jpeg': 'image/jpeg',
18
+ '.jpg': 'image/jpeg',
19
+ '.json': 'application/json',
20
+ '.png': 'image/png',
21
+ '.svg': 'image/svg+xml',
22
+ '.ttf': 'font/ttf',
23
+ '.txt': 'text/plain',
24
+ '.woff': 'font/woff',
25
+ '.woff2': 'font/woff2'
26
+ };
27
+ const emptyCryptoPlugin = ()=>({
28
+ load (id) {
29
+ return id === '\0lex-empty-crypto' ? 'export default {}; export const webcrypto = undefined;' : null;
30
+ },
31
+ name: 'lex-empty-crypto',
32
+ resolveId (id) {
33
+ return id === 'crypto' || id === 'node:crypto' ? '\0lex-empty-crypto' : null;
34
+ }
35
+ });
36
+ const nodePolyfillModules = {
37
+ assert: 'assert/build/assert.js',
38
+ buffer: 'buffer/index.js',
39
+ http: 'stream-http/index.js',
40
+ https: 'https-browserify/index.js',
41
+ os: 'os-browserify/browser.js',
42
+ path: 'path-browserify/index.js',
43
+ process: 'process/browser.js',
44
+ stream: 'stream-browserify/index.js',
45
+ util: 'util/util.js',
46
+ vm: 'vm-browserify/index.js'
47
+ };
48
+ const nodePolyfillsPlugin = ()=>({
49
+ name: 'lex-node-polyfills',
50
+ resolveId (id) {
51
+ const moduleName = id.startsWith('node:') ? id.slice(5) : id;
52
+ const replacement = nodePolyfillModules[moduleName];
53
+ return replacement ? resolveProjectPackage(replacement) : null;
54
+ }
55
+ });
56
+ const graphqlPlugin = ()=>({
57
+ load (id) {
58
+ if (!/\.(gql|graphql)$/.test(id)) return null;
59
+ const source = JSON.stringify(readFileSync(id, 'utf8'));
60
+ return `import gql from 'graphql-tag'; export default gql(${source});`;
61
+ },
62
+ name: 'lex-graphql'
63
+ });
64
+ const swcPlugin = (sourcePath)=>({
65
+ enforce: 'pre',
66
+ async transform (source, id) {
67
+ const cleanId = id.split('?')[0];
68
+ if (!cleanId.startsWith(sourcePath) || !/\.[jt]sx?$/.test(cleanId) || /\.(test|spec|integration|e2e)\.[jt]sx?$/.test(cleanId)) return null;
69
+ const swcConfig = LexConfig.getSWCConfigWithReactCompiler();
70
+ const result = await transform(source, {
71
+ ...swcConfig,
72
+ filename: cleanId,
73
+ module: {
74
+ ...swcConfig?.module,
75
+ type: 'es6'
76
+ },
77
+ sourceMaps: true
78
+ });
79
+ const needsReact = /\bReact\s*\./.test(result.code) && !/from\s+['"]react['"]/.test(result.code);
80
+ return {
81
+ code: needsReact ? `import React from 'react';\n${result.code}` : result.code,
82
+ map: result.map || null
83
+ };
84
+ },
85
+ name: 'lex-swc'
86
+ });
87
+ const importMetaCompatibilityPlugin = (sourcePath)=>({
88
+ enforce: 'post',
89
+ name: 'lex-import-meta-compatibility',
90
+ transform (source, id) {
91
+ const cleanId = id.split('?')[0];
92
+ if (!cleanId.startsWith(sourcePath) || !source.includes('import.meta.url')) return null;
93
+ const replacement = '(typeof document !== "undefined" && document.currentScript && document.currentScript.src ? new URL(document.currentScript.src, window.location.href).href : (typeof window !== "undefined" ? new URL("", window.location.href).href : ""))';
94
+ return source.replaceAll('import.meta.url', replacement);
95
+ }
96
+ });
97
+ const assetsDevPlugin = ()=>{
98
+ let faviconHtml = [];
99
+ return {
100
+ async buildStart () {
101
+ const generatedFavicons = await generateLexFavicons(LexConfig.config);
102
+ faviconHtml = generatedFavicons?.html || [];
103
+ },
104
+ configureServer (server) {
105
+ server.middlewares.use(async (request, response, next)=>{
106
+ if (!request.url) return next();
107
+ const asset = await getDevAsset(LexConfig.config, request.url);
108
+ if (!asset) return next();
109
+ response.statusCode = 200;
110
+ response.setHeader('Content-Type', contentTypes[extname(request.url.split('?')[0])] || 'application/octet-stream');
111
+ response.end(asset);
112
+ });
113
+ },
114
+ name: 'lex-assets-dev',
115
+ transformIndexHtml (html) {
116
+ if (faviconHtml.length === 0) return html;
117
+ return html.replace('</head>', ` ${faviconHtml.join('\n ')}\n </head>`);
118
+ }
119
+ };
120
+ };
121
+ const analyzerPlugin = (enabled)=>({
122
+ generateBundle (_options, bundle) {
123
+ if (!enabled) return;
124
+ const report = Object.entries(bundle).map(([fileName, output])=>({
125
+ fileName,
126
+ size: output.type === 'asset' ? Buffer.byteLength(typeof output.source === 'string' ? output.source : output.source) : Buffer.byteLength(output.code),
127
+ type: output.type
128
+ }));
129
+ this.emitFile({
130
+ fileName: 'bundle-report.json',
131
+ source: JSON.stringify(report, null, 2),
132
+ type: 'asset'
133
+ });
134
+ },
135
+ name: 'lex-bundle-analyzer'
136
+ });
137
+ const getLibraryFormats = (libraryTarget)=>{
138
+ if (libraryTarget === 'commonjs' || libraryTarget === 'commonjs2') return [
139
+ 'cjs'
140
+ ];
141
+ if (libraryTarget === 'var' || libraryTarget === 'window') return [
142
+ 'iife'
143
+ ];
144
+ if (libraryTarget === 'umd') return [
145
+ 'umd'
146
+ ];
147
+ return [
148
+ 'es'
149
+ ];
150
+ };
151
+ const resolveProjectPackage = (packageName)=>{
152
+ const projectPackage = resolve(process.cwd(), 'node_modules', packageName);
153
+ return existsSync(projectPackage) ? projectPackage : resolve(LexConfig.getLexDir(), 'node_modules', packageName);
154
+ };
155
+ export const createLexViteConfig = (options)=>{
156
+ const config = LexConfig.config;
157
+ const sourcePath = config.sourceFullPath || resolve(process.cwd(), config.sourcePath || './src');
158
+ const outputPath = config.outputFullPath || resolve(process.cwd(), config.outputPath || './lib');
159
+ const entryPath = resolve(sourcePath, options.entry || config.entryJs || 'index.js');
160
+ const htmlPath = resolve(sourcePath, config.entryHTML || 'index.html');
161
+ const hasHtmlEntry = existsSync(htmlPath) && !options.ssr;
162
+ const outputHash = config.outputHash || options.mode === 'production';
163
+ const fileName = config.outputFile || (outputHash ? '[name].[hash].js' : '[name].js');
164
+ const viteConfig = {
165
+ appType: hasHtmlEntry ? 'spa' : 'custom',
166
+ base: '/',
167
+ build: {
168
+ cssCodeSplit: true,
169
+ emptyOutDir: false,
170
+ minify: options.mode === 'production',
171
+ outDir: outputPath,
172
+ rolldownOptions: {
173
+ input: hasHtmlEntry ? htmlPath : entryPath,
174
+ output: {
175
+ assetFileNames: outputHash ? 'assets/[name].[hash][extname]' : 'assets/[name][extname]',
176
+ chunkFileNames: outputHash ? '[name].[hash].chunk.js' : '[name].chunk.js',
177
+ entryFileNames: fileName,
178
+ manualChunks (id) {
179
+ return id.includes('/node_modules/') ? 'vendors' : undefined;
180
+ }
181
+ }
182
+ },
183
+ sourcemap: config.swc?.sourceMaps ? true : false,
184
+ ssr: options.ssr ? entryPath : false,
185
+ target: config.swc?.jsc?.target?.toString() || 'es2020'
186
+ },
187
+ clearScreen: false,
188
+ configFile: false,
189
+ css: {
190
+ postcss: resolve(LexConfig.getLexDir(), 'postcss.config.js')
191
+ },
192
+ define: {
193
+ 'process.env.NODE_ENV': JSON.stringify(options.mode || (options.command === 'build' ? 'production' : 'development'))
194
+ },
195
+ envDir: process.cwd(),
196
+ logLevel: options.quiet ? 'silent' : 'info',
197
+ mode: options.mode || (options.command === 'build' ? 'production' : 'development'),
198
+ plugins: [
199
+ ...options.ssr ? [] : [
200
+ emptyCryptoPlugin(),
201
+ nodePolyfillsPlugin(),
202
+ createInjectPlugin({
203
+ Buffer: [
204
+ resolveProjectPackage('buffer/index.js'),
205
+ 'Buffer'
206
+ ],
207
+ global: [
208
+ resolveProjectPackage('global/window.js'),
209
+ 'default'
210
+ ],
211
+ process: [
212
+ resolveProjectPackage('process/browser.js'),
213
+ 'default'
214
+ ]
215
+ })
216
+ ],
217
+ swcPlugin(sourcePath),
218
+ graphqlPlugin(),
219
+ ...options.ssr ? [] : [
220
+ importMetaCompatibilityPlugin(sourcePath),
221
+ assetsDevPlugin(),
222
+ analyzerPlugin(Boolean(options.analyze))
223
+ ]
224
+ ],
225
+ publicDir: false,
226
+ resolve: {
227
+ alias: {
228
+ Buffer: resolveProjectPackage('buffer'),
229
+ 'core-js': resolveProjectPackage('core-js'),
230
+ global: resolveProjectPackage('global'),
231
+ 'graphql-tag': resolveProjectPackage('graphql-tag'),
232
+ randombytes: resolve(LexConfig.getLexDir(), 'node_modules/randombytes'),
233
+ react: resolveProjectPackage('react'),
234
+ 'react-dom': resolveProjectPackage('react-dom'),
235
+ 'regenerator-runtime': resolveProjectPackage('regenerator-runtime')
236
+ },
237
+ extensions: [
238
+ '.mjs',
239
+ '.js',
240
+ '.ts',
241
+ '.tsx',
242
+ '.jsx',
243
+ '.json',
244
+ '.gql',
245
+ '.graphql'
246
+ ],
247
+ preserveSymlinks: false,
248
+ tsconfigPaths: true
249
+ },
250
+ root: sourcePath,
251
+ server: {
252
+ hmr: false,
253
+ open: options.open,
254
+ port: options.port,
255
+ strictPort: true
256
+ }
257
+ };
258
+ if (!hasHtmlEntry && config.libraryName && !options.ssr) {
259
+ viteConfig.build = {
260
+ ...viteConfig.build,
261
+ lib: {
262
+ entry: entryPath,
263
+ fileName: ()=>config.outputFile || 'index.js',
264
+ formats: getLibraryFormats(config.libraryTarget),
265
+ name: config.libraryName
266
+ }
267
+ };
268
+ }
269
+ return mergeConfig(viteConfig, config.vite || {});
270
+ };
271
+
272
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy92aXRlL2NvbmZpZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHt0cmFuc2Zvcm19IGZyb20gJ0Bzd2MvY29yZSc7XG5pbXBvcnQgaW5qZWN0IGZyb20gJ0Byb2xsdXAvcGx1Z2luLWluamVjdCc7XG5pbXBvcnQge2V4aXN0c1N5bmMsIHJlYWRGaWxlU3luY30gZnJvbSAnZnMnO1xuaW1wb3J0IHtleHRuYW1lLCByZXNvbHZlfSBmcm9tICdwYXRoJztcbmltcG9ydCB7bWVyZ2VDb25maWd9IGZyb20gJ3ZpdGUnO1xuXG5pbXBvcnQge0xleENvbmZpZ30gZnJvbSAnLi4vLi4vTGV4Q29uZmlnLmpzJztcbmltcG9ydCB7Z2VuZXJhdGVMZXhGYXZpY29ucywgZ2V0RGV2QXNzZXR9IGZyb20gJy4vYXNzZXRzLmpzJztcblxuaW1wb3J0IHR5cGUge0lubGluZUNvbmZpZywgUGx1Z2lufSBmcm9tICd2aXRlJztcblxuY29uc3QgY3JlYXRlSW5qZWN0UGx1Z2luID0gaW5qZWN0IGFzIHVua25vd24gYXMgKG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiBQbHVnaW47XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGV4Vml0ZU9wdGlvbnMge1xuICByZWFkb25seSBhbmFseXplPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgY29tbWFuZDogJ2J1aWxkJyB8ICdzZXJ2ZSc7XG4gIHJlYWRvbmx5IGVudHJ5Pzogc3RyaW5nO1xuICByZWFkb25seSBtb2RlPzogc3RyaW5nO1xuICByZWFkb25seSBvcGVuPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcG9ydD86IG51bWJlcjtcbiAgcmVhZG9ubHkgcXVpZXQ/OiBib29sZWFuO1xuICByZWFkb25seSBzc3I/OiBib29sZWFuO1xufVxuXG5jb25zdCBjb250ZW50VHlwZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICcuY3NzJzogJ3RleHQvY3NzJyxcbiAgJy5naWYnOiAnaW1hZ2UvZ2lmJyxcbiAgJy5odG1sJzogJ3RleHQvaHRtbCcsXG4gICcuaWNvJzogJ2ltYWdlL3gtaWNvbicsXG4gICcuanBlZyc6ICdpbWFnZS9qcGVnJyxcbiAgJy5qcGcnOiAnaW1hZ2UvanBlZycsXG4gICcuanNvbic6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgJy5wbmcnOiAnaW1hZ2UvcG5nJyxcbiAgJy5zdmcnOiAnaW1hZ2Uvc3ZnK3htbCcsXG4gICcudHRmJzogJ2ZvbnQvdHRmJyxcbiAgJy50eHQnOiAndGV4dC9wbGFpbicsXG4gICcud29mZic6ICdmb250L3dvZmYnLFxuICAnLndvZmYyJzogJ2ZvbnQvd29mZjInXG59O1xuXG5jb25zdCBlbXB0eUNyeXB0b1BsdWdpbiA9ICgpOiBQbHVnaW4gPT4gKHtcbiAgbG9hZChpZCkge1xuICAgIHJldHVybiBpZCA9PT0gJ1xcMGxleC1lbXB0eS1jcnlwdG8nID8gJ2V4cG9ydCBkZWZhdWx0IHt9OyBleHBvcnQgY29uc3Qgd2ViY3J5cHRvID0gdW5kZWZpbmVkOycgOiBudWxsO1xuICB9LFxuICBuYW1lOiAnbGV4LWVtcHR5LWNyeXB0bycsXG4gIHJlc29sdmVJZChpZCkge1xuICAgIHJldHVybiBpZCA9PT0gJ2NyeXB0bycgfHwgaWQgPT09ICdub2RlOmNyeXB0bycgPyAnXFwwbGV4LWVtcHR5LWNyeXB0bycgOiBudWxsO1xuICB9XG59KTtcblxuY29uc3Qgbm9kZVBvbHlmaWxsTW9kdWxlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgYXNzZXJ0OiAnYXNzZXJ0L2J1aWxkL2Fzc2VydC5qcycsXG4gIGJ1ZmZlcjogJ2J1ZmZlci9pbmRleC5qcycsXG4gIGh0dHA6ICdzdHJlYW0taHR0cC9pbmRleC5qcycsXG4gIGh0dHBzOiAnaHR0cHMtYnJvd3NlcmlmeS9pbmRleC5qcycsXG4gIG9zOiAnb3MtYnJvd3NlcmlmeS9icm93c2VyLmpzJyxcbiAgcGF0aDogJ3BhdGgtYnJvd3NlcmlmeS9pbmRleC5qcycsXG4gIHByb2Nlc3M6ICdwcm9jZXNzL2Jyb3dzZXIuanMnLFxuICBzdHJlYW06ICdzdHJlYW0tYnJvd3NlcmlmeS9pbmRleC5qcycsXG4gIHV0aWw6ICd1dGlsL3V0aWwuanMnLFxuICB2bTogJ3ZtLWJyb3dzZXJpZnkvaW5kZXguanMnXG59O1xuXG5jb25zdCBub2RlUG9seWZpbGxzUGx1Z2luID0gKCk6IFBsdWdpbiA9PiAoe1xuICBuYW1lOiAnbGV4LW5vZGUtcG9seWZpbGxzJyxcbiAgcmVzb2x2ZUlkKGlkKSB7XG4gICAgY29uc3QgbW9kdWxlTmFtZSA9IGlkLnN0YXJ0c1dpdGgoJ25vZGU6JykgPyBpZC5zbGljZSg1KSA6IGlkO1xuICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gbm9kZVBvbHlmaWxsTW9kdWxlc1ttb2R1bGVOYW1lXTtcbiAgICByZXR1cm4gcmVwbGFjZW1lbnQgPyByZXNvbHZlUHJvamVjdFBhY2thZ2UocmVwbGFjZW1lbnQpIDogbnVsbDtcbiAgfVxufSk7XG5cbmNvbnN0IGdyYXBocWxQbHVnaW4gPSAoKTogUGx1Z2luID0+ICh7XG4gIGxvYWQoaWQpIHtcbiAgICBpZighL1xcLihncWx8Z3JhcGhxbCkkLy50ZXN0KGlkKSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgc291cmNlID0gSlNPTi5zdHJpbmdpZnkocmVhZEZpbGVTeW5jKGlkLCAndXRmOCcpKTtcbiAgICByZXR1cm4gYGltcG9ydCBncWwgZnJvbSAnZ3JhcGhxbC10YWcnOyBleHBvcnQgZGVmYXVsdCBncWwoJHtzb3VyY2V9KTtgO1xuICB9LFxuICBuYW1lOiAnbGV4LWdyYXBocWwnXG59KTtcblxuY29uc3Qgc3djUGx1Z2luID0gKHNvdXJjZVBhdGg6IHN0cmluZyk6IFBsdWdpbiA9PiAoe1xuICBlbmZvcmNlOiAncHJlJyxcbiAgYXN5bmMgdHJhbnNmb3JtKHNvdXJjZSwgaWQpIHtcbiAgICBjb25zdCBjbGVhbklkID0gaWQuc3BsaXQoJz8nKVswXTtcbiAgICBpZighY2xlYW5JZC5zdGFydHNXaXRoKHNvdXJjZVBhdGgpIHx8ICEvXFwuW2p0XXN4PyQvLnRlc3QoY2xlYW5JZCkgfHwgL1xcLih0ZXN0fHNwZWN8aW50ZWdyYXRpb258ZTJlKVxcLltqdF1zeD8kLy50ZXN0KGNsZWFuSWQpKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHN3Y0NvbmZpZyA9IExleENvbmZpZy5nZXRTV0NDb25maWdXaXRoUmVhY3RDb21waWxlcigpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyYW5zZm9ybShzb3VyY2UsIHtcbiAgICAgIC4uLnN3Y0NvbmZpZyxcbiAgICAgIGZpbGVuYW1lOiBjbGVhbklkLFxuICAgICAgbW9kdWxlOiB7Li4uc3djQ29uZmlnPy5tb2R1bGUsIHR5cGU6ICdlczYnfSxcbiAgICAgIHNvdXJjZU1hcHM6IHRydWVcbiAgICB9KTtcblxuICAgIGNvbnN0IG5lZWRzUmVhY3QgPSAvXFxiUmVhY3RcXHMqXFwuLy50ZXN0KHJlc3VsdC5jb2RlKSAmJiAhL2Zyb21cXHMrWydcIl1yZWFjdFsnXCJdLy50ZXN0KHJlc3VsdC5jb2RlKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogbmVlZHNSZWFjdCA/IGBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xcbiR7cmVzdWx0LmNvZGV9YCA6IHJlc3VsdC5jb2RlLFxuICAgICAgbWFwOiByZXN1bHQubWFwIHx8IG51bGxcbiAgICB9O1xuICB9LFxuICBuYW1lOiAnbGV4LXN3Yydcbn0pO1xuXG5jb25zdCBpbXBvcnRNZXRhQ29tcGF0aWJpbGl0eVBsdWdpbiA9IChzb3VyY2VQYXRoOiBzdHJpbmcpOiBQbHVnaW4gPT4gKHtcbiAgZW5mb3JjZTogJ3Bvc3QnLFxuICBuYW1lOiAnbGV4LWltcG9ydC1tZXRhLWNvbXBhdGliaWxpdHknLFxuICB0cmFuc2Zvcm0oc291cmNlLCBpZCkge1xuICAgIGNvbnN0IGNsZWFuSWQgPSBpZC5zcGxpdCgnPycpWzBdO1xuICAgIGlmKCFjbGVhbklkLnN0YXJ0c1dpdGgoc291cmNlUGF0aCkgfHwgIXNvdXJjZS5pbmNsdWRlcygnaW1wb3J0Lm1ldGEudXJsJykpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgcmVwbGFjZW1lbnQgPSAnKHR5cGVvZiBkb2N1bWVudCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0ICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjID8gbmV3IFVSTChkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYywgd2luZG93LmxvY2F0aW9uLmhyZWYpLmhyZWYgOiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IG5ldyBVUkwoXCJcIiwgd2luZG93LmxvY2F0aW9uLmhyZWYpLmhyZWYgOiBcIlwiKSknO1xuICAgIHJldHVybiBzb3VyY2UucmVwbGFjZUFsbCgnaW1wb3J0Lm1ldGEudXJsJywgcmVwbGFjZW1lbnQpO1xuICB9XG59KTtcblxuY29uc3QgYXNzZXRzRGV2UGx1Z2luID0gKCk6IFBsdWdpbiA9PiB7XG4gIGxldCBmYXZpY29uSHRtbDogc3RyaW5nW10gPSBbXTtcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGJ1aWxkU3RhcnQoKSB7XG4gICAgICBjb25zdCBnZW5lcmF0ZWRGYXZpY29ucyA9IGF3YWl0IGdlbmVyYXRlTGV4RmF2aWNvbnMoTGV4Q29uZmlnLmNvbmZpZyk7XG4gICAgICBmYXZpY29uSHRtbCA9IGdlbmVyYXRlZEZhdmljb25zPy5odG1sIHx8IFtdO1xuICAgIH0sXG4gICAgY29uZmlndXJlU2VydmVyKHNlcnZlcikge1xuICAgICAgc2VydmVyLm1pZGRsZXdhcmVzLnVzZShhc3luYyAocmVxdWVzdCwgcmVzcG9uc2UsIG5leHQpID0+IHtcbiAgICAgICAgaWYoIXJlcXVlc3QudXJsKSByZXR1cm4gbmV4dCgpO1xuICAgICAgICBjb25zdCBhc3NldCA9IGF3YWl0IGdldERldkFzc2V0KExleENvbmZpZy5jb25maWcsIHJlcXVlc3QudXJsKTtcbiAgICAgICAgaWYoIWFzc2V0KSByZXR1cm4gbmV4dCgpO1xuXG4gICAgICAgIHJlc3BvbnNlLnN0YXR1c0NvZGUgPSAyMDA7XG4gICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcignQ29udGVudC1UeXBlJywgY29udGVudFR5cGVzW2V4dG5hbWUocmVxdWVzdC51cmwuc3BsaXQoJz8nKVswXSldIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKTtcbiAgICAgICAgcmVzcG9uc2UuZW5kKGFzc2V0KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgbmFtZTogJ2xleC1hc3NldHMtZGV2JyxcbiAgICB0cmFuc2Zvcm1JbmRleEh0bWwoaHRtbCkge1xuICAgICAgaWYoZmF2aWNvbkh0bWwubGVuZ3RoID09PSAwKSByZXR1cm4gaHRtbDtcbiAgICAgIHJldHVybiBodG1sLnJlcGxhY2UoJzwvaGVhZD4nLCBgICAgICR7ZmF2aWNvbkh0bWwuam9pbignXFxuICAgICcpfVxcbiAgPC9oZWFkPmApO1xuICAgIH1cbiAgfTtcbn07XG5cbmNvbnN0IGFuYWx5emVyUGx1Z2luID0gKGVuYWJsZWQ6IGJvb2xlYW4pOiBQbHVnaW4gPT4gKHtcbiAgZ2VuZXJhdGVCdW5kbGUoX29wdGlvbnMsIGJ1bmRsZSkge1xuICAgIGlmKCFlbmFibGVkKSByZXR1cm47XG5cbiAgICBjb25zdCByZXBvcnQgPSBPYmplY3QuZW50cmllcyhidW5kbGUpLm1hcCgoW2ZpbGVOYW1lLCBvdXRwdXRdKSA9PiAoe1xuICAgICAgZmlsZU5hbWUsXG4gICAgICBzaXplOiBvdXRwdXQudHlwZSA9PT0gJ2Fzc2V0J1xuICAgICAgICA/IEJ1ZmZlci5ieXRlTGVuZ3RoKHR5cGVvZiBvdXRwdXQuc291cmNlID09PSAnc3RyaW5nJyA/IG91dHB1dC5zb3VyY2UgOiBvdXRwdXQuc291cmNlKVxuICAgICAgICA6IEJ1ZmZlci5ieXRlTGVuZ3RoKG91dHB1dC5jb2RlKSxcbiAgICAgIHR5cGU6IG91dHB1dC50eXBlXG4gICAgfSkpO1xuXG4gICAgdGhpcy5lbWl0RmlsZSh7ZmlsZU5hbWU6ICdidW5kbGUtcmVwb3J0Lmpzb24nLCBzb3VyY2U6IEpTT04uc3RyaW5naWZ5KHJlcG9ydCwgbnVsbCwgMiksIHR5cGU6ICdhc3NldCd9KTtcbiAgfSxcbiAgbmFtZTogJ2xleC1idW5kbGUtYW5hbHl6ZXInXG59KTtcblxuY29uc3QgZ2V0TGlicmFyeUZvcm1hdHMgPSAobGlicmFyeVRhcmdldD86IHN0cmluZyk6IEFycmF5PCdjanMnIHwgJ2VzJyB8ICdpaWZlJyB8ICd1bWQnPiA9PiB7XG4gIGlmKGxpYnJhcnlUYXJnZXQgPT09ICdjb21tb25qcycgfHwgbGlicmFyeVRhcmdldCA9PT0gJ2NvbW1vbmpzMicpIHJldHVybiBbJ2NqcyddO1xuICBpZihsaWJyYXJ5VGFyZ2V0ID09PSAndmFyJyB8fCBsaWJyYXJ5VGFyZ2V0ID09PSAnd2luZG93JykgcmV0dXJuIFsnaWlmZSddO1xuICBpZihsaWJyYXJ5VGFyZ2V0ID09PSAndW1kJykgcmV0dXJuIFsndW1kJ107XG4gIHJldHVybiBbJ2VzJ107XG59O1xuXG5jb25zdCByZXNvbHZlUHJvamVjdFBhY2thZ2UgPSAocGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHByb2plY3RQYWNrYWdlID0gcmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnbm9kZV9tb2R1bGVzJywgcGFja2FnZU5hbWUpO1xuICByZXR1cm4gZXhpc3RzU3luYyhwcm9qZWN0UGFja2FnZSkgPyBwcm9qZWN0UGFja2FnZSA6IHJlc29sdmUoTGV4Q29uZmlnLmdldExleERpcigpLCAnbm9kZV9tb2R1bGVzJywgcGFja2FnZU5hbWUpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUxleFZpdGVDb25maWcgPSAob3B0aW9uczogTGV4Vml0ZU9wdGlvbnMpOiBJbmxpbmVDb25maWcgPT4ge1xuICBjb25zdCBjb25maWcgPSBMZXhDb25maWcuY29uZmlnO1xuICBjb25zdCBzb3VyY2VQYXRoID0gY29uZmlnLnNvdXJjZUZ1bGxQYXRoIHx8IHJlc29sdmUocHJvY2Vzcy5jd2QoKSwgY29uZmlnLnNvdXJjZVBhdGggfHwgJy4vc3JjJyk7XG4gIGNvbnN0IG91dHB1dFBhdGggPSBjb25maWcub3V0cHV0RnVsbFBhdGggfHwgcmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBjb25maWcub3V0cHV0UGF0aCB8fCAnLi9saWInKTtcbiAgY29uc3QgZW50cnlQYXRoID0gcmVzb2x2ZShzb3VyY2VQYXRoLCBvcHRpb25zLmVudHJ5IHx8IGNvbmZpZy5lbnRyeUpzIHx8ICdpbmRleC5qcycpO1xuICBjb25zdCBodG1sUGF0aCA9IHJlc29sdmUoc291cmNlUGF0aCwgY29uZmlnLmVudHJ5SFRNTCB8fCAnaW5kZXguaHRtbCcpO1xuICBjb25zdCBoYXNIdG1sRW50cnkgPSBleGlzdHNTeW5jKGh0bWxQYXRoKSAmJiAhb3B0aW9ucy5zc3I7XG4gIGNvbnN0IG91dHB1dEhhc2ggPSBjb25maWcub3V0cHV0SGFzaCB8fCBvcHRpb25zLm1vZGUgPT09ICdwcm9kdWN0aW9uJztcbiAgY29uc3QgZmlsZU5hbWUgPSBjb25maWcub3V0cHV0RmlsZSB8fCAob3V0cHV0SGFzaCA/ICdbbmFtZV0uW2hhc2hdLmpzJyA6ICdbbmFtZV0uanMnKTtcblxuICBjb25zdCB2aXRlQ29uZmlnOiBJbmxpbmVDb25maWcgPSB7XG4gICAgYXBwVHlwZTogaGFzSHRtbEVudHJ5ID8gJ3NwYScgOiAnY3VzdG9tJyxcbiAgICBiYXNlOiAnLycsXG4gICAgYnVpbGQ6IHtcbiAgICAgIGNzc0NvZGVTcGxpdDogdHJ1ZSxcbiAgICAgIGVtcHR5T3V0RGlyOiBmYWxzZSxcbiAgICAgIG1pbmlmeTogb3B0aW9ucy5tb2RlID09PSAncHJvZHVjdGlvbicsXG4gICAgICBvdXREaXI6IG91dHB1dFBhdGgsXG4gICAgICByb2xsZG93bk9wdGlvbnM6IHtcbiAgICAgICAgaW5wdXQ6IGhhc0h0bWxFbnRyeSA/IGh0bWxQYXRoIDogZW50cnlQYXRoLFxuICAgICAgICBvdXRwdXQ6IHtcbiAgICAgICAgICBhc3NldEZpbGVOYW1lczogb3V0cHV0SGFzaCA/ICdhc3NldHMvW25hbWVdLltoYXNoXVtleHRuYW1lXScgOiAnYXNzZXRzL1tuYW1lXVtleHRuYW1lXScsXG4gICAgICAgICAgY2h1bmtGaWxlTmFtZXM6IG91dHB1dEhhc2ggPyAnW25hbWVdLltoYXNoXS5jaHVuay5qcycgOiAnW25hbWVdLmNodW5rLmpzJyxcbiAgICAgICAgICBlbnRyeUZpbGVOYW1lczogZmlsZU5hbWUsXG4gICAgICAgICAgbWFudWFsQ2h1bmtzKGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQuaW5jbHVkZXMoJy9ub2RlX21vZHVsZXMvJykgPyAndmVuZG9ycycgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc291cmNlbWFwOiBjb25maWcuc3djPy5zb3VyY2VNYXBzID8gdHJ1ZSA6IGZhbHNlLFxuICAgICAgc3NyOiBvcHRpb25zLnNzciA/IGVudHJ5UGF0aCA6IGZhbHNlLFxuICAgICAgdGFyZ2V0OiBjb25maWcuc3djPy5qc2M/LnRhcmdldD8udG9TdHJpbmcoKSB8fCAnZXMyMDIwJ1xuICAgIH0sXG4gICAgY2xlYXJTY3JlZW46IGZhbHNlLFxuICAgIGNvbmZpZ0ZpbGU6IGZhbHNlLFxuICAgIGNzczoge1xuICAgICAgcG9zdGNzczogcmVzb2x2ZShMZXhDb25maWcuZ2V0TGV4RGlyKCksICdwb3N0Y3NzLmNvbmZpZy5qcycpXG4gICAgfSxcbiAgICBkZWZpbmU6IHtcbiAgICAgICdwcm9jZXNzLmVudi5OT0RFX0VOVic6IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMubW9kZSB8fCAob3B0aW9ucy5jb21tYW5kID09PSAnYnVpbGQnID8gJ3Byb2R1Y3Rpb24nIDogJ2RldmVsb3BtZW50JykpXG4gICAgfSxcbiAgICBlbnZEaXI6IHByb2Nlc3MuY3dkKCksXG4gICAgbG9nTGV2ZWw6IG9wdGlvbnMucXVpZXQgPyAnc2lsZW50JyA6ICdpbmZvJyxcbiAgICBtb2RlOiBvcHRpb25zLm1vZGUgfHwgKG9wdGlvbnMuY29tbWFuZCA9PT0gJ2J1aWxkJyA/ICdwcm9kdWN0aW9uJyA6ICdkZXZlbG9wbWVudCcpLFxuICAgIHBsdWdpbnM6IFtcbiAgICAgIC4uLihvcHRpb25zLnNzciA/IFtdIDogW1xuICAgICAgICBlbXB0eUNyeXB0b1BsdWdpbigpLFxuICAgICAgICBub2RlUG9seWZpbGxzUGx1Z2luKCksXG4gICAgICAgIGNyZWF0ZUluamVjdFBsdWdpbih7XG4gICAgICAgICAgQnVmZmVyOiBbcmVzb2x2ZVByb2plY3RQYWNrYWdlKCdidWZmZXIvaW5kZXguanMnKSwgJ0J1ZmZlciddLFxuICAgICAgICAgIGdsb2JhbDogW3Jlc29sdmVQcm9qZWN0UGFja2FnZSgnZ2xvYmFsL3dpbmRvdy5qcycpLCAnZGVmYXVsdCddLFxuICAgICAgICAgIHByb2Nlc3M6IFtyZXNvbHZlUHJvamVjdFBhY2thZ2UoJ3Byb2Nlc3MvYnJvd3Nlci5qcycpLCAnZGVmYXVsdCddXG4gICAgICAgIH0pXG4gICAgICBdKSxcbiAgICAgIHN3Y1BsdWdpbihzb3VyY2VQYXRoKSxcbiAgICAgIGdyYXBocWxQbHVnaW4oKSxcbiAgICAgIC4uLihvcHRpb25zLnNzciA/IFtdIDogW2ltcG9ydE1ldGFDb21wYXRpYmlsaXR5UGx1Z2luKHNvdXJjZVBhdGgpLCBhc3NldHNEZXZQbHVnaW4oKSwgYW5hbHl6ZXJQbHVnaW4oQm9vbGVhbihvcHRpb25zLmFuYWx5emUpKV0pXG4gICAgXSxcbiAgICBwdWJsaWNEaXI6IGZhbHNlLFxuICAgIHJlc29sdmU6IHtcbiAgICAgIGFsaWFzOiB7XG4gICAgICAgIEJ1ZmZlcjogcmVzb2x2ZVByb2plY3RQYWNrYWdlKCdidWZmZXInKSxcbiAgICAgICAgJ2NvcmUtanMnOiByZXNvbHZlUHJvamVjdFBhY2thZ2UoJ2NvcmUtanMnKSxcbiAgICAgICAgZ2xvYmFsOiByZXNvbHZlUHJvamVjdFBhY2thZ2UoJ2dsb2JhbCcpLFxuICAgICAgICAnZ3JhcGhxbC10YWcnOiByZXNvbHZlUHJvamVjdFBhY2thZ2UoJ2dyYXBocWwtdGFnJyksXG4gICAgICAgIHJhbmRvbWJ5dGVzOiByZXNvbHZlKExleENvbmZpZy5nZXRMZXhEaXIoKSwgJ25vZGVfbW9kdWxlcy9yYW5kb21ieXRlcycpLFxuICAgICAgICByZWFjdDogcmVzb2x2ZVByb2plY3RQYWNrYWdlKCdyZWFjdCcpLFxuICAgICAgICAncmVhY3QtZG9tJzogcmVzb2x2ZVByb2plY3RQYWNrYWdlKCdyZWFjdC1kb20nKSxcbiAgICAgICAgJ3JlZ2VuZXJhdG9yLXJ1bnRpbWUnOiByZXNvbHZlUHJvamVjdFBhY2thZ2UoJ3JlZ2VuZXJhdG9yLXJ1bnRpbWUnKVxuICAgICAgfSxcbiAgICAgIGV4dGVuc2lvbnM6IFsnLm1qcycsICcuanMnLCAnLnRzJywgJy50c3gnLCAnLmpzeCcsICcuanNvbicsICcuZ3FsJywgJy5ncmFwaHFsJ10sXG4gICAgICBwcmVzZXJ2ZVN5bWxpbmtzOiBmYWxzZSxcbiAgICAgIHRzY29uZmlnUGF0aHM6IHRydWVcbiAgICB9LFxuICAgIHJvb3Q6IHNvdXJjZVBhdGgsXG4gICAgc2VydmVyOiB7XG4gICAgICBobXI6IGZhbHNlLFxuICAgICAgb3Blbjogb3B0aW9ucy5vcGVuLFxuICAgICAgcG9ydDogb3B0aW9ucy5wb3J0LFxuICAgICAgc3RyaWN0UG9ydDogdHJ1ZVxuICAgIH1cbiAgfTtcblxuICBpZighaGFzSHRtbEVudHJ5ICYmIGNvbmZpZy5saWJyYXJ5TmFtZSAmJiAhb3B0aW9ucy5zc3IpIHtcbiAgICB2aXRlQ29uZmlnLmJ1aWxkID0ge1xuICAgICAgLi4udml0ZUNvbmZpZy5idWlsZCxcbiAgICAgIGxpYjoge1xuICAgICAgICBlbnRyeTogZW50cnlQYXRoLFxuICAgICAgICBmaWxlTmFtZTogKCkgPT4gY29uZmlnLm91dHB1dEZpbGUgfHwgJ2luZGV4LmpzJyxcbiAgICAgICAgZm9ybWF0czogZ2V0TGlicmFyeUZvcm1hdHMoY29uZmlnLmxpYnJhcnlUYXJnZXQpLFxuICAgICAgICBuYW1lOiBjb25maWcubGlicmFyeU5hbWVcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIG1lcmdlQ29uZmlnKHZpdGVDb25maWcsIGNvbmZpZy52aXRlIHx8IHt9KSBhcyBJbmxpbmVDb25maWc7XG59O1xuIl0sIm5hbWVzIjpbInRyYW5zZm9ybSIsImluamVjdCIsImV4aXN0c1N5bmMiLCJyZWFkRmlsZVN5bmMiLCJleHRuYW1lIiwicmVzb2x2ZSIsIm1lcmdlQ29uZmlnIiwiTGV4Q29uZmlnIiwiZ2VuZXJhdGVMZXhGYXZpY29ucyIsImdldERldkFzc2V0IiwiY3JlYXRlSW5qZWN0UGx1Z2luIiwiY29udGVudFR5cGVzIiwiZW1wdHlDcnlwdG9QbHVnaW4iLCJsb2FkIiwiaWQiLCJuYW1lIiwicmVzb2x2ZUlkIiwibm9kZVBvbHlmaWxsTW9kdWxlcyIsImFzc2VydCIsImJ1ZmZlciIsImh0dHAiLCJodHRwcyIsIm9zIiwicGF0aCIsInByb2Nlc3MiLCJzdHJlYW0iLCJ1dGlsIiwidm0iLCJub2RlUG9seWZpbGxzUGx1Z2luIiwibW9kdWxlTmFtZSIsInN0YXJ0c1dpdGgiLCJzbGljZSIsInJlcGxhY2VtZW50IiwicmVzb2x2ZVByb2plY3RQYWNrYWdlIiwiZ3JhcGhxbFBsdWdpbiIsInRlc3QiLCJzb3VyY2UiLCJKU09OIiwic3RyaW5naWZ5Iiwic3djUGx1Z2luIiwic291cmNlUGF0aCIsImVuZm9yY2UiLCJjbGVhbklkIiwic3BsaXQiLCJzd2NDb25maWciLCJnZXRTV0NDb25maWdXaXRoUmVhY3RDb21waWxlciIsInJlc3VsdCIsImZpbGVuYW1lIiwibW9kdWxlIiwidHlwZSIsInNvdXJjZU1hcHMiLCJuZWVkc1JlYWN0IiwiY29kZSIsIm1hcCIsImltcG9ydE1ldGFDb21wYXRpYmlsaXR5UGx1Z2luIiwiaW5jbHVkZXMiLCJyZXBsYWNlQWxsIiwiYXNzZXRzRGV2UGx1Z2luIiwiZmF2aWNvbkh0bWwiLCJidWlsZFN0YXJ0IiwiZ2VuZXJhdGVkRmF2aWNvbnMiLCJjb25maWciLCJodG1sIiwiY29uZmlndXJlU2VydmVyIiwic2VydmVyIiwibWlkZGxld2FyZXMiLCJ1c2UiLCJyZXF1ZXN0IiwicmVzcG9uc2UiLCJuZXh0IiwidXJsIiwiYXNzZXQiLCJzdGF0dXNDb2RlIiwic2V0SGVhZGVyIiwiZW5kIiwidHJhbnNmb3JtSW5kZXhIdG1sIiwibGVuZ3RoIiwicmVwbGFjZSIsImpvaW4iLCJhbmFseXplclBsdWdpbiIsImVuYWJsZWQiLCJnZW5lcmF0ZUJ1bmRsZSIsIl9vcHRpb25zIiwiYnVuZGxlIiwicmVwb3J0IiwiT2JqZWN0IiwiZW50cmllcyIsImZpbGVOYW1lIiwib3V0cHV0Iiwic2l6ZSIsIkJ1ZmZlciIsImJ5dGVMZW5ndGgiLCJlbWl0RmlsZSIsImdldExpYnJhcnlGb3JtYXRzIiwibGlicmFyeVRhcmdldCIsInBhY2thZ2VOYW1lIiwicHJvamVjdFBhY2thZ2UiLCJjd2QiLCJnZXRMZXhEaXIiLCJjcmVhdGVMZXhWaXRlQ29uZmlnIiwib3B0aW9ucyIsInNvdXJjZUZ1bGxQYXRoIiwib3V0cHV0UGF0aCIsIm91dHB1dEZ1bGxQYXRoIiwiZW50cnlQYXRoIiwiZW50cnkiLCJlbnRyeUpzIiwiaHRtbFBhdGgiLCJlbnRyeUhUTUwiLCJoYXNIdG1sRW50cnkiLCJzc3IiLCJvdXRwdXRIYXNoIiwibW9kZSIsIm91dHB1dEZpbGUiLCJ2aXRlQ29uZmlnIiwiYXBwVHlwZSIsImJhc2UiLCJidWlsZCIsImNzc0NvZGVTcGxpdCIsImVtcHR5T3V0RGlyIiwibWluaWZ5Iiwib3V0RGlyIiwicm9sbGRvd25PcHRpb25zIiwiaW5wdXQiLCJhc3NldEZpbGVOYW1lcyIsImNodW5rRmlsZU5hbWVzIiwiZW50cnlGaWxlTmFtZXMiLCJtYW51YWxDaHVua3MiLCJ1bmRlZmluZWQiLCJzb3VyY2VtYXAiLCJzd2MiLCJ0YXJnZXQiLCJqc2MiLCJ0b1N0cmluZyIsImNsZWFyU2NyZWVuIiwiY29uZmlnRmlsZSIsImNzcyIsInBvc3Rjc3MiLCJkZWZpbmUiLCJjb21tYW5kIiwiZW52RGlyIiwibG9nTGV2ZWwiLCJxdWlldCIsInBsdWdpbnMiLCJnbG9iYWwiLCJCb29sZWFuIiwiYW5hbHl6ZSIsInB1YmxpY0RpciIsImFsaWFzIiwicmFuZG9tYnl0ZXMiLCJyZWFjdCIsImV4dGVuc2lvbnMiLCJwcmVzZXJ2ZVN5bWxpbmtzIiwidHNjb25maWdQYXRocyIsInJvb3QiLCJobXIiLCJvcGVuIiwicG9ydCIsInN0cmljdFBvcnQiLCJsaWJyYXJ5TmFtZSIsImxpYiIsImZvcm1hdHMiLCJ2aXRlIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0NBR0MsR0FDRCxTQUFRQSxTQUFTLFFBQU8sWUFBWTtBQUNwQyxPQUFPQyxZQUFZLHdCQUF3QjtBQUMzQyxTQUFRQyxVQUFVLEVBQUVDLFlBQVksUUFBTyxLQUFLO0FBQzVDLFNBQVFDLE9BQU8sRUFBRUMsT0FBTyxRQUFPLE9BQU87QUFDdEMsU0FBUUMsV0FBVyxRQUFPLE9BQU87QUFFakMsU0FBUUMsU0FBUyxRQUFPLHFCQUFxQjtBQUM3QyxTQUFRQyxtQkFBbUIsRUFBRUMsV0FBVyxRQUFPLGNBQWM7QUFJN0QsTUFBTUMscUJBQXFCVDtBQWEzQixNQUFNVSxlQUF1QztJQUMzQyxRQUFRO0lBQ1IsUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixTQUFTO0lBQ1QsUUFBUTtJQUNSLFFBQVE7SUFDUixRQUFRO0lBQ1IsUUFBUTtJQUNSLFNBQVM7SUFDVCxVQUFVO0FBQ1o7QUFFQSxNQUFNQyxvQkFBb0IsSUFBZSxDQUFBO1FBQ3ZDQyxNQUFLQyxFQUFFO1lBQ0wsT0FBT0EsT0FBTyx1QkFBdUIsMkRBQTJEO1FBQ2xHO1FBQ0FDLE1BQU07UUFDTkMsV0FBVUYsRUFBRTtZQUNWLE9BQU9BLE9BQU8sWUFBWUEsT0FBTyxnQkFBZ0IsdUJBQXVCO1FBQzFFO0lB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