gamelet-cli 0.6.2 → 0.6.3

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 (68) hide show
  1. package/LICENSE +0 -0
  2. package/README.md +0 -0
  3. package/assets/common.d.ts +4 -4
  4. package/assets/gitignore.txt +65 -65
  5. package/assets/launch.json +21 -21
  6. package/assets/package.json.twig +22 -22
  7. package/assets/server/greenlock.d/config.json +25 -25
  8. package/assets/server/static/css/style.css +0 -0
  9. package/assets/server/static/js/monitor.js +0 -0
  10. package/assets/server/static/js/test.js +0 -0
  11. package/assets/server/views/error.twig +0 -0
  12. package/assets/server/views/index.twig +0 -0
  13. package/assets/server/views/monitor.twig +0 -0
  14. package/assets/server/views/test.twig +0 -0
  15. package/assets/tsconfig.json.twig +42 -42
  16. package/build/package.json +67 -67
  17. package/build/src/gamelet/download.js +736 -736
  18. package/build/src/gamelet/merges.js +143 -143
  19. package/build/src/gamelet/prepare.js +274 -274
  20. package/build/src/gamelet/upload.js +278 -278
  21. package/build/src/index.js +85 -85
  22. package/build/src/server/Constant.js +9 -9
  23. package/build/src/server/entities/Client.js +77 -77
  24. package/build/src/server/entities/ClientOwner.js +66 -66
  25. package/build/src/server/entities/ClientProject.js +83 -83
  26. package/build/src/server/entities/Gameroom.js +88 -88
  27. package/build/src/server/entities/GameroomBase.js +275 -275
  28. package/build/src/server/entities/Gamezone.js +72 -72
  29. package/build/src/server/entities/ListFilter.js +192 -192
  30. package/build/src/server/entities/Monitor.js +80 -80
  31. package/build/src/server/entities/Player.js +131 -131
  32. package/build/src/server/managers/ApiManager.js +74 -74
  33. package/build/src/server/managers/ClientManager.js +63 -63
  34. package/build/src/server/managers/Database.js +593 -593
  35. package/build/src/server/managers/GameroomManager.js +391 -391
  36. package/build/src/server/managers/ManagerBase.js +16 -16
  37. package/build/src/server/managers/MonitorManager.js +72 -72
  38. package/build/src/server/managers/PlayerManager.js +103 -103
  39. package/build/src/server/managers/SocketManager.js +55 -55
  40. package/build/src/server/managers/UserManager.js +57 -57
  41. package/build/src/server/messages/Message.js +141 -141
  42. package/build/src/server/server.js +109 -109
  43. package/build/src/server/services/ServiceBase.js +24 -24
  44. package/build/src/server/services/clientService.js +23 -23
  45. package/build/src/server/services/gameroomService.js +121 -121
  46. package/build/src/server/services/gltserver.service.js +23 -23
  47. package/build/src/server/services/playerService.js +29 -29
  48. package/build/src/server/startServer.js +32 -32
  49. package/build/src/server/types/BadgeStatus.js +24 -24
  50. package/build/src/server/types/OrderType.js +37 -37
  51. package/build/src/server/types/SubmitType.js +23 -23
  52. package/build/src/server/types/TimeRange.js +25 -25
  53. package/build/src/server/utils/ArrayUtil.js +125 -125
  54. package/build/src/server/utils/IntUtil.js +9 -9
  55. package/build/src/server/utils/ObjectUtil.js +190 -190
  56. package/build/src/server/utils/StringUtil.js +36 -36
  57. package/build/src/server/vo/Database.js +0 -0
  58. package/build/src/server/vo/Gameroom.js +0 -0
  59. package/build/src/server/vo/Gamezone.js +0 -0
  60. package/build/src/server/vo/Player.js +0 -0
  61. package/build/src/server/vo/Response.js +0 -0
  62. package/build/src/server/vo/System.js +0 -0
  63. package/build/src/utils/cli.js +48 -48
  64. package/build/src/utils/file.js +326 -326
  65. package/build/src/utils/init.js +41 -41
  66. package/build/src/utils/log.js +16 -16
  67. package/build/src/utils/net.js +38 -38
  68. package/package.json +2 -2
