"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.HooksController = void 0; var triggers = _interopRequireWildcard(require("../triggers")); var Parse = _interopRequireWildcard(require("parse/node")); var _request = _interopRequireDefault(require("../request")); var _logger = require("../logger"); var _http = _interopRequireDefault(require("http")); var _https = _interopRequireDefault(require("https")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } // -disable-next // -disable-next const DefaultHooksCollectionName = '_Hooks'; const HTTPAgents = { http: new _http.default.Agent({ keepAlive: true }), https: new _https.default.Agent({ keepAlive: true }) }; class HooksController { constructor(applicationId, databaseController, webhookKey) { this._applicationId = applicationId; this._webhookKey = webhookKey; this.database = databaseController; } load() { return this._getHooks().then(hooks => { hooks = hooks || []; hooks.forEach(hook => { this.addHookToTriggers(hook); }); }); } getFunction(functionName) { return this._getHooks({ functionName: functionName }).then(results => results[0]); } getFunctions() { return this._getHooks({ functionName: { $exists: true } }); } getTrigger(className, triggerName) { return this._getHooks({ className: className, triggerName: triggerName }).then(results => results[0]); } getTriggers() { return this._getHooks({ className: { $exists: true }, triggerName: { $exists: true } }); } deleteFunction(functionName) { triggers.removeFunction(functionName, this._applicationId); return this._removeHooks({ functionName: functionName }); } deleteTrigger(className, triggerName) { triggers.removeTrigger(triggerName, className, this._applicationId); return this._removeHooks({ className: className, triggerName: triggerName }); } _getHooks(query = {}) { return this.database.find(DefaultHooksCollectionName, query).then(results => { return results.map(result => { delete result.objectId; return result; }); }); } _removeHooks(query) { return this.database.destroy(DefaultHooksCollectionName, query).then(() => { return Promise.resolve({}); }); } saveHook(hook) { var query; if (hook.functionName && hook.url) { query = { functionName: hook.functionName }; } else if (hook.triggerName && hook.className && hook.url) { query = { className: hook.className, triggerName: hook.triggerName }; } else { throw new Parse.Error(143, 'invalid hook declaration'); } return this.database.update(DefaultHooksCollectionName, query, hook, { upsert: true }).then(() => { return Promise.resolve(hook); }); } addHookToTriggers(hook) { var wrappedFunction = wrapToHTTPRequest(hook, this._webhookKey); wrappedFunction.url = hook.url; if (hook.className) { triggers.addTrigger(hook.triggerName, hook.className, wrappedFunction, this._applicationId); } else { triggers.addFunction(hook.functionName, wrappedFunction, null, this._applicationId); } } addHook(hook) { this.addHookToTriggers(hook); return this.saveHook(hook); } createOrUpdateHook(aHook) { var hook; if (aHook && aHook.functionName && aHook.url) { hook = {}; hook.functionName = aHook.functionName; hook.url = aHook.url; } else if (aHook && aHook.className && aHook.url && aHook.triggerName && triggers.Types[aHook.triggerName]) { hook = {}; hook.className = aHook.className; hook.url = aHook.url; hook.triggerName = aHook.triggerName; } else { throw new Parse.Error(143, 'invalid hook declaration'); } return this.addHook(hook); } createHook(aHook) { if (aHook.functionName) { return this.getFunction(aHook.functionName).then(result => { if (result) { throw new Parse.Error(143, `function name: ${aHook.functionName} already exists`); } else { return this.createOrUpdateHook(aHook); } }); } else if (aHook.className && aHook.triggerName) { return this.getTrigger(aHook.className, aHook.triggerName).then(result => { if (result) { throw new Parse.Error(143, `class ${aHook.className} already has trigger ${aHook.triggerName}`); } return this.createOrUpdateHook(aHook); }); } throw new Parse.Error(143, 'invalid hook declaration'); } updateHook(aHook) { if (aHook.functionName) { return this.getFunction(aHook.functionName).then(result => { if (result) { return this.createOrUpdateHook(aHook); } throw new Parse.Error(143, `no function named: ${aHook.functionName} is defined`); }); } else if (aHook.className && aHook.triggerName) { return this.getTrigger(aHook.className, aHook.triggerName).then(result => { if (result) { return this.createOrUpdateHook(aHook); } throw new Parse.Error(143, `class ${aHook.className} does not exist`); }); } throw new Parse.Error(143, 'invalid hook declaration'); } } exports.HooksController = HooksController; function wrapToHTTPRequest(hook, key) { return req => { const jsonBody = {}; for (var i in req) { jsonBody[i] = req[i]; } if (req.object) { jsonBody.object = req.object.toJSON(); jsonBody.object.className = req.object.className; } if (req.original) { jsonBody.original = req.original.toJSON(); jsonBody.original.className = req.original.className; } const jsonRequest = { url: hook.url, headers: { 'Content-Type': 'application/json' }, body: jsonBody, method: 'POST' }; const agent = hook.url.startsWith('https') ? HTTPAgents['https'] : HTTPAgents['http']; jsonRequest.agent = agent; if (key) { jsonRequest.headers['X-Parse-Webhook-Key'] = key; } else { _logger.logger.warn('Making outgoing webhook request without webhookKey being set!'); } return (0, _request.default)(jsonRequest).then(response => { let err; let result; let body = response.data; if (body) { if (typeof body === 'string') { try { body = JSON.parse(body); } catch (e) { err = { error: 'Malformed response', code: -1, partialResponse: body.substring(0, 100) }; } } if (!err) { result = body.success; err = body.error; } } if (err) { throw err; } else if (hook.triggerName === 'beforeSave') { if (typeof result === 'object') { delete result.createdAt; delete result.updatedAt; delete result.className; } return { object: result }; } else { return result; } }); }; } var _default = exports.default = HooksController; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ0cmlnZ2VycyIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwicmVxdWlyZSIsIlBhcnNlIiwiX3JlcXVlc3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX2xvZ2dlciIsIl9odHRwIiwiX2h0dHBzIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiV2Vha01hcCIsInIiLCJ0IiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiRGVmYXVsdEhvb2tzQ29sbGVjdGlvbk5hbWUiLCJIVFRQQWdlbnRzIiwiaHR0cCIsIkFnZW50Iiwia2VlcEFsaXZlIiwiaHR0cHMiLCJIb29rc0NvbnRyb2xsZXIiLCJjb25zdHJ1Y3RvciIsImFwcGxpY2F0aW9uSWQiLCJkYXRhYmFzZUNvbnRyb2xsZXIiLCJ3ZWJob29rS2V5IiwiX2FwcGxpY2F0aW9uSWQiLCJfd2ViaG9va0tleSIsImRhdGFiYXNlIiwibG9hZCIsIl9nZXRIb29rcyIsInRoZW4iLCJob29rcyIsImZvckVhY2giLCJob29rIiwiYWRkSG9va1RvVHJpZ2dlcnMiLCJnZXRGdW5jdGlvbiIsImZ1bmN0aW9uTmFtZSIsInJlc3VsdHMiLCJnZXRGdW5jdGlvbnMiLCIkZXhpc3RzIiwiZ2V0VHJpZ2dlciIsImNsYXNzTmFtZSIsInRyaWdnZXJOYW1lIiwiZ2V0VHJpZ2dlcnMiLCJkZWxldGVGdW5jdGlvbiIsInJlbW92ZUZ1bmN0aW9uIiwiX3JlbW92ZUhvb2tzIiwiZGVsZXRlVHJpZ2dlciIsInJlbW92ZVRyaWdnZXIiLCJxdWVyeSIsImZpbmQiLCJtYXAiLCJyZXN1bHQiLCJvYmplY3RJZCIsImRlc3Ryb3kiLCJQcm9taXNlIiwicmVzb2x2ZSIsInNhdmVIb29rIiwidXJsIiwiRXJyb3IiLCJ1cGRhdGUiLCJ1cHNlcnQiLCJ3cmFwcGVkRnVuY3Rpb24iLCJ3cmFwVG9IVFRQUmVxdWVzdCIsImFkZFRyaWdnZXIiLCJhZGRGdW5jdGlvbiIsImFkZEhvb2siLCJjcmVhdGVPclVwZGF0ZUhvb2siLCJhSG9vayIsIlR5cGVzIiwiY3JlYXRlSG9vayIsInVwZGF0ZUhvb2siLCJleHBvcnRzIiwia2V5IiwicmVxIiwianNvbkJvZHkiLCJvYmplY3QiLCJ0b0pTT04iLCJvcmlnaW5hbCIsImpzb25SZXF1ZXN0IiwiaGVhZGVycyIsImJvZHkiLCJtZXRob2QiLCJhZ2VudCIsInN0YXJ0c1dpdGgiLCJsb2dnZXIiLCJ3YXJuIiwicmVxdWVzdCIsInJlc3BvbnNlIiwiZXJyIiwiZGF0YSIsIkpTT04iLCJwYXJzZSIsImVycm9yIiwiY29kZSIsInBhcnRpYWxSZXNwb25zZSIsInN1YnN0cmluZyIsInN1Y2Nlc3MiLCJjcmVhdGVkQXQiLCJ1cGRhdGVkQXQiLCJfZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Db250cm9sbGVycy9Ib29rc0NvbnRyb2xsZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBmbG93IHdlYWsgKi9cblxuaW1wb3J0ICogYXMgdHJpZ2dlcnMgZnJvbSAnLi4vdHJpZ2dlcnMnO1xuLy8gQGZsb3ctZGlzYWJsZS1uZXh0XG5pbXBvcnQgKiBhcyBQYXJzZSBmcm9tICdwYXJzZS9ub2RlJztcbi8vIEBmbG93LWRpc2FibGUtbmV4dFxuaW1wb3J0IHJlcXVlc3QgZnJvbSAnLi4vcmVxdWVzdCc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IGh0dHAgZnJvbSAnaHR0cCc7XG5pbXBvcnQgaHR0cHMgZnJvbSAnaHR0cHMnO1xuXG5jb25zdCBEZWZhdWx0SG9va3NDb2xsZWN0aW9uTmFtZSA9ICdfSG9va3MnO1xuY29uc3QgSFRUUEFnZW50cyA9IHtcbiAgaHR0cDogbmV3IGh0dHAuQWdlbnQoeyBrZWVwQWxpdmU6IHRydWUgfSksXG4gIGh0dHBzOiBuZXcgaHR0cHMuQWdlbnQoeyBrZWVwQWxpdmU6IHRydWUgfSksXG59O1xuXG5leHBvcnQgY2xhc3MgSG9va3NDb250cm9sbGVyIHtcbiAgX2FwcGxpY2F0aW9uSWQ6IHN0cmluZztcbiAgX3dlYmhvb2tLZXk6IHN0cmluZztcbiAgZGF0YWJhc2U6IGFueTtcblxuICBjb25zdHJ1Y3RvcihhcHBsaWNhdGlvbklkOiBzdHJpbmcsIGRhdGFiYXNlQ29udHJvbGxlciwgd2ViaG9va0tleSkge1xuICAgIHRoaXMuX2FwcGxpY2F0aW9uSWQgPSBhcHBsaWNhdGlvbklkO1xuICAgIHRoaXMuX3dlYmhvb2tLZXkgPSB3ZWJob29rS2V5O1xuICAgIHRoaXMuZGF0YWJhc2UgPSBkYXRhYmFzZUNvbnRyb2xsZXI7XG4gIH1cblxuICBsb2FkKCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRIb29rcygpLnRoZW4oaG9va3MgPT4ge1xuICAgICAgaG9va3MgPSBob29rcyB8fCBbXTtcbiAgICAgIGhvb2tzLmZvckVhY2goaG9vayA9PiB7XG4gICAgICAgIHRoaXMuYWRkSG9va1RvVHJpZ2dlcnMoaG9vayk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldEZ1bmN0aW9uKGZ1bmN0aW9uTmFtZSkge1xuICAgIHJldHVybiB0aGlzLl9nZXRIb29rcyh7IGZ1bmN0aW9uTmFtZTogZnVuY3Rpb25OYW1lIH0pLnRoZW4ocmVzdWx0cyA9PiByZXN1bHRzWzBdKTtcbiAgfVxuXG4gIGdldEZ1bmN0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0SG9va3MoeyBmdW5jdGlvbk5hbWU6IHsgJGV4aXN0czogdHJ1ZSB9IH0pO1xuICB9XG5cbiAgZ2V0VHJpZ2dlcihjbGFzc05hbWUsIHRyaWdnZXJOYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldEhvb2tzKHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgICAgdHJpZ2dlck5hbWU6IHRyaWdnZXJOYW1lLFxuICAgIH0pLnRoZW4ocmVzdWx0cyA9PiByZXN1bHRzWzBdKTtcbiAgfVxuXG4gIGdldFRyaWdnZXJzKCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRIb29rcyh7XG4gICAgICBjbGFzc05hbWU6IHsgJGV4aXN0czogdHJ1ZSB9LFxuICAgICAgdHJpZ2dlck5hbWU6IHsgJGV4aXN0czogdHJ1ZSB9LFxuICAgIH0pO1xuICB9XG5cbiAgZGVsZXRlRnVuY3Rpb24oZnVuY3Rpb25OYW1lKSB7XG4gICAgdHJpZ2dlcnMucmVtb3ZlRnVuY3Rpb24oZnVuY3Rpb25OYW1lLCB0aGlzLl9hcHBsaWNhdGlvbklkKTtcbiAgICByZXR1cm4gdGhpcy5fcmVtb3ZlSG9va3MoeyBmdW5jdGlvbk5hbWU6IGZ1bmN0aW9uTmFtZSB9KTtcbiAgfVxuXG4gIGRlbGV0ZVRyaWdnZXIoY2xhc3NOYW1lLCB0cmlnZ2VyTmFtZSkge1xuICAgIHRyaWdnZXJzLnJlbW92ZVRyaWdnZXIodHJpZ2dlck5hbWUsIGNsYXNzTmFtZSwgdGhpcy5fYXBwbGljYXRpb25JZCk7XG4gICAgcmV0dXJuIHRoaXMuX3JlbW92ZUhvb2tzKHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgICAgdHJpZ2dlck5hbWU6IHRyaWdnZXJOYW1lLFxuICAgIH0pO1xuICB9XG5cbiAgX2dldEhvb2tzKHF1ZXJ5ID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5maW5kKERlZmF1bHRIb29rc0NvbGxlY3Rpb25OYW1lLCBxdWVyeSkudGhlbihyZXN1bHRzID0+IHtcbiAgICAgIHJldHVybiByZXN1bHRzLm1hcChyZXN1bHQgPT4ge1xuICAgICAgICBkZWxldGUgcmVzdWx0Lm9iamVjdElkO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBfcmVtb3ZlSG9va3MocXVlcnkpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5kZXN0cm95KERlZmF1bHRIb29rc0NvbGxlY3Rpb25OYW1lLCBxdWVyeSkudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHNhdmVIb29rKGhvb2spIHtcbiAgICB2YXIgcXVlcnk7XG4gICAgaWYgKGhvb2suZnVuY3Rpb25OYW1lICYmIGhvb2sudXJsKSB7XG4gICAgICBxdWVyeSA9IHsgZnVuY3Rpb25OYW1lOiBob29rLmZ1bmN0aW9uTmFtZSB9O1xuICAgIH0gZWxzZSBpZiAoaG9vay50cmlnZ2VyTmFtZSAmJiBob29rLmNsYXNzTmFtZSAmJiBob29rLnVybCkge1xuICAgICAgcXVlcnkgPSB7IGNsYXNzTmFtZTogaG9vay5jbGFzc05hbWUsIHRyaWdnZXJOYW1lOiBob29rLnRyaWdnZXJOYW1lIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcigxNDMsICdpbnZhbGlkIGhvb2sgZGVjbGFyYXRpb24nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZGF0YWJhc2VcbiAgICAgIC51cGRhdGUoRGVmYXVsdEhvb2tzQ29sbGVjdGlvbk5hbWUsIHF1ZXJ5LCBob29rLCB7IHVwc2VydDogdHJ1ZSB9KVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGhvb2spO1xuICAgICAgfSk7XG4gIH1cblxuICBhZGRIb29rVG9UcmlnZ2Vycyhob29rKSB7XG4gICAgdmFyIHdyYXBwZWRGdW5jdGlvbiA9IHdyYXBUb0hUVFBSZXF1ZXN0KGhvb2ssIHRoaXMuX3dlYmhvb2tLZXkpO1xuICAgIHdyYXBwZWRGdW5jdGlvbi51cmwgPSBob29rLnVybDtcbiAgICBpZiAoaG9vay5jbGFzc05hbWUpIHtcbiAgICAgIHRyaWdnZXJzLmFkZFRyaWdnZXIoaG9vay50cmlnZ2VyTmFtZSwgaG9vay5jbGFzc05hbWUsIHdyYXBwZWRGdW5jdGlvbiwgdGhpcy5fYXBwbGljYXRpb25JZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyaWdnZXJzLmFkZEZ1bmN0aW9uKGhvb2suZnVuY3Rpb25OYW1lLCB3cmFwcGVkRnVuY3Rpb24sIG51bGwsIHRoaXMuX2FwcGxpY2F0aW9uSWQpO1xuICAgIH1cbiAgfVxuXG4gIGFkZEhvb2soaG9vaykge1xuICAgIHRoaXMuYWRkSG9va1RvVHJpZ2dlcnMoaG9vayk7XG4gICAgcmV0dXJuIHRoaXMuc2F2ZUhvb2soaG9vayk7XG4gIH1cblxuICBjcmVhdGVPclVwZGF0ZUhvb2soYUhvb2spIHtcbiAgICB2YXIgaG9vaztcbiAgICBpZiAoYUhvb2sgJiYgYUhvb2suZnVuY3Rpb25OYW1lICYmIGFIb29rLnVybCkge1xuICAgICAgaG9vayA9IHt9O1xuICAgICAgaG9vay5mdW5jdGlvbk5hbWUgPSBhSG9vay5mdW5jdGlvbk5hbWU7XG4gICAgICBob29rLnVybCA9IGFIb29rLnVybDtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgYUhvb2sgJiZcbiAgICAgIGFIb29rLmNsYXNzTmFtZSAmJlxuICAgICAgYUhvb2sudXJsICYmXG4gICAgICBhSG9vay50cmlnZ2VyTmFtZSAmJlxuICAgICAgdHJpZ2dlcnMuVHlwZXNbYUhvb2sudHJpZ2dlck5hbWVdXG4gICAgKSB7XG4gICAgICBob29rID0ge307XG4gICAgICBob29rLmNsYXNzTmFtZSA9IGFIb29rLmNsYXNzTmFtZTtcbiAgICAgIGhvb2sudXJsID0gYUhvb2sudXJsO1xuICAgICAgaG9vay50cmlnZ2VyTmFtZSA9IGFIb29rLnRyaWdnZXJOYW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoMTQzLCAnaW52YWxpZCBob29rIGRlY2xhcmF0aW9uJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYWRkSG9vayhob29rKTtcbiAgfVxuXG4gIGNyZWF0ZUhvb2soYUhvb2spIHtcbiAgICBpZiAoYUhvb2suZnVuY3Rpb25OYW1lKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRGdW5jdGlvbihhSG9vay5mdW5jdGlvbk5hbWUpLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcigxNDMsIGBmdW5jdGlvbiBuYW1lOiAke2FIb29rLmZ1bmN0aW9uTmFtZX0gYWxyZWFkeSBleGlzdHNgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVPclVwZGF0ZUhvb2soYUhvb2spO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGFIb29rLmNsYXNzTmFtZSAmJiBhSG9vay50cmlnZ2VyTmFtZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0VHJpZ2dlcihhSG9vay5jbGFzc05hbWUsIGFIb29rLnRyaWdnZXJOYW1lKS50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICAxNDMsXG4gICAgICAgICAgICBgY2xhc3MgJHthSG9vay5jbGFzc05hbWV9IGFscmVhZHkgaGFzIHRyaWdnZXIgJHthSG9vay50cmlnZ2VyTmFtZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVPclVwZGF0ZUhvb2soYUhvb2spO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKDE0MywgJ2ludmFsaWQgaG9vayBkZWNsYXJhdGlvbicpO1xuICB9XG5cbiAgdXBkYXRlSG9vayhhSG9vaykge1xuICAgIGlmIChhSG9vay5mdW5jdGlvbk5hbWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEZ1bmN0aW9uKGFIb29rLmZ1bmN0aW9uTmFtZSkudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlT3JVcGRhdGVIb29rKGFIb29rKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoMTQzLCBgbm8gZnVuY3Rpb24gbmFtZWQ6ICR7YUhvb2suZnVuY3Rpb25OYW1lfSBpcyBkZWZpbmVkYCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGFIb29rLmNsYXNzTmFtZSAmJiBhSG9vay50cmlnZ2VyTmFtZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0VHJpZ2dlcihhSG9vay5jbGFzc05hbWUsIGFIb29rLnRyaWdnZXJOYW1lKS50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVPclVwZGF0ZUhvb2soYUhvb2spO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcigxNDMsIGBjbGFzcyAke2FIb29rLmNsYXNzTmFtZX0gZG9lcyBub3QgZXhpc3RgKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoMTQzLCAnaW52YWxpZCBob29rIGRlY2xhcmF0aW9uJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gd3JhcFRvSFRUUFJlcXVlc3QoaG9vaywga2V5KSB7XG4gIHJldHVybiByZXEgPT4ge1xuICAgIGNvbnN0IGpzb25Cb2R5ID0ge307XG4gICAgZm9yICh2YXIgaSBpbiByZXEpIHtcbiAgICAgIGpzb25Cb2R5W2ldID0gcmVxW2ldO1xuICAgIH1cbiAgICBpZiAocmVxLm9iamVjdCkge1xuICAgICAganNvbkJvZHkub2JqZWN0ID0gcmVxLm9iamVjdC50b0pTT04oKTtcbiAgICAgIGpzb25Cb2R5Lm9iamVjdC5jbGFzc05hbWUgPSByZXEub2JqZWN0LmNsYXNzTmFtZTtcbiAgICB9XG4gICAgaWYgKHJlcS5vcmlnaW5hbCkge1xuICAgICAganNvbkJvZHkub3JpZ2luYWwgPSByZXEub3JpZ2luYWwudG9KU09OKCk7XG4gICAgICBqc29uQm9keS5vcmlnaW5hbC5jbGFzc05hbWUgPSByZXEub3JpZ2luYWwuY2xhc3NOYW1lO1xuICAgIH1cbiAgICBjb25zdCBqc29uUmVxdWVzdDogYW55ID0ge1xuICAgICAgdXJsOiBob29rLnVybCxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIH0sXG4gICAgICBib2R5OiBqc29uQm9keSxcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIH07XG5cbiAgICBjb25zdCBhZ2VudCA9IGhvb2sudXJsLnN0YXJ0c1dpdGgoJ2h0dHBzJykgPyBIVFRQQWdlbnRzWydodHRwcyddIDogSFRUUEFnZW50c1snaHR0cCddO1xuICAgIGpzb25SZXF1ZXN0LmFnZW50ID0gYWdlbnQ7XG5cbiAgICBpZiAoa2V5KSB7XG4gICAgICBqc29uUmVxdWVzdC5oZWFkZXJzWydYLVBhcnNlLVdlYmhvb2stS2V5J10gPSBrZXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci53YXJuKCdNYWtpbmcgb3V0Z29pbmcgd2ViaG9vayByZXF1ZXN0IHdpdGhvdXQgd2ViaG9va0tleSBiZWluZyBzZXQhJyk7XG4gICAgfVxuICAgIHJldHVybiByZXF1ZXN0KGpzb25SZXF1ZXN0KS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgIGxldCBlcnI7XG4gICAgICBsZXQgcmVzdWx0O1xuICAgICAgbGV0IGJvZHkgPSByZXNwb25zZS5kYXRhO1xuICAgICAgaWYgKGJvZHkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBib2R5ID0gSlNPTi5wYXJzZShib2R5KTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBlcnIgPSB7XG4gICAgICAgICAgICAgIGVycm9yOiAnTWFsZm9ybWVkIHJlc3BvbnNlJyxcbiAgICAgICAgICAgICAgY29kZTogLTEsXG4gICAgICAgICAgICAgIHBhcnRpYWxSZXNwb25zZTogYm9keS5zdWJzdHJpbmcoMCwgMTAwKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghZXJyKSB7XG4gICAgICAgICAgcmVzdWx0ID0gYm9keS5zdWNjZXNzO1xuICAgICAgICAgIGVyciA9IGJvZHkuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfSBlbHNlIGlmIChob29rLnRyaWdnZXJOYW1lID09PSAnYmVmb3JlU2F2ZScpIHtcbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgZGVsZXRlIHJlc3VsdC5jcmVhdGVkQXQ7XG4gICAgICAgICAgZGVsZXRlIHJlc3VsdC51cGRhdGVkQXQ7XG4gICAgICAgICAgZGVsZXRlIHJlc3VsdC5jbGFzc05hbWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgb2JqZWN0OiByZXN1bHQgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IEhvb2tzQ29udHJvbGxlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBRUEsSUFBQUEsUUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUMsS0FBQSxHQUFBRix1QkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUUsUUFBQSxHQUFBQyxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUksT0FBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssS0FBQSxHQUFBRixzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQU0sTUFBQSxHQUFBSCxzQkFBQSxDQUFBSCxPQUFBO0FBQTBCLFNBQUFHLHVCQUFBSSxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBO0FBQUEsU0FBQUcseUJBQUFILENBQUEsNkJBQUFJLE9BQUEsbUJBQUFDLENBQUEsT0FB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