crx-monkey-next 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/dist/client/src/client/api.d.ts +3 -0
  2. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/dist/client/src/client/api.js +4 -0
  3. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/dist/client/src/client/api.js.map +1 -0
  4. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/dist/client/src/client/i18n.d.ts +17 -0
  5. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/dist/client/src/client/i18n.js +38 -0
  6. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/dist/client/src/client/i18n.js.map +1 -0
  7. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/dist/client/src/client/main.d.ts +16 -0
  8. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/dist/client/src/client/main.js +8 -0
  9. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/dist/client/src/client/main.js.map +1 -0
  10. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/dist/client/src/client/message.d.ts +30 -0
  11. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/dist/client/src/client/message.js +75 -0
  12. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/dist/client/src/client/message.js.map +1 -0
  13. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/dist/client/src/client/runtime.d.ts +43 -0
  14. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/dist/client/src/client/runtime.js +89 -0
  15. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/dist/client/src/client/runtime.js.map +1 -0
  16. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/dist/client/src/node/plugins/tsBundler.d.ts +28 -0
  17. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/dist/client/src/node/plugins/tsBundler.js +151 -0
  18. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/dist/client/src/node/plugins/tsBundler.js.map +1 -0
  19. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/dist/client/src/node/typeDefs.d.ts +200 -0
  20. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/dist/client/src/node/typeDefs.js +2 -0
  21. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/dist/client/src/node/typeDefs.js.map +1 -0
  22. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/dist/client/tsconfig.client.tsbuildinfo +1 -0
  23. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/src/client/api.d.ts +3 -0
  24. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/src/client/api.js +4 -0
  25. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/src/client/api.js.map +1 -0
  26. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/src/client/i18n.d.ts +17 -0
  27. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/src/client/i18n.js +38 -0
  28. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/src/client/i18n.js.map +1 -0
  29. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/src/client/main.d.ts +17 -0
  30. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/src/client/main.js +9 -0
  31. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/src/client/main.js.map +1 -0
  32. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/src/client/message.d.ts +30 -0
  33. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/src/client/message.js +75 -0
  34. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/src/client/message.js.map +1 -0
  35. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/src/client/runtime.d.ts +32 -0
  36. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/src/client/runtime.js +58 -0
  37. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/src/client/runtime.js.map +1 -0
  38. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/src/node/typeDefs.d.ts +189 -0
  39. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/src/node/typeDefs.js +2 -0
  40. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/src/node/typeDefs.js.map +1 -0
  41. package/.rollup.cache/home/yakisova41/crx-monkey-next/packages/crx-monkey/tsconfig.client.tsbuildinfo +1 -0
  42. package/README.md +34 -0
  43. package/bin/crx-monkey +2 -0
  44. package/bun.lockb +0 -0
  45. package/dist/client/main.d.ts +187 -0
  46. package/dist/client/main.js +200 -0
  47. package/dist/client/tsconfig.client.tsbuildinfo +1 -0
  48. package/dist/node/exports.d.ts +213 -0
  49. package/dist/node/exports.js +650 -0
  50. package/dist/node/main.js +2759 -0
  51. package/jest.config.js +17 -0
  52. package/package.json +81 -0
  53. package/rollup.config.js +101 -0
  54. package/src/client/i18n.ts +42 -0
  55. package/src/client/main.ts +20 -0
  56. package/src/client/message.ts +118 -0
  57. package/src/client/runtime.ts +109 -0
  58. package/src/node/BundlerRegisterer.ts +311 -0
  59. package/src/node/ConfigLoader.ts +127 -0
  60. package/src/node/CrxmBundler.ts +213 -0
  61. package/src/node/Distributior.ts +295 -0
  62. package/src/node/Logger.ts +77 -0
  63. package/src/node/Watcher.ts +166 -0
  64. package/src/node/__tests__/config.test.ts +157 -0
  65. package/src/node/__tests__/manifest.test.ts +380 -0
  66. package/src/node/build.ts +64 -0
  67. package/src/node/dev.ts +146 -0
  68. package/src/node/development/CreateDevClient.ts +168 -0
  69. package/src/node/development/codes/extension.ts +187 -0
  70. package/src/node/development/codes/sw.ts +41 -0
  71. package/src/node/development/codes/userjs.ts +150 -0
  72. package/src/node/exports.ts +135 -0
  73. package/src/node/file.ts +45 -0
  74. package/src/node/inversify.config.ts +53 -0
  75. package/src/node/main.ts +34 -0
  76. package/src/node/manifest/ManifestFactory.ts +165 -0
  77. package/src/node/manifest/ManifestLoader.ts +71 -0
  78. package/src/node/manifest/ManifestParser.ts +191 -0
  79. package/src/node/manifest/i18n.ts +93 -0
  80. package/src/node/plugins/htmlBundler/HTMLTools.ts +332 -0
  81. package/src/node/plugins/htmlBundler/main.ts +140 -0
  82. package/src/node/plugins/sassBundler.ts +59 -0
  83. package/src/node/plugins/tsBundler.ts +197 -0
  84. package/src/node/server/FileServer.ts +97 -0
  85. package/src/node/server/SockServer.ts +143 -0
  86. package/src/node/typeDefs.ts +221 -0
  87. package/src/node/types.ts +24 -0
  88. package/src/node/userscript/CodeInjector.ts +164 -0
  89. package/src/node/userscript/UserscriptBundler.ts +138 -0
  90. package/src/node/userscript/UserscriptHeader.ts +76 -0
  91. package/src/node/userscript/UserscriptRegisterer.ts +204 -0
  92. package/src/node/utils.ts +25 -0
  93. package/tsconfig.client.json +20 -0
  94. package/tsconfig.json +24 -0
