UNPKG

jscrambler

Version:
933 lines (767 loc) 63.6 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); require('babel-polyfill'); var _glob = require('glob'); var _glob2 = _interopRequireDefault(_glob); var _path = require('path'); var _path2 = _interopRequireDefault(_path); var _axios = require('axios'); var _axios2 = _interopRequireDefault(_axios); var _q = require('q'); var _q2 = _interopRequireDefault(_q); var _config = require('./config'); var _config2 = _interopRequireDefault(_config); var _generateSignedParams = require('./generate-signed-params'); var _generateSignedParams2 = _interopRequireDefault(_generateSignedParams); var _client = require('./client'); var _client2 = _interopRequireDefault(_client); var _mutations = require('./mutations'); var _queries = require('./queries'); var _zip2 = require('./zip'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { return step("next", value); }, function (err) { return step("throw", err); }); } } return step("next"); }); }; } exports.default = { Client: _client2.default, config: _config2.default, generateSignedParams: _generateSignedParams2.default, // This method is a shortcut method that accepts an object with everything needed // for the entire process of requesting an application protection and downloading // that same protection when the same ends. // // `configPathOrObject` can be a path to a JSON or directly an object containing // the following structure: // // ```json // { // "keys": { // "accessKey": "", // "secretKey": "" // }, // "applicationId": "", // "filesDest": "" // } // ``` // // Also the following optional parameters are accepted: // // ```json // { // "filesSrc": [""], // "params": {}, // "cwd": "", // "host": "api.jscrambler.com", // "port": "443" // } // ``` // // `filesSrc` supports glob patterns, and if it's provided it will replace the // entire application sources. // // `params` if provided will replace all the application transformation parameters. // // `cwd` allows you to set the current working directory to resolve problems with // relative paths with your `filesSrc` is outside the current working directory. // // Finally, `host` and `port` can be overridden if you to engage with a different // endpoint than the default one, useful if you're running an enterprise version of // Jscrambler or if you're provided access to beta features of our product. // protectAndDownload: function protectAndDownload(configPathOrObject, destCallback) { var _this = this; return _asyncToGenerator(regeneratorRuntime.mark(function _callee() { var config, applicationId, host, port, keys, filesDest, filesSrc, cwd, params, accessKey, secretKey, client, _filesSrc, i, l, _zip, removeSourceRes, hadNoSources, addApplicationSourceRes, areSubscribersOrdered, updateApplicationRes, createApplicationProtectionRes, protectionId, download; return regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: config = typeof configPathOrObject === 'string' ? require(configPathOrObject) : configPathOrObject; applicationId = config.applicationId; host = config.host; port = config.port; keys = config.keys; filesDest = config.filesDest; filesSrc = config.filesSrc; cwd = config.cwd; params = config.params; accessKey = keys.accessKey; secretKey = keys.secretKey; client = new _this.Client({ accessKey: accessKey, secretKey: secretKey, host: host, port: port }); if (applicationId) { _context.next = 14; break; } throw new Error('Required *applicationId* not provided'); case 14: if (!(!filesDest && !destCallback)) { _context.next = 16; break; } throw new Error('Required *filesDest* not provided'); case 16: if (!(filesSrc && filesSrc.length)) { _context.next = 34; break; } _filesSrc = []; for (i = 0, l = filesSrc.length; i < l; ++i) { if (typeof filesSrc[i] === 'string') { // TODO Replace `glob.sync` with async version _filesSrc = _filesSrc.concat(_glob2.default.sync(filesSrc[i], { dot: true })); } else { _filesSrc.push(filesSrc[i]); } } _context.next = 21; return (0, _zip2.zip)(filesSrc, cwd); case 21: _zip = _context.sent; _context.next = 24; return _this.removeSourceFromApplication(client, '', applicationId); case 24: removeSourceRes = _context.sent; if (!removeSourceRes.errors) { _context.next = 30; break; } // TODO Implement error codes or fix this is on the services hadNoSources = false; removeSourceRes.errors.forEach(function (error) { if (error.message === 'Application Source with the given ID does not exist') { hadNoSources = true; } }); if (hadNoSources) { _context.next = 30; break; } throw new Error(removeSourceRes.errors[0].message); case 30: _context.next = 32; return _this.addApplicationSource(client, applicationId, { content: _zip.generate({ type: 'base64' }), filename: 'application.zip', extension: 'zip' }); case 32: addApplicationSourceRes = _context.sent; errorHandler(addApplicationSourceRes); case 34: if (!(params && Object.keys(params).length)) { _context.next = 40; break; } areSubscribersOrdered = Array.isArray(params); _context.next = 38; return _this.updateApplication(client, { _id: applicationId, parameters: JSON.stringify(normalizeParameters(params)), areSubscribersOrdered: areSubscribersOrdered }); case 38: updateApplicationRes = _context.sent; errorHandler(updateApplicationRes); case 40: _context.next = 42; return _this.createApplicationProtection(client, applicationId); case 42: createApplicationProtectionRes = _context.sent; errorHandler(createApplicationProtectionRes); protectionId = createApplicationProtectionRes.data.createApplicationProtection._id; _context.next = 47; return _this.pollProtection(client, applicationId, protectionId); case 47: _context.next = 49; return _this.downloadApplicationProtection(client, protectionId); case 49: download = _context.sent; errorHandler(download); (0, _zip2.unzip)(download, filesDest || destCallback); case 52: case 'end': return _context.stop(); } } }, _callee, _this); }))(); }, // pollProtection: function pollProtection(client, applicationId, protectionId) { var _this2 = this; return _asyncToGenerator(regeneratorRuntime.mark(function _callee3() { var deferred, poll; return regeneratorRuntime.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: deferred = _q2.default.defer(); poll = function () { var ref = _asyncToGenerator(regeneratorRuntime.mark(function _callee2() { var applicationProtection, state; return regeneratorRuntime.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: _context2.next = 2; return _this2.getApplicationProtection(client, applicationId, protectionId); case 2: applicationProtection = _context2.sent; if (!applicationProtection.errors) { _context2.next = 8; break; } throw new Error('Error polling protection'); case 8: state = applicationProtection.data.applicationProtection.state; if (state !== 'finished' && state !== 'errored') { setTimeout(poll, 500); } else { deferred.resolve(); } case 10: case 'end': return _context2.stop(); } } }, _callee2, _this2); })); return function poll() { return ref.apply(this, arguments); }; }(); poll(); return _context3.abrupt('return', deferred.promise); case 4: case 'end': return _context3.stop(); } } }, _callee3, _this2); }))(); }, // createApplication: function createApplication(client, data, fragments) { var _this3 = this; return _asyncToGenerator(regeneratorRuntime.mark(function _callee4() { var deferred; return regeneratorRuntime.wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: deferred = _q2.default.defer(); client.post('/application', (0, _mutations.createApplication)(data, fragments), responseHandler(deferred)); return _context4.abrupt('return', deferred.promise); case 3: case 'end': return _context4.stop(); } } }, _callee4, _this3); }))(); }, // duplicateApplication: function duplicateApplication(client, data, fragments) { var _this4 = this; return _asyncToGenerator(regeneratorRuntime.mark(function _callee5() { var deferred; return regeneratorRuntime.wrap(function _callee5$(_context5) { while (1) { switch (_context5.prev = _context5.next) { case 0: deferred = _q2.default.defer(); client.post('/application', (0, _mutations.duplicateApplication)(data, fragments), responseHandler(deferred)); return _context5.abrupt('return', deferred.promise); case 3: case 'end': return _context5.stop(); } } }, _callee5, _this4); }))(); }, // removeApplication: function removeApplication(client, id) { var _this5 = this; return _asyncToGenerator(regeneratorRuntime.mark(function _callee6() { var deferred; return regeneratorRuntime.wrap(function _callee6$(_context6) { while (1) { switch (_context6.prev = _context6.next) { case 0: deferred = _q2.default.defer(); client.post('/application', (0, _mutations.removeApplication)(id), responseHandler(deferred)); return _context6.abrupt('return', deferred.promise); case 3: case 'end': return _context6.stop(); } } }, _callee6, _this5); }))(); }, // removeProtection: function removeProtection(client, id, appId, fragments) { var _this6 = this; return _asyncToGenerator(regeneratorRuntime.mark(function _callee7() { var deferred; return regeneratorRuntime.wrap(function _callee7$(_context7) { while (1) { switch (_context7.prev = _context7.next) { case 0: deferred = _q2.default.defer(); client.post('/application', (0, _mutations.removeProtection)(id, appId, fragments), responseHandler(deferred)); return _context7.abrupt('return', deferred.promise); case 3: case 'end': return _context7.stop(); } } }, _callee7, _this6); }))(); }, // updateApplication: function updateApplication(client, application, fragments) { var _this7 = this; return _asyncToGenerator(regeneratorRuntime.mark(function _callee8() { var deferred; return regeneratorRuntime.wrap(function _callee8$(_context8) { while (1) { switch (_context8.prev = _context8.next) { case 0: deferred = _q2.default.defer(); client.post('/application', (0, _mutations.updateApplication)(application, fragments), responseHandler(deferred)); return _context8.abrupt('return', deferred.promise); case 3: case 'end': return _context8.stop(); } } }, _callee8, _this7); }))(); }, // unlockApplication: function unlockApplication(client, application, fragments) { var _this8 = this; return _asyncToGenerator(regeneratorRuntime.mark(function _callee9() { var deferred; return regeneratorRuntime.wrap(function _callee9$(_context9) { while (1) { switch (_context9.prev = _context9.next) { case 0: deferred = _q2.default.defer(); client.post('/application', (0, _mutations.unlockApplication)(application, fragments), responseHandler(deferred)); return _context9.abrupt('return', deferred.promise); case 3: case 'end': return _context9.stop(); } } }, _callee9, _this8); }))(); }, // getApplication: function getApplication(client, applicationId, fragments) { var _this9 = this; return _asyncToGenerator(regeneratorRuntime.mark(function _callee10() { var deferred; return regeneratorRuntime.wrap(function _callee10$(_context10) { while (1) { switch (_context10.prev = _context10.next) { case 0: deferred = _q2.default.defer(); client.get('/application', (0, _queries.getApplication)(applicationId, fragments), responseHandler(deferred)); return _context10.abrupt('return', deferred.promise); case 3: case 'end': return _context10.stop(); } } }, _callee10, _this9); }))(); }, // getApplicationSource: function getApplicationSource(client, sourceId, fragments, limits) { var _this10 = this; return _asyncToGenerator(regeneratorRuntime.mark(function _callee11() { var deferred; return regeneratorRuntime.wrap(function _callee11$(_context11) { while (1) { switch (_context11.prev = _context11.next) { case 0: deferred = _q2.default.defer(); client.get('/application', (0, _queries.getApplicationSource)(sourceId, fragments, limits), responseHandler(deferred)); return _context11.abrupt('return', deferred.promise); case 3: case 'end': return _context11.stop(); } } }, _callee11, _this10); }))(); }, // getApplicationProtections: function getApplicationProtections(client, applicationId, params, fragments) { var _this11 = this; return _asyncToGenerator(regeneratorRuntime.mark(function _callee12() { var deferred; return regeneratorRuntime.wrap(function _callee12$(_context12) { while (1) { switch (_context12.prev = _context12.next) { case 0: deferred = _q2.default.defer(); client.get('/application', (0, _queries.getApplicationProtections)(applicationId, params, fragments), responseHandler(deferred)); return _context12.abrupt('return', deferred.promise); case 3: case 'end': return _context12.stop(); } } }, _callee12, _this11); }))(); }, // getApplicationProtectionsCount: function getApplicationProtectionsCount(client, applicationId, fragments) { var _this12 = this; return _asyncToGenerator(regeneratorRuntime.mark(function _callee13() { var deferred; return regeneratorRuntime.wrap(function _callee13$(_context13) { while (1) { switch (_context13.prev = _context13.next) { case 0: deferred = _q2.default.defer(); client.get('/application', (0, _queries.getApplicationProtectionsCount)(applicationId, fragments), responseHandler(deferred)); return _context13.abrupt('return', deferred.promise); case 3: case 'end': return _context13.stop(); } } }, _callee13, _this12); }))(); }, // createTemplate: function createTemplate(client, template, fragments) { var _this13 = this; return _asyncToGenerator(regeneratorRuntime.mark(function _callee14() { var deferred; return regeneratorRuntime.wrap(function _callee14$(_context14) { while (1) { switch (_context14.prev = _context14.next) { case 0: deferred = _q2.default.defer(); client.post('/application', (0, _mutations.createTemplate)(template, fragments), responseHandler(deferred)); return _context14.abrupt('return', deferred.promise); case 3: case 'end': return _context14.stop(); } } }, _callee14, _this13); }))(); }, // removeTemplate: function removeTemplate(client, id) { var _this14 = this; return _asyncToGenerator(regeneratorRuntime.mark(function _callee15() { var deferred; return regeneratorRuntime.wrap(function _callee15$(_context15) { while (1) { switch (_context15.prev = _context15.next) { case 0: deferred = _q2.default.defer(); client.post('/application', (0, _mutations.removeTemplate)(id), responseHandler(deferred)); return _context15.abrupt('return', deferred.promise); case 3: case 'end': return _context15.stop(); } } }, _callee15, _this14); }))(); }, // getTemplates: function getTemplates(client, fragments) { var _this15 = this; return _asyncToGenerator(regeneratorRuntime.mark(function _callee16() { var deferred; return regeneratorRuntime.wrap(function _callee16$(_context16) { while (1) { switch (_context16.prev = _context16.next) { case 0: deferred = _q2.default.defer(); client.get('/application', (0, _queries.getTemplates)(fragments), responseHandler(deferred)); return _context16.abrupt('return', deferred.promise); case 3: case 'end': return _context16.stop(); } } }, _callee16, _this15); }))(); }, // getApplications: function getApplications(client, fragments) { var _this16 = this; return _asyncToGenerator(regeneratorRuntime.mark(function _callee17() { var deferred; return regeneratorRuntime.wrap(function _callee17$(_context17) { while (1) { switch (_context17.prev = _context17.next) { case 0: deferred = _q2.default.defer(); client.get('/application', (0, _queries.getApplications)(fragments), responseHandler(deferred)); return _context17.abrupt('return', deferred.promise); case 3: case 'end': return _context17.stop(); } } }, _callee17, _this16); }))(); }, // addApplicationSource: function addApplicationSource(client, applicationId, applicationSource, fragments) { var _this17 = this; return _asyncToGenerator(regeneratorRuntime.mark(function _callee18() { var deferred; return regeneratorRuntime.wrap(function _callee18$(_context18) { while (1) { switch (_context18.prev = _context18.next) { case 0: deferred = _q2.default.defer(); client.post('/application', (0, _mutations.addApplicationSource)(applicationId, applicationSource, fragments), responseHandler(deferred)); return _context18.abrupt('return', deferred.promise); case 3: case 'end': return _context18.stop(); } } }, _callee18, _this17); }))(); }, // addApplicationSourceFromURL: function addApplicationSourceFromURL(client, applicationId, url, fragments) { var _this18 = this; return _asyncToGenerator(regeneratorRuntime.mark(function _callee19() { var deferred; return regeneratorRuntime.wrap(function _callee19$(_context19) { while (1) { switch (_context19.prev = _context19.next) { case 0: deferred = _q2.default.defer(); return _context19.abrupt('return', getFileFromUrl(client, url).then(function (file) { client.post('/application', (0, _mutations.addApplicationSource)(applicationId, file, fragments), responseHandler(deferred)); return deferred.promise; })); case 2: case 'end': return _context19.stop(); } } }, _callee19, _this18); }))(); }, // updateApplicationSource: function updateApplicationSource(client, applicationSource, fragments) { var _this19 = this; return _asyncToGenerator(regeneratorRuntime.mark(function _callee20() { var deferred; return regeneratorRuntime.wrap(function _callee20$(_context20) { while (1) { switch (_context20.prev = _context20.next) { case 0: deferred = _q2.default.defer(); client.post('/application', (0, _mutations.updateApplicationSource)(applicationSource, fragments), responseHandler(deferred)); return _context20.abrupt('return', deferred.promise); case 3: case 'end': return _context20.stop(); } } }, _callee20, _this19); }))(); }, // removeSourceFromApplication: function removeSourceFromApplication(client, sourceId, applicationId, fragments) { var _this20 = this; return _asyncToGenerator(regeneratorRuntime.mark(function _callee21() { var deferred; return regeneratorRuntime.wrap(function _callee21$(_context21) { while (1) { switch (_context21.prev = _context21.next) { case 0: deferred = _q2.default.defer(); client.post('/application', (0, _mutations.removeSourceFromApplication)(sourceId, applicationId, fragments), responseHandler(deferred)); return _context21.abrupt('return', deferred.promise); case 3: case 'end': return _context21.stop(); } } }, _callee21, _this20); }))(); }, // applyTemplate: function applyTemplate(client, templateId, appId, fragments) { var _this21 = this; return _asyncToGenerator(regeneratorRuntime.mark(function _callee22() { var deferred; return regeneratorRuntime.wrap(function _callee22$(_context22) { while (1) { switch (_context22.prev = _context22.next) { case 0: deferred = _q2.default.defer(); client.post('/application', (0, _mutations.applyTemplate)(templateId, appId, fragments), responseHandler(deferred)); return _context22.abrupt('return', deferred.promise); case 3: case 'end': return _context22.stop(); } } }, _callee22, _this21); }))(); }, // updateTemplate: function updateTemplate(client, template, fragments) { var _this22 = this; return _asyncToGenerator(regeneratorRuntime.mark(function _callee23() { var deferred; return regeneratorRuntime.wrap(function _callee23$(_context23) { while (1) { switch (_context23.prev = _context23.next) { case 0: deferred = _q2.default.defer(); client.post('/application', (0, _mutations.updateTemplate)(template, fragments), responseHandler(deferred)); return _context23.abrupt('return', deferred.promise); case 3: case 'end': return _context23.stop(); } } }, _callee23, _this22); }))(); }, // createApplicationProtection: function createApplicationProtection(client, applicationId, fragments) { var _this23 = this; return _asyncToGenerator(regeneratorRuntime.mark(function _callee24() { var deferred; return regeneratorRuntime.wrap(function _callee24$(_context24) { while (1) { switch (_context24.prev = _context24.next) { case 0: deferred = _q2.default.defer(); client.post('/application', (0, _mutations.createApplicationProtection)(applicationId, fragments), responseHandler(deferred)); return _context24.abrupt('return', deferred.promise); case 3: case 'end': return _context24.stop(); } } }, _callee24, _this23); }))(); }, // getApplicationProtection: function getApplicationProtection(client, applicationId, protectionId, fragments) { var _this24 = this; return _asyncToGenerator(regeneratorRuntime.mark(function _callee25() { var deferred; return regeneratorRuntime.wrap(function _callee25$(_context25) { while (1) { switch (_context25.prev = _context25.next) { case 0: deferred = _q2.default.defer(); client.get('/application', (0, _queries.getProtection)(applicationId, protectionId, fragments), responseHandler(deferred)); return _context25.abrupt('return', deferred.promise); case 3: case 'end': return _context25.stop(); } } }, _callee25, _this24); }))(); }, // downloadApplicationProtection: function downloadApplicationProtection(client, protectionId) { var _this25 = this; return _asyncToGenerator(regeneratorRuntime.mark(function _callee26() { var deferred; return regeneratorRuntime.wrap(function _callee26$(_context26) { while (1) { switch (_context26.prev = _context26.next) { case 0: deferred = _q2.default.defer(); client.get('/application/download/' + protectionId, null, responseHandler(deferred), false); return _context26.abrupt('return', deferred.promise); case 3: case 'end': return _context26.stop(); } } }, _callee26, _this25); }))(); } }; function getFileFromUrl(client, url) { var deferred = _q2.default.defer(); var file; _axios2.default.get(url).then(function (res) { file = { content: res.data, filename: _path2.default.basename(url), extension: _path2.default.extname(url).substr(1) }; deferred.resolve(file); }).catch(function (err) { deferred.reject(err); }); return deferred.promise; } function responseHandler(deferred) { return function (err, res) { if (err) { deferred.reject(err); } else { var body = res.data; try { if (res.status >= 400) { deferred.reject(body); } else { deferred.resolve(body); } } catch (ex) { deferred.reject(body); } } }; } function errorHandler(res) { if (res.errors && res.errors.length) { res.errors.forEach(function (error) { throw new Error(error.message); }); } return res; } function normalizeParameters(parameters) { var result; if (!Array.isArray(parameters)) { result = []; Object.keys(parameters).forEach(function (name) { result.push({ name: name, options: parameters[name] }); }); } else { result = parameters; } return result; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7O0FBRUE7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFFQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7QUFnQkE7O0FBU0E7Ozs7OztrQkFLZTtBQUNiLDBCQURhO0FBRWIsMEJBRmE7QUFHYixzREFIYTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQThDUCxvQkE5Q08sOEJBOENhLGtCQTlDYixFQThDaUMsWUE5Q2pDLEVBOEMrQztBQUFBOztBQUFBO0FBQUEsVUFDcEQsTUFEb0QsRUFLeEQsYUFMd0QsRUFNeEQsSUFOd0QsRUFPeEQsSUFQd0QsRUFReEQsSUFSd0QsRUFTeEQsU0FUd0QsRUFVeEQsUUFWd0QsRUFXeEQsR0FYd0QsRUFZeEQsTUFad0QsRUFnQnhELFNBaEJ3RCxFQWlCeEQsU0FqQndELEVBb0JwRCxNQXBCb0QsRUFvQ3BELFNBcENvRCxFQXFDL0MsQ0FyQytDLEVBcUN4QyxDQXJDd0MsRUE4Q2xELElBOUNrRCxFQWdEbEQsZUFoRGtELEVBbURsRCxZQW5Ea0QsRUE4RGxELHVCQTlEa0QsRUF1RWxELHFCQXZFa0QsRUF3RWxELG9CQXhFa0QsRUFnRnBELDhCQWhGb0QsRUFtRnBELFlBbkZvRCxFQXNGcEQsUUF0Rm9EOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ3BELG9CQURvRCxHQUMzQyxPQUFPLGtCQUFQLEtBQThCLFFBQTlCLEdBQ2IsUUFBUSxrQkFBUixDQURhLEdBQ2lCLGtCQUYwQjtBQUt4RCwyQkFMd0QsR0FhdEQsTUFic0QsQ0FLeEQsYUFMd0Q7QUFNeEQsa0JBTndELEdBYXRELE1BYnNELENBTXhELElBTndEO0FBT3hELGtCQVB3RCxHQWF0RCxNQWJzRCxDQU94RCxJQVB3RDtBQVF4RCxrQkFSd0QsR0FhdEQsTUFic0QsQ0FReEQsSUFSd0Q7QUFTeEQsdUJBVHdELEdBYXRELE1BYnNE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QUFoQjtBQUNELEtBRkQsTUFFTztBQUNMLFVBQUksT0FBTyxJQUFJLElBQWY7QUFDQSxVQUFJO0FBQ0YsWUFBSSxJQUFJLE1BQUosSUFBYyxHQUFsQixFQUF1QjtBQUNyQixtQkFBUyxNQUFULENBQWdCLElBQWhCO0FBQ0QsU0FGRCxNQUVPO0FBQ0wsbUJBQVMsT0FBVCxDQUFpQixJQUFqQjtBQUNEO0FBQ0YsT0FORCxDQU1FLE9BQU8sRUFBUCxFQUFXO0FBQ1gsaUJBQVMsTUFBVCxDQUFnQixJQUFoQjtBQUNEO0FBQ0Y7QUFDRixHQWZEO0FBZ0JEOztBQUVELFNBQVMsWUFBVCxDQUF1QixHQUF2QixFQUE0QjtBQUMxQixNQUFJLElBQUksTUFBSixJQUFjLElBQUksTUFBSixDQUFXLE1BQTdCLEVBQXFDO0FBQ25DLFFBQUksTUFBSixDQUFXLE9BQVgsQ0FBbUIsVUFBVSxLQUFWLEVBQWlCO0FBQ2xDLFlBQU0sSUFBSSxLQUFKLENBQVUsTUFBTSxPQUFoQixDQUFOO0FBQ0QsS0FGRDtBQUdEOztBQUVELFNBQU8sR0FBUDtBQUNEOztBQUVELFNBQVMsbUJBQVQsQ0FBOEIsVUFBOUIsRUFBMEM7QUFDeEMsTUFBSSxNQUFKOztBQUVBLE1BQUksQ0FBQyxNQUFNLE9BQU4sQ0FBYyxVQUFkLENBQUwsRUFBZ0M7QUFDOUIsYUFBUyxFQUFUO0FBQ0EsV0FBTyxJQUFQLENBQVksVUFBWixFQUF3QixPQUF4QixDQUFnQyxVQUFDLElBQUQsRUFBVTtBQUN4QyxhQUFPLElBQVAsQ0FBWTtBQUNWLGtCQURVO0FBRVYsaUJBQVMsV0FBVyxJQUFYO0FBRkMsT0FBWjtBQUlELEtBTEQ7QUFNRCxHQVJELE1BUU87QUFDTCxhQUFTLFVBQVQ7QUFDRDs7QUFFRCxTQUFPLE1BQVA7QUFDRCIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnYmFiZWwtcG9seWZpbGwnO1xuXG5pbXBvcnQgZ2xvYiBmcm9tICdnbG9iJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHJlcXVlc3QgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IFEgZnJvbSAncSc7XG5cbmltcG9ydCBjb25maWcgZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IGdlbmVyYXRlU2lnbmVkUGFyYW1zIGZyb20gJy4vZ2VuZXJhdGUtc2lnbmVkLXBhcmFtcyc7XG5pbXBvcnQgSlNjcmFtYmxlckNsaWVudCBmcm9tICcuL2NsaWVudCc7XG5pbXBvcnQge1xuICBhZGRBcHBsaWNhdGlvblNvdXJjZSxcbiAgY3JlYXRlQXBwbGljYXRpb24sXG4gIHJlbW92ZUFwcGxpY2F0aW9uLFxuICB1cGRhdGVBcHBsaWNhdGlvbixcbiAgdXBkYXRlQXBwbGljYXRpb25Tb3VyY2UsXG4gIHJlbW92ZVNvdXJjZUZyb21BcHBsaWNhdGlvbixcbiAgY3JlYXRlVGVtcGxhdGUsXG4gIHJlbW92ZVRlbXBsYXRlLFxuICB1cGRhdGVUZW1wbGF0ZSxcbiAgY3JlYXRlQXBwbGljYXRpb25Qcm90ZWN0aW9uLFxuICByZW1vdmVQcm90ZWN0aW9uLFxuICBkdXBsaWNhdGVBcHBsaWNhdGlvbixcbiAgdW5sb2NrQXBwbGljYXRpb24sXG4gIGFwcGx5VGVtcGxhdGVcbn0gZnJvbSAnLi9tdXRhdGlvbnMnO1xuaW1wb3J0IHtcbiAgZ2V0QXBwbGljYXRpb24sXG4gIGdldEFwcGxpY2F0aW9uUHJvdGVjdGlvbnMsXG4gIGdldEFwcGxpY2F0aW9uUHJvdGVjdGlvbnNDb3VudCxcbiAgZ2V0QXBwbGljYXRpb25zLFxuICBnZXRBcHBsaWNhdGlvblNvdXJjZSxcbiAgZ2V0VGVtcGxhdGVzLFxuICBnZXRQcm90ZWN0aW9uXG59IGZyb20gJy4vcXVlcmllcyc7XG5pbXBvcnQge1xuICB6aXAsXG4gIHVuemlwXG59IGZyb20gJy4vemlwJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICBDbGllbnQ6IEpTY3JhbWJsZXJDbGllbnQsXG4gIGNvbmZpZyxcbiAgZ2VuZXJhdGVTaWduZWRQYXJhbXMsXG4gIC8vIFRoaXMgbWV0aG9kIGlzIGEgc2hvcnRjdXQgbWV0aG9kIHRoYXQgYWNjZXB0cyBhbiBvYmplY3Qgd2l0aCBldmVyeXRoaW5nIG5lZWRlZFxuICAvLyBmb3IgdGhlIGVudGlyZSBwcm9jZXNzIG9mIHJlcXVlc3RpbmcgYW4gYXBwbGljYXRpb24gcHJvdGVjdGlvbiBhbmQgZG93bmxvYWRpbmdcbiAgLy8gdGhhdCBzYW1lIHByb3RlY3Rpb24gd2hlbiB0aGUgc2FtZSBlbmRzLlxuICAvL1xuICAvLyBgY29uZmlnUGF0aE9yT2JqZWN0YCBjYW4gYmUgYSBwYXRoIHRvIGEgSlNPTiBvciBkaXJlY3RseSBhbiBvYmplY3QgY29udGFpbmluZ1xuICAvLyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZTpcbiAgLy9cbiAgLy8gYGBganNvblxuICAvLyB7XG4gIC8vICAgXCJrZXlzXCI6IHtcbiAgLy8gICAgIFwiYWNjZXNzS2V5XCI6IFwiXCIsXG4gIC8vICAgICBcInNlY3JldEtleVwiOiBcIlwiXG4gIC8vICAgfSxcbiAgLy8gICBcImFwcGxpY2F0aW9uSWRcIjogXCJcIixcbiAgLy8gICBcImZpbGVzRGVzdFwiOiBcIlwiXG4gIC8vIH1cbiAgLy8gYGBgXG4gIC8vXG4gIC8vIEFsc28gdGhlIGZvbGxvd2luZyBvcHRpb25hbCBwYXJhbWV0ZXJzIGFyZSBhY2NlcHRlZDpcbiAgLy9cbiAgLy8gYGBganNvblxuICAvLyB7XG4gIC8vICAgXCJmaWxlc1NyY1wiOiBbXCJcIl0sXG4gIC8vICAgXCJwYXJhbXNcIjoge30sXG4gIC8vICAgXCJjd2RcIjogXCJcIixcbiAgLy8gICBcImhvc3RcIjogXCJhcGkuanNjcmFtYmxlci5jb21cIixcbiAgLy8gICBcInBvcnRcIjogXCI0NDNcIlxuICAvLyB9XG4gIC8vIGBgYFxuICAvL1xuICAvLyBgZmlsZXNTcmNgIHN1cHBvcnRzIGdsb2IgcGF0dGVybnMsIGFuZCBpZiBpdCdzIHByb3ZpZGVkIGl0IHdpbGwgcmVwbGFjZSB0aGVcbiAgLy8gZW50aXJlIGFwcGxpY2F0aW9uIHNvdXJjZXMuXG4gIC8vXG4gIC8vIGBwYXJhbXNgIGlmIHByb3ZpZGVkIHdpbGwgcmVwbGFjZSBhbGwgdGhlIGFwcGxpY2F0aW9uIHRyYW5zZm9ybWF0aW9uIHBhcmFtZXRlcnMuXG4gIC8vXG4gIC8vIGBjd2RgIGFsbG93cyB5b3UgdG8gc2V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IHRvIHJlc29sdmUgcHJvYmxlbXMgd2l0aFxuICAvLyByZWxhdGl2ZSBwYXRocyB3aXRoIHlvdXIgYGZpbGVzU3JjYCBpcyBvdXRzaWRlIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LlxuICAvL1xuICAvLyBGaW5hbGx5LCBgaG9zdGAgYW5kIGBwb3J0YCBjYW4gYmUgb3ZlcnJpZGRlbiBpZiB5b3UgdG8gZW5nYWdlIHdpdGggYSBkaWZmZXJlbnRcbiAgLy8gZW5kcG9pbnQgdGhhbiB0aGUgZGVmYXVsdCBvbmUsIHVzZWZ1bCBpZiB5b3UncmUgcnVubmluZyBhbiBlbnRlcnByaXNlIHZlcnNpb24gb2ZcbiAgLy8gSnNjcmFtYmxlciBvciBpZiB5b3UncmUgcHJvdmlkZWQgYWNjZXNzIHRvIGJldGEgZmVhdHVyZXMgb2Ygb3VyIHByb2R1Y3QuXG4gIC8vXG4gIGFzeW5jIHByb3RlY3RBbmREb3dubG9hZCAoY29uZmlnUGF0aE9yT2JqZWN0LCBkZXN0Q2FsbGJhY2spIHtcbiAgICBjb25zdCBjb25maWcgPSB0eXBlb2YgY29uZmlnUGF0aE9yT2JqZWN0ID09PSAnc3RyaW5nJyA/XG4gICAgICByZXF1aXJlKGNvbmZpZ1BhdGhPck9iamVjdCkgOiBjb25maWdQYXRoT3JPYmplY3Q7XG5cbiAgICBjb25zdCB7XG4gICAgICBhcHBsaWNhdGlvbklkLFxuICAgICAgaG9zdCxcbiAgICAgIHBvcnQsXG4gICAgICBrZXlzLFxuICAgICAgZmlsZXNEZXN0LFxuICAgICAgZmlsZXNTcmMsXG4gICAgICBjd2QsXG4gICAgICBwYXJhbXNcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgY29uc3Qge1xuICAgICAgYWNjZXNzS2V5LFxuICAgI