UNPKG

45.2 kBJavaScriptView Raw
1"use strict";
2var __extends = (this && this.__extends) || (function () {
3 var extendStatics = function (d, b) {
4 extendStatics = Object.setPrototypeOf ||
5 ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6 function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
7 return extendStatics(d, b);
8 };
9 return function (d, b) {
10 extendStatics(d, b);
11 function __() { this.constructor = d; }
12 d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
13 };
14})();
15var __assign = (this && this.__assign) || function () {
16 __assign = Object.assign || function(t) {
17 for (var s, i = 1, n = arguments.length; i < n; i++) {
18 s = arguments[i];
19 for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
20 t[p] = s[p];
21 }
22 return t;
23 };
24 return __assign.apply(this, arguments);
25};
26var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
27 var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
28 if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
29 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;
30 return c > 3 && r && Object.defineProperty(target, key, r), r;
31};
32var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
33 return new (P || (P = Promise))(function (resolve, reject) {
34 function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
35 function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
36 function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
37 step((generator = generator.apply(thisArg, _arguments || [])).next());
38 });
39};
40var __generator = (this && this.__generator) || function (thisArg, body) {
41 var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
42 return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
43 function verb(n) { return function (v) { return step([n, v]); }; }
44 function step(op) {
45 if (f) throw new TypeError("Generator is already executing.");
46 while (_) try {
47 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;
48 if (y = 0, t) op = [op[0] & 2, t.value];
49 switch (op[0]) {
50 case 0: case 1: t = op; break;
51 case 4: _.label++; return { value: op[1], done: false };
52 case 5: _.label++; y = op[1]; op = [0]; continue;
53 case 7: op = _.ops.pop(); _.trys.pop(); continue;
54 default:
55 if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
56 if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
57 if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
58 if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
59 if (t[2]) _.ops.pop();
60 _.trys.pop(); continue;
61 }
62 op = body.call(thisArg, _);
63 } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
64 if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
65 }
66};
67var __read = (this && this.__read) || function (o, n) {
68 var m = typeof Symbol === "function" && o[Symbol.iterator];
69 if (!m) return o;
70 var i = m.call(o), r, ar = [], e;
71 try {
72 while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
73 }
74 catch (error) { e = { error: error }; }
75 finally {
76 try {
77 if (r && !r.done && (m = i["return"])) m.call(i);
78 }
79 finally { if (e) throw e.error; }
80 }
81 return ar;
82};
83var __importDefault = (this && this.__importDefault) || function (mod) {
84 return (mod && mod.__esModule) ? mod : { "default": mod };
85};
86Object.defineProperty(exports, "__esModule", { value: true });
87var rest_1 = __importDefault(require("@octokit/rest"));
88var gitlog_1 = __importDefault(require("gitlog"));
89var tinycolor2_1 = __importDefault(require("tinycolor2"));
90var util_1 = require("util");
91var typescript_memoize_1 = require("typescript-memoize");
92var exec_promise_1 = __importDefault(require("./utils/exec-promise"));
93var logger_1 = require("./utils/logger");
94var gitlog = util_1.promisify(gitlog_1.default);
95function getRandomColor() {
96 return Math.floor(Math.random() * 16777215)
97 .toString(16)
98 .padStart(6, '0');
99}
100exports.getRandomColor = getRandomColor;
101var GitAPIError = /** @class */ (function (_super) {
102 __extends(GitAPIError, _super);
103 function GitAPIError(api, args, origError) {
104 return _super.call(this, "Error calling github: " + api + "\n\twith: " + JSON.stringify(args) + ".\n\t" + origError.message) || this;
105 }
106 return GitAPIError;
107}(Error));
108var makeCommentIdentifier = function (context) {
109 return "<!-- GITHUB_RELEASE COMMENT: " + context + " -->";
110};
111// A class to interact with the local git instance and the git remote.
112// currently it only interfaces with GitHub.
113var Git = /** @class */ (function () {
114 function Git(options, logger) {
115 if (logger === void 0) { logger = logger_1.dummyLog(); }
116 this.logger = logger;
117 this.options = options;
118 this.baseUrl = this.options.baseUrl || 'https://api.github.com';
119 this.logger.veryVerbose.info("Initializing GitHub with: " + this.baseUrl);
120 this.ghub = new rest_1.default({
121 baseUrl: this.baseUrl,
122 auth: "token " + this.options.token,
123 previews: ['symmetra-preview']
124 });
125 }
126 Git.prototype.getLatestReleaseInfo = function () {
127 return __awaiter(this, void 0, void 0, function () {
128 var latestRelease;
129 return __generator(this, function (_a) {
130 switch (_a.label) {
131 case 0: return [4 /*yield*/, this.ghub.repos.getLatestRelease({
132 owner: this.options.owner,
133 repo: this.options.repo
134 })];
135 case 1:
136 latestRelease = _a.sent();
137 return [2 /*return*/, latestRelease.data];
138 }
139 });
140 });
141 };
142 Git.prototype.getLatestRelease = function () {
143 return __awaiter(this, void 0, void 0, function () {
144 var latestRelease, e_1;
145 return __generator(this, function (_a) {
146 switch (_a.label) {
147 case 0:
148 _a.trys.push([0, 2, , 3]);
149 return [4 /*yield*/, this.getLatestReleaseInfo()];
150 case 1:
151 latestRelease = _a.sent();
152 this.logger.veryVerbose.info('Got response for "getLatestRelease":\n', latestRelease);
153 this.logger.verbose.info('Got latest release:\n', latestRelease);
154 return [2 /*return*/, latestRelease.tag_name];
155 case 2:
156 e_1 = _a.sent();
157 if (e_1.status === 404) {
158 this.logger.verbose.info("Couldn't find latest release on GitHub, using first commit.");
159 return [2 /*return*/, this.getFirstCommit()];
160 }
161 throw e_1;
162 case 3: return [2 /*return*/];
163 }
164 });
165 });
166 };
167 Git.prototype.getCommitDate = function (sha) {
168 return __awaiter(this, void 0, void 0, function () {
169 var date, _a, day, time, timezone;
170 return __generator(this, function (_b) {
171 switch (_b.label) {
172 case 0: return [4 /*yield*/, exec_promise_1.default('git', ['show', '-s', '--format=%ci', sha])];
173 case 1:
174 date = _b.sent();
175 _a = __read(date.split(' '), 3), day = _a[0], time = _a[1], timezone = _a[2];
176 return [2 /*return*/, day + "T" + time + timezone];
177 }
178 });
179 });
180 };
181 Git.prototype.getFirstCommit = function () {
182 return __awaiter(this, void 0, void 0, function () {
183 var list;
184 return __generator(this, function (_a) {
185 switch (_a.label) {
186 case 0: return [4 /*yield*/, exec_promise_1.default('git', ['rev-list', 'HEAD'])];
187 case 1:
188 list = _a.sent();
189 return [2 /*return*/, list.split('\n').pop()];
190 }
191 });
192 });
193 };
194 Git.prototype.getSha = function () {
195 return __awaiter(this, void 0, void 0, function () {
196 var result;
197 return __generator(this, function (_a) {
198 switch (_a.label) {
199 case 0: return [4 /*yield*/, exec_promise_1.default('git', ['rev-parse', 'HEAD'])];
200 case 1:
201 result = _a.sent();
202 this.logger.verbose.info("Got commit SHA from HEAD: " + result);
203 return [2 /*return*/, result];
204 }
205 });
206 });
207 };
208 Git.prototype.getLabels = function (prNumber) {
209 return __awaiter(this, void 0, void 0, function () {
210 var args, labels, e_2;
211 return __generator(this, function (_a) {
212 switch (_a.label) {
213 case 0:
214 this.logger.verbose.info("Getting labels for PR: " + prNumber);
215 args = {
216 owner: this.options.owner,
217 repo: this.options.repo,
218 number: prNumber
219 };
220 this.logger.verbose.info('Getting issue labels using:', args);
221 _a.label = 1;
222 case 1:
223 _a.trys.push([1, 3, , 4]);
224 return [4 /*yield*/, this.ghub.issues.listLabelsOnIssue(args)];
225 case 2:
226 labels = _a.sent();
227 this.logger.veryVerbose.info('Got response for "listLabelsOnIssue":\n', labels);
228 this.logger.verbose.info('Found labels on PR:\n', labels.data);
229 return [2 /*return*/, labels.data.map(function (l) { return l.name; })];
230 case 3:
231 e_2 = _a.sent();
232 throw new GitAPIError('listLabelsOnIssue', args, e_2);
233 case 4: return [2 /*return*/];
234 }
235 });
236 });
237 };
238 Git.prototype.getProjectLabels = function () {
239 return __awaiter(this, void 0, void 0, function () {
240 var args, labels, e_3;
241 return __generator(this, function (_a) {
242 switch (_a.label) {
243 case 0:
244 this.logger.verbose.info("Getting labels for project: " + this.options.repo);
245 args = {
246 owner: this.options.owner,
247 repo: this.options.repo
248 };
249 _a.label = 1;
250 case 1:
251 _a.trys.push([1, 3, , 4]);
252 return [4 /*yield*/, this.ghub.issues.listLabelsForRepo(args)];
253 case 2:
254 labels = _a.sent();
255 this.logger.veryVerbose.info('Got response for "getProjectLabels":\n', labels);
256 this.logger.verbose.info('Found labels on project:\n', labels.data);
257 return [2 /*return*/, labels.data.map(function (l) { return l.name; })];
258 case 3:
259 e_3 = _a.sent();
260 throw new GitAPIError('getProjectLabels', args, e_3);
261 case 4: return [2 /*return*/];
262 }
263 });
264 });
265 };
266 Git.prototype.getGitLog = function (start, end) {
267 if (end === void 0) { end = 'HEAD'; }
268 return __awaiter(this, void 0, void 0, function () {
269 var log;
270 return __generator(this, function (_a) {
271 switch (_a.label) {
272 case 0: return [4 /*yield*/, gitlog({
273 repo: process.cwd(),
274 number: Number.MAX_SAFE_INTEGER,
275 fields: ['hash', 'authorName', 'authorEmail', 'rawBody'],
276 branch: start.trim() + ".." + end.trim()
277 })];
278 case 1:
279 log = _a.sent();
280 return [2 /*return*/, log.map(function (commit) { return ({
281 hash: commit.hash,
282 authorName: commit.authorName,
283 authorEmail: commit.authorEmail,
284 subject: commit.rawBody
285 }); })];
286 }
287 });
288 });
289 };
290 Git.prototype.getUserByEmail = function (email) {
291 return __awaiter(this, void 0, void 0, function () {
292 var search;
293 return __generator(this, function (_a) {
294 switch (_a.label) {
295 case 0: return [4 /*yield*/, this.ghub.search.users({
296 q: "in:email " + email
297 })];
298 case 1:
299 search = (_a.sent()).data;
300 return [2 /*return*/, search && search.items.length > 0
301 ? search.items[0]
302 : { login: email }];
303 }
304 });
305 });
306 };
307 Git.prototype.getUserByUsername = function (username) {
308 return __awaiter(this, void 0, void 0, function () {
309 return __generator(this, function (_a) {
310 switch (_a.label) {
311 case 0: return [4 /*yield*/, this.ghub.users.getByUsername({
312 username: username
313 })];
314 case 1: return [2 /*return*/, (_a.sent()).data];
315 }
316 });
317 });
318 };
319 Git.prototype.getPullRequest = function (pr) {
320 return __awaiter(this, void 0, void 0, function () {
321 var args, result;
322 return __generator(this, function (_a) {
323 switch (_a.label) {
324 case 0:
325 this.logger.verbose.info("Getting Pull Request: " + pr);
326 args = {
327 owner: this.options.owner,
328 repo: this.options.repo,
329 number: pr
330 };
331 this.logger.verbose.info('Getting pull request info using:', args);
332 return [4 /*yield*/, this.ghub.pulls.get(args)];
333 case 1:
334 result = _a.sent();
335 this.logger.veryVerbose.info('Got pull request data\n', result);
336 this.logger.verbose.info('Got pull request info');
337 return [2 /*return*/, result];
338 }
339 });
340 });
341 };
342 Git.prototype.searchRepo = function (options) {
343 return __awaiter(this, void 0, void 0, function () {
344 var repo, result;
345 return __generator(this, function (_a) {
346 switch (_a.label) {
347 case 0:
348 repo = "repo:" + this.options.owner + "/" + this.options.repo;
349 options.q = repo + " " + options.q;
350 this.logger.verbose.info('Searching repo using:\n', options);
351 return [4 /*yield*/, this.ghub.search.issuesAndPullRequests(options)];
352 case 1:
353 result = _a.sent();
354 this.logger.veryVerbose.info('Got response from search\n', result);
355 this.logger.verbose.info('Searched repo on GitHub.');
356 return [2 /*return*/, result.data];
357 }
358 });
359 });
360 };
361 Git.prototype.createStatus = function (prInfo) {
362 return __awaiter(this, void 0, void 0, function () {
363 var args, result;
364 return __generator(this, function (_a) {
365 switch (_a.label) {
366 case 0:
367 args = __assign({}, prInfo, { owner: this.options.owner, repo: this.options.repo });
368 this.logger.verbose.info('Creating status using:\n', args);
369 return [4 /*yield*/, this.ghub.repos.createStatus(args)];
370 case 1:
371 result = _a.sent();
372 this.logger.veryVerbose.info('Got response from createStatues\n', result);
373 this.logger.verbose.info('Created status on GitHub.');
374 return [2 /*return*/, result];
375 }
376 });
377 });
378 };
379 Git.prototype.createLabel = function (name, label) {
380 return __awaiter(this, void 0, void 0, function () {
381 var color, result;
382 return __generator(this, function (_a) {
383 switch (_a.label) {
384 case 0:
385 this.logger.verbose.info("Creating \"" + name + "\" label :\n" + label.name);
386 color = label.color
387 ? tinycolor2_1.default(label.color).toString('hex6')
388 : tinycolor2_1.default.random().toString('hex6');
389 return [4 /*yield*/, this.ghub.issues.createLabel({
390 name: label.name,
391 owner: this.options.owner,
392 repo: this.options.repo,
393 color: color.replace('#', ''),
394 description: label.description
395 })];
396 case 1:
397 result = _a.sent();
398 this.logger.veryVerbose.info('Got response from createLabel\n', result);
399 this.logger.verbose.info('Created label on GitHub.');
400 return [2 /*return*/, result];
401 }
402 });
403 });
404 };
405 Git.prototype.addLabelToPr = function (pr, label) {
406 return __awaiter(this, void 0, void 0, function () {
407 var result;
408 return __generator(this, function (_a) {
409 switch (_a.label) {
410 case 0:
411 this.logger.verbose.info("Creating \"" + label + "\" label to PR " + pr);
412 return [4 /*yield*/, this.ghub.issues.addLabels({
413 number: pr,
414 owner: this.options.owner,
415 repo: this.options.repo,
416 labels: [label]
417 })];
418 case 1:
419 result = _a.sent();
420 this.logger.veryVerbose.info('Got response from addLabels\n', result);
421 this.logger.verbose.info('Added labels on Pull Request.');
422 return [2 /*return*/, result];
423 }
424 });
425 });
426 };
427 Git.prototype.lockIssue = function (issue) {
428 return __awaiter(this, void 0, void 0, function () {
429 var result;
430 return __generator(this, function (_a) {
431 switch (_a.label) {
432 case 0:
433 this.logger.verbose.info("Locking #" + issue + " issue...");
434 return [4 /*yield*/, this.ghub.issues.lock({
435 number: issue,
436 owner: this.options.owner,
437 repo: this.options.repo
438 })];
439 case 1:
440 result = _a.sent();
441 this.logger.veryVerbose.info('Got response from lock\n', result);
442 this.logger.verbose.info('Locked issue.');
443 return [2 /*return*/, result];
444 }
445 });
446 });
447 };
448 Git.prototype.getProject = function () {
449 return __awaiter(this, void 0, void 0, function () {
450 var result;
451 return __generator(this, function (_a) {
452 switch (_a.label) {
453 case 0:
454 this.logger.verbose.info('Getting project from GitHub');
455 return [4 /*yield*/, this.ghub.repos.get({
456 owner: this.options.owner,
457 repo: this.options.repo
458 })];
459 case 1:
460 result = (_a.sent()).data;
461 this.logger.veryVerbose.info('Got response from repos\n', result);
462 this.logger.verbose.info('Got project information.');
463 return [2 /*return*/, result];
464 }
465 });
466 });
467 };
468 Git.prototype.getPullRequests = function (options) {
469 return __awaiter(this, void 0, void 0, function () {
470 var result;
471 return __generator(this, function (_a) {
472 switch (_a.label) {
473 case 0:
474 this.logger.verbose.info('Getting pull requests...');
475 return [4 /*yield*/, this.ghub.pulls.list(__assign({ owner: this.options.owner.toLowerCase(), repo: this.options.repo.toLowerCase() }, options))];
476 case 1:
477 result = (_a.sent()).data;
478 this.logger.veryVerbose.info('Got response from pull requests', result);
479 this.logger.verbose.info('Got pull request');
480 return [2 /*return*/, result];
481 }
482 });
483 });
484 };
485 Git.prototype.getCommitsForPR = function (pr) {
486 return __awaiter(this, void 0, void 0, function () {
487 var result;
488 return __generator(this, function (_a) {
489 switch (_a.label) {
490 case 0:
491 this.logger.verbose.info("Getting commits for PR #" + pr);
492 return [4 /*yield*/, this.ghub.pulls.listCommits({
493 owner: this.options.owner.toLowerCase(),
494 repo: this.options.repo.toLowerCase(),
495 number: pr
496 })];
497 case 1:
498 result = (_a.sent()).data;
499 this.logger.veryVerbose.info("Got response from PR #" + pr + "\n", result);
500 this.logger.verbose.info("Got commits for PR #" + pr + ".");
501 return [2 /*return*/, result];
502 }
503 });
504 });
505 };
506 Git.prototype.createComment = function (message, pr, context) {
507 if (context === void 0) { context = 'default'; }
508 return __awaiter(this, void 0, void 0, function () {
509 var commentIdentifier, comments, oldMessage, result;
510 return __generator(this, function (_a) {
511 switch (_a.label) {
512 case 0:
513 commentIdentifier = makeCommentIdentifier(context);
514 this.logger.verbose.info('Using comment identifier:', commentIdentifier);
515 this.logger.verbose.info('Getting previous comments on:', pr);
516 return [4 /*yield*/, this.ghub.issues.listComments({
517 owner: this.options.owner,
518 repo: this.options.repo,
519 number: pr
520 })];
521 case 1:
522 comments = _a.sent();
523 this.logger.veryVerbose.info('Got PR comments\n', comments);
524 oldMessage = comments.data.find(function (comment) {
525 return comment.body.includes(commentIdentifier);
526 });
527 if (!oldMessage) return [3 /*break*/, 3];
528 this.logger.verbose.info('Found previous message from same scope.');
529 this.logger.verbose.info('Deleting previous comment');
530 return [4 /*yield*/, this.ghub.issues.deleteComment({
531 owner: this.options.owner,
532 repo: this.options.repo,
533 comment_id: oldMessage.id
534 })];
535 case 2:
536 _a.sent();
537 this.logger.verbose.info('Successfully deleted previous comment');
538 _a.label = 3;
539 case 3:
540 this.logger.verbose.info('Creating new comment');
541 return [4 /*yield*/, this.ghub.issues.createComment({
542 owner: this.options.owner,
543 repo: this.options.repo,
544 number: pr,
545 body: commentIdentifier + "\n" + message
546 })];
547 case 4:
548 result = _a.sent();
549 this.logger.veryVerbose.info('Got response from creating comment\n', result);
550 this.logger.verbose.info('Successfully posted comment to PR');
551 return [2 /*return*/, result];
552 }
553 });
554 });
555 };
556 Git.prototype.publish = function (releaseNotes, tag) {
557 return __awaiter(this, void 0, void 0, function () {
558 var result;
559 return __generator(this, function (_a) {
560 switch (_a.label) {
561 case 0:
562 this.logger.verbose.info('Creating release on GitHub for tag:', tag);
563 return [4 /*yield*/, this.ghub.repos.createRelease({
564 owner: this.options.owner,
565 repo: this.options.repo,
566 tag_name: tag,
567 body: releaseNotes
568 })];
569 case 1:
570 result = _a.sent();
571 this.logger.veryVerbose.info('Got response from createRelease\n', result);
572 this.logger.verbose.info('Created GitHub release.');
573 return [2 /*return*/, result];
574 }
575 });
576 });
577 };
578 __decorate([
579 typescript_memoize_1.Memoize()
580 ], Git.prototype, "getLatestReleaseInfo", null);
581 __decorate([
582 typescript_memoize_1.Memoize()
583 ], Git.prototype, "getLatestRelease", null);
584 __decorate([
585 typescript_memoize_1.Memoize()
586 ], Git.prototype, "getLabels", null);
587 __decorate([
588 typescript_memoize_1.Memoize()
589 ], Git.prototype, "getGitLog", null);
590 __decorate([
591 typescript_memoize_1.Memoize()
592 ], Git.prototype, "getUserByEmail", null);
593 __decorate([
594 typescript_memoize_1.Memoize()
595 ], Git.prototype, "getUserByUsername", null);
596 __decorate([
597 typescript_memoize_1.Memoize()
598 ], Git.prototype, "getPullRequest", null);
599 __decorate([
600 typescript_memoize_1.Memoize()
601 ], Git.prototype, "getProject", null);
602 __decorate([
603 typescript_memoize_1.Memoize()
604 ], Git.prototype, "getCommitsForPR", null);
605 return Git;
606}());
607exports.default = Git;
608//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2dpdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHVEQUFpQztBQUNqQyxrREFBNkM7QUFDN0MsMERBQW1DO0FBQ25DLDZCQUFpQztBQUVqQyx5REFBNkM7QUFHN0Msc0VBQStDO0FBQy9DLHlDQUFtRDtBQUVuRCxJQUFNLE1BQU0sR0FBRyxnQkFBUyxDQUFDLGdCQUFVLENBQUMsQ0FBQztBQWNyQyxTQUFnQixjQUFjO0lBQzVCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDO1NBQ3hDLFFBQVEsQ0FBQyxFQUFFLENBQUM7U0FDWixRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCLENBQUM7QUFKRCx3Q0FJQztBQUVEO0lBQTBCLCtCQUFLO0lBQzdCLHFCQUFZLEdBQVcsRUFBRSxJQUFZLEVBQUUsU0FBZ0I7ZUFDckQsa0JBQ0UsMkJBQXlCLEdBQUcsa0JBQWEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFDM0QsU0FBUyxDQUFDLE9BQ1YsQ0FDSDtJQUNILENBQUM7SUFDSCxrQkFBQztBQUFELENBQUMsQUFSRCxDQUEwQixLQUFLLEdBUTlCO0FBRUQsSUFBTSxxQkFBcUIsR0FBRyxVQUFDLE9BQWU7SUFDNUMsT0FBQSxrQ0FBZ0MsT0FBTyxTQUFNO0FBQTdDLENBQTZDLENBQUM7QUFFaEQsc0VBQXNFO0FBQ3RFLDRDQUE0QztBQUM1QztJQU9FLGFBQVksT0FBb0IsRUFBRSxNQUE0QjtRQUE1Qix1QkFBQSxFQUFBLFNBQWtCLGlCQUFRLEVBQUU7UUFDNUQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFB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
\No newline at end of file