public-builders.js 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493
  1. import { assert, assign, deprecate, isPresent } from '@glimmer/util';
  2. import { SYNTHETIC_LOCATION } from '../source/location';
  3. import { Source } from '../source/source';
  4. import { SourceSpan } from '../source/span';
  5. import { PathExpressionImplV1 } from './legacy-interop';
  6. var _SOURCE;
  7. function SOURCE() {
  8. if (!_SOURCE) {
  9. _SOURCE = new Source('', '(synthetic)');
  10. }
  11. return _SOURCE;
  12. }
  13. function buildMustache(path, params, hash, raw, loc, strip) {
  14. if (typeof path === 'string') {
  15. path = buildPath(path);
  16. }
  17. return {
  18. type: 'MustacheStatement',
  19. path: path,
  20. params: params || [],
  21. hash: hash || buildHash([]),
  22. escaped: !raw,
  23. trusting: !!raw,
  24. loc: buildLoc(loc || null),
  25. strip: strip || {
  26. open: false,
  27. close: false
  28. }
  29. };
  30. }
  31. function buildBlock(path, params, hash, _defaultBlock, _elseBlock, loc, openStrip, inverseStrip, closeStrip) {
  32. var defaultBlock;
  33. var elseBlock;
  34. if (_defaultBlock.type === 'Template') {
  35. if (false
  36. /* LOCAL_DEBUG */
  37. ) {
  38. false && !false && deprecate("b.program is deprecated. Use b.blockItself instead.");
  39. }
  40. defaultBlock = assign({}, _defaultBlock, {
  41. type: 'Block'
  42. });
  43. } else {
  44. defaultBlock = _defaultBlock;
  45. }
  46. if (_elseBlock !== undefined && _elseBlock !== null && _elseBlock.type === 'Template') {
  47. if (false
  48. /* LOCAL_DEBUG */
  49. ) {
  50. false && !false && deprecate("b.program is deprecated. Use b.blockItself instead.");
  51. }
  52. elseBlock = assign({}, _elseBlock, {
  53. type: 'Block'
  54. });
  55. } else {
  56. elseBlock = _elseBlock;
  57. }
  58. return {
  59. type: 'BlockStatement',
  60. path: buildPath(path),
  61. params: params || [],
  62. hash: hash || buildHash([]),
  63. program: defaultBlock || null,
  64. inverse: elseBlock || null,
  65. loc: buildLoc(loc || null),
  66. openStrip: openStrip || {
  67. open: false,
  68. close: false
  69. },
  70. inverseStrip: inverseStrip || {
  71. open: false,
  72. close: false
  73. },
  74. closeStrip: closeStrip || {
  75. open: false,
  76. close: false
  77. }
  78. };
  79. }
  80. function buildElementModifier(path, params, hash, loc) {
  81. return {
  82. type: 'ElementModifierStatement',
  83. path: buildPath(path),
  84. params: params || [],
  85. hash: hash || buildHash([]),
  86. loc: buildLoc(loc || null)
  87. };
  88. }
  89. function buildPartial(name, params, hash, indent, loc) {
  90. return {
  91. type: 'PartialStatement',
  92. name: name,
  93. params: params || [],
  94. hash: hash || buildHash([]),
  95. indent: indent || '',
  96. strip: {
  97. open: false,
  98. close: false
  99. },
  100. loc: buildLoc(loc || null)
  101. };
  102. }
  103. function buildComment(value, loc) {
  104. return {
  105. type: 'CommentStatement',
  106. value: value,
  107. loc: buildLoc(loc || null)
  108. };
  109. }
  110. function buildMustacheComment(value, loc) {
  111. return {
  112. type: 'MustacheCommentStatement',
  113. value: value,
  114. loc: buildLoc(loc || null)
  115. };
  116. }
  117. function buildConcat(parts, loc) {
  118. if (!isPresent(parts)) {
  119. throw new Error("b.concat requires at least one part");
  120. }
  121. return {
  122. type: 'ConcatStatement',
  123. parts: parts || [],
  124. loc: buildLoc(loc || null)
  125. };
  126. }
  127. function buildElement(tag, options) {
  128. var attrs = options.attrs,
  129. blockParams = options.blockParams,
  130. modifiers = options.modifiers,
  131. comments = options.comments,
  132. children = options.children,
  133. loc = options.loc;
  134. var tagName; // this is used for backwards compat, prior to `selfClosing` being part of the ElementNode AST
  135. var selfClosing = false;
  136. if (typeof tag === 'object') {
  137. selfClosing = tag.selfClosing;
  138. tagName = tag.name;
  139. } else if (tag.slice(-1) === '/') {
  140. tagName = tag.slice(0, -1);
  141. selfClosing = true;
  142. } else {
  143. tagName = tag;
  144. }
  145. return {
  146. type: 'ElementNode',
  147. tag: tagName,
  148. selfClosing: selfClosing,
  149. attributes: attrs || [],
  150. blockParams: blockParams || [],
  151. modifiers: modifiers || [],
  152. comments: comments || [],
  153. children: children || [],
  154. loc: buildLoc(loc || null)
  155. };
  156. }
  157. function buildAttr(name, value, loc) {
  158. return {
  159. type: 'AttrNode',
  160. name: name,
  161. value: value,
  162. loc: buildLoc(loc || null)
  163. };
  164. }
  165. function buildText(chars, loc) {
  166. return {
  167. type: 'TextNode',
  168. chars: chars || '',
  169. loc: buildLoc(loc || null)
  170. };
  171. } // Expressions
  172. function buildSexpr(path, params, hash, loc) {
  173. return {
  174. type: 'SubExpression',
  175. path: buildPath(path),
  176. params: params || [],
  177. hash: hash || buildHash([]),
  178. loc: buildLoc(loc || null)
  179. };
  180. }
  181. function headToString(head) {
  182. switch (head.type) {
  183. case 'AtHead':
  184. return {
  185. original: head.name,
  186. parts: [head.name]
  187. };
  188. case 'ThisHead':
  189. return {
  190. original: "this",
  191. parts: []
  192. };
  193. case 'VarHead':
  194. return {
  195. original: head.name,
  196. parts: [head.name]
  197. };
  198. }
  199. }
  200. function buildHead(original, loc) {
  201. var _original$split = original.split('.'),
  202. head = _original$split[0],
  203. tail = _original$split.slice(1);
  204. var headNode;
  205. if (head === 'this') {
  206. headNode = {
  207. type: 'ThisHead',
  208. loc: buildLoc(loc || null)
  209. };
  210. } else if (head[0] === '@') {
  211. headNode = {
  212. type: 'AtHead',
  213. name: head,
  214. loc: buildLoc(loc || null)
  215. };
  216. } else {
  217. headNode = {
  218. type: 'VarHead',
  219. name: head,
  220. loc: buildLoc(loc || null)
  221. };
  222. }
  223. return {
  224. head: headNode,
  225. tail: tail
  226. };
  227. }
  228. function buildThis(loc) {
  229. return {
  230. type: 'ThisHead',
  231. loc: buildLoc(loc || null)
  232. };
  233. }
  234. function buildAtName(name, loc) {
  235. // the `@` should be included so we have a complete source range
  236. false && assert(name[0] === '@', "call builders.at() with a string that starts with '@'");
  237. return {
  238. type: 'AtHead',
  239. name: name,
  240. loc: buildLoc(loc || null)
  241. };
  242. }
  243. function buildVar(name, loc) {
  244. false && assert(name !== 'this', "You called builders.var() with 'this'. Call builders.this instead");
  245. false && assert(name[0] !== '@', "You called builders.var() with '" + name + "'. Call builders.at('" + name + "') instead");
  246. return {
  247. type: 'VarHead',
  248. name: name,
  249. loc: buildLoc(loc || null)
  250. };
  251. }
  252. function buildHeadFromString(head, loc) {
  253. if (head[0] === '@') {
  254. return buildAtName(head, loc);
  255. } else if (head === 'this') {
  256. return buildThis(loc);
  257. } else {
  258. return buildVar(head, loc);
  259. }
  260. }
  261. function buildNamedBlockName(name, loc) {
  262. return {
  263. type: 'NamedBlockName',
  264. name: name,
  265. loc: buildLoc(loc || null)
  266. };
  267. }
  268. function buildCleanPath(head, tail, loc) {
  269. var _headToString = headToString(head),
  270. originalHead = _headToString.original,
  271. headParts = _headToString.parts;
  272. var parts = [].concat(headParts, tail);
  273. var original = [].concat(originalHead, parts).join('.');
  274. return new PathExpressionImplV1(original, head, tail, buildLoc(loc || null));
  275. }
  276. function buildPath(path, loc) {
  277. if (typeof path !== 'string') {
  278. if ('type' in path) {
  279. return path;
  280. } else {
  281. var _buildHead = buildHead(path.head, SourceSpan.broken()),
  282. _head = _buildHead.head,
  283. _tail = _buildHead.tail;
  284. false && assert(_tail.length === 0, "builder.path({ head, tail }) should not be called with a head with dots in it");
  285. var _headToString2 = headToString(_head),
  286. originalHead = _headToString2.original;
  287. return new PathExpressionImplV1([originalHead].concat(_tail).join('.'), _head, _tail, buildLoc(loc || null));
  288. }
  289. }
  290. var _buildHead2 = buildHead(path, SourceSpan.broken()),
  291. head = _buildHead2.head,
  292. tail = _buildHead2.tail;
  293. return new PathExpressionImplV1(path, head, tail, buildLoc(loc || null));
  294. }
  295. function buildLiteral(type, value, loc) {
  296. return {
  297. type: type,
  298. value: value,
  299. original: value,
  300. loc: buildLoc(loc || null)
  301. };
  302. } // Miscellaneous
  303. function buildHash(pairs, loc) {
  304. return {
  305. type: 'Hash',
  306. pairs: pairs || [],
  307. loc: buildLoc(loc || null)
  308. };
  309. }
  310. function buildPair(key, value, loc) {
  311. return {
  312. type: 'HashPair',
  313. key: key,
  314. value: value,
  315. loc: buildLoc(loc || null)
  316. };
  317. }
  318. function buildProgram(body, blockParams, loc) {
  319. return {
  320. type: 'Template',
  321. body: body || [],
  322. blockParams: blockParams || [],
  323. loc: buildLoc(loc || null)
  324. };
  325. }
  326. function buildBlockItself(body, blockParams, chained, loc) {
  327. if (chained === void 0) {
  328. chained = false;
  329. }
  330. return {
  331. type: 'Block',
  332. body: body || [],
  333. blockParams: blockParams || [],
  334. chained: chained,
  335. loc: buildLoc(loc || null)
  336. };
  337. }
  338. function buildTemplate(body, blockParams, loc) {
  339. return {
  340. type: 'Template',
  341. body: body || [],
  342. blockParams: blockParams || [],
  343. loc: buildLoc(loc || null)
  344. };
  345. }
  346. function buildPosition(line, column) {
  347. return {
  348. line: line,
  349. column: column
  350. };
  351. }
  352. function buildLoc() {
  353. for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
  354. args[_key] = arguments[_key];
  355. }
  356. if (args.length === 1) {
  357. var loc = args[0];
  358. if (loc && typeof loc === 'object') {
  359. return SourceSpan.forHbsLoc(SOURCE(), loc);
  360. } else {
  361. return SourceSpan.forHbsLoc(SOURCE(), SYNTHETIC_LOCATION);
  362. }
  363. } else {
  364. var startLine = args[0],
  365. startColumn = args[1],
  366. endLine = args[2],
  367. endColumn = args[3],
  368. _source = args[4];
  369. var source = _source ? new Source('', _source) : SOURCE();
  370. return SourceSpan.forHbsLoc(source, {
  371. start: {
  372. line: startLine,
  373. column: startColumn
  374. },
  375. end: {
  376. line: endLine,
  377. column: endColumn
  378. }
  379. });
  380. }
  381. }
  382. export default {
  383. mustache: buildMustache,
  384. block: buildBlock,
  385. partial: buildPartial,
  386. comment: buildComment,
  387. mustacheComment: buildMustacheComment,
  388. element: buildElement,
  389. elementModifier: buildElementModifier,
  390. attr: buildAttr,
  391. text: buildText,
  392. sexpr: buildSexpr,
  393. concat: buildConcat,
  394. hash: buildHash,
  395. pair: buildPair,
  396. literal: buildLiteral,
  397. program: buildProgram,
  398. blockItself: buildBlockItself,
  399. template: buildTemplate,
  400. loc: buildLoc,
  401. pos: buildPosition,
  402. path: buildPath,
  403. fullPath: buildCleanPath,
  404. head: buildHeadFromString,
  405. at: buildAtName,
  406. "var": buildVar,
  407. "this": buildThis,
  408. blockName: buildNamedBlockName,
  409. string: literal('StringLiteral'),
  410. "boolean": literal('BooleanLiteral'),
  411. number: literal('NumberLiteral'),
  412. undefined: function (_undefined) {
  413. function undefined() {
  414. return _undefined.apply(this, arguments);
  415. }
  416. undefined.toString = function () {
  417. return _undefined.toString();
  418. };
  419. return undefined;
  420. }(function () {
  421. return buildLiteral('UndefinedLiteral', undefined);
  422. }),
  423. "null": function _null() {
  424. return buildLiteral('NullLiteral', null);
  425. }
  426. };
  427. function literal(type) {
  428. return function (value, loc) {
  429. return buildLiteral(type, value, loc);
  430. };
  431. }
  432. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvdjEvcHVibGljLWJ1aWxkZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLFNBQUEsTUFBQSxFQUFBLE1BQUEsRUFBQSxTQUFBLEVBQUEsU0FBQSxRQUFBLGVBQUE7QUFFQSxTQUFBLGtCQUFBLFFBQUEsb0JBQUE7QUFDQSxTQUFBLE1BQUEsUUFBQSxrQkFBQTtBQUNBLFNBQUEsVUFBQSxRQUFBLGdCQUFBO0FBRUEsU0FBQSxvQkFBQSxRQUFBLGtCQUFBOztBQUVBLElBQUEsT0FBQTs7QUFFQSxTQUFBLE1BQUEsR0FBZTtBQUNiLE1BQUksQ0FBSixPQUFBLEVBQWM7QUFDWixJQUFBLE9BQU8sR0FBRyxJQUFBLE1BQUEsQ0FBQSxFQUFBLEVBQVYsYUFBVSxDQUFWO0FBQ0Q7O0FBRUQsU0FBQSxPQUFBO0FBQ0Q7O0FBU0QsU0FBQSxhQUFBLENBQUEsSUFBQSxFQUFBLE1BQUEsRUFBQSxJQUFBLEVBQUEsR0FBQSxFQUFBLEdBQUEsRUFBQSxLQUFBLEVBTTBCO0FBRXhCLE1BQUksT0FBQSxJQUFBLEtBQUosUUFBQSxFQUE4QjtBQUM1QixJQUFBLElBQUksR0FBRyxTQUFTLENBQWhCLElBQWdCLENBQWhCO0FBQ0Q7O0FBRUQsU0FBTztBQUNMLElBQUEsSUFBSSxFQURDLG1CQUFBO0FBRUwsSUFBQSxJQUZLLEVBRUwsSUFGSztBQUdMLElBQUEsTUFBTSxFQUFFLE1BQU0sSUFIVCxFQUFBO0FBSUwsSUFBQSxJQUFJLEVBQUUsSUFBSSxJQUFJLFNBQVMsQ0FKbEIsRUFJa0IsQ0FKbEI7QUFLTCxJQUFBLE9BQU8sRUFBRSxDQUxKLEdBQUE7QUFNTCxJQUFBLFFBQVEsRUFBRSxDQUFDLENBTk4sR0FBQTtBQU9MLElBQUEsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHLElBUFosSUFPUSxDQVBSO0FBUUwsSUFBQSxLQUFLLEVBQUUsS0FBSyxJQUFJO0FBQUUsTUFBQSxJQUFJLEVB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QUFjYixFQUFBLElBQUksRUFkUyxTQUFBO0FBZWIsRUFBQSxPQUFPLEVBZk0sWUFBQTtBQWdCYixFQUFBLE9BQU8sRUFoQk0sWUFBQTtBQWlCYixFQUFBLFdBQVcsRUFqQkUsZ0JBQUE7QUFrQmIsRUFBQSxRQUFRLEVBbEJLLGFBQUE7QUFtQmIsRUFBQSxHQUFHLEVBbkJVLFFBQUE7QUFvQmIsRUFBQSxHQUFHLEVBcEJVLGFBQUE7QUFzQmIsRUFBQSxJQUFJLEVBdEJTLFNBQUE7QUF3QmIsRUFBQSxRQUFRLEVBeEJLLGNBQUE7QUF5QmIsRUFBQSxJQUFJLEVBekJTLG1CQUFBO0FBMEJiLEVBQUEsRUFBRSxFQTFCVyxXQUFBO0FBMkJiLFNBM0JhLFFBQUE7QUE0QmIsVUE1QmEsU0FBQTtBQTZCYixFQUFBLFNBQVMsRUE3QkksbUJBQUE7QUErQmIsRUFBQSxNQUFNLEVBQUUsT0FBTyxDQS9CRixlQStCRSxDQS9CRjtBQWdDYixhQUFTLE9BQU8sQ0FoQ0gsZ0JBZ0NHLENBaENIO0FBaUNiLEVBQUEsTUFBTSxFQUFFLE9BQU8sQ0FqQ0YsZUFpQ0UsQ0FqQ0Y7QUFrQ2IsRUFBQSxTQWxDYTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQSxnQkFrQ0o7QUFDUCxXQUFPLFlBQVksQ0FBQSxrQkFBQSxFQUFuQixTQUFtQixDQUFuQjtBQW5DVyxHQUFBO0FBQUEsMkJBcUNUO0FBQ0YsV0FBTyxZQUFZLENBQUEsYUFBQSxFQUFuQixJQUFtQixDQUFuQjtBQUNEO0FBdkNZLENBQWY7O0FBNENBLFNBQUEsT0FBQSxDQUFBLElBQUEsRUFBeUQ7QUFDdkQsU0FBTyxVQUFBLEtBQUEsRUFBQSxHQUFBLEVBQWlEO0FBQ3RELFdBQU8sWUFBWSxDQUFBLElBQUEsRUFBQSxLQUFBLEVBQW5CLEdBQW1CLENBQW5CO0FBREYsR0FBQTtBQUdEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGljdCwgT3B0aW9uIH0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBMT0NBTF9ERUJVRyB9IGZyb20gJ0BnbGltbWVyL2xvY2FsLWRlYnVnLWZsYWdzJztcbmltcG9ydCB7IGFzc2VydCwgYXNzaWduLCBkZXByZWNhdGUsIGlzUHJlc2VudCB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuXG5pbXBvcnQgeyBTb3VyY2VMb2NhdGlvbiwgU291cmNlUG9zaXRpb24sIFNZTlRIRVRJQ19MT0NBVElPTiB9IGZyb20gJy4uL3NvdXJjZS9sb2NhdGlvbic7XG5pbXBvcnQgeyBTb3VyY2UgfSBmcm9tICcuLi9zb3VyY2Uvc291cmNlJztcbmltcG9ydCB7IFNvdXJjZVNwYW4gfSBmcm9tICcuLi9zb3VyY2Uvc3Bhbic7XG5pbXBvcnQgKiBhcyBBU1R2MSBmcm9tICcuL2FwaSc7XG5pbXBvcnQgeyBQYXRoRXhwcmVzc2lvbkltcGxWMSB9IGZyb20gJy4vbGVnYWN5LWludGVyb3AnO1xuXG5sZXQgX1NPVVJDRTogU291cmNlIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBTT1VSQ0UoKTogU291cmNlIHtcbiAgaWYgKCFfU09VUkNFKSB7XG4gICAgX1NPVVJDRSA9IG5ldyBTb3VyY2UoJycsICcoc3ludGhldGljKScpO1xuICB9XG5cbiAgcmV0dXJuIF9TT1VSQ0U7XG59XG5cbi8vIGNvbnN0IFNPVVJDRSA9IG5ldyBTb3VyY2UoJycsICcodGVzdHMpJyk7XG5cbi8vIFN0YXRlbWVudHNcblxuZXhwb3J0IHR5cGUgQnVpbGRlckhlYWQgPSBzdHJpbmcgfCBBU1R2MS5FeHByZXNzaW9uO1xuZXhwb3J0IHR5cGUgVGFnRGVzY3JpcHRvciA9IHN0cmluZyB8IHsgbmFtZTogc3RyaW5nOyBzZWxmQ2xvc2luZzogYm9vbGVhbiB9O1xuXG5mdW5jdGlvbiBidWlsZE11c3RhY2hlKFxuICBwYXRoOiBCdWlsZGVySGVhZCB8IEFTVHYxLkxpdGVyYWwsXG4gIHBhcmFtcz86IEFTVHYxLkV4cHJlc3Npb25bXSxcbiAgaGFzaD86IEFTVHYxLkhhc2gsXG4gIHJhdz86IGJvb2xlYW4sXG4gIGxvYz86IFNvdXJjZUxvY2F0aW9uLFxuICBzdHJpcD86IEFTVHYxLlN0cmlwRmxhZ3Ncbik6IEFTVHYxLk11c3RhY2hlU3RhdGVtZW50IHtcbiAgaWYgKHR5cGVvZiBwYXRoID09PSAnc3RyaW5nJykge1xuICAgIHBhdGggPSBidWlsZFBhdGgocGF0aCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdNdXN0YWNoZVN0YXRlbWVudCcsXG4gICAgcGF0aCxcbiAgICBwYXJhbXM6IHBhcmFtcyB8fCBbXSxcbiAgICBoYXNoOiBoYXNoIHx8IGJ1aWxkSGFzaChbXSksXG4gICAgZXNjYXBlZDogIXJhdyxcbiAgICB0cnVzdGluZzogISFyYXcsXG4gICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gICAgc3RyaXA6IHN0cmlwIHx8IHsgb3BlbjogZmFsc2UsIGNsb3NlOiBmYWxzZSB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZEJsb2NrKFxuICBwYXRoOiBCdWlsZGVySGVhZCxcbiAgcGFyYW1zOiBPcHRpb248QVNUdjEuRXhwcmVzc2lvbltdPixcbiAgaGFzaDogT3B0aW9uPEFTVHYxLkhhc2g+LFxuICBfZGVmYXVsdEJsb2NrOiBBU1R2MS5Qb3NzaWJseURlcHJlY2F0ZWRCbG9jayxcbiAgX2Vsc2VCbG9jaz86IE9wdGlvbjxBU1R2MS5Qb3NzaWJseURlcHJlY2F0ZWRCbG9jaz4sXG4gIGxvYz86IFNvdXJjZUxvY2F0aW9uLFxuICBvcGVuU3RyaXA/OiBBU1R2MS5TdHJpcEZsYWdzLFxuICBpbnZlcnNlU3RyaXA/OiBBU1R2MS5TdHJpcEZsYWdzLFxuICBjbG9zZVN0cmlwPzogQVNUdjEuU3RyaXBGbGFnc1xuKTogQVNUdjEuQmxvY2tTdGF0ZW1lbnQge1xuICBsZXQgZGVmYXVsdEJsb2NrOiBBU1R2MS5CbG9jaztcbiAgbGV0IGVsc2VCbG9jazogT3B0aW9uPEFTVHYxLkJsb2NrPiB8IHVuZGVmaW5lZDtcblxuICBpZiAoX2RlZmF1bHRCbG9jay50eXBlID09PSAnVGVtcGxhdGUnKSB7XG4gICAgaWYgKExPQ0FMX0RFQlVHKSB7XG4gICAgICBkZXByZWNhdGUoYGIucHJvZ3JhbSBpcyBkZXByZWNhdGVkLiBVc2UgYi5ibG9ja0l0c2VsZiBpbnN0ZWFkLmApO1xuICAgIH1cblxuICAgIGRlZmF1bHRCbG9jayA9IChhc3NpZ24oe30sIF9kZWZhdWx0QmxvY2ssIHsgdHlwZTogJ0Jsb2NrJyB9KSBhcyB1bmtub3duKSBhcyBBU1R2MS5CbG9jaztcbiAgfSBlbHNlIHtcbiAgICBkZWZhdWx0QmxvY2sgPSBfZGVmYXVsdEJsb2NrO1xuICB9XG5cbiAgaWYgKF9lbHNlQmxvY2sgIT09IHVuZGVmaW5lZCAmJiBfZWxzZUJsb2NrICE9PSBudWxsICYmIF9lbHNlQmxvY2sudHlwZSA9PT0gJ1RlbXBsYXRlJykge1xuICAgIGlmIChMT0NBTF9ERUJVRykge1xuICAgICAgZGVwcmVjYXRlKGBiLnByb2dyYW0gaXMgZGVwcmVjYXRlZC4gVXNlIGIuYmxvY2tJdHNlbGYgaW5zdGVhZC5gKTtcbiAgICB9XG5cbiAgICBlbHNlQmxvY2sgPSAoYXNzaWduKHt9LCBfZWxzZUJsb2NrLCB7IHR5cGU6ICdCbG9jaycgfSkgYXMgdW5rbm93bikgYXMgQVNUdjEuQmxvY2s7XG4gIH0gZWxzZSB7XG4gICAgZWxzZUJsb2NrID0gX2Vsc2VCbG9jaztcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0Jsb2NrU3RhdGVtZW50JyxcbiAgICBwYXRoOiBidWlsZFBhdGgocGF0aCksXG4gICAgcGFyYW1zOiBwYXJhbXMgfHwgW10sXG4gICAgaGFzaDogaGFzaCB8fCBidWlsZEhhc2goW10pLFxuICAgIHByb2dyYW06IGRlZmF1bHRCbG9jayB8fCBudWxsLFxuICAgIGludmVyc2U6IGVsc2VCbG9jayB8fCBudWxsLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICAgIG9wZW5TdHJpcDogb3BlblN0cmlwIHx8IHsgb3BlbjogZmFsc2UsIGNsb3NlOiBmYWxzZSB9LFxuICAgIGludmVyc2VTdHJpcDogaW52ZXJzZVN0cmlwIHx8IHsgb3BlbjogZmFsc2UsIGNsb3NlOiBmYWxzZSB9LFxuICAgIGNsb3NlU3RyaXA6IGNsb3NlU3RyaXAgfHwgeyBvcGVuOiBmYWxzZSwgY2xvc2U6IGZhbHNlIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRWxlbWVudE1vZGlmaWVyKFxuICBwYXRoOiBCdWlsZGVySGVhZCB8IEFTVHYxLkV4cHJlc3Npb24sXG4gIHBhcmFtcz86IEFTVHYxLkV4cHJlc3Npb25bXSxcbiAgaGFzaD86IEFTVHYxLkhhc2gsXG4gIGxvYz86IE9wdGlvbjxTb3VyY2VMb2NhdGlvbj5cbik6IEFTVHYxLkVsZW1lbnRNb2RpZmllclN0YXRlbWVudCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0VsZW1lbnRNb2RpZmllclN0YXRlbWVudCcsXG4gICAgcGF0aDogYnVpbGRQYXRoKHBhdGgpLFxuICAgIHBhcmFtczogcGFyYW1zIHx8IFtdLFxuICAgIGhhc2g6IGhhc2ggfHwgYnVpbGRIYXNoKFtdKSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQYXJ0aWFsKFxuICBuYW1lOiBBU1R2MS5QYXRoRXhwcmVzc2lvbixcbiAgcGFyYW1zPzogQVNUdjEuRXhwcmVzc2lvbltdLFxuICBoYXNoPzogQVNUdjEuSGFzaCxcbiAgaW5kZW50Pzogc3RyaW5nLFxuICBsb2M/OiBTb3VyY2VMb2NhdGlvblxuKTogQVNUdjEuUGFydGlhbFN0YXRlbWVudCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ1BhcnRpYWxTdGF0ZW1lbnQnLFxuICAgIG5hbWU6IG5hbWUsXG4gICAgcGFyYW1zOiBwYXJhbXMgfHwgW10sXG4gICAgaGFzaDogaGFzaCB8fCBidWlsZEhhc2goW10pLFxuICAgIGluZGVudDogaW5kZW50IHx8ICcnLFxuICAgIHN0cmlwOiB7IG9wZW46IGZhbHNlLCBjbG9zZTogZmFsc2UgfSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRDb21tZW50KHZhbHVlOiBzdHJpbmcsIGxvYz86IFNvdXJjZUxvY2F0aW9uKTogQVNUdjEuQ29tbWVudFN0YXRlbWVudCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0NvbW1lbnRTdGF0ZW1lbnQnLFxuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRNdXN0YWNoZUNvbW1lbnQodmFsdWU6IHN0cmluZywgbG9jPzogU291cmNlTG9jYXRpb24pOiBBU1R2MS5NdXN0YWNoZUNvbW1lbnRTdGF0ZW1lbnQge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdNdXN0YWNoZUNvbW1lbnRTdGF0ZW1lbnQnLFxuICAgIHZhbHVlOiB2YWx1ZSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRDb25jYXQoXG4gIHBhcnRzOiAoQVNUdjEuVGV4dE5vZGUgfCBBU1R2MS5NdXN0YWNoZVN0YXRlbWVudClbXSxcbiAgbG9jPzogU291cmNlTG9jYXRpb25cbik6IEFTVHYxLkNvbmNhdFN0YXRlbWVudCB7XG4gIGlmICghaXNQcmVzZW50KHBhcnRzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgYi5jb25jYXQgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIHBhcnRgKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0NvbmNhdFN0YXRlbWVudCcsXG4gICAgcGFydHM6IHBhcnRzIHx8IFtdLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG4vLyBOb2Rlc1xuXG5leHBvcnQgdHlwZSBFbGVtZW50UGFydHMgPVxuICB8IFsnYXR0cnMnLCAuLi5BdHRyU2V4cFtdXVxuICB8IFsnbW9kaWZpZXJzJywgLi4uTW9kaWZpZXJTZXhwW11dXG4gIHwgWydib2R5JywgLi4uQVNUdjEuU3RhdGVtZW50W11dXG4gIHwgWydjb21tZW50cycsIC4uLkVsZW1lbnRDb21tZW50W11dXG4gIHwgWydhcycsIC4uLnN0cmluZ1tdXVxuICB8IFsnbG9jJywgU291cmNlTG9jYXRpb25dO1xuXG5leHBvcnQgdHlwZSBQYXRoU2V4cCA9IHN0cmluZyB8IFsncGF0aCcsIHN0cmluZywgTG9jU2V4cD9dO1xuXG5leHBvcnQgdHlwZSBNb2RpZmllclNleHAgPVxuICB8IHN0cmluZ1xuICB8IFtQYXRoU2V4cCwgTG9jU2V4cD9dXG4gIHwgW1BhdGhTZXhwLCBBU1R2MS5FeHByZXNzaW9uW10sIExvY1NleHA/XVxuICB8IFtQYXRoU2V4cCwgQVNUdjEuRXhwcmVzc2lvbltdLCBEaWN0PEFTVHYxLkV4cHJlc3Npb24+LCBMb2NTZXhwP107XG5cbmV4cG9ydCB0eXBlIEF0dHJTZXhwID0gW3N0cmluZywgQVNUdjEuQXR0ck5vZGVbJ3ZhbHVlJ10gfCBzdHJpbmcsIExvY1NleHA/XTtcblxuZXhwb3J0IHR5cGUgTG9jU2V4cCA9IFsnbG9jJywgU291cmNlTG9jYXRpb25dO1xuXG5leHBvcnQgdHlwZSBFbGVtZW50Q29tbWVudCA9IEFTVHYxLk11c3RhY2hlQ29tbWVudFN0YXRlbWVudCB8IFNvdXJjZUxvY2F0aW9uIHwgc3RyaW5nO1xuXG5leHBvcnQgdHlwZSBTZXhwVmFsdWUgPVxuICB8IHN0cmluZ1xuICB8IEFTVHYxLkV4cHJlc3Npb25bXVxuICB8IERpY3Q8QVNUdjEuRXhwcmVzc2lvbj5cbiAgfCBMb2NTZXhwXG4gIHwgUGF0aFNleHBcbiAgfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRFbGVtZW50T3B0aW9ucyB7XG4gIGF0dHJzPzogQVNUdjEuQXR0ck5vZGVbXTtcbiAgbW9kaWZpZXJzPzogQVNUdjEuRWxlbWVudE1vZGlmaWVyU3RhdGVtZW50W107XG4gIGNoaWxkcmVuPzogQVNUdjEuU3RhdGVtZW50W107XG4gIGNvbW1lbnRzPzogRWxlbWVudENvbW1lbnRbXTtcbiAgYmxvY2tQYXJhbXM/OiBzdHJpbmdbXTtcbiAgbG9jPzogU291cmNlU3Bhbjtcbn1cblxuZnVuY3Rpb24gYnVpbGRFbGVtZW50KHRhZzogVGFnRGVzY3JpcHRvciwgb3B0aW9uczogQnVpbGRFbGVtZW50T3B0aW9ucyk6IEFTVHYxLkVsZW1lbnROb2RlIHtcbiAgbGV0IHsgYXR0cnMsIGJsb2NrUGFyYW1zLCBtb2RpZmllcnMsIGNvbW1lbnRzLCBjaGlsZHJlbiwgbG9jIH0gPSBvcHRpb25zO1xuXG4gIGxldCB0YWdOYW1lOiBzdHJpbmc7XG5cbiAgLy8gdGhpcyBpcyB1c2VkIGZvciBiYWNrd2FyZHMgY29tcGF0LCBwcmlvciB0byBgc2VsZkNsb3NpbmdgIGJlaW5nIHBhcnQgb2YgdGhlIEVsZW1lbnROb2RlIEFTVFxuICBsZXQgc2VsZkNsb3NpbmcgPSBmYWxzZTtcbiAgaWYgKHR5cGVvZiB0YWcgPT09ICdvYmplY3QnKSB7XG4gICAgc2VsZkNsb3NpbmcgPSB0YWcuc2VsZkNsb3Npbmc7XG4gICAgdGFnTmFtZSA9IHRhZy5uYW1lO1xuICB9IGVsc2UgaWYgKHRhZy5zbGljZSgtMSkgPT09ICcvJykge1xuICAgIHRhZ05hbWUgPSB0YWcuc2xpY2UoMCwgLTEpO1xuICAgIHNlbGZDbG9zaW5nID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICB0YWdOYW1lID0gdGFnO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnRWxlbWVudE5vZGUnLFxuICAgIHRhZzogdGFnTmFtZSxcbiAgICBzZWxmQ2xvc2luZzogc2VsZkNsb3NpbmcsXG4gICAgYXR0cmlidXRlczogYXR0cnMgfHwgW10sXG4gICAgYmxvY2tQYXJhbXM6IGJsb2NrUGFyYW1zIHx8IFtdLFxuICAgIG1vZGlmaWVyczogbW9kaWZpZXJzIHx8IFtdLFxuICAgIGNvbW1lbnRzOiAoY29tbWVudHMgYXMgQVNUdjEuTXVzdGFjaGVDb21tZW50U3RhdGVtZW50W10pIHx8IFtdLFxuICAgIGNoaWxkcmVuOiBjaGlsZHJlbiB8fCBbXSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRBdHRyKFxuICBuYW1lOiBzdHJpbmcsXG4gIHZhbHVlOiBBU1R2MS5BdHRyTm9kZVsndmFsdWUnXSxcbiAgbG9jPzogU291cmNlTG9jYXRpb25cbik6IEFTVHYxLkF0dHJOb2RlIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnQXR0ck5vZGUnLFxuICAgIG5hbWU6IG5hbWUsXG4gICAgdmFsdWU6IHZhbHVlLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFRleHQoY2hhcnM/OiBzdHJpbmcsIGxvYz86IFNvdXJjZUxvY2F0aW9uKTogQVNUdjEuVGV4dE5vZGUge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdUZXh0Tm9kZScsXG4gICAgY2hhcnM6IGNoYXJzIHx8ICcnLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG4vLyBFeHByZXNzaW9uc1xuXG5mdW5jdGlvbiBidWlsZFNleHByKFxuICBwYXRoOiBCdWlsZGVySGVhZCxcbiAgcGFyYW1zPzogQVNUdjEuRXhwcmVzc2lvbltdLFxuICBoYXNoPzogQVNUdjEuSGFzaCxcbiAgbG9jPzogU291cmNlTG9jYXRpb25cbik6IEFTVHYxLlN1YkV4cHJlc3Npb24ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdTdWJFeHByZXNzaW9uJyxcbiAgICBwYXRoOiBidWlsZFBhdGgocGF0aCksXG4gICAgcGFyYW1zOiBwYXJhbXMgfHwgW10sXG4gICAgaGFzaDogaGFzaCB8fCBidWlsZEhhc2goW10pLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBoZWFkVG9TdHJpbmcoaGVhZDogQVNUdjEuUGF0aEhlYWQpOiB7IG9yaWdpbmFsOiBzdHJpbmc7IHBhcnRzOiBzdHJpbmdbXSB9IHtcbiAgc3dpdGNoIChoZWFkLnR5cGUpIHtcbiAgICBjYXNlICdBdEhlYWQnOlxuICAgICAgcmV0dXJuIHsgb3JpZ2luYWw6IGhlYWQubmFtZSwgcGFydHM6IFtoZWFkLm5hbWVdIH07XG4gICAgY2FzZSAnVGhpc0hlYWQnOlxuICAgICAgcmV0dXJuIHsgb3JpZ2luYWw6IGB0aGlzYCwgcGFydHM6IFtdIH07XG4gICAgY2FzZSAnVmFySGVhZCc6XG4gICAgICByZXR1cm4geyBvcmlnaW5hbDogaGVhZC5uYW1lLCBwYXJ0czogW2hlYWQubmFtZV0gfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZEhlYWQoXG4gIG9yaWdpbmFsOiBzdHJpbmcsXG4gIGxvYzogU291cmNlTG9jYXRpb25cbik6IHsgaGVhZDogQVNUdjEuUGF0aEhlYWQ7IHRhaWw6IHN0cmluZ1tdIH0ge1xuICBsZXQgW2hlYWQsIC4uLnRhaWxdID0gb3JpZ2luYWwuc3BsaXQoJy4nKTtcbiAgbGV0IGhlYWROb2RlOiBBU1R2MS5QYXRoSGVhZDtcblxuICBpZiAoaGVhZCA9PT0gJ3RoaXMnKSB7XG4gICAgaGVhZE5vZGUgPSB7XG4gICAgICB0eXBlOiAnVGhpc0hlYWQnLFxuICAgICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gICAgfTtcbiAgfSBlbHNlIGlmIChoZWFkWzBdID09PSAnQCcpIHtcbiAgICBoZWFkTm9kZSA9IHtcbiAgICAgIHR5cGU6ICdBdEhlYWQnLFxuICAgICAgbmFtZTogaGVhZCxcbiAgICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgaGVhZE5vZGUgPSB7XG4gICAgICB0eXBlOiAnVmFySGVhZCcsXG4gICAgICBuYW1lOiBoZWFkLFxuICAgICAgbG9jOiBidWlsZExvYyhsb2MgfHwgbnVsbCksXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgaGVhZDogaGVhZE5vZGUsXG4gICAgdGFpbCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRUaGlzKGxvYzogU291cmNlTG9jYXRpb24pOiBBU1R2MS5QYXRoSGVhZCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ1RoaXNIZWFkJyxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRBdE5hbWUobmFtZTogc3RyaW5nLCBsb2M6IFNvdXJjZUxvY2F0aW9uKTogQVNUdjEuUGF0aEhlYWQge1xuICAvLyB0aGUgYEBgIHNob3VsZCBiZSBpbmNsdWRlZCBzbyB3ZSBoYXZlIGEgY29tcGxldGUgc291cmNlIHJhbmdlXG4gIGFzc2VydChuYW1lWzBdID09PSAnQCcsIGBjYWxsIGJ1aWxkZXJzLmF0KCkgd2l0aCBhIHN0cmluZyB0aGF0IHN0YXJ0cyB3aXRoICdAJ2ApO1xuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0F0SGVhZCcsXG4gICAgbmFtZSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRWYXIobmFtZTogc3RyaW5nLCBsb2M6IFNvdXJjZUxvY2F0aW9uKTogQVNUdjEuUGF0aEhlYWQge1xuICBhc3NlcnQobmFtZSAhPT0gJ3RoaXMnLCBgWW91IGNhbGxlZCBidWlsZGVycy52YXIoKSB3aXRoICd0aGlzJy4gQ2FsbCBidWlsZGVycy50aGlzIGluc3RlYWRgKTtcbiAgYXNzZXJ0KFxuICAgIG5hbWVbMF0gIT09ICdAJyxcbiAgICBgWW91IGNhbGxlZCBidWlsZGVycy52YXIoKSB3aXRoICcke25hbWV9Jy4gQ2FsbCBidWlsZGVycy5hdCgnJHtuYW1lfScpIGluc3RlYWRgXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnVmFySGVhZCcsXG4gICAgbmFtZSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRIZWFkRnJvbVN0cmluZyhoZWFkOiBzdHJpbmcsIGxvYzogU291cmNlTG9jYXRpb24pOiBBU1R2MS5QYXRoSGVhZCB7XG4gIGlmIChoZWFkWzBdID09PSAnQCcpIHtcbiAgICByZXR1cm4gYnVpbGRBdE5hbWUoaGVhZCwgbG9jKTtcbiAgfSBlbHNlIGlmIChoZWFkID09PSAndGhpcycpIHtcbiAgICByZXR1cm4gYnVpbGRUaGlzKGxvYyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJ1aWxkVmFyKGhlYWQsIGxvYyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGROYW1lZEJsb2NrTmFtZShuYW1lOiBzdHJpbmcsIGxvYz86IFNvdXJjZUxvY2F0aW9uKTogQVNUdjEuTmFtZWRCbG9ja05hbWUge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdOYW1lZEJsb2NrTmFtZScsXG4gICAgbmFtZSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRDbGVhblBhdGgoXG4gIGhlYWQ6IEFTVHYxLlBhdGhIZWFkLFxuICB0YWlsOiBzdHJpbmdbXSxcbiAgbG9jOiBTb3VyY2VMb2NhdGlvblxuKTogQVNUdjEuUGF0aEV4cHJlc3Npb24ge1xuICBsZXQgeyBvcmlnaW5hbDogb3JpZ2luYWxIZWFkLCBwYXJ0czogaGVhZFBhcnRzIH0gPSBoZWFkVG9TdHJpbmcoaGVhZCk7XG4gIGxldCBwYXJ0cyA9IFsuLi5oZWFkUGFydHMsIC4uLnRhaWxdO1xuICBsZXQgb3JpZ2luYWwgPSBbLi4ub3JpZ2luYWxIZWFkLCAuLi5wYXJ0c10uam9pbignLicpO1xuXG4gIHJldHVybiBuZXcgUGF0aEV4cHJlc3Npb25JbXBsVjEob3JpZ2luYWwsIGhlYWQsIHRhaWwsIGJ1aWxkTG9jKGxvYyB8fCBudWxsKSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUGF0aChcbiAgcGF0aDogQVNUdjEuUGF0aEV4cHJlc3Npb24gfCBzdHJpbmcgfCB7IGhlYWQ6IHN0cmluZzsgdGFpbDogc3RyaW5nW10gfSxcbiAgbG9jPzogU291cmNlTG9jYXRpb25cbik6IEFTVHYxLlBhdGhFeHByZXNzaW9uO1xuZnVuY3Rpb24gYnVpbGRQYXRoKHBhdGg6IEFTVHYxLkV4cHJlc3Npb24sIGxvYz86IFNvdXJjZUxvY2F0aW9uKTogQVNUdjEuRXhwcmVzc2lvbjtcbmZ1bmN0aW9uIGJ1aWxkUGF0aChwYXRoOiBCdWlsZGVySGVhZCB8IEFTVHYxLkV4cHJlc3Npb24sIGxvYz86IFNvdXJjZUxvY2F0aW9uKTogQVNUdjEuRXhwcmVzc2lvbjtcbmZ1bmN0aW9uIGJ1aWxkUGF0aChcbiAgcGF0aDogQnVpbGRlckhlYWQgfCBBU1R2MS5FeHByZXNzaW9uIHwgeyBoZWFkOiBzdHJpbmc7IHRhaWw6IHN0cmluZ1tdIH0sXG4gIGxvYz86IFNvdXJjZUxvY2F0aW9uXG4pOiBBU1R2MS5FeHByZXNzaW9uIHtcbiAgaWYgKHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJykge1xuICAgIGlmICgndHlwZScgaW4gcGF0aCkge1xuICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCB7IGhlYWQsIHRhaWwgfSA9IGJ1aWxkSGVhZChwYXRoLmhlYWQsIFNvdXJjZVNwYW4uYnJva2VuKCkpO1xuXG4gICAgICBhc3NlcnQoXG4gICAgICAgIHRhaWwubGVuZ3RoID09PSAwLFxuICAgICAgICBgYnVpbGRlci5wYXRoKHsgaGVhZCwgdGFpbCB9KSBzaG91bGQgbm90IGJlIGNhbGxlZCB3aXRoIGEgaGVhZCB3aXRoIGRvdHMgaW4gaXRgXG4gICAgICApO1xuXG4gICAgICBsZXQgeyBvcmlnaW5hbDogb3JpZ2luYWxIZWFkIH0gPSBoZWFkVG9TdHJpbmcoaGVhZCk7XG5cbiAgICAgIHJldHVybiBuZXcgUGF0aEV4cHJlc3Npb25JbXBsVjEoXG4gICAgICAgIFtvcmlnaW5hbEhlYWQsIC4uLnRhaWxdLmpvaW4oJy4nKSxcbiAgICAgICAgaGVhZCxcbiAgICAgICAgdGFpbCxcbiAgICAgICAgYnVpbGRMb2MobG9jIHx8IG51bGwpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGxldCB7IGhlYWQsIHRhaWwgfSA9IGJ1aWxkSGVhZChwYXRoLCBTb3VyY2VTcGFuLmJyb2tlbigpKTtcblxuICByZXR1cm4gbmV3IFBhdGhFeHByZXNzaW9uSW1wbFYxKHBhdGgsIGhlYWQsIHRhaWwsIGJ1aWxkTG9jKGxvYyB8fCBudWxsKSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTGl0ZXJhbDxUIGV4dGVuZHMgQVNUdjEuTGl0ZXJhbD4oXG4gIHR5cGU6IFRbJ3R5cGUnXSxcbiAgdmFsdWU6IFRbJ3ZhbHVlJ10sXG4gIGxvYz86IFNvdXJjZUxvY2F0aW9uXG4pOiBUIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlLFxuICAgIHZhbHVlLFxuICAgIG9yaWdpbmFsOiB2YWx1ZSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfSBhcyBUO1xufVxuXG4vLyBNaXNjZWxsYW5lb3VzXG5cbmZ1bmN0aW9uIGJ1aWxkSGFzaChwYWlycz86IEFTVHYxLkhhc2hQYWlyW10sIGxvYz86IFNvdXJjZUxvY2F0aW9uKTogQVNUdjEuSGFzaCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0hhc2gnLFxuICAgIHBhaXJzOiBwYWlycyB8fCBbXSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQYWlyKGtleTogc3RyaW5nLCB2YWx1ZTogQVNUdjEuRXhwcmVzc2lvbiwgbG9jPzogU291cmNlTG9jYXRpb24pOiBBU1R2MS5IYXNoUGFpciB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0hhc2hQYWlyJyxcbiAgICBrZXk6IGtleSxcbiAgICB2YWx1ZSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQcm9ncmFtKFxuICBib2R5PzogQVNUdjEuU3RhdGVtZW50W10sXG4gIGJsb2NrUGFyYW1zPzogc3RyaW5nW10sXG4gIGxvYz86IFNvdXJjZUxvY2F0aW9uXG4pOiBBU1R2MS5UZW1wbGF0ZSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ1RlbXBsYXRlJyxcbiAgICBib2R5OiBib2R5IHx8IFtdLFxuICAgIGJsb2NrUGFyYW1zOiBibG9ja1BhcmFtcyB8fCBbXSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRCbG9ja0l0c2VsZihcbiAgYm9keT86IEFTVHYxLlN0YXRlbWVudFtdLFxuICBibG9ja1BhcmFtcz86IHN0cmluZ1tdLFxuICBjaGFpbmVkID0gZmFsc2UsXG4gIGxvYz86IFNvdXJjZUxvY2F0aW9uXG4pOiBBU1R2MS5CbG9jayB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0Jsb2NrJyxcbiAgICBib2R5OiBib2R5IHx8IFtdLFxuICAgIGJsb2NrUGFyYW1zOiBibG9ja1BhcmFtcyB8fCBbXSxcbiAgICBjaGFpbmVkLFxuICAgIGxvYzogYnVpbGRMb2MobG9jIHx8IG51bGwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFRlbXBsYXRlKFxuICBib2R5PzogQVNUdjEuU3RhdGVtZW50W10sXG4gIGJsb2NrUGFyYW1zPzogc3RyaW5nW10sXG4gIGxvYz86IFNvdXJjZUxvY2F0aW9uXG4pOiBBU1R2MS5UZW1wbGF0ZSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ1RlbXBsYXRlJyxcbiAgICBib2R5OiBib2R5IHx8IFtdLFxuICAgIGJsb2NrUGFyYW1zOiBibG9ja1BhcmFtcyB8fCBbXSxcbiAgICBsb2M6IGJ1aWxkTG9jKGxvYyB8fCBudWxsKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQb3NpdGlvbihsaW5lOiBudW1iZXIsIGNvbHVtbjogbnVtYmVyKTogU291cmNlUG9zaXRpb24ge1xuICByZXR1cm4ge1xuICAgIGxpbmUsXG4gICAgY29sdW1uLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZExvYyhsb2M6IE9wdGlvbjxTb3VyY2VMb2NhdGlvbj4pOiBTb3VyY2VTcGFuO1xuZnVuY3Rpb24gYnVpbGRMb2MoXG4gIHN0YXJ0TGluZTogbnVtYmVyLFxuICBzdGFydENvbHVtbjogbnVtYmVyLFxuICBlbmRMaW5lPzogbnVtYmVyLFxuICBlbmRDb2x1bW4/OiBudW1iZXIsXG4gIHNvdXJjZT86IHN0cmluZ1xuKTogU291cmNlU3BhbjtcblxuZnVuY3Rpb24gYnVpbGRMb2MoLi4uYXJnczogYW55W10pOiBTb3VyY2VTcGFuIHtcbiAgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgbGV0IGxvYyA9IGFyZ3NbMF07XG5cbiAgICBpZiAobG9jICYmIHR5cGVvZiBsb2MgPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gU291cmNlU3Bhbi5mb3JIYnNMb2MoU09VUkNFKCksIGxvYyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBTb3VyY2VTcGFuLmZvckhic0xvYyhTT1VSQ0UoKSwgU1lOVEhFVElDX0xPQ0FUSU9OKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IFtzdGFydExpbmUsIHN0YXJ0Q29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW4sIF9zb3VyY2VdID0gYXJncztcbiAgICBsZXQgc291cmNlID0gX3NvdXJjZSA/IG5ldyBTb3VyY2UoJycsIF9zb3VyY2UpIDogU09VUkNFKCk7XG5cbiAgICByZXR1cm4gU291cmNlU3Bhbi5mb3JIYnNMb2Moc291cmNlLCB7XG4gICAgICBzdGFydDoge1xuICAgICAgICBsaW5lOiBzdGFydExpbmUsXG4gICAgICAgIGNvbHVtbjogc3RhcnRDb2x1bW4sXG4gICAgICB9LFxuICAgICAgZW5kOiB7XG4gICAgICAgIGxpbmU6IGVuZExpbmUsXG4gICAgICAgIGNvbHVtbjogZW5kQ29sdW1uLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG11c3RhY2hlOiBidWlsZE11c3RhY2hlLFxuICBibG9jazogYnVpbGRCbG9jayxcbiAgcGFydGlhbDogYnVpbGRQYXJ0aWFsLFxuICBjb21tZW50OiBidWlsZENvbW1lbnQsXG4gIG11c3RhY2hlQ29tbWVudDogYnVpbGRNdXN0YWNoZUNvbW1lbnQsXG4gIGVsZW1lbnQ6IGJ1aWxkRWxlbWVudCxcbiAgZWxlbWVudE1vZGlmaWVyOiBidWlsZEVsZW1lbnRNb2RpZmllcixcbiAgYXR0cjogYnVpbGRBdHRyLFxuICB0ZXh0OiBidWlsZFRleHQsXG4gIHNleHByOiBidWlsZFNleHByLFxuXG4gIGNvbmNhdDogYnVpbGRDb25jYXQsXG4gIGhhc2g6IGJ1aWxkSGFzaCxcbiAgcGFpcjogYnVpbGRQYWlyLFxuICBsaXRlcmFsOiBidWlsZExpdGVyYWwsXG4gIHByb2dyYW06IGJ1aWxkUHJvZ3JhbSxcbiAgYmxvY2tJdHNlbGY6IGJ1aWxkQmxvY2tJdHNlbGYsXG4gIHRlbXBsYXRlOiBidWlsZFRlbXBsYXRlLFxuICBsb2M6IGJ1aWxkTG9jLFxuICBwb3M6IGJ1aWxkUG9zaXRpb24sXG5cbiAgcGF0aDogYnVpbGRQYXRoLFxuXG4gIGZ1bGxQYXRoOiBidWlsZENsZWFuUGF0aCxcbiAgaGVhZDogYnVpbGRIZWFkRnJvbVN0cmluZyxcbiAgYXQ6IGJ1aWxkQXROYW1lLFxuICB2YXI6IGJ1aWxkVmFyLFxuICB0aGlzOiBidWlsZFRoaXMsXG4gIGJsb2NrTmFtZTogYnVpbGROYW1lZEJsb2NrTmFtZSxcblxuICBzdHJpbmc6IGxpdGVyYWwoJ1N0cmluZ0xpdGVyYWwnKSBhcyAodmFsdWU6IHN0cmluZykgPT4gQVNUdjEuU3RyaW5nTGl0ZXJhbCxcbiAgYm9vbGVhbjogbGl0ZXJhbCgnQm9vbGVhbkxpdGVyYWwnKSBhcyAodmFsdWU6IGJvb2xlYW4pID0+IEFTVHYxLkJvb2xlYW5MaXRlcmFsLFxuICBudW1iZXI6IGxpdGVyYWwoJ051bWJlckxpdGVyYWwnKSBhcyAodmFsdWU6IG51bWJlcikgPT4gQVNUdjEuTnVtYmVyTGl0ZXJhbCxcbiAgdW5kZWZpbmVkKCk6IEFTVHYxLlVuZGVmaW5lZExpdGVyYWwge1xuICAgIHJldHVybiBidWlsZExpdGVyYWwoJ1VuZGVmaW5lZExpdGVyYWwnLCB1bmRlZmluZWQpO1xuICB9LFxuICBudWxsKCk6IEFTVHYxLk51bGxMaXRlcmFsIHtcbiAgICByZXR1cm4gYnVpbGRMaXRlcmFsKCdOdWxsTGl0ZXJhbCcsIG51bGwpO1xuICB9LFxufTtcblxudHlwZSBCdWlsZExpdGVyYWw8VCBleHRlbmRzIEFTVHYxLkxpdGVyYWw+ID0gKHZhbHVlOiBUWyd2YWx1ZSddKSA9PiBUO1xuXG5mdW5jdGlvbiBsaXRlcmFsPFQgZXh0ZW5kcyBBU1R2MS5MaXRlcmFsPih0eXBlOiBUWyd0eXBlJ10pOiBCdWlsZExpdGVyYWw8VD4ge1xuICByZXR1cm4gZnVuY3Rpb24gKHZhbHVlOiBUWyd2YWx1ZSddLCBsb2M/OiBTb3VyY2VMb2NhdGlvbik6IFQge1xuICAgIHJldHVybiBidWlsZExpdGVyYWwodHlwZSwgdmFsdWUsIGxvYyk7XG4gIH07XG59XG4iXSwic291cmNlUm9vdCI6IiJ9