create-payload-app 0.5.2 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/index.js +10 -53
- package/dist/lib/configure-payload-config.js +97 -148
- package/dist/lib/create-project.js +101 -174
- package/dist/lib/create-project.spec.js +148 -172
- package/dist/lib/generate-secret.js +12 -44
- package/dist/lib/packages.js +52 -32
- package/dist/lib/parse-project-name.js +29 -67
- package/dist/lib/parse-template.js +42 -80
- package/dist/lib/select-db.js +62 -105
- package/dist/lib/templates.js +63 -97
- package/dist/lib/write-env-file.js +51 -106
- package/dist/main.js +118 -198
- package/dist/types.js +5 -1
- package/dist/utils/log.js +40 -19
- package/dist/utils/messages.js +71 -73
- package/package.json +8 -39
- package/.vscode/launch.json +0 -13
@@ -1,184 +1,111 @@
|
|
1
1
|
"use strict";
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
3
|
+
value: true
|
4
|
+
});
|
5
|
+
function _export(target, all) {
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
7
|
+
enumerable: true,
|
8
|
+
get: all[name]
|
9
9
|
});
|
10
|
-
}
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
function
|
16
|
-
|
17
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
18
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
19
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
20
|
-
switch (op[0]) {
|
21
|
-
case 0: case 1: t = op; break;
|
22
|
-
case 4: _.label++; return { value: op[1], done: false };
|
23
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
24
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
25
|
-
default:
|
26
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
27
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
28
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
29
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
30
|
-
if (t[2]) _.ops.pop();
|
31
|
-
_.trys.pop(); continue;
|
32
|
-
}
|
33
|
-
op = body.call(thisArg, _);
|
34
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
35
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
10
|
+
}
|
11
|
+
_export(exports, {
|
12
|
+
createProject: function() {
|
13
|
+
return createProject;
|
14
|
+
},
|
15
|
+
updatePackageJSON: function() {
|
16
|
+
return updatePackageJSON;
|
36
17
|
}
|
37
|
-
};
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
var configure_payload_config_1 = require("./configure-payload-config");
|
51
|
-
function createOrFindProjectDir(projectDir) {
|
52
|
-
return __awaiter(this, void 0, void 0, function () {
|
53
|
-
var pathExists;
|
54
|
-
return __generator(this, function (_a) {
|
55
|
-
switch (_a.label) {
|
56
|
-
case 0: return [4 /*yield*/, fs_extra_1.default.pathExists(projectDir)];
|
57
|
-
case 1:
|
58
|
-
pathExists = _a.sent();
|
59
|
-
if (!!pathExists) return [3 /*break*/, 3];
|
60
|
-
return [4 /*yield*/, fs_extra_1.default.mkdir(projectDir)];
|
61
|
-
case 2:
|
62
|
-
_a.sent();
|
63
|
-
_a.label = 3;
|
64
|
-
case 3: return [2 /*return*/];
|
65
|
-
}
|
66
|
-
});
|
67
|
-
});
|
18
|
+
});
|
19
|
+
const _chalk = /*#__PURE__*/ _interop_require_default(require("chalk"));
|
20
|
+
const _degit = /*#__PURE__*/ _interop_require_default(require("degit"));
|
21
|
+
const _execa = /*#__PURE__*/ _interop_require_default(require("execa"));
|
22
|
+
const _fsextra = /*#__PURE__*/ _interop_require_default(require("fs-extra"));
|
23
|
+
const _ora = /*#__PURE__*/ _interop_require_default(require("ora"));
|
24
|
+
const _path = /*#__PURE__*/ _interop_require_default(require("path"));
|
25
|
+
const _log = require("../utils/log");
|
26
|
+
const _configurepayloadconfig = require("./configure-payload-config");
|
27
|
+
function _interop_require_default(obj) {
|
28
|
+
return obj && obj.__esModule ? obj : {
|
29
|
+
default: obj
|
30
|
+
};
|
68
31
|
}
|
69
|
-
function
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
case 0:
|
75
|
-
cliArgs = args.cliArgs, projectDir = args.projectDir, packageManager = args.packageManager;
|
76
|
-
if (cliArgs['--no-deps']) {
|
77
|
-
return [2 /*return*/, true];
|
78
|
-
}
|
79
|
-
installCmd = 'npm install --legacy-peer-deps';
|
80
|
-
if (packageManager === 'yarn') {
|
81
|
-
installCmd = 'yarn';
|
82
|
-
}
|
83
|
-
else if (packageManager === 'pnpm') {
|
84
|
-
installCmd = 'pnpm install';
|
85
|
-
}
|
86
|
-
_a.label = 1;
|
87
|
-
case 1:
|
88
|
-
_a.trys.push([1, 3, , 4]);
|
89
|
-
return [4 /*yield*/, execa_1.default.command(installCmd, {
|
90
|
-
cwd: path_1.default.resolve(projectDir),
|
91
|
-
})];
|
92
|
-
case 2:
|
93
|
-
_a.sent();
|
94
|
-
return [2 /*return*/, true];
|
95
|
-
case 3:
|
96
|
-
err_1 = _a.sent();
|
97
|
-
console.log({ err: err_1 });
|
98
|
-
return [2 /*return*/, false];
|
99
|
-
case 4: return [2 /*return*/];
|
100
|
-
}
|
101
|
-
});
|
102
|
-
});
|
32
|
+
async function createOrFindProjectDir(projectDir) {
|
33
|
+
const pathExists = await _fsextra.default.pathExists(projectDir);
|
34
|
+
if (!pathExists) {
|
35
|
+
await _fsextra.default.mkdir(projectDir);
|
36
|
+
}
|
103
37
|
}
|
104
|
-
function
|
105
|
-
|
106
|
-
|
107
|
-
return
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
return [4 /*yield*/, updatePackageJSON({ projectName: projectName, projectDir: projectDir })];
|
124
|
-
case 4:
|
125
|
-
_a.sent();
|
126
|
-
return [4 /*yield*/, (0, configure_payload_config_1.configurePayloadConfig)({ projectDir: projectDir, dbDetails: dbDetails })
|
127
|
-
// Remove yarn.lock file. This is only desired in Payload Cloud.
|
128
|
-
];
|
129
|
-
case 5:
|
130
|
-
_a.sent();
|
131
|
-
lockPath = path_1.default.resolve(projectDir, 'yarn.lock');
|
132
|
-
if (!fs_extra_1.default.existsSync(lockPath)) return [3 /*break*/, 7];
|
133
|
-
return [4 /*yield*/, fs_extra_1.default.remove(lockPath)];
|
134
|
-
case 6:
|
135
|
-
_a.sent();
|
136
|
-
_a.label = 7;
|
137
|
-
case 7:
|
138
|
-
spinner.text = 'Installing dependencies...';
|
139
|
-
return [4 /*yield*/, installDeps({ cliArgs: cliArgs, projectDir: projectDir, packageManager: packageManager })];
|
140
|
-
case 8:
|
141
|
-
result = _a.sent();
|
142
|
-
spinner.stop();
|
143
|
-
spinner.clear();
|
144
|
-
if (result) {
|
145
|
-
(0, log_1.success)('Dependencies installed');
|
146
|
-
}
|
147
|
-
else {
|
148
|
-
(0, log_1.error)('Error installing dependencies');
|
149
|
-
}
|
150
|
-
return [2 /*return*/];
|
151
|
-
}
|
38
|
+
async function installDeps(args) {
|
39
|
+
const { cliArgs, packageManager, projectDir } = args;
|
40
|
+
if (cliArgs['--no-deps']) {
|
41
|
+
return true;
|
42
|
+
}
|
43
|
+
let installCmd = 'npm install --legacy-peer-deps';
|
44
|
+
if (packageManager === 'yarn') {
|
45
|
+
installCmd = 'yarn';
|
46
|
+
} else if (packageManager === 'pnpm') {
|
47
|
+
installCmd = 'pnpm install';
|
48
|
+
}
|
49
|
+
try {
|
50
|
+
await _execa.default.command(installCmd, {
|
51
|
+
cwd: _path.default.resolve(projectDir)
|
52
|
+
});
|
53
|
+
return true;
|
54
|
+
} catch (err) {
|
55
|
+
console.log({
|
56
|
+
err
|
152
57
|
});
|
58
|
+
return false;
|
59
|
+
}
|
60
|
+
}
|
61
|
+
async function createProject(args) {
|
62
|
+
const { cliArgs, dbDetails, packageManager, projectDir, projectName, template } = args;
|
63
|
+
await createOrFindProjectDir(projectDir);
|
64
|
+
console.log(`\n Creating project in ${_chalk.default.green(_path.default.resolve(projectDir))}\n`);
|
65
|
+
if ('url' in template) {
|
66
|
+
const emitter = (0, _degit.default)(template.url);
|
67
|
+
await emitter.clone(projectDir);
|
68
|
+
}
|
69
|
+
const spinner = (0, _ora.default)('Checking latest Payload version...').start();
|
70
|
+
await updatePackageJSON({
|
71
|
+
projectDir,
|
72
|
+
projectName
|
153
73
|
});
|
74
|
+
await (0, _configurepayloadconfig.configurePayloadConfig)({
|
75
|
+
dbDetails,
|
76
|
+
projectDir
|
77
|
+
});
|
78
|
+
// Remove yarn.lock file. This is only desired in Payload Cloud.
|
79
|
+
const lockPath = _path.default.resolve(projectDir, 'yarn.lock');
|
80
|
+
if (_fsextra.default.existsSync(lockPath)) {
|
81
|
+
await _fsextra.default.remove(lockPath);
|
82
|
+
}
|
83
|
+
spinner.text = 'Installing dependencies...';
|
84
|
+
const result = await installDeps({
|
85
|
+
cliArgs,
|
86
|
+
packageManager,
|
87
|
+
projectDir
|
88
|
+
});
|
89
|
+
spinner.stop();
|
90
|
+
spinner.clear();
|
91
|
+
if (result) {
|
92
|
+
(0, _log.success)('Dependencies installed');
|
93
|
+
} else {
|
94
|
+
(0, _log.error)('Error installing dependencies');
|
95
|
+
}
|
154
96
|
}
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
packageJsonPath = path_1.default.resolve(projectDir, 'package.json');
|
164
|
-
_a.label = 1;
|
165
|
-
case 1:
|
166
|
-
_a.trys.push([1, 4, , 5]);
|
167
|
-
return [4 /*yield*/, fs_extra_1.default.readJson(packageJsonPath)];
|
168
|
-
case 2:
|
169
|
-
packageObj = _a.sent();
|
170
|
-
packageObj.name = projectName;
|
171
|
-
return [4 /*yield*/, fs_extra_1.default.writeJson(packageJsonPath, packageObj, { spaces: 2 })];
|
172
|
-
case 3:
|
173
|
-
_a.sent();
|
174
|
-
return [3 /*break*/, 5];
|
175
|
-
case 4:
|
176
|
-
err_2 = _a.sent();
|
177
|
-
(0, log_1.warning)('Unable to update name in package.json');
|
178
|
-
return [3 /*break*/, 5];
|
179
|
-
case 5: return [2 /*return*/];
|
180
|
-
}
|
97
|
+
async function updatePackageJSON(args) {
|
98
|
+
const { projectDir, projectName } = args;
|
99
|
+
const packageJsonPath = _path.default.resolve(projectDir, 'package.json');
|
100
|
+
try {
|
101
|
+
const packageObj = await _fsextra.default.readJson(packageJsonPath);
|
102
|
+
packageObj.name = projectName;
|
103
|
+
await _fsextra.default.writeJson(packageJsonPath, packageObj, {
|
104
|
+
spaces: 2
|
181
105
|
});
|
182
|
-
})
|
106
|
+
} catch (err) {
|
107
|
+
(0, _log.warning)('Unable to update name in package.json');
|
108
|
+
}
|
183
109
|
}
|
184
|
-
|
110
|
+
|
111
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvY3JlYXRlLXByb2plY3QudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xuaW1wb3J0IGRlZ2l0IGZyb20gJ2RlZ2l0J1xuaW1wb3J0IGV4ZWNhIGZyb20gJ2V4ZWNhJ1xuaW1wb3J0IGZzZSBmcm9tICdmcy1leHRyYSdcbmltcG9ydCBvcmEgZnJvbSAnb3JhJ1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcblxuaW1wb3J0IHR5cGUgeyBDbGlBcmdzLCBEYkRldGFpbHMsIFBhY2thZ2VNYW5hZ2VyLCBQcm9qZWN0VGVtcGxhdGUgfSBmcm9tICcuLi90eXBlcydcblxuaW1wb3J0IHsgZXJyb3IsIHN1Y2Nlc3MsIHdhcm5pbmcgfSBmcm9tICcuLi91dGlscy9sb2cnXG5pbXBvcnQgeyBjb25maWd1cmVQYXlsb2FkQ29uZmlnIH0gZnJvbSAnLi9jb25maWd1cmUtcGF5bG9hZC1jb25maWcnXG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU9yRmluZFByb2plY3REaXIocHJvamVjdERpcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBhdGhFeGlzdHMgPSBhd2FpdCBmc2UucGF0aEV4aXN0cyhwcm9qZWN0RGlyKVxuICBpZiAoIXBhdGhFeGlzdHMpIHtcbiAgICBhd2FpdCBmc2UubWtkaXIocHJvamVjdERpcilcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBpbnN0YWxsRGVwcyhhcmdzOiB7XG4gIGNsaUFyZ3M6IENsaUFyZ3NcbiAgcGFja2FnZU1hbmFnZXI6IFBhY2thZ2VNYW5hZ2VyXG4gIHByb2plY3REaXI6IHN0cmluZ1xufSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCB7IGNsaUFyZ3MsIHBhY2thZ2VNYW5hZ2VyLCBwcm9qZWN0RGlyIH0gPSBhcmdzXG4gIGlmIChjbGlBcmdzWyctLW5vLWRlcHMnXSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgbGV0IGluc3RhbGxDbWQgPSAnbnBtIGluc3RhbGwgLS1sZWdhY3ktcGVlci1kZXBzJ1xuXG4gIGlmIChwYWNrYWdlTWFuYWdlciA9PT0gJ3lhcm4nKSB7XG4gICAgaW5zdGFsbENtZCA9ICd5YXJuJ1xuICB9IGVsc2UgaWYgKHBhY2thZ2VNYW5hZ2VyID09PSAncG5wbScpIHtcbiAgICBpbnN0YWxsQ21kID0gJ3BucG0gaW5zdGFsbCdcbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgZXhlY2EuY29tbWFuZChpbnN0YWxsQ21kLCB7XG4gICAgICBjd2Q6IHBhdGgucmVzb2x2ZShwcm9qZWN0RGlyKSxcbiAgICB9KVxuICAgIHJldHVybiB0cnVlXG4gIH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuICAgIGNvbnNvbGUubG9nKHsgZXJyIH0pXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVByb2plY3QoYXJnczoge1xuICBjbGlBcmdzOiBDbGlBcmdzXG4gIGRiRGV0YWlscz86IERiRGV0YWlsc1xuICBwYWNrYWdlTWFuYWdlcjogUGFja2FnZU1hbmFnZXJcbiAgcHJvamVjdERpcjogc3RyaW5nXG4gIHByb2plY3ROYW1lOiBzdHJpbmdcbiAgdGVtcGxhdGU6IFByb2plY3RUZW1wbGF0ZVxufSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGNsaUFyZ3MsIGRiRGV0YWlscywgcGFja2FnZU1hbmFnZXIsIHByb2plY3REaXIsIHByb2plY3ROYW1lLCB0ZW1wbGF0ZSB9ID0gYXJnc1xuXG4gIGF3YWl0IGNyZWF0ZU9yRmluZFByb2plY3REaXIocHJvamVjdERpcilcblxuICBjb25zb2xlLmxvZyhgXFxuICBDcmVhdGluZyBwcm9qZWN0IGluICR7Y2hhbGsuZ3JlZW4ocGF0aC5yZXNvbHZlKHByb2plY3REaXIpKX1cXG5gKVxuXG4gIGlmICgndXJsJyBpbiB0ZW1wbGF0ZSkge1xuICAgIGNvbnN0IGVtaXR0ZXIgPSBkZWdpdCh0ZW1wbGF0ZS51cmwpXG4gICAgYXdhaXQgZW1pdHRlci5jbG9uZShwcm9qZWN0RGlyKVxuICB9XG5cbiAgY29uc3Qgc3Bpbm5lciA9IG9yYSgnQ2hlY2tpbmcgbGF0ZXN0IFBheWxvYWQgdmVyc2lvbi4uLicpLnN0YXJ0KClcblxuICBhd2FpdCB1cGRhdGVQYWNrYWdlSlNPTih7IHByb2plY3REaXIsIHByb2plY3ROYW1lIH0pXG4gIGF3YWl0IGNvbmZpZ3VyZVBheWxvYWRDb25maWcoeyBkYkRldGFpbHMsIHByb2plY3REaXIgfSlcblxuICAvLyBSZW1vdmUgeWFybi5sb2NrIGZpbGUuIFRoaXMgaXMgb25seSBkZXNpcmVkIGluIFBheWxvYWQgQ2xvdWQuXG4gIGNvbnN0IGxvY2tQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3REaXIsICd5YXJuLmxvY2snKVxuICBpZiAoZnNlLmV4aXN0c1N5bmMobG9ja1BhdGgpKSB7XG4gICAgYXdhaXQgZnNlLnJlbW92ZShsb2NrUGF0aClcbiAgfVxuXG4gIHNwaW5uZXIudGV4dCA9ICdJbnN0YWxsaW5nIGRlcGVuZGVuY2llcy4uLidcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaW5zdGFsbERlcHMoeyBjbGlBcmdzLCBwYWNrYWdlTWFuYWdlciwgcHJvamVjdERpciB9KVxuICBzcGlubmVyLnN0b3AoKVxuICBzcGlubmVyLmNsZWFyKClcbiAgaWYgKHJlc3VsdCkge1xuICAgIHN1Y2Nlc3MoJ0RlcGVuZGVuY2llcyBpbnN0YWxsZWQnKVxuICB9IGVsc2Uge1xuICAgIGVycm9yKCdFcnJvciBpbnN0YWxsaW5nIGRlcGVuZGVuY2llcycpXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVBhY2thZ2VKU09OKGFyZ3M6IHtcbiAgcHJvamVjdERpcjogc3RyaW5nXG4gIHByb2plY3ROYW1lOiBzdHJpbmdcbn0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBwcm9qZWN0RGlyLCBwcm9qZWN0TmFtZSB9ID0gYXJnc1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdERpciwgJ3BhY2thZ2UuanNvbicpXG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZU9iaiA9IGF3YWl0IGZzZS5yZWFkSnNvbihwYWNrYWdlSnNvblBhdGgpXG4gICAgcGFja2FnZU9iai5uYW1lID0gcHJvamVjdE5hbWVcbiAgICBhd2FpdCBmc2Uud3JpdGVKc29uKHBhY2thZ2VKc29uUGF0aCwgcGFja2FnZU9iaiwgeyBzcGFjZXM6IDIgfSlcbiAgfSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG4gICAgd2FybmluZygnVW5hYmxlIHRvIHVwZGF0ZSBuYW1lIGluIHBhY2thZ2UuanNvbicpXG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJjcmVhdGVQcm9qZWN0IiwidXBkYXRlUGFja2FnZUpTT04iLCJjcmVhdGVPckZpbmRQcm9qZWN0RGlyIiwicHJvamVjdERpciIsInBhdGhFeGlzdHMiLCJmc2UiLCJta2RpciIsImluc3RhbGxEZXBzIiwiYXJncyIsImNsaUFyZ3MiLCJwYWNrYWdlTWFuYWdlciIsImluc3RhbGxDbWQiLCJleGVjYSIsImNvbW1hbmQiLCJjd2QiLCJwYXRoIiwicmVzb2x2ZSIsImVyciIsImNvbnNvbGUiLCJsb2ciLCJkYkRldGFpbHMiLCJwcm9qZWN0TmFtZSIsInRlbXBsYXRlIiwiY2hhbGsiLCJncmVlbiIsImVtaXR0ZXIiLCJkZWdpdCIsInVybCIsImNsb25lIiwic3Bpbm5lciIsIm9yYSIsInN0YXJ0IiwiY29uZmlndXJlUGF5bG9hZENvbmZpZyIsImxvY2tQYXRoIiwiZXhpc3RzU3luYyIsInJlbW92ZSIsInRleHQiLCJyZXN1bHQiLCJzdG9wIiwiY2xlYXIiLCJzdWNjZXNzIiwiZXJyb3IiLCJwYWNrYWdlSnNvblBhdGgiLCJwYWNrYWdlT2JqIiwicmVhZEpzb24iLCJuYW1lIiwid3JpdGVKc29uIiwic3BhY2VzIiwid2FybmluZyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7SUErQ3NCQSxhQUFhO2VBQWJBOztJQXlDQUMsaUJBQWlCO2VBQWpC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
|