@@ -0,0 +1,2759 @@
1
+ import cac from 'cac';
2
+ import sourceMapSupport from 'source-map-support';
3
+ import { injectable, inject, Container } from 'inversify';
4
+ import path, { dirname, resolve, basename, isAbsolute } from 'path';
5
+ import fsExtra, { exists } from 'fs-extra';
6
+ import crypto$1 from 'crypto';
7
+ import fs, { promises, existsSync, watch } from 'fs';
8
+ import chalk from 'chalk';
9
+ import moment from 'moment';
10
+ import fsExtra$1, { outputFileSync } from 'fs-extra/esm';
11
+ import consola from 'consola';
12
+ import MurmurHash3 from 'murmurhash3js';
13
+ import prettier from 'prettier';
14
+ import { WebSocketServer } from 'ws';
15
+ import express from 'express';
16
+
17
+ var version = "0.0.1";
18
+ var packageJson = {
19
+ version: version};
20
+
21
+ /******************************************************************************
22
+ Copyright (c) Microsoft Corporation.
23
+
24
+ Permission to use, copy, modify, and/or distribute this software for any
25
+ purpose with or without fee is hereby granted.
26
+
27
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
28
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
29
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
30
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
31
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
32
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
33
+ PERFORMANCE OF THIS SOFTWARE.
34
+ ***************************************************************************** */
35
+ /* global Reflect, Promise, SuppressedError, Symbol, Iterator */
36
+
37
+
38
+ function __decorate(decorators, target, key, desc) {
39
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
40
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
41
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
42
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
43
+ }
44
+
45
+ function __param(paramIndex, decorator) {
46
+ return function (target, key) { decorator(target, key, paramIndex); }
47
+ }
48
+
49
+ function __metadata(metadataKey, metadataValue) {
50
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
51
+ }
52
+
53
+ typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
54
+ var e = new Error(message);
55
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
56
+ };
57
+
58
+ /**
59
+ * If user used windows, path scheme would be changed file:// and absolutable.
60
+ * @param filePath
61
+ * @returns
62
+ */
63
+ function resolveFilePath(filePath) {
64
+ if (process.env.OS === 'Windows_NT') {
65
+ if (path.isAbsolute(filePath)) {
66
+ const resolved = path.resolve(filePath);
67
+ return 'file://' + resolved;
68
+ }
69
+ else {
70
+ const resolved = path.resolve(__dirname, filePath);
71
+ return 'file://' + resolved;
72
+ }
73
+ }
74
+ else {
75
+ return filePath;
76
+ }
77
+ }
78
+ /**
79
+ * Import a JS dynamically without any cache.
80
+ * @param filePath
81
+ * @returns A module.
82
+ */
83
+ async function noCacheImport(filePath, base = './') {
84
+ if (!exists(filePath)) {
85
+ throw new Error(`The module '${filePath}' does not exist`);
86
+ }
87
+ const data = fsExtra.readFileSync(filePath, {});
88
+ const tmpFilePath = path.resolve(base, crypto$1.randomUUID());
89
+ await fsExtra.outputFile(tmpFilePath, data.toString());
90
+ try {
91
+ const module = (await import(tmpFilePath));
92
+ fsExtra.removeSync(tmpFilePath);
93
+ return module;
94
+ }
95
+ catch (e) {
96
+ fsExtra.removeSync(tmpFilePath);
97
+ throw e;
98
+ }
99
+ }
100
+
101
+ var ConfigLoader_1;
102
+ /**
103
+ * Load and store the config from project.
104
+ */
105
+ let ConfigLoader = class ConfigLoader {
106
+ static { ConfigLoader_1 = this; }
107
+ static configFileNamePatterns = ['crxm.config.js'];
108
+ loadedConfig = null;
109
+ configPath = null;
110
+ /**
111
+ * Load config from project
112
+ */
113
+ async loadConfig() {
114
+ const confPath = await this.searchConfig();
115
+ await this.loadConfigDetail(confPath);
116
+ }
117
+ /**
118
+ * Use config loaded.
119
+ */
120
+ useConfig() {
121
+ if (this.loadedConfig === null) {
122
+ throw new Error('The config has never been loaded, please loadConfig() before using.');
123
+ }
124
+ return this.loadedConfig;
125
+ }
126
+ /**
127
+ * Get loaded config path.
128
+ */
129
+ useConfigPath() {
130
+ if (this.configPath === null) {
131
+ throw new Error('The config has never been loaded, please loadConfig() before using config path.');
132
+ }
133
+ return this.configPath;
134
+ }
135
+ /**
136
+ * Get the path of config file deeply.
137
+ * @returns
138
+ */
139
+ async searchConfig() {
140
+ return await new Promise((resolve, reject) => {
141
+ let dir = process.cwd();
142
+ const searchThen = (result) => {
143
+ if (result !== null) {
144
+ resolve(dir + '/' + result);
145
+ }
146
+ else {
147
+ const splited = dir.split('/');
148
+ if (splited.length === 1) {
149
+ reject(new Error('The config file not found. Please create "crxm.config.js"'));
150
+ }
151
+ else {
152
+ splited.pop();
153
+ dir = splited.join('/');
154
+ void this.configSearchInDir(dir).then(searchThen);
155
+ }
156
+ }
157
+ };
158
+ void this.configSearchInDir(dir).then(searchThen);
159
+ });
160
+ }
161
+ /**
162
+ * Get the path of config file from directory.
163
+ * @returns
164
+ */
165
+ async configSearchInDir(dir) {
166
+ return await new Promise((resolve) => {
167
+ void promises.readdir(dir + '/').then((files) => {
168
+ files.forEach((fileName) => {
169
+ ConfigLoader_1.configFileNamePatterns.forEach((fileNamePattern) => {
170
+ if (fileName === fileNamePattern) {
171
+ resolve(fileName);
172
+ }
173
+ });
174
+ });
175
+ resolve(null);
176
+ });
177
+ });
178
+ }
179
+ /**
180
+ * Import config file then set to value.
181
+ * @param confPath
182
+ */
183
+ async loadConfigDetail(confPath) {
184
+ const configAbsolutePath = resolveFilePath(confPath);
185
+ const buildConfig = await noCacheImport(configAbsolutePath, dirname(configAbsolutePath));
186
+ if (buildConfig.default === undefined) {
187
+ throw new Error(`The config is not exported as default in "${configAbsolutePath}".`);
188
+ }
189
+ const exportedConfig = buildConfig.default;
190
+ if (exportedConfig === undefined) {
191
+ throw new Error(`The config is not exported as default in "${configAbsolutePath}".`);
192
+ }
193
+ this.loadedConfig = exportedConfig;
194
+ this.configPath = confPath;
195
+ }
196
+ };
197
+ ConfigLoader = ConfigLoader_1 = __decorate([
198
+ injectable()
199
+ ], ConfigLoader);
200
+
201
+ /**
202
+ * For inversify
203
+ */
204
+ const TYPES = {
205
+ ConfigLoader: Symbol.for('I_ConfigLoader'),
206
+ ManifestLoader: Symbol.for('I_ManifestLoader'),
207
+ ManifestParser: Symbol.for('I_ManifestParser'),
208
+ CrxmBundler: Symbol.for('I_CrxmBundler'),
209
+ Watcher: Symbol.for('I_Watcher'),
210
+ BundlerRegisterer: Symbol.for('I_BundlerRegisterer'),
211
+ Distributior: Symbol.for('I_Distributior'),
212
+ ManifestFactory: Symbol.for('I_ManifestFactory'),
213
+ UserscriptBundler: Symbol.for('I_UserscriptBundler'),
214
+ UserscriptHeaderFactory: Symbol.for('I_UserscriptHeaderFactory'),
215
+ UserscriptRegisterer: Symbol.for('I_UserscriptRegisterer'),
216
+ Logger: Symbol.for('I_Logger'),
217
+ SockServer: Symbol.for('I_SockServer'),
218
+ CreateDevClient: Symbol.for('I_CreateDevClient'),
219
+ FileServer: Symbol.for('I_FileServer'),
220
+ BuildID: Symbol.for('BuildID'),
221
+ CacheDir: Symbol.for('CacheDir'),
222
+ IsWatch: Symbol.for('IsWatch'),
223
+ };
224
+
225
+ /**
226
+ * Load and store the manifest from project.
227
+ */
228
+ let ManifestLoader = class ManifestLoader {
229
+ configLoader;
230
+ loadedManifest = null;
231
+ manifestPath;
232
+ constructor(configLoader) {
233
+ this.configLoader = configLoader;
234
+ // Get manifest file path.
235
+ const config = this.configLoader.useConfig();
236
+ const confPath = this.configLoader.useConfigPath();
237
+ const projectDir = dirname(confPath);
238
+ this.manifestPath = resolve(projectDir, config.manifest);
239
+ }
240
+ /**
241
+ * Load manifest from project.
242
+ * @param manifestPath
243
+ */
244
+ async loadManifest() {
245
+ // Get manfest path\
246
+ const resolvedManifestPath = resolveFilePath(this.manifestPath);
247
+ if (!existsSync(resolvedManifestPath)) {
248
+ throw new Error(`The manifest does not exist "${this.manifestPath}".`);
249
+ }
250
+ await noCacheImport(resolvedManifestPath).then((manifest) => {
251
+ const exportedManifest = manifest.default;
252
+ if (exportedManifest === undefined) {
253
+ throw new Error(`The manifest is not exported as default in "${this.manifestPath}".`);
254
+ }
255
+ if (exportedManifest === undefined) {
256
+ throw new Error(`The manifest is not exported as default in "${this.manifestPath}".`);
257
+ }
258
+ this.loadedManifest = exportedManifest;
259
+ });
260
+ }
261
+ /**
262
+ * Use manifest loaded.
263
+ * @returns
264
+ */
265
+ useManifest() {
266
+ if (this.loadedManifest === null) {
267
+ throw new Error('The manifest has never been loaded, please loadManifest() before using manifest.');
268
+ }
269
+ return this.loadedManifest;
270
+ }
271
+ };
272
+ ManifestLoader = __decorate([
273
+ injectable(),
274
+ __param(0, inject(TYPES.ConfigLoader)),
275
+ __metadata("design:paramtypes", [Object])
276
+ ], ManifestLoader);
277
+
278
+ let ManifestParser = class ManifestParser {
279
+ configLoader;
280
+ _parseResult = null;
281
+ constructor(configLoader) {
282
+ this.configLoader = configLoader;
283
+ }
284
+ get parseResult() {
285
+ if (this._parseResult === null) {
286
+ throw new Error('The manifest has never been parsed. Plaese parse your manifest before getting a result.');
287
+ }
288
+ return this._parseResult;
289
+ }
290
+ /**
291
+ * Get all resources written in manifest.
292
+ * @param manifest
293
+ * @returns
294
+ */
295
+ parse(manifest) {
296
+ this._parseResult = {
297
+ resources: this.getAllResources(manifest),
298
+ icons: this.getAllIcons(manifest),
299
+ };
300
+ return this._parseResult;
301
+ }
302
+ getAllIcons(manifest) {
303
+ const icons = manifest.icons;
304
+ if (icons === undefined) {
305
+ return null;
306
+ }
307
+ else {
308
+ const result = {};
309
+ Object.keys(icons).map((size) => {
310
+ const sizeN = size;
311
+ const filePathRelative = icons[sizeN];
312
+ const absolute = resolve(filePathRelative);
313
+ result[sizeN] = {
314
+ raw: filePathRelative,
315
+ path: absolute,
316
+ size: sizeN,
317
+ };
318
+ });
319
+ return result;
320
+ }
321
+ }
322
+ /**
323
+ * Get all typescript and css filenames which are written in 'manifest.js' in project.
324
+ * @param manifest
325
+ * @returns
326
+ */
327
+ getAllResources(manifest) {
328
+ const confPath = this.configLoader.useConfigPath();
329
+ const projectDir = dirname(confPath);
330
+ const sw = [];
331
+ const contentResources = [];
332
+ const cssResources = [];
333
+ const swRaw = [];
334
+ const contentResourcesRaw = [];
335
+ const cssResourcesRaw = [];
336
+ const popupHtml = [];
337
+ const popupHtmlRaw = [];
338
+ if (manifest?.background?.service_worker !== undefined) {
339
+ swRaw.push(manifest.background.service_worker);
340
+ sw.push(resolve(projectDir, manifest.background.service_worker));
341
+ }
342
+ if (manifest?.action?.default_popup !== undefined) {
343
+ popupHtmlRaw.push(manifest.action.default_popup);
344
+ popupHtml.push(resolve(projectDir, manifest.action.default_popup));
345
+ }
346
+ manifest.content_scripts.forEach(({ js, css }) => {
347
+ if (js !== undefined) {
348
+ js.map((p) => {
349
+ if (!contentResourcesRaw.includes(p)) {
350
+ contentResourcesRaw.push(p);
351
+ contentResources.push(resolve(projectDir, p));
352
+ }
353
+ });
354
+ }
355
+ if (css !== undefined) {
356
+ css.map((p) => {
357
+ if (!cssResourcesRaw.includes(p)) {
358
+ cssResourcesRaw.push(p);
359
+ cssResources.push(resolve(projectDir, p));
360
+ }
361
+ });
362
+ }
363
+ });
364
+ return {
365
+ scriptResources: {
366
+ sw: sw,
367
+ content: contentResources,
368
+ },
369
+ cssResources,
370
+ htmlResources: {
371
+ popup: popupHtml,
372
+ },
373
+ raw: {
374
+ scriptResources: {
375
+ sw: swRaw,
376
+ content: contentResourcesRaw,
377
+ },
378
+ cssResources: cssResourcesRaw,
379
+ htmlResources: {
380
+ popup: popupHtmlRaw,
381
+ },
382
+ },
383
+ };
384
+ }
385
+ };
386
+ ManifestParser = __decorate([
387
+ injectable(),
388
+ __param(0, inject(TYPES.ConfigLoader)),
389
+ __metadata("design:paramtypes", [Object])
390
+ ], ManifestParser);
391
+
392
+ let Logger = class Logger {
393
+ configLoader;
394
+ logLevel = 'info';
395
+ constructor(configLoader) {
396
+ this.configLoader = configLoader;
397
+ }
398
+ showInfo() {
399
+ const { server: { host, port, websocket }, output: { chrome }, manifest, } = this.configLoader.useConfig();
400
+ if (chrome === undefined) {
401
+ throw new Error('');
402
+ }
403
+ const chromePathAbsolute = resolve(dirname(manifest), chrome);
404
+ console.log(`\n ${chalk.cyanBright('CRX MONEKY')} v${packageJson.version}`);
405
+ console.log(`\n You can install development userscript:\n ${chalk.greenBright(`http://${host}:${port}/dev.user.js`)}`);
406
+ console.log(`\n You can install development chrome extension:\n ${chalk.greenBright(chromePathAbsolute)}`);
407
+ console.log(`\n Websocket running on:\n ${chalk.greenBright(`http://${host}:${websocket}`)}`);
408
+ console.log('');
409
+ }
410
+ initialize() {
411
+ console.clear();
412
+ }
413
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
414
+ dispatchLog(...detail) {
415
+ if (this.logLevel === 'debug' || this.logLevel === 'error' || this.logLevel === 'info') {
416
+ console.log(...[`[${this.getDateNowFormated()}] ${chalk.bgGreen(' LOG ')} `, ...detail]);
417
+ }
418
+ }
419
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
420
+ dispatchErr(...detail) {
421
+ if (this.logLevel === 'debug' || this.logLevel === 'error') {
422
+ console.log(...[`[${this.getDateNowFormated()}] ${chalk.bgRed(' ERROR ')}`, ...detail]);
423
+ }
424
+ }
425
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
426
+ dispatchDebug(...detail) {
427
+ if (this.logLevel === 'debug') {
428
+ console.log(...[`[${this.getDateNowFormated()}] ${chalk.bgCyan(' DEBUG ')}`, ...detail]);
429
+ }
430
+ }
431
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
432
+ dispatchConsole(...detail) {
433
+ if (this.logLevel === 'debug' || this.logLevel === 'error' || this.logLevel === 'info') {
434
+ console.log(...[`[${this.getDateNowFormated()}] ${chalk.bgYellow(' CONSOLE ')}`, ...detail]);
435
+ }
436
+ }
437
+ getDateNowFormated() {
438
+ const formattedDate = moment().format('YYYY/MM/DD HH:mm:ss');
439
+ return formattedDate;
440
+ }
441
+ };
442
+ Logger = __decorate([
443
+ injectable(),
444
+ __param(0, inject(TYPES.ConfigLoader)),
445
+ __metadata("design:paramtypes", [ConfigLoader])
446
+ ], Logger);
447
+
448
+ /**
449
+ * Manage all bundler
450
+ */
451
+ let CrxmBundler = class CrxmBundler {
452
+ configLoader;
453
+ logger;
454
+ targets = {};
455
+ _compileResults = {};
456
+ watchers = [];
457
+ updateHandlers = [];
458
+ constructor(configLoader, logger) {
459
+ this.configLoader = configLoader;
460
+ this.logger = logger;
461
+ }
462
+ get compileResults() {
463
+ return this._compileResults;
464
+ }
465
+ addTarget(entryPoint, usingPlugin, flag = '') {
466
+ const hash = crypto.randomUUID();
467
+ this.targets[hash] = { entryPoint, usingPlugin, hash, flag };
468
+ return hash;
469
+ }
470
+ removeTarget(targetEntryPoint, flag = null) {
471
+ const hash = this.getInternalHashFromPath(targetEntryPoint, flag);
472
+ delete this.targets[hash];
473
+ }
474
+ getInternalHashFromPath(filePath, targetFlag = null) {
475
+ let hash;
476
+ if (targetFlag !== null) {
477
+ // flag filter
478
+ hash = Object.keys(this.targets).filter((hash) => {
479
+ const { entryPoint, flag } = this.targets[hash];
480
+ return entryPoint === filePath && flag === targetFlag;
481
+ })[0];
482
+ }
483
+ else {
484
+ hash = Object.keys(this.targets).filter((hash) => {
485
+ const { entryPoint } = this.targets[hash];
486
+ return entryPoint === filePath;
487
+ })[0];
488
+ }
489
+ return hash;
490
+ }
491
+ getBuildResultFromPath(filePath) {
492
+ const hash = this.getInternalHashFromPath(filePath);
493
+ return this._compileResults[hash];
494
+ }
495
+ async build() {
496
+ await this.compileAll();
497
+ }
498
+ /**
499
+ * Watching scripts
500
+ */
501
+ async watch() {
502
+ if (this.watchers?.length !== 0) {
503
+ throw new Error('Script watching must be started after stopping before watching');
504
+ }
505
+ await this.watchAll();
506
+ }
507
+ /**
508
+ * Stop watching scripts
509
+ */
510
+ async stopWatch() {
511
+ await Promise.all(this.watchers.map(async (watcher) => {
512
+ await watcher.stop();
513
+ }));
514
+ this.watchers = [];
515
+ }
516
+ /**
517
+ * Register the handler be runned when scripts updated.
518
+ * @param handler
519
+ */
520
+ addListener(handler) {
521
+ this.updateHandlers.push(handler);
522
+ }
523
+ /**
524
+ * Remove the handler be runned when scripts updated.
525
+ * @param handler
526
+ */
527
+ removeListener(handler) {
528
+ const newHandlers = this.updateHandlers.filter((h) => h !== handler);
529
+ this.updateHandlers = newHandlers;
530
+ }
531
+ /**
532
+ * Start watching for all sources by using plugins.
533
+ */
534
+ async watchAll() {
535
+ const watchers = [];
536
+ const absolutePaths = await this.getTargetAbsolutePaths();
537
+ await Promise.all(Object.keys(absolutePaths).map(async (hash) => {
538
+ const absolutePath = resolveFilePath(absolutePaths[hash]);
539
+ const { usingPlugin } = this.targets[hash];
540
+ if (await fsExtra.exists(absolutePath)) {
541
+ const { plugin, name } = usingPlugin.watch;
542
+ const resultSender = (result) => {
543
+ this.logger.dispatchDebug(`✨ [${name}] Builded ${chalk.gray('"' + absolutePath + '"')}`);
544
+ // Register result.
545
+ this._compileResults[hash] = result;
546
+ // Dispatch update
547
+ this.updateHandlers.forEach((h) => {
548
+ h(this.targets[hash]);
549
+ });
550
+ };
551
+ this.watchers.push(await plugin(absolutePath, resultSender, this));
552
+ }
553
+ else {
554
+ throw new Error(`Entrypoint '${absolutePath} does not exist.'`);
555
+ }
556
+ }));
557
+ this.watchers = watchers;
558
+ }
559
+ async compileForce(hash) {
560
+ const target = this.targets[hash];
561
+ const absolutePaths = await this.getTargetAbsolutePaths();
562
+ const absolutePath = resolveFilePath(absolutePaths[hash]);
563
+ this._compileResults[hash] = await target.usingPlugin.build.plugin(absolutePath, this);
564
+ return target;
565
+ }
566
+ /**
567
+ * Compile all sources by using plugins.
568
+ */
569
+ async compileAll() {
570
+ const compileResults = {};
571
+ const absolutePaths = await this.getTargetAbsolutePaths();
572
+ await Promise.all(Object.keys(absolutePaths).map(async (hash) => {
573
+ const absolutePath = resolveFilePath(absolutePaths[hash]);
574
+ const { usingPlugin } = this.targets[hash];
575
+ if (await fsExtra.exists(absolutePath)) {
576
+ compileResults[hash] = await usingPlugin.build.plugin(absolutePath, this);
577
+ this.logger.dispatchDebug(`✨ [${usingPlugin.build.name}] Build successful!`);
578
+ }
579
+ else {
580
+ throw new Error(`Entrypoint '${absolutePath} does not exist.'`);
581
+ }
582
+ }));
583
+ this._compileResults = compileResults;
584
+ return;
585
+ }
586
+ /**
587
+ * Get the file's which in the project absolute path.
588
+ * @returns
589
+ */
590
+ async getTargetAbsolutePaths() {
591
+ const path = this.configLoader.useConfigPath();
592
+ const projectDir = dirname(path);
593
+ const paths = {};
594
+ Object.keys(this.targets).map((hash) => {
595
+ const { entryPoint } = this.targets[hash];
596
+ paths[hash] = resolve(projectDir, entryPoint);
597
+ });
598
+ return paths;
599
+ }
600
+ };
601
+ CrxmBundler = __decorate([
602
+ injectable(),
603
+ __param(0, inject(TYPES.ConfigLoader)),
604
+ __param(1, inject(TYPES.Logger)),
605
+ __metadata("design:paramtypes", [ConfigLoader,
606
+ Logger])
607
+ ], CrxmBundler);
608
+
609
+ /**
610
+ * Watch config and manifest
611
+ */
612
+ let Watcher = class Watcher {
613
+ configLoader;
614
+ manifestLoader;
615
+ logger;
616
+ configPath;
617
+ configWatcher = null;
618
+ manifestWatcher = null;
619
+ updateHandlers = [];
620
+ constructor(configLoader, manifestLoader, logger) {
621
+ this.configLoader = configLoader;
622
+ this.manifestLoader = manifestLoader;
623
+ this.logger = logger;
624
+ this.configPath = this.configLoader.useConfigPath();
625
+ }
626
+ /**
627
+ * Start watching config and manifest
628
+ */
629
+ async start() {
630
+ // Start config watching
631
+ if (this.configWatcher !== null) {
632
+ throw new Error('The config watching is running now, stop it before using start.');
633
+ }
634
+ this.configWatcher = watch(this.configPath);
635
+ const stack = [];
636
+ this.configWatcher.addListener('change', async () => {
637
+ stack.push(async () => {
638
+ this.logger.dispatchLog(`🚩 Config updated ${chalk.gray('"' + this.configPath + '"')}`);
639
+ await this.onUpdateConfig();
640
+ });
641
+ });
642
+ setInterval(async () => {
643
+ if (stack[0] !== undefined) {
644
+ await stack[0]();
645
+ stack.splice(0, 1);
646
+ }
647
+ }, 1000);
648
+ this.startManifestWatch(this.getManifestPath());
649
+ }
650
+ /**
651
+ * Stop watching
652
+ */
653
+ async stop() {
654
+ this.stopManifestWatch();
655
+ if (this.configWatcher !== null) {
656
+ this.configWatcher.close();
657
+ this.configWatcher = null;
658
+ }
659
+ }
660
+ addListener(handler) {
661
+ this.updateHandlers.push(handler);
662
+ }
663
+ removeListener(handler) {
664
+ const newHandlers = this.updateHandlers.filter((h) => h !== handler);
665
+ this.updateHandlers = newHandlers;
666
+ }
667
+ /**
668
+ * Watching manifest file in project
669
+ * @param manifestPath
670
+ */
671
+ startManifestWatch(manifestPath) {
672
+ if (this.manifestWatcher !== null) {
673
+ throw new Error('The manifest watching is running now, stop it before using start.');
674
+ }
675
+ this.manifestWatcher = watch(manifestPath, {});
676
+ const stack = [];
677
+ this.manifestWatcher.addListener('change', async () => {
678
+ stack.push(async () => {
679
+ this.logger.dispatchLog(`🚩 Manifest updated ${chalk.gray('"' + manifestPath + '"')}`);
680
+ await this.onUpdateManifest();
681
+ });
682
+ });
683
+ setInterval(async () => {
684
+ if (stack[0] !== undefined) {
685
+ await stack[0]();
686
+ stack.splice(0, 1);
687
+ }
688
+ }, 1000);
689
+ }
690
+ /**
691
+ * Stop watching manifest file in project
692
+ * @param manifestPath
693
+ */
694
+ stopManifestWatch() {
695
+ if (this.manifestWatcher !== null) {
696
+ this.manifestWatcher.close();
697
+ this.manifestWatcher = null;
698
+ }
699
+ }
700
+ /**
701
+ * Run on updated config file.
702
+ */
703
+ async onUpdateConfig() {
704
+ await this.configLoader.loadConfig();
705
+ const manifestPath = this.getManifestPath();
706
+ await this.manifestLoader.loadManifest();
707
+ this.stopManifestWatch();
708
+ await Promise.all(this.updateHandlers.map(async (h) => {
709
+ await h('config');
710
+ }));
711
+ this.startManifestWatch(manifestPath);
712
+ }
713
+ /**
714
+ * Run on updated manifest file.
715
+ */
716
+ async onUpdateManifest() {
717
+ await this.manifestLoader.loadManifest();
718
+ await Promise.all(this.updateHandlers.map(async (h) => {
719
+ await h('manifest');
720
+ }));
721
+ }
722
+ /**
723
+ * Get manifest's filepath from config.
724
+ * @returns
725
+ */
726
+ getManifestPath() {
727
+ const confPath = this.configLoader.useConfigPath();
728
+ const projectDir = dirname(confPath);
729
+ const manifestPath = resolve(projectDir, this.configLoader.useConfig().manifest);
730
+ return manifestPath;
731
+ }
732
+ };
733
+ Watcher = __decorate([
734
+ injectable(),
735
+ __param(0, inject(TYPES.ConfigLoader)),
736
+ __param(1, inject(TYPES.ManifestLoader)),
737
+ __param(2, inject(TYPES.Logger)),
738
+ __metadata("design:paramtypes", [ConfigLoader,
739
+ ManifestLoader,
740
+ Logger])
741
+ ], Watcher);
742
+
743
+ /**
744
+ * Get all messages each language in a locale dir in the project.
745
+ * @param key
746
+ * @returns All messages each language.
747
+ */
748
+ async function geti18nMessages(key) {
749
+ const result = { en: key };
750
+ const match = key.match(/__MSG_(.*)__/);
751
+ if (match !== null) {
752
+ const i18nKey = match[1];
753
+ const localesPath = getlocalesPath();
754
+ if (fsExtra$1.pathExistsSync(localesPath)) {
755
+ const langKeys = getEnableLangs(localesPath);
756
+ await Promise.all(langKeys.map(async (langKey) => {
757
+ const msg = await getMessage(langKey, i18nKey);
758
+ if (msg !== null) {
759
+ result[langKey] = msg;
760
+ }
761
+ }));
762
+ }
763
+ }
764
+ return result;
765
+ }
766
+ /**
767
+ * Get a message in a locale dir in the project.
768
+ * @param key
769
+ * @returns A message
770
+ */
771
+ async function getMessage(langKey, key) {
772
+ const localesPath = getlocalesPath();
773
+ const messagesJsonPath = path.resolve(localesPath, langKey, 'messages.json');
774
+ const messagesJson = await fsExtra$1.readJSON(messagesJsonPath);
775
+ const message = messagesJson[key].message;
776
+ if (message !== undefined) {
777
+ return message;
778
+ }
779
+ else {
780
+ return null;
781
+ }
782
+ }
783
+ /**
784
+ * Get exist languages in a locale dir in the project.
785
+ * @param localesPath
786
+ * @returns Exist languages in a locale dir in the project.
787
+ */
788
+ function getEnableLangs(localesPath) {
789
+ const langs = fs.readdirSync(localesPath);
790
+ if (!langs.includes('en')) {
791
+ throw consola.error(new Error('There is no en directory in the _locales directory.'));
792
+ }
793
+ return langs;
794
+ }
795
+ function getlocalesPath() {
796
+ const config = container.get(TYPES.ConfigLoader).useConfig();
797
+ const dir = path.dirname(config.manifest);
798
+ return path.resolve(dir, '_locales');
799
+ }
800
+ /**
801
+ * Copy a locales dir in the src to dist in the project.
802
+ */
803
+ async function copyLocales() {
804
+ const localesPath = getlocalesPath();
805
+ const config = container.get(TYPES.ConfigLoader).useConfig();
806
+ if ((await fsExtra$1.pathExists(localesPath)) && config.output.chrome !== undefined) {
807
+ await fsExtra$1.copy(localesPath, path.join(config.output.chrome, '_locales'));
808
+ }
809
+ }
810
+
811
+ /**
812
+ * Create post-build manifest from original manifest
813
+ */
814
+ let ManifestFactory = class ManifestFactory {
815
+ manifestLoader;
816
+ rawManifest;
817
+ workspace;
818
+ definedCustomKeysByCrxMonkeyInContentScrpt = [
819
+ 'use_isolated_connection',
820
+ 'userscript_direct_inject',
821
+ 'trusted_inject',
822
+ ];
823
+ constructor(manifestLoader) {
824
+ this.manifestLoader = manifestLoader;
825
+ this.rawManifest = this.manifestLoader.useManifest();
826
+ this.workspace = structuredClone(this.rawManifest);
827
+ }
828
+ /**
829
+ * Reload manifest from loader.
830
+ */
831
+ initialize() {
832
+ this.rawManifest = this.manifestLoader.useManifest();
833
+ this.workspace = structuredClone(this.rawManifest);
834
+ }
835
+ /**
836
+ * Extension Name -> [Dev] Extension Name
837
+ */
838
+ enableDevMode() {
839
+ const i18nNameMatch = this.workspace.name.match(/__MSG_(.*)__/);
840
+ if (i18nNameMatch !== null) {
841
+ getMessage('en', i18nNameMatch[1]).then((msg) => {
842
+ if (msg !== null) {
843
+ this.workspace.name = '[Dev] ' + msg;
844
+ }
845
+ });
846
+ }
847
+ else {
848
+ this.workspace.name = '[Dev] ' + this.workspace.name;
849
+ }
850
+ }
851
+ /**
852
+ * Output the current manifest data.
853
+ * @returns
854
+ */
855
+ getWorkspace() {
856
+ return this.absorbCustomKeys(this.workspace);
857
+ }
858
+ /**
859
+ * Get manifest data absorbed defined custom keys by crx-monkey.
860
+ * @returns
861
+ */
862
+ getResult() {
863
+ return this.absorbCustomKeys(this.workspace);
864
+ }
865
+ resolve(sourcePath, targetPath) {
866
+ // sw
867
+ if (this.workspace.background !== undefined &&
868
+ this.workspace.background.service_worker === sourcePath) {
869
+ this.workspace.background = {
870
+ ...this.workspace.background,
871
+ service_worker: targetPath,
872
+ };
873
+ }
874
+ // popup
875
+ if (this.workspace.action !== undefined && this.workspace.action.default_popup === sourcePath) {
876
+ this.workspace.action = {
877
+ ...this.workspace.action,
878
+ default_popup: targetPath,
879
+ };
880
+ }
881
+ if (this.workspace.content_scripts !== undefined) {
882
+ // content js
883
+ this.workspace.content_scripts.forEach((script) => {
884
+ if (script.js !== undefined) {
885
+ script.js = script.js.map((js) => {
886
+ if (js === sourcePath) {
887
+ return targetPath;
888
+ }
889
+ else {
890
+ return js;
891
+ }
892
+ });
893
+ }
894
+ // content css
895
+ if (script.css !== undefined) {
896
+ script.css = script.css.map((css) => {
897
+ if (css === sourcePath) {
898
+ return targetPath;
899
+ }
900
+ else {
901
+ return css;
902
+ }
903
+ });
904
+ }
905
+ });
906
+ }
907
+ // Icons
908
+ const icons = structuredClone(this.workspace.icons);
909
+ if (icons !== undefined) {
910
+ const newIcons = {
911
+ ...icons,
912
+ };
913
+ Object.keys(icons).forEach((size) => {
914
+ const sizeN = size;
915
+ const icon = icons[sizeN];
916
+ if (icon === sourcePath) {
917
+ newIcons[sizeN] = targetPath;
918
+ }
919
+ });
920
+ this.workspace.icons = newIcons;
921
+ }
922
+ }
923
+ addContentScript(js, css, matches, world = 'ISOLATED', run_at = undefined) {
924
+ if (this.workspace.content_scripts !== undefined) {
925
+ this.workspace.content_scripts.push({
926
+ matches,
927
+ js,
928
+ css,
929
+ world,
930
+ run_at,
931
+ });
932
+ }
933
+ }
934
+ absorbCustomKeys(original) {
935
+ const result = structuredClone(original);
936
+ if (original.content_scripts !== undefined && result.content_scripts !== undefined) {
937
+ original.content_scripts.forEach((content_script, index) => {
938
+ Object.keys(content_script).forEach((key) => {
939
+ if (this.definedCustomKeysByCrxMonkeyInContentScrpt.includes(key)) {
940
+ if (result.content_scripts !== undefined) {
941
+ delete result.content_scripts[index][key];
942
+ }
943
+ }
944
+ });
945
+ });
946
+ }
947
+ return result;
948
+ }
949
+ };
950
+ ManifestFactory = __decorate([
951
+ injectable(),
952
+ __param(0, inject(TYPES.ManifestLoader)),
953
+ __metadata("design:paramtypes", [ManifestLoader])
954
+ ], ManifestFactory);
955
+
956
+ /**
957
+ * Generate a string of code to properly execute a functionalized script at each timing
958
+ */
959
+ class CodeInjector {
960
+ // Record<MatchPattern, Content>
961
+ contents = [];
962
+ /**
963
+ * Register function names for functionized scripts
964
+ * @param funcName
965
+ * @param matches
966
+ * @param run_at
967
+ */
968
+ addContent(contentScript) {
969
+ const { run_at, matches, js, css, trusted_inject, userscript_direct_inject } = contentScript;
970
+ if (matches !== undefined) {
971
+ const funcNames = [];
972
+ if (js !== undefined) {
973
+ funcNames.push(...js.map((filePath) => convertFilePathToFuncName(filePath)));
974
+ }
975
+ if (css !== undefined) {
976
+ funcNames.push(...css.map((filePath) => convertFilePathToFuncName(filePath)));
977
+ }
978
+ this.contents.push({
979
+ funcNames,
980
+ matches,
981
+ useDirectInject: userscript_direct_inject !== undefined ? userscript_direct_inject : false,
982
+ useTrustedScript: trusted_inject !== undefined ? trusted_inject : true,
983
+ run_at: run_at === undefined ? 'document_idle' : run_at,
984
+ });
985
+ }
986
+ }
987
+ /**
988
+ * Get code
989
+ * @returns
990
+ */
991
+ getCode() {
992
+ let code = '';
993
+ this.contents.forEach(({ matches, useTrustedScript, funcNames, run_at, useDirectInject }) => {
994
+ const varHash = crypto.randomUUID().replaceAll('-', '_');
995
+ const createScriptElementVarName = () => {
996
+ return 'crxm_script_' + varHash + crypto.randomUUID().replaceAll('-', '_');
997
+ };
998
+ // match if
999
+ code +=
1000
+ '\n\nif(' +
1001
+ matches
1002
+ .map((match) => {
1003
+ if (match === '<all_urls>') {
1004
+ return 'true';
1005
+ }
1006
+ return `location.href.match('^${match}') !== null`;
1007
+ })
1008
+ .join(',') +
1009
+ '){';
1010
+ let codeInner = '';
1011
+ if (useDirectInject) {
1012
+ // Define idle scripts element
1013
+ const scriptElementVarName = createScriptElementVarName();
1014
+ codeInner += `\nconst ${scriptElementVarName} = document.createElement("script");`;
1015
+ if (useTrustedScript) {
1016
+ // Is this browser supported trustedTypes?
1017
+ codeInner += '\nif(unsafeWindow.trustedTypes !== undefined){';
1018
+ // If supported, it would be create policy.
1019
+ codeInner += `\nconst policy_${varHash} = unsafeWindow.trustedTypes.createPolicy("crxm-trusted-inject-policy", {createScript: (input) => input,});`;
1020
+ funcNames.forEach((funcName) => {
1021
+ codeInner += `\n${scriptElementVarName}.text = policy_${varHash}.createScript(${scriptElementVarName}.text + \`(\${${funcName}.toString()})();\`);\n`;
1022
+ });
1023
+ // end trustedTypes if
1024
+ codeInner += '} else {';
1025
+ // For environments that do not support trustedTypes
1026
+ funcNames.forEach((funcName) => {
1027
+ codeInner += `\n${scriptElementVarName}.innerHTML = ${scriptElementVarName}.innerHTML + \`(\${${funcName}.toString()})();\``;
1028
+ });
1029
+ // end trusted else
1030
+ codeInner += '}';
1031
+ }
1032
+ else {
1033
+ // Dont use trustedTypes
1034
+ funcNames.forEach((funcName) => {
1035
+ codeInner += `\n${scriptElementVarName}.innerHTML = ${scriptElementVarName}.innerHTML + \`(\${${funcName}.toString()})();\``;
1036
+ });
1037
+ }
1038
+ codeInner += `\nunsafeWindow.document.body.appendChild(${scriptElementVarName});\n`;
1039
+ }
1040
+ else {
1041
+ funcNames.forEach((funcName) => {
1042
+ codeInner += `\n${funcName}();`;
1043
+ });
1044
+ }
1045
+ if (run_at === 'document_start') {
1046
+ code += codeInner;
1047
+ }
1048
+ else {
1049
+ code += this.getCodeWrappedInjectTiming(codeInner, run_at);
1050
+ }
1051
+ // end match if
1052
+ code += '}';
1053
+ });
1054
+ return code;
1055
+ /*if (CodeInjector.useDomInject) {
1056
+ return this.getCodeDomInject(CodeInjector.useTrustedScript);
1057
+ } else {
1058
+ return this.getCodeDirectRun();
1059
+ }*/
1060
+ }
1061
+ /**
1062
+ * Wrap code with appropriate syntax depending on run-at
1063
+ * @param code
1064
+ * @param runAt
1065
+ * @returns
1066
+ */
1067
+ getCodeWrappedInjectTiming(code, runAt) {
1068
+ if (runAt === 'document_idle') {
1069
+ return ('["DOMContentLoaded", "crxm_DOMContentLoaded"].forEach((eventType) => {' +
1070
+ 'document.addEventListener(eventType, () => {setTimeout(() => {' +
1071
+ code +
1072
+ '\n}, 1)})});\n');
1073
+ }
1074
+ else if (runAt === 'document_end') {
1075
+ return ('["DOMContentLoaded", "crxm_DOMContentLoaded"].forEach((eventType) => {' +
1076
+ 'document.addEventListener(eventType, () => {' +
1077
+ code +
1078
+ '\n})});\n');
1079
+ }
1080
+ else {
1081
+ return code;
1082
+ }
1083
+ }
1084
+ }
1085
+
1086
+ let UserscriptHeaderFactory = class UserscriptHeaderFactory {
1087
+ detail = [];
1088
+ constructor(selfInstance = null) {
1089
+ if (selfInstance !== null) {
1090
+ this.initialize();
1091
+ this.detail = structuredClone(selfInstance.detail);
1092
+ }
1093
+ }
1094
+ initialize() {
1095
+ this.detail = [];
1096
+ }
1097
+ /**
1098
+ * Push header item.
1099
+ * @param key
1100
+ * @param value
1101
+ */
1102
+ push(key, value) {
1103
+ // The name should be at the beginning of the metadata.
1104
+ if (key !== undefined && key.toString().match(/^@name/)) {
1105
+ this.detail.unshift([key, value]);
1106
+ }
1107
+ else {
1108
+ this.detail.push([key, value]);
1109
+ }
1110
+ }
1111
+ /**
1112
+ * Output created header.
1113
+ * @returns Userscript header string.
1114
+ */
1115
+ toString() {
1116
+ const header = [];
1117
+ header.push('// ==UserScript==');
1118
+ this.detail.forEach(([key, value]) => {
1119
+ header.push(`// ${key} ${value}`);
1120
+ });
1121
+ header.push('// ==/UserScript==');
1122
+ return header.join('\n');
1123
+ }
1124
+ /**
1125
+ * Replace header item.
1126
+ * @param key
1127
+ * @param value
1128
+ */
1129
+ replace(key, value) {
1130
+ this.detail.forEach(([detailKey], index) => {
1131
+ if (key === detailKey) {
1132
+ this.detail[index] = [key, value];
1133
+ }
1134
+ });
1135
+ }
1136
+ /**
1137
+ * Is exist the key in created header??
1138
+ * @param key
1139
+ * @returns
1140
+ */
1141
+ exist(key) {
1142
+ this.detail.forEach(([detailKey]) => {
1143
+ if (key === detailKey) {
1144
+ return true;
1145
+ }
1146
+ });
1147
+ return false;
1148
+ }
1149
+ };
1150
+ UserscriptHeaderFactory = __decorate([
1151
+ injectable(),
1152
+ __metadata("design:paramtypes", [Object])
1153
+ ], UserscriptHeaderFactory);
1154
+
1155
+ /**
1156
+ * Properly bundle each build result as a single user script
1157
+ */
1158
+ let UserscriptBundler = class UserscriptBundler {
1159
+ manifestFactory;
1160
+ headerFactory;
1161
+ configLoader;
1162
+ codeWorkspace = '';
1163
+ codeBlocks = {};
1164
+ constructor(manifestFactory, headerFactory, configLoader) {
1165
+ this.manifestFactory = manifestFactory;
1166
+ this.headerFactory = headerFactory;
1167
+ this.configLoader = configLoader;
1168
+ }
1169
+ initialize() {
1170
+ this.codeBlocks = {};
1171
+ this.codeWorkspace = '';
1172
+ }
1173
+ /**
1174
+ * Add build result.
1175
+ * @param jsFilePath
1176
+ * @param codeBinaly
1177
+ */
1178
+ addBuildResult(jsFilePath, codeBinaly) {
1179
+ const codeBlock = new UserJsCodeBlock(jsFilePath, codeBinaly);
1180
+ this.codeBlocks[jsFilePath] = codeBlock;
1181
+ }
1182
+ addStyle(cssFilePath, code) {
1183
+ const codeBlock = new UserJsStyleBlock(cssFilePath, code);
1184
+ this.codeBlocks[cssFilePath] = codeBlock;
1185
+ }
1186
+ createCode() {
1187
+ this.codeWorkspace = '';
1188
+ /**
1189
+ * Insert Header
1190
+ */
1191
+ this.codeWorkspace += this.headerFactory.toString() + '\n';
1192
+ /**
1193
+ * Insert functioned build results.
1194
+ */
1195
+ Object.keys(this.codeBlocks).forEach((filePath) => {
1196
+ const codeBlock = this.codeBlocks[filePath];
1197
+ const functionalized = codeBlock.getFunctionalized();
1198
+ this.codeWorkspace += functionalized;
1199
+ });
1200
+ /**
1201
+ * Insert inject method.
1202
+ */
1203
+ const codeInjector = new CodeInjector();
1204
+ const contentScripts = this.manifestFactory.rawManifest.content_scripts;
1205
+ if (contentScripts !== undefined) {
1206
+ contentScripts.forEach((contentScript) => {
1207
+ codeInjector.addContent(contentScript);
1208
+ });
1209
+ }
1210
+ this.codeWorkspace += codeInjector.getCode();
1211
+ return this.codeWorkspace;
1212
+ }
1213
+ };
1214
+ UserscriptBundler = __decorate([
1215
+ injectable(),
1216
+ __param(0, inject(TYPES.ManifestFactory)),
1217
+ __param(1, inject(TYPES.UserscriptHeaderFactory)),
1218
+ __param(2, inject(TYPES.ConfigLoader)),
1219
+ __metadata("design:paramtypes", [ManifestFactory,
1220
+ UserscriptHeaderFactory,
1221
+ ConfigLoader])
1222
+ ], UserscriptBundler);
1223
+ class UserJsCodeBlock {
1224
+ filePath;
1225
+ content;
1226
+ constructor(filePath, content) {
1227
+ this.filePath = filePath;
1228
+ this.content = content;
1229
+ }
1230
+ getFunctionalized() {
1231
+ let result = '';
1232
+ const text = new TextDecoder().decode(this.content);
1233
+ result += `\n// ${this.filePath}\n function ${convertFilePathToFuncName(this.filePath)}() {\n${text}}\n`;
1234
+ return result;
1235
+ }
1236
+ getFunctionalizedFuncName() {
1237
+ return convertFilePathToFuncName(this.filePath);
1238
+ }
1239
+ }
1240
+ class UserJsStyleBlock {
1241
+ filePath;
1242
+ content;
1243
+ constructor(filePath, content) {
1244
+ this.filePath = filePath;
1245
+ this.content = content;
1246
+ }
1247
+ getFunctionalized() {
1248
+ let result = '';
1249
+ const text = new TextDecoder().decode(this.content);
1250
+ result += `\n// ${this.filePath}\n function ${convertFilePathToFuncName(this.filePath)}() {
1251
+ const e = document.createElement("style");
1252
+ e.innerHTML = \`${text}\`;
1253
+ document.head.appendChild(e)
1254
+ console.log(e)}\n`;
1255
+ return result;
1256
+ }
1257
+ getFunctionalizedFuncName() {
1258
+ return convertFilePathToFuncName(this.filePath);
1259
+ }
1260
+ }
1261
+ /**
1262
+ * File path convert to base64 and it included "=" convert to "$".
1263
+ * @param filePath
1264
+ * @returns
1265
+ */
1266
+ function convertFilePathToFuncName(filePath) {
1267
+ return btoa(filePath).replaceAll('=', '$');
1268
+ }
1269
+
1270
+ /**
1271
+ * A content to be convined with service_worker of development script generated by crx-monkey.
1272
+ * @param host SockServer host
1273
+ * @param sockPort SockServer port
1274
+ */
1275
+ function developSw(host, sockPort) {
1276
+ function startWebsocket25secLife() {
1277
+ const websocket = new WebSocket(`ws://${host}:${sockPort}`);
1278
+ websocket.addEventListener('message', ({ data }) => {
1279
+ const response = JSON.parse(data);
1280
+ if (response.type === 'reload') {
1281
+ switch (response.content) {
1282
+ case 'RELOAD_CONTENT_SCRIPT':
1283
+ case 'RELOAD_SW':
1284
+ case 'RELOAD_CSS':
1285
+ case 'RELOAD_POPUP_JS':
1286
+ case 'RELOAD_POPUP_HTML':
1287
+ case 'ALL':
1288
+ chrome.runtime.reload();
1289
+ break;
1290
+ }
1291
+ }
1292
+ });
1293
+ setTimeout(() => {
1294
+ websocket.close();
1295
+ }, 25 * 1000);
1296
+ }
1297
+ // Keep a service_worker life.
1298
+ startWebsocket25secLife();
1299
+ setInterval(() => {
1300
+ startWebsocket25secLife();
1301
+ }, 25 * 1000);
1302
+ }
1303
+
1304
+ function userjs(host, port, websocketPort, bindGM, disableSock, buildId) {
1305
+ unsafeWindow.__CRX_CONTENT_BUILD_ID = buildId;
1306
+ if (!disableSock) {
1307
+ const websocket = new WebSocket(`ws://${host}:${websocketPort}`);
1308
+ websocket.addEventListener('message', ({ data }) => {
1309
+ const { type, content } = JSON.parse(data);
1310
+ if (type === 'reload') {
1311
+ switch (content) {
1312
+ case 'RELOAD_CSS':
1313
+ case 'RELOAD_CONTENT_SCRIPT':
1314
+ console.log('[crxm] reloading...');
1315
+ location.reload();
1316
+ break;
1317
+ }
1318
+ }
1319
+ });
1320
+ websocket.addEventListener('open', () => {
1321
+ console.log('[crxm] A reload server connected..');
1322
+ window.addEventListener('message', (e) => {
1323
+ const { data } = e;
1324
+ /**
1325
+ * Client can listen a result by using of this.
1326
+ */
1327
+ const handlers = {
1328
+ 'console-log': () => {
1329
+ const preload = {
1330
+ type: 'console',
1331
+ content: {
1332
+ type: 'log',
1333
+ contents: data.detail,
1334
+ },
1335
+ };
1336
+ websocket.send(JSON.stringify(preload));
1337
+ },
1338
+ 'console-error': () => {
1339
+ const preload = {
1340
+ type: 'console',
1341
+ content: {
1342
+ type: 'error',
1343
+ contents: data.detail,
1344
+ },
1345
+ };
1346
+ websocket.send(JSON.stringify(preload));
1347
+ },
1348
+ 'console-warn': () => {
1349
+ const preload = {
1350
+ type: 'console',
1351
+ content: {
1352
+ type: 'warn',
1353
+ contents: data.detail,
1354
+ },
1355
+ };
1356
+ websocket.send(JSON.stringify(preload));
1357
+ },
1358
+ };
1359
+ /**
1360
+ * # BuildId Check
1361
+ * If a build id of recieved message isn't equiavalent with a buildId of isolatedConnector,
1362
+ * wouldn't be runned the handler so It can prevent being runned from other scripts.
1363
+ */
1364
+ if (data.crxContentBuildId === buildId) {
1365
+ const handler = handlers[data.type];
1366
+ if (handler !== undefined) {
1367
+ handler();
1368
+ }
1369
+ }
1370
+ });
1371
+ });
1372
+ websocket.addEventListener('close', () => {
1373
+ console.log('[crxm] A reload server disconnected..');
1374
+ });
1375
+ }
1376
+ function watchScriptDiff(initialCode) {
1377
+ const scriptContentTmp = initialCode;
1378
+ setInterval(() => {
1379
+ getResponse().then((code) => {
1380
+ if (scriptContentTmp !== code) {
1381
+ location.reload();
1382
+ }
1383
+ });
1384
+ }, 1000);
1385
+ return scriptContentTmp;
1386
+ }
1387
+ async function getResponse() {
1388
+ return new Promise((resolve) => {
1389
+ GM.xmlHttpRequest({
1390
+ url: `http://${host}:${port}/userscript`,
1391
+ onload: (e) => {
1392
+ resolve(e.responseText);
1393
+ },
1394
+ });
1395
+ });
1396
+ }
1397
+ let loaded = false;
1398
+ document.addEventListener('DOMContentLoaded', () => {
1399
+ loaded = true;
1400
+ });
1401
+ getResponse().then((code) => {
1402
+ if (typeof code === 'string') {
1403
+ if (disableSock) {
1404
+ watchScriptDiff(code);
1405
+ }
1406
+ const injectCode = code;
1407
+ /*
1408
+ if (bindGM) {
1409
+ const bindGMverName = btoa(crypto.randomUUID()).replaceAll('=', '$');
1410
+ unsafeWindow[bindGMverName] = GM;
1411
+ injectCode = `const ${bindGMHash} = window["${bindGMverName}"];` + injectCode;
1412
+ }
1413
+ */
1414
+ const scriptElem = document.createElement('script');
1415
+ scriptElem.textContent = injectCode;
1416
+ unsafeWindow.document.body.appendChild(scriptElem);
1417
+ if (loaded) {
1418
+ document.dispatchEvent(new Event('crxm_DOMContentLoaded'));
1419
+ }
1420
+ }
1421
+ });
1422
+ }
1423
+
1424
+ function developmentContentScript(crxContentBuildId, host, websocketPort) {
1425
+ const websocket = new WebSocket(`ws://${host}:${websocketPort}`);
1426
+ websocket.addEventListener('open', () => {
1427
+ console.log('[crxm] A reload server connected..');
1428
+ });
1429
+ websocket.addEventListener('close', () => {
1430
+ console.log('[crxm] A reload server disconnected..');
1431
+ });
1432
+ websocket.addEventListener('message', ({ data }) => {
1433
+ const response = JSON.parse(data);
1434
+ if (response.type === 'reload') {
1435
+ switch (response.content) {
1436
+ case 'RELOAD_CSS':
1437
+ case 'RELOAD_CONTENT_SCRIPT':
1438
+ location.reload();
1439
+ break;
1440
+ }
1441
+ }
1442
+ });
1443
+ window.addEventListener('message', (e) => {
1444
+ const { data } = e;
1445
+ /**
1446
+ * Client can listen a result by using of this.
1447
+ */
1448
+ const handlers = {
1449
+ 'console-log': () => {
1450
+ const preload = {
1451
+ type: 'console',
1452
+ content: {
1453
+ type: 'log',
1454
+ contents: data.detail,
1455
+ },
1456
+ };
1457
+ websocket.send(JSON.stringify(preload));
1458
+ },
1459
+ 'console-error': () => {
1460
+ const preload = {
1461
+ type: 'console',
1462
+ content: {
1463
+ type: 'error',
1464
+ contents: data.detail,
1465
+ },
1466
+ };
1467
+ websocket.send(JSON.stringify(preload));
1468
+ },
1469
+ 'console-warn': () => {
1470
+ const preload = {
1471
+ type: 'console',
1472
+ content: {
1473
+ type: 'warn',
1474
+ contents: data.detail,
1475
+ },
1476
+ };
1477
+ websocket.send(JSON.stringify(preload));
1478
+ },
1479
+ };
1480
+ /**
1481
+ * # BuildId Check
1482
+ * If a build id of recieved message isn't equiavalent with a buildId of isolatedConnector,
1483
+ * wouldn't be runned the handler so It can prevent being runned from other scripts.
1484
+ */
1485
+ if (data.crxContentBuildId === crxContentBuildId) {
1486
+ const handler = handlers[data.type];
1487
+ if (handler !== undefined) {
1488
+ handler();
1489
+ }
1490
+ }
1491
+ });
1492
+ }
1493
+ function isolatedConnector(crxContentBuildId, config) {
1494
+ const messageListeners = {};
1495
+ /**
1496
+ * How it works?
1497
+ *
1498
+ * 1. A client (e.g. contentscripts.ts in MAIN world) : dispatch message to window.
1499
+ * 2. This EventListener recieved.
1500
+ * 3. This EventListener dispatchs CustomEvent that 'crx-isolated-connector-result' to window.
1501
+ * 4. A client recieved CustomEvent as result.
1502
+ */
1503
+ window.addEventListener('message', (e) => {
1504
+ const { data, target } = e;
1505
+ /**
1506
+ * Send event of response to target.
1507
+ * @param name custom event name.
1508
+ * @param type custom event type.
1509
+ * @param detail custom event detail.
1510
+ */
1511
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-constraint, @typescript-eslint/no-explicit-any
1512
+ function dispatch(name, type, detail) {
1513
+ if (target !== null) {
1514
+ target.dispatchEvent(new CustomEvent(name, {
1515
+ detail: {
1516
+ type,
1517
+ data: detail,
1518
+ actionId: data.actionId,
1519
+ },
1520
+ }));
1521
+ }
1522
+ }
1523
+ /**
1524
+ * Client can listen a result by using of this.
1525
+ */
1526
+ const responseEventName = 'crx-isolated-connector-result';
1527
+ const handlers = {
1528
+ 'get-id': () => {
1529
+ // Send extension runtime id.
1530
+ dispatch(responseEventName, 'get-id', chrome.runtime.id);
1531
+ },
1532
+ 'get-conf': () => {
1533
+ // Send crx-monkey config stringified.
1534
+ dispatch(responseEventName, 'get-conf', config);
1535
+ },
1536
+ 'on-message': () => {
1537
+ // Append a message listener from client.
1538
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1539
+ const handleMessage = (request, sender) => {
1540
+ dispatch(responseEventName, 'on-message', { request, sender });
1541
+ };
1542
+ messageListeners[data.actionId] = handleMessage;
1543
+ chrome.runtime.onMessage.addListener(handleMessage);
1544
+ },
1545
+ 'remove-on-message': () => {
1546
+ // Remove a message listener from client.
1547
+ if (messageListeners[data.actionId] !== undefined) {
1548
+ chrome.runtime.onMessage.removeListener(messageListeners[data.actionId]);
1549
+ }
1550
+ },
1551
+ 'send-message': () => {
1552
+ // Send a message from client.
1553
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1554
+ chrome.runtime.sendMessage(data.detail.message, data.detail.options, (response) => {
1555
+ dispatch(responseEventName, 'send-message', { response });
1556
+ });
1557
+ },
1558
+ };
1559
+ /**
1560
+ * # BuildId Check
1561
+ * If a build id of recieved message isn't equiavalent with a buildId of isolatedConnector,
1562
+ * wouldn't be runned the handler so It can prevent being runned from other scripts.
1563
+ */
1564
+ if (data.crxContentBuildId === crxContentBuildId) {
1565
+ const handler = handlers[data.type];
1566
+ if (handler !== undefined) {
1567
+ handler();
1568
+ }
1569
+ }
1570
+ });
1571
+ }
1572
+
1573
+ let CreateDevClient = class CreateDevClient {
1574
+ configLoader;
1575
+ bundler;
1576
+ headerFactory;
1577
+ manifestFactory;
1578
+ buildId;
1579
+ constructor(configLoader, bundler, headerFactory, manifestFactory, buildId) {
1580
+ this.configLoader = configLoader;
1581
+ this.bundler = bundler;
1582
+ this.headerFactory = headerFactory;
1583
+ this.manifestFactory = manifestFactory;
1584
+ this.buildId = buildId;
1585
+ }
1586
+ /**
1587
+ * Make code for service worker on developement.
1588
+ */
1589
+ outputDevelomentSw(code) {
1590
+ const { server: { host, websocket }, } = this.configLoader.useConfig();
1591
+ if (host === undefined || websocket === undefined) {
1592
+ throw new Error("Server host or websocket's port were not specificated");
1593
+ }
1594
+ const decoder = new TextDecoder('utf-8');
1595
+ const originalCode = decoder.decode(code);
1596
+ const devCode = stringifyFunction(developSw, [host, websocket]);
1597
+ const result = devCode + '\n\n' + originalCode;
1598
+ return result;
1599
+ }
1600
+ outputDevelopmentUserjs() {
1601
+ const { server: { disable_sock_in_userjs, host, port, websocket }, } = this.configLoader.useConfig();
1602
+ if (host === undefined || websocket === undefined || port === undefined) {
1603
+ throw new Error("Server host, port or websocket's port were not specificated");
1604
+ }
1605
+ const disableSock = disable_sock_in_userjs === undefined ? false : disable_sock_in_userjs;
1606
+ const newFactory = new UserscriptHeaderFactory(this.headerFactory);
1607
+ // for loading code from server in development mode.
1608
+ newFactory.push('@grant', 'GM_xmlhttpRequest');
1609
+ const code = [
1610
+ newFactory.toString(),
1611
+ '',
1612
+ stringifyFunction(userjs, [host, port, websocket, false, disableSock, this.buildId]),
1613
+ ].join('\n');
1614
+ return code;
1615
+ }
1616
+ outputDevExtension() {
1617
+ const { output: { chrome }, server: { host, websocket }, } = this.configLoader.useConfig();
1618
+ if (chrome === undefined || host === undefined || websocket === undefined) {
1619
+ throw new Error('');
1620
+ }
1621
+ /**
1622
+ * Development contentscript in isolated env
1623
+ */
1624
+ const devScriptIsolatedFileName = 'crxm-development.js';
1625
+ const devScriptIsolatedPath = resolve(chrome, devScriptIsolatedFileName);
1626
+ const devScriptIsolatedCode = stringifyFunction(developmentContentScript, [
1627
+ this.buildId,
1628
+ host,
1629
+ websocket,
1630
+ ]);
1631
+ fsExtra$1.outputFileSync(devScriptIsolatedPath, devScriptIsolatedCode);
1632
+ this.manifestFactory.addContentScript([devScriptIsolatedFileName], [], ['<all_urls>'], 'ISOLATED');
1633
+ }
1634
+ /**
1635
+ * Include isolated connector
1636
+ */
1637
+ outputIsolatedConnector() {
1638
+ const { output: { chrome }, server: { host, websocket }, } = this.configLoader.useConfig();
1639
+ if (chrome === undefined || host === undefined || websocket === undefined) {
1640
+ throw new Error('');
1641
+ }
1642
+ let includeConnector = false;
1643
+ const isolatedmatches = [];
1644
+ this.manifestFactory.rawManifest.content_scripts.forEach(({ use_isolated_connection, matches }) => {
1645
+ if (use_isolated_connection) {
1646
+ isolatedmatches.push(...(matches !== undefined ? matches : []));
1647
+ includeConnector = true;
1648
+ }
1649
+ });
1650
+ if (includeConnector) {
1651
+ const isoFileName = 'crxm-isolated-connector.js';
1652
+ const isoConnectorPath = resolve(chrome, isoFileName);
1653
+ outputFileSync(isoConnectorPath, `${stringifyFunction(isolatedConnector, [this.buildId, JSON.stringify(this.configLoader.useConfig())])}\n`);
1654
+ this.manifestFactory.addContentScript([isoFileName], [], [...isolatedmatches], 'ISOLATED', 'document_start');
1655
+ }
1656
+ }
1657
+ };
1658
+ CreateDevClient = __decorate([
1659
+ injectable(),
1660
+ __param(0, inject(TYPES.ConfigLoader)),
1661
+ __param(1, inject(TYPES.CrxmBundler)),
1662
+ __param(2, inject(TYPES.UserscriptHeaderFactory)),
1663
+ __param(3, inject(TYPES.ManifestFactory)),
1664
+ __param(4, inject(TYPES.BuildID)),
1665
+ __metadata("design:paramtypes", [ConfigLoader,
1666
+ CrxmBundler,
1667
+ UserscriptHeaderFactory,
1668
+ ManifestFactory, String])
1669
+ ], CreateDevClient);
1670
+ /**
1671
+ * Stringify a function that binded args.
1672
+ * @param target function
1673
+ * @param args args
1674
+ * @returns A function stringified.
1675
+ */
1676
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1677
+ function stringifyFunction(target, args) {
1678
+ const raw = target.toString();
1679
+ const newArgs = args.map((arg) => {
1680
+ if (typeof arg === 'string') {
1681
+ return `'${arg}'`;
1682
+ }
1683
+ else {
1684
+ return String(arg);
1685
+ }
1686
+ });
1687
+ const code = `(${raw})(${newArgs.join(', ')});`;
1688
+ return code;
1689
+ }
1690
+
1691
+ let Distributior = class Distributior {
1692
+ bundler;
1693
+ manifestLoader;
1694
+ manifestParser;
1695
+ manifestFactory;
1696
+ configLoader;
1697
+ userscriptBundler;
1698
+ createDev;
1699
+ isWatch;
1700
+ buildId;
1701
+ defines = {
1702
+ content: [],
1703
+ sw: [],
1704
+ popup: [],
1705
+ };
1706
+ constructor(bundler, manifestLoader, manifestParser, manifestFactory, configLoader, userscriptBundler, createDev, isWatch, buildId) {
1707
+ this.bundler = bundler;
1708
+ this.manifestLoader = manifestLoader;
1709
+ this.manifestParser = manifestParser;
1710
+ this.manifestFactory = manifestFactory;
1711
+ this.configLoader = configLoader;
1712
+ this.userscriptBundler = userscriptBundler;
1713
+ this.createDev = createDev;
1714
+ this.isWatch = isWatch;
1715
+ this.buildId = buildId;
1716
+ }
1717
+ /**
1718
+ * Output bundled file
1719
+ * This must be used after bundled.
1720
+ */
1721
+ dist() {
1722
+ this.outputBundled();
1723
+ //this.copyAssetsDir();
1724
+ }
1725
+ /**
1726
+ * Remove dist
1727
+ */
1728
+ async cleanupDist() {
1729
+ const { output } = this.configLoader.useConfig();
1730
+ if (output.chrome !== undefined) {
1731
+ const dist = dirname(output.chrome);
1732
+ await fsExtra.remove(dist);
1733
+ }
1734
+ }
1735
+ initializeDefine() {
1736
+ this.defines = {
1737
+ content: [],
1738
+ sw: [],
1739
+ popup: [],
1740
+ };
1741
+ }
1742
+ /**
1743
+ * Variables to add to your code
1744
+ * @param name
1745
+ * @param value
1746
+ * @param to
1747
+ */
1748
+ addDefine(name, value, to) {
1749
+ this.defines[to].push({ name, value });
1750
+ }
1751
+ createDefineCode(defines) {
1752
+ return (defines
1753
+ .map(({ name, value }) => {
1754
+ return `var ${name} = ${value};`;
1755
+ })
1756
+ .join('\n') + '\n');
1757
+ }
1758
+ /**
1759
+ * Output bundled file
1760
+ */
1761
+ outputBundled() {
1762
+ const { output } = this.configLoader.useConfig();
1763
+ if (output.chrome !== undefined) {
1764
+ this.chromeBundle(output.chrome);
1765
+ this.copyPublicDir(output.chrome);
1766
+ this.copyIcons(output.chrome);
1767
+ this.outputManifest(output.chrome);
1768
+ }
1769
+ if (output.userjs !== undefined) {
1770
+ this.userjsBundle(output.userjs);
1771
+ }
1772
+ }
1773
+ /**
1774
+ * Convert a file extension that is .ts to .js.
1775
+ * @param filePath
1776
+ * @returns A filePath that extension converted to .js.
1777
+ */
1778
+ changeExt(filePath, newExt) {
1779
+ const rawFileNameSplited = basename(filePath).split('.');
1780
+ rawFileNameSplited[rawFileNameSplited.length - 1] = newExt;
1781
+ const newFilename = rawFileNameSplited.join('.');
1782
+ return newFilename;
1783
+ }
1784
+ /**
1785
+ * Output manifest file.
1786
+ * This operation must be used after all transpiling.
1787
+ * @param outputPath
1788
+ */
1789
+ outputManifest(outputPath) {
1790
+ const manifest = this.manifestFactory.getWorkspace();
1791
+ fsExtra.outputFileSync(resolve(outputPath, 'manifest.json'), JSON.stringify(manifest, undefined, 2));
1792
+ }
1793
+ /**
1794
+ * Output for chrome
1795
+ * @param distPath
1796
+ */
1797
+ chromeBundle(distPath) {
1798
+ const { resources: { scriptResources, cssResources, htmlResources: { popup }, raw, }, } = this.manifestParser.parseResult;
1799
+ scriptResources.content.forEach((path, i) => {
1800
+ const result = this.bundler.getBuildResultFromPath(path);
1801
+ if (result !== undefined) {
1802
+ const extChanged = this.changeExt(path, 'js');
1803
+ const endemicHash = MurmurHash3.x86.hash32(path).toString();
1804
+ const fileName = endemicHash + '_' + extChanged;
1805
+ const outputPath = resolve(distPath, fileName);
1806
+ const decoder = new TextDecoder();
1807
+ const decorded = decoder.decode(result);
1808
+ let code = this.createDefineCode(this.defines.content) + decorded;
1809
+ if (this.isWatch) {
1810
+ code = `window.__CRX_CONTENT_BUILD_ID = '${this.buildId}';\n` + code;
1811
+ }
1812
+ fsExtra.outputFileSync(outputPath, code);
1813
+ this.manifestFactory.resolve(raw.scriptResources.content[i], fileName);
1814
+ }
1815
+ });
1816
+ scriptResources.sw.forEach((path, i) => {
1817
+ const buildResult = this.bundler.getBuildResultFromPath(path);
1818
+ const extChanged = this.changeExt(path, 'js');
1819
+ const endemicHash = MurmurHash3.x86.hash32(path).toString();
1820
+ const fileName = endemicHash + '_' + extChanged;
1821
+ const outputPath = resolve(distPath, fileName);
1822
+ if (buildResult !== undefined) {
1823
+ let code;
1824
+ if (this.isWatch) {
1825
+ code =
1826
+ this.createDefineCode(this.defines.sw) + this.createDev.outputDevelomentSw(buildResult);
1827
+ }
1828
+ else {
1829
+ const decoder = new TextDecoder();
1830
+ code = this.createDefineCode(this.defines.sw) + decoder.decode(buildResult);
1831
+ }
1832
+ fsExtra.outputFileSync(outputPath, code);
1833
+ this.manifestFactory.resolve(raw.scriptResources.sw[i], fileName);
1834
+ }
1835
+ });
1836
+ cssResources.forEach((path, i) => {
1837
+ const result = this.bundler.getBuildResultFromPath(path);
1838
+ const extChanged = this.changeExt(path, 'css');
1839
+ const endemicHash = MurmurHash3.x86.hash32(path).toString();
1840
+ const fileName = endemicHash + '_' + extChanged;
1841
+ const outputPath = resolve(distPath, fileName);
1842
+ if (result !== undefined) {
1843
+ fsExtra.outputFileSync(outputPath, result);
1844
+ this.manifestFactory.resolve(raw.cssResources[i], fileName);
1845
+ }
1846
+ });
1847
+ popup.forEach((path, i) => {
1848
+ const result = this.bundler.getBuildResultFromPath(path);
1849
+ const endemicHash = MurmurHash3.x86.hash32(path).toString();
1850
+ const fileName = endemicHash + '.html';
1851
+ const outputPath = resolve(distPath, fileName);
1852
+ if (result !== undefined) {
1853
+ const decoder = new TextDecoder();
1854
+ const code = this.createDefineCode(this.defines.popup) + decoder.decode(result);
1855
+ fsExtra.outputFileSync(outputPath, code);
1856
+ this.manifestFactory.resolve(raw.htmlResources.popup[i], fileName);
1857
+ }
1858
+ });
1859
+ }
1860
+ async userjsBundle(distPath) {
1861
+ const { resources: { scriptResources, raw, cssResources }, } = this.manifestParser.parseResult;
1862
+ scriptResources.content.forEach((path, i) => {
1863
+ const result = this.bundler.getBuildResultFromPath(path);
1864
+ if (result !== undefined) {
1865
+ this.userscriptBundler.addBuildResult(raw.scriptResources.content[i], result);
1866
+ }
1867
+ });
1868
+ cssResources.forEach((path, i) => {
1869
+ const result = this.bundler.getBuildResultFromPath(path);
1870
+ if (result !== undefined) {
1871
+ this.userscriptBundler.addStyle(raw.cssResources[i], result);
1872
+ }
1873
+ });
1874
+ const output = resolve(distPath);
1875
+ const bundleResult = this.userscriptBundler.createCode();
1876
+ if (bundleResult !== undefined) {
1877
+ const formated = await prettier.format(bundleResult, {
1878
+ format: true,
1879
+ parser: 'babel',
1880
+ semi: true,
1881
+ });
1882
+ fsExtra.outputFileSync(output, formated);
1883
+ }
1884
+ if (this.isWatch) {
1885
+ const code = this.createDev.outputDevelopmentUserjs();
1886
+ const output = resolve(dirname(distPath), 'dev.user.js');
1887
+ fsExtra.outputFileSync(output, code);
1888
+ }
1889
+ }
1890
+ copyPublicDir(distPath) {
1891
+ const { public: publicDir } = this.configLoader.useConfig();
1892
+ if (publicDir !== undefined) {
1893
+ fsExtra.copySync(publicDir, resolve(distPath, 'public'), {
1894
+ overwrite: true,
1895
+ });
1896
+ }
1897
+ }
1898
+ copyIcons(distPath) {
1899
+ const { icons } = this.manifestParser.parseResult;
1900
+ if (icons !== null) {
1901
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
1902
+ Object.entries(icons).forEach(([key, { raw, path, size }]) => {
1903
+ const fileName = basename(path);
1904
+ const output = resolve(distPath, 'assets/icons', fileName);
1905
+ fsExtra.copySync(path, output);
1906
+ this.manifestFactory.resolve(raw, 'assets/icons/' + fileName);
1907
+ });
1908
+ }
1909
+ }
1910
+ };
1911
+ Distributior = __decorate([
1912
+ injectable(),
1913
+ __param(0, inject(TYPES.CrxmBundler)),
1914
+ __param(1, inject(TYPES.ManifestLoader)),
1915
+ __param(2, inject(TYPES.ManifestParser)),
1916
+ __param(3, inject(TYPES.ManifestFactory)),
1917
+ __param(4, inject(TYPES.ConfigLoader)),
1918
+ __param(5, inject(TYPES.UserscriptBundler)),
1919
+ __param(6, inject(TYPES.CreateDevClient)),
1920
+ __param(7, inject(TYPES.IsWatch)),
1921
+ __param(8, inject(TYPES.BuildID)),
1922
+ __metadata("design:paramtypes", [CrxmBundler,
1923
+ ManifestLoader,
1924
+ ManifestParser,
1925
+ ManifestFactory,
1926
+ ConfigLoader,
1927
+ UserscriptBundler,
1928
+ CreateDevClient, Boolean, String])
1929
+ ], Distributior);
1930
+
1931
+ let BundlerRegisterer = class BundlerRegisterer {
1932
+ manifestLoader;
1933
+ manifestParser;
1934
+ configLoader;
1935
+ watcher;
1936
+ bundler;
1937
+ logger;
1938
+ isWatch;
1939
+ distributior;
1940
+ contentScripts = [];
1941
+ sw = [];
1942
+ cssResources = [];
1943
+ htmlResources = [];
1944
+ constructor(manifestLoader, manifestParser, configLoader, watcher, bundler, logger, isWatch, distributior) {
1945
+ this.manifestLoader = manifestLoader;
1946
+ this.manifestParser = manifestParser;
1947
+ this.configLoader = configLoader;
1948
+ this.watcher = watcher;
1949
+ this.bundler = bundler;
1950
+ this.logger = logger;
1951
+ this.isWatch = isWatch;
1952
+ this.distributior = distributior;
1953
+ }
1954
+ /**
1955
+ * Register all build targets for bundler from manifest.
1956
+ */
1957
+ registerAll() {
1958
+ const fileChangeResult = this.fileChangeCheck();
1959
+ /**
1960
+ * Add added targets to bundle targets.
1961
+ */
1962
+ const addTargetGroups = [
1963
+ ['content', fileChangeResult.script.content.added],
1964
+ ['sw', fileChangeResult.script.sw.added],
1965
+ ['css', fileChangeResult.css.added],
1966
+ ['html', fileChangeResult.html.added],
1967
+ ];
1968
+ for (const [flag, paths] of addTargetGroups) {
1969
+ for (const path of paths) {
1970
+ const buildPlugin = this.getAppropriateBuildPlugin(path);
1971
+ const watchPlugin = this.getAppropriateWatchPlugin(path);
1972
+ if (!buildPlugin) {
1973
+ console.error(`Could not find the appropriate plugin for building "${path}"`);
1974
+ continue;
1975
+ }
1976
+ if (!watchPlugin) {
1977
+ console.error(`Could not find the appropriate plugin for watching "${path}"`);
1978
+ continue;
1979
+ }
1980
+ this.bundler.addTarget(path, { build: buildPlugin, watch: watchPlugin }, flag);
1981
+ }
1982
+ }
1983
+ /**
1984
+ * Remove removed targets from bundle targets.
1985
+ */
1986
+ const rmTargetGroups = [
1987
+ ['content', fileChangeResult.script.content.removed],
1988
+ ['sw', fileChangeResult.script.sw.removed],
1989
+ ['css', fileChangeResult.css.removed],
1990
+ ['html', fileChangeResult.html.removed],
1991
+ ];
1992
+ for (const [flag, paths] of rmTargetGroups) {
1993
+ for (const path of paths) {
1994
+ this.bundler.removeTarget(path, flag);
1995
+ }
1996
+ }
1997
+ this.defineAllVars();
1998
+ }
1999
+ /**
2000
+ * Load and register variables written in a conifg add to the bundled code
2001
+ */
2002
+ defineAllVars() {
2003
+ const { define } = this.configLoader.useConfig();
2004
+ if (define.contentscripts !== undefined) {
2005
+ Object.entries(define.contentscripts).forEach(([name, value]) => {
2006
+ this.distributior.addDefine(name, value, 'content');
2007
+ });
2008
+ }
2009
+ if (define.sw !== undefined) {
2010
+ Object.entries(define.sw).forEach(([name, value]) => {
2011
+ this.distributior.addDefine(name, value, 'sw');
2012
+ });
2013
+ }
2014
+ if (define.popup !== undefined) {
2015
+ Object.entries(define.popup).forEach(([name, value]) => {
2016
+ this.distributior.addDefine(name, value, 'popup');
2017
+ });
2018
+ }
2019
+ }
2020
+ /**
2021
+ * Get build plugin
2022
+ * @param filePath
2023
+ * @returns
2024
+ */
2025
+ getAppropriateBuildPlugin(filePath) {
2026
+ const { build } = this.configLoader.useConfig();
2027
+ for (const [pattern, plugin] of Object.entries(build)) {
2028
+ const regex = new RegExp(pattern);
2029
+ if (regex.test(filePath)) {
2030
+ return plugin;
2031
+ }
2032
+ }
2033
+ return null;
2034
+ }
2035
+ /**
2036
+ * Get watch plugin
2037
+ * @param filePath
2038
+ * @returns
2039
+ */
2040
+ getAppropriateWatchPlugin(filePath) {
2041
+ const { watch } = this.configLoader.useConfig();
2042
+ for (const [pattern, plugin] of Object.entries(watch)) {
2043
+ const regex = new RegExp(pattern);
2044
+ if (regex.test(filePath)) {
2045
+ return plugin;
2046
+ }
2047
+ }
2048
+ return null;
2049
+ }
2050
+ /**
2051
+ * Compare file change.
2052
+ * @returns
2053
+ */
2054
+ fileChangeCheck() {
2055
+ const manifest = this.manifestLoader.useManifest();
2056
+ const confPath = this.configLoader.useConfigPath();
2057
+ const projectDir = dirname(confPath);
2058
+ const parsed = this.manifestParser.parse(manifest);
2059
+ const { resources: { scriptResources: { sw, content }, cssResources, htmlResources, }, } = parsed;
2060
+ /**
2061
+ * content Script
2062
+ */
2063
+ const contentResourcesAbsoluted = content.map((scriptPath) => {
2064
+ return resolve(projectDir, scriptPath);
2065
+ });
2066
+ const contentScriptAdded = [];
2067
+ const contentScriptRemoved = [];
2068
+ contentResourcesAbsoluted.forEach((absolutePath) => {
2069
+ if (!this.contentScripts.includes(absolutePath)) {
2070
+ // It's new file
2071
+ this.contentScripts.push(absolutePath);
2072
+ contentScriptAdded.push(absolutePath);
2073
+ this.logger.dispatchDebug(`👀 New content script detected ${chalk.gray('"' + absolutePath + '"')}`);
2074
+ }
2075
+ });
2076
+ this.contentScripts.forEach((absolutePath) => {
2077
+ if (!contentResourcesAbsoluted.includes(absolutePath)) {
2078
+ // It's removed file
2079
+ this.contentScripts = this.contentScripts.filter((x) => x !== absolutePath);
2080
+ contentScriptRemoved.push(absolutePath);
2081
+ this.logger.dispatchDebug(`👓 Removed content script detected ${chalk.gray('"' + absolutePath + '"')}`);
2082
+ }
2083
+ });
2084
+ /**
2085
+ * sw
2086
+ */
2087
+ const swResourcesAbsoluted = sw.map((scriptPath) => {
2088
+ return resolve(projectDir, scriptPath);
2089
+ });
2090
+ const swAdded = [];
2091
+ const swRemoved = [];
2092
+ swResourcesAbsoluted.forEach((absolutePath) => {
2093
+ if (!this.sw.includes(absolutePath)) {
2094
+ // It's new file
2095
+ this.sw.push(absolutePath);
2096
+ swAdded.push(absolutePath);
2097
+ this.logger.dispatchDebug(`👀 New service worker detected ${chalk.gray('"' + absolutePath + '"')}`);
2098
+ }
2099
+ });
2100
+ this.sw.forEach((absolutePath) => {
2101
+ if (!swResourcesAbsoluted.includes(absolutePath)) {
2102
+ // It's removed file
2103
+ this.sw = this.sw.filter((x) => x !== absolutePath);
2104
+ swRemoved.push(absolutePath);
2105
+ this.logger.dispatchDebug(`👓 Removed service worker detected ${chalk.gray('"' + absolutePath + '"')}`);
2106
+ }
2107
+ });
2108
+ /**
2109
+ * CSS
2110
+ */
2111
+ const cssResourcesAbsoluted = cssResources.map((scriptPath) => {
2112
+ return resolve(projectDir, scriptPath);
2113
+ });
2114
+ const cssAdded = [];
2115
+ const cssRemoved = [];
2116
+ cssResourcesAbsoluted.forEach((absolutePath) => {
2117
+ if (!this.cssResources.includes(absolutePath)) {
2118
+ // It's new file
2119
+ this.cssResources.push(absolutePath);
2120
+ cssAdded.push(absolutePath);
2121
+ this.logger.dispatchDebug(`👀 New css detected ${chalk.gray('"' + absolutePath + '"')}`);
2122
+ }
2123
+ });
2124
+ this.cssResources.forEach((absolutePath) => {
2125
+ if (!cssResourcesAbsoluted.includes(absolutePath)) {
2126
+ // It's removed file
2127
+ this.cssResources = this.cssResources.filter((x) => x !== absolutePath);
2128
+ cssRemoved.push(absolutePath);
2129
+ this.logger.dispatchDebug(`👓 Removed css detected ${chalk.gray('"' + absolutePath + '"')}`);
2130
+ }
2131
+ });
2132
+ /**
2133
+ * html
2134
+ */
2135
+ const htmlResourcesAbsoluted = htmlResources.popup.map((htmlPath) => {
2136
+ return resolve(projectDir, htmlPath);
2137
+ });
2138
+ const htmlAdded = [];
2139
+ const htmlRemoved = [];
2140
+ htmlResourcesAbsoluted.forEach((absolutePath) => {
2141
+ if (!this.htmlResources.includes(absolutePath)) {
2142
+ // It's new file
2143
+ this.htmlResources.push(absolutePath);
2144
+ htmlAdded.push(absolutePath);
2145
+ this.logger.dispatchDebug(`👀 New html detected ${chalk.gray('"' + absolutePath + '"')}`);
2146
+ }
2147
+ });
2148
+ this.htmlResources.forEach((absolutePath) => {
2149
+ if (!htmlResourcesAbsoluted.includes(absolutePath)) {
2150
+ // It's removed file
2151
+ this.htmlResources = this.htmlResources.filter((x) => x !== absolutePath);
2152
+ htmlRemoved.push(absolutePath);
2153
+ this.logger.dispatchDebug(`👓 Removed html detected ${chalk.gray('"' + absolutePath + '"')}`);
2154
+ }
2155
+ });
2156
+ return {
2157
+ script: {
2158
+ sw: {
2159
+ added: swAdded,
2160
+ removed: swRemoved,
2161
+ },
2162
+ content: {
2163
+ added: contentScriptAdded,
2164
+ removed: contentScriptRemoved,
2165
+ },
2166
+ },
2167
+ css: {
2168
+ added: cssAdded,
2169
+ removed: cssRemoved,
2170
+ },
2171
+ html: {
2172
+ added: htmlAdded,
2173
+ removed: htmlRemoved,
2174
+ },
2175
+ };
2176
+ }
2177
+ };
2178
+ BundlerRegisterer = __decorate([
2179
+ injectable(),
2180
+ __param(0, inject(TYPES.ManifestLoader)),
2181
+ __param(1, inject(TYPES.ManifestParser)),
2182
+ __param(2, inject(TYPES.ConfigLoader)),
2183
+ __param(3, inject(TYPES.Watcher)),
2184
+ __param(4, inject(TYPES.CrxmBundler)),
2185
+ __param(5, inject(TYPES.Logger)),
2186
+ __param(6, inject(TYPES.IsWatch)),
2187
+ __param(7, inject(TYPES.Distributior)),
2188
+ __metadata("design:paramtypes", [ManifestLoader,
2189
+ ManifestParser,
2190
+ ConfigLoader,
2191
+ Watcher,
2192
+ CrxmBundler,
2193
+ Logger, Boolean, Distributior])
2194
+ ], BundlerRegisterer);
2195
+
2196
+ let UserscriptRegisterer = class UserscriptRegisterer {
2197
+ manifestFactory;
2198
+ headerFactory;
2199
+ manifestParser;
2200
+ manifestLoader;
2201
+ configLoader;
2202
+ constructor(manifestFactory, headerFactory, manifestParser, manifestLoader, configLoader) {
2203
+ this.manifestFactory = manifestFactory;
2204
+ this.headerFactory = headerFactory;
2205
+ this.manifestParser = manifestParser;
2206
+ this.manifestLoader = manifestLoader;
2207
+ this.configLoader = configLoader;
2208
+ }
2209
+ async sync() {
2210
+ await this.setManifestToUserscript();
2211
+ }
2212
+ async setManifestToUserscript() {
2213
+ const rawManifest = this.manifestLoader.useManifest();
2214
+ const userscriptHeaderFactory = this.headerFactory;
2215
+ if (rawManifest.content_scripts !== undefined) {
2216
+ const { allMatches } = this.createMatchMap();
2217
+ if (!allMatches.includes('<all_urls>')) {
2218
+ userscriptHeaderFactory.push('@match', 'http://*/*');
2219
+ userscriptHeaderFactory.push('@match', 'https://*/*');
2220
+ }
2221
+ }
2222
+ /**
2223
+ * Set version designation by manifest to header.
2224
+ */
2225
+ userscriptHeaderFactory.push('@version', rawManifest.version);
2226
+ /*
2227
+ if (rawManifest.run_at !== undefined) {
2228
+ userscriptHeaderFactory.push(
2229
+ '@run-at',
2230
+ this.convertChromeRunAtToUserJsRunAt(rawManifest.run_at),
2231
+ );
2232
+ } else {*/
2233
+ userscriptHeaderFactory.push('@run-at', 'document-start');
2234
+ // }
2235
+ /**
2236
+ * Set name.
2237
+ * If can not found locale message, even if language key is not en, it will be en.
2238
+ */
2239
+ const names = await geti18nMessages(rawManifest.name);
2240
+ Object.keys(names).forEach((lang) => {
2241
+ if (lang === 'en') {
2242
+ // default is en.
2243
+ userscriptHeaderFactory.push('@name', names[lang]);
2244
+ }
2245
+ else {
2246
+ userscriptHeaderFactory.push(`@name:${lang}`, names[lang]);
2247
+ }
2248
+ });
2249
+ /**
2250
+ * Set description.
2251
+ * If can not found locale message, even if language key is not en, it will be en.
2252
+ */
2253
+ if (rawManifest.description !== undefined) {
2254
+ const descriptions = await geti18nMessages(rawManifest.description);
2255
+ Object.keys(descriptions).forEach((lang) => {
2256
+ if (lang === 'en') {
2257
+ userscriptHeaderFactory.push('@description', descriptions[lang]);
2258
+ }
2259
+ else {
2260
+ userscriptHeaderFactory.push(`@description:${lang}`, descriptions[lang]);
2261
+ }
2262
+ });
2263
+ }
2264
+ if (rawManifest.content_scripts !== undefined) {
2265
+ let useDirectInject = false;
2266
+ rawManifest.content_scripts.forEach(({ userscript_direct_inject }) => {
2267
+ if (userscript_direct_inject) {
2268
+ useDirectInject = true;
2269
+ }
2270
+ });
2271
+ if (useDirectInject) {
2272
+ userscriptHeaderFactory.push('@grant', 'unsafeWindow');
2273
+ }
2274
+ }
2275
+ /**
2276
+ * Icon
2277
+ */
2278
+ const icons = this.manifestParser.parseResult.icons;
2279
+ if (icons !== null) {
2280
+ const keys = Object.keys(icons);
2281
+ if (keys.length === 0)
2282
+ return undefined;
2283
+ const minSize = Math.min(...keys.map(Number));
2284
+ const minIcon = icons[minSize];
2285
+ const base64 = this.convertImgToBase64(minIcon.path);
2286
+ userscriptHeaderFactory.push('@icon', base64);
2287
+ }
2288
+ /**
2289
+ * Add aditional headers
2290
+ */
2291
+ const { header } = this.configLoader.useConfig();
2292
+ if (header !== undefined) {
2293
+ header.forEach(([key, value]) => {
2294
+ userscriptHeaderFactory.push(key, value);
2295
+ });
2296
+ }
2297
+ }
2298
+ /**
2299
+ * Enumerate all js and css paths from conetnt_scripts in manifestjson
2300
+ * @param contentScripts
2301
+ * @param jsFiles
2302
+ * @param cssFiles
2303
+ * @returns
2304
+ */
2305
+ createMatchMap() {
2306
+ const { scriptResources, cssResources } = this.manifestParser.parseResult.resources.raw;
2307
+ const { content_scripts } = this.manifestLoader.useManifest();
2308
+ const allMatches = [];
2309
+ const matchMap = {};
2310
+ scriptResources.content.forEach((jsPath) => {
2311
+ matchMap[jsPath] = [];
2312
+ });
2313
+ cssResources.forEach((cssPath) => {
2314
+ matchMap[cssPath] = [];
2315
+ });
2316
+ content_scripts.forEach((contentScript) => {
2317
+ const matches = contentScript.matches;
2318
+ if (matches !== undefined) {
2319
+ matches.forEach((match) => {
2320
+ if (!allMatches.includes(match)) {
2321
+ allMatches.push(match);
2322
+ }
2323
+ });
2324
+ contentScript.js?.forEach((jsPath) => {
2325
+ matchMap[jsPath].push(...matches);
2326
+ });
2327
+ contentScript.css?.forEach((cssPath) => {
2328
+ matchMap[cssPath].push(...matches);
2329
+ });
2330
+ }
2331
+ });
2332
+ return { matchMap, allMatches };
2333
+ }
2334
+ /**
2335
+ * Run_at in chrome extension manifest convert to runAt in userscript.
2336
+ * @param chromeRunAt
2337
+ * @returns
2338
+ */
2339
+ convertChromeRunAtToUserJsRunAt(chromeRunAt) {
2340
+ if (chromeRunAt === 'document_start') {
2341
+ return 'document-start';
2342
+ }
2343
+ else if (chromeRunAt === 'document_end') {
2344
+ return 'document-end';
2345
+ }
2346
+ else if (chromeRunAt === 'document_idle') {
2347
+ return 'document-idle';
2348
+ }
2349
+ else {
2350
+ throw new Error([
2351
+ 'Unknown run_at type.',
2352
+ 'Please specify a valid run_at',
2353
+ 'Chrome Reference: https://developer.chrome.com/docs/extensions/reference/api/extensionTypes?hl=ja#type-RunAt',
2354
+ ].join('\n'));
2355
+ }
2356
+ }
2357
+ /**
2358
+ * Convert image to base64 string.
2359
+ * @param imgPath Local image file path.
2360
+ * @returns
2361
+ */
2362
+ convertImgToBase64(imgPath) {
2363
+ const icon = fsExtra.readFileSync(imgPath);
2364
+ const buf = Buffer.from(icon).toString('base64');
2365
+ return `data:image/png;base64,${buf}`;
2366
+ }
2367
+ };
2368
+ UserscriptRegisterer = __decorate([
2369
+ injectable(),
2370
+ __param(0, inject(TYPES.ManifestFactory)),
2371
+ __param(1, inject(TYPES.UserscriptHeaderFactory)),
2372
+ __param(2, inject(TYPES.ManifestParser)),
2373
+ __param(3, inject(TYPES.ManifestLoader)),
2374
+ __param(4, inject(TYPES.ConfigLoader)),
2375
+ __metadata("design:paramtypes", [ManifestFactory,
2376
+ UserscriptHeaderFactory,
2377
+ ManifestParser,
2378
+ ManifestLoader,
2379
+ ConfigLoader])
2380
+ ], UserscriptRegisterer);
2381
+
2382
+ /**
2383
+ * The websocket server of manage auto reload.
2384
+ */
2385
+ let SockServer = class SockServer {
2386
+ configLoader;
2387
+ logger;
2388
+ wserver;
2389
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
2390
+ listeners = [];
2391
+ /**
2392
+ * Start and setup server.
2393
+ * @param host
2394
+ * @param port
2395
+ */
2396
+ constructor(configLoader, logger) {
2397
+ this.configLoader = configLoader;
2398
+ this.logger = logger;
2399
+ const { server: { host, websocket }, } = this.configLoader.useConfig();
2400
+ this.wserver = new WebSocketServer({
2401
+ port: websocket,
2402
+ host: host,
2403
+ });
2404
+ //this.setup();
2405
+ }
2406
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unnecessary-type-constraint
2407
+ addMsgListener(listener) {
2408
+ this.listeners.push(listener);
2409
+ }
2410
+ dispatch(msg) {
2411
+ this.listeners.forEach((l) => {
2412
+ l(msg);
2413
+ });
2414
+ }
2415
+ setup() {
2416
+ this.wserver.addListener('connection', (socket) => {
2417
+ this.sendMsg(socket, {
2418
+ type: 'connected',
2419
+ content: null,
2420
+ });
2421
+ socket.addEventListener('message', (e) => {
2422
+ if (typeof e.data === 'string') {
2423
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
2424
+ const data = JSON.parse(e.data);
2425
+ this.dispatch(data);
2426
+ }
2427
+ this.sendMsg(socket, {
2428
+ type: 'send_ok',
2429
+ content: null,
2430
+ });
2431
+ });
2432
+ });
2433
+ }
2434
+ /**
2435
+ * Send reload signal to websocket client.
2436
+ * @param token
2437
+ */
2438
+ reload(token) {
2439
+ this.wserver.clients.forEach((client) => {
2440
+ this.sendMsg(client, {
2441
+ type: 'reload',
2442
+ content: token,
2443
+ });
2444
+ });
2445
+ this.logger.dispatchDebug(`🔃 Dispatch reload ${chalk.gray('"' + token + '"')}`);
2446
+ }
2447
+ sendMsg(socket, data) {
2448
+ socket.send(JSON.stringify(data));
2449
+ }
2450
+ dispose() {
2451
+ this.wserver.close();
2452
+ }
2453
+ };
2454
+ SockServer = __decorate([
2455
+ injectable(),
2456
+ __param(0, inject(TYPES.ConfigLoader)),
2457
+ __param(1, inject(TYPES.Logger)),
2458
+ __metadata("design:paramtypes", [ConfigLoader,
2459
+ Logger])
2460
+ ], SockServer);
2461
+
2462
+ /*
2463
+ /**
2464
+ * The server of send to script code.
2465
+ */
2466
+ let FileServer = class FileServer {
2467
+ configLoader;
2468
+ app;
2469
+ server = null;
2470
+ constructor(configLoader) {
2471
+ this.configLoader = configLoader;
2472
+ const { server: { host, port }, } = this.configLoader.useConfig();
2473
+ if (host === undefined || port === undefined) {
2474
+ throw new Error("Server host, port or websocket's port were not specificated");
2475
+ }
2476
+ this.app = express();
2477
+ }
2478
+ /**
2479
+ * Start server.
2480
+ * @returns
2481
+ */
2482
+ async start() {
2483
+ this.setup();
2484
+ const { server: { host, port }, } = this.configLoader.useConfig();
2485
+ if (host === undefined || port === undefined) {
2486
+ throw new Error("Server host, port or websocket's port were not specificated");
2487
+ }
2488
+ return new Promise((resolve) => {
2489
+ this.server = this.app.listen(port, host, () => {
2490
+ resolve(1);
2491
+ });
2492
+ });
2493
+ }
2494
+ async dispose() {
2495
+ if (this.server === null) {
2496
+ throw consola.error(new Error('Dispose can be used after Watch is started'));
2497
+ }
2498
+ this.server.close();
2499
+ this.server = null;
2500
+ }
2501
+ setup() {
2502
+ const { output: { chrome, userjs }, manifest, } = this.configLoader.useConfig();
2503
+ if (chrome === undefined || userjs === undefined) {
2504
+ throw new Error('');
2505
+ }
2506
+ this.app.get('/userscript', (req, res) => {
2507
+ let filepath = userjs;
2508
+ if (!isAbsolute(userjs)) {
2509
+ filepath = resolve(dirname(manifest), userjs);
2510
+ }
2511
+ if (fsExtra.existsSync(filepath)) {
2512
+ res.sendFile(filepath);
2513
+ }
2514
+ else {
2515
+ res.send(400);
2516
+ }
2517
+ });
2518
+ this.app.get('/dev.user.js', (req, res) => {
2519
+ let filepath = userjs;
2520
+ if (!isAbsolute(userjs)) {
2521
+ filepath = resolve(dirname(manifest), dirname(userjs), 'dev.user.js');
2522
+ }
2523
+ if (fsExtra.existsSync(filepath)) {
2524
+ res.sendFile(filepath);
2525
+ }
2526
+ else {
2527
+ res.send(400);
2528
+ }
2529
+ });
2530
+ }
2531
+ };
2532
+ FileServer = __decorate([
2533
+ injectable(),
2534
+ __param(0, inject(TYPES.ConfigLoader)),
2535
+ __metadata("design:paramtypes", [ConfigLoader])
2536
+ ], FileServer);
2537
+
2538
+ /**
2539
+ * DI container
2540
+ */
2541
+ const container = new Container();
2542
+ /**
2543
+ * Classes
2544
+ */
2545
+ container.bind(TYPES.Logger).to(Logger).inSingletonScope();
2546
+ container.bind(TYPES.ConfigLoader).to(ConfigLoader).inSingletonScope();
2547
+ container.bind(TYPES.ManifestLoader).to(ManifestLoader).inSingletonScope();
2548
+ container.bind(TYPES.ManifestParser).to(ManifestParser).inSingletonScope();
2549
+ container.bind(TYPES.CrxmBundler).to(CrxmBundler).inSingletonScope();
2550
+ container.bind(TYPES.Watcher).to(Watcher).inSingletonScope();
2551
+ container.bind(TYPES.BundlerRegisterer).to(BundlerRegisterer).inSingletonScope();
2552
+ container.bind(TYPES.Distributior).to(Distributior).inSingletonScope();
2553
+ container.bind(TYPES.ManifestFactory).to(ManifestFactory).inSingletonScope();
2554
+ container.bind(TYPES.UserscriptBundler).to(UserscriptBundler).inSingletonScope();
2555
+ container
2556
+ .bind(TYPES.UserscriptHeaderFactory)
2557
+ .to(UserscriptHeaderFactory)
2558
+ .inSingletonScope();
2559
+ container
2560
+ .bind(TYPES.UserscriptRegisterer)
2561
+ .to(UserscriptRegisterer)
2562
+ .inSingletonScope();
2563
+ container.bind(TYPES.SockServer).to(SockServer).inSingletonScope();
2564
+ container.bind(TYPES.CreateDevClient).to(CreateDevClient).inSingletonScope();
2565
+ container.bind(TYPES.FileServer).to(FileServer).inSingletonScope();
2566
+ /**
2567
+ * Values
2568
+ */
2569
+ container.bind(TYPES.CacheDir).toConstantValue('.crxm');
2570
+
2571
+ /**
2572
+ * Start develop mode.
2573
+ */
2574
+ async function dev() {
2575
+ container.bind(TYPES.IsWatch).toConstantValue(true);
2576
+ container.bind(TYPES.BuildID).toConstantValue(crypto.randomUUID());
2577
+ const logger = container.get(TYPES.Logger);
2578
+ //logger.initialize();
2579
+ const configLoader = container.get(TYPES.ConfigLoader);
2580
+ // Load the config from project.
2581
+ await configLoader.loadConfig();
2582
+ const { logLevel } = configLoader.useConfig();
2583
+ logger.logLevel = logLevel;
2584
+ logger.showInfo();
2585
+ const manifestLoader = container.get(TYPES.ManifestLoader);
2586
+ // Load the manifest from project.
2587
+ await manifestLoader.loadManifest();
2588
+ const manifestFactory = container.get(TYPES.ManifestFactory);
2589
+ const watcher = container.get(TYPES.Watcher);
2590
+ const bundler = container.get(TYPES.CrxmBundler);
2591
+ const distributior = container.get(TYPES.Distributior);
2592
+ const registerer = container.get(TYPES.BundlerRegisterer);
2593
+ const userscriptRegisterer = container.get(TYPES.UserscriptRegisterer);
2594
+ const userscriptHeaderFactory = container.get(TYPES.UserscriptHeaderFactory);
2595
+ const userscriptBundler = container.get(TYPES.UserscriptBundler);
2596
+ const sockServer = container.get(TYPES.SockServer);
2597
+ const createDevClient = container.get(TYPES.CreateDevClient);
2598
+ const fileServer = container.get(TYPES.FileServer);
2599
+ await distributior.cleanupDist();
2600
+ copyLocales();
2601
+ // The websocket server for hotreload.
2602
+ sockServer.setup();
2603
+ fileServer.start();
2604
+ // Register all build targets for bundler from manifest.
2605
+ registerer.registerAll();
2606
+ userscriptBundler.initialize();
2607
+ await userscriptRegisterer.sync();
2608
+ createDevClient.outputDevExtension();
2609
+ createDevClient.outputIsolatedConnector();
2610
+ // Bundle
2611
+ await bundler.watch();
2612
+ // Output bundled file to dist
2613
+ distributior.dist();
2614
+ // On updated manifest or config
2615
+ watcher.addListener(async () => {
2616
+ const { logLevel } = configLoader.useConfig();
2617
+ logger.logLevel = logLevel;
2618
+ logger.showInfo();
2619
+ // Reload manifest from loader
2620
+ manifestFactory.initialize();
2621
+ // Register all build targets for bundler from manifest.
2622
+ registerer.registerAll();
2623
+ userscriptBundler.initialize();
2624
+ userscriptHeaderFactory.initialize();
2625
+ await userscriptRegisterer.sync();
2626
+ createDevClient.outputDevExtension();
2627
+ createDevClient.outputIsolatedConnector();
2628
+ // Bundle
2629
+ await bundler.stopWatch();
2630
+ await bundler.watch();
2631
+ // Output bundled file to dist
2632
+ distributior.dist();
2633
+ await fileServer.dispose();
2634
+ await fileServer.start();
2635
+ sockServer.reload('ALL');
2636
+ });
2637
+ // On updated script
2638
+ bundler.addListener((target) => {
2639
+ distributior.dist();
2640
+ if (target.flag === 'content') {
2641
+ sockServer.reload('RELOAD_CONTENT_SCRIPT');
2642
+ }
2643
+ else if (target.flag === 'sw') {
2644
+ sockServer.reload('RELOAD_SW');
2645
+ }
2646
+ else if (target.flag === 'css') {
2647
+ sockServer.reload('RELOAD_CSS');
2648
+ }
2649
+ else if (target.flag === 'html_script') {
2650
+ sockServer.reload('RELOAD_POPUP_JS');
2651
+ }
2652
+ else if (target.flag === 'html' || target.flag === 'html_css') {
2653
+ sockServer.reload('RELOAD_POPUP_HTML');
2654
+ }
2655
+ else {
2656
+ sockServer.reload('ALL');
2657
+ }
2658
+ });
2659
+ sockServer.addMsgListener((msg) => {
2660
+ if (msg.type === 'console') {
2661
+ switch (msg.content.type) {
2662
+ case 'log':
2663
+ logger.dispatchConsole(msg.content.contents);
2664
+ break;
2665
+ case 'error':
2666
+ logger.dispatchConsole(`${chalk.bgRed(' ERROR ')} ${msg.content.contents}`);
2667
+ break;
2668
+ case 'warn':
2669
+ logger.dispatchConsole(`${chalk.bgYellow(' WARN ')} ${msg.content.contents}`);
2670
+ break;
2671
+ }
2672
+ }
2673
+ });
2674
+ watcher.start();
2675
+ }
2676
+
2677
+ /**
2678
+ * Nice visibility stack trace.
2679
+ * @param e
2680
+ */
2681
+ function errorHandler(e) {
2682
+ const logger = container.get(TYPES.Logger); /*
2683
+ dispatchErr(`${chalk.bgRed(` CRXM ${e.name} `)} ${chalk.bold(e.message)}`);
2684
+
2685
+ const stack = e.stack?.split('\n');
2686
+ stack?.shift();
2687
+ console.error(stack?.map((l) => chalk.gray(l)).join('\n'));*/
2688
+ const msg = `❌ ${chalk.bold(e.name + ':')} ${chalk.bold(e.message)}`;
2689
+ const stack = e.stack?.split('\n');
2690
+ stack?.shift();
2691
+ const stackStr = stack?.map((l) => chalk.gray(l)).join('\n');
2692
+ logger.dispatchErr(msg, stackStr);
2693
+ }
2694
+
2695
+ /**
2696
+ * Build extension.
2697
+ */
2698
+ async function build() {
2699
+ try {
2700
+ container.bind(TYPES.IsWatch).toConstantValue(false);
2701
+ container.bind(TYPES.BuildID).toConstantValue(crypto.randomUUID());
2702
+ const logger = container.get(TYPES.Logger);
2703
+ logger.initialize();
2704
+ const configLoader = container.get(TYPES.ConfigLoader);
2705
+ // Load the config from project.
2706
+ await configLoader.loadConfig();
2707
+ const { logLevel } = configLoader.useConfig();
2708
+ logger.logLevel = logLevel;
2709
+ logger.dispatchLog('Building...');
2710
+ const manifestLoader = container.get(TYPES.ManifestLoader);
2711
+ // Load the manifest from project.
2712
+ await manifestLoader.loadManifest();
2713
+ const bundler = container.get(TYPES.CrxmBundler);
2714
+ const distributior = container.get(TYPES.Distributior);
2715
+ const registerer = container.get(TYPES.BundlerRegisterer);
2716
+ const userscriptRegisterer = container.get(TYPES.UserscriptRegisterer);
2717
+ const userscriptBundler = container.get(TYPES.UserscriptBundler);
2718
+ await distributior.cleanupDist();
2719
+ copyLocales();
2720
+ // Register all build targets for bundler from manifest.
2721
+ registerer.registerAll();
2722
+ userscriptBundler.initialize();
2723
+ await userscriptRegisterer.sync();
2724
+ // Bundle
2725
+ await bundler.build();
2726
+ // Output bundled file to dist
2727
+ distributior.dist();
2728
+ logger.dispatchLog(`Build successful!`);
2729
+ }
2730
+ catch (e) {
2731
+ const err = e;
2732
+ errorHandler(err);
2733
+ }
2734
+ }
2735
+
2736
+ /**
2737
+ * The main endpoint for node of crx-monkey.
2738
+ * Scripts in this file are used from console.
2739
+ */
2740
+ // For stacktrace.
2741
+ sourceMapSupport.install();
2742
+ // Register cli
2743
+ const cli = cac('crx monkey');
2744
+ cli.command('dev', 'Start develop mode.').action(() => {
2745
+ dev();
2746
+ });
2747
+ cli.command('build', 'Build extension').action(() => {
2748
+ build();
2749
+ });
2750
+ cli.version(packageJson.version);
2751
+ cli.help();
2752
+ cli.parse(process.argv, { run: false });
2753
+ if (cli.matchedCommand === undefined) {
2754
+ cli.outputHelp();
2755
+ }
2756
+ else {
2757
+ await cli.runMatchedCommand();
2758
+ }
2759
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsiLi4vLi4vbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIi4uLy4uL3NyYy9ub2RlL2ZpbGUudHMiLCIuLi8uLi9zcmMvbm9kZS9Db25maWdMb2FkZXIudHMiLCIuLi8uLi9zcmMvbm9kZS90eXBlcy50cyIsIi4uLy4uL3NyYy9ub2RlL21hbmlmZXN0L01hbmlmZXN0TG9hZGVyLnRzIiwiLi4vLi4vc3JjL25vZGUvbWFuaWZlc3QvTWFuaWZlc3RQYXJzZXIudHMiLCIuLi8uLi9zcmMvbm9kZS9Mb2dnZXIudHMiLCIuLi8uLi9zcmMvbm9kZS9DcnhtQnVuZGxlci50cyIsIi4uLy4uL3NyYy9ub2RlL1dhdGNoZXIudHMiLCIuLi8uLi9zcmMvbm9kZS9tYW5pZmVzdC9pMThuLnRzIiwiLi4vLi4vc3JjL25vZGUvbWFuaWZlc3QvTWFuaWZlc3RGYWN0b3J5LnRzIiwiLi4vLi4vc3JjL25vZGUvdXNlcnNjcmlwdC9Db2RlSW5qZWN0b3IudHMiLCIuLi8uLi9zcmMvbm9kZS91c2Vyc2NyaXB0L1VzZXJzY3JpcHRIZWFkZXIudHMiLCIuLi8uLi9zcmMvbm9kZS91c2Vyc2NyaXB0L1VzZXJzY3JpcHRCdW5kbGVyLnRzIiwiLi4vLi4vc3JjL25vZGUvZGV2ZWxvcG1lbnQvY29kZXMvc3cudHMiLCIuLi8uLi9zcmMvbm9kZS9kZXZlbG9wbWVudC9jb2Rlcy91c2VyanMudHMiLCIuLi8uLi9zcmMvbm9kZS9kZXZlbG9wbWVudC9jb2Rlcy9leHRlbnNpb24udHMiLCIuLi8uLi9zcmMvbm9kZS9kZXZlbG9wbWVudC9DcmVhdGVEZXZDbGllbnQudHMiLCIuLi8uLi9zcmMvbm9kZS9EaXN0cmlidXRpb3IudHMiLCIuLi8uLi9zcmMvbm9kZS9CdW5kbGVyUmVnaXN0ZXJlci50cyIsIi4uLy4uL3NyYy9ub2RlL3VzZXJzY3JpcHQvVXNlcnNjcmlwdFJlZ2lzdGVyZXIudHMiLCIuLi8uLi9zcmMvbm9kZS9zZXJ2ZXIvU29ja1NlcnZlci50cyIsIi4uLy4uL3NyYy9ub2RlL3NlcnZlci9GaWxlU2VydmVyLnRzIiwiLi4vLi4vc3JjL25vZGUvaW52ZXJzaWZ5LmNvbmZpZy50cyIsIi4uLy4uL3NyYy9ub2RlL2Rldi50cyIsIi4uLy4uL3NyYy9ub2RlL3V0aWxzLnRzIiwiLi4vLi4vc3JjL25vZGUvYnVpbGQudHMiLCIuLi8uLi9zcmMvbm9kZS9tYWluLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXHJcblxyXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcclxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxyXG5cclxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxyXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcclxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxyXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cclxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1JcclxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxyXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSwgU3VwcHJlc3NlZEVycm9yLCBTeW1ib2wsIEl0ZXJhdG9yICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2VzRGVjb3JhdGUoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcclxuICAgIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxyXG4gICAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5ID0ga2luZCA9PT0gXCJnZXR0ZXJcIiA/IFwiZ2V0XCIgOiBraW5kID09PSBcInNldHRlclwiID8gXCJzZXRcIiA6IFwidmFsdWVcIjtcclxuICAgIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xyXG4gICAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XHJcbiAgICB2YXIgXywgZG9uZSA9IGZhbHNlO1xyXG4gICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICB2YXIgY29udGV4dCA9IHt9O1xyXG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluKSBjb250ZXh0W3BdID0gcCA9PT0gXCJhY2Nlc3NcIiA/IHt9IDogY29udGV4dEluW3BdO1xyXG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xyXG4gICAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2ldKShraW5kID09PSBcImFjY2Vzc29yXCIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5XSwgY29udGV4dCk7XHJcbiAgICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWRcIik7XHJcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XHJcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XHJcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xyXG4gICAgICAgICAgICBpZiAoa2luZCA9PT0gXCJmaWVsZFwiKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcclxuICAgICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcclxuICAgIGRvbmUgPSB0cnVlO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcclxuICAgIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZSA6IHZvaWQgMDtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Byb3BLZXkoeCkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiID8geCA6IFwiXCIuY29uY2F0KHgpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc2V0RnVuY3Rpb25OYW1lKGYsIG5hbWUsIHByZWZpeCkge1xyXG4gICAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN5bWJvbFwiKSBuYW1lID0gbmFtZS5kZXNjcmlwdGlvbiA/IFwiW1wiLmNvbmNhdChuYW1lLmRlc2NyaXB0aW9uLCBcIl1cIikgOiBcIlwiO1xyXG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCBcIm5hbWVcIiwgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBwcmVmaXggPyBcIlwiLmNvbmNhdChwcmVmaXgsIFwiIFwiLCBuYW1lKSA6IG5hbWUgfSk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxyXG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XHJcbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XHJcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEl0ZXJhdG9yID09PSBcImZ1bmN0aW9uXCIgPyBJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKTtcclxuICAgIHJldHVybiBnLm5leHQgPSB2ZXJiKDApLCBnW1widGhyb3dcIl0gPSB2ZXJiKDEpLCBnW1wicmV0dXJuXCJdID0gdmVyYigyKSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChnICYmIChnID0gMCwgb3BbMF0gJiYgKF8gPSAwKSksIF8pIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cclxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2NyZWF0ZUJpbmRpbmcgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xyXG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcclxuICAgICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xyXG4gICAgfVxyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcclxufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBvW2syXSA9IG1ba107XHJcbn0pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XHJcbiAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcclxuICAgIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcclxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgcltrXSA9IGFbal07XHJcbiAgICByZXR1cm4gcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcclxuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xyXG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xyXG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSBPYmplY3QuY3JlYXRlKCh0eXBlb2YgQXN5bmNJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gQXN5bmNJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiLCBhd2FpdFJldHVybiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIGF3YWl0UmV0dXJuKGYpIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBQcm9taXNlLnJlc29sdmUodikudGhlbihmLCByZWplY3QpOyB9OyB9XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaWYgKGdbbl0pIHsgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgaWYgKGYpIGlbbl0gPSBmKGlbbl0pOyB9IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBmYWxzZSB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcclxufSkgOiBmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XHJcbn07XHJcblxyXG52YXIgb3duS2V5cyA9IGZ1bmN0aW9uKG8pIHtcclxuICAgIG93bktleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiAobykge1xyXG4gICAgICAgIHZhciBhciA9IFtdO1xyXG4gICAgICAgIGZvciAodmFyIGsgaW4gbykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBrKSkgYXJbYXIubGVuZ3RoXSA9IGs7XHJcbiAgICAgICAgcmV0dXJuIGFyO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBvd25LZXlzKG8pO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcclxuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgPSBvd25LZXlzKG1vZCksIGkgPSAwOyBpIDwgay5sZW5ndGg7IGkrKykgaWYgKGtbaV0gIT09IFwiZGVmYXVsdFwiKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGtbaV0pO1xyXG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XHJcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgc3RhdGUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIGdldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgcmV0dXJuIGtpbmQgPT09IFwibVwiID8gZiA6IGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyKSA6IGYgPyBmLnZhbHVlIDogc3RhdGUuZ2V0KHJlY2VpdmVyKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHN0YXRlLCB2YWx1ZSwga2luZCwgZikge1xyXG4gICAgaWYgKGtpbmQgPT09IFwibVwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBtZXRob2QgaXMgbm90IHdyaXRhYmxlXCIpO1xyXG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xyXG4gICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3Qgd3JpdGUgcHJpdmF0ZSBtZW1iZXIgdG8gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiAoa2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIsIHZhbHVlKSA6IGYgPyBmLnZhbHVlID0gdmFsdWUgOiBzdGF0ZS5zZXQocmVjZWl2ZXIsIHZhbHVlKSksIHZhbHVlO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEluKHN0YXRlLCByZWNlaXZlcikge1xyXG4gICAgaWYgKHJlY2VpdmVyID09PSBudWxsIHx8ICh0eXBlb2YgcmVjZWl2ZXIgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHJlY2VpdmVyICE9PSBcImZ1bmN0aW9uXCIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHVzZSAnaW4nIG9wZXJhdG9yIG9uIG5vbi1vYmplY3RcIik7XHJcbiAgICByZXR1cm4gdHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciA9PT0gc3RhdGUgOiBzdGF0ZS5oYXMocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52LCB2YWx1ZSwgYXN5bmMpIHtcclxuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdm9pZCAwKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZC5cIik7XHJcbiAgICAgICAgdmFyIGRpc3Bvc2UsIGlubmVyO1xyXG4gICAgICAgIGlmIChhc3luYykge1xyXG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5hc3luY0Rpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XHJcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmRpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuZGlzcG9zZV07XHJcbiAgICAgICAgICAgIGlmIChhc3luYykgaW5uZXIgPSBkaXNwb3NlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XHJcbiAgICAgICAgaWYgKGlubmVyKSBkaXNwb3NlID0gZnVuY3Rpb24oKSB7IHRyeSB7IGlubmVyLmNhbGwodGhpcyk7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpOyB9IH07XHJcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGFzeW5jKSB7XHJcbiAgICAgICAgZW52LnN0YWNrLnB1c2goeyBhc3luYzogdHJ1ZSB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiB2YWx1ZTtcclxuXHJcbn1cclxuXHJcbnZhciBfU3VwcHJlc3NlZEVycm9yID0gdHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gXCJmdW5jdGlvblwiID8gU3VwcHJlc3NlZEVycm9yIDogZnVuY3Rpb24gKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlKSB7XHJcbiAgICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcclxuICAgIHJldHVybiBlLm5hbWUgPSBcIlN1cHByZXNzZWRFcnJvclwiLCBlLmVycm9yID0gZXJyb3IsIGUuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGU7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kaXNwb3NlUmVzb3VyY2VzKGVudikge1xyXG4gICAgZnVuY3Rpb24gZmFpbChlKSB7XHJcbiAgICAgICAgZW52LmVycm9yID0gZW52Lmhhc0Vycm9yID8gbmV3IF9TdXBwcmVzc2VkRXJyb3IoZSwgZW52LmVycm9yLCBcIkFuIGVycm9yIHdhcyBzdXBwcmVzc2VkIGR1cmluZyBkaXNwb3NhbC5cIikgOiBlO1xyXG4gICAgICAgIGVudi5oYXNFcnJvciA9IHRydWU7XHJcbiAgICB9XHJcbiAgICB2YXIgciwgcyA9IDA7XHJcbiAgICBmdW5jdGlvbiBuZXh0KCkge1xyXG4gICAgICAgIHdoaWxlIChyID0gZW52LnN0YWNrLnBvcCgpKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXIuYXN5bmMgJiYgcyA9PT0gMSkgcmV0dXJuIHMgPSAwLCBlbnYuc3RhY2sucHVzaChyKSwgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihuZXh0KTtcclxuICAgICAgICAgICAgICAgIGlmIChyLmRpc3Bvc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gci5kaXNwb3NlLmNhbGwoci52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHIuYXN5bmMpIHJldHVybiBzIHw9IDIsIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4obmV4dCwgZnVuY3Rpb24oZSkgeyBmYWlsKGUpOyByZXR1cm4gbmV4dCgpOyB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgcyB8PSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBmYWlsKGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzID09PSAxKSByZXR1cm4gZW52Lmhhc0Vycm9yID8gUHJvbWlzZS5yZWplY3QoZW52LmVycm9yKSA6IFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXh0KCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbihwYXRoLCBwcmVzZXJ2ZUpzeCkge1xyXG4gICAgaWYgKHR5cGVvZiBwYXRoID09PSBcInN0cmluZ1wiICYmIC9eXFwuXFwuP1xcLy8udGVzdChwYXRoKSkge1xyXG4gICAgICAgIHJldHVybiBwYXRoLnJlcGxhY2UoL1xcLih0c3gpJHwoKD86XFwuZCk/KSgoPzpcXC5bXi4vXSs/KT8pXFwuKFtjbV0/KXRzJC9pLCBmdW5jdGlvbiAobSwgdHN4LCBkLCBleHQsIGNtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0c3ggPyBwcmVzZXJ2ZUpzeCA/IFwiLmpzeFwiIDogXCIuanNcIiA6IGQgJiYgKCFleHQgfHwgIWNtKSA/IG0gOiAoZCArIGV4dCArIFwiLlwiICsgY20udG9Mb3dlckNhc2UoKSArIFwianNcIik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGF0aDtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQge1xyXG4gICAgX19leHRlbmRzOiBfX2V4dGVuZHMsXHJcbiAgICBfX2Fzc2lnbjogX19hc3NpZ24sXHJcbiAgICBfX3Jlc3Q6IF9fcmVzdCxcclxuICAgIF9fZGVjb3JhdGU6IF9fZGVjb3JhdGUsXHJcbiAgICBfX3BhcmFtOiBfX3BhcmFtLFxyXG4gICAgX19lc0RlY29yYXRlOiBfX2VzRGVjb3JhdGUsXHJcbiAgICBfX3J1bkluaXRpYWxpemVyczogX19ydW5Jbml0aWFsaXplcnMsXHJcbiAgICBfX3Byb3BLZXk6IF9fcHJvcEtleSxcclxuICAgIF9fc2V0RnVuY3Rpb25OYW1lOiBfX3NldEZ1bmN0aW9uTmFtZSxcclxuICAgIF9fbWV0YWRhdGE6IF9fbWV0YWRhdGEsXHJcbiAgICBfX2F3YWl0ZXI6IF9fYXdhaXRlcixcclxuICAgIF9fZ2VuZXJhdG9yOiBfX2dlbmVyYXRvcixcclxuICAgIF9fY3JlYXRlQmluZGluZzogX19jcmVhdGVCaW5kaW5nLFxyXG4gICAgX19leHBvcnRTdGFyOiBfX2V4cG9ydFN0YXIsXHJcbiAgICBfX3ZhbHVlczogX192YWx1ZXMsXHJcbiAgICBfX3JlYWQ6IF9fcmVhZCxcclxuICAgIF9fc3ByZWFkOiBfX3NwcmVhZCxcclxuICAgIF9fc3ByZWFkQXJyYXlzOiBfX3NwcmVhZEFycmF5cyxcclxuICAgIF9fc3ByZWFkQXJyYXk6IF9fc3ByZWFkQXJyYXksXHJcbiAgICBfX2F3YWl0OiBfX2F3YWl0LFxyXG4gICAgX19hc3luY0dlbmVyYXRvcjogX19hc3luY0dlbmVyYXRvcixcclxuICAgIF9fYXN5bmNEZWxlZ2F0b3I6IF9fYXN5bmNEZWxlZ2F0b3IsXHJcbiAgICBfX2FzeW5jVmFsdWVzOiBfX2FzeW5jVmFsdWVzLFxyXG4gICAgX19tYWtlVGVtcGxhdGVPYmplY3Q6IF9fbWFrZVRlbXBsYXRlT2JqZWN0LFxyXG4gICAgX19pbXBvcnRTdGFyOiBfX2ltcG9ydFN0YXIsXHJcbiAgICBfX2ltcG9ydERlZmF1bHQ6IF9faW1wb3J0RGVmYXVsdCxcclxuICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQ6IF9fY2xhc3NQcml2YXRlRmllbGRHZXQsXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0OiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0LFxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZEluOiBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4sXHJcbiAgICBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZTogX19hZGREaXNwb3NhYmxlUmVzb3VyY2UsXHJcbiAgICBfX2Rpc3Bvc2VSZXNvdXJjZXM6IF9fZGlzcG9zZVJlc291cmNlcyxcclxuICAgIF9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uOiBfX3Jld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbixcclxufTtcclxuIixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbF0sIm5hbWVzIjpbImZzZSIsImNyeXB0byIsInBhY2thZ2VKIiwiZnNFeHRyYSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUNwRSxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFvQixLQUFLLENBQUMsaUJBQWlCLENBQUM7UUFDNUUsTUFBTSxvQkFBb0IsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUF1QixLQUFLLENBQUMsb0JBQW9CLENBQUM7UUFFNUYsTUFBTSxpQkFBaUIsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFvQixLQUFLLENBQUMsaUJBQWlCLENBQUM7QUFFbkYsUUFBQSxNQUFNLFlBQVksQ0FBQyxXQUFXLEVBQUU7QUFFaEMsUUFBQSxXQUFXLEVBQUU7O1FBR2IsVUFBVSxDQUFDLFdBQVcsRUFBRTtRQUV4QixpQkFBaUIsQ0FBQyxVQUFVLEVBQUU7QUFDOUIsUUFBQSxNQUFNLG9CQUFvQixDQUFDLElBQUksRUFBRTs7QUFHakMsUUFBQSxNQUFNLE9BQU8sQ0FBQyxLQUFLLEVBQUU7O1FBRXJCLFlBQVksQ0FBQyxJQUFJLEVBQUU7QUFFbkIsUUFBQSxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUEsaUJBQUEsQ0FBbUIsQ0FBQzs7SUFDdkMsT0FBTyxDQUFDLEVBQUU7UUFDVixNQUFNLEdBQUcsR0FBRyxDQUFVO1FBQ3RCLFlBQVksQ0FBQyxHQUFHLENBQUM7O0FBRXJCOztBQy9EQTs7O0FBR0c7QUFRSDtBQUNBLGdCQUFnQixDQUFDLE9BQU8sRUFBRTtBQUUxQjtBQUNBLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUM7QUFFN0IsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUscUJBQXFCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBSztBQUNwRCxJQUFBLEdBQUcsRUFBRTtBQUNQLENBQUMsQ0FBQztBQUVGLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLE1BQUs7QUFDbEQsSUFBQSxLQUFLLEVBQUU7QUFDVCxDQUFDLENBQUM7QUFFRixHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUM7QUFDaEMsR0FBRyxDQUFDLElBQUksRUFBRTtBQUNWLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUV2QyxJQUFJLEdBQUcsQ0FBQyxjQUFjLEtBQUssU0FBUyxFQUFFO0lBQ3BDLEdBQUcsQ0FBQyxVQUFVLEVBQUU7QUFDbEI7S0FBTztBQUNMLElBQUEsTUFBTSxHQUFHLENBQUMsaUJBQWlCLEVBQUU7QUFDL0IiLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMF19