previous-map.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. 'use strict';
  2. exports.__esModule = true;
  3. 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; };
  4. var _jsBase = require('js-base64');
  5. var _sourceMap = require('source-map');
  6. var _sourceMap2 = _interopRequireDefault(_sourceMap);
  7. var _path = require('path');
  8. var _path2 = _interopRequireDefault(_path);
  9. var _fs = require('fs');
  10. var _fs2 = _interopRequireDefault(_fs);
  11. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  12. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  13. /**
  14. * Source map information from input CSS.
  15. * For example, source map after Sass compiler.
  16. *
  17. * This class will automatically find source map in input CSS or in file system
  18. * near input file (according `from` option).
  19. *
  20. * @example
  21. * const root = postcss.parse(css, { from: 'a.sass.css' });
  22. * root.input.map //=> PreviousMap
  23. */
  24. var PreviousMap = function () {
  25. /**
  26. * @param {string} css - input CSS source
  27. * @param {processOptions} [opts] - {@link Processor#process} options
  28. */
  29. function PreviousMap(css, opts) {
  30. _classCallCheck(this, PreviousMap);
  31. this.loadAnnotation(css);
  32. /**
  33. * @member {boolean} - Was source map inlined by data-uri to input CSS.
  34. */
  35. this.inline = this.startWith(this.annotation, 'data:');
  36. var prev = opts.map ? opts.map.prev : undefined;
  37. var text = this.loadMap(opts.from, prev);
  38. if (text) this.text = text;
  39. }
  40. /**
  41. * Create a instance of `SourceMapGenerator` class
  42. * from the `source-map` library to work with source map information.
  43. *
  44. * It is lazy method, so it will create object only on first call
  45. * and then it will use cache.
  46. *
  47. * @return {SourceMapGenerator} object with source map information
  48. */
  49. PreviousMap.prototype.consumer = function consumer() {
  50. if (!this.consumerCache) {
  51. this.consumerCache = new _sourceMap2.default.SourceMapConsumer(this.text);
  52. }
  53. return this.consumerCache;
  54. };
  55. /**
  56. * Does source map contains `sourcesContent` with input source text.
  57. *
  58. * @return {boolean} Is `sourcesContent` present
  59. */
  60. PreviousMap.prototype.withContent = function withContent() {
  61. return !!(this.consumer().sourcesContent && this.consumer().sourcesContent.length > 0);
  62. };
  63. PreviousMap.prototype.startWith = function startWith(string, start) {
  64. if (!string) return false;
  65. return string.substr(0, start.length) === start;
  66. };
  67. PreviousMap.prototype.loadAnnotation = function loadAnnotation(css) {
  68. var match = css.match(/\/\*\s*# sourceMappingURL=(.*)\s*\*\//);
  69. if (match) this.annotation = match[1].trim();
  70. };
  71. PreviousMap.prototype.decodeInline = function decodeInline(text) {
  72. var utfd64 = 'data:application/json;charset=utf-8;base64,';
  73. var utf64 = 'data:application/json;charset=utf8;base64,';
  74. var b64 = 'data:application/json;base64,';
  75. var uri = 'data:application/json,';
  76. if (this.startWith(text, uri)) {
  77. return decodeURIComponent(text.substr(uri.length));
  78. } else if (this.startWith(text, b64)) {
  79. return _jsBase.Base64.decode(text.substr(b64.length));
  80. } else if (this.startWith(text, utf64)) {
  81. return _jsBase.Base64.decode(text.substr(utf64.length));
  82. } else if (this.startWith(text, utfd64)) {
  83. return _jsBase.Base64.decode(text.substr(utfd64.length));
  84. } else {
  85. var encoding = text.match(/data:application\/json;([^,]+),/)[1];
  86. throw new Error('Unsupported source map encoding ' + encoding);
  87. }
  88. };
  89. PreviousMap.prototype.loadMap = function loadMap(file, prev) {
  90. if (prev === false) return false;
  91. if (prev) {
  92. if (typeof prev === 'string') {
  93. return prev;
  94. } else if (typeof prev === 'function') {
  95. var prevPath = prev(file);
  96. if (prevPath && _fs2.default.existsSync && _fs2.default.existsSync(prevPath)) {
  97. return _fs2.default.readFileSync(prevPath, 'utf-8').toString().trim();
  98. } else {
  99. throw new Error('Unable to load previous source map: ' + prevPath.toString());
  100. }
  101. } else if (prev instanceof _sourceMap2.default.SourceMapConsumer) {
  102. return _sourceMap2.default.SourceMapGenerator.fromSourceMap(prev).toString();
  103. } else if (prev instanceof _sourceMap2.default.SourceMapGenerator) {
  104. return prev.toString();
  105. } else if (this.isMap(prev)) {
  106. return JSON.stringify(prev);
  107. } else {
  108. throw new Error('Unsupported previous source map format: ' + prev.toString());
  109. }
  110. } else if (this.inline) {
  111. return this.decodeInline(this.annotation);
  112. } else if (this.annotation) {
  113. var map = this.annotation;
  114. if (file) map = _path2.default.join(_path2.default.dirname(file), map);
  115. this.root = _path2.default.dirname(map);
  116. if (_fs2.default.existsSync && _fs2.default.existsSync(map)) {
  117. return _fs2.default.readFileSync(map, 'utf-8').toString().trim();
  118. } else {
  119. return false;
  120. }
  121. }
  122. };
  123. PreviousMap.prototype.isMap = function isMap(map) {
  124. if ((typeof map === 'undefined' ? 'undefined' : _typeof(map)) !== 'object') return false;
  125. return typeof map.mappings === 'string' || typeof map._mappings === 'string';
  126. };
  127. return PreviousMap;
  128. }();
  129. exports.default = PreviousMap;
  130. module.exports = exports['default'];
  131. //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9saWIvcHJldmlvdXMtbWFwLmVzNiJdLCJuYW1lcyI6WyJQcmV2aW91c01hcCIsImNzcyIsIm9wdHMiLCJsb2FkQW5ub3RhdGlvbiIsImlubGluZSIsInN0YXJ0V2l0aCIsImFubm90YXRpb24iLCJwcmV2IiwibWFwIiwidW5kZWZpbmVkIiwidGV4dCIsImxvYWRNYXAiLCJmcm9tIiwiY29uc3VtZXIiLCJjb25zdW1lckNhY2hlIiwiU291cmNlTWFwQ29uc3VtZXIiLCJ3aXRoQ29udGVudCIsInNvdXJjZXNDb250ZW50IiwibGVuZ3RoIiwic3RyaW5nIiwic3RhcnQiLCJzdWJzdHIiLCJtYXRjaCIsInRyaW0iLCJkZWNvZGVJbmxpbmUiLCJ1dGZkNjQiLCJ1dGY2NCIsImI2NCIsInVyaSIsImRlY29kZVVSSUNvbXBvbmVudCIsImRlY29kZSIsImVuY29kaW5nIiwiRXJyb3IiLCJmaWxlIiwicHJldlBhdGgiLCJleGlzdHNTeW5jIiwicmVhZEZpbGVTeW5jIiwidG9TdHJpbmciLCJTb3VyY2VNYXBHZW5lcmF0b3IiLCJmcm9tU291cmNlTWFwIiwiaXNNYXAiLCJKU09OIiwic3RyaW5naWZ5Iiwiam9pbiIsImRpcm5hbWUiLCJyb290IiwibWFwcGluZ3MiLCJfbWFwcGluZ3MiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7Ozs7QUFFQTs7Ozs7Ozs7Ozs7SUFXTUEsVzs7QUFFRjs7OztBQUlBLHlCQUFZQyxHQUFaLEVBQWlCQyxJQUFqQixFQUF1QjtBQUFBOztBQUNuQixhQUFLQyxjQUFMLENBQW9CRixHQUFwQjtBQUNBOzs7QUFHQSxhQUFLRyxNQUFMLEdBQWMsS0FBS0MsU0FBTCxDQUFlLEtBQUtDLFVBQXBCLEVBQWdDLE9BQWhDLENBQWQ7O0FBRUEsWUFBSUMsT0FBT0wsS0FBS00sR0FBTCxHQUFXTixLQUFLTSxHQUFMLENBQVNELElBQXBCLEdBQTJCRSxTQUF0QztBQUNBLFlBQUlDLE9BQU8sS0FBS0MsT0FB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NkIsUUFBOUIsR0FBeUNkLElBQXpDLEVBQVA7QUFDSCxhQUZELE1BRU87QUFDSCx1QkFBTyxLQUFQO0FBQ0g7QUFDSjtBQUNKLEs7OzBCQUVEaUIsSyxrQkFBTWhDLEcsRUFBSztBQUNQLFlBQUssUUFBT0EsR0FBUCx5Q0FBT0EsR0FBUCxPQUFlLFFBQXBCLEVBQStCLE9BQU8sS0FBUDtBQUMvQixlQUFPLE9BQU9BLElBQUlzQyxRQUFYLEtBQXdCLFFBQXhCLElBQ0EsT0FBT3RDLElBQUl1QyxTQUFYLEtBQXlCLFFBRGhDO0FBRUgsSzs7Ozs7a0JBR1UvQyxXIiwiZmlsZSI6InByZXZpb3VzLW1hcC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2U2NCB9IGZyb20gJ2pzLWJhc2U2NCc7XG5pbXBvcnQgICBtb3ppbGxhICBmcm9tICdzb3VyY2UtbWFwJztcbmltcG9ydCAgIHBhdGggICAgIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICAgZnMgICAgICAgZnJvbSAnZnMnO1xuXG4vKipcbiAqIFNvdXJjZSBtYXAgaW5mb3JtYXRpb24gZnJvbSBpbnB1dCBDU1MuXG4gKiBGb3IgZXhhbXBsZSwgc291cmNlIG1hcCBhZnRlciBTYXNzIGNvbXBpbGVyLlxuICpcbiAqIFRoaXMgY2xhc3Mgd2lsbCBhdXRvbWF0aWNhbGx5IGZpbmQgc291cmNlIG1hcCBpbiBpbnB1dCBDU1Mgb3IgaW4gZmlsZSBzeXN0ZW1cbiAqIG5lYXIgaW5wdXQgZmlsZSAoYWNjb3JkaW5nIGBmcm9tYCBvcHRpb24pLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCByb290ID0gcG9zdGNzcy5wYXJzZShjc3MsIHsgZnJvbTogJ2Euc2Fzcy5jc3MnIH0pO1xuICogcm9vdC5pbnB1dC5tYXAgLy89PiBQcmV2aW91c01hcFxuICovXG5jbGFzcyBQcmV2aW91c01hcCB7XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gICAgICAgICBjc3MgICAgLSBpbnB1dCBDU1Mgc291cmNlXG4gICAgICogQHBhcmFtIHtwcm9jZXNzT3B0aW9uc30gW29wdHNdIC0ge0BsaW5rIFByb2Nlc3NvciNwcm9jZXNzfSBvcHRpb25zXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY3NzLCBvcHRzKSB7XG4gICAgICAgIHRoaXMubG9hZEFubm90YXRpb24oY3NzKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBtZW1iZXIge2Jvb2xlYW59IC0gV2FzIHNvdXJjZSBtYXAgaW5saW5lZCBieSBkYXRhLXVyaSB0byBpbnB1dCBDU1MuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmlubGluZSA9IHRoaXMuc3RhcnRXaXRoKHRoaXMuYW5ub3RhdGlvbiwgJ2RhdGE6Jyk7XG5cbiAgICAgICAgbGV0IHByZXYgPSBvcHRzLm1hcCA/IG9wdHMubWFwLnByZXYgOiB1bmRlZmluZWQ7XG4gICAgICAgIGxldCB0ZXh0ID0gdGhpcy5sb2FkTWFwKG9wdHMuZnJvbSwgcHJldik7XG4gICAgICAgIGlmICggdGV4dCApIHRoaXMudGV4dCA9IHRleHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgaW5zdGFuY2Ugb2YgYFNvdXJjZU1hcEdlbmVyYXRvcmAgY2xhc3NcbiAgICAgKiBmcm9tIHRoZSBgc291cmNlLW1hcGAgbGlicmFyeSB0byB3b3JrIHdpdGggc291cmNlIG1hcCBpbmZvcm1hdGlvbi5cbiAgICAgKlxuICAgICAqIEl0IGlzIGxhenkgbWV0aG9kLCBzbyBpdCB3aWxsIGNyZWF0ZSBvYmplY3Qgb25seSBvbiBmaXJzdCBjYWxsXG4gICAgICogYW5kIHRoZW4gaXQgd2lsbCB1c2UgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTb3VyY2VNYXBHZW5lcmF0b3J9IG9iamVjdCB3aXRoIHNvdXJjZSBtYXAgaW5mb3JtYXRpb25cbiAgICAgKi9cbiAgICBjb25zdW1lcigpIHtcbiAgICAgICAgaWYgKCAhdGhpcy5jb25zdW1lckNhY2hlICkge1xuICAgICAgICAgICAgdGhpcy5jb25zdW1lckNhY2hlID0gbmV3IG1vemlsbGEuU291cmNlTWFwQ29uc3VtZXIodGhpcy50ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb25zdW1lckNhY2hlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERvZXMgc291cmNlIG1hcCBjb250YWlucyBgc291cmNlc0NvbnRlbnRgIHdpdGggaW5wdXQgc291cmNlIHRleHQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBJcyBgc291cmNlc0NvbnRlbnRgIHByZXNlbnRcbiAgICAgKi9cbiAgICB3aXRoQ29udGVudCgpIHtcbiAgICAgICAgcmV0dXJuICEhKHRoaXMuY29uc3VtZXIoKS5zb3VyY2VzQ29udGVudCAmJlxuICAgICAgICAgICAgICAgICAgdGhpcy5jb25zdW1lcigpLnNvdXJjZXNDb250ZW50Lmxlbmd0aCA+IDApO1xuICAgIH1cblxuICAgIHN0YXJ0V2l0aChzdHJpbmcsIHN0YXJ0KSB7XG4gICAgICAgIGlmICggIXN0cmluZyApIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHN0cmluZy5zdWJzdHIoMCwgc3RhcnQubGVuZ3RoKSA9PT0gc3RhcnQ7XG4gICAgfVxuXG4gICAgbG9hZEFubm90YXRpb24oY3NzKSB7XG4gICAgICAgIGxldCBtYXRjaCA9IGNzcy5tYXRjaCgvXFwvXFwqXFxzKiMgc291cmNlTWFwcGluZ1VSTD0oLiopXFxzKlxcKlxcLy8pO1xuICAgICAgICBpZiAoIG1hdGNoICkgdGhpcy5hbm5vdGF0aW9uID0gbWF0Y2hbMV0udHJpbSgpO1xuICAgIH1cblxuICAgIGRlY29kZUlubGluZSh0ZXh0KSB7XG4gICAgICAgIGxldCB1dGZkNjQgPSAnZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LCc7XG4gICAgICAgIGxldCB1dGY2NCAgPSAnZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmODtiYXNlNjQsJztcbiAgICAgICAgbGV0IGI2NCAgICA9ICdkYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LCc7XG4gICAgICAgIGxldCB1cmkgICAgPSAnZGF0YTphcHBsaWNhdGlvbi9qc29uLCc7XG5cbiAgICAgICAgaWYgKCB0aGlzLnN0YXJ0V2l0aCh0ZXh0LCB1cmkpICkge1xuICAgICAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCggdGV4dC5zdWJzdHIodXJpLmxlbmd0aCkgKTtcblxuICAgICAgICB9IGVsc2UgaWYgKCB0aGlzLnN0YXJ0V2l0aCh0ZXh0LCBiNjQpICkge1xuICAgICAgICAgICAgcmV0dXJuIEJhc2U2NC5kZWNvZGUoIHRleHQuc3Vic3RyKGI2NC5sZW5ndGgpICk7XG5cbiAgICAgICAgfSBlbHNlIGlmICggdGhpcy5zdGFydFdpdGgodGV4dCwgdXRmNjQpICkge1xuICAgICAgICAgICAgcmV0dXJuIEJhc2U2NC5kZWNvZGUoIHRleHQuc3Vic3RyKHV0ZjY0Lmxlbmd0aCkgKTtcblxuICAgICAgICB9IGVsc2UgaWYgKCB0aGlzLnN0YXJ0V2l0aCh0ZXh0LCB1dGZkNjQpICkge1xuICAgICAgICAgICAgcmV0dXJuIEJhc2U2NC5kZWNvZGUoIHRleHQuc3Vic3RyKHV0ZmQ2NC5sZW5ndGgpICk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBlbmNvZGluZyA9IHRleHQubWF0Y2goL2RhdGE6YXBwbGljYXRpb25cXC9qc29uOyhbXixdKyksLylbMV07XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIHNvdXJjZSBtYXAgZW5jb2RpbmcgJyArIGVuY29kaW5nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxvYWRNYXAoZmlsZSwgcHJldikge1xuICAgICAgICBpZiAoIHByZXYgPT09IGZhbHNlICkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGlmICggcHJldiApIHtcbiAgICAgICAgICAgIGlmICggdHlwZW9mIHByZXYgPT09ICdzdHJpbmcnICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgICAgICAgfSBlbHNlIGlmICggdHlwZW9mIHByZXYgPT09ICdmdW5jdGlvbicgKSB7XG4gICAgICAgICAgICAgICAgbGV0IHByZXZQYXRoID0gcHJldihmaWxlKTtcbiAgICAgICAgICAgICAgICBpZiAoIHByZXZQYXRoICYmIGZzLmV4aXN0c1N5bmMgJiYgZnMuZXhpc3RzU3luYyhwcmV2UGF0aCkgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmMocHJldlBhdGgsICd1dGYtOCcpLnRvU3RyaW5nKCkudHJpbSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGxvYWQgcHJldmlvdXMgc291cmNlIG1hcDogJyArXG4gICAgICAgICAgICAgICAgICAgIHByZXZQYXRoLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIHByZXYgaW5zdGFuY2VvZiBtb3ppbGxhLlNvdXJjZU1hcENvbnN1bWVyICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb3ppbGxhLlNvdXJjZU1hcEdlbmVyYXRvclxuICAgICAgICAgICAgICAgICAgICAuZnJvbVNvdXJjZU1hcChwcmV2KS50b1N0cmluZygpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICggcHJldiBpbnN0YW5jZW9mIG1vemlsbGEuU291cmNlTWFwR2VuZXJhdG9yICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2LnRvU3RyaW5nKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCB0aGlzLmlzTWFwKHByZXYpICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwcmV2KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBwcmV2aW91cyBzb3VyY2UgbWFwIGZvcm1hdDogJyArXG4gICAgICAgICAgICAgICAgICAgIHByZXYudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIGlmICggdGhpcy5pbmxpbmUgKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWNvZGVJbmxpbmUodGhpcy5hbm5vdGF0aW9uKTtcblxuICAgICAgICB9IGVsc2UgaWYgKCB0aGlzLmFubm90YXRpb24gKSB7XG4gICAgICAgICAgICBsZXQgbWFwID0gdGhpcy5hbm5vdGF0aW9uO1xuICAgICAgICAgICAgaWYgKCBmaWxlICkgbWFwID0gcGF0aC5qb2luKHBhdGguZGlybmFtZShmaWxlKSwgbWFwKTtcblxuICAgICAgICAgICAgdGhpcy5yb290ID0gcGF0aC5kaXJuYW1lKG1hcCk7XG4gICAgICAgICAgICBpZiAoIGZzLmV4aXN0c1N5bmMgJiYgZnMuZXhpc3RzU3luYyhtYXApICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmMobWFwLCAndXRmLTgnKS50b1N0cmluZygpLnRyaW0oKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNNYXAobWFwKSB7XG4gICAgICAgIGlmICggdHlwZW9mIG1hcCAhPT0gJ29iamVjdCcgKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0eXBlb2YgbWFwLm1hcHBpbmdzID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgICAgdHlwZW9mIG1hcC5fbWFwcGluZ3MgPT09ICdzdHJpbmcnO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUHJldmlvdXNNYXA7XG4iXX0=