@@ -1,275 +1,275 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.prepare = void 0;
7
- const file_1 = require("../utils/file");
8
- const inquirer_1 = __importDefault(require("inquirer"));
9
- const sourcesHandlerCandidates = ['overwrite', 'merge', 'skip'];
10
- function prepare({ command, tokenFile = null, folder = null, sourceHandler = null, debug = false }) {
11
- if (debug) {
12
- console.log('debug = true');
13
- }
14
- let result = {
15
- token: null,
16
- projectCode: null,
17
- folder: null,
18
- sourceHandler: 'download',
19
- };
20
- if (sourcesHandlerCandidates.includes(sourceHandler)) {
21
- result.sourceHandler = sourceHandler;
22
- }
23
- let cwd = process.cwd();
24
- if (cwd.match(/\/$/)) {
25
- cwd = cwd.substr(0, cwd.length - 1);
26
- }
27
- if (folder && folder.match(/\/$/)) {
28
- folder = folder.substr(0, folder.length - 1);
29
- }
30
- if (folder) {
31
- result.folder = folder = `${cwd}/${folder}`;
32
- }
33
- return Promise.resolve()
34
- .then(() => {
35
- let packageFolder = folder ? `${result.folder}` : cwd;
36
- let packageJsonFile = `${packageFolder}/package.json`;
37
- if (file_1.fileExists(packageJsonFile)) {
38
- if (tokenFile) {
39
- return Promise.reject('Cannot create a project inside a project folder.');
40
- }
41
- return file_1.getFileJson(packageJsonFile)
42
- .then(projectJson => {
43
- result.projectCode = projectJson.name.toLowerCase();
44
- return findCgProjectTokenFile(packageFolder, result.projectCode)
45
- .then(tokenFile => {
46
- if (tokenFile) {
47
- return file_1.getFileString(tokenFile, true)
48
- .then(token => {
49
- let arr = token.split('|');
50
- if (arr && arr.length == 3) {
51
- if (arr[0].toLowerCase() != result.projectCode) {
52
- return Promise.reject('Invalid token file (project does not match');
53
- }
54
- result.token = token;
55
- result.folder = packageFolder;
56
- if (sourcesHandlerCandidates.includes(sourceHandler)) {
57
- result.sourceHandler = sourceHandler;
58
- }
59
- else {
60
- return inquirer_1.default.prompt([
61
- {
62
- type: 'list',
63
- name: 'confirm',
64
- message: 'What do you want to do with the sources(src/*)?',
65
- choices: [
66
- 'Do NOT touch the sources',
67
- 'Overwrite',
68
- 'Merge',
69
- ],
70
- }
71
- ])
72
- .then(choice => {
73
- if (choice.confirm == 'Overwrite') {
74
- result.sourceHandler = 'overwrite';
75
- }
76
- else if (choice.confirm == 'Merge') {
77
- result.sourceHandler = 'merge';
78
- }
79
- else {
80
- result.sourceHandler = 'skip';
81
- }
82
- });
83
- }
84
- }
85
- else {
86
- return Promise.reject('Invalid token file');
87
- }
88
- });
89
- }
90
- else {
91
- return Promise.reject('package name does not match project code.');
92
- }
93
- });
94
- });
95
- }
96
- else {
97
- if (tokenFile) {
98
- tokenFile = `${cwd}/${tokenFile}`;
99
- if (file_1.fileExists(tokenFile)) {
100
- return file_1.getFileString(tokenFile, true)
101
- .then(token => {
102
- let arr = token.split('|');
103
- if (arr && arr.length == 3) {
104
- result.projectCode = arr[0];
105
- result.token = token;
106
- }
107
- else {
108
- return Promise.reject('Invalid token file');
109
- }
110
- return Promise.resolve();
111
- });
112
- }
113
- else {
114
- return Promise.reject('Cannot find the token file.');
115
- }
116
- }
117
- else if (command == 'download' || command == 'merge') {
118
- return chooseATokenFile(cwd, folder)
119
- .then(tokenFile => {
120
- if (file_1.fileExists(tokenFile)) {
121
- return file_1.getFileString(tokenFile, true)
122
- .then(token => {
123
- let arr = token.split('|');
124
- if (arr && arr.length == 3) {
125
- result.projectCode = arr[0];
126
- result.token = token;
127
- }
128
- else {
129
- return Promise.reject('Invalid token file');
130
- }
131
- return Promise.resolve();
132
- });
133
- }
134
- else {
135
- return Promise.reject('Cannot find the token file.');
136
- }
137
- });
138
- }
139
- else {
140
- return Promise.reject('No token exists in the workspace.');
141
- }
142
- }
143
- })
144
- .then(() => {
145
- if (!result.folder && result.projectCode) {
146
- folder = `${cwd}/${result.projectCode}`;
147
- return file_1.isEmptyFolder(folder)
148
- .then(empty => {
149
- if (!empty) {
150
- return Promise.reject('The target directory is not empty.');
151
- }
152
- else {
153
- result.folder = folder;
154
- }
155
- return Promise.resolve();
156
- });
157
- }
158
- else {
159
- return Promise.resolve();
160
- }
161
- })
162
- .then(() => result)
163
- .catch(err => {
164
- console.error(err);
165
- return null;
166
- });
167
- }
168
- exports.prepare = prepare;
169
- function findCgProjectTokenFile(folder, projectCode) {
170
- if (folder) {
171
- let path = `${folder}/.cg`;
172
- return file_1.listFiles(path)
173
- .then(files => findCgProjectTokenFileInFiles(path, files, projectCode))
174
- .then(tokenFile => {
175
- if (tokenFile) {
176
- return tokenFile;
177
- }
178
- else {
179
- path = `${folder}`;
180
- return file_1.listFiles(path)
181
- .then(files => findCgProjectTokenFileInFiles(path, files, projectCode));
182
- }
183
- });
184
- }
185
- else {
186
- return Promise.resolve(null);
187
- }
188
- }
189
- function findCgProjectTokenFileInFiles(path, files, projectCode) {
190
- if (files.length) {
191
- let lowerPcode = projectCode.toLowerCase();
192
- let fileIndex = files.findIndex(f => f == `${lowerPcode}.token`);
193
- let file = null;
194
- if (fileIndex == -1) {
195
- file = files.shift();
196
- }
197
- else {
198
- file = files[fileIndex];
199
- files.splice(fileIndex, 1);
200
- }
201
- if (file.toLowerCase().endsWith('.token')) {
202
- let tokenFile = `${path}/${file}`;
203
- return file_1.getFileString(tokenFile, true)
204
- .then(token => {
205
- let arr = token.split('|');
206
- if (arr && arr.length == 3 && projectCode == arr[0].toLowerCase()) {
207
- return tokenFile;
208
- }
209
- else {
210
- return findCgProjectTokenFileInFiles(path, files, projectCode);
211
- }
212
- });
213
- }
214
- else {
215
- return findCgProjectTokenFileInFiles(path, files, projectCode);
216
- }
217
- }
218
- else {
219
- return Promise.resolve(null);
220
- }
221
- }
222
- function findCgTokenFile(folder) {
223
- if (folder) {
224
- return file_1.listFiles(`${folder}/.cg`)
225
- .then(files => {
226
- let file = files.find(file => file.endsWith('.token'));
227
- return file && `${folder}/.cg/${file}`;
228
- });
229
- }
230
- else {
231
- return Promise.resolve(null);
232
- }
233
- }
234
- function chooseATokenFile(cwd, folder) {
235
- return findCgTokenFile(folder)
236
- .then(tokenFile => {
237
- if (tokenFile) {
238
- return tokenFile;
239
- }
240
- else {
241
- return file_1.listFiles(cwd)
242
- .then(files => {
243
- files = files.filter(file => file.match(/\.token$/));
244
- console.log('');
245
- return inquirer_1.default.prompt([
246
- {
247
- type: 'list',
248
- name: 'file',
249
- message: 'Select a token to install:',
250
- choices: ['[enter the token file myself]'].concat(files)
251
- }
252
- ]);
253
- })
254
- .then(choice => {
255
- if (choice.file.startsWith('[')) {
256
- return inquirer_1.default.prompt([
257
- {
258
- type: 'input',
259
- name: 'file',
260
- message: 'Enter the filename of the token:',
261
- }
262
- ])
263
- .then(input => input.file);
264
- }
265
- else {
266
- return choice.file;
267
- }
268
- })
269
- .then(file => {
270
- return `${cwd}/${file}`;
271
- });
272
- }
273
- });
274
- }
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.prepare = void 0;
7
+ const file_1 = require("../utils/file");
8
+ const inquirer_1 = __importDefault(require("inquirer"));
9
+ const sourcesHandlerCandidates = ['overwrite', 'merge', 'skip'];
10
+ function prepare({ command, tokenFile = null, folder = null, sourceHandler = null, debug = false }) {
11
+ if (debug) {
12
+ console.log('debug = true');
13
+ }
14
+ let result = {
15
+ token: null,
16
+ projectCode: null,
17
+ folder: null,
18
+ sourceHandler: 'download',
19
+ };
20
+ if (sourcesHandlerCandidates.includes(sourceHandler)) {
21
+ result.sourceHandler = sourceHandler;
22
+ }
23
+ let cwd = process.cwd();
24
+ if (cwd.match(/\/$/)) {
25
+ cwd = cwd.substr(0, cwd.length - 1);
26
+ }
27
+ if (folder && folder.match(/\/$/)) {
28
+ folder = folder.substr(0, folder.length - 1);
29
+ }
30
+ if (folder) {
31
+ result.folder = folder = `${cwd}/${folder}`;
32
+ }
33
+ return Promise.resolve()
34
+ .then(() => {
35
+ let packageFolder = folder ? `${result.folder}` : cwd;
36
+ let packageJsonFile = `${packageFolder}/package.json`;
37
+ if (file_1.fileExists(packageJsonFile)) {
38
+ if (tokenFile) {
39
+ return Promise.reject('Cannot create a project inside a project folder.');
40
+ }
41
+ return file_1.getFileJson(packageJsonFile)
42
+ .then(projectJson => {
43
+ result.projectCode = projectJson.name.toLowerCase();
44
+ return findCgProjectTokenFile(packageFolder, result.projectCode)
45
+ .then(tokenFile => {
46
+ if (tokenFile) {
47
+ return file_1.getFileString(tokenFile, true)
48
+ .then(token => {
49
+ let arr = token.split('|');
50
+ if (arr && arr.length == 3) {
51
+ if (arr[0].toLowerCase() != result.projectCode) {
52
+ return Promise.reject('Invalid token file (project does not match');
53
+ }
54
+ result.token = token;
55
+ result.folder = packageFolder;
56
+ if (sourcesHandlerCandidates.includes(sourceHandler)) {
57
+ result.sourceHandler = sourceHandler;
58
+ }
59
+ else {
60
+ return inquirer_1.default.prompt([
61
+ {
62
+ type: 'list',
63
+ name: 'confirm',
64
+ message: 'What do you want to do with the sources(src/*)?',
65
+ choices: [
66
+ 'Do NOT touch the sources',
67
+ 'Overwrite',
68
+ 'Merge',
69
+ ],
70
+ }
71
+ ])
72
+ .then(choice => {
73
+ if (choice.confirm == 'Overwrite') {
74
+ result.sourceHandler = 'overwrite';
75
+ }
76
+ else if (choice.confirm == 'Merge') {
77
+ result.sourceHandler = 'merge';
78
+ }
79
+ else {
80
+ result.sourceHandler = 'skip';
81
+ }
82
+ });
83
+ }
84
+ }
85
+ else {
86
+ return Promise.reject('Invalid token file');
87
+ }
88
+ });
89
+ }
90
+ else {
91
+ return Promise.reject('package name does not match project code.');
92
+ }
93
+ });
94
+ });
95
+ }
96
+ else {
97
+ if (tokenFile) {
98
+ tokenFile = `${cwd}/${tokenFile}`;
99
+ if (file_1.fileExists(tokenFile)) {
100
+ return file_1.getFileString(tokenFile, true)
101
+ .then(token => {
102
+ let arr = token.split('|');
103
+ if (arr && arr.length == 3) {
104
+ result.projectCode = arr[0];
105
+ result.token = token;
106
+ }
107
+ else {
108
+ return Promise.reject('Invalid token file');
109
+ }
110
+ return Promise.resolve();
111
+ });
112
+ }
113
+ else {
114
+ return Promise.reject('Cannot find the token file.');
115
+ }
116
+ }
117
+ else if (command == 'download' || command == 'merge') {
118
+ return chooseATokenFile(cwd, folder)
119
+ .then(tokenFile => {
120
+ if (file_1.fileExists(tokenFile)) {
121
+ return file_1.getFileString(tokenFile, true)
122
+ .then(token => {
123
+ let arr = token.split('|');
124
+ if (arr && arr.length == 3) {
125
+ result.projectCode = arr[0];
126
+ result.token = token;
127
+ }
128
+ else {
129
+ return Promise.reject('Invalid token file');
130
+ }
131
+ return Promise.resolve();
132
+ });
133
+ }
134
+ else {
135
+ return Promise.reject('Cannot find the token file.');
136
+ }
137
+ });
138
+ }
139
+ else {
140
+ return Promise.reject('No token exists in the workspace.');
141
+ }
142
+ }
143
+ })
144
+ .then(() => {
145
+ if (!result.folder && result.projectCode) {
146
+ folder = `${cwd}/${result.projectCode}`;
147
+ return file_1.isEmptyFolder(folder)
148
+ .then(empty => {
149
+ if (!empty) {
150
+ return Promise.reject('The target directory is not empty.');
151
+ }
152
+ else {
153
+ result.folder = folder;
154
+ }
155
+ return Promise.resolve();
156
+ });
157
+ }
158
+ else {
159
+ return Promise.resolve();
160
+ }
161
+ })
162
+ .then(() => result)
163
+ .catch(err => {
164
+ console.error(err);
165
+ return null;
166
+ });
167
+ }
168
+ exports.prepare = prepare;
169
+ function findCgProjectTokenFile(folder, projectCode) {
170
+ if (folder) {
171
+ let path = `${folder}/.cg`;
172
+ return file_1.listFiles(path)
173
+ .then(files => findCgProjectTokenFileInFiles(path, files, projectCode))
174
+ .then(tokenFile => {
175
+ if (tokenFile) {
176
+ return tokenFile;
177
+ }
178
+ else {
179
+ path = `${folder}`;
180
+ return file_1.listFiles(path)
181
+ .then(files => findCgProjectTokenFileInFiles(path, files, projectCode));
182
+ }
183
+ });
184
+ }
185
+ else {
186
+ return Promise.resolve(null);
187
+ }
188
+ }
189
+ function findCgProjectTokenFileInFiles(path, files, projectCode) {
190
+ if (files.length) {
191
+ let lowerPcode = projectCode.toLowerCase();
192
+ let fileIndex = files.findIndex(f => f == `${lowerPcode}.token`);
193
+ let file = null;
194
+ if (fileIndex == -1) {
195
+ file = files.shift();
196
+ }
197
+ else {
198
+ file = files[fileIndex];
199
+ files.splice(fileIndex, 1);
200
+ }
201
+ if (file.toLowerCase().endsWith('.token')) {
202
+ let tokenFile = `${path}/${file}`;
203
+ return file_1.getFileString(tokenFile, true)
204
+ .then(token => {
205
+ let arr = token.split('|');
206
+ if (arr && arr.length == 3 && projectCode == arr[0].toLowerCase()) {
207
+ return tokenFile;
208
+ }
209
+ else {
210
+ return findCgProjectTokenFileInFiles(path, files, projectCode);
211
+ }
212
+ });
213
+ }
214
+ else {
215
+ return findCgProjectTokenFileInFiles(path, files, projectCode);
216
+ }
217
+ }
218
+ else {
219
+ return Promise.resolve(null);
220
+ }
221
+ }
222
+ function findCgTokenFile(folder) {
223
+ if (folder) {
224
+ return file_1.listFiles(`${folder}/.cg`)
225
+ .then(files => {
226
+ let file = files.find(file => file.endsWith('.token'));
227
+ return file && `${folder}/.cg/${file}`;
228
+ });
229
+ }
230
+ else {
231
+ return Promise.resolve(null);
232
+ }
233
+ }
234
+ function chooseATokenFile(cwd, folder) {
235
+ return findCgTokenFile(folder)
236
+ .then(tokenFile => {
237
+ if (tokenFile) {
238
+ return tokenFile;
239
+ }
240
+ else {
241
+ return file_1.listFiles(cwd)
242
+ .then(files => {
243
+ files = files.filter(file => file.match(/\.token$/));
244
+ console.log('');
245
+ return inquirer_1.default.prompt([
246
+ {
247
+ type: 'list',
248
+ name: 'file',
249
+ message: 'Select a token to install:',
250
+ choices: ['[enter the token file myself]'].concat(files)
251
+ }
252
+ ]);
253
+ })
254
+ .then(choice => {
255
+ if (choice.file.startsWith('[')) {
256
+ return inquirer_1.default.prompt([
257
+ {
258
+ type: 'input',
259
+ name: 'file',
260
+ message: 'Enter the filename of the token:',
261
+ }
262
+ ])
263
+ .then(input => input.file);
264
+ }
265
+ else {
266
+ return choice.file;
267
+ }
268
+ })
269
+ .then(file => {
270
+ return `${cwd}/${file}`;
271
+ });
272
+ }
273
+ });
274
+ }
275
275
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlcGFyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9nYW1lbGV0L3ByZXBhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsd0NBQWlHO0FBQ2pHLHdEQUFnQztBQUVoQyxNQUFNLHdCQUF3QixHQUFHLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztBQVdoRSxTQUFnQixPQUFPLENBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxHQUFHLElBQUksRUFBRSxNQUFNLEdBQUcsSUFBSSxFQUFFLGFBQWEsR0FBRyxJQUFJLEVBQUUsS0FBSyxHQUFHLEtBQUssRUFBRTtJQUNyRyxJQUFJLEtBQUssRUFBRTtRQUNQLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7S0FDL0I7SUFFRCxJQUFJLE1BQU0sR0FBbUI7UUFDekIsS0FBSyxFQUFFLElBQUk7UUFDWCxXQUFXLEVBQUUsSUFBSTtRQUNqQixNQUFNLEVBQUUsSUFBSTtRQUNaLGFBQWEsRUFBRSxVQUFVO0tBQzVCLENBQUE7SUFDRCxJQUFJLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFBRTtRQUNsRCxNQUFNLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztLQUN4QztJQUVELElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN4QixJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDbEIsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDdkM7SUFDRCxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQy9CLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0tBQ2hEO0lBRUQsSUFBSSxNQUFNLEVBQUU7UUFDUixNQUFNLENBQUMsTUFBTSxHQUFHLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztLQUMvQztJQUVELE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRTtTQUNuQixJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ1AsSUFBSSxhQUFhLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQ3RELElBQUksZUFBZSxHQUFHLEdBQUcsYUFBYSxlQUFlLENBQUM7UUFDdEQsSUFBSSxpQkFBVSxDQUFDLGVBQWUsQ0FBQyxFQUFFO1lBQzdCLElBQUksU0FBUyxFQUFFO2dCQUNYLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxrREFBa0QsQ0FBQyxDQUFBO2FBQzVFO1lBQ0QsT0FBTyxrQkFBVyxDQUFDLGVBQWUsQ0FBQztpQkFDOUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFO2dCQUNoQixNQUFNLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3BELE9BQU8sc0JBQXNCLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUM7cUJBQzNELElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRTtvQkFDZCxJQUFJLFNBQVMsRUFBRTt3QkFDWCxPQUFPLG9CQUFhLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQzs2QkFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFOzRCQUNWLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7NEJBQzNCLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO2dDQUN4QixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFO29DQUM1QyxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsNENBQTRDLENBQUMsQ0FBQTtpQ0FDdEU7Z0NBQ0QsTUFBTSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7Z0NBQ3JCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDO2dDQUM5QixJQUFJLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFBRTtvQ0FDbEQsTUFBTSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7aUNBQ3hDO3FDQUFNO29DQUNILE9BQU8sa0JBQVEsQ0FBQyxNQUFNLENBQUM7d0NBQ25COzRDQUNJLElBQUksRUFBRSxNQUFNOzRDQUNaLElBQUksRUFBRSxTQUFTOzRDQUNmLE9BQU8sRUFBRSxpREFBaUQ7NENBQzFELE9BQU8sRUFBRTtnREFDTCwwQkFBMEI7Z0RBQzFCLFdBQVc7Z0RBQ1gsT0FBTzs2Q0FDVjt5Q0FDSjtxQ0FDSixDQUFDO3lDQUNHLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTt3Q0FDWCxJQUFJLE1BQU0sQ0FBQyxPQUFPLElBQUksV0FBVyxFQUFFOzRDQUMvQixNQUFNLENBQUMsYUFBYSxHQUFHLFdBQVcsQ0FBQzt5Q0FDdEM7NkNBQU0sSUFBSSxNQUFNLENBQUMsT0FBTyxJQUFJLE9BQU8sRUFBRTs0Q0FDbEMsTUFBTSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUM7eUNBQ2xDOzZDQUFNOzRDQUNILE1BQU0sQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDO3lDQUNqQztvQ0FDTCxDQUFDLENBQUMsQ0FBQTtpQ0FDVDs2QkFDSjtpQ0FBTTtnQ0FDSCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQTs2QkFDOUM7d0JBQ0wsQ0FBQyxDQUFDLENBQUE7cUJBQ1Q7eUJBQU07d0JBQ0gsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLDJDQUEyQyxDQUFDLENBQUE7cUJBQ3JFO2dCQUNMLENBQUMsQ0FBQyxDQUFBO1lBQ1YsQ0FBQyxDQUFDLENBQUE7U0FDVDthQUFNO1lBQ0gsSUFBSSxTQUFTLEVBQUU7Z0JBQ1gsU0FBUyxHQUFHLEdBQUcsR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNsQyxJQUFJLGlCQUFVLENBQUMsU0FBUyxDQUFDLEVBQUU7b0JBQ3ZCLE9BQU8sb0JBQWEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDO3lCQUNoQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7d0JBQ1YsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDM0IsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7NEJBQ3hCLE1BQU0sQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUM1QixNQUFNLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQzt5QkFDeEI7NkJBQU07NEJBQ0gsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUE7eUJBQzlDO3dCQUNELE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUM3QixDQUFDLENBQUMsQ0FBQTtpQkFDVDtxQkFBTTtvQkFDSCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsNkJBQTZCLENBQUMsQ0FBQTtpQkFDdkQ7YUFDSjtpQkFBTSxJQUFJLE9BQU8sSUFBSSxVQUFVLElBQUksT0FBTyxJQUFJLE9BQU8sRUFBRTtnQkFDcEQsT0FBTyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDO3FCQUMvQixJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUU7b0JBQ2QsSUFBSSxpQkFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFO3dCQUN2QixPQUFPLG9CQUFhLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQzs2QkFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFOzRCQUNWLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7NEJBQzNCLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO2dDQUN4QixNQUFNLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQ0FDNUIsTUFBTSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7NkJBQ3hCO2lDQUFNO2dDQUNILE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBOzZCQUM5Qzs0QkFDRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDN0IsQ0FBQyxDQUFDLENBQUE7cUJBQ1Q7eUJBQU07d0JBQ0gsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLDZCQUE2QixDQUFDLENBQUE7cUJBQ3ZEO2dCQUNMLENBQUMsQ0FBQyxDQUFBO2FBQ1Q7aUJBQU07Z0JBQ0gsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLG1DQUFtQyxDQUFDLENBQUE7YUFDN0Q7U0FDSjtJQUNMLENBQUMsQ0FBQztTQUNELElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDUCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFO1lBQ3RDLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDeEMsT0FBTyxvQkFBYSxDQUFDLE1BQU0sQ0FBQztpQkFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNWLElBQUksQ0FBQyxLQUFLLEVBQUU7b0JBQ1IsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLG9DQUFvQyxDQUFDLENBQUE7aUJBQzlEO3FCQUFNO29CQUNILE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO2lCQUMxQjtnQkFDRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM3QixDQUFDLENBQUMsQ0FBQTtTQUNUO2FBQU07WUFDSCxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUM1QjtJQUNMLENBQUMsQ0FBQztTQUNELElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUM7U0FDbEIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ1QsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDLENBQUMsQ0FBQTtBQUNWLENBQUM7QUFuSkQsMEJBbUpDO0FBR0QsU0FBUyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsV0FBVztJQUMvQyxJQUFJLE1BQU0sRUFBRTtRQUNSLElBQUksSUFBSSxHQUFHLEdBQUcsTUFBTSxNQUFNLENBQUM7UUFDM0IsT0FBTyxnQkFBUyxDQUFDLElBQUksQ0FBQzthQUNqQixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO2FBQ3RFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNkLElBQUksU0FBUyxFQUFFO2dCQUNYLE9BQU8sU0FBUyxDQUFDO2FBQ3BCO2lCQUFNO2dCQUNILElBQUksR0FBRyxHQUFHLE1BQU0sRUFBRSxDQUFDO2dCQUNuQixPQUFPLGdCQUFTLENBQUMsSUFBSSxDQUFDO3FCQUNqQixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUE7YUFDOUU7UUFDTCxDQUFDLENBQUMsQ0FBQTtLQUNUO1NBQU07UUFDSCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDaEM7QUFDTCxDQUFDO0FBQ0QsU0FBUyw2QkFBNkIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFdBQVc7SUFDM0QsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFO1FBQ2QsSUFBSSxVQUFVLEdBQUcsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzNDLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksR0FBRyxVQUFVLFFBQVEsQ0FBQyxDQUFDO1FBQ2pFLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztRQUNoQixJQUFJLFNBQVMsSUFBSSxDQUFDLENBQUMsRUFBRTtZQUNqQixJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ3hCO2FBQU07WUFDSCxJQUFJLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3hCLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQzlCO1FBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3ZDLElBQUksU0FBUyxHQUFHLEdBQUcsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2xDLE9BQU8sb0JBQWEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDO2lCQUNoQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ1YsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDM0IsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksV0FBVyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRTtvQkFDL0QsT0FBTyxTQUFTLENBQUM7aUJBQ3BCO3FCQUFNO29CQUNILE9BQU8sNkJBQTZCLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztpQkFDbEU7WUFDTCxDQUFDLENBQUMsQ0FBQTtTQUNUO2FBQU07WUFDSCxPQUFPLDZCQUE2QixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7U0FDbEU7S0FDSjtTQUFNO1FBQ0gsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ2hDO0FBQ0wsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLE1BQU07SUFDM0IsSUFBSSxNQUFNLEVBQUU7UUFDUixPQUFPLGdCQUFTLENBQUMsR0FBRyxNQUFNLE1BQU0sQ0FBQzthQUM1QixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDVixJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ3ZELE9BQU8sSUFBSSxJQUFJLEdBQUcsTUFBTSxRQUFRLElBQUksRUFBRSxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFBO0tBQ1Q7U0FBTTtRQUNILE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNoQztBQUVMLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxNQUFNO0lBQ2pDLE9BQU8sZUFBZSxDQUFDLE1BQU0sQ0FBQztTQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUU7UUFDZCxJQUFJLFNBQVMsRUFBRTtZQUNYLE9BQU8sU0FBUyxDQUFDO1NBQ3BCO2FBQU07WUFDSCxPQUFPLGdCQUFTLENBQUMsR0FBRyxDQUFDO2lCQUNoQixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ1YsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUE7Z0JBQ3BELE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUE7Z0JBQ2YsT0FBTyxrQkFBUSxDQUFDLE1BQU0sQ0FBQztvQkFDbkI7d0JBQ0ksSUFBSSxFQUFFLE1BQU07d0JBQ1osSUFBSSxFQUFFLE1BQU07d0JBQ1osT0FBTyxFQUFFLDRCQUE0Qjt3QkFDckMsT0FBTyxFQUFFLENBQUMsK0JBQStCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO3FCQUMzRDtpQkFDSixDQUFDLENBQUE7WUFDTixDQUFDLENBQUM7aUJBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNYLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQzdCLE9BQU8sa0JBQVEsQ0FBQyxNQUFNLENBQUM7d0JBQ25COzRCQUNJLElBQUksRUFBRSxPQUFPOzRCQUNiLElBQUksRUFBRSxNQUFNOzRCQUNaLE9BQU8sRUFBRSxrQ0FBa0M7eUJBQzlDO3FCQUNKLENBQUM7eUJBQ0csSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO2lCQUNqQztxQkFBTTtvQkFDSCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUM7aUJBQ3RCO1lBQ0wsQ0FBQyxDQUFDO2lCQUNELElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDVCxPQUFPLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFBO1lBQzNCLENBQUMsQ0FBQyxDQUFBO1NBQ1Q7SUFDTCxDQUFDLENBQUMsQ0FBQTtBQUVWLENBQUMifQ==