4637bb3682681893ee3bcfaaedf693f7cebbcef387ab051f13771766367b3dbf.json 209 KB

1
  1. {"ast":null,"code":"/*!\n * URI.js - Mutating URLs\n *\n * Version: 1.19.11\n *\n * Author: Rodney Rehm\n * Web: http://medialize.github.io/URI.js/\n *\n * Licensed under\n * MIT License http://www.opensource.org/licenses/mit-license\n *\n */\n(function (root, factory) {\n 'use strict';\n\n // https://github.com/umdjs/umd/blob/master/returnExports.js\n if (typeof module === 'object' && module.exports) {\n // Node\n module.exports = factory(require('./punycode'), require('./IPv6'), require('./SecondLevelDomains'));\n } else if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define(['./punycode', './IPv6', './SecondLevelDomains'], factory);\n } else {\n // Browser globals (root is window)\n root.URI = factory(root.punycode, root.IPv6, root.SecondLevelDomains, root);\n }\n})(this, function (punycode, IPv6, SLD, root) {\n 'use strict';\n\n /*global location, escape, unescape */\n // FIXME: v2.0.0 renamce non-camelCase properties to uppercase\n /*jshint camelcase: false */\n\n // save current URI variable, if any\n var _URI = root && root.URI;\n function URI(url, base) {\n var _urlSupplied = arguments.length >= 1;\n var _baseSupplied = arguments.length >= 2;\n\n // Allow instantiation without the 'new' keyword\n if (!(this instanceof URI)) {\n if (_urlSupplied) {\n if (_baseSupplied) {\n return new URI(url, base);\n }\n return new URI(url);\n }\n return new URI();\n }\n if (url === undefined) {\n if (_urlSupplied) {\n throw new TypeError('undefined is not a valid argument for URI');\n }\n if (typeof location !== 'undefined') {\n url = location.href + '';\n } else {\n url = '';\n }\n }\n if (url === null) {\n if (_urlSupplied) {\n throw new TypeError('null is not a valid argument for URI');\n }\n }\n this.href(url);\n\n // resolve to base according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#constructor\n if (base !== undefined) {\n return this.absoluteTo(base);\n }\n return this;\n }\n function isInteger(value) {\n return /^[0-9]+$/.test(value);\n }\n URI.version = '1.19.11';\n var p = URI.prototype;\n var hasOwn = Object.prototype.hasOwnProperty;\n function escapeRegEx(string) {\n // https://github.com/medialize/URI.js/commit/85ac21783c11f8ccab06106dba9735a31a86924d#commitcomment-821963\n return string.replace(/([.*+?^=!:${}()|[\\]\\/\\\\])/g, '\\\\$1');\n }\n function getType(value) {\n // IE8 doesn't return [Object Undefined] but [Object Object] for undefined value\n if (value === undefined) {\n return 'Undefined';\n }\n return String(Object.prototype.toString.call(value)).slice(8, -1);\n }\n function isArray(obj) {\n return getType(obj) === 'Array';\n }\n function filterArrayValues(data, value) {\n var lookup = {};\n var i, length;\n if (getType(value) === 'RegExp') {\n lookup = null;\n } else if (isArray(value)) {\n for (i = 0, length = value.length; i < length; i++) {\n lookup[value[i]] = true;\n }\n } else {\n lookup[value] = true;\n }\n for (i = 0, length = data.length; i < length; i++) {\n /*jshint laxbreak: true */\n var _match = lookup && lookup[data[i]] !== undefined || !lookup && value.test(data[i]);\n /*jshint laxbreak: false */\n if (_match) {\n data.splice(i, 1);\n length--;\n i--;\n }\n }\n return data;\n }\n function arrayContains(list, value) {\n var i, length;\n\n // value may be string, number, array, regexp\n if (isArray(value)) {\n // Note: this can be optimized to O(n) (instead of current O(m * n))\n for (i = 0, length = value.length; i < length; i++) {\n if (!arrayContains(list, value[i])) {\n return false;\n }\n }\n return true;\n }\n var _type = getType(value);\n for (i = 0, length = list.length; i < length; i++) {\n if (_type === 'RegExp') {\n if (typeof list[i] === 'string' && list[i].match(value)) {\n return true;\n }\n } else if (list[i] === value) {\n return true;\n }\n }\n return false;\n }\n function arraysEqual(one, two) {\n if (!isArray(one) || !isArray(two)) {\n return false;\n }\n\n // arrays can't be equal if they have different amount of content\n if (one.length !== two.length) {\n return false;\n }\n one.sort();\n two.sort();\n for (var i = 0, l = one.length; i < l; i++) {\n if (one[i] !== two[i]) {\n return false;\n }\n }\n return true;\n }\n function trimSlashes(text) {\n var trim_expression = /^\\/+|\\/+$/g;\n return text.replace(trim_expression, '');\n }\n URI._parts = function () {\n return {\n protocol: null,\n username: null,\n password: null,\n hostname: null,\n urn: null,\n port: null,\n path: null,\n query: null,\n fragment: null,\n // state\n preventInvalidHostname: URI.preventInvalidHostname,\n duplicateQueryParameters: URI.duplicateQueryParameters,\n escapeQuerySpace: URI.escapeQuerySpace\n };\n };\n // state: throw on invalid hostname\n // see https://github.com/medialize/URI.js/pull/345\n // and https://github.com/medialize/URI.js/issues/354\n URI.preventInvalidHostname = false;\n // state: allow duplicate query parameters (a=1&a=1)\n URI.duplicateQueryParameters = false;\n // state: replaces + with %20 (space in query strings)\n URI.escapeQuerySpace = true;\n // static properties\n URI.protocol_expression = /^[a-z][a-z0-9.+-]*$/i;\n URI.idn_expression = /[^a-z0-9\\._-]/i;\n URI.punycode_expression = /(xn--)/i;\n // well, 333.444.555.666 matches, but it sure ain't no IPv4 - do we care?\n URI.ip4_expression = /^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/;\n // credits to Rich Brown\n // source: http://forums.intermapper.com/viewtopic.php?p=1096#1096\n // specification: http://www.ietf.org/rfc/rfc4291.txt\n URI.ip6_expression = /^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$/;\n // expression used is \"gruber revised\" (@gruber v2) determined to be the\n // best solution in a regex-golf we did a couple of ages ago at\n // * http://mathiasbynens.be/demo/url-regex\n // * http://rodneyrehm.de/t/url-regex.html\n URI.find_uri_expression = /\\b((?:[a-z][\\w-]+:(?:\\/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}\\/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:'\".,<>?«»“”‘’]))/ig;\n URI.findUri = {\n // valid \"scheme://\" or \"www.\"\n start: /\\b(?:([a-z][a-z0-9.+-]*:\\/\\/)|www\\.)/gi,\n // everything up to the next whitespace\n end: /[\\s\\r\\n]|$/,\n // trim trailing punctuation captured by end RegExp\n trim: /[`!()\\[\\]{};:'\".,<>?«»“”„‘’]+$/,\n // balanced parens inclusion (), [], {}, <>\n parens: /(\\([^\\)]*\\)|\\[[^\\]]*\\]|\\{[^}]*\\}|<[^>]*>)/g\n };\n URI.leading_whitespace_expression = /^[\\x00-\\x20\\u00a0\\u1680\\u2000-\\u200a\\u2028\\u2029\\u202f\\u205f\\u3000\\ufeff]+/;\n // https://infra.spec.whatwg.org/#ascii-tab-or-newline\n URI.ascii_tab_whitespace = /[\\u0009\\u000A\\u000D]+/g;\n // http://www.iana.org/assignments/uri-schemes.html\n // http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers#Well-known_ports\n URI.defaultPorts = {\n http: '80',\n https: '443',\n ftp: '21',\n gopher: '70',\n ws: '80',\n wss: '443'\n };\n // list of protocols which always require a hostname\n URI.hostProtocols = ['http', 'https'];\n\n // allowed hostname characters according to RFC 3986\n // ALPHA DIGIT \"-\" \".\" \"_\" \"~\" \"!\" \"$\" \"&\" \"'\" \"(\" \")\" \"*\" \"+\" \",\" \";\" \"=\" %encoded\n // I've never seen a (non-IDN) hostname other than: ALPHA DIGIT . - _\n URI.invalid_hostname_characters = /[^a-zA-Z0-9\\.\\-:_]/;\n // map DOM Elements to their URI attribute\n URI.domAttributes = {\n 'a': 'href',\n 'blockquote': 'cite',\n 'link': 'href',\n 'base': 'href',\n 'script': 'src',\n 'form': 'action',\n 'img': 'src',\n 'area': 'href',\n 'iframe': 'src',\n 'embed': 'src',\n 'source': 'src',\n 'track': 'src',\n 'input': 'src',\n // but only if type=\"image\"\n 'audio': 'src',\n 'video': 'src'\n };\n URI.getDomAttribute = function (node) {\n if (!node || !node.nodeName) {\n return undefined;\n }\n var nodeName = node.nodeName.toLowerCase();\n // <input> should only expose src for type=\"image\"\n if (nodeName === 'input' && node.type !== 'image') {\n return undefined;\n }\n return URI.domAttributes[nodeName];\n };\n function escapeForDumbFirefox36(value) {\n // https://github.com/medialize/URI.js/issues/91\n return escape(value);\n }\n\n // encoding / decoding according to RFC3986\n function strictEncodeURIComponent(string) {\n // see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/encodeURIComponent\n return encodeURIComponent(string).replace(/[!'()*]/g, escapeForDumbFirefox36).replace(/\\*/g, '%2A');\n }\n URI.encode = strictEncodeURIComponent;\n URI.decode = decodeURIComponent;\n URI.iso8859 = function () {\n URI.encode = escape;\n URI.decode = unescape;\n };\n URI.unicode = function () {\n URI.encode = strictEncodeURIComponent;\n URI.decode = decodeURIComponent;\n };\n URI.characters = {\n pathname: {\n encode: {\n // RFC3986 2.1: For consistency, URI producers and normalizers should\n // use uppercase hexadecimal digits for all percent-encodings.\n expression: /%(24|26|2B|2C|3B|3D|3A|40)/ig,\n map: {\n // -._~!'()*\n '%24': '$',\n '%26': '&',\n '%2B': '+',\n '%2C': ',',\n '%3B': ';',\n '%3D': '=',\n '%3A': ':',\n '%40': '@'\n }\n },\n decode: {\n expression: /[\\/\\?#]/g,\n map: {\n '/': '%2F',\n '?': '%3F',\n '#': '%23'\n }\n }\n },\n reserved: {\n encode: {\n // RFC3986 2.1: For consistency, URI producers and normalizers should\n // use uppercase hexadecimal digits for all percent-encodings.\n expression: /%(21|23|24|26|27|28|29|2A|2B|2C|2F|3A|3B|3D|3F|40|5B|5D)/ig,\n map: {\n // gen-delims\n '%3A': ':',\n '%2F': '/',\n '%3F': '?',\n '%23': '#',\n '%5B': '[',\n '%5D': ']',\n '%40': '@',\n // sub-delims\n '%21': '!',\n '%24': '$',\n '%26': '&',\n '%27': '\\'',\n '%28': '(',\n '%29': ')',\n '%2A': '*',\n '%2B': '+',\n '%2C': ',',\n '%3B': ';',\n '%3D': '='\n }\n }\n },\n urnpath: {\n // The characters under `encode` are the characters called out by RFC 2141 as being acceptable\n // for usage in a URN. RFC2141 also calls out \"-\", \".\", and \"_\" as acceptable characters, but\n // these aren't encoded by encodeURIComponent, so we don't have to call them out here. Also\n // note that the colon character is not featured in the encoding map; this is because URI.js\n // gives the colons in URNs semantic meaning as the delimiters of path segements, and so it\n // should not appear unencoded in a segment itself.\n // See also the note above about RFC3986 and capitalalized hex digits.\n encode: {\n expression: /%(21|24|27|28|29|2A|2B|2C|3B|3D|40)/ig,\n map: {\n '%21': '!',\n '%24': '$',\n '%27': '\\'',\n '%28': '(',\n '%29': ')',\n '%2A': '*',\n '%2B': '+',\n '%2C': ',',\n '%3B': ';',\n '%3D': '=',\n '%40': '@'\n }\n },\n // These characters are the characters called out by RFC2141 as \"reserved\" characters that\n // should never appear in a URN, plus the colon character (see note above).\n decode: {\n expression: /[\\/\\?#:]/g,\n map: {\n '/': '%2F',\n '?': '%3F',\n '#': '%23',\n ':': '%3A'\n }\n }\n }\n };\n URI.encodeQuery = function (string, escapeQuerySpace) {\n var escaped = URI.encode(string + '');\n if (escapeQuerySpace === undefined) {\n escapeQuerySpace = URI.escapeQuerySpace;\n }\n return escapeQuerySpace ? escaped.replace(/%20/g, '+') : escaped;\n };\n URI.decodeQuery = function (string, escapeQuerySpace) {\n string += '';\n if (escapeQuerySpace === undefined) {\n escapeQuerySpace = URI.escapeQuerySpace;\n }\n try {\n return URI.decode(escapeQuerySpace ? string.replace(/\\+/g, '%20') : string);\n } catch (e) {\n // we're not going to mess with weird encodings,\n // give up and return the undecoded original string\n // see https://github.com/medialize/URI.js/issues/87\n // see https://github.com/medialize/URI.js/issues/92\n return string;\n }\n };\n // generate encode/decode path functions\n var _parts = {\n 'encode': 'encode',\n 'decode': 'decode'\n };\n var _part;\n var generateAccessor = function (_group, _part) {\n return function (string) {\n try {\n return URI[_part](string + '').replace(URI.characters[_group][_part].expression, function (c) {\n return URI.characters[_group][_part].map[c];\n });\n } catch (e) {\n // we're not going to mess with weird encodings,\n // give up and return the undecoded original string\n // see https://github.com/medialize/URI.js/issues/87\n // see https://github.com/medialize/URI.js/issues/92\n return string;\n }\n };\n };\n for (_part in _parts) {\n URI[_part + 'PathSegment'] = generateAccessor('pathname', _parts[_part]);\n URI[_part + 'UrnPathSegment'] = generateAccessor('urnpath', _parts[_part]);\n }\n var generateSegmentedPathFunction = function (_sep, _codingFuncName, _innerCodingFuncName) {\n return function (string) {\n // Why pass in names of functions, rather than the function objects themselves? The\n // definitions of some functions (but in particular, URI.decode) will occasionally change due\n // to URI.js having ISO8859 and Unicode modes. Passing in the name and getting it will ensure\n // that the functions we use here are \"fresh\".\n var actualCodingFunc;\n if (!_innerCodingFuncName) {\n actualCodingFunc = URI[_codingFuncName];\n } else {\n actualCodingFunc = function (string) {\n return URI[_codingFuncName](URI[_innerCodingFuncName](string));\n };\n }\n var segments = (string + '').split(_sep);\n for (var i = 0, length = segments.length; i < length; i++) {\n segments[i] = actualCodingFunc(segments[i]);\n }\n return segments.join(_sep);\n };\n };\n\n // This takes place outside the above loop because we don't want, e.g., encodeUrnPath functions.\n URI.decodePath = generateSegmentedPathFunction('/', 'decodePathSegment');\n URI.decodeUrnPath = generateSegmentedPathFunction(':', 'decodeUrnPathSegment');\n URI.recodePath = generateSegmentedPathFunction('/', 'encodePathSegment', 'decode');\n URI.recodeUrnPath = generateSegmentedPathFunction(':', 'encodeUrnPathSegment', 'decode');\n URI.encodeReserved = generateAccessor('reserved', 'encode');\n URI.parse = function (string, parts) {\n var pos;\n if (!parts) {\n parts = {\n preventInvalidHostname: URI.preventInvalidHostname\n };\n }\n string = string.replace(URI.leading_whitespace_expression, '');\n // https://infra.spec.whatwg.org/#ascii-tab-or-newline\n string = string.replace(URI.ascii_tab_whitespace, '');\n\n // [protocol\"://\"[username[\":\"password]\"@\"]hostname[\":\"port]\"/\"?][path][\"?\"querystring][\"#\"fragment]\n\n // extract fragment\n pos = string.indexOf('#');\n if (pos > -1) {\n // escaping?\n parts.fragment = string.substring(pos + 1) || null;\n string = string.substring(0, pos);\n }\n\n // extract query\n pos = string.indexOf('?');\n if (pos > -1) {\n // escaping?\n parts.query = string.substring(pos + 1) || null;\n string = string.substring(0, pos);\n }\n\n // slashes and backslashes have lost all meaning for the web protocols (https, http, wss, ws)\n string = string.replace(/^(https?|ftp|wss?)?:+[/\\\\]*/i, '$1://');\n // slashes and backslashes have lost all meaning for scheme relative URLs\n string = string.replace(/^[/\\\\]{2,}/i, '//');\n\n // extract protocol\n if (string.substring(0, 2) === '//') {\n // relative-scheme\n parts.protocol = null;\n string = string.substring(2);\n // extract \"user:pass@host:port\"\n string = URI.parseAuthority(string, parts);\n } else {\n pos = string.indexOf(':');\n if (pos > -1) {\n parts.protocol = string.substring(0, pos) || null;\n if (parts.protocol && !parts.protocol.match(URI.protocol_expression)) {\n // : may be within the path\n parts.protocol = undefined;\n } else if (string.substring(pos + 1, pos + 3).replace(/\\\\/g, '/') === '//') {\n string = string.substring(pos + 3);\n\n // extract \"user:pass@host:port\"\n string = URI.parseAuthority(string, parts);\n } else {\n string = string.substring(pos + 1);\n parts.urn = true;\n }\n }\n }\n\n // what's left must be the path\n parts.path = string;\n\n // and we're done\n return parts;\n };\n URI.parseHost = function (string, parts) {\n if (!string) {\n string = '';\n }\n\n // Copy chrome, IE, opera backslash-handling behavior.\n // Back slashes before the query string get converted to forward slashes\n // See: https://github.com/joyent/node/blob/386fd24f49b0e9d1a8a076592a404168faeecc34/lib/url.js#L115-L124\n // See: https://code.google.com/p/chromium/issues/detail?id=25916\n // https://github.com/medialize/URI.js/pull/233\n string = string.replace(/\\\\/g, '/');\n\n // extract host:port\n var pos = string.indexOf('/');\n var bracketPos;\n var t;\n if (pos === -1) {\n pos = string.length;\n }\n if (string.charAt(0) === '[') {\n // IPv6 host - http://tools.ietf.org/html/draft-ietf-6man-text-addr-representation-04#section-6\n // I claim most client software breaks on IPv6 anyways. To simplify things, URI only accepts\n // IPv6+port in the format [2001:db8::1]:80 (for the time being)\n bracketPos = string.indexOf(']');\n parts.hostname = string.substring(1, bracketPos) || null;\n parts.port = string.substring(bracketPos + 2, pos) || null;\n if (parts.port === '/') {\n parts.port = null;\n }\n } else {\n var firstColon = string.indexOf(':');\n var firstSlash = string.indexOf('/');\n var nextColon = string.indexOf(':', firstColon + 1);\n if (nextColon !== -1 && (firstSlash === -1 || nextColon < firstSlash)) {\n // IPv6 host contains multiple colons - but no port\n // this notation is actually not allowed by RFC 3986, but we're a liberal parser\n parts.hostname = string.substring(0, pos) || null;\n parts.port = null;\n } else {\n t = string.substring(0, pos).split(':');\n parts.hostname = t[0] || null;\n parts.port = t[1] || null;\n }\n }\n if (parts.hostname && string.substring(pos).charAt(0) !== '/') {\n pos++;\n string = '/' + string;\n }\n if (parts.preventInvalidHostname) {\n URI.ensureValidHostname(parts.hostname, parts.protocol);\n }\n if (parts.port) {\n URI.ensureValidPort(parts.port);\n }\n return string.substring(pos) || '/';\n };\n URI.parseAuthority = function (string, parts) {\n string = URI.parseUserinfo(string, parts);\n return URI.parseHost(string, parts);\n };\n URI.parseUserinfo = function (string, parts) {\n // extract username:password\n var _string = string;\n var firstBackSlash = string.indexOf('\\\\');\n if (firstBackSlash !== -1) {\n string = string.replace(/\\\\/g, '/');\n }\n var firstSlash = string.indexOf('/');\n var pos = string.lastIndexOf('@', firstSlash > -1 ? firstSlash : string.length - 1);\n var t;\n\n // authority@ must come before /path or \\path\n if (pos > -1 && (firstSlash === -1 || pos < firstSlash)) {\n t = string.substring(0, pos).split(':');\n parts.username = t[0] ? URI.decode(t[0]) : null;\n t.shift();\n parts.password = t[0] ? URI.decode(t.join(':')) : null;\n string = _string.substring(pos + 1);\n } else {\n parts.username = null;\n parts.password = null;\n }\n return string;\n };\n URI.parseQuery = function (string, escapeQuerySpace) {\n if (!string) {\n return {};\n }\n\n // throw out the funky business - \"?\"[name\"=\"value\"&\"]+\n string = string.replace(/&+/g, '&').replace(/^\\?*&*|&+$/g, '');\n if (!string) {\n return {};\n }\n var items = {};\n var splits = string.split('&');\n var length = splits.length;\n var v, name, value;\n for (var i = 0; i < length; i++) {\n v = splits[i].split('=');\n name = URI.decodeQuery(v.shift(), escapeQuerySpace);\n // no \"=\" is null according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#collect-url-parameters\n value = v.length ? URI.decodeQuery(v.join('='), escapeQuerySpace) : null;\n if (name === '__proto__') {\n // ignore attempt at exploiting JavaScript internals\n continue;\n } else if (hasOwn.call(items, name)) {\n if (typeof items[name] === 'string' || items[name] === null) {\n items[name] = [items[name]];\n }\n items[name].push(value);\n } else {\n items[name] = value;\n }\n }\n return items;\n };\n URI.build = function (parts) {\n var t = '';\n var requireAbsolutePath = false;\n if (parts.protocol) {\n t += parts.protocol + ':';\n }\n if (!parts.urn && (t || parts.hostname)) {\n t += '//';\n requireAbsolutePath = true;\n }\n t += URI.buildAuthority(parts) || '';\n if (typeof parts.path === 'string') {\n if (parts.path.charAt(0) !== '/' && requireAbsolutePath) {\n t += '/';\n }\n t += parts.path;\n }\n if (typeof parts.query === 'string' && parts.query) {\n t += '?' + parts.query;\n }\n if (typeof parts.fragment === 'string' && parts.fragment) {\n t += '#' + parts.fragment;\n }\n return t;\n };\n URI.buildHost = function (parts) {\n var t = '';\n if (!parts.hostname) {\n return '';\n } else if (URI.ip6_expression.test(parts.hostname)) {\n t += '[' + parts.hostname + ']';\n } else {\n t += parts.hostname;\n }\n if (parts.port) {\n t += ':' + parts.port;\n }\n return t;\n };\n URI.buildAuthority = function (parts) {\n return URI.buildUserinfo(parts) + URI.buildHost(parts);\n };\n URI.buildUserinfo = function (parts) {\n var t = '';\n if (parts.username) {\n t += URI.encode(parts.username);\n }\n if (parts.password) {\n t += ':' + URI.encode(parts.password);\n }\n if (t) {\n t += '@';\n }\n return t;\n };\n URI.buildQuery = function (data, duplicateQueryParameters, escapeQuerySpace) {\n // according to http://tools.ietf.org/html/rfc3986 or http://labs.apache.org/webarch/uri/rfc/rfc3986.html\n // being »-._~!$&'()*+,;=:@/?« %HEX and alnum are allowed\n // the RFC explicitly states ?/foo being a valid use case, no mention of parameter syntax!\n // URI.js treats the query string as being application/x-www-form-urlencoded\n // see http://www.w3.org/TR/REC-html40/interact/forms.html#form-content-type\n\n var t = '';\n var unique, key, i, length;\n for (key in data) {\n if (key === '__proto__') {\n // ignore attempt at exploiting JavaScript internals\n continue;\n } else if (hasOwn.call(data, key)) {\n if (isArray(data[key])) {\n unique = {};\n for (i = 0, length = data[key].length; i < length; i++) {\n if (data[key][i] !== undefined && unique[data[key][i] + ''] === undefined) {\n t += '&' + URI.buildQueryParameter(key, data[key][i], escapeQuerySpace);\n if (duplicateQueryParameters !== true) {\n unique[data[key][i] + ''] = true;\n }\n }\n }\n } else if (data[key] !== undefined) {\n t += '&' + URI.buildQueryParameter(key, data[key], escapeQuerySpace);\n }\n }\n }\n return t.substring(1);\n };\n URI.buildQueryParameter = function (name, value, escapeQuerySpace) {\n // http://www.w3.org/TR/REC-html40/interact/forms.html#form-content-type -- application/x-www-form-urlencoded\n // don't append \"=\" for null values, according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#url-parameter-serialization\n return URI.encodeQuery(name, escapeQuerySpace) + (value !== null ? '=' + URI.encodeQuery(value, escapeQuerySpace) : '');\n };\n URI.addQuery = function (data, name, value) {\n if (typeof name === 'object') {\n for (var key in name) {\n if (hasOwn.call(name, key)) {\n URI.addQuery(data, key, name[key]);\n }\n }\n } else if (typeof name === 'string') {\n if (data[name] === undefined) {\n data[name] = value;\n return;\n } else if (typeof data[name] === 'string') {\n data[name] = [data[name]];\n }\n if (!isArray(value)) {\n value = [value];\n }\n data[name] = (data[name] || []).concat(value);\n } else {\n throw new TypeError('URI.addQuery() accepts an object, string as the name parameter');\n }\n };\n URI.setQuery = function (data, name, value) {\n if (typeof name === 'object') {\n for (var key in name) {\n if (hasOwn.call(name, key)) {\n URI.setQuery(data, key, name[key]);\n }\n }\n } else if (typeof name === 'string') {\n data[name] = value === undefined ? null : value;\n } else {\n throw new TypeError('URI.setQuery() accepts an object, string as the name parameter');\n }\n };\n URI.removeQuery = function (data, name, value) {\n var i, length, key;\n if (isArray(name)) {\n for (i = 0, length = name.length; i < length; i++) {\n data[name[i]] = undefined;\n }\n } else if (getType(name) === 'RegExp') {\n for (key in data) {\n if (name.test(key)) {\n data[key] = undefined;\n }\n }\n } else if (typeof name === 'object') {\n for (key in name) {\n if (hasOwn.call(name, key)) {\n URI.removeQuery(data, key, name[key]);\n }\n }\n } else if (typeof name === 'string') {\n if (value !== undefined) {\n if (getType(value) === 'RegExp') {\n if (!isArray(data[name]) && value.test(data[name])) {\n data[name] = undefined;\n } else {\n data[name] = filterArrayValues(data[name], value);\n }\n } else if (data[name] === String(value) && (!isArray(value) || value.length === 1)) {\n data[name] = undefined;\n } else if (isArray(data[name])) {\n data[name] = filterArrayValues(data[name], value);\n }\n } else {\n data[name] = undefined;\n }\n } else {\n throw new TypeError('URI.removeQuery() accepts an object, string, RegExp as the first parameter');\n }\n };\n URI.hasQuery = function (data, name, value, withinArray) {\n switch (getType(name)) {\n case 'String':\n // Nothing to do here\n break;\n case 'RegExp':\n for (var key in data) {\n if (hasOwn.call(data, key)) {\n if (name.test(key) && (value === undefined || URI.hasQuery(data, key, value))) {\n return true;\n }\n }\n }\n return false;\n case 'Object':\n for (var _key in name) {\n if (hasOwn.call(name, _key)) {\n if (!URI.hasQuery(data, _key, name[_key])) {\n return false;\n }\n }\n }\n return true;\n default:\n throw new TypeError('URI.hasQuery() accepts a string, regular expression or object as the name parameter');\n }\n switch (getType(value)) {\n case 'Undefined':\n // true if exists (but may be empty)\n return name in data;\n // data[name] !== undefined;\n\n case 'Boolean':\n // true if exists and non-empty\n var _booly = Boolean(isArray(data[name]) ? data[name].length : data[name]);\n return value === _booly;\n case 'Function':\n // allow complex comparison\n return !!value(data[name], name, data);\n case 'Array':\n if (!isArray(data[name])) {\n return false;\n }\n var op = withinArray ? arrayContains : arraysEqual;\n return op(data[name], value);\n case 'RegExp':\n if (!isArray(data[name])) {\n return Boolean(data[name] && data[name].match(value));\n }\n if (!withinArray) {\n return false;\n }\n return arrayContains(data[name], value);\n case 'Number':\n value = String(value);\n /* falls through */\n case 'String':\n if (!isArray(data[name])) {\n return data[name] === value;\n }\n if (!withinArray) {\n return false;\n }\n return arrayContains(data[name], value);\n default:\n throw new TypeError('URI.hasQuery() accepts undefined, boolean, string, number, RegExp, Function as the value parameter');\n }\n };\n URI.joinPaths = function () {\n var input = [];\n var segments = [];\n var nonEmptySegments = 0;\n for (var i = 0; i < arguments.length; i++) {\n var url = new URI(arguments[i]);\n input.push(url);\n var _segments = url.segment();\n for (var s = 0; s < _segments.length; s++) {\n if (typeof _segments[s] === 'string') {\n segments.push(_segments[s]);\n }\n if (_segments[s]) {\n nonEmptySegments++;\n }\n }\n }\n if (!segments.length || !nonEmptySegments) {\n return new URI('');\n }\n var uri = new URI('').segment(segments);\n if (input[0].path() === '' || input[0].path().slice(0, 1) === '/') {\n uri.path('/' + uri.path());\n }\n return uri.normalize();\n };\n URI.commonPath = function (one, two) {\n var length = Math.min(one.length, two.length);\n var pos;\n\n // find first non-matching character\n for (pos = 0; pos < length; pos++) {\n if (one.charAt(pos) !== two.charAt(pos)) {\n pos--;\n break;\n }\n }\n if (pos < 1) {\n return one.charAt(0) === two.charAt(0) && one.charAt(0) === '/' ? '/' : '';\n }\n\n // revert to last /\n if (one.charAt(pos) !== '/' || two.charAt(pos) !== '/') {\n pos = one.substring(0, pos).lastIndexOf('/');\n }\n return one.substring(0, pos + 1);\n };\n URI.withinString = function (string, callback, options) {\n options || (options = {});\n var _start = options.start || URI.findUri.start;\n var _end = options.end || URI.findUri.end;\n var _trim = options.trim || URI.findUri.trim;\n var _parens = options.parens || URI.findUri.parens;\n var _attributeOpen = /[a-z0-9-]=[\"']?$/i;\n _start.lastIndex = 0;\n while (true) {\n var match = _start.exec(string);\n if (!match) {\n break;\n }\n var start = match.index;\n if (options.ignoreHtml) {\n // attribut(e=[\"']?$)\n var attributeOpen = string.slice(Math.max(start - 3, 0), start);\n if (attributeOpen && _attributeOpen.test(attributeOpen)) {\n continue;\n }\n }\n var end = start + string.slice(start).search(_end);\n var slice = string.slice(start, end);\n // make sure we include well balanced parens\n var parensEnd = -1;\n while (true) {\n var parensMatch = _parens.exec(slice);\n if (!parensMatch) {\n break;\n }\n var parensMatchEnd = parensMatch.index + parensMatch[0].length;\n parensEnd = Math.max(parensEnd, parensMatchEnd);\n }\n if (parensEnd > -1) {\n slice = slice.slice(0, parensEnd) + slice.slice(parensEnd).replace(_trim, '');\n } else {\n slice = slice.replace(_trim, '');\n }\n if (slice.length <= match[0].length) {\n // the extract only contains the starting marker of a URI,\n // e.g. \"www\" or \"http://\"\n continue;\n }\n if (options.ignore && options.ignore.test(slice)) {\n continue;\n }\n end = start + slice.length;\n var result = callback(slice, start, end, string);\n if (result === undefined) {\n _start.lastIndex = end;\n continue;\n }\n result = String(result);\n string = string.slice(0, start) + result + string.slice(end);\n _start.lastIndex = start + result.length;\n }\n _start.lastIndex = 0;\n return string;\n };\n URI.ensureValidHostname = function (v, protocol) {\n // Theoretically URIs allow percent-encoding in Hostnames (according to RFC 3986)\n // they are not part of DNS and therefore ignored by URI.js\n\n var hasHostname = !!v; // not null and not an empty string\n var hasProtocol = !!protocol;\n var rejectEmptyHostname = false;\n if (hasProtocol) {\n rejectEmptyHostname = arrayContains(URI.hostProtocols, protocol);\n }\n if (rejectEmptyHostname && !hasHostname) {\n throw new TypeError('Hostname cannot be empty, if protocol is ' + protocol);\n } else if (v && v.match(URI.invalid_hostname_characters)) {\n // test punycode\n if (!punycode) {\n throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-:_] and Punycode.js is not available');\n }\n if (punycode.toASCII(v).match(URI.invalid_hostname_characters)) {\n throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-:_]');\n }\n }\n };\n URI.ensureValidPort = function (v) {\n if (!v) {\n return;\n }\n var port = Number(v);\n if (isInteger(port) && port > 0 && port < 65536) {\n return;\n }\n throw new TypeError('Port \"' + v + '\" is not a valid port');\n };\n\n // noConflict\n URI.noConflict = function (removeAll) {\n if (removeAll) {\n var unconflicted = {\n URI: this.noConflict()\n };\n if (root.URITemplate && typeof root.URITemplate.noConflict === 'function') {\n unconflicted.URITemplate = root.URITemplate.noConflict();\n }\n if (root.IPv6 && typeof root.IPv6.noConflict === 'function') {\n unconflicted.IPv6 = root.IPv6.noConflict();\n }\n if (root.SecondLevelDomains && typeof root.SecondLevelDomains.noConflict === 'function') {\n unconflicted.SecondLevelDomains = root.SecondLevelDomains.noConflict();\n }\n return unconflicted;\n } else if (root.URI === this) {\n root.URI = _URI;\n }\n return this;\n };\n p.build = function (deferBuild) {\n if (deferBuild === true) {\n this._deferred_build = true;\n } else if (deferBuild === undefined || this._deferred_build) {\n this._string = URI.build(this._parts);\n this._deferred_build = false;\n }\n return this;\n };\n p.clone = function () {\n return new URI(this);\n };\n p.valueOf = p.toString = function () {\n return this.build(false)._string;\n };\n function generateSimpleAccessor(_part) {\n return function (v, build) {\n if (v === undefined) {\n return this._parts[_part] || '';\n } else {\n this._parts[_part] = v || null;\n this.build(!build);\n return this;\n }\n };\n }\n function generatePrefixAccessor(_part, _key) {\n return function (v, build) {\n if (v === undefined) {\n return this._parts[_part] || '';\n } else {\n if (v !== null) {\n v = v + '';\n if (v.charAt(0) === _key) {\n v = v.substring(1);\n }\n }\n this._parts[_part] = v;\n this.build(!build);\n return this;\n }\n };\n }\n p.protocol = generateSimpleAccessor('protocol');\n p.username = generateSimpleAccessor('username');\n p.password = generateSimpleAccessor('password');\n p.hostname = generateSimpleAccessor('hostname');\n p.port = generateSimpleAccessor('port');\n p.query = generatePrefixAccessor('query', '?');\n p.fragment = generatePrefixAccessor('fragment', '#');\n p.search = function (v, build) {\n var t = this.query(v, build);\n return typeof t === 'string' && t.length ? '?' + t : t;\n };\n p.hash = function (v, build) {\n var t = this.fragment(v, build);\n return typeof t === 'string' && t.length ? '#' + t : t;\n };\n p.pathname = function (v, build) {\n if (v === undefined || v === true) {\n var res = this._parts.path || (this._parts.hostname ? '/' : '');\n return v ? (this._parts.urn ? URI.decodeUrnPath : URI.decodePath)(res) : res;\n } else {\n if (this._parts.urn) {\n this._parts.path = v ? URI.recodeUrnPath(v) : '';\n } else {\n this._parts.path = v ? URI.recodePath(v) : '/';\n }\n this.build(!build);\n return this;\n }\n };\n p.path = p.pathname;\n p.href = function (href, build) {\n var key;\n if (href === undefined) {\n return this.toString();\n }\n this._string = '';\n this._parts = URI._parts();\n var _URI = href instanceof URI;\n var _object = typeof href === 'object' && (href.hostname || href.path || href.pathname);\n if (href.nodeName) {\n var attribute = URI.getDomAttribute(href);\n href = href[attribute] || '';\n _object = false;\n }\n\n // window.location is reported to be an object, but it's not the sort\n // of object we're looking for:\n // * location.protocol ends with a colon\n // * location.query != object.search\n // * location.hash != object.fragment\n // simply serializing the unknown object should do the trick\n // (for location, not for everything...)\n if (!_URI && _object && href.pathname !== undefined) {\n href = href.toString();\n }\n if (typeof href === 'string' || href instanceof String) {\n this._parts = URI.parse(String(href), this._parts);\n } else if (_URI || _object) {\n var src = _URI ? href._parts : href;\n for (key in src) {\n if (key === 'query') {\n continue;\n }\n if (hasOwn.call(this._parts, key)) {\n this._parts[key] = src[key];\n }\n }\n if (src.query) {\n this.query(src.query, false);\n }\n } else {\n throw new TypeError('invalid input');\n }\n this.build(!build);\n return this;\n };\n\n // identification accessors\n p.is = function (what) {\n var ip = false;\n var ip4 = false;\n var ip6 = false;\n var name = false;\n var sld = false;\n var idn = false;\n var punycode = false;\n var relative = !this._parts.urn;\n if (this._parts.hostname) {\n relative = false;\n ip4 = URI.ip4_expression.test(this._parts.hostname);\n ip6 = URI.ip6_expression.test(this._parts.hostname);\n ip = ip4 || ip6;\n name = !ip;\n sld = name && SLD && SLD.has(this._parts.hostname);\n idn = name && URI.idn_expression.test(this._parts.hostname);\n punycode = name && URI.punycode_expression.test(this._parts.hostname);\n }\n switch (what.toLowerCase()) {\n case 'relative':\n return relative;\n case 'absolute':\n return !relative;\n\n // hostname identification\n case 'domain':\n case 'name':\n return name;\n case 'sld':\n return sld;\n case 'ip':\n return ip;\n case 'ip4':\n case 'ipv4':\n case 'inet4':\n return ip4;\n case 'ip6':\n case 'ipv6':\n case 'inet6':\n return ip6;\n case 'idn':\n return idn;\n case 'url':\n return !this._parts.urn;\n case 'urn':\n return !!this._parts.urn;\n case 'punycode':\n return punycode;\n }\n return null;\n };\n\n // component specific input validation\n var _protocol = p.protocol;\n var _port = p.port;\n var _hostname = p.hostname;\n p.protocol = function (v, build) {\n if (v) {\n // accept trailing ://\n v = v.replace(/:(\\/\\/)?$/, '');\n if (!v.match(URI.protocol_expression)) {\n throw new TypeError('Protocol \"' + v + '\" contains characters other than [A-Z0-9.+-] or doesn\\'t start with [A-Z]');\n }\n }\n return _protocol.call(this, v, build);\n };\n p.scheme = p.protocol;\n p.port = function (v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n if (v !== undefined) {\n if (v === 0) {\n v = null;\n }\n if (v) {\n v += '';\n if (v.charAt(0) === ':') {\n v = v.substring(1);\n }\n URI.ensureValidPort(v);\n }\n }\n return _port.call(this, v, build);\n };\n p.hostname = function (v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n if (v !== undefined) {\n var x = {\n preventInvalidHostname: this._parts.preventInvalidHostname\n };\n var res = URI.parseHost(v, x);\n if (res !== '/') {\n throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-]');\n }\n v = x.hostname;\n if (this._parts.preventInvalidHostname) {\n URI.ensureValidHostname(v, this._parts.protocol);\n }\n }\n return _hostname.call(this, v, build);\n };\n\n // compound accessors\n p.origin = function (v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n if (v === undefined) {\n var protocol = this.protocol();\n var authority = this.authority();\n if (!authority) {\n return '';\n }\n return (protocol ? protocol + '://' : '') + this.authority();\n } else {\n var origin = URI(v);\n this.protocol(origin.protocol()).authority(origin.authority()).build(!build);\n return this;\n }\n };\n p.host = function (v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n if (v === undefined) {\n return this._parts.hostname ? URI.buildHost(this._parts) : '';\n } else {\n var res = URI.parseHost(v, this._parts);\n if (res !== '/') {\n throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-]');\n }\n this.build(!build);\n return this;\n }\n };\n p.authority = function (v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n if (v === undefined) {\n return this._parts.hostname ? URI.buildAuthority(this._parts) : '';\n } else {\n var res = URI.parseAuthority(v, this._parts);\n if (res !== '/') {\n throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-]');\n }\n this.build(!build);\n return this;\n }\n };\n p.userinfo = function (v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n if (v === undefined) {\n var t = URI.buildUserinfo(this._parts);\n return t ? t.substring(0, t.length - 1) : t;\n } else {\n if (v[v.length - 1] !== '@') {\n v += '@';\n }\n URI.parseUserinfo(v, this._parts);\n this.build(!build);\n return this;\n }\n };\n p.resource = function (v, build) {\n var parts;\n if (v === undefined) {\n return this.path() + this.search() + this.hash();\n }\n parts = URI.parse(v);\n this._parts.path = parts.path;\n this._parts.query = parts.query;\n this._parts.fragment = parts.fragment;\n this.build(!build);\n return this;\n };\n\n // fraction accessors\n p.subdomain = function (v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n // convenience, return \"www\" from \"www.example.org\"\n if (v === undefined) {\n if (!this._parts.hostname || this.is('IP')) {\n return '';\n }\n\n // grab domain and add another segment\n var end = this._parts.hostname.length - this.domain().length - 1;\n return this._parts.hostname.substring(0, end) || '';\n } else {\n var e = this._parts.hostname.length - this.domain().length;\n var sub = this._parts.hostname.substring(0, e);\n var replace = new RegExp('^' + escapeRegEx(sub));\n if (v && v.charAt(v.length - 1) !== '.') {\n v += '.';\n }\n if (v.indexOf(':') !== -1) {\n throw new TypeError('Domains cannot contain colons');\n }\n if (v) {\n URI.ensureValidHostname(v, this._parts.protocol);\n }\n this._parts.hostname = this._parts.hostname.replace(replace, v);\n this.build(!build);\n return this;\n }\n };\n p.domain = function (v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n if (typeof v === 'boolean') {\n build = v;\n v = undefined;\n }\n\n // convenience, return \"example.org\" from \"www.example.org\"\n if (v === undefined) {\n if (!this._parts.hostname || this.is('IP')) {\n return '';\n }\n\n // if hostname consists of 1 or 2 segments, it must be the domain\n var t = this._parts.hostname.match(/\\./g);\n if (t && t.length < 2) {\n return this._parts.hostname;\n }\n\n // grab tld and add another segment\n var end = this._parts.hostname.length - this.tld(build).length - 1;\n end = this._parts.hostname.lastIndexOf('.', end - 1) + 1;\n return this._parts.hostname.substring(end) || '';\n } else {\n if (!v) {\n throw new TypeError('cannot set domain empty');\n }\n if (v.indexOf(':') !== -1) {\n throw new TypeError('Domains cannot contain colons');\n }\n URI.ensureValidHostname(v, this._parts.protocol);\n if (!this._parts.hostname || this.is('IP')) {\n this._parts.hostname = v;\n } else {\n var replace = new RegExp(escapeRegEx(this.domain()) + '$');\n this._parts.hostname = this._parts.hostname.replace(replace, v);\n }\n this.build(!build);\n return this;\n }\n };\n p.tld = function (v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n if (typeof v === 'boolean') {\n build = v;\n v = undefined;\n }\n\n // return \"org\" from \"www.example.org\"\n if (v === undefined) {\n if (!this._parts.hostname || this.is('IP')) {\n return '';\n }\n var pos = this._parts.hostname.lastIndexOf('.');\n var tld = this._parts.hostname.substring(pos + 1);\n if (build !== true && SLD && SLD.list[tld.toLowerCase()]) {\n return SLD.get(this._parts.hostname) || tld;\n }\n return tld;\n } else {\n var replace;\n if (!v) {\n throw new TypeError('cannot set TLD empty');\n } else if (v.match(/[^a-zA-Z0-9-]/)) {\n if (SLD && SLD.is(v)) {\n replace = new RegExp(escapeRegEx(this.tld()) + '$');\n this._parts.hostname = this._parts.hostname.replace(replace, v);\n } else {\n throw new TypeError('TLD \"' + v + '\" contains characters other than [A-Z0-9]');\n }\n } else if (!this._parts.hostname || this.is('IP')) {\n throw new ReferenceError('cannot set TLD on non-domain host');\n } else {\n replace = new RegExp(escapeRegEx(this.tld()) + '$');\n this._parts.hostname = this._parts.hostname.replace(replace, v);\n }\n this.build(!build);\n return this;\n }\n };\n p.directory = function (v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n if (v === undefined || v === true) {\n if (!this._parts.path && !this._parts.hostname) {\n return '';\n }\n if (this._parts.path === '/') {\n return '/';\n }\n var end = this._parts.path.length - this.filename().length - 1;\n var res = this._parts.path.substring(0, end) || (this._parts.hostname ? '/' : '');\n return v ? URI.decodePath(res) : res;\n } else {\n var e = this._parts.path.length - this.filename().length;\n var directory = this._parts.path.substring(0, e);\n var replace = new RegExp('^' + escapeRegEx(directory));\n\n // fully qualifier directories begin with a slash\n if (!this.is('relative')) {\n if (!v) {\n v = '/';\n }\n if (v.charAt(0) !== '/') {\n v = '/' + v;\n }\n }\n\n // directories always end with a slash\n if (v && v.charAt(v.length - 1) !== '/') {\n v += '/';\n }\n v = URI.recodePath(v);\n this._parts.path = this._parts.path.replace(replace, v);\n this.build(!build);\n return this;\n }\n };\n p.filename = function (v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n if (typeof v !== 'string') {\n if (!this._parts.path || this._parts.path === '/') {\n return '';\n }\n var pos = this._parts.path.lastIndexOf('/');\n var res = this._parts.path.substring(pos + 1);\n return v ? URI.decodePathSegment(res) : res;\n } else {\n var mutatedDirectory = false;\n if (v.charAt(0) === '/') {\n v = v.substring(1);\n }\n if (v.match(/\\.?\\//)) {\n mutatedDirectory = true;\n }\n var replace = new RegExp(escapeRegEx(this.filename()) + '$');\n v = URI.recodePath(v);\n this._parts.path = this._parts.path.replace(replace, v);\n if (mutatedDirectory) {\n this.normalizePath(build);\n } else {\n this.build(!build);\n }\n return this;\n }\n };\n p.suffix = function (v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n if (v === undefined || v === true) {\n if (!this._parts.path || this._parts.path === '/') {\n return '';\n }\n var filename = this.filename();\n var pos = filename.lastIndexOf('.');\n var s, res;\n if (pos === -1) {\n return '';\n }\n\n // suffix may only contain alnum characters (yup, I made this up.)\n s = filename.substring(pos + 1);\n res = /^[a-z0-9%]+$/i.test(s) ? s : '';\n return v ? URI.decodePathSegment(res) : res;\n } else {\n if (v.charAt(0) === '.') {\n v = v.substring(1);\n }\n var suffix = this.suffix();\n var replace;\n if (!suffix) {\n if (!v) {\n return this;\n }\n this._parts.path += '.' + URI.recodePath(v);\n } else if (!v) {\n replace = new RegExp(escapeRegEx('.' + suffix) + '$');\n } else {\n replace = new RegExp(escapeRegEx(suffix) + '$');\n }\n if (replace) {\n v = URI.recodePath(v);\n this._parts.path = this._parts.path.replace(replace, v);\n }\n this.build(!build);\n return this;\n }\n };\n p.segment = function (segment, v, build) {\n var separator = this._parts.urn ? ':' : '/';\n var path = this.path();\n var absolute = path.substring(0, 1) === '/';\n var segments = path.split(separator);\n if (segment !== undefined && typeof segment !== 'number') {\n build = v;\n v = segment;\n segment = undefined;\n }\n if (segment !== undefined && typeof segment !== 'number') {\n throw new Error('Bad segment \"' + segment + '\", must be 0-based integer');\n }\n if (absolute) {\n segments.shift();\n }\n if (segment < 0) {\n // allow negative indexes to address from the end\n segment = Math.max(segments.length + segment, 0);\n }\n if (v === undefined) {\n /*jshint laxbreak: true */\n return segment === undefined ? segments : segments[segment];\n /*jshint laxbreak: false */\n } else if (segment === null || segments[segment] === undefined) {\n if (isArray(v)) {\n segments = [];\n // collapse empty elements within array\n for (var i = 0, l = v.length; i < l; i++) {\n if (!v[i].length && (!segments.length || !segments[segments.length - 1].length)) {\n continue;\n }\n if (segments.length && !segments[segments.length - 1].length) {\n segments.pop();\n }\n segments.push(trimSlashes(v[i]));\n }\n } else if (v || typeof v === 'string') {\n v = trimSlashes(v);\n if (segments[segments.length - 1] === '') {\n // empty trailing elements have to be overwritten\n // to prevent results such as /foo//bar\n segments[segments.length - 1] = v;\n } else {\n segments.push(v);\n }\n }\n } else {\n if (v) {\n segments[segment] = trimSlashes(v);\n } else {\n segments.splice(segment, 1);\n }\n }\n if (absolute) {\n segments.unshift('');\n }\n return this.path(segments.join(separator), build);\n };\n p.segmentCoded = function (segment, v, build) {\n var segments, i, l;\n if (typeof segment !== 'number') {\n build = v;\n v = segment;\n segment = undefined;\n }\n if (v === undefined) {\n segments = this.segment(segment, v, build);\n if (!isArray(segments)) {\n segments = segments !== undefined ? URI.decode(segments) : undefined;\n } else {\n for (i = 0, l = segments.length; i < l; i++) {\n segments[i] = URI.decode(segments[i]);\n }\n }\n return segments;\n }\n if (!isArray(v)) {\n v = typeof v === 'string' || v instanceof String ? URI.encode(v) : v;\n } else {\n for (i = 0, l = v.length; i < l; i++) {\n v[i] = URI.encode(v[i]);\n }\n }\n return this.segment(segment, v, build);\n };\n\n // mutating query string\n var q = p.query;\n p.query = function (v, build) {\n if (v === true) {\n return URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n } else if (typeof v === 'function') {\n var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n var result = v.call(this, data);\n this._parts.query = URI.buildQuery(result || data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n this.build(!build);\n return this;\n } else if (v !== undefined && typeof v !== 'string') {\n this._parts.query = URI.buildQuery(v, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n this.build(!build);\n return this;\n } else {\n return q.call(this, v, build);\n }\n };\n p.setQuery = function (name, value, build) {\n var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n if (typeof name === 'string' || name instanceof String) {\n data[name] = value !== undefined ? value : null;\n } else if (typeof name === 'object') {\n for (var key in name) {\n if (hasOwn.call(name, key)) {\n data[key] = name[key];\n }\n }\n } else {\n throw new TypeError('URI.addQuery() accepts an object, string as the name parameter');\n }\n this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n if (typeof name !== 'string') {\n build = value;\n }\n this.build(!build);\n return this;\n };\n p.addQuery = function (name, value, build) {\n var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n URI.addQuery(data, name, value === undefined ? null : value);\n this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n if (typeof name !== 'string') {\n build = value;\n }\n this.build(!build);\n return this;\n };\n p.removeQuery = function (name, value, build) {\n var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n URI.removeQuery(data, name, value);\n this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n if (typeof name !== 'string') {\n build = value;\n }\n this.build(!build);\n return this;\n };\n p.hasQuery = function (name, value, withinArray) {\n var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n return URI.hasQuery(data, name, value, withinArray);\n };\n p.setSearch = p.setQuery;\n p.addSearch = p.addQuery;\n p.removeSearch = p.removeQuery;\n p.hasSearch = p.hasQuery;\n\n // sanitizing URLs\n p.normalize = function () {\n if (this._parts.urn) {\n return this.normalizeProtocol(false).normalizePath(false).normalizeQuery(false).normalizeFragment(false).build();\n }\n return this.normalizeProtocol(false).normalizeHostname(false).normalizePort(false).normalizePath(false).normalizeQuery(false).normalizeFragment(false).build();\n };\n p.normalizeProtocol = function (build) {\n if (typeof this._parts.protocol === 'string') {\n this._parts.protocol = this._parts.protocol.toLowerCase();\n this.build(!build);\n }\n return this;\n };\n p.normalizeHostname = function (build) {\n if (this._parts.hostname) {\n if (this.is('IDN') && punycode) {\n this._parts.hostname = punycode.toASCII(this._parts.hostname);\n } else if (this.is('IPv6') && IPv6) {\n this._parts.hostname = IPv6.best(this._parts.hostname);\n }\n this._parts.hostname = this._parts.hostname.toLowerCase();\n this.build(!build);\n }\n return this;\n };\n p.normalizePort = function (build) {\n // remove port of it's the protocol's default\n if (typeof this._parts.protocol === 'string' && this._parts.port === URI.defaultPorts[this._parts.protocol]) {\n this._parts.port = null;\n this.build(!build);\n }\n return this;\n };\n p.normalizePath = function (build) {\n var _path = this._parts.path;\n if (!_path) {\n return this;\n }\n if (this._parts.urn) {\n this._parts.path = URI.recodeUrnPath(this._parts.path);\n this.build(!build);\n return this;\n }\n if (this._parts.path === '/') {\n return this;\n }\n _path = URI.recodePath(_path);\n var _was_relative;\n var _leadingParents = '';\n var _parent, _pos;\n\n // handle relative paths\n if (_path.charAt(0) !== '/') {\n _was_relative = true;\n _path = '/' + _path;\n }\n\n // handle relative files (as opposed to directories)\n if (_path.slice(-3) === '/..' || _path.slice(-2) === '/.') {\n _path += '/';\n }\n\n // resolve simples\n _path = _path.replace(/(\\/(\\.\\/)+)|(\\/\\.$)/g, '/').replace(/\\/{2,}/g, '/');\n\n // remember leading parents\n if (_was_relative) {\n _leadingParents = _path.substring(1).match(/^(\\.\\.\\/)+/) || '';\n if (_leadingParents) {\n _leadingParents = _leadingParents[0];\n }\n }\n\n // resolve parents\n while (true) {\n _parent = _path.search(/\\/\\.\\.(\\/|$)/);\n if (_parent === -1) {\n // no more ../ to resolve\n break;\n } else if (_parent === 0) {\n // top level cannot be relative, skip it\n _path = _path.substring(3);\n continue;\n }\n _pos = _path.substring(0, _parent).lastIndexOf('/');\n if (_pos === -1) {\n _pos = _parent;\n }\n _path = _path.substring(0, _pos) + _path.substring(_parent + 3);\n }\n\n // revert to relative\n if (_was_relative && this.is('relative')) {\n _path = _leadingParents + _path.substring(1);\n }\n this._parts.path = _path;\n this.build(!build);\n return this;\n };\n p.normalizePathname = p.normalizePath;\n p.normalizeQuery = function (build) {\n if (typeof this._parts.query === 'string') {\n if (!this._parts.query.length) {\n this._parts.query = null;\n } else {\n this.query(URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace));\n }\n this.build(!build);\n }\n return this;\n };\n p.normalizeFragment = function (build) {\n if (!this._parts.fragment) {\n this._parts.fragment = null;\n this.build(!build);\n }\n return this;\n };\n p.normalizeSearch = p.normalizeQuery;\n p.normalizeHash = p.normalizeFragment;\n p.iso8859 = function () {\n // expect unicode input, iso8859 output\n var e = URI.encode;\n var d = URI.decode;\n URI.encode = escape;\n URI.decode = decodeURIComponent;\n try {\n this.normalize();\n } finally {\n URI.encode = e;\n URI.decode = d;\n }\n return this;\n };\n p.unicode = function () {\n // expect iso8859 input, unicode output\n var e = URI.encode;\n var d = URI.decode;\n URI.encode = strictEncodeURIComponent;\n URI.decode = unescape;\n try {\n this.normalize();\n } finally {\n URI.encode = e;\n URI.decode = d;\n }\n return this;\n };\n p.readable = function () {\n var uri = this.clone();\n // removing username, password, because they shouldn't be displayed according to RFC 3986\n uri.username('').password('').normalize();\n var t = '';\n if (uri._parts.protocol) {\n t += uri._parts.protocol + '://';\n }\n if (uri._parts.hostname) {\n if (uri.is('punycode') && punycode) {\n t += punycode.toUnicode(uri._parts.hostname);\n if (uri._parts.port) {\n t += ':' + uri._parts.port;\n }\n } else {\n t += uri.host();\n }\n }\n if (uri._parts.hostname && uri._parts.path && uri._parts.path.charAt(0) !== '/') {\n t += '/';\n }\n t += uri.path(true);\n if (uri._parts.query) {\n var q = '';\n for (var i = 0, qp = uri._parts.query.split('&'), l = qp.length; i < l; i++) {\n var kv = (qp[i] || '').split('=');\n q += '&' + URI.decodeQuery(kv[0], this._parts.escapeQuerySpace).replace(/&/g, '%26');\n if (kv[1] !== undefined) {\n q += '=' + URI.decodeQuery(kv[1], this._parts.escapeQuerySpace).replace(/&/g, '%26');\n }\n }\n t += '?' + q.substring(1);\n }\n t += URI.decodeQuery(uri.hash(), true);\n return t;\n };\n\n // resolving relative and absolute URLs\n p.absoluteTo = function (base) {\n var resolved = this.clone();\n var properties = ['protocol', 'username', 'password', 'hostname', 'port'];\n var basedir, i, p;\n if (this._parts.urn) {\n throw new Error('URNs do not have any generally defined hierarchical components');\n }\n if (!(base instanceof URI)) {\n base = new URI(base);\n }\n if (resolved._parts.protocol) {\n // Directly returns even if this._parts.hostname is empty.\n return resolved;\n } else {\n resolved._parts.protocol = base._parts.protocol;\n }\n if (this._parts.hostname) {\n return resolved;\n }\n for (i = 0; p = properties[i]; i++) {\n resolved._parts[p] = base._parts[p];\n }\n if (!resolved._parts.path) {\n resolved._parts.path = base._parts.path;\n if (!resolved._parts.query) {\n resolved._parts.query = base._parts.query;\n }\n } else {\n if (resolved._parts.path.substring(-2) === '..') {\n resolved._parts.path += '/';\n }\n if (resolved.path().charAt(0) !== '/') {\n basedir = base.directory();\n basedir = basedir ? basedir : base.path().indexOf('/') === 0 ? '/' : '';\n resolved._parts.path = (basedir ? basedir + '/' : '') + resolved._parts.path;\n resolved.normalizePath();\n }\n }\n resolved.build();\n return resolved;\n };\n p.relativeTo = function (base) {\n var relative = this.clone().normalize();\n var relativeParts, baseParts, common, relativePath, basePath;\n if (relative._parts.urn) {\n throw new Error('URNs do not have any generally defined hierarchical components');\n }\n base = new URI(base).normalize();\n relativeParts = relative._parts;\n baseParts = base._parts;\n relativePath = relative.path();\n basePath = base.path();\n if (relativePath.charAt(0) !== '/') {\n throw new Error('URI is already relative');\n }\n if (basePath.charAt(0) !== '/') {\n throw new Error('Cannot calculate a URI relative to another relative URI');\n }\n if (relativeParts.protocol === baseParts.protocol) {\n relativeParts.protocol = null;\n }\n if (relativeParts.username !== baseParts.username || relativeParts.password !== baseParts.password) {\n return relative.build();\n }\n if (relativeParts.protocol !== null || relativeParts.username !== null || relativeParts.password !== null) {\n return relative.build();\n }\n if (relativeParts.hostname === baseParts.hostname && relativeParts.port === baseParts.port) {\n relativeParts.hostname = null;\n relativeParts.port = null;\n } else {\n return relative.build();\n }\n if (relativePath === basePath) {\n relativeParts.path = '';\n return relative.build();\n }\n\n // determine common sub path\n common = URI.commonPath(relativePath, basePath);\n\n // If the paths have nothing in common, return a relative URL with the absolute path.\n if (!common) {\n return relative.build();\n }\n var parents = baseParts.path.substring(common.length).replace(/[^\\/]*$/, '').replace(/.*?\\//g, '../');\n relativeParts.path = parents + relativeParts.path.substring(common.length) || './';\n return relative.build();\n };\n\n // comparing URIs\n p.equals = function (uri) {\n var one = this.clone();\n var two = new URI(uri);\n var one_map = {};\n var two_map = {};\n var checked = {};\n var one_query, two_query, key;\n one.normalize();\n two.normalize();\n\n // exact match\n if (one.toString() === two.toString()) {\n return true;\n }\n\n // extract query string\n one_query = one.query();\n two_query = two.query();\n one.query('');\n two.query('');\n\n // definitely not equal if not even non-query parts match\n if (one.toString() !== two.toString()) {\n return false;\n }\n\n // query parameters have the same length, even if they're permuted\n if (one_query.length !== two_query.length) {\n return false;\n }\n one_map = URI.parseQuery(one_query, this._parts.escapeQuerySpace);\n two_map = URI.parseQuery(two_query, this._parts.escapeQuerySpace);\n for (key in one_map) {\n if (hasOwn.call(one_map, key)) {\n if (!isArray(one_map[key])) {\n if (one_map[key] !== two_map[key]) {\n return false;\n }\n } else if (!arraysEqual(one_map[key], two_map[key])) {\n return false;\n }\n checked[key] = true;\n }\n }\n for (key in two_map) {\n if (hasOwn.call(two_map, key)) {\n if (!checked[key]) {\n // two contains a parameter not present in one\n return false;\n }\n }\n }\n return true;\n };\n\n // state\n p.preventInvalidHostname = function (v) {\n this._parts.preventInvalidHostname = !!v;\n return this;\n };\n p.duplicateQueryParameters = function (v) {\n this._parts.duplicateQueryParameters = !!v;\n return this;\n };\n p.escapeQuerySpace = function (v) {\n this._parts.escapeQuerySpace = !!v;\n return this;\n };\n return URI;\n});","map":{"version":3,"names":["root","factory","module","exports","require","define","amd","URI","punycode","IPv6","SecondLevelDomains","SLD","_URI","url","base","_urlSupplied","arguments","length","_baseSupplied","undefined","TypeError","location","href","absoluteTo","isInteger","value","test","version","p","prototype","hasOwn","Object","hasOwnProperty","escapeRegEx","string","replace","getType","String","toString","call","slice","isArray","obj","filterArrayValues","data","lookup","i","_match","splice","arrayContains","list","_type","match","arraysEqual","one","two","sort","l","trimSlashes","text","trim_expression","_parts","protocol","username","password","hostname","urn","port","path","query","fragment","preventInvalidHostname","duplicateQueryParameters","escapeQuerySpace","protocol_expression","idn_expression","punycode_expression","ip4_expression","ip6_expression","find_uri_expression","findUri","start","end","trim","parens","leading_whitespace_expression","ascii_tab_whitespace","defaultPorts","http","https","ftp","gopher","ws","wss","hostProtocols","invalid_hostname_characters","domAttributes","getDomAttribute","node","nodeName","toLowerCase","type","escapeForDumbFirefox36","escape","strictEncodeURIComponent","encodeURIComponent","encode","decode","decodeURIComponent","iso8859","unescape","unicode","characters","pathname","expression","map","reserved","urnpath","encodeQuery","escaped","decodeQuery","e","_part","generateAccessor","_group","c","generateSegmentedPathFunction","_sep","_codingFuncName","_innerCodingFuncName","actualCodingFunc","segments","split","join","decodePath","decodeUrnPath","recodePath","recodeUrnPath","encodeReserved","parse","parts","pos","indexOf","substring","parseAuthority","parseHost","bracketPos","t","charAt","firstColon","firstSlash","nextColon","ensureValidHostname","ensureValidPort","parseUserinfo","_string","firstBackSlash","lastIndexOf","shift","parseQuery","items","splits","v","name","push","build","requireAbsolutePath","buildAuthority","buildHost","buildUserinfo","buildQuery","unique","key","buildQueryParameter","addQuery","concat","setQuery","removeQuery","hasQuery","withinArray","_key","_booly","Boolean","op","joinPaths","input","nonEmptySegments","_segments","segment","s","uri","normalize","commonPath","Math","min","withinString","callback","options","_start","_end","_trim","_parens","_attributeOpen","lastIndex","exec","index","ignoreHtml","attributeOpen","max","search","parensEnd","parensMatch","parensMatchEnd","ignore","result","hasHostname","hasProtocol","rejectEmptyHostname","toASCII","Number","noConflict","removeAll","unconflicted","URITemplate","deferBuild","_deferred_build","clone","valueOf","generateSimpleAccessor","generatePrefixAccessor","hash","res","_object","attribute","src","is","what","ip","ip4","ip6","sld","idn","relative","has","_protocol","_port","_hostname","scheme","x","origin","authority","host","userinfo","resource","subdomain","domain","sub","RegExp","tld","get","ReferenceError","directory","filename","decodePathSegment","mutatedDirectory","normalizePath","suffix","separator","absolute","Error","pop","unshift","segmentCoded","q","setSearch","addSearch","removeSearch","hasSearch","normalizeProtocol","normalizeQuery","normalizeFragment","normalizeHostname","normalizePort","best","_path","_was_relative","_leadingParents","_parent","_pos","normalizePathname","normalizeSearch","normalizeHash","d","readable","toUnicode","qp","kv","resolved","properties","basedir","relativeTo","relativeParts","baseParts","common","relativePath","basePath","parents","equals","one_map","two_map","checked","one_query","two_query"],"sources":["F:/workspace/202226701027/huinongbao-app/node_modules/urijs/src/URI.js"],"sourcesContent":["/*!\n * URI.js - Mutating URLs\n *\n * Version: 1.19.11\n *\n * Author: Rodney Rehm\n * Web: http://medialize.github.io/URI.js/\n *\n * Licensed under\n * MIT License http://www.opensource.org/licenses/mit-license\n *\n */\n(function (root, factory) {\n 'use strict';\n // https://github.com/umdjs/umd/blob/master/returnExports.js\n if (typeof module === 'object' && module.exports) {\n // Node\n module.exports = factory(require('./punycode'), require('./IPv6'), require('./SecondLevelDomains'));\n } else if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define(['./punycode', './IPv6', './SecondLevelDomains'], factory);\n } else {\n // Browser globals (root is window)\n root.URI = factory(root.punycode, root.IPv6, root.SecondLevelDomains, root);\n }\n}(this, function (punycode, IPv6, SLD, root) {\n 'use strict';\n /*global location, escape, unescape */\n // FIXME: v2.0.0 renamce non-camelCase properties to uppercase\n /*jshint camelcase: false */\n\n // save current URI variable, if any\n var _URI = root && root.URI;\n\n function URI(url, base) {\n var _urlSupplied = arguments.length >= 1;\n var _baseSupplied = arguments.length >= 2;\n\n // Allow instantiation without the 'new' keyword\n if (!(this instanceof URI)) {\n if (_urlSupplied) {\n if (_baseSupplied) {\n return new URI(url, base);\n }\n\n return new URI(url);\n }\n\n return new URI();\n }\n\n if (url === undefined) {\n if (_urlSupplied) {\n throw new TypeError('undefined is not a valid argument for URI');\n }\n\n if (typeof location !== 'undefined') {\n url = location.href + '';\n } else {\n url = '';\n }\n }\n\n if (url === null) {\n if (_urlSupplied) {\n throw new TypeError('null is not a valid argument for URI');\n }\n }\n\n this.href(url);\n\n // resolve to base according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#constructor\n if (base !== undefined) {\n return this.absoluteTo(base);\n }\n\n return this;\n }\n\n function isInteger(value) {\n return /^[0-9]+$/.test(value);\n }\n\n URI.version = '1.19.11';\n\n var p = URI.prototype;\n var hasOwn = Object.prototype.hasOwnProperty;\n\n function escapeRegEx(string) {\n // https://github.com/medialize/URI.js/commit/85ac21783c11f8ccab06106dba9735a31a86924d#commitcomment-821963\n return string.replace(/([.*+?^=!:${}()|[\\]\\/\\\\])/g, '\\\\$1');\n }\n\n function getType(value) {\n // IE8 doesn't return [Object Undefined] but [Object Object] for undefined value\n if (value === undefined) {\n return 'Undefined';\n }\n\n return String(Object.prototype.toString.call(value)).slice(8, -1);\n }\n\n function isArray(obj) {\n return getType(obj) === 'Array';\n }\n\n function filterArrayValues(data, value) {\n var lookup = {};\n var i, length;\n\n if (getType(value) === 'RegExp') {\n lookup = null;\n } else if (isArray(value)) {\n for (i = 0, length = value.length; i < length; i++) {\n lookup[value[i]] = true;\n }\n } else {\n lookup[value] = true;\n }\n\n for (i = 0, length = data.length; i < length; i++) {\n /*jshint laxbreak: true */\n var _match = lookup && lookup[data[i]] !== undefined\n || !lookup && value.test(data[i]);\n /*jshint laxbreak: false */\n if (_match) {\n data.splice(i, 1);\n length--;\n i--;\n }\n }\n\n return data;\n }\n\n function arrayContains(list, value) {\n var i, length;\n\n // value may be string, number, array, regexp\n if (isArray(value)) {\n // Note: this can be optimized to O(n) (instead of current O(m * n))\n for (i = 0, length = value.length; i < length; i++) {\n if (!arrayContains(list, value[i])) {\n return false;\n }\n }\n\n return true;\n }\n\n var _type = getType(value);\n for (i = 0, length = list.length; i < length; i++) {\n if (_type === 'RegExp') {\n if (typeof list[i] === 'string' && list[i].match(value)) {\n return true;\n }\n } else if (list[i] === value) {\n return true;\n }\n }\n\n return false;\n }\n\n function arraysEqual(one, two) {\n if (!isArray(one) || !isArray(two)) {\n return false;\n }\n\n // arrays can't be equal if they have different amount of content\n if (one.length !== two.length) {\n return false;\n }\n\n one.sort();\n two.sort();\n\n for (var i = 0, l = one.length; i < l; i++) {\n if (one[i] !== two[i]) {\n return false;\n }\n }\n\n return true;\n }\n\n function trimSlashes(text) {\n var trim_expression = /^\\/+|\\/+$/g;\n return text.replace(trim_expression, '');\n }\n\n URI._parts = function() {\n return {\n protocol: null,\n username: null,\n password: null,\n hostname: null,\n urn: null,\n port: null,\n path: null,\n query: null,\n fragment: null,\n // state\n preventInvalidHostname: URI.preventInvalidHostname,\n duplicateQueryParameters: URI.duplicateQueryParameters,\n escapeQuerySpace: URI.escapeQuerySpace\n };\n };\n // state: throw on invalid hostname\n // see https://github.com/medialize/URI.js/pull/345\n // and https://github.com/medialize/URI.js/issues/354\n URI.preventInvalidHostname = false;\n // state: allow duplicate query parameters (a=1&a=1)\n URI.duplicateQueryParameters = false;\n // state: replaces + with %20 (space in query strings)\n URI.escapeQuerySpace = true;\n // static properties\n URI.protocol_expression = /^[a-z][a-z0-9.+-]*$/i;\n URI.idn_expression = /[^a-z0-9\\._-]/i;\n URI.punycode_expression = /(xn--)/i;\n // well, 333.444.555.666 matches, but it sure ain't no IPv4 - do we care?\n URI.ip4_expression = /^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/;\n // credits to Rich Brown\n // source: http://forums.intermapper.com/viewtopic.php?p=1096#1096\n // specification: http://www.ietf.org/rfc/rfc4291.txt\n URI.ip6_expression = /^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$/;\n // expression used is \"gruber revised\" (@gruber v2) determined to be the\n // best solution in a regex-golf we did a couple of ages ago at\n // * http://mathiasbynens.be/demo/url-regex\n // * http://rodneyrehm.de/t/url-regex.html\n URI.find_uri_expression = /\\b((?:[a-z][\\w-]+:(?:\\/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}\\/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:'\".,<>?«»“”‘’]))/ig;\n URI.findUri = {\n // valid \"scheme://\" or \"www.\"\n start: /\\b(?:([a-z][a-z0-9.+-]*:\\/\\/)|www\\.)/gi,\n // everything up to the next whitespace\n end: /[\\s\\r\\n]|$/,\n // trim trailing punctuation captured by end RegExp\n trim: /[`!()\\[\\]{};:'\".,<>?«»“”„‘’]+$/,\n // balanced parens inclusion (), [], {}, <>\n parens: /(\\([^\\)]*\\)|\\[[^\\]]*\\]|\\{[^}]*\\}|<[^>]*>)/g,\n };\n URI.leading_whitespace_expression = /^[\\x00-\\x20\\u00a0\\u1680\\u2000-\\u200a\\u2028\\u2029\\u202f\\u205f\\u3000\\ufeff]+/\n // https://infra.spec.whatwg.org/#ascii-tab-or-newline\n URI.ascii_tab_whitespace = /[\\u0009\\u000A\\u000D]+/g\n // http://www.iana.org/assignments/uri-schemes.html\n // http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers#Well-known_ports\n URI.defaultPorts = {\n http: '80',\n https: '443',\n ftp: '21',\n gopher: '70',\n ws: '80',\n wss: '443'\n };\n // list of protocols which always require a hostname\n URI.hostProtocols = [\n 'http',\n 'https'\n ];\n\n // allowed hostname characters according to RFC 3986\n // ALPHA DIGIT \"-\" \".\" \"_\" \"~\" \"!\" \"$\" \"&\" \"'\" \"(\" \")\" \"*\" \"+\" \",\" \";\" \"=\" %encoded\n // I've never seen a (non-IDN) hostname other than: ALPHA DIGIT . - _\n URI.invalid_hostname_characters = /[^a-zA-Z0-9\\.\\-:_]/;\n // map DOM Elements to their URI attribute\n URI.domAttributes = {\n 'a': 'href',\n 'blockquote': 'cite',\n 'link': 'href',\n 'base': 'href',\n 'script': 'src',\n 'form': 'action',\n 'img': 'src',\n 'area': 'href',\n 'iframe': 'src',\n 'embed': 'src',\n 'source': 'src',\n 'track': 'src',\n 'input': 'src', // but only if type=\"image\"\n 'audio': 'src',\n 'video': 'src'\n };\n URI.getDomAttribute = function(node) {\n if (!node || !node.nodeName) {\n return undefined;\n }\n\n var nodeName = node.nodeName.toLowerCase();\n // <input> should only expose src for type=\"image\"\n if (nodeName === 'input' && node.type !== 'image') {\n return undefined;\n }\n\n return URI.domAttributes[nodeName];\n };\n\n function escapeForDumbFirefox36(value) {\n // https://github.com/medialize/URI.js/issues/91\n return escape(value);\n }\n\n // encoding / decoding according to RFC3986\n function strictEncodeURIComponent(string) {\n // see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/encodeURIComponent\n return encodeURIComponent(string)\n .replace(/[!'()*]/g, escapeForDumbFirefox36)\n .replace(/\\*/g, '%2A');\n }\n URI.encode = strictEncodeURIComponent;\n URI.decode = decodeURIComponent;\n URI.iso8859 = function() {\n URI.encode = escape;\n URI.decode = unescape;\n };\n URI.unicode = function() {\n URI.encode = strictEncodeURIComponent;\n URI.decode = decodeURIComponent;\n };\n URI.characters = {\n pathname: {\n encode: {\n // RFC3986 2.1: For consistency, URI producers and normalizers should\n // use uppercase hexadecimal digits for all percent-encodings.\n expression: /%(24|26|2B|2C|3B|3D|3A|40)/ig,\n map: {\n // -._~!'()*\n '%24': '$',\n '%26': '&',\n '%2B': '+',\n '%2C': ',',\n '%3B': ';',\n '%3D': '=',\n '%3A': ':',\n '%40': '@'\n }\n },\n decode: {\n expression: /[\\/\\?#]/g,\n map: {\n '/': '%2F',\n '?': '%3F',\n '#': '%23'\n }\n }\n },\n reserved: {\n encode: {\n // RFC3986 2.1: For consistency, URI producers and normalizers should\n // use uppercase hexadecimal digits for all percent-encodings.\n expression: /%(21|23|24|26|27|28|29|2A|2B|2C|2F|3A|3B|3D|3F|40|5B|5D)/ig,\n map: {\n // gen-delims\n '%3A': ':',\n '%2F': '/',\n '%3F': '?',\n '%23': '#',\n '%5B': '[',\n '%5D': ']',\n '%40': '@',\n // sub-delims\n '%21': '!',\n '%24': '$',\n '%26': '&',\n '%27': '\\'',\n '%28': '(',\n '%29': ')',\n '%2A': '*',\n '%2B': '+',\n '%2C': ',',\n '%3B': ';',\n '%3D': '='\n }\n }\n },\n urnpath: {\n // The characters under `encode` are the characters called out by RFC 2141 as being acceptable\n // for usage in a URN. RFC2141 also calls out \"-\", \".\", and \"_\" as acceptable characters, but\n // these aren't encoded by encodeURIComponent, so we don't have to call them out here. Also\n // note that the colon character is not featured in the encoding map; this is because URI.js\n // gives the colons in URNs semantic meaning as the delimiters of path segements, and so it\n // should not appear unencoded in a segment itself.\n // See also the note above about RFC3986 and capitalalized hex digits.\n encode: {\n expression: /%(21|24|27|28|29|2A|2B|2C|3B|3D|40)/ig,\n map: {\n '%21': '!',\n '%24': '$',\n '%27': '\\'',\n '%28': '(',\n '%29': ')',\n '%2A': '*',\n '%2B': '+',\n '%2C': ',',\n '%3B': ';',\n '%3D': '=',\n '%40': '@'\n }\n },\n // These characters are the characters called out by RFC2141 as \"reserved\" characters that\n // should never appear in a URN, plus the colon character (see note above).\n decode: {\n expression: /[\\/\\?#:]/g,\n map: {\n '/': '%2F',\n '?': '%3F',\n '#': '%23',\n ':': '%3A'\n }\n }\n }\n };\n URI.encodeQuery = function(string, escapeQuerySpace) {\n var escaped = URI.encode(string + '');\n if (escapeQuerySpace === undefined) {\n escapeQuerySpace = URI.escapeQuerySpace;\n }\n\n return escapeQuerySpace ? escaped.replace(/%20/g, '+') : escaped;\n };\n URI.decodeQuery = function(string, escapeQuerySpace) {\n string += '';\n if (escapeQuerySpace === undefined) {\n escapeQuerySpace = URI.escapeQuerySpace;\n }\n\n try {\n return URI.decode(escapeQuerySpace ? string.replace(/\\+/g, '%20') : string);\n } catch(e) {\n // we're not going to mess with weird encodings,\n // give up and return the undecoded original string\n // see https://github.com/medialize/URI.js/issues/87\n // see https://github.com/medialize/URI.js/issues/92\n return string;\n }\n };\n // generate encode/decode path functions\n var _parts = {'encode':'encode', 'decode':'decode'};\n var _part;\n var generateAccessor = function(_group, _part) {\n return function(string) {\n try {\n return URI[_part](string + '').replace(URI.characters[_group][_part].expression, function(c) {\n return URI.characters[_group][_part].map[c];\n });\n } catch (e) {\n // we're not going to mess with weird encodings,\n // give up and return the undecoded original string\n // see https://github.com/medialize/URI.js/issues/87\n // see https://github.com/medialize/URI.js/issues/92\n return string;\n }\n };\n };\n\n for (_part in _parts) {\n URI[_part + 'PathSegment'] = generateAccessor('pathname', _parts[_part]);\n URI[_part + 'UrnPathSegment'] = generateAccessor('urnpath', _parts[_part]);\n }\n\n var generateSegmentedPathFunction = function(_sep, _codingFuncName, _innerCodingFuncName) {\n return function(string) {\n // Why pass in names of functions, rather than the function objects themselves? The\n // definitions of some functions (but in particular, URI.decode) will occasionally change due\n // to URI.js having ISO8859 and Unicode modes. Passing in the name and getting it will ensure\n // that the functions we use here are \"fresh\".\n var actualCodingFunc;\n if (!_innerCodingFuncName) {\n actualCodingFunc = URI[_codingFuncName];\n } else {\n actualCodingFunc = function(string) {\n return URI[_codingFuncName](URI[_innerCodingFuncName](string));\n };\n }\n\n var segments = (string + '').split(_sep);\n\n for (var i = 0, length = segments.length; i < length; i++) {\n segments[i] = actualCodingFunc(segments[i]);\n }\n\n return segments.join(_sep);\n };\n };\n\n // This takes place outside the above loop because we don't want, e.g., encodeUrnPath functions.\n URI.decodePath = generateSegmentedPathFunction('/', 'decodePathSegment');\n URI.decodeUrnPath = generateSegmentedPathFunction(':', 'decodeUrnPathSegment');\n URI.recodePath = generateSegmentedPathFunction('/', 'encodePathSegment', 'decode');\n URI.recodeUrnPath = generateSegmentedPathFunction(':', 'encodeUrnPathSegment', 'decode');\n\n URI.encodeReserved = generateAccessor('reserved', 'encode');\n\n URI.parse = function(string, parts) {\n var pos;\n if (!parts) {\n parts = {\n preventInvalidHostname: URI.preventInvalidHostname\n };\n }\n\n string = string.replace(URI.leading_whitespace_expression, '')\n // https://infra.spec.whatwg.org/#ascii-tab-or-newline\n string = string.replace(URI.ascii_tab_whitespace, '')\n\n // [protocol\"://\"[username[\":\"password]\"@\"]hostname[\":\"port]\"/\"?][path][\"?\"querystring][\"#\"fragment]\n\n // extract fragment\n pos = string.indexOf('#');\n if (pos > -1) {\n // escaping?\n parts.fragment = string.substring(pos + 1) || null;\n string = string.substring(0, pos);\n }\n\n // extract query\n pos = string.indexOf('?');\n if (pos > -1) {\n // escaping?\n parts.query = string.substring(pos + 1) || null;\n string = string.substring(0, pos);\n }\n\n // slashes and backslashes have lost all meaning for the web protocols (https, http, wss, ws)\n string = string.replace(/^(https?|ftp|wss?)?:+[/\\\\]*/i, '$1://');\n // slashes and backslashes have lost all meaning for scheme relative URLs\n string = string.replace(/^[/\\\\]{2,}/i, '//');\n\n // extract protocol\n if (string.substring(0, 2) === '//') {\n // relative-scheme\n parts.protocol = null;\n string = string.substring(2);\n // extract \"user:pass@host:port\"\n string = URI.parseAuthority(string, parts);\n } else {\n pos = string.indexOf(':');\n if (pos > -1) {\n parts.protocol = string.substring(0, pos) || null;\n if (parts.protocol && !parts.protocol.match(URI.protocol_expression)) {\n // : may be within the path\n parts.protocol = undefined;\n } else if (string.substring(pos + 1, pos + 3).replace(/\\\\/g, '/') === '//') {\n string = string.substring(pos + 3);\n\n // extract \"user:pass@host:port\"\n string = URI.parseAuthority(string, parts);\n } else {\n string = string.substring(pos + 1);\n parts.urn = true;\n }\n }\n }\n\n // what's left must be the path\n parts.path = string;\n\n // and we're done\n return parts;\n };\n URI.parseHost = function(string, parts) {\n if (!string) {\n string = '';\n }\n\n // Copy chrome, IE, opera backslash-handling behavior.\n // Back slashes before the query string get converted to forward slashes\n // See: https://github.com/joyent/node/blob/386fd24f49b0e9d1a8a076592a404168faeecc34/lib/url.js#L115-L124\n // See: https://code.google.com/p/chromium/issues/detail?id=25916\n // https://github.com/medialize/URI.js/pull/233\n string = string.replace(/\\\\/g, '/');\n\n // extract host:port\n var pos = string.indexOf('/');\n var bracketPos;\n var t;\n\n if (pos === -1) {\n pos = string.length;\n }\n\n if (string.charAt(0) === '[') {\n // IPv6 host - http://tools.ietf.org/html/draft-ietf-6man-text-addr-representation-04#section-6\n // I claim most client software breaks on IPv6 anyways. To simplify things, URI only accepts\n // IPv6+port in the format [2001:db8::1]:80 (for the time being)\n bracketPos = string.indexOf(']');\n parts.hostname = string.substring(1, bracketPos) || null;\n parts.port = string.substring(bracketPos + 2, pos) || null;\n if (parts.port === '/') {\n parts.port = null;\n }\n } else {\n var firstColon = string.indexOf(':');\n var firstSlash = string.indexOf('/');\n var nextColon = string.indexOf(':', firstColon + 1);\n if (nextColon !== -1 && (firstSlash === -1 || nextColon < firstSlash)) {\n // IPv6 host contains multiple colons - but no port\n // this notation is actually not allowed by RFC 3986, but we're a liberal parser\n parts.hostname = string.substring(0, pos) || null;\n parts.port = null;\n } else {\n t = string.substring(0, pos).split(':');\n parts.hostname = t[0] || null;\n parts.port = t[1] || null;\n }\n }\n\n if (parts.hostname && string.substring(pos).charAt(0) !== '/') {\n pos++;\n string = '/' + string;\n }\n\n if (parts.preventInvalidHostname) {\n URI.ensureValidHostname(parts.hostname, parts.protocol);\n }\n\n if (parts.port) {\n URI.ensureValidPort(parts.port);\n }\n\n return string.substring(pos) || '/';\n };\n URI.parseAuthority = function(string, parts) {\n string = URI.parseUserinfo(string, parts);\n return URI.parseHost(string, parts);\n };\n URI.parseUserinfo = function(string, parts) {\n // extract username:password\n var _string = string\n var firstBackSlash = string.indexOf('\\\\');\n if (firstBackSlash !== -1) {\n string = string.replace(/\\\\/g, '/')\n }\n var firstSlash = string.indexOf('/');\n var pos = string.lastIndexOf('@', firstSlash > -1 ? firstSlash : string.length - 1);\n var t;\n\n // authority@ must come before /path or \\path\n if (pos > -1 && (firstSlash === -1 || pos < firstSlash)) {\n t = string.substring(0, pos).split(':');\n parts.username = t[0] ? URI.decode(t[0]) : null;\n t.shift();\n parts.password = t[0] ? URI.decode(t.join(':')) : null;\n string = _string.substring(pos + 1);\n } else {\n parts.username = null;\n parts.password = null;\n }\n\n return string;\n };\n URI.parseQuery = function(string, escapeQuerySpace) {\n if (!string) {\n return {};\n }\n\n // throw out the funky business - \"?\"[name\"=\"value\"&\"]+\n string = string.replace(/&+/g, '&').replace(/^\\?*&*|&+$/g, '');\n\n if (!string) {\n return {};\n }\n\n var items = {};\n var splits = string.split('&');\n var length = splits.length;\n var v, name, value;\n\n for (var i = 0; i < length; i++) {\n v = splits[i].split('=');\n name = URI.decodeQuery(v.shift(), escapeQuerySpace);\n // no \"=\" is null according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#collect-url-parameters\n value = v.length ? URI.decodeQuery(v.join('='), escapeQuerySpace) : null;\n\n if (name === '__proto__') {\n // ignore attempt at exploiting JavaScript internals\n continue;\n } else if (hasOwn.call(items, name)) {\n if (typeof items[name] === 'string' || items[name] === null) {\n items[name] = [items[name]];\n }\n\n items[name].push(value);\n } else {\n items[name] = value;\n }\n }\n\n return items;\n };\n\n URI.build = function(parts) {\n var t = '';\n var requireAbsolutePath = false\n\n if (parts.protocol) {\n t += parts.protocol + ':';\n }\n\n if (!parts.urn && (t || parts.hostname)) {\n t += '//';\n requireAbsolutePath = true\n }\n\n t += (URI.buildAuthority(parts) || '');\n\n if (typeof parts.path === 'string') {\n if (parts.path.charAt(0) !== '/' && requireAbsolutePath) {\n t += '/';\n }\n\n t += parts.path;\n }\n\n if (typeof parts.query === 'string' && parts.query) {\n t += '?' + parts.query;\n }\n\n if (typeof parts.fragment === 'string' && parts.fragment) {\n t += '#' + parts.fragment;\n }\n return t;\n };\n URI.buildHost = function(parts) {\n var t = '';\n\n if (!parts.hostname) {\n return '';\n } else if (URI.ip6_expression.test(parts.hostname)) {\n t += '[' + parts.hostname + ']';\n } else {\n t += parts.hostname;\n }\n\n if (parts.port) {\n t += ':' + parts.port;\n }\n\n return t;\n };\n URI.buildAuthority = function(parts) {\n return URI.buildUserinfo(parts) + URI.buildHost(parts);\n };\n URI.buildUserinfo = function(parts) {\n var t = '';\n\n if (parts.username) {\n t += URI.encode(parts.username);\n }\n\n if (parts.password) {\n t += ':' + URI.encode(parts.password);\n }\n\n if (t) {\n t += '@';\n }\n\n return t;\n };\n URI.buildQuery = function(data, duplicateQueryParameters, escapeQuerySpace) {\n // according to http://tools.ietf.org/html/rfc3986 or http://labs.apache.org/webarch/uri/rfc/rfc3986.html\n // being »-._~!$&'()*+,;=:@/?« %HEX and alnum are allowed\n // the RFC explicitly states ?/foo being a valid use case, no mention of parameter syntax!\n // URI.js treats the query string as being application/x-www-form-urlencoded\n // see http://www.w3.org/TR/REC-html40/interact/forms.html#form-content-type\n\n var t = '';\n var unique, key, i, length;\n for (key in data) {\n if (key === '__proto__') {\n // ignore attempt at exploiting JavaScript internals\n continue;\n } else if (hasOwn.call(data, key)) {\n if (isArray(data[key])) {\n unique = {};\n for (i = 0, length = data[key].length; i < length; i++) {\n if (data[key][i] !== undefined && unique[data[key][i] + ''] === undefined) {\n t += '&' + URI.buildQueryParameter(key, data[key][i], escapeQuerySpace);\n if (duplicateQueryParameters !== true) {\n unique[data[key][i] + ''] = true;\n }\n }\n }\n } else if (data[key] !== undefined) {\n t += '&' + URI.buildQueryParameter(key, data[key], escapeQuerySpace);\n }\n }\n }\n\n return t.substring(1);\n };\n URI.buildQueryParameter = function(name, value, escapeQuerySpace) {\n // http://www.w3.org/TR/REC-html40/interact/forms.html#form-content-type -- application/x-www-form-urlencoded\n // don't append \"=\" for null values, according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#url-parameter-serialization\n return URI.encodeQuery(name, escapeQuerySpace) + (value !== null ? '=' + URI.encodeQuery(value, escapeQuerySpace) : '');\n };\n\n URI.addQuery = function(data, name, value) {\n if (typeof name === 'object') {\n for (var key in name) {\n if (hasOwn.call(name, key)) {\n URI.addQuery(data, key, name[key]);\n }\n }\n } else if (typeof name === 'string') {\n if (data[name] === undefined) {\n data[name] = value;\n return;\n } else if (typeof data[name] === 'string') {\n data[name] = [data[name]];\n }\n\n if (!isArray(value)) {\n value = [value];\n }\n\n data[name] = (data[name] || []).concat(value);\n } else {\n throw new TypeError('URI.addQuery() accepts an object, string as the name parameter');\n }\n };\n\n URI.setQuery = function(data, name, value) {\n if (typeof name === 'object') {\n for (var key in name) {\n if (hasOwn.call(name, key)) {\n URI.setQuery(data, key, name[key]);\n }\n }\n } else if (typeof name === 'string') {\n data[name] = value === undefined ? null : value;\n } else {\n throw new TypeError('URI.setQuery() accepts an object, string as the name parameter');\n }\n };\n\n URI.removeQuery = function(data, name, value) {\n var i, length, key;\n\n if (isArray(name)) {\n for (i = 0, length = name.length; i < length; i++) {\n data[name[i]] = undefined;\n }\n } else if (getType(name) === 'RegExp') {\n for (key in data) {\n if (name.test(key)) {\n data[key] = undefined;\n }\n }\n } else if (typeof name === 'object') {\n for (key in name) {\n if (hasOwn.call(name, key)) {\n URI.removeQuery(data, key, name[key]);\n }\n }\n } else if (typeof name === 'string') {\n if (value !== undefined) {\n if (getType(value) === 'RegExp') {\n if (!isArray(data[name]) && value.test(data[name])) {\n data[name] = undefined;\n } else {\n data[name] = filterArrayValues(data[name], value);\n }\n } else if (data[name] === String(value) && (!isArray(value) || value.length === 1)) {\n data[name] = undefined;\n } else if (isArray(data[name])) {\n data[name] = filterArrayValues(data[name], value);\n }\n } else {\n data[name] = undefined;\n }\n } else {\n throw new TypeError('URI.removeQuery() accepts an object, string, RegExp as the first parameter');\n }\n };\n URI.hasQuery = function(data, name, value, withinArray) {\n switch (getType(name)) {\n case 'String':\n // Nothing to do here\n break;\n\n case 'RegExp':\n for (var key in data) {\n if (hasOwn.call(data, key)) {\n if (name.test(key) && (value === undefined || URI.hasQuery(data, key, value))) {\n return true;\n }\n }\n }\n\n return false;\n\n case 'Object':\n for (var _key in name) {\n if (hasOwn.call(name, _key)) {\n if (!URI.hasQuery(data, _key, name[_key])) {\n return false;\n }\n }\n }\n\n return true;\n\n default:\n throw new TypeError('URI.hasQuery() accepts a string, regular expression or object as the name parameter');\n }\n\n switch (getType(value)) {\n case 'Undefined':\n // true if exists (but may be empty)\n return name in data; // data[name] !== undefined;\n\n case 'Boolean':\n // true if exists and non-empty\n var _booly = Boolean(isArray(data[name]) ? data[name].length : data[name]);\n return value === _booly;\n\n case 'Function':\n // allow complex comparison\n return !!value(data[name], name, data);\n\n case 'Array':\n if (!isArray(data[name])) {\n return false;\n }\n\n var op = withinArray ? arrayContains : arraysEqual;\n return op(data[name], value);\n\n case 'RegExp':\n if (!isArray(data[name])) {\n return Boolean(data[name] && data[name].match(value));\n }\n\n if (!withinArray) {\n return false;\n }\n\n return arrayContains(data[name], value);\n\n case 'Number':\n value = String(value);\n /* falls through */\n case 'String':\n if (!isArray(data[name])) {\n return data[name] === value;\n }\n\n if (!withinArray) {\n return false;\n }\n\n return arrayContains(data[name], value);\n\n default:\n throw new TypeError('URI.hasQuery() accepts undefined, boolean, string, number, RegExp, Function as the value parameter');\n }\n };\n\n\n URI.joinPaths = function() {\n var input = [];\n var segments = [];\n var nonEmptySegments = 0;\n\n for (var i = 0; i < arguments.length; i++) {\n var url = new URI(arguments[i]);\n input.push(url);\n var _segments = url.segment();\n for (var s = 0; s < _segments.length; s++) {\n if (typeof _segments[s] === 'string') {\n segments.push(_segments[s]);\n }\n\n if (_segments[s]) {\n nonEmptySegments++;\n }\n }\n }\n\n if (!segments.length || !nonEmptySegments) {\n return new URI('');\n }\n\n var uri = new URI('').segment(segments);\n\n if (input[0].path() === '' || input[0].path().slice(0, 1) === '/') {\n uri.path('/' + uri.path());\n }\n\n return uri.normalize();\n };\n\n URI.commonPath = function(one, two) {\n var length = Math.min(one.length, two.length);\n var pos;\n\n // find first non-matching character\n for (pos = 0; pos < length; pos++) {\n if (one.charAt(pos) !== two.charAt(pos)) {\n pos--;\n break;\n }\n }\n\n if (pos < 1) {\n return one.charAt(0) === two.charAt(0) && one.charAt(0) === '/' ? '/' : '';\n }\n\n // revert to last /\n if (one.charAt(pos) !== '/' || two.charAt(pos) !== '/') {\n pos = one.substring(0, pos).lastIndexOf('/');\n }\n\n return one.substring(0, pos + 1);\n };\n\n URI.withinString = function(string, callback, options) {\n options || (options = {});\n var _start = options.start || URI.findUri.start;\n var _end = options.end || URI.findUri.end;\n var _trim = options.trim || URI.findUri.trim;\n var _parens = options.parens || URI.findUri.parens;\n var _attributeOpen = /[a-z0-9-]=[\"']?$/i;\n\n _start.lastIndex = 0;\n while (true) {\n var match = _start.exec(string);\n if (!match) {\n break;\n }\n\n var start = match.index;\n if (options.ignoreHtml) {\n // attribut(e=[\"']?$)\n var attributeOpen = string.slice(Math.max(start - 3, 0), start);\n if (attributeOpen && _attributeOpen.test(attributeOpen)) {\n continue;\n }\n }\n\n var end = start + string.slice(start).search(_end);\n var slice = string.slice(start, end);\n // make sure we include well balanced parens\n var parensEnd = -1;\n while (true) {\n var parensMatch = _parens.exec(slice);\n if (!parensMatch) {\n break;\n }\n\n var parensMatchEnd = parensMatch.index + parensMatch[0].length;\n parensEnd = Math.max(parensEnd, parensMatchEnd);\n }\n\n if (parensEnd > -1) {\n slice = slice.slice(0, parensEnd) + slice.slice(parensEnd).replace(_trim, '');\n } else {\n slice = slice.replace(_trim, '');\n }\n\n if (slice.length <= match[0].length) {\n // the extract only contains the starting marker of a URI,\n // e.g. \"www\" or \"http://\"\n continue;\n }\n\n if (options.ignore && options.ignore.test(slice)) {\n continue;\n }\n\n end = start + slice.length;\n var result = callback(slice, start, end, string);\n if (result === undefined) {\n _start.lastIndex = end;\n continue;\n }\n\n result = String(result);\n string = string.slice(0, start) + result + string.slice(end);\n _start.lastIndex = start + result.length;\n }\n\n _start.lastIndex = 0;\n return string;\n };\n\n URI.ensureValidHostname = function(v, protocol) {\n // Theoretically URIs allow percent-encoding in Hostnames (according to RFC 3986)\n // they are not part of DNS and therefore ignored by URI.js\n\n var hasHostname = !!v; // not null and not an empty string\n var hasProtocol = !!protocol;\n var rejectEmptyHostname = false;\n\n if (hasProtocol) {\n rejectEmptyHostname = arrayContains(URI.hostProtocols, protocol);\n }\n\n if (rejectEmptyHostname && !hasHostname) {\n throw new TypeError('Hostname cannot be empty, if protocol is ' + protocol);\n } else if (v && v.match(URI.invalid_hostname_characters)) {\n // test punycode\n if (!punycode) {\n throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-:_] and Punycode.js is not available');\n }\n if (punycode.toASCII(v).match(URI.invalid_hostname_characters)) {\n throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-:_]');\n }\n }\n };\n\n URI.ensureValidPort = function (v) {\n if (!v) {\n return;\n }\n\n var port = Number(v);\n if (isInteger(port) && (port > 0) && (port < 65536)) {\n return;\n }\n\n throw new TypeError('Port \"' + v + '\" is not a valid port');\n };\n\n // noConflict\n URI.noConflict = function(removeAll) {\n if (removeAll) {\n var unconflicted = {\n URI: this.noConflict()\n };\n\n if (root.URITemplate && typeof root.URITemplate.noConflict === 'function') {\n unconflicted.URITemplate = root.URITemplate.noConflict();\n }\n\n if (root.IPv6 && typeof root.IPv6.noConflict === 'function') {\n unconflicted.IPv6 = root.IPv6.noConflict();\n }\n\n if (root.SecondLevelDomains && typeof root.SecondLevelDomains.noConflict === 'function') {\n unconflicted.SecondLevelDomains = root.SecondLevelDomains.noConflict();\n }\n\n return unconflicted;\n } else if (root.URI === this) {\n root.URI = _URI;\n }\n\n return this;\n };\n\n p.build = function(deferBuild) {\n if (deferBuild === true) {\n this._deferred_build = true;\n } else if (deferBuild === undefined || this._deferred_build) {\n this._string = URI.build(this._parts);\n this._deferred_build = false;\n }\n\n return this;\n };\n\n p.clone = function() {\n return new URI(this);\n };\n\n p.valueOf = p.toString = function() {\n return this.build(false)._string;\n };\n\n\n function generateSimpleAccessor(_part){\n return function(v, build) {\n if (v === undefined) {\n return this._parts[_part] || '';\n } else {\n this._parts[_part] = v || null;\n this.build(!build);\n return this;\n }\n };\n }\n\n function generatePrefixAccessor(_part, _key){\n return function(v, build) {\n if (v === undefined) {\n return this._parts[_part] || '';\n } else {\n if (v !== null) {\n v = v + '';\n if (v.charAt(0) === _key) {\n v = v.substring(1);\n }\n }\n\n this._parts[_part] = v;\n this.build(!build);\n return this;\n }\n };\n }\n\n p.protocol = generateSimpleAccessor('protocol');\n p.username = generateSimpleAccessor('username');\n p.password = generateSimpleAccessor('password');\n p.hostname = generateSimpleAccessor('hostname');\n p.port = generateSimpleAccessor('port');\n p.query = generatePrefixAccessor('query', '?');\n p.fragment = generatePrefixAccessor('fragment', '#');\n\n p.search = function(v, build) {\n var t = this.query(v, build);\n return typeof t === 'string' && t.length ? ('?' + t) : t;\n };\n p.hash = function(v, build) {\n var t = this.fragment(v, build);\n return typeof t === 'string' && t.length ? ('#' + t) : t;\n };\n\n p.pathname = function(v, build) {\n if (v === undefined || v === true) {\n var res = this._parts.path || (this._parts.hostname ? '/' : '');\n return v ? (this._parts.urn ? URI.decodeUrnPath : URI.decodePath)(res) : res;\n } else {\n if (this._parts.urn) {\n this._parts.path = v ? URI.recodeUrnPath(v) : '';\n } else {\n this._parts.path = v ? URI.recodePath(v) : '/';\n }\n this.build(!build);\n return this;\n }\n };\n p.path = p.pathname;\n p.href = function(href, build) {\n var key;\n\n if (href === undefined) {\n return this.toString();\n }\n\n this._string = '';\n this._parts = URI._parts();\n\n var _URI = href instanceof URI;\n var _object = typeof href === 'object' && (href.hostname || href.path || href.pathname);\n if (href.nodeName) {\n var attribute = URI.getDomAttribute(href);\n href = href[attribute] || '';\n _object = false;\n }\n\n // window.location is reported to be an object, but it's not the sort\n // of object we're looking for:\n // * location.protocol ends with a colon\n // * location.query != object.search\n // * location.hash != object.fragment\n // simply serializing the unknown object should do the trick\n // (for location, not for everything...)\n if (!_URI && _object && href.pathname !== undefined) {\n href = href.toString();\n }\n\n if (typeof href === 'string' || href instanceof String) {\n this._parts = URI.parse(String(href), this._parts);\n } else if (_URI || _object) {\n var src = _URI ? href._parts : href;\n for (key in src) {\n if (key === 'query') { continue; }\n if (hasOwn.call(this._parts, key)) {\n this._parts[key] = src[key];\n }\n }\n if (src.query) {\n this.query(src.query, false);\n }\n } else {\n throw new TypeError('invalid input');\n }\n\n this.build(!build);\n return this;\n };\n\n // identification accessors\n p.is = function(what) {\n var ip = false;\n var ip4 = false;\n var ip6 = false;\n var name = false;\n var sld = false;\n var idn = false;\n var punycode = false;\n var relative = !this._parts.urn;\n\n if (this._parts.hostname) {\n relative = false;\n ip4 = URI.ip4_expression.test(this._parts.hostname);\n ip6 = URI.ip6_expression.test(this._parts.hostname);\n ip = ip4 || ip6;\n name = !ip;\n sld = name && SLD && SLD.has(this._parts.hostname);\n idn = name && URI.idn_expression.test(this._parts.hostname);\n punycode = name && URI.punycode_expression.test(this._parts.hostname);\n }\n\n switch (what.toLowerCase()) {\n case 'relative':\n return relative;\n\n case 'absolute':\n return !relative;\n\n // hostname identification\n case 'domain':\n case 'name':\n return name;\n\n case 'sld':\n return sld;\n\n case 'ip':\n return ip;\n\n case 'ip4':\n case 'ipv4':\n case 'inet4':\n return ip4;\n\n case 'ip6':\n case 'ipv6':\n case 'inet6':\n return ip6;\n\n case 'idn':\n return idn;\n\n case 'url':\n return !this._parts.urn;\n\n case 'urn':\n return !!this._parts.urn;\n\n case 'punycode':\n return punycode;\n }\n\n return null;\n };\n\n // component specific input validation\n var _protocol = p.protocol;\n var _port = p.port;\n var _hostname = p.hostname;\n\n p.protocol = function(v, build) {\n if (v) {\n // accept trailing ://\n v = v.replace(/:(\\/\\/)?$/, '');\n\n if (!v.match(URI.protocol_expression)) {\n throw new TypeError('Protocol \"' + v + '\" contains characters other than [A-Z0-9.+-] or doesn\\'t start with [A-Z]');\n }\n }\n\n return _protocol.call(this, v, build);\n };\n p.scheme = p.protocol;\n p.port = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v !== undefined) {\n if (v === 0) {\n v = null;\n }\n\n if (v) {\n v += '';\n if (v.charAt(0) === ':') {\n v = v.substring(1);\n }\n\n URI.ensureValidPort(v);\n }\n }\n return _port.call(this, v, build);\n };\n p.hostname = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v !== undefined) {\n var x = { preventInvalidHostname: this._parts.preventInvalidHostname };\n var res = URI.parseHost(v, x);\n if (res !== '/') {\n throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-]');\n }\n\n v = x.hostname;\n if (this._parts.preventInvalidHostname) {\n URI.ensureValidHostname(v, this._parts.protocol);\n }\n }\n\n return _hostname.call(this, v, build);\n };\n\n // compound accessors\n p.origin = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined) {\n var protocol = this.protocol();\n var authority = this.authority();\n if (!authority) {\n return '';\n }\n\n return (protocol ? protocol + '://' : '') + this.authority();\n } else {\n var origin = URI(v);\n this\n .protocol(origin.protocol())\n .authority(origin.authority())\n .build(!build);\n return this;\n }\n };\n p.host = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined) {\n return this._parts.hostname ? URI.buildHost(this._parts) : '';\n } else {\n var res = URI.parseHost(v, this._parts);\n if (res !== '/') {\n throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-]');\n }\n\n this.build(!build);\n return this;\n }\n };\n p.authority = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined) {\n return this._parts.hostname ? URI.buildAuthority(this._parts) : '';\n } else {\n var res = URI.parseAuthority(v, this._parts);\n if (res !== '/') {\n throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-]');\n }\n\n this.build(!build);\n return this;\n }\n };\n p.userinfo = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined) {\n var t = URI.buildUserinfo(this._parts);\n return t ? t.substring(0, t.length -1) : t;\n } else {\n if (v[v.length-1] !== '@') {\n v += '@';\n }\n\n URI.parseUserinfo(v, this._parts);\n this.build(!build);\n return this;\n }\n };\n p.resource = function(v, build) {\n var parts;\n\n if (v === undefined) {\n return this.path() + this.search() + this.hash();\n }\n\n parts = URI.parse(v);\n this._parts.path = parts.path;\n this._parts.query = parts.query;\n this._parts.fragment = parts.fragment;\n this.build(!build);\n return this;\n };\n\n // fraction accessors\n p.subdomain = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n // convenience, return \"www\" from \"www.example.org\"\n if (v === undefined) {\n if (!this._parts.hostname || this.is('IP')) {\n return '';\n }\n\n // grab domain and add another segment\n var end = this._parts.hostname.length - this.domain().length - 1;\n return this._parts.hostname.substring(0, end) || '';\n } else {\n var e = this._parts.hostname.length - this.domain().length;\n var sub = this._parts.hostname.substring(0, e);\n var replace = new RegExp('^' + escapeRegEx(sub));\n\n if (v && v.charAt(v.length - 1) !== '.') {\n v += '.';\n }\n\n if (v.indexOf(':') !== -1) {\n throw new TypeError('Domains cannot contain colons');\n }\n\n if (v) {\n URI.ensureValidHostname(v, this._parts.protocol);\n }\n\n this._parts.hostname = this._parts.hostname.replace(replace, v);\n this.build(!build);\n return this;\n }\n };\n p.domain = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (typeof v === 'boolean') {\n build = v;\n v = undefined;\n }\n\n // convenience, return \"example.org\" from \"www.example.org\"\n if (v === undefined) {\n if (!this._parts.hostname || this.is('IP')) {\n return '';\n }\n\n // if hostname consists of 1 or 2 segments, it must be the domain\n var t = this._parts.hostname.match(/\\./g);\n if (t && t.length < 2) {\n return this._parts.hostname;\n }\n\n // grab tld and add another segment\n var end = this._parts.hostname.length - this.tld(build).length - 1;\n end = this._parts.hostname.lastIndexOf('.', end -1) + 1;\n return this._parts.hostname.substring(end) || '';\n } else {\n if (!v) {\n throw new TypeError('cannot set domain empty');\n }\n\n if (v.indexOf(':') !== -1) {\n throw new TypeError('Domains cannot contain colons');\n }\n\n URI.ensureValidHostname(v, this._parts.protocol);\n\n if (!this._parts.hostname || this.is('IP')) {\n this._parts.hostname = v;\n } else {\n var replace = new RegExp(escapeRegEx(this.domain()) + '$');\n this._parts.hostname = this._parts.hostname.replace(replace, v);\n }\n\n this.build(!build);\n return this;\n }\n };\n p.tld = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (typeof v === 'boolean') {\n build = v;\n v = undefined;\n }\n\n // return \"org\" from \"www.example.org\"\n if (v === undefined) {\n if (!this._parts.hostname || this.is('IP')) {\n return '';\n }\n\n var pos = this._parts.hostname.lastIndexOf('.');\n var tld = this._parts.hostname.substring(pos + 1);\n\n if (build !== true && SLD && SLD.list[tld.toLowerCase()]) {\n return SLD.get(this._parts.hostname) || tld;\n }\n\n return tld;\n } else {\n var replace;\n\n if (!v) {\n throw new TypeError('cannot set TLD empty');\n } else if (v.match(/[^a-zA-Z0-9-]/)) {\n if (SLD && SLD.is(v)) {\n replace = new RegExp(escapeRegEx(this.tld()) + '$');\n this._parts.hostname = this._parts.hostname.replace(replace, v);\n } else {\n throw new TypeError('TLD \"' + v + '\" contains characters other than [A-Z0-9]');\n }\n } else if (!this._parts.hostname || this.is('IP')) {\n throw new ReferenceError('cannot set TLD on non-domain host');\n } else {\n replace = new RegExp(escapeRegEx(this.tld()) + '$');\n this._parts.hostname = this._parts.hostname.replace(replace, v);\n }\n\n this.build(!build);\n return this;\n }\n };\n p.directory = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined || v === true) {\n if (!this._parts.path && !this._parts.hostname) {\n return '';\n }\n\n if (this._parts.path === '/') {\n return '/';\n }\n\n var end = this._parts.path.length - this.filename().length - 1;\n var res = this._parts.path.substring(0, end) || (this._parts.hostname ? '/' : '');\n\n return v ? URI.decodePath(res) : res;\n\n } else {\n var e = this._parts.path.length - this.filename().length;\n var directory = this._parts.path.substring(0, e);\n var replace = new RegExp('^' + escapeRegEx(directory));\n\n // fully qualifier directories begin with a slash\n if (!this.is('relative')) {\n if (!v) {\n v = '/';\n }\n\n if (v.charAt(0) !== '/') {\n v = '/' + v;\n }\n }\n\n // directories always end with a slash\n if (v && v.charAt(v.length - 1) !== '/') {\n v += '/';\n }\n\n v = URI.recodePath(v);\n this._parts.path = this._parts.path.replace(replace, v);\n this.build(!build);\n return this;\n }\n };\n p.filename = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (typeof v !== 'string') {\n if (!this._parts.path || this._parts.path === '/') {\n return '';\n }\n\n var pos = this._parts.path.lastIndexOf('/');\n var res = this._parts.path.substring(pos+1);\n\n return v ? URI.decodePathSegment(res) : res;\n } else {\n var mutatedDirectory = false;\n\n if (v.charAt(0) === '/') {\n v = v.substring(1);\n }\n\n if (v.match(/\\.?\\//)) {\n mutatedDirectory = true;\n }\n\n var replace = new RegExp(escapeRegEx(this.filename()) + '$');\n v = URI.recodePath(v);\n this._parts.path = this._parts.path.replace(replace, v);\n\n if (mutatedDirectory) {\n this.normalizePath(build);\n } else {\n this.build(!build);\n }\n\n return this;\n }\n };\n p.suffix = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined || v === true) {\n if (!this._parts.path || this._parts.path === '/') {\n return '';\n }\n\n var filename = this.filename();\n var pos = filename.lastIndexOf('.');\n var s, res;\n\n if (pos === -1) {\n return '';\n }\n\n // suffix may only contain alnum characters (yup, I made this up.)\n s = filename.substring(pos+1);\n res = (/^[a-z0-9%]+$/i).test(s) ? s : '';\n return v ? URI.decodePathSegment(res) : res;\n } else {\n if (v.charAt(0) === '.') {\n v = v.substring(1);\n }\n\n var suffix = this.suffix();\n var replace;\n\n if (!suffix) {\n if (!v) {\n return this;\n }\n\n this._parts.path += '.' + URI.recodePath(v);\n } else if (!v) {\n replace = new RegExp(escapeRegEx('.' + suffix) + '$');\n } else {\n replace = new RegExp(escapeRegEx(suffix) + '$');\n }\n\n if (replace) {\n v = URI.recodePath(v);\n this._parts.path = this._parts.path.replace(replace, v);\n }\n\n this.build(!build);\n return this;\n }\n };\n p.segment = function(segment, v, build) {\n var separator = this._parts.urn ? ':' : '/';\n var path = this.path();\n var absolute = path.substring(0, 1) === '/';\n var segments = path.split(separator);\n\n if (segment !== undefined && typeof segment !== 'number') {\n build = v;\n v = segment;\n segment = undefined;\n }\n\n if (segment !== undefined && typeof segment !== 'number') {\n throw new Error('Bad segment \"' + segment + '\", must be 0-based integer');\n }\n\n if (absolute) {\n segments.shift();\n }\n\n if (segment < 0) {\n // allow negative indexes to address from the end\n segment = Math.max(segments.length + segment, 0);\n }\n\n if (v === undefined) {\n /*jshint laxbreak: true */\n return segment === undefined\n ? segments\n : segments[segment];\n /*jshint laxbreak: false */\n } else if (segment === null || segments[segment] === undefined) {\n if (isArray(v)) {\n segments = [];\n // collapse empty elements within array\n for (var i=0, l=v.length; i < l; i++) {\n if (!v[i].length && (!segments.length || !segments[segments.length -1].length)) {\n continue;\n }\n\n if (segments.length && !segments[segments.length -1].length) {\n segments.pop();\n }\n\n segments.push(trimSlashes(v[i]));\n }\n } else if (v || typeof v === 'string') {\n v = trimSlashes(v);\n if (segments[segments.length -1] === '') {\n // empty trailing elements have to be overwritten\n // to prevent results such as /foo//bar\n segments[segments.length -1] = v;\n } else {\n segments.push(v);\n }\n }\n } else {\n if (v) {\n segments[segment] = trimSlashes(v);\n } else {\n segments.splice(segment, 1);\n }\n }\n\n if (absolute) {\n segments.unshift('');\n }\n\n return this.path(segments.join(separator), build);\n };\n p.segmentCoded = function(segment, v, build) {\n var segments, i, l;\n\n if (typeof segment !== 'number') {\n build = v;\n v = segment;\n segment = undefined;\n }\n\n if (v === undefined) {\n segments = this.segment(segment, v, build);\n if (!isArray(segments)) {\n segments = segments !== undefined ? URI.decode(segments) : undefined;\n } else {\n for (i = 0, l = segments.length; i < l; i++) {\n segments[i] = URI.decode(segments[i]);\n }\n }\n\n return segments;\n }\n\n if (!isArray(v)) {\n v = (typeof v === 'string' || v instanceof String) ? URI.encode(v) : v;\n } else {\n for (i = 0, l = v.length; i < l; i++) {\n v[i] = URI.encode(v[i]);\n }\n }\n\n return this.segment(segment, v, build);\n };\n\n // mutating query string\n var q = p.query;\n p.query = function(v, build) {\n if (v === true) {\n return URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n } else if (typeof v === 'function') {\n var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n var result = v.call(this, data);\n this._parts.query = URI.buildQuery(result || data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n this.build(!build);\n return this;\n } else if (v !== undefined && typeof v !== 'string') {\n this._parts.query = URI.buildQuery(v, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n this.build(!build);\n return this;\n } else {\n return q.call(this, v, build);\n }\n };\n p.setQuery = function(name, value, build) {\n var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n\n if (typeof name === 'string' || name instanceof String) {\n data[name] = value !== undefined ? value : null;\n } else if (typeof name === 'object') {\n for (var key in name) {\n if (hasOwn.call(name, key)) {\n data[key] = name[key];\n }\n }\n } else {\n throw new TypeError('URI.addQuery() accepts an object, string as the name parameter');\n }\n\n this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n if (typeof name !== 'string') {\n build = value;\n }\n\n this.build(!build);\n return this;\n };\n p.addQuery = function(name, value, build) {\n var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n URI.addQuery(data, name, value === undefined ? null : value);\n this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n if (typeof name !== 'string') {\n build = value;\n }\n\n this.build(!build);\n return this;\n };\n p.removeQuery = function(name, value, build) {\n var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n URI.removeQuery(data, name, value);\n this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n if (typeof name !== 'string') {\n build = value;\n }\n\n this.build(!build);\n return this;\n };\n p.hasQuery = function(name, value, withinArray) {\n var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n return URI.hasQuery(data, name, value, withinArray);\n };\n p.setSearch = p.setQuery;\n p.addSearch = p.addQuery;\n p.removeSearch = p.removeQuery;\n p.hasSearch = p.hasQuery;\n\n // sanitizing URLs\n p.normalize = function() {\n if (this._parts.urn) {\n return this\n .normalizeProtocol(false)\n .normalizePath(false)\n .normalizeQuery(false)\n .normalizeFragment(false)\n .build();\n }\n\n return this\n .normalizeProtocol(false)\n .normalizeHostname(false)\n .normalizePort(false)\n .normalizePath(false)\n .normalizeQuery(false)\n .normalizeFragment(false)\n .build();\n };\n p.normalizeProtocol = function(build) {\n if (typeof this._parts.protocol === 'string') {\n this._parts.protocol = this._parts.protocol.toLowerCase();\n this.build(!build);\n }\n\n return this;\n };\n p.normalizeHostname = function(build) {\n if (this._parts.hostname) {\n if (this.is('IDN') && punycode) {\n this._parts.hostname = punycode.toASCII(this._parts.hostname);\n } else if (this.is('IPv6') && IPv6) {\n this._parts.hostname = IPv6.best(this._parts.hostname);\n }\n\n this._parts.hostname = this._parts.hostname.toLowerCase();\n this.build(!build);\n }\n\n return this;\n };\n p.normalizePort = function(build) {\n // remove port of it's the protocol's default\n if (typeof this._parts.protocol === 'string' && this._parts.port === URI.defaultPorts[this._parts.protocol]) {\n this._parts.port = null;\n this.build(!build);\n }\n\n return this;\n };\n p.normalizePath = function(build) {\n var _path = this._parts.path;\n if (!_path) {\n return this;\n }\n\n if (this._parts.urn) {\n this._parts.path = URI.recodeUrnPath(this._parts.path);\n this.build(!build);\n return this;\n }\n\n if (this._parts.path === '/') {\n return this;\n }\n\n _path = URI.recodePath(_path);\n\n var _was_relative;\n var _leadingParents = '';\n var _parent, _pos;\n\n // handle relative paths\n if (_path.charAt(0) !== '/') {\n _was_relative = true;\n _path = '/' + _path;\n }\n\n // handle relative files (as opposed to directories)\n if (_path.slice(-3) === '/..' || _path.slice(-2) === '/.') {\n _path += '/';\n }\n\n // resolve simples\n _path = _path\n .replace(/(\\/(\\.\\/)+)|(\\/\\.$)/g, '/')\n .replace(/\\/{2,}/g, '/');\n\n // remember leading parents\n if (_was_relative) {\n _leadingParents = _path.substring(1).match(/^(\\.\\.\\/)+/) || '';\n if (_leadingParents) {\n _leadingParents = _leadingParents[0];\n }\n }\n\n // resolve parents\n while (true) {\n _parent = _path.search(/\\/\\.\\.(\\/|$)/);\n if (_parent === -1) {\n // no more ../ to resolve\n break;\n } else if (_parent === 0) {\n // top level cannot be relative, skip it\n _path = _path.substring(3);\n continue;\n }\n\n _pos = _path.substring(0, _parent).lastIndexOf('/');\n if (_pos === -1) {\n _pos = _parent;\n }\n _path = _path.substring(0, _pos) + _path.substring(_parent + 3);\n }\n\n // revert to relative\n if (_was_relative && this.is('relative')) {\n _path = _leadingParents + _path.substring(1);\n }\n\n this._parts.path = _path;\n this.build(!build);\n return this;\n };\n p.normalizePathname = p.normalizePath;\n p.normalizeQuery = function(build) {\n if (typeof this._parts.query === 'string') {\n if (!this._parts.query.length) {\n this._parts.query = null;\n } else {\n this.query(URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace));\n }\n\n this.build(!build);\n }\n\n return this;\n };\n p.normalizeFragment = function(build) {\n if (!this._parts.fragment) {\n this._parts.fragment = null;\n this.build(!build);\n }\n\n return this;\n };\n p.normalizeSearch = p.normalizeQuery;\n p.normalizeHash = p.normalizeFragment;\n\n p.iso8859 = function() {\n // expect unicode input, iso8859 output\n var e = URI.encode;\n var d = URI.decode;\n\n URI.encode = escape;\n URI.decode = decodeURIComponent;\n try {\n this.normalize();\n } finally {\n URI.encode = e;\n URI.decode = d;\n }\n return this;\n };\n\n p.unicode = function() {\n // expect iso8859 input, unicode output\n var e = URI.encode;\n var d = URI.decode;\n\n URI.encode = strictEncodeURIComponent;\n URI.decode = unescape;\n try {\n this.normalize();\n } finally {\n URI.encode = e;\n URI.decode = d;\n }\n return this;\n };\n\n p.readable = function() {\n var uri = this.clone();\n // removing username, password, because they shouldn't be displayed according to RFC 3986\n uri.username('').password('').normalize();\n var t = '';\n if (uri._parts.protocol) {\n t += uri._parts.protocol + '://';\n }\n\n if (uri._parts.hostname) {\n if (uri.is('punycode') && punycode) {\n t += punycode.toUnicode(uri._parts.hostname);\n if (uri._parts.port) {\n t += ':' + uri._parts.port;\n }\n } else {\n t += uri.host();\n }\n }\n\n if (uri._parts.hostname && uri._parts.path && uri._parts.path.charAt(0) !== '/') {\n t += '/';\n }\n\n t += uri.path(true);\n if (uri._parts.query) {\n var q = '';\n for (var i = 0, qp = uri._parts.query.split('&'), l = qp.length; i < l; i++) {\n var kv = (qp[i] || '').split('=');\n q += '&' + URI.decodeQuery(kv[0], this._parts.escapeQuerySpace)\n .replace(/&/g, '%26');\n\n if (kv[1] !== undefined) {\n q += '=' + URI.decodeQuery(kv[1], this._parts.escapeQuerySpace)\n .replace(/&/g, '%26');\n }\n }\n t += '?' + q.substring(1);\n }\n\n t += URI.decodeQuery(uri.hash(), true);\n return t;\n };\n\n // resolving relative and absolute URLs\n p.absoluteTo = function(base) {\n var resolved = this.clone();\n var properties = ['protocol', 'username', 'password', 'hostname', 'port'];\n var basedir, i, p;\n\n if (this._parts.urn) {\n throw new Error('URNs do not have any generally defined hierarchical components');\n }\n\n if (!(base instanceof URI)) {\n base = new URI(base);\n }\n\n if (resolved._parts.protocol) {\n // Directly returns even if this._parts.hostname is empty.\n return resolved;\n } else {\n resolved._parts.protocol = base._parts.protocol;\n }\n\n if (this._parts.hostname) {\n return resolved;\n }\n\n for (i = 0; (p = properties[i]); i++) {\n resolved._parts[p] = base._parts[p];\n }\n\n if (!resolved._parts.path) {\n resolved._parts.path = base._parts.path;\n if (!resolved._parts.query) {\n resolved._parts.query = base._parts.query;\n }\n } else {\n if (resolved._parts.path.substring(-2) === '..') {\n resolved._parts.path += '/';\n }\n\n if (resolved.path().charAt(0) !== '/') {\n basedir = base.directory();\n basedir = basedir ? basedir : base.path().indexOf('/') === 0 ? '/' : '';\n resolved._parts.path = (basedir ? (basedir + '/') : '') + resolved._parts.path;\n resolved.normalizePath();\n }\n }\n\n resolved.build();\n return resolved;\n };\n p.relativeTo = function(base) {\n var relative = this.clone().normalize();\n var relativeParts, baseParts, common, relativePath, basePath;\n\n if (relative._parts.urn) {\n throw new Error('URNs do not have any generally defined hierarchical components');\n }\n\n base = new URI(base).normalize();\n relativeParts = relative._parts;\n baseParts = base._parts;\n relativePath = relative.path();\n basePath = base.path();\n\n if (relativePath.charAt(0) !== '/') {\n throw new Error('URI is already relative');\n }\n\n if (basePath.charAt(0) !== '/') {\n throw new Error('Cannot calculate a URI relative to another relative URI');\n }\n\n if (relativeParts.protocol === baseParts.protocol) {\n relativeParts.protocol = null;\n }\n\n if (relativeParts.username !== baseParts.username || relativeParts.password !== baseParts.password) {\n return relative.build();\n }\n\n if (relativeParts.protocol !== null || relativeParts.username !== null || relativeParts.password !== null) {\n return relative.build();\n }\n\n if (relativeParts.hostname === baseParts.hostname && relativeParts.port === baseParts.port) {\n relativeParts.hostname = null;\n relativeParts.port = null;\n } else {\n return relative.build();\n }\n\n if (relativePath === basePath) {\n relativeParts.path = '';\n return relative.build();\n }\n\n // determine common sub path\n common = URI.commonPath(relativePath, basePath);\n\n // If the paths have nothing in common, return a relative URL with the absolute path.\n if (!common) {\n return relative.build();\n }\n\n var parents = baseParts.path\n .substring(common.length)\n .replace(/[^\\/]*$/, '')\n .replace(/.*?\\//g, '../');\n\n relativeParts.path = (parents + relativeParts.path.substring(common.length)) || './';\n\n return relative.build();\n };\n\n // comparing URIs\n p.equals = function(uri) {\n var one = this.clone();\n var two = new URI(uri);\n var one_map = {};\n var two_map = {};\n var checked = {};\n var one_query, two_query, key;\n\n one.normalize();\n two.normalize();\n\n // exact match\n if (one.toString() === two.toString()) {\n return true;\n }\n\n // extract query string\n one_query = one.query();\n two_query = two.query();\n one.query('');\n two.query('');\n\n // definitely not equal if not even non-query parts match\n if (one.toString() !== two.toString()) {\n return false;\n }\n\n // query parameters have the same length, even if they're permuted\n if (one_query.length !== two_query.length) {\n return false;\n }\n\n one_map = URI.parseQuery(one_query, this._parts.escapeQuerySpace);\n two_map = URI.parseQuery(two_query, this._parts.escapeQuerySpace);\n\n for (key in one_map) {\n if (hasOwn.call(one_map, key)) {\n if (!isArray(one_map[key])) {\n if (one_map[key] !== two_map[key]) {\n return false;\n }\n } else if (!arraysEqual(one_map[key], two_map[key])) {\n return false;\n }\n\n checked[key] = true;\n }\n }\n\n for (key in two_map) {\n if (hasOwn.call(two_map, key)) {\n if (!checked[key]) {\n // two contains a parameter not present in one\n return false;\n }\n }\n }\n\n return true;\n };\n\n // state\n p.preventInvalidHostname = function(v) {\n this._parts.preventInvalidHostname = !!v;\n return this;\n };\n\n p.duplicateQueryParameters = function(v) {\n this._parts.duplicateQueryParameters = !!v;\n return this;\n };\n\n p.escapeQuerySpace = function(v) {\n this._parts.escapeQuerySpace = !!v;\n return this;\n };\n\n return URI;\n}));\n"],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"script","externalDependencies":[]}