tokenize.js 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. 'use strict';
  2. exports.__esModule = true;
  3. exports.default = tokenize;
  4. var SINGLE_QUOTE = 39;
  5. var DOUBLE_QUOTE = 34;
  6. var BACKSLASH = 92;
  7. var SLASH = 47;
  8. var NEWLINE = 10;
  9. var SPACE = 32;
  10. var FEED = 12;
  11. var TAB = 9;
  12. var CR = 13;
  13. var OPEN_SQUARE = 91;
  14. var CLOSE_SQUARE = 93;
  15. var OPEN_PARENTHESES = 40;
  16. var CLOSE_PARENTHESES = 41;
  17. var OPEN_CURLY = 123;
  18. var CLOSE_CURLY = 125;
  19. var SEMICOLON = 59;
  20. var ASTERISK = 42;
  21. var COLON = 58;
  22. var AT = 64;
  23. var RE_AT_END = /[ \n\t\r\f\{\(\)'"\\;/\[\]#]/g;
  24. var RE_WORD_END = /[ \n\t\r\f\(\)\{\}:;@!'"\\\]\[#]|\/(?=\*)/g;
  25. var RE_BAD_BRACKET = /.[\\\/\("'\n]/;
  26. function tokenize(input) {
  27. var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  28. var tokens = [];
  29. var css = input.css.valueOf();
  30. var ignore = options.ignoreErrors;
  31. var code = void 0,
  32. next = void 0,
  33. quote = void 0,
  34. lines = void 0,
  35. last = void 0,
  36. content = void 0,
  37. escape = void 0,
  38. nextLine = void 0,
  39. nextOffset = void 0,
  40. escaped = void 0,
  41. escapePos = void 0,
  42. prev = void 0,
  43. n = void 0;
  44. var length = css.length;
  45. var offset = -1;
  46. var line = 1;
  47. var pos = 0;
  48. function unclosed(what) {
  49. throw input.error('Unclosed ' + what, line, pos - offset);
  50. }
  51. while (pos < length) {
  52. code = css.charCodeAt(pos);
  53. if (code === NEWLINE || code === FEED || code === CR && css.charCodeAt(pos + 1) !== NEWLINE) {
  54. offset = pos;
  55. line += 1;
  56. }
  57. switch (code) {
  58. case NEWLINE:
  59. case SPACE:
  60. case TAB:
  61. case CR:
  62. case FEED:
  63. next = pos;
  64. do {
  65. next += 1;
  66. code = css.charCodeAt(next);
  67. if (code === NEWLINE) {
  68. offset = next;
  69. line += 1;
  70. }
  71. } while (code === SPACE || code === NEWLINE || code === TAB || code === CR || code === FEED);
  72. tokens.push(['space', css.slice(pos, next)]);
  73. pos = next - 1;
  74. break;
  75. case OPEN_SQUARE:
  76. tokens.push(['[', '[', line, pos - offset]);
  77. break;
  78. case CLOSE_SQUARE:
  79. tokens.push([']', ']', line, pos - offset]);
  80. break;
  81. case OPEN_CURLY:
  82. tokens.push(['{', '{', line, pos - offset]);
  83. break;
  84. case CLOSE_CURLY:
  85. tokens.push(['}', '}', line, pos - offset]);
  86. break;
  87. case COLON:
  88. tokens.push([':', ':', line, pos - offset]);
  89. break;
  90. case SEMICOLON:
  91. tokens.push([';', ';', line, pos - offset]);
  92. break;
  93. case OPEN_PARENTHESES:
  94. prev = tokens.length ? tokens[tokens.length - 1][1] : '';
  95. n = css.charCodeAt(pos + 1);
  96. if (prev === 'url' && n !== SINGLE_QUOTE && n !== DOUBLE_QUOTE && n !== SPACE && n !== NEWLINE && n !== TAB && n !== FEED && n !== CR) {
  97. next = pos;
  98. do {
  99. escaped = false;
  100. next = css.indexOf(')', next + 1);
  101. if (next === -1) {
  102. if (ignore) {
  103. next = pos;
  104. break;
  105. } else {
  106. unclosed('bracket');
  107. }
  108. }
  109. escapePos = next;
  110. while (css.charCodeAt(escapePos - 1) === BACKSLASH) {
  111. escapePos -= 1;
  112. escaped = !escaped;
  113. }
  114. } while (escaped);
  115. tokens.push(['brackets', css.slice(pos, next + 1), line, pos - offset, line, next - offset]);
  116. pos = next;
  117. } else {
  118. next = css.indexOf(')', pos + 1);
  119. content = css.slice(pos, next + 1);
  120. if (next === -1 || RE_BAD_BRACKET.test(content)) {
  121. tokens.push(['(', '(', line, pos - offset]);
  122. } else {
  123. tokens.push(['brackets', content, line, pos - offset, line, next - offset]);
  124. pos = next;
  125. }
  126. }
  127. break;
  128. case CLOSE_PARENTHESES:
  129. tokens.push([')', ')', line, pos - offset]);
  130. break;
  131. case SINGLE_QUOTE:
  132. case DOUBLE_QUOTE:
  133. quote = code === SINGLE_QUOTE ? '\'' : '"';
  134. next = pos;
  135. do {
  136. escaped = false;
  137. next = css.indexOf(quote, next + 1);
  138. if (next === -1) {
  139. if (ignore) {
  140. next = pos + 1;
  141. break;
  142. } else {
  143. unclosed('string');
  144. }
  145. }
  146. escapePos = next;
  147. while (css.charCodeAt(escapePos - 1) === BACKSLASH) {
  148. escapePos -= 1;
  149. escaped = !escaped;
  150. }
  151. } while (escaped);
  152. content = css.slice(pos, next + 1);
  153. lines = content.split('\n');
  154. last = lines.length - 1;
  155. if (last > 0) {
  156. nextLine = line + last;
  157. nextOffset = next - lines[last].length;
  158. } else {
  159. nextLine = line;
  160. nextOffset = offset;
  161. }
  162. tokens.push(['string', css.slice(pos, next + 1), line, pos - offset, nextLine, next - nextOffset]);
  163. offset = nextOffset;
  164. line = nextLine;
  165. pos = next;
  166. break;
  167. case AT:
  168. RE_AT_END.lastIndex = pos + 1;
  169. RE_AT_END.test(css);
  170. if (RE_AT_END.lastIndex === 0) {
  171. next = css.length - 1;
  172. } else {
  173. next = RE_AT_END.lastIndex - 2;
  174. }
  175. tokens.push(['at-word', css.slice(pos, next + 1), line, pos - offset, line, next - offset]);
  176. pos = next;
  177. break;
  178. case BACKSLASH:
  179. next = pos;
  180. escape = true;
  181. while (css.charCodeAt(next + 1) === BACKSLASH) {
  182. next += 1;
  183. escape = !escape;
  184. }
  185. code = css.charCodeAt(next + 1);
  186. if (escape && code !== SLASH && code !== SPACE && code !== NEWLINE && code !== TAB && code !== CR && code !== FEED) {
  187. next += 1;
  188. }
  189. tokens.push(['word', css.slice(pos, next + 1), line, pos - offset, line, next - offset]);
  190. pos = next;
  191. break;
  192. default:
  193. if (code === SLASH && css.charCodeAt(pos + 1) === ASTERISK) {
  194. next = css.indexOf('*/', pos + 2) + 1;
  195. if (next === 0) {
  196. if (ignore) {
  197. next = css.length;
  198. } else {
  199. unclosed('comment');
  200. }
  201. }
  202. content = css.slice(pos, next + 1);
  203. lines = content.split('\n');
  204. last = lines.length - 1;
  205. if (last > 0) {
  206. nextLine = line + last;
  207. nextOffset = next - lines[last].length;
  208. } else {
  209. nextLine = line;
  210. nextOffset = offset;
  211. }
  212. tokens.push(['comment', content, line, pos - offset, nextLine, next - nextOffset]);
  213. offset = nextOffset;
  214. line = nextLine;
  215. pos = next;
  216. } else {
  217. RE_WORD_END.lastIndex = pos + 1;
  218. RE_WORD_END.test(css);
  219. if (RE_WORD_END.lastIndex === 0) {
  220. next = css.length - 1;
  221. } else {
  222. next = RE_WORD_END.lastIndex - 2;
  223. }
  224. tokens.push(['word', css.slice(pos, next + 1), line, pos - offset, line, next - offset]);
  225. pos = next;
  226. }
  227. break;
  228. }
  229. pos++;
  230. }
  231. return tokens;
  232. }
  233. module.exports = exports['default'];
  234. //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9saWIvdG9rZW5pemUuZXM2Il0sIm5hbWVzIjpbInRva2VuaXplIiwiU0lOR0xFX1FVT1RFIiwiRE9VQkxFX1FVT1RFIiwiQkFDS1NMQVNIIiwiU0xBU0giLCJORVdMSU5FIiwiU1BBQ0UiLCJGRUVEIiwiVEFCIiwiQ1IiLCJPUEVOX1NRVUFSRSIsIkNMT1NFX1NRVUFSRSIsIk9QRU5fUEFSRU5USEVTRVMiLCJDTE9TRV9QQVJFTlRIRVNFUyIsIk9QRU5fQ1VSTFkiLCJDTE9TRV9DVVJMWSIsIlNFTUlDT0xPTiIsIkFTVEVSSVNLIiwiQ09MT04iLCJBVCIsIlJFX0FUX0VORCIsIlJFX1dPUkRfRU5EIiwiUkVfQkFEX0JSQUNLRVQiLCJpbnB1dCIsIm9wdGlvbnMiLCJ0b2tlbnMiLCJjc3MiLCJ2YWx1ZU9mIiwiaWdub3JlIiwiaWdub3JlRXJyb3JzIiwiY29kZSIsIm5leHQiLCJxdW90ZSIsImxpbmVzIiwibGFzdCIsImNvbnRlbnQiLCJlc2NhcGUiLCJuZXh0TGluZSIsIm5leHRPZmZzZXQiLCJlc2NhcGVkIiwiZXNjYXBlUG9zIiwicHJldiIsIm4iLCJsZW5ndGgiLCJvZmZzZXQiLCJsaW5lIiwicG9zIiwidW5jbG9zZWQiLCJ3aGF0IiwiZXJyb3IiLCJjaGFyQ29kZUF0IiwicHVzaCIsInNsaWNlIiwiaW5kZXhPZiIsInRlc3QiLCJzcGxpdCIsImxhc3RJbmRleCJdLCJtYXBwaW5ncyI6Ijs7O2tCQXdCd0JBLFE7QUF4QnhCLElBQU1DLGlCQUFOO0FBQ0EsSUFBTUMsaUJBQU47QUFDQSxJQUFNQyxjQUFOO0FBQ0EsSUFBTUMsVUFBTjtBQUNBLElBQU1DLFlBQU47QUFDQSxJQUFNQyxVQUFOO0FBQ0EsSUFBTUMsU0FBTjtBQUNBLElBQU1DLE9BQU47QUFDQSxJQUFNQyxPQUFOO0FBQ0EsSUFBTUMsZ0JBQU47QUFDQSxJQUFNQyxpQkFBTjtBQUNBLElBQU1DLHFCQUFOO0FBQ0EsSUFBTUMsc0JBQU47QUFDQSxJQUFNQyxnQkFBTjtBQUNBLElBQU1DLGlCQUFOO0FBQ0EsSUFBTUMsY0FBTjtBQUNBLElBQU1DLGFBQU47QUFDQSxJQUFNQyxVQUFOO0FBQ0EsSUFBTUMsT0FBTjs7QUFFQSxJQUFNQyxZQUFpQiwrQkFBdkI7QUFDQSxJQUFNQyxjQUFpQiw0Q0FBdkI7QUFDQSxJQUFNQyxpQkFBaUIsZUFBdkI7O0FBRWUsU0FBU3RCLFFBQVQsQ0FBa0J1QixLQUFsQixFQUF3QztBQUFBLFFBQWZDLE9BQWUsdUVBQUwsRUFBSzs7QUFDbkQsUUFBSUMsU0FBUyxFQUFiO0FBQ0EsUUFBSUMsTUFBU0gsTUFBTUcsR0FBTixDQUFVQyxPQUFWLEVBQWI7O0FBRUEsUUFBSUMsU0FBU0osUUFBUUssWUFBckI7O0FBRUEsUUFBSUMsYUFBSjtBQUFBLFFBQVVDLGFBQVY7QUFBQSxRQUFnQkMsY0FBaEI7QUFBQSxRQUF1QkMsY0FBdkI7QUFBQSxRQUE4QkMsYUFBOUI7QUFBQSxRQUFvQ0MsZ0JBQXBDO0FBQUEsUUFBNkNDLGVBQTdDO0FBQUEsUUFDSUMsaUJBREo7QUFBQSxRQUNjQyxtQkFEZDtBQUFBLFFBQzBCQyxnQkFEMUI7QUFBQSxRQUNtQ0Msa0JBRG5DO0FBQUEsUUFDOENDLGFBRDlDO0FBQUEsUUFDb0RDLFVBRHBEOztBQUdBLFFBQUlDLFNBQVNqQixJQUFJaUIsTUFBakI7QUFDQSxRQUFJQyxTQUFTLENBQUMsQ0FBZDtBQUNBLFFBQUlDLE9BQVUsQ0FBZDtBQUNBLFFBQUlDLE1BQVUsQ0FBZDs7QUFFQSxhQUFTQyxRQUFULENBQWtCQyxJQUFsQixFQUF3QjtBQUNwQixjQUFNekIsTUFBTTBCLEtBQU4sQ0FBWSxjQUFjRCxJQUExQixFQUFnQ0gsSUFBaEMsRUFBc0NDLE1BQU1GLE1BQTVDLENBQU47QUFDSDs7QUFFRCxXQUFRRSxNQUFNSCxNQUFkLEVBQXVCO0FBQ25CYixlQUFPSixJQUFJd0IsVUFBSixDQUFlSixHQUFmLENBQVA7O0FBRUEsWUFBS2hCLFNBQVN6QixPQUFULElBQW9CeUIsU0FBU3ZCLElBQTdCLElBQ0F1QixTQUFTckIsRUFBVCxJQUFlaUIsSUFBSXdCLFVBQUosQ0FBZUosTUFBTSxDQUFyQixNQUE0QnpDLE9BRGhELEVBQzBEO0FBQ3REdUMscUJBQVNFLEdBQVQ7QUFDQUQsb0JBQVMsQ0FBVDtBQUNIOztBQUVELGdCQUFTZixJQUFUO0FBQ0EsaUJBQUt6QixPQUFMO0FBQ0EsaUJBQUtDLEtBQUw7QUFDQSxpQkFBS0UsR0FBTDtBQUNBLGlCQUFLQyxFQUFMO0FBQ0EsaUJBQUtGLElBQUw7QUFDSXdCLHVCQUFPZSxHQUFQO0FBQ0EsbUJBQUc7QUFDQ2YsNEJBQVEsQ0FBUjtBQUNBRCwyQkFBT0osSUFBSXdCLFVBQUosQ0FBZW5CLElBQWYsQ0FBUDtBQUNBLHdCQUFLRCxTQUFTekIsT0FBZCxFQUF3QjtBQUNwQnVDLGlDQUFTYixJQUFUO0FBQ0FjLGdDQUFTLENBQVQ7QUFDSDtBQUNKLGlCQVBELFFBT1VmLFNBQVN4QixLQUFULElBQ0F3QixTQUFTekIsT0FEVCxJQUVBeUIsU0FBU3RCLEdBRlQsSUFHQXNCLFNBQVNyQixFQUhULElBSUFxQixTQUFTdkIsSUFYbkI7O0FBYUFrQix1QkFBTzBCLElBQVAsQ0FBWSxDQUFDLE9BQUQsRUFBVXpCLElBQUkwQixLQUFKLENBQVVOLEdBQVYsRUFBZWYsSUFBZixDQUFWLENBQVo7QUFDQWUsc0JBQU1mLE9BQU8sQ0FBYjtBQUNBOztBQUVKLGlCQUFLckIsV0FBTDtBQUNJZSx1QkFBTzBCLElBQVAsQ0FBWSxDQUFDLEdBQUQsRUFBTSxHQUFOLEVBQVdOLElBQVgsRUFBaUJDLE1BQU1GLE1BQXZCLENBQVo7QUFDQTs7QUFFSixpQkFBS2pDLFlBQUw7QUFDSWMsdUJBQU8wQixJQUFQLENBQVksQ0FBQyxHQUFELEVBQU0sR0FBTixFQUFXTixJQUFYLEVBQWlCQyxNQUFNRixNQUF2QixDQUFaO0FBQ0E7O0FBRUosaUJBQUs5QixVQUFMO0FBQ0lXLHVCQUFPMEIsSUFBUCxDQUFZLENBQUMsR0FBRCxFQUFNLEdBQU4sRUFBV04sSUFBWCxFQUFpQkMsTUFBTUYsTUFBdkIsQ0FBWjtBQUNBOztBQUVKLGlCQUFLN0IsV0FBTDtBQUNJVSx1QkFBTzBCLElBQVAsQ0FBWSxDQUFDLEdBQUQsRUFBTSxHQUFOLEVBQVdOLElBQVgsRUFBaUJDLE1BQU1GLE1BQXZCLENBQVo7QUFDQTs7QUFFSixpQkFBSzFCLEtBQUw7QUFDSU8sdUJBQU8wQixJQUFQLENBQVksQ0FBQyxHQUFELEVBQU0sR0FBTixFQUFXTixJQUFYLEVBQWlCQyxNQUFNRixNQUF2QixDQUFaO0FBQ0E7O0FBRUosaUJBQUs1QixTQUFMO0FBQ0lTLHVCQUFPMEIsSUFBUCxDQUFZLENBQUMsR0FBRCxFQUFNLEdBQU4sRUFBV04sSUFBWCxFQUFpQkMsTUFBTUYsTUFBdkIsQ0FBWjtBQUNBOztBQUVKLGlCQUFLaEMsZ0JBQUw7QUFDSTZCLHVCQUFPaEIsT0FBT2tCLE1BQVAsR0FBZ0JsQixPQUFPQSxPQUFPa0IsTUFBUCxHQUFnQixDQUF2QixFQUEwQixDQUExQixDQUFoQixHQUErQyxFQUF0RDtBQUNBRCxvQkFBT2hCLElBQUl3QixVQUFKLENBQWVKLE1BQU0sQ0FBckIsQ0FBUDtBQUNBLG9CQUFLTCxTQUFTLEtBQVQsSUFBa0JDLE1BQU16QyxZQUF4QixJQUF3Q3lDLE1BQU14QyxZQUE5QyxJQUNrQndDLE1BQU1wQyxLQUR4QixJQUNpQ29DLE1BQU1yQyxPQUR2QyxJQUNrRHFDLE1BQU1sQyxHQUR4RCxJQUVrQmtDLE1BQU1uQyxJQUZ4QixJQUVnQ21DLE1BQU1qQyxFQUYzQyxFQUVnRDtBQUM1Q3NCLDJCQUFPZSxHQUFQO0FBQ0EsdUJBQUc7QUFDQ1Asa0NBQVUsS0FBVjtBQUNBUiwrQkFBVUwsSUFBSTJCLE9BQUosQ0FBWSxHQUFaLEVBQWlCdEIsT0FBTyxDQUF4QixDQUFWO0FBQ0EsNEJBQUtBLFNBQVMsQ0FBQyxDQUFmLEVBQW1CO0FBQ2YsZ0NBQUtILE1BQUwsRUFBYztBQUNWRyx1Q0FBT2UsR0FBUDtBQUNBO0FBQ0gsNkJBSEQsTUFHTztBQUNIQyx5Q0FBUyxTQUFUO0FBQ0g7QUFDSjtBQUNEUCxvQ0FBWVQsSUFBWjtBQUNBLCtCQUFRTCxJQUFJd0IsVUFBSixDQUFlVixZQUFZLENBQTNCLE1BQWtDckMsU0FBMUMsRUFBc0Q7QUFDbERxQyx5Q0FBYSxDQUFiO0FBQ0FELHNDQUFVLENBQUNBLE9BQVg7QUFDSDtBQUNKLHFCQWhCRCxRQWdCVUEsT0FoQlY7O0FBa0JBZCwyQkFBTzBCLElBQVAsQ0FBWSxDQUFDLFVBQUQsRUFBYXpCLElBQUkwQixLQUFKLENBQVVOLEdBQVYsRUFBZWYsT0FBTyxDQUF0QixDQUFiLEVBQ1JjLElBRFEsRUFDRkMsTUFBT0YsTUFETCxFQUVSQyxJQUZRLEVBRUZkLE9BQU9hLE1BRkwsQ0FBWjtBQUlBRSwwQkFBTWYsSUFBTjtBQUVILGlCQTVCRCxNQTRCTztBQUNIQSwyQkFBVUwsSUFBSTJCLE9BQUosQ0FBWSxHQUFaLEVBQWlCUCxNQUFNLENBQXZCLENBQVY7QUFDQVgsOEJBQVVULElBQUkwQixLQUFKLENBQVVOLEdBQVYsRUFBZWYsT0FBTyxDQUF0QixDQUFWOztBQUVBLHdCQUFLQSxTQUFTLENBQUMsQ0FBVixJQUFlVCxlQUFlZ0MsSUFBZixDQUFvQm5CLE9BQXBCLENBQXBCLEVBQW1EO0FBQy9DViwrQkFBTzBCLElBQVAsQ0FBWSxDQUFDLEdBQUQsRUFBTSxHQUFOLEVBQVdOLElBQVgsRUFBaUJDLE1BQU1GLE1BQXZCLENBQVo7QUFDSCxxQkFGRCxNQUVPO0FBQ0huQiwrQkFBTzBCLElBQVAsQ0FBWSxDQUFDLFVBQUQsRUFBYWhCLE9BQWIsRUFDUlUsSUFEUSxFQUNGQyxNQUFPRixNQURMLEVBRVJDLElBRlEsRUFFRmQsT0FBT2EsTUFGTCxDQUFaO0FBSUFFLDhCQUFNZixJQUFOO0FBQ0g7QUFDSjs7QUFFRDs7QUFFSixpQkFBS2xCLGlCQUFMO0FBQ0lZLHVCQUFPMEIsSUFBUCxDQUFZLENBQUMsR0FBRCxFQUFNLEdBQU4sRUFBV04sSUFBWCxFQUFpQkMsTUFBTUYsTUFBdkIsQ0FBWjtBQUNBOztBQUVKLGlCQUFLM0MsWUFBTDtBQUNBLGlCQUFLQyxZQUFMO0FBQ0k4Qix3QkFBUUYsU0FBUzdCLFlBQVQsR0FBd0IsSUFBeEIsR0FBK0IsR0FBdkM7QUFDQThCLHVCQUFRZSxHQUFSO0FBQ0EsbUJBQUc7QUFDQ1AsOEJBQVUsS0FBVjtBQUNBUiwyQkFBVUwsSUFBSTJCLE9BQUosQ0FBWXJCLEtBQVosRUFBbUJELE9BQU8sQ0FBMUIsQ0FBVjtBQUNBLHdCQUFLQSxTQUFTLENBQUMsQ0FBZixFQUFtQjtBQUNmLDRCQUFLSCxNQUFMLEVBQWM7QUFDVkcsbUNBQU9lLE1BQU0sQ0FBYjtBQUNBO0FBQ0gseUJBSEQsTUFHTztBQUNIQyxxQ0FBUyxRQUFUO0FBQ0g7QUFDSjtBQUNEUCxnQ0FBWVQsSUFBWjtBQUNBLDJCQUFRTCxJQUFJd0IsVUFBSixDQUFlVixZQUFZLENBQTNCLE1BQWtDckMsU0FBMUMsRUFBc0Q7QUFDbERxQyxxQ0FBYSxDQUFiO0FBQ0FELGtDQUFVLENBQUNBLE9BQVg7QUFDSDtBQUNKLGlCQWhCRCxRQWdCVUEsT0FoQlY7O0FBa0JBSiwwQkFBVVQsSUFBSTBCLEtBQUosQ0FBVU4sR0FBVixFQUFlZixPQUFPLENBQXRCLENBQVY7QUFDQUUsd0JBQVVFLFFBQVFvQixLQUFSLENBQWMsSUFBZCxDQUFWO0FBQ0FyQix1QkFBVUQsTUFBTVUsTUFBTixHQUFlLENBQXpCOztBQUVBLG9CQUFLVCxPQUFPLENBQVosRUFBZ0I7QUFDWkcsK0JBQWFRLE9BQU9YLElBQXBCO0FBQ0FJLGlDQUFhUCxPQUFPRSxNQUFNQyxJQUFOLEVBQVlTLE1BQWhDO0FBQ0gsaUJBSEQsTUFHTztBQUNITiwrQkFBYVEsSUFBYjtBQUNBUCxpQ0FBYU0sTUFBYjtBQUNIOztBQUVEbkIsdUJBQU8wQixJQUFQLENBQVksQ0FBQyxRQUFELEVBQVd6QixJQUFJMEIsS0FBSixDQUFVTixHQUFWLEVBQWVmLE9BQU8sQ0FBdEIsQ0FBWCxFQUNSYyxJQURRLEVBQ0ZDLE1BQU9GLE1BREwsRUFFUlAsUUFGUSxFQUVFTixPQUFPTyxVQUZULENBQVo7O0FBS0FNLHlCQUFTTixVQUFUO0FBQ0FPLHVCQUFTUixRQUFUO0FBQ0FTLHNCQUFTZixJQUFUO0FBQ0E7O0FBRUosaUJBQUtaLEVBQUw7QUFDSUMsMEJBQVVvQyxTQUFWLEdBQXNCVixNQUFNLENBQTVCO0FBQ0ExQiwwQkFBVWtDLElBQVYsQ0FBZTVCLEdBQWY7QUFDQSxvQkFBS04sVUFBVW9DLFNBQVYsS0FBd0IsQ0FBN0IsRUFBaUM7QUFDN0J6QiwyQkFBT0wsSUFBSWlCLE1BQUosR0FBYSxDQUFwQjtBQUNILGlCQUZELE1BRU87QUFDSFosMkJBQU9YLFVBQVVvQyxTQUFWLEdBQXNCLENBQTdCO0FBQ0g7QUFDRC9CLHVCQUFPMEIsSUFBUCxDQUFZLENBQUMsU0FBRCxFQUFZekIsSUFBSTBCLEtBQUosQ0FBVU4sR0FBVixFQUFlZixPQUFPLENBQXRCLENBQVosRUFDUmMsSUFEUSxFQUNGQyxNQUFPRixNQURMLEVBRVJDLElBRlEsRUFFRmQsT0FBT2EsTUFGTCxDQUFaO0FBSUFFLHNCQUFNZixJQUFOO0FBQ0E7O0FBRUosaUJBQUs1QixTQUFMO0FBQ0k0Qix1QkFBU2UsR0FBVDtBQUNBVix5QkFBUyxJQUFUO0FBQ0EsdUJBQVFWLElBQUl3QixVQUFKLENBQWVuQixPQUFPLENBQXRCLE1BQTZCNUIsU0FBckMsRUFBaUQ7QUFDN0M0Qiw0QkFBUyxDQUFUO0FBQ0FLLDZCQUFTLENBQUNBLE1BQVY7QUFDSDtBQUNETix1QkFBT0osSUFBSXdCLFVBQUosQ0FBZW5CLE9BQU8sQ0FBdEIsQ0FBUDtBQUNBLG9CQUFLSyxVQUFXTixTQUFTMUIsS0FBVCxJQUNBMEIsU0FBU3hCLEtBRFQsSUFFQXdCLFNBQVN6QixPQUZULElBR0F5QixTQUFTdEIsR0FIVCxJQUlBc0IsU0FBU3JCLEVBSlQsSUFLQXFCLFNBQVN2QixJQUx6QixFQUtrQztBQUM5QndCLDRCQUFRLENBQVI7QUFDSDtBQUNETix1QkFBTzBCLElBQVAsQ0FBWSxDQUFDLE1BQUQsRUFBU3pCLElBQUkwQixLQUFKLENBQVVOLEdBQVYsRUFBZWYsT0FBTyxDQUF0QixDQUFULEVBQ1JjLElBRFEsRUFDRkMsTUFBT0YsTUFETCxFQUVSQyxJQUZRLEVBRUZkLE9BQU9hLE1BRkwsQ0FBWjtBQUlBRSxzQkFBTWYsSUFBTjtBQUNBOztBQUVKO0FBQ0ksb0JBQUtELFNBQVMxQixLQUFULElBQWtCc0IsSUFBSXdCLFVBQUosQ0FBZUosTUFBTSxDQUFyQixNQUE0QjdCLFFBQW5ELEVBQThEO0FBQzFEYywyQkFBT0wsSUFBSTJCLE9BQUosQ0FBWSxJQUFaLEVBQWtCUCxNQUFNLENBQXhCLElBQTZCLENBQXBDO0FBQ0Esd0JBQUtmLFNBQVMsQ0FBZCxFQUFrQjtBQUNkLDRCQUFLSCxNQUFMLEVBQWM7QUFDVkcsbUNBQU9MLElBQUlpQixNQUFYO0FBQ0gseUJBRkQsTUFFTztBQUNISSxxQ0FBUyxTQUFUO0FBQ0g7QUFDSjs7QUFFRFosOEJBQVVULElBQUkwQixLQUFKLENBQVVOLEdBQVYsRUFBZWYsT0FBTyxDQUF0QixDQUFWO0FBQ0FFLDRCQUFVRSxRQUFRb0IsS0FBUixDQUFjLElBQWQsQ0FBVjtBQUNBckIsMkJBQVVELE1BQU1VLE1BQU4sR0FBZSxDQUF6Qjs7QUFFQSx3QkFBS1QsT0FBTyxDQUFaLEVBQWdCO0FBQ1pHLG1DQUFhUSxPQUFPWCxJQUFwQjtBQUNBSSxxQ0FBYVAsT0FBT0UsTUFBTUMsSUFBTixFQUFZUyxNQUFoQztBQUNILHFCQUhELE1BR087QUFDSE4sbUNBQWFRLElBQWI7QUFDQVAscUNBQWFNLE1BQWI7QUFDSDs7QUFFRG5CLDJCQUFPMEIsSUFBUCxDQUFZLENBQUMsU0FBRCxFQUFZaEIsT0FBWixFQUNSVSxJQURRLEVBQ0VDLE1BQU9GLE1BRFQsRUFFUlAsUUFGUSxFQUVFTixPQUFPTyxVQUZULENBQVo7O0FBS0FNLDZCQUFTTixVQUFUO0FBQ0FPLDJCQUFTUixRQUFUO0FBQ0FTLDBCQUFTZixJQUFUO0FBRUgsaUJBL0JELE1BK0JPO0FBQ0hWLGdDQUFZbUMsU0FBWixHQUF3QlYsTUFBTSxDQUE5QjtBQUNBekIsZ0NBQVlpQyxJQUFaLENBQWlCNUIsR0FBakI7QUFDQSx3QkFBS0wsWUFBWW1DLFNBQVosS0FBMEIsQ0FBL0IsRUFBbUM7QUFDL0J6QiwrQkFBT0wsSUFBSWlCLE1BQUosR0FBYSxDQUFwQjtBQUNILHFCQUZELE1BRU87QUFDSFosK0JBQU9WLFlBQVltQyxTQUFaLEdBQXdCLENBQS9CO0FBQ0g7O0FBRUQvQiwyQkFBTzBCLElBQVAsQ0FBWSxDQUFDLE1BQUQsRUFBU3pCLElBQUkwQixLQUFKLENBQVVOLEdBQVYsRUFBZWYsT0FBTyxDQUF0QixDQUFULEVBQ1JjLElBRFEsRUFDRkMsTUFBT0YsTUFETCxFQUVSQyxJQUZRLEVBRUZkLE9BQU9hLE1BRkwsQ0FBWjtBQUlBRSwwQkFBTWYsSUFBTjtBQUNIOztBQUVEO0FBdE9KOztBQXlPQWU7QUFDSDs7QUFFRCxXQUFPckIsTUFBUDtBQUNIIiwiZmlsZSI6InRva2VuaXplLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgU0lOR0xFX1FVT1RFICAgICAgPSAnXFwnJy5jaGFyQ29kZUF0KDApO1xuY29uc3QgRE9VQkxFX1FVT1RFICAgICAgPSAgJ1wiJy5jaGFyQ29kZUF0KDApO1xuY29uc3QgQkFDS1NMQVNIICAgICAgICAgPSAnXFxcXCcuY2hhckNvZGVBdCgwKTtcbmNvbnN0IFNMQVNIICAgICAgICAgICAgID0gICcvJy5jaGFyQ29kZUF0KDApO1xuY29uc3QgTkVXTElORSAgICAgICAgICAgPSAnXFxuJy5jaGFyQ29kZUF0KDApO1xuY29uc3QgU1BBQ0UgICAgICAgICAgICAgPSAgJyAnLmNoYXJDb2RlQXQoMCk7XG5jb25zdCBGRUVEICAgICAgICAgICAgICA9ICdcXGYnLmNoYXJDb2RlQXQoMCk7XG5jb25zdCBUQUIgICAgICAgICAgICAgICA9ICdcXHQnLmNoYXJDb2RlQXQoMCk7XG5jb25zdCBDUiAgICAgICAgICAgICAgICA9ICdcXHInLmNoYXJDb2RlQXQoMCk7XG5jb25zdCBPUEVOX1NRVUFSRSAgICAgICA9ICAnWycuY2hhckNvZGVBdCgwKTtcbmNvbnN0IENMT1NFX1NRVUFSRSAgICAgID0gICddJy5jaGFyQ29kZUF0KDApO1xuY29uc3QgT1BFTl9QQVJFTlRIRVNFUyAgPSAgJygnLmNoYXJDb2RlQXQoMCk7XG5jb25zdCBDTE9TRV9QQVJFTlRIRVNFUyA9ICAnKScuY2hhckNvZGVBdCgwKTtcbmNvbnN0IE9QRU5fQ1VSTFkgICAgICAgID0gICd7Jy5jaGFyQ29kZUF0KDApO1xuY29uc3QgQ0xPU0VfQ1VSTFkgICAgICAgPSAgJ30nLmNoYXJDb2RlQXQoMCk7XG5jb25zdCBTRU1JQ09MT04gICAgICAgICA9ICAnOycuY2hhckNvZGVBdCgwKTtcbmNvbnN0IEFTVEVSSVNLICAgICAgICAgID0gICcqJy5jaGFyQ29kZUF0KDApO1xuY29uc3QgQ09MT04gICAgICAgICAgICAgPSAgJzonLmNoYXJDb2RlQXQoMCk7XG5jb25zdCBBVCAgICAgICAgICAgICAgICA9ICAnQCcuY2hhckNvZGVBdCgwKTtcblxuY29uc3QgUkVfQVRfRU5EICAgICAgPSAvWyBcXG5cXHRcXHJcXGZcXHtcXChcXCknXCJcXFxcOy9cXFtcXF0jXS9nO1xuY29uc3QgUkVfV09SRF9FTkQgICAgPSAvWyBcXG5cXHRcXHJcXGZcXChcXClcXHtcXH06O0AhJ1wiXFxcXFxcXVxcWyNdfFxcLyg/PVxcKikvZztcbmNvbnN0IFJFX0JBRF9CUkFDS0VUID0gLy5bXFxcXFxcL1xcKFwiJ1xcbl0vO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0b2tlbml6ZShpbnB1dCwgb3B0aW9ucyA9IHsgfSkge1xuICAgIGxldCB0b2tlbnMgPSBbXTtcbiAgICBsZXQgY3NzICAgID0gaW5wdXQuY3NzLnZhbHVlT2YoKTtcblxuICAgIGxldCBpZ25vcmUgPSBvcHRpb25zLmlnbm9yZUVycm9ycztcblxuICAgIGxldCBjb2RlLCBuZXh0LCBxdW90ZSwgbGluZXMsIGxhc3QsIGNvbnRlbnQsIGVzY2FwZSxcbiAgICAgICAgbmV4dExpbmUsIG5leHRPZmZzZXQsIGVzY2FwZWQsIGVzY2FwZVBvcywgcHJldiwgbjtcblxuICAgIGxldCBsZW5ndGggPSBjc3MubGVuZ3RoO1xuICAgIGxldCBvZmZzZXQgPSAtMTtcbiAgICBsZXQgbGluZSAgID0gIDE7XG4gICAgbGV0IHBvcyAgICA9ICAwO1xuXG4gICAgZnVuY3Rpb24gdW5jbG9zZWQod2hhdCkge1xuICAgICAgICB0aHJvdyBpbnB1dC5lcnJvcignVW5jbG9zZWQgJyArIHdoYXQsIGxpbmUsIHBvcyAtIG9mZnNldCk7XG4gICAgfVxuXG4gICAgd2hpbGUgKCBwb3MgPCBsZW5ndGggKSB7XG4gICAgICAgIGNvZGUgPSBjc3MuY2hhckNvZGVBdChwb3MpO1xuXG4gICAgICAgIGlmICggY29kZSA9PT0gTkVXTElORSB8fCBjb2RlID09PSBGRUVEIHx8XG4gICAgICAgICAgICAgY29kZSA9PT0gQ1IgJiYgY3NzLmNoYXJDb2RlQXQocG9zICsgMSkgIT09IE5FV0xJTkUgKSB7XG4gICAgICAgICAgICBvZmZzZXQgPSBwb3M7XG4gICAgICAgICAgICBsaW5lICArPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoICggY29kZSApIHtcbiAgICAgICAgY2FzZSBORVdMSU5FOlxuICAgICAgICBjYXNlIFNQQUNFOlxuICAgICAgICBjYXNlIFRBQjpcbiAgICAgICAgY2FzZSBDUjpcbiAgICAgICAgY2FzZSBGRUVEOlxuICAgICAgICAgICAgbmV4dCA9IHBvcztcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBuZXh0ICs9IDE7XG4gICAgICAgICAgICAgICAgY29kZSA9IGNzcy5jaGFyQ29kZUF0KG5leHQpO1xuICAgICAgICAgICAgICAgIGlmICggY29kZSA9PT0gTkVXTElORSApIHtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbmV4dDtcbiAgICAgICAgICAgICAgICAgICAgbGluZSAgKz0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IHdoaWxlICggY29kZSA9PT0gU1BBQ0UgICB8fFxuICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPT09IE5FV0xJTkUgfHxcbiAgICAgICAgICAgICAgICAgICAgICBjb2RlID09PSBUQUIgICAgIHx8XG4gICAgICAgICAgICAgICAgICAgICAgY29kZSA9PT0gQ1IgICAgICB8fFxuICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPT09IEZFRUQgKTtcblxuICAgICAgICAgICAgdG9rZW5zLnB1c2goWydzcGFjZScsIGNzcy5zbGljZShwb3MsIG5leHQpXSk7XG4gICAgICAgICAgICBwb3MgPSBuZXh0IC0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgT1BFTl9TUVVBUkU6XG4gICAgICAgICAgICB0b2tlbnMucHVzaChbJ1snLCAnWycsIGxpbmUsIHBvcyAtIG9mZnNldF0pO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBDTE9TRV9TUVVBUkU6XG4gICAgICAgICAgICB0b2tlbnMucHVzaChbJ10nLCAnXScsIGxpbmUsIHBvcyAtIG9mZnNldF0pO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBPUEVOX0NVUkxZOlxuICAgICAgICAgICAgdG9rZW5zLnB1c2goWyd7JywgJ3snLCBsaW5lLCBwb3MgLSBvZmZzZXRdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgQ0xPU0VfQ1VSTFk6XG4gICAgICAgICAgICB0b2tlbnMucHVzaChbJ30nLCAnfScsIGxpbmUsIHBvcyAtIG9mZnNldF0pO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBDT0xPTjpcbiAgICAgICAgICAgIHRva2Vucy5wdXNoKFsnOicsICc6JywgbGluZSwgcG9zIC0gb2Zmc2V0XSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFNFTUlDT0xPTjpcbiAgICAgICAgICAgIHRva2Vucy5wdXNoKFsnOycsICc7JywgbGluZSwgcG9zIC0gb2Zmc2V0XSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIE9QRU5fUEFSRU5USEVTRVM6XG4gICAgICAgICAgICBwcmV2ID0gdG9rZW5zLmxlbmd0aCA/IHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV1bMV0gOiAnJztcbiAgICAgICAgICAgIG4gICAgPSBjc3MuY2hhckNvZGVBdChwb3MgKyAxKTtcbiAgICAgICAgICAgIGlmICggcHJldiA9PT0gJ3VybCcgJiYgbiAhPT0gU0lOR0xFX1FVT1RFICYmIG4gIT09IERPVUJMRV9RVU9URSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICE9PSBTUEFDRSAmJiBuICE9PSBORVdMSU5FICYmIG4gIT09IFRBQiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICE9PSBGRUVEICYmIG4gIT09IENSICkge1xuICAgICAgICAgICAgICAgIG5leHQgPSBwb3M7XG4gICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBlc2NhcGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIG5leHQgICAgPSBjc3MuaW5kZXhPZignKScsIG5leHQgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCBuZXh0ID09PSAtMSApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaWdub3JlICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBwb3M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuY2xvc2VkKCdicmFja2V0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZXNjYXBlUG9zID0gbmV4dDtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCBjc3MuY2hhckNvZGVBdChlc2NhcGVQb3MgLSAxKSA9PT0gQkFDS1NMQVNIICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlUG9zIC09IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IHdoaWxlICggZXNjYXBlZCApO1xuXG4gICAgICAgICAgICAgICAgdG9rZW5zLnB1c2goWydicmFja2V0cycsIGNzcy5zbGljZShwb3MsIG5leHQgKyAxKSxcbiAgICAgICAgICAgICAgICAgICAgbGluZSwgcG9zICAtIG9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgbGluZSwgbmV4dCAtIG9mZnNldFxuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIHBvcyA9IG5leHQ7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV4dCAgICA9IGNzcy5pbmRleE9mKCcpJywgcG9zICsgMSk7XG4gICAgICAgICAgICAgICAgY29udGVudCA9IGNzcy5zbGljZShwb3MsIG5leHQgKyAxKTtcblxuICAgICAgICAgICAgICAgIGlmICggbmV4dCA9PT0gLTEgfHwgUkVfQkFEX0JSQUNLRVQudGVzdChjb250ZW50KSApIHtcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zLnB1c2goWycoJywgJygnLCBsaW5lLCBwb3MgLSBvZmZzZXRdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0b2tlbnMucHVzaChbJ2JyYWNrZXRzJywgY29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUsIHBvcyAgLSBvZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lLCBuZXh0IC0gb2Zmc2V0XG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgICAgICBwb3MgPSBuZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBDTE9TRV9QQVJFTlRIRVNFUzpcbiAgICAgICAgICAgIHRva2Vucy5wdXNoKFsnKScsICcpJywgbGluZSwgcG9zIC0gb2Zmc2V0XSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFNJTkdMRV9RVU9URTpcbiAgICAgICAgY2FzZSBET1VCTEVfUVVPVEU6XG4gICAgICAgICAgICBxdW90ZSA9IGNvZGUgPT09IFNJTkdMRV9RVU9URSA/ICdcXCcnIDogJ1wiJztcbiAgICAgICAgICAgIG5leHQgID0gcG9zO1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIGVzY2FwZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBuZXh0ICAgID0gY3NzLmluZGV4T2YocXVvdGUsIG5leHQgKyAxKTtcbiAgICAgICAgICAgICAgICBpZiAoIG5leHQgPT09IC0xICkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIGlnbm9yZSApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBwb3MgKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmNsb3NlZCgnc3RyaW5nJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZXNjYXBlUG9zID0gbmV4dDtcbiAgICAgICAgICAgICAgICB3aGlsZSAoIGNzcy5jaGFyQ29kZUF0KGVzY2FwZVBvcyAtIDEpID09PSBCQUNLU0xBU0ggKSB7XG4gICAgICAgICAgICAgICAgICAgIGVzY2FwZVBvcyAtPSAxO1xuICAgICAgICAgICAgICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSB3aGlsZSAoIGVzY2FwZWQgKTtcblxuICAgICAgICAgICAgY29udGVudCA9IGNzcy5zbGljZShwb3MsIG5leHQgKyAxKTtcbiAgICAgICAgICAgIGxpbmVzICAgPSBjb250ZW50LnNwbGl0KCdcXG4nKTtcbiAgICAgICAgICAgIGxhc3QgICAgPSBsaW5lcy5sZW5ndGggLSAxO1xuXG4gICAgICAgICAgICBpZiAoIGxhc3QgPiAwICkge1xuICAgICAgICAgICAgICAgIG5leHRMaW5lICAgPSBsaW5lICsgbGFzdDtcbiAgICAgICAgICAgICAgICBuZXh0T2Zmc2V0ID0gbmV4dCAtIGxpbmVzW2xhc3RdLmxlbmd0aDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV4dExpbmUgICA9IGxpbmU7XG4gICAgICAgICAgICAgICAgbmV4dE9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdG9rZW5zLnB1c2goWydzdHJpbmcnLCBjc3Muc2xpY2UocG9zLCBuZXh0ICsgMSksXG4gICAgICAgICAgICAgICAgbGluZSwgcG9zICAtIG9mZnNldCxcbiAgICAgICAgICAgICAgICBuZXh0TGluZSwgbmV4dCAtIG5leHRPZmZzZXRcbiAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICBvZmZzZXQgPSBuZXh0T2Zmc2V0O1xuICAgICAgICAgICAgbGluZSAgID0gbmV4dExpbmU7XG4gICAgICAgICAgICBwb3MgICAgPSBuZXh0O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBBVDpcbiAgICAgICAgICAgIFJFX0FUX0VORC5sYXN0SW5kZXggPSBwb3MgKyAxO1xuICAgICAgICAgICAgUkVfQVRfRU5ELnRlc3QoY3NzKTtcbiAgICAgICAgICAgIGlmICggUkVfQVRfRU5ELmxhc3RJbmRleCA9PT0gMCApIHtcbiAgICAgICAgICAgICAgICBuZXh0ID0gY3NzLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5leHQgPSBSRV9BVF9FTkQubGFzdEluZGV4IC0gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRva2Vucy5wdXNoKFsnYXQtd29yZCcsIGNzcy5zbGljZShwb3MsIG5leHQgKyAxKSxcbiAgICAgICAgICAgICAgICBsaW5lLCBwb3MgIC0gb2Zmc2V0LFxuICAgICAgICAgICAgICAgIGxpbmUsIG5leHQgLSBvZmZzZXRcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgcG9zID0gbmV4dDtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgQkFDS1NMQVNIOlxuICAgICAgICAgICAgbmV4dCAgID0gcG9zO1xuICAgICAgICAgICAgZXNjYXBlID0gdHJ1ZTtcbiAgICAgICAgICAgIHdoaWxlICggY3NzLmNoYXJDb2RlQXQobmV4dCArIDEpID09PSBCQUNLU0xBU0ggKSB7XG4gICAgICAgICAgICAgICAgbmV4dCAgKz0gMTtcbiAgICAgICAgICAgICAgICBlc2NhcGUgPSAhZXNjYXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29kZSA9IGNzcy5jaGFyQ29kZUF0KG5leHQgKyAxKTtcbiAgICAgICAgICAgIGlmICggZXNjYXBlICYmIChjb2RlICE9PSBTTEFTSCAgICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSAhPT0gU1BBQ0UgICAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgIT09IE5FV0xJTkUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlICE9PSBUQUIgICAgICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSAhPT0gQ1IgICAgICAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgIT09IEZFRUQgKSApIHtcbiAgICAgICAgICAgICAgICBuZXh0ICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0b2tlbnMucHVzaChbJ3dvcmQnLCBjc3Muc2xpY2UocG9zLCBuZXh0ICsgMSksXG4gICAgICAgICAgICAgICAgbGluZSwgcG9zICAtIG9mZnNldCxcbiAgICAgICAgICAgICAgICBsaW5lLCBuZXh0IC0gb2Zmc2V0XG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIHBvcyA9IG5leHQ7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgaWYgKCBjb2RlID09PSBTTEFTSCAmJiBjc3MuY2hhckNvZGVBdChwb3MgKyAxKSA9PT0gQVNURVJJU0sgKSB7XG4gICAgICAgICAgICAgICAgbmV4dCA9IGNzcy5pbmRleE9mKCcqLycsIHBvcyArIDIpICsgMTtcbiAgICAgICAgICAgICAgICBpZiAoIG5leHQgPT09IDAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICggaWdub3JlICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IGNzcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmNsb3NlZCgnY29tbWVudCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29udGVudCA9IGNzcy5zbGljZShwb3MsIG5leHQgKyAxKTtcbiAgICAgICAgICAgICAgICBsaW5lcyAgID0gY29udGVudC5zcGxpdCgnXFxuJyk7XG4gICAgICAgICAgICAgICAgbGFzdCAgICA9IGxpbmVzLmxlbmd0aCAtIDE7XG5cbiAgICAgICAgICAgICAgICBpZiAoIGxhc3QgPiAwICkge1xuICAgICAgICAgICAgICAgICAgICBuZXh0TGluZSAgID0gbGluZSArIGxhc3Q7XG4gICAgICAgICAgICAgICAgICAgIG5leHRPZmZzZXQgPSBuZXh0IC0gbGluZXNbbGFzdF0ubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHRMaW5lICAgPSBsaW5lO1xuICAgICAgICAgICAgICAgICAgICBuZXh0T2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKFsnY29tbWVudCcsIGNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgIGxpbmUsICAgICBwb3MgIC0gb2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICBuZXh0TGluZSwgbmV4dCAtIG5leHRPZmZzZXRcbiAgICAgICAgICAgICAgICBdKTtcblxuICAgICAgICAgICAgICAgIG9mZnNldCA9IG5leHRPZmZzZXQ7XG4gICAgICAgICAgICAgICAgbGluZSAgID0gbmV4dExpbmU7XG4gICAgICAgICAgICAgICAgcG9zICAgID0gbmV4dDtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBSRV9XT1JEX0VORC5sYXN0SW5kZXggPSBwb3MgKyAxO1xuICAgICAgICAgICAgICAgIFJFX1dPUkRfRU5ELnRlc3QoY3NzKTtcbiAgICAgICAgICAgICAgICBpZiAoIFJFX1dPUkRfRU5ELmxhc3RJbmRleCA9PT0gMCApIHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dCA9IGNzcy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHQgPSBSRV9XT1JEX0VORC5sYXN0SW5kZXggLSAyO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKFsnd29yZCcsIGNzcy5zbGljZShwb3MsIG5leHQgKyAxKSxcbiAgICAgICAgICAgICAgICAgICAgbGluZSwgcG9zICAtIG9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgbGluZSwgbmV4dCAtIG9mZnNldFxuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIHBvcyA9IG5leHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcG9zKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRva2Vucztcbn1cbiJdfQ==