order.js 156 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349
  1. 'use strict';var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) {return typeof obj;} : function (obj) {return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;};var _slicedToArray = function () {function sliceIterator(arr, i) {var _arr = [];var _n = true;var _d = false;var _e = undefined;try {for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {_arr.push(_s.value);if (i && _arr.length === i) break;}} catch (err) {_d = true;_e = err;} finally {try {if (!_n && _i["return"]) _i["return"]();} finally {if (_d) throw _e;}}return _arr;}return function (arr, i) {if (Array.isArray(arr)) {return arr;} else if (Symbol.iterator in Object(arr)) {return sliceIterator(arr, i);} else {throw new TypeError("Invalid attempt to destructure non-iterable instance");}};}();
  2. var _minimatch = require('minimatch');var _minimatch2 = _interopRequireDefault(_minimatch);
  3. var _arrayIncludes = require('array-includes');var _arrayIncludes2 = _interopRequireDefault(_arrayIncludes);
  4. var _object = require('object.groupby');var _object2 = _interopRequireDefault(_object);
  5. var _contextCompat = require('eslint-module-utils/contextCompat');
  6. var _stringPrototype = require('string.prototype.trimend');var _stringPrototype2 = _interopRequireDefault(_stringPrototype);
  7. var _importType = require('../core/importType');var _importType2 = _interopRequireDefault(_importType);
  8. var _staticRequire = require('../core/staticRequire');var _staticRequire2 = _interopRequireDefault(_staticRequire);
  9. var _docsUrl = require('../docsUrl');var _docsUrl2 = _interopRequireDefault(_docsUrl);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { 'default': obj };}
  10. var categories = {
  11. named: 'named',
  12. 'import': 'import',
  13. exports: 'exports' };
  14. var defaultGroups = ['builtin', 'external', 'parent', 'sibling', 'index'];
  15. // REPORTING AND FIXING
  16. function reverse(array) {
  17. return array.map(function (v) {return Object.assign({}, v, { rank: -v.rank });}).reverse();
  18. }
  19. function getTokensOrCommentsAfter(sourceCode, node, count) {
  20. var currentNodeOrToken = node;
  21. var result = [];
  22. for (var i = 0; i < count; i++) {
  23. currentNodeOrToken = sourceCode.getTokenOrCommentAfter(currentNodeOrToken);
  24. if (currentNodeOrToken == null) {
  25. break;
  26. }
  27. result.push(currentNodeOrToken);
  28. }
  29. return result;
  30. }
  31. function getTokensOrCommentsBefore(sourceCode, node, count) {
  32. var currentNodeOrToken = node;
  33. var result = [];
  34. for (var i = 0; i < count; i++) {
  35. currentNodeOrToken = sourceCode.getTokenOrCommentBefore(currentNodeOrToken);
  36. if (currentNodeOrToken == null) {
  37. break;
  38. }
  39. result.push(currentNodeOrToken);
  40. }
  41. return result.reverse();
  42. }
  43. function takeTokensAfterWhile(sourceCode, node, condition) {
  44. var tokens = getTokensOrCommentsAfter(sourceCode, node, 100);
  45. var result = [];
  46. for (var i = 0; i < tokens.length; i++) {
  47. if (condition(tokens[i])) {
  48. result.push(tokens[i]);
  49. } else {
  50. break;
  51. }
  52. }
  53. return result;
  54. }
  55. function takeTokensBeforeWhile(sourceCode, node, condition) {
  56. var tokens = getTokensOrCommentsBefore(sourceCode, node, 100);
  57. var result = [];
  58. for (var i = tokens.length - 1; i >= 0; i--) {
  59. if (condition(tokens[i])) {
  60. result.push(tokens[i]);
  61. } else {
  62. break;
  63. }
  64. }
  65. return result.reverse();
  66. }
  67. function findOutOfOrder(imported) {
  68. if (imported.length === 0) {
  69. return [];
  70. }
  71. var maxSeenRankNode = imported[0];
  72. return imported.filter(function (importedModule) {
  73. var res = importedModule.rank < maxSeenRankNode.rank;
  74. if (maxSeenRankNode.rank < importedModule.rank) {
  75. maxSeenRankNode = importedModule;
  76. }
  77. return res;
  78. });
  79. }
  80. function findRootNode(node) {
  81. var parent = node;
  82. while (parent.parent != null && parent.parent.body == null) {
  83. parent = parent.parent;
  84. }
  85. return parent;
  86. }
  87. function commentOnSameLineAs(node) {
  88. return function (token) {return (token.type === 'Block' || token.type === 'Line') &&
  89. token.loc.start.line === token.loc.end.line &&
  90. token.loc.end.line === node.loc.end.line;};
  91. }
  92. function findEndOfLineWithComments(sourceCode, node) {
  93. var tokensToEndOfLine = takeTokensAfterWhile(sourceCode, node, commentOnSameLineAs(node));
  94. var endOfTokens = tokensToEndOfLine.length > 0 ?
  95. tokensToEndOfLine[tokensToEndOfLine.length - 1].range[1] :
  96. node.range[1];
  97. var result = endOfTokens;
  98. for (var i = endOfTokens; i < sourceCode.text.length; i++) {
  99. if (sourceCode.text[i] === '\n') {
  100. result = i + 1;
  101. break;
  102. }
  103. if (sourceCode.text[i] !== ' ' && sourceCode.text[i] !== '\t' && sourceCode.text[i] !== '\r') {
  104. break;
  105. }
  106. result = i + 1;
  107. }
  108. return result;
  109. }
  110. function findStartOfLineWithComments(sourceCode, node) {
  111. var tokensToEndOfLine = takeTokensBeforeWhile(sourceCode, node, commentOnSameLineAs(node));
  112. var startOfTokens = tokensToEndOfLine.length > 0 ? tokensToEndOfLine[0].range[0] : node.range[0];
  113. var result = startOfTokens;
  114. for (var i = startOfTokens - 1; i > 0; i--) {
  115. if (sourceCode.text[i] !== ' ' && sourceCode.text[i] !== '\t') {
  116. break;
  117. }
  118. result = i;
  119. }
  120. return result;
  121. }
  122. function findSpecifierStart(sourceCode, node) {
  123. var token = void 0;
  124. do {
  125. token = sourceCode.getTokenBefore(node);
  126. } while (token.value !== ',' && token.value !== '{');
  127. return token.range[1];
  128. }
  129. function findSpecifierEnd(sourceCode, node) {
  130. var token = void 0;
  131. do {
  132. token = sourceCode.getTokenAfter(node);
  133. } while (token.value !== ',' && token.value !== '}');
  134. return token.range[0];
  135. }
  136. function isRequireExpression(expr) {
  137. return expr != null &&
  138. expr.type === 'CallExpression' &&
  139. expr.callee != null &&
  140. expr.callee.name === 'require' &&
  141. expr.arguments != null &&
  142. expr.arguments.length === 1 &&
  143. expr.arguments[0].type === 'Literal';
  144. }
  145. function isSupportedRequireModule(node) {
  146. if (node.type !== 'VariableDeclaration') {
  147. return false;
  148. }
  149. if (node.declarations.length !== 1) {
  150. return false;
  151. }
  152. var decl = node.declarations[0];
  153. var isPlainRequire = decl.id && (
  154. decl.id.type === 'Identifier' || decl.id.type === 'ObjectPattern') &&
  155. isRequireExpression(decl.init);
  156. var isRequireWithMemberExpression = decl.id && (
  157. decl.id.type === 'Identifier' || decl.id.type === 'ObjectPattern') &&
  158. decl.init != null &&
  159. decl.init.type === 'CallExpression' &&
  160. decl.init.callee != null &&
  161. decl.init.callee.type === 'MemberExpression' &&
  162. isRequireExpression(decl.init.callee.object);
  163. return isPlainRequire || isRequireWithMemberExpression;
  164. }
  165. function isPlainImportModule(node) {
  166. return node.type === 'ImportDeclaration' && node.specifiers != null && node.specifiers.length > 0;
  167. }
  168. function isPlainImportEquals(node) {
  169. return node.type === 'TSImportEqualsDeclaration' && node.moduleReference.expression;
  170. }
  171. function isCJSExports(context, node) {
  172. if (
  173. node.type === 'MemberExpression' &&
  174. node.object.type === 'Identifier' &&
  175. node.property.type === 'Identifier' &&
  176. node.object.name === 'module' &&
  177. node.property.name === 'exports')
  178. {
  179. return (0, _contextCompat.getScope)(context, node).variables.findIndex(function (variable) {return variable.name === 'module';}) === -1;
  180. }
  181. if (
  182. node.type === 'Identifier' &&
  183. node.name === 'exports')
  184. {
  185. return (0, _contextCompat.getScope)(context, node).variables.findIndex(function (variable) {return variable.name === 'exports';}) === -1;
  186. }
  187. }
  188. function getNamedCJSExports(context, node) {
  189. if (node.type !== 'MemberExpression') {
  190. return;
  191. }
  192. var result = [];
  193. var root = node;
  194. var parent = null;
  195. while (root.type === 'MemberExpression') {
  196. if (root.property.type !== 'Identifier') {
  197. return;
  198. }
  199. result.unshift(root.property.name);
  200. parent = root;
  201. root = root.object;
  202. }
  203. if (isCJSExports(context, root)) {
  204. return result;
  205. }
  206. if (isCJSExports(context, parent)) {
  207. return result.slice(1);
  208. }
  209. }
  210. function canCrossNodeWhileReorder(node) {
  211. return isSupportedRequireModule(node) || isPlainImportModule(node) || isPlainImportEquals(node);
  212. }
  213. function canReorderItems(firstNode, secondNode) {
  214. var parent = firstNode.parent;var _sort =
  215. [
  216. parent.body.indexOf(firstNode),
  217. parent.body.indexOf(secondNode)].
  218. sort(),_sort2 = _slicedToArray(_sort, 2),firstIndex = _sort2[0],secondIndex = _sort2[1];
  219. var nodesBetween = parent.body.slice(firstIndex, secondIndex + 1);var _iteratorNormalCompletion = true;var _didIteratorError = false;var _iteratorError = undefined;try {
  220. for (var _iterator = nodesBetween[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {var nodeBetween = _step.value;
  221. if (!canCrossNodeWhileReorder(nodeBetween)) {
  222. return false;
  223. }
  224. }} catch (err) {_didIteratorError = true;_iteratorError = err;} finally {try {if (!_iteratorNormalCompletion && _iterator['return']) {_iterator['return']();}} finally {if (_didIteratorError) {throw _iteratorError;}}}
  225. return true;
  226. }
  227. function makeImportDescription(node) {
  228. if (node.type === 'export') {
  229. if (node.node.exportKind === 'type') {
  230. return 'type export';
  231. }
  232. return 'export';
  233. }
  234. if (node.node.importKind === 'type') {
  235. return 'type import';
  236. }
  237. if (node.node.importKind === 'typeof') {
  238. return 'typeof import';
  239. }
  240. return 'import';
  241. }
  242. function fixOutOfOrder(context, firstNode, secondNode, order, category) {
  243. var isNamed = category === categories.named;
  244. var isExports = category === categories.exports;
  245. var sourceCode = (0, _contextCompat.getSourceCode)(context);var _ref =
  246. isNamed ? {
  247. firstRoot: firstNode.node,
  248. secondRoot: secondNode.node } :
  249. {
  250. firstRoot: findRootNode(firstNode.node),
  251. secondRoot: findRootNode(secondNode.node) },firstRoot = _ref.firstRoot,secondRoot = _ref.secondRoot;var _ref2 =
  252. isNamed ? {
  253. firstRootStart: findSpecifierStart(sourceCode, firstRoot),
  254. firstRootEnd: findSpecifierEnd(sourceCode, firstRoot),
  255. secondRootStart: findSpecifierStart(sourceCode, secondRoot),
  256. secondRootEnd: findSpecifierEnd(sourceCode, secondRoot) } :
  257. {
  258. firstRootStart: findStartOfLineWithComments(sourceCode, firstRoot),
  259. firstRootEnd: findEndOfLineWithComments(sourceCode, firstRoot),
  260. secondRootStart: findStartOfLineWithComments(sourceCode, secondRoot),
  261. secondRootEnd: findEndOfLineWithComments(sourceCode, secondRoot) },firstRootStart = _ref2.firstRootStart,firstRootEnd = _ref2.firstRootEnd,secondRootStart = _ref2.secondRootStart,secondRootEnd = _ref2.secondRootEnd;
  262. if (firstNode.displayName === secondNode.displayName) {
  263. if (firstNode.alias) {
  264. firstNode.displayName = String(firstNode.displayName) + ' as ' + String(firstNode.alias);
  265. }
  266. if (secondNode.alias) {
  267. secondNode.displayName = String(secondNode.displayName) + ' as ' + String(secondNode.alias);
  268. }
  269. }
  270. var firstImport = String(makeImportDescription(firstNode)) + ' of `' + String(firstNode.displayName) + '`';
  271. var secondImport = '`' + String(secondNode.displayName) + '` ' + String(makeImportDescription(secondNode));
  272. var message = secondImport + ' should occur ' + String(order) + ' ' + firstImport;
  273. if (isNamed) {
  274. var firstCode = sourceCode.text.slice(firstRootStart, firstRoot.range[1]);
  275. var firstTrivia = sourceCode.text.slice(firstRoot.range[1], firstRootEnd);
  276. var secondCode = sourceCode.text.slice(secondRootStart, secondRoot.range[1]);
  277. var secondTrivia = sourceCode.text.slice(secondRoot.range[1], secondRootEnd);
  278. if (order === 'before') {
  279. var trimmedTrivia = (0, _stringPrototype2['default'])(secondTrivia);
  280. var gapCode = sourceCode.text.slice(firstRootEnd, secondRootStart - 1);
  281. var whitespaces = secondTrivia.slice(trimmedTrivia.length);
  282. context.report({
  283. node: secondNode.node,
  284. message: message,
  285. fix: function () {function fix(fixer) {return fixer.replaceTextRange(
  286. [firstRootStart, secondRootEnd], String(
  287. secondCode) + ',' + String(trimmedTrivia) + String(firstCode) + String(firstTrivia) + String(gapCode) + String(whitespaces));}return fix;}() });
  288. } else if (order === 'after') {
  289. var _trimmedTrivia = (0, _stringPrototype2['default'])(firstTrivia);
  290. var _gapCode = sourceCode.text.slice(secondRootEnd + 1, firstRootStart);
  291. var _whitespaces = firstTrivia.slice(_trimmedTrivia.length);
  292. context.report({
  293. node: secondNode.node,
  294. message: message,
  295. fix: function () {function fix(fixes) {return fixes.replaceTextRange(
  296. [secondRootStart, firstRootEnd], '' + String(
  297. _gapCode) + String(firstCode) + ',' + String(_trimmedTrivia) + String(secondCode) + String(_whitespaces));}return fix;}() });
  298. }
  299. } else {
  300. var canFix = isExports || canReorderItems(firstRoot, secondRoot);
  301. var newCode = sourceCode.text.substring(secondRootStart, secondRootEnd);
  302. if (newCode[newCode.length - 1] !== '\n') {
  303. newCode = String(newCode) + '\n';
  304. }
  305. if (order === 'before') {
  306. context.report({
  307. node: secondNode.node,
  308. message: message,
  309. fix: canFix && function (fixer) {return fixer.replaceTextRange(
  310. [firstRootStart, secondRootEnd],
  311. newCode + sourceCode.text.substring(firstRootStart, secondRootStart));} });
  312. } else if (order === 'after') {
  313. context.report({
  314. node: secondNode.node,
  315. message: message,
  316. fix: canFix && function (fixer) {return fixer.replaceTextRange(
  317. [secondRootStart, firstRootEnd],
  318. sourceCode.text.substring(secondRootEnd, firstRootEnd) + newCode);} });
  319. }
  320. }
  321. }
  322. function reportOutOfOrder(context, imported, outOfOrder, order, category) {
  323. outOfOrder.forEach(function (imp) {
  324. var found = imported.find(function () {function hasHigherRank(importedItem) {
  325. return importedItem.rank > imp.rank;
  326. }return hasHigherRank;}());
  327. fixOutOfOrder(context, found, imp, order, category);
  328. });
  329. }
  330. function makeOutOfOrderReport(context, imported, category) {
  331. var outOfOrder = findOutOfOrder(imported);
  332. if (!outOfOrder.length) {
  333. return;
  334. }
  335. // There are things to report. Try to minimize the number of reported errors.
  336. var reversedImported = reverse(imported);
  337. var reversedOrder = findOutOfOrder(reversedImported);
  338. if (reversedOrder.length < outOfOrder.length) {
  339. reportOutOfOrder(context, reversedImported, reversedOrder, 'after', category);
  340. return;
  341. }
  342. reportOutOfOrder(context, imported, outOfOrder, 'before', category);
  343. }
  344. var compareString = function compareString(a, b) {
  345. if (a < b) {
  346. return -1;
  347. }
  348. if (a > b) {
  349. return 1;
  350. }
  351. return 0;
  352. };
  353. /** Some parsers (languages without types) don't provide ImportKind */
  354. var DEFAULT_IMPORT_KIND = 'value';
  355. var getNormalizedValue = function getNormalizedValue(node, toLowerCase) {
  356. var value = node.value;
  357. return toLowerCase ? String(value).toLowerCase() : value;
  358. };
  359. function getSorter(alphabetizeOptions) {
  360. var multiplier = alphabetizeOptions.order === 'asc' ? 1 : -1;
  361. var orderImportKind = alphabetizeOptions.orderImportKind;
  362. var multiplierImportKind = orderImportKind !== 'ignore' && (
  363. alphabetizeOptions.orderImportKind === 'asc' ? 1 : -1);
  364. return function () {function importsSorter(nodeA, nodeB) {
  365. var importA = getNormalizedValue(nodeA, alphabetizeOptions.caseInsensitive);
  366. var importB = getNormalizedValue(nodeB, alphabetizeOptions.caseInsensitive);
  367. var result = 0;
  368. if (!(0, _arrayIncludes2['default'])(importA, '/') && !(0, _arrayIncludes2['default'])(importB, '/')) {
  369. result = compareString(importA, importB);
  370. } else {
  371. var A = importA.split('/');
  372. var B = importB.split('/');
  373. var a = A.length;
  374. var b = B.length;
  375. for (var i = 0; i < Math.min(a, b); i++) {
  376. // Skip comparing the first path segment, if they are relative segments for both imports
  377. if (i === 0 && (A[i] === '.' || A[i] === '..') && (B[i] === '.' || B[i] === '..')) {
  378. // If one is sibling and the other parent import, no need to compare at all, since the paths belong in different groups
  379. if (A[i] !== B[i]) {break;}
  380. continue;
  381. }
  382. result = compareString(A[i], B[i]);
  383. if (result) {break;}
  384. }
  385. if (!result && a !== b) {
  386. result = a < b ? -1 : 1;
  387. }
  388. }
  389. result = result * multiplier;
  390. // In case the paths are equal (result === 0), sort them by importKind
  391. if (!result && multiplierImportKind) {
  392. result = multiplierImportKind * compareString(
  393. nodeA.node.importKind || DEFAULT_IMPORT_KIND,
  394. nodeB.node.importKind || DEFAULT_IMPORT_KIND);
  395. }
  396. return result;
  397. }return importsSorter;}();
  398. }
  399. function mutateRanksToAlphabetize(imported, alphabetizeOptions) {
  400. var groupedByRanks = (0, _object2['default'])(imported, function (item) {return item.rank;});
  401. var sorterFn = getSorter(alphabetizeOptions);
  402. // sort group keys so that they can be iterated on in order
  403. var groupRanks = Object.keys(groupedByRanks).sort(function (a, b) {
  404. return a - b;
  405. });
  406. // sort imports locally within their group
  407. groupRanks.forEach(function (groupRank) {
  408. groupedByRanks[groupRank].sort(sorterFn);
  409. });
  410. // assign globally unique rank to each import
  411. var newRank = 0;
  412. var alphabetizedRanks = groupRanks.reduce(function (acc, groupRank) {
  413. groupedByRanks[groupRank].forEach(function (importedItem) {
  414. acc[String(importedItem.value) + '|' + String(importedItem.node.importKind)] = parseInt(groupRank, 10) + newRank;
  415. newRank += 1;
  416. });
  417. return acc;
  418. }, {});
  419. // mutate the original group-rank with alphabetized-rank
  420. imported.forEach(function (importedItem) {
  421. importedItem.rank = alphabetizedRanks[String(importedItem.value) + '|' + String(importedItem.node.importKind)];
  422. });
  423. }
  424. // DETECTING
  425. function computePathRank(ranks, pathGroups, path, maxPosition) {
  426. for (var i = 0, l = pathGroups.length; i < l; i++) {var _pathGroups$i =
  427. pathGroups[i],pattern = _pathGroups$i.pattern,patternOptions = _pathGroups$i.patternOptions,group = _pathGroups$i.group,_pathGroups$i$positio = _pathGroups$i.position,position = _pathGroups$i$positio === undefined ? 1 : _pathGroups$i$positio;
  428. if ((0, _minimatch2['default'])(path, pattern, patternOptions || { nocomment: true })) {
  429. return ranks[group] + position / maxPosition;
  430. }
  431. }
  432. }
  433. function computeRank(context, ranks, importEntry, excludedImportTypes, isSortingTypesGroup) {
  434. var impType = void 0;
  435. var rank = void 0;
  436. var isTypeGroupInGroups = ranks.omittedTypes.indexOf('type') === -1;
  437. var isTypeOnlyImport = importEntry.node.importKind === 'type';
  438. var isExcludedFromPathRank = isTypeOnlyImport && isTypeGroupInGroups && excludedImportTypes.has('type');
  439. if (importEntry.type === 'import:object') {
  440. impType = 'object';
  441. } else if (isTypeOnlyImport && isTypeGroupInGroups && !isSortingTypesGroup) {
  442. impType = 'type';
  443. } else {
  444. impType = (0, _importType2['default'])(importEntry.value, context);
  445. }
  446. if (!excludedImportTypes.has(impType) && !isExcludedFromPathRank) {
  447. rank = computePathRank(ranks.groups, ranks.pathGroups, importEntry.value, ranks.maxPosition);
  448. }
  449. if (typeof rank === 'undefined') {
  450. rank = ranks.groups[impType];
  451. if (typeof rank === 'undefined') {
  452. return -1;
  453. }
  454. }
  455. if (isTypeOnlyImport && isSortingTypesGroup) {
  456. rank = ranks.groups.type + rank / 10;
  457. }
  458. if (importEntry.type !== 'import' && !importEntry.type.startsWith('import:')) {
  459. rank += 100;
  460. }
  461. return rank;
  462. }
  463. function registerNode(context, importEntry, ranks, imported, excludedImportTypes, isSortingTypesGroup) {
  464. var rank = computeRank(context, ranks, importEntry, excludedImportTypes, isSortingTypesGroup);
  465. if (rank !== -1) {
  466. var importNode = importEntry.node;
  467. if (importEntry.type === 'require' && importNode.parent.parent.type === 'VariableDeclaration') {
  468. importNode = importNode.parent.parent;
  469. }
  470. imported.push(Object.assign({},
  471. importEntry, {
  472. rank: rank,
  473. isMultiline: importNode.loc.end.line !== importNode.loc.start.line }));
  474. }
  475. }
  476. function getRequireBlock(node) {
  477. var n = node;
  478. // Handle cases like `const baz = require('foo').bar.baz`
  479. // and `const foo = require('foo')()`
  480. while (
  481. n.parent.type === 'MemberExpression' && n.parent.object === n ||
  482. n.parent.type === 'CallExpression' && n.parent.callee === n)
  483. {
  484. n = n.parent;
  485. }
  486. if (
  487. n.parent.type === 'VariableDeclarator' &&
  488. n.parent.parent.type === 'VariableDeclaration' &&
  489. n.parent.parent.parent.type === 'Program')
  490. {
  491. return n.parent.parent.parent;
  492. }
  493. }
  494. var types = ['builtin', 'external', 'internal', 'unknown', 'parent', 'sibling', 'index', 'object', 'type'];
  495. /**
  496. * Creates an object with type-rank pairs.
  497. *
  498. * Example: { index: 0, sibling: 1, parent: 1, external: 1, builtin: 2, internal: 2 }
  499. */
  500. function convertGroupsToRanks(groups) {
  501. var rankObject = groups.reduce(function (res, group, index) {
  502. [].concat(group).forEach(function (groupItem) {
  503. res[groupItem] = index * 2;
  504. });
  505. return res;
  506. }, {});
  507. var omittedTypes = types.filter(function (type) {
  508. return typeof rankObject[type] === 'undefined';
  509. });
  510. var ranks = omittedTypes.reduce(function (res, type) {
  511. res[type] = groups.length * 2;
  512. return res;
  513. }, rankObject);
  514. return { groups: ranks, omittedTypes: omittedTypes };
  515. }
  516. function convertPathGroupsForRanks(pathGroups) {
  517. var after = {};
  518. var before = {};
  519. var transformed = pathGroups.map(function (pathGroup, index) {var
  520. group = pathGroup.group,positionString = pathGroup.position;
  521. var position = 0;
  522. if (positionString === 'after') {
  523. if (!after[group]) {
  524. after[group] = 1;
  525. }
  526. position = after[group]++;
  527. } else if (positionString === 'before') {
  528. if (!before[group]) {
  529. before[group] = [];
  530. }
  531. before[group].push(index);
  532. }
  533. return Object.assign({}, pathGroup, { position: position });
  534. });
  535. var maxPosition = 1;
  536. Object.keys(before).forEach(function (group) {
  537. var groupLength = before[group].length;
  538. before[group].forEach(function (groupIndex, index) {
  539. transformed[groupIndex].position = -1 * (groupLength - index);
  540. });
  541. maxPosition = Math.max(maxPosition, groupLength);
  542. });
  543. Object.keys(after).forEach(function (key) {
  544. var groupNextPosition = after[key];
  545. maxPosition = Math.max(maxPosition, groupNextPosition - 1);
  546. });
  547. return {
  548. pathGroups: transformed,
  549. maxPosition: maxPosition > 10 ? Math.pow(10, Math.ceil(Math.log10(maxPosition))) : 10 };
  550. }
  551. function fixNewLineAfterImport(context, previousImport) {
  552. var prevRoot = findRootNode(previousImport.node);
  553. var tokensToEndOfLine = takeTokensAfterWhile(
  554. (0, _contextCompat.getSourceCode)(context),
  555. prevRoot,
  556. commentOnSameLineAs(prevRoot));
  557. var endOfLine = prevRoot.range[1];
  558. if (tokensToEndOfLine.length > 0) {
  559. endOfLine = tokensToEndOfLine[tokensToEndOfLine.length - 1].range[1];
  560. }
  561. return function (fixer) {return fixer.insertTextAfterRange([prevRoot.range[0], endOfLine], '\n');};
  562. }
  563. function removeNewLineAfterImport(context, currentImport, previousImport) {
  564. var sourceCode = (0, _contextCompat.getSourceCode)(context);
  565. var prevRoot = findRootNode(previousImport.node);
  566. var currRoot = findRootNode(currentImport.node);
  567. var rangeToRemove = [
  568. findEndOfLineWithComments(sourceCode, prevRoot),
  569. findStartOfLineWithComments(sourceCode, currRoot)];
  570. if (/^\s*$/.test(sourceCode.text.substring(rangeToRemove[0], rangeToRemove[1]))) {
  571. return function (fixer) {return fixer.removeRange(rangeToRemove);};
  572. }
  573. return undefined;
  574. }
  575. function makeNewlinesBetweenReport(context, imported, newlinesBetweenImports_, newlinesBetweenTypeOnlyImports_, distinctGroup, isSortingTypesGroup, isConsolidatingSpaceBetweenImports) {
  576. var getNumberOfEmptyLinesBetween = function getNumberOfEmptyLinesBetween(currentImport, previousImport) {
  577. var linesBetweenImports = (0, _contextCompat.getSourceCode)(context).lines.slice(
  578. previousImport.node.loc.end.line,
  579. currentImport.node.loc.start.line - 1);
  580. return linesBetweenImports.filter(function (line) {return !line.trim().length;}).length;
  581. };
  582. var getIsStartOfDistinctGroup = function getIsStartOfDistinctGroup(currentImport, previousImport) {return currentImport.rank - 1 >= previousImport.rank;};
  583. var previousImport = imported[0];
  584. imported.slice(1).forEach(function (currentImport) {
  585. var emptyLinesBetween = getNumberOfEmptyLinesBetween(
  586. currentImport,
  587. previousImport);
  588. var isStartOfDistinctGroup = getIsStartOfDistinctGroup(
  589. currentImport,
  590. previousImport);
  591. var isTypeOnlyImport = currentImport.node.importKind === 'type';
  592. var isPreviousImportTypeOnlyImport = previousImport.node.importKind === 'type';
  593. var isNormalImportNextToTypeOnlyImportAndRelevant = isTypeOnlyImport !== isPreviousImportTypeOnlyImport && isSortingTypesGroup;
  594. var isTypeOnlyImportAndRelevant = isTypeOnlyImport && isSortingTypesGroup;
  595. // In the special case where newlinesBetweenImports and consolidateIslands
  596. // want the opposite thing, consolidateIslands wins
  597. var newlinesBetweenImports = isSortingTypesGroup &&
  598. isConsolidatingSpaceBetweenImports && (
  599. previousImport.isMultiline || currentImport.isMultiline) &&
  600. newlinesBetweenImports_ === 'never' ?
  601. 'always-and-inside-groups' :
  602. newlinesBetweenImports_;
  603. // In the special case where newlinesBetweenTypeOnlyImports and
  604. // consolidateIslands want the opposite thing, consolidateIslands wins
  605. var newlinesBetweenTypeOnlyImports = isSortingTypesGroup &&
  606. isConsolidatingSpaceBetweenImports && (
  607. isNormalImportNextToTypeOnlyImportAndRelevant ||
  608. previousImport.isMultiline ||
  609. currentImport.isMultiline) &&
  610. newlinesBetweenTypeOnlyImports_ === 'never' ?
  611. 'always-and-inside-groups' :
  612. newlinesBetweenTypeOnlyImports_;
  613. var isNotIgnored = isTypeOnlyImportAndRelevant &&
  614. newlinesBetweenTypeOnlyImports !== 'ignore' ||
  615. !isTypeOnlyImportAndRelevant && newlinesBetweenImports !== 'ignore';
  616. if (isNotIgnored) {
  617. var shouldAssertNewlineBetweenGroups = (isTypeOnlyImportAndRelevant || isNormalImportNextToTypeOnlyImportAndRelevant) && (
  618. newlinesBetweenTypeOnlyImports === 'always' ||
  619. newlinesBetweenTypeOnlyImports === 'always-and-inside-groups') ||
  620. !isTypeOnlyImportAndRelevant && !isNormalImportNextToTypeOnlyImportAndRelevant && (
  621. newlinesBetweenImports === 'always' ||
  622. newlinesBetweenImports === 'always-and-inside-groups');
  623. var shouldAssertNoNewlineWithinGroup = (isTypeOnlyImportAndRelevant || isNormalImportNextToTypeOnlyImportAndRelevant) &&
  624. newlinesBetweenTypeOnlyImports !== 'always-and-inside-groups' ||
  625. !isTypeOnlyImportAndRelevant && !isNormalImportNextToTypeOnlyImportAndRelevant &&
  626. newlinesBetweenImports !== 'always-and-inside-groups';
  627. var shouldAssertNoNewlineBetweenGroup = !isSortingTypesGroup ||
  628. !isNormalImportNextToTypeOnlyImportAndRelevant ||
  629. newlinesBetweenTypeOnlyImports === 'never';
  630. var isTheNewlineBetweenImportsInTheSameGroup = distinctGroup && currentImport.rank === previousImport.rank ||
  631. !distinctGroup && !isStartOfDistinctGroup;
  632. // Let's try to cut down on linting errors sent to the user
  633. var alreadyReported = false;
  634. if (shouldAssertNewlineBetweenGroups) {
  635. if (currentImport.rank !== previousImport.rank && emptyLinesBetween === 0) {
  636. if (distinctGroup || isStartOfDistinctGroup) {
  637. alreadyReported = true;
  638. context.report({
  639. node: previousImport.node,
  640. message: 'There should be at least one empty line between import groups',
  641. fix: fixNewLineAfterImport(context, previousImport) });
  642. }
  643. } else if (emptyLinesBetween > 0 && shouldAssertNoNewlineWithinGroup) {
  644. if (isTheNewlineBetweenImportsInTheSameGroup) {
  645. alreadyReported = true;
  646. context.report({
  647. node: previousImport.node,
  648. message: 'There should be no empty line within import group',
  649. fix: removeNewLineAfterImport(context, currentImport, previousImport) });
  650. }
  651. }
  652. } else if (emptyLinesBetween > 0 && shouldAssertNoNewlineBetweenGroup) {
  653. alreadyReported = true;
  654. context.report({
  655. node: previousImport.node,
  656. message: 'There should be no empty line between import groups',
  657. fix: removeNewLineAfterImport(context, currentImport, previousImport) });
  658. }
  659. if (!alreadyReported && isConsolidatingSpaceBetweenImports) {
  660. if (emptyLinesBetween === 0 && currentImport.isMultiline) {
  661. context.report({
  662. node: previousImport.node,
  663. message: 'There should be at least one empty line between this import and the multi-line import that follows it',
  664. fix: fixNewLineAfterImport(context, previousImport) });
  665. } else if (emptyLinesBetween === 0 && previousImport.isMultiline) {
  666. context.report({
  667. node: previousImport.node,
  668. message: 'There should be at least one empty line between this multi-line import and the import that follows it',
  669. fix: fixNewLineAfterImport(context, previousImport) });
  670. } else if (
  671. emptyLinesBetween > 0 &&
  672. !previousImport.isMultiline &&
  673. !currentImport.isMultiline &&
  674. isTheNewlineBetweenImportsInTheSameGroup)
  675. {
  676. context.report({
  677. node: previousImport.node,
  678. message:
  679. 'There should be no empty lines between this single-line import and the single-line import that follows it',
  680. fix: removeNewLineAfterImport(context, currentImport, previousImport) });
  681. }
  682. }
  683. }
  684. previousImport = currentImport;
  685. });
  686. }
  687. function getAlphabetizeConfig(options) {
  688. var alphabetize = options.alphabetize || {};
  689. var order = alphabetize.order || 'ignore';
  690. var orderImportKind = alphabetize.orderImportKind || 'ignore';
  691. var caseInsensitive = alphabetize.caseInsensitive || false;
  692. return { order: order, orderImportKind: orderImportKind, caseInsensitive: caseInsensitive };
  693. }
  694. // TODO, semver-major: Change the default of "distinctGroup" from true to false
  695. var defaultDistinctGroup = true;
  696. module.exports = {
  697. meta: {
  698. type: 'suggestion',
  699. docs: {
  700. category: 'Style guide',
  701. description: 'Enforce a convention in module import order.',
  702. url: (0, _docsUrl2['default'])('order') },
  703. fixable: 'code',
  704. schema: [
  705. {
  706. type: 'object',
  707. properties: {
  708. groups: {
  709. type: 'array',
  710. uniqueItems: true,
  711. items: {
  712. oneOf: [
  713. { 'enum': types },
  714. {
  715. type: 'array',
  716. uniqueItems: true,
  717. items: { 'enum': types } }] } },
  718. pathGroupsExcludedImportTypes: {
  719. type: 'array' },
  720. distinctGroup: {
  721. type: 'boolean',
  722. 'default': defaultDistinctGroup },
  723. pathGroups: {
  724. type: 'array',
  725. items: {
  726. type: 'object',
  727. properties: {
  728. pattern: {
  729. type: 'string' },
  730. patternOptions: {
  731. type: 'object' },
  732. group: {
  733. type: 'string',
  734. 'enum': types },
  735. position: {
  736. type: 'string',
  737. 'enum': ['after', 'before'] } },
  738. additionalProperties: false,
  739. required: ['pattern', 'group'] } },
  740. 'newlines-between': {
  741. 'enum': [
  742. 'ignore',
  743. 'always',
  744. 'always-and-inside-groups',
  745. 'never'] },
  746. 'newlines-between-types': {
  747. 'enum': [
  748. 'ignore',
  749. 'always',
  750. 'always-and-inside-groups',
  751. 'never'] },
  752. consolidateIslands: {
  753. 'enum': [
  754. 'inside-groups',
  755. 'never'] },
  756. sortTypesGroup: {
  757. type: 'boolean',
  758. 'default': false },
  759. named: {
  760. 'default': false,
  761. oneOf: [{
  762. type: 'boolean' },
  763. {
  764. type: 'object',
  765. properties: {
  766. enabled: { type: 'boolean' },
  767. 'import': { type: 'boolean' },
  768. 'export': { type: 'boolean' },
  769. require: { type: 'boolean' },
  770. cjsExports: { type: 'boolean' },
  771. types: {
  772. type: 'string',
  773. 'enum': [
  774. 'mixed',
  775. 'types-first',
  776. 'types-last'] } },
  777. additionalProperties: false }] },
  778. alphabetize: {
  779. type: 'object',
  780. properties: {
  781. caseInsensitive: {
  782. type: 'boolean',
  783. 'default': false },
  784. order: {
  785. 'enum': ['ignore', 'asc', 'desc'],
  786. 'default': 'ignore' },
  787. orderImportKind: {
  788. 'enum': ['ignore', 'asc', 'desc'],
  789. 'default': 'ignore' } },
  790. additionalProperties: false },
  791. warnOnUnassignedImports: {
  792. type: 'boolean',
  793. 'default': false } },
  794. additionalProperties: false,
  795. dependencies: {
  796. sortTypesGroup: {
  797. oneOf: [
  798. {
  799. // When sortTypesGroup is true, groups must NOT be an array that does not contain 'type'
  800. properties: {
  801. sortTypesGroup: { 'enum': [true] },
  802. groups: {
  803. not: {
  804. type: 'array',
  805. uniqueItems: true,
  806. items: {
  807. oneOf: [
  808. { 'enum': types.filter(function (t) {return t !== 'type';}) },
  809. {
  810. type: 'array',
  811. uniqueItems: true,
  812. items: { 'enum': types.filter(function (t) {return t !== 'type';}) } }] } } } },
  813. required: ['groups'] },
  814. {
  815. properties: {
  816. sortTypesGroup: { 'enum': [false] } } }] },
  817. 'newlines-between-types': {
  818. properties: {
  819. sortTypesGroup: { 'enum': [true] } },
  820. required: ['sortTypesGroup'] },
  821. consolidateIslands: {
  822. oneOf: [
  823. {
  824. properties: {
  825. consolidateIslands: { 'enum': ['inside-groups'] } },
  826. anyOf: [
  827. {
  828. properties: {
  829. 'newlines-between': { 'enum': ['always-and-inside-groups'] } },
  830. required: ['newlines-between'] },
  831. {
  832. properties: {
  833. 'newlines-between-types': { 'enum': ['always-and-inside-groups'] } },
  834. required: ['newlines-between-types'] }] },
  835. {
  836. properties: {
  837. consolidateIslands: { 'enum': ['never'] } } }] } } }] },
  838. create: function () {function create(context) {
  839. var options = context.options[0] || {};
  840. var newlinesBetweenImports = options['newlines-between'] || 'ignore';
  841. var newlinesBetweenTypeOnlyImports = options['newlines-between-types'] || newlinesBetweenImports;
  842. var pathGroupsExcludedImportTypes = new Set(options.pathGroupsExcludedImportTypes || ['builtin', 'external', 'object']);
  843. var sortTypesGroup = options.sortTypesGroup;
  844. var consolidateIslands = options.consolidateIslands || 'never';
  845. var named = Object.assign({
  846. types: 'mixed' },
  847. _typeof(options.named) === 'object' ? Object.assign({},
  848. options.named, {
  849. 'import': 'import' in options.named ? options.named['import'] : options.named.enabled,
  850. 'export': 'export' in options.named ? options.named['export'] : options.named.enabled,
  851. require: 'require' in options.named ? options.named.require : options.named.enabled,
  852. cjsExports: 'cjsExports' in options.named ? options.named.cjsExports : options.named.enabled }) :
  853. {
  854. 'import': options.named,
  855. 'export': options.named,
  856. require: options.named,
  857. cjsExports: options.named });
  858. var namedGroups = named.types === 'mixed' ? [] : named.types === 'types-last' ? ['value'] : ['type'];
  859. var alphabetize = getAlphabetizeConfig(options);
  860. var distinctGroup = options.distinctGroup == null ? defaultDistinctGroup : !!options.distinctGroup;
  861. var ranks = void 0;
  862. try {var _convertPathGroupsFor =
  863. convertPathGroupsForRanks(options.pathGroups || []),pathGroups = _convertPathGroupsFor.pathGroups,maxPosition = _convertPathGroupsFor.maxPosition;var _convertGroupsToRanks =
  864. convertGroupsToRanks(options.groups || defaultGroups),groups = _convertGroupsToRanks.groups,omittedTypes = _convertGroupsToRanks.omittedTypes;
  865. ranks = {
  866. groups: groups,
  867. omittedTypes: omittedTypes,
  868. pathGroups: pathGroups,
  869. maxPosition: maxPosition };
  870. } catch (error) {
  871. // Malformed configuration
  872. return {
  873. Program: function () {function Program(node) {
  874. context.report(node, error.message);
  875. }return Program;}() };
  876. }
  877. var importMap = new Map();
  878. var exportMap = new Map();
  879. var isTypeGroupInGroups = ranks.omittedTypes.indexOf('type') === -1;
  880. var isSortingTypesGroup = isTypeGroupInGroups && sortTypesGroup;
  881. function getBlockImports(node) {
  882. if (!importMap.has(node)) {
  883. importMap.set(node, []);
  884. }
  885. return importMap.get(node);
  886. }
  887. function getBlockExports(node) {
  888. if (!exportMap.has(node)) {
  889. exportMap.set(node, []);
  890. }
  891. return exportMap.get(node);
  892. }
  893. function makeNamedOrderReport(context, namedImports) {
  894. if (namedImports.length > 1) {
  895. var imports = namedImports.map(
  896. function (namedImport) {
  897. var kind = namedImport.kind || 'value';
  898. var rank = namedGroups.findIndex(function (entry) {return [].concat(entry).indexOf(kind) > -1;});
  899. return Object.assign({
  900. displayName: namedImport.value,
  901. rank: rank === -1 ? namedGroups.length : rank },
  902. namedImport, {
  903. value: String(namedImport.value) + ':' + String(namedImport.alias || '') });
  904. });
  905. if (alphabetize.order !== 'ignore') {
  906. mutateRanksToAlphabetize(imports, alphabetize);
  907. }
  908. makeOutOfOrderReport(context, imports, categories.named);
  909. }
  910. }
  911. return Object.assign({
  912. ImportDeclaration: function () {function ImportDeclaration(node) {
  913. // Ignoring unassigned imports unless warnOnUnassignedImports is set
  914. if (node.specifiers.length || options.warnOnUnassignedImports) {
  915. var name = node.source.value;
  916. registerNode(
  917. context,
  918. {
  919. node: node,
  920. value: name,
  921. displayName: name,
  922. type: 'import' },
  923. ranks,
  924. getBlockImports(node.parent),
  925. pathGroupsExcludedImportTypes,
  926. isSortingTypesGroup);
  927. if (named['import']) {
  928. makeNamedOrderReport(
  929. context,
  930. node.specifiers.filter(
  931. function (specifier) {return specifier.type === 'ImportSpecifier';}).map(
  932. function (specifier) {return Object.assign({
  933. node: specifier,
  934. value: specifier.imported.name,
  935. type: 'import',
  936. kind: specifier.importKind },
  937. specifier.local.range[0] !== specifier.imported.range[0] && {
  938. alias: specifier.local.name });}));
  939. }
  940. }
  941. }return ImportDeclaration;}(),
  942. TSImportEqualsDeclaration: function () {function TSImportEqualsDeclaration(node) {
  943. // skip "export import"s
  944. if (node.isExport) {
  945. return;
  946. }
  947. var displayName = void 0;
  948. var value = void 0;
  949. var type = void 0;
  950. if (node.moduleReference.type === 'TSExternalModuleReference') {
  951. value = node.moduleReference.expression.value;
  952. displayName = value;
  953. type = 'import';
  954. } else {
  955. value = '';
  956. displayName = (0, _contextCompat.getSourceCode)(context).getText(node.moduleReference);
  957. type = 'import:object';
  958. }
  959. registerNode(
  960. context,
  961. {
  962. node: node,
  963. value: value,
  964. displayName: displayName,
  965. type: type },
  966. ranks,
  967. getBlockImports(node.parent),
  968. pathGroupsExcludedImportTypes,
  969. isSortingTypesGroup);
  970. }return TSImportEqualsDeclaration;}(),
  971. CallExpression: function () {function CallExpression(node) {
  972. if (!(0, _staticRequire2['default'])(node)) {
  973. return;
  974. }
  975. var block = getRequireBlock(node);
  976. if (!block) {
  977. return;
  978. }
  979. var name = node.arguments[0].value;
  980. registerNode(
  981. context,
  982. {
  983. node: node,
  984. value: name,
  985. displayName: name,
  986. type: 'require' },
  987. ranks,
  988. getBlockImports(block),
  989. pathGroupsExcludedImportTypes,
  990. isSortingTypesGroup);
  991. }return CallExpression;}() },
  992. named.require && {
  993. VariableDeclarator: function () {function VariableDeclarator(node) {
  994. if (node.id.type === 'ObjectPattern' && isRequireExpression(node.init)) {
  995. for (var i = 0; i < node.id.properties.length; i++) {
  996. if (
  997. node.id.properties[i].key.type !== 'Identifier' ||
  998. node.id.properties[i].value.type !== 'Identifier')
  999. {
  1000. return;
  1001. }
  1002. }
  1003. makeNamedOrderReport(
  1004. context,
  1005. node.id.properties.map(function (prop) {return Object.assign({
  1006. node: prop,
  1007. value: prop.key.name,
  1008. type: 'require' },
  1009. prop.key.range[0] !== prop.value.range[0] && {
  1010. alias: prop.value.name });}));
  1011. }
  1012. }return VariableDeclarator;}() },
  1013. named['export'] && {
  1014. ExportNamedDeclaration: function () {function ExportNamedDeclaration(node) {
  1015. makeNamedOrderReport(
  1016. context,
  1017. node.specifiers.map(function (specifier) {return Object.assign({
  1018. node: specifier,
  1019. value: specifier.local.name,
  1020. type: 'export',
  1021. kind: specifier.exportKind },
  1022. specifier.local.range[0] !== specifier.exported.range[0] && {
  1023. alias: specifier.exported.name });}));
  1024. }return ExportNamedDeclaration;}() },
  1025. named.cjsExports && {
  1026. AssignmentExpression: function () {function AssignmentExpression(node) {
  1027. if (node.parent.type === 'ExpressionStatement') {
  1028. if (isCJSExports(context, node.left)) {
  1029. if (node.right.type === 'ObjectExpression') {
  1030. for (var i = 0; i < node.right.properties.length; i++) {
  1031. if (
  1032. !node.right.properties[i].key ||
  1033. node.right.properties[i].key.type !== 'Identifier' ||
  1034. !node.right.properties[i].value ||
  1035. node.right.properties[i].value.type !== 'Identifier')
  1036. {
  1037. return;
  1038. }
  1039. }
  1040. makeNamedOrderReport(
  1041. context,
  1042. node.right.properties.map(function (prop) {return Object.assign({
  1043. node: prop,
  1044. value: prop.key.name,
  1045. type: 'export' },
  1046. prop.key.range[0] !== prop.value.range[0] && {
  1047. alias: prop.value.name });}));
  1048. }
  1049. } else {
  1050. var nameParts = getNamedCJSExports(context, node.left);
  1051. if (nameParts && nameParts.length > 0) {
  1052. var name = nameParts.join('.');
  1053. getBlockExports(node.parent.parent).push({
  1054. node: node,
  1055. value: name,
  1056. displayName: name,
  1057. type: 'export',
  1058. rank: 0 });
  1059. }
  1060. }
  1061. }
  1062. }return AssignmentExpression;}() }, {
  1063. 'Program:exit': function () {function ProgramExit() {
  1064. importMap.forEach(function (imported) {
  1065. if (newlinesBetweenImports !== 'ignore' || newlinesBetweenTypeOnlyImports !== 'ignore') {
  1066. makeNewlinesBetweenReport(
  1067. context,
  1068. imported,
  1069. newlinesBetweenImports,
  1070. newlinesBetweenTypeOnlyImports,
  1071. distinctGroup,
  1072. isSortingTypesGroup,
  1073. consolidateIslands === 'inside-groups' && (
  1074. newlinesBetweenImports === 'always-and-inside-groups' ||
  1075. newlinesBetweenTypeOnlyImports === 'always-and-inside-groups'));
  1076. }
  1077. if (alphabetize.order !== 'ignore') {
  1078. mutateRanksToAlphabetize(imported, alphabetize);
  1079. }
  1080. makeOutOfOrderReport(context, imported, categories['import']);
  1081. });
  1082. exportMap.forEach(function (exported) {
  1083. if (alphabetize.order !== 'ignore') {
  1084. mutateRanksToAlphabetize(exported, alphabetize);
  1085. makeOutOfOrderReport(context, exported, categories.exports);
  1086. }
  1087. });
  1088. importMap.clear();
  1089. exportMap.clear();
  1090. }return ProgramExit;}() });
  1091. }return create;}() };
  1092. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydWxlcy9vcmRlci5qcyJdLCJuYW1lcyI6WyJjYXRlZ29yaWVzIiwibmFtZWQiLCJleHBvcnRzIiwiZGVmYXVsdEdyb3VwcyIsInJldmVyc2UiLCJhcnJheSIsIm1hcCIsInYiLCJyYW5rIiwiZ2V0VG9rZW5zT3JDb21tZW50c0FmdGVyIiwic291cmNlQ29kZSIsIm5vZGUiLCJjb3VudCIsImN1cnJlbnROb2RlT3JUb2tlbiIsInJlc3VsdCIsImkiLCJnZXRUb2tlbk9yQ29tbWVudEFmdGVyIiwicHVzaCIsImdldFRva2Vuc09yQ29tbWVudHNCZWZvcmUiLCJnZXRUb2tlbk9yQ29tbWVudEJlZm9yZSIsInRha2VUb2tlbnNBZnRlcldoaWxlIiwiY29uZGl0aW9uIiwidG9rZW5zIiwibGVuZ3RoIiwidGFrZVRva2Vuc0JlZm9yZVdoaWxlIiwiZmluZE91dE9mT3JkZXIiLCJpbXBvcnRlZCIsIm1heFNlZW5SYW5rTm9kZSIsImZpbHRlciIsImltcG9ydGVkTW9kdWxlIiwicmVzIiwiZmluZFJvb3ROb2RlIiwicGFyZW50IiwiYm9keSIsImNvbW1lbnRPblNhbWVMaW5lQXMiLCJ0b2tlbiIsInR5cGUiLCJsb2MiLCJzdGFydCIsImxpbmUiLCJlbmQiLCJmaW5kRW5kT2ZMaW5lV2l0aENvbW1lbnRzIiwidG9rZW5zVG9FbmRPZkxpbmUiLCJlbmRPZlRva2VucyIsInJhbmdlIiwidGV4dCIsImZpbmRTdGFydE9mTGluZVdpdGhDb21tZW50cyIsInN0YXJ0T2ZUb2tlbnMiLCJmaW5kU3BlY2lmaWVyU3RhcnQiLCJnZXRUb2tlbkJlZm9yZSIsInZhbHVlIiwiZmluZFNwZWNpZmllckVuZCIsImdldFRva2VuQWZ0ZXIiLCJpc1JlcXVpcmVFeHByZXNzaW9uIiwiZXhwciIsImNhbGxlZSIsIm5hbWUiLCJhcmd1bWVudHMiLCJpc1N1cHBvcnRlZFJlcXVpcmVNb2R1bGUiLCJkZWNsYXJhdGlvbnMiLCJkZWNsIiwiaXNQbGFpblJlcXVpcmUiLCJpZCIsImluaXQiLCJpc1JlcXVpcmVXaXRoTWVtYmVyRXhwcmVzc2lvbiIsIm9iamVjdCIsImlzUGxhaW5JbXBvcnRNb2R1bGUiLCJzcGVjaWZpZXJzIiwiaXNQbGFpbkltcG9ydEVxdWFscyIsIm1vZHVsZVJlZmVyZW5jZSIsImV4cHJlc3Npb24iLCJpc0NKU0V4cG9ydHMiLCJjb250ZXh0IiwicHJvcGVydHkiLCJ2YXJpYWJsZXMiLCJmaW5kSW5kZXgiLCJ2YXJpYWJsZSIsImdldE5hbWVkQ0pTRXhwb3J0cyIsInJvb3QiLCJ1bnNoaWZ0Iiwic2xpY2UiLCJjYW5Dcm9zc05vZGVXaGlsZVJlb3JkZXIiLCJjYW5SZW9yZGVySXRlbXMiLCJmaXJzdE5vZGUiLCJzZWNvbmROb2RlIiwiaW5kZXhPZiIsInNvcnQiLCJmaXJzdEluZGV4Iiwic2Vjb25kSW5kZXgiLCJub2Rlc0JldHdlZW4iLCJub2RlQmV0d2VlbiIsIm1ha2VJbXBvcnREZXNjcmlwdGlvbiIsImV4cG9ydEtpbmQiLCJpbXBvcnRLaW5kIiwiZml4T3V0T2ZPcmRlciIsIm9yZGVyIiwiY2F0ZWdvcnkiLCJpc05hbWVkIiwiaXNFeHBvcnRzIiwiZmlyc3RSb290Iiwic2Vjb25kUm9vdCIsImZpcnN0Um9vdFN0YXJ0IiwiZmlyc3RSb290RW5kIiwic2Vjb25kUm9vdFN0YXJ0Iiwic2Vjb25kUm9vdEVuZCIsImRpc3BsYXlOYW1lIiwiYWxpYXMiLCJmaXJzdEltcG9ydCIsInNlY29uZEltcG9ydCIsIm1lc3NhZ2UiLCJmaXJzdENvZGUiLCJmaXJzdFRyaXZpYSIsInNlY29uZENvZGUiLCJzZWNvbmRUcml2aWEiLCJ0cmltbWVkVHJpdmlhIiwiZ2FwQ29kZSIsIndoaXRlc3BhY2VzIiwicmVwb3J0IiwiZml4IiwiZml4ZXIiLCJyZXBsYWNlVGV4dFJhbmdlIiwiZml4ZXMiLCJjYW5GaXgiLCJuZXdDb2RlIiwic3Vic3RyaW5nIiwicmVwb3J0T3V0T2ZPcmRlciIsIm91dE9mT3JkZXIiLCJmb3JFYWNoIiwiaW1wIiwiZm91bmQiLCJmaW5kIiwiaGFzSGlnaGVyUmFuayIsImltcG9ydGVkSXRlbSIsIm1ha2VPdXRPZk9yZGVyUmVwb3J0IiwicmV2ZXJzZWRJbXBvcnRlZCIsInJldmVyc2VkT3JkZXIiLCJjb21wYXJlU3RyaW5nIiwiYSIsImIiLCJERUZBVUxUX0lNUE9SVF9LSU5EIiwiZ2V0Tm9ybWFsaXplZFZhbHVlIiwidG9Mb3dlckNhc2UiLCJTdHJpbmciLCJnZXRTb3J0ZXIiLCJhbHBoYWJldGl6ZU9wdGlvbnMiLCJtdWx0aXBsaWVyIiwib3JkZXJJbXBvcnRLaW5kIiwibXVsdGlwbGllckltcG9ydEtpbmQiLCJpbXBvcnRzU29ydGVyIiwibm9kZUEiLCJub2RlQiIsImltcG9ydEEiLCJjYXNlSW5zZW5zaXRpdmUiLCJpbXBvcnRCIiwiQSIsInNwbGl0IiwiQiIsIk1hdGgiLCJtaW4iLCJtdXRhdGVSYW5rc1RvQWxwaGFiZXRpemUiLCJncm91cGVkQnlSYW5rcyIsIml0ZW0iLCJzb3J0ZXJGbiIsImdyb3VwUmFua3MiLCJPYmplY3QiLCJrZXlzIiwiZ3JvdXBSYW5rIiwibmV3UmFuayIsImFscGhhYmV0aXplZFJhbmtzIiwicmVkdWNlIiwiYWNjIiwicGFyc2VJbnQiLCJjb21wdXRlUGF0aFJhbmsiLCJyYW5rcyIsInBhdGhHcm91cHMiLCJwYXRoIiwibWF4UG9zaXRpb24iLCJsIiwicGF0dGVybiIsInBhdHRlcm5PcHRpb25zIiwiZ3JvdXAiLCJwb3NpdGlvbiIsIm5vY29tbWVudCIsImNvbXB1dGVSYW5rIiwiaW1wb3J0RW50cnkiLCJleGNsdWRlZEltcG9ydFR5cGVzIiwiaXNTb3J0aW5nVHlwZXNHcm91cCIsImltcFR5cGUiLCJpc1R5cGVHcm91cEluR3JvdXBzIiwib21pdHRlZFR5cGVzIiwiaXNUeXBlT25seUltcG9ydCIsImlzRXhjbHVkZWRGcm9tUGF0aFJhbmsiLCJoYXMiLCJncm91cHMiLCJzdGFydHNXaXRoIiwicmVnaXN0ZXJOb2RlIiwiaW1wb3J0Tm9kZSIsImlzTXVsdGlsaW5lIiwiZ2V0UmVxdWlyZUJsb2NrIiwibiIsInR5cGVzIiwiY29udmVydEdyb3Vwc1RvUmFua3MiLCJyYW5rT2JqZWN0IiwiaW5kZXgiLCJjb25jYXQiLCJncm91cEl0ZW0iLCJjb252ZXJ0UGF0aEdyb3Vwc0ZvclJhbmtzIiwiYWZ0ZXIiLCJiZWZvcmUiLCJ0cmFuc2Zvcm1lZCIsInBhdGhHcm91cCIsInBvc2l0aW9uU3RyaW5nIiwiZ3JvdXBMZW5ndGgiLCJncm91cEluZGV4IiwibWF4Iiwia2V5IiwiZ3JvdXBOZXh0UG9zaXRpb24iLCJwb3ciLCJjZWlsIiwibG9nMTAiLCJmaXhOZXdMaW5lQWZ0ZXJJbXBvcnQiLCJwcmV2aW91c0ltcG9ydCIsInByZXZSb290IiwiZW5kT2ZMaW5lIiwiaW5zZXJ0VGV4dEFmdGVyUmFuZ2UiLCJyZW1vdmVOZXdMaW5lQWZ0ZXJJbXBvcnQiLCJjdXJyZW50SW1wb3J0IiwiY3VyclJvb3QiLCJyYW5nZVRvUmVtb3ZlIiwidGVzdCIsInJlbW92ZVJhbmdlIiwidW5kZWZpbmVkIiwibWFrZU5ld2xpbmVzQmV0d2VlblJlcG9ydCIsIm5ld2xpbmVzQmV0d2VlbkltcG9ydHNfIiwibmV3bGluZXNCZXR3ZWVuVHlwZU9ubHlJbXBvcnRzXyIsImRpc3RpbmN0R3JvdXAiLCJpc0NvbnNvbGlkYXRpbmdTcGFjZUJldHdlZW5JbXBvcnRzIiwiZ2V0TnVtYmVyT2ZFbXB0eUxpbmVzQmV0d2VlbiIsImxpbmVzQmV0d2VlbkltcG9ydHMiLCJsaW5lcyIsInRyaW0iLCJnZXRJc1N0YXJ0T2ZEaXN0aW5jdEdyb3VwIiwiZW1wdHlMaW5lc0JldHdlZW4iLCJpc1N0YXJ0T2ZEaXN0aW5jdEdyb3VwIiwiaXNQcmV2aW91c0ltcG9ydFR5cGVPbmx5SW1wb3J0IiwiaXNOb3JtYWxJbXBvcnROZXh0VG9UeXBlT25seUltcG9ydEFuZFJlbGV2YW50IiwiaXNUeXBlT25seUltcG9ydEFuZFJlbGV2YW50IiwibmV3bGluZXNCZXR3ZWVuSW1wb3J0cyIsIm5ld2xpbmVzQmV0d2VlblR5cGVPbmx5SW1wb3J0cyIsImlzTm90SWdub3JlZCIsInNob3VsZEFzc2VydE5ld2xpbmVCZXR3ZWVuR3JvdXBzIiwic2hvdWxkQXNzZXJ0Tm9OZXdsaW5lV2l0aGluR3JvdXAiLCJzaG91bGRBc3NlcnROb05ld2xpbmVCZXR3ZWVuR3JvdXAiLCJpc1RoZU5ld2xpbmVCZXR3ZWVuSW1wb3J0c0luVGhlU2FtZUdyb3VwIiwiYWxyZWFkeVJlcG9ydGVkIiwiZ2V0QWxwaGFiZXRpemVDb25maWciLCJvcHRpb25zIiwiYWxwaGFiZXRpemUiLCJkZWZhdWx0RGlzdGluY3RHcm91cCIsIm1vZHVsZSIsIm1ldGEiLCJkb2NzIiwiZGVzY3JpcHRpb24iLCJ1cmwiLCJmaXhhYmxlIiwic2NoZW1hIiwicHJvcGVydGllcyIsInVuaXF1ZUl0ZW1zIiwiaXRlbXMiLCJvbmVPZiIsInBhdGhHcm91cHNFeGNsdWRlZEltcG9ydFR5cGVzIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJyZXF1aXJlZCIsImNvbnNvbGlkYXRlSXNsYW5kcyIsInNvcnRUeXBlc0dyb3VwIiwiZW5hYmxlZCIsInJlcXVpcmUiLCJjanNFeHBvcnRzIiwid2Fybk9uVW5hc3NpZ25lZEltcG9ydHMiLCJkZXBlbmRlbmNpZXMiLCJub3QiLCJ0IiwiYW55T2YiLCJjcmVhdGUiLCJTZXQiLCJuYW1lZEdyb3VwcyIsImVycm9yIiwiUHJvZ3JhbSIsImltcG9ydE1hcCIsIk1hcCIsImV4cG9ydE1hcCIsImdldEJsb2NrSW1wb3J0cyIsInNldCIsImdldCIsImdldEJsb2NrRXhwb3J0cyIsIm1ha2VOYW1lZE9yZGVyUmVwb3J0IiwibmFtZWRJbXBvcnRzIiwiaW1wb3J0cyIsIm5hbWVkSW1wb3J0Iiwia2luZCIsImVudHJ5IiwiSW1wb3J0RGVjbGFyYXRpb24iLCJzb3VyY2UiLCJzcGVjaWZpZXIiLCJsb2NhbCIsIlRTSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24iLCJpc0V4cG9ydCIsImdldFRleHQiLCJDYWxsRXhwcmVzc2lvbiIsImJsb2NrIiwiVmFyaWFibGVEZWNsYXJhdG9yIiwicHJvcCIsIkV4cG9ydE5hbWVkRGVjbGFyYXRpb24iLCJleHBvcnRlZCIsIkFzc2lnbm1lbnRFeHByZXNzaW9uIiwibGVmdCIsInJpZ2h0IiwibmFtZVBhcnRzIiwiam9pbiIsImNsZWFyIl0sIm1hcHBpbmdzIjoiQUFBQSxhOztBQUVBLHNDO0FBQ0EsK0M7QUFDQSx3QztBQUNBO0FBQ0EsMkQ7O0FBRUEsZ0Q7QUFDQSxzRDtBQUNBLHFDOztBQUVBLElBQU1BLGFBQWE7QUFDakJDLFNBQU8sT0FEVTtBQUVqQixZQUFRLFFBRlM7QUFHakJDLFdBQVMsU0FIUSxFQUFuQjs7O0FBTUEsSUFBTUMsZ0JBQWdCLENBQUMsU0FBRCxFQUFZLFVBQVosRUFBd0IsUUFBeEIsRUFBa0MsU0FBbEMsRUFBNkMsT0FBN0MsQ0FBdEI7O0FBRUE7O0FBRUEsU0FBU0MsT0FBVCxDQUFpQkMsS0FBakIsRUFBd0I7QUFDdEIsU0FBT0EsTUFBTUMsR0FBTixDQUFVLFVBQUNDLENBQUQsNEJBQWFBLENBQWIsSUFBZ0JDLE1BQU0sQ0FBQ0QsRUFBRUMsSUFBekIsS0FBVixFQUE0Q0osT0FBNUMsRUFBUDtBQUNEOztBQUVELFNBQVNLLHdCQUFULENBQWtDQyxVQUFsQyxFQUE4Q0MsSUFBOUMsRUFBb0RDLEtBQXBELEVBQTJEO0FBQ3pELE1BQUlDLHFCQUFxQkYsSUFBekI7QUFDQSxNQUFNRyxTQUFTLEVBQWY7QUFDQSxPQUFLLElBQUlDLElBQUksQ0FBYixFQUFnQkEsSUFBSUgsS0FBcEIsRUFBMkJHLEdBQTNCLEVBQWdDO0FBQzlCRix5QkFBcUJILFdBQVdNLHNCQUFYLENBQWtDSCxrQkFBbEMsQ0FBckI7QUFDQSxRQUFJQSxzQkFBc0IsSUFBMUIsRUFBZ0M7QUFDOUI7QUFDRDtBQUNEQyxXQUFPRyxJQUFQLENBQVlKLGtCQUFaO0FBQ0Q7QUFDRCxTQUFPQyxNQUFQO0FBQ0Q7O0FBRUQsU0FBU0kseUJBQVQsQ0FBbUNSLFVBQW5DLEVBQStDQyxJQUEvQyxFQUFxREMsS0FBckQsRUFBNEQ7QUFDMUQsTUFBSUMscUJBQXFCRixJQUF6QjtBQUNBLE1BQU1HLFNBQVMsRUFBZjtB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Q3pULFdBQVdFLE9BQW5EO0FBQ0Q7QUFDRixhQUxEOztBQU9BOFIsc0JBQVUrQixLQUFWO0FBQ0E3QixzQkFBVTZCLEtBQVY7QUFDRCxXQW5OSDs7QUFxTkQsS0EzZmMsbUJBQWpCIiwiZmlsZSI6Im9yZGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgbWluaW1hdGNoIGZyb20gJ21pbmltYXRjaCc7XG5pbXBvcnQgaW5jbHVkZXMgZnJvbSAnYXJyYXktaW5jbHVkZXMnO1xuaW1wb3J0IGdyb3VwQnkgZnJvbSAnb2JqZWN0Lmdyb3VwYnknO1xuaW1wb3J0IHsgZ2V0U2NvcGUsIGdldFNvdXJjZUNvZGUgfSBmcm9tICdlc2xpbnQtbW9kdWxlLXV0aWxzL2NvbnRleHRDb21wYXQnO1xuaW1wb3J0IHRyaW1FbmQgZnJvbSAnc3RyaW5nLnByb3RvdHlwZS50cmltZW5kJztcblxuaW1wb3J0IGltcG9ydFR5cGUgZnJvbSAnLi4vY29yZS9pbXBvcnRUeXBlJztcbmltcG9ydCBpc1N0YXRpY1JlcXVpcmUgZnJvbSAnLi4vY29yZS9zdGF0aWNSZXF1aXJlJztcbmltcG9ydCBkb2NzVXJsIGZyb20gJy4uL2RvY3NVcmwnO1xuXG5jb25zdCBjYXRlZ29yaWVzID0ge1xuICBuYW1lZDogJ25hbWVkJyxcbiAgaW1wb3J0OiAnaW1wb3J0JyxcbiAgZXhwb3J0czogJ2V4cG9ydHMnLFxufTtcblxuY29uc3QgZGVmYXVsdEdyb3VwcyA9IFsnYnVpbHRpbicsICdleHRlcm5hbCcsICdwYXJlbnQnLCAnc2libGluZycsICdpbmRleCddO1xuXG4vLyBSRVBPUlRJTkcgQU5EIEZJWElOR1xuXG5mdW5jdGlvbiByZXZlcnNlKGFycmF5KSB7XG4gIHJldHVybiBhcnJheS5tYXAoKHYpID0+ICh7IC4uLnYsIHJhbms6IC12LnJhbmsgfSkpLnJldmVyc2UoKTtcbn1cblxuZnVuY3Rpb24gZ2V0VG9rZW5zT3JDb21tZW50c0FmdGVyKHNvdXJjZUNvZGUsIG5vZGUsIGNvdW50KSB7XG4gIGxldCBjdXJyZW50Tm9kZU9yVG9rZW4gPSBub2RlO1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgY3VycmVudE5vZGVPclRva2VuID0gc291cmNlQ29kZS5nZXRUb2tlbk9yQ29tbWVudEFmdGVyKGN1cnJlbnROb2RlT3JUb2tlbik7XG4gICAgaWYgKGN1cnJlbnROb2RlT3JUb2tlbiA9PSBudWxsKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgcmVzdWx0LnB1c2goY3VycmVudE5vZGVPclRva2VuKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBnZXRUb2tlbnNPckNvbW1lbnRzQmVmb3JlKHNvdXJjZUNvZGUsIG5vZGUsIGNvdW50KSB7XG4gIGxldCBjdXJyZW50Tm9kZU9yVG9rZW4gPSBub2RlO1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgY3VycmVudE5vZGVPclRva2VuID0gc291cmNlQ29kZS5nZXRUb2tlbk9yQ29tbWVudEJlZm9yZShjdXJyZW50Tm9kZU9yVG9rZW4pO1xuICAgIGlmIChjdXJyZW50Tm9kZU9yVG9rZW4gPT0gbnVsbCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJlc3VsdC5wdXNoKGN1cnJlbnROb2RlT3JUb2tlbik7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdC5yZXZlcnNlKCk7XG59XG5cbmZ1bmN0aW9uIHRha2VUb2tlbnNBZnRlcldoaWxlKHNvdXJjZUNvZGUsIG5vZGUsIGNvbmRpdGlvbikge1xuICBjb25zdCB0b2tlbnMgPSBnZXRUb2tlbnNPckNvbW1lbnRzQWZ0ZXIoc291cmNlQ29kZSwgbm9kZSwgMTAwKTtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGNvbmRpdGlvbih0b2tlbnNbaV0pKSB7XG4gICAgICByZXN1bHQucHVzaCh0b2tlbnNbaV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gdGFrZVRva2Vuc0JlZm9yZVdoaWxlKHNvdXJjZUNvZGUsIG5vZGUsIGNvbmRpdGlvbikge1xuICBjb25zdCB0b2tlbnMgPSBnZXRUb2tlbnNPckNvbW1lbnRzQmVmb3JlKHNvdXJjZUNvZGUsIG5vZGUsIDEwMCk7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGxldCBpID0gdG9rZW5zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgaWYgKGNvbmRpdGlvbih0b2tlbnNbaV0pKSB7XG4gICAgICByZXN1bHQucHVzaCh0b2tlbnNbaV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdC5yZXZlcnNlKCk7XG59XG5cbmZ1bmN0aW9uIGZpbmRPdXRPZk9yZGVyKGltcG9ydGVkKSB7XG4gIGlmIChpbXBvcnRlZC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgbGV0IG1heFNlZW5SYW5rTm9kZSA9IGltcG9ydGVkWzBdO1xuICByZXR1cm4gaW1wb3J0ZWQuZmlsdGVyKGZ1bmN0aW9uIChpbXBvcnRlZE1vZHVsZSkge1xuICAgIGNvbnN0IHJlcyA9IGltcG9ydGVkTW9kdWxlLnJhbmsgPCBtYXhTZWVuUmFua05vZGUucmFuaztcbiAgICBpZiAobWF4U2VlblJhbmtOb2RlLnJhbmsgPCBpbXBvcnRlZE1vZHVsZS5yYW5rKSB7XG4gICAgICBtYXhTZWVuUmFua05vZGUgPSBpbXBvcnRlZE1vZHVsZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGZpbmRSb290Tm9kZShub2RlKSB7XG4gIGxldCBwYXJlbnQgPSBub2RlO1xuICB3aGlsZSAocGFyZW50LnBhcmVudCAhPSBudWxsICYmIHBhcmVudC5wYXJlbnQuYm9keSA9PSBudWxsKSB7XG4gICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDtcbiAgfVxuICByZXR1cm4gcGFyZW50O1xufVxuXG5mdW5jdGlvbiBjb21tZW50T25TYW1lTGluZUFzKG5vZGUpIHtcbiAgcmV0dXJuICh0b2tlbikgPT4gKHRva2VuLnR5cGUgPT09ICdCbG9jaycgfHwgIHRva2VuLnR5cGUgPT09ICdMaW5lJylcbiAgICAgICYmIHRva2VuLmxvYy5zdGFydC5saW5lID09PSB0b2tlbi5sb2MuZW5kLmxpbmVcbiAgICAgICYmIHRva2VuLmxvYy5lbmQubGluZSA9PT0gbm9kZS5sb2MuZW5kLmxpbmU7XG59XG5cbmZ1bmN0aW9uIGZpbmRFbmRPZkxpbmVXaXRoQ29tbWVudHMoc291cmNlQ29kZSwgbm9kZSkge1xuICBjb25zdCB0b2tlbnNUb0VuZE9mTGluZSA9IHRha2VUb2tlbnNBZnRlcldoaWxlKHNvdXJjZUNvZGUsIG5vZGUsIGNvbW1lbnRPblNhbWVMaW5lQXMobm9kZSkpO1xuICBjb25zdCBlbmRPZlRva2VucyA9IHRva2Vuc1RvRW5kT2ZMaW5lLmxlbmd0aCA+IDBcbiAgICA/IHRva2Vuc1RvRW5kT2ZMaW5lW3Rva2Vuc1RvRW5kT2ZMaW5lLmxlbmd0aCAtIDFdLnJhbmdlWzFdXG4gICAgOiBub2RlLnJhbmdlWzFdO1xuICBsZXQgcmVzdWx0ID0gZW5kT2ZUb2tlbnM7XG4gIGZvciAobGV0IGkgPSBlbmRPZlRva2VuczsgaSA8IHNvdXJjZUNvZGUudGV4dC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzb3VyY2VDb2RlLnRleHRbaV0gPT09ICdcXG4nKSB7XG4gICAgICByZXN1bHQgPSBpICsgMTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpZiAoc291cmNlQ29kZS50ZXh0W2ldICE9PSAnICcgJiYgc291cmNlQ29kZS50ZXh0W2ldICE9PSAnXFx0JyAmJiBzb3VyY2VDb2RlLnRleHRbaV0gIT09ICdcXHInKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgcmVzdWx0ID0gaSArIDE7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZmluZFN0YXJ0T2ZMaW5lV2l0aENvbW1lbnRzKHNvdXJjZUNvZGUsIG5vZGUpIHtcbiAgY29uc3QgdG9rZW5zVG9FbmRPZkxpbmUgPSB0YWtlVG9rZW5zQmVmb3JlV2hpbGUoc291cmNlQ29kZSwgbm9kZSwgY29tbWVudE9uU2FtZUxpbmVBcyhub2RlKSk7XG4gIGNvbnN0IHN0YXJ0T2ZUb2tlbnMgPSB0b2tlbnNUb0VuZE9mTGluZS5sZW5ndGggPiAwID8gdG9rZW5zVG9FbmRPZkxpbmVbMF0ucmFuZ2VbMF0gOiBub2RlLnJhbmdlWzBdO1xuICBsZXQgcmVzdWx0ID0gc3RhcnRPZlRva2VucztcbiAgZm9yIChsZXQgaSA9IHN0YXJ0T2ZUb2tlbnMgLSAxOyBpID4gMDsgaS0tKSB7XG4gICAgaWYgKHNvdXJjZUNvZGUudGV4dFtpXSAhPT0gJyAnICYmIHNvdXJjZUNvZGUudGV4dFtpXSAhPT0gJ1xcdCcpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXN1bHQgPSBpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGZpbmRTcGVjaWZpZXJTdGFydChzb3VyY2VDb2RlLCBub2RlKSB7XG4gIGxldCB0b2tlbjtcblxuICBkbyB7XG4gICAgdG9rZW4gPSBzb3VyY2VDb2RlLmdldFRva2VuQmVmb3JlKG5vZGUpO1xuICB9IHdoaWxlICh0b2tlbi52YWx1ZSAhPT0gJywnICYmIHRva2VuLnZhbHVlICE9PSAneycpO1xuXG4gIHJldHVybiB0b2tlbi5yYW5nZVsxXTtcbn1cblxuZnVuY3Rpb24gZmluZFNwZWNpZmllckVuZChzb3VyY2VDb2RlLCBub2RlKSB7XG4gIGxldCB0b2tlbjtcblxuICBkbyB7XG4gICAgdG9rZW4gPSBzb3VyY2VDb2RlLmdldFRva2VuQWZ0ZXIobm9kZSk7XG4gIH0gd2hpbGUgKHRva2VuLnZhbHVlICE9PSAnLCcgJiYgdG9rZW4udmFsdWUgIT09ICd9Jyk7XG5cbiAgcmV0dXJuIHRva2VuLnJhbmdlWzBdO1xufVxuXG5mdW5jdGlvbiBpc1JlcXVpcmVFeHByZXNzaW9uKGV4cHIpIHtcbiAgcmV0dXJuIGV4cHIgIT0gbnVsbFxuICAgICYmIGV4cHIudHlwZSA9PT0gJ0NhbGxFeHByZXNzaW9uJ1xuICAgICYmIGV4cHIuY2FsbGVlICE9IG51bGxcbiAgICAmJiBleHByLmNhbGxlZS5uYW1lID09PSAncmVxdWlyZSdcbiAgICAmJiBleHByLmFyZ3VtZW50cyAhPSBudWxsXG4gICAgJiYgZXhwci5hcmd1bWVudHMubGVuZ3RoID09PSAxXG4gICAgJiYgZXhwci5hcmd1bWVudHNbMF0udHlwZSA9PT0gJ0xpdGVyYWwnO1xufVxuXG5mdW5jdGlvbiBpc1N1cHBvcnRlZFJlcXVpcmVNb2R1bGUobm9kZSkge1xuICBpZiAobm9kZS50eXBlICE9PSAnVmFyaWFibGVEZWNsYXJhdGlvbicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKG5vZGUuZGVjbGFyYXRpb25zLmxlbmd0aCAhPT0gMSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBkZWNsID0gbm9kZS5kZWNsYXJhdGlvbnNbMF07XG4gIGNvbnN0IGlzUGxhaW5SZXF1aXJlID0gZGVjbC5pZFxuICAgICYmIChkZWNsLmlkLnR5cGUgPT09ICdJZGVudGlmaWVyJyB8fCBkZWNsLmlkLnR5cGUgPT09ICdPYmplY3RQYXR0ZXJuJylcbiAgICAmJiBpc1JlcXVpcmVFeHByZXNzaW9uKGRlY2wuaW5pdCk7XG4gIGNvbnN0IGlzUmVxdWlyZVdpdGhNZW1iZXJFeHByZXNzaW9uID0gZGVjbC5pZFxuICAgICYmIChkZWNsLmlkLnR5cGUgPT09ICdJZGVudGlmaWVyJyB8fCBkZWNsLmlkLnR5cGUgPT09ICdPYmplY3RQYXR0ZXJuJylcbiAgICAmJiBkZWNsLmluaXQgIT0gbnVsbFxuICAgICYmIGRlY2wuaW5pdC50eXBlID09PSAnQ2FsbEV4cHJlc3Npb24nXG4gICAgJiYgZGVjbC5pbml0LmNhbGxlZSAhPSBudWxsXG4gICAgJiYgZGVjbC5pbml0LmNhbGxlZS50eXBlID09PSAnTWVtYmVyRXhwcmVzc2lvbidcbiAgICAmJiBpc1JlcXVpcmVFeHByZXNzaW9uKGRlY2wuaW5pdC5jYWxsZWUub2JqZWN0KTtcbiAgcmV0dXJuIGlzUGxhaW5SZXF1aXJlIHx8IGlzUmVxdWlyZVdpdGhNZW1iZXJFeHByZXNzaW9uO1xufVxuXG5mdW5jdGlvbiBpc1BsYWluSW1wb3J0TW9kdWxlKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ0ltcG9ydERlY2xhcmF0aW9uJyAmJiBub2RlLnNwZWNpZmllcnMgIT0gbnVsbCAmJiBub2RlLnNwZWNpZmllcnMubGVuZ3RoID4gMDtcbn1cblxuZnVuY3Rpb24gaXNQbGFpbkltcG9ydEVxdWFscyhub2RlKSB7XG4gIHJldHVybiBub2RlLnR5cGUgPT09ICdUU0ltcG9ydEVxdWFsc0RlY2xhcmF0aW9uJyAmJiBub2RlLm1vZHVsZVJlZmVyZW5jZS5leHByZXNzaW9uO1xufVxuXG5mdW5jdGlvbiBpc0NKU0V4cG9ydHMoY29udGV4dCwgbm9kZSkge1xuICBpZiAoXG4gICAgbm9kZS50eXBlID09PSAnTWVtYmVyRXhwcmVzc2lvbidcbiAgICAmJiBub2RlLm9iamVjdC50eXBlID09PSAnSWRlbnRpZmllcidcbiAgICAmJiBub2RlLnByb3BlcnR5LnR5cGUgPT09ICdJZGVudGlmaWVyJ1xuICAgICYmIG5vZGUub2JqZWN0Lm5hbWUgPT09ICdtb2R1bGUnXG4gICAgJiYgbm9kZS5wcm9wZXJ0eS5uYW1lID09PSAnZXhwb3J0cydcbiAgKSB7XG4gICAgcmV0dXJuIGdldFNjb3BlKGNvbnRleHQsIG5vZGUpLnZhcmlhYmxlcy5maW5kSW5kZXgoKHZhcmlhYmxlKSA9PiB2YXJpYWJsZS5uYW1lID09PSAnbW9kdWxlJykgPT09IC0xO1xuICB9XG4gIGlmIChcbiAgICBub2RlLnR5cGUgPT09ICdJZGVudGlmaWVyJ1xuICAgICYmIG5vZGUubmFtZSA9PT0gJ2V4cG9ydHMnXG4gICkge1xuICAgIHJldHVybiBnZXRTY29wZShjb250ZXh0LCBub2RlKS52YXJpYWJsZXMuZmluZEluZGV4KCh2YXJpYWJsZSkgPT4gdmFyaWFibGUubmFtZSA9PT0gJ2V4cG9ydHMnKSA9PT0gLTE7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TmFtZWRDSlNFeHBvcnRzKGNvbnRleHQsIG5vZGUpIHtcbiAgaWYgKG5vZGUudHlwZSAhPT0gJ01lbWJlckV4cHJlc3Npb24nKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBsZXQgcm9vdCA9IG5vZGU7XG4gIGxldCBwYXJlbnQgPSBudWxsO1xuICB3aGlsZSAocm9vdC50eXBlID09PSAnTWVtYmVyRXhwcmVzc2lvbicpIHtcbiAgICBpZiAocm9vdC5wcm9wZXJ0eS50eXBlICE9PSAnSWRlbnRpZmllcicpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVzdWx0LnVuc2hpZnQocm9vdC5wcm9wZXJ0eS5uYW1lKTtcbiAgICBwYXJlbnQgPSByb290O1xuICAgIHJvb3QgPSByb290Lm9iamVjdDtcbiAgfVxuXG4gIGlmIChpc0NKU0V4cG9ydHMoY29udGV4dCwgcm9vdCkpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgaWYgKGlzQ0pTRXhwb3J0cyhjb250ZXh0LCBwYXJlbnQpKSB7XG4gICAgcmV0dXJuIHJlc3VsdC5zbGljZSgxKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYW5Dcm9zc05vZGVXaGlsZVJlb3JkZXIobm9kZSkge1xuICByZXR1cm4gaXNTdXBwb3J0ZWRSZXF1aXJlTW9kdWxlKG5vZGUpIHx8IGlzUGxhaW5JbXBvcnRNb2R1bGUobm9kZSkgfHwgaXNQbGFpbkltcG9ydEVxdWFscyhub2RlKTtcbn1cblxuZnVuY3Rpb24gY2FuUmVvcmRlckl0ZW1zKGZpcnN0Tm9kZSwgc2Vjb25kTm9kZSkge1xuICBjb25zdCBwYXJlbnQgPSBmaXJzdE5vZGUucGFyZW50O1xuICBjb25zdCBbZmlyc3RJbmRleCwgc2Vjb25kSW5kZXhdID0gW1xuICAgIHBhcmVudC5ib2R5LmluZGV4T2YoZmlyc3ROb2RlKSxcbiAgICBwYXJlbnQuYm9keS5pbmRleE9mKHNlY29uZE5vZGUpLFxuICBdLnNvcnQoKTtcbiAgY29uc3Qgbm9kZXNCZXR3ZWVuID0gcGFyZW50LmJvZHkuc2xpY2UoZmlyc3RJbmRleCwgc2Vjb25kSW5kZXggKyAxKTtcbiAgZm9yIChjb25zdCBub2RlQmV0d2VlbiBvZiBub2Rlc0JldHdlZW4pIHtcbiAgICBpZiAoIWNhbkNyb3NzTm9kZVdoaWxlUmVvcmRlcihub2RlQmV0d2VlbikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIG1ha2VJbXBvcnREZXNjcmlwdGlvbihub2RlKSB7XG4gIGlmIChub2RlLnR5cGUgPT09ICdleHBvcnQnKSB7XG4gICAgaWYgKG5vZGUubm9kZS5leHBvcnRLaW5kID09PSAndHlwZScpIHtcbiAgICAgIHJldHVybiAndHlwZSBleHBvcnQnO1xuICAgIH1cbiAgICByZXR1cm4gJ2V4cG9ydCc7XG4gIH1cbiAgaWYgKG5vZGUubm9kZS5pbXBvcnRLaW5kID09PSAndHlwZScpIHtcbiAgICByZXR1cm4gJ3R5cGUgaW1wb3J0JztcbiAgfVxuICBpZiAobm9kZS5ub2RlLmltcG9ydEtpbmQgPT09ICd0eXBlb2YnKSB7XG4gICAgcmV0dXJuICd0eXBlb2YgaW1wb3J0JztcbiAgfVxuICByZXR1cm4gJ2ltcG9ydCc7XG59XG5cbmZ1bmN0aW9uIGZpeE91dE9mT3JkZXIoY29udGV4dCwgZmlyc3ROb2RlLCBzZWNvbmROb2RlLCBvcmRlciwgY2F0ZWdvcnkpIHtcbiAgY29uc3QgaXNOYW1lZCA9IGNhdGVnb3J5ID09PSBjYXRlZ29yaWVzLm5hbWVkO1xuICBjb25zdCBpc0V4cG9ydHMgPSBjYXRlZ29yeSA9PT0gY2F0ZWdvcmllcy5leHBvcnRzO1xuICBjb25zdCBzb3VyY2VDb2RlID0gZ2V0U291cmNlQ29kZShjb250ZXh0KTtcblxuICBjb25zdCB7XG4gICAgZmlyc3RSb290LFxuICAgIHNlY29uZFJvb3QsXG4gIH0gPSBpc05hbWVkID8ge1xuICAgIGZpcnN0Um9vdDogZmlyc3ROb2RlLm5vZGUsXG4gICAgc2Vjb25kUm9vdDogc2Vjb25kTm9kZS5ub2RlLFxuICB9IDoge1xuICAgIGZpcnN0Um9vdDogZmluZFJvb3ROb2RlKGZpcnN0Tm9kZS5ub2RlKSxcbiAgICBzZWNvbmRSb290OiBmaW5kUm9vdE5vZGUoc2Vjb25kTm9kZS5ub2RlKSxcbiAgfTtcblxuICBjb25zdCB7XG4gICAgZmlyc3RSb290U3RhcnQsXG4gICAgZmlyc3RSb290RW5kLFxuICAgIHNlY29uZFJvb3RTdGFydCxcbiAgICBzZWNvbmRSb290RW5kLFxuICB9ID0gaXNOYW1lZCA/IHtcbiAgICBmaXJzdFJvb3RTdGFydDogZmluZFNwZWNpZmllclN0YXJ0KHNvdXJjZUNvZGUsIGZpcnN0Um9vdCksXG4gICAgZmlyc3RSb290RW5kOiBmaW5kU3BlY2lmaWVyRW5kKHNvdXJjZUNvZGUsIGZpcnN0Um9vdCksXG4gICAgc2Vjb25kUm9vdFN0YXJ0OiBmaW5kU3BlY2lmaWVyU3RhcnQoc291cmNlQ29kZSwgc2Vjb25kUm9vdCksXG4gICAgc2Vjb25kUm9vdEVuZDogZmluZFNwZWNpZmllckVuZChzb3VyY2VDb2RlLCBzZWNvbmRSb290KSxcbiAgfSA6IHtcbiAgICBmaXJzdFJvb3RTdGFydDogZmluZFN0YXJ0T2ZMaW5lV2l0aENvbW1lbnRzKHNvdXJjZUNvZGUsIGZpcnN0Um9vdCksXG4gICAgZmlyc3RSb290RW5kOiBmaW5kRW5kT2ZMaW5lV2l0aENvbW1lbnRzKHNvdXJjZUNvZGUsIGZpcnN0Um9vdCksXG4gICAgc2Vjb25kUm9vdFN0YXJ0OiBmaW5kU3RhcnRPZkxpbmVXaXRoQ29tbWVudHMoc291cmNlQ29kZSwgc2Vjb25kUm9vdCksXG4gICAgc2Vjb25kUm9vdEVuZDogZmluZEVuZE9mTGluZVdpdGhDb21tZW50cyhzb3VyY2VDb2RlLCBzZWNvbmRSb290KSxcbiAgfTtcblxuICBpZiAoZmlyc3ROb2RlLmRpc3BsYXlOYW1lID09PSBzZWNvbmROb2RlLmRpc3BsYXlOYW1lKSB7XG4gICAgaWYgKGZpcnN0Tm9kZS5hbGlhcykge1xuICAgICAgZmlyc3ROb2RlLmRpc3BsYXlOYW1lID0gYCR7Zmlyc3ROb2RlLmRpc3BsYXlOYW1lfSBhcyAke2ZpcnN0Tm9kZS5hbGlhc31gO1xuICAgIH1cbiAgICBpZiAoc2Vjb25kTm9kZS5hbGlhcykge1xuICAgICAgc2Vjb25kTm9kZS5kaXNwbGF5TmFtZSA9IGAke3NlY29uZE5vZGUuZGlzcGxheU5hbWV9IGFzICR7c2Vjb25kTm9kZS5hbGlhc31gO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGZpcnN0SW1wb3J0ID0gYCR7bWFrZUltcG9ydERlc2NyaXB0aW9uKGZpcnN0Tm9kZSl9IG9mIFxcYCR7Zmlyc3ROb2RlLmRpc3BsYXlOYW1lfVxcYGA7XG4gIGNvbnN0IHNlY29uZEltcG9ydCA9IGBcXGAke3NlY29uZE5vZGUuZGlzcGxheU5hbWV9XFxgICR7bWFrZUltcG9ydERlc2NyaXB0aW9uKHNlY29uZE5vZGUpfWA7XG4gIGNvbnN0IG1lc3NhZ2UgPSBgJHtzZWNvbmRJbXBvcnR9IHNob3VsZCBvY2N1ciAke29yZGVyfSAke2ZpcnN0SW1wb3J0fWA7XG5cbiAgaWYgKGlzTmFtZWQpIHtcbiAgICBjb25zdCBmaXJzdENvZGUgPSBzb3VyY2VDb2RlLnRleHQuc2xpY2UoZmlyc3RSb290U3RhcnQsIGZpcnN0Um9vdC5yYW5nZVsxXSk7XG4gICAgY29uc3QgZmlyc3RUcml2aWEgPSBzb3VyY2VDb2RlLnRleHQuc2xpY2UoZmlyc3RSb290LnJhbmdlWzFdLCBmaXJzdFJvb3RFbmQpO1xuICAgIGNvbnN0IHNlY29uZENvZGUgPSBzb3VyY2VDb2RlLnRleHQuc2xpY2Uoc2Vjb25kUm9vdFN0YXJ0LCBzZWNvbmRSb290LnJhbmdlWzFdKTtcbiAgICBjb25zdCBzZWNvbmRUcml2aWEgPSBzb3VyY2VDb2RlLnRleHQuc2xpY2Uoc2Vjb25kUm9vdC5yYW5nZVsxXSwgc2Vjb25kUm9vdEVuZCk7XG5cbiAgICBpZiAob3JkZXIgPT09ICdiZWZvcmUnKSB7XG4gICAgICBjb25zdCB0cmltbWVkVHJpdmlhID0gdHJpbUVuZChzZWNvbmRUcml2aWEpO1xuICAgICAgY29uc3QgZ2FwQ29kZSA9IHNvdXJjZUNvZGUudGV4dC5zbGljZShmaXJzdFJvb3RFbmQsIHNlY29uZFJvb3RTdGFydCAtIDEpO1xuICAgICAgY29uc3Qgd2hpdGVzcGFjZXMgPSBzZWNvbmRUcml2aWEuc2xpY2UodHJpbW1lZFRyaXZpYS5sZW5ndGgpO1xuICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICBub2RlOiBzZWNvbmROb2RlLm5vZGUsXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIGZpeDogKGZpeGVyKSA9PiBmaXhlci5yZXBsYWNlVGV4dFJhbmdlKFxuICAgICAgICAgIFtmaXJzdFJvb3RTdGFydCwgc2Vjb25kUm9vdEVuZF0sXG4gICAgICAgICAgYCR7c2Vjb25kQ29kZX0sJHt0cmltbWVkVHJpdmlhfSR7Zmlyc3RDb2RlfSR7Zmlyc3RUcml2aWF9JHtnYXBDb2RlfSR7d2hpdGVzcGFjZXN9YCxcbiAgICAgICAgKSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAob3JkZXIgPT09ICdhZnRlcicpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWRUcml2aWEgPSB0cmltRW5kKGZpcnN0VHJpdmlhKTtcbiAgICAgIGNvbnN0IGdhcENvZGUgPSBzb3VyY2VDb2RlLnRleHQuc2xpY2Uoc2Vjb25kUm9vdEVuZCArIDEsIGZpcnN0Um9vdFN0YXJ0KTtcbiAgICAgIGNvbnN0IHdoaXRlc3BhY2VzID0gZmlyc3RUcml2aWEuc2xpY2UodHJpbW1lZFRyaXZpYS5sZW5ndGgpO1xuICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICBub2RlOiBzZWNvbmROb2RlLm5vZGUsXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIGZpeDogKGZpeGVzKSA9PiBmaXhlcy5yZXBsYWNlVGV4dFJhbmdlKFxuICAgICAgICAgIFtzZWNvbmRSb290U3RhcnQsIGZpcnN0Um9vdEVuZF0sXG4gICAgICAgICAgYCR7Z2FwQ29kZX0ke2ZpcnN0Q29kZX0sJHt0cmltbWVkVHJpdmlhfSR7c2Vjb25kQ29kZX0ke3doaXRlc3BhY2VzfWAsXG4gICAgICAgICksXG4gICAgICB9KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgY2FuRml4ID0gaXNFeHBvcnRzIHx8IGNhblJlb3JkZXJJdGVtcyhmaXJzdFJvb3QsIHNlY29uZFJvb3QpO1xuICAgIGxldCBuZXdDb2RlID0gc291cmNlQ29kZS50ZXh0LnN1YnN0cmluZyhzZWNvbmRSb290U3RhcnQsIHNlY29uZFJvb3RFbmQpO1xuXG4gICAgaWYgKG5ld0NvZGVbbmV3Q29kZS5sZW5ndGggLSAxXSAhPT0gJ1xcbicpIHtcbiAgICAgIG5ld0NvZGUgPSBgJHtuZXdDb2RlfVxcbmA7XG4gICAgfVxuXG4gICAgaWYgKG9yZGVyID09PSAnYmVmb3JlJykge1xuICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICBub2RlOiBzZWNvbmROb2RlLm5vZGUsXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIGZpeDogY2FuRml4ICYmICgoZml4ZXIpID0+IGZpeGVyLnJlcGxhY2VUZXh0UmFuZ2UoXG4gICAgICAgICAgW2ZpcnN0Um9vdFN0YXJ0LCBzZWNvbmRSb290RW5kXSxcbiAgICAgICAgICBuZXdDb2RlICsgc291cmNlQ29kZS50ZXh0LnN1YnN0cmluZyhmaXJzdFJvb3RTdGFydCwgc2Vjb25kUm9vdFN0YXJ0KSxcbiAgICAgICAgKSksXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKG9yZGVyID09PSAnYWZ0ZXInKSB7XG4gICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgIG5vZGU6IHNlY29uZE5vZGUubm9kZSxcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgZml4OiBjYW5GaXggJiYgKChmaXhlcikgPT4gZml4ZXIucmVwbGFjZVRleHRSYW5nZShcbiAgICAgICAgICBbc2Vjb25kUm9vdFN0YXJ0LCBmaXJzdFJvb3RFbmRdLFxuICAgICAgICAgIHNvdXJjZUNvZGUudGV4dC5zdWJzdHJpbmcoc2Vjb25kUm9vdEVuZCwgZmlyc3RSb290RW5kKSArIG5ld0NvZGUsXG4gICAgICAgICkpLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlcG9ydE91dE9mT3JkZXIoY29udGV4dCwgaW1wb3J0ZWQsIG91dE9mT3JkZXIsIG9yZGVyLCBjYXRlZ29yeSkge1xuICBvdXRPZk9yZGVyLmZvckVhY2goZnVuY3Rpb24gKGltcCkge1xuICAgIGNvbnN0IGZvdW5kID0gaW1wb3J0ZWQuZmluZChmdW5jdGlvbiBoYXNIaWdoZXJSYW5rKGltcG9ydGVkSXRlbSkge1xuICAgICAgcmV0dXJuIGltcG9ydGVkSXRlbS5yYW5rID4gaW1wLnJhbms7XG4gICAgfSk7XG4gICAgZml4T3V0T2ZPcmRlcihjb250ZXh0LCBmb3VuZCwgaW1wLCBvcmRlciwgY2F0ZWdvcnkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gbWFrZU91dE9mT3JkZXJSZXBvcnQoY29udGV4dCwgaW1wb3J0ZWQsIGNhdGVnb3J5KSB7XG4gIGNvbnN0IG91dE9mT3JkZXIgPSBmaW5kT3V0T2ZPcmRlcihpbXBvcnRlZCk7XG4gIGlmICghb3V0T2ZPcmRlci5sZW5ndGgpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBUaGVyZSBhcmUgdGhpbmdzIHRvIHJlcG9ydC4gVHJ5IHRvIG1pbmltaXplIHRoZSBudW1iZXIgb2YgcmVwb3J0ZWQgZXJyb3JzLlxuICBjb25zdCByZXZlcnNlZEltcG9ydGVkID0gcmV2ZXJzZShpbXBvcnRlZCk7XG4gIGNvbnN0IHJldmVyc2VkT3JkZXIgPSBmaW5kT3V0T2ZPcmRlcihyZXZlcnNlZEltcG9ydGVkKTtcbiAgaWYgKHJldmVyc2VkT3JkZXIubGVuZ3RoIDwgb3V0T2ZPcmRlci5sZW5ndGgpIHtcbiAgICByZXBvcnRPdXRPZk9yZGVyKGNvbnRleHQsIHJldmVyc2VkSW1wb3J0ZWQsIHJldmVyc2VkT3JkZXIsICdhZnRlcicsIGNhdGVnb3J5KTtcbiAgICByZXR1cm47XG4gIH1cbiAgcmVwb3J0T3V0T2ZPcmRlcihjb250ZXh0LCBpbXBvcnRlZCwgb3V0T2ZPcmRlciwgJ2JlZm9yZScsIGNhdGVnb3J5KTtcbn1cblxuY29uc3QgY29tcGFyZVN0cmluZyA9IChhLCBiKSA9PiB7XG4gIGlmIChhIDwgYikge1xuICAgIHJldHVybiAtMTtcbiAgfVxuICBpZiAoYSA+IGIpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuICByZXR1cm4gMDtcbn07XG5cbi8qKiBTb21lIHBhcnNlcnMgKGxhbmd1YWdlcyB3aXRob3V0IHR5cGVzKSBkb24ndCBwcm92aWRlIEltcG9ydEtpbmQgKi9cbmNvbnN0IERFRkFVTFRfSU1QT1JUX0tJTkQgPSAndmFsdWUnO1xuY29uc3QgZ2V0Tm9ybWFsaXplZFZhbHVlID0gKG5vZGUsIHRvTG93ZXJDYXNlKSA9PiB7XG4gIGNvbnN0IHZhbHVlID0gbm9kZS52YWx1ZTtcbiAgcmV0dXJuIHRvTG93ZXJDYXNlID8gU3RyaW5nKHZhbHVlKS50b0xvd2VyQ2FzZSgpIDogdmFsdWU7XG59O1xuXG5mdW5jdGlvbiBnZXRTb3J0ZXIoYWxwaGFiZXRpemVPcHRpb25zKSB7XG4gIGNvbnN0IG11bHRpcGxpZXIgPSBhbHBoYWJldGl6ZU9wdGlvbnMub3JkZXIgPT09ICdhc2MnID8gMSA6IC0xO1xuICBjb25zdCBvcmRlckltcG9ydEtpbmQgPSBhbHBoYWJldGl6ZU9wdGlvbnMub3JkZXJJbXBvcnRLaW5kO1xuICBjb25zdCBtdWx0aXBsaWVySW1wb3J0S2luZCA9IG9yZGVySW1wb3J0S2luZCAhPT0gJ2lnbm9yZSdcbiAgICAmJiAoYWxwaGFiZXRpemVPcHRpb25zLm9yZGVySW1wb3J0S2luZCA9PT0gJ2FzYycgPyAxIDogLTEpO1xuXG4gIHJldHVybiBmdW5jdGlvbiBpbXBvcnRzU29ydGVyKG5vZGVBLCBub2RlQikge1xuICAgIGNvbnN0IGltcG9ydEEgPSBnZXROb3JtYWxpemVkVmFsdWUobm9kZUEsIGFscGhhYmV0aXplT3B0aW9ucy5jYXNlSW5zZW5zaXRpdmUpO1xuICAgIGNvbnN0IGltcG9ydEIgPSBnZXROb3JtYWxpemVkVmFsdWUobm9kZUIsIGFscGhhYmV0aXplT3B0aW9ucy5jYXNlSW5zZW5zaXRpdmUpO1xuICAgIGxldCByZXN1bHQgPSAwO1xuXG4gICAgaWYgKCFpbmNsdWRlcyhpbXBvcnRBLCAnLycpICYmICFpbmNsdWRlcyhpbXBvcnRCLCAnLycpKSB7XG4gICAgICByZXN1bHQgPSBjb21wYXJlU3RyaW5nKGltcG9ydEEsIGltcG9ydEIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBBID0gaW1wb3J0QS5zcGxpdCgnLycpO1xuICAgICAgY29uc3QgQiA9IGltcG9ydEIuc3BsaXQoJy8nKTtcbiAgICAgIGNvbnN0IGEgPSBBLmxlbmd0aDtcbiAgICAgIGNvbnN0IGIgPSBCLmxlbmd0aDtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBNYXRoLm1pbihhLCBiKTsgaSsrKSB7XG4gICAgICAgIC8vIFNraXAgY29tcGFyaW5nIHRoZSBmaXJzdCBwYXRoIHNlZ21lbnQsIGlmIHRoZXkgYXJlIHJlbGF0aXZlIHNlZ21lbnRzIGZvciBib3RoIGltcG9ydHNcbiAgICAgICAgaWYgKGkgPT09IDAgJiYgKChBW2ldID09PSAnLicgfHwgQVtpXSA9PT0gJy4uJykgJiYgKEJbaV0gPT09ICcuJyB8fCBCW2ldID09PSAnLi4nKSkpIHtcbiAgICAgICAgICAvLyBJZiBvbmUgaXMgc2libGluZyBhbmQgdGhlIG90aGVyIHBhcmVudCBpbXBvcnQsIG5vIG5lZWQgdG8gY29tcGFyZSBhdCBhbGwsIHNpbmNlIHRoZSBwYXRocyBiZWxvbmcgaW4gZGlmZmVyZW50IGdyb3Vwc1xuICAgICAgICAgIGlmIChBW2ldICE9PSBCW2ldKSB7IGJyZWFrOyB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ID0gY29tcGFyZVN0cmluZyhBW2ldLCBCW2ldKTtcbiAgICAgICAgaWYgKHJlc3VsdCkgeyBicmVhazsgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXJlc3VsdCAmJiBhICE9PSBiKSB7XG4gICAgICAgIHJlc3VsdCA9IGEgPCBiID8gLTEgOiAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlc3VsdCA9IHJlc3VsdCAqIG11bHRpcGxpZXI7XG5cbiAgICAvLyBJbiBjYXNlIHRoZSBwYXRocyBhcmUgZXF1YWwgKHJlc3VsdCA9PT0gMCksIHNvcnQgdGhlbSBieSBpbXBvcnRLaW5kXG4gICAgaWYgKCFyZXN1bHQgJiYgbXVsdGlwbGllckltcG9ydEtpbmQpIHtcbiAgICAgIHJlc3VsdCA9IG11bHRpcGxpZXJJbXBvcnRLaW5kICogY29tcGFyZVN0cmluZyhcbiAgICAgICAgbm9kZUEubm9kZS5pbXBvcnRLaW5kIHx8IERFRkFVTFRfSU1QT1JUX0tJTkQsXG4gICAgICAgIG5vZGVCLm5vZGUuaW1wb3J0S2luZCB8fCBERUZBVUxUX0lNUE9SVF9LSU5ELFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuXG5mdW5jdGlvbiBtdXRhdGVSYW5rc1RvQWxwaGFiZXRpemUoaW1wb3J0ZWQsIGFscGhhYmV0aXplT3B0aW9ucykge1xuICBjb25zdCBncm91cGVkQnlSYW5rcyA9IGdyb3VwQnkoaW1wb3J0ZWQsIChpdGVtKSA9PiBpdGVtLnJhbmspO1xuXG4gIGNvbnN0IHNvcnRlckZuID0gZ2V0U29ydGVyKGFscGhhYmV0aXplT3B0aW9ucyk7XG5cbiAgLy8gc29ydCBncm91cCBrZXlzIHNvIHRoYXQgdGhleSBjYW4gYmUgaXRlcmF0ZWQgb24gaW4gb3JkZXJcbiAgY29uc3QgZ3JvdXBSYW5rcyA9IE9iamVjdC5rZXlzKGdyb3VwZWRCeVJhbmtzKS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGEgLSBiO1xuICB9KTtcblxuICAvLyBzb3J0IGltcG9ydHMgbG9jYWxseSB3aXRoaW4gdGhlaXIgZ3JvdXBcbiAgZ3JvdXBSYW5rcy5mb3JFYWNoKGZ1bmN0aW9uIChncm91cFJhbmspIHtcbiAgICBncm91cGVkQnlSYW5rc1tncm91cFJhbmtdLnNvcnQoc29ydGVyRm4pO1xuICB9KTtcblxuICAvLyBhc3NpZ24gZ2xvYmFsbHkgdW5pcXVlIHJhbmsgdG8gZWFjaCBpbXBvcnRcbiAgbGV0IG5ld1JhbmsgPSAwO1xuICBjb25zdCBhbHBoYWJldGl6ZWRSYW5rcyA9IGdyb3VwUmFua3MucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGdyb3VwUmFuaykge1xuICAgIGdyb3VwZWRCeVJhbmtzW2dyb3VwUmFua10uZm9yRWFjaChmdW5jdGlvbiAoaW1wb3J0ZWRJdGVtKSB7XG4gICAgICBhY2NbYCR7aW1wb3J0ZWRJdGVtLnZhbHVlfXwke2ltcG9ydGVkSXRlbS5ub2RlLmltcG9ydEtpbmR9YF0gPSBwYXJzZUludChncm91cFJhbmssIDEwKSArIG5ld1Jhbms7XG4gICAgICBuZXdSYW5rICs9IDE7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xuXG4gIC8vIG11dGF0ZSB0aGUgb3JpZ2luYWwgZ3JvdXAtcmFuayB3aXRoIGFscGhhYmV0aXplZC1yYW5rXG4gIGltcG9ydGVkLmZvckVhY2goZnVuY3Rpb24gKGltcG9ydGVkSXRlbSkge1xuICAgIGltcG9ydGVkSXRlbS5yYW5rID0gYWxwaGFiZXRpemVkUmFua3NbYCR7aW1wb3J0ZWRJdGVtLnZhbHVlfXwke2ltcG9ydGVkSXRlbS5ub2RlLmltcG9ydEtpbmR9YF07XG4gIH0pO1xufVxuXG4vLyBERVRFQ1RJTkdcblxuZnVuY3Rpb24gY29tcHV0ZVBhdGhSYW5rKHJhbmtzLCBwYXRoR3JvdXBzLCBwYXRoLCBtYXhQb3NpdGlvbikge1xuICBmb3IgKGxldCBpID0gMCwgbCA9IHBhdGhHcm91cHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgY29uc3QgeyBwYXR0ZXJuLCBwYXR0ZXJuT3B0aW9ucywgZ3JvdXAsIHBvc2l0aW9uID0gMSB9ID0gcGF0aEdyb3Vwc1tpXTtcbiAgICBpZiAobWluaW1hdGNoKHBhdGgsIHBhdHRlcm4sIHBhdHRlcm5PcHRpb25zIHx8IHsgbm9jb21tZW50OiB0cnVlIH0pKSB7XG4gICAgICByZXR1cm4gcmFua3NbZ3JvdXBdICsgcG9zaXRpb24gLyBtYXhQb3NpdGlvbjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tcHV0ZVJhbmsoY29udGV4dCwgcmFua3MsIGltcG9ydEVudHJ5LCBleGNsdWRlZEltcG9ydFR5cGVzLCBpc1NvcnRpbmdUeXBlc0dyb3VwKSB7XG4gIGxldCBpbXBUeXBlO1xuICBsZXQgcmFuaztcblxuICBjb25zdCBpc1R5cGVHcm91cEluR3JvdXBzID0gcmFua3Mub21pdHRlZFR5cGVzLmluZGV4T2YoJ3R5cGUnKSA9PT0gLTE7XG4gIGNvbnN0IGlzVHlwZU9ubHlJbXBvcnQgPSBpbXBvcnRFbnRyeS5ub2RlLmltcG9ydEtpbmQgPT09ICd0eXBlJztcbiAgY29uc3QgaXNFeGNsdWRlZEZyb21QYXRoUmFuayA9IGlzVHlwZU9ubHlJbXBvcnQgJiYgaXNUeXBlR3JvdXBJbkdyb3VwcyAmJiBleGNsdWRlZEltcG9ydFR5cGVzLmhhcygndHlwZScpO1xuXG4gIGlmIChpbXBvcnRFbnRyeS50eXBlID09PSAnaW1wb3J0Om9iamVjdCcpIHtcbiAgICBpbXBUeXBlID0gJ29iamVjdCc7XG4gIH0gZWxzZSBpZiAoaXNUeXBlT25seUltcG9ydCAmJiBpc1R5cGVHcm91cEluR3JvdXBzICYmICFpc1NvcnRpbmdUeXBlc0dyb3VwKSB7XG4gICAgaW1wVHlwZSA9ICd0eXBlJztcbiAgfSBlbHNlIHtcbiAgICBpbXBUeXBlID0gaW1wb3J0VHlwZShpbXBvcnRFbnRyeS52YWx1ZSwgY29udGV4dCk7XG4gIH1cblxuICBpZiAoIWV4Y2x1ZGVkSW1wb3J0VHlwZXMuaGFzKGltcFR5cGUpICYmICFpc0V4Y2x1ZGVkRnJvbVBhdGhSYW5rKSB7XG4gICAgcmFuayA9IGNvbXB1dGVQYXRoUmFuayhyYW5rcy5ncm91cHMsIHJhbmtzLnBhdGhHcm91cHMsIGltcG9ydEVudHJ5LnZhbHVlLCByYW5rcy5tYXhQb3NpdGlvbik7XG4gIH1cblxuICBpZiAodHlwZW9mIHJhbmsgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmFuayA9IHJhbmtzLmdyb3Vwc1tpbXBUeXBlXTtcblxuICAgIGlmICh0eXBlb2YgcmFuayA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gIH1cblxuICBpZiAoaXNUeXBlT25seUltcG9ydCAmJiBpc1NvcnRpbmdUeXBlc0dyb3VwKSB7XG4gICAgcmFuayA9IHJhbmtzLmdyb3Vwcy50eXBlICsgcmFuayAvIDEwO1xuICB9XG5cbiAgaWYgKGltcG9ydEVudHJ5LnR5cGUgIT09ICdpbXBvcnQnICYmICFpbXBvcnRFbnRyeS50eXBlLnN0YXJ0c1dpdGgoJ2ltcG9ydDonKSkge1xuICAgIHJhbmsgKz0gMTAwO1xuICB9XG5cbiAgcmV0dXJuIHJhbms7XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyTm9kZShjb250ZXh0LCBpbXBvcnRFbnRyeSwgcmFua3MsIGltcG9ydGVkLCBleGNsdWRlZEltcG9ydFR5cGVzLCBpc1NvcnRpbmdUeXBlc0dyb3VwKSB7XG4gIGNvbnN0IHJhbmsgPSBjb21wdXRlUmFuayhjb250ZXh0LCByYW5rcywgaW1wb3J0RW50cnksIGV4Y2x1ZGVkSW1wb3J0VHlwZXMsIGlzU29ydGluZ1R5cGVzR3JvdXApO1xuICBpZiAocmFuayAhPT0gLTEpIHtcbiAgICBsZXQgaW1wb3J0Tm9kZSA9IGltcG9ydEVudHJ5Lm5vZGU7XG5cbiAgICBpZiAoaW1wb3J0RW50cnkudHlwZSA9PT0gJ3JlcXVpcmUnICYmIGltcG9ydE5vZGUucGFyZW50LnBhcmVudC50eXBlID09PSAnVmFyaWFibGVEZWNsYXJhdGlvbicpIHtcbiAgICAgIGltcG9ydE5vZGUgPSBpbXBvcnROb2RlLnBhcmVudC5wYXJlbnQ7XG4gICAgfVxuXG4gICAgaW1wb3J0ZWQucHVzaCh7XG4gICAgICAuLi5pbXBvcnRFbnRyeSxcbiAgICAgIHJhbmssXG4gICAgICBpc011bHRpbGluZTogaW1wb3J0Tm9kZS5sb2MuZW5kLmxpbmUgIT09IGltcG9ydE5vZGUubG9jLnN0YXJ0LmxpbmUsXG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UmVxdWlyZUJsb2NrKG5vZGUpIHtcbiAgbGV0IG4gPSBub2RlO1xuICAvLyBIYW5kbGUgY2FzZXMgbGlrZSBgY29uc3QgYmF6ID0gcmVxdWlyZSgnZm9vJykuYmFyLmJhemBcbiAgLy8gYW5kIGBjb25zdCBmb28gPSByZXF1aXJlKCdmb28nKSgpYFxuICB3aGlsZSAoXG4gICAgbi5wYXJlbnQudHlwZSA9PT0gJ01lbWJlckV4cHJlc3Npb24nICYmIG4ucGFyZW50Lm9iamVjdCA9PT0gblxuICAgIHx8IG4ucGFyZW50LnR5cGUgPT09ICdDYWxsRXhwcmVzc2lvbicgJiYgbi5wYXJlbnQuY2FsbGVlID09PSBuXG4gICkge1xuICAgIG4gPSBuLnBhcmVudDtcbiAgfVxuICBpZiAoXG4gICAgbi5wYXJlbnQudHlwZSA9PT0gJ1ZhcmlhYmxlRGVjbGFyYXRvcidcbiAgICAmJiBuLnBhcmVudC5wYXJlbnQudHlwZSA9PT0gJ1ZhcmlhYmxlRGVjbGFyYXRpb24nXG4gICAgJiYgbi5wYXJlbnQucGFyZW50LnBhcmVudC50eXBlID09PSAnUHJvZ3JhbSdcbiAgKSB7XG4gICAgcmV0dXJuIG4ucGFyZW50LnBhcmVudC5wYXJlbnQ7XG4gIH1cbn1cblxuY29uc3QgdHlwZXMgPSBbJ2J1aWx0aW4nLCAnZXh0ZXJuYWwnLCAnaW50ZXJuYWwnLCAndW5rbm93bicsICdwYXJlbnQnLCAnc2libGluZycsICdpbmRleCcsICdvYmplY3QnLCAndHlwZSddO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gb2JqZWN0IHdpdGggdHlwZS1yYW5rIHBhaXJzLlxuICpcbiAqIEV4YW1wbGU6IHsgaW5kZXg6IDAsIHNpYmxpbmc6IDEsIHBhcmVudDogMSwgZXh0ZXJuYWw6IDEsIGJ1aWx0aW46IDIsIGludGVybmFsOiAyIH1cbiAqL1xuZnVuY3Rpb24gY29udmVydEdyb3Vwc1RvUmFua3MoZ3JvdXBzKSB7XG4gIGNvbnN0IHJhbmtPYmplY3QgPSBncm91cHMucmVkdWNlKGZ1bmN0aW9uIChyZXMsIGdyb3VwLCBpbmRleCkge1xuICAgIFtdLmNvbmNhdChncm91cCkuZm9yRWFjaChmdW5jdGlvbiAoZ3JvdXBJdGVtKSB7XG4gICAgICByZXNbZ3JvdXBJdGVtXSA9IGluZGV4ICogMjtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzO1xuICB9LCB7fSk7XG5cbiAgY29uc3Qgb21pdHRlZFR5cGVzID0gdHlwZXMuZmlsdGVyKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiByYW5rT2JqZWN0W3R5cGVdID09PSAndW5kZWZpbmVkJztcbiAgfSk7XG5cbiAgY29uc3QgcmFua3MgPSBvbWl0dGVkVHlwZXMucmVkdWNlKGZ1bmN0aW9uIChyZXMsIHR5cGUpIHtcbiAgICByZXNbdHlwZV0gPSBncm91cHMubGVuZ3RoICogMjtcbiAgICByZXR1cm4gcmVzO1xuICB9LCByYW5rT2JqZWN0KTtcblxuICByZXR1cm4geyBncm91cHM6IHJhbmtzLCBvbWl0dGVkVHlwZXMgfTtcbn1cblxuZnVuY3Rpb24gY29udmVydFBhdGhHcm91cHNGb3JSYW5rcyhwYXRoR3JvdXBzKSB7XG4gIGNvbnN0IGFmdGVyID0ge307XG4gIGNvbnN0IGJlZm9yZSA9IHt9O1xuXG4gIGNvbnN0IHRyYW5zZm9ybWVkID0gcGF0aEdyb3Vwcy5tYXAoKHBhdGhHcm91cCwgaW5kZXgpID0+IHtcbiAgICBjb25zdCB7IGdyb3VwLCBwb3NpdGlvbjogcG9zaXRpb25TdHJpbmcgfSA9IHBhdGhHcm91cDtcbiAgICBsZXQgcG9zaXRpb24gPSAwO1xuICAgIGlmIChwb3NpdGlvblN0cmluZyA9PT0gJ2FmdGVyJykge1xuICAgICAgaWYgKCFhZnRlcltncm91cF0pIHtcbiAgICAgICAgYWZ0ZXJbZ3JvdXBdID0gMTtcbiAgICAgIH1cbiAgICAgIHBvc2l0aW9uID0gYWZ0ZXJbZ3JvdXBdKys7XG4gICAgfSBlbHNlIGlmIChwb3NpdGlvblN0cmluZyA9PT0gJ2JlZm9yZScpIHtcbiAgICAgIGlmICghYmVmb3JlW2dyb3VwXSkge1xuICAgICAgICBiZWZvcmVbZ3JvdXBdID0gW107XG4gICAgICB9XG4gICAgICBiZWZvcmVbZ3JvdXBdLnB1c2goaW5kZXgpO1xuICAgIH1cblxuICAgIHJldHVybiB7IC4uLnBhdGhHcm91cCwgcG9zaXRpb24gfTtcbiAgfSk7XG5cbiAgbGV0IG1heFBvc2l0aW9uID0gMTtcblxuICBPYmplY3Qua2V5cyhiZWZvcmUpLmZvckVhY2goKGdyb3VwKSA9PiB7XG4gICAgY29uc3QgZ3JvdXBMZW5ndGggPSBiZWZvcmVbZ3JvdXBdLmxlbmd0aDtcbiAgICBiZWZvcmVbZ3JvdXBdLmZvckVhY2goKGdyb3VwSW5kZXgsIGluZGV4KSA9PiB7XG4gICAgICB0cmFuc2Zvcm1lZFtncm91cEluZGV4XS5wb3NpdGlvbiA9IC0xICogKGdyb3VwTGVuZ3RoIC0gaW5kZXgpO1xuICAgIH0pO1xuICAgIG1heFBvc2l0aW9uID0gTWF0aC5tYXgobWF4UG9zaXRpb24sIGdyb3VwTGVuZ3RoKTtcbiAgfSk7XG5cbiAgT2JqZWN0LmtleXMoYWZ0ZXIpLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGNvbnN0IGdyb3VwTmV4dFBvc2l0aW9uID0gYWZ0ZXJba2V5XTtcbiAgICBtYXhQb3NpdGlvbiA9IE1hdGgubWF4KG1heFBvc2l0aW9uLCBncm91cE5leHRQb3NpdGlvbiAtIDEpO1xuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHBhdGhHcm91cHM6IHRyYW5zZm9ybWVkLFxuICAgIG1heFBvc2l0aW9uOiBtYXhQb3NpdGlvbiA+IDEwID8gTWF0aC5wb3coMTAsIE1hdGguY2VpbChNYXRoLmxvZzEwKG1heFBvc2l0aW9uKSkpIDogMTAsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGZpeE5ld0xpbmVBZnRlckltcG9ydChjb250ZXh0LCBwcmV2aW91c0ltcG9ydCkge1xuICBjb25zdCBwcmV2Um9vdCA9IGZpbmRSb290Tm9kZShwcmV2aW91c0ltcG9ydC5ub2RlKTtcbiAgY29uc3QgdG9rZW5zVG9FbmRPZkxpbmUgPSB0YWtlVG9rZW5zQWZ0ZXJXaGlsZShcbiAgICBnZXRTb3VyY2VDb2RlKGNvbnRleHQpLFxuICAgIHByZXZSb290LFxuICAgIGNvbW1lbnRPblNhbWVMaW5lQXMocHJldlJvb3QpLFxuICApO1xuXG4gIGxldCBlbmRPZkxpbmUgPSBwcmV2Um9vdC5yYW5nZVsxXTtcbiAgaWYgKHRva2Vuc1RvRW5kT2ZMaW5lLmxlbmd0aCA+IDApIHtcbiAgICBlbmRPZkxpbmUgPSB0b2tlbnNUb0VuZE9mTGluZVt0b2tlbnNUb0VuZE9mTGluZS5sZW5ndGggLSAxXS5yYW5nZVsxXTtcbiAgfVxuICByZXR1cm4gKGZpeGVyKSA9PiBmaXhlci5pbnNlcnRUZXh0QWZ0ZXJSYW5nZShbcHJldlJvb3QucmFuZ2VbMF0sIGVuZE9mTGluZV0sICdcXG4nKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlTmV3TGluZUFmdGVySW1wb3J0KGNvbnRleHQsIGN1cnJlbnRJbXBvcnQsIHByZXZpb3VzSW1wb3J0KSB7XG4gIGNvbnN0IHNvdXJjZUNvZGUgPSBnZXRTb3VyY2VDb2RlKGNvbnRleHQpO1xuICBjb25zdCBwcmV2Um9vdCA9IGZpbmRSb290Tm9kZShwcmV2aW91c0ltcG9ydC5ub2RlKTtcbiAgY29uc3QgY3VyclJvb3QgPSBmaW5kUm9vdE5vZGUoY3VycmVudEltcG9ydC5ub2RlKTtcbiAgY29uc3QgcmFuZ2VUb1JlbW92ZSA9IFtcbiAgICBmaW5kRW5kT2ZMaW5lV2l0aENvbW1lbnRzKHNvdXJjZUNvZGUsIHByZXZSb290KSxcbiAgICBmaW5kU3RhcnRPZkxpbmVXaXRoQ29tbWVudHMoc291cmNlQ29kZSwgY3VyclJvb3QpLFxuICBdO1xuICBpZiAoKC9eXFxzKiQvKS50ZXN0KHNvdXJjZUNvZGUudGV4dC5zdWJzdHJpbmcocmFuZ2VUb1JlbW92ZVswXSwgcmFuZ2VUb1JlbW92ZVsxXSkpKSB7XG4gICAgcmV0dXJuIChmaXhlcikgPT4gZml4ZXIucmVtb3ZlUmFuZ2UocmFuZ2VUb1JlbW92ZSk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gbWFrZU5ld2xpbmVzQmV0d2VlblJlcG9ydChjb250ZXh0LCBpbXBvcnRlZCwgbmV3bGluZXNCZXR3ZWVuSW1wb3J0c18sIG5ld2xpbmVzQmV0d2VlblR5cGVPbmx5SW1wb3J0c18sIGRpc3RpbmN0R3JvdXAsIGlzU29ydGluZ1R5cGVzR3JvdXAsIGlzQ29uc29saWRhdGluZ1NwYWNlQmV0d2VlbkltcG9ydHMpIHtcbiAgY29uc3QgZ2V0TnVtYmVyT2ZFbXB0eUxpbmVzQmV0d2VlbiA9IChjdXJyZW50SW1wb3J0LCBwcmV2aW91c0ltcG9ydCkgPT4ge1xuICAgIGNvbnN0IGxpbmVzQmV0d2VlbkltcG9ydHMgPSBnZXRTb3VyY2VDb2RlKGNvbnRleHQpLmxpbmVzLnNsaWNlKFxuICAgICAgcHJldmlvdXNJbXBvcnQubm9kZS5sb2MuZW5kLmxpbmUsXG4gICAgICBjdXJyZW50SW1wb3J0Lm5vZGUubG9jLnN0YXJ0LmxpbmUgLSAxLFxuICAgICk7XG5cbiAgICByZXR1cm4gbGluZXNCZXR3ZWVuSW1wb3J0cy5maWx0ZXIoKGxpbmUpID0+ICFsaW5lLnRyaW0oKS5sZW5ndGgpLmxlbmd0aDtcbiAgfTtcbiAgY29uc3QgZ2V0SXNTdGFydE9mRGlzdGluY3RHcm91cCA9IChjdXJyZW50SW1wb3J0LCBwcmV2aW91c0ltcG9ydCkgPT4gY3VycmVudEltcG9ydC5yYW5rIC0gMSA+PSBwcmV2aW91c0ltcG9ydC5yYW5rO1xuICBsZXQgcHJldmlvdXNJbXBvcnQgPSBpbXBvcnRlZFswXTtcblxuICBpbXBvcnRlZC5zbGljZSgxKS5mb3JFYWNoKGZ1bmN0aW9uIChjdXJyZW50SW1wb3J0KSB7XG4gICAgY29uc3QgZW1wdHlMaW5lc0JldHdlZW4gPSBnZXROdW1iZXJPZkVtcHR5TGluZXNCZXR3ZWVuKFxuICAgICAgY3VycmVudEltcG9ydCxcbiAgICAgIHByZXZpb3VzSW1wb3J0LFxuICAgICk7XG5cbiAgICBjb25zdCBpc1N0YXJ0T2ZEaXN0aW5jdEdyb3VwID0gZ2V0SXNTdGFydE9mRGlzdGluY3RHcm91cChcbiAgICAgIGN1cnJlbnRJbXBvcnQsXG4gICAgICBwcmV2aW91c0ltcG9ydCxcbiAgICApO1xuXG4gICAgY29uc3QgaXNUeXBlT25seUltcG9ydCA9IGN1cnJlbnRJbXBvcnQubm9kZS5pbXBvcnRLaW5kID09PSAndHlwZSc7XG4gICAgY29uc3QgaXNQcmV2aW91c0ltcG9ydFR5cGVPbmx5SW1wb3J0ID0gcHJldmlvdXNJbXBvcnQubm9kZS5pbXBvcnRLaW5kID09PSAndHlwZSc7XG5cbiAgICBjb25zdCBpc05vcm1hbEltcG9ydE5leHRUb1R5cGVPbmx5SW1wb3J0QW5kUmVsZXZhbnQgPSAgICAgIGlzVHlwZU9ubHlJbXBvcnQgIT09IGlzUHJldmlvdXNJbXBvcnRUeXBlT25seUltcG9ydCAmJiBpc1NvcnRpbmdUeXBlc0dyb3VwO1xuXG4gICAgY29uc3QgaXNUeXBlT25seUltcG9ydEFuZFJlbGV2YW50ID0gaXNUeXBlT25seUltcG9ydCAmJiBpc1NvcnRpbmdUeXBlc0dyb3VwO1xuXG4gICAgLy8gSW4gdGhlIHNwZWNpYWwgY2FzZSB3aGVyZSBuZXdsaW5lc0JldHdlZW5JbXBvcnRzIGFuZCBjb25zb2xpZGF0ZUlzbGFuZHNcbiAgICAvLyB3YW50IHRoZSBvcHBvc2l0ZSB0aGluZywgY29uc29saWRhdGVJc2xhbmRzIHdpbnNcbiAgICBjb25zdCBuZXdsaW5lc0JldHdlZW5JbXBvcnRzID0gICAgICBpc1NvcnRpbmdUeXBlc0dyb3VwXG4gICAgICAmJiBpc0NvbnNvbGlkYXRpbmdTcGFjZUJldHdlZW5JbXBvcnRzXG4gICAgICAmJiAocHJldmlvdXNJbXBvcnQuaXNNdWx0aWxpbmUgfHwgY3VycmVudEltcG9ydC5pc011bHRpbGluZSlcbiAgICAgICYmIG5ld2xpbmVzQmV0d2VlbkltcG9ydHNfID09PSAnbmV2ZXInXG4gICAgICA/ICdhbHdheXMtYW5kLWluc2lkZS1ncm91cHMnXG4gICAgICA6IG5ld2xpbmVzQmV0d2VlbkltcG9ydHNfO1xuXG4gICAgLy8gSW4gdGhlIHNwZWNpYWwgY2FzZSB3aGVyZSBuZXdsaW5lc0JldHdlZW5UeXBlT25seUltcG9ydHMgYW5kXG4gICAgLy8gY29uc29saWRhdGVJc2xhbmRzIHdhbnQgdGhlIG9wcG9zaXRlIHRoaW5nLCBjb25zb2xpZGF0ZUlzbGFuZHMgd2luc1xuICAgIGNvbnN0IG5ld2xpbmVzQmV0d2VlblR5cGVPbmx5SW1wb3J0cyA9ICAgICAgaXNTb3J0aW5nVHlwZXNHcm91cFxuICAgICAgJiYgaXNDb25zb2xpZGF0aW5nU3BhY2VCZXR3ZWVuSW1wb3J0c1xuICAgICAgJiYgKGlzTm9ybWFsSW1wb3J0TmV4dFRvVHlwZU9ubHlJbXBvcnRBbmRSZWxldmFudFxuICAgICAgICB8fCBwcmV2aW91c0ltcG9ydC5pc011bHRpbGluZVxuICAgICAgICB8fCBjdXJyZW50SW1wb3J0LmlzTXVsdGlsaW5lKVxuICAgICAgJiYgbmV3bGluZXNCZXR3ZWVuVHlwZU9ubHlJbXBvcnRzXyA9PT0gJ25ldmVyJ1xuICAgICAgPyAnYWx3YXlzLWFuZC1pbnNpZGUtZ3JvdXBzJ1xuICAgICAgOiBuZXdsaW5lc0JldHdlZW5UeXBlT25seUltcG9ydHNfO1xuXG4gICAgY29uc3QgaXNOb3RJZ25vcmVkID0gICAgICBpc1R5cGVPbmx5SW1wb3J0QW5kUmVsZXZhbnRcbiAgICAgICAgJiYgbmV3bGluZXNCZXR3ZWVuVHlwZU9ubHlJbXBvcnRzICE9PSAnaWdub3JlJ1xuICAgICAgfHwgIWlzVHlwZU9ubHlJbXBvcnRBbmRSZWxldmFudCAmJiBuZXdsaW5lc0JldHdlZW5JbXBvcnRzICE9PSAnaWdub3JlJztcblxuICAgIGlmIChpc05vdElnbm9yZWQpIHtcbiAgICAgIGNvbnN0IHNob3VsZEFzc2VydE5ld2xpbmVCZXR3ZWVuR3JvdXBzID0gICAgICAgIChpc1R5cGVPbmx5SW1wb3J0QW5kUmVsZXZhbnQgfHwgaXNOb3JtYWxJbXBvcnROZXh0VG9UeXBlT25seUltcG9ydEFuZFJlbGV2YW50KVxuICAgICAgICAgICYmIChuZXdsaW5lc0JldHdlZW5UeXBlT25seUltcG9ydHMgPT09ICdhbHdheXMnXG4gICAgICAgICAgICB8fCBuZXdsaW5lc0JldHdlZW5UeXBlT25seUltcG9ydHMgPT09ICdhbHdheXMtYW5kLWluc2lkZS1ncm91cHMnKVxuICAgICAgICB8fCAhaXNUeXBlT25seUltcG9ydEFuZFJlbGV2YW50ICYmICFpc05vcm1hbEltcG9ydE5leHRUb1R5cGVPbmx5SW1wb3J0QW5kUmVsZXZhbnRcbiAgICAgICAgICAmJiAobmV3bGluZXNCZXR3ZWVuSW1wb3J0cyA9PT0gJ2Fsd2F5cydcbiAgICAgICAgICAgIHx8IG5ld2xpbmVzQmV0d2VlbkltcG9ydHMgPT09ICdhbHdheXMtYW5kLWluc2lkZS1ncm91cHMnKTtcblxuICAgICAgY29uc3Qgc2hvdWxkQXNzZXJ0Tm9OZXdsaW5lV2l0aGluR3JvdXAgPSAgICAgICAgKGlzVHlwZU9ubHlJbXBvcnRBbmRSZWxldmFudCB8fCBpc05vcm1hbEltcG9ydE5leHRUb1R5cGVPbmx5SW1wb3J0QW5kUmVsZXZhbnQpXG4gICAgICAgICAgJiYgbmV3bGluZXNCZXR3ZWVuVHlwZU9ubHlJbXBvcnRzICE9PSAnYWx3YXlzLWFuZC1pbnNpZGUtZ3JvdXBzJ1xuICAgICAgICB8fCAhaXNUeXBlT25seUltcG9ydEFuZFJlbGV2YW50ICYmICFpc05vcm1hbEltcG9ydE5leHRUb1R5cGVPbmx5SW1wb3J0QW5kUmVsZXZhbnRcbiAgICAgICAgICAmJiBuZXdsaW5lc0JldHdlZW5JbXBvcnRzICE9PSAnYWx3YXlzLWFuZC1pbnNpZGUtZ3JvdXBzJztcblxuICAgICAgY29uc3Qgc2hvdWxkQXNzZXJ0Tm9OZXdsaW5lQmV0d2Vlbkdyb3VwID0gICAgICAgICFpc1NvcnRpbmdUeXBlc0dyb3VwXG4gICAgICAgIHx8ICFpc05vcm1hbEltcG9ydE5leHRUb1R5cGVPbmx5SW1wb3J0QW5kUmVsZXZhbnRcbiAgICAgICAgfHwgbmV3bGluZXNCZXR3ZWVuVHlwZU9ubHlJbXBvcnRzID09PSAnbmV2ZXInO1xuXG4gICAgICBjb25zdCBpc1RoZU5ld2xpbmVCZXR3ZWVuSW1wb3J0c0luVGhlU2FtZUdyb3VwID0gZGlzdGluY3RHcm91cCAmJiBjdXJyZW50SW1wb3J0LnJhbmsgPT09IHByZXZpb3VzSW1wb3J0LnJhbmtcbiAgICAgIHx8ICFkaXN0aW5jdEdyb3VwICYmICFpc1N0YXJ0T2ZEaXN0aW5jdEdyb3VwO1xuXG4gICAgICAvLyBMZXQncyB0cnkgdG8gY3V0IGRvd24gb24gbGludGluZyBlcnJvcnMgc2VudCB0byB0aGUgdXNlclxuICAgICAgbGV0IGFscmVhZHlSZXBvcnRlZCA9IGZhbHNlO1xuXG4gICAgICBpZiAoc2hvdWxkQXNzZXJ0TmV3bGluZUJldHdlZW5Hcm91cHMpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRJbXBvcnQucmFuayAhPT0gcHJldmlvdXNJbXBvcnQucmFuayAmJiBlbXB0eUxpbmVzQmV0d2VlbiA9PT0gMCkge1xuICAgICAgICAgIGlmIChkaXN0aW5jdEdyb3VwIHx8IGlzU3RhcnRPZkRpc3RpbmN0R3JvdXApIHtcbiAgICAgICAgICAgIGFscmVhZHlSZXBvcnRlZCA9IHRydWU7XG4gICAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICAgIG5vZGU6IHByZXZpb3VzSW1wb3J0Lm5vZGUsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdUaGVyZSBzaG91bGQgYmUgYXQgbGVhc3Qgb25lIGVtcHR5IGxpbmUgYmV0d2VlbiBpbXBvcnQgZ3JvdXBzJyxcbiAgICAgICAgICAgICAgZml4OiBmaXhOZXdMaW5lQWZ0ZXJJbXBvcnQoY29udGV4dCwgcHJldmlvdXNJbXBvcnQpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGVtcHR5TGluZXNCZXR3ZWVuID4gMCAmJiBzaG91bGRBc3NlcnROb05ld2xpbmVXaXRoaW5Hcm91cCkge1xuICAgICAgICAgIGlmIChpc1RoZU5ld2xpbmVCZXR3ZWVuSW1wb3J0c0luVGhlU2FtZUdyb3VwKSB7XG4gICAgICAgICAgICBhbHJlYWR5UmVwb3J0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgICAgICBub2RlOiBwcmV2aW91c0ltcG9ydC5ub2RlLFxuICAgICAgICAgICAgICBtZXNzYWdlOiAnVGhlcmUgc2hvdWxkIGJlIG5vIGVtcHR5IGxpbmUgd2l0aGluIGltcG9ydCBncm91cCcsXG4gICAgICAgICAgICAgIGZpeDogcmVtb3ZlTmV3TGluZUFmdGVySW1wb3J0KGNvbnRleHQsIGN1cnJlbnRJbXBvcnQsIHByZXZpb3VzSW1wb3J0KSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChlbXB0eUxpbmVzQmV0d2VlbiA+IDAgJiYgc2hvdWxkQXNzZXJ0Tm9OZXdsaW5lQmV0d2Vlbkdyb3VwKSB7XG4gICAgICAgIGFscmVhZHlSZXBvcnRlZCA9IHRydWU7XG4gICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICBub2RlOiBwcmV2aW91c0ltcG9ydC5ub2RlLFxuICAgICAgICAgIG1lc3NhZ2U6ICdUaGVyZSBzaG91bGQgYmUgbm8gZW1wdHkgbGluZSBiZXR3ZWVuIGltcG9ydCBncm91cHMnLFxuICAgICAgICAgIGZpeDogcmVtb3ZlTmV3TGluZUFmdGVySW1wb3J0KGNvbnRleHQsIGN1cnJlbnRJbXBvcnQsIHByZXZpb3VzSW1wb3J0KSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghYWxyZWFkeVJlcG9ydGVkICYmIGlzQ29uc29saWRhdGluZ1NwYWNlQmV0d2VlbkltcG9ydHMpIHtcbiAgICAgICAgaWYgKGVtcHR5TGluZXNCZXR3ZWVuID09PSAwICYmIGN1cnJlbnRJbXBvcnQuaXNNdWx0aWxpbmUpIHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICBub2RlOiBwcmV2aW91c0ltcG9ydC5ub2RlLFxuICAgICAgICAgICAgbWVzc2FnZTogJ1RoZXJlIHNob3VsZCBiZSBhdCBsZWFzdCBvbmUgZW1wdHkgbGluZSBiZXR3ZWVuIHRoaXMgaW1wb3J0IGFuZCB0aGUgbXVsdGktbGluZSBpbXBvcnQgdGhhdCBmb2xsb3dzIGl0JyxcbiAgICAgICAgICAgIGZpeDogZml4TmV3TGluZUFmdGVySW1wb3J0KGNvbnRleHQsIHByZXZpb3VzSW1wb3J0KSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChlbXB0eUxpbmVzQmV0d2VlbiA9PT0gMCAmJiBwcmV2aW91c0ltcG9ydC5pc011bHRpbGluZSkge1xuICAgICAgICAgIGNvbnRleHQucmVwb3J0KHtcbiAgICAgICAgICAgIG5vZGU6IHByZXZpb3VzSW1wb3J0Lm5vZGUsXG4gICAgICAgICAgICBtZXNzYWdlOiAnVGhlcmUgc2hvdWxkIGJlIGF0IGxlYXN0IG9uZSBlbXB0eSBsaW5lIGJldHdlZW4gdGhpcyBtdWx0aS1saW5lIGltcG9ydCBhbmQgdGhlIGltcG9ydCB0aGF0IGZvbGxvd3MgaXQnLFxuICAgICAgICAgICAgZml4OiBmaXhOZXdMaW5lQWZ0ZXJJbXBvcnQoY29udGV4dCwgcHJldmlvdXNJbXBvcnQpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIGVtcHR5TGluZXNCZXR3ZWVuID4gMFxuICAgICAgICAgICYmICFwcmV2aW91c0ltcG9ydC5pc011bHRpbGluZVxuICAgICAgICAgICYmICFjdXJyZW50SW1wb3J0LmlzTXVsdGlsaW5lXG4gICAgICAgICAgJiYgaXNUaGVOZXdsaW5lQmV0d2VlbkltcG9ydHNJblRoZVNhbWVHcm91cFxuICAgICAgICApIHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICBub2RlOiBwcmV2aW91c0ltcG9ydC5ub2RlLFxuICAgICAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICAgICAgJ1RoZXJlIHNob3VsZCBiZSBubyBlbXB0eSBsaW5lcyBiZXR3ZWVuIHRoaXMgc2luZ2xlLWxpbmUgaW1wb3J0IGFuZCB0aGUgc2luZ2xlLWxpbmUgaW1wb3J0IHRoYXQgZm9sbG93cyBpdCcsXG4gICAgICAgICAgICBmaXg6IHJlbW92ZU5ld0xpbmVBZnRlckltcG9ydChjb250ZXh0LCBjdXJyZW50SW1wb3J0LCBwcmV2aW91c0ltcG9ydCksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcmV2aW91c0ltcG9ydCA9IGN1cnJlbnRJbXBvcnQ7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRBbHBoYWJldGl6ZUNvbmZpZyhvcHRpb25zKSB7XG4gIGNvbnN0IGFscGhhYmV0aXplID0gb3B0aW9ucy5hbHBoYWJldGl6ZSB8fCB7fTtcbiAgY29uc3Qgb3JkZXIgPSBhbHBoYWJldGl6ZS5vcmRlciB8fCAnaWdub3JlJztcbiAgY29uc3Qgb3JkZXJJbXBvcnRLaW5kID0gYWxwaGFiZXRpemUub3JkZXJJbXBvcnRLaW5kIHx8ICdpZ25vcmUnO1xuICBjb25zdCBjYXNlSW5zZW5zaXRpdmUgPSBhbHBoYWJldGl6ZS5jYXNlSW5zZW5zaXRpdmUgfHwgZmFsc2U7XG5cbiAgcmV0dXJuIHsgb3JkZXIsIG9yZGVySW1wb3J0S2luZCwgY2FzZUluc2Vuc2l0aXZlIH07XG59XG5cbi8vIFRPRE8sIHNlbXZlci1tYWpvcjogQ2hhbmdlIHRoZSBkZWZhdWx0IG9mIFwiZGlzdGluY3RHcm91cFwiIGZyb20gdHJ1ZSB0byBmYWxzZVxuY29uc3QgZGVmYXVsdERpc3RpbmN0R3JvdXAgPSB0cnVlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWV0YToge1xuICAgIHR5cGU6ICdzdWdnZXN0aW9uJyxcbiAgICBkb2NzOiB7XG4gICAgICBjYXRlZ29yeTogJ1N0eWxlIGd1aWRlJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnRW5mb3JjZSBhIGNvbnZlbnRpb24gaW4gbW9kdWxlIGltcG9ydCBvcmRlci4nLFxuICAgICAgdXJsOiBkb2NzVXJsKCdvcmRlcicpLFxuICAgIH0sXG5cbiAgICBmaXhhYmxlOiAnY29kZScsXG4gICAgc2NoZW1hOiBbXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgZ3JvdXBzOiB7XG4gICAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgICAgdW5pcXVlSXRlbXM6IHRydWUsXG4gICAgICAgICAgICBpdGVtczoge1xuICAgICAgICAgICAgICBvbmVPZjogW1xuICAgICAgICAgICAgICAgIHsgZW51bTogdHlwZXMgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICAgICAgICAgICAgdW5pcXVlSXRlbXM6IHRydWUsXG4gICAgICAgICAgICAgICAgICBpdGVtczogeyBlbnVtOiB0eXBlcyB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcGF0aEdyb3Vwc0V4Y2x1ZGVkSW1wb3J0VHlwZXM6IHtcbiAgICAgICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBkaXN0aW5jdEdyb3VwOiB7XG4gICAgICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgICAgICBkZWZhdWx0OiBkZWZhdWx0RGlzdGluY3RHcm91cCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBhdGhHcm91cHM6IHtcbiAgICAgICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgICAgICBpdGVtczoge1xuICAgICAgICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgIHBhdHRlcm46IHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcGF0dGVybk9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZ3JvdXA6IHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgICAgICAgZW51bTogdHlwZXMsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICAgICAgICBlbnVtOiBbJ2FmdGVyJywgJ2JlZm9yZSddLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZSxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IFsncGF0dGVybicsICdncm91cCddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgICduZXdsaW5lcy1iZXR3ZWVuJzoge1xuICAgICAgICAgICAgZW51bTogW1xuICAgICAgICAgICAgICAnaWdub3JlJyxcbiAgICAgICAgICAgICAgJ2Fsd2F5cycsXG4gICAgICAgICAgICAgICdhbHdheXMtYW5kLWluc2lkZS1ncm91cHMnLFxuICAgICAgICAgICAgICAnbmV2ZXInLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgICduZXdsaW5lcy1iZXR3ZWVuLXR5cGVzJzoge1xuICAgICAgICAgICAgZW51bTogW1xuICAgICAgICAgICAgICAnaWdub3JlJyxcbiAgICAgICAgICAgICAgJ2Fsd2F5cycsXG4gICAgICAgICAgICAgICdhbHdheXMtYW5kLWluc2lkZS1ncm91cHMnLFxuICAgICAgICAgICAgICAnbmV2ZXInLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbnNvbGlkYXRlSXNsYW5kczoge1xuICAgICAgICAgICAgZW51bTogW1xuICAgICAgICAgICAgICAnaW5zaWRlLWdyb3VwcycsXG4gICAgICAgICAgICAgICduZXZlcicsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc29ydFR5cGVzR3JvdXA6IHtcbiAgICAgICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbmFtZWQ6IHtcbiAgICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICAgICAgb25lT2Y6IFt7XG4gICAgICAgICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICBlbmFibGVkOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAgICAgICAgICAgICAgIGltcG9ydDogeyB0eXBlOiAnYm9vbGVhbicgfSxcbiAgICAgICAgICAgICAgICBleHBvcnQ6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgICAgICAgICAgICAgcmVxdWlyZTogeyB0eXBlOiAnYm9vbGVhbicgfSxcbiAgICAgICAgICAgICAgICBjanNFeHBvcnRzOiB7IHR5cGU6ICdib29sZWFuJyB9LFxuICAgICAgICAgICAgICAgIHR5cGVzOiB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgICAgICAgIGVudW06IFtcbiAgICAgICAgICAgICAgICAgICAgJ21peGVkJyxcbiAgICAgICAgICAgICAgICAgICAgJ3R5cGVzLWZpcnN0JyxcbiAgICAgICAgICAgICAgICAgICAgJ3R5cGVzLWxhc3QnLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2UsXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFscGhhYmV0aXplOiB7XG4gICAgICAgICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgY2FzZUluc2Vuc2l0aXZlOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBvcmRlcjoge1xuICAgICAgICAgICAgICAgIGVudW06IFsnaWdub3JlJywgJ2FzYycsICdkZXNjJ10sXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogJ2lnbm9yZScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG9yZGVySW1wb3J0S2luZDoge1xuICAgICAgICAgICAgICAgIGVudW06IFsnaWdub3JlJywgJ2FzYycsICdkZXNjJ10sXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogJ2lnbm9yZScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgd2Fybk9uVW5hc3NpZ25lZEltcG9ydHM6IHtcbiAgICAgICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZSxcbiAgICAgICAgZGVwZW5kZW5jaWVzOiB7XG4gICAgICAgICAgc29ydFR5cGVzR3JvdXA6IHtcbiAgICAgICAgICAgIG9uZU9mOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBXaGVuIHNvcnRUeXBlc0dyb3VwIGlzIHRydWUsIGdyb3VwcyBtdXN0IE5PVCBiZSBhbiBhcnJheSB0aGF0IGRvZXMgbm90IGNvbnRhaW4gJ3R5cGUnXG4gICAgICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgICAgc29ydFR5cGVzR3JvdXA6IHsgZW51bTogW3RydWVdIH0sXG4gICAgICAgICAgICAgICAgICBncm91cHM6IHtcbiAgICAgICAgICAgICAgICAgICAgbm90OiB7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgICAgICAgICAgICAgICB1bmlxdWVJdGVtczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICBpdGVtczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgb25lT2Y6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyBlbnVtOiB0eXBlcy5maWx0ZXIoKHQpID0+IHQgIT09ICd0eXBlJykgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlSXRlbXM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXM6IHsgZW51bTogdHlwZXMuZmlsdGVyKCh0KSA9PiB0ICE9PSAndHlwZScpIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IFsnZ3JvdXBzJ10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgICBzb3J0VHlwZXNHcm91cDogeyBlbnVtOiBbZmFsc2VdIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICAnbmV3bGluZXMtYmV0d2Vlbi10eXBlcyc6IHtcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgc29ydFR5cGVzR3JvdXA6IHsgZW51bTogW3RydWVdIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWlyZWQ6IFsnc29ydFR5cGVzR3JvdXAnXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbnNvbGlkYXRlSXNsYW5kczoge1xuICAgICAgICAgICAgb25lT2Y6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGlkYXRlSXNsYW5kczogeyBlbnVtOiBbJ2luc2lkZS1ncm91cHMnXSB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYW55T2Y6IFtcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgICAgICAgICduZXdsaW5lcy1iZXR3ZWVuJzogeyBlbnVtOiBbJ2Fsd2F5cy1hbmQtaW5zaWRlLWdyb3VwcyddIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBbJ25ld2xpbmVzLWJldHdlZW4nXSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAnbmV3bGluZXMtYmV0d2Vlbi10eXBlcyc6IHsgZW51bTogWydhbHdheXMtYW5kLWluc2lkZS1ncm91cHMnXSB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogWyduZXdsaW5lcy1iZXR3ZWVuLXR5cGVzJ10sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgICBjb25zb2xpZGF0ZUlzbGFuZHM6IHsgZW51bTogWyduZXZlciddIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcblxuICBjcmVhdGUoY29udGV4dCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBjb250ZXh0Lm9wdGlvbnNbMF0gfHwge307XG4gICAgY29uc3QgbmV3bGluZXNCZXR3ZWVuSW1wb3J0cyA9IG9wdGlvbnNbJ25ld2xpbmVzLWJldHdlZW4nXSB8fCAnaWdub3JlJztcbiAgICBjb25zdCBuZXdsaW5lc0JldHdlZW5UeXBlT25seUltcG9ydHMgPSBvcHRpb25zWyduZXdsaW5lcy1iZXR3ZWVuLXR5cGVzJ10gfHwgbmV3bGluZXNCZXR3ZWVuSW1wb3J0cztcbiAgICBjb25zdCBwYXRoR3JvdXBzRXhjbHVkZWRJbXBvcnRUeXBlcyA9IG5ldyBTZXQob3B0aW9ucy5wYXRoR3JvdXBzRXhjbHVkZWRJbXBvcnRUeXBlcyB8fCBbJ2J1aWx0aW4nLCAnZXh0ZXJuYWwnLCAnb2JqZWN0J10pO1xuICAgIGNvbnN0IHNvcnRUeXBlc0dyb3VwID0gb3B0aW9ucy5zb3J0VHlwZXNHcm91cDtcbiAgICBjb25zdCBjb25zb2xpZGF0ZUlzbGFuZHMgPSBvcHRpb25zLmNvbnNvbGlkYXRlSXNsYW5kcyB8fCAnbmV2ZXInO1xuXG4gICAgY29uc3QgbmFtZWQgPSB7XG4gICAgICB0eXBlczogJ21peGVkJyxcbiAgICAgIC4uLnR5cGVvZiBvcHRpb25zLm5hbWVkID09PSAnb2JqZWN0JyA/IHtcbiAgICAgICAgLi4ub3B0aW9ucy5uYW1lZCxcbiAgICAgICAgaW1wb3J0OiAnaW1wb3J0JyBpbiBvcHRpb25zLm5hbWVkID8gb3B0aW9ucy5uYW1lZC5pbXBvcnQgOiBvcHRpb25zLm5hbWVkLmVuYWJsZWQsXG4gICAgICAgIGV4cG9ydDogJ2V4cG9ydCcgaW4gb3B0aW9ucy5uYW1lZCA/IG9wdGlvbnMubmFtZWQuZXhwb3J0IDogb3B0aW9ucy5uYW1lZC5lbmFibGVkLFxuICAgICAgICByZXF1aXJlOiAncmVxdWlyZScgaW4gb3B0aW9ucy5uYW1lZCA/IG9wdGlvbnMubmFtZWQucmVxdWlyZSA6IG9wdGlvbnMubmFtZWQuZW5hYmxlZCxcbiAgICAgICAgY2pzRXhwb3J0czogJ2Nqc0V4cG9ydHMnIGluIG9wdGlvbnMubmFtZWQgPyBvcHRpb25zLm5hbWVkLmNqc0V4cG9ydHMgOiBvcHRpb25zLm5hbWVkLmVuYWJsZWQsXG4gICAgICB9IDoge1xuICAgICAgICBpbXBvcnQ6IG9wdGlvbnMubmFtZWQsXG4gICAgICAgIGV4cG9ydDogb3B0aW9ucy5uYW1lZCxcbiAgICAgICAgcmVxdWlyZTogb3B0aW9ucy5uYW1lZCxcbiAgICAgICAgY2pzRXhwb3J0czogb3B0aW9ucy5uYW1lZCxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGNvbnN0IG5hbWVkR3JvdXBzID0gbmFtZWQudHlwZXMgPT09ICdtaXhlZCcgPyBbXSA6IG5hbWVkLnR5cGVzID09PSAndHlwZXMtbGFzdCcgPyBbJ3ZhbHVlJ10gOiBbJ3R5cGUnXTtcbiAgICBjb25zdCBhbHBoYWJldGl6ZSA9IGdldEFscGhhYmV0aXplQ29uZmlnKG9wdGlvbnMpO1xuICAgIGNvbnN0IGRpc3RpbmN0R3JvdXAgPSBvcHRpb25zLmRpc3RpbmN0R3JvdXAgPT0gbnVsbCA/IGRlZmF1bHREaXN0aW5jdEdyb3VwIDogISFvcHRpb25zLmRpc3RpbmN0R3JvdXA7XG4gICAgbGV0IHJhbmtzO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgcGF0aEdyb3VwcywgbWF4UG9zaXRpb24gfSA9IGNvbnZlcnRQYXRoR3JvdXBzRm9yUmFua3Mob3B0aW9ucy5wYXRoR3JvdXBzIHx8IFtdKTtcbiAgICAgIGNvbnN0IHsgZ3JvdXBzLCBvbWl0dGVkVHlwZXMgfSA9IGNvbnZlcnRHcm91cHNUb1JhbmtzKG9wdGlvbnMuZ3JvdXBzIHx8IGRlZmF1bHRHcm91cHMpO1xuICAgICAgcmFua3MgPSB7XG4gICAgICAgIGdyb3VwcyxcbiAgICAgICAgb21pdHRlZFR5cGVzLFxuICAgICAgICBwYXRoR3JvdXBzLFxuICAgICAgICBtYXhQb3NpdGlvbixcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIE1hbGZvcm1lZCBjb25maWd1cmF0aW9uXG4gICAgICByZXR1cm4ge1xuICAgICAgICBQcm9ncmFtKG5vZGUpIHtcbiAgICAgICAgICBjb250ZXh0LnJlcG9ydChub2RlLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IGltcG9ydE1hcCA9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBleHBvcnRNYXAgPSBuZXcgTWFwKCk7XG5cbiAgICBjb25zdCBpc1R5cGVHcm91cEluR3JvdXBzID0gcmFua3Mub21pdHRlZFR5cGVzLmluZGV4T2YoJ3R5cGUnKSA9PT0gLTE7XG4gICAgY29uc3QgaXNTb3J0aW5nVHlwZXNHcm91cCA9IGlzVHlwZUdyb3VwSW5Hcm91cHMgJiYgc29ydFR5cGVzR3JvdXA7XG5cbiAgICBmdW5jdGlvbiBnZXRCbG9ja0ltcG9ydHMobm9kZSkge1xuICAgICAgaWYgKCFpbXBvcnRNYXAuaGFzKG5vZGUpKSB7XG4gICAgICAgIGltcG9ydE1hcC5zZXQobm9kZSwgW10pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGltcG9ydE1hcC5nZXQobm9kZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0QmxvY2tFeHBvcnRzKG5vZGUpIHtcbiAgICAgIGlmICghZXhwb3J0TWFwLmhhcyhub2RlKSkge1xuICAgICAgICBleHBvcnRNYXAuc2V0KG5vZGUsIFtdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBleHBvcnRNYXAuZ2V0KG5vZGUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VOYW1lZE9yZGVyUmVwb3J0KGNvbnRleHQsIG5hbWVkSW1wb3J0cykge1xuICAgICAgaWYgKG5hbWVkSW1wb3J0cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGNvbnN0IGltcG9ydHMgPSBuYW1lZEltcG9ydHMubWFwKFxuICAgICAgICAgIChuYW1lZEltcG9ydCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qga2luZCA9IG5hbWVkSW1wb3J0LmtpbmQgfHwgJ3ZhbHVlJztcbiAgICAgICAgICAgIGNvbnN0IHJhbmsgPSBuYW1lZEdyb3Vwcy5maW5kSW5kZXgoKGVudHJ5KSA9PiBbXS5jb25jYXQoZW50cnkpLmluZGV4T2Yoa2luZCkgPiAtMSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiBuYW1lZEltcG9ydC52YWx1ZSxcbiAgICAgICAgICAgICAgcmFuazogcmFuayA9PT0gLTEgPyBuYW1lZEdyb3Vwcy5sZW5ndGggOiByYW5rLFxuICAgICAgICAgICAgICAuLi5uYW1lZEltcG9ydCxcbiAgICAgICAgICAgICAgdmFsdWU6IGAke25hbWVkSW1wb3J0LnZhbHVlfToke25hbWVkSW1wb3J0LmFsaWFzIHx8ICcnfWAsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChhbHBoYWJldGl6ZS5vcmRlciAhPT0gJ2lnbm9yZScpIHtcbiAgICAgICAgICBtdXRhdGVSYW5rc1RvQWxwaGFiZXRpemUoaW1wb3J0cywgYWxwaGFiZXRpemUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbWFrZU91dE9mT3JkZXJSZXBvcnQoY29udGV4dCwgaW1wb3J0cywgY2F0ZWdvcmllcy5uYW1lZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIEltcG9ydERlY2xhcmF0aW9uKG5vZGUpIHtcbiAgICAgICAgLy8gSWdub3JpbmcgdW5hc3NpZ25lZCBpbXBvcnRzIHVubGVzcyB3YXJuT25VbmFzc2lnbmVkSW1wb3J0cyBpcyBzZXRcbiAgICAgICAgaWYgKG5vZGUuc3BlY2lmaWVycy5sZW5ndGggfHwgb3B0aW9ucy53YXJuT25VbmFzc2lnbmVkSW1wb3J0cykge1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSBub2RlLnNvdXJjZS52YWx1ZTtcbiAgICAgICAgICByZWdpc3Rlck5vZGUoXG4gICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICB2YWx1ZTogbmFtZSxcbiAgICAgICAgICAgICAgZGlzcGxheU5hbWU6IG5hbWUsXG4gICAgICAgICAgICAgIHR5cGU6ICdpbXBvcnQnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJhbmtzLFxuICAgICAgICAgICAgZ2V0QmxvY2tJbXBvcnRzKG5vZGUucGFyZW50KSxcbiAgICAgICAgICAgIHBhdGhHcm91cHNFeGNsdWRlZEltcG9ydFR5cGVzLFxuICAgICAgICAgICAgaXNTb3J0aW5nVHlwZXNHcm91cCxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKG5hbWVkLmltcG9ydCkge1xuICAgICAgICAgICAgbWFrZU5hbWVkT3JkZXJSZXBvcnQoXG4gICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAgIG5vZGUuc3BlY2lmaWVycy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKHNwZWNpZmllcikgPT4gc3BlY2lmaWVyLnR5cGUgPT09ICdJbXBvcnRTcGVjaWZpZXInKS5tYXAoXG4gICAgICAgICAgICAgICAgKHNwZWNpZmllcikgPT4gKHtcbiAgICAgICAgICAgICAgICAgIG5vZGU6IHNwZWNpZmllcixcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBzcGVjaWZpZXIuaW1wb3J0ZWQubmFtZSxcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdpbXBvcnQnLFxuICAgICAgICAgICAgICAgICAga2luZDogc3BlY2lmaWVyLmltcG9ydEtpbmQsXG4gICAgICAgICAgICAgICAgICAuLi5zcGVjaWZpZXIubG9jYWwucmFuZ2VbMF0gIT09IHNwZWNpZmllci5pbXBvcnRlZC5yYW5nZVswXSAmJiB7XG4gICAgICAgICAgICAgICAgICAgIGFsaWFzOiBzcGVjaWZpZXIubG9jYWwubmFtZSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFRTSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24obm9kZSkge1xuICAgICAgICAvLyBza2lwIFwiZXhwb3J0IGltcG9ydFwic1xuICAgICAgICBpZiAobm9kZS5pc0V4cG9ydCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkaXNwbGF5TmFtZTtcbiAgICAgICAgbGV0IHZhbHVlO1xuICAgICAgICBsZXQgdHlwZTtcbiAgICAgICAgaWYgKG5vZGUubW9kdWxlUmVmZXJlbmNlLnR5cGUgPT09ICdUU0V4dGVybmFsTW9kdWxlUmVmZXJlbmNlJykge1xuICAgICAgICAgIHZhbHVlID0gbm9kZS5tb2R1bGVSZWZlcmVuY2UuZXhwcmVzc2lvbi52YWx1ZTtcbiAgICAgICAgICBkaXNwbGF5TmFtZSA9IHZhbHVlO1xuICAgICAgICAgIHR5cGUgPSAnaW1wb3J0JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZSA9ICcnO1xuICAgICAgICAgIGRpc3BsYXlOYW1lID0gZ2V0U291cmNlQ29kZShjb250ZXh0KS5nZXRUZXh0KG5vZGUubW9kdWxlUmVmZXJlbmNlKTtcbiAgICAgICAgICB0eXBlID0gJ2ltcG9ydDpvYmplY3QnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVnaXN0ZXJOb2RlKFxuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAge1xuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgZGlzcGxheU5hbWUsXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmFua3MsXG4gICAgICAgICAgZ2V0QmxvY2tJbXBvcnRzKG5vZGUucGFyZW50KSxcbiAgICAgICAgICBwYXRoR3JvdXBzRXhjbHVkZWRJbXBvcnRUeXBlcyxcbiAgICAgICAgICBpc1NvcnRpbmdUeXBlc0dyb3VwLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIENhbGxFeHByZXNzaW9uKG5vZGUpIHtcbiAgICAgICAgaWYgKCFpc1N0YXRpY1JlcXVpcmUobm9kZSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYmxvY2sgPSBnZXRSZXF1aXJlQmxvY2sobm9kZSk7XG4gICAgICAgIGlmICghYmxvY2spIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmFtZSA9IG5vZGUuYXJndW1lbnRzWzBdLnZhbHVlO1xuICAgICAgICByZWdpc3Rlck5vZGUoXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgdmFsdWU6IG5hbWUsXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogbmFtZSxcbiAgICAgICAgICAgIHR5cGU6ICdyZXF1aXJlJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJhbmtzLFxuICAgICAgICAgIGdldEJsb2NrSW1wb3J0cyhibG9jayksXG4gICAgICAgICAgcGF0aEdyb3Vwc0V4Y2x1ZGVkSW1wb3J0VHlwZXMsXG4gICAgICAgICAgaXNTb3J0aW5nVHlwZXNHcm91cCxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICAuLi5uYW1lZC5yZXF1aXJlICYmIHtcbiAgICAgICAgVmFyaWFibGVEZWNsYXJhdG9yKG5vZGUpIHtcbiAgICAgICAgICBpZiAobm9kZS5pZC50eXBlID09PSAnT2JqZWN0UGF0dGVybicgJiYgaXNSZXF1aXJlRXhwcmVzc2lvbihub2RlLmluaXQpKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuaWQucHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbm9kZS5pZC5wcm9wZXJ0aWVzW2ldLmtleS50eXBlICE9PSAnSWRlbnRpZmllcidcbiAgICAgICAgICAgICAgICB8fCBub2RlLmlkLnByb3BlcnRpZXNbaV0udmFsdWUudHlwZSAhPT0gJ0lkZW50aWZpZXInXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbWFrZU5hbWVkT3JkZXJSZXBvcnQoXG4gICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAgIG5vZGUuaWQucHJvcGVydGllcy5tYXAoKHByb3ApID0+ICh7XG4gICAgICAgICAgICAgICAgbm9kZTogcHJvcCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogcHJvcC5rZXkubmFtZSxcbiAgICAgICAgICAgICAgICB0eXBlOiAncmVxdWlyZScsXG4gICAgICAgICAgICAgICAgLi4ucHJvcC5rZXkucmFuZ2VbMF0gIT09IHByb3AudmFsdWUucmFuZ2VbMF0gJiYge1xuICAgICAgICAgICAgICAgICAgYWxpYXM6IHByb3AudmFsdWUubmFtZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICAuLi5uYW1lZC5leHBvcnQgJiYge1xuICAgICAgICBFeHBvcnROYW1lZERlY2xhcmF0aW9uKG5vZGUpIHtcbiAgICAgICAgICBtYWtlTmFtZWRPcmRlclJlcG9ydChcbiAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICBub2RlLnNwZWNpZmllcnMubWFwKChzcGVjaWZpZXIpID0+ICh7XG4gICAgICAgICAgICAgIG5vZGU6IHNwZWNpZmllcixcbiAgICAgICAgICAgICAgdmFsdWU6IHNwZWNpZmllci5sb2NhbC5uYW1lLFxuICAgICAgICAgICAgICB0eXBlOiAnZXhwb3J0JyxcbiAgICAgICAgICAgICAga2luZDogc3BlY2lmaWVyLmV4cG9ydEtpbmQsXG4gICAgICAgICAgICAgIC4uLnNwZWNpZmllci5sb2NhbC5yYW5nZVswXSAhPT0gc3BlY2lmaWVyLmV4cG9ydGVkLnJhbmdlWzBdICYmIHtcbiAgICAgICAgICAgICAgICBhbGlhczogc3BlY2lmaWVyLmV4cG9ydGVkLm5hbWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICAuLi5uYW1lZC5janNFeHBvcnRzICYmIHtcbiAgICAgICAgQXNzaWdubWVudEV4cHJlc3Npb24obm9kZSkge1xuICAgICAgICAgIGlmIChub2RlLnBhcmVudC50eXBlID09PSAnRXhwcmVzc2lvblN0YXRlbWVudCcpIHtcbiAgICAgICAgICAgIGlmIChpc0NKU0V4cG9ydHMoY29udGV4dCwgbm9kZS5sZWZ0KSkge1xuICAgICAgICAgICAgICBpZiAobm9kZS5yaWdodC50eXBlID09PSAnT2JqZWN0RXhwcmVzc2lvbicpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUucmlnaHQucHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAhbm9kZS5yaWdodC5wcm9wZXJ0aWVzW2ldLmtleVxuICAgICAgICAgICAgICAgICAgICB8fCBub2RlLnJpZ2h0LnByb3BlcnRpZXNbaV0ua2V5LnR5cGUgIT09ICdJZGVudGlmaWVyJ1xuICAgICAgICAgICAgICAgICAgICB8fCAhbm9kZS5yaWdodC5wcm9wZXJ0aWVzW2ldLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIHx8IG5vZGUucmlnaHQucHJvcGVydGllc1tpXS52YWx1ZS50eXBlICE9PSAnSWRlbnRpZmllcidcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbWFrZU5hbWVkT3JkZXJSZXBvcnQoXG4gICAgICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICAgICAgbm9kZS5yaWdodC5wcm9wZXJ0aWVzLm1hcCgocHJvcCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZTogcHJvcCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHByb3Aua2V5Lm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdleHBvcnQnLFxuICAgICAgICAgICAgICAgICAgICAuLi5wcm9wLmtleS5yYW5nZVswXSAhPT0gcHJvcC52YWx1ZS5yYW5nZVswXSAmJiB7XG4gICAgICAgICAgICAgICAgICAgICAgYWxpYXM6IHByb3AudmFsdWUubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCBuYW1lUGFydHMgPSBnZXROYW1lZENKU0V4cG9ydHMoY29udGV4dCwgbm9kZS5sZWZ0KTtcbiAgICAgICAgICAgICAgaWYgKG5hbWVQYXJ0cyAmJiBuYW1lUGFydHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBuYW1lUGFydHMuam9pbignLicpO1xuICAgICAgICAgICAgICAgIGdldEJsb2NrRXhwb3J0cyhub2RlLnBhcmVudC5wYXJlbnQpLnB1c2goe1xuICAgICAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBuYW1lLFxuICAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6IG5hbWUsXG4gICAgICAgICAgICAgICAgICB0eXBlOiAnZXhwb3J0JyxcbiAgICAgICAgICAgICAgICAgIHJhbms6IDAsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgJ1Byb2dyYW06ZXhpdCcoKSB7XG4gICAgICAgIGltcG9ydE1hcC5mb3JFYWNoKChpbXBvcnRlZCkgPT4ge1xuICAgICAgICAgIGlmIChuZXdsaW5lc0JldHdlZW5JbXBvcnRzICE9PSAnaWdub3JlJyB8fCBuZXdsaW5lc0JldHdlZW5UeXBlT25seUltcG9ydHMgIT09ICdpZ25vcmUnKSB7XG4gICAgICAgICAgICBtYWtlTmV3bGluZXNCZXR3ZWVuUmVwb3J0KFxuICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICBpbXBvcnRlZCxcbiAgICAgICAgICAgICAgbmV3bGluZXNCZXR3ZWVuSW1wb3J0cyxcbiAgICAgICAgICAgICAgbmV3bGluZXNCZXR3ZWVuVHlwZU9ubHlJbXBvcnRzLFxuICAgICAgICAgICAgICBkaXN0aW5jdEdyb3VwLFxuICAgICAgICAgICAgICBpc1NvcnRpbmdUeXBlc0dyb3VwLFxuICAgICAgICAgICAgICBjb25zb2xpZGF0ZUlzbGFuZHMgPT09ICdpbnNpZGUtZ3JvdXBzJ1xuICAgICAgICAgICAgICAgICYmIChuZXdsaW5lc0JldHdlZW5JbXBvcnRzID09PSAnYWx3YXlzLWFuZC1pbnNpZGUtZ3JvdXBzJ1xuICAgICAgICAgICAgICAgICAgfHwgbmV3bGluZXNCZXR3ZWVuVHlwZU9ubHlJbXBvcnRzID09PSAnYWx3YXlzLWFuZC1pbnNpZGUtZ3JvdXBzJyksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChhbHBoYWJldGl6ZS5vcmRlciAhPT0gJ2lnbm9yZScpIHtcbiAgICAgICAgICAgIG11dGF0ZVJhbmtzVG9BbHBoYWJldGl6ZShpbXBvcnRlZCwgYWxwaGFiZXRpemUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG1ha2VPdXRPZk9yZGVyUmVwb3J0KGNvbnRleHQsIGltcG9ydGVkLCBjYXRlZ29yaWVzLmltcG9ydCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGV4cG9ydE1hcC5mb3JFYWNoKChleHBvcnRlZCkgPT4ge1xuICAgICAgICAgIGlmIChhbHBoYWJldGl6ZS5vcmRlciAhPT0gJ2lnbm9yZScpIHtcbiAgICAgICAgICAgIG11dGF0ZVJhbmtzVG9BbHBoYWJldGl6ZShleHBvcnRlZCwgYWxwaGFiZXRpemUpO1xuICAgICAgICAgICAgbWFrZU91dE9mT3JkZXJSZXBvcnQoY29udGV4dCwgZXhwb3J0ZWQsIGNhdGVnb3JpZXMuZXhwb3J0cyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpbXBvcnRNYXAuY2xlYXIoKTtcbiAgICAgICAgZXhwb3J0TWFwLmNsZWFyKCk7XG4gICAgICB9LFxuICAgIH07XG4gIH0sXG59O1xuIl19