You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

611 lines
55 KiB

4 years ago
  1. "use strict";
  2. exports.__esModule = true;
  3. exports.default = void 0;
  4. var _declaration = _interopRequireDefault(require("./declaration"));
  5. var _tokenize = _interopRequireDefault(require("./tokenize"));
  6. var _comment = _interopRequireDefault(require("./comment"));
  7. var _atRule = _interopRequireDefault(require("./at-rule"));
  8. var _root = _interopRequireDefault(require("./root"));
  9. var _rule = _interopRequireDefault(require("./rule"));
  10. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  11. var Parser =
  12. /*#__PURE__*/
  13. function () {
  14. function Parser(input) {
  15. this.input = input;
  16. this.root = new _root.default();
  17. this.current = this.root;
  18. this.spaces = '';
  19. this.semicolon = false;
  20. this.createTokenizer();
  21. this.root.source = {
  22. input: input,
  23. start: {
  24. line: 1,
  25. column: 1
  26. }
  27. };
  28. }
  29. var _proto = Parser.prototype;
  30. _proto.createTokenizer = function createTokenizer() {
  31. this.tokenizer = (0, _tokenize.default)(this.input);
  32. };
  33. _proto.parse = function parse() {
  34. var token;
  35. while (!this.tokenizer.endOfFile()) {
  36. token = this.tokenizer.nextToken();
  37. switch (token[0]) {
  38. case 'space':
  39. this.spaces += token[1];
  40. break;
  41. case ';':
  42. this.freeSemicolon(token);
  43. break;
  44. case '}':
  45. this.end(token);
  46. break;
  47. case 'comment':
  48. this.comment(token);
  49. break;
  50. case 'at-word':
  51. this.atrule(token);
  52. break;
  53. case '{':
  54. this.emptyRule(token);
  55. break;
  56. default:
  57. this.other(token);
  58. break;
  59. }
  60. }
  61. this.endFile();
  62. };
  63. _proto.comment = function comment(token) {
  64. var node = new _comment.default();
  65. this.init(node, token[2], token[3]);
  66. node.source.end = {
  67. line: token[4],
  68. column: token[5]
  69. };
  70. var text = token[1].slice(2, -2);
  71. if (/^\s*$/.test(text)) {
  72. node.text = '';
  73. node.raws.left = text;
  74. node.raws.right = '';
  75. } else {
  76. var match = text.match(/^(\s*)([^]*[^\s])(\s*)$/);
  77. node.text = match[2];
  78. node.raws.left = match[1];
  79. node.raws.right = match[3];
  80. }
  81. };
  82. _proto.emptyRule = function emptyRule(token) {
  83. var node = new _rule.default();
  84. this.init(node, token[2], token[3]);
  85. node.selector = '';
  86. node.raws.between = '';
  87. this.current = node;
  88. };
  89. _proto.other = function other(start) {
  90. var end = false;
  91. var type = null;
  92. var colon = false;
  93. var bracket = null;
  94. var brackets = [];
  95. var tokens = [];
  96. var token = start;
  97. while (token) {
  98. type = token[0];
  99. tokens.push(token);
  100. if (type === '(' || type === '[') {
  101. if (!bracket) bracket = token;
  102. brackets.push(type === '(' ? ')' : ']');
  103. } else if (brackets.length === 0) {
  104. if (type === ';') {
  105. if (colon) {
  106. this.decl(tokens);
  107. return;
  108. } else {
  109. break;
  110. }
  111. } else if (type === '{') {
  112. this.rule(tokens);
  113. return;
  114. } else if (type === '}') {
  115. this.tokenizer.back(tokens.pop());
  116. end = true;
  117. break;
  118. } else if (type === ':') {
  119. colon = true;
  120. }
  121. } else if (type === brackets[brackets.length - 1]) {
  122. brackets.pop();
  123. if (brackets.length === 0) bracket = null;
  124. }
  125. token = this.tokenizer.nextToken();
  126. }
  127. if (this.tokenizer.endOfFile()) end = true;
  128. if (brackets.length > 0) this.unclosedBracket(bracket);
  129. if (end && colon) {
  130. while (tokens.length) {
  131. token = tokens[tokens.length - 1][0];
  132. if (token !== 'space' && token !== 'comment') break;
  133. this.tokenizer.back(tokens.pop());
  134. }
  135. this.decl(tokens);
  136. } else {
  137. this.unknownWord(tokens);
  138. }
  139. };
  140. _proto.rule = function rule(tokens) {
  141. tokens.pop();
  142. var node = new _rule.default();
  143. this.init(node, tokens[0][2], tokens[0][3]);
  144. node.raws.between = this.spacesAndCommentsFromEnd(tokens);
  145. this.raw(node, 'selector', tokens);
  146. this.current = node;
  147. };
  148. _proto.decl = function decl(tokens) {
  149. var node = new _declaration.default();
  150. this.init(node);
  151. var last = tokens[tokens.length - 1];
  152. if (last[0] === ';') {
  153. this.semicolon = true;
  154. tokens.pop();
  155. }
  156. if (last[4]) {
  157. node.source.end = {
  158. line: last[4],
  159. column: last[5]
  160. };
  161. } else {
  162. node.source.end = {
  163. line: last[2],
  164. column: last[3]
  165. };
  166. }
  167. while (tokens[0][0] !== 'word') {
  168. if (tokens.length === 1) this.unknownWord(tokens);
  169. node.raws.before += tokens.shift()[1];
  170. }
  171. node.source.start = {
  172. line: tokens[0][2],
  173. column: tokens[0][3]
  174. };
  175. node.prop = '';
  176. while (tokens.length) {
  177. var type = tokens[0][0];
  178. if (type === ':' || type === 'space' || type === 'comment') {
  179. break;
  180. }
  181. node.prop += tokens.shift()[1];
  182. }
  183. node.raws.between = '';
  184. var token;
  185. while (tokens.length) {
  186. token = tokens.shift();
  187. if (token[0] === ':') {
  188. node.raws.between += token[1];
  189. break;
  190. } else {
  191. if (token[0] === 'word' && /\w/.test(token[1])) {
  192. this.unknownWord([token]);
  193. }
  194. node.raws.between += token[1];
  195. }
  196. }
  197. if (node.prop[0] === '_' || node.prop[0] === '*') {
  198. node.raws.before += node.prop[0];
  199. node.prop = node.prop.slice(1);
  200. }
  201. node.raws.between += this.spacesAndCommentsFromStart(tokens);
  202. this.precheckMissedSemicolon(tokens);
  203. for (var i = tokens.length - 1; i > 0; i--) {
  204. token = tokens[i];
  205. if (token[1].toLowerCase() === '!important') {
  206. node.important = true;
  207. var string = this.stringFrom(tokens, i);
  208. string = this.spacesFromEnd(tokens) + string;
  209. if (string !== ' !important') node.raws.important = string;
  210. break;
  211. } else if (token[1].toLowerCase() === 'important') {
  212. var cache = tokens.slice(0);
  213. var str = '';
  214. for (var j = i; j > 0; j--) {
  215. var _type = cache[j][0];
  216. if (str.trim().indexOf('!') === 0 && _type !== 'space') {
  217. break;
  218. }
  219. str = cache.pop()[1] + str;
  220. }
  221. if (str.trim().indexOf('!') === 0) {
  222. node.important = true;
  223. node.raws.important = str;
  224. tokens = cache;
  225. }
  226. }
  227. if (token[0] !== 'space' && token[0] !== 'comment') {
  228. break;
  229. }
  230. }
  231. this.raw(node, 'value', tokens);
  232. if (node.value.indexOf(':') !== -1) this.checkMissedSemicolon(tokens);
  233. };
  234. _proto.atrule = function atrule(token) {
  235. var node = new _atRule.default();
  236. node.name = token[1].slice(1);
  237. if (node.name === '') {
  238. this.unnamedAtrule(node, token);
  239. }
  240. this.init(node, token[2], token[3]);
  241. var prev;
  242. var shift;
  243. var last = false;
  244. var open = false;
  245. var params = [];
  246. while (!this.tokenizer.endOfFile()) {
  247. token = this.tokenizer.nextToken();
  248. if (token[0] === ';') {
  249. node.source.end = {
  250. line: token[2],
  251. column: token[3]
  252. };
  253. this.semicolon = true;
  254. break;
  255. } else if (token[0] === '{') {
  256. open = true;
  257. break;
  258. } else if (token[0] === '}') {
  259. if (params.length > 0) {
  260. shift = params.length - 1;
  261. prev = params[shift];
  262. while (prev && prev[0] === 'space') {
  263. prev = params[--shift];
  264. }
  265. if (prev) {
  266. node.source.end = {
  267. line: prev[4],
  268. column: prev[5]
  269. };
  270. }
  271. }
  272. this.end(token);
  273. break;
  274. } else {
  275. params.push(token);
  276. }
  277. if (this.tokenizer.endOfFile()) {
  278. last = true;
  279. break;
  280. }
  281. }
  282. node.raws.between = this.spacesAndCommentsFromEnd(params);
  283. if (params.length) {
  284. node.raws.afterName = this.spacesAndCommentsFromStart(params);
  285. this.raw(node, 'params', params);
  286. if (last) {
  287. token = params[params.length - 1];
  288. node.source.end = {
  289. line: token[4],
  290. column: token[5]
  291. };
  292. this.spaces = node.raws.between;
  293. node.raws.between = '';
  294. }
  295. } else {
  296. node.raws.afterName = '';
  297. node.params = '';
  298. }
  299. if (open) {
  300. node.nodes = [];
  301. this.current = node;
  302. }
  303. };
  304. _proto.end = function end(token) {
  305. if (this.current.nodes && this.current.nodes.length) {
  306. this.current.raws.semicolon = this.semicolon;
  307. }
  308. this.semicolon = false;
  309. this.current.raws.after = (this.current.raws.after || '') + this.spaces;
  310. this.spaces = '';
  311. if (this.current.parent) {
  312. this.current.source.end = {
  313. line: token[2],
  314. column: token[3]
  315. };
  316. this.current = this.current.parent;
  317. } else {
  318. this.unexpectedClose(token);
  319. }
  320. };
  321. _proto.endFile = function endFile() {
  322. if (this.current.parent) this.unclosedBlock();
  323. if (this.current.nodes && this.current.nodes.length) {
  324. this.current.raws.semicolon = this.semicolon;
  325. }
  326. this.current.raws.after = (this.current.raws.after || '') + this.spaces;
  327. };
  328. _proto.freeSemicolon = function freeSemicolon(token) {
  329. this.spaces += token[1];
  330. if (this.current.nodes) {
  331. var prev = this.current.nodes[this.current.nodes.length - 1];
  332. if (prev && prev.type === 'rule' && !prev.raws.ownSemicolon) {
  333. prev.raws.ownSemicolon = this.spaces;
  334. this.spaces = '';
  335. }
  336. }
  337. } // Helpers
  338. ;
  339. _proto.init = function init(node, line, column) {
  340. this.current.push(node);
  341. node.source = {
  342. start: {
  343. line: line,
  344. column: column
  345. },
  346. input: this.input
  347. };
  348. node.raws.before = this.spaces;
  349. this.spaces = '';
  350. if (node.type !== 'comment') this.semicolon = false;
  351. };
  352. _proto.raw = function raw(node, prop, tokens) {
  353. var token, type;
  354. var length = tokens.length;
  355. var value = '';
  356. var clean = true;
  357. var next, prev;
  358. var pattern = /^([.|#])?([\w])+/i;
  359. for (var i = 0; i < length; i += 1) {
  360. token = tokens[i];
  361. type = token[0];
  362. if (type === 'comment' && node.type === 'rule') {
  363. prev = tokens[i - 1];
  364. next = tokens[i + 1];
  365. if (prev[0] !== 'space' && next[0] !== 'space' && pattern.test(prev[1]) && pattern.test(next[1])) {
  366. value += token[1];
  367. } else {
  368. clean = false;
  369. }
  370. continue;
  371. }
  372. if (type === 'comment' || type === 'space' && i === length - 1) {
  373. clean = false;
  374. } else {
  375. value += token[1];
  376. }
  377. }
  378. if (!clean) {
  379. var raw = tokens.reduce(function (all, i) {
  380. return all + i[1];
  381. }, '');
  382. node.raws[prop] = {
  383. value: value,
  384. raw: raw
  385. };
  386. }
  387. node[prop] = value;
  388. };
  389. _proto.spacesAndCommentsFromEnd = function spacesAndCommentsFromEnd(tokens) {
  390. var lastTokenType;
  391. var spaces = '';
  392. while (tokens.length) {
  393. lastTokenType = tokens[tokens.length - 1][0];
  394. if (lastTokenType !== 'space' && lastTokenType !== 'comment') break;
  395. spaces = tokens.pop()[1] + spaces;
  396. }
  397. return spaces;
  398. };
  399. _proto.spacesAndCommentsFromStart = function spacesAndCommentsFromStart(tokens) {
  400. var next;
  401. var spaces = '';
  402. while (tokens.length) {
  403. next = tokens[0][0];
  404. if (next !== 'space' && next !== 'comment') break;
  405. spaces += tokens.shift()[1];
  406. }
  407. return spaces;
  408. };
  409. _proto.spacesFromEnd = function spacesFromEnd(tokens) {
  410. var lastTokenType;
  411. var spaces = '';
  412. while (tokens.length) {
  413. lastTokenType = tokens[tokens.length - 1][0];
  414. if (lastTokenType !== 'space') break;
  415. spaces = tokens.pop()[1] + spaces;
  416. }
  417. return spaces;
  418. };
  419. _proto.stringFrom = function stringFrom(tokens, from) {
  420. var result = '';
  421. for (var i = from; i < tokens.length; i++) {
  422. result += tokens[i][1];
  423. }
  424. tokens.splice(from, tokens.length - from);
  425. return result;
  426. };
  427. _proto.colon = function colon(tokens) {
  428. var brackets = 0;
  429. var token, type, prev;
  430. for (var i = 0; i < tokens.length; i++) {
  431. token = tokens[i];
  432. type = token[0];
  433. if (type === '(') {
  434. brackets += 1;
  435. }
  436. if (type === ')') {
  437. brackets -= 1;
  438. }
  439. if (brackets === 0 && type === ':') {
  440. if (!prev) {
  441. this.doubleColon(token);
  442. } else if (prev[0] === 'word' && prev[1] === 'progid') {
  443. continue;
  444. } else {
  445. return i;
  446. }
  447. }
  448. prev = token;
  449. }
  450. return false;
  451. } // Errors
  452. ;
  453. _proto.unclosedBracket = function unclosedBracket(bracket) {
  454. throw this.input.error('Unclosed bracket', bracket[2], bracket[3]);
  455. };
  456. _proto.unknownWord = function unknownWord(tokens) {
  457. throw this.input.error('Unknown word', tokens[0][2], tokens[0][3]);
  458. };
  459. _proto.unexpectedClose = function unexpectedClose(token) {
  460. throw this.input.error('Unexpected }', token[2], token[3]);
  461. };
  462. _proto.unclosedBlock = function unclosedBlock() {
  463. var pos = this.current.source.start;
  464. throw this.input.error('Unclosed block', pos.line, pos.column);
  465. };
  466. _proto.doubleColon = function doubleColon(token) {
  467. throw this.input.error('Double colon', token[2], token[3]);
  468. };
  469. _proto.unnamedAtrule = function unnamedAtrule(node, token) {
  470. throw this.input.error('At-rule without name', token[2], token[3]);
  471. };
  472. _proto.precheckMissedSemicolon = function precheckMissedSemicolon()
  473. /* tokens */
  474. {// Hook for Safe Parser
  475. };
  476. _proto.checkMissedSemicolon = function checkMissedSemicolon(tokens) {
  477. var colon = this.colon(tokens);
  478. if (colon === false) return;
  479. var founded = 0;
  480. var token;
  481. for (var j = colon - 1; j >= 0; j--) {
  482. token = tokens[j];
  483. if (token[0] !== 'space') {
  484. founded += 1;
  485. if (founded === 2) break;
  486. }
  487. }
  488. throw this.input.error('Missed semicolon', token[2], token[3]);
  489. };
  490. return Parser;
  491. }();
  492. exports.default = Parser;
  493. module.exports = exports.default;
  494. //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInBhcnNlci5lczYiXSwibmFtZXMiOlsiUGFyc2VyIiwiaW5wdXQiLCJyb290IiwiUm9vdCIsImN1cnJlbnQiLCJzcGFjZXMiLCJzZW1pY29sb24iLCJjcmVhdGVUb2tlbml6ZXIiLCJzb3VyY2UiLCJzdGFydCIsImxpbmUiLCJjb2x1bW4iLCJ0b2tlbml6ZXIiLCJwYXJzZSIsInRva2VuIiwiZW5kT2ZGaWxlIiwibmV4dFRva2VuIiwiZnJlZVNlbWljb2xvbiIsImVuZCIsImNvbW1lbnQiLCJhdHJ1bGUiLCJlbXB0eVJ1bGUiLCJvdGhlciIsImVuZEZpbGUiLCJub2RlIiwiQ29tbWVudCIsImluaXQiLCJ0ZXh0Iiwic2xpY2UiLCJ0ZXN0IiwicmF3cyIsImxlZnQiLCJyaWdodCIsIm1hdGNoIiwiUnVsZSIsInNlbGVjdG9yIiwiYmV0d2VlbiIsInR5cGUiLCJjb2xvbiIsImJyYWNrZXQiLCJicmFja2V0cyIsInRva2VucyIsInB1c2giLCJsZW5ndGgiLCJkZWNsIiwicnVsZSIsImJhY2siLCJwb3AiLCJ1bmNsb3NlZEJyYWNrZXQiLCJ1bmtub3duV29yZCIsInNwYWNlc0FuZENvbW1lbnRzRnJvbUVuZCIsInJhdyIsIkRlY2xhcmF0aW9uIiwibGFzdCIsImJlZm9yZSIsInNoaWZ0IiwicHJvcCIsInNwYWNlc0FuZENvbW1lbnRzRnJvbVN0YXJ0IiwicHJlY2hlY2tNaXNzZWRTZW1pY29sb24iLCJpIiwidG9Mb3dlckNhc2UiLCJpbXBvcnRhbnQiLCJzdHJpbmciLCJzdHJpbmdGcm9tIiwic3BhY2VzRnJvbUVuZCIsImNhY2hlIiwic3RyIiwiaiIsInRyaW0iLCJpbmRleE9mIiwidmFsdWUiLCJjaGVja01pc3NlZFNlbWljb2xvbiIsIkF0UnVsZSIsIm5hbWUiLCJ1bm5hbWVkQXRydWxlIiwicHJldiIsIm9wZW4iLCJwYXJhbXMiLCJhZnRlck5hbWUiLCJub2RlcyIsImFmdGVyIiwicGFyZW50IiwidW5leHBlY3RlZENsb3NlIiwidW5jbG9zZWRCbG9jayIsIm93blNlbWljb2xvbiIsImNsZWFuIiwibmV4dCIsInBhdHRlcm4iLCJyZWR1Y2UiLCJhbGwiLCJsYXN0VG9rZW5UeXBlIiwiZnJvbSIsInJlc3VsdCIsInNwbGljZSIsImRvdWJsZUNvbG9uIiwiZXJyb3IiLCJwb3MiLCJmb3VuZGVkIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0lBRXFCQSxNOzs7QUFDbkIsa0JBQWFDLEtBQWIsRUFBb0I7QUFDbEIsU0FBS0EsS0FBTCxHQUFhQSxLQUFiO0FBRUEsU0FBS0MsSUFBTCxHQUFZLElBQUlDLGFBQUosRUFBWjtBQUNBLFNBQUtDLE9BQUwsR0FBZSxLQUFLRixJQUFwQjtBQUNBLFNBQUtHLE1BQUwsR0FBYyxFQUFkO0FBQ0EsU0FBS0MsU0FBTCxHQUFpQixLQUFqQjtBQUVBLFNBQUtDLGVBQUw7QUFDQSxTQUFLTCxJQUFMLENBQVVNLE1BQVYsR0FBbUI7QUFBRVAsTUFBQUEsS0FBSyxFQUFMQSxLQUFGO0FBQVNRLE1BQUFBLEtBQUssRUFBRTtBQUFFQyxRQUFBQSxJQUFJLEVBQUUsQ0FBUjtBQUFXQyxRQUFBQSxNQUFNLEVBQUU7QUFBbkI7QUFBaEIsS0FBbkI7QUFDRDs7OztTQUVESixlLEdBQUEsMkJBQW1CO0FBQ2pCLFNBQUtLLFNBQUwsR0FBaUIsdUJBQVUsS0FBS1gsS0FBZixDQUFqQjtBQUNELEc7O1NBRURZLEssR0FBQSxpQkFBUztBQUNQLFFBQUlDLEtBQUo7O0FBQ0EsV0FBTyxDQUFDLEtBQUtGLFNBQUwsQ0FBZUcsU0FBZixFQUFSLEVBQW9DO0FBQ2xDRCxNQUFBQSxLQUFLLEdBQUcsS0FBS0YsU0FBTCxDQUFlSSxTQUFmLEVBQVI7O0FBRUEsY0FBUUYsS0FBSyxDQUFDLENBQUQsQ0FBYjtBQUNFLGFBQUssT0FBTDtBQUNFLGVBQUtULE1BQUwsSUFBZVMsS0FBSyxDQUFDLENBQUQsQ0FBcEI7QUFDQTs7QUFFRixhQUFLLEdBQUw7QUFDRSxlQUFLRyxhQUFMLENBQW1CSCxLQUFuQjtBQUNBOztBQUVGLGFBQUssR0FBTDtBQUNFLGVBQUtJLEdBQUwsQ0FBU0osS0FBVDtBQUNBOztBQUVGLGFBQUssU0FBTDtBQUNFLGVBQUtLLE9BQUwsQ0FBYUwsS0FBYjtBQUNBOztBQUVGLGFBQUssU0FBTDtBQUNFLGVBQUtNLE1BQUwsQ0FBWU4sS0FBWjtBQUNBOztBQUVGLGFBQUssR0FBTDtBQUNFLGVBQUtPLFNBQUwsQ0FBZVAsS0FBZjtBQUNBOztBQUVGO0FBQ0UsZUFBS1EsS0FBTCxDQUFXUixLQUFYO0FBQ0E7QUEzQko7QUE2QkQ7O0FBQ0QsU0FBS1MsT0FBTDtBQUNELEc7O1NBRURKLE8sR0FBQSxpQkFBU0wsS0FBVCxFQUFnQjtBQUNkLFFBQUlVLElBQUksR0FBRyxJQUFJQyxnQkFBSixFQUFYO0FBQ0EsU0FBS0MsSUFBTCxDQUFVRixJQUFWLEVBQWdCVixLQUFLLENBQUMsQ0FBRCxDQUFyQixFQUEwQkEsS0FBSyxDQUFDLENBQUQsQ0FBL0I7QUFDQVUsSUFBQUEsSUFBSSxDQUFDaEIsTUFBTCxDQUFZVSxHQUFaLEdBQWtCO0FBQUVSLE1BQUFBLElBQUksRUFBRUksS0FBSyxDQUFDLENBQUQsQ0FBYjtBQUFrQkgsTUFBQUEsTUFBTSxFQUFFRyxLQUFLLENBQUMsQ0FBRDtBQUEvQixLQUFsQjtBQUVBLFFBQUlhLElBQUksR0FBR2IsS0FBSyxDQUFDLENBQUQsQ0FBTCxDQUFTYyxLQUFULENBQWUsQ0FBZixFQUFrQixDQUFDLENBQW5CLENBQVg7O0FBQ0EsUUFBSSxRQUFRQyxJQUFSLENBQWFGLElBQWIsQ0FBSixFQUF3QjtBQUN0QkgsTUFBQUEsSUFBSSxDQUFDRyxJQUFMLEdBQVksRUFBWjtBQUNBSCxNQUFBQSxJQUFJLENBQUNNLElBQUwsQ0FBVUMsSUFBVixHQUFpQkosSUFBakI7QUFDQUgsTUFBQUEsSUFBSSxDQUFDTSxJQUFMLENBQVVFLEtBQVYsR0FBa0IsRUFBbEI7QUFDRCxLQUpELE1BSU87QUFDTCxVQUFJQyxLQUFLLEdBQUdOLElBQUksQ0FBQ00sS0FBTCxDQUFXLHlCQUFYLENBQVo7QUFDQVQsTUFBQUEsSUFBSSxDQUFDRyxJQUFMLEdBQVlNLEtBQUssQ0FBQyxDQUFELENBQWpCO0FBQ0FULE1BQUFBLElBQUksQ0FBQ00sSUFBTCxDQUFVQyxJQUFWLEdBQWlCRSxLQUFLLENBQUMsQ0FBRCxDQUF0QjtBQUNBVCxNQUFBQSxJQUFJLENBQUNNLElBQUwsQ0FBVUUsS0FBVixHQUFrQkMsS0FBSyxDQUFDLENBQUQsQ0FBdkI7QUFDRDtBQUNGLEc7O1NBRURaLFMsR0FBQSxtQkFBV1AsS0FBWCxFQUFrQjtBQUNoQixRQUFJVSxJQUFJLEdBQUcsSUFBSVUsYUFBSixFQUFYO0FBQ0EsU0FBS1IsSUFBTCxDQUFVRixJQUFWLEVBQWdCVixLQUFLLENBQUMsQ0FBRCxD