@liquid-js/qr-code-styling 5.4.5 → 5.5.0-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -73,6 +73,10 @@ export declare enum ImageMode {
73
73
  background = "background"
74
74
  }
75
75
  export interface Plugin {
76
+ /**
77
+ * Modify the options before rendering
78
+ */
79
+ configure?: (options: Options) => Options | undefined | void;
76
80
  /**
77
81
  * Draw a single dot
78
82
  *
@@ -0,0 +1,2 @@
1
+ import e from"path";import r from"fs";function t(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var a,o,n,i={exports:{}};function s(){return a||(a=1,function(){function e(e){return e?("string"!=typeof e&&(e=""+e),e.replace(/\n/g,"\\n").replace(/,/g,"\\,").replace(/;/g,"\\;")):""}function r(){return"\r\n"}function t(r,t,a,n){return r+(o>=4?n?";ENCODING=b;MEDIATYPE=image/":";MEDIATYPE=image/":3===o?n?";ENCODING=b;TYPE=":";TYPE=":n?";ENCODING=BASE64;":";")+a+":"+e(t)+"\r\n"}function a(e){return e.getFullYear()+("0"+(e.getMonth()+1)).slice(-2)+("0"+e.getDate()).slice(-2)}var o="3";i.exports={getFormattedString:function(n){o=n.getMajorVersion();var i="";i+="BEGIN:VCARD\r\n",i+="VERSION:"+n.version+"\r\n";var s=o>=4?"":";CHARSET=UTF-8",l=n.formattedName;if(l||(l="",[n.firstName,n.middleName,n.lastName].forEach(function(e){e&&l&&(l+=" "),l+=e})),i+="FN"+s+":"+e(l)+"\r\n",i+="N"+s+":"+e(n.lastName)+";"+e(n.firstName)+";"+e(n.middleName)+";"+e(n.namePrefix)+";"+e(n.nameSuffix)+"\r\n",n.nickname&&o>=3&&(i+="NICKNAME"+s+":"+e(n.nickname)+"\r\n"),n.gender&&(i+="GENDER:"+e(n.gender)+"\r\n"),n.uid&&(i+="UID"+s+":"+e(n.uid)+"\r\n"),n.birthday&&(i+="BDAY:"+a(n.birthday)+"\r\n"),n.anniversary&&(i+="ANNIVERSARY:"+a(n.anniversary)+"\r\n"),n.email&&(Array.isArray(n.email)||(n.email=[n.email]),n.email.forEach(function(r){i=o>=4?i+"EMAIL"+s+";type=HOME:"+e(r)+"\r\n":o>=3&&o<4?i+"EMAIL"+s+";type=HOME,INTERNET:"+e(r)+"\r\n":i+"EMAIL"+s+";HOME;INTERNET:"+e(r)+"\r\n"})),n.workEmail&&(Array.isArray(n.workEmail)||(n.workEmail=[n.workEmail]),n.workEmail.forEach(function(r){i=o>=4?i+"EMAIL"+s+";type=WORK:"+e(r)+"\r\n":o>=3&&o<4?i+"EMAIL"+s+";type=WORK,INTERNET:"+e(r)+"\r\n":i+"EMAIL"+s+";WORK;INTERNET:"+e(r)+"\r\n"})),n.otherEmail&&(Array.isArray(n.otherEmail)||(n.otherEmail=[n.otherEmail]),n.otherEmail.forEach(function(r){i=o>=4?i+"EMAIL"+s+";type=OTHER:"+e(r)+"\r\n":o>=3&&o<4?i+"EMAIL"+s+";type=OTHER,INTERNET:"+e(r)+"\r\n":i+"EMAIL"+s+";OTHER;INTERNET:"+e(r)+"\r\n"})),n.logo.url&&(i+=t("LOGO",n.logo.url,n.logo.mediaType,n.logo.base64)),n.photo.url&&(i+=t("PHOTO",n.photo.url,n.photo.mediaType,n.photo.base64)),n.cellPhone&&(Array.isArray(n.cellPhone)||(n.cellPhone=[n.cellPhone]),n.cellPhone.forEach(function(r){i=o>=4?i+'TEL;VALUE=uri;TYPE="voice,cell":tel:'+e(r)+"\r\n":i+"TEL;TYPE=CELL:"+e(r)+"\r\n"})),n.pagerPhone&&(Array.isArray(n.pagerPhone)||(n.pagerPhone=[n.pagerPhone]),n.pagerPhone.forEach(function(r){i=o>=4?i+'TEL;VALUE=uri;TYPE="pager,cell":tel:'+e(r)+"\r\n":i+"TEL;TYPE=PAGER:"+e(r)+"\r\n"})),n.homePhone&&(Array.isArray(n.homePhone)||(n.homePhone=[n.homePhone]),n.homePhone.forEach(function(r){i=o>=4?i+'TEL;VALUE=uri;TYPE="voice,home":tel:'+e(r)+"\r\n":i+"TEL;TYPE=HOME,VOICE:"+e(r)+"\r\n"})),n.workPhone&&(Array.isArray(n.workPhone)||(n.workPhone=[n.workPhone]),n.workPhone.forEach(function(r){i=o>=4?i+'TEL;VALUE=uri;TYPE="voice,work":tel:'+e(r)+"\r\n":i+"TEL;TYPE=WORK,VOICE:"+e(r)+"\r\n"})),n.homeFax&&(Array.isArray(n.homeFax)||(n.homeFax=[n.homeFax]),n.homeFax.forEach(function(r){i=o>=4?i+'TEL;VALUE=uri;TYPE="fax,home":tel:'+e(r)+"\r\n":i+"TEL;TYPE=HOME,FAX:"+e(r)+"\r\n"})),n.workFax&&(Array.isArray(n.workFax)||(n.workFax=[n.workFax]),n.workFax.forEach(function(r){i=o>=4?i+'TEL;VALUE=uri;TYPE="fax,work":tel:'+e(r)+"\r\n":i+"TEL;TYPE=WORK,FAX:"+e(r)+"\r\n"})),n.otherPhone&&(Array.isArray(n.otherPhone)||(n.otherPhone=[n.otherPhone]),n.otherPhone.forEach(function(r){i=o>=4?i+'TEL;VALUE=uri;TYPE="voice,other":tel:'+e(r)+"\r\n":i+"TEL;TYPE=OTHER:"+e(r)+"\r\n"})),[{details:n.homeAddress,type:"HOME"},{details:n.workAddress,type:"WORK"}].forEach(function(r){var t=i,a="";(r.details.label||r.details.street||r.details.city||r.details.stateProvince||r.details.postalCode||r.details.countryRegion)&&(o>=4?a="ADR"+s+";TYPE="+r.type+(r.details.label?';LABEL="'+e(r.details.label)+'"':"")+":;;"+e(r.details.street)+";"+e(r.details.city)+";"+e(r.details.stateProvince)+";"+e(r.details.postalCode)+";"+e(r.details.countryRegion)+"\r\n":(r.details.label&&(a="LABEL"+s+";TYPE="+r.type+":"+e(r.details.label)+"\r\n"),a+="ADR"+s+";TYPE="+r.type+":;;"+e(r.details.street)+";"+e(r.details.city)+";"+e(r.details.stateProvince)+";"+e(r.details.postalCode)+";"+e(r.details.countryRegion)+"\r\n")),i=t+a}),n.title&&(i+="TITLE"+s+":"+e(n.title)+"\r\n"),n.role&&(i+="ROLE"+s+":"+e(n.role)+"\r\n"),n.organization&&(i+="ORG"+s+":"+e(n.organization)+"\r\n"),n.url&&(i+="URL"+s+":"+e(n.url)+"\r\n"),n.workUrl&&(i+="URL;type=WORK"+s+":"+e(n.workUrl)+"\r\n"),n.note&&(i+="NOTE"+s+":"+e(n.note)+"\r\n"),n.socialUrls)for(var u in n.socialUrls)n.socialUrls.hasOwnProperty(u)&&n.socialUrls[u]&&(i+="X-SOCIALPROFILE"+s+";TYPE="+u+":"+e(n.socialUrls[u])+r());return n.source&&(i+="SOURCE"+s+":"+e(n.source)+"\r\n"),i+="REV:"+(new Date).toISOString()+"\r\n",n.isOrganization&&(i+="X-ABShowAs:COMPANY\r\n"),i+="END:VCARD\r\n"}}}()),i.exports}n||(n=1,o=function(){function t(){return{url:"",mediaType:"",base64:!1,attachFromUrl:function(e,r){this.url=e,this.mediaType=r,this.base64=!1},embedFromFile:function(t){var a=r;this.mediaType=e.extname(t).toUpperCase().replace(/\./g,""),this.url=a.readFileSync(t).toString("base64"),this.base64=!0},embedFromString:function(e,r){this.mediaType=r,this.url=e,this.base64=!0}}}return{uid:"",birthday:"",cellPhone:"",pagerPhone:"",email:"",workEmail:"",firstName:"",formattedName:"",gender:"",homeAddress:{label:"",street:"",city:"",stateProvince:"",postalCode:"",countryRegion:""},homePhone:"",homeFax:"",lastName:"",logo:t(),middleName:"",namePrefix:"",nameSuffix:"",nickname:"",note:"",organization:"",photo:t(),role:"",socialUrls:{facebook:"",linkedIn:"",twitter:"",flickr:""},source:"",title:"",url:"",workUrl:"",workAddress:{label:"",street:"",city:"",stateProvince:"",postalCode:"",countryRegion:""},workPhone:"",workFax:"",version:"3.0",getMajorVersion:function(){var e=this.version?this.version.split(".")[0]:"4";return isNaN(e)?4:parseInt(e)},getFormattedString:function(){return s().getFormattedString(this)},saveToFile:function(e){var t=s().getFormattedString(this);r.writeFileSync(e,t,{encoding:"utf8"})}}});var l,u,c=t(o);var h,p,d,f,m,E={exports:{}};function y(){function e(r,t,a){if(!(this instanceof e))return new e(t);null!=a&&Object.assign(this,a),this._field=r,this._data=t,Object.defineProperty(this,"_field",{enumerable:!1}),Object.defineProperty(this,"_data",{enumerable:!1})}function r(e){return e.replace(/([A-Z])/g,"-$1").toUpperCase()}return d?p:(d=1,e.fromJSON=function(r){var t=r[0],a=r[1];return/text/i.test(r[2])||(a.value=r[2]),new e(t,r=Array.isArray(r[3])?r[3].join(";"):r[3],a)},e.prototype={constructor:e,is:function(e){return e=(e+"").toLowerCase(),Array.isArray(this.type)?this.type.indexOf(e)>=0:this.type===e},isEmpty:function(){return null==this._data&&0===Object.keys(this).length},clone:function(){return new e(this._field,this._data,this)},toString:function(e){for(var t=(this.group?this.group+".":"")+r(this._field),a=Object.keys(this),o=[],n=0;n<a.length;n++)if("group"!==a[n])switch(t){case"TEL":case"ADR":case"EMAIL":"2.1"===e?Array.isArray(this[a[n]])?o.push(this[a[n]].join(";")):o.push(this[a[n]]):o.push(r(a[n])+"="+this[a[n]]);break;default:o.push(r(a[n])+"="+this[a[n]])}return"2.1"===e||"3.0"===e?t+(o.length?";"+o.join(";").toUpperCase():o.toString().toUpperCase())+":"+(Array.isArray(this._data)?this._data.join(";"):this._data):t+(o.length?";"+o.join(";"):o)+":"+(Array.isArray(this._data)?this._data.join(";"):this._data)},valueOf:function(){return this._data},toJSON:function(){var e=Object.assign({},this);switch("text"===e.value&&(e.value=void 0,delete e.value),e=[this._field,e,this.value||"text"],this._field){default:e.push(this._data);break;case"adr":case"n":e.push(this._data.split(";"))}return e}},p=e)}function g(){function e(e,r,t){Array.isArray(e[r])?e[r].push(t):e[r]=null!=e[r]?[e[r],t]:t}function r(r,a){a=a.split("=");var o=t(a[0]),n=a[1];return null!=n&&""!==n||(n=a[0],o="type"),"type"===o?('"'===n[0]&&'"'===n[n.length-1]&&-1!==n.indexOf(",")&&(n=n.slice(1,-1)),n.toLowerCase().split(",").forEach(function(t){e(r,o,t)}),r):(e(r,o,n),r)}if(m)return f;m=1;var t=function(){if(h)return E.exports;h=1;var e=(e,r)=>{if("string"!=typeof e&&!Array.isArray(e))throw new TypeError("Expected the input to be `string | string[]`");return r=Object.assign({pascalCase:!1},r),e=Array.isArray(e)?e.map(e=>e.trim()).filter(e=>e.length).join("-"):e.trim(),0===e.length?"":1===e.length?r.pascalCase?e.toUpperCase():e.toLowerCase():(e!==e.toLowerCase()&&(e=(e=>{var r=!1,t=!1,a=!1;for(let o=0;o<e.length;o++){let n=e[o];r&&/[a-zA-Z]/.test(n)&&n.toUpperCase()===n?(e=e.slice(0,o)+"-"+e.slice(o),r=!1,a=t,t=!0,o++):t&&a&&/[a-zA-Z]/.test(n)&&n.toLowerCase()===n?(e=e.slice(0,o-1)+"-"+e.slice(o-1),a=t,t=!1,r=!0):(r=n.toLowerCase()===n&&n.toUpperCase()!==n,a=t,t=n.toUpperCase()===n&&n.toLowerCase()!==n)}return e})(e)),e=e.replace(/^[_.\- ]+/,"").toLowerCase().replace(/[_.\- ]+(\w|$)/g,(e,r)=>r.toUpperCase()).replace(/\d+(\w|$)/g,e=>e.toUpperCase()),t=e,r.pascalCase?t.charAt(0).toUpperCase()+t.slice(1):t);var t};return E.exports=e,E.exports.default=e,E.exports}(),a=y();return f=function(o){for(var n,i={},s=/^([^;:]+)((?:;(?:[^;:]+))*)(?::([\s\S]+))?$/i,l=o.length-1,u=1;u<l;u++){n=o[u];var c=s.exec(n);if(c){var h=c[1].split(".");n=h.pop();var p=h.pop();h=c[3],c=(c[2]?c[2].replace(/^;|;$/g,"").split(";"):[]).reduce(r,p?{group:p}:{}),e(i,n=t(n),h=new a(n,h,c))}}return i}}var A,v,P,w=t(function(){function e(){if(!(this instanceof e))return new e;this.version=e.versions[e.versions.length-1],this.data={}}return v?A:(v=1,e.mimeType="text/vcard",e.extension=".vcf",e.versions=["2.1","3.0","4.0"],e.EOL="\r\n",e.foldLine=function(){function e(e,r,t){if(null!=r&&r<2)throw Error("Maximum length must not be less than 2");if(null!=r&&r>998)throw Error("Maximum length must not exceed 998");if(r=r||78,(e=e.replace(/[\r\n]+/g,"")).length<=r)return e;for(var a="",o=0,n=0,i=e.length,s=0,l=0;o<i;){if(!t&&~(n=e.lastIndexOf(" ",o+r))?n>o?(a+=e.slice(o,n)+"\r\n ",o=n):(a+=e.slice(o,o+r-l)+"\r\n ",o=o+r-l,t=!0):(a+=e.slice(o,o+r-l)+"\r\n ",o=o+r-l),i-o<r){a+=e.slice(o);break}0===s&&(l=1),s++}return a}return u?l:(u=1,e.unfold=function(e){return e.replace(/\r\n\s/gm,"")},l=e)}(),e.normalize=function(e){return(e+"").replace(/^[\s\r\n]+|[\s\r\n]+$/g,"").replace(/(\r\n)[\x09\x20]?(\r\n)|$/g,"$1").replace(/\r\n[\x20\x09]/g,"")},e.isSupported=function(r){return/^\d\.\d$/.test(r)&&-1!==e.versions.indexOf(r)},e.parse=function(r){r=(r+"").split(/(?=BEGIN:VCARD)/gi);for(var t=[],a=0;a<r.length;a++)t.push((new e).parse(r[a]));return t},e.parseLines=g(),e.fromJSON=function(r){if(null==(r="string"==typeof r?JSON.parse(r):r)||!Array.isArray(r))return new e;if(!/vcard/i.test(r[0]))throw Error("Object not in jCard format");var t=new e;return r[1].forEach(function(r){t.addProperty(e.Property.fromJSON(r))}),t},e.format=function(r,t){if(t=t||r.version||e.versions[e.versions.length-1],!e.isSupported(t))throw Error('Unsupported vCard version "'+t+'"');var a=[];a.push("BEGIN:VCARD"),a.push("VERSION:"+t);for(var o,n=Object.keys(r.data),i=0;i<n.length;i++)if("version"!==n[i])if(o=r.data[n[i]],Array.isArray(o))for(var s=0;s<o.length;s++)o[s].isEmpty()||a.push(e.foldLine(o[s].toString(t),75));else o.isEmpty()||a.push(e.foldLine(o.toString(t),75));return a.push("END:VCARD"),a.join(e.EOL)},e.Property=y(),e.prototype={constructor:e,get:function(e){return null==this.data[e]?this.data[e]:Array.isArray(this.data[e])?this.data[e].map(function(e){return e.clone()}):this.data[e].clone()},set:function(r,t,a){return this.setProperty(new e.Property(r,t,a))},add:function(r,t,a){return r=new e.Property(r,t,a),this.addProperty(r),this},setProperty:function(e){return this.data[e._field]=e,this},addProperty:function(e){var r=e._field;return Array.isArray(this.data[r])?this.data[r].push(e):this.data[r]=null!=this.data[r]?[this.data[r],e]:e,this},parse:function(r){var t=(r=e.normalize(r).split(/\r\n/g))[0],a=r[1],o=r[r.length-1],n=/VERSION:\d\.\d/i;if(!/BEGIN:VCARD/i.test(t))throw new SyntaxError('Invalid vCard: Expected "BEGIN:VCARD" but found "'+t+'"');if(!/END:VCARD/i.test(o))throw new SyntaxError('Invalid vCard: Expected "END:VCARD" but found "'+o+'"');if(!n.test(a)&&!(a=r.find(e=>n.test(e))))throw new SyntaxError('Invalid vCard: Expected "VERSION:\\d.\\d" but none found');if(this.version=a.substring(8,11),!e.isSupported(this.version))throw Error('Unsupported version "'+this.version+'"');return this.data=e.parseLines(r),this},toString:function(r){return r=r||this.version,e.format(this,r)},toJCard:function(e){e=e||"4.0";var r=Object.keys(this.data);e=[["version",{},"text",e]];for(var t,a=0;a<r.length;a++)if("version"!==r[a])if(t=this.data[r[a]],Array.isArray(t))for(var o=0;o<t.length;o++)e.push(t[o].toJSON());else e.push(t.toJSON());return["vcard",e]},toJSON:function(){return this.toJCard(this.version)}},A=e)}()),b=P||={};b.Home="home",b.Work="work";var O,x=O||={};x.Home="home",x.Work="work",x.Cell="cell",x.Pager="pager";var T,L=T||={};L.Messenger="messenger",L.Twitter="twitter",L.Facebook="facebook",L.LinkedIn="linkedin",L.SinaWeibo="weibo",L.Jabber="jabber",L.QQ="qq",L.GaduGadu="gadu-gadu";var k={[T.Twitter]:"https://x.com/",[T.Facebook]:"https://www.facebook.com/",[T.LinkedIn]:"https://www.linkedin.com/in/",[T.SinaWeibo]:"https://weibo.com/n/",[T.Messenger]:"https://www.messenger.com/t/"};export default class{pluginOptions;uuid;constructor(e,r){this.pluginOptions=e,this.uuid=r}configure(e){return e.data=this.generateVCard(),e}generateVCard(){var{data:e}=this.pluginOptions,r=c();r.version="3.0",r.formattedName=e.fullName;var t=[],a=1;if(e.name){let a=e.name;a.first&&(r.firstName=a.first),a.last&&(r.lastName=a.last),a.middle&&(r.middleName=a.middle),a.nick&&(r.nickname=a.nick,t.push(w.Property.fromJSON(["xAndroidCustom",{},"text",["vnd.android.cursor.item/nickname",a.nick,"1","","","","","","","","","","","","",""]]))),a.prefix&&(r.namePrefix=a.prefix),a.suffix&&(r.nameSuffix=a.suffix)}e.title&&(r.title=e.title),e.birthday&&(r.birthday=e.birthday),e.photo&&r.photo.attachFromUrl(e.photo.url,e.photo.mediaType),e.phone?.forEach(e=>{var t="otherPhone";switch(e.type){case O.Work:t="workPhone";break;case O.Cell:t="cellPhone";break;case O.Pager:t="pagerPhone";break;case O.Home:t="homePhone"}var a=r[t];Array.isArray(a)?a.push(e.value):r[t]=[e.value]}),e.email?.forEach(e=>{var t="otherEmail";switch(e.type){case P.Work:t="workEmail";break;case P.Home:t="email"}var a=r[t];Array.isArray(a)?a.push(e.value):r[t]=[e.value]}),e.address&&Object.entries(e.address).forEach(([e,t])=>{var a="homeAddress";switch(e){case"home":a="homeAddress";break;case"work":a="workAddress"}t.streetAddress&&(r[a].street=t.streetAddress),t.locality&&(r[a].city=t.locality),t.postalCode&&(r[a].postalCode=t.postalCode),t.stateProvince&&(r[a].stateProvince=t.stateProvince),e=[],t.region&&e.push(t.region),t.country&&e.push(t.country),(t=e.map(e=>e.trim()).filter(e=>!!e).join(", "))&&(r[a].countryRegion=t)}),e.logo&&r.logo.attachFromUrl(e.logo.url,e.logo.mediaType),e.note&&(r.note=e.note),e.company&&(r.organization=e.company);var o=(e,r,o,n)=>{var i="item"+a++;t.push(w.Property.fromJSON([r,{group:i},"text",e])),t.push(w.Property.fromJSON(["xAbLabel",{group:i},"text",n])),i="item"+a++,t.push(w.Property.fromJSON(["impp",{group:i,xServiceType:n},"text",`${o}:${e}`])),t.push(w.Property.fromJSON(["xAbLabel",{group:i},"text",n]))};e.social&&e.social.forEach(e=>{switch(e.type){case T.Messenger:t.push(w.Property.fromJSON(["xSocialprofile",{type:"messenger",xUser:e.value},"text","x-apple:messenger"]));var n="item"+a++;t.push(w.Property.fromJSON(["impp",{group:n,xServiceType:"Facebook"},"text",`xmpp:${e.value}`])),t.push(w.Property.fromJSON(["xAbLabel",{group:n},"text","Facebook"]));break;case T.Twitter:case T.Facebook:case T.LinkedIn:case T.SinaWeibo:(n=function({value:e,type:r}){if(e=e?.trim(),!e.match(/^https?:\/\//im))try{let t=new URL(k[r]);t.pathname=(t.pathname+"/"+e).replace(/[\/\\]+/g,"/"),e=t.toString()}catch{return}return e}(e))&&(r.socialUrls[e.type]=n);break;case T.Jabber:o(e.value,"xJabber","xmpp","Jabber");break;case T.QQ:o(e.value,"xQq","x-apple","QQ");break;case T.GaduGadu:o(e.value,"xGaduGadu","x-apple","GaduGadu")}}),e.website?.company&&(r.workUrl=e.website.company),e.website?.personal&&(r.url=e.website.personal),this.uuid&&(r.uid=this.uuid);var n=w.parse(r.getFormattedString())[0];return t.forEach(e=>n.addProperty(e)),n.toString("3.0").replace(/X-SOCIALPROFILE;CHARSET=UTF-8;/gi,"X-SOCIALPROFILE;").replace(/X-AB-LABEL/gi,"X-ABLabel").replace(/X-SOCIALPROFILE;(TYPE=[^:]*?):/gi,(e,r)=>e.replace(r,r.toLowerCase().replace("type=messenger","type=Messenger"))).replace(/;TYPE=OTHER[^;:]*?([;:])/gi,(e,r)=>r)}}export{P as AddressType,O as PhoneType,T as SocialType};
2
+ //# sourceMappingURL=vcard-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vcard-plugin.js","sources":["../node_modules/vcards-js/lib/vCardFormatter.js","../node_modules/vcards-js/index.js","../node_modules/vcf/lib/property.js","../node_modules/vcf/lib/parse-lines.js","../node_modules/camelcase/index.js","../src/plugins/vcard.ts","../node_modules/vcf/lib/vcard.js","../node_modules/foldline/foldline.js"],"sourcesContent":["/********************************************************************************\n vCards-js, Eric J Nesser, November 2014,\n ********************************************************************************/\n/*jslint node: true */\n'use strict';\n\n/**\n * vCard formatter for formatting vCards in VCF format\n */\n(function vCardFormatter() {\n\tvar majorVersion = '3';\n\n\t/**\n\t * Encode string\n\t * @param {String} value to encode\n\t * @return {String} encoded string\n\t */\n\tfunction e(value) {\n\t\tif (value) {\n\t\t\tif (typeof(value) !== 'string') {\n\t\t\t\tvalue = '' + value;\n\t\t\t}\n\t\t\treturn value.replace(/\\n/g, '\\\\n').replace(/,/g, '\\\\,').replace(/;/g, '\\\\;');\n\t\t}\n\t\treturn '';\n\t}\n\n\t/**\n\t * Return new line characters\n\t * @return {String} new line characters\n\t */\n\tfunction nl() {\n\t\treturn '\\r\\n';\n\t}\n\n\t/**\n\t * Get formatted photo\n\t * @param {String} photoType Photo type (PHOTO, LOGO)\n\t * @param {String} url URL to attach photo from\n\t * @param {String} mediaType Media-type of photo (JPEG, PNG, GIF)\n\t * @return {String} Formatted photo\n\t */\n\tfunction getFormattedPhoto(photoType, url, mediaType, base64) {\n\n\t\tvar params;\n\n\t\tif (majorVersion >= 4) {\n\t\t\tparams = base64 ? ';ENCODING=b;MEDIATYPE=image/' : ';MEDIATYPE=image/';\n\t\t} else if (majorVersion === 3) {\n\t\t\tparams = base64 ? ';ENCODING=b;TYPE=' : ';TYPE=';\n\t\t} else {\n\t\t\tparams = base64 ? ';ENCODING=BASE64;' : ';';\n\t\t}\n\n\t\tvar formattedPhoto = photoType + params + mediaType + ':' + e(url) + nl();\n\t\treturn formattedPhoto;\n\t}\n\n\t/**\n\t * Get formatted address\n\t * @param {object} address\n\t * @param {object} encoding prefix\n\t * @return {String} Formatted address\n\t */\n\tfunction getFormattedAddress(encodingPrefix, address) {\n\n\t\tvar formattedAddress = '';\n\n\t\tif (address.details.label ||\n\t\t\taddress.details.street ||\n\t\t\taddress.details.city ||\n\t\t\taddress.details.stateProvince ||\n\t\t\taddress.details.postalCode ||\n\t\t\taddress.details.countryRegion) {\n\n\t\t\tif (majorVersion >= 4) {\n\t\t\t\tformattedAddress = 'ADR' + encodingPrefix + ';TYPE=' + address.type +\n\t\t\t\t\t(address.details.label ? ';LABEL=\"' + e(address.details.label) + '\"' : '') + ':;;' +\n\t\t\t\t\te(address.details.street) + ';' +\n\t\t\t\t\te(address.details.city) + ';' +\n\t\t\t\t\te(address.details.stateProvince) + ';' +\n\t\t\t\t\te(address.details.postalCode) + ';' +\n\t\t\t\t\te(address.details.countryRegion) + nl();\n\t\t\t} else {\n\t\t\t\tif (address.details.label) {\n\t\t\t\t\tformattedAddress = 'LABEL' + encodingPrefix + ';TYPE=' + address.type + ':' + e(address.details.label) + nl();\n\t\t\t\t}\n\t\t\t\tformattedAddress += 'ADR' + encodingPrefix + ';TYPE=' + address.type + ':;;' +\n\t\t\t\t\te(address.details.street) + ';' +\n\t\t\t\t\te(address.details.city) + ';' +\n\t\t\t\t\te(address.details.stateProvince) + ';' +\n\t\t\t\t\te(address.details.postalCode) + ';' +\n\t\t\t\t\te(address.details.countryRegion) + nl();\n\n\t\t\t}\n\t\t}\n\n\t\treturn formattedAddress;\n\t}\n\n\t/**\n\t * Convert date to YYYYMMDD format\n\t * @param {Date} date to encode\n\t * @return {String} encoded date\n\t */\n\tfunction YYYYMMDD(date) {\n\t\treturn date.getFullYear() + ('0' + (date.getMonth()+1)).slice(-2) + ('0' + date.getDate()).slice(-2);\n\t}\n\n\tmodule.exports = {\n\n\t\t/**\n\t\t * Get formatted vCard in VCF format\n\t\t * @param {object} vCard object\n\t\t * @return {String} Formatted vCard in VCF format\n\t\t */\n\t\tgetFormattedString: function(vCard) {\n\n\t\t\tmajorVersion = vCard.getMajorVersion();\n\n\t\t\tvar formattedVCardString = '';\n\t\t\tformattedVCardString += 'BEGIN:VCARD' + nl();\n\t\t\tformattedVCardString += 'VERSION:' + vCard.version + nl();\n\n\t\t\tvar encodingPrefix = majorVersion >= 4 ? '' : ';CHARSET=UTF-8';\n\t\t\tvar formattedName = vCard.formattedName;\n\n\t\t\tif (!formattedName) {\n\t\t\t\tformattedName = '';\n\n\t\t\t\t[vCard.firstName, vCard.middleName, vCard.lastName]\n\t\t\t\t\t.forEach(function(name) {\n\t\t\t\t\t\tif (name) {\n\t\t\t\t\t\t\tif (formattedName) {\n\t\t\t\t\t\t\t\tformattedName += ' ';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tformattedName += name;\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\tformattedVCardString += 'FN' + encodingPrefix + ':' + e(formattedName) + nl();\n\t\t\tformattedVCardString += 'N' + encodingPrefix + ':' +\n\t\t\t\te(vCard.lastName) + ';' +\n\t\t\t\te(vCard.firstName) + ';' +\n\t\t\t\te(vCard.middleName) + ';' +\n\t\t\t\te(vCard.namePrefix) + ';' +\n\t\t\t\te(vCard.nameSuffix) + nl();\n\n\t\t\tif (vCard.nickname && majorVersion >= 3) {\n\t\t\t\tformattedVCardString += 'NICKNAME' + encodingPrefix + ':' + e(vCard.nickname) + nl();\n\t\t\t}\n\n\t\t\tif (vCard.gender) {\n\t\t\t\tformattedVCardString += 'GENDER:' + e(vCard.gender) + nl();\n\t\t\t}\n\n\t\t\tif (vCard.uid) {\n\t\t\t\tformattedVCardString += 'UID' + encodingPrefix + ':' + e(vCard.uid) + nl();\n\t\t\t}\n\n\t\t\tif (vCard.birthday) {\n\t\t\t\tformattedVCardString += 'BDAY:' + YYYYMMDD(vCard.birthday) + nl();\n\t\t\t}\n\n\t\t\tif (vCard.anniversary) {\n\t\t\t\tformattedVCardString += 'ANNIVERSARY:' + YYYYMMDD(vCard.anniversary) + nl();\n\t\t\t}\n\n\t\t\tif (vCard.email) {\n\t\t\t\tif(!Array.isArray(vCard.email)){\n\t\t\t\t\tvCard.email = [vCard.email];\n\t\t\t\t}\n\t\t\t\tvCard.email.forEach(\n\t\t\t\t\tfunction(address) {\n\t\t\t\t\t\tif (majorVersion >= 4) {\n\t\t\t\t\t\t\tformattedVCardString += 'EMAIL' + encodingPrefix + ';type=HOME:' + e(address) + nl();\n\t\t\t\t\t\t} else if (majorVersion >= 3 && majorVersion < 4) {\n\t\t\t\t\t\t\tformattedVCardString += 'EMAIL' + encodingPrefix + ';type=HOME,INTERNET:' + e(address) + nl();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tformattedVCardString += 'EMAIL' + encodingPrefix + ';HOME;INTERNET:' + e(address) + nl();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (vCard.workEmail) {\n\t\t\t\tif(!Array.isArray(vCard.workEmail)){\n\t\t\t\t\tvCard.workEmail = [vCard.workEmail];\n\t\t\t\t}\n\t\t\t\tvCard.workEmail.forEach(\n\t\t\t\t\tfunction(address) {\n\t\t\t\t\t\tif (majorVersion >= 4) {\n\t\t\t\t\t\t\tformattedVCardString += 'EMAIL' + encodingPrefix + ';type=WORK:' + e(address) + nl();\n\t\t\t\t\t\t} else if (majorVersion >= 3 && majorVersion < 4) {\n\t\t\t\t\t\t\tformattedVCardString += 'EMAIL' + encodingPrefix + ';type=WORK,INTERNET:' + e(address) + nl();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tformattedVCardString += 'EMAIL' + encodingPrefix + ';WORK;INTERNET:' + e(address) + nl();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (vCard.otherEmail) {\n\t\t\t\tif(!Array.isArray(vCard.otherEmail)){\n\t\t\t\t\tvCard.otherEmail = [vCard.otherEmail];\n\t\t\t\t}\n\t\t\t\tvCard.otherEmail.forEach(\n\t\t\t\t\tfunction(address) {\n\t\t\t\t\t\tif (majorVersion >= 4) {\n\t\t\t\t\t\t\tformattedVCardString += 'EMAIL' + encodingPrefix + ';type=OTHER:' + e(address) + nl();\n\t\t\t\t\t\t} else if (majorVersion >= 3 && majorVersion < 4) {\n\t\t\t\t\t\t\tformattedVCardString += 'EMAIL' + encodingPrefix + ';type=OTHER,INTERNET:' + e(address) + nl();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tformattedVCardString += 'EMAIL' + encodingPrefix + ';OTHER;INTERNET:' + e(address) + nl();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (vCard.logo.url) {\n\t\t\t\tformattedVCardString += getFormattedPhoto('LOGO', vCard.logo.url, vCard.logo.mediaType, vCard.logo.base64);\n\t\t\t}\n\n\t\t\tif (vCard.photo.url) {\n\t\t\t\tformattedVCardString += getFormattedPhoto('PHOTO', vCard.photo.url, vCard.photo.mediaType, vCard.photo.base64);\n\t\t\t}\n\n\t\t\tif (vCard.cellPhone) {\n\t\t\t\tif(!Array.isArray(vCard.cellPhone)){\n\t\t\t\t\tvCard.cellPhone = [vCard.cellPhone];\n\t\t\t\t}\n\t\t\t\tvCard.cellPhone.forEach(\n\t\t\t\t\tfunction(number){\n\t\t\t\t\t\tif (majorVersion >= 4) {\n\t\t\t\t\t\t\tformattedVCardString += 'TEL;VALUE=uri;TYPE=\"voice,cell\":tel:' + e(number) + nl();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tformattedVCardString += 'TEL;TYPE=CELL:' + e(number) + nl();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (vCard.pagerPhone) {\n\t\t\t\tif(!Array.isArray(vCard.pagerPhone)){\n\t\t\t\t\tvCard.pagerPhone = [vCard.pagerPhone];\n\t\t\t\t}\n\t\t\t\tvCard.pagerPhone.forEach(\n\t\t\t\t\tfunction(number) {\n\t\t\t\t\t\tif (majorVersion >= 4) {\n\t\t\t\t\t\t\tformattedVCardString += 'TEL;VALUE=uri;TYPE=\"pager,cell\":tel:' + e(number) + nl();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tformattedVCardString += 'TEL;TYPE=PAGER:' + e(number) + nl();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (vCard.homePhone) {\n\t\t\t\tif(!Array.isArray(vCard.homePhone)){\n\t\t\t\t\tvCard.homePhone = [vCard.homePhone];\n\t\t\t\t}\n\t\t\t\tvCard.homePhone.forEach(\n\t\t\t\t\tfunction(number) {\n\t\t\t\t\t\tif (majorVersion >= 4) {\n\t\t\t\t\t\t\tformattedVCardString += 'TEL;VALUE=uri;TYPE=\"voice,home\":tel:' + e(number) + nl();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tformattedVCardString += 'TEL;TYPE=HOME,VOICE:' + e(number) + nl();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (vCard.workPhone) {\n\t\t\t\tif(!Array.isArray(vCard.workPhone)){\n\t\t\t\t\tvCard.workPhone = [vCard.workPhone];\n\t\t\t\t}\n\t\t\t\tvCard.workPhone.forEach(\n\t\t\t\t\tfunction(number) {\n\t\t\t\t\t\tif (majorVersion >= 4) {\n\t\t\t\t\t\t\tformattedVCardString += 'TEL;VALUE=uri;TYPE=\"voice,work\":tel:' + e(number) + nl();\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tformattedVCardString += 'TEL;TYPE=WORK,VOICE:' + e(number) + nl();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (vCard.homeFax) {\n\t\t\t\tif(!Array.isArray(vCard.homeFax)){\n\t\t\t\t\tvCard.homeFax = [vCard.homeFax];\n\t\t\t\t}\n\t\t\t\tvCard.homeFax.forEach(\n\t\t\t\t\tfunction(number) {\n\t\t\t\t\t\tif (majorVersion >= 4) {\n\t\t\t\t\t\t\tformattedVCardString += 'TEL;VALUE=uri;TYPE=\"fax,home\":tel:' + e(number) + nl();\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tformattedVCardString += 'TEL;TYPE=HOME,FAX:' + e(number) + nl();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (vCard.workFax) {\n\t\t\t\tif(!Array.isArray(vCard.workFax)){\n\t\t\t\t\tvCard.workFax = [vCard.workFax];\n\t\t\t\t}\n\t\t\t\tvCard.workFax.forEach(\n\t\t\t\t\tfunction(number) {\n\t\t\t\t\t\tif (majorVersion >= 4) {\n\t\t\t\t\t\t\tformattedVCardString += 'TEL;VALUE=uri;TYPE=\"fax,work\":tel:' + e(number) + nl();\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tformattedVCardString += 'TEL;TYPE=WORK,FAX:' + e(number) + nl();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (vCard.otherPhone) {\n\t\t\t\tif(!Array.isArray(vCard.otherPhone)){\n\t\t\t\t\tvCard.otherPhone = [vCard.otherPhone];\n\t\t\t\t}\n\t\t\t\tvCard.otherPhone.forEach(\n\t\t\t\t\tfunction(number) {\n\t\t\t\t\t\tif (majorVersion >= 4) {\n\t\t\t\t\t\t\tformattedVCardString += 'TEL;VALUE=uri;TYPE=\"voice,other\":tel:' + e(number) + nl();\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tformattedVCardString += 'TEL;TYPE=OTHER:' + e(number) + nl();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t[{\n\t\t\t\tdetails: vCard.homeAddress,\n\t\t\t\ttype: 'HOME'\n\t\t\t}, {\n\t\t\t\tdetails: vCard.workAddress,\n\t\t\t\ttype: 'WORK'\n\t\t\t}].forEach(\n\t\t\t\tfunction(address) {\n\t\t\t\t\tformattedVCardString += getFormattedAddress(encodingPrefix, address);\n\t\t\t\t}\n\t\t\t);\n\n\t\t\tif (vCard.title) {\n\t\t\t\tformattedVCardString += 'TITLE' + encodingPrefix + ':' + e(vCard.title) + nl();\n\t\t\t}\n\n\t\t\tif (vCard.role) {\n\t\t\t\tformattedVCardString += 'ROLE' + encodingPrefix + ':' + e(vCard.role) + nl();\n\t\t\t}\n\n\t\t\tif (vCard.organization) {\n\t\t\t\tformattedVCardString += 'ORG' + encodingPrefix + ':' + e(vCard.organization) + nl();\n\t\t\t}\n\n\t\t\tif (vCard.url) {\n\t\t\t\tformattedVCardString += 'URL' + encodingPrefix + ':' + e(vCard.url) + nl();\n\t\t\t}\n\n\t\t\tif (vCard.workUrl) {\n\t\t\t\tformattedVCardString += 'URL;type=WORK' + encodingPrefix + ':' + e(vCard.workUrl) + nl();\n\t\t\t}\n\n\t\t\tif (vCard.note) {\n\t\t\t\tformattedVCardString += 'NOTE' + encodingPrefix + ':' + e(vCard.note) + nl();\n\t\t\t}\n\n\t\t\tif (vCard.socialUrls) {\n\t\t\t\tfor (var key in vCard.socialUrls) {\n\t\t\t\t\tif (vCard.socialUrls.hasOwnProperty(key) &&\n\t\t\t\t\t\tvCard.socialUrls[key]) {\n\t\t\t\t\t\tformattedVCardString += 'X-SOCIALPROFILE' + encodingPrefix + ';TYPE=' + key + ':' + e(vCard.socialUrls[key]) + nl();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (vCard.source) {\n\t\t\t\tformattedVCardString += 'SOURCE' + encodingPrefix + ':' + e(vCard.source) + nl();\n\t\t\t}\n\n\t\t\tformattedVCardString += 'REV:' + (new Date()).toISOString() + nl();\n\t\t\t\n\t\t\tif (vCard.isOrganization) {\n\t\t\t\tformattedVCardString += 'X-ABShowAs:COMPANY' + nl();\n\t\t\t} \n\t\t\t\n\t\t\tformattedVCardString += 'END:VCARD' + nl();\n\t\t\treturn formattedVCardString;\n\t\t}\n\t};\n})();","/********************************************************************************\n vCards-js, Eric J Nesser, November 2014\n********************************************************************************/\n/*jslint node: true */\n'use strict';\n\n/**\n * Represents a contact that can be imported into Outlook, iOS, Mac OS, Android devices, and more\n */\nvar vCard = (function () {\n /**\n * Get photo object for storing photos in vCards\n */\n function getPhoto() {\n return {\n url: '',\n mediaType: '',\n base64: false,\n\n /**\n * Attach a photo from a URL\n * @param {string} url URL where photo can be found\n * @param {string} mediaType Media type of photo (JPEG, PNG, GIF)\n */\n attachFromUrl: function(url, mediaType) {\n this.url = url;\n this.mediaType = mediaType;\n this.base64 = false;\n },\n\n /**\n * Embed a photo from a file using base-64 encoding (not implemented yet)\n * @param {string} filename\n */\n embedFromFile: function(fileLocation) {\n var fs = require('fs');\n var path = require('path');\n this.mediaType = path.extname(fileLocation).toUpperCase().replace(/\\./g, \"\");\n var imgData = fs.readFileSync(fileLocation);\n this.url = imgData.toString('base64');\n this.base64 = true;\n },\n\n /**\n * Embed a photo from a base-64 string\n * @param {string} base64String\n */\n embedFromString: function(base64String, mediaType) {\n this.mediaType = mediaType;\n this.url = base64String;\n this.base64 = true;\n }\n };\n }\n\n /**\n * Get a mailing address to attach to a vCard.\n */\n function getMailingAddress() {\n return {\n /**\n * Represents the actual text that should be put on the mailing label when delivering a physical package\n * @type {String}\n */\n label: '',\n\n /**\n * Street address\n * @type {String}\n */\n street: '',\n\n /**\n * City\n * @type {String}\n */\n city: '',\n\n /**\n * State or province\n * @type {String}\n */\n stateProvince: '',\n\n /**\n * Postal code\n * @type {String}\n */\n postalCode: '',\n\n /**\n * Country or region\n * @type {String}\n */\n countryRegion: ''\n };\n }\n\n /**\n * Get social media URLs\n * @return {object} Social media URL hash group\n */\n function getSocialUrls() {\n return {\n 'facebook': '',\n 'linkedIn': '',\n 'twitter': '',\n 'flickr': ''\n };\n }\n\n /********************************************************************************\n * Public interface for vCard\n ********************************************************************************/\n return {\n\n /**\n * Specifies a value that represents a persistent, globally unique identifier associated with the vCard\n * @type {String}\n */\n uid: '',\n\n /**\n * Date of birth\n * @type {Datetime}\n */\n birthday: '',\n\n /**\n * Cell phone number\n * @type {String}\n */\n cellPhone: '',\n\n /**\n * Other cell phone number or pager\n * @type {String}\n */\n pagerPhone: '',\n\n /**\n * The address for private electronic mail communication\n * @type {String}\n */\n email: '',\n\n /**\n * The address for work-related electronic mail communication\n * @type {String}\n */\n workEmail: '',\n\n /**\n * First name\n * @type {String}\n */\n firstName: '',\n\n /**\n * Formatted name string associated with the vCard object (will automatically populate if not set)\n * @type {String}\n */\n formattedName: '',\n\n /**\n * Gender.\n * @type {String} Must be M or F for Male or Female\n */\n gender: '',\n\n /**\n * Home mailing address\n * @type {object}\n */\n homeAddress: getMailingAddress(),\n\n /**\n * Home phone\n * @type {String}\n */\n homePhone: '',\n\n /**\n * Home facsimile\n * @type {String}\n */\n homeFax: '',\n\n /**\n * Last name\n * @type {String}\n */\n lastName: '',\n\n /**\n * Logo\n * @type {object}\n */\n logo: getPhoto(),\n\n /**\n * Middle name\n * @type {String}\n */\n middleName: '',\n\n /**\n * Prefix for individual's name\n * @type {String}\n */\n namePrefix: '',\n\n /**\n * Suffix for individual's name\n * @type {String}\n */\n nameSuffix: '',\n\n /**\n * Nickname of individual\n * @type {String}\n */\n nickname: '',\n\n /**\n * Specifies supplemental information or a comment that is associated with the vCard\n * @type {String}\n */\n note: '',\n\n /**\n * The name and optionally the unit(s) of the organization associated with the vCard object\n * @type {String}\n */\n organization: '',\n\n /**\n * Individual's photo\n * @type {object}\n */\n photo: getPhoto(),\n\n /**\n * The role, occupation, or business category of the vCard object within an organization\n * @type {String}\n */\n role: '',\n\n /**\n * Social URLs attached to the vCard object (ex: Facebook, Twitter, LinkedIn)\n * @type {String}\n */\n socialUrls: getSocialUrls(),\n\n /**\n * A URL that can be used to get the latest version of this vCard\n * @type {String}\n */\n source: '',\n\n /**\n * Specifies the job title, functional position or function of the individual within an organization\n * @type {String}\n */\n title: '',\n\n /**\n * URL pointing to a website that represents the person in some way\n * @type {String}\n */\n url: '',\n\n /**\n * URL pointing to a website that represents the person's work in some way\n * @type {String}\n */\n workUrl: '',\n\n /**\n * Work mailing address\n * @type {object}\n */\n workAddress: getMailingAddress(),\n\n /**\n * Work phone\n * @type {String}\n */\n workPhone: '',\n\n /**\n * Work facsimile\n * @type {String}\n */\n workFax: '',\n\n /**\n * vCard version\n * @type {String}\n */\n version: '3.0',\n\n /**\n * Get major version of the vCard format\n * @return {integer}\n */\n getMajorVersion: function() {\n var majorVersionString = this.version ? this.version.split('.')[0] : '4';\n if (!isNaN(majorVersionString)) {\n return parseInt(majorVersionString);\n }\n return 4;\n },\n\n /**\n * Get formatted vCard\n * @return {String} Formatted vCard in VCF format\n */\n getFormattedString: function() {\n var vCardFormatter = require('./lib/vCardFormatter');\n return vCardFormatter.getFormattedString(this);\n },\n\n /**\n * Save formatted vCard to file\n * @param {String} filename\n */\n saveToFile: function(filename) {\n var vCardFormatter = require('./lib/vCardFormatter');\n var contents = vCardFormatter.getFormattedString(this);\n\n var fs = require('fs');\n fs.writeFileSync(filename, contents, { encoding: 'utf8' });\n }\n };\n});\n\nmodule.exports = vCard;\n","/**\n * vCard Property\n * @constructor\n * @memberOf vCard\n * @param {String} field\n * @param {String} value\n * @param {Object} params\n * @return {Property}\n */\nfunction Property( field, value, params ) {\n\n if( !(this instanceof Property) )\n return new Property( value )\n\n if( params != null )\n Object.assign( this, params )\n\n this._field = field\n this._data = value\n\n Object.defineProperty( this, '_field', { enumerable: false })\n Object.defineProperty( this, '_data', { enumerable: false })\n\n}\n\n/**\n * Constructs a vCard.Property from jCard data\n * @param {Array} data\n * @return {Property}\n */\nProperty.fromJSON = function( data ) {\n\n var field = data[0]\n var params = data[1]\n\n if( !/text/i.test( data[2] ) )\n params.value = data[2]\n\n var value = Array.isArray( data[3] ) ?\n data[3].join( ';' ) : data[3]\n\n return new Property( field, value, params )\n\n}\n\n/**\n * Turn a string into capitalized dash-case\n * @internal used by `Property#toString()`\n * @param {String} value\n * @return {String}\n * @ignore\n */\nfunction capitalDashCase( value ) {\n return value.replace( /([A-Z])/g, '-$1' ).toUpperCase()\n}\n\n/**\n * Property prototype\n * @type {Object}\n */\nProperty.prototype = {\n\n constructor: Property,\n\n /**\n * Check whether the property is of a given type\n * @param {String} type\n * @return {Boolean}\n */\n is: function( type ) {\n type = ( type + '' ).toLowerCase()\n return Array.isArray( this.type ) ?\n this.type.indexOf( type ) >= 0 :\n this.type === type\n },\n\n /**\n * Check whether the property is empty\n * @return {Boolean}\n */\n isEmpty: function() {\n return this._data == null &&\n Object.keys( this ).length === 0\n },\n\n /**\n * Clone the property\n * @return {Property}\n */\n clone: function() {\n return new Property( this._field, this._data, this )\n },\n\n /**\n * Format the property as vcf with given version\n * @param {String} version\n * @return {String}\n */\n toString: function( version ) {\n\n var propName = (this.group ? this.group + '.' : '') + capitalDashCase( this._field )\n var keys = Object.keys( this )\n var params = []\n\n for( var i = 0; i < keys.length; i++ ) {\n if (keys[i] === 'group') continue\n\n switch (propName) {\n case 'TEL':\n case 'ADR':\n case 'EMAIL':\n if (version === '2.1') {\n if (Array.isArray(this[keys[i]]))\n params.push(this[keys[i]].join(';'))\n else\n params.push(this[keys[i]])\n }\n else\n params.push(capitalDashCase(keys[i]) + '=' + this[keys[i]])\n break\n default:\n params.push(capitalDashCase(keys[i]) + '=' + this[keys[i]])\n }\n }\n\n if (version === '2.1' || version === '3.0')\n return propName +\n ( params.length ? ';' + params.join( ';' ).toUpperCase() : params.toString().toUpperCase() ) + ':' +\n ( Array.isArray( this._data ) ? this._data.join( ';' ) : this._data )\n else\n return propName +\n ( params.length ? ';' + params.join( ';' ) : params ) + ':' +\n ( Array.isArray( this._data ) ? this._data.join( ';' ) : this._data )\n\n },\n\n /**\n * Get the property's value\n * @return {String}\n */\n valueOf: function() {\n return this._data\n },\n\n /**\n * Format the property as jCard data\n * @return {Array}\n */\n toJSON: function() {\n\n var params = Object.assign({},this)\n\n if( params.value === 'text' ) {\n params.value = void 0\n delete params.value\n }\n\n var data = [ this._field, params, this.value || 'text' ]\n\n switch( this._field ) {\n default: data.push( this._data ); break\n case 'adr':\n case 'n':\n data.push( this._data.split( ';' ) )\n }\n\n return data\n\n },\n\n}\n\n// Exports\nmodule.exports = Property\n","var camelCase = require( 'camelcase' )\nvar Property = require( './property' )\n\nfunction set( object, key, value ) {\n if( Array.isArray( object[ key ] ) ) {\n object[ key ].push( value )\n } else if( object[ key ] != null ) {\n object[ key ] = [ object[ key ], value ]\n } else {\n object[ key ] = value\n }\n}\n\nfunction createParams( params, param ) {\n\n var parts = param.split( '=' )\n var k = camelCase( parts[0] )\n var value = parts[1]\n\n if( value == null || value === '' ) {\n value = parts[0]\n k = 'type'\n }\n\n if( k === 'type' ) {\n\n if (value[ 0 ] === '\"' && value[ value.length - 1 ] === '\"' && value.indexOf(',') !== -1)\n value = value.slice(1, -1)\n value.toLowerCase().split( ',' ).forEach( function( value ) {\n set( params, k, value )\n })\n\n return params\n\n }\n\n set( params, k, value )\n\n return params\n\n}\n\nfunction parseLines( lines ) {\n\n var data = {}\n\n // NOTE: Line format:\n // PROPERTY[;PARAMETER[=VALUE]]:Attribute[;Attribute]\n var line = null\n var pattern = /^([^;:]+)((?:;(?:[^;:]+))*)(?:\\:([\\s\\S]+))?$/i\n var len = lines.length - 1\n\n for( var i = 1; i < len; i++ ) {\n\n line = lines[i]\n\n var match = pattern.exec( line )\n if( !match ) continue;\n\n var name = match[1].split('.')\n var property = name.pop()\n var group = name.pop()\n var value = match[3]\n var params = match[2] ?\n match[2].replace( /^;|;$/g, '' ).split( ';' ) : []\n\n var propParams = params.reduce( createParams, group ? { group: group } : {})\n var propName = camelCase( property )\n var propVal = new Property( propName, value, propParams )\n\n set( data, propName, propVal )\n\n }\n\n return data\n\n}\n\nmodule.exports = parseLines\n","'use strict';\n\nconst preserveCamelCase = string => {\n\tlet isLastCharLower = false;\n\tlet isLastCharUpper = false;\n\tlet isLastLastCharUpper = false;\n\n\tfor (let i = 0; i < string.length; i++) {\n\t\tconst character = string[i];\n\n\t\tif (isLastCharLower && /[a-zA-Z]/.test(character) && character.toUpperCase() === character) {\n\t\t\tstring = string.slice(0, i) + '-' + string.slice(i);\n\t\t\tisLastCharLower = false;\n\t\t\tisLastLastCharUpper = isLastCharUpper;\n\t\t\tisLastCharUpper = true;\n\t\t\ti++;\n\t\t} else if (isLastCharUpper && isLastLastCharUpper && /[a-zA-Z]/.test(character) && character.toLowerCase() === character) {\n\t\t\tstring = string.slice(0, i - 1) + '-' + string.slice(i - 1);\n\t\t\tisLastLastCharUpper = isLastCharUpper;\n\t\t\tisLastCharUpper = false;\n\t\t\tisLastCharLower = true;\n\t\t} else {\n\t\t\tisLastCharLower = character.toLowerCase() === character && character.toUpperCase() !== character;\n\t\t\tisLastLastCharUpper = isLastCharUpper;\n\t\t\tisLastCharUpper = character.toUpperCase() === character && character.toLowerCase() !== character;\n\t\t}\n\t}\n\n\treturn string;\n};\n\nconst camelCase = (input, options) => {\n\tif (!(typeof input === 'string' || Array.isArray(input))) {\n\t\tthrow new TypeError('Expected the input to be `string | string[]`');\n\t}\n\n\toptions = Object.assign({\n\t\tpascalCase: false\n\t}, options);\n\n\tconst postProcess = x => options.pascalCase ? x.charAt(0).toUpperCase() + x.slice(1) : x;\n\n\tif (Array.isArray(input)) {\n\t\tinput = input.map(x => x.trim())\n\t\t\t.filter(x => x.length)\n\t\t\t.join('-');\n\t} else {\n\t\tinput = input.trim();\n\t}\n\n\tif (input.length === 0) {\n\t\treturn '';\n\t}\n\n\tif (input.length === 1) {\n\t\treturn options.pascalCase ? input.toUpperCase() : input.toLowerCase();\n\t}\n\n\tconst hasUpperCase = input !== input.toLowerCase();\n\n\tif (hasUpperCase) {\n\t\tinput = preserveCamelCase(input);\n\t}\n\n\tinput = input\n\t\t.replace(/^[_.\\- ]+/, '')\n\t\t.toLowerCase()\n\t\t.replace(/[_.\\- ]+(\\w|$)/g, (_, p1) => p1.toUpperCase())\n\t\t.replace(/\\d+(\\w|$)/g, m => m.toUpperCase());\n\n\treturn postProcess(input);\n};\n\nmodule.exports = camelCase;\n// TODO: Remove this for the next major release\nmodule.exports.default = camelCase;\n","import VCard from 'vcards-js'\r\nimport vcf from 'vcf'\r\nimport { Options, Plugin } from '../utils/options.js'\r\n\r\nexport interface Address {\r\n streetAddress?: string\r\n locality?: string\r\n postalCode?: string\r\n stateProvince?: string\r\n region?: string\r\n country?: string\r\n}\r\n\r\nexport enum AddressType {\r\n Home = 'home',\r\n Work = 'work'\r\n}\r\n\r\nexport enum PhoneType {\r\n Home = 'home',\r\n Work = 'work',\r\n Cell = 'cell',\r\n Pager = 'pager'\r\n}\r\n\r\nexport enum SocialType {\r\n Messenger = 'messenger',\r\n Twitter = 'twitter',\r\n Facebook = 'facebook',\r\n LinkedIn = 'linkedin',\r\n SinaWeibo = 'weibo',\r\n Jabber = 'jabber',\r\n QQ = 'qq',\r\n GaduGadu = 'gadu-gadu'\r\n}\r\n\r\nexport interface Image {\r\n /** URL where photo can be found */\r\n url: string\r\n /** the media type */\r\n mediaType: string\r\n}\r\n\r\nexport interface VCardPluginOptions {\r\n data: {\r\n fullName: string\r\n name?: {\r\n first?: string\r\n last?: string\r\n middle?: string\r\n prefix?: string\r\n suffix?: string\r\n nick?: string\r\n }\r\n title?: string\r\n birthday?: Date\r\n photo?: Image\r\n phone?: Array<{ type?: `${PhoneType}`, value: string }>\r\n email?: Array<{ type?: `${AddressType}`, value: string }>\r\n\r\n address?: {\r\n work?: Address\r\n home?: Address\r\n }\r\n\r\n logo?: Image\r\n note?: string\r\n company?: string\r\n social?: Array<{ type: `${SocialType}`, value: string }>\r\n\r\n website?: {\r\n personal?: string\r\n company?: string\r\n }\r\n }\r\n}\r\n\r\nexport default class VCardPlugin implements Plugin {\r\n\r\n constructor(\r\n private readonly pluginOptions: VCardPluginOptions,\r\n private readonly uuid?: string\r\n ) { }\r\n\r\n configure(options: Options): Options | undefined | void {\r\n options.data = this.generateVCard()\r\n return options\r\n }\r\n\r\n private generateVCard() {\r\n const { data } = this.pluginOptions\r\n const card = VCard()\r\n card.version = '3.0'\r\n\r\n card.formattedName = data.fullName\r\n\r\n const extraProps = new Array<vcf.Property>()\r\n let groupCounter = 1\r\n const getGroup = () => `item${groupCounter++}`\r\n\r\n if (data.name) {\r\n const n = data.name\r\n if (n.first)\r\n card.firstName = n.first\r\n if (n.last)\r\n card.lastName = n.last\r\n if (n.middle)\r\n card.middleName = n.middle\r\n if (n.nick) {\r\n card.nickname = n.nick\r\n extraProps.push(vcf.Property.fromJSON([\r\n 'xAndroidCustom',\r\n {},\r\n 'text',\r\n ['vnd.android.cursor.item/nickname', n.nick, '1', '', '', '', '', '', '', '', '', '', '', '', '', '']\r\n ]))\r\n }\r\n if (n.prefix)\r\n card.namePrefix = n.prefix\r\n if (n.suffix)\r\n card.nameSuffix = n.suffix\r\n }\r\n\r\n if (data.title)\r\n card.title = data.title\r\n\r\n if (data.birthday)\r\n card.birthday = data.birthday\r\n\r\n if (data.photo)\r\n card.photo.attachFromUrl(data.photo.url, data.photo.mediaType)\r\n\r\n data.phone?.forEach(el => {\r\n let key: 'workPhone' | 'cellPhone' | 'pagerPhone' | 'homePhone' | 'otherPhone' = 'otherPhone'\r\n switch (el.type) {\r\n case PhoneType.Work:\r\n key = 'workPhone'\r\n break\r\n\r\n case PhoneType.Cell:\r\n key = 'cellPhone'\r\n break\r\n\r\n case PhoneType.Pager:\r\n key = 'pagerPhone'\r\n break\r\n\r\n case PhoneType.Home:\r\n key = 'homePhone'\r\n break\r\n }\r\n const v = card[key]\r\n if (Array.isArray(v))\r\n v.push(el.value)\r\n else\r\n card[key] = [el.value]\r\n })\r\n\r\n data.email?.forEach(el => {\r\n let key: 'workEmail' | 'email' | 'otherEmail' = 'otherEmail'\r\n switch (el.type) {\r\n case AddressType.Work:\r\n key = 'workEmail'\r\n break\r\n\r\n case AddressType.Home:\r\n key = 'email'\r\n break\r\n }\r\n const v = card[key]\r\n if (Array.isArray(v))\r\n v.push(el.value)\r\n else\r\n card[key] = [el.value]\r\n })\r\n\r\n if (data.address) {\r\n Object.entries(data.address).forEach(([k, v]) => {\r\n let key: 'workAddress' | 'homeAddress' = 'homeAddress'\r\n switch (k) {\r\n case 'home':\r\n key = 'homeAddress'\r\n break\r\n\r\n case 'work':\r\n key = 'workAddress'\r\n break\r\n }\r\n if (v.streetAddress)\r\n card[key].street = v.streetAddress\r\n if (v.locality)\r\n card[key].city = v.locality\r\n if (v.postalCode)\r\n card[key].postalCode = v.postalCode\r\n if (v.stateProvince)\r\n card[key].stateProvince = v.stateProvince\r\n\r\n const cr = new Array<string>()\r\n if (v.region)\r\n cr.push(v.region)\r\n\r\n if (v.country)\r\n cr.push(v.country)\r\n\r\n const countryRegion = cr\r\n .map(p => p.trim())\r\n .filter(p => !!p)\r\n .join(', ')\r\n\r\n if (countryRegion)\r\n card[key].countryRegion = countryRegion\r\n })\r\n }\r\n\r\n if (data.logo)\r\n card.logo.attachFromUrl(data.logo.url, data.logo.mediaType)\r\n\r\n if (data.note)\r\n card.note = data.note\r\n\r\n if (data.company)\r\n card.organization = data.company\r\n\r\n const pushMsgProtocol = (username: string, type: string, protocol: string, service: string) => {\r\n let group = getGroup()\r\n extraProps.push(vcf.Property.fromJSON([\r\n type,\r\n {\r\n group\r\n },\r\n 'text',\r\n username\r\n ]))\r\n extraProps.push(vcf.Property.fromJSON([\r\n 'xAbLabel',\r\n {\r\n group\r\n },\r\n 'text',\r\n service\r\n ]))\r\n\r\n group = getGroup()\r\n extraProps.push(vcf.Property.fromJSON([\r\n 'impp',\r\n {\r\n group,\r\n xServiceType: service\r\n },\r\n 'text',\r\n `${protocol}:${username}`\r\n ]))\r\n extraProps.push(vcf.Property.fromJSON([\r\n 'xAbLabel',\r\n {\r\n group\r\n },\r\n 'text',\r\n service\r\n ]))\r\n }\r\n\r\n if (data.social)\r\n data.social.forEach((v) => {\r\n switch (v.type) {\r\n case SocialType.Messenger:\r\n extraProps.push(vcf.Property.fromJSON([\r\n 'xSocialprofile',\r\n {\r\n type: 'messenger',\r\n xUser: v.value\r\n },\r\n 'text',\r\n 'x-apple:messenger'\r\n ]))\r\n const group = getGroup()\r\n extraProps.push(vcf.Property.fromJSON([\r\n 'impp',\r\n {\r\n group,\r\n xServiceType: 'Facebook'\r\n },\r\n 'text',\r\n `xmpp:${v.value}`\r\n ]))\r\n extraProps.push(vcf.Property.fromJSON([\r\n 'xAbLabel',\r\n {\r\n group\r\n },\r\n 'text',\r\n 'Facebook'\r\n ]))\r\n break\r\n\r\n case SocialType.Twitter:\r\n case SocialType.Facebook:\r\n case SocialType.LinkedIn:\r\n case SocialType.SinaWeibo:\r\n const surl = getSocialUrl(v)\r\n if (surl)\r\n card.socialUrls[v.type] = surl\r\n break\r\n\r\n case SocialType.Jabber:\r\n pushMsgProtocol(v.value, 'xJabber', 'xmpp', 'Jabber')\r\n break\r\n\r\n case SocialType.QQ:\r\n pushMsgProtocol(v.value, 'xQq', 'x-apple', 'QQ')\r\n break\r\n\r\n case SocialType.GaduGadu:\r\n pushMsgProtocol(v.value, 'xGaduGadu', 'x-apple', 'GaduGadu')\r\n break\r\n }\r\n })\r\n\r\n if (data.website?.company)\r\n card.workUrl = data.website.company\r\n\r\n if (data.website?.personal)\r\n card.url = data.website.personal\r\n\r\n if (this.uuid)\r\n card.uid = this.uuid\r\n\r\n const parsed = vcf.parse(card.getFormattedString())[0]\r\n extraProps.forEach(prop => parsed.addProperty(prop))\r\n\r\n return parsed.toString('3.0')\r\n .replace(/X-SOCIALPROFILE;CHARSET=UTF-8;/gi, 'X-SOCIALPROFILE;')\r\n .replace(/X-AB-LABEL/gi, 'X-ABLabel')\r\n .replace(/X-SOCIALPROFILE;(TYPE=[^:]*?):/gi, (tx, m) => tx.replace(m, m.toLowerCase().replace('type=messenger', 'type=Messenger')))\r\n .replace(/;TYPE=OTHER[^;:]*?([;:])/ig, (_, m) => m)\r\n }\r\n}\r\n\r\nconst socialUrls = {\r\n [SocialType.Twitter]: 'https://x.com/',\r\n [SocialType.Facebook]: 'https://www.facebook.com/',\r\n [SocialType.LinkedIn]: 'https://www.linkedin.com/in/',\r\n [SocialType.SinaWeibo]: 'https://weibo.com/n/',\r\n [SocialType.Messenger]: 'https://www.messenger.com/t/'\r\n}\r\n\r\nfunction getSocialUrl({ value, type }: { value: string, type: `${SocialType}` }) {\r\n let val = value?.trim()\r\n if (!val.match(/^https?:\\/\\//im)) {\r\n try {\r\n const u = new URL(socialUrls[type as keyof typeof socialUrls])\r\n u.pathname = (u.pathname + '/' + val).replace(/[\\/\\\\]+/g, '/')\r\n val = u.toString()\r\n } catch {\r\n return undefined\r\n }\r\n }\r\n return val\r\n}\r\n\r\n","/**\n * vCard\n * @constructor\n * @return {vCard}\n */\nfunction vCard() {\n\n if( !(this instanceof vCard) )\n return new vCard()\n\n /** @type {String} Version number */\n this.version = vCard.versions[ vCard.versions.length - 1 ]\n /** @type {Object} Card data */\n this.data = {}\n\n}\n\n/**\n * vCard MIME type\n * @type {String}\n */\nvCard.mimeType = 'text/vcard'\n\n/**\n * vCard file extension\n * @type {String}\n */\nvCard.extension = '.vcf'\n\n/**\n * vCard versions\n * @type {Array}\n */\nvCard.versions = [ '2.1', '3.0', '4.0' ]\n\n/**\n * VCF EOL character sequence\n * @type {String}\n */\nvCard.EOL = '\\r\\n'\n\n/**\n * Folds a long line according to the RFC 5322.\n * @see http://tools.ietf.org/html/rfc5322#section-2.1.1\n * @param {String} input\n * @param {Number} maxLength\n * @param {Boolean} hardWrap\n * @return {String}\n */\nvCard.foldLine = require( 'foldline' )\n\n/**\n * Normalizes input (cast to string, line folding, whitespace)\n * @param {String} input\n * @return {String}\n */\nvCard.normalize = function( input ) {\n return ( input + '' )\n // Trim whitespace\n .replace( /^[\\s\\r\\n]+|[\\s\\r\\n]+$/g, '' )\n // Trim blank lines\n .replace( /(\\r\\n)[\\x09\\x20]?(\\r\\n)|$/g, '$1' )\n // Unfold folded lines\n .replace( /\\r\\n[\\x20\\x09]/g, \"\" )\n}\n\n/**\n * Check whether a given version is supported\n * @param {String} version\n * @return {Boolean}\n */\nvCard.isSupported = function( version ) {\n return /^\\d\\.\\d$/.test( version ) &&\n vCard.versions.indexOf( version ) !== -1\n}\n\n/**\n * Parses a string or buffer into a vCard object\n * @param {String|Buffer} value\n * @return {Array<vCard>}\n */\nvCard.parse = function( value ) {\n\n var objects = ( value + '' ).split( /(?=BEGIN\\:VCARD)/gi )\n var cards = []\n\n for( var i = 0; i < objects.length; i++ ) {\n cards.push( new vCard().parse( objects[i] ) )\n }\n\n return cards\n\n}\n\n/**\n * Parse an array of vcf formatted lines\n * @internal used by `vCard#parse()`\n * @type {Function}\n */\nvCard.parseLines = require( './parse-lines' )\n\n/**\n * Constructs a vCard from jCard data\n * @param {Array} jcard\n * @return {vCard}\n */\nvCard.fromJSON = function( jcard ) {\n\n jcard = typeof jcard === 'string' ?\n JSON.parse( jcard ) : jcard\n\n if( jcard == null || !Array.isArray( jcard ) )\n return new vCard()\n\n if( !/vcard/i.test( jcard[0] ) )\n throw new Error( 'Object not in jCard format' )\n\n var card = new vCard()\n\n jcard[1].forEach( function( prop ) {\n card.addProperty( vCard.Property.fromJSON( prop ) )\n })\n\n return card\n\n}\n\n/**\n * Format a card object according to the given version\n * @param {vCard} card\n * @param {String} version\n * @return {String}\n */\nvCard.format = function( card, version ) {\n\n version = version || card.version ||\n vCard.versions[ vCard.versions.length - 1 ]\n\n if( !vCard.isSupported( version ) )\n throw new Error( 'Unsupported vCard version \"' + version + '\"' )\n\n var vcf = []\n\n vcf.push( 'BEGIN:VCARD' )\n vcf.push( 'VERSION:' + version )\n\n var props = Object.keys( card.data )\n var prop = ''\n\n for( var i = 0; i < props.length; i++ ) {\n if( props[i] === 'version' ) continue;\n prop = card.data[ props[i] ]\n if( Array.isArray( prop ) ) {\n for( var k = 0; k < prop.length; k++ ) {\n if( prop[k].isEmpty() ) continue\n vcf.push( vCard.foldLine( prop[k].toString( version ), 75 ) )\n }\n } else if( !prop.isEmpty() ) {\n vcf.push( vCard.foldLine( prop.toString( version ), 75 ) )\n }\n }\n\n vcf.push( 'END:VCARD' )\n\n return vcf.join( vCard.EOL )\n\n}\n\n// vCard Property constructor\nvCard.Property = require( './property' )\n\n/**\n * vCard prototype\n * @type {Object}\n */\nvCard.prototype = {\n\n constructor: vCard,\n\n /**\n * Get a vCard property\n * @param {String} key\n * @return {Object|Array}\n */\n get: function( key ) {\n\n if( this.data[ key ] == null ) {\n return this.data[ key ]\n }\n\n if( Array.isArray( this.data[ key ] ) ) {\n return this.data[ key ].map( function( prop ) {\n return prop.clone()\n })\n } else {\n return this.data[ key ].clone()\n }\n\n },\n\n /**\n * Set a vCard property\n * @param {String} key\n * @param {String} value\n * @param {Object} params\n */\n set: function( key, value, params ) {\n return this.setProperty( new vCard.Property( key, value, params ) )\n },\n\n /**\n * Add a vCard property\n * @param {String} key\n * @param {String} value\n * @param {Object} params\n */\n add: function( key, value, params ) {\n var prop = new vCard.Property( key, value, params )\n this.addProperty( prop )\n return this\n },\n\n /**\n * Set a vCard property from an already\n * constructed vCard.Property\n * @param {vCard.Property} prop\n */\n setProperty: function( prop ) {\n this.data[ prop._field ] = prop\n return this\n },\n\n /**\n * Add a vCard property from an already\n * constructed vCard.Property\n * @param {vCard.Property} prop\n */\n addProperty: function( prop ) {\n\n var key = prop._field\n\n if( Array.isArray( this.data[ key ] ) ) {\n this.data[ key ].push( prop )\n } else if( this.data[ key ] != null ) {\n this.data[ key ] = [ this.data[ key ], prop ]\n } else {\n this.data[ key ] = prop\n }\n\n return this\n\n },\n\n /**\n * Parse a vcf formatted vCard\n * @param {String} value\n * @return {vCard}\n */\n parse: function( value ) {\n\n // Normalize & split\n var lines = vCard.normalize( value )\n .split( /\\r\\n/g )\n\n // Keep begin and end markers\n // for eventual error messages\n var begin = lines[0]\n var version = lines[1]\n var end = lines[ lines.length - 1 ]\n\n // Multiple used RegExp's\n const regexp_version = /VERSION:\\d\\.\\d/i\n\n if( !/BEGIN:VCARD/i.test( begin ) )\n throw new SyntaxError( 'Invalid vCard: Expected \"BEGIN:VCARD\" but found \"'+ begin +'\"' )\n\n if( !/END:VCARD/i.test( end ) )\n throw new SyntaxError( 'Invalid vCard: Expected \"END:VCARD\" but found \"'+ end +'\"' )\n\n if( !regexp_version.test( version ) ) {\n // VERSION mostly follows BEGIN, but it has only mandatory follow BEGIN, for version 4.0\n // Let's do the more expensive lookup for the lesser used version variant\n if( !(version = lines.find( line => regexp_version.test( line ) ) ) )\n throw new SyntaxError( 'Invalid vCard: Expected \"VERSION:\\\\d.\\\\d\" but none found' )\n // TODO: Do we need to throw an error if version = 4.0 or != 3.0|2.1? (because not followed BEGIN)?\n }\n\n this.version = version.substring( 8, 11 )\n\n if( !vCard.isSupported( this.version ) )\n throw new Error( 'Unsupported version \"' + this.version + '\"' )\n\n this.data = vCard.parseLines( lines )\n\n return this\n\n },\n\n /**\n * Format the vCard as vcf with given version\n * @param {String} version\n * @param {String} charset\n * @return {String}\n */\n toString: function( version, charset ) {\n version = version || this.version\n return vCard.format( this, version )\n },\n\n /**\n * Format the card as jCard\n * @param {String} version='4.0'\n * @return {Array} jCard\n */\n toJCard: function( version ) {\n\n version = version || '4.0'\n\n var keys = Object.keys( this.data )\n var data = [ [ 'version', {}, 'text', version ] ]\n var prop = null\n\n for( var i = 0; i < keys.length; i++ ) {\n if( keys[i] === 'version' ) continue;\n prop = this.data[ keys[i] ]\n if( Array.isArray( prop ) ) {\n for( var k = 0; k < prop.length; k++ ) {\n data.push( prop[k].toJSON() )\n }\n } else {\n data.push( prop.toJSON() )\n }\n }\n\n return [ 'vcard', data ]\n\n },\n\n /**\n * Format the card as jCard\n * @return {Array} jCard\n */\n toJSON: function() {\n return this.toJCard( this.version )\n },\n\n}\n\n// Exports\nmodule.exports = vCard\n","\nconst CRLF = '\\r\\n'\n\nconst SP = ' '\n\n\n/**\n * Maximum line length (excluding <CR><LF>)\n * There are two limits that RFC 5322 places on the number of\n * characters in a line. Each line of characters MUST be\n * no more than 998 characters, and SHOULD be no more\n * than 78 characters, excluding the <CR><LF>.\n * @type {Number}\n * @constant\n */\nconst MAX_LINE_LENGTH = 998\n\n/**\n * Default maximum line length (excluding <CR><LF>)\n * @type {Number}\n * @constant\n */\nconst DEFAULT_LINE_LENGTH = 78\n\n/**\n * Minimum `maxLength` that can be used\n * @type {Number}\n * @constant\n */\nconst MIN_LINE_LENGTH = 2\n\n/**\n * Folds a long line according to RFC 5322\n * @see http://tools.ietf.org/html/rfc5322#section-2.1.1\n *\n * @param {String} input - input string\n * @param {Number} maxLength - maximum line length (excluding CRLF)\n * @param {Boolean} hardWrap - whether to insert a hard break at `maxLength`\n * @returns {String}\n */\nfunction foldLine( input, maxLength, hardWrap ) {\n\n if( maxLength != null && maxLength < MIN_LINE_LENGTH ) {\n throw new Error( 'Maximum length must not be less than ' + MIN_LINE_LENGTH )\n }\n\n if( maxLength != null && maxLength > MAX_LINE_LENGTH ) {\n throw new Error( 'Maximum length must not exceed ' + MAX_LINE_LENGTH )\n }\n\n // RFC compliant default line length\n maxLength = maxLength || DEFAULT_LINE_LENGTH\n\n input = input.replace( /[\\r\\n]+/g, '' )\n\n // We really don't need to fold this\n if( input.length <= maxLength ) {\n return input\n }\n\n var output = ''\n var index = 0\n var nextIndex = 0\n var length = input.length\n var line = 0\n var trim = 0\n\n while( index < length ) {\n if( !hardWrap && ~( nextIndex = input.lastIndexOf( SP, index + maxLength ) ) ) {\n if( nextIndex > index ) {\n output += input.slice( index, nextIndex ) + CRLF + SP\n index = nextIndex\n } else {\n output += input.slice( index, index + maxLength - trim ) + CRLF + SP\n index = index + maxLength - trim\n hardWrap = true\n }\n } else {\n output += input.slice( index, index + maxLength - trim ) + CRLF + SP\n index = index + maxLength - trim\n }\n if( ( length - index ) < maxLength ) {\n output += input.slice( index )\n break\n }\n if( line === 0 ) {\n trim = 1\n }\n line++\n }\n\n return output\n\n}\n\nfoldLine.unfold = function unfold( input ) {\n return input.replace( /\\r\\n\\s/gm, '' )\n}\n\nmodule.exports = foldLine\n"],"names":["vCardFormatter$1","e","value","replace","nl","getFormattedPhoto","photoType","url","mediaType","base64","majorVersion","YYYYMMDD","date","getFullYear","getMonth","slice","getDate","vCardFormatterModule","getFormattedString","vCard","getMajorVersion","formattedVCardString","version","encodingPrefix","formattedName","firstName","middleName","lastName","forEach","name","namePrefix","nameSuffix","nickname","gender","uid","birthday","anniversary","email","Array","isArray","address","workEmail","otherEmail","logo","photo","cellPhone","number","pagerPhone","homePhone","workPhone","homeFax","workFax","otherPhone","details","homeAddress","type","workAddress","formattedAddress","label","street","city","stateProvince","postalCode","countryRegion","title","role","organization","workUrl","note","socialUrls","key","hasOwnProperty","source","toISOString","Date","isOrganization","vcardsJs","getPhoto","attachFromUrl","this","embedFromFile","fileLocation","fs","require$$0","require$$1","extname","toUpperCase","readFileSync","toString","embedFromString","base64String","facebook","linkedIn","twitter","flickr","majorVersionString","split","isNaN","parseInt","require$$2","saveToFile","filename","contents","writeFileSync","encoding","Property","field","params","Object","assign","_field","_data","defineProperty","enumerable","capitalDashCase","fromJSON","Property.fromJSON","data","test","join","prototype","constructor","is","toLowerCase","indexOf","isEmpty","keys","length","clone","propName","group","i","push","valueOf","toJSON","property","set","object","createParams","param","parts","k","camelCase","input","options","TypeError","pascalCase","map","x","trim","filter","string","isLastCharLower","isLastCharUpper","isLastLastCharUpper","character","preserveCamelCase","_","p1","m","charAt","postProcess","camelcaseModule","exports","default","parseLines_1","parseLines","lines","line","pattern","len","match","exec","pop","propParams","reduce","propVal","AddressType","versions","mimeType","extension","EOL","foldLine","maxLength","hardWrap","MIN_LINE_LENGTH","Error","MAX_LINE_LENGTH","DEFAULT_LINE_LENGTH","output","index","nextIndex","lastIndexOf","SP","CRLF","unfold","foldLine.unfold","foldline","normalize","vCard.normalize","isSupported","vCard.isSupported","parse","vCard.parse","objects","cards","vCard.fromJSON","jcard","JSON","card","prop","addProperty","format","vCard.format","vcf","props","get","setProperty","add","begin","end","regexp_version","SyntaxError","find","substring","toJCard","vcard","Q","Home","Work","PhoneType","S","Cell","Pager","SocialType","U","Messenger","Twitter","Facebook","LinkedIn","SinaWeibo","Jabber","QQ","GaduGadu","VCardPlugin","pluginOptions","uuid","configure","generateVCard","VCard","fullName","extraProps","groupCounter","n","first","last","middle","nick","prefix","suffix","phone","el","v","entries","streetAddress","locality","region","cr","country","p","company","pushMsgProtocol","username","protocol","service","xServiceType","social","xUser","val","u","URL","pathname","getSocialUrl","surl","website","personal","parsed","tx"],"mappings":"+LASCA,WAQAC,SAASA,EAAEC,GACV,UACuB,qBACrBA,EAAQ,GAAKA,GAEPA,EAAMC,QAAQ,MAAO,OAAOA,QAAQ,KAAM,OAAOA,QAAQ,KAAM,QAEhE,EAPU,CAclBC,SAASA,IACR,MAAO,MADM,CAWdC,SAASA,EAAkBC,EAAWC,EAAKC,EAAWC,GAarD,OADqBH,GARjBI,GAAgB,EACVD,EAAS,+BAAiC,oBACxB,IAAjBC,EACDD,EAAS,oBAAsB,SAE/BA,EAAS,oBAAsB,KAGCD,EAAY,IAAMP,EAAEM,GAtBvD,MAUsD,CA+D9DI,WAAkBC,GACjB,SAAYC,eAAiB,KAAOD,EAAKE,WAAW,IAAIC,OAAM,IAAO,IAAMH,EAAKI,WAAWD,SADpE,CA/FxB,IAAIL,EAAe,IAmGnBO,UAAiB,CAOhBC,mBAAoBA,SAASC,GAE5BT,EAAeS,EAAMC,kBAErB,IAAIC,EAAuB,GAC3BA,GAAwB,kBACxBA,GAAwB,WAAaF,EAAMG,QA1FrC,OA4FN,IAAIC,EAAiBb,GAAgB,EAAI,GAAK,iBAC1Cc,EAAgBL,EAAMK,cAwP1B,GAtPKA,IACJA,EAAgB,GAEhB,CAACL,EAAMM,UAAWN,EAAMO,WAAYP,EAAMQ,UACxCC,QAAQ,SAASC,GACbA,GACCL,IACHA,GAAiB,KAGnBA,GAAiBK,CANM,IAU1BR,GAAwB,KAAOE,EAAiB,IAAMtB,EAAEuB,GA7GlD,OA8GNH,GAAwB,IAAME,EAAiB,IAC9CtB,EAAEkB,EAAMQ,UAAY,IACpB1B,EAAEkB,EAAMM,WAAa,IACrBxB,EAAEkB,EAAMO,YAAc,IACtBzB,EAAEkB,EAAMW,YAAc,IACtB7B,EAAEkB,EAAMY,YAnHH,OAqHFZ,EAAMa,UAAYtB,GAAgB,IACrCW,GAAwB,WAAaE,EAAiB,IAAMtB,EAAEkB,EAAMa,UAtH/D,QAyHFb,EAAMc,SACTZ,GAAwB,UAAYpB,EAAEkB,EAAMc,QA1HvC,UA6HIC,MACTb,GAAwB,MAAQE,EAAiB,IAAMtB,EAAEkB,EAAMe,KA9H1D,QAiIFf,EAAMgB,WACTd,GAAwB,QAAUV,EAASQ,EAAMgB,UAlI5C,QAqIFhB,EAAMiB,cACTf,GAAwB,eAAiBV,EAASQ,EAAMiB,aAtInD,UAyIIC,QACLC,MAAMC,QAAQpB,EAAMkB,SACvBlB,EAAMkB,MAAQ,CAAClB,EAAMkB,QAEtBlB,EAAMkB,MAAMT,QACX,SAASY,GAEPnB,EADGX,GAAgB,EACnBW,EAAwB,QAAUE,EAAiB,cAAgBtB,EAAEuC,GAhJnE,OAiJQ9B,GAAgB,GAAKA,EAAe,EAC9CW,EAAwB,QAAUE,EAAiB,uBAAyBtB,EAAEuC,GAlJ5E,OAoJFnB,EAAwB,QAAUE,EAAiB,kBAAoBtB,EAAEuC,GApJvE,MA8Ic,IAYhBrB,EAAMsB,YACLH,MAAMC,QAAQpB,EAAMsB,aACvBtB,EAAMsB,UAAY,CAACtB,EAAMsB,YAE1BtB,EAAMsB,UAAUb,QACf,SAASY,GAEPnB,EADGX,GAAgB,EACnBW,EAAwB,QAAUE,EAAiB,cAAgBtB,EAAEuC,GAjKnE,OAkKQ9B,GAAgB,GAAKA,EAAe,EAC9CW,EAAwB,QAAUE,EAAiB,uBAAyBtB,EAAEuC,GAnK5E,OAqKFnB,EAAwB,QAAUE,EAAiB,kBAAoBtB,EAAEuC,GArKvE,MA+Jc,MAYVE,aACLJ,MAAMC,QAAQpB,EAAMuB,cACvBvB,EAAMuB,WAAa,CAACvB,EAAMuB,aAE3BvB,EAAMuB,WAAWd,QAChB,SAASY,GAEPnB,EADGX,GAAgB,EACnBW,EAAwB,QAAUE,EAAiB,eAAiBtB,EAAEuC,GAlLpE,OAmLQ9B,GAAgB,GAAKA,EAAe,EAC9CW,EAAwB,QAAUE,EAAiB,wBAA0BtB,EAAEuC,GApL7E,OAsLFnB,EAAwB,QAAUE,EAAiB,mBAAqBtB,EAAEuC,GAtLxE,MAgLc,IAYhBrB,EAAMwB,KAAKpC,MACdc,GAAwBhB,EAAkB,OAAQc,EAAMwB,KAAKpC,IAAKY,EAAMwB,KAAKnC,UAAWW,EAAMwB,KAAKlC,SAGhGU,EAAMyB,MAAMrC,MACfc,GAAwBhB,EAAkB,QAASc,EAAMyB,MAAMrC,IAAKY,EAAMyB,MAAMpC,UAAWW,EAAMyB,MAAMnC,SAGpGU,EAAM0B,YACLP,MAAMC,QAAQpB,EAAM0B,aACvB1B,EAAM0B,UAAY,CAAC1B,EAAM0B,YAE1B1B,EAAM0B,UAAUjB,QACf,SAASkB,GAEPzB,EADGX,GAAgB,EACnBW,EAAwB,uCAAyCpB,EAAE6C,GA3MjE,OA6MFzB,EAAwB,iBAAmBpB,EAAE6C,GA7M3C,MAyMY,IAUd3B,EAAM4B,aACLT,MAAMC,QAAQpB,EAAM4B,cACvB5B,EAAM4B,WAAa,CAAC5B,EAAM4B,aAE3B5B,EAAM4B,WAAWnB,QAChB,SAASkB,GAEPzB,EADGX,GAAgB,EACnBW,EAAwB,uCAAyCpB,EAAE6C,GA1NjE,OA4NFzB,EAAwB,kBAAoBpB,EAAE6C,GA5N5C,MAwNa,IAUf3B,EAAM6B,YACLV,MAAMC,QAAQpB,EAAM6B,aACvB7B,EAAM6B,UAAY,CAAC7B,EAAM6B,YAE1B7B,EAAM6B,UAAUpB,QACf,SAASkB,GAEPzB,EADGX,GAAgB,EACnBW,EAAwB,uCAAyCpB,EAAE6C,GAzOjE,OA2OFzB,EAAwB,uBAAyBpB,EAAE6C,GA3OjD,MAuOa,MAUTG,YACLX,MAAMC,QAAQpB,EAAM8B,aACvB9B,EAAM8B,UAAY,CAAC9B,EAAM8B,YAE1B9B,EAAM8B,UAAUrB,QACf,SAASkB,GAEPzB,EADGX,GAAgB,EACnBW,EAAwB,uCAAyCpB,EAAE6C,GAxPjE,OA2PFzB,EAAwB,uBAAyBpB,EAAE6C,GA3PjD,MAsPa,IAWf3B,EAAM+B,UACLZ,MAAMC,QAAQpB,EAAM+B,WACvB/B,EAAM+B,QAAU,CAAC/B,EAAM+B,UAExB/B,EAAM+B,QAAQtB,QACb,SAASkB,GAEPzB,EADGX,GAAgB,EACnBW,EAAwB,qCAAuCpB,EAAE6C,GAxQ/D,OA2QFzB,EAAwB,qBAAuBpB,EAAE6C,GA3Q/C,MAsQa,IAWf3B,EAAMgC,UACLb,MAAMC,QAAQpB,EAAMgC,WACvBhC,EAAMgC,QAAU,CAAChC,EAAMgC,UAExBhC,EAAMgC,QAAQvB,QACb,SAASkB,GAEPzB,EADGX,GAAgB,EACnBW,EAAwB,qCAAuCpB,EAAE6C,GAxR/D,OA2RFzB,EAAwB,qBAAuBpB,EAAE6C,GA3R/C,MAsRa,MAWTM,aACLd,MAAMC,QAAQpB,EAAMiC,cACvBjC,EAAMiC,WAAa,CAACjC,EAAMiC,aAE3BjC,EAAMiC,WAAWxB,QAChB,SAASkB,GAEPzB,EADGX,GAAgB,EACnBW,EAAwB,wCAA0CpB,EAAE6C,GAxSlE,OA2SFzB,EAAwB,kBAAoBpB,EAAE6C,GA3S5C,MAsSa,KAWlB,CACAO,QAASlC,EAAMmC,YACfC,KAAM,QACJ,CACFF,QAASlC,EAAMqC,YACfD,KAAM,SACJ3B,QACF,SAASY,GACRnB,IAAAA,EAAAA,EAvRCoC,EAAmB,IAuRwCjB,EArRnDa,QAAQK,OAqR2ClB,EApRtDa,QAAQM,QAoR8CnB,EAnRtDa,QAAQO,MAmR8CpB,EAlRtDa,QAAQQ,eAkR8CrB,EAjRtDa,QAAQS,YAiR8CtB,EAhRtDa,QAAQU,iBAEZrD,GAAgB,EACnB+C,EAAmB,MA6Q0BlC,EA7QD,SA6QiBiB,EA7QEe,MA6QFf,EA5QnDa,QAAQK,MAAQ,WAAazD,EA4QsBuC,EA5QZa,QAAQK,OAAS,IAAM,IAAM,MAC7EzD,EA2Q4DuC,EA3QlDa,QAAQM,QAAU,IAC5B1D,EA0Q4DuC,EA1QlDa,QAAQO,MAAQ,IAC1B3D,EAyQ4DuC,EAzQlDa,QAAQQ,eAAiB,IACnC5D,EAwQ4DuC,EAxQlDa,QAAQS,YAAc,IAChC7D,EAuQ4DuC,EAvQlDa,QAAQU,eAlDd,QAyTwDvB,EArQjDa,QAAQK,QACnBD,EAAmB,QAoQyBlC,EApQE,SAoQciB,EApQKe,KAAO,IAAMtD,EAoQlBuC,EApQ4Ba,QAAQK,OArD5F,QAuDLD,GAAoB,MAkQyBlC,EAlQA,SAkQgBiB,EAlQGe,KAAO,MACtEtD,EAiQ4DuC,EAjQlDa,QAAQM,QAAU,IAC5B1D,EAgQ4DuC,EAhQlDa,QAAQO,MAAQ,IAC1B3D,EA+P4DuC,EA/PlDa,QAAQQ,eAAiB,IACnC5D,EA8P4DuC,EA9PlDa,QAAQS,YAAc,IAChC7D,EA6P4DuC,EA7PlDa,QAAQU,eA5Dd,SAyTJ1C,EAAAA,EAxPIoC,CAuPa,GAKftC,EAAM6C,QACT3C,GAAwB,QAAUE,EAAiB,IAAMtB,EAAEkB,EAAM6C,OA9T5D,QAiUF7C,EAAM8C,OACT5C,GAAwB,OAASE,EAAiB,IAAMtB,EAAEkB,EAAM8C,MAlU3D,UAqUIC,eACT7C,GAAwB,MAAQE,EAAiB,IAAMtB,EAAEkB,EAAM+C,cAtU1D,QAyUF/C,EAAMZ,MACTc,GAAwB,MAAQE,EAAiB,IAAMtB,EAAEkB,EAAMZ,KA1U1D,QA6UFY,EAAMgD,UACT9C,GAAwB,gBAAkBE,EAAiB,IAAMtB,EAAEkB,EAAMgD,SA9UpE,QAiVFhD,EAAMiD,OACT/C,GAAwB,OAASE,EAAiB,IAAMtB,EAAEkB,EAAMiD,MAlV3D,QAqVFjD,EAAMkD,WACT,IAAKC,IAAIA,KAAOnD,EAAMkD,WACjBlD,EAAMkD,WAAWE,eAAeD,IACnCnD,EAAMkD,WAAWC,KACjBjD,GAAwB,kBAAoBE,EAAiB,SAAW+C,EAAM,IAAMrE,EAAEkB,EAAMkD,WAAWC,IAAQlE,KAgBlH,OAXIe,EAAMqD,SACTnD,GAAwB,SAAWE,EAAiB,IAAMtB,EAAEkB,EAAMqD,QA/V7D,QAkWNnD,GAAwB,QAAsBoD,IAARC,MAAQD,cAlWxC,OAoWFtD,EAAMwD,iBACTtD,GAAwB,0BAGzBA,GAAwB,eApRW,EA3GrCrB,CAAAA,sBCwUD4E,EAxUazD,WAIT0D,aACI,MAAO,CACHtE,IAAK,GACLC,UAAW,GACXC,QAAQ,EAORqE,cAAeA,SAASvE,EAAKC,GACzBuE,KAAKxE,IAAMA,EACXwE,KAAKvE,UAAYA,EACjBuE,KAAKtE,QAAS,CAHsB,EAUxCuE,cAAeA,SAASC,GACtB,IAAIC,EAAOC,OAEN3E,UADM4E,EACWC,QAAQJ,GAAcK,cAAcnF,QAAQ,MAAO,IAEzE4E,KAAKxE,IADS2E,EAAGK,aAAaN,GACXO,SAAS,UAC5BT,KAAKtE,QAAS,CANsB,EAatCgF,gBAAiBA,SAASC,EAAclF,GACtCuE,KAAKvE,UAAYA,OACZD,IAAMmF,OACNjF,QAAS,CAHmC,EAlCvC,CAqGpB,MAAO,CAMHyB,IAAK,GAMLC,SAAU,GAMVU,UAAW,GAMXE,WAAY,GAMZV,MAAO,GAMPI,UAAW,GAMXhB,UAAW,GAMXD,cAAe,GAMfS,OAAQ,GAMRqB,YAnHO,CAKHI,MAAO,GAMPC,OAAQ,GAMRC,KAAM,GAMNC,cAAe,GAMfC,WAAY,GAMZC,cAAe,IAsFnBf,UAAW,GAMXE,QAAS,GAMTvB,SAAU,GAMVgB,KAAMkC,IAMNnD,WAAY,GAMZI,WAAY,GAMZC,WAAY,GAMZC,SAAU,GAMVoC,KAAM,GAMNF,aAAc,GAMdtB,MAAOiC,IAMPZ,KAAM,GAMNI,WArJO,CACHsB,SAAY,GACZC,SAAY,GACZC,QAAW,GACXC,OAAU,IAuJdtB,OAAQ,GAMRR,MAAO,GAMPzD,IAAK,GAML4D,QAAS,GAMTX,YA/NO,CAKHE,MAAO,GAMPC,OAAQ,GAMRC,KAAM,GAMNC,cAAe,GAMfC,WAAY,GAMZC,cAAe,IAkMnBd,UAAW,GAMXE,QAAS,GAMT7B,QAAS,MAMTF,gBAAiBA,WACb,IAAI2E,EAAqBhB,KAAKzD,QAAUyD,KAAKzD,QAAQ0E,MAAM,KAAK,GAAK,IACrE,OAAKC,MAAMF,GAGJ,EAFIG,SAASH,EAHI,EAY5B7E,mBAAoBA,WAEhB,OADqBiF,IACCjF,mBAAmB6D,KAFd,EAS/BqB,WAAYA,SAASC,GAEjB,IAAIC,EADiBH,IACSjF,mBAAmB6D,MAExCI,EACNoB,cAAcF,EAAUC,EAAU,CAAEE,SAAU,QALtB,EA9Td,4DCAzBC,SAASA,EAAUC,EAAOxG,EAAOyG,GAE/B,KAAM5B,mBACJ,OAAO,IAAI0B,EAAUvG,GAET,MAAVyG,GACFC,OAAOC,OAAQ9B,KAAM4B,GAEvB5B,KAAK+B,OAASJ,EACd3B,KAAKgC,MAAQ7G,EAEb0G,OAAOI,eAAgBjC,KAAM,SAAU,CAAEkC,YAAY,IACrDL,OAAOI,eAAgBjC,KAAM,QAAS,CAAEkC,YAAY,GAZZ,CA2C1CC,SAASA,EAAiBhH,GACxB,OAAOA,EAAMC,QAAS,WAAY,OAAQmF,aADV,iBAtBlCmB,EAASU,SAAWC,SAAUC,GAE5B,IAAIX,EAAQW,EAAK,GACbV,EAASU,EAAK,GAQlB,MANK,QAAQC,KAAMD,EAAK,MACtBV,EAAOzG,MAAQmH,EAAK,IAKf,IAAIZ,EAAUC,EAHjBxG,EAAQoC,MAAMC,QAAS8E,EAAK,IAC9BA,EAAK,GAAGE,KAAM,KAAQF,EAAK,GAEMV,EAXA,EA8BrCF,EAASe,UAAY,CAEnBC,YAAahB,EAObiB,GAAIA,SAAUnE,GAEZ,OADAA,GAASA,EAAO,IAAKoE,oBACRpF,QAASwC,KAAKxB,MACzBwB,KAAKxB,KAAKqE,QAASrE,IAAU,EAC7BwB,KAAKxB,OAASA,CAJG,EAWrBsE,QAASA,WACP,OAAqB,MAAd9C,KAAKgC,OACqB,IAA/BH,OAAOkB,KAAM/C,MAAOgD,MAFJ,EASpBC,MAAOA,WACL,OAAO,IAAIvB,EAAU1B,KAAK+B,OAAQ/B,KAAKgC,MAAOhC,KAD9B,EASlBS,SAAUA,SAAUlE,GAMlB,IAJA,IAAI2G,GAAYlD,KAAKmD,MAAQnD,KAAKmD,MAAQ,IAAM,IAAMhB,EAAiBnC,KAAK+B,QACxEgB,EAAOlB,OAAOkB,KAAM/C,MACpB4B,EAAS,GAEJwB,EAAI,EAAGA,EAAIL,EAAKC,OAAQI,IAC/B,GAAgB,UAAZL,EAAKK,GAET,OAAQF,GACN,IAAK,MACL,IAAK,MACL,IAAK,QACa,QAAZ3G,EACEgB,MAAMC,QAAQwC,KAAK+C,EAAKK,KAC1BxB,EAAOyB,KAAKrD,KAAK+C,EAAKK,IAAIZ,KAAK,MAE/BZ,EAAOyB,KAAKrD,KAAK+C,EAAKK,KAGxBxB,EAAOyB,KAAKlB,EAAgBY,EAAKK,IAAM,IAAMpD,KAAK+C,EAAKK,KACzD,MACF,QACExB,EAAOyB,KAAKlB,EAAgBY,EAAKK,IAAM,IAAMpD,KAAK+C,EAAKK,KAI7D,MAAgB,QAAZ7G,GAAiC,QAAZA,EAChB2G,GACHtB,EAAOoB,OAAS,IAAMpB,EAAOY,KAAM,KAAMjC,cAAgBqB,EAAOnB,WAAWF,eAAkB,KAC7FhD,MAAMC,QAASwC,KAAKgC,OAAUhC,KAAKgC,MAAMQ,KAAM,KAAQxC,KAAKgC,OAEzDkB,GACHtB,EAAOoB,OAAS,IAAMpB,EAAOY,KAAM,KAAQZ,GAAW,KACtDrE,MAAMC,QAASwC,KAAKgC,OAAUhC,KAAKgC,MAAMQ,KAAM,KAAQxC,KAAKgC,MAlCtC,EA0C9BsB,QAASA,WACP,OAAOtD,KAAKgC,KADM,EAQpBuB,OAAQA,WAEN,IAAI3B,EAASC,OAAOC,OAAO,GAAG9B,MAS9B,OAPqB,SAAjB4B,EAAOzG,QACTyG,EAAOzG,WAAQ,SACRyG,EAAOzG,OAGZmH,EAAO,CAAEtC,KAAK+B,OAAQH,EAAQ5B,KAAK7E,OAAS,QAExC6E,KAAK+B,QACX,QAASO,EAAKe,KAAMrD,KAAKgC,OACzB,MAAA,IAAK,MACL,IAAK,IACHM,EAAKe,KAAMrD,KAAKgC,MAAMf,MAAO,MAGjC,OAAOqB,CAlBU,GAyBrBkB,EAAiB9B,gBC1KjB+B,SAASA,EAAKC,EAAQnE,EAAKpE,GACrBoC,MAAMC,QAASkG,EAAQnE,IACzBmE,EAAQnE,GAAM8D,KAAMlI,GAEpBuI,EAAQnE,GADkB,MAAjBmE,EAAQnE,GACD,CAAEmE,EAAQnE,GAAOpE,GAEjBA,CANe,CAUnCwI,SAASA,EAAc/B,EAAQgC,GAEzBC,EAAQD,EAAM3C,MAAO,KACzB,IAAI6C,EAAIC,EAAWF,EAAM,IACrB1I,EAAQ0I,EAAM,GAOlB,OALa,MAAT1I,GAA2B,KAAVA,IACnBA,EAAQ0I,EAAM,GACdC,EAAI,QAGI,SAANA,GAEiB,MAAf3I,EAAO,IAA6C,MAA9BA,EAAOA,EAAM6H,OAAS,KAAsC,IAAvB7H,EAAM0H,QAAQ,OAC3E1H,EAAQA,EAAMa,MAAM,GAAG,IACzBb,EAAMyH,cAAc3B,MAAO,KAAMpE,QAAS,SAAU1B,GAClDsI,EAAK7B,EAAQkC,EAAG3I,EAD0C,GAIrDyG,IAIT6B,EAAK7B,EAAQkC,EAAG3I,GAETyG,EAzB8B,mBAbvC,IAAImC,6CC+BW,CAAAC,EAASC,KACvB,GAAuB,iBAAVD,IAAsBzG,MAAMC,QAAQwG,GAChD,MAAM,IAAIE,UAAU,uDAGrBD,EAAUpC,OAAOC,OAAO,CACvBqC,YAAY,GACVF,KAIC1G,MAAMC,QAAQwG,GACTA,EAAMI,IAAIC,GAAKA,EAAEC,QACvBC,OAAOF,GAAKA,EAAErB,QACdR,KAAK,KAECwB,EAAMM,OAGM,IAAjBN,EAAMhB,OACF,GAGa,IAAjBgB,EAAMhB,OACFiB,EAAQE,WAAaH,EAAMzD,cAAgByD,EAAMpB,mBAG1BoB,EAAMpB,gBAGpCoB,EA3DqBQ,KACtB,IAAIC,GAAkB,EAClBC,GAAkB,EAClBC,GAAsB,EAE1B,IAAK,IAAIvB,EAAI,EAAGA,EAAIoB,EAAOxB,OAAQI,IAAK,CACvC,IAAMwB,EAAYJ,EAAOpB,GAErBqB,GAAmB,WAAWlC,KAAKqC,IAAcA,EAAUrE,gBAAkBqE,GAChFJ,EAASA,EAAOxI,MAAM,EAAGoH,GAAK,IAAMoB,EAAOxI,MAAMoH,GACjDqB,GAAkB,EAClBE,EAAsBD,EACtBA,GAAkB,EAClBtB,KACUsB,GAAmBC,GAAuB,WAAWpC,KAAKqC,IAAcA,EAAUhC,gBAAkBgC,GAC9GJ,EAASA,EAAOxI,MAAM,EAAGoH,EAAI,GAAK,IAAMoB,EAAOxI,MAAMoH,EAAI,GACzDuB,EAAsBD,EACtBA,GAAkB,EAClBD,GAAkB,IAElBA,EAAkBG,EAAUhC,gBAAkBgC,GAAaA,EAAUrE,gBAAkBqE,EACvFD,EAAsBD,EACtBA,EAAkBE,EAAUrE,gBAAkBqE,GAAaA,EAAUhC,gBAAkBgC,EAjBjD,CAqBxC,OAAOJ,GAiCEK,CAAkBb,IAG3BA,EAAQA,EACN5I,QAAQ,YAAa,IACrBwH,cACAxH,QAAQ,kBAAmB,CAAC0J,EAAGC,IAAOA,EAAGxE,eACzCnF,QAAQ,aAAc4J,GAAKA,EAAEzE,eA5BX8D,EA8BDL,EA9BMC,EAAQE,WAAaE,EAAEY,OAAO,GAAG1E,cAAgB8D,EAAErI,MAAM,GAAKqI,GAAnEa,IAAAb,UAiCrBc,EAAAC,QAAiBrB,EAEjBoB,EAAAC,QAAAC,QAAyBtB,YD3ET3D,GACZsB,EAAWrB,WA6EfiF,EApCAC,SAAqBC,GAUnB,IARA,IAIIC,EAJAnD,EAAO,CAAA,EAKPoD,EAAU,+CACVC,EAAMH,EAAMxC,OAAS,EAEhBI,EAAI,EAAGA,EAAIuC,EAAKvC,IAAM,CAE7BqC,EAAOD,EAAMpC,OAETwC,EAAQF,EAAQG,KAAMJ,GAC1B,GAAKG,EAAL,CAEA,IAAI9I,EAAO8I,EAAM,GAAG3E,MAAM,KACtBuC,EAAW1G,EAAKgJ,MACpB,IAAI3C,EAAQrG,EAAKgJ,QACLF,EAAM,GAIdG,GAHSH,EAAM,GACjBA,EAAM,GAAGxK,QAAS,SAAU,IAAK6F,MAAO,KAAQ,IAE1B+E,OAAQrC,EAAcR,EAAQ,CAAEA,MAAOA,GAAU,CAAA,KAIpEb,EAHDY,EAAWa,EAAWP,GACtByC,EAAU,IAAIvE,EAAUwB,EAAU/H,EAAO4K,GAX7C,CAL6B,CAsB/B,OAAOzD,CAhCoB,UE7BjB4D,iBCRZ9J,SAASA,IAEP,KAAM4D,gBAAgB5D,GACpB,WAAWA,EAGb4D,KAAKzD,QAAUH,EAAM+J,SAAU/J,EAAM+J,SAASnD,OAAS,GAEvDhD,KAAKsC,KAAO,CAAA,CARG,iBAgBjBlG,EAAMgK,SAAW,aAMjBhK,EAAMiK,UAAY,OAMlBjK,EAAM+J,SAAW,CAAE,MAAO,MAAO,OAMjC/J,EAAMkK,IAAM,OAUZlK,EAAMmK,oBCTNA,SAASA,EAAUvC,EAAOwC,EAAWC,GAEnC,GAAiB,MAAbD,GAAqBA,EAbNE,EAcjB,MAAUC,MAAO,0CAGnB,GAAiB,MAAbH,GAAqBA,EA/BNI,IAgCjB,MAAUD,MAAO,sCASnB,GALAH,EAAYA,GA7BWK,IA+BvB7C,EAAQA,EAAM5I,QAAS,WAAY,KAGzB4H,QAAUwD,EAClB,OAAOxC,EAUT,IAPA,IAAI8C,EAAS,GACTC,EAAQ,EACRC,EAAY,EACZhE,EAASgB,EAAMhB,OACfyC,EAAO,EACPnB,EAAO,EAEJyC,EAAQ/D,GAAS,CActB,IAbKyD,KAAeO,EAAYhD,EAAMiD,YAjElCC,IAiEmDH,EAAQP,IACzDQ,EAAYD,GACdD,GAAU9C,EAAMhI,MAAO+K,EAAOC,GArE5BG,QAsEFJ,EAAQC,IAERF,GAAU9C,EAAMhI,MAAO+K,EAAOA,EAAQP,EAAYlC,GAxEhD6C,QAyEFJ,EAAQA,EAAQP,EAAYlC,EAC5BmC,GAAW,IAGbK,GAAU9C,EAAMhI,MAAO+K,EAAOA,EAAQP,EAAYlC,GA7E9C6C,QA8EJJ,EAAQA,EAAQP,EAAYlC,GAExBtB,EAAS+D,EAAUP,EAAY,CACnCM,GAAU9C,EAAMhI,MAAO+K,GACvB,KAFmC,CAIxB,IAATtB,IACFnB,EAAO,GAETmB,GArBsB,CAwBxB,OAAOqB,CAnDuC,iBAuDhDP,EAASa,OAASC,SAAiBrD,GACjC,OAAOA,EAAM5I,QAAS,WAAY,GADO,EAI3CkM,EAAiBf,GDlDAnG,GAOjBhE,EAAMmL,UAAYC,SAAUxD,GAC1B,OAASA,EAAQ,IAEd5I,QAAS,yBAA0B,IAEnCA,QAAS,6BAA8B,MAEvCA,QAAS,kBAAmB,GAPG,EAepCgB,EAAMqL,YAAcC,SAAUnL,GAC5B,MAAO,WAAWgG,KAAMhG,KACgB,IAAtCH,EAAM+J,SAAStD,QAAStG,EAFY,IAUlCoL,MAAQC,SAAUzM,GAElB0M,GAAY1M,EAAQ,IAAK8F,MAAO,qBAGpC,IAFA,IAAI6G,EAAQ,GAEH1E,EAAI,EAAGA,EAAIyE,EAAQ7E,OAAQI,IAClC0E,EAAMzE,MAAkBsE,IAARvL,GAAQuL,MAAOE,EAAQzE,YAGlC0E,CATuB,IAkB1BvC,WAAalF,IAOnBjE,EAAMgG,SAAW2F,SAAUC,GAKzB,GAAa,OAHbA,EAAyB,iBAAVA,EACbC,KAAKN,MAAOK,GAAUA,KAEFzK,MAAMC,QAASwK,GACnC,WAAW5L,EAEb,IAAK,SAASmG,KAAMyF,EAAM,IACxB,MAAUrB,MAAO,8BAEnB,IAAIuB,EAAO,IAAI9L,EAMf,OAJA4L,EAAM,GAAGnL,QAAS,SAAUsL,GAC1BD,EAAKE,YAAahM,EAAMsF,SAASU,SAAU+F,GADV,GAI5BD,CAjB0B,IA2B7BG,OAASC,SAAUJ,EAAM3L,GAK7B,GAHAA,EAAUA,GAAW2L,EAAK3L,SACxBH,EAAM+J,SAAU/J,EAAM+J,SAASnD,OAAS,IAErC5G,EAAMqL,YAAalL,GACtB,MAAUoK,MAAO,8BAAgCpK,EAAU,KAE7D,IAAIgM,EAAM,GAEVA,EAAIlF,KAAM,eACVkF,EAAIlF,KAAM,WAAa9G,GAKvB,IAHA,IACI4L,EADAK,EAAQ3G,OAAOkB,KAAMmF,EAAK5F,MAGrBc,EAAI,EAAGA,EAAIoF,EAAMxF,OAAQI,IAChC,GAAiB,YAAboF,EAAMpF,GAEV,GADA+E,EAAOD,EAAK5F,KAAMkG,EAAMpF,IACpB7F,MAAMC,QAAS2K,GACjB,IAAK,IAAIrE,EAAI,EAAGA,EAAIqE,EAAKnF,OAAQc,IAC3BqE,EAAKrE,GAAGhB,WACZyF,EAAIlF,KAAMjH,EAAMmK,SAAU4B,EAAKrE,GAAGrD,SAAUlE,GAAW,UAE/C4L,EAAKrF,WACfyF,EAAIlF,KAAMjH,EAAMmK,SAAU4B,EAAK1H,SAAUlE,GAAW,KAMxD,SAFI8G,KAAM,eAECb,KAAMpG,EAAMkK,IA/BgB,EAoCzClK,EAAMsF,SAAWN,IAMjBhF,EAAMqG,UAAY,CAEhBC,YAAatG,EAObqM,IAAKA,SAAUlJ,GAEb,OAAwB,MAApBS,KAAKsC,KAAM/C,GACNS,KAAKsC,KAAM/C,GAGhBhC,MAAMC,QAASwC,KAAKsC,KAAM/C,IACrBS,KAAKsC,KAAM/C,GAAM6E,IAAK,SAAU+D,GACrC,OAAOA,EAAKlF,OADgC,GAIvCjD,KAAKsC,KAAM/C,GAAM0D,OAXP,EAsBrBQ,IAAKA,SAAUlE,EAAKpE,EAAOyG,GACzB,OAAO5B,KAAK0I,YAAa,IAAItM,EAAMsF,SAAUnC,EAAKpE,EAAOyG,GADvB,EAUpC+G,IAAKA,SAAUpJ,EAAKpE,EAAOyG,GAGzB,OAFIuG,EAAO,IAAI/L,EAAMsF,SAAUnC,EAAKpE,EAAOyG,GAC3C5B,KAAKoI,YAAaD,GACXnI,IAH2B,EAWpC0I,YAAaA,SAAUP,GAErB,OADAnI,KAAKsC,KAAM6F,EAAKpG,QAAWoG,EACpBnI,IAFqB,EAU9BoI,YAAaA,SAAUD,GAErB,IAAI5I,EAAM4I,EAAKpG,OAUf,OARIxE,MAAMC,QAASwC,KAAKsC,KAAM/C,IAC5BS,KAAKsC,KAAM/C,GAAM8D,KAAM8E,GAEvBnI,KAAKsC,KAAM/C,GADkB,MAApBS,KAAKsC,KAAM/C,GACD,CAAES,KAAKsC,KAAM/C,GAAO4I,GAEpBA,MATO,EAqB9BR,MAAOA,SAAUxM,GAQf,IAAIyN,GALApD,EAAQpJ,EAAMmL,UAAWpM,GAC1B8F,MAAO,UAIQ,GACd1E,EAAUiJ,EAAM,GAChBqD,EAAMrD,EAAOA,EAAMxC,OAAS,GAGhC8F,EAAoB,kBAEpB,IAAK,eAAevG,KAAMqG,GACxB,MAAM,IAAIG,YAAa,oDAAqDH,EAAO,KAErF,IAAK,aAAarG,KAAMsG,GACtB,UAAUE,YAAa,kDAAmDF,EAAK,KAEjF,IAAKC,EAAevG,KAAMhG,MAGlBA,EAAUiJ,EAAMwD,KAAMvD,GAAQqD,EAAevG,KAAMkD,KACvD,UAAUsD,YAAa,4DAM3B,GAFA/I,KAAKzD,QAAUA,EAAQ0M,UAAW,EAAG,KAEhC7M,EAAMqL,YAAazH,KAAKzD,SAC3B,MAAUoK,MAAO,wBAA0B3G,KAAKzD,QAAU,KAI5D,OAFAyD,KAAKsC,KAAOlG,EAAMmJ,WAAYC,GAEvBxF,IApCgB,EA8CzBS,SAAUA,SAAUlE,UAClBA,EAAUA,GAAWyD,KAAKzD,QACnBH,EAAMiM,OAAQrI,KAAMzD,EAFU,EAUvC2M,QAASA,SAAU3M,GAEjBA,EAAUA,GAAW,MAErB,IAAIwG,EAAOlB,OAAOkB,KAAM/C,KAAKsC,QAClB,CAAE,CAAE,UAAW,GAAI,OAAQ/F,IAGtC,IAFA,IAAI4L,EAEK/E,EAAI,EAAGA,EAAIL,EAAKC,OAAQI,IAC/B,GAAgB,YAAZL,EAAKK,GAET,GADA+E,EAAOnI,KAAKsC,KAAMS,EAAKK,IACnB7F,MAAMC,QAAS2K,GACjB,IAAK,IAAIrE,EAAI,EAAGA,EAAIqE,EAAKnF,OAAQc,IAC/BxB,EAAKe,KAAM8E,EAAKrE,GAAGP,iBAGhBF,KAAM8E,EAAK5E,gBAIb,CAAE,QAASjB,EApBS,EA4B7BiB,OAAQA,WACN,YAAY2F,QAASlJ,KAAKzD,QADT,GAOrB4M,EAAiB/M,ODhVLgN,EAAAlD,IAAW,GACnBA,EAAAmD,KAAA,SACAC,KAAA,WAGQC,EAAAC,EAAAD,IAAS,CAAA,EACjBA,EAAAF,KAAA,OACAE,EAAAD,KAAA,SACAG,KAAA,OACAF,EAAAG,MAAA,YAGQC,EAAAC,EAAAD,IAAU,GAClBA,EAAAE,UAAA,cACAC,QAAA,UACAH,EAAAI,SAAA,WACAJ,EAAAK,SAAA,WACAJ,EAAAK,UAAA,QACAN,EAAAO,OAAA,SACAP,EAAAQ,GAAA,OACAC,SAAA,YAiTJ,IAAA9K,EAAgB,CACZ,CAACqK,EAAWG,SAAU,iBACtB,CAACH,EAAWI,UAAW,4BACvB,CAACJ,EAAWK,UAAW,+BACvB,CAACL,EAAWM,WAAY,uBACxB,CAACN,EAAWE,WAAY,+CA1QPQ,MAGIC,cACAC,KAFrB7H,WAAAA,CACqB4H,EACAC,GADAvK,KAAAsK,cAAAA,EACAtK,KAAAuK,KAAAA,CAAa,CAGlCC,SAAAA,CAAUvG,UACNA,EAAQ3B,KAAOtC,KAAKyK,gBACbxG,CAFe,CAKlBwG,aAAAA,GACJ,IAAMnI,KAAAA,GAAQtC,KAAGsK,cACjBpC,EAAUwC,IACVxC,EAAK3L,QAAU,QAEVE,cAAgB6F,EAAKqI,SAE1B,IAAAC,EAAgB,GACZC,EAAe,EAGnB,GAAIvI,EAAKxF,KAAM,CACX,IAAAgO,EAAOxI,EAAGxF,KACNgO,EAAEC,QACF7C,EAAKxL,UAAYoO,EAAEC,OACnBD,EAAEE,OACF9C,EAAKtL,SAAWkO,EAAEE,QAChBC,SACF/C,EAAKvL,WAAamO,EAAEG,QACpBH,EAAEI,OACFhD,EAAKjL,SAAW6N,EAAEI,KAClBN,EAAWvH,KAAKkF,EAAI7G,SAASU,SAAS,CAClC,iBACA,GACA,OACA,CAAC,mCAAoC0I,EAAEI,KAAM,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,QAGtGJ,EAAEK,SACFjD,EAAKnL,WAAa+N,EAAEK,UAClBC,SACFlD,EAAKlL,WAAa8N,EAAEM,OApBb,CAuBX9I,EAAKrD,QACLiJ,EAAKjJ,MAAQqD,EAAKrD,SAEb7B,WACL8K,EAAK9K,SAAWkF,EAAKlF,YAEhBS,OACLqK,EAAKrK,MAAMkC,cAAcuC,EAAKzE,MAAMrC,IAAK8G,EAAKzE,MAAMpC,WAExD6G,EAAK+I,OAAOxO,QAAQyO,IAChB,IAAI/L,EAA6E,aACjF,OAAQ+L,EAAG9M,MACP,KAAK+K,EAAUD,KACX/J,EAAM,kBAGV,KAAKgK,EAAUE,KACXlK,EAAM,YACN,WAECgK,EAAUG,MACXnK,EAAM,aACN,MAEJ,KAAKgK,EAAUF,KACX9J,EAAM,YAGd,MAAO2I,EAAG3I,GACNhC,MAAMC,QAAQ+N,GACdA,EAAElI,KAAKiI,EAAGnQ,OAEV+M,EAAK3I,GAAO,CAAC+L,EAAGnQ,SAGxBmH,EAAKhF,OAAOT,QAAQyO,IAChB,IAAI/L,EAA4C,oBACxC+L,EAAG9M,MACP,KAAK0H,EAAYoD,KACb/J,EAAM,kBAGV,KAAK2G,EAAYmD,KACb9J,EAAM,QAGd,MAAO2I,EAAG3I,GACNhC,MAAMC,QAAQ+N,GACdA,EAAElI,KAAKiI,EAAGnQ,OAEV+M,EAAK3I,GAAO,CAAC+L,EAAGnQ,SAGpBmH,EAAK7E,SACLoE,OAAO2J,QAAQlJ,EAAK7E,SAASZ,QAAQ,EAAEiH,EAAGyH,MACtC,IAAIhM,EAAqC,cACzC,OAAQuE,GACJ,IAAK,OACDvE,EAAM,cACN,UAEC,OACDA,EAAM,cAGVgM,EAAEE,gBACFvD,EAAK3I,GAAKX,OAAS2M,EAAEE,eACrBF,EAAEG,WACFxD,EAAK3I,GAAKV,KAAO0M,EAAEG,UACnBH,EAAExM,aACFmJ,EAAK3I,GAAKR,WAAawM,EAAExM,YACzBwM,EAAEzM,gBACFoJ,EAAK3I,GAAKT,cAAgByM,EAAEzM,iBAExB,KACF6M,QACFC,EAAGvI,KAAKkI,EAAEI,UAERE,SACFD,EAAGvI,KAAKkI,EAAEM,UAEd7M,EAAmB4M,EACdxH,IAAI0H,GAAKA,EAAExH,QACXC,OAAOuH,KAAOA,GACdtJ,KAAK,SAGN0F,EAAK3I,GAAKP,cAAgBA,KAIlCsD,EAAK1E,MACLsK,EAAKtK,KAAKmC,cAAcuC,EAAK1E,KAAKpC,IAAK8G,EAAK1E,KAAKnC,WAEjD6G,EAAKjD,OACL6I,EAAK7I,KAAOiD,EAAKjD,MAEjBiD,EAAKyJ,UACL7D,EAAK/I,aAAemD,EAAKyJ,SAE7B,IAAAC,EAAqB,CAAAC,EAAoBzN,EAAc0N,EAAkBC,KACrE,IAAIhJ,EA9HS,OAAM0H,IA+HnBD,EAAWvH,KAAKkF,EAAI7G,SAASU,SAAS,CAClC5D,EACA,CACI2E,MAAAA,GAEJ,OACA8I,KAEJrB,EAAWvH,KAAKkF,EAAI7G,SAASU,SAAS,CAClC,WACA,CACIe,MAAAA,GAEJ,OACAgJ,KAGJhJ,EAhJa,OAAM0H,IAiJnBD,EAAWvH,KAAKkF,EAAI7G,SAASU,SAAS,CAClC,OACA,CACIe,MAAAA,EACAiJ,aAAcD,GAElB,OACA,GAAGD,KAAYD,OAEnBrB,EAAWvH,KAAKkF,EAAI7G,SAASU,SAAS,CAClC,WACA,CACIe,MAAAA,GAEJ,OACAgJ,MAIJ7J,EAAK+J,QACL/J,EAAK+J,OAAOxP,QAAS0O,IACjB,OAAQA,EAAE/M,MACN,KAAKmL,EAAWE,UACZe,EAAWvH,KAAKkF,EAAI7G,SAASU,SAAS,CAClC,iBACA,CACI5D,KAAM,YACN8N,MAAOf,EAAEpQ,OAEb,OACA,uBAEJ,IAAAgI,EAjLC,OAAM0H,IAkLPD,EAAWvH,KAAKkF,EAAI7G,SAASU,SAAS,CAClC,OACA,CACIe,MAAAA,EACAiJ,aAAc,YAElB,OACA,QAAQb,EAAEpQ,WAEdyP,EAAWvH,KAAKkF,EAAI7G,SAASU,SAAS,CAClC,WACA,CACIe,MAAAA,GAEJ,OACA,cAEJ,WAECwG,EAAWG,QAChB,KAAKH,EAAWI,SAChB,KAAKJ,EAAWK,SAChB,KAAKL,EAAWM,uBAgDZ9O,MAAAA,EAAOqD,KAAAA,IAE3B,GADI+N,EAAMpR,GAAOmJ,QACZiI,EAAI3G,MAAM,kBACX,IACI,IAAA4G,EAAO,IAAGC,IAAInN,EAAId,IAClBgO,EAAEE,UAAYF,EAAEE,SAAW,IAAMH,GAAKnR,QAAQ,WAAY,KAC1DmR,EAAMC,EAAE/L,UAHR,CAIF,MACE,MADI,CAIZ,OAAO8L,CAXoE,CA/C7CI,CAAGpB,MAETrD,EAAK5I,WAAWiM,EAAE/M,MAAQoO,GAC9B,MAEJ,KAAKjD,EAAWO,OACZ8B,EAAgBT,EAAEpQ,MAAO,UAAW,OAAQ,UAC5C,MAEJ,KAAKwO,EAAWQ,GACZ6B,EAAgBT,EAAEpQ,MAAO,MAAO,UAAW,MAC3C,MAEJ,KAAKwO,EAAWS,SACZ4B,EAAgBT,EAAEpQ,MAAO,YAAa,UAAW,eAK7DmH,EAAKuK,SAASd,UACd7D,EAAK9I,QAAUkD,EAAKuK,QAAQd,SAE5BzJ,EAAKuK,SAASC,WACd5E,EAAK1M,IAAM8G,EAAKuK,QAAQC,eAEnBvC,OACLrC,EAAK/K,IAAM6C,KAAKuK,MAEpB,IAAAwC,EAAYxE,EAAGZ,MAAIO,EAAM/L,sBAAyB,GAGlD,OAFAyO,EAAW/N,QAAQsL,GAAQ4E,EAAO3E,YAAYD,IAEvC4E,EAAOtM,SAAS,OAClBrF,QAAQ,mCAAoC,oBAC5CA,QAAQ,eAAgB,aACxBA,QAAQ,mCAAoC,CAAC4R,EAAIhI,IAAMgI,EAAG5R,QAAQ4J,EAAGA,EAAEpC,cAAcxH,QAAQ,iBAAkB,oBAC/GA,QAAQ,6BAA8B,CAAC0J,EAAGE,IAAMA,EArPpC","x_google_ignoreList":[0,1,2,3,4,6,7]}
@@ -0,0 +1,2 @@
1
+ var i,p=i||={};p.wep="WEP",p.wpa="WPA",p.wpaEap="WPA2-EAP";var n=new Set(["\\",";",",",":",'"']);function t(i,p=!1){return i=i.split("").map(i=>n.has(i)?"\\"+i:i).join(""),p&&i.match(/^[0-9a-f]+$/i)?`"${i}"`:i}export default class{pluginOptions;constructor(i){this.pluginOptions=i}configure(i){return i.data=this.generateWiFi(),i}generateWiFi(){var{ssid:p,hidden:n}=this.pluginOptions,e=[];return e.push({key:"S",value:t(p)}),"encryption"in this.pluginOptions&&this.pluginOptions.encryption?(e.push({key:"T",value:t(this.pluginOptions.encryption)},{key:"P",value:t(this.pluginOptions.password||"",!0)}),this.pluginOptions.encryption==i.wpaEap&&(this.pluginOptions.eapMethod&&e.push({key:"E",value:t(this.pluginOptions.eapMethod)}),this.pluginOptions.eapIdentity&&e.push({key:"I",value:t(this.pluginOptions.eapIdentity)}),this.pluginOptions.eapAnonymousIdentity&&e.push({key:"A",value:t(this.pluginOptions.eapAnonymousIdentity)}),this.pluginOptions.eapPhase2Method&&e.push({key:"PH2",value:t(this.pluginOptions.eapPhase2Method)}))):e.push({key:"T",value:"nopass"}),e.push({key:"H",value:n?"true":"false"}),`WIFI:${e.map(({key:i,value:p})=>[i,p].join(":")).join(";")};;`}}export{i as EncryptionType};
2
+ //# sourceMappingURL=wifi-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wifi-plugin.js","sources":["../src/plugins/wifi.ts"],"sourcesContent":["import { Options, Plugin } from '../utils/options.js'\r\n\r\nexport enum EncryptionType {\r\n wep = 'WEP',\r\n wpa = 'WPA',\r\n wpaEap = 'WPA2-EAP'\r\n}\r\n\r\nexport type WiFiPluginOptions = {\r\n ssid: string\r\n hidden?: boolean\r\n} & ({\r\n encryption: `${EncryptionType.wep | EncryptionType.wpa}`\r\n password: string\r\n} | {}) & (({\r\n encryption: `${EncryptionType.wpaEap}`\r\n password?: string\r\n /** EAP method, like PEAP, TTLS or PWD */\r\n eapMethod?: string\r\n /** EAP identity */\r\n eapIdentity?: string\r\n /** EAP anonymous identity */\r\n eapAnonymousIdentity?: string\r\n /** EAP phase 2 method, like MSCHAPV2 or TLS */\r\n eapPhase2Method?: string\r\n} & {}) | {})\r\n\r\nexport default class WiFiPlugin implements Plugin {\r\n\r\n constructor(\r\n private readonly pluginOptions: WiFiPluginOptions\r\n ) { }\r\n\r\n configure(options: Options): Options | undefined | void {\r\n options.data = this.generateWiFi()\r\n return options\r\n }\r\n\r\n private generateWiFi() {\r\n // https://github.com/zxing/zxing/wiki/Barcode-Contents#wi-fi-network-config-android-ios-11\r\n\r\n const { ssid, hidden } = this.pluginOptions\r\n\r\n const parts = new Array<{ key: 'T' | 'S' | 'P' | 'H' | 'E' | 'A' | 'I' | 'PH2', value: string }>()\r\n parts.push({\r\n key: 'S',\r\n value: escape_string(ssid)\r\n })\r\n if ('encryption' in this.pluginOptions && this.pluginOptions.encryption) {\r\n parts.push({\r\n key: 'T',\r\n value: escape_string(this.pluginOptions.encryption)\r\n }, {\r\n key: 'P',\r\n value: escape_string(this.pluginOptions.password || '', true)\r\n })\r\n if (this.pluginOptions.encryption == EncryptionType.wpaEap) {\r\n if (this.pluginOptions.eapMethod)\r\n parts.push({\r\n key: 'E',\r\n value: escape_string(this.pluginOptions.eapMethod)\r\n })\r\n if (this.pluginOptions.eapIdentity)\r\n parts.push({\r\n key: 'I',\r\n value: escape_string(this.pluginOptions.eapIdentity)\r\n })\r\n if (this.pluginOptions.eapAnonymousIdentity)\r\n parts.push({\r\n key: 'A',\r\n value: escape_string(this.pluginOptions.eapAnonymousIdentity)\r\n })\r\n if (this.pluginOptions.eapPhase2Method)\r\n parts.push({\r\n key: 'PH2',\r\n value: escape_string(this.pluginOptions.eapPhase2Method)\r\n })\r\n }\r\n } else\r\n parts.push({\r\n key: 'T',\r\n value: 'nopass'\r\n })\r\n\r\n parts.push({\r\n key: 'H',\r\n value: hidden ? 'true' : 'false'\r\n })\r\n\r\n const content = parts.map(({ key, value }) => [key, value].join(':')).join(';')\r\n\r\n return `WIFI:${content};;`\r\n }\r\n\r\n}\r\n\r\nconst to_escape = new Set(['\\\\', ';', ',', ':', '\"'])\r\n\r\nfunction escape_string(val: string, quoteHex = false) {\r\n const value = val.split('').map(v => to_escape.has(v) ? '\\\\' + v : v).join('')\r\n if (quoteHex && value.match(/^[0-9a-f]+$/i))\r\n return `\"${value}\"`\r\n return value\r\n};\r\n"],"names":["EncryptionType","d","wep","wpa","wpaEap","to_escape","Set","escape_string","val","quoteHex","value","split","map","v","has","join","match","WiFiPlugin","pluginOptions","constructor","this","configure","options","data","generateWiFi","ssid","hidden","parts","push","key","encryption","password","eapMethod","eapIdentity","eapAnonymousIdentity","eapPhase2Method"],"mappings":"IAEYA,EAAAC,EAAAD,IAAc,CAAA,EACtBA,EAAAE,IAAA,MACAF,EAAAG,IAAA,QACAC,OAAA,WA2FJ,IAAAC,EAAe,IAAGC,IAAI,CAAG,KAAM,IAAK,IAAK,IAAK,MAErCC,SAAAA,EAAcC,EAAaC,GAAW,GAE3C,OADAC,EAAWF,EAAGG,MAAI,IAAQC,IAAEC,GAAKR,EAAIS,IAAUD,GAAM,KAAOA,EAAIA,GAAIE,KAAE,IAClEN,GAAYC,EAAMM,MAAM,gBACjB,IAAIN,KACRA,CAJyC,gBAvE/BO,MAGIC,cADrBC,WAAAA,CACqBD,GAAAE,KAAAF,cAAAA,CAAgC,CAGrDG,SAAAA,CAAUC,GAEN,OADAA,EAAQC,KAAOH,KAAKI,eACbF,CAFe,CAKlBE,YAAAA,GAGJ,IAAMC,KAAAA,EAAMC,OAAAA,GAAUN,KAAGF,cAEzBS,EAAW,GAgDX,SA/CMC,KAAK,CACPC,IAAK,IACLnB,MAAOH,EAAckB,KAErB,eAAgBL,KAAKF,eAAiBE,KAAKF,cAAcY,YACzDH,EAAMC,KAAK,CACPC,IAAK,IACLnB,MAAOH,EAAca,KAAKF,cAAcY,aACzC,CACCD,IAAK,IACLnB,MAAOH,EAAca,KAAKF,cAAca,UAAY,IAAI,KAExDX,KAAKF,cAAcY,YAAc9B,EAAeI,SAC5CgB,KAAKF,cAAcc,WACnBL,EAAMC,KAAK,CACPC,IAAK,IACLnB,MAAOH,EAAca,KAAKF,cAAcc,aAE5CZ,KAAKF,cAAce,aACnBN,EAAMC,KAAK,CACPC,IAAK,IACLnB,MAAOH,EAAca,KAAKF,cAAce,eAE5Cb,KAAKF,cAAcgB,sBACnBP,EAAMC,KAAK,CACPC,IAAK,IACLnB,MAAOH,EAAca,KAAKF,cAAcgB,wBAE5Cd,KAAKF,cAAciB,iBACnBR,EAAMC,KAAK,CACPC,IAAK,MACLnB,MAAOH,EAAca,KAAKF,cAAciB,qBAIpDR,EAAMC,KAAK,CACPC,IAAK,IACLnB,MAAO,aAGTkB,KAAK,CACPC,IAAK,IACLnB,MAAOgB,EAAS,OAAS,UAKtB,QAFMC,EAAGf,IAAM,EAAKiB,IAAAA,EAAKnB,MAAAA,KAAS,CAAAmB,EAASnB,GAAOK,KAAE,MAASA,KAAE,QAnDtD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@liquid-js/qr-code-styling",
3
- "version": "5.4.5",
3
+ "version": "5.5.0-0",
4
4
  "description": "Generate styled QR codes on web or in Node",
5
5
  "type": "module",
6
6
  "main": "./lib/qr-code-styling-node.js",
@@ -27,9 +27,21 @@
27
27
  "types": "./lib/plugins/border.d.ts",
28
28
  "default": "./lib/border-plugin.js"
29
29
  },
30
+ "./event-plugin": {
31
+ "types": "./lib/plugins/event.d.ts",
32
+ "default": "./lib/event-plugin.js"
33
+ },
30
34
  "./font-faces-plugin": {
31
35
  "types": "./lib/plugins/font-faces.d.ts",
32
36
  "default": "./lib/font-faces-plugin.js"
37
+ },
38
+ "./vcard-plugin": {
39
+ "types": "./lib/plugins/vcard.d.ts",
40
+ "default": "./lib/vcard-plugin.js"
41
+ },
42
+ "./wifi-plugin": {
43
+ "types": "./lib/plugins/wifi.d.ts",
44
+ "default": "./lib/wifi-plugin.js"
33
45
  }
34
46
  },
35
47
  "files": [
@@ -39,7 +51,10 @@
39
51
  "@liquid-js/qrcode-generator": "^1.1.0",
40
52
  "@xmldom/xmldom": "^0.9.0",
41
53
  "file-type": "^21.0.0 || ^22.0.0",
42
- "sharp": ">0.32.1 <1.0.0"
54
+ "sharp": ">0.32.1 <1.0.0",
55
+ "ts-ics": "^2.4.0",
56
+ "vcards-js": "^2.10.0",
57
+ "vcf": "^2.1.0"
43
58
  },
44
59
  "repository": {
45
60
  "type": "git",