io.parrots
Version:
Parrots.io App
443 lines (442 loc) • 53.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Headers, RequestOptions } from '@angular/http';
import { AbstractServerResource } from 'com.phloxui';
export class ParrotsAccountResource extends AbstractServerResource {
/**
* @param {?} connectionMgr
*/
constructor(connectionMgr) {
super(connectionMgr);
this.basePath = './account';
}
/**
* @param {?} options
* @param {?} headerData
* @return {?}
*/
addingHeaderRequestOptionsArgs(options, headerData) {
if (options === null || typeof options === 'undefined') {
options = new RequestOptions();
}
if (headerData !== null && typeof headerData !== 'undefined') {
if (options.headers !== null && typeof options.headers !== 'undefined') {
for (let /** @type {?} */ key in headerData) {
options.headers.set(key, headerData[key]);
}
}
else {
options.headers = new Headers(headerData);
}
}
return options;
}
/**
* @param {?} body
* @return {?}
*/
changePasswordWithHttpInfo(body) {
if (this.connectionMgr !== null && typeof this.connectionMgr !== 'undefined') {
let /** @type {?} */ url = this.basePath + "/recovery/setpassword";
let /** @type {?} */ requestOptionsArgs = new RequestOptions();
let /** @type {?} */ responseProm = this.connectionMgr.postWithHttpInfo(url, body, requestOptionsArgs);
if (responseProm != null && typeof responseProm !== 'undefined') {
return new Promise((resolve, reject) => {
responseProm.then((response) => {
resolve(response);
}, (error) => {
reject(error);
});
});
}
}
return new Promise((resolve, reject) => {
resolve(null);
});
}
/**
* @param {?} body
* @return {?}
*/
changePassword(body) {
if (this.connectionMgr !== null && typeof this.connectionMgr !== 'undefined') {
let /** @type {?} */ url = this.basePath + "/recovery/setpassword";
let /** @type {?} */ requestOptionsArgs = new RequestOptions();
let /** @type {?} */ responseProm = this.connectionMgr.post(url, body, requestOptionsArgs);
if (responseProm != null && typeof responseProm !== 'undefined') {
return new Promise((resolve, reject) => {
responseProm.then((response) => {
resolve(response);
}, (error) => {
reject(error);
});
});
}
}
return new Promise((resolve, reject) => {
resolve(null);
});
}
/**
* @param {?} email
* @return {?}
*/
sendEmailChangePasswordWithHttpInfo(email) {
if (this.connectionMgr !== null && typeof this.connectionMgr !== 'undefined') {
let /** @type {?} */ url = this.basePath + "/recovery/request";
let /** @type {?} */ requestOptionsArgs = new RequestOptions();
requestOptionsArgs.body = {
email: email
};
let /** @type {?} */ responseProm = this.connectionMgr.postWithHttpInfo(url, requestOptionsArgs.body, requestOptionsArgs);
if (responseProm != null && typeof responseProm !== 'undefined') {
return new Promise((resolve, reject) => {
responseProm.then((response) => {
resolve(response);
}, (error) => {
reject(error);
});
});
}
}
return new Promise((resolve, reject) => {
resolve(null);
});
}
/**
* @param {?} email
* @return {?}
*/
sendEmailChangePassword(email) {
if (this.connectionMgr !== null && typeof this.connectionMgr !== 'undefined') {
let /** @type {?} */ url = this.basePath + "/recovery/request";
let /** @type {?} */ requestOptionsArgs = new RequestOptions();
requestOptionsArgs.body = {
email: email
};
let /** @type {?} */ responseProm = this.connectionMgr.post(url, requestOptionsArgs.body, requestOptionsArgs);
if (responseProm != null && typeof responseProm !== 'undefined') {
return new Promise((resolve, reject) => {
responseProm.then((response) => {
resolve(response);
}, (error) => {
reject(error);
});
});
}
}
return new Promise((resolve, reject) => {
resolve(null);
});
}
/**
* @param {?} body
* @return {?}
*/
sendEmailValidationAccountWithHttpInfo(body) {
if (this.connectionMgr !== null && typeof this.connectionMgr !== 'undefined') {
let /** @type {?} */ url = this.basePath + "/sendemailvalidationaccount";
let /** @type {?} */ requestOptionsArgs = new RequestOptions();
requestOptionsArgs.body = body;
let /** @type {?} */ responseProm = this.connectionMgr.postWithHttpInfo(url, requestOptionsArgs.body, requestOptionsArgs);
if (responseProm != null && typeof responseProm !== 'undefined') {
return new Promise((resolve, reject) => {
responseProm.then((response) => {
resolve(response);
}, (error) => {
reject(error);
});
});
}
}
return new Promise((resolve, reject) => {
resolve(null);
});
}
/**
* @param {?} body
* @return {?}
*/
sendEmailValidationAccount(body) {
if (this.connectionMgr !== null && typeof this.connectionMgr !== 'undefined') {
let /** @type {?} */ url = this.basePath + "/sendemailvalidationaccount";
//! for testing
let /** @type {?} */ requestOptionsArgs = new RequestOptions();
requestOptionsArgs.body = body;
let /** @type {?} */ responseProm = this.connectionMgr.post(url, requestOptionsArgs.body, requestOptionsArgs);
if (responseProm != null && typeof responseProm !== 'undefined') {
return new Promise((resolve, reject) => {
responseProm.then((response) => {
resolve(response);
}, (error) => {
reject(error);
});
});
}
}
return new Promise((resolve, reject) => {
resolve(null);
});
}
/**
* @param {?} userId
* @param {?} secret
* @return {?}
*/
activateAccountWithHttpInfo(userId, secret) {
if (this.connectionMgr !== null && typeof this.connectionMgr !== 'undefined') {
let /** @type {?} */ url = this.basePath + "/activate/confirm?userId=" + userId + "&secret=" + secret;
let /** @type {?} */ requestOptionsArgs = new RequestOptions();
let /** @type {?} */ body = {
userId: userId,
secret: secret
};
let /** @type {?} */ responseProm = this.connectionMgr.postWithHttpInfo(url, body, requestOptionsArgs);
if (responseProm != null && typeof responseProm !== 'undefined') {
return new Promise((resolve, reject) => {
responseProm.then((response) => {
resolve(response);
}, (error) => {
reject(error);
});
});
}
}
return new Promise((resolve, reject) => {
resolve(null);
});
}
/**
* @param {?} value
* @return {?}
*/
getAccountsInfo(value) {
if (this.connectionMgr !== null && typeof this.connectionMgr !== 'undefined') {
let /** @type {?} */ url = this.basePath + "";
let /** @type {?} */ requestOptionsArgs = new RequestOptions();
let /** @type {?} */ responseProm = this.connectionMgr.postWithHttpInfo(url, value, requestOptionsArgs);
if (responseProm != null && typeof responseProm !== 'undefined') {
return new Promise((resolve, reject) => {
responseProm.then((response) => {
resolve(response);
}, (error) => {
reject(error);
});
});
}
}
return new Promise((resolve, reject) => {
resolve(null);
});
}
/**
* @param {?} body
* @return {?}
*/
getAccountsInfos(body) {
if (this.connectionMgr !== null && typeof this.connectionMgr !== 'undefined') {
let /** @type {?} */ url = this.basePath + "/search";
let /** @type {?} */ requestOptionsArgs = new RequestOptions();
let /** @type {?} */ responseProm = this.connectionMgr.postWithHttpInfo(url, body, requestOptionsArgs);
if (responseProm != null && typeof responseProm !== 'undefined') {
return new Promise((resolve, reject) => {
responseProm.then((response) => {
resolve(response);
}, (error) => {
reject(error);
});
});
}
}
return new Promise((resolve, reject) => {
resolve(null);
});
}
/**
* @param {?} username
* @param {?} password
* @return {?}
*/
loginWithHttpInfo(username, password) {
if (this.connectionMgr !== null && typeof this.connectionMgr !== 'undefined') {
let /** @type {?} */ url = this.basePath + "/login";
let /** @type {?} */ requestOptionsArgs = new RequestOptions();
requestOptionsArgs.body = {
"userId": username,
"password": password,
"client": {}
};
return this.connectionMgr.postWithHttpInfo(url, requestOptionsArgs.body, requestOptionsArgs);
}
else {
Promise.reject(null);
}
}
/**
* @param {?} createAccountDTO
* @return {?}
*/
registerWithHttpInfo(createAccountDTO) {
if (this.connectionMgr !== null && typeof this.connectionMgr !== 'undefined') {
let /** @type {?} */ url = this.basePath + "/register";
//! for testing
let /** @type {?} */ requestOptionsArgs = new RequestOptions();
requestOptionsArgs.body = createAccountDTO;
let /** @type {?} */ responseProm = this.connectionMgr.postWithHttpInfo(url, requestOptionsArgs.body, requestOptionsArgs);
if (responseProm != null && typeof responseProm !== 'undefined') {
return new Promise((resolve, reject) => {
responseProm.then((response) => {
resolve(response);
}, (error) => {
reject(error);
});
});
}
}
return new Promise((resolve, reject) => {
resolve(null);
});
}
/**
* @param {?} createAccountDTO
* @return {?}
*/
register(createAccountDTO) {
if (this.connectionMgr !== null && typeof this.connectionMgr !== 'undefined') {
let /** @type {?} */ url = this.basePath + "/register";
//! for testing
let /** @type {?} */ requestOptionsArgs = new RequestOptions();
requestOptionsArgs.body = createAccountDTO;
let /** @type {?} */ responseProm = this.connectionMgr.post(url, requestOptionsArgs.body, requestOptionsArgs);
if (responseProm != null && typeof responseProm !== 'undefined') {
return new Promise((resolve, reject) => {
responseProm.then((response) => {
resolve(response);
}, (error) => {
reject(error);
});
});
}
}
return new Promise((resolve, reject) => {
resolve(null);
});
}
/**
* @param {?} req
* @return {?}
*/
checkWithHttpInfo(req) {
if (this.connectionMgr !== null && typeof this.connectionMgr !== 'undefined') {
let /** @type {?} */ url = this.basePath + "/check";
let /** @type {?} */ requestOptionsArgs = new RequestOptions();
requestOptionsArgs.body = {
"userId": req.username,
"email": req.email
};
let /** @type {?} */ responseProm = this.connectionMgr.postWithHttpInfo(url, requestOptionsArgs.body, requestOptionsArgs);
if (responseProm != null && typeof responseProm !== 'undefined') {
return new Promise((resolve, reject) => {
responseProm.then((response) => {
resolve(response);
}, (error) => {
reject(error);
});
});
}
}
return new Promise((resolve, reject) => {
resolve(null);
});
}
/**
* @param {?} req
* @return {?}
*/
check(req) {
if (this.connectionMgr !== null && typeof this.connectionMgr !== 'undefined') {
let /** @type {?} */ url = this.basePath + "/check";
let /** @type {?} */ requestOptionsArgs = new RequestOptions();
requestOptionsArgs.body = {
"userId": req.username,
"email": req.email
};
let /** @type {?} */ responseProm = this.connectionMgr.post(url, requestOptionsArgs.body, requestOptionsArgs);
if (responseProm != null && typeof responseProm !== 'undefined') {
return new Promise((resolve, reject) => {
responseProm.then((response) => {
resolve(response);
}, (error) => {
reject(error);
});
});
}
}
return new Promise((resolve, reject) => {
resolve(null);
});
}
/**
* @param {?} authenProvider
* @param {?} clientId
* @param {?} token
* @param {?=} clientName
* @param {?=} clientData
* @return {?}
*/
oauthLoginWithHttpInfo(authenProvider, clientId, token, clientName, clientData) {
if (this.connectionMgr !== null && typeof this.connectionMgr !== 'undefined') {
let /** @type {?} */ url = this.basePath + "/oauth/login";
let /** @type {?} */ requestOptionsArgs = new RequestOptions();
this.addingHeaderRequestOptionsArgs(requestOptionsArgs, {
"Token": token,
"Authen-Provider": authenProvider,
"Client-Id": clientId,
"Client-Name": clientName
});
requestOptionsArgs.body = (clientData !== undefined && clientData !== null) ? clientData : {};
return this.connectionMgr.postWithHttpInfo(url, requestOptionsArgs.body, requestOptionsArgs);
}
else {
Promise.reject(null);
}
}
/**
* @param {?} authenProvider
* @param {?} clientId
* @param {?} token
* @param {?} registerDTO
* @return {?}
*/
createOauthWithHttpInfo(authenProvider, clientId, token, registerDTO) {
if (this.connectionMgr !== null && typeof this.connectionMgr !== 'undefined') {
let /** @type {?} */ url = this.basePath + "/oauth";
let /** @type {?} */ requestOptionsArgs = new RequestOptions();
this.addingHeaderRequestOptionsArgs(requestOptionsArgs, {
"Token": token,
"Authen-Provider": authenProvider,
"Client-Id": clientId
});
// registerDTO as "userId"
// {
// "userId": "string",
// "password": "string",
// "email": "string",
// "firstName": "string",
// "lastName": "string"
// }
requestOptionsArgs.body = (registerDTO !== undefined && registerDTO !== null) ? registerDTO : {};
return this.connectionMgr.postWithHttpInfo(url, requestOptionsArgs.body, requestOptionsArgs);
}
else {
Promise.reject(null);
}
}
}
function ParrotsAccountResource_tsickle_Closure_declarations() {
/** @type {?} */
ParrotsAccountResource.prototype.basePath;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFycm90c0FjY291bnRSZXNvdXJjZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lvLnBhcnJvdHMvIiwic291cmNlcyI6WyJsaWIvc2hhcmUvcmVzb3VyY2UvUGFycm90c0FjY291bnRSZXNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFrQixPQUFPLEVBQUUsY0FBYyxFQUEyRSxNQUFNLGVBQWUsQ0FBQztBQUdqSixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFJckQsTUFBTSw2QkFBOEIsU0FBUSxzQkFBc0I7Ozs7SUFJaEUsWUFBWSxhQUFpQztRQUMzQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7d0JBSEosV0FBVztLQUk3Qjs7Ozs7O0lBRU8sOEJBQThCLENBQUMsT0FBMkIsRUFBRSxVQUFzQztRQUN4RyxFQUFFLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxJQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDdkQsT0FBTyxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7U0FDaEM7UUFFRCxFQUFFLENBQUMsQ0FBQyxVQUFVLEtBQUssSUFBSSxJQUFJLE9BQU8sVUFBVSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDN0QsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sS0FBSyxJQUFJLElBQUksT0FBTyxPQUFPLENBQUMsT0FBTyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZFLEdBQUcsQ0FBQyxDQUFDLHFCQUFJLEdBQUcsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDO29CQUMzQixPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7aUJBQzNDO2FBQ0Y7WUFBQyxJQUFJLENBQUMsQ0FBQztnQkFDTixPQUFPLENBQUMsT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLFVBQVUs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QUFJLEdBQUcsR0FBVyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztZQUUzQyxxQkFBSSxrQkFBa0IsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQzlDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxrQkFBa0IsRUFBRTtnQkFDdEQsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsaUJBQWlCLEVBQUUsY0FBYztnQkFDakMsV0FBVyxFQUFFLFFBQVE7YUFDdEIsQ0FBQyxDQUFDOzs7Ozs7Ozs7WUFTSCxrQkFBa0IsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxXQUFXLEtBQUssU0FBUyxJQUFLLFdBQVcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFFbEcsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLGtCQUFrQixDQUFDLElBQUksRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1NBRTlGO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDTixPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3RCOztDQUVKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cCwgUmVzcG9uc2UsIEhlYWRlcnMsIFJlcXVlc3RPcHRpb25zLCBSZXF1ZXN0T3B0aW9uc0FyZ3MsIFVSTFNlYXJjaFBhcmFtcywgUmVzcG9uc2VDb250ZW50VHlwZSwgUmVxdWVzdE1ldGhvZCB9IGZyb20gJ0Bhbmd1bGFyL2h0dHAnO1xuaW1wb3J0IHsgQ29ubmVjdGlvbk1hbmFnZXIgfSBmcm9tICdjb20ucGhsb3h1aSc7XG5pbXBvcnQgeyBJQ29ubmVjdGlvbk1hbmFnZXIgfSBmcm9tICdjb20ucGhsb3h1aSc7XG5pbXBvcnQgeyBBYnN0cmFjdFNlcnZlclJlc291cmNlIH0gZnJvbSAnY29tLnBobG94dWknO1xuaW1wb3J0IHsgRmFjZWJvb2tMb2dpblByb3ZpZGVyLCBHb29nbGVMb2dpblByb3ZpZGVyIH0gZnJvbSAnYW5ndWxhci02LXNvY2lhbC1sb2dpbic7XG5pbXBvcnQgeyBDcmVhdGVBY2NvdW50RFRPLCBTZXggfSBmcm9tICcuLi9tb2RlbC9tb2RlbHMnO1xuXG5leHBvcnQgY2xhc3MgUGFycm90c0FjY291bnRSZXNvdXJjZSBleHRlbmRzIEFic3RyYWN0U2VydmVyUmVzb3VyY2Uge1xuXG4gIHByaXZhdGUgYmFzZVBhdGggPSAnLi9hY2NvdW50JztcblxuICBjb25zdHJ1Y3Rvcihjb25uZWN0aW9uTWdyOiBJQ29ubmVjdGlvbk1hbmFnZXIpIHtcbiAgICBzdXBlcihjb25uZWN0aW9uTWdyKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkaW5nSGVhZGVyUmVxdWVzdE9wdGlvbnNBcmdzKG9wdGlvbnM6IFJlcXVlc3RPcHRpb25zQXJncywgaGVhZGVyRGF0YTogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH0pOiBSZXF1ZXN0T3B0aW9uc0FyZ3Mge1xuICAgIGlmIChvcHRpb25zID09PSBudWxsIHx8IHR5cGVvZiBvcHRpb25zID09PSAndW5kZWZpbmVkJykge1xuICAgICAgb3B0aW9ucyA9IG5ldyBSZXF1ZXN0T3B0aW9ucygpO1xuICAgIH1cblxuICAgIGlmIChoZWFkZXJEYXRhICE9PSBudWxsICYmIHR5cGVvZiBoZWFkZXJEYXRhICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKG9wdGlvbnMuaGVhZGVycyAhPT0gbnVsbCAmJiB0eXBlb2Ygb3B0aW9ucy5oZWFkZXJzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBmb3IgKGxldCBrZXkgaW4gaGVhZGVyRGF0YSkge1xuICAgICAgICAgIG9wdGlvbnMuaGVhZGVycy5zZXQoa2V5LCBoZWFkZXJEYXRhW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHRpb25zLmhlYWRlcnMgPSBuZXcgSGVhZGVycyhoZWFkZXJEYXRhKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb3B0aW9ucztcbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VQYXNzd29yZFdpdGhIdHRwSW5mbyhib2R5OiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLmNvbm5lY3Rpb25NZ3IgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuY29ubmVjdGlvbk1nciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGxldCB1cmw6IHN0cmluZyA9IHRoaXMuYmFzZVBhdGggKyBcIi9yZWNvdmVyeS9zZXRwYXNzd29yZFwiO1xuXG4gICAgICBsZXQgcmVxdWVzdE9wdGlvbnNBcmdzID0gbmV3IFJlcXVlc3RPcHRpb25zKCk7XG5cbiAgICAgIGxldCByZXNwb25zZVByb20gPSB0aGlzLmNvbm5lY3Rpb25NZ3IucG9zdFdpdGhIdHRwSW5mbyh1cmwsIGJvZHksIHJlcXVlc3RPcHRpb25zQXJncyk7XG5cbiAgICAgIGlmIChyZXNwb25zZVByb20gIT0gbnVsbCAmJiB0eXBlb2YgcmVzcG9uc2VQcm9tICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIHJlc3BvbnNlUHJvbS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7XG4gICAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VQYXNzd29yZChib2R5OiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLmNvbm5lY3Rpb25NZ3IgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuY29ubmVjdGlvbk1nciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGxldCB1cmw6IHN0cmluZyA9IHRoaXMuYmFzZVBhdGggKyBcIi9yZWNvdmVyeS9zZXRwYXNzd29yZFwiO1xuXG4gICAgICBsZXQgcmVxdWVzdE9wdGlvbnNBcmdzID0gbmV3IFJlcXVlc3RPcHRpb25zKCk7XG5cbiAgICAgIGxldCByZXNwb25zZVByb20gPSB0aGlzLmNvbm5lY3Rpb25NZ3IucG9zdCh1cmwsIGJvZHksIHJlcXVlc3RPcHRpb25zQXJncyk7XG5cbiAgICAgIGlmIChyZXNwb25zZVByb20gIT0gbnVsbCAmJiB0eXBlb2YgcmVzcG9uc2VQcm9tICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIHJlc3BvbnNlUHJvbS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7XG4gICAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZW5kRW1haWxDaGFuZ2VQYXNzd29yZFdpdGhIdHRwSW5mbyhlbWFpbDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAodGhpcy5jb25uZWN0aW9uTWdyICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmNvbm5lY3Rpb25NZ3IgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBsZXQgdXJsOiBzdHJpbmcgPSB0aGlzLmJhc2VQYXRoICsgXCIvcmVjb3ZlcnkvcmVxdWVzdFwiO1xuXG4gICAgICBsZXQgcmVxdWVzdE9wdGlvbnNBcmdzID0gbmV3IFJlcXVlc3RPcHRpb25zKCk7XG4gICAgICByZXF1ZXN0T3B0aW9uc0FyZ3MuYm9keSA9IHtcbiAgICAgICAgZW1haWw6IGVtYWlsXG4gICAgICB9O1xuXG4gICAgICBsZXQgcmVzcG9uc2VQcm9tID0gdGhpcy5jb25uZWN0aW9uTWdyLnBvc3RXaXRoSHR0cEluZm8odXJsLCByZXF1ZXN0T3B0aW9uc0FyZ3MuYm9keSwgcmVxdWVzdE9wdGlvbnNBcmdzKTtcblxuICAgICAgaWYgKHJlc3BvbnNlUHJvbSAhPSBudWxsICYmIHR5cGVvZiByZXNwb25zZVByb20gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgcmVzcG9uc2VQcm9tLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICByZXNvbHZlKG51bGwpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNlbmRFbWFpbENoYW5nZVBhc3N3b3JkKGVtYWlsOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLmNvbm5lY3Rpb25NZ3IgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuY29ubmVjdGlvbk1nciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGxldCB1cmw6IHN0cmluZyA9IHRoaXMuYmFzZVBhdGggKyBcIi9yZWNvdmVyeS9yZXF1ZXN0XCI7XG5cbiAgICAgIGxldCByZXF1ZXN0T3B0aW9uc0FyZ3MgPSBuZXcgUmVxdWVzdE9wdGlvbnMoKTtcbiAgICAgIHJlcXVlc3RPcHRpb25zQXJncy5ib2R5ID0ge1xuICAgICAgICBlbWFpbDogZW1haWxcbiAgICAgIH07XG5cbiAgICAgIGxldCByZXNwb25zZVByb20gPSB0aGlzLmNvbm5lY3Rpb25NZ3IucG9zdCh1cmwsIHJlcXVlc3RPcHRpb25zQXJncy5ib2R5LCByZXF1ZXN0T3B0aW9uc0FyZ3MpO1xuXG4gICAgICBpZiAocmVzcG9uc2VQcm9tICE9IG51bGwgJiYgdHlwZW9mIHJlc3BvbnNlUHJvbSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICByZXNwb25zZVByb20udGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2VuZEVtYWlsVmFsaWRhdGlvbkFjY291bnRXaXRoSHR0cEluZm8oYm9keTogYW55KTogUHJvbWlzZTxhbnk+IHtcblxuICAgIGlmICh0aGlzLmNvbm5lY3Rpb25NZ3IgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuY29ubmVjdGlvbk1nciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGxldCB1cmw6IHN0cmluZyA9IHRoaXMuYmFzZVBhdGggKyBcIi9zZW5kZW1haWx2YWxpZGF0aW9uYWNjb3VudFwiO1xuXG4gICAgICBsZXQgcmVxdWVzdE9wdGlvbnNBcmdzID0gbmV3IFJlcXVlc3RPcHRpb25zKCk7XG4gICAgICByZXF1ZXN0T3B0aW9uc0FyZ3MuYm9keSA9IGJvZHk7XG5cbiAgICAgIGxldCByZXNwb25zZVByb20gPSB0aGlzLmNvbm5lY3Rpb25NZ3IucG9zdFdpdGhIdHRwSW5mbyh1cmwsIHJlcXVlc3RPcHRpb25zQXJncy5ib2R5LCByZXF1ZXN0T3B0aW9uc0FyZ3MpO1xuXG4gICAgICBpZiAocmVzcG9uc2VQcm9tICE9IG51bGwgJiYgdHlwZW9mIHJlc3BvbnNlUHJvbSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICByZXNwb25zZVByb20udGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2VuZEVtYWlsVmFsaWRhdGlvbkFjY291bnQoYm9keTogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAodGhpcy5jb25uZWN0aW9uTWdyICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmNvbm5lY3Rpb25NZ3IgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBsZXQgdXJsOiBzdHJpbmcgPSB0aGlzLmJhc2VQYXRoICsgXCIvc2VuZGVtYWlsdmFsaWRhdGlvbmFjY291bnRcIjtcblxuICAgICAgLy8hIGZvciB0ZXN0aW5nXG4gICAgICBsZXQgcmVxdWVzdE9wdGlvbnNBcmdzID0gbmV3IFJlcXVlc3RPcHRpb25zKCk7XG4gICAgICByZXF1ZXN0T3B0aW9uc0FyZ3MuYm9keSA9IGJvZHk7XG5cbiAgICAgIGxldCByZXNwb25zZVByb20gPSB0aGlzLmNvbm5lY3Rpb25NZ3IucG9zdCh1cmwsIHJlcXVlc3RPcHRpb25zQXJncy5ib2R5LCByZXF1ZXN0T3B0aW9uc0FyZ3MpO1xuXG4gICAgICBpZiAocmVzcG9uc2VQcm9tICE9IG51bGwgJiYgdHlwZW9mIHJlc3BvbnNlUHJvbSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICByZXNwb25zZVByb20udGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYWN0aXZhdGVBY2NvdW50V2l0aEh0dHBJbmZvKHVzZXJJZDogc3RyaW5nLCBzZWNyZXQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMuY29ubmVjdGlvbk1nciAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5jb25uZWN0aW9uTWdyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgbGV0IHVybDogc3RyaW5nID0gdGhpcy5iYXNlUGF0aCArIFwiL2FjdGl2YXRlL2NvbmZpcm0/dXNlcklkPVwiICsgdXNlcklkICsgXCImc2VjcmV0PVwiICsgc2VjcmV0O1xuXG4gICAgICBsZXQgcmVxdWVzdE9wdGlvbnNBcmdzID0gbmV3IFJlcXVlc3RPcHRpb25zKCk7XG4gICAgICBsZXQgYm9keSA9IHtcbiAgICAgICAgdXNlcklkOiB1c2VySWQsXG4gICAgICAgIHNlY3JldDogc2VjcmV0XG4gICAgICB9O1xuXG4gICAgICBsZXQgcmVzcG9uc2VQcm9tID0gdGhpcy5jb25uZWN0aW9uTWdyLnBvc3RXaXRoSHR0cEluZm8odXJsLCBib2R5LCByZXF1ZXN0T3B0aW9uc0FyZ3MpO1xuXG4gICAgICBpZiAocmVzcG9uc2VQcm9tICE9IG51bGwgJiYgdHlwZW9mIHJlc3BvbnNlUHJvbSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICByZXNwb25zZVByb20udGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QWNjb3VudHNJbmZvKHZhbHVlOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLmNvbm5lY3Rpb25NZ3IgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuY29ubmVjdGlvbk1nciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGxldCB1cmw6IHN0cmluZyA9IHRoaXMuYmFzZVBhdGggKyBcIlwiO1xuXG4gICAgICBsZXQgcmVxdWVzdE9wdGlvbnNBcmdzID0gbmV3IFJlcXVlc3RPcHRpb25zKCk7XG4gICAgICBsZXQgcmVzcG9uc2VQcm9tID0gdGhpcy5jb25uZWN0aW9uTWdyLnBvc3RXaXRoSHR0cEluZm8odXJsLCB2YWx1ZSwgcmVxdWVzdE9wdGlvbnNBcmdzKTtcblxuICAgICAgaWYgKHJlc3BvbnNlUHJvbSAhPSBudWxsICYmIHR5cGVvZiByZXNwb25zZVByb20gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgcmVzcG9uc2VQcm9tLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QWNjb3VudHNJbmZvcyhib2R5OiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLmNvbm5lY3Rpb25NZ3IgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuY29ubmVjdGlvbk1nciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGxldCB1cmw6IHN0cmluZyA9IHRoaXMuYmFzZVBhdGggKyBcIi9zZWFyY2hcIjtcblxuICAgICAgbGV0IHJlcXVlc3RPcHRpb25zQXJncyA9IG5ldyBSZXF1ZXN0T3B0aW9ucygpO1xuICAgICAgbGV0IHJlc3BvbnNlUHJvbSA9IHRoaXMuY29ubmVjdGlvbk1nci5wb3N0V2l0aEh0dHBJbmZvKHVybCwgYm9keSwgcmVxdWVzdE9wdGlvbnNBcmdzKTtcblxuICAgICAgaWYgKHJlc3BvbnNlUHJvbSAhPSBudWxsICYmIHR5cGVvZiByZXNwb25zZVByb20gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgcmVzcG9uc2VQcm9tLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbG9naW5XaXRoSHR0cEluZm8odXNlcm5hbWU6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMuY29ubmVjdGlvbk1nciAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5jb25uZWN0aW9uTWdyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgbGV0IHVybDogc3RyaW5nID0gdGhpcy5iYXNlUGF0aCArIFwiL2xvZ2luXCI7XG5cbiAgICAgIGxldCByZXF1ZXN0T3B0aW9uc0FyZ3MgPSBuZXcgUmVxdWVzdE9wdGlvbnMoKTtcbiAgICAgIHJlcXVlc3RPcHRpb25zQXJncy5ib2R5ID0ge1xuICAgICAgICBcInVzZXJJZFwiOiB1c2VybmFtZSxcbiAgICAgICAgXCJwYXNzd29yZFwiOiBwYXNzd29yZCxcbiAgICAgICAgXCJjbGllbnRcIjoge1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uTWdyLnBvc3RXaXRoSHR0cEluZm8odXJsLCByZXF1ZXN0T3B0aW9uc0FyZ3MuYm9keSwgcmVxdWVzdE9wdGlvbnNBcmdzKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBQcm9taXNlLnJlamVjdChudWxsKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJXaXRoSHR0cEluZm8oY3JlYXRlQWNjb3VudERUTzogQ3JlYXRlQWNjb3VudERUTyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMuY29ubmVjdGlvbk1nciAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5jb25uZWN0aW9uTWdyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgbGV0IHVybDogc3RyaW5nID0gdGhpcy5iYXNlUGF0aCArIFwiL3JlZ2lzdGVyXCI7XG5cbiAgICAgIC8vISBmb3IgdGVzdGluZ1xuICAgICAgbGV0IHJlcXVlc3RPcHRpb25zQXJncyA9IG5ldyBSZXF1ZXN0T3B0aW9ucygpO1xuICAgICAgcmVxdWVzdE9wdGlvbnNBcmdzLmJvZHkgPSBjcmVhdGVBY2NvdW50RFRPO1xuXG4gICAgICBsZXQgcmVzcG9uc2VQcm9tID0gdGhpcy5jb25uZWN0aW9uTWdyLnBvc3RXaXRoSHR0cEluZm8odXJsLCByZXF1ZXN0T3B0aW9uc0FyZ3MuYm9keSwgcmVxdWVzdE9wdGlvbnNBcmdzKTtcblxuICAgICAgaWYgKHJlc3BvbnNlUHJvbSAhPSBudWxsICYmIHR5cGVvZiByZXNwb25zZVByb20gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgcmVzcG9uc2VQcm9tLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICByZXNvbHZlKG51bGwpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyKGNyZWF0ZUFjY291bnREVE86IENyZWF0ZUFjY291bnREVE8pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLmNvbm5lY3Rpb25NZ3IgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuY29ubmVjdGlvbk1nciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGxldCB1cmw6IHN0cmluZyA9IHRoaXMuYmFzZVBhdGggKyBcIi9yZWdpc3RlclwiO1xuXG4gICAgICAvLyEgZm9yIHRlc3RpbmdcbiAgICAgIGxldCByZXF1ZXN0T3B0aW9uc0FyZ3MgPSBuZXcgUmVxdWVzdE9wdGlvbnMoKTtcbiAgICAgIHJlcXVlc3RPcHRpb25zQXJncy5ib2R5ID0gY3JlYXRlQWNjb3VudERUTztcblxuICAgICAgbGV0IHJlc3BvbnNlUHJvbSA9IHRoaXMuY29ubmVjdGlvbk1nci5wb3N0KHVybCwgcmVxdWVzdE9wdGlvbnNBcmdzLmJvZHksIHJlcXVlc3RPcHRpb25zQXJncyk7XG5cbiAgICAgIGlmIChyZXNwb25zZVByb20gIT0gbnVsbCAmJiB0eXBlb2YgcmVzcG9uc2VQcm9tICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIHJlc3BvbnNlUHJvbS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7XG4gICAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjaGVja1dpdGhIdHRwSW5mbyhyZXE6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMuY29ubmVjdGlvbk1nciAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5jb25uZWN0aW9uTWdyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgbGV0IHVybDogc3RyaW5nID0gdGhpcy5iYXNlUGF0aCArIFwiL2NoZWNrXCI7XG5cbiAgICAgIGxldCByZXF1ZXN0T3B0aW9uc0FyZ3MgPSBuZXcgUmVxdWVzdE9wdGlvbnMoKTtcbiAgICAgIHJlcXVlc3RPcHRpb25zQXJncy5ib2R5ID0ge1xuICAgICAgICBcInVzZXJJZFwiOiByZXEudXNlcm5hbWUsXG4gICAgICAgIFwiZW1haWxcIjogcmVxLmVtYWlsXG4gICAgICB9O1xuXG4gICAgICBsZXQgcmVzcG9uc2VQcm9tID0gdGhpcy5jb25uZWN0aW9uTWdyLnBvc3RXaXRoSHR0cEluZm8odXJsLCByZXF1ZXN0T3B0aW9uc0FyZ3MuYm9keSwgcmVxdWVzdE9wdGlvbnNBcmdzKTtcblxuICAgICAgaWYgKHJlc3BvbnNlUHJvbSAhPSBudWxsICYmIHR5cGVvZiByZXNwb25zZVByb20gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgcmVzcG9uc2VQcm9tLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgIC