{"version":3,"file":"./lib/fxparser.min.js","mappings":"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","sources":["webpack://XMLParser/./node_modules/strnum/strnum.js","webpack://XMLParser/./src/util.js","webpack://XMLParser/./src/validator.js","webpack://XMLParser/./src/xmlparser/DocTypeReader.js","webpack://XMLParser/./src/xmlparser/OptionsBuilder.js","webpack://XMLParser/./src/xmlparser/OrderedObjParser.js","webpack://XMLParser/./src/xmlparser/XMLParser.js","webpack://XMLParser/./src/xmlparser/node2json.js","webpack://XMLParser/./src/xmlparser/xmlNode.js","webpack://XMLParser/webpack/bootstrap","webpack://XMLParser/webpack/startup"],"sourcesContent":["const hexRegex = /^[-+]?0x[a-fA-F0-9]+$/;\nconst numRegex = /^([\\-\\+])?(0*)(\\.[0-9]+([eE]\\-?[0-9]+)?|[0-9]+(\\.[0-9]+([eE]\\-?[0-9]+)?)?)$/;\n// const octRegex = /0x[a-z0-9]+/;\n// const binRegex = /0x[a-z0-9]+/;\n\n\n//polyfill\nif (!Number.parseInt && window.parseInt) {\n    Number.parseInt = window.parseInt;\n}\nif (!Number.parseFloat && window.parseFloat) {\n    Number.parseFloat = window.parseFloat;\n}\n\n  \nconst consider = {\n    hex :  true,\n    leadingZeros: true,\n    decimalPoint: \"\\.\",\n    eNotation: true\n    //skipLike: /regex/\n};\n\nfunction toNumber(str, options = {}){\n    // const options = Object.assign({}, consider);\n    // if(opt.leadingZeros === false){\n    //     options.leadingZeros = false;\n    // }else if(opt.hex === false){\n    //     options.hex = false;\n    // }\n\n    options = Object.assign({}, consider, options );\n    if(!str || typeof str !== \"string\" ) return str;\n    \n    let trimmedStr  = str.trim();\n    // if(trimmedStr === \"0.0\") return 0;\n    // else if(trimmedStr === \"+0.0\") return 0;\n    // else if(trimmedStr === \"-0.0\") return -0;\n\n    if(options.skipLike !== undefined && options.skipLike.test(trimmedStr)) return str;\n    else if (options.hex && hexRegex.test(trimmedStr)) {\n        return Number.parseInt(trimmedStr, 16);\n    // } else if (options.parseOct && octRegex.test(str)) {\n    //     return Number.parseInt(val, 8);\n    // }else if (options.parseBin && binRegex.test(str)) {\n    //     return Number.parseInt(val, 2);\n    }else{\n        //separate negative sign, leading zeros, and rest number\n        const match = numRegex.exec(trimmedStr);\n        if(match){\n            const sign = match[1];\n            const leadingZeros = match[2];\n            let numTrimmedByZeros = trimZeros(match[3]); //complete num without leading zeros\n            //trim ending zeros for floating number\n            \n            const eNotation = match[4] || match[6];\n            if(!options.leadingZeros && leadingZeros.length > 0 && sign && trimmedStr[2] !== \".\") return str; //-0123\n            else if(!options.leadingZeros && leadingZeros.length > 0 && !sign && trimmedStr[1] !== \".\") return str; //0123\n            else{//no leading zeros or leading zeros are allowed\n                const num = Number(trimmedStr);\n                const numStr = \"\" + num;\n                if(numStr.search(/[eE]/) !== -1){ //given number is long and parsed to eNotation\n                    if(options.eNotation) return num;\n                    else return str;\n                }else if(eNotation){ //given number has enotation\n                    if(options.eNotation) return num;\n                    else return str;\n                }else if(trimmedStr.indexOf(\".\") !== -1){ //floating number\n                    // const decimalPart = match[5].substr(1);\n                    // const intPart = trimmedStr.substr(0,trimmedStr.indexOf(\".\"));\n\n                    \n                    // const p = numStr.indexOf(\".\");\n                    // const givenIntPart = numStr.substr(0,p);\n                    // const givenDecPart = numStr.substr(p+1);\n                    if(numStr === \"0\" && (numTrimmedByZeros === \"\") ) return num; //0.0\n                    else if(numStr === numTrimmedByZeros) return num; //0.456. 0.79000\n                    else if( sign && numStr === \"-\"+numTrimmedByZeros) return num;\n                    else return str;\n                }\n                \n                if(leadingZeros){\n                    // if(numTrimmedByZeros === numStr){\n                    //     if(options.leadingZeros) return num;\n                    //     else return str;\n                    // }else return str;\n                    if(numTrimmedByZeros === numStr) return num;\n                    else if(sign+numTrimmedByZeros === numStr) return num;\n                    else return str;\n                }\n\n                if(trimmedStr === numStr) return num;\n                else if(trimmedStr === sign+numStr) return num;\n                // else{\n                //     //number with +/- sign\n                //     trimmedStr.test(/[-+][0-9]);\n\n                // }\n                return str;\n            }\n            // else if(!eNotation && trimmedStr && trimmedStr !== Number(trimmedStr) ) return str;\n            \n        }else{ //non-numeric string\n            return str;\n        }\n    }\n}\n\n/**\n * \n * @param {string} numStr without leading zeros\n * @returns \n */\nfunction trimZeros(numStr){\n    if(numStr && numStr.indexOf(\".\") !== -1){//float\n        numStr = numStr.replace(/0+$/, \"\"); //remove ending zeros\n        if(numStr === \".\")  numStr = \"0\";\n        else if(numStr[0] === \".\")  numStr = \"0\"+numStr;\n        else if(numStr[numStr.length-1] === \".\")  numStr = numStr.substr(0,numStr.length-1);\n        return numStr;\n    }\n    return numStr;\n}\nmodule.exports = toNumber\n","'use strict';\n\nconst nameStartChar = ':A-Za-z_\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD';\nconst nameChar = nameStartChar + '\\\\-.\\\\d\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040';\nconst nameRegexp = '[' + nameStartChar + '][' + nameChar + ']*'\nconst regexName = new RegExp('^' + nameRegexp + '$');\n\nconst getAllMatches = function(string, regex) {\n  const matches = [];\n  let match = regex.exec(string);\n  while (match) {\n    const allmatches = [];\n    allmatches.startIndex = regex.lastIndex - match[0].length;\n    const len = match.length;\n    for (let index = 0; index < len; index++) {\n      allmatches.push(match[index]);\n    }\n    matches.push(allmatches);\n    match = regex.exec(string);\n  }\n  return matches;\n};\n\nconst isName = function(string) {\n  const match = regexName.exec(string);\n  return !(match === null || typeof match === 'undefined');\n};\n\nexports.isExist = function(v) {\n  return typeof v !== 'undefined';\n};\n\nexports.isEmptyObject = function(obj) {\n  return Object.keys(obj).length === 0;\n};\n\n/**\n * Copy all the properties of a into b.\n * @param {*} target\n * @param {*} a\n */\nexports.merge = function(target, a, arrayMode) {\n  if (a) {\n    const keys = Object.keys(a); // will return an array of own properties\n    const len = keys.length; //don't make it inline\n    for (let i = 0; i < len; i++) {\n      if (arrayMode === 'strict') {\n        target[keys[i]] = [ a[keys[i]] ];\n      } else {\n        target[keys[i]] = a[keys[i]];\n      }\n    }\n  }\n};\n/* exports.merge =function (b,a){\n  return Object.assign(b,a);\n} */\n\nexports.getValue = function(v) {\n  if (exports.isExist(v)) {\n    return v;\n  } else {\n    return '';\n  }\n};\n\n// const fakeCall = function(a) {return a;};\n// const fakeCallNoReturn = function() {};\n\nexports.isName = isName;\nexports.getAllMatches = getAllMatches;\nexports.nameRegexp = nameRegexp;\n","'use strict';\n\nconst util = require('./util');\n\nconst defaultOptions = {\n  allowBooleanAttributes: false, //A tag can have attributes without any value\n  unpairedTags: []\n};\n\n//const tagsPattern = new RegExp(\"<\\\\/?([\\\\w:\\\\-_\\.]+)\\\\s*\\/?>\",\"g\");\nexports.validate = function (xmlData, options) {\n  options = Object.assign({}, defaultOptions, options);\n\n  //xmlData = xmlData.replace(/(\\r\\n|\\n|\\r)/gm,\"\");//make it single line\n  //xmlData = xmlData.replace(/(^\\s*<\\?xml.*?\\?>)/g,\"\");//Remove XML starting tag\n  //xmlData = xmlData.replace(/(<!DOCTYPE[\\s\\w\\\"\\.\\/\\-\\:]+(\\[.*\\])*\\s*>)/g,\"\");//Remove DOCTYPE\n  const tags = [];\n  let tagFound = false;\n\n  //indicates that the root tag has been closed (aka. depth 0 has been reached)\n  let reachedRoot = false;\n\n  if (xmlData[0] === '\\ufeff') {\n    // check for byte order mark (BOM)\n    xmlData = xmlData.substr(1);\n  }\n  \n  for (let i = 0; i < xmlData.length; i++) {\n\n    if (xmlData[i] === '<' && xmlData[i+1] === '?') {\n      i+=2;\n      i = readPI(xmlData,i);\n      if (i.err) return i;\n    }else if (xmlData[i] === '<') {\n      //starting of tag\n      //read until you reach to '>' avoiding any '>' in attribute value\n      let tagStartPos = i;\n      i++;\n      \n      if (xmlData[i] === '!') {\n        i = readCommentAndCDATA(xmlData, i);\n        continue;\n      } else {\n        let closingTag = false;\n        if (xmlData[i] === '/') {\n          //closing tag\n          closingTag = true;\n          i++;\n        }\n        //read tagname\n        let tagName = '';\n        for (; i < xmlData.length &&\n          xmlData[i] !== '>' &&\n          xmlData[i] !== ' ' &&\n          xmlData[i] !== '\\t' &&\n          xmlData[i] !== '\\n' &&\n          xmlData[i] !== '\\r'; i++\n        ) {\n          tagName += xmlData[i];\n        }\n        tagName = tagName.trim();\n        //console.log(tagName);\n\n        if (tagName[tagName.length - 1] === '/') {\n          //self closing tag without attributes\n          tagName = tagName.substring(0, tagName.length - 1);\n          //continue;\n          i--;\n        }\n        if (!validateTagName(tagName)) {\n          let msg;\n          if (tagName.trim().length === 0) {\n            msg = \"Invalid space after '<'.\";\n          } else {\n            msg = \"Tag '\"+tagName+\"' is an invalid name.\";\n          }\n          return getErrorObject('InvalidTag', msg, getLineNumberForPosition(xmlData, i));\n        }\n\n        const result = readAttributeStr(xmlData, i);\n        if (result === false) {\n          return getErrorObject('InvalidAttr', \"Attributes for '\"+tagName+\"' have open quote.\", getLineNumberForPosition(xmlData, i));\n        }\n        let attrStr = result.value;\n        i = result.index;\n\n        if (attrStr[attrStr.length - 1] === '/') {\n          //self closing tag\n          const attrStrStart = i - attrStr.length;\n          attrStr = attrStr.substring(0, attrStr.length - 1);\n          const isValid = validateAttributeString(attrStr, options);\n          if (isValid === true) {\n            tagFound = true;\n            //continue; //text may presents after self closing tag\n          } else {\n            //the result from the nested function returns the position of the error within the attribute\n            //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n            //this gives us the absolute index in the entire xml, which we can use to find the line at last\n            return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, attrStrStart + isValid.err.line));\n          }\n        } else if (closingTag) {\n          if (!result.tagClosed) {\n            return getErrorObject('InvalidTag', \"Closing tag '\"+tagName+\"' doesn't have proper closing.\", getLineNumberForPosition(xmlData, i));\n          } else if (attrStr.trim().length > 0) {\n            return getErrorObject('InvalidTag', \"Closing tag '\"+tagName+\"' can't have attributes or invalid starting.\", getLineNumberForPosition(xmlData, tagStartPos));\n          } else {\n            const otg = tags.pop();\n            if (tagName !== otg.tagName) {\n              let openPos = getLineNumberForPosition(xmlData, otg.tagStartPos);\n              return getErrorObject('InvalidTag',\n                \"Expected closing tag '\"+otg.tagName+\"' (opened in line \"+openPos.line+\", col \"+openPos.col+\") instead of closing tag '\"+tagName+\"'.\",\n                getLineNumberForPosition(xmlData, tagStartPos));\n            }\n\n            //when there are no more tags, we reached the root level.\n            if (tags.length == 0) {\n              reachedRoot = true;\n            }\n          }\n        } else {\n          const isValid = validateAttributeString(attrStr, options);\n          if (isValid !== true) {\n            //the result from the nested function returns the position of the error within the attribute\n            //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n            //this gives us the absolute index in the entire xml, which we can use to find the line at last\n            return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, i - attrStr.length + isValid.err.line));\n          }\n\n          //if the root level has been reached before ...\n          if (reachedRoot === true) {\n            return getErrorObject('InvalidXml', 'Multiple possible root nodes found.', getLineNumberForPosition(xmlData, i));\n          } else if(options.unpairedTags.indexOf(tagName) !== -1){\n            //don't push into stack\n          } else {\n            tags.push({tagName, tagStartPos});\n          }\n          tagFound = true;\n        }\n\n        //skip tag text value\n        //It may include comments and CDATA value\n        for (i++; i < xmlData.length; i++) {\n          if (xmlData[i] === '<') {\n            if (xmlData[i + 1] === '!') {\n              //comment or CADATA\n              i++;\n              i = readCommentAndCDATA(xmlData, i);\n              continue;\n            } else if (xmlData[i+1] === '?') {\n              i = readPI(xmlData, ++i);\n              if (i.err) return i;\n            } else{\n              break;\n            }\n          } else if (xmlData[i] === '&') {\n            const afterAmp = validateAmpersand(xmlData, i);\n            if (afterAmp == -1)\n              return getErrorObject('InvalidChar', \"char '&' is not expected.\", getLineNumberForPosition(xmlData, i));\n            i = afterAmp;\n          }else{\n            if (reachedRoot === true && !isWhiteSpace(xmlData[i])) {\n              return getErrorObject('InvalidXml', \"Extra text at the end\", getLineNumberForPosition(xmlData, i));\n            }\n          }\n        } //end of reading tag text value\n        if (xmlData[i] === '<') {\n          i--;\n        }\n      }\n    } else {\n      if ( isWhiteSpace(xmlData[i])) {\n        continue;\n      }\n      return getErrorObject('InvalidChar', \"char '\"+xmlData[i]+\"' is not expected.\", getLineNumberForPosition(xmlData, i));\n    }\n  }\n\n  if (!tagFound) {\n    return getErrorObject('InvalidXml', 'Start tag expected.', 1);\n  }else if (tags.length == 1) {\n      return getErrorObject('InvalidTag', \"Unclosed tag '\"+tags[0].tagName+\"'.\", getLineNumberForPosition(xmlData, tags[0].tagStartPos));\n  }else if (tags.length > 0) {\n      return getErrorObject('InvalidXml', \"Invalid '\"+\n          JSON.stringify(tags.map(t => t.tagName), null, 4).replace(/\\r?\\n/g, '')+\n          \"' found.\", {line: 1, col: 1});\n  }\n\n  return true;\n};\n\nfunction isWhiteSpace(char){\n  return char === ' ' || char === '\\t' || char === '\\n'  || char === '\\r';\n}\n/**\n * Read Processing insstructions and skip\n * @param {*} xmlData\n * @param {*} i\n */\nfunction readPI(xmlData, i) {\n  const start = i;\n  for (; i < xmlData.length; i++) {\n    if (xmlData[i] == '?' || xmlData[i] == ' ') {\n      //tagname\n      const tagname = xmlData.substr(start, i - start);\n      if (i > 5 && tagname === 'xml') {\n        return getErrorObject('InvalidXml', 'XML declaration allowed only at the start of the document.', getLineNumberForPosition(xmlData, i));\n      } else if (xmlData[i] == '?' && xmlData[i + 1] == '>') {\n        //check if valid attribut string\n        i++;\n        break;\n      } else {\n        continue;\n      }\n    }\n  }\n  return i;\n}\n\nfunction readCommentAndCDATA(xmlData, i) {\n  if (xmlData.length > i + 5 && xmlData[i + 1] === '-' && xmlData[i + 2] === '-') {\n    //comment\n    for (i += 3; i < xmlData.length; i++) {\n      if (xmlData[i] === '-' && xmlData[i + 1] === '-' && xmlData[i + 2] === '>') {\n        i += 2;\n        break;\n      }\n    }\n  } else if (\n    xmlData.length > i + 8 &&\n    xmlData[i + 1] === 'D' &&\n    xmlData[i + 2] === 'O' &&\n    xmlData[i + 3] === 'C' &&\n    xmlData[i + 4] === 'T' &&\n    xmlData[i + 5] === 'Y' &&\n    xmlData[i + 6] === 'P' &&\n    xmlData[i + 7] === 'E'\n  ) {\n    let angleBracketsCount = 1;\n    for (i += 8; i < xmlData.length; i++) {\n      if (xmlData[i] === '<') {\n        angleBracketsCount++;\n      } else if (xmlData[i] === '>') {\n        angleBracketsCount--;\n        if (angleBracketsCount === 0) {\n          break;\n        }\n      }\n    }\n  } else if (\n    xmlData.length > i + 9 &&\n    xmlData[i + 1] === '[' &&\n    xmlData[i + 2] === 'C' &&\n    xmlData[i + 3] === 'D' &&\n    xmlData[i + 4] === 'A' &&\n    xmlData[i + 5] === 'T' &&\n    xmlData[i + 6] === 'A' &&\n    xmlData[i + 7] === '['\n  ) {\n    for (i += 8; i < xmlData.length; i++) {\n      if (xmlData[i] === ']' && xmlData[i + 1] === ']' && xmlData[i + 2] === '>') {\n        i += 2;\n        break;\n      }\n    }\n  }\n\n  return i;\n}\n\nconst doubleQuote = '\"';\nconst singleQuote = \"'\";\n\n/**\n * Keep reading xmlData until '<' is found outside the attribute value.\n * @param {string} xmlData\n * @param {number} i\n */\nfunction readAttributeStr(xmlData, i) {\n  let attrStr = '';\n  let startChar = '';\n  let tagClosed = false;\n  for (; i < xmlData.length; i++) {\n    if (xmlData[i] === doubleQuote || xmlData[i] === singleQuote) {\n      if (startChar === '') {\n        startChar = xmlData[i];\n      } else if (startChar !== xmlData[i]) {\n        //if vaue is enclosed with double quote then single quotes are allowed inside the value and vice versa\n      } else {\n        startChar = '';\n      }\n    } else if (xmlData[i] === '>') {\n      if (startChar === '') {\n        tagClosed = true;\n        break;\n      }\n    }\n    attrStr += xmlData[i];\n  }\n  if (startChar !== '') {\n    return false;\n  }\n\n  return {\n    value: attrStr,\n    index: i,\n    tagClosed: tagClosed\n  };\n}\n\n/**\n * Select all the attributes whether valid or invalid.\n */\nconst validAttrStrRegxp = new RegExp('(\\\\s*)([^\\\\s=]+)(\\\\s*=)?(\\\\s*([\\'\"])(([\\\\s\\\\S])*?)\\\\5)?', 'g');\n\n//attr, =\"sd\", a=\"amit's\", a=\"sd\"b=\"saf\", ab  cd=\"\"\n\nfunction validateAttributeString(attrStr, options) {\n  //console.log(\"start:\"+attrStr+\":end\");\n\n  //if(attrStr.trim().length === 0) return true; //empty string\n\n  const matches = util.getAllMatches(attrStr, validAttrStrRegxp);\n  const attrNames = {};\n\n  for (let i = 0; i < matches.length; i++) {\n    if (matches[i][1].length === 0) {\n      //nospace before attribute name: a=\"sd\"b=\"saf\"\n      return getErrorObject('InvalidAttr', \"Attribute '\"+matches[i][2]+\"' has no space in starting.\", getPositionFromMatch(matches[i]))\n    } else if (matches[i][3] !== undefined && matches[i][4] === undefined) {\n      return getErrorObject('InvalidAttr', \"Attribute '\"+matches[i][2]+\"' is without value.\", getPositionFromMatch(matches[i]));\n    } else if (matches[i][3] === undefined && !options.allowBooleanAttributes) {\n      //independent attribute: ab\n      return getErrorObject('InvalidAttr', \"boolean attribute '\"+matches[i][2]+\"' is not allowed.\", getPositionFromMatch(matches[i]));\n    }\n    /* else if(matches[i][6] === undefined){//attribute without value: ab=\n                    return { err: { code:\"InvalidAttr\",msg:\"attribute \" + matches[i][2] + \" has no value assigned.\"}};\n                } */\n    const attrName = matches[i][2];\n    if (!validateAttrName(attrName)) {\n      return getErrorObject('InvalidAttr', \"Attribute '\"+attrName+\"' is an invalid name.\", getPositionFromMatch(matches[i]));\n    }\n    if (!attrNames.hasOwnProperty(attrName)) {\n      //check for duplicate attribute.\n      attrNames[attrName] = 1;\n    } else {\n      return getErrorObject('InvalidAttr', \"Attribute '\"+attrName+\"' is repeated.\", getPositionFromMatch(matches[i]));\n    }\n  }\n\n  return true;\n}\n\nfunction validateNumberAmpersand(xmlData, i) {\n  let re = /\\d/;\n  if (xmlData[i] === 'x') {\n    i++;\n    re = /[\\da-fA-F]/;\n  }\n  for (; i < xmlData.length; i++) {\n    if (xmlData[i] === ';')\n      return i;\n    if (!xmlData[i].match(re))\n      break;\n  }\n  return -1;\n}\n\nfunction validateAmpersand(xmlData, i) {\n  // https://www.w3.org/TR/xml/#dt-charref\n  i++;\n  if (xmlData[i] === ';')\n    return -1;\n  if (xmlData[i] === '#') {\n    i++;\n    return validateNumberAmpersand(xmlData, i);\n  }\n  let count = 0;\n  for (; i < xmlData.length; i++, count++) {\n    if (xmlData[i].match(/\\w/) && count < 20)\n      continue;\n    if (xmlData[i] === ';')\n      break;\n    return -1;\n  }\n  return i;\n}\n\nfunction getErrorObject(code, message, lineNumber) {\n  return {\n    err: {\n      code: code,\n      msg: message,\n      line: lineNumber.line || lineNumber,\n      col: lineNumber.col,\n    },\n  };\n}\n\nfunction validateAttrName(attrName) {\n  return util.isName(attrName);\n}\n\n// const startsWithXML = /^xml/i;\n\nfunction validateTagName(tagname) {\n  return util.isName(tagname) /* && !tagname.match(startsWithXML) */;\n}\n\n//this function returns the line number for the character at the given index\nfunction getLineNumberForPosition(xmlData, index) {\n  const lines = xmlData.substring(0, index).split(/\\r?\\n/);\n  return {\n    line: lines.length,\n\n    // column number is last line's length + 1, because column numbering starts at 1:\n    col: lines[lines.length - 1].length + 1\n  };\n}\n\n//this function returns the position of the first character of match within attrStr\nfunction getPositionFromMatch(match) {\n  return match.startIndex + match[1].length;\n}\n","//TODO: handle comments\nfunction readDocType(xmlData, i){\n    \n    const entities = {};\n    if( xmlData[i + 3] === 'O' &&\n         xmlData[i + 4] === 'C' &&\n         xmlData[i + 5] === 'T' &&\n         xmlData[i + 6] === 'Y' &&\n         xmlData[i + 7] === 'P' &&\n         xmlData[i + 8] === 'E')\n    {    \n        i = i+9;\n        let angleBracketsCount = 1;\n        let hasBody = false, entity = false, comment = false;\n        let exp = \"\";\n        for(;i<xmlData.length;i++){\n            if (xmlData[i] === '<') {\n                if( hasBody && \n                     xmlData[i+1] === '!' &&\n                     xmlData[i+2] === 'E' &&\n                     xmlData[i+3] === 'N' &&\n                     xmlData[i+4] === 'T' &&\n                     xmlData[i+5] === 'I' &&\n                     xmlData[i+6] === 'T' &&\n                     xmlData[i+7] === 'Y'\n                ){\n                    i += 7;\n                    entity = true;\n                }else if( hasBody && \n                    xmlData[i+1] === '!' &&\n                     xmlData[i+2] === 'E' &&\n                     xmlData[i+3] === 'L' &&\n                     xmlData[i+4] === 'E' &&\n                     xmlData[i+5] === 'M' &&\n                     xmlData[i+6] === 'E' &&\n                     xmlData[i+7] === 'N' &&\n                     xmlData[i+8] === 'T'\n                ){\n                    //Not supported\n                    i += 8;\n                }else if( //comment\n                    xmlData[i+1] === '!' &&\n                    xmlData[i+2] === '-' &&\n                    xmlData[i+3] === '-'\n                ){\n                    comment = true;\n                }else{\n                    throw new Error(\"Invalid DOCTYPE\");\n                }\n                angleBracketsCount++;\n                exp = \"\";\n            } else if (xmlData[i] === '>') {\n                if(comment){\n                    if( xmlData[i - 1] === \"-\" && xmlData[i - 2] === \"-\"){\n                        comment = false;\n                    }else{\n                        throw new Error(`Invalid XML comment in DOCTYPE`);\n                    }\n                }else if(entity){\n                    parseEntityExp(exp, entities);\n                    entity = false;\n                }\n                angleBracketsCount--;\n                if (angleBracketsCount === 0) {\n                  break;\n                }\n            }else if( xmlData[i] === '['){\n                hasBody = true;\n            }else{\n                exp += xmlData[i];\n            }\n        }\n        if(angleBracketsCount !== 0){\n            throw new Error(`Unclosed DOCTYPE`);\n        }\n    }else{\n        throw new Error(`Invalid Tag instead of DOCTYPE`);\n    }\n    return {entities, i};\n}\n\nconst entityRegex = RegExp(\"^\\\\s([a-zA-z0-0]+)[ \\t](['\\\"])([^&]+)\\\\2\");\nfunction parseEntityExp(exp, entities){\n    const match = entityRegex.exec(exp);\n    if(match){\n        entities[ match[1] ] = {\n            regx : RegExp( `&${match[1]};`,\"g\"),\n            val: match[3]\n        };\n    }\n}\nmodule.exports = readDocType;","\nconst defaultOptions = {\n    preserveOrder: false,\n    attributeNamePrefix: '@_',\n    attributesGroupName: false,\n    textNodeName: '#text',\n    ignoreAttributes: true,\n    removeNSPrefix: false, // remove NS from tag name or attribute name if true\n    allowBooleanAttributes: false, //a tag can have attributes without any value\n    //ignoreRootElement : false,\n    parseTagValue: true,\n    parseAttributeValue: false,\n    trimValues: true, //Trim string values of tag and attributes\n    cdataPropName: false,\n    numberParseOptions: {\n      hex: true,\n      leadingZeros: true\n    },\n    tagValueProcessor: function(tagName, val) {\n      return val;\n    },\n    attributeValueProcessor: function(attrName, val) {\n      return val;\n    },\n    stopNodes: [], //nested tags will not be parsed even for errors\n    alwaysCreateTextNode: false,\n    isArray: () => false,\n    commentPropName: false,\n    unpairedTags: [],\n    processEntities: true,\n    htmlEntities: false,\n    ignoreDeclaration: false,\n    ignorePiTags: false\n};\n   \nconst buildOptions = function(options) {\n    return Object.assign({}, defaultOptions, options);\n};\n\nexports.buildOptions = buildOptions;\nexports.defaultOptions = defaultOptions;","'use strict';\n///@ts-check\n\nconst util = require('../util');\nconst xmlNode = require('./xmlNode');\nconst readDocType = require(\"./DocTypeReader\");\nconst toNumber = require(\"strnum\");\n\nconst regx =\n  '<((!\\\\[CDATA\\\\[([\\\\s\\\\S]*?)(]]>))|((NAME:)?(NAME))([^>]*)>|((\\\\/)(NAME)\\\\s*>))([^<]*)'\n  .replace(/NAME/g, util.nameRegexp);\n\n//const tagsRegx = new RegExp(\"<(\\\\/?[\\\\w:\\\\-\\._]+)([^>]*)>(\\\\s*\"+cdataRegx+\")*([^<]+)?\",\"g\");\n//const tagsRegx = new RegExp(\"<(\\\\/?)((\\\\w*:)?([\\\\w:\\\\-\\._]+))([^>]*)>([^<]*)(\"+cdataRegx+\"([^<]*))*([^<]+)?\",\"g\");\n\nclass OrderedObjParser{\n  constructor(options){\n    this.options = options;\n    this.currentNode = null;\n    this.tagsNodeStack = [];\n    this.docTypeEntities = {};\n    this.lastEntities = {\n      \"amp\" : { regex: /&(amp|#38|#x26);/g, val : \"&\"},\n      \"apos\" : { regex: /&(apos|#39|#x27);/g, val : \"'\"},\n      \"gt\" : { regex: /&(gt|#62|#x3E);/g, val : \">\"},\n      \"lt\" : { regex: /&(lt|#60|#x3C);/g, val : \"<\"},\n      \"quot\" : { regex: /&(quot|#34|#x22);/g, val : \"\\\"\"},\n    };\n    this.htmlEntities = {\n      \"space\": { regex: /&(nbsp|#160);/g, val: \" \" },\n      // \"lt\" : { regex: /&(lt|#60);/g, val: \"<\" },\n      // \"gt\" : { regex: /&(gt|#62);/g, val: \">\" },\n      // \"amp\" : { regex: /&(amp|#38);/g, val: \"&\" },\n      // \"quot\" : { regex: /&(quot|#34);/g, val: \"\\\"\" },\n      // \"apos\" : { regex: /&(apos|#39);/g, val: \"'\" },\n      \"cent\" : { regex: /&(cent|#162);/g, val: \"¢\" },\n      \"pound\" : { regex: /&(pound|#163);/g, val: \"£\" },\n      \"yen\" : { regex: /&(yen|#165);/g, val: \"¥\" },\n      \"euro\" : { regex: /&(euro|#8364);/g, val: \"€\" },\n      \"copyright\" : { regex: /&(copy|#169);/g, val: \"©\" },\n      \"reg\" : { regex: /&(reg|#174);/g, val: \"®\" },\n      \"inr\" : { regex: /&(inr|#8377);/g, val: \"₹\" },\n    };\n    this.addExternalEntities = addExternalEntities;\n    this.parseXml = parseXml;\n    this.parseTextData = parseTextData;\n    this.resolveNameSpace = resolveNameSpace;\n    this.buildAttributesMap = buildAttributesMap;\n    this.isItStopNode = isItStopNode;\n    this.replaceEntitiesValue = replaceEntitiesValue;\n    this.readStopNodeData = readStopNodeData;\n    this.saveTextToParentTag = saveTextToParentTag;\n  }\n\n}\n\nfunction addExternalEntities(externalEntities){\n  const entKeys = Object.keys(externalEntities);\n  for (let i = 0; i < entKeys.length; i++) {\n    const ent = entKeys[i];\n    this.lastEntities[ent] = {\n       regex: new RegExp(\"&\"+ent+\";\",\"g\"),\n       val : externalEntities[ent]\n    }\n  }\n}\n\n/**\n * @param {string} val\n * @param {string} tagName\n * @param {string} jPath\n * @param {boolean} dontTrim\n * @param {boolean} hasAttributes\n * @param {boolean} isLeafNode\n * @param {boolean} escapeEntities\n */\nfunction parseTextData(val, tagName, jPath, dontTrim, hasAttributes, isLeafNode, escapeEntities) {\n  if (val !== undefined) {\n    if (this.options.trimValues && !dontTrim) {\n      val = val.trim();\n    }\n    if(val.length > 0){\n      if(!escapeEntities) val = this.replaceEntitiesValue(val);\n      \n      const newval = this.options.tagValueProcessor(tagName, val, jPath, hasAttributes, isLeafNode);\n      if(newval === null || newval === undefined){\n        //don't parse\n        return val;\n      }else if(typeof newval !== typeof val || newval !== val){\n        //overwrite\n        return newval;\n      }else if(this.options.trimValues){\n        return parseValue(val, this.options.parseTagValue, this.options.numberParseOptions);\n      }else{\n        const trimmedVal = val.trim();\n        if(trimmedVal === val){\n          return parseValue(val, this.options.parseTagValue, this.options.numberParseOptions);\n        }else{\n          return val;\n        }\n      }\n    }\n  }\n}\n\nfunction resolveNameSpace(tagname) {\n  if (this.options.removeNSPrefix) {\n    const tags = tagname.split(':');\n    const prefix = tagname.charAt(0) === '/' ? '/' : '';\n    if (tags[0] === 'xmlns') {\n      return '';\n    }\n    if (tags.length === 2) {\n      tagname = prefix + tags[1];\n    }\n  }\n  return tagname;\n}\n\n//TODO: change regex to capture NS\n//const attrsRegx = new RegExp(\"([\\\\w\\\\-\\\\.\\\\:]+)\\\\s*=\\\\s*(['\\\"])((.|\\n)*?)\\\\2\",\"gm\");\nconst attrsRegx = new RegExp('([^\\\\s=]+)\\\\s*(=\\\\s*([\\'\"])([\\\\s\\\\S]*?)\\\\3)?', 'gm');\n\nfunction buildAttributesMap(attrStr, jPath) {\n  if (!this.options.ignoreAttributes && typeof attrStr === 'string') {\n    // attrStr = attrStr.replace(/\\r?\\n/g, ' ');\n    //attrStr = attrStr || attrStr.trim();\n\n    const matches = util.getAllMatches(attrStr, attrsRegx);\n    const len = matches.length; //don't make it inline\n    const attrs = {};\n    for (let i = 0; i < len; i++) {\n      const attrName = this.resolveNameSpace(matches[i][1]);\n      let oldVal = matches[i][4];\n      const aName = this.options.attributeNamePrefix + attrName;\n      if (attrName.length) {\n        if (oldVal !== undefined) {\n          if (this.options.trimValues) {\n            oldVal = oldVal.trim();\n          }\n          oldVal = this.replaceEntitiesValue(oldVal);\n          const newVal = this.options.attributeValueProcessor(attrName, oldVal, jPath);\n          if(newVal === null || newVal === undefined){\n            //don't parse\n            attrs[aName] = oldVal;\n          }else if(typeof newVal !== typeof oldVal || newVal !== oldVal){\n            //overwrite\n            attrs[aName] = newVal;\n          }else{\n            //parse\n            attrs[aName] = parseValue(\n              oldVal,\n              this.options.parseAttributeValue,\n              this.options.numberParseOptions\n            );\n          }\n        } else if (this.options.allowBooleanAttributes) {\n          attrs[aName] = true;\n        }\n      }\n    }\n    if (!Object.keys(attrs).length) {\n      return;\n    }\n    if (this.options.attributesGroupName) {\n      const attrCollection = {};\n      attrCollection[this.options.attributesGroupName] = attrs;\n      return attrCollection;\n    }\n    return attrs;\n  }\n}\n\nconst parseXml = function(xmlData) {\n  xmlData = xmlData.replace(/\\r\\n?/g, \"\\n\"); //TODO: remove this line\n  const xmlObj = new xmlNode('!xml');\n  let currentNode = xmlObj;\n  let textData = \"\";\n  let jPath = \"\";\n  for(let i=0; i< xmlData.length; i++){//for each char in XML data\n    const ch = xmlData[i];\n    if(ch === '<'){\n      // const nextIndex = i+1;\n      // const _2ndChar = xmlData[nextIndex];\n      if( xmlData[i+1] === '/') {//Closing Tag\n        const closeIndex = findClosingIndex(xmlData, \">\", i, \"Closing Tag is not closed.\")\n        let tagName = xmlData.substring(i+2,closeIndex).trim();\n\n        if(this.options.removeNSPrefix){\n          const colonIndex = tagName.indexOf(\":\");\n          if(colonIndex !== -1){\n            tagName = tagName.substr(colonIndex+1);\n          }\n        }\n\n        if(currentNode){\n          textData = this.saveTextToParentTag(textData, currentNode, jPath);\n        }\n\n        jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n        \n        currentNode = this.tagsNodeStack.pop();//avoid recurssion, set the parent tag scope\n        textData = \"\";\n        i = closeIndex;\n      } else if( xmlData[i+1] === '?') {\n\n        let tagData = readTagExp(xmlData,i, false, \"?>\");\n        if(!tagData) throw new Error(\"Pi Tag is not closed.\");\n\n        textData = this.saveTextToParentTag(textData, currentNode, jPath);\n        if( (this.options.ignoreDeclaration && tagData.tagName === \"?xml\") || this.options.ignorePiTags){\n\n        }else{\n  \n          const childNode = new xmlNode(tagData.tagName);\n          childNode.add(this.options.textNodeName, \"\");\n          \n          if(tagData.tagName !== tagData.tagExp && tagData.attrExpPresent){\n            childNode[\":@\"] = this.buildAttributesMap(tagData.tagExp, jPath);\n          }\n          currentNode.addChild(childNode);\n\n        }\n\n\n        i = tagData.closeIndex + 1;\n      } else if(xmlData.substr(i + 1, 3) === '!--') {\n        const endIndex = findClosingIndex(xmlData, \"-->\", i+4, \"Comment is not closed.\")\n        if(this.options.commentPropName){\n          const comment = xmlData.substring(i + 4, endIndex - 2);\n\n          textData = this.saveTextToParentTag(textData, currentNode, jPath);\n\n          currentNode.add(this.options.commentPropName, [ { [this.options.textNodeName] : comment } ]);\n        }\n        i = endIndex;\n      } else if( xmlData.substr(i + 1, 2) === '!D') {\n        const result = readDocType(xmlData, i);\n        this.docTypeEntities = result.entities;\n        i = result.i;\n      }else if(xmlData.substr(i + 1, 2) === '![') {\n        const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"CDATA is not closed.\") - 2;\n        const tagExp = xmlData.substring(i + 9,closeIndex);\n\n        textData = this.saveTextToParentTag(textData, currentNode, jPath);\n\n        //cdata should be set even if it is 0 length string\n        if(this.options.cdataPropName){\n          // let val = this.parseTextData(tagExp, this.options.cdataPropName, jPath + \".\" + this.options.cdataPropName, true, false, true);\n          // if(!val) val = \"\";\n          currentNode.add(this.options.cdataPropName, [ { [this.options.textNodeName] : tagExp } ]);\n        }else{\n          let val = this.parseTextData(tagExp, currentNode.tagname, jPath, true, false, true);\n          if(val == undefined) val = \"\";\n          currentNode.add(this.options.textNodeName, val);\n        }\n        \n        i = closeIndex + 2;\n      }else {//Opening tag\n       \n        let result = readTagExp(xmlData,i, this. options.removeNSPrefix);\n        let tagName= result.tagName;\n        let tagExp = result.tagExp;\n        let attrExpPresent = result.attrExpPresent;\n        let closeIndex = result.closeIndex;\n        \n        //save text as child node\n        if (currentNode && textData) {\n          if(currentNode.tagname !== '!xml'){\n            //when nested tag is found\n            textData = this.saveTextToParentTag(textData, currentNode, jPath, false);\n          }\n        }\n\n        if(tagName !== xmlObj.tagname){\n          jPath += jPath ? \".\" + tagName : tagName;\n        }\n\n        //check if last tag was unpaired tag\n        const lastTag = currentNode;\n        if(lastTag && this.options.unpairedTags.indexOf(lastTag.tagname) !== -1 ){\n          currentNode = this.tagsNodeStack.pop();\n        }\n\n        if (this.isItStopNode(this.options.stopNodes, jPath, tagName)) { //TODO: namespace\n          let tagContent = \"\";\n          //self-closing tag\n          if(tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1){\n            i = result.closeIndex;\n          }\n          //boolean tag\n          else if(this.options.unpairedTags.indexOf(tagName) !== -1){\n            i = result.closeIndex;\n          }\n          //normal tag\n          else{\n            //read until closing tag is found\n            const result = this.readStopNodeData(xmlData, tagName, closeIndex + 1);\n            if(!result) throw new Error(`Unexpected end of ${tagName}`);\n            i = result.i;\n            tagContent = result.tagContent;\n          }\n\n          const childNode = new xmlNode(tagName);\n          if(tagName !== tagExp && attrExpPresent){\n            childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath);\n          }\n          if(tagContent) {\n            tagContent = this.parseTextData(tagContent, tagName, jPath, true, attrExpPresent, true, true);\n          }\n          \n          jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n          childNode.add(this.options.textNodeName, tagContent);\n          \n          currentNode.addChild(childNode);\n        }else{\n  //selfClosing tag\n          if(tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1){\n            if(tagName[tagName.length - 1] === \"/\"){ //remove trailing '/'\n              tagName = tagName.substr(0, tagName.length - 1);\n              tagExp = tagName;\n            }else{\n              tagExp = tagExp.substr(0, tagExp.length - 1);\n            }\n\n            const childNode = new xmlNode(tagName);\n            if(tagName !== tagExp && attrExpPresent){\n              childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath);\n            }\n            jPath = jPath.substr(0, jPath.lastIndexOf(\".\"));\n            currentNode.addChild(childNode);\n          }\n    //opening tag\n          else{\n            const childNode = new xmlNode( tagName);\n            this.tagsNodeStack.push(currentNode);\n            \n            if(tagName !== tagExp && attrExpPresent){\n              childNode[\":@\"] = this.buildAttributesMap(tagExp, jPath);\n            }\n            currentNode.addChild(childNode);\n            currentNode = childNode;\n          }\n          textData = \"\";\n          i = closeIndex;\n        }\n      }\n    }else{\n      textData += xmlData[i];\n    }\n  }\n  return xmlObj.child;\n}\n\nconst replaceEntitiesValue = function(val){\n  if(this.options.processEntities){\n    for(let entityName in this.docTypeEntities){\n      const entity = this.docTypeEntities[entityName];\n      val = val.replace( entity.regx, entity.val);\n    }\n    for(let entityName in this.lastEntities){\n      const entity = this.lastEntities[entityName];\n      val = val.replace( entity.regex, entity.val);\n    }\n    if(this.options.htmlEntities){\n      for(let entityName in this.htmlEntities){\n        const entity = this.htmlEntities[entityName];\n        val = val.replace( entity.regex, entity.val);\n      }\n    }\n  }\n  return val;\n}\nfunction saveTextToParentTag(textData, currentNode, jPath, isLeafNode) {\n  if (textData) { //store previously collected data as textNode\n    if(isLeafNode === undefined) isLeafNode = Object.keys(currentNode.child).length === 0\n    \n    textData = this.parseTextData(textData,\n      currentNode.tagname,\n      jPath,\n      false,\n      currentNode[\":@\"] ? Object.keys(currentNode[\":@\"]).length !== 0 : false,\n      isLeafNode);\n\n    if (textData !== undefined && textData !== \"\")\n      currentNode.add(this.options.textNodeName, textData);\n    textData = \"\";\n  }\n  return textData;\n}\n\n//TODO: use jPath to simplify the logic\n/**\n * \n * @param {string[]} stopNodes \n * @param {string} jPath\n * @param {string} currentTagName \n */\nfunction isItStopNode(stopNodes, jPath, currentTagName){\n  const allNodesExp = \"*.\" + currentTagName;\n  for (const stopNodePath in stopNodes) {\n    const stopNodeExp = stopNodes[stopNodePath];\n    if( allNodesExp === stopNodeExp || jPath === stopNodeExp  ) return true;\n  }\n  return false;\n}\n\n/**\n * Returns the tag Expression and where it is ending handling single-dobule quotes situation\n * @param {string} xmlData \n * @param {number} i starting index\n * @returns \n */\nfunction tagExpWithClosingIndex(xmlData, i, closingChar = \">\"){\n  let attrBoundary;\n  let tagExp = \"\";\n  for (let index = i; index < xmlData.length; index++) {\n    let ch = xmlData[index];\n    if (attrBoundary) {\n        if (ch === attrBoundary) attrBoundary = \"\";//reset\n    } else if (ch === '\"' || ch === \"'\") {\n        attrBoundary = ch;\n    } else if (ch === closingChar[0]) {\n      if(closingChar[1]){\n        if(xmlData[index + 1] === closingChar[1]){\n          return {\n            data: tagExp,\n            index: index\n          }\n        }\n      }else{\n        return {\n          data: tagExp,\n          index: index\n        }\n      }\n    } else if (ch === '\\t') {\n      ch = \" \"\n    }\n    tagExp += ch;\n  }\n}\n\nfunction findClosingIndex(xmlData, str, i, errMsg){\n  const closingIndex = xmlData.indexOf(str, i);\n  if(closingIndex === -1){\n    throw new Error(errMsg)\n  }else{\n    return closingIndex + str.length - 1;\n  }\n}\n\nfunction readTagExp(xmlData,i, removeNSPrefix, closingChar = \">\"){\n  const result = tagExpWithClosingIndex(xmlData, i+1, closingChar);\n  if(!result) return;\n  let tagExp = result.data;\n  const closeIndex = result.index;\n  const separatorIndex = tagExp.search(/\\s/);\n  let tagName = tagExp;\n  let attrExpPresent = true;\n  if(separatorIndex !== -1){//separate tag name and attributes expression\n    tagName = tagExp.substr(0, separatorIndex).replace(/\\s\\s*$/, '');\n    tagExp = tagExp.substr(separatorIndex + 1);\n  }\n\n  if(removeNSPrefix){\n    const colonIndex = tagName.indexOf(\":\");\n    if(colonIndex !== -1){\n      tagName = tagName.substr(colonIndex+1);\n      attrExpPresent = tagName !== result.data.substr(colonIndex + 1);\n    }\n  }\n\n  return {\n    tagName: tagName,\n    tagExp: tagExp,\n    closeIndex: closeIndex,\n    attrExpPresent: attrExpPresent,\n  }\n}\n/**\n * find paired tag for a stop node\n * @param {string} xmlData \n * @param {string} tagName \n * @param {number} i \n */\nfunction readStopNodeData(xmlData, tagName, i){\n  const startIndex = i;\n  // Starting at 1 since we already have an open tag\n  let openTagCount = 1;\n\n  for (; i < xmlData.length; i++) {\n    if( xmlData[i] === \"<\"){ \n      if (xmlData[i+1] === \"/\") {\n          const closeIndex = findClosingIndex(xmlData, \">\", i, `${tagName} is not closed`);\n          let closeTagName = xmlData.substring(i+2,closeIndex).trim();\n          if(closeTagName === tagName){\n            openTagCount--;\n            if (openTagCount === 0) {\n              return {\n                tagContent: xmlData.substring(startIndex, i),\n                i : closeIndex\n              }\n            }\n          }\n          i=closeIndex;\n        } else {\n          const tagData = readTagExp(xmlData, i, '>')\n\n          if (tagData) {\n            const openTagName = tagData && tagData.tagName;\n            if (openTagName === tagName) {\n              openTagCount++;\n            }\n            i=tagData.closeIndex;\n          }\n        }\n      }\n  }//end for loop\n}\n\nfunction parseValue(val, shouldParse, options) {\n  if (shouldParse && typeof val === 'string') {\n    //console.log(options)\n    const newval = val.trim();\n    if(newval === 'true' ) return true;\n    else if(newval === 'false' ) return false;\n    else return toNumber(val, options);\n  } else {\n    if (util.isExist(val)) {\n      return val;\n    } else {\n      return '';\n    }\n  }\n}\n\n\nmodule.exports = OrderedObjParser;\n","const { buildOptions} = require(\"./OptionsBuilder\");\nconst OrderedObjParser = require(\"./OrderedObjParser\");\nconst { prettify} = require(\"./node2json\");\nconst validator = require('../validator');\n\nclass XMLParser{\n    \n    constructor(options){\n        this.externalEntities = {};\n        this.options = buildOptions(options);\n        \n    }\n    /**\n     * Parse XML dats to JS object \n     * @param {string|Buffer} xmlData \n     * @param {boolean|Object} validationOption \n     */\n    parse(xmlData,validationOption){\n        if(typeof xmlData === \"string\"){\n        }else if( xmlData.toString){\n            xmlData = xmlData.toString();\n        }else{\n            throw new Error(\"XML data is accepted in String or Bytes[] form.\")\n        }\n        if( validationOption){\n            if(validationOption === true) validationOption = {}; //validate with default options\n            \n            const result = validator.validate(xmlData, validationOption);\n            if (result !== true) {\n              throw Error( `${result.err.msg}:${result.err.line}:${result.err.col}` )\n            }\n          }\n        const orderedObjParser = new OrderedObjParser(this.options);\n        orderedObjParser.addExternalEntities(this.externalEntities);\n        const orderedResult = orderedObjParser.parseXml(xmlData);\n        if(this.options.preserveOrder || orderedResult === undefined) return orderedResult;\n        else return prettify(orderedResult, this.options);\n    }\n\n    /**\n     * Add Entity which is not by default supported by this library\n     * @param {string} key \n     * @param {string} value \n     */\n    addEntity(key, value){\n        if(value.indexOf(\"&\") !== -1){\n            throw new Error(\"Entity value can't have '&'\")\n        }else if(key.indexOf(\"&\") !== -1 || key.indexOf(\";\") !== -1){\n            throw new Error(\"An entity must be set without '&' and ';'. Eg. use '#xD' for '&#xD;'\")\n        }else{\n            this.externalEntities[key] = value;\n        }\n    }\n}\n\nmodule.exports = XMLParser;","'use strict';\n\n/**\n * \n * @param {array} node \n * @param {any} options \n * @returns \n */\nfunction prettify(node, options){\n  return compress( node, options);\n}\n\n/**\n * \n * @param {array} arr \n * @param {object} options \n * @param {string} jPath \n * @returns object\n */\nfunction compress(arr, options, jPath){\n  let text;\n  const compressedObj = {};\n  for (let i = 0; i < arr.length; i++) {\n    const tagObj = arr[i];\n    const property = propName(tagObj);\n    let newJpath = \"\";\n    if(jPath === undefined) newJpath = property;\n    else newJpath = jPath + \".\" + property;\n\n    if(property === options.textNodeName){\n      if(text === undefined) text = tagObj[property];\n      else text += \"\" + tagObj[property];\n    }else if(property === undefined){\n      continue;\n    }else if(tagObj[property]){\n      \n      let val = compress(tagObj[property], options, newJpath);\n      const isLeaf = isLeafTag(val, options);\n\n      if(tagObj[\":@\"]){\n        assignAttributes( val, tagObj[\":@\"], newJpath, options);\n      }else if(Object.keys(val).length === 1 && val[options.textNodeName] !== undefined && !options.alwaysCreateTextNode){\n        val = val[options.textNodeName];\n      }else if(Object.keys(val).length === 0){\n        if(options.alwaysCreateTextNode) val[options.textNodeName] = \"\";\n        else val = \"\";\n      }\n\n      if(compressedObj[property] !== undefined && compressedObj.hasOwnProperty(property)) {\n        if(!Array.isArray(compressedObj[property])) {\n            compressedObj[property] = [ compressedObj[property] ];\n        }\n        compressedObj[property].push(val);\n      }else{\n        //TODO: if a node is not an array, then check if it should be an array\n        //also determine if it is a leaf node\n        if (options.isArray(property, newJpath, isLeaf )) {\n          compressedObj[property] = [val];\n        }else{\n          compressedObj[property] = val;\n        }\n      }\n    }\n    \n  }\n  // if(text && text.length > 0) compressedObj[options.textNodeName] = text;\n  if(typeof text === \"string\"){\n    if(text.length > 0) compressedObj[options.textNodeName] = text;\n  }else if(text !== undefined) compressedObj[options.textNodeName] = text;\n  return compressedObj;\n}\n\nfunction propName(obj){\n  const keys = Object.keys(obj);\n  for (let i = 0; i < keys.length; i++) {\n    const key = keys[i];\n    if(key !== \":@\") return key;\n  }\n}\n\nfunction assignAttributes(obj, attrMap, jpath, options){\n  if (attrMap) {\n    const keys = Object.keys(attrMap);\n    const len = keys.length; //don't make it inline\n    for (let i = 0; i < len; i++) {\n      const atrrName = keys[i];\n      if (options.isArray(atrrName, jpath + \".\" + atrrName, true, true)) {\n        obj[atrrName] = [ attrMap[atrrName] ];\n      } else {\n        obj[atrrName] = attrMap[atrrName];\n      }\n    }\n  }\n}\n\nfunction isLeafTag(obj, options){\n  const propCount = Object.keys(obj).length;\n  if( propCount === 0 || (propCount === 1 && obj[options.textNodeName]) ) return true;\n  return false;\n}\nexports.prettify = prettify;\n","'use strict';\n\nclass XmlNode{\n  constructor(tagname) {\n    this.tagname = tagname;\n    this.child = []; //nested tags, text, cdata, comments in order\n    this[\":@\"] = {}; //attributes map\n  }\n  add(key,val){\n    // this.child.push( {name : key, val: val, isCdata: isCdata });\n    this.child.push( {[key]: val });\n  }\n  addChild(node) {\n    if(node[\":@\"] && Object.keys(node[\":@\"]).length > 0){\n      this.child.push( { [node.tagname]: node.child, [\":@\"]: node[\":@\"] });\n    }else{\n      this.child.push( { [node.tagname]: node.child });\n    }\n  };\n};\n\n\nmodule.exports = XmlNode;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(870);\n"],"names":["hexRegex","numRegex","Number","parseInt","window","parseFloat","consider","hex","leadingZeros","decimalPoint","eNotation","module","exports","str","options","Object","assign","trimmedStr","trim","undefined","skipLike","test","match","exec","sign","numTrimmedByZeros","numStr","indexOf","replace","length","substr","num","search","nameRegexp","regexName","RegExp","isExist","v","isEmptyObject","obj","keys","merge","target","a","arrayMode","len","i","getValue","isName","string","getAllMatches","regex","matches","allmatches","startIndex","lastIndex","index","push","util","require","defaultOptions","allowBooleanAttributes","unpairedTags","isWhiteSpace","char","readPI","xmlData","start","tagname","getErrorObject","getLineNumberForPosition","readCommentAndCDATA","angleBracketsCount","readAttributeStr","attrStr","startChar","tagClosed","value","validate","tags","tagFound","reachedRoot","err","tagStartPos","closingTag","tagName","substring","result","attrStrStart","isValid","validateAttributeString","code","msg","line","otg","pop","openPos","col","afterAmp","validateAmpersand","JSON","stringify","map","t","validAttrStrRegxp","attrNames","getPositionFromMatch","attrName","validateAttrName","hasOwnProperty","re","validateNumberAmpersand","count","message","lineNumber","lines","split","entityRegex","parseEntityExp","exp","entities","regx","val","Error","hasBody","entity","comment","preserveOrder","attributeNamePrefix","attributesGroupName","textNodeName","ignoreAttributes","removeNSPrefix","parseTagValue","parseAttributeValue","trimValues","cdataPropName","numberParseOptions","tagValueProcessor","attributeValueProcessor","stopNodes","alwaysCreateTextNode","isArray","commentPropName","processEntities","htmlEntities","ignoreDeclaration","ignorePiTags","buildOptions","xmlNode","readDocType","toNumber","addExternalEntities","externalEntities","entKeys","ent","this","lastEntities","parseTextData","jPath","dontTrim","hasAttributes","isLeafNode","escapeEntities","replaceEntitiesValue","newval","parseValue","resolveNameSpace","prefix","charAt","attrsRegx","buildAttributesMap","attrs","oldVal","aName","newVal","attrCollection","parseXml","xmlObj","currentNode","textData","closeIndex","findClosingIndex","colonIndex","saveTextToParentTag","lastIndexOf","tagsNodeStack","tagData","readTagExp","childNode","add","tagExp","attrExpPresent","addChild","endIndex","docTypeEntities","lastTag","isItStopNode","tagContent","readStopNodeData","child","entityName","currentTagName","allNodesExp","stopNodePath","stopNodeExp","errMsg","closingIndex","closingChar","attrBoundary","ch","data","tagExpWithClosingIndex","separatorIndex","openTagCount","shouldParse","OrderedObjParser","prettify","validator","XMLParser","parse","validationOption","toString","orderedObjParser","orderedResult","addEntity","key","compress","arr","text","compressedObj","newJpath","tagObj","property","propName","isLeaf","isLeafTag","assignAttributes","Array","attrMap","jpath","atrrName","propCount","node","XmlNode","__webpack_module_cache__","__webpack_exports__","__webpack_require__","moduleId","cachedModule","__webpack_modules__"],"sourceRoot":""}