@cloudbase/oauth 2.5.49-beta.3 → 2.5.49-beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,62 +1,24 @@
1
1
  'use strict';
2
- var __assign = (this && this.__assign) || function () {
3
- __assign = Object.assign || function(t) {
4
- for (var s, i = 1, n = arguments.length; i < n; i++) {
5
- s = arguments[i];
6
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
- t[p] = s[p];
8
- }
9
- return t;
10
- };
11
- return __assign.apply(this, arguments);
12
- };
13
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
- return new (P || (P = Promise))(function (resolve, reject) {
16
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
- step((generator = generator.apply(thisArg, _arguments || [])).next());
20
- });
21
- };
22
- var __generator = (this && this.__generator) || function (thisArg, body) {
23
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
- function verb(n) { return function (v) { return step([n, v]); }; }
26
- function step(op) {
27
- if (f) throw new TypeError("Generator is already executing.");
28
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
29
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
- if (y = 0, t) op = [op[0] & 2, t.value];
31
- switch (op[0]) {
32
- case 0: case 1: t = op; break;
33
- case 4: _.label++; return { value: op[1], done: false };
34
- case 5: _.label++; y = op[1]; op = [0]; continue;
35
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
- default:
37
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
- if (t[2]) _.ops.pop();
42
- _.trys.pop(); continue;
43
- }
44
- op = body.call(thisArg, _);
45
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
- }
48
- };
49
2
  import { ApiUrls, ApiUrlsV2 } from './consts';
50
3
  import { OAuth2Client, defaultStorage } from '../oauth2client/oauth2client';
51
4
  import { Captcha } from '../captcha/captcha';
52
5
  import { deepClone } from '../utils';
53
6
  import { getEncryptInfo } from '../utils/encrypt';
54
- var Auth = (function () {
55
- function Auth(opts) {
56
- var request = opts.request;
57
- var oAuth2Client = opts.credentialsClient;
7
+ export class Auth {
8
+ static parseParamsToSearch(params) {
9
+ Object.keys(params).forEach((key) => {
10
+ if (!params[key]) {
11
+ delete params[key];
12
+ }
13
+ });
14
+ const searchParams = new URLSearchParams(params);
15
+ return searchParams.toString();
16
+ }
17
+ constructor(opts) {
18
+ let { request } = opts;
19
+ let oAuth2Client = opts.credentialsClient;
58
20
  if (!oAuth2Client) {
59
- var initOptions = {
21
+ const initOptions = {
60
22
  apiOrigin: opts.apiOrigin,
61
23
  clientId: opts.clientId,
62
24
  storage: opts.storage,
@@ -68,809 +30,470 @@ var Auth = (function () {
68
30
  oAuth2Client = new OAuth2Client(initOptions);
69
31
  }
70
32
  if (!request) {
71
- var baseRequest = oAuth2Client.request.bind(oAuth2Client);
72
- var captcha = new Captcha(__assign({ clientId: opts.clientId, request: baseRequest, storage: opts.storage }, opts.captchaOptions));
33
+ const baseRequest = oAuth2Client.request.bind(oAuth2Client);
34
+ const captcha = new Captcha({
35
+ clientId: opts.clientId,
36
+ request: baseRequest,
37
+ storage: opts.storage,
38
+ ...opts.captchaOptions,
39
+ });
73
40
  request = captcha.request.bind(captcha);
74
41
  }
75
42
  this.config = {
76
43
  env: opts.env,
77
44
  apiOrigin: opts.apiOrigin,
78
45
  clientId: opts.clientId,
79
- request: request,
46
+ request,
80
47
  credentialsClient: oAuth2Client,
81
48
  storage: opts.storage || defaultStorage,
82
49
  };
83
50
  }
84
- Auth.parseParamsToSearch = function (params) {
85
- Object.keys(params).forEach(function (key) {
86
- if (!params[key]) {
87
- delete params[key];
88
- }
89
- });
90
- var searchParams = new URLSearchParams(params);
91
- return searchParams.toString();
92
- };
93
- Auth.prototype.getParamsByVersion = function (params, key) {
94
- var _a;
95
- var paramsTemp = deepClone(params);
96
- var url = ((_a = { v2: ApiUrlsV2 }[paramsTemp === null || paramsTemp === void 0 ? void 0 : paramsTemp.version]) === null || _a === void 0 ? void 0 : _a[key]) || ApiUrls[key];
51
+ getParamsByVersion(params, key) {
52
+ const paramsTemp = deepClone(params);
53
+ const url = { v2: ApiUrlsV2 }[paramsTemp?.version]?.[key] || ApiUrls[key];
97
54
  if (paramsTemp) {
98
55
  delete paramsTemp.version;
99
56
  }
100
- return { params: paramsTemp, url: url };
101
- };
102
- Auth.prototype.signIn = function (params) {
103
- return __awaiter(this, void 0, void 0, function () {
104
- var version, res, body, credentials;
105
- return __generator(this, function (_a) {
106
- switch (_a.label) {
107
- case 0:
108
- version = params.version || 'v1';
109
- res = this.getParamsByVersion(params, 'AUTH_SIGN_IN_URL');
110
- if (res.params.query) {
111
- delete res.params.query;
112
- }
113
- return [4, this.getEncryptParams(res.params)];
114
- case 1:
115
- body = _a.sent();
116
- return [4, this.config.request(res.url, {
117
- method: 'POST',
118
- body: body,
119
- })];
120
- case 2:
121
- credentials = _a.sent();
122
- return [4, this.config.credentialsClient.setCredentials(__assign(__assign({}, credentials), { version: version }))];
123
- case 3:
124
- _a.sent();
125
- return [2, Promise.resolve(credentials)];
126
- }
127
- });
128
- });
129
- };
130
- Auth.prototype.signInAnonymously = function (data) {
131
- if (data === void 0) { data = {}; }
132
- return __awaiter(this, void 0, void 0, function () {
133
- var credentials;
134
- return __generator(this, function (_a) {
135
- switch (_a.label) {
136
- case 0: return [4, this.config.request(ApiUrls.AUTH_SIGN_IN_ANONYMOUSLY_URL, {
137
- method: 'POST',
138
- body: data,
139
- })];
140
- case 1:
141
- credentials = _a.sent();
142
- return [4, this.config.credentialsClient.setCredentials(credentials)];
143
- case 2:
144
- _a.sent();
145
- return [2, Promise.resolve(credentials)];
146
- }
147
- });
148
- });
149
- };
150
- Auth.prototype.signUp = function (params) {
151
- return __awaiter(this, void 0, void 0, function () {
152
- var data;
153
- return __generator(this, function (_a) {
154
- switch (_a.label) {
155
- case 0: return [4, this.config.request(ApiUrls.AUTH_SIGN_UP_URL, {
156
- method: 'POST',
157
- body: params,
158
- })];
159
- case 1:
160
- data = _a.sent();
161
- return [4, this.config.credentialsClient.setCredentials(data)];
162
- case 2:
163
- _a.sent();
164
- return [2, Promise.resolve(data)];
165
- }
166
- });
167
- });
168
- };
169
- Auth.prototype.signOut = function () {
170
- return __awaiter(this, void 0, void 0, function () {
171
- var accessToken, data;
172
- return __generator(this, function (_a) {
173
- switch (_a.label) {
174
- case 0: return [4, this.config.credentialsClient.getAccessToken()];
175
- case 1:
176
- accessToken = _a.sent();
177
- return [4, this.config.request(ApiUrls.AUTH_REVOKE_URL, {
178
- method: 'POST',
179
- body: {
180
- token: accessToken,
181
- },
182
- })];
183
- case 2:
184
- data = _a.sent();
185
- return [4, this.config.credentialsClient.setCredentials()];
186
- case 3:
187
- _a.sent();
188
- return [2, Promise.resolve(data)];
189
- }
190
- });
57
+ return { params: paramsTemp, url };
58
+ }
59
+ async signIn(params) {
60
+ const version = params.version || 'v1';
61
+ const res = this.getParamsByVersion(params, 'AUTH_SIGN_IN_URL');
62
+ if (res.params.query) {
63
+ delete res.params.query;
64
+ }
65
+ const body = await this.getEncryptParams(res.params);
66
+ const credentials = await this.config.request(res.url, {
67
+ method: 'POST',
68
+ body,
191
69
  });
192
- };
193
- Auth.prototype.revokeAllDevices = function () {
194
- return __awaiter(this, void 0, void 0, function () {
195
- return __generator(this, function (_a) {
196
- switch (_a.label) {
197
- case 0: return [4, this.config.request(ApiUrls.AUTH_REVOKE_ALL_URL, {
198
- method: 'DELETE',
199
- withCredentials: true,
200
- })];
201
- case 1:
202
- _a.sent();
203
- return [2];
204
- }
205
- });
70
+ await this.config.credentialsClient.setCredentials({
71
+ ...credentials,
72
+ version,
206
73
  });
207
- };
208
- Auth.prototype.revokeDevice = function (params) {
209
- return __awaiter(this, void 0, void 0, function () {
210
- return __generator(this, function (_a) {
211
- switch (_a.label) {
212
- case 0: return [4, this.config.request(ApiUrls.AUTHORIZED_DEVICES_DELETE_URL + params.device_id, {
213
- method: 'DELETE',
214
- withCredentials: true,
215
- })];
216
- case 1:
217
- _a.sent();
218
- return [2];
219
- }
220
- });
74
+ return Promise.resolve(credentials);
75
+ }
76
+ async signInAnonymously(data = {}) {
77
+ const credentials = await this.config.request(ApiUrls.AUTH_SIGN_IN_ANONYMOUSLY_URL, {
78
+ method: 'POST',
79
+ body: data,
221
80
  });
222
- };
223
- Auth.prototype.getVerification = function (params) {
224
- return __awaiter(this, void 0, void 0, function () {
225
- var withCredentials, hasLogin;
226
- return __generator(this, function (_a) {
227
- switch (_a.label) {
228
- case 0:
229
- withCredentials = false;
230
- if (!(params.target === 'CUR_USER')) return [3, 1];
231
- withCredentials = true;
232
- return [3, 3];
233
- case 1: return [4, this.hasLoginState()];
234
- case 2:
235
- hasLogin = _a.sent();
236
- if (hasLogin) {
237
- withCredentials = true;
238
- }
239
- _a.label = 3;
240
- case 3: return [2, this.config.request(ApiUrls.VERIFICATION_URL, {
241
- method: 'POST',
242
- body: params,
243
- withCredentials: withCredentials,
244
- })];
245
- }
246
- });
81
+ await this.config.credentialsClient.setCredentials(credentials);
82
+ return Promise.resolve(credentials);
83
+ }
84
+ async signUp(params) {
85
+ const data = await this.config.request(ApiUrls.AUTH_SIGN_UP_URL, {
86
+ method: 'POST',
87
+ body: params,
247
88
  });
248
- };
249
- Auth.prototype.verify = function (params) {
250
- return __awaiter(this, void 0, void 0, function () {
251
- var res, data;
252
- return __generator(this, function (_a) {
253
- switch (_a.label) {
254
- case 0:
255
- res = this.getParamsByVersion(params, 'VERIFY_URL');
256
- return [4, this.config.request(res.url, {
257
- method: 'POST',
258
- body: res.params,
259
- })];
260
- case 1:
261
- data = _a.sent();
262
- if (!((params === null || params === void 0 ? void 0 : params.version) === 'v2')) return [3, 3];
263
- return [4, this.config.credentialsClient.setCredentials(__assign(__assign({}, data), { version: 'v2' }))];
264
- case 2:
265
- _a.sent();
266
- _a.label = 3;
267
- case 3: return [2, data];
268
- }
269
- });
89
+ await this.config.credentialsClient.setCredentials(data);
90
+ return Promise.resolve(data);
91
+ }
92
+ async signOut() {
93
+ const accessToken = await this.config.credentialsClient.getAccessToken();
94
+ const data = await this.config.request(ApiUrls.AUTH_REVOKE_URL, {
95
+ method: 'POST',
96
+ body: {
97
+ token: accessToken,
98
+ },
99
+ });
100
+ await this.config.credentialsClient.setCredentials();
101
+ return Promise.resolve(data);
102
+ }
103
+ async revokeAllDevices() {
104
+ await this.config.request(ApiUrls.AUTH_REVOKE_ALL_URL, {
105
+ method: 'DELETE',
106
+ withCredentials: true,
270
107
  });
271
- };
272
- Auth.prototype.genProviderRedirectUri = function (params) {
273
- return __awaiter(this, void 0, void 0, function () {
274
- var url, otherParams;
275
- return __generator(this, function (_a) {
276
- url = "".concat(ApiUrls.PROVIDER_URI_URL, "?client_id=").concat(this.config.clientId, "&provider_id=").concat(params.provider_id, "&redirect_uri=").concat(encodeURIComponent(params.provider_redirect_uri), "&state=").concat(params.state);
277
- otherParams = params.other_params;
278
- if (otherParams) {
279
- if (typeof otherParams.sign_out_uri === 'string' && otherParams.sign_out_uri.length > 0) {
280
- url += "&other_params[sign_out_uri]=".concat(otherParams.sign_out_uri);
281
- }
282
- }
283
- return [2, this.config.request(url, {
284
- method: 'GET',
285
- })];
286
- });
108
+ }
109
+ async revokeDevice(params) {
110
+ await this.config.request(ApiUrls.AUTHORIZED_DEVICES_DELETE_URL + params.device_id, {
111
+ method: 'DELETE',
112
+ withCredentials: true,
287
113
  });
288
- };
289
- Auth.prototype.grantProviderToken = function (params, useWxCloud) {
290
- if (useWxCloud === void 0) { useWxCloud = false; }
291
- return __awaiter(this, void 0, void 0, function () {
292
- return __generator(this, function (_a) {
293
- return [2, this.config.request(ApiUrls.PROVIDER_TOKEN_URL, {
294
- method: 'POST',
295
- body: params,
296
- useWxCloud: useWxCloud,
297
- })];
298
- });
114
+ }
115
+ async getVerification(params) {
116
+ let withCredentials = false;
117
+ if (params.target === 'CUR_USER') {
118
+ withCredentials = true;
119
+ }
120
+ else {
121
+ const hasLogin = await this.hasLoginState();
122
+ if (hasLogin) {
123
+ withCredentials = true;
124
+ }
125
+ }
126
+ return this.config.request(ApiUrls.VERIFICATION_URL, {
127
+ method: 'POST',
128
+ body: params,
129
+ withCredentials,
299
130
  });
300
- };
301
- Auth.prototype.patchProviderToken = function (params) {
302
- return __awaiter(this, void 0, void 0, function () {
303
- return __generator(this, function (_a) {
304
- return [2, this.config.request(ApiUrls.PROVIDER_TOKEN_URL, {
305
- method: 'PATCH',
306
- body: params,
307
- })];
308
- });
131
+ }
132
+ async verify(params) {
133
+ const res = this.getParamsByVersion(params, 'VERIFY_URL');
134
+ const data = await this.config.request(res.url, {
135
+ method: 'POST',
136
+ body: res.params,
309
137
  });
310
- };
311
- Auth.prototype.signInWithProvider = function (params, useWxCloud) {
312
- if (useWxCloud === void 0) { useWxCloud = false; }
313
- return __awaiter(this, void 0, void 0, function () {
314
- var res, credentials;
315
- return __generator(this, function (_a) {
316
- switch (_a.label) {
317
- case 0:
318
- res = this.getParamsByVersion(params, 'AUTH_SIGN_IN_WITH_PROVIDER_URL');
319
- return [4, this.config.request(res.url, {
320
- method: 'POST',
321
- body: res.params,
322
- useWxCloud: useWxCloud,
323
- })];
324
- case 1:
325
- credentials = _a.sent();
326
- return [4, this.config.credentialsClient.setCredentials(__assign(__assign({}, credentials), { version: (params === null || params === void 0 ? void 0 : params.version) || 'v1' }))];
327
- case 2:
328
- _a.sent();
329
- return [2, Promise.resolve(credentials)];
330
- }
138
+ if (params?.version === 'v2') {
139
+ await this.config.credentialsClient.setCredentials({
140
+ ...data,
141
+ version: 'v2',
331
142
  });
143
+ }
144
+ return data;
145
+ }
146
+ async genProviderRedirectUri(params) {
147
+ let url = `${ApiUrls.PROVIDER_URI_URL}?client_id=${this.config.clientId}&provider_id=${params.provider_id}&redirect_uri=${encodeURIComponent(params.provider_redirect_uri)}&state=${params.state}`;
148
+ const { other_params: otherParams } = params;
149
+ if (otherParams) {
150
+ if (typeof otherParams.sign_out_uri === 'string' && otherParams.sign_out_uri.length > 0) {
151
+ url += `&other_params[sign_out_uri]=${otherParams.sign_out_uri}`;
152
+ }
153
+ }
154
+ return this.config.request(url, {
155
+ method: 'GET',
332
156
  });
333
- };
334
- Auth.prototype.signInWithWechat = function (params) {
335
- if (params === void 0) { params = {}; }
336
- return __awaiter(this, void 0, void 0, function () {
337
- var credentials;
338
- return __generator(this, function (_a) {
339
- switch (_a.label) {
340
- case 0: return [4, this.config.request(ApiUrls.AUTH_SIGN_IN_WITH_WECHAT_URL, {
341
- method: 'POST',
342
- body: params,
343
- })];
344
- case 1:
345
- credentials = _a.sent();
346
- return [4, this.config.credentialsClient.setCredentials(credentials)];
347
- case 2:
348
- _a.sent();
349
- return [2, Promise.resolve(credentials)];
350
- }
351
- });
157
+ }
158
+ async grantProviderToken(params, useWxCloud = false) {
159
+ return this.config.request(ApiUrls.PROVIDER_TOKEN_URL, {
160
+ method: 'POST',
161
+ body: params,
162
+ useWxCloud,
352
163
  });
353
- };
354
- Auth.prototype.bindWithProvider = function (params) {
355
- return __awaiter(this, void 0, void 0, function () {
356
- return __generator(this, function (_a) {
357
- return [2, this.config.request(ApiUrls.PROVIDER_BIND_URL, {
358
- method: 'POST',
359
- body: params,
360
- withCredentials: true,
361
- })];
362
- });
164
+ }
165
+ async patchProviderToken(params) {
166
+ return this.config.request(ApiUrls.PROVIDER_TOKEN_URL, {
167
+ method: 'PATCH',
168
+ body: params,
363
169
  });
364
- };
365
- Auth.prototype.getUserProfile = function (params) {
366
- return __awaiter(this, void 0, void 0, function () {
367
- return __generator(this, function (_a) {
368
- return [2, this.getUserInfo(params)];
369
- });
170
+ }
171
+ async signInWithProvider(params, useWxCloud = false) {
172
+ const res = this.getParamsByVersion(params, 'AUTH_SIGN_IN_WITH_PROVIDER_URL');
173
+ const credentials = await this.config.request(res.url, {
174
+ method: 'POST',
175
+ body: res.params,
176
+ useWxCloud,
177
+ });
178
+ await this.config.credentialsClient.setCredentials({
179
+ ...credentials,
180
+ version: params?.version || 'v1',
181
+ });
182
+ return Promise.resolve(credentials);
183
+ }
184
+ async signInWithWechat(params = {}) {
185
+ const credentials = await this.config.request(ApiUrls.AUTH_SIGN_IN_WITH_WECHAT_URL, {
186
+ method: 'POST',
187
+ body: params,
370
188
  });
371
- };
372
- Auth.prototype.getUserInfo = function (params) {
373
- var _a;
374
- if (params === void 0) { params = {}; }
375
- return __awaiter(this, void 0, void 0, function () {
376
- var res, searchParams, userInfo;
377
- return __generator(this, function (_b) {
378
- switch (_b.label) {
379
- case 0:
380
- res = this.getParamsByVersion(params, 'USER_ME_URL');
381
- if ((_a = res.params) === null || _a === void 0 ? void 0 : _a.query) {
382
- searchParams = new URLSearchParams(res.params.query);
383
- res.url += "?".concat(searchParams.toString());
384
- }
385
- return [4, this.config.request(res.url, {
386
- method: 'GET',
387
- withCredentials: true,
388
- })];
389
- case 1:
390
- userInfo = _b.sent();
391
- if (userInfo.sub) {
392
- userInfo.uid = userInfo.sub;
393
- }
394
- return [2, userInfo];
395
- }
396
- });
189
+ await this.config.credentialsClient.setCredentials(credentials);
190
+ return Promise.resolve(credentials);
191
+ }
192
+ async bindWithProvider(params) {
193
+ return this.config.request(ApiUrls.PROVIDER_BIND_URL, {
194
+ method: 'POST',
195
+ body: params,
196
+ withCredentials: true,
397
197
  });
398
- };
399
- Auth.prototype.getWedaUserInfo = function () {
400
- return __awaiter(this, void 0, void 0, function () {
401
- var userInfo;
402
- return __generator(this, function (_a) {
403
- switch (_a.label) {
404
- case 0: return [4, this.config.request(ApiUrls.WEDA_USER_URL, {
405
- method: 'GET',
406
- withCredentials: true,
407
- })];
408
- case 1:
409
- userInfo = _a.sent();
410
- return [2, userInfo];
411
- }
412
- });
198
+ }
199
+ async getUserProfile(params) {
200
+ return this.getUserInfo(params);
201
+ }
202
+ async getUserInfo(params = {}) {
203
+ const res = this.getParamsByVersion(params, 'USER_ME_URL');
204
+ if (res.params?.query) {
205
+ const searchParams = new URLSearchParams(res.params.query);
206
+ res.url += `?${searchParams.toString()}`;
207
+ }
208
+ const userInfo = await this.config.request(res.url, {
209
+ method: 'GET',
210
+ withCredentials: true,
413
211
  });
414
- };
415
- Auth.prototype.deleteMe = function (params) {
416
- return __awaiter(this, void 0, void 0, function () {
417
- var res, url;
418
- return __generator(this, function (_a) {
419
- res = this.getParamsByVersion(params, 'USER_ME_URL');
420
- url = "".concat(res.url, "?").concat(Auth.parseParamsToSearch(res.params));
421
- return [2, this.config.request(url, {
422
- method: 'DELETE',
423
- withCredentials: true,
424
- })];
425
- });
212
+ if (userInfo.sub) {
213
+ userInfo.uid = userInfo.sub;
214
+ }
215
+ return userInfo;
216
+ }
217
+ async getWedaUserInfo() {
218
+ const userInfo = await this.config.request(ApiUrls.WEDA_USER_URL, {
219
+ method: 'GET',
220
+ withCredentials: true,
426
221
  });
427
- };
428
- Auth.prototype.hasLoginState = function () {
429
- return __awaiter(this, void 0, void 0, function () {
430
- var error_1;
431
- return __generator(this, function (_a) {
432
- switch (_a.label) {
433
- case 0:
434
- _a.trys.push([0, 2, , 3]);
435
- return [4, this.config.credentialsClient.getAccessToken()];
436
- case 1:
437
- _a.sent();
438
- return [2, true];
439
- case 2:
440
- error_1 = _a.sent();
441
- return [2, false];
442
- case 3: return [2];
443
- }
444
- });
222
+ return userInfo;
223
+ }
224
+ async deleteMe(params) {
225
+ const res = this.getParamsByVersion(params, 'USER_ME_URL');
226
+ const url = `${res.url}?${Auth.parseParamsToSearch(res.params)}`;
227
+ return this.config.request(url, {
228
+ method: 'DELETE',
229
+ withCredentials: true,
445
230
  });
446
- };
447
- Auth.prototype.hasLoginStateSync = function () {
448
- var credentials = this.config.credentialsClient.getCredentialsSync();
231
+ }
232
+ async hasLoginState() {
233
+ try {
234
+ await this.config.credentialsClient.getAccessToken();
235
+ return true;
236
+ }
237
+ catch (error) {
238
+ return false;
239
+ }
240
+ }
241
+ hasLoginStateSync() {
242
+ const credentials = this.config.credentialsClient.getCredentialsSync();
449
243
  return credentials;
450
- };
451
- Auth.prototype.getLoginState = function () {
452
- return __awaiter(this, void 0, void 0, function () {
453
- return __generator(this, function (_a) {
454
- return [2, this.config.credentialsClient.getCredentialsAsync()];
455
- });
456
- });
457
- };
458
- Auth.prototype.transByProvider = function (params) {
459
- return __awaiter(this, void 0, void 0, function () {
460
- return __generator(this, function (_a) {
461
- return [2, this.config.request(ApiUrls.USER_TRANS_BY_PROVIDER_URL, {
462
- method: 'PATCH',
463
- body: params,
464
- withCredentials: true,
465
- })];
466
- });
244
+ }
245
+ async getLoginState() {
246
+ return this.config.credentialsClient.getCredentialsAsync();
247
+ }
248
+ async transByProvider(params) {
249
+ return this.config.request(ApiUrls.USER_TRANS_BY_PROVIDER_URL, {
250
+ method: 'PATCH',
251
+ body: params,
252
+ withCredentials: true,
467
253
  });
468
- };
469
- Auth.prototype.grantToken = function (params) {
470
- return __awaiter(this, void 0, void 0, function () {
471
- var res;
472
- return __generator(this, function (_a) {
473
- res = this.getParamsByVersion(params, 'AUTH_TOKEN_URL');
474
- return [2, this.config.request(res.url, {
475
- method: 'POST',
476
- body: res.params,
477
- })];
478
- });
254
+ }
255
+ async grantToken(params) {
256
+ const res = this.getParamsByVersion(params, 'AUTH_TOKEN_URL');
257
+ return this.config.request(res.url, {
258
+ method: 'POST',
259
+ body: res.params,
479
260
  });
480
- };
481
- Auth.prototype.getProviders = function () {
482
- return __awaiter(this, void 0, void 0, function () {
483
- return __generator(this, function (_a) {
484
- return [2, this.config.request(ApiUrls.PROVIDER_LIST, {
485
- method: 'GET',
486
- withCredentials: true,
487
- })];
488
- });
261
+ }
262
+ async getProviders() {
263
+ return this.config.request(ApiUrls.PROVIDER_LIST, {
264
+ method: 'GET',
265
+ withCredentials: true,
489
266
  });
490
- };
491
- Auth.prototype.unbindProvider = function (params) {
492
- return __awaiter(this, void 0, void 0, function () {
493
- return __generator(this, function (_a) {
494
- return [2, this.config.request("".concat(ApiUrls.PROVIDER_UNBIND_URL, "/").concat(params.provider_id), {
495
- method: 'DELETE',
496
- withCredentials: true,
497
- })];
498
- });
267
+ }
268
+ async unbindProvider(params) {
269
+ return this.config.request(`${ApiUrls.PROVIDER_UNBIND_URL}/${params.provider_id}`, {
270
+ method: 'DELETE',
271
+ withCredentials: true,
499
272
  });
500
- };
501
- Auth.prototype.checkPassword = function (params) {
502
- return __awaiter(this, void 0, void 0, function () {
503
- return __generator(this, function (_a) {
504
- return [2, this.config.request("".concat(ApiUrls.CHECK_PWD_URL), {
505
- method: 'POST',
506
- withCredentials: true,
507
- body: params,
508
- })];
509
- });
273
+ }
274
+ async checkPassword(params) {
275
+ return this.config.request(`${ApiUrls.CHECK_PWD_URL}`, {
276
+ method: 'POST',
277
+ withCredentials: true,
278
+ body: params,
510
279
  });
511
- };
512
- Auth.prototype.editContact = function (params) {
513
- return __awaiter(this, void 0, void 0, function () {
514
- return __generator(this, function (_a) {
515
- return [2, this.config.request("".concat(ApiUrls.BIND_CONTACT_URL), {
516
- method: 'PATCH',
517
- withCredentials: true,
518
- body: params,
519
- })];
520
- });
280
+ }
281
+ async editContact(params) {
282
+ return this.config.request(`${ApiUrls.BIND_CONTACT_URL}`, {
283
+ method: 'PATCH',
284
+ withCredentials: true,
285
+ body: params,
521
286
  });
522
- };
523
- Auth.prototype.setPassword = function (params) {
524
- return __awaiter(this, void 0, void 0, function () {
525
- return __generator(this, function (_a) {
526
- return [2, this.config.request("".concat(ApiUrls.AUTH_SET_PASSWORD), {
527
- method: 'PATCH',
528
- withCredentials: true,
529
- body: params,
530
- })];
531
- });
287
+ }
288
+ async setPassword(params) {
289
+ return this.config.request(`${ApiUrls.AUTH_SET_PASSWORD}`, {
290
+ method: 'PATCH',
291
+ withCredentials: true,
292
+ body: params,
532
293
  });
533
- };
534
- Auth.prototype.updatePasswordByOld = function (params) {
535
- return __awaiter(this, void 0, void 0, function () {
536
- var sudoToken;
537
- return __generator(this, function (_a) {
538
- switch (_a.label) {
539
- case 0: return [4, this.sudo({ password: params.old_password })];
540
- case 1:
541
- sudoToken = _a.sent();
542
- return [2, this.setPassword({
543
- sudo_token: sudoToken.sudo_token,
544
- new_password: params.new_password,
545
- })];
546
- }
547
- });
294
+ }
295
+ async updatePasswordByOld(params) {
296
+ const sudoToken = await this.sudo({ password: params.old_password });
297
+ return this.setPassword({
298
+ sudo_token: sudoToken.sudo_token,
299
+ new_password: params.new_password,
548
300
  });
549
- };
550
- Auth.prototype.sudo = function (params) {
551
- return __awaiter(this, void 0, void 0, function () {
552
- return __generator(this, function (_a) {
553
- return [2, this.config.request("".concat(ApiUrls.SUDO_URL), {
554
- method: 'POST',
555
- withCredentials: true,
556
- body: params,
557
- })];
558
- });
301
+ }
302
+ async sudo(params) {
303
+ return this.config.request(`${ApiUrls.SUDO_URL}`, {
304
+ method: 'POST',
305
+ withCredentials: true,
306
+ body: params,
559
307
  });
560
- };
561
- Auth.prototype.sendVerificationCodeToCurrentUser = function (params) {
562
- return __awaiter(this, void 0, void 0, function () {
563
- return __generator(this, function (_a) {
564
- params.target = 'CUR_USER';
565
- return [2, this.config.request(ApiUrls.VERIFICATION_URL, {
566
- method: 'POST',
567
- body: params,
568
- withCredentials: true,
569
- withCaptcha: true,
570
- })];
571
- });
308
+ }
309
+ async sendVerificationCodeToCurrentUser(params) {
310
+ params.target = 'CUR_USER';
311
+ return this.config.request(ApiUrls.VERIFICATION_URL, {
312
+ method: 'POST',
313
+ body: params,
314
+ withCredentials: true,
315
+ withCaptcha: true,
572
316
  });
573
- };
574
- Auth.prototype.changeBoundProvider = function (params) {
575
- return __awaiter(this, void 0, void 0, function () {
576
- return __generator(this, function (_a) {
577
- return [2, this.config.request("".concat(ApiUrls.PROVIDER_LIST, "/").concat(params.provider_id, "/trans"), {
578
- method: 'POST',
579
- body: {
580
- provider_trans_token: params.trans_token,
581
- },
582
- withCredentials: true,
583
- })];
584
- });
317
+ }
318
+ async changeBoundProvider(params) {
319
+ return this.config.request(`${ApiUrls.PROVIDER_LIST}/${params.provider_id}/trans`, {
320
+ method: 'POST',
321
+ body: {
322
+ provider_trans_token: params.trans_token,
323
+ },
324
+ withCredentials: true,
585
325
  });
586
- };
587
- Auth.prototype.setUserProfile = function (params) {
588
- return __awaiter(this, void 0, void 0, function () {
589
- return __generator(this, function (_a) {
590
- return [2, this.config.request(ApiUrls.USER_PRIFILE_URL, {
591
- method: 'PATCH',
592
- body: params,
593
- withCredentials: true,
594
- })];
595
- });
326
+ }
327
+ async setUserProfile(params) {
328
+ return this.config.request(ApiUrls.USER_PRIFILE_URL, {
329
+ method: 'PATCH',
330
+ body: params,
331
+ withCredentials: true,
596
332
  });
597
- };
598
- Auth.prototype.updateUserBasicInfo = function (params) {
599
- return __awaiter(this, void 0, void 0, function () {
600
- return __generator(this, function (_a) {
601
- return [2, this.config.request(ApiUrls.USER_BASIC_EDIT_URL, {
602
- method: 'POST',
603
- withCredentials: true,
604
- body: params,
605
- })];
606
- });
333
+ }
334
+ async updateUserBasicInfo(params) {
335
+ return this.config.request(ApiUrls.USER_BASIC_EDIT_URL, {
336
+ method: 'POST',
337
+ withCredentials: true,
338
+ body: params,
607
339
  });
608
- };
609
- Auth.prototype.queryUserProfile = function (params) {
610
- return __awaiter(this, void 0, void 0, function () {
611
- var searchParams;
612
- return __generator(this, function (_a) {
613
- searchParams = new URLSearchParams(params);
614
- return [2, this.config.request("".concat(ApiUrls.USER_QUERY_URL, "?").concat(searchParams.toString()), {
615
- method: 'GET',
616
- withCredentials: true,
617
- })];
618
- });
340
+ }
341
+ async queryUserProfile(params) {
342
+ const searchParams = new URLSearchParams(params);
343
+ return this.config.request(`${ApiUrls.USER_QUERY_URL}?${searchParams.toString()}`, {
344
+ method: 'GET',
345
+ withCredentials: true,
619
346
  });
620
- };
621
- Auth.prototype.setCustomSignFunc = function (getTickFn) {
347
+ }
348
+ setCustomSignFunc(getTickFn) {
622
349
  this.getCustomSignTicketFn = getTickFn;
623
- };
624
- Auth.prototype.signInWithCustomTicket = function (params) {
625
- return __awaiter(this, void 0, void 0, function () {
626
- var customSignTicketFn, customTicket;
627
- return __generator(this, function (_a) {
628
- switch (_a.label) {
629
- case 0:
630
- customSignTicketFn = this.getCustomSignTicketFn;
631
- if (!customSignTicketFn) {
632
- return [2, Promise.reject({
633
- error: 'failed_precondition',
634
- error_description: 'please use setCustomSignFunc to set custom sign function',
635
- })];
636
- }
637
- return [4, customSignTicketFn()];
638
- case 1:
639
- customTicket = _a.sent();
640
- return [2, this.signInWithProvider(__assign(__assign({}, params), { provider_id: 'custom', provider_token: customTicket }))];
641
- }
642
- });
643
- });
644
- };
645
- Auth.prototype.resetPassword = function (params) {
646
- return __awaiter(this, void 0, void 0, function () {
647
- return __generator(this, function (_a) {
648
- return [2, this.config.request(ApiUrls.AUTH_RESET_PASSWORD, {
649
- method: 'POST',
650
- body: params,
651
- })];
652
- });
653
- });
654
- };
655
- Auth.prototype.authorize = function (params) {
656
- return __awaiter(this, void 0, void 0, function () {
657
- return __generator(this, function (_a) {
658
- return [2, this.config.request(ApiUrls.AUTHORIZE_URL, {
659
- method: 'POST',
660
- withCredentials: true,
661
- body: params,
662
- })];
663
- });
664
- });
665
- };
666
- Auth.prototype.authorizeDevice = function (params) {
667
- return __awaiter(this, void 0, void 0, function () {
668
- return __generator(this, function (_a) {
669
- return [2, this.config.request(ApiUrls.AUTHORIZE_DEVICE_URL, {
670
- method: 'POST',
671
- withCredentials: true,
672
- body: params,
673
- })];
674
- });
675
- });
676
- };
677
- Auth.prototype.deviceAuthorize = function (params) {
678
- return __awaiter(this, void 0, void 0, function () {
679
- return __generator(this, function (_a) {
680
- return [2, this.config.request(ApiUrls.AUTH_GET_DEVICE_CODE, {
681
- method: 'POST',
682
- body: params,
683
- withCredentials: true,
684
- })];
350
+ }
351
+ async signInWithCustomTicket(params) {
352
+ const customSignTicketFn = this.getCustomSignTicketFn;
353
+ if (!customSignTicketFn) {
354
+ return Promise.reject({
355
+ error: 'failed_precondition',
356
+ error_description: 'please use setCustomSignFunc to set custom sign function',
685
357
  });
358
+ }
359
+ const customTicket = await customSignTicketFn();
360
+ return this.signInWithProvider({
361
+ ...params,
362
+ provider_id: 'custom',
363
+ provider_token: customTicket,
686
364
  });
687
- };
688
- Auth.prototype.authorizeInfo = function (params) {
689
- return __awaiter(this, void 0, void 0, function () {
690
- var url, withBasicAuth, withCredentials, hasLogin;
691
- return __generator(this, function (_a) {
692
- switch (_a.label) {
693
- case 0:
694
- url = "".concat(ApiUrls.AUTHORIZE_INFO_URL, "?").concat(Auth.parseParamsToSearch(params));
695
- withBasicAuth = true;
696
- withCredentials = false;
697
- return [4, this.hasLoginState()];
698
- case 1:
699
- hasLogin = _a.sent();
700
- if (hasLogin) {
701
- withCredentials = true;
702
- withBasicAuth = false;
703
- }
704
- return [2, this.config.request(url, {
705
- method: 'GET',
706
- withBasicAuth: withBasicAuth,
707
- withCredentials: withCredentials,
708
- })];
709
- }
710
- });
365
+ }
366
+ async resetPassword(params) {
367
+ return this.config.request(ApiUrls.AUTH_RESET_PASSWORD, {
368
+ method: 'POST',
369
+ body: params,
711
370
  });
712
- };
713
- Auth.prototype.checkUsername = function (params) {
714
- return __awaiter(this, void 0, void 0, function () {
715
- return __generator(this, function (_a) {
716
- return [2, this.config.request(ApiUrls.CHECK_USERNAME, {
717
- method: 'GET',
718
- body: params,
719
- withCredentials: true,
720
- })];
721
- });
371
+ }
372
+ async authorize(params) {
373
+ return this.config.request(ApiUrls.AUTHORIZE_URL, {
374
+ method: 'POST',
375
+ withCredentials: true,
376
+ body: params,
722
377
  });
723
- };
724
- Auth.prototype.checkIfUserExist = function (params) {
725
- return __awaiter(this, void 0, void 0, function () {
726
- var searchParams;
727
- return __generator(this, function (_a) {
728
- searchParams = new URLSearchParams(params);
729
- return [2, this.config.request("".concat(ApiUrls.CHECK_IF_USER_EXIST, "?").concat(searchParams.toString()), {
730
- method: 'GET',
731
- })];
732
- });
378
+ }
379
+ async authorizeDevice(params) {
380
+ return this.config.request(ApiUrls.AUTHORIZE_DEVICE_URL, {
381
+ method: 'POST',
382
+ withCredentials: true,
383
+ body: params,
733
384
  });
734
- };
735
- Auth.prototype.loginScope = function () {
736
- return __awaiter(this, void 0, void 0, function () {
737
- return __generator(this, function (_a) {
738
- return [2, this.config.credentialsClient.getScope()];
739
- });
385
+ }
386
+ async deviceAuthorize(params) {
387
+ return this.config.request(ApiUrls.AUTH_GET_DEVICE_CODE, {
388
+ method: 'POST',
389
+ body: params,
390
+ withCredentials: true,
740
391
  });
741
- };
742
- Auth.prototype.loginGroups = function () {
743
- return __awaiter(this, void 0, void 0, function () {
744
- return __generator(this, function (_a) {
745
- return [2, this.config.credentialsClient.getGroups()];
746
- });
392
+ }
393
+ async authorizeInfo(params) {
394
+ const url = `${ApiUrls.AUTHORIZE_INFO_URL}?${Auth.parseParamsToSearch(params)}`;
395
+ let withBasicAuth = true;
396
+ let withCredentials = false;
397
+ const hasLogin = await this.hasLoginState();
398
+ if (hasLogin) {
399
+ withCredentials = true;
400
+ withBasicAuth = false;
401
+ }
402
+ return this.config.request(url, {
403
+ method: 'GET',
404
+ withBasicAuth,
405
+ withCredentials,
747
406
  });
748
- };
749
- Auth.prototype.refreshTokenForce = function (params) {
750
- return __awaiter(this, void 0, void 0, function () {
751
- var credentials;
752
- return __generator(this, function (_a) {
753
- switch (_a.label) {
754
- case 0: return [4, this.config.credentialsClient.getCredentials()];
755
- case 1:
756
- credentials = _a.sent();
757
- return [4, this.config.credentialsClient.refreshToken(__assign(__assign({}, credentials), { version: (params === null || params === void 0 ? void 0 : params.version) || 'v1' }))];
758
- case 2: return [2, _a.sent()];
759
- }
760
- });
407
+ }
408
+ async checkUsername(params) {
409
+ return this.config.request(ApiUrls.CHECK_USERNAME, {
410
+ method: 'GET',
411
+ body: params,
412
+ withCredentials: true,
761
413
  });
762
- };
763
- Auth.prototype.getCredentials = function () {
764
- return __awaiter(this, void 0, void 0, function () {
765
- return __generator(this, function (_a) {
766
- return [2, this.config.credentialsClient.getCredentials()];
767
- });
414
+ }
415
+ async checkIfUserExist(params) {
416
+ const searchParams = new URLSearchParams(params);
417
+ return this.config.request(`${ApiUrls.CHECK_IF_USER_EXIST}?${searchParams.toString()}`, {
418
+ method: 'GET',
768
419
  });
769
- };
770
- Auth.prototype.getPublicKey = function () {
771
- return __awaiter(this, void 0, void 0, function () {
772
- return __generator(this, function (_a) {
773
- return [2, this.config.request(ApiUrlsV2.AUTH_PUBLIC_KEY, {
774
- method: 'POST',
775
- body: {},
776
- })];
777
- });
420
+ }
421
+ async loginScope() {
422
+ return this.config.credentialsClient.getScope();
423
+ }
424
+ async loginGroups() {
425
+ return this.config.credentialsClient.getGroups();
426
+ }
427
+ async refreshTokenForce(params) {
428
+ const credentials = await this.config.credentialsClient.getCredentials();
429
+ return await this.config.credentialsClient.refreshToken({
430
+ ...credentials,
431
+ version: params?.version || 'v1',
778
432
  });
779
- };
780
- Auth.prototype.getEncryptParams = function (params) {
781
- return __awaiter(this, void 0, void 0, function () {
782
- var payload, publicKey, public_key_thumbprint, res, error_2;
783
- return __generator(this, function (_a) {
784
- switch (_a.label) {
785
- case 0:
786
- payload = deepClone(params);
787
- if (!payload.isEncrypt) {
788
- return [2, params];
789
- }
790
- publicKey = '';
791
- public_key_thumbprint = '';
792
- _a.label = 1;
793
- case 1:
794
- _a.trys.push([1, 3, , 4]);
795
- return [4, this.getPublicKey()];
796
- case 2:
797
- res = _a.sent();
798
- publicKey = res.public_key;
799
- public_key_thumbprint = res.public_key_thumbprint;
800
- return [3, 4];
801
- case 3:
802
- error_2 = _a.sent();
803
- return [3, 4];
804
- case 4:
805
- if (!publicKey || !public_key_thumbprint) {
806
- throw new Error('public_key or public_key_thumbprint is empty');
807
- }
808
- delete payload.isEncrypt;
809
- return [2, {
810
- params: getEncryptInfo({ publicKey: publicKey, payload: payload }),
811
- public_key_thumbprint: public_key_thumbprint,
812
- }];
813
- }
814
- });
433
+ }
434
+ async getCredentials() {
435
+ return this.config.credentialsClient.getCredentials();
436
+ }
437
+ async getPublicKey() {
438
+ return this.config.request(ApiUrlsV2.AUTH_PUBLIC_KEY, {
439
+ method: 'POST',
440
+ body: {},
815
441
  });
816
- };
817
- Auth.prototype.getProviderSubType = function () {
818
- return __awaiter(this, void 0, void 0, function () {
819
- return __generator(this, function (_a) {
820
- return [2, this.config.request(ApiUrls.GET_PROVIDER_TYPE, {
821
- method: 'POST',
822
- body: {
823
- provider_id: 'weda',
824
- },
825
- })];
826
- });
442
+ }
443
+ async getEncryptParams(params) {
444
+ const payload = deepClone(params);
445
+ if (!payload.isEncrypt) {
446
+ return params;
447
+ }
448
+ let publicKey = '';
449
+ let public_key_thumbprint = '';
450
+ try {
451
+ const res = await this.getPublicKey();
452
+ publicKey = res.public_key;
453
+ public_key_thumbprint = res.public_key_thumbprint;
454
+ }
455
+ catch (error) { }
456
+ if (!publicKey || !public_key_thumbprint) {
457
+ throw new Error('public_key or public_key_thumbprint is empty');
458
+ }
459
+ delete payload.isEncrypt;
460
+ return {
461
+ params: getEncryptInfo({ publicKey, payload }),
462
+ public_key_thumbprint,
463
+ };
464
+ }
465
+ async getProviderSubType() {
466
+ return this.config.request(ApiUrls.GET_PROVIDER_TYPE, {
467
+ method: 'POST',
468
+ body: {
469
+ provider_id: 'weda',
470
+ },
827
471
  });
828
- };
829
- Auth.prototype.verifyCaptchaData = function (_a) {
830
- var token = _a.token, key = _a.key;
831
- return __awaiter(this, void 0, void 0, function () {
832
- return __generator(this, function (_b) {
833
- return [2, this.config.request(ApiUrls.VERIFY_CAPTCHA_DATA_URL, {
834
- method: 'POST',
835
- body: { token: token, key: key },
836
- withCredentials: false,
837
- })];
838
- });
472
+ }
473
+ async verifyCaptchaData({ token, key }) {
474
+ return this.config.request(ApiUrls.VERIFY_CAPTCHA_DATA_URL, {
475
+ method: 'POST',
476
+ body: { token, key },
477
+ withCredentials: false,
839
478
  });
840
- };
841
- Auth.prototype.createCaptchaData = function (_a) {
842
- var state = _a.state, _b = _a.redirect_uri, redirect_uri = _b === void 0 ? undefined : _b;
843
- return __awaiter(this, void 0, void 0, function () {
844
- return __generator(this, function (_c) {
845
- return [2, this.config.request(ApiUrls.CAPTCHA_DATA_URL, {
846
- method: 'POST',
847
- body: { state: state, redirect_uri: redirect_uri },
848
- withCredentials: false,
849
- })];
850
- });
479
+ }
480
+ async createCaptchaData({ state, redirect_uri = undefined }) {
481
+ return this.config.request(ApiUrls.CAPTCHA_DATA_URL, {
482
+ method: 'POST',
483
+ body: { state, redirect_uri },
484
+ withCredentials: false,
851
485
  });
852
- };
853
- Auth.prototype.getMiniProgramCode = function (params) {
854
- return __awaiter(this, void 0, void 0, function () {
855
- return __generator(this, function (_a) {
856
- return [2, this.config.request(ApiUrls.GET_MINIPROGRAM_QRCODE, {
857
- method: 'POST',
858
- body: params,
859
- })];
860
- });
486
+ }
487
+ async getMiniProgramCode(params) {
488
+ return this.config.request(ApiUrls.GET_MINIPROGRAM_QRCODE, {
489
+ method: 'POST',
490
+ body: params,
861
491
  });
862
- };
863
- Auth.prototype.getMiniProgramQrCodeStatus = function (params) {
864
- return __awaiter(this, void 0, void 0, function () {
865
- return __generator(this, function (_a) {
866
- return [2, this.config.request(ApiUrls.GET_MINIPROGRAM_QRCODE_STATUS, {
867
- method: 'POST',
868
- body: params,
869
- })];
870
- });
492
+ }
493
+ async getMiniProgramQrCodeStatus(params) {
494
+ return this.config.request(ApiUrls.GET_MINIPROGRAM_QRCODE_STATUS, {
495
+ method: 'POST',
496
+ body: params,
871
497
  });
872
- };
873
- return Auth;
874
- }());
875
- export { Auth };
876
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hdXRoL2FwaXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFWixPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQXVEN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQTtBQUUzRSxPQUFPLEVBQUUsT0FBTyxFQUFrQixNQUFNLG9CQUFvQixDQUFBO0FBQzVELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFDcEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBc0JqRDtJQWtCRSxjQUFZLElBQWlCO1FBQ3JCLElBQUEsT0FBTyxHQUFLLElBQUksUUFBVCxDQUFTO1FBQ3RCLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQTtRQUN6QyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ2pCLElBQU0sV0FBVyxHQUFHO2dCQUNsQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7Z0JBQ3pCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtnQkFDdkIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO2dCQUNyQixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7Z0JBQ2IsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO2dCQUM3QixtQkFBbUIsRUFBRSxJQUFJLENBQUMsbUJBQW1CO2dCQUM3QyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87YUFDdEIsQ0FBQTtZQUNELFlBQVksR0FBRyxJQUFJLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQTtTQUM3QztRQUNELElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDWixJQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsT0FB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QU0sQ0FBQyxPQUFPLENBQStCLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRTt3QkFDdkYsTUFBTSxFQUFFLE1BQU07d0JBQ2QsSUFBSSxFQUFFLE1BQU07cUJBQ2IsQ0FBQyxFQUFBOzs7S0FDSDtJQU1ZLHlDQUEwQixHQUF2QyxVQUF3QyxNQUF5Qzs7O2dCQUMvRSxXQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFxQyxPQUFPLENBQUMsNkJBQTZCLEVBQUU7d0JBQ3BHLE1BQU0sRUFBRSxNQUFNO3dCQUNkLElBQUksRUFBRSxNQUFNO3FCQUNiLENBQUMsRUFBQTs7O0tBQ0g7SUFDSCxXQUFDO0FBQUQsQ0FBQyxBQWp5QkQsSUFpeUJDIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IEFwaVVybHMsIEFwaVVybHNWMiB9IGZyb20gJy4vY29uc3RzJ1xuaW1wb3J0IHtcbiAgR2V0VmVyaWZpY2F0aW9uUmVxdWVzdCxcbiAgR2V0VmVyaWZpY2F0aW9uUmVzcG9uc2UsXG4gIFVzZXJQcm9maWxlLFxuICBVc2VySW5mbyxcbiAgU2lnbkluUmVxdWVzdCxcbiAgU2lnblVwUmVxdWVzdCxcbiAgVmVyaWZ5UmVxdWVzdCxcbiAgVmVyaWZ5UmVzcG9uc2UsXG4gIEdlblByb3ZpZGVyUmVkaXJlY3RVcmlSZXF1ZXN0LFxuICBHZW5Qcm92aWRlclJlZGlyZWN0VXJpUmVzcG9uc2UsXG4gIEdyYW50UHJvdmlkZXJUb2tlblJlcXVlc3QsXG4gIEdyYW50UHJvdmlkZXJUb2tlblJlc3BvbnNlLFxuICBQYXRjaFByb3ZpZGVyVG9rZW5SZXF1ZXN0LFxuICBQYXRjaFByb3ZpZGVyVG9rZW5SZXNwb25zZSxcbiAgU2lnbkluV2l0aFByb3ZpZGVyUmVxdWVzdCxcbiAgQmluZFdpdGhQcm92aWRlclJlcXVlc3QsXG4gIFRyYW5zQnlQcm92aWRlclJlcXVlc3QsXG4gIEdyYW50VG9rZW5SZXF1ZXN0LFxuICBVc2VyUHJvZmlsZVByb3ZpZGVyLFxuICBVbmJpbmRQcm92aWRlclJlcXVlc3QsXG4gIENoZWNrUGFzc3dvcmRyUmVxdWVzdCxcbiAgU2V0UGFzc3dvcmRSZXF1ZXN0LFxuICBDaGFuZ2VCb3VuZFByb3ZpZGVyUmVxdWVzdCxcbiAgQ2hhbmdlQm91bmRQcm92aWRlclJlc3BvbnNlLFxuICBVcGRhdGVQYXNzd29yZFJlcXVlc3QsXG4gIFN1ZG9SZXNwb25zZSxcbiAgU3Vkb1JlcXVlc3QsXG4gIEdldEN1c3RvbVNpZ25UaWNrZXRGbixcbiAgUXVlcnlVc2VyUHJvZmlsZVJlcXVlc3QsXG4gIFF1ZXJ5VXNlclByb2ZpbGVSZXNwb25zZSxcbiAgUmVzZXRQYXNzd29yZFJlcXVlc3QsXG4gIERldmljZUF1dGhvcml6ZVJlcXVlc3QsXG4gIERldmljZUF1dGhvcml6ZVJlc3BvbnNlLFxuICBDaGVja1VzZXJuYW1lUmVxdWVzdCxcbiAgQ2hlY2tJZlVzZXJFeGlzdFJlcXVlc3QsXG4gIENoZWNrSWZVc2VyRXhpc3RSZXNwb25zZSxcbiAgV2l0aFN1ZG9SZXF1ZXN0LFxuICBQdWJsaWNLZXksXG4gIEVuY3J5cHRQYXJhbXMsXG4gIFByb3ZpZGVyU3ViVHlwZSxcbiAgR2V0TWluaVByb2dyYW1RckNvZGVSZXF1ZXN0LFxuICBHZXRNaW5pUHJvZ3JhbVFyQ29kZVN0YXR1c1JlcXVlc3QsXG4gIEdldE1pbmlQcm9ncmFtUXJDb2RlUmVzcG9uc2UsXG4gIEdldE1pbmlQcm9ncmFtUXJDb2RlU3RhdHVzUmVzcG9uc2UsXG4gIE1vZGlmeVVzZXJCYXNpY0luZm9SZXF1ZXN0LFxuICBFZGl0Q29udGFjdFJlcXVlc3QsXG4gIEF1dGhvcml6ZUluZm9SZXF1ZXN0LFxuICBBdXRob3JpemVJbmZvUmVzcG9uc2UsXG4gIEF1dGhvcml6ZURldmljZVJlcXVlc3QsXG4gIEF1dGhvcml6ZVJlcXVlc3QsXG4gIEF1dGhvcml6ZVJlc3BvbnNlLFxufSBmcm9tICcuL21vZGVscydcbmltcG9ydCB7IFNpbXBsZVN0b3JhZ2UsIFJlcXVlc3RGdW5jdGlvbiB9IGZyb20gJy4uL29hdXRoMmNsaWVudC9pbnRlcmZhY2UnXG5pbXBvcnQgeyBPQXV0aDJDbGllbnQsIGRlZmF1bHRTdG9yYWdlIH0gZnJvbSAnLi4vb2F1dGgyY2xpZW50L29hdXRoMmNsaWVudCdcbmltcG9ydCB7IENyZWRlbnRpYWxzIH0gZnJvbSAnLi4vb2F1dGgyY2xpZW50L21vZGVscydcbmltcG9ydCB7IENhcHRjaGEsIENhcHRjaGFPcHRpb25zIH0gZnJvbSAnLi4vY2FwdGNoYS9jYXB0Y2hhJ1xuaW1wb3J0IHsgZGVlcENsb25lIH0gZnJvbSAnLi4vdXRpbHMnXG5pbXBvcnQgeyBnZXRFbmNyeXB0SW5mbyB9IGZyb20gJy4uL3V0aWxzL2VuY3J5cHQnXG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aE9wdGlvbnMge1xuICBhcGlPcmlnaW46IHN0cmluZ1xuICBjbGllbnRJZDogc3RyaW5nXG4gIC8qKlxuICAgKiBiYXNpYyBhdXRoXG4gICAqL1xuICBjbGllbnRTZWNyZXQ/OiBzdHJpbmdcbiAgY3JlZGVudGlhbHNDbGllbnQ/OiBPQXV0aDJDbGllbnRcbiAgcmVxdWVzdD86IFJlcXVlc3RGdW5jdGlvblxuICBiYXNlUmVxdWVzdD86IFJlcXVlc3RGdW5jdGlvblxuICBzdG9yYWdlPzogU2ltcGxlU3RvcmFnZVxuICBhbm9ueW1vdXNTaWduSW5GdW5jPzogKENyZWRlbnRpYWxzKSA9PiBQcm9taXNlPENyZWRlbnRpYWxzIHwgdm9pZD5cbiAgY2FwdGNoYU9wdGlvbnM/OiBQYXJ0aWFsPENhcHRjaGFPcHRpb25zPlxuICBlbnY/OiBzdHJpbmdcbiAgd3hDbG91ZD86IGFueVxufVxuXG4vKipcbiAqIEF1dGhcbiAqL1xuZXhwb3J0IGNsYXNzIEF1dGgge1xuICBwcml2YXRlIHN0YXRpYyBwYXJzZVBhcmFtc1RvU2VhcmNoKHBhcmFtczogYW55KTogc3RyaW5nIHtcbiAgICBPYmplY3Qua2V5cyhwYXJhbXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKCFwYXJhbXNba2V5XSkge1xuICAgICAgICBkZWxldGUgcGFyYW1zW2tleV1cbiAgICAgIH1cbiAgICB9KVxuICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocGFyYW1zIGFzIGFueSlcbiAgICByZXR1cm4gc2VhcmNoUGFyYW1zLnRvU3RyaW5nKClcbiAgfVxuXG4gIHByaXZhdGUgY29uZmlnOiBBdXRoT3B0aW9uc1xuICBwcml2YXRlIGdldEN1c3RvbVNpZ25UaWNrZXRGbj86IEdldEN1c3RvbVNpZ25UaWNrZXRGblxuXG4gIC8qKlxuICAgKiBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge0F1dGhPcHRpb25zfSBvcHRzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRzOiBBdXRoT3B0aW9ucykge1xuICAgIGxldCB7IHJlcXVlc3QgfSA9IG9wdHNcbiAgICBsZXQgb0F1dGgyQ2xpZW50ID0gb3B0cy5jcmVkZW50aWFsc0NsaWVudFxuICAgIGlmICghb0F1dGgyQ2xpZW50KSB7XG4gICAgICBjb25zdCBpbml0T3B0aW9ucyA9IHtcbiAgICAgICAgYXBpT3JpZ2luOiBvcHRzLmFwaU9yaWdpbixcbiAgICAgICAgY2xpZW50SWQ6IG9wdHMuY2xpZW50SWQsXG4gICAgICAgIHN0b3JhZ2U6IG9wdHMuc3RvcmFnZSxcbiAgICAgICAgZW52OiBvcHRzLmVudixcbiAgICAgICAgYmFzZVJlcXVlc3Q6IG9wdHMuYmFzZVJlcXVlc3QgLyogfHwgb3B0cy5yZXF1ZXN0ICovLCAvLyBvcHRzLnJlcXVlc3Qg5bqf5byD5LiN55So5p2l6KGo56S6IG9hdXRoIHJxdWVzdFxuICAgICAgICBhbm9ueW1vdXNTaWduSW5GdW5jOiBvcHRzLmFub255bW91c1NpZ25JbkZ1bmMsXG4gICAgICAgIHd4Q2xvdWQ6IG9wdHMud3hDbG91ZCxcbiAgICAgIH1cbiAgICAgIG9BdXRoMkNsaWVudCA9IG5ldyBPQXV0aDJDbGllbnQoaW5pdE9wdGlvbnMpXG4gICAgfVxuICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgY29uc3QgYmFzZVJlcXVlc3QgPSBvQXV0aDJDbGllbnQucmVxdWVzdC5iaW5kKG9BdXRoMkNsaWVudClcbiAgICAgIGNvbnN0IGNhcHRjaGEgPSBuZXcgQ2FwdGNoYSh7XG4gICAgICAgIGNsaWVudElkOiBvcHRzLmNsaWVudElkLFxuICAgICAgICByZXF1ZXN0OiBiYXNlUmVxdWVzdCxcbiAgICAgICAgc3RvcmFnZTogb3B0cy5zdG9yYWdlLFxuICAgICAgICAuLi5vcHRzLmNhcHRjaGFPcHRpb25zLFxuICAgICAgfSlcbiAgICAgIHJlcXVlc3QgPSBjYXB0Y2hhLnJlcXVlc3QuYmluZChjYXB0Y2hhKVxuICAgIH1cbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIGVudjogb3B0cy5lbnYsXG4gICAgICBhcGlPcmlnaW46IG9wdHMuYXBpT3JpZ2luLFxuICAgICAgY2xpZW50SWQ6IG9wdHMuY2xpZW50SWQsXG4gICAgICByZXF1ZXN0LFxuICAgICAgY3JlZGVudGlhbHNDbGllbnQ6IG9BdXRoMkNsaWVudCxcbiAgICAgIHN0b3JhZ2U6IG9wdHMuc3RvcmFnZSB8fCBkZWZhdWx0U3RvcmFnZSxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5qC55o2u54mI5pys5qCH6K+G77yM5aSE55CG5b6F6K+35rGC55qEdXJs5ZKMcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIGtleVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHVibGljIGdldFBhcmFtc0J5VmVyc2lvbihwYXJhbXM6IGFueSwga2V5OiBzdHJpbmcpIHtcbiAgICBjb25zdCBwYXJhbXNUZW1wID0gZGVlcENsb25lKHBhcmFtcylcbiAgICBjb25zdCB1cmwgPSB7IHYyOiBBcGlVcmxzVjIgfVtwYXJhbXNUZW1wPy52ZXJzaW9uXT8uW2tleV0gfHwgQXBpVXJsc1trZXldXG5cbiAgICBpZiAocGFyYW1zVGVtcCkge1xuICAgICAgZGVsZXRlIHBhcmFtc1RlbXAudmVyc2lvblxuICAgIH1cblxuICAgIHJldHVybiB7IHBhcmFtczogcGFyYW1zVGVtcCwgdXJsIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIGluLlxuICAgKiBAcGFyYW0ge1NpZ25JblJlcXVlc3R9IHBhcmFtcyBBIFNpZ25JblJlcXVlc3QgT2JqZWN0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPENyZWRlbnRpYWxzPn0gQSBQcm9taXNlPENyZWRlbnRpYWxzPiBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2lnbkluKHBhcmFtczogU2lnbkluUmVxdWVzdCk6IFByb21pc2U8Q3JlZGVudGlhbHM+IHtcbiAgICBjb25zdCB2ZXJzaW9uID0gcGFyYW1zLnZlcnNpb24gfHwgJ3YxJ1xuICAgIGNvbnN0IHJlcyA9IHRoaXMuZ2V0UGFyYW1zQnlWZXJzaW9uKHBhcmFtcywgJ0FVVEhfU0lHTl9JTl9VUkwnKVxuICAgIGlmIChyZXMucGFyYW1zLnF1ZXJ5KSB7XG4gICAgICBkZWxldGUgcmVzLnBhcmFtcy5xdWVyeVxuICAgIH1cblxuICAgIGNvbnN0IGJvZHkgPSBhd2FpdCB0aGlzLmdldEVuY3J5cHRQYXJhbXMocmVzLnBhcmFtcylcbiAgICBjb25zdCBjcmVkZW50aWFsczogQ3JlZGVudGlhbHMgPSBhd2FpdCB0aGlzLmNvbmZpZy5yZXF1ZXN0PENyZWRlbnRpYWxzPihyZXMudXJsLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHksXG4gICAgfSlcbiAgICBhd2FpdCB0aGlzLmNvbmZpZy5jcmVkZW50aWFsc0NsaWVudC5zZXRDcmVkZW50aWFscyh7XG4gICAgICAuLi5jcmVkZW50aWFscyxcbiAgICAgIHZlcnNpb24sXG4gICAgfSlcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNyZWRlbnRpYWxzKVxuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gaW4gQW5vbnltb3VzbHlcbiAgICogQHJldHVybiB7UHJvbWlzZTxDcmVkZW50aWFscz59IEEgUHJvbWlzZTxDcmVkZW50aWFscz4gb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNpZ25JbkFub255bW91c2x5KGRhdGE6IHtcbiAgICBwcm92aWRlcl90b2tlbj86IHN0cmluZ1xuICB9ID0ge30sKTogUHJvbWlzZTxDcmVkZW50aWFscz4ge1xuICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscyA9IGF3YWl0IHRoaXMuY29uZmlnLnJlcXVlc3Q8Q3JlZGVudGlhbHM+KEFwaVVybHMuQVVUSF9TSUdOX0lOX0FOT05ZTU9VU0xZX1VSTCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBib2R5OiBkYXRhLFxuICAgIH0pXG4gICAgYXdhaXQgdGhpcy5jb25maWcuY3JlZGVudGlhbHNDbGllbnQuc2V0Q3JlZGVudGlhbHMoY3JlZGVudGlhbHMpXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjcmVkZW50aWFscylcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIHVwLlxuICAgKiBAcGFyYW0ge1NpZ25VcFJlcXVlc3R9IHBhcmFtcyBBIFNpZ25VcFJlcXVlc3QgT2JqZWN0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPENyZWRlbnRpYWxzPn0gQSBQcm9taXNlPENyZWRlbnRpYWxzPiBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2lnblVwKHBhcmFtczogU2lnblVwUmVxdWVzdCk6IFByb21pc2U8Q3JlZGVudGlhbHM+IHtcbiAgICBjb25zdCBkYXRhOiBDcmVkZW50aWFscyA9IGF3YWl0IHRoaXMuY29uZmlnLnJlcXVlc3Q8Q3JlZGVudGlhbHM+KEFwaVVybHMuQVVUSF9TSUdOX1VQX1VSTCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBib2R5OiBwYXJhbXMsXG4gICAgfSlcbiAgICBhd2FpdCB0aGlzLmNvbmZpZy5jcmVkZW50aWFsc0NsaWVudC5zZXRDcmVkZW50aWFscyhkYXRhKVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZGF0YSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIG91dC5cbiAgICogQHJldHVybiB7T2JqZWN0fSBBIFByb21pc2U8dm9pZD4gb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNpZ25PdXQoKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBhY2Nlc3NUb2tlbjogc3RyaW5nID0gYXdhaXQgdGhpcy5jb25maWcuY3JlZGVudGlhbHNDbGllbnQuZ2V0QWNjZXNzVG9rZW4oKVxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmNvbmZpZy5yZXF1ZXN0KEFwaVVybHMuQVVUSF9SRVZPS0VfVVJMLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IHtcbiAgICAgICAgdG9rZW46IGFjY2Vzc1Rva2VuLFxuICAgICAgfSxcbiAgICB9KVxuICAgIGF3YWl0IHRoaXMuY29uZmlnLmNyZWRlbnRpYWxzQ2xpZW50LnNldENyZWRlbnRpYWxzKClcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGRhdGEpXG4gIH1cblxuICAvKipcbiAgICogUmV2b2tlIEFsbCBEZXZpY2VzXG4gICAqIEByZXR1cm4ge09iamVjdH0gQSBQcm9taXNlPHZvaWQ+IG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXZva2VBbGxEZXZpY2VzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY29uZmlnLnJlcXVlc3Q8dm9pZD4oQXBpVXJscy5BVVRIX1JFVk9LRV9BTExfVVJMLCB7XG4gICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgd2l0aENyZWRlbnRpYWxzOiB0cnVlLFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUmV2b2tlIERldmljZVxuICAgKiBAcmV0dXJuIHtPYmplY3R9IEEgUHJvbWlzZTx2b2lkPiBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmV2b2tlRGV2aWNlKHBhcmFtczogeyBkZXZpY2VfaWQ6IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5jb25maWcucmVxdWVzdDx2b2lkPihBcGlVcmxzLkFVVEhPUklaRURfREVWSUNFU19ERUxFVEVfVVJMICsgcGFyYW1zLmRldmljZV9pZCwge1xuICAgICAgbWV0aG9kOiAnREVMRVRFJyxcbiAgICAgIHdpdGhDcmVkZW50aWFsczogdHJ1ZSxcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdmVyaWZpY2F0aW9uLlxuICAgKiBAcGFyYW0ge0dldFZlcmlmaWNhdGlvblJlcXVlc3R9IHBhcmFtcyBBIEdldFZlcmlmaWNhdGlvblJlcXVlc3QgT2JqZWN0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEdldFZlcmlmaWNhdGlvblJlc3BvbnNlPn0gQSBQcm9taXNlPEdldFZlcmlmaWNhdGlvblJlc3BvbnNlPiBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0VmVyaWZpY2F0aW9uKHBhcmFtczogR2V0VmVyaWZpY2F0aW9uUmVxdWVzdCk6IFByb21pc2U8R2V0VmVyaWZpY2F0aW9uUmVzcG9uc2U+IHtcbiAgICBsZXQgd2l0aENyZWRlbnRpYWxzID0gZmFsc2VcbiAgICAvLyDlj5HpgIHnn63kv6Hml7bvvIzlpoLmnpzml7bnu5nlvZPliY3nlKjmiLflj5HvvIzliJnpnIDopoHluKbkuIrpibTmnYPkv6Hmga9cbiAgICBpZiAocGFyYW1zLnRhcmdldCA9PT0gJ0NVUl9VU0VSJykge1xuICAgICAgd2l0aENyZWRlbnRpYWxzID0gdHJ1ZVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBoYXNMb2dpbiA9IGF3YWl0IHRoaXMuaGFzTG9naW5TdGF0ZSgpXG4gICAgICBpZiAoaGFzTG9naW4pIHtcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb25maWcucmVxdWVzdDxHZXRWZXJpZmljYXRpb25SZXNwb25zZT4oQXBpVXJscy5WRVJJRklDQVRJT05fVVJMLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IHBhcmFtcyxcbiAgICAgIC8vIHdpdGhDYXB0Y2hhOiB0cnVlLFxuICAgICAgd2l0aENyZWRlbnRpYWxzLFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogIFZlcmlmeSB0aGUgY29kZVxuICAgKiBAcGFyYW0ge1ZlcmlmeVJlcXVlc3R9IHBhcmFtcyBBIFZlcmlmeVJlcXVlc3QgT2JqZWN0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFZlcmlmeVJlc3BvbnNlPn0gQSBQcm9taXNlPFZlcmlmeVJlc3BvbnNlPiBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdmVyaWZ5KHBhcmFtczogVmVyaWZ5UmVxdWVzdCk6IFByb21pc2U8VmVyaWZ5UmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXMgPSB0aGlzLmdldFBhcmFtc0J5VmVyc2lvbihwYXJhbXMsICdWRVJJRllfVVJMJylcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5jb25maWcucmVxdWVzdDxWZXJpZnlSZXNwb25zZT4ocmVzLnVybCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBib2R5OiByZXMucGFyYW1zLFxuICAgIH0pXG5cbiAgICBpZiAocGFyYW1zPy52ZXJzaW9uID09PSAndjInKSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbmZpZy5jcmVkZW50aWFsc0NsaWVudC5zZXRDcmVkZW50aWFscyh7XG4gICAgICAgIC4uLmRhdGEsXG4gICAgICAgIHZlcnNpb246ICd2MicsXG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiBkYXRhXG4gIH1cblxuICAvKipcbiAgICogR2VuIHByb3ZpZGVyIHJlZGlyZWN0IHVyaS5cbiAgICogQHBhcmFtIHtHZW5Qcm92aWRlclJlZGlyZWN0VXJpUmVxdWVzdH0gcGFyYW1zIEEgR2VuUHJvdmlkZXJSZWRpcmVjdFVyaVJlcXVlc3Qgb2JqZWN0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEdlblByb3ZpZGVyUmVkaXJlY3RVcmlSZXNwb25zZT59IEEgUHJvbWlzZTxHZW5Qcm92aWRlclJlZGlyZWN0VXJpUmVzcG9uc2U+IG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZW5Qcm92aWRlclJlZGlyZWN0VXJpKHBhcmFtczogR2VuUHJvdmlkZXJSZWRpcmVjdFVyaVJlcXVlc3QpOiBQcm9taXNlPEdlblByb3ZpZGVyUmVkaXJlY3RVcmlSZXNwb25zZT4ge1xuICAgIGxldCB1cmwgPSBgJHtBcGlVcmxzLlBST1ZJREVSX1VSSV9VUkx9P2NsaWVudF9pZD0ke3RoaXMuY29uZmlnLmNsaWVudElkfSZwcm92aWRlcl9pZD0ke1xuICAgICAgcGFyYW1zLnByb3ZpZGVyX2lkXG4gICAgfSZyZWRpcmVjdF91cmk9JHtlbmNvZGVVUklDb21wb25lbnQocGFyYW1zLnByb3ZpZGVyX3JlZGlyZWN0X3VyaSl9JnN0YXRlPSR7cGFyYW1zLnN0YXRlfWBcbiAgICBjb25zdCB7IG90aGVyX3BhcmFtczogb3RoZXJQYXJhbXMgfSA9IHBhcmFtc1xuICAgIGlmIChvdGhlclBhcmFtcykge1xuICAgICAgaWYgKHR5cGVvZiBvdGhlclBhcmFtcy5zaWduX291dF91cmkgPT09ICdzdHJpbmcnICYmIG90aGVyUGFyYW1zLnNpZ25fb3V0X3VyaS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHVybCArPSBgJm90aGVyX3BhcmFtc1tzaWduX291dF91cmldPSR7b3RoZXJQYXJhbXMuc2lnbl9vdXRfdXJpfWBcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnJlcXVlc3Q8R2VuUHJvdmlkZXJSZWRpcmVjdFVyaVJlc3BvbnNlPih1cmwsIHtcbiAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCBwcm92aWRlciB0b2tlbi5cbiAgICogQHBhcmFtIHtHcmFudFByb3ZpZGVyVG9rZW5SZXF1ZXN0fSBwYXJhbXMgQSBHcmFudFByb3ZpZGVyVG9rZW5SZXF1ZXN0IG9iamVjdC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxHcmFudFByb3ZpZGVyVG9rZW5SZXNwb25zZT59IEEgUHJvbWlzZTxHcmFudFByb3ZpZGVyVG9rZW5SZXNwb25zZT4gb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdyYW50UHJvdmlkZXJUb2tlbihcbiAgICBwYXJhbXM6IEdyYW50UHJvdmlkZXJUb2tlblJlcXVlc3QsXG4gICAgdXNlV3hDbG91ZCA9IGZhbHNlLFxuICApOiBQcm9taXNlPEdyYW50UHJvdmlkZXJUb2tlblJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnJlcXVlc3Q8R3JhbnRQcm92aWRlclRva2VuUmVzcG9uc2U+KEFwaVVybHMuUFJPVklERVJfVE9LRU5fVVJMLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IHBhcmFtcyxcbiAgICAgIHVzZVd4Q2xvdWQsXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCBwcm92aWRlciB0b2tlbi5cbiAgICogQHBhcmFtIHtQYXRjaFByb3ZpZGVyVG9rZW5SZXF1ZXN0fSBwYXJhbXMgQSBQYXRjaFByb3ZpZGVyVG9rZW5SZXF1ZXN0IG9iamVjdC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxQYXRjaFByb3ZpZGVyVG9rZW5SZXNwb25zZT59IEEgUHJvbWlzZTxQYXRjaFByb3ZpZGVyVG9rZW5SZXNwb25zZT4gb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHBhdGNoUHJvdmlkZXJUb2tlbihwYXJhbXM6IFBhdGNoUHJvdmlkZXJUb2tlblJlcXVlc3QpOiBQcm9taXNlPFBhdGNoUHJvdmlkZXJUb2tlblJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnJlcXVlc3Q8UGF0Y2hQcm92aWRlclRva2VuUmVzcG9uc2U+KEFwaVVybHMuUFJPVklERVJfVE9LRU5fVVJMLCB7XG4gICAgICBtZXRob2Q6ICdQQVRDSCcsXG4gICAgICBib2R5OiBwYXJhbXMsXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduaW4gd2l0aCBwcm92aWRlciByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge1NpZ25JbldpdGhQcm92aWRlclJlcXVlc3R9IHBhcmFtcyBBIFNpZ25JbldpdGhQcm92aWRlclJlcXVlc3Qgb2JqZWN0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPENyZWRlbnRpYWxzPn0gQSBQcm9taXNlPENyZWRlbnRpYWxzPiBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2lnbkluV2l0aFByb3ZpZGVyKHBhcmFtczogU2lnbkluV2l0aFByb3ZpZGVyUmVxdWVzdCwgdXNlV3hDbG91ZCA9IGZhbHNlKTogUHJvbWlzZTxDcmVkZW50aWFscz4ge1xuICAgIGNvbnN0IHJlcyA9IHRoaXMuZ2V0UGFyYW1zQnlWZXJzaW9uKHBhcmFtcywgJ0FVVEhfU0lHTl9JTl9XSVRIX1BST1ZJREVSX1VSTCcpXG5cbiAgICBjb25zdCBjcmVkZW50aWFsczogQ3JlZGVudGlhbHMgPSBhd2FpdCB0aGlzLmNvbmZpZy5yZXF1ZXN0PENyZWRlbnRpYWxzPihyZXMudXJsLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IHJlcy5wYXJhbXMsXG4gICAgICB1c2VXeENsb3VkLFxuICAgIH0pXG5cbiAgICBhd2FpdCB0aGlzLmNvbmZpZy5jcmVkZW50aWFsc0NsaWVudC5zZXRDcmVkZW50aWFscyh7XG4gICAgICAuLi5jcmVkZW50aWFscyxcbiAgICAgIHZlcnNpb246IHBhcmFtcz8udmVyc2lvbiB8fCAndjEnLFxuICAgIH0pXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjcmVkZW50aWFscylcbiAgfVxuXG4gIC8qKlxuICAgKiBzaWduIGluIHdpdGggd2VjaGF0IGlkZW5kaWZ5XG4gICAqIOmcgOimgee7k+WQiCBodHRwIG92ZXJjYWxsRnVuY3Rpb24g5L2/55SoXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2lnbkluV2l0aFdlY2hhdChwYXJhbXM6IGFueSA9IHt9KTogUHJvbWlzZTxDcmVkZW50aWFscz4ge1xuICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscyA9IGF3YWl0IHRoaXMuY29uZmlnLnJlcXVlc3Q8Q3JlZGVudGlhbHM+KEFwaVVybHMuQVVUSF9TSUdOX0lOX1dJVEhfV0VDSEFUX1VSTCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBib2R5OiBwYXJhbXMsXG4gICAgfSlcbiAgICBhd2FpdCB0aGlzLmNvbmZpZy5jcmVkZW50aWFsc0NsaWVudC5zZXRDcmVkZW50aWFscyhjcmVkZW50aWFscylcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNyZWRlbnRpYWxzKVxuICB9XG5cbiAgLyoqXG4gICAqIEJpbmQgd2l0aCBwcm92aWRlclxuICAgKiBAcGFyYW0ge0JpbmRXaXRoUHJvdmlkZXJSZXF1ZXN0fSBwYXJhbXMgQSBCaW5kV2l0aFByb3ZpZGVyUmVxdWVzdCBvYmplY3QuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgUHJvbWlzZTxhbnk+IG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBiaW5kV2l0aFByb3ZpZGVyKHBhcmFtczogQmluZFdpdGhQcm92aWRlclJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcucmVxdWVzdDxhbnk+KEFwaVVybHMuUFJPVklERVJfQklORF9VUkwsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgYm9keTogcGFyYW1zLFxuICAgICAgd2l0aENyZWRlbnRpYWxzOiB0cnVlLFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB1c2VyIHByb2ZpbGUuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8VXNlclByb2ZpbGU+fSBBIFByb21pc2U8VXNlclByb2ZpbGU+IG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRVc2VyUHJvZmlsZShwYXJhbXM6IHsgdmVyc2lvbj86IHN0cmluZyB9KTogUHJvbWlzZTxVc2VyUHJvZmlsZT4ge1xuICAgIHJldHVybiB0aGlzLmdldFVzZXJJbmZvKHBhcmFtcylcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHVzZXIgaW5mby5cbiAgICogQHJldHVybiB7UHJvbWlzZTxVc2VySW5mbz59IEEgUHJvbWlzZTxVc2VyUHJvZmlsZT4gb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFVzZXJJbmZvKHBhcmFtczogeyB2ZXJzaW9uPzogc3RyaW5nOyBxdWVyeT86IHN0cmluZyB9ID0ge30pOiBQcm9taXNlPFVzZXJJbmZvPiB7XG4gICAgY29uc3QgcmVzID0gdGhpcy5nZXRQYXJhbXNCeVZlcnNpb24ocGFyYW1zLCAnVVNFUl9NRV9VUkwnKVxuXG4gICAgaWYgKHJlcy5wYXJhbXM/LnF1ZXJ5KSB7XG4gICAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHJlcy5wYXJhbXMucXVlcnkgYXMgYW55KVxuICAgICAgcmVzLnVybCArPSBgPyR7c2VhcmNoUGFyYW1zLnRvU3RyaW5nKCl9YFxuICAgIH1cblxuICAgIGNvbnN0IHVzZXJJbmZvID0gYXdhaXQgdGhpcy5jb25maWcucmVxdWVzdDxVc2VySW5mbz4ocmVzLnVybCwge1xuICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgIHdpdGhDcmVkZW50aWFsczogdHJ1ZSxcbiAgICB9KVxuXG4gICAgaWYgKHVzZXJJbmZvLnN1Yikge1xuICAgICAgdXNlckluZm8udWlkID0gdXNlckluZm8uc3ViXG4gICAgfVxuXG4gICAgcmV0dXJuIHVzZXJJbmZvXG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB1c2VyIGluZm8gYnkgd2VkYSBwbHVnaW4uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55Pn0gQSBQcm9taXNlPGFueT4gb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFdlZGFVc2VySW5mbygpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHVzZXJJbmZvID0gYXdhaXQgdGhpcy5jb25maWcucmVxdWVzdDxhbnk+KEFwaVVybHMuV0VEQV9VU0VSX1VSTCwge1xuICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgIHdpdGhDcmVkZW50aWFsczogdHJ1ZSxcbiAgICB9KVxuICAgIHJldHVybiB1c2VySW5mb1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBtZVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGVsZXRlTWUocGFyYW1zOiBXaXRoU3Vkb1JlcXVlc3QpOiBQcm9taXNlPFVzZXJQcm9maWxlPiB7XG4gICAgY29uc3QgcmVzID0gdGhpcy5nZXRQYXJhbXNCeVZlcnNpb24ocGFyYW1zLCAnVVNFUl9NRV9VUkwnKVxuICAgIGNvbnN0IHVybCA9IGAke3Jlcy51cmx9PyR7QXV0aC5wYXJzZVBhcmFtc1RvU2VhcmNoKHJlcy5wYXJhbXMpfWBcbiAgICByZXR1cm4gdGhpcy5jb25maWcucmVxdWVzdDxVc2VyUHJvZmlsZT4odXJsLCB7XG4gICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgd2l0aENyZWRlbnRpYWxzOiB0cnVlLFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogaGFzTG9naW5TdGF0ZSBjaGVjayBpZiBoYXMgbG9naW4gc3RhdGVcbiAgICogQHJldHVybiB7UHJvbWlzZTxib29sZWFuPn0gQSBQcm9taXNlPGJvb2xlYW4+IG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBoYXNMb2dpblN0YXRlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbmZpZy5jcmVkZW50aWFsc0NsaWVudC5nZXRBY2Nlc3NUb2tlbigpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaGFzTG9naW5TdGF0ZVN5bmMoKTogQ3JlZGVudGlhbHMgfCBudWxsIHtcbiAgICBjb25zdCBjcmVkZW50aWFscyA9IHRoaXMuY29uZmlnLmNyZWRlbnRpYWxzQ2xpZW50LmdldENyZWRlbnRpYWxzU3luYygpXG4gICAgcmV0dXJuIGNyZWRlbnRpYWxzXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0TG9naW5TdGF0ZSgpOiBQcm9taXNlPENyZWRlbnRpYWxzIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5jcmVkZW50aWFsc0NsaWVudC5nZXRDcmVkZW50aWFsc0FzeW5jKClcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFucyBieSBwcm92aWRlci5cbiAgICogQHBhcmFtIHtUcmFuc0J5UHJvdmlkZXJSZXF1ZXN0fSBwYXJhbXMgQSBUcmFuc0J5UHJvdmlkZXJSZXF1ZXN0IG9iamVjdC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxDcmVkZW50aWFscz59IEEgUHJvbWlzZTxDcmVkZW50aWFscz4gb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHRyYW5zQnlQcm92aWRlcihwYXJhbXM6IFRyYW5zQnlQcm92aWRlclJlcXVlc3QpOiBQcm9taXNlPENyZWRlbnRpYWxzPiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnJlcXVlc3Q8Q3JlZGVudGlhbHM+KEFwaVVybHMuVVNFUl9UUkFOU19CWV9QUk9WSURFUl9VUkwsIHtcbiAgICAgIG1ldGhvZDogJ1BBVENIJyxcbiAgICAgIGJvZHk6IHBhcmFtcyxcbiAgICAgIHdpdGhDcmVkZW50aWFsczogdHJ1ZSxcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IHRva2VuLlxuICAgKiBAcGFyYW0ge0dyYW50VG9rZW5SZXF1ZXN0fSBwYXJhbXMgQSBHcmFudFRva2VuUmVxdWVzdCBvYmplY3QuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Q3JlZGVudGlhbHM+fSBBIFByb21pc2U8Q3JlZGVudGlhbHM+IG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBncmFudFRva2VuKHBhcmFtczogR3JhbnRUb2tlblJlcXVlc3QpOiBQcm9taXNlPENyZWRlbnRpYWxzPiB7XG4gICAgY29uc3QgcmVzID0gdGhpcy5nZXRQYXJhbXNCeVZlcnNpb24ocGFyYW1zLCAnQVVUSF9UT0tFTl9VUkwnKVxuICAgIHJldHVybiB0aGlzLmNvbmZpZy5yZXF1ZXN0PENyZWRlbnRpYWxzPihyZXMudXJsLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IHJlcy5wYXJhbXMsXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHByb3ZpZGUgbGlzdC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxVc2VyUHJvZmlsZVByb3ZpZGVyPn0gQSBQcm9taXNlPFVzZXJQcm9maWxlUHJvdmlkZXI+IG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRQcm92aWRlcnMoKTogUHJvbWlzZTxVc2VyUHJvZmlsZVByb3ZpZGVyPiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnJlcXVlc3Q8VXNlclByb2ZpbGVQcm92aWRlcj4oQXBpVXJscy5QUk9WSURFUl9MSVNULCB7XG4gICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgd2l0aENyZWRlbnRpYWxzOiB0cnVlLFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogdW5iaW5kIHByb3ZpZGVyLlxuICAgKiBAcGFyYW0ge1VuYmluZFByb3ZpZGVyUmVxdWVzdH0gcGFyYW1zXG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIHB1YmxpYyBhc3luYyB1bmJpbmRQcm92aWRlcihwYXJhbXM6IFVuYmluZFByb3ZpZGVyUmVxdWVzdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5yZXF1ZXN0PGFueT4oYCR7QXBpVXJscy5QUk9WSURFUl9VTkJJTkRfVVJMfS8ke3BhcmFtcy5wcm92aWRlcl9pZH1gLCB7XG4gICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgd2l0aENyZWRlbnRpYWxzOiB0cnVlLFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogY2hlY2sgUGFzc3dvcmQuXG4gICAqIEBwYXJhbSB7Q2hlY2tQYXNzd29yZHJSZXF1ZXN0fSBwYXJhbXNcbiAgICogQHJldHVybiB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNoZWNrUGFzc3dvcmQocGFyYW1zOiBDaGVja1Bhc3N3b3JkclJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcucmVxdWVzdDxhbnk+KGAke0FwaVVybHMuQ0hFQ0tfUFdEX1VSTH1gLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIHdpdGhDcmVkZW50aWFsczogdHJ1ZSxcbiAgICAgIGJvZHk6IHBhcmFtcyxcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEVkaXQgQ29udGFjdCDkv67mlLkg5omL5py65Y+3IOaIliDpgq7nrrFcbiAgICogQHBhcmFtIHtFZGl0Q29udGFjdFJlcXVlc3R9IHBhcmFtc1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGVkaXRDb250YWN0KHBhcmFtczogRWRpdENvbnRhY3RSZXF1ZXN0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnJlcXVlc3Q8dm9pZD4oYCR7QXBpVXJscy5CSU5EX0NPTlRBQ1RfVVJMfWAsIHtcbiAgICAgIG1ldGhvZDogJ1BBVENIJyxcbiAgICAgIHdpdGhDcmVkZW50aWFsczogdHJ1ZSxcbiAgICAgIGJvZHk6IHBhcmFtcyxcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCBQYXNzd29yZC5cbiAgICogQHBhcmFtIHtTZXRQYXNzd29yZHJSZXF1ZXN0fSBwYXJhbXNcbiAgICogQHJldHVybiB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNldFBhc3N3b3JkKHBhcmFtczogU2V0UGFzc3dvcmRSZXF1ZXN0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnJlcXVlc3Q8YW55PihgJHtBcGlVcmxzLkFVVEhfU0VUX1BBU1NXT1JEfWAsIHtcbiAgICAgIG1ldGhvZDogJ1BBVENIJyxcbiAgICAgIHdpdGhDcmVkZW50aWFsczogdHJ1ZSxcbiAgICAgIGJvZHk6IHBhcmFtcyxcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIHVwZGF0ZVBhc3N3b3JkQnlPbGQg5L2/55So5pen5a+G56CB5L+u5pS55a+G56CB77yM5aaC5p6c5bey57uP57uR5a6a5omL5py65Y+377yM6K+35YWI77yac3Vkb++8jOWGjeS/ruaUueWvhueggVxuICAgKiBAcGFyYW0ge1NldFBhc3N3b3JkclJlcXVlc3R9IHBhcmFtc1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdXBkYXRlUGFzc3dvcmRCeU9sZChwYXJhbXM6IFVwZGF0ZVBhc3N3b3JkUmVxdWVzdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN1ZG9Ub2tlbiA9IGF3YWl0IHRoaXMuc3Vkbyh7IHBhc3N3b3JkOiBwYXJhbXMub2xkX3Bhc3N3b3JkIH0pXG4gICAgcmV0dXJuIHRoaXMuc2V0UGFzc3dvcmQoe1xuICAgICAgc3Vkb190b2tlbjogc3Vkb1Rva2VuLnN1ZG9fdG9rZW4sXG4gICAgICBuZXdfcGFzc3dvcmQ6IHBhcmFtcy5uZXdfcGFzc3dvcmQsXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBzdWRvXG4gICAqIEBwYXJhbSB7c3Vkb30gcGFyYW1zXG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzdWRvKHBhcmFtczogU3Vkb1JlcXVlc3QpOiBQcm9taXNlPFN1ZG9SZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5yZXF1ZXN0PFN1ZG9SZXNwb25zZT4oYCR7QXBpVXJscy5TVURPX1VSTH1gLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIHdpdGhDcmVkZW50aWFsczogdHJ1ZSxcbiAgICAgIGJvZHk6IHBhcmFtcyxcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCB1c2VyIHZlcmlmaWNhdGlvbi5cbiAgICogQHBhcmFtIHtHZXRWZXJpZmljYXRpb25SZXF1ZXN0fSBwYXJhbXMgQSBHZXRWZXJpZmljYXRpb25SZXF1ZXN0IE9iamVjdC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxHZXRWZXJpZmljYXRpb25SZXNwb25zZT59IEEgUHJvbWlzZTxHZXRWZXJpZmljYXRpb25SZXNwb25zZT4gb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlbmRWZXJpZmljYXRpb25Db2RlVG9DdXJyZW50VXNlcihwYXJhbXM6IEdldFZlcmlmaWNhdGlvblJlcXVlc3QpOiBQcm9taXNlPEdldFZlcmlmaWNhdGlvblJlc3BvbnNlPiB7XG4gICAgcGFyYW1zLnRhcmdldCA9ICdDVVJfVVNFUidcbiAgICByZXR1cm4gdGhpcy5jb25maWcucmVxdWVzdDxHZXRWZXJpZmljYXRpb25SZXNwb25zZT4oQXBpVXJscy5WRVJJRklDQVRJT05fVVJMLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IHBhcmFtcyxcbiAgICAgIHdpdGhDcmVkZW50aWFsczogdHJ1ZSxcbiAgICAgIHdpdGhDYXB0Y2hhOiB0cnVlLFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogY2hhbmdlIEJvdW5kIHByb3ZpZGVyLlxuICAgKiBAcGFyYW0ge0NoYW5nZUJvdW5kUHJvdmlkZXJSZXF1ZXN0fSBwYXJhbXMgQSBHZXRWZXJpZmljYXRpb25SZXF1ZXN0IE9iamVjdC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxDaGFuZ2VCb3VuZFByb3ZpZGVyUmVzcG9uc2U+fSBBIFByb21pc2U8R2V0VmVyaWZpY2F0aW9uUmVzcG9uc2U+IG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjaGFuZ2VCb3VuZFByb3ZpZGVyKHBhcmFtczogQ2hhbmdlQm91bmRQcm92aWRlclJlcXVlc3QpOiBQcm9taXNlPENoYW5nZUJvdW5kUHJvdmlkZXJSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5yZXF1ZXN0PENoYW5nZUJvdW5kUHJvdmlkZXJSZXNwb25zZT4oYCR7QXBpVXJscy5QUk9WSURFUl9MSVNUfS8ke3BhcmFtcy5wcm92aWRlcl9pZH0vdHJhbnNgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IHtcbiAgICAgICAgcHJvdmlkZXJfdHJhbnNfdG9rZW46IHBhcmFtcy50cmFuc190b2tlbixcbiAgICAgIH0sXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IHRydWUsXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXRjaCB0aGUgdXNlciBwcm9maWxlLlxuICAgKiBAcGFyYW0ge1VzZXJQcm9maWxlfSBwYXJhbXMgQSBVc2VyUHJvZmlsZSBPYmplY3QuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8VXNlclByb2ZpbGU+fSBBIFByb21pc2U8VXNlclByb2ZpbGU+IG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXRVc2VyUHJvZmlsZShwYXJhbXM6IFVzZXJQcm9maWxlKTogUHJvbWlzZTxVc2VyUHJvZmlsZT4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5yZXF1ZXN0PFVzZXJQcm9maWxlPihBcGlVcmxzLlVTRVJfUFJJRklMRV9VUkwsIHtcbiAgICAgIG1ldGhvZDogJ1BBVENIJyxcbiAgICAgIGJvZHk6IHBhcmFtcyxcbiAgICAgIHdpdGhDcmVkZW50aWFsczogdHJ1ZSxcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB1c2VyIGJhc2ljIGluZm9cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVVc2VyQmFzaWNJbmZvKHBhcmFtczogTW9kaWZ5VXNlckJhc2ljSW5mb1JlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcucmVxdWVzdChBcGlVcmxzLlVTRVJfQkFTSUNfRURJVF9VUkwsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgd2l0aENyZWRlbnRpYWxzOiB0cnVlLFxuICAgICAgYm9keTogcGFyYW1zLFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUGF0Y2ggdGhlIHVzZXIgcHJvZmlsZS5cbiAgICogQHBhcmFtIHtRdWVyeVVzZXJQcm9maWxlUmVxfSBhcHBlbmRlZF9wYXJhbXMgQSBRdWVyeVVzZXJQcm9maWxlUmVxIE9iamVjdC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxVc2VyUHJvZmlsZT59IEEgUHJvbWlzZTxVc2VyUHJvZmlsZT4gb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHF1ZXJ5VXNlclByb2ZpbGUocGFyYW1zOiBRdWVyeVVzZXJQcm9maWxlUmVxdWVzdCk6IFByb21pc2U8UXVlcnlVc2VyUHJvZmlsZVJlc3BvbnNlPiB7XG4gICAgLy8gbGV0IHVybCA9IG5ldyBVUkwoQXBpVXJscy5VU0VSX1FVRVJZX1VSTCk7XG4gICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhwYXJhbXMgYXMgYW55KVxuICAgIC8vIHVybC5zZWFyY2ggPSBzZWFyY2hQYXJhbXMudG9TdHJpbmcoKTtcbiAgICByZXR1cm4gdGhpcy5jb25maWcucmVxdWVzdDxRdWVyeVVzZXJQcm9maWxlUmVzcG9uc2U+KGAke0FwaVVybHMuVVNFUl9RVUVSWV9VUkx9PyR7c2VhcmNoUGFyYW1zLnRvU3RyaW5nKCl9YCwge1xuICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgIHdpdGhDcmVkZW50aWFsczogdHJ1ZSxcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIHNldEN1c3RvbVNpZ25GdW5jIHNldCB0aGUgZ2V0IHRpY2tldCBmdW5jdGlvblxuICAgKiBAcGFyYW0gZ2V0VGlja0ZuXG4gICAqL1xuICBwdWJsaWMgc2V0Q3VzdG9tU2lnbkZ1bmMoZ2V0VGlja0ZuOiBHZXRDdXN0b21TaWduVGlja2V0Rm4pIHtcbiAgICB0aGlzLmdldEN1c3RvbVNpZ25UaWNrZXRGbiA9IGdldFRpY2tGblxuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25JbldpdGhDdXN0b21UaWNrZXQgY3VzdG9tIHNpZ25JblxuICAgKiBAY29uc3RydWN0b3JcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzaWduSW5XaXRoQ3VzdG9tVGlja2V0KHBhcmFtcz86IHsgdmVyc2lvbj86IHN0cmluZyB9KTogUHJvbWlzZTxDcmVkZW50aWFscz4ge1xuICAgIGNvbnN0IGN1c3RvbVNpZ25UaWNrZXRGbiA9IHRoaXMuZ2V0Q3VzdG9tU2lnblRpY2tldEZuXG4gICAgaWYgKCFjdXN0b21TaWduVGlja2V0Rm4pIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCh7XG4gICAgICAgIGVycm9yOiAnZmFpbGVkX3ByZWNvbmRpdGlvbicsXG4gICAgICAgIGVycm9yX2Rlc2NyaXB0aW9uOiAncGxlYXNlIHVzZSBzZXRDdXN0b21TaWduRnVuYyB0byBzZXQgY3VzdG9tIHNpZ24gZnVuY3Rpb24nLFxuICAgICAgfSlcbiAgICB9XG4gICAgY29uc3QgY3VzdG9tVGlja2V0ID0gYXdhaXQgY3VzdG9tU2lnblRpY2tldEZuKClcbiAgICByZXR1cm4gdGhpcy5zaWduSW5XaXRoUHJvdmlkZXIoe1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgcHJvdmlkZXJfaWQ6ICdjdXN0b20nLFxuICAgICAgcHJvdmlkZXJfdG9rZW46IGN1c3RvbVRpY2tldCxcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHBhc3N3b3JkXG4gICAqIEBwYXJhbSB7UmVzZXRQYXNzd29yZFJlcXVlc3R9IHBhcmFtc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICogQG1lbWJlcm9mIEF1dGhcbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXNldFBhc3N3b3JkKHBhcmFtczogUmVzZXRQYXNzd29yZFJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcucmVxdWVzdChBcGlVcmxzLkFVVEhfUkVTRVRfUEFTU1dPUkQsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgYm9keTogcGFyYW1zLFxuICAgICAgLy8gd2l0aENyZWRlbnRpYWxzOiB0cnVlXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBdXRob3JpemUgb2F1dGggQXV0aG9yaXplXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYXV0aG9yaXplKHBhcmFtczogQXV0aG9yaXplUmVxdWVzdCk6IFByb21pc2U8QXV0aG9yaXplUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcucmVxdWVzdDxBdXRob3JpemVSZXNwb25zZT4oQXBpVXJscy5BVVRIT1JJWkVfVVJMLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIHdpdGhDcmVkZW50aWFsczogdHJ1ZSxcbiAgICAgIGJvZHk6IHBhcmFtcyxcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIGF1dGhvcml6ZSBkZXZpY2VcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGF1dGhvcml6ZURldmljZShwYXJhbXM6IEF1dGhvcml6ZURldmljZVJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcucmVxdWVzdDx2b2lkPihBcGlVcmxzLkFVVEhPUklaRV9ERVZJQ0VfVVJMLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIHdpdGhDcmVkZW50aWFsczogdHJ1ZSxcbiAgICAgIGJvZHk6IHBhcmFtcyxcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIGRldmljZSBhdXRob3JpemF0aW9uXG4gICAqIEBwYXJhbSB7RGV2aWNlQXV0aG9yaXplUmVxdWVzdH0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPERldmljZUF1dGhvcml6ZVJlc3BvbnNlPn1cbiAgICogQG1lbWJlcm9mIEF1dGhcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZXZpY2VBdXRob3JpemUocGFyYW1zOiBEZXZpY2VBdXRob3JpemVSZXF1ZXN0KTogUHJvbWlzZTxEZXZpY2VBdXRob3JpemVSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5yZXF1ZXN0KEFwaVVybHMuQVVUSF9HRVRfREVWSUNFX0NPREUsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgYm9keTogcGFyYW1zLFxuICAgICAgd2l0aENyZWRlbnRpYWxzOiB0cnVlLFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogT0F1dGggZ2V0IGF1dGhvcml6ZSBpbmZvXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYXV0aG9yaXplSW5mbyhwYXJhbXM6IEF1dGhvcml6ZUluZm9SZXF1ZXN0KTogUHJvbWlzZTxBdXRob3JpemVJbmZvUmVzcG9uc2U+IHtcbiAgICBjb25zdCB1cmwgPSBgJHtBcGlVcmxzLkFVVEhPUklaRV9JTkZPX1VSTH0/JHtBdXRoLnBhcnNlUGFyYW1zVG9TZWFyY2gocGFyYW1zKX1gXG4gICAgbGV0IHdpdGhCYXNpY0F1dGggPSB0cnVlXG4gICAgbGV0IHdpdGhDcmVkZW50aWFscyA9IGZhbHNlXG4gICAgY29uc3QgaGFzTG9naW4gPSBhd2FpdCB0aGlzLmhhc0xvZ2luU3RhdGUoKVxuICAgIGlmIChoYXNMb2dpbikge1xuICAgICAgd2l0aENyZWRlbnRpYWxzID0gdHJ1ZVxuICAgICAgd2l0aEJhc2ljQXV0aCA9IGZhbHNlXG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbmZpZy5yZXF1ZXN0PEF1dGhvcml6ZUluZm9SZXNwb25zZT4odXJsLCB7XG4gICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgd2l0aEJhc2ljQXV0aCxcbiAgICAgIHdpdGhDcmVkZW50aWFscyxcbiAgICB9KVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGNoZWNrVXNlcm5hbWUocGFyYW1zOiBDaGVja1VzZXJuYW1lUmVxdWVzdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5yZXF1ZXN0KEFwaVVybHMuQ0hFQ0tfVVNFUk5BTUUsIHtcbiAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICBib2R5OiBwYXJhbXMsXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IHRydWUsXG4gICAgfSlcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjaGVja0lmVXNlckV4aXN0KHBhcmFtczogQ2hlY2tJZlVzZXJFeGlzdFJlcXVlc3QpOiBQcm9taXNlPENoZWNrSWZVc2VyRXhpc3RSZXNwb25zZT4ge1xuICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocGFyYW1zIGFzIGFueSlcblxuICAgIHJldHVybiB0aGlzLmNvbmZpZy5yZXF1ZXN0PENoZWNrSWZVc2VyRXhpc3RSZXNwb25zZT4oYCR7QXBpVXJscy5DSEVDS19JRl9VU0VSX0VYSVNUfT8ke3NlYXJjaFBhcmFtcy50b1N0cmluZygpfWAsIHtcbiAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgfSlcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBsb2dpblNjb3BlKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmNyZWRlbnRpYWxzQ2xpZW50LmdldFNjb3BlKClcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBsb2dpbkdyb3VwcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmNyZWRlbnRpYWxzQ2xpZW50LmdldEdyb3VwcygpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVmcmVzaFRva2VuRm9yY2UocGFyYW1zOiB7IHZlcnNpb24/OiBzdHJpbmcgfSkge1xuICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscyA9IGF3YWl0IHRoaXMuY29uZmlnLmNyZWRlbnRpYWxzQ2xpZW50LmdldENyZWRlbnRpYWxzKClcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jb25maWcuY3JlZGVudGlhbHNDbGllbnQucmVmcmVzaFRva2VuKHtcbiAgICAgIC4uLmNyZWRlbnRpYWxzLFxuICAgICAgdmVyc2lvbjogcGFyYW1zPy52ZXJzaW9uIHx8ICd2MScsXG4gICAgfSlcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRDcmVkZW50aWFscygpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuY3JlZGVudGlhbHNDbGllbnQuZ2V0Q3JlZGVudGlhbHMoKVxuICB9XG5cbiAgLyoqXG4gICAqIGdldCBwdWJsaWMga2V5IGZvciByZXF1ZXN0IHBhcmFtcyBlbmNyeXB0aW9uXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0UHVibGljS2V5KCk6IFByb21pc2U8UHVibGljS2V5PiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnJlcXVlc3Q8UHVibGljS2V5PihBcGlVcmxzVjIuQVVUSF9QVUJMSUNfS0VZLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IHt9LFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogZW5jcnlwdCByZXF1ZXN0IHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0RW5jcnlwdFBhcmFtcyhwYXJhbXM6IFJlY29yZDxhbnksIGFueT4pOiBQcm9taXNlPEVuY3J5cHRQYXJhbXM+IHtcbiAgICBjb25zdCBwYXlsb2FkID0gZGVlcENsb25lKHBhcmFtcylcblxuICAgIGlmICghcGF5bG9hZC5pc0VuY3J5cHQpIHtcbiAgICAgIHJldHVybiBwYXJhbXNcbiAgICB9XG5cbiAgICBsZXQgcHVibGljS2V5ID0gJydcbiAgICBsZXQgcHVibGljX2tleV90aHVtYnByaW50ID0gJydcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmdldFB1YmxpY0tleSgpXG4gICAgICBwdWJsaWNLZXkgPSByZXMucHVibGljX2tleVxuICAgICAgcHVibGljX2tleV90aHVtYnByaW50ID0gcmVzLnB1YmxpY19rZXlfdGh1bWJwcmludFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7fVxuXG4gICAgaWYgKCFwdWJsaWNLZXkgfHwgIXB1YmxpY19rZXlfdGh1bWJwcmludCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwdWJsaWNfa2V5IG9yIHB1YmxpY19rZXlfdGh1bWJwcmludCBpcyBlbXB0eScpXG4gICAgfVxuXG4gICAgZGVsZXRlIHBheWxvYWQuaXNFbmNyeXB0XG5cbiAgICByZXR1cm4ge1xuICAgICAgcGFyYW1zOiBnZXRFbmNyeXB0SW5mbyh7IHB1YmxpY0tleSwgcGF5bG9hZCB9KSxcbiAgICAgIHB1YmxpY19rZXlfdGh1bWJwcmludCxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZ2V0IHByb3ZpZGVyIHN1YiB0eXBlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0UHJvdmlkZXJTdWJUeXBlKCk6IFByb21pc2U8UHJvdmlkZXJTdWJUeXBlPiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnJlcXVlc3Q8UHJvdmlkZXJTdWJUeXBlPihBcGlVcmxzLkdFVF9QUk9WSURFUl9UWVBFLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IHtcbiAgICAgICAgcHJvdmlkZXJfaWQ6ICd3ZWRhJyxcbiAgICAgIH0sXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgcHJvdmlkZXIgc3ViIHR5cGVcbiAgICogQHJldHVybnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyB2ZXJpZnlDYXB0Y2hhRGF0YSh7IHRva2VuLCBrZXkgfTogeyB0b2tlbjogc3RyaW5nOyBrZXk6IHN0cmluZyB9KSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnJlcXVlc3Q8eyBjYXB0Y2hhX3Rva2VuOiBzdHJpbmc7IGV4cGlyZXNfaW46IG51bWJlciB9PihBcGlVcmxzLlZFUklGWV9DQVBUQ0hBX0RBVEFfVVJMLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IHsgdG9rZW4sIGtleSB9LFxuICAgICAgd2l0aENyZWRlbnRpYWxzOiBmYWxzZSxcbiAgICB9KVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGNyZWF0ZUNhcHRjaGFEYXRhKHsgc3RhdGUsIHJlZGlyZWN0X3VyaSA9IHVuZGVmaW5lZCB9KSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnJlcXVlc3Q8eyBjYXB0Y2hhX3Rva2VuOiBzdHJpbmc7IGV4cGlyZXNfaW46IG51bWJlciB9PihBcGlVcmxzLkNBUFRDSEFfREFUQV9VUkwsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgYm9keTogeyBzdGF0ZSwgcmVkaXJlY3RfdXJpIH0sXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IGZhbHNlLFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogbWluaS1wcm9ncmFtIHNjYW4gY29kZVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldE1pbmlQcm9ncmFtQ29kZShwYXJhbXM6IEdldE1pbmlQcm9ncmFtUXJDb2RlUmVxdWVzdCk6IFByb21pc2U8R2V0TWluaVByb2dyYW1RckNvZGVSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5yZXF1ZXN0PEdldE1pbmlQcm9ncmFtUXJDb2RlUmVzcG9uc2U+KEFwaVVybHMuR0VUX01JTklQUk9HUkFNX1FSQ09ERSwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBib2R5OiBwYXJhbXMsXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBtaW5pLXByb2dyYW0gc2NhbiBjb2RlIHN0YXR1c1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldE1pbmlQcm9ncmFtUXJDb2RlU3RhdHVzKHBhcmFtczogR2V0TWluaVByb2dyYW1RckNvZGVTdGF0dXNSZXF1ZXN0LCk6IFByb21pc2U8R2V0TWluaVByb2dyYW1RckNvZGVTdGF0dXNSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5yZXF1ZXN0PEdldE1pbmlQcm9ncmFtUXJDb2RlU3RhdHVzUmVzcG9uc2U+KEFwaVVybHMuR0VUX01JTklQUk9HUkFNX1FSQ09ERV9TVEFUVVMsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgYm9keTogcGFyYW1zLFxuICAgIH0pXG4gIH1cbn1cbiJdfQ==
498
+ }
499
+ }