UNPKG

opennms

Version:

Client API for the OpenNMS network monitoring platform

1 lines 66.2 kB
{"remainingRequest":"/data/node_modules/babel-loader/lib/index.js!/data/node_modules/ip-address/lib/ipv6.js","dependencies":[{"path":"/data/node_modules/ip-address/lib/ipv6.js","mtime":1553611387160},{"path":"/data/.babelrc","mtime":1553611371556},{"path":"/data/node_modules/cache-loader/dist/cjs.js","mtime":1553611387012},{"path":"/data/node_modules/babel-loader/lib/index.js","mtime":1553611386992}],"contextDependencies":[],"result":["'use strict';\n\nvar BigInteger = require('jsbn').BigInteger;\nvar find = require('lodash.find');\nvar max = require('lodash.max');\nvar merge = require('lodash.merge');\nvar padStart = require('lodash.padstart');\nvar repeat = require('lodash.repeat');\nvar sprintf = require('sprintf-js').sprintf;\n\nvar constants4 = require('./v4/constants.js');\nvar constants6 = require('./v6/constants.js');\n\nvar Address4 = require('./ipv4.js');\n\nfunction addCommas(number) {\n var r = /(\\d+)(\\d{3})/;\n\n while (r.test(number)) {\n number = number.replace(r, '$1,$2');\n }\n\n return number;\n}\n\nfunction spanLeadingZeroes4(n) {\n n = n.replace(/^(0{1,})([1-9]+)$/, '<span class=\"parse-error\">$1</span>$2');\n n = n.replace(/^(0{1,})(0)$/, '<span class=\"parse-error\">$1</span>$2');\n\n return n;\n}\n\n/**\n * Represents an IPv6 address\n * @class Address6\n * @param {string} address - An IPv6 address string\n * @param {number} [groups=8] - How many octets to parse\n * @example\n * var address = new Address6('2001::/32');\n */\nfunction Address6(address, optionalGroups) {\n if (optionalGroups === undefined) {\n this.groups = constants6.GROUPS;\n } else {\n this.groups = optionalGroups;\n }\n\n this.v4 = false;\n\n this.subnet = '/128';\n this.subnetMask = 128;\n\n this.zone = '';\n\n this.address = address;\n\n var subnet = constants6.RE_SUBNET_STRING.exec(address);\n\n if (subnet) {\n this.parsedSubnet = subnet[0].replace('/', '');\n this.subnetMask = parseInt(this.parsedSubnet, 10);\n this.subnet = '/' + this.subnetMask;\n\n if (isNaN(this.subnetMask) || this.subnetMask < 0 || this.subnetMask > constants6.BITS) {\n this.valid = false;\n this.error = 'Invalid subnet mask.';\n\n return;\n }\n\n address = address.replace(constants6.RE_SUBNET_STRING, '');\n } else if (/\\//.test(address)) {\n this.valid = false;\n this.error = 'Invalid subnet mask.';\n\n return;\n }\n\n var zone = constants6.RE_ZONE_STRING.exec(address);\n\n if (zone) {\n this.zone = zone[0];\n\n address = address.replace(constants6.RE_ZONE_STRING, '');\n }\n\n this.addressMinusSuffix = address;\n\n this.parsedAddress = this.parse(this.addressMinusSuffix);\n}\n\nmerge(Address6.prototype, require('./v6/attributes.js'));\nmerge(Address6.prototype, require('./v6/html.js'));\nmerge(Address6.prototype, require('./v6/regular-expressions.js'));\n\n/**\n * Convert a BigInteger to a v6 address object\n * @memberof Address6\n * @static\n * @param {BigInteger} bigInteger - a BigInteger to convert\n * @returns {Address6}\n * @example\n * var bigInteger = new BigInteger('1000000000000');\n * var address = Address6.fromBigInteger(bigInteger);\n * address.correctForm(); // '::e8:d4a5:1000'\n */\nAddress6.fromBigInteger = function (bigInteger) {\n var hex = padStart(bigInteger.toString(16), 32, '0');\n var groups = [];\n var i;\n\n for (i = 0; i < constants6.GROUPS; i++) {\n groups.push(hex.slice(i * 4, (i + 1) * 4));\n }\n\n return new Address6(groups.join(':'));\n};\n\n/**\n * Convert a URL (with optional port number) to an address object\n * @memberof Address6\n * @static\n * @param {string} url - a URL with optional port number\n * @returns {Address6}\n * @example\n * var addressAndPort = Address6.fromURL('http://[ffff::]:8080/foo/');\n * addressAndPort.address.correctForm(); // 'ffff::'\n * addressAndPort.port; // 8080\n */\nAddress6.fromURL = function (url) {\n var host;\n var port;\n var result;\n\n // If we have brackets parse them and find a port\n if (url.indexOf('[') !== -1 && url.indexOf(']:') !== -1) {\n result = constants6.RE_URL_WITH_PORT.exec(url);\n\n if (result === null) {\n return {\n error: 'failed to parse address with port',\n address: null,\n port: null\n };\n }\n\n host = result[1];\n port = result[2];\n // If there's a URL extract the address\n } else if (url.indexOf('/') !== -1) {\n // Remove the protocol prefix\n url = url.replace(/^[a-z0-9]+:\\/\\//, '');\n\n // Parse the address\n result = constants6.RE_URL.exec(url);\n\n if (result === null) {\n return {\n error: 'failed to parse address from URL',\n address: null,\n port: null\n };\n }\n\n host = result[1];\n // Otherwise just assign the URL to the host and let the library parse it\n } else {\n host = url;\n }\n\n // If there's a port convert it to an integer\n if (port) {\n port = parseInt(port, 10);\n\n //squelch out of range ports\n if (port < 0 || port > 65536) {\n port = null;\n }\n } else {\n // Standardize `undefined` to `null`\n port = null;\n }\n\n return {\n address: new Address6(host),\n port: port\n };\n};\n\n/**\n * Create an IPv6-mapped address given an IPv4 address\n * @memberof Address6\n * @static\n * @param {string} address - An IPv4 address string\n * @returns {Address6}\n * @example\n * var address = Address6.fromAddress4('192.168.0.1');\n * address.correctForm(); // '::ffff:c0a8:1'\n * address.to4in6(); // '::ffff:192.168.0.1'\n */\nAddress6.fromAddress4 = function (address4) {\n var address4 = new Address4(address4);\n\n var mask6 = constants6.BITS - (constants4.BITS - address4.subnetMask);\n\n return new Address6('::ffff:' + address4.correctForm() + '/' + mask6);\n};\n\n/**\n * Return an address from ip6.arpa form\n * @memberof Address6\n * @static\n * @param {string} arpaFormAddress - an 'ip6.arpa' form address \n * @returns {Adress6}\n * @example\n * var address = Address6.fromArpa(e.f.f.f.3.c.2.6.f.f.f.e.6.6.8.e.1.0.6.7.9.4.e.c.0.0.0.0.1.0.0.2.ip6.arpa.)\n * address.correctForm(); // '2001:0:ce49:7601:e866:efff:62c3:fffe'\n */\nAddress6.fromArpa = function (arpaFormAddress) {\n //remove ending \".ip6.arpa.\" or just \".\"\n var address = arpaFormAddress.replace(/(\\.ip6\\.arpa)?\\.$/, '');\n var semicolonAmount = 7;\n\n //correct ip6.arpa form with ending removed will be 63 characters\n if (address.length !== 63) {\n address = {\n error: \"Not Valid 'ip6.arpa' form\",\n address: null\n };\n return address;\n }\n\n address = address.split('.').reverse();\n\n for (var i = semicolonAmount; i > 0; i--) {\n var insertIndex = i * 4;\n address.splice(insertIndex, 0, ':');\n }\n\n address = address.join('');\n return new Address6(address);\n};\n\n/*\n * A helper function to compact an array\n */\nfunction compact(address, slice) {\n var s1 = [];\n var s2 = [];\n var i;\n\n for (i = 0; i < address.length; i++) {\n if (i < slice[0]) {\n s1.push(address[i]);\n } else if (i > slice[1]) {\n s2.push(address[i]);\n }\n }\n\n return s1.concat(['compact']).concat(s2);\n}\n\n/**\n * Return the Microsoft UNC transcription of the address\n * @memberof Address6\n * @instance\n * @returns {String} the Microsoft UNC transcription of the address\n */\nAddress6.prototype.microsoftTranscription = function () {\n return sprintf('%s.ipv6-literal.net', this.correctForm().replace(/:/g, '-'));\n};\n\n/**\n * Return the first n bits of the address, defaulting to the subnet mask\n * @memberof Address6\n * @instance\n * @param {number} [mask=subnet] - the number of bits to mask\n * @returns {String} the first n bits of the address as a string\n */\nAddress6.prototype.mask = function (optionalMask) {\n if (optionalMask === undefined) {\n optionalMask = this.subnetMask;\n }\n\n return this.getBitsBase2(0, optionalMask);\n};\n\n/**\n * Return the number of possible subnets of a given size in the address\n * @memberof Address6\n * @instance\n * @param {number} [size=128] - the subnet size\n * @returns {String}\n */\n// TODO: probably useful to have a numeric version of this too\nAddress6.prototype.possibleSubnets = function (optionalSubnetSize) {\n if (optionalSubnetSize === undefined) {\n optionalSubnetSize = 128;\n }\n\n var availableBits = constants6.BITS - this.subnetMask;\n var subnetBits = Math.abs(optionalSubnetSize - constants6.BITS);\n var subnetPowers = availableBits - subnetBits;\n\n if (subnetPowers < 0) {\n return '0';\n }\n\n return addCommas(new BigInteger('2', 10).pow(subnetPowers).toString(10));\n};\n\n/**\n * The first address in the range given by this address' subnet\n * @memberof Address6\n * @instance\n * @returns {Address6}\n */\nAddress6.prototype.startAddress = function () {\n var startAddress = new BigInteger(this.mask() + repeat(0, constants6.BITS - this.subnetMask), 2);\n\n return Address6.fromBigInteger(startAddress);\n};\n\n/**\n * The last address in the range given by this address' subnet\n * @memberof Address6\n * @instance\n * @returns {Address6}\n */\nAddress6.prototype.endAddress = function () {\n var endAddress = new BigInteger(this.mask() + repeat(1, constants6.BITS - this.subnetMask), 2);\n\n return Address6.fromBigInteger(endAddress);\n};\n\n/**\n * Return the scope of the address\n * @memberof Address6\n * @instance\n * @returns {String}\n */\nAddress6.prototype.getScope = function () {\n var scope = constants6.SCOPES[this.getBits(12, 16)];\n\n if (this.getType() === 'Global unicast' && scope !== 'Link local') {\n scope = 'Global';\n }\n\n return scope;\n};\n\n/**\n * Return the type of the address\n * @memberof Address6\n * @instance\n * @returns {String}\n */\nAddress6.prototype.getType = function () {\n var self = this;\n\n function isType(name, type) {\n return self.isInSubnet(new Address6(type));\n }\n\n return find(constants6.TYPES, isType) || 'Global unicast';\n};\n\n/**\n * Return the bits in the given range as a BigInteger\n * @memberof Address6\n * @instance\n * @returns {BigInteger}\n */\nAddress6.prototype.getBits = function (start, end) {\n return new BigInteger(this.getBitsBase2(start, end), 2);\n};\n\n/**\n * Return the bits in the given range as a base-2 string\n * @memberof Address6\n * @instance\n * @returns {String}\n */\nAddress6.prototype.getBitsBase2 = function (start, end) {\n return this.binaryZeroPad().slice(start, end);\n};\n\n/**\n * Return the bits in the given range as a base-16 string\n * @memberof Address6\n * @instance\n * @returns {String}\n */\nAddress6.prototype.getBitsBase16 = function (start, end) {\n var length = end - start;\n\n if (length % 4 !== 0) {\n return null;\n }\n\n return padStart(this.getBits(start, end).toString(16), length / 4, '0');\n};\n\n/**\n * Return the bits that are set past the subnet mask length\n * @memberof Address6\n * @instance\n * @returns {String}\n */\nAddress6.prototype.getBitsPastSubnet = function () {\n return this.getBitsBase2(this.subnetMask, constants6.BITS);\n};\n\n/**\n * Return the reversed ip6.arpa form of the address\n * @memberof Address6\n * @param {Object} options\n * @param {boolean} options.omitSuffix - omit the \"ip6.arpa\" suffix\n * @instance\n * @returns {String}\n */\nAddress6.prototype.reverseForm = function (options) {\n if (!options) {\n options = {};\n }\n\n var characters = Math.floor(this.subnetMask / 4);\n\n var reversed = this.canonicalForm().replace(/:/g, '').split('').slice(0, characters).reverse().join('.');\n\n if (characters > 0) {\n if (options.omitSuffix) {\n return reversed;\n }\n\n return sprintf('%s.ip6.arpa.', reversed);\n }\n\n if (options.omitSuffix) {\n return '';\n }\n\n return 'ip6.arpa.';\n};\n\n/**\n * Return the correct form of the address\n * @memberof Address6\n * @instance\n * @returns {String}\n */\nAddress6.prototype.correctForm = function () {\n if (!this.parsedAddress) {\n return null;\n }\n\n var i;\n var groups = [];\n\n var zeroCounter = 0;\n var zeroes = [];\n\n for (i = 0; i < this.parsedAddress.length; i++) {\n var value = parseInt(this.parsedAddress[i], 16);\n\n if (value === 0) {\n zeroCounter++;\n }\n\n if (value !== 0 && zeroCounter > 0) {\n if (zeroCounter > 1) {\n zeroes.push([i - zeroCounter, i - 1]);\n }\n\n zeroCounter = 0;\n }\n }\n\n // Do we end with a string of zeroes?\n if (zeroCounter > 1) {\n zeroes.push([this.parsedAddress.length - zeroCounter, this.parsedAddress.length - 1]);\n }\n\n var zeroLengths = zeroes.map(function (n) {\n return n[1] - n[0] + 1;\n });\n\n if (zeroes.length > 0) {\n var index = zeroLengths.indexOf(max(zeroLengths));\n\n groups = compact(this.parsedAddress, zeroes[index]);\n } else {\n groups = this.parsedAddress;\n }\n\n for (i = 0; i < groups.length; i++) {\n if (groups[i] !== 'compact') {\n groups[i] = parseInt(groups[i], 16).toString(16);\n }\n }\n\n var correct = groups.join(':');\n\n correct = correct.replace(/^compact$/, '::');\n correct = correct.replace(/^compact|compact$/, ':');\n correct = correct.replace(/compact/, '');\n\n return correct;\n};\n\n/**\n * Return a zero-padded base-2 string representation of the address\n * @memberof Address6\n * @instance\n * @returns {String}\n * @example\n * var address = new Address6('2001:4860:4001:803::1011');\n * address.binaryZeroPad();\n * // '0010000000000001010010000110000001000000000000010000100000000011\n * // 0000000000000000000000000000000000000000000000000001000000010001'\n */\nAddress6.prototype.binaryZeroPad = function () {\n return padStart(this.bigInteger().toString(2), constants6.BITS, '0');\n};\n\n// TODO: Improve the semantics of this helper function\nAddress6.prototype.parse4in6 = function (address) {\n var groups = address.split(':');\n var lastGroup = groups.slice(-1)[0];\n\n var address4 = lastGroup.match(constants4.RE_ADDRESS);\n\n if (address4) {\n var temp4 = new Address4(address4[0]);\n\n for (var i = 0; i < temp4.groups; i++) {\n if (/^0[0-9]+/.test(temp4.parsedAddress[i])) {\n this.valid = false;\n this.error = 'IPv4 addresses can not have leading zeroes.';\n\n this.parseError = address.replace(constants4.RE_ADDRESS, temp4.parsedAddress.map(spanLeadingZeroes4).join('.'));\n\n return null;\n }\n }\n\n this.v4 = true;\n\n groups[groups.length - 1] = temp4.toGroup6();\n\n address = groups.join(':');\n }\n\n return address;\n};\n\n// TODO: Make private?\nAddress6.prototype.parse = function (address) {\n address = this.parse4in6(address);\n\n if (this.error) {\n return null;\n }\n\n var badCharacters = address.match(constants6.RE_BAD_CHARACTERS);\n\n if (badCharacters) {\n this.valid = false;\n this.error = sprintf('Bad character%s detected in address: %s', badCharacters.length > 1 ? 's' : '', badCharacters.join(''));\n\n this.parseError = address.replace(constants6.RE_BAD_CHARACTERS, '<span class=\"parse-error\">$1</span>');\n\n return null;\n }\n\n var badAddress = address.match(constants6.RE_BAD_ADDRESS);\n\n if (badAddress) {\n this.valid = false;\n this.error = sprintf('Address failed regex: %s', badAddress.join(''));\n\n this.parseError = address.replace(constants6.RE_BAD_ADDRESS, '<span class=\"parse-error\">$1</span>');\n\n return null;\n }\n\n var groups = [];\n\n var halves = address.split('::');\n\n if (halves.length === 2) {\n var first = halves[0].split(':');\n var last = halves[1].split(':');\n\n if (first.length === 1 && first[0] === '') {\n first = [];\n }\n\n if (last.length === 1 && last[0] === '') {\n last = [];\n }\n\n var remaining = this.groups - (first.length + last.length);\n\n if (!remaining) {\n this.valid = false;\n this.error = 'Error parsing groups';\n\n return null;\n }\n\n this.elidedGroups = remaining;\n\n this.elisionBegin = first.length;\n this.elisionEnd = first.length + this.elidedGroups;\n\n first.forEach(function (group) {\n groups.push(group);\n });\n\n for (var i = 0; i < remaining; i++) {\n groups.push(0);\n }\n\n last.forEach(function (group) {\n groups.push(group);\n });\n } else if (halves.length === 1) {\n groups = address.split(':');\n\n this.elidedGroups = 0;\n } else {\n this.valid = false;\n this.error = 'Too many :: groups found';\n\n return null;\n }\n\n groups = groups.map(function (g) {\n return sprintf('%x', parseInt(g, 16));\n });\n\n if (groups.length !== this.groups) {\n this.valid = false;\n this.error = 'Incorrect number of groups found';\n\n return null;\n }\n\n this.valid = true;\n\n return groups;\n};\n\nfunction paddedHex(octet) {\n return sprintf('%04x', parseInt(octet, 16));\n}\n\n/**\n * Return the canonical form of the address\n * @memberof Address6\n * @instance\n * @returns {String}\n */\nAddress6.prototype.canonicalForm = function () {\n if (!this.valid) {\n return null;\n }\n\n return this.parsedAddress.map(paddedHex).join(':');\n};\n\n/**\n * Return the decimal form of the address\n * @memberof Address6\n * @instance\n * @returns {String}\n */\nAddress6.prototype.decimal = function () {\n if (!this.valid) {\n return null;\n }\n\n return this.parsedAddress.map(function (n) {\n return sprintf('%05d', parseInt(n, 16));\n }).join(':');\n};\n\n/**\n * Return the address as a BigInteger\n * @memberof Address6\n * @instance\n * @returns {BigInteger}\n */\nAddress6.prototype.bigInteger = function () {\n if (!this.valid) {\n return null;\n }\n\n return new BigInteger(this.parsedAddress.map(paddedHex).join(''), 16);\n};\n\n/**\n * Return the last two groups of this address as an IPv4 address string\n * @memberof Address6\n * @instance\n * @returns {String}\n * @example\n * var address = new Address6('2001:4860:4001::1825:bf11');\n * address.to4(); // '24.37.191.17'\n */\nAddress6.prototype.to4 = function () {\n var binary = this.binaryZeroPad().split('');\n\n return Address4.fromHex(new BigInteger(binary.slice(96, 128).join(''), 2).toString(16));\n};\n\n/**\n * Return the v4-in-v6 form of the address\n * @memberof Address6\n * @instance\n * @returns {String}\n */\nAddress6.prototype.to4in6 = function () {\n var address4 = this.to4();\n var address6 = new Address6(this.parsedAddress.slice(0, 6).join(':'), 6);\n\n var correct = address6.correctForm();\n\n var infix = '';\n\n if (!/:$/.test(correct)) {\n infix = ':';\n }\n\n return address6.correctForm() + infix + address4.address;\n};\n\n/**\n * Return an object containing the Teredo properties of the address\n * @memberof Address6\n * @instance\n * @returns {Object}\n */\nAddress6.prototype.inspectTeredo = function () {\n /*\n - Bits 0 to 31 are set to the Teredo prefix (normally 2001:0000::/32).\n - Bits 32 to 63 embed the primary IPv4 address of the Teredo server that\n is used.\n - Bits 64 to 79 can be used to define some flags. Currently only the\n higher order bit is used; it is set to 1 if the Teredo client is\n located behind a cone NAT, 0 otherwise. For Microsoft's Windows Vista\n and Windows Server 2008 implementations, more bits are used. In those\n implementations, the format for these 16 bits is \"CRAAAAUG AAAAAAAA\",\n where \"C\" remains the \"Cone\" flag. The \"R\" bit is reserved for future\n use. The \"U\" bit is for the Universal/Local flag (set to 0). The \"G\" bit\n is Individual/Group flag (set to 0). The A bits are set to a 12-bit\n randomly generated number chosen by the Teredo client to introduce\n additional protection for the Teredo node against IPv6-based scanning\n attacks.\n - Bits 80 to 95 contains the obfuscated UDP port number. This is the\n port number that is mapped by the NAT to the Teredo client with all\n bits inverted.\n - Bits 96 to 127 contains the obfuscated IPv4 address. This is the\n public IPv4 address of the NAT with all bits inverted.\n */\n var prefix = this.getBitsBase16(0, 32);\n\n var udpPort = this.getBits(80, 96).xor(new BigInteger('ffff', 16)).toString();\n\n var server4 = Address4.fromHex(this.getBitsBase16(32, 64));\n var client4 = Address4.fromHex(this.getBits(96, 128).xor(new BigInteger('ffffffff', 16)).toString(16));\n\n var flags = this.getBits(64, 80);\n var flagsBase2 = this.getBitsBase2(64, 80);\n\n var coneNat = flags.testBit(15);\n var reserved = flags.testBit(14);\n var groupIndividual = flags.testBit(8);\n var universalLocal = flags.testBit(9);\n var nonce = new BigInteger(flagsBase2.slice(2, 6) + flagsBase2.slice(8, 16), 2).toString(10);\n\n return {\n prefix: sprintf('%s:%s', prefix.slice(0, 4), prefix.slice(4, 8)),\n server4: server4.address,\n client4: client4.address,\n flags: flagsBase2,\n coneNat: coneNat,\n microsoft: {\n reserved: reserved,\n universalLocal: universalLocal,\n groupIndividual: groupIndividual,\n nonce: nonce\n },\n udpPort: udpPort\n };\n};\n\n/**\n * Return an object containing the 6to4 properties of the address\n * @memberof Address6\n * @instance\n * @returns {Object}\n */\nAddress6.prototype.inspect6to4 = function () {\n /*\n - Bits 0 to 15 are set to the 6to4 prefix (2002::/16).\n - Bits 16 to 48 embed the IPv4 address of the 6to4 gateway that is used.\n */\n\n var prefix = this.getBitsBase16(0, 16);\n\n var gateway = Address4.fromHex(this.getBitsBase16(16, 48));\n\n return {\n prefix: sprintf('%s', prefix.slice(0, 4)),\n gateway: gateway.address\n };\n};\n\n/**\n * Return a v6 6to4 address from a v6 v4inv6 address\n * @memberof Address6\n * @instance\n * @returns {Address6}\n */\nAddress6.prototype.to6to4 = function () {\n if (!this.is4()) {\n return null;\n }\n\n var addr6to4 = ['2002', this.getBitsBase16(96, 112), this.getBitsBase16(112, 128), '', '/16'].join(':');\n\n return new Address6(addr6to4);\n};\n\n/**\n * Return a byte array\n * @memberof Address6\n * @instance\n * @returns {Array}\n */\nAddress6.prototype.toByteArray = function () {\n var byteArray = this.bigInteger().toByteArray();\n\n // work around issue where `toByteArray` returns a leading 0 element\n if (byteArray.length === 17 && byteArray[0] === 0) {\n return byteArray.slice(1);\n }\n\n return byteArray;\n};\n\nfunction unsignByte(b) {\n return b & 0xFF;\n}\n\n/**\n * Return an unsigned byte array\n * @memberof Address6\n * @instance\n * @returns {Array}\n */\nAddress6.prototype.toUnsignedByteArray = function () {\n return this.toByteArray().map(unsignByte);\n};\n\n/**\n * Convert a byte array to an Address6 object\n * @memberof Address6\n * @static\n * @returns {Address6}\n */\nAddress6.fromByteArray = function (bytes) {\n return this.fromUnsignedByteArray(bytes.map(unsignByte));\n};\n\n/**\n * Convert an unsigned byte array to an Address6 object\n * @memberof Address6\n * @static\n * @returns {Address6}\n */\nAddress6.fromUnsignedByteArray = function (bytes) {\n var BYTE_MAX = new BigInteger('256', 10);\n var result = new BigInteger('0', 10);\n var multiplier = new BigInteger('1', 10);\n\n for (var i = bytes.length - 1; i >= 0; i--) {\n result = result.add(multiplier.multiply(new BigInteger(bytes[i].toString(10), 10)));\n\n multiplier = multiplier.multiply(BYTE_MAX);\n }\n\n return Address6.fromBigInteger(result);\n};\n\nmodule.exports = Address6;",{"version":3,"sources":["node_modules/ip-address/lib/ipv6.js"],"names":["BigInteger","require","find","max","merge","padStart","repeat","sprintf","constants4","constants6","Address4","addCommas","number","r","test","replace","spanLeadingZeroes4","n","Address6","address","optionalGroups","undefined","groups","GROUPS","v4","subnet","subnetMask","zone","RE_SUBNET_STRING","exec","parsedSubnet","parseInt","isNaN","BITS","valid","error","RE_ZONE_STRING","addressMinusSuffix","parsedAddress","parse","prototype","fromBigInteger","bigInteger","hex","toString","i","push","slice","join","fromURL","url","host","port","result","indexOf","RE_URL_WITH_PORT","RE_URL","fromAddress4","address4","mask6","correctForm","fromArpa","arpaFormAddress","semicolonAmount","length","split","reverse","insertIndex","splice","compact","s1","s2","concat","microsoftTranscription","mask","optionalMask","getBitsBase2","possibleSubnets","optionalSubnetSize","availableBits","subnetBits","Math","abs","subnetPowers","pow","startAddress","endAddress","getScope","scope","SCOPES","getBits","getType","self","isType","name","type","isInSubnet","TYPES","start","end","binaryZeroPad","getBitsBase16","getBitsPastSubnet","reverseForm","options","characters","floor","reversed","canonicalForm","omitSuffix","zeroCounter","zeroes","value","zeroLengths","map","index","correct","parse4in6","lastGroup","match","RE_ADDRESS","temp4","parseError","toGroup6","badCharacters","RE_BAD_CHARACTERS","badAddress","RE_BAD_ADDRESS","halves","first","last","remaining","elidedGroups","elisionBegin","elisionEnd","forEach","group","g","paddedHex","octet","decimal","to4","binary","fromHex","to4in6","address6","infix","inspectTeredo","prefix","udpPort","xor","server4","client4","flags","flagsBase2","coneNat","testBit","reserved","groupIndividual","universalLocal","nonce","microsoft","inspect6to4","gateway","to6to4","is4","addr6to4","toByteArray","byteArray","unsignByte","b","toUnsignedByteArray","fromByteArray","bytes","fromUnsignedByteArray","BYTE_MAX","multiplier","add","multiply","module","exports"],"mappings":"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","file":"ipv6.js","sourceRoot":"/data","sourcesContent":["'use strict';\n\nvar BigInteger = require('jsbn').BigInteger;\nvar find = require('lodash.find');\nvar max = require('lodash.max');\nvar merge = require('lodash.merge');\nvar padStart = require('lodash.padstart');\nvar repeat = require('lodash.repeat');\nvar sprintf = require('sprintf-js').sprintf;\n\nvar constants4 = require('./v4/constants.js');\nvar constants6 = require('./v6/constants.js');\n\nvar Address4 = require('./ipv4.js');\n\nfunction addCommas(number) {\n var r = /(\\d+)(\\d{3})/;\n\n while (r.test(number)) {\n number = number.replace(r, '$1,$2');\n }\n\n return number;\n}\n\nfunction spanLeadingZeroes4(n) {\n n = n.replace(/^(0{1,})([1-9]+)$/, '<span class=\"parse-error\">$1</span>$2');\n n = n.replace(/^(0{1,})(0)$/, '<span class=\"parse-error\">$1</span>$2');\n\n return n;\n}\n\n/**\n * Represents an IPv6 address\n * @class Address6\n * @param {string} address - An IPv6 address string\n * @param {number} [groups=8] - How many octets to parse\n * @example\n * var address = new Address6('2001::/32');\n */\nfunction Address6(address, optionalGroups) {\n if (optionalGroups === undefined) {\n this.groups = constants6.GROUPS;\n } else {\n this.groups = optionalGroups;\n }\n\n this.v4 = false;\n\n this.subnet = '/128';\n this.subnetMask = 128;\n\n this.zone = '';\n\n this.address = address;\n\n var subnet = constants6.RE_SUBNET_STRING.exec(address);\n\n if (subnet) {\n this.parsedSubnet = subnet[0].replace('/', '');\n this.subnetMask = parseInt(this.parsedSubnet, 10);\n this.subnet = '/' + this.subnetMask;\n\n if (isNaN(this.subnetMask) ||\n this.subnetMask < 0 ||\n this.subnetMask > constants6.BITS) {\n this.valid = false;\n this.error = 'Invalid subnet mask.';\n\n return;\n }\n\n address = address.replace(constants6.RE_SUBNET_STRING, '');\n } else if (/\\//.test(address)) {\n this.valid = false;\n this.error = 'Invalid subnet mask.';\n\n return;\n }\n\n var zone = constants6.RE_ZONE_STRING.exec(address);\n\n if (zone) {\n this.zone = zone[0];\n\n address = address.replace(constants6.RE_ZONE_STRING, '');\n }\n\n this.addressMinusSuffix = address;\n\n this.parsedAddress = this.parse(this.addressMinusSuffix);\n}\n\nmerge(Address6.prototype, require('./v6/attributes.js'));\nmerge(Address6.prototype, require('./v6/html.js'));\nmerge(Address6.prototype, require('./v6/regular-expressions.js'));\n\n/**\n * Convert a BigInteger to a v6 address object\n * @memberof Address6\n * @static\n * @param {BigInteger} bigInteger - a BigInteger to convert\n * @returns {Address6}\n * @example\n * var bigInteger = new BigInteger('1000000000000');\n * var address = Address6.fromBigInteger(bigInteger);\n * address.correctForm(); // '::e8:d4a5:1000'\n */\nAddress6.fromBigInteger = function (bigInteger) {\n var hex = padStart(bigInteger.toString(16), 32, '0');\n var groups = [];\n var i;\n\n for (i = 0; i < constants6.GROUPS; i++) {\n groups.push(hex.slice(i * 4, (i + 1) * 4));\n }\n\n return new Address6(groups.join(':'));\n};\n\n/**\n * Convert a URL (with optional port number) to an address object\n * @memberof Address6\n * @static\n * @param {string} url - a URL with optional port number\n * @returns {Address6}\n * @example\n * var addressAndPort = Address6.fromURL('http://[ffff::]:8080/foo/');\n * addressAndPort.address.correctForm(); // 'ffff::'\n * addressAndPort.port; // 8080\n */\nAddress6.fromURL = function (url) {\n var host;\n var port;\n var result;\n\n // If we have brackets parse them and find a port\n if (url.indexOf('[') !== -1 && url.indexOf(']:') !== -1) {\n result = constants6.RE_URL_WITH_PORT.exec(url);\n\n if (result === null) {\n return {\n error: 'failed to parse address with port',\n address: null,\n port: null\n };\n }\n\n host = result[1];\n port = result[2];\n // If there's a URL extract the address\n } else if (url.indexOf('/') !== -1) {\n // Remove the protocol prefix\n url = url.replace(/^[a-z0-9]+:\\/\\//, '');\n\n // Parse the address\n result = constants6.RE_URL.exec(url);\n\n if (result === null) {\n return {\n error: 'failed to parse address from URL',\n address: null,\n port: null\n };\n }\n\n host = result[1];\n // Otherwise just assign the URL to the host and let the library parse it\n } else {\n host = url;\n }\n\n // If there's a port convert it to an integer\n if (port) {\n port = parseInt(port, 10);\n\n //squelch out of range ports\n if (port < 0 || port > 65536) {\n port = null;\n }\n } else {\n // Standardize `undefined` to `null`\n port = null;\n }\n\n return {\n address: new Address6(host),\n port: port\n };\n};\n\n/**\n * Create an IPv6-mapped address given an IPv4 address\n * @memberof Address6\n * @static\n * @param {string} address - An IPv4 address string\n * @returns {Address6}\n * @example\n * var address = Address6.fromAddress4('192.168.0.1');\n * address.correctForm(); // '::ffff:c0a8:1'\n * address.to4in6(); // '::ffff:192.168.0.1'\n */\nAddress6.fromAddress4 = function (address4) {\n var address4 = new Address4(address4);\n\n var mask6 = constants6.BITS - (constants4.BITS - address4.subnetMask);\n\n return new Address6('::ffff:' + address4.correctForm() + '/' + mask6);\n};\n\n/**\n * Return an address from ip6.arpa form\n * @memberof Address6\n * @static\n * @param {string} arpaFormAddress - an 'ip6.arpa' form address \n * @returns {Adress6}\n * @example\n * var address = Address6.fromArpa(e.f.f.f.3.c.2.6.f.f.f.e.6.6.8.e.1.0.6.7.9.4.e.c.0.0.0.0.1.0.0.2.ip6.arpa.)\n * address.correctForm(); // '2001:0:ce49:7601:e866:efff:62c3:fffe'\n */\nAddress6.fromArpa = function (arpaFormAddress) {\n //remove ending \".ip6.arpa.\" or just \".\"\n var address = arpaFormAddress.replace(/(\\.ip6\\.arpa)?\\.$/, '');\n var semicolonAmount = 7;\n\n //correct ip6.arpa form with ending removed will be 63 characters\n if (address.length !== 63) {\n address = {\n error: \"Not Valid 'ip6.arpa' form\",\n address: null\n };\n return address;\n }\n\n address = address.split('.').reverse();\n\n for (var i = semicolonAmount; i > 0; i--) {\n var insertIndex = i * 4;\n address.splice(insertIndex, 0, ':');\n }\n\n address = address.join('');\n return new Address6(address);\n};\n\n/*\n * A helper function to compact an array\n */\nfunction compact (address, slice) {\n var s1 = [];\n var s2 = [];\n var i;\n\n for (i = 0; i < address.length; i++) {\n if (i < slice[0]) {\n s1.push(address[i]);\n } else if (i > slice[1]) {\n s2.push(address[i]);\n }\n }\n\n return s1.concat(['compact']).concat(s2);\n}\n\n/**\n * Return the Microsoft UNC transcription of the address\n * @memberof Address6\n * @instance\n * @returns {String} the Microsoft UNC transcription of the address\n */\nAddress6.prototype.microsoftTranscription = function () {\n return sprintf('%s.ipv6-literal.net',\n this.correctForm().replace(/:/g, '-'))