1 | /**
|
2 | * @license
|
3 | * Copyright Google LLC All Rights Reserved.
|
4 | *
|
5 | * Use of this source code is governed by an MIT-style license that can be
|
6 | * found in the LICENSE file at https://angular.io/license
|
7 | */
|
8 | import { SchematicsException } from '@angular-devkit/schematics';
|
9 | import { readWorkspace } from '@schematics/angular/utility';
|
10 | import * as ts from 'typescript';
|
11 | export async function getProject(host, projectName) {
|
12 | const workspace = await readWorkspace(host);
|
13 | const project = workspace.projects.get(projectName);
|
14 | if (!project || project.extensions.projectType !== 'application') {
|
15 | throw new SchematicsException(`Universal requires a project type of 'application'.`);
|
16 | }
|
17 | return project;
|
18 | }
|
19 | export function stripTsExtension(file) {
|
20 | return file.replace(/\.ts$/, '');
|
21 | }
|
22 | export async function getOutputPath(host, projectName, target) {
|
23 | // Generate new output paths
|
24 | const project = await getProject(host, projectName);
|
25 | const serverTarget = project.targets.get(target);
|
26 | if (!serverTarget || !serverTarget.options) {
|
27 | throw new SchematicsException(`Cannot find 'options' for ${projectName} ${target} target.`);
|
28 | }
|
29 | const { outputPath } = serverTarget.options;
|
30 | if (typeof outputPath !== 'string') {
|
31 | throw new SchematicsException(`outputPath for ${projectName} ${target} target is not a string.`);
|
32 | }
|
33 | return outputPath;
|
34 | }
|
35 | export function findImport(sourceFile, moduleName, symbolName) {
|
36 | // Only look through the top-level imports.
|
37 | for (const node of sourceFile.statements) {
|
38 | if (!ts.isImportDeclaration(node) ||
|
39 | !ts.isStringLiteral(node.moduleSpecifier) ||
|
40 | node.moduleSpecifier.text !== moduleName) {
|
41 | continue;
|
42 | }
|
43 | const namedBindings = node.importClause && node.importClause.namedBindings;
|
44 | if (!namedBindings || !ts.isNamedImports(namedBindings)) {
|
45 | continue;
|
46 | }
|
47 | if (namedBindings.elements.some((element) => element.name.text === symbolName)) {
|
48 | return namedBindings;
|
49 | }
|
50 | }
|
51 | return null;
|
52 | }
|
53 | /** Gets import information about the specified identifier by using the Type checker. */
|
54 | export function getImportOfIdentifier(typeChecker, node) {
|
55 | const symbol = typeChecker.getSymbolAtLocation(node);
|
56 | if (!symbol || !symbol.declarations.length) {
|
57 | return null;
|
58 | }
|
59 | const decl = symbol.declarations[0];
|
60 | if (!ts.isImportSpecifier(decl)) {
|
61 | return null;
|
62 | }
|
63 | const importDecl = decl.parent.parent.parent;
|
64 | if (!ts.isStringLiteral(importDecl.moduleSpecifier)) {
|
65 | return null;
|
66 | }
|
67 | return {
|
68 | // Handles aliased imports: e.g. "import {Component as myComp} from ...";
|
69 | name: decl.propertyName ? decl.propertyName.text : decl.name.text,
|
70 | importModule: importDecl.moduleSpecifier.text,
|
71 | node: importDecl,
|
72 | };
|
73 | }
|
74 | export function addInitialNavigation(node) {
|
75 | const existingOptions = node.arguments[1];
|
76 | // If the user has explicitly set initialNavigation, we respect that
|
77 | if (existingOptions &&
|
78 | existingOptions.properties.some((exp) => ts.isPropertyAssignment(exp) &&
|
79 | ts.isIdentifier(exp.name) &&
|
80 | exp.name.text === 'initialNavigation')) {
|
81 | return node;
|
82 | }
|
83 | const enabledLiteral = ts.factory.createStringLiteral('enabledBlocking');
|
84 | // TypeScript will emit the Node with double quotes.
|
85 | // In schematics we usually write code with a single quotes
|
86 | // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
87 | enabledLiteral.singleQuote = true;
|
88 | const initialNavigationProperty = ts.factory.createPropertyAssignment('initialNavigation', enabledLiteral);
|
89 | const routerOptions = existingOptions
|
90 | ? ts.factory.updateObjectLiteralExpression(existingOptions, ts.factory.createNodeArray([...existingOptions.properties, initialNavigationProperty]))
|
91 | : ts.factory.createObjectLiteralExpression([initialNavigationProperty], true);
|
92 | const args = [node.arguments[0], routerOptions];
|
93 | return ts.factory.createCallExpression(node.expression, node.typeArguments, args);
|
94 | }
|
95 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9tb2R1bGVzL2V4cHJlc3MtZW5naW5lL3NjaGVtYXRpY3MvdXRpbHMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBR0gsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFakUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzVELE9BQU8sS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRWpDLE1BQU0sQ0FBQyxLQUFLLFVBQVUsVUFBVSxDQUM5QixJQUFVLEVBQ1YsV0FBbUI7SUFFbkIsTUFBTSxTQUFTLEdBQUcsTUFBTSxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7SUFFcEQsSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLFdBQVcsS0FBSyxhQUFhLEVBQUU7UUFDaEUsTUFBTSxJQUFJLG1CQUFtQixDQUFDLHFEQUFxRCxDQUFDLENBQUM7S0FDdEY7SUFFRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUFDLElBQVk7SUFDM0MsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxhQUFhLENBQ2pDLElBQVUsRUFDVixXQUFtQixFQUNuQixNQUEwQjtJQUUxQiw0QkFBNEI7SUFDNUIsTUFBTSxPQUFPLEdBQUcsTUFBTSxVQUFVLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3BELE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1B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RSxDQUNOLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUM7WUFDNUIsRUFBRSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO1lBQ3pCLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLG1CQUFtQixDQUN4QyxFQUNEO1FBQ0EsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUVELE1BQU0sY0FBYyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUN6RSxvREFBb0Q7SUFDcEQsMkRBQTJEO0lBQzNELDhEQUE4RDtJQUM3RCxjQUFzQixDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7SUFFM0MsTUFBTSx5QkFBeUIsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLHdCQUF3QixDQUNuRSxtQkFBbUIsRUFDbkIsY0FBYyxDQUNmLENBQUM7SUFDRixNQUFNLGFBQWEsR0FBRyxlQUFlO1FBQ25DLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLDZCQUE2QixDQUN0QyxlQUFlLEVBQ2YsRUFBRSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxVQUFVLEVBQUUseUJBQXlCLENBQUMsQ0FBQyxDQUN2RjtRQUNILENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLENBQUMseUJBQXlCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNoRixNQUFNLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFFaEQsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNwRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7IHdvcmtzcGFjZXMgfSBmcm9tICdAYW5ndWxhci1kZXZraXQvY29yZSc7XG5pbXBvcnQgeyBTY2hlbWF0aWNzRXhjZXB0aW9uIH0gZnJvbSAnQGFuZ3VsYXItZGV2a2l0L3NjaGVtYXRpY3MnO1xuaW1wb3J0IHsgVHJlZSB9IGZyb20gJ0Bhbmd1bGFyLWRldmtpdC9zY2hlbWF0aWNzL3NyYy90cmVlL2ludGVyZmFjZSc7XG5pbXBvcnQgeyByZWFkV29ya3NwYWNlIH0gZnJvbSAnQHNjaGVtYXRpY3MvYW5ndWxhci91dGlsaXR5JztcbmltcG9ydCAqIGFzIHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UHJvamVjdChcbiAgaG9zdDogVHJlZSxcbiAgcHJvamVjdE5hbWU6IHN0cmluZyxcbik6IFByb21pc2U8d29ya3NwYWNlcy5Qcm9qZWN0RGVmaW5pdGlvbj4ge1xuICBjb25zdCB3b3Jrc3BhY2UgPSBhd2FpdCByZWFkV29ya3NwYWNlKGhvc3QpO1xuICBjb25zdCBwcm9qZWN0ID0gd29ya3NwYWNlLnByb2plY3RzLmdldChwcm9qZWN0TmFtZSk7XG5cbiAgaWYgKCFwcm9qZWN0IHx8IHByb2plY3QuZXh0ZW5zaW9ucy5wcm9qZWN0VHlwZSAhPT0gJ2FwcGxpY2F0aW9uJykge1xuICAgIHRocm93IG5ldyBTY2hlbWF0aWNzRXhjZXB0aW9uKGBVbml2ZXJzYWwgcmVxdWlyZXMgYSBwcm9qZWN0IHR5cGUgb2YgJ2FwcGxpY2F0aW9uJy5gKTtcbiAgfVxuXG4gIHJldHVybiBwcm9qZWN0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyaXBUc0V4dGVuc2lvbihmaWxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZmlsZS5yZXBsYWNlKC9cXC50cyQvLCAnJyk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRPdXRwdXRQYXRoKFxuICBob3N0OiBUcmVlLFxuICBwcm9qZWN0TmFtZTogc3RyaW5nLFxuICB0YXJnZXQ6ICdzZXJ2ZXInIHwgJ2J1aWxkJyxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIC8vIEdlbmVyYXRlIG5ldyBvdXRwdXQgcGF0aHNcbiAgY29uc3QgcHJvamVjdCA9IGF3YWl0IGdldFByb2plY3QoaG9zdCwgcHJvamVjdE5hbWUpO1xuICBjb25zdCBzZXJ2ZXJUYXJnZXQgPSBwcm9qZWN0LnRhcmdldHMuZ2V0KHRhcmdldCk7XG4gIGlmICghc2VydmVyVGFyZ2V0IHx8ICFzZXJ2ZXJUYXJnZXQub3B0aW9ucykge1xuICAgIHRocm93IG5ldyBTY2hlbWF0aWNzRXhjZXB0aW9uKGBDYW5ub3QgZmluZCAnb3B0aW9ucycgZm9yICR7cHJvamVjdE5hbWV9ICR7dGFyZ2V0fSB0YXJnZXQuYCk7XG4gIH1cblxuICBjb25zdCB7IG91dHB1dFBhdGggfSA9IHNlcnZlclRhcmdldC5vcHRpb25zO1xuICBpZiAodHlwZW9mIG91dHB1dFBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFNjaGVtYXRpY3NFeGNlcHRpb24oXG4gICAgICBgb3V0cHV0UGF0aCBmb3IgJHtwcm9qZWN0TmFtZX0gJHt0YXJnZXR9IHRhcmdldCBpcyBub3QgYSBzdHJpbmcuYCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG91dHB1dFBhdGg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kSW1wb3J0KFxuICBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlLFxuICBtb2R1bGVOYW1lOiBzdHJpbmcsXG4gIHN5bWJvbE5hbWU6IHN0cmluZyxcbik6IHRzLk5hbWVkSW1wb3J0cyB8IG51bGwge1xuICAvLyBPbmx5IGxvb2sgdGhyb3VnaCB0aGUgdG9wLWxldmVsIGltcG9ydHMuXG4gIGZvciAoY29uc3Qgbm9kZSBvZiBzb3VyY2VGaWxlLnN0YXRlbWVudHMpIHtcbiAgICBpZiAoXG4gICAgICAhdHMuaXNJbXBvcnREZWNsYXJhdGlvbihub2RlKSB8fFxuICAgICAgIXRzLmlzU3RyaW5nTGl0ZXJhbChub2RlLm1vZHVsZVNwZWNpZmllcikgfHxcbiAgICAgIG5vZGUubW9kdWxlU3BlY2lmaWVyLnRleHQgIT09IG1vZHVsZU5hbWVcbiAgICApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG5hbWVkQmluZGluZ3MgPSBub2RlLmltcG9ydENsYXVzZSAmJiBub2RlLmltcG9ydENsYXVzZS5uYW1lZEJpbmRpbmdzO1xuXG4gICAgaWYgKCFuYW1lZEJpbmRpbmdzIHx8ICF0cy5pc05hbWVkSW1wb3J0cyhuYW1lZEJpbmRpbmdzKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKG5hbWVkQmluZGluZ3MuZWxlbWVudHMuc29tZSgoZWxlbWVudCkgPT4gZWxlbWVudC5uYW1lLnRleHQgPT09IHN5bWJvbE5hbWUpKSB7XG4gICAgICByZXR1cm4gbmFtZWRCaW5kaW5ncztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IHR5cGUgSW1wb3J0ID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGltcG9ydE1vZHVsZTogc3RyaW5nO1xuICBub2RlOiB0cy5JbXBvcnREZWNsYXJhdGlvbjtcbn07XG5cbi8qKiBHZXRzIGltcG9ydCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3BlY2lmaWVkIGlkZW50aWZpZXIgYnkgdXNpbmcgdGhlIFR5cGUgY2hlY2tlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbXBvcnRPZklkZW50aWZpZXIoXG4gIHR5cGVDaGVja2VyOiB0cy5UeXBlQ2hlY2tlcixcbiAgbm9kZTogdHMuSWRlbnRpZmllcixcbik6IEltcG9ydCB8IG51bGwge1xuICBjb25zdCBzeW1ib2wgPSB0eXBlQ2hlY2tlci5nZXRTeW1ib2xBdExvY2F0aW9uKG5vZGUpO1xuXG4gIGlmICghc3ltYm9sIHx8ICFzeW1ib2wuZGVjbGFyYXRpb25zLmxlbmd0aCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZGVjbCA9IHN5bWJvbC5kZWNsYXJhdGlvbnNbMF07XG5cbiAgaWYgKCF0cy5pc0ltcG9ydFNwZWNpZmllcihkZWNsKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgaW1wb3J0RGVjbCA9IGRlY2wucGFyZW50LnBhcmVudC5wYXJlbnQ7XG5cbiAgaWYgKCF0cy5pc1N0cmluZ0xpdGVyYWwoaW1wb3J0RGVjbC5tb2R1bGVTcGVjaWZpZXIpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC8vIEhhbmRsZXMgYWxpYXNlZCBpbXBvcnRzOiBlLmcuIFwiaW1wb3J0IHtDb21wb25lbnQgYXMgbXlDb21wfSBmcm9tIC4uLlwiO1xuICAgIG5hbWU6IGRlY2wucHJvcGVydHlOYW1lID8gZGVjbC5wcm9wZXJ0eU5hbWUudGV4dCA6IGRlY2wubmFtZS50ZXh0LFxuICAgIGltcG9ydE1vZHVsZTogaW1wb3J0RGVjbC5tb2R1bGVTcGVjaWZpZXIudGV4dCxcbiAgICBub2RlOiBpbXBvcnREZWNsLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkSW5pdGlhbE5hdmlnYXRpb24obm9kZTogdHMuQ2FsbEV4cHJlc3Npb24pOiB0cy5DYWxsRXhwcmVzc2lvbiB7XG4gIGNvbnN0IGV4aXN0aW5nT3B0aW9ucyA9IG5vZGUuYXJndW1lbnRzWzFdIGFzIHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkO1xuXG4gIC8vIElmIHRoZSB1c2VyIGhhcyBleHBsaWNpdGx5IHNldCBpbml0aWFsTmF2aWdhdGlvbiwgd2UgcmVzcGVjdCB0aGF0XG4gIGlmIChcbiAgICBleGlzdGluZ09wdGlvbnMgJiZcbiAgICBleGlzdGluZ09wdGlvbnMucHJvcGVydGllcy5zb21lKFxuICAgICAgKGV4cCkgPT5cbiAgICAgICAgdHMuaXNQcm9wZXJ0eUFzc2lnbm1lbnQoZXhwKSAmJlxuICAgICAgICB0cy5pc0lkZW50aWZpZXIoZXhwLm5hbWUpICYmXG4gICAgICAgIGV4cC5uYW1lLnRleHQgPT09ICdpbml0aWFsTmF2aWdhdGlvbicsXG4gICAgKVxuICApIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIGNvbnN0IGVuYWJsZWRMaXRlcmFsID0gdHMuZmFjdG9yeS5jcmVhdGVTdHJpbmdMaXRlcmFsKCdlbmFibGVkQmxvY2tpbmcnKTtcbiAgLy8gVHlwZVNjcmlwdCB3aWxsIGVtaXQgdGhlIE5vZGUgd2l0aCBkb3VibGUgcXVvdGVzLlxuICAvLyBJbiBzY2hlbWF0aWNzIHdlIHVzdWFsbHkgd3JpdGUgY29kZSB3aXRoIGEgc2luZ2xlIHF1b3Rlc1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAoZW5hYmxlZExpdGVyYWwgYXMgYW55KS5zaW5nbGVRdW90ZSA9IHRydWU7XG5cbiAgY29uc3QgaW5pdGlhbE5hdmlnYXRpb25Qcm9wZXJ0eSA9IHRzLmZhY3RvcnkuY3JlYXRlUHJvcGVydHlBc3NpZ25tZW50KFxuICAgICdpbml0aWFsTmF2aWdhdGlvbicsXG4gICAgZW5hYmxlZExpdGVyYWwsXG4gICk7XG4gIGNvbnN0IHJvdXRlck9wdGlvbnMgPSBleGlzdGluZ09wdGlvbnNcbiAgICA/IHRzLmZhY3RvcnkudXBkYXRlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oXG4gICAgICAgIGV4aXN0aW5nT3B0aW9ucyxcbiAgICAgICAgdHMuZmFjdG9yeS5jcmVhdGVOb2RlQXJyYXkoWy4uLmV4aXN0aW5nT3B0aW9ucy5wcm9wZXJ0aWVzLCBpbml0aWFsTmF2aWdhdGlvblByb3BlcnR5XSksXG4gICAgICApXG4gICAgOiB0cy5mYWN0b3J5LmNyZWF0ZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKFtpbml0aWFsTmF2aWdhdGlvblByb3BlcnR5XSwgdHJ1ZSk7XG4gIGNvbnN0IGFyZ3MgPSBbbm9kZS5hcmd1bWVudHNbMF0sIHJvdXRlck9wdGlvbnNdO1xuXG4gIHJldHVybiB0cy5mYWN0b3J5LmNyZWF0ZUNhbGxFeHByZXNzaW9uKG5vZGUuZXhwcmVzc2lvbiwgbm9kZS50eXBlQXJndW1lbnRzLCBhcmdzKTtcbn1cbiJdfQ== |
\ | No newline at end of file |