ng-yunzai-mobile
Version:
1. 适配yunzai_uni_app_x
569 lines • 42.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: devices/wechat.mp.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { BaseDevice } from "./base.device";
import { Injectable, Inject } from "@angular/core";
import { HttpClient } from "@angular/common/http";
import { BASE_CLIENT } from "../client/base.client";
import { preloaderFinished } from "../auth/preloader";
import { from } from "rxjs";
import { Title } from "@angular/platform-browser";
import { TokenService } from "../token/token.service";
import { UserService } from "../user/user.service";
import { map } from "rxjs/operators";
import * as i0 from "@angular/core";
import * as i1 from "../token/token.service";
import * as i2 from "@angular/common/http";
import * as i3 from "../user/user.service";
import * as i4 from "@angular/platform-browser";
import * as i5 from "../client/base.client";
/** @type {?} */
var apis = [
"updateAppMessageShareData",
"updateTimelineShareData",
"onMenuShareTimeline",
"onMenuShareAppMessage",
"onMenuShareQQ",
"onMenuShareWeibo",
"onMenuShareQZone",
"startRecord",
"stopRecord",
"onVoiceRecordEnd",
"playVoice",
"pauseVoice",
"stopVoice",
"onVoicePlayEnd",
"uploadVoice",
"downloadVoice",
"chooseImage",
"previewImage",
"uploadImage",
"downloadImage",
"translateVoice",
"getNetworkType",
"openLocation",
"getLocation",
"hideOptionMenu",
"showOptionMenu",
"hideMenuItems",
"showMenuItems",
"hideAllNonBaseMenuItem",
"showAllNonBaseMenuItem",
"closeWindow",
"scanQRCode",
"chooseWXPay",
"openProductSpecificView",
"addCard",
"chooseCard",
"openCard",
];
/** @type {?} */
var openTags = [
'wx-open-launch-weapp',
'wx-open-launch-app',
'wx-open-subscribe',
'wx-open-audio'
];
var WechatMp = /** @class */ (function (_super) {
tslib_1.__extends(WechatMp, _super);
function WechatMp(tokenService, http, user, title, baseclient) {
var _this = _super.call(this) || this;
_this.tokenService = tokenService;
_this.http = http;
_this.user = user;
_this.title = title;
_this.baseclient = baseclient;
return _this;
}
/**
* @return {?}
*/
WechatMp.prototype.auth = /**
* @return {?}
*/
function () {
var _this = this;
if (this.baseclient.wechat && this.baseclient.wechat.auth === false) {
return new Promise((/**
* @param {?} resolve
* @param {?} reject
* @return {?}
*/
function (resolve, reject) {
preloaderFinished();
resolve(true);
}));
}
// 如果是本地开发配置了账号密码
if (this.baseclient.dev && this.baseclient.dev.username && this.baseclient.dev.password) {
return new Promise((/**
* @param {?} resolve
* @param {?} reject
* @return {?}
*/
function (resolve, reject) {
_this.authByConfiguredUserPass().then((/**
* @return {?}
*/
function () {
_this.http
.get(_this.baseclient.gateway + "/auth/user")
.subscribe((/**
* @param {?} response
* @return {?}
*/
function (response) {
_this.user.set(tslib_1.__assign({}, response.principal, { tenantId: response.tenantId }));
preloaderFinished();
resolve(true);
}));
}));
}));
}
// 走微信端的认证流程
return new Promise((/**
* @param {?} reject
* @param {?} resolve
* @return {?}
*/
function (reject, resolve) {
/** @type {?} */
var url = encodeURIComponent(window.location.href);
_this.http
.get(_this.baseclient.gateway + "/wechat/mp/token?url=" + url)
.subscribe((/**
* @param {?} token
* @return {?}
*/
function (token) {
if (token.error_code === 200) {
_this.tokenService.set((/** @type {?} */ ({
accessToken: token.message,
tokenType: "bearer",
})));
_this.http
.get(_this.baseclient.gateway + "/auth/user")
.subscribe((/**
* @param {?} response
* @return {?}
*/
function (response) {
_this.user.set(tslib_1.__assign({}, response.principal, { tenantId: response.tenantId }));
// 暂不对微信jssdk进行对接
_this.generateWechatConfig();
preloaderFinished();
reject(null);
}));
}
else if (token.error_code === 500) {
// 没有token,则重定向到认证页面,认证完成后会跳回本页面
window.location.href = token.path;
}
}));
}));
};
/**
* @private
* @return {?}
*/
WechatMp.prototype.authByConfiguredUserPass = /**
* @private
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var form = new FormData();
form.set('username', this.baseclient.dev.username);
form.set('password', this.baseclient.dev.password);
form.set('grant_type', 'password');
form.set('client_id', 'webapp');
form.set('scope', 'webapp');
form.set('client_secret', '123456');
return this.http
.post(this.baseclient.gateway + "/auth/oauth/token", form)
.pipe(map((/**
* @param {?} response
* @return {?}
*/
function (response) {
/** @type {?} */
var token = {};
token.tokenType = response.token_type;
token.accessToken = response.access_token;
token.scope = response.scope;
token.tokenDateLine = response.expires_in;
_this.tokenService.set(token);
})))
.toPromise();
};
/**
* @param {?} iwindow
* @return {?}
*/
WechatMp.prototype.openWindow = /**
* @param {?} iwindow
* @return {?}
*/
function (iwindow) {
window.location.href = iwindow.url;
};
/**
* @param {?} ititle
* @return {?}
*/
WechatMp.prototype.setTitle = /**
* @param {?} ititle
* @return {?}
*/
function (ititle) {
this.title.setTitle(ititle.title);
};
/**
* @param {?} navigationBar
* @return {?}
*/
WechatMp.prototype.setNavigationBar = /**
* @param {?} navigationBar
* @return {?}
*/
function (navigationBar) {
alert("微信端暂不支持放置按钮,请在APP中使用此功能!");
return;
};
/**
* @param {?} ishare
* @return {?}
*/
WechatMp.prototype.share = /**
* @param {?} ishare
* @return {?}
*/
function (ishare) {
alert("微信端暂不支持分享,请在APP中使用此功能!");
};
/**
* @return {?}
*/
WechatMp.prototype.getToken = /**
* @return {?}
*/
function () {
/** @type {?} */
var itoken = {
accessToken: this.tokenService.get().accessToken,
tokenType: null,
tokenDataLine: null,
scope: null,
};
return itoken;
};
/**
* @return {?}
*/
WechatMp.prototype.scanCode = /**
* @return {?}
*/
function () {
/** @type {?} */
var p = new Promise((/**
* @param {?} resolve
* @param {?} reject
* @return {?}
*/
function (resolve, reject) {
wx.scanQRCode({
needResult: 1,
scanType: ['qrCode', 'barCode'],
success: (/**
* @param {?} res
* @return {?}
*/
function (res) {
resolve(res.resultStr);
}),
});
}));
return from(p);
};
/**
* @return {?}
*/
WechatMp.prototype.userLocation = /**
* @return {?}
*/
function () {
/** @type {?} */
var p = new Promise((/**
* @param {?} resolve
* @param {?} reject
* @return {?}
*/
function (resolve, reject) {
wx.getLocation({
type: 'wgs84',
// 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
success: (/**
* @param {?} res
* @return {?}
*/
function (res) {
if (res.errMsg === 'getLocation:ok') {
/** @type {?} */
var latitude = res.latitude;
// 纬度,浮点数,范围为90 ~ -90
/** @type {?} */
var longitude = res.longitude;
// 经度,浮点数,范围为180 ~ -180。
/** @type {?} */
var address = '微信无address';
resolve({ latitude: latitude, longitude: longitude, address: address });
}
}),
});
}));
return from(p);
};
/**
* @param {?} bssids
* @return {?}
*/
WechatMp.prototype.validateInWifi = /**
* @param {?} bssids
* @return {?}
*/
function (bssids) {
alert("微信端暂不支持WIFI验证,请在APP中使用此功能!");
return undefined;
};
/**
* @return {?}
*/
WechatMp.prototype.getWifiMac = /**
* @return {?}
*/
function () {
alert("微信端暂不支持获取MAC地址,请在APP中使用此功能!");
return undefined;
};
/**
* @return {?}
*/
WechatMp.prototype.generateWechatConfig = /**
* @return {?}
*/
function () {
this.http
.get(this.baseclient.gateway + "/wechat/mp/jssdk?url=" + encodeURIComponent(window.location.href))
.subscribe((/**
* @param {?} response
* @return {?}
*/
function (response) {
wx.config({
debug: false,
// 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: response.appId,
// 必填,公众号的唯一标识
timestamp: response.timestamp,
// 必填,生成签名的时间戳
nonceStr: response.nonceStr,
// 必填,生成签名的随机串
signature: response.signature,
// 必填,签名
jsApiList: apis,
// 必填,需要使用的JS接口列表
openTagList: openTags // 可选,需要使用的开放标签列表,例如['wx-open-launch-app']
});
}));
wx.ready((/**
* @return {?}
*/
function () {
// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,
// 所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
console.log('微信jssdk初始化完成.');
}));
wx.error((/**
* @param {?} res
* @return {?}
*/
function (res) {
// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
console.log('微信jssdk初始化失败:', res);
}));
};
/**
* @param {?} count
* @return {?}
*/
WechatMp.prototype.chooseContacts = /**
* @param {?} count
* @return {?}
*/
function (count) {
alert("微信端暂不支持获取联系人,请在APP中使用此功能!");
return undefined;
};
/**
* @param {?} targetUserId
* @return {?}
*/
WechatMp.prototype.contactDetails = /**
* @param {?} targetUserId
* @return {?}
*/
function (targetUserId) {
alert("微信端暂不支持查询联系人详细信息,请在APP中使用此功能!");
return undefined;
};
/**
* @param {?} count
* @param {?} sourceType
* @return {?}
*/
WechatMp.prototype.uploadImage = /**
* @param {?} count
* @param {?} sourceType
* @return {?}
*/
function (count, sourceType) {
alert("微信端暂不支持图片上传,请在APP中使用此功能!");
return undefined;
};
/**
* @param {?} url
* @param {?} openType
* @param {?} title
* @param {?} id
* @param {?} type
* @return {?}
*/
WechatMp.prototype.openReadWithTimer = /**
* @param {?} url
* @param {?} openType
* @param {?} title
* @param {?} id
* @param {?} type
* @return {?}
*/
function (url, openType, title, id, type) {
alert("微信端暂不支持读物时间统计,请在APP中使用此功能!");
return undefined;
};
/**
* @param {?} limitMinute
* @return {?}
*/
WechatMp.prototype.uploadMovie = /**
* @param {?} limitMinute
* @return {?}
*/
function (limitMinute) {
alert("微信端暂不支持视频上传,请在APP中使用此功能!");
return undefined;
};
/**
* @param {?} url
* @param {?} title
* @return {?}
*/
WechatMp.prototype.fileBrowser = /**
* @param {?} url
* @param {?} title
* @return {?}
*/
function (url, title) {
alert("微信端暂不支持此功能,请在APP中使用此功能!");
return undefined;
};
/**
* @param {?} ticket
* @param {?} callback
* @return {?}
*/
WechatMp.prototype.startSearchBeacons = /**
* @param {?} ticket
* @param {?} callback
* @return {?}
*/
function (ticket, callback) {
wx.startSearchBeacons({
ticket: ticket,
complete: callback,
});
};
/**
* @param {?} callback
* @return {?}
*/
WechatMp.prototype.stopSearchBeacons = /**
* @param {?} callback
* @return {?}
*/
function (callback) {
wx.stopSearchBeacons({
complete: callback,
});
};
/**
* @param {?} callback
* @return {?}
*/
WechatMp.prototype.onSearchBeacons = /**
* @param {?} callback
* @return {?}
*/
function (callback) {
wx.onSearchBeacons({
complete: callback,
});
};
WechatMp.decorators = [
{ type: Injectable, args: [{
providedIn: "root",
},] }
];
/** @nocollapse */
WechatMp.ctorParameters = function () { return [
{ type: TokenService },
{ type: HttpClient },
{ type: UserService },
{ type: Title },
{ type: undefined, decorators: [{ type: Inject, args: [BASE_CLIENT,] }] }
]; };
/** @nocollapse */ WechatMp.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function WechatMp_Factory() { return new WechatMp(i0.ɵɵinject(i1.TokenService), i0.ɵɵinject(i2.HttpClient), i0.ɵɵinject(i3.UserService), i0.ɵɵinject(i4.Title), i0.ɵɵinject(i5.BASE_CLIENT)); }, token: WechatMp, providedIn: "root" });
return WechatMp;
}(BaseDevice));
export { WechatMp };
if (false) {
/**
* @type {?}
* @private
*/
WechatMp.prototype.tokenService;
/**
* @type {?}
* @private
*/
WechatMp.prototype.http;
/**
* @type {?}
* @private
*/
WechatMp.prototype.user;
/**
* @type {?}
* @private
*/
WechatMp.prototype.title;
/**
* @type {?}
* @private
*/
WechatMp.prototype.baseclient;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2VjaGF0Lm1wLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmcteXVuemFpLW1vYmlsZS8iLCJzb3VyY2VzIjpbImRldmljZXMvd2VjaGF0Lm1wLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxXQUFXLEVBQWMsTUFBTSx1QkFBdUIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQU10RCxPQUFPLEVBQUUsSUFBSSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBRXhDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7SUFFN0IsSUFBSSxHQUFHO0lBQ1gsMkJBQTJCO0lBQzNCLHlCQUF5QjtJQUN6QixxQkFBcUI7SUFDckIsdUJBQXVCO0lBQ3ZCLGVBQWU7SUFDZixrQkFBa0I7SUFDbEIsa0JBQWtCO0lBQ2xCLGFBQWE7SUFDYixZQUFZO0lBQ1osa0JBQWtCO0lBQ2xCLFdBQVc7SUFDWCxZQUFZO0lBQ1osV0FBVztJQUNYLGdCQUFnQjtJQUNoQixhQUFhO0lBQ2IsZUFBZTtJQUNmLGFBQWE7SUFDYixjQUFjO0lBQ2QsYUFBYTtJQUNiLGVBQWU7SUFDZixnQkFBZ0I7SUFDaEIsZ0JBQWdCO0lBQ2hCLGNBQWM7SUFDZCxhQUFhO0lBQ2IsZ0JBQWdCO0lBQ2hCLGdCQUFnQjtJQUNoQixlQUFl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Ozs7Z0JBdkRRLFlBQVk7Z0JBWlosVUFBVTtnQkFhVixXQUFXO2dCQUZYLEtBQUs7Z0RBK0RULE1BQU0sU0FBQyxXQUFXOzs7bUJBNUV2QjtDQTJTQyxBQXhPRCxDQUc4QixVQUFVLEdBcU92QztTQXJPWSxRQUFROzs7Ozs7SUFFakIsZ0NBQWtDOzs7OztJQUNsQyx3QkFBd0I7Ozs7O0lBQ3hCLHdCQUF5Qjs7Ozs7SUFDekIseUJBQW9COzs7OztJQUNwQiw4QkFBbUQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlRGV2aWNlIH0gZnJvbSBcIi4vYmFzZS5kZXZpY2VcIjtcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5pbXBvcnQgeyBCQVNFX0NMSUVOVCwgQmFzZUNsaWVudCB9IGZyb20gXCIuLi9jbGllbnQvYmFzZS5jbGllbnRcIjtcclxuaW1wb3J0IHsgTXlXZWNoYXRNcFRva2VuIH0gZnJvbSBcIi4vbW9kZWwvd2VjaGF0Lm1wXCI7XHJcbmltcG9ydCB7IHByZWxvYWRlckZpbmlzaGVkIH0gZnJvbSBcIi4uL2F1dGgvcHJlbG9hZGVyXCI7XHJcbmltcG9ydCB7IElXaW5kb3cgfSBmcm9tIFwiLi9tb2RlbC93aW5kb3dcIjtcclxuaW1wb3J0IHsgSVRpdGxlIH0gZnJvbSBcIi4vbW9kZWwvdGl0bGVcIjtcclxuaW1wb3J0IHsgTmF2aWdhdGlvbkJhciB9IGZyb20gXCIuL21vZGVsL25hdmlnYXRpb25iYXJcIjtcclxuaW1wb3J0IHsgSVNoYXJlIH0gZnJvbSBcIi4vbW9kZWwvc2hhcmVcIjtcclxuaW1wb3J0IHsgSXRva2VuIH0gZnJvbSBcIi4uL2F1dGgvaXRva2VuXCI7XHJcbmltcG9ydCB7IGZyb20sIE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBVc2VyTG9jYXRpb24gfSBmcm9tIFwiLi9tb2RlbC9sb2NhdGlvblwiO1xyXG5pbXBvcnQgeyBUaXRsZSB9IGZyb20gXCJAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyXCI7XHJcbmltcG9ydCB7IFRva2VuU2VydmljZSB9IGZyb20gXCIuLi90b2tlbi90b2tlbi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSBcIi4uL3VzZXIvdXNlci5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7bWFwfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuXHJcbmNvbnN0IGFwaXMgPSBbXHJcbiAgXCJ1cGRhdGVBcHBNZXNzYWdlU2hhcmVEYXRhXCIsXHJcbiAgXCJ1cGRhdGVUaW1lbGluZVNoYXJlRGF0YVwiLFxyXG4gIFwib25NZW51U2hhcmVUaW1lbGluZVwiLFxyXG4gIFwib25NZW51U2hhcmVBcHBNZXNzYWdlXCIsXHJcbiAgXCJvbk1lbnVTaGFyZVFRXCIsXHJcbiAgXCJvbk1lbnVTaGFyZVdlaWJvXCIsXHJcbiAgXCJvbk1lbnVTaGFyZVFab25lXCIsXHJcbiAgXCJzdGFydFJlY29yZFwiLFxyXG4gIFwic3RvcFJlY29yZFwiLFxyXG4gIFwib25Wb2ljZVJlY29yZEVuZFwiLFxyXG4gIFwicGxheVZvaWNlXCIsXHJcbiAgXCJwYXVzZVZvaWNlXCIsXHJcbiAgXCJzdG9wVm9pY2VcIixcclxuICBcIm9uVm9pY2VQbGF5RW5kXCIsXHJcbiAgXCJ1cGxvYWRWb2ljZVwiLFxyXG4gIFwiZG93bmxvYWRWb2ljZVwiLFxyXG4gIFwiY2hvb3NlSW1hZ2VcIixcclxuICBcInByZXZpZXdJbWFnZVwiLFxyXG4gIFwidXBsb2FkSW1hZ2VcIixcclxuICBcImRvd25sb2FkSW1hZ2VcIixcclxuICBcInRyYW5zbGF0ZVZvaWNlXCIsXHJcbiAgXCJnZXROZXR3b3JrVHlwZVwiLFxyXG4gIFwib3BlbkxvY2F0aW9uXCIsXHJcbiAgXCJnZXRMb2NhdGlvblwiLFxyXG4gIFwiaGlkZU9wdGlvbk1lbnVcIixcclxuICBcInNob3dPcHRpb25NZW51XCIsXHJcbiAgXCJoaWRlTWVudUl0ZW1zXCIsXHJcbiAgXCJzaG93TWVudUl0ZW1zXCIsXHJcbiAgXCJoaWRlQWxsTm9uQmFzZU1lbnVJdGVtXCIsXHJcbiAgXCJzaG93QWxsTm9uQmFzZU1lbnVJdGVtXCIsXHJcbiAgXCJjbG9zZVdpbmRvd1wiLFxyXG4gIFwic2NhblFSQ29kZVwiLFxyXG4gIFwiY2hvb3NlV1hQYXlcIixcclxuICBcIm9wZW5Qcm9kdWN0U3BlY2lmaWNWaWV3XCIsXHJcbiAgXCJhZGRDYXJkXCIsXHJcbiAgXCJjaG9vc2VDYXJkXCIsXHJcbiAgXCJvcGVuQ2FyZFwiLFxyXG5dO1xyXG5cclxuY29uc3Qgb3BlblRhZ3MgPSBbXHJcbiAgJ3d4LW9wZW4tbGF1bmNoLXdlYXBwJyxcclxuICAnd3gtb3Blbi1sYXVuY2gtYXBwJyxcclxuICAnd3gtb3Blbi1zdWJzY3JpYmUnLFxyXG4gICd3eC1vcGVuLWF1ZGlvJ1xyXG5dO1xyXG5cclxuZGVjbGFyZSBsZXQgd3g7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogXCJyb290XCIsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBXZWNoYXRNcCBleHRlbmRzIEJhc2VEZXZpY2Uge1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSB0b2tlblNlcnZpY2U6IFRva2VuU2VydmljZSxcclxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcclxuICAgIHByaXZhdGUgdXNlcjogVXNlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRpdGxlOiBUaXRsZSxcclxuICAgIEBJbmplY3QoQkFTRV9DTElFTlQpIHByaXZhdGUgYmFzZWNsaWVudDogQmFzZUNsaWVudFxyXG4gICkge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcblxyXG4gIGF1dGgoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGlmICh0aGlzLmJhc2VjbGllbnQud2VjaGF0ICYmIHRoaXMuYmFzZWNsaWVudC53ZWNoYXQuYXV0aCA9PT0gZmFsc2UpIHtcclxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgIHByZWxvYWRlckZpbmlzaGVkKCk7XHJcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvLyDlpoLmnpzmmK/mnKzlnLDlvIDlj5HphY3nva7kuobotKblj7flr4bnoIFcclxuICAgIGlmICh0aGlzLmJhc2VjbGllbnQuZGV2ICYmIHRoaXMuYmFzZWNsaWVudC5kZXYudXNlcm5hbWUgJiYgdGhpcy5iYXNlY2xpZW50LmRldi5wYXNzd29yZCkge1xyXG4gICAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgdGhpcy5hdXRoQnlDb25maWd1cmVkVXNlclBhc3MoKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuaHR0cFxyXG4gICAgICAgICAgICAuZ2V0KGAke3RoaXMuYmFzZWNsaWVudC5nYXRld2F5fS9hdXRoL3VzZXJgKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy51c2VyLnNldCh7Li4ucmVzcG9uc2UucHJpbmNpcGFsLCB0ZW5hbnRJZDogcmVzcG9uc2UudGVuYW50SWR9KTtcclxuICAgICAgICAgICAgICBwcmVsb2FkZXJGaW5pc2hlZCgpO1xyXG4gICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDotbDlvq7kv6Hnq6/nmoTorqTor4HmtYHnqItcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChyZWplY3QsIHJlc29sdmUpID0+IHtcclxuICAgICAgY29uc3QgdXJsID0gZW5jb2RlVVJJQ29tcG9uZW50KHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcclxuICAgICAgdGhpcy5odHRwXHJcbiAgICAgICAgLmdldChgJHt0aGlzLmJhc2VjbGllbnQuZ2F0ZXdheX0vd2VjaGF0L21wL3Rva2VuP3VybD1gICsgdXJsKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKHRva2VuOiBNeVdlY2hhdE1wVG9rZW4pID0+IHtcclxuICAgICAgICAgIGlmICh0b2tlbi5lcnJvcl9jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgICAgdGhpcy50b2tlblNlcnZpY2Uuc2V0KHtcclxuICAgICAgICAgICAgICBhY2Nlc3NUb2tlbjogdG9rZW4ubWVzc2FnZSxcclxuICAgICAgICAgICAgICB0b2tlblR5cGU6IFwiYmVhcmVyXCIsXHJcbiAgICAgICAgICAgIH0gYXMgYW55KTtcclxuICAgICAgICAgICAgdGhpcy5odHRwXHJcbiAgICAgICAgICAgICAgLmdldChgJHt0aGlzLmJhc2VjbGllbnQuZ2F0ZXdheX0vYXV0aC91c2VyYClcclxuICAgICAgICAgICAgICAuc3Vic2NyaWJlKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVzZXIuc2V0KHsgLi4ucmVzcG9uc2UucHJpbmNpcGFsLCB0ZW5hbnRJZDogcmVzcG9uc2UudGVuYW50SWQgfSk7XHJcbiAgICAgICAgICAgICAgICAvLyDmmoLkuI3lr7nlvq7kv6Fqc3Nka+i/m+ihjOWvueaOpVxyXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZVdlY2hhdENvbmZpZygpO1xyXG4gICAgICAgICAgICAgICAgcHJlbG9hZGVyRmluaXNoZWQoKTtcclxuICAgICAgICAgICAgICAgIHJlamVjdChudWxsKTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4uZXJyb3JfY29kZSA9PT0gNTAwKSB7XHJcbiAgICAgICAgICAgIC8vIOayoeaciXRva2Vu77yM5YiZ6YeN5a6a5ZCR5Yiw6K6k6K+B6aG16Z2i77yM6K6k6K+B5a6M5oiQ5ZCO5Lya6Lez5Zue5pys6aG16Z2iXHJcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdG9rZW4ucGF0aDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhdXRoQnlDb25maWd1cmVkVXNlclBhc3MoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBmb3JtOiBGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xyXG4gICAgZm9ybS5zZXQoJ3VzZXJuYW1lJywgdGhpcy5iYXNlY2xpZW50LmRldi51c2VybmFtZSk7XHJcbiAgICBmb3JtLnNldCgncGFzc3dvcmQnLCB0aGlzLmJhc2VjbGllbnQuZGV2LnBhc3N3b3JkKTtcclxuICAgIGZvcm0uc2V0KCdncmFudF90eXBlJywgJ3Bhc3N3b3JkJyk7XHJcbiAgICBmb3JtLnNldCgnY2xpZW50X2lkJywgJ3dlYmFwcCcpO1xyXG4gICAgZm9ybS5zZXQoJ3Njb3BlJywgJ3dlYmFwcCcpO1xyXG4gICAgZm9ybS5zZXQoJ2NsaWVudF9zZWNyZXQnLCAnMTIzNDU2Jyk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFxyXG4gICAgICAucG9zdChgJHt0aGlzLmJhc2VjbGllbnQuZ2F0ZXdheX0vYXV0aC9vYXV0aC90b2tlbmAsIGZvcm0pXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgdG9rZW46IGFueSA9IHt9O1xyXG4gICAgICAgICAgdG9rZW4udG9rZW5UeXBlID0gcmVzcG9uc2UudG9rZW5fdHlwZTtcclxuICAgICAgICAgIHRva2VuLmFjY2Vzc1Rva2VuID0gcmVzcG9uc2UuYWNjZXNzX3Rva2VuO1xyXG4gICAgICAgICAgdG9rZW4uc2NvcGUgPSByZXNwb25zZS5zY29wZTtcclxuICAgICAgICAgIHRva2VuLnRva2VuRGF0ZUxpbmUgPSByZXNwb25zZS5leHBpcmVzX2luO1xyXG4gICAgICAgICAgdGhpcy50b2tlblNlcnZpY2Uuc2V0KHRva2VuKTtcclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICAgIC50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIG9wZW5XaW5kb3coaXdpbmRvdzogSVdpbmRvdyk6IHZvaWQge1xyXG4gICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBpd2luZG93LnVybDtcclxuICB9XHJcblxyXG4gIHNldFRpdGxlKGl0aXRsZTogSVRpdGxlKTogdm9pZCB7XHJcbiAgICB0aGlzLnRpdGxlLnNldFRpdGxlKGl0aXRsZS50aXRsZSk7XHJcbiAgfVxyXG5cclxuICBzZXROYXZpZ2F0aW9uQmFyKG5hdmlnYXRpb25CYXI6IE5hdmlnYXRpb25CYXIpOiB2b2lkIHtcclxuICAgIGFsZXJ0KFwi5b6u5L+h56uv5pqC5LiN5pSv5oyB5pS+572u5oyJ6ZKuLOivt+WcqEFQUOS4reS9v+eUqOatpOWKn+iDvSFcIik7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBzaGFyZShpc2hhcmU6IElTaGFyZSk6IHZvaWQge1xyXG4gICAgYWxlcnQoXCLlvq7kv6Hnq6/mmoLkuI3mlK/mjIHliIbkuqss6K+35ZyoQVBQ5Lit5L2/55So5q2k5Yqf6IO9IVwiKTtcclxuICB9XHJcblxyXG4gIGdldFRva2VuKCk6IEl0b2tlbiB7XHJcbiAgICBjb25zdCBpdG9rZW46IEl0b2tlbiA9IHtcclxuICAgICAgYWNjZXNzVG9rZW46IHRoaXMudG9rZW5TZXJ2aWNlLmdldCgpLmFjY2Vzc1Rva2VuLFxyXG4gICAgICB0b2tlblR5cGU6IG51bGwsXHJcbiAgICAgIHRva2VuRGF0YUxpbmU6IG51bGwsXHJcbiAgICAgIHNjb3BlOiBudWxsLFxyXG4gICAgfTtcclxuICAgIHJldHVybiBpdG9rZW47XHJcbiAgfVxyXG5cclxuICBzY2FuQ29kZSgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgY29uc3QgcCA9IG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB3eC5zY2FuUVJDb2RlKHtcclxuICAgICAgICBuZWVkUmVzdWx0OiAxLFxyXG4gICAgICAgIHNjYW5UeXBlOiBbJ3FyQ29kZScsICdiYXJDb2RlJ10sXHJcbiAgICAgICAgc3VjY2VzczogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICByZXNvbHZlKHJlcy5yZXN1bHRTdHIpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZnJvbShwKTtcclxuICB9XHJcblxyXG4gIHVzZXJMb2NhdGlvbigpOiBPYnNlcnZhYmxlPFVzZXJMb2NhdGlvbj4ge1xyXG4gICAgY29uc3QgcCA9IG5ldyBQcm9taXNlPFVzZXJMb2NhdGlvbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB3eC5nZXRMb2NhdGlvbih7XHJcbiAgICAgICAgdHlwZTogJ3dnczg0JywgLy8g6buY6K6k5Li6d2dzODTnmoRncHPlnZDmoIfvvIzlpoLmnpzopoHov5Tlm57nm7TmjqXnu5lvcGVuTG9jYXRpb27nlKjnmoTngavmmJ/lnZDmoIfvvIzlj6/kvKDlhaUnZ2NqMDInXHJcbiAgICAgICAgc3VjY2VzczogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLmVyck1zZyA9PT0gJ2dldExvY2F0aW9uOm9rJykge1xyXG4gICAgICAgICAgICBjb25zdCBsYXRpdHVkZSA9IHJlcy5sYXRpdHVkZTsgLy8g57qs5bqm77yM5rWu54K55pWw77yM6IyD5Zu05Li6OTAgfiAtOTBcclxuICAgICAgICAgICAgY29uc3QgbG9uZ2l0dWRlID0gcmVzLmxvbmdpdHVkZTsgLy8g57uP5bqm77yM5rWu54K55pWw77yM6IyD5Zu05Li6MTgwIH4gLTE4MOOAglxyXG4gICAgICAgICAgICBjb25zdCBhZGRyZXNzID0gJ+W+ruS/oeaXoGFkZHJlc3MnO1xyXG4gICAgICAgICAgICByZXNvbHZlKHtsYXRpdHVkZSwgbG9uZ2l0dWRlLCBhZGRyZXNzfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBmcm9tKHApO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRhdGVJbldpZmkoYnNzaWRzOiBzdHJpbmdbXSk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgYWxlcnQoXCLlvq7kv6Hnq6/mmoLkuI3mlK/mjIFXSUZJ6aqM6K+BLOivt+WcqEFQUOS4reS9v+eUqOatpOWKn+iDvSFcIik7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgZ2V0V2lmaU1hYygpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgYWxlcnQoXCLlvq7kv6Hnq6/mmoLkuI3mlK/mjIHojrflj5ZNQUPlnLDlnYAs6K+35ZyoQVBQ5Lit5L2/55So5q2k5Yqf6IO9IVwiKTtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBnZW5lcmF0ZVdlY2hhdENvbmZpZygpOiB2b2lkIHtcclxuICAgIHRoaXMuaHR0cFxyXG4gICAgICAuZ2V0KGAke3RoaXMuYmFzZWNsaWVudC5nYXRld2F5fS93ZWNoYXQvbXAvanNzZGs/dXJsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHdpbmRvdy5sb2NhdGlvbi5ocmVmKX1gKVxyXG4gICAgICAuc3Vic2NyaWJlKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgd3guY29uZmlnKHtcclxuICAgICAgICAgIGRlYnVnOiBmYWxzZSwgLy8g5byA5ZCv6LCD6K+V5qih5byPLOiwg+eUqOeahOaJgOaciWFwaeeahOi/lOWbnuWAvOS8muWcqOWuouaIt+err2FsZXJ05Ye65p2l77yM6Iul6KaB5p+l55yL5Lyg5YWl55qE5Y+C5pWw77yM5Y+v5Lul5ZyocGPnq6/miZPlvIDvvIzlj4LmlbDkv6Hmga/kvJrpgJrov4dsb2fmiZPlh7rvvIzku4XlnKhwY+err+aXtuaJjeS8muaJk+WNsOOAglxyXG4gICAgICAgICAgYXBwSWQ6IHJlc3BvbnNlLmFwcElkLCAvLyDlv4XloavvvIzlhazkvJflj7fnmoTllK/kuIDmoIfor4ZcclxuICAgICAgICAgIHRpbWVzdGFtcDogcmVzcG9uc2UudGltZXN0YW1wLCAvLyDlv4XloavvvIznlJ/miJDnrb7lkI3nmoTml7bpl7TmiLNcclxuICAgICAgICAgIG5vbmNlU3RyOiByZXNwb25zZS5ub25jZVN0ciwgLy8g5b+F5aGr77yM55Sf5oiQ562+5ZCN55qE6ZqP5py65LiyXHJcbiAgICAgICAgICBzaWduYXR1cmU6IHJlc3BvbnNlLnNpZ25hdHVyZSwgLy8g5b+F5aGr77yM562+5ZCNXHJcbiAgICAgICAgICBqc0FwaUxpc3Q6IGFwaXMsIC8vIOW/heWhq++8jOmcgOimgeS9v+eUqOeahEpT5o6l5Y+j5YiX6KGoXHJcbiAgICAgICAgICBvcGVuVGFnTGlzdDogb3BlblRhZ3MgLy8g5Y+v6YCJ77yM6ZyA6KaB5L2/55So55qE5byA5pS+5qCH562+5YiX6KGo77yM5L6L5aaCWyd3eC1vcGVuLWxhdW5jaC1hcHAnXVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIHd4LnJlYWR5KCgpID0+IHtcclxuICAgICAgLy8gY29uZmln5L+h5oGv6aqM6K+B5ZCO5Lya5omn6KGMcmVhZHnmlrnms5XvvIzmiYDmnInmjqXlj6PosIPnlKjpg73lv4XpobvlnKhjb25maWfmjqXlj6Pojrflvpfnu5PmnpzkuYvlkI7vvIxjb25maWfmmK/kuIDkuKrlrqLmiLfnq6/nmoTlvILmraXmk43kvZzvvIxcclxuICAgICAgLy8g5omA5Lul5aaC5p6c6ZyA6KaB5Zyo6aG16Z2i5Yqg6L295pe25bCx6LCD55So55u45YWz5o6l5Y+j77yM5YiZ6aG75oqK55u45YWz5o6l5Y+j5pS+5ZyocmVhZHnlh73mlbDkuK3osIPnlKjmnaXnoa7kv53mraPnoa7miafooYzjgILlr7nkuo7nlKjmiLfop6blj5Hml7bmiY3osIPnlKjnmoTmjqXlj6PvvIzliJnlj6/ku6Xnm7TmjqXosIPnlKjvvIzkuI3pnIDopoHmlL7lnKhyZWFkeeWHveaVsOS4reOAglxyXG4gICAgICBjb25zb2xlLmxvZygn5b6u5L+hanNzZGvliJ3lp4vljJblrozmiJAuJyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB3eC5lcnJvcigocmVzKSA9PiB7XHJcbiAgICAgIC8vIGNvbmZpZ+S/oeaBr+mqjOivgeWksei0peS8muaJp+ihjGVycm9y5Ye95pWw77yM5aaC562+5ZCN6L+H5pyf5a+86Ie06aqM6K+B5aSx6LSl77yM5YW35L2T6ZSZ6K+v5L+h5oGv5Y+v5Lul5omT5byAY29uZmln55qEZGVidWfmqKHlvI/mn6XnnIvvvIzkuZ/lj6/ku6XlnKjov5Tlm57nmoRyZXPlj4LmlbDkuK3mn6XnnIvvvIzlr7nkuo5TUEHlj6/ku6XlnKjov5nph4zmm7TmlrDnrb7lkI3jgIJcclxuICAgICAgY29uc29sZS5sb2coJ+W+ruS/oWpzc2Rr5Yid5aeL5YyW5aSx6LSlOicsIHJlcyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNob29zZUNvbnRhY3RzKGNvdW50OiBudW1iZXIpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgYWxlcnQoXCLlvq7kv6Hnq6/mmoLkuI3mlK/mjIHojrflj5bogZTns7vkuros6K+35ZyoQVBQ5Lit5L2/55So5q2k5Yqf6IO9IVwiKTtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBjb250YWN0RGV0YWlscyh0YXJnZXRVc2VySWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBhbGVydChcIuW+ruS/oeerr+aaguS4jeaUr+aMgeafpeivouiBlOezu+S6uuivpue7huS/oeaBryzor7flnKhBUFDkuK3kvb/nlKjmraTlip/og70hXCIpO1xyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHVwbG9hZEltYWdlKGNvdW50OiBudW1iZXIsIHNvdXJjZVR5cGU6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBhbGVydChcIuW+ruS/oeerr+aaguS4jeaUr+aMgeWbvueJh+S4iuS8oCzor7flnKhBUFDkuK3kvb/nlKjmraTlip/og70hXCIpO1xyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIG9wZW5SZWFkV2l0aFRpbWVyKFxyXG4gICAgdXJsOiBhbnksXHJcbiAgICBvcGVuVHlwZTogYW55LFxyXG4gICAgdGl0bGU6IGFueSxcclxuICAgIGlkOiBhbnksXHJcbiAgICB0eXBlOiBhbnlcclxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgYWxlcnQoXCLlvq7kv6Hnq6/mmoLkuI3mlK/mjIHor7vnianml7bpl7Tnu5/orqEs6K+35ZyoQVBQ5Lit5L2/55So5q2k5Yqf6IO9IVwiKTtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICB1cGxvYWRNb3ZpZShsaW1pdE1pbnV0ZTogbnVtYmVyKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGFsZXJ0KFwi5b6u5L+h56uv5pqC5LiN5pSv5oyB6KeG6aKR5LiK5LygLOivt+WcqEFQUOS4reS9v+eUqOatpOWKn+iDvSFcIik7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuICBmaWxlQnJvd3Nlcih1cmw6IHN0cmluZywgdGl0bGU6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBhbGVydChcIuW+ruS/oeerr+aaguS4jeaUr+aMgeatpOWKn+iDvSzor7flnKhBUFDkuK3kvb/nlKjmraTlip/og70hXCIpO1xyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHN0YXJ0U2VhcmNoQmVhY29ucyh0aWNrZXQ6IHN0cmluZywgY2FsbGJhY2s6IChhcmd2OiBhbnkpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIHd4LnN0YXJ0U2VhcmNoQmVhY29ucyh7XHJcbiAgICAgIHRpY2tldDogdGlja2V0LFxyXG4gICAgICBjb21wbGV0ZTogY2FsbGJhY2ssXHJcbiAgICB9KTtcclxuICB9XHJcbiAgc3RvcFNlYXJjaEJlYWNvbnMoY2FsbGJhY2s6IChhcmd2OiBhbnkpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIHd4LnN0b3BTZWFyY2hCZWFjb25zKHtcclxuICAgICAgY29tcGxldGU6IGNhbGxiYWNrLFxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIG9uU2VhcmNoQmVhY29ucyhjYWxsYmFjazogKGFyZ3Y6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgd3gub25TZWFyY2hCZWFjb25zKHtcclxuICAgICAgY29tcGxldGU6IGNhbGxiYWNrLFxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==