tnp-core 13.2.10 → 13.2.11

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 (98) hide show
  1. package/README.md +20 -20
  2. package/app.js +3 -3
  3. package/browser/README.md +24 -24
  4. package/browser/esm2020/lib/core-config.mjs +6 -6
  5. package/browser/esm2020/lib/core-imports.mjs +68 -68
  6. package/browser/esm2020/lib/core-models.mjs +3 -3
  7. package/browser/esm2020/lib/framework-name.mjs +9 -9
  8. package/browser/esm2020/lib/helpers-isomorphic.mjs +35 -35
  9. package/browser/esm2020/lib/helpers-messages.mjs +493 -493
  10. package/browser/esm2020/lib/helpers.mjs +1178 -1178
  11. package/browser/esm2020/lib/index.mjs +10 -10
  12. package/browser/esm2020/lib/node-path-mock.mjs +414 -414
  13. package/browser/esm2020/lib/progress-data.mjs +51 -51
  14. package/browser/esm2020/public-api.mjs +1 -1
  15. package/browser/esm2020/tnp-core.mjs +4 -4
  16. package/browser/fesm2015/tnp-core.mjs +2195 -2195
  17. package/browser/fesm2020/tnp-core.mjs +2193 -2193
  18. package/browser/lib/core-config.d.ts +4 -4
  19. package/browser/lib/core-imports.d.ts +7 -7
  20. package/browser/lib/core-models.d.ts +41 -41
  21. package/browser/lib/framework-name.d.ts +1 -1
  22. package/browser/lib/helpers-isomorphic.d.ts +5 -5
  23. package/browser/lib/helpers-messages.d.ts +16 -16
  24. package/browser/lib/helpers.d.ts +49 -49
  25. package/browser/lib/index.d.ts +7 -7
  26. package/browser/lib/node-path-mock.d.ts +24 -24
  27. package/browser/lib/progress-data.d.ts +17 -17
  28. package/browser/tnp-core.d.ts +4 -4
  29. package/cli.backend.js +3 -3
  30. package/client/README.md +24 -24
  31. package/client/esm2020/lib/core-config.mjs +6 -6
  32. package/client/esm2020/lib/core-imports.mjs +68 -68
  33. package/client/esm2020/lib/core-models.mjs +3 -3
  34. package/client/esm2020/lib/framework-name.mjs +9 -9
  35. package/client/esm2020/lib/helpers-isomorphic.mjs +35 -35
  36. package/client/esm2020/lib/helpers-messages.mjs +493 -493
  37. package/client/esm2020/lib/helpers.mjs +1178 -1178
  38. package/client/esm2020/lib/index.mjs +10 -10
  39. package/client/esm2020/lib/node-path-mock.mjs +414 -414
  40. package/client/esm2020/lib/progress-data.mjs +51 -51
  41. package/client/esm2020/public-api.mjs +1 -1
  42. package/client/esm2020/tnp-core.mjs +4 -4
  43. package/client/fesm2015/tnp-core.mjs +2195 -2195
  44. package/client/fesm2020/tnp-core.mjs +2193 -2193
  45. package/client/lib/core-config.d.ts +4 -4
  46. package/client/lib/core-imports.d.ts +7 -7
  47. package/client/lib/core-models.d.ts +41 -41
  48. package/client/lib/framework-name.d.ts +1 -1
  49. package/client/lib/helpers-isomorphic.d.ts +5 -5
  50. package/client/lib/helpers-messages.d.ts +16 -16
  51. package/client/lib/helpers.d.ts +49 -49
  52. package/client/lib/index.d.ts +7 -7
  53. package/client/lib/node-path-mock.d.ts +24 -24
  54. package/client/lib/progress-data.d.ts +17 -17
  55. package/client/tnp-core.d.ts +4 -4
  56. package/index.d.ts +1 -1
  57. package/lib/core-config.d.ts +5 -5
  58. package/lib/core-imports.d.ts +30 -30
  59. package/lib/core-models.d.ts +42 -42
  60. package/lib/framework-name.d.ts +2 -2
  61. package/lib/helpers-isomorphic.d.ts +6 -6
  62. package/lib/helpers-messages.d.ts +33 -33
  63. package/lib/helpers.d.ts +128 -128
  64. package/lib/index.d.ts +8 -8
  65. package/lib/node-path-mock.d.ts +24 -24
  66. package/lib/node-path-mock.js +3 -3
  67. package/lib/progress-data.d.ts +18 -18
  68. package/lib/public-api.d.ts +7 -7
  69. package/package.json +2 -2
  70. package/package.json_devDependencies.json +202 -202
  71. package/package.json_tnp.json5 +65 -65
  72. package/tmp-environment.json +13 -13
  73. package/websql/README.md +24 -24
  74. package/websql/esm2020/lib/core-config.mjs +6 -6
  75. package/websql/esm2020/lib/core-imports.mjs +68 -68
  76. package/websql/esm2020/lib/core-models.mjs +3 -3
  77. package/websql/esm2020/lib/framework-name.mjs +9 -9
  78. package/websql/esm2020/lib/helpers-isomorphic.mjs +34 -34
  79. package/websql/esm2020/lib/helpers-messages.mjs +493 -493
  80. package/websql/esm2020/lib/helpers.mjs +1176 -1176
  81. package/websql/esm2020/lib/index.mjs +10 -10
  82. package/websql/esm2020/lib/node-path-mock.mjs +414 -414
  83. package/websql/esm2020/lib/progress-data.mjs +51 -51
  84. package/websql/esm2020/public-api.mjs +1 -1
  85. package/websql/esm2020/tnp-core.mjs +4 -4
  86. package/websql/fesm2015/tnp-core.mjs +2192 -2192
  87. package/websql/fesm2020/tnp-core.mjs +2190 -2190
  88. package/websql/lib/core-config.d.ts +4 -4
  89. package/websql/lib/core-imports.d.ts +7 -7
  90. package/websql/lib/core-models.d.ts +41 -41
  91. package/websql/lib/framework-name.d.ts +1 -1
  92. package/websql/lib/helpers-isomorphic.d.ts +5 -5
  93. package/websql/lib/helpers-messages.d.ts +16 -16
  94. package/websql/lib/helpers.d.ts +49 -49
  95. package/websql/lib/index.d.ts +7 -7
  96. package/websql/lib/node-path-mock.d.ts +24 -24
  97. package/websql/lib/progress-data.d.ts +17 -17
  98. package/websql/tnp-core.d.ts +4 -4
package/lib/helpers.d.ts CHANGED
@@ -1,129 +1,129 @@
1
- /// <reference types="node" />
2
- import { child_process } from './core-imports';
3
- import { HelpersMessages } from './helpers-messages';
4
- import { ExecuteOptions, RunOptions } from './core-models';
5
- export interface RunSyncOrAsyncOptions {
6
- functionFn: Function;
7
- context?: object;
8
- arrayOfParams?: any[];
9
- }
10
- export interface CommandOutputOptions {
11
- biggerBuffer?: boolean;
12
- showWholeCommandNotOnlyLastLine?: boolean;
13
- showStder?: boolean;
14
- gatherColors?: boolean;
15
- showErrorWarning?: boolean;
16
- }
17
- export declare class HelpersCore extends HelpersMessages {
18
- private static _instanceCore;
19
- static get InstanceCore(): HelpersCore;
20
- remove(fileOrFolderPathOrPatter: string | string[], exactFolder?: boolean): void;
21
- cleanExit(): void;
22
- readonly bigMaxBuffer: number;
23
- constructor();
24
- removeSlashAtEnd(s: string): string;
25
- removeSlashAtBegin(s: string): string;
26
- stringify(inputObject: any): string;
27
- runSyncOrAsync(fnOrOptions: Function | [string, object] | RunSyncOrAsyncOptions, ...firstArg: any[]): Promise<any>;
28
- readonly processes: child_process.ChildProcess[];
29
- createSymLink(existedFileOrFolder: string, destinationPath: string, options?: {
30
- continueWhenExistedFolderDoesntExists?: boolean;
31
- windowsHardLink?: boolean;
32
- dontRenameWhenSlashAtEnd?: boolean;
33
- allowNotAbsolutePathes?: boolean;
34
- /**
35
- * only if you know that symlink can be created
36
- */
37
- speedUpProcess?: boolean;
38
- }): void;
39
- mkdirp(folderPath: string | string[]): void;
40
- /**
41
- * symlink may have existed or unexisted destiantion url
42
- * @param destUrl M
43
- */
44
- isSymlinkThatMatchesUrl(possibleSymlink: string, destUrl: string, absoluteFileMatch?: boolean): boolean;
45
- isSymlinkFileExitedOrUnexisted(filePath: string): boolean;
46
- /**
47
- * If symbolnk link that target file does not exits
48
- */
49
- isUnexistedLink(filePath: string): boolean;
50
- /**
51
- * @param existedLink check if source of link exists
52
- */
53
- isExistedSymlink(filePath: string): boolean;
54
- pathContainLink(p: string): boolean;
55
- exists(folderOrFilePath: string | string[]): boolean;
56
- _fixCommand(command: string): string;
57
- command(command: string): {
58
- getherOutput(options?: {
59
- ommitStder?: boolean;
60
- cwd?: string;
61
- biggerBuffer?: boolean;
62
- gatherColors?: boolean;
63
- }): Promise<string>;
64
- };
65
- wait(second: number): Promise<unknown>;
66
- commnadOutputAsStringAsync(command: string, cwd?: string, options?: CommandOutputOptions): Promise<string>;
67
- commnadOutputAsString(command: string, cwd?: string, options?: CommandOutputOptions): string;
68
- killProcess(byPid: number): void;
69
- run(command: string, options?: RunOptions): {
70
- sync(): string;
71
- async(detach?: boolean, mockFun?: (stdoutCallback: (dataForStdout: any) => any, stdErrcCallback: (dataForStder: any) => any, shouldProcesBeDead?: () => boolean) => Promise<number> | number): child_process.ChildProcess;
72
- asyncAsPromise(): any;
73
- unitlOutputContains(stdoutMsg: string | string[], stderMsg?: string | string[]): Promise<any>;
74
- };
75
- get isRunningIn(): {
76
- mochaTest(): boolean;
77
- cliMode(): boolean;
78
- };
79
- getStdio(options?: RunOptions): any;
80
- runSyncIn(command: string, options?: RunOptions): string;
81
- runAsyncIn(command: string, options?: RunOptions): child_process.ChildProcess;
82
- logProc(proc: child_process.ChildProcess, output: boolean, stdio: any, outputLineReplace: (outputLine: string) => string, prefix: string, extractFromLine?: (string | Function)[]): child_process.ChildProcess;
83
- execute(command: string, cwd: string, options?: ExecuteOptions): Promise<unknown>;
84
- checkProcess(dirPath: string, command: string): void;
85
- modifyLineByLine(data: string | Buffer | Error, outputLineReplace: (outputLine: string) => string, prefix: string, extractFromLine?: (string | Function)[]): string;
86
- isFolder(pathToFileOrMaybeFolder: string): boolean;
87
- /**
88
- * Quick fix for object values
89
- */
90
- values(obj: any): any[];
91
- /**
92
- * does not make sense
93
- */
94
- private isFile;
95
- /**
96
- * wrapper for fs.readFileSync
97
- */
98
- readFile(absoluteFilePath: string | string[], defaultValueWhenNotExists?: string, notTrim?: boolean): string | undefined;
99
- readJson(absoluteFilePath: string | string[], defaultValue?: {}, useJson5?: boolean): any;
100
- parse<T = any>(jsonInstring: string, useJson5?: boolean): T;
101
- compilationWrapper(fn: () => void, taskName?: string, executionType?: 'Compilation of' | 'Code execution of' | 'Event:'): Promise<void>;
102
- /**
103
- * wrapper for fs.writeFileSync
104
- */
105
- writeFile(absoluteFilePath: string | (string[]), input: string | object, options?: {
106
- overrideSameFile?: boolean;
107
- preventParentFile?: boolean;
108
- }): boolean;
109
- /**
110
- * wrapper for fs.writeFileSync
111
- */
112
- writeJson(absoluteFilePath: string | (string[]), input: object, optoins?: {
113
- preventParentFile?: boolean;
114
- }): boolean;
115
- /**
116
- * return absolute paths for folders inside folders
117
- */
118
- foldersFrom(pathToFolder: string | string[]): string[];
119
- linksToFoldersFrom(pathToFolder: string | string[], outputRealPath?: boolean): string[];
120
- /**
121
- * return absolute paths for folders inside folders
122
- */
123
- linksToFolderFrom(pathToFolder: string | string[]): string[];
124
- /**
125
- * return absolute paths for folders inside folders
126
- */
127
- filesFrom(pathToFolder: string | string[], recrusive?: boolean): string[];
128
- openFolderInFileExploer(folderPath: string): void;
1
+ /// <reference types="node" />
2
+ import { child_process } from './core-imports';
3
+ import { HelpersMessages } from './helpers-messages';
4
+ import { ExecuteOptions, RunOptions } from './core-models';
5
+ export interface RunSyncOrAsyncOptions {
6
+ functionFn: Function;
7
+ context?: object;
8
+ arrayOfParams?: any[];
9
+ }
10
+ export interface CommandOutputOptions {
11
+ biggerBuffer?: boolean;
12
+ showWholeCommandNotOnlyLastLine?: boolean;
13
+ showStder?: boolean;
14
+ gatherColors?: boolean;
15
+ showErrorWarning?: boolean;
16
+ }
17
+ export declare class HelpersCore extends HelpersMessages {
18
+ private static _instanceCore;
19
+ static get InstanceCore(): HelpersCore;
20
+ remove(fileOrFolderPathOrPatter: string | string[], exactFolder?: boolean): void;
21
+ cleanExit(): void;
22
+ readonly bigMaxBuffer: number;
23
+ constructor();
24
+ removeSlashAtEnd(s: string): string;
25
+ removeSlashAtBegin(s: string): string;
26
+ stringify(inputObject: any): string;
27
+ runSyncOrAsync(fnOrOptions: Function | [string, object] | RunSyncOrAsyncOptions, ...firstArg: any[]): Promise<any>;
28
+ readonly processes: child_process.ChildProcess[];
29
+ createSymLink(existedFileOrFolder: string, destinationPath: string, options?: {
30
+ continueWhenExistedFolderDoesntExists?: boolean;
31
+ windowsHardLink?: boolean;
32
+ dontRenameWhenSlashAtEnd?: boolean;
33
+ allowNotAbsolutePathes?: boolean;
34
+ /**
35
+ * only if you know that symlink can be created
36
+ */
37
+ speedUpProcess?: boolean;
38
+ }): void;
39
+ mkdirp(folderPath: string | string[]): void;
40
+ /**
41
+ * symlink may have existed or unexisted destiantion url
42
+ * @param destUrl M
43
+ */
44
+ isSymlinkThatMatchesUrl(possibleSymlink: string, destUrl: string, absoluteFileMatch?: boolean): boolean;
45
+ isSymlinkFileExitedOrUnexisted(filePath: string): boolean;
46
+ /**
47
+ * If symbolnk link that target file does not exits
48
+ */
49
+ isUnexistedLink(filePath: string): boolean;
50
+ /**
51
+ * @param existedLink check if source of link exists
52
+ */
53
+ isExistedSymlink(filePath: string): boolean;
54
+ pathContainLink(p: string): boolean;
55
+ exists(folderOrFilePath: string | string[]): boolean;
56
+ _fixCommand(command: string): string;
57
+ command(command: string): {
58
+ getherOutput(options?: {
59
+ ommitStder?: boolean;
60
+ cwd?: string;
61
+ biggerBuffer?: boolean;
62
+ gatherColors?: boolean;
63
+ }): Promise<string>;
64
+ };
65
+ wait(second: number): Promise<unknown>;
66
+ commnadOutputAsStringAsync(command: string, cwd?: string, options?: CommandOutputOptions): Promise<string>;
67
+ commnadOutputAsString(command: string, cwd?: string, options?: CommandOutputOptions): string;
68
+ killProcess(byPid: number): void;
69
+ run(command: string, options?: RunOptions): {
70
+ sync(): string;
71
+ async(detach?: boolean, mockFun?: (stdoutCallback: (dataForStdout: any) => any, stdErrcCallback: (dataForStder: any) => any, shouldProcesBeDead?: () => boolean) => Promise<number> | number): child_process.ChildProcess;
72
+ asyncAsPromise(): any;
73
+ unitlOutputContains(stdoutMsg: string | string[], stderMsg?: string | string[]): Promise<any>;
74
+ };
75
+ get isRunningIn(): {
76
+ mochaTest(): boolean;
77
+ cliMode(): boolean;
78
+ };
79
+ getStdio(options?: RunOptions): any;
80
+ runSyncIn(command: string, options?: RunOptions): string;
81
+ runAsyncIn(command: string, options?: RunOptions): child_process.ChildProcess;
82
+ logProc(proc: child_process.ChildProcess, output: boolean, stdio: any, outputLineReplace: (outputLine: string) => string, prefix: string, extractFromLine?: (string | Function)[]): child_process.ChildProcess;
83
+ execute(command: string, cwd: string, options?: ExecuteOptions): Promise<unknown>;
84
+ checkProcess(dirPath: string, command: string): void;
85
+ modifyLineByLine(data: string | Buffer | Error, outputLineReplace: (outputLine: string) => string, prefix: string, extractFromLine?: (string | Function)[]): string;
86
+ isFolder(pathToFileOrMaybeFolder: string): boolean;
87
+ /**
88
+ * Quick fix for object values
89
+ */
90
+ values(obj: any): any[];
91
+ /**
92
+ * does not make sense
93
+ */
94
+ private isFile;
95
+ /**
96
+ * wrapper for fs.readFileSync
97
+ */
98
+ readFile(absoluteFilePath: string | string[], defaultValueWhenNotExists?: string, notTrim?: boolean): string | undefined;
99
+ readJson(absoluteFilePath: string | string[], defaultValue?: {}, useJson5?: boolean): any;
100
+ parse<T = any>(jsonInstring: string, useJson5?: boolean): T;
101
+ compilationWrapper(fn: () => void, taskName?: string, executionType?: 'Compilation of' | 'Code execution of' | 'Event:'): Promise<void>;
102
+ /**
103
+ * wrapper for fs.writeFileSync
104
+ */
105
+ writeFile(absoluteFilePath: string | (string[]), input: string | object, options?: {
106
+ overrideSameFile?: boolean;
107
+ preventParentFile?: boolean;
108
+ }): boolean;
109
+ /**
110
+ * wrapper for fs.writeFileSync
111
+ */
112
+ writeJson(absoluteFilePath: string | (string[]), input: object, optoins?: {
113
+ preventParentFile?: boolean;
114
+ }): boolean;
115
+ /**
116
+ * return absolute paths for folders inside folders
117
+ */
118
+ foldersFrom(pathToFolder: string | string[]): string[];
119
+ linksToFoldersFrom(pathToFolder: string | string[], outputRealPath?: boolean): string[];
120
+ /**
121
+ * return absolute paths for folders inside folders
122
+ */
123
+ linksToFolderFrom(pathToFolder: string | string[]): string[];
124
+ /**
125
+ * return absolute paths for folders inside folders
126
+ */
127
+ filesFrom(pathToFolder: string | string[], recrusive?: boolean): string[];
128
+ openFolderInFileExploer(folderPath: string): void;
129
129
  }
package/lib/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
- export * from './framework-name';
2
- export * from './core-imports';
3
- export * from './core-models';
4
- import { HelpersCore as Base } from './helpers';
5
- export * from './core-config';
6
- export * from './progress-data';
7
- export { HelpersCore as CoreHelpers } from './helpers';
8
- export declare let Helpers: Base;
1
+ export * from './framework-name';
2
+ export * from './core-imports';
3
+ export * from './core-models';
4
+ import { HelpersCore as Base } from './helpers';
5
+ export * from './core-config';
6
+ export * from './progress-data';
7
+ export { HelpersCore as CoreHelpers } from './helpers';
8
+ export declare let Helpers: Base;
@@ -1,25 +1,25 @@
1
- export declare const path: {
2
- resolve: (pathToResovle: any) => any;
3
- normalize: (pathArg: any) => any;
4
- isAbsolute: (pathArg: any) => boolean;
5
- join: () => any;
6
- relative: (from: any, to: any) => any;
7
- _makeLong: (path: any) => any;
8
- dirname: (path: any) => any;
9
- basename: (pathArg: any, ext: any) => any;
10
- extname: (pathArg: any) => any;
11
- format: (pathObject: any) => any;
12
- parse: (pathArg: any) => {
13
- root: string;
14
- dir: string;
15
- base: string;
16
- ext: string;
17
- name: string;
18
- };
19
- sep: string;
20
- delimiter: string;
21
- win32: {
22
- normalize: (p: any) => any;
23
- };
24
- posix: any;
1
+ export declare const path: {
2
+ resolve: (pathToResovle: any) => any;
3
+ normalize: (pathArg: any) => any;
4
+ isAbsolute: (pathArg: any) => boolean;
5
+ join: () => any;
6
+ relative: (from: any, to: any) => any;
7
+ _makeLong: (path: any) => any;
8
+ dirname: (path: any) => any;
9
+ basename: (pathArg: any, ext: any) => any;
10
+ extname: (pathArg: any) => any;
11
+ format: (pathObject: any) => any;
12
+ parse: (pathArg: any) => {
13
+ root: string;
14
+ dir: string;
15
+ base: string;
16
+ ext: string;
17
+ name: string;
18
+ };
19
+ sep: string;
20
+ delimiter: string;
21
+ win32: {
22
+ normalize: (p: any) => any;
23
+ };
24
+ posix: any;
25
25
  };
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.dummy1682221641882 = void 0;
4
- function dummy1682221641882() { }
5
- exports.dummy1682221641882 = dummy1682221641882;
3
+ exports.dummy1682263531736 = void 0;
4
+ function dummy1682263531736() { }
5
+ exports.dummy1682263531736 = dummy1682263531736;
6
6
  //# sourceMappingURL=node-path-mock.js.map
@@ -1,18 +1,18 @@
1
- import { PROGRESS_DATA_TYPE } from './core-models';
2
- export interface IPROGRESS_DATA {
3
- /**
4
- * How man percent of
5
- */
6
- value?: number;
7
- msg?: string;
8
- type?: PROGRESS_DATA_TYPE;
9
- date?: Date;
10
- }
11
- export declare class PROGRESS_DATA implements IPROGRESS_DATA {
12
- static log(log: IPROGRESS_DATA): void;
13
- static resolveFrom(chunk: string, callbackOnFounded?: (json: PROGRESS_DATA) => any, checkSplit?: boolean): PROGRESS_DATA[];
14
- value?: number;
15
- msg?: string;
16
- type: PROGRESS_DATA_TYPE;
17
- date?: Date;
18
- }
1
+ import { PROGRESS_DATA_TYPE } from './core-models';
2
+ export interface IPROGRESS_DATA {
3
+ /**
4
+ * How man percent of
5
+ */
6
+ value?: number;
7
+ msg?: string;
8
+ type?: PROGRESS_DATA_TYPE;
9
+ date?: Date;
10
+ }
11
+ export declare class PROGRESS_DATA implements IPROGRESS_DATA {
12
+ static log(log: IPROGRESS_DATA): void;
13
+ static resolveFrom(chunk: string, callbackOnFounded?: (json: PROGRESS_DATA) => any, checkSplit?: boolean): PROGRESS_DATA[];
14
+ value?: number;
15
+ msg?: string;
16
+ type: PROGRESS_DATA_TYPE;
17
+ date?: Date;
18
+ }
@@ -1,7 +1,7 @@
1
- export * from './core-imports';
2
- export * from './core-models';
3
- import { HelpersCore as Base } from './helpers';
4
- export * from './core-config';
5
- export * from './progress-data';
6
- export { HelpersCore as CoreHelpers } from './helpers';
7
- export declare let Helpers: Base;
1
+ export * from './core-imports';
2
+ export * from './core-models';
3
+ import { HelpersCore as Base } from './helpers';
4
+ export * from './core-config';
5
+ export * from './progress-data';
6
+ export { HelpersCore as CoreHelpers } from './helpers';
7
+ export declare let Helpers: Base;
package/package.json CHANGED
@@ -26,6 +26,6 @@
26
26
  "private": false,
27
27
  "main": "index.js",
28
28
  "name": "tnp-core",
29
- "version": "13.2.10",
30
- "lastBuildTagHash": "31b4f4665a6d28ce371b63c8226b386700b8b3d9"
29
+ "version": "13.2.11",
30
+ "lastBuildTagHash": "298b4b93d052e1d20d9cb2e7d0c5828a75e5850b"
31
31
  }