UNPKG

1.57 MBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, '__esModule', { value: true });
4
5function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
6
7var _ = require('lodash');
8var semver = require('semver');
9var Ast = require('ts-simple-ast');
10var Ast__default = _interopDefault(Ast);
11var fs = require('fs-extra');
12var path = require('path');
13var Handlebars = require('handlebars');
14var JSON5 = require('json5');
15var i18next = _interopDefault(require('i18next'));
16var LiveServer = require('live-server');
17
18const __assign = Object.assign || function (target) {
19 for (var source, i = 1; i < arguments.length; i++) {
20 source = arguments[i];
21 for (var prop in source) {
22 if (Object.prototype.hasOwnProperty.call(source, prop)) {
23 target[prop] = source[prop];
24 }
25 }
26 }
27 return target;
28};
29
30function __extends(d, b) {
31 for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
32 function __() { this.constructor = d; }
33 d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
34}
35
36var log = require('fancy-log');
37var c = require('chalk');
38var pkg = require('../package.json');
39var LEVEL;
40(function (LEVEL) {
41 LEVEL[LEVEL["INFO"] = 0] = "INFO";
42 LEVEL[LEVEL["DEBUG"] = 1] = "DEBUG";
43 LEVEL[LEVEL["ERROR"] = 2] = "ERROR";
44 LEVEL[LEVEL["WARN"] = 3] = "WARN";
45})(LEVEL || (LEVEL = {}));
46var Logger = /** @class */ (function () {
47 function Logger() {
48 this.name = pkg.name;
49 this.version = pkg.version;
50 this.logger = log;
51 this.silent = true;
52 }
53 Logger.prototype.info = function () {
54 var args = [];
55 for (var _i = 0; _i < arguments.length; _i++) {
56 args[_i] = arguments[_i];
57 }
58 if (!this.silent) {
59 return;
60 }
61 this.logger(this.format.apply(this, [LEVEL.INFO].concat(args)));
62 };
63 Logger.prototype.error = function () {
64 var args = [];
65 for (var _i = 0; _i < arguments.length; _i++) {
66 args[_i] = arguments[_i];
67 }
68 if (!this.silent) {
69 return;
70 }
71 this.logger(this.format.apply(this, [LEVEL.ERROR].concat(args)));
72 };
73 Logger.prototype.warn = function () {
74 var args = [];
75 for (var _i = 0; _i < arguments.length; _i++) {
76 args[_i] = arguments[_i];
77 }
78 if (!this.silent) {
79 return;
80 }
81 this.logger(this.format.apply(this, [LEVEL.WARN].concat(args)));
82 };
83 Logger.prototype.debug = function () {
84 var args = [];
85 for (var _i = 0; _i < arguments.length; _i++) {
86 args[_i] = arguments[_i];
87 }
88 if (!this.silent) {
89 return;
90 }
91 this.logger(this.format.apply(this, [LEVEL.DEBUG].concat(args)));
92 };
93 Logger.prototype.format = function (level) {
94 var args = [];
95 for (var _i = 1; _i < arguments.length; _i++) {
96 args[_i - 1] = arguments[_i];
97 }
98 var pad = function (s, l, z) {
99 if (z === void 0) { z = ''; }
100 return s + Array(Math.max(0, l - s.length + 1)).join(z);
101 };
102 var msg = args.join(' ');
103 if (args.length > 1) {
104 msg = pad(args.shift(), 15, ' ') + ": " + args.join(' ');
105 }
106 switch (level) {
107 case LEVEL.INFO:
108 msg = c.green(msg);
109 break;
110 case LEVEL.DEBUG:
111 msg = c.cyan(msg);
112 break;
113 case LEVEL.WARN:
114 msg = c.yellow(msg);
115 break;
116 case LEVEL.ERROR:
117 msg = c.red(msg);
118 break;
119 }
120 return [
121 msg
122 ].join('');
123 };
124 return Logger;
125}());
126var logger = new Logger();
127
128var CompareHelper = /** @class */ (function () {
129 function CompareHelper() {
130 }
131 CompareHelper.prototype.helperFunc = function (context, a, operator, b, options) {
132 if (arguments.length < 4) {
133 throw new Error('handlebars Helper {{compare}} expects 4 arguments');
134 }
135 var result;
136 switch (operator) {
137 case 'indexof':
138 result = (b.indexOf(a) !== -1);
139 break;
140 case '===':
141 result = a === b;
142 break;
143 case '!==':
144 result = a !== b;
145 break;
146 case '>':
147 result = a > b;
148 break;
149 default: {
150 throw new Error('helper {{compare}}: invalid operator: `' + operator + '`');
151 }
152 }
153 if (result === false) {
154 return options.inverse(context);
155 }
156 return options.fn(context);
157 };
158 return CompareHelper;
159}());
160
161var OrHelper = /** @class */ (function () {
162 function OrHelper() {
163 }
164 OrHelper.prototype.helperFunc = function (context) {
165 var len = arguments.length - 1;
166 var options = arguments[len];
167 // We start at 1 because of options
168 for (var i = 1; i < len; i++) {
169 if (arguments[i]) {
170 return options.fn(context);
171 }
172 }
173 return options.inverse(context);
174 };
175 return OrHelper;
176}());
177
178var AngularAPIs = require('../src/data/api-list.json');
179var AngularApiUtil = /** @class */ (function () {
180 function AngularApiUtil() {
181 }
182 AngularApiUtil.prototype.findApi = function (type) {
183 var foundedApi;
184 _.forEach(AngularAPIs, function (mainApi) {
185 _.forEach(mainApi.items, function (api) {
186 if (api.title === type) {
187 foundedApi = api;
188 }
189 });
190 });
191 return {
192 source: 'external',
193 data: foundedApi
194 };
195 };
196 return AngularApiUtil;
197}());
198
199var AngularVersionUtil = /** @class */ (function () {
200 function AngularVersionUtil() {
201 }
202 AngularVersionUtil.prototype.cleanVersion = function (version) {
203 return version.replace('~', '')
204 .replace('^', '')
205 .replace('=', '')
206 .replace('<', '')
207 .replace('>', '');
208 };
209 AngularVersionUtil.prototype.getAngularVersionOfProject = function (packageData) {
210 var _result = '';
211 if (packageData.dependencies) {
212 var angularCore = packageData.dependencies[AngularVersionUtil.CorePackage];
213 if (angularCore) {
214 _result = this.cleanVersion(angularCore);
215 }
216 }
217 return _result;
218 };
219 AngularVersionUtil.prototype.isAngularVersionArchived = function (version) {
220 var result;
221 try {
222 result = semver.compare(version, '2.4.10') <= 0;
223 }
224 catch (e) { }
225 return result;
226 };
227 AngularVersionUtil.prototype.prefixOfficialDoc = function (version) {
228 return this.isAngularVersionArchived(version) ? 'v2.' : '';
229 };
230 AngularVersionUtil.prototype.getApiLink = function (api, angularVersion) {
231 var angularDocPrefix = this.prefixOfficialDoc(angularVersion);
232 return "https://" + angularDocPrefix + "angular.io/" + api.path;
233 };
234 AngularVersionUtil.CorePackage = '@angular/core';
235 return AngularVersionUtil;
236}());
237
238var BasicTypes;
239(function (BasicTypes) {
240 BasicTypes[BasicTypes["number"] = 0] = "number";
241 BasicTypes[BasicTypes["boolean"] = 1] = "boolean";
242 BasicTypes[BasicTypes["string"] = 2] = "string";
243 BasicTypes[BasicTypes["object"] = 3] = "object";
244 BasicTypes[BasicTypes["date"] = 4] = "date";
245 BasicTypes[BasicTypes["function"] = 5] = "function";
246})(BasicTypes || (BasicTypes = {}));
247var BasicTypeScriptTypes;
248(function (BasicTypeScriptTypes) {
249 BasicTypeScriptTypes[BasicTypeScriptTypes["any"] = 0] = "any";
250 BasicTypeScriptTypes[BasicTypeScriptTypes["void"] = 1] = "void";
251})(BasicTypeScriptTypes || (BasicTypeScriptTypes = {}));
252var BasicTypeUtil = /** @class */ (function () {
253 function BasicTypeUtil() {
254 }
255 /**
256 * Checks if a given types is a basic javascript type
257 * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects
258 * @param type The type to check
259 */
260 BasicTypeUtil.prototype.isJavascriptType = function (type) {
261 if (typeof type !== 'undefined') {
262 return (type.toLowerCase() in BasicTypes);
263 }
264 else {
265 return false;
266 }
267 };
268 /**
269 * Checks if a given type is a typescript type (That is not a javascript type)
270 * https://www.typescriptlang.org/docs/handbook/basic-types.html
271 * @param type The type to check
272 */
273 BasicTypeUtil.prototype.isTypeScriptType = function (type) {
274 if (typeof type !== 'undefined') {
275 return (type.toLowerCase() in BasicTypeScriptTypes);
276 }
277 else {
278 return false;
279 }
280 };
281 /**
282 * Check if the type is a typescript or javascript type
283 * @param type The type to check
284 */
285 BasicTypeUtil.prototype.isKnownType = function (type) {
286 return this.isJavascriptType(type) || this.isTypeScriptType(type);
287 };
288 /**
289 * Returns a official documentation link to either the javascript or typescript type
290 * @param type The type to check
291 * @returns The documentation link or undefined if type not found
292 */
293 BasicTypeUtil.prototype.getTypeUrl = function (type) {
294 if (this.isJavascriptType(type)) {
295 return "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/" + type;
296 }
297 if (this.isTypeScriptType(type)) {
298 return "https://www.typescriptlang.org/docs/handbook/basic-types.html";
299 }
300 return undefined;
301 };
302 return BasicTypeUtil;
303}());
304
305var JsdocParserUtil = /** @class */ (function () {
306 function JsdocParserUtil() {
307 }
308 JsdocParserUtil.prototype.isVariableLike = function (node) {
309 if (node) {
310 switch (node.kind) {
311 case Ast.SyntaxKind.BindingElement:
312 case Ast.SyntaxKind.EnumMember:
313 case Ast.SyntaxKind.Parameter:
314 case Ast.SyntaxKind.PropertyAssignment:
315 case Ast.SyntaxKind.PropertyDeclaration:
316 case Ast.SyntaxKind.PropertySignature:
317 case Ast.SyntaxKind.ShorthandPropertyAssignment:
318 case Ast.SyntaxKind.VariableDeclaration:
319 return true;
320 }
321 }
322 return false;
323 };
324 JsdocParserUtil.prototype.getMainCommentOfNode = function (node) {
325 var description = '';
326 if (node.jsDoc) {
327 if (node.jsDoc.length > 0) {
328 if (typeof node.jsDoc[0].comment !== 'undefined') {
329 description = node.jsDoc[0].comment;
330 }
331 }
332 }
333 return description;
334 };
335 JsdocParserUtil.prototype.getJSDocTags = function (node, kind) {
336 var docs = this.getJSDocs(node);
337 if (docs) {
338 var result = [];
339 for (var _i = 0, docs_1 = docs; _i < docs_1.length; _i++) {
340 var doc = docs_1[_i];
341 if (Ast.ts.isJSDocParameterTag(doc)) {
342 if (doc.kind === kind) {
343 result.push(doc);
344 }
345 }
346 else if (Ast.ts.isJSDoc(doc)) {
347 result.push.apply(result, _.filter(doc.tags, function (tag) { return tag.kind === kind; }));
348 }
349 else {
350 throw new Error('Unexpected type');
351 }
352 }
353 return result;
354 }
355 };
356 JsdocParserUtil.prototype.getJSDocs = function (node) {
357 // TODO: jsDocCache is internal, see if there's a way around it
358 var cache = node.jsDocCache;
359 if (!cache) {
360 cache = this.getJSDocsWorker(node, []).filter(function (x) { return x; });
361 node.jsDocCache = cache;
362 }
363 return cache;
364 };
365 // Try to recognize this pattern when node is initializer
366 // of variable declaration and JSDoc comments are on containing variable statement.
367 // /**
368 // * @param {number} name
369 // * @returns {number}
370 // */
371 // var x = function(name) { return name.length; }
372 JsdocParserUtil.prototype.getJSDocsWorker = function (node, cache) {
373 var parent = node.parent;
374 var isInitializerOfVariableDeclarationInStatement = this.isVariableLike(parent) &&
375 parent.initializer === node &&
376 Ast.ts.isVariableStatement(parent.parent.parent);
377 var isVariableOfVariableDeclarationStatement = this.isVariableLike(node) && Ast.ts.isVariableStatement(parent.parent);
378 var variableStatementNode = isInitializerOfVariableDeclarationInStatement
379 ? parent.parent.parent
380 : isVariableOfVariableDeclarationStatement
381 ? parent.parent
382 : undefined;
383 if (variableStatementNode) {
384 cache = this.getJSDocsWorker(variableStatementNode, cache);
385 }
386 // Also recognize when the node is the RHS of an assignment expression
387 var isSourceOfAssignmentExpressionStatement = parent &&
388 parent.parent &&
389 Ast.ts.isBinaryExpression(parent) &&
390 parent.operatorToken.kind === Ast.SyntaxKind.EqualsToken &&
391 Ast.ts.isExpressionStatement(parent.parent);
392 if (isSourceOfAssignmentExpressionStatement) {
393 cache = this.getJSDocsWorker(parent.parent, cache);
394 }
395 var isModuleDeclaration = Ast.ts.isModuleDeclaration(node) && parent && Ast.ts.isModuleDeclaration(parent);
396 var isPropertyAssignmentExpression = parent && Ast.ts.isPropertyAssignment(parent);
397 if (isModuleDeclaration || isPropertyAssignmentExpression) {
398 cache = this.getJSDocsWorker(parent, cache);
399 }
400 // Pull parameter comments from declaring function as well
401 if (Ast.ts.isParameter(node)) {
402 cache = _.concat(cache, this.getJSDocParameterTags(node));
403 }
404 if (this.isVariableLike(node) && node.initializer) {
405 cache = _.concat(cache, node.initializer.jsDoc);
406 }
407 cache = _.concat(cache, node.jsDoc);
408 return cache;
409 };
410 JsdocParserUtil.prototype.getJSDocParameterTags = function (param) {
411 var func = param.parent;
412 var tags = this.getJSDocTags(func, Ast.SyntaxKind.JSDocParameterTag);
413 if (!param.name) {
414 // this is an anonymous jsdoc param from a `function(type1, type2): type3` specification
415 var i = func.parameters.indexOf(param);
416 var paramTags = _.filter(tags, function (tag) { return Ast.ts.isJSDocParameterTag(tag); });
417 if (paramTags && 0 <= i && i < paramTags.length) {
418 return [paramTags[i]];
419 }
420 }
421 else if (Ast.ts.isIdentifier(param.name)) {
422 var name_1 = param.name.text;
423 return _.filter(tags, function (tag) {
424 if (Ast.ts && Ast.ts.isJSDocParameterTag(tag)) {
425 var t = tag;
426 if (typeof t.parameterName !== 'undefined') {
427 return t.parameterName.text === name_1;
428 }
429 else if (typeof t.name !== 'undefined') {
430 if (typeof t.name.escapedText !== 'undefined') {
431 return t.name.escapedText === name_1;
432 }
433 }
434 }
435 });
436 }
437 else {
438 // TODO: it's a destructured parameter, so it should look up an "object type" series of multiple lines
439 // But multi-line object types aren't supported yet either
440 return undefined;
441 }
442 };
443 return JsdocParserUtil;
444}());
445
446var FileEngine = /** @class */ (function () {
447 function FileEngine() {
448 }
449 FileEngine.prototype.get = function (filepath) {
450 return new Promise(function (resolve, reject) {
451 fs.readFile(path.resolve(filepath), 'utf8', function (err, data) {
452 if (err) {
453 reject('Error during ' + filepath + ' read');
454 }
455 else {
456 resolve(data);
457 }
458 });
459 });
460 };
461 FileEngine.prototype.write = function (filepath, contents) {
462 return new Promise(function (resolve, reject) {
463 fs.outputFile(path.resolve(filepath), contents, function (err) {
464 if (err) {
465 reject(err);
466 }
467 else {
468 resolve();
469 }
470 });
471 });
472 };
473 FileEngine.prototype.getSync = function (filepath) {
474 return fs.readFileSync(path.resolve(filepath), 'utf8');
475 };
476 /**
477 * @param file The file to check
478 */
479 FileEngine.prototype.existsSync = function (file) {
480 return fs.existsSync(file);
481 };
482 return FileEngine;
483}());
484
485var ast = new Ast__default();
486var ImportsUtil = /** @class */ (function () {
487 function ImportsUtil() {
488 }
489 /**
490 * Find for a sourceFile a variable value in a local enum
491 * @param srcFile
492 * @param variableName
493 * @param variableValue
494 */
495 ImportsUtil.prototype.findInEnums = function (srcFile, variableName, variableValue) {
496 var res = '';
497 srcFile.getEnum(function (e) {
498 if (e.getName() === variableName) {
499 e.getMember(function (m) {
500 if (m.getName() === variableValue) {
501 res = m.getValue();
502 }
503 });
504 }
505 });
506 return res;
507 };
508 /**
509 * Find for a sourceFile a variable value in a local static class
510 * @param srcFile
511 * @param variableName
512 * @param variableValue
513 */
514 ImportsUtil.prototype.findInClasses = function (srcFile, variableName, variableValue) {
515 var res = '';
516 srcFile.getClass(function (c) {
517 var staticProperty = c.getStaticProperty(variableValue);
518 if (staticProperty) {
519 if (staticProperty.getInitializer()) {
520 res = staticProperty.getInitializer().getText();
521 }
522 }
523 });
524 return res;
525 };
526 /**
527 * Find a value in a local variable declaration like an object
528 * @param variableDeclaration
529 * @param variablesAttributes
530 */
531 ImportsUtil.prototype.findInObjectVariableDeclaration = function (variableDeclaration, variablesAttributes) {
532 var variableKind = variableDeclaration.getKind();
533 if (variableKind && variableKind === Ast.SyntaxKind.VariableDeclaration) {
534 var initializer = variableDeclaration.getInitializer();
535 if (initializer) {
536 var initializerKind = initializer.getKind();
537 if (initializerKind && initializerKind === Ast.SyntaxKind.ObjectLiteralExpression) {
538 var compilerNode = initializer.compilerNode, finalValue_1 = '';
539 // Find thestring from AVAR.BVAR.thestring inside properties
540 var depth_1 = 0;
541 var loopProperties_1 = function (properties) {
542 properties.forEach(function (prop) {
543 if (prop.name) {
544 if (variablesAttributes[depth_1 + 1]) {
545 if (prop.name.getText() === variablesAttributes[depth_1 + 1]) {
546 if (prop.initializer) {
547 if (prop.initializer.properties) {
548 depth_1 += 1;
549 loopProperties_1(prop.initializer.properties);
550 }
551 else {
552 finalValue_1 = prop.initializer.text;
553 }
554 }
555 else {
556 finalValue_1 = prop.initializer.text;
557 }
558 }
559 }
560 }
561 });
562 };
563 loopProperties_1(compilerNode.properties);
564 return finalValue_1;
565 }
566 }
567 }
568 };
569 /**
570 * Find in imports something like myvar
571 * @param {string} inputVariableName like myvar
572 * @return {[type]} myvar value
573 */
574 ImportsUtil.prototype.findValueInImportOrLocalVariables = function (inputVariableName, sourceFile) {
575 var metadataVariableName = inputVariableName, searchedImport, aliasOriginalName = '', foundWithAlias = false;
576 var file = typeof ast.getSourceFile(sourceFile.fileName) !== 'undefined'
577 ? ast.getSourceFile(sourceFile.fileName)
578 : ast.addExistingSourceFileIfExists(sourceFile.fileName); // tslint:disable-line
579 var imports = file.getImportDeclarations();
580 /**
581 * Loop through all imports, and find one matching inputVariableName
582 */
583 imports.forEach(function (i) {
584 var namedImports = i.getNamedImports(), namedImportsLength = namedImports.length, j = 0;
585 if (namedImportsLength > 0) {
586 for (j; j < namedImportsLength; j++) {
587 var importName = namedImports[j].getNameNode().getText(), importAlias = void 0;
588 if (namedImports[j].getAliasIdentifier()) {
589 importAlias = namedImports[j].getAliasIdentifier().getText();
590 }
591 if (importName === metadataVariableName) {
592 searchedImport = i;
593 break;
594 }
595 if (importAlias === metadataVariableName) {
596 foundWithAlias = true;
597 aliasOriginalName = importName;
598 searchedImport = i;
599 break;
600 }
601 }
602 }
603 });
604 function hasFoundValues(variableDeclaration) {
605 var variableKind = variableDeclaration.getKind();
606 if (variableKind && variableKind === Ast.SyntaxKind.VariableDeclaration) {
607 var initializer = variableDeclaration.getInitializer();
608 if (initializer) {
609 var initializerKind = initializer.getKind();
610 if (initializerKind &&
611 initializerKind === Ast.SyntaxKind.ObjectLiteralExpression) {
612 var compilerNode = initializer.compilerNode;
613 return compilerNode.properties;
614 }
615 }
616 }
617 }
618 if (typeof searchedImport !== 'undefined') {
619 var importPathReference = searchedImport.getModuleSpecifierSourceFile();
620 var importPath = void 0;
621 if (typeof importPathReference !== 'undefined') {
622 importPath = importPathReference.compilerNode.fileName;
623 var sourceFileImport = typeof ast.getSourceFile(importPath) !== 'undefined'
624 ? ast.getSourceFile(importPath)
625 : ast.addExistingSourceFileIfExists(importPath); // tslint:disable-line
626 if (sourceFileImport) {
627 var variableName = foundWithAlias ? aliasOriginalName : metadataVariableName;
628 var variableDeclaration = sourceFileImport.getVariableDeclaration(variableName);
629 if (variableDeclaration) {
630 return hasFoundValues(variableDeclaration);
631 }
632 else {
633 // Try with exports
634 var exportDeclarations = sourceFileImport.getExportDeclarations();
635 if (exportDeclarations && exportDeclarations.length > 0) {
636 var i = 0, len = exportDeclarations.length;
637 for (i; i < len; i++) {
638 var exportDeclaration = exportDeclarations[i];
639 var sourceFileExportedReference = exportDeclaration.getModuleSpecifierSourceFile();
640 if (sourceFileExportedReference) {
641 var sourceFileExportedReferencePath = sourceFileExportedReference.getFilePath();
642 var sourceFileExported = typeof ast.getSourceFile(sourceFileExportedReferencePath) !== 'undefined'
643 ? ast.getSourceFile(sourceFileExportedReferencePath)
644 : ast.addExistingSourceFileIfExists(sourceFileExportedReferencePath);
645 if (sourceFileExported) {
646 variableDeclaration = sourceFileExported.getVariableDeclaration(variableName);
647 if (variableDeclaration) {
648 return hasFoundValues(variableDeclaration);
649 }
650 }
651 }
652 }
653 }
654 }
655 }
656 }
657 }
658 else {
659 // Find in local variables of the file
660 var variableDeclaration = file.getVariableDeclaration(metadataVariableName);
661 if (variableDeclaration) {
662 var variableKind = variableDeclaration.getKind();
663 if (variableKind && variableKind === Ast.SyntaxKind.VariableDeclaration) {
664 var initializer = variableDeclaration.getInitializer();
665 if (initializer) {
666 var initializerKind = initializer.getKind();
667 if (initializerKind &&
668 initializerKind === Ast.SyntaxKind.ObjectLiteralExpression) {
669 var compilerNode = initializer.compilerNode;
670 return compilerNode.properties;
671 }
672 else if (initializerKind) {
673 return variableDeclaration.compilerNode;
674 }
675 }
676 }
677 }
678 }
679 return [];
680 };
681 ImportsUtil.prototype.getFileNameOfImport = function (variableName, sourceFile) {
682 var file = typeof ast.getSourceFile(sourceFile.fileName) !== 'undefined'
683 ? ast.getSourceFile(sourceFile.fileName)
684 : ast.addExistingSourceFile(sourceFile.fileName); // tslint:disable-line
685 var imports = file.getImportDeclarations();
686 var searchedImport, finalPath = '';
687 imports.forEach(function (i) {
688 var namedImports = i.getNamedImports(), namedImportsLength = namedImports.length, j = 0;
689 if (namedImportsLength > 0) {
690 for (j; j < namedImportsLength; j++) {
691 var importName = namedImports[j].getNameNode().getText(), importAlias = void 0;
692 if (namedImports[j].getAliasIdentifier()) {
693 importAlias = namedImports[j].getAliasIdentifier().getText();
694 }
695 if (importName === variableName) {
696 searchedImport = i;
697 break;
698 }
699 if (importAlias === variableName) {
700 searchedImport = i;
701 break;
702 }
703 }
704 }
705 });
706 if (typeof searchedImport !== 'undefined') {
707 var importPath = path.resolve(path.dirname(sourceFile.fileName) +
708 '/' +
709 searchedImport.getModuleSpecifierValue() +
710 '.ts');
711 var cleaner = (process.cwd() + path.sep).replace(/\\/g, '/');
712 finalPath = importPath.replace(cleaner, '');
713 }
714 return finalPath;
715 };
716 /**
717 * Find the file path of imported variable
718 * @param {string} inputVariableName like thestring
719 * @return {[type]} thestring destination path
720 */
721 ImportsUtil.prototype.findFilePathOfImportedVariable = function (inputVariableName, sourceFilePath) {
722 var searchedImport, finalPath = '';
723 var file = typeof ast.getSourceFile(sourceFilePath) !== 'undefined'
724 ? ast.getSourceFile(sourceFilePath)
725 : ast.addExistingSourceFile(sourceFilePath); // tslint:disable-line
726 var imports = file.getImportDeclarations();
727 /**
728 * Loop through all imports, and find one matching inputVariableName
729 */
730 imports.forEach(function (i) {
731 var namedImports = i.getNamedImports(), namedImportsLength = namedImports.length, j = 0;
732 if (namedImportsLength > 0) {
733 for (j; j < namedImportsLength; j++) {
734 var importName = namedImports[j].getNameNode().getText(), importAlias = void 0;
735 if (namedImports[j].getAliasIdentifier()) {
736 importAlias = namedImports[j].getAliasIdentifier().getText();
737 }
738 if (importName === inputVariableName) {
739 searchedImport = i;
740 break;
741 }
742 if (importAlias === inputVariableName) {
743 searchedImport = i;
744 break;
745 }
746 }
747 }
748 });
749 if (typeof searchedImport !== 'undefined') {
750 finalPath = path.resolve(path.dirname(sourceFilePath) +
751 '/' +
752 searchedImport.getModuleSpecifierValue() +
753 '.ts');
754 }
755 return finalPath;
756 };
757 /**
758 * Find in imports something like VAR.AVAR.BVAR.thestring
759 * @param {string} inputVariableName like VAR.AVAR.BVAR.thestring
760 * @return {[type]} thestring value
761 */
762 ImportsUtil.prototype.findPropertyValueInImportOrLocalVariables = function (inputVariableName, sourceFile) {
763 var variablesAttributes = inputVariableName.split('.'), metadataVariableName = variablesAttributes[0], searchedImport, aliasOriginalName = '', foundWithAlias = false;
764 var file = typeof ast.getSourceFile(sourceFile.fileName) !== 'undefined'
765 ? ast.getSourceFile(sourceFile.fileName)
766 : ast.addExistingSourceFile(sourceFile.fileName); // tslint:disable-line
767 var imports = file.getImportDeclarations();
768 /**
769 * Loop through all imports, and find one matching inputVariableName
770 */
771 imports.forEach(function (i) {
772 var namedImports = i.getNamedImports(), namedImportsLength = namedImports.length, j = 0;
773 if (namedImportsLength > 0) {
774 for (j; j < namedImportsLength; j++) {
775 var importName = namedImports[j].getNameNode().getText(), importAlias = void 0;
776 if (namedImports[j].getAliasIdentifier()) {
777 importAlias = namedImports[j].getAliasIdentifier().getText();
778 }
779 if (importName === metadataVariableName) {
780 searchedImport = i;
781 break;
782 }
783 if (importAlias === metadataVariableName) {
784 foundWithAlias = true;
785 aliasOriginalName = importName;
786 searchedImport = i;
787 break;
788 }
789 }
790 }
791 });
792 var fileToSearchIn, variableDeclaration;
793 if (typeof searchedImport !== 'undefined') {
794 var importPath = path.resolve(path.dirname(sourceFile.fileName) +
795 '/' +
796 searchedImport.getModuleSpecifierValue() +
797 '.ts');
798 var sourceFileImport = typeof ast.getSourceFile(importPath) !== 'undefined'
799 ? ast.getSourceFile(importPath)
800 : ast.addExistingSourceFile(importPath); // tslint:disable-line
801 if (sourceFileImport) {
802 fileToSearchIn = sourceFileImport;
803 var variableName = foundWithAlias ? aliasOriginalName : metadataVariableName;
804 variableDeclaration = fileToSearchIn.getVariableDeclaration(variableName);
805 }
806 }
807 else {
808 fileToSearchIn = file;
809 // Find in local variables of the file
810 variableDeclaration = fileToSearchIn.getVariableDeclaration(metadataVariableName);
811 }
812 if (variableDeclaration) {
813 return this.findInObjectVariableDeclaration(variableDeclaration, variablesAttributes);
814 }
815 // Try find it in enums
816 if (variablesAttributes.length > 0) {
817 if (typeof fileToSearchIn !== 'undefined') {
818 var val = this.findInEnums(fileToSearchIn, metadataVariableName, variablesAttributes[1]);
819 if (val !== '') {
820 return val;
821 }
822 val = this.findInClasses(fileToSearchIn, metadataVariableName, variablesAttributes[1]);
823 if (val !== '') {
824 return val;
825 }
826 }
827 }
828 };
829 return ImportsUtil;
830}());
831
832var traverse = require('traverse');
833var ast$1 = new Ast__default();
834var RouterParserUtil = /** @class */ (function () {
835 function RouterParserUtil() {
836 this.routes = [];
837 this.incompleteRoutes = [];
838 this.modules = [];
839 this.modulesWithRoutes = [];
840 this.fileEngine = new FileEngine();
841 this.importsUtil = new ImportsUtil();
842 }
843 RouterParserUtil.prototype.addRoute = function (route) {
844 this.routes.push(route);
845 this.routes = _.sortBy(_.uniqWith(this.routes, _.isEqual), ['name']);
846 };
847 RouterParserUtil.prototype.addIncompleteRoute = function (route) {
848 this.incompleteRoutes.push(route);
849 this.incompleteRoutes = _.sortBy(_.uniqWith(this.incompleteRoutes, _.isEqual), ['name']);
850 };
851 RouterParserUtil.prototype.addModuleWithRoutes = function (moduleName, moduleImports, filename) {
852 this.modulesWithRoutes.push({
853 name: moduleName,
854 importsNode: moduleImports,
855 filename: filename
856 });
857 this.modulesWithRoutes = _.sortBy(_.uniqWith(this.modulesWithRoutes, _.isEqual), ['name']);
858 };
859 RouterParserUtil.prototype.addModule = function (moduleName, moduleImports) {
860 this.modules.push({
861 name: moduleName,
862 importsNode: moduleImports
863 });
864 this.modules = _.sortBy(_.uniqWith(this.modules, _.isEqual), ['name']);
865 };
866 RouterParserUtil.prototype.cleanRawRouteParsed = function (route) {
867 var routesWithoutSpaces = route.replace(/ /gm, '');
868 var testTrailingComma = routesWithoutSpaces.indexOf('},]');
869 if (testTrailingComma !== -1) {
870 routesWithoutSpaces = routesWithoutSpaces.replace('},]', '}]');
871 }
872 return JSON5.parse(routesWithoutSpaces);
873 };
874 RouterParserUtil.prototype.cleanRawRoute = function (route) {
875 var routesWithoutSpaces = route.replace(/ /gm, '');
876 var testTrailingComma = routesWithoutSpaces.indexOf('},]');
877 if (testTrailingComma !== -1) {
878 routesWithoutSpaces = routesWithoutSpaces.replace('},]', '}]');
879 }
880 return routesWithoutSpaces;
881 };
882 RouterParserUtil.prototype.setRootModule = function (module) {
883 this.rootModule = module;
884 };
885 RouterParserUtil.prototype.hasRouterModuleInImports = function (imports) {
886 for (var i = 0; i < imports.length; i++) {
887 if (imports[i].name.indexOf('RouterModule.forChild') !== -1 ||
888 imports[i].name.indexOf('RouterModule.forRoot') !== -1 ||
889 imports[i].name.indexOf('RouterModule') !== -1) {
890 return true;
891 }
892 }
893 return false;
894 };
895 RouterParserUtil.prototype.fixIncompleteRoutes = function (miscellaneousVariables) {
896 var matchingVariables = [];
897 // For each incompleteRoute, scan if one misc variable is in code
898 // if ok, try recreating complete route
899 for (var i = 0; i < this.incompleteRoutes.length; i++) {
900 for (var j = 0; j < miscellaneousVariables.length; j++) {
901 if (this.incompleteRoutes[i].data.indexOf(miscellaneousVariables[j].name) !== -1) {
902 console.log('found one misc var inside incompleteRoute');
903 console.log(miscellaneousVariables[j].name);
904 matchingVariables.push(miscellaneousVariables[j]);
905 }
906 }
907 // Clean incompleteRoute
908 this.incompleteRoutes[i].data = this.incompleteRoutes[i].data.replace('[', '');
909 this.incompleteRoutes[i].data = this.incompleteRoutes[i].data.replace(']', '');
910 }
911 };
912 RouterParserUtil.prototype.linkModulesAndRoutes = function () {
913 var _this = this;
914 var i = 0;
915 var len = this.modulesWithRoutes.length;
916 for (i; i < len; i++) {
917 _.forEach(this.modulesWithRoutes[i].importsNode, function (node) {
918 var initializer = node.initializer;
919 if (initializer) {
920 if (initializer.elements) {
921 _.forEach(initializer.elements, function (element) {
922 // find element with arguments
923 if (element.arguments) {
924 _.forEach(element.arguments, function (argument) {
925 _.forEach(_this.routes, function (route) {
926 if (argument.text &&
927 route.name === argument.text &&
928 route.filename === _this.modulesWithRoutes[i].filename) {
929 route.module = _this.modulesWithRoutes[i].name;
930 }
931 else if (argument.text &&
932 route.name === argument.text &&
933 route.filename !== _this.modulesWithRoutes[i].filename) {
934 var argumentImportPath = _this.importsUtil.findFilePathOfImportedVariable(argument.text, _this.modulesWithRoutes[i].filename);
935 var cleaner = (process.cwd() + path.sep).replace(/\\/g, '/');
936 argumentImportPath = argumentImportPath.replace(cleaner, '');
937 if (argument.text &&
938 route.name === argument.text &&
939 route.filename === argumentImportPath) {
940 route.module = _this.modulesWithRoutes[i].name;
941 }
942 }
943 });
944 });
945 }
946 });
947 }
948 }
949 /**
950 * direct support of for example
951 * export const HomeRoutingModule: ModuleWithProviders = RouterModule.forChild(HOME_ROUTES);
952 */
953 if (Ast.ts.isCallExpression(node)) {
954 if (node.arguments) {
955 _.forEach(node.arguments, function (argument) {
956 _.forEach(_this.routes, function (route) {
957 if (argument.text &&
958 route.name === argument.text &&
959 route.filename === _this.modulesWithRoutes[i].filename) {
960 route.module = _this.modulesWithRoutes[i].name;
961 }
962 });
963 });
964 }
965 }
966 });
967 }
968 };
969 RouterParserUtil.prototype.foundRouteWithModuleName = function (moduleName) {
970 return _.find(this.routes, { module: moduleName });
971 };
972 RouterParserUtil.prototype.foundLazyModuleWithPath = function (modulePath) {
973 // path is like app/customers/customers.module#CustomersModule
974 var split = modulePath.split('#');
975 var lazyModulePath = split[0];
976 var lazyModuleName = split[1];
977 return lazyModuleName;
978 };
979 RouterParserUtil.prototype.constructRoutesTree = function () {
980 var _this = this;
981 // routes[] contains routes with module link
982 // modulesTree contains modules tree
983 // make a final routes tree with that
984 traverse(this.modulesTree).forEach(function (node) {
985 if (node) {
986 if (node.parent) {
987 delete node.parent;
988 }
989 if (node.initializer) {
990 delete node.initializer;
991 }
992 if (node.importsNode) {
993 delete node.importsNode;
994 }
995 }
996 });
997 this.cleanModulesTree = _.cloneDeep(this.modulesTree);
998 var routesTree = {
999 name: '<root>',
1000 kind: 'module',
1001 className: this.rootModule,
1002 children: []
1003 };
1004 var loopModulesParser = function (node) {
1005 if (node.children && node.children.length > 0) {
1006 // If module has child modules
1007 for (var i in node.children) {
1008 var route = _this.foundRouteWithModuleName(node.children[i].name);
1009 if (route && route.data) {
1010 try {
1011 route.children = JSON5.parse(route.data);
1012 }
1013 catch (e) {
1014 logger.error('Error during generation of routes JSON file, maybe a trailing comma or an external variable inside one route.');
1015 }
1016 delete route.data;
1017 route.kind = 'module';
1018 routesTree.children.push(route);
1019 }
1020 if (node.children[i].children) {
1021 loopModulesParser(node.children[i]);
1022 }
1023 }
1024 }
1025 else {
1026 // else routes are directly inside the module
1027 var rawRoutes = _this.foundRouteWithModuleName(node.name);
1028 if (rawRoutes) {
1029 var routes = JSON5.parse(rawRoutes.data);
1030 if (routes) {
1031 var i = 0;
1032 var len = routes.length;
1033 var routeAddedOnce = false;
1034 for (i; i < len; i++) {
1035 var route = routes[i];
1036 if (routes[i].component) {
1037 routeAddedOnce = true;
1038 routesTree.children.push({
1039 kind: 'component',
1040 component: routes[i].component,
1041 path: routes[i].path
1042 });
1043 }
1044 }
1045 if (!routeAddedOnce) {
1046 routesTree.children = routesTree.children.concat(routes);
1047 }
1048 }
1049 }
1050 }
1051 };
1052 var startModule = _.find(this.cleanModulesTree, { name: this.rootModule });
1053 if (startModule) {
1054 loopModulesParser(startModule);
1055 // Loop twice for routes with lazy loading
1056 // loopModulesParser(routesTree);
1057 }
1058 var cleanedRoutesTree = undefined;
1059 var cleanRoutesTree = function (route) {
1060 for (var i in route.children) {
1061 var routes = route.children[i].routes;
1062 }
1063 return route;
1064 };
1065 cleanedRoutesTree = cleanRoutesTree(routesTree);
1066 // Try updating routes with lazy loading
1067 var loopInsideModule = function (mod, _rawModule) {
1068 if (mod.children) {
1069 for (var z in mod.children) {
1070 var route = _this.foundRouteWithModuleName(mod.children[z].name);
1071 if (typeof route !== 'undefined') {
1072 if (route.data) {
1073 route.children = JSON5.parse(route.data);
1074 delete route.data;
1075 route.kind = 'module';
1076 _rawModule.children.push(route);
1077 }
1078 }
1079 }
1080 }
1081 else {
1082 var route = _this.foundRouteWithModuleName(mod.name);
1083 if (typeof route !== 'undefined') {
1084 if (route.data) {
1085 route.children = JSON5.parse(route.data);
1086 delete route.data;
1087 route.kind = 'module';
1088 _rawModule.children.push(route);
1089 }
1090 }
1091 }
1092 };
1093 var loopRoutesParser = function (route) {
1094 if (route.children) {
1095 for (var i in route.children) {
1096 if (route.children[i].loadChildren) {
1097 var child = _this.foundLazyModuleWithPath(route.children[i].loadChildren);
1098 var module = _.find(_this.cleanModulesTree, {
1099 name: child
1100 });
1101 if (module) {
1102 var _rawModule = {};
1103 _rawModule.kind = 'module';
1104 _rawModule.children = [];
1105 _rawModule.module = module.name;
1106 loopInsideModule(module, _rawModule);
1107 route.children[i].children = [];
1108 route.children[i].children.push(_rawModule);
1109 }
1110 }
1111 loopRoutesParser(route.children[i]);
1112 }
1113 }
1114 };
1115 loopRoutesParser(cleanedRoutesTree);
1116 return cleanedRoutesTree;
1117 };
1118 RouterParserUtil.prototype.constructModulesTree = function () {
1119 var _this = this;
1120 var getNestedChildren = function (arr, parent) {
1121 var out = [];
1122 for (var i in arr) {
1123 if (arr[i].parent === parent) {
1124 var children = getNestedChildren(arr, arr[i].name);
1125 if (children.length) {
1126 arr[i].children = children;
1127 }
1128 out.push(arr[i]);
1129 }
1130 }
1131 return out;
1132 };
1133 // Scan each module and add parent property
1134 _.forEach(this.modules, function (firstLoopModule) {
1135 _.forEach(firstLoopModule.importsNode, function (importNode) {
1136 _.forEach(_this.modules, function (module) {
1137 if (module.name === importNode.name) {
1138 module.parent = firstLoopModule.name;
1139 }
1140 });
1141 });
1142 });
1143 this.modulesTree = getNestedChildren(this.modules);
1144 };
1145 RouterParserUtil.prototype.generateRoutesIndex = function (outputFolder, routes) {
1146 var _this = this;
1147 return this.fileEngine.get(__dirname + '/../src/templates/partials/routes-index.hbs').then(function (data) {
1148 var template = Handlebars.compile(data);
1149 var result = template({
1150 routes: JSON.stringify(routes)
1151 });
1152 var testOutputDir = outputFolder.match(process.cwd());
1153 if (testOutputDir && testOutputDir.length > 0) {
1154 outputFolder = outputFolder.replace(process.cwd() + path.sep, '');
1155 }
1156 return _this.fileEngine.write(outputFolder + path.sep + '/js/routes/routes_index.js', result);
1157 }, function (err) { return Promise.reject('Error during routes index generation'); });
1158 };
1159 RouterParserUtil.prototype.routesLength = function () {
1160 var _n = 0;
1161 var routesParser = function (route) {
1162 if (typeof route.path !== 'undefined') {
1163 _n += 1;
1164 }
1165 if (route.children) {
1166 for (var j in route.children) {
1167 routesParser(route.children[j]);
1168 }
1169 }
1170 };
1171 for (var i in this.routes) {
1172 routesParser(this.routes[i]);
1173 }
1174 return _n;
1175 };
1176 RouterParserUtil.prototype.printRoutes = function () {
1177 console.log('');
1178 console.log('printRoutes: ');
1179 console.log(this.routes);
1180 };
1181 RouterParserUtil.prototype.printModulesRoutes = function () {
1182 console.log('');
1183 console.log('printModulesRoutes: ');
1184 console.log(this.modulesWithRoutes);
1185 };
1186 RouterParserUtil.prototype.isVariableRoutes = function (node) {
1187 var result = false;
1188 if (node.declarationList && node.declarationList.declarations) {
1189 var i = 0;
1190 var len = node.declarationList.declarations.length;
1191 for (i; i < len; i++) {
1192 if (node.declarationList.declarations[i].type) {
1193 if (node.declarationList.declarations[i].type.typeName &&
1194 node.declarationList.declarations[i].type.typeName.text === 'Routes') {
1195 result = true;
1196 }
1197 }
1198 }
1199 }
1200 return result;
1201 };
1202 RouterParserUtil.prototype.cleanFileIdentifiers = function (sourceFile) {
1203 var _this = this;
1204 var file = sourceFile;
1205 var identifiers = file.getDescendantsOfKind(Ast.SyntaxKind.Identifier).filter(function (p) {
1206 return (Ast.TypeGuards.isArrayLiteralExpression(p.getParentOrThrow()) ||
1207 Ast.TypeGuards.isPropertyAssignment(p.getParentOrThrow()));
1208 });
1209 var identifiersInRoutesVariableStatement = [];
1210 var _loop_1 = function (identifier) {
1211 // Loop through their parents nodes, and if one is a variableStatement and === 'routes'
1212 var foundParentVariableStatement = false;
1213 var parent = identifier.getParentWhile(function (n) {
1214 if (n.getKind() === Ast.SyntaxKind.VariableStatement) {
1215 if (_this.isVariableRoutes(n.compilerNode)) {
1216 foundParentVariableStatement = true;
1217 }
1218 }
1219 return true;
1220 });
1221 if (foundParentVariableStatement) {
1222 identifiersInRoutesVariableStatement.push(identifier);
1223 }
1224 };
1225 for (var _i = 0, identifiers_1 = identifiers; _i < identifiers_1.length; _i++) {
1226 var identifier = identifiers_1[_i];
1227 _loop_1(identifier);
1228 }
1229 // inline the property access expressions
1230 for (var _a = 0, identifiersInRoutesVariableStatement_1 = identifiersInRoutesVariableStatement; _a < identifiersInRoutesVariableStatement_1.length; _a++) {
1231 var identifier = identifiersInRoutesVariableStatement_1[_a];
1232 var identifierDeclaration = identifier
1233 .getSymbolOrThrow()
1234 .getValueDeclarationOrThrow();
1235 if (!Ast.TypeGuards.isPropertyAssignment(identifierDeclaration) &&
1236 Ast.TypeGuards.isVariableDeclaration(identifierDeclaration) &&
1237 (Ast.TypeGuards.isPropertyAssignment(identifierDeclaration) &&
1238 !Ast.TypeGuards.isVariableDeclaration(identifierDeclaration))) {
1239 throw new Error("Not implemented referenced declaration kind: " + identifierDeclaration.getKindName());
1240 }
1241 if (Ast.TypeGuards.isVariableDeclaration(identifierDeclaration)) {
1242 identifier.replaceWithText(identifierDeclaration.getInitializerOrThrow().getText());
1243 }
1244 }
1245 return file;
1246 };
1247 RouterParserUtil.prototype.cleanFileSpreads = function (sourceFile) {
1248 var _this = this;
1249 var file = sourceFile;
1250 var spreadElements = file
1251 .getDescendantsOfKind(Ast.SyntaxKind.SpreadElement)
1252 .filter(function (p) { return Ast.TypeGuards.isArrayLiteralExpression(p.getParentOrThrow()); });
1253 var spreadElementsInRoutesVariableStatement = [];
1254 var _loop_2 = function (spreadElement) {
1255 // Loop through their parents nodes, and if one is a variableStatement and === 'routes'
1256 var foundParentVariableStatement = false;
1257 var parent = spreadElement.getParentWhile(function (n) {
1258 if (n.getKind() === Ast.SyntaxKind.VariableStatement) {
1259 if (_this.isVariableRoutes(n.compilerNode)) {
1260 foundParentVariableStatement = true;
1261 }
1262 }
1263 return true;
1264 });
1265 if (foundParentVariableStatement) {
1266 spreadElementsInRoutesVariableStatement.push(spreadElement);
1267 }
1268 };
1269 for (var _i = 0, spreadElements_1 = spreadElements; _i < spreadElements_1.length; _i++) {
1270 var spreadElement = spreadElements_1[_i];
1271 _loop_2(spreadElement);
1272 }
1273 var _loop_3 = function (spreadElement) {
1274 var spreadElementIdentifier = spreadElement.getExpression().getText(), searchedImport, aliasOriginalName = '', foundWithAliasInImports = false, foundWithAlias = false;
1275 // Try to find it in imports
1276 var imports = file.getImportDeclarations();
1277 imports.forEach(function (i) {
1278 var namedImports = i.getNamedImports(), namedImportsLength = namedImports.length, j = 0;
1279 if (namedImportsLength > 0) {
1280 for (j; j < namedImportsLength; j++) {
1281 var importName = namedImports[j].getNameNode().getText(), importAlias = void 0;
1282 if (namedImports[j].getAliasIdentifier()) {
1283 importAlias = namedImports[j].getAliasIdentifier().getText();
1284 }
1285 if (importName === spreadElementIdentifier) {
1286 foundWithAliasInImports = true;
1287 searchedImport = i;
1288 break;
1289 }
1290 if (importAlias === spreadElementIdentifier) {
1291 foundWithAliasInImports = true;
1292 foundWithAlias = true;
1293 aliasOriginalName = importName;
1294 searchedImport = i;
1295 break;
1296 }
1297 }
1298 }
1299 });
1300 var referencedDeclaration = void 0;
1301 if (foundWithAliasInImports) {
1302 if (typeof searchedImport !== 'undefined') {
1303 var importPath = path.resolve(path.dirname(file.getFilePath()) +
1304 '/' +
1305 searchedImport.getModuleSpecifierValue() +
1306 '.ts');
1307 var sourceFileImport = typeof ast$1.getSourceFile(importPath) !== 'undefined'
1308 ? ast$1.getSourceFile(importPath)
1309 : ast$1.addExistingSourceFile(importPath);
1310 if (sourceFileImport) {
1311 var variableName = foundWithAlias
1312 ? aliasOriginalName
1313 : spreadElementIdentifier;
1314 referencedDeclaration = sourceFileImport.getVariableDeclaration(variableName);
1315 }
1316 }
1317 }
1318 else {
1319 // if not, try directly in file
1320 referencedDeclaration = spreadElement
1321 .getExpression()
1322 .getSymbolOrThrow()
1323 .getValueDeclarationOrThrow();
1324 }
1325 if (!Ast.TypeGuards.isVariableDeclaration(referencedDeclaration)) {
1326 throw new Error("Not implemented referenced declaration kind: " + referencedDeclaration.getKindName());
1327 }
1328 var referencedArray = referencedDeclaration.getInitializerIfKindOrThrow(Ast.SyntaxKind.ArrayLiteralExpression);
1329 var spreadElementArray = spreadElement.getParentIfKindOrThrow(Ast.SyntaxKind.ArrayLiteralExpression);
1330 var insertIndex = spreadElementArray.getElements().indexOf(spreadElement);
1331 spreadElementArray.removeElement(spreadElement);
1332 spreadElementArray.insertElements(insertIndex, referencedArray.getElements().map(function (e) { return e.getText(); }));
1333 };
1334 // inline the ArrayLiteralExpression SpreadElements
1335 for (var _a = 0, spreadElementsInRoutesVariableStatement_1 = spreadElementsInRoutesVariableStatement; _a < spreadElementsInRoutesVariableStatement_1.length; _a++) {
1336 var spreadElement = spreadElementsInRoutesVariableStatement_1[_a];
1337 _loop_3(spreadElement);
1338 }
1339 return file;
1340 };
1341 RouterParserUtil.prototype.cleanFileDynamics = function (sourceFile) {
1342 var _this = this;
1343 var file = sourceFile;
1344 var propertyAccessExpressions = file
1345 .getDescendantsOfKind(Ast.SyntaxKind.PropertyAccessExpression)
1346 .filter(function (p) { return !Ast.TypeGuards.isPropertyAccessExpression(p.getParentOrThrow()); });
1347 var propertyAccessExpressionsInRoutesVariableStatement = [];
1348 var _loop_4 = function (propertyAccessExpression) {
1349 // Loop through their parents nodes, and if one is a variableStatement and === 'routes'
1350 var foundParentVariableStatement = false;
1351 var parent = propertyAccessExpression.getParentWhile(function (n) {
1352 if (n.getKind() === Ast.SyntaxKind.VariableStatement) {
1353 if (_this.isVariableRoutes(n.compilerNode)) {
1354 foundParentVariableStatement = true;
1355 }
1356 }
1357 return true;
1358 });
1359 if (foundParentVariableStatement) {
1360 propertyAccessExpressionsInRoutesVariableStatement.push(propertyAccessExpression);
1361 }
1362 };
1363 for (var _i = 0, propertyAccessExpressions_1 = propertyAccessExpressions; _i < propertyAccessExpressions_1.length; _i++) {
1364 var propertyAccessExpression = propertyAccessExpressions_1[_i];
1365 _loop_4(propertyAccessExpression);
1366 }
1367 // inline the property access expressions
1368 for (var _a = 0, propertyAccessExpressionsInRoutesVariableStatement_1 = propertyAccessExpressionsInRoutesVariableStatement; _a < propertyAccessExpressionsInRoutesVariableStatement_1.length; _a++) {
1369 var propertyAccessExpression = propertyAccessExpressionsInRoutesVariableStatement_1[_a];
1370 var referencedDeclaration = propertyAccessExpression
1371 .getNameNode()
1372 .getSymbolOrThrow()
1373 .getValueDeclarationOrThrow();
1374 if (!Ast.TypeGuards.isPropertyAssignment(referencedDeclaration) &&
1375 Ast.TypeGuards.isEnumMember(referencedDeclaration) &&
1376 (Ast.TypeGuards.isPropertyAssignment(referencedDeclaration) &&
1377 !Ast.TypeGuards.isEnumMember(referencedDeclaration))) {
1378 throw new Error("Not implemented referenced declaration kind: " + referencedDeclaration.getKindName());
1379 }
1380 if (typeof referencedDeclaration.getInitializerOrThrow !== 'undefined') {
1381 propertyAccessExpression.replaceWithText(referencedDeclaration.getInitializerOrThrow().getText());
1382 }
1383 }
1384 return file;
1385 };
1386 /**
1387 * replace callexpressions with string : utils.doWork() -> 'utils.doWork()' doWork() -> 'doWork()'
1388 * @param sourceFile ts.SourceFile
1389 */
1390 RouterParserUtil.prototype.cleanCallExpressions = function (sourceFile) {
1391 var file = sourceFile;
1392 var variableStatements = sourceFile.getVariableDeclaration(function (v) {
1393 var result = false;
1394 if (typeof v.compilerNode.type !== 'undefined') {
1395 result = v.compilerNode.type.typeName.text === 'Routes';
1396 }
1397 return result;
1398 });
1399 var initializer = variableStatements.getInitializer();
1400 var _loop_5 = function (callExpr) {
1401 if (callExpr.wasForgotten()) {
1402 return "continue";
1403 }
1404 callExpr.replaceWithText(function (writer) { return writer.quote(callExpr.getText()); });
1405 };
1406 for (var _i = 0, _a = initializer.getDescendantsOfKind(Ast.SyntaxKind.CallExpression); _i < _a.length; _i++) {
1407 var callExpr = _a[_i];
1408 _loop_5(callExpr);
1409 }
1410 return file;
1411 };
1412 /**
1413 * Clean routes definition with imported data, for example path, children, or dynamic stuff inside data
1414 *
1415 * const MY_ROUTES: Routes = [
1416 * {
1417 * path: 'home',
1418 * component: HomeComponent
1419 * },
1420 * {
1421 * path: PATHS.home,
1422 * component: HomeComponent
1423 * }
1424 * ];
1425 *
1426 * The initializer is an array (ArrayLiteralExpression - 177 ), it has elements, objects (ObjectLiteralExpression - 178)
1427 * with properties (PropertyAssignment - 261)
1428 *
1429 * For each know property (https://angular.io/api/router/Routes#description), we try to see if we have what we want
1430 *
1431 * Ex: path and pathMatch want a string, component a component reference.
1432 *
1433 * It is an imperative approach, not a generic way, parsing all the tree
1434 * and find something like this which willl break JSON.stringify : MYIMPORT.path
1435 *
1436 * @param {ts.Node} initializer The node of routes definition
1437 * @return {ts.Node} The edited node
1438 */
1439 RouterParserUtil.prototype.cleanRoutesDefinitionWithImport = function (initializer, node, sourceFile) {
1440 var _this = this;
1441 initializer.elements.forEach(function (element) {
1442 element.properties.forEach(function (property) {
1443 var propertyName = property.name.getText(), propertyInitializer = property.initializer;
1444 switch (propertyName) {
1445 case 'path':
1446 case 'redirectTo':
1447 case 'outlet':
1448 case 'pathMatch':
1449 if (propertyInitializer) {
1450 if (propertyInitializer.kind !== Ast.SyntaxKind.StringLiteral) {
1451 // Identifier(71) won't break parsing, but it will be better to retrive them
1452 // PropertyAccessExpression(179) ex: MYIMPORT.path will break it, find it in import
1453 if (propertyInitializer.kind === Ast.SyntaxKind.PropertyAccessExpression) {
1454 var lastObjectLiteralAttributeName = propertyInitializer.name.getText(), firstObjectLiteralAttributeName = void 0;
1455 if (propertyInitializer.expression) {
1456 firstObjectLiteralAttributeName = propertyInitializer.expression.getText();
1457 var result = _this.importsUtil.findPropertyValueInImportOrLocalVariables(firstObjectLiteralAttributeName +
1458 '.' +
1459 lastObjectLiteralAttributeName, sourceFile); // tslint:disable-line
1460 if (result !== '') {
1461 propertyInitializer.kind = 9;
1462 propertyInitializer.text = result;
1463 }
1464 }
1465 }
1466 }
1467 }
1468 break;
1469 }
1470 });
1471 });
1472 return initializer;
1473 };
1474 return RouterParserUtil;
1475}());
1476
1477function isModuleWithProviders(node) {
1478 var result = false;
1479 if (node.declarationList) {
1480 if (node.declarationList.declarations && node.declarationList.declarations.length > 0) {
1481 var i = 0, declarations = node.declarationList.declarations, len = node.declarationList.declarations.length;
1482 for (i; i < len; i++) {
1483 var declaration = node.declarationList.declarations[i];
1484 if (declaration.type) {
1485 var type = declaration.type;
1486 if (type.typeName) {
1487 var text = type.typeName.getText();
1488 if (text === 'ModuleWithProviders') {
1489 result = true;
1490 }
1491 }
1492 }
1493 }
1494 }
1495 }
1496 return result;
1497}
1498
1499function getModuleWithProviders(node) {
1500 var result;
1501 if (node.declarationList) {
1502 if (node.declarationList.declarations && node.declarationList.declarations.length > 0) {
1503 var i = 0, len = node.declarationList.declarations.length;
1504 for (i; i < len; i++) {
1505 var declaration = node.declarationList.declarations[i];
1506 if (declaration.type) {
1507 var type = declaration.type;
1508 if (type.typeName) {
1509 var text = type.typeName.getText();
1510 if (text === 'ModuleWithProviders') {
1511 result = declaration.initializer;
1512 }
1513 }
1514 }
1515 }
1516 }
1517 }
1518 return result;
1519}
1520
1521var uuid = require('uuid/v4');
1522
1523function extractLeadingText(string, completeTag) {
1524 var tagIndex = string.indexOf(completeTag);
1525 var leadingText = undefined;
1526 var leadingTextRegExp = /\[(.+?)\]/g;
1527 var leadingTextInfo = leadingTextRegExp.exec(string);
1528 // did we find leading text, and if so, does it immediately precede the tag?
1529 while (leadingTextInfo && leadingTextInfo.length) {
1530 if (leadingTextInfo.index + leadingTextInfo[0].length === tagIndex) {
1531 string = string.replace(leadingTextInfo[0], '');
1532 leadingText = leadingTextInfo[1];
1533 break;
1534 }
1535 leadingTextInfo = leadingTextRegExp.exec(string);
1536 }
1537 return {
1538 leadingText: leadingText,
1539 string: string
1540 };
1541}
1542function splitLinkText(text) {
1543 var linkText;
1544 var target;
1545 var splitIndex;
1546 // if a pipe is not present, we split on the first space
1547 splitIndex = text.indexOf('|');
1548 if (splitIndex === -1) {
1549 splitIndex = text.search(/\s/);
1550 }
1551 if (splitIndex !== -1) {
1552 linkText = text.substr(splitIndex + 1);
1553 // Normalize subsequent newlines to a single space.
1554 linkText = linkText.replace(/\n+/, ' ');
1555 target = text.substr(0, splitIndex);
1556 }
1557 return {
1558 linkText: linkText,
1559 target: target || text
1560 };
1561}
1562var LinkParser = (function () {
1563 var processTheLink = function (string, tagInfo, leadingText) {
1564 var leading = extractLeadingText(string, tagInfo.completeTag), linkText, split, target, stringtoReplace;
1565 linkText = leadingText ? leadingText : leading.leadingText || '';
1566 split = splitLinkText(tagInfo.text);
1567 target = split.target;
1568 if (leading.leadingText !== undefined) {
1569 stringtoReplace = '[' + leading.leadingText + ']' + tagInfo.completeTag;
1570 }
1571 else if (typeof split.linkText !== 'undefined') {
1572 stringtoReplace = tagInfo.completeTag;
1573 linkText = split.linkText;
1574 }
1575 return string.replace(stringtoReplace, '[' + linkText + '](' + target + ')');
1576 };
1577 /**
1578 * Convert
1579 * {@link http://www.google.com|Google} or {@link https://github.com GitHub} or [Github]{@link https://github.com} to [Github](https://github.com)
1580 */
1581 var replaceLinkTag = function (str) {
1582 if (typeof str === 'undefined') {
1583 return {
1584 newString: ''
1585 };
1586 }
1587 // new RegExp('\\[((?:.|\n)+?)]\\{@link\\s+((?:.|\n)+?)\\}', 'i').exec('ee [TO DO]{@link Todo} fo') -> "[TO DO]{@link Todo}", "TO DO", "Todo"
1588 // new RegExp('\\{@link\\s+((?:.|\n)+?)\\}', 'i').exec('ee [TODO]{@link Todo} fo') -> "{@link Todo}", "Todo"
1589 var tagRegExpLight = new RegExp('\\{@link\\s+((?:.|\n)+?)\\}', 'i'), tagRegExpFull = new RegExp('\\{@link\\s+((?:.|\n)+?)\\}', 'i'), tagRegExp, matches, previousString;
1590 tagRegExp = str.indexOf(']{') !== -1 ? tagRegExpFull : tagRegExpLight;
1591 function replaceMatch(replacer, tag, match, text, linkText) {
1592 var matchedTag = {
1593 completeTag: match,
1594 tag: tag,
1595 text: text
1596 };
1597 if (linkText) {
1598 return replacer(str, matchedTag, linkText);
1599 }
1600 else {
1601 return replacer(str, matchedTag);
1602 }
1603 }
1604 do {
1605 matches = tagRegExp.exec(str);
1606 if (matches) {
1607 previousString = str;
1608 if (matches.length === 2) {
1609 str = replaceMatch(processTheLink, 'link', matches[0], matches[1]);
1610 }
1611 if (matches.length === 3) {
1612 str = replaceMatch(processTheLink, 'link', matches[0], matches[2], matches[1]);
1613 }
1614 }
1615 } while (matches && previousString !== str);
1616 return {
1617 newString: str
1618 };
1619 };
1620 var _resolveLinks = function (str) {
1621 return replaceLinkTag(str).newString;
1622 };
1623 return {
1624 resolveLinks: _resolveLinks
1625 };
1626})();
1627
1628var AngularLifecycleHooks;
1629(function (AngularLifecycleHooks) {
1630 AngularLifecycleHooks[AngularLifecycleHooks["ngOnChanges"] = 0] = "ngOnChanges";
1631 AngularLifecycleHooks[AngularLifecycleHooks["ngOnInit"] = 1] = "ngOnInit";
1632 AngularLifecycleHooks[AngularLifecycleHooks["ngDoCheck"] = 2] = "ngDoCheck";
1633 AngularLifecycleHooks[AngularLifecycleHooks["ngAfterContentInit"] = 3] = "ngAfterContentInit";
1634 AngularLifecycleHooks[AngularLifecycleHooks["ngAfterContentChecked"] = 4] = "ngAfterContentChecked";
1635 AngularLifecycleHooks[AngularLifecycleHooks["ngAfterViewInit"] = 5] = "ngAfterViewInit";
1636 AngularLifecycleHooks[AngularLifecycleHooks["ngAfterViewChecked"] = 6] = "ngAfterViewChecked";
1637 AngularLifecycleHooks[AngularLifecycleHooks["ngOnDestroy"] = 7] = "ngOnDestroy";
1638})(AngularLifecycleHooks || (AngularLifecycleHooks = {}));
1639
1640function kindToType(kind) {
1641 var _type = '';
1642 switch (kind) {
1643 case Ast.SyntaxKind.StringKeyword:
1644 case Ast.SyntaxKind.StringLiteral:
1645 _type = 'string';
1646 break;
1647 case Ast.SyntaxKind.NumberKeyword:
1648 case Ast.SyntaxKind.NumericLiteral:
1649 _type = 'number';
1650 break;
1651 case Ast.SyntaxKind.ArrayType:
1652 case Ast.SyntaxKind.ArrayLiteralExpression:
1653 _type = '[]';
1654 break;
1655 case Ast.SyntaxKind.VoidKeyword:
1656 _type = 'void';
1657 break;
1658 case Ast.SyntaxKind.FunctionType:
1659 _type = 'function';
1660 break;
1661 case Ast.SyntaxKind.TypeLiteral:
1662 _type = 'literal type';
1663 break;
1664 case Ast.SyntaxKind.BooleanKeyword:
1665 _type = 'boolean';
1666 break;
1667 case Ast.SyntaxKind.AnyKeyword:
1668 _type = 'any';
1669 break;
1670 case Ast.SyntaxKind.NullKeyword:
1671 _type = 'null';
1672 break;
1673 case Ast.SyntaxKind.NeverKeyword:
1674 _type = 'never';
1675 break;
1676 case Ast.SyntaxKind.UndefinedKeyword:
1677 _type = 'undefined';
1678 break;
1679 case Ast.SyntaxKind.ObjectKeyword:
1680 case Ast.SyntaxKind.ObjectLiteralExpression:
1681 _type = 'object';
1682 break;
1683 }
1684 return _type;
1685}
1686
1687var getCurrentDirectory = Ast.ts.sys.getCurrentDirectory;
1688var useCaseSensitiveFileNames = Ast.ts.sys.useCaseSensitiveFileNames;
1689var newLine = Ast.ts.sys.newLine;
1690var marked = require('marked');
1691function getNewLine() {
1692 return newLine;
1693}
1694function getCanonicalFileName(fileName) {
1695 return useCaseSensitiveFileNames ? fileName : fileName.toLowerCase();
1696}
1697var formatDiagnosticsHost = {
1698 getCurrentDirectory: getCurrentDirectory,
1699 getCanonicalFileName: getCanonicalFileName,
1700 getNewLine: getNewLine
1701};
1702function markedtags(tags) {
1703 var mtags = tags;
1704 _.forEach(mtags, function (tag) {
1705 tag.comment = marked(LinkParser.resolveLinks(tag.comment));
1706 });
1707 return mtags;
1708}
1709function mergeTagsAndArgs(args, jsdoctags) {
1710 var margs = _.cloneDeep(args);
1711 _.forEach(margs, function (arg) {
1712 arg.tagName = {
1713 text: 'param'
1714 };
1715 if (jsdoctags) {
1716 _.forEach(jsdoctags, function (jsdoctag) {
1717 if (jsdoctag.name && jsdoctag.name.text === arg.name) {
1718 arg.tagName = jsdoctag.tagName;
1719 arg.name = jsdoctag.name;
1720 arg.comment = jsdoctag.comment;
1721 arg.typeExpression = jsdoctag.typeExpression;
1722 }
1723 });
1724 }
1725 });
1726 // Add example & returns
1727 if (jsdoctags) {
1728 _.forEach(jsdoctags, function (jsdoctag) {
1729 if (jsdoctag.tagName && jsdoctag.tagName.text === 'example') {
1730 margs.push({
1731 tagName: jsdoctag.tagName,
1732 comment: jsdoctag.comment
1733 });
1734 }
1735 if (jsdoctag.tagName &&
1736 (jsdoctag.tagName.text === 'returns' || jsdoctag.tagName.text === 'return')) {
1737 var ret = {
1738 tagName: jsdoctag.tagName,
1739 comment: jsdoctag.comment
1740 };
1741 if (jsdoctag.typeExpression && jsdoctag.typeExpression.type) {
1742 ret.returnType = kindToType(jsdoctag.typeExpression.type.kind);
1743 }
1744 margs.push(ret);
1745 }
1746 });
1747 }
1748 return margs;
1749}
1750function readConfig(configFile) {
1751 var result = Ast.ts.readConfigFile(configFile, Ast.ts.sys.readFile);
1752 if (result.error) {
1753 var message = Ast.ts.formatDiagnostics([result.error], formatDiagnosticsHost);
1754 throw new Error(message);
1755 }
1756 return result.config;
1757}
1758function stripBom(source) {
1759 if (source.charCodeAt(0) === 0xfeff) {
1760 return source.slice(1);
1761 }
1762 return source;
1763}
1764function hasBom(source) {
1765 return source.charCodeAt(0) === 0xfeff;
1766}
1767function handlePath(files, cwd) {
1768 var _files = files;
1769 var i = 0;
1770 var len = files.length;
1771 for (i; i < len; i++) {
1772 if (files[i].indexOf(cwd) === -1) {
1773 files[i] = path.resolve(cwd + path.sep + files[i]);
1774 }
1775 }
1776 return _files;
1777}
1778function cleanLifecycleHooksFromMethods(methods) {
1779 var result = [];
1780 if (typeof methods !== 'undefined') {
1781 var i = 0;
1782 var len = methods.length;
1783 for (i; i < len; i++) {
1784 if (!(methods[i].name in AngularLifecycleHooks)) {
1785 result.push(methods[i]);
1786 }
1787 }
1788 }
1789 return result;
1790}
1791function cleanSourcesForWatch(list) {
1792 return list.filter(function (element) {
1793 if (fs.existsSync(process.cwd() + path.sep + element)) {
1794 return element;
1795 }
1796 });
1797}
1798function getNamesCompareFn(name) {
1799 /**
1800 * Copyright https://github.com/ng-bootstrap/ng-bootstrap
1801 */
1802 name = name || 'name';
1803 var t = function (a, b) {
1804 if (a[name]) {
1805 return a[name].localeCompare(b[name]);
1806 }
1807 else {
1808 return 0;
1809 }
1810 };
1811 return t;
1812}
1813function isIgnore(member) {
1814 if (member.jsDoc) {
1815 for (var _i = 0, _a = member.jsDoc; _i < _a.length; _i++) {
1816 var doc = _a[_i];
1817 if (doc.tags) {
1818 for (var _b = 0, _c = doc.tags; _b < _c.length; _b++) {
1819 var tag = _c[_b];
1820 if (tag.tagName.text.indexOf('ignore') > -1) {
1821 return true;
1822 }
1823 }
1824 }
1825 }
1826 }
1827 return false;
1828}
1829// https://tc39.github.io/ecma262/#sec-array.prototype.includes
1830if (!Array.prototype.includes) {
1831 Object.defineProperty(Array.prototype, 'includes', {
1832 value: function (searchElement, fromIndex) {
1833 if (this == null) {
1834 throw new TypeError('"this" is null or not defined');
1835 }
1836 // 1. Let O be ? ToObject(this value).
1837 var o = Object(this);
1838 // 2. Let len be ? ToLength(? Get(O, "length")).
1839 var len = o.length >>> 0;
1840 // 3. If len is 0, return false.
1841 if (len === 0) {
1842 return false;
1843 }
1844 // 4. Let n be ? ToInteger(fromIndex).
1845 // (If fromIndex is undefined, this step produces the value 0.)
1846 var n = fromIndex | 0;
1847 // 5. If n ≥ 0, then
1848 // a. Let k be n.
1849 // 6. Else n < 0,
1850 // a. Let k be len + n.
1851 // b. If k < 0, let k be 0.
1852 var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
1853 function sameValueZero(x, y) {
1854 return (x === y ||
1855 (typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y)));
1856 }
1857 // 7. Repeat, while k < len
1858 while (k < len) {
1859 // a. Let elementK be the result of ? Get(O, ! ToString(k)).
1860 // b. If SameValueZero(searchElement, elementK) is true, return true.
1861 if (sameValueZero(o[k], searchElement)) {
1862 return true;
1863 }
1864 // c. Increase k by 1.
1865 k++;
1866 }
1867 // 8. Return false
1868 return false;
1869 }
1870 });
1871}
1872
1873var FunctionSignatureHelper = /** @class */ (function () {
1874 function FunctionSignatureHelper(configuration, dependenciesEngine) {
1875 this.configuration = configuration;
1876 this.dependenciesEngine = dependenciesEngine;
1877 this.angularVersionUtil = new AngularVersionUtil();
1878 this.basicTypeUtil = new BasicTypeUtil();
1879 }
1880 FunctionSignatureHelper.prototype.handleFunction = function (arg) {
1881 var _this = this;
1882 if (arg.function.length === 0) {
1883 return "" + arg.name + this.getOptionalString(arg) + ": () => void";
1884 }
1885 var argums = arg.function.map(function (argu) {
1886 var _result = _this.dependenciesEngine.find(argu.type);
1887 if (_result) {
1888 if (_result.source === 'internal') {
1889 var path$$1 = _result.data.type;
1890 if (_result.data.type === 'class') {
1891 path$$1 = 'classe';
1892 }
1893 return "" + argu.name + _this.getOptionalString(arg) + ": <a href=\"../" + path$$1 + "s/" + _result.data.name + ".html\">" + argu.type + "</a>";
1894 }
1895 else {
1896 var path$$1 = _this.angularVersionUtil.getApiLink(_result.data, _this.configuration.mainData.angularVersion);
1897 return "" + argu.name + _this.getOptionalString(arg) + ": <a href=\"" + path$$1 + "\" target=\"_blank\">" + argu.type + "</a>";
1898 }
1899 }
1900 else if (_this.basicTypeUtil.isKnownType(argu.type)) {
1901 var path$$1 = _this.basicTypeUtil.getTypeUrl(argu.type);
1902 return "" + argu.name + _this.getOptionalString(arg) + ": <a href=\"" + path$$1 + "\" target=\"_blank\">" + argu.type + "</a>";
1903 }
1904 else {
1905 if (argu.name && argu.type) {
1906 return "" + argu.name + _this.getOptionalString(arg) + ": " + argu.type;
1907 }
1908 else {
1909 return "" + argu.name.text;
1910 }
1911 }
1912 });
1913 return "" + arg.name + this.getOptionalString(arg) + ": (" + argums + ") => void";
1914 };
1915 FunctionSignatureHelper.prototype.getOptionalString = function (arg) {
1916 return arg.optional ? '?' : '';
1917 };
1918 FunctionSignatureHelper.prototype.helperFunc = function (context, method) {
1919 var _this = this;
1920 var args = [];
1921 if (method.args) {
1922 args = method.args
1923 .map(function (arg) {
1924 var _result = _this.dependenciesEngine.find(arg.type);
1925 if (_result) {
1926 if (_result.source === 'internal') {
1927 var path$$1 = _result.data.type;
1928 if (_result.data.type === 'class') {
1929 path$$1 = 'classe';
1930 }
1931 return "" + arg.name + _this.getOptionalString(arg) + ": <a href=\"../" + path$$1 + "s/" + _result.data.name + ".html\">" + arg.type + "</a>";
1932 }
1933 else {
1934 var path$$1 = _this.angularVersionUtil.getApiLink(_result.data, _this.configuration.mainData.angularVersion);
1935 return "" + arg.name + _this.getOptionalString(arg) + ": <a href=\"" + path$$1 + "\" target=\"_blank\">" + arg.type + "</a>";
1936 }
1937 }
1938 else if (arg.dotDotDotToken) {
1939 return "..." + arg.name + ": " + arg.type;
1940 }
1941 else if (arg.function) {
1942 return _this.handleFunction(arg);
1943 }
1944 else if (_this.basicTypeUtil.isKnownType(arg.type)) {
1945 var path$$1 = _this.basicTypeUtil.getTypeUrl(arg.type);
1946 return "" + arg.name + _this.getOptionalString(arg) + ": <a href=\"" + path$$1 + "\" target=\"_blank\">" + arg.type + "</a>";
1947 }
1948 else {
1949 return "" + arg.name + _this.getOptionalString(arg) + ": " + arg.type;
1950 }
1951 })
1952 .join(', ');
1953 }
1954 if (method.name) {
1955 return method.name + "(" + args + ")";
1956 }
1957 else {
1958 return "(" + args + ")";
1959 }
1960 };
1961 return FunctionSignatureHelper;
1962}());
1963
1964var IsNotToggleHelper = /** @class */ (function () {
1965 function IsNotToggleHelper(configuration) {
1966 this.configuration = configuration;
1967 }
1968 IsNotToggleHelper.prototype.helperFunc = function (context, type, options) {
1969 var result = this.configuration.mainData.toggleMenuItems.indexOf(type);
1970 if (this.configuration.mainData.toggleMenuItems.indexOf('all') !== -1) {
1971 return options.inverse(context);
1972 }
1973 else if (result === -1) {
1974 return options.fn(context);
1975 }
1976 else {
1977 return options.inverse(context);
1978 }
1979 };
1980 return IsNotToggleHelper;
1981}());
1982
1983var IsInitialTabHelper = /** @class */ (function () {
1984 function IsInitialTabHelper() {
1985 }
1986 IsInitialTabHelper.prototype.helperFunc = function (context, tabs, tabId, options) {
1987 return tabs[0].id === tabId ? options.fn(context) : options.inverse(context);
1988 };
1989 return IsInitialTabHelper;
1990}());
1991
1992var IsTabEnabledHelper = /** @class */ (function () {
1993 function IsTabEnabledHelper() {
1994 }
1995 IsTabEnabledHelper.prototype.helperFunc = function (context, tabs, tabId, options) {
1996 var isTabEnabled = -1 !== _.findIndex(tabs, { id: tabId });
1997 return isTabEnabled ? options.fn(context) : options.inverse(context);
1998 };
1999 return IsTabEnabledHelper;
2000}());
2001
2002var IfStringHelper = /** @class */ (function () {
2003 function IfStringHelper() {
2004 }
2005 IfStringHelper.prototype.helperFunc = function (context, a, options) {
2006 if (typeof a === 'string') {
2007 return options.fn(context);
2008 }
2009 return options.inverse(context);
2010 };
2011 return IfStringHelper;
2012}());
2013
2014var OrLengthHelper = /** @class */ (function () {
2015 function OrLengthHelper() {
2016 }
2017 OrLengthHelper.prototype.helperFunc = function (context) {
2018 var len = arguments.length - 1;
2019 var options = arguments[len];
2020 // We start at 1 because of options
2021 for (var i = 1; i < len; i++) {
2022 if (typeof arguments[i] !== 'undefined') {
2023 if (Object.keys(arguments[i]).length > 0) {
2024 return options.fn(context);
2025 }
2026 }
2027 }
2028 return options.inverse(context);
2029 };
2030 return OrLengthHelper;
2031}());
2032
2033var FilterAngular2ModulesHelper = /** @class */ (function () {
2034 function FilterAngular2ModulesHelper() {
2035 }
2036 FilterAngular2ModulesHelper.prototype.helperFunc = function (context, text, options) {
2037 var NG2_MODULES = [
2038 'BrowserModule',
2039 'FormsModule',
2040 'HttpModule',
2041 'RouterModule'
2042 ];
2043 var len = NG2_MODULES.length;
2044 var i = 0;
2045 var result = false;
2046 for (i; i < len; i++) {
2047 if (text.indexOf(NG2_MODULES[i]) > -1) {
2048 result = true;
2049 }
2050 }
2051 if (result) {
2052 return options.fn(context);
2053 }
2054 else {
2055 return options.inverse(context);
2056 }
2057 };
2058 return FilterAngular2ModulesHelper;
2059}());
2060
2061var DebugHelper = /** @class */ (function () {
2062 function DebugHelper() {
2063 }
2064 DebugHelper.prototype.helperFunc = function (context, optionalValue) {
2065 console.log('Current Context');
2066 console.log('====================');
2067 console.log(context);
2068 if (optionalValue) {
2069 console.log('OptionalValue');
2070 console.log('====================');
2071 console.log(optionalValue);
2072 }
2073 };
2074 return DebugHelper;
2075}());
2076
2077var BreakLinesHelper = /** @class */ (function () {
2078 function BreakLinesHelper(bars) {
2079 this.bars = bars;
2080 }
2081 BreakLinesHelper.prototype.helperFunc = function (context, text) {
2082 text = this.bars.Utils.escapeExpression(text);
2083 text = text.replace(/(\r\n|\n|\r)/gm, '<br>');
2084 text = text.replace(/ /gm, '&nbsp;');
2085 text = text.replace(/ /gm, '&nbsp;&nbsp;&nbsp;&nbsp;');
2086 return new Handlebars.SafeString(text);
2087 };
2088 return BreakLinesHelper;
2089}());
2090
2091var CleanParagraphHelper = /** @class */ (function () {
2092 function CleanParagraphHelper() {
2093 }
2094 CleanParagraphHelper.prototype.helperFunc = function (context, text) {
2095 text = text.replace(/<p>/gm, '');
2096 text = text.replace(/<\/p>/gm, '');
2097 return new Handlebars.SafeString(text);
2098 };
2099 return CleanParagraphHelper;
2100}());
2101
2102var EscapeSimpleQuoteHelper = /** @class */ (function () {
2103 function EscapeSimpleQuoteHelper() {
2104 }
2105 EscapeSimpleQuoteHelper.prototype.helperFunc = function (context, text) {
2106 if (!text) {
2107 return;
2108 }
2109 text = text.replace(/'/g, "\\'");
2110 text = text.replace(/(\r\n|\n|\r)/gm, '');
2111 return text;
2112 };
2113 return EscapeSimpleQuoteHelper;
2114}());
2115
2116var BreakCommaHelper = /** @class */ (function () {
2117 function BreakCommaHelper(bars) {
2118 this.bars = bars;
2119 }
2120 BreakCommaHelper.prototype.helperFunc = function (context, text) {
2121 text = this.bars.Utils.escapeExpression(text);
2122 text = text.replace(/,/g, ',<br>');
2123 return new Handlebars.SafeString(text);
2124 };
2125 return BreakCommaHelper;
2126}());
2127
2128var ModifKindHelper = /** @class */ (function () {
2129 function ModifKindHelper() {
2130 }
2131 /**
2132 * Transform SyntaxKind into string
2133 * @param {any} context Handlebars context
2134 * @param {SyntaxKind[]} kind SyntaxKind concatenated
2135 * @return {string} Parsed string
2136 */
2137 ModifKindHelper.prototype.helperFunc = function (context, kind) {
2138 var _kindText = '';
2139 switch (kind) {
2140 case Ast.SyntaxKind.PrivateKeyword:
2141 _kindText = 'Private';
2142 break;
2143 case Ast.SyntaxKind.ReadonlyKeyword:
2144 _kindText = 'Readonly';
2145 break;
2146 case Ast.SyntaxKind.ProtectedKeyword:
2147 _kindText = 'Protected';
2148 break;
2149 case Ast.SyntaxKind.PublicKeyword:
2150 _kindText = 'Public';
2151 break;
2152 case Ast.SyntaxKind.StaticKeyword:
2153 _kindText = 'Static';
2154 break;
2155 case Ast.SyntaxKind.AsyncKeyword:
2156 _kindText = 'Async';
2157 break;
2158 case Ast.SyntaxKind.AbstractKeyword:
2159 _kindText = 'Abstract';
2160 break;
2161 }
2162 return new Handlebars.SafeString(_kindText);
2163 };
2164 return ModifKindHelper;
2165}());
2166
2167var ModifIconHelper = /** @class */ (function () {
2168 function ModifIconHelper() {
2169 }
2170 ModifIconHelper.prototype.helperFunc = function (context, kind) {
2171 var _kindText = '';
2172 switch (kind) {
2173 case Ast.SyntaxKind.PrivateKeyword:
2174 _kindText = 'lock'; // private
2175 break;
2176 case Ast.SyntaxKind.ProtectedKeyword:
2177 _kindText = 'lock'; // protected
2178 break;
2179 case Ast.SyntaxKind.StaticKeyword:
2180 _kindText = 'reset'; // static
2181 break;
2182 case Ast.SyntaxKind.ExportKeyword:
2183 _kindText = 'export'; // export
2184 break;
2185 default:
2186 _kindText = 'reset';
2187 break;
2188 }
2189 return _kindText;
2190 };
2191 return ModifIconHelper;
2192}());
2193
2194var RelativeURLHelper = /** @class */ (function () {
2195 function RelativeURLHelper() {
2196 }
2197 RelativeURLHelper.prototype.helperFunc = function (context, currentDepth, options) {
2198 switch (currentDepth) {
2199 case 0:
2200 return './';
2201 case 1:
2202 case 2:
2203 case 3:
2204 case 4:
2205 case 5:
2206 return '../'.repeat(currentDepth);
2207 }
2208 return '';
2209 };
2210 return RelativeURLHelper;
2211}());
2212
2213var JsdocReturnsCommentHelper = /** @class */ (function () {
2214 function JsdocReturnsCommentHelper() {
2215 }
2216 JsdocReturnsCommentHelper.prototype.helperFunc = function (context, jsdocTags, options) {
2217 var i = 0;
2218 var len = jsdocTags.length;
2219 var result;
2220 for (i; i < len; i++) {
2221 if (jsdocTags[i].tagName) {
2222 if (jsdocTags[i].tagName.text === 'returns' || jsdocTags[i].tagName.text === 'return') {
2223 result = jsdocTags[i].comment;
2224 break;
2225 }
2226 }
2227 }
2228 return result;
2229 };
2230 return JsdocReturnsCommentHelper;
2231}());
2232
2233var JsdocCodeExampleHelper = /** @class */ (function () {
2234 function JsdocCodeExampleHelper() {
2235 }
2236 JsdocCodeExampleHelper.prototype.cleanTag = function (comment) {
2237 if (comment.charAt(0) === '*') {
2238 comment = comment.substring(1, comment.length);
2239 }
2240 if (comment.charAt(0) === ' ') {
2241 comment = comment.substring(1, comment.length);
2242 }
2243 if (comment.indexOf('<p>') === 0) {
2244 comment = comment.substring(3, comment.length);
2245 }
2246 if (comment.substr(-1) === '\n') {
2247 comment = comment.substring(0, comment.length - 1);
2248 }
2249 if (comment.substr(-4) === '</p>') {
2250 comment = comment.substring(0, comment.length - 4);
2251 }
2252 return comment;
2253 };
2254 JsdocCodeExampleHelper.prototype.getHtmlEntities = function (str) {
2255 return String(str).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
2256 };
2257 JsdocCodeExampleHelper.prototype.helperFunc = function (context, jsdocTags, options) {
2258 var i = 0;
2259 var len = jsdocTags.length;
2260 var tags = [];
2261 var type = 'html';
2262 if (options.hash.type) {
2263 type = options.hash.type;
2264 }
2265 for (i; i < len; i++) {
2266 if (jsdocTags[i].tagName) {
2267 if (jsdocTags[i].tagName.text === 'example') {
2268 var tag = {};
2269 if (jsdocTags[i].comment) {
2270 if (jsdocTags[i].comment.indexOf('<caption>') !== -1) {
2271 tag.comment = jsdocTags[i].comment.replace(/<caption>/g, '<b><i>').replace(/\/caption>/g, '/b></i>');
2272 }
2273 else {
2274 tag.comment = "<pre class=\"line-numbers\"><code class=\"language-" + type + "\">" +
2275 this.getHtmlEntities(this.cleanTag(jsdocTags[i].comment)) + "</code></pre>";
2276 }
2277 tags.push(tag);
2278 }
2279 }
2280 }
2281 }
2282 if (tags.length > 0) {
2283 context.tags = tags;
2284 return options.fn(context);
2285 }
2286 };
2287 return JsdocCodeExampleHelper;
2288}());
2289
2290var JsdocExampleHelper = /** @class */ (function () {
2291 function JsdocExampleHelper() {
2292 }
2293 JsdocExampleHelper.prototype.helperFunc = function (context, jsdocTags, options) {
2294 var i = 0;
2295 var len = jsdocTags.length;
2296 var tags = [];
2297 for (i; i < len; i++) {
2298 if (jsdocTags[i].tagName) {
2299 if (jsdocTags[i].tagName.text === 'example') {
2300 var tag = {};
2301 if (jsdocTags[i].comment) {
2302 tag.comment = jsdocTags[i].comment.replace(/<caption>/g, '<b><i>').replace(/\/caption>/g, '/b></i>');
2303 }
2304 tags.push(tag);
2305 }
2306 }
2307 }
2308 if (tags.length > 0) {
2309 context.tags = tags;
2310 return options.fn(context);
2311 }
2312 };
2313 return JsdocExampleHelper;
2314}());
2315
2316var JsdocParamsHelper = /** @class */ (function () {
2317 function JsdocParamsHelper() {
2318 }
2319 JsdocParamsHelper.prototype.helperFunc = function (context, jsdocTags, options) {
2320 var i = 0;
2321 var len = jsdocTags.length;
2322 var tags = [];
2323 for (i; i < len; i++) {
2324 if (jsdocTags[i].tagName) {
2325 if (jsdocTags[i].tagName.text === 'param') {
2326 var tag = {};
2327 if (jsdocTags[i].typeExpression && jsdocTags[i].typeExpression.type.kind) {
2328 tag.type = kindToType(jsdocTags[i].typeExpression.type.kind);
2329 }
2330 if (jsdocTags[i].typeExpression && jsdocTags[i].typeExpression.type.name) {
2331 tag.type = jsdocTags[i].typeExpression.type.name.text;
2332 }
2333 else {
2334 tag.type = jsdocTags[i].type;
2335 }
2336 if (jsdocTags[i].comment) {
2337 tag.comment = jsdocTags[i].comment;
2338 }
2339 if (jsdocTags[i].defaultValue) {
2340 tag.defaultValue = jsdocTags[i].defaultValue;
2341 }
2342 if (jsdocTags[i].name) {
2343 if (jsdocTags[i].name.text) {
2344 tag.name = jsdocTags[i].name.text;
2345 }
2346 else {
2347 tag.name = jsdocTags[i].name;
2348 }
2349 }
2350 if (jsdocTags[i].optional) {
2351 tag.optional = true;
2352 }
2353 tags.push(tag);
2354 }
2355 }
2356 }
2357 if (tags.length >= 1) {
2358 context.tags = tags;
2359 return options.fn(context);
2360 }
2361 };
2362 return JsdocParamsHelper;
2363}());
2364
2365var JsdocParamsValidHelper = /** @class */ (function () {
2366 function JsdocParamsValidHelper() {
2367 }
2368 JsdocParamsValidHelper.prototype.helperFunc = function (context, jsdocTags, options) {
2369 var i = 0;
2370 var len = jsdocTags.length;
2371 var valid = false;
2372 for (i; i < len; i++) {
2373 if (jsdocTags[i].tagName) {
2374 if (jsdocTags[i].tagName.text === 'param') {
2375 valid = true;
2376 }
2377 }
2378 }
2379 if (valid) {
2380 return options.fn(context);
2381 }
2382 else {
2383 return options.inverse(context);
2384 }
2385 };
2386 return JsdocParamsValidHelper;
2387}());
2388
2389var JsdocDefaultHelper = /** @class */ (function () {
2390 function JsdocDefaultHelper() {
2391 }
2392 JsdocDefaultHelper.prototype.helperFunc = function (context, jsdocTags, options) {
2393 if (jsdocTags) {
2394 var i = 0;
2395 var len = jsdocTags.length;
2396 var tag = {};
2397 var defaultValue = false;
2398 for (i; i < len; i++) {
2399 if (jsdocTags[i].tagName) {
2400 if (jsdocTags[i].tagName.text === 'default') {
2401 defaultValue = true;
2402 if (jsdocTags[i].typeExpression && jsdocTags[i].typeExpression.type.name) {
2403 tag.type = jsdocTags[i].typeExpression.type.name.text;
2404 }
2405 if (jsdocTags[i].comment) {
2406 tag.comment = jsdocTags[i].comment;
2407 }
2408 if (jsdocTags[i].name) {
2409 tag.name = jsdocTags[i].name.text;
2410 }
2411 }
2412 }
2413 }
2414 if (defaultValue) {
2415 context.tag = tag;
2416 return options.fn(context);
2417 }
2418 }
2419 };
2420 return JsdocDefaultHelper;
2421}());
2422
2423var LinkTypeHelper = /** @class */ (function () {
2424 function LinkTypeHelper(configuration, dependenciesEngine) {
2425 this.configuration = configuration;
2426 this.dependenciesEngine = dependenciesEngine;
2427 this.angularVersionUtil = new AngularVersionUtil();
2428 this.basicTypeUtil = new BasicTypeUtil();
2429 }
2430 LinkTypeHelper.prototype.helperFunc = function (context, name, options) {
2431 var _result = this.dependenciesEngine.find(name);
2432 var angularDocPrefix = this.angularVersionUtil.prefixOfficialDoc(this.configuration.mainData.angularVersion);
2433 if (_result) {
2434 context.type = {
2435 raw: name
2436 };
2437 if (_result.source === 'internal') {
2438 if (_result.data.type === 'class') {
2439 _result.data.type = 'classe';
2440 }
2441 context.type.href = '../' + _result.data.type + 's/' + _result.data.name + '.html';
2442 if (_result.data.type === 'miscellaneous' || (_result.data.ctype && _result.data.ctype === 'miscellaneous')) {
2443 var mainpage = '';
2444 switch (_result.data.subtype) {
2445 case 'enum':
2446 mainpage = 'enumerations';
2447 break;
2448 case 'function':
2449 mainpage = 'functions';
2450 break;
2451 case 'typealias':
2452 mainpage = 'typealiases';
2453 break;
2454 case 'variable':
2455 mainpage = 'variables';
2456 }
2457 context.type.href = '../' + _result.data.ctype + '/' + mainpage + '.html#' + _result.data.name;
2458 }
2459 context.type.target = '_self';
2460 }
2461 else {
2462 context.type.href = "https://" + angularDocPrefix + "angular.io/" + _result.data.path;
2463 context.type.target = '_blank';
2464 }
2465 return options.fn(context);
2466 }
2467 else if (this.basicTypeUtil.isKnownType(name)) {
2468 context.type = {
2469 raw: name
2470 };
2471 context.type.target = '_blank';
2472 context.type.href = this.basicTypeUtil.getTypeUrl(name);
2473 return options.fn(context);
2474 }
2475 else {
2476 return options.inverse(context);
2477 }
2478 };
2479 return LinkTypeHelper;
2480}());
2481
2482var IndexableSignatureHelper = /** @class */ (function () {
2483 function IndexableSignatureHelper() {
2484 }
2485 IndexableSignatureHelper.prototype.helperFunc = function (context, method) {
2486 var args = method.args.map(function (arg) { return arg.name + ": " + arg.type; }).join(', ');
2487 if (method.name) {
2488 return method.name + "[" + args + "]";
2489 }
2490 else {
2491 return "[" + args + "]";
2492 }
2493 };
2494 return IndexableSignatureHelper;
2495}());
2496
2497var ObjectHelper = /** @class */ (function () {
2498 function ObjectHelper() {
2499 }
2500 ObjectHelper.prototype.helperFunc = function (context, text) {
2501 text = JSON.stringify(text);
2502 text = text.replace(/{"/, '{<br>&nbsp;&nbsp;&nbsp;&nbsp;"');
2503 text = text.replace(/,"/, ',<br>&nbsp;&nbsp;&nbsp;&nbsp;"');
2504 text = text.replace(/}$/, '<br>}');
2505 return new Handlebars.SafeString(text);
2506 };
2507 return ObjectHelper;
2508}());
2509
2510var ObjectLengthHelper = /** @class */ (function () {
2511 function ObjectLengthHelper() {
2512 }
2513 ObjectLengthHelper.prototype.helperFunc = function (context, obj, operator, length) {
2514 var len = arguments.length - 1;
2515 var options = arguments[len];
2516 if (typeof obj !== 'object') {
2517 return options.inverse(context);
2518 }
2519 var size = 0, key;
2520 for (key in obj) {
2521 if (obj.hasOwnProperty(key)) {
2522 size++;
2523 }
2524 }
2525 var result;
2526 switch (operator) {
2527 case '===':
2528 result = size === length;
2529 break;
2530 case '!==':
2531 result = size !== length;
2532 break;
2533 case '>':
2534 result = size > length;
2535 break;
2536 default: {
2537 throw new Error('helper {{objectLength}}: invalid operator: `' + operator + '`');
2538 }
2539 }
2540 if (result === false) {
2541 return options.inverse(context);
2542 }
2543 return options.fn(context);
2544 };
2545 return ObjectLengthHelper;
2546}());
2547
2548var ParseDescriptionHelper = /** @class */ (function () {
2549 function ParseDescriptionHelper(dependenciesEngine) {
2550 this.dependenciesEngine = dependenciesEngine;
2551 }
2552 ParseDescriptionHelper.prototype.helperFunc = function (context, description, depth) {
2553 var _this = this;
2554 var tagRegExpLight = new RegExp('\\{@link\\s+((?:.|\n)+?)\\}', 'i');
2555 var tagRegExpFull = new RegExp('\\{@link\\s+((?:.|\n)+?)\\}', 'i');
2556 var tagRegExp;
2557 var matches;
2558 var previousString;
2559 tagRegExp = description.indexOf(']{') !== -1 ? tagRegExpFull : tagRegExpLight;
2560 var processTheLink = function (originalDescription, matchedTag, leadingText) {
2561 var leading = extractLeadingText(originalDescription, matchedTag.completeTag);
2562 var split;
2563 var resultInCompodoc;
2564 var newLink;
2565 var rootPath;
2566 var stringtoReplace;
2567 var anchor = '';
2568 var label;
2569 var pageName;
2570 split = splitLinkText(matchedTag.text);
2571 if (typeof split.linkText !== 'undefined') {
2572 resultInCompodoc = _this.dependenciesEngine.findInCompodoc(split.target);
2573 }
2574 else {
2575 var info = matchedTag.text;
2576 if (matchedTag.text.indexOf('#') !== -1) {
2577 anchor = matchedTag.text.substr(matchedTag.text.indexOf('#'), matchedTag.text.length);
2578 info = matchedTag.text.substr(0, matchedTag.text.indexOf('#'));
2579 }
2580 resultInCompodoc = _this.dependenciesEngine.findInCompodoc(info);
2581 }
2582 if (resultInCompodoc) {
2583 label = resultInCompodoc.name;
2584 pageName = resultInCompodoc.name;
2585 if (leadingText) {
2586 stringtoReplace = '[' + leadingText + ']' + matchedTag.completeTag;
2587 }
2588 else if (leading.leadingText !== undefined) {
2589 stringtoReplace = '[' + leading.leadingText + ']' + matchedTag.completeTag;
2590 }
2591 else if (typeof split.linkText !== 'undefined') {
2592 stringtoReplace = matchedTag.completeTag;
2593 }
2594 else {
2595 stringtoReplace = matchedTag.completeTag;
2596 }
2597 if (resultInCompodoc.type === 'class') {
2598 resultInCompodoc.type = 'classe';
2599 }
2600 else if (resultInCompodoc.type === 'miscellaneous' ||
2601 (resultInCompodoc.ctype && resultInCompodoc.ctype === 'miscellaneous')) {
2602 resultInCompodoc.type = 'miscellaneou';
2603 label = resultInCompodoc.name;
2604 anchor = '#' + resultInCompodoc.name;
2605 if (resultInCompodoc.subtype === 'enum') {
2606 pageName = 'enumerations';
2607 }
2608 else if (resultInCompodoc.subtype === 'function') {
2609 pageName = 'functions';
2610 }
2611 else if (resultInCompodoc.subtype === 'typealias') {
2612 pageName = 'typealiases';
2613 }
2614 else if (resultInCompodoc.subtype === 'variable') {
2615 pageName = 'variables';
2616 }
2617 }
2618 rootPath = '';
2619 switch (depth) {
2620 case 0:
2621 rootPath = './';
2622 break;
2623 case 1:
2624 case 2:
2625 case 3:
2626 case 4:
2627 case 5:
2628 rootPath = '../'.repeat(depth);
2629 break;
2630 }
2631 if (leading.leadingText !== undefined) {
2632 label = leading.leadingText;
2633 }
2634 if (typeof split.linkText !== 'undefined') {
2635 label = split.linkText;
2636 }
2637 newLink = "<a href=\"" + rootPath + resultInCompodoc.type + "s/" + pageName + ".html" + anchor + "\">" + label + "</a>";
2638 return originalDescription.replace(stringtoReplace, newLink);
2639 }
2640 else if (!resultInCompodoc && typeof split.linkText !== 'undefined') {
2641 newLink = "<a href=\"" + split.target + "\">" + split.linkText + "</a>";
2642 if (leadingText) {
2643 stringtoReplace = '[' + leadingText + ']' + matchedTag.completeTag;
2644 }
2645 else if (leading.leadingText !== undefined) {
2646 stringtoReplace = '[' + leading.leadingText + ']' + matchedTag.completeTag;
2647 }
2648 else if (typeof split.linkText !== 'undefined') {
2649 stringtoReplace = matchedTag.completeTag;
2650 }
2651 else {
2652 stringtoReplace = matchedTag.completeTag;
2653 }
2654 return originalDescription.replace(stringtoReplace, newLink);
2655 }
2656 else if (!resultInCompodoc && leading && typeof leading.leadingText !== 'undefined') {
2657 newLink = "<a href=\"" + split.target + "\">" + leading.leadingText + "</a>";
2658 if (leadingText) {
2659 stringtoReplace = '[' + leadingText + ']' + matchedTag.completeTag;
2660 }
2661 else if (leading.leadingText !== undefined) {
2662 stringtoReplace = '[' + leading.leadingText + ']' + matchedTag.completeTag;
2663 }
2664 else if (typeof split.linkText !== 'undefined') {
2665 stringtoReplace = matchedTag.completeTag;
2666 }
2667 else {
2668 stringtoReplace = matchedTag.completeTag;
2669 }
2670 return originalDescription.replace(stringtoReplace, newLink);
2671 }
2672 else if (!resultInCompodoc && typeof split.linkText === 'undefined') {
2673 newLink = "<a href=\"" + split.target + "\">" + split.target + "</a>";
2674 if (leadingText) {
2675 stringtoReplace = '[' + leadingText + ']' + matchedTag.completeTag;
2676 }
2677 else if (leading.leadingText !== undefined) {
2678 stringtoReplace = '[' + leading.leadingText + ']' + matchedTag.completeTag;
2679 }
2680 else {
2681 stringtoReplace = matchedTag.completeTag;
2682 }
2683 return originalDescription.replace(stringtoReplace, newLink);
2684 }
2685 else {
2686 return originalDescription;
2687 }
2688 };
2689 function replaceMatch(replacer, tag, match, text, linkText) {
2690 var matchedTag = {
2691 completeTag: match,
2692 tag: tag,
2693 text: text
2694 };
2695 if (linkText) {
2696 return replacer(description, matchedTag, linkText);
2697 }
2698 else {
2699 return replacer(description, matchedTag);
2700 }
2701 }
2702 // Clean description for marked a tag parsed too early
2703 if (description.indexOf('href=') !== -1) {
2704 var insideMarkedATagResults = description.match(/<a [^>]+>([^<]+)<\/a>/g);
2705 if (insideMarkedATagResults && insideMarkedATagResults.length > 0) {
2706 for (var i = 0; i < insideMarkedATagResults.length; i++) {
2707 var markedATagRegExp = new RegExp('<a [^>]+>([^<]+)</a>', 'gm');
2708 var parsedATag = markedATagRegExp.exec(description);
2709 if (parsedATag && parsedATag.length === 2) {
2710 var insideMarkedATag = parsedATag[1];
2711 description = description.replace("{@link <a href=\"" + encodeURI(insideMarkedATag) + "\">" + insideMarkedATag + "</a>", "{@link " + insideMarkedATag);
2712 }
2713 }
2714 }
2715 }
2716 do {
2717 matches = tagRegExp.exec(description);
2718 // Did we have {@link ?
2719 if (matches) {
2720 previousString = description;
2721 if (matches.length === 2) {
2722 description = replaceMatch(processTheLink, 'link', matches[0], matches[1]);
2723 }
2724 if (matches.length === 3) {
2725 description = replaceMatch(processTheLink, 'link', matches[0], matches[2], matches[1]);
2726 }
2727 }
2728 } while (matches && previousString !== description);
2729 return description;
2730 };
2731 return ParseDescriptionHelper;
2732}());
2733
2734var OneParameterHasHelper = /** @class */ (function () {
2735 function OneParameterHasHelper() {
2736 }
2737 OneParameterHasHelper.prototype.helperFunc = function (context, tags, typeToCheck) {
2738 var result = false;
2739 var len = arguments.length - 1;
2740 var options = arguments[len];
2741 var i = 0, leng = tags.length;
2742 for (i; i < leng; i++) {
2743 if (typeof tags[i][typeToCheck] !== 'undefined' && tags[i][typeToCheck] !== '') {
2744 result = true;
2745 }
2746 }
2747 if (result) {
2748 return options.fn(context);
2749 }
2750 else {
2751 return options.inverse(context);
2752 }
2753 };
2754 return OneParameterHasHelper;
2755}());
2756
2757var ElementAloneHelper = /** @class */ (function () {
2758 function ElementAloneHelper(dependenciesEngine) {
2759 this.dependenciesEngine = dependenciesEngine;
2760 }
2761 ElementAloneHelper.prototype.helperFunc = function (context, elements, elementType, options) {
2762 var alones = [];
2763 var modules = this.dependenciesEngine.modules;
2764 elements.forEach(function (element) {
2765 var foundInOneModule = false;
2766 modules.forEach(function (module) {
2767 module.declarations.forEach(function (declaration) {
2768 if (declaration.id === element.id) {
2769 foundInOneModule = true;
2770 }
2771 if (declaration.file === element.file) {
2772 foundInOneModule = true;
2773 }
2774 });
2775 module.controllers.forEach(function (controller) {
2776 if (controller.id === element.id) {
2777 foundInOneModule = true;
2778 }
2779 if (controller.file === element.file) {
2780 foundInOneModule = true;
2781 }
2782 });
2783 module.providers.forEach(function (provider) {
2784 if (provider.id === element.id) {
2785 foundInOneModule = true;
2786 }
2787 if (provider.file === element.file) {
2788 foundInOneModule = true;
2789 }
2790 });
2791 });
2792 if (!foundInOneModule) {
2793 alones.push(element);
2794 }
2795 });
2796 if (alones.length > 0) {
2797 switch (elementType) {
2798 case 'component':
2799 context.components = alones;
2800 break;
2801 case 'directive':
2802 context.directives = alones;
2803 break;
2804 case 'controller':
2805 context.controllers = alones;
2806 break;
2807 case 'injectable':
2808 context.injectables = alones;
2809 break;
2810 case 'pipe':
2811 context.pipes = alones;
2812 break;
2813 }
2814 return options.fn(context);
2815 }
2816 };
2817 return ElementAloneHelper;
2818}());
2819
2820var HasOwnHelper = /** @class */ (function () {
2821 function HasOwnHelper() {
2822 }
2823 HasOwnHelper.prototype.helperFunc = function (context, entity, key, options) {
2824 if (Object.hasOwnProperty.call(entity, key)) {
2825 return options.fn(context);
2826 }
2827 else {
2828 return options.inverse(context);
2829 }
2830 };
2831 return HasOwnHelper;
2832}());
2833
2834var ShortURLHelper = /** @class */ (function () {
2835 function ShortURLHelper() {
2836 }
2837 ShortURLHelper.prototype.helperFunc = function (context, url, options) {
2838 var newUrl = url;
2839 var firstIndexOfSlash = newUrl.indexOf('/');
2840 var lastIndexOfSlash = newUrl.lastIndexOf('/');
2841 if (firstIndexOfSlash !== -1 || lastIndexOfSlash !== -1) {
2842 newUrl = newUrl.substr(0, firstIndexOfSlash + 1) + '...' + newUrl.substr(lastIndexOfSlash, newUrl.length);
2843 }
2844 return newUrl;
2845 };
2846 return ShortURLHelper;
2847}());
2848
2849var TRANSLATION_EN_US = {
2850 accessors: 'Accessors',
2851 arguments: 'Arguments',
2852 bootstrap: 'Bootstrap',
2853 branches: 'Branches',
2854 browse: 'Browse',
2855 classe: 'Class',
2856 classes: 'Classes',
2857 component: 'Component',
2858 components: 'Components',
2859 constructor: 'Constructor',
2860 controllers: 'Controllers',
2861 controller: 'Controller',
2862 'coverage-page-title': 'Documentation coverage',
2863 declarations: 'Declarations',
2864 decorators: 'Decorators',
2865 'default-value': 'Default value',
2866 'defined-in': 'Defined in',
2867 dependencies: 'Dependencies',
2868 description: 'Description',
2869 directive: 'Directive',
2870 directives: 'Directives',
2871 entrycomponents: 'EntryComponents',
2872 enumerations: 'Enumerations',
2873 enums: 'Enums',
2874 example: 'Example',
2875 exports: 'Exports',
2876 extends: 'Extends',
2877 file: 'File',
2878 functions: 'Functions',
2879 'generated-using': 'Documentation generated using',
2880 'getting-started': 'Getting started',
2881 guard: 'Guard',
2882 guards: 'Guards',
2883 hostbindings: 'HostBindings',
2884 hostlisteners: 'HostListeners',
2885 'html-element': 'Html element',
2886 'html-element-with-directive': 'Html element with directive',
2887 identifier: 'Identifier',
2888 implements: 'Implements',
2889 imports: 'Imports',
2890 index: 'Index',
2891 indexable: 'Indexable',
2892 'inherited-from': 'Inherited from',
2893 injectable: 'Injectable',
2894 injectables: 'Injectables',
2895 inputs: 'Inputs',
2896 interceptors: 'Interceptors',
2897 interface: 'Interface',
2898 interfaces: 'Interfaces',
2899 legend: 'Legend',
2900 license: 'License',
2901 lines: 'Lines',
2902 metadata: 'Metadata',
2903 methods: 'Methods',
2904 miscellaneous: 'Miscellaneous',
2905 module: 'Module',
2906 modules: 'Modules',
2907 name: 'Name',
2908 no: 'No',
2909 'no-graph': 'No graph available.',
2910 'no-iframe': 'Your browser does not support iframes.',
2911 'no-result-matching': 'No results matching',
2912 'no-svg': 'Your browser does not support SVG',
2913 optional: 'Optional',
2914 outputs: 'Outputs',
2915 overview: 'Overview',
2916 parameters: 'Parameters',
2917 'peer-dependencies': 'Peer dependencies',
2918 pipe: 'Pipe',
2919 pipes: 'Pipes',
2920 prefix: 'Prefix',
2921 properties: 'Properties',
2922 providers: 'Providers',
2923 pure: 'Pure',
2924 readme: 'README',
2925 reset: 'Reset',
2926 'results-matching': 'results matching',
2927 returns: 'Returns',
2928 route: 'Route',
2929 routes: 'Routes',
2930 schemas: 'Schemas',
2931 'search-placeholder': 'Type to search',
2932 selector: 'Selector',
2933 signature: 'Signature',
2934 statements: 'Statements',
2935 type: 'Type',
2936 'type-aliases': 'Type aliases',
2937 'type-parameters': 'Type parameters',
2938 types: 'Types',
2939 'unamed-property': 'Unamed property',
2940 'unit-test-coverage': 'Unit test coverage',
2941 value: 'Value',
2942 variables: 'Variables',
2943 yes: 'Yes',
2944 zoomin: 'Zoom in',
2945 zoomout: 'Zoom out'
2946};
2947
2948var TRANSLATION_FR_FR = {
2949 accessors: 'Accesseurs',
2950 arguments: 'Arguments',
2951 bootstrap: 'Bootstrap',
2952 branches: 'Branches',
2953 browse: 'Parcourir',
2954 classe: 'Class',
2955 classes: 'Classes',
2956 component: 'Composant',
2957 components: 'Composants',
2958 constructor: 'Constructeur',
2959 controllers: 'Contrôleurs',
2960 controller: 'Contrôleur',
2961 'coverage-page-title': 'Couverture de documentation',
2962 declarations: 'Déclarations',
2963 decorators: 'Décorateurs',
2964 'default-value': 'Valeur par défaut',
2965 'defined-in': 'Défini dans',
2966 dependencies: 'Dépendances',
2967 description: 'Description',
2968 directive: 'Directive',
2969 directives: 'Directives',
2970 entrycomponents: "Composants d'entrée",
2971 enumerations: 'Enumérations',
2972 enums: 'Enumérations',
2973 example: 'Example',
2974 exports: 'Exports',
2975 extends: 'Etend',
2976 file: 'Fichier',
2977 functions: 'Fonctions',
2978 'generated-using': 'Documentation générée avec',
2979 'getting-started': 'Démarrage',
2980 guard: 'Garde',
2981 guards: 'Gardes',
2982 hostbindings: 'HostBindings',
2983 hostlisteners: 'HostListeners',
2984 'html-element': 'Elément Html',
2985 'html-element-with-directive': 'Elément Html avec une directive',
2986 identifier: 'Identifiant',
2987 implements: 'Implémente',
2988 imports: 'Imports',
2989 index: 'Index',
2990 indexable: 'Indexable',
2991 'inherited-from': 'Hérité de',
2992 injectable: 'Injectable',
2993 injectables: 'Injectables',
2994 inputs: 'Entrées',
2995 interceptors: 'Intercepteurs',
2996 interface: 'Interface',
2997 interfaces: 'Interfaces',
2998 legend: 'Légende',
2999 license: 'License',
3000 lines: 'Lignes',
3001 metadata: 'Métadonnées',
3002 methods: 'Méthodes',
3003 miscellaneous: 'Divers',
3004 module: 'Module',
3005 modules: 'Modules',
3006 name: 'Nom',
3007 no: 'Non',
3008 'no-graph': 'Aucun graphique disponible.',
3009 'no-iframe': 'Votre navigateur ne supporte pas les iframes.',
3010 'no-result-matching': 'Aucun résultat matchant',
3011 'no-svg': 'Votre navigateur ne supporte pas le SVG',
3012 optional: 'Optionnel',
3013 outputs: 'Sorties',
3014 overview: "Vue d'ensemble",
3015 parameters: 'Paramètres',
3016 'peer-dependencies': 'Dépendances de pair',
3017 pipe: 'Pipe',
3018 pipes: 'Pipes',
3019 prefix: 'Préfixe',
3020 properties: 'Propriétés',
3021 providers: 'Providers',
3022 pure: 'Pure',
3023 readme: 'README',
3024 reset: 'Remise à zéro',
3025 'results-matching': 'résultats matchant',
3026 returns: 'Renvoie',
3027 route: 'Route',
3028 routes: 'Routes',
3029 schemas: 'Schémas',
3030 'search-placeholder': 'Saisissez un texte',
3031 selector: 'Sélecteur',
3032 signature: 'Signature',
3033 statements: 'Déclarations',
3034 type: 'Type',
3035 'type-aliases': 'Alias de type',
3036 'type-parameters': 'Paramètres de type',
3037 types: 'Types',
3038 'unamed-property': 'Propriété non nommée',
3039 'unit-test-coverage': 'Couverture de test unitaire',
3040 value: 'Valeur',
3041 variables: 'Variables',
3042 yes: 'Oui',
3043 zoomin: 'Zoom avant',
3044 zoomout: 'Zoom arrière'
3045};
3046
3047var TRANSLATION_ZH_CN = {
3048 accessors: '存取器',
3049 arguments: 'Arguments',
3050 bootstrap: '根组件',
3051 branches: '分支',
3052 browse: '浏览',
3053 classe: '类',
3054 classes: '类列表',
3055 component: '组件',
3056 components: '组件列表',
3057 constructor: '构造方法',
3058 controllers: 'Controllers',
3059 controller: 'Controller',
3060 'coverage-page-title': '文档概览',
3061 declarations: '可声明对象列表',
3062 decorators: '装饰器列表',
3063 'default-value': '缺省值',
3064 'defined-in': '被定义在',
3065 dependencies: '依赖项',
3066 description: '描述',
3067 directive: '指令',
3068 directives: '指令列表',
3069 entrycomponents: '入口组件列表',
3070 enumerations: '列举',
3071 enums: '枚举列表',
3072 example: '例子',
3073 exports: '导出',
3074 extends: '继承',
3075 file: '文件',
3076 functions: '函数',
3077 'generated-using': 'Documentation generated using',
3078 'getting-started': '入门指南',
3079 guard: '路由守卫',
3080 guards: '路由守卫列表',
3081 hostbindings: '宿主绑定',
3082 hostlisteners: '宿主监听',
3083 'html-element': 'Html 元素',
3084 'html-element-with-directive': '带指令的Html元素',
3085 identifier: 'Identifier',
3086 implements: '实现',
3087 imports: '引入',
3088 index: '索引',
3089 indexable: 'Indexable',
3090 'inherited-from': '继承自',
3091 injectable: '可注入的',
3092 injectables: '可注入的',
3093 inputs: 'Inputs',
3094 interceptors: '拦截器',
3095 interface: '接口',
3096 interfaces: '接口',
3097 legend: 'Legend',
3098 license: '许可协议',
3099 lines: 'Lines',
3100 metadata: '元数据',
3101 methods: '方法',
3102 miscellaneous: '其他',
3103 module: '模块',
3104 modules: '模块',
3105 name: '名称',
3106 no: '否',
3107 'no-graph': '无图表显示',
3108 'no-iframe': '你的浏览器不支持iframes',
3109 'no-result-matching': '无匹配的结果',
3110 'no-svg': '你的浏览器不支持SVG',
3111 optional: 'Optional',
3112 outputs: '输出',
3113 overview: '概述',
3114 parameters: '参数列表',
3115 'peer-dependencies': '同级依赖',
3116 pipe: '管道',
3117 pipes: '管道列表',
3118 prefix: '字首',
3119 properties: '属性列表',
3120 providers: '提供商列表',
3121 pure: 'Pure',
3122 readme: '手册',
3123 reset: '重置',
3124 'results-matching': '匹配的结果',
3125 returns: '返回',
3126 route: '路由',
3127 routes: '路由列表',
3128 schemas: '模式',
3129 'search-placeholder': '请输入查询关键字',
3130 selector: '选择器',
3131 signature: '签名',
3132 statements: '声明',
3133 type: '类型',
3134 'type-aliases': '类型别名',
3135 'type-parameters': '类型参数',
3136 types: '类型',
3137 'unamed-property': '未命名属性',
3138 'unit-test-coverage': '单元测试概览',
3139 value: '值',
3140 variables: '变量',
3141 yes: '是',
3142 zoomin: '放大',
3143 zoomout: '缩小'
3144};
3145
3146var I18nEngine = /** @class */ (function () {
3147 function I18nEngine() {
3148 this.availablesLanguages = {
3149 'en-US': 'en-US',
3150 'fr-FR': 'fr-FR',
3151 'zh-CN': 'zh-CN'
3152 };
3153 this.fallbackLanguage = 'en-US';
3154 }
3155 I18nEngine.prototype.init = function (language) {
3156 i18next.init({
3157 lng: language,
3158 fallbackLng: this.fallbackLanguage
3159 });
3160 i18next.addResources('en-US', 'translation', TRANSLATION_EN_US);
3161 i18next.addResources('fr-FR', 'translation', TRANSLATION_FR_FR);
3162 i18next.addResources('zh-CN', 'translation', TRANSLATION_ZH_CN);
3163 };
3164 I18nEngine.prototype.translate = function (key) {
3165 return i18next.t(key);
3166 };
3167 I18nEngine.prototype.supportLanguage = function (language) {
3168 return typeof this.availablesLanguages[language] !== 'undefined';
3169 };
3170 return I18nEngine;
3171}());
3172var I18nEngineInstance = new I18nEngine();
3173
3174var I18nHelper = /** @class */ (function () {
3175 function I18nHelper() {
3176 }
3177 I18nHelper.prototype.helperFunc = function (context, i18n_key, options) {
3178 var result = I18nEngineInstance.translate(i18n_key);
3179 return new Handlebars.SafeString(result);
3180 };
3181 return I18nHelper;
3182}());
3183
3184var HtmlEngineHelpers = /** @class */ (function () {
3185 function HtmlEngineHelpers() {
3186 }
3187 HtmlEngineHelpers.prototype.registerHelpers = function (bars, configuration, dependenciesEngine) {
3188 this.registerHelper(bars, 'compare', new CompareHelper());
3189 this.registerHelper(bars, 'or', new OrHelper());
3190 this.registerHelper(bars, 'functionSignature', new FunctionSignatureHelper(configuration, dependenciesEngine));
3191 this.registerHelper(bars, 'isNotToggle', new IsNotToggleHelper(configuration));
3192 this.registerHelper(bars, 'isInitialTab', new IsInitialTabHelper());
3193 this.registerHelper(bars, 'isTabEnabled', new IsTabEnabledHelper());
3194 this.registerHelper(bars, 'ifString', new IfStringHelper());
3195 this.registerHelper(bars, 'orLength', new OrLengthHelper());
3196 this.registerHelper(bars, 'filterAngular2Modules', new FilterAngular2ModulesHelper());
3197 this.registerHelper(bars, 'debug', new DebugHelper());
3198 this.registerHelper(bars, 'breaklines', new BreakLinesHelper(bars));
3199 this.registerHelper(bars, 'clean-paragraph', new CleanParagraphHelper());
3200 this.registerHelper(bars, 'escapeSimpleQuote', new EscapeSimpleQuoteHelper());
3201 this.registerHelper(bars, 'breakComma', new BreakCommaHelper(bars));
3202 this.registerHelper(bars, 'modifKind', new ModifKindHelper());
3203 this.registerHelper(bars, 'modifIcon', new ModifIconHelper());
3204 this.registerHelper(bars, 'relativeURL', new RelativeURLHelper());
3205 this.registerHelper(bars, 'jsdoc-returns-comment', new JsdocReturnsCommentHelper());
3206 this.registerHelper(bars, 'jsdoc-code-example', new JsdocCodeExampleHelper());
3207 this.registerHelper(bars, 'jsdoc-example', new JsdocExampleHelper());
3208 this.registerHelper(bars, 'jsdoc-params', new JsdocParamsHelper());
3209 this.registerHelper(bars, 'jsdoc-params-valid', new JsdocParamsValidHelper());
3210 this.registerHelper(bars, 'jsdoc-default', new JsdocDefaultHelper());
3211 this.registerHelper(bars, 'linkType', new LinkTypeHelper(configuration, dependenciesEngine));
3212 this.registerHelper(bars, 'indexableSignature', new IndexableSignatureHelper());
3213 this.registerHelper(bars, 'object', new ObjectHelper());
3214 this.registerHelper(bars, 'objectLength', new ObjectLengthHelper());
3215 this.registerHelper(bars, 'parseDescription', new ParseDescriptionHelper(dependenciesEngine));
3216 this.registerHelper(bars, 'one-parameter-has', new OneParameterHasHelper());
3217 this.registerHelper(bars, 'element-alone', new ElementAloneHelper(dependenciesEngine));
3218 this.registerHelper(bars, 'hasOwn', new HasOwnHelper());
3219 this.registerHelper(bars, 'short-url', new ShortURLHelper());
3220 this.registerHelper(bars, 't', new I18nHelper());
3221 };
3222 HtmlEngineHelpers.prototype.registerHelper = function (bars, key, helper) {
3223 Handlebars.registerHelper(key, function () {
3224 // tslint:disable-next-line:no-invalid-this
3225 return helper.helperFunc.apply(helper, [this].concat(_.slice(arguments)));
3226 });
3227 };
3228 return HtmlEngineHelpers;
3229}());
3230
3231var HtmlEngine = /** @class */ (function () {
3232 function HtmlEngine(configuration, dependenciesEngine, fileEngine) {
3233 if (fileEngine === void 0) { fileEngine = new FileEngine(); }
3234 this.fileEngine = fileEngine;
3235 this.cache = {};
3236 var helper = new HtmlEngineHelpers();
3237 helper.registerHelpers(Handlebars, configuration, dependenciesEngine);
3238 }
3239 HtmlEngine.prototype.init = function (templatePath) {
3240 var _this = this;
3241 var partials = [
3242 'overview',
3243 'markdown',
3244 'modules',
3245 'module',
3246 'components',
3247 'component',
3248 'controller',
3249 'component-detail',
3250 'directives',
3251 'directive',
3252 'injectables',
3253 'injectable',
3254 'interceptor',
3255 'guard',
3256 'pipes',
3257 'pipe',
3258 'classes',
3259 'class',
3260 'interface',
3261 'routes',
3262 'index',
3263 'index-misc',
3264 'search-results',
3265 'search-input',
3266 'link-type',
3267 'block-method',
3268 'block-enum',
3269 'block-property',
3270 'block-index',
3271 'block-constructor',
3272 'block-typealias',
3273 'block-accessors',
3274 'block-input',
3275 'block-output',
3276 'coverage-report',
3277 'unit-test-report',
3278 'miscellaneous-functions',
3279 'miscellaneous-variables',
3280 'miscellaneous-typealiases',
3281 'miscellaneous-enumerations',
3282 'additional-page',
3283 'package-dependencies'
3284 ];
3285 if (templatePath) {
3286 if (this.fileEngine.existsSync(path.resolve(process.cwd() + path.sep + templatePath)) === false) {
3287 logger.warn('Template path specificed but does not exist...using default templates');
3288 //new Error('Template path specified but does not exist');
3289 }
3290 }
3291 return Promise.all(partials.map(function (partial) {
3292 var partialPath = _this.determineTemplatePath(templatePath, 'partials/' + partial + '.hbs');
3293 return _this.fileEngine
3294 .get(partialPath)
3295 .then(function (data) { return Handlebars.registerPartial(partial, data); });
3296 }))
3297 .then(function () {
3298 var pagePath = _this.determineTemplatePath(templatePath, 'page.hbs');
3299 return _this.fileEngine
3300 .get(pagePath)
3301 .then(function (data) {
3302 _this.cache.page = data;
3303 _this.compiledPage = Handlebars.compile(_this.cache.page, {
3304 preventIndent: true,
3305 strict: true
3306 });
3307 });
3308 })
3309 .then(function () {
3310 var menuPath = _this.determineTemplatePath(templatePath, 'partials/menu.hbs');
3311 return _this.fileEngine
3312 .get(menuPath)
3313 .then(function (menuTemplate) {
3314 _this.precompiledMenu = Handlebars.compile(menuTemplate, {
3315 preventIndent: true,
3316 strict: true
3317 });
3318 });
3319 });
3320 };
3321 HtmlEngine.prototype.renderMenu = function (templatePath, data) {
3322 var menuPath = this.determineTemplatePath(templatePath, 'partials/menu.hbs');
3323 return this.fileEngine
3324 .get(menuPath)
3325 .then(function (menuTemplate) {
3326 data.menu = 'normal';
3327 return Handlebars.compile(menuTemplate, {
3328 preventIndent: true,
3329 strict: true
3330 })(__assign({}, data));
3331 });
3332 };
3333 HtmlEngine.prototype.render = function (mainData, page) {
3334 var o = mainData;
3335 Object.assign(o, page);
3336 // let mem = process.memoryUsage();
3337 // console.log(`heapTotal: ${mem.heapTotal} | heapUsed: ${mem.heapUsed}`);
3338 return this.compiledPage({
3339 data: o
3340 });
3341 };
3342 HtmlEngine.prototype.determineTemplatePath = function (templatePath, filePath) {
3343 var outPath = path.resolve(__dirname + '/../src/templates/' + filePath);
3344 if (templatePath) {
3345 var testPath = path.resolve(process.cwd() + path.sep + templatePath + path.sep + filePath);
3346 outPath = (this.fileEngine.existsSync(testPath) ? testPath : outPath);
3347 }
3348 return outPath;
3349 };
3350 HtmlEngine.prototype.generateCoverageBadge = function (outputFolder, label, coverageData) {
3351 var _this = this;
3352 return this.fileEngine
3353 .get(path.resolve(__dirname + '/../src/templates/partials/coverage-badge.hbs'))
3354 .then(function (data) {
3355 var template = Handlebars.compile(data);
3356 coverageData.label = label;
3357 var result = template({
3358 data: coverageData
3359 });
3360 var testOutputDir = outputFolder.match(process.cwd());
3361 if (testOutputDir && testOutputDir.length > 0) {
3362 outputFolder = outputFolder.replace(process.cwd() + path.sep, '');
3363 }
3364 return _this.fileEngine
3365 .write(outputFolder + path.sep + '/images/coverage-badge-' + label + '.svg', result)
3366 .catch(function (err) {
3367 logger.error('Error during coverage badge ' + label + ' file generation ', err);
3368 return Promise.reject(err);
3369 });
3370 }, function (err) { return Promise.reject('Error during coverage badge generation'); });
3371 };
3372 return HtmlEngine;
3373}());
3374
3375var marked$1 = require('marked');
3376var MarkdownEngine = /** @class */ (function () {
3377 function MarkdownEngine(fileEngine) {
3378 if (fileEngine === void 0) { fileEngine = new FileEngine(); }
3379 var _this = this;
3380 this.fileEngine = fileEngine;
3381 /**
3382 * List of markdown files without .md extension
3383 */
3384 this.markdownFiles = ['README', 'CHANGELOG', 'LICENSE', 'CONTRIBUTING', 'TODO'];
3385 var renderer = new marked$1.Renderer();
3386 renderer.code = function (code, language) {
3387 var highlighted = code;
3388 if (!language) {
3389 language = 'none';
3390 }
3391 highlighted = _this.escape(code);
3392 return "<div><pre class=\"line-numbers\"><code class=\"language-" + language + "\">" + highlighted + "</code></pre></div>";
3393 };
3394 renderer.table = function (header, body) {
3395 return ('<table class="table table-bordered compodoc-table">\n' +
3396 '<thead>\n' +
3397 header +
3398 '</thead>\n' +
3399 '<tbody>\n' +
3400 body +
3401 '</tbody>\n' +
3402 '</table>\n');
3403 };
3404 renderer.image = function (href, title, text) {
3405 var out = '<img src="' + href + '" alt="' + text + '" class="img-responsive"';
3406 if (title) {
3407 out += ' title="' + title + '"';
3408 }
3409 out += '>';
3410 return out;
3411 };
3412 marked$1.setOptions({
3413 renderer: renderer,
3414 breaks: false
3415 });
3416 }
3417 MarkdownEngine.prototype.getTraditionalMarkdown = function (filepath) {
3418 var _this = this;
3419 return this.fileEngine
3420 .get(process.cwd() + path.sep + filepath + '.md')
3421 .catch(function (err) { return _this.fileEngine.get(process.cwd() + path.sep + filepath).then(); })
3422 .then(function (data) { return marked$1(data); });
3423 };
3424 MarkdownEngine.prototype.getTraditionalMarkdownSync = function (filepath) {
3425 return marked$1(this.fileEngine.getSync(process.cwd() + path.sep + filepath));
3426 };
3427 MarkdownEngine.prototype.getReadmeFile = function () {
3428 return this.fileEngine
3429 .get(process.cwd() + path.sep + 'README.md')
3430 .then(function (data) { return marked$1(data); });
3431 };
3432 MarkdownEngine.prototype.readNeighbourReadmeFile = function (file) {
3433 var dirname = path.dirname(file);
3434 var readmeFile = dirname + path.sep + path.basename(file, '.ts') + '.md';
3435 return fs.readFileSync(readmeFile, 'utf8');
3436 };
3437 MarkdownEngine.prototype.hasNeighbourReadmeFile = function (file) {
3438 var dirname = path.dirname(file);
3439 var readmeFile = dirname + path.sep + path.basename(file, '.ts') + '.md';
3440 return this.fileEngine.existsSync(readmeFile);
3441 };
3442 MarkdownEngine.prototype.componentReadmeFile = function (file) {
3443 var dirname = path.dirname(file);
3444 var readmeFile = dirname + path.sep + 'README.md';
3445 var readmeAlternativeFile = dirname + path.sep + path.basename(file, '.ts') + '.md';
3446 var finalPath = '';
3447 if (this.fileEngine.existsSync(readmeFile)) {
3448 finalPath = readmeFile;
3449 }
3450 else {
3451 finalPath = readmeAlternativeFile;
3452 }
3453 return finalPath;
3454 };
3455 /**
3456 * Checks if any of the markdown files is exists with or without endings
3457 */
3458 MarkdownEngine.prototype.hasRootMarkdowns = function () {
3459 var _this = this;
3460 return this.addEndings(this.markdownFiles).some(function (x) {
3461 return _this.fileEngine.existsSync(process.cwd() + path.sep + x);
3462 });
3463 };
3464 MarkdownEngine.prototype.listRootMarkdowns = function () {
3465 var _this = this;
3466 var foundFiles = this.markdownFiles.filter(function (x) {
3467 return _this.fileEngine.existsSync(process.cwd() + path.sep + x + '.md') ||
3468 _this.fileEngine.existsSync(process.cwd() + path.sep + x);
3469 });
3470 return this.addEndings(foundFiles);
3471 };
3472 MarkdownEngine.prototype.escape = function (html) {
3473 return html
3474 .replace(/&/g, '&amp;')
3475 .replace(/</g, '&lt;')
3476 .replace(/>/g, '&gt;')
3477 .replace(/"/g, '&quot;')
3478 .replace(/'/g, '&#39;')
3479 .replace(/@/g, '&#64;');
3480 };
3481 /**
3482 * ['README'] => ['README', 'README.md']
3483 */
3484 MarkdownEngine.prototype.addEndings = function (files) {
3485 return _.flatMap(files, function (x) { return [x, x + '.md']; });
3486 };
3487 return MarkdownEngine;
3488}());
3489
3490var COMPODOC_DEFAULTS = {
3491 title: 'Application documentation',
3492 additionalEntryName: 'Additional documentation',
3493 additionalEntryPath: 'additional-documentation',
3494 folder: './documentation/',
3495 port: 8080,
3496 theme: 'gitbook',
3497 exportFormat: 'html',
3498 exportFormatsSupported: ['html', 'json'],
3499 base: '/',
3500 defaultCoverageThreshold: 70,
3501 defaultCoverageMinimumPerFile: 0,
3502 coverageTestThresholdFail: true,
3503 toggleMenuItems: ['all'],
3504 navTabConfig: [],
3505 disableSourceCode: false,
3506 disableDomTree: false,
3507 disableTemplateTab: false,
3508 disableGraph: false,
3509 disableMainGraph: false,
3510 disableCoverage: false,
3511 disablePrivate: false,
3512 disableProtected: false,
3513 disableInternal: false,
3514 disableLifeCycleHooks: false,
3515 disableRoutesGraph: false,
3516 PAGE_TYPES: {
3517 ROOT: 'root',
3518 INTERNAL: 'internal'
3519 },
3520 gaSite: 'auto',
3521 coverageTestShowOnlyFailed: false,
3522 language: 'en-US'
3523};
3524
3525var Configuration = /** @class */ (function () {
3526 function Configuration() {
3527 this._pages = [];
3528 this._mainData = {
3529 output: COMPODOC_DEFAULTS.folder,
3530 theme: COMPODOC_DEFAULTS.theme,
3531 extTheme: '',
3532 serve: false,
3533 port: COMPODOC_DEFAULTS.port,
3534 open: false,
3535 assetsFolder: '',
3536 documentationMainName: COMPODOC_DEFAULTS.title,
3537 documentationMainDescription: '',
3538 base: COMPODOC_DEFAULTS.base,
3539 hideGenerator: false,
3540 modules: [],
3541 readme: false,
3542 changelog: '',
3543 contributing: '',
3544 license: '',
3545 todo: '',
3546 markdowns: [],
3547 additionalPages: [],
3548 pipes: [],
3549 classes: [],
3550 interfaces: [],
3551 components: [],
3552 directives: [],
3553 injectables: [],
3554 interceptors: [],
3555 guards: [],
3556 miscellaneous: [],
3557 routes: [],
3558 tsconfig: '',
3559 toggleMenuItems: [],
3560 navTabConfig: [],
3561 includes: '',
3562 includesName: COMPODOC_DEFAULTS.additionalEntryName,
3563 includesFolder: COMPODOC_DEFAULTS.additionalEntryPath,
3564 disableSourceCode: COMPODOC_DEFAULTS.disableSourceCode,
3565 disableDomTree: COMPODOC_DEFAULTS.disableDomTree,
3566 disableTemplateTab: COMPODOC_DEFAULTS.disableTemplateTab,
3567 disableGraph: COMPODOC_DEFAULTS.disableGraph,
3568 disableMainGraph: COMPODOC_DEFAULTS.disableMainGraph,
3569 disableCoverage: COMPODOC_DEFAULTS.disableCoverage,
3570 disablePrivate: COMPODOC_DEFAULTS.disablePrivate,
3571 disableInternal: COMPODOC_DEFAULTS.disableInternal,
3572 disableProtected: COMPODOC_DEFAULTS.disableProtected,
3573 disableLifeCycleHooks: COMPODOC_DEFAULTS.disableLifeCycleHooks,
3574 disableRoutesGraph: COMPODOC_DEFAULTS.disableRoutesGraph,
3575 watch: false,
3576 mainGraph: '',
3577 coverageTest: false,
3578 coverageTestThreshold: COMPODOC_DEFAULTS.defaultCoverageThreshold,
3579 coverageTestThresholdFail: COMPODOC_DEFAULTS.coverageTestThresholdFail,
3580 coverageTestPerFile: false,
3581 coverageMinimumPerFile: COMPODOC_DEFAULTS.defaultCoverageMinimumPerFile,
3582 unitTestCoverage: '',
3583 unitTestData: undefined,
3584 coverageTestShowOnlyFailed: COMPODOC_DEFAULTS.coverageTestShowOnlyFailed,
3585 routesLength: 0,
3586 angularVersion: '',
3587 exportFormat: COMPODOC_DEFAULTS.exportFormat,
3588 coverageData: {},
3589 customFavicon: '',
3590 packageDependencies: [],
3591 packagePeerDependencies: [],
3592 gaID: '',
3593 gaSite: '',
3594 angularProject: false,
3595 angularJSProject: false,
3596 language: COMPODOC_DEFAULTS.language
3597 };
3598 }
3599 Configuration.prototype.addPage = function (page) {
3600 var indexPage = _.findIndex(this._pages, { name: page.name });
3601 if (indexPage === -1) {
3602 this._pages.push(page);
3603 }
3604 };
3605 Configuration.prototype.hasPage = function (name) {
3606 var indexPage = _.findIndex(this._pages, { name: name });
3607 return indexPage !== -1;
3608 };
3609 Configuration.prototype.addAdditionalPage = function (page) {
3610 this._mainData.additionalPages.push(page);
3611 };
3612 Configuration.prototype.resetPages = function () {
3613 this._pages = [];
3614 };
3615 Configuration.prototype.resetAdditionalPages = function () {
3616 this._mainData.additionalPages = [];
3617 };
3618 Configuration.prototype.resetRootMarkdownPages = function () {
3619 var indexPage = _.findIndex(this._pages, { name: 'index' });
3620 this._pages.splice(indexPage, 1);
3621 indexPage = _.findIndex(this._pages, { name: 'changelog' });
3622 this._pages.splice(indexPage, 1);
3623 indexPage = _.findIndex(this._pages, { name: 'contributing' });
3624 this._pages.splice(indexPage, 1);
3625 indexPage = _.findIndex(this._pages, { name: 'license' });
3626 this._pages.splice(indexPage, 1);
3627 indexPage = _.findIndex(this._pages, { name: 'todo' });
3628 this._pages.splice(indexPage, 1);
3629 this._mainData.markdowns = [];
3630 };
3631 Object.defineProperty(Configuration.prototype, "pages", {
3632 get: function () {
3633 return this._pages;
3634 },
3635 set: function (pages) {
3636 this._pages = [];
3637 },
3638 enumerable: true,
3639 configurable: true
3640 });
3641 Object.defineProperty(Configuration.prototype, "mainData", {
3642 get: function () {
3643 return this._mainData;
3644 },
3645 set: function (data) {
3646 Object.assign(this._mainData, data);
3647 },
3648 enumerable: true,
3649 configurable: true
3650 });
3651 return Configuration;
3652}());
3653
3654var ngdT = require('@compodoc/ngd-transformer');
3655var NgdEngine = /** @class */ (function () {
3656 function NgdEngine(dependenciesEngine, fileEngine) {
3657 if (fileEngine === void 0) { fileEngine = new FileEngine(); }
3658 this.dependenciesEngine = dependenciesEngine;
3659 this.fileEngine = fileEngine;
3660 }
3661 NgdEngine.prototype.init = function (outputpath) {
3662 this.engine = new ngdT.DotEngine({
3663 output: outputpath,
3664 displayLegend: true,
3665 outputFormats: 'svg',
3666 silent: true
3667 });
3668 };
3669 NgdEngine.prototype.renderGraph = function (filepath, outputpath, type, name) {
3670 this.engine.updateOutput(outputpath);
3671 if (type === 'f') {
3672 return this.engine.generateGraph([this.dependenciesEngine.getRawModule(name)]);
3673 }
3674 else {
3675 return this.engine.generateGraph(this.dependenciesEngine.rawModulesForOverview);
3676 }
3677 };
3678 NgdEngine.prototype.readGraph = function (filepath, name) {
3679 return this.fileEngine
3680 .get(filepath)
3681 .catch(function (err) { return Promise.reject('Error during graph read ' + name); });
3682 };
3683 return NgdEngine;
3684}());
3685
3686var COMPODOC_CONSTANTS = {
3687 navTabDefinitions: [
3688 {
3689 'id': 'info',
3690 'href': '#info',
3691 'data-link': 'info',
3692 'label': 'Info',
3693 'depTypes': ['all']
3694 },
3695 {
3696 'id': 'readme',
3697 'href': '#readme',
3698 'data-link': 'readme',
3699 'label': 'README',
3700 'depTypes': ['all']
3701 },
3702 {
3703 'id': 'source',
3704 'href': '#source',
3705 'data-link': 'source',
3706 'label': 'Source',
3707 'depTypes': ['all']
3708 },
3709 {
3710 'id': 'templateData',
3711 'href': '#templateData',
3712 'data-link': 'template',
3713 'label': 'Template',
3714 'depTypes': ['component']
3715 },
3716 {
3717 'id': 'tree',
3718 'href': '#tree',
3719 'data-link': 'dom-tree',
3720 'label': 'DOM Tree',
3721 'depTypes': ['component']
3722 },
3723 {
3724 'id': 'example',
3725 'href': '#example',
3726 'data-link': 'example',
3727 'label': 'Examples',
3728 'depTypes': ['component', 'directive', 'injectable', 'pipe']
3729 },
3730 ]
3731};
3732/**
3733 * Max length for the string of a file during Lunr search engine indexing.
3734 * Prevent stack size exceeded
3735 */
3736var MAX_SIZE_FILE_SEARCH_INDEX = 50000;
3737/**
3738 * Max length for the string of a file during cheerio parsing.
3739 * Prevent stack size exceeded
3740 */
3741var MAX_SIZE_FILE_CHEERIO_PARSING = 400000000;
3742
3743var lunr = require('lunr');
3744var cheerio = require('cheerio');
3745var Entities = require('html-entities').AllHtmlEntities;
3746var Html = new Entities();
3747var SearchEngine = /** @class */ (function () {
3748 function SearchEngine(configuration, fileEngine) {
3749 if (fileEngine === void 0) { fileEngine = new FileEngine(); }
3750 this.configuration = configuration;
3751 this.fileEngine = fileEngine;
3752 this.searchDocuments = [];
3753 this.documentsStore = {};
3754 this.amountOfMemory = 0;
3755 }
3756 SearchEngine.prototype.indexPage = function (page) {
3757 var text;
3758 this.amountOfMemory += page.rawData.length;
3759 if (this.amountOfMemory < MAX_SIZE_FILE_CHEERIO_PARSING) {
3760 var indexStartContent = page.rawData.indexOf('<!-- START CONTENT -->');
3761 var indexEndContent = page.rawData.indexOf('<!-- END CONTENT -->');
3762 var $ = cheerio.load(page.rawData.substring(indexStartContent + 1, indexEndContent));
3763 text = $('.content').html();
3764 text = Html.decode(text);
3765 text = text.replace(/(<([^>]+)>)/gi, '');
3766 page.url = page.url.replace(this.configuration.mainData.output, '');
3767 var doc = {
3768 url: page.url,
3769 title: page.infos.context + ' - ' + page.infos.name,
3770 body: text
3771 };
3772 if (!this.documentsStore.hasOwnProperty(doc.url) &&
3773 doc.body.length < MAX_SIZE_FILE_SEARCH_INDEX) {
3774 this.documentsStore[doc.url] = doc;
3775 this.searchDocuments.push(doc);
3776 }
3777 }
3778 };
3779 SearchEngine.prototype.generateSearchIndexJson = function (outputFolder) {
3780 var _this = this;
3781 var that = this;
3782 var searchIndex = lunr(function () {
3783 /* tslint:disable:no-invalid-this */
3784 this.ref('url');
3785 this.field('title');
3786 this.field('body');
3787 var i = 0;
3788 var len = that.searchDocuments.length;
3789 for (i; i < len; i++) {
3790 this.add(that.searchDocuments[i]);
3791 }
3792 });
3793 return this.fileEngine.get(__dirname + '/../src/templates/partials/search-index.hbs').then(function (data) {
3794 var template = Handlebars.compile(data);
3795 var result = template({
3796 index: JSON.stringify(searchIndex),
3797 store: JSON.stringify(_this.documentsStore)
3798 });
3799 var testOutputDir = outputFolder.match(process.cwd());
3800 if (testOutputDir && testOutputDir.length > 0) {
3801 outputFolder = outputFolder.replace(process.cwd() + path.sep, '');
3802 }
3803 return _this.fileEngine
3804 .write(outputFolder + path.sep + '/js/search/search_index.js', result)
3805 .catch(function (err) {
3806 logger.error('Error during search index file generation ', err);
3807 return Promise.reject(err);
3808 });
3809 }, function (err) { return Promise.reject('Error during search index generation'); });
3810 };
3811 return SearchEngine;
3812}());
3813
3814var traverse$1 = require('traverse');
3815var ExportJsonEngine = /** @class */ (function () {
3816 function ExportJsonEngine(configuration, dependenciesEngine, fileEngine) {
3817 if (fileEngine === void 0) { fileEngine = new FileEngine(); }
3818 this.configuration = configuration;
3819 this.dependenciesEngine = dependenciesEngine;
3820 this.fileEngine = fileEngine;
3821 }
3822 ExportJsonEngine.prototype.export = function (outputFolder, data) {
3823 var exportData = {};
3824 traverse$1(data).forEach(function (node) {
3825 if (node) {
3826 if (node.parent)
3827 delete node.parent;
3828 if (node.initializer)
3829 delete node.initializer;
3830 }
3831 });
3832 exportData.pipes = data.pipes;
3833 exportData.interfaces = data.interfaces;
3834 exportData.injectables = data.injectables;
3835 exportData.classes = data.classes;
3836 exportData.directives = data.directives;
3837 exportData.components = data.components;
3838 exportData.modules = this.processModules();
3839 exportData.miscellaneous = data.miscellaneous;
3840 exportData.routes = data.routes;
3841 exportData.coverage = data.coverageData;
3842 return this.fileEngine
3843 .write(outputFolder + path.sep + '/documentation.json', JSON.stringify(exportData, null, 4))
3844 .catch(function (err) {
3845 logger.error('Error during export file generation ', err);
3846 return Promise.reject(err);
3847 });
3848 };
3849 ExportJsonEngine.prototype.processModules = function () {
3850 var modules = this.dependenciesEngine.getModules();
3851 var _resultedModules = [];
3852 for (var moduleNr = 0; moduleNr < modules.length; moduleNr++) {
3853 var moduleElement = {
3854 name: modules[moduleNr].name,
3855 children: [
3856 {
3857 type: 'providers',
3858 elements: []
3859 },
3860 {
3861 type: 'declarations',
3862 elements: []
3863 },
3864 {
3865 type: 'imports',
3866 elements: []
3867 },
3868 {
3869 type: 'exports',
3870 elements: []
3871 },
3872 {
3873 type: 'bootstrap',
3874 elements: []
3875 },
3876 {
3877 type: 'classes',
3878 elements: []
3879 }
3880 ]
3881 };
3882 for (var k = 0; k < modules[moduleNr].providers.length; k++) {
3883 var providerElement = {
3884 name: modules[moduleNr].providers[k].name
3885 };
3886 moduleElement.children[0].elements.push(providerElement);
3887 }
3888 for (var k = 0; k < modules[moduleNr].declarations.length; k++) {
3889 var declarationElement = {
3890 name: modules[moduleNr].declarations[k].name
3891 };
3892 moduleElement.children[1].elements.push(declarationElement);
3893 }
3894 for (var k = 0; k < modules[moduleNr].imports.length; k++) {
3895 var importElement = {
3896 name: modules[moduleNr].imports[k].name
3897 };
3898 moduleElement.children[2].elements.push(importElement);
3899 }
3900 for (var k = 0; k < modules[moduleNr].exports.length; k++) {
3901 var exportElement = {
3902 name: modules[moduleNr].exports[k].name
3903 };
3904 moduleElement.children[3].elements.push(exportElement);
3905 }
3906 for (var k = 0; k < modules[moduleNr].bootstrap.length; k++) {
3907 var bootstrapElement = {
3908 name: modules[moduleNr].bootstrap[k].name
3909 };
3910 moduleElement.children[4].elements.push(bootstrapElement);
3911 }
3912 _resultedModules.push(moduleElement);
3913 }
3914 return _resultedModules;
3915 };
3916 return ExportJsonEngine;
3917}());
3918
3919var ExportEngine = /** @class */ (function () {
3920 function ExportEngine(configuration, dependenciesEngine, fileEngine) {
3921 if (fileEngine === void 0) { fileEngine = new FileEngine(); }
3922 this.configuration = configuration;
3923 this.dependenciesEngine = dependenciesEngine;
3924 this.fileEngine = fileEngine;
3925 }
3926 ExportEngine.prototype.export = function (outputFolder, data) {
3927 switch (this.configuration.mainData.exportFormat) {
3928 case 'json':
3929 this._engine = new ExportJsonEngine(this.configuration, this.dependenciesEngine, this.fileEngine);
3930 return this._engine.export(outputFolder, data);
3931 }
3932 };
3933 return ExportEngine;
3934}());
3935
3936var $ = require('cheerio');
3937var ComponentsTreeEngine = /** @class */ (function () {
3938 function ComponentsTreeEngine(fileEngine) {
3939 if (fileEngine === void 0) { fileEngine = new FileEngine(); }
3940 this.fileEngine = fileEngine;
3941 this.components = [];
3942 this.componentsForTree = [];
3943 if (ComponentsTreeEngine._instance) {
3944 throw new Error('Error: Instantiation failed: Use ComponentsTreeEngine.getInstance() instead of new.');
3945 }
3946 ComponentsTreeEngine._instance = this;
3947 }
3948 ComponentsTreeEngine.getInstance = function () {
3949 return ComponentsTreeEngine._instance;
3950 };
3951 ComponentsTreeEngine.prototype.addComponent = function (component) {
3952 this.components.push(component);
3953 };
3954 ComponentsTreeEngine.prototype.readTemplates = function () {
3955 var _this = this;
3956 return new Promise(function (resolve, reject) {
3957 var i = 0;
3958 var len = _this.componentsForTree.length;
3959 var loop = function () {
3960 if (i <= len - 1) {
3961 if (_this.componentsForTree[i].templateUrl) {
3962 var filePath = process.cwd() + path.sep + path.dirname(_this.componentsForTree[i].file) + path.sep + _this.componentsForTree[i].templateUrl;
3963 _this.fileEngine.get(filePath)
3964 .then(function (templateData) {
3965 _this.componentsForTree[i].templateData = templateData;
3966 i++;
3967 loop();
3968 }, function (e) {
3969 logger.error(e);
3970 reject();
3971 });
3972 }
3973 else {
3974 _this.componentsForTree[i].templateData = _this.componentsForTree[i].template;
3975 i++;
3976 loop();
3977 }
3978 }
3979 else {
3980 resolve();
3981 }
3982 };
3983 loop();
3984 });
3985 };
3986 ComponentsTreeEngine.prototype.findChildrenAndParents = function () {
3987 var _this = this;
3988 return new Promise(function (resolve, reject) {
3989 _.forEach(_this.componentsForTree, function (component) {
3990 var $component = $(component.templateData);
3991 _.forEach(_this.componentsForTree, function (componentToFind) {
3992 if ($component.find(componentToFind.selector).length > 0) {
3993 console.log(componentToFind.name + ' found in ' + component.name);
3994 component.children.push(componentToFind.name);
3995 }
3996 });
3997 });
3998 resolve();
3999 });
4000 };
4001 ComponentsTreeEngine.prototype.createTreesForComponents = function () {
4002 var _this = this;
4003 return new Promise(function (resolve, reject) {
4004 _.forEach(_this.components, function (component) {
4005 var _component = {
4006 name: component.name,
4007 file: component.file,
4008 selector: component.selector,
4009 children: [],
4010 template: '',
4011 templateUrl: ''
4012 };
4013 if (typeof component.template !== 'undefined') {
4014 _component.template = component.template;
4015 }
4016 if (component.templateUrl.length > 0) {
4017 _component.templateUrl = component.templateUrl[0];
4018 }
4019 _this.componentsForTree.push(_component);
4020 });
4021 _this.readTemplates()
4022 .then(function () {
4023 _this.findChildrenAndParents()
4024 .then(function () {
4025 console.log('this.componentsForTree: ', _this.componentsForTree);
4026 resolve();
4027 }, function (e) {
4028 logger.error(e);
4029 reject();
4030 });
4031 }, function (e) {
4032 logger.error(e);
4033 });
4034 });
4035 };
4036 ComponentsTreeEngine._instance = new ComponentsTreeEngine();
4037 return ComponentsTreeEngine;
4038}());
4039var $componentsTreeEngine = ComponentsTreeEngine.getInstance();
4040
4041var crypto = require('crypto');
4042var marked$2 = require('marked');
4043var ClassHelper = /** @class */ (function () {
4044 function ClassHelper(typeChecker, configuration) {
4045 this.typeChecker = typeChecker;
4046 this.configuration = configuration;
4047 this.jsdocParserUtil = new JsdocParserUtil();
4048 this.importsUtil = new ImportsUtil();
4049 }
4050 /**
4051 * HELPERS
4052 */
4053 ClassHelper.prototype.stringifyDefaultValue = function (node) {
4054 /**
4055 * Copyright https://github.com/ng-bootstrap/ng-bootstrap
4056 */
4057 if (node.getText()) {
4058 return node.getText();
4059 }
4060 else if (node.kind === Ast.SyntaxKind.FalseKeyword) {
4061 return 'false';
4062 }
4063 else if (node.kind === Ast.SyntaxKind.TrueKeyword) {
4064 return 'true';
4065 }
4066 };
4067 ClassHelper.prototype.getDecoratorOfType = function (node, decoratorType) {
4068 var decorators = node.decorators || [];
4069 for (var i = 0; i < decorators.length; i++) {
4070 if (decorators[i].expression.expression) {
4071 if (decorators[i].expression.expression.text === decoratorType) {
4072 return decorators[i];
4073 }
4074 }
4075 }
4076 return undefined;
4077 };
4078 ClassHelper.prototype.formatDecorators = function (decorators) {
4079 var _decorators = [];
4080 _.forEach(decorators, function (decorator) {
4081 if (decorator.expression) {
4082 if (decorator.expression.text) {
4083 _decorators.push({
4084 name: decorator.expression.text
4085 });
4086 }
4087 if (decorator.expression.expression) {
4088 var info = {
4089 name: decorator.expression.expression.text
4090 };
4091 if (decorator.expression.expression.arguments) {
4092 if (decorator.expression.expression.arguments.length > 0) {
4093 info.args = decorator.expression.expression.arguments;
4094 }
4095 }
4096 _decorators.push(info);
4097 }
4098 }
4099 });
4100 return _decorators;
4101 };
4102 ClassHelper.prototype.getPosition = function (node, sourceFile) {
4103 var position;
4104 if (node.name && node.name.end) {
4105 position = Ast.ts.getLineAndCharacterOfPosition(sourceFile, node.name.end);
4106 }
4107 else {
4108 position = Ast.ts.getLineAndCharacterOfPosition(sourceFile, node.pos);
4109 }
4110 return position;
4111 };
4112 ClassHelper.prototype.addAccessor = function (accessors, nodeAccessor, sourceFile) {
4113 var nodeName = '';
4114 if (nodeAccessor.name) {
4115 nodeName = nodeAccessor.name.text;
4116 var jsdoctags = this.jsdocParserUtil.getJSDocs(nodeAccessor);
4117 if (!accessors[nodeName]) {
4118 accessors[nodeName] = {
4119 name: nodeName,
4120 setSignature: undefined,
4121 getSignature: undefined
4122 };
4123 }
4124 if (nodeAccessor.kind === Ast.SyntaxKind.SetAccessor) {
4125 var setSignature = {
4126 name: nodeName,
4127 type: 'void',
4128 args: nodeAccessor.parameters.map(function (param) {
4129 return {
4130 name: param.name.text,
4131 type: param.type ? kindToType(param.type.kind) : ''
4132 };
4133 }),
4134 returnType: nodeAccessor.type ? this.visitType(nodeAccessor.type) : 'void',
4135 line: this.getPosition(nodeAccessor, sourceFile).line + 1
4136 };
4137 if (nodeAccessor.jsDoc && nodeAccessor.jsDoc.length >= 1) {
4138 var comment = nodeAccessor.jsDoc[0].comment;
4139 if (typeof comment !== 'undefined') {
4140 setSignature.description = marked$2(comment);
4141 }
4142 }
4143 if (jsdoctags && jsdoctags.length >= 1) {
4144 if (jsdoctags[0].tags) {
4145 setSignature.jsdoctags = markedtags(jsdoctags[0].tags);
4146 }
4147 }
4148 if (setSignature.jsdoctags && setSignature.jsdoctags.length > 0) {
4149 setSignature.jsdoctags = mergeTagsAndArgs(setSignature.args, setSignature.jsdoctags);
4150 }
4151 else if (setSignature.args && setSignature.args.length > 0) {
4152 setSignature.jsdoctags = mergeTagsAndArgs(setSignature.args);
4153 }
4154 accessors[nodeName].setSignature = setSignature;
4155 }
4156 if (nodeAccessor.kind === Ast.SyntaxKind.GetAccessor) {
4157 var getSignature = {
4158 name: nodeName,
4159 type: nodeAccessor.type ? kindToType(nodeAccessor.type.kind) : '',
4160 returnType: nodeAccessor.type ? this.visitType(nodeAccessor.type) : '',
4161 line: this.getPosition(nodeAccessor, sourceFile).line + 1
4162 };
4163 if (nodeAccessor.jsDoc && nodeAccessor.jsDoc.length >= 1) {
4164 var comment = nodeAccessor.jsDoc[0].comment;
4165 if (typeof comment !== 'undefined') {
4166 getSignature.description = marked$2(comment);
4167 }
4168 }
4169 if (jsdoctags && jsdoctags.length >= 1) {
4170 if (jsdoctags[0].tags) {
4171 getSignature.jsdoctags = markedtags(jsdoctags[0].tags);
4172 }
4173 }
4174 accessors[nodeName].getSignature = getSignature;
4175 }
4176 }
4177 };
4178 ClassHelper.prototype.isDirectiveDecorator = function (decorator) {
4179 if (decorator.expression.expression) {
4180 var decoratorIdentifierText = decorator.expression.expression.text;
4181 return (decoratorIdentifierText === 'Directive' || decoratorIdentifierText === 'Component');
4182 }
4183 else {
4184 return false;
4185 }
4186 };
4187 ClassHelper.prototype.isServiceDecorator = function (decorator) {
4188 return decorator.expression.expression
4189 ? decorator.expression.expression.text === 'Injectable'
4190 : false;
4191 };
4192 ClassHelper.prototype.isPrivate = function (member) {
4193 /**
4194 * Copyright https://github.com/ng-bootstrap/ng-bootstrap
4195 */
4196 if (member.modifiers) {
4197 var isPrivate = member.modifiers.some(function (modifier) { return modifier.kind === Ast.SyntaxKind.PrivateKeyword; });
4198 if (isPrivate) {
4199 return true;
4200 }
4201 }
4202 return this.isHiddenMember(member);
4203 };
4204 ClassHelper.prototype.isProtected = function (member) {
4205 if (member.modifiers) {
4206 var isProtected = member.modifiers.some(function (modifier) { return modifier.kind === Ast.SyntaxKind.ProtectedKeyword; });
4207 if (isProtected) {
4208 return true;
4209 }
4210 }
4211 return this.isHiddenMember(member);
4212 };
4213 ClassHelper.prototype.isInternal = function (member) {
4214 /**
4215 * Copyright https://github.com/ng-bootstrap/ng-bootstrap
4216 */
4217 var internalTags = ['internal'];
4218 if (member.jsDoc) {
4219 for (var _i = 0, _a = member.jsDoc; _i < _a.length; _i++) {
4220 var doc = _a[_i];
4221 if (doc.tags) {
4222 for (var _b = 0, _c = doc.tags; _b < _c.length; _b++) {
4223 var tag = _c[_b];
4224 if (internalTags.indexOf(tag.tagName.text) > -1) {
4225 return true;
4226 }
4227 }
4228 }
4229 }
4230 }
4231 return false;
4232 };
4233 ClassHelper.prototype.isPublic = function (member) {
4234 if (member.modifiers) {
4235 var isPublic = member.modifiers.some(function (modifier) { return modifier.kind === Ast.SyntaxKind.PublicKeyword; });
4236 if (isPublic) {
4237 return true;
4238 }
4239 }
4240 return this.isHiddenMember(member);
4241 };
4242 ClassHelper.prototype.isHiddenMember = function (member) {
4243 /**
4244 * Copyright https://github.com/ng-bootstrap/ng-bootstrap
4245 */
4246 var internalTags = ['hidden'];
4247 if (member.jsDoc) {
4248 for (var _i = 0, _a = member.jsDoc; _i < _a.length; _i++) {
4249 var doc = _a[_i];
4250 if (doc.tags) {
4251 for (var _b = 0, _c = doc.tags; _b < _c.length; _b++) {
4252 var tag = _c[_b];
4253 if (internalTags.indexOf(tag.tagName.text) > -1) {
4254 return true;
4255 }
4256 }
4257 }
4258 }
4259 }
4260 return false;
4261 };
4262 ClassHelper.prototype.isPipeDecorator = function (decorator) {
4263 return decorator.expression.expression
4264 ? decorator.expression.expression.text === 'Pipe'
4265 : false;
4266 };
4267 ClassHelper.prototype.isModuleDecorator = function (decorator) {
4268 return decorator.expression.expression
4269 ? decorator.expression.expression.text === 'NgModule'
4270 : false;
4271 };
4272 /**
4273 * VISITERS
4274 */
4275 ClassHelper.prototype.visitClassDeclaration = function (fileName, classDeclaration, sourceFile) {
4276 var symbol = this.typeChecker.getSymbolAtLocation(classDeclaration.name);
4277 var description = '';
4278 if (symbol) {
4279 description = marked$2(this.jsdocParserUtil.getMainCommentOfNode(classDeclaration));
4280 if (symbol.valueDeclaration && isIgnore(symbol.valueDeclaration)) {
4281 return [
4282 {
4283 ignore: true
4284 }
4285 ];
4286 }
4287 if (symbol.declarations && symbol.declarations.length > 0) {
4288 if (isIgnore(symbol.declarations[0])) {
4289 return [
4290 {
4291 ignore: true
4292 }
4293 ];
4294 }
4295 }
4296 }
4297 var className = classDeclaration.name.text;
4298 var members;
4299 var implementsElements = [];
4300 var extendsElement;
4301 var jsdoctags = [];
4302 if (typeof Ast.ts.getClassImplementsHeritageClauseElements !== 'undefined') {
4303 var implementedTypes = Ast.ts.getClassImplementsHeritageClauseElements(classDeclaration);
4304 if (implementedTypes) {
4305 var i = 0;
4306 var len = implementedTypes.length;
4307 for (i; i < len; i++) {
4308 if (implementedTypes[i].expression) {
4309 implementsElements.push(implementedTypes[i].expression.text);
4310 }
4311 }
4312 }
4313 }
4314 if (typeof Ast.ts.getClassExtendsHeritageClauseElement !== 'undefined') {
4315 var extendsTypes = Ast.ts.getClassExtendsHeritageClauseElement(classDeclaration);
4316 if (extendsTypes) {
4317 if (extendsTypes.expression) {
4318 extendsElement = extendsTypes.expression.text;
4319 }
4320 }
4321 }
4322 if (symbol) {
4323 if (symbol.valueDeclaration) {
4324 jsdoctags = this.jsdocParserUtil.getJSDocs(symbol.valueDeclaration);
4325 }
4326 }
4327 members = this.visitMembers(classDeclaration.members, sourceFile);
4328 if (classDeclaration.decorators) {
4329 for (var i = 0; i < classDeclaration.decorators.length; i++) {
4330 if (this.isDirectiveDecorator(classDeclaration.decorators[i])) {
4331 return {
4332 description: description,
4333 inputs: members.inputs,
4334 outputs: members.outputs,
4335 hostBindings: members.hostBindings,
4336 hostListeners: members.hostListeners,
4337 properties: members.properties,
4338 methods: members.methods,
4339 indexSignatures: members.indexSignatures,
4340 kind: members.kind,
4341 constructor: members.constructor,
4342 jsdoctags: jsdoctags,
4343 extends: extendsElement,
4344 implements: implementsElements,
4345 accessors: members.accessors
4346 };
4347 }
4348 else if (this.isServiceDecorator(classDeclaration.decorators[i])) {
4349 return [
4350 {
4351 fileName: fileName,
4352 className: className,
4353 description: description,
4354 methods: members.methods,
4355 indexSignatures: members.indexSignatures,
4356 properties: members.properties,
4357 kind: members.kind,
4358 constructor: members.constructor,
4359 jsdoctags: jsdoctags,
4360 extends: extendsElement,
4361 implements: implementsElements,
4362 accessors: members.accessors
4363 }
4364 ];
4365 }
4366 else if (this.isPipeDecorator(classDeclaration.decorators[i])) {
4367 return [
4368 {
4369 fileName: fileName,
4370 className: className,
4371 description: description,
4372 jsdoctags: jsdoctags,
4373 properties: members.properties,
4374 methods: members.methods
4375 }
4376 ];
4377 }
4378 else if (this.isModuleDecorator(classDeclaration.decorators[i])) {
4379 return [
4380 {
4381 fileName: fileName,
4382 className: className,
4383 description: description,
4384 jsdoctags: jsdoctags
4385 }
4386 ];
4387 }
4388 else {
4389 return [
4390 {
4391 description: description,
4392 methods: members.methods,
4393 indexSignatures: members.indexSignatures,
4394 properties: members.properties,
4395 kind: members.kind,
4396 constructor: members.constructor,
4397 jsdoctags: jsdoctags,
4398 extends: extendsElement,
4399 implements: implementsElements,
4400 accessors: members.accessors
4401 }
4402 ];
4403 }
4404 }
4405 }
4406 else if (description) {
4407 return [
4408 {
4409 description: description,
4410 inputs: members.inputs,
4411 outputs: members.outputs,
4412 hostBindings: members.hostBindings,
4413 hostListeners: members.hostListeners,
4414 methods: members.methods,
4415 indexSignatures: members.indexSignatures,
4416 properties: members.properties,
4417 kind: members.kind,
4418 constructor: members.constructor,
4419 jsdoctags: jsdoctags,
4420 extends: extendsElement,
4421 implements: implementsElements,
4422 accessors: members.accessors
4423 }
4424 ];
4425 }
4426 else {
4427 return [
4428 {
4429 methods: members.methods,
4430 inputs: members.inputs,
4431 outputs: members.outputs,
4432 hostBindings: members.hostBindings,
4433 hostListeners: members.hostListeners,
4434 indexSignatures: members.indexSignatures,
4435 properties: members.properties,
4436 kind: members.kind,
4437 constructor: members.constructor,
4438 jsdoctags: jsdoctags,
4439 extends: extendsElement,
4440 implements: implementsElements,
4441 accessors: members.accessors
4442 }
4443 ];
4444 }
4445 return [];
4446 };
4447 ClassHelper.prototype.visitMembers = function (members, sourceFile) {
4448 /**
4449 * Copyright https://github.com/ng-bootstrap/ng-bootstrap
4450 */
4451 var inputs = [];
4452 var outputs = [];
4453 var hostBindings = [];
4454 var hostListeners = [];
4455 var methods = [];
4456 var properties = [];
4457 var indexSignatures = [];
4458 var kind;
4459 var inputDecorator;
4460 var hostBinding;
4461 var hostListener;
4462 var constructor;
4463 var outDecorator;
4464 var accessors = {};
4465 var result = {};
4466 for (var i = 0; i < members.length; i++) {
4467 // Allows typescript guess type when using ts.is*
4468 var member = members[i];
4469 inputDecorator = this.getDecoratorOfType(member, 'Input');
4470 outDecorator = this.getDecoratorOfType(member, 'Output');
4471 hostBinding = this.getDecoratorOfType(member, 'HostBinding');
4472 hostListener = this.getDecoratorOfType(member, 'HostListener');
4473 kind = member.kind;
4474 if (isIgnore(member)) {
4475 continue;
4476 }
4477 if (inputDecorator) {
4478 inputs.push(this.visitInputAndHostBinding(member, inputDecorator, sourceFile));
4479 if (Ast.ts.isSetAccessorDeclaration(member)) {
4480 this.addAccessor(accessors, members[i], sourceFile);
4481 }
4482 }
4483 else if (outDecorator) {
4484 outputs.push(this.visitOutput(member, outDecorator, sourceFile));
4485 }
4486 else if (hostBinding) {
4487 hostBindings.push(this.visitInputAndHostBinding(member, hostBinding, sourceFile));
4488 }
4489 else if (hostListener) {
4490 hostListeners.push(this.visitHostListener(member, hostListener, sourceFile));
4491 }
4492 else if (!this.isHiddenMember(member)) {
4493 if (!(this.isPrivate(member) && this.configuration.mainData.disablePrivate)) {
4494 if (!(this.isInternal(member) && this.configuration.mainData.disableInternal)) {
4495 if (!(this.isProtected(member) &&
4496 this.configuration.mainData.disableProtected)) {
4497 if (Ast.ts.isMethodDeclaration(member) || Ast.ts.isMethodSignature(member)) {
4498 methods.push(this.visitMethodDeclaration(member, sourceFile));
4499 }
4500 else if (Ast.ts.isPropertyDeclaration(member) ||
4501 Ast.ts.isPropertySignature(member)) {
4502 properties.push(this.visitProperty(member, sourceFile));
4503 }
4504 else if (Ast.ts.isCallSignatureDeclaration(member)) {
4505 properties.push(this.visitCallDeclaration(member, sourceFile));
4506 }
4507 else if (Ast.ts.isGetAccessorDeclaration(member) ||
4508 Ast.ts.isSetAccessorDeclaration(member)) {
4509 this.addAccessor(accessors, members[i], sourceFile);
4510 }
4511 else if (Ast.ts.isIndexSignatureDeclaration(member)) {
4512 indexSignatures.push(this.visitIndexDeclaration(member, sourceFile));
4513 }
4514 else if (Ast.ts.isConstructorDeclaration(member)) {
4515 var _constructorProperties = this.visitConstructorProperties(member, sourceFile);
4516 var j = 0;
4517 var len = _constructorProperties.length;
4518 for (j; j < len; j++) {
4519 properties.push(_constructorProperties[j]);
4520 }
4521 constructor = this.visitConstructorDeclaration(member, sourceFile);
4522 }
4523 }
4524 }
4525 }
4526 }
4527 }
4528 inputs.sort(getNamesCompareFn());
4529 outputs.sort(getNamesCompareFn());
4530 hostBindings.sort(getNamesCompareFn());
4531 hostListeners.sort(getNamesCompareFn());
4532 properties.sort(getNamesCompareFn());
4533 methods.sort(getNamesCompareFn());
4534 indexSignatures.sort(getNamesCompareFn());
4535 result = {
4536 inputs: inputs,
4537 outputs: outputs,
4538 hostBindings: hostBindings,
4539 hostListeners: hostListeners,
4540 methods: methods,
4541 properties: properties,
4542 indexSignatures: indexSignatures,
4543 kind: kind,
4544 constructor: constructor
4545 };
4546 if (Object.keys(accessors).length) {
4547 result['accessors'] = accessors;
4548 }
4549 return result;
4550 };
4551 ClassHelper.prototype.visitTypeName = function (typeName) {
4552 if (typeName.text) {
4553 return typeName.text;
4554 }
4555 return this.visitTypeName(typeName.left) + "." + this.visitTypeName(typeName.right);
4556 };
4557 ClassHelper.prototype.visitType = function (node) {
4558 var _return = 'void';
4559 if (!node) {
4560 return _return;
4561 }
4562 if (node.typeName) {
4563 _return = this.visitTypeName(node.typeName);
4564 }
4565 else if (node.type) {
4566 if (node.type.kind) {
4567 _return = kindToType(node.type.kind);
4568 }
4569 if (node.type.typeName) {
4570 _return = this.visitTypeName(node.type.typeName);
4571 }
4572 if (node.type.typeArguments) {
4573 _return += '<';
4574 var typeArguments = [];
4575 for (var _i = 0, _a = node.type.typeArguments; _i < _a.length; _i++) {
4576 var argument = _a[_i];
4577 typeArguments.push(this.visitType(argument));
4578 }
4579 _return += typeArguments.join(' | ');
4580 _return += '>';
4581 }
4582 if (node.type.elementType) {
4583 var _firstPart = this.visitType(node.type.elementType);
4584 _return = _firstPart + kindToType(node.type.kind);
4585 if (node.type.elementType.kind === Ast.SyntaxKind.ParenthesizedType) {
4586 _return = '(' + _firstPart + ')' + kindToType(node.type.kind);
4587 }
4588 }
4589 if (node.type.types && Ast.ts.isUnionTypeNode(node.type)) {
4590 _return = '';
4591 var i = 0;
4592 var len = node.type.types.length;
4593 for (i; i < len; i++) {
4594 var type = node.type.types[i];
4595 if (type.elementType) {
4596 var _firstPart = this.visitType(type.elementType);
4597 if (type.elementType.kind === Ast.SyntaxKind.ParenthesizedType) {
4598 _return += '(' + _firstPart + ')' + kindToType(type.kind);
4599 }
4600 else {
4601 _return += _firstPart + kindToType(type.kind);
4602 }
4603 }
4604 else {
4605 _return += kindToType(type.kind);
4606 if (Ast.ts.isLiteralTypeNode(type) && type.literal) {
4607 _return += '"' + type.literal.text + '"';
4608 }
4609 if (type.typeName) {
4610 _return += this.visitTypeName(type.typeName);
4611 }
4612 if (type.typeArguments) {
4613 _return += '<';
4614 var typeArguments = [];
4615 for (var _b = 0, _c = type.typeArguments; _b < _c.length; _b++) {
4616 var argument = _c[_b];
4617 typeArguments.push(this.visitType(argument));
4618 }
4619 _return += typeArguments.join(' | ');
4620 _return += '>';
4621 }
4622 }
4623 if (i < len - 1) {
4624 _return += ' | ';
4625 }
4626 }
4627 }
4628 if (node.type.elementTypes) {
4629 var elementTypes = node.type.elementTypes;
4630 var i = 0;
4631 var len = elementTypes.length;
4632 if (len > 0) {
4633 _return = '[';
4634 for (i; i < len; i++) {
4635 var type = elementTypes[i];
4636 _return += kindToType(type.kind);
4637 if (Ast.ts.isLiteralTypeNode(type) && type.literal) {
4638 _return += '"' + type.literal.text + '"';
4639 }
4640 if (type.typeName) {
4641 _return += this.visitTypeName(type.typeName);
4642 }
4643 if (i < len - 1) {
4644 _return += ', ';
4645 }
4646 }
4647 _return += ']';
4648 }
4649 }
4650 }
4651 else if (node.elementType) {
4652 _return = kindToType(node.elementType.kind) + kindToType(node.kind);
4653 if (node.elementType.typeName) {
4654 _return = this.visitTypeName(node.elementType.typeName) + kindToType(node.kind);
4655 }
4656 }
4657 else if (node.types && Ast.ts.isUnionTypeNode(node)) {
4658 _return = '';
4659 var i = 0;
4660 var len = node.types.length;
4661 for (i; i < len; i++) {
4662 var type = node.types[i];
4663 _return += kindToType(type.kind);
4664 if (Ast.ts.isLiteralTypeNode(type) && type.literal) {
4665 _return += '"' + type.literal.text + '"';
4666 }
4667 if (type.typeName) {
4668 _return += this.visitTypeName(type.typeName);
4669 }
4670 if (i < len - 1) {
4671 _return += ' | ';
4672 }
4673 }
4674 }
4675 else if (node.dotDotDotToken) {
4676 _return = 'any[]';
4677 }
4678 else {
4679 _return = kindToType(node.kind);
4680 if (_return === '' &&
4681 node.initializer &&
4682 node.initializer.kind &&
4683 (node.kind === Ast.SyntaxKind.PropertyDeclaration || node.kind === Ast.SyntaxKind.Parameter)) {
4684 _return = kindToType(node.initializer.kind);
4685 }
4686 if (node.kind === Ast.SyntaxKind.TypeParameter) {
4687 _return = node.name.text;
4688 }
4689 }
4690 if (node.typeArguments && node.typeArguments.length > 0) {
4691 _return += '<';
4692 var i = 0, len = node.typeArguments.length;
4693 for (i; i < len; i++) {
4694 var argument = node.typeArguments[i];
4695 _return += this.visitType(argument);
4696 if (i >= 0 && i < len - 1) {
4697 _return += ', ';
4698 }
4699 }
4700 _return += '>';
4701 }
4702 return _return;
4703 };
4704 ClassHelper.prototype.visitCallDeclaration = function (method, sourceFile) {
4705 var _this = this;
4706 var sourceCode = sourceFile.getText();
4707 var hash = crypto
4708 .createHash('md5')
4709 .update(sourceCode)
4710 .digest('hex');
4711 var result = {
4712 id: 'call-declaration-' + hash,
4713 args: method.parameters ? method.parameters.map(function (prop) { return _this.visitArgument(prop); }) : [],
4714 returnType: this.visitType(method.type),
4715 line: this.getPosition(method, sourceFile).line + 1
4716 };
4717 if (method.jsDoc) {
4718 result.description = marked$2(marked$2(this.jsdocParserUtil.getMainCommentOfNode(method)));
4719 }
4720 var jsdoctags = this.jsdocParserUtil.getJSDocs(method);
4721 if (jsdoctags && jsdoctags.length >= 1) {
4722 if (jsdoctags[0].tags) {
4723 result.jsdoctags = markedtags(jsdoctags[0].tags);
4724 }
4725 }
4726 return result;
4727 };
4728 ClassHelper.prototype.visitIndexDeclaration = function (method, sourceFile) {
4729 var _this = this;
4730 var sourceCode = sourceFile.getText();
4731 var hash = crypto
4732 .createHash('md5')
4733 .update(sourceCode)
4734 .digest('hex');
4735 var result = {
4736 id: 'index-declaration-' + hash,
4737 args: method.parameters ? method.parameters.map(function (prop) { return _this.visitArgument(prop); }) : [],
4738 returnType: this.visitType(method.type),
4739 line: this.getPosition(method, sourceFile).line + 1
4740 };
4741 if (method.jsDoc) {
4742 result.description = marked$2(this.jsdocParserUtil.getMainCommentOfNode(method));
4743 }
4744 return result;
4745 };
4746 ClassHelper.prototype.visitConstructorDeclaration = function (method, sourceFile) {
4747 var _this = this;
4748 /**
4749 * Copyright https://github.com/ng-bootstrap/ng-bootstrap
4750 */
4751 var result = {
4752 name: 'constructor',
4753 description: '',
4754 args: method.parameters ? method.parameters.map(function (prop) { return _this.visitArgument(prop); }) : [],
4755 line: this.getPosition(method, sourceFile).line + 1
4756 };
4757 var jsdoctags = this.jsdocParserUtil.getJSDocs(method);
4758 if (method.jsDoc) {
4759 result.description = marked$2(this.jsdocParserUtil.getMainCommentOfNode(method));
4760 }
4761 if (method.modifiers) {
4762 if (method.modifiers.length > 0) {
4763 var kinds = method.modifiers.map(function (modifier) {
4764 return modifier.kind;
4765 });
4766 if (_.indexOf(kinds, Ast.SyntaxKind.PublicKeyword) !== -1 &&
4767 _.indexOf(kinds, Ast.SyntaxKind.StaticKeyword) !== -1) {
4768 kinds = kinds.filter(function (kind) { return kind !== Ast.SyntaxKind.PublicKeyword; });
4769 }
4770 result.modifierKind = kinds;
4771 }
4772 }
4773 if (jsdoctags && jsdoctags.length >= 1) {
4774 if (jsdoctags[0].tags) {
4775 result.jsdoctags = markedtags(jsdoctags[0].tags);
4776 }
4777 }
4778 if (result.jsdoctags && result.jsdoctags.length > 0) {
4779 result.jsdoctags = mergeTagsAndArgs(result.args, result.jsdoctags);
4780 }
4781 else if (result.args.length > 0) {
4782 result.jsdoctags = mergeTagsAndArgs(result.args);
4783 }
4784 return result;
4785 };
4786 ClassHelper.prototype.visitProperty = function (property, sourceFile) {
4787 var result = {
4788 name: property.name.text,
4789 defaultValue: property.initializer
4790 ? this.stringifyDefaultValue(property.initializer)
4791 : undefined,
4792 type: this.visitType(property),
4793 optional: typeof property.questionToken !== 'undefined',
4794 description: '',
4795 line: this.getPosition(property, sourceFile).line + 1
4796 };
4797 var jsdoctags;
4798 if (typeof result.name === 'undefined' && typeof property.name.expression !== 'undefined') {
4799 result.name = property.name.expression.text;
4800 }
4801 if (property.jsDoc) {
4802 jsdoctags = this.jsdocParserUtil.getJSDocs(property);
4803 result.description = marked$2(this.jsdocParserUtil.getMainCommentOfNode(property));
4804 }
4805 if (property.decorators) {
4806 result.decorators = this.formatDecorators(property.decorators);
4807 }
4808 if (property.modifiers) {
4809 if (property.modifiers.length > 0) {
4810 var kinds = property.modifiers.map(function (modifier) {
4811 return modifier.kind;
4812 });
4813 if (_.indexOf(kinds, Ast.SyntaxKind.PublicKeyword) !== -1 &&
4814 _.indexOf(kinds, Ast.SyntaxKind.StaticKeyword) !== -1) {
4815 kinds = kinds.filter(function (kind) { return kind !== Ast.SyntaxKind.PublicKeyword; });
4816 }
4817 result.modifierKind = kinds;
4818 }
4819 }
4820 if (jsdoctags && jsdoctags.length >= 1) {
4821 if (jsdoctags[0].tags) {
4822 result.jsdoctags = markedtags(jsdoctags[0].tags);
4823 }
4824 }
4825 return result;
4826 };
4827 ClassHelper.prototype.visitConstructorProperties = function (constr, sourceFile) {
4828 if (constr.parameters) {
4829 var _parameters_1 = [];
4830 var i = 0;
4831 var len = constr.parameters.length;
4832 for (i; i < len; i++) {
4833 if (this.isPublic(constr.parameters[i])) {
4834 _parameters_1.push(this.visitProperty(constr.parameters[i], sourceFile));
4835 }
4836 }
4837 /**
4838 * Merge JSDoc tags description from constructor with parameters
4839 */
4840 if (constr.jsDoc) {
4841 if (constr.jsDoc.length > 0) {
4842 var constrTags = constr.jsDoc[0].tags;
4843 if (constrTags && constrTags.length > 0) {
4844 constrTags.forEach(function (tag) {
4845 _parameters_1.forEach(function (param) {
4846 if (tag.tagName &&
4847 tag.tagName.escapedText &&
4848 tag.tagName.escapedText === 'param') {
4849 if (tag.name &&
4850 tag.name.escapedText &&
4851 tag.name.escapedText === param.name) {
4852 param.description = tag.comment;
4853 }
4854 }
4855 });
4856 });
4857 }
4858 }
4859 }
4860 return _parameters_1;
4861 }
4862 else {
4863 return [];
4864 }
4865 };
4866 ClassHelper.prototype.visitInputAndHostBinding = function (property, inDecorator, sourceFile) {
4867 var inArgs = inDecorator.expression.arguments;
4868 var _return = {};
4869 _return.name = inArgs.length > 0 ? inArgs[0].text : property.name.text;
4870 _return.defaultValue = property.initializer
4871 ? this.stringifyDefaultValue(property.initializer)
4872 : undefined;
4873 if (!_return.description) {
4874 if (property.jsDoc) {
4875 if (property.jsDoc.length > 0) {
4876 if (typeof property.jsDoc[0].comment !== 'undefined') {
4877 _return.description = marked$2(property.jsDoc[0].comment);
4878 }
4879 }
4880 }
4881 }
4882 _return.line = this.getPosition(property, sourceFile).line + 1;
4883 if (property.type) {
4884 _return.type = this.visitType(property);
4885 }
4886 else {
4887 // handle NewExpression
4888 if (property.initializer) {
4889 if (Ast.ts.isNewExpression(property.initializer)) {
4890 if (property.initializer.expression) {
4891 _return.type = property.initializer.expression.text;
4892 }
4893 }
4894 }
4895 }
4896 if (property.kind === Ast.SyntaxKind.SetAccessor) {
4897 // For setter accessor, find type in first parameter
4898 if (property.parameters && property.parameters.length === 1) {
4899 if (property.parameters[0].type) {
4900 _return.type = kindToType(property.parameters[0].type.kind);
4901 }
4902 }
4903 }
4904 return _return;
4905 };
4906 ClassHelper.prototype.visitMethodDeclaration = function (method, sourceFile) {
4907 var _this = this;
4908 var result = {
4909 name: method.name.text,
4910 args: method.parameters ? method.parameters.map(function (prop) { return _this.visitArgument(prop); }) : [],
4911 optional: typeof method.questionToken !== 'undefined',
4912 returnType: this.visitType(method.type),
4913 typeParameters: [],
4914 line: this.getPosition(method, sourceFile).line + 1
4915 };
4916 var jsdoctags = this.jsdocParserUtil.getJSDocs(method);
4917 if (typeof method.type === 'undefined') {
4918 // Try to get inferred type
4919 if (method.symbol) {
4920 var symbol = method.symbol;
4921 if (symbol.valueDeclaration) {
4922 var symbolType = this.typeChecker.getTypeOfSymbolAtLocation(symbol, symbol.valueDeclaration);
4923 if (symbolType) {
4924 try {
4925 var signature = this.typeChecker.getSignatureFromDeclaration(method);
4926 var returnType = signature.getReturnType();
4927 result.returnType = this.typeChecker.typeToString(returnType);
4928 // tslint:disable-next-line:no-empty
4929 }
4930 catch (error) { }
4931 }
4932 }
4933 }
4934 }
4935 if (method.typeParameters && method.typeParameters.length > 0) {
4936 result.typeParameters = method.typeParameters.map(function (typeParameter) {
4937 return _this.visitType(typeParameter);
4938 });
4939 }
4940 if (method.jsDoc) {
4941 result.description = marked$2(this.jsdocParserUtil.getMainCommentOfNode(method));
4942 }
4943 if (method.decorators) {
4944 result.decorators = this.formatDecorators(method.decorators);
4945 }
4946 if (method.modifiers) {
4947 if (method.modifiers.length > 0) {
4948 var kinds = method.modifiers.map(function (modifier) {
4949 return modifier.kind;
4950 });
4951 if (_.indexOf(kinds, Ast.SyntaxKind.PublicKeyword) !== -1 &&
4952 _.indexOf(kinds, Ast.SyntaxKind.StaticKeyword) !== -1) {
4953 kinds = kinds.filter(function (kind) { return kind !== Ast.SyntaxKind.PublicKeyword; });
4954 }
4955 result.modifierKind = kinds;
4956 }
4957 }
4958 if (jsdoctags && jsdoctags.length >= 1) {
4959 if (jsdoctags[0].tags) {
4960 result.jsdoctags = markedtags(jsdoctags[0].tags);
4961 }
4962 }
4963 if (result.jsdoctags && result.jsdoctags.length > 0) {
4964 result.jsdoctags = mergeTagsAndArgs(result.args, result.jsdoctags);
4965 }
4966 else if (result.args.length > 0) {
4967 result.jsdoctags = mergeTagsAndArgs(result.args);
4968 }
4969 return result;
4970 };
4971 ClassHelper.prototype.visitOutput = function (property, outDecorator, sourceFile) {
4972 var inArgs = outDecorator.expression.arguments;
4973 var _return = {
4974 name: inArgs.length > 0 ? inArgs[0].text : property.name.text,
4975 defaultValue: property.initializer
4976 ? this.stringifyDefaultValue(property.initializer)
4977 : undefined
4978 };
4979 if (property.jsDoc) {
4980 _return.description = marked$2(marked$2(this.jsdocParserUtil.getMainCommentOfNode(property)));
4981 }
4982 if (!_return.description) {
4983 if (property.jsDoc && property.jsDoc.length > 0) {
4984 if (typeof property.jsDoc[0].comment !== 'undefined') {
4985 _return.description = marked$2(property.jsDoc[0].comment);
4986 }
4987 }
4988 }
4989 _return.line = this.getPosition(property, sourceFile).line + 1;
4990 if (property.type) {
4991 _return.type = this.visitType(property);
4992 }
4993 else {
4994 // handle NewExpression
4995 if (property.initializer) {
4996 if (Ast.ts.isNewExpression(property.initializer)) {
4997 if (property.initializer.expression) {
4998 _return.type = property.initializer.expression.text;
4999 }
5000 }
5001 }
5002 }
5003 return _return;
5004 };
5005 ClassHelper.prototype.visitArgument = function (arg) {
5006 var _this = this;
5007 var _result = {
5008 name: arg.name.text,
5009 type: this.visitType(arg)
5010 };
5011 if (arg.dotDotDotToken) {
5012 _result.dotDotDotToken = true;
5013 }
5014 if (arg.questionToken) {
5015 _result.optional = true;
5016 }
5017 if (arg.type) {
5018 if (arg.type.kind) {
5019 if (Ast.ts.isFunctionTypeNode(arg.type)) {
5020 _result.function = arg.type.parameters
5021 ? arg.type.parameters.map(function (prop) { return _this.visitArgument(prop); })
5022 : [];
5023 }
5024 }
5025 }
5026 if (arg.initializer) {
5027 _result.defaultValue = this.stringifyDefaultValue(arg.initializer);
5028 }
5029 return _result;
5030 };
5031 ClassHelper.prototype.visitHostListener = function (property, hostListenerDecorator, sourceFile) {
5032 var _this = this;
5033 var inArgs = hostListenerDecorator.expression.arguments;
5034 var _return = {};
5035 _return.name = inArgs.length > 0 ? inArgs[0].text : property.name.text;
5036 _return.args = property.parameters
5037 ? property.parameters.map(function (prop) { return _this.visitArgument(prop); })
5038 : [];
5039 _return.argsDecorator =
5040 inArgs.length > 1
5041 ? inArgs[1].elements.map(function (prop) {
5042 return prop.text;
5043 })
5044 : [];
5045 if (property.jsDoc) {
5046 _return.description = marked$2(this.jsdocParserUtil.getMainCommentOfNode(property));
5047 }
5048 if (!_return.description) {
5049 if (property.jsDoc) {
5050 if (property.jsDoc.length > 0) {
5051 if (typeof property.jsDoc[0].comment !== 'undefined') {
5052 _return.description = marked$2(property.jsDoc[0].comment);
5053 }
5054 }
5055 }
5056 }
5057 _return.line = this.getPosition(property, sourceFile).line + 1;
5058 return _return;
5059 };
5060 return ClassHelper;
5061}());
5062
5063var TsPrinterUtil = /** @class */ (function () {
5064 function TsPrinterUtil() {
5065 this.printer = Ast.ts.createPrinter({
5066 newLine: Ast.ts.NewLineKind.LineFeed
5067 });
5068 }
5069 TsPrinterUtil.prototype.print = function (node) {
5070 return this.printer.printNode(Ast.ts.EmitHint.Unspecified, node, Ast.ts.createSourceFile('', '', Ast.ts.ScriptTarget.Latest));
5071 };
5072 return TsPrinterUtil;
5073}());
5074
5075var SymbolHelper = /** @class */ (function () {
5076 function SymbolHelper() {
5077 this.unknown = '???';
5078 this.importsUtil = new ImportsUtil();
5079 }
5080 SymbolHelper.prototype.parseDeepIndentifier = function (name, srcFile) {
5081 var result = {
5082 name: '',
5083 type: ''
5084 };
5085 if (typeof name === 'undefined') {
5086 return result;
5087 }
5088 var nsModule = name.split('.');
5089 var type = this.getType(name);
5090 if (nsModule.length > 1) {
5091 result.ns = nsModule[0];
5092 result.name = name;
5093 result.type = type;
5094 return result;
5095 }
5096 if (typeof srcFile !== 'undefined') {
5097 result.file = this.importsUtil.getFileNameOfImport(name, srcFile);
5098 }
5099 result.name = name;
5100 result.type = type;
5101 return result;
5102 };
5103 SymbolHelper.prototype.getType = function (name) {
5104 var type;
5105 if (name.toLowerCase().indexOf('component') !== -1) {
5106 type = 'component';
5107 }
5108 else if (name.toLowerCase().indexOf('pipe') !== -1) {
5109 type = 'pipe';
5110 }
5111 else if (name.toLowerCase().indexOf('controller') !== -1) {
5112 type = 'controller';
5113 }
5114 else if (name.toLowerCase().indexOf('module') !== -1) {
5115 type = 'module';
5116 }
5117 else if (name.toLowerCase().indexOf('directive') !== -1) {
5118 type = 'directive';
5119 }
5120 return type;
5121 };
5122 /**
5123 * Output
5124 * RouterModule.forRoot 179
5125 */
5126 SymbolHelper.prototype.buildIdentifierName = function (node, name) {
5127 if (Ast.ts.isIdentifier(node) && !Ast.ts.isPropertyAccessExpression(node)) {
5128 return node.text + "." + name;
5129 }
5130 name = name ? "." + name : '';
5131 var nodeName = this.unknown;
5132 if (node.name) {
5133 nodeName = node.name.text;
5134 }
5135 else if (node.text) {
5136 nodeName = node.text;
5137 }
5138 else if (node.expression) {
5139 if (node.expression.text) {
5140 nodeName = node.expression.text;
5141 }
5142 else if (node.expression.elements) {
5143 if (Ast.ts.isArrayLiteralExpression(node.expression)) {
5144 nodeName = node.expression.elements.map(function (el) { return el.text; }).join(', ');
5145 nodeName = "[" + nodeName + "]";
5146 }
5147 }
5148 }
5149 if (Ast.ts.isSpreadElement(node)) {
5150 return "..." + nodeName;
5151 }
5152 return "" + this.buildIdentifierName(node.expression, nodeName) + name;
5153 };
5154 /**
5155 * parse expressions such as:
5156 * { provide: APP_BASE_HREF, useValue: '/' }
5157 * { provide: 'Date', useFactory: (d1, d2) => new Date(), deps: ['d1', 'd2'] }
5158 */
5159 SymbolHelper.prototype.parseProviderConfiguration = function (node) {
5160 if (node.kind && node.kind === Ast.SyntaxKind.ObjectLiteralExpression) {
5161 // Search for provide: HTTP_INTERCEPTORS
5162 // and if true, return type: 'interceptor' + name
5163 var interceptorName_1, hasInterceptor_1;
5164 if (node.properties) {
5165 if (node.properties.length > 0) {
5166 _.forEach(node.properties, function (property) {
5167 if (property.kind && property.kind === Ast.SyntaxKind.PropertyAssignment) {
5168 if (property.name.text === 'provide') {
5169 if (property.initializer.text === 'HTTP_INTERCEPTORS') {
5170 hasInterceptor_1 = true;
5171 }
5172 }
5173 if (property.name.text === 'useClass' ||
5174 property.name.text === 'useExisting') {
5175 interceptorName_1 = property.initializer.text;
5176 }
5177 }
5178 });
5179 }
5180 }
5181 if (hasInterceptor_1) {
5182 return interceptorName_1;
5183 }
5184 else {
5185 return new TsPrinterUtil().print(node);
5186 }
5187 }
5188 else {
5189 return new TsPrinterUtil().print(node);
5190 }
5191 };
5192 /**
5193 * Kind
5194 * 181 CallExpression => "RouterModule.forRoot(args)"
5195 * 71 Identifier => "RouterModule" "TodoStore"
5196 * 9 StringLiteral => "./app.component.css" "./tab.scss"
5197 */
5198 SymbolHelper.prototype.parseSymbolElements = function (node) {
5199 // parse expressions such as: AngularFireModule.initializeApp(firebaseConfig)
5200 // if (ts.isCallExpression(node) && ts.isPropertyAccessExpression(node.expression)) {
5201 if ((Ast.ts.isCallExpression(node) && Ast.ts.isPropertyAccessExpression(node.expression)) ||
5202 (Ast.ts.isNewExpression(node) && Ast.ts.isElementAccessExpression(node.expression))) {
5203 var className = this.buildIdentifierName(node.expression);
5204 // function arguments could be really complex. There are so
5205 // many use cases that we can't handle. Just print "args" to indicate
5206 // that we have arguments.
5207 var functionArgs = node.arguments.length > 0 ? 'args' : '';
5208 var text = className + "(" + functionArgs + ")";
5209 return text;
5210 }
5211 else if (Ast.ts.isPropertyAccessExpression(node)) {
5212 // parse expressions such as: Shared.Module
5213 return this.buildIdentifierName(node);
5214 }
5215 else if (Ast.ts.isIdentifier(node)) {
5216 // parse expressions such as: MyComponent
5217 if (node.text) {
5218 return node.text;
5219 }
5220 if (node.escapedText) {
5221 return node.escapedText;
5222 }
5223 }
5224 else if (Ast.ts.isSpreadElement(node)) {
5225 // parse expressions such as: ...MYARRAY
5226 // Resolve MYARRAY in imports or local file variables after full scan, just return the name of the variable
5227 if (node.expression && node.expression.text) {
5228 return node.expression.text;
5229 }
5230 }
5231 return node.text ? node.text : this.parseProviderConfiguration(node);
5232 };
5233 /**
5234 * Kind
5235 * 177 ArrayLiteralExpression
5236 * 122 BooleanKeyword
5237 * 9 StringLiteral
5238 */
5239 SymbolHelper.prototype.parseSymbols = function (node, srcFile) {
5240 var _this = this;
5241 var localNode = node;
5242 if (Ast.ts.isShorthandPropertyAssignment(localNode)) {
5243 localNode = this.importsUtil.findValueInImportOrLocalVariables(node.name.text, srcFile);
5244 }
5245 if (Ast.ts.isArrayLiteralExpression(localNode.initializer)) {
5246 return localNode.initializer.elements.map(function (x) { return _this.parseSymbolElements(x); });
5247 }
5248 else if (Ast.ts.isStringLiteral(localNode.initializer) ||
5249 Ast.ts.isTemplateLiteral(localNode.initializer) ||
5250 (Ast.ts.isPropertyAssignment(localNode) && localNode.initializer.text)) {
5251 return [localNode.initializer.text];
5252 }
5253 else if (localNode.initializer.kind &&
5254 (localNode.initializer.kind === Ast.SyntaxKind.TrueKeyword ||
5255 localNode.initializer.kind === Ast.SyntaxKind.FalseKeyword)) {
5256 return [localNode.initializer.kind === Ast.SyntaxKind.TrueKeyword ? true : false];
5257 }
5258 else if (Ast.ts.isPropertyAccessExpression(localNode.initializer)) {
5259 var identifier = this.parseSymbolElements(localNode.initializer);
5260 return [identifier];
5261 }
5262 else if (Ast.ts.isArrayLiteralExpression(localNode.initializer)) {
5263 return localNode.initializer.elements.map(function (x) { return _this.parseSymbolElements(x); });
5264 }
5265 else if (localNode.initializer &&
5266 localNode.initializer.elements &&
5267 localNode.initializer.elements.length > 0) {
5268 // Node replaced by ts-simple-ast & kind = 265
5269 return localNode.initializer.elements.map(function (x) { return _this.parseSymbolElements(x); });
5270 }
5271 };
5272 SymbolHelper.prototype.getSymbolDeps = function (props, type, srcFile, multiLine) {
5273 var _this = this;
5274 if (props.length === 0) {
5275 return [];
5276 }
5277 var i = 0, len = props.length, filteredProps = [];
5278 for (i; i < len; i++) {
5279 if (props[i].name && props[i].name.text === type) {
5280 filteredProps.push(props[i]);
5281 }
5282 }
5283 return filteredProps.map(function (x) { return _this.parseSymbols(x, srcFile); }).pop() || [];
5284 };
5285 SymbolHelper.prototype.getSymbolDepsRaw = function (props, type, multiLine) {
5286 return props.filter(function (node) { return node.name.text === type; });
5287 };
5288 return SymbolHelper;
5289}());
5290
5291function cleanNameWithoutSpaceAndToLowerCase(name) {
5292 return name.toLowerCase().replace(/ /g, '-');
5293}
5294function detectIndent(str, count, indent) {
5295 var stripIndent = function (str) {
5296 var match = str.match(/^[ \t]*(?=\S)/gm);
5297 if (!match) {
5298 return str;
5299 }
5300 // TODO: use spread operator when targeting Node.js 6
5301 var indent = Math.min.apply(Math, match.map(function (x) { return x.length; })); // eslint-disable-line
5302 var re = new RegExp("^[ \\t]{" + indent + "}", 'gm');
5303 return indent > 0 ? str.replace(re, '') : str;
5304 };
5305 var repeating = function (n, str) {
5306 str = str === undefined ? ' ' : str;
5307 if (typeof str !== 'string') {
5308 throw new TypeError("Expected `input` to be a `string`, got `" + typeof str + "`");
5309 }
5310 if (n < 0) {
5311 throw new TypeError("Expected `count` to be a positive finite number, got `" + n + "`");
5312 }
5313 var ret = '';
5314 do {
5315 if (n & 1) {
5316 ret += str;
5317 }
5318 str += str;
5319 } while ((n >>= 1));
5320 return ret;
5321 };
5322 var indentString = function (str, count, indent) {
5323 indent = indent === undefined ? ' ' : indent;
5324 count = count === undefined ? 1 : count;
5325 if (typeof str !== 'string') {
5326 throw new TypeError("Expected `input` to be a `string`, got `" + typeof str + "`");
5327 }
5328 if (typeof count !== 'number') {
5329 throw new TypeError("Expected `count` to be a `number`, got `" + typeof count + "`");
5330 }
5331 if (typeof indent !== 'string') {
5332 throw new TypeError("Expected `indent` to be a `string`, got `" + typeof indent + "`");
5333 }
5334 if (count === 0) {
5335 return str;
5336 }
5337 indent = count > 1 ? repeating(count, indent) : indent;
5338 return str.replace(/^(?!\s*$)/gm, indent);
5339 };
5340 return indentString(stripIndent(str), count || 0, indent);
5341}
5342// Create a compilerHost object to allow the compiler to read and write files
5343function compilerHost(transpileOptions) {
5344 var inputFileName = transpileOptions.fileName || (transpileOptions.jsx ? 'module.tsx' : 'module.ts');
5345 var toReturn = {
5346 getSourceFile: function (fileName) {
5347 if (fileName.lastIndexOf('.ts') !== -1 || fileName.lastIndexOf('.js') !== -1) {
5348 if (fileName === 'lib.d.ts') {
5349 return undefined;
5350 }
5351 if (fileName.substr(-5) === '.d.ts') {
5352 return undefined;
5353 }
5354 if (path.isAbsolute(fileName) === false) {
5355 fileName = path.join(transpileOptions.tsconfigDirectory, fileName);
5356 }
5357 if (!fs.existsSync(fileName)) {
5358 return undefined;
5359 }
5360 var libSource = '';
5361 try {
5362 libSource = fs.readFileSync(fileName).toString();
5363 if (hasBom(libSource)) {
5364 libSource = stripBom(libSource);
5365 }
5366 }
5367 catch (e) {
5368 logger.debug(e, fileName);
5369 }
5370 return Ast.ts.createSourceFile(fileName, libSource, transpileOptions.target, false);
5371 }
5372 return undefined;
5373 },
5374 writeFile: function (name, text) { },
5375 getDefaultLibFileName: function () { return 'lib.d.ts'; },
5376 useCaseSensitiveFileNames: function () { return false; },
5377 getCanonicalFileName: function (fileName) { return fileName; },
5378 getCurrentDirectory: function () { return ''; },
5379 getNewLine: function () { return '\n'; },
5380 fileExists: function (fileName) { return fileName === inputFileName; },
5381 readFile: function () { return ''; },
5382 directoryExists: function () { return true; },
5383 getDirectories: function () { return []; }
5384 };
5385 return toReturn;
5386}
5387function findMainSourceFolder(files) {
5388 var mainFolder = '';
5389 var mainFolderCount = 0;
5390 var rawFolders = files.map(function (filepath) {
5391 var shortPath = filepath.replace(process.cwd() + path.sep, '');
5392 return path.dirname(shortPath);
5393 });
5394 var folders = {};
5395 rawFolders = _.uniq(rawFolders);
5396 for (var i = 0; i < rawFolders.length; i++) {
5397 var sep = rawFolders[i].split(path.sep);
5398 sep.map(function (folder) {
5399 if (folders[folder]) {
5400 folders[folder] += 1;
5401 }
5402 else {
5403 folders[folder] = 1;
5404 }
5405 });
5406 }
5407 for (var f in folders) {
5408 if (folders[f] > mainFolderCount) {
5409 mainFolderCount = folders[f];
5410 mainFolder = f;
5411 }
5412 }
5413 return mainFolder;
5414}
5415
5416var ComponentHelper = /** @class */ (function () {
5417 function ComponentHelper(classHelper, symbolHelper) {
5418 if (symbolHelper === void 0) { symbolHelper = new SymbolHelper(); }
5419 this.classHelper = classHelper;
5420 this.symbolHelper = symbolHelper;
5421 }
5422 ComponentHelper.prototype.getComponentChangeDetection = function (props, srcFile) {
5423 return this.symbolHelper.getSymbolDeps(props, 'changeDetection', srcFile).pop();
5424 };
5425 ComponentHelper.prototype.getComponentEncapsulation = function (props, srcFile) {
5426 return this.symbolHelper.getSymbolDeps(props, 'encapsulation', srcFile);
5427 };
5428 ComponentHelper.prototype.getComponentPure = function (props, srcFile) {
5429 return this.symbolHelper.getSymbolDeps(props, 'pure', srcFile).pop();
5430 };
5431 ComponentHelper.prototype.getComponentName = function (props, srcFile) {
5432 return this.symbolHelper.getSymbolDeps(props, 'name', srcFile).pop();
5433 };
5434 ComponentHelper.prototype.getComponentExportAs = function (props, srcFile) {
5435 return this.symbolHelper.getSymbolDeps(props, 'exportAs', srcFile).pop();
5436 };
5437 ComponentHelper.prototype.getComponentHost = function (props) {
5438 return this.getSymbolDepsObject(props, 'host');
5439 };
5440 ComponentHelper.prototype.getComponentInputsMetadata = function (props, srcFile) {
5441 return this.symbolHelper.getSymbolDeps(props, 'inputs', srcFile);
5442 };
5443 ComponentHelper.prototype.getComponentTemplate = function (props, srcFile) {
5444 var t = this.symbolHelper.getSymbolDeps(props, 'template', srcFile, true).pop();
5445 if (t) {
5446 t = detectIndent(t, 0);
5447 t = t.replace(/\n/, '');
5448 t = t.replace(/ +$/gm, '');
5449 }
5450 return t;
5451 };
5452 ComponentHelper.prototype.getComponentStyleUrls = function (props, srcFile) {
5453 return this.sanitizeUrls(this.symbolHelper.getSymbolDeps(props, 'styleUrls', srcFile));
5454 };
5455 ComponentHelper.prototype.getComponentStyles = function (props, srcFile) {
5456 return this.symbolHelper.getSymbolDeps(props, 'styles', srcFile);
5457 };
5458 ComponentHelper.prototype.getComponentModuleId = function (props, srcFile) {
5459 return this.symbolHelper.getSymbolDeps(props, 'moduleId', srcFile).pop();
5460 };
5461 ComponentHelper.prototype.getComponentOutputs = function (props, srcFile) {
5462 return this.symbolHelper.getSymbolDeps(props, 'outputs', srcFile);
5463 };
5464 ComponentHelper.prototype.getComponentProviders = function (props, srcFile) {
5465 var _this = this;
5466 return this.symbolHelper
5467 .getSymbolDeps(props, 'providers', srcFile)
5468 .map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name); });
5469 };
5470 ComponentHelper.prototype.getComponentEntryComponents = function (props, srcFile) {
5471 var _this = this;
5472 return this.symbolHelper
5473 .getSymbolDeps(props, 'entryComponents', srcFile)
5474 .map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name); });
5475 };
5476 ComponentHelper.prototype.getComponentViewProviders = function (props, srcFile) {
5477 var _this = this;
5478 return this.symbolHelper
5479 .getSymbolDeps(props, 'viewProviders', srcFile)
5480 .map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name); });
5481 };
5482 ComponentHelper.prototype.getComponentTemplateUrl = function (props, srcFile) {
5483 return this.symbolHelper.getSymbolDeps(props, 'templateUrl', srcFile);
5484 };
5485 ComponentHelper.prototype.getComponentExampleUrls = function (text) {
5486 var exampleUrlsMatches = text.match(/<example-url>(.*?)<\/example-url>/g);
5487 var exampleUrls = undefined;
5488 if (exampleUrlsMatches && exampleUrlsMatches.length) {
5489 exampleUrls = exampleUrlsMatches.map(function (val) {
5490 return val.replace(/<\/?example-url>/g, '');
5491 });
5492 }
5493 return exampleUrls;
5494 };
5495 ComponentHelper.prototype.getComponentPreserveWhitespaces = function (props, srcFile) {
5496 return this.symbolHelper.getSymbolDeps(props, 'preserveWhitespaces', srcFile).pop();
5497 };
5498 ComponentHelper.prototype.getComponentSelector = function (props, srcFile) {
5499 return this.symbolHelper.getSymbolDeps(props, 'selector', srcFile).pop();
5500 };
5501 ComponentHelper.prototype.parseProperties = function (node) {
5502 var obj = new Map();
5503 var properties = node.initializer.properties || [];
5504 properties.forEach(function (prop) {
5505 obj.set(prop.name.text, prop.initializer.text);
5506 });
5507 return obj;
5508 };
5509 ComponentHelper.prototype.getSymbolDepsObject = function (props, type, multiLine) {
5510 var _this = this;
5511 var i = 0, len = props.length, filteredProps = [];
5512 for (i; i < len; i++) {
5513 if (props[i].name && props[i].name.text === type) {
5514 filteredProps.push(props[i]);
5515 }
5516 }
5517 return filteredProps.map(function (x) { return _this.parseProperties(x); }).pop();
5518 };
5519 ComponentHelper.prototype.getComponentIO = function (filename, sourceFile, node, fileBody) {
5520 var _this = this;
5521 /**
5522 * Copyright https://github.com/ng-bootstrap/ng-bootstrap
5523 */
5524 var reducedSource = fileBody ? fileBody.statements : sourceFile.statements;
5525 var res = reducedSource.reduce(function (directive, statement) {
5526 if (Ast.ts.isClassDeclaration(statement)) {
5527 if (statement.pos === node.pos && statement.end === node.end) {
5528 return directive.concat(_this.classHelper.visitClassDeclaration(filename, statement, sourceFile));
5529 }
5530 }
5531 return directive;
5532 }, []);
5533 return res[0] || {};
5534 };
5535 ComponentHelper.prototype.sanitizeUrls = function (urls) {
5536 return urls.map(function (url) { return url.replace('./', ''); });
5537 };
5538 return ComponentHelper;
5539}());
5540var ComponentCache = /** @class */ (function () {
5541 function ComponentCache() {
5542 this.cache = new Map();
5543 }
5544 ComponentCache.prototype.get = function (key) {
5545 return this.cache.get(key);
5546 };
5547 ComponentCache.prototype.set = function (key, value) {
5548 this.cache.set(key, value);
5549 };
5550 return ComponentCache;
5551}());
5552
5553var ExtendsMerger = /** @class */ (function () {
5554 function ExtendsMerger() {
5555 }
5556 ExtendsMerger.prototype.merge = function (deps, configuration) {
5557 var _this = this;
5558 this.components = deps.components;
5559 this.classes = deps.classes;
5560 this.components.forEach(function (component) {
5561 var ext;
5562 if (typeof component.extends !== 'undefined') {
5563 ext = _this.findInDependencies(component.extends);
5564 if (ext) {
5565 // From class to component
5566 if (typeof ext.methods !== 'undefined' && ext.methods.length > 0) {
5567 var newMethods = _.cloneDeep(ext.methods);
5568 newMethods = _this.markInheritance(newMethods, ext);
5569 if (typeof component.methodsClass !== 'undefined') {
5570 component.methodsClass = component.methodsClass.concat(newMethods);
5571 }
5572 }
5573 if (typeof ext.properties !== 'undefined' && ext.properties.length > 0) {
5574 var newProperties = _.cloneDeep(ext.properties);
5575 newProperties = _this.markInheritance(newProperties, ext);
5576 if (typeof component.propertiesClass !== 'undefined') {
5577 component.propertiesClass = component.propertiesClass.concat(newProperties);
5578 }
5579 }
5580 // From component to component
5581 if (typeof ext.inputsClass !== 'undefined' && ext.inputsClass.length > 0) {
5582 var newInputs = _.cloneDeep(ext.inputsClass);
5583 newInputs = _this.markInheritance(newInputs, ext);
5584 if (typeof component.inputsClass !== 'undefined') {
5585 component.inputsClass = component.inputsClass.concat(newInputs);
5586 }
5587 }
5588 if (typeof ext.outputsClass !== 'undefined' && ext.outputsClass.length > 0) {
5589 var newOutputs = _.cloneDeep(ext.outputsClass);
5590 newOutputs = _this.markInheritance(newOutputs, ext);
5591 if (typeof component.outputsClass !== 'undefined') {
5592 component.outputsClass = component.outputsClass.concat(newOutputs);
5593 }
5594 }
5595 if (typeof ext.methodsClass !== 'undefined' && ext.methodsClass.length > 0) {
5596 var newMethods = _.cloneDeep(ext.methodsClass);
5597 newMethods = _this.markInheritance(newMethods, ext);
5598 if (typeof component.methodsClass !== 'undefined') {
5599 component.methodsClass = component.methodsClass.concat(newMethods);
5600 }
5601 }
5602 if (typeof ext.propertiesClass !== 'undefined' &&
5603 ext.propertiesClass.length > 0) {
5604 var newProperties = _.cloneDeep(ext.propertiesClass);
5605 newProperties = _this.markInheritance(newProperties, ext);
5606 if (typeof component.propertiesClass !== 'undefined') {
5607 component.propertiesClass = component.propertiesClass.concat(newProperties);
5608 }
5609 }
5610 if (typeof ext.hostBindings !== 'undefined' && ext.hostBindings.length > 0) {
5611 var newHostBindings = _.cloneDeep(ext.hostBindings);
5612 newHostBindings = _this.markInheritance(newHostBindings, ext);
5613 if (typeof component.hostBindings !== 'undefined') {
5614 component.hostBindings = component.hostBindings.concat(newHostBindings);
5615 }
5616 }
5617 if (typeof ext.hostListeners !== 'undefined' && ext.hostListeners.length > 0) {
5618 var newHostListeners = _.cloneDeep(ext.hostListeners);
5619 newHostListeners = _this.markInheritance(newHostListeners, ext);
5620 if (typeof component.hostListeners !== 'undefined') {
5621 component.hostListeners = component.hostListeners.concat(newHostListeners);
5622 }
5623 }
5624 if (configuration.mainData.disableLifeCycleHooks) {
5625 component.methodsClass = cleanLifecycleHooksFromMethods(component.methodsClass);
5626 }
5627 }
5628 }
5629 });
5630 this.classes.forEach(function (cla) {
5631 var ext;
5632 if (typeof cla.extends !== 'undefined') {
5633 ext = _this.findInDependencies(cla.extends);
5634 if (ext) {
5635 // From class to class
5636 if (typeof ext.methods !== 'undefined' && ext.methods.length > 0) {
5637 var newMethods = _.cloneDeep(ext.methods);
5638 newMethods = _this.markInheritance(newMethods, ext);
5639 if (typeof cla.methods !== 'undefined') {
5640 cla.methods = cla.methods.concat(newMethods);
5641 }
5642 }
5643 if (typeof ext.properties !== 'undefined' && ext.properties.length > 0) {
5644 var newProperties = _.cloneDeep(ext.properties);
5645 newProperties = _this.markInheritance(newProperties, ext);
5646 if (typeof cla.properties !== 'undefined') {
5647 cla.properties = cla.properties.concat(newProperties);
5648 }
5649 }
5650 }
5651 }
5652 });
5653 return deps;
5654 };
5655 ExtendsMerger.prototype.markInheritance = function (data, originalource) {
5656 return data.map(function (el) {
5657 var newElement = el;
5658 newElement.inheritance = {
5659 file: originalource.name
5660 };
5661 return newElement;
5662 });
5663 };
5664 ExtendsMerger.prototype.findInDependencies = function (name) {
5665 var mergedData = _.concat([], this.components, this.classes);
5666 var result = _.find(mergedData, { name: name });
5667 return result || false;
5668 };
5669 return ExtendsMerger;
5670}());
5671
5672var FrameworkDependencies = /** @class */ (function () {
5673 function FrameworkDependencies(files, options, configuration, routerParser) {
5674 this.files = files;
5675 this.configuration = configuration;
5676 this.routerParser = routerParser;
5677 var transpileOptions = {
5678 target: Ast.ts.ScriptTarget.ES5,
5679 module: Ast.ts.ModuleKind.CommonJS,
5680 tsconfigDirectory: options.tsconfigDirectory,
5681 allowJs: true
5682 };
5683 this.program = Ast.ts.createProgram(this.files, transpileOptions, compilerHost(transpileOptions));
5684 this.typeChecker = this.program.getTypeChecker();
5685 this.classHelper = new ClassHelper(this.typeChecker, this.configuration);
5686 this.componentHelper = new ComponentHelper(this.classHelper);
5687 this.extendsMerger = new ExtendsMerger();
5688 }
5689 return FrameworkDependencies;
5690}());
5691
5692var CodeGenerator = /** @class */ (function () {
5693 function CodeGenerator() {
5694 }
5695 CodeGenerator.prototype.generate = function (node) {
5696 return this.visitAndRecognize(node, []).join('');
5697 };
5698 CodeGenerator.prototype.visitAndRecognize = function (node, code, depth) {
5699 var _this = this;
5700 if (depth === void 0) { depth = 0; }
5701 this.recognize(node, code);
5702 node.getChildren().forEach(function (c) { return _this.visitAndRecognize(c, code, depth + 1); });
5703 return code;
5704 };
5705 CodeGenerator.prototype.recognize = function (node, code) {
5706 var _this = this;
5707 var conversion = TsKindConversion.find(function (x) { return x.kinds.some(function (z) { return z === node.kind; }); });
5708 if (conversion) {
5709 var result = conversion.output(node);
5710 result.forEach(function (text) { return _this.gen(text, code); });
5711 }
5712 };
5713 CodeGenerator.prototype.gen = function (token, code) {
5714 if (!token) {
5715 return;
5716 }
5717 if (token === '\n') {
5718 code.push('');
5719 }
5720 else {
5721 code.push(token);
5722 }
5723 };
5724 return CodeGenerator;
5725}());
5726var TsKindsToText = /** @class */ (function () {
5727 function TsKindsToText(output, kinds) {
5728 this.output = output;
5729 this.kinds = kinds;
5730 }
5731 return TsKindsToText;
5732}());
5733var TsKindConversion = [
5734 new TsKindsToText(function (node) { return ['"', node.text, '"']; }, [
5735 Ast.SyntaxKind.FirstLiteralToken,
5736 Ast.SyntaxKind.Identifier
5737 ]),
5738 new TsKindsToText(function (node) { return ['"', node.text, '"']; }, [Ast.SyntaxKind.StringLiteral]),
5739 new TsKindsToText(function (node) { return []; }, [Ast.SyntaxKind.ArrayLiteralExpression]),
5740 new TsKindsToText(function (node) { return ['import', ' ']; }, [Ast.SyntaxKind.ImportKeyword]),
5741 new TsKindsToText(function (node) { return ['from', ' ']; }, [Ast.SyntaxKind.FromKeyword]),
5742 new TsKindsToText(function (node) { return ['\n', 'export', ' ']; }, [Ast.SyntaxKind.ExportKeyword]),
5743 new TsKindsToText(function (node) { return ['class', ' ']; }, [Ast.SyntaxKind.ClassKeyword]),
5744 new TsKindsToText(function (node) { return ['this']; }, [Ast.SyntaxKind.ThisKeyword]),
5745 new TsKindsToText(function (node) { return ['constructor']; }, [Ast.SyntaxKind.ConstructorKeyword]),
5746 new TsKindsToText(function (node) { return ['false']; }, [Ast.SyntaxKind.FalseKeyword]),
5747 new TsKindsToText(function (node) { return ['true']; }, [Ast.SyntaxKind.TrueKeyword]),
5748 new TsKindsToText(function (node) { return ['null']; }, [Ast.SyntaxKind.NullKeyword]),
5749 new TsKindsToText(function (node) { return []; }, [Ast.SyntaxKind.AtToken]),
5750 new TsKindsToText(function (node) { return ['+']; }, [Ast.SyntaxKind.PlusToken]),
5751 new TsKindsToText(function (node) { return [' => ']; }, [Ast.SyntaxKind.EqualsGreaterThanToken]),
5752 new TsKindsToText(function (node) { return ['(']; }, [Ast.SyntaxKind.OpenParenToken]),
5753 new TsKindsToText(function (node) { return ['{', ' ']; }, [
5754 Ast.SyntaxKind.ImportClause,
5755 Ast.SyntaxKind.ObjectLiteralExpression
5756 ]),
5757 new TsKindsToText(function (node) { return ['{', '\n']; }, [Ast.SyntaxKind.Block]),
5758 new TsKindsToText(function (node) { return ['}']; }, [Ast.SyntaxKind.CloseBraceToken]),
5759 new TsKindsToText(function (node) { return [')']; }, [Ast.SyntaxKind.CloseParenToken]),
5760 new TsKindsToText(function (node) { return ['[']; }, [Ast.SyntaxKind.OpenBracketToken]),
5761 new TsKindsToText(function (node) { return [']']; }, [Ast.SyntaxKind.CloseBracketToken]),
5762 new TsKindsToText(function (node) { return [';', '\n']; }, [Ast.SyntaxKind.SemicolonToken]),
5763 new TsKindsToText(function (node) { return [',', ' ']; }, [Ast.SyntaxKind.CommaToken]),
5764 new TsKindsToText(function (node) { return [' ', ':', ' ']; }, [Ast.SyntaxKind.ColonToken]),
5765 new TsKindsToText(function (node) { return ['.']; }, [Ast.SyntaxKind.DotToken]),
5766 new TsKindsToText(function (node) { return []; }, [Ast.SyntaxKind.DoStatement]),
5767 new TsKindsToText(function (node) { return []; }, [Ast.SyntaxKind.Decorator]),
5768 new TsKindsToText(function (node) { return [' = ']; }, [Ast.SyntaxKind.FirstAssignment]),
5769 new TsKindsToText(function (node) { return [' ']; }, [Ast.SyntaxKind.FirstPunctuation]),
5770 new TsKindsToText(function (node) { return ['private', ' ']; }, [Ast.SyntaxKind.PrivateKeyword]),
5771 new TsKindsToText(function (node) { return ['public', ' ']; }, [Ast.SyntaxKind.PublicKeyword])
5772];
5773
5774var crypto$1 = require('crypto');
5775var DirectiveDepFactory = /** @class */ (function () {
5776 function DirectiveDepFactory(helper, configuration) {
5777 this.helper = helper;
5778 this.configuration = configuration;
5779 }
5780 DirectiveDepFactory.prototype.create = function (file, srcFile, name, props, IO) {
5781 var sourceCode = srcFile.getText();
5782 var hash = crypto$1.createHash('md5').update(sourceCode).digest('hex');
5783 var directiveDeps = {
5784 name: name,
5785 id: 'directive-' + name + '-' + hash,
5786 file: file,
5787 type: 'directive',
5788 description: IO.description,
5789 sourceCode: srcFile.getText(),
5790 selector: this.helper.getComponentSelector(props),
5791 providers: this.helper.getComponentProviders(props),
5792 inputsClass: IO.inputs,
5793 outputsClass: IO.outputs,
5794 hostBindings: IO.hostBindings,
5795 hostListeners: IO.hostListeners,
5796 propertiesClass: IO.properties,
5797 methodsClass: IO.methods,
5798 exampleUrls: this.helper.getComponentExampleUrls(srcFile.getText())
5799 };
5800 if (this.configuration.mainData.disableLifeCycleHooks) {
5801 directiveDeps.methodsClass = cleanLifecycleHooksFromMethods(directiveDeps.methodsClass);
5802 }
5803 if (IO.jsdoctags && IO.jsdoctags.length > 0) {
5804 directiveDeps.jsdoctags = IO.jsdoctags[0].tags;
5805 }
5806 if (IO.implements && IO.implements.length > 0) {
5807 directiveDeps.implements = IO.implements;
5808 }
5809 if (IO.constructor) {
5810 directiveDeps.constructorObj = IO.constructor;
5811 }
5812 if (IO.accessors) {
5813 directiveDeps.accessors = IO.accessors;
5814 }
5815 return directiveDeps;
5816 };
5817 return DirectiveDepFactory;
5818}());
5819
5820var crypto$2 = require('crypto');
5821var ModuleDepFactory = /** @class */ (function () {
5822 function ModuleDepFactory(moduleHelper) {
5823 this.moduleHelper = moduleHelper;
5824 }
5825 ModuleDepFactory.prototype.create = function (file, srcFile, name, properties, IO) {
5826 var sourceCode = srcFile.getText();
5827 var hash = crypto$2
5828 .createHash('md5')
5829 .update(sourceCode)
5830 .digest('hex');
5831 return {
5832 name: name,
5833 id: 'module-' + name + '-' + hash,
5834 file: file,
5835 ngid: this.moduleHelper.getModuleId(properties, srcFile),
5836 providers: this.moduleHelper.getModuleProviders(properties, srcFile),
5837 declarations: this.moduleHelper.getModuleDeclarations(properties, srcFile),
5838 controllers: this.moduleHelper.getModuleControllers(properties, srcFile),
5839 entryComponents: this.moduleHelper.getModuleEntryComponents(properties, srcFile),
5840 imports: this.moduleHelper.getModuleImports(properties, srcFile),
5841 exports: this.moduleHelper.getModuleExports(properties, srcFile),
5842 schemas: this.moduleHelper.getModuleSchemas(properties, srcFile),
5843 bootstrap: this.moduleHelper.getModuleBootstrap(properties, srcFile),
5844 type: 'module',
5845 description: IO.description,
5846 sourceCode: srcFile.text
5847 };
5848 };
5849 return ModuleDepFactory;
5850}());
5851
5852var crypto$3 = require('crypto');
5853var ComponentDepFactory = /** @class */ (function () {
5854 function ComponentDepFactory(helper, configuration) {
5855 this.helper = helper;
5856 this.configuration = configuration;
5857 }
5858 ComponentDepFactory.prototype.create = function (file, srcFile, name, props, IO) {
5859 // console.log(util.inspect(props, { showHidden: true, depth: 10 }));
5860 var sourceCode = srcFile.getText();
5861 var hash = crypto$3
5862 .createHash('md5')
5863 .update(sourceCode)
5864 .digest('hex');
5865 var componentDep = {
5866 name: name,
5867 id: 'component-' + name + '-' + hash,
5868 file: file,
5869 // animations?: string[]; // TODO
5870 changeDetection: this.helper.getComponentChangeDetection(props, srcFile),
5871 encapsulation: this.helper.getComponentEncapsulation(props, srcFile),
5872 entryComponents: this.helper.getComponentEntryComponents(props, srcFile),
5873 exportAs: this.helper.getComponentExportAs(props, srcFile),
5874 host: this.helper.getComponentHost(props),
5875 inputs: this.helper.getComponentInputsMetadata(props, srcFile),
5876 // interpolation?: string; // TODO waiting doc infos
5877 moduleId: this.helper.getComponentModuleId(props, srcFile),
5878 outputs: this.helper.getComponentOutputs(props, srcFile),
5879 providers: this.helper.getComponentProviders(props, srcFile),
5880 // queries?: Deps[]; // TODO
5881 selector: this.helper.getComponentSelector(props, srcFile),
5882 styleUrls: this.helper.getComponentStyleUrls(props, srcFile),
5883 styles: this.helper.getComponentStyles(props, srcFile),
5884 template: this.helper.getComponentTemplate(props, srcFile),
5885 templateUrl: this.helper.getComponentTemplateUrl(props, srcFile),
5886 viewProviders: this.helper.getComponentViewProviders(props, srcFile),
5887 inputsClass: IO.inputs,
5888 outputsClass: IO.outputs,
5889 propertiesClass: IO.properties,
5890 methodsClass: IO.methods,
5891 hostBindings: IO.hostBindings,
5892 hostListeners: IO.hostListeners,
5893 description: IO.description,
5894 type: 'component',
5895 sourceCode: srcFile.getText(),
5896 exampleUrls: this.helper.getComponentExampleUrls(srcFile.getText())
5897 };
5898 if (typeof this.helper.getComponentPreserveWhitespaces(props, srcFile) !== 'undefined') {
5899 componentDep.preserveWhitespaces = this.helper.getComponentPreserveWhitespaces(props, srcFile);
5900 }
5901 if (this.configuration.mainData.disableLifeCycleHooks) {
5902 componentDep.methodsClass = cleanLifecycleHooksFromMethods(componentDep.methodsClass);
5903 }
5904 if (IO.jsdoctags && IO.jsdoctags.length > 0) {
5905 componentDep.jsdoctags = IO.jsdoctags[0].tags;
5906 }
5907 if (IO.constructor) {
5908 componentDep.constructorObj = IO.constructor;
5909 }
5910 if (IO.extends) {
5911 componentDep.extends = IO.extends;
5912 }
5913 if (IO.implements && IO.implements.length > 0) {
5914 componentDep.implements = IO.implements;
5915 }
5916 if (IO.accessors) {
5917 componentDep.accessors = IO.accessors;
5918 }
5919 return componentDep;
5920 };
5921 return ComponentDepFactory;
5922}());
5923
5924var crypto$4 = require('crypto');
5925var ControllerDepFactory = /** @class */ (function () {
5926 function ControllerDepFactory() {
5927 }
5928 ControllerDepFactory.prototype.create = function (file, srcFile, name, properties, IO) {
5929 var sourceCode = srcFile.getText();
5930 var hash = crypto$4
5931 .createHash('md5')
5932 .update(sourceCode)
5933 .digest('hex');
5934 var infos = {
5935 name: name,
5936 id: 'controller-' + name + '-' + hash,
5937 file: file,
5938 methods: IO.methods,
5939 type: 'controller',
5940 sourceCode: srcFile.text
5941 };
5942 if (properties && properties.length === 1) {
5943 if (properties[0].text) {
5944 infos.prefix = properties[0].text;
5945 }
5946 }
5947 return infos;
5948 };
5949 return ControllerDepFactory;
5950}());
5951
5952var ModuleHelper = /** @class */ (function () {
5953 function ModuleHelper(cache, symbolHelper) {
5954 if (symbolHelper === void 0) { symbolHelper = new SymbolHelper(); }
5955 this.cache = cache;
5956 this.symbolHelper = symbolHelper;
5957 }
5958 ModuleHelper.prototype.getModuleProviders = function (props, srcFile) {
5959 var _this = this;
5960 return this.symbolHelper
5961 .getSymbolDeps(props, 'providers', srcFile)
5962 .map(function (providerName) { return _this.symbolHelper.parseDeepIndentifier(providerName, srcFile); });
5963 };
5964 ModuleHelper.prototype.getModuleControllers = function (props, srcFile) {
5965 var _this = this;
5966 return this.symbolHelper
5967 .getSymbolDeps(props, 'controllers', srcFile)
5968 .map(function (providerName) { return _this.symbolHelper.parseDeepIndentifier(providerName, srcFile); });
5969 };
5970 ModuleHelper.prototype.getModuleDeclarations = function (props, srcFile) {
5971 var _this = this;
5972 return this.symbolHelper.getSymbolDeps(props, 'declarations', srcFile).map(function (name) {
5973 var component = _this.cache.get(name);
5974 if (component) {
5975 return component;
5976 }
5977 return _this.symbolHelper.parseDeepIndentifier(name, srcFile);
5978 });
5979 };
5980 ModuleHelper.prototype.getModuleEntryComponents = function (props, srcFile) {
5981 var _this = this;
5982 return this.symbolHelper.getSymbolDeps(props, 'entryComponents', srcFile).map(function (name) {
5983 var component = _this.cache.get(name);
5984 if (component) {
5985 return component;
5986 }
5987 return _this.symbolHelper.parseDeepIndentifier(name, srcFile);
5988 });
5989 };
5990 ModuleHelper.prototype.cleanImportForRootForChild = function (name) {
5991 var nsModule = name.split('.');
5992 if (nsModule.length > 0) {
5993 name = nsModule[0];
5994 }
5995 return name;
5996 };
5997 ModuleHelper.prototype.getModuleImports = function (props, srcFile) {
5998 var _this = this;
5999 return this.symbolHelper
6000 .getSymbolDeps(props, 'imports', srcFile)
6001 .map(function (name) { return _this.cleanImportForRootForChild(name); })
6002 .map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name); });
6003 };
6004 ModuleHelper.prototype.getModuleExports = function (props, srcFile) {
6005 var _this = this;
6006 return this.symbolHelper
6007 .getSymbolDeps(props, 'exports', srcFile)
6008 .map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name, srcFile); });
6009 };
6010 ModuleHelper.prototype.getModuleImportsRaw = function (props, srcFile) {
6011 return this.symbolHelper.getSymbolDepsRaw(props, 'imports');
6012 };
6013 ModuleHelper.prototype.getModuleId = function (props, srcFile) {
6014 var _id = this.symbolHelper.getSymbolDeps(props, 'id', srcFile), id;
6015 if (_id.length === 1) {
6016 id = _id[0];
6017 }
6018 return id;
6019 };
6020 ModuleHelper.prototype.getModuleSchemas = function (props, srcFile) {
6021 var schemas = this.symbolHelper.getSymbolDeps(props, 'schemas', srcFile);
6022 return schemas;
6023 };
6024 ModuleHelper.prototype.getModuleBootstrap = function (props, srcFile) {
6025 var _this = this;
6026 return this.symbolHelper
6027 .getSymbolDeps(props, 'bootstrap', srcFile)
6028 .map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name, srcFile); });
6029 };
6030 return ModuleHelper;
6031}());
6032
6033var JsDocHelper = /** @class */ (function () {
6034 function JsDocHelper() {
6035 }
6036 JsDocHelper.prototype.hasJSDocInternalTag = function (filename, sourceFile, node) {
6037 if (typeof sourceFile.statements !== 'undefined') {
6038 return this.checkStatements(sourceFile.statements, node);
6039 }
6040 return false;
6041 };
6042 JsDocHelper.prototype.checkStatements = function (statements, node) {
6043 var _this = this;
6044 return statements.some(function (x) { return _this.checkStatement(x, node); });
6045 };
6046 JsDocHelper.prototype.checkStatement = function (statement, node) {
6047 if (statement.pos === node.pos && statement.end === node.end) {
6048 if (node.jsDoc && node.jsDoc.length > 0) {
6049 return this.checkJsDocs(node.jsDoc);
6050 }
6051 }
6052 return false;
6053 };
6054 JsDocHelper.prototype.checkJsDocs = function (jsDocs) {
6055 var _this = this;
6056 return jsDocs
6057 .filter(function (x) { return x.tags && x.tags.length > 0; })
6058 .some(function (x) { return _this.checkJsDocTags(x.tags); });
6059 };
6060 JsDocHelper.prototype.checkJsDocTags = function (tags) {
6061 return tags.some(function (x) { return x.tagName && x.tagName.text === 'internal'; });
6062 };
6063 return JsDocHelper;
6064}());
6065
6066var crypto$5 = require('crypto');
6067var marked$3 = require('marked');
6068var ast$2 = new Ast__default();
6069// TypeScript reference : https://github.com/Microsoft/TypeScript/blob/master/lib/typescript.d.ts
6070var AngularDependencies = /** @class */ (function (_super) {
6071 __extends(AngularDependencies, _super);
6072 function AngularDependencies(files, options, configuration, routerParser) {
6073 var _this = _super.call(this, files, options, configuration, routerParser) || this;
6074 _this.cache = new ComponentCache();
6075 _this.moduleHelper = new ModuleHelper(_this.cache);
6076 _this.jsDocHelper = new JsDocHelper();
6077 _this.symbolHelper = new SymbolHelper();
6078 _this.jsdocParserUtil = new JsdocParserUtil();
6079 _this.importsUtil = new ImportsUtil();
6080 return _this;
6081 }
6082 AngularDependencies.prototype.getDependencies = function () {
6083 var _this = this;
6084 var deps = {
6085 modules: [],
6086 modulesForGraph: [],
6087 components: [],
6088 controllers: [],
6089 injectables: [],
6090 interceptors: [],
6091 guards: [],
6092 pipes: [],
6093 directives: [],
6094 routes: [],
6095 classes: [],
6096 interfaces: [],
6097 miscellaneous: {
6098 variables: [],
6099 functions: [],
6100 typealiases: [],
6101 enumerations: []
6102 },
6103 routesTree: undefined
6104 };
6105 var sourceFiles = this.program.getSourceFiles() || [];
6106 sourceFiles.map(function (file) {
6107 var filePath = file.fileName;
6108 if (path.extname(filePath) === '.ts') {
6109 if (!_this.configuration.mainData.angularJSProject &&
6110 path.extname(filePath) === '.js') {
6111 logger.info('parsing', filePath);
6112 _this.getSourceFileDecorators(file, deps);
6113 }
6114 else {
6115 if (filePath.lastIndexOf('.d.ts') === -1 &&
6116 filePath.lastIndexOf('spec.ts') === -1) {
6117 logger.info('parsing', filePath);
6118 _this.getSourceFileDecorators(file, deps);
6119 }
6120 }
6121 }
6122 return deps;
6123 });
6124 // End of file scanning
6125 // Try merging inside the same file declarated variables & modules with imports | exports | declarations | providers
6126 if (deps.miscellaneous.variables.length > 0) {
6127 deps.miscellaneous.variables.forEach(function (_variable) {
6128 var newVar = [];
6129 (function (_var, _newVar) {
6130 // getType pr reconstruire....
6131 if (_var.initializer) {
6132 if (_var.initializer.elements) {
6133 if (_var.initializer.elements.length > 0) {
6134 _var.initializer.elements.forEach(function (element) {
6135 if (element.text) {
6136 newVar.push({
6137 name: element.text,
6138 type: _this.symbolHelper.getType(element.text)
6139 });
6140 }
6141 });
6142 }
6143 }
6144 }
6145 })(_variable, newVar);
6146 var onLink = function (mod) {
6147 var process = function (initialArray, _var) {
6148 var indexToClean = 0;
6149 var found = false;
6150 var findVariableInArray = function (el, index, theArray) {
6151 if (el.name === _var.name) {
6152 indexToClean = index;
6153 found = true;
6154 }
6155 };
6156 initialArray.forEach(findVariableInArray);
6157 // Clean indexes to replace
6158 if (found) {
6159 initialArray.splice(indexToClean, 1);
6160 // Add variable
6161 newVar.forEach(function (newEle) {
6162 if (typeof _.find(initialArray, { name: newEle.name }) ===
6163 'undefined') {
6164 initialArray.push(newEle);
6165 }
6166 });
6167 }
6168 };
6169 process(mod.imports, _variable);
6170 process(mod.exports, _variable);
6171 process(mod.controllers, _variable);
6172 process(mod.declarations, _variable);
6173 process(mod.providers, _variable);
6174 };
6175 deps.modules.forEach(onLink);
6176 deps.modulesForGraph.forEach(onLink);
6177 });
6178 }
6179 /**
6180 * If one thing extends another, merge them, only for internal sources
6181 * - classes
6182 * - components
6183 * for
6184 * - inputs
6185 * - outputs
6186 * - properties
6187 * - methods
6188 */
6189 deps = this.extendsMerger.merge(deps, this.configuration);
6190 // this.routerParser.printModulesRoutes();
6191 // this.routerParser.printRoutes();
6192 if (!this.configuration.mainData.disableRoutesGraph) {
6193 this.routerParser.linkModulesAndRoutes();
6194 this.routerParser.constructModulesTree();
6195 deps.routesTree = this.routerParser.constructRoutesTree();
6196 }
6197 return deps;
6198 };
6199 AngularDependencies.prototype.processClass = function (node, file, srcFile, outputSymbols, fileBody) {
6200 var name = this.getSymboleName(node);
6201 var IO = this.getClassIO(file, srcFile, node, fileBody);
6202 var sourceCode = srcFile.getText();
6203 var hash = crypto$5
6204 .createHash('md5')
6205 .update(sourceCode)
6206 .digest('hex');
6207 var deps = {
6208 name: name,
6209 id: 'class-' + name + '-' + hash,
6210 file: file,
6211 type: 'class',
6212 sourceCode: srcFile.getText()
6213 };
6214 var excludeFromClassArray = false;
6215 if (IO.constructor) {
6216 deps.constructorObj = IO.constructor;
6217 }
6218 if (IO.properties) {
6219 deps.properties = IO.properties;
6220 }
6221 if (IO.description) {
6222 deps.description = IO.description;
6223 }
6224 if (IO.methods) {
6225 deps.methods = IO.methods;
6226 }
6227 if (IO.indexSignatures) {
6228 deps.indexSignatures = IO.indexSignatures;
6229 }
6230 if (IO.extends) {
6231 deps.extends = IO.extends;
6232 }
6233 if (IO.jsdoctags && IO.jsdoctags.length > 0) {
6234 deps.jsdoctags = IO.jsdoctags[0].tags;
6235 }
6236 if (IO.accessors) {
6237 deps.accessors = IO.accessors;
6238 }
6239 if (IO.inputs) {
6240 deps.inputsClass = IO.inputs;
6241 }
6242 if (IO.outputs) {
6243 deps.outputsClass = IO.outputs;
6244 }
6245 if (IO.hostBindings) {
6246 deps.hostBindings = IO.hostBindings;
6247 }
6248 if (IO.hostListeners) {
6249 deps.hostListeners = IO.hostListeners;
6250 }
6251 if (this.configuration.mainData.disableLifeCycleHooks) {
6252 deps.methods = cleanLifecycleHooksFromMethods(deps.methods);
6253 }
6254 if (IO.implements && IO.implements.length > 0) {
6255 deps.implements = IO.implements;
6256 if (this.isGuard(IO.implements)) {
6257 // We don't want the Guard to show up in the Classes menu
6258 excludeFromClassArray = true;
6259 deps.type = 'guard';
6260 outputSymbols.guards.push(deps);
6261 }
6262 }
6263 if (typeof IO.ignore === 'undefined') {
6264 this.debug(deps);
6265 if (!excludeFromClassArray) {
6266 outputSymbols.classes.push(deps);
6267 }
6268 }
6269 else {
6270 this.ignore(deps);
6271 }
6272 };
6273 AngularDependencies.prototype.getSourceFileDecorators = function (initialSrcFile, outputSymbols) {
6274 var _this = this;
6275 var cleaner = (process.cwd() + path.sep).replace(/\\/g, '/');
6276 var fileName = initialSrcFile.fileName.replace(cleaner, '');
6277 var scannedFile = initialSrcFile;
6278 // Search in file for variable statement as routes definitions
6279 var astFile = typeof ast$2.getSourceFile(initialSrcFile.fileName) !== 'undefined'
6280 ? ast$2.getSourceFile(initialSrcFile.fileName)
6281 : ast$2.addExistingSourceFile(initialSrcFile.fileName);
6282 var variableRoutesStatements = astFile.getVariableStatements();
6283 var hasRoutesStatements = false;
6284 if (variableRoutesStatements.length > 0) {
6285 // Clean file for spread and dynamics inside routes definitions
6286 variableRoutesStatements.forEach(function (s) {
6287 var variableDeclarations = s.getDeclarations();
6288 var len = variableDeclarations.length;
6289 var i = 0;
6290 for (i; i < len; i++) {
6291 if (variableDeclarations[i].compilerNode.type) {
6292 if (variableDeclarations[i].compilerNode.type.typeName &&
6293 variableDeclarations[i].compilerNode.type.typeName.text === 'Routes') {
6294 hasRoutesStatements = true;
6295 }
6296 }
6297 }
6298 });
6299 }
6300 if (hasRoutesStatements && !this.configuration.mainData.disableRoutesGraph) {
6301 // Clean file for spread and dynamics inside routes definitions
6302 logger.info('Analysing routes definitions and clean them if necessary');
6303 // scannedFile = this.routerParser.cleanFileIdentifiers(astFile).compilerNode;
6304 var firstClean = this.routerParser.cleanFileSpreads(astFile).compilerNode;
6305 scannedFile = this.routerParser.cleanCallExpressions(astFile).compilerNode;
6306 scannedFile = this.routerParser.cleanFileDynamics(astFile).compilerNode;
6307 scannedFile.kind = Ast.SyntaxKind.SourceFile;
6308 }
6309 Ast.ts.forEachChild(scannedFile, function (initialNode) {
6310 if (_this.jsDocHelper.hasJSDocInternalTag(fileName, scannedFile, initialNode) &&
6311 _this.configuration.mainData.disableInternal) {
6312 return;
6313 }
6314 var parseNode = function (file, srcFile, node, fileBody) {
6315 var sourceCode = srcFile.getText();
6316 var hash = crypto$5
6317 .createHash('md5')
6318 .update(sourceCode)
6319 .digest('hex');
6320 if (node.decorators) {
6321 var classWithCustomDecorator_1 = false;
6322 var visitDecorator = function (visitedDecorator, index) {
6323 var deps;
6324 var metadata = node.decorators;
6325 var name = _this.getSymboleName(node);
6326 var props = _this.findProperties(visitedDecorator, srcFile);
6327 var IO = _this.componentHelper.getComponentIO(file, srcFile, node, fileBody);
6328 if (_this.isModule(visitedDecorator)) {
6329 var moduleDep = new ModuleDepFactory(_this.moduleHelper).create(file, srcFile, name, props, IO);
6330 if (_this.routerParser.hasRouterModuleInImports(moduleDep.imports)) {
6331 _this.routerParser.addModuleWithRoutes(name, _this.moduleHelper.getModuleImportsRaw(props, srcFile), file);
6332 }
6333 deps = moduleDep;
6334 if (typeof IO.ignore === 'undefined') {
6335 _this.routerParser.addModule(name, moduleDep.imports);
6336 outputSymbols.modules.push(moduleDep);
6337 outputSymbols.modulesForGraph.push(moduleDep);
6338 }
6339 }
6340 else if (_this.isComponent(visitedDecorator)) {
6341 if (props.length === 0) {
6342 return;
6343 }
6344 var componentDep = new ComponentDepFactory(_this.componentHelper, _this.configuration).create(file, srcFile, name, props, IO);
6345 deps = componentDep;
6346 if (typeof IO.ignore === 'undefined') {
6347 $componentsTreeEngine.addComponent(componentDep);
6348 outputSymbols.components.push(componentDep);
6349 }
6350 }
6351 else if (_this.isController(visitedDecorator)) {
6352 var controllerDep = new ControllerDepFactory().create(file, srcFile, name, props, IO);
6353 deps = controllerDep;
6354 if (typeof IO.ignore === 'undefined') {
6355 outputSymbols.controllers.push(controllerDep);
6356 }
6357 }
6358 else if (_this.isInjectable(visitedDecorator)) {
6359 var injectableDeps = {
6360 name: name,
6361 id: 'injectable-' + name + '-' + hash,
6362 file: file,
6363 properties: IO.properties,
6364 methods: IO.methods,
6365 description: IO.description,
6366 sourceCode: srcFile.getText(),
6367 exampleUrls: _this.componentHelper.getComponentExampleUrls(srcFile.getText())
6368 };
6369 if (IO.constructor) {
6370 injectableDeps.constructorObj = IO.constructor;
6371 }
6372 if (IO.jsdoctags && IO.jsdoctags.length > 0) {
6373 injectableDeps.jsdoctags = IO.jsdoctags[0].tags;
6374 }
6375 if (IO.accessors) {
6376 injectableDeps.accessors = IO.accessors;
6377 }
6378 deps = injectableDeps;
6379 if (typeof IO.ignore === 'undefined') {
6380 if (_.includes(IO.implements, 'HttpInterceptor')) {
6381 injectableDeps.type = 'interceptor';
6382 outputSymbols.interceptors.push(injectableDeps);
6383 }
6384 else if (_this.isGuard(IO.implements)) {
6385 injectableDeps.type = 'guard';
6386 outputSymbols.guards.push(injectableDeps);
6387 }
6388 else {
6389 injectableDeps.type = 'injectable';
6390 _this.addNewEntityInStore(injectableDeps, outputSymbols.injectables);
6391 }
6392 }
6393 }
6394 else if (_this.isPipe(visitedDecorator)) {
6395 var pipeDeps = {
6396 name: name,
6397 id: 'pipe-' + name + '-' + hash,
6398 file: file,
6399 type: 'pipe',
6400 description: IO.description,
6401 properties: IO.properties,
6402 methods: IO.methods,
6403 pure: _this.componentHelper.getComponentPure(props, srcFile),
6404 ngname: _this.componentHelper.getComponentName(props, srcFile),
6405 sourceCode: srcFile.getText(),
6406 exampleUrls: _this.componentHelper.getComponentExampleUrls(srcFile.getText())
6407 };
6408 if (IO.jsdoctags && IO.jsdoctags.length > 0) {
6409 pipeDeps.jsdoctags = IO.jsdoctags[0].tags;
6410 }
6411 deps = pipeDeps;
6412 if (typeof IO.ignore === 'undefined') {
6413 outputSymbols.pipes.push(pipeDeps);
6414 }
6415 }
6416 else if (_this.isDirective(visitedDecorator)) {
6417 if (props.length === 0) {
6418 return;
6419 }
6420 var directiveDeps = new DirectiveDepFactory(_this.componentHelper, _this.configuration).create(file, srcFile, name, props, IO);
6421 deps = directiveDeps;
6422 if (typeof IO.ignore === 'undefined') {
6423 outputSymbols.directives.push(directiveDeps);
6424 }
6425 }
6426 else {
6427 var hasMultipleDecoratorsWithInternalOne = _this.hasInternalDecorator(node.decorators);
6428 // Just a class
6429 if (!classWithCustomDecorator_1 &&
6430 !hasMultipleDecoratorsWithInternalOne) {
6431 classWithCustomDecorator_1 = true;
6432 _this.processClass(node, file, srcFile, outputSymbols, fileBody);
6433 }
6434 }
6435 _this.cache.set(name, deps);
6436 if (typeof IO.ignore === 'undefined') {
6437 _this.debug(deps);
6438 }
6439 else {
6440 _this.ignore(deps);
6441 }
6442 };
6443 var filterByDecorators = function (filteredNode) {
6444 if (filteredNode.expression && filteredNode.expression.expression) {
6445 var _test = /(NgModule|Component|Injectable|Pipe|Directive)/.test(filteredNode.expression.expression.text);
6446 if (!_test && Ast.ts.isClassDeclaration(node)) {
6447 _test = true;
6448 }
6449 return _test;
6450 }
6451 if (Ast.ts.isClassDeclaration(node)) {
6452 return true;
6453 }
6454 return false;
6455 };
6456 node.decorators.filter(filterByDecorators).forEach(visitDecorator);
6457 }
6458 else if (node.symbol) {
6459 if (node.symbol.flags === Ast.ts.SymbolFlags.Class) {
6460 _this.processClass(node, file, srcFile, outputSymbols, fileBody);
6461 }
6462 else if (node.symbol.flags === Ast.ts.SymbolFlags.Interface) {
6463 var name = _this.getSymboleName(node);
6464 var IO = _this.getInterfaceIO(file, srcFile, node, fileBody);
6465 var interfaceDeps = {
6466 name: name,
6467 id: 'interface-' + name + '-' + hash,
6468 file: file,
6469 type: 'interface',
6470 sourceCode: srcFile.getText()
6471 };
6472 if (IO.properties) {
6473 interfaceDeps.properties = IO.properties;
6474 }
6475 if (IO.indexSignatures) {
6476 interfaceDeps.indexSignatures = IO.indexSignatures;
6477 }
6478 if (IO.kind) {
6479 interfaceDeps.kind = IO.kind;
6480 }
6481 if (IO.description) {
6482 interfaceDeps.description = IO.description;
6483 }
6484 if (IO.methods) {
6485 interfaceDeps.methods = IO.methods;
6486 }
6487 if (IO.extends) {
6488 interfaceDeps.extends = IO.extends;
6489 }
6490 if (typeof IO.ignore === 'undefined') {
6491 _this.debug(interfaceDeps);
6492 outputSymbols.interfaces.push(interfaceDeps);
6493 }
6494 else {
6495 _this.ignore(interfaceDeps);
6496 }
6497 }
6498 else if (Ast.ts.isFunctionDeclaration(node)) {
6499 var infos = _this.visitFunctionDeclaration(node);
6500 // let tags = this.visitFunctionDeclarationJSDocTags(node);
6501 var name = infos.name;
6502 var functionDep = {
6503 name: name,
6504 file: file,
6505 ctype: 'miscellaneous',
6506 subtype: 'function',
6507 description: _this.visitEnumTypeAliasFunctionDeclarationDescription(node)
6508 };
6509 if (infos.args) {
6510 functionDep.args = infos.args;
6511 }
6512 if (infos.jsdoctags && infos.jsdoctags.length > 0) {
6513 functionDep.jsdoctags = infos.jsdoctags;
6514 }
6515 if (typeof infos.ignore === 'undefined') {
6516 outputSymbols.miscellaneous.functions.push(functionDep);
6517 }
6518 }
6519 else if (Ast.ts.isEnumDeclaration(node)) {
6520 var infos = _this.visitEnumDeclaration(node);
6521 var name = node.name.text;
6522 var enumDeps = {
6523 name: name,
6524 childs: infos,
6525 ctype: 'miscellaneous',
6526 subtype: 'enum',
6527 description: _this.visitEnumTypeAliasFunctionDeclarationDescription(node),
6528 file: file
6529 };
6530 if (!isIgnore(node)) {
6531 outputSymbols.miscellaneous.enumerations.push(enumDeps);
6532 }
6533 }
6534 else if (Ast.ts.isTypeAliasDeclaration(node)) {
6535 var infos = _this.visitTypeDeclaration(node);
6536 var name = infos.name;
6537 var typeAliasDeps = {
6538 name: name,
6539 ctype: 'miscellaneous',
6540 subtype: 'typealias',
6541 rawtype: _this.classHelper.visitType(node),
6542 file: file,
6543 description: _this.visitEnumTypeAliasFunctionDeclarationDescription(node)
6544 };
6545 if (node.type) {
6546 typeAliasDeps.kind = node.type.kind;
6547 if (typeAliasDeps.rawtype === '') {
6548 typeAliasDeps.rawtype = kindToType(node.type.kind);
6549 }
6550 }
6551 if (!isIgnore(node)) {
6552 outputSymbols.miscellaneous.typealiases.push(typeAliasDeps);
6553 }
6554 }
6555 else if (Ast.ts.isModuleDeclaration(node)) {
6556 if (node.body) {
6557 if (node.body.statements && node.body.statements.length > 0) {
6558 node.body.statements.forEach(function (statement) {
6559 return parseNode(file, srcFile, statement, node.body);
6560 });
6561 }
6562 }
6563 }
6564 }
6565 else {
6566 var IO = _this.getRouteIO(file, srcFile, node);
6567 if (IO.routes) {
6568 var newRoutes = void 0;
6569 try {
6570 newRoutes = _this.routerParser.cleanRawRouteParsed(IO.routes);
6571 }
6572 catch (e) {
6573 // tslint:disable-next-line:max-line-length
6574 logger.error('Routes parsing error, maybe a trailing comma or an external variable, trying to fix that later after sources scanning.');
6575 newRoutes = IO.routes.replace(/ /gm, '');
6576 _this.routerParser.addIncompleteRoute({
6577 data: newRoutes,
6578 file: file
6579 });
6580 return true;
6581 }
6582 outputSymbols.routes = outputSymbols.routes.concat(newRoutes);
6583 }
6584 if (Ast.ts.isClassDeclaration(node)) {
6585 _this.processClass(node, file, srcFile, outputSymbols, fileBody);
6586 }
6587 if (Ast.ts.isExpressionStatement(node) || Ast.ts.isIfStatement(node)) {
6588 var bootstrapModuleReference = 'bootstrapModule';
6589 // Find the root module with bootstrapModule call
6590 // 1. find a simple call : platformBrowserDynamic().bootstrapModule(AppModule);
6591 // 2. or inside a call :
6592 // () => {
6593 // platformBrowserDynamic().bootstrapModule(AppModule);
6594 // });
6595 // 3. with a catch : platformBrowserDynamic().bootstrapModule(AppModule).catch(error => console.error(error));
6596 // 4. with parameters : platformBrowserDynamic().bootstrapModule(AppModule, {}).catch(error => console.error(error));
6597 // Find recusively in expression nodes one with name 'bootstrapModule'
6598 var rootModule_1;
6599 var resultNode = void 0;
6600 if (srcFile.text.indexOf(bootstrapModuleReference) !== -1) {
6601 if (node.expression) {
6602 resultNode = _this.findExpressionByNameInExpressions(node.expression, 'bootstrapModule');
6603 }
6604 if (typeof node.thenStatement !== 'undefined') {
6605 if (node.thenStatement.statements &&
6606 node.thenStatement.statements.length > 0) {
6607 var firstStatement = node.thenStatement.statements[0];
6608 resultNode = _this.findExpressionByNameInExpressions(firstStatement.expression, 'bootstrapModule');
6609 }
6610 }
6611 if (!resultNode) {
6612 if (node.expression &&
6613 node.expression.arguments &&
6614 node.expression.arguments.length > 0) {
6615 resultNode = _this.findExpressionByNameInExpressionArguments(node.expression.arguments, 'bootstrapModule');
6616 }
6617 }
6618 if (resultNode) {
6619 if (resultNode.arguments.length > 0) {
6620 _.forEach(resultNode.arguments, function (argument) {
6621 if (argument.text) {
6622 rootModule_1 = argument.text;
6623 }
6624 });
6625 }
6626 if (rootModule_1) {
6627 _this.routerParser.setRootModule(rootModule_1);
6628 }
6629 }
6630 }
6631 }
6632 if (Ast.ts.isVariableStatement(node) && !_this.routerParser.isVariableRoutes(node)) {
6633 var infos = _this.visitVariableDeclaration(node);
6634 var name = infos.name;
6635 var deps = {
6636 name: name,
6637 ctype: 'miscellaneous',
6638 subtype: 'variable',
6639 file: file
6640 };
6641 deps.type = infos.type ? infos.type : '';
6642 if (infos.defaultValue) {
6643 deps.defaultValue = infos.defaultValue;
6644 }
6645 if (infos.initializer) {
6646 deps.initializer = infos.initializer;
6647 }
6648 if (node.jsDoc && node.jsDoc.length > 0 && node.jsDoc[0].comment) {
6649 deps.description = marked$3(node.jsDoc[0].comment);
6650 }
6651 if (isModuleWithProviders(node)) {
6652 var routingInitializer = getModuleWithProviders(node);
6653 _this.routerParser.addModuleWithRoutes(name, [routingInitializer], file);
6654 _this.routerParser.addModule(name, [routingInitializer]);
6655 }
6656 if (!isIgnore(node)) {
6657 outputSymbols.miscellaneous.variables.push(deps);
6658 }
6659 }
6660 if (Ast.ts.isTypeAliasDeclaration(node)) {
6661 var infos = _this.visitTypeDeclaration(node);
6662 var name = infos.name;
6663 var deps = {
6664 name: name,
6665 ctype: 'miscellaneous',
6666 subtype: 'typealias',
6667 rawtype: _this.classHelper.visitType(node),
6668 file: file,
6669 description: _this.visitEnumTypeAliasFunctionDeclarationDescription(node)
6670 };
6671 if (node.type) {
6672 deps.kind = node.type.kind;
6673 }
6674 if (!isIgnore(node)) {
6675 outputSymbols.miscellaneous.typealiases.push(deps);
6676 }
6677 }
6678 if (Ast.ts.isFunctionDeclaration(node)) {
6679 var infos = _this.visitFunctionDeclaration(node);
6680 var name = infos.name;
6681 var functionDep = {
6682 name: name,
6683 ctype: 'miscellaneous',
6684 subtype: 'function',
6685 file: file,
6686 description: _this.visitEnumTypeAliasFunctionDeclarationDescription(node)
6687 };
6688 if (infos.args) {
6689 functionDep.args = infos.args;
6690 }
6691 if (infos.jsdoctags && infos.jsdoctags.length > 0) {
6692 functionDep.jsdoctags = infos.jsdoctags;
6693 }
6694 if (typeof infos.ignore === 'undefined') {
6695 outputSymbols.miscellaneous.functions.push(functionDep);
6696 }
6697 }
6698 if (Ast.ts.isEnumDeclaration(node)) {
6699 var infos = _this.visitEnumDeclaration(node);
6700 var name = node.name.text;
6701 var enumDeps = {
6702 name: name,
6703 childs: infos,
6704 ctype: 'miscellaneous',
6705 subtype: 'enum',
6706 description: _this.visitEnumTypeAliasFunctionDeclarationDescription(node),
6707 file: file
6708 };
6709 if (!isIgnore(node)) {
6710 outputSymbols.miscellaneous.enumerations.push(enumDeps);
6711 }
6712 }
6713 }
6714 };
6715 parseNode(fileName, scannedFile, initialNode);
6716 });
6717 };
6718 /**
6719 * Function to in a specific store an entity, and check before is there is not the same one
6720 * in that store : same name, id and file
6721 * @param entity Entity to store
6722 * @param store Store
6723 */
6724 AngularDependencies.prototype.addNewEntityInStore = function (entity, store) {
6725 var findSameEntityInStore = _.filter(store, {
6726 name: entity.name,
6727 id: entity.id,
6728 file: entity.file
6729 });
6730 if (findSameEntityInStore.length === 0) {
6731 store.push(entity);
6732 }
6733 };
6734 AngularDependencies.prototype.debug = function (deps) {
6735 if (deps) {
6736 logger.debug('found', "" + deps.name);
6737 }
6738 else {
6739 return;
6740 }
6741 ['imports', 'exports', 'declarations', 'providers', 'bootstrap'].forEach(function (symbols) {
6742 if (deps[symbols] && deps[symbols].length > 0) {
6743 logger.debug('', "- " + symbols + ":");
6744 deps[symbols].map(function (i) { return i.name; }).forEach(function (d) {
6745 logger.debug('', "\t- " + d);
6746 });
6747 }
6748 });
6749 };
6750 AngularDependencies.prototype.ignore = function (deps) {
6751 if (deps) {
6752 logger.warn('ignore', "" + deps.name);
6753 }
6754 else {
6755 return;
6756 }
6757 };
6758 AngularDependencies.prototype.findExpressionByNameInExpressions = function (entryNode, name) {
6759 var result;
6760 var loop = function (node, z) {
6761 if (node.expression && !node.expression.name) {
6762 loop(node.expression, z);
6763 }
6764 if (node.expression && node.expression.name) {
6765 if (node.expression.name.text === z) {
6766 result = node;
6767 }
6768 else {
6769 loop(node.expression, z);
6770 }
6771 }
6772 };
6773 loop(entryNode, name);
6774 return result;
6775 };
6776 AngularDependencies.prototype.findExpressionByNameInExpressionArguments = function (arg, name) {
6777 var result;
6778 var that = this;
6779 var i = 0;
6780 var len = arg.length;
6781 var loop = function (node, z) {
6782 if (node.body) {
6783 if (node.body.statements && node.body.statements.length > 0) {
6784 var j = 0;
6785 var leng = node.body.statements.length;
6786 for (j; j < leng; j++) {
6787 result = that.findExpressionByNameInExpressions(node.body.statements[j], z);
6788 }
6789 }
6790 }
6791 };
6792 for (i; i < len; i++) {
6793 loop(arg[i], name);
6794 }
6795 return result;
6796 };
6797 AngularDependencies.prototype.parseDecorators = function (decorators, type) {
6798 var result = false;
6799 if (decorators.length > 1) {
6800 _.forEach(decorators, function (decorator) {
6801 if (decorator.expression.expression) {
6802 if (decorator.expression.expression.text === type) {
6803 result = true;
6804 }
6805 }
6806 });
6807 }
6808 else {
6809 if (decorators[0].expression.expression) {
6810 if (decorators[0].expression.expression.text === type) {
6811 result = true;
6812 }
6813 }
6814 }
6815 return result;
6816 };
6817 AngularDependencies.prototype.parseDecorator = function (decorator, type) {
6818 var result = false;
6819 if (decorator.expression.expression) {
6820 if (decorator.expression.expression.text === type) {
6821 result = true;
6822 }
6823 }
6824 return result;
6825 };
6826 AngularDependencies.prototype.isController = function (metadata) {
6827 return this.parseDecorator(metadata, 'Controller');
6828 };
6829 AngularDependencies.prototype.isComponent = function (metadata) {
6830 return this.parseDecorator(metadata, 'Component');
6831 };
6832 AngularDependencies.prototype.isPipe = function (metadata) {
6833 return this.parseDecorator(metadata, 'Pipe');
6834 };
6835 AngularDependencies.prototype.isDirective = function (metadata) {
6836 return this.parseDecorator(metadata, 'Directive');
6837 };
6838 AngularDependencies.prototype.isInjectable = function (metadata) {
6839 return this.parseDecorator(metadata, 'Injectable');
6840 };
6841 AngularDependencies.prototype.isModule = function (metadata) {
6842 return this.parseDecorator(metadata, 'NgModule') || this.parseDecorator(metadata, 'Module');
6843 };
6844 AngularDependencies.prototype.hasInternalDecorator = function (metadatas) {
6845 return (this.parseDecorators(metadatas, 'Controller') ||
6846 this.parseDecorators(metadatas, 'Component') ||
6847 this.parseDecorators(metadatas, 'Pipe') ||
6848 this.parseDecorators(metadatas, 'Directive') ||
6849 this.parseDecorators(metadatas, 'Injectable') ||
6850 this.parseDecorators(metadatas, 'NgModule') ||
6851 this.parseDecorators(metadatas, 'Module'));
6852 };
6853 AngularDependencies.prototype.isGuard = function (ioImplements) {
6854 return (_.includes(ioImplements, 'CanActivate') ||
6855 _.includes(ioImplements, 'CanActivateChild') ||
6856 _.includes(ioImplements, 'CanDeactivate') ||
6857 _.includes(ioImplements, 'Resolve') ||
6858 _.includes(ioImplements, 'CanLoad'));
6859 };
6860 AngularDependencies.prototype.getSymboleName = function (node) {
6861 return node.name.text;
6862 };
6863 AngularDependencies.prototype.findProperties = function (visitedNode, sourceFile) {
6864 if (visitedNode.expression &&
6865 visitedNode.expression.arguments &&
6866 visitedNode.expression.arguments.length > 0) {
6867 var pop = visitedNode.expression.arguments[0];
6868 if (pop && pop.properties && pop.properties.length >= 0) {
6869 return pop.properties;
6870 }
6871 else if (pop && pop.kind && pop.kind === Ast.SyntaxKind.StringLiteral) {
6872 return [pop];
6873 }
6874 else {
6875 logger.warn('Empty metadatas, trying to found it with imports.');
6876 return this.importsUtil.findValueInImportOrLocalVariables(pop.text, sourceFile);
6877 }
6878 }
6879 return [];
6880 };
6881 AngularDependencies.prototype.isAngularLifecycleHook = function (methodName) {
6882 /**
6883 * Copyright https://github.com/ng-bootstrap/ng-bootstrap
6884 */
6885 var ANGULAR_LIFECYCLE_METHODS = [
6886 'ngOnInit',
6887 'ngOnChanges',
6888 'ngDoCheck',
6889 'ngOnDestroy',
6890 'ngAfterContentInit',
6891 'ngAfterContentChecked',
6892 'ngAfterViewInit',
6893 'ngAfterViewChecked',
6894 'writeValue',
6895 'registerOnChange',
6896 'registerOnTouched',
6897 'setDisabledState'
6898 ];
6899 return ANGULAR_LIFECYCLE_METHODS.indexOf(methodName) >= 0;
6900 };
6901 AngularDependencies.prototype.visitTypeDeclaration = function (node) {
6902 var result = {
6903 name: node.name.text,
6904 kind: node.kind
6905 };
6906 var jsdoctags = this.jsdocParserUtil.getJSDocs(node);
6907 if (jsdoctags && jsdoctags.length >= 1) {
6908 if (jsdoctags[0].tags) {
6909 result.jsdoctags = markedtags(jsdoctags[0].tags);
6910 }
6911 }
6912 return result;
6913 };
6914 AngularDependencies.prototype.visitArgument = function (arg) {
6915 var result = {
6916 name: arg.name.text,
6917 type: this.classHelper.visitType(arg)
6918 };
6919 if (arg.dotDotDotToken) {
6920 result.dotDotDotToken = true;
6921 }
6922 if (arg.questionToken) {
6923 result.optional = true;
6924 }
6925 if (arg.type) {
6926 result.type = this.mapType(arg.type.kind);
6927 if (arg.type.kind === 157) {
6928 // try replace TypeReference with typeName
6929 if (arg.type.typeName) {
6930 result.type = arg.type.typeName.text;
6931 }
6932 }
6933 }
6934 return result;
6935 };
6936 AngularDependencies.prototype.mapType = function (type) {
6937 switch (type) {
6938 case 95:
6939 return 'null';
6940 case 119:
6941 return 'any';
6942 case 122:
6943 return 'boolean';
6944 case 130:
6945 return 'never';
6946 case 133:
6947 return 'number';
6948 case 136:
6949 return 'string';
6950 case 139:
6951 return 'undefined';
6952 case 159:
6953 return 'typeReference';
6954 }
6955 };
6956 AngularDependencies.prototype.visitFunctionDeclaration = function (method) {
6957 var _this = this;
6958 var result = {
6959 name: method.name.text,
6960 args: method.parameters ? method.parameters.map(function (prop) { return _this.visitArgument(prop); }) : []
6961 };
6962 var jsdoctags = this.jsdocParserUtil.getJSDocs(method);
6963 if (typeof method.type !== 'undefined') {
6964 result.returnType = this.classHelper.visitType(method.type);
6965 }
6966 if (method.modifiers) {
6967 if (method.modifiers.length > 0) {
6968 var kinds = method.modifiers
6969 .map(function (modifier) {
6970 return modifier.kind;
6971 })
6972 .reverse();
6973 if (_.indexOf(kinds, Ast.SyntaxKind.PublicKeyword) !== -1 &&
6974 _.indexOf(kinds, Ast.SyntaxKind.StaticKeyword) !== -1) {
6975 kinds = kinds.filter(function (kind) { return kind !== Ast.SyntaxKind.PublicKeyword; });
6976 }
6977 }
6978 }
6979 if (jsdoctags && jsdoctags.length >= 1) {
6980 if (jsdoctags[0].tags) {
6981 result.jsdoctags = markedtags(jsdoctags[0].tags);
6982 _.forEach(jsdoctags[0].tags, function (tag) {
6983 if (tag.tagName) {
6984 if (tag.tagName.text) {
6985 if (tag.tagName.text.indexOf('ignore') > -1) {
6986 result.ignore = true;
6987 }
6988 }
6989 }
6990 });
6991 }
6992 }
6993 if (result.jsdoctags && result.jsdoctags.length > 0) {
6994 result.jsdoctags = mergeTagsAndArgs(result.args, result.jsdoctags);
6995 }
6996 else if (result.args.length > 0) {
6997 result.jsdoctags = mergeTagsAndArgs(result.args);
6998 }
6999 return result;
7000 };
7001 AngularDependencies.prototype.visitVariableDeclaration = function (node) {
7002 if (node.declarationList.declarations) {
7003 var i = 0;
7004 var len = node.declarationList.declarations.length;
7005 for (i; i < len; i++) {
7006 var result = {
7007 name: node.declarationList.declarations[i].name.text,
7008 defaultValue: node.declarationList.declarations[i].initializer
7009 ? this.classHelper.stringifyDefaultValue(node.declarationList.declarations[i].initializer)
7010 : undefined
7011 };
7012 if (node.declarationList.declarations[i].initializer) {
7013 result.initializer = node.declarationList.declarations[i].initializer;
7014 }
7015 if (node.declarationList.declarations[i].type) {
7016 result.type = this.classHelper.visitType(node.declarationList.declarations[i].type);
7017 }
7018 if (typeof result.type === 'undefined' && result.initializer) {
7019 result.type = kindToType(result.initializer.kind);
7020 }
7021 return result;
7022 }
7023 }
7024 };
7025 AngularDependencies.prototype.visitFunctionDeclarationJSDocTags = function (node) {
7026 var jsdoctags = this.jsdocParserUtil.getJSDocs(node);
7027 var result;
7028 if (jsdoctags && jsdoctags.length >= 1) {
7029 if (jsdoctags[0].tags) {
7030 result = markedtags(jsdoctags[0].tags);
7031 }
7032 }
7033 return result;
7034 };
7035 AngularDependencies.prototype.visitEnumTypeAliasFunctionDeclarationDescription = function (node) {
7036 var description = '';
7037 if (node.jsDoc) {
7038 if (node.jsDoc.length > 0) {
7039 if (typeof node.jsDoc[0].comment !== 'undefined') {
7040 description = marked$3(node.jsDoc[0].comment);
7041 }
7042 }
7043 }
7044 return description;
7045 };
7046 AngularDependencies.prototype.visitEnumDeclaration = function (node) {
7047 var result = [];
7048 if (node.members) {
7049 var i = 0;
7050 var len = node.members.length;
7051 for (i; i < len; i++) {
7052 var member = {
7053 name: node.members[i].name.text
7054 };
7055 if (node.members[i].initializer) {
7056 member.value = node.members[i].initializer.text;
7057 }
7058 result.push(member);
7059 }
7060 }
7061 return result;
7062 };
7063 AngularDependencies.prototype.visitEnumDeclarationForRoutes = function (fileName, node) {
7064 if (node.declarationList.declarations) {
7065 var i = 0;
7066 var len = node.declarationList.declarations.length;
7067 for (i; i < len; i++) {
7068 var routesInitializer = node.declarationList.declarations[i].initializer;
7069 var data = new CodeGenerator().generate(routesInitializer);
7070 this.routerParser.addRoute({
7071 name: node.declarationList.declarations[i].name.text,
7072 data: this.routerParser.cleanRawRoute(data),
7073 filename: fileName
7074 });
7075 return [
7076 {
7077 routes: data
7078 }
7079 ];
7080 }
7081 }
7082 return [];
7083 };
7084 AngularDependencies.prototype.getRouteIO = function (filename, sourceFile, node) {
7085 var _this = this;
7086 var res;
7087 if (sourceFile.statements) {
7088 res = sourceFile.statements.reduce(function (directive, statement) {
7089 if (_this.routerParser.isVariableRoutes(statement)) {
7090 if (statement.pos === node.pos && statement.end === node.end) {
7091 return directive.concat(_this.visitEnumDeclarationForRoutes(filename, statement));
7092 }
7093 }
7094 return directive;
7095 }, []);
7096 return res[0] || {};
7097 }
7098 else {
7099 return {};
7100 }
7101 };
7102 AngularDependencies.prototype.getClassIO = function (filename, sourceFile, node, fileBody) {
7103 var _this = this;
7104 /**
7105 * Copyright https://github.com/ng-bootstrap/ng-bootstrap
7106 */
7107 var reducedSource = fileBody ? fileBody.statements : sourceFile.statements;
7108 var res = reducedSource.reduce(function (directive, statement) {
7109 if (Ast.ts.isClassDeclaration(statement)) {
7110 if (statement.pos === node.pos && statement.end === node.end) {
7111 return directive.concat(_this.classHelper.visitClassDeclaration(filename, statement, sourceFile));
7112 }
7113 }
7114 return directive;
7115 }, []);
7116 return res[0] || {};
7117 };
7118 AngularDependencies.prototype.getInterfaceIO = function (filename, sourceFile, node, fileBody) {
7119 var _this = this;
7120 /**
7121 * Copyright https://github.com/ng-bootstrap/ng-bootstrap
7122 */
7123 var reducedSource = fileBody ? fileBody.statements : sourceFile.statements;
7124 var res = reducedSource.reduce(function (directive, statement) {
7125 if (Ast.ts.isInterfaceDeclaration(statement)) {
7126 if (statement.pos === node.pos && statement.end === node.end) {
7127 return directive.concat(_this.classHelper.visitClassDeclaration(filename, statement, sourceFile));
7128 }
7129 }
7130 return directive;
7131 }, []);
7132 return res[0] || {};
7133 };
7134 return AngularDependencies;
7135}(FrameworkDependencies));
7136
7137var AngularJSDependencies = /** @class */ (function (_super) {
7138 __extends(AngularJSDependencies, _super);
7139 function AngularJSDependencies(files, options, configuration, routerParser) {
7140 var _this = _super.call(this, files, options, configuration, routerParser) || this;
7141 _this.cache = new ComponentCache();
7142 _this.moduleHelper = new ModuleHelper(_this.cache);
7143 _this.jsDocHelper = new JsDocHelper();
7144 _this.symbolHelper = new SymbolHelper();
7145 _this.jsdocParserUtil = new JsdocParserUtil();
7146 _this.importsUtil = new ImportsUtil();
7147 return _this;
7148 }
7149 AngularJSDependencies.prototype.getDependencies = function () {
7150 var deps = {
7151 modules: [],
7152 modulesForGraph: [],
7153 components: [],
7154 injectables: [],
7155 interceptors: [],
7156 pipes: [],
7157 directives: [],
7158 routes: [],
7159 classes: [],
7160 interfaces: [],
7161 miscellaneous: {
7162 variables: [],
7163 functions: [],
7164 typealiases: [],
7165 enumerations: []
7166 },
7167 routesTree: undefined
7168 };
7169 return deps;
7170 };
7171 return AngularJSDependencies;
7172}(FrameworkDependencies));
7173
7174function promiseSequential(promises) {
7175 if (!Array.isArray(promises)) {
7176 throw new Error('First argument need to be an array of Promises');
7177 }
7178 return new Promise(function (resolve, reject) {
7179 var count = 0;
7180 var results = [];
7181 var iterateeFunc = function (previousPromise, currentPromise) {
7182 return previousPromise
7183 .then(function (result) {
7184 if (count++ !== 0) {
7185 results = results.concat(result);
7186 }
7187 return currentPromise(result, results, count);
7188 })
7189 .catch(function (err) {
7190 return reject(err);
7191 });
7192 };
7193 promises = promises.concat(function () { return Promise.resolve(); });
7194 promises
7195 .reduce(iterateeFunc, Promise.resolve(false))
7196 .then(function (res) {
7197 resolve(results);
7198 });
7199 });
7200}
7201
7202var traverse$2 = require('traverse');
7203var DependenciesEngine = /** @class */ (function () {
7204 function DependenciesEngine() {
7205 this.angularApiUtil = new AngularApiUtil();
7206 }
7207 DependenciesEngine.prototype.cleanModules = function (modules) {
7208 var _m = modules;
7209 var i = 0;
7210 var len = modules.length;
7211 for (i; i < len; i++) {
7212 var j = 0;
7213 var leng = _m[i].declarations.length;
7214 for (j; j < leng; j++) {
7215 var k = 0;
7216 var lengt = void 0;
7217 if (_m[i].declarations[j].jsdoctags) {
7218 lengt = _m[i].declarations[j].jsdoctags.length;
7219 for (k; k < lengt; k++) {
7220 delete _m[i].declarations[j].jsdoctags[k].parent;
7221 }
7222 }
7223 if (_m[i].declarations[j].constructorObj) {
7224 if (_m[i].declarations[j].constructorObj.jsdoctags) {
7225 lengt = _m[i].declarations[j].constructorObj.jsdoctags.length;
7226 for (k; k < lengt; k++) {
7227 delete _m[i].declarations[j].constructorObj.jsdoctags[k].parent;
7228 }
7229 }
7230 }
7231 }
7232 }
7233 return _m;
7234 };
7235 DependenciesEngine.prototype.updateModulesDeclarationsExportsTypes = function () {
7236 var _this = this;
7237 var _m = this.modules, len = this.modules.length;
7238 var mergeTypes = function (entry) {
7239 var directive = _this.findInCompodocDependencies(entry.name, _this.directives, entry.file);
7240 if (typeof directive.data !== 'undefined') {
7241 entry.type = 'directive';
7242 entry.id = directive.data.id;
7243 }
7244 var component = _this.findInCompodocDependencies(entry.name, _this.components, entry.file);
7245 if (typeof component.data !== 'undefined') {
7246 entry.type = 'component';
7247 entry.id = component.data.id;
7248 }
7249 var pipe = _this.findInCompodocDependencies(entry.name, _this.pipes, entry.file);
7250 if (typeof pipe.data !== 'undefined') {
7251 entry.type = 'pipe';
7252 entry.id = pipe.data.id;
7253 }
7254 };
7255 this.modules.forEach(function (module) {
7256 module.declarations.forEach(function (declaration) {
7257 mergeTypes(declaration);
7258 });
7259 module.exports.forEach(function (expt) {
7260 mergeTypes(expt);
7261 });
7262 module.entryComponents.forEach(function (ent) {
7263 mergeTypes(ent);
7264 });
7265 });
7266 };
7267 DependenciesEngine.prototype.init = function (data) {
7268 traverse$2(data).forEach(function (node) {
7269 if (node) {
7270 if (node.parent)
7271 delete node.parent;
7272 if (node.initializer)
7273 delete node.initializer;
7274 }
7275 });
7276 this.rawData = data;
7277 this.modules = _.sortBy(this.rawData.modules, ['name']);
7278 this.rawModulesForOverview = _.sortBy(data.modulesForGraph, ['name']);
7279 this.rawModules = _.sortBy(data.modulesForGraph, ['name']);
7280 this.components = _.sortBy(this.rawData.components, ['name']);
7281 this.controllers = _.sortBy(this.rawData.controllers, ['name']);
7282 this.directives = _.sortBy(this.rawData.directives, ['name']);
7283 this.injectables = _.sortBy(this.rawData.injectables, ['name']);
7284 this.interceptors = _.sortBy(this.rawData.interceptors, ['name']);
7285 this.guards = _.sortBy(this.rawData.guards, ['name']);
7286 this.interfaces = _.sortBy(this.rawData.interfaces, ['name']);
7287 this.pipes = _.sortBy(this.rawData.pipes, ['name']);
7288 this.classes = _.sortBy(this.rawData.classes, ['name']);
7289 this.miscellaneous = this.rawData.miscellaneous;
7290 this.prepareMiscellaneous();
7291 this.updateModulesDeclarationsExportsTypes();
7292 this.routes = this.rawData.routesTree;
7293 this.manageDuplicatesName();
7294 this.cleanRawModulesNames();
7295 };
7296 DependenciesEngine.prototype.cleanRawModulesNames = function () {
7297 this.rawModulesForOverview = this.rawModulesForOverview.map(function (module) {
7298 module.name = module.name.replace('$', '');
7299 return module;
7300 });
7301 };
7302 DependenciesEngine.prototype.findInCompodocDependencies = function (name, data, file) {
7303 var _result = {
7304 source: 'internal',
7305 data: undefined
7306 };
7307 for (var i = 0; i < data.length; i++) {
7308 if (typeof name !== 'undefined') {
7309 if (typeof file !== 'undefined') {
7310 if (name.indexOf(data[i].name) !== -1 && file.replace(/\\/g, '/').indexOf(data[i].file) !== -1) {
7311 _result.data = data[i];
7312 }
7313 }
7314 else {
7315 if (name.indexOf(data[i].name) !== -1) {
7316 _result.data = data[i];
7317 }
7318 }
7319 }
7320 }
7321 return _result;
7322 };
7323 DependenciesEngine.prototype.manageDuplicatesName = function () {
7324 var processDuplicates = function (element, index, array) {
7325 var elementsWithSameName = _.filter(array, { name: element.name });
7326 if (elementsWithSameName.length > 1) {
7327 // First element is the reference for duplicates
7328 for (var i = 1; i < elementsWithSameName.length; i++) {
7329 var elementToEdit = elementsWithSameName[i];
7330 if (typeof elementToEdit.isDuplicate === 'undefined') {
7331 elementToEdit.isDuplicate = true;
7332 elementToEdit.duplicateId = i;
7333 elementToEdit.duplicateName = elementToEdit.name + '-' + elementToEdit.duplicateId;
7334 elementToEdit.id = elementToEdit.id + '-' + elementToEdit.duplicateId;
7335 }
7336 }
7337 }
7338 return element;
7339 };
7340 this.classes = this.classes.map(processDuplicates);
7341 this.interfaces = this.interfaces.map(processDuplicates);
7342 this.injectables = this.injectables.map(processDuplicates);
7343 this.pipes = this.pipes.map(processDuplicates);
7344 this.interceptors = this.interceptors.map(processDuplicates);
7345 this.guards = this.guards.map(processDuplicates);
7346 this.modules = this.modules.map(processDuplicates);
7347 this.components = this.components.map(processDuplicates);
7348 this.controllers = this.controllers.map(processDuplicates);
7349 this.directives = this.directives.map(processDuplicates);
7350 };
7351 DependenciesEngine.prototype.find = function (name) {
7352 var _this = this;
7353 var searchFunctions = [
7354 function () { return _this.findInCompodocDependencies(name, _this.injectables); },
7355 function () { return _this.findInCompodocDependencies(name, _this.interceptors); },
7356 function () { return _this.findInCompodocDependencies(name, _this.guards); },
7357 function () { return _this.findInCompodocDependencies(name, _this.interfaces); },
7358 function () { return _this.findInCompodocDependencies(name, _this.classes); },
7359 function () { return _this.findInCompodocDependencies(name, _this.components); },
7360 function () { return _this.findInCompodocDependencies(name, _this.controllers); },
7361 function () { return _this.findInCompodocDependencies(name, _this.miscellaneous.variables); },
7362 function () { return _this.findInCompodocDependencies(name, _this.miscellaneous.functions); },
7363 function () { return _this.findInCompodocDependencies(name, _this.miscellaneous.typealiases); },
7364 function () { return _this.findInCompodocDependencies(name, _this.miscellaneous.enumerations); },
7365 function () { return _this.angularApiUtil.findApi(name); }
7366 ];
7367 for (var _i = 0, searchFunctions_1 = searchFunctions; _i < searchFunctions_1.length; _i++) {
7368 var searchFunction = searchFunctions_1[_i];
7369 var result = searchFunction();
7370 if (result.data) {
7371 return result;
7372 }
7373 }
7374 return undefined;
7375 };
7376 DependenciesEngine.prototype.update = function (updatedData) {
7377 var _this = this;
7378 if (updatedData.modules.length > 0) {
7379 _.forEach(updatedData.modules, function (module) {
7380 var _index = _.findIndex(_this.modules, { name: module.name });
7381 _this.modules[_index] = module;
7382 });
7383 }
7384 if (updatedData.components.length > 0) {
7385 _.forEach(updatedData.components, function (component) {
7386 var _index = _.findIndex(_this.components, { name: component.name });
7387 _this.components[_index] = component;
7388 });
7389 }
7390 if (updatedData.controllers.length > 0) {
7391 _.forEach(updatedData.controllers, function (controller) {
7392 var _index = _.findIndex(_this.controllers, { name: controller.name });
7393 _this.controllers[_index] = controller;
7394 });
7395 }
7396 if (updatedData.directives.length > 0) {
7397 _.forEach(updatedData.directives, function (directive) {
7398 var _index = _.findIndex(_this.directives, { name: directive.name });
7399 _this.directives[_index] = directive;
7400 });
7401 }
7402 if (updatedData.injectables.length > 0) {
7403 _.forEach(updatedData.injectables, function (injectable) {
7404 var _index = _.findIndex(_this.injectables, { name: injectable.name });
7405 _this.injectables[_index] = injectable;
7406 });
7407 }
7408 if (updatedData.interceptors.length > 0) {
7409 _.forEach(updatedData.interceptors, function (interceptor) {
7410 var _index = _.findIndex(_this.interceptors, { name: interceptor.name });
7411 _this.interceptors[_index] = interceptor;
7412 });
7413 }
7414 if (updatedData.guards.length > 0) {
7415 _.forEach(updatedData.guards, function (guard) {
7416 var _index = _.findIndex(_this.guards, { name: guard.name });
7417 _this.guards[_index] = guard;
7418 });
7419 }
7420 if (updatedData.interfaces.length > 0) {
7421 _.forEach(updatedData.interfaces, function (int) {
7422 var _index = _.findIndex(_this.interfaces, { name: int.name });
7423 _this.interfaces[_index] = int;
7424 });
7425 }
7426 if (updatedData.pipes.length > 0) {
7427 _.forEach(updatedData.pipes, function (pipe) {
7428 var _index = _.findIndex(_this.pipes, { name: pipe.name });
7429 _this.pipes[_index] = pipe;
7430 });
7431 }
7432 if (updatedData.classes.length > 0) {
7433 _.forEach(updatedData.classes, function (classe) {
7434 var _index = _.findIndex(_this.classes, { name: classe.name });
7435 _this.classes[_index] = classe;
7436 });
7437 }
7438 /**
7439 * Miscellaneous update
7440 */
7441 if (updatedData.miscellaneous.variables.length > 0) {
7442 _.forEach(updatedData.miscellaneous.variables, function (variable) {
7443 var _index = _.findIndex(_this.miscellaneous.variables, {
7444 name: variable.name,
7445 file: variable.file
7446 });
7447 _this.miscellaneous.variables[_index] = variable;
7448 });
7449 }
7450 if (updatedData.miscellaneous.functions.length > 0) {
7451 _.forEach(updatedData.miscellaneous.functions, function (func) {
7452 var _index = _.findIndex(_this.miscellaneous.functions, {
7453 name: func.name,
7454 file: func.file
7455 });
7456 _this.miscellaneous.functions[_index] = func;
7457 });
7458 }
7459 if (updatedData.miscellaneous.typealiases.length > 0) {
7460 _.forEach(updatedData.miscellaneous.typealiases, function (typealias) {
7461 var _index = _.findIndex(_this.miscellaneous.typealiases, {
7462 name: typealias.name,
7463 file: typealias.file
7464 });
7465 _this.miscellaneous.typealiases[_index] = typealias;
7466 });
7467 }
7468 if (updatedData.miscellaneous.enumerations.length > 0) {
7469 _.forEach(updatedData.miscellaneous.enumerations, function (enumeration) {
7470 var _index = _.findIndex(_this.miscellaneous.enumerations, {
7471 name: enumeration.name,
7472 file: enumeration.file
7473 });
7474 _this.miscellaneous.enumerations[_index] = enumeration;
7475 });
7476 }
7477 this.prepareMiscellaneous();
7478 };
7479 DependenciesEngine.prototype.findInCompodoc = function (name) {
7480 var mergedData = _.concat([], this.modules, this.components, this.controllers, this.directives, this.injectables, this.interceptors, this.guards, this.interfaces, this.pipes, this.classes, this.miscellaneous.enumerations, this.miscellaneous.typealiases, this.miscellaneous.variables, this.miscellaneous.functions);
7481 var result = _.find(mergedData, { name: name });
7482 return result || false;
7483 };
7484 DependenciesEngine.prototype.prepareMiscellaneous = function () {
7485 this.miscellaneous.variables.sort(getNamesCompareFn());
7486 this.miscellaneous.functions.sort(getNamesCompareFn());
7487 this.miscellaneous.enumerations.sort(getNamesCompareFn());
7488 this.miscellaneous.typealiases.sort(getNamesCompareFn());
7489 // group each subgoup by file
7490 this.miscellaneous.groupedVariables = _.groupBy(this.miscellaneous.variables, 'file');
7491 this.miscellaneous.groupedFunctions = _.groupBy(this.miscellaneous.functions, 'file');
7492 this.miscellaneous.groupedEnumerations = _.groupBy(this.miscellaneous.enumerations, 'file');
7493 this.miscellaneous.groupedTypeAliases = _.groupBy(this.miscellaneous.typealiases, 'file');
7494 };
7495 DependenciesEngine.prototype.getModule = function (name) {
7496 return _.find(this.modules, ['name', name]);
7497 };
7498 DependenciesEngine.prototype.getRawModule = function (name) {
7499 return _.find(this.rawModules, ['name', name]);
7500 };
7501 DependenciesEngine.prototype.getModules = function () {
7502 return this.modules;
7503 };
7504 DependenciesEngine.prototype.getComponents = function () {
7505 return this.components;
7506 };
7507 DependenciesEngine.prototype.getControllers = function () {
7508 return this.controllers;
7509 };
7510 DependenciesEngine.prototype.getDirectives = function () {
7511 return this.directives;
7512 };
7513 DependenciesEngine.prototype.getInjectables = function () {
7514 return this.injectables;
7515 };
7516 DependenciesEngine.prototype.getInterceptors = function () {
7517 return this.interceptors;
7518 };
7519 DependenciesEngine.prototype.getGuards = function () {
7520 return this.guards;
7521 };
7522 DependenciesEngine.prototype.getInterfaces = function () {
7523 return this.interfaces;
7524 };
7525 DependenciesEngine.prototype.getRoutes = function () {
7526 return this.routes;
7527 };
7528 DependenciesEngine.prototype.getPipes = function () {
7529 return this.pipes;
7530 };
7531 DependenciesEngine.prototype.getClasses = function () {
7532 return this.classes;
7533 };
7534 DependenciesEngine.prototype.getMiscellaneous = function () {
7535 return this.miscellaneous;
7536 };
7537 return DependenciesEngine;
7538}());
7539
7540var chokidar = require('chokidar');
7541var marked$4 = require('marked');
7542var traverse$3 = require('traverse');
7543var cwd = process.cwd();
7544var $markdownengine = new MarkdownEngine();
7545var startTime = new Date();
7546var generationPromiseResolve;
7547var generationPromiseReject;
7548var generationPromise = new Promise(function (resolve, reject) {
7549 generationPromiseResolve = resolve;
7550 generationPromiseReject = reject;
7551});
7552var Application = /** @class */ (function () {
7553 /**
7554 * Create a new compodoc application instance.
7555 *
7556 * @param options An object containing the options that should be used.
7557 */
7558 function Application(options) {
7559 var _this = this;
7560 /**
7561 * Files changed during watch scanning
7562 */
7563 this.watchChangedFiles = [];
7564 /**
7565 * Boolean for watching status
7566 * @type {boolean}
7567 */
7568 this.isWatching = false;
7569 /**
7570 * Store package.json data
7571 */
7572 this.packageJsonData = {};
7573 this.angularVersionUtil = new AngularVersionUtil();
7574 this.fileEngine = new FileEngine();
7575 this.routerParser = new RouterParserUtil();
7576 this.preparePipes = function (somePipes) {
7577 logger.info('Prepare pipes');
7578 _this.configuration.mainData.pipes = somePipes
7579 ? somePipes
7580 : _this.dependenciesEngine.getPipes();
7581 return new Promise(function (resolve, reject) {
7582 var i = 0;
7583 var len = _this.configuration.mainData.pipes.length;
7584 var loop = function () {
7585 if (i < len) {
7586 var pipe = _this.configuration.mainData.pipes[i];
7587 if ($markdownengine.hasNeighbourReadmeFile(pipe.file)) {
7588 logger.info(" " + pipe.name + " has a README file, include it");
7589 var readme = $markdownengine.readNeighbourReadmeFile(pipe.file);
7590 pipe.readme = marked$4(readme);
7591 }
7592 var page = {
7593 path: 'pipes',
7594 name: pipe.name,
7595 id: pipe.id,
7596 navTabs: _this.getNavTabs(pipe),
7597 context: 'pipe',
7598 pipe: pipe,
7599 depth: 1,
7600 pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
7601 };
7602 if (pipe.isDuplicate) {
7603 page.name += '-' + pipe.duplicateId;
7604 }
7605 _this.configuration.addPage(page);
7606 i++;
7607 loop();
7608 }
7609 else {
7610 resolve();
7611 }
7612 };
7613 loop();
7614 });
7615 };
7616 this.prepareClasses = function (someClasses) {
7617 logger.info('Prepare classes');
7618 _this.configuration.mainData.classes = someClasses
7619 ? someClasses
7620 : _this.dependenciesEngine.getClasses();
7621 return new Promise(function (resolve, reject) {
7622 var i = 0;
7623 var len = _this.configuration.mainData.classes.length;
7624 var loop = function () {
7625 if (i < len) {
7626 var classe = _this.configuration.mainData.classes[i];
7627 if ($markdownengine.hasNeighbourReadmeFile(classe.file)) {
7628 logger.info(" " + classe.name + " has a README file, include it");
7629 var readme = $markdownengine.readNeighbourReadmeFile(classe.file);
7630 classe.readme = marked$4(readme);
7631 }
7632 var page = {
7633 path: 'classes',
7634 name: classe.name,
7635 id: classe.id,
7636 navTabs: _this.getNavTabs(classe),
7637 context: 'class',
7638 class: classe,
7639 depth: 1,
7640 pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
7641 };
7642 if (classe.isDuplicate) {
7643 page.name += '-' + classe.duplicateId;
7644 }
7645 _this.configuration.addPage(page);
7646 i++;
7647 loop();
7648 }
7649 else {
7650 resolve();
7651 }
7652 };
7653 loop();
7654 });
7655 };
7656 this.configuration = new Configuration();
7657 this.dependenciesEngine = new DependenciesEngine();
7658 this.ngdEngine = new NgdEngine(this.dependenciesEngine);
7659 this.htmlEngine = new HtmlEngine(this.configuration, this.dependenciesEngine, this.fileEngine);
7660 this.searchEngine = new SearchEngine(this.configuration, this.fileEngine);
7661 this.exportEngine = new ExportEngine(this.configuration, this.dependenciesEngine, this.fileEngine);
7662 for (var option in options) {
7663 if (typeof this.configuration.mainData[option] !== 'undefined') {
7664 this.configuration.mainData[option] = options[option];
7665 }
7666 // For documentationMainName, process it outside the loop, for handling conflict with pages name
7667 if (option === 'name') {
7668 this.configuration.mainData.documentationMainName = options[option];
7669 }
7670 // For documentationMainName, process it outside the loop, for handling conflict with pages name
7671 if (option === 'silent') {
7672 logger.silent = false;
7673 }
7674 }
7675 }
7676 /**
7677 * Start compodoc process
7678 */
7679 Application.prototype.generate = function () {
7680 var _this = this;
7681 process.on('unhandledRejection', this.unhandledRejectionListener);
7682 process.on('uncaughtException', this.uncaughtExceptionListener);
7683 I18nEngineInstance.init(this.configuration.mainData.language);
7684 if (this.configuration.mainData.output.charAt(this.configuration.mainData.output.length - 1) !== '/') {
7685 this.configuration.mainData.output += '/';
7686 }
7687 if (this.configuration.mainData.exportFormat !== COMPODOC_DEFAULTS.exportFormat) {
7688 this.processPackageJson();
7689 }
7690 else {
7691 this.htmlEngine.init(this.configuration.mainData.templates).then(function () { return _this.processPackageJson(); });
7692 }
7693 return generationPromise;
7694 };
7695 Application.prototype.endCallback = function () {
7696 process.removeListener('unhandledRejection', this.unhandledRejectionListener);
7697 process.removeListener('uncaughtException', this.uncaughtExceptionListener);
7698 };
7699 Application.prototype.unhandledRejectionListener = function (err, p) {
7700 console.log('Unhandled Rejection at:', p, 'reason:', err);
7701 logger.error('Sorry, but there was a problem during parsing or generation of the documentation. Please fill an issue on github. (https://github.com/compodoc/compodoc/issues/new)'); // tslint:disable-line
7702 process.exit(1);
7703 };
7704 Application.prototype.uncaughtExceptionListener = function (err) {
7705 logger.error(err);
7706 logger.error('Sorry, but there was a problem during parsing or generation of the documentation. Please fill an issue on github. (https://github.com/compodoc/compodoc/issues/new)'); // tslint:disable-line
7707 process.exit(1);
7708 };
7709 /**
7710 * Start compodoc documentation coverage
7711 */
7712 Application.prototype.testCoverage = function () {
7713 this.getDependenciesData();
7714 };
7715 /**
7716 * Store files for initial processing
7717 * @param {Array<string>} files Files found during source folder and tsconfig scan
7718 */
7719 Application.prototype.setFiles = function (files) {
7720 this.files = files;
7721 };
7722 /**
7723 * Store files for watch processing
7724 * @param {Array<string>} files Files found during source folder and tsconfig scan
7725 */
7726 Application.prototype.setUpdatedFiles = function (files) {
7727 this.updatedFiles = files;
7728 };
7729 /**
7730 * Return a boolean indicating presence of one TypeScript file in updatedFiles list
7731 * @return {boolean} Result of scan
7732 */
7733 Application.prototype.hasWatchedFilesTSFiles = function () {
7734 var result = false;
7735 _.forEach(this.updatedFiles, function (file) {
7736 if (path.extname(file) === '.ts') {
7737 result = true;
7738 }
7739 });
7740 return result;
7741 };
7742 /**
7743 * Return a boolean indicating presence of one root markdown files in updatedFiles list
7744 * @return {boolean} Result of scan
7745 */
7746 Application.prototype.hasWatchedFilesRootMarkdownFiles = function () {
7747 var result = false;
7748 _.forEach(this.updatedFiles, function (file) {
7749 if (path.extname(file) === '.md' && path.dirname(file) === process.cwd()) {
7750 result = true;
7751 }
7752 });
7753 return result;
7754 };
7755 /**
7756 * Clear files for watch processing
7757 */
7758 Application.prototype.clearUpdatedFiles = function () {
7759 this.updatedFiles = [];
7760 this.watchChangedFiles = [];
7761 };
7762 Application.prototype.processPackageJson = function () {
7763 var _this = this;
7764 logger.info('Searching package.json file');
7765 this.fileEngine.get(process.cwd() + path.sep + 'package.json').then(function (packageData) {
7766 var parsedData = JSON.parse(packageData);
7767 _this.packageJsonData = parsedData;
7768 if (typeof parsedData.name !== 'undefined' &&
7769 _this.configuration.mainData.documentationMainName === COMPODOC_DEFAULTS.title) {
7770 _this.configuration.mainData.documentationMainName =
7771 parsedData.name + ' documentation';
7772 }
7773 if (typeof parsedData.description !== 'undefined') {
7774 _this.configuration.mainData.documentationMainDescription =
7775 parsedData.description;
7776 }
7777 _this.configuration.mainData.angularVersion = _this.angularVersionUtil.getAngularVersionOfProject(parsedData);
7778 logger.info('package.json file found');
7779 if (typeof parsedData.dependencies !== 'undefined') {
7780 _this.processPackageDependencies(parsedData.dependencies);
7781 }
7782 if (typeof parsedData.peerDependencies !== 'undefined') {
7783 _this.processPackagePeerDependencies(parsedData.peerDependencies);
7784 }
7785 _this.processMarkdowns().then(function () {
7786 _this.getDependenciesData();
7787 }, function (errorMessage) {
7788 logger.error(errorMessage);
7789 });
7790 }, function (errorMessage) {
7791 logger.error(errorMessage);
7792 logger.error('Continuing without package.json file');
7793 _this.processMarkdowns().then(function () {
7794 _this.getDependenciesData();
7795 }, function (errorMessage1) {
7796 logger.error(errorMessage1);
7797 });
7798 });
7799 };
7800 Application.prototype.processPackagePeerDependencies = function (dependencies) {
7801 logger.info('Processing package.json peerDependencies');
7802 this.configuration.mainData.packagePeerDependencies = dependencies;
7803 if (!this.configuration.hasPage('dependencies')) {
7804 this.configuration.addPage({
7805 name: 'dependencies',
7806 id: 'packageDependencies',
7807 context: 'package-dependencies',
7808 depth: 0,
7809 pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
7810 });
7811 }
7812 };
7813 Application.prototype.processPackageDependencies = function (dependencies) {
7814 logger.info('Processing package.json dependencies');
7815 this.configuration.mainData.packageDependencies = dependencies;
7816 this.configuration.addPage({
7817 name: 'dependencies',
7818 id: 'packageDependencies',
7819 context: 'package-dependencies',
7820 depth: 0,
7821 pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
7822 });
7823 };
7824 Application.prototype.processMarkdowns = function () {
7825 var _this = this;
7826 logger.info('Searching README.md, CHANGELOG.md, CONTRIBUTING.md, LICENSE.md, TODO.md files');
7827 return new Promise(function (resolve, reject) {
7828 var i = 0;
7829 var markdowns = ['readme', 'changelog', 'contributing', 'license', 'todo'];
7830 var numberOfMarkdowns = 5;
7831 var loop = function () {
7832 if (i < numberOfMarkdowns) {
7833 $markdownengine.getTraditionalMarkdown(markdowns[i].toUpperCase()).then(function (readmeData) {
7834 _this.configuration.addPage({
7835 name: markdowns[i] === 'readme' ? 'index' : markdowns[i],
7836 context: 'getting-started',
7837 id: 'getting-started',
7838 markdown: readmeData,
7839 depth: 0,
7840 pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
7841 });
7842 if (markdowns[i] === 'readme') {
7843 _this.configuration.mainData.readme = true;
7844 _this.configuration.addPage({
7845 name: 'overview',
7846 id: 'overview',
7847 context: 'overview',
7848 pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
7849 });
7850 }
7851 else {
7852 _this.configuration.mainData.markdowns.push({
7853 name: markdowns[i],
7854 uppername: markdowns[i].toUpperCase(),
7855 depth: 0,
7856 pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
7857 });
7858 }
7859 logger.info(markdowns[i].toUpperCase() + ".md file found");
7860 i++;
7861 loop();
7862 }, function (errorMessage) {
7863 logger.warn(errorMessage);
7864 logger.warn("Continuing without " + markdowns[i].toUpperCase() + ".md file");
7865 if (markdowns[i] === 'readme') {
7866 _this.configuration.addPage({
7867 name: 'index',
7868 id: 'index',
7869 context: 'overview',
7870 depth: 0,
7871 pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
7872 });
7873 }
7874 i++;
7875 loop();
7876 });
7877 }
7878 else {
7879 resolve();
7880 }
7881 };
7882 loop();
7883 });
7884 };
7885 Application.prototype.rebuildRootMarkdowns = function () {
7886 var _this = this;
7887 logger.info('Regenerating README.md, CHANGELOG.md, CONTRIBUTING.md, LICENSE.md, TODO.md pages');
7888 var actions = [];
7889 this.configuration.resetRootMarkdownPages();
7890 actions.push(function () {
7891 return _this.processMarkdowns();
7892 });
7893 promiseSequential(actions)
7894 .then(function (res) {
7895 _this.processPages();
7896 _this.clearUpdatedFiles();
7897 })
7898 .catch(function (errorMessage) {
7899 logger.error(errorMessage);
7900 });
7901 };
7902 /**
7903 * Get dependency data for small group of updated files during watch process
7904 */
7905 Application.prototype.getMicroDependenciesData = function () {
7906 logger.info('Get diff dependencies data');
7907 var crawler = new Dependencies(this.updatedFiles, {
7908 tsconfigDirectory: path.dirname(this.configuration.mainData.tsconfig)
7909 }, this.configuration, this.routerParser);
7910 var dependenciesData = crawler.getDependencies();
7911 this.dependenciesEngine.update(dependenciesData);
7912 this.prepareJustAFewThings(dependenciesData);
7913 };
7914 /**
7915 * Rebuild external documentation during watch process
7916 */
7917 Application.prototype.rebuildExternalDocumentation = function () {
7918 var _this = this;
7919 logger.info('Rebuild external documentation');
7920 var actions = [];
7921 this.configuration.resetAdditionalPages();
7922 if (this.configuration.mainData.includes !== '') {
7923 actions.push(function () {
7924 return _this.prepareExternalIncludes();
7925 });
7926 }
7927 promiseSequential(actions)
7928 .then(function (res) {
7929 _this.processPages();
7930 _this.clearUpdatedFiles();
7931 })
7932 .catch(function (errorMessage) {
7933 logger.error(errorMessage);
7934 });
7935 };
7936 Application.prototype.getDependenciesData = function () {
7937 logger.info('Get dependencies data');
7938 /**
7939 * AngularJS detection strategy :
7940 * - if in package.json
7941 * - if 75% of scanned files are *.js files
7942 */
7943 var dependenciesClass = AngularDependencies;
7944 this.configuration.mainData.angularProject = true;
7945 if (typeof this.packageJsonData.dependencies !== 'undefined') {
7946 if (typeof this.packageJsonData.dependencies.angular !== 'undefined') {
7947 logger.info('AngularJS project detected');
7948 this.configuration.mainData.angularProject = false;
7949 this.configuration.mainData.angularJSProject = true;
7950 dependenciesClass = AngularJSDependencies;
7951 }
7952 else {
7953 var countJSFiles_1 = 0;
7954 this.files.forEach(function (file) {
7955 if (path.extname(file) === '.js') {
7956 countJSFiles_1 += 1;
7957 }
7958 });
7959 var percentOfJSFiles = (countJSFiles_1 * 100) / this.files.length;
7960 if (percentOfJSFiles >= 75) {
7961 logger.info('AngularJS project detected');
7962 this.configuration.mainData.angularProject = false;
7963 this.configuration.mainData.angularJSProject = true;
7964 dependenciesClass = AngularJSDependencies;
7965 }
7966 }
7967 }
7968 var crawler = new dependenciesClass(this.files, {
7969 tsconfigDirectory: path.dirname(this.configuration.mainData.tsconfig)
7970 }, this.configuration, this.routerParser);
7971 var dependenciesData = crawler.getDependencies();
7972 this.dependenciesEngine.init(dependenciesData);
7973 this.configuration.mainData.routesLength = this.routerParser.routesLength();
7974 this.printStatistics();
7975 this.prepareEverything();
7976 };
7977 Application.prototype.prepareJustAFewThings = function (diffCrawledData) {
7978 var _this = this;
7979 var actions = [];
7980 this.configuration.resetPages();
7981 if (!this.configuration.mainData.disableRoutesGraph) {
7982 actions.push(function () { return _this.prepareRoutes(); });
7983 }
7984 if (diffCrawledData.components.length > 0) {
7985 actions.push(function () { return _this.prepareComponents(); });
7986 }
7987 if (diffCrawledData.controllers.length > 0) {
7988 actions.push(function () { return _this.prepareControllers(); });
7989 }
7990 if (diffCrawledData.modules.length > 0) {
7991 actions.push(function () { return _this.prepareModules(); });
7992 }
7993 if (diffCrawledData.directives.length > 0) {
7994 actions.push(function () { return _this.prepareDirectives(); });
7995 }
7996 if (diffCrawledData.injectables.length > 0) {
7997 actions.push(function () { return _this.prepareInjectables(); });
7998 }
7999 if (diffCrawledData.interceptors.length > 0) {
8000 actions.push(function () { return _this.prepareInterceptors(); });
8001 }
8002 if (diffCrawledData.guards.length > 0) {
8003 actions.push(function () { return _this.prepareGuards(); });
8004 }
8005 if (diffCrawledData.pipes.length > 0) {
8006 actions.push(function () { return _this.preparePipes(); });
8007 }
8008 if (diffCrawledData.classes.length > 0) {
8009 actions.push(function () { return _this.prepareClasses(); });
8010 }
8011 if (diffCrawledData.interfaces.length > 0) {
8012 actions.push(function () { return _this.prepareInterfaces(); });
8013 }
8014 if (diffCrawledData.miscellaneous.variables.length > 0 ||
8015 diffCrawledData.miscellaneous.functions.length > 0 ||
8016 diffCrawledData.miscellaneous.typealiases.length > 0 ||
8017 diffCrawledData.miscellaneous.enumerations.length > 0) {
8018 actions.push(function () { return _this.prepareMiscellaneous(); });
8019 }
8020 if (!this.configuration.mainData.disableCoverage) {
8021 actions.push(function () { return _this.prepareCoverage(); });
8022 }
8023 promiseSequential(actions)
8024 .then(function (res) {
8025 _this.processGraphs();
8026 _this.clearUpdatedFiles();
8027 })
8028 .catch(function (errorMessage) {
8029 logger.error(errorMessage);
8030 });
8031 };
8032 Application.prototype.printStatistics = function () {
8033 logger.info('-------------------');
8034 logger.info('Project statistics ');
8035 if (this.dependenciesEngine.modules.length > 0) {
8036 logger.info("- files : " + this.files.length);
8037 }
8038 if (this.dependenciesEngine.modules.length > 0) {
8039 logger.info("- module : " + this.dependenciesEngine.modules.length);
8040 }
8041 if (this.dependenciesEngine.components.length > 0) {
8042 logger.info("- component : " + this.dependenciesEngine.components.length);
8043 }
8044 if (this.dependenciesEngine.controllers.length > 0) {
8045 logger.info("- controller : " + this.dependenciesEngine.controllers.length);
8046 }
8047 if (this.dependenciesEngine.directives.length > 0) {
8048 logger.info("- directive : " + this.dependenciesEngine.directives.length);
8049 }
8050 if (this.dependenciesEngine.injectables.length > 0) {
8051 logger.info("- injectable : " + this.dependenciesEngine.injectables.length);
8052 }
8053 if (this.dependenciesEngine.interceptors.length > 0) {
8054 logger.info("- injector : " + this.dependenciesEngine.interceptors.length);
8055 }
8056 if (this.dependenciesEngine.guards.length > 0) {
8057 logger.info("- guard : " + this.dependenciesEngine.guards.length);
8058 }
8059 if (this.dependenciesEngine.pipes.length > 0) {
8060 logger.info("- pipe : " + this.dependenciesEngine.pipes.length);
8061 }
8062 if (this.dependenciesEngine.classes.length > 0) {
8063 logger.info("- class : " + this.dependenciesEngine.classes.length);
8064 }
8065 if (this.dependenciesEngine.interfaces.length > 0) {
8066 logger.info("- interface : " + this.dependenciesEngine.interfaces.length);
8067 }
8068 if (this.configuration.mainData.routesLength > 0) {
8069 logger.info("- route : " + this.configuration.mainData.routesLength);
8070 }
8071 logger.info('-------------------');
8072 };
8073 Application.prototype.prepareEverything = function () {
8074 var _this = this;
8075 var actions = [];
8076 actions.push(function () {
8077 return _this.prepareComponents();
8078 });
8079 actions.push(function () {
8080 return _this.prepareModules();
8081 });
8082 if (this.dependenciesEngine.directives.length > 0) {
8083 actions.push(function () {
8084 return _this.prepareDirectives();
8085 });
8086 }
8087 if (this.dependenciesEngine.controllers.length > 0) {
8088 actions.push(function () {
8089 return _this.prepareControllers();
8090 });
8091 }
8092 if (this.dependenciesEngine.injectables.length > 0) {
8093 actions.push(function () {
8094 return _this.prepareInjectables();
8095 });
8096 }
8097 if (this.dependenciesEngine.interceptors.length > 0) {
8098 actions.push(function () {
8099 return _this.prepareInterceptors();
8100 });
8101 }
8102 if (this.dependenciesEngine.guards.length > 0) {
8103 actions.push(function () {
8104 return _this.prepareGuards();
8105 });
8106 }
8107 if (this.dependenciesEngine.routes &&
8108 this.dependenciesEngine.routes.children.length > 0 &&
8109 !this.configuration.mainData.disableRoutesGraph) {
8110 actions.push(function () {
8111 return _this.prepareRoutes();
8112 });
8113 }
8114 if (this.dependenciesEngine.pipes.length > 0) {
8115 actions.push(function () {
8116 return _this.preparePipes();
8117 });
8118 }
8119 if (this.dependenciesEngine.classes.length > 0) {
8120 actions.push(function () {
8121 return _this.prepareClasses();
8122 });
8123 }
8124 if (this.dependenciesEngine.interfaces.length > 0) {
8125 actions.push(function () {
8126 return _this.prepareInterfaces();
8127 });
8128 }
8129 if (this.dependenciesEngine.miscellaneous.variables.length > 0 ||
8130 this.dependenciesEngine.miscellaneous.functions.length > 0 ||
8131 this.dependenciesEngine.miscellaneous.typealiases.length > 0 ||
8132 this.dependenciesEngine.miscellaneous.enumerations.length > 0) {
8133 actions.push(function () {
8134 return _this.prepareMiscellaneous();
8135 });
8136 }
8137 if (!this.configuration.mainData.disableCoverage) {
8138 actions.push(function () {
8139 return _this.prepareCoverage();
8140 });
8141 }
8142 if (this.configuration.mainData.unitTestCoverage !== '') {
8143 actions.push(function () {
8144 return _this.prepareUnitTestCoverage();
8145 });
8146 }
8147 if (this.configuration.mainData.includes !== '') {
8148 actions.push(function () {
8149 return _this.prepareExternalIncludes();
8150 });
8151 }
8152 promiseSequential(actions)
8153 .then(function (res) {
8154 if (_this.configuration.mainData.exportFormat !== COMPODOC_DEFAULTS.exportFormat) {
8155 if (COMPODOC_DEFAULTS.exportFormatsSupported.indexOf(_this.configuration.mainData.exportFormat) > -1) {
8156 logger.info("Generating documentation in export format " + _this.configuration.mainData.exportFormat);
8157 _this.exportEngine
8158 .export(_this.configuration.mainData.output, _this.configuration.mainData)
8159 .then(function () {
8160 generationPromiseResolve();
8161 _this.endCallback();
8162 logger.info('Documentation generated in ' +
8163 _this.configuration.mainData.output +
8164 ' in ' +
8165 _this.getElapsedTime() +
8166 ' seconds');
8167 });
8168 }
8169 else {
8170 logger.warn("Exported format not supported");
8171 }
8172 }
8173 else {
8174 _this.processGraphs();
8175 }
8176 })
8177 .catch(function (errorMessage) {
8178 logger.error(errorMessage);
8179 });
8180 };
8181 Application.prototype.getIncludedPathForFile = function (file) {
8182 return path.join(this.configuration.mainData.includes, file);
8183 };
8184 Application.prototype.prepareExternalIncludes = function () {
8185 var _this = this;
8186 logger.info('Adding external markdown files');
8187 // Scan include folder for files detailed in summary.json
8188 // For each file, add to this.configuration.mainData.additionalPages
8189 // Each file will be converted to html page, inside COMPODOC_DEFAULTS.additionalEntryPath
8190 return new Promise(function (resolve, reject) {
8191 _this.fileEngine.get(_this.getIncludedPathForFile('summary.json')).then(function (summaryData) {
8192 logger.info('Additional documentation: summary.json file found');
8193 var parsedSummaryData = JSON.parse(summaryData);
8194 var that = _this;
8195 traverse$3(parsedSummaryData).forEach(function () {
8196 if (this.notRoot && typeof this.node === 'object') {
8197 var rawPath = this.path;
8198 var file = this.node['file'];
8199 var title = this.node['title'];
8200 var finalPath_1 = that.configuration.mainData.includesFolder;
8201 var finalDepth = rawPath.filter(function (el) {
8202 return !isNaN(parseInt(el));
8203 });
8204 if (typeof file !== 'undefined' && typeof title !== 'undefined') {
8205 var url = cleanNameWithoutSpaceAndToLowerCase(title);
8206 var lastElementRootTree_1 = null;
8207 finalDepth.forEach(function (el) {
8208 var elementTree = lastElementRootTree_1 === null
8209 ? parsedSummaryData
8210 : lastElementRootTree_1;
8211 if (typeof elementTree.children !== 'undefined') {
8212 elementTree = elementTree['children'][el];
8213 }
8214 else {
8215 elementTree = elementTree[el];
8216 }
8217 finalPath_1 +=
8218 '/' +
8219 cleanNameWithoutSpaceAndToLowerCase(elementTree.title);
8220 lastElementRootTree_1 = elementTree;
8221 });
8222 finalPath_1 = finalPath_1.replace('/' + url, '');
8223 var markdownFile = $markdownengine.getTraditionalMarkdownSync(that.getIncludedPathForFile(file));
8224 if (finalDepth.length > 5) {
8225 logger.error('Only 5 levels of depth are supported');
8226 }
8227 else {
8228 that.configuration.addAdditionalPage({
8229 name: title,
8230 id: title,
8231 filename: url,
8232 context: 'additional-page',
8233 path: finalPath_1,
8234 additionalPage: markdownFile,
8235 depth: finalDepth.length,
8236 pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
8237 });
8238 }
8239 }
8240 }
8241 });
8242 resolve();
8243 }, function (errorMessage) {
8244 logger.error(errorMessage);
8245 reject('Error during Additional documentation generation');
8246 });
8247 });
8248 };
8249 Application.prototype.prepareModules = function (someModules) {
8250 var _this = this;
8251 logger.info('Prepare modules');
8252 var i = 0;
8253 var _modules = someModules ? someModules : this.dependenciesEngine.getModules();
8254 return new Promise(function (resolve, reject) {
8255 _this.configuration.mainData.modules = _modules.map(function (ngModule) {
8256 ngModule.compodocLinks = {
8257 components: [],
8258 controllers: [],
8259 directives: [],
8260 injectables: [],
8261 pipes: []
8262 };
8263 ['declarations', 'bootstrap', 'imports', 'exports', 'controllers'].forEach(function (metadataType) {
8264 ngModule[metadataType] = ngModule[metadataType].filter(function (metaDataItem) {
8265 switch (metaDataItem.type) {
8266 case 'directive':
8267 return _this.dependenciesEngine.getDirectives().some(function (directive) {
8268 var selectedDirective;
8269 if (typeof metaDataItem.id !== 'undefined') {
8270 selectedDirective =
8271 directive.id === metaDataItem.id;
8272 }
8273 else {
8274 selectedDirective =
8275 directive.name === metaDataItem.name;
8276 }
8277 if (selectedDirective &&
8278 !ngModule.compodocLinks.directives.includes(directive)) {
8279 ngModule.compodocLinks.directives.push(directive);
8280 }
8281 return selectedDirective;
8282 });
8283 case 'component':
8284 return _this.dependenciesEngine.getComponents().some(function (component) {
8285 var selectedComponent;
8286 if (typeof metaDataItem.id !== 'undefined') {
8287 selectedComponent =
8288 component.id === metaDataItem.id;
8289 }
8290 else {
8291 selectedComponent =
8292 component.name === metaDataItem.name;
8293 }
8294 if (selectedComponent &&
8295 !ngModule.compodocLinks.components.includes(component)) {
8296 ngModule.compodocLinks.components.push(component);
8297 }
8298 return selectedComponent;
8299 });
8300 case 'controller':
8301 return _this.dependenciesEngine.getControllers().some(function (controller) {
8302 var selectedController;
8303 if (typeof metaDataItem.id !== 'undefined') {
8304 selectedController =
8305 controller.id === metaDataItem.id;
8306 }
8307 else {
8308 selectedController =
8309 controller.name === metaDataItem.name;
8310 }
8311 if (selectedController &&
8312 !ngModule.compodocLinks.controllers.includes(controller)) {
8313 ngModule.compodocLinks.controllers.push(controller);
8314 }
8315 return selectedController;
8316 });
8317 case 'module':
8318 return _this.dependenciesEngine
8319 .getModules()
8320 .some(function (module) { return module.name === metaDataItem.name; });
8321 case 'pipe':
8322 return _this.dependenciesEngine.getPipes().some(function (pipe) {
8323 var selectedPipe;
8324 if (typeof metaDataItem.id !== 'undefined') {
8325 selectedPipe = pipe.id === metaDataItem.id;
8326 }
8327 else {
8328 selectedPipe = pipe.name === metaDataItem.name;
8329 }
8330 if (selectedPipe &&
8331 !ngModule.compodocLinks.pipes.includes(pipe)) {
8332 ngModule.compodocLinks.pipes.push(pipe);
8333 }
8334 return selectedPipe;
8335 });
8336 default:
8337 return true;
8338 }
8339 });
8340 });
8341 ngModule.providers = ngModule.providers.filter(function (provider) {
8342 return (_this.dependenciesEngine.getInjectables().some(function (injectable) {
8343 var selectedInjectable = injectable.name === provider.name;
8344 if (selectedInjectable &&
8345 !ngModule.compodocLinks.injectables.includes(injectable)) {
8346 ngModule.compodocLinks.injectables.push(injectable);
8347 }
8348 return selectedInjectable;
8349 }) ||
8350 _this.dependenciesEngine
8351 .getInterceptors()
8352 .some(function (interceptor) { return interceptor.name === provider.name; }));
8353 });
8354 // Try fixing type undefined for each providers
8355 _.forEach(ngModule.providers, function (provider) {
8356 if (_this.dependenciesEngine
8357 .getInjectables()
8358 .find(function (injectable) { return injectable.name === provider.name; })) {
8359 provider.type = 'injectable';
8360 }
8361 if (_this.dependenciesEngine
8362 .getInterceptors()
8363 .find(function (interceptor) { return interceptor.name === provider.name; })) {
8364 provider.type = 'interceptor';
8365 }
8366 });
8367 // Order things
8368 ngModule.compodocLinks.components = _.sortBy(ngModule.compodocLinks.components, [
8369 'name'
8370 ]);
8371 ngModule.compodocLinks.controllers = _.sortBy(ngModule.compodocLinks.controllers, [
8372 'name'
8373 ]);
8374 ngModule.compodocLinks.directives = _.sortBy(ngModule.compodocLinks.directives, [
8375 'name'
8376 ]);
8377 ngModule.compodocLinks.injectables = _.sortBy(ngModule.compodocLinks.injectables, [
8378 'name'
8379 ]);
8380 ngModule.compodocLinks.pipes = _.sortBy(ngModule.compodocLinks.pipes, ['name']);
8381 ngModule.declarations = _.sortBy(ngModule.declarations, ['name']);
8382 ngModule.entryComponents = _.sortBy(ngModule.entryComponents, ['name']);
8383 ngModule.providers = _.sortBy(ngModule.providers, ['name']);
8384 ngModule.imports = _.sortBy(ngModule.imports, ['name']);
8385 ngModule.exports = _.sortBy(ngModule.exports, ['name']);
8386 return ngModule;
8387 });
8388 _this.configuration.addPage({
8389 name: 'modules',
8390 id: 'modules',
8391 context: 'modules',
8392 depth: 0,
8393 pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
8394 });
8395 var len = _this.configuration.mainData.modules.length;
8396 var loop = function () {
8397 if (i < len) {
8398 if ($markdownengine.hasNeighbourReadmeFile(_this.configuration.mainData.modules[i].file)) {
8399 logger.info(" " + _this.configuration.mainData.modules[i].name + " has a README file, include it");
8400 var readme = $markdownengine.readNeighbourReadmeFile(_this.configuration.mainData.modules[i].file);
8401 _this.configuration.mainData.modules[i].readme = marked$4(readme);
8402 }
8403 _this.configuration.addPage({
8404 path: 'modules',
8405 name: _this.configuration.mainData.modules[i].name,
8406 id: _this.configuration.mainData.modules[i].id,
8407 navTabs: _this.getNavTabs(_this.configuration.mainData.modules[i]),
8408 context: 'module',
8409 module: _this.configuration.mainData.modules[i],
8410 depth: 1,
8411 pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
8412 });
8413 i++;
8414 loop();
8415 }
8416 else {
8417 resolve();
8418 }
8419 };
8420 loop();
8421 });
8422 };
8423 Application.prototype.prepareInterfaces = function (someInterfaces) {
8424 var _this = this;
8425 logger.info('Prepare interfaces');
8426 this.configuration.mainData.interfaces = someInterfaces
8427 ? someInterfaces
8428 : this.dependenciesEngine.getInterfaces();
8429 return new Promise(function (resolve, reject) {
8430 var i = 0;
8431 var len = _this.configuration.mainData.interfaces.length;
8432 var loop = function () {
8433 if (i < len) {
8434 var interf = _this.configuration.mainData.interfaces[i];
8435 if ($markdownengine.hasNeighbourReadmeFile(interf.file)) {
8436 logger.info(" " + interf.name + " has a README file, include it");
8437 var readme = $markdownengine.readNeighbourReadmeFile(interf.file);
8438 interf.readme = marked$4(readme);
8439 }
8440 var page = {
8441 path: 'interfaces',
8442 name: interf.name,
8443 id: interf.id,
8444 navTabs: _this.getNavTabs(interf),
8445 context: 'interface',
8446 interface: interf,
8447 depth: 1,
8448 pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
8449 };
8450 if (interf.isDuplicate) {
8451 page.name += '-' + interf.duplicateId;
8452 }
8453 _this.configuration.addPage(page);
8454 i++;
8455 loop();
8456 }
8457 else {
8458 resolve();
8459 }
8460 };
8461 loop();
8462 });
8463 };
8464 Application.prototype.prepareMiscellaneous = function (someMisc) {
8465 var _this = this;
8466 logger.info('Prepare miscellaneous');
8467 this.configuration.mainData.miscellaneous = someMisc
8468 ? someMisc
8469 : this.dependenciesEngine.getMiscellaneous();
8470 return new Promise(function (resolve, reject) {
8471 if (_this.configuration.mainData.miscellaneous.functions.length > 0) {
8472 _this.configuration.addPage({
8473 path: 'miscellaneous',
8474 name: 'functions',
8475 id: 'miscellaneous-functions',
8476 context: 'miscellaneous-functions',
8477 depth: 1,
8478 pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
8479 });
8480 }
8481 if (_this.configuration.mainData.miscellaneous.variables.length > 0) {
8482 _this.configuration.addPage({
8483 path: 'miscellaneous',
8484 name: 'variables',
8485 id: 'miscellaneous-variables',
8486 context: 'miscellaneous-variables',
8487 depth: 1,
8488 pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
8489 });
8490 }
8491 if (_this.configuration.mainData.miscellaneous.typealiases.length > 0) {
8492 _this.configuration.addPage({
8493 path: 'miscellaneous',
8494 name: 'typealiases',
8495 id: 'miscellaneous-typealiases',
8496 context: 'miscellaneous-typealiases',
8497 depth: 1,
8498 pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
8499 });
8500 }
8501 if (_this.configuration.mainData.miscellaneous.enumerations.length > 0) {
8502 _this.configuration.addPage({
8503 path: 'miscellaneous',
8504 name: 'enumerations',
8505 id: 'miscellaneous-enumerations',
8506 context: 'miscellaneous-enumerations',
8507 depth: 1,
8508 pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
8509 });
8510 }
8511 resolve();
8512 });
8513 };
8514 Application.prototype.handleTemplateurl = function (component) {
8515 var dirname = path.dirname(component.file);
8516 var templatePath = path.resolve(dirname + path.sep + component.templateUrl);
8517 if (!this.fileEngine.existsSync(templatePath)) {
8518 var err = "Cannot read template for " + component.name;
8519 logger.error(err);
8520 return new Promise(function (resolve, reject) { });
8521 }
8522 return this.fileEngine.get(templatePath).then(function (data) { return (component.templateData = data); }, function (err) {
8523 logger.error(err);
8524 return Promise.reject('');
8525 });
8526 };
8527 Application.prototype.getNavTabs = function (dependency) {
8528 var _this = this;
8529 var navTabConfig = this.configuration.mainData.navTabConfig;
8530 navTabConfig = navTabConfig.length === 0 ? _.cloneDeep(COMPODOC_CONSTANTS.navTabDefinitions) : navTabConfig;
8531 var matchDepType = function (depType) {
8532 return depType === 'all' || depType === dependency.type;
8533 };
8534 var navTabs = [];
8535 _.forEach(navTabConfig, function (customTab) {
8536 var navTab = _.find(COMPODOC_CONSTANTS.navTabDefinitions, { 'id': customTab.id });
8537 if (!navTab) {
8538 throw new Error("Invalid tab ID '" + customTab.id + "' specified in tab configuration");
8539 }
8540 navTab.label = customTab.label;
8541 // is tab applicable to target dependency?
8542 if (-1 === _.findIndex(navTab.depTypes, matchDepType)) {
8543 return;
8544 }
8545 // global config
8546 if (customTab.id === 'tree' && _this.configuration.mainData.disableDomTree) {
8547 return;
8548 }
8549 if (customTab.id === 'source' && _this.configuration.mainData.disableSourceCode) {
8550 return;
8551 }
8552 if (customTab.id === 'templateData' && _this.configuration.mainData.disableTemplateTab) {
8553 return;
8554 }
8555 // per dependency config
8556 if (customTab.id === 'readme' && !dependency.readme) {
8557 return;
8558 }
8559 if (customTab.id === 'example' && !dependency.exampleUrls) {
8560 return;
8561 }
8562 if (customTab.id === 'templateData' && (!dependency.templateUrl || dependency.templateUrl.length === 0)) {
8563 return;
8564 }
8565 navTabs.push(navTab);
8566 });
8567 if (navTabs.length === 0) {
8568 throw new Error("No valid navigation tabs have been defined for dependency type '" + dependency.type + "'. Specify at least one config for the 'info' or 'source' tab in --navTabConfig.");
8569 }
8570 return navTabs;
8571 };
8572 Application.prototype.prepareControllers = function (someControllers) {
8573 var _this = this;
8574 logger.info('Prepare controllers');
8575 this.configuration.mainData.controllers = someControllers
8576 ? someControllers
8577 : this.dependenciesEngine.getControllers();
8578 return new Promise(function (resolve, reject) {
8579 var i = 0;
8580 var len = _this.configuration.mainData.controllers.length;
8581 var loop = function () {
8582 if (i < len) {
8583 var controller = _this.configuration.mainData.controllers[i];
8584 var page = {
8585 path: 'controllers',
8586 name: controller.name,
8587 id: controller.id,
8588 navTabs: _this.getNavTabs(controller),
8589 context: 'controller',
8590 controller: controller,
8591 depth: 1,
8592 pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
8593 };
8594 if (controller.isDuplicate) {
8595 page.name += '-' + controller.duplicateId;
8596 }
8597 _this.configuration.addPage(page);
8598 i++;
8599 loop();
8600 }
8601 else {
8602 resolve();
8603 }
8604 };
8605 loop();
8606 });
8607 };
8608 Application.prototype.prepareComponents = function (someComponents) {
8609 var _this = this;
8610 logger.info('Prepare components');
8611 this.configuration.mainData.components = someComponents
8612 ? someComponents
8613 : this.dependenciesEngine.getComponents();
8614 return new Promise(function (mainResolve, reject) {
8615 var i = 0;
8616 var len = _this.configuration.mainData.components.length;
8617 var loop = function () {
8618 if (i <= len - 1) {
8619 var component = _this.configuration.mainData.components[i];
8620 if ($markdownengine.hasNeighbourReadmeFile(component.file)) {
8621 logger.info(" " + component.name + " has a README file, include it");
8622 var readmeFile = $markdownengine.readNeighbourReadmeFile(component.file);
8623 component.readme = marked$4(readmeFile);
8624 var page = {
8625 path: 'components',
8626 name: component.name,
8627 id: component.id,
8628 navTabs: _this.getNavTabs(component),
8629 context: 'component',
8630 component: component,
8631 depth: 1,
8632 pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
8633 };
8634 if (component.isDuplicate) {
8635 page.name += '-' + component.duplicateId;
8636 }
8637 _this.configuration.addPage(page);
8638 if (component.templateUrl.length > 0) {
8639 logger.info(" " + component.name + " has a templateUrl, include it");
8640 _this.handleTemplateurl(component).then(function () {
8641 i++;
8642 loop();
8643 }, function (e) {
8644 logger.error(e);
8645 });
8646 }
8647 else {
8648 i++;
8649 loop();
8650 }
8651 }
8652 else {
8653 var page = {
8654 path: 'components',
8655 name: component.name,
8656 id: component.id,
8657 navTabs: _this.getNavTabs(component),
8658 context: 'component',
8659 component: component,
8660 depth: 1,
8661 pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
8662 };
8663 if (component.isDuplicate) {
8664 page.name += '-' + component.duplicateId;
8665 }
8666 _this.configuration.addPage(page);
8667 if (component.templateUrl.length > 0) {
8668 logger.info(" " + component.name + " has a templateUrl, include it");
8669 _this.handleTemplateurl(component).then(function () {
8670 i++;
8671 loop();
8672 }, function (e) {
8673 logger.error(e);
8674 });
8675 }
8676 else {
8677 i++;
8678 loop();
8679 }
8680 }
8681 }
8682 else {
8683 mainResolve();
8684 }
8685 };
8686 loop();
8687 });
8688 };
8689 Application.prototype.prepareDirectives = function (someDirectives) {
8690 var _this = this;
8691 logger.info('Prepare directives');
8692 this.configuration.mainData.directives = someDirectives
8693 ? someDirectives
8694 : this.dependenciesEngine.getDirectives();
8695 return new Promise(function (resolve, reject) {
8696 var i = 0;
8697 var len = _this.configuration.mainData.directives.length;
8698 var loop = function () {
8699 if (i < len) {
8700 var directive = _this.configuration.mainData.directives[i];
8701 if ($markdownengine.hasNeighbourReadmeFile(directive.file)) {
8702 logger.info(" " + directive.name + " has a README file, include it");
8703 var readme = $markdownengine.readNeighbourReadmeFile(directive.file);
8704 directive.readme = marked$4(readme);
8705 }
8706 var page = {
8707 path: 'directives',
8708 name: directive.name,
8709 id: directive.id,
8710 navTabs: _this.getNavTabs(directive),
8711 context: 'directive',
8712 directive: directive,
8713 depth: 1,
8714 pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
8715 };
8716 if (directive.isDuplicate) {
8717 page.name += '-' + directive.duplicateId;
8718 }
8719 _this.configuration.addPage(page);
8720 i++;
8721 loop();
8722 }
8723 else {
8724 resolve();
8725 }
8726 };
8727 loop();
8728 });
8729 };
8730 Application.prototype.prepareInjectables = function (someInjectables) {
8731 var _this = this;
8732 logger.info('Prepare injectables');
8733 this.configuration.mainData.injectables = someInjectables
8734 ? someInjectables
8735 : this.dependenciesEngine.getInjectables();
8736 return new Promise(function (resolve, reject) {
8737 var i = 0;
8738 var len = _this.configuration.mainData.injectables.length;
8739 var loop = function () {
8740 if (i < len) {
8741 var injec = _this.configuration.mainData.injectables[i];
8742 if ($markdownengine.hasNeighbourReadmeFile(injec.file)) {
8743 logger.info(" " + injec.name + " has a README file, include it");
8744 var readme = $markdownengine.readNeighbourReadmeFile(injec.file);
8745 injec.readme = marked$4(readme);
8746 }
8747 var page = {
8748 path: 'injectables',
8749 name: injec.name,
8750 id: injec.id,
8751 navTabs: _this.getNavTabs(injec),
8752 context: 'injectable',
8753 injectable: injec,
8754 depth: 1,
8755 pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
8756 };
8757 if (injec.isDuplicate) {
8758 page.name += '-' + injec.duplicateId;
8759 }
8760 _this.configuration.addPage(page);
8761 i++;
8762 loop();
8763 }
8764 else {
8765 resolve();
8766 }
8767 };
8768 loop();
8769 });
8770 };
8771 Application.prototype.prepareInterceptors = function (someInterceptors) {
8772 var _this = this;
8773 logger.info('Prepare interceptors');
8774 this.configuration.mainData.interceptors = someInterceptors
8775 ? someInterceptors
8776 : this.dependenciesEngine.getInterceptors();
8777 return new Promise(function (resolve, reject) {
8778 var i = 0;
8779 var len = _this.configuration.mainData.interceptors.length;
8780 var loop = function () {
8781 if (i < len) {
8782 var interceptor = _this.configuration.mainData.interceptors[i];
8783 if ($markdownengine.hasNeighbourReadmeFile(interceptor.file)) {
8784 logger.info(" " + interceptor.name + " has a README file, include it");
8785 var readme = $markdownengine.readNeighbourReadmeFile(interceptor.file);
8786 interceptor.readme = marked$4(readme);
8787 }
8788 var page = {
8789 path: 'interceptors',
8790 name: interceptor.name,
8791 id: interceptor.id,
8792 navTabs: _this.getNavTabs(interceptor),
8793 context: 'interceptor',
8794 injectable: interceptor,
8795 depth: 1,
8796 pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
8797 };
8798 if (interceptor.isDuplicate) {
8799 page.name += '-' + interceptor.duplicateId;
8800 }
8801 _this.configuration.addPage(page);
8802 i++;
8803 loop();
8804 }
8805 else {
8806 resolve();
8807 }
8808 };
8809 loop();
8810 });
8811 };
8812 Application.prototype.prepareGuards = function (someGuards) {
8813 var _this = this;
8814 logger.info('Prepare guards');
8815 this.configuration.mainData.guards = someGuards
8816 ? someGuards
8817 : this.dependenciesEngine.getGuards();
8818 return new Promise(function (resolve, reject) {
8819 var i = 0;
8820 var len = _this.configuration.mainData.guards.length;
8821 var loop = function () {
8822 if (i < len) {
8823 var guard = _this.configuration.mainData.guards[i];
8824 if ($markdownengine.hasNeighbourReadmeFile(guard.file)) {
8825 logger.info(" " + guard.name + " has a README file, include it");
8826 var readme = $markdownengine.readNeighbourReadmeFile(guard.file);
8827 guard.readme = marked$4(readme);
8828 }
8829 var page = {
8830 path: 'guards',
8831 name: guard.name,
8832 id: guard.id,
8833 navTabs: _this.getNavTabs(guard),
8834 context: 'guard',
8835 injectable: guard,
8836 depth: 1,
8837 pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
8838 };
8839 if (guard.isDuplicate) {
8840 page.name += '-' + guard.duplicateId;
8841 }
8842 _this.configuration.addPage(page);
8843 i++;
8844 loop();
8845 }
8846 else {
8847 resolve();
8848 }
8849 };
8850 loop();
8851 });
8852 };
8853 Application.prototype.prepareRoutes = function () {
8854 var _this = this;
8855 logger.info('Process routes');
8856 this.configuration.mainData.routes = this.dependenciesEngine.getRoutes();
8857 return new Promise(function (resolve, reject) {
8858 _this.configuration.addPage({
8859 name: 'routes',
8860 id: 'routes',
8861 context: 'routes',
8862 depth: 0,
8863 pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
8864 });
8865 if (_this.configuration.mainData.exportFormat === COMPODOC_DEFAULTS.exportFormat) {
8866 _this.routerParser
8867 .generateRoutesIndex(_this.configuration.mainData.output, _this.configuration.mainData.routes)
8868 .then(function () {
8869 logger.info(' Routes index generated');
8870 resolve();
8871 }, function (e) {
8872 logger.error(e);
8873 reject();
8874 });
8875 }
8876 else {
8877 resolve();
8878 }
8879 });
8880 };
8881 Application.prototype.prepareCoverage = function () {
8882 var _this = this;
8883 logger.info('Process documentation coverage report');
8884 return new Promise(function (resolve, reject) {
8885 /*
8886 * loop with components, directives, classes, injectables, interfaces, pipes, misc functions variables
8887 */
8888 var files = [];
8889 var totalProjectStatementDocumented = 0;
8890 var getStatus = function (percent) {
8891 var status;
8892 if (percent <= 25) {
8893 status = 'low';
8894 }
8895 else if (percent > 25 && percent <= 50) {
8896 status = 'medium';
8897 }
8898 else if (percent > 50 && percent <= 75) {
8899 status = 'good';
8900 }
8901 else {
8902 status = 'very-good';
8903 }
8904 return status;
8905 };
8906 var processComponentsAndDirectives = function (list) {
8907 _.forEach(list, function (el) {
8908 var element = Object.assign({}, el);
8909 if (!element.propertiesClass) {
8910 element.propertiesClass = [];
8911 }
8912 if (!element.methodsClass) {
8913 element.methodsClass = [];
8914 }
8915 if (!element.hostBindings) {
8916 element.hostBindings = [];
8917 }
8918 if (!element.hostListeners) {
8919 element.hostListeners = [];
8920 }
8921 if (!element.inputsClass) {
8922 element.inputsClass = [];
8923 }
8924 if (!element.outputsClass) {
8925 element.outputsClass = [];
8926 }
8927 var cl = {
8928 filePath: element.file,
8929 type: element.type,
8930 linktype: element.type,
8931 name: element.name
8932 };
8933 var totalStatementDocumented = 0;
8934 var totalStatements = element.propertiesClass.length +
8935 element.methodsClass.length +
8936 element.inputsClass.length +
8937 element.hostBindings.length +
8938 element.hostListeners.length +
8939 element.outputsClass.length +
8940 1; // +1 for element decorator comment
8941 if (element.constructorObj) {
8942 totalStatements += 1;
8943 if (element.constructorObj &&
8944 element.constructorObj.description &&
8945 element.constructorObj.description !== '') {
8946 totalStatementDocumented += 1;
8947 }
8948 }
8949 if (element.description && element.description !== '') {
8950 totalStatementDocumented += 1;
8951 }
8952 _.forEach(element.propertiesClass, function (property) {
8953 if (property.modifierKind === Ast.SyntaxKind.PrivateKeyword) {
8954 // Doesn't handle private for coverage
8955 totalStatements -= 1;
8956 }
8957 if (property.description &&
8958 property.description !== '' &&
8959 property.modifierKind !== Ast.SyntaxKind.PrivateKeyword) {
8960 totalStatementDocumented += 1;
8961 }
8962 });
8963 _.forEach(element.methodsClass, function (method) {
8964 if (method.modifierKind === Ast.SyntaxKind.PrivateKeyword) {
8965 // Doesn't handle private for coverage
8966 totalStatements -= 1;
8967 }
8968 if (method.description &&
8969 method.description !== '' &&
8970 method.modifierKind !== Ast.SyntaxKind.PrivateKeyword) {
8971 totalStatementDocumented += 1;
8972 }
8973 });
8974 _.forEach(element.hostBindings, function (property) {
8975 if (property.modifierKind === Ast.SyntaxKind.PrivateKeyword) {
8976 // Doesn't handle private for coverage
8977 totalStatements -= 1;
8978 }
8979 if (property.description &&
8980 property.description !== '' &&
8981 property.modifierKind !== Ast.SyntaxKind.PrivateKeyword) {
8982 totalStatementDocumented += 1;
8983 }
8984 });
8985 _.forEach(element.hostListeners, function (method) {
8986 if (method.modifierKind === Ast.SyntaxKind.PrivateKeyword) {
8987 // Doesn't handle private for coverage
8988 totalStatements -= 1;
8989 }
8990 if (method.description &&
8991 method.description !== '' &&
8992 method.modifierKind !== Ast.SyntaxKind.PrivateKeyword) {
8993 totalStatementDocumented += 1;
8994 }
8995 });
8996 _.forEach(element.inputsClass, function (input) {
8997 if (input.modifierKind === Ast.SyntaxKind.PrivateKeyword) {
8998 // Doesn't handle private for coverage
8999 totalStatements -= 1;
9000 }
9001 if (input.description &&
9002 input.description !== '' &&
9003 input.modifierKind !== Ast.SyntaxKind.PrivateKeyword) {
9004 totalStatementDocumented += 1;
9005 }
9006 });
9007 _.forEach(element.outputsClass, function (output) {
9008 if (output.modifierKind === Ast.SyntaxKind.PrivateKeyword) {
9009 // Doesn't handle private for coverage
9010 totalStatements -= 1;
9011 }
9012 if (output.description &&
9013 output.description !== '' &&
9014 output.modifierKind !== Ast.SyntaxKind.PrivateKeyword) {
9015 totalStatementDocumented += 1;
9016 }
9017 });
9018 cl.coveragePercent = Math.floor(totalStatementDocumented / totalStatements * 100);
9019 if (totalStatements === 0) {
9020 cl.coveragePercent = 0;
9021 }
9022 cl.coverageCount = totalStatementDocumented + '/' + totalStatements;
9023 cl.status = getStatus(cl.coveragePercent);
9024 totalProjectStatementDocumented += cl.coveragePercent;
9025 files.push(cl);
9026 });
9027 };
9028 var processCoveragePerFile = function () {
9029 logger.info('Process documentation coverage per file');
9030 logger.info('-------------------');
9031 var overFiles = files.filter(function (f) {
9032 var overTest = f.coveragePercent >= _this.configuration.mainData.coverageMinimumPerFile;
9033 if (overTest && !_this.configuration.mainData.coverageTestShowOnlyFailed) {
9034 logger.info(f.coveragePercent + " % for file " + f.filePath + " - over minimum per file");
9035 }
9036 return overTest;
9037 });
9038 var underFiles = files.filter(function (f) {
9039 var underTest = f.coveragePercent < _this.configuration.mainData.coverageMinimumPerFile;
9040 if (underTest) {
9041 logger.error(f.coveragePercent + " % for file " + f.filePath + " - under minimum per file");
9042 }
9043 return underTest;
9044 });
9045 logger.info('-------------------');
9046 return {
9047 overFiles: overFiles,
9048 underFiles: underFiles
9049 };
9050 };
9051 var processFunctionsAndVariables = function (id, type) {
9052 _.forEach(id, function (el) {
9053 var cl = {
9054 filePath: el.file,
9055 type: type,
9056 linktype: el.type,
9057 linksubtype: el.subtype,
9058 name: el.name
9059 };
9060 if (type === 'variable') {
9061 cl.linktype = 'miscellaneous';
9062 }
9063 var totalStatementDocumented = 0;
9064 var totalStatements = 1;
9065 if (el.modifierKind === Ast.SyntaxKind.PrivateKeyword) {
9066 // Doesn't handle private for coverage
9067 totalStatements -= 1;
9068 }
9069 if (el.description &&
9070 el.description !== '' &&
9071 el.modifierKind !== Ast.SyntaxKind.PrivateKeyword) {
9072 totalStatementDocumented += 1;
9073 }
9074 cl.coveragePercent = Math.floor(totalStatementDocumented / totalStatements * 100);
9075 cl.coverageCount = totalStatementDocumented + '/' + totalStatements;
9076 cl.status = getStatus(cl.coveragePercent);
9077 totalProjectStatementDocumented += cl.coveragePercent;
9078 files.push(cl);
9079 });
9080 };
9081 processComponentsAndDirectives(_this.configuration.mainData.components);
9082 processComponentsAndDirectives(_this.configuration.mainData.directives);
9083 _.forEach(_this.configuration.mainData.classes, function (cl) {
9084 var classe = Object.assign({}, cl);
9085 if (!classe.properties) {
9086 classe.properties = [];
9087 }
9088 if (!classe.methods) {
9089 classe.methods = [];
9090 }
9091 var cla = {
9092 filePath: classe.file,
9093 type: 'class',
9094 linktype: 'classe',
9095 name: classe.name
9096 };
9097 var totalStatementDocumented = 0;
9098 var totalStatements = classe.properties.length + classe.methods.length + 1; // +1 for class itself
9099 if (classe.constructorObj) {
9100 totalStatements += 1;
9101 if (classe.constructorObj &&
9102 classe.constructorObj.description &&
9103 classe.constructorObj.description !== '') {
9104 totalStatementDocumented += 1;
9105 }
9106 }
9107 if (classe.description && classe.description !== '') {
9108 totalStatementDocumented += 1;
9109 }
9110 _.forEach(classe.properties, function (property) {
9111 if (property.modifierKind === Ast.SyntaxKind.PrivateKeyword) {
9112 // Doesn't handle private for coverage
9113 totalStatements -= 1;
9114 }
9115 if (property.description &&
9116 property.description !== '' &&
9117 property.modifierKind !== Ast.SyntaxKind.PrivateKeyword) {
9118 totalStatementDocumented += 1;
9119 }
9120 });
9121 _.forEach(classe.methods, function (method) {
9122 if (method.modifierKind === Ast.SyntaxKind.PrivateKeyword) {
9123 // Doesn't handle private for coverage
9124 totalStatements -= 1;
9125 }
9126 if (method.description &&
9127 method.description !== '' &&
9128 method.modifierKind !== Ast.SyntaxKind.PrivateKeyword) {
9129 totalStatementDocumented += 1;
9130 }
9131 });
9132 cla.coveragePercent = Math.floor(totalStatementDocumented / totalStatements * 100);
9133 if (totalStatements === 0) {
9134 cla.coveragePercent = 0;
9135 }
9136 cla.coverageCount = totalStatementDocumented + '/' + totalStatements;
9137 cla.status = getStatus(cla.coveragePercent);
9138 totalProjectStatementDocumented += cla.coveragePercent;
9139 files.push(cla);
9140 });
9141 _.forEach(_this.configuration.mainData.injectables, function (inj) {
9142 var injectable = Object.assign({}, inj);
9143 if (!injectable.properties) {
9144 injectable.properties = [];
9145 }
9146 if (!injectable.methods) {
9147 injectable.methods = [];
9148 }
9149 var cl = {
9150 filePath: injectable.file,
9151 type: injectable.type,
9152 linktype: injectable.type,
9153 name: injectable.name
9154 };
9155 var totalStatementDocumented = 0;
9156 var totalStatements = injectable.properties.length + injectable.methods.length + 1; // +1 for injectable itself
9157 if (injectable.constructorObj) {
9158 totalStatements += 1;
9159 if (injectable.constructorObj &&
9160 injectable.constructorObj.description &&
9161 injectable.constructorObj.description !== '') {
9162 totalStatementDocumented += 1;
9163 }
9164 }
9165 if (injectable.description && injectable.description !== '') {
9166 totalStatementDocumented += 1;
9167 }
9168 _.forEach(injectable.properties, function (property) {
9169 if (property.modifierKind === Ast.SyntaxKind.PrivateKeyword) {
9170 // Doesn't handle private for coverage
9171 totalStatements -= 1;
9172 }
9173 if (property.description &&
9174 property.description !== '' &&
9175 property.modifierKind !== Ast.SyntaxKind.PrivateKeyword) {
9176 totalStatementDocumented += 1;
9177 }
9178 });
9179 _.forEach(injectable.methods, function (method) {
9180 if (method.modifierKind === Ast.SyntaxKind.PrivateKeyword) {
9181 // Doesn't handle private for coverage
9182 totalStatements -= 1;
9183 }
9184 if (method.description &&
9185 method.description !== '' &&
9186 method.modifierKind !== Ast.SyntaxKind.PrivateKeyword) {
9187 totalStatementDocumented += 1;
9188 }
9189 });
9190 cl.coveragePercent = Math.floor(totalStatementDocumented / totalStatements * 100);
9191 if (totalStatements === 0) {
9192 cl.coveragePercent = 0;
9193 }
9194 cl.coverageCount = totalStatementDocumented + '/' + totalStatements;
9195 cl.status = getStatus(cl.coveragePercent);
9196 totalProjectStatementDocumented += cl.coveragePercent;
9197 files.push(cl);
9198 });
9199 _.forEach(_this.configuration.mainData.interfaces, function (inte) {
9200 var inter = Object.assign({}, inte);
9201 if (!inter.properties) {
9202 inter.properties = [];
9203 }
9204 if (!inter.methods) {
9205 inter.methods = [];
9206 }
9207 var cl = {
9208 filePath: inter.file,
9209 type: inter.type,
9210 linktype: inter.type,
9211 name: inter.name
9212 };
9213 var totalStatementDocumented = 0;
9214 var totalStatements = inter.properties.length + inter.methods.length + 1; // +1 for interface itself
9215 if (inter.constructorObj) {
9216 totalStatements += 1;
9217 if (inter.constructorObj &&
9218 inter.constructorObj.description &&
9219 inter.constructorObj.description !== '') {
9220 totalStatementDocumented += 1;
9221 }
9222 }
9223 if (inter.description && inter.description !== '') {
9224 totalStatementDocumented += 1;
9225 }
9226 _.forEach(inter.properties, function (property) {
9227 if (property.modifierKind === Ast.SyntaxKind.PrivateKeyword) {
9228 // Doesn't handle private for coverage
9229 totalStatements -= 1;
9230 }
9231 if (property.description &&
9232 property.description !== '' &&
9233 property.modifierKind !== Ast.SyntaxKind.PrivateKeyword) {
9234 totalStatementDocumented += 1;
9235 }
9236 });
9237 _.forEach(inter.methods, function (method) {
9238 if (method.modifierKind === Ast.SyntaxKind.PrivateKeyword) {
9239 // Doesn't handle private for coverage
9240 totalStatements -= 1;
9241 }
9242 if (method.description &&
9243 method.description !== '' &&
9244 method.modifierKind !== Ast.SyntaxKind.PrivateKeyword) {
9245 totalStatementDocumented += 1;
9246 }
9247 });
9248 cl.coveragePercent = Math.floor(totalStatementDocumented / totalStatements * 100);
9249 if (totalStatements === 0) {
9250 cl.coveragePercent = 0;
9251 }
9252 cl.coverageCount = totalStatementDocumented + '/' + totalStatements;
9253 cl.status = getStatus(cl.coveragePercent);
9254 totalProjectStatementDocumented += cl.coveragePercent;
9255 files.push(cl);
9256 });
9257 _.forEach(_this.configuration.mainData.pipes, function (pipe) {
9258 var cl = {
9259 filePath: pipe.file,
9260 type: pipe.type,
9261 linktype: pipe.type,
9262 name: pipe.name
9263 };
9264 var totalStatementDocumented = 0;
9265 var totalStatements = 1;
9266 if (pipe.description && pipe.description !== '') {
9267 totalStatementDocumented += 1;
9268 }
9269 cl.coveragePercent = Math.floor(totalStatementDocumented / totalStatements * 100);
9270 cl.coverageCount = totalStatementDocumented + '/' + totalStatements;
9271 cl.status = getStatus(cl.coveragePercent);
9272 totalProjectStatementDocumented += cl.coveragePercent;
9273 files.push(cl);
9274 });
9275 processFunctionsAndVariables(_this.configuration.mainData.miscellaneous.functions, 'function');
9276 processFunctionsAndVariables(_this.configuration.mainData.miscellaneous.variables, 'variable');
9277 files = _.sortBy(files, ['filePath']);
9278 var coverageData = {
9279 count: files.length > 0
9280 ? Math.floor(totalProjectStatementDocumented / files.length)
9281 : 0,
9282 status: '',
9283 files: files
9284 };
9285 coverageData.status = getStatus(coverageData.count);
9286 _this.configuration.addPage({
9287 name: 'coverage',
9288 id: 'coverage',
9289 context: 'coverage',
9290 files: files,
9291 data: coverageData,
9292 depth: 0,
9293 pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
9294 });
9295 coverageData.files = files;
9296 _this.configuration.mainData.coverageData = coverageData;
9297 if (_this.configuration.mainData.exportFormat === COMPODOC_DEFAULTS.exportFormat) {
9298 _this.htmlEngine.generateCoverageBadge(_this.configuration.mainData.output, 'documentation', coverageData);
9299 }
9300 files = _.sortBy(files, ['coveragePercent']);
9301 var coverageTestPerFileResults;
9302 if (_this.configuration.mainData.coverageTest &&
9303 !_this.configuration.mainData.coverageTestPerFile) {
9304 // Global coverage test and not per file
9305 if (coverageData.count >= _this.configuration.mainData.coverageTestThreshold) {
9306 logger.info("Documentation coverage (" + coverageData.count + "%) is over threshold (" + _this.configuration.mainData.coverageTestThreshold + "%)");
9307 generationPromiseResolve();
9308 process.exit(0);
9309 }
9310 else {
9311 var message = "Documentation coverage (" + coverageData.count + "%) is not over threshold (" + _this.configuration.mainData.coverageTestThreshold + "%)";
9312 generationPromiseReject();
9313 if (_this.configuration.mainData.coverageTestThresholdFail) {
9314 logger.error(message);
9315 process.exit(1);
9316 }
9317 else {
9318 logger.warn(message);
9319 process.exit(0);
9320 }
9321 }
9322 }
9323 else if (!_this.configuration.mainData.coverageTest &&
9324 _this.configuration.mainData.coverageTestPerFile) {
9325 coverageTestPerFileResults = processCoveragePerFile();
9326 // Per file coverage test and not global
9327 if (coverageTestPerFileResults.underFiles.length > 0) {
9328 var message = "Documentation coverage per file is not over threshold (" + _this.configuration.mainData.coverageMinimumPerFile + "%)";
9329 generationPromiseReject();
9330 if (_this.configuration.mainData.coverageTestThresholdFail) {
9331 logger.error(message);
9332 process.exit(1);
9333 }
9334 else {
9335 logger.warn(message);
9336 process.exit(0);
9337 }
9338 }
9339 else {
9340 logger.info("Documentation coverage per file is over threshold (" + _this.configuration.mainData.coverageMinimumPerFile + "%)");
9341 generationPromiseResolve();
9342 process.exit(0);
9343 }
9344 }
9345 else if (_this.configuration.mainData.coverageTest &&
9346 _this.configuration.mainData.coverageTestPerFile) {
9347 // Per file coverage test and global
9348 coverageTestPerFileResults = processCoveragePerFile();
9349 if (coverageData.count >= _this.configuration.mainData.coverageTestThreshold &&
9350 coverageTestPerFileResults.underFiles.length === 0) {
9351 logger.info("Documentation coverage (" + coverageData.count + "%) is over threshold (" + _this.configuration.mainData.coverageTestThreshold + "%)");
9352 logger.info("Documentation coverage per file is over threshold (" + _this.configuration.mainData.coverageMinimumPerFile + "%)");
9353 generationPromiseResolve();
9354 process.exit(0);
9355 }
9356 else if (coverageData.count >= _this.configuration.mainData.coverageTestThreshold &&
9357 coverageTestPerFileResults.underFiles.length > 0) {
9358 logger.info("Documentation coverage (" + coverageData.count + "%) is over threshold (" + _this.configuration.mainData.coverageTestThreshold + "%)");
9359 var message = "Documentation coverage per file is not over threshold (" + _this.configuration.mainData.coverageMinimumPerFile + "%)";
9360 generationPromiseReject();
9361 if (_this.configuration.mainData.coverageTestThresholdFail) {
9362 logger.error(message);
9363 process.exit(1);
9364 }
9365 else {
9366 logger.warn(message);
9367 process.exit(0);
9368 }
9369 }
9370 else if (coverageData.count < _this.configuration.mainData.coverageTestThreshold &&
9371 coverageTestPerFileResults.underFiles.length > 0) {
9372 var messageGlobal = "Documentation coverage (" + coverageData.count + "%) is not over threshold (" + _this.configuration.mainData.coverageTestThreshold + "%)", messagePerFile = "Documentation coverage per file is not over threshold (" + _this.configuration.mainData.coverageMinimumPerFile + "%)";
9373 generationPromiseReject();
9374 if (_this.configuration.mainData.coverageTestThresholdFail) {
9375 logger.error(messageGlobal);
9376 logger.error(messagePerFile);
9377 process.exit(1);
9378 }
9379 else {
9380 logger.warn(messageGlobal);
9381 logger.warn(messagePerFile);
9382 process.exit(0);
9383 }
9384 }
9385 else {
9386 var message = "Documentation coverage (" + coverageData.count + "%) is not over threshold (" + _this.configuration.mainData.coverageTestThreshold + "%)", messagePerFile = "Documentation coverage per file is over threshold (" + _this.configuration.mainData.coverageMinimumPerFile + "%)";
9387 generationPromiseReject();
9388 if (_this.configuration.mainData.coverageTestThresholdFail) {
9389 logger.error(message);
9390 logger.info(messagePerFile);
9391 process.exit(1);
9392 }
9393 else {
9394 logger.warn(message);
9395 logger.info(messagePerFile);
9396 process.exit(0);
9397 }
9398 }
9399 }
9400 else {
9401 resolve();
9402 }
9403 });
9404 };
9405 Application.prototype.prepareUnitTestCoverage = function () {
9406 var _this = this;
9407 logger.info('Process unit test coverage report');
9408 return new Promise(function (resolve, reject) {
9409 var covDat, covFileNames;
9410 if (!_this.configuration.mainData.coverageData['files']) {
9411 logger.warn('Missing documentation coverage data');
9412 }
9413 else {
9414 covDat = {};
9415 covFileNames = _.map(_this.configuration.mainData.coverageData['files'], function (el) {
9416 var fileName = el.filePath;
9417 covDat[fileName] = { type: el.type, linktype: el.linktype, linksubtype: el.linksubtype, name: el.name };
9418 return fileName;
9419 });
9420 }
9421 // read coverage summary file and data
9422 var unitTestSummary = {};
9423 var fileDat = _this.fileEngine.getSync(_this.configuration.mainData.unitTestCoverage);
9424 if (fileDat) {
9425 unitTestSummary = JSON.parse(fileDat);
9426 }
9427 else {
9428 return Promise.reject('Error reading unit test coverage file');
9429 }
9430 var getCovStatus = function (percent, totalLines) {
9431 var status;
9432 if (totalLines === 0) {
9433 status = 'uncovered';
9434 }
9435 else if (percent <= 25) {
9436 status = 'low';
9437 }
9438 else if (percent > 25 && percent <= 50) {
9439 status = 'medium';
9440 }
9441 else if (percent > 50 && percent <= 75) {
9442 status = 'good';
9443 }
9444 else {
9445 status = 'very-good';
9446 }
9447 return status;
9448 };
9449 var getCoverageData = function (data, fileName) {
9450 var out = {};
9451 if (fileName !== 'total') {
9452 if (covDat === undefined) {
9453 // need a name to include in output but this isn't visible
9454 out = { name: fileName, filePath: fileName };
9455 }
9456 else {
9457 var findMatch = _.filter(covFileNames, function (el) {
9458 return (el.includes(fileName) || fileName.includes(el));
9459 });
9460 if (findMatch.length > 0) {
9461 out = _.clone(covDat[findMatch[0]]);
9462 out['filePath'] = fileName;
9463 } //else {
9464 //out = {name: fileName, filePath: fileName};
9465 //}
9466 }
9467 }
9468 var keysToGet = ['statements', 'branches', 'functions', 'lines'];
9469 _.forEach(keysToGet, function (key) {
9470 if (data[key]) {
9471 var t = data[key];
9472 out[key] = { coveragePercent: Math.round(t.pct),
9473 coverageCount: '' + t.covered + '/' + t.total,
9474 status: getCovStatus(t.pct, t.total) };
9475 }
9476 });
9477 return out;
9478 };
9479 var unitTestData = {};
9480 var files = [];
9481 for (var file in unitTestSummary) {
9482 var dat = getCoverageData(unitTestSummary[file], file);
9483 if (file === 'total') {
9484 unitTestData['total'] = dat;
9485 }
9486 else {
9487 files.push(dat);
9488 }
9489 }
9490 unitTestData['files'] = files;
9491 unitTestData['idColumn'] = (covDat !== undefined); // should we include the id column
9492 _this.configuration.mainData.unitTestData = unitTestData;
9493 _this.configuration.addPage({
9494 name: 'unit-test',
9495 id: 'unit-test',
9496 context: 'unit-test',
9497 files: files,
9498 data: unitTestData,
9499 depth: 0,
9500 pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
9501 });
9502 if (_this.configuration.mainData.exportFormat === COMPODOC_DEFAULTS.exportFormat) {
9503 var keysToGet = ['statements', 'branches', 'functions', 'lines'];
9504 _.forEach(keysToGet, function (key) {
9505 if (unitTestData['total'][key]) {
9506 _this.htmlEngine.generateCoverageBadge(_this.configuration.mainData.output, key, { count: unitTestData['total'][key]['coveragePercent'],
9507 status: unitTestData['total'][key]['status'] });
9508 }
9509 });
9510 }
9511 resolve();
9512 });
9513 };
9514 Application.prototype.processPage = function (page) {
9515 logger.info('Process page', page.name);
9516 var htmlData = this.htmlEngine.render(this.configuration.mainData, page);
9517 var finalPath = this.configuration.mainData.output;
9518 if (this.configuration.mainData.output.lastIndexOf('/') === -1) {
9519 finalPath += '/';
9520 }
9521 if (page.path) {
9522 finalPath += page.path + '/';
9523 }
9524 if (page.filename) {
9525 finalPath += page.filename + '.html';
9526 }
9527 else {
9528 finalPath += page.name + '.html';
9529 }
9530 if (!this.configuration.mainData.disableSearch) {
9531 this.searchEngine.indexPage({
9532 infos: page,
9533 rawData: htmlData,
9534 url: finalPath
9535 });
9536 }
9537 return this.fileEngine.write(finalPath, htmlData).catch(function (err) {
9538 logger.error('Error during ' + page.name + ' page generation');
9539 return Promise.reject('');
9540 });
9541 };
9542 Application.prototype.processPages = function () {
9543 var _this = this;
9544 var pages = _.sortBy(this.configuration.pages, ['name']);
9545 logger.info('Process pages');
9546 Promise.all(pages.map(function (page) { return _this.processPage(page); }))
9547 .then(function () {
9548 var callbacksAfterGenerateSearchIndexJson = function () {
9549 if (_this.configuration.mainData.additionalPages.length > 0) {
9550 _this.processAdditionalPages();
9551 }
9552 else {
9553 if (_this.configuration.mainData.assetsFolder !== '') {
9554 _this.processAssetsFolder();
9555 }
9556 _this.processResources();
9557 }
9558 };
9559 if (!_this.configuration.mainData.disableSearch) {
9560 _this.searchEngine.generateSearchIndexJson(_this.configuration.mainData.output).then(function () {
9561 callbacksAfterGenerateSearchIndexJson();
9562 }, function (e) {
9563 logger.error(e);
9564 });
9565 }
9566 else {
9567 callbacksAfterGenerateSearchIndexJson();
9568 }
9569 })
9570 .then(function () {
9571 return _this.processMenu(_this.configuration.mainData);
9572 })
9573 .catch(function (e) {
9574 logger.error(e);
9575 });
9576 };
9577 Application.prototype.processMenu = function (mainData) {
9578 var _this = this;
9579 logger.info('Process menu...');
9580 return this.htmlEngine.renderMenu(this.configuration.mainData.templates, mainData).then(function (htmlData) {
9581 var finalPath = mainData.output + "/js/menu-wc.js";
9582 return _this.fileEngine.write(finalPath, htmlData).catch(function (err) {
9583 logger.error('Error during ' + finalPath + ' page generation');
9584 return Promise.reject('');
9585 });
9586 });
9587 };
9588 Application.prototype.processAdditionalPages = function () {
9589 var _this = this;
9590 logger.info('Process additional pages');
9591 var pages = this.configuration.mainData.additionalPages;
9592 Promise.all(pages.map(function (page, i) { return _this.processPage(page); }))
9593 .then(function () {
9594 _this.searchEngine
9595 .generateSearchIndexJson(_this.configuration.mainData.output)
9596 .then(function () {
9597 if (_this.configuration.mainData.assetsFolder !== '') {
9598 _this.processAssetsFolder();
9599 }
9600 _this.processResources();
9601 });
9602 })
9603 .catch(function (e) {
9604 logger.error(e);
9605 return Promise.reject(e);
9606 });
9607 };
9608 Application.prototype.processAssetsFolder = function () {
9609 logger.info('Copy assets folder');
9610 if (!this.fileEngine.existsSync(this.configuration.mainData.assetsFolder)) {
9611 logger.error("Provided assets folder " + this.configuration.mainData.assetsFolder + " did not exist");
9612 }
9613 else {
9614 var finalOutput = this.configuration.mainData.output;
9615 var testOutputDir = this.configuration.mainData.output.match(process.cwd());
9616 if (testOutputDir && testOutputDir.length > 0) {
9617 finalOutput = this.configuration.mainData.output.replace(process.cwd() + path.sep, '');
9618 }
9619 var destination = path.join(finalOutput, path.basename(this.configuration.mainData.assetsFolder));
9620 fs.copy(path.resolve(this.configuration.mainData.assetsFolder), path.resolve(destination), function (err) {
9621 if (err) {
9622 logger.error('Error during resources copy ', err);
9623 }
9624 });
9625 }
9626 };
9627 Application.prototype.processResources = function () {
9628 var _this = this;
9629 logger.info('Copy main resources');
9630 var onComplete = function () {
9631 logger.info('Documentation generated in ' +
9632 _this.configuration.mainData.output +
9633 ' in ' +
9634 _this.getElapsedTime() +
9635 ' seconds using ' +
9636 _this.configuration.mainData.theme +
9637 ' theme');
9638 if (_this.configuration.mainData.serve) {
9639 logger.info("Serving documentation from " + _this.configuration.mainData.output + " at http://127.0.0.1:" + _this.configuration.mainData.port);
9640 _this.runWebServer(_this.configuration.mainData.output);
9641 }
9642 else {
9643 generationPromiseResolve();
9644 _this.endCallback();
9645 }
9646 };
9647 var finalOutput = this.configuration.mainData.output;
9648 var testOutputDir = this.configuration.mainData.output.match(process.cwd());
9649 if (testOutputDir && testOutputDir.length > 0) {
9650 finalOutput = this.configuration.mainData.output.replace(process.cwd() + path.sep, '');
9651 }
9652 fs.copy(path.resolve(__dirname + '/../src/resources/'), path.resolve(finalOutput), function (errorCopy) {
9653 if (errorCopy) {
9654 logger.error('Error during resources copy ', errorCopy);
9655 }
9656 else {
9657 if (_this.configuration.mainData.extTheme) {
9658 fs.copy(path.resolve(process.cwd() + path.sep + _this.configuration.mainData.extTheme), path.resolve(finalOutput + '/styles/'), function (errorCopyTheme) {
9659 if (errorCopyTheme) {
9660 logger.error('Error during external styling theme copy ', errorCopyTheme);
9661 }
9662 else {
9663 logger.info('External styling theme copy succeeded');
9664 onComplete();
9665 }
9666 });
9667 }
9668 else {
9669 if (_this.configuration.mainData.customFavicon !== '') {
9670 logger.info("Custom favicon supplied");
9671 fs.copy(path.resolve(process.cwd() +
9672 path.sep +
9673 _this.configuration.mainData.customFavicon), path.resolve(finalOutput + '/images/favicon.ico'), function (errorCopyFavicon) {
9674 // tslint:disable-line
9675 if (errorCopyFavicon) {
9676 logger.error('Error during resources copy ', errorCopyFavicon);
9677 }
9678 else {
9679 onComplete();
9680 }
9681 });
9682 }
9683 else {
9684 onComplete();
9685 }
9686 }
9687 }
9688 });
9689 };
9690 /**
9691 * Calculates the elapsed time since the program was started.
9692 *
9693 * @returns {number}
9694 */
9695 Application.prototype.getElapsedTime = function () {
9696 return (new Date().valueOf() - startTime.valueOf()) / 1000;
9697 };
9698 Application.prototype.processGraphs = function () {
9699 var _this = this;
9700 if (this.configuration.mainData.disableGraph) {
9701 logger.info('Graph generation disabled');
9702 this.processPages();
9703 }
9704 else {
9705 logger.info('Process main graph');
9706 var modules_1 = this.configuration.mainData.modules;
9707 var i_1 = 0;
9708 var len_1 = modules_1.length;
9709 var loop_1 = function () {
9710 if (i_1 <= len_1 - 1) {
9711 logger.info('Process module graph', modules_1[i_1].name);
9712 var finalPath_2 = _this.configuration.mainData.output;
9713 if (_this.configuration.mainData.output.lastIndexOf('/') === -1) {
9714 finalPath_2 += '/';
9715 }
9716 finalPath_2 += 'modules/' + modules_1[i_1].name;
9717 var _rawModule = _this.dependenciesEngine.getRawModule(modules_1[i_1].name);
9718 if (_rawModule.declarations.length > 0 ||
9719 _rawModule.bootstrap.length > 0 ||
9720 _rawModule.imports.length > 0 ||
9721 _rawModule.exports.length > 0 ||
9722 _rawModule.providers.length > 0) {
9723 _this.ngdEngine
9724 .renderGraph(modules_1[i_1].file, finalPath_2, 'f', modules_1[i_1].name)
9725 .then(function () {
9726 _this.ngdEngine
9727 .readGraph(path.resolve(finalPath_2 + path.sep + 'dependencies.svg'), modules_1[i_1].name)
9728 .then(function (data) {
9729 modules_1[i_1].graph = data;
9730 i_1++;
9731 loop_1();
9732 }, function (err) {
9733 logger.error('Error during graph read: ', err);
9734 });
9735 }, function (errorMessage) {
9736 logger.error(errorMessage);
9737 });
9738 }
9739 else {
9740 i_1++;
9741 loop_1();
9742 }
9743 }
9744 else {
9745 _this.processPages();
9746 }
9747 };
9748 var finalMainGraphPath_1 = this.configuration.mainData.output;
9749 if (finalMainGraphPath_1.lastIndexOf('/') === -1) {
9750 finalMainGraphPath_1 += '/';
9751 }
9752 finalMainGraphPath_1 += 'graph';
9753 this.ngdEngine.init(path.resolve(finalMainGraphPath_1));
9754 this.ngdEngine
9755 .renderGraph(this.configuration.mainData.tsconfig, path.resolve(finalMainGraphPath_1), 'p')
9756 .then(function () {
9757 _this.ngdEngine
9758 .readGraph(path.resolve(finalMainGraphPath_1 + path.sep + 'dependencies.svg'), 'Main graph')
9759 .then(function (data) {
9760 _this.configuration.mainData.mainGraph = data;
9761 loop_1();
9762 }, function (err) {
9763 logger.error('Error during main graph reading : ', err);
9764 _this.configuration.mainData.disableMainGraph = true;
9765 loop_1();
9766 });
9767 }, function (err) {
9768 logger.error('Ooops error during main graph generation, moving on next part with main graph disabled : ', err);
9769 _this.configuration.mainData.disableMainGraph = true;
9770 loop_1();
9771 });
9772 }
9773 };
9774 Application.prototype.runWebServer = function (folder) {
9775 if (!this.isWatching) {
9776 LiveServer.start({
9777 root: folder,
9778 open: this.configuration.mainData.open,
9779 quiet: true,
9780 logLevel: 0,
9781 wait: 1000,
9782 port: this.configuration.mainData.port
9783 });
9784 }
9785 if (this.configuration.mainData.watch && !this.isWatching) {
9786 if (typeof this.files === 'undefined') {
9787 logger.error('No sources files available, please use -p flag');
9788 generationPromiseReject();
9789 process.exit(1);
9790 }
9791 else {
9792 this.runWatch();
9793 }
9794 }
9795 else if (this.configuration.mainData.watch && this.isWatching) {
9796 var srcFolder = findMainSourceFolder(this.files);
9797 logger.info("Already watching sources in " + srcFolder + " folder");
9798 }
9799 };
9800 Application.prototype.runWatch = function () {
9801 var _this = this;
9802 var sources = [findMainSourceFolder(this.files)];
9803 var watcherReady = false;
9804 this.isWatching = true;
9805 logger.info("Watching sources in " + findMainSourceFolder(this.files) + " folder");
9806 if ($markdownengine.hasRootMarkdowns()) {
9807 sources = sources.concat($markdownengine.listRootMarkdowns());
9808 }
9809 if (this.configuration.mainData.includes !== '') {
9810 sources = sources.concat(this.configuration.mainData.includes);
9811 }
9812 // Check all elements of sources list exist
9813 sources = cleanSourcesForWatch(sources);
9814 var watcher = chokidar.watch(sources, {
9815 awaitWriteFinish: true,
9816 ignoreInitial: true,
9817 ignored: /(spec|\.d)\.ts/
9818 });
9819 var timerAddAndRemoveRef;
9820 var timerChangeRef;
9821 var runnerAddAndRemove = function () {
9822 startTime = new Date();
9823 _this.generate();
9824 };
9825 var waiterAddAndRemove = function () {
9826 clearTimeout(timerAddAndRemoveRef);
9827 timerAddAndRemoveRef = setTimeout(runnerAddAndRemove, 1000);
9828 };
9829 var runnerChange = function () {
9830 startTime = new Date();
9831 _this.setUpdatedFiles(_this.watchChangedFiles);
9832 if (_this.hasWatchedFilesTSFiles()) {
9833 _this.getMicroDependenciesData();
9834 }
9835 else if (_this.hasWatchedFilesRootMarkdownFiles()) {
9836 _this.rebuildRootMarkdowns();
9837 }
9838 else {
9839 _this.rebuildExternalDocumentation();
9840 }
9841 };
9842 var waiterChange = function () {
9843 clearTimeout(timerChangeRef);
9844 timerChangeRef = setTimeout(runnerChange, 1000);
9845 };
9846 watcher.on('ready', function () {
9847 if (!watcherReady) {
9848 watcherReady = true;
9849 watcher
9850 .on('add', function (file) {
9851 logger.debug("File " + file + " has been added");
9852 // Test extension, if ts
9853 // rescan everything
9854 if (path.extname(file) === '.ts') {
9855 waiterAddAndRemove();
9856 }
9857 })
9858 .on('change', function (file) {
9859 logger.debug("File " + file + " has been changed");
9860 // Test extension, if ts
9861 // rescan only file
9862 if (path.extname(file) === '.ts' ||
9863 path.extname(file) === '.md' ||
9864 path.extname(file) === '.json') {
9865 _this.watchChangedFiles.push(path.join(process.cwd() + path.sep + file));
9866 waiterChange();
9867 }
9868 })
9869 .on('unlink', function (file) {
9870 logger.debug("File " + file + " has been removed");
9871 // Test extension, if ts
9872 // rescan everything
9873 if (path.extname(file) === '.ts') {
9874 waiterAddAndRemove();
9875 }
9876 });
9877 }
9878 });
9879 };
9880 Object.defineProperty(Application.prototype, "application", {
9881 /**
9882 * Return the application / root component instance.
9883 */
9884 get: function () {
9885 return this;
9886 },
9887 enumerable: true,
9888 configurable: true
9889 });
9890 Object.defineProperty(Application.prototype, "isCLI", {
9891 get: function () {
9892 return false;
9893 },
9894 enumerable: true,
9895 configurable: true
9896 });
9897 return Application;
9898}());
9899
9900var glob = require('glob');
9901var ParserUtil = /** @class */ (function () {
9902 function ParserUtil() {
9903 this._globFiles = [];
9904 }
9905 ParserUtil.prototype.init = function (exclude, cwd) {
9906 this._files = exclude;
9907 this._cwd = cwd;
9908 var i = 0;
9909 var len = exclude.length;
9910 for (i; i < len; i++) {
9911 this._globFiles = this._globFiles.concat(glob.sync(exclude[i], { cwd: this._cwd }));
9912 }
9913 };
9914 ParserUtil.prototype.testFilesWithCwdDepth = function () {
9915 var i = 0;
9916 var len = this._files.length;
9917 var result = {
9918 status: true,
9919 level: 0
9920 };
9921 for (i; i < len; i++) {
9922 var elementPath = path.resolve(this._cwd + path.sep, this._files[i]);
9923 if (elementPath.indexOf(this._cwd) === -1) {
9924 result.status = false;
9925 var level = this._files[i].match(/\..\//g).length;
9926 if (level > result.level) {
9927 result.level = level;
9928 }
9929 }
9930 }
9931 return result;
9932 };
9933 ParserUtil.prototype.updateCwd = function (cwd, level) {
9934 var _cwd = cwd, _rewind = '';
9935 for (var i = 0; i < level; i++) {
9936 _rewind += '../';
9937 }
9938 _cwd = path.resolve(_cwd, _rewind);
9939 return _cwd;
9940 };
9941 ParserUtil.prototype.testFile = function (file) {
9942 var _this = this;
9943 var i = 0;
9944 var len = this._files.length;
9945 var fileBasename = path.basename(file);
9946 var fileNameInCwd = file.replace(this._cwd + path.sep, '');
9947 var result = false;
9948 if (path.sep === '\\') {
9949 fileNameInCwd = fileNameInCwd.replace(new RegExp('\\' + path.sep, 'g'), '/');
9950 }
9951 for (i; i < len; i++) {
9952 if (glob.hasMagic(this._files[i]) && this._globFiles.length > 0) {
9953 var resultGlobSearch = this._globFiles.findIndex(function (element) {
9954 var elementPath = path.resolve(_this._cwd + path.sep, element);
9955 var elementPathInCwd = elementPath.replace(_this._cwd + path.sep, '');
9956 elementPathInCwd = elementPathInCwd.replace(new RegExp('\\' + path.sep, 'g'), '/');
9957 return elementPathInCwd === fileNameInCwd;
9958 });
9959 result = resultGlobSearch !== -1;
9960 }
9961 else {
9962 result = fileNameInCwd === this._files[i];
9963 }
9964 if (result) {
9965 break;
9966 }
9967 }
9968 return result;
9969 };
9970 return ParserUtil;
9971}());
9972
9973var pkg$1 = require('../package.json');
9974var program = require('commander');
9975var os = require('os');
9976var osName = require('os-name');
9977var cosmiconfig = require('cosmiconfig');
9978var cosmiconfigModuleName = 'compodoc';
9979var scannedFiles = [];
9980var excludeFiles;
9981var includeFiles;
9982var cwd$1 = process.cwd();
9983process.setMaxListeners(0);
9984var CliApplication = /** @class */ (function (_super) {
9985 __extends(CliApplication, _super);
9986 function CliApplication() {
9987 return _super !== null && _super.apply(this, arguments) || this;
9988 }
9989 /**
9990 * Run compodoc from the command line.
9991 */
9992 CliApplication.prototype.generate = function () {
9993 var _this = this;
9994 function list(val) {
9995 return val.split(',');
9996 }
9997 program
9998 .version(pkg$1.version)
9999 .usage('<src> [options]')
10000 .option('-c, --config [config]', 'A configuration file : .compodocrc, .compodocrc.json, .compodocrc.yaml or compodoc property in package.json')
10001 .option('-p, --tsconfig [config]', 'A tsconfig.json file')
10002 .option('-d, --output [folder]', 'Where to store the generated documentation', COMPODOC_DEFAULTS.folder)
10003 .option('-y, --extTheme [file]', 'External styling theme file')
10004 .option('-n, --name [name]', 'Title documentation', COMPODOC_DEFAULTS.title)
10005 .option('-a, --assetsFolder [folder]', 'External assets folder to copy in generated documentation folder')
10006 .option('-o, --open [value]', 'Open the generated documentation')
10007 .option('-t, --silent', "In silent mode, log messages aren't logged in the console", false)
10008 .option('-s, --serve', 'Serve generated documentation (default http://localhost:8080/)', false)
10009 .option('-r, --port [port]', 'Change default serving port', COMPODOC_DEFAULTS.port)
10010 .option('-w, --watch', 'Watch source files after serve and force documentation rebuild', false)
10011 .option('-e, --exportFormat [format]', 'Export in specified format (json, html)', COMPODOC_DEFAULTS.exportFormat)
10012 .option('--language [language]', 'Language used for the generated documentation (en-US, fr-FR, zh-CN)', COMPODOC_DEFAULTS.language)
10013 .option('--theme [theme]', "Choose one of available themes, default is 'gitbook' (laravel, original, material, postmark, readthedocs, stripe, vagrant)")
10014 .option('--hideGenerator', 'Do not print the Compodoc link at the bottom of the page', false)
10015 .option('--toggleMenuItems <items>', "Close by default items in the menu values : ['all'] or one of these ['modules','components','directives','classes','injectables','interfaces','pipes','additionalPages']", list, COMPODOC_DEFAULTS.toggleMenuItems)
10016 .option('--navTabConfig <tab configs>', "List navigation tab objects in the desired order with two string properties (\"id\" and \"label\"). Double-quotes must be escaped with '\\'. Available tab IDs are \"info\", \"readme\", \"source\", \"templateData\", \"tree\", and \"example\". Note: Certain tabs will only be shown if applicable to a given dependency", list, JSON.stringify(COMPODOC_DEFAULTS.navTabConfig))
10017 .option('--templates [folder]', 'Path to directory of Handlebars templates to override built-in templates')
10018 .option('--includes [path]', 'Path of external markdown files to include')
10019 .option('--includesName [name]', 'Name of item menu of externals markdown files', COMPODOC_DEFAULTS.additionalEntryName)
10020 .option('--coverageTest [threshold]', 'Test command of documentation coverage with a threshold (default 70)')
10021 .option('--coverageMinimumPerFile [minimum]', 'Test command of documentation coverage per file with a minimum (default 0)')
10022 .option('--coverageTestThresholdFail [true|false]', 'Test command of documentation coverage (global or per file) will fail with error or just warn user (true: error, false: warn)', COMPODOC_DEFAULTS.coverageTestThresholdFail)
10023 .option('--coverageTestShowOnlyFailed', 'Display only failed files for a coverage test')
10024 .option('--unitTestCoverage [json-summary]', 'To include unit test coverage, specify istanbul JSON coverage summary file')
10025 .option('--disableSourceCode', 'Do not add source code tab and links to source code', false)
10026 .option('--disableDomTree', 'Do not add dom tree tab', false)
10027 .option('--disableTemplateTab', 'Do not add template tab', false)
10028 .option('--disableGraph', 'Do not add the dependency graph', false)
10029 .option('--disableCoverage', 'Do not add the documentation coverage report', false)
10030 .option('--disablePrivate', 'Do not show private in generated documentation', false)
10031 .option('--disableProtected', 'Do not show protected in generated documentation', false)
10032 .option('--disableInternal', 'Do not show @internal in generated documentation', false)
10033 .option('--disableLifeCycleHooks', 'Do not show Angular lifecycle hooks in generated documentation', false)
10034 .option('--disableRoutesGraph', 'Do not add the routes graph', COMPODOC_DEFAULTS.disableRoutesGraph)
10035 .option('--disableSearch', 'Do not add the search input', false)
10036 .option('--minimal', 'Minimal mode with only documentation. No search, no graph, no coverage.', false)
10037 .option('--customFavicon [path]', 'Use a custom favicon')
10038 .option('--gaID [id]', 'Google Analytics tracking ID')
10039 .option('--gaSite [site]', 'Google Analytics site name', COMPODOC_DEFAULTS.gaSite)
10040 .parse(process.argv);
10041 var outputHelp = function () {
10042 program.outputHelp();
10043 process.exit(1);
10044 };
10045 var configExplorer = cosmiconfig(cosmiconfigModuleName);
10046 var configExplorerResult;
10047 var configFile = {};
10048 if (program.config) {
10049 var configFilePath = program.config;
10050 var testConfigFilePath = configFilePath.match(process.cwd());
10051 if (testConfigFilePath && testConfigFilePath.length > 0) {
10052 configFilePath = configFilePath.replace(process.cwd() + path.sep, '');
10053 }
10054 configExplorerResult = configExplorer.loadSync(path.resolve(configFilePath));
10055 }
10056 else {
10057 configExplorerResult = configExplorer.searchSync();
10058 }
10059 if (configExplorerResult) {
10060 if (typeof configExplorerResult.config !== 'undefined') {
10061 configFile = configExplorerResult.config;
10062 }
10063 }
10064 if (configFile.output) {
10065 this.configuration.mainData.output = configFile.output;
10066 }
10067 if (program.output && program.output !== COMPODOC_DEFAULTS.folder) {
10068 this.configuration.mainData.output = program.output;
10069 }
10070 if (configFile.extTheme) {
10071 this.configuration.mainData.extTheme = configFile.extTheme;
10072 }
10073 if (program.extTheme) {
10074 this.configuration.mainData.extTheme = program.extTheme;
10075 }
10076 if (configFile.language) {
10077 this.configuration.mainData.language = configFile.language;
10078 }
10079 if (program.language) {
10080 this.configuration.mainData.language = program.language;
10081 }
10082 if (configFile.theme) {
10083 this.configuration.mainData.theme = configFile.theme;
10084 }
10085 if (program.theme) {
10086 this.configuration.mainData.theme = program.theme;
10087 }
10088 if (configFile.name) {
10089 this.configuration.mainData.documentationMainName = configFile.name;
10090 }
10091 if (program.name && program.name !== COMPODOC_DEFAULTS.title) {
10092 this.configuration.mainData.documentationMainName = program.name;
10093 }
10094 if (configFile.assetsFolder) {
10095 this.configuration.mainData.assetsFolder = configFile.assetsFolder;
10096 }
10097 if (program.assetsFolder) {
10098 this.configuration.mainData.assetsFolder = program.assetsFolder;
10099 }
10100 if (configFile.open) {
10101 this.configuration.mainData.open = configFile.open;
10102 }
10103 if (program.open) {
10104 this.configuration.mainData.open = program.open;
10105 }
10106 if (configFile.toggleMenuItems) {
10107 this.configuration.mainData.toggleMenuItems = configFile.toggleMenuItems;
10108 }
10109 if (program.toggleMenuItems &&
10110 program.toggleMenuItems !== COMPODOC_DEFAULTS.toggleMenuItems) {
10111 this.configuration.mainData.toggleMenuItems = program.toggleMenuItems;
10112 }
10113 if (configFile.templates) {
10114 this.configuration.mainData.templates = configFile.templates;
10115 }
10116 if (program.templates) {
10117 this.configuration.mainData.templates = program.templates;
10118 }
10119 if (configFile.navTabConfig) {
10120 this.configuration.mainData.navTabConfig = configFile.navTabConfig;
10121 }
10122 if (program.navTabConfig &&
10123 JSON.parse(program.navTabConfig).length !== COMPODOC_DEFAULTS.navTabConfig.length) {
10124 this.configuration.mainData.navTabConfig = JSON.parse(program.navTabConfig);
10125 }
10126 if (configFile.includes) {
10127 this.configuration.mainData.includes = configFile.includes;
10128 }
10129 if (program.includes) {
10130 this.configuration.mainData.includes = program.includes;
10131 }
10132 if (configFile.includesName) {
10133 this.configuration.mainData.includesName = configFile.includesName;
10134 }
10135 if (program.includesName &&
10136 program.includesName !== COMPODOC_DEFAULTS.additionalEntryName) {
10137 this.configuration.mainData.includesName = program.includesName;
10138 }
10139 if (configFile.silent) {
10140 logger.silent = false;
10141 }
10142 if (program.silent) {
10143 logger.silent = false;
10144 }
10145 if (configFile.serve) {
10146 this.configuration.mainData.serve = configFile.serve;
10147 }
10148 if (program.serve) {
10149 this.configuration.mainData.serve = program.serve;
10150 }
10151 if (configFile.port) {
10152 this.configuration.mainData.port = configFile.port;
10153 }
10154 if (program.port && program.port !== COMPODOC_DEFAULTS.port) {
10155 this.configuration.mainData.port = program.port;
10156 }
10157 if (configFile.watch) {
10158 this.configuration.mainData.watch = configFile.watch;
10159 }
10160 if (program.watch) {
10161 this.configuration.mainData.watch = program.watch;
10162 }
10163 if (configFile.exportFormat) {
10164 this.configuration.mainData.exportFormat = configFile.exportFormat;
10165 }
10166 if (program.exportFormat && program.exportFormat !== COMPODOC_DEFAULTS.exportFormat) {
10167 this.configuration.mainData.exportFormat = program.exportFormat;
10168 }
10169 if (configFile.hideGenerator) {
10170 this.configuration.mainData.hideGenerator = configFile.hideGenerator;
10171 }
10172 if (program.hideGenerator) {
10173 this.configuration.mainData.hideGenerator = program.hideGenerator;
10174 }
10175 if (configFile.coverageTest) {
10176 this.configuration.mainData.coverageTest = true;
10177 this.configuration.mainData.coverageTestThreshold =
10178 typeof configFile.coverageTest === 'string'
10179 ? parseInt(configFile.coverageTest, 10)
10180 : COMPODOC_DEFAULTS.defaultCoverageThreshold;
10181 }
10182 if (program.coverageTest) {
10183 this.configuration.mainData.coverageTest = true;
10184 this.configuration.mainData.coverageTestThreshold =
10185 typeof program.coverageTest === 'string'
10186 ? parseInt(program.coverageTest, 10)
10187 : COMPODOC_DEFAULTS.defaultCoverageThreshold;
10188 }
10189 if (configFile.coverageMinimumPerFile) {
10190 this.configuration.mainData.coverageTestPerFile = true;
10191 this.configuration.mainData.coverageMinimumPerFile =
10192 typeof configFile.coverageMinimumPerFile === 'string'
10193 ? parseInt(configFile.coverageMinimumPerFile, 10)
10194 : COMPODOC_DEFAULTS.defaultCoverageMinimumPerFile;
10195 }
10196 if (program.coverageMinimumPerFile) {
10197 this.configuration.mainData.coverageTestPerFile = true;
10198 this.configuration.mainData.coverageMinimumPerFile =
10199 typeof program.coverageMinimumPerFile === 'string'
10200 ? parseInt(program.coverageMinimumPerFile, 10)
10201 : COMPODOC_DEFAULTS.defaultCoverageMinimumPerFile;
10202 }
10203 if (configFile.coverageTestThresholdFail) {
10204 this.configuration.mainData.coverageTestThresholdFail =
10205 configFile.coverageTestThresholdFail === 'false' ? false : true;
10206 }
10207 if (program.coverageTestThresholdFail) {
10208 this.configuration.mainData.coverageTestThresholdFail =
10209 program.coverageTestThresholdFail === 'false' ? false : true;
10210 }
10211 if (configFile.coverageTestShowOnlyFailed) {
10212 this.configuration.mainData.coverageTestShowOnlyFailed =
10213 configFile.coverageTestShowOnlyFailed;
10214 }
10215 if (program.coverageTestShowOnlyFailed) {
10216 this.configuration.mainData.coverageTestShowOnlyFailed =
10217 program.coverageTestShowOnlyFailed;
10218 }
10219 if (configFile.unitTestCoverage) {
10220 this.configuration.mainData.unitTestCoverage = configFile.unitTestCoverage;
10221 }
10222 if (program.unitTestCoverage) {
10223 this.configuration.mainData.unitTestCoverage = program.unitTestCoverage;
10224 }
10225 if (configFile.disableSourceCode) {
10226 this.configuration.mainData.disableSourceCode = configFile.disableSourceCode;
10227 }
10228 if (program.disableSourceCode) {
10229 this.configuration.mainData.disableSourceCode = program.disableSourceCode;
10230 }
10231 if (configFile.disableDomTree) {
10232 this.configuration.mainData.disableDomTree = configFile.disableDomTree;
10233 }
10234 if (program.disableDomTree) {
10235 this.configuration.mainData.disableDomTree = program.disableDomTree;
10236 }
10237 if (configFile.disableTemplateTab) {
10238 this.configuration.mainData.disableTemplateTab = configFile.disableTemplateTab;
10239 }
10240 if (program.disableTemplateTab) {
10241 this.configuration.mainData.disableTemplateTab = program.disableTemplateTab;
10242 }
10243 if (configFile.disableGraph) {
10244 this.configuration.mainData.disableGraph = configFile.disableGraph;
10245 }
10246 if (program.disableGraph) {
10247 this.configuration.mainData.disableGraph = program.disableGraph;
10248 }
10249 if (configFile.disableCoverage) {
10250 this.configuration.mainData.disableCoverage = configFile.disableCoverage;
10251 }
10252 if (program.disableCoverage) {
10253 this.configuration.mainData.disableCoverage = program.disableCoverage;
10254 }
10255 if (configFile.disablePrivate) {
10256 this.configuration.mainData.disablePrivate = configFile.disablePrivate;
10257 }
10258 if (program.disablePrivate) {
10259 this.configuration.mainData.disablePrivate = program.disablePrivate;
10260 }
10261 if (configFile.disableProtected) {
10262 this.configuration.mainData.disableProtected = configFile.disableProtected;
10263 }
10264 if (program.disableProtected) {
10265 this.configuration.mainData.disableProtected = program.disableProtected;
10266 }
10267 if (configFile.disableInternal) {
10268 this.configuration.mainData.disableInternal = configFile.disableInternal;
10269 }
10270 if (program.disableInternal) {
10271 this.configuration.mainData.disableInternal = program.disableInternal;
10272 }
10273 if (configFile.disableLifeCycleHooks) {
10274 this.configuration.mainData.disableLifeCycleHooks = configFile.disableLifeCycleHooks;
10275 }
10276 if (program.disableLifeCycleHooks) {
10277 this.configuration.mainData.disableLifeCycleHooks = program.disableLifeCycleHooks;
10278 }
10279 if (configFile.disableRoutesGraph) {
10280 this.configuration.mainData.disableRoutesGraph = configFile.disableRoutesGraph;
10281 }
10282 if (program.disableRoutesGraph) {
10283 this.configuration.mainData.disableRoutesGraph = program.disableRoutesGraph;
10284 }
10285 if (configFile.disableSearch) {
10286 this.configuration.mainData.disableSearch = configFile.disableSearch;
10287 }
10288 if (program.disableSearch) {
10289 this.configuration.mainData.disableSearch = program.disableSearch;
10290 }
10291 if (configFile.minimal) {
10292 this.configuration.mainData.disableSearch = true;
10293 this.configuration.mainData.disableRoutesGraph = true;
10294 this.configuration.mainData.disableGraph = true;
10295 this.configuration.mainData.disableCoverage = true;
10296 }
10297 if (program.minimal) {
10298 this.configuration.mainData.disableSearch = true;
10299 this.configuration.mainData.disableRoutesGraph = true;
10300 this.configuration.mainData.disableGraph = true;
10301 this.configuration.mainData.disableCoverage = true;
10302 }
10303 if (configFile.customFavicon) {
10304 this.configuration.mainData.customFavicon = configFile.customFavicon;
10305 }
10306 if (program.customFavicon) {
10307 this.configuration.mainData.customFavicon = program.customFavicon;
10308 }
10309 if (configFile.gaID) {
10310 this.configuration.mainData.gaID = configFile.gaID;
10311 }
10312 if (program.gaID) {
10313 this.configuration.mainData.gaID = program.gaID;
10314 }
10315 if (configFile.gaSite) {
10316 this.configuration.mainData.gaSite = configFile.gaSite;
10317 }
10318 if (program.gaSite && program.gaSite !== COMPODOC_DEFAULTS.gaSite) {
10319 this.configuration.mainData.gaSite = program.gaSite;
10320 }
10321 if (!this.isWatching) {
10322 console.log(fs.readFileSync(path.join(__dirname, '../src/banner')).toString());
10323 console.log(pkg$1.version);
10324 console.log('');
10325 console.log("Typescript version : " + Ast.ts.version);
10326 console.log('');
10327 console.log("Node.js version : " + process.version);
10328 console.log('');
10329 console.log("Operating system : " + osName(os.platform(), os.release()));
10330 console.log('');
10331 }
10332 if (configExplorerResult) {
10333 if (typeof configExplorerResult.config !== 'undefined') {
10334 logger.info("Using configuration file : " + configExplorerResult.filepath);
10335 }
10336 }
10337 if (!configExplorerResult) {
10338 logger.warn("No configuration file found, switching to CLI flags.");
10339 }
10340 if (program.language && !I18nEngineInstance.supportLanguage(program.language)) {
10341 logger.warn("The language " + program.language + " is not available, falling back to " + I18nEngineInstance.fallbackLanguage);
10342 }
10343 if (program.tsconfig && typeof program.tsconfig === 'boolean') {
10344 logger.error("Please provide a tsconfig file.");
10345 process.exit(1);
10346 }
10347 if (configFile.tsconfig) {
10348 this.configuration.mainData.tsconfig = configFile.tsconfig;
10349 }
10350 if (program.tsconfig) {
10351 this.configuration.mainData.tsconfig = program.tsconfig;
10352 }
10353 if (configFile.files) {
10354 scannedFiles = configFile.files;
10355 }
10356 if (configFile.exclude) {
10357 excludeFiles = configFile.exclude;
10358 }
10359 if (configFile.include) {
10360 includeFiles = configFile.include;
10361 }
10362 if (program.serve && !this.configuration.mainData.tsconfig && program.output) {
10363 // if -s & -d, serve it
10364 if (!this.fileEngine.existsSync(program.output)) {
10365 logger.error(program.output + " folder doesn't exist");
10366 process.exit(1);
10367 }
10368 else {
10369 logger.info("Serving documentation from " + program.output + " at http://127.0.0.1:" + program.port);
10370 _super.prototype.runWebServer.call(this, program.output);
10371 }
10372 }
10373 else if (program.serve && !this.configuration.mainData.tsconfig && !program.output) {
10374 // if only -s find ./documentation, if ok serve, else error provide -d
10375 if (!this.fileEngine.existsSync(program.output)) {
10376 logger.error('Provide output generated folder with -d flag');
10377 process.exit(1);
10378 }
10379 else {
10380 logger.info("Serving documentation from " + program.output + " at http://127.0.0.1:" + program.port);
10381 _super.prototype.runWebServer.call(this, program.output);
10382 }
10383 }
10384 else {
10385 if (program.hideGenerator) {
10386 this.configuration.mainData.hideGenerator = true;
10387 }
10388 if (this.configuration.mainData.tsconfig && program.args.length === 0) {
10389 /**
10390 * tsconfig file provided only
10391 */
10392 var testTsConfigPath = this.configuration.mainData.tsconfig.indexOf(process.cwd());
10393 if (testTsConfigPath !== -1) {
10394 this.configuration.mainData.tsconfig = this.configuration.mainData.tsconfig.replace(process.cwd() + path.sep, '');
10395 }
10396 if (!this.fileEngine.existsSync(this.configuration.mainData.tsconfig)) {
10397 logger.error("\"" + this.configuration.mainData.tsconfig + "\" file was not found in the current directory");
10398 process.exit(1);
10399 }
10400 else {
10401 var _file = path.join(path.join(process.cwd(), path.dirname(this.configuration.mainData.tsconfig)), path.basename(this.configuration.mainData.tsconfig));
10402 // use the current directory of tsconfig.json as a working directory
10403 cwd$1 = _file
10404 .split(path.sep)
10405 .slice(0, -1)
10406 .join(path.sep);
10407 logger.info('Using tsconfig file ', _file);
10408 var tsConfigFile = readConfig(_file);
10409 scannedFiles = tsConfigFile.files;
10410 if (scannedFiles) {
10411 scannedFiles = handlePath(scannedFiles, cwd$1);
10412 }
10413 if (typeof scannedFiles === 'undefined') {
10414 excludeFiles = tsConfigFile.exclude || [];
10415 includeFiles = tsConfigFile.include || [];
10416 scannedFiles = [];
10417 var excludeParser_1 = new ParserUtil(), includeParser_1 = new ParserUtil();
10418 excludeParser_1.init(excludeFiles, cwd$1);
10419 includeParser_1.init(includeFiles, cwd$1);
10420 var startCwd = cwd$1;
10421 var excludeParserTestFilesWithCwdDepth = excludeParser_1.testFilesWithCwdDepth();
10422 if (!excludeParserTestFilesWithCwdDepth.status) {
10423 startCwd = excludeParser_1.updateCwd(cwd$1, excludeParserTestFilesWithCwdDepth.level);
10424 }
10425 var includeParserTestFilesWithCwdDepth = includeParser_1.testFilesWithCwdDepth();
10426 if (!includeParser_1.testFilesWithCwdDepth().status) {
10427 startCwd = includeParser_1.updateCwd(cwd$1, includeParserTestFilesWithCwdDepth.level);
10428 }
10429 var finder = require('findit2')(startCwd || '.');
10430 finder.on('directory', function (dir, stat, stop) {
10431 var base = path.basename(dir);
10432 if (base === '.git' || base === 'node_modules') {
10433 stop();
10434 }
10435 });
10436 finder.on('file', function (file, stat) {
10437 if (/(spec|\.d)\.ts/.test(file)) {
10438 logger.warn('Ignoring', file);
10439 }
10440 else if (excludeParser_1.testFile(file) &&
10441 path.extname(file) === '.ts') {
10442 logger.warn('Excluding', file);
10443 }
10444 else if (includeFiles.length > 0) {
10445 /**
10446 * If include provided in tsconfig, use only this source,
10447 * and not files found with global findit scan in working directory
10448 */
10449 if (path.extname(file) === '.ts' && includeParser_1.testFile(file)) {
10450 logger.debug('Including', file);
10451 scannedFiles.push(file);
10452 }
10453 else {
10454 if (path.extname(file) === '.ts') {
10455 logger.warn('Excluding', file);
10456 }
10457 }
10458 }
10459 else {
10460 logger.debug('Including', file);
10461 scannedFiles.push(file);
10462 }
10463 });
10464 finder.on('end', function () {
10465 _super.prototype.setFiles.call(_this, scannedFiles);
10466 if (program.coverageTest || program.coverageTestPerFile) {
10467 logger.info('Run documentation coverage test');
10468 _super.prototype.testCoverage.call(_this);
10469 }
10470 else {
10471 _super.prototype.generate.call(_this);
10472 }
10473 });
10474 }
10475 else {
10476 _super.prototype.setFiles.call(this, scannedFiles);
10477 if (program.coverageTest || program.coverageTestPerFile) {
10478 logger.info('Run documentation coverage test');
10479 _super.prototype.testCoverage.call(this);
10480 }
10481 else {
10482 _super.prototype.generate.call(this);
10483 }
10484 }
10485 }
10486 }
10487 else if (this.configuration.mainData.tsconfig && program.args.length > 0) {
10488 /**
10489 * tsconfig file provided with source folder in arg
10490 */
10491 var testTsConfigPath = this.configuration.mainData.tsconfig.indexOf(process.cwd());
10492 if (testTsConfigPath !== -1) {
10493 this.configuration.mainData.tsconfig = this.configuration.mainData.tsconfig.replace(process.cwd() + path.sep, '');
10494 }
10495 var sourceFolder = program.args[0];
10496 if (!this.fileEngine.existsSync(sourceFolder)) {
10497 logger.error("Provided source folder " + sourceFolder + " was not found in the current directory");
10498 process.exit(1);
10499 }
10500 else {
10501 logger.info('Using provided source folder');
10502 if (!this.fileEngine.existsSync(this.configuration.mainData.tsconfig)) {
10503 logger.error("\"" + this.configuration.mainData.tsconfig + "\" file was not found in the current directory");
10504 process.exit(1);
10505 }
10506 else {
10507 var _file = path.join(path.join(process.cwd(), path.dirname(this.configuration.mainData.tsconfig)), path.basename(this.configuration.mainData.tsconfig));
10508 // use the current directory of tsconfig.json as a working directory
10509 cwd$1 = _file
10510 .split(path.sep)
10511 .slice(0, -1)
10512 .join(path.sep);
10513 logger.info('Using tsconfig file ', _file);
10514 var tsConfigFile = readConfig(_file);
10515 scannedFiles = tsConfigFile.files;
10516 if (scannedFiles) {
10517 scannedFiles = handlePath(scannedFiles, cwd$1);
10518 }
10519 if (typeof scannedFiles === 'undefined') {
10520 excludeFiles = tsConfigFile.exclude || [];
10521 includeFiles = tsConfigFile.include || [];
10522 scannedFiles = [];
10523 var excludeParser_2 = new ParserUtil(), includeParser_2 = new ParserUtil();
10524 excludeParser_2.init(excludeFiles, cwd$1);
10525 includeParser_2.init(includeFiles, cwd$1);
10526 var startCwd = sourceFolder;
10527 var excludeParserTestFilesWithCwdDepth = excludeParser_2.testFilesWithCwdDepth();
10528 if (!excludeParserTestFilesWithCwdDepth.status) {
10529 startCwd = excludeParser_2.updateCwd(cwd$1, excludeParserTestFilesWithCwdDepth.level);
10530 }
10531 var includeParserTestFilesWithCwdDepth = includeParser_2.testFilesWithCwdDepth();
10532 if (!includeParser_2.testFilesWithCwdDepth().status) {
10533 startCwd = includeParser_2.updateCwd(cwd$1, includeParserTestFilesWithCwdDepth.level);
10534 }
10535 var finder = require('findit2')(path.resolve(startCwd));
10536 finder.on('directory', function (dir, stat, stop) {
10537 var base = path.basename(dir);
10538 if (base === '.git' || base === 'node_modules') {
10539 stop();
10540 }
10541 });
10542 finder.on('file', function (file, stat) {
10543 if (/(spec|\.d)\.ts/.test(file)) {
10544 logger.warn('Ignoring', file);
10545 }
10546 else if (excludeParser_2.testFile(file)) {
10547 logger.warn('Excluding', file);
10548 }
10549 else if (includeFiles.length > 0) {
10550 /**
10551 * If include provided in tsconfig, use only this source,
10552 * and not files found with global findit scan in working directory
10553 */
10554 if (path.extname(file) === '.ts' &&
10555 includeParser_2.testFile(file)) {
10556 logger.debug('Including', file);
10557 scannedFiles.push(file);
10558 }
10559 else {
10560 if (path.extname(file) === '.ts') {
10561 logger.warn('Excluding', file);
10562 }
10563 }
10564 }
10565 else {
10566 logger.debug('Including', file);
10567 scannedFiles.push(file);
10568 }
10569 });
10570 finder.on('end', function () {
10571 _super.prototype.setFiles.call(_this, scannedFiles);
10572 if (program.coverageTest || program.coverageTestPerFile) {
10573 logger.info('Run documentation coverage test');
10574 _super.prototype.testCoverage.call(_this);
10575 }
10576 else {
10577 _super.prototype.generate.call(_this);
10578 }
10579 });
10580 }
10581 else {
10582 _super.prototype.setFiles.call(this, scannedFiles);
10583 if (program.coverageTest || program.coverageTestPerFile) {
10584 logger.info('Run documentation coverage test');
10585 _super.prototype.testCoverage.call(this);
10586 }
10587 else {
10588 _super.prototype.generate.call(this);
10589 }
10590 }
10591 }
10592 }
10593 }
10594 else {
10595 logger.error('tsconfig.json file was not found, please use -p flag');
10596 outputHelp();
10597 }
10598 }
10599 };
10600 return CliApplication;
10601}(Application));
10602
10603exports.Application = Application;
10604exports.CliApplication = CliApplication;
10605//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9sb2dnZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9jb21wYXJlLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL29yLmhlbHBlci50cyIsIi4uL3NyYy91dGlscy9hbmd1bGFyLWFwaS51dGlsLnRzIiwiLi4vc3JjL3V0aWxzL2FuZ3VsYXItdmVyc2lvbi51dGlsLnRzIiwiLi4vc3JjL3V0aWxzL2Jhc2ljLXR5cGUudXRpbC50cyIsIi4uL3NyYy91dGlscy9qc2RvYy1wYXJzZXIudXRpbC50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9maWxlLmVuZ2luZS50cyIsIi4uL3NyYy91dGlscy9pbXBvcnRzLnV0aWwudHMiLCIuLi9zcmMvdXRpbHMvcm91dGVyLXBhcnNlci51dGlsLnRzIiwiLi4vc3JjL3V0aWxzL2lzLW1vZHVsZS13aXRoLXByb3ZpZGVycy50cyIsIi4uL3NyYy91dGlscy9nZXQtbW9kdWxlLXdpdGgtcHJvdmlkZXJzLnRzIiwiLi4vc3JjL3V0aWxzL3VuaXFpZC50cyIsIi4uL3NyYy91dGlscy9saW5rLXBhcnNlci50cyIsIi4uL3NyYy91dGlscy9hbmd1bGFyLWxpZmVjeWNsZXMtaG9va3MudHMiLCIuLi9zcmMvdXRpbHMva2luZC10by10eXBlLnRzIiwiLi4vc3JjL3V0aWxzL3V0aWxzLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvZnVuY3Rpb24tc2lnbmF0dXJlLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL2lzLW5vdC10b2dnbGUuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvaXMtaW5pdGlhbC10YWIuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvaXMtdGFiLWVuYWJsZWQuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvaWYtc3RyaW5nLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL29yLWxlbmd0aC5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9maWx0ZXItYW5ndWxhcjItbW9kdWxlcy5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9kZWJ1Zy5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9icmVhay1saW5lcy5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9jbGVhbi1wYXJhZ3JhcGguaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvZXNjYXBlLXNpbXBsZS1xdW90ZS5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9icmVhay1jb21tYS5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9tb2RpZi1raW5kLWhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL21vZGlmLWljb24uaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvcmVsYXRpdmUtdXJsLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL2pzZG9jLXJldHVybnMtY29tbWVudC5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9qc2RvYy1jb2RlLWV4YW1wbGUuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvanNkb2MtZXhhbXBsZS5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9qc2RvYy1wYXJhbXMuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvanNkb2MtcGFyYW1zLXZhbGlkLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL2pzZG9jLWRlZmF1bHQuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvbGluay10eXBlLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL2luZGV4YWJsZS1zaWduYXR1cmUuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvb2JqZWN0LmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL29iamVjdC1sZW5ndGguaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvcGFyc2UtZGVzY3JpcHRpb24uaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvb25lLXBhcmFtZXRlci1oYXMuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvZWxlbWVudC1hbG9uZS5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9oYXMtb3duLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL3Nob3J0LXVybC5oZWxwZXIudHMiLCIuLi9zcmMvbG9jYWxlcy9lbi1VUy50cyIsIi4uL3NyYy9sb2NhbGVzL2ZyLUZSLnRzIiwiLi4vc3JjL2xvY2FsZXMvemgtQ04udHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaTE4bi5lbmdpbmUudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9pMThuLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLmVuZ2luZS5oZWxwZXJzLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwuZW5naW5lLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL21hcmtkb3duLmVuZ2luZS50cyIsIi4uL3NyYy91dGlscy9kZWZhdWx0cy50cyIsIi4uL3NyYy9hcHAvY29uZmlndXJhdGlvbi50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9uZ2QuZW5naW5lLnRzIiwiLi4vc3JjL3V0aWxzL2NvbnN0YW50cy50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9zZWFyY2guZW5naW5lLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2V4cG9ydC1qc29uLmVuZ2luZS50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9leHBvcnQuZW5naW5lLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2NvbXBvbmVudHMtdHJlZS5lbmdpbmUudHMiLCIuLi9zcmMvYXBwL2NvbXBpbGVyL2FuZ3VsYXIvZGVwcy9oZWxwZXJzL2NsYXNzLWhlbHBlci50cyIsIi4uL3NyYy91dGlscy90cy1wcmludGVyLnV0aWwudHMiLCIuLi9zcmMvYXBwL2NvbXBpbGVyL2FuZ3VsYXIvZGVwcy9oZWxwZXJzL3N5bWJvbC1oZWxwZXIudHMiLCIuLi9zcmMvdXRpbGl0aWVzLnRzIiwiLi4vc3JjL2FwcC9jb21waWxlci9hbmd1bGFyL2RlcHMvaGVscGVycy9jb21wb25lbnQtaGVscGVyLnRzIiwiLi4vc3JjL3V0aWxzL2V4dGVuZHMtbWVyZ2VyLnV0aWwudHMiLCIuLi9zcmMvYXBwL2NvbXBpbGVyL2ZyYW1ld29yay1kZXBlbmRlbmNpZXMudHMiLCIuLi9zcmMvYXBwL2NvbXBpbGVyL2FuZ3VsYXIvY29kZS1nZW5lcmF0b3IudHMiLCIuLi9zcmMvYXBwL2NvbXBpbGVyL2FuZ3VsYXIvZGVwcy9kaXJlY3RpdmUtZGVwLmZhY3RvcnkudHMiLCIuLi9zcmMvYXBwL2NvbXBpbGVyL2FuZ3VsYXIvZGVwcy9tb2R1bGUtZGVwLmZhY3RvcnkudHMiLCIuLi9zcmMvYXBwL2NvbXBpbGVyL2FuZ3VsYXIvZGVwcy9jb21wb25lbnQtZGVwLmZhY3RvcnkudHMiLCIuLi9zcmMvYXBwL2NvbXBpbGVyL2FuZ3VsYXIvZGVwcy9jb250cm9sbGVyLWRlcC5mYWN0b3J5LnRzIiwiLi4vc3JjL2FwcC9jb21waWxlci9hbmd1bGFyL2RlcHMvaGVscGVycy9tb2R1bGUtaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9jb21waWxlci9hbmd1bGFyL2RlcHMvaGVscGVycy9qcy1kb2MtaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9jb21waWxlci9hbmd1bGFyLWRlcGVuZGVuY2llcy50cyIsIi4uL3NyYy9hcHAvY29tcGlsZXIvYW5ndWxhcmpzLWRlcGVuZGVuY2llcy50cyIsIi4uL3NyYy91dGlscy9wcm9taXNlLXNlcXVlbnRpYWwudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvZGVwZW5kZW5jaWVzLmVuZ2luZS50cyIsIi4uL3NyYy9hcHAvYXBwbGljYXRpb24udHMiLCIuLi9zcmMvdXRpbHMvcGFyc2VyLnV0aWwuY2xhc3MudHMiLCIuLi9zcmMvaW5kZXgtY2xpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImxldCBsb2cgPSByZXF1aXJlKCdmYW5jeS1sb2cnKTtcbmxldCBjID0gcmVxdWlyZSgnY2hhbGsnKTtcbmxldCBwa2cgPSByZXF1aXJlKCcuLi9wYWNrYWdlLmpzb24nKTtcblxuZW51bSBMRVZFTCB7XG5cdElORk8sXG5cdERFQlVHLFxuXHRFUlJPUixcblx0V0FSTlxufVxuXG5jbGFzcyBMb2dnZXIge1xuXG5cdHB1YmxpYyBuYW1lO1xuXHRwdWJsaWMgbG9nZ2VyO1xuXHRwdWJsaWMgdmVyc2lvbjtcblx0cHVibGljIHNpbGVudDtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHR0aGlzLm5hbWUgPSBwa2cubmFtZTtcblx0XHR0aGlzLnZlcnNpb24gPSBwa2cudmVyc2lvbjtcblx0XHR0aGlzLmxvZ2dlciA9IGxvZztcblx0XHR0aGlzLnNpbGVudCA9IHRydWU7XG5cdH1cblxuXHRwdWJsaWMgaW5mbyguLi5hcmdzKSB7XG5cdFx0aWYgKCF0aGlzLnNpbGVudCkgeyByZXR1cm47IH1cblx0XHR0aGlzLmxvZ2dlcihcblx0XHRcdHRoaXMuZm9ybWF0KExFVkVMLklORk8sIC4uLmFyZ3MpXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBlcnJvciguLi5hcmdzKSB7XG5cdFx0aWYgKCF0aGlzLnNpbGVudCkgeyByZXR1cm47IH1cblx0XHR0aGlzLmxvZ2dlcihcblx0XHRcdHRoaXMuZm9ybWF0KExFVkVMLkVSUk9SLCAuLi5hcmdzKVxuICAgICAgICApO1xuXHR9XG5cblx0cHVibGljIHdhcm4oLi4uYXJncykge1xuXHRcdGlmICghdGhpcy5zaWxlbnQpIHsgcmV0dXJuOyB9XG5cdFx0dGhpcy5sb2dnZXIoXG5cdFx0XHR0aGlzLmZvcm1hdChMRVZFTC5XQVJOLCAuLi5hcmdzKVxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZGVidWcoLi4uYXJncykge1xuXHRcdGlmICghdGhpcy5zaWxlbnQpIHsgcmV0dXJuOyB9XG5cdFx0dGhpcy5sb2dnZXIoXG5cdFx0XHR0aGlzLmZvcm1hdChMRVZFTC5ERUJVRywgLi4uYXJncylcblx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBmb3JtYXQobGV2ZWwsIC4uLmFyZ3MpIHtcblxuXHRcdGxldCBwYWQgPSAocywgbCwgeiA9ICcnKSA9PiB7XG5cdFx0XHRyZXR1cm4gcyArIEFycmF5KE1hdGgubWF4KDAsIGwgLSBzLmxlbmd0aCArIDEpKS5qb2luKHopO1xuXHRcdH07XG5cblx0XHRsZXQgbXNnID0gYXJncy5qb2luKCcgJyk7XG5cdFx0aWYgKGFyZ3MubGVuZ3RoID4gMSkge1xuXHRcdFx0bXNnID0gYCR7cGFkKGFyZ3Muc2hpZnQoKSwgMTUsICcgJyl9OiAke2FyZ3Muam9pbignICcpfWA7XG5cdFx0fVxuXG5cblx0XHRzd2l0Y2ggKGxldmVsKSB7XG5cdFx0XHRjYXNlIExFVkVMLklORk86XG5cdFx0XHRcdG1zZyA9IGMuZ3JlZW4obXNnKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgTEVWRUwuREVCVUc6XG5cdFx0XHRcdG1zZyA9IGMuY3lhbihtc2cpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBMRVZFTC5XQVJOOlxuXHRcdFx0XHRtc2cgPSBjLnllbGxvdyhtc2cpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBMRVZFTC5FUlJPUjpcblx0XHRcdFx0bXNnID0gYy5yZWQobXNnKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIFtcblx0XHRcdG1zZ1xuXHRcdF0uam9pbignJyk7XG5cdH1cbn1cblxuZXhwb3J0IGxldCBsb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIENvbXBhcmVIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCBhOiBhbnksIG9wZXJhdG9yOiBzdHJpbmcsIGI6IGFueSwgb3B0aW9uczogSUhhbmRsZWJhcnNPcHRpb25zKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCA0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2hhbmRsZWJhcnMgSGVscGVyIHt7Y29tcGFyZX19IGV4cGVjdHMgNCBhcmd1bWVudHMnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICAgICAgICAgIGNhc2UgJ2luZGV4b2YnOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IChiLmluZGV4T2YoYSkgIT09IC0xKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJz09PSc6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gYSA9PT0gYjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJyE9PSc6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gYSAhPT0gYjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJz4nOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGEgPiBiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaGVscGVyIHt7Y29tcGFyZX19OiBpbnZhbGlkIG9wZXJhdG9yOiBgJyArIG9wZXJhdG9yICsgJ2AnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpO1xuICAgIH1cbn0iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIE9ySGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgLyogYW55LCBhbnksIC4uLiwgb3B0aW9ucyAqLykge1xuICAgICAgICBsZXQgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG4gICAgICAgIGxldCBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnMgPSBhcmd1bWVudHNbbGVuXTtcblxuICAgICAgICAvLyBXZSBzdGFydCBhdCAxIGJlY2F1c2Ugb2Ygb3B0aW9uc1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoYXJndW1lbnRzW2ldKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4oY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKGNvbnRleHQpO1xuICAgIH1cbn0iLCJpbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBJQXBpU291cmNlUmVzdWx0IH0gZnJvbSAnLi9hcGktc291cmNlLXJlc3VsdC5pbnRlcmZhY2UnO1xuXG5jb25zdCBBbmd1bGFyQVBJczogQXJyYXk8SUFuZ3VsYXJNYWluQXBpPiA9IHJlcXVpcmUoJy4uL3NyYy9kYXRhL2FwaS1saXN0Lmpzb24nKTtcblxuZXhwb3J0IGNsYXNzIEFuZ3VsYXJBcGlVdGlsIHtcbiAgICBwdWJsaWMgZmluZEFwaSh0eXBlOiBzdHJpbmcpOiBJQXBpU291cmNlUmVzdWx0PElBbmd1bGFyTWFpbkFwaT4ge1xuICAgICAgICBsZXQgZm91bmRlZEFwaTtcbiAgICAgICAgXy5mb3JFYWNoKEFuZ3VsYXJBUElzLCBtYWluQXBpID0+IHtcbiAgICAgICAgICAgIF8uZm9yRWFjaChtYWluQXBpLml0ZW1zLCBhcGkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhcGkudGl0bGUgPT09IHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZm91bmRlZEFwaSA9IGFwaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzb3VyY2U6ICdleHRlcm5hbCcsXG4gICAgICAgICAgICBkYXRhOiBmb3VuZGVkQXBpXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElBbmd1bGFyTWFpbkFwaSB7XG4gICAgdGl0bGU6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgaXRlbXM6IElBbmd1bGFyQXBpW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUFuZ3VsYXJBcGkge1xuICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgcGF0aDogc3RyaW5nO1xuICAgIGRvY1R5cGU6IHN0cmluZztcbiAgICBzdGFiaWxpdHk6IHN0cmluZztcbiAgICBzZWN1cmU6IHN0cmluZztcbiAgICBiYXJyZWw6IHN0cmluZztcbn1cbiIsImltcG9ydCAqIGFzIHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHsgSUFuZ3VsYXJBcGkgfSBmcm9tICcuL2FuZ3VsYXItYXBpLnV0aWwnO1xuXG5cbmV4cG9ydCBjbGFzcyBBbmd1bGFyVmVyc2lvblV0aWwge1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENvcmVQYWNrYWdlID0gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4gICAgcHVibGljIGNsZWFuVmVyc2lvbih2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdmVyc2lvbi5yZXBsYWNlKCd+JywgJycpXG4gICAgICAgICAgICAucmVwbGFjZSgnXicsICcnKVxuICAgICAgICAgICAgLnJlcGxhY2UoJz0nLCAnJylcbiAgICAgICAgICAgIC5yZXBsYWNlKCc8JywgJycpXG4gICAgICAgICAgICAucmVwbGFjZSgnPicsICcnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QW5ndWxhclZlcnNpb25PZlByb2plY3QocGFja2FnZURhdGEpOiBzdHJpbmcge1xuICAgICAgICBsZXQgX3Jlc3VsdCA9ICcnO1xuXG4gICAgICAgIGlmIChwYWNrYWdlRGF0YS5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgIGxldCBhbmd1bGFyQ29yZSA9IHBhY2thZ2VEYXRhLmRlcGVuZGVuY2llc1tBbmd1bGFyVmVyc2lvblV0aWwuQ29yZVBhY2thZ2VdO1xuICAgICAgICAgICAgaWYgKGFuZ3VsYXJDb3JlKSB7XG4gICAgICAgICAgICAgICAgX3Jlc3VsdCA9IHRoaXMuY2xlYW5WZXJzaW9uKGFuZ3VsYXJDb3JlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBfcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNBbmd1bGFyVmVyc2lvbkFyY2hpdmVkKHZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgcmVzdWx0O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXN1bHQgPSBzZW12ZXIuY29tcGFyZSh2ZXJzaW9uLCAnMi40LjEwJykgPD0gMDtcbiAgICAgICAgfSBjYXRjaCAoZSkgeyB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJlZml4T2ZmaWNpYWxEb2ModmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNBbmd1bGFyVmVyc2lvbkFyY2hpdmVkKHZlcnNpb24pID8gJ3YyLicgOiAnJztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QXBpTGluayhhcGk6IElBbmd1bGFyQXBpLCBhbmd1bGFyVmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGFuZ3VsYXJEb2NQcmVmaXggPSB0aGlzLnByZWZpeE9mZmljaWFsRG9jKGFuZ3VsYXJWZXJzaW9uKTtcbiAgICAgICAgcmV0dXJuIGBodHRwczovLyR7YW5ndWxhckRvY1ByZWZpeH1hbmd1bGFyLmlvLyR7YXBpLnBhdGh9YDtcbiAgICB9XG59XG4iLCJlbnVtIEJhc2ljVHlwZXMge1xuICAgIG51bWJlcixcbiAgICBib29sZWFuLFxuICAgIHN0cmluZyxcbiAgICBvYmplY3QsXG4gICAgZGF0ZSxcbiAgICBmdW5jdGlvblxufVxuXG5lbnVtIEJhc2ljVHlwZVNjcmlwdFR5cGVzIHtcbiAgICBhbnksXG4gICAgdm9pZFxufVxuXG5leHBvcnQgY2xhc3MgQmFzaWNUeXBlVXRpbCB7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBnaXZlbiB0eXBlcyBpcyBhIGJhc2ljIGphdmFzY3JpcHQgdHlwZVxuICAgICAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzXG4gICAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgdG8gY2hlY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNKYXZhc2NyaXB0VHlwZSh0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0eXBlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuICh0eXBlLnRvTG93ZXJDYXNlKCkgaW4gQmFzaWNUeXBlcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBnaXZlbiB0eXBlIGlzIGEgdHlwZXNjcmlwdCB0eXBlIChUaGF0IGlzIG5vdCBhIGphdmFzY3JpcHQgdHlwZSlcbiAgICAgKiBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay9iYXNpYy10eXBlcy5odG1sXG4gICAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgdG8gY2hlY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNUeXBlU2NyaXB0VHlwZSh0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0eXBlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuICh0eXBlLnRvTG93ZXJDYXNlKCkgaW4gQmFzaWNUeXBlU2NyaXB0VHlwZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIHR5cGUgaXMgYSB0eXBlc2NyaXB0IG9yIGphdmFzY3JpcHQgdHlwZVxuICAgICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIHRvIGNoZWNrXG4gICAgICovXG4gICAgcHVibGljIGlzS25vd25UeXBlKHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0phdmFzY3JpcHRUeXBlKHR5cGUpIHx8IHRoaXMuaXNUeXBlU2NyaXB0VHlwZSh0eXBlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgb2ZmaWNpYWwgZG9jdW1lbnRhdGlvbiBsaW5rIHRvIGVpdGhlciB0aGUgamF2YXNjcmlwdCBvciB0eXBlc2NyaXB0IHR5cGVcbiAgICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSB0byBjaGVja1xuICAgICAqIEByZXR1cm5zIFRoZSBkb2N1bWVudGF0aW9uIGxpbmsgb3IgdW5kZWZpbmVkIGlmIHR5cGUgbm90IGZvdW5kXG4gICAgICovXG4gICAgcHVibGljIGdldFR5cGVVcmwodHlwZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNKYXZhc2NyaXB0VHlwZSh0eXBlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy8ke3R5cGV9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzVHlwZVNjcmlwdFR5cGUodHlwZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBgaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svYmFzaWMtdHlwZXMuaHRtbGA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IHRzLCBTeW50YXhLaW5kIH0gZnJvbSAndHMtc2ltcGxlLWFzdCc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCB7IEpTRG9jUGFyYW1ldGVyVGFnRXh0IH0gZnJvbSAnLi4vYXBwL25vZGVzL2pzZG9jLXBhcmFtZXRlci10YWcubm9kZSc7XG5cbmV4cG9ydCBjbGFzcyBKc2RvY1BhcnNlclV0aWwge1xuICAgIHB1YmxpYyBpc1ZhcmlhYmxlTGlrZShub2RlOiB0cy5Ob2RlKTogbm9kZSBpcyB0cy5WYXJpYWJsZUxpa2VEZWNsYXJhdGlvbiB7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKG5vZGUua2luZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5CaW5kaW5nRWxlbWVudDpcbiAgICAgICAgICAgICAgICBjYXNlIFN5bnRheEtpbmQuRW51bU1lbWJlcjpcbiAgICAgICAgICAgICAgICBjYXNlIFN5bnRheEtpbmQuUGFyYW1ldGVyOlxuICAgICAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5Qcm9wZXJ0eUFzc2lnbm1lbnQ6XG4gICAgICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLlByb3BlcnR5RGVjbGFyYXRpb246XG4gICAgICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLlByb3BlcnR5U2lnbmF0dXJlOlxuICAgICAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5TaG9ydGhhbmRQcm9wZXJ0eUFzc2lnbm1lbnQ6XG4gICAgICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLlZhcmlhYmxlRGVjbGFyYXRpb246XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TWFpbkNvbW1lbnRPZk5vZGUobm9kZTogdHMuTm9kZSk6IHN0cmluZyB7XG4gICAgICAgIGxldCBkZXNjcmlwdGlvbjogc3RyaW5nID0gJyc7XG4gICAgICAgIGlmIChub2RlLmpzRG9jKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5qc0RvYy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBub2RlLmpzRG9jWzBdLmNvbW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gbm9kZS5qc0RvY1swXS5jb21tZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRKU0RvY1RhZ3Mobm9kZTogdHMuTm9kZSwga2luZDogU3ludGF4S2luZCk6IHRzLkpTRG9jVGFnW10ge1xuICAgICAgICBjb25zdCBkb2NzID0gdGhpcy5nZXRKU0RvY3Mobm9kZSk7XG4gICAgICAgIGlmIChkb2NzKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IHRzLkpTRG9jVGFnW10gPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZG9jIG9mIGRvY3MpIHtcbiAgICAgICAgICAgICAgICBpZiAodHMuaXNKU0RvY1BhcmFtZXRlclRhZyhkb2MpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb2Mua2luZCA9PT0ga2luZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZG9jKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHMuaXNKU0RvYyhkb2MpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKC4uLl8uZmlsdGVyKGRvYy50YWdzLCB0YWcgPT4gdGFnLmtpbmQgPT09IGtpbmQpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgdHlwZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SlNEb2NzKG5vZGU6IHRzLk5vZGUpOiBSZWFkb25seUFycmF5PHRzLkpTRG9jIHwgdHMuSlNEb2NUYWc+IHtcbiAgICAgICAgLy8gVE9ETzoganNEb2NDYWNoZSBpcyBpbnRlcm5hbCwgc2VlIGlmIHRoZXJlJ3MgYSB3YXkgYXJvdW5kIGl0XG4gICAgICAgIGxldCBjYWNoZTogUmVhZG9ubHlBcnJheTx0cy5KU0RvYyB8IHRzLkpTRG9jVGFnPiA9IChub2RlIGFzIGFueSkuanNEb2NDYWNoZTtcbiAgICAgICAgaWYgKCFjYWNoZSkge1xuICAgICAgICAgICAgY2FjaGUgPSB0aGlzLmdldEpTRG9jc1dvcmtlcihub2RlLCBbXSkuZmlsdGVyKHggPT4geCk7XG4gICAgICAgICAgICAobm9kZSBhcyBhbnkpLmpzRG9jQ2FjaGUgPSBjYWNoZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FjaGU7XG4gICAgfVxuXG4gICAgLy8gVHJ5IHRvIHJlY29nbml6ZSB0aGlzIHBhdHRlcm4gd2hlbiBub2RlIGlzIGluaXRpYWxpemVyXG4gICAgLy8gb2YgdmFyaWFibGUgZGVjbGFyYXRpb24gYW5kIEpTRG9jIGNvbW1lbnRzIGFyZSBvbiBjb250YWluaW5nIHZhcmlhYmxlIHN0YXRlbWVudC5cbiAgICAvLyAvKipcbiAgICAvLyAgICogQHBhcmFtIHtudW1iZXJ9IG5hbWVcbiAgICAvLyAgICogQHJldHVybnMge251bWJlcn1cbiAgICAvLyAgICovXG4gICAgLy8gdmFyIHggPSBmdW5jdGlvbihuYW1lKSB7IHJldHVybiBuYW1lLmxlbmd0aDsgfVxuICAgIHByaXZhdGUgZ2V0SlNEb2NzV29ya2VyKG5vZGU6IHRzLk5vZGUsIGNhY2hlKTogUmVhZG9ubHlBcnJheTxhbnk+IHtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gbm9kZS5wYXJlbnQ7XG4gICAgICAgIGNvbnN0IGlzSW5pdGlhbGl6ZXJPZlZhcmlhYmxlRGVjbGFyYXRpb25JblN0YXRlbWVudCA9XG4gICAgICAgICAgICB0aGlzLmlzVmFyaWFibGVMaWtlKHBhcmVudCkgJiZcbiAgICAgICAgICAgIHBhcmVudC5pbml0aWFsaXplciA9PT0gbm9kZSAmJlxuICAgICAgICAgICAgdHMuaXNWYXJpYWJsZVN0YXRlbWVudChwYXJlbnQucGFyZW50LnBhcmVudCk7XG4gICAgICAgIGNvbnN0IGlzVmFyaWFibGVPZlZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgPVxuICAgICAgICAgICAgdGhpcy5pc1ZhcmlhYmxlTGlrZShub2RlKSAmJiB0cy5pc1ZhcmlhYmxlU3RhdGVtZW50KHBhcmVudC5wYXJlbnQpO1xuICAgICAgICBjb25zdCB2YXJpYWJsZVN0YXRlbWVudE5vZGUgPSBpc0luaXRpYWxpemVyT2ZWYXJpYWJsZURlY2xhcmF0aW9uSW5TdGF0ZW1lbnRcbiAgICAgICAgICAgID8gcGFyZW50LnBhcmVudC5wYXJlbnRcbiAgICAgICAgICAgIDogaXNWYXJpYWJsZU9mVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudFxuICAgICAgICAgICAgICAgID8gcGFyZW50LnBhcmVudFxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAodmFyaWFibGVTdGF0ZW1lbnROb2RlKSB7XG4gICAgICAgICAgICBjYWNoZSA9IHRoaXMuZ2V0SlNEb2NzV29ya2VyKHZhcmlhYmxlU3RhdGVtZW50Tm9kZSwgY2FjaGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWxzbyByZWNvZ25pemUgd2hlbiB0aGUgbm9kZSBpcyB0aGUgUkhTIG9mIGFuIGFzc2lnbm1lbnQgZXhwcmVzc2lvblxuICAgICAgICBjb25zdCBpc1NvdXJjZU9mQXNzaWdubWVudEV4cHJlc3Npb25TdGF0ZW1lbnQgPVxuICAgICAgICAgICAgcGFyZW50ICYmXG4gICAgICAgICAgICBwYXJlbnQucGFyZW50ICYmXG4gICAgICAgICAgICB0cy5pc0JpbmFyeUV4cHJlc3Npb24ocGFyZW50KSAmJlxuICAgICAgICAgICAgcGFyZW50Lm9wZXJhdG9yVG9rZW4ua2luZCA9PT0gU3ludGF4S2luZC5FcXVhbHNUb2tlbiAmJlxuICAgICAgICAgICAgdHMuaXNFeHByZXNzaW9uU3RhdGVtZW50KHBhcmVudC5wYXJlbnQpO1xuICAgICAgICBpZiAoaXNTb3VyY2VPZkFzc2lnbm1lbnRFeHByZXNzaW9uU3RhdGVtZW50KSB7XG4gICAgICAgICAgICBjYWNoZSA9IHRoaXMuZ2V0SlNEb2NzV29ya2VyKHBhcmVudC5wYXJlbnQsIGNhY2hlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzTW9kdWxlRGVjbGFyYXRpb24gPVxuICAgICAgICAgICAgdHMuaXNNb2R1bGVEZWNsYXJhdGlvbihub2RlKSAmJiBwYXJlbnQgJiYgdHMuaXNNb2R1bGVEZWNsYXJhdGlvbihwYXJlbnQpO1xuICAgICAgICBjb25zdCBpc1Byb3BlcnR5QXNzaWdubWVudEV4cHJlc3Npb24gPSBwYXJlbnQgJiYgdHMuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocGFyZW50KTtcbiAgICAgICAgaWYgKGlzTW9kdWxlRGVjbGFyYXRpb24gfHwgaXNQcm9wZXJ0eUFzc2lnbm1lbnRFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICBjYWNoZSA9IHRoaXMuZ2V0SlNEb2NzV29ya2VyKHBhcmVudCwgY2FjaGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHVsbCBwYXJhbWV0ZXIgY29tbWVudHMgZnJvbSBkZWNsYXJpbmcgZnVuY3Rpb24gYXMgd2VsbFxuICAgICAgICBpZiAodHMuaXNQYXJhbWV0ZXIobm9kZSkpIHtcbiAgICAgICAgICAgIGNhY2hlID0gXy5jb25jYXQoY2FjaGUsIHRoaXMuZ2V0SlNEb2NQYXJhbWV0ZXJUYWdzKG5vZGUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzVmFyaWFibGVMaWtlKG5vZGUpICYmIG5vZGUuaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgIGNhY2hlID0gXy5jb25jYXQoY2FjaGUsIG5vZGUuaW5pdGlhbGl6ZXIuanNEb2MpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FjaGUgPSBfLmNvbmNhdChjYWNoZSwgbm9kZS5qc0RvYyk7XG5cbiAgICAgICAgcmV0dXJuIGNhY2hlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0SlNEb2NQYXJhbWV0ZXJUYWdzKFxuICAgICAgICBwYXJhbTogdHMuUGFyYW1ldGVyRGVjbGFyYXRpb25cbiAgICApOiBSZWFkb25seUFycmF5PHRzLkpTRG9jUGFyYW1ldGVyVGFnPiB7XG4gICAgICAgIGNvbnN0IGZ1bmMgPSBwYXJhbS5wYXJlbnQgYXMgdHMuRnVuY3Rpb25MaWtlRGVjbGFyYXRpb247XG4gICAgICAgIGNvbnN0IHRhZ3MgPSB0aGlzLmdldEpTRG9jVGFncyhcbiAgICAgICAgICAgIGZ1bmMsXG4gICAgICAgICAgICBTeW50YXhLaW5kLkpTRG9jUGFyYW1ldGVyVGFnXG4gICAgICAgICkgYXMgdHMuSlNEb2NQYXJhbWV0ZXJUYWdbXTtcblxuICAgICAgICBpZiAoIXBhcmFtLm5hbWUpIHtcbiAgICAgICAgICAgIC8vIHRoaXMgaXMgYW4gYW5vbnltb3VzIGpzZG9jIHBhcmFtIGZyb20gYSBgZnVuY3Rpb24odHlwZTEsIHR5cGUyKTogdHlwZTNgIHNwZWNpZmljYXRpb25cbiAgICAgICAgICAgIGNvbnN0IGkgPSBmdW5jLnBhcmFtZXRlcnMuaW5kZXhPZihwYXJhbSk7XG4gICAgICAgICAgICBjb25zdCBwYXJhbVRhZ3MgPSBfLmZpbHRlcih0YWdzLCB0YWcgPT4gdHMuaXNKU0RvY1BhcmFtZXRlclRhZyh0YWcpKTtcblxuICAgICAgICAgICAgaWYgKHBhcmFtVGFncyAmJiAwIDw9IGkgJiYgaSA8IHBhcmFtVGFncy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW3BhcmFtVGFnc1tpXV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHMuaXNJZGVudGlmaWVyKHBhcmFtLm5hbWUpKSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gcGFyYW0ubmFtZS50ZXh0O1xuICAgICAgICAgICAgcmV0dXJuIF8uZmlsdGVyKHRhZ3MsIHRhZyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRzICYmIHRzLmlzSlNEb2NQYXJhbWV0ZXJUYWcodGFnKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdDogSlNEb2NQYXJhbWV0ZXJUYWdFeHQgPSB0YWc7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdC5wYXJhbWV0ZXJOYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucGFyYW1ldGVyTmFtZS50ZXh0ID09PSBuYW1lO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0Lm5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHQubmFtZS5lc2NhcGVkVGV4dCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5uYW1lLmVzY2FwZWRUZXh0ID09PSBuYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBpdCdzIGEgZGVzdHJ1Y3R1cmVkIHBhcmFtZXRlciwgc28gaXQgc2hvdWxkIGxvb2sgdXAgYW4gXCJvYmplY3QgdHlwZVwiIHNlcmllcyBvZiBtdWx0aXBsZSBsaW5lc1xuICAgICAgICAgICAgLy8gQnV0IG11bHRpLWxpbmUgb2JqZWN0IHR5cGVzIGFyZW4ndCBzdXBwb3J0ZWQgeWV0IGVpdGhlclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmV4cG9ydCBjbGFzcyBGaWxlRW5naW5lIHtcbiAgICBwdWJsaWMgZ2V0KGZpbGVwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgZnMucmVhZEZpbGUocGF0aC5yZXNvbHZlKGZpbGVwYXRoKSwgJ3V0ZjgnLCAoZXJyLCBkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoJ0Vycm9yIGR1cmluZyAnICsgZmlsZXBhdGggKyAnIHJlYWQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGUoZmlsZXBhdGg6IHN0cmluZywgY29udGVudHM6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgZnMub3V0cHV0RmlsZShwYXRoLnJlc29sdmUoZmlsZXBhdGgpLCBjb250ZW50cywgZXJyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFN5bmMoZmlsZXBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKGZpbGVwYXRoKSwgJ3V0ZjgnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZmlsZSBUaGUgZmlsZSB0byBjaGVja1xuICAgICAqL1xuICAgIHB1YmxpYyBleGlzdHNTeW5jKGZpbGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhmaWxlKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQgQXN0LCB7IFByb3BlcnR5RGVjbGFyYXRpb24sIHRzLCBTeW50YXhLaW5kIH0gZnJvbSAndHMtc2ltcGxlLWFzdCc7XG5cbmNvbnN0IGFzdCA9IG5ldyBBc3QoKTtcblxuZXhwb3J0IGNsYXNzIEltcG9ydHNVdGlsIHtcbiAgICAvKipcbiAgICAgKiBGaW5kIGZvciBhIHNvdXJjZUZpbGUgYSB2YXJpYWJsZSB2YWx1ZSBpbiBhIGxvY2FsIGVudW1cbiAgICAgKiBAcGFyYW0gc3JjRmlsZVxuICAgICAqIEBwYXJhbSB2YXJpYWJsZU5hbWVcbiAgICAgKiBAcGFyYW0gdmFyaWFibGVWYWx1ZVxuICAgICAqL1xuICAgIHByaXZhdGUgZmluZEluRW51bXMoc3JjRmlsZSwgdmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhcmlhYmxlVmFsdWU6IHN0cmluZykge1xuICAgICAgICBsZXQgcmVzID0gJyc7XG4gICAgICAgIHNyY0ZpbGUuZ2V0RW51bShlID0+IHtcbiAgICAgICAgICAgIGlmIChlLmdldE5hbWUoKSA9PT0gdmFyaWFibGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgZS5nZXRNZW1iZXIobSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtLmdldE5hbWUoKSA9PT0gdmFyaWFibGVWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gbS5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmQgZm9yIGEgc291cmNlRmlsZSBhIHZhcmlhYmxlIHZhbHVlIGluIGEgbG9jYWwgc3RhdGljIGNsYXNzXG4gICAgICogQHBhcmFtIHNyY0ZpbGVcbiAgICAgKiBAcGFyYW0gdmFyaWFibGVOYW1lXG4gICAgICogQHBhcmFtIHZhcmlhYmxlVmFsdWVcbiAgICAgKi9cbiAgICBwcml2YXRlIGZpbmRJbkNsYXNzZXMoc3JjRmlsZSwgdmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhcmlhYmxlVmFsdWU6IHN0cmluZykge1xuICAgICAgICBsZXQgcmVzID0gJyc7XG4gICAgICAgIHNyY0ZpbGUuZ2V0Q2xhc3MoYyA9PiB7XG4gICAgICAgICAgICBsZXQgc3RhdGljUHJvcGVydHk6IFByb3BlcnR5RGVjbGFyYXRpb24gPSBjLmdldFN0YXRpY1Byb3BlcnR5KHZhcmlhYmxlVmFsdWUpO1xuICAgICAgICAgICAgaWYgKHN0YXRpY1Byb3BlcnR5KSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRpY1Byb3BlcnR5LmdldEluaXRpYWxpemVyKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzID0gc3RhdGljUHJvcGVydHkuZ2V0SW5pdGlhbGl6ZXIoKS5nZXRUZXh0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kIGEgdmFsdWUgaW4gYSBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiBsaWtlIGFuIG9iamVjdFxuICAgICAqIEBwYXJhbSB2YXJpYWJsZURlY2xhcmF0aW9uXG4gICAgICogQHBhcmFtIHZhcmlhYmxlc0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwcml2YXRlIGZpbmRJbk9iamVjdFZhcmlhYmxlRGVjbGFyYXRpb24odmFyaWFibGVEZWNsYXJhdGlvbiwgdmFyaWFibGVzQXR0cmlidXRlcykge1xuICAgICAgICBsZXQgdmFyaWFibGVLaW5kID0gdmFyaWFibGVEZWNsYXJhdGlvbi5nZXRLaW5kKCk7XG4gICAgICAgIGlmICh2YXJpYWJsZUtpbmQgJiYgdmFyaWFibGVLaW5kID09PSBTeW50YXhLaW5kLlZhcmlhYmxlRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgIGxldCBpbml0aWFsaXplciA9IHZhcmlhYmxlRGVjbGFyYXRpb24uZ2V0SW5pdGlhbGl6ZXIoKTtcbiAgICAgICAgICAgIGlmIChpbml0aWFsaXplcikge1xuICAgICAgICAgICAgICAgIGxldCBpbml0aWFsaXplcktpbmQgPSBpbml0aWFsaXplci5nZXRLaW5kKCk7XG4gICAgICAgICAgICAgICAgaWYgKGluaXRpYWxpemVyS2luZCAmJiBpbml0aWFsaXplcktpbmQgPT09IFN5bnRheEtpbmQuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbXBpbGVyTm9kZSA9IGluaXRpYWxpemVyLmNvbXBpbGVyTm9kZSBhcyB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsVmFsdWUgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgLy8gRmluZCB0aGVzdHJpbmcgZnJvbSBBVkFSLkJWQVIudGhlc3RyaW5nIGluc2lkZSBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgICAgIGxldCBkZXB0aCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsb29wUHJvcGVydGllcyA9IHByb3BlcnRpZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlc0F0dHJpYnV0ZXNbZGVwdGggKyAxXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AubmFtZS5nZXRUZXh0KCkgPT09IHZhcmlhYmxlc0F0dHJpYnV0ZXNbZGVwdGggKyAxXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wLmluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wLmluaXRpYWxpemVyLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wUHJvcGVydGllcyhwcm9wLmluaXRpYWxpemVyLnByb3BlcnRpZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxWYWx1ZSA9IHByb3AuaW5pdGlhbGl6ZXIudGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsVmFsdWUgPSBwcm9wLmluaXRpYWxpemVyLnRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGxvb3BQcm9wZXJ0aWVzKGNvbXBpbGVyTm9kZS5wcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbmFsVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZCBpbiBpbXBvcnRzIHNvbWV0aGluZyBsaWtlIG15dmFyXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBpbnB1dFZhcmlhYmxlTmFtZSAgICAgICAgICAgICAgbGlrZSBteXZhclxuICAgICAqIEByZXR1cm4ge1t0eXBlXX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15dmFyIHZhbHVlXG4gICAgICovXG4gICAgcHVibGljIGZpbmRWYWx1ZUluSW1wb3J0T3JMb2NhbFZhcmlhYmxlcyhpbnB1dFZhcmlhYmxlTmFtZTogc3RyaW5nLCBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlKSB7XG4gICAgICAgIGxldCBtZXRhZGF0YVZhcmlhYmxlTmFtZSA9IGlucHV0VmFyaWFibGVOYW1lLFxuICAgICAgICAgICAgc2VhcmNoZWRJbXBvcnQsXG4gICAgICAgICAgICBhbGlhc09yaWdpbmFsTmFtZSA9ICcnLFxuICAgICAgICAgICAgZm91bmRXaXRoQWxpYXMgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBmaWxlID1cbiAgICAgICAgICAgIHR5cGVvZiBhc3QuZ2V0U291cmNlRmlsZShzb3VyY2VGaWxlLmZpbGVOYW1lKSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICA/IGFzdC5nZXRTb3VyY2VGaWxlKHNvdXJjZUZpbGUuZmlsZU5hbWUpXG4gICAgICAgICAgICAgICAgOiBhc3QuYWRkRXhpc3RpbmdTb3VyY2VGaWxlSWZFeGlzdHMoc291cmNlRmlsZS5maWxlTmFtZSk7IC8vIHRzbGludDpkaXNhYmxlLWxpbmVcbiAgICAgICAgY29uc3QgaW1wb3J0cyA9IGZpbGUuZ2V0SW1wb3J0RGVjbGFyYXRpb25zKCk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIExvb3AgdGhyb3VnaCBhbGwgaW1wb3J0cywgYW5kIGZpbmQgb25lIG1hdGNoaW5nIGlucHV0VmFyaWFibGVOYW1lXG4gICAgICAgICAqL1xuICAgICAgICBpbXBvcnRzLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICBsZXQgbmFtZWRJbXBvcnRzID0gaS5nZXROYW1lZEltcG9ydHMoKSxcbiAgICAgICAgICAgICAgICBuYW1lZEltcG9ydHNMZW5ndGggPSBuYW1lZEltcG9ydHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIGogPSAwO1xuXG4gICAgICAgICAgICBpZiAobmFtZWRJbXBvcnRzTGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAoajsgaiA8IG5hbWVkSW1wb3J0c0xlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbXBvcnROYW1lID0gbmFtZWRJbXBvcnRzW2pdLmdldE5hbWVOb2RlKCkuZ2V0VGV4dCgpIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydEFsaWFzO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lZEltcG9ydHNbal0uZ2V0QWxpYXNJZGVudGlmaWVyKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydEFsaWFzID0gbmFtZWRJbXBvcnRzW2pdLmdldEFsaWFzSWRlbnRpZmllcigpLmdldFRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0TmFtZSA9PT0gbWV0YWRhdGFWYXJpYWJsZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaGVkSW1wb3J0ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnRBbGlhcyA9PT0gbWV0YWRhdGFWYXJpYWJsZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kV2l0aEFsaWFzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzT3JpZ2luYWxOYW1lID0gaW1wb3J0TmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaGVkSW1wb3J0ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBmdW5jdGlvbiBoYXNGb3VuZFZhbHVlcyh2YXJpYWJsZURlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICBsZXQgdmFyaWFibGVLaW5kID0gdmFyaWFibGVEZWNsYXJhdGlvbi5nZXRLaW5kKCk7XG5cbiAgICAgICAgICAgIGlmICh2YXJpYWJsZUtpbmQgJiYgdmFyaWFibGVLaW5kID09PSBTeW50YXhLaW5kLlZhcmlhYmxlRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5pdGlhbGl6ZXIgPSB2YXJpYWJsZURlY2xhcmF0aW9uLmdldEluaXRpYWxpemVyKCk7XG4gICAgICAgICAgICAgICAgaWYgKGluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbml0aWFsaXplcktpbmQgPSBpbml0aWFsaXplci5nZXRLaW5kKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVyS2luZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZXJLaW5kID09PSBTeW50YXhLaW5kLk9iamVjdExpdGVyYWxFeHByZXNzaW9uXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbXBpbGVyTm9kZSA9IGluaXRpYWxpemVyLmNvbXBpbGVyTm9kZSBhcyB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21waWxlck5vZGUucHJvcGVydGllcztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2Ygc2VhcmNoZWRJbXBvcnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBsZXQgaW1wb3J0UGF0aFJlZmVyZW5jZSA9IHNlYXJjaGVkSW1wb3J0LmdldE1vZHVsZVNwZWNpZmllclNvdXJjZUZpbGUoKTtcbiAgICAgICAgICAgIGxldCBpbXBvcnRQYXRoO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpbXBvcnRQYXRoUmVmZXJlbmNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGltcG9ydFBhdGggPSBpbXBvcnRQYXRoUmVmZXJlbmNlLmNvbXBpbGVyTm9kZS5maWxlTmFtZTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUZpbGVJbXBvcnQgPVxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgYXN0LmdldFNvdXJjZUZpbGUoaW1wb3J0UGF0aCkgIT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGFzdC5nZXRTb3VyY2VGaWxlKGltcG9ydFBhdGgpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGFzdC5hZGRFeGlzdGluZ1NvdXJjZUZpbGVJZkV4aXN0cyhpbXBvcnRQYXRoKTsgLy8gdHNsaW50OmRpc2FibGUtbGluZVxuXG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZUZpbGVJbXBvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhcmlhYmxlTmFtZSA9IGZvdW5kV2l0aEFsaWFzID8gYWxpYXNPcmlnaW5hbE5hbWUgOiBtZXRhZGF0YVZhcmlhYmxlTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhcmlhYmxlRGVjbGFyYXRpb24gPSBzb3VyY2VGaWxlSW1wb3J0LmdldFZhcmlhYmxlRGVjbGFyYXRpb24odmFyaWFibGVOYW1lKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodmFyaWFibGVEZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhc0ZvdW5kVmFsdWVzKHZhcmlhYmxlRGVjbGFyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IHdpdGggZXhwb3J0c1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhwb3J0RGVjbGFyYXRpb25zID0gc291cmNlRmlsZUltcG9ydC5nZXRFeHBvcnREZWNsYXJhdGlvbnMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHBvcnREZWNsYXJhdGlvbnMgJiYgZXhwb3J0RGVjbGFyYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaSA9IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IGV4cG9ydERlY2xhcmF0aW9ucy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpOyBpPGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBleHBvcnREZWNsYXJhdGlvbiA9IGV4cG9ydERlY2xhcmF0aW9uc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNvdXJjZUZpbGVFeHBvcnRlZFJlZmVyZW5jZSA9IGV4cG9ydERlY2xhcmF0aW9uLmdldE1vZHVsZVNwZWNpZmllclNvdXJjZUZpbGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZUZpbGVFeHBvcnRlZFJlZmVyZW5jZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNvdXJjZUZpbGVFeHBvcnRlZFJlZmVyZW5jZVBhdGggPSBzb3VyY2VGaWxlRXhwb3J0ZWRSZWZlcmVuY2UuZ2V0RmlsZVBhdGgoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlRmlsZUV4cG9ydGVkID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgYXN0LmdldFNvdXJjZUZpbGUoc291cmNlRmlsZUV4cG9ydGVkUmVmZXJlbmNlUGF0aCkgIT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYXN0LmdldFNvdXJjZUZpbGUoc291cmNlRmlsZUV4cG9ydGVkUmVmZXJlbmNlUGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhc3QuYWRkRXhpc3RpbmdTb3VyY2VGaWxlSWZFeGlzdHMoc291cmNlRmlsZUV4cG9ydGVkUmVmZXJlbmNlUGF0aCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VGaWxlRXhwb3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZURlY2xhcmF0aW9uID0gc291cmNlRmlsZUV4cG9ydGVkLmdldFZhcmlhYmxlRGVjbGFyYXRpb24odmFyaWFibGVOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFyaWFibGVEZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFzRm91bmRWYWx1ZXModmFyaWFibGVEZWNsYXJhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRmluZCBpbiBsb2NhbCB2YXJpYWJsZXMgb2YgdGhlIGZpbGVcbiAgICAgICAgICAgIGNvbnN0IHZhcmlhYmxlRGVjbGFyYXRpb24gPSBmaWxlLmdldFZhcmlhYmxlRGVjbGFyYXRpb24obWV0YWRhdGFWYXJpYWJsZU5hbWUpO1xuICAgICAgICAgICAgaWYgKHZhcmlhYmxlRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBsZXQgdmFyaWFibGVLaW5kID0gdmFyaWFibGVEZWNsYXJhdGlvbi5nZXRLaW5kKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAodmFyaWFibGVLaW5kICYmIHZhcmlhYmxlS2luZCA9PT0gU3ludGF4S2luZC5WYXJpYWJsZURlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbml0aWFsaXplciA9IHZhcmlhYmxlRGVjbGFyYXRpb24uZ2V0SW5pdGlhbGl6ZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5pdGlhbGl6ZXJLaW5kID0gaW5pdGlhbGl6ZXIuZ2V0S2luZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVyS2luZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVyS2luZCA9PT0gU3ludGF4S2luZC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbXBpbGVyTm9kZSA9IGluaXRpYWxpemVyLmNvbXBpbGVyTm9kZSBhcyB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcGlsZXJOb2RlLnByb3BlcnRpZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluaXRpYWxpemVyS2luZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YXJpYWJsZURlY2xhcmF0aW9uLmNvbXBpbGVyTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RmlsZU5hbWVPZkltcG9ydCh2YXJpYWJsZU5hbWU6IHN0cmluZywgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSkge1xuICAgICAgICBjb25zdCBmaWxlID1cbiAgICAgICAgICAgIHR5cGVvZiBhc3QuZ2V0U291cmNlRmlsZShzb3VyY2VGaWxlLmZpbGVOYW1lKSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICA/IGFzdC5nZXRTb3VyY2VGaWxlKHNvdXJjZUZpbGUuZmlsZU5hbWUpXG4gICAgICAgICAgICAgICAgOiBhc3QuYWRkRXhpc3RpbmdTb3VyY2VGaWxlKHNvdXJjZUZpbGUuZmlsZU5hbWUpOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lXG4gICAgICAgIGNvbnN0IGltcG9ydHMgPSBmaWxlLmdldEltcG9ydERlY2xhcmF0aW9ucygpO1xuICAgICAgICBsZXQgc2VhcmNoZWRJbXBvcnQsXG4gICAgICAgICAgICBhbGlhc09yaWdpbmFsTmFtZSA9ICcnLFxuICAgICAgICAgICAgZmluYWxQYXRoID0gJycsXG4gICAgICAgICAgICBmb3VuZFdpdGhBbGlhcyA9IGZhbHNlO1xuICAgICAgICBpbXBvcnRzLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICBsZXQgbmFtZWRJbXBvcnRzID0gaS5nZXROYW1lZEltcG9ydHMoKSxcbiAgICAgICAgICAgICAgICBuYW1lZEltcG9ydHNMZW5ndGggPSBuYW1lZEltcG9ydHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIGogPSAwO1xuXG4gICAgICAgICAgICBpZiAobmFtZWRJbXBvcnRzTGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAoajsgaiA8IG5hbWVkSW1wb3J0c0xlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbXBvcnROYW1lID0gbmFtZWRJbXBvcnRzW2pdLmdldE5hbWVOb2RlKCkuZ2V0VGV4dCgpIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydEFsaWFzO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lZEltcG9ydHNbal0uZ2V0QWxpYXNJZGVudGlmaWVyKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydEFsaWFzID0gbmFtZWRJbXBvcnRzW2pdLmdldEFsaWFzSWRlbnRpZmllcigpLmdldFRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0TmFtZSA9PT0gdmFyaWFibGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hlZEltcG9ydCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0QWxpYXMgPT09IHZhcmlhYmxlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRXaXRoQWxpYXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNPcmlnaW5hbE5hbWUgPSBpbXBvcnROYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoZWRJbXBvcnQgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodHlwZW9mIHNlYXJjaGVkSW1wb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgbGV0IGltcG9ydFBhdGggPSBwYXRoLnJlc29sdmUoXG4gICAgICAgICAgICAgICAgcGF0aC5kaXJuYW1lKHNvdXJjZUZpbGUuZmlsZU5hbWUpICtcbiAgICAgICAgICAgICAgICAgICAgJy8nICtcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoZWRJbXBvcnQuZ2V0TW9kdWxlU3BlY2lmaWVyVmFsdWUoKSArXG4gICAgICAgICAgICAgICAgICAgICcudHMnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbGV0IGNsZWFuZXIgPSAocHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwKS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICAgICAgICBmaW5hbFBhdGggPSBpbXBvcnRQYXRoLnJlcGxhY2UoY2xlYW5lciwgJycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaW5hbFBhdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZCB0aGUgZmlsZSBwYXRoIG9mIGltcG9ydGVkIHZhcmlhYmxlXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBpbnB1dFZhcmlhYmxlTmFtZSAgbGlrZSB0aGVzdHJpbmdcbiAgICAgKiBAcmV0dXJuIHtbdHlwZV19ICAgICAgICAgICAgICAgICAgICB0aGVzdHJpbmcgZGVzdGluYXRpb24gcGF0aFxuICAgICAqL1xuICAgIHB1YmxpYyBmaW5kRmlsZVBhdGhPZkltcG9ydGVkVmFyaWFibGUoaW5wdXRWYXJpYWJsZU5hbWUsIHNvdXJjZUZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IHNlYXJjaGVkSW1wb3J0LFxuICAgICAgICAgICAgZmluYWxQYXRoID0gJycsXG4gICAgICAgICAgICBhbGlhc09yaWdpbmFsTmFtZSA9ICcnLFxuICAgICAgICAgICAgZm91bmRXaXRoQWxpYXMgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgZmlsZSA9XG4gICAgICAgICAgICB0eXBlb2YgYXN0LmdldFNvdXJjZUZpbGUoc291cmNlRmlsZVBhdGgpICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgICAgID8gYXN0LmdldFNvdXJjZUZpbGUoc291cmNlRmlsZVBhdGgpXG4gICAgICAgICAgICAgICAgOiBhc3QuYWRkRXhpc3RpbmdTb3VyY2VGaWxlKHNvdXJjZUZpbGVQYXRoKTsgLy8gdHNsaW50OmRpc2FibGUtbGluZVxuICAgICAgICBjb25zdCBpbXBvcnRzID0gZmlsZS5nZXRJbXBvcnREZWNsYXJhdGlvbnMoKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogTG9vcCB0aHJvdWdoIGFsbCBpbXBvcnRzLCBhbmQgZmluZCBvbmUgbWF0Y2hpbmcgaW5wdXRWYXJpYWJsZU5hbWVcbiAgICAgICAgICovXG4gICAgICAgIGltcG9ydHMuZm9yRWFjaChpID0+IHtcbiAgICAgICAgICAgIGxldCBuYW1lZEltcG9ydHMgPSBpLmdldE5hbWVkSW1wb3J0cygpLFxuICAgICAgICAgICAgICAgIG5hbWVkSW1wb3J0c0xlbmd0aCA9IG5hbWVkSW1wb3J0cy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgaiA9IDA7XG5cbiAgICAgICAgICAgIGlmIChuYW1lZEltcG9ydHNMZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9yIChqOyBqIDwgbmFtZWRJbXBvcnRzTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGltcG9ydE5hbWUgPSBuYW1lZEltcG9ydHNbal0uZ2V0TmFtZU5vZGUoKS5nZXRUZXh0KCkgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0QWxpYXM7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVkSW1wb3J0c1tqXS5nZXRBbGlhc0lkZW50aWZpZXIoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0QWxpYXMgPSBuYW1lZEltcG9ydHNbal0uZ2V0QWxpYXNJZGVudGlmaWVyKCkuZ2V0VGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnROYW1lID09PSBpbnB1dFZhcmlhYmxlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoZWRJbXBvcnQgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGltcG9ydEFsaWFzID09PSBpbnB1dFZhcmlhYmxlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRXaXRoQWxpYXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNPcmlnaW5hbE5hbWUgPSBpbXBvcnROYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoZWRJbXBvcnQgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodHlwZW9mIHNlYXJjaGVkSW1wb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgZmluYWxQYXRoID0gcGF0aC5yZXNvbHZlKFxuICAgICAgICAgICAgICAgIHBhdGguZGlybmFtZShzb3VyY2VGaWxlUGF0aCkgK1xuICAgICAgICAgICAgICAgICAgICAnLycgK1xuICAgICAgICAgICAgICAgICAgICBzZWFyY2hlZEltcG9ydC5nZXRNb2R1bGVTcGVjaWZpZXJWYWx1ZSgpICtcbiAgICAgICAgICAgICAgICAgICAgJy50cydcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbmFsUGF0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kIGluIGltcG9ydHMgc29tZXRoaW5nIGxpa2UgVkFSLkFWQVIuQlZBUi50aGVzdHJpbmdcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IGlucHV0VmFyaWFibGVOYW1lICAgICAgICAgICAgICAgICAgIGxpa2UgVkFSLkFWQVIuQlZBUi50aGVzdHJpbmdcbiAgICAgKiBAcmV0dXJuIHtbdHlwZV19ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVzdHJpbmcgdmFsdWVcbiAgICAgKi9cbiAgICBwdWJsaWMgZmluZFByb3BlcnR5VmFsdWVJbkltcG9ydE9yTG9jYWxWYXJpYWJsZXMoaW5wdXRWYXJpYWJsZU5hbWUsIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUpIHtcbiAgICAgICAgbGV0IHZhcmlhYmxlc0F0dHJpYnV0ZXMgPSBpbnB1dFZhcmlhYmxlTmFtZS5zcGxpdCgnLicpLFxuICAgICAgICAgICAgbWV0YWRhdGFWYXJpYWJsZU5hbWUgPSB2YXJpYWJsZXNBdHRyaWJ1dGVzWzBdLFxuICAgICAgICAgICAgc2VhcmNoZWRJbXBvcnQsXG4gICAgICAgICAgICBhbGlhc09yaWdpbmFsTmFtZSA9ICcnLFxuICAgICAgICAgICAgZm91bmRXaXRoQWxpYXMgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBmaWxlID1cbiAgICAgICAgICAgIHR5cGVvZiBhc3QuZ2V0U291cmNlRmlsZShzb3VyY2VGaWxlLmZpbGVOYW1lKSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICA/IGFzdC5nZXRTb3VyY2VGaWxlKHNvdXJjZUZpbGUuZmlsZU5hbWUpXG4gICAgICAgICAgICAgICAgOiBhc3QuYWRkRXhpc3RpbmdTb3VyY2VGaWxlKHNvdXJjZUZpbGUuZmlsZU5hbWUpOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lXG4gICAgICAgIGNvbnN0IGltcG9ydHMgPSBmaWxlLmdldEltcG9ydERlY2xhcmF0aW9ucygpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMb29wIHRocm91Z2ggYWxsIGltcG9ydHMsIGFuZCBmaW5kIG9uZSBtYXRjaGluZyBpbnB1dFZhcmlhYmxlTmFtZVxuICAgICAgICAgKi9cbiAgICAgICAgaW1wb3J0cy5mb3JFYWNoKGkgPT4ge1xuICAgICAgICAgICAgbGV0IG5hbWVkSW1wb3J0cyA9IGkuZ2V0TmFtZWRJbXBvcnRzKCksXG4gICAgICAgICAgICAgICAgbmFtZWRJbXBvcnRzTGVuZ3RoID0gbmFtZWRJbXBvcnRzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBqID0gMDtcblxuICAgICAgICAgICAgaWYgKG5hbWVkSW1wb3J0c0xlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBmb3IgKGo7IGogPCBuYW1lZEltcG9ydHNMZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW1wb3J0TmFtZSA9IG5hbWVkSW1wb3J0c1tqXS5nZXROYW1lTm9kZSgpLmdldFRleHQoKSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRBbGlhcztcblxuICAgICAgICAgICAgICAgICAgICBpZiAobmFtZWRJbXBvcnRzW2pdLmdldEFsaWFzSWRlbnRpZmllcigpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRBbGlhcyA9IG5hbWVkSW1wb3J0c1tqXS5nZXRBbGlhc0lkZW50aWZpZXIoKS5nZXRUZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGltcG9ydE5hbWUgPT09IG1ldGFkYXRhVmFyaWFibGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hlZEltcG9ydCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0QWxpYXMgPT09IG1ldGFkYXRhVmFyaWFibGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFdpdGhBbGlhcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlhc09yaWdpbmFsTmFtZSA9IGltcG9ydE5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hlZEltcG9ydCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IGZpbGVUb1NlYXJjaEluLCB2YXJpYWJsZURlY2xhcmF0aW9uO1xuICAgICAgICBpZiAodHlwZW9mIHNlYXJjaGVkSW1wb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgbGV0IGltcG9ydFBhdGggPSBwYXRoLnJlc29sdmUoXG4gICAgICAgICAgICAgICAgcGF0aC5kaXJuYW1lKHNvdXJjZUZpbGUuZmlsZU5hbWUpICtcbiAgICAgICAgICAgICAgICAgICAgJy8nICtcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoZWRJbXBvcnQuZ2V0TW9kdWxlU3BlY2lmaWVyVmFsdWUoKSArXG4gICAgICAgICAgICAgICAgICAgICcudHMnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3Qgc291cmNlRmlsZUltcG9ydCA9XG4gICAgICAgICAgICAgICAgdHlwZW9mIGFzdC5nZXRTb3VyY2VGaWxlKGltcG9ydFBhdGgpICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgICAgICAgICA/IGFzdC5nZXRTb3VyY2VGaWxlKGltcG9ydFBhdGgpXG4gICAgICAgICAgICAgICAgICAgIDogYXN0LmFkZEV4aXN0aW5nU291cmNlRmlsZShpbXBvcnRQYXRoKTsgLy8gdHNsaW50OmRpc2FibGUtbGluZVxuICAgICAgICAgICAgaWYgKHNvdXJjZUZpbGVJbXBvcnQpIHtcbiAgICAgICAgICAgICAgICBmaWxlVG9TZWFyY2hJbiA9IHNvdXJjZUZpbGVJbXBvcnQ7XG4gICAgICAgICAgICAgICAgbGV0IHZhcmlhYmxlTmFtZSA9IGZvdW5kV2l0aEFsaWFzID8gYWxpYXNPcmlnaW5hbE5hbWUgOiBtZXRhZGF0YVZhcmlhYmxlTmFtZTtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZURlY2xhcmF0aW9uID0gZmlsZVRvU2VhcmNoSW4uZ2V0VmFyaWFibGVEZWNsYXJhdGlvbih2YXJpYWJsZU5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmlsZVRvU2VhcmNoSW4gPSBmaWxlO1xuICAgICAgICAgICAgLy8gRmluZCBpbiBsb2NhbCB2YXJpYWJsZXMgb2YgdGhlIGZpbGVcbiAgICAgICAgICAgIHZhcmlhYmxlRGVjbGFyYXRpb24gPSBmaWxlVG9TZWFyY2hJbi5nZXRWYXJpYWJsZURlY2xhcmF0aW9uKG1ldGFkYXRhVmFyaWFibGVOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YXJpYWJsZURlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kSW5PYmplY3RWYXJpYWJsZURlY2xhcmF0aW9uKHZhcmlhYmxlRGVjbGFyYXRpb24sIHZhcmlhYmxlc0F0dHJpYnV0ZXMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRyeSBmaW5kIGl0IGluIGVudW1zXG4gICAgICAgIGlmICh2YXJpYWJsZXNBdHRyaWJ1dGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZmlsZVRvU2VhcmNoSW4gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbCA9IHRoaXMuZmluZEluRW51bXMoXG4gICAgICAgICAgICAgICAgICAgIGZpbGVUb1NlYXJjaEluLFxuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YVZhcmlhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzQXR0cmlidXRlc1sxXVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbCAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFsID0gdGhpcy5maW5kSW5DbGFzc2VzKFxuICAgICAgICAgICAgICAgICAgICBmaWxlVG9TZWFyY2hJbixcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFWYXJpYWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlc0F0dHJpYnV0ZXNbMV1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmICh2YWwgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0ICogYXMgdXRpbCBmcm9tICd1dGlsJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBIYW5kbGViYXJzIGZyb20gJ2hhbmRsZWJhcnMnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0ICogYXMgSlNPTjUgZnJvbSAnanNvbjUnO1xuaW1wb3J0IEFzdCwgeyBUeXBlR3VhcmRzLCBTb3VyY2VGaWxlLCB0cywgU3ludGF4S2luZCB9IGZyb20gJ3RzLXNpbXBsZS1hc3QnO1xuXG5pbXBvcnQgeyBGaWxlRW5naW5lIH0gZnJvbSAnLi4vYXBwL2VuZ2luZXMvZmlsZS5lbmdpbmUnO1xuaW1wb3J0IHsgUm91dGluZ0dyYXBoTm9kZSB9IGZyb20gJy4uL2FwcC9ub2Rlcy9yb3V0aW5nLWdyYXBoLW5vZGUnO1xuaW1wb3J0IHsgSW1wb3J0c1V0aWwgfSBmcm9tICcuL2ltcG9ydHMudXRpbCc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXInO1xuXG5jb25zdCB0cmF2ZXJzZSA9IHJlcXVpcmUoJ3RyYXZlcnNlJyk7XG5cbmNvbnN0IGFzdCA9IG5ldyBBc3QoKTtcblxuZXhwb3J0IGNsYXNzIFJvdXRlclBhcnNlclV0aWwge1xuICAgIHByaXZhdGUgcm91dGVzOiBhbnlbXSA9IFtdO1xuICAgIHByaXZhdGUgaW5jb21wbGV0ZVJvdXRlcyA9IFtdO1xuICAgIHByaXZhdGUgbW9kdWxlcyA9IFtdO1xuICAgIHByaXZhdGUgbW9kdWxlc1RyZWU7XG4gICAgcHJpdmF0ZSByb290TW9kdWxlOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBjbGVhbk1vZHVsZXNUcmVlO1xuICAgIHByaXZhdGUgbW9kdWxlc1dpdGhSb3V0ZXMgPSBbXTtcblxuICAgIHByaXZhdGUgZmlsZUVuZ2luZSA9IG5ldyBGaWxlRW5naW5lKCk7XG4gICAgcHJpdmF0ZSBpbXBvcnRzVXRpbCA9IG5ldyBJbXBvcnRzVXRpbCgpO1xuXG4gICAgcHVibGljIGFkZFJvdXRlKHJvdXRlKTogdm9pZCB7XG4gICAgICAgIHRoaXMucm91dGVzLnB1c2gocm91dGUpO1xuICAgICAgICB0aGlzLnJvdXRlcyA9IF8uc29ydEJ5KF8udW5pcVdpdGgodGhpcy5yb3V0ZXMsIF8uaXNFcXVhbCksIFsnbmFtZSddKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkSW5jb21wbGV0ZVJvdXRlKHJvdXRlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW5jb21wbGV0ZVJvdXRlcy5wdXNoKHJvdXRlKTtcbiAgICAgICAgdGhpcy5pbmNvbXBsZXRlUm91dGVzID0gXy5zb3J0QnkoXy51bmlxV2l0aCh0aGlzLmluY29tcGxldGVSb3V0ZXMsIF8uaXNFcXVhbCksIFsnbmFtZSddKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkTW9kdWxlV2l0aFJvdXRlcyhtb2R1bGVOYW1lLCBtb2R1bGVJbXBvcnRzLCBmaWxlbmFtZSk6IHZvaWQge1xuICAgICAgICB0aGlzLm1vZHVsZXNXaXRoUm91dGVzLnB1c2goe1xuICAgICAgICAgICAgbmFtZTogbW9kdWxlTmFtZSxcbiAgICAgICAgICAgIGltcG9ydHNOb2RlOiBtb2R1bGVJbXBvcnRzLFxuICAgICAgICAgICAgZmlsZW5hbWU6IGZpbGVuYW1lXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm1vZHVsZXNXaXRoUm91dGVzID0gXy5zb3J0QnkoXy51bmlxV2l0aCh0aGlzLm1vZHVsZXNXaXRoUm91dGVzLCBfLmlzRXF1YWwpLCBbJ25hbWUnXSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZE1vZHVsZShtb2R1bGVOYW1lOiBzdHJpbmcsIG1vZHVsZUltcG9ydHMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tb2R1bGVzLnB1c2goe1xuICAgICAgICAgICAgbmFtZTogbW9kdWxlTmFtZSxcbiAgICAgICAgICAgIGltcG9ydHNOb2RlOiBtb2R1bGVJbXBvcnRzXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm1vZHVsZXMgPSBfLnNvcnRCeShfLnVuaXFXaXRoKHRoaXMubW9kdWxlcywgXy5pc0VxdWFsKSwgWyduYW1lJ10pO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhblJhd1JvdXRlUGFyc2VkKHJvdXRlOiBzdHJpbmcpOiBvYmplY3Qge1xuICAgICAgICBsZXQgcm91dGVzV2l0aG91dFNwYWNlcyA9IHJvdXRlLnJlcGxhY2UoLyAvZ20sICcnKTtcbiAgICAgICAgbGV0IHRlc3RUcmFpbGluZ0NvbW1hID0gcm91dGVzV2l0aG91dFNwYWNlcy5pbmRleE9mKCd9LF0nKTtcbiAgICAgICAgaWYgKHRlc3RUcmFpbGluZ0NvbW1hICE9PSAtMSkge1xuICAgICAgICAgICAgcm91dGVzV2l0aG91dFNwYWNlcyA9IHJvdXRlc1dpdGhvdXRTcGFjZXMucmVwbGFjZSgnfSxdJywgJ31dJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEpTT041LnBhcnNlKHJvdXRlc1dpdGhvdXRTcGFjZXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhblJhd1JvdXRlKHJvdXRlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgcm91dGVzV2l0aG91dFNwYWNlcyA9IHJvdXRlLnJlcGxhY2UoLyAvZ20sICcnKTtcbiAgICAgICAgbGV0IHRlc3RUcmFpbGluZ0NvbW1hID0gcm91dGVzV2l0aG91dFNwYWNlcy5pbmRleE9mKCd9LF0nKTtcbiAgICAgICAgaWYgKHRlc3RUcmFpbGluZ0NvbW1hICE9PSAtMSkge1xuICAgICAgICAgICAgcm91dGVzV2l0aG91dFNwYWNlcyA9IHJvdXRlc1dpdGhvdXRTcGFjZXMucmVwbGFjZSgnfSxdJywgJ31dJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvdXRlc1dpdGhvdXRTcGFjZXM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFJvb3RNb2R1bGUobW9kdWxlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yb290TW9kdWxlID0gbW9kdWxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXNSb3V0ZXJNb2R1bGVJbkltcG9ydHMoaW1wb3J0czogQXJyYXk8YW55Pik6IGJvb2xlYW4ge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGltcG9ydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBpbXBvcnRzW2ldLm5hbWUuaW5kZXhPZignUm91dGVyTW9kdWxlLmZvckNoaWxkJykgIT09IC0xIHx8XG4gICAgICAgICAgICAgICAgaW1wb3J0c1tpXS5uYW1lLmluZGV4T2YoJ1JvdXRlck1vZHVsZS5mb3JSb290JykgIT09IC0xIHx8XG4gICAgICAgICAgICAgICAgaW1wb3J0c1tpXS5uYW1lLmluZGV4T2YoJ1JvdXRlck1vZHVsZScpICE9PSAtMVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGZpeEluY29tcGxldGVSb3V0ZXMobWlzY2VsbGFuZW91c1ZhcmlhYmxlczogQXJyYXk8YW55Pik6IHZvaWQge1xuICAgICAgICBsZXQgbWF0Y2hpbmdWYXJpYWJsZXMgPSBbXTtcbiAgICAgICAgLy8gRm9yIGVhY2ggaW5jb21wbGV0ZVJvdXRlLCBzY2FuIGlmIG9uZSBtaXNjIHZhcmlhYmxlIGlzIGluIGNvZGVcbiAgICAgICAgLy8gaWYgb2ssIHRyeSByZWNyZWF0aW5nIGNvbXBsZXRlIHJvdXRlXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pbmNvbXBsZXRlUm91dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG1pc2NlbGxhbmVvdXNWYXJpYWJsZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbmNvbXBsZXRlUm91dGVzW2ldLmRhdGEuaW5kZXhPZihtaXNjZWxsYW5lb3VzVmFyaWFibGVzW2pdLm5hbWUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZm91bmQgb25lIG1pc2MgdmFyIGluc2lkZSBpbmNvbXBsZXRlUm91dGUnKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cobWlzY2VsbGFuZW91c1ZhcmlhYmxlc1tqXS5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hpbmdWYXJpYWJsZXMucHVzaChtaXNjZWxsYW5lb3VzVmFyaWFibGVzW2pdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDbGVhbiBpbmNvbXBsZXRlUm91dGVcbiAgICAgICAgICAgIHRoaXMuaW5jb21wbGV0ZVJvdXRlc1tpXS5kYXRhID0gdGhpcy5pbmNvbXBsZXRlUm91dGVzW2ldLmRhdGEucmVwbGFjZSgnWycsICcnKTtcbiAgICAgICAgICAgIHRoaXMuaW5jb21wbGV0ZVJvdXRlc1tpXS5kYXRhID0gdGhpcy5pbmNvbXBsZXRlUm91dGVzW2ldLmRhdGEucmVwbGFjZSgnXScsICcnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBsaW5rTW9kdWxlc0FuZFJvdXRlcygpOiB2b2lkIHtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBsZXQgbGVuID0gdGhpcy5tb2R1bGVzV2l0aFJvdXRlcy5sZW5ndGg7XG4gICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBfLmZvckVhY2godGhpcy5tb2R1bGVzV2l0aFJvdXRlc1tpXS5pbXBvcnRzTm9kZSwgKG5vZGU6IHRzLlByb3BlcnR5RGVjbGFyYXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgaW5pdGlhbGl6ZXIgPSBub2RlLmluaXRpYWxpemVyIGFzIHRzLkFycmF5TGl0ZXJhbEV4cHJlc3Npb247XG4gICAgICAgICAgICAgICAgaWYgKGluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbml0aWFsaXplci5lbGVtZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKGluaXRpYWxpemVyLmVsZW1lbnRzLCAoZWxlbWVudDogdHMuQ2FsbEV4cHJlc3Npb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIGVsZW1lbnQgd2l0aCBhcmd1bWVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5hcmd1bWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKGVsZW1lbnQuYXJndW1lbnRzLCAoYXJndW1lbnQ6IHRzLklkZW50aWZpZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8uZm9yRWFjaCh0aGlzLnJvdXRlcywgcm91dGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnQudGV4dCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5uYW1lID09PSBhcmd1bWVudC50ZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLmZpbGVuYW1lID09PSB0aGlzLm1vZHVsZXNXaXRoUm91dGVzW2ldLmZpbGVuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLm1vZHVsZSA9IHRoaXMubW9kdWxlc1dpdGhSb3V0ZXNbaV0ubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudC50ZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLm5hbWUgPT09IGFyZ3VtZW50LnRleHQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUuZmlsZW5hbWUgIT09IHRoaXMubW9kdWxlc1dpdGhSb3V0ZXNbaV0uZmlsZW5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFyZ3VtZW50SW1wb3J0UGF0aCA9IHRoaXMuaW1wb3J0c1V0aWwuZmluZEZpbGVQYXRoT2ZJbXBvcnRlZFZhcmlhYmxlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnQudGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9kdWxlc1dpdGhSb3V0ZXNbaV0uZmlsZW5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNsZWFuZXIgPSAocHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwKS5yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL1xcXFwvZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudEltcG9ydFBhdGggPSBhcmd1bWVudEltcG9ydFBhdGgucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFuZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudC50ZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5uYW1lID09PSBhcmd1bWVudC50ZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5maWxlbmFtZSA9PT0gYXJndW1lbnRJbXBvcnRQYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUubW9kdWxlID0gdGhpcy5tb2R1bGVzV2l0aFJvdXRlc1tpXS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIGRpcmVjdCBzdXBwb3J0IG9mIGZvciBleGFtcGxlXG4gICAgICAgICAgICAgICAgICogZXhwb3J0IGNvbnN0IEhvbWVSb3V0aW5nTW9kdWxlOiBNb2R1bGVXaXRoUHJvdmlkZXJzID0gUm91dGVyTW9kdWxlLmZvckNoaWxkKEhPTUVfUk9VVEVTKTtcbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBpZiAodHMuaXNDYWxsRXhwcmVzc2lvbihub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5hcmd1bWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF8uZm9yRWFjaChub2RlLmFyZ3VtZW50cywgKGFyZ3VtZW50OiB0cy5JZGVudGlmaWVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKHRoaXMucm91dGVzLCByb3V0ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50LnRleHQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLm5hbWUgPT09IGFyZ3VtZW50LnRleHQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLmZpbGVuYW1lID09PSB0aGlzLm1vZHVsZXNXaXRoUm91dGVzW2ldLmZpbGVuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUubW9kdWxlID0gdGhpcy5tb2R1bGVzV2l0aFJvdXRlc1tpXS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGZvdW5kUm91dGVXaXRoTW9kdWxlTmFtZShtb2R1bGVOYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgICAgICByZXR1cm4gXy5maW5kKHRoaXMucm91dGVzLCB7IG1vZHVsZTogbW9kdWxlTmFtZSB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZm91bmRMYXp5TW9kdWxlV2l0aFBhdGgobW9kdWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgLy8gcGF0aCBpcyBsaWtlIGFwcC9jdXN0b21lcnMvY3VzdG9tZXJzLm1vZHVsZSNDdXN0b21lcnNNb2R1bGVcbiAgICAgICAgbGV0IHNwbGl0ID0gbW9kdWxlUGF0aC5zcGxpdCgnIycpO1xuICAgICAgICBsZXQgbGF6eU1vZHVsZVBhdGggPSBzcGxpdFswXTtcbiAgICAgICAgbGV0IGxhenlNb2R1bGVOYW1lID0gc3BsaXRbMV07XG4gICAgICAgIHJldHVybiBsYXp5TW9kdWxlTmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29uc3RydWN0Um91dGVzVHJlZSgpIHtcbiAgICAgICAgLy8gcm91dGVzW10gY29udGFpbnMgcm91dGVzIHdpdGggbW9kdWxlIGxpbmtcbiAgICAgICAgLy8gbW9kdWxlc1RyZWUgY29udGFpbnMgbW9kdWxlcyB0cmVlXG4gICAgICAgIC8vIG1ha2UgYSBmaW5hbCByb3V0ZXMgdHJlZSB3aXRoIHRoYXRcbiAgICAgICAgdHJhdmVyc2UodGhpcy5tb2R1bGVzVHJlZSkuZm9yRWFjaChmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLnBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbm9kZS5wYXJlbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChub2RlLmluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBub2RlLmluaXRpYWxpemVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm9kZS5pbXBvcnRzTm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbm9kZS5pbXBvcnRzTm9kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY2xlYW5Nb2R1bGVzVHJlZSA9IF8uY2xvbmVEZWVwKHRoaXMubW9kdWxlc1RyZWUpO1xuXG4gICAgICAgIGxldCByb3V0ZXNUcmVlID0ge1xuICAgICAgICAgICAgbmFtZTogJzxyb290PicsXG4gICAgICAgICAgICBraW5kOiAnbW9kdWxlJyxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogdGhpcy5yb290TW9kdWxlLFxuICAgICAgICAgICAgY2hpbGRyZW46IFtdXG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IGxvb3BNb2R1bGVzUGFyc2VyID0gbm9kZSA9PiB7XG4gICAgICAgICAgICBpZiAobm9kZS5jaGlsZHJlbiAmJiBub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBtb2R1bGUgaGFzIGNoaWxkIG1vZHVsZXNcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpIGluIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJvdXRlID0gdGhpcy5mb3VuZFJvdXRlV2l0aE1vZHVsZU5hbWUobm9kZS5jaGlsZHJlbltpXS5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlICYmIHJvdXRlLmRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUuY2hpbGRyZW4gPSBKU09ONS5wYXJzZShyb3V0ZS5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFcnJvciBkdXJpbmcgZ2VuZXJhdGlvbiBvZiByb3V0ZXMgSlNPTiBmaWxlLCBtYXliZSBhIHRyYWlsaW5nIGNvbW1hIG9yIGFuIGV4dGVybmFsIHZhcmlhYmxlIGluc2lkZSBvbmUgcm91dGUuJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcm91dGUuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLmtpbmQgPSAnbW9kdWxlJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlc1RyZWUuY2hpbGRyZW4ucHVzaChyb3V0ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuY2hpbGRyZW5baV0uY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BNb2R1bGVzUGFyc2VyKG5vZGUuY2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBlbHNlIHJvdXRlcyBhcmUgZGlyZWN0bHkgaW5zaWRlIHRoZSBtb2R1bGVcbiAgICAgICAgICAgICAgICBsZXQgcmF3Um91dGVzID0gdGhpcy5mb3VuZFJvdXRlV2l0aE1vZHVsZU5hbWUobm9kZS5uYW1lKTtcblxuICAgICAgICAgICAgICAgIGlmIChyYXdSb3V0ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJvdXRlcyA9IEpTT041LnBhcnNlKHJhd1JvdXRlcy5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxlbiA9IHJvdXRlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm91dGVBZGRlZE9uY2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJvdXRlID0gcm91dGVzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZXNbaV0uY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlQWRkZWRPbmNlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVzVHJlZS5jaGlsZHJlbi5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQ6ICdjb21wb25lbnQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiByb3V0ZXNbaV0uY29tcG9uZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogcm91dGVzW2ldLnBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyb3V0ZUFkZGVkT25jZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlc1RyZWUuY2hpbGRyZW4gPSBbLi4ucm91dGVzVHJlZS5jaGlsZHJlbiwgLi4ucm91dGVzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgc3RhcnRNb2R1bGUgPSBfLmZpbmQodGhpcy5jbGVhbk1vZHVsZXNUcmVlLCB7IG5hbWU6IHRoaXMucm9vdE1vZHVsZSB9KTtcblxuICAgICAgICBpZiAoc3RhcnRNb2R1bGUpIHtcbiAgICAgICAgICAgIGxvb3BNb2R1bGVzUGFyc2VyKHN0YXJ0TW9kdWxlKTtcbiAgICAgICAgICAgIC8vIExvb3AgdHdpY2UgZm9yIHJvdXRlcyB3aXRoIGxhenkgbG9hZGluZ1xuICAgICAgICAgICAgLy8gbG9vcE1vZHVsZXNQYXJzZXIocm91dGVzVHJlZSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY2xlYW5lZFJvdXRlc1RyZWUgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IGNsZWFuUm91dGVzVHJlZSA9IHJvdXRlID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgaW4gcm91dGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICBsZXQgcm91dGVzID0gcm91dGUuY2hpbGRyZW5baV0ucm91dGVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJvdXRlO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNsZWFuZWRSb3V0ZXNUcmVlID0gY2xlYW5Sb3V0ZXNUcmVlKHJvdXRlc1RyZWUpO1xuXG4gICAgICAgIC8vIFRyeSB1cGRhdGluZyByb3V0ZXMgd2l0aCBsYXp5IGxvYWRpbmdcblxuICAgICAgICBsZXQgbG9vcEluc2lkZU1vZHVsZSA9IChtb2QsIF9yYXdNb2R1bGUpID0+IHtcbiAgICAgICAgICAgIGlmIChtb2QuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB6IGluIG1vZC5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcm91dGUgPSB0aGlzLmZvdW5kUm91dGVXaXRoTW9kdWxlTmFtZShtb2QuY2hpbGRyZW5bel0ubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygcm91dGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGUuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLmNoaWxkcmVuID0gSlNPTjUucGFyc2Uocm91dGUuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJvdXRlLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUua2luZCA9ICdtb2R1bGUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yYXdNb2R1bGUuY2hpbGRyZW4ucHVzaChyb3V0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCByb3V0ZSA9IHRoaXMuZm91bmRSb3V0ZVdpdGhNb2R1bGVOYW1lKG1vZC5uYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJvdXRlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocm91dGUuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUuY2hpbGRyZW4gPSBKU09ONS5wYXJzZShyb3V0ZS5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByb3V0ZS5kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUua2luZCA9ICdtb2R1bGUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgX3Jhd01vZHVsZS5jaGlsZHJlbi5wdXNoKHJvdXRlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgbG9vcFJvdXRlc1BhcnNlciA9IHJvdXRlID0+IHtcbiAgICAgICAgICAgIGlmIChyb3V0ZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgaW4gcm91dGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlLmNoaWxkcmVuW2ldLmxvYWRDaGlsZHJlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5mb3VuZExhenlNb2R1bGVXaXRoUGF0aChyb3V0ZS5jaGlsZHJlbltpXS5sb2FkQ2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1vZHVsZTogUm91dGluZ0dyYXBoTm9kZSA9IF8uZmluZCh0aGlzLmNsZWFuTW9kdWxlc1RyZWUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBjaGlsZFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kdWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IF9yYXdNb2R1bGU6IFJvdXRpbmdHcmFwaE5vZGUgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmF3TW9kdWxlLmtpbmQgPSAnbW9kdWxlJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmF3TW9kdWxlLmNoaWxkcmVuID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Jhd01vZHVsZS5tb2R1bGUgPSBtb2R1bGUubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wSW5zaWRlTW9kdWxlKG1vZHVsZSwgX3Jhd01vZHVsZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5jaGlsZHJlbltpXS5jaGlsZHJlbiA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLmNoaWxkcmVuW2ldLmNoaWxkcmVuLnB1c2goX3Jhd01vZHVsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbG9vcFJvdXRlc1BhcnNlcihyb3V0ZS5jaGlsZHJlbltpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBsb29wUm91dGVzUGFyc2VyKGNsZWFuZWRSb3V0ZXNUcmVlKTtcblxuICAgICAgICByZXR1cm4gY2xlYW5lZFJvdXRlc1RyZWU7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbnN0cnVjdE1vZHVsZXNUcmVlKCk6IHZvaWQge1xuICAgICAgICBsZXQgZ2V0TmVzdGVkQ2hpbGRyZW4gPSAoYXJyLCBwYXJlbnQ/KSA9PiB7XG4gICAgICAgICAgICBsZXQgb3V0ID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpIGluIGFycikge1xuICAgICAgICAgICAgICAgIGlmIChhcnJbaV0ucGFyZW50ID09PSBwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuID0gZ2V0TmVzdGVkQ2hpbGRyZW4oYXJyLCBhcnJbaV0ubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFycltpXS5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKGFycltpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBTY2FuIGVhY2ggbW9kdWxlIGFuZCBhZGQgcGFyZW50IHByb3BlcnR5XG4gICAgICAgIF8uZm9yRWFjaCh0aGlzLm1vZHVsZXMsIGZpcnN0TG9vcE1vZHVsZSA9PiB7XG4gICAgICAgICAgICBfLmZvckVhY2goZmlyc3RMb29wTW9kdWxlLmltcG9ydHNOb2RlLCBpbXBvcnROb2RlID0+IHtcbiAgICAgICAgICAgICAgICBfLmZvckVhY2godGhpcy5tb2R1bGVzLCBtb2R1bGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobW9kdWxlLm5hbWUgPT09IGltcG9ydE5vZGUubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLnBhcmVudCA9IGZpcnN0TG9vcE1vZHVsZS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubW9kdWxlc1RyZWUgPSBnZXROZXN0ZWRDaGlsZHJlbih0aGlzLm1vZHVsZXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZW5lcmF0ZVJvdXRlc0luZGV4KG91dHB1dEZvbGRlcjogc3RyaW5nLCByb3V0ZXM6IEFycmF5PGFueT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsZUVuZ2luZS5nZXQoX19kaXJuYW1lICsgJy8uLi9zcmMvdGVtcGxhdGVzL3BhcnRpYWxzL3JvdXRlcy1pbmRleC5oYnMnKS50aGVuKFxuICAgICAgICAgICAgZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHRlbXBsYXRlOiBhbnkgPSBIYW5kbGViYXJzLmNvbXBpbGUoZGF0YSk7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHRlbXBsYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgcm91dGVzOiBKU09OLnN0cmluZ2lmeShyb3V0ZXMpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbGV0IHRlc3RPdXRwdXREaXIgPSBvdXRwdXRGb2xkZXIubWF0Y2gocHJvY2Vzcy5jd2QoKSk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGVzdE91dHB1dERpciAmJiB0ZXN0T3V0cHV0RGlyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0Rm9sZGVyID0gb3V0cHV0Rm9sZGVyLnJlcGxhY2UocHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwLCAnJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsZUVuZ2luZS53cml0ZShcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0Rm9sZGVyICsgcGF0aC5zZXAgKyAnL2pzL3JvdXRlcy9yb3V0ZXNfaW5kZXguanMnLFxuICAgICAgICAgICAgICAgICAgICByZXN1bHRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVyciA9PiBQcm9taXNlLnJlamVjdCgnRXJyb3IgZHVyaW5nIHJvdXRlcyBpbmRleCBnZW5lcmF0aW9uJylcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcm91dGVzTGVuZ3RoKCk6IG51bWJlciB7XG4gICAgICAgIGxldCBfbiA9IDA7XG4gICAgICAgIGxldCByb3V0ZXNQYXJzZXIgPSByb3V0ZSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJvdXRlLnBhdGggIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgX24gKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyb3V0ZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogaW4gcm91dGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcm91dGVzUGFyc2VyKHJvdXRlLmNoaWxkcmVuW2pdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgZm9yIChsZXQgaSBpbiB0aGlzLnJvdXRlcykge1xuICAgICAgICAgICAgcm91dGVzUGFyc2VyKHRoaXMucm91dGVzW2ldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBfbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJpbnRSb3V0ZXMoKTogdm9pZCB7XG4gICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgY29uc29sZS5sb2coJ3ByaW50Um91dGVzOiAnKTtcbiAgICAgICAgY29uc29sZS5sb2codGhpcy5yb3V0ZXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBwcmludE1vZHVsZXNSb3V0ZXMoKTogdm9pZCB7XG4gICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgY29uc29sZS5sb2coJ3ByaW50TW9kdWxlc1JvdXRlczogJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKHRoaXMubW9kdWxlc1dpdGhSb3V0ZXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1ZhcmlhYmxlUm91dGVzKG5vZGUpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICBpZiAobm9kZS5kZWNsYXJhdGlvbkxpc3QgJiYgbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zKSB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBsZXQgbGVuID0gbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zLmxlbmd0aDtcbiAgICAgICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9uc1tpXS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9uc1tpXS50eXBlLnR5cGVOYW1lICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnNbaV0udHlwZS50eXBlTmFtZS50ZXh0ID09PSAnUm91dGVzJ1xuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYW5GaWxlSWRlbnRpZmllcnMoc291cmNlRmlsZTogU291cmNlRmlsZSk6IFNvdXJjZUZpbGUge1xuICAgICAgICBsZXQgZmlsZSA9IHNvdXJjZUZpbGU7XG4gICAgICAgIGNvbnN0IGlkZW50aWZpZXJzID0gZmlsZS5nZXREZXNjZW5kYW50c09mS2luZChTeW50YXhLaW5kLklkZW50aWZpZXIpLmZpbHRlcihwID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgVHlwZUd1YXJkcy5pc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24ocC5nZXRQYXJlbnRPclRocm93KCkpIHx8XG4gICAgICAgICAgICAgICAgVHlwZUd1YXJkcy5pc1Byb3BlcnR5QXNzaWdubWVudChwLmdldFBhcmVudE9yVGhyb3coKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBpZGVudGlmaWVyc0luUm91dGVzVmFyaWFibGVTdGF0ZW1lbnQgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGlkZW50aWZpZXIgb2YgaWRlbnRpZmllcnMpIHtcbiAgICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGVpciBwYXJlbnRzIG5vZGVzLCBhbmQgaWYgb25lIGlzIGEgdmFyaWFibGVTdGF0ZW1lbnQgYW5kID09PSAncm91dGVzJ1xuICAgICAgICAgICAgbGV0IGZvdW5kUGFyZW50VmFyaWFibGVTdGF0ZW1lbnQgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSBpZGVudGlmaWVyLmdldFBhcmVudFdoaWxlKG4gPT4ge1xuICAgICAgICAgICAgICAgIGlmIChuLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5WYXJpYWJsZVN0YXRlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1ZhcmlhYmxlUm91dGVzKG4uY29tcGlsZXJOb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRQYXJlbnRWYXJpYWJsZVN0YXRlbWVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChmb3VuZFBhcmVudFZhcmlhYmxlU3RhdGVtZW50KSB7XG4gICAgICAgICAgICAgICAgaWRlbnRpZmllcnNJblJvdXRlc1ZhcmlhYmxlU3RhdGVtZW50LnB1c2goaWRlbnRpZmllcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpbmxpbmUgdGhlIHByb3BlcnR5IGFjY2VzcyBleHByZXNzaW9uc1xuICAgICAgICBmb3IgKGNvbnN0IGlkZW50aWZpZXIgb2YgaWRlbnRpZmllcnNJblJvdXRlc1ZhcmlhYmxlU3RhdGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBpZGVudGlmaWVyRGVjbGFyYXRpb24gPSBpZGVudGlmaWVyXG4gICAgICAgICAgICAgICAgLmdldFN5bWJvbE9yVGhyb3coKVxuICAgICAgICAgICAgICAgIC5nZXRWYWx1ZURlY2xhcmF0aW9uT3JUaHJvdygpO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICFUeXBlR3VhcmRzLmlzUHJvcGVydHlBc3NpZ25tZW50KGlkZW50aWZpZXJEZWNsYXJhdGlvbikgJiZcbiAgICAgICAgICAgICAgICBUeXBlR3VhcmRzLmlzVmFyaWFibGVEZWNsYXJhdGlvbihpZGVudGlmaWVyRGVjbGFyYXRpb24pICYmXG4gICAgICAgICAgICAgICAgKFR5cGVHdWFyZHMuaXNQcm9wZXJ0eUFzc2lnbm1lbnQoaWRlbnRpZmllckRlY2xhcmF0aW9uKSAmJlxuICAgICAgICAgICAgICAgICAgICAhVHlwZUd1YXJkcy5pc1ZhcmlhYmxlRGVjbGFyYXRpb24oaWRlbnRpZmllckRlY2xhcmF0aW9uKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYE5vdCBpbXBsZW1lbnRlZCByZWZlcmVuY2VkIGRlY2xhcmF0aW9uIGtpbmQ6ICR7aWRlbnRpZmllckRlY2xhcmF0aW9uLmdldEtpbmROYW1lKCl9YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoVHlwZUd1YXJkcy5pc1ZhcmlhYmxlRGVjbGFyYXRpb24oaWRlbnRpZmllckRlY2xhcmF0aW9uKSkge1xuICAgICAgICAgICAgICAgIGlkZW50aWZpZXIucmVwbGFjZVdpdGhUZXh0KGlkZW50aWZpZXJEZWNsYXJhdGlvbi5nZXRJbml0aWFsaXplck9yVGhyb3coKS5nZXRUZXh0KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZpbGU7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFuRmlsZVNwcmVhZHMoc291cmNlRmlsZTogU291cmNlRmlsZSk6IFNvdXJjZUZpbGUge1xuICAgICAgICBsZXQgZmlsZSA9IHNvdXJjZUZpbGU7XG4gICAgICAgIGNvbnN0IHNwcmVhZEVsZW1lbnRzID0gZmlsZVxuICAgICAgICAgICAgLmdldERlc2NlbmRhbnRzT2ZLaW5kKFN5bnRheEtpbmQuU3ByZWFkRWxlbWVudClcbiAgICAgICAgICAgIC5maWx0ZXIocCA9PiBUeXBlR3VhcmRzLmlzQXJyYXlMaXRlcmFsRXhwcmVzc2lvbihwLmdldFBhcmVudE9yVGhyb3coKSkpO1xuXG4gICAgICAgIGxldCBzcHJlYWRFbGVtZW50c0luUm91dGVzVmFyaWFibGVTdGF0ZW1lbnQgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHNwcmVhZEVsZW1lbnQgb2Ygc3ByZWFkRWxlbWVudHMpIHtcbiAgICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGVpciBwYXJlbnRzIG5vZGVzLCBhbmQgaWYgb25lIGlzIGEgdmFyaWFibGVTdGF0ZW1lbnQgYW5kID09PSAncm91dGVzJ1xuICAgICAgICAgICAgbGV0IGZvdW5kUGFyZW50VmFyaWFibGVTdGF0ZW1lbnQgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSBzcHJlYWRFbGVtZW50LmdldFBhcmVudFdoaWxlKG4gPT4ge1xuICAgICAgICAgICAgICAgIGlmIChuLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5WYXJpYWJsZVN0YXRlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1ZhcmlhYmxlUm91dGVzKG4uY29tcGlsZXJOb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRQYXJlbnRWYXJpYWJsZVN0YXRlbWVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChmb3VuZFBhcmVudFZhcmlhYmxlU3RhdGVtZW50KSB7XG4gICAgICAgICAgICAgICAgc3ByZWFkRWxlbWVudHNJblJvdXRlc1ZhcmlhYmxlU3RhdGVtZW50LnB1c2goc3ByZWFkRWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpbmxpbmUgdGhlIEFycmF5TGl0ZXJhbEV4cHJlc3Npb24gU3ByZWFkRWxlbWVudHNcbiAgICAgICAgZm9yIChjb25zdCBzcHJlYWRFbGVtZW50IG9mIHNwcmVhZEVsZW1lbnRzSW5Sb3V0ZXNWYXJpYWJsZVN0YXRlbWVudCkge1xuICAgICAgICAgICAgbGV0IHNwcmVhZEVsZW1lbnRJZGVudGlmaWVyID0gc3ByZWFkRWxlbWVudC5nZXRFeHByZXNzaW9uKCkuZ2V0VGV4dCgpLFxuICAgICAgICAgICAgICAgIHNlYXJjaGVkSW1wb3J0LFxuICAgICAgICAgICAgICAgIGFsaWFzT3JpZ2luYWxOYW1lID0gJycsXG4gICAgICAgICAgICAgICAgZm91bmRXaXRoQWxpYXNJbkltcG9ydHMgPSBmYWxzZSxcbiAgICAgICAgICAgICAgICBmb3VuZFdpdGhBbGlhcyA9IGZhbHNlO1xuXG4gICAgICAgICAgICAvLyBUcnkgdG8gZmluZCBpdCBpbiBpbXBvcnRzXG4gICAgICAgICAgICBjb25zdCBpbXBvcnRzID0gZmlsZS5nZXRJbXBvcnREZWNsYXJhdGlvbnMoKTtcblxuICAgICAgICAgICAgaW1wb3J0cy5mb3JFYWNoKGkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBuYW1lZEltcG9ydHMgPSBpLmdldE5hbWVkSW1wb3J0cygpLFxuICAgICAgICAgICAgICAgICAgICBuYW1lZEltcG9ydHNMZW5ndGggPSBuYW1lZEltcG9ydHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICBqID0gMDtcblxuICAgICAgICAgICAgICAgIGlmIChuYW1lZEltcG9ydHNMZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoajsgaiA8IG5hbWVkSW1wb3J0c0xlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1wb3J0TmFtZSA9IG5hbWVkSW1wb3J0c1tqXS5nZXROYW1lTm9kZSgpLmdldFRleHQoKSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0QWxpYXM7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lZEltcG9ydHNbal0uZ2V0QWxpYXNJZGVudGlmaWVyKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRBbGlhcyA9IG5hbWVkSW1wb3J0c1tqXS5nZXRBbGlhc0lkZW50aWZpZXIoKS5nZXRUZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnROYW1lID09PSBzcHJlYWRFbGVtZW50SWRlbnRpZmllcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kV2l0aEFsaWFzSW5JbXBvcnRzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hlZEltcG9ydCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0QWxpYXMgPT09IHNwcmVhZEVsZW1lbnRJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRXaXRoQWxpYXNJbkltcG9ydHMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kV2l0aEFsaWFzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhc09yaWdpbmFsTmFtZSA9IGltcG9ydE5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoZWRJbXBvcnQgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGxldCByZWZlcmVuY2VkRGVjbGFyYXRpb247XG5cbiAgICAgICAgICAgIGlmIChmb3VuZFdpdGhBbGlhc0luSW1wb3J0cykge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2VhcmNoZWRJbXBvcnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbXBvcnRQYXRoID0gcGF0aC5yZXNvbHZlKFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5kaXJuYW1lKGZpbGUuZ2V0RmlsZVBhdGgoKSkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoZWRJbXBvcnQuZ2V0TW9kdWxlU3BlY2lmaWVyVmFsdWUoKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJy50cydcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlRmlsZUltcG9ydCA9XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgYXN0LmdldFNvdXJjZUZpbGUoaW1wb3J0UGF0aCkgIT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhc3QuZ2V0U291cmNlRmlsZShpbXBvcnRQYXRoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYXN0LmFkZEV4aXN0aW5nU291cmNlRmlsZShpbXBvcnRQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZUZpbGVJbXBvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YXJpYWJsZU5hbWUgPSBmb3VuZFdpdGhBbGlhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYWxpYXNPcmlnaW5hbE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHNwcmVhZEVsZW1lbnRJZGVudGlmaWVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlZERlY2xhcmF0aW9uID0gc291cmNlRmlsZUltcG9ydC5nZXRWYXJpYWJsZURlY2xhcmF0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgbm90LCB0cnkgZGlyZWN0bHkgaW4gZmlsZVxuICAgICAgICAgICAgICAgIHJlZmVyZW5jZWREZWNsYXJhdGlvbiA9IHNwcmVhZEVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgLmdldEV4cHJlc3Npb24oKVxuICAgICAgICAgICAgICAgICAgICAuZ2V0U3ltYm9sT3JUaHJvdygpXG4gICAgICAgICAgICAgICAgICAgIC5nZXRWYWx1ZURlY2xhcmF0aW9uT3JUaHJvdygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIVR5cGVHdWFyZHMuaXNWYXJpYWJsZURlY2xhcmF0aW9uKHJlZmVyZW5jZWREZWNsYXJhdGlvbikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBOb3QgaW1wbGVtZW50ZWQgcmVmZXJlbmNlZCBkZWNsYXJhdGlvbiBraW5kOiAke3JlZmVyZW5jZWREZWNsYXJhdGlvbi5nZXRLaW5kTmFtZSgpfWBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByZWZlcmVuY2VkQXJyYXkgPSByZWZlcmVuY2VkRGVjbGFyYXRpb24uZ2V0SW5pdGlhbGl6ZXJJZktpbmRPclRocm93KFxuICAgICAgICAgICAgICAgIFN5bnRheEtpbmQuQXJyYXlMaXRlcmFsRXhwcmVzc2lvblxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHNwcmVhZEVsZW1lbnRBcnJheSA9IHNwcmVhZEVsZW1lbnQuZ2V0UGFyZW50SWZLaW5kT3JUaHJvdyhcbiAgICAgICAgICAgICAgICBTeW50YXhLaW5kLkFycmF5TGl0ZXJhbEV4cHJlc3Npb25cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IHNwcmVhZEVsZW1lbnRBcnJheS5nZXRFbGVtZW50cygpLmluZGV4T2Yoc3ByZWFkRWxlbWVudCk7XG4gICAgICAgICAgICBzcHJlYWRFbGVtZW50QXJyYXkucmVtb3ZlRWxlbWVudChzcHJlYWRFbGVtZW50KTtcbiAgICAgICAgICAgIHNwcmVhZEVsZW1lbnRBcnJheS5pbnNlcnRFbGVtZW50cyhcbiAgICAgICAgICAgICAgICBpbnNlcnRJbmRleCxcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VkQXJyYXkuZ2V0RWxlbWVudHMoKS5tYXAoZSA9PiBlLmdldFRleHQoKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmlsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYW5GaWxlRHluYW1pY3Moc291cmNlRmlsZTogU291cmNlRmlsZSk6IFNvdXJjZUZpbGUge1xuICAgICAgICBsZXQgZmlsZSA9IHNvdXJjZUZpbGU7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbnMgPSBmaWxlXG4gICAgICAgICAgICAuZ2V0RGVzY2VuZGFudHNPZktpbmQoU3ludGF4S2luZC5Qcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24pXG4gICAgICAgICAgICAuZmlsdGVyKHAgPT4gIVR5cGVHdWFyZHMuaXNQcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24ocC5nZXRQYXJlbnRPclRocm93KCkpKTtcblxuICAgICAgICBsZXQgcHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uc0luUm91dGVzVmFyaWFibGVTdGF0ZW1lbnQgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbiBvZiBwcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb25zKSB7XG4gICAgICAgICAgICAvLyBMb29wIHRocm91Z2ggdGhlaXIgcGFyZW50cyBub2RlcywgYW5kIGlmIG9uZSBpcyBhIHZhcmlhYmxlU3RhdGVtZW50IGFuZCA9PT0gJ3JvdXRlcydcbiAgICAgICAgICAgIGxldCBmb3VuZFBhcmVudFZhcmlhYmxlU3RhdGVtZW50ID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gcHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uLmdldFBhcmVudFdoaWxlKG4gPT4ge1xuICAgICAgICAgICAgICAgIGlmIChuLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5WYXJpYWJsZVN0YXRlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1ZhcmlhYmxlUm91dGVzKG4uY29tcGlsZXJOb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRQYXJlbnRWYXJpYWJsZVN0YXRlbWVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChmb3VuZFBhcmVudFZhcmlhYmxlU3RhdGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uc0luUm91dGVzVmFyaWFibGVTdGF0ZW1lbnQucHVzaChwcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaW5saW5lIHRoZSBwcm9wZXJ0eSBhY2Nlc3MgZXhwcmVzc2lvbnNcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24gb2YgcHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uc0luUm91dGVzVmFyaWFibGVTdGF0ZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlZmVyZW5jZWREZWNsYXJhdGlvbiA9IHByb3BlcnR5QWNjZXNzRXhwcmVzc2lvblxuICAgICAgICAgICAgICAgIC5nZXROYW1lTm9kZSgpXG4gICAgICAgICAgICAgICAgLmdldFN5bWJvbE9yVGhyb3coKVxuICAgICAgICAgICAgICAgIC5nZXRWYWx1ZURlY2xhcmF0aW9uT3JUaHJvdygpO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICFUeXBlR3VhcmRzLmlzUHJvcGVydHlBc3NpZ25tZW50KHJlZmVyZW5jZWREZWNsYXJhdGlvbikgJiZcbiAgICAgICAgICAgICAgICBUeXBlR3VhcmRzLmlzRW51bU1lbWJlcihyZWZlcmVuY2VkRGVjbGFyYXRpb24pICYmXG4gICAgICAgICAgICAgICAgKFR5cGVHdWFyZHMuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocmVmZXJlbmNlZERlY2xhcmF0aW9uKSAmJlxuICAgICAgICAgICAgICAgICAgICAhVHlwZUd1YXJkcy5pc0VudW1NZW1iZXIocmVmZXJlbmNlZERlY2xhcmF0aW9uKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYE5vdCBpbXBsZW1lbnRlZCByZWZlcmVuY2VkIGRlY2xhcmF0aW9uIGtpbmQ6ICR7cmVmZXJlbmNlZERlY2xhcmF0aW9uLmdldEtpbmROYW1lKCl9YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlZmVyZW5jZWREZWNsYXJhdGlvbi5nZXRJbml0aWFsaXplck9yVGhyb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uLnJlcGxhY2VXaXRoVGV4dChcbiAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlZERlY2xhcmF0aW9uLmdldEluaXRpYWxpemVyT3JUaHJvdygpLmdldFRleHQoKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmlsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXBsYWNlIGNhbGxleHByZXNzaW9ucyB3aXRoIHN0cmluZyA6IHV0aWxzLmRvV29yaygpIC0+ICd1dGlscy5kb1dvcmsoKScgZG9Xb3JrKCkgLT4gJ2RvV29yaygpJ1xuICAgICAqIEBwYXJhbSBzb3VyY2VGaWxlIHRzLlNvdXJjZUZpbGVcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYW5DYWxsRXhwcmVzc2lvbnMoc291cmNlRmlsZTogU291cmNlRmlsZSk6IFNvdXJjZUZpbGUge1xuICAgICAgICBsZXQgZmlsZSA9IHNvdXJjZUZpbGU7XG5cbiAgICAgICAgY29uc3QgdmFyaWFibGVTdGF0ZW1lbnRzID0gc291cmNlRmlsZS5nZXRWYXJpYWJsZURlY2xhcmF0aW9uKHYgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2LmNvbXBpbGVyTm9kZS50eXBlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHYuY29tcGlsZXJOb2RlLnR5cGUudHlwZU5hbWUudGV4dCA9PT0gJ1JvdXRlcyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBpbml0aWFsaXplciA9IHZhcmlhYmxlU3RhdGVtZW50cy5nZXRJbml0aWFsaXplcigpO1xuXG4gICAgICAgIGZvciAoY29uc3QgY2FsbEV4cHIgb2YgaW5pdGlhbGl6ZXIuZ2V0RGVzY2VuZGFudHNPZktpbmQoU3ludGF4S2luZC5DYWxsRXhwcmVzc2lvbikpIHtcbiAgICAgICAgICAgIGlmIChjYWxsRXhwci53YXNGb3Jnb3R0ZW4oKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbEV4cHIucmVwbGFjZVdpdGhUZXh0KHdyaXRlciA9PiB3cml0ZXIucXVvdGUoY2FsbEV4cHIuZ2V0VGV4dCgpKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmlsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhbiByb3V0ZXMgZGVmaW5pdGlvbiB3aXRoIGltcG9ydGVkIGRhdGEsIGZvciBleGFtcGxlIHBhdGgsIGNoaWxkcmVuLCBvciBkeW5hbWljIHN0dWZmIGluc2lkZSBkYXRhXG4gICAgICpcbiAgICAgKiBjb25zdCBNWV9ST1VURVM6IFJvdXRlcyA9IFtcbiAgICAgKiAgICAge1xuICAgICAqICAgICAgICAgcGF0aDogJ2hvbWUnLFxuICAgICAqICAgICAgICAgY29tcG9uZW50OiBIb21lQ29tcG9uZW50XG4gICAgICogICAgIH0sXG4gICAgICogICAgIHtcbiAgICAgKiAgICAgICAgIHBhdGg6IFBBVEhTLmhvbWUsXG4gICAgICogICAgICAgICBjb21wb25lbnQ6IEhvbWVDb21wb25lbnRcbiAgICAgKiAgICAgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBUaGUgaW5pdGlhbGl6ZXIgaXMgYW4gYXJyYXkgKEFycmF5TGl0ZXJhbEV4cHJlc3Npb24gLSAxNzcgKSwgaXQgaGFzIGVsZW1lbnRzLCBvYmplY3RzIChPYmplY3RMaXRlcmFsRXhwcmVzc2lvbiAtIDE3OClcbiAgICAgKiB3aXRoIHByb3BlcnRpZXMgKFByb3BlcnR5QXNzaWdubWVudCAtIDI2MSlcbiAgICAgKlxuICAgICAqIEZvciBlYWNoIGtub3cgcHJvcGVydHkgKGh0dHBzOi8vYW5ndWxhci5pby9hcGkvcm91dGVyL1JvdXRlcyNkZXNjcmlwdGlvbiksIHdlIHRyeSB0byBzZWUgaWYgd2UgaGF2ZSB3aGF0IHdlIHdhbnRcbiAgICAgKlxuICAgICAqIEV4OiBwYXRoIGFuZCBwYXRoTWF0Y2ggd2FudCBhIHN0cmluZywgY29tcG9uZW50IGEgY29tcG9uZW50IHJlZmVyZW5jZS5cbiAgICAgKlxuICAgICAqIEl0IGlzIGFuIGltcGVyYXRpdmUgYXBwcm9hY2gsIG5vdCBhIGdlbmVyaWMgd2F5LCBwYXJzaW5nIGFsbCB0aGUgdHJlZVxuICAgICAqIGFuZCBmaW5kIHNvbWV0aGluZyBsaWtlIHRoaXMgd2hpY2ggd2lsbGwgYnJlYWsgSlNPTi5zdHJpbmdpZnkgOiBNWUlNUE9SVC5wYXRoXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHt0cy5Ob2RlfSBpbml0aWFsaXplciBUaGUgbm9kZSBvZiByb3V0ZXMgZGVmaW5pdGlvblxuICAgICAqIEByZXR1cm4ge3RzLk5vZGV9ICAgICAgICAgICAgIFRoZSBlZGl0ZWQgbm9kZVxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhblJvdXRlc0RlZmluaXRpb25XaXRoSW1wb3J0KFxuICAgICAgICBpbml0aWFsaXplcjogdHMuQXJyYXlMaXRlcmFsRXhwcmVzc2lvbixcbiAgICAgICAgbm9kZTogdHMuTm9kZSxcbiAgICAgICAgc291cmNlRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IHRzLk5vZGUge1xuICAgICAgICBpbml0aWFsaXplci5lbGVtZW50cy5mb3JFYWNoKChlbGVtZW50OiB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbikgPT4ge1xuICAgICAgICAgICAgZWxlbWVudC5wcm9wZXJ0aWVzLmZvckVhY2goKHByb3BlcnR5OiB0cy5Qcm9wZXJ0eUFzc2lnbm1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcHJvcGVydHlOYW1lID0gcHJvcGVydHkubmFtZS5nZXRUZXh0KCksXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5SW5pdGlhbGl6ZXIgPSBwcm9wZXJ0eS5pbml0aWFsaXplcjtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHByb3BlcnR5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdwYXRoJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncmVkaXJlY3RUbyc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ291dGxldCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3BhdGhNYXRjaCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlJbml0aWFsaXplcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eUluaXRpYWxpemVyLmtpbmQgIT09IFN5bnRheEtpbmQuU3RyaW5nTGl0ZXJhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZGVudGlmaWVyKDcxKSB3b24ndCBicmVhayBwYXJzaW5nLCBidXQgaXQgd2lsbCBiZSBiZXR0ZXIgdG8gcmV0cml2ZSB0aGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbigxNzkpIGV4OiBNWUlNUE9SVC5wYXRoIHdpbGwgYnJlYWsgaXQsIGZpbmQgaXQgaW4gaW1wb3J0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5SW5pdGlhbGl6ZXIua2luZCA9PT0gU3ludGF4S2luZC5Qcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdE9iamVjdExpdGVyYWxBdHRyaWJ1dGVOYW1lID0gcHJvcGVydHlJbml0aWFsaXplci5uYW1lLmdldFRleHQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdE9iamVjdExpdGVyYWxBdHRyaWJ1dGVOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5SW5pdGlhbGl6ZXIuZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0T2JqZWN0TGl0ZXJhbEF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eUluaXRpYWxpemVyLmV4cHJlc3Npb24uZ2V0VGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLmltcG9ydHNVdGlsLmZpbmRQcm9wZXJ0eVZhbHVlSW5JbXBvcnRPckxvY2FsVmFyaWFibGVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdE9iamVjdExpdGVyYWxBdHRyaWJ1dGVOYW1lICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0T2JqZWN0TGl0ZXJhbEF0dHJpYnV0ZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlJbml0aWFsaXplci5raW5kID0gOTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlJbml0aWFsaXplci50ZXh0ID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGluaXRpYWxpemVyO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IHRzIH0gZnJvbSAndHMtc2ltcGxlLWFzdCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc01vZHVsZVdpdGhQcm92aWRlcnMobm9kZTogdHMuVmFyaWFibGVTdGF0ZW1lbnQpOiBib29sZWFuIHtcbiAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG4gICAgaWYgKG5vZGUuZGVjbGFyYXRpb25MaXN0KSB7XG4gICAgICAgIGlmIChub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnMgJiYgbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBpID0gMCxcbiAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnMgPSBub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnMsXG4gICAgICAgICAgICAgICAgbGVuID0gbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zLmxlbmd0aDtcblxuICAgICAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgZGVjbGFyYXRpb24gPSBub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnNbaV07XG5cbiAgICAgICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24udHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZTogdHMuVHlwZVJlZmVyZW5jZU5vZGUgPSBkZWNsYXJhdGlvbi50eXBlIGFzIHRzLlR5cGVSZWZlcmVuY2VOb2RlO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS50eXBlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHQgPSB0eXBlLnR5cGVOYW1lLmdldFRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0ID09PSAnTW9kdWxlV2l0aFByb3ZpZGVycycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4iLCJpbXBvcnQgeyB0cyB9IGZyb20gJ3RzLXNpbXBsZS1hc3QnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9kdWxlV2l0aFByb3ZpZGVycyhub2RlOiB0cy5WYXJpYWJsZVN0YXRlbWVudCkge1xuICAgIGxldCByZXN1bHQ7XG4gICAgaWYgKG5vZGUuZGVjbGFyYXRpb25MaXN0KSB7XG4gICAgICAgIGlmIChub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnMgJiYgbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBpID0gMCxcbiAgICAgICAgICAgICAgICBsZW4gPSBub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnMubGVuZ3RoO1xuXG4gICAgICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBkZWNsYXJhdGlvbiA9IG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9uc1tpXTtcblxuICAgICAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbi50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0eXBlOiB0cy5UeXBlUmVmZXJlbmNlTm9kZSA9IGRlY2xhcmF0aW9uLnR5cGUgYXMgdHMuVHlwZVJlZmVyZW5jZU5vZGU7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLnR5cGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dCA9IHR5cGUudHlwZU5hbWUuZ2V0VGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHQgPT09ICdNb2R1bGVXaXRoUHJvdmlkZXJzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRlY2xhcmF0aW9uLmluaXRpYWxpemVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4iLCJjb25zdCB1dWlkID0gcmVxdWlyZSgndXVpZC92NCcpO1xuXG5leHBvcnQgZnVuY3Rpb24gdW5pcWlkKCkge1xuICAgIHJldHVybiB1dWlkKCk7XG59IiwiZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RMZWFkaW5nVGV4dChzdHJpbmcsIGNvbXBsZXRlVGFnKSB7XG4gICAgbGV0IHRhZ0luZGV4ID0gc3RyaW5nLmluZGV4T2YoY29tcGxldGVUYWcpO1xuICAgIGxldCBsZWFkaW5nVGV4dCA9IHVuZGVmaW5lZDtcbiAgICBsZXQgbGVhZGluZ1RleHRSZWdFeHAgPSAvXFxbKC4rPylcXF0vZztcbiAgICBsZXQgbGVhZGluZ1RleHRJbmZvID0gbGVhZGluZ1RleHRSZWdFeHAuZXhlYyhzdHJpbmcpO1xuXG4gICAgLy8gZGlkIHdlIGZpbmQgbGVhZGluZyB0ZXh0LCBhbmQgaWYgc28sIGRvZXMgaXQgaW1tZWRpYXRlbHkgcHJlY2VkZSB0aGUgdGFnP1xuICAgIHdoaWxlIChsZWFkaW5nVGV4dEluZm8gJiYgbGVhZGluZ1RleHRJbmZvLmxlbmd0aCkge1xuICAgICAgICBpZiAobGVhZGluZ1RleHRJbmZvLmluZGV4ICsgbGVhZGluZ1RleHRJbmZvWzBdLmxlbmd0aCA9PT0gdGFnSW5kZXgpIHtcbiAgICAgICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKGxlYWRpbmdUZXh0SW5mb1swXSwgJycpO1xuICAgICAgICAgICAgbGVhZGluZ1RleHQgPSBsZWFkaW5nVGV4dEluZm9bMV07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGxlYWRpbmdUZXh0SW5mbyA9IGxlYWRpbmdUZXh0UmVnRXhwLmV4ZWMoc3RyaW5nKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBsZWFkaW5nVGV4dDogbGVhZGluZ1RleHQsXG4gICAgICAgIHN0cmluZzogc3RyaW5nXG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0TGlua1RleHQodGV4dCkge1xuICAgIGxldCBsaW5rVGV4dDtcbiAgICBsZXQgdGFyZ2V0O1xuICAgIGxldCBzcGxpdEluZGV4O1xuXG4gICAgLy8gaWYgYSBwaXBlIGlzIG5vdCBwcmVzZW50LCB3ZSBzcGxpdCBvbiB0aGUgZmlyc3Qgc3BhY2VcbiAgICBzcGxpdEluZGV4ID0gdGV4dC5pbmRleE9mKCd8Jyk7XG4gICAgaWYgKHNwbGl0SW5kZXggPT09IC0xKSB7XG4gICAgICAgIHNwbGl0SW5kZXggPSB0ZXh0LnNlYXJjaCgvXFxzLyk7XG4gICAgfVxuXG4gICAgaWYgKHNwbGl0SW5kZXggIT09IC0xKSB7XG4gICAgICAgIGxpbmtUZXh0ID0gdGV4dC5zdWJzdHIoc3BsaXRJbmRleCArIDEpO1xuICAgICAgICAvLyBOb3JtYWxpemUgc3Vic2VxdWVudCBuZXdsaW5lcyB0byBhIHNpbmdsZSBzcGFjZS5cbiAgICAgICAgbGlua1RleHQgPSBsaW5rVGV4dC5yZXBsYWNlKC9cXG4rLywgJyAnKTtcbiAgICAgICAgdGFyZ2V0ID0gdGV4dC5zdWJzdHIoMCwgc3BsaXRJbmRleCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbGlua1RleHQ6IGxpbmtUZXh0LFxuICAgICAgICB0YXJnZXQ6IHRhcmdldCB8fCB0ZXh0XG4gICAgfTtcbn1cblxuZXhwb3J0IGxldCBMaW5rUGFyc2VyID0gKGZ1bmN0aW9uKCkge1xuICAgIGxldCBwcm9jZXNzVGhlTGluayA9IGZ1bmN0aW9uKHN0cmluZywgdGFnSW5mbywgbGVhZGluZ1RleHQpIHtcbiAgICAgICAgbGV0IGxlYWRpbmcgPSBleHRyYWN0TGVhZGluZ1RleHQoc3RyaW5nLCB0YWdJbmZvLmNvbXBsZXRlVGFnKSxcbiAgICAgICAgICAgIGxpbmtUZXh0LFxuICAgICAgICAgICAgc3BsaXQsXG4gICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICBzdHJpbmd0b1JlcGxhY2U7XG5cbiAgICAgICAgbGlua1RleHQgPSBsZWFkaW5nVGV4dCA/IGxlYWRpbmdUZXh0IDogbGVhZGluZy5sZWFkaW5nVGV4dCB8fCAnJztcblxuICAgICAgICBzcGxpdCA9IHNwbGl0TGlua1RleHQodGFnSW5mby50ZXh0KTtcbiAgICAgICAgdGFyZ2V0ID0gc3BsaXQudGFyZ2V0O1xuXG4gICAgICAgIGlmIChsZWFkaW5nLmxlYWRpbmdUZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN0cmluZ3RvUmVwbGFjZSA9ICdbJyArIGxlYWRpbmcubGVhZGluZ1RleHQgKyAnXScgKyB0YWdJbmZvLmNvbXBsZXRlVGFnO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzcGxpdC5saW5rVGV4dCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHN0cmluZ3RvUmVwbGFjZSA9IHRhZ0luZm8uY29tcGxldGVUYWc7XG4gICAgICAgICAgICBsaW5rVGV4dCA9IHNwbGl0LmxpbmtUZXh0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHN0cmluZ3RvUmVwbGFjZSwgJ1snICsgbGlua1RleHQgKyAnXSgnICsgdGFyZ2V0ICsgJyknKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydFxuICAgICAqIHtAbGluayBodHRwOi8vd3d3Lmdvb2dsZS5jb218R29vZ2xlfSBvciB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tIEdpdEh1Yn0gb3IgW0dpdGh1Yl17QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tfSB0byBbR2l0aHViXShodHRwczovL2dpdGh1Yi5jb20pXG4gICAgICovXG5cbiAgICBsZXQgcmVwbGFjZUxpbmtUYWcgPSBmdW5jdGlvbihzdHI6IHN0cmluZykge1xuICAgICAgICBpZiAodHlwZW9mIHN0ciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmV3U3RyaW5nOiAnJ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG5ldyBSZWdFeHAoJ1xcXFxbKCg/Oi58XFxuKSs/KV1cXFxce0BsaW5rXFxcXHMrKCg/Oi58XFxuKSs/KVxcXFx9JywgJ2knKS5leGVjKCdlZSBbVE8gRE9de0BsaW5rIFRvZG99IGZvJykgLT4gXCJbVE8gRE9de0BsaW5rIFRvZG99XCIsIFwiVE8gRE9cIiwgXCJUb2RvXCJcbiAgICAgICAgLy8gbmV3IFJlZ0V4cCgnXFxcXHtAbGlua1xcXFxzKygoPzoufFxcbikrPylcXFxcfScsICdpJykuZXhlYygnZWUgW1RPRE9de0BsaW5rIFRvZG99IGZvJykgLT4gXCJ7QGxpbmsgVG9kb31cIiwgXCJUb2RvXCJcblxuICAgICAgICBsZXQgdGFnUmVnRXhwTGlnaHQgPSBuZXcgUmVnRXhwKCdcXFxce0BsaW5rXFxcXHMrKCg/Oi58XFxuKSs/KVxcXFx9JywgJ2knKSxcbiAgICAgICAgICAgIHRhZ1JlZ0V4cEZ1bGwgPSBuZXcgUmVnRXhwKCdcXFxce0BsaW5rXFxcXHMrKCg/Oi58XFxuKSs/KVxcXFx9JywgJ2knKSxcbiAgICAgICAgICAgIHRhZ1JlZ0V4cCxcbiAgICAgICAgICAgIG1hdGNoZXMsXG4gICAgICAgICAgICBwcmV2aW91c1N0cmluZyxcbiAgICAgICAgICAgIHRhZ0luZm8gPSBbXTtcblxuICAgICAgICB0YWdSZWdFeHAgPSBzdHIuaW5kZXhPZignXXsnKSAhPT0gLTEgPyB0YWdSZWdFeHBGdWxsIDogdGFnUmVnRXhwTGlnaHQ7XG5cbiAgICAgICAgZnVuY3Rpb24gcmVwbGFjZU1hdGNoKHJlcGxhY2VyLCB0YWcsIG1hdGNoLCB0ZXh0LCBsaW5rVGV4dD8pIHtcbiAgICAgICAgICAgIGxldCBtYXRjaGVkVGFnID0ge1xuICAgICAgICAgICAgICAgIGNvbXBsZXRlVGFnOiBtYXRjaCxcbiAgICAgICAgICAgICAgICB0YWc6IHRhZyxcbiAgICAgICAgICAgICAgICB0ZXh0OiB0ZXh0XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGFnSW5mby5wdXNoKG1hdGNoZWRUYWcpO1xuICAgICAgICAgICAgaWYgKGxpbmtUZXh0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VyKHN0ciwgbWF0Y2hlZFRhZywgbGlua1RleHQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVwbGFjZXIoc3RyLCBtYXRjaGVkVGFnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIG1hdGNoZXMgPSB0YWdSZWdFeHAuZXhlYyhzdHIpO1xuICAgICAgICAgICAgaWYgKG1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgICBwcmV2aW91c1N0cmluZyA9IHN0cjtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyID0gcmVwbGFjZU1hdGNoKHByb2Nlc3NUaGVMaW5rLCAnbGluaycsIG1hdGNoZXNbMF0sIG1hdGNoZXNbMV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyID0gcmVwbGFjZU1hdGNoKHByb2Nlc3NUaGVMaW5rLCAnbGluaycsIG1hdGNoZXNbMF0sIG1hdGNoZXNbMl0sIG1hdGNoZXNbMV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAobWF0Y2hlcyAmJiBwcmV2aW91c1N0cmluZyAhPT0gc3RyKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmV3U3RyaW5nOiBzdHJcbiAgICAgICAgfTtcbiAgICB9O1xuXG4gICAgbGV0IF9yZXNvbHZlTGlua3MgPSBmdW5jdGlvbihzdHI6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gcmVwbGFjZUxpbmtUYWcoc3RyKS5uZXdTdHJpbmc7XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIHJlc29sdmVMaW5rczogX3Jlc29sdmVMaW5rc1xuICAgIH07XG59KSgpO1xuIiwiZXhwb3J0IGVudW0gQW5ndWxhckxpZmVjeWNsZUhvb2tzIHtcbiAgICBuZ09uQ2hhbmdlcyxcbiAgICBuZ09uSW5pdCxcbiAgICBuZ0RvQ2hlY2ssXG4gICAgbmdBZnRlckNvbnRlbnRJbml0LFxuICAgIG5nQWZ0ZXJDb250ZW50Q2hlY2tlZCxcbiAgICBuZ0FmdGVyVmlld0luaXQsXG4gICAgbmdBZnRlclZpZXdDaGVja2VkLFxuICAgIG5nT25EZXN0cm95XG59XG4iLCJpbXBvcnQgeyB0cywgU3ludGF4S2luZCB9IGZyb20gJ3RzLXNpbXBsZS1hc3QnO1xuXG5leHBvcnQgZnVuY3Rpb24ga2luZFRvVHlwZShraW5kOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGxldCBfdHlwZSA9ICcnO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgICBjYXNlIFN5bnRheEtpbmQuU3RyaW5nS2V5d29yZDpcbiAgICAgICAgY2FzZSBTeW50YXhLaW5kLlN0cmluZ0xpdGVyYWw6XG4gICAgICAgICAgICBfdHlwZSA9ICdzdHJpbmcnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5OdW1iZXJLZXl3b3JkOlxuICAgICAgICBjYXNlIFN5bnRheEtpbmQuTnVtZXJpY0xpdGVyYWw6XG4gICAgICAgICAgICBfdHlwZSA9ICdudW1iZXInO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5BcnJheVR5cGU6XG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5BcnJheUxpdGVyYWxFeHByZXNzaW9uOlxuICAgICAgICAgICAgX3R5cGUgPSAnW10nO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5Wb2lkS2V5d29yZDpcbiAgICAgICAgICAgIF90eXBlID0gJ3ZvaWQnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5GdW5jdGlvblR5cGU6XG4gICAgICAgICAgICBfdHlwZSA9ICdmdW5jdGlvbic7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBTeW50YXhLaW5kLlR5cGVMaXRlcmFsOlxuICAgICAgICAgICAgX3R5cGUgPSAnbGl0ZXJhbCB0eXBlJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFN5bnRheEtpbmQuQm9vbGVhbktleXdvcmQ6XG4gICAgICAgICAgICBfdHlwZSA9ICdib29sZWFuJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFN5bnRheEtpbmQuQW55S2V5d29yZDpcbiAgICAgICAgICAgIF90eXBlID0gJ2FueSc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBTeW50YXhLaW5kLk51bGxLZXl3b3JkOlxuICAgICAgICAgICAgX3R5cGUgPSAnbnVsbCc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBTeW50YXhLaW5kLk5ldmVyS2V5d29yZDpcbiAgICAgICAgICAgIF90eXBlID0gJ25ldmVyJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFN5bnRheEtpbmQuVW5kZWZpbmVkS2V5d29yZDpcbiAgICAgICAgICAgIF90eXBlID0gJ3VuZGVmaW5lZCc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBTeW50YXhLaW5kLk9iamVjdEtleXdvcmQ6XG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbjpcbiAgICAgICAgICAgIF90eXBlID0gJ29iamVjdCc7XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIF90eXBlO1xufVxuIiwiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IHRzIH0gZnJvbSAndHMtc2ltcGxlLWFzdCc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCB7IExpbmtQYXJzZXIgfSBmcm9tICcuL2xpbmstcGFyc2VyJztcblxuaW1wb3J0IHsgQW5ndWxhckxpZmVjeWNsZUhvb2tzIH0gZnJvbSAnLi9hbmd1bGFyLWxpZmVjeWNsZXMtaG9va3MnO1xuaW1wb3J0IHsga2luZFRvVHlwZSB9IGZyb20gJy4va2luZC10by10eXBlJztcblxuY29uc3QgZ2V0Q3VycmVudERpcmVjdG9yeSA9IHRzLnN5cy5nZXRDdXJyZW50RGlyZWN0b3J5O1xuY29uc3QgdXNlQ2FzZVNlbnNpdGl2ZUZpbGVOYW1lcyA9IHRzLnN5cy51c2VDYXNlU2Vuc2l0aXZlRmlsZU5hbWVzO1xuY29uc3QgbmV3TGluZSA9IHRzLnN5cy5uZXdMaW5lO1xuY29uc3QgbWFya2VkID0gcmVxdWlyZSgnbWFya2VkJyk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXdMaW5lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5ld0xpbmU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDYW5vbmljYWxGaWxlTmFtZShmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdXNlQ2FzZVNlbnNpdGl2ZUZpbGVOYW1lcyA/IGZpbGVOYW1lIDogZmlsZU5hbWUudG9Mb3dlckNhc2UoKTtcbn1cblxuZXhwb3J0IGNvbnN0IGZvcm1hdERpYWdub3N0aWNzSG9zdDogdHMuRm9ybWF0RGlhZ25vc3RpY3NIb3N0ID0ge1xuICAgIGdldEN1cnJlbnREaXJlY3RvcnksXG4gICAgZ2V0Q2Fub25pY2FsRmlsZU5hbWUsXG4gICAgZ2V0TmV3TGluZVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG1hcmtlZHRhZ3ModGFnczogQXJyYXk8YW55Pikge1xuICAgIGxldCBtdGFncyA9IHRhZ3M7XG4gICAgXy5mb3JFYWNoKG10YWdzLCB0YWcgPT4ge1xuICAgICAgICB0YWcuY29tbWVudCA9IG1hcmtlZChMaW5rUGFyc2VyLnJlc29sdmVMaW5rcyh0YWcuY29tbWVudCkpO1xuICAgIH0pO1xuICAgIHJldHVybiBtdGFncztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlVGFnc0FuZEFyZ3MoYXJnczogQXJyYXk8YW55PiwganNkb2N0YWdzPzogQXJyYXk8YW55Pik6IEFycmF5PGFueT4ge1xuICAgIGxldCBtYXJncyA9IF8uY2xvbmVEZWVwKGFyZ3MpO1xuICAgIF8uZm9yRWFjaChtYXJncywgYXJnID0+IHtcbiAgICAgICAgYXJnLnRhZ05hbWUgPSB7XG4gICAgICAgICAgICB0ZXh0OiAncGFyYW0nXG4gICAgICAgIH07XG4gICAgICAgIGlmIChqc2RvY3RhZ3MpIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaChqc2RvY3RhZ3MsIGpzZG9jdGFnID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoanNkb2N0YWcubmFtZSAmJiBqc2RvY3RhZy5uYW1lLnRleHQgPT09IGFyZy5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZy50YWdOYW1lID0ganNkb2N0YWcudGFnTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgYXJnLm5hbWUgPSBqc2RvY3RhZy5uYW1lO1xuICAgICAgICAgICAgICAgICAgICBhcmcuY29tbWVudCA9IGpzZG9jdGFnLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGFyZy50eXBlRXhwcmVzc2lvbiA9IGpzZG9jdGFnLnR5cGVFeHByZXNzaW9uO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgLy8gQWRkIGV4YW1wbGUgJiByZXR1cm5zXG4gICAgaWYgKGpzZG9jdGFncykge1xuICAgICAgICBfLmZvckVhY2goanNkb2N0YWdzLCBqc2RvY3RhZyA9PiB7XG4gICAgICAgICAgICBpZiAoanNkb2N0YWcudGFnTmFtZSAmJiBqc2RvY3RhZy50YWdOYW1lLnRleHQgPT09ICdleGFtcGxlJykge1xuICAgICAgICAgICAgICAgIG1hcmdzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0YWdOYW1lOiBqc2RvY3RhZy50YWdOYW1lLFxuICAgICAgICAgICAgICAgICAgICBjb21tZW50OiBqc2RvY3RhZy5jb21tZW50XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAganNkb2N0YWcudGFnTmFtZSAmJlxuICAgICAgICAgICAgICAgIChqc2RvY3RhZy50YWdOYW1lLnRleHQgPT09ICdyZXR1cm5zJyB8fCBqc2RvY3RhZy50YWdOYW1lLnRleHQgPT09ICdyZXR1cm4nKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJldCA9IHtcbiAgICAgICAgICAgICAgICAgICAgdGFnTmFtZToganNkb2N0YWcudGFnTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudDoganNkb2N0YWcuY29tbWVudFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKGpzZG9jdGFnLnR5cGVFeHByZXNzaW9uICYmIGpzZG9jdGFnLnR5cGVFeHByZXNzaW9uLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0LnJldHVyblR5cGUgPSBraW5kVG9UeXBlKGpzZG9jdGFnLnR5cGVFeHByZXNzaW9uLnR5cGUua2luZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1hcmdzLnB1c2gocmV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBtYXJncztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRDb25maWcoY29uZmlnRmlsZTogc3RyaW5nKTogYW55IHtcbiAgICBsZXQgcmVzdWx0ID0gdHMucmVhZENvbmZpZ0ZpbGUoY29uZmlnRmlsZSwgdHMuc3lzLnJlYWRGaWxlKTtcbiAgICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdHMuZm9ybWF0RGlhZ25vc3RpY3MoW3Jlc3VsdC5lcnJvcl0sIGZvcm1hdERpYWdub3N0aWNzSG9zdCk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdC5jb25maWc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpcEJvbShzb3VyY2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHNvdXJjZS5jaGFyQ29kZUF0KDApID09PSAweGZlZmYpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5zbGljZSgxKTtcbiAgICB9XG4gICAgcmV0dXJuIHNvdXJjZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0JvbShzb3VyY2U6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzb3VyY2UuY2hhckNvZGVBdCgwKSA9PT0gMHhmZWZmO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlUGF0aChmaWxlczogQXJyYXk8c3RyaW5nPiwgY3dkOiBzdHJpbmcpOiBBcnJheTxzdHJpbmc+IHtcbiAgICBsZXQgX2ZpbGVzID0gZmlsZXM7XG4gICAgbGV0IGkgPSAwO1xuICAgIGxldCBsZW4gPSBmaWxlcy5sZW5ndGg7XG5cbiAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAoZmlsZXNbaV0uaW5kZXhPZihjd2QpID09PSAtMSkge1xuICAgICAgICAgICAgZmlsZXNbaV0gPSBwYXRoLnJlc29sdmUoY3dkICsgcGF0aC5zZXAgKyBmaWxlc1tpXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gX2ZpbGVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5MaWZlY3ljbGVIb29rc0Zyb21NZXRob2RzKG1ldGhvZHM6IEFycmF5PGFueT4pOiBBcnJheTxhbnk+IHtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgaWYgKHR5cGVvZiBtZXRob2RzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGxldCBsZW4gPSBtZXRob2RzLmxlbmd0aDtcbiAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghKG1ldGhvZHNbaV0ubmFtZSBpbiBBbmd1bGFyTGlmZWN5Y2xlSG9va3MpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobWV0aG9kc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuU291cmNlc0ZvcldhdGNoKGxpc3QpIHtcbiAgICByZXR1cm4gbGlzdC5maWx0ZXIoZWxlbWVudCA9PiB7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHByb2Nlc3MuY3dkKCkgKyBwYXRoLnNlcCArIGVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZXNDb21wYXJlRm4obmFtZT8pIHtcbiAgICAvKipcbiAgICAgKiBDb3B5cmlnaHQgaHR0cHM6Ly9naXRodWIuY29tL25nLWJvb3RzdHJhcC9uZy1ib290c3RyYXBcbiAgICAgKi9cbiAgICBuYW1lID0gbmFtZSB8fCAnbmFtZSc7XG4gICAgY29uc3QgdCA9IChhLCBiKSA9PiB7XG4gICAgICAgIGlmIChhW25hbWVdKSB7XG4gICAgICAgICAgICByZXR1cm4gYVtuYW1lXS5sb2NhbGVDb21wYXJlKGJbbmFtZV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNJZ25vcmUobWVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKG1lbWJlci5qc0RvYykge1xuICAgICAgICBmb3IgKGNvbnN0IGRvYyBvZiBtZW1iZXIuanNEb2MpIHtcbiAgICAgICAgICAgIGlmIChkb2MudGFncykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdGFnIG9mIGRvYy50YWdzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcudGFnTmFtZS50ZXh0LmluZGV4T2YoJ2lnbm9yZScpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluY2x1ZGVzXG5pZiAoIUFycmF5LnByb3RvdHlwZS5pbmNsdWRlcykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsICdpbmNsdWRlcycsIHtcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKHNlYXJjaEVsZW1lbnQsIGZyb21JbmRleCkge1xuICAgICAgICAgICAgaWYgKHRoaXMgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1widGhpc1wiIGlzIG51bGwgb3Igbm90IGRlZmluZWQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gMS4gTGV0IE8gYmUgPyBUb09iamVjdCh0aGlzIHZhbHVlKS5cbiAgICAgICAgICAgIHZhciBvID0gT2JqZWN0KHRoaXMpO1xuXG4gICAgICAgICAgICAvLyAyLiBMZXQgbGVuIGJlID8gVG9MZW5ndGgoPyBHZXQoTywgXCJsZW5ndGhcIikpLlxuICAgICAgICAgICAgdmFyIGxlbiA9IG8ubGVuZ3RoID4+PiAwO1xuXG4gICAgICAgICAgICAvLyAzLiBJZiBsZW4gaXMgMCwgcmV0dXJuIGZhbHNlLlxuICAgICAgICAgICAgaWYgKGxlbiA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gNC4gTGV0IG4gYmUgPyBUb0ludGVnZXIoZnJvbUluZGV4KS5cbiAgICAgICAgICAgIC8vICAgIChJZiBmcm9tSW5kZXggaXMgdW5kZWZpbmVkLCB0aGlzIHN0ZXAgcHJvZHVjZXMgdGhlIHZhbHVlIDAuKVxuICAgICAgICAgICAgdmFyIG4gPSBmcm9tSW5kZXggfCAwO1xuXG4gICAgICAgICAgICAvLyA1LiBJZiBuIOKJpSAwLCB0aGVuXG4gICAgICAgICAgICAvLyAgYS4gTGV0IGsgYmUgbi5cbiAgICAgICAgICAgIC8vIDYuIEVsc2UgbiA8IDAsXG4gICAgICAgICAgICAvLyAgYS4gTGV0IGsgYmUgbGVuICsgbi5cbiAgICAgICAgICAgIC8vICBiLiBJZiBrIDwgMCwgbGV0IGsgYmUgMC5cbiAgICAgICAgICAgIHZhciBrID0gTWF0aC5tYXgobiA+PSAwID8gbiA6IGxlbiAtIE1hdGguYWJzKG4pLCAwKTtcblxuICAgICAgICAgICAgZnVuY3Rpb24gc2FtZVZhbHVlWmVybyh4LCB5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgeCA9PT0geSB8fFxuICAgICAgICAgICAgICAgICAgICAodHlwZW9mIHggPT09ICdudW1iZXInICYmIHR5cGVvZiB5ID09PSAnbnVtYmVyJyAmJiBpc05hTih4KSAmJiBpc05hTih5KSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyA3LiBSZXBlYXQsIHdoaWxlIGsgPCBsZW5cbiAgICAgICAgICAgIHdoaWxlIChrIDwgbGVuKSB7XG4gICAgICAgICAgICAgICAgLy8gYS4gTGV0IGVsZW1lbnRLIGJlIHRoZSByZXN1bHQgb2YgPyBHZXQoTywgISBUb1N0cmluZyhrKSkuXG4gICAgICAgICAgICAgICAgLy8gYi4gSWYgU2FtZVZhbHVlWmVybyhzZWFyY2hFbGVtZW50LCBlbGVtZW50SykgaXMgdHJ1ZSwgcmV0dXJuIHRydWUuXG4gICAgICAgICAgICAgICAgaWYgKHNhbWVWYWx1ZVplcm8ob1trXSwgc2VhcmNoRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGMuIEluY3JlYXNlIGsgYnkgMS5cbiAgICAgICAgICAgICAgICBrKys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIDguIFJldHVybiBmYWxzZVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5cbmltcG9ydCB7IERlcGVuZGVuY2llc0VuZ2luZSB9IGZyb20gJy4uL2RlcGVuZGVuY2llcy5lbmdpbmUnO1xuaW1wb3J0IHsgQW5ndWxhclZlcnNpb25VdGlsLCBCYXNpY1R5cGVVdGlsIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkludGVyZmFjZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvY29uZmlndXJhdGlvbi5pbnRlcmZhY2UnO1xuXG5pbXBvcnQgeyB0cyB9IGZyb20gJ3RzLXNpbXBsZS1hc3QnO1xuXG5leHBvcnQgY2xhc3MgRnVuY3Rpb25TaWduYXR1cmVIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHJpdmF0ZSBhbmd1bGFyVmVyc2lvblV0aWwgPSBuZXcgQW5ndWxhclZlcnNpb25VdGlsKCk7XG4gICAgcHJpdmF0ZSBiYXNpY1R5cGVVdGlsID0gbmV3IEJhc2ljVHlwZVV0aWwoKTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGNvbmZpZ3VyYXRpb246IENvbmZpZ3VyYXRpb25JbnRlcmZhY2UsXG4gICAgICAgIHByaXZhdGUgZGVwZW5kZW5jaWVzRW5naW5lOiBEZXBlbmRlbmNpZXNFbmdpbmVcbiAgICApIHt9XG5cbiAgICBwcml2YXRlIGhhbmRsZUZ1bmN0aW9uKGFyZyk6IHN0cmluZyB7XG4gICAgICAgIGlmIChhcmcuZnVuY3Rpb24ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7YXJnLm5hbWV9JHt0aGlzLmdldE9wdGlvbmFsU3RyaW5nKGFyZyl9OiAoKSA9PiB2b2lkYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBhcmd1bXMgPSBhcmcuZnVuY3Rpb24ubWFwKGFyZ3UgPT4ge1xuICAgICAgICAgICAgbGV0IF9yZXN1bHQgPSB0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5maW5kKGFyZ3UudHlwZSk7XG4gICAgICAgICAgICBpZiAoX3Jlc3VsdCkge1xuICAgICAgICAgICAgICAgIGlmIChfcmVzdWx0LnNvdXJjZSA9PT0gJ2ludGVybmFsJykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aCA9IF9yZXN1bHQuZGF0YS50eXBlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoX3Jlc3VsdC5kYXRhLnR5cGUgPT09ICdjbGFzcycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAnY2xhc3NlJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7YXJndS5uYW1lfSR7dGhpcy5nZXRPcHRpb25hbFN0cmluZyhhcmcpfTogPGEgaHJlZj1cIi4uLyR7cGF0aH1zLyR7XG4gICAgICAgICAgICAgICAgICAgICAgICBfcmVzdWx0LmRhdGEubmFtZVxuICAgICAgICAgICAgICAgICAgICB9Lmh0bWxcIj4ke2FyZ3UudHlwZX08L2E+YDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aCA9IHRoaXMuYW5ndWxhclZlcnNpb25VdGlsLmdldEFwaUxpbmsoXG4gICAgICAgICAgICAgICAgICAgICAgICBfcmVzdWx0LmRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuYW5ndWxhclZlcnNpb25cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke2FyZ3UubmFtZX0ke3RoaXMuZ2V0T3B0aW9uYWxTdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdcbiAgICAgICAgICAgICAgICAgICAgKX06IDxhIGhyZWY9XCIke3BhdGh9XCIgdGFyZ2V0PVwiX2JsYW5rXCI+JHthcmd1LnR5cGV9PC9hPmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmJhc2ljVHlwZVV0aWwuaXNLbm93blR5cGUoYXJndS50eXBlKSkge1xuICAgICAgICAgICAgICAgIGxldCBwYXRoID0gdGhpcy5iYXNpY1R5cGVVdGlsLmdldFR5cGVVcmwoYXJndS50eXBlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7YXJndS5uYW1lfSR7dGhpcy5nZXRPcHRpb25hbFN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgYXJnXG4gICAgICAgICAgICAgICAgKX06IDxhIGhyZWY9XCIke3BhdGh9XCIgdGFyZ2V0PVwiX2JsYW5rXCI+JHthcmd1LnR5cGV9PC9hPmA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChhcmd1Lm5hbWUgJiYgYXJndS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHthcmd1Lm5hbWV9JHt0aGlzLmdldE9wdGlvbmFsU3RyaW5nKGFyZyl9OiAke2FyZ3UudHlwZX1gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHthcmd1Lm5hbWUudGV4dH1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBgJHthcmcubmFtZX0ke3RoaXMuZ2V0T3B0aW9uYWxTdHJpbmcoYXJnKX06ICgke2FyZ3Vtc30pID0+IHZvaWRgO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0T3B0aW9uYWxTdHJpbmcoYXJnKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGFyZy5vcHRpb25hbCA/ICc/JyA6ICcnO1xuICAgIH1cblxuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgbWV0aG9kKSB7XG4gICAgICAgIGxldCBhcmdzID0gW107XG5cbiAgICAgICAgaWYgKG1ldGhvZC5hcmdzKSB7XG4gICAgICAgICAgICBhcmdzID0gbWV0aG9kLmFyZ3NcbiAgICAgICAgICAgICAgICAubWFwKGFyZyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBfcmVzdWx0ID0gdGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUuZmluZChhcmcudHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3Jlc3VsdC5zb3VyY2UgPT09ICdpbnRlcm5hbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aCA9IF9yZXN1bHQuZGF0YS50eXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfcmVzdWx0LmRhdGEudHlwZSA9PT0gJ2NsYXNzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gJ2NsYXNzZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHthcmcubmFtZX0ke3RoaXMuZ2V0T3B0aW9uYWxTdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9OiA8YSBocmVmPVwiLi4vJHtwYXRofXMvJHtfcmVzdWx0LmRhdGEubmFtZX0uaHRtbFwiPiR7YXJnLnR5cGV9PC9hPmA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXRoID0gdGhpcy5hbmd1bGFyVmVyc2lvblV0aWwuZ2V0QXBpTGluayhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc3VsdC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuYW5ndWxhclZlcnNpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHthcmcubmFtZX0ke3RoaXMuZ2V0T3B0aW9uYWxTdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9OiA8YSBocmVmPVwiJHtwYXRofVwiIHRhcmdldD1cIl9ibGFua1wiPiR7YXJnLnR5cGV9PC9hPmA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnLmRvdERvdERvdFRva2VuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYC4uLiR7YXJnLm5hbWV9OiAke2FyZy50eXBlfWA7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnLmZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVGdW5jdGlvbihhcmcpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYmFzaWNUeXBlVXRpbC5pc0tub3duVHlwZShhcmcudHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXRoID0gdGhpcy5iYXNpY1R5cGVVdGlsLmdldFR5cGVVcmwoYXJnLnR5cGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke2FyZy5uYW1lfSR7dGhpcy5nZXRPcHRpb25hbFN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdcbiAgICAgICAgICAgICAgICAgICAgICAgICl9OiA8YSBocmVmPVwiJHtwYXRofVwiIHRhcmdldD1cIl9ibGFua1wiPiR7YXJnLnR5cGV9PC9hPmA7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7YXJnLm5hbWV9JHt0aGlzLmdldE9wdGlvbmFsU3RyaW5nKGFyZyl9OiAke2FyZy50eXBlfWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5qb2luKCcsICcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRob2QubmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIGAke21ldGhvZC5uYW1lfSgke2FyZ3N9KWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYCgke2FyZ3N9KWA7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uSW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9jb25maWd1cmF0aW9uLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBJc05vdFRvZ2dsZUhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvbmZpZ3VyYXRpb246IENvbmZpZ3VyYXRpb25JbnRlcmZhY2UpIHtcblxuICAgIH1cblxuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgdHlwZSwgb3B0aW9ucykge1xuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLnRvZ2dsZU1lbnVJdGVtcy5pbmRleE9mKHR5cGUpO1xuXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEudG9nZ2xlTWVudUl0ZW1zLmluZGV4T2YoJ2FsbCcpICE9PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZShjb250ZXh0KTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbihjb250ZXh0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UoY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59IiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIsIElIYW5kbGViYXJzT3B0aW9ucyB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBJc0luaXRpYWxUYWJIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCB0YWJzOiBBcnJheTxhbnk+LCB0YWJJZDogU3RyaW5nLCBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRhYnNbMF0uaWQgPT09IHRhYklkID8gb3B0aW9ucy5mbihjb250ZXh0KSA6IG9wdGlvbnMuaW52ZXJzZShjb250ZXh0KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcblxuZXhwb3J0IGNsYXNzIElzVGFiRW5hYmxlZEhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIHRhYnM6IEFycmF5PGFueT4sIHRhYklkOiBTdHJpbmcsIG9wdGlvbnM6IElIYW5kbGViYXJzT3B0aW9ucykge1xuICAgICAgICBsZXQgaXNUYWJFbmFibGVkID0gLTEgIT09IF8uZmluZEluZGV4KHRhYnMsIHsgaWQ6IHRhYklkIH0pO1xuICAgICAgICByZXR1cm4gaXNUYWJFbmFibGVkID8gb3B0aW9ucy5mbihjb250ZXh0KSA6IG9wdGlvbnMuaW52ZXJzZShjb250ZXh0KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIElmU3RyaW5nSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgYTogYW55LCBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnMpOiBzdHJpbmcge1xuICAgICAgICBpZiAodHlwZW9mIGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbihjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKGNvbnRleHQpO1xuICAgIH1cbn0iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIE9yTGVuZ3RoSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgLyogYW55LCBhbnksIC4uLiwgb3B0aW9ucyAqLykge1xuICAgICAgICBsZXQgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG4gICAgICAgIGxldCBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnMgPSBhcmd1bWVudHNbbGVuXTtcblxuICAgICAgICAvLyBXZSBzdGFydCBhdCAxIGJlY2F1c2Ugb2Ygb3B0aW9uc1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1tpXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoYXJndW1lbnRzW2ldKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UoY29udGV4dCk7XG4gICAgfVxufSIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyLCBJSGFuZGxlYmFyc09wdGlvbnMgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgRmlsdGVyQW5ndWxhcjJNb2R1bGVzSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgdGV4dDogc3RyaW5nLCBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgTkcyX01PRFVMRVM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ0Jyb3dzZXJNb2R1bGUnLFxuICAgICAgICAgICAgJ0Zvcm1zTW9kdWxlJyxcbiAgICAgICAgICAgICdIdHRwTW9kdWxlJyxcbiAgICAgICAgICAgICdSb3V0ZXJNb2R1bGUnXG4gICAgICAgIF07XG4gICAgICAgIGxldCBsZW4gPSBORzJfTU9EVUxFUy5sZW5ndGg7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKHRleHQuaW5kZXhPZihORzJfTU9EVUxFU1tpXSkgPiAtMSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4oY29udGV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufSIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIERlYnVnSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgb3B0aW9uYWxWYWx1ZTogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdDdXJyZW50IENvbnRleHQnKTtcbiAgICAgICAgY29uc29sZS5sb2coJz09PT09PT09PT09PT09PT09PT09Jyk7XG4gICAgICAgIGNvbnNvbGUubG9nKGNvbnRleHQpO1xuXG4gICAgICAgIGlmIChvcHRpb25hbFZhbHVlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnT3B0aW9uYWxWYWx1ZScpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJz09PT09PT09PT09PT09PT09PT09Jyk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhvcHRpb25hbFZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5pbXBvcnQgKiBhcyBIYW5kbGViYXJzIGZyb20gJ2hhbmRsZWJhcnMnO1xuXG5leHBvcnQgY2xhc3MgQnJlYWtMaW5lc0hlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGJhcnMpIHtcblxuICAgIH1cblxuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHRleHQgPSB0aGlzLmJhcnMuVXRpbHMuZXNjYXBlRXhwcmVzc2lvbih0ZXh0KTtcbiAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvKFxcclxcbnxcXG58XFxyKS9nbSwgJzxicj4nKTtcbiAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvIC9nbSwgJyZuYnNwOycpO1xuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cdC9nbSwgJyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOycpO1xuICAgICAgICByZXR1cm4gbmV3IEhhbmRsZWJhcnMuU2FmZVN0cmluZyh0ZXh0KTtcbiAgICB9XG59IiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuaW1wb3J0ICogYXMgSGFuZGxlYmFycyBmcm9tICdoYW5kbGViYXJzJztcblxuZXhwb3J0IGNsYXNzIENsZWFuUGFyYWdyYXBoSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoLzxwPi9nbSwgJycpO1xuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC88XFwvcD4vZ20sICcnKTtcbiAgICAgICAgcmV0dXJuIG5ldyBIYW5kbGViYXJzLlNhZmVTdHJpbmcodGV4dCk7XG4gICAgfVxufSIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIEVzY2FwZVNpbXBsZVF1b3RlSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKTtcbiAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvKFxcclxcbnxcXG58XFxyKS9nbSwgJycpO1xuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG59IiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuaW1wb3J0ICogYXMgSGFuZGxlYmFycyBmcm9tICdoYW5kbGViYXJzJztcblxuZXhwb3J0IGNsYXNzIEJyZWFrQ29tbWFIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBiYXJzKSB7IH1cblxuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHRleHQgPSB0aGlzLmJhcnMuVXRpbHMuZXNjYXBlRXhwcmVzc2lvbih0ZXh0KTtcbiAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvLC9nLCAnLDxicj4nKTtcbiAgICAgICAgcmV0dXJuIG5ldyBIYW5kbGViYXJzLlNhZmVTdHJpbmcodGV4dCk7XG4gICAgfVxufSIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcbmltcG9ydCAqIGFzIEhhbmRsZWJhcnMgZnJvbSAnaGFuZGxlYmFycyc7XG5cbmltcG9ydCB7IHRzLCBTeW50YXhLaW5kIH0gZnJvbSAndHMtc2ltcGxlLWFzdCc7XG5cbmV4cG9ydCBjbGFzcyBNb2RpZktpbmRIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtIFN5bnRheEtpbmQgaW50byBzdHJpbmdcbiAgICAgKiBAcGFyYW0gIHthbnl9ICAgICAgICAgICBjb250ZXh0IEhhbmRsZWJhcnMgY29udGV4dFxuICAgICAqIEBwYXJhbSAge1N5bnRheEtpbmRbXX0ga2luZCAgU3ludGF4S2luZCBjb25jYXRlbmF0ZWRcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9ICAgICAgICAgICAgICAgIFBhcnNlZCBzdHJpbmdcbiAgICAgKi9cbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIGtpbmQ6IFN5bnRheEtpbmRbXSkge1xuICAgICAgICBsZXQgX2tpbmRUZXh0ID0gJyc7XG4gICAgICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkOlxuICAgICAgICAgICAgICAgIF9raW5kVGV4dCA9ICdQcml2YXRlJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5SZWFkb25seUtleXdvcmQ6XG4gICAgICAgICAgICAgICAgX2tpbmRUZXh0ID0gJ1JlYWRvbmx5JztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5Qcm90ZWN0ZWRLZXl3b3JkOlxuICAgICAgICAgICAgICAgIF9raW5kVGV4dCA9ICdQcm90ZWN0ZWQnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLlB1YmxpY0tleXdvcmQ6XG4gICAgICAgICAgICAgICAgX2tpbmRUZXh0ID0gJ1B1YmxpYyc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFN5bnRheEtpbmQuU3RhdGljS2V5d29yZDpcbiAgICAgICAgICAgICAgICBfa2luZFRleHQgPSAnU3RhdGljJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5Bc3luY0tleXdvcmQ6XG4gICAgICAgICAgICAgICAgX2tpbmRUZXh0ID0gJ0FzeW5jJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5BYnN0cmFjdEtleXdvcmQ6XG4gICAgICAgICAgICAgICAgX2tpbmRUZXh0ID0gJ0Fic3RyYWN0JztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEhhbmRsZWJhcnMuU2FmZVN0cmluZyhfa2luZFRleHQpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuaW1wb3J0IHsgdHMsIFN5bnRheEtpbmQgfSBmcm9tICd0cy1zaW1wbGUtYXN0JztcblxuZXhwb3J0IGNsYXNzIE1vZGlmSWNvbkhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIGtpbmQ6IFN5bnRheEtpbmQpOiBzdHJpbmcge1xuICAgICAgICBsZXQgX2tpbmRUZXh0ID0gJyc7XG4gICAgICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkOlxuICAgICAgICAgICAgICAgIF9raW5kVGV4dCA9ICdsb2NrJzsgLy8gcHJpdmF0ZVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLlByb3RlY3RlZEtleXdvcmQ6XG4gICAgICAgICAgICAgICAgX2tpbmRUZXh0ID0gJ2xvY2snOyAvLyBwcm90ZWN0ZWRcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5TdGF0aWNLZXl3b3JkOlxuICAgICAgICAgICAgICAgIF9raW5kVGV4dCA9ICdyZXNldCc7IC8vIHN0YXRpY1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLkV4cG9ydEtleXdvcmQ6XG4gICAgICAgICAgICAgICAgX2tpbmRUZXh0ID0gJ2V4cG9ydCc7IC8vIGV4cG9ydFxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBfa2luZFRleHQgPSAncmVzZXQnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfa2luZFRleHQ7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgUmVsYXRpdmVVUkxIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCBjdXJyZW50RGVwdGg6IG51bWJlciwgb3B0aW9ucyk6IHN0cmluZyB7XG4gICAgICAgIHN3aXRjaCAoY3VycmVudERlcHRoKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgcmV0dXJuICcuLyc7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgcmV0dXJuICcuLi8nLnJlcGVhdChjdXJyZW50RGVwdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbn0iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIEpzZG9jUmV0dXJuc0NvbW1lbnRIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCBqc2RvY1RhZ3M6IEFycmF5PGFueT4sIG9wdGlvbnM6IElIYW5kbGViYXJzT3B0aW9ucykge1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGxldCBsZW4gPSBqc2RvY1RhZ3MubGVuZ3RoO1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS50YWdOYW1lKSB7XG4gICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS50YWdOYW1lLnRleHQgPT09ICdyZXR1cm5zJyB8fCBqc2RvY1RhZ3NbaV0udGFnTmFtZS50ZXh0ID09PSAncmV0dXJuJykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBqc2RvY1RhZ3NbaV0uY29tbWVudDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufSIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyLCBJSGFuZGxlYmFyc09wdGlvbnMgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSnNkb2NUYWdJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2pzZG9jLXRhZy5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgSnNkb2NDb2RlRXhhbXBsZUhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcblxuICAgIHByaXZhdGUgY2xlYW5UYWcoY29tbWVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKGNvbW1lbnQuY2hhckF0KDApID09PSAnKicpIHtcbiAgICAgICAgICAgIGNvbW1lbnQgPSBjb21tZW50LnN1YnN0cmluZygxLCBjb21tZW50Lmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbW1lbnQuY2hhckF0KDApID09PSAnICcpIHtcbiAgICAgICAgICAgIGNvbW1lbnQgPSBjb21tZW50LnN1YnN0cmluZygxLCBjb21tZW50Lmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbW1lbnQuaW5kZXhPZignPHA+JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbW1lbnQgPSBjb21tZW50LnN1YnN0cmluZygzLCBjb21tZW50Lmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbW1lbnQuc3Vic3RyKC0xKSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgIGNvbW1lbnQgPSBjb21tZW50LnN1YnN0cmluZygwLCBjb21tZW50Lmxlbmd0aCAtIDEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb21tZW50LnN1YnN0cigtNCkgPT09ICc8L3A+Jykge1xuICAgICAgICAgICAgY29tbWVudCA9IGNvbW1lbnQuc3Vic3RyaW5nKDAsIGNvbW1lbnQubGVuZ3RoIC0gNCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbW1lbnQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRIdG1sRW50aXRpZXMoc3RyKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyhzdHIpLnJlcGxhY2UoLyYvZywgJyZhbXA7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKS5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7Jyk7XG4gICAgfVxuXG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCBqc2RvY1RhZ3M6IEpzZG9jVGFnSW50ZXJmYWNlW10sIG9wdGlvbnM6IElIYW5kbGViYXJzT3B0aW9ucykge1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGxldCBsZW4gPSBqc2RvY1RhZ3MubGVuZ3RoO1xuICAgICAgICBsZXQgdGFncyA9IFtdO1xuICAgICAgICBsZXQgdHlwZSA9ICdodG1sJztcblxuICAgICAgICBpZiAob3B0aW9ucy5oYXNoLnR5cGUpIHtcbiAgICAgICAgICAgIHR5cGUgPSBvcHRpb25zLmhhc2gudHlwZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLnRhZ05hbWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLnRhZ05hbWUudGV4dCA9PT0gJ2V4YW1wbGUnKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0YWcgPSB7fSBhcyBKc2RvY1RhZ0ludGVyZmFjZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLmNvbW1lbnQuaW5kZXhPZignPGNhcHRpb24+JykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLmNvbW1lbnQgPSBqc2RvY1RhZ3NbaV0uY29tbWVudC5yZXBsYWNlKC88Y2FwdGlvbj4vZywgJzxiPjxpPicpLnJlcGxhY2UoL1xcL2NhcHRpb24+L2csICcvYj48L2k+Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5jb21tZW50ID0gYDxwcmUgY2xhc3M9XCJsaW5lLW51bWJlcnNcIj48Y29kZSBjbGFzcz1cImxhbmd1YWdlLSR7dHlwZX1cIj5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRIdG1sRW50aXRpZXModGhpcy5jbGVhblRhZyhqc2RvY1RhZ3NbaV0uY29tbWVudCkpICsgYDwvY29kZT48L3ByZT5gO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGFncy5wdXNoKHRhZyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb250ZXh0LnRhZ3MgPSB0YWdzO1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4oY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59IiwiaW1wb3J0IHsgSnNkb2NUYWdJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2pzZG9jLXRhZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIsIElIYW5kbGViYXJzT3B0aW9ucyB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBKc2RvY0V4YW1wbGVIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCBqc2RvY1RhZ3M6IEpzZG9jVGFnSW50ZXJmYWNlW10sIG9wdGlvbnM6IElIYW5kbGViYXJzT3B0aW9ucykge1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGxldCBsZW4gPSBqc2RvY1RhZ3MubGVuZ3RoO1xuICAgICAgICBsZXQgdGFncyA9IFtdO1xuXG4gICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLnRhZ05hbWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLnRhZ05hbWUudGV4dCA9PT0gJ2V4YW1wbGUnKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0YWcgPSB7fSBhcyBKc2RvY1RhZ0ludGVyZmFjZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWcuY29tbWVudCA9IGpzZG9jVGFnc1tpXS5jb21tZW50LnJlcGxhY2UoLzxjYXB0aW9uPi9nLCAnPGI+PGk+JykucmVwbGFjZSgvXFwvY2FwdGlvbj4vZywgJy9iPjwvaT4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0YWdzLnB1c2godGFnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29udGV4dC50YWdzID0gdGFncztcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufSIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyLCBJSGFuZGxlYmFyc09wdGlvbnMgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSnNkb2NUYWdJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2pzZG9jLXRhZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsga2luZFRvVHlwZSB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2tpbmQtdG8tdHlwZSc7XG5cbmV4cG9ydCBjbGFzcyBKc2RvY1BhcmFtc0hlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhcbiAgICAgICAgY29udGV4dDogYW55LFxuICAgICAgICBqc2RvY1RhZ3M6IEFycmF5PEpzZG9jVGFnSW50ZXJmYWNlIHwgYW55PixcbiAgICAgICAgb3B0aW9uczogSUhhbmRsZWJhcnNPcHRpb25zXG4gICAgKSB7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgbGV0IGxlbiA9IGpzZG9jVGFncy5sZW5ndGg7XG4gICAgICAgIGxldCB0YWdzID0gW107XG5cbiAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChqc2RvY1RhZ3NbaV0udGFnTmFtZSkge1xuICAgICAgICAgICAgICAgIGlmIChqc2RvY1RhZ3NbaV0udGFnTmFtZS50ZXh0ID09PSAncGFyYW0nKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0YWcgPSB7fSBhcyBKc2RvY1RhZ0ludGVyZmFjZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS50eXBlRXhwcmVzc2lvbiAmJiBqc2RvY1RhZ3NbaV0udHlwZUV4cHJlc3Npb24udHlwZS5raW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWcudHlwZSA9IGtpbmRUb1R5cGUoanNkb2NUYWdzW2ldLnR5cGVFeHByZXNzaW9uLnR5cGUua2luZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS50eXBlRXhwcmVzc2lvbiAmJiBqc2RvY1RhZ3NbaV0udHlwZUV4cHJlc3Npb24udHlwZS5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWcudHlwZSA9IGpzZG9jVGFnc1tpXS50eXBlRXhwcmVzc2lvbi50eXBlLm5hbWUudGV4dDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhZy50eXBlID0ganNkb2NUYWdzW2ldLnR5cGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWcuY29tbWVudCA9IGpzZG9jVGFnc1tpXS5jb21tZW50O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc2RvY1RhZ3NbaV0uZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWcuZGVmYXVsdFZhbHVlID0ganNkb2NUYWdzW2ldLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqc2RvY1RhZ3NbaV0ubmFtZS50ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLm5hbWUgPSBqc2RvY1RhZ3NbaV0ubmFtZS50ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcubmFtZSA9IGpzZG9jVGFnc1tpXS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc2RvY1RhZ3NbaV0ub3B0aW9uYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICh0YWcgYXMgYW55KS5vcHRpb25hbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGFncy5wdXNoKHRhZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0YWdzLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICBjb250ZXh0LnRhZ3MgPSB0YWdzO1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4oY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcbmltcG9ydCB7IEpzZG9jVGFnSW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9qc2RvYy10YWcuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIEpzZG9jUGFyYW1zVmFsaWRIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCBqc2RvY1RhZ3M6IEpzZG9jVGFnSW50ZXJmYWNlW10sIG9wdGlvbnM6IElIYW5kbGViYXJzT3B0aW9ucykge1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGxldCBsZW4gPSBqc2RvY1RhZ3MubGVuZ3RoO1xuICAgICAgICBsZXQgdGFncyA9IFtdO1xuICAgICAgICBsZXQgdmFsaWQgPSBmYWxzZTtcblxuICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS50YWdOYW1lKSB7XG4gICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS50YWdOYW1lLnRleHQgPT09ICdwYXJhbScpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZShjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcbmltcG9ydCB7IEpzZG9jVGFnSW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9qc2RvYy10YWcuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIEpzZG9jRGVmYXVsdEhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIGpzZG9jVGFnczogSnNkb2NUYWdJbnRlcmZhY2VbXSwgb3B0aW9uczogSUhhbmRsZWJhcnNPcHRpb25zKSB7XG4gICAgICAgIGlmIChqc2RvY1RhZ3MpIHtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGxldCBsZW4gPSBqc2RvY1RhZ3MubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IHRhZyA9IHt9IGFzIEpzZG9jVGFnSW50ZXJmYWNlO1xuICAgICAgICAgICAgbGV0IGRlZmF1bHRWYWx1ZSA9IGZhbHNlO1xuXG4gICAgICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChqc2RvY1RhZ3NbaV0udGFnTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLnRhZ05hbWUudGV4dCA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS50eXBlRXhwcmVzc2lvbiAmJiBqc2RvY1RhZ3NbaV0udHlwZUV4cHJlc3Npb24udHlwZS5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLnR5cGUgPSBqc2RvY1RhZ3NbaV0udHlwZUV4cHJlc3Npb24udHlwZS5uYW1lLnRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLmNvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcuY29tbWVudCA9IGpzZG9jVGFnc1tpXS5jb21tZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLm5hbWUgPSBqc2RvY1RhZ3NbaV0ubmFtZS50ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGNvbnRleHQudGFnID0gdGFnO1xuICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyLCBJSGFuZGxlYmFyc09wdGlvbnMgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRGVwZW5kZW5jaWVzRW5naW5lIH0gZnJvbSAnLi4vZGVwZW5kZW5jaWVzLmVuZ2luZSc7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uSW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9jb25maWd1cmF0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBBbmd1bGFyVmVyc2lvblV0aWwsIEJhc2ljVHlwZVV0aWwgfSBmcm9tICcuLi8uLi8uLi91dGlscyc7XG5cbmV4cG9ydCBjbGFzcyBMaW5rVHlwZUhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwcml2YXRlIGFuZ3VsYXJWZXJzaW9uVXRpbCA9IG5ldyBBbmd1bGFyVmVyc2lvblV0aWwoKTtcbiAgICBwcml2YXRlIGJhc2ljVHlwZVV0aWwgPSBuZXcgQmFzaWNUeXBlVXRpbCgpO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgY29uZmlndXJhdGlvbjogQ29uZmlndXJhdGlvbkludGVyZmFjZSxcbiAgICAgICAgcHJpdmF0ZSBkZXBlbmRlbmNpZXNFbmdpbmU6IERlcGVuZGVuY2llc0VuZ2luZSkge1xuXG4gICAgfVxuXG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCBuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IElIYW5kbGViYXJzT3B0aW9ucykge1xuICAgICAgICBsZXQgX3Jlc3VsdCA9IHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLmZpbmQobmFtZSk7XG4gICAgICAgIGxldCBhbmd1bGFyRG9jUHJlZml4ID0gdGhpcy5hbmd1bGFyVmVyc2lvblV0aWwucHJlZml4T2ZmaWNpYWxEb2ModGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmFuZ3VsYXJWZXJzaW9uKTtcbiAgICAgICAgaWYgKF9yZXN1bHQpIHtcbiAgICAgICAgICAgIGNvbnRleHQudHlwZSA9IHtcbiAgICAgICAgICAgICAgICByYXc6IG5hbWVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoX3Jlc3VsdC5zb3VyY2UgPT09ICdpbnRlcm5hbCcpIHtcbiAgICAgICAgICAgICAgICBpZiAoX3Jlc3VsdC5kYXRhLnR5cGUgPT09ICdjbGFzcycpIHtcbiAgICAgICAgICAgICAgICAgICAgX3Jlc3VsdC5kYXRhLnR5cGUgPSAnY2xhc3NlJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGV4dC50eXBlLmhyZWYgPSAnLi4vJyArIF9yZXN1bHQuZGF0YS50eXBlICsgJ3MvJyArIF9yZXN1bHQuZGF0YS5uYW1lICsgJy5odG1sJztcbiAgICAgICAgICAgICAgICBpZiAoX3Jlc3VsdC5kYXRhLnR5cGUgPT09ICdtaXNjZWxsYW5lb3VzJyB8fCAoX3Jlc3VsdC5kYXRhLmN0eXBlICYmIF9yZXN1bHQuZGF0YS5jdHlwZSA9PT0gJ21pc2NlbGxhbmVvdXMnKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWFpbnBhZ2UgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfcmVzdWx0LmRhdGEuc3VidHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW51bSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbnBhZ2UgPSAnZW51bWVyYXRpb25zJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWlucGFnZSA9ICdmdW5jdGlvbnMnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndHlwZWFsaWFzJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWlucGFnZSA9ICd0eXBlYWxpYXNlcyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd2YXJpYWJsZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbnBhZ2UgPSAndmFyaWFibGVzJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnR5cGUuaHJlZiA9ICcuLi8nICsgX3Jlc3VsdC5kYXRhLmN0eXBlICsgJy8nICsgbWFpbnBhZ2UgKyAnLmh0bWwjJyArIF9yZXN1bHQuZGF0YS5uYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250ZXh0LnR5cGUudGFyZ2V0ID0gJ19zZWxmJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC50eXBlLmhyZWYgPSBgaHR0cHM6Ly8ke2FuZ3VsYXJEb2NQcmVmaXh9YW5ndWxhci5pby8ke19yZXN1bHQuZGF0YS5wYXRofWA7XG4gICAgICAgICAgICAgICAgY29udGV4dC50eXBlLnRhcmdldCA9ICdfYmxhbmsnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbihjb250ZXh0KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmJhc2ljVHlwZVV0aWwuaXNLbm93blR5cGUobmFtZSkpIHtcbiAgICAgICAgICAgIGNvbnRleHQudHlwZSA9IHtcbiAgICAgICAgICAgICAgICByYXc6IG5hbWVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb250ZXh0LnR5cGUudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICAgICAgICBjb250ZXh0LnR5cGUuaHJlZiA9IHRoaXMuYmFzaWNUeXBlVXRpbC5nZXRUeXBlVXJsKG5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4oY29udGV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgSW5kZXhhYmxlU2lnbmF0dXJlSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgbWV0aG9kKSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBtZXRob2QuYXJncy5tYXAoYXJnID0+IGAke2FyZy5uYW1lfTogJHthcmcudHlwZX1gKS5qb2luKCcsICcpO1xuICAgICAgICBpZiAobWV0aG9kLm5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHttZXRob2QubmFtZX1bJHthcmdzfV1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHthcmdzfV1gO1xuICAgICAgICB9XG4gICAgfVxufSIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcbmltcG9ydCAqIGFzIEhhbmRsZWJhcnMgZnJvbSAnaGFuZGxlYmFycyc7XG5cbmV4cG9ydCBjbGFzcyBPYmplY3RIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCB0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgdGV4dCA9IEpTT04uc3RyaW5naWZ5KHRleHQpO1xuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC97XCIvLCAnezxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtcIicpO1xuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC8sXCIvLCAnLDxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtcIicpO1xuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC99JC8sICc8YnI+fScpO1xuICAgICAgICByZXR1cm4gbmV3IEhhbmRsZWJhcnMuU2FmZVN0cmluZyh0ZXh0KTtcbiAgICB9XG59IiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIsIElIYW5kbGViYXJzT3B0aW9ucyB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBPYmplY3RMZW5ndGhIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCBvYmo6IE9iamVjdCwgb3BlcmF0b3I6IHN0cmluZywgbGVuZ3RoOiBudW1iZXIpIHtcbiAgICAgICAgbGV0IGxlbiA9IGFyZ3VtZW50cy5sZW5ndGggLSAxO1xuICAgICAgICBsZXQgb3B0aW9uczogSUhhbmRsZWJhcnNPcHRpb25zID0gYXJndW1lbnRzW2xlbl07XG5cbiAgICAgICAgaWYoIHR5cGVvZiBvYmogIT09ICdvYmplY3QnICkge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZShjb250ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzaXplID0gMCxcbiAgICAgICAgICAgIGtleTtcbiAgICAgICAgZm9yIChrZXkgaW4gb2JqKSB7XG4gICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBzaXplKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICAgICAgICBjYXNlICc9PT0nOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNpemUgPT09IGxlbmd0aDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJyE9PSc6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gc2l6ZSAhPT0gbGVuZ3RoO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnPic6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gc2l6ZSA+IGxlbmd0aDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2hlbHBlciB7e29iamVjdExlbmd0aH19OiBpbnZhbGlkIG9wZXJhdG9yOiBgJyArIG9wZXJhdG9yICsgJ2AnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpO1xuICAgIH1cbn0iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5pbXBvcnQgeyBleHRyYWN0TGVhZGluZ1RleHQsIHNwbGl0TGlua1RleHQgfSBmcm9tICcuLi8uLi8uLi91dGlscy9saW5rLXBhcnNlcic7XG5pbXBvcnQgeyBEZXBlbmRlbmNpZXNFbmdpbmUgfSBmcm9tICcuLi9kZXBlbmRlbmNpZXMuZW5naW5lJztcblxuZXhwb3J0IGNsYXNzIFBhcnNlRGVzY3JpcHRpb25IZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBkZXBlbmRlbmNpZXNFbmdpbmU6IERlcGVuZGVuY2llc0VuZ2luZSkge31cblxuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgZGVzY3JpcHRpb246IHN0cmluZywgZGVwdGg6IG51bWJlcikge1xuICAgICAgICBsZXQgdGFnUmVnRXhwTGlnaHQgPSBuZXcgUmVnRXhwKCdcXFxce0BsaW5rXFxcXHMrKCg/Oi58XFxuKSs/KVxcXFx9JywgJ2knKTtcbiAgICAgICAgbGV0IHRhZ1JlZ0V4cEZ1bGwgPSBuZXcgUmVnRXhwKCdcXFxce0BsaW5rXFxcXHMrKCg/Oi58XFxuKSs/KVxcXFx9JywgJ2knKTtcbiAgICAgICAgbGV0IHRhZ1JlZ0V4cDtcbiAgICAgICAgbGV0IG1hdGNoZXM7XG4gICAgICAgIGxldCBwcmV2aW91c1N0cmluZztcbiAgICAgICAgbGV0IHRhZ0luZm8gPSBbXTtcblxuICAgICAgICB0YWdSZWdFeHAgPSBkZXNjcmlwdGlvbi5pbmRleE9mKCddeycpICE9PSAtMSA/IHRhZ1JlZ0V4cEZ1bGwgOiB0YWdSZWdFeHBMaWdodDtcblxuICAgICAgICBjb25zdCBwcm9jZXNzVGhlTGluayA9IChvcmlnaW5hbERlc2NyaXB0aW9uLCBtYXRjaGVkVGFnLCBsZWFkaW5nVGV4dCkgPT4ge1xuICAgICAgICAgICAgbGV0IGxlYWRpbmcgPSBleHRyYWN0TGVhZGluZ1RleHQob3JpZ2luYWxEZXNjcmlwdGlvbiwgbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZyk7XG4gICAgICAgICAgICBsZXQgc3BsaXQ7XG4gICAgICAgICAgICBsZXQgcmVzdWx0SW5Db21wb2RvYztcbiAgICAgICAgICAgIGxldCBuZXdMaW5rO1xuICAgICAgICAgICAgbGV0IHJvb3RQYXRoO1xuICAgICAgICAgICAgbGV0IHN0cmluZ3RvUmVwbGFjZTtcbiAgICAgICAgICAgIGxldCBhbmNob3IgPSAnJztcbiAgICAgICAgICAgIGxldCBsYWJlbDtcbiAgICAgICAgICAgIGxldCBwYWdlTmFtZTtcblxuICAgICAgICAgICAgc3BsaXQgPSBzcGxpdExpbmtUZXh0KG1hdGNoZWRUYWcudGV4dCk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc3BsaXQubGlua1RleHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0SW5Db21wb2RvYyA9IHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLmZpbmRJbkNvbXBvZG9jKHNwbGl0LnRhcmdldCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBpbmZvID0gbWF0Y2hlZFRhZy50ZXh0O1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVkVGFnLnRleHQuaW5kZXhPZignIycpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBhbmNob3IgPSBtYXRjaGVkVGFnLnRleHQuc3Vic3RyKG1hdGNoZWRUYWcudGV4dC5pbmRleE9mKCcjJyksIG1hdGNoZWRUYWcudGV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBpbmZvID0gbWF0Y2hlZFRhZy50ZXh0LnN1YnN0cigwLCBtYXRjaGVkVGFnLnRleHQuaW5kZXhPZignIycpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0SW5Db21wb2RvYyA9IHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLmZpbmRJbkNvbXBvZG9jKGluZm8pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocmVzdWx0SW5Db21wb2RvYykge1xuICAgICAgICAgICAgICAgIGxhYmVsID0gcmVzdWx0SW5Db21wb2RvYy5uYW1lO1xuICAgICAgICAgICAgICAgIHBhZ2VOYW1lID0gcmVzdWx0SW5Db21wb2RvYy5uYW1lO1xuXG4gICAgICAgICAgICAgICAgaWYgKGxlYWRpbmdUZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZ3RvUmVwbGFjZSA9ICdbJyArIGxlYWRpbmdUZXh0ICsgJ10nICsgbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxlYWRpbmcubGVhZGluZ1RleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBzdHJpbmd0b1JlcGxhY2UgPSAnWycgKyBsZWFkaW5nLmxlYWRpbmdUZXh0ICsgJ10nICsgbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzcGxpdC5saW5rVGV4dCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5ndG9SZXBsYWNlID0gbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdHJpbmd0b1JlcGxhY2UgPSBtYXRjaGVkVGFnLmNvbXBsZXRlVGFnO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHRJbkNvbXBvZG9jLnR5cGUgPT09ICdjbGFzcycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0SW5Db21wb2RvYy50eXBlID0gJ2NsYXNzZSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0SW5Db21wb2RvYy50eXBlID09PSAnbWlzY2VsbGFuZW91cycgfHxcbiAgICAgICAgICAgICAgICAgICAgKHJlc3VsdEluQ29tcG9kb2MuY3R5cGUgJiYgcmVzdWx0SW5Db21wb2RvYy5jdHlwZSA9PT0gJ21pc2NlbGxhbmVvdXMnKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRJbkNvbXBvZG9jLnR5cGUgPSAnbWlzY2VsbGFuZW91JztcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSByZXN1bHRJbkNvbXBvZG9jLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGFuY2hvciA9ICcjJyArIHJlc3VsdEluQ29tcG9kb2MubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdEluQ29tcG9kb2Muc3VidHlwZSA9PT0gJ2VudW0nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlTmFtZSA9ICdlbnVtZXJhdGlvbnMnO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdEluQ29tcG9kb2Muc3VidHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU5hbWUgPSAnZnVuY3Rpb25zJztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHRJbkNvbXBvZG9jLnN1YnR5cGUgPT09ICd0eXBlYWxpYXMnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlTmFtZSA9ICd0eXBlYWxpYXNlcyc7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0SW5Db21wb2RvYy5zdWJ0eXBlID09PSAndmFyaWFibGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlTmFtZSA9ICd2YXJpYWJsZXMnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcm9vdFBhdGggPSAnJztcblxuICAgICAgICAgICAgICAgIHN3aXRjaCAoZGVwdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgcm9vdFBhdGggPSAnLi8nO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgcm9vdFBhdGggPSAnLi4vJy5yZXBlYXQoZGVwdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGxlYWRpbmcubGVhZGluZ1RleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGxlYWRpbmcubGVhZGluZ1RleHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc3BsaXQubGlua1RleHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsID0gc3BsaXQubGlua1RleHQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbmV3TGluayA9IGA8YSBocmVmPVwiJHtyb290UGF0aH0ke1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRJbkNvbXBvZG9jLnR5cGVcbiAgICAgICAgICAgICAgICB9cy8ke3BhZ2VOYW1lfS5odG1sJHthbmNob3J9XCI+JHtsYWJlbH08L2E+YDtcblxuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbERlc2NyaXB0aW9uLnJlcGxhY2Uoc3RyaW5ndG9SZXBsYWNlLCBuZXdMaW5rKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXJlc3VsdEluQ29tcG9kb2MgJiYgdHlwZW9mIHNwbGl0LmxpbmtUZXh0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIG5ld0xpbmsgPSBgPGEgaHJlZj1cIiR7c3BsaXQudGFyZ2V0fVwiPiR7c3BsaXQubGlua1RleHR9PC9hPmA7XG4gICAgICAgICAgICAgICAgaWYgKGxlYWRpbmdUZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZ3RvUmVwbGFjZSA9ICdbJyArIGxlYWRpbmdUZXh0ICsgJ10nICsgbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxlYWRpbmcubGVhZGluZ1RleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBzdHJpbmd0b1JlcGxhY2UgPSAnWycgKyBsZWFkaW5nLmxlYWRpbmdUZXh0ICsgJ10nICsgbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzcGxpdC5saW5rVGV4dCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5ndG9SZXBsYWNlID0gbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdHJpbmd0b1JlcGxhY2UgPSBtYXRjaGVkVGFnLmNvbXBsZXRlVGFnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxEZXNjcmlwdGlvbi5yZXBsYWNlKHN0cmluZ3RvUmVwbGFjZSwgbmV3TGluayk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFyZXN1bHRJbkNvbXBvZG9jICYmIGxlYWRpbmcgJiYgdHlwZW9mIGxlYWRpbmcubGVhZGluZ1RleHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgbmV3TGluayA9IGA8YSBocmVmPVwiJHtzcGxpdC50YXJnZXR9XCI+JHtsZWFkaW5nLmxlYWRpbmdUZXh0fTwvYT5gO1xuICAgICAgICAgICAgICAgIGlmIChsZWFkaW5nVGV4dCkge1xuICAgICAgICAgICAgICAgICAgICBzdHJpbmd0b1JlcGxhY2UgPSAnWycgKyBsZWFkaW5nVGV4dCArICddJyArIG1hdGNoZWRUYWcuY29tcGxldGVUYWc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsZWFkaW5nLmxlYWRpbmdUZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5ndG9SZXBsYWNlID0gJ1snICsgbGVhZGluZy5sZWFkaW5nVGV4dCArICddJyArIG1hdGNoZWRUYWcuY29tcGxldGVUYWc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc3BsaXQubGlua1RleHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZ3RvUmVwbGFjZSA9IG1hdGNoZWRUYWcuY29tcGxldGVUYWc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5ndG9SZXBsYWNlID0gbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsRGVzY3JpcHRpb24ucmVwbGFjZShzdHJpbmd0b1JlcGxhY2UsIG5ld0xpbmspO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghcmVzdWx0SW5Db21wb2RvYyAmJiB0eXBlb2Ygc3BsaXQubGlua1RleHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgbmV3TGluayA9IGA8YSBocmVmPVwiJHtzcGxpdC50YXJnZXR9XCI+JHtzcGxpdC50YXJnZXR9PC9hPmA7XG4gICAgICAgICAgICAgICAgaWYgKGxlYWRpbmdUZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZ3RvUmVwbGFjZSA9ICdbJyArIGxlYWRpbmdUZXh0ICsgJ10nICsgbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxlYWRpbmcubGVhZGluZ1RleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBzdHJpbmd0b1JlcGxhY2UgPSAnWycgKyBsZWFkaW5nLmxlYWRpbmdUZXh0ICsgJ10nICsgbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdHJpbmd0b1JlcGxhY2UgPSBtYXRjaGVkVGFnLmNvbXBsZXRlVGFnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxEZXNjcmlwdGlvbi5yZXBsYWNlKHN0cmluZ3RvUmVwbGFjZSwgbmV3TGluayk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbERlc2NyaXB0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGZ1bmN0aW9uIHJlcGxhY2VNYXRjaChyZXBsYWNlciwgdGFnLCBtYXRjaCwgdGV4dCwgbGlua1RleHQ/KSB7XG4gICAgICAgICAgICBsZXQgbWF0Y2hlZFRhZyA9IHtcbiAgICAgICAgICAgICAgICBjb21wbGV0ZVRhZzogbWF0Y2gsXG4gICAgICAgICAgICAgICAgdGFnOiB0YWcsXG4gICAgICAgICAgICAgICAgdGV4dDogdGV4dFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRhZ0luZm8ucHVzaChtYXRjaGVkVGFnKTtcblxuICAgICAgICAgICAgaWYgKGxpbmtUZXh0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VyKGRlc2NyaXB0aW9uLCBtYXRjaGVkVGFnLCBsaW5rVGV4dCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXBsYWNlcihkZXNjcmlwdGlvbiwgbWF0Y2hlZFRhZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhbiBkZXNjcmlwdGlvbiBmb3IgbWFya2VkIGEgdGFnIHBhcnNlZCB0b28gZWFybHlcblxuICAgICAgICBpZiAoZGVzY3JpcHRpb24uaW5kZXhPZignaHJlZj0nKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIGxldCBpbnNpZGVNYXJrZWRBVGFnUmVzdWx0cyA9IGRlc2NyaXB0aW9uLm1hdGNoKC88YSBbXj5dKz4oW148XSspPFxcL2E+L2cpO1xuXG4gICAgICAgICAgICBpZiAoaW5zaWRlTWFya2VkQVRhZ1Jlc3VsdHMgJiYgaW5zaWRlTWFya2VkQVRhZ1Jlc3VsdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5zaWRlTWFya2VkQVRhZ1Jlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1hcmtlZEFUYWdSZWdFeHAgPSBuZXcgUmVnRXhwKCc8YSBbXj5dKz4oW148XSspPC9hPicsICdnbScpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGFyc2VkQVRhZyA9IG1hcmtlZEFUYWdSZWdFeHAuZXhlYyhkZXNjcmlwdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZWRBVGFnICYmIHBhcnNlZEFUYWcubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5zaWRlTWFya2VkQVRhZyA9IHBhcnNlZEFUYWdbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYHtAbGluayA8YSBocmVmPVwiJHtlbmNvZGVVUkkoaW5zaWRlTWFya2VkQVRhZyl9XCI+JHtpbnNpZGVNYXJrZWRBVGFnfTwvYT5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGB7QGxpbmsgJHtpbnNpZGVNYXJrZWRBVGFnfWBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBkbyB7XG4gICAgICAgICAgICBtYXRjaGVzID0gdGFnUmVnRXhwLmV4ZWMoZGVzY3JpcHRpb24pO1xuXG4gICAgICAgICAgICAvLyBEaWQgd2UgaGF2ZSB7QGxpbmsgP1xuICAgICAgICAgICAgaWYgKG1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgICBwcmV2aW91c1N0cmluZyA9IGRlc2NyaXB0aW9uO1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiA9IHJlcGxhY2VNYXRjaChwcm9jZXNzVGhlTGluaywgJ2xpbmsnLCBtYXRjaGVzWzBdLCBtYXRjaGVzWzFdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gcmVwbGFjZU1hdGNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1RoZUxpbmssXG4gICAgICAgICAgICAgICAgICAgICAgICAnbGluaycsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzWzBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlc1syXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXNbMV1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKG1hdGNoZXMgJiYgcHJldmlvdXNTdHJpbmcgIT09IGRlc2NyaXB0aW9uKTtcblxuICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIsIElIYW5kbGViYXJzT3B0aW9ucyB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBPbmVQYXJhbWV0ZXJIYXNIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCB0YWdzLCB0eXBlVG9DaGVjayk6IHN0cmluZyB7XG4gICAgICAgIGxldCByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGxlbiA9IGFyZ3VtZW50cy5sZW5ndGggLSAxO1xuICAgICAgICBsZXQgb3B0aW9uczogSUhhbmRsZWJhcnNPcHRpb25zID0gYXJndW1lbnRzW2xlbl07XG5cbiAgICAgICAgbGV0IGkgPSAwLFxuICAgICAgICAgICAgbGVuZyA9IHRhZ3MubGVuZ3RoO1xuXG4gICAgICAgIGZvcihpOyBpPGxlbmc7IGkrKykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0YWdzW2ldW3R5cGVUb0NoZWNrXSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGFnc1tpXVt0eXBlVG9DaGVja10gIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZShjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcbmltcG9ydCB7IGV4dHJhY3RMZWFkaW5nVGV4dCwgc3BsaXRMaW5rVGV4dCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2xpbmstcGFyc2VyJztcbmltcG9ydCB7IERlcGVuZGVuY2llc0VuZ2luZSB9IGZyb20gJy4uL2RlcGVuZGVuY2llcy5lbmdpbmUnO1xuXG5leHBvcnQgY2xhc3MgRWxlbWVudEFsb25lSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZGVwZW5kZW5jaWVzRW5naW5lOiBEZXBlbmRlbmNpZXNFbmdpbmUpIHt9XG5cbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIGVsZW1lbnRzLCBlbGVtZW50VHlwZTogc3RyaW5nLCBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnMpIHtcbiAgICAgICAgbGV0IGFsb25lcyA9IFtdO1xuICAgICAgICBsZXQgbW9kdWxlcyA9IHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLm1vZHVsZXM7XG5cbiAgICAgICAgZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIGxldCBmb3VuZEluT25lTW9kdWxlID0gZmFsc2U7XG4gICAgICAgICAgICBtb2R1bGVzLmZvckVhY2gobW9kdWxlID0+IHtcbiAgICAgICAgICAgICAgICBtb2R1bGUuZGVjbGFyYXRpb25zLmZvckVhY2goZGVjbGFyYXRpb24gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24uaWQgPT09IGVsZW1lbnQuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kSW5PbmVNb2R1bGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbi5maWxlID09PSBlbGVtZW50LmZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kSW5PbmVNb2R1bGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbW9kdWxlLmNvbnRyb2xsZXJzLmZvckVhY2goY29udHJvbGxlciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb250cm9sbGVyLmlkID09PSBlbGVtZW50LmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEluT25lTW9kdWxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoY29udHJvbGxlci5maWxlID09PSBlbGVtZW50LmZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kSW5PbmVNb2R1bGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbW9kdWxlLnByb3ZpZGVycy5mb3JFYWNoKHByb3ZpZGVyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyLmlkID09PSBlbGVtZW50LmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEluT25lTW9kdWxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXIuZmlsZSA9PT0gZWxlbWVudC5maWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEluT25lTW9kdWxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIWZvdW5kSW5PbmVNb2R1bGUpIHtcbiAgICAgICAgICAgICAgICBhbG9uZXMucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGFsb25lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGVsZW1lbnRUeXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnY29tcG9uZW50JzpcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5jb21wb25lbnRzID0gYWxvbmVzO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdkaXJlY3RpdmUnOlxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmRpcmVjdGl2ZXMgPSBhbG9uZXM7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NvbnRyb2xsZXInOlxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmNvbnRyb2xsZXJzID0gYWxvbmVzO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdpbmplY3RhYmxlJzpcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5pbmplY3RhYmxlcyA9IGFsb25lcztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAncGlwZSc6XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQucGlwZXMgPSBhbG9uZXM7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4oY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIEhhc093bkhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIGVudGl0eSwga2V5OiBhbnksIG9wdGlvbnM6IElIYW5kbGViYXJzT3B0aW9ucyk6IHN0cmluZyB7XG4gICAgICAgIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlbnRpdHksIGtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZShjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBTaG9ydFVSTEhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIHVybDogc3RyaW5nLCBvcHRpb25zKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IG5ld1VybCA9IHVybDtcbiAgICAgICAgbGV0IGZpcnN0SW5kZXhPZlNsYXNoID0gbmV3VXJsLmluZGV4T2YoJy8nKTtcbiAgICAgICAgbGV0IGxhc3RJbmRleE9mU2xhc2ggPSBuZXdVcmwubGFzdEluZGV4T2YoJy8nKTtcbiAgICAgICAgaWYgKGZpcnN0SW5kZXhPZlNsYXNoICE9PSAtMSB8fCBsYXN0SW5kZXhPZlNsYXNoICE9PSAtMSkge1xuICAgICAgICAgICAgbmV3VXJsID0gbmV3VXJsLnN1YnN0cigwLCBmaXJzdEluZGV4T2ZTbGFzaCArIDEpICsgJy4uLicgKyBuZXdVcmwuc3Vic3RyKGxhc3RJbmRleE9mU2xhc2gsIG5ld1VybC5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdVcmw7XG4gICAgfVxufSIsImV4cG9ydCBjb25zdCBUUkFOU0xBVElPTl9FTl9VUyA9IHtcbiAgICBhY2Nlc3NvcnM6ICdBY2Nlc3NvcnMnLFxuICAgIGFyZ3VtZW50czogJ0FyZ3VtZW50cycsXG4gICAgYm9vdHN0cmFwOiAnQm9vdHN0cmFwJyxcbiAgICBicmFuY2hlczogJ0JyYW5jaGVzJyxcbiAgICBicm93c2U6ICdCcm93c2UnLFxuICAgIGNsYXNzZTogJ0NsYXNzJyxcbiAgICBjbGFzc2VzOiAnQ2xhc3NlcycsXG4gICAgY29tcG9uZW50OiAnQ29tcG9uZW50JyxcbiAgICBjb21wb25lbnRzOiAnQ29tcG9uZW50cycsXG4gICAgY29uc3RydWN0b3I6ICdDb25zdHJ1Y3RvcicsXG4gICAgY29udHJvbGxlcnM6ICdDb250cm9sbGVycycsXG4gICAgY29udHJvbGxlcjogJ0NvbnRyb2xsZXInLFxuICAgICdjb3ZlcmFnZS1wYWdlLXRpdGxlJzogJ0RvY3VtZW50YXRpb24gY292ZXJhZ2UnLFxuICAgIGRlY2xhcmF0aW9uczogJ0RlY2xhcmF0aW9ucycsXG4gICAgZGVjb3JhdG9yczogJ0RlY29yYXRvcnMnLFxuICAgICdkZWZhdWx0LXZhbHVlJzogJ0RlZmF1bHQgdmFsdWUnLFxuICAgICdkZWZpbmVkLWluJzogJ0RlZmluZWQgaW4nLFxuICAgIGRlcGVuZGVuY2llczogJ0RlcGVuZGVuY2llcycsXG4gICAgZGVzY3JpcHRpb246ICdEZXNjcmlwdGlvbicsXG4gICAgZGlyZWN0aXZlOiAnRGlyZWN0aXZlJyxcbiAgICBkaXJlY3RpdmVzOiAnRGlyZWN0aXZlcycsXG4gICAgZW50cnljb21wb25lbnRzOiAnRW50cnlDb21wb25lbnRzJyxcbiAgICBlbnVtZXJhdGlvbnM6ICdFbnVtZXJhdGlvbnMnLFxuICAgIGVudW1zOiAnRW51bXMnLFxuICAgIGV4YW1wbGU6ICdFeGFtcGxlJyxcbiAgICBleHBvcnRzOiAnRXhwb3J0cycsXG4gICAgZXh0ZW5kczogJ0V4dGVuZHMnLFxuICAgIGZpbGU6ICdGaWxlJyxcbiAgICBmdW5jdGlvbnM6ICdGdW5jdGlvbnMnLFxuICAgICdnZW5lcmF0ZWQtdXNpbmcnOiAnRG9jdW1lbnRhdGlvbiBnZW5lcmF0ZWQgdXNpbmcnLFxuICAgICdnZXR0aW5nLXN0YXJ0ZWQnOiAnR2V0dGluZyBzdGFydGVkJyxcbiAgICBndWFyZDogJ0d1YXJkJyxcbiAgICBndWFyZHM6ICdHdWFyZHMnLFxuICAgIGhvc3RiaW5kaW5nczogJ0hvc3RCaW5kaW5ncycsXG4gICAgaG9zdGxpc3RlbmVyczogJ0hvc3RMaXN0ZW5lcnMnLFxuICAgICdodG1sLWVsZW1lbnQnOiAnSHRtbCBlbGVtZW50JyxcbiAgICAnaHRtbC1lbGVtZW50LXdpdGgtZGlyZWN0aXZlJzogJ0h0bWwgZWxlbWVudCB3aXRoIGRpcmVjdGl2ZScsXG4gICAgaWRlbnRpZmllcjogJ0lkZW50aWZpZXInLFxuICAgIGltcGxlbWVudHM6ICdJbXBsZW1lbnRzJyxcbiAgICBpbXBvcnRzOiAnSW1wb3J0cycsXG4gICAgaW5kZXg6ICdJbmRleCcsXG4gICAgaW5kZXhhYmxlOiAnSW5kZXhhYmxlJyxcbiAgICAnaW5oZXJpdGVkLWZyb20nOiAnSW5oZXJpdGVkIGZyb20nLFxuICAgIGluamVjdGFibGU6ICdJbmplY3RhYmxlJyxcbiAgICBpbmplY3RhYmxlczogJ0luamVjdGFibGVzJyxcbiAgICBpbnB1dHM6ICdJbnB1dHMnLFxuICAgIGludGVyY2VwdG9yczogJ0ludGVyY2VwdG9ycycsXG4gICAgaW50ZXJmYWNlOiAnSW50ZXJmYWNlJyxcbiAgICBpbnRlcmZhY2VzOiAnSW50ZXJmYWNlcycsXG4gICAgbGVnZW5kOiAnTGVnZW5kJyxcbiAgICBsaWNlbnNlOiAnTGljZW5zZScsXG4gICAgbGluZXM6ICdMaW5lcycsXG4gICAgbWV0YWRhdGE6ICdNZXRhZGF0YScsXG4gICAgbWV0aG9kczogJ01ldGhvZHMnLFxuICAgIG1pc2NlbGxhbmVvdXM6ICdNaXNjZWxsYW5lb3VzJyxcbiAgICBtb2R1bGU6ICdNb2R1bGUnLFxuICAgIG1vZHVsZXM6ICdNb2R1bGVzJyxcbiAgICBuYW1lOiAnTmFtZScsXG4gICAgbm86ICdObycsXG4gICAgJ25vLWdyYXBoJzogJ05vIGdyYXBoIGF2YWlsYWJsZS4nLFxuICAgICduby1pZnJhbWUnOiAnWW91ciBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgaWZyYW1lcy4nLFxuICAgICduby1yZXN1bHQtbWF0Y2hpbmcnOiAnTm8gcmVzdWx0cyBtYXRjaGluZycsXG4gICAgJ25vLXN2Zyc6ICdZb3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBTVkcnLFxuICAgIG9wdGlvbmFsOiAnT3B0aW9uYWwnLFxuICAgIG91dHB1dHM6ICdPdXRwdXRzJyxcbiAgICBvdmVydmlldzogJ092ZXJ2aWV3JyxcbiAgICBwYXJhbWV0ZXJzOiAnUGFyYW1ldGVycycsXG4gICAgJ3BlZXItZGVwZW5kZW5jaWVzJzogJ1BlZXIgZGVwZW5kZW5jaWVzJyxcbiAgICBwaXBlOiAnUGlwZScsXG4gICAgcGlwZXM6ICdQaXBlcycsXG4gICAgcHJlZml4OiAnUHJlZml4JyxcbiAgICBwcm9wZXJ0aWVzOiAnUHJvcGVydGllcycsXG4gICAgcHJvdmlkZXJzOiAnUHJvdmlkZXJzJyxcbiAgICBwdXJlOiAnUHVyZScsXG4gICAgcmVhZG1lOiAnUkVBRE1FJyxcbiAgICByZXNldDogJ1Jlc2V0JyxcbiAgICAncmVzdWx0cy1tYXRjaGluZyc6ICdyZXN1bHRzIG1hdGNoaW5nJyxcbiAgICByZXR1cm5zOiAnUmV0dXJucycsXG4gICAgcm91dGU6ICdSb3V0ZScsXG4gICAgcm91dGVzOiAnUm91dGVzJyxcbiAgICBzY2hlbWFzOiAnU2NoZW1hcycsXG4gICAgJ3NlYXJjaC1wbGFjZWhvbGRlcic6ICdUeXBlIHRvIHNlYXJjaCcsXG4gICAgc2VsZWN0b3I6ICdTZWxlY3RvcicsXG4gICAgc2lnbmF0dXJlOiAnU2lnbmF0dXJlJyxcbiAgICBzdGF0ZW1lbnRzOiAnU3RhdGVtZW50cycsXG4gICAgdHlwZTogJ1R5cGUnLFxuICAgICd0eXBlLWFsaWFzZXMnOiAnVHlwZSBhbGlhc2VzJyxcbiAgICAndHlwZS1wYXJhbWV0ZXJzJzogJ1R5cGUgcGFyYW1ldGVycycsXG4gICAgdHlwZXM6ICdUeXBlcycsXG4gICAgJ3VuYW1lZC1wcm9wZXJ0eSc6ICdVbmFtZWQgcHJvcGVydHknLFxuICAgICd1bml0LXRlc3QtY292ZXJhZ2UnOiAnVW5pdCB0ZXN0IGNvdmVyYWdlJyxcbiAgICB2YWx1ZTogJ1ZhbHVlJyxcbiAgICB2YXJpYWJsZXM6ICdWYXJpYWJsZXMnLFxuICAgIHllczogJ1llcycsXG4gICAgem9vbWluOiAnWm9vbSBpbicsXG4gICAgem9vbW91dDogJ1pvb20gb3V0J1xufTtcbiIsImV4cG9ydCBjb25zdCBUUkFOU0xBVElPTl9GUl9GUiA9IHtcbiAgICBhY2Nlc3NvcnM6ICdBY2Nlc3NldXJzJyxcbiAgICBhcmd1bWVudHM6ICdBcmd1bWVudHMnLFxuICAgIGJvb3RzdHJhcDogJ0Jvb3RzdHJhcCcsXG4gICAgYnJhbmNoZXM6ICdCcmFuY2hlcycsXG4gICAgYnJvd3NlOiAnUGFyY291cmlyJyxcbiAgICBjbGFzc2U6ICdDbGFzcycsXG4gICAgY2xhc3NlczogJ0NsYXNzZXMnLFxuICAgIGNvbXBvbmVudDogJ0NvbXBvc2FudCcsXG4gICAgY29tcG9uZW50czogJ0NvbXBvc2FudHMnLFxuICAgIGNvbnN0cnVjdG9yOiAnQ29uc3RydWN0ZXVyJyxcbiAgICBjb250cm9sbGVyczogJ0NvbnRyw7RsZXVycycsXG4gICAgY29udHJvbGxlcjogJ0NvbnRyw7RsZXVyJyxcbiAgICAnY292ZXJhZ2UtcGFnZS10aXRsZSc6ICdDb3V2ZXJ0dXJlIGRlIGRvY3VtZW50YXRpb24nLFxuICAgIGRlY2xhcmF0aW9uczogJ0TDqWNsYXJhdGlvbnMnLFxuICAgIGRlY29yYXRvcnM6ICdEw6ljb3JhdGV1cnMnLFxuICAgICdkZWZhdWx0LXZhbHVlJzogJ1ZhbGV1ciBwYXIgZMOpZmF1dCcsXG4gICAgJ2RlZmluZWQtaW4nOiAnRMOpZmluaSBkYW5zJyxcbiAgICBkZXBlbmRlbmNpZXM6ICdEw6lwZW5kYW5jZXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnRGVzY3JpcHRpb24nLFxuICAgIGRpcmVjdGl2ZTogJ0RpcmVjdGl2ZScsXG4gICAgZGlyZWN0aXZlczogJ0RpcmVjdGl2ZXMnLFxuICAgIGVudHJ5Y29tcG9uZW50czogXCJDb21wb3NhbnRzIGQnZW50csOpZVwiLFxuICAgIGVudW1lcmF0aW9uczogJ0VudW3DqXJhdGlvbnMnLFxuICAgIGVudW1zOiAnRW51bcOpcmF0aW9ucycsXG4gICAgZXhhbXBsZTogJ0V4YW1wbGUnLFxuICAgIGV4cG9ydHM6ICdFeHBvcnRzJyxcbiAgICBleHRlbmRzOiAnRXRlbmQnLFxuICAgIGZpbGU6ICdGaWNoaWVyJyxcbiAgICBmdW5jdGlvbnM6ICdGb25jdGlvbnMnLFxuICAgICdnZW5lcmF0ZWQtdXNpbmcnOiAnRG9jdW1lbnRhdGlvbiBnw6luw6lyw6llIGF2ZWMnLFxuICAgICdnZXR0aW5nLXN0YXJ0ZWQnOiAnRMOpbWFycmFnZScsXG4gICAgZ3VhcmQ6ICdHYXJkZScsXG4gICAgZ3VhcmRzOiAnR2FyZGVzJyxcbiAgICBob3N0YmluZGluZ3M6ICdIb3N0QmluZGluZ3MnLFxuICAgIGhvc3RsaXN0ZW5lcnM6ICdIb3N0TGlzdGVuZXJzJyxcbiAgICAnaHRtbC1lbGVtZW50JzogJ0Vsw6ltZW50IEh0bWwnLFxuICAgICdodG1sLWVsZW1lbnQtd2l0aC1kaXJlY3RpdmUnOiAnRWzDqW1lbnQgSHRtbCBhdmVjIHVuZSBkaXJlY3RpdmUnLFxuICAgIGlkZW50aWZpZXI6ICdJZGVudGlmaWFudCcsXG4gICAgaW1wbGVtZW50czogJ0ltcGzDqW1lbnRlJyxcbiAgICBpbXBvcnRzOiAnSW1wb3J0cycsXG4gICAgaW5kZXg6ICdJbmRleCcsXG4gICAgaW5kZXhhYmxlOiAnSW5kZXhhYmxlJyxcbiAgICAnaW5oZXJpdGVkLWZyb20nOiAnSMOpcml0w6kgZGUnLFxuICAgIGluamVjdGFibGU6ICdJbmplY3RhYmxlJyxcbiAgICBpbmplY3RhYmxlczogJ0luamVjdGFibGVzJyxcbiAgICBpbnB1dHM6ICdFbnRyw6llcycsXG4gICAgaW50ZXJjZXB0b3JzOiAnSW50ZXJjZXB0ZXVycycsXG4gICAgaW50ZXJmYWNlOiAnSW50ZXJmYWNlJyxcbiAgICBpbnRlcmZhY2VzOiAnSW50ZXJmYWNlcycsXG4gICAgbGVnZW5kOiAnTMOpZ2VuZGUnLFxuICAgIGxpY2Vuc2U6ICdMaWNlbnNlJyxcbiAgICBsaW5lczogJ0xpZ25lcycsXG4gICAgbWV0YWRhdGE6ICdNw6l0YWRvbm7DqWVzJyxcbiAgICBtZXRob2RzOiAnTcOpdGhvZGVzJyxcbiAgICBtaXNjZWxsYW5lb3VzOiAnRGl2ZXJzJyxcbiAgICBtb2R1bGU6ICdNb2R1bGUnLFxuICAgIG1vZHVsZXM6ICdNb2R1bGVzJyxcbiAgICBuYW1lOiAnTm9tJyxcbiAgICBubzogJ05vbicsXG4gICAgJ25vLWdyYXBoJzogJ0F1Y3VuIGdyYXBoaXF1ZSBkaXNwb25pYmxlLicsXG4gICAgJ25vLWlmcmFtZSc6ICdWb3RyZSBuYXZpZ2F0ZXVyIG5lIHN1cHBvcnRlIHBhcyBsZXMgaWZyYW1lcy4nLFxuICAgICduby1yZXN1bHQtbWF0Y2hpbmcnOiAnQXVjdW4gcsOpc3VsdGF0IG1hdGNoYW50JyxcbiAgICAnbm8tc3ZnJzogJ1ZvdHJlIG5hdmlnYXRldXIgbmUgc3VwcG9ydGUgcGFzIGxlIFNWRycsXG4gICAgb3B0aW9uYWw6ICdPcHRpb25uZWwnLFxuICAgIG91dHB1dHM6ICdTb3J0aWVzJyxcbiAgICBvdmVydmlldzogXCJWdWUgZCdlbnNlbWJsZVwiLFxuICAgIHBhcmFtZXRlcnM6ICdQYXJhbcOodHJlcycsXG4gICAgJ3BlZXItZGVwZW5kZW5jaWVzJzogJ0TDqXBlbmRhbmNlcyBkZSBwYWlyJyxcbiAgICBwaXBlOiAnUGlwZScsXG4gICAgcGlwZXM6ICdQaXBlcycsXG4gICAgcHJlZml4OiAnUHLDqWZpeGUnLFxuICAgIHByb3BlcnRpZXM6ICdQcm9wcmnDqXTDqXMnLFxuICAgIHByb3ZpZGVyczogJ1Byb3ZpZGVycycsXG4gICAgcHVyZTogJ1B1cmUnLFxuICAgIHJlYWRtZTogJ1JFQURNRScsXG4gICAgcmVzZXQ6ICdSZW1pc2Ugw6AgesOpcm8nLFxuICAgICdyZXN1bHRzLW1hdGNoaW5nJzogJ3LDqXN1bHRhdHMgbWF0Y2hhbnQnLFxuICAgIHJldHVybnM6ICdSZW52b2llJyxcbiAgICByb3V0ZTogJ1JvdXRlJyxcbiAgICByb3V0ZXM6ICdSb3V0ZXMnLFxuICAgIHNjaGVtYXM6ICdTY2jDqW1hcycsXG4gICAgJ3NlYXJjaC1wbGFjZWhvbGRlcic6ICdTYWlzaXNzZXogdW4gdGV4dGUnLFxuICAgIHNlbGVjdG9yOiAnU8OpbGVjdGV1cicsXG4gICAgc2lnbmF0dXJlOiAnU2lnbmF0dXJlJyxcbiAgICBzdGF0ZW1lbnRzOiAnRMOpY2xhcmF0aW9ucycsXG4gICAgdHlwZTogJ1R5cGUnLFxuICAgICd0eXBlLWFsaWFzZXMnOiAnQWxpYXMgZGUgdHlwZScsXG4gICAgJ3R5cGUtcGFyYW1ldGVycyc6ICdQYXJhbcOodHJlcyBkZSB0eXBlJyxcbiAgICB0eXBlczogJ1R5cGVzJyxcbiAgICAndW5hbWVkLXByb3BlcnR5JzogJ1Byb3ByacOpdMOpIG5vbiBub21tw6llJyxcbiAgICAndW5pdC10ZXN0LWNvdmVyYWdlJzogJ0NvdXZlcnR1cmUgZGUgdGVzdCB1bml0YWlyZScsXG4gICAgdmFsdWU6ICdWYWxldXInLFxuICAgIHZhcmlhYmxlczogJ1ZhcmlhYmxlcycsXG4gICAgeWVzOiAnT3VpJyxcbiAgICB6b29taW46ICdab29tIGF2YW50JyxcbiAgICB6b29tb3V0OiAnWm9vbSBhcnJpw6hyZSdcbn07XG4iLCJleHBvcnQgY29uc3QgVFJBTlNMQVRJT05fWkhfQ04gPSB7XG4gICAgYWNjZXNzb3JzOiAn5a2Y5Y+W5ZmoJyxcbiAgICBhcmd1bWVudHM6ICdBcmd1bWVudHMnLFxuICAgIGJvb3RzdHJhcDogJ+aguee7hOS7ticsXG4gICAgYnJhbmNoZXM6ICfliIbmlK8nLFxuICAgIGJyb3dzZTogJ+a1j+iniCcsXG4gICAgY2xhc3NlOiAn57G7JyxcbiAgICBjbGFzc2VzOiAn57G75YiX6KGoJyxcbiAgICBjb21wb25lbnQ6ICfnu4Tku7YnLFxuICAgIGNvbXBvbmVudHM6ICfnu4Tku7bliJfooagnLFxuICAgIGNvbnN0cnVjdG9yOiAn5p6E6YCg5pa55rOVJyxcbiAgICBjb250cm9sbGVyczogJ0NvbnRyb2xsZXJzJyxcbiAgICBjb250cm9sbGVyOiAnQ29udHJvbGxlcicsXG4gICAgJ2NvdmVyYWdlLXBhZ2UtdGl0bGUnOiAn5paH5qGj5qaC6KeIJyxcbiAgICBkZWNsYXJhdGlvbnM6ICflj6/lo7DmmI7lr7nosaHliJfooagnLFxuICAgIGRlY29yYXRvcnM6ICfoo4XppbDlmajliJfooagnLFxuICAgICdkZWZhdWx0LXZhbHVlJzogJ+e8uuecgeWAvCcsXG4gICAgJ2RlZmluZWQtaW4nOiAn6KKr5a6a5LmJ5ZyoJyxcbiAgICBkZXBlbmRlbmNpZXM6ICfkvp3otZbpobknLFxuICAgIGRlc2NyaXB0aW9uOiAn5o+P6L+wJyxcbiAgICBkaXJlY3RpdmU6ICfmjIfku6QnLFxuICAgIGRpcmVjdGl2ZXM6ICfmjIfku6TliJfooagnLFxuICAgIGVudHJ5Y29tcG9uZW50czogJ+WFpeWPo+e7hOS7tuWIl+ihqCcsXG4gICAgZW51bWVyYXRpb25zOiAn5YiX5Li+JyxcbiAgICBlbnVtczogJ+aemuS4vuWIl+ihqCcsXG4gICAgZXhhbXBsZTogJ+S+i+WtkCcsXG4gICAgZXhwb3J0czogJ+WvvOWHuicsXG4gICAgZXh0ZW5kczogJ+e7p+aJvycsXG4gICAgZmlsZTogJ+aWh+S7ticsXG4gICAgZnVuY3Rpb25zOiAn5Ye95pWwJyxcbiAgICAnZ2VuZXJhdGVkLXVzaW5nJzogJ0RvY3VtZW50YXRpb24gZ2VuZXJhdGVkIHVzaW5nJyxcbiAgICAnZ2V0dGluZy1zdGFydGVkJzogJ+WFpemXqOaMh+WNlycsXG4gICAgZ3VhcmQ6ICfot6/nlLHlrojljasnLFxuICAgIGd1YXJkczogJ+i3r+eUseWuiOWNq+WIl+ihqCcsXG4gICAgaG9zdGJpbmRpbmdzOiAn5a6/5Li757uR5a6aJyxcbiAgICBob3N0bGlzdGVuZXJzOiAn5a6/5Li755uR5ZCsJyxcbiAgICAnaHRtbC1lbGVtZW50JzogJ0h0bWwg5YWD57SgJyxcbiAgICAnaHRtbC1lbGVtZW50LXdpdGgtZGlyZWN0aXZlJzogJ+W4puaMh+S7pOeahEh0bWzlhYPntKAnLFxuICAgIGlkZW50aWZpZXI6ICdJZGVudGlmaWVyJyxcbiAgICBpbXBsZW1lbnRzOiAn5a6e546wJyxcbiAgICBpbXBvcnRzOiAn5byV5YWlJyxcbiAgICBpbmRleDogJ+e0ouW8lScsXG4gICAgaW5kZXhhYmxlOiAnSW5kZXhhYmxlJyxcbiAgICAnaW5oZXJpdGVkLWZyb20nOiAn57un5om/6IeqJyxcbiAgICBpbmplY3RhYmxlOiAn5Y+v5rOo5YWl55qEJyxcbiAgICBpbmplY3RhYmxlczogJ+WPr+azqOWFpeeahCcsXG4gICAgaW5wdXRzOiAnSW5wdXRzJyxcbiAgICBpbnRlcmNlcHRvcnM6ICfmi6bmiKrlmagnLFxuICAgIGludGVyZmFjZTogJ+aOpeWPoycsXG4gICAgaW50ZXJmYWNlczogJ+aOpeWPoycsXG4gICAgbGVnZW5kOiAnTGVnZW5kJyxcbiAgICBsaWNlbnNlOiAn6K645Y+v5Y2P6K6uJyxcbiAgICBsaW5lczogJ0xpbmVzJyxcbiAgICBtZXRhZGF0YTogJ+WFg+aVsOaNricsXG4gICAgbWV0aG9kczogJ+aWueazlScsXG4gICAgbWlzY2VsbGFuZW91czogJ+WFtuS7licsXG4gICAgbW9kdWxlOiAn5qih5Z2XJyxcbiAgICBtb2R1bGVzOiAn5qih5Z2XJyxcbiAgICBuYW1lOiAn5ZCN56ewJyxcbiAgICBubzogJ+WQpicsXG4gICAgJ25vLWdyYXBoJzogJ+aXoOWbvuihqOaYvuekuicsXG4gICAgJ25vLWlmcmFtZSc6ICfkvaDnmoTmtY/op4jlmajkuI3mlK/mjIFpZnJhbWVzJyxcbiAgICAnbm8tcmVzdWx0LW1hdGNoaW5nJzogJ+aXoOWMuemFjeeahOe7k+aenCcsXG4gICAgJ25vLXN2Zyc6ICfkvaDnmoTmtY/op4jlmajkuI3mlK/mjIFTVkcnLFxuICAgIG9wdGlvbmFsOiAnT3B0aW9uYWwnLFxuICAgIG91dHB1dHM6ICfovpPlh7onLFxuICAgIG92ZXJ2aWV3OiAn5qaC6L+wJyxcbiAgICBwYXJhbWV0ZXJzOiAn5Y+C5pWw5YiX6KGoJyxcbiAgICAncGVlci1kZXBlbmRlbmNpZXMnOiAn5ZCM57qn5L6d6LWWJyxcbiAgICBwaXBlOiAn566h6YGTJyxcbiAgICBwaXBlczogJ+euoemBk+WIl+ihqCcsXG4gICAgcHJlZml4OiAn5a2X6aaWJyxcbiAgICBwcm9wZXJ0aWVzOiAn5bGe5oCn5YiX6KGoJyxcbiAgICBwcm92aWRlcnM6ICfmj5DkvpvllYbliJfooagnLFxuICAgIHB1cmU6ICdQdXJlJyxcbiAgICByZWFkbWU6ICfmiYvlhownLFxuICAgIHJlc2V0OiAn6YeN572uJyxcbiAgICAncmVzdWx0cy1tYXRjaGluZyc6ICfljLnphY3nmoTnu5PmnpwnLFxuICAgIHJldHVybnM6ICfov5Tlm54nLFxuICAgIHJvdXRlOiAn6Lev55SxJyxcbiAgICByb3V0ZXM6ICfot6/nlLHliJfooagnLFxuICAgIHNjaGVtYXM6ICfmqKHlvI8nLFxuICAgICdzZWFyY2gtcGxhY2Vob2xkZXInOiAn6K+36L6T5YWl5p+l6K+i5YWz6ZSu5a2XJyxcbiAgICBzZWxlY3RvcjogJ+mAieaLqeWZqCcsXG4gICAgc2lnbmF0dXJlOiAn562+5ZCNJyxcbiAgICBzdGF0ZW1lbnRzOiAn5aOw5piOJyxcbiAgICB0eXBlOiAn57G75Z6LJyxcbiAgICAndHlwZS1hbGlhc2VzJzogJ+exu+Wei+WIq+WQjScsXG4gICAgJ3R5cGUtcGFyYW1ldGVycyc6ICfnsbvlnovlj4LmlbAnLFxuICAgIHR5cGVzOiAn57G75Z6LJyxcbiAgICAndW5hbWVkLXByb3BlcnR5JzogJ+acquWRveWQjeWxnuaApycsXG4gICAgJ3VuaXQtdGVzdC1jb3ZlcmFnZSc6ICfljZXlhYPmtYvor5XmpoLop4gnLFxuICAgIHZhbHVlOiAn5YC8JyxcbiAgICB2YXJpYWJsZXM6ICflj5jph48nLFxuICAgIHllczogJ+aYrycsXG4gICAgem9vbWluOiAn5pS+5aSnJyxcbiAgICB6b29tb3V0OiAn57yp5bCPJ1xufTtcbiIsImltcG9ydCBpMThuZXh0IGZyb20gJ2kxOG5leHQnO1xuXG5pbXBvcnQgeyBUUkFOU0xBVElPTl9FTl9VUywgVFJBTlNMQVRJT05fRlJfRlIsIFRSQU5TTEFUSU9OX1pIX0NOIH0gZnJvbSAnLi4vLi4vbG9jYWxlcyc7XG5cbmNsYXNzIEkxOG5FbmdpbmUge1xuICAgIGNvbnN0cnVjdG9yKCkge31cblxuICAgIHByaXZhdGUgYXZhaWxhYmxlc0xhbmd1YWdlcyA9IHtcbiAgICAgICAgJ2VuLVVTJzogJ2VuLVVTJyxcbiAgICAgICAgJ2ZyLUZSJzogJ2ZyLUZSJyxcbiAgICAgICAgJ3poLUNOJzogJ3poLUNOJ1xuICAgIH07XG5cbiAgICBwdWJsaWMgZmFsbGJhY2tMYW5ndWFnZSA9ICdlbi1VUyc7XG5cbiAgICBwdWJsaWMgaW5pdChsYW5ndWFnZTogc3RyaW5nKSB7XG4gICAgICAgIGkxOG5leHQuaW5pdCh7XG4gICAgICAgICAgICBsbmc6IGxhbmd1YWdlLFxuICAgICAgICAgICAgZmFsbGJhY2tMbmc6IHRoaXMuZmFsbGJhY2tMYW5ndWFnZVxuICAgICAgICB9KTtcbiAgICAgICAgaTE4bmV4dC5hZGRSZXNvdXJjZXMoJ2VuLVVTJywgJ3RyYW5zbGF0aW9uJywgVFJBTlNMQVRJT05fRU5fVVMpO1xuICAgICAgICBpMThuZXh0LmFkZFJlc291cmNlcygnZnItRlInLCAndHJhbnNsYXRpb24nLCBUUkFOU0xBVElPTl9GUl9GUik7XG4gICAgICAgIGkxOG5leHQuYWRkUmVzb3VyY2VzKCd6aC1DTicsICd0cmFuc2xhdGlvbicsIFRSQU5TTEFUSU9OX1pIX0NOKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdHJhbnNsYXRlKGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGkxOG5leHQudChrZXkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdXBwb3J0TGFuZ3VhZ2UobGFuZ3VhZ2U6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMuYXZhaWxhYmxlc0xhbmd1YWdlc1tsYW5ndWFnZV0gIT09ICd1bmRlZmluZWQnO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IEkxOG5FbmdpbmUoKTtcbiIsImltcG9ydCAqIGFzIEhhbmRsZWJhcnMgZnJvbSAnaGFuZGxlYmFycyc7XG5cbmltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyLCBJSGFuZGxlYmFyc09wdGlvbnMgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuXG5pbXBvcnQgSTE4bkVuZ2luZUluc3RhbmNlIGZyb20gJy4uL2kxOG4uZW5naW5lJztcblxuZXhwb3J0IGNsYXNzIEkxOG5IZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCBpMThuX2tleTogc3RyaW5nLCBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gSTE4bkVuZ2luZUluc3RhbmNlLnRyYW5zbGF0ZShpMThuX2tleSk7XG4gICAgICAgIHJldHVybiBuZXcgSGFuZGxlYmFycy5TYWZlU3RyaW5nKHJlc3VsdCk7XG4gICAgfVxufVxuIiwiaW1wb3J0ICogYXMgSGFuZGxlYmFycyBmcm9tICdoYW5kbGViYXJzJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcblxuaW1wb3J0IHsgRGVwZW5kZW5jaWVzRW5naW5lIH0gZnJvbSAnLi9kZXBlbmRlbmNpZXMuZW5naW5lJztcbmltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ29tcGFyZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9jb21wYXJlLmhlbHBlcic7XG5pbXBvcnQgeyBPckhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9vci5oZWxwZXInO1xuaW1wb3J0IHsgRnVuY3Rpb25TaWduYXR1cmVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvZnVuY3Rpb24tc2lnbmF0dXJlLmhlbHBlcic7XG5pbXBvcnQgeyBJc05vdFRvZ2dsZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9pcy1ub3QtdG9nZ2xlLmhlbHBlcic7XG5pbXBvcnQgeyBJc0luaXRpYWxUYWJIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvaXMtaW5pdGlhbC10YWIuaGVscGVyJztcbmltcG9ydCB7IElzVGFiRW5hYmxlZEhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9pcy10YWItZW5hYmxlZC5oZWxwZXInO1xuaW1wb3J0IHsgSWZTdHJpbmdIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvaWYtc3RyaW5nLmhlbHBlcic7XG5pbXBvcnQgeyBPckxlbmd0aEhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9vci1sZW5ndGguaGVscGVyJztcbmltcG9ydCB7IEZpbHRlckFuZ3VsYXIyTW9kdWxlc0hlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9maWx0ZXItYW5ndWxhcjItbW9kdWxlcy5oZWxwZXInO1xuaW1wb3J0IHsgRGVidWdIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvZGVidWcuaGVscGVyJztcbmltcG9ydCB7IEJyZWFrTGluZXNIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvYnJlYWstbGluZXMuaGVscGVyJztcbmltcG9ydCB7IENsZWFuUGFyYWdyYXBoSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL2NsZWFuLXBhcmFncmFwaC5oZWxwZXInO1xuaW1wb3J0IHsgRXNjYXBlU2ltcGxlUXVvdGVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvZXNjYXBlLXNpbXBsZS1xdW90ZS5oZWxwZXInO1xuaW1wb3J0IHsgQnJlYWtDb21tYUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9icmVhay1jb21tYS5oZWxwZXInO1xuaW1wb3J0IHsgTW9kaWZLaW5kSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL21vZGlmLWtpbmQtaGVscGVyJztcbmltcG9ydCB7IE1vZGlmSWNvbkhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9tb2RpZi1pY29uLmhlbHBlcic7XG5pbXBvcnQgeyBSZWxhdGl2ZVVSTEhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9yZWxhdGl2ZS11cmwuaGVscGVyJztcbmltcG9ydCB7IEpzZG9jUmV0dXJuc0NvbW1lbnRIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvanNkb2MtcmV0dXJucy1jb21tZW50LmhlbHBlcic7XG5pbXBvcnQgeyBKc2RvY0NvZGVFeGFtcGxlSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL2pzZG9jLWNvZGUtZXhhbXBsZS5oZWxwZXInO1xuaW1wb3J0IHsgSnNkb2NFeGFtcGxlSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL2pzZG9jLWV4YW1wbGUuaGVscGVyJztcbmltcG9ydCB7IEpzZG9jUGFyYW1zSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL2pzZG9jLXBhcmFtcy5oZWxwZXInO1xuaW1wb3J0IHsgSnNkb2NQYXJhbXNWYWxpZEhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9qc2RvYy1wYXJhbXMtdmFsaWQuaGVscGVyJztcbmltcG9ydCB7IEpzZG9jRGVmYXVsdEhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9qc2RvYy1kZWZhdWx0LmhlbHBlcic7XG5pbXBvcnQgeyBMaW5rVHlwZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9saW5rLXR5cGUuaGVscGVyJztcbmltcG9ydCB7IEluZGV4YWJsZVNpZ25hdHVyZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9pbmRleGFibGUtc2lnbmF0dXJlLmhlbHBlcic7XG5pbXBvcnQgeyBPYmplY3RIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvb2JqZWN0LmhlbHBlcic7XG5pbXBvcnQgeyBPYmplY3RMZW5ndGhIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvb2JqZWN0LWxlbmd0aC5oZWxwZXInO1xuaW1wb3J0IHsgUGFyc2VEZXNjcmlwdGlvbkhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9wYXJzZS1kZXNjcmlwdGlvbi5oZWxwZXInO1xuaW1wb3J0IHsgT25lUGFyYW1ldGVySGFzSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL29uZS1wYXJhbWV0ZXItaGFzLmhlbHBlcic7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uSW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jb25maWd1cmF0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBFbGVtZW50QWxvbmVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvZWxlbWVudC1hbG9uZS5oZWxwZXInO1xuaW1wb3J0IHsgSGFzT3duSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL2hhcy1vd24uaGVscGVyJztcbmltcG9ydCB7IFNob3J0VVJMSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL3Nob3J0LXVybC5oZWxwZXInO1xuaW1wb3J0IHsgSTE4bkhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9pMThuLmhlbHBlcic7XG5cbmV4cG9ydCBjbGFzcyBIdG1sRW5naW5lSGVscGVycyB7XG4gICAgcHVibGljIHJlZ2lzdGVySGVscGVycyhcbiAgICAgICAgYmFycyxcbiAgICAgICAgY29uZmlndXJhdGlvbjogQ29uZmlndXJhdGlvbkludGVyZmFjZSxcbiAgICAgICAgZGVwZW5kZW5jaWVzRW5naW5lOiBEZXBlbmRlbmNpZXNFbmdpbmVcbiAgICApOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnY29tcGFyZScsIG5ldyBDb21wYXJlSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdvcicsIG5ldyBPckhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihcbiAgICAgICAgICAgIGJhcnMsXG4gICAgICAgICAgICAnZnVuY3Rpb25TaWduYXR1cmUnLFxuICAgICAgICAgICAgbmV3IEZ1bmN0aW9uU2lnbmF0dXJlSGVscGVyKGNvbmZpZ3VyYXRpb24sIGRlcGVuZGVuY2llc0VuZ2luZSlcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnaXNOb3RUb2dnbGUnLCBuZXcgSXNOb3RUb2dnbGVIZWxwZXIoY29uZmlndXJhdGlvbikpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdpc0luaXRpYWxUYWInLCBuZXcgSXNJbml0aWFsVGFiSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdpc1RhYkVuYWJsZWQnLCBuZXcgSXNUYWJFbmFibGVkSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdpZlN0cmluZycsIG5ldyBJZlN0cmluZ0hlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnb3JMZW5ndGgnLCBuZXcgT3JMZW5ndGhIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ2ZpbHRlckFuZ3VsYXIyTW9kdWxlcycsIG5ldyBGaWx0ZXJBbmd1bGFyMk1vZHVsZXNIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ2RlYnVnJywgbmV3IERlYnVnSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdicmVha2xpbmVzJywgbmV3IEJyZWFrTGluZXNIZWxwZXIoYmFycykpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdjbGVhbi1wYXJhZ3JhcGgnLCBuZXcgQ2xlYW5QYXJhZ3JhcGhIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ2VzY2FwZVNpbXBsZVF1b3RlJywgbmV3IEVzY2FwZVNpbXBsZVF1b3RlSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdicmVha0NvbW1hJywgbmV3IEJyZWFrQ29tbWFIZWxwZXIoYmFycykpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdtb2RpZktpbmQnLCBuZXcgTW9kaWZLaW5kSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdtb2RpZkljb24nLCBuZXcgTW9kaWZJY29uSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdyZWxhdGl2ZVVSTCcsIG5ldyBSZWxhdGl2ZVVSTEhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnanNkb2MtcmV0dXJucy1jb21tZW50JywgbmV3IEpzZG9jUmV0dXJuc0NvbW1lbnRIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ2pzZG9jLWNvZGUtZXhhbXBsZScsIG5ldyBKc2RvY0NvZGVFeGFtcGxlSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdqc2RvYy1leGFtcGxlJywgbmV3IEpzZG9jRXhhbXBsZUhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnanNkb2MtcGFyYW1zJywgbmV3IEpzZG9jUGFyYW1zSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdqc2RvYy1wYXJhbXMtdmFsaWQnLCBuZXcgSnNkb2NQYXJhbXNWYWxpZEhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnanNkb2MtZGVmYXVsdCcsIG5ldyBKc2RvY0RlZmF1bHRIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoXG4gICAgICAgICAgICBiYXJzLFxuICAgICAgICAgICAgJ2xpbmtUeXBlJyxcbiAgICAgICAgICAgIG5ldyBMaW5rVHlwZUhlbHBlcihjb25maWd1cmF0aW9uLCBkZXBlbmRlbmNpZXNFbmdpbmUpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ2luZGV4YWJsZVNpZ25hdHVyZScsIG5ldyBJbmRleGFibGVTaWduYXR1cmVIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ29iamVjdCcsIG5ldyBPYmplY3RIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ29iamVjdExlbmd0aCcsIG5ldyBPYmplY3RMZW5ndGhIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoXG4gICAgICAgICAgICBiYXJzLFxuICAgICAgICAgICAgJ3BhcnNlRGVzY3JpcHRpb24nLFxuICAgICAgICAgICAgbmV3IFBhcnNlRGVzY3JpcHRpb25IZWxwZXIoZGVwZW5kZW5jaWVzRW5naW5lKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdvbmUtcGFyYW1ldGVyLWhhcycsIG5ldyBPbmVQYXJhbWV0ZXJIYXNIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ2VsZW1lbnQtYWxvbmUnLCBuZXcgRWxlbWVudEFsb25lSGVscGVyKGRlcGVuZGVuY2llc0VuZ2luZSkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdoYXNPd24nLCBuZXcgSGFzT3duSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdzaG9ydC11cmwnLCBuZXcgU2hvcnRVUkxIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ3QnLCBuZXcgSTE4bkhlbHBlcigpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlZ2lzdGVySGVscGVyKGJhcnMsIGtleTogc3RyaW5nLCBoZWxwZXI6IElIdG1sRW5naW5lSGVscGVyKSB7XG4gICAgICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoa2V5LCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1pbnZhbGlkLXRoaXNcbiAgICAgICAgICAgIHJldHVybiBoZWxwZXIuaGVscGVyRnVuYy5hcHBseShoZWxwZXIsIFt0aGlzLCAuLi5fLnNsaWNlKGFyZ3VtZW50cyBhcyBhbnkpXSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBIYW5kbGViYXJzIGZyb20gJ2hhbmRsZWJhcnMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi9sb2dnZXInO1xuaW1wb3J0IHsgSHRtbEVuZ2luZUhlbHBlcnMgfSBmcm9tICcuL2h0bWwuZW5naW5lLmhlbHBlcnMnO1xuaW1wb3J0IHsgRGVwZW5kZW5jaWVzRW5naW5lIH0gZnJvbSAnLi9kZXBlbmRlbmNpZXMuZW5naW5lJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25JbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NvbmZpZ3VyYXRpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IEZpbGVFbmdpbmUgfSBmcm9tICcuL2ZpbGUuZW5naW5lJztcblxuZXhwb3J0IGNsYXNzIEh0bWxFbmdpbmUge1xuICAgIHByaXZhdGUgY2FjaGU6IHsgcGFnZTogc3RyaW5nIH0gPSB7fSBhcyBhbnk7XG4gICAgcHJpdmF0ZSBjb21waWxlZFBhZ2U7XG5cbiAgICBwcml2YXRlIHByZWNvbXBpbGVkTWVudTtcbiAgICBwcml2YXRlIGNvbXBpbGVkTW9iaWxlTWVudTtcbiAgICBwcml2YXRlIGNvbXBpbGVkTWVudTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBjb25maWd1cmF0aW9uOiBDb25maWd1cmF0aW9uSW50ZXJmYWNlLFxuICAgICAgICBkZXBlbmRlbmNpZXNFbmdpbmU6IERlcGVuZGVuY2llc0VuZ2luZSxcbiAgICAgICAgcHJpdmF0ZSBmaWxlRW5naW5lOiBGaWxlRW5naW5lID0gbmV3IEZpbGVFbmdpbmUoKVxuICAgICkge1xuICAgICAgICBjb25zdCBoZWxwZXIgPSBuZXcgSHRtbEVuZ2luZUhlbHBlcnMoKTtcbiAgICAgICAgaGVscGVyLnJlZ2lzdGVySGVscGVycyhIYW5kbGViYXJzLCBjb25maWd1cmF0aW9uLCBkZXBlbmRlbmNpZXNFbmdpbmUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbml0KHRlbXBsYXRlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBwYXJ0aWFscyA9IFtcbiAgICAgICAgICAgICdvdmVydmlldycsXG4gICAgICAgICAgICAnbWFya2Rvd24nLFxuICAgICAgICAgICAgJ21vZHVsZXMnLFxuICAgICAgICAgICAgJ21vZHVsZScsXG4gICAgICAgICAgICAnY29tcG9uZW50cycsXG4gICAgICAgICAgICAnY29tcG9uZW50JyxcbiAgICAgICAgICAgICdjb250cm9sbGVyJyxcbiAgICAgICAgICAgICdjb21wb25lbnQtZGV0YWlsJyxcbiAgICAgICAgICAgICdkaXJlY3RpdmVzJyxcbiAgICAgICAgICAgICdkaXJlY3RpdmUnLFxuICAgICAgICAgICAgJ2luamVjdGFibGVzJyxcbiAgICAgICAgICAgICdpbmplY3RhYmxlJyxcbiAgICAgICAgICAgICdpbnRlcmNlcHRvcicsXG4gICAgICAgICAgICAnZ3VhcmQnLFxuICAgICAgICAgICAgJ3BpcGVzJyxcbiAgICAgICAgICAgICdwaXBlJyxcbiAgICAgICAgICAgICdjbGFzc2VzJyxcbiAgICAgICAgICAgICdjbGFzcycsXG4gICAgICAgICAgICAnaW50ZXJmYWNlJyxcbiAgICAgICAgICAgICdyb3V0ZXMnLFxuICAgICAgICAgICAgJ2luZGV4JyxcbiAgICAgICAgICAgICdpbmRleC1taXNjJyxcbiAgICAgICAgICAgICdzZWFyY2gtcmVzdWx0cycsXG4gICAgICAgICAgICAnc2VhcmNoLWlucHV0JyxcbiAgICAgICAgICAgICdsaW5rLXR5cGUnLFxuICAgICAgICAgICAgJ2Jsb2NrLW1ldGhvZCcsXG4gICAgICAgICAgICAnYmxvY2stZW51bScsXG4gICAgICAgICAgICAnYmxvY2stcHJvcGVydHknLFxuICAgICAgICAgICAgJ2Jsb2NrLWluZGV4JyxcbiAgICAgICAgICAgICdibG9jay1jb25zdHJ1Y3RvcicsXG4gICAgICAgICAgICAnYmxvY2stdHlwZWFsaWFzJyxcbiAgICAgICAgICAgICdibG9jay1hY2Nlc3NvcnMnLFxuICAgICAgICAgICAgJ2Jsb2NrLWlucHV0JyxcbiAgICAgICAgICAgICdibG9jay1vdXRwdXQnLFxuICAgICAgICAgICAgJ2NvdmVyYWdlLXJlcG9ydCcsXG5cdFx0XHRcdFx0XHQndW5pdC10ZXN0LXJlcG9ydCcsXG4gICAgICAgICAgICAnbWlzY2VsbGFuZW91cy1mdW5jdGlvbnMnLFxuICAgICAgICAgICAgJ21pc2NlbGxhbmVvdXMtdmFyaWFibGVzJyxcbiAgICAgICAgICAgICdtaXNjZWxsYW5lb3VzLXR5cGVhbGlhc2VzJyxcbiAgICAgICAgICAgICdtaXNjZWxsYW5lb3VzLWVudW1lcmF0aW9ucycsXG4gICAgICAgICAgICAnYWRkaXRpb25hbC1wYWdlJyxcbiAgICAgICAgICAgICdwYWNrYWdlLWRlcGVuZGVuY2llcydcbiAgICAgICAgXTtcbiAgICAgICAgaWYodGVtcGxhdGVQYXRoKXtcbiAgICAgICAgICBpZih0aGlzLmZpbGVFbmdpbmUuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKStwYXRoLnNlcCt0ZW1wbGF0ZVBhdGgpKT09PWZhbHNlKXtcbiAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ1RlbXBsYXRlIHBhdGggc3BlY2lmaWNlZCBidXQgZG9lcyBub3QgZXhpc3QuLi51c2luZyBkZWZhdWx0IHRlbXBsYXRlcycpO1xuICAgICAgICAgICAgICAvL25ldyBFcnJvcignVGVtcGxhdGUgcGF0aCBzcGVjaWZpZWQgYnV0IGRvZXMgbm90IGV4aXN0Jyk7XG4gICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIHBhcnRpYWxzLm1hcChwYXJ0aWFsID0+IHtcbiAgICAgICAgICAgIGxldCBwYXJ0aWFsUGF0aCA9IHRoaXMuZGV0ZXJtaW5lVGVtcGxhdGVQYXRoKHRlbXBsYXRlUGF0aCwgJ3BhcnRpYWxzLycrcGFydGlhbCsnLmhicycpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbGVFbmdpbmVcbiAgICAgICAgICAgICAgICAgICAgLmdldChwYXJ0aWFsUGF0aClcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oZGF0YSA9PiBIYW5kbGViYXJzLnJlZ2lzdGVyUGFydGlhbChwYXJ0aWFsLCBkYXRhKSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgbGV0IHBhZ2VQYXRoID0gdGhpcy5kZXRlcm1pbmVUZW1wbGF0ZVBhdGgodGVtcGxhdGVQYXRoLCAncGFnZS5oYnMnKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maWxlRW5naW5lXG4gICAgICAgICAgICAgICAgICAgIC5nZXQocGFnZVBhdGgpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWNoZS5wYWdlID0gZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcGlsZWRQYWdlID0gSGFuZGxlYmFycy5jb21waWxlKHRoaXMuY2FjaGUucGFnZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZlbnRJbmRlbnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWN0OiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgIGxldCBtZW51UGF0aCA9IHRoaXMuZGV0ZXJtaW5lVGVtcGxhdGVQYXRoKHRlbXBsYXRlUGF0aCwgJ3BhcnRpYWxzL21lbnUuaGJzJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsZUVuZ2luZVxuICAgICAgICAgICAgICAgICAgICAuZ2V0KG1lbnVQYXRoKVxuICAgICAgICAgICAgICAgICAgICAudGhlbihtZW51VGVtcGxhdGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmVjb21waWxlZE1lbnUgPSBIYW5kbGViYXJzLmNvbXBpbGUobWVudVRlbXBsYXRlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmVudEluZGVudDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3Q6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVuZGVyTWVudSh0ZW1wbGF0ZVBhdGgsIGRhdGEpIHtcbiAgICAgICAgbGV0IG1lbnVQYXRoID0gdGhpcy5kZXRlcm1pbmVUZW1wbGF0ZVBhdGgodGVtcGxhdGVQYXRoLCAncGFydGlhbHMvbWVudS5oYnMnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsZUVuZ2luZVxuICAgICAgICAgICAgLmdldChtZW51UGF0aClcbiAgICAgICAgICAgIC50aGVuKG1lbnVUZW1wbGF0ZSA9PiB7XG4gICAgICAgICAgICAgICAgZGF0YS5tZW51ID0gJ25vcm1hbCc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEhhbmRsZWJhcnMuY29tcGlsZShtZW51VGVtcGxhdGUsIHtcbiAgICAgICAgICAgICAgICAgICAgcHJldmVudEluZGVudDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3RyaWN0OiB0cnVlXG4gICAgICAgICAgICAgICAgfSkoeyAuLi5kYXRhIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbmRlcihtYWluRGF0YTogYW55LCBwYWdlOiBhbnkpOiBzdHJpbmcge1xuICAgICAgICBsZXQgbyA9IG1haW5EYXRhO1xuICAgICAgICAoT2JqZWN0IGFzIGFueSkuYXNzaWduKG8sIHBhZ2UpO1xuXG4gICAgICAgIC8vIGxldCBtZW0gPSBwcm9jZXNzLm1lbW9yeVVzYWdlKCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGBoZWFwVG90YWw6ICR7bWVtLmhlYXBUb3RhbH0gfCBoZWFwVXNlZDogJHttZW0uaGVhcFVzZWR9YCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZWRQYWdlKHtcbiAgICAgICAgICAgIGRhdGE6IG9cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHByaXZhdGUgZGV0ZXJtaW5lVGVtcGxhdGVQYXRoKHRlbXBsYXRlUGF0aDogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgIGxldCBvdXRQYXRoID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSArICcvLi4vc3JjL3RlbXBsYXRlcy8nK2ZpbGVQYXRoKTtcbiAgICAgIGlmKHRlbXBsYXRlUGF0aCl7XG4gICAgICAgICBsZXQgdGVzdFBhdGggPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwICsgdGVtcGxhdGVQYXRoICsgcGF0aC5zZXAgKyBmaWxlUGF0aCk7XG4gICAgICAgIG91dFBhdGggPSAodGhpcy5maWxlRW5naW5lLmV4aXN0c1N5bmModGVzdFBhdGgpID8gdGVzdFBhdGggOiBvdXRQYXRoKTsgXG4gICAgICB9XG4gICAgIHJldHVybiBvdXRQYXRoO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZW5lcmF0ZUNvdmVyYWdlQmFkZ2Uob3V0cHV0Rm9sZGVyLCBsYWJlbCwgY292ZXJhZ2VEYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbGVFbmdpbmVcbiAgICAgICAgICAgIC5nZXQocGF0aC5yZXNvbHZlKF9fZGlybmFtZSArICcvLi4vc3JjL3RlbXBsYXRlcy9wYXJ0aWFscy9jb3ZlcmFnZS1iYWRnZS5oYnMnKSlcbiAgICAgICAgICAgIC50aGVuKFxuICAgICAgICAgICAgICAgIGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGVtcGxhdGU6IGFueSA9IEhhbmRsZWJhcnMuY29tcGlsZShkYXRhKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y292ZXJhZ2VEYXRhLmxhYmVsID0gbGFiZWw7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSB0ZW1wbGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBjb3ZlcmFnZURhdGFcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0ZXN0T3V0cHV0RGlyID0gb3V0cHV0Rm9sZGVyLm1hdGNoKHByb2Nlc3MuY3dkKCkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGVzdE91dHB1dERpciAmJiB0ZXN0T3V0cHV0RGlyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZvbGRlciA9IG91dHB1dEZvbGRlci5yZXBsYWNlKHByb2Nlc3MuY3dkKCkgKyBwYXRoLnNlcCwgJycpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsZUVuZ2luZVxuICAgICAgICAgICAgICAgICAgICAgICAgLndyaXRlKG91dHB1dEZvbGRlciArIHBhdGguc2VwICsgJy9pbWFnZXMvY292ZXJhZ2UtYmFkZ2UtJyArIGxhYmVsICsgJy5zdmcnLCByZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGR1cmluZyBjb3ZlcmFnZSBiYWRnZSAnICsgbGFiZWwgKyAnIGZpbGUgZ2VuZXJhdGlvbiAnLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnIgPT4gUHJvbWlzZS5yZWplY3QoJ0Vycm9yIGR1cmluZyBjb3ZlcmFnZSBiYWRnZSBnZW5lcmF0aW9uJylcbiAgICAgICAgICAgICk7XG4gICAgfVxufVxuIiwiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IEZpbGVFbmdpbmUgfSBmcm9tICcuL2ZpbGUuZW5naW5lJztcblxuY29uc3QgbWFya2VkID0gcmVxdWlyZSgnbWFya2VkJyk7XG5cbmV4cG9ydCBjbGFzcyBNYXJrZG93bkVuZ2luZSB7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBtYXJrZG93biBmaWxlcyB3aXRob3V0IC5tZCBleHRlbnNpb25cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IG1hcmtkb3duRmlsZXMgPSBbJ1JFQURNRScsICdDSEFOR0VMT0cnLCAnTElDRU5TRScsICdDT05UUklCVVRJTkcnLCAnVE9ETyddO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBmaWxlRW5naW5lID0gbmV3IEZpbGVFbmdpbmUoKSkge1xuICAgICAgICBjb25zdCByZW5kZXJlciA9IG5ldyBtYXJrZWQuUmVuZGVyZXIoKTtcbiAgICAgICAgcmVuZGVyZXIuY29kZSA9IChjb2RlLCBsYW5ndWFnZSkgPT4ge1xuICAgICAgICAgICAgbGV0IGhpZ2hsaWdodGVkID0gY29kZTtcbiAgICAgICAgICAgIGlmICghbGFuZ3VhZ2UpIHtcbiAgICAgICAgICAgICAgICBsYW5ndWFnZSA9ICdub25lJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaGlnaGxpZ2h0ZWQgPSB0aGlzLmVzY2FwZShjb2RlKTtcbiAgICAgICAgICAgIHJldHVybiBgPGRpdj48cHJlIGNsYXNzPVwibGluZS1udW1iZXJzXCI+PGNvZGUgY2xhc3M9XCJsYW5ndWFnZS0ke2xhbmd1YWdlfVwiPiR7aGlnaGxpZ2h0ZWR9PC9jb2RlPjwvcHJlPjwvZGl2PmA7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmVuZGVyZXIudGFibGUgPSAoaGVhZGVyLCBib2R5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICc8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1ib3JkZXJlZCBjb21wb2RvYy10YWJsZVwiPlxcbicgK1xuICAgICAgICAgICAgICAgICc8dGhlYWQ+XFxuJyArXG4gICAgICAgICAgICAgICAgaGVhZGVyICtcbiAgICAgICAgICAgICAgICAnPC90aGVhZD5cXG4nICtcbiAgICAgICAgICAgICAgICAnPHRib2R5PlxcbicgK1xuICAgICAgICAgICAgICAgIGJvZHkgK1xuICAgICAgICAgICAgICAgICc8L3Rib2R5PlxcbicgK1xuICAgICAgICAgICAgICAgICc8L3RhYmxlPlxcbidcbiAgICAgICAgICAgICk7XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuICAgICAgICByZW5kZXJlci5pbWFnZSA9IGZ1bmN0aW9uKGhyZWY6IHN0cmluZywgdGl0bGU6IHN0cmluZywgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgICAgICBsZXQgb3V0ID0gJzxpbWcgc3JjPVwiJyArIGhyZWYgKyAnXCIgYWx0PVwiJyArIHRleHQgKyAnXCIgY2xhc3M9XCJpbWctcmVzcG9uc2l2ZVwiJztcbiAgICAgICAgICAgIGlmICh0aXRsZSkge1xuICAgICAgICAgICAgICAgIG91dCArPSAnIHRpdGxlPVwiJyArIHRpdGxlICsgJ1wiJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dCArPSAnPic7XG4gICAgICAgICAgICByZXR1cm4gb3V0O1xuICAgICAgICB9O1xuXG4gICAgICAgIG1hcmtlZC5zZXRPcHRpb25zKHtcbiAgICAgICAgICAgIHJlbmRlcmVyOiByZW5kZXJlcixcbiAgICAgICAgICAgIGJyZWFrczogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFRyYWRpdGlvbmFsTWFya2Rvd24oZmlsZXBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbGVFbmdpbmVcbiAgICAgICAgICAgIC5nZXQocHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwICsgZmlsZXBhdGggKyAnLm1kJylcbiAgICAgICAgICAgIC5jYXRjaChlcnIgPT4gdGhpcy5maWxlRW5naW5lLmdldChwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXAgKyBmaWxlcGF0aCkudGhlbigpKVxuICAgICAgICAgICAgLnRoZW4oZGF0YSA9PiBtYXJrZWQoZGF0YSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRUcmFkaXRpb25hbE1hcmtkb3duU3luYyhmaWxlcGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIG1hcmtlZCh0aGlzLmZpbGVFbmdpbmUuZ2V0U3luYyhwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXAgKyBmaWxlcGF0aCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UmVhZG1lRmlsZSgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5maWxlRW5naW5lXG4gICAgICAgICAgICAuZ2V0KHByb2Nlc3MuY3dkKCkgKyBwYXRoLnNlcCArICdSRUFETUUubWQnKVxuICAgICAgICAgICAgLnRoZW4oZGF0YSA9PiBtYXJrZWQoZGF0YSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkTmVpZ2hib3VyUmVhZG1lRmlsZShmaWxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgZGlybmFtZSA9IHBhdGguZGlybmFtZShmaWxlKTtcbiAgICAgICAgbGV0IHJlYWRtZUZpbGUgPSBkaXJuYW1lICsgcGF0aC5zZXAgKyBwYXRoLmJhc2VuYW1lKGZpbGUsICcudHMnKSArICcubWQnO1xuICAgICAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKHJlYWRtZUZpbGUsICd1dGY4Jyk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhc05laWdoYm91clJlYWRtZUZpbGUoZmlsZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBkaXJuYW1lID0gcGF0aC5kaXJuYW1lKGZpbGUpO1xuICAgICAgICBsZXQgcmVhZG1lRmlsZSA9IGRpcm5hbWUgKyBwYXRoLnNlcCArIHBhdGguYmFzZW5hbWUoZmlsZSwgJy50cycpICsgJy5tZCc7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbGVFbmdpbmUuZXhpc3RzU3luYyhyZWFkbWVGaWxlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbXBvbmVudFJlYWRtZUZpbGUoZmlsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGRpcm5hbWUgPSBwYXRoLmRpcm5hbWUoZmlsZSk7XG4gICAgICAgIGxldCByZWFkbWVGaWxlID0gZGlybmFtZSArIHBhdGguc2VwICsgJ1JFQURNRS5tZCc7XG4gICAgICAgIGxldCByZWFkbWVBbHRlcm5hdGl2ZUZpbGUgPSBkaXJuYW1lICsgcGF0aC5zZXAgKyBwYXRoLmJhc2VuYW1lKGZpbGUsICcudHMnKSArICcubWQnO1xuICAgICAgICBsZXQgZmluYWxQYXRoID0gJyc7XG4gICAgICAgIGlmICh0aGlzLmZpbGVFbmdpbmUuZXhpc3RzU3luYyhyZWFkbWVGaWxlKSkge1xuICAgICAgICAgICAgZmluYWxQYXRoID0gcmVhZG1lRmlsZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZpbmFsUGF0aCA9IHJlYWRtZUFsdGVybmF0aXZlRmlsZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmluYWxQYXRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhbnkgb2YgdGhlIG1hcmtkb3duIGZpbGVzIGlzIGV4aXN0cyB3aXRoIG9yIHdpdGhvdXQgZW5kaW5nc1xuICAgICAqL1xuICAgIHB1YmxpYyBoYXNSb290TWFya2Rvd25zKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRFbmRpbmdzKHRoaXMubWFya2Rvd25GaWxlcykuc29tZSh4ID0+XG4gICAgICAgICAgICB0aGlzLmZpbGVFbmdpbmUuZXhpc3RzU3luYyhwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXAgKyB4KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0Um9vdE1hcmtkb3ducygpOiBzdHJpbmdbXSB7XG4gICAgICAgIGxldCBmb3VuZEZpbGVzID0gdGhpcy5tYXJrZG93bkZpbGVzLmZpbHRlcihcbiAgICAgICAgICAgIHggPT5cbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVFbmdpbmUuZXhpc3RzU3luYyhwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXAgKyB4ICsgJy5tZCcpIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlRW5naW5lLmV4aXN0c1N5bmMocHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwICsgeClcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5hZGRFbmRpbmdzKGZvdW5kRmlsZXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZXNjYXBlKGh0bWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBodG1sXG4gICAgICAgICAgICAucmVwbGFjZSgvJi9nLCAnJmFtcDsnKVxuICAgICAgICAgICAgLnJlcGxhY2UoLzwvZywgJyZsdDsnKVxuICAgICAgICAgICAgLnJlcGxhY2UoLz4vZywgJyZndDsnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1wiL2csICcmcXVvdDsnKVxuICAgICAgICAgICAgLnJlcGxhY2UoLycvZywgJyYjMzk7JylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9AL2csICcmIzY0OycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFsnUkVBRE1FJ10gPT4gWydSRUFETUUnLCAnUkVBRE1FLm1kJ11cbiAgICAgKi9cbiAgICBwcml2YXRlIGFkZEVuZGluZ3MoZmlsZXM6IEFycmF5PHN0cmluZz4pOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIF8uZmxhdE1hcChmaWxlcywgeCA9PiBbeCwgeCArICcubWQnXSk7XG4gICAgfVxufVxuIiwiZXhwb3J0IGNvbnN0IENPTVBPRE9DX0RFRkFVTFRTID0ge1xuICAgIHRpdGxlOiAnQXBwbGljYXRpb24gZG9jdW1lbnRhdGlvbicsXG4gICAgYWRkaXRpb25hbEVudHJ5TmFtZTogJ0FkZGl0aW9uYWwgZG9jdW1lbnRhdGlvbicsXG4gICAgYWRkaXRpb25hbEVudHJ5UGF0aDogJ2FkZGl0aW9uYWwtZG9jdW1lbnRhdGlvbicsXG4gICAgZm9sZGVyOiAnLi9kb2N1bWVudGF0aW9uLycsXG4gICAgcG9ydDogODA4MCxcbiAgICB0aGVtZTogJ2dpdGJvb2snLFxuICAgIGV4cG9ydEZvcm1hdDogJ2h0bWwnLFxuICAgIGV4cG9ydEZvcm1hdHNTdXBwb3J0ZWQ6IFsnaHRtbCcsICdqc29uJ10sXG4gICAgYmFzZTogJy8nLFxuICAgIGRlZmF1bHRDb3ZlcmFnZVRocmVzaG9sZDogNzAsXG4gICAgZGVmYXVsdENvdmVyYWdlTWluaW11bVBlckZpbGU6IDAsXG4gICAgY292ZXJhZ2VUZXN0VGhyZXNob2xkRmFpbDogdHJ1ZSxcbiAgICB0b2dnbGVNZW51SXRlbXM6IFsnYWxsJ10sXG4gICAgbmF2VGFiQ29uZmlnOiBbXSxcbiAgICBkaXNhYmxlU291cmNlQ29kZTogZmFsc2UsXG4gICAgZGlzYWJsZURvbVRyZWU6IGZhbHNlLFxuICAgIGRpc2FibGVUZW1wbGF0ZVRhYjogZmFsc2UsXG4gICAgZGlzYWJsZUdyYXBoOiBmYWxzZSxcbiAgICBkaXNhYmxlTWFpbkdyYXBoOiBmYWxzZSxcbiAgICBkaXNhYmxlQ292ZXJhZ2U6IGZhbHNlLFxuICAgIGRpc2FibGVQcml2YXRlOiBmYWxzZSxcbiAgICBkaXNhYmxlUHJvdGVjdGVkOiBmYWxzZSxcbiAgICBkaXNhYmxlSW50ZXJuYWw6IGZhbHNlLFxuICAgIGRpc2FibGVMaWZlQ3ljbGVIb29rczogZmFsc2UsXG4gICAgZGlzYWJsZVJvdXRlc0dyYXBoOiBmYWxzZSxcbiAgICBQQUdFX1RZUEVTOiB7XG4gICAgICAgIFJPT1Q6ICdyb290JyxcbiAgICAgICAgSU5URVJOQUw6ICdpbnRlcm5hbCdcbiAgICB9LFxuICAgIGdhU2l0ZTogJ2F1dG8nLFxuICAgIGNvdmVyYWdlVGVzdFNob3dPbmx5RmFpbGVkOiBmYWxzZSxcbiAgICBsYW5ndWFnZTogJ2VuLVVTJ1xufTtcbiIsImltcG9ydCB7IENPTVBPRE9DX0RFRkFVTFRTIH0gZnJvbSAnLi4vdXRpbHMvZGVmYXVsdHMnO1xuaW1wb3J0IHsgUGFnZUludGVyZmFjZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9wYWdlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBNYWluRGF0YUludGVyZmFjZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9tYWluLWRhdGEuaW50ZXJmYWNlJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25JbnRlcmZhY2UgfSBmcm9tICcuL2ludGVyZmFjZXMvY29uZmlndXJhdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuXG5leHBvcnQgY2xhc3MgQ29uZmlndXJhdGlvbiBpbXBsZW1lbnRzIENvbmZpZ3VyYXRpb25JbnRlcmZhY2Uge1xuICAgIHByaXZhdGUgX3BhZ2VzOiBQYWdlSW50ZXJmYWNlW10gPSBbXTtcbiAgICBwcml2YXRlIF9tYWluRGF0YTogTWFpbkRhdGFJbnRlcmZhY2UgPSB7XG4gICAgICAgIG91dHB1dDogQ09NUE9ET0NfREVGQVVMVFMuZm9sZGVyLFxuICAgICAgICB0aGVtZTogQ09NUE9ET0NfREVGQVVMVFMudGhlbWUsXG4gICAgICAgIGV4dFRoZW1lOiAnJyxcbiAgICAgICAgc2VydmU6IGZhbHNlLFxuICAgICAgICBwb3J0OiBDT01QT0RPQ19ERUZBVUxUUy5wb3J0LFxuICAgICAgICBvcGVuOiBmYWxzZSxcbiAgICAgICAgYXNzZXRzRm9sZGVyOiAnJyxcbiAgICAgICAgZG9jdW1lbnRhdGlvbk1haW5OYW1lOiBDT01QT0RPQ19ERUZBVUxUUy50aXRsZSxcbiAgICAgICAgZG9jdW1lbnRhdGlvbk1haW5EZXNjcmlwdGlvbjogJycsXG4gICAgICAgIGJhc2U6IENPTVBPRE9DX0RFRkFVTFRTLmJhc2UsXG4gICAgICAgIGhpZGVHZW5lcmF0b3I6IGZhbHNlLFxuICAgICAgICBtb2R1bGVzOiBbXSxcbiAgICAgICAgcmVhZG1lOiBmYWxzZSxcbiAgICAgICAgY2hhbmdlbG9nOiAnJyxcbiAgICAgICAgY29udHJpYnV0aW5nOiAnJyxcbiAgICAgICAgbGljZW5zZTogJycsXG4gICAgICAgIHRvZG86ICcnLFxuICAgICAgICBtYXJrZG93bnM6IFtdLFxuICAgICAgICBhZGRpdGlvbmFsUGFnZXM6IFtdLFxuICAgICAgICBwaXBlczogW10sXG4gICAgICAgIGNsYXNzZXM6IFtdLFxuICAgICAgICBpbnRlcmZhY2VzOiBbXSxcbiAgICAgICAgY29tcG9uZW50czogW10sXG4gICAgICAgIGRpcmVjdGl2ZXM6IFtdLFxuICAgICAgICBpbmplY3RhYmxlczogW10sXG4gICAgICAgIGludGVyY2VwdG9yczogW10sXG4gICAgICAgIGd1YXJkczogW10sXG4gICAgICAgIG1pc2NlbGxhbmVvdXM6IFtdLFxuICAgICAgICByb3V0ZXM6IFtdLFxuICAgICAgICB0c2NvbmZpZzogJycsXG4gICAgICAgIHRvZ2dsZU1lbnVJdGVtczogW10sXG4gICAgICAgIG5hdlRhYkNvbmZpZzogW10sXG4gICAgICAgIGluY2x1ZGVzOiAnJyxcbiAgICAgICAgaW5jbHVkZXNOYW1lOiBDT01QT0RPQ19ERUZBVUxUUy5hZGRpdGlvbmFsRW50cnlOYW1lLFxuICAgICAgICBpbmNsdWRlc0ZvbGRlcjogQ09NUE9ET0NfREVGQVVMVFMuYWRkaXRpb25hbEVudHJ5UGF0aCxcbiAgICAgICAgZGlzYWJsZVNvdXJjZUNvZGU6IENPTVBPRE9DX0RFRkFVTFRTLmRpc2FibGVTb3VyY2VDb2RlLFxuICAgICAgICBkaXNhYmxlRG9tVHJlZTogQ09NUE9ET0NfREVGQVVMVFMuZGlzYWJsZURvbVRyZWUsXG4gICAgICAgIGRpc2FibGVUZW1wbGF0ZVRhYjogQ09NUE9ET0NfREVGQVVMVFMuZGlzYWJsZVRlbXBsYXRlVGFiLFxuICAgICAgICBkaXNhYmxlR3JhcGg6IENPTVBPRE9DX0RFRkFVTFRTLmRpc2FibGVHcmFwaCxcbiAgICAgICAgZGlzYWJsZU1haW5HcmFwaDogQ09NUE9ET0NfREVGQVVMVFMuZGlzYWJsZU1haW5HcmFwaCxcbiAgICAgICAgZGlzYWJsZUNvdmVyYWdlOiBDT01QT0RPQ19ERUZBVUxUUy5kaXNhYmxlQ292ZXJhZ2UsXG4gICAgICAgIGRpc2FibGVQcml2YXRlOiBDT01QT0RPQ19ERUZBVUxUUy5kaXNhYmxlUHJpdmF0ZSxcbiAgICAgICAgZGlzYWJsZUludGVybmFsOiBDT01QT0RPQ19ERUZBVUxUUy5kaXNhYmxlSW50ZXJuYWwsXG4gICAgICAgIGRpc2FibGVQcm90ZWN0ZWQ6IENPTVBPRE9DX0RFRkFVTFRTLmRpc2FibGVQcm90ZWN0ZWQsXG4gICAgICAgIGRpc2FibGVMaWZlQ3ljbGVIb29rczogQ09NUE9ET0NfREVGQVVMVFMuZGlzYWJsZUxpZmVDeWNsZUhvb2tzLFxuICAgICAgICBkaXNhYmxlUm91dGVzR3JhcGg6IENPTVBPRE9DX0RFRkFVTFRTLmRpc2FibGVSb3V0ZXNHcmFwaCxcbiAgICAgICAgd2F0Y2g6IGZhbHNlLFxuICAgICAgICBtYWluR3JhcGg6ICcnLFxuICAgICAgICBjb3ZlcmFnZVRlc3Q6IGZhbHNlLFxuICAgICAgICBjb3ZlcmFnZVRlc3RUaHJlc2hvbGQ6IENPTVBPRE9DX0RFRkFVTFRTLmRlZmF1bHRDb3ZlcmFnZVRocmVzaG9sZCxcbiAgICAgICAgY292ZXJhZ2VUZXN0VGhyZXNob2xkRmFpbDogQ09NUE9ET0NfREVGQVVMVFMuY292ZXJhZ2VUZXN0VGhyZXNob2xkRmFpbCxcbiAgICAgICAgY292ZXJhZ2VUZXN0UGVyRmlsZTogZmFsc2UsXG4gICAgICAgIGNvdmVyYWdlTWluaW11bVBlckZpbGU6IENPTVBPRE9DX0RFRkFVTFRTLmRlZmF1bHRDb3ZlcmFnZU1pbmltdW1QZXJGaWxlLFxuICAgICAgICB1bml0VGVzdENvdmVyYWdlOiAnJyxcbiAgICAgICAgdW5pdFRlc3REYXRhOiB1bmRlZmluZWQsXG4gICAgICAgIGNvdmVyYWdlVGVzdFNob3dPbmx5RmFpbGVkOiBDT01QT0RPQ19ERUZBVUxUUy5jb3ZlcmFnZVRlc3RTaG93T25seUZhaWxlZCxcbiAgICAgICAgcm91dGVzTGVuZ3RoOiAwLFxuICAgICAgICBhbmd1bGFyVmVyc2lvbjogJycsXG4gICAgICAgIGV4cG9ydEZvcm1hdDogQ09NUE9ET0NfREVGQVVMVFMuZXhwb3J0Rm9ybWF0LFxuICAgICAgICBjb3ZlcmFnZURhdGE6IHt9LFxuICAgICAgICBjdXN0b21GYXZpY29uOiAnJyxcbiAgICAgICAgcGFja2FnZURlcGVuZGVuY2llczogW10sXG4gICAgICAgIHBhY2thZ2VQZWVyRGVwZW5kZW5jaWVzOiBbXSxcbiAgICAgICAgZ2FJRDogJycsXG4gICAgICAgIGdhU2l0ZTogJycsXG4gICAgICAgIGFuZ3VsYXJQcm9qZWN0OiBmYWxzZSxcbiAgICAgICAgYW5ndWxhckpTUHJvamVjdDogZmFsc2UsXG4gICAgICAgIGxhbmd1YWdlOiBDT01QT0RPQ19ERUZBVUxUUy5sYW5ndWFnZVxuICAgIH07XG5cbiAgICBwdWJsaWMgYWRkUGFnZShwYWdlOiBQYWdlSW50ZXJmYWNlKSB7XG4gICAgICAgIGxldCBpbmRleFBhZ2UgPSBfLmZpbmRJbmRleCh0aGlzLl9wYWdlcywgeyBuYW1lOiBwYWdlLm5hbWUgfSk7XG4gICAgICAgIGlmIChpbmRleFBhZ2UgPT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLl9wYWdlcy5wdXNoKHBhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGhhc1BhZ2UobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBpbmRleFBhZ2UgPSBfLmZpbmRJbmRleCh0aGlzLl9wYWdlcywgeyBuYW1lOiBuYW1lIH0pO1xuICAgICAgICByZXR1cm4gaW5kZXhQYWdlICE9PSAtMTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkQWRkaXRpb25hbFBhZ2UocGFnZTogUGFnZUludGVyZmFjZSkge1xuICAgICAgICB0aGlzLl9tYWluRGF0YS5hZGRpdGlvbmFsUGFnZXMucHVzaChwYWdlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzZXRQYWdlcygpIHtcbiAgICAgICAgdGhpcy5fcGFnZXMgPSBbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzZXRBZGRpdGlvbmFsUGFnZXMoKSB7XG4gICAgICAgIHRoaXMuX21haW5EYXRhLmFkZGl0aW9uYWxQYWdlcyA9IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyByZXNldFJvb3RNYXJrZG93blBhZ2VzKCkge1xuICAgICAgICBsZXQgaW5kZXhQYWdlID0gXy5maW5kSW5kZXgodGhpcy5fcGFnZXMsIHsgbmFtZTogJ2luZGV4JyB9KTtcbiAgICAgICAgdGhpcy5fcGFnZXMuc3BsaWNlKGluZGV4UGFnZSwgMSk7XG4gICAgICAgIGluZGV4UGFnZSA9IF8uZmluZEluZGV4KHRoaXMuX3BhZ2VzLCB7IG5hbWU6ICdjaGFuZ2Vsb2cnIH0pO1xuICAgICAgICB0aGlzLl9wYWdlcy5zcGxpY2UoaW5kZXhQYWdlLCAxKTtcbiAgICAgICAgaW5kZXhQYWdlID0gXy5maW5kSW5kZXgodGhpcy5fcGFnZXMsIHsgbmFtZTogJ2NvbnRyaWJ1dGluZycgfSk7XG4gICAgICAgIHRoaXMuX3BhZ2VzLnNwbGljZShpbmRleFBhZ2UsIDEpO1xuICAgICAgICBpbmRleFBhZ2UgPSBfLmZpbmRJbmRleCh0aGlzLl9wYWdlcywgeyBuYW1lOiAnbGljZW5zZScgfSk7XG4gICAgICAgIHRoaXMuX3BhZ2VzLnNwbGljZShpbmRleFBhZ2UsIDEpO1xuICAgICAgICBpbmRleFBhZ2UgPSBfLmZpbmRJbmRleCh0aGlzLl9wYWdlcywgeyBuYW1lOiAndG9kbycgfSk7XG4gICAgICAgIHRoaXMuX3BhZ2VzLnNwbGljZShpbmRleFBhZ2UsIDEpO1xuICAgICAgICB0aGlzLl9tYWluRGF0YS5tYXJrZG93bnMgPSBbXTtcbiAgICB9XG5cbiAgICBnZXQgcGFnZXMoKTogUGFnZUludGVyZmFjZVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhZ2VzO1xuICAgIH1cbiAgICBzZXQgcGFnZXMocGFnZXM6IFBhZ2VJbnRlcmZhY2VbXSkge1xuICAgICAgICB0aGlzLl9wYWdlcyA9IFtdO1xuICAgIH1cblxuICAgIGdldCBtYWluRGF0YSgpOiBNYWluRGF0YUludGVyZmFjZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYWluRGF0YTtcbiAgICB9XG4gICAgc2V0IG1haW5EYXRhKGRhdGE6IE1haW5EYXRhSW50ZXJmYWNlKSB7XG4gICAgICAgIChPYmplY3QgYXMgYW55KS5hc3NpZ24odGhpcy5fbWFpbkRhdGEsIGRhdGEpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IERlcGVuZGVuY2llc0VuZ2luZSB9IGZyb20gJy4vZGVwZW5kZW5jaWVzLmVuZ2luZSc7XG5pbXBvcnQgeyBGaWxlRW5naW5lIH0gZnJvbSAnLi9maWxlLmVuZ2luZSc7XG5cbmNvbnN0IG5nZFQgPSByZXF1aXJlKCdAY29tcG9kb2MvbmdkLXRyYW5zZm9ybWVyJyk7XG5cbmV4cG9ydCBjbGFzcyBOZ2RFbmdpbmUge1xuICAgIHB1YmxpYyBlbmdpbmU7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBkZXBlbmRlbmNpZXNFbmdpbmU6IERlcGVuZGVuY2llc0VuZ2luZSxcbiAgICAgICAgcHJpdmF0ZSBmaWxlRW5naW5lOiBGaWxlRW5naW5lID0gbmV3IEZpbGVFbmdpbmUoKVxuICAgICkge31cblxuICAgIHB1YmxpYyBpbml0KG91dHB1dHBhdGg6IHN0cmluZykge1xuICAgICAgICB0aGlzLmVuZ2luZSA9IG5ldyBuZ2RULkRvdEVuZ2luZSh7XG4gICAgICAgICAgICBvdXRwdXQ6IG91dHB1dHBhdGgsXG4gICAgICAgICAgICBkaXNwbGF5TGVnZW5kOiB0cnVlLFxuICAgICAgICAgICAgb3V0cHV0Rm9ybWF0czogJ3N2ZycsXG4gICAgICAgICAgICBzaWxlbnQ6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbmRlckdyYXBoKGZpbGVwYXRoOiBzdHJpbmcsIG91dHB1dHBhdGg6IHN0cmluZywgdHlwZTogc3RyaW5nLCBuYW1lPzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZW5naW5lLnVwZGF0ZU91dHB1dChvdXRwdXRwYXRoKTtcblxuICAgICAgICBpZiAodHlwZSA9PT0gJ2YnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbmdpbmUuZ2VuZXJhdGVHcmFwaChbdGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUuZ2V0UmF3TW9kdWxlKG5hbWUpXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbmdpbmUuZ2VuZXJhdGVHcmFwaCh0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5yYXdNb2R1bGVzRm9yT3ZlcnZpZXcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRHcmFwaChmaWxlcGF0aDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5maWxlRW5naW5lXG4gICAgICAgICAgICAuZ2V0KGZpbGVwYXRoKVxuICAgICAgICAgICAgLmNhdGNoKGVyciA9PiBQcm9taXNlLnJlamVjdCgnRXJyb3IgZHVyaW5nIGdyYXBoIHJlYWQgJyArIG5hbWUpKTtcbiAgICB9XG59XG4iLCJleHBvcnQgY29uc3QgQ09NUE9ET0NfQ09OU1RBTlRTID0ge1xuICAgIG5hdlRhYkRlZmluaXRpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgICdpZCc6ICdpbmZvJyxcbiAgICAgICAgICAgICdocmVmJzogJyNpbmZvJyxcbiAgICAgICAgICAgICdkYXRhLWxpbmsnOiAnaW5mbycsXG4gICAgICAgICAgICAnbGFiZWwnOiAnSW5mbycsXG4gICAgICAgICAgICAnZGVwVHlwZXMnOiBbJ2FsbCddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgICdpZCc6ICdyZWFkbWUnLFxuICAgICAgICAgICAgJ2hyZWYnOiAnI3JlYWRtZScsXG4gICAgICAgICAgICAnZGF0YS1saW5rJzogJ3JlYWRtZScsXG4gICAgICAgICAgICAnbGFiZWwnOiAnUkVBRE1FJyxcbiAgICAgICAgICAgICdkZXBUeXBlcyc6IFsnYWxsJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgJ2lkJzogJ3NvdXJjZScsXG4gICAgICAgICAgICAnaHJlZic6ICcjc291cmNlJyxcbiAgICAgICAgICAgICdkYXRhLWxpbmsnOiAnc291cmNlJyxcbiAgICAgICAgICAgICdsYWJlbCc6ICdTb3VyY2UnLFxuICAgICAgICAgICAgJ2RlcFR5cGVzJzogWydhbGwnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICAnaWQnOiAndGVtcGxhdGVEYXRhJyxcbiAgICAgICAgICAgICdocmVmJzogJyN0ZW1wbGF0ZURhdGEnLFxuICAgICAgICAgICAgJ2RhdGEtbGluayc6ICd0ZW1wbGF0ZScsXG4gICAgICAgICAgICAnbGFiZWwnOiAnVGVtcGxhdGUnLFxuICAgICAgICAgICAgJ2RlcFR5cGVzJzogWydjb21wb25lbnQnXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICAnaWQnOiAndHJlZScsXG4gICAgICAgICAgICAnaHJlZic6ICcjdHJlZScsXG4gICAgICAgICAgICAnZGF0YS1saW5rJzogJ2RvbS10cmVlJyxcbiAgICAgICAgICAgICdsYWJlbCc6ICdET00gVHJlZScsXG4gICAgICAgICAgICAnZGVwVHlwZXMnOiBbJ2NvbXBvbmVudCddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgICdpZCc6ICdleGFtcGxlJyxcbiAgICAgICAgICAgICdocmVmJzogJyNleGFtcGxlJyxcbiAgICAgICAgICAgICdkYXRhLWxpbmsnOiAnZXhhbXBsZScsXG4gICAgICAgICAgICAnbGFiZWwnOiAnRXhhbXBsZXMnLFxuICAgICAgICAgICAgJ2RlcFR5cGVzJzogWydjb21wb25lbnQnLCAnZGlyZWN0aXZlJywgJ2luamVjdGFibGUnLCAncGlwZSddXG4gICAgICAgIH0sXG4gICAgXVxufTtcblxuLyoqXG4gKiBNYXggbGVuZ3RoIGZvciB0aGUgc3RyaW5nIG9mIGEgZmlsZSBkdXJpbmcgTHVuciBzZWFyY2ggZW5naW5lIGluZGV4aW5nLlxuICogUHJldmVudCBzdGFjayBzaXplIGV4Y2VlZGVkXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfU0laRV9GSUxFX1NFQVJDSF9JTkRFWCA9IDUwMDAwO1xuXG4vKipcbiAqIE1heCBsZW5ndGggZm9yIHRoZSBzdHJpbmcgb2YgYSBmaWxlIGR1cmluZyBjaGVlcmlvIHBhcnNpbmcuXG4gKiBQcmV2ZW50IHN0YWNrIHNpemUgZXhjZWVkZWRcbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9TSVpFX0ZJTEVfQ0hFRVJJT19QQVJTSU5HID0gNDAwMDAwMDAwO1xuIiwiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIEhhbmRsZWJhcnMgZnJvbSAnaGFuZGxlYmFycyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi9sb2dnZXInO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY29uZmlndXJhdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRmlsZUVuZ2luZSB9IGZyb20gJy4vZmlsZS5lbmdpbmUnO1xuaW1wb3J0IHsgTUFYX1NJWkVfRklMRV9TRUFSQ0hfSU5ERVgsIE1BWF9TSVpFX0ZJTEVfQ0hFRVJJT19QQVJTSU5HIH0gZnJvbSAnLi4vLi4vdXRpbHMvY29uc3RhbnRzJztcblxuY29uc3QgbHVucjogYW55ID0gcmVxdWlyZSgnbHVucicpO1xuY29uc3QgY2hlZXJpbzogYW55ID0gcmVxdWlyZSgnY2hlZXJpbycpO1xuY29uc3QgRW50aXRpZXM6IGFueSA9IHJlcXVpcmUoJ2h0bWwtZW50aXRpZXMnKS5BbGxIdG1sRW50aXRpZXM7XG5jb25zdCBIdG1sID0gbmV3IEVudGl0aWVzKCk7XG5cbmV4cG9ydCBjbGFzcyBTZWFyY2hFbmdpbmUge1xuICAgIHB1YmxpYyBzZWFyY2hJbmRleDogYW55O1xuICAgIHByaXZhdGUgc2VhcmNoRG9jdW1lbnRzID0gW107XG4gICAgcHVibGljIGRvY3VtZW50c1N0b3JlOiBPYmplY3QgPSB7fTtcbiAgICBwdWJsaWMgaW5kZXhTaXplOiBudW1iZXI7XG4gICAgcHVibGljIGFtb3VudE9mTWVtb3J5ID0gMDtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGNvbmZpZ3VyYXRpb246IENvbmZpZ3VyYXRpb25JbnRlcmZhY2UsXG4gICAgICAgIHByaXZhdGUgZmlsZUVuZ2luZTogRmlsZUVuZ2luZSA9IG5ldyBGaWxlRW5naW5lKClcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgaW5kZXhQYWdlKHBhZ2UpIHtcbiAgICAgICAgbGV0IHRleHQ7XG4gICAgICAgIHRoaXMuYW1vdW50T2ZNZW1vcnkgKz0gcGFnZS5yYXdEYXRhLmxlbmd0aDtcbiAgICAgICAgaWYgKHRoaXMuYW1vdW50T2ZNZW1vcnkgPCBNQVhfU0laRV9GSUxFX0NIRUVSSU9fUEFSU0lORykge1xuICAgICAgICAgICAgbGV0IGluZGV4U3RhcnRDb250ZW50ID0gcGFnZS5yYXdEYXRhLmluZGV4T2YoJzwhLS0gU1RBUlQgQ09OVEVOVCAtLT4nKTtcbiAgICAgICAgICAgIGxldCBpbmRleEVuZENvbnRlbnQgPSBwYWdlLnJhd0RhdGEuaW5kZXhPZignPCEtLSBFTkQgQ09OVEVOVCAtLT4nKTtcblxuICAgICAgICAgICAgbGV0ICQgPSBjaGVlcmlvLmxvYWQocGFnZS5yYXdEYXRhLnN1YnN0cmluZyhpbmRleFN0YXJ0Q29udGVudCArIDEsIGluZGV4RW5kQ29udGVudCkpO1xuXG4gICAgICAgICAgICB0ZXh0ID0gJCgnLmNvbnRlbnQnKS5odG1sKCk7XG4gICAgICAgICAgICB0ZXh0ID0gSHRtbC5kZWNvZGUodGV4dCk7XG4gICAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC8oPChbXj5dKyk+KS9naSwgJycpO1xuXG4gICAgICAgICAgICBwYWdlLnVybCA9IHBhZ2UudXJsLnJlcGxhY2UodGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dCwgJycpO1xuXG4gICAgICAgICAgICBsZXQgZG9jID0ge1xuICAgICAgICAgICAgICAgIHVybDogcGFnZS51cmwsXG4gICAgICAgICAgICAgICAgdGl0bGU6IHBhZ2UuaW5mb3MuY29udGV4dCArICcgLSAnICsgcGFnZS5pbmZvcy5uYW1lLFxuICAgICAgICAgICAgICAgIGJvZHk6IHRleHRcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhdGhpcy5kb2N1bWVudHNTdG9yZS5oYXNPd25Qcm9wZXJ0eShkb2MudXJsKSAmJlxuICAgICAgICAgICAgICAgIGRvYy5ib2R5Lmxlbmd0aCA8IE1BWF9TSVpFX0ZJTEVfU0VBUkNIX0lOREVYXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRvY3VtZW50c1N0b3JlW2RvYy51cmxdID0gZG9jO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoRG9jdW1lbnRzLnB1c2goZG9jKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZW5lcmF0ZVNlYXJjaEluZGV4SnNvbihvdXRwdXRGb2xkZXI6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgdGhhdCA9IHRoaXM7XG4gICAgICAgIGxldCBzZWFyY2hJbmRleCA9IGx1bnIoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAvKiB0c2xpbnQ6ZGlzYWJsZTpuby1pbnZhbGlkLXRoaXMgKi9cbiAgICAgICAgICAgIHRoaXMucmVmKCd1cmwnKTtcbiAgICAgICAgICAgIHRoaXMuZmllbGQoJ3RpdGxlJyk7XG4gICAgICAgICAgICB0aGlzLmZpZWxkKCdib2R5Jyk7XG5cbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGxldCBsZW4gPSB0aGF0LnNlYXJjaERvY3VtZW50cy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkKHRoYXQuc2VhcmNoRG9jdW1lbnRzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbGVFbmdpbmUuZ2V0KF9fZGlybmFtZSArICcvLi4vc3JjL3RlbXBsYXRlcy9wYXJ0aWFscy9zZWFyY2gtaW5kZXguaGJzJykudGhlbihcbiAgICAgICAgICAgIGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB0ZW1wbGF0ZTogYW55ID0gSGFuZGxlYmFycy5jb21waWxlKGRhdGEpO1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSB0ZW1wbGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4OiBKU09OLnN0cmluZ2lmeShzZWFyY2hJbmRleCksXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlOiBKU09OLnN0cmluZ2lmeSh0aGlzLmRvY3VtZW50c1N0b3JlKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGxldCB0ZXN0T3V0cHV0RGlyID0gb3V0cHV0Rm9sZGVyLm1hdGNoKHByb2Nlc3MuY3dkKCkpO1xuICAgICAgICAgICAgICAgIGlmICh0ZXN0T3V0cHV0RGlyICYmIHRlc3RPdXRwdXREaXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRGb2xkZXIgPSBvdXRwdXRGb2xkZXIucmVwbGFjZShwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXAsICcnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maWxlRW5naW5lXG4gICAgICAgICAgICAgICAgICAgIC53cml0ZShvdXRwdXRGb2xkZXIgKyBwYXRoLnNlcCArICcvanMvc2VhcmNoL3NlYXJjaF9pbmRleC5qcycsIHJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGR1cmluZyBzZWFyY2ggaW5kZXggZmlsZSBnZW5lcmF0aW9uICcsIGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyID0+IFByb21pc2UucmVqZWN0KCdFcnJvciBkdXJpbmcgc2VhcmNoIGluZGV4IGdlbmVyYXRpb24nKVxuICAgICAgICApO1xuICAgIH1cbn1cbiIsImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL2xvZ2dlcic7XG5pbXBvcnQgeyBEZXBlbmRlbmNpZXNFbmdpbmUgfSBmcm9tICcuL2RlcGVuZGVuY2llcy5lbmdpbmUnO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY29uZmlndXJhdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRmlsZUVuZ2luZSB9IGZyb20gJy4vZmlsZS5lbmdpbmUnO1xuXG5pbXBvcnQgeyBFeHBvcnREYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9leHBvcnQtZGF0YS5pbnRlcmZhY2UnO1xuXG5pbXBvcnQgeyBBbmd1bGFyTmdNb2R1bGVOb2RlIH0gZnJvbSAnLi4vbm9kZXMvYW5ndWxhci1uZ21vZHVsZS1ub2RlJztcblxuY29uc3QgdHJhdmVyc2UgPSByZXF1aXJlKCd0cmF2ZXJzZScpO1xuXG5leHBvcnQgY2xhc3MgRXhwb3J0SnNvbkVuZ2luZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgY29uZmlndXJhdGlvbjogQ29uZmlndXJhdGlvbkludGVyZmFjZSxcbiAgICAgICAgcHJpdmF0ZSBkZXBlbmRlbmNpZXNFbmdpbmU6IERlcGVuZGVuY2llc0VuZ2luZSxcbiAgICAgICAgcHJpdmF0ZSBmaWxlRW5naW5lOiBGaWxlRW5naW5lID0gbmV3IEZpbGVFbmdpbmUoKVxuICAgICkge31cblxuICAgIGV4cG9ydChvdXRwdXRGb2xkZXIsIGRhdGEpIHtcbiAgICAgICAgbGV0IGV4cG9ydERhdGE6IEV4cG9ydERhdGEgPSB7fTtcblxuICAgICAgICB0cmF2ZXJzZShkYXRhKS5mb3JFYWNoKGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUucGFyZW50KSBkZWxldGUgbm9kZS5wYXJlbnQ7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuaW5pdGlhbGl6ZXIpIGRlbGV0ZSBub2RlLmluaXRpYWxpemVyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBleHBvcnREYXRhLnBpcGVzID0gZGF0YS5waXBlcztcbiAgICAgICAgZXhwb3J0RGF0YS5pbnRlcmZhY2VzID0gZGF0YS5pbnRlcmZhY2VzO1xuICAgICAgICBleHBvcnREYXRhLmluamVjdGFibGVzID0gZGF0YS5pbmplY3RhYmxlcztcbiAgICAgICAgZXhwb3J0RGF0YS5jbGFzc2VzID0gZGF0YS5jbGFzc2VzO1xuICAgICAgICBleHBvcnREYXRhLmRpcmVjdGl2ZXMgPSBkYXRhLmRpcmVjdGl2ZXM7XG4gICAgICAgIGV4cG9ydERhdGEuY29tcG9uZW50cyA9IGRhdGEuY29tcG9uZW50cztcbiAgICAgICAgZXhwb3J0RGF0YS5tb2R1bGVzID0gdGhpcy5wcm9jZXNzTW9kdWxlcygpO1xuICAgICAgICBleHBvcnREYXRhLm1pc2NlbGxhbmVvdXMgPSBkYXRhLm1pc2NlbGxhbmVvdXM7XG4gICAgICAgIGV4cG9ydERhdGEucm91dGVzID0gZGF0YS5yb3V0ZXM7XG4gICAgICAgIGV4cG9ydERhdGEuY292ZXJhZ2UgPSBkYXRhLmNvdmVyYWdlRGF0YTtcblxuICAgICAgICByZXR1cm4gdGhpcy5maWxlRW5naW5lXG4gICAgICAgICAgICAud3JpdGUoXG4gICAgICAgICAgICAgICAgb3V0cHV0Rm9sZGVyICsgcGF0aC5zZXAgKyAnL2RvY3VtZW50YXRpb24uanNvbicsXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoZXhwb3J0RGF0YSwgbnVsbCwgNClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgZHVyaW5nIGV4cG9ydCBmaWxlIGdlbmVyYXRpb24gJywgZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByb2Nlc3NNb2R1bGVzKCkge1xuICAgICAgICBjb25zdCBtb2R1bGVzOiBBbmd1bGFyTmdNb2R1bGVOb2RlW10gPSB0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5nZXRNb2R1bGVzKCk7XG5cbiAgICAgICAgbGV0IF9yZXN1bHRlZE1vZHVsZXMgPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBtb2R1bGVOciA9IDA7IG1vZHVsZU5yIDwgbW9kdWxlcy5sZW5ndGg7IG1vZHVsZU5yKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG1vZHVsZUVsZW1lbnQgPSB7XG4gICAgICAgICAgICAgICAgbmFtZTogbW9kdWxlc1ttb2R1bGVOcl0ubmFtZSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAncHJvdmlkZXJzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzOiBbXVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGVjbGFyYXRpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzOiBbXVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnaW1wb3J0cycsXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50czogW11cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2V4cG9ydHMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHM6IFtdXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdib290c3RyYXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHM6IFtdXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjbGFzc2VzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzOiBbXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBtb2R1bGVzW21vZHVsZU5yXS5wcm92aWRlcnMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm92aWRlckVsZW1lbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG1vZHVsZXNbbW9kdWxlTnJdLnByb3ZpZGVyc1trXS5uYW1lXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBtb2R1bGVFbGVtZW50LmNoaWxkcmVuWzBdLmVsZW1lbnRzLnB1c2gocHJvdmlkZXJFbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbW9kdWxlc1ttb2R1bGVOcl0uZGVjbGFyYXRpb25zLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVjbGFyYXRpb25FbGVtZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBtb2R1bGVzW21vZHVsZU5yXS5kZWNsYXJhdGlvbnNba10ubmFtZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbW9kdWxlRWxlbWVudC5jaGlsZHJlblsxXS5lbGVtZW50cy5wdXNoKGRlY2xhcmF0aW9uRWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IG1vZHVsZXNbbW9kdWxlTnJdLmltcG9ydHMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbXBvcnRFbGVtZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBtb2R1bGVzW21vZHVsZU5yXS5pbXBvcnRzW2tdLm5hbWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1vZHVsZUVsZW1lbnQuY2hpbGRyZW5bMl0uZWxlbWVudHMucHVzaChpbXBvcnRFbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbW9kdWxlc1ttb2R1bGVOcl0uZXhwb3J0cy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4cG9ydEVsZW1lbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG1vZHVsZXNbbW9kdWxlTnJdLmV4cG9ydHNba10ubmFtZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbW9kdWxlRWxlbWVudC5jaGlsZHJlblszXS5lbGVtZW50cy5wdXNoKGV4cG9ydEVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBtb2R1bGVzW21vZHVsZU5yXS5ib290c3RyYXAubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBib290c3RyYXBFbGVtZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBtb2R1bGVzW21vZHVsZU5yXS5ib290c3RyYXBba10ubmFtZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbW9kdWxlRWxlbWVudC5jaGlsZHJlbls0XS5lbGVtZW50cy5wdXNoKGJvb3RzdHJhcEVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfcmVzdWx0ZWRNb2R1bGVzLnB1c2gobW9kdWxlRWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gX3Jlc3VsdGVkTW9kdWxlcztcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBEZXBlbmRlbmNpZXNFbmdpbmUgfSBmcm9tICcuL2RlcGVuZGVuY2llcy5lbmdpbmUnO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY29uZmlndXJhdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRmlsZUVuZ2luZSB9IGZyb20gJy4vZmlsZS5lbmdpbmUnO1xuXG5pbXBvcnQgeyBFeHBvcnRKc29uRW5naW5lIH0gZnJvbSAnLi9leHBvcnQtanNvbi5lbmdpbmUnO1xuXG5leHBvcnQgY2xhc3MgRXhwb3J0RW5naW5lIHtcbiAgICBwcml2YXRlIF9lbmdpbmU7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBjb25maWd1cmF0aW9uOiBDb25maWd1cmF0aW9uSW50ZXJmYWNlLFxuICAgICAgICBwcml2YXRlIGRlcGVuZGVuY2llc0VuZ2luZTogRGVwZW5kZW5jaWVzRW5naW5lLFxuICAgICAgICBwcml2YXRlIGZpbGVFbmdpbmU6IEZpbGVFbmdpbmUgPSBuZXcgRmlsZUVuZ2luZSgpXG4gICAgKSB7fVxuXG4gICAgZXhwb3J0KG91dHB1dEZvbGRlciwgZGF0YSkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5leHBvcnRGb3JtYXQpIHtcbiAgICAgICAgICAgIGNhc2UgJ2pzb24nOlxuICAgICAgICAgICAgICAgIHRoaXMuX2VuZ2luZSA9IG5ldyBFeHBvcnRKc29uRW5naW5lKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGVFbmdpbmVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmdpbmUuZXhwb3J0KG91dHB1dEZvbGRlciwgZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgRmlsZUVuZ2luZSB9IGZyb20gJy4vZmlsZS5lbmdpbmUnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vbG9nZ2VyJztcblxuY29uc3QgJDogYW55ID0gcmVxdWlyZSgnY2hlZXJpbycpO1xuXG5jbGFzcyBDb21wb25lbnRzVHJlZUVuZ2luZSB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBDb21wb25lbnRzVHJlZUVuZ2luZSA9IG5ldyBDb21wb25lbnRzVHJlZUVuZ2luZSgpO1xuICAgIHByaXZhdGUgY29tcG9uZW50czogYW55W10gPSBbXTtcbiAgICBwcml2YXRlIGNvbXBvbmVudHNGb3JUcmVlOiBhbnlbXSA9IFtdO1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZmlsZUVuZ2luZTogRmlsZUVuZ2luZSA9IG5ldyBGaWxlRW5naW5lKCkpIHtcbiAgICAgICAgaWYgKENvbXBvbmVudHNUcmVlRW5naW5lLl9pbnN0YW5jZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFcnJvcjogSW5zdGFudGlhdGlvbiBmYWlsZWQ6IFVzZSBDb21wb25lbnRzVHJlZUVuZ2luZS5nZXRJbnN0YW5jZSgpIGluc3RlYWQgb2YgbmV3LicpO1xuICAgICAgICB9XG4gICAgICAgIENvbXBvbmVudHNUcmVlRW5naW5lLl9pbnN0YW5jZSA9IHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBDb21wb25lbnRzVHJlZUVuZ2luZSB7XG4gICAgICAgIHJldHVybiBDb21wb25lbnRzVHJlZUVuZ2luZS5faW5zdGFuY2U7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZENvbXBvbmVudChjb21wb25lbnQpIHtcbiAgICAgICAgdGhpcy5jb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlYWRUZW1wbGF0ZXMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBsZXQgbGVuID0gdGhpcy5jb21wb25lbnRzRm9yVHJlZS5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgbG9vcCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaSA8PSBsZW4gLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbXBvbmVudHNGb3JUcmVlW2ldLnRlbXBsYXRlVXJsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmlsZVBhdGggPSBwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXAgKyBwYXRoLmRpcm5hbWUodGhpcy5jb21wb25lbnRzRm9yVHJlZVtpXS5maWxlKSArIHBhdGguc2VwICsgdGhpcy5jb21wb25lbnRzRm9yVHJlZVtpXS50ZW1wbGF0ZVVybDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsZUVuZ2luZS5nZXQoZmlsZVBhdGgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKHRlbXBsYXRlRGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNGb3JUcmVlW2ldLnRlbXBsYXRlRGF0YSA9IHRlbXBsYXRlRGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c0ZvclRyZWVbaV0udGVtcGxhdGVEYXRhID0gdGhpcy5jb21wb25lbnRzRm9yVHJlZVtpXS50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRDaGlsZHJlbkFuZFBhcmVudHMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBfLmZvckVhY2godGhpcy5jb21wb25lbnRzRm9yVHJlZSwgKGNvbXBvbmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCAkY29tcG9uZW50ID0gJChjb21wb25lbnQudGVtcGxhdGVEYXRhKTtcbiAgICAgICAgICAgICAgICBfLmZvckVhY2godGhpcy5jb21wb25lbnRzRm9yVHJlZSwgKGNvbXBvbmVudFRvRmluZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoJGNvbXBvbmVudC5maW5kKGNvbXBvbmVudFRvRmluZC5zZWxlY3RvcikubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coY29tcG9uZW50VG9GaW5kLm5hbWUgKyAnIGZvdW5kIGluICcgKyBjb21wb25lbnQubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuY2hpbGRyZW4ucHVzaChjb21wb25lbnRUb0ZpbmQubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZVRyZWVzRm9yQ29tcG9uZW50cygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh0aGlzLmNvbXBvbmVudHMsIChjb21wb25lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgX2NvbXBvbmVudCA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogY29tcG9uZW50Lm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGZpbGU6IGNvbXBvbmVudC5maWxlLFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogY29tcG9uZW50LnNlbGVjdG9yLFxuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICcnXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC50ZW1wbGF0ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgX2NvbXBvbmVudC50ZW1wbGF0ZSA9IGNvbXBvbmVudC50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC50ZW1wbGF0ZVVybC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIF9jb21wb25lbnQudGVtcGxhdGVVcmwgPSBjb21wb25lbnQudGVtcGxhdGVVcmxbMF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c0ZvclRyZWUucHVzaChfY29tcG9uZW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5yZWFkVGVtcGxhdGVzKClcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZENoaWxkcmVuQW5kUGFyZW50cygpXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3RoaXMuY29tcG9uZW50c0ZvclRyZWU6ICcsIHRoaXMuY29tcG9uZW50c0ZvclRyZWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSwgKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCAkY29tcG9uZW50c1RyZWVFbmdpbmUgPSBDb21wb25lbnRzVHJlZUVuZ2luZS5nZXRJbnN0YW5jZSgpO1xuIiwiaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICd1dGlsJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IHRzLCBTeW50YXhLaW5kIH0gZnJvbSAndHMtc2ltcGxlLWFzdCc7XG5cbmltcG9ydCB7IGdldE5hbWVzQ29tcGFyZUZuLCBtZXJnZVRhZ3NBbmRBcmdzLCBtYXJrZWR0YWdzIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IHsga2luZFRvVHlwZSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3V0aWxzL2tpbmQtdG8tdHlwZSc7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uSW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vaW50ZXJmYWNlcy9jb25maWd1cmF0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBKc2RvY1BhcnNlclV0aWwgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi91dGlscy9qc2RvYy1wYXJzZXIudXRpbCc7XG5pbXBvcnQgeyBJbXBvcnRzVXRpbCB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3V0aWxzL2ltcG9ydHMudXRpbCc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9sb2dnZXInO1xuaW1wb3J0IHsgaXNJZ25vcmUgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi91dGlscyc7XG5cbmNvbnN0IGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuY29uc3QgbWFya2VkID0gcmVxdWlyZSgnbWFya2VkJyk7XG5cbmV4cG9ydCBjbGFzcyBDbGFzc0hlbHBlciB7XG4gICAgcHJpdmF0ZSBqc2RvY1BhcnNlclV0aWwgPSBuZXcgSnNkb2NQYXJzZXJVdGlsKCk7XG4gICAgcHJpdmF0ZSBpbXBvcnRzVXRpbCA9IG5ldyBJbXBvcnRzVXRpbCgpO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgdHlwZUNoZWNrZXI6IHRzLlR5cGVDaGVja2VyLFxuICAgICAgICBwcml2YXRlIGNvbmZpZ3VyYXRpb246IENvbmZpZ3VyYXRpb25JbnRlcmZhY2VcbiAgICApIHt9XG5cbiAgICAvKipcbiAgICAgKiBIRUxQRVJTXG4gICAgICovXG5cbiAgICBwdWJsaWMgc3RyaW5naWZ5RGVmYXVsdFZhbHVlKG5vZGU6IHRzLk5vZGUpOiBzdHJpbmcge1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29weXJpZ2h0IGh0dHBzOi8vZ2l0aHViLmNvbS9uZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXG4gICAgICAgICAqL1xuICAgICAgICBpZiAobm9kZS5nZXRUZXh0KCkpIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlLmdldFRleHQoKTtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlLmtpbmQgPT09IFN5bnRheEtpbmQuRmFsc2VLZXl3b3JkKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2ZhbHNlJztcbiAgICAgICAgfSBlbHNlIGlmIChub2RlLmtpbmQgPT09IFN5bnRheEtpbmQuVHJ1ZUtleXdvcmQpIHtcbiAgICAgICAgICAgIHJldHVybiAndHJ1ZSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldERlY29yYXRvck9mVHlwZShub2RlLCBkZWNvcmF0b3JUeXBlKSB7XG4gICAgICAgIGxldCBkZWNvcmF0b3JzID0gbm9kZS5kZWNvcmF0b3JzIHx8IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVjb3JhdG9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGRlY29yYXRvcnNbaV0uZXhwcmVzc2lvbi5leHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlY29yYXRvcnNbaV0uZXhwcmVzc2lvbi5leHByZXNzaW9uLnRleHQgPT09IGRlY29yYXRvclR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlY29yYXRvcnNbaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZvcm1hdERlY29yYXRvcnMoZGVjb3JhdG9ycykge1xuICAgICAgICBsZXQgX2RlY29yYXRvcnMgPSBbXTtcblxuICAgICAgICBfLmZvckVhY2goZGVjb3JhdG9ycywgKGRlY29yYXRvcjogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoZGVjb3JhdG9yLmV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVjb3JhdG9yLmV4cHJlc3Npb24udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICBfZGVjb3JhdG9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGRlY29yYXRvci5leHByZXNzaW9uLnRleHRcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkZWNvcmF0b3IuZXhwcmVzc2lvbi5leHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmZvOiBhbnkgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBkZWNvcmF0b3IuZXhwcmVzc2lvbi5leHByZXNzaW9uLnRleHRcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlY29yYXRvci5leHByZXNzaW9uLmV4cHJlc3Npb24uYXJndW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVjb3JhdG9yLmV4cHJlc3Npb24uZXhwcmVzc2lvbi5hcmd1bWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uYXJncyA9IGRlY29yYXRvci5leHByZXNzaW9uLmV4cHJlc3Npb24uYXJndW1lbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF9kZWNvcmF0b3JzLnB1c2goaW5mbyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gX2RlY29yYXRvcnM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRQb3NpdGlvbihub2RlOiB0cy5Ob2RlLCBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlKTogdHMuTGluZUFuZENoYXJhY3RlciB7XG4gICAgICAgIGxldCBwb3NpdGlvbjogdHMuTGluZUFuZENoYXJhY3RlcjtcbiAgICAgICAgaWYgKG5vZGUubmFtZSAmJiBub2RlLm5hbWUuZW5kKSB7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IHRzLmdldExpbmVBbmRDaGFyYWN0ZXJPZlBvc2l0aW9uKHNvdXJjZUZpbGUsIG5vZGUubmFtZS5lbmQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcG9zaXRpb24gPSB0cy5nZXRMaW5lQW5kQ2hhcmFjdGVyT2ZQb3NpdGlvbihzb3VyY2VGaWxlLCBub2RlLnBvcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBvc2l0aW9uO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkQWNjZXNzb3IoYWNjZXNzb3JzLCBub2RlQWNjZXNzb3IsIHNvdXJjZUZpbGUpIHtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gJyc7XG4gICAgICAgIGlmIChub2RlQWNjZXNzb3IubmFtZSkge1xuICAgICAgICAgICAgbm9kZU5hbWUgPSBub2RlQWNjZXNzb3IubmFtZS50ZXh0O1xuICAgICAgICAgICAgbGV0IGpzZG9jdGFncyA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldEpTRG9jcyhub2RlQWNjZXNzb3IpO1xuXG4gICAgICAgICAgICBpZiAoIWFjY2Vzc29yc1tub2RlTmFtZV0pIHtcbiAgICAgICAgICAgICAgICBhY2Nlc3NvcnNbbm9kZU5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBub2RlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgc2V0U2lnbmF0dXJlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGdldFNpZ25hdHVyZTogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG5vZGVBY2Nlc3Nvci5raW5kID09PSBTeW50YXhLaW5kLlNldEFjY2Vzc29yKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNldFNpZ25hdHVyZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogbm9kZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2b2lkJyxcbiAgICAgICAgICAgICAgICAgICAgYXJnczogbm9kZUFjY2Vzc29yLnBhcmFtZXRlcnMubWFwKHBhcmFtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcGFyYW0ubmFtZS50ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHBhcmFtLnR5cGUgPyBraW5kVG9UeXBlKHBhcmFtLnR5cGUua2luZCkgOiAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGU6IG5vZGVBY2Nlc3Nvci50eXBlID8gdGhpcy52aXNpdFR5cGUobm9kZUFjY2Vzc29yLnR5cGUpIDogJ3ZvaWQnLFxuICAgICAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLmdldFBvc2l0aW9uKG5vZGVBY2Nlc3Nvciwgc291cmNlRmlsZSkubGluZSArIDFcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKG5vZGVBY2Nlc3Nvci5qc0RvYyAmJiBub2RlQWNjZXNzb3IuanNEb2MubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbW1lbnQgPSBub2RlQWNjZXNzb3IuanNEb2NbMF0uY29tbWVudDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb21tZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2lnbmF0dXJlLmRlc2NyaXB0aW9uID0gbWFya2VkKGNvbW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGpzZG9jdGFncyAmJiBqc2RvY3RhZ3MubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzZG9jdGFnc1swXS50YWdzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRTaWduYXR1cmUuanNkb2N0YWdzID0gbWFya2VkdGFncyhqc2RvY3RhZ3NbMF0udGFncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNldFNpZ25hdHVyZS5qc2RvY3RhZ3MgJiYgc2V0U2lnbmF0dXJlLmpzZG9jdGFncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldFNpZ25hdHVyZS5qc2RvY3RhZ3MgPSBtZXJnZVRhZ3NBbmRBcmdzKFxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2lnbmF0dXJlLmFyZ3MsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRTaWduYXR1cmUuanNkb2N0YWdzXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZXRTaWduYXR1cmUuYXJncyAmJiBzZXRTaWduYXR1cmUuYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldFNpZ25hdHVyZS5qc2RvY3RhZ3MgPSBtZXJnZVRhZ3NBbmRBcmdzKHNldFNpZ25hdHVyZS5hcmdzKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBhY2Nlc3NvcnNbbm9kZU5hbWVdLnNldFNpZ25hdHVyZSA9IHNldFNpZ25hdHVyZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub2RlQWNjZXNzb3Iua2luZCA9PT0gU3ludGF4S2luZC5HZXRBY2Nlc3Nvcikge1xuICAgICAgICAgICAgICAgIGxldCBnZXRTaWduYXR1cmUgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG5vZGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBub2RlQWNjZXNzb3IudHlwZSA/IGtpbmRUb1R5cGUobm9kZUFjY2Vzc29yLnR5cGUua2luZCkgOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZTogbm9kZUFjY2Vzc29yLnR5cGUgPyB0aGlzLnZpc2l0VHlwZShub2RlQWNjZXNzb3IudHlwZSkgOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgbGluZTogdGhpcy5nZXRQb3NpdGlvbihub2RlQWNjZXNzb3IsIHNvdXJjZUZpbGUpLmxpbmUgKyAxXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGlmIChub2RlQWNjZXNzb3IuanNEb2MgJiYgbm9kZUFjY2Vzc29yLmpzRG9jLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb21tZW50ID0gbm9kZUFjY2Vzc29yLmpzRG9jWzBdLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29tbWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldFNpZ25hdHVyZS5kZXNjcmlwdGlvbiA9IG1hcmtlZChjb21tZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChqc2RvY3RhZ3MgJiYganNkb2N0YWdzLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc2RvY3RhZ3NbMF0udGFncykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2lnbmF0dXJlLmpzZG9jdGFncyA9IG1hcmtlZHRhZ3MoanNkb2N0YWdzWzBdLnRhZ3MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYWNjZXNzb3JzW25vZGVOYW1lXS5nZXRTaWduYXR1cmUgPSBnZXRTaWduYXR1cmU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGlzRGlyZWN0aXZlRGVjb3JhdG9yKGRlY29yYXRvcjogdHMuRGVjb3JhdG9yKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChkZWNvcmF0b3IuZXhwcmVzc2lvbi5leHByZXNzaW9uKSB7XG4gICAgICAgICAgICBsZXQgZGVjb3JhdG9ySWRlbnRpZmllclRleHQgPSBkZWNvcmF0b3IuZXhwcmVzc2lvbi5leHByZXNzaW9uLnRleHQ7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIGRlY29yYXRvcklkZW50aWZpZXJUZXh0ID09PSAnRGlyZWN0aXZlJyB8fCBkZWNvcmF0b3JJZGVudGlmaWVyVGV4dCA9PT0gJ0NvbXBvbmVudCdcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGlzU2VydmljZURlY29yYXRvcihkZWNvcmF0b3IpIHtcbiAgICAgICAgcmV0dXJuIGRlY29yYXRvci5leHByZXNzaW9uLmV4cHJlc3Npb25cbiAgICAgICAgICAgID8gZGVjb3JhdG9yLmV4cHJlc3Npb24uZXhwcmVzc2lvbi50ZXh0ID09PSAnSW5qZWN0YWJsZSdcbiAgICAgICAgICAgIDogZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1ByaXZhdGUobWVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb3B5cmlnaHQgaHR0cHM6Ly9naXRodWIuY29tL25nLWJvb3RzdHJhcC9uZy1ib290c3RyYXBcbiAgICAgICAgICovXG4gICAgICAgIGlmIChtZW1iZXIubW9kaWZpZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBpc1ByaXZhdGU6IGJvb2xlYW4gPSBtZW1iZXIubW9kaWZpZXJzLnNvbWUoXG4gICAgICAgICAgICAgICAgbW9kaWZpZXIgPT4gbW9kaWZpZXIua2luZCA9PT0gU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChpc1ByaXZhdGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5pc0hpZGRlbk1lbWJlcihtZW1iZXIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNQcm90ZWN0ZWQobWVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChtZW1iZXIubW9kaWZpZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBpc1Byb3RlY3RlZDogYm9vbGVhbiA9IG1lbWJlci5tb2RpZmllcnMuc29tZShcbiAgICAgICAgICAgICAgICBtb2RpZmllciA9PiBtb2RpZmllci5raW5kID09PSBTeW50YXhLaW5kLlByb3RlY3RlZEtleXdvcmRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoaXNQcm90ZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5pc0hpZGRlbk1lbWJlcihtZW1iZXIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNJbnRlcm5hbChtZW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvcHlyaWdodCBodHRwczovL2dpdGh1Yi5jb20vbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcFxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgaW50ZXJuYWxUYWdzOiBzdHJpbmdbXSA9IFsnaW50ZXJuYWwnXTtcbiAgICAgICAgaWYgKG1lbWJlci5qc0RvYykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBkb2Mgb2YgbWVtYmVyLmpzRG9jKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRvYy50YWdzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdGFnIG9mIGRvYy50YWdzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJuYWxUYWdzLmluZGV4T2YodGFnLnRhZ05hbWUudGV4dCkgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzUHVibGljKG1lbWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAobWVtYmVyLm1vZGlmaWVycykge1xuICAgICAgICAgICAgY29uc3QgaXNQdWJsaWM6IGJvb2xlYW4gPSBtZW1iZXIubW9kaWZpZXJzLnNvbWUoXG4gICAgICAgICAgICAgICAgbW9kaWZpZXIgPT4gbW9kaWZpZXIua2luZCA9PT0gU3ludGF4S2luZC5QdWJsaWNLZXl3b3JkXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGlzUHVibGljKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaXNIaWRkZW5NZW1iZXIobWVtYmVyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzSGlkZGVuTWVtYmVyKG1lbWJlcik6IGJvb2xlYW4ge1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29weXJpZ2h0IGh0dHBzOi8vZ2l0aHViLmNvbS9uZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBpbnRlcm5hbFRhZ3M6IHN0cmluZ1tdID0gWydoaWRkZW4nXTtcbiAgICAgICAgaWYgKG1lbWJlci5qc0RvYykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBkb2Mgb2YgbWVtYmVyLmpzRG9jKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRvYy50YWdzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdGFnIG9mIGRvYy50YWdzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJuYWxUYWdzLmluZGV4T2YodGFnLnRhZ05hbWUudGV4dCkgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzUGlwZURlY29yYXRvcihkZWNvcmF0b3IpIHtcbiAgICAgICAgcmV0dXJuIGRlY29yYXRvci5leHByZXNzaW9uLmV4cHJlc3Npb25cbiAgICAgICAgICAgID8gZGVjb3JhdG9yLmV4cHJlc3Npb24uZXhwcmVzc2lvbi50ZXh0ID09PSAnUGlwZSdcbiAgICAgICAgICAgIDogZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc01vZHVsZURlY29yYXRvcihkZWNvcmF0b3IpIHtcbiAgICAgICAgcmV0dXJuIGRlY29yYXRvci5leHByZXNzaW9uLmV4cHJlc3Npb25cbiAgICAgICAgICAgID8gZGVjb3JhdG9yLmV4cHJlc3Npb24uZXhwcmVzc2lvbi50ZXh0ID09PSAnTmdNb2R1bGUnXG4gICAgICAgICAgICA6IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZJU0lURVJTXG4gICAgICovXG5cbiAgICBwdWJsaWMgdmlzaXRDbGFzc0RlY2xhcmF0aW9uKFxuICAgICAgICBmaWxlTmFtZTogc3RyaW5nLFxuICAgICAgICBjbGFzc0RlY2xhcmF0aW9uOiB0cy5DbGFzc0RlY2xhcmF0aW9uIHwgdHMuSW50ZXJmYWNlRGVjbGFyYXRpb24sXG4gICAgICAgIHNvdXJjZUZpbGU/OiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogYW55IHtcbiAgICAgICAgbGV0IHN5bWJvbCA9IHRoaXMudHlwZUNoZWNrZXIuZ2V0U3ltYm9sQXRMb2NhdGlvbihjbGFzc0RlY2xhcmF0aW9uLm5hbWUpO1xuICAgICAgICBsZXQgZGVzY3JpcHRpb24gPSAnJztcbiAgICAgICAgaWYgKHN5bWJvbCkge1xuICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBtYXJrZWQodGhpcy5qc2RvY1BhcnNlclV0aWwuZ2V0TWFpbkNvbW1lbnRPZk5vZGUoY2xhc3NEZWNsYXJhdGlvbikpO1xuICAgICAgICAgICAgaWYgKHN5bWJvbC52YWx1ZURlY2xhcmF0aW9uICYmIGlzSWdub3JlKHN5bWJvbC52YWx1ZURlY2xhcmF0aW9uKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzeW1ib2wuZGVjbGFyYXRpb25zICYmIHN5bWJvbC5kZWNsYXJhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGlmIChpc0lnbm9yZShzeW1ib2wuZGVjbGFyYXRpb25zWzBdKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgY2xhc3NOYW1lID0gY2xhc3NEZWNsYXJhdGlvbi5uYW1lLnRleHQ7XG4gICAgICAgIGxldCBtZW1iZXJzO1xuICAgICAgICBsZXQgaW1wbGVtZW50c0VsZW1lbnRzID0gW107XG4gICAgICAgIGxldCBleHRlbmRzRWxlbWVudDtcbiAgICAgICAgbGV0IGpzZG9jdGFncyA9IFtdO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdHMuZ2V0Q2xhc3NJbXBsZW1lbnRzSGVyaXRhZ2VDbGF1c2VFbGVtZW50cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGxldCBpbXBsZW1lbnRlZFR5cGVzID0gdHMuZ2V0Q2xhc3NJbXBsZW1lbnRzSGVyaXRhZ2VDbGF1c2VFbGVtZW50cyhjbGFzc0RlY2xhcmF0aW9uKTtcbiAgICAgICAgICAgIGlmIChpbXBsZW1lbnRlZFR5cGVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBsZW4gPSBpbXBsZW1lbnRlZFR5cGVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wbGVtZW50ZWRUeXBlc1tpXS5leHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzRWxlbWVudHMucHVzaChpbXBsZW1lbnRlZFR5cGVzW2ldLmV4cHJlc3Npb24udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHRzLmdldENsYXNzRXh0ZW5kc0hlcml0YWdlQ2xhdXNlRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGxldCBleHRlbmRzVHlwZXMgPSB0cy5nZXRDbGFzc0V4dGVuZHNIZXJpdGFnZUNsYXVzZUVsZW1lbnQoY2xhc3NEZWNsYXJhdGlvbik7XG4gICAgICAgICAgICBpZiAoZXh0ZW5kc1R5cGVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4dGVuZHNUeXBlcy5leHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4dGVuZHNFbGVtZW50ID0gZXh0ZW5kc1R5cGVzLmV4cHJlc3Npb24udGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3ltYm9sKSB7XG4gICAgICAgICAgICBpZiAoc3ltYm9sLnZhbHVlRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBqc2RvY3RhZ3MgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRKU0RvY3Moc3ltYm9sLnZhbHVlRGVjbGFyYXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbWVtYmVycyA9IHRoaXMudmlzaXRNZW1iZXJzKGNsYXNzRGVjbGFyYXRpb24ubWVtYmVycywgc291cmNlRmlsZSk7XG5cbiAgICAgICAgaWYgKGNsYXNzRGVjbGFyYXRpb24uZGVjb3JhdG9ycykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbGFzc0RlY2xhcmF0aW9uLmRlY29yYXRvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0RpcmVjdGl2ZURlY29yYXRvcihjbGFzc0RlY2xhcmF0aW9uLmRlY29yYXRvcnNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0czogbWVtYmVycy5pbnB1dHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRzOiBtZW1iZXJzLm91dHB1dHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBob3N0QmluZGluZ3M6IG1lbWJlcnMuaG9zdEJpbmRpbmdzLFxuICAgICAgICAgICAgICAgICAgICAgICAgaG9zdExpc3RlbmVyczogbWVtYmVycy5ob3N0TGlzdGVuZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczogbWVtYmVycy5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kczogbWVtYmVycy5tZXRob2RzLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhTaWduYXR1cmVzOiBtZW1iZXJzLmluZGV4U2lnbmF0dXJlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQ6IG1lbWJlcnMua2luZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yOiBtZW1iZXJzLmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAganNkb2N0YWdzOiBqc2RvY3RhZ3MsXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRzOiBleHRlbmRzRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHM6IGltcGxlbWVudHNFbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc29yczogbWVtYmVycy5hY2Nlc3NvcnNcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNTZXJ2aWNlRGVjb3JhdG9yKGNsYXNzRGVjbGFyYXRpb24uZGVjb3JhdG9yc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kczogbWVtYmVycy5tZXRob2RzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4U2lnbmF0dXJlczogbWVtYmVycy5pbmRleFNpZ25hdHVyZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczogbWVtYmVycy5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQ6IG1lbWJlcnMua2luZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcjogbWVtYmVycy5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc2RvY3RhZ3M6IGpzZG9jdGFncyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRzOiBleHRlbmRzRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzOiBpbXBsZW1lbnRzRWxlbWVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzb3JzOiBtZW1iZXJzLmFjY2Vzc29yc1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1BpcGVEZWNvcmF0b3IoY2xhc3NEZWNsYXJhdGlvbi5kZWNvcmF0b3JzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc2RvY3RhZ3M6IGpzZG9jdGFncyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBtZW1iZXJzLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kczogbWVtYmVycy5tZXRob2RzXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzTW9kdWxlRGVjb3JhdG9yKGNsYXNzRGVjbGFyYXRpb24uZGVjb3JhdG9yc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAganNkb2N0YWdzOiBqc2RvY3RhZ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHM6IG1lbWJlcnMubWV0aG9kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleFNpZ25hdHVyZXM6IG1lbWJlcnMuaW5kZXhTaWduYXR1cmVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IG1lbWJlcnMucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBraW5kOiBtZW1iZXJzLmtpbmQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3I6IG1lbWJlcnMuY29uc3RydWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAganNkb2N0YWdzOiBqc2RvY3RhZ3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kczogZXh0ZW5kc0VsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50czogaW1wbGVtZW50c0VsZW1lbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc29yczogbWVtYmVycy5hY2Nlc3NvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiBtZW1iZXJzLmlucHV0cyxcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0czogbWVtYmVycy5vdXRwdXRzLFxuICAgICAgICAgICAgICAgICAgICBob3N0QmluZGluZ3M6IG1lbWJlcnMuaG9zdEJpbmRpbmdzLFxuICAgICAgICAgICAgICAgICAgICBob3N0TGlzdGVuZXJzOiBtZW1iZXJzLmhvc3RMaXN0ZW5lcnMsXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZHM6IG1lbWJlcnMubWV0aG9kcyxcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhTaWduYXR1cmVzOiBtZW1iZXJzLmluZGV4U2lnbmF0dXJlcyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczogbWVtYmVycy5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgICAgICBraW5kOiBtZW1iZXJzLmtpbmQsXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yOiBtZW1iZXJzLmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgICAgICAgICBqc2RvY3RhZ3M6IGpzZG9jdGFncyxcbiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kczogZXh0ZW5kc0VsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHM6IGltcGxlbWVudHNFbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgYWNjZXNzb3JzOiBtZW1iZXJzLmFjY2Vzc29yc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kczogbWVtYmVycy5tZXRob2RzLFxuICAgICAgICAgICAgICAgICAgICBpbnB1dHM6IG1lbWJlcnMuaW5wdXRzLFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRzOiBtZW1iZXJzLm91dHB1dHMsXG4gICAgICAgICAgICAgICAgICAgIGhvc3RCaW5kaW5nczogbWVtYmVycy5ob3N0QmluZGluZ3MsXG4gICAgICAgICAgICAgICAgICAgIGhvc3RMaXN0ZW5lcnM6IG1lbWJlcnMuaG9zdExpc3RlbmVycyxcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhTaWduYXR1cmVzOiBtZW1iZXJzLmluZGV4U2lnbmF0dXJlcyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczogbWVtYmVycy5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgICAgICBraW5kOiBtZW1iZXJzLmtpbmQsXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yOiBtZW1iZXJzLmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgICAgICAgICBqc2RvY3RhZ3M6IGpzZG9jdGFncyxcbiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kczogZXh0ZW5kc0VsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHM6IGltcGxlbWVudHNFbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgYWNjZXNzb3JzOiBtZW1iZXJzLmFjY2Vzc29yc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2aXNpdE1lbWJlcnMobWVtYmVycywgc291cmNlRmlsZSkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29weXJpZ2h0IGh0dHBzOi8vZ2l0aHViLmNvbS9uZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXG4gICAgICAgICAqL1xuICAgICAgICBsZXQgaW5wdXRzID0gW107XG4gICAgICAgIGxldCBvdXRwdXRzID0gW107XG4gICAgICAgIGxldCBob3N0QmluZGluZ3MgPSBbXTtcbiAgICAgICAgbGV0IGhvc3RMaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgbGV0IG1ldGhvZHMgPSBbXTtcbiAgICAgICAgbGV0IHByb3BlcnRpZXMgPSBbXTtcbiAgICAgICAgbGV0IGluZGV4U2lnbmF0dXJlcyA9IFtdO1xuICAgICAgICBsZXQga2luZDtcbiAgICAgICAgbGV0IGlucHV0RGVjb3JhdG9yO1xuICAgICAgICBsZXQgaG9zdEJpbmRpbmc7XG4gICAgICAgIGxldCBob3N0TGlzdGVuZXI7XG4gICAgICAgIGxldCBjb25zdHJ1Y3RvcjtcbiAgICAgICAgbGV0IG91dERlY29yYXRvcjtcbiAgICAgICAgbGV0IGFjY2Vzc29ycyA9IHt9O1xuICAgICAgICBsZXQgcmVzdWx0ID0ge307XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAvLyBBbGxvd3MgdHlwZXNjcmlwdCBndWVzcyB0eXBlIHdoZW4gdXNpbmcgdHMuaXMqXG4gICAgICAgICAgICBsZXQgbWVtYmVyID0gbWVtYmVyc1tpXTtcblxuICAgICAgICAgICAgaW5wdXREZWNvcmF0b3IgPSB0aGlzLmdldERlY29yYXRvck9mVHlwZShtZW1iZXIsICdJbnB1dCcpO1xuICAgICAgICAgICAgb3V0RGVjb3JhdG9yID0gdGhpcy5nZXREZWNvcmF0b3JPZlR5cGUobWVtYmVyLCAnT3V0cHV0Jyk7XG4gICAgICAgICAgICBob3N0QmluZGluZyA9IHRoaXMuZ2V0RGVjb3JhdG9yT2ZUeXBlKG1lbWJlciwgJ0hvc3RCaW5kaW5nJyk7XG4gICAgICAgICAgICBob3N0TGlzdGVuZXIgPSB0aGlzLmdldERlY29yYXRvck9mVHlwZShtZW1iZXIsICdIb3N0TGlzdGVuZXInKTtcblxuICAgICAgICAgICAga2luZCA9IG1lbWJlci5raW5kO1xuXG4gICAgICAgICAgICBpZiAoaXNJZ25vcmUobWVtYmVyKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaW5wdXREZWNvcmF0b3IpIHtcbiAgICAgICAgICAgICAgICBpbnB1dHMucHVzaCh0aGlzLnZpc2l0SW5wdXRBbmRIb3N0QmluZGluZyhtZW1iZXIsIGlucHV0RGVjb3JhdG9yLCBzb3VyY2VGaWxlKSk7XG4gICAgICAgICAgICAgICAgaWYgKHRzLmlzU2V0QWNjZXNzb3JEZWNsYXJhdGlvbihtZW1iZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQWNjZXNzb3IoYWNjZXNzb3JzLCBtZW1iZXJzW2ldLCBzb3VyY2VGaWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG91dERlY29yYXRvcikge1xuICAgICAgICAgICAgICAgIG91dHB1dHMucHVzaCh0aGlzLnZpc2l0T3V0cHV0KG1lbWJlciwgb3V0RGVjb3JhdG9yLCBzb3VyY2VGaWxlKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhvc3RCaW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgaG9zdEJpbmRpbmdzLnB1c2godGhpcy52aXNpdElucHV0QW5kSG9zdEJpbmRpbmcobWVtYmVyLCBob3N0QmluZGluZywgc291cmNlRmlsZSkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChob3N0TGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICBob3N0TGlzdGVuZXJzLnB1c2godGhpcy52aXNpdEhvc3RMaXN0ZW5lcihtZW1iZXIsIGhvc3RMaXN0ZW5lciwgc291cmNlRmlsZSkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5pc0hpZGRlbk1lbWJlcihtZW1iZXIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCEodGhpcy5pc1ByaXZhdGUobWVtYmVyKSAmJiB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVByaXZhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHRoaXMuaXNJbnRlcm5hbChtZW1iZXIpICYmIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlSW50ZXJuYWwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1Byb3RlY3RlZChtZW1iZXIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlUHJvdGVjdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRzLmlzTWV0aG9kRGVjbGFyYXRpb24obWVtYmVyKSB8fCB0cy5pc01ldGhvZFNpZ25hdHVyZShtZW1iZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHMucHVzaCh0aGlzLnZpc2l0TWV0aG9kRGVjbGFyYXRpb24obWVtYmVyLCBzb3VyY2VGaWxlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHMuaXNQcm9wZXJ0eURlY2xhcmF0aW9uKG1lbWJlcikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHMuaXNQcm9wZXJ0eVNpZ25hdHVyZShtZW1iZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMucHVzaCh0aGlzLnZpc2l0UHJvcGVydHkobWVtYmVyLCBzb3VyY2VGaWxlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0cy5pc0NhbGxTaWduYXR1cmVEZWNsYXJhdGlvbihtZW1iZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMucHVzaCh0aGlzLnZpc2l0Q2FsbERlY2xhcmF0aW9uKG1lbWJlciwgc291cmNlRmlsZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzLmlzR2V0QWNjZXNzb3JEZWNsYXJhdGlvbihtZW1iZXIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzLmlzU2V0QWNjZXNzb3JEZWNsYXJhdGlvbihtZW1iZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQWNjZXNzb3IoYWNjZXNzb3JzLCBtZW1iZXJzW2ldLCBzb3VyY2VGaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRzLmlzSW5kZXhTaWduYXR1cmVEZWNsYXJhdGlvbihtZW1iZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4U2lnbmF0dXJlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aXNpdEluZGV4RGVjbGFyYXRpb24obWVtYmVyLCBzb3VyY2VGaWxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHMuaXNDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKG1lbWJlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IF9jb25zdHJ1Y3RvclByb3BlcnRpZXMgPSB0aGlzLnZpc2l0Q29uc3RydWN0b3JQcm9wZXJ0aWVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaiA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsZW4gPSBfY29uc3RydWN0b3JQcm9wZXJ0aWVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqOyBqIDwgbGVuOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMucHVzaChfY29uc3RydWN0b3JQcm9wZXJ0aWVzW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvciA9IHRoaXMudmlzaXRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKG1lbWJlciwgc291cmNlRmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaW5wdXRzLnNvcnQoZ2V0TmFtZXNDb21wYXJlRm4oKSk7XG4gICAgICAgIG91dHB1dHMuc29ydChnZXROYW1lc0NvbXBhcmVGbigpKTtcbiAgICAgICAgaG9zdEJpbmRpbmdzLnNvcnQoZ2V0TmFtZXNDb21wYXJlRm4oKSk7XG4gICAgICAgIGhvc3RMaXN0ZW5lcnMuc29ydChnZXROYW1lc0NvbXBhcmVGbigpKTtcbiAgICAgICAgcHJvcGVydGllcy5zb3J0KGdldE5hbWVzQ29tcGFyZUZuKCkpO1xuICAgICAgICBtZXRob2RzLnNvcnQoZ2V0TmFtZXNDb21wYXJlRm4oKSk7XG4gICAgICAgIGluZGV4U2lnbmF0dXJlcy5zb3J0KGdldE5hbWVzQ29tcGFyZUZuKCkpO1xuXG4gICAgICAgIHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGlucHV0cyxcbiAgICAgICAgICAgIG91dHB1dHMsXG4gICAgICAgICAgICBob3N0QmluZGluZ3MsXG4gICAgICAgICAgICBob3N0TGlzdGVuZXJzLFxuICAgICAgICAgICAgbWV0aG9kcyxcbiAgICAgICAgICAgIHByb3BlcnRpZXMsXG4gICAgICAgICAgICBpbmRleFNpZ25hdHVyZXMsXG4gICAgICAgICAgICBraW5kLFxuICAgICAgICAgICAgY29uc3RydWN0b3JcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoYWNjZXNzb3JzKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJlc3VsdFsnYWNjZXNzb3JzJ10gPSBhY2Nlc3NvcnM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRUeXBlTmFtZSh0eXBlTmFtZTogdHMuSWRlbnRpZmllcikge1xuICAgICAgICBpZiAodHlwZU5hbWUudGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVOYW1lLnRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke3RoaXMudmlzaXRUeXBlTmFtZSh0eXBlTmFtZS5sZWZ0KX0uJHt0aGlzLnZpc2l0VHlwZU5hbWUodHlwZU5hbWUucmlnaHQpfWA7XG4gICAgfVxuXG4gICAgcHVibGljIHZpc2l0VHlwZShub2RlKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IF9yZXR1cm4gPSAndm9pZCc7XG5cbiAgICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gX3JldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChub2RlLnR5cGVOYW1lKSB7XG4gICAgICAgICAgICBfcmV0dXJuID0gdGhpcy52aXNpdFR5cGVOYW1lKG5vZGUudHlwZU5hbWUpO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGUudHlwZSkge1xuICAgICAgICAgICAgaWYgKG5vZGUudHlwZS5raW5kKSB7XG4gICAgICAgICAgICAgICAgX3JldHVybiA9IGtpbmRUb1R5cGUobm9kZS50eXBlLmtpbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGUudHlwZS50eXBlTmFtZSkge1xuICAgICAgICAgICAgICAgIF9yZXR1cm4gPSB0aGlzLnZpc2l0VHlwZU5hbWUobm9kZS50eXBlLnR5cGVOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub2RlLnR5cGUudHlwZUFyZ3VtZW50cykge1xuICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gJzwnO1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVBcmd1bWVudHMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGFyZ3VtZW50IG9mIG5vZGUudHlwZS50eXBlQXJndW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGVBcmd1bWVudHMucHVzaCh0aGlzLnZpc2l0VHlwZShhcmd1bWVudCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBfcmV0dXJuICs9IHR5cGVBcmd1bWVudHMuam9pbignIHwgJyk7XG4gICAgICAgICAgICAgICAgX3JldHVybiArPSAnPic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZS50eXBlLmVsZW1lbnRUeXBlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgX2ZpcnN0UGFydCA9IHRoaXMudmlzaXRUeXBlKG5vZGUudHlwZS5lbGVtZW50VHlwZSk7XG4gICAgICAgICAgICAgICAgX3JldHVybiA9IF9maXJzdFBhcnQgKyBraW5kVG9UeXBlKG5vZGUudHlwZS5raW5kKTtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS50eXBlLmVsZW1lbnRUeXBlLmtpbmQgPT09IFN5bnRheEtpbmQuUGFyZW50aGVzaXplZFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgX3JldHVybiA9ICcoJyArIF9maXJzdFBhcnQgKyAnKScgKyBraW5kVG9UeXBlKG5vZGUudHlwZS5raW5kKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZS50eXBlLnR5cGVzICYmIHRzLmlzVW5pb25UeXBlTm9kZShub2RlLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgX3JldHVybiA9ICcnO1xuICAgICAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgbGVuID0gbm9kZS50eXBlLnR5cGVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IG5vZGUudHlwZS50eXBlc1tpXTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5lbGVtZW50VHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX2ZpcnN0UGFydCA9IHRoaXMudmlzaXRUeXBlKHR5cGUuZWxlbWVudFR5cGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUuZWxlbWVudFR5cGUua2luZCA9PT0gU3ludGF4S2luZC5QYXJlbnRoZXNpemVkVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gJygnICsgX2ZpcnN0UGFydCArICcpJyArIGtpbmRUb1R5cGUodHlwZS5raW5kKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybiArPSBfZmlyc3RQYXJ0ICsga2luZFRvVHlwZSh0eXBlLmtpbmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybiArPSBraW5kVG9UeXBlKHR5cGUua2luZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHMuaXNMaXRlcmFsVHlwZU5vZGUodHlwZSkgJiYgdHlwZS5saXRlcmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybiArPSAnXCInICsgdHlwZS5saXRlcmFsLnRleHQgKyAnXCInO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUudHlwZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9IHRoaXMudmlzaXRUeXBlTmFtZSh0eXBlLnR5cGVOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLnR5cGVBcmd1bWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9ICc8JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlQXJndW1lbnRzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhcmd1bWVudCBvZiB0eXBlLnR5cGVBcmd1bWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50cy5wdXNoKHRoaXMudmlzaXRUeXBlKGFyZ3VtZW50KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gdHlwZUFyZ3VtZW50cy5qb2luKCcgfCAnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9ICc+JztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGxlbiAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gJyB8ICc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZS50eXBlLmVsZW1lbnRUeXBlcykge1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50VHlwZXMgPSBub2RlLnR5cGUuZWxlbWVudFR5cGVzO1xuICAgICAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgbGVuID0gZWxlbWVudFR5cGVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAobGVuID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBfcmV0dXJuID0gJ1snO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBlbGVtZW50VHlwZXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9IGtpbmRUb1R5cGUodHlwZS5raW5kKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cy5pc0xpdGVyYWxUeXBlTm9kZSh0eXBlKSAmJiB0eXBlLmxpdGVyYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9ICdcIicgKyB0eXBlLmxpdGVyYWwudGV4dCArICdcIic7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS50eXBlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gdGhpcy52aXNpdFR5cGVOYW1lKHR5cGUudHlwZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBsZW4gLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybiArPSAnLCAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gJ10nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChub2RlLmVsZW1lbnRUeXBlKSB7XG4gICAgICAgICAgICBfcmV0dXJuID0ga2luZFRvVHlwZShub2RlLmVsZW1lbnRUeXBlLmtpbmQpICsga2luZFRvVHlwZShub2RlLmtpbmQpO1xuICAgICAgICAgICAgaWYgKG5vZGUuZWxlbWVudFR5cGUudHlwZU5hbWUpIHtcbiAgICAgICAgICAgICAgICBfcmV0dXJuID0gdGhpcy52aXNpdFR5cGVOYW1lKG5vZGUuZWxlbWVudFR5cGUudHlwZU5hbWUpICsga2luZFRvVHlwZShub2RlLmtpbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG5vZGUudHlwZXMgJiYgdHMuaXNVbmlvblR5cGVOb2RlKG5vZGUpKSB7XG4gICAgICAgICAgICBfcmV0dXJuID0gJyc7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBsZXQgbGVuID0gbm9kZS50eXBlcy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCB0eXBlID0gbm9kZS50eXBlc1tpXTtcbiAgICAgICAgICAgICAgICBfcmV0dXJuICs9IGtpbmRUb1R5cGUodHlwZS5raW5kKTtcbiAgICAgICAgICAgICAgICBpZiAodHMuaXNMaXRlcmFsVHlwZU5vZGUodHlwZSkgJiYgdHlwZS5saXRlcmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gJ1wiJyArIHR5cGUubGl0ZXJhbC50ZXh0ICsgJ1wiJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUudHlwZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgX3JldHVybiArPSB0aGlzLnZpc2l0VHlwZU5hbWUodHlwZS50eXBlTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpIDwgbGVuIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9ICcgfCAnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChub2RlLmRvdERvdERvdFRva2VuKSB7XG4gICAgICAgICAgICBfcmV0dXJuID0gJ2FueVtdJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF9yZXR1cm4gPSBraW5kVG9UeXBlKG5vZGUua2luZCk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgX3JldHVybiA9PT0gJycgJiZcbiAgICAgICAgICAgICAgICBub2RlLmluaXRpYWxpemVyICYmXG4gICAgICAgICAgICAgICAgbm9kZS5pbml0aWFsaXplci5raW5kICYmXG4gICAgICAgICAgICAgICAgKG5vZGUua2luZCA9PT0gU3ludGF4S2luZC5Qcm9wZXJ0eURlY2xhcmF0aW9uIHx8IG5vZGUua2luZCA9PT0gU3ludGF4S2luZC5QYXJhbWV0ZXIpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBfcmV0dXJuID0ga2luZFRvVHlwZShub2RlLmluaXRpYWxpemVyLmtpbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGUua2luZCA9PT0gU3ludGF4S2luZC5UeXBlUGFyYW1ldGVyKSB7XG4gICAgICAgICAgICAgICAgX3JldHVybiA9IG5vZGUubmFtZS50ZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLnR5cGVBcmd1bWVudHMgJiYgbm9kZS50eXBlQXJndW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF9yZXR1cm4gKz0gJzwnO1xuICAgICAgICAgICAgbGV0IGkgPSAwLFxuICAgICAgICAgICAgICAgIGxlbiA9IG5vZGUudHlwZUFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhcmd1bWVudCA9IG5vZGUudHlwZUFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgICAgICBfcmV0dXJuICs9IHRoaXMudmlzaXRUeXBlKGFyZ3VtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAoaSA+PSAwICYmIGkgPCBsZW4gLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gJywgJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfcmV0dXJuICs9ICc+JztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3JldHVybjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZpc2l0Q2FsbERlY2xhcmF0aW9uKG1ldGhvZDogdHMuQ2FsbFNpZ25hdHVyZURlY2xhcmF0aW9uLCBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlKSB7XG4gICAgICAgIGxldCBzb3VyY2VDb2RlID0gc291cmNlRmlsZS5nZXRUZXh0KCk7XG4gICAgICAgIGxldCBoYXNoID0gY3J5cHRvXG4gICAgICAgICAgICAuY3JlYXRlSGFzaCgnbWQ1JylcbiAgICAgICAgICAgIC51cGRhdGUoc291cmNlQ29kZSlcbiAgICAgICAgICAgIC5kaWdlc3QoJ2hleCcpO1xuICAgICAgICBsZXQgcmVzdWx0OiBhbnkgPSB7XG4gICAgICAgICAgICBpZDogJ2NhbGwtZGVjbGFyYXRpb24tJyArIGhhc2gsXG4gICAgICAgICAgICBhcmdzOiBtZXRob2QucGFyYW1ldGVycyA/IG1ldGhvZC5wYXJhbWV0ZXJzLm1hcChwcm9wID0+IHRoaXMudmlzaXRBcmd1bWVudChwcm9wKSkgOiBbXSxcbiAgICAgICAgICAgIHJldHVyblR5cGU6IHRoaXMudmlzaXRUeXBlKG1ldGhvZC50eXBlKSxcbiAgICAgICAgICAgIGxpbmU6IHRoaXMuZ2V0UG9zaXRpb24obWV0aG9kLCBzb3VyY2VGaWxlKS5saW5lICsgMVxuICAgICAgICB9O1xuICAgICAgICBpZiAobWV0aG9kLmpzRG9jKSB7XG4gICAgICAgICAgICByZXN1bHQuZGVzY3JpcHRpb24gPSBtYXJrZWQobWFya2VkKHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldE1haW5Db21tZW50T2ZOb2RlKG1ldGhvZCkpKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQganNkb2N0YWdzID0gdGhpcy5qc2RvY1BhcnNlclV0aWwuZ2V0SlNEb2NzKG1ldGhvZCk7XG4gICAgICAgIGlmIChqc2RvY3RhZ3MgJiYganNkb2N0YWdzLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICBpZiAoanNkb2N0YWdzWzBdLnRhZ3MpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuanNkb2N0YWdzID0gbWFya2VkdGFncyhqc2RvY3RhZ3NbMF0udGFncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZpc2l0SW5kZXhEZWNsYXJhdGlvbihcbiAgICAgICAgbWV0aG9kOiB0cy5JbmRleFNpZ25hdHVyZURlY2xhcmF0aW9uLFxuICAgICAgICBzb3VyY2VGaWxlPzogdHMuU291cmNlRmlsZVxuICAgICkge1xuICAgICAgICBsZXQgc291cmNlQ29kZSA9IHNvdXJjZUZpbGUuZ2V0VGV4dCgpO1xuICAgICAgICBsZXQgaGFzaCA9IGNyeXB0b1xuICAgICAgICAgICAgLmNyZWF0ZUhhc2goJ21kNScpXG4gICAgICAgICAgICAudXBkYXRlKHNvdXJjZUNvZGUpXG4gICAgICAgICAgICAuZGlnZXN0KCdoZXgnKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGlkOiAnaW5kZXgtZGVjbGFyYXRpb24tJyArIGhhc2gsXG4gICAgICAgICAgICBhcmdzOiBtZXRob2QucGFyYW1ldGVycyA/IG1ldGhvZC5wYXJhbWV0ZXJzLm1hcChwcm9wID0+IHRoaXMudmlzaXRBcmd1bWVudChwcm9wKSkgOiBbXSxcbiAgICAgICAgICAgIHJldHVyblR5cGU6IHRoaXMudmlzaXRUeXBlKG1ldGhvZC50eXBlKSxcbiAgICAgICAgICAgIGxpbmU6IHRoaXMuZ2V0UG9zaXRpb24obWV0aG9kLCBzb3VyY2VGaWxlKS5saW5lICsgMVxuICAgICAgICB9O1xuICAgICAgICBpZiAobWV0aG9kLmpzRG9jKSB7XG4gICAgICAgICAgICByZXN1bHQuZGVzY3JpcHRpb24gPSBtYXJrZWQodGhpcy5qc2RvY1BhcnNlclV0aWwuZ2V0TWFpbkNvbW1lbnRPZk5vZGUobWV0aG9kKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZpc2l0Q29uc3RydWN0b3JEZWNsYXJhdGlvbihcbiAgICAgICAgbWV0aG9kOiB0cy5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uLFxuICAgICAgICBzb3VyY2VGaWxlPzogdHMuU291cmNlRmlsZVxuICAgICkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29weXJpZ2h0IGh0dHBzOi8vZ2l0aHViLmNvbS9uZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXG4gICAgICAgICAqL1xuICAgICAgICBsZXQgcmVzdWx0OiBhbnkgPSB7XG4gICAgICAgICAgICBuYW1lOiAnY29uc3RydWN0b3InLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICAgICAgYXJnczogbWV0aG9kLnBhcmFtZXRlcnMgPyBtZXRob2QucGFyYW1ldGVycy5tYXAocHJvcCA9PiB0aGlzLnZpc2l0QXJndW1lbnQocHJvcCkpIDogW10sXG4gICAgICAgICAgICBsaW5lOiB0aGlzLmdldFBvc2l0aW9uKG1ldGhvZCwgc291cmNlRmlsZSkubGluZSArIDFcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IGpzZG9jdGFncyA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldEpTRG9jcyhtZXRob2QpO1xuXG4gICAgICAgIGlmIChtZXRob2QuanNEb2MpIHtcbiAgICAgICAgICAgIHJlc3VsdC5kZXNjcmlwdGlvbiA9IG1hcmtlZCh0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRNYWluQ29tbWVudE9mTm9kZShtZXRob2QpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXRob2QubW9kaWZpZXJzKSB7XG4gICAgICAgICAgICBpZiAobWV0aG9kLm1vZGlmaWVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGtpbmRzID0gbWV0aG9kLm1vZGlmaWVycy5tYXAobW9kaWZpZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kaWZpZXIua2luZDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIF8uaW5kZXhPZihraW5kcywgU3ludGF4S2luZC5QdWJsaWNLZXl3b3JkKSAhPT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgXy5pbmRleE9mKGtpbmRzLCBTeW50YXhLaW5kLlN0YXRpY0tleXdvcmQpICE9PSAtMVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBraW5kcyA9IGtpbmRzLmZpbHRlcihraW5kID0+IGtpbmQgIT09IFN5bnRheEtpbmQuUHVibGljS2V5d29yZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdC5tb2RpZmllcktpbmQgPSBraW5kcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoanNkb2N0YWdzICYmIGpzZG9jdGFncy5sZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgaWYgKGpzZG9jdGFnc1swXS50YWdzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmpzZG9jdGFncyA9IG1hcmtlZHRhZ3MoanNkb2N0YWdzWzBdLnRhZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQuanNkb2N0YWdzICYmIHJlc3VsdC5qc2RvY3RhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVzdWx0LmpzZG9jdGFncyA9IG1lcmdlVGFnc0FuZEFyZ3MocmVzdWx0LmFyZ3MsIHJlc3VsdC5qc2RvY3RhZ3MpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5hcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlc3VsdC5qc2RvY3RhZ3MgPSBtZXJnZVRhZ3NBbmRBcmdzKHJlc3VsdC5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRQcm9wZXJ0eShwcm9wZXJ0eTogdHMuUHJvcGVydHlEZWNsYXJhdGlvbiwgc291cmNlRmlsZSkge1xuICAgICAgICBsZXQgcmVzdWx0OiBhbnkgPSB7XG4gICAgICAgICAgICBuYW1lOiBwcm9wZXJ0eS5uYW1lLnRleHQsXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IHByb3BlcnR5LmluaXRpYWxpemVyXG4gICAgICAgICAgICAgICAgPyB0aGlzLnN0cmluZ2lmeURlZmF1bHRWYWx1ZShwcm9wZXJ0eS5pbml0aWFsaXplcilcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHR5cGU6IHRoaXMudmlzaXRUeXBlKHByb3BlcnR5KSxcbiAgICAgICAgICAgIG9wdGlvbmFsOiB0eXBlb2YgcHJvcGVydHkucXVlc3Rpb25Ub2tlbiAhPT0gJ3VuZGVmaW5lZCcsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgICAgICBsaW5lOiB0aGlzLmdldFBvc2l0aW9uKHByb3BlcnR5LCBzb3VyY2VGaWxlKS5saW5lICsgMVxuICAgICAgICB9O1xuICAgICAgICBsZXQganNkb2N0YWdzO1xuXG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0Lm5hbWUgPT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBwcm9wZXJ0eS5uYW1lLmV4cHJlc3Npb24gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXN1bHQubmFtZSA9IHByb3BlcnR5Lm5hbWUuZXhwcmVzc2lvbi50ZXh0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3BlcnR5LmpzRG9jKSB7XG4gICAgICAgICAgICBqc2RvY3RhZ3MgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRKU0RvY3MocHJvcGVydHkpO1xuICAgICAgICAgICAgcmVzdWx0LmRlc2NyaXB0aW9uID0gbWFya2VkKHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldE1haW5Db21tZW50T2ZOb2RlKHByb3BlcnR5KSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcGVydHkuZGVjb3JhdG9ycykge1xuICAgICAgICAgICAgcmVzdWx0LmRlY29yYXRvcnMgPSB0aGlzLmZvcm1hdERlY29yYXRvcnMocHJvcGVydHkuZGVjb3JhdG9ycyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcGVydHkubW9kaWZpZXJzKSB7XG4gICAgICAgICAgICBpZiAocHJvcGVydHkubW9kaWZpZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQga2luZHMgPSBwcm9wZXJ0eS5tb2RpZmllcnMubWFwKG1vZGlmaWVyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZGlmaWVyLmtpbmQ7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBfLmluZGV4T2Yoa2luZHMsIFN5bnRheEtpbmQuUHVibGljS2V5d29yZCkgIT09IC0xICYmXG4gICAgICAgICAgICAgICAgICAgIF8uaW5kZXhPZihraW5kcywgU3ludGF4S2luZC5TdGF0aWNLZXl3b3JkKSAhPT0gLTFcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAga2luZHMgPSBraW5kcy5maWx0ZXIoa2luZCA9PiBraW5kICE9PSBTeW50YXhLaW5kLlB1YmxpY0tleXdvcmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHQubW9kaWZpZXJLaW5kID0ga2luZHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGpzZG9jdGFncyAmJiBqc2RvY3RhZ3MubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICAgIGlmIChqc2RvY3RhZ3NbMF0udGFncykge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5qc2RvY3RhZ3MgPSBtYXJrZWR0YWdzKGpzZG9jdGFnc1swXS50YWdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2aXNpdENvbnN0cnVjdG9yUHJvcGVydGllcyhjb25zdHIsIHNvdXJjZUZpbGUpIHtcbiAgICAgICAgbGV0IHRoYXQgPSB0aGlzO1xuICAgICAgICBpZiAoY29uc3RyLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgIGxldCBfcGFyYW1ldGVycyA9IFtdO1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgbGV0IGxlbiA9IGNvbnN0ci5wYXJhbWV0ZXJzLmxlbmd0aDtcbiAgICAgICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNQdWJsaWMoY29uc3RyLnBhcmFtZXRlcnNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIF9wYXJhbWV0ZXJzLnB1c2godGhpcy52aXNpdFByb3BlcnR5KGNvbnN0ci5wYXJhbWV0ZXJzW2ldLCBzb3VyY2VGaWxlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBNZXJnZSBKU0RvYyB0YWdzIGRlc2NyaXB0aW9uIGZyb20gY29uc3RydWN0b3Igd2l0aCBwYXJhbWV0ZXJzXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGlmIChjb25zdHIuanNEb2MpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29uc3RyLmpzRG9jLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnN0clRhZ3MgPSBjb25zdHIuanNEb2NbMF0udGFncztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnN0clRhZ3MgJiYgY29uc3RyVGFncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJUYWdzLmZvckVhY2godGFnID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcGFyYW1ldGVycy5mb3JFYWNoKHBhcmFtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLnRhZ05hbWUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZy50YWdOYW1lLmVzY2FwZWRUZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcudGFnTmFtZS5lc2NhcGVkVGV4dCA9PT0gJ3BhcmFtJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcubmFtZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5uYW1lLmVzY2FwZWRUZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLm5hbWUuZXNjYXBlZFRleHQgPT09IHBhcmFtLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLmRlc2NyaXB0aW9uID0gdGFnLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIF9wYXJhbWV0ZXJzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2aXNpdElucHV0QW5kSG9zdEJpbmRpbmcocHJvcGVydHksIGluRGVjb3JhdG9yLCBzb3VyY2VGaWxlPykge1xuICAgICAgICBsZXQgaW5BcmdzID0gaW5EZWNvcmF0b3IuZXhwcmVzc2lvbi5hcmd1bWVudHM7XG4gICAgICAgIGxldCBfcmV0dXJuOiBhbnkgPSB7fTtcbiAgICAgICAgX3JldHVybi5uYW1lID0gaW5BcmdzLmxlbmd0aCA+IDAgPyBpbkFyZ3NbMF0udGV4dCA6IHByb3BlcnR5Lm5hbWUudGV4dDtcbiAgICAgICAgX3JldHVybi5kZWZhdWx0VmFsdWUgPSBwcm9wZXJ0eS5pbml0aWFsaXplclxuICAgICAgICAgICAgPyB0aGlzLnN0cmluZ2lmeURlZmF1bHRWYWx1ZShwcm9wZXJ0eS5pbml0aWFsaXplcilcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAoIV9yZXR1cm4uZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5qc0RvYykge1xuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5qc0RvYy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHkuanNEb2NbMF0uY29tbWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4uZGVzY3JpcHRpb24gPSBtYXJrZWQocHJvcGVydHkuanNEb2NbMF0uY29tbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgX3JldHVybi5saW5lID0gdGhpcy5nZXRQb3NpdGlvbihwcm9wZXJ0eSwgc291cmNlRmlsZSkubGluZSArIDE7XG4gICAgICAgIGlmIChwcm9wZXJ0eS50eXBlKSB7XG4gICAgICAgICAgICBfcmV0dXJuLnR5cGUgPSB0aGlzLnZpc2l0VHlwZShwcm9wZXJ0eSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBoYW5kbGUgTmV3RXhwcmVzc2lvblxuICAgICAgICAgICAgaWYgKHByb3BlcnR5LmluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRzLmlzTmV3RXhwcmVzc2lvbihwcm9wZXJ0eS5pbml0aWFsaXplcikpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5LmluaXRpYWxpemVyLmV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4udHlwZSA9IHByb3BlcnR5LmluaXRpYWxpemVyLmV4cHJlc3Npb24udGV4dDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcGVydHkua2luZCA9PT0gU3ludGF4S2luZC5TZXRBY2Nlc3Nvcikge1xuICAgICAgICAgICAgLy8gRm9yIHNldHRlciBhY2Nlc3NvciwgZmluZCB0eXBlIGluIGZpcnN0IHBhcmFtZXRlclxuICAgICAgICAgICAgaWYgKHByb3BlcnR5LnBhcmFtZXRlcnMgJiYgcHJvcGVydHkucGFyYW1ldGVycy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkucGFyYW1ldGVyc1swXS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIF9yZXR1cm4udHlwZSA9IGtpbmRUb1R5cGUocHJvcGVydHkucGFyYW1ldGVyc1swXS50eXBlLmtpbmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3JldHVybjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZpc2l0TWV0aG9kRGVjbGFyYXRpb24obWV0aG9kOiB0cy5NZXRob2REZWNsYXJhdGlvbiwgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSkge1xuICAgICAgICBsZXQgcmVzdWx0OiBhbnkgPSB7XG4gICAgICAgICAgICBuYW1lOiBtZXRob2QubmFtZS50ZXh0LFxuICAgICAgICAgICAgYXJnczogbWV0aG9kLnBhcmFtZXRlcnMgPyBtZXRob2QucGFyYW1ldGVycy5tYXAocHJvcCA9PiB0aGlzLnZpc2l0QXJndW1lbnQocHJvcCkpIDogW10sXG4gICAgICAgICAgICBvcHRpb25hbDogdHlwZW9mIG1ldGhvZC5xdWVzdGlvblRva2VuICE9PSAndW5kZWZpbmVkJyxcbiAgICAgICAgICAgIHJldHVyblR5cGU6IHRoaXMudmlzaXRUeXBlKG1ldGhvZC50eXBlKSxcbiAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzOiBbXSxcbiAgICAgICAgICAgIGxpbmU6IHRoaXMuZ2V0UG9zaXRpb24obWV0aG9kLCBzb3VyY2VGaWxlKS5saW5lICsgMVxuICAgICAgICB9O1xuICAgICAgICBsZXQganNkb2N0YWdzID0gdGhpcy5qc2RvY1BhcnNlclV0aWwuZ2V0SlNEb2NzKG1ldGhvZCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBtZXRob2QudHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIC8vIFRyeSB0byBnZXQgaW5mZXJyZWQgdHlwZVxuICAgICAgICAgICAgaWYgKG1ldGhvZC5zeW1ib2wpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3ltYm9sOiB0cy5TeW1ib2wgPSBtZXRob2Quc3ltYm9sO1xuICAgICAgICAgICAgICAgIGlmIChzeW1ib2wudmFsdWVEZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3ltYm9sVHlwZSA9IHRoaXMudHlwZUNoZWNrZXIuZ2V0VHlwZU9mU3ltYm9sQXRMb2NhdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbC52YWx1ZURlY2xhcmF0aW9uXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzeW1ib2xUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IHRoaXMudHlwZUNoZWNrZXIuZ2V0U2lnbmF0dXJlRnJvbURlY2xhcmF0aW9uKG1ldGhvZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV0dXJuVHlwZSA9IHNpZ25hdHVyZS5nZXRSZXR1cm5UeXBlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJldHVyblR5cGUgPSB0aGlzLnR5cGVDaGVja2VyLnR5cGVUb1N0cmluZyhyZXR1cm5UeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tZW1wdHlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7fVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1ldGhvZC50eXBlUGFyYW1ldGVycyAmJiBtZXRob2QudHlwZVBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVzdWx0LnR5cGVQYXJhbWV0ZXJzID0gbWV0aG9kLnR5cGVQYXJhbWV0ZXJzLm1hcCh0eXBlUGFyYW1ldGVyID0+XG4gICAgICAgICAgICAgICAgdGhpcy52aXNpdFR5cGUodHlwZVBhcmFtZXRlcilcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWV0aG9kLmpzRG9jKSB7XG4gICAgICAgICAgICByZXN1bHQuZGVzY3JpcHRpb24gPSBtYXJrZWQodGhpcy5qc2RvY1BhcnNlclV0aWwuZ2V0TWFpbkNvbW1lbnRPZk5vZGUobWV0aG9kKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWV0aG9kLmRlY29yYXRvcnMpIHtcbiAgICAgICAgICAgIHJlc3VsdC5kZWNvcmF0b3JzID0gdGhpcy5mb3JtYXREZWNvcmF0b3JzKG1ldGhvZC5kZWNvcmF0b3JzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXRob2QubW9kaWZpZXJzKSB7XG4gICAgICAgICAgICBpZiAobWV0aG9kLm1vZGlmaWVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGtpbmRzID0gbWV0aG9kLm1vZGlmaWVycy5tYXAobW9kaWZpZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kaWZpZXIua2luZDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIF8uaW5kZXhPZihraW5kcywgU3ludGF4S2luZC5QdWJsaWNLZXl3b3JkKSAhPT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgXy5pbmRleE9mKGtpbmRzLCBTeW50YXhLaW5kLlN0YXRpY0tleXdvcmQpICE9PSAtMVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBraW5kcyA9IGtpbmRzLmZpbHRlcihraW5kID0+IGtpbmQgIT09IFN5bnRheEtpbmQuUHVibGljS2V5d29yZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdC5tb2RpZmllcktpbmQgPSBraW5kcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoanNkb2N0YWdzICYmIGpzZG9jdGFncy5sZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgaWYgKGpzZG9jdGFnc1swXS50YWdzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmpzZG9jdGFncyA9IG1hcmtlZHRhZ3MoanNkb2N0YWdzWzBdLnRhZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQuanNkb2N0YWdzICYmIHJlc3VsdC5qc2RvY3RhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVzdWx0LmpzZG9jdGFncyA9IG1lcmdlVGFnc0FuZEFyZ3MocmVzdWx0LmFyZ3MsIHJlc3VsdC5qc2RvY3RhZ3MpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5hcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlc3VsdC5qc2RvY3RhZ3MgPSBtZXJnZVRhZ3NBbmRBcmdzKHJlc3VsdC5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRPdXRwdXQoXG4gICAgICAgIHByb3BlcnR5OiB0cy5Qcm9wZXJ0eURlY2xhcmF0aW9uLFxuICAgICAgICBvdXREZWNvcmF0b3I6IHRzLkRlY29yYXRvcixcbiAgICAgICAgc291cmNlRmlsZT86IHRzLlNvdXJjZUZpbGVcbiAgICApIHtcbiAgICAgICAgbGV0IGluQXJncyA9IG91dERlY29yYXRvci5leHByZXNzaW9uLmFyZ3VtZW50cztcbiAgICAgICAgbGV0IF9yZXR1cm46IGFueSA9IHtcbiAgICAgICAgICAgIG5hbWU6IGluQXJncy5sZW5ndGggPiAwID8gaW5BcmdzWzBdLnRleHQgOiBwcm9wZXJ0eS5uYW1lLnRleHQsXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IHByb3BlcnR5LmluaXRpYWxpemVyXG4gICAgICAgICAgICAgICAgPyB0aGlzLnN0cmluZ2lmeURlZmF1bHRWYWx1ZShwcm9wZXJ0eS5pbml0aWFsaXplcilcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICB9O1xuICAgICAgICBpZiAocHJvcGVydHkuanNEb2MpIHtcbiAgICAgICAgICAgIF9yZXR1cm4uZGVzY3JpcHRpb24gPSBtYXJrZWQoXG4gICAgICAgICAgICAgICAgbWFya2VkKHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldE1haW5Db21tZW50T2ZOb2RlKHByb3BlcnR5KSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFfcmV0dXJuLmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICBpZiAocHJvcGVydHkuanNEb2MgJiYgcHJvcGVydHkuanNEb2MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHkuanNEb2NbMF0uY29tbWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgX3JldHVybi5kZXNjcmlwdGlvbiA9IG1hcmtlZChwcm9wZXJ0eS5qc0RvY1swXS5jb21tZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgX3JldHVybi5saW5lID0gdGhpcy5nZXRQb3NpdGlvbihwcm9wZXJ0eSwgc291cmNlRmlsZSkubGluZSArIDE7XG5cbiAgICAgICAgaWYgKHByb3BlcnR5LnR5cGUpIHtcbiAgICAgICAgICAgIF9yZXR1cm4udHlwZSA9IHRoaXMudmlzaXRUeXBlKHByb3BlcnR5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGhhbmRsZSBOZXdFeHByZXNzaW9uXG4gICAgICAgICAgICBpZiAocHJvcGVydHkuaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAodHMuaXNOZXdFeHByZXNzaW9uKHByb3BlcnR5LmluaXRpYWxpemVyKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkuaW5pdGlhbGl6ZXIuZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybi50eXBlID0gcHJvcGVydHkuaW5pdGlhbGl6ZXIuZXhwcmVzc2lvbi50ZXh0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfcmV0dXJuO1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRBcmd1bWVudChhcmc6IHRzLlBhcmFtZXRlckRlY2xhcmF0aW9uKSB7XG4gICAgICAgIGxldCBfcmVzdWx0OiBhbnkgPSB7XG4gICAgICAgICAgICBuYW1lOiBhcmcubmFtZS50ZXh0LFxuICAgICAgICAgICAgdHlwZTogdGhpcy52aXNpdFR5cGUoYXJnKVxuICAgICAgICB9O1xuICAgICAgICBpZiAoYXJnLmRvdERvdERvdFRva2VuKSB7XG4gICAgICAgICAgICBfcmVzdWx0LmRvdERvdERvdFRva2VuID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXJnLnF1ZXN0aW9uVG9rZW4pIHtcbiAgICAgICAgICAgIF9yZXN1bHQub3B0aW9uYWwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhcmcudHlwZSkge1xuICAgICAgICAgICAgaWYgKGFyZy50eXBlLmtpbmQpIHtcbiAgICAgICAgICAgICAgICBpZiAodHMuaXNGdW5jdGlvblR5cGVOb2RlKGFyZy50eXBlKSkge1xuICAgICAgICAgICAgICAgICAgICBfcmVzdWx0LmZ1bmN0aW9uID0gYXJnLnR5cGUucGFyYW1ldGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBhcmcudHlwZS5wYXJhbWV0ZXJzLm1hcChwcm9wID0+IHRoaXMudmlzaXRBcmd1bWVudChwcm9wKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChhcmcuaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgIF9yZXN1bHQuZGVmYXVsdFZhbHVlID0gdGhpcy5zdHJpbmdpZnlEZWZhdWx0VmFsdWUoYXJnLmluaXRpYWxpemVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3Jlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZpc2l0SG9zdExpc3RlbmVyKHByb3BlcnR5LCBob3N0TGlzdGVuZXJEZWNvcmF0b3IsIHNvdXJjZUZpbGU/KSB7XG4gICAgICAgIGxldCBpbkFyZ3MgPSBob3N0TGlzdGVuZXJEZWNvcmF0b3IuZXhwcmVzc2lvbi5hcmd1bWVudHM7XG4gICAgICAgIGxldCBfcmV0dXJuOiBhbnkgPSB7fTtcbiAgICAgICAgX3JldHVybi5uYW1lID0gaW5BcmdzLmxlbmd0aCA+IDAgPyBpbkFyZ3NbMF0udGV4dCA6IHByb3BlcnR5Lm5hbWUudGV4dDtcbiAgICAgICAgX3JldHVybi5hcmdzID0gcHJvcGVydHkucGFyYW1ldGVyc1xuICAgICAgICAgICAgPyBwcm9wZXJ0eS5wYXJhbWV0ZXJzLm1hcChwcm9wID0+IHRoaXMudmlzaXRBcmd1bWVudChwcm9wKSlcbiAgICAgICAgICAgIDogW107XG4gICAgICAgIF9yZXR1cm4uYXJnc0RlY29yYXRvciA9XG4gICAgICAgICAgICBpbkFyZ3MubGVuZ3RoID4gMVxuICAgICAgICAgICAgICAgID8gaW5BcmdzWzFdLmVsZW1lbnRzLm1hcChwcm9wID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvcC50ZXh0O1xuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICA6IFtdO1xuICAgICAgICBpZiAocHJvcGVydHkuanNEb2MpIHtcbiAgICAgICAgICAgIF9yZXR1cm4uZGVzY3JpcHRpb24gPSBtYXJrZWQodGhpcy5qc2RvY1BhcnNlclV0aWwuZ2V0TWFpbkNvbW1lbnRPZk5vZGUocHJvcGVydHkpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIV9yZXR1cm4uZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5qc0RvYykge1xuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5qc0RvYy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHkuanNEb2NbMF0uY29tbWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4uZGVzY3JpcHRpb24gPSBtYXJrZWQocHJvcGVydHkuanNEb2NbMF0uY29tbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgX3JldHVybi5saW5lID0gdGhpcy5nZXRQb3NpdGlvbihwcm9wZXJ0eSwgc291cmNlRmlsZSkubGluZSArIDE7XG4gICAgICAgIHJldHVybiBfcmV0dXJuO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IHRzIH0gZnJvbSAndHMtc2ltcGxlLWFzdCc7XG5cbmV4cG9ydCBjbGFzcyBUc1ByaW50ZXJVdGlsIHtcbiAgICBwcml2YXRlIHByaW50ZXI6IHRzLlByaW50ZXI7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5wcmludGVyID0gdHMuY3JlYXRlUHJpbnRlcih7XG4gICAgICAgICAgICBuZXdMaW5lOiB0cy5OZXdMaW5lS2luZC5MaW5lRmVlZFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJpbnQobm9kZTogdHMuTm9kZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnByaW50ZXIucHJpbnROb2RlKFxuICAgICAgICAgICAgdHMuRW1pdEhpbnQuVW5zcGVjaWZpZWQsXG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgdHMuY3JlYXRlU291cmNlRmlsZSgnJywgJycsIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QpXG4gICAgICAgICk7XG4gICAgfVxufVxuIiwiaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuXG5pbXBvcnQgeyB0cywgU3ludGF4S2luZCB9IGZyb20gJ3RzLXNpbXBsZS1hc3QnO1xuXG5pbXBvcnQgeyBUc1ByaW50ZXJVdGlsIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vdXRpbHMvdHMtcHJpbnRlci51dGlsJztcblxuaW1wb3J0IHsgSW1wb3J0c1V0aWwgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi91dGlscy9pbXBvcnRzLnV0aWwnO1xuXG5leHBvcnQgY2xhc3MgU3ltYm9sSGVscGVyIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHVua25vd24gPSAnPz8/JztcbiAgICBwcml2YXRlIGltcG9ydHNVdGlsID0gbmV3IEltcG9ydHNVdGlsKCk7XG5cbiAgICBwdWJsaWMgcGFyc2VEZWVwSW5kZW50aWZpZXIobmFtZTogc3RyaW5nLCBzcmNGaWxlPzogdHMuU291cmNlRmlsZSk6IElQYXJzZURlZXBJZGVudGlmaWVyUmVzdWx0IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIG5hbWU6ICcnLFxuICAgICAgICAgICAgdHlwZTogJydcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGxldCBuc01vZHVsZSA9IG5hbWUuc3BsaXQoJy4nKTtcbiAgICAgICAgbGV0IHR5cGUgPSB0aGlzLmdldFR5cGUobmFtZSk7XG5cbiAgICAgICAgaWYgKG5zTW9kdWxlLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHJlc3VsdC5ucyA9IG5zTW9kdWxlWzBdO1xuICAgICAgICAgICAgcmVzdWx0Lm5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgcmVzdWx0LnR5cGUgPSB0eXBlO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNyY0ZpbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXN1bHQuZmlsZSA9IHRoaXMuaW1wb3J0c1V0aWwuZ2V0RmlsZU5hbWVPZkltcG9ydChuYW1lLCBzcmNGaWxlKTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQubmFtZSA9IG5hbWU7XG4gICAgICAgIHJlc3VsdC50eXBlID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VHlwZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgdHlwZTtcbiAgICAgICAgaWYgKG5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdjb21wb25lbnQnKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHR5cGUgPSAnY29tcG9uZW50JztcbiAgICAgICAgfSBlbHNlIGlmIChuYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigncGlwZScpICE9PSAtMSkge1xuICAgICAgICAgICAgdHlwZSA9ICdwaXBlJztcbiAgICAgICAgfSBlbHNlIGlmIChuYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignY29udHJvbGxlcicpICE9PSAtMSkge1xuICAgICAgICAgICAgdHlwZSA9ICdjb250cm9sbGVyJztcbiAgICAgICAgfSBlbHNlIGlmIChuYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignbW9kdWxlJykgIT09IC0xKSB7XG4gICAgICAgICAgICB0eXBlID0gJ21vZHVsZSc7XG4gICAgICAgIH0gZWxzZSBpZiAobmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ2RpcmVjdGl2ZScpICE9PSAtMSkge1xuICAgICAgICAgICAgdHlwZSA9ICdkaXJlY3RpdmUnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE91dHB1dFxuICAgICAqIFJvdXRlck1vZHVsZS5mb3JSb290IDE3OVxuICAgICAqL1xuICAgIHB1YmxpYyBidWlsZElkZW50aWZpZXJOYW1lKFxuICAgICAgICBub2RlOiB0cy5JZGVudGlmaWVyIHwgdHMuUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uIHwgdHMuU3ByZWFkRWxlbWVudCxcbiAgICAgICAgbmFtZVxuICAgICkge1xuICAgICAgICBpZiAodHMuaXNJZGVudGlmaWVyKG5vZGUpICYmICF0cy5pc1Byb3BlcnR5QWNjZXNzRXhwcmVzc2lvbihub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGAke25vZGUudGV4dH0uJHtuYW1lfWA7XG4gICAgICAgIH1cblxuICAgICAgICBuYW1lID0gbmFtZSA/IGAuJHtuYW1lfWAgOiAnJztcblxuICAgICAgICBsZXQgbm9kZU5hbWUgPSB0aGlzLnVua25vd247XG4gICAgICAgIGlmIChub2RlLm5hbWUpIHtcbiAgICAgICAgICAgIG5vZGVOYW1lID0gbm9kZS5uYW1lLnRleHQ7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS50ZXh0KSB7XG4gICAgICAgICAgICBub2RlTmFtZSA9IG5vZGUudGV4dDtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlLmV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIGlmIChub2RlLmV4cHJlc3Npb24udGV4dCkge1xuICAgICAgICAgICAgICAgIG5vZGVOYW1lID0gbm9kZS5leHByZXNzaW9uLnRleHQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUuZXhwcmVzc2lvbi5lbGVtZW50cykge1xuICAgICAgICAgICAgICAgIGlmICh0cy5pc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24obm9kZS5leHByZXNzaW9uKSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlTmFtZSA9IG5vZGUuZXhwcmVzc2lvbi5lbGVtZW50cy5tYXAoZWwgPT4gZWwudGV4dCkuam9pbignLCAnKTtcbiAgICAgICAgICAgICAgICAgICAgbm9kZU5hbWUgPSBgWyR7bm9kZU5hbWV9XWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRzLmlzU3ByZWFkRWxlbWVudChub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGAuLi4ke25vZGVOYW1lfWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke3RoaXMuYnVpbGRJZGVudGlmaWVyTmFtZShub2RlLmV4cHJlc3Npb24sIG5vZGVOYW1lKX0ke25hbWV9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBwYXJzZSBleHByZXNzaW9ucyBzdWNoIGFzOlxuICAgICAqIHsgcHJvdmlkZTogQVBQX0JBU0VfSFJFRiwgdXNlVmFsdWU6ICcvJyB9XG4gICAgICogeyBwcm92aWRlOiAnRGF0ZScsIHVzZUZhY3Rvcnk6IChkMSwgZDIpID0+IG5ldyBEYXRlKCksIGRlcHM6IFsnZDEnLCAnZDInXSB9XG4gICAgICovXG4gICAgcHVibGljIHBhcnNlUHJvdmlkZXJDb25maWd1cmF0aW9uKG5vZGU6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKG5vZGUua2luZCAmJiBub2RlLmtpbmQgPT09IFN5bnRheEtpbmQuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIC8vIFNlYXJjaCBmb3IgcHJvdmlkZTogSFRUUF9JTlRFUkNFUFRPUlNcbiAgICAgICAgICAgIC8vIGFuZCBpZiB0cnVlLCByZXR1cm4gdHlwZTogJ2ludGVyY2VwdG9yJyArIG5hbWVcbiAgICAgICAgICAgIGxldCBpbnRlcmNlcHRvck5hbWUsIGhhc0ludGVyY2VwdG9yO1xuICAgICAgICAgICAgaWYgKG5vZGUucHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLnByb3BlcnRpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2gobm9kZS5wcm9wZXJ0aWVzLCBwcm9wZXJ0eSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkua2luZCAmJiBwcm9wZXJ0eS5raW5kID09PSBTeW50YXhLaW5kLlByb3BlcnR5QXNzaWdubWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5uYW1lLnRleHQgPT09ICdwcm92aWRlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkuaW5pdGlhbGl6ZXIudGV4dCA9PT0gJ0hUVFBfSU5URVJDRVBUT1JTJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzSW50ZXJjZXB0b3IgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkubmFtZS50ZXh0ID09PSAndXNlQ2xhc3MnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5Lm5hbWUudGV4dCA9PT0gJ3VzZUV4aXN0aW5nJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmNlcHRvck5hbWUgPSBwcm9wZXJ0eS5pbml0aWFsaXplci50ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGhhc0ludGVyY2VwdG9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGludGVyY2VwdG9yTmFtZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUc1ByaW50ZXJVdGlsKCkucHJpbnQobm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRzUHJpbnRlclV0aWwoKS5wcmludChub2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEtpbmRcbiAgICAgKiAgMTgxIENhbGxFeHByZXNzaW9uID0+IFwiUm91dGVyTW9kdWxlLmZvclJvb3QoYXJncylcIlxuICAgICAqICAgNzEgSWRlbnRpZmllciAgICAgPT4gXCJSb3V0ZXJNb2R1bGVcIiBcIlRvZG9TdG9yZVwiXG4gICAgICogICAgOSBTdHJpbmdMaXRlcmFsICA9PiBcIi4vYXBwLmNvbXBvbmVudC5jc3NcIiBcIi4vdGFiLnNjc3NcIlxuICAgICAqL1xuICAgIHB1YmxpYyBwYXJzZVN5bWJvbEVsZW1lbnRzKFxuICAgICAgICBub2RlOlxuICAgICAgICAgICAgfCB0cy5DYWxsRXhwcmVzc2lvblxuICAgICAgICAgICAgfCB0cy5JZGVudGlmaWVyXG4gICAgICAgICAgICB8IHRzLlN0cmluZ0xpdGVyYWxcbiAgICAgICAgICAgIHwgdHMuUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uXG4gICAgICAgICAgICB8IHRzLlNwcmVhZEVsZW1lbnRcbiAgICApOiBzdHJpbmcge1xuICAgICAgICAvLyBwYXJzZSBleHByZXNzaW9ucyBzdWNoIGFzOiBBbmd1bGFyRmlyZU1vZHVsZS5pbml0aWFsaXplQXBwKGZpcmViYXNlQ29uZmlnKVxuICAgICAgICAvLyBpZiAodHMuaXNDYWxsRXhwcmVzc2lvbihub2RlKSAmJiB0cy5pc1Byb3BlcnR5QWNjZXNzRXhwcmVzc2lvbihub2RlLmV4cHJlc3Npb24pKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICh0cy5pc0NhbGxFeHByZXNzaW9uKG5vZGUpICYmIHRzLmlzUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uKG5vZGUuZXhwcmVzc2lvbikpIHx8XG4gICAgICAgICAgICAodHMuaXNOZXdFeHByZXNzaW9uKG5vZGUpICYmIHRzLmlzRWxlbWVudEFjY2Vzc0V4cHJlc3Npb24obm9kZS5leHByZXNzaW9uKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBsZXQgY2xhc3NOYW1lID0gdGhpcy5idWlsZElkZW50aWZpZXJOYW1lKG5vZGUuZXhwcmVzc2lvbik7XG5cbiAgICAgICAgICAgIC8vIGZ1bmN0aW9uIGFyZ3VtZW50cyBjb3VsZCBiZSByZWFsbHkgY29tcGxleC4gVGhlcmUgYXJlIHNvXG4gICAgICAgICAgICAvLyBtYW55IHVzZSBjYXNlcyB0aGF0IHdlIGNhbid0IGhhbmRsZS4gSnVzdCBwcmludCBcImFyZ3NcIiB0byBpbmRpY2F0ZVxuICAgICAgICAgICAgLy8gdGhhdCB3ZSBoYXZlIGFyZ3VtZW50cy5cblxuICAgICAgICAgICAgbGV0IGZ1bmN0aW9uQXJncyA9IG5vZGUuYXJndW1lbnRzLmxlbmd0aCA+IDAgPyAnYXJncycgOiAnJztcbiAgICAgICAgICAgIGxldCB0ZXh0ID0gYCR7Y2xhc3NOYW1lfSgke2Z1bmN0aW9uQXJnc30pYDtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0O1xuICAgICAgICB9IGVsc2UgaWYgKHRzLmlzUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uKG5vZGUpKSB7XG4gICAgICAgICAgICAvLyBwYXJzZSBleHByZXNzaW9ucyBzdWNoIGFzOiBTaGFyZWQuTW9kdWxlXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5idWlsZElkZW50aWZpZXJOYW1lKG5vZGUpO1xuICAgICAgICB9IGVsc2UgaWYgKHRzLmlzSWRlbnRpZmllcihub2RlKSkge1xuICAgICAgICAgICAgLy8gcGFyc2UgZXhwcmVzc2lvbnMgc3VjaCBhczogTXlDb21wb25lbnRcbiAgICAgICAgICAgIGlmIChub2RlLnRleHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS50ZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGUuZXNjYXBlZFRleHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5lc2NhcGVkVGV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0cy5pc1NwcmVhZEVsZW1lbnQobm9kZSkpIHtcbiAgICAgICAgICAgIC8vIHBhcnNlIGV4cHJlc3Npb25zIHN1Y2ggYXM6IC4uLk1ZQVJSQVlcbiAgICAgICAgICAgIC8vIFJlc29sdmUgTVlBUlJBWSBpbiBpbXBvcnRzIG9yIGxvY2FsIGZpbGUgdmFyaWFibGVzIGFmdGVyIGZ1bGwgc2NhbiwganVzdCByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlXG4gICAgICAgICAgICBpZiAobm9kZS5leHByZXNzaW9uICYmIG5vZGUuZXhwcmVzc2lvbi50ZXh0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUuZXhwcmVzc2lvbi50ZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5vZGUudGV4dCA/IG5vZGUudGV4dCA6IHRoaXMucGFyc2VQcm92aWRlckNvbmZpZ3VyYXRpb24obm9kZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogS2luZFxuICAgICAqICAxNzcgQXJyYXlMaXRlcmFsRXhwcmVzc2lvblxuICAgICAqICAxMjIgQm9vbGVhbktleXdvcmRcbiAgICAgKiAgICA5IFN0cmluZ0xpdGVyYWxcbiAgICAgKi9cbiAgICBwcml2YXRlIHBhcnNlU3ltYm9scyhcbiAgICAgICAgbm9kZTogdHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnQsXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBBcnJheTxzdHJpbmcgfCBib29sZWFuPiB7XG4gICAgICAgIGxldCBsb2NhbE5vZGUgPSBub2RlO1xuXG4gICAgICAgIGlmICh0cy5pc1Nob3J0aGFuZFByb3BlcnR5QXNzaWdubWVudChsb2NhbE5vZGUpKSB7XG4gICAgICAgICAgICBsb2NhbE5vZGUgPSB0aGlzLmltcG9ydHNVdGlsLmZpbmRWYWx1ZUluSW1wb3J0T3JMb2NhbFZhcmlhYmxlcyhub2RlLm5hbWUudGV4dCwgc3JjRmlsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHMuaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uKGxvY2FsTm9kZS5pbml0aWFsaXplcikpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbE5vZGUuaW5pdGlhbGl6ZXIuZWxlbWVudHMubWFwKHggPT4gdGhpcy5wYXJzZVN5bWJvbEVsZW1lbnRzKHgpKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIHRzLmlzU3RyaW5nTGl0ZXJhbChsb2NhbE5vZGUuaW5pdGlhbGl6ZXIpIHx8XG4gICAgICAgICAgICB0cy5pc1RlbXBsYXRlTGl0ZXJhbChsb2NhbE5vZGUuaW5pdGlhbGl6ZXIpIHx8XG4gICAgICAgICAgICAodHMuaXNQcm9wZXJ0eUFzc2lnbm1lbnQobG9jYWxOb2RlKSAmJiBsb2NhbE5vZGUuaW5pdGlhbGl6ZXIudGV4dClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gW2xvY2FsTm9kZS5pbml0aWFsaXplci50ZXh0XTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIGxvY2FsTm9kZS5pbml0aWFsaXplci5raW5kICYmXG4gICAgICAgICAgICAobG9jYWxOb2RlLmluaXRpYWxpemVyLmtpbmQgPT09IFN5bnRheEtpbmQuVHJ1ZUtleXdvcmQgfHxcbiAgICAgICAgICAgICAgICBsb2NhbE5vZGUuaW5pdGlhbGl6ZXIua2luZCA9PT0gU3ludGF4S2luZC5GYWxzZUtleXdvcmQpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIFtsb2NhbE5vZGUuaW5pdGlhbGl6ZXIua2luZCA9PT0gU3ludGF4S2luZC5UcnVlS2V5d29yZCA/IHRydWUgOiBmYWxzZV07XG4gICAgICAgIH0gZWxzZSBpZiAodHMuaXNQcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24obG9jYWxOb2RlLmluaXRpYWxpemVyKSkge1xuICAgICAgICAgICAgbGV0IGlkZW50aWZpZXIgPSB0aGlzLnBhcnNlU3ltYm9sRWxlbWVudHMobG9jYWxOb2RlLmluaXRpYWxpemVyKTtcbiAgICAgICAgICAgIHJldHVybiBbaWRlbnRpZmllcl07XG4gICAgICAgIH0gZWxzZSBpZiAodHMuaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uKGxvY2FsTm9kZS5pbml0aWFsaXplcikpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbE5vZGUuaW5pdGlhbGl6ZXIuZWxlbWVudHMubWFwKHggPT4gdGhpcy5wYXJzZVN5bWJvbEVsZW1lbnRzKHgpKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIGxvY2FsTm9kZS5pbml0aWFsaXplciAmJlxuICAgICAgICAgICAgbG9jYWxOb2RlLmluaXRpYWxpemVyLmVsZW1lbnRzICYmXG4gICAgICAgICAgICBsb2NhbE5vZGUuaW5pdGlhbGl6ZXIuZWxlbWVudHMubGVuZ3RoID4gMFxuICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIE5vZGUgcmVwbGFjZWQgYnkgdHMtc2ltcGxlLWFzdCAmIGtpbmQgPSAyNjVcbiAgICAgICAgICAgIHJldHVybiBsb2NhbE5vZGUuaW5pdGlhbGl6ZXIuZWxlbWVudHMubWFwKHggPT4gdGhpcy5wYXJzZVN5bWJvbEVsZW1lbnRzKHgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTeW1ib2xEZXBzKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICB0eXBlOiBzdHJpbmcsXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGUsXG4gICAgICAgIG11bHRpTGluZT86IGJvb2xlYW5cbiAgICApOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgaWYgKHByb3BzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGkgPSAwLFxuICAgICAgICAgICAgbGVuID0gcHJvcHMubGVuZ3RoLFxuICAgICAgICAgICAgZmlsdGVyZWRQcm9wcyA9IFtdO1xuXG4gICAgICAgIGZvciAoaTsgaTxsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKHByb3BzW2ldLm5hbWUgJiYgcHJvcHNbaV0ubmFtZS50ZXh0ID09PSB0eXBlKSB7XG4gICAgICAgICAgICAgICAgZmlsdGVyZWRQcm9wcy5wdXNoKHByb3BzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaWx0ZXJlZFByb3BzLm1hcCh4ID0+IHRoaXMucGFyc2VTeW1ib2xzKHgsIHNyY0ZpbGUpKS5wb3AoKSB8fCBbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U3ltYm9sRGVwc1JhdyhcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgdHlwZTogc3RyaW5nLFxuICAgICAgICBtdWx0aUxpbmU/OiBib29sZWFuXG4gICAgKTogQXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPiB7XG4gICAgICAgIHJldHVybiBwcm9wcy5maWx0ZXIobm9kZSA9PiBub2RlLm5hbWUudGV4dCA9PT0gdHlwZSk7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQYXJzZURlZXBJZGVudGlmaWVyUmVzdWx0IHtcbiAgICBucz86IGFueTtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZmlsZT86IHN0cmluZztcbiAgICB0eXBlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG4iLCJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgdHMgfSBmcm9tICd0cy1zaW1wbGUtYXN0JztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInO1xuXG5pbXBvcnQgeyBzdHJpcEJvbSwgaGFzQm9tIH0gZnJvbSAnLi91dGlscy91dGlscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhbk5hbWVXaXRob3V0U3BhY2VBbmRUb0xvd2VyQ2FzZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvIC9nLCAnLScpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0SW5kZW50KHN0ciwgY291bnQsIGluZGVudD8pOiBzdHJpbmcge1xuICAgIGxldCBzdHJpcEluZGVudCA9IChzdHI6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBtYXRjaCA9IHN0ci5tYXRjaCgvXlsgXFx0XSooPz1cXFMpL2dtKTtcblxuICAgICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVE9ETzogdXNlIHNwcmVhZCBvcGVyYXRvciB3aGVuIHRhcmdldGluZyBOb2RlLmpzIDZcbiAgICAgICAgY29uc3QgaW5kZW50ID0gTWF0aC5taW4uYXBwbHkoTWF0aCwgbWF0Y2gubWFwKHggPT4geC5sZW5ndGgpKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoYF5bIFxcXFx0XXske2luZGVudH19YCwgJ2dtJyk7XG5cbiAgICAgICAgcmV0dXJuIGluZGVudCA+IDAgPyBzdHIucmVwbGFjZShyZSwgJycpIDogc3RyO1xuICAgIH07XG5cbiAgICBsZXQgcmVwZWF0aW5nID0gKG4sIHN0cikgPT4ge1xuICAgICAgICBzdHIgPSBzdHIgPT09IHVuZGVmaW5lZCA/ICcgJyA6IHN0cjtcblxuICAgICAgICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIFxcYGlucHV0XFxgIHRvIGJlIGEgXFxgc3RyaW5nXFxgLCBnb3QgXFxgJHt0eXBlb2Ygc3RyfVxcYGApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG4gPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBcXGBjb3VudFxcYCB0byBiZSBhIHBvc2l0aXZlIGZpbml0ZSBudW1iZXIsIGdvdCBcXGAke259XFxgYCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0ID0gJyc7XG5cbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgaWYgKG4gJiAxKSB7XG4gICAgICAgICAgICAgICAgcmV0ICs9IHN0cjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3RyICs9IHN0cjtcbiAgICAgICAgfSB3aGlsZSAoKG4gPj49IDEpKTtcblxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH07XG5cbiAgICBsZXQgaW5kZW50U3RyaW5nID0gKHN0ciwgY291bnQsIGluZGVudCkgPT4ge1xuICAgICAgICBpbmRlbnQgPSBpbmRlbnQgPT09IHVuZGVmaW5lZCA/ICcgJyA6IGluZGVudDtcbiAgICAgICAgY291bnQgPSBjb3VudCA9PT0gdW5kZWZpbmVkID8gMSA6IGNvdW50O1xuXG4gICAgICAgIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgXFxgaW5wdXRcXGAgdG8gYmUgYSBcXGBzdHJpbmdcXGAsIGdvdCBcXGAke3R5cGVvZiBzdHJ9XFxgYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvdW50ICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgXFxgY291bnRcXGAgdG8gYmUgYSBcXGBudW1iZXJcXGAsIGdvdCBcXGAke3R5cGVvZiBjb3VudH1cXGBgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgaW5kZW50ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgXFxgaW5kZW50XFxgIHRvIGJlIGEgXFxgc3RyaW5nXFxgLCBnb3QgXFxgJHt0eXBlb2YgaW5kZW50fVxcYGApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5kZW50ID0gY291bnQgPiAxID8gcmVwZWF0aW5nKGNvdW50LCBpbmRlbnQpIDogaW5kZW50O1xuXG4gICAgICAgIHJldHVybiBzdHIucmVwbGFjZSgvXig/IVxccyokKS9nbSwgaW5kZW50KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGluZGVudFN0cmluZyhzdHJpcEluZGVudChzdHIpLCBjb3VudCB8fCAwLCBpbmRlbnQpO1xufVxuXG4vLyBDcmVhdGUgYSBjb21waWxlckhvc3Qgb2JqZWN0IHRvIGFsbG93IHRoZSBjb21waWxlciB0byByZWFkIGFuZCB3cml0ZSBmaWxlc1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGVySG9zdCh0cmFuc3BpbGVPcHRpb25zOiBhbnkpOiB0cy5Db21waWxlckhvc3Qge1xuICAgIGNvbnN0IGlucHV0RmlsZU5hbWUgPVxuICAgICAgICB0cmFuc3BpbGVPcHRpb25zLmZpbGVOYW1lIHx8ICh0cmFuc3BpbGVPcHRpb25zLmpzeCA/ICdtb2R1bGUudHN4JyA6ICdtb2R1bGUudHMnKTtcblxuICAgIGNvbnN0IHRvUmV0dXJuOiB0cy5Db21waWxlckhvc3QgPSB7XG4gICAgICAgIGdldFNvdXJjZUZpbGU6IChmaWxlTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBpZiAoZmlsZU5hbWUubGFzdEluZGV4T2YoJy50cycpICE9PSAtMSB8fCBmaWxlTmFtZS5sYXN0SW5kZXhPZignLmpzJykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lID09PSAnbGliLmQudHMnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChmaWxlTmFtZS5zdWJzdHIoLTUpID09PSAnLmQudHMnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHBhdGguaXNBYnNvbHV0ZShmaWxlTmFtZSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gcGF0aC5qb2luKHRyYW5zcGlsZU9wdGlvbnMudHNjb25maWdEaXJlY3RvcnksIGZpbGVOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBsaWJTb3VyY2UgPSAnJztcblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGxpYlNvdXJjZSA9IGZzLnJlYWRGaWxlU3luYyhmaWxlTmFtZSkudG9TdHJpbmcoKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQm9tKGxpYlNvdXJjZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpYlNvdXJjZSA9IHN0cmlwQm9tKGxpYlNvdXJjZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhlLCBmaWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRzLmNyZWF0ZVNvdXJjZUZpbGUoZmlsZU5hbWUsIGxpYlNvdXJjZSwgdHJhbnNwaWxlT3B0aW9ucy50YXJnZXQsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIHdyaXRlRmlsZTogKG5hbWUsIHRleHQpID0+IHt9LFxuICAgICAgICBnZXREZWZhdWx0TGliRmlsZU5hbWU6ICgpID0+ICdsaWIuZC50cycsXG4gICAgICAgIHVzZUNhc2VTZW5zaXRpdmVGaWxlTmFtZXM6ICgpID0+IGZhbHNlLFxuICAgICAgICBnZXRDYW5vbmljYWxGaWxlTmFtZTogZmlsZU5hbWUgPT4gZmlsZU5hbWUsXG4gICAgICAgIGdldEN1cnJlbnREaXJlY3Rvcnk6ICgpID0+ICcnLFxuICAgICAgICBnZXROZXdMaW5lOiAoKSA9PiAnXFxuJyxcbiAgICAgICAgZmlsZUV4aXN0czogKGZpbGVOYW1lKTogYm9vbGVhbiA9PiBmaWxlTmFtZSA9PT0gaW5wdXRGaWxlTmFtZSxcbiAgICAgICAgcmVhZEZpbGU6ICgpID0+ICcnLFxuICAgICAgICBkaXJlY3RvcnlFeGlzdHM6ICgpID0+IHRydWUsXG4gICAgICAgIGdldERpcmVjdG9yaWVzOiAoKSA9PiBbXVxuICAgIH07XG5cbiAgICByZXR1cm4gdG9SZXR1cm47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kTWFpblNvdXJjZUZvbGRlcihmaWxlczogc3RyaW5nW10pIHtcbiAgICBsZXQgbWFpbkZvbGRlciA9ICcnO1xuICAgIGxldCBtYWluRm9sZGVyQ291bnQgPSAwO1xuICAgIGxldCByYXdGb2xkZXJzID0gZmlsZXMubWFwKGZpbGVwYXRoID0+IHtcbiAgICAgICAgbGV0IHNob3J0UGF0aCA9IGZpbGVwYXRoLnJlcGxhY2UocHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwLCAnJyk7XG4gICAgICAgIHJldHVybiBwYXRoLmRpcm5hbWUoc2hvcnRQYXRoKTtcbiAgICB9KTtcbiAgICBsZXQgZm9sZGVycyA9IHt9O1xuICAgIHJhd0ZvbGRlcnMgPSBfLnVuaXEocmF3Rm9sZGVycyk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhd0ZvbGRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHNlcCA9IHJhd0ZvbGRlcnNbaV0uc3BsaXQocGF0aC5zZXApO1xuICAgICAgICBzZXAubWFwKGZvbGRlciA9PiB7XG4gICAgICAgICAgICBpZiAoZm9sZGVyc1tmb2xkZXJdKSB7XG4gICAgICAgICAgICAgICAgZm9sZGVyc1tmb2xkZXJdICs9IDE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvbGRlcnNbZm9sZGVyXSA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmb3IgKGxldCBmIGluIGZvbGRlcnMpIHtcbiAgICAgICAgaWYgKGZvbGRlcnNbZl0gPiBtYWluRm9sZGVyQ291bnQpIHtcbiAgICAgICAgICAgIG1haW5Gb2xkZXJDb3VudCA9IGZvbGRlcnNbZl07XG4gICAgICAgICAgICBtYWluRm9sZGVyID0gZjtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFpbkZvbGRlcjtcbn1cbiIsImltcG9ydCB7IHRzIH0gZnJvbSAndHMtc2ltcGxlLWFzdCc7XG5pbXBvcnQgeyBTeW1ib2xIZWxwZXIsIElQYXJzZURlZXBJZGVudGlmaWVyUmVzdWx0IH0gZnJvbSAnLi9zeW1ib2wtaGVscGVyJztcbmltcG9ydCB7IGRldGVjdEluZGVudCB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3V0aWxpdGllcyc7XG5pbXBvcnQgeyBJRGVwLCBEZXBzIH0gZnJvbSAnLi4vLi4vZGVwZW5kZW5jaWVzLmludGVyZmFjZXMnO1xuaW1wb3J0IHsgQ2xhc3NIZWxwZXIgfSBmcm9tICcuL2NsYXNzLWhlbHBlcic7XG5cbmV4cG9ydCBjbGFzcyBDb21wb25lbnRIZWxwZXIge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGNsYXNzSGVscGVyOiBDbGFzc0hlbHBlcixcbiAgICAgICAgcHJpdmF0ZSBzeW1ib2xIZWxwZXI6IFN5bWJvbEhlbHBlciA9IG5ldyBTeW1ib2xIZWxwZXIoKVxuICAgICkge31cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRDaGFuZ2VEZXRlY3Rpb24oXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXIuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ2NoYW5nZURldGVjdGlvbicsIHNyY0ZpbGUpLnBvcCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRFbmNhcHN1bGF0aW9uKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAnZW5jYXBzdWxhdGlvbicsIHNyY0ZpbGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRQdXJlKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHMocHJvcHMsICdwdXJlJywgc3JjRmlsZSkucG9wKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudE5hbWUoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXIuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ25hbWUnLCBzcmNGaWxlKS5wb3AoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50RXhwb3J0QXMoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXIuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ2V4cG9ydEFzJywgc3JjRmlsZSkucG9wKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudEhvc3QoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT5cbiAgICApOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3ltYm9sRGVwc09iamVjdChwcm9wcywgJ2hvc3QnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50SW5wdXRzTWV0YWRhdGEoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHMocHJvcHMsICdpbnB1dHMnLCBzcmNGaWxlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50VGVtcGxhdGUoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBzdHJpbmcge1xuICAgICAgICBsZXQgdCA9IHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHMocHJvcHMsICd0ZW1wbGF0ZScsIHNyY0ZpbGUsIHRydWUpLnBvcCgpO1xuICAgICAgICBpZiAodCkge1xuICAgICAgICAgICAgdCA9IGRldGVjdEluZGVudCh0LCAwKTtcbiAgICAgICAgICAgIHQgPSB0LnJlcGxhY2UoL1xcbi8sICcnKTtcbiAgICAgICAgICAgIHQgPSB0LnJlcGxhY2UoLyArJC9nbSwgJycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRTdHlsZVVybHMoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNhbml0aXplVXJscyh0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAnc3R5bGVVcmxzJywgc3JjRmlsZSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRTdHlsZXMoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAnc3R5bGVzJywgc3JjRmlsZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudE1vZHVsZUlkKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHMocHJvcHMsICdtb2R1bGVJZCcsIHNyY0ZpbGUpLnBvcCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRPdXRwdXRzKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXIuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ291dHB1dHMnLCBzcmNGaWxlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50UHJvdmlkZXJzKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogQXJyYXk8SVBhcnNlRGVlcElkZW50aWZpZXJSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyXG4gICAgICAgICAgICAuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ3Byb3ZpZGVycycsIHNyY0ZpbGUpXG4gICAgICAgICAgICAubWFwKG5hbWUgPT4gdGhpcy5zeW1ib2xIZWxwZXIucGFyc2VEZWVwSW5kZW50aWZpZXIobmFtZSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRFbnRyeUNvbXBvbmVudHMoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBBcnJheTxJUGFyc2VEZWVwSWRlbnRpZmllclJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXJcbiAgICAgICAgICAgIC5nZXRTeW1ib2xEZXBzKHByb3BzLCAnZW50cnlDb21wb25lbnRzJywgc3JjRmlsZSlcbiAgICAgICAgICAgIC5tYXAobmFtZSA9PiB0aGlzLnN5bWJvbEhlbHBlci5wYXJzZURlZXBJbmRlbnRpZmllcihuYW1lKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudFZpZXdQcm92aWRlcnMoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBBcnJheTxJUGFyc2VEZWVwSWRlbnRpZmllclJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXJcbiAgICAgICAgICAgIC5nZXRTeW1ib2xEZXBzKHByb3BzLCAndmlld1Byb3ZpZGVycycsIHNyY0ZpbGUpXG4gICAgICAgICAgICAubWFwKG5hbWUgPT4gdGhpcy5zeW1ib2xIZWxwZXIucGFyc2VEZWVwSW5kZW50aWZpZXIobmFtZSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRUZW1wbGF0ZVVybChcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IEFycmF5PHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXIuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ3RlbXBsYXRlVXJsJywgc3JjRmlsZSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRFeGFtcGxlVXJscyh0ZXh0OiBzdHJpbmcpOiBBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgbGV0IGV4YW1wbGVVcmxzTWF0Y2hlcyA9IHRleHQubWF0Y2goLzxleGFtcGxlLXVybD4oLio/KTxcXC9leGFtcGxlLXVybD4vZyk7XG4gICAgICAgIGxldCBleGFtcGxlVXJscyA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGV4YW1wbGVVcmxzTWF0Y2hlcyAmJiBleGFtcGxlVXJsc01hdGNoZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBleGFtcGxlVXJscyA9IGV4YW1wbGVVcmxzTWF0Y2hlcy5tYXAoZnVuY3Rpb24odmFsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbC5yZXBsYWNlKC88XFwvP2V4YW1wbGUtdXJsPi9nLCAnJyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXhhbXBsZVVybHM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudFByZXNlcnZlV2hpdGVzcGFjZXMoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXIuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ3ByZXNlcnZlV2hpdGVzcGFjZXMnLCBzcmNGaWxlKS5wb3AoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50U2VsZWN0b3IoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXIuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ3NlbGVjdG9yJywgc3JjRmlsZSkucG9wKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXJzZVByb3BlcnRpZXMobm9kZTogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+KTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gICAgICAgIGxldCBvYmogPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgICAgICBsZXQgcHJvcGVydGllcyA9IG5vZGUuaW5pdGlhbGl6ZXIucHJvcGVydGllcyB8fCBbXTtcbiAgICAgICAgcHJvcGVydGllcy5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICAgICAgb2JqLnNldChwcm9wLm5hbWUudGV4dCwgcHJvcC5pbml0aWFsaXplci50ZXh0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFN5bWJvbERlcHNPYmplY3QoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHR5cGU6IHN0cmluZyxcbiAgICAgICAgbXVsdGlMaW5lPzogYm9vbGVhblxuICAgICk6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICAgICAgICBsZXQgaSA9IDAsXG4gICAgICAgICAgICBsZW4gPSBwcm9wcy5sZW5ndGgsXG4gICAgICAgICAgICBmaWx0ZXJlZFByb3BzID0gW107XG5cbiAgICAgICAgZm9yIChpOyBpPGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAocHJvcHNbaV0ubmFtZSAmJiBwcm9wc1tpXS5uYW1lLnRleHQgPT09IHR5cGUpIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXJlZFByb3BzLnB1c2gocHJvcHNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWx0ZXJlZFByb3BzLm1hcCh4ID0+IHRoaXMucGFyc2VQcm9wZXJ0aWVzKHgpKS5wb3AoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50SU8oXG4gICAgICAgIGZpbGVuYW1lOiBzdHJpbmcsXG4gICAgICAgIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUsXG4gICAgICAgIG5vZGU6IHRzLk5vZGUsXG4gICAgICAgIGZpbGVCb2R5XG4gICAgKTogYW55IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvcHlyaWdodCBodHRwczovL2dpdGh1Yi5jb20vbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcFxuICAgICAgICAgKi9cbiAgICAgICAgbGV0IHJlZHVjZWRTb3VyY2UgPSBmaWxlQm9keSA/IGZpbGVCb2R5LnN0YXRlbWVudHMgOiBzb3VyY2VGaWxlLnN0YXRlbWVudHM7XG4gICAgICAgIGxldCByZXMgPSByZWR1Y2VkU291cmNlLnJlZHVjZSgoZGlyZWN0aXZlLCBzdGF0ZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmICh0cy5pc0NsYXNzRGVjbGFyYXRpb24oc3RhdGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQucG9zID09PSBub2RlLnBvcyAmJiBzdGF0ZW1lbnQuZW5kID09PSBub2RlLmVuZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlyZWN0aXZlLmNvbmNhdChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NIZWxwZXIudmlzaXRDbGFzc0RlY2xhcmF0aW9uKGZpbGVuYW1lLCBzdGF0ZW1lbnQsIHNvdXJjZUZpbGUpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgICAgICB9LCBbXSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc1swXSB8fCB7fTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNhbml0aXplVXJscyh1cmxzOiBBcnJheTxzdHJpbmc+KTogQXJyYXk8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB1cmxzLm1hcCh1cmwgPT4gdXJsLnJlcGxhY2UoJy4vJywgJycpKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb21wb25lbnRDYWNoZSB7XG4gICAgcHJpdmF0ZSBjYWNoZTogTWFwPHN0cmluZywgYW55PiA9IG5ldyBNYXAoKTtcblxuICAgIHB1YmxpYyBnZXQoa2V5OiBzdHJpbmcpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQoa2V5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2FjaGUuc2V0KGtleSwgdmFsdWUpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IGZpbmQsIGNvbmNhdCwgY2xvbmVEZWVwIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25JbnRlcmZhY2UgfSBmcm9tICcuLi9hcHAvaW50ZXJmYWNlcy9jb25maWd1cmF0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBjbGVhbkxpZmVjeWNsZUhvb2tzRnJvbU1ldGhvZHMgfSBmcm9tICcuJztcblxuZXhwb3J0IGNsYXNzIEV4dGVuZHNNZXJnZXIge1xuICAgIHByaXZhdGUgY29tcG9uZW50cztcbiAgICBwcml2YXRlIGNsYXNzZXM7XG5cbiAgICBwdWJsaWMgbWVyZ2UoZGVwcywgY29uZmlndXJhdGlvbjogQ29uZmlndXJhdGlvbkludGVyZmFjZSkge1xuICAgICAgICB0aGlzLmNvbXBvbmVudHMgPSBkZXBzLmNvbXBvbmVudHM7XG4gICAgICAgIHRoaXMuY2xhc3NlcyA9IGRlcHMuY2xhc3NlcztcblxuICAgICAgICB0aGlzLmNvbXBvbmVudHMuZm9yRWFjaChjb21wb25lbnQgPT4ge1xuICAgICAgICAgICAgbGV0IGV4dDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50LmV4dGVuZHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgZXh0ID0gdGhpcy5maW5kSW5EZXBlbmRlbmNpZXMoY29tcG9uZW50LmV4dGVuZHMpO1xuICAgICAgICAgICAgICAgIGlmIChleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRnJvbSBjbGFzcyB0byBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBleHQubWV0aG9kcyAhPT0gJ3VuZGVmaW5lZCcgJiYgZXh0Lm1ldGhvZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld01ldGhvZHMgPSBjbG9uZURlZXAoZXh0Lm1ldGhvZHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3TWV0aG9kcyA9IHRoaXMubWFya0luaGVyaXRhbmNlKG5ld01ldGhvZHMsIGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5tZXRob2RzQ2xhc3MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50Lm1ldGhvZHNDbGFzcyA9IFsuLi5jb21wb25lbnQubWV0aG9kc0NsYXNzLCAuLi5uZXdNZXRob2RzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGV4dC5wcm9wZXJ0aWVzICE9PSAndW5kZWZpbmVkJyAmJiBleHQucHJvcGVydGllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3UHJvcGVydGllcyA9IGNsb25lRGVlcChleHQucHJvcGVydGllcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdQcm9wZXJ0aWVzID0gdGhpcy5tYXJrSW5oZXJpdGFuY2UobmV3UHJvcGVydGllcywgZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50LnByb3BlcnRpZXNDbGFzcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQucHJvcGVydGllc0NsYXNzID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jb21wb25lbnQucHJvcGVydGllc0NsYXNzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5uZXdQcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBGcm9tIGNvbXBvbmVudCB0byBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBleHQuaW5wdXRzQ2xhc3MgIT09ICd1bmRlZmluZWQnICYmIGV4dC5pbnB1dHNDbGFzcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3SW5wdXRzID0gY2xvbmVEZWVwKGV4dC5pbnB1dHNDbGFzcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdJbnB1dHMgPSB0aGlzLm1hcmtJbmhlcml0YW5jZShuZXdJbnB1dHMsIGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5pbnB1dHNDbGFzcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuaW5wdXRzQ2xhc3MgPSBbLi4uY29tcG9uZW50LmlucHV0c0NsYXNzLCAuLi5uZXdJbnB1dHNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZXh0Lm91dHB1dHNDbGFzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgZXh0Lm91dHB1dHNDbGFzcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3T3V0cHV0cyA9IGNsb25lRGVlcChleHQub3V0cHV0c0NsYXNzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld091dHB1dHMgPSB0aGlzLm1hcmtJbmhlcml0YW5jZShuZXdPdXRwdXRzLCBleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQub3V0cHV0c0NsYXNzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5vdXRwdXRzQ2xhc3MgPSBbLi4uY29tcG9uZW50Lm91dHB1dHNDbGFzcywgLi4ubmV3T3V0cHV0c107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBleHQubWV0aG9kc0NsYXNzICE9PSAndW5kZWZpbmVkJyAmJiBleHQubWV0aG9kc0NsYXNzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdNZXRob2RzID0gY2xvbmVEZWVwKGV4dC5tZXRob2RzQ2xhc3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3TWV0aG9kcyA9IHRoaXMubWFya0luaGVyaXRhbmNlKG5ld01ldGhvZHMsIGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5tZXRob2RzQ2xhc3MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50Lm1ldGhvZHNDbGFzcyA9IFsuLi5jb21wb25lbnQubWV0aG9kc0NsYXNzLCAuLi5uZXdNZXRob2RzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgZXh0LnByb3BlcnRpZXNDbGFzcyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dC5wcm9wZXJ0aWVzQ2xhc3MubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdQcm9wZXJ0aWVzID0gY2xvbmVEZWVwKGV4dC5wcm9wZXJ0aWVzQ2xhc3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3UHJvcGVydGllcyA9IHRoaXMubWFya0luaGVyaXRhbmNlKG5ld1Byb3BlcnRpZXMsIGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5wcm9wZXJ0aWVzQ2xhc3MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnByb3BlcnRpZXNDbGFzcyA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY29tcG9uZW50LnByb3BlcnRpZXNDbGFzcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ubmV3UHJvcGVydGllc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBleHQuaG9zdEJpbmRpbmdzICE9PSAndW5kZWZpbmVkJyAmJiBleHQuaG9zdEJpbmRpbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdIb3N0QmluZGluZ3MgPSBjbG9uZURlZXAoZXh0Lmhvc3RCaW5kaW5ncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdIb3N0QmluZGluZ3MgPSB0aGlzLm1hcmtJbmhlcml0YW5jZShuZXdIb3N0QmluZGluZ3MsIGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5ob3N0QmluZGluZ3MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50Lmhvc3RCaW5kaW5ncyA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY29tcG9uZW50Lmhvc3RCaW5kaW5ncyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ubmV3SG9zdEJpbmRpbmdzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGV4dC5ob3N0TGlzdGVuZXJzICE9PSAndW5kZWZpbmVkJyAmJiBleHQuaG9zdExpc3RlbmVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3SG9zdExpc3RlbmVycyA9IGNsb25lRGVlcChleHQuaG9zdExpc3RlbmVycyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdIb3N0TGlzdGVuZXJzID0gdGhpcy5tYXJrSW5oZXJpdGFuY2UobmV3SG9zdExpc3RlbmVycywgZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50Lmhvc3RMaXN0ZW5lcnMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50Lmhvc3RMaXN0ZW5lcnMgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmNvbXBvbmVudC5ob3N0TGlzdGVuZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5uZXdIb3N0TGlzdGVuZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlTGlmZUN5Y2xlSG9va3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5tZXRob2RzQ2xhc3MgPSBjbGVhbkxpZmVjeWNsZUhvb2tzRnJvbU1ldGhvZHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50Lm1ldGhvZHNDbGFzc1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jbGFzc2VzLmZvckVhY2goY2xhID0+IHtcbiAgICAgICAgICAgIGxldCBleHQ7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNsYS5leHRlbmRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGV4dCA9IHRoaXMuZmluZEluRGVwZW5kZW5jaWVzKGNsYS5leHRlbmRzKTtcbiAgICAgICAgICAgICAgICBpZiAoZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZyb20gY2xhc3MgdG8gY2xhc3NcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBleHQubWV0aG9kcyAhPT0gJ3VuZGVmaW5lZCcgJiYgZXh0Lm1ldGhvZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld01ldGhvZHMgPSBjbG9uZURlZXAoZXh0Lm1ldGhvZHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3TWV0aG9kcyA9IHRoaXMubWFya0luaGVyaXRhbmNlKG5ld01ldGhvZHMsIGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNsYS5tZXRob2RzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYS5tZXRob2RzID0gWy4uLmNsYS5tZXRob2RzLCAuLi5uZXdNZXRob2RzXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGV4dC5wcm9wZXJ0aWVzICE9PSAndW5kZWZpbmVkJyAmJiBleHQucHJvcGVydGllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3UHJvcGVydGllcyA9IGNsb25lRGVlcChleHQucHJvcGVydGllcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdQcm9wZXJ0aWVzID0gdGhpcy5tYXJrSW5oZXJpdGFuY2UobmV3UHJvcGVydGllcywgZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2xhLnByb3BlcnRpZXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhLnByb3BlcnRpZXMgPSBbLi4uY2xhLnByb3BlcnRpZXMsIC4uLm5ld1Byb3BlcnRpZXNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGVwcztcbiAgICB9XG5cbiAgICBwcml2YXRlIG1hcmtJbmhlcml0YW5jZShkYXRhLCBvcmlnaW5hbG91cmNlKSB7XG4gICAgICAgIHJldHVybiBkYXRhLm1hcChlbCA9PiB7XG4gICAgICAgICAgICBsZXQgbmV3RWxlbWVudCA9IGVsO1xuICAgICAgICAgICAgbmV3RWxlbWVudC5pbmhlcml0YW5jZSA9IHtcbiAgICAgICAgICAgICAgICBmaWxlOiBvcmlnaW5hbG91cmNlLm5hbWVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gbmV3RWxlbWVudDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kSW5EZXBlbmRlbmNpZXMobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGxldCBtZXJnZWREYXRhID0gY29uY2F0KFtdLCB0aGlzLmNvbXBvbmVudHMsIHRoaXMuY2xhc3Nlcyk7XG4gICAgICAgIGxldCByZXN1bHQgPSBmaW5kKG1lcmdlZERhdGEsIHsgbmFtZTogbmFtZSB9IGFzIGFueSk7XG4gICAgICAgIHJldHVybiByZXN1bHQgfHwgZmFsc2U7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgdHMgfSBmcm9tICd0cy1zaW1wbGUtYXN0JztcblxuaW1wb3J0IHsgQ2xhc3NIZWxwZXIgfSBmcm9tICcuL2FuZ3VsYXIvZGVwcy9oZWxwZXJzL2NsYXNzLWhlbHBlcic7XG5pbXBvcnQgeyBDb21wb25lbnRIZWxwZXIgfSBmcm9tICcuL2FuZ3VsYXIvZGVwcy9oZWxwZXJzL2NvbXBvbmVudC1oZWxwZXInO1xuaW1wb3J0IHsgQ29udHJvbGxlckhlbHBlciB9IGZyb20gJy4vYW5ndWxhci9kZXBzL2hlbHBlcnMvY29udHJvbGxlci1oZWxwZXInO1xuXG5pbXBvcnQgeyBFeHRlbmRzTWVyZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvZXh0ZW5kcy1tZXJnZXIudXRpbCc7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uSW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jb25maWd1cmF0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBSb3V0ZXJQYXJzZXJVdGlsIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgY29tcGlsZXJIb3N0IH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzJztcblxuZXhwb3J0IGNsYXNzIEZyYW1ld29ya0RlcGVuZGVuY2llcyB7XG4gICAgcHJpdmF0ZSBmaWxlczogc3RyaW5nW107XG4gICAgcHJpdmF0ZSBwcm9ncmFtOiB0cy5Qcm9ncmFtO1xuICAgIHByaXZhdGUgdHlwZUNoZWNrZXI6IHRzLlR5cGVDaGVja2VyO1xuICAgIHByaXZhdGUgY2xhc3NIZWxwZXI6IENsYXNzSGVscGVyO1xuICAgIHB1YmxpYyBjb21wb25lbnRIZWxwZXI6IENvbXBvbmVudEhlbHBlcjtcbiAgICBwdWJsaWMgY29udHJvbGxlckhlbHBlcjogQ29udHJvbGxlckhlbHBlcjtcbiAgICBwdWJsaWMgZXh0ZW5kc01lcmdlcjogRXh0ZW5kc01lcmdlcjtcbiAgICBwdWJsaWMgY29uZmlndXJhdGlvbjogQ29uZmlndXJhdGlvbkludGVyZmFjZTtcbiAgICBwdWJsaWMgcm91dGVyUGFyc2VyO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGZpbGVzOiBzdHJpbmdbXSxcbiAgICAgICAgb3B0aW9uczogYW55LFxuICAgICAgICBjb25maWd1cmF0aW9uOiBDb25maWd1cmF0aW9uSW50ZXJmYWNlLFxuICAgICAgICByb3V0ZXJQYXJzZXI6IFJvdXRlclBhcnNlclV0aWxcbiAgICApIHtcbiAgICAgICAgdGhpcy5maWxlcyA9IGZpbGVzO1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uO1xuICAgICAgICB0aGlzLnJvdXRlclBhcnNlciA9IHJvdXRlclBhcnNlcjtcblxuICAgICAgICBjb25zdCB0cmFuc3BpbGVPcHRpb25zID0ge1xuICAgICAgICAgICAgdGFyZ2V0OiB0cy5TY3JpcHRUYXJnZXQuRVM1LFxuICAgICAgICAgICAgbW9kdWxlOiB0cy5Nb2R1bGVLaW5kLkNvbW1vbkpTLFxuICAgICAgICAgICAgdHNjb25maWdEaXJlY3Rvcnk6IG9wdGlvbnMudHNjb25maWdEaXJlY3RvcnksXG4gICAgICAgICAgICBhbGxvd0pzOiB0cnVlXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IHRzLmNyZWF0ZVByb2dyYW0oXG4gICAgICAgICAgICB0aGlzLmZpbGVzLFxuICAgICAgICAgICAgdHJhbnNwaWxlT3B0aW9ucyxcbiAgICAgICAgICAgIGNvbXBpbGVySG9zdCh0cmFuc3BpbGVPcHRpb25zKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnR5cGVDaGVja2VyID0gdGhpcy5wcm9ncmFtLmdldFR5cGVDaGVja2VyKCk7XG4gICAgICAgIHRoaXMuY2xhc3NIZWxwZXIgPSBuZXcgQ2xhc3NIZWxwZXIodGhpcy50eXBlQ2hlY2tlciwgdGhpcy5jb25maWd1cmF0aW9uKTtcbiAgICAgICAgdGhpcy5jb21wb25lbnRIZWxwZXIgPSBuZXcgQ29tcG9uZW50SGVscGVyKHRoaXMuY2xhc3NIZWxwZXIpO1xuICAgICAgICB0aGlzLmV4dGVuZHNNZXJnZXIgPSBuZXcgRXh0ZW5kc01lcmdlcigpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IHRzLCBTeW50YXhLaW5kIH0gZnJvbSAndHMtc2ltcGxlLWFzdCc7XG5cbmV4cG9ydCBjbGFzcyBDb2RlR2VuZXJhdG9yIHtcbiAgICBwdWJsaWMgZ2VuZXJhdGUobm9kZTogdHMuTm9kZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpc2l0QW5kUmVjb2duaXplKG5vZGUsIFtdKS5qb2luKCcnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZpc2l0QW5kUmVjb2duaXplKG5vZGU6IHRzLk5vZGUsIGNvZGU6IEFycmF5PHN0cmluZz4sIGRlcHRoID0gMCk6IEFycmF5PHN0cmluZz4ge1xuICAgICAgICB0aGlzLnJlY29nbml6ZShub2RlLCBjb2RlKTtcbiAgICAgICAgbm9kZS5nZXRDaGlsZHJlbigpLmZvckVhY2goYyA9PiB0aGlzLnZpc2l0QW5kUmVjb2duaXplKGMsIGNvZGUsIGRlcHRoICsgMSkpO1xuICAgICAgICByZXR1cm4gY29kZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlY29nbml6ZShub2RlOiB0cy5Ob2RlLCBjb2RlOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgICAgIGNvbnN0IGNvbnZlcnNpb24gPSBUc0tpbmRDb252ZXJzaW9uLmZpbmQoeCA9PiB4LmtpbmRzLnNvbWUoeiA9PiB6ID09PSBub2RlLmtpbmQpKTtcblxuICAgICAgICBpZiAoY29udmVyc2lvbikge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29udmVyc2lvbi5vdXRwdXQobm9kZSk7XG4gICAgICAgICAgICByZXN1bHQuZm9yRWFjaCh0ZXh0ID0+IHRoaXMuZ2VuKHRleHQsIGNvZGUpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2VuKHRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQsIGNvZGU6IEFycmF5PHN0cmluZz4pOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0b2tlbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRva2VuID09PSAnXFxuJykge1xuICAgICAgICAgICAgY29kZS5wdXNoKCcnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvZGUucHVzaCh0b2tlbik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIFRzS2luZHNUb1RleHQge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBvdXRwdXQ6IChub2RlOiB0cy5Ob2RlKSA9PiBBcnJheTxzdHJpbmc+LCBwdWJsaWMga2luZHM6IEFycmF5PFN5bnRheEtpbmQ+KSB7fVxufVxuXG5jb25zdCBUc0tpbmRDb252ZXJzaW9uOiBBcnJheTxUc0tpbmRzVG9UZXh0PiA9IFtcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnXCInLCBub2RlLnRleHQsICdcIiddLCBbXG4gICAgICAgIFN5bnRheEtpbmQuRmlyc3RMaXRlcmFsVG9rZW4sXG4gICAgICAgIFN5bnRheEtpbmQuSWRlbnRpZmllclxuICAgIF0pLFxuICAgIG5ldyBUc0tpbmRzVG9UZXh0KG5vZGUgPT4gWydcIicsIG5vZGUudGV4dCwgJ1wiJ10sIFtTeW50YXhLaW5kLlN0cmluZ0xpdGVyYWxdKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFtdLCBbU3ludGF4S2luZC5BcnJheUxpdGVyYWxFeHByZXNzaW9uXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ2ltcG9ydCcsICcgJ10sIFtTeW50YXhLaW5kLkltcG9ydEtleXdvcmRdKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnZnJvbScsICcgJ10sIFtTeW50YXhLaW5kLkZyb21LZXl3b3JkXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ1xcbicsICdleHBvcnQnLCAnICddLCBbU3ludGF4S2luZC5FeHBvcnRLZXl3b3JkXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ2NsYXNzJywgJyAnXSwgW1N5bnRheEtpbmQuQ2xhc3NLZXl3b3JkXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ3RoaXMnXSwgW1N5bnRheEtpbmQuVGhpc0tleXdvcmRdKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnY29uc3RydWN0b3InXSwgW1N5bnRheEtpbmQuQ29uc3RydWN0b3JLZXl3b3JkXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ2ZhbHNlJ10sIFtTeW50YXhLaW5kLkZhbHNlS2V5d29yZF0pLFxuICAgIG5ldyBUc0tpbmRzVG9UZXh0KG5vZGUgPT4gWyd0cnVlJ10sIFtTeW50YXhLaW5kLlRydWVLZXl3b3JkXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ251bGwnXSwgW1N5bnRheEtpbmQuTnVsbEtleXdvcmRdKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFtdLCBbU3ludGF4S2luZC5BdFRva2VuXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJysnXSwgW1N5bnRheEtpbmQuUGx1c1Rva2VuXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJyA9PiAnXSwgW1N5bnRheEtpbmQuRXF1YWxzR3JlYXRlclRoYW5Ub2tlbl0pLFxuICAgIG5ldyBUc0tpbmRzVG9UZXh0KG5vZGUgPT4gWycoJ10sIFtTeW50YXhLaW5kLk9wZW5QYXJlblRva2VuXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ3snLCAnICddLCBbXG4gICAgICAgIFN5bnRheEtpbmQuSW1wb3J0Q2xhdXNlLFxuICAgICAgICBTeW50YXhLaW5kLk9iamVjdExpdGVyYWxFeHByZXNzaW9uXG4gICAgXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ3snLCAnXFxuJ10sIFtTeW50YXhLaW5kLkJsb2NrXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ30nXSwgW1N5bnRheEtpbmQuQ2xvc2VCcmFjZVRva2VuXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJyknXSwgW1N5bnRheEtpbmQuQ2xvc2VQYXJlblRva2VuXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ1snXSwgW1N5bnRheEtpbmQuT3BlbkJyYWNrZXRUb2tlbl0pLFxuICAgIG5ldyBUc0tpbmRzVG9UZXh0KG5vZGUgPT4gWyddJ10sIFtTeW50YXhLaW5kLkNsb3NlQnJhY2tldFRva2VuXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJzsnLCAnXFxuJ10sIFtTeW50YXhLaW5kLlNlbWljb2xvblRva2VuXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJywnLCAnICddLCBbU3ludGF4S2luZC5Db21tYVRva2VuXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJyAnLCAnOicsICcgJ10sIFtTeW50YXhLaW5kLkNvbG9uVG9rZW5dKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnLiddLCBbU3ludGF4S2luZC5Eb3RUb2tlbl0pLFxuICAgIG5ldyBUc0tpbmRzVG9UZXh0KG5vZGUgPT4gW10sIFtTeW50YXhLaW5kLkRvU3RhdGVtZW50XSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbXSwgW1N5bnRheEtpbmQuRGVjb3JhdG9yXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJyA9ICddLCBbU3ludGF4S2luZC5GaXJzdEFzc2lnbm1lbnRdKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnICddLCBbU3ludGF4S2luZC5GaXJzdFB1bmN0dWF0aW9uXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ3ByaXZhdGUnLCAnICddLCBbU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZF0pLFxuICAgIG5ldyBUc0tpbmRzVG9UZXh0KG5vZGUgPT4gWydwdWJsaWMnLCAnICddLCBbU3ludGF4S2luZC5QdWJsaWNLZXl3b3JkXSlcbl07XG4iLCJpbXBvcnQgeyBJRGVwIH0gZnJvbSAnLi4vZGVwZW5kZW5jaWVzLmludGVyZmFjZXMnO1xuaW1wb3J0IHsgQ29tcG9uZW50SGVscGVyIH0gZnJvbSAnLi9oZWxwZXJzL2NvbXBvbmVudC1oZWxwZXInO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkludGVyZmFjZSB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvY29uZmlndXJhdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgY2xlYW5MaWZlY3ljbGVIb29rc0Zyb21NZXRob2RzIH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbHMnO1xuXG5jb25zdCBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcblxuZXhwb3J0IGNsYXNzIERpcmVjdGl2ZURlcEZhY3Rvcnkge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGhlbHBlcjogQ29tcG9uZW50SGVscGVyLFxuICAgICAgICBwcml2YXRlIGNvbmZpZ3VyYXRpb246IENvbmZpZ3VyYXRpb25JbnRlcmZhY2UpIHtcblxuICAgIH1cblxuICAgIHB1YmxpYyBjcmVhdGUoZmlsZTogYW55LCBzcmNGaWxlOiBhbnksIG5hbWU6IGFueSwgcHJvcHM6IGFueSwgSU86IGFueSk6IElEaXJlY3RpdmVEZXAge1xuICAgICAgICBsZXQgc291cmNlQ29kZSA9IHNyY0ZpbGUuZ2V0VGV4dCgpO1xuICAgICAgICBsZXQgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKCdtZDUnKS51cGRhdGUoc291cmNlQ29kZSkuZGlnZXN0KCdoZXgnKTtcbiAgICAgICAgbGV0IGRpcmVjdGl2ZURlcHM6IElEaXJlY3RpdmVEZXAgPSB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgaWQ6ICdkaXJlY3RpdmUtJyArIG5hbWUgKyAnLScgKyBoYXNoLFxuICAgICAgICAgICAgZmlsZTogZmlsZSxcbiAgICAgICAgICAgIHR5cGU6ICdkaXJlY3RpdmUnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IElPLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgc291cmNlQ29kZTogc3JjRmlsZS5nZXRUZXh0KCksXG4gICAgICAgICAgICBzZWxlY3RvcjogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50U2VsZWN0b3IocHJvcHMpLFxuICAgICAgICAgICAgcHJvdmlkZXJzOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRQcm92aWRlcnMocHJvcHMpLFxuXG4gICAgICAgICAgICBpbnB1dHNDbGFzczogSU8uaW5wdXRzLFxuICAgICAgICAgICAgb3V0cHV0c0NsYXNzOiBJTy5vdXRwdXRzLFxuXG4gICAgICAgICAgICBob3N0QmluZGluZ3M6IElPLmhvc3RCaW5kaW5ncyxcbiAgICAgICAgICAgIGhvc3RMaXN0ZW5lcnM6IElPLmhvc3RMaXN0ZW5lcnMsXG5cbiAgICAgICAgICAgIHByb3BlcnRpZXNDbGFzczogSU8ucHJvcGVydGllcyxcbiAgICAgICAgICAgIG1ldGhvZHNDbGFzczogSU8ubWV0aG9kcyxcbiAgICAgICAgICAgIGV4YW1wbGVVcmxzOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRFeGFtcGxlVXJscyhzcmNGaWxlLmdldFRleHQoKSlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlTGlmZUN5Y2xlSG9va3MpIHtcbiAgICAgICAgICAgIGRpcmVjdGl2ZURlcHMubWV0aG9kc0NsYXNzID0gY2xlYW5MaWZlY3ljbGVIb29rc0Zyb21NZXRob2RzKGRpcmVjdGl2ZURlcHMubWV0aG9kc0NsYXNzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uanNkb2N0YWdzICYmIElPLmpzZG9jdGFncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBkaXJlY3RpdmVEZXBzLmpzZG9jdGFncyA9IElPLmpzZG9jdGFnc1swXS50YWdzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJTy5pbXBsZW1lbnRzICYmIElPLmltcGxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZGlyZWN0aXZlRGVwcy5pbXBsZW1lbnRzID0gSU8uaW1wbGVtZW50cztcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uY29uc3RydWN0b3IpIHtcbiAgICAgICAgICAgIGRpcmVjdGl2ZURlcHMuY29uc3RydWN0b3JPYmogPSBJTy5jb25zdHJ1Y3RvcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uYWNjZXNzb3JzKSB7XG4gICAgICAgICAgICBkaXJlY3RpdmVEZXBzLmFjY2Vzc29ycyA9IElPLmFjY2Vzc29ycztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGlyZWN0aXZlRGVwcztcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURpcmVjdGl2ZURlcCBleHRlbmRzIElEZXAge1xuICAgIGZpbGU6IGFueTtcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIHNvdXJjZUNvZGU6IHN0cmluZztcblxuICAgIHNlbGVjdG9yOiBzdHJpbmc7XG4gICAgcHJvdmlkZXJzOiBBcnJheTxhbnk+O1xuXG4gICAgaW5wdXRzQ2xhc3M6IGFueTtcbiAgICBvdXRwdXRzQ2xhc3M6IGFueTtcblxuICAgIGhvc3RCaW5kaW5nczogYW55O1xuICAgIGhvc3RMaXN0ZW5lcnM6IGFueTtcblxuICAgIHByb3BlcnRpZXNDbGFzczogYW55O1xuICAgIG1ldGhvZHNDbGFzczogYW55O1xuICAgIGV4YW1wbGVVcmxzOiBBcnJheTxzdHJpbmc+O1xuXG4gICAgY29uc3RydWN0b3JPYmo/OiBPYmplY3Q7XG4gICAganNkb2N0YWdzPzogQXJyYXk8c3RyaW5nPjtcbiAgICBpbXBsZW1lbnRzPzogYW55O1xuICAgIGFjY2Vzc29ycz86IE9iamVjdDtcbn1cbiIsImltcG9ydCB7IElEZXAgfSBmcm9tICcuLi9kZXBlbmRlbmNpZXMuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBNb2R1bGVIZWxwZXIgfSBmcm9tICcuL2hlbHBlcnMvbW9kdWxlLWhlbHBlcic7XG5pbXBvcnQgeyB0cyB9IGZyb20gJ3RzLXNpbXBsZS1hc3QnO1xuXG5jb25zdCBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcblxuZXhwb3J0IGNsYXNzIE1vZHVsZURlcEZhY3Rvcnkge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgbW9kdWxlSGVscGVyOiBNb2R1bGVIZWxwZXIpIHt9XG5cbiAgICBwdWJsaWMgY3JlYXRlKFxuICAgICAgICBmaWxlOiBhbnksXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGUsXG4gICAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgICAgcHJvcGVydGllczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBJTzogYW55XG4gICAgKTogSU1vZHVsZURlcCB7XG4gICAgICAgIGxldCBzb3VyY2VDb2RlID0gc3JjRmlsZS5nZXRUZXh0KCk7XG4gICAgICAgIGxldCBoYXNoID0gY3J5cHRvXG4gICAgICAgICAgICAuY3JlYXRlSGFzaCgnbWQ1JylcbiAgICAgICAgICAgIC51cGRhdGUoc291cmNlQ29kZSlcbiAgICAgICAgICAgIC5kaWdlc3QoJ2hleCcpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGlkOiAnbW9kdWxlLScgKyBuYW1lICsgJy0nICsgaGFzaCxcbiAgICAgICAgICAgIGZpbGU6IGZpbGUsXG4gICAgICAgICAgICBuZ2lkOiB0aGlzLm1vZHVsZUhlbHBlci5nZXRNb2R1bGVJZChwcm9wZXJ0aWVzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIHByb3ZpZGVyczogdGhpcy5tb2R1bGVIZWxwZXIuZ2V0TW9kdWxlUHJvdmlkZXJzKHByb3BlcnRpZXMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgZGVjbGFyYXRpb25zOiB0aGlzLm1vZHVsZUhlbHBlci5nZXRNb2R1bGVEZWNsYXJhdGlvbnMocHJvcGVydGllcywgc3JjRmlsZSksXG4gICAgICAgICAgICBjb250cm9sbGVyczogdGhpcy5tb2R1bGVIZWxwZXIuZ2V0TW9kdWxlQ29udHJvbGxlcnMocHJvcGVydGllcywgc3JjRmlsZSksXG4gICAgICAgICAgICBlbnRyeUNvbXBvbmVudHM6IHRoaXMubW9kdWxlSGVscGVyLmdldE1vZHVsZUVudHJ5Q29tcG9uZW50cyhwcm9wZXJ0aWVzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIGltcG9ydHM6IHRoaXMubW9kdWxlSGVscGVyLmdldE1vZHVsZUltcG9ydHMocHJvcGVydGllcywgc3JjRmlsZSksXG4gICAgICAgICAgICBleHBvcnRzOiB0aGlzLm1vZHVsZUhlbHBlci5nZXRNb2R1bGVFeHBvcnRzKHByb3BlcnRpZXMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgc2NoZW1hczogdGhpcy5tb2R1bGVIZWxwZXIuZ2V0TW9kdWxlU2NoZW1hcyhwcm9wZXJ0aWVzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIGJvb3RzdHJhcDogdGhpcy5tb2R1bGVIZWxwZXIuZ2V0TW9kdWxlQm9vdHN0cmFwKHByb3BlcnRpZXMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgdHlwZTogJ21vZHVsZScsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogSU8uZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBzb3VyY2VDb2RlOiBzcmNGaWxlLnRleHRcbiAgICAgICAgfSBhcyBJTW9kdWxlRGVwO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTW9kdWxlRGVwIGV4dGVuZHMgSURlcCB7XG4gICAgZmlsZTogYW55O1xuICAgIHByb3ZpZGVyczogQXJyYXk8YW55PjtcbiAgICBkZWNsYXJhdGlvbnM6IEFycmF5PGFueT47XG4gICAgY29udHJvbGxlcnM6IEFycmF5PGFueT47XG4gICAgZW50cnlDb21wb25lbnRzOiBBcnJheTxhbnk+O1xuICAgIGltcG9ydHM6IEFycmF5PGFueT47XG4gICAgZXhwb3J0czogQXJyYXk8YW55PjtcbiAgICBib290c3RyYXA6IGFueTtcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIHNvdXJjZUNvZGU6IHN0cmluZztcbn1cbiIsImltcG9ydCB7IElEZXAgfSBmcm9tICcuLi9kZXBlbmRlbmNpZXMuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBDb21wb25lbnRIZWxwZXIgfSBmcm9tICcuL2hlbHBlcnMvY29tcG9uZW50LWhlbHBlcic7XG5pbXBvcnQgeyBjbGVhbkxpZmVjeWNsZUhvb2tzRnJvbU1ldGhvZHMgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscyc7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uSW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcy9jb25maWd1cmF0aW9uLmludGVyZmFjZSc7XG5cbmNvbnN0IGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50RGVwRmFjdG9yeSB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBoZWxwZXI6IENvbXBvbmVudEhlbHBlciwgcHJpdmF0ZSBjb25maWd1cmF0aW9uOiBDb25maWd1cmF0aW9uSW50ZXJmYWNlKSB7fVxuXG4gICAgcHVibGljIGNyZWF0ZShmaWxlOiBhbnksIHNyY0ZpbGU6IGFueSwgbmFtZTogYW55LCBwcm9wczogYW55LCBJTzogYW55KTogSUNvbXBvbmVudERlcCB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHV0aWwuaW5zcGVjdChwcm9wcywgeyBzaG93SGlkZGVuOiB0cnVlLCBkZXB0aDogMTAgfSkpO1xuICAgICAgICBsZXQgc291cmNlQ29kZSA9IHNyY0ZpbGUuZ2V0VGV4dCgpO1xuICAgICAgICBsZXQgaGFzaCA9IGNyeXB0b1xuICAgICAgICAgICAgLmNyZWF0ZUhhc2goJ21kNScpXG4gICAgICAgICAgICAudXBkYXRlKHNvdXJjZUNvZGUpXG4gICAgICAgICAgICAuZGlnZXN0KCdoZXgnKTtcbiAgICAgICAgbGV0IGNvbXBvbmVudERlcDogSUNvbXBvbmVudERlcCA9IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBpZDogJ2NvbXBvbmVudC0nICsgbmFtZSArICctJyArIGhhc2gsXG4gICAgICAgICAgICBmaWxlOiBmaWxlLFxuICAgICAgICAgICAgLy8gYW5pbWF0aW9ucz86IHN0cmluZ1tdOyAvLyBUT0RPXG4gICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IHRoaXMuaGVscGVyLmdldENvbXBvbmVudENoYW5nZURldGVjdGlvbihwcm9wcywgc3JjRmlsZSksXG4gICAgICAgICAgICBlbmNhcHN1bGF0aW9uOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRFbmNhcHN1bGF0aW9uKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIGVudHJ5Q29tcG9uZW50czogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50RW50cnlDb21wb25lbnRzKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIGV4cG9ydEFzOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRFeHBvcnRBcyhwcm9wcywgc3JjRmlsZSksXG4gICAgICAgICAgICBob3N0OiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRIb3N0KHByb3BzKSxcbiAgICAgICAgICAgIGlucHV0czogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50SW5wdXRzTWV0YWRhdGEocHJvcHMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgLy8gaW50ZXJwb2xhdGlvbj86IHN0cmluZzsgLy8gVE9ETyB3YWl0aW5nIGRvYyBpbmZvc1xuICAgICAgICAgICAgbW9kdWxlSWQ6IHRoaXMuaGVscGVyLmdldENvbXBvbmVudE1vZHVsZUlkKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIG91dHB1dHM6IHRoaXMuaGVscGVyLmdldENvbXBvbmVudE91dHB1dHMocHJvcHMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgcHJvdmlkZXJzOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRQcm92aWRlcnMocHJvcHMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgLy8gcXVlcmllcz86IERlcHNbXTsgLy8gVE9ET1xuICAgICAgICAgICAgc2VsZWN0b3I6IHRoaXMuaGVscGVyLmdldENvbXBvbmVudFNlbGVjdG9yKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIHN0eWxlVXJsczogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50U3R5bGVVcmxzKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIHN0eWxlczogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50U3R5bGVzKHByb3BzLCBzcmNGaWxlKSwgLy8gVE9ETyBmaXggYXJnc1xuICAgICAgICAgICAgdGVtcGxhdGU6IHRoaXMuaGVscGVyLmdldENvbXBvbmVudFRlbXBsYXRlKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRUZW1wbGF0ZVVybChwcm9wcywgc3JjRmlsZSksXG4gICAgICAgICAgICB2aWV3UHJvdmlkZXJzOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRWaWV3UHJvdmlkZXJzKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIGlucHV0c0NsYXNzOiBJTy5pbnB1dHMsXG4gICAgICAgICAgICBvdXRwdXRzQ2xhc3M6IElPLm91dHB1dHMsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzQ2xhc3M6IElPLnByb3BlcnRpZXMsXG4gICAgICAgICAgICBtZXRob2RzQ2xhc3M6IElPLm1ldGhvZHMsXG5cbiAgICAgICAgICAgIGhvc3RCaW5kaW5nczogSU8uaG9zdEJpbmRpbmdzLFxuICAgICAgICAgICAgaG9zdExpc3RlbmVyczogSU8uaG9zdExpc3RlbmVycyxcblxuICAgICAgICAgICAgZGVzY3JpcHRpb246IElPLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgdHlwZTogJ2NvbXBvbmVudCcsXG4gICAgICAgICAgICBzb3VyY2VDb2RlOiBzcmNGaWxlLmdldFRleHQoKSxcbiAgICAgICAgICAgIGV4YW1wbGVVcmxzOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRFeGFtcGxlVXJscyhzcmNGaWxlLmdldFRleHQoKSlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRQcmVzZXJ2ZVdoaXRlc3BhY2VzKHByb3BzLCBzcmNGaWxlKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudERlcC5wcmVzZXJ2ZVdoaXRlc3BhY2VzID0gdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50UHJlc2VydmVXaGl0ZXNwYWNlcyhcbiAgICAgICAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICAgICAgICBzcmNGaWxlXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUxpZmVDeWNsZUhvb2tzKSB7XG4gICAgICAgICAgICBjb21wb25lbnREZXAubWV0aG9kc0NsYXNzID0gY2xlYW5MaWZlY3ljbGVIb29rc0Zyb21NZXRob2RzKGNvbXBvbmVudERlcC5tZXRob2RzQ2xhc3MpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJTy5qc2RvY3RhZ3MgJiYgSU8uanNkb2N0YWdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbXBvbmVudERlcC5qc2RvY3RhZ3MgPSBJTy5qc2RvY3RhZ3NbMF0udGFncztcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uY29uc3RydWN0b3IpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudERlcC5jb25zdHJ1Y3Rvck9iaiA9IElPLmNvbnN0cnVjdG9yO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJTy5leHRlbmRzKSB7XG4gICAgICAgICAgICBjb21wb25lbnREZXAuZXh0ZW5kcyA9IElPLmV4dGVuZHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElPLmltcGxlbWVudHMgJiYgSU8uaW1wbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb21wb25lbnREZXAuaW1wbGVtZW50cyA9IElPLmltcGxlbWVudHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElPLmFjY2Vzc29ycykge1xuICAgICAgICAgICAgY29tcG9uZW50RGVwLmFjY2Vzc29ycyA9IElPLmFjY2Vzc29ycztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb21wb25lbnREZXA7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnREZXAgZXh0ZW5kcyBJRGVwIHtcbiAgICBmaWxlOiBhbnk7XG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBhbnk7XG4gICAgZW5jYXBzdWxhdGlvbjogYW55O1xuICAgIGV4cG9ydEFzOiBhbnk7XG4gICAgaG9zdDogYW55O1xuICAgIGlucHV0czogQXJyYXk8YW55PjtcbiAgICBvdXRwdXRzOiBBcnJheTxhbnk+O1xuICAgIHByb3ZpZGVyczogQXJyYXk8YW55PjtcbiAgICBtb2R1bGVJZDogc3RyaW5nO1xuICAgIHNlbGVjdG9yOiBzdHJpbmc7XG4gICAgc3R5bGVVcmxzOiBBcnJheTxzdHJpbmc+O1xuICAgIHN0eWxlczogQXJyYXk8c3RyaW5nPjtcbiAgICB0ZW1wbGF0ZTogc3RyaW5nO1xuICAgIHRlbXBsYXRlVXJsOiBBcnJheTxzdHJpbmc+O1xuICAgIHZpZXdQcm92aWRlcnM6IEFycmF5PGFueT47XG4gICAgaW5wdXRzQ2xhc3M6IEFycmF5PGFueT47XG4gICAgb3V0cHV0c0NsYXNzOiBBcnJheTxhbnk+O1xuICAgIHByb3BlcnRpZXNDbGFzczogQXJyYXk8YW55PjtcbiAgICBtZXRob2RzQ2xhc3M6IEFycmF5PGFueT47XG5cbiAgICBlbnRyeUNvbXBvbmVudHM6IEFycmF5PGFueT47XG5cbiAgICBob3N0QmluZGluZ3M6IEFycmF5PGFueT47XG4gICAgaG9zdExpc3RlbmVyczogQXJyYXk8YW55PjtcblxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgc291cmNlQ29kZTogc3RyaW5nO1xuICAgIGV4YW1wbGVVcmxzOiBBcnJheTxzdHJpbmc+O1xuXG4gICAgY29uc3RydWN0b3JPYmo/OiBPYmplY3Q7XG4gICAganNkb2N0YWdzPzogQXJyYXk8c3RyaW5nPjtcbiAgICBleHRlbmRzPzogYW55O1xuICAgIGltcGxlbWVudHM/OiBhbnk7XG4gICAgYWNjZXNzb3JzPzogT2JqZWN0O1xuXG4gICAgcHJlc2VydmVXaGl0ZXNwYWNlcz86IGFueTtcbn1cbiIsImltcG9ydCB7IElEZXAgfSBmcm9tICcuLi9kZXBlbmRlbmNpZXMuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyB0cyB9IGZyb20gJ3RzLXNpbXBsZS1hc3QnO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkludGVyZmFjZSB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvY29uZmlndXJhdGlvbi5pbnRlcmZhY2UnO1xuXG5jb25zdCBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcblxuZXhwb3J0IGNsYXNzIENvbnRyb2xsZXJEZXBGYWN0b3J5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgICBwdWJsaWMgY3JlYXRlKFxuICAgICAgICBmaWxlOiBhbnksXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGUsXG4gICAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgICAgcHJvcGVydGllczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBJTzogYW55XG4gICAgKTogSUNvbnRyb2xsZXJEZXAge1xuICAgICAgICBsZXQgc291cmNlQ29kZSA9IHNyY0ZpbGUuZ2V0VGV4dCgpO1xuICAgICAgICBsZXQgaGFzaCA9IGNyeXB0b1xuICAgICAgICAgICAgLmNyZWF0ZUhhc2goJ21kNScpXG4gICAgICAgICAgICAudXBkYXRlKHNvdXJjZUNvZGUpXG4gICAgICAgICAgICAuZGlnZXN0KCdoZXgnKTtcbiAgICAgICAgbGV0IGluZm9zOiBJQ29udHJvbGxlckRlcCA9IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBpZDogJ2NvbnRyb2xsZXItJyArIG5hbWUgKyAnLScgKyBoYXNoLFxuICAgICAgICAgICAgZmlsZTogZmlsZSxcbiAgICAgICAgICAgIG1ldGhvZHM6IElPLm1ldGhvZHMsXG4gICAgICAgICAgICB0eXBlOiAnY29udHJvbGxlcicsXG4gICAgICAgICAgICBzb3VyY2VDb2RlOiBzcmNGaWxlLnRleHRcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHByb3BlcnRpZXMgJiYgcHJvcGVydGllcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzWzBdLnRleHQpIHtcbiAgICAgICAgICAgICAgICBpbmZvcy5wcmVmaXggPSBwcm9wZXJ0aWVzWzBdLnRleHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluZm9zO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29udHJvbGxlckRlcCBleHRlbmRzIElEZXAge1xuICAgIGZpbGU6IGFueTtcbiAgICBzb3VyY2VDb2RlOiBzdHJpbmc7XG4gICAgcHJlZml4Pzogc3RyaW5nO1xuICAgIG1ldGhvZHM6IEFycmF5PGFueT47XG59XG4iLCJpbXBvcnQgeyBTeW1ib2xIZWxwZXIsIElQYXJzZURlZXBJZGVudGlmaWVyUmVzdWx0IH0gZnJvbSAnLi9zeW1ib2wtaGVscGVyJztcbmltcG9ydCB7IENvbXBvbmVudENhY2hlIH0gZnJvbSAnLi9jb21wb25lbnQtaGVscGVyJztcbmltcG9ydCB7IERlcHMgfSBmcm9tICcuLi8uLi9kZXBlbmRlbmNpZXMuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyB0cyB9IGZyb20gJ3RzLXNpbXBsZS1hc3QnO1xuXG5leHBvcnQgY2xhc3MgTW9kdWxlSGVscGVyIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBjYWNoZTogQ29tcG9uZW50Q2FjaGUsXG4gICAgICAgIHByaXZhdGUgc3ltYm9sSGVscGVyOiBTeW1ib2xIZWxwZXIgPSBuZXcgU3ltYm9sSGVscGVyKClcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgZ2V0TW9kdWxlUHJvdmlkZXJzKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogQXJyYXk8SVBhcnNlRGVlcElkZW50aWZpZXJSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyXG4gICAgICAgICAgICAuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ3Byb3ZpZGVycycsIHNyY0ZpbGUpXG4gICAgICAgICAgICAubWFwKHByb3ZpZGVyTmFtZSA9PiB0aGlzLnN5bWJvbEhlbHBlci5wYXJzZURlZXBJbmRlbnRpZmllcihwcm92aWRlck5hbWUsIHNyY0ZpbGUpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TW9kdWxlQ29udHJvbGxlcnMoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBBcnJheTxJUGFyc2VEZWVwSWRlbnRpZmllclJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXJcbiAgICAgICAgICAgIC5nZXRTeW1ib2xEZXBzKHByb3BzLCAnY29udHJvbGxlcnMnLCBzcmNGaWxlKVxuICAgICAgICAgICAgLm1hcChwcm92aWRlck5hbWUgPT4gdGhpcy5zeW1ib2xIZWxwZXIucGFyc2VEZWVwSW5kZW50aWZpZXIocHJvdmlkZXJOYW1lLCBzcmNGaWxlKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE1vZHVsZURlY2xhcmF0aW9ucyhcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IERlcHNbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAnZGVjbGFyYXRpb25zJywgc3JjRmlsZSkubWFwKG5hbWUgPT4ge1xuICAgICAgICAgICAgbGV0IGNvbXBvbmVudCA9IHRoaXMuY2FjaGUuZ2V0KG5hbWUpO1xuXG4gICAgICAgICAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyLnBhcnNlRGVlcEluZGVudGlmaWVyKG5hbWUsIHNyY0ZpbGUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TW9kdWxlRW50cnlDb21wb25lbnRzKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogRGVwc1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHMocHJvcHMsICdlbnRyeUNvbXBvbmVudHMnLCBzcmNGaWxlKS5tYXAobmFtZSA9PiB7XG4gICAgICAgICAgICBsZXQgY29tcG9uZW50ID0gdGhpcy5jYWNoZS5nZXQobmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChjb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXIucGFyc2VEZWVwSW5kZW50aWZpZXIobmFtZSwgc3JjRmlsZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xlYW5JbXBvcnRGb3JSb290Rm9yQ2hpbGQobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IG5zTW9kdWxlID0gbmFtZS5zcGxpdCgnLicpO1xuICAgICAgICBpZiAobnNNb2R1bGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbmFtZSA9IG5zTW9kdWxlWzBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRNb2R1bGVJbXBvcnRzKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogQXJyYXk8SVBhcnNlRGVlcElkZW50aWZpZXJSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyXG4gICAgICAgICAgICAuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ2ltcG9ydHMnLCBzcmNGaWxlKVxuICAgICAgICAgICAgLm1hcChuYW1lID0+IHRoaXMuY2xlYW5JbXBvcnRGb3JSb290Rm9yQ2hpbGQobmFtZSkpXG4gICAgICAgICAgICAubWFwKG5hbWUgPT4gdGhpcy5zeW1ib2xIZWxwZXIucGFyc2VEZWVwSW5kZW50aWZpZXIobmFtZSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRNb2R1bGVFeHBvcnRzKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogQXJyYXk8SVBhcnNlRGVlcElkZW50aWZpZXJSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyXG4gICAgICAgICAgICAuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ2V4cG9ydHMnLCBzcmNGaWxlKVxuICAgICAgICAgICAgLm1hcChuYW1lID0+IHRoaXMuc3ltYm9sSGVscGVyLnBhcnNlRGVlcEluZGVudGlmaWVyKG5hbWUsIHNyY0ZpbGUpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TW9kdWxlSW1wb3J0c1JhdyhcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IEFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXIuZ2V0U3ltYm9sRGVwc1Jhdyhwcm9wcywgJ2ltcG9ydHMnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TW9kdWxlSWQoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBBcnJheTxJUGFyc2VEZWVwSWRlbnRpZmllclJlc3VsdD4ge1xuICAgICAgICBsZXQgX2lkID0gdGhpcy5zeW1ib2xIZWxwZXIuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ2lkJywgc3JjRmlsZSksXG4gICAgICAgICAgICBpZDtcbiAgICAgICAgaWYgKF9pZC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGlkID0gX2lkWzBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TW9kdWxlU2NoZW1hcyhcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICkge1xuICAgICAgICBsZXQgc2NoZW1hcyA9IHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHMocHJvcHMsICdzY2hlbWFzJywgc3JjRmlsZSk7XG4gICAgICAgIHJldHVybiBzY2hlbWFzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRNb2R1bGVCb290c3RyYXAoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBBcnJheTxJUGFyc2VEZWVwSWRlbnRpZmllclJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXJcbiAgICAgICAgICAgIC5nZXRTeW1ib2xEZXBzKHByb3BzLCAnYm9vdHN0cmFwJywgc3JjRmlsZSlcbiAgICAgICAgICAgIC5tYXAobmFtZSA9PiB0aGlzLnN5bWJvbEhlbHBlci5wYXJzZURlZXBJbmRlbnRpZmllcihuYW1lLCBzcmNGaWxlKSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgdHMgfSBmcm9tICd0cy1zaW1wbGUtYXN0JztcblxuZXhwb3J0IGNsYXNzIEpzRG9jSGVscGVyIHtcbiAgICBwdWJsaWMgaGFzSlNEb2NJbnRlcm5hbFRhZyhcbiAgICAgICAgZmlsZW5hbWU6IHN0cmluZyxcbiAgICAgICAgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSxcbiAgICAgICAgbm9kZTogdHMuTm9kZVxuICAgICk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodHlwZW9mIHNvdXJjZUZpbGUuc3RhdGVtZW50cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoZWNrU3RhdGVtZW50cyhzb3VyY2VGaWxlLnN0YXRlbWVudHMsIG5vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2hlY2tTdGF0ZW1lbnRzKHN0YXRlbWVudHM6IFJlYWRvbmx5QXJyYXk8dHMuU3RhdGVtZW50Piwgbm9kZTogdHMuTm9kZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gc3RhdGVtZW50cy5zb21lKHggPT4gdGhpcy5jaGVja1N0YXRlbWVudCh4LCBub2RlKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGVja1N0YXRlbWVudChzdGF0ZW1lbnQ6IHRzLlN0YXRlbWVudCwgbm9kZTogdHMuTm9kZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoc3RhdGVtZW50LnBvcyA9PT0gbm9kZS5wb3MgJiYgc3RhdGVtZW50LmVuZCA9PT0gbm9kZS5lbmQpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmpzRG9jICYmIG5vZGUuanNEb2MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNoZWNrSnNEb2NzKG5vZGUuanNEb2MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2hlY2tKc0RvY3MoanNEb2NzOiBSZWFkb25seUFycmF5PHRzLkpTRG9jPik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4ganNEb2NzXG4gICAgICAgICAgICAuZmlsdGVyKHggPT4geC50YWdzICYmIHgudGFncy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgLnNvbWUoeCA9PiB0aGlzLmNoZWNrSnNEb2NUYWdzKHgudGFncykpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2hlY2tKc0RvY1RhZ3ModGFnczogUmVhZG9ubHlBcnJheTx0cy5KU0RvY1RhZz4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRhZ3Muc29tZSh4ID0+IHgudGFnTmFtZSAmJiB4LnRhZ05hbWUudGV4dCA9PT0gJ2ludGVybmFsJyk7XG4gICAgfVxufVxuIiwiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IEFzdCwgeyB0cywgU3ludGF4S2luZCB9IGZyb20gJ3RzLXNpbXBsZS1hc3QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi9sb2dnZXInO1xuaW1wb3J0IHsgbWFya2VkdGFncywgbWVyZ2VUYWdzQW5kQXJncywgY2xlYW5MaWZlY3ljbGVIb29rc0Zyb21NZXRob2RzIH0gZnJvbSAnLi4vLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IHsga2luZFRvVHlwZSB9IGZyb20gJy4uLy4uL3V0aWxzL2tpbmQtdG8tdHlwZSc7XG5pbXBvcnQgeyAkY29tcG9uZW50c1RyZWVFbmdpbmUgfSBmcm9tICcuLi9lbmdpbmVzL2NvbXBvbmVudHMtdHJlZS5lbmdpbmUnO1xuXG5pbXBvcnQgeyBGcmFtZXdvcmtEZXBlbmRlbmNpZXMgfSBmcm9tICcuL2ZyYW1ld29yay1kZXBlbmRlbmNpZXMnO1xuXG5pbXBvcnQge1xuICAgIEpzZG9jUGFyc2VyVXRpbCxcbiAgICBSb3V0ZXJQYXJzZXJVdGlsLFxuICAgIEltcG9ydHNVdGlsLFxuICAgIGlzTW9kdWxlV2l0aFByb3ZpZGVycyxcbiAgICBnZXRNb2R1bGVXaXRoUHJvdmlkZXJzLFxuICAgIGlzSWdub3JlXG59IGZyb20gJy4uLy4uL3V0aWxzJztcblxuaW1wb3J0IHsgQ29kZUdlbmVyYXRvciB9IGZyb20gJy4vYW5ndWxhci9jb2RlLWdlbmVyYXRvcic7XG5cbmltcG9ydCB7IERpcmVjdGl2ZURlcEZhY3RvcnkgfSBmcm9tICcuL2FuZ3VsYXIvZGVwcy9kaXJlY3RpdmUtZGVwLmZhY3RvcnknO1xuaW1wb3J0IHsgQ29tcG9uZW50Q2FjaGUgfSBmcm9tICcuL2FuZ3VsYXIvZGVwcy9oZWxwZXJzL2NvbXBvbmVudC1oZWxwZXInO1xuaW1wb3J0IHsgTW9kdWxlRGVwRmFjdG9yeSB9IGZyb20gJy4vYW5ndWxhci9kZXBzL21vZHVsZS1kZXAuZmFjdG9yeSc7XG5pbXBvcnQgeyBDb21wb25lbnREZXBGYWN0b3J5IH0gZnJvbSAnLi9hbmd1bGFyL2RlcHMvY29tcG9uZW50LWRlcC5mYWN0b3J5JztcbmltcG9ydCB7IENvbnRyb2xsZXJEZXBGYWN0b3J5IH0gZnJvbSAnLi9hbmd1bGFyL2RlcHMvY29udHJvbGxlci1kZXAuZmFjdG9yeSc7XG5pbXBvcnQgeyBNb2R1bGVIZWxwZXIgfSBmcm9tICcuL2FuZ3VsYXIvZGVwcy9oZWxwZXJzL21vZHVsZS1oZWxwZXInO1xuaW1wb3J0IHsgSnNEb2NIZWxwZXIgfSBmcm9tICcuL2FuZ3VsYXIvZGVwcy9oZWxwZXJzL2pzLWRvYy1oZWxwZXInO1xuaW1wb3J0IHsgU3ltYm9sSGVscGVyIH0gZnJvbSAnLi9hbmd1bGFyL2RlcHMvaGVscGVycy9zeW1ib2wtaGVscGVyJztcblxuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY29uZmlndXJhdGlvbi5pbnRlcmZhY2UnO1xuXG5pbXBvcnQge1xuICAgIElJbmplY3RhYmxlRGVwLFxuICAgIElQaXBlRGVwLFxuICAgIElEZXAsXG4gICAgSUludGVyZmFjZURlcCxcbiAgICBJRnVuY3Rpb25EZWNEZXAsXG4gICAgSUVudW1EZWNEZXAsXG4gICAgSVR5cGVBbGlhc0RlY0RlcFxufSBmcm9tICcuL2FuZ3VsYXIvZGVwZW5kZW5jaWVzLmludGVyZmFjZXMnO1xuXG5jb25zdCBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcbmNvbnN0IG1hcmtlZCA9IHJlcXVpcmUoJ21hcmtlZCcpO1xuY29uc3QgYXN0ID0gbmV3IEFzdCgpO1xuXG4vLyBUeXBlU2NyaXB0IHJlZmVyZW5jZSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC9ibG9iL21hc3Rlci9saWIvdHlwZXNjcmlwdC5kLnRzXG5cbmV4cG9ydCBjbGFzcyBBbmd1bGFyRGVwZW5kZW5jaWVzIGV4dGVuZHMgRnJhbWV3b3JrRGVwZW5kZW5jaWVzIHtcbiAgICBwcml2YXRlIGVuZ2luZTogYW55O1xuICAgIHByaXZhdGUgY2FjaGU6IENvbXBvbmVudENhY2hlID0gbmV3IENvbXBvbmVudENhY2hlKCk7XG4gICAgcHJpdmF0ZSBtb2R1bGVIZWxwZXIgPSBuZXcgTW9kdWxlSGVscGVyKHRoaXMuY2FjaGUpO1xuICAgIHByaXZhdGUganNEb2NIZWxwZXIgPSBuZXcgSnNEb2NIZWxwZXIoKTtcbiAgICBwcml2YXRlIHN5bWJvbEhlbHBlciA9IG5ldyBTeW1ib2xIZWxwZXIoKTtcbiAgICBwcml2YXRlIGpzZG9jUGFyc2VyVXRpbCA9IG5ldyBKc2RvY1BhcnNlclV0aWwoKTtcbiAgICBwcml2YXRlIGltcG9ydHNVdGlsID0gbmV3IEltcG9ydHNVdGlsKCk7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgZmlsZXM6IHN0cmluZ1tdLFxuICAgICAgICBvcHRpb25zOiBhbnksXG4gICAgICAgIGNvbmZpZ3VyYXRpb246IENvbmZpZ3VyYXRpb25JbnRlcmZhY2UsXG4gICAgICAgIHJvdXRlclBhcnNlcjogUm91dGVyUGFyc2VyVXRpbFxuICAgICkge1xuICAgICAgICBzdXBlcihmaWxlcywgb3B0aW9ucywgY29uZmlndXJhdGlvbiwgcm91dGVyUGFyc2VyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGVwZW5kZW5jaWVzKCkge1xuICAgICAgICBsZXQgZGVwcyA9IHtcbiAgICAgICAgICAgIG1vZHVsZXM6IFtdLFxuICAgICAgICAgICAgbW9kdWxlc0ZvckdyYXBoOiBbXSxcbiAgICAgICAgICAgIGNvbXBvbmVudHM6IFtdLFxuICAgICAgICAgICAgY29udHJvbGxlcnM6IFtdLFxuICAgICAgICAgICAgaW5qZWN0YWJsZXM6IFtdLFxuICAgICAgICAgICAgaW50ZXJjZXB0b3JzOiBbXSxcbiAgICAgICAgICAgIGd1YXJkczogW10sXG4gICAgICAgICAgICBwaXBlczogW10sXG4gICAgICAgICAgICBkaXJlY3RpdmVzOiBbXSxcbiAgICAgICAgICAgIHJvdXRlczogW10sXG4gICAgICAgICAgICBjbGFzc2VzOiBbXSxcbiAgICAgICAgICAgIGludGVyZmFjZXM6IFtdLFxuICAgICAgICAgICAgbWlzY2VsbGFuZW91czoge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlczogW10sXG4gICAgICAgICAgICAgICAgZnVuY3Rpb25zOiBbXSxcbiAgICAgICAgICAgICAgICB0eXBlYWxpYXNlczogW10sXG4gICAgICAgICAgICAgICAgZW51bWVyYXRpb25zOiBbXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJvdXRlc1RyZWU6IHVuZGVmaW5lZFxuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBzb3VyY2VGaWxlcyA9IHRoaXMucHJvZ3JhbS5nZXRTb3VyY2VGaWxlcygpIHx8IFtdO1xuXG4gICAgICAgIHNvdXJjZUZpbGVzLm1hcCgoZmlsZTogdHMuU291cmNlRmlsZSkgPT4ge1xuICAgICAgICAgICAgbGV0IGZpbGVQYXRoID0gZmlsZS5maWxlTmFtZTtcblxuICAgICAgICAgICAgaWYgKHBhdGguZXh0bmFtZShmaWxlUGF0aCkgPT09ICcudHMnKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAhdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmFuZ3VsYXJKU1Byb2plY3QgJiZcbiAgICAgICAgICAgICAgICAgICAgcGF0aC5leHRuYW1lKGZpbGVQYXRoKSA9PT0gJy5qcydcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ3BhcnNpbmcnLCBmaWxlUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0U291cmNlRmlsZURlY29yYXRvcnMoZmlsZSwgZGVwcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGgubGFzdEluZGV4T2YoJy5kLnRzJykgPT09IC0xICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aC5sYXN0SW5kZXhPZignc3BlYy50cycpID09PSAtMVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdwYXJzaW5nJywgZmlsZVBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRTb3VyY2VGaWxlRGVjb3JhdG9ycyhmaWxlLCBkZXBzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGRlcHM7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEVuZCBvZiBmaWxlIHNjYW5uaW5nXG4gICAgICAgIC8vIFRyeSBtZXJnaW5nIGluc2lkZSB0aGUgc2FtZSBmaWxlIGRlY2xhcmF0ZWQgdmFyaWFibGVzICYgbW9kdWxlcyB3aXRoIGltcG9ydHMgfCBleHBvcnRzIHwgZGVjbGFyYXRpb25zIHwgcHJvdmlkZXJzXG5cbiAgICAgICAgaWYgKGRlcHMubWlzY2VsbGFuZW91cy52YXJpYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZGVwcy5taXNjZWxsYW5lb3VzLnZhcmlhYmxlcy5mb3JFYWNoKF92YXJpYWJsZSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IG5ld1ZhciA9IFtdO1xuICAgICAgICAgICAgICAgICgoX3ZhciwgX25ld1ZhcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBnZXRUeXBlIHByIHJlY29uc3RydWlyZS4uLi5cbiAgICAgICAgICAgICAgICAgICAgaWYgKF92YXIuaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdmFyLmluaXRpYWxpemVyLmVsZW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF92YXIuaW5pdGlhbGl6ZXIuZWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdmFyLmluaXRpYWxpemVyLmVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC50ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmFyLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBlbGVtZW50LnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHRoaXMuc3ltYm9sSGVscGVyLmdldFR5cGUoZWxlbWVudC50ZXh0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KShfdmFyaWFibGUsIG5ld1Zhcik7XG5cbiAgICAgICAgICAgICAgICBsZXQgb25MaW5rID0gbW9kID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByb2Nlc3MgPSAoaW5pdGlhbEFycmF5LCBfdmFyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXhUb0NsZWFuID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpbmRWYXJpYWJsZUluQXJyYXkgPSAoZWwsIGluZGV4LCB0aGVBcnJheSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbC5uYW1lID09PSBfdmFyLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhUb0NsZWFuID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbEFycmF5LmZvckVhY2goZmluZFZhcmlhYmxlSW5BcnJheSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGVhbiBpbmRleGVzIHRvIHJlcGxhY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxBcnJheS5zcGxpY2UoaW5kZXhUb0NsZWFuLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgdmFyaWFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdWYXIuZm9yRWFjaChuZXdFbGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgXy5maW5kKGluaXRpYWxBcnJheSwgeyBuYW1lOiBuZXdFbGUubmFtZSB9KSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1bmRlZmluZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbEFycmF5LnB1c2gobmV3RWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzKG1vZC5pbXBvcnRzLCBfdmFyaWFibGUpO1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzKG1vZC5leHBvcnRzLCBfdmFyaWFibGUpO1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzKG1vZC5jb250cm9sbGVycywgX3ZhcmlhYmxlKTtcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcyhtb2QuZGVjbGFyYXRpb25zLCBfdmFyaWFibGUpO1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzKG1vZC5wcm92aWRlcnMsIF92YXJpYWJsZSk7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGRlcHMubW9kdWxlcy5mb3JFYWNoKG9uTGluayk7XG4gICAgICAgICAgICAgICAgZGVwcy5tb2R1bGVzRm9yR3JhcGguZm9yRWFjaChvbkxpbmspO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogSWYgb25lIHRoaW5nIGV4dGVuZHMgYW5vdGhlciwgbWVyZ2UgdGhlbSwgb25seSBmb3IgaW50ZXJuYWwgc291cmNlc1xuICAgICAgICAgKiAtIGNsYXNzZXNcbiAgICAgICAgICogLSBjb21wb25lbnRzXG4gICAgICAgICAqIGZvclxuICAgICAgICAgKiAtIGlucHV0c1xuICAgICAgICAgKiAtIG91dHB1dHNcbiAgICAgICAgICogLSBwcm9wZXJ0aWVzXG4gICAgICAgICAqIC0gbWV0aG9kc1xuICAgICAgICAgKi9cbiAgICAgICAgZGVwcyA9IHRoaXMuZXh0ZW5kc01lcmdlci5tZXJnZShkZXBzLCB0aGlzLmNvbmZpZ3VyYXRpb24pO1xuXG4gICAgICAgIC8vIHRoaXMucm91dGVyUGFyc2VyLnByaW50TW9kdWxlc1JvdXRlcygpO1xuICAgICAgICAvLyB0aGlzLnJvdXRlclBhcnNlci5wcmludFJvdXRlcygpO1xuXG4gICAgICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVSb3V0ZXNHcmFwaCkge1xuICAgICAgICAgICAgdGhpcy5yb3V0ZXJQYXJzZXIubGlua01vZHVsZXNBbmRSb3V0ZXMoKTtcbiAgICAgICAgICAgIHRoaXMucm91dGVyUGFyc2VyLmNvbnN0cnVjdE1vZHVsZXNUcmVlKCk7XG5cbiAgICAgICAgICAgIGRlcHMucm91dGVzVHJlZSA9IHRoaXMucm91dGVyUGFyc2VyLmNvbnN0cnVjdFJvdXRlc1RyZWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZXBzO1xuICAgIH1cblxuICAgIHByaXZhdGUgcHJvY2Vzc0NsYXNzKG5vZGUsIGZpbGUsIHNyY0ZpbGUsIG91dHB1dFN5bWJvbHMsIGZpbGVCb2R5KSB7XG4gICAgICAgIGxldCBuYW1lID0gdGhpcy5nZXRTeW1ib2xlTmFtZShub2RlKTtcbiAgICAgICAgbGV0IElPID0gdGhpcy5nZXRDbGFzc0lPKGZpbGUsIHNyY0ZpbGUsIG5vZGUsIGZpbGVCb2R5KTtcbiAgICAgICAgbGV0IHNvdXJjZUNvZGUgPSBzcmNGaWxlLmdldFRleHQoKTtcbiAgICAgICAgbGV0IGhhc2ggPSBjcnlwdG9cbiAgICAgICAgICAgIC5jcmVhdGVIYXNoKCdtZDUnKVxuICAgICAgICAgICAgLnVwZGF0ZShzb3VyY2VDb2RlKVxuICAgICAgICAgICAgLmRpZ2VzdCgnaGV4Jyk7XG4gICAgICAgIGxldCBkZXBzOiBhbnkgPSB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgaWQ6ICdjbGFzcy0nICsgbmFtZSArICctJyArIGhhc2gsXG4gICAgICAgICAgICBmaWxlOiBmaWxlLFxuICAgICAgICAgICAgdHlwZTogJ2NsYXNzJyxcbiAgICAgICAgICAgIHNvdXJjZUNvZGU6IHNyY0ZpbGUuZ2V0VGV4dCgpXG4gICAgICAgIH07XG4gICAgICAgIGxldCBleGNsdWRlRnJvbUNsYXNzQXJyYXkgPSBmYWxzZTtcblxuICAgICAgICBpZiAoSU8uY29uc3RydWN0b3IpIHtcbiAgICAgICAgICAgIGRlcHMuY29uc3RydWN0b3JPYmogPSBJTy5jb25zdHJ1Y3RvcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8ucHJvcGVydGllcykge1xuICAgICAgICAgICAgZGVwcy5wcm9wZXJ0aWVzID0gSU8ucHJvcGVydGllcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIGRlcHMuZGVzY3JpcHRpb24gPSBJTy5kZXNjcmlwdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8ubWV0aG9kcykge1xuICAgICAgICAgICAgZGVwcy5tZXRob2RzID0gSU8ubWV0aG9kcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uaW5kZXhTaWduYXR1cmVzKSB7XG4gICAgICAgICAgICBkZXBzLmluZGV4U2lnbmF0dXJlcyA9IElPLmluZGV4U2lnbmF0dXJlcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uZXh0ZW5kcykge1xuICAgICAgICAgICAgZGVwcy5leHRlbmRzID0gSU8uZXh0ZW5kcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uanNkb2N0YWdzICYmIElPLmpzZG9jdGFncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBkZXBzLmpzZG9jdGFncyA9IElPLmpzZG9jdGFnc1swXS50YWdzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJTy5hY2Nlc3NvcnMpIHtcbiAgICAgICAgICAgIGRlcHMuYWNjZXNzb3JzID0gSU8uYWNjZXNzb3JzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJTy5pbnB1dHMpIHtcbiAgICAgICAgICAgIGRlcHMuaW5wdXRzQ2xhc3MgPSBJTy5pbnB1dHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElPLm91dHB1dHMpIHtcbiAgICAgICAgICAgIGRlcHMub3V0cHV0c0NsYXNzID0gSU8ub3V0cHV0cztcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uaG9zdEJpbmRpbmdzKSB7XG4gICAgICAgICAgICBkZXBzLmhvc3RCaW5kaW5ncyA9IElPLmhvc3RCaW5kaW5ncztcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uaG9zdExpc3RlbmVycykge1xuICAgICAgICAgICAgZGVwcy5ob3N0TGlzdGVuZXJzID0gSU8uaG9zdExpc3RlbmVycztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVMaWZlQ3ljbGVIb29rcykge1xuICAgICAgICAgICAgZGVwcy5tZXRob2RzID0gY2xlYW5MaWZlY3ljbGVIb29rc0Zyb21NZXRob2RzKGRlcHMubWV0aG9kcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElPLmltcGxlbWVudHMgJiYgSU8uaW1wbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBkZXBzLmltcGxlbWVudHMgPSBJTy5pbXBsZW1lbnRzO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5pc0d1YXJkKElPLmltcGxlbWVudHMpKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0aGUgR3VhcmQgdG8gc2hvdyB1cCBpbiB0aGUgQ2xhc3NlcyBtZW51XG4gICAgICAgICAgICAgICAgZXhjbHVkZUZyb21DbGFzc0FycmF5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBkZXBzLnR5cGUgPSAnZ3VhcmQnO1xuXG4gICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5ndWFyZHMucHVzaChkZXBzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIElPLmlnbm9yZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWcoZGVwcyk7XG5cbiAgICAgICAgICAgIGlmICghZXhjbHVkZUZyb21DbGFzc0FycmF5KSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5jbGFzc2VzLnB1c2goZGVwcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlnbm9yZShkZXBzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U291cmNlRmlsZURlY29yYXRvcnMoaW5pdGlhbFNyY0ZpbGU6IHRzLlNvdXJjZUZpbGUsIG91dHB1dFN5bWJvbHM6IGFueSk6IHZvaWQge1xuICAgICAgICBsZXQgY2xlYW5lciA9IChwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXApLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICAgICAgbGV0IGZpbGVOYW1lID0gaW5pdGlhbFNyY0ZpbGUuZmlsZU5hbWUucmVwbGFjZShjbGVhbmVyLCAnJyk7XG4gICAgICAgIGxldCBzY2FubmVkRmlsZSA9IGluaXRpYWxTcmNGaWxlO1xuXG4gICAgICAgIC8vIFNlYXJjaCBpbiBmaWxlIGZvciB2YXJpYWJsZSBzdGF0ZW1lbnQgYXMgcm91dGVzIGRlZmluaXRpb25zXG5cbiAgICAgICAgY29uc3QgYXN0RmlsZSA9XG4gICAgICAgICAgICB0eXBlb2YgYXN0LmdldFNvdXJjZUZpbGUoaW5pdGlhbFNyY0ZpbGUuZmlsZU5hbWUpICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgICAgID8gYXN0LmdldFNvdXJjZUZpbGUoaW5pdGlhbFNyY0ZpbGUuZmlsZU5hbWUpXG4gICAgICAgICAgICAgICAgOiBhc3QuYWRkRXhpc3RpbmdTb3VyY2VGaWxlKGluaXRpYWxTcmNGaWxlLmZpbGVOYW1lKTtcblxuICAgICAgICBjb25zdCB2YXJpYWJsZVJvdXRlc1N0YXRlbWVudHMgPSBhc3RGaWxlLmdldFZhcmlhYmxlU3RhdGVtZW50cygpO1xuICAgICAgICBsZXQgaGFzUm91dGVzU3RhdGVtZW50cyA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh2YXJpYWJsZVJvdXRlc1N0YXRlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gQ2xlYW4gZmlsZSBmb3Igc3ByZWFkIGFuZCBkeW5hbWljcyBpbnNpZGUgcm91dGVzIGRlZmluaXRpb25zXG4gICAgICAgICAgICB2YXJpYWJsZVJvdXRlc1N0YXRlbWVudHMuZm9yRWFjaChzID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YXJpYWJsZURlY2xhcmF0aW9ucyA9IHMuZ2V0RGVjbGFyYXRpb25zKCk7XG4gICAgICAgICAgICAgICAgbGV0IGxlbiA9IHZhcmlhYmxlRGVjbGFyYXRpb25zLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlRGVjbGFyYXRpb25zW2ldLmNvbXBpbGVyTm9kZS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVEZWNsYXJhdGlvbnNbaV0uY29tcGlsZXJOb2RlLnR5cGUudHlwZU5hbWUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZURlY2xhcmF0aW9uc1tpXS5jb21waWxlck5vZGUudHlwZS50eXBlTmFtZS50ZXh0ID09PSAnUm91dGVzJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzUm91dGVzU3RhdGVtZW50cyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNSb3V0ZXNTdGF0ZW1lbnRzICYmICF0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVJvdXRlc0dyYXBoKSB7XG4gICAgICAgICAgICAvLyBDbGVhbiBmaWxlIGZvciBzcHJlYWQgYW5kIGR5bmFtaWNzIGluc2lkZSByb3V0ZXMgZGVmaW5pdGlvbnNcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdBbmFseXNpbmcgcm91dGVzIGRlZmluaXRpb25zIGFuZCBjbGVhbiB0aGVtIGlmIG5lY2Vzc2FyeScpO1xuXG4gICAgICAgICAgICAvLyBzY2FubmVkRmlsZSA9IHRoaXMucm91dGVyUGFyc2VyLmNsZWFuRmlsZUlkZW50aWZpZXJzKGFzdEZpbGUpLmNvbXBpbGVyTm9kZTtcbiAgICAgICAgICAgIGxldCBmaXJzdENsZWFuID0gdGhpcy5yb3V0ZXJQYXJzZXIuY2xlYW5GaWxlU3ByZWFkcyhhc3RGaWxlKS5jb21waWxlck5vZGU7XG4gICAgICAgICAgICBzY2FubmVkRmlsZSA9IHRoaXMucm91dGVyUGFyc2VyLmNsZWFuQ2FsbEV4cHJlc3Npb25zKGFzdEZpbGUpLmNvbXBpbGVyTm9kZTtcbiAgICAgICAgICAgIHNjYW5uZWRGaWxlID0gdGhpcy5yb3V0ZXJQYXJzZXIuY2xlYW5GaWxlRHluYW1pY3MoYXN0RmlsZSkuY29tcGlsZXJOb2RlO1xuXG4gICAgICAgICAgICBzY2FubmVkRmlsZS5raW5kID0gU3ludGF4S2luZC5Tb3VyY2VGaWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgdHMuZm9yRWFjaENoaWxkKHNjYW5uZWRGaWxlLCAoaW5pdGlhbE5vZGU6IHRzLk5vZGUpID0+IHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmpzRG9jSGVscGVyLmhhc0pTRG9jSW50ZXJuYWxUYWcoZmlsZU5hbWUsIHNjYW5uZWRGaWxlLCBpbml0aWFsTm9kZSkgJiZcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUludGVybmFsXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcGFyc2VOb2RlID0gKGZpbGUsIHNyY0ZpbGUsIG5vZGUsIGZpbGVCb2R5KSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHNvdXJjZUNvZGUgPSBzcmNGaWxlLmdldFRleHQoKTtcbiAgICAgICAgICAgICAgICBsZXQgaGFzaCA9IGNyeXB0b1xuICAgICAgICAgICAgICAgICAgICAuY3JlYXRlSGFzaCgnbWQ1JylcbiAgICAgICAgICAgICAgICAgICAgLnVwZGF0ZShzb3VyY2VDb2RlKVxuICAgICAgICAgICAgICAgICAgICAuZGlnZXN0KCdoZXgnKTtcblxuICAgICAgICAgICAgICAgIGlmIChub2RlLmRlY29yYXRvcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNsYXNzV2l0aEN1c3RvbURlY29yYXRvciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmlzaXREZWNvcmF0b3IgPSAodmlzaXRlZERlY29yYXRvciwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkZXBzOiBJRGVwO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWV0YWRhdGEgPSBub2RlLmRlY29yYXRvcnM7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IHRoaXMuZ2V0U3ltYm9sZU5hbWUobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJvcHMgPSB0aGlzLmZpbmRQcm9wZXJ0aWVzKHZpc2l0ZWREZWNvcmF0b3IsIHNyY0ZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IElPID0gdGhpcy5jb21wb25lbnRIZWxwZXIuZ2V0Q29tcG9uZW50SU8oZmlsZSwgc3JjRmlsZSwgbm9kZSwgZmlsZUJvZHkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc01vZHVsZSh2aXNpdGVkRGVjb3JhdG9yKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vZHVsZURlcCA9IG5ldyBNb2R1bGVEZXBGYWN0b3J5KHRoaXMubW9kdWxlSGVscGVyKS5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJT1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucm91dGVyUGFyc2VyLmhhc1JvdXRlck1vZHVsZUluSW1wb3J0cyhtb2R1bGVEZXAuaW1wb3J0cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXJQYXJzZXIuYWRkTW9kdWxlV2l0aFJvdXRlcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZHVsZUhlbHBlci5nZXRNb2R1bGVJbXBvcnRzUmF3KHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcyA9IG1vZHVsZURlcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIElPLmlnbm9yZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXJQYXJzZXIuYWRkTW9kdWxlKG5hbWUsIG1vZHVsZURlcC5pbXBvcnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5tb2R1bGVzLnB1c2gobW9kdWxlRGVwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5tb2R1bGVzRm9yR3JhcGgucHVzaChtb2R1bGVEZXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0NvbXBvbmVudCh2aXNpdGVkRGVjb3JhdG9yKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnREZXAgPSBuZXcgQ29tcG9uZW50RGVwRmFjdG9yeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRIZWxwZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuY3JlYXRlKGZpbGUsIHNyY0ZpbGUsIG5hbWUsIHByb3BzLCBJTyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcyA9IGNvbXBvbmVudERlcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIElPLmlnbm9yZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbXBvbmVudHNUcmVlRW5naW5lLmFkZENvbXBvbmVudChjb21wb25lbnREZXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTeW1ib2xzLmNvbXBvbmVudHMucHVzaChjb21wb25lbnREZXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0NvbnRyb2xsZXIodmlzaXRlZERlY29yYXRvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250cm9sbGVyRGVwID0gbmV3IENvbnRyb2xsZXJEZXBGYWN0b3J5KCkuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNGaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHMgPSBjb250cm9sbGVyRGVwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgSU8uaWdub3JlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTeW1ib2xzLmNvbnRyb2xsZXJzLnB1c2goY29udHJvbGxlckRlcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzSW5qZWN0YWJsZSh2aXNpdGVkRGVjb3JhdG9yKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmplY3RhYmxlRGVwczogSUluamVjdGFibGVEZXAgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnaW5qZWN0YWJsZS0nICsgbmFtZSArICctJyArIGhhc2gsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6IGZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IElPLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHM6IElPLm1ldGhvZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBJTy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlQ29kZTogc3JjRmlsZS5nZXRUZXh0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YW1wbGVVcmxzOiB0aGlzLmNvbXBvbmVudEhlbHBlci5nZXRDb21wb25lbnRFeGFtcGxlVXJscyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ZpbGUuZ2V0VGV4dCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJTy5jb25zdHJ1Y3Rvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3RhYmxlRGVwcy5jb25zdHJ1Y3Rvck9iaiA9IElPLmNvbnN0cnVjdG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSU8uanNkb2N0YWdzICYmIElPLmpzZG9jdGFncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGFibGVEZXBzLmpzZG9jdGFncyA9IElPLmpzZG9jdGFnc1swXS50YWdzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSU8uYWNjZXNzb3JzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGFibGVEZXBzLmFjY2Vzc29ycyA9IElPLmFjY2Vzc29ycztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcyA9IGluamVjdGFibGVEZXBzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgSU8uaWdub3JlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXy5pbmNsdWRlcyhJTy5pbXBsZW1lbnRzLCAnSHR0cEludGVyY2VwdG9yJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGFibGVEZXBzLnR5cGUgPSAnaW50ZXJjZXB0b3InO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5pbnRlcmNlcHRvcnMucHVzaChpbmplY3RhYmxlRGVwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0d1YXJkKElPLmltcGxlbWVudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3RhYmxlRGVwcy50eXBlID0gJ2d1YXJkJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMuZ3VhcmRzLnB1c2goaW5qZWN0YWJsZURlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5qZWN0YWJsZURlcHMudHlwZSA9ICdpbmplY3RhYmxlJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTmV3RW50aXR5SW5TdG9yZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3RhYmxlRGVwcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTeW1ib2xzLmluamVjdGFibGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzUGlwZSh2aXNpdGVkRGVjb3JhdG9yKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwaXBlRGVwczogSVBpcGVEZXAgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAncGlwZS0nICsgbmFtZSArICctJyArIGhhc2gsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6IGZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdwaXBlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IElPLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBJTy5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RzOiBJTy5tZXRob2RzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXJlOiB0aGlzLmNvbXBvbmVudEhlbHBlci5nZXRDb21wb25lbnRQdXJlKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmduYW1lOiB0aGlzLmNvbXBvbmVudEhlbHBlci5nZXRDb21wb25lbnROYW1lKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlQ29kZTogc3JjRmlsZS5nZXRUZXh0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YW1wbGVVcmxzOiB0aGlzLmNvbXBvbmVudEhlbHBlci5nZXRDb21wb25lbnRFeGFtcGxlVXJscyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ZpbGUuZ2V0VGV4dCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJTy5qc2RvY3RhZ3MgJiYgSU8uanNkb2N0YWdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZURlcHMuanNkb2N0YWdzID0gSU8uanNkb2N0YWdzWzBdLnRhZ3M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHMgPSBwaXBlRGVwcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIElPLmlnbm9yZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5waXBlcy5wdXNoKHBpcGVEZXBzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNEaXJlY3RpdmUodmlzaXRlZERlY29yYXRvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRpcmVjdGl2ZURlcHMgPSBuZXcgRGlyZWN0aXZlRGVwRmFjdG9yeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRIZWxwZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuY3JlYXRlKGZpbGUsIHNyY0ZpbGUsIG5hbWUsIHByb3BzLCBJTyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcyA9IGRpcmVjdGl2ZURlcHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBJTy5pZ25vcmUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMuZGlyZWN0aXZlcy5wdXNoKGRpcmVjdGl2ZURlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhhc011bHRpcGxlRGVjb3JhdG9yc1dpdGhJbnRlcm5hbE9uZSA9IHRoaXMuaGFzSW50ZXJuYWxEZWNvcmF0b3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZGVjb3JhdG9yc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSnVzdCBhIGNsYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhY2xhc3NXaXRoQ3VzdG9tRGVjb3JhdG9yICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFoYXNNdWx0aXBsZURlY29yYXRvcnNXaXRoSW50ZXJuYWxPbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NXaXRoQ3VzdG9tRGVjb3JhdG9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzQ2xhc3Mobm9kZSwgZmlsZSwgc3JjRmlsZSwgb3V0cHV0U3ltYm9scywgZmlsZUJvZHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FjaGUuc2V0KG5hbWUsIGRlcHMpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIElPLmlnbm9yZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKGRlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlnbm9yZShkZXBzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgZmlsdGVyQnlEZWNvcmF0b3JzID0gZmlsdGVyZWROb2RlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJlZE5vZGUuZXhwcmVzc2lvbiAmJiBmaWx0ZXJlZE5vZGUuZXhwcmVzc2lvbi5leHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IF90ZXN0ID0gLyhOZ01vZHVsZXxDb21wb25lbnR8SW5qZWN0YWJsZXxQaXBlfERpcmVjdGl2ZSkvLnRlc3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkTm9kZS5leHByZXNzaW9uLmV4cHJlc3Npb24udGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFfdGVzdCAmJiB0cy5pc0NsYXNzRGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Rlc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3Rlc3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHMuaXNDbGFzc0RlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgbm9kZS5kZWNvcmF0b3JzLmZpbHRlcihmaWx0ZXJCeURlY29yYXRvcnMpLmZvckVhY2godmlzaXREZWNvcmF0b3IpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5zeW1ib2wpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuc3ltYm9sLmZsYWdzID09PSB0cy5TeW1ib2xGbGFncy5DbGFzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzQ2xhc3Mobm9kZSwgZmlsZSwgc3JjRmlsZSwgb3V0cHV0U3ltYm9scywgZmlsZUJvZHkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUuc3ltYm9sLmZsYWdzID09PSB0cy5TeW1ib2xGbGFncy5JbnRlcmZhY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuYW1lID0gdGhpcy5nZXRTeW1ib2xlTmFtZShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBJTyA9IHRoaXMuZ2V0SW50ZXJmYWNlSU8oZmlsZSwgc3JjRmlsZSwgbm9kZSwgZmlsZUJvZHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGludGVyZmFjZURlcHM6IElJbnRlcmZhY2VEZXAgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ2ludGVyZmFjZS0nICsgbmFtZSArICctJyArIGhhc2gsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnaW50ZXJmYWNlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VDb2RlOiBzcmNGaWxlLmdldFRleHQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJTy5wcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlRGVwcy5wcm9wZXJ0aWVzID0gSU8ucHJvcGVydGllcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJTy5pbmRleFNpZ25hdHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VEZXBzLmluZGV4U2lnbmF0dXJlcyA9IElPLmluZGV4U2lnbmF0dXJlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJTy5raW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlRGVwcy5raW5kID0gSU8ua2luZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJTy5kZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZURlcHMuZGVzY3JpcHRpb24gPSBJTy5kZXNjcmlwdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJTy5tZXRob2RzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlRGVwcy5tZXRob2RzID0gSU8ubWV0aG9kcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJTy5leHRlbmRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlRGVwcy5leHRlbmRzID0gSU8uZXh0ZW5kcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgSU8uaWdub3JlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoaW50ZXJmYWNlRGVwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5pbnRlcmZhY2VzLnB1c2goaW50ZXJmYWNlRGVwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaWdub3JlKGludGVyZmFjZURlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRzLmlzRnVuY3Rpb25EZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZm9zID0gdGhpcy52aXNpdEZ1bmN0aW9uRGVjbGFyYXRpb24obm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsZXQgdGFncyA9IHRoaXMudmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uSlNEb2NUYWdzKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBpbmZvcy5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZ1bmN0aW9uRGVwOiBJRnVuY3Rpb25EZWNEZXAgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOiBmaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eXBlOiAnbWlzY2VsbGFuZW91cycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidHlwZTogJ2Z1bmN0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy52aXNpdEVudW1UeXBlQWxpYXNGdW5jdGlvbkRlY2xhcmF0aW9uRGVzY3JpcHRpb24obm9kZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mb3MuYXJncykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uRGVwLmFyZ3MgPSBpbmZvcy5hcmdzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm9zLmpzZG9jdGFncyAmJiBpbmZvcy5qc2RvY3RhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uRGVwLmpzZG9jdGFncyA9IGluZm9zLmpzZG9jdGFncztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5mb3MuaWdub3JlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMubWlzY2VsbGFuZW91cy5mdW5jdGlvbnMucHVzaChmdW5jdGlvbkRlcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHMuaXNFbnVtRGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmZvcyA9IHRoaXMudmlzaXRFbnVtRGVjbGFyYXRpb24obm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IG5vZGUubmFtZS50ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVudW1EZXBzOiBJRW51bURlY0RlcCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkczogaW5mb3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R5cGU6ICdtaXNjZWxsYW5lb3VzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0eXBlOiAnZW51bScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHRoaXMudmlzaXRFbnVtVHlwZUFsaWFzRnVuY3Rpb25EZWNsYXJhdGlvbkRlc2NyaXB0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOiBmaWxlXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0lnbm9yZShub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMubWlzY2VsbGFuZW91cy5lbnVtZXJhdGlvbnMucHVzaChlbnVtRGVwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHMuaXNUeXBlQWxpYXNEZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZm9zID0gdGhpcy52aXNpdFR5cGVEZWNsYXJhdGlvbihub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuYW1lID0gaW5mb3MubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0eXBlQWxpYXNEZXBzOiBJVHlwZUFsaWFzRGVjRGVwID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R5cGU6ICdtaXNjZWxsYW5lb3VzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0eXBlOiAndHlwZWFsaWFzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXd0eXBlOiB0aGlzLmNsYXNzSGVscGVyLnZpc2l0VHlwZShub2RlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOiBmaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLnZpc2l0RW51bVR5cGVBbGlhc0Z1bmN0aW9uRGVjbGFyYXRpb25EZXNjcmlwdGlvbihub2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQWxpYXNEZXBzLmtpbmQgPSBub2RlLnR5cGUua2luZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZUFsaWFzRGVwcy5yYXd0eXBlID09PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQWxpYXNEZXBzLnJhd3R5cGUgPSBraW5kVG9UeXBlKG5vZGUudHlwZS5raW5kKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzSWdub3JlKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5taXNjZWxsYW5lb3VzLnR5cGVhbGlhc2VzLnB1c2godHlwZUFsaWFzRGVwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHMuaXNNb2R1bGVEZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuYm9keSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLmJvZHkuc3RhdGVtZW50cyAmJiBub2RlLmJvZHkuc3RhdGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYm9keS5zdGF0ZW1lbnRzLmZvckVhY2goc3RhdGVtZW50ID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZU5vZGUoZmlsZSwgc3JjRmlsZSwgc3RhdGVtZW50LCBub2RlLmJvZHkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IElPID0gdGhpcy5nZXRSb3V0ZUlPKGZpbGUsIHNyY0ZpbGUsIG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoSU8ucm91dGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3Um91dGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdSb3V0ZXMgPSB0aGlzLnJvdXRlclBhcnNlci5jbGVhblJhd1JvdXRlUGFyc2VkKElPLnJvdXRlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1JvdXRlcyBwYXJzaW5nIGVycm9yLCBtYXliZSBhIHRyYWlsaW5nIGNvbW1hIG9yIGFuIGV4dGVybmFsIHZhcmlhYmxlLCB0cnlpbmcgdG8gZml4IHRoYXQgbGF0ZXIgYWZ0ZXIgc291cmNlcyBzY2FubmluZy4nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdSb3V0ZXMgPSBJTy5yb3V0ZXMucmVwbGFjZSgvIC9nbSwgJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm91dGVyUGFyc2VyLmFkZEluY29tcGxldGVSb3V0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IG5ld1JvdXRlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogZmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5yb3V0ZXMgPSBbLi4ub3V0cHV0U3ltYm9scy5yb3V0ZXMsIC4uLm5ld1JvdXRlc107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRzLmlzQ2xhc3NEZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzQ2xhc3Mobm9kZSwgZmlsZSwgc3JjRmlsZSwgb3V0cHV0U3ltYm9scywgZmlsZUJvZHkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cy5pc0V4cHJlc3Npb25TdGF0ZW1lbnQobm9kZSkgfHwgdHMuaXNJZlN0YXRlbWVudChub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJvb3RzdHJhcE1vZHVsZVJlZmVyZW5jZSA9ICdib290c3RyYXBNb2R1bGUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgcm9vdCBtb2R1bGUgd2l0aCBib290c3RyYXBNb2R1bGUgY2FsbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gMS4gZmluZCBhIHNpbXBsZSBjYWxsIDogcGxhdGZvcm1Ccm93c2VyRHluYW1pYygpLmJvb3RzdHJhcE1vZHVsZShBcHBNb2R1bGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gMi4gb3IgaW5zaWRlIGEgY2FsbCA6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcGxhdGZvcm1Ccm93c2VyRHluYW1pYygpLmJvb3RzdHJhcE1vZHVsZShBcHBNb2R1bGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAzLiB3aXRoIGEgY2F0Y2ggOiBwbGF0Zm9ybUJyb3dzZXJEeW5hbWljKCkuYm9vdHN0cmFwTW9kdWxlKEFwcE1vZHVsZSkuY2F0Y2goZXJyb3IgPT4gY29uc29sZS5lcnJvcihlcnJvcikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gNC4gd2l0aCBwYXJhbWV0ZXJzIDogcGxhdGZvcm1Ccm93c2VyRHluYW1pYygpLmJvb3RzdHJhcE1vZHVsZShBcHBNb2R1bGUsIHt9KS5jYXRjaChlcnJvciA9PiBjb25zb2xlLmVycm9yKGVycm9yKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGaW5kIHJlY3VzaXZlbHkgaW4gZXhwcmVzc2lvbiBub2RlcyBvbmUgd2l0aCBuYW1lICdib290c3RyYXBNb2R1bGUnXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm9vdE1vZHVsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHROb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY0ZpbGUudGV4dC5pbmRleE9mKGJvb3RzdHJhcE1vZHVsZVJlZmVyZW5jZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHROb2RlID0gdGhpcy5maW5kRXhwcmVzc2lvbkJ5TmFtZUluRXhwcmVzc2lvbnMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmV4cHJlc3Npb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYm9vdHN0cmFwTW9kdWxlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG5vZGUudGhlblN0YXRlbWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS50aGVuU3RhdGVtZW50LnN0YXRlbWVudHMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUudGhlblN0YXRlbWVudC5zdGF0ZW1lbnRzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmlyc3RTdGF0ZW1lbnQgPSBub2RlLnRoZW5TdGF0ZW1lbnQuc3RhdGVtZW50c1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdE5vZGUgPSB0aGlzLmZpbmRFeHByZXNzaW9uQnlOYW1lSW5FeHByZXNzaW9ucyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFN0YXRlbWVudC5leHByZXNzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdib290c3RyYXBNb2R1bGUnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmV4cHJlc3Npb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZXhwcmVzc2lvbi5hcmd1bWVudHMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZXhwcmVzc2lvbi5hcmd1bWVudHMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdE5vZGUgPSB0aGlzLmZpbmRFeHByZXNzaW9uQnlOYW1lSW5FeHByZXNzaW9uQXJndW1lbnRzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZXhwcmVzc2lvbi5hcmd1bWVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Jvb3RzdHJhcE1vZHVsZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdE5vZGUuYXJndW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8uZm9yRWFjaChyZXN1bHROb2RlLmFyZ3VtZW50cywgKGFyZ3VtZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnQudGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290TW9kdWxlID0gYXJndW1lbnQudGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm9vdE1vZHVsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXJQYXJzZXIuc2V0Um9vdE1vZHVsZShyb290TW9kdWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodHMuaXNWYXJpYWJsZVN0YXRlbWVudChub2RlKSAmJiAhdGhpcy5yb3V0ZXJQYXJzZXIuaXNWYXJpYWJsZVJvdXRlcyhub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZm9zOiBhbnkgPSB0aGlzLnZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbihub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuYW1lID0gaW5mb3MubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkZXBzOiBhbnkgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHlwZTogJ21pc2NlbGxhbmVvdXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnR5cGU6ICd2YXJpYWJsZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogZmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHMudHlwZSA9IGluZm9zLnR5cGUgPyBpbmZvcy50eXBlIDogJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mb3MuZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcy5kZWZhdWx0VmFsdWUgPSBpbmZvcy5kZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mb3MuaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBzLmluaXRpYWxpemVyID0gaW5mb3MuaW5pdGlhbGl6ZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5qc0RvYyAmJiBub2RlLmpzRG9jLmxlbmd0aCA+IDAgJiYgbm9kZS5qc0RvY1swXS5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcy5kZXNjcmlwdGlvbiA9IG1hcmtlZChub2RlLmpzRG9jWzBdLmNvbW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTW9kdWxlV2l0aFByb3ZpZGVycyhub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByb3V0aW5nSW5pdGlhbGl6ZXIgPSBnZXRNb2R1bGVXaXRoUHJvdmlkZXJzKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm91dGVyUGFyc2VyLmFkZE1vZHVsZVdpdGhSb3V0ZXMobmFtZSwgW3JvdXRpbmdJbml0aWFsaXplcl0sIGZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm91dGVyUGFyc2VyLmFkZE1vZHVsZShuYW1lLCBbcm91dGluZ0luaXRpYWxpemVyXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzSWdub3JlKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5taXNjZWxsYW5lb3VzLnZhcmlhYmxlcy5wdXNoKGRlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cy5pc1R5cGVBbGlhc0RlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5mb3MgPSB0aGlzLnZpc2l0VHlwZURlY2xhcmF0aW9uKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBpbmZvcy5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRlcHM6IElUeXBlQWxpYXNEZWNEZXAgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHlwZTogJ21pc2NlbGxhbmVvdXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnR5cGU6ICd0eXBlYWxpYXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd3R5cGU6IHRoaXMuY2xhc3NIZWxwZXIudmlzaXRUeXBlKG5vZGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6IGZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHRoaXMudmlzaXRFbnVtVHlwZUFsaWFzRnVuY3Rpb25EZWNsYXJhdGlvbkRlc2NyaXB0aW9uKG5vZGUpXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHMua2luZCA9IG5vZGUudHlwZS5raW5kO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0lnbm9yZShub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMubWlzY2VsbGFuZW91cy50eXBlYWxpYXNlcy5wdXNoKGRlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cy5pc0Z1bmN0aW9uRGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmZvcyA9IHRoaXMudmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBpbmZvcy5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZ1bmN0aW9uRGVwOiBJRnVuY3Rpb25EZWNEZXAgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHlwZTogJ21pc2NlbGxhbmVvdXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnR5cGU6ICdmdW5jdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy52aXNpdEVudW1UeXBlQWxpYXNGdW5jdGlvbkRlY2xhcmF0aW9uRGVzY3JpcHRpb24obm9kZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mb3MuYXJncykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uRGVwLmFyZ3MgPSBpbmZvcy5hcmdzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm9zLmpzZG9jdGFncyAmJiBpbmZvcy5qc2RvY3RhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uRGVwLmpzZG9jdGFncyA9IGluZm9zLmpzZG9jdGFncztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5mb3MuaWdub3JlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMubWlzY2VsbGFuZW91cy5mdW5jdGlvbnMucHVzaChmdW5jdGlvbkRlcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRzLmlzRW51bURlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5mb3MgPSB0aGlzLnZpc2l0RW51bURlY2xhcmF0aW9uKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBub2RlLm5hbWUudGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbnVtRGVwczogSUVudW1EZWNEZXAgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHM6IGluZm9zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eXBlOiAnbWlzY2VsbGFuZW91cycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidHlwZTogJ2VudW0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLnZpc2l0RW51bVR5cGVBbGlhc0Z1bmN0aW9uRGVjbGFyYXRpb25EZXNjcmlwdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogZmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNJZ25vcmUobm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTeW1ib2xzLm1pc2NlbGxhbmVvdXMuZW51bWVyYXRpb25zLnB1c2goZW51bURlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcGFyc2VOb2RlKGZpbGVOYW1lLCBzY2FubmVkRmlsZSwgaW5pdGlhbE5vZGUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbiB0byBpbiBhIHNwZWNpZmljIHN0b3JlIGFuIGVudGl0eSwgYW5kIGNoZWNrIGJlZm9yZSBpcyB0aGVyZSBpcyBub3QgdGhlIHNhbWUgb25lXG4gICAgICogaW4gdGhhdCBzdG9yZSA6IHNhbWUgbmFtZSwgaWQgYW5kIGZpbGVcbiAgICAgKiBAcGFyYW0gZW50aXR5IEVudGl0eSB0byBzdG9yZVxuICAgICAqIEBwYXJhbSBzdG9yZSBTdG9yZVxuICAgICAqL1xuICAgIHByaXZhdGUgYWRkTmV3RW50aXR5SW5TdG9yZShlbnRpdHksIHN0b3JlKSB7XG4gICAgICAgIGxldCBmaW5kU2FtZUVudGl0eUluU3RvcmUgPSBfLmZpbHRlcihzdG9yZSwge1xuICAgICAgICAgICAgbmFtZTogZW50aXR5Lm5hbWUsXG4gICAgICAgICAgICBpZDogZW50aXR5LmlkLFxuICAgICAgICAgICAgZmlsZTogZW50aXR5LmZpbGVcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChmaW5kU2FtZUVudGl0eUluU3RvcmUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBzdG9yZS5wdXNoKGVudGl0eSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGRlYnVnKGRlcHM6IElEZXApIHtcbiAgICAgICAgaWYgKGRlcHMpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnZm91bmQnLCBgJHtkZXBzLm5hbWV9YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgWydpbXBvcnRzJywgJ2V4cG9ydHMnLCAnZGVjbGFyYXRpb25zJywgJ3Byb3ZpZGVycycsICdib290c3RyYXAnXS5mb3JFYWNoKHN5bWJvbHMgPT4ge1xuICAgICAgICAgICAgaWYgKGRlcHNbc3ltYm9sc10gJiYgZGVwc1tzeW1ib2xzXS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCcnLCBgLSAke3N5bWJvbHN9OmApO1xuICAgICAgICAgICAgICAgIGRlcHNbc3ltYm9sc10ubWFwKGkgPT4gaS5uYW1lKS5mb3JFYWNoKGQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJycsIGBcXHQtICR7ZH1gKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpZ25vcmUoZGVwczogSURlcCkge1xuICAgICAgICBpZiAoZGVwcykge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ2lnbm9yZScsIGAke2RlcHMubmFtZX1gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZmluZEV4cHJlc3Npb25CeU5hbWVJbkV4cHJlc3Npb25zKGVudHJ5Tm9kZSwgbmFtZSkge1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBsZXQgbG9vcCA9IGZ1bmN0aW9uKG5vZGUsIHopIHtcbiAgICAgICAgICAgIGlmIChub2RlLmV4cHJlc3Npb24gJiYgIW5vZGUuZXhwcmVzc2lvbi5uYW1lKSB7XG4gICAgICAgICAgICAgICAgbG9vcChub2RlLmV4cHJlc3Npb24sIHopO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGUuZXhwcmVzc2lvbiAmJiBub2RlLmV4cHJlc3Npb24ubmFtZSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLmV4cHJlc3Npb24ubmFtZS50ZXh0ID09PSB6KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5vZGU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbG9vcChub2RlLmV4cHJlc3Npb24sIHopO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgbG9vcChlbnRyeU5vZGUsIG5hbWUpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgZmluZEV4cHJlc3Npb25CeU5hbWVJbkV4cHJlc3Npb25Bcmd1bWVudHMoYXJnLCBuYW1lKSB7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIGxldCB0aGF0ID0gdGhpcztcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBsZXQgbGVuID0gYXJnLmxlbmd0aDtcbiAgICAgICAgbGV0IGxvb3AgPSBmdW5jdGlvbihub2RlLCB6KSB7XG4gICAgICAgICAgICBpZiAobm9kZS5ib2R5KSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuYm9keS5zdGF0ZW1lbnRzICYmIG5vZGUuYm9keS5zdGF0ZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGogPSAwO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGVuZyA9IG5vZGUuYm9keS5zdGF0ZW1lbnRzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChqOyBqIDwgbGVuZzsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGF0LmZpbmRFeHByZXNzaW9uQnlOYW1lSW5FeHByZXNzaW9ucyhub2RlLmJvZHkuc3RhdGVtZW50c1tqXSwgeik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBsb29wKGFyZ1tpXSwgbmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhcnNlRGVjb3JhdG9ycyhkZWNvcmF0b3JzLCB0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICBpZiAoZGVjb3JhdG9ycy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBfLmZvckVhY2goZGVjb3JhdG9ycywgZnVuY3Rpb24oZGVjb3JhdG9yOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVjb3JhdG9yLmV4cHJlc3Npb24uZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVjb3JhdG9yLmV4cHJlc3Npb24uZXhwcmVzc2lvbi50ZXh0ID09PSB0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoZGVjb3JhdG9yc1swXS5leHByZXNzaW9uLmV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVjb3JhdG9yc1swXS5leHByZXNzaW9uLmV4cHJlc3Npb24udGV4dCA9PT0gdHlwZSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VEZWNvcmF0b3IoZGVjb3JhdG9yLCB0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICBpZiAoZGVjb3JhdG9yLmV4cHJlc3Npb24uZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgaWYgKGRlY29yYXRvci5leHByZXNzaW9uLmV4cHJlc3Npb24udGV4dCA9PT0gdHlwZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzQ29udHJvbGxlcihtZXRhZGF0YSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURlY29yYXRvcihtZXRhZGF0YSwgJ0NvbnRyb2xsZXInKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzQ29tcG9uZW50KG1ldGFkYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRGVjb3JhdG9yKG1ldGFkYXRhLCAnQ29tcG9uZW50Jyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1BpcGUobWV0YWRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VEZWNvcmF0b3IobWV0YWRhdGEsICdQaXBlJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0RpcmVjdGl2ZShtZXRhZGF0YSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURlY29yYXRvcihtZXRhZGF0YSwgJ0RpcmVjdGl2ZScpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNJbmplY3RhYmxlKG1ldGFkYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRGVjb3JhdG9yKG1ldGFkYXRhLCAnSW5qZWN0YWJsZScpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNNb2R1bGUobWV0YWRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VEZWNvcmF0b3IobWV0YWRhdGEsICdOZ01vZHVsZScpIHx8IHRoaXMucGFyc2VEZWNvcmF0b3IobWV0YWRhdGEsICdNb2R1bGUnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhc0ludGVybmFsRGVjb3JhdG9yKG1ldGFkYXRhcykge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5wYXJzZURlY29yYXRvcnMobWV0YWRhdGFzLCAnQ29udHJvbGxlcicpIHx8XG4gICAgICAgICAgICB0aGlzLnBhcnNlRGVjb3JhdG9ycyhtZXRhZGF0YXMsICdDb21wb25lbnQnKSB8fFxuICAgICAgICAgICAgdGhpcy5wYXJzZURlY29yYXRvcnMobWV0YWRhdGFzLCAnUGlwZScpIHx8XG4gICAgICAgICAgICB0aGlzLnBhcnNlRGVjb3JhdG9ycyhtZXRhZGF0YXMsICdEaXJlY3RpdmUnKSB8fFxuICAgICAgICAgICAgdGhpcy5wYXJzZURlY29yYXRvcnMobWV0YWRhdGFzLCAnSW5qZWN0YWJsZScpIHx8XG4gICAgICAgICAgICB0aGlzLnBhcnNlRGVjb3JhdG9ycyhtZXRhZGF0YXMsICdOZ01vZHVsZScpIHx8XG4gICAgICAgICAgICB0aGlzLnBhcnNlRGVjb3JhdG9ycyhtZXRhZGF0YXMsICdNb2R1bGUnKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNHdWFyZChpb0ltcGxlbWVudHM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBfLmluY2x1ZGVzKGlvSW1wbGVtZW50cywgJ0NhbkFjdGl2YXRlJykgfHxcbiAgICAgICAgICAgIF8uaW5jbHVkZXMoaW9JbXBsZW1lbnRzLCAnQ2FuQWN0aXZhdGVDaGlsZCcpIHx8XG4gICAgICAgICAgICBfLmluY2x1ZGVzKGlvSW1wbGVtZW50cywgJ0NhbkRlYWN0aXZhdGUnKSB8fFxuICAgICAgICAgICAgXy5pbmNsdWRlcyhpb0ltcGxlbWVudHMsICdSZXNvbHZlJykgfHxcbiAgICAgICAgICAgIF8uaW5jbHVkZXMoaW9JbXBsZW1lbnRzLCAnQ2FuTG9hZCcpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTeW1ib2xlTmFtZShub2RlKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIG5vZGUubmFtZS50ZXh0O1xuICAgIH1cblxuICAgIHByaXZhdGUgZmluZFByb3BlcnRpZXMoXG4gICAgICAgIHZpc2l0ZWROb2RlOiB0cy5EZWNvcmF0b3IsXG4gICAgICAgIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB2aXNpdGVkTm9kZS5leHByZXNzaW9uICYmXG4gICAgICAgICAgICB2aXNpdGVkTm9kZS5leHByZXNzaW9uLmFyZ3VtZW50cyAmJlxuICAgICAgICAgICAgdmlzaXRlZE5vZGUuZXhwcmVzc2lvbi5hcmd1bWVudHMubGVuZ3RoID4gMFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGxldCBwb3AgPSB2aXNpdGVkTm9kZS5leHByZXNzaW9uLmFyZ3VtZW50c1swXTtcblxuICAgICAgICAgICAgaWYgKHBvcCAmJiBwb3AucHJvcGVydGllcyAmJiBwb3AucHJvcGVydGllcy5sZW5ndGggPj0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwb3AucHJvcGVydGllcztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocG9wICYmIHBvcC5raW5kICYmIHBvcC5raW5kID09PSBTeW50YXhLaW5kLlN0cmluZ0xpdGVyYWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW3BvcF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdFbXB0eSBtZXRhZGF0YXMsIHRyeWluZyB0byBmb3VuZCBpdCB3aXRoIGltcG9ydHMuJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW1wb3J0c1V0aWwuZmluZFZhbHVlSW5JbXBvcnRPckxvY2FsVmFyaWFibGVzKHBvcC50ZXh0LCBzb3VyY2VGaWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzQW5ndWxhckxpZmVjeWNsZUhvb2sobWV0aG9kTmFtZSkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29weXJpZ2h0IGh0dHBzOi8vZ2l0aHViLmNvbS9uZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBBTkdVTEFSX0xJRkVDWUNMRV9NRVRIT0RTID0gW1xuICAgICAgICAgICAgJ25nT25Jbml0JyxcbiAgICAgICAgICAgICduZ09uQ2hhbmdlcycsXG4gICAgICAgICAgICAnbmdEb0NoZWNrJyxcbiAgICAgICAgICAgICduZ09uRGVzdHJveScsXG4gICAgICAgICAgICAnbmdBZnRlckNvbnRlbnRJbml0JyxcbiAgICAgICAgICAgICduZ0FmdGVyQ29udGVudENoZWNrZWQnLFxuICAgICAgICAgICAgJ25nQWZ0ZXJWaWV3SW5pdCcsXG4gICAgICAgICAgICAnbmdBZnRlclZpZXdDaGVja2VkJyxcbiAgICAgICAgICAgICd3cml0ZVZhbHVlJyxcbiAgICAgICAgICAgICdyZWdpc3Rlck9uQ2hhbmdlJyxcbiAgICAgICAgICAgICdyZWdpc3Rlck9uVG91Y2hlZCcsXG4gICAgICAgICAgICAnc2V0RGlzYWJsZWRTdGF0ZSdcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIEFOR1VMQVJfTElGRUNZQ0xFX01FVEhPRFMuaW5kZXhPZihtZXRob2ROYW1lKSA+PSAwO1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRUeXBlRGVjbGFyYXRpb24obm9kZTogdHMuVHlwZUFsaWFzRGVjbGFyYXRpb24pIHtcbiAgICAgICAgbGV0IHJlc3VsdDogYW55ID0ge1xuICAgICAgICAgICAgbmFtZTogbm9kZS5uYW1lLnRleHQsXG4gICAgICAgICAgICBraW5kOiBub2RlLmtpbmRcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IGpzZG9jdGFncyA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldEpTRG9jcyhub2RlKTtcblxuICAgICAgICBpZiAoanNkb2N0YWdzICYmIGpzZG9jdGFncy5sZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgaWYgKGpzZG9jdGFnc1swXS50YWdzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmpzZG9jdGFncyA9IG1hcmtlZHRhZ3MoanNkb2N0YWdzWzBdLnRhZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2aXNpdEFyZ3VtZW50KGFyZykge1xuICAgICAgICBsZXQgcmVzdWx0OiBhbnkgPSB7XG4gICAgICAgICAgICBuYW1lOiBhcmcubmFtZS50ZXh0LFxuICAgICAgICAgICAgdHlwZTogdGhpcy5jbGFzc0hlbHBlci52aXNpdFR5cGUoYXJnKVxuICAgICAgICB9O1xuICAgICAgICBpZiAoYXJnLmRvdERvdERvdFRva2VuKSB7XG4gICAgICAgICAgICByZXN1bHQuZG90RG90RG90VG9rZW4gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhcmcucXVlc3Rpb25Ub2tlbikge1xuICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbmFsID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXJnLnR5cGUpIHtcbiAgICAgICAgICAgIHJlc3VsdC50eXBlID0gdGhpcy5tYXBUeXBlKGFyZy50eXBlLmtpbmQpO1xuICAgICAgICAgICAgaWYgKGFyZy50eXBlLmtpbmQgPT09IDE1Nykge1xuICAgICAgICAgICAgICAgIC8vIHRyeSByZXBsYWNlIFR5cGVSZWZlcmVuY2Ugd2l0aCB0eXBlTmFtZVxuICAgICAgICAgICAgICAgIGlmIChhcmcudHlwZS50eXBlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQudHlwZSA9IGFyZy50eXBlLnR5cGVOYW1lLnRleHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYXBUeXBlKHR5cGUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgOTU6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdudWxsJztcbiAgICAgICAgICAgIGNhc2UgMTE5OlxuICAgICAgICAgICAgICAgIHJldHVybiAnYW55JztcbiAgICAgICAgICAgIGNhc2UgMTIyOlxuICAgICAgICAgICAgICAgIHJldHVybiAnYm9vbGVhbic7XG4gICAgICAgICAgICBjYXNlIDEzMDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ25ldmVyJztcbiAgICAgICAgICAgIGNhc2UgMTMzOlxuICAgICAgICAgICAgICAgIHJldHVybiAnbnVtYmVyJztcbiAgICAgICAgICAgIGNhc2UgMTM2OlxuICAgICAgICAgICAgICAgIHJldHVybiAnc3RyaW5nJztcbiAgICAgICAgICAgIGNhc2UgMTM5OlxuICAgICAgICAgICAgICAgIHJldHVybiAndW5kZWZpbmVkJztcbiAgICAgICAgICAgIGNhc2UgMTU5OlxuICAgICAgICAgICAgICAgIHJldHVybiAndHlwZVJlZmVyZW5jZSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihtZXRob2Q6IHRzLkZ1bmN0aW9uRGVjbGFyYXRpb24pIHtcbiAgICAgICAgbGV0IHJlc3VsdDogYW55ID0ge1xuICAgICAgICAgICAgbmFtZTogbWV0aG9kLm5hbWUudGV4dCxcbiAgICAgICAgICAgIGFyZ3M6IG1ldGhvZC5wYXJhbWV0ZXJzID8gbWV0aG9kLnBhcmFtZXRlcnMubWFwKHByb3AgPT4gdGhpcy52aXNpdEFyZ3VtZW50KHByb3ApKSA6IFtdXG4gICAgICAgIH07XG4gICAgICAgIGxldCBqc2RvY3RhZ3MgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRKU0RvY3MobWV0aG9kKTtcblxuICAgICAgICBpZiAodHlwZW9mIG1ldGhvZC50eXBlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmVzdWx0LnJldHVyblR5cGUgPSB0aGlzLmNsYXNzSGVscGVyLnZpc2l0VHlwZShtZXRob2QudHlwZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWV0aG9kLm1vZGlmaWVycykge1xuICAgICAgICAgICAgaWYgKG1ldGhvZC5tb2RpZmllcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBraW5kcyA9IG1ldGhvZC5tb2RpZmllcnNcbiAgICAgICAgICAgICAgICAgICAgLm1hcChtb2RpZmllciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kaWZpZXIua2luZDtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLnJldmVyc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIF8uaW5kZXhPZihraW5kcywgU3ludGF4S2luZC5QdWJsaWNLZXl3b3JkKSAhPT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgXy5pbmRleE9mKGtpbmRzLCBTeW50YXhLaW5kLlN0YXRpY0tleXdvcmQpICE9PSAtMVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBraW5kcyA9IGtpbmRzLmZpbHRlcihraW5kID0+IGtpbmQgIT09IFN5bnRheEtpbmQuUHVibGljS2V5d29yZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChqc2RvY3RhZ3MgJiYganNkb2N0YWdzLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICBpZiAoanNkb2N0YWdzWzBdLnRhZ3MpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuanNkb2N0YWdzID0gbWFya2VkdGFncyhqc2RvY3RhZ3NbMF0udGFncyk7XG4gICAgICAgICAgICAgICAgXy5mb3JFYWNoKGpzZG9jdGFnc1swXS50YWdzLCB0YWcgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFnLnRhZ05hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWcudGFnTmFtZS50ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhZy50YWdOYW1lLnRleHQuaW5kZXhPZignaWdub3JlJykgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuaWdub3JlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0LmpzZG9jdGFncyAmJiByZXN1bHQuanNkb2N0YWdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlc3VsdC5qc2RvY3RhZ3MgPSBtZXJnZVRhZ3NBbmRBcmdzKHJlc3VsdC5hcmdzLCByZXN1bHQuanNkb2N0YWdzKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXN1bHQuanNkb2N0YWdzID0gbWVyZ2VUYWdzQW5kQXJncyhyZXN1bHQuYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZpc2l0VmFyaWFibGVEZWNsYXJhdGlvbihub2RlKSB7XG4gICAgICAgIGlmIChub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnMpIHtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGxldCBsZW4gPSBub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnMubGVuZ3RoO1xuICAgICAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0OiBhbnkgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9uc1tpXS5uYW1lLnRleHQsXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zW2ldLmluaXRpYWxpemVyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMuY2xhc3NIZWxwZXIuc3RyaW5naWZ5RGVmYXVsdFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zW2ldLmluaXRpYWxpemVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zW2ldLmluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5pbml0aWFsaXplciA9IG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9uc1tpXS5pbml0aWFsaXplcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9uc1tpXS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC50eXBlID0gdGhpcy5jbGFzc0hlbHBlci52aXNpdFR5cGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnNbaV0udHlwZVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdC50eXBlID09PSAndW5kZWZpbmVkJyAmJiByZXN1bHQuaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnR5cGUgPSBraW5kVG9UeXBlKHJlc3VsdC5pbml0aWFsaXplci5raW5kKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRGdW5jdGlvbkRlY2xhcmF0aW9uSlNEb2NUYWdzKG5vZGU6IHRzLkZ1bmN0aW9uRGVjbGFyYXRpb24pOiBzdHJpbmcge1xuICAgICAgICBsZXQganNkb2N0YWdzID0gdGhpcy5qc2RvY1BhcnNlclV0aWwuZ2V0SlNEb2NzKG5vZGUpO1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBpZiAoanNkb2N0YWdzICYmIGpzZG9jdGFncy5sZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgaWYgKGpzZG9jdGFnc1swXS50YWdzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbWFya2VkdGFncyhqc2RvY3RhZ3NbMF0udGFncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZpc2l0RW51bVR5cGVBbGlhc0Z1bmN0aW9uRGVjbGFyYXRpb25EZXNjcmlwdGlvbihub2RlKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGRlc2NyaXB0aW9uOiBzdHJpbmcgPSAnJztcbiAgICAgICAgaWYgKG5vZGUuanNEb2MpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmpzRG9jLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG5vZGUuanNEb2NbMF0uY29tbWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBtYXJrZWQobm9kZS5qc0RvY1swXS5jb21tZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uO1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRFbnVtRGVjbGFyYXRpb24obm9kZTogdHMuRW51bURlY2xhcmF0aW9uKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgaWYgKG5vZGUubWVtYmVycykge1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgbGV0IGxlbiA9IG5vZGUubWVtYmVycy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBtZW1iZXI6IGFueSA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogbm9kZS5tZW1iZXJzW2ldLm5hbWUudGV4dFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubWVtYmVyc1tpXS5pbml0aWFsaXplcikge1xuICAgICAgICAgICAgICAgICAgICBtZW1iZXIudmFsdWUgPSBub2RlLm1lbWJlcnNbaV0uaW5pdGlhbGl6ZXIudGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobWVtYmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRFbnVtRGVjbGFyYXRpb25Gb3JSb3V0ZXMoZmlsZU5hbWUsIG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9ucykge1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgbGV0IGxlbiA9IG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9ucy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCByb3V0ZXNJbml0aWFsaXplciA9IG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9uc1tpXS5pbml0aWFsaXplcjtcbiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IG5ldyBDb2RlR2VuZXJhdG9yKCkuZ2VuZXJhdGUocm91dGVzSW5pdGlhbGl6ZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMucm91dGVyUGFyc2VyLmFkZFJvdXRlKHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zW2ldLm5hbWUudGV4dCxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogdGhpcy5yb3V0ZXJQYXJzZXIuY2xlYW5SYXdSb3V0ZShkYXRhKSxcbiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IGZpbGVOYW1lXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVzOiBkYXRhXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFJvdXRlSU8oZmlsZW5hbWU6IHN0cmluZywgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSwgbm9kZTogdHMuTm9kZSkge1xuICAgICAgICBsZXQgcmVzO1xuICAgICAgICBpZiAoc291cmNlRmlsZS5zdGF0ZW1lbnRzKSB7XG4gICAgICAgICAgICByZXMgPSBzb3VyY2VGaWxlLnN0YXRlbWVudHMucmVkdWNlKChkaXJlY3RpdmUsIHN0YXRlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvdXRlclBhcnNlci5pc1ZhcmlhYmxlUm91dGVzKHN0YXRlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlbWVudC5wb3MgPT09IG5vZGUucG9zICYmIHN0YXRlbWVudC5lbmQgPT09IG5vZGUuZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlyZWN0aXZlLmNvbmNhdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZpc2l0RW51bURlY2xhcmF0aW9uRm9yUm91dGVzKGZpbGVuYW1lLCBzdGF0ZW1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZTtcbiAgICAgICAgICAgIH0sIFtdKTtcbiAgICAgICAgICAgIHJldHVybiByZXNbMF0gfHwge307XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENsYXNzSU8oZmlsZW5hbWU6IHN0cmluZywgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSwgbm9kZTogdHMuTm9kZSwgZmlsZUJvZHkpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvcHlyaWdodCBodHRwczovL2dpdGh1Yi5jb20vbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcFxuICAgICAgICAgKi9cbiAgICAgICAgbGV0IHJlZHVjZWRTb3VyY2UgPSBmaWxlQm9keSA/IGZpbGVCb2R5LnN0YXRlbWVudHMgOiBzb3VyY2VGaWxlLnN0YXRlbWVudHM7XG4gICAgICAgIGxldCByZXMgPSByZWR1Y2VkU291cmNlLnJlZHVjZSgoZGlyZWN0aXZlLCBzdGF0ZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmICh0cy5pc0NsYXNzRGVjbGFyYXRpb24oc3RhdGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQucG9zID09PSBub2RlLnBvcyAmJiBzdGF0ZW1lbnQuZW5kID09PSBub2RlLmVuZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlyZWN0aXZlLmNvbmNhdChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NIZWxwZXIudmlzaXRDbGFzc0RlY2xhcmF0aW9uKGZpbGVuYW1lLCBzdGF0ZW1lbnQsIHNvdXJjZUZpbGUpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgICAgICB9LCBbXSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc1swXSB8fCB7fTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEludGVyZmFjZUlPKGZpbGVuYW1lOiBzdHJpbmcsIHNvdXJjZUZpbGUsIG5vZGUsIGZpbGVCb2R5KSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb3B5cmlnaHQgaHR0cHM6Ly9naXRodWIuY29tL25nLWJvb3RzdHJhcC9uZy1ib290c3RyYXBcbiAgICAgICAgICovXG4gICAgICAgIGxldCByZWR1Y2VkU291cmNlID0gZmlsZUJvZHkgPyBmaWxlQm9keS5zdGF0ZW1lbnRzIDogc291cmNlRmlsZS5zdGF0ZW1lbnRzO1xuICAgICAgICBsZXQgcmVzID0gcmVkdWNlZFNvdXJjZS5yZWR1Y2UoKGRpcmVjdGl2ZSwgc3RhdGVtZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAodHMuaXNJbnRlcmZhY2VEZWNsYXJhdGlvbihzdGF0ZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlbWVudC5wb3MgPT09IG5vZGUucG9zICYmIHN0YXRlbWVudC5lbmQgPT09IG5vZGUuZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkaXJlY3RpdmUuY29uY2F0KFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGFzc0hlbHBlci52aXNpdENsYXNzRGVjbGFyYXRpb24oZmlsZW5hbWUsIHN0YXRlbWVudCwgc291cmNlRmlsZSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBkaXJlY3RpdmU7XG4gICAgICAgIH0sIFtdKTtcblxuICAgICAgICByZXR1cm4gcmVzWzBdIHx8IHt9O1xuICAgIH1cbn1cbiIsImltcG9ydCB7IENvbmZpZ3VyYXRpb25JbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NvbmZpZ3VyYXRpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IFJvdXRlclBhcnNlclV0aWwsIEpzZG9jUGFyc2VyVXRpbCwgSW1wb3J0c1V0aWwgfSBmcm9tICcuLi8uLi91dGlscyc7XG5pbXBvcnQgeyBGcmFtZXdvcmtEZXBlbmRlbmNpZXMgfSBmcm9tICcuL2ZyYW1ld29yay1kZXBlbmRlbmNpZXMnO1xuaW1wb3J0IHsgQ29tcG9uZW50Q2FjaGUgfSBmcm9tICcuL2FuZ3VsYXIvZGVwcy9oZWxwZXJzL2NvbXBvbmVudC1oZWxwZXInO1xuaW1wb3J0IHsgTW9kdWxlSGVscGVyIH0gZnJvbSAnLi9hbmd1bGFyL2RlcHMvaGVscGVycy9tb2R1bGUtaGVscGVyJztcbmltcG9ydCB7IEpzRG9jSGVscGVyIH0gZnJvbSAnLi9hbmd1bGFyL2RlcHMvaGVscGVycy9qcy1kb2MtaGVscGVyJztcbmltcG9ydCB7IFN5bWJvbEhlbHBlciB9IGZyb20gJy4vYW5ndWxhci9kZXBzL2hlbHBlcnMvc3ltYm9sLWhlbHBlcic7XG5cbmV4cG9ydCBjbGFzcyBBbmd1bGFySlNEZXBlbmRlbmNpZXMgZXh0ZW5kcyBGcmFtZXdvcmtEZXBlbmRlbmNpZXMge1xuXG4gICAgcHJpdmF0ZSBlbmdpbmU6IGFueTtcbiAgICBwcml2YXRlIGNhY2hlOiBDb21wb25lbnRDYWNoZSA9IG5ldyBDb21wb25lbnRDYWNoZSgpO1xuICAgIHByaXZhdGUgbW9kdWxlSGVscGVyID0gbmV3IE1vZHVsZUhlbHBlcih0aGlzLmNhY2hlKTtcbiAgICBwcml2YXRlIGpzRG9jSGVscGVyID0gbmV3IEpzRG9jSGVscGVyKCk7XG4gICAgcHJpdmF0ZSBzeW1ib2xIZWxwZXIgPSBuZXcgU3ltYm9sSGVscGVyKCk7XG4gICAgcHJpdmF0ZSBqc2RvY1BhcnNlclV0aWwgPSBuZXcgSnNkb2NQYXJzZXJVdGlsKCk7XG4gICAgcHJpdmF0ZSBpbXBvcnRzVXRpbCA9IG5ldyBJbXBvcnRzVXRpbCgpO1xuXG4gICAgY29uc3RydWN0b3IoZmlsZXM6IHN0cmluZ1tdLFxuICAgICAgICBvcHRpb25zOiBhbnksXG4gICAgICAgIGNvbmZpZ3VyYXRpb246IENvbmZpZ3VyYXRpb25JbnRlcmZhY2UsXG4gICAgICAgIHJvdXRlclBhcnNlcjogUm91dGVyUGFyc2VyVXRpbCkge1xuICAgICAgICBzdXBlcihmaWxlcyxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBjb25maWd1cmF0aW9uLFxuICAgICAgICAgICAgcm91dGVyUGFyc2VyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGVwZW5kZW5jaWVzKCkge1xuICAgICAgICBsZXQgZGVwcyA9IHtcbiAgICAgICAgICAgIG1vZHVsZXM6IFtdLFxuICAgICAgICAgICAgbW9kdWxlc0ZvckdyYXBoOiBbXSxcbiAgICAgICAgICAgIGNvbXBvbmVudHM6IFtdLFxuICAgICAgICAgICAgaW5qZWN0YWJsZXM6IFtdLFxuICAgICAgICAgICAgaW50ZXJjZXB0b3JzOiBbXSxcbiAgICAgICAgICAgIHBpcGVzOiBbXSxcbiAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFtdLFxuICAgICAgICAgICAgcm91dGVzOiBbXSxcbiAgICAgICAgICAgIGNsYXNzZXM6IFtdLFxuICAgICAgICAgICAgaW50ZXJmYWNlczogW10sXG4gICAgICAgICAgICBtaXNjZWxsYW5lb3VzOiB7XG4gICAgICAgICAgICAgICAgdmFyaWFibGVzOiBbXSxcbiAgICAgICAgICAgICAgICBmdW5jdGlvbnM6IFtdLFxuICAgICAgICAgICAgICAgIHR5cGVhbGlhc2VzOiBbXSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhdGlvbnM6IFtdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcm91dGVzVHJlZTogdW5kZWZpbmVkXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBkZXBzO1xuICAgIH1cbn0iLCJleHBvcnQgZnVuY3Rpb24gcHJvbWlzZVNlcXVlbnRpYWwocHJvbWlzZXMpIHtcblxuICAgIGlmICghQXJyYXkuaXNBcnJheShwcm9taXNlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGaXJzdCBhcmd1bWVudCBuZWVkIHRvIGJlIGFuIGFycmF5IG9mIFByb21pc2VzJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblxuICAgICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgICBsZXQgcmVzdWx0cyA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGl0ZXJhdGVlRnVuYyA9IChwcmV2aW91c1Byb21pc2UsIGN1cnJlbnRQcm9taXNlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcHJldmlvdXNQcm9taXNlXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY291bnQrKyAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuY29uY2F0KHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRQcm9taXNlKHJlc3VsdCwgcmVzdWx0cywgY291bnQpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIHByb21pc2VzID0gcHJvbWlzZXMuY29uY2F0KCgpID0+IFByb21pc2UucmVzb2x2ZSgpKTtcblxuICAgICAgICBwcm9taXNlc1xuICAgICAgICAgICAgLnJlZHVjZShpdGVyYXRlZUZ1bmMsIFByb21pc2UucmVzb2x2ZShmYWxzZSkpXG4gICAgICAgICAgICAudGhlbigocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHRzKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgfSk7XG59XG4iLCJpbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCB7IFBhcnNlZERhdGEgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3BhcnNlZC1kYXRhLmludGVyZmFjZSc7XG5pbXBvcnQgeyBNaXNjZWxsYW5lb3VzRGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMvbWlzY2VsbGFuZW91cy1kYXRhLmludGVyZmFjZSc7XG5cbmltcG9ydCB7IGdldE5hbWVzQ29tcGFyZUZuIH0gZnJvbSAnLi4vLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IHsgSU1vZHVsZURlcCB9IGZyb20gJy4uL2NvbXBpbGVyL2FuZ3VsYXIvZGVwcy9tb2R1bGUtZGVwLmZhY3RvcnknO1xuaW1wb3J0IHsgSUNvbXBvbmVudERlcCB9IGZyb20gJy4uL2NvbXBpbGVyL2FuZ3VsYXIvZGVwcy9jb21wb25lbnQtZGVwLmZhY3RvcnknO1xuaW1wb3J0IHsgSURpcmVjdGl2ZURlcCB9IGZyb20gJy4uL2NvbXBpbGVyL2FuZ3VsYXIvZGVwcy9kaXJlY3RpdmUtZGVwLmZhY3RvcnknO1xuaW1wb3J0IHsgSUFwaVNvdXJjZVJlc3VsdCB9IGZyb20gJy4uLy4uL3V0aWxzL2FwaS1zb3VyY2UtcmVzdWx0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBSb3V0ZUludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvcm91dGVzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBBbmd1bGFyQXBpVXRpbCB9IGZyb20gJy4uLy4uL3V0aWxzL2FuZ3VsYXItYXBpLnV0aWwnO1xuaW1wb3J0IHtcbiAgICBJSW5qZWN0YWJsZURlcCxcbiAgICBJSW50ZXJmYWNlRGVwLFxuICAgIElQaXBlRGVwLFxuICAgIElUeXBlQWxpYXNEZWNEZXAsXG4gICAgSUZ1bmN0aW9uRGVjRGVwLFxuICAgIElFbnVtRGVjRGVwLFxuICAgIElJbnRlcmNlcHRvckRlcCxcbiAgICBJR3VhcmREZXBcbn0gZnJvbSAnLi4vY29tcGlsZXIvYW5ndWxhci9kZXBlbmRlbmNpZXMuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJQ29udHJvbGxlckRlcCB9IGZyb20gJy4uL2NvbXBpbGVyL2FuZ3VsYXIvZGVwcy9jb250cm9sbGVyLWRlcC5mYWN0b3J5JztcblxuY29uc3QgdHJhdmVyc2UgPSByZXF1aXJlKCd0cmF2ZXJzZScpO1xuXG5leHBvcnQgY2xhc3MgRGVwZW5kZW5jaWVzRW5naW5lIHtcbiAgICBwdWJsaWMgcmF3RGF0YTogUGFyc2VkRGF0YTtcbiAgICBwdWJsaWMgbW9kdWxlczogT2JqZWN0W107XG4gICAgcHVibGljIHJhd01vZHVsZXM6IE9iamVjdFtdO1xuICAgIHB1YmxpYyByYXdNb2R1bGVzRm9yT3ZlcnZpZXc6IE9iamVjdFtdO1xuICAgIHB1YmxpYyBjb21wb25lbnRzOiBPYmplY3RbXTtcbiAgICBwdWJsaWMgY29udHJvbGxlcnM6IE9iamVjdFtdO1xuICAgIHB1YmxpYyBkaXJlY3RpdmVzOiBPYmplY3RbXTtcbiAgICBwdWJsaWMgaW5qZWN0YWJsZXM6IE9iamVjdFtdO1xuICAgIHB1YmxpYyBpbnRlcmNlcHRvcnM6IE9iamVjdFtdO1xuICAgIHB1YmxpYyBndWFyZHM6IE9iamVjdFtdO1xuICAgIHB1YmxpYyBpbnRlcmZhY2VzOiBPYmplY3RbXTtcbiAgICBwdWJsaWMgcm91dGVzOiBSb3V0ZUludGVyZmFjZTtcbiAgICBwdWJsaWMgcGlwZXM6IE9iamVjdFtdO1xuICAgIHB1YmxpYyBjbGFzc2VzOiBPYmplY3RbXTtcbiAgICBwdWJsaWMgbWlzY2VsbGFuZW91czogTWlzY2VsbGFuZW91c0RhdGE7XG5cbiAgICBwcml2YXRlIGFuZ3VsYXJBcGlVdGlsOiBBbmd1bGFyQXBpVXRpbCA9IG5ldyBBbmd1bGFyQXBpVXRpbCgpO1xuXG4gICAgcHJpdmF0ZSBjbGVhbk1vZHVsZXMobW9kdWxlcykge1xuICAgICAgICBsZXQgX20gPSBtb2R1bGVzO1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGxldCBsZW4gPSBtb2R1bGVzLmxlbmd0aDtcblxuICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgbGV0IGogPSAwO1xuICAgICAgICAgICAgbGV0IGxlbmcgPSBfbVtpXS5kZWNsYXJhdGlvbnMubGVuZ3RoO1xuICAgICAgICAgICAgZm9yIChqOyBqIDwgbGVuZzsgaisrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGsgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBsZW5ndDtcbiAgICAgICAgICAgICAgICBpZiAoX21baV0uZGVjbGFyYXRpb25zW2pdLmpzZG9jdGFncykge1xuICAgICAgICAgICAgICAgICAgICBsZW5ndCA9IF9tW2ldLmRlY2xhcmF0aW9uc1tqXS5qc2RvY3RhZ3MubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGs7IGsgPCBsZW5ndDsgaysrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgX21baV0uZGVjbGFyYXRpb25zW2pdLmpzZG9jdGFnc1trXS5wYXJlbnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKF9tW2ldLmRlY2xhcmF0aW9uc1tqXS5jb25zdHJ1Y3Rvck9iaikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoX21baV0uZGVjbGFyYXRpb25zW2pdLmNvbnN0cnVjdG9yT2JqLmpzZG9jdGFncykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3QgPSBfbVtpXS5kZWNsYXJhdGlvbnNbal0uY29uc3RydWN0b3JPYmouanNkb2N0YWdzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoazsgayA8IGxlbmd0OyBrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgX21baV0uZGVjbGFyYXRpb25zW2pdLmNvbnN0cnVjdG9yT2JqLmpzZG9jdGFnc1trXS5wYXJlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9tO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlTW9kdWxlc0RlY2xhcmF0aW9uc0V4cG9ydHNUeXBlcygpIHtcbiAgICAgICAgbGV0IF9tID0gdGhpcy5tb2R1bGVzLFxuICAgICAgICAgICAgaSA9IDAsXG4gICAgICAgICAgICBsZW4gPSB0aGlzLm1vZHVsZXMubGVuZ3RoO1xuXG4gICAgICAgIGxldCBtZXJnZVR5cGVzID0gZW50cnkgPT4ge1xuICAgICAgICAgICAgbGV0IGRpcmVjdGl2ZSA9IHRoaXMuZmluZEluQ29tcG9kb2NEZXBlbmRlbmNpZXMoZW50cnkubmFtZSwgdGhpcy5kaXJlY3RpdmVzLCBlbnRyeS5maWxlKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZGlyZWN0aXZlLmRhdGEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgZW50cnkudHlwZSA9ICdkaXJlY3RpdmUnO1xuICAgICAgICAgICAgICAgIGVudHJ5LmlkID0gZGlyZWN0aXZlLmRhdGEuaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY29tcG9uZW50ID0gdGhpcy5maW5kSW5Db21wb2RvY0RlcGVuZGVuY2llcyhlbnRyeS5uYW1lLCB0aGlzLmNvbXBvbmVudHMsIGVudHJ5LmZpbGUpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQuZGF0YSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBlbnRyeS50eXBlID0gJ2NvbXBvbmVudCc7XG4gICAgICAgICAgICAgICAgZW50cnkuaWQgPSBjb21wb25lbnQuZGF0YS5pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBwaXBlID0gdGhpcy5maW5kSW5Db21wb2RvY0RlcGVuZGVuY2llcyhlbnRyeS5uYW1lLCB0aGlzLnBpcGVzLCBlbnRyeS5maWxlKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcGlwZS5kYXRhICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGVudHJ5LnR5cGUgPSAncGlwZSc7XG4gICAgICAgICAgICAgICAgZW50cnkuaWQgPSBwaXBlLmRhdGEuaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5tb2R1bGVzLmZvckVhY2gobW9kdWxlID0+IHtcbiAgICAgICAgICAgIG1vZHVsZS5kZWNsYXJhdGlvbnMuZm9yRWFjaChkZWNsYXJhdGlvbiA9PiB7XG4gICAgICAgICAgICAgICAgbWVyZ2VUeXBlcyhkZWNsYXJhdGlvbik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzLmZvckVhY2goZXhwdCA9PiB7XG4gICAgICAgICAgICAgICAgbWVyZ2VUeXBlcyhleHB0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbW9kdWxlLmVudHJ5Q29tcG9uZW50cy5mb3JFYWNoKGVudCA9PiB7XG4gICAgICAgICAgICAgICAgbWVyZ2VUeXBlcyhlbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbml0KGRhdGE6IFBhcnNlZERhdGEpIHtcbiAgICAgICAgdHJhdmVyc2UoZGF0YSkuZm9yRWFjaChmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLnBhcmVudCkgZGVsZXRlIG5vZGUucGFyZW50O1xuICAgICAgICAgICAgICAgIGlmIChub2RlLmluaXRpYWxpemVyKSBkZWxldGUgbm9kZS5pbml0aWFsaXplcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmF3RGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMubW9kdWxlcyA9IF8uc29ydEJ5KHRoaXMucmF3RGF0YS5tb2R1bGVzLCBbJ25hbWUnXSk7XG4gICAgICAgIHRoaXMucmF3TW9kdWxlc0Zvck92ZXJ2aWV3ID0gXy5zb3J0QnkoZGF0YS5tb2R1bGVzRm9yR3JhcGgsIFsnbmFtZSddKTtcbiAgICAgICAgdGhpcy5yYXdNb2R1bGVzID0gXy5zb3J0QnkoZGF0YS5tb2R1bGVzRm9yR3JhcGgsIFsnbmFtZSddKTtcbiAgICAgICAgdGhpcy5jb21wb25lbnRzID0gXy5zb3J0QnkodGhpcy5yYXdEYXRhLmNvbXBvbmVudHMsIFsnbmFtZSddKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVycyA9IF8uc29ydEJ5KHRoaXMucmF3RGF0YS5jb250cm9sbGVycywgWyduYW1lJ10pO1xuICAgICAgICB0aGlzLmRpcmVjdGl2ZXMgPSBfLnNvcnRCeSh0aGlzLnJhd0RhdGEuZGlyZWN0aXZlcywgWyduYW1lJ10pO1xuICAgICAgICB0aGlzLmluamVjdGFibGVzID0gXy5zb3J0QnkodGhpcy5yYXdEYXRhLmluamVjdGFibGVzLCBbJ25hbWUnXSk7XG4gICAgICAgIHRoaXMuaW50ZXJjZXB0b3JzID0gXy5zb3J0QnkodGhpcy5yYXdEYXRhLmludGVyY2VwdG9ycywgWyduYW1lJ10pO1xuICAgICAgICB0aGlzLmd1YXJkcyA9IF8uc29ydEJ5KHRoaXMucmF3RGF0YS5ndWFyZHMsIFsnbmFtZSddKTtcbiAgICAgICAgdGhpcy5pbnRlcmZhY2VzID0gXy5zb3J0QnkodGhpcy5yYXdEYXRhLmludGVyZmFjZXMsIFsnbmFtZSddKTtcbiAgICAgICAgdGhpcy5waXBlcyA9IF8uc29ydEJ5KHRoaXMucmF3RGF0YS5waXBlcywgWyduYW1lJ10pO1xuICAgICAgICB0aGlzLmNsYXNzZXMgPSBfLnNvcnRCeSh0aGlzLnJhd0RhdGEuY2xhc3NlcywgWyduYW1lJ10pO1xuICAgICAgICB0aGlzLm1pc2NlbGxhbmVvdXMgPSB0aGlzLnJhd0RhdGEubWlzY2VsbGFuZW91cztcbiAgICAgICAgdGhpcy5wcmVwYXJlTWlzY2VsbGFuZW91cygpO1xuICAgICAgICB0aGlzLnVwZGF0ZU1vZHVsZXNEZWNsYXJhdGlvbnNFeHBvcnRzVHlwZXMoKTtcbiAgICAgICAgdGhpcy5yb3V0ZXMgPSB0aGlzLnJhd0RhdGEucm91dGVzVHJlZTtcbiAgICAgICAgdGhpcy5tYW5hZ2VEdXBsaWNhdGVzTmFtZSgpO1xuICAgICAgICB0aGlzLmNsZWFuUmF3TW9kdWxlc05hbWVzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGVhblJhd01vZHVsZXNOYW1lcygpIHtcbiAgICAgICAgdGhpcy5yYXdNb2R1bGVzRm9yT3ZlcnZpZXcgPSB0aGlzLnJhd01vZHVsZXNGb3JPdmVydmlldy5tYXAobW9kdWxlID0+IHtcbiAgICAgICAgICAgIG1vZHVsZS5uYW1lID0gbW9kdWxlLm5hbWUucmVwbGFjZSgnJCcsICcnKTtcbiAgICAgICAgICAgIHJldHVybiBtb2R1bGU7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmluZEluQ29tcG9kb2NEZXBlbmRlbmNpZXMobmFtZSwgZGF0YSwgZmlsZT8pOiBJQXBpU291cmNlUmVzdWx0PGFueT4ge1xuICAgICAgICBsZXQgX3Jlc3VsdCA9IHtcbiAgICAgICAgICAgIHNvdXJjZTogJ2ludGVybmFsJyxcbiAgICAgICAgICAgIGRhdGE6IHVuZGVmaW5lZFxuICAgICAgICB9O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZpbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLmluZGV4T2YoZGF0YVtpXS5uYW1lKSAhPT0gLTEgJiYgZmlsZS5yZXBsYWNlKC9cXFxcL2csICcvJykuaW5kZXhPZihkYXRhW2ldLmZpbGUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc3VsdC5kYXRhID0gZGF0YVtpXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLmluZGV4T2YoZGF0YVtpXS5uYW1lKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9yZXN1bHQuZGF0YSA9IGRhdGFbaV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9yZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYW5hZ2VEdXBsaWNhdGVzTmFtZSgpIHtcbiAgICAgICAgbGV0IHByb2Nlc3NEdXBsaWNhdGVzID0gKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgPT4ge1xuICAgICAgICAgICAgbGV0IGVsZW1lbnRzV2l0aFNhbWVOYW1lID0gXy5maWx0ZXIoYXJyYXksIHtuYW1lOiBlbGVtZW50Lm5hbWV9KTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50c1dpdGhTYW1lTmFtZS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgLy8gRmlyc3QgZWxlbWVudCBpcyB0aGUgcmVmZXJlbmNlIGZvciBkdXBsaWNhdGVzXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBlbGVtZW50c1dpdGhTYW1lTmFtZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZWxlbWVudFRvRWRpdCA9IGVsZW1lbnRzV2l0aFNhbWVOYW1lW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgZWxlbWVudFRvRWRpdC5pc0R1cGxpY2F0ZSA9PT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9FZGl0LmlzRHVwbGljYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0VkaXQuZHVwbGljYXRlSWQgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvRWRpdC5kdXBsaWNhdGVOYW1lID0gZWxlbWVudFRvRWRpdC5uYW1lICsgJy0nICsgZWxlbWVudFRvRWRpdC5kdXBsaWNhdGVJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0VkaXQuaWQgPSBlbGVtZW50VG9FZGl0LmlkICsgJy0nICsgZWxlbWVudFRvRWRpdC5kdXBsaWNhdGVJZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNsYXNzZXMgPSB0aGlzLmNsYXNzZXMubWFwKHByb2Nlc3NEdXBsaWNhdGVzKTtcbiAgICAgICAgdGhpcy5pbnRlcmZhY2VzID0gdGhpcy5pbnRlcmZhY2VzLm1hcChwcm9jZXNzRHVwbGljYXRlcyk7XG4gICAgICAgIHRoaXMuaW5qZWN0YWJsZXMgPSB0aGlzLmluamVjdGFibGVzLm1hcChwcm9jZXNzRHVwbGljYXRlcyk7XG4gICAgICAgIHRoaXMucGlwZXMgPSB0aGlzLnBpcGVzLm1hcChwcm9jZXNzRHVwbGljYXRlcyk7XG4gICAgICAgIHRoaXMuaW50ZXJjZXB0b3JzID0gdGhpcy5pbnRlcmNlcHRvcnMubWFwKHByb2Nlc3NEdXBsaWNhdGVzKTtcbiAgICAgICAgdGhpcy5ndWFyZHMgPSB0aGlzLmd1YXJkcy5tYXAocHJvY2Vzc0R1cGxpY2F0ZXMpO1xuICAgICAgICB0aGlzLm1vZHVsZXMgPSB0aGlzLm1vZHVsZXMubWFwKHByb2Nlc3NEdXBsaWNhdGVzKTtcbiAgICAgICAgdGhpcy5jb21wb25lbnRzID0gdGhpcy5jb21wb25lbnRzLm1hcChwcm9jZXNzRHVwbGljYXRlcyk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlcnMgPSB0aGlzLmNvbnRyb2xsZXJzLm1hcChwcm9jZXNzRHVwbGljYXRlcyk7XG4gICAgICAgIHRoaXMuZGlyZWN0aXZlcyA9IHRoaXMuZGlyZWN0aXZlcy5tYXAocHJvY2Vzc0R1cGxpY2F0ZXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBmaW5kKG5hbWU6IHN0cmluZyk6IElBcGlTb3VyY2VSZXN1bHQ8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGxldCBzZWFyY2hGdW5jdGlvbnM6IEFycmF5PCgpID0+IElBcGlTb3VyY2VSZXN1bHQ8YW55Pj4gPSBbXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmZpbmRJbkNvbXBvZG9jRGVwZW5kZW5jaWVzKG5hbWUsIHRoaXMuaW5qZWN0YWJsZXMpLFxuICAgICAgICAgICAgKCkgPT4gdGhpcy5maW5kSW5Db21wb2RvY0RlcGVuZGVuY2llcyhuYW1lLCB0aGlzLmludGVyY2VwdG9ycyksXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmZpbmRJbkNvbXBvZG9jRGVwZW5kZW5jaWVzKG5hbWUsIHRoaXMuZ3VhcmRzKSxcbiAgICAgICAgICAgICgpID0+IHRoaXMuZmluZEluQ29tcG9kb2NEZXBlbmRlbmNpZXMobmFtZSwgdGhpcy5pbnRlcmZhY2VzKSxcbiAgICAgICAgICAgICgpID0+IHRoaXMuZmluZEluQ29tcG9kb2NEZXBlbmRlbmNpZXMobmFtZSwgdGhpcy5jbGFzc2VzKSxcbiAgICAgICAgICAgICgpID0+IHRoaXMuZmluZEluQ29tcG9kb2NEZXBlbmRlbmNpZXMobmFtZSwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgICAgICgpID0+IHRoaXMuZmluZEluQ29tcG9kb2NEZXBlbmRlbmNpZXMobmFtZSwgdGhpcy5jb250cm9sbGVycyksXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmZpbmRJbkNvbXBvZG9jRGVwZW5kZW5jaWVzKG5hbWUsIHRoaXMubWlzY2VsbGFuZW91cy52YXJpYWJsZXMpLFxuICAgICAgICAgICAgKCkgPT4gdGhpcy5maW5kSW5Db21wb2RvY0RlcGVuZGVuY2llcyhuYW1lLCB0aGlzLm1pc2NlbGxhbmVvdXMuZnVuY3Rpb25zKSxcbiAgICAgICAgICAgICgpID0+IHRoaXMuZmluZEluQ29tcG9kb2NEZXBlbmRlbmNpZXMobmFtZSwgdGhpcy5taXNjZWxsYW5lb3VzLnR5cGVhbGlhc2VzKSxcbiAgICAgICAgICAgICgpID0+IHRoaXMuZmluZEluQ29tcG9kb2NEZXBlbmRlbmNpZXMobmFtZSwgdGhpcy5taXNjZWxsYW5lb3VzLmVudW1lcmF0aW9ucyksXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmFuZ3VsYXJBcGlVdGlsLmZpbmRBcGkobmFtZSlcbiAgICAgICAgXTtcblxuICAgICAgICBmb3IgKGxldCBzZWFyY2hGdW5jdGlvbiBvZiBzZWFyY2hGdW5jdGlvbnMpIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBzZWFyY2hGdW5jdGlvbigpO1xuXG4gICAgICAgICAgICBpZiAocmVzdWx0LmRhdGEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlKHVwZGF0ZWREYXRhKTogdm9pZCB7XG4gICAgICAgIGlmICh1cGRhdGVkRGF0YS5tb2R1bGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh1cGRhdGVkRGF0YS5tb2R1bGVzLCAobW9kdWxlOiBJTW9kdWxlRGVwKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IF9pbmRleCA9IF8uZmluZEluZGV4KHRoaXMubW9kdWxlcywgeyBuYW1lOiBtb2R1bGUubmFtZSB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLm1vZHVsZXNbX2luZGV4XSA9IG1vZHVsZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVkRGF0YS5jb21wb25lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh1cGRhdGVkRGF0YS5jb21wb25lbnRzLCAoY29tcG9uZW50OiBJQ29tcG9uZW50RGVwKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IF9pbmRleCA9IF8uZmluZEluZGV4KHRoaXMuY29tcG9uZW50cywgeyBuYW1lOiBjb21wb25lbnQubmFtZSB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNbX2luZGV4XSA9IGNvbXBvbmVudDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVkRGF0YS5jb250cm9sbGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBfLmZvckVhY2godXBkYXRlZERhdGEuY29udHJvbGxlcnMsIChjb250cm9sbGVyOiBJQ29udHJvbGxlckRlcCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBfaW5kZXggPSBfLmZpbmRJbmRleCh0aGlzLmNvbnRyb2xsZXJzLCB7IG5hbWU6IGNvbnRyb2xsZXIubmFtZSB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJzW19pbmRleF0gPSBjb250cm9sbGVyO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZWREYXRhLmRpcmVjdGl2ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgXy5mb3JFYWNoKHVwZGF0ZWREYXRhLmRpcmVjdGl2ZXMsIChkaXJlY3RpdmU6IElEaXJlY3RpdmVEZXApID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgX2luZGV4ID0gXy5maW5kSW5kZXgodGhpcy5kaXJlY3RpdmVzLCB7IG5hbWU6IGRpcmVjdGl2ZS5uYW1lIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlc1tfaW5kZXhdID0gZGlyZWN0aXZlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZWREYXRhLmluamVjdGFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh1cGRhdGVkRGF0YS5pbmplY3RhYmxlcywgKGluamVjdGFibGU6IElJbmplY3RhYmxlRGVwKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IF9pbmRleCA9IF8uZmluZEluZGV4KHRoaXMuaW5qZWN0YWJsZXMsIHsgbmFtZTogaW5qZWN0YWJsZS5uYW1lIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5qZWN0YWJsZXNbX2luZGV4XSA9IGluamVjdGFibGU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXBkYXRlZERhdGEuaW50ZXJjZXB0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh1cGRhdGVkRGF0YS5pbnRlcmNlcHRvcnMsIChpbnRlcmNlcHRvcjogSUludGVyY2VwdG9yRGVwKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IF9pbmRleCA9IF8uZmluZEluZGV4KHRoaXMuaW50ZXJjZXB0b3JzLCB7IG5hbWU6IGludGVyY2VwdG9yLm5hbWUgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcmNlcHRvcnNbX2luZGV4XSA9IGludGVyY2VwdG9yO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZWREYXRhLmd1YXJkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBfLmZvckVhY2godXBkYXRlZERhdGEuZ3VhcmRzLCAoZ3VhcmQ6IElHdWFyZERlcCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBfaW5kZXggPSBfLmZpbmRJbmRleCh0aGlzLmd1YXJkcywgeyBuYW1lOiBndWFyZC5uYW1lIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZ3VhcmRzW19pbmRleF0gPSBndWFyZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVkRGF0YS5pbnRlcmZhY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh1cGRhdGVkRGF0YS5pbnRlcmZhY2VzLCAoaW50OiBJSW50ZXJmYWNlRGVwKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IF9pbmRleCA9IF8uZmluZEluZGV4KHRoaXMuaW50ZXJmYWNlcywgeyBuYW1lOiBpbnQubmFtZSB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmludGVyZmFjZXNbX2luZGV4XSA9IGludDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVkRGF0YS5waXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBfLmZvckVhY2godXBkYXRlZERhdGEucGlwZXMsIChwaXBlOiBJUGlwZURlcCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBfaW5kZXggPSBfLmZpbmRJbmRleCh0aGlzLnBpcGVzLCB7IG5hbWU6IHBpcGUubmFtZSB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnBpcGVzW19pbmRleF0gPSBwaXBlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZWREYXRhLmNsYXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgXy5mb3JFYWNoKHVwZGF0ZWREYXRhLmNsYXNzZXMsIChjbGFzc2U6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBfaW5kZXggPSBfLmZpbmRJbmRleCh0aGlzLmNsYXNzZXMsIHsgbmFtZTogY2xhc3NlLm5hbWUgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGFzc2VzW19pbmRleF0gPSBjbGFzc2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogTWlzY2VsbGFuZW91cyB1cGRhdGVcbiAgICAgICAgICovXG4gICAgICAgIGlmICh1cGRhdGVkRGF0YS5taXNjZWxsYW5lb3VzLnZhcmlhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBfLmZvckVhY2godXBkYXRlZERhdGEubWlzY2VsbGFuZW91cy52YXJpYWJsZXMsICh2YXJpYWJsZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IF9pbmRleCA9IF8uZmluZEluZGV4KHRoaXMubWlzY2VsbGFuZW91cy52YXJpYWJsZXMsIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogdmFyaWFibGUubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZmlsZTogdmFyaWFibGUuZmlsZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMubWlzY2VsbGFuZW91cy52YXJpYWJsZXNbX2luZGV4XSA9IHZhcmlhYmxlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZWREYXRhLm1pc2NlbGxhbmVvdXMuZnVuY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh1cGRhdGVkRGF0YS5taXNjZWxsYW5lb3VzLmZ1bmN0aW9ucywgKGZ1bmM6IElGdW5jdGlvbkRlY0RlcCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBfaW5kZXggPSBfLmZpbmRJbmRleCh0aGlzLm1pc2NlbGxhbmVvdXMuZnVuY3Rpb25zLCB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGZ1bmMubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZmlsZTogZnVuYy5maWxlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5taXNjZWxsYW5lb3VzLmZ1bmN0aW9uc1tfaW5kZXhdID0gZnVuYztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVkRGF0YS5taXNjZWxsYW5lb3VzLnR5cGVhbGlhc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh1cGRhdGVkRGF0YS5taXNjZWxsYW5lb3VzLnR5cGVhbGlhc2VzLCAodHlwZWFsaWFzOiBJVHlwZUFsaWFzRGVjRGVwKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IF9pbmRleCA9IF8uZmluZEluZGV4KHRoaXMubWlzY2VsbGFuZW91cy50eXBlYWxpYXNlcywge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiB0eXBlYWxpYXMubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZmlsZTogdHlwZWFsaWFzLmZpbGVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLm1pc2NlbGxhbmVvdXMudHlwZWFsaWFzZXNbX2luZGV4XSA9IHR5cGVhbGlhcztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVkRGF0YS5taXNjZWxsYW5lb3VzLmVudW1lcmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBfLmZvckVhY2godXBkYXRlZERhdGEubWlzY2VsbGFuZW91cy5lbnVtZXJhdGlvbnMsIChlbnVtZXJhdGlvbjogSUVudW1EZWNEZXApID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgX2luZGV4ID0gXy5maW5kSW5kZXgodGhpcy5taXNjZWxsYW5lb3VzLmVudW1lcmF0aW9ucywge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBlbnVtZXJhdGlvbi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBmaWxlOiBlbnVtZXJhdGlvbi5maWxlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5taXNjZWxsYW5lb3VzLmVudW1lcmF0aW9uc1tfaW5kZXhdID0gZW51bWVyYXRpb247XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByZXBhcmVNaXNjZWxsYW5lb3VzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGZpbmRJbkNvbXBvZG9jKG5hbWU6IHN0cmluZykge1xuICAgICAgICBsZXQgbWVyZ2VkRGF0YSA9IF8uY29uY2F0KFxuICAgICAgICAgICAgW10sXG4gICAgICAgICAgICB0aGlzLm1vZHVsZXMsXG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMsXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJzLFxuICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVzLFxuICAgICAgICAgICAgdGhpcy5pbmplY3RhYmxlcyxcbiAgICAgICAgICAgIHRoaXMuaW50ZXJjZXB0b3JzLFxuICAgICAgICAgICAgdGhpcy5ndWFyZHMsXG4gICAgICAgICAgICB0aGlzLmludGVyZmFjZXMsXG4gICAgICAgICAgICB0aGlzLnBpcGVzLFxuICAgICAgICAgICAgdGhpcy5jbGFzc2VzLFxuICAgICAgICAgICAgdGhpcy5taXNjZWxsYW5lb3VzLmVudW1lcmF0aW9ucyxcbiAgICAgICAgICAgIHRoaXMubWlzY2VsbGFuZW91cy50eXBlYWxpYXNlcyxcbiAgICAgICAgICAgIHRoaXMubWlzY2VsbGFuZW91cy52YXJpYWJsZXMsXG4gICAgICAgICAgICB0aGlzLm1pc2NlbGxhbmVvdXMuZnVuY3Rpb25zXG4gICAgICAgICk7XG4gICAgICAgIGxldCByZXN1bHQgPSBfLmZpbmQobWVyZ2VkRGF0YSwgeyBuYW1lOiBuYW1lIH0gYXMgYW55KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByZXBhcmVNaXNjZWxsYW5lb3VzKCkge1xuICAgICAgICB0aGlzLm1pc2NlbGxhbmVvdXMudmFyaWFibGVzLnNvcnQoZ2V0TmFtZXNDb21wYXJlRm4oKSk7XG4gICAgICAgIHRoaXMubWlzY2VsbGFuZW91cy5mdW5jdGlvbnMuc29ydChnZXROYW1lc0NvbXBhcmVGbigpKTtcbiAgICAgICAgdGhpcy5taXNjZWxsYW5lb3VzLmVudW1lcmF0aW9ucy5zb3J0KGdldE5hbWVzQ29tcGFyZUZuKCkpO1xuICAgICAgICB0aGlzLm1pc2NlbGxhbmVvdXMudHlwZWFsaWFzZXMuc29ydChnZXROYW1lc0NvbXBhcmVGbigpKTtcbiAgICAgICAgLy8gZ3JvdXAgZWFjaCBzdWJnb3VwIGJ5IGZpbGVcbiAgICAgICAgdGhpcy5taXNjZWxsYW5lb3VzLmdyb3VwZWRWYXJpYWJsZXMgPSBfLmdyb3VwQnkodGhpcy5taXNjZWxsYW5lb3VzLnZhcmlhYmxlcywgJ2ZpbGUnKTtcbiAgICAgICAgdGhpcy5taXNjZWxsYW5lb3VzLmdyb3VwZWRGdW5jdGlvbnMgPSBfLmdyb3VwQnkodGhpcy5taXNjZWxsYW5lb3VzLmZ1bmN0aW9ucywgJ2ZpbGUnKTtcbiAgICAgICAgdGhpcy5taXNjZWxsYW5lb3VzLmdyb3VwZWRFbnVtZXJhdGlvbnMgPSBfLmdyb3VwQnkodGhpcy5taXNjZWxsYW5lb3VzLmVudW1lcmF0aW9ucywgJ2ZpbGUnKTtcbiAgICAgICAgdGhpcy5taXNjZWxsYW5lb3VzLmdyb3VwZWRUeXBlQWxpYXNlcyA9IF8uZ3JvdXBCeSh0aGlzLm1pc2NlbGxhbmVvdXMudHlwZWFsaWFzZXMsICdmaWxlJyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE1vZHVsZShuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIF8uZmluZCh0aGlzLm1vZHVsZXMsIFsnbmFtZScsIG5hbWVdKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UmF3TW9kdWxlKG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgICAgIHJldHVybiBfLmZpbmQodGhpcy5yYXdNb2R1bGVzLCBbJ25hbWUnLCBuYW1lXSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE1vZHVsZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZHVsZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudHM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbnRyb2xsZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sbGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGlyZWN0aXZlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlyZWN0aXZlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SW5qZWN0YWJsZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmluamVjdGFibGVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRJbnRlcmNlcHRvcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmludGVyY2VwdG9ycztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0R3VhcmRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ndWFyZHM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEludGVyZmFjZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmludGVyZmFjZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFJvdXRlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm91dGVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQaXBlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGlwZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENsYXNzZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsYXNzZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE1pc2NlbGxhbmVvdXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pc2NlbGxhbmVvdXM7XG4gICAgfVxufVxuIiwiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIExpdmVTZXJ2ZXIgZnJvbSAnbGl2ZS1zZXJ2ZXInO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuXG5pbXBvcnQgeyBTeW50YXhLaW5kIH0gZnJvbSAndHMtc2ltcGxlLWFzdCc7XG5cbmNvbnN0IGNob2tpZGFyID0gcmVxdWlyZSgnY2hva2lkYXInKTtcbmNvbnN0IG1hcmtlZCA9IHJlcXVpcmUoJ21hcmtlZCcpO1xuY29uc3QgdHJhdmVyc2UgPSByZXF1aXJlKCd0cmF2ZXJzZScpO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHsgSHRtbEVuZ2luZSB9IGZyb20gJy4vZW5naW5lcy9odG1sLmVuZ2luZSc7XG5pbXBvcnQgeyBNYXJrZG93bkVuZ2luZSB9IGZyb20gJy4vZW5naW5lcy9tYXJrZG93bi5lbmdpbmUnO1xuaW1wb3J0IHsgRmlsZUVuZ2luZSB9IGZyb20gJy4vZW5naW5lcy9maWxlLmVuZ2luZSc7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9jb25maWd1cmF0aW9uJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25JbnRlcmZhY2UgfSBmcm9tICcuL2ludGVyZmFjZXMvY29uZmlndXJhdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTmdkRW5naW5lIH0gZnJvbSAnLi9lbmdpbmVzL25nZC5lbmdpbmUnO1xuaW1wb3J0IHsgU2VhcmNoRW5naW5lIH0gZnJvbSAnLi9lbmdpbmVzL3NlYXJjaC5lbmdpbmUnO1xuaW1wb3J0IHsgRXhwb3J0RW5naW5lIH0gZnJvbSAnLi9lbmdpbmVzL2V4cG9ydC5lbmdpbmUnO1xuaW1wb3J0IEkxOG5FbmdpbmVJbnN0YW5jZSBmcm9tICcuL2VuZ2luZXMvaTE4bi5lbmdpbmUnO1xuXG5pbXBvcnQgeyBBbmd1bGFyRGVwZW5kZW5jaWVzIH0gZnJvbSAnLi9jb21waWxlci9hbmd1bGFyLWRlcGVuZGVuY2llcyc7XG5pbXBvcnQgeyBBbmd1bGFySlNEZXBlbmRlbmNpZXMgfSBmcm9tICcuL2NvbXBpbGVyL2FuZ3VsYXJqcy1kZXBlbmRlbmNpZXMnO1xuXG5pbXBvcnQgeyBDT01QT0RPQ19ERUZBVUxUUyB9IGZyb20gJy4uL3V0aWxzL2RlZmF1bHRzJztcbmltcG9ydCB7IENPTVBPRE9DX0NPTlNUQU5UUyB9IGZyb20gJy4uL3V0aWxzL2NvbnN0YW50cyc7XG5cbmltcG9ydCB7IGNsZWFuU291cmNlc0ZvcldhdGNoIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuXG5pbXBvcnQgeyBjbGVhbk5hbWVXaXRob3V0U3BhY2VBbmRUb0xvd2VyQ2FzZSwgZmluZE1haW5Tb3VyY2VGb2xkZXIgfSBmcm9tICcuLi91dGlsaXRpZXMnO1xuXG5pbXBvcnQgeyBwcm9taXNlU2VxdWVudGlhbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2Utc2VxdWVudGlhbCc7XG5pbXBvcnQgeyBEZXBlbmRlbmNpZXNFbmdpbmUgfSBmcm9tICcuL2VuZ2luZXMvZGVwZW5kZW5jaWVzLmVuZ2luZSc7XG5pbXBvcnQgeyBBbmd1bGFyVmVyc2lvblV0aWwsIFJvdXRlclBhcnNlclV0aWwgfSBmcm9tICcuLi91dGlscyc7XG5cbmxldCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xubGV0ICRtYXJrZG93bmVuZ2luZSA9IG5ldyBNYXJrZG93bkVuZ2luZSgpO1xubGV0IHN0YXJ0VGltZSA9IG5ldyBEYXRlKCk7XG5sZXQgZ2VuZXJhdGlvblByb21pc2VSZXNvbHZlO1xubGV0IGdlbmVyYXRpb25Qcm9taXNlUmVqZWN0O1xubGV0IGdlbmVyYXRpb25Qcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGdlbmVyYXRpb25Qcm9taXNlUmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgZ2VuZXJhdGlvblByb21pc2VSZWplY3QgPSByZWplY3Q7XG59KTtcblxuZXhwb3J0IGNsYXNzIEFwcGxpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBGaWxlcyBwcm9jZXNzZWQgZHVyaW5nIGluaXRpYWwgc2Nhbm5pbmdcbiAgICAgKi9cbiAgICBwdWJsaWMgZmlsZXM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogRmlsZXMgcHJvY2Vzc2VkIGR1cmluZyB3YXRjaCBzY2FubmluZ1xuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVkRmlsZXM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogRmlsZXMgY2hhbmdlZCBkdXJpbmcgd2F0Y2ggc2Nhbm5pbmdcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hDaGFuZ2VkRmlsZXM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICAvKipcbiAgICAgKiBDb21wb2RvYyBjb25maWd1cmF0aW9uIGxvY2FsIHJlZmVyZW5jZVxuICAgICAqL1xuICAgIHB1YmxpYyBjb25maWd1cmF0aW9uOiBDb25maWd1cmF0aW9uSW50ZXJmYWNlO1xuICAgIC8qKlxuICAgICAqIEJvb2xlYW4gZm9yIHdhdGNoaW5nIHN0YXR1c1xuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIHB1YmxpYyBpc1dhdGNoaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBTdG9yZSBwYWNrYWdlLmpzb24gZGF0YVxuICAgICAqL1xuICAgIHByaXZhdGUgcGFja2FnZUpzb25EYXRhID0ge307XG5cbiAgICBwcml2YXRlIGFuZ3VsYXJWZXJzaW9uVXRpbCA9IG5ldyBBbmd1bGFyVmVyc2lvblV0aWwoKTtcbiAgICBwcml2YXRlIGRlcGVuZGVuY2llc0VuZ2luZTogRGVwZW5kZW5jaWVzRW5naW5lO1xuICAgIHByaXZhdGUgbmdkRW5naW5lOiBOZ2RFbmdpbmU7XG4gICAgcHJpdmF0ZSBodG1sRW5naW5lOiBIdG1sRW5naW5lO1xuICAgIHByaXZhdGUgc2VhcmNoRW5naW5lOiBTZWFyY2hFbmdpbmU7XG4gICAgcHJpdmF0ZSBleHBvcnRFbmdpbmU6IEV4cG9ydEVuZ2luZTtcbiAgICBwcm90ZWN0ZWQgZmlsZUVuZ2luZTogRmlsZUVuZ2luZSA9IG5ldyBGaWxlRW5naW5lKCk7XG4gICAgcHJpdmF0ZSByb3V0ZXJQYXJzZXIgPSBuZXcgUm91dGVyUGFyc2VyVXRpbCgpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IGNvbXBvZG9jIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG9wdGlvbnMgdGhhdCBzaG91bGQgYmUgdXNlZC5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zPzogT2JqZWN0KSB7XG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IG5ldyBDb25maWd1cmF0aW9uKCk7XG4gICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lID0gbmV3IERlcGVuZGVuY2llc0VuZ2luZSgpO1xuICAgICAgICB0aGlzLm5nZEVuZ2luZSA9IG5ldyBOZ2RFbmdpbmUodGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUpO1xuICAgICAgICB0aGlzLmh0bWxFbmdpbmUgPSBuZXcgSHRtbEVuZ2luZShcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLFxuICAgICAgICAgICAgdGhpcy5maWxlRW5naW5lXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc2VhcmNoRW5naW5lID0gbmV3IFNlYXJjaEVuZ2luZSh0aGlzLmNvbmZpZ3VyYXRpb24sIHRoaXMuZmlsZUVuZ2luZSk7XG4gICAgICAgIHRoaXMuZXhwb3J0RW5naW5lID0gbmV3IEV4cG9ydEVuZ2luZShcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLFxuICAgICAgICAgICAgdGhpcy5maWxlRW5naW5lXG4gICAgICAgICk7XG5cbiAgICAgICAgZm9yIChsZXQgb3B0aW9uIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhW29wdGlvbl0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhW29wdGlvbl0gPSBvcHRpb25zW29wdGlvbl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBGb3IgZG9jdW1lbnRhdGlvbk1haW5OYW1lLCBwcm9jZXNzIGl0IG91dHNpZGUgdGhlIGxvb3AsIGZvciBoYW5kbGluZyBjb25mbGljdCB3aXRoIHBhZ2VzIG5hbWVcbiAgICAgICAgICAgIGlmIChvcHRpb24gPT09ICduYW1lJykge1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kb2N1bWVudGF0aW9uTWFpbk5hbWUgPSBvcHRpb25zW29wdGlvbl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBGb3IgZG9jdW1lbnRhdGlvbk1haW5OYW1lLCBwcm9jZXNzIGl0IG91dHNpZGUgdGhlIGxvb3AsIGZvciBoYW5kbGluZyBjb25mbGljdCB3aXRoIHBhZ2VzIG5hbWVcbiAgICAgICAgICAgIGlmIChvcHRpb24gPT09ICdzaWxlbnQnKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLnNpbGVudCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RhcnQgY29tcG9kb2MgcHJvY2Vzc1xuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZW5lcmF0ZSgpOiBQcm9taXNlPHt9PiB7XG4gICAgICAgIHByb2Nlc3Mub24oJ3VuaGFuZGxlZFJlamVjdGlvbicsIHRoaXMudW5oYW5kbGVkUmVqZWN0aW9uTGlzdGVuZXIpO1xuICAgICAgICBwcm9jZXNzLm9uKCd1bmNhdWdodEV4Y2VwdGlvbicsIHRoaXMudW5jYXVnaHRFeGNlcHRpb25MaXN0ZW5lcik7XG5cbiAgICAgICAgSTE4bkVuZ2luZUluc3RhbmNlLmluaXQodGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmxhbmd1YWdlKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0LmNoYXJBdChcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0Lmxlbmd0aCAtIDFcbiAgICAgICAgICAgICkgIT09ICcvJ1xuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQgKz0gJy8nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5leHBvcnRGb3JtYXQgIT09IENPTVBPRE9DX0RFRkFVTFRTLmV4cG9ydEZvcm1hdCkge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzUGFja2FnZUpzb24oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaHRtbEVuZ2luZS5pbml0KHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS50ZW1wbGF0ZXMpLnRoZW4oKCkgPT4gdGhpcy5wcm9jZXNzUGFja2FnZUpzb24oKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdlbmVyYXRpb25Qcm9taXNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZW5kQ2FsbGJhY2soKSB7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ3VuaGFuZGxlZFJlamVjdGlvbicsIHRoaXMudW5oYW5kbGVkUmVqZWN0aW9uTGlzdGVuZXIpO1xuICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCd1bmNhdWdodEV4Y2VwdGlvbicsIHRoaXMudW5jYXVnaHRFeGNlcHRpb25MaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1bmhhbmRsZWRSZWplY3Rpb25MaXN0ZW5lcihlcnIsIHApIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1VuaGFuZGxlZCBSZWplY3Rpb24gYXQ6JywgcCwgJ3JlYXNvbjonLCBlcnIpO1xuICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAnU29ycnksIGJ1dCB0aGVyZSB3YXMgYSBwcm9ibGVtIGR1cmluZyBwYXJzaW5nIG9yIGdlbmVyYXRpb24gb2YgdGhlIGRvY3VtZW50YXRpb24uIFBsZWFzZSBmaWxsIGFuIGlzc3VlIG9uIGdpdGh1Yi4gKGh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb2RvYy9jb21wb2RvYy9pc3N1ZXMvbmV3KSdcbiAgICAgICAgKTsgLy8gdHNsaW50OmRpc2FibGUtbGluZVxuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1bmNhdWdodEV4Y2VwdGlvbkxpc3RlbmVyKGVycikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgJ1NvcnJ5LCBidXQgdGhlcmUgd2FzIGEgcHJvYmxlbSBkdXJpbmcgcGFyc2luZyBvciBnZW5lcmF0aW9uIG9mIHRoZSBkb2N1bWVudGF0aW9uLiBQbGVhc2UgZmlsbCBhbiBpc3N1ZSBvbiBnaXRodWIuIChodHRwczovL2dpdGh1Yi5jb20vY29tcG9kb2MvY29tcG9kb2MvaXNzdWVzL25ldyknXG4gICAgICAgICk7IC8vIHRzbGludDpkaXNhYmxlLWxpbmVcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0YXJ0IGNvbXBvZG9jIGRvY3VtZW50YXRpb24gY292ZXJhZ2VcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgdGVzdENvdmVyYWdlKCkge1xuICAgICAgICB0aGlzLmdldERlcGVuZGVuY2llc0RhdGEoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdG9yZSBmaWxlcyBmb3IgaW5pdGlhbCBwcm9jZXNzaW5nXG4gICAgICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gZmlsZXMgRmlsZXMgZm91bmQgZHVyaW5nIHNvdXJjZSBmb2xkZXIgYW5kIHRzY29uZmlnIHNjYW5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RmlsZXMoZmlsZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICAgICAgdGhpcy5maWxlcyA9IGZpbGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0b3JlIGZpbGVzIGZvciB3YXRjaCBwcm9jZXNzaW5nXG4gICAgICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gZmlsZXMgRmlsZXMgZm91bmQgZHVyaW5nIHNvdXJjZSBmb2xkZXIgYW5kIHRzY29uZmlnIHNjYW5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0VXBkYXRlZEZpbGVzKGZpbGVzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgICAgIHRoaXMudXBkYXRlZEZpbGVzID0gZmlsZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIG9uZSBUeXBlU2NyaXB0IGZpbGUgaW4gdXBkYXRlZEZpbGVzIGxpc3RcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXN1bHQgb2Ygc2NhblxuICAgICAqL1xuICAgIHB1YmxpYyBoYXNXYXRjaGVkRmlsZXNUU0ZpbGVzKCk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG5cbiAgICAgICAgXy5mb3JFYWNoKHRoaXMudXBkYXRlZEZpbGVzLCBmaWxlID0+IHtcbiAgICAgICAgICAgIGlmIChwYXRoLmV4dG5hbWUoZmlsZSkgPT09ICcudHMnKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSBib29sZWFuIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygb25lIHJvb3QgbWFya2Rvd24gZmlsZXMgaW4gdXBkYXRlZEZpbGVzIGxpc3RcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXN1bHQgb2Ygc2NhblxuICAgICAqL1xuICAgIHB1YmxpYyBoYXNXYXRjaGVkRmlsZXNSb290TWFya2Rvd25GaWxlcygpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xuXG4gICAgICAgIF8uZm9yRWFjaCh0aGlzLnVwZGF0ZWRGaWxlcywgZmlsZSA9PiB7XG4gICAgICAgICAgICBpZiAocGF0aC5leHRuYW1lKGZpbGUpID09PSAnLm1kJyAmJiBwYXRoLmRpcm5hbWUoZmlsZSkgPT09IHByb2Nlc3MuY3dkKCkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFyIGZpbGVzIGZvciB3YXRjaCBwcm9jZXNzaW5nXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyVXBkYXRlZEZpbGVzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnVwZGF0ZWRGaWxlcyA9IFtdO1xuICAgICAgICB0aGlzLndhdGNoQ2hhbmdlZEZpbGVzID0gW107XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzUGFja2FnZUpzb24oKTogdm9pZCB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdTZWFyY2hpbmcgcGFja2FnZS5qc29uIGZpbGUnKTtcbiAgICAgICAgdGhpcy5maWxlRW5naW5lLmdldChwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXAgKyAncGFja2FnZS5qc29uJykudGhlbihcbiAgICAgICAgICAgIHBhY2thZ2VEYXRhID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcGFyc2VkRGF0YSA9IEpTT04ucGFyc2UocGFja2FnZURhdGEpO1xuICAgICAgICAgICAgICAgIHRoaXMucGFja2FnZUpzb25EYXRhID0gcGFyc2VkRGF0YTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBwYXJzZWREYXRhLm5hbWUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kb2N1bWVudGF0aW9uTWFpbk5hbWUgPT09IENPTVBPRE9DX0RFRkFVTFRTLnRpdGxlXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kb2N1bWVudGF0aW9uTWFpbk5hbWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkRGF0YS5uYW1lICsgJyBkb2N1bWVudGF0aW9uJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJzZWREYXRhLmRlc2NyaXB0aW9uICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZG9jdW1lbnRhdGlvbk1haW5EZXNjcmlwdGlvbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWREYXRhLmRlc2NyaXB0aW9uO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuYW5ndWxhclZlcnNpb24gPSB0aGlzLmFuZ3VsYXJWZXJzaW9uVXRpbC5nZXRBbmd1bGFyVmVyc2lvbk9mUHJvamVjdChcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkRGF0YVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ3BhY2thZ2UuanNvbiBmaWxlIGZvdW5kJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBhcnNlZERhdGEuZGVwZW5kZW5jaWVzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NQYWNrYWdlRGVwZW5kZW5jaWVzKHBhcnNlZERhdGEuZGVwZW5kZW5jaWVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJzZWREYXRhLnBlZXJEZXBlbmRlbmNpZXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1BhY2thZ2VQZWVyRGVwZW5kZW5jaWVzKHBhcnNlZERhdGEucGVlckRlcGVuZGVuY2llcyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzTWFya2Rvd25zKCkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXREZXBlbmRlbmNpZXNEYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0+IHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0NvbnRpbnVpbmcgd2l0aG91dCBwYWNrYWdlLmpzb24gZmlsZScpO1xuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc01hcmtkb3ducygpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0RGVwZW5kZW5jaWVzRGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UxID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlcnJvck1lc3NhZ2UxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzUGFja2FnZVBlZXJEZXBlbmRlbmNpZXMoZGVwZW5kZW5jaWVzKTogdm9pZCB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcm9jZXNzaW5nIHBhY2thZ2UuanNvbiBwZWVyRGVwZW5kZW5jaWVzJyk7XG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5wYWNrYWdlUGVlckRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llcztcbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb24uaGFzUGFnZSgnZGVwZW5kZW5jaWVzJykpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5hZGRQYWdlKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnZGVwZW5kZW5jaWVzJyxcbiAgICAgICAgICAgICAgICBpZDogJ3BhY2thZ2VEZXBlbmRlbmNpZXMnLFxuICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdwYWNrYWdlLWRlcGVuZGVuY2llcycsXG4gICAgICAgICAgICAgICAgZGVwdGg6IDAsXG4gICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuUk9PVFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHByb2Nlc3NQYWNrYWdlRGVwZW5kZW5jaWVzKGRlcGVuZGVuY2llcyk6IHZvaWQge1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJvY2Vzc2luZyBwYWNrYWdlLmpzb24gZGVwZW5kZW5jaWVzJyk7XG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5wYWNrYWdlRGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzO1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uYWRkUGFnZSh7XG4gICAgICAgICAgICBuYW1lOiAnZGVwZW5kZW5jaWVzJyxcbiAgICAgICAgICAgIGlkOiAncGFja2FnZURlcGVuZGVuY2llcycsXG4gICAgICAgICAgICBjb250ZXh0OiAncGFja2FnZS1kZXBlbmRlbmNpZXMnLFxuICAgICAgICAgICAgZGVwdGg6IDAsXG4gICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5ST09UXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgcHJvY2Vzc01hcmtkb3ducygpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICdTZWFyY2hpbmcgUkVBRE1FLm1kLCBDSEFOR0VMT0cubWQsIENPTlRSSUJVVElORy5tZCwgTElDRU5TRS5tZCwgVE9ETy5tZCBmaWxlcydcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgbGV0IG1hcmtkb3ducyA9IFsncmVhZG1lJywgJ2NoYW5nZWxvZycsICdjb250cmlidXRpbmcnLCAnbGljZW5zZScsICd0b2RvJ107XG4gICAgICAgICAgICBsZXQgbnVtYmVyT2ZNYXJrZG93bnMgPSA1O1xuICAgICAgICAgICAgbGV0IGxvb3AgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPCBudW1iZXJPZk1hcmtkb3ducykge1xuICAgICAgICAgICAgICAgICAgICAkbWFya2Rvd25lbmdpbmUuZ2V0VHJhZGl0aW9uYWxNYXJrZG93bihtYXJrZG93bnNbaV0udG9VcHBlckNhc2UoKSkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgIChyZWFkbWVEYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uYWRkUGFnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG1hcmtkb3duc1tpXSA9PT0gJ3JlYWRtZScgPyAnaW5kZXgnIDogbWFya2Rvd25zW2ldLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAnZ2V0dGluZy1zdGFydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdnZXR0aW5nLXN0YXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZG93bjogcmVhZG1lRGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLlJPT1RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFya2Rvd25zW2ldID09PSAncmVhZG1lJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEucmVhZG1lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmFkZFBhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ292ZXJ2aWV3JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnb3ZlcnZpZXcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogJ292ZXJ2aWV3JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLlJPT1RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLm1hcmtkb3ducy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG1hcmtkb3duc1tpXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVybmFtZTogbWFya2Rvd25zW2ldLnRvVXBwZXJDYXNlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLlJPT1RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAke21hcmtkb3duc1tpXS50b1VwcGVyQ2FzZSgpfS5tZCBmaWxlIGZvdW5kYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKGVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oYENvbnRpbnVpbmcgd2l0aG91dCAke21hcmtkb3duc1tpXS50b1VwcGVyQ2FzZSgpfS5tZCBmaWxlYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcmtkb3duc1tpXSA9PT0gJ3JlYWRtZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmFkZFBhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2luZGV4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnaW5kZXgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogJ292ZXJ2aWV3JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuUk9PVFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWJ1aWxkUm9vdE1hcmtkb3ducygpOiB2b2lkIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAnUmVnZW5lcmF0aW5nIFJFQURNRS5tZCwgQ0hBTkdFTE9HLm1kLCBDT05UUklCVVRJTkcubWQsIExJQ0VOU0UubWQsIFRPRE8ubWQgcGFnZXMnXG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0IGFjdGlvbnMgPSBbXTtcblxuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ucmVzZXRSb290TWFya2Rvd25QYWdlcygpO1xuXG4gICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzTWFya2Rvd25zKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHByb21pc2VTZXF1ZW50aWFsKGFjdGlvbnMpXG4gICAgICAgICAgICAudGhlbihyZXMgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1BhZ2VzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhclVwZGF0ZWRGaWxlcygpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlcnJvck1lc3NhZ2UgPT4ge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGRlcGVuZGVuY3kgZGF0YSBmb3Igc21hbGwgZ3JvdXAgb2YgdXBkYXRlZCBmaWxlcyBkdXJpbmcgd2F0Y2ggcHJvY2Vzc1xuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0TWljcm9EZXBlbmRlbmNpZXNEYXRhKCk6IHZvaWQge1xuICAgICAgICBsb2dnZXIuaW5mbygnR2V0IGRpZmYgZGVwZW5kZW5jaWVzIGRhdGEnKTtcbiAgICAgICAgbGV0IGNyYXdsZXIgPSBuZXcgRGVwZW5kZW5jaWVzKFxuICAgICAgICAgICAgdGhpcy51cGRhdGVkRmlsZXMsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHNjb25maWdEaXJlY3Rvcnk6IHBhdGguZGlybmFtZSh0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEudHNjb25maWcpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLFxuICAgICAgICAgICAgdGhpcy5yb3V0ZXJQYXJzZXJcbiAgICAgICAgKTtcblxuICAgICAgICBsZXQgZGVwZW5kZW5jaWVzRGF0YSA9IGNyYXdsZXIuZ2V0RGVwZW5kZW5jaWVzKCk7XG5cbiAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUudXBkYXRlKGRlcGVuZGVuY2llc0RhdGEpO1xuXG4gICAgICAgIHRoaXMucHJlcGFyZUp1c3RBRmV3VGhpbmdzKGRlcGVuZGVuY2llc0RhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlYnVpbGQgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbiBkdXJpbmcgd2F0Y2ggcHJvY2Vzc1xuICAgICAqL1xuICAgIHByaXZhdGUgcmVidWlsZEV4dGVybmFsRG9jdW1lbnRhdGlvbigpOiB2b2lkIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1JlYnVpbGQgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbicpO1xuXG4gICAgICAgIGxldCBhY3Rpb25zID0gW107XG5cbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLnJlc2V0QWRkaXRpb25hbFBhZ2VzKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5pbmNsdWRlcyAhPT0gJycpIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZUV4dGVybmFsSW5jbHVkZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvbWlzZVNlcXVlbnRpYWwoYWN0aW9ucylcbiAgICAgICAgICAgIC50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzUGFnZXMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyVXBkYXRlZEZpbGVzKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGVycm9yTWVzc2FnZSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldERlcGVuZGVuY2llc0RhdGEoKTogdm9pZCB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdHZXQgZGVwZW5kZW5jaWVzIGRhdGEnKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQW5ndWxhckpTIGRldGVjdGlvbiBzdHJhdGVneSA6XG4gICAgICAgICAqIC0gaWYgaW4gcGFja2FnZS5qc29uXG4gICAgICAgICAqIC0gaWYgNzUlIG9mIHNjYW5uZWQgZmlsZXMgYXJlICouanMgZmlsZXNcbiAgICAgICAgICovXG4gICAgICAgIGxldCBkZXBlbmRlbmNpZXNDbGFzczogQW5ndWxhckRlcGVuZGVuY2llcyB8IEFuZ3VsYXJKU0RlcGVuZGVuY2llcyA9IEFuZ3VsYXJEZXBlbmRlbmNpZXM7XG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5hbmd1bGFyUHJvamVjdCA9IHRydWU7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBhY2thZ2VKc29uRGF0YS5kZXBlbmRlbmNpZXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMucGFja2FnZUpzb25EYXRhLmRlcGVuZGVuY2llcy5hbmd1bGFyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdBbmd1bGFySlMgcHJvamVjdCBkZXRlY3RlZCcpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5hbmd1bGFyUHJvamVjdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5hbmd1bGFySlNQcm9qZWN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXNDbGFzcyA9IEFuZ3VsYXJKU0RlcGVuZGVuY2llcztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvdW50SlNGaWxlcyA9IDA7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlcy5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXRoLmV4dG5hbWUoZmlsZSkgPT09ICcuanMnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudEpTRmlsZXMgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGxldCBwZXJjZW50T2ZKU0ZpbGVzID0gKGNvdW50SlNGaWxlcyAqIDEwMCkgLyB0aGlzLmZpbGVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAocGVyY2VudE9mSlNGaWxlcyA+PSA3NSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnQW5ndWxhckpTIHByb2plY3QgZGV0ZWN0ZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmFuZ3VsYXJQcm9qZWN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5hbmd1bGFySlNQcm9qZWN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzQ2xhc3MgPSBBbmd1bGFySlNEZXBlbmRlbmNpZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNyYXdsZXIgPSBuZXcgZGVwZW5kZW5jaWVzQ2xhc3MoXG4gICAgICAgICAgICB0aGlzLmZpbGVzLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRzY29uZmlnRGlyZWN0b3J5OiBwYXRoLmRpcm5hbWUodGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLnRzY29uZmlnKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbixcbiAgICAgICAgICAgIHRoaXMucm91dGVyUGFyc2VyXG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0IGRlcGVuZGVuY2llc0RhdGEgPSBjcmF3bGVyLmdldERlcGVuZGVuY2llcygpO1xuXG4gICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLmluaXQoZGVwZW5kZW5jaWVzRGF0YSk7XG5cbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLnJvdXRlc0xlbmd0aCA9IHRoaXMucm91dGVyUGFyc2VyLnJvdXRlc0xlbmd0aCgpO1xuXG4gICAgICAgIHRoaXMucHJpbnRTdGF0aXN0aWNzKCk7XG5cbiAgICAgICAgdGhpcy5wcmVwYXJlRXZlcnl0aGluZygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcHJlcGFyZUp1c3RBRmV3VGhpbmdzKGRpZmZDcmF3bGVkRGF0YSk6IHZvaWQge1xuICAgICAgICBsZXQgYWN0aW9ucyA9IFtdO1xuXG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5yZXNldFBhZ2VzKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVJvdXRlc0dyYXBoKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4gdGhpcy5wcmVwYXJlUm91dGVzKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRpZmZDcmF3bGVkRGF0YS5jb21wb25lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB0aGlzLnByZXBhcmVDb21wb25lbnRzKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaWZmQ3Jhd2xlZERhdGEuY29udHJvbGxlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHRoaXMucHJlcGFyZUNvbnRyb2xsZXJzKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaWZmQ3Jhd2xlZERhdGEubW9kdWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4gdGhpcy5wcmVwYXJlTW9kdWxlcygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkaWZmQ3Jhd2xlZERhdGEuZGlyZWN0aXZlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4gdGhpcy5wcmVwYXJlRGlyZWN0aXZlcygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkaWZmQ3Jhd2xlZERhdGEuaW5qZWN0YWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHRoaXMucHJlcGFyZUluamVjdGFibGVzKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRpZmZDcmF3bGVkRGF0YS5pbnRlcmNlcHRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHRoaXMucHJlcGFyZUludGVyY2VwdG9ycygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkaWZmQ3Jhd2xlZERhdGEuZ3VhcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB0aGlzLnByZXBhcmVHdWFyZHMoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGlmZkNyYXdsZWREYXRhLnBpcGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB0aGlzLnByZXBhcmVQaXBlcygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkaWZmQ3Jhd2xlZERhdGEuY2xhc3Nlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4gdGhpcy5wcmVwYXJlQ2xhc3NlcygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkaWZmQ3Jhd2xlZERhdGEuaW50ZXJmYWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4gdGhpcy5wcmVwYXJlSW50ZXJmYWNlcygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGRpZmZDcmF3bGVkRGF0YS5taXNjZWxsYW5lb3VzLnZhcmlhYmxlcy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgICBkaWZmQ3Jhd2xlZERhdGEubWlzY2VsbGFuZW91cy5mdW5jdGlvbnMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgZGlmZkNyYXdsZWREYXRhLm1pc2NlbGxhbmVvdXMudHlwZWFsaWFzZXMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgZGlmZkNyYXdsZWREYXRhLm1pc2NlbGxhbmVvdXMuZW51bWVyYXRpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4gdGhpcy5wcmVwYXJlTWlzY2VsbGFuZW91cygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVDb3ZlcmFnZSkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHRoaXMucHJlcGFyZUNvdmVyYWdlKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvbWlzZVNlcXVlbnRpYWwoYWN0aW9ucylcbiAgICAgICAgICAgIC50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzR3JhcGhzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhclVwZGF0ZWRGaWxlcygpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlcnJvck1lc3NhZ2UgPT4ge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcmludFN0YXRpc3RpY3MoKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCctLS0tLS0tLS0tLS0tLS0tLS0tJyk7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcm9qZWN0IHN0YXRpc3RpY3MgJyk7XG4gICAgICAgIGlmICh0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5tb2R1bGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAtIGZpbGVzICAgICAgOiAke3RoaXMuZmlsZXMubGVuZ3RofWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5tb2R1bGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAtIG1vZHVsZSAgICAgOiAke3RoaXMuZGVwZW5kZW5jaWVzRW5naW5lLm1vZHVsZXMubGVuZ3RofWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5jb21wb25lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAtIGNvbXBvbmVudCAgOiAke3RoaXMuZGVwZW5kZW5jaWVzRW5naW5lLmNvbXBvbmVudHMubGVuZ3RofWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5jb250cm9sbGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgLSBjb250cm9sbGVyIDogJHt0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5jb250cm9sbGVycy5sZW5ndGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLmRpcmVjdGl2ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYC0gZGlyZWN0aXZlICA6ICR7dGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUuZGlyZWN0aXZlcy5sZW5ndGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLmluamVjdGFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAtIGluamVjdGFibGUgOiAke3RoaXMuZGVwZW5kZW5jaWVzRW5naW5lLmluamVjdGFibGVzLmxlbmd0aH1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUuaW50ZXJjZXB0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAtIGluamVjdG9yICAgOiAke3RoaXMuZGVwZW5kZW5jaWVzRW5naW5lLmludGVyY2VwdG9ycy5sZW5ndGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLmd1YXJkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgLSBndWFyZCAgICAgIDogJHt0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5ndWFyZHMubGVuZ3RofWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5waXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgLSBwaXBlICAgICAgIDogJHt0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5waXBlcy5sZW5ndGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLmNsYXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYC0gY2xhc3MgICAgICA6ICR7dGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUuY2xhc3Nlcy5sZW5ndGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLmludGVyZmFjZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYC0gaW50ZXJmYWNlICA6ICR7dGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUuaW50ZXJmYWNlcy5sZW5ndGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5yb3V0ZXNMZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgLSByb3V0ZSAgICAgIDogJHt0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEucm91dGVzTGVuZ3RofWApO1xuICAgICAgICB9XG4gICAgICAgIGxvZ2dlci5pbmZvKCctLS0tLS0tLS0tLS0tLS0tLS0tJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcmVwYXJlRXZlcnl0aGluZygpIHtcbiAgICAgICAgbGV0IGFjdGlvbnMgPSBbXTtcblxuICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZUNvbXBvbmVudHMoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVwYXJlTW9kdWxlcygpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUuZGlyZWN0aXZlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVEaXJlY3RpdmVzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5jb250cm9sbGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVDb250cm9sbGVycygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUuaW5qZWN0YWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVwYXJlSW5qZWN0YWJsZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLmludGVyY2VwdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVJbnRlcmNlcHRvcnMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLmd1YXJkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVHdWFyZHMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUucm91dGVzICYmXG4gICAgICAgICAgICB0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5yb3V0ZXMuY2hpbGRyZW4ubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgIXRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlUm91dGVzR3JhcGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVSb3V0ZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLnBpcGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZVBpcGVzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5jbGFzc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZUNsYXNzZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLmludGVyZmFjZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVwYXJlSW50ZXJmYWNlcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5taXNjZWxsYW5lb3VzLnZhcmlhYmxlcy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgICB0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5taXNjZWxsYW5lb3VzLmZ1bmN0aW9ucy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgICB0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5taXNjZWxsYW5lb3VzLnR5cGVhbGlhc2VzLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLm1pc2NlbGxhbmVvdXMuZW51bWVyYXRpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVNaXNjZWxsYW5lb3VzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVDb3ZlcmFnZSkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVwYXJlQ292ZXJhZ2UoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cblx0XHRcdFx0aWYgKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS51bml0VGVzdENvdmVyYWdlICE9PSAnJyl7XG5cdFx0XHRcdFx0YWN0aW9ucy5wdXNoKCgpPT57XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5wcmVwYXJlVW5pdFRlc3RDb3ZlcmFnZSgpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cbiAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5pbmNsdWRlcyAhPT0gJycpIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZUV4dGVybmFsSW5jbHVkZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvbWlzZVNlcXVlbnRpYWwoYWN0aW9ucylcbiAgICAgICAgICAgIC50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5leHBvcnRGb3JtYXQgIT09IENPTVBPRE9DX0RFRkFVTFRTLmV4cG9ydEZvcm1hdCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBDT01QT0RPQ19ERUZBVUxUUy5leHBvcnRGb3JtYXRzU3VwcG9ydGVkLmluZGV4T2YoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmV4cG9ydEZvcm1hdFxuICAgICAgICAgICAgICAgICAgICAgICAgKSA+IC0xXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEdlbmVyYXRpbmcgZG9jdW1lbnRhdGlvbiBpbiBleHBvcnQgZm9ybWF0ICR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5leHBvcnRGb3JtYXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9YFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwb3J0RW5naW5lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmV4cG9ydCh0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0LCB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uUHJvbWlzZVJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmRDYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEb2N1bWVudGF0aW9uIGdlbmVyYXRlZCBpbiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIGluICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0RWxhcHNlZFRpbWUoKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBzZWNvbmRzJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oYEV4cG9ydGVkIGZvcm1hdCBub3Qgc3VwcG9ydGVkYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NHcmFwaHMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGVycm9yTWVzc2FnZSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEluY2x1ZGVkUGF0aEZvckZpbGUoZmlsZSkge1xuICAgICAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5pbmNsdWRlcywgZmlsZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcmVwYXJlRXh0ZXJuYWxJbmNsdWRlcygpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ0FkZGluZyBleHRlcm5hbCBtYXJrZG93biBmaWxlcycpO1xuICAgICAgICAvLyBTY2FuIGluY2x1ZGUgZm9sZGVyIGZvciBmaWxlcyBkZXRhaWxlZCBpbiBzdW1tYXJ5Lmpzb25cbiAgICAgICAgLy8gRm9yIGVhY2ggZmlsZSwgYWRkIHRvIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5hZGRpdGlvbmFsUGFnZXNcbiAgICAgICAgLy8gRWFjaCBmaWxlIHdpbGwgYmUgY29udmVydGVkIHRvIGh0bWwgcGFnZSwgaW5zaWRlIENPTVBPRE9DX0RFRkFVTFRTLmFkZGl0aW9uYWxFbnRyeVBhdGhcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZmlsZUVuZ2luZS5nZXQodGhpcy5nZXRJbmNsdWRlZFBhdGhGb3JGaWxlKCdzdW1tYXJ5Lmpzb24nKSkudGhlbihcbiAgICAgICAgICAgICAgICBzdW1tYXJ5RGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdBZGRpdGlvbmFsIGRvY3VtZW50YXRpb246IHN1bW1hcnkuanNvbiBmaWxlIGZvdW5kJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkU3VtbWFyeURhdGEgPSBKU09OLnBhcnNlKHN1bW1hcnlEYXRhKTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgdGhhdCA9IHRoaXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IDA7XG5cbiAgICAgICAgICAgICAgICAgICAgdHJhdmVyc2UocGFyc2VkU3VtbWFyeURhdGEpLmZvckVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ub3RSb290ICYmIHR5cGVvZiB0aGlzLm5vZGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJhd1BhdGggPSB0aGlzLnBhdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpbGUgPSB0aGlzLm5vZGVbJ2ZpbGUnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSB0aGlzLm5vZGVbJ3RpdGxlJ107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpbmFsUGF0aCA9IHRoYXQuY29uZmlndXJhdGlvbi5tYWluRGF0YS5pbmNsdWRlc0ZvbGRlcjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmaW5hbERlcHRoID0gcmF3UGF0aC5maWx0ZXIoZWwgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWlzTmFOKHBhcnNlSW50KGVsKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZpbGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB0aXRsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gY2xlYW5OYW1lV2l0aG91dFNwYWNlQW5kVG9Mb3dlckNhc2UodGl0bGUpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsYXN0RWxlbWVudFJvb3RUcmVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxEZXB0aC5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbGVtZW50VHJlZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEVsZW1lbnRSb290VHJlZSA9PT0gbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHBhcnNlZFN1bW1hcnlEYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbGFzdEVsZW1lbnRSb290VHJlZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZWxlbWVudFRyZWUuY2hpbGRyZW4gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRyZWUgPSBlbGVtZW50VHJlZVsnY2hpbGRyZW4nXVtlbF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUcmVlID0gZWxlbWVudFRyZWVbZWxdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxQYXRoICs9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhbk5hbWVXaXRob3V0U3BhY2VBbmRUb0xvd2VyQ2FzZShlbGVtZW50VHJlZS50aXRsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0RWxlbWVudFJvb3RUcmVlID0gZWxlbWVudFRyZWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsUGF0aCA9IGZpbmFsUGF0aC5yZXBsYWNlKCcvJyArIHVybCwgJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWFya2Rvd25GaWxlID0gJG1hcmtkb3duZW5naW5lLmdldFRyYWRpdGlvbmFsTWFya2Rvd25TeW5jKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5nZXRJbmNsdWRlZFBhdGhGb3JGaWxlKGZpbGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmFsRGVwdGgubGVuZ3RoID4gNSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdPbmx5IDUgbGV2ZWxzIG9mIGRlcHRoIGFyZSBzdXBwb3J0ZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuY29uZmlndXJhdGlvbi5hZGRBZGRpdGlvbmFsUGFnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGl0bGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHRpdGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiB1cmwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogJ2FkZGl0aW9uYWwtcGFnZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogZmluYWxQYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxQYWdlOiBtYXJrZG93bkZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IGZpbmFsRGVwdGgubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLklOVEVSTkFMXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgnRXJyb3IgZHVyaW5nIEFkZGl0aW9uYWwgZG9jdW1lbnRhdGlvbiBnZW5lcmF0aW9uJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByZXBhcmVNb2R1bGVzKHNvbWVNb2R1bGVzPyk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcmVwYXJlIG1vZHVsZXMnKTtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBsZXQgX21vZHVsZXMgPSBzb21lTW9kdWxlcyA/IHNvbWVNb2R1bGVzIDogdGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUuZ2V0TW9kdWxlcygpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEubW9kdWxlcyA9IF9tb2R1bGVzLm1hcChuZ01vZHVsZSA9PiB7XG4gICAgICAgICAgICAgICAgbmdNb2R1bGUuY29tcG9kb2NMaW5rcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50czogW10sXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlczogW10sXG4gICAgICAgICAgICAgICAgICAgIGluamVjdGFibGVzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgcGlwZXM6IFtdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBbJ2RlY2xhcmF0aW9ucycsICdib290c3RyYXAnLCAnaW1wb3J0cycsICdleHBvcnRzJywgJ2NvbnRyb2xsZXJzJ10uZm9yRWFjaChtZXRhZGF0YVR5cGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBuZ01vZHVsZVttZXRhZGF0YVR5cGVdID0gbmdNb2R1bGVbbWV0YWRhdGFUeXBlXS5maWx0ZXIobWV0YURhdGFJdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobWV0YURhdGFJdGVtLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkaXJlY3RpdmUnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUuZ2V0RGlyZWN0aXZlcygpLnNvbWUoZGlyZWN0aXZlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZERpcmVjdGl2ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbWV0YURhdGFJdGVtLmlkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRGlyZWN0aXZlID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpcmVjdGl2ZSBhcyBhbnkpLmlkID09PSBtZXRhRGF0YUl0ZW0uaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRGlyZWN0aXZlID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpcmVjdGl2ZSBhcyBhbnkpLm5hbWUgPT09IG1ldGFEYXRhSXRlbS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRGlyZWN0aXZlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIW5nTW9kdWxlLmNvbXBvZG9jTGlua3MuZGlyZWN0aXZlcy5pbmNsdWRlcyhkaXJlY3RpdmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ01vZHVsZS5jb21wb2RvY0xpbmtzLmRpcmVjdGl2ZXMucHVzaChkaXJlY3RpdmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkRGlyZWN0aXZlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NvbXBvbmVudCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5nZXRDb21wb25lbnRzKCkuc29tZShjb21wb25lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXRhRGF0YUl0ZW0uaWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDb21wb25lbnQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuaWQgPT09IG1ldGFEYXRhSXRlbS5pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDb21wb25lbnQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29tcG9uZW50IGFzIGFueSkubmFtZSA9PT0gbWV0YURhdGFJdGVtLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDb21wb25lbnQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbmdNb2R1bGUuY29tcG9kb2NMaW5rcy5jb21wb25lbnRzLmluY2x1ZGVzKGNvbXBvbmVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nTW9kdWxlLmNvbXBvZG9jTGlua3MuY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY29udHJvbGxlcic6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5nZXRDb250cm9sbGVycygpLnNvbWUoY29udHJvbGxlciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRDb250cm9sbGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXRhRGF0YUl0ZW0uaWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDb250cm9sbGVyID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnRyb2xsZXIgYXMgYW55KS5pZCA9PT0gbWV0YURhdGFJdGVtLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZENvbnRyb2xsZXIgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29udHJvbGxlciBhcyBhbnkpLm5hbWUgPT09IG1ldGFEYXRhSXRlbS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQ29udHJvbGxlciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFuZ01vZHVsZS5jb21wb2RvY0xpbmtzLmNvbnRyb2xsZXJzLmluY2x1ZGVzKGNvbnRyb2xsZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ01vZHVsZS5jb21wb2RvY0xpbmtzLmNvbnRyb2xsZXJzLnB1c2goY29udHJvbGxlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRDb250cm9sbGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ21vZHVsZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlcGVuZGVuY2llc0VuZ2luZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1vZHVsZXMoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNvbWUobW9kdWxlID0+IChtb2R1bGUgYXMgYW55KS5uYW1lID09PSBtZXRhRGF0YUl0ZW0ubmFtZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdwaXBlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLmdldFBpcGVzKCkuc29tZShwaXBlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZFBpcGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1ldGFEYXRhSXRlbS5pZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFBpcGUgPSAocGlwZSBhcyBhbnkpLmlkID09PSBtZXRhRGF0YUl0ZW0uaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUGlwZSA9IChwaXBlIGFzIGFueSkubmFtZSA9PT0gbWV0YURhdGFJdGVtLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRQaXBlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIW5nTW9kdWxlLmNvbXBvZG9jTGlua3MucGlwZXMuaW5jbHVkZXMocGlwZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nTW9kdWxlLmNvbXBvZG9jTGlua3MucGlwZXMucHVzaChwaXBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFBpcGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIG5nTW9kdWxlLnByb3ZpZGVycyA9IG5nTW9kdWxlLnByb3ZpZGVycy5maWx0ZXIocHJvdmlkZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUuZ2V0SW5qZWN0YWJsZXMoKS5zb21lKGluamVjdGFibGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZEluamVjdGFibGUgPSAoaW5qZWN0YWJsZSBhcyBhbnkpLm5hbWUgPT09IHByb3ZpZGVyLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEluamVjdGFibGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIW5nTW9kdWxlLmNvbXBvZG9jTGlua3MuaW5qZWN0YWJsZXMuaW5jbHVkZXMoaW5qZWN0YWJsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdNb2R1bGUuY29tcG9kb2NMaW5rcy5pbmplY3RhYmxlcy5wdXNoKGluamVjdGFibGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRJbmplY3RhYmxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEludGVyY2VwdG9ycygpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNvbWUoaW50ZXJjZXB0b3IgPT4gKGludGVyY2VwdG9yIGFzIGFueSkubmFtZSA9PT0gcHJvdmlkZXIubmFtZSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyBUcnkgZml4aW5nIHR5cGUgdW5kZWZpbmVkIGZvciBlYWNoIHByb3ZpZGVyc1xuICAgICAgICAgICAgICAgIF8uZm9yRWFjaChuZ01vZHVsZS5wcm92aWRlcnMsIHByb3ZpZGVyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXNFbmdpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW5qZWN0YWJsZXMoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKGluamVjdGFibGUgPT4gKGluamVjdGFibGUgYXMgYW55KS5uYW1lID09PSBwcm92aWRlci5uYW1lKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyLnR5cGUgPSAnaW5qZWN0YWJsZSc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXNFbmdpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW50ZXJjZXB0b3JzKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmluZChpbnRlcmNlcHRvciA9PiAoaW50ZXJjZXB0b3IgYXMgYW55KS5uYW1lID09PSBwcm92aWRlci5uYW1lKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyLnR5cGUgPSAnaW50ZXJjZXB0b3InO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gT3JkZXIgdGhpbmdzXG4gICAgICAgICAgICAgICAgbmdNb2R1bGUuY29tcG9kb2NMaW5rcy5jb21wb25lbnRzID0gXy5zb3J0QnkobmdNb2R1bGUuY29tcG9kb2NMaW5rcy5jb21wb25lbnRzLCBbXG4gICAgICAgICAgICAgICAgICAgICduYW1lJ1xuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIG5nTW9kdWxlLmNvbXBvZG9jTGlua3MuY29udHJvbGxlcnMgPSBfLnNvcnRCeShuZ01vZHVsZS5jb21wb2RvY0xpbmtzLmNvbnRyb2xsZXJzLCBbXG4gICAgICAgICAgICAgICAgICAgICduYW1lJ1xuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIG5nTW9kdWxlLmNvbXBvZG9jTGlua3MuZGlyZWN0aXZlcyA9IF8uc29ydEJ5KG5nTW9kdWxlLmNvbXBvZG9jTGlua3MuZGlyZWN0aXZlcywgW1xuICAgICAgICAgICAgICAgICAgICAnbmFtZSdcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICBuZ01vZHVsZS5jb21wb2RvY0xpbmtzLmluamVjdGFibGVzID0gXy5zb3J0QnkobmdNb2R1bGUuY29tcG9kb2NMaW5rcy5pbmplY3RhYmxlcywgW1xuICAgICAgICAgICAgICAgICAgICAnbmFtZSdcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICBuZ01vZHVsZS5jb21wb2RvY0xpbmtzLnBpcGVzID0gXy5zb3J0QnkobmdNb2R1bGUuY29tcG9kb2NMaW5rcy5waXBlcywgWyduYW1lJ10pO1xuXG4gICAgICAgICAgICAgICAgbmdNb2R1bGUuZGVjbGFyYXRpb25zID0gXy5zb3J0QnkobmdNb2R1bGUuZGVjbGFyYXRpb25zLCBbJ25hbWUnXSk7XG4gICAgICAgICAgICAgICAgbmdNb2R1bGUuZW50cnlDb21wb25lbnRzID0gXy5zb3J0QnkobmdNb2R1bGUuZW50cnlDb21wb25lbnRzLCBbJ25hbWUnXSk7XG4gICAgICAgICAgICAgICAgbmdNb2R1bGUucHJvdmlkZXJzID0gXy5zb3J0QnkobmdNb2R1bGUucHJvdmlkZXJzLCBbJ25hbWUnXSk7XG4gICAgICAgICAgICAgICAgbmdNb2R1bGUuaW1wb3J0cyA9IF8uc29ydEJ5KG5nTW9kdWxlLmltcG9ydHMsIFsnbmFtZSddKTtcbiAgICAgICAgICAgICAgICBuZ01vZHVsZS5leHBvcnRzID0gXy5zb3J0QnkobmdNb2R1bGUuZXhwb3J0cywgWyduYW1lJ10pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5nTW9kdWxlO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5hZGRQYWdlKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnbW9kdWxlcycsXG4gICAgICAgICAgICAgICAgaWQ6ICdtb2R1bGVzJyxcbiAgICAgICAgICAgICAgICBjb250ZXh0OiAnbW9kdWxlcycsXG4gICAgICAgICAgICAgICAgZGVwdGg6IDAsXG4gICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuUk9PVFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGxldCBsZW4gPSB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEubW9kdWxlcy5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgbG9vcCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaSA8IGxlbikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAkbWFya2Rvd25lbmdpbmUuaGFzTmVpZ2hib3VyUmVhZG1lRmlsZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEubW9kdWxlc1tpXS5maWxlXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCAke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEubW9kdWxlc1tpXS5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBoYXMgYSBSRUFETUUgZmlsZSwgaW5jbHVkZSBpdGBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVhZG1lID0gJG1hcmtkb3duZW5naW5lLnJlYWROZWlnaGJvdXJSZWFkbWVGaWxlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5tb2R1bGVzW2ldLmZpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEubW9kdWxlc1tpXS5yZWFkbWUgPSBtYXJrZWQocmVhZG1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uYWRkUGFnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAnbW9kdWxlcycsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEubW9kdWxlc1tpXS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5tb2R1bGVzW2ldLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2VGFiczogdGhpcy5nZXROYXZUYWJzKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5tb2R1bGVzW2ldKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdtb2R1bGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEubW9kdWxlc1tpXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuSU5URVJOQUxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJlcGFyZVBpcGVzID0gKHNvbWVQaXBlcz8pID0+IHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1ByZXBhcmUgcGlwZXMnKTtcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLnBpcGVzID0gc29tZVBpcGVzXG4gICAgICAgICAgICA/IHNvbWVQaXBlc1xuICAgICAgICAgICAgOiB0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5nZXRQaXBlcygpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBsZXQgbGVuID0gdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLnBpcGVzLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCBsb29wID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpIDwgbGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwaXBlID0gdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLnBpcGVzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoJG1hcmtkb3duZW5naW5lLmhhc05laWdoYm91clJlYWRtZUZpbGUocGlwZS5maWxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYCAke3BpcGUubmFtZX0gaGFzIGEgUkVBRE1FIGZpbGUsIGluY2x1ZGUgaXRgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWFkbWUgPSAkbWFya2Rvd25lbmdpbmUucmVhZE5laWdoYm91clJlYWRtZUZpbGUocGlwZS5maWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBpcGUucmVhZG1lID0gbWFya2VkKHJlYWRtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAncGlwZXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcGlwZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHBpcGUuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZUYWJzOiB0aGlzLmdldE5hdlRhYnMocGlwZSksXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAncGlwZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBwaXBlOiBwaXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5JTlRFUk5BTFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAocGlwZS5pc0R1cGxpY2F0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZS5uYW1lICs9ICctJyArIHBpcGUuZHVwbGljYXRlSWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmFkZFBhZ2UocGFnZSk7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgcHVibGljIHByZXBhcmVDbGFzc2VzID0gKHNvbWVDbGFzc2VzPykgPT4ge1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJlcGFyZSBjbGFzc2VzJyk7XG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jbGFzc2VzID0gc29tZUNsYXNzZXNcbiAgICAgICAgICAgID8gc29tZUNsYXNzZXNcbiAgICAgICAgICAgIDogdGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUuZ2V0Q2xhc3NlcygpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBsZXQgbGVuID0gdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmNsYXNzZXMubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IGxvb3AgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPCBsZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNsYXNzZSA9IHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jbGFzc2VzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoJG1hcmtkb3duZW5naW5lLmhhc05laWdoYm91clJlYWRtZUZpbGUoY2xhc3NlLmZpbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgICR7Y2xhc3NlLm5hbWV9IGhhcyBhIFJFQURNRSBmaWxlLCBpbmNsdWRlIGl0YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVhZG1lID0gJG1hcmtkb3duZW5naW5lLnJlYWROZWlnaGJvdXJSZWFkbWVGaWxlKGNsYXNzZS5maWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZS5yZWFkbWUgPSBtYXJrZWQocmVhZG1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgcGFnZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICdjbGFzc2VzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGNsYXNzZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGNsYXNzZS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdlRhYnM6IHRoaXMuZ2V0TmF2VGFicyhjbGFzc2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogJ2NsYXNzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzOiBjbGFzc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLklOVEVSTkFMXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGlmIChjbGFzc2UuaXNEdXBsaWNhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UubmFtZSArPSAnLScgKyBjbGFzc2UuZHVwbGljYXRlSWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmFkZFBhZ2UocGFnZSk7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgcHVibGljIHByZXBhcmVJbnRlcmZhY2VzKHNvbWVJbnRlcmZhY2VzPykge1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJlcGFyZSBpbnRlcmZhY2VzJyk7XG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5pbnRlcmZhY2VzID0gc29tZUludGVyZmFjZXNcbiAgICAgICAgICAgID8gc29tZUludGVyZmFjZXNcbiAgICAgICAgICAgIDogdGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUuZ2V0SW50ZXJmYWNlcygpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBsZXQgbGVuID0gdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmludGVyZmFjZXMubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IGxvb3AgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPCBsZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGludGVyZiA9IHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5pbnRlcmZhY2VzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoJG1hcmtkb3duZW5naW5lLmhhc05laWdoYm91clJlYWRtZUZpbGUoaW50ZXJmLmZpbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgICR7aW50ZXJmLm5hbWV9IGhhcyBhIFJFQURNRSBmaWxlLCBpbmNsdWRlIGl0YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVhZG1lID0gJG1hcmtkb3duZW5naW5lLnJlYWROZWlnaGJvdXJSZWFkbWVGaWxlKGludGVyZi5maWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZi5yZWFkbWUgPSBtYXJrZWQocmVhZG1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgcGFnZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICdpbnRlcmZhY2VzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGludGVyZi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGludGVyZi5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdlRhYnM6IHRoaXMuZ2V0TmF2VGFicyhpbnRlcmYpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogJ2ludGVyZmFjZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2U6IGludGVyZixcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuSU5URVJOQUxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGludGVyZi5pc0R1cGxpY2F0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZS5uYW1lICs9ICctJyArIGludGVyZi5kdXBsaWNhdGVJZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uYWRkUGFnZShwYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICBsb29wKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsb29wKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBwcmVwYXJlTWlzY2VsbGFuZW91cyhzb21lTWlzYz8pIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1ByZXBhcmUgbWlzY2VsbGFuZW91cycpO1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEubWlzY2VsbGFuZW91cyA9IHNvbWVNaXNjXG4gICAgICAgICAgICA/IHNvbWVNaXNjXG4gICAgICAgICAgICA6IHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLmdldE1pc2NlbGxhbmVvdXMoKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5taXNjZWxsYW5lb3VzLmZ1bmN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmFkZFBhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICBwYXRoOiAnbWlzY2VsbGFuZW91cycsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdmdW5jdGlvbnMnLFxuICAgICAgICAgICAgICAgICAgICBpZDogJ21pc2NlbGxhbmVvdXMtZnVuY3Rpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogJ21pc2NlbGxhbmVvdXMtZnVuY3Rpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDEsXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLklOVEVSTkFMXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLm1pc2NlbGxhbmVvdXMudmFyaWFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uYWRkUGFnZSh7XG4gICAgICAgICAgICAgICAgICAgIHBhdGg6ICdtaXNjZWxsYW5lb3VzJyxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3ZhcmlhYmxlcycsXG4gICAgICAgICAgICAgICAgICAgIGlkOiAnbWlzY2VsbGFuZW91cy12YXJpYWJsZXMnLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAnbWlzY2VsbGFuZW91cy12YXJpYWJsZXMnLFxuICAgICAgICAgICAgICAgICAgICBkZXB0aDogMSxcbiAgICAgICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuSU5URVJOQUxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEubWlzY2VsbGFuZW91cy50eXBlYWxpYXNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmFkZFBhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICBwYXRoOiAnbWlzY2VsbGFuZW91cycsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICd0eXBlYWxpYXNlcycsXG4gICAgICAgICAgICAgICAgICAgIGlkOiAnbWlzY2VsbGFuZW91cy10eXBlYWxpYXNlcycsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdtaXNjZWxsYW5lb3VzLXR5cGVhbGlhc2VzJyxcbiAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDEsXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLklOVEVSTkFMXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLm1pc2NlbGxhbmVvdXMuZW51bWVyYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uYWRkUGFnZSh7XG4gICAgICAgICAgICAgICAgICAgIHBhdGg6ICdtaXNjZWxsYW5lb3VzJyxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VudW1lcmF0aW9ucycsXG4gICAgICAgICAgICAgICAgICAgIGlkOiAnbWlzY2VsbGFuZW91cy1lbnVtZXJhdGlvbnMnLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAnbWlzY2VsbGFuZW91cy1lbnVtZXJhdGlvbnMnLFxuICAgICAgICAgICAgICAgICAgICBkZXB0aDogMSxcbiAgICAgICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuSU5URVJOQUxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZVRlbXBsYXRldXJsKGNvbXBvbmVudCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGxldCBkaXJuYW1lID0gcGF0aC5kaXJuYW1lKGNvbXBvbmVudC5maWxlKTtcbiAgICAgICAgbGV0IHRlbXBsYXRlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJuYW1lICsgcGF0aC5zZXAgKyBjb21wb25lbnQudGVtcGxhdGVVcmwpO1xuXG4gICAgICAgIGlmICghdGhpcy5maWxlRW5naW5lLmV4aXN0c1N5bmModGVtcGxhdGVQYXRoKSkge1xuICAgICAgICAgICAgbGV0IGVyciA9IGBDYW5ub3QgcmVhZCB0ZW1wbGF0ZSBmb3IgJHtjb21wb25lbnQubmFtZX1gO1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGVycik7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge30pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsZUVuZ2luZS5nZXQodGVtcGxhdGVQYXRoKS50aGVuKFxuICAgICAgICAgICAgZGF0YSA9PiAoY29tcG9uZW50LnRlbXBsYXRlRGF0YSA9IGRhdGEpLFxuICAgICAgICAgICAgZXJyID0+IHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TmF2VGFicyhkZXBlbmRlbmN5KTogQXJyYXk8YW55PiB7XG4gICAgICAgIGxldCBuYXZUYWJDb25maWcgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEubmF2VGFiQ29uZmlnO1xuICAgICAgICBuYXZUYWJDb25maWcgPSBuYXZUYWJDb25maWcubGVuZ3RoID09PSAwID8gXy5jbG9uZURlZXAoQ09NUE9ET0NfQ09OU1RBTlRTLm5hdlRhYkRlZmluaXRpb25zKSA6IG5hdlRhYkNvbmZpZztcbiAgICAgICAgbGV0IG1hdGNoRGVwVHlwZSA9IChkZXBUeXBlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBkZXBUeXBlID09PSAnYWxsJyB8fCBkZXBUeXBlID09PSBkZXBlbmRlbmN5LnR5cGU7XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IG5hdlRhYnMgPSBbXTtcbiAgICAgICAgXy5mb3JFYWNoKG5hdlRhYkNvbmZpZywgKGN1c3RvbVRhYikgPT4ge1xuICAgICAgICAgICAgbGV0IG5hdlRhYiA9IF8uZmluZChDT01QT0RPQ19DT05TVEFOVFMubmF2VGFiRGVmaW5pdGlvbnMsIHsgJ2lkJzogY3VzdG9tVGFiLmlkIH0pO1xuICAgICAgICAgICAgaWYgKCFuYXZUYWIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdGFiIElEICcke2N1c3RvbVRhYi5pZH0nIHNwZWNpZmllZCBpbiB0YWIgY29uZmlndXJhdGlvbmApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBuYXZUYWIubGFiZWwgPSBjdXN0b21UYWIubGFiZWw7XG5cbiAgICAgICAgICAgIC8vIGlzIHRhYiBhcHBsaWNhYmxlIHRvIHRhcmdldCBkZXBlbmRlbmN5P1xuICAgICAgICAgICAgaWYgKC0xID09PSBfLmZpbmRJbmRleChuYXZUYWIuZGVwVHlwZXMsIG1hdGNoRGVwVHlwZSkpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgICAgIC8vIGdsb2JhbCBjb25maWdcbiAgICAgICAgICAgIGlmIChjdXN0b21UYWIuaWQgPT09ICd0cmVlJyAmJiB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZURvbVRyZWUpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgICBpZiAoY3VzdG9tVGFiLmlkID09PSAnc291cmNlJyAmJiB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVNvdXJjZUNvZGUpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgICBpZiAoY3VzdG9tVGFiLmlkID09PSAndGVtcGxhdGVEYXRhJyAmJiB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVRlbXBsYXRlVGFiKSB7IHJldHVybjsgfVxuXG4gICAgICAgICAgICAvLyBwZXIgZGVwZW5kZW5jeSBjb25maWdcbiAgICAgICAgICAgIGlmIChjdXN0b21UYWIuaWQgPT09ICdyZWFkbWUnICYmICFkZXBlbmRlbmN5LnJlYWRtZSkgeyByZXR1cm47IH1cbiAgICAgICAgICAgIGlmIChjdXN0b21UYWIuaWQgPT09ICdleGFtcGxlJyAmJiAhZGVwZW5kZW5jeS5leGFtcGxlVXJscykgeyByZXR1cm47IH1cbiAgICAgICAgICAgIGlmIChjdXN0b21UYWIuaWQgPT09ICd0ZW1wbGF0ZURhdGEnICYmICghZGVwZW5kZW5jeS50ZW1wbGF0ZVVybCB8fCBkZXBlbmRlbmN5LnRlbXBsYXRlVXJsLmxlbmd0aCA9PT0gMCkpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgICAgIG5hdlRhYnMucHVzaChuYXZUYWIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAobmF2VGFicy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gdmFsaWQgbmF2aWdhdGlvbiB0YWJzIGhhdmUgYmVlbiBkZWZpbmVkIGZvciBkZXBlbmRlbmN5IHR5cGUgJyR7ZGVwZW5kZW5jeS50eXBlfScuIFNwZWNpZnkgXFxcbmF0IGxlYXN0IG9uZSBjb25maWcgZm9yIHRoZSAnaW5mbycgb3IgJ3NvdXJjZScgdGFiIGluIC0tbmF2VGFiQ29uZmlnLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5hdlRhYnM7XG4gICAgfVxuXG4gICAgcHVibGljIHByZXBhcmVDb250cm9sbGVycyhzb21lQ29udHJvbGxlcnM/KSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcmVwYXJlIGNvbnRyb2xsZXJzJyk7XG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb250cm9sbGVycyA9IHNvbWVDb250cm9sbGVyc1xuICAgICAgICAgICAgPyBzb21lQ29udHJvbGxlcnNcbiAgICAgICAgICAgIDogdGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUuZ2V0Q29udHJvbGxlcnMoKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgbGV0IGxlbiA9IHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb250cm9sbGVycy5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgbG9vcCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaSA8IGxlbikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29udHJvbGxlciA9IHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb250cm9sbGVyc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAnY29udHJvbGxlcnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogY29udHJvbGxlci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGNvbnRyb2xsZXIuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZUYWJzOiB0aGlzLmdldE5hdlRhYnMoY29udHJvbGxlciksXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAnY29udHJvbGxlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyOiBjb250cm9sbGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5JTlRFUk5BTFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29udHJvbGxlci5pc0R1cGxpY2F0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZS5uYW1lICs9ICctJyArIGNvbnRyb2xsZXIuZHVwbGljYXRlSWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmFkZFBhZ2UocGFnZSk7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJlcGFyZUNvbXBvbmVudHMoc29tZUNvbXBvbmVudHM/KSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcmVwYXJlIGNvbXBvbmVudHMnKTtcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmNvbXBvbmVudHMgPSBzb21lQ29tcG9uZW50c1xuICAgICAgICAgICAgPyBzb21lQ29tcG9uZW50c1xuICAgICAgICAgICAgOiB0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5nZXRDb21wb25lbnRzKCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChtYWluUmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBsZXQgbGVuID0gdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmNvbXBvbmVudHMubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IGxvb3AgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPD0gbGVuIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29tcG9uZW50ID0gdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmNvbXBvbmVudHNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmICgkbWFya2Rvd25lbmdpbmUuaGFzTmVpZ2hib3VyUmVhZG1lRmlsZShjb21wb25lbnQuZmlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAgJHtjb21wb25lbnQubmFtZX0gaGFzIGEgUkVBRE1FIGZpbGUsIGluY2x1ZGUgaXRgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWFkbWVGaWxlID0gJG1hcmtkb3duZW5naW5lLnJlYWROZWlnaGJvdXJSZWFkbWVGaWxlKGNvbXBvbmVudC5maWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWFkbWUgPSBtYXJrZWQocmVhZG1lRmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFnZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAnY29tcG9uZW50cycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogY29tcG9uZW50Lm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGNvbXBvbmVudC5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZUYWJzOiB0aGlzLmdldE5hdlRhYnMoY29tcG9uZW50KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAnY29tcG9uZW50JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5JTlRFUk5BTFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQuaXNEdXBsaWNhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlLm5hbWUgKz0gJy0nICsgY29tcG9uZW50LmR1cGxpY2F0ZUlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmFkZFBhZ2UocGFnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LnRlbXBsYXRlVXJsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgICR7Y29tcG9uZW50Lm5hbWV9IGhhcyBhIHRlbXBsYXRlVXJsLCBpbmNsdWRlIGl0YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVUZW1wbGF0ZXVybChjb21wb25lbnQpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogJ2NvbXBvbmVudHMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGNvbXBvbmVudC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBjb21wb25lbnQuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2VGFiczogdGhpcy5nZXROYXZUYWJzKGNvbXBvbmVudCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogJ2NvbXBvbmVudCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiBjb21wb25lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuSU5URVJOQUxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LmlzRHVwbGljYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZS5uYW1lICs9ICctJyArIGNvbXBvbmVudC5kdXBsaWNhdGVJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5hZGRQYWdlKHBhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC50ZW1wbGF0ZVVybC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYCAke2NvbXBvbmVudC5uYW1lfSBoYXMgYSB0ZW1wbGF0ZVVybCwgaW5jbHVkZSBpdGApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVGVtcGxhdGV1cmwoY29tcG9uZW50KS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG1haW5SZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByZXBhcmVEaXJlY3RpdmVzKHNvbWVEaXJlY3RpdmVzPykge1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJlcGFyZSBkaXJlY3RpdmVzJyk7XG5cbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpcmVjdGl2ZXMgPSBzb21lRGlyZWN0aXZlc1xuICAgICAgICAgICAgPyBzb21lRGlyZWN0aXZlc1xuICAgICAgICAgICAgOiB0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5nZXREaXJlY3RpdmVzKCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGxldCBsZW4gPSB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlyZWN0aXZlcy5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgbG9vcCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaSA8IGxlbikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGlyZWN0aXZlID0gdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpcmVjdGl2ZXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmICgkbWFya2Rvd25lbmdpbmUuaGFzTmVpZ2hib3VyUmVhZG1lRmlsZShkaXJlY3RpdmUuZmlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAgJHtkaXJlY3RpdmUubmFtZX0gaGFzIGEgUkVBRE1FIGZpbGUsIGluY2x1ZGUgaXRgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWFkbWUgPSAkbWFya2Rvd25lbmdpbmUucmVhZE5laWdoYm91clJlYWRtZUZpbGUoZGlyZWN0aXZlLmZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlLnJlYWRtZSA9IG1hcmtlZChyZWFkbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYWdlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogJ2RpcmVjdGl2ZXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZGlyZWN0aXZlLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogZGlyZWN0aXZlLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2VGFiczogdGhpcy5nZXROYXZUYWJzKGRpcmVjdGl2ZSksXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAnZGlyZWN0aXZlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZTogZGlyZWN0aXZlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5JTlRFUk5BTFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aXZlLmlzRHVwbGljYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlLm5hbWUgKz0gJy0nICsgZGlyZWN0aXZlLmR1cGxpY2F0ZUlkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5hZGRQYWdlKHBhZ2UpO1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByZXBhcmVJbmplY3RhYmxlcyhzb21lSW5qZWN0YWJsZXM/KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcmVwYXJlIGluamVjdGFibGVzJyk7XG5cbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmluamVjdGFibGVzID0gc29tZUluamVjdGFibGVzXG4gICAgICAgICAgICA/IHNvbWVJbmplY3RhYmxlc1xuICAgICAgICAgICAgOiB0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5nZXRJbmplY3RhYmxlcygpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBsZXQgbGVuID0gdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmluamVjdGFibGVzLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCBsb29wID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpIDwgbGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmplYyA9IHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5pbmplY3RhYmxlc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCRtYXJrZG93bmVuZ2luZS5oYXNOZWlnaGJvdXJSZWFkbWVGaWxlKGluamVjLmZpbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgICR7aW5qZWMubmFtZX0gaGFzIGEgUkVBRE1FIGZpbGUsIGluY2x1ZGUgaXRgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWFkbWUgPSAkbWFya2Rvd25lbmdpbmUucmVhZE5laWdoYm91clJlYWRtZUZpbGUoaW5qZWMuZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmplYy5yZWFkbWUgPSBtYXJrZWQocmVhZG1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgcGFnZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICdpbmplY3RhYmxlcycsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBpbmplYy5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGluamVjLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2VGFiczogdGhpcy5nZXROYXZUYWJzKGluamVjKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdpbmplY3RhYmxlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGFibGU6IGluamVjLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5JTlRFUk5BTFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5qZWMuaXNEdXBsaWNhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UubmFtZSArPSAnLScgKyBpbmplYy5kdXBsaWNhdGVJZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uYWRkUGFnZShwYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICBsb29wKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsb29wKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBwcmVwYXJlSW50ZXJjZXB0b3JzKHNvbWVJbnRlcmNlcHRvcnM/KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcmVwYXJlIGludGVyY2VwdG9ycycpO1xuXG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5pbnRlcmNlcHRvcnMgPSBzb21lSW50ZXJjZXB0b3JzXG4gICAgICAgICAgICA/IHNvbWVJbnRlcmNlcHRvcnNcbiAgICAgICAgICAgIDogdGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUuZ2V0SW50ZXJjZXB0b3JzKCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGxldCBsZW4gPSB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaW50ZXJjZXB0b3JzLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCBsb29wID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpIDwgbGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbnRlcmNlcHRvciA9IHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5pbnRlcmNlcHRvcnNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmICgkbWFya2Rvd25lbmdpbmUuaGFzTmVpZ2hib3VyUmVhZG1lRmlsZShpbnRlcmNlcHRvci5maWxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYCAke2ludGVyY2VwdG9yLm5hbWV9IGhhcyBhIFJFQURNRSBmaWxlLCBpbmNsdWRlIGl0YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVhZG1lID0gJG1hcmtkb3duZW5naW5lLnJlYWROZWlnaGJvdXJSZWFkbWVGaWxlKGludGVyY2VwdG9yLmZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJjZXB0b3IucmVhZG1lID0gbWFya2VkKHJlYWRtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAnaW50ZXJjZXB0b3JzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGludGVyY2VwdG9yLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogaW50ZXJjZXB0b3IuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZUYWJzOiB0aGlzLmdldE5hdlRhYnMoaW50ZXJjZXB0b3IpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogJ2ludGVyY2VwdG9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGFibGU6IGludGVyY2VwdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5JTlRFUk5BTFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJjZXB0b3IuaXNEdXBsaWNhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UubmFtZSArPSAnLScgKyBpbnRlcmNlcHRvci5kdXBsaWNhdGVJZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uYWRkUGFnZShwYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICBsb29wKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsb29wKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBwcmVwYXJlR3VhcmRzKHNvbWVHdWFyZHM/KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcmVwYXJlIGd1YXJkcycpO1xuXG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5ndWFyZHMgPSBzb21lR3VhcmRzXG4gICAgICAgICAgICA/IHNvbWVHdWFyZHNcbiAgICAgICAgICAgIDogdGhpcy5kZXBlbmRlbmNpZXNFbmdpbmUuZ2V0R3VhcmRzKCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGxldCBsZW4gPSB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZ3VhcmRzLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCBsb29wID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpIDwgbGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBndWFyZCA9IHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5ndWFyZHNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmICgkbWFya2Rvd25lbmdpbmUuaGFzTmVpZ2hib3VyUmVhZG1lRmlsZShndWFyZC5maWxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYCAke2d1YXJkLm5hbWV9IGhhcyBhIFJFQURNRSBmaWxlLCBpbmNsdWRlIGl0YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVhZG1lID0gJG1hcmtkb3duZW5naW5lLnJlYWROZWlnaGJvdXJSZWFkbWVGaWxlKGd1YXJkLmZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3VhcmQucmVhZG1lID0gbWFya2VkKHJlYWRtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAnZ3VhcmRzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGd1YXJkLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogZ3VhcmQuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZUYWJzOiB0aGlzLmdldE5hdlRhYnMoZ3VhcmQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogJ2d1YXJkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGFibGU6IGd1YXJkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5JTlRFUk5BTFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ3VhcmQuaXNEdXBsaWNhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UubmFtZSArPSAnLScgKyBndWFyZC5kdXBsaWNhdGVJZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uYWRkUGFnZShwYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICBsb29wKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsb29wKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBwcmVwYXJlUm91dGVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJvY2VzcyByb3V0ZXMnKTtcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLnJvdXRlcyA9IHRoaXMuZGVwZW5kZW5jaWVzRW5naW5lLmdldFJvdXRlcygpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uYWRkUGFnZSh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ3JvdXRlcycsXG4gICAgICAgICAgICAgICAgaWQ6ICdyb3V0ZXMnLFxuICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdyb3V0ZXMnLFxuICAgICAgICAgICAgICAgIGRlcHRoOiAwLFxuICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLlJPT1RcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmV4cG9ydEZvcm1hdCA9PT0gQ09NUE9ET0NfREVGQVVMVFMuZXhwb3J0Rm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXJQYXJzZXJcbiAgICAgICAgICAgICAgICAgICAgLmdlbmVyYXRlUm91dGVzSW5kZXgoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLnJvdXRlc1xuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCcgUm91dGVzIGluZGV4IGdlbmVyYXRlZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByZXBhcmVDb3ZlcmFnZSgpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1Byb2Nlc3MgZG9jdW1lbnRhdGlvbiBjb3ZlcmFnZSByZXBvcnQnKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAqIGxvb3Agd2l0aCBjb21wb25lbnRzLCBkaXJlY3RpdmVzLCBjbGFzc2VzLCBpbmplY3RhYmxlcywgaW50ZXJmYWNlcywgcGlwZXMsIG1pc2MgZnVuY3Rpb25zIHZhcmlhYmxlc1xuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBsZXQgZmlsZXMgPSBbXTtcbiAgICAgICAgICAgIGxldCB0b3RhbFByb2plY3RTdGF0ZW1lbnREb2N1bWVudGVkID0gMDtcbiAgICAgICAgICAgIGxldCBnZXRTdGF0dXMgPSBmdW5jdGlvbihwZXJjZW50KSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXR1cztcbiAgICAgICAgICAgICAgICBpZiAocGVyY2VudCA8PSAyNSkge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAnbG93JztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBlcmNlbnQgPiAyNSAmJiBwZXJjZW50IDw9IDUwKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9ICdtZWRpdW0nO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGVyY2VudCA+IDUwICYmIHBlcmNlbnQgPD0gNzUpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gJ2dvb2QnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9ICd2ZXJ5LWdvb2QnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCBwcm9jZXNzQ29tcG9uZW50c0FuZERpcmVjdGl2ZXMgPSBsaXN0ID0+IHtcbiAgICAgICAgICAgICAgICBfLmZvckVhY2gobGlzdCwgKGVsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSAoT2JqZWN0IGFzIGFueSkuYXNzaWduKHt9LCBlbCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5wcm9wZXJ0aWVzQ2xhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQucHJvcGVydGllc0NsYXNzID0gW107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50Lm1ldGhvZHNDbGFzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5tZXRob2RzQ2xhc3MgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnQuaG9zdEJpbmRpbmdzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lmhvc3RCaW5kaW5ncyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5ob3N0TGlzdGVuZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lmhvc3RMaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnQuaW5wdXRzQ2xhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuaW5wdXRzQ2xhc3MgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnQub3V0cHV0c0NsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lm91dHB1dHNDbGFzcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBjbDogYW55ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGg6IGVsZW1lbnQuZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGVsZW1lbnQudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmt0eXBlOiBlbGVtZW50LnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBlbGVtZW50Lm5hbWVcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0b3RhbFN0YXRlbWVudHMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5wcm9wZXJ0aWVzQ2xhc3MubGVuZ3RoICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQubWV0aG9kc0NsYXNzLmxlbmd0aCArXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmlucHV0c0NsYXNzLmxlbmd0aCArXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lmhvc3RCaW5kaW5ncy5sZW5ndGggK1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5ob3N0TGlzdGVuZXJzLmxlbmd0aCArXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lm91dHB1dHNDbGFzcy5sZW5ndGggK1xuICAgICAgICAgICAgICAgICAgICAgICAgMTsgLy8gKzEgZm9yIGVsZW1lbnQgZGVjb3JhdG9yIGNvbW1lbnRcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5jb25zdHJ1Y3Rvck9iaikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnRzICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5jb25zdHJ1Y3Rvck9iaiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY29uc3RydWN0b3JPYmouZGVzY3JpcHRpb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmNvbnN0cnVjdG9yT2JqLmRlc2NyaXB0aW9uICE9PSAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZGVzY3JpcHRpb24gJiYgZWxlbWVudC5kZXNjcmlwdGlvbiAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCArPSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKGVsZW1lbnQucHJvcGVydGllc0NsYXNzLCAocHJvcGVydHk6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5Lm1vZGlmaWVyS2luZCA9PT0gU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvZXNuJ3QgaGFuZGxlIHByaXZhdGUgZm9yIGNvdmVyYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnRzIC09IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkuZGVzY3JpcHRpb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5kZXNjcmlwdGlvbiAhPT0gJycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5tb2RpZmllcktpbmQgIT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmRcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKGVsZW1lbnQubWV0aG9kc0NsYXNzLCAobWV0aG9kOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2QubW9kaWZpZXJLaW5kID09PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9lc24ndCBoYW5kbGUgcHJpdmF0ZSBmb3IgY292ZXJhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudHMgLT0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZGVzY3JpcHRpb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZGVzY3JpcHRpb24gIT09ICcnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLm1vZGlmaWVyS2luZCAhPT0gU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2goZWxlbWVudC5ob3N0QmluZGluZ3MsIChwcm9wZXJ0eTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkubW9kaWZpZXJLaW5kID09PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9lc24ndCBoYW5kbGUgcHJpdmF0ZSBmb3IgY292ZXJhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudHMgLT0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5kZXNjcmlwdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LmRlc2NyaXB0aW9uICE9PSAnJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5Lm1vZGlmaWVyS2luZCAhPT0gU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2goZWxlbWVudC5ob3N0TGlzdGVuZXJzLCAobWV0aG9kOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2QubW9kaWZpZXJLaW5kID09PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9lc24ndCBoYW5kbGUgcHJpdmF0ZSBmb3IgY292ZXJhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudHMgLT0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZGVzY3JpcHRpb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZGVzY3JpcHRpb24gIT09ICcnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLm1vZGlmaWVyS2luZCAhPT0gU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2goZWxlbWVudC5pbnB1dHNDbGFzcywgKGlucHV0OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dC5tb2RpZmllcktpbmQgPT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb2Vzbid0IGhhbmRsZSBwcml2YXRlIGZvciBjb3ZlcmFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50cyAtPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmRlc2NyaXB0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuZGVzY3JpcHRpb24gIT09ICcnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQubW9kaWZpZXJLaW5kICE9PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIF8uZm9yRWFjaChlbGVtZW50Lm91dHB1dHNDbGFzcywgKG91dHB1dDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0Lm1vZGlmaWVyS2luZCA9PT0gU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvZXNuJ3QgaGFuZGxlIHByaXZhdGUgZm9yIGNvdmVyYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnRzIC09IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmRlc2NyaXB0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmRlc2NyaXB0aW9uICE9PSAnJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5tb2RpZmllcktpbmQgIT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmRcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBjbC5jb3ZlcmFnZVBlcmNlbnQgPSBNYXRoLmZsb29yKFxuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkIC8gdG90YWxTdGF0ZW1lbnRzICogMTAwXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b3RhbFN0YXRlbWVudHMgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsLmNvdmVyYWdlUGVyY2VudCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2wuY292ZXJhZ2VDb3VudCA9IHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCArICcvJyArIHRvdGFsU3RhdGVtZW50cztcbiAgICAgICAgICAgICAgICAgICAgY2wuc3RhdHVzID0gZ2V0U3RhdHVzKGNsLmNvdmVyYWdlUGVyY2VudCk7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsUHJvamVjdFN0YXRlbWVudERvY3VtZW50ZWQgKz0gY2wuY292ZXJhZ2VQZXJjZW50O1xuICAgICAgICAgICAgICAgICAgICBmaWxlcy5wdXNoKGNsKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsZXQgcHJvY2Vzc0NvdmVyYWdlUGVyRmlsZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnUHJvY2VzcyBkb2N1bWVudGF0aW9uIGNvdmVyYWdlIHBlciBmaWxlJyk7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJy0tLS0tLS0tLS0tLS0tLS0tLS0nKTtcblxuICAgICAgICAgICAgICAgIGxldCBvdmVyRmlsZXMgPSBmaWxlcy5maWx0ZXIoZiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvdmVyVGVzdCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBmLmNvdmVyYWdlUGVyY2VudCA+PSB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VNaW5pbXVtUGVyRmlsZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG92ZXJUZXN0ICYmICF0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0U2hvd09ubHlGYWlsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke2YuY292ZXJhZ2VQZXJjZW50fSAlIGZvciBmaWxlICR7Zi5maWxlUGF0aH0gLSBvdmVyIG1pbmltdW0gcGVyIGZpbGVgXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvdmVyVGVzdDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBsZXQgdW5kZXJGaWxlcyA9IGZpbGVzLmZpbHRlcihmID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVuZGVyVGVzdCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBmLmNvdmVyYWdlUGVyY2VudCA8IHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZU1pbmltdW1QZXJGaWxlO1xuICAgICAgICAgICAgICAgICAgICBpZiAodW5kZXJUZXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7Zi5jb3ZlcmFnZVBlcmNlbnR9ICUgZm9yIGZpbGUgJHtmLmZpbGVQYXRofSAtIHVuZGVyIG1pbmltdW0gcGVyIGZpbGVgXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlclRlc3Q7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnLS0tLS0tLS0tLS0tLS0tLS0tLScpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIG92ZXJGaWxlczogb3ZlckZpbGVzLFxuICAgICAgICAgICAgICAgICAgICB1bmRlckZpbGVzOiB1bmRlckZpbGVzXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsZXQgcHJvY2Vzc0Z1bmN0aW9uc0FuZFZhcmlhYmxlcyA9IChpZCwgdHlwZSkgPT4ge1xuICAgICAgICAgICAgICAgIF8uZm9yRWFjaChpZCwgKGVsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNsOiBhbnkgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aDogZWwuZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5rdHlwZTogZWwudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtzdWJ0eXBlOiBlbC5zdWJ0eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZWwubmFtZVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3ZhcmlhYmxlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2wubGlua3R5cGUgPSAnbWlzY2VsbGFuZW91cyc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0b3RhbFN0YXRlbWVudHMgPSAxO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbC5tb2RpZmllcktpbmQgPT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvZXNuJ3QgaGFuZGxlIHByaXZhdGUgZm9yIGNvdmVyYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudHMgLT0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5kZXNjcmlwdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZWwuZGVzY3JpcHRpb24gIT09ICcnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5tb2RpZmllcktpbmQgIT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmRcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNsLmNvdmVyYWdlUGVyY2VudCA9IE1hdGguZmxvb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgLyB0b3RhbFN0YXRlbWVudHMgKiAxMDBcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY2wuY292ZXJhZ2VDb3VudCA9IHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCArICcvJyArIHRvdGFsU3RhdGVtZW50cztcbiAgICAgICAgICAgICAgICAgICAgY2wuc3RhdHVzID0gZ2V0U3RhdHVzKGNsLmNvdmVyYWdlUGVyY2VudCk7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsUHJvamVjdFN0YXRlbWVudERvY3VtZW50ZWQgKz0gY2wuY292ZXJhZ2VQZXJjZW50O1xuICAgICAgICAgICAgICAgICAgICBmaWxlcy5wdXNoKGNsKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHByb2Nlc3NDb21wb25lbnRzQW5kRGlyZWN0aXZlcyh0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY29tcG9uZW50cyk7XG4gICAgICAgICAgICBwcm9jZXNzQ29tcG9uZW50c0FuZERpcmVjdGl2ZXModGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpcmVjdGl2ZXMpO1xuXG4gICAgICAgICAgICBfLmZvckVhY2godGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmNsYXNzZXMsIChjbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGNsYXNzZSA9IChPYmplY3QgYXMgYW55KS5hc3NpZ24oe30sIGNsKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNsYXNzZS5wcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzZS5wcm9wZXJ0aWVzID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghY2xhc3NlLm1ldGhvZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NlLm1ldGhvZHMgPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGNsYTogYW55ID0ge1xuICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aDogY2xhc3NlLmZpbGUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjbGFzcycsXG4gICAgICAgICAgICAgICAgICAgIGxpbmt0eXBlOiAnY2xhc3NlJyxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogY2xhc3NlLm5hbWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGxldCB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgPSAwO1xuICAgICAgICAgICAgICAgIGxldCB0b3RhbFN0YXRlbWVudHMgPSBjbGFzc2UucHJvcGVydGllcy5sZW5ndGggKyBjbGFzc2UubWV0aG9kcy5sZW5ndGggKyAxOyAvLyArMSBmb3IgY2xhc3MgaXRzZWxmXG5cbiAgICAgICAgICAgICAgICBpZiAoY2xhc3NlLmNvbnN0cnVjdG9yT2JqKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50cyArPSAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2UuY29uc3RydWN0b3JPYmogJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZS5jb25zdHJ1Y3Rvck9iai5kZXNjcmlwdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NlLmNvbnN0cnVjdG9yT2JqLmRlc2NyaXB0aW9uICE9PSAnJ1xuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCArPSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjbGFzc2UuZGVzY3JpcHRpb24gJiYgY2xhc3NlLmRlc2NyaXB0aW9uICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgKz0gMTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBfLmZvckVhY2goY2xhc3NlLnByb3BlcnRpZXMsIChwcm9wZXJ0eTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5tb2RpZmllcktpbmQgPT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvZXNuJ3QgaGFuZGxlIHByaXZhdGUgZm9yIGNvdmVyYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudHMgLT0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5kZXNjcmlwdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkuZGVzY3JpcHRpb24gIT09ICcnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5tb2RpZmllcktpbmQgIT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmRcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIF8uZm9yRWFjaChjbGFzc2UubWV0aG9kcywgKG1ldGhvZDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2QubW9kaWZpZXJLaW5kID09PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEb2Vzbid0IGhhbmRsZSBwcml2YXRlIGZvciBjb3ZlcmFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnRzIC09IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmRlc2NyaXB0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZGVzY3JpcHRpb24gIT09ICcnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QubW9kaWZpZXJLaW5kICE9PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGNsYS5jb3ZlcmFnZVBlcmNlbnQgPSBNYXRoLmZsb29yKHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCAvIHRvdGFsU3RhdGVtZW50cyAqIDEwMCk7XG4gICAgICAgICAgICAgICAgaWYgKHRvdGFsU3RhdGVtZW50cyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjbGEuY292ZXJhZ2VQZXJjZW50ID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2xhLmNvdmVyYWdlQ291bnQgPSB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgKyAnLycgKyB0b3RhbFN0YXRlbWVudHM7XG4gICAgICAgICAgICAgICAgY2xhLnN0YXR1cyA9IGdldFN0YXR1cyhjbGEuY292ZXJhZ2VQZXJjZW50KTtcbiAgICAgICAgICAgICAgICB0b3RhbFByb2plY3RTdGF0ZW1lbnREb2N1bWVudGVkICs9IGNsYS5jb3ZlcmFnZVBlcmNlbnQ7XG4gICAgICAgICAgICAgICAgZmlsZXMucHVzaChjbGEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBfLmZvckVhY2godGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmluamVjdGFibGVzLCAoaW5qOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgaW5qZWN0YWJsZSA9IChPYmplY3QgYXMgYW55KS5hc3NpZ24oe30sIGluaik7XG4gICAgICAgICAgICAgICAgaWYgKCFpbmplY3RhYmxlLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5qZWN0YWJsZS5wcm9wZXJ0aWVzID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghaW5qZWN0YWJsZS5tZXRob2RzKSB7XG4gICAgICAgICAgICAgICAgICAgIGluamVjdGFibGUubWV0aG9kcyA9IFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgY2w6IGFueSA9IHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGg6IGluamVjdGFibGUuZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogaW5qZWN0YWJsZS50eXBlLFxuICAgICAgICAgICAgICAgICAgICBsaW5rdHlwZTogaW5qZWN0YWJsZS50eXBlLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBpbmplY3RhYmxlLm5hbWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGxldCB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgPSAwO1xuICAgICAgICAgICAgICAgIGxldCB0b3RhbFN0YXRlbWVudHMgPSBpbmplY3RhYmxlLnByb3BlcnRpZXMubGVuZ3RoICsgaW5qZWN0YWJsZS5tZXRob2RzLmxlbmd0aCArIDE7IC8vICsxIGZvciBpbmplY3RhYmxlIGl0c2VsZlxuXG4gICAgICAgICAgICAgICAgaWYgKGluamVjdGFibGUuY29uc3RydWN0b3JPYmopIHtcbiAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnRzICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGFibGUuY29uc3RydWN0b3JPYmogJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGFibGUuY29uc3RydWN0b3JPYmouZGVzY3JpcHRpb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGFibGUuY29uc3RydWN0b3JPYmouZGVzY3JpcHRpb24gIT09ICcnXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGluamVjdGFibGUuZGVzY3JpcHRpb24gJiYgaW5qZWN0YWJsZS5kZXNjcmlwdGlvbiAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICs9IDE7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgXy5mb3JFYWNoKGluamVjdGFibGUucHJvcGVydGllcywgKHByb3BlcnR5OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5Lm1vZGlmaWVyS2luZCA9PT0gU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9lc24ndCBoYW5kbGUgcHJpdmF0ZSBmb3IgY292ZXJhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50cyAtPSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LmRlc2NyaXB0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5kZXNjcmlwdGlvbiAhPT0gJycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5Lm1vZGlmaWVyS2luZCAhPT0gU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCArPSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgXy5mb3JFYWNoKGluamVjdGFibGUubWV0aG9kcywgKG1ldGhvZDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2QubW9kaWZpZXJLaW5kID09PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEb2Vzbid0IGhhbmRsZSBwcml2YXRlIGZvciBjb3ZlcmFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnRzIC09IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmRlc2NyaXB0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZGVzY3JpcHRpb24gIT09ICcnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QubW9kaWZpZXJLaW5kICE9PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGNsLmNvdmVyYWdlUGVyY2VudCA9IE1hdGguZmxvb3IodG90YWxTdGF0ZW1lbnREb2N1bWVudGVkIC8gdG90YWxTdGF0ZW1lbnRzICogMTAwKTtcbiAgICAgICAgICAgICAgICBpZiAodG90YWxTdGF0ZW1lbnRzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsLmNvdmVyYWdlUGVyY2VudCA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNsLmNvdmVyYWdlQ291bnQgPSB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgKyAnLycgKyB0b3RhbFN0YXRlbWVudHM7XG4gICAgICAgICAgICAgICAgY2wuc3RhdHVzID0gZ2V0U3RhdHVzKGNsLmNvdmVyYWdlUGVyY2VudCk7XG4gICAgICAgICAgICAgICAgdG90YWxQcm9qZWN0U3RhdGVtZW50RG9jdW1lbnRlZCArPSBjbC5jb3ZlcmFnZVBlcmNlbnQ7XG4gICAgICAgICAgICAgICAgZmlsZXMucHVzaChjbCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaW50ZXJmYWNlcywgKGludGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBpbnRlciA9IChPYmplY3QgYXMgYW55KS5hc3NpZ24oe30sIGludGUpO1xuICAgICAgICAgICAgICAgIGlmICghaW50ZXIucHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgICAgICBpbnRlci5wcm9wZXJ0aWVzID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghaW50ZXIubWV0aG9kcykge1xuICAgICAgICAgICAgICAgICAgICBpbnRlci5tZXRob2RzID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBjbDogYW55ID0ge1xuICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aDogaW50ZXIuZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogaW50ZXIudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgbGlua3R5cGU6IGludGVyLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGludGVyLm5hbWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGxldCB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgPSAwO1xuICAgICAgICAgICAgICAgIGxldCB0b3RhbFN0YXRlbWVudHMgPSBpbnRlci5wcm9wZXJ0aWVzLmxlbmd0aCArIGludGVyLm1ldGhvZHMubGVuZ3RoICsgMTsgLy8gKzEgZm9yIGludGVyZmFjZSBpdHNlbGZcblxuICAgICAgICAgICAgICAgIGlmIChpbnRlci5jb25zdHJ1Y3Rvck9iaikge1xuICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudHMgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXIuY29uc3RydWN0b3JPYmogJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGludGVyLmNvbnN0cnVjdG9yT2JqLmRlc2NyaXB0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRlci5jb25zdHJ1Y3Rvck9iai5kZXNjcmlwdGlvbiAhPT0gJydcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaW50ZXIuZGVzY3JpcHRpb24gJiYgaW50ZXIuZGVzY3JpcHRpb24gIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCArPSAxO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIF8uZm9yRWFjaChpbnRlci5wcm9wZXJ0aWVzLCAocHJvcGVydHk6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkubW9kaWZpZXJLaW5kID09PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEb2Vzbid0IGhhbmRsZSBwcml2YXRlIGZvciBjb3ZlcmFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnRzIC09IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkuZGVzY3JpcHRpb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LmRlc2NyaXB0aW9uICE9PSAnJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkubW9kaWZpZXJLaW5kICE9PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBfLmZvckVhY2goaW50ZXIubWV0aG9kcywgKG1ldGhvZDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2QubW9kaWZpZXJLaW5kID09PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEb2Vzbid0IGhhbmRsZSBwcml2YXRlIGZvciBjb3ZlcmFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnRzIC09IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmRlc2NyaXB0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZGVzY3JpcHRpb24gIT09ICcnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QubW9kaWZpZXJLaW5kICE9PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGNsLmNvdmVyYWdlUGVyY2VudCA9IE1hdGguZmxvb3IodG90YWxTdGF0ZW1lbnREb2N1bWVudGVkIC8gdG90YWxTdGF0ZW1lbnRzICogMTAwKTtcbiAgICAgICAgICAgICAgICBpZiAodG90YWxTdGF0ZW1lbnRzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsLmNvdmVyYWdlUGVyY2VudCA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNsLmNvdmVyYWdlQ291bnQgPSB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgKyAnLycgKyB0b3RhbFN0YXRlbWVudHM7XG4gICAgICAgICAgICAgICAgY2wuc3RhdHVzID0gZ2V0U3RhdHVzKGNsLmNvdmVyYWdlUGVyY2VudCk7XG4gICAgICAgICAgICAgICAgdG90YWxQcm9qZWN0U3RhdGVtZW50RG9jdW1lbnRlZCArPSBjbC5jb3ZlcmFnZVBlcmNlbnQ7XG4gICAgICAgICAgICAgICAgZmlsZXMucHVzaChjbCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEucGlwZXMsIChwaXBlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgY2w6IGFueSA9IHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGg6IHBpcGUuZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogcGlwZS50eXBlLFxuICAgICAgICAgICAgICAgICAgICBsaW5rdHlwZTogcGlwZS50eXBlLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBwaXBlLm5hbWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGxldCB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgPSAwO1xuICAgICAgICAgICAgICAgIGxldCB0b3RhbFN0YXRlbWVudHMgPSAxO1xuICAgICAgICAgICAgICAgIGlmIChwaXBlLmRlc2NyaXB0aW9uICYmIHBpcGUuZGVzY3JpcHRpb24gIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCArPSAxO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNsLmNvdmVyYWdlUGVyY2VudCA9IE1hdGguZmxvb3IodG90YWxTdGF0ZW1lbnREb2N1bWVudGVkIC8gdG90YWxTdGF0ZW1lbnRzICogMTAwKTtcbiAgICAgICAgICAgICAgICBjbC5jb3ZlcmFnZUNvdW50ID0gdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICsgJy8nICsgdG90YWxTdGF0ZW1lbnRzO1xuICAgICAgICAgICAgICAgIGNsLnN0YXR1cyA9IGdldFN0YXR1cyhjbC5jb3ZlcmFnZVBlcmNlbnQpO1xuICAgICAgICAgICAgICAgIHRvdGFsUHJvamVjdFN0YXRlbWVudERvY3VtZW50ZWQgKz0gY2wuY292ZXJhZ2VQZXJjZW50O1xuICAgICAgICAgICAgICAgIGZpbGVzLnB1c2goY2wpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHByb2Nlc3NGdW5jdGlvbnNBbmRWYXJpYWJsZXMoXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLm1pc2NlbGxhbmVvdXMuZnVuY3Rpb25zLFxuICAgICAgICAgICAgICAgICdmdW5jdGlvbidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBwcm9jZXNzRnVuY3Rpb25zQW5kVmFyaWFibGVzKFxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5taXNjZWxsYW5lb3VzLnZhcmlhYmxlcyxcbiAgICAgICAgICAgICAgICAndmFyaWFibGUnXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBmaWxlcyA9IF8uc29ydEJ5KGZpbGVzLCBbJ2ZpbGVQYXRoJ10pO1xuICAgICAgICAgICAgbGV0IGNvdmVyYWdlRGF0YSA9IHtcbiAgICAgICAgICAgICAgICBjb3VudDpcbiAgICAgICAgICAgICAgICAgICAgZmlsZXMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBNYXRoLmZsb29yKHRvdGFsUHJvamVjdFN0YXRlbWVudERvY3VtZW50ZWQgLyBmaWxlcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IDAsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnJyxcbiAgICAgICAgICAgICAgICBmaWxlc1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvdmVyYWdlRGF0YS5zdGF0dXMgPSBnZXRTdGF0dXMoY292ZXJhZ2VEYXRhLmNvdW50KTtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5hZGRQYWdlKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnY292ZXJhZ2UnLFxuICAgICAgICAgICAgICAgIGlkOiAnY292ZXJhZ2UnLFxuICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdjb3ZlcmFnZScsXG4gICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzLFxuICAgICAgICAgICAgICAgIGRhdGE6IGNvdmVyYWdlRGF0YSxcbiAgICAgICAgICAgICAgICBkZXB0aDogMCxcbiAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5ST09UXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvdmVyYWdlRGF0YS5maWxlcyA9IGZpbGVzO1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlRGF0YSA9IGNvdmVyYWdlRGF0YTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZXhwb3J0Rm9ybWF0ID09PSBDT01QT0RPQ19ERUZBVUxUUy5leHBvcnRGb3JtYXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmh0bWxFbmdpbmUuZ2VuZXJhdGVDb3ZlcmFnZUJhZGdlKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQnZG9jdW1lbnRhdGlvbicsXG4gICAgICAgICAgICAgICAgICAgIGNvdmVyYWdlRGF0YVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaWxlcyA9IF8uc29ydEJ5KGZpbGVzLCBbJ2NvdmVyYWdlUGVyY2VudCddKTtcblxuICAgICAgICAgICAgbGV0IGNvdmVyYWdlVGVzdFBlckZpbGVSZXN1bHRzO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3QgJiZcbiAgICAgICAgICAgICAgICAhdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdFBlckZpbGVcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIEdsb2JhbCBjb3ZlcmFnZSB0ZXN0IGFuZCBub3QgcGVyIGZpbGVcbiAgICAgICAgICAgICAgICBpZiAoY292ZXJhZ2VEYXRhLmNvdW50ID49IHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICBgRG9jdW1lbnRhdGlvbiBjb3ZlcmFnZSAoJHtjb3ZlcmFnZURhdGEuY291bnR9JSkgaXMgb3ZlciB0aHJlc2hvbGQgKCR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdFRocmVzaG9sZFxuICAgICAgICAgICAgICAgICAgICAgICAgfSUpYFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uUHJvbWlzZVJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlID0gYERvY3VtZW50YXRpb24gY292ZXJhZ2UgKCR7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3ZlcmFnZURhdGEuY291bnRcbiAgICAgICAgICAgICAgICAgICAgfSUpIGlzIG5vdCBvdmVyIHRocmVzaG9sZCAoJHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGRcbiAgICAgICAgICAgICAgICAgICAgfSUpYDtcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvblByb21pc2VSZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGRGYWlsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgIXRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3QgJiZcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0UGVyRmlsZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY292ZXJhZ2VUZXN0UGVyRmlsZVJlc3VsdHMgPSBwcm9jZXNzQ292ZXJhZ2VQZXJGaWxlKCk7XG4gICAgICAgICAgICAgICAgLy8gUGVyIGZpbGUgY292ZXJhZ2UgdGVzdCBhbmQgbm90IGdsb2JhbFxuICAgICAgICAgICAgICAgIGlmIChjb3ZlcmFnZVRlc3RQZXJGaWxlUmVzdWx0cy51bmRlckZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBgRG9jdW1lbnRhdGlvbiBjb3ZlcmFnZSBwZXIgZmlsZSBpcyBub3Qgb3ZlciB0aHJlc2hvbGQgKCR7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VNaW5pbXVtUGVyRmlsZVxuICAgICAgICAgICAgICAgICAgICB9JSlgO1xuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uUHJvbWlzZVJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdFRocmVzaG9sZEZhaWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICBgRG9jdW1lbnRhdGlvbiBjb3ZlcmFnZSBwZXIgZmlsZSBpcyBvdmVyIHRocmVzaG9sZCAoJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VNaW5pbXVtUGVyRmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSUpYFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uUHJvbWlzZVJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdCAmJlxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RQZXJGaWxlXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBQZXIgZmlsZSBjb3ZlcmFnZSB0ZXN0IGFuZCBnbG9iYWxcbiAgICAgICAgICAgICAgICBjb3ZlcmFnZVRlc3RQZXJGaWxlUmVzdWx0cyA9IHByb2Nlc3NDb3ZlcmFnZVBlckZpbGUoKTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGNvdmVyYWdlRGF0YS5jb3VudCA+PSB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0VGhyZXNob2xkICYmXG4gICAgICAgICAgICAgICAgICAgIGNvdmVyYWdlVGVzdFBlckZpbGVSZXN1bHRzLnVuZGVyRmlsZXMubGVuZ3RoID09PSAwXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgYERvY3VtZW50YXRpb24gY292ZXJhZ2UgKCR7Y292ZXJhZ2VEYXRhLmNvdW50fSUpIGlzIG92ZXIgdGhyZXNob2xkICgke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0lKWBcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICBgRG9jdW1lbnRhdGlvbiBjb3ZlcmFnZSBwZXIgZmlsZSBpcyBvdmVyIHRocmVzaG9sZCAoJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VNaW5pbXVtUGVyRmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSUpYFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uUHJvbWlzZVJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGNvdmVyYWdlRGF0YS5jb3VudCA+PSB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0VGhyZXNob2xkICYmXG4gICAgICAgICAgICAgICAgICAgIGNvdmVyYWdlVGVzdFBlckZpbGVSZXN1bHRzLnVuZGVyRmlsZXMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGBEb2N1bWVudGF0aW9uIGNvdmVyYWdlICgke2NvdmVyYWdlRGF0YS5jb3VudH0lKSBpcyBvdmVyIHRocmVzaG9sZCAoJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0VGhyZXNob2xkXG4gICAgICAgICAgICAgICAgICAgICAgICB9JSlgXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlID0gYERvY3VtZW50YXRpb24gY292ZXJhZ2UgcGVyIGZpbGUgaXMgbm90IG92ZXIgdGhyZXNob2xkICgke1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlTWluaW11bVBlckZpbGVcbiAgICAgICAgICAgICAgICAgICAgfSUpYDtcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvblByb21pc2VSZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGRGYWlsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGNvdmVyYWdlRGF0YS5jb3VudCA8IHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGQgJiZcbiAgICAgICAgICAgICAgICAgICAgY292ZXJhZ2VUZXN0UGVyRmlsZVJlc3VsdHMudW5kZXJGaWxlcy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlR2xvYmFsID0gYERvY3VtZW50YXRpb24gY292ZXJhZ2UgKCR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY292ZXJhZ2VEYXRhLmNvdW50XG4gICAgICAgICAgICAgICAgICAgICAgICB9JSkgaXMgbm90IG92ZXIgdGhyZXNob2xkICgke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGRcbiAgICAgICAgICAgICAgICAgICAgICAgIH0lKWAsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGVyRmlsZSA9IGBEb2N1bWVudGF0aW9uIGNvdmVyYWdlIHBlciBmaWxlIGlzIG5vdCBvdmVyIHRocmVzaG9sZCAoJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VNaW5pbXVtUGVyRmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSUpYDtcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvblByb21pc2VSZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGRGYWlsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IobWVzc2FnZUdsb2JhbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IobWVzc2FnZVBlckZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4obWVzc2FnZUdsb2JhbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihtZXNzYWdlUGVyRmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGBEb2N1bWVudGF0aW9uIGNvdmVyYWdlICgke1xuICAgICAgICAgICAgICAgICAgICAgICAgY292ZXJhZ2VEYXRhLmNvdW50XG4gICAgICAgICAgICAgICAgICAgIH0lKSBpcyBub3Qgb3ZlciB0aHJlc2hvbGQgKCR7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0VGhyZXNob2xkXG4gICAgICAgICAgICAgICAgICAgIH0lKWAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQZXJGaWxlID0gYERvY3VtZW50YXRpb24gY292ZXJhZ2UgcGVyIGZpbGUgaXMgb3ZlciB0aHJlc2hvbGQgKCR7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VNaW5pbXVtUGVyRmlsZVxuICAgICAgICAgICAgICAgICAgICB9JSlgO1xuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uUHJvbWlzZVJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdFRocmVzaG9sZEZhaWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKG1lc3NhZ2VQZXJGaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8obWVzc2FnZVBlckZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblx0XHRwdWJsaWMgcHJlcGFyZVVuaXRUZXN0Q292ZXJhZ2UoKSB7XG5cdFx0XHRsb2dnZXIuaW5mbygnUHJvY2VzcyB1bml0IHRlc3QgY292ZXJhZ2UgcmVwb3J0Jyk7XG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCk9Pntcblx0XHRcdFx0bGV0IGNvdkRhdCwgY292RmlsZU5hbWVzO1xuXG5cdFx0XHRcdGlmICghdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlRGF0YVsnZmlsZXMnXSl7XG5cdFx0XHRcdFx0bG9nZ2VyLndhcm4oJ01pc3NpbmcgZG9jdW1lbnRhdGlvbiBjb3ZlcmFnZSBkYXRhJyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjb3ZEYXQgPSB7fTtcblx0XHRcdFx0XHRcdGNvdkZpbGVOYW1lcyA9IF8ubWFwKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZURhdGFbJ2ZpbGVzJ10sIChlbCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRsZXQgZmlsZU5hbWUgPSBlbC5maWxlUGF0aDtcblx0XHRcdFx0XHRcdFx0Y292RGF0W2ZpbGVOYW1lXSA9IHt0eXBlOiBlbC50eXBlLCBsaW5rdHlwZTogZWwubGlua3R5cGUsIGxpbmtzdWJ0eXBlOiBlbC5saW5rc3VidHlwZSwgbmFtZTogZWwubmFtZX07XG4gICAgICAgICAgICAgIHJldHVybiBmaWxlTmFtZTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIHJlYWQgY292ZXJhZ2Ugc3VtbWFyeSBmaWxlIGFuZCBkYXRhXG5cdFx0XHRcdGxldCB1bml0VGVzdFN1bW1hcnkgPSB7fTtcblx0XHRcdFx0bGV0IGZpbGVEYXQgPSB0aGlzLmZpbGVFbmdpbmUuZ2V0U3luYyh0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEudW5pdFRlc3RDb3ZlcmFnZSk7XG5cdFx0XHRcdGlmKGZpbGVEYXQpe1xuXHRcdFx0XHRcdHVuaXRUZXN0U3VtbWFyeSA9IEpTT04ucGFyc2UoZmlsZURhdCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KCdFcnJvciByZWFkaW5nIHVuaXQgdGVzdCBjb3ZlcmFnZSBmaWxlJyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0bGV0IGdldENvdlN0YXR1cyA9IGZ1bmN0aW9uKHBlcmNlbnQsIHRvdGFsTGluZXMpe1xuXHRcdFx0XHRcdGxldCBzdGF0dXM7XG5cdFx0XHRcdFx0aWYodG90YWxMaW5lcyA9PT0gMCl7XG5cdFx0XHRcdFx0XHRzdGF0dXMgPSAndW5jb3ZlcmVkJ1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAocGVyY2VudCA8PSAyNSl7XG5cdFx0XHRcdFx0XHRzdGF0dXMgPSAnbG93Jztcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHBlcmNlbnQgPiAyNSAmJiBwZXJjZW50IDw9IDUwKXtcblx0XHRcdFx0XHRcdHN0YXR1cyA9ICdtZWRpdW0nO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAocGVyY2VudCA+IDUwICYmIHBlcmNlbnQgPD0gNzUpe1xuXHRcdFx0XHRcdFx0c3RhdHVzID0gJ2dvb2QnXG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHN0YXR1cyA9ICd2ZXJ5LWdvb2QnO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gc3RhdHVzO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGxldCBnZXRDb3ZlcmFnZURhdGEgPSBmdW5jdGlvbihkYXRhLCBmaWxlTmFtZSkge1xuXHRcdFx0XHRcdGxldCBvdXQgPSB7fTtcblx0XHRcdFx0XHRpZiAoZmlsZU5hbWUgIT09ICd0b3RhbCcpe1xuXHRcdFx0XHRcdFx0aWYoY292RGF0ID09PSB1bmRlZmluZWQpe1xuXHRcdFx0XHRcdFx0XHQvLyBuZWVkIGEgbmFtZSB0byBpbmNsdWRlIGluIG91dHB1dCBidXQgdGhpcyBpc24ndCB2aXNpYmxlXG5cdFx0XHRcdFx0XHRcdG91dCA9IHtuYW1lOiBmaWxlTmFtZSwgZmlsZVBhdGg6IGZpbGVOYW1lfTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7IC8vaWYgKGNvdkRhdFtmaWxlTmFtZV0pe1xuICAgICAgICAgICAgICBsZXQgZmluZE1hdGNoID0gXy5maWx0ZXIoY292RmlsZU5hbWVzLCAoZWwpPT57XG4gICAgICAgICAgICAgICAgcmV0dXJuIChlbC5pbmNsdWRlcyhmaWxlTmFtZSkgfHwgZmlsZU5hbWUuaW5jbHVkZXMoZWwpKVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgaWYoZmluZE1hdGNoLmxlbmd0aCA+IDApe1xuXHRcdFx0XHRcdFx0XHQgICBvdXQgPSBfLmNsb25lKGNvdkRhdFtmaW5kTWF0Y2hbMF1dKTtcbiAgICAgICAgICAgICAgICBvdXRbJ2ZpbGVQYXRoJ10gPSBmaWxlTmFtZTtcbiAgICAgICAgICAgICAgfSAvL2Vsc2Uge1xuICAgICAgICAgICAgICAgIC8vb3V0ID0ge25hbWU6IGZpbGVOYW1lLCBmaWxlUGF0aDogZmlsZU5hbWV9O1xuICAgICAgICAgICAgICAvL31cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bGV0IGtleXNUb0dldCA9IFsnc3RhdGVtZW50cycsICdicmFuY2hlcycsICdmdW5jdGlvbnMnLCAnbGluZXMnXTtcblx0XHRcdFx0XHRfLmZvckVhY2goa2V5c1RvR2V0LCAoa2V5KT0+e1xuXHRcdFx0XHRcdFx0aWYoZGF0YVtrZXldKXtcblx0XHRcdFx0XHRcdFx0bGV0IHQgPSBkYXRhW2tleV07XG5cdFx0XHRcdFx0XHRcdG91dFtrZXldID0ge2NvdmVyYWdlUGVyY2VudDogTWF0aC5yb3VuZCh0LnBjdCksXG5cdFx0XHRcdFx0XHRcdFx0Y292ZXJhZ2VDb3VudDogJycgKyB0LmNvdmVyZWQgKyAnLycgKyB0LnRvdGFsLFxuXHRcdFx0XHRcdFx0XHRcdHN0YXR1czogZ2V0Q292U3RhdHVzKHQucGN0LCB0LnRvdGFsKX07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0cmV0dXJuIG91dDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxldCB1bml0VGVzdERhdGEgPSB7fTtcblx0XHRcdFx0bGV0IGZpbGVzID0gW107XG5cdFx0XHRcdGZvcihsZXQgZmlsZSBpbiB1bml0VGVzdFN1bW1hcnkpe1xuXHRcdFx0XHRcdGxldCBkYXQgPSBnZXRDb3ZlcmFnZURhdGEodW5pdFRlc3RTdW1tYXJ5W2ZpbGVdLCBmaWxlKTtcblx0XHRcdFx0XHRpZiAoZmlsZSA9PT0gJ3RvdGFsJyl7XG5cdFx0XHRcdFx0XHR1bml0VGVzdERhdGFbJ3RvdGFsJ10gPSBkYXQ7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGZpbGVzLnB1c2goZGF0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0dW5pdFRlc3REYXRhWydmaWxlcyddID0gZmlsZXM7XG5cdFx0XHRcdHVuaXRUZXN0RGF0YVsnaWRDb2x1bW4nXSA9IChjb3ZEYXQgIT09IHVuZGVmaW5lZCk7IC8vIHNob3VsZCB3ZSBpbmNsdWRlIHRoZSBpZCBjb2x1bW5cblx0XHRcdFx0dGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLnVuaXRUZXN0RGF0YSA9IHVuaXRUZXN0RGF0YTtcblx0XHRcdFx0dGhpcy5jb25maWd1cmF0aW9uLmFkZFBhZ2Uoe1xuXHRcdFx0XHRcdG5hbWU6ICd1bml0LXRlc3QnLFxuICAgICAgICAgIGlkOiAndW5pdC10ZXN0JyxcbiAgICAgICAgICBjb250ZXh0OiAndW5pdC10ZXN0JyxcbiAgICAgICAgICBmaWxlczogZmlsZXMsXG4gICAgICAgICAgZGF0YTogdW5pdFRlc3REYXRhLFxuICAgICAgICAgIGRlcHRoOiAwLFxuICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLlJPT1Rcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0aWYodGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmV4cG9ydEZvcm1hdCA9PT0gQ09NUE9ET0NfREVGQVVMVFMuZXhwb3J0Rm9ybWF0KXtcblx0XHRcdFx0XHRsZXQga2V5c1RvR2V0ID0gWydzdGF0ZW1lbnRzJywgJ2JyYW5jaGVzJywgJ2Z1bmN0aW9ucycsICdsaW5lcyddO1xuXHRcdFx0XHRcdF8uZm9yRWFjaChrZXlzVG9HZXQsIChrZXkpPT57XG5cdFx0XHRcdFx0XHRpZih1bml0VGVzdERhdGFbJ3RvdGFsJ11ba2V5XSl7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaHRtbEVuZ2luZS5nZW5lcmF0ZUNvdmVyYWdlQmFkZ2UoXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dCxcblx0XHRcdFx0XHRcdFx0XHRrZXksXG5cdFx0XHRcdFx0XHRcdFx0e2NvdW50OiB1bml0VGVzdERhdGFbJ3RvdGFsJ11ba2V5XVsnY292ZXJhZ2VQZXJjZW50J10sXG5cdFx0XHRcdFx0XHRcdFx0XHRzdGF0dXM6IHVuaXRUZXN0RGF0YVsndG90YWwnXVtrZXldWydzdGF0dXMnXX1cblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuICAgIHByaXZhdGUgcHJvY2Vzc1BhZ2UocGFnZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJvY2VzcyBwYWdlJywgcGFnZS5uYW1lKTtcblxuICAgICAgICBsZXQgaHRtbERhdGEgPSB0aGlzLmh0bWxFbmdpbmUucmVuZGVyKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YSwgcGFnZSk7XG4gICAgICAgIGxldCBmaW5hbFBhdGggPSB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0O1xuXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0Lmxhc3RJbmRleE9mKCcvJykgPT09IC0xKSB7XG4gICAgICAgICAgICBmaW5hbFBhdGggKz0gJy8nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWdlLnBhdGgpIHtcbiAgICAgICAgICAgIGZpbmFsUGF0aCArPSBwYWdlLnBhdGggKyAnLyc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFnZS5maWxlbmFtZSkge1xuICAgICAgICAgICAgZmluYWxQYXRoICs9IHBhZ2UuZmlsZW5hbWUgKyAnLmh0bWwnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmluYWxQYXRoICs9IHBhZ2UubmFtZSArICcuaHRtbCc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlU2VhcmNoKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaEVuZ2luZS5pbmRleFBhZ2Uoe1xuICAgICAgICAgICAgICAgIGluZm9zOiBwYWdlLFxuICAgICAgICAgICAgICAgIHJhd0RhdGE6IGh0bWxEYXRhLFxuICAgICAgICAgICAgICAgIHVybDogZmluYWxQYXRoXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmZpbGVFbmdpbmUud3JpdGUoZmluYWxQYXRoLCBodG1sRGF0YSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgZHVyaW5nICcgKyBwYWdlLm5hbWUgKyAnIHBhZ2UgZ2VuZXJhdGlvbicpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCcnKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByb2Nlc3NQYWdlcygpIHtcbiAgICAgICAgbGV0IHBhZ2VzID0gXy5zb3J0QnkodGhpcy5jb25maWd1cmF0aW9uLnBhZ2VzLCBbJ25hbWUnXSk7XG5cbiAgICAgICAgbG9nZ2VyLmluZm8oJ1Byb2Nlc3MgcGFnZXMnKTtcbiAgICAgICAgUHJvbWlzZS5hbGwocGFnZXMubWFwKHBhZ2UgPT4gdGhpcy5wcm9jZXNzUGFnZShwYWdlKSkpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGNhbGxiYWNrc0FmdGVyR2VuZXJhdGVTZWFyY2hJbmRleEpzb24gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuYWRkaXRpb25hbFBhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0FkZGl0aW9uYWxQYWdlcygpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5hc3NldHNGb2xkZXIgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzQXNzZXRzRm9sZGVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NSZXNvdXJjZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVNlYXJjaCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaEVuZ2luZS5nZW5lcmF0ZVNlYXJjaEluZGV4SnNvbih0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0KS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrc0FmdGVyR2VuZXJhdGVTZWFyY2hJbmRleEpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzQWZ0ZXJHZW5lcmF0ZVNlYXJjaEluZGV4SnNvbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc01lbnUodGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzTWVudShtYWluRGF0YSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJvY2VzcyBtZW51Li4uJyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHRtbEVuZ2luZS5yZW5kZXJNZW51KHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS50ZW1wbGF0ZXMsIG1haW5EYXRhKS50aGVuKGh0bWxEYXRhID0+IHtcbiAgICAgICAgICAgIGxldCBmaW5hbFBhdGggPSBgJHttYWluRGF0YS5vdXRwdXR9L2pzL21lbnUtd2MuanNgO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsZUVuZ2luZS53cml0ZShmaW5hbFBhdGgsIGh0bWxEYXRhKS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgZHVyaW5nICcgKyBmaW5hbFBhdGggKyAnIHBhZ2UgZ2VuZXJhdGlvbicpO1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgnJyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByb2Nlc3NBZGRpdGlvbmFsUGFnZXMoKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcm9jZXNzIGFkZGl0aW9uYWwgcGFnZXMnKTtcbiAgICAgICAgbGV0IHBhZ2VzID0gdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmFkZGl0aW9uYWxQYWdlcztcbiAgICAgICAgUHJvbWlzZS5hbGwocGFnZXMubWFwKChwYWdlLCBpKSA9PiB0aGlzLnByb2Nlc3NQYWdlKHBhZ2UpKSlcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaEVuZ2luZVxuICAgICAgICAgICAgICAgICAgICAuZ2VuZXJhdGVTZWFyY2hJbmRleEpzb24odGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dClcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5hc3NldHNGb2xkZXIgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzQXNzZXRzRm9sZGVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NSZXNvdXJjZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGUgPT4ge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJvY2Vzc0Fzc2V0c0ZvbGRlcigpOiB2b2lkIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ0NvcHkgYXNzZXRzIGZvbGRlcicpO1xuXG4gICAgICAgIGlmICghdGhpcy5maWxlRW5naW5lLmV4aXN0c1N5bmModGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmFzc2V0c0ZvbGRlcikpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICBgUHJvdmlkZWQgYXNzZXRzIGZvbGRlciAke3RoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5hc3NldHNGb2xkZXJ9IGRpZCBub3QgZXhpc3RgXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGZpbmFsT3V0cHV0ID0gdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dDtcblxuICAgICAgICAgICAgbGV0IHRlc3RPdXRwdXREaXIgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0Lm1hdGNoKHByb2Nlc3MuY3dkKCkpO1xuXG4gICAgICAgICAgICBpZiAodGVzdE91dHB1dERpciAmJiB0ZXN0T3V0cHV0RGlyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBmaW5hbE91dHB1dCA9IHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwLFxuICAgICAgICAgICAgICAgICAgICAnJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIGZpbmFsT3V0cHV0LFxuICAgICAgICAgICAgICAgIHBhdGguYmFzZW5hbWUodGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmFzc2V0c0ZvbGRlcilcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmcy5jb3B5KFxuICAgICAgICAgICAgICAgIHBhdGgucmVzb2x2ZSh0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuYXNzZXRzRm9sZGVyKSxcbiAgICAgICAgICAgICAgICBwYXRoLnJlc29sdmUoZGVzdGluYXRpb24pLFxuICAgICAgICAgICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgZHVyaW5nIHJlc291cmNlcyBjb3B5ICcsIGVycik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHByb2Nlc3NSZXNvdXJjZXMoKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdDb3B5IG1haW4gcmVzb3VyY2VzJyk7XG5cbiAgICAgICAgY29uc3Qgb25Db21wbGV0ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICdEb2N1bWVudGF0aW9uIGdlbmVyYXRlZCBpbiAnICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dCArXG4gICAgICAgICAgICAgICAgICAgICcgaW4gJyArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0RWxhcHNlZFRpbWUoKSArXG4gICAgICAgICAgICAgICAgICAgICcgc2Vjb25kcyB1c2luZyAnICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLnRoZW1lICtcbiAgICAgICAgICAgICAgICAgICAgJyB0aGVtZSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLnNlcnZlKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgIGBTZXJ2aW5nIGRvY3VtZW50YXRpb24gZnJvbSAke1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dFxuICAgICAgICAgICAgICAgICAgICB9IGF0IGh0dHA6Ly8xMjcuMC4wLjE6JHt0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEucG9ydH1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bldlYlNlcnZlcih0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZ2VuZXJhdGlvblByb21pc2VSZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmRDYWxsYmFjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBmaW5hbE91dHB1dCA9IHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQ7XG5cbiAgICAgICAgbGV0IHRlc3RPdXRwdXREaXIgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0Lm1hdGNoKHByb2Nlc3MuY3dkKCkpO1xuXG4gICAgICAgIGlmICh0ZXN0T3V0cHV0RGlyICYmIHRlc3RPdXRwdXREaXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZmluYWxPdXRwdXQgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0LnJlcGxhY2UocHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwLCAnJyk7XG4gICAgICAgIH1cblxuICAgICAgICBmcy5jb3B5KFxuICAgICAgICAgICAgcGF0aC5yZXNvbHZlKF9fZGlybmFtZSArICcvLi4vc3JjL3Jlc291cmNlcy8nKSxcbiAgICAgICAgICAgIHBhdGgucmVzb2x2ZShmaW5hbE91dHB1dCksXG4gICAgICAgICAgICBlcnJvckNvcHkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvckNvcHkpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdFcnJvciBkdXJpbmcgcmVzb3VyY2VzIGNvcHkgJywgZXJyb3JDb3B5KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmV4dFRoZW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmcy5jb3B5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgucmVzb2x2ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwICsgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmV4dFRoZW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLnJlc29sdmUoZmluYWxPdXRwdXQgKyAnL3N0eWxlcy8nKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihlcnJvckNvcHlUaGVtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JDb3B5VGhlbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRXJyb3IgZHVyaW5nIGV4dGVybmFsIHN0eWxpbmcgdGhlbWUgY29weSAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29weVRoZW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0V4dGVybmFsIHN0eWxpbmcgdGhlbWUgY29weSBzdWNjZWVkZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmN1c3RvbUZhdmljb24gIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYEN1c3RvbSBmYXZpY29uIHN1cHBsaWVkYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMuY29weShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5yZXNvbHZlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5jd2QoKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5zZXAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jdXN0b21GYXZpY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgucmVzb2x2ZShmaW5hbE91dHB1dCArICcvaW1hZ2VzL2Zhdmljb24uaWNvJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29weUZhdmljb24gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbGluZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yQ29weUZhdmljb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFcnJvciBkdXJpbmcgcmVzb3VyY2VzIGNvcHkgJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb3B5RmF2aWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSBlbGFwc2VkIHRpbWUgc2luY2UgdGhlIHByb2dyYW0gd2FzIHN0YXJ0ZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0RWxhcHNlZFRpbWUoKSB7XG4gICAgICAgIHJldHVybiAobmV3IERhdGUoKS52YWx1ZU9mKCkgLSBzdGFydFRpbWUudmFsdWVPZigpKSAvIDEwMDA7XG4gICAgfVxuXG4gICAgcHVibGljIHByb2Nlc3NHcmFwaHMoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUdyYXBoKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbygnR3JhcGggZ2VuZXJhdGlvbiBkaXNhYmxlZCcpO1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzUGFnZXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdQcm9jZXNzIG1haW4gZ3JhcGgnKTtcbiAgICAgICAgICAgIGxldCBtb2R1bGVzID0gdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLm1vZHVsZXM7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBsZXQgbGVuID0gbW9kdWxlcy5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgbG9vcCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaSA8PSBsZW4gLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdQcm9jZXNzIG1vZHVsZSBncmFwaCcsIG1vZHVsZXNbaV0ubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmaW5hbFBhdGggPSB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0O1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dC5sYXN0SW5kZXhPZignLycpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxQYXRoICs9ICcvJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaW5hbFBhdGggKz0gJ21vZHVsZXMvJyArIG1vZHVsZXNbaV0ubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IF9yYXdNb2R1bGUgPSB0aGlzLmRlcGVuZGVuY2llc0VuZ2luZS5nZXRSYXdNb2R1bGUobW9kdWxlc1tpXS5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgX3Jhd01vZHVsZS5kZWNsYXJhdGlvbnMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgX3Jhd01vZHVsZS5ib290c3RyYXAubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgX3Jhd01vZHVsZS5pbXBvcnRzLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIF9yYXdNb2R1bGUuZXhwb3J0cy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBfcmF3TW9kdWxlLnByb3ZpZGVycy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZ2RFbmdpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVuZGVyR3JhcGgobW9kdWxlc1tpXS5maWxlLCBmaW5hbFBhdGgsICdmJywgbW9kdWxlc1tpXS5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5nZEVuZ2luZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWFkR3JhcGgoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgucmVzb2x2ZShmaW5hbFBhdGggKyBwYXRoLnNlcCArICdkZXBlbmRlbmNpZXMuc3ZnJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZXNbaV0ubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVzW2ldLmdyYXBoID0gZGF0YSBhcyBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGR1cmluZyBncmFwaCByZWFkOiAnLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1BhZ2VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCBmaW5hbE1haW5HcmFwaFBhdGggPSB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0O1xuICAgICAgICAgICAgaWYgKGZpbmFsTWFpbkdyYXBoUGF0aC5sYXN0SW5kZXhPZignLycpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGZpbmFsTWFpbkdyYXBoUGF0aCArPSAnLyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbE1haW5HcmFwaFBhdGggKz0gJ2dyYXBoJztcbiAgICAgICAgICAgIHRoaXMubmdkRW5naW5lLmluaXQocGF0aC5yZXNvbHZlKGZpbmFsTWFpbkdyYXBoUGF0aCkpO1xuXG4gICAgICAgICAgICB0aGlzLm5nZEVuZ2luZVxuICAgICAgICAgICAgICAgIC5yZW5kZXJHcmFwaChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLnRzY29uZmlnLFxuICAgICAgICAgICAgICAgICAgICBwYXRoLnJlc29sdmUoZmluYWxNYWluR3JhcGhQYXRoKSxcbiAgICAgICAgICAgICAgICAgICAgJ3AnXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC50aGVuKFxuICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5nZEVuZ2luZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWFkR3JhcGgoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgucmVzb2x2ZShmaW5hbE1haW5HcmFwaFBhdGggKyBwYXRoLnNlcCArICdkZXBlbmRlbmNpZXMuc3ZnJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNYWluIGdyYXBoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEubWFpbkdyYXBoID0gZGF0YSBhcyBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGR1cmluZyBtYWluIGdyYXBoIHJlYWRpbmcgOiAnLCBlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVNYWluR3JhcGggPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnT29vcHMgZXJyb3IgZHVyaW5nIG1haW4gZ3JhcGggZ2VuZXJhdGlvbiwgbW92aW5nIG9uIG5leHQgcGFydCB3aXRoIG1haW4gZ3JhcGggZGlzYWJsZWQgOiAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlTWFpbkdyYXBoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcnVuV2ViU2VydmVyKGZvbGRlcikge1xuICAgICAgICBpZiAoIXRoaXMuaXNXYXRjaGluZykge1xuICAgICAgICAgICAgTGl2ZVNlcnZlci5zdGFydCh7XG4gICAgICAgICAgICAgICAgcm9vdDogZm9sZGVyLFxuICAgICAgICAgICAgICAgIG9wZW46IHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5vcGVuLFxuICAgICAgICAgICAgICAgIHF1aWV0OiB0cnVlLFxuICAgICAgICAgICAgICAgIGxvZ0xldmVsOiAwLFxuICAgICAgICAgICAgICAgIHdhaXQ6IDEwMDAsXG4gICAgICAgICAgICAgICAgcG9ydDogdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLnBvcnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEud2F0Y2ggJiYgIXRoaXMuaXNXYXRjaGluZykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmZpbGVzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignTm8gc291cmNlcyBmaWxlcyBhdmFpbGFibGUsIHBsZWFzZSB1c2UgLXAgZmxhZycpO1xuICAgICAgICAgICAgICAgIGdlbmVyYXRpb25Qcm9taXNlUmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bldhdGNoKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLndhdGNoICYmIHRoaXMuaXNXYXRjaGluZykge1xuICAgICAgICAgICAgbGV0IHNyY0ZvbGRlciA9IGZpbmRNYWluU291cmNlRm9sZGVyKHRoaXMuZmlsZXMpO1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYEFscmVhZHkgd2F0Y2hpbmcgc291cmNlcyBpbiAke3NyY0ZvbGRlcn0gZm9sZGVyYCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcnVuV2F0Y2goKSB7XG4gICAgICAgIGxldCBzb3VyY2VzID0gW2ZpbmRNYWluU291cmNlRm9sZGVyKHRoaXMuZmlsZXMpXTtcbiAgICAgICAgbGV0IHdhdGNoZXJSZWFkeSA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuaXNXYXRjaGluZyA9IHRydWU7XG5cbiAgICAgICAgbG9nZ2VyLmluZm8oYFdhdGNoaW5nIHNvdXJjZXMgaW4gJHtmaW5kTWFpblNvdXJjZUZvbGRlcih0aGlzLmZpbGVzKX0gZm9sZGVyYCk7XG5cbiAgICAgICAgaWYgKCRtYXJrZG93bmVuZ2luZS5oYXNSb290TWFya2Rvd25zKCkpIHtcbiAgICAgICAgICAgIHNvdXJjZXMgPSBzb3VyY2VzLmNvbmNhdCgkbWFya2Rvd25lbmdpbmUubGlzdFJvb3RNYXJrZG93bnMoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmluY2x1ZGVzICE9PSAnJykge1xuICAgICAgICAgICAgc291cmNlcyA9IHNvdXJjZXMuY29uY2F0KHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5pbmNsdWRlcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBhbGwgZWxlbWVudHMgb2Ygc291cmNlcyBsaXN0IGV4aXN0XG4gICAgICAgIHNvdXJjZXMgPSBjbGVhblNvdXJjZXNGb3JXYXRjaChzb3VyY2VzKTtcblxuICAgICAgICBsZXQgd2F0Y2hlciA9IGNob2tpZGFyLndhdGNoKHNvdXJjZXMsIHtcbiAgICAgICAgICAgIGF3YWl0V3JpdGVGaW5pc2g6IHRydWUsXG4gICAgICAgICAgICBpZ25vcmVJbml0aWFsOiB0cnVlLFxuICAgICAgICAgICAgaWdub3JlZDogLyhzcGVjfFxcLmQpXFwudHMvXG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgdGltZXJBZGRBbmRSZW1vdmVSZWY7XG4gICAgICAgIGxldCB0aW1lckNoYW5nZVJlZjtcbiAgICAgICAgbGV0IHJ1bm5lckFkZEFuZFJlbW92ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIHN0YXJ0VGltZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlKCk7XG4gICAgICAgIH07XG4gICAgICAgIGxldCB3YWl0ZXJBZGRBbmRSZW1vdmUgPSAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXJBZGRBbmRSZW1vdmVSZWYpO1xuICAgICAgICAgICAgdGltZXJBZGRBbmRSZW1vdmVSZWYgPSBzZXRUaW1lb3V0KHJ1bm5lckFkZEFuZFJlbW92ZSwgMTAwMCk7XG4gICAgICAgIH07XG4gICAgICAgIGxldCBydW5uZXJDaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgICAgICBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5zZXRVcGRhdGVkRmlsZXModGhpcy53YXRjaENoYW5nZWRGaWxlcyk7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNXYXRjaGVkRmlsZXNUU0ZpbGVzKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdldE1pY3JvRGVwZW5kZW5jaWVzRGF0YSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmhhc1dhdGNoZWRGaWxlc1Jvb3RNYXJrZG93bkZpbGVzKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlYnVpbGRSb290TWFya2Rvd25zKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucmVidWlsZEV4dGVybmFsRG9jdW1lbnRhdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBsZXQgd2FpdGVyQ2hhbmdlID0gKCkgPT4ge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyQ2hhbmdlUmVmKTtcbiAgICAgICAgICAgIHRpbWVyQ2hhbmdlUmVmID0gc2V0VGltZW91dChydW5uZXJDaGFuZ2UsIDEwMDApO1xuICAgICAgICB9O1xuXG4gICAgICAgIHdhdGNoZXIub24oJ3JlYWR5JywgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF3YXRjaGVyUmVhZHkpIHtcbiAgICAgICAgICAgICAgICB3YXRjaGVyUmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHdhdGNoZXJcbiAgICAgICAgICAgICAgICAgICAgLm9uKCdhZGQnLCBmaWxlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgRmlsZSAke2ZpbGV9IGhhcyBiZWVuIGFkZGVkYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUZXN0IGV4dGVuc2lvbiwgaWYgdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2NhbiBldmVyeXRoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGF0aC5leHRuYW1lKGZpbGUpID09PSAnLnRzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRlckFkZEFuZFJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAub24oJ2NoYW5nZScsIGZpbGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBGaWxlICR7ZmlsZX0gaGFzIGJlZW4gY2hhbmdlZGApO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGVzdCBleHRlbnNpb24sIGlmIHRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNjYW4gb25seSBmaWxlXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5leHRuYW1lKGZpbGUpID09PSAnLnRzJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguZXh0bmFtZShmaWxlKSA9PT0gJy5tZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmV4dG5hbWUoZmlsZSkgPT09ICcuanNvbidcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2F0Y2hDaGFuZ2VkRmlsZXMucHVzaChwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwICsgZmlsZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRlckNoYW5nZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAub24oJ3VubGluaycsIGZpbGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBGaWxlICR7ZmlsZX0gaGFzIGJlZW4gcmVtb3ZlZGApO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGVzdCBleHRlbnNpb24sIGlmIHRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNjYW4gZXZlcnl0aGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGguZXh0bmFtZShmaWxlKSA9PT0gJy50cycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0ZXJBZGRBbmRSZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgYXBwbGljYXRpb24gLyByb290IGNvbXBvbmVudCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBnZXQgYXBwbGljYXRpb24oKTogQXBwbGljYXRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBnZXQgaXNDTEkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4iLCJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5jb25zdCBnbG9iID0gcmVxdWlyZSgnZ2xvYicpO1xuXG5leHBvcnQgY2xhc3MgUGFyc2VyVXRpbCB7XG4gICAgcHJpdmF0ZSBfZmlsZXM7XG4gICAgcHJpdmF0ZSBfY3dkO1xuICAgIHByaXZhdGUgX2dsb2JGaWxlcyA9IFtdO1xuXG4gICAgcHVibGljIGluaXQoZXhjbHVkZTogc3RyaW5nW10sIGN3ZDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2ZpbGVzID0gZXhjbHVkZTtcbiAgICAgICAgdGhpcy5fY3dkID0gY3dkO1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGxldCBsZW4gPSBleGNsdWRlLmxlbmd0aDtcblxuICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdGhpcy5fZ2xvYkZpbGVzID0gWy4uLnRoaXMuX2dsb2JGaWxlcywgLi4uZ2xvYi5zeW5jKGV4Y2x1ZGVbaV0sIHsgY3dkOiB0aGlzLl9jd2QgfSldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHRlc3RGaWxlc1dpdGhDd2REZXB0aCgpIHtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBsZXQgbGVuID0gdGhpcy5fZmlsZXMubGVuZ3RoO1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAgc3RhdHVzOiB0cnVlLFxuICAgICAgICAgICAgbGV2ZWw6IDBcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBlbGVtZW50UGF0aCA9IHBhdGgucmVzb2x2ZSh0aGlzLl9jd2QgKyBwYXRoLnNlcCwgdGhpcy5fZmlsZXNbaV0pO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnRQYXRoLmluZGV4T2YodGhpcy5fY3dkKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgbGV0IGxldmVsID0gdGhpcy5fZmlsZXNbaV0ubWF0Y2goL1xcLi5cXC8vZykubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGlmIChsZXZlbCA+IHJlc3VsdC5sZXZlbCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQubGV2ZWwgPSBsZXZlbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlQ3dkKGN3ZCwgbGV2ZWwpIHtcbiAgICAgICAgbGV0IF9jd2QgPSBjd2QsXG4gICAgICAgICAgICBfcmV3aW5kID0gJyc7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGV2ZWw7IGkrKykge1xuICAgICAgICAgICAgX3Jld2luZCArPSAnLi4vJztcbiAgICAgICAgfVxuICAgICAgICBfY3dkID0gcGF0aC5yZXNvbHZlKF9jd2QsIF9yZXdpbmQpO1xuICAgICAgICByZXR1cm4gX2N3ZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgdGVzdEZpbGUoZmlsZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgbGV0IGxlbiA9IHRoaXMuX2ZpbGVzLmxlbmd0aDtcbiAgICAgICAgbGV0IGZpbGVCYXNlbmFtZSA9IHBhdGguYmFzZW5hbWUoZmlsZSk7XG4gICAgICAgIGxldCBmaWxlTmFtZUluQ3dkID0gZmlsZS5yZXBsYWNlKHRoaXMuX2N3ZCArIHBhdGguc2VwLCAnJyk7XG4gICAgICAgIGxldCByZXN1bHQgPSBmYWxzZTtcblxuICAgICAgICBpZiAocGF0aC5zZXAgPT09ICdcXFxcJykge1xuICAgICAgICAgICAgZmlsZU5hbWVJbkN3ZCA9IGZpbGVOYW1lSW5Dd2QucmVwbGFjZShuZXcgUmVnRXhwKCdcXFxcJyArIHBhdGguc2VwLCAnZycpLCAnLycpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChnbG9iLmhhc01hZ2ljKHRoaXMuX2ZpbGVzW2ldKSAmJiB0aGlzLl9nbG9iRmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCByZXN1bHRHbG9iU2VhcmNoID0gdGhpcy5fZ2xvYkZpbGVzLmZpbmRJbmRleChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1lbnRQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMuX2N3ZCArIHBhdGguc2VwLCBlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1lbnRQYXRoSW5Dd2QgPSBlbGVtZW50UGF0aC5yZXBsYWNlKHRoaXMuX2N3ZCArIHBhdGguc2VwLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRQYXRoSW5Dd2QgPSBlbGVtZW50UGF0aEluQ3dkLnJlcGxhY2UobmV3IFJlZ0V4cCgnXFxcXCcgKyBwYXRoLnNlcCwgJ2cnKSwgJy8nKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRQYXRoSW5Dd2QgPT09IGZpbGVOYW1lSW5Dd2Q7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0R2xvYlNlYXJjaCAhPT0gLTE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZpbGVOYW1lSW5Dd2QgPT09IHRoaXMuX2ZpbGVzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufSIsImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IEFwcGxpY2F0aW9uIH0gZnJvbSAnLi9hcHAvYXBwbGljYXRpb24nO1xuXG5pbXBvcnQgeyBDT01QT0RPQ19ERUZBVUxUUyB9IGZyb20gJy4vdXRpbHMvZGVmYXVsdHMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgcmVhZENvbmZpZywgaGFuZGxlUGF0aCB9IGZyb20gJy4vdXRpbHMvdXRpbHMnO1xuXG5pbXBvcnQgeyB0cyB9IGZyb20gJ3RzLXNpbXBsZS1hc3QnO1xuaW1wb3J0IHsgUGFyc2VyVXRpbCB9IGZyb20gJy4vdXRpbHMvcGFyc2VyLnV0aWwuY2xhc3MnO1xuXG5pbXBvcnQgSTE4bkVuZ2luZUluc3RhbmNlIGZyb20gJy4vYXBwL2VuZ2luZXMvaTE4bi5lbmdpbmUnO1xuXG5jb25zdCBwa2cgPSByZXF1aXJlKCcuLi9wYWNrYWdlLmpzb24nKTtcbmNvbnN0IHByb2dyYW0gPSByZXF1aXJlKCdjb21tYW5kZXInKTtcbmNvbnN0IG9zID0gcmVxdWlyZSgnb3MnKTtcbmNvbnN0IG9zTmFtZSA9IHJlcXVpcmUoJ29zLW5hbWUnKTtcbmNvbnN0IGNvc21pY29uZmlnID0gcmVxdWlyZSgnY29zbWljb25maWcnKTtcblxuY29uc3QgY29zbWljb25maWdNb2R1bGVOYW1lID0gJ2NvbXBvZG9jJztcblxubGV0IHNjYW5uZWRGaWxlcyA9IFtdO1xubGV0IGV4Y2x1ZGVGaWxlcztcbmxldCBpbmNsdWRlRmlsZXM7XG5sZXQgY3dkID0gcHJvY2Vzcy5jd2QoKTtcblxucHJvY2Vzcy5zZXRNYXhMaXN0ZW5lcnMoMCk7XG5cbmV4cG9ydCBjbGFzcyBDbGlBcHBsaWNhdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBSdW4gY29tcG9kb2MgZnJvbSB0aGUgY29tbWFuZCBsaW5lLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZW5lcmF0ZSgpOiBhbnkge1xuICAgICAgICBmdW5jdGlvbiBsaXN0KHZhbCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbC5zcGxpdCgnLCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvZ3JhbVxuICAgICAgICAgICAgLnZlcnNpb24ocGtnLnZlcnNpb24pXG4gICAgICAgICAgICAudXNhZ2UoJzxzcmM+IFtvcHRpb25zXScpXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctYywgLS1jb25maWcgW2NvbmZpZ10nLFxuICAgICAgICAgICAgICAgICdBIGNvbmZpZ3VyYXRpb24gZmlsZSA6IC5jb21wb2RvY3JjLCAuY29tcG9kb2NyYy5qc29uLCAuY29tcG9kb2NyYy55YW1sIG9yIGNvbXBvZG9jIHByb3BlcnR5IGluIHBhY2thZ2UuanNvbidcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oJy1wLCAtLXRzY29uZmlnIFtjb25maWddJywgJ0EgdHNjb25maWcuanNvbiBmaWxlJylcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy1kLCAtLW91dHB1dCBbZm9sZGVyXScsXG4gICAgICAgICAgICAgICAgJ1doZXJlIHRvIHN0b3JlIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbicsXG4gICAgICAgICAgICAgICAgQ09NUE9ET0NfREVGQVVMVFMuZm9sZGVyXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKCcteSwgLS1leHRUaGVtZSBbZmlsZV0nLCAnRXh0ZXJuYWwgc3R5bGluZyB0aGVtZSBmaWxlJylcbiAgICAgICAgICAgIC5vcHRpb24oJy1uLCAtLW5hbWUgW25hbWVdJywgJ1RpdGxlIGRvY3VtZW50YXRpb24nLCBDT01QT0RPQ19ERUZBVUxUUy50aXRsZSlcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy1hLCAtLWFzc2V0c0ZvbGRlciBbZm9sZGVyXScsXG4gICAgICAgICAgICAgICAgJ0V4dGVybmFsIGFzc2V0cyBmb2xkZXIgdG8gY29weSBpbiBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiBmb2xkZXInXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKCctbywgLS1vcGVuIFt2YWx1ZV0nLCAnT3BlbiB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24nKVxuICAgICAgICAgICAgLm9wdGlvbihcbiAgICAgICAgICAgICAgICAnLXQsIC0tc2lsZW50JyxcbiAgICAgICAgICAgICAgICBcIkluIHNpbGVudCBtb2RlLCBsb2cgbWVzc2FnZXMgYXJlbid0IGxvZ2dlZCBpbiB0aGUgY29uc29sZVwiLFxuICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctcywgLS1zZXJ2ZScsXG4gICAgICAgICAgICAgICAgJ1NlcnZlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIChkZWZhdWx0IGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8pJyxcbiAgICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm9wdGlvbignLXIsIC0tcG9ydCBbcG9ydF0nLCAnQ2hhbmdlIGRlZmF1bHQgc2VydmluZyBwb3J0JywgQ09NUE9ET0NfREVGQVVMVFMucG9ydClcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy13LCAtLXdhdGNoJyxcbiAgICAgICAgICAgICAgICAnV2F0Y2ggc291cmNlIGZpbGVzIGFmdGVyIHNlcnZlIGFuZCBmb3JjZSBkb2N1bWVudGF0aW9uIHJlYnVpbGQnLFxuICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctZSwgLS1leHBvcnRGb3JtYXQgW2Zvcm1hdF0nLFxuICAgICAgICAgICAgICAgICdFeHBvcnQgaW4gc3BlY2lmaWVkIGZvcm1hdCAoanNvbiwgaHRtbCknLFxuICAgICAgICAgICAgICAgIENPTVBPRE9DX0RFRkFVTFRTLmV4cG9ydEZvcm1hdFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm9wdGlvbignLS1sYW5ndWFnZSBbbGFuZ3VhZ2VdJywgJ0xhbmd1YWdlIHVzZWQgZm9yIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiAoZW4tVVMsIGZyLUZSLCB6aC1DTiknLCBDT01QT0RPQ19ERUZBVUxUUy5sYW5ndWFnZSlcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy0tdGhlbWUgW3RoZW1lXScsXG4gICAgICAgICAgICAgICAgXCJDaG9vc2Ugb25lIG9mIGF2YWlsYWJsZSB0aGVtZXMsIGRlZmF1bHQgaXMgJ2dpdGJvb2snIChsYXJhdmVsLCBvcmlnaW5hbCwgbWF0ZXJpYWwsIHBvc3RtYXJrLCByZWFkdGhlZG9jcywgc3RyaXBlLCB2YWdyYW50KVwiXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctLWhpZGVHZW5lcmF0b3InLFxuICAgICAgICAgICAgICAgICdEbyBub3QgcHJpbnQgdGhlIENvbXBvZG9jIGxpbmsgYXQgdGhlIGJvdHRvbSBvZiB0aGUgcGFnZScsXG4gICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy0tdG9nZ2xlTWVudUl0ZW1zIDxpdGVtcz4nLFxuICAgICAgICAgICAgICAgIFwiQ2xvc2UgYnkgZGVmYXVsdCBpdGVtcyBpbiB0aGUgbWVudSB2YWx1ZXMgOiBbJ2FsbCddIG9yIG9uZSBvZiB0aGVzZSBbJ21vZHVsZXMnLCdjb21wb25lbnRzJywnZGlyZWN0aXZlcycsJ2NsYXNzZXMnLCdpbmplY3RhYmxlcycsJ2ludGVyZmFjZXMnLCdwaXBlcycsJ2FkZGl0aW9uYWxQYWdlcyddXCIsXG4gICAgICAgICAgICAgICAgbGlzdCxcbiAgICAgICAgICAgICAgICBDT01QT0RPQ19ERUZBVUxUUy50b2dnbGVNZW51SXRlbXNcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy0tbmF2VGFiQ29uZmlnIDx0YWIgY29uZmlncz4nLFxuICAgICAgICAgICAgICAgIGBMaXN0IG5hdmlnYXRpb24gdGFiIG9iamVjdHMgaW4gdGhlIGRlc2lyZWQgb3JkZXIgd2l0aCB0d28gc3RyaW5nIHByb3BlcnRpZXMgKFwiaWRcIiBhbmQgXCJsYWJlbFwiKS4gXFxcbkRvdWJsZS1xdW90ZXMgbXVzdCBiZSBlc2NhcGVkIHdpdGggJ1xcXFwnLiBcXFxuQXZhaWxhYmxlIHRhYiBJRHMgYXJlIFwiaW5mb1wiLCBcInJlYWRtZVwiLCBcInNvdXJjZVwiLCBcInRlbXBsYXRlRGF0YVwiLCBcInRyZWVcIiwgYW5kIFwiZXhhbXBsZVwiLiBcXFxuTm90ZTogQ2VydGFpbiB0YWJzIHdpbGwgb25seSBiZSBzaG93biBpZiBhcHBsaWNhYmxlIHRvIGEgZ2l2ZW4gZGVwZW5kZW5jeWAsXG4gICAgICAgICAgICAgICAgbGlzdCxcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShDT01QT0RPQ19ERUZBVUxUUy5uYXZUYWJDb25maWcpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctLXRlbXBsYXRlcyBbZm9sZGVyXScsXG4gICAgICAgICAgICAgICAgJ1BhdGggdG8gZGlyZWN0b3J5IG9mIEhhbmRsZWJhcnMgdGVtcGxhdGVzIHRvIG92ZXJyaWRlIGJ1aWx0LWluIHRlbXBsYXRlcydcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oJy0taW5jbHVkZXMgW3BhdGhdJywgJ1BhdGggb2YgZXh0ZXJuYWwgbWFya2Rvd24gZmlsZXMgdG8gaW5jbHVkZScpXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctLWluY2x1ZGVzTmFtZSBbbmFtZV0nLFxuICAgICAgICAgICAgICAgICdOYW1lIG9mIGl0ZW0gbWVudSBvZiBleHRlcm5hbHMgbWFya2Rvd24gZmlsZXMnLFxuICAgICAgICAgICAgICAgIENPTVBPRE9DX0RFRkFVTFRTLmFkZGl0aW9uYWxFbnRyeU5hbWVcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy0tY292ZXJhZ2VUZXN0IFt0aHJlc2hvbGRdJyxcbiAgICAgICAgICAgICAgICAnVGVzdCBjb21tYW5kIG9mIGRvY3VtZW50YXRpb24gY292ZXJhZ2Ugd2l0aCBhIHRocmVzaG9sZCAoZGVmYXVsdCA3MCknXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctLWNvdmVyYWdlTWluaW11bVBlckZpbGUgW21pbmltdW1dJyxcbiAgICAgICAgICAgICAgICAnVGVzdCBjb21tYW5kIG9mIGRvY3VtZW50YXRpb24gY292ZXJhZ2UgcGVyIGZpbGUgd2l0aCBhIG1pbmltdW0gKGRlZmF1bHQgMCknXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctLWNvdmVyYWdlVGVzdFRocmVzaG9sZEZhaWwgW3RydWV8ZmFsc2VdJyxcbiAgICAgICAgICAgICAgICAnVGVzdCBjb21tYW5kIG9mIGRvY3VtZW50YXRpb24gY292ZXJhZ2UgKGdsb2JhbCBvciBwZXIgZmlsZSkgd2lsbCBmYWlsIHdpdGggZXJyb3Igb3IganVzdCB3YXJuIHVzZXIgKHRydWU6IGVycm9yLCBmYWxzZTogd2FybiknLFxuICAgICAgICAgICAgICAgIENPTVBPRE9DX0RFRkFVTFRTLmNvdmVyYWdlVGVzdFRocmVzaG9sZEZhaWxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oJy0tY292ZXJhZ2VUZXN0U2hvd09ubHlGYWlsZWQnLCAnRGlzcGxheSBvbmx5IGZhaWxlZCBmaWxlcyBmb3IgYSBjb3ZlcmFnZSB0ZXN0JylcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy0tdW5pdFRlc3RDb3ZlcmFnZSBbanNvbi1zdW1tYXJ5XScsXG4gICAgICAgICAgICAgICAgJ1RvIGluY2x1ZGUgdW5pdCB0ZXN0IGNvdmVyYWdlLCBzcGVjaWZ5IGlzdGFuYnVsIEpTT04gY292ZXJhZ2Ugc3VtbWFyeSBmaWxlJ1xuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm9wdGlvbihcbiAgICAgICAgICAgICAgICAnLS1kaXNhYmxlU291cmNlQ29kZScsXG4gICAgICAgICAgICAgICAgJ0RvIG5vdCBhZGQgc291cmNlIGNvZGUgdGFiIGFuZCBsaW5rcyB0byBzb3VyY2UgY29kZScsXG4gICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZGlzYWJsZURvbVRyZWUnLCAnRG8gbm90IGFkZCBkb20gdHJlZSB0YWInLCBmYWxzZSlcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZGlzYWJsZVRlbXBsYXRlVGFiJywgJ0RvIG5vdCBhZGQgdGVtcGxhdGUgdGFiJywgZmFsc2UpXG4gICAgICAgICAgICAub3B0aW9uKCctLWRpc2FibGVHcmFwaCcsICdEbyBub3QgYWRkIHRoZSBkZXBlbmRlbmN5IGdyYXBoJywgZmFsc2UpXG4gICAgICAgICAgICAub3B0aW9uKCctLWRpc2FibGVDb3ZlcmFnZScsICdEbyBub3QgYWRkIHRoZSBkb2N1bWVudGF0aW9uIGNvdmVyYWdlIHJlcG9ydCcsIGZhbHNlKVxuICAgICAgICAgICAgLm9wdGlvbignLS1kaXNhYmxlUHJpdmF0ZScsICdEbyBub3Qgc2hvdyBwcml2YXRlIGluIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uJywgZmFsc2UpXG4gICAgICAgICAgICAub3B0aW9uKCctLWRpc2FibGVQcm90ZWN0ZWQnLCAnRG8gbm90IHNob3cgcHJvdGVjdGVkIGluIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uJywgZmFsc2UpXG4gICAgICAgICAgICAub3B0aW9uKCctLWRpc2FibGVJbnRlcm5hbCcsICdEbyBub3Qgc2hvdyBAaW50ZXJuYWwgaW4gZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24nLCBmYWxzZSlcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy0tZGlzYWJsZUxpZmVDeWNsZUhvb2tzJyxcbiAgICAgICAgICAgICAgICAnRG8gbm90IHNob3cgQW5ndWxhciBsaWZlY3ljbGUgaG9va3MgaW4gZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24nLFxuICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctLWRpc2FibGVSb3V0ZXNHcmFwaCcsXG4gICAgICAgICAgICAgICAgJ0RvIG5vdCBhZGQgdGhlIHJvdXRlcyBncmFwaCcsXG4gICAgICAgICAgICAgICAgQ09NUE9ET0NfREVGQVVMVFMuZGlzYWJsZVJvdXRlc0dyYXBoXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKCctLWRpc2FibGVTZWFyY2gnLCAnRG8gbm90IGFkZCB0aGUgc2VhcmNoIGlucHV0JywgZmFsc2UpXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctLW1pbmltYWwnLFxuICAgICAgICAgICAgICAgICdNaW5pbWFsIG1vZGUgd2l0aCBvbmx5IGRvY3VtZW50YXRpb24uIE5vIHNlYXJjaCwgbm8gZ3JhcGgsIG5vIGNvdmVyYWdlLicsXG4gICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oJy0tY3VzdG9tRmF2aWNvbiBbcGF0aF0nLCAnVXNlIGEgY3VzdG9tIGZhdmljb24nKVxuICAgICAgICAgICAgLm9wdGlvbignLS1nYUlEIFtpZF0nLCAnR29vZ2xlIEFuYWx5dGljcyB0cmFja2luZyBJRCcpXG4gICAgICAgICAgICAub3B0aW9uKCctLWdhU2l0ZSBbc2l0ZV0nLCAnR29vZ2xlIEFuYWx5dGljcyBzaXRlIG5hbWUnLCBDT01QT0RPQ19ERUZBVUxUUy5nYVNpdGUpXG4gICAgICAgICAgICAucGFyc2UocHJvY2Vzcy5hcmd2KTtcblxuICAgICAgICBsZXQgb3V0cHV0SGVscCA9ICgpID0+IHtcbiAgICAgICAgICAgIHByb2dyYW0ub3V0cHV0SGVscCgpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGNvbmZpZ0V4cGxvcmVyID0gY29zbWljb25maWcoY29zbWljb25maWdNb2R1bGVOYW1lKTtcblxuICAgICAgICBsZXQgY29uZmlnRXhwbG9yZXJSZXN1bHQ7XG5cbiAgICAgICAgbGV0IGNvbmZpZ0ZpbGUgPSB7fTtcblxuICAgICAgICBpZiAocHJvZ3JhbS5jb25maWcpIHtcbiAgICAgICAgICAgIGxldCBjb25maWdGaWxlUGF0aCA9IHByb2dyYW0uY29uZmlnO1xuICAgICAgICAgICAgbGV0IHRlc3RDb25maWdGaWxlUGF0aCA9IGNvbmZpZ0ZpbGVQYXRoLm1hdGNoKHByb2Nlc3MuY3dkKCkpO1xuICAgICAgICAgICAgaWYgKHRlc3RDb25maWdGaWxlUGF0aCAmJiB0ZXN0Q29uZmlnRmlsZVBhdGgubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbmZpZ0ZpbGVQYXRoID0gY29uZmlnRmlsZVBhdGgucmVwbGFjZShwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXAsICcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbmZpZ0V4cGxvcmVyUmVzdWx0ID0gY29uZmlnRXhwbG9yZXIubG9hZFN5bmMocGF0aC5yZXNvbHZlKGNvbmZpZ0ZpbGVQYXRoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25maWdFeHBsb3JlclJlc3VsdCA9IGNvbmZpZ0V4cGxvcmVyLnNlYXJjaFN5bmMoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnRXhwbG9yZXJSZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uZmlnRXhwbG9yZXJSZXN1bHQuY29uZmlnICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGNvbmZpZ0ZpbGUgPSBjb25maWdFeHBsb3JlclJlc3VsdC5jb25maWc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5vdXRwdXQpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQgPSBjb25maWdGaWxlLm91dHB1dDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbS5vdXRwdXQgJiYgcHJvZ3JhbS5vdXRwdXQgIT09IENPTVBPRE9DX0RFRkFVTFRTLmZvbGRlcikge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dCA9IHByb2dyYW0ub3V0cHV0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuZXh0VGhlbWUpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5leHRUaGVtZSA9IGNvbmZpZ0ZpbGUuZXh0VGhlbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW0uZXh0VGhlbWUpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5leHRUaGVtZSA9IHByb2dyYW0uZXh0VGhlbWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5sYW5ndWFnZSkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmxhbmd1YWdlID0gY29uZmlnRmlsZS5sYW5ndWFnZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbS5sYW5ndWFnZSkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmxhbmd1YWdlID0gcHJvZ3JhbS5sYW5ndWFnZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLnRoZW1lKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEudGhlbWUgPSBjb25maWdGaWxlLnRoZW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtLnRoZW1lKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEudGhlbWUgPSBwcm9ncmFtLnRoZW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUubmFtZSkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRvY3VtZW50YXRpb25NYWluTmFtZSA9IGNvbmZpZ0ZpbGUubmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbS5uYW1lICYmIHByb2dyYW0ubmFtZSAhPT0gQ09NUE9ET0NfREVGQVVMVFMudGl0bGUpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kb2N1bWVudGF0aW9uTWFpbk5hbWUgPSBwcm9ncmFtLm5hbWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5hc3NldHNGb2xkZXIpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5hc3NldHNGb2xkZXIgPSBjb25maWdGaWxlLmFzc2V0c0ZvbGRlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbS5hc3NldHNGb2xkZXIpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5hc3NldHNGb2xkZXIgPSBwcm9ncmFtLmFzc2V0c0ZvbGRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLm9wZW4pIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5vcGVuID0gY29uZmlnRmlsZS5vcGVuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtLm9wZW4pIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5vcGVuID0gcHJvZ3JhbS5vcGVuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUudG9nZ2xlTWVudUl0ZW1zKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEudG9nZ2xlTWVudUl0ZW1zID0gY29uZmlnRmlsZS50b2dnbGVNZW51SXRlbXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcHJvZ3JhbS50b2dnbGVNZW51SXRlbXMgJiZcbiAgICAgICAgICAgIHByb2dyYW0udG9nZ2xlTWVudUl0ZW1zICE9PSBDT01QT0RPQ19ERUZBVUxUUy50b2dnbGVNZW51SXRlbXNcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEudG9nZ2xlTWVudUl0ZW1zID0gcHJvZ3JhbS50b2dnbGVNZW51SXRlbXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS50ZW1wbGF0ZXMpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS50ZW1wbGF0ZXMgPSBjb25maWdGaWxlLnRlbXBsYXRlcztcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbS50ZW1wbGF0ZXMpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS50ZW1wbGF0ZXMgPSBwcm9ncmFtLnRlbXBsYXRlcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLm5hdlRhYkNvbmZpZykge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLm5hdlRhYkNvbmZpZyA9IGNvbmZpZ0ZpbGUubmF2VGFiQ29uZmlnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHByb2dyYW0ubmF2VGFiQ29uZmlnICYmXG4gICAgICAgICAgICBKU09OLnBhcnNlKHByb2dyYW0ubmF2VGFiQ29uZmlnKS5sZW5ndGggIT09IENPTVBPRE9DX0RFRkFVTFRTLm5hdlRhYkNvbmZpZy5sZW5ndGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEubmF2VGFiQ29uZmlnID0gSlNPTi5wYXJzZShwcm9ncmFtLm5hdlRhYkNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5pbmNsdWRlcykge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmluY2x1ZGVzID0gY29uZmlnRmlsZS5pbmNsdWRlcztcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbS5pbmNsdWRlcykge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmluY2x1ZGVzID0gcHJvZ3JhbS5pbmNsdWRlcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmluY2x1ZGVzTmFtZSkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmluY2x1ZGVzTmFtZSA9IGNvbmZpZ0ZpbGUuaW5jbHVkZXNOYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHByb2dyYW0uaW5jbHVkZXNOYW1lICYmXG4gICAgICAgICAgICBwcm9ncmFtLmluY2x1ZGVzTmFtZSAhPT0gQ09NUE9ET0NfREVGQVVMVFMuYWRkaXRpb25hbEVudHJ5TmFtZVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5pbmNsdWRlc05hbWUgPSBwcm9ncmFtLmluY2x1ZGVzTmFtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLnNpbGVudCkge1xuICAgICAgICAgICAgbG9nZ2VyLnNpbGVudCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtLnNpbGVudCkge1xuICAgICAgICAgICAgbG9nZ2VyLnNpbGVudCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuc2VydmUpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5zZXJ2ZSA9IGNvbmZpZ0ZpbGUuc2VydmU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW0uc2VydmUpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5zZXJ2ZSA9IHByb2dyYW0uc2VydmU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5wb3J0KSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEucG9ydCA9IGNvbmZpZ0ZpbGUucG9ydDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbS5wb3J0ICYmIHByb2dyYW0ucG9ydCAhPT0gQ09NUE9ET0NfREVGQVVMVFMucG9ydCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLnBvcnQgPSBwcm9ncmFtLnBvcnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS53YXRjaCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLndhdGNoID0gY29uZmlnRmlsZS53YXRjaDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbS53YXRjaCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLndhdGNoID0gcHJvZ3JhbS53YXRjaDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmV4cG9ydEZvcm1hdCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmV4cG9ydEZvcm1hdCA9IGNvbmZpZ0ZpbGUuZXhwb3J0Rm9ybWF0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtLmV4cG9ydEZvcm1hdCAmJiBwcm9ncmFtLmV4cG9ydEZvcm1hdCAhPT0gQ09NUE9ET0NfREVGQVVMVFMuZXhwb3J0Rm9ybWF0KSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZXhwb3J0Rm9ybWF0ID0gcHJvZ3JhbS5leHBvcnRGb3JtYXQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5oaWRlR2VuZXJhdG9yKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaGlkZUdlbmVyYXRvciA9IGNvbmZpZ0ZpbGUuaGlkZUdlbmVyYXRvcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbS5oaWRlR2VuZXJhdG9yKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaGlkZUdlbmVyYXRvciA9IHByb2dyYW0uaGlkZUdlbmVyYXRvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmNvdmVyYWdlVGVzdCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0VGhyZXNob2xkID1cbiAgICAgICAgICAgICAgICB0eXBlb2YgY29uZmlnRmlsZS5jb3ZlcmFnZVRlc3QgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQoY29uZmlnRmlsZS5jb3ZlcmFnZVRlc3QsIDEwKVxuICAgICAgICAgICAgICAgICAgICA6IENPTVBPRE9DX0RFRkFVTFRTLmRlZmF1bHRDb3ZlcmFnZVRocmVzaG9sZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbS5jb3ZlcmFnZVRlc3QpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3QgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdFRocmVzaG9sZCA9XG4gICAgICAgICAgICAgICAgdHlwZW9mIHByb2dyYW0uY292ZXJhZ2VUZXN0ID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgICAgICA/IHBhcnNlSW50KHByb2dyYW0uY292ZXJhZ2VUZXN0LCAxMClcbiAgICAgICAgICAgICAgICAgICAgOiBDT01QT0RPQ19ERUZBVUxUUy5kZWZhdWx0Q292ZXJhZ2VUaHJlc2hvbGQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5jb3ZlcmFnZU1pbmltdW1QZXJGaWxlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0UGVyRmlsZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VNaW5pbXVtUGVyRmlsZSA9XG4gICAgICAgICAgICAgICAgdHlwZW9mIGNvbmZpZ0ZpbGUuY292ZXJhZ2VNaW5pbXVtUGVyRmlsZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICAgICAgPyBwYXJzZUludChjb25maWdGaWxlLmNvdmVyYWdlTWluaW11bVBlckZpbGUsIDEwKVxuICAgICAgICAgICAgICAgICAgICA6IENPTVBPRE9DX0RFRkFVTFRTLmRlZmF1bHRDb3ZlcmFnZU1pbmltdW1QZXJGaWxlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtLmNvdmVyYWdlTWluaW11bVBlckZpbGUpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RQZXJGaWxlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZU1pbmltdW1QZXJGaWxlID1cbiAgICAgICAgICAgICAgICB0eXBlb2YgcHJvZ3JhbS5jb3ZlcmFnZU1pbmltdW1QZXJGaWxlID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgICAgICA/IHBhcnNlSW50KHByb2dyYW0uY292ZXJhZ2VNaW5pbXVtUGVyRmlsZSwgMTApXG4gICAgICAgICAgICAgICAgICAgIDogQ09NUE9ET0NfREVGQVVMVFMuZGVmYXVsdENvdmVyYWdlTWluaW11bVBlckZpbGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGRGYWlsKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0VGhyZXNob2xkRmFpbCA9XG4gICAgICAgICAgICAgICAgY29uZmlnRmlsZS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGRGYWlsID09PSAnZmFsc2UnID8gZmFsc2UgOiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtLmNvdmVyYWdlVGVzdFRocmVzaG9sZEZhaWwpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGRGYWlsID1cbiAgICAgICAgICAgICAgICBwcm9ncmFtLmNvdmVyYWdlVGVzdFRocmVzaG9sZEZhaWwgPT09ICdmYWxzZScgPyBmYWxzZSA6IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5jb3ZlcmFnZVRlc3RTaG93T25seUZhaWxlZCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdFNob3dPbmx5RmFpbGVkID1cbiAgICAgICAgICAgICAgICBjb25maWdGaWxlLmNvdmVyYWdlVGVzdFNob3dPbmx5RmFpbGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtLmNvdmVyYWdlVGVzdFNob3dPbmx5RmFpbGVkKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0U2hvd09ubHlGYWlsZWQgPVxuICAgICAgICAgICAgICAgIHByb2dyYW0uY292ZXJhZ2VUZXN0U2hvd09ubHlGYWlsZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS51bml0VGVzdENvdmVyYWdlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEudW5pdFRlc3RDb3ZlcmFnZSA9IGNvbmZpZ0ZpbGUudW5pdFRlc3RDb3ZlcmFnZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbS51bml0VGVzdENvdmVyYWdlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEudW5pdFRlc3RDb3ZlcmFnZSA9IHByb2dyYW0udW5pdFRlc3RDb3ZlcmFnZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmRpc2FibGVTb3VyY2VDb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVNvdXJjZUNvZGUgPSBjb25maWdGaWxlLmRpc2FibGVTb3VyY2VDb2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtLmRpc2FibGVTb3VyY2VDb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVNvdXJjZUNvZGUgPSBwcm9ncmFtLmRpc2FibGVTb3VyY2VDb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuZGlzYWJsZURvbVRyZWUpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlRG9tVHJlZSA9IGNvbmZpZ0ZpbGUuZGlzYWJsZURvbVRyZWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW0uZGlzYWJsZURvbVRyZWUpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlRG9tVHJlZSA9IHByb2dyYW0uZGlzYWJsZURvbVRyZWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlVGVtcGxhdGVUYWIpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlVGVtcGxhdGVUYWIgPSBjb25maWdGaWxlLmRpc2FibGVUZW1wbGF0ZVRhYjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbS5kaXNhYmxlVGVtcGxhdGVUYWIpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlVGVtcGxhdGVUYWIgPSBwcm9ncmFtLmRpc2FibGVUZW1wbGF0ZVRhYjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmRpc2FibGVHcmFwaCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVHcmFwaCA9IGNvbmZpZ0ZpbGUuZGlzYWJsZUdyYXBoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtLmRpc2FibGVHcmFwaCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVHcmFwaCA9IHByb2dyYW0uZGlzYWJsZUdyYXBoO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuZGlzYWJsZUNvdmVyYWdlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUNvdmVyYWdlID0gY29uZmlnRmlsZS5kaXNhYmxlQ292ZXJhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW0uZGlzYWJsZUNvdmVyYWdlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUNvdmVyYWdlID0gcHJvZ3JhbS5kaXNhYmxlQ292ZXJhZ2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlUHJpdmF0ZSkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVQcml2YXRlID0gY29uZmlnRmlsZS5kaXNhYmxlUHJpdmF0ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbS5kaXNhYmxlUHJpdmF0ZSkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVQcml2YXRlID0gcHJvZ3JhbS5kaXNhYmxlUHJpdmF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmRpc2FibGVQcm90ZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlUHJvdGVjdGVkID0gY29uZmlnRmlsZS5kaXNhYmxlUHJvdGVjdGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtLmRpc2FibGVQcm90ZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlUHJvdGVjdGVkID0gcHJvZ3JhbS5kaXNhYmxlUHJvdGVjdGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuZGlzYWJsZUludGVybmFsKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUludGVybmFsID0gY29uZmlnRmlsZS5kaXNhYmxlSW50ZXJuYWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW0uZGlzYWJsZUludGVybmFsKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUludGVybmFsID0gcHJvZ3JhbS5kaXNhYmxlSW50ZXJuYWw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlTGlmZUN5Y2xlSG9va3MpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlTGlmZUN5Y2xlSG9va3MgPSBjb25maWdGaWxlLmRpc2FibGVMaWZlQ3ljbGVIb29rcztcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbS5kaXNhYmxlTGlmZUN5Y2xlSG9va3MpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlTGlmZUN5Y2xlSG9va3MgPSBwcm9ncmFtLmRpc2FibGVMaWZlQ3ljbGVIb29rcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmRpc2FibGVSb3V0ZXNHcmFwaCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVSb3V0ZXNHcmFwaCA9IGNvbmZpZ0ZpbGUuZGlzYWJsZVJvdXRlc0dyYXBoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtLmRpc2FibGVSb3V0ZXNHcmFwaCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVSb3V0ZXNHcmFwaCA9IHByb2dyYW0uZGlzYWJsZVJvdXRlc0dyYXBoO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuZGlzYWJsZVNlYXJjaCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVTZWFyY2ggPSBjb25maWdGaWxlLmRpc2FibGVTZWFyY2g7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW0uZGlzYWJsZVNlYXJjaCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVTZWFyY2ggPSBwcm9ncmFtLmRpc2FibGVTZWFyY2g7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5taW5pbWFsKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVNlYXJjaCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVJvdXRlc0dyYXBoID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlR3JhcGggPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVDb3ZlcmFnZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW0ubWluaW1hbCkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVTZWFyY2ggPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVSb3V0ZXNHcmFwaCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUdyYXBoID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlQ292ZXJhZ2UgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuY3VzdG9tRmF2aWNvbikge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmN1c3RvbUZhdmljb24gPSBjb25maWdGaWxlLmN1c3RvbUZhdmljb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW0uY3VzdG9tRmF2aWNvbikge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmN1c3RvbUZhdmljb24gPSBwcm9ncmFtLmN1c3RvbUZhdmljb247XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5nYUlEKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZ2FJRCA9IGNvbmZpZ0ZpbGUuZ2FJRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbS5nYUlEKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZ2FJRCA9IHByb2dyYW0uZ2FJRDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmdhU2l0ZSkge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLmdhU2l0ZSA9IGNvbmZpZ0ZpbGUuZ2FTaXRlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtLmdhU2l0ZSAmJiBwcm9ncmFtLmdhU2l0ZSAhPT0gQ09NUE9ET0NfREVGQVVMVFMuZ2FTaXRlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZ2FTaXRlID0gcHJvZ3JhbS5nYVNpdGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuaXNXYXRjaGluZykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi9zcmMvYmFubmVyJykpLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgY29uc29sZS5sb2cocGtnLnZlcnNpb24pO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFR5cGVzY3JpcHQgdmVyc2lvbiA6ICR7dHMudmVyc2lvbn1gKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBOb2RlLmpzIHZlcnNpb24gOiAke3Byb2Nlc3MudmVyc2lvbn1gKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBPcGVyYXRpbmcgc3lzdGVtIDogJHtvc05hbWUob3MucGxhdGZvcm0oKSwgb3MucmVsZWFzZSgpKX1gKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdFeHBsb3JlclJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25maWdFeHBsb3JlclJlc3VsdC5jb25maWcgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYFVzaW5nIGNvbmZpZ3VyYXRpb24gZmlsZSA6ICR7Y29uZmlnRXhwbG9yZXJSZXN1bHQuZmlsZXBhdGh9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNvbmZpZ0V4cGxvcmVyUmVzdWx0KSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihgTm8gY29uZmlndXJhdGlvbiBmaWxlIGZvdW5kLCBzd2l0Y2hpbmcgdG8gQ0xJIGZsYWdzLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb2dyYW0ubGFuZ3VhZ2UgJiYgIUkxOG5FbmdpbmVJbnN0YW5jZS5zdXBwb3J0TGFuZ3VhZ2UocHJvZ3JhbS5sYW5ndWFnZSkpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKGBUaGUgbGFuZ3VhZ2UgJHtwcm9ncmFtLmxhbmd1YWdlfSBpcyBub3QgYXZhaWxhYmxlLCBmYWxsaW5nIGJhY2sgdG8gJHtJMThuRW5naW5lSW5zdGFuY2UuZmFsbGJhY2tMYW5ndWFnZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9ncmFtLnRzY29uZmlnICYmIHR5cGVvZiBwcm9ncmFtLnRzY29uZmlnID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgUGxlYXNlIHByb3ZpZGUgYSB0c2NvbmZpZyBmaWxlLmApO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUudHNjb25maWcpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZyA9IGNvbmZpZ0ZpbGUudHNjb25maWc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW0udHNjb25maWcpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZyA9IHByb2dyYW0udHNjb25maWc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5maWxlcykge1xuICAgICAgICAgICAgc2Nhbm5lZEZpbGVzID0gY29uZmlnRmlsZS5maWxlcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnRmlsZS5leGNsdWRlKSB7XG4gICAgICAgICAgICBleGNsdWRlRmlsZXMgPSBjb25maWdGaWxlLmV4Y2x1ZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuaW5jbHVkZSkge1xuICAgICAgICAgICAgaW5jbHVkZUZpbGVzID0gY29uZmlnRmlsZS5pbmNsdWRlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb2dyYW0uc2VydmUgJiYgIXRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZyAmJiBwcm9ncmFtLm91dHB1dCkge1xuICAgICAgICAgICAgLy8gaWYgLXMgJiAtZCwgc2VydmUgaXRcbiAgICAgICAgICAgIGlmICghdGhpcy5maWxlRW5naW5lLmV4aXN0c1N5bmMocHJvZ3JhbS5vdXRwdXQpKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGAke3Byb2dyYW0ub3V0cHV0fSBmb2xkZXIgZG9lc24ndCBleGlzdGApO1xuICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgIGBTZXJ2aW5nIGRvY3VtZW50YXRpb24gZnJvbSAke3Byb2dyYW0ub3V0cHV0fSBhdCBodHRwOi8vMTI3LjAuMC4xOiR7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtLnBvcnRcbiAgICAgICAgICAgICAgICAgICAgfWBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHN1cGVyLnJ1bldlYlNlcnZlcihwcm9ncmFtLm91dHB1dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocHJvZ3JhbS5zZXJ2ZSAmJiAhdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLnRzY29uZmlnICYmICFwcm9ncmFtLm91dHB1dCkge1xuICAgICAgICAgICAgLy8gaWYgb25seSAtcyBmaW5kIC4vZG9jdW1lbnRhdGlvbiwgaWYgb2sgc2VydmUsIGVsc2UgZXJyb3IgcHJvdmlkZSAtZFxuICAgICAgICAgICAgaWYgKCF0aGlzLmZpbGVFbmdpbmUuZXhpc3RzU3luYyhwcm9ncmFtLm91dHB1dCkpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ1Byb3ZpZGUgb3V0cHV0IGdlbmVyYXRlZCBmb2xkZXIgd2l0aCAtZCBmbGFnJyk7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgYFNlcnZpbmcgZG9jdW1lbnRhdGlvbiBmcm9tICR7cHJvZ3JhbS5vdXRwdXR9IGF0IGh0dHA6Ly8xMjcuMC4wLjE6JHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW0ucG9ydFxuICAgICAgICAgICAgICAgICAgICB9YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgc3VwZXIucnVuV2ViU2VydmVyKHByb2dyYW0ub3V0cHV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChwcm9ncmFtLmhpZGVHZW5lcmF0b3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaGlkZUdlbmVyYXRvciA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEudHNjb25maWcgJiYgcHJvZ3JhbS5hcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIHRzY29uZmlnIGZpbGUgcHJvdmlkZWQgb25seVxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGxldCB0ZXN0VHNDb25maWdQYXRoID0gdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLnRzY29uZmlnLmluZGV4T2YocHJvY2Vzcy5jd2QoKSk7XG4gICAgICAgICAgICAgICAgaWYgKHRlc3RUc0NvbmZpZ1BhdGggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZyA9IHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZy5yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwLFxuICAgICAgICAgICAgICAgICAgICAgICAgJydcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZmlsZUVuZ2luZS5leGlzdHNTeW5jKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZykpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgYFwiJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEudHNjb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIiBmaWxlIHdhcyBub3QgZm91bmQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5YFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IF9maWxlID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5kaXJuYW1lKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZylcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmJhc2VuYW1lKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZylcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBvZiB0c2NvbmZpZy5qc29uIGFzIGEgd29ya2luZyBkaXJlY3RvcnlcbiAgICAgICAgICAgICAgICAgICAgY3dkID0gX2ZpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zcGxpdChwYXRoLnNlcClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zbGljZSgwLCAtMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKHBhdGguc2VwKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ1VzaW5nIHRzY29uZmlnIGZpbGUgJywgX2ZpbGUpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCB0c0NvbmZpZ0ZpbGUgPSByZWFkQ29uZmlnKF9maWxlKTtcbiAgICAgICAgICAgICAgICAgICAgc2Nhbm5lZEZpbGVzID0gdHNDb25maWdGaWxlLmZpbGVzO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2Nhbm5lZEZpbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY2FubmVkRmlsZXMgPSBoYW5kbGVQYXRoKHNjYW5uZWRGaWxlcywgY3dkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2Nhbm5lZEZpbGVzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZUZpbGVzID0gdHNDb25maWdGaWxlLmV4Y2x1ZGUgfHwgW107XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlRmlsZXMgPSB0c0NvbmZpZ0ZpbGUuaW5jbHVkZSB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5uZWRGaWxlcyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXhjbHVkZVBhcnNlciA9IG5ldyBQYXJzZXJVdGlsKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZVBhcnNlciA9IG5ldyBQYXJzZXJVdGlsKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVQYXJzZXIuaW5pdChleGNsdWRlRmlsZXMsIGN3ZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlUGFyc2VyLmluaXQoaW5jbHVkZUZpbGVzLCBjd2QpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnRDd2QgPSBjd2Q7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBleGNsdWRlUGFyc2VyVGVzdEZpbGVzV2l0aEN3ZERlcHRoID0gZXhjbHVkZVBhcnNlci50ZXN0RmlsZXNXaXRoQ3dkRGVwdGgoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZXhjbHVkZVBhcnNlclRlc3RGaWxlc1dpdGhDd2REZXB0aC5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydEN3ZCA9IGV4Y2x1ZGVQYXJzZXIudXBkYXRlQ3dkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjd2QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVQYXJzZXJUZXN0RmlsZXNXaXRoQ3dkRGVwdGgubGV2ZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluY2x1ZGVQYXJzZXJUZXN0RmlsZXNXaXRoQ3dkRGVwdGggPSBpbmNsdWRlUGFyc2VyLnRlc3RGaWxlc1dpdGhDd2REZXB0aCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbmNsdWRlUGFyc2VyLnRlc3RGaWxlc1dpdGhDd2REZXB0aCgpLnN0YXR1cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0Q3dkID0gaW5jbHVkZVBhcnNlci51cGRhdGVDd2QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN3ZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZVBhcnNlclRlc3RGaWxlc1dpdGhDd2REZXB0aC5sZXZlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmaW5kZXIgPSByZXF1aXJlKCdmaW5kaXQyJykoc3RhcnRDd2QgfHwgJy4nKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZmluZGVyLm9uKCdkaXJlY3RvcnknLCBmdW5jdGlvbihkaXIsIHN0YXQsIHN0b3ApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYmFzZSA9IHBhdGguYmFzZW5hbWUoZGlyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZSA9PT0gJy5naXQnIHx8IGJhc2UgPT09ICdub2RlX21vZHVsZXMnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZmluZGVyLm9uKCdmaWxlJywgKGZpbGUsIHN0YXQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoLyhzcGVjfFxcLmQpXFwudHMvLnRlc3QoZmlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ0lnbm9yaW5nJywgZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZVBhcnNlci50ZXN0RmlsZShmaWxlKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmV4dG5hbWUoZmlsZSkgPT09ICcudHMnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdFeGNsdWRpbmcnLCBmaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluY2x1ZGVGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBJZiBpbmNsdWRlIHByb3ZpZGVkIGluIHRzY29uZmlnLCB1c2Ugb25seSB0aGlzIHNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYW5kIG5vdCBmaWxlcyBmb3VuZCB3aXRoIGdsb2JhbCBmaW5kaXQgc2NhbiBpbiB3b3JraW5nIGRpcmVjdG9yeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGguZXh0bmFtZShmaWxlKSA9PT0gJy50cycgJiYgaW5jbHVkZVBhcnNlci50ZXN0RmlsZShmaWxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdJbmNsdWRpbmcnLCBmaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5uZWRGaWxlcy5wdXNoKGZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGguZXh0bmFtZShmaWxlKSA9PT0gJy50cycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybignRXhjbHVkaW5nJywgZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0luY2x1ZGluZycsIGZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FubmVkRmlsZXMucHVzaChmaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZmluZGVyLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuc2V0RmlsZXMoc2Nhbm5lZEZpbGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvZ3JhbS5jb3ZlcmFnZVRlc3QgfHwgcHJvZ3JhbS5jb3ZlcmFnZVRlc3RQZXJGaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdSdW4gZG9jdW1lbnRhdGlvbiBjb3ZlcmFnZSB0ZXN0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLnRlc3RDb3ZlcmFnZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLmdlbmVyYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5zZXRGaWxlcyhzY2FubmVkRmlsZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb2dyYW0uY292ZXJhZ2VUZXN0IHx8IHByb2dyYW0uY292ZXJhZ2VUZXN0UGVyRmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdSdW4gZG9jdW1lbnRhdGlvbiBjb3ZlcmFnZSB0ZXN0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIudGVzdENvdmVyYWdlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLmdlbmVyYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZyAmJiBwcm9ncmFtLmFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIHRzY29uZmlnIGZpbGUgcHJvdmlkZWQgd2l0aCBzb3VyY2UgZm9sZGVyIGluIGFyZ1xuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGxldCB0ZXN0VHNDb25maWdQYXRoID0gdGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLnRzY29uZmlnLmluZGV4T2YocHJvY2Vzcy5jd2QoKSk7XG4gICAgICAgICAgICAgICAgaWYgKHRlc3RUc0NvbmZpZ1BhdGggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZyA9IHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZy5yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwLFxuICAgICAgICAgICAgICAgICAgICAgICAgJydcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgc291cmNlRm9sZGVyID0gcHJvZ3JhbS5hcmdzWzBdO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5maWxlRW5naW5lLmV4aXN0c1N5bmMoc291cmNlRm9sZGVyKSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBgUHJvdmlkZWQgc291cmNlIGZvbGRlciAke3NvdXJjZUZvbGRlcn0gd2FzIG5vdCBmb3VuZCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnlgXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnVXNpbmcgcHJvdmlkZWQgc291cmNlIGZvbGRlcicpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5maWxlRW5naW5lLmV4aXN0c1N5bmModGhpcy5jb25maWd1cmF0aW9uLm1haW5EYXRhLnRzY29uZmlnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBcIiR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIiBmaWxlIHdhcyBub3QgZm91bmQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5YFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBfZmlsZSA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguZGlybmFtZSh0aGlzLmNvbmZpZ3VyYXRpb24ubWFpbkRhdGEudHNjb25maWcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmJhc2VuYW1lKHRoaXMuY29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZylcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IG9mIHRzY29uZmlnLmpzb24gYXMgYSB3b3JraW5nIGRpcmVjdG9yeVxuICAgICAgICAgICAgICAgICAgICAgICAgY3dkID0gX2ZpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQocGF0aC5zZXApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNsaWNlKDAsIC0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKHBhdGguc2VwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdVc2luZyB0c2NvbmZpZyBmaWxlICcsIF9maWxlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRzQ29uZmlnRmlsZSA9IHJlYWRDb25maWcoX2ZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbm5lZEZpbGVzID0gdHNDb25maWdGaWxlLmZpbGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjYW5uZWRGaWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5uZWRGaWxlcyA9IGhhbmRsZVBhdGgoc2Nhbm5lZEZpbGVzLCBjd2QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNjYW5uZWRGaWxlcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlRmlsZXMgPSB0c0NvbmZpZ0ZpbGUuZXhjbHVkZSB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlRmlsZXMgPSB0c0NvbmZpZ0ZpbGUuaW5jbHVkZSB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FubmVkRmlsZXMgPSBbXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBleGNsdWRlUGFyc2VyID0gbmV3IFBhcnNlclV0aWwoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZVBhcnNlciA9IG5ldyBQYXJzZXJVdGlsKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlUGFyc2VyLmluaXQoZXhjbHVkZUZpbGVzLCBjd2QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVQYXJzZXIuaW5pdChpbmNsdWRlRmlsZXMsIGN3ZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnRDd2QgPSBzb3VyY2VGb2xkZXI7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXhjbHVkZVBhcnNlclRlc3RGaWxlc1dpdGhDd2REZXB0aCA9IGV4Y2x1ZGVQYXJzZXIudGVzdEZpbGVzV2l0aEN3ZERlcHRoKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFleGNsdWRlUGFyc2VyVGVzdEZpbGVzV2l0aEN3ZERlcHRoLnN0YXR1cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydEN3ZCA9IGV4Y2x1ZGVQYXJzZXIudXBkYXRlQ3dkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3dkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZVBhcnNlclRlc3RGaWxlc1dpdGhDd2REZXB0aC5sZXZlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5jbHVkZVBhcnNlclRlc3RGaWxlc1dpdGhDd2REZXB0aCA9IGluY2x1ZGVQYXJzZXIudGVzdEZpbGVzV2l0aEN3ZERlcHRoKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbmNsdWRlUGFyc2VyLnRlc3RGaWxlc1dpdGhDd2REZXB0aCgpLnN0YXR1cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydEN3ZCA9IGluY2x1ZGVQYXJzZXIudXBkYXRlQ3dkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3dkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZVBhcnNlclRlc3RGaWxlc1dpdGhDd2REZXB0aC5sZXZlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmaW5kZXIgPSByZXF1aXJlKCdmaW5kaXQyJykocGF0aC5yZXNvbHZlKHN0YXJ0Q3dkKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kZXIub24oJ2RpcmVjdG9yeScsIGZ1bmN0aW9uKGRpciwgc3RhdCwgc3RvcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYmFzZSA9IHBhdGguYmFzZW5hbWUoZGlyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2UgPT09ICcuZ2l0JyB8fCBiYXNlID09PSAnbm9kZV9tb2R1bGVzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kZXIub24oJ2ZpbGUnLCAoZmlsZSwgc3RhdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoLyhzcGVjfFxcLmQpXFwudHMvLnRlc3QoZmlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdJZ25vcmluZycsIGZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV4Y2x1ZGVQYXJzZXIudGVzdEZpbGUoZmlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdFeGNsdWRpbmcnLCBmaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbmNsdWRlRmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBJZiBpbmNsdWRlIHByb3ZpZGVkIGluIHRzY29uZmlnLCB1c2Ugb25seSB0aGlzIHNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFuZCBub3QgZmlsZXMgZm91bmQgd2l0aCBnbG9iYWwgZmluZGl0IHNjYW4gaW4gd29ya2luZyBkaXJlY3RvcnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguZXh0bmFtZShmaWxlKSA9PT0gJy50cycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlUGFyc2VyLnRlc3RGaWxlKGZpbGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0luY2x1ZGluZycsIGZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5uZWRGaWxlcy5wdXNoKGZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGF0aC5leHRuYW1lKGZpbGUpID09PSAnLnRzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybignRXhjbHVkaW5nJywgZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdJbmNsdWRpbmcnLCBmaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5uZWRGaWxlcy5wdXNoKGZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kZXIub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuc2V0RmlsZXMoc2Nhbm5lZEZpbGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb2dyYW0uY292ZXJhZ2VUZXN0IHx8IHByb2dyYW0uY292ZXJhZ2VUZXN0UGVyRmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ1J1biBkb2N1bWVudGF0aW9uIGNvdmVyYWdlIHRlc3QnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLnRlc3RDb3ZlcmFnZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuZ2VuZXJhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5zZXRGaWxlcyhzY2FubmVkRmlsZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9ncmFtLmNvdmVyYWdlVGVzdCB8fCBwcm9ncmFtLmNvdmVyYWdlVGVzdFBlckZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ1J1biBkb2N1bWVudGF0aW9uIGNvdmVyYWdlIHRlc3QnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIudGVzdENvdmVyYWdlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuZ2VuZXJhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigndHNjb25maWcuanNvbiBmaWxlIHdhcyBub3QgZm91bmQsIHBsZWFzZSB1c2UgLXAgZmxhZycpO1xuICAgICAgICAgICAgICAgIG91dHB1dEhlbHAoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiJdLCJuYW1lcyI6WyJfLmZvckVhY2giLCJzZW12ZXIuY29tcGFyZSIsIlN5bnRheEtpbmQiLCJ0cyIsIl8uZmlsdGVyIiwiXy5jb25jYXQiLCJmcy5yZWFkRmlsZSIsInBhdGgucmVzb2x2ZSIsImZzLm91dHB1dEZpbGUiLCJmcy5yZWFkRmlsZVN5bmMiLCJmcy5leGlzdHNTeW5jIiwiQXN0IiwicGF0aC5kaXJuYW1lIiwicGF0aC5zZXAiLCJhc3QiLCJfLnNvcnRCeSIsIl8udW5pcVdpdGgiLCJfLmlzRXF1YWwiLCJKU09ONS5wYXJzZSIsIl8uZmluZCIsIl8uY2xvbmVEZWVwIiwiSGFuZGxlYmFycy5jb21waWxlIiwiVHlwZUd1YXJkcyIsInBhdGgiLCJfLmZpbmRJbmRleCIsIkhhbmRsZWJhcnMuU2FmZVN0cmluZyIsIkhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIiLCJfLnNsaWNlIiwiSGFuZGxlYmFycy5yZWdpc3RlclBhcnRpYWwiLCJtYXJrZWQiLCJwYXRoLmJhc2VuYW1lIiwiXy5mbGF0TWFwIiwidHJhdmVyc2UiLCJfLmluZGV4T2YiLCJwYXRoLmlzQWJzb2x1dGUiLCJwYXRoLmpvaW4iLCJfLnVuaXEiLCJjbG9uZURlZXAiLCJjb25jYXQiLCJmaW5kIiwiY3J5cHRvIiwicGF0aC5leHRuYW1lIiwiXy5pbmNsdWRlcyIsIl8uZ3JvdXBCeSIsIl8ubWFwIiwiXy5jbG9uZSIsImZzLmNvcHkiLCJMaXZlU2VydmVyLnN0YXJ0IiwicGtnIiwiY3dkIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUMvQixJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDekIsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFFckMsSUFBSyxLQUtKO0FBTEQsV0FBSyxLQUFLO0lBQ1QsaUNBQUksQ0FBQTtJQUNKLG1DQUFLLENBQUE7SUFDTCxtQ0FBSyxDQUFBO0lBQ0wsaUNBQUksQ0FBQTtDQUNKLEVBTEksS0FBSyxLQUFMLEtBQUssUUFLVDtBQUVEO0lBT0M7UUFDQyxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDO1FBQzNCLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0tBQ25CO0lBRU0scUJBQUksR0FBWDtRQUFZLGNBQU87YUFBUCxVQUFPLEVBQVAscUJBQU8sRUFBUCxJQUFPO1lBQVAseUJBQU87O1FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQUUsT0FBTztTQUFFO1FBQzdCLElB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