ngx-vcard
Version:
Generate an RFC compliant vCard and download it.
346 lines • 39.7 kB
JavaScript
import { VCardEncoding } from './types/vCardEncoding';
import { isPropertyWithParameters, propertyToVCardString, isPropertyWithParametersAddressValue, } from './types/parameter/BasicPropertyParameters.type';
import { nl, e } from './helpers';
export class VCardFormatter {
static getVCardAsBlob(vCard, encoding = VCardEncoding.none) {
const data = VCardFormatter.getVCardAsString(vCard, encoding);
return new Blob([data], { type: 'text/vcard' });
}
/**
* Get formatted vCard in VCF format
*/
static getVCardAsString(vCard, encodingPrefix = VCardEncoding.none) {
if (!vCard.version) {
vCard.version = '4.0';
}
const majorVersion = getMajorVersion(vCard.version);
let formattedVCardString = '';
formattedVCardString += 'BEGIN:VCARD' + nl();
formattedVCardString += 'VERSION:' + vCard.version + nl();
// const encodingPrefix = '';
let formattedName = '';
if (vCard.name == null) {
vCard.name = {};
}
let nameArray = [];
if (vCard.formattedName != null) {
nameArray = [
vCard.formattedName.firstNames,
vCard.formattedName.addtionalNames,
vCard.formattedName.lastNames,
];
}
else {
nameArray = [
vCard.name.firstNames,
vCard.name.addtionalNames,
vCard.name.lastNames,
];
}
formattedName = nameArray.filter((string) => string != null).join(' ');
formattedVCardString +=
'FN' + encodingPrefix + ':' + e(formattedName) + nl();
formattedVCardString +=
'N' +
encodingPrefix +
':' +
[
e(vCard.name.lastNames),
e(vCard.name.firstNames),
e(vCard.name.addtionalNames),
e(vCard.name.namePrefix),
e(vCard.name.nameSuffix),
].join(';') +
nl();
if (vCard.nickname && majorVersion >= 3) {
formattedVCardString +=
'NICKNAME' + encodingPrefix + ':' + e(vCard.nickname) + nl();
}
if (vCard.gender) {
if (vCard.gender.sex) {
formattedVCardString += 'GENDER:' + e(vCard.gender.sex);
if (vCard.gender.text) {
formattedVCardString += ';' + e(vCard.gender.text);
}
formattedVCardString += nl();
}
else {
formattedVCardString += 'GENDER:;' + e(vCard.gender.text) + nl();
}
}
if (vCard.uid) {
formattedVCardString +=
'UID' + encodingPrefix + ':' + e(vCard.uid) + nl();
}
if (vCard.birthday) {
formattedVCardString += 'BDAY:' + YYYYMMDD(vCard.birthday) + nl();
}
if (vCard.anniversary) {
formattedVCardString +=
'ANNIVERSARY:' + YYYYMMDD(vCard.anniversary) + nl();
}
if (vCard.language) {
vCard.language.forEach((language) => {
if (isPropertyWithParameters(language)) {
formattedVCardString +=
'LANG' +
propertyToVCardString(language.param) +
':' +
e(language.value) +
nl();
}
else {
formattedVCardString += 'LANG:' + e(language) + nl();
}
});
}
if (vCard.organization) {
if (isPropertyWithParameters(vCard.organization)) {
formattedVCardString +=
'ORG' +
propertyToVCardString(vCard.organization.param) +
':' +
e(vCard.organization.value) +
nl();
}
else {
formattedVCardString +=
'ORG' + encodingPrefix + ':' + e(vCard.organization) + nl();
}
}
if (vCard.address) {
vCard.address.forEach((address) => {
if (isPropertyWithParametersAddressValue(address)) {
formattedVCardString +=
'ADR' +
propertyToVCardString(address.param) +
getFormattedAddress(address.value) +
nl();
}
else {
formattedVCardString += 'ADR' + getFormattedAddress(address) + nl();
}
});
}
if (vCard.telephone) {
vCard.telephone.forEach((element) => {
if (!isPropertyWithParameters(element)) {
element = {
value: element,
param: {
type: 'voice',
},
};
}
formattedVCardString +=
'TEL' +
propertyToVCardString(element.param) +
':' +
e(element.value) +
nl();
});
}
if (vCard.email) {
vCard.email.forEach((email) => {
if (isPropertyWithParameters(email)) {
formattedVCardString +=
'EMAIL' +
propertyToVCardString(email.param) +
':' +
e(email.value) +
nl();
}
else {
formattedVCardString += 'EMAIL:' + e(email) + nl();
}
});
}
if (vCard.title) {
formattedVCardString +=
'TITLE' + encodingPrefix + ':' + e(vCard.title) + nl();
}
if (vCard.logo) {
if (isPropertyWithParameters(vCard.logo)) {
formattedVCardString +=
'LOGO' +
propertyToVCardString(vCard.logo.param) +
':' +
e(vCard.logo.value) +
nl();
}
else {
formattedVCardString += 'LOGO:' + e(vCard.logo) + nl();
}
}
if (vCard.photo) {
if (isPropertyWithParameters(vCard.photo)) {
formattedVCardString +=
'PHOTO' +
propertyToVCardString(vCard.photo.param) +
':' +
e(vCard.photo.value) +
nl();
}
else {
formattedVCardString += 'PHOTO:' + e(vCard.photo) + nl();
}
}
if (vCard.homeFax) {
vCard.homeFax.forEach(function (number) {
if (+majorVersion >= 4) {
formattedVCardString +=
'TEL;VALUE=uri;TYPE="fax,home":tel:' + e(number) + nl();
}
else {
formattedVCardString += 'TEL;TYPE=HOME,FAX:' + e(number) + nl();
}
});
}
if (vCard.workFax) {
vCard.workFax.forEach(function (number) {
if (+majorVersion >= 4) {
formattedVCardString +=
'TEL;VALUE=uri;TYPE="fax,work":tel:' + e(number) + nl();
}
else {
formattedVCardString += 'TEL;TYPE=WORK,FAX:' + e(number) + nl();
}
});
}
if (vCard.role) {
formattedVCardString +=
'ROLE' + encodingPrefix + ':' + e(vCard.role) + nl();
}
if (vCard.url) {
let urlNotSet = true;
if (hasProp(vCard.url, 'home')) {
formattedVCardString +=
'URL;type=HOME' +
encodingPrefix +
':' +
e(vCard.url.home) +
nl();
urlNotSet = false;
}
if (hasProp(vCard.url, 'work')) {
formattedVCardString +=
'URL;type=WORK' +
encodingPrefix +
':' +
e(vCard.url.work) +
nl();
urlNotSet = false;
}
if (urlNotSet) {
formattedVCardString +=
'URL' + encodingPrefix + ':' + e(vCard.url) + nl();
}
}
if (vCard.note) {
formattedVCardString +=
'NOTE' + encodingPrefix + ':' + e(vCard.note) + nl();
}
if (vCard.socialUrls) {
for (const key in vCard.socialUrls) {
if (vCard.socialUrls.hasOwnProperty(key) && vCard.socialUrls[key]) {
formattedVCardString +=
'X-SOCIALPROFILE' +
encodingPrefix +
';TYPE=' +
key +
':' +
e(vCard.socialUrls[key]) +
nl();
}
}
}
if (vCard.source) {
if (isPropertyWithParameters(vCard.source)) {
formattedVCardString +=
'SOURCE' +
encodingPrefix +
propertyToVCardString(vCard.source.param) +
':' +
e(vCard.source.value) +
+nl();
}
else {
formattedVCardString +=
'SOURCE' + encodingPrefix + ':' + e(vCard.source) + nl();
}
}
if (vCard.rev) {
formattedVCardString += 'REV:' + vCard.rev + nl();
}
formattedVCardString += 'END:VCARD' + nl();
return formattedVCardString;
}
}
/**
* Get formatted photo
* @param photoType Photo type (PHOTO, LOGO)
* @param url URL to attach photo from
* @param mediaType Media-type of photo (JPEG, PNG, GIF)
*/
function getFormattedPhoto(photoType, url, mediaType, base64, majorVersion) {
let params;
if (+majorVersion >= 4) {
params = base64 ? ';ENCODING=b;MEDIATYPE=image/' : ';MEDIATYPE=image/';
}
else if (+majorVersion === 3) {
params = base64 ? ';ENCODING=b;TYPE=' : ';TYPE=';
}
else {
params = base64 ? ';ENCODING=BASE64;' : ';';
}
const formattedPhoto = photoType + params + mediaType + ':' + e(url) + nl();
return formattedPhoto;
}
/**
* Get formatted address
*/
function getFormattedAddress(address) {
return ((address.label ? ';LABEL="' + e(address.label) + '"' : '') +
':' +
e(address.postOfficeBox) +
';' +
e(address.extendedAddress) +
';' +
e(address.street) +
';' +
e(address.locality) +
';' +
e(address.region) +
';' +
e(address.postalCode) +
';' +
e(address.countryName));
}
/**
* Convert date to YYYYMMDD format
*/
function YYYYMMDD(date) {
if (!date) {
return '';
}
return date.toLocaleDateString('se').replace(/\D/g, ''); // use Swedish date format
}
/**
* Get major version from version string
*/
export function getMajorVersion(version) {
const majorVersionString = version ? version.slice(0, 1) : '4';
if (!isNaN(+majorVersionString)) {
return Number.parseInt(majorVersionString);
}
return 4;
}
/**
* Determines if the object has the Property
* @param obj Object to test
* @param property Property to check
*/
function hasProp(obj, property) {
return Object.prototype.hasOwnProperty.call(obj, property);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXZjYXJkLmZvcm1hdHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC12Y2FyZC9zcmMvbGliL25neC12Y2FyZC5mb3JtYXR0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3RELE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIscUJBQXFCLEVBRXJCLG9DQUFvQyxHQUNyQyxNQUFNLGdEQUFnRCxDQUFDO0FBQ3hELE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWxDLE1BQU0sT0FBTyxjQUFjO0lBQ2xCLE1BQU0sQ0FBQyxjQUFjLENBQzFCLEtBQVksRUFDWixXQUEwQixhQUFhLENBQUMsSUFBSTtRQUU1QyxNQUFNLElBQUksR0FBRyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzlELE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FDNUIsS0FBWSxFQUNaLGlCQUFnQyxhQUFhLENBQUMsSUFBSTtRQUVsRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ25CLEtBQUssQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLENBQUM7UUFDRCxNQUFNLFlBQVksR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXBELElBQUksb0JBQW9CLEdBQUcsRUFBRSxDQUFDO1FBQzlCLG9CQUFvQixJQUFJLGFBQWEsR0FBRyxFQUFFLEVBQUUsQ0FBQztRQUM3QyxvQkFBb0IsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLE9BQU8sR0FB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LENBQUMsQ0FBQztBQUNYLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxPQUFPLENBQUMsR0FBUSxFQUFFLFFBQWdCO0lBQ3pDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUM3RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVkNhcmQsIEFkZHJlc3MgfSBmcm9tICcuL3R5cGVzL3ZDYXJkJztcbmltcG9ydCB7IFZDYXJkRW5jb2RpbmcgfSBmcm9tICcuL3R5cGVzL3ZDYXJkRW5jb2RpbmcnO1xuaW1wb3J0IHtcbiAgaXNQcm9wZXJ0eVdpdGhQYXJhbWV0ZXJzLFxuICBwcm9wZXJ0eVRvVkNhcmRTdHJpbmcsXG4gIEJhc2ljUHJvcGVydHlQYXJhbWV0ZXJzLFxuICBpc1Byb3BlcnR5V2l0aFBhcmFtZXRlcnNBZGRyZXNzVmFsdWUsXG59IGZyb20gJy4vdHlwZXMvcGFyYW1ldGVyL0Jhc2ljUHJvcGVydHlQYXJhbWV0ZXJzLnR5cGUnO1xuaW1wb3J0IHsgbmwsIGUgfSBmcm9tICcuL2hlbHBlcnMnO1xuXG5leHBvcnQgY2xhc3MgVkNhcmRGb3JtYXR0ZXIge1xuICBwdWJsaWMgc3RhdGljIGdldFZDYXJkQXNCbG9iKFxuICAgIHZDYXJkOiBWQ2FyZCxcbiAgICBlbmNvZGluZzogVkNhcmRFbmNvZGluZyA9IFZDYXJkRW5jb2Rpbmcubm9uZSxcbiAgKTogQmxvYiB7XG4gICAgY29uc3QgZGF0YSA9IFZDYXJkRm9ybWF0dGVyLmdldFZDYXJkQXNTdHJpbmcodkNhcmQsIGVuY29kaW5nKTtcbiAgICByZXR1cm4gbmV3IEJsb2IoW2RhdGFdLCB7IHR5cGU6ICd0ZXh0L3ZjYXJkJyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZm9ybWF0dGVkIHZDYXJkIGluIFZDRiBmb3JtYXRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0VkNhcmRBc1N0cmluZyhcbiAgICB2Q2FyZDogVkNhcmQsXG4gICAgZW5jb2RpbmdQcmVmaXg6IFZDYXJkRW5jb2RpbmcgPSBWQ2FyZEVuY29kaW5nLm5vbmUsXG4gICk6IHN0cmluZyB7XG4gICAgaWYgKCF2Q2FyZC52ZXJzaW9uKSB7XG4gICAgICB2Q2FyZC52ZXJzaW9uID0gJzQuMCc7XG4gICAgfVxuICAgIGNvbnN0IG1ham9yVmVyc2lvbiA9IGdldE1ham9yVmVyc2lvbih2Q2FyZC52ZXJzaW9uKTtcblxuICAgIGxldCBmb3JtYXR0ZWRWQ2FyZFN0cmluZyA9ICcnO1xuICAgIGZvcm1hdHRlZFZDYXJkU3RyaW5nICs9ICdCRUdJTjpWQ0FSRCcgKyBubCgpO1xuICAgIGZvcm1hdHRlZFZDYXJkU3RyaW5nICs9ICdWRVJTSU9OOicgKyB2Q2FyZC52ZXJzaW9uICsgbmwoKTtcblxuICAgIC8vIGNvbnN0IGVuY29kaW5nUHJlZml4ID0gJyc7XG4gICAgbGV0IGZvcm1hdHRlZE5hbWUgPSAnJztcbiAgICBpZiAodkNhcmQubmFtZSA9PSBudWxsKSB7XG4gICAgICB2Q2FyZC5uYW1lID0ge307XG4gICAgfVxuXG4gICAgbGV0IG5hbWVBcnJheSA9IFtdO1xuICAgIGlmICh2Q2FyZC5mb3JtYXR0ZWROYW1lICE9IG51bGwpIHtcbiAgICAgIG5hbWVBcnJheSA9IFtcbiAgICAgICAgdkNhcmQuZm9ybWF0dGVkTmFtZS5maXJzdE5hbWVzLFxuICAgICAgICB2Q2FyZC5mb3JtYXR0ZWROYW1lLmFkZHRpb25hbE5hbWVzLFxuICAgICAgICB2Q2FyZC5mb3JtYXR0ZWROYW1lLmxhc3ROYW1lcyxcbiAgICAgIF07XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWVBcnJheSA9IFtcbiAgICAgICAgdkNhcmQubmFtZS5maXJzdE5hbWVzLFxuICAgICAgICB2Q2FyZC5uYW1lLmFkZHRpb25hbE5hbWVzLFxuICAgICAgICB2Q2FyZC5uYW1lLmxhc3ROYW1lcyxcbiAgICAgIF07XG4gICAgfVxuXG4gICAgZm9ybWF0dGVkTmFtZSA9IG5hbWVBcnJheS5maWx0ZXIoKHN0cmluZykgPT4gc3RyaW5nICE9IG51bGwpLmpvaW4oJyAnKTtcblxuICAgIGZvcm1hdHRlZFZDYXJkU3RyaW5nICs9XG4gICAgICAnRk4nICsgZW5jb2RpbmdQcmVmaXggKyAnOicgKyBlKGZvcm1hdHRlZE5hbWUpICsgbmwoKTtcblxuICAgIGZvcm1hdHRlZFZDYXJkU3RyaW5nICs9XG4gICAgICAnTicgK1xuICAgICAgZW5jb2RpbmdQcmVmaXggK1xuICAgICAgJzonICtcbiAgICAgIFtcbiAgICAgICAgZSh2Q2FyZC5uYW1lLmxhc3ROYW1lcyksXG4gICAgICAgIGUodkNhcmQubmFtZS5maXJzdE5hbWVzKSxcbiAgICAgICAgZSh2Q2FyZC5uYW1lLmFkZHRpb25hbE5hbWVzKSxcbiAgICAgICAgZSh2Q2FyZC5uYW1lLm5hbWVQcmVmaXgpLFxuICAgICAgICBlKHZDYXJkLm5hbWUubmFtZVN1ZmZpeCksXG4gICAgICBdLmpvaW4oJzsnKSArXG4gICAgICBubCgpO1xuXG4gICAgaWYgKHZDYXJkLm5pY2tuYW1lICYmIG1ham9yVmVyc2lvbiA+PSAzKSB7XG4gICAgICBmb3JtYXR0ZWRWQ2FyZFN0cmluZyArPVxuICAgICAgICAnTklDS05BTUUnICsgZW5jb2RpbmdQcmVmaXggKyAnOicgKyBlKHZDYXJkLm5pY2tuYW1lKSArIG5sKCk7XG4gICAgfVxuXG4gICAgaWYgKHZDYXJkLmdlbmRlcikge1xuICAgICAgaWYgKHZDYXJkLmdlbmRlci5zZXgpIHtcbiAgICAgICAgZm9ybWF0dGVkVkNhcmRTdHJpbmcgKz0gJ0dFTkRFUjonICsgZSh2Q2FyZC5nZW5kZXIuc2V4KTtcbiAgICAgICAgaWYgKHZDYXJkLmdlbmRlci50ZXh0KSB7XG4gICAgICAgICAgZm9ybWF0dGVkVkNhcmRTdHJpbmcgKz0gJzsnICsgZSh2Q2FyZC5nZW5kZXIudGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9ybWF0dGVkVkNhcmRTdHJpbmcgKz0gbmwoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvcm1hdHRlZFZDYXJkU3RyaW5nICs9ICdHRU5ERVI6OycgKyBlKHZDYXJkLmdlbmRlci50ZXh0KSArIG5sKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHZDYXJkLnVpZCkge1xuICAgICAgZm9ybWF0dGVkVkNhcmRTdHJpbmcgKz1cbiAgICAgICAgJ1VJRCcgKyBlbmNvZGluZ1ByZWZpeCArICc6JyArIGUodkNhcmQudWlkKSArIG5sKCk7XG4gICAgfVxuXG4gICAgaWYgKHZDYXJkLmJpcnRoZGF5KSB7XG4gICAgICBmb3JtYXR0ZWRWQ2FyZFN0cmluZyArPSAnQkRBWTonICsgWVlZWU1NREQodkNhcmQuYmlydGhkYXkpICsgbmwoKTtcbiAgICB9XG5cbiAgICBpZiAodkNhcmQuYW5uaXZlcnNhcnkpIHtcbiAgICAgIGZvcm1hdHRlZFZDYXJkU3RyaW5nICs9XG4gICAgICAgICdBTk5JVkVSU0FSWTonICsgWVlZWU1NREQodkNhcmQuYW5uaXZlcnNhcnkpICsgbmwoKTtcbiAgICB9XG5cbiAgICBpZiAodkNhcmQubGFuZ3VhZ2UpIHtcbiAgICAgIHZDYXJkLmxhbmd1YWdlLmZvckVhY2goKGxhbmd1YWdlKSA9PiB7XG4gICAgICAgIGlmIChpc1Byb3BlcnR5V2l0aFBhcmFtZXRlcnMobGFuZ3VhZ2UpKSB7XG4gICAgICAgICAgZm9ybWF0dGVkVkNhcmRTdHJpbmcgKz1cbiAgICAgICAgICAgICdMQU5HJyArXG4gICAgICAgICAgICBwcm9wZXJ0eVRvVkNhcmRTdHJpbmcobGFuZ3VhZ2UucGFyYW0pICtcbiAgICAgICAgICAgICc6JyArXG4gICAgICAgICAgICBlKGxhbmd1YWdlLnZhbHVlKSArXG4gICAgICAgICAgICBubCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvcm1hdHRlZFZDYXJkU3RyaW5nICs9ICdMQU5HOicgKyBlKGxhbmd1YWdlKSArIG5sKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh2Q2FyZC5vcmdhbml6YXRpb24pIHtcbiAgICAgIGlmIChpc1Byb3BlcnR5V2l0aFBhcmFtZXRlcnModkNhcmQub3JnYW5pemF0aW9uKSkge1xuICAgICAgICBmb3JtYXR0ZWRWQ2FyZFN0cmluZyArPVxuICAgICAgICAgICdPUkcnICtcbiAgICAgICAgICBwcm9wZXJ0eVRvVkNhcmRTdHJpbmcodkNhcmQub3JnYW5pemF0aW9uLnBhcmFtKSArXG4gICAgICAgICAgJzonICtcbiAgICAgICAgICBlKHZDYXJkLm9yZ2FuaXphdGlvbi52YWx1ZSkgK1xuICAgICAgICAgIG5sKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3JtYXR0ZWRWQ2FyZFN0cmluZyArPVxuICAgICAgICAgICdPUkcnICsgZW5jb2RpbmdQcmVmaXggKyAnOicgKyBlKHZDYXJkLm9yZ2FuaXphdGlvbikgKyBubCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh2Q2FyZC5hZGRyZXNzKSB7XG4gICAgICB2Q2FyZC5hZGRyZXNzLmZvckVhY2goKGFkZHJlc3MpID0+IHtcbiAgICAgICAgaWYgKGlzUHJvcGVydHlXaXRoUGFyYW1ldGVyc0FkZHJlc3NWYWx1ZShhZGRyZXNzKSkge1xuICAgICAgICAgIGZvcm1hdHRlZFZDYXJkU3RyaW5nICs9XG4gICAgICAgICAgICAnQURSJyArXG4gICAgICAgICAgICBwcm9wZXJ0eVRvVkNhcmRTdHJpbmcoYWRkcmVzcy5wYXJhbSBhcyBCYXNpY1Byb3BlcnR5UGFyYW1ldGVycykgK1xuICAgICAgICAgICAgZ2V0Rm9ybWF0dGVkQWRkcmVzcyhhZGRyZXNzLnZhbHVlKSArXG4gICAgICAgICAgICBubCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvcm1hdHRlZFZDYXJkU3RyaW5nICs9ICdBRFInICsgZ2V0Rm9ybWF0dGVkQWRkcmVzcyhhZGRyZXNzKSArIG5sKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh2Q2FyZC50ZWxlcGhvbmUpIHtcbiAgICAgIHZDYXJkLnRlbGVwaG9uZS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgIGlmICghaXNQcm9wZXJ0eVdpdGhQYXJhbWV0ZXJzKGVsZW1lbnQpKSB7XG4gICAgICAgICAgZWxlbWVudCA9IHtcbiAgICAgICAgICAgIHZhbHVlOiBlbGVtZW50LFxuICAgICAgICAgICAgcGFyYW06IHtcbiAgICAgICAgICAgICAgdHlwZTogJ3ZvaWNlJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBmb3JtYXR0ZWRWQ2FyZFN0cmluZyArPVxuICAgICAgICAgICdURUwnICtcbiAgICAgICAgICBwcm9wZXJ0eVRvVkNhcmRTdHJpbmcoZWxlbWVudC5wYXJhbSBhcyBCYXNpY1Byb3BlcnR5UGFyYW1ldGVycykgK1xuICAgICAgICAgICc6JyArXG4gICAgICAgICAgZShlbGVtZW50LnZhbHVlKSArXG4gICAgICAgICAgbmwoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh2Q2FyZC5lbWFpbCkge1xuICAgICAgdkNhcmQuZW1haWwuZm9yRWFjaCgoZW1haWwpID0+IHtcbiAgICAgICAgaWYgKGlzUHJvcGVydHlXaXRoUGFyYW1ldGVycyhlbWFpbCkpIHtcbiAgICAgICAgICBmb3JtYXR0ZWRWQ2FyZFN0cmluZyArPVxuICAgICAgICAgICAgJ0VNQUlMJyArXG4gICAgICAgICAgICBwcm9wZXJ0eVRvVkNhcmRTdHJpbmcoZW1haWwucGFyYW0pICtcbiAgICAgICAgICAgICc6JyArXG4gICAgICAgICAgICBlKGVtYWlsLnZhbHVlKSArXG4gICAgICAgICAgICBubCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvcm1hdHRlZFZDYXJkU3RyaW5nICs9ICdFTUFJTDonICsgZShlbWFpbCkgKyBubCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodkNhcmQudGl0bGUpIHtcbiAgICAgIGZvcm1hdHRlZFZDYXJkU3RyaW5nICs9XG4gICAgICAgICdUSVRMRScgKyBlbmNvZGluZ1ByZWZpeCArICc6JyArIGUodkNhcmQudGl0bGUpICsgbmwoKTtcbiAgICB9XG5cbiAgICBpZiAodkNhcmQubG9nbykge1xuICAgICAgaWYgKGlzUHJvcGVydHlXaXRoUGFyYW1ldGVycyh2Q2FyZC5sb2dvKSkge1xuICAgICAgICBmb3JtYXR0ZWRWQ2FyZFN0cmluZyArPVxuICAgICAgICAgICdMT0dPJyArXG4gICAgICAgICAgcHJvcGVydHlUb1ZDYXJkU3RyaW5nKHZDYXJkLmxvZ28ucGFyYW0pICtcbiAgICAgICAgICAnOicgK1xuICAgICAgICAgIGUodkNhcmQubG9nby52YWx1ZSkgK1xuICAgICAgICAgIG5sKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3JtYXR0ZWRWQ2FyZFN0cmluZyArPSAnTE9HTzonICsgZSh2Q2FyZC5sb2dvKSArIG5sKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHZDYXJkLnBob3RvKSB7XG4gICAgICBpZiAoaXNQcm9wZXJ0eVdpdGhQYXJhbWV0ZXJzKHZDYXJkLnBob3RvKSkge1xuICAgICAgICBmb3JtYXR0ZWRWQ2FyZFN0cmluZyArPVxuICAgICAgICAgICdQSE9UTycgK1xuICAgICAgICAgIHByb3BlcnR5VG9WQ2FyZFN0cmluZyh2Q2FyZC5waG90by5wYXJhbSkgK1xuICAgICAgICAgICc6JyArXG4gICAgICAgICAgZSh2Q2FyZC5waG90by52YWx1ZSkgK1xuICAgICAgICAgIG5sKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3JtYXR0ZWRWQ2FyZFN0cmluZyArPSAnUEhPVE86JyArIGUodkNhcmQucGhvdG8pICsgbmwoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodkNhcmQuaG9tZUZheCkge1xuICAgICAgdkNhcmQuaG9tZUZheC5mb3JFYWNoKGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgaWYgKCttYWpvclZlcnNpb24gPj0gNCkge1xuICAgICAgICAgIGZvcm1hdHRlZFZDYXJkU3RyaW5nICs9XG4gICAgICAgICAgICAnVEVMO1ZBTFVFPXVyaTtUWVBFPVwiZmF4LGhvbWVcIjp0ZWw6JyArIGUobnVtYmVyKSArIG5sKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9ybWF0dGVkVkNhcmRTdHJpbmcgKz0gJ1RFTDtUWVBFPUhPTUUsRkFYOicgKyBlKG51bWJlcikgKyBubCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodkNhcmQud29ya0ZheCkge1xuICAgICAgdkNhcmQud29ya0ZheC5mb3JFYWNoKGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgaWYgKCttYWpvclZlcnNpb24gPj0gNCkge1xuICAgICAgICAgIGZvcm1hdHRlZFZDYXJkU3RyaW5nICs9XG4gICAgICAgICAgICAnVEVMO1ZBTFVFPXVyaTtUWVBFPVwiZmF4LHdvcmtcIjp0ZWw6JyArIGUobnVtYmVyKSArIG5sKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9ybWF0dGVkVkNhcmRTdHJpbmcgKz0gJ1RFTDtUWVBFPVdPUkssRkFYOicgKyBlKG51bWJlcikgKyBubCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodkNhcmQucm9sZSkge1xuICAgICAgZm9ybWF0dGVkVkNhcmRTdHJpbmcgKz1cbiAgICAgICAgJ1JPTEUnICsgZW5jb2RpbmdQcmVmaXggKyAnOicgKyBlKHZDYXJkLnJvbGUpICsgbmwoKTtcbiAgICB9XG5cbiAgICBpZiAodkNhcmQudXJsKSB7XG4gICAgICBsZXQgdXJsTm90U2V0ID0gdHJ1ZTtcbiAgICAgIGlmIChoYXNQcm9wKHZDYXJkLnVybCwgJ2hvbWUnKSkge1xuICAgICAgICBmb3JtYXR0ZWRWQ2FyZFN0cmluZyArPVxuICAgICAgICAgICdVUkw7dHlwZT1IT01FJyArXG4gICAgICAgICAgZW5jb2RpbmdQcmVmaXggK1xuICAgICAgICAgICc6JyArXG4gICAgICAgICAgZSgodkNhcmQudXJsIGFzIHsgaG9tZTogc3RyaW5nIH0pLmhvbWUpICtcbiAgICAgICAgICBubCgpO1xuICAgICAgICB1cmxOb3RTZXQgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc1Byb3AodkNhcmQudXJsLCAnd29yaycpKSB7XG4gICAgICAgIGZvcm1hdHRlZFZDYXJkU3RyaW5nICs9XG4gICAgICAgICAgJ1VSTDt0eXBlPVdPUksnICtcbiAgICAgICAgICBlbmNvZGluZ1ByZWZpeCArXG4gICAgICAgICAgJzonICtcbiAgICAgICAgICBlKCh2Q2FyZC51cmwgYXMgeyB3b3JrOiBzdHJpbmcgfSkud29yaykgK1xuICAgICAgICAgIG5sKCk7XG4gICAgICAgIHVybE5vdFNldCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHVybE5vdFNldCkge1xuICAgICAgICBmb3JtYXR0ZWRWQ2FyZFN0cmluZyArPVxuICAgICAgICAgICdVUkwnICsgZW5jb2RpbmdQcmVmaXggKyAnOicgKyBlKHZDYXJkLnVybCBhcyBzdHJpbmcpICsgbmwoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodkNhcmQubm90ZSkge1xuICAgICAgZm9ybWF0dGVkVkNhcmRTdHJpbmcgKz1cbiAgICAgICAgJ05PVEUnICsgZW5jb2RpbmdQcmVmaXggKyAnOicgKyBlKHZDYXJkLm5vdGUpICsgbmwoKTtcbiAgICB9XG5cbiAgICBpZiAodkNhcmQuc29jaWFsVXJscykge1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gdkNhcmQuc29jaWFsVXJscykge1xuICAgICAgICBpZiAodkNhcmQuc29jaWFsVXJscy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIHZDYXJkLnNvY2lhbFVybHNba2V5XSkge1xuICAgICAgICAgIGZvcm1hdHRlZFZDYXJkU3RyaW5nICs9XG4gICAgICAgICAgICAnWC1TT0NJQUxQUk9GSUxFJyArXG4gICAgICAgICAgICBlbmNvZGluZ1ByZWZpeCArXG4gICAgICAgICAgICAnO1RZUEU9JyArXG4gICAgICAgICAgICBrZXkgK1xuICAgICAgICAgICAgJzonICtcbiAgICAgICAgICAgIGUodkNhcmQuc29jaWFsVXJsc1trZXldKSArXG4gICAgICAgICAgICBubCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHZDYXJkLnNvdXJjZSkge1xuICAgICAgaWYgKGlzUHJvcGVydHlXaXRoUGFyYW1ldGVycyh2Q2FyZC5zb3VyY2UpKSB7XG4gICAgICAgIGZvcm1hdHRlZFZDYXJkU3RyaW5nICs9XG4gICAgICAgICAgJ1NPVVJDRScgK1xuICAgICAgICAgIGVuY29kaW5nUHJlZml4ICtcbiAgICAgICAgICBwcm9wZXJ0eVRvVkNhcmRTdHJpbmcodkNhcmQuc291cmNlLnBhcmFtKSArXG4gICAgICAgICAgJzonICtcbiAgICAgICAgICBlKHZDYXJkLnNvdXJjZS52YWx1ZSkgK1xuICAgICAgICAgICtubCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9ybWF0dGVkVkNhcmRTdHJpbmcgKz1cbiAgICAgICAgICAnU09VUkNFJyArIGVuY29kaW5nUHJlZml4ICsgJzonICsgZSh2Q2FyZC5zb3VyY2UpICsgbmwoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHZDYXJkLnJldikge1xuICAgICAgZm9ybWF0dGVkVkNhcmRTdHJpbmcgKz0gJ1JFVjonICsgdkNhcmQucmV2ICsgbmwoKTtcbiAgICB9XG4gICAgZm9ybWF0dGVkVkNhcmRTdHJpbmcgKz0gJ0VORDpWQ0FSRCcgKyBubCgpO1xuICAgIHJldHVybiBmb3JtYXR0ZWRWQ2FyZFN0cmluZztcbiAgfVxufVxuXG4vKipcbiAqIEdldCBmb3JtYXR0ZWQgcGhvdG9cbiAqIEBwYXJhbSBwaG90b1R5cGUgICAgICAgUGhvdG8gdHlwZSAoUEhPVE8sIExPR08pXG4gKiBAcGFyYW0gdXJsICAgICAgICAgICAgIFVSTCB0byBhdHRhY2ggcGhvdG8gZnJvbVxuICogQHBhcmFtIG1lZGlhVHlwZSAgICAgICBNZWRpYS10eXBlIG9mIHBob3RvIChKUEVHLCBQTkcsIEdJRilcbiAqL1xuZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkUGhvdG8oXG4gIHBob3RvVHlwZTogJ1BIT1RPJyB8ICdMT0dPJyxcbiAgdXJsOiBzdHJpbmcsXG4gIG1lZGlhVHlwZTogc3RyaW5nLFxuICBiYXNlNjQ6IGJvb2xlYW4sXG4gIG1ham9yVmVyc2lvbjogbnVtYmVyLFxuKSB7XG4gIGxldCBwYXJhbXM7XG5cbiAgaWYgKCttYWpvclZlcnNpb24gPj0gNCkge1xuICAgIHBhcmFtcyA9IGJhc2U2NCA/ICc7RU5DT0RJTkc9YjtNRURJQVRZUEU9aW1hZ2UvJyA6ICc7TUVESUFUWVBFPWltYWdlLyc7XG4gIH0gZWxzZSBpZiAoK21ham9yVmVyc2lvbiA9PT0gMykge1xuICAgIHBhcmFtcyA9IGJhc2U2NCA/ICc7RU5DT0RJTkc9YjtUWVBFPScgOiAnO1RZUEU9JztcbiAgfSBlbHNlIHtcbiAgICBwYXJhbXMgPSBiYXNlNjQgPyAnO0VOQ09ESU5HPUJBU0U2NDsnIDogJzsnO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0dGVkUGhvdG8gPSBwaG90b1R5cGUgKyBwYXJhbXMgKyBtZWRpYVR5cGUgKyAnOicgKyBlKHVybCkgKyBubCgpO1xuICByZXR1cm4gZm9ybWF0dGVkUGhvdG87XG59XG5cbi8qKlxuICogR2V0IGZvcm1hdHRlZCBhZGRyZXNzXG4gKi9cbmZ1bmN0aW9uIGdldEZvcm1hdHRlZEFkZHJlc3MoYWRkcmVzczogQWRkcmVzcykge1xuICByZXR1cm4gKFxuICAgIChhZGRyZXNzLmxhYmVsID8gJztMQUJFTD1cIicgKyBlKGFkZHJlc3MubGFiZWwpICsgJ1wiJyA6ICcnKSArXG4gICAgJzonICtcbiAgICBlKGFkZHJlc3MucG9zdE9mZmljZUJveCkgK1xuICAgICc7JyArXG4gICAgZShhZGRyZXNzLmV4dGVuZGVkQWRkcmVzcykgK1xuICAgICc7JyArXG4gICAgZShhZGRyZXNzLnN0cmVldCkgK1xuICAgICc7JyArXG4gICAgZShhZGRyZXNzLmxvY2FsaXR5KSArXG4gICAgJzsnICtcbiAgICBlKGFkZHJlc3MucmVnaW9uKSArXG4gICAgJzsnICtcbiAgICBlKGFkZHJlc3MucG9zdGFsQ29kZSkgK1xuICAgICc7JyArXG4gICAgZShhZGRyZXNzLmNvdW50cnlOYW1lKVxuICApO1xufVxuXG4vKipcbiAqIENvbnZlcnQgZGF0ZSB0byBZWVlZTU1ERCBmb3JtYXRcbiAqL1xuZnVuY3Rpb24gWVlZWU1NREQoZGF0ZTogRGF0ZSB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIGlmICghZGF0ZSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcoJ3NlJykucmVwbGFjZSgvXFxEL2csICcnKTsgLy8gdXNlIFN3ZWRpc2ggZGF0ZSBmb3JtYXRcbn1cblxuLyoqXG4gKiBHZXQgbWFqb3IgdmVyc2lvbiBmcm9tIHZlcnNpb24gc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYWpvclZlcnNpb24odmVyc2lvbjogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgbWFqb3JWZXJzaW9uU3RyaW5nID0gdmVyc2lvbiA/IHZlcnNpb24uc2xpY2UoMCwgMSkgOiAnNCc7XG4gIGlmICghaXNOYU4oK21ham9yVmVyc2lvblN0cmluZykpIHtcbiAgICByZXR1cm4gTnVtYmVyLnBhcnNlSW50KG1ham9yVmVyc2lvblN0cmluZyk7XG4gIH1cbiAgcmV0dXJuIDQ7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgb2JqZWN0IGhhcyB0aGUgUHJvcGVydHlcbiAqIEBwYXJhbSBvYmogT2JqZWN0IHRvIHRlc3RcbiAqIEBwYXJhbSBwcm9wZXJ0eSBQcm9wZXJ0eSB0byBjaGVja1xuICovXG5mdW5jdGlvbiBoYXNQcm9wKG9iajogYW55LCBwcm9wZXJ0eTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wZXJ0eSk7XG59XG4iXX0=