UNPKG

19.1 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6
7var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
8
9var _fs = require("fs");
10
11var _fs2 = _interopRequireDefault(_fs);
12
13var _path = require("path");
14
15var _path2 = _interopRequireDefault(_path);
16
17var _Credentials = require("./Credentials");
18
19var _Credentials2 = _interopRequireDefault(_Credentials);
20
21var _JwtGenerator = require("./JwtGenerator");
22
23var _JwtGenerator2 = _interopRequireDefault(_JwtGenerator);
24
25var _Message = require("./Message");
26
27var _Message2 = _interopRequireDefault(_Message);
28
29var _Voice = require("./Voice");
30
31var _Voice2 = _interopRequireDefault(_Voice);
32
33var _Number = require("./Number");
34
35var _Number2 = _interopRequireDefault(_Number);
36
37var _Verify = require("./Verify");
38
39var _Verify2 = _interopRequireDefault(_Verify);
40
41var _NumberInsight = require("./NumberInsight");
42
43var _NumberInsight2 = _interopRequireDefault(_NumberInsight);
44
45var _App = require("./App");
46
47var _App2 = _interopRequireDefault(_App);
48
49var _Account = require("./Account");
50
51var _Account2 = _interopRequireDefault(_Account);
52
53var _CallsResource = require("./CallsResource");
54
55var _CallsResource2 = _interopRequireDefault(_CallsResource);
56
57var _FilesResource = require("./FilesResource");
58
59var _FilesResource2 = _interopRequireDefault(_FilesResource);
60
61var _Conversion = require("./Conversion");
62
63var _Conversion2 = _interopRequireDefault(_Conversion);
64
65var _Media = require("./Media");
66
67var _Media2 = _interopRequireDefault(_Media);
68
69var _Redact = require("./Redact");
70
71var _Redact2 = _interopRequireDefault(_Redact);
72
73var _HttpClient = require("./HttpClient");
74
75var _HttpClient2 = _interopRequireDefault(_HttpClient);
76
77var _NullLogger = require("./NullLogger");
78
79var _NullLogger2 = _interopRequireDefault(_NullLogger);
80
81var _ConsoleLogger = require("./ConsoleLogger");
82
83var _ConsoleLogger2 = _interopRequireDefault(_ConsoleLogger);
84
85function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
86
87function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
88
89var jwtGeneratorInstance = new _JwtGenerator2.default();
90
91var Nexmo = function () {
92 /**
93 * @param {Credentials} credentials - Nexmo API credentials
94 * @param {string} credentials.apiKey - the Nexmo API key
95 * @param {string} credentials.apiSecret - the Nexmo API secret
96 * @param {Object} options - Additional options
97 * @param {boolean} options.debug - `true` to turn on debug logging
98 * @param {Object} options.logger - Set a custom logger.
99 * @param {string} options.appendToUserAgent - A value to append to the user agent.
100 * The value will be prefixed with a `/`
101 */
102 function Nexmo(credentials) {
103 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { debug: false };
104
105 _classCallCheck(this, Nexmo);
106
107 this.credentials = _Credentials2.default.parse(credentials);
108 this.options = options;
109
110 // If no logger has been supplied but debug has been set
111 // default to using the ConsoleLogger
112 if (!this.options.logger && this.options.debug) {
113 this.options.logger = new _ConsoleLogger2.default();
114 } else if (!this.options.logger) {
115 // Swallow the logging
116 this.options.logger = new _NullLogger2.default();
117 }
118
119 var userAgent = "nexmo-node/UNKNOWN node/UNKNOWN";
120 try {
121 var packageDetails = require(_path2.default.join(__dirname, "..", "package.json"));
122 userAgent = "nexmo-node/" + packageDetails.version + " node/" + process.version.replace("v", "");
123 } catch (e) {
124 console.warn("Could not load package details");
125 }
126 this.options.userAgent = userAgent;
127 if (this.options.appendToUserAgent) {
128 this.options.userAgent += " " + this.options.appendToUserAgent;
129 }
130
131 // This is legacy, everything should use rest or api going forward
132 this.options.httpClient = new _HttpClient2.default(Object.assign({ host: "rest.nexmo.com" }, this.options), this.credentials);
133
134 // We have two different hosts, so we use two different HttpClients
135 this.options.api = new _HttpClient2.default(Object.assign({ host: "api.nexmo.com" }, this.options), this.credentials);
136 this.options.rest = new _HttpClient2.default(Object.assign({ host: "rest.nexmo.com" }, this.options), this.credentials);
137
138 this.message = new _Message2.default(this.credentials, this.options);
139 this.voice = new _Voice2.default(this.credentials, this.options);
140 this.number = new _Number2.default(this.credentials, this.options);
141 this.verify = new _Verify2.default(this.credentials, this.options);
142 this.numberInsight = new _NumberInsight2.default(this.credentials, this.options);
143 this.applications = new _App2.default(this.credentials, this.options);
144 this.account = new _Account2.default(this.credentials, this.options);
145 this.calls = new _CallsResource2.default(this.credentials, this.options);
146 this.files = new _FilesResource2.default(this.credentials, this.options);
147 this.conversion = new _Conversion2.default(this.credentials, this.options);
148 this.media = new _Media2.default(this.credentials, this.options);
149 this.redact = new _Redact2.default(this.credentials, this.options);
150
151 /**
152 * @deprecated Please use nexmo.applications
153 */
154 this.app = this.applications;
155 }
156
157 /**
158 * Generate a JSON Web Token (JWT).
159 *
160 * The private key used upon Nexmo instance construction will be used to sign
161 * the JWT. The application_id you used upon Nexmo instance creation will be
162 * included in the claims for the JWT, however this can be overridden by passing
163 * an application_id as part of the claims.
164 *
165 * @param {Object} claims - name/value pair claims to sign within the JWT
166 *
167 * @returns {String} the generated token
168 */
169
170
171 _createClass(Nexmo, [{
172 key: "generateJwt",
173 value: function generateJwt() {
174 var claims = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
175
176 if (claims.application_id === undefined) {
177 claims.application_id = this.credentials.applicationId;
178 }
179 return Nexmo.generateJwt(this.credentials.privateKey, claims);
180 }
181 }]);
182
183 return Nexmo;
184}();
185
186/**
187 * Generate a JSON Web Token (JWT).
188 *
189 * @param {String|Buffer} privateKey - the path to the private key certificate
190 * to be used when signing the claims.
191 * @param {Object} claims - name/value pair claims to sign within the JWT
192 *
193 * @returns {String} the generated token
194 */
195
196
197Nexmo.generateJwt = function (privateKey, claims) {
198 if (!(privateKey instanceof Buffer)) {
199 if (!_fs2.default.existsSync(privateKey)) {
200 throw new Error("File \"" + privateKey + "\" not found.");
201 } else {
202 privateKey = _fs2.default.readFileSync(privateKey);
203 }
204 }
205 return jwtGeneratorInstance.generate(privateKey, claims);
206};
207
208exports.default = Nexmo;
209module.exports = exports["default"];
210//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9OZXhtby5qcyJdLCJuYW1lcyI6WyJqd3RHZW5lcmF0b3JJbnN0YW5jZSIsIk5leG1vIiwiY3JlZGVudGlhbHMiLCJvcHRpb25zIiwiZGVidWciLCJwYXJzZSIsImxvZ2dlciIsInVzZXJBZ2VudCIsInBhY2thZ2VEZXRhaWxzIiwicmVxdWlyZSIsImpvaW4iLCJfX2Rpcm5hbWUiLCJ2ZXJzaW9uIiwicHJvY2VzcyIsInJlcGxhY2UiLCJlIiwiY29uc29sZSIsIndhcm4iLCJhcHBlbmRUb1VzZXJBZ2VudCIsImh0dHBDbGllbnQiLCJPYmplY3QiLCJhc3NpZ24iLCJob3N0IiwiYXBpIiwicmVzdCIsIm1lc3NhZ2UiLCJ2b2ljZSIsIm51bWJlciIsInZlcmlmeSIsIm51bWJlckluc2lnaHQiLCJhcHBsaWNhdGlvbnMiLCJhY2NvdW50IiwiY2FsbHMiLCJmaWxlcyIsImNvbnZlcnNpb24iLCJtZWRpYSIsInJlZGFjdCIsImFwcCIsImNsYWltcyIsImFwcGxpY2F0aW9uX2lkIiwidW5kZWZpbmVkIiwiYXBwbGljYXRpb25JZCIsImdlbmVyYXRlSnd0IiwicHJpdmF0ZUtleSIsIkJ1ZmZlciIsImV4aXN0c1N5bmMiLCJFcnJvciIsInJlYWRGaWxlU3luYyIsImdlbmVyYXRlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBOzs7O0FBQ0E7Ozs7QUFFQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7OztBQUVBLElBQU1BLHVCQUF1Qiw0QkFBN0I7O0lBRU1DLEs7QUFDSjs7Ozs7Ozs7OztBQVVBLGlCQUFZQyxXQUFaLEVBQXFEO0FBQUEsUUFBNUJDLE9BQTRCLHVFQUFsQixFQUFFQyxPQUFPLEtBQVQsRUFBa0I7O0FBQUE7O0FBQ25ELFNBQUtGLFdBQUwsR0FBbUIsc0JBQVlHLEtBQVosQ0FBa0JILFdBQWxCLENBQW5CO0FBQ0EsU0FBS0MsT0FBTCxHQUFlQSxPQUFmOztBQUVBO0FBQ0E7QUFDQSxRQUFJLENBQUMsS0FBS0EsT0FBTCxDQUFhRyxNQUFkLElBQXdCLEtBQUtILE9BQUwsQ0FBYUMsS0FBekMsRUFBZ0Q7QUFDOUMsV0FBS0QsT0FBTCxDQUFhRyxNQUFiLEdBQXNCLDZCQUF0QjtBQUNELEtBRkQsTUFFTyxJQUFJLENBQUMsS0FBS0gsT0FBTCxDQUFhRyxNQUFsQixFQUEwQjtBQUMvQjtBQUNBLFdBQUtILE9BQUwsQ0FBYUcsTUFBYixHQUFzQiwwQkFBdEI7QUFDRDs7QUFFRCxRQUFJQyxZQUFZLGlDQUFoQjtBQUNBLFFBQUk7QUFDRixVQUFJQyxpQkFBaUJDLFFBQVEsZUFBS0MsSUFBTCxDQUFVQyxTQUFWLEVBQXFCLElBQXJCLEVBQTJCLGNBQTNCLENBQVIsQ0FBckI7QUFDQUosa0NBQ0VDLGVBQWVJLE9BRGpCLGNBRVNDLFFBQVFELE9BQVIsQ0FBZ0JFLE9BQWhCLENBQXdCLEdBQXhCLEVBQTZCLEVBQTdCLENBRlQ7QUFHRCxLQUxELENBS0UsT0FBT0MsQ0FBUCxFQUFVO0FBQ1ZDLGNBQVFDLElBQVIsQ0FBYSxnQ0FBYjtBQUNEO0FBQ0QsU0FBS2QsT0FBTCxDQUFhSSxTQUFiLEdBQXlCQSxTQUF6QjtBQUNBLFFBQUksS0FBS0osT0FBTCxDQUFhZSxpQkFBakIsRUFBb0M7QUFDbEMsV0FBS2YsT0FBTCxDQUFhSSxTQUFiLFVBQThCLEtBQUtKLE9BQUwsQ0FBYWUsaUJBQTNDO0FBQ0Q7O0FBRUQ7QUFDQSxTQUFLZixPQUFMLENBQWFnQixVQUFiLEdBQTBCLHlCQUN4QkMsT0FBT0MsTUFBUCxDQUFjLEVBQUVDLE1BQU0sZ0JBQVIsRUFBZCxFQUEwQyxLQUFLbkIsT0FBL0MsQ0FEd0IsRUFFeEIsS0FBS0QsV0FGbUIsQ0FBMUI7O0FBS0E7QUFDQSxTQUFLQyxPQUFMLENBQWFvQixHQUFiLEdBQW1CLHlCQUNqQkgsT0FBT0MsTUFBUCxDQUFjLEVBQUVDLE1BQU0sZUFBUixFQUFkLEVBQXlDLEtBQUtuQixPQUE5QyxDQURpQixFQUVqQixLQUFLRCxXQUZZLENBQW5CO0FBSUEsU0FBS0MsT0FBTCxDQUFhcUIsSUFBYixHQUFvQix5QkFDbEJKLE9BQU9DLE1BQVAsQ0FBYyxFQUFFQyxNQUFNLGdCQUFSLEVBQWQsRUFBMEMsS0FBS25CLE9BQS9DLENBRGtCLEVBRWxCLEtBQUtELFdBRmEsQ0FBcEI7O0FBS0EsU0FBS3VCLE9BQUwsR0FBZSxzQkFBWSxLQUFLdkIsV0FBakIsRUFBOEIsS0FBS0MsT0FBbkMsQ0FBZjtBQUNBLFNBQUt1QixLQUFMLEdBQWEsb0JBQVUsS0FBS3hCLFdBQWYsRUFBNEIsS0FBS0MsT0FBakMsQ0FBYjtBQUNBLFNBQUt3QixNQUFMLEdBQWMscUJBQVcsS0FBS3pCLFdBQWhCLEVBQTZCLEtBQUtDLE9BQWxDLENBQWQ7QUFDQSxTQUFLeUIsTUFBTCxHQUFjLHFCQUFXLEtBQUsxQixXQUFoQixFQUE2QixLQUFLQyxPQUFsQyxDQUFkO0FBQ0EsU0FBSzBCLGFBQUwsR0FBcUIsNEJBQWtCLEtBQUszQixXQUF2QixFQUFvQyxLQUFLQyxPQUF6QyxDQUFyQjtBQUNBLFNBQUsyQixZQUFMLEdBQW9CLGtCQUFRLEtBQUs1QixXQUFiLEVBQTBCLEtBQUtDLE9BQS9CLENBQXBCO0FBQ0EsU0FBSzRCLE9BQUwsR0FBZSxzQkFBWSxLQUFLN0IsV0FBakIsRUFBOEIsS0FBS0MsT0FBbkMsQ0FBZjtBQUNBLFNBQUs2QixLQUFMLEdBQWEsNEJBQWtCLEtBQUs5QixXQUF2QixFQUFvQyxLQUFLQyxPQUF6QyxDQUFiO0FBQ0EsU0FBSzhCLEtBQUwsR0FBYSw0QkFBa0IsS0FBSy9CLFdBQXZCLEVBQW9DLEtBQUtDLE9BQXpDLENBQWI7QUFDQSxTQUFLK0IsVUFBTCxHQUFrQix5QkFBZSxLQUFLaEMsV0FBcEIsRUFBaUMsS0FBS0MsT0FBdEMsQ0FBbEI7QUFDQSxTQUFLZ0MsS0FBTCxHQUFhLG9CQUFVLEtBQUtqQyxXQUFmLEVBQTRCLEtBQUtDLE9BQWpDLENBQWI7QUFDQSxTQUFLaUMsTUFBTCxHQUFjLHFCQUFXLEtBQUtsQyxXQUFoQixFQUE2QixLQUFLQyxPQUFsQyxDQUFkOztBQUVBOzs7QUFHQSxTQUFLa0MsR0FBTCxHQUFXLEtBQUtQLFlBQWhCO0FBQ0Q7O0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7a0NBWXlCO0FBQUEsVUFBYlEsTUFBYSx1RUFBSixFQUFJOztBQUN2QixVQUFJQSxPQUFPQyxjQUFQLEtBQTBCQyxTQUE5QixFQUF5QztBQUN2Q0YsZUFBT0MsY0FBUCxHQUF3QixLQUFLckMsV0FBTCxDQUFpQnVDLGFBQXpDO0FBQ0Q7QUFDRCxhQUFPeEMsTUFBTXlDLFdBQU4sQ0FBa0IsS0FBS3hDLFdBQUwsQ0FBaUJ5QyxVQUFuQyxFQUErQ0wsTUFBL0MsQ0FBUDtBQUNEOzs7Ozs7QUFHSDs7Ozs7Ozs7Ozs7QUFTQXJDLE1BQU15QyxXQUFOLEdBQW9CLFVBQUNDLFVBQUQsRUFBYUwsTUFBYixFQUF3QjtBQUMxQyxNQUFJLEVBQUVLLHNCQUFzQkMsTUFBeEIsQ0FBSixFQUFxQztBQUNuQyxRQUFJLENBQUMsYUFBR0MsVUFBSCxDQUFjRixVQUFkLENBQUwsRUFBZ0M7QUFDOUIsWUFBTSxJQUFJRyxLQUFKLGFBQW1CSCxVQUFuQixtQkFBTjtBQUNELEtBRkQsTUFFTztBQUNMQSxtQkFBYSxhQUFHSSxZQUFILENBQWdCSixVQUFoQixDQUFiO0FBQ0Q7QUFDRjtBQUNELFNBQU8zQyxxQkFBcUJnRCxRQUFyQixDQUE4QkwsVUFBOUIsRUFBMENMLE1BQTFDLENBQVA7QUFDRCxDQVREOztrQkFXZXJDLEsiLCJmaWxlIjoiTmV4bW8uanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgQ3JlZGVudGlhbHMgZnJvbSBcIi4vQ3JlZGVudGlhbHNcIjtcbmltcG9ydCBKd3RHZW5lcmF0b3IgZnJvbSBcIi4vSnd0R2VuZXJhdG9yXCI7XG5pbXBvcnQgTWVzc2FnZSBmcm9tIFwiLi9NZXNzYWdlXCI7XG5pbXBvcnQgVm9pY2UgZnJvbSBcIi4vVm9pY2VcIjtcbmltcG9ydCBOdW1iZXIgZnJvbSBcIi4vTnVtYmVyXCI7XG5pbXBvcnQgVmVyaWZ5IGZyb20gXCIuL1ZlcmlmeVwiO1xuaW1wb3J0IE51bWJlckluc2lnaHQgZnJvbSBcIi4vTnVtYmVySW5zaWdodFwiO1xuaW1wb3J0IEFwcCBmcm9tIFwiLi9BcHBcIjtcbmltcG9ydCBBY2NvdW50IGZyb20gXCIuL0FjY291bnRcIjtcbmltcG9ydCBDYWxsc1Jlc291cmNlIGZyb20gXCIuL0NhbGxzUmVzb3VyY2VcIjtcbmltcG9ydCBGaWxlc1Jlc291cmNlIGZyb20gXCIuL0ZpbGVzUmVzb3VyY2VcIjtcbmltcG9ydCBDb252ZXJzaW9uIGZyb20gXCIuL0NvbnZlcnNpb25cIjtcbmltcG9ydCBNZWRpYSBmcm9tIFwiLi9NZWRpYVwiO1xuaW1wb3J0IFJlZGFjdCBmcm9tIFwiLi9SZWRhY3RcIjtcbmltcG9ydCBIdHRwQ2xpZW50IGZyb20gXCIuL0h0dHBDbGllbnRcIjtcbmltcG9ydCBOdWxsTG9nZ2VyIGZyb20gXCIuL051bGxMb2dnZXJcIjtcbmltcG9ydCBDb25zb2xlTG9nZ2VyIGZyb20gXCIuL0NvbnNvbGVMb2dnZXJcIjtcblxuY29uc3Qgand0R2VuZXJhdG9ySW5zdGFuY2UgPSBuZXcgSnd0R2VuZXJhdG9yKCk7XG5cbmNsYXNzIE5leG1vIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7Q3JlZGVudGlhbHN9IGNyZWRlbnRpYWxzIC0gTmV4bW8gQVBJIGNyZWRlbnRpYWxzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjcmVkZW50aWFscy5hcGlLZXkgLSB0aGUgTmV4bW8gQVBJIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY3JlZGVudGlhbHMuYXBpU2VjcmV0IC0gdGhlIE5leG1vIEFQSSBzZWNyZXRcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBBZGRpdGlvbmFsIG9wdGlvbnNcbiAgICogQHBhcmFtIHtib29sZWFufSBvcHRpb25zLmRlYnVnIC0gYHRydWVgIHRvIHR1cm4gb24gZGVidWcgbG9nZ2luZ1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucy5sb2dnZXIgLSBTZXQgYSBjdXN0b20gbG9nZ2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5hcHBlbmRUb1VzZXJBZ2VudCAtIEEgdmFsdWUgdG8gYXBwZW5kIHRvIHRoZSB1c2VyIGFnZW50LlxuICAgKiAgICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlIHdpbGwgYmUgcHJlZml4ZWQgd2l0aCBhIGAvYFxuICAgKi9cbiAgY29uc3RydWN0b3IoY3JlZGVudGlhbHMsIG9wdGlvbnMgPSB7IGRlYnVnOiBmYWxzZSB9KSB7XG4gICAgdGhpcy5jcmVkZW50aWFscyA9IENyZWRlbnRpYWxzLnBhcnNlKGNyZWRlbnRpYWxzKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgLy8gSWYgbm8gbG9nZ2VyIGhhcyBiZWVuIHN1cHBsaWVkIGJ1dCBkZWJ1ZyBoYXMgYmVlbiBzZXRcbiAgICAvLyBkZWZhdWx0IHRvIHVzaW5nIHRoZSBDb25zb2xlTG9nZ2VyXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMubG9nZ2VyICYmIHRoaXMub3B0aW9ucy5kZWJ1Zykge1xuICAgICAgdGhpcy5vcHRpb25zLmxvZ2dlciA9IG5ldyBDb25zb2xlTG9nZ2VyKCk7XG4gICAgfSBlbHNlIGlmICghdGhpcy5vcHRpb25zLmxvZ2dlcikge1xuICAgICAgLy8gU3dhbGxvdyB0aGUgbG9nZ2luZ1xuICAgICAgdGhpcy5vcHRpb25zLmxvZ2dlciA9IG5ldyBOdWxsTG9nZ2VyKCk7XG4gICAgfVxuXG4gICAgbGV0IHVzZXJBZ2VudCA9IFwibmV4bW8tbm9kZS9VTktOT1dOIG5vZGUvVU5LTk9XTlwiO1xuICAgIHRyeSB7XG4gICAgICB2YXIgcGFja2FnZURldGFpbHMgPSByZXF1aXJlKHBhdGguam9pbihfX2Rpcm5hbWUsIFwiLi5cIiwgXCJwYWNrYWdlLmpzb25cIikpO1xuICAgICAgdXNlckFnZW50ID0gYG5leG1vLW5vZGUvJHtcbiAgICAgICAgcGFja2FnZURldGFpbHMudmVyc2lvblxuICAgICAgfSBub2RlLyR7cHJvY2Vzcy52ZXJzaW9uLnJlcGxhY2UoXCJ2XCIsIFwiXCIpfWA7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKFwiQ291bGQgbm90IGxvYWQgcGFja2FnZSBkZXRhaWxzXCIpO1xuICAgIH1cbiAgICB0aGlzLm9wdGlvbnMudXNlckFnZW50ID0gdXNlckFnZW50O1xuICAgIGlmICh0aGlzLm9wdGlvbnMuYXBwZW5kVG9Vc2VyQWdlbnQpIHtcbiAgICAgIHRoaXMub3B0aW9ucy51c2VyQWdlbnQgKz0gYCAke3RoaXMub3B0aW9ucy5hcHBlbmRUb1VzZXJBZ2VudH1gO1xuICAgIH1cblxuICAgIC8vIFRoaXMgaXMgbGVnYWN5LCBldmVyeXRoaW5nIHNob3VsZCB1c2UgcmVzdCBvciBhcGkgZ29pbmcgZm9yd2FyZFxuICAgIHRoaXMub3B0aW9ucy5odHRwQ2xpZW50ID0gbmV3IEh0dHBDbGllbnQoXG4gICAgICBPYmplY3QuYXNzaWduKHsgaG9zdDogXCJyZXN0Lm5leG1vLmNvbVwiIH0sIHRoaXMub3B0aW9ucyksXG4gICAgICB0aGlzLmNyZWRlbnRpYWxzXG4gICAgKTtcblxuICAgIC8vIFdlIGhhdmUgdHdvIGRpZmZlcmVudCBob3N0cywgc28gd2UgdXNlIHR3byBkaWZmZXJlbnQgSHR0cENsaWVudHNcbiAgICB0aGlzLm9wdGlvbnMuYXBpID0gbmV3IEh0dHBDbGllbnQoXG4gICAgICBPYmplY3QuYXNzaWduKHsgaG9zdDogXCJhcGkubmV4bW8uY29tXCIgfSwgdGhpcy5vcHRpb25zKSxcbiAgICAgIHRoaXMuY3JlZGVudGlhbHNcbiAgICApO1xuICAgIHRoaXMub3B0aW9ucy5yZXN0ID0gbmV3IEh0dHBDbGllbnQoXG4gICAgICBPYmplY3QuYXNzaWduKHsgaG9zdDogXCJyZXN0Lm5leG1vLmNvbVwiIH0sIHRoaXMub3B0aW9ucyksXG4gICAgICB0aGlzLmNyZWRlbnRpYWxzXG4gICAgKTtcblxuICAgIHRoaXMubWVzc2FnZSA9IG5ldyBNZXNzYWdlKHRoaXMuY3JlZGVudGlhbHMsIHRoaXMub3B0aW9ucyk7XG4gICAgdGhpcy52b2ljZSA9IG5ldyBWb2ljZSh0aGlzLmNyZWRlbnRpYWxzLCB0aGlzLm9wdGlvbnMpO1xuICAgIHRoaXMubnVtYmVyID0gbmV3IE51bWJlcih0aGlzLmNyZWRlbnRpYWxzLCB0aGlzLm9wdGlvbnMpO1xuICAgIHRoaXMudmVyaWZ5ID0gbmV3IFZlcmlmeSh0aGlzLmNyZWRlbnRpYWxzLCB0aGlzLm9wdGlvbnMpO1xuICAgIHRoaXMubnVtYmVySW5zaWdodCA9IG5ldyBOdW1iZXJJbnNpZ2h0KHRoaXMuY3JlZGVudGlhbHMsIHRoaXMub3B0aW9ucyk7XG4gICAgdGhpcy5hcHBsaWNhdGlvbnMgPSBuZXcgQXBwKHRoaXMuY3JlZGVudGlhbHMsIHRoaXMub3B0aW9ucyk7XG4gICAgdGhpcy5hY2NvdW50ID0gbmV3IEFjY291bnQodGhpcy5jcmVkZW50aWFscywgdGhpcy5vcHRpb25zKTtcbiAgICB0aGlzLmNhbGxzID0gbmV3IENhbGxzUmVzb3VyY2UodGhpcy5jcmVkZW50aWFscywgdGhpcy5vcHRpb25zKTtcbiAgICB0aGlzLmZpbGVzID0gbmV3IEZpbGVzUmVzb3VyY2UodGhpcy5jcmVkZW50aWFscywgdGhpcy5vcHRpb25zKTtcbiAgICB0aGlzLmNvbnZlcnNpb24gPSBuZXcgQ29udmVyc2lvbih0aGlzLmNyZWRlbnRpYWxzLCB0aGlzLm9wdGlvbnMpO1xuICAgIHRoaXMubWVkaWEgPSBuZXcgTWVkaWEodGhpcy5jcmVkZW50aWFscywgdGhpcy5vcHRpb25zKTtcbiAgICB0aGlzLnJlZGFjdCA9IG5ldyBSZWRhY3QodGhpcy5jcmVkZW50aWFscywgdGhpcy5vcHRpb25zKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgbmV4bW8uYXBwbGljYXRpb25zXG4gICAgICovXG4gICAgdGhpcy5hcHAgPSB0aGlzLmFwcGxpY2F0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIEpTT04gV2ViIFRva2VuIChKV1QpLlxuICAgKlxuICAgKiBUaGUgcHJpdmF0ZSBrZXkgdXNlZCB1cG9uIE5leG1vIGluc3RhbmNlIGNvbnN0cnVjdGlvbiB3aWxsIGJlIHVzZWQgdG8gc2lnblxuICAgKiB0aGUgSldULiBUaGUgYXBwbGljYXRpb25faWQgeW91IHVzZWQgdXBvbiBOZXhtbyBpbnN0YW5jZSBjcmVhdGlvbiB3aWxsIGJlXG4gICAqIGluY2x1ZGVkIGluIHRoZSBjbGFpbXMgZm9yIHRoZSBKV1QsIGhvd2V2ZXIgdGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBwYXNzaW5nXG4gICAqIGFuIGFwcGxpY2F0aW9uX2lkIGFzIHBhcnQgb2YgdGhlIGNsYWltcy5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IGNsYWltcyAtIG5hbWUvdmFsdWUgcGFpciBjbGFpbXMgdG8gc2lnbiB3aXRoaW4gdGhlIEpXVFxuICAgKlxuICAgKiBAcmV0dXJucyB7U3RyaW5nfSB0aGUgZ2VuZXJhdGVkIHRva2VuXG4gICAqL1xuICBnZW5lcmF0ZUp3dChjbGFpbXMgPSB7fSkge1xuICAgIGlmIChjbGFpbXMuYXBwbGljYXRpb25faWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xhaW1zLmFwcGxpY2F0aW9uX2lkID0gdGhpcy5jcmVkZW50aWFscy5hcHBsaWNhdGlvbklkO1xuICAgIH1cbiAgICByZXR1cm4gTmV4bW8uZ2VuZXJhdGVKd3QodGhpcy5jcmVkZW50aWFscy5wcml2YXRlS2V5LCBjbGFpbXMpO1xuICB9XG59XG5cbi8qKlxuICogR2VuZXJhdGUgYSBKU09OIFdlYiBUb2tlbiAoSldUKS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xCdWZmZXJ9IHByaXZhdGVLZXkgLSB0aGUgcGF0aCB0byB0aGUgcHJpdmF0ZSBrZXkgY2VydGlmaWNhdGVcbiAqICAgICAgICAgIHRvIGJlIHVzZWQgd2hlbiBzaWduaW5nIHRoZSBjbGFpbXMuXG4gKiBAcGFyYW0ge09iamVjdH0gY2xhaW1zIC0gbmFtZS92YWx1ZSBwYWlyIGNsYWltcyB0byBzaWduIHdpdGhpbiB0aGUgSldUXG4gKlxuICogQHJldHVybnMge1N0cmluZ30gdGhlIGdlbmVyYXRlZCB0b2tlblxuICovXG5OZXhtby5nZW5lcmF0ZUp3dCA9IChwcml2YXRlS2V5LCBjbGFpbXMpID0+IHtcbiAgaWYgKCEocHJpdmF0ZUtleSBpbnN0YW5jZW9mIEJ1ZmZlcikpIHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocHJpdmF0ZUtleSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBcIiR7cHJpdmF0ZUtleX1cIiBub3QgZm91bmQuYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByaXZhdGVLZXkgPSBmcy5yZWFkRmlsZVN5bmMocHJpdmF0ZUtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBqd3RHZW5lcmF0b3JJbnN0YW5jZS5nZW5lcmF0ZShwcml2YXRlS2V5LCBjbGFpbXMpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgTmV4bW87XG4iXX0=
\No newline at end of file