@duoduo-oba/ng-devui
Version:
DevUI components based on Angular
394 lines • 39.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: helper-utils.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Directive, HostListener, Input } from '@angular/core';
import { HttpParams } from '@angular/common/http';
var HelperUtils = /** @class */ (function () {
function HelperUtils() {
}
/**
* @param {?} url
* @param {?=} target
* @return {?}
*/
HelperUtils.jumpOuterUrl = /**
* @param {?} url
* @param {?=} target
* @return {?}
*/
function (url, target) {
if (target === void 0) { target = '_blank'; }
if (url !== undefined) {
/** @type {?} */
var tempLink = document.createElement('a');
tempLink.style.display = 'none'; // for IE 11
tempLink.target = target;
tempLink.href = url;
document.body.appendChild(tempLink); // for IE 11, IE11需要append到document.body里面的a链接才会生效
// for IE 11, IE11需要append到document.body里面的a链接才会生效
/** @type {?} */
var event_1 = document.createEvent('MouseEvents');
event_1.initEvent('click', false, true);
tempLink.dispatchEvent(event_1);
document.body.removeChild(tempLink); // for IE 11
}
};
/**
* @param {?} url
* @param {?=} option
* @param {?=} onError
* @return {?}
*/
HelperUtils.downloadFile = /**
* @param {?} url
* @param {?=} option
* @param {?=} onError
* @return {?}
*/
function (url, option, onError) {
if (document.querySelector('iframe[name=' + (option && option.iframename || 'download') + ']')) {
document.body.removeChild(document.querySelector('iframe[name=' + (option && option.iframename || 'download') + ']'));
}
/** @type {?} */
var tempiframe = document.createElement('iframe');
tempiframe.name = option && option.iframename || 'download';
tempiframe.style.display = 'none';
/** @type {?} */
var tempform = document.createElement('form');
tempform.action = url;
tempform.method = option && option.method || 'post';
tempform.target = option && option.iframename || 'download';
tempform.enctype = option && option.enctype || 'application/x-www-form-urlencoded';
tempform.style.display = 'none';
if (option && option.params) {
Object.keys(option.params).forEach((/**
* @param {?} key
* @return {?}
*/
function (key) {
/** @type {?} */
var opt = document.createElement('input');
opt.name = key;
opt.value = option.params[key];
tempform.appendChild(opt);
}));
}
/** @type {?} */
var submit = document.createElement('input');
submit.type = 'submit';
tempform.appendChild(submit);
tempiframe.appendChild(tempform);
document.body.appendChild(tempiframe);
// 下载错误处理。下载成功并不会响应,因为响应头中带有Content-Disposition(下载头)的url,无法监听iframe的load事件,load事件不会触发
tempiframe.addEventListener('load', (/**
* @param {?} event
* @return {?}
*/
function (event) {
try {
/** @type {?} */
var iframeDoc = tempiframe.contentDocument;
if (onError !== undefined) {
/** @type {?} */
var response = void 0;
try {
response = JSON.parse(iframeDoc.body && iframeDoc.body.textContent);
}
catch (e) {
response = iframeDoc.body && iframeDoc.body.textContent;
}
if (!response) {
response = 'Error';
}
onError(response);
}
}
catch (e) {
onError('Error');
}
document.body.removeChild(tempiframe);
}));
tempform.submit();
};
/**
* @param {?} httpClient
* @param {?} url
* @param {?=} option
* @param {?=} onError
* @param {?=} onSuccess
* @return {?}
*/
HelperUtils.downloadFileByHttpClient = /**
* @param {?} httpClient
* @param {?} url
* @param {?=} option
* @param {?=} onError
* @param {?=} onSuccess
* @return {?}
*/
function (httpClient, url, option, onError, onSuccess) {
/** @type {?} */
var requestMethod = option && option.method && option.method.toLowerCase() || 'post';
/** @type {?} */
var requestHeaderContentType = option.enctype || 'application/x-www-form-urlencoded';
/** @type {?} */
var requestParams = option.params ? new HttpParams({
fromObject: option.params
}) : null;
/** @type {?} */
var requestUrl = url;
/** @type {?} */
var requestOptionParams = requestMethod === 'get' ? requestParams : undefined;
/** @type {?} */
var requestBody = requestMethod === 'post' ? requestParams && requestParams.toString() : undefined;
/** @type {?} */
var responseOption = option.responseOption;
/** @type {?} */
var requestOption = Object.assign({}, {
body: requestBody,
observe: 'response',
params: requestOptionParams,
headers: {
'Content-Type': requestHeaderContentType
},
responseType: 'arraybuffer'
}, {
headers: option.header
});
/** @type {?} */
var handleResponse = ((/**
* @param {?} resOption
* @return {?}
*/
function (resOption) {
switch (resOption) {
case 'response':
return (/**
* @param {?} res
* @return {?}
*/
function (res) { return res; });
case 'body':
return (/**
* @param {?} res
* @return {?}
*/
function (res) {
/** @type {?} */
var arrayBuffer = (/** @type {?} */ (((/** @type {?} */ (res))).body)) || ((/** @type {?} */ (res))).error;
/** @type {?} */
var body = HelperUtils.utf8ArrayToStr(arrayBuffer);
return body;
});
case 'json':
default:
return (/**
* @param {?} res
* @return {?}
*/
function (res) {
/** @type {?} */
var arrayBuffer = (/** @type {?} */ (((/** @type {?} */ (res))).body)) || ((/** @type {?} */ (res))).error;
/** @type {?} */
var response;
try {
/** @type {?} */
var body = HelperUtils.utf8ArrayToStr(arrayBuffer);
try {
response = JSON.parse(body);
}
catch (e) {
/** @type {?} */
var parser = new DOMParser();
/** @type {?} */
var html = parser.parseFromString(body, 'text/html');
response = html.body.textContent;
}
}
catch (e) {
throw new Error('Parsing Error:' + e);
}
if (!response) {
response = 'Error';
}
return response;
});
}
}))(responseOption);
/** @type {?} */
var downloadFileFromArrayBuffer = (/**
* @param {?} data
* @param {?} filename
* @param {?} contentType
* @return {?}
*/
function (data, filename, contentType) {
if (window.navigator && window.navigator.msSaveOrOpenBlob) { // IE11 support
// IE11 support
/** @type {?} */
var blob = new Blob([data], { type: contentType });
window.navigator.msSaveOrOpenBlob(blob, filename);
}
else { // other browsers
if ('download' in document.createElement('a')) {
/** @type {?} */
var blob = new Blob([data], { type: contentType });
/** @type {?} */
var link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = filename;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
URL.revokeObjectURL(link.href);
}
else {
// not support tag a download attribute use file download, filename won't support
/** @type {?} */
var file = new File([data], filename, { type: contentType });
/** @type {?} */
var exportUrl = URL.createObjectURL(file);
window.location.assign(exportUrl);
URL.revokeObjectURL(exportUrl);
}
}
});
/** @type {?} */
var getFilenameFromDisposition = (/**
* @param {?} disposition
* @return {?}
*/
function (disposition) {
/** @type {?} */
var filenamePair = disposition.split(';').filter((/**
* @param {?} str
* @return {?}
*/
function (str) { return /^filename=/.test(str.trim()); })).pop();
if (filenamePair) {
/** @type {?} */
var str = filenamePair.trim();
str = str.split('=')[1];
str = str.replace(/['"]/g, '');
return decodeURIComponent(str);
}
else {
return null;
}
});
httpClient.request(requestMethod, requestUrl, requestOption).subscribe((/**
* @param {?} res
* @return {?}
*/
function (res) {
/** @type {?} */
var disposition = ((/** @type {?} */ (res.headers))).get('content-disposition');
/** @type {?} */
var contentType = ((/** @type {?} */ (res.headers))).get('content-type');
if (/^attachment/i.test(disposition) || option.downloadWithoutDispositionHeader) {
/** @type {?} */
var downloadFilename = option.filename || disposition && getFilenameFromDisposition(disposition) || url;
downloadFileFromArrayBuffer(res.body, downloadFilename, contentType);
if (onSuccess) {
onSuccess(res);
}
}
else {
if (onError) {
/** @type {?} */
var response = void 0;
try {
response = handleResponse(res);
}
catch (e) {
response = res;
}
onError(response);
}
}
}), (/**
* @param {?} err
* @return {?}
*/
function (err) {
if (onError) {
/** @type {?} */
var response = void 0;
try {
response = handleResponse(err);
}
catch (e) {
response = err;
}
onError(response);
}
}));
};
/**
* @private
* @param {?} arrayBuffer
* @return {?}
*/
HelperUtils.utf8ArrayToStr = /**
* @private
* @param {?} arrayBuffer
* @return {?}
*/
function (arrayBuffer) {
if (typeof TextDecoder !== 'undefined') {
return new TextDecoder('utf-8').decode(arrayBuffer);
}
else {
/**
* fallback 方案,无TextDecoder场景使用直接解析,英文无问题,中文会存在乱码
* ie 11 下支持中文需要使用MDN推荐的 fastestsmallesttextencoderdecoder以支持TextDecoder
* npm install fastestsmallesttextencoderdecoder
* polyfill.ts includes
* ```
* // polyfill for TextDecoder on IE 11
* import 'fastestsmallesttextencoderdecoder';
* ```
*/
return String.fromCharCode.apply(null, new Uint8Array(arrayBuffer));
}
};
return HelperUtils;
}());
export { HelperUtils };
var SimulateATagDirective = /** @class */ (function () {
function SimulateATagDirective() {
this.target = '_blank';
}
/**
* @return {?}
*/
SimulateATagDirective.prototype.onClick = /**
* @return {?}
*/
function () {
HelperUtils.jumpOuterUrl(this.href, this.target);
};
SimulateATagDirective.decorators = [
{ type: Directive, args: [{
selector: '[dSimulateATag]'
},] }
];
/** @nocollapse */
SimulateATagDirective.ctorParameters = function () { return []; };
SimulateATagDirective.propDecorators = {
href: [{ type: Input }],
target: [{ type: Input }],
onClick: [{ type: HostListener, args: ['click',] }]
};
return SimulateATagDirective;
}());
export { SimulateATagDirective };
if (false) {
/** @type {?} */
SimulateATagDirective.prototype.href;
/** @type {?} */
SimulateATagDirective.prototype.target;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVyLXV0aWxzLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZGV2dWkvY29tbW9uLyIsInNvdXJjZXMiOlsiaGVscGVyLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9ELE9BQU8sRUFBMkIsVUFBVSxFQUFtQyxNQUFNLHNCQUFzQixDQUFDO0FBRTVHO0lBQUE7SUFxUEEsQ0FBQzs7Ozs7O0lBcFBRLHdCQUFZOzs7OztJQUFuQixVQUFvQixHQUFHLEVBQUUsTUFBaUI7UUFBakIsdUJBQUEsRUFBQSxpQkFBaUI7UUFDckMsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFOztnQkFDZCxRQUFRLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUM7WUFDNUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUssWUFBWTtZQUNqRCxRQUFRLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztZQUN6QixRQUFRLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztZQUNwQixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGtEQUFrRDs7O2dCQUNqRixPQUFLLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUM7WUFDakQsT0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3RDLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBSyxDQUFDLENBQUM7WUFDOUIsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZO1NBQ3BEO0lBQ0wsQ0FBQzs7Ozs7OztJQUVNLHdCQUFZOzs7Ozs7SUFBbkIsVUFDSSxHQUFXLEVBQ1gsTUFLQyxFQUNELE9BQTRCO1FBRTVCLElBQUks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S0FBSyxXQUFXLEVBQUU7WUFDdEMsT0FBTyxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDckQ7YUFBTTtZQUNMOzs7Ozs7Ozs7ZUFTRztZQUNILE9BQU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7U0FDckU7SUFDSCxDQUFDO0lBQ0gsa0JBQUM7QUFBRCxDQUFDLEFBclBELElBcVBDOztBQUVEO0lBTUk7UUFEUyxXQUFNLEdBQXVELFFBQVEsQ0FBQztJQUNoRSxDQUFDOzs7O0lBQ08sdUNBQU87OztJQUE5QjtRQUNJLFdBQVcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckQsQ0FBQzs7Z0JBVEosU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxpQkFBaUI7aUJBQzVCOzs7Ozt1QkFFSSxLQUFLO3lCQUNMLEtBQUs7MEJBRUwsWUFBWSxTQUFDLE9BQU87O0lBR3pCLDRCQUFDO0NBQUEsQUFWRCxJQVVDO1NBUFkscUJBQXFCOzs7SUFDOUIscUNBQXNCOztJQUN0Qix1Q0FBK0UiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEhvc3RMaXN0ZW5lciwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMsIEh0dHBQYXJhbXMsIEh0dHBSZXNwb25zZSwgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcblxyXG5leHBvcnQgY2xhc3MgSGVscGVyVXRpbHMge1xyXG4gIHN0YXRpYyBqdW1wT3V0ZXJVcmwodXJsLCB0YXJnZXQgPSAnX2JsYW5rJykge1xyXG4gICAgICAgaWYgKHVybCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBjb25zdCB0ZW1wTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgICAgICAgIHRlbXBMaW5rLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7ICAgICAvLyBmb3IgSUUgMTFcclxuICAgICAgICAgIHRlbXBMaW5rLnRhcmdldCA9IHRhcmdldDtcclxuICAgICAgICAgIHRlbXBMaW5rLmhyZWYgPSB1cmw7XHJcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRlbXBMaW5rKTsgLy8gZm9yIElFIDExLCBJRTEx6ZyA6KaBYXBwZW5k5YiwZG9jdW1lbnQuYm9keemHjOmdoueahGHpk77mjqXmiY3kvJrnlJ/mlYhcclxuICAgICAgICAgIGNvbnN0IGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ01vdXNlRXZlbnRzJyk7XHJcbiAgICAgICAgICBldmVudC5pbml0RXZlbnQoJ2NsaWNrJywgZmFsc2UsIHRydWUpO1xyXG4gICAgICAgICAgdGVtcExpbmsuZGlzcGF0Y2hFdmVudChldmVudCk7XHJcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRlbXBMaW5rKTsgLy8gZm9yIElFIDExXHJcbiAgICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyBkb3dubG9hZEZpbGUoXHJcbiAgICAgIHVybDogc3RyaW5nLFxyXG4gICAgICBvcHRpb24/OiB7XHJcbiAgICAgICAgICBtZXRob2Q/OiAnUE9TVCd8ICdHRVQnIHwgJ3Bvc3QnIHwgJ2dldCcsXHJcbiAgICAgICAgICBwYXJhbXM/OiB7W3Byb3BlcnR5OiBzdHJpbmddOiBzdHJpbmd9LFxyXG4gICAgICAgICAgZW5jdHlwZT86ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnIHwgJ211bHRpcGFydC9mb3JtLWRhdGEnfCAndGV4dC9wbGFpbicsXHJcbiAgICAgICAgICBpZnJhbWVuYW1lPzogc3RyaW5nXHJcbiAgICAgIH0sXHJcbiAgICAgIG9uRXJyb3I/OiAocmVzcG9uc2UpID0+IHZvaWRcclxuICApIHtcclxuICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lmcmFtZVtuYW1lPScgKyAob3B0aW9uICYmIG9wdGlvbi5pZnJhbWVuYW1lIHx8ICdkb3dubG9hZCcpICsgJ10nKSkge1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaWZyYW1lW25hbWU9JyArIChvcHRpb24gJiYgb3B0aW9uLmlmcmFtZW5hbWUgfHwgJ2Rvd25sb2FkJykgKyAnXScpKTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCB0ZW1waWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XHJcbiAgICAgIHRlbXBpZnJhbWUubmFtZSA9IG9wdGlvbiAmJiBvcHRpb24uaWZyYW1lbmFtZSB8fCAnZG93bmxvYWQnO1xyXG4gICAgICB0ZW1waWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblxyXG4gICAgICBjb25zdCB0ZW1wZm9ybSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Zvcm0nKTtcclxuICAgICAgdGVtcGZvcm0uYWN0aW9uID0gdXJsO1xyXG4gICAgICB0ZW1wZm9ybS5tZXRob2QgPSBvcHRpb24gJiYgb3B0aW9uLm1ldGhvZCB8fCAncG9zdCc7XHJcbiAgICAgIHRlbXBmb3JtLnRhcmdldCA9IG9wdGlvbiAmJiBvcHRpb24uaWZyYW1lbmFtZSB8fCAnZG93bmxvYWQnO1xyXG4gICAgICB0ZW1wZm9ybS5lbmN0eXBlID0gb3B0aW9uICYmIG9wdGlvbi5lbmN0eXBlIHx8ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnO1xyXG4gICAgICB0ZW1wZm9ybS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG5cclxuICAgICAgaWYgKG9wdGlvbiAmJiBvcHRpb24ucGFyYW1zKSB7XHJcbiAgICAgICAgICBPYmplY3Qua2V5cyhvcHRpb24ucGFyYW1zKS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3Qgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcclxuICAgICAgICAgICAgICBvcHQubmFtZSA9IGtleTtcclxuICAgICAgICAgICAgICBvcHQudmFsdWUgPSBvcHRpb24ucGFyYW1zW2tleV07XHJcbiAgICAgICAgICAgICAgdGVtcGZvcm0uYXBwZW5kQ2hpbGQob3B0KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBzdWJtaXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xyXG4gICAgICBzdWJtaXQudHlwZSA9ICdzdWJtaXQnO1xyXG5cclxuICAgICAgdGVtcGZvcm0uYXBwZW5kQ2hpbGQoc3VibWl0KTtcclxuICAgICAgdGVtcGlmcmFtZS5hcHBlbmRDaGlsZCh0ZW1wZm9ybSk7XHJcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGVtcGlmcmFtZSk7XHJcblxyXG4gICAgICAvLyDkuIvovb3plJnor6/lpITnkIbjgILkuIvovb3miJDlip/lubbkuI3kvJrlk43lupTvvIzlm6DkuLrlk43lupTlpLTkuK3luKbmnIlDb250ZW50LURpc3Bvc2l0aW9u77yI5LiL6L295aS077yJ55qEdXJs77yM5peg5rOV55uR5ZCsaWZyYW1l55qEbG9hZOS6i+S7tu+8jGxvYWTkuovku7bkuI3kvJrop6blj5FcclxuICAgICAgdGVtcGlmcmFtZS5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpZnJhbWVEb2MgPSAgdGVtcGlmcmFtZS5jb250ZW50RG9jdW1lbnQ7XHJcbiAgICAgICAgICAgICAgICBpZiAob25FcnJvciAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IEpTT04ucGFyc2UoaWZyYW1lRG9jLmJvZHkgJiYgaWZyYW1lRG9jLmJvZHkudGV4dENvbnRlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gaWZyYW1lRG9jLmJvZHkgJiYgaWZyYW1lRG9jLmJvZHkudGV4dENvbnRlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSAnRXJyb3InO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgb25FcnJvcignRXJyb3InKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRlbXBpZnJhbWUpO1xyXG4gICAgICB9KTtcclxuICAgICAgdGVtcGZvcm0uc3VibWl0KCk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZG93bmxvYWRGaWxlQnlIdHRwQ2xpZW50KFxyXG4gICAgaHR0cENsaWVudDogSHR0cENsaWVudCxcclxuICAgIHVybDogc3RyaW5nLFxyXG4gICAgb3B0aW9uPzoge1xyXG4gICAgICBtZXRob2Q/OiAnUE9TVCcgfCAnR0VUJyB8ICdwb3N0JyB8ICdnZXQnLFxyXG4gICAgICBwYXJhbXM/OiB7W3Byb3BlcnR5OiBzdHJpbmddOiBzdHJpbmd9LFxyXG4gICAgICBlbmN0eXBlPzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcgfCAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScgfCAndGV4dC9wbGFpbicsXHJcbiAgICAgIGhlYWRlcj86IHtcclxuICAgICAgICBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXTtcclxuICAgICAgfSxcclxuICAgICAgcmVzcG9uc2VPcHRpb24/OiAncmVzcG9uc2UnIHwgJ2JvZHknIHwgJ2pzb24nLFxyXG4gICAgICBmaWxlbmFtZT86IHN0cmluZyxcclxuICAgICAgd2l0aENyZWRlbnRpYWxzPzogYm9vbGVhbixcclxuICAgICAgZG93bmxvYWRXaXRob3V0RGlzcG9zaXRpb25IZWFkZXI/OiBib29sZWFuXHJcbiAgICB9LFxyXG4gICAgb25FcnJvcj86IChyZXNwb25zZSkgPT4gdm9pZCxcclxuICAgIG9uU3VjY2Vzcz86IChyZXNwb25zZSkgPT4gdm9pZCxcclxuICApIHtcclxuXHJcbiAgICBjb25zdCByZXF1ZXN0TWV0aG9kID0gb3B0aW9uICYmIG9wdGlvbi5tZXRob2QgJiYgb3B0aW9uLm1ldGhvZC50b0xvd2VyQ2FzZSgpIHx8ICdwb3N0JztcclxuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJDb250ZW50VHlwZSA9IG9wdGlvbi5lbmN0eXBlIHx8ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnO1xyXG4gICAgY29uc3QgcmVxdWVzdFBhcmFtcyA9IG9wdGlvbi5wYXJhbXMgPyBuZXcgSHR0cFBhcmFtcyh7XHJcbiAgICAgIGZyb21PYmplY3Q6IG9wdGlvbi5wYXJhbXNcclxuICAgIH0pIDogbnVsbDtcclxuXHJcbiAgICBjb25zdCByZXF1ZXN0VXJsID0gdXJsO1xyXG4gICAgY29uc3QgcmVxdWVzdE9wdGlvblBhcmFtcyA9IHJlcXVlc3RNZXRob2QgPT09ICdnZXQnID8gcmVxdWVzdFBhcmFtcyA6IHVuZGVmaW5lZDtcclxuICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0gcmVxdWVzdE1ldGhvZCA9PT0gJ3Bvc3QnID8gcmVxdWVzdFBhcmFtcyAmJiByZXF1ZXN0UGFyYW1zLnRvU3RyaW5nKCkgOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgY29uc3QgcmVzcG9uc2VPcHRpb24gPSBvcHRpb24ucmVzcG9uc2VPcHRpb247XHJcblxyXG4gICAgY29uc3QgcmVxdWVzdE9wdGlvbiA9IE9iamVjdC5hc3NpZ24oe30sIHtcclxuICAgICAgYm9keTogcmVxdWVzdEJvZHksXHJcbiAgICAgIG9ic2VydmU6ICdyZXNwb25zZScsXHJcbiAgICAgIHBhcmFtczogcmVxdWVzdE9wdGlvblBhcmFtcyxcclxuICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICdDb250ZW50LVR5cGUnOiByZXF1ZXN0SGVhZGVyQ29udGVudFR5cGVcclxuICAgICAgfSxcclxuICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInXHJcbiAgICB9LCB7XHJcbiAgICAgIGhlYWRlcnM6IG9wdGlvbi5oZWFkZXJcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGhhbmRsZVJlc3BvbnNlID0gKHJlc09wdGlvbiA9PiB7XHJcbiAgICAgIHN3aXRjaCAocmVzT3B0aW9uKSB7XHJcbiAgICAgICAgY2FzZSAncmVzcG9uc2UnOlxyXG4gICAgICAgICAgcmV0dXJuIChyZXM6IEh0dHBSZXNwb25zZTxBcnJheUJ1ZmZlcj4pID0+IHJlcztcclxuICAgICAgICBjYXNlICdib2R5JzpcclxuICAgICAgICAgIHJldHVybiAocmVzOiBIdHRwUmVzcG9uc2U8QXJyYXlCdWZmZXI+IHwgSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSA8QXJyYXlCdWZmZXI+KDxIdHRwUmVzcG9uc2U8QXJyYXlCdWZmZXI+PnJlcykuYm9keSB8fCAoPEh0dHBFcnJvclJlc3BvbnNlPnJlcykuZXJyb3I7XHJcbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBIZWxwZXJVdGlscy51dGY4QXJyYXlUb1N0cihhcnJheUJ1ZmZlcik7XHJcbiAgICAgICAgICAgIHJldHVybiBib2R5O1xyXG4gICAgICAgICAgfTtcclxuICAgICAgICBjYXNlICdqc29uJzpcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgcmV0dXJuIChyZXM6IEh0dHBSZXNwb25zZTxBcnJheUJ1ZmZlcj4gfCBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IDxBcnJheUJ1ZmZlcj4oPEh0dHBSZXNwb25zZTxBcnJheUJ1ZmZlcj4+cmVzKS5ib2R5IHx8ICg8SHR0cEVycm9yUmVzcG9uc2U+cmVzKS5lcnJvcjtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBIZWxwZXJVdGlscy51dGY4QXJyYXlUb1N0cihhcnJheUJ1ZmZlcik7XHJcbiAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gSlNPTi5wYXJzZShib2R5KTtcclxuICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBodG1sID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhib2R5LCAndGV4dC9odG1sJyk7XHJcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9IGh0bWwuYm9keS50ZXh0Q29udGVudDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcnNpbmcgRXJyb3I6JyArIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghcmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gJ0Vycm9yJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICB9KShyZXNwb25zZU9wdGlvbik7XHJcblxyXG4gICAgY29uc3QgZG93bmxvYWRGaWxlRnJvbUFycmF5QnVmZmVyID0gKGRhdGE6IEFycmF5QnVmZmVyLCBmaWxlbmFtZTogc3RyaW5nLCBjb250ZW50VHlwZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgIGlmICh3aW5kb3cubmF2aWdhdG9yICYmIHdpbmRvdy5uYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYikgeyAvLyBJRTExIHN1cHBvcnRcclxuICAgICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbZGF0YV0sIHt0eXBlOiBjb250ZW50VHlwZX0pO1xyXG4gICAgICAgICAgd2luZG93Lm5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKGJsb2IsIGZpbGVuYW1lKTtcclxuICAgICAgfSBlbHNlIHsvLyBvdGhlciBicm93c2Vyc1xyXG4gICAgICAgICAgaWYgKCdkb3dubG9hZCcgaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbZGF0YV0sIHt0eXBlOiBjb250ZW50VHlwZX0pO1xyXG4gICAgICAgICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgICAgICAgICBsaW5rLmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG4gICAgICAgICAgICBsaW5rLmRvd25sb2FkID0gZmlsZW5hbWU7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7XHJcbiAgICAgICAgICAgIGxpbmsuY2xpY2soKTtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChsaW5rKTtcclxuICAgICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChsaW5rLmhyZWYpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gbm90IHN1cHBvcnQgdGFnIGEgZG93bmxvYWQgYXR0cmlidXRlIHVzZSBmaWxlIGRvd25sb2FkLCBmaWxlbmFtZSB3b24ndCBzdXBwb3J0XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBuZXcgRmlsZShbZGF0YV0sIGZpbGVuYW1lLCB7dHlwZTogY29udGVudFR5cGV9KTtcclxuICAgICAgICAgICAgY29uc3QgZXhwb3J0VXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChmaWxlKTtcclxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihleHBvcnRVcmwpO1xyXG4gICAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKGV4cG9ydFVybCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgZ2V0RmlsZW5hbWVGcm9tRGlzcG9zaXRpb24gPSAoZGlzcG9zaXRpb246IHN0cmluZykgPT4ge1xyXG4gICAgICBjb25zdCBmaWxlbmFtZVBhaXIgPSAgZGlzcG9zaXRpb24uc3BsaXQoJzsnKS5maWx0ZXIoc3RyID0+IC9eZmlsZW5hbWU9Ly50ZXN0KHN0ci50cmltKCkpKS5wb3AoKTtcclxuICAgICAgaWYgKGZpbGVuYW1lUGFpcikge1xyXG4gICAgICAgIGxldCBzdHIgPSBmaWxlbmFtZVBhaXIudHJpbSgpO1xyXG4gICAgICAgIHN0ciA9IHN0ci5zcGxpdCgnPScpWzFdO1xyXG4gICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9bJ1wiXS9nLCAnJyk7XHJcbiAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChzdHIpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICBodHRwQ2xpZW50LnJlcXVlc3QocmVxdWVzdE1ldGhvZCwgcmVxdWVzdFVybCwgcmVxdWVzdE9wdGlvbikuc3Vic2NyaWJlKChyZXM6IEh0dHBSZXNwb25zZTxhbnk+KSA9PiB7XHJcbiAgICAgIGNvbnN0IGRpc3Bvc2l0aW9uID0gKDxIdHRwSGVhZGVycz5yZXMuaGVhZGVycykuZ2V0KCdjb250ZW50LWRpc3Bvc2l0aW9uJyk7XHJcbiAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gKDxIdHRwSGVhZGVycz5yZXMuaGVhZGVycykuZ2V0KCdjb250ZW50LXR5cGUnKTtcclxuICAgICAgaWYgKC9eYXR0YWNobWVudC9pLnRlc3QoZGlzcG9zaXRpb24pIHx8IG9wdGlvbi5kb3dubG9hZFdpdGhvdXREaXNwb3NpdGlvbkhlYWRlciApIHtcclxuICAgICAgICBjb25zdCBkb3dubG9hZEZpbGVuYW1lID0gb3B0aW9uLmZpbGVuYW1lIHx8IGRpc3Bvc2l0aW9uICYmIGdldEZpbGVuYW1lRnJvbURpc3Bvc2l0aW9uKGRpc3Bvc2l0aW9uKSB8fCB1cmwgO1xyXG4gICAgICAgIGRvd25sb2FkRmlsZUZyb21BcnJheUJ1ZmZlcihyZXMuYm9keSwgZG93bmxvYWRGaWxlbmFtZSwgY29udGVudFR5cGUpO1xyXG4gICAgICAgIGlmIChvblN1Y2Nlc3MpIHtcclxuICAgICAgICAgIG9uU3VjY2VzcyhyZXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAob25FcnJvcikge1xyXG4gICAgICAgICAgbGV0IHJlc3BvbnNlO1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzcG9uc2UgPSBoYW5kbGVSZXNwb25zZShyZXMpO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICByZXNwb25zZSA9IHJlcztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIG9uRXJyb3IocmVzcG9uc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgIH0sIGVyciA9PiB7XHJcbiAgICAgIGlmIChvbkVycm9yKSB7XHJcbiAgICAgICAgbGV0IHJlc3BvbnNlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICByZXNwb25zZSA9IGhhbmRsZVJlc3BvbnNlKGVycik7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgcmVzcG9uc2UgPSBlcnI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9uRXJyb3IocmVzcG9uc2UpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIHV0ZjhBcnJheVRvU3RyKGFycmF5QnVmZmVyKSB7XHJcbiAgICBpZiAodHlwZW9mIFRleHREZWNvZGVyICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICByZXR1cm4gbmV3IFRleHREZWNvZGVyKCd1dGYtOCcpLmRlY29kZShhcnJheUJ1ZmZlcik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvKipcclxuICAgICAgICogZmFsbGJhY2sg5pa55qGI77yM5pegVGV4dERlY29kZXLlnLrmma/kvb/nlKjnm7TmjqXop6PmnpDvvIzoi7Hmlofml6Dpl67popjvvIzkuK3mlofkvJrlrZjlnKjkubHnoIFcclxuICAgICAgICogaWUgMTEg5LiL5pSv5oyB5Lit5paH6ZyA6KaB5L2/55SoTURO5o6o6I2Q55qEIGZhc3Rlc3RzbWFsbGVzdHRleHRlbmNvZGVyZGVjb2RlcuS7peaUr+aMgVRleHREZWNvZGVyXHJcbiAgICAgICAqIG5wbSBpbnN0YWxsIGZhc3Rlc3RzbWFsbGVzdHRleHRlbmNvZGVyZGVjb2RlclxyXG4gICAgICAgKiBwb2x5ZmlsbC50cyBpbmNsdWRlc1xyXG4gICAgICAgKiBgYGBcclxuICAgICAgICogLy8gcG9seWZpbGwgZm9yIFRleHREZWNvZGVyIG9uIElFIDExXHJcbiAgICAgICAqIGltcG9ydCAnZmFzdGVzdHNtYWxsZXN0dGV4dGVuY29kZXJkZWNvZGVyJztcclxuICAgICAgICogYGBgXHJcbiAgICAgICAqL1xyXG4gICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcikpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdbZFNpbXVsYXRlQVRhZ10nXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTaW11bGF0ZUFUYWdEaXJlY3RpdmUge1xyXG4gICAgQElucHV0KCkgaHJlZjogc3RyaW5nO1xyXG4gICAgQElucHV0KCkgdGFyZ2V0OiAnX2JsYW5rJyB8ICdfc2VsZicgfCAnX3BhcmVudCcgfCAnX3RvcCcgfCBzdHJpbmcgICA9ICdfYmxhbmsnO1xyXG4gICAgY29uc3RydWN0b3IoKSB7fVxyXG4gICAgQEhvc3RMaXN0ZW5lcignY2xpY2snKSBvbkNsaWNrKCkge1xyXG4gICAgICAgIEhlbHBlclV0aWxzLmp1bXBPdXRlclVybCh0aGlzLmhyZWYsIHRoaXMudGFyZ2V0KTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcblxyXG4iXX0=