{"version":3,"file":"wsdot-colors-B-RteT92.js","sources":["../../node_modules/.pnpm/wsdot-route-utils@3.0.0/node_modules/wsdot-route-utils/dist/FormatError.js","../../node_modules/.pnpm/wsdot-route-utils@3.0.0/node_modules/wsdot-route-utils/dist/route-shields.js","../../node_modules/.pnpm/wsdot-route-utils@3.0.0/node_modules/wsdot-route-utils/dist/rrt.js","../../node_modules/.pnpm/wsdot-route-utils@3.0.0/node_modules/wsdot-route-utils/dist/regex.js","../../node_modules/.pnpm/wsdot-route-utils@3.0.0/node_modules/wsdot-route-utils/dist/wsdot-route-utils.js","../../node_modules/.pnpm/wsdot-route-utils@3.0.0/node_modules/wsdot-route-utils/dist/rrq.js","../../node_modules/.pnpm/wsdot-route-utils@3.0.0/node_modules/wsdot-route-utils/dist/RouteDescription.js","../../node_modules/.pnpm/wsdot-route-utils@3.0.0/node_modules/wsdot-route-utils/dist/Milepost.js","../../node_modules/.pnpm/wsdot-route-utils@3.0.0/node_modules/wsdot-route-utils/dist/RouteName.js"],"sourcesContent":["/**\r\n * An error that is thrown when an input string is not in the expected format.\r\n */\r\nexport default class FormatError extends Error {\r\n input;\r\n expectedFormat;\r\n /**\r\n * Creates a new instance of FormatError\r\n * @param input - The input string that caused the error\r\n * @param expectedFormat - The expected format as a [RegExp](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp).\r\n * @param message - Override the default messsage.\r\n * If omitted, the {@link FormatError.message} will be as follows:\r\n * ```javascript\r\n * `${input} is not in expected format: ${expectedFormat}.`\r\n * ```\r\n */\r\n constructor(\r\n /** The input string that caused the error */\r\n input, \r\n /** The expected format as a [RegExp](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp). */\r\n expectedFormat, \r\n /** Override the default messsage. */\r\n message) {\r\n super(message || `${input} is not in expected format: ${expectedFormat}.`);\r\n this.input = input;\r\n this.expectedFormat = expectedFormat;\r\n }\r\n}\r\n","/**\r\n * Lookup for route shield types\r\n * @packageDocumentation route-shields\r\n */\r\nimport FormatError from \"./FormatError.js\";\r\n// Create a symbol for each route shield type.\r\n/** [Symbol](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol) for \"US\" */\r\nexport const US_SYMBOL = Symbol(\"US\");\r\n/** [Symbol](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol) for \"IS\" */\r\nexport const IS_SYMBOL = Symbol(\"IS\");\r\n/** [Symbol](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol) for \"SR\" */\r\nexport const SR_SYMBOL = Symbol(\"SR\");\r\n/**\r\n * A mapping of shield prefix symbols to {@link ShieldType|ShieldTypes}.\r\n */\r\nconst shieldTypes = new Map([\r\n [US_SYMBOL, \"US\"],\r\n [IS_SYMBOL, \"IS\"],\r\n [SR_SYMBOL, \"SR\"],\r\n]);\r\n/**\r\n * A mapping of state route numbers to {@link ShieldType|ShieldTypes}.\r\n */\r\nexport const shields = new Map([\r\n [2, US_SYMBOL],\r\n [3, SR_SYMBOL],\r\n [4, SR_SYMBOL],\r\n [5, IS_SYMBOL],\r\n [6, SR_SYMBOL],\r\n [7, SR_SYMBOL],\r\n [8, SR_SYMBOL],\r\n [9, SR_SYMBOL],\r\n [10, SR_SYMBOL],\r\n [11, SR_SYMBOL],\r\n [12, US_SYMBOL],\r\n [14, SR_SYMBOL],\r\n [16, SR_SYMBOL],\r\n [17, SR_SYMBOL],\r\n [18, SR_SYMBOL],\r\n [19, SR_SYMBOL],\r\n [20, SR_SYMBOL],\r\n [21, SR_SYMBOL],\r\n [22, SR_SYMBOL],\r\n [23, SR_SYMBOL],\r\n [24, SR_SYMBOL],\r\n [25, SR_SYMBOL],\r\n [26, SR_SYMBOL],\r\n [27, SR_SYMBOL],\r\n [28, SR_SYMBOL],\r\n [31, SR_SYMBOL],\r\n [41, SR_SYMBOL],\r\n [82, IS_SYMBOL],\r\n [90, IS_SYMBOL],\r\n [92, SR_SYMBOL],\r\n [96, SR_SYMBOL],\r\n [97, US_SYMBOL],\r\n [99, SR_SYMBOL],\r\n [100, SR_SYMBOL],\r\n [101, US_SYMBOL],\r\n [102, SR_SYMBOL],\r\n [103, SR_SYMBOL],\r\n [104, SR_SYMBOL],\r\n [105, SR_SYMBOL],\r\n [106, SR_SYMBOL],\r\n [107, SR_SYMBOL],\r\n [108, SR_SYMBOL],\r\n [109, SR_SYMBOL],\r\n [110, SR_SYMBOL],\r\n [112, SR_SYMBOL],\r\n [113, SR_SYMBOL],\r\n [115, SR_SYMBOL],\r\n [116, SR_SYMBOL],\r\n [117, SR_SYMBOL],\r\n [119, SR_SYMBOL],\r\n [121, SR_SYMBOL],\r\n [122, SR_SYMBOL],\r\n [123, SR_SYMBOL],\r\n [124, SR_SYMBOL],\r\n [125, SR_SYMBOL],\r\n [127, SR_SYMBOL],\r\n [128, SR_SYMBOL],\r\n [129, SR_SYMBOL],\r\n [131, SR_SYMBOL],\r\n [141, SR_SYMBOL],\r\n [142, SR_SYMBOL],\r\n [150, SR_SYMBOL],\r\n [153, SR_SYMBOL],\r\n [155, SR_SYMBOL],\r\n [160, SR_SYMBOL],\r\n [161, SR_SYMBOL],\r\n [162, SR_SYMBOL],\r\n [163, SR_SYMBOL],\r\n [164, SR_SYMBOL],\r\n [165, SR_SYMBOL],\r\n [166, SR_SYMBOL],\r\n [167, SR_SYMBOL],\r\n [169, SR_SYMBOL],\r\n [170, SR_SYMBOL],\r\n [171, SR_SYMBOL],\r\n [172, SR_SYMBOL],\r\n [173, SR_SYMBOL],\r\n [174, SR_SYMBOL],\r\n [181, SR_SYMBOL],\r\n [182, IS_SYMBOL],\r\n [193, SR_SYMBOL],\r\n [194, SR_SYMBOL],\r\n [195, US_SYMBOL],\r\n [197, US_SYMBOL],\r\n [202, SR_SYMBOL],\r\n [203, SR_SYMBOL],\r\n [204, SR_SYMBOL],\r\n [205, IS_SYMBOL],\r\n [206, SR_SYMBOL],\r\n [207, SR_SYMBOL],\r\n [211, SR_SYMBOL],\r\n [213, SR_SYMBOL],\r\n [215, SR_SYMBOL],\r\n [221, SR_SYMBOL],\r\n [223, SR_SYMBOL],\r\n [224, SR_SYMBOL],\r\n [225, SR_SYMBOL],\r\n [231, SR_SYMBOL],\r\n [240, SR_SYMBOL],\r\n [241, SR_SYMBOL],\r\n [243, SR_SYMBOL],\r\n [260, SR_SYMBOL],\r\n [261, SR_SYMBOL],\r\n [262, SR_SYMBOL],\r\n [263, SR_SYMBOL],\r\n [270, SR_SYMBOL],\r\n [271, SR_SYMBOL],\r\n [272, SR_SYMBOL],\r\n [274, SR_SYMBOL],\r\n [278, SR_SYMBOL],\r\n [281, SR_SYMBOL],\r\n [282, SR_SYMBOL],\r\n [283, SR_SYMBOL],\r\n [285, SR_SYMBOL],\r\n [290, SR_SYMBOL],\r\n [291, SR_SYMBOL],\r\n [292, SR_SYMBOL],\r\n [300, SR_SYMBOL],\r\n [302, SR_SYMBOL],\r\n [303, SR_SYMBOL],\r\n [304, SR_SYMBOL],\r\n [305, SR_SYMBOL],\r\n [307, SR_SYMBOL],\r\n [308, SR_SYMBOL],\r\n [310, SR_SYMBOL],\r\n [395, US_SYMBOL],\r\n [397, SR_SYMBOL],\r\n [401, SR_SYMBOL],\r\n [405, IS_SYMBOL],\r\n [409, SR_SYMBOL],\r\n [410, SR_SYMBOL],\r\n [411, SR_SYMBOL],\r\n [432, SR_SYMBOL],\r\n [433, SR_SYMBOL],\r\n [500, SR_SYMBOL],\r\n [501, SR_SYMBOL],\r\n [502, SR_SYMBOL],\r\n [503, SR_SYMBOL],\r\n [504, SR_SYMBOL],\r\n [505, SR_SYMBOL],\r\n [506, SR_SYMBOL],\r\n [507, SR_SYMBOL],\r\n [508, SR_SYMBOL],\r\n [509, SR_SYMBOL],\r\n [510, SR_SYMBOL],\r\n [512, SR_SYMBOL],\r\n [513, SR_SYMBOL],\r\n [515, SR_SYMBOL],\r\n [516, SR_SYMBOL],\r\n [518, SR_SYMBOL],\r\n [519, SR_SYMBOL],\r\n [520, SR_SYMBOL],\r\n [522, SR_SYMBOL],\r\n [523, SR_SYMBOL],\r\n [524, SR_SYMBOL],\r\n [525, SR_SYMBOL],\r\n [526, SR_SYMBOL],\r\n [527, SR_SYMBOL],\r\n [528, SR_SYMBOL],\r\n [529, SR_SYMBOL],\r\n [530, SR_SYMBOL],\r\n [531, SR_SYMBOL],\r\n [532, SR_SYMBOL],\r\n [534, SR_SYMBOL],\r\n [536, SR_SYMBOL],\r\n [538, SR_SYMBOL],\r\n [539, SR_SYMBOL],\r\n [542, SR_SYMBOL],\r\n [543, SR_SYMBOL],\r\n [544, SR_SYMBOL],\r\n [546, SR_SYMBOL],\r\n [547, SR_SYMBOL],\r\n [548, SR_SYMBOL],\r\n [599, SR_SYMBOL],\r\n [702, SR_SYMBOL],\r\n [704, SR_SYMBOL],\r\n [705, IS_SYMBOL],\r\n [706, SR_SYMBOL],\r\n [730, US_SYMBOL],\r\n [821, SR_SYMBOL],\r\n [823, SR_SYMBOL],\r\n [900, SR_SYMBOL],\r\n [902, SR_SYMBOL],\r\n [903, SR_SYMBOL],\r\n [904, SR_SYMBOL],\r\n [906, SR_SYMBOL],\r\n [970, SR_SYMBOL],\r\n [971, SR_SYMBOL],\r\n]);\r\n/**\r\n * Gets the shield type associated with the given route.\r\n * @param routeId - route id.\r\n * Only up to the first three characters (i.e., digits)\r\n * are used by this function.\r\n * @throws [TypeError](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypeError) - thrown if routeId is neither string nor number.\r\n * @throws {@link FormatError} - thrown if {@link routeId} is a string but not\r\n * in the expected format, consisting only of digits.\r\n */\r\nexport function getShieldType(routeId) {\r\n let sr;\r\n if (typeof routeId === \"number\") {\r\n sr = routeId;\r\n }\r\n else if (typeof routeId === \"string\") {\r\n // matches up to three digit characters at the beginning of a string.\r\n const re = /^\\d{1,3}/;\r\n const match = routeId.match(re);\r\n if (!match) {\r\n throw new FormatError(routeId, re);\r\n }\r\n sr = parseInt(match[0], 10);\r\n }\r\n else {\r\n throw new TypeError(\"routeID must be either number or string\");\r\n }\r\n const shield = shields.get(sr);\r\n return shield ? shieldTypes.get(shield) || null : null;\r\n}\r\n/**\r\n * Gets the prefix for a given route ID\r\n * @param routeId - Route identifier\r\n * @param useWAForSR - WA state maps prefix state routes with \"SR\".\r\n * Other maps such as OpenStreetMap and Google instead prefix them with \"WA\",\r\n * since their maps deal with more than one state.\r\n * Set this value to true to get \"WA\" instead of \"SR\".\r\n * @throws - @see {@link getShieldType} for details.\r\n */\r\nexport function getPrefix(routeId, useWAForSR = false) {\r\n const shield = getShieldType(routeId);\r\n if (shield === null) {\r\n return shield;\r\n }\r\n if (shield === \"IS\") {\r\n return \"I\";\r\n }\r\n else if (shield === \"SR\" && useWAForSR) {\r\n return \"WA\";\r\n }\r\n else {\r\n return shield;\r\n }\r\n}\r\n","/**\r\n * This module is for RRT related stuff.\r\n * @packageDocumentation\r\n */\r\n/**\r\n * Represents a Related Route Type\r\n */\r\nexport class RelatedRouteType {\r\n rrt;\r\n description;\r\n rrtType;\r\n /**\r\n * Creates a new instance\r\n * @param rrt - RRT\r\n * @param description - Description of the RRT.\r\n * @param rrtType - The type of RRT\r\n */\r\n constructor(rrt, description, rrtType = null) {\r\n this.rrt = rrt;\r\n this.description = description;\r\n this.rrtType = rrtType;\r\n }\r\n}\r\n// Define RRTs\r\n/**\r\n * RRT (Related Roadway Type)\r\n *\r\n * | RRT | Description | Type |\r\n * |---------|------------------------------|---------|\r\n * | AR | Alternate Route | |\r\n * | CD | Collector Distributor (Dec) | |\r\n * | CI | Collector Distributor (Inc) | |\r\n * | CO | Couplet | |\r\n * | FI | Frontage Road (Inc) | |\r\n * | FD | Frontage Road (Dec) | |\r\n * | LX | Crossroad within Interchange | |\r\n * | RL | Reversible Lane | |\r\n * | SP | Spur | |\r\n * | TB | Transitional Turnback | |\r\n * | TR | Temporary Route | |\r\n * | PR | Proposed Route | |\r\n * | P1 - P9 | Off Ramp (Inc) | Ramp |\r\n * | PU | Extension of P ramp | Ramp |\r\n * | Q1 - Q9 | On Ramp (Inc) | Ramp |\r\n * | QU | Extension of Q ramp | Ramp |\r\n * | R1 - R9 | Off Ramp (Dec) | Ramp |\r\n * | RU | Extension of R ramp | Ramp |\r\n * | S1 - S9 | On Ramp (Dec) | Ramp |\r\n * | SU | Extension of S ramp | Ramp |\r\n * | FS | Ferry Ship (Boat) | Ferries |\r\n * | FT | Ferry Terminal | Ferries |\r\n */\r\nexport const rrts = {\r\n AR: \"Alternate Route\",\r\n CO: \"Couplet\",\r\n FD: \"Frontage Road Dec\",\r\n FI: \"Frontage Road Inc\",\r\n FS: \"Ferry Ship (Boat)\",\r\n FT: \"Ferry Terminal\",\r\n PR: \"Proposed Route\",\r\n RL: \"Reversible Lane\",\r\n SP: \"Spur\",\r\n TB: \"Transitional Turnback\",\r\n TR: \"Temporary Route\",\r\n CD: \"Collector Distributor Dec\",\r\n CI: \"Collector Distributor Inc\",\r\n LX: \"Crossroad within Interchange\",\r\n HD: \"Grade-Separated HOV-Dec\",\r\n HI: \"Grade-Separated HOV-Inc\",\r\n ML: \"Mainline (implied RRT-field is blank)\",\r\n UC: \"Under Construction\"\r\n};\r\nfunction* enumerateRrtDictionaryProperties(rrts) {\r\n for (const rrt in rrts) {\r\n if (Object.prototype.hasOwnProperty.call(rrts, rrt)) {\r\n const description = rrts[rrt];\r\n yield new RelatedRouteType(rrt, description);\r\n }\r\n }\r\n}\r\nfunction* enumerateRampRrts() {\r\n // Add ramp RRTs.\r\n const rampTypes = {\r\n P: [\"Off\", \"Inc\"],\r\n Q: [\"On\", \"Inc\"],\r\n R: [\"Off\", \"Dec\"],\r\n S: [\"On\", \"Dec\"]\r\n };\r\n for (const letter of [\"P\", \"Q\", \"R\", \"S\", \"U\", \"W\", \"X\", \"Y\"]) {\r\n for (let i = 1; i < 10; i++) {\r\n const rrt = `${letter}${i}`;\r\n if (letter in [...\"PQRS\"]) {\r\n const [onOrOff, incOrDec] = rampTypes[letter];\r\n const rrtDesc = `${onOrOff} Ramp ${i ? ` ${i}` : \"\"}, ${incOrDec}`;\r\n yield [rrt, rrtDesc];\r\n }\r\n else {\r\n const rrtDesc = `${letter} Ramp ${i}`;\r\n yield [rrt, rrtDesc];\r\n }\r\n }\r\n }\r\n}\r\nexport const RelatedRouteTypes = new Array(...enumerateRrtDictionaryProperties(rrts));\r\nfor (const [rrt, desc] of enumerateRampRrts()) {\r\n if (desc) {\r\n rrts[rrt] = desc;\r\n }\r\n RelatedRouteTypes.push(new RelatedRouteType(rrt, desc || \"unknown\", \"ramp\"));\r\n}\r\nfunction* enumerateRrtMappingValues() {\r\n for (const rrt in rrts) {\r\n if (Object.prototype.hasOwnProperty.call(rrts, rrt)) {\r\n const description = rrts[rrt];\r\n yield [rrt, description];\r\n }\r\n }\r\n}\r\nexport const rrtMapping = new Map([...enumerateRrtMappingValues()]);\r\n","import FormatError from \"./FormatError.js\";\r\nimport { rrtMapping } from \"./rrt.js\";\r\n/**\r\n * Appends text to the end of (a copy of) a regular expression.\r\n * @param inputRe - A regular expression ending with \"$\".\r\n * @param escapedText - Text to append to the end of the input RegExp.\r\n * @returns - Returns a modified copy of the input RegExp.\r\n */\r\nfunction appendToRegex(inputRe, escapedText) {\r\n return new RegExp(inputRe.source.split(\"$\")[0] + escapedText + \"$\");\r\n}\r\n/**\r\n * Amends the input [RegExp](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp) to allow suffix characters.\r\n * @param inputRe - a regular expression.\r\n * @param options - parsing options.\r\n * @returns\r\n */\r\nexport function appendSuffixesToRegex(inputRe, options) {\r\n if (!options.allowedSuffixes || options.allowedSuffixes.length < 1) {\r\n throw new TypeError(\"No suffixes were provided.\");\r\n }\r\n for (const suffix of options.allowedSuffixes) {\r\n if (suffix.length !== 1) {\r\n throw new RangeError(`All suffixes strings must only be one character. This value does not meet these requirements: ${suffix}`);\r\n }\r\n }\r\n let escapedText = `(?[${options.allowedSuffixes.join(\"\")}])`;\r\n if (options.suffixesAreOptional) {\r\n escapedText += \"?\";\r\n }\r\n return appendToRegex(inputRe, escapedText);\r\n}\r\n/**\r\n * Creates a [RegExp](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp) that will match any of the provided RRT values.\r\n * @param validRrts - A list of RRT values\r\n * @returns A regular expression that will match all of the {@link validRrts}.\r\n */\r\nexport function createRrtRegex(validRrts = [...rrtMapping.keys()]) {\r\n function createRangePart(chars) {\r\n const charArray = [...chars].sort();\r\n return charArray.join(\"\");\r\n }\r\n const mapping = new Map();\r\n for (const rrt of validRrts) {\r\n if (rrt.length !== 2) {\r\n throw new FormatError(rrt, /^.{2}$/);\r\n }\r\n const letter = rrt[0];\r\n if (mapping.has(letter)) {\r\n mapping.get(letter)?.add(rrt[1]);\r\n }\r\n else {\r\n mapping.set(letter, new Set([rrt[1]]));\r\n }\r\n }\r\n const parts = new Array();\r\n for (const [letter, chars] of mapping) {\r\n const part = `(${letter}[${createRangePart(chars)}])`;\r\n parts.push(part);\r\n }\r\n const pattern = parts.join(\"|\")\r\n // Replace list of digits with digit range\r\n .replaceAll(/123456789/g, \"1-9\")\r\n .replaceAll(/\\[([^[\\]])\\]/g, \"$1\");\r\n return new RegExp(pattern);\r\n}\r\n/**\r\n * Creates a regular expression that will match a state route.\r\n * @param validRrts - You only need to use this parameter if new\r\n * RRTs have been added since this module was last published\r\n * and you need to override the defaults.\r\n * @param rampLetters - Specify which letters ramp RRTs start with, overriding the defaults.\r\n * @returns Will look something like this:\r\n *\r\n * ```typescript\r\n * /^(?\\d{3})(?:(?(?:AR)|(?:C[DI])|(?:C[O])|(?:F[DI])|(?:LX)|(?:[PQRS][\\dU])|(?:RL)|(?:SP)|(?:TB)|(?:TR)|(?:PR)|(?:F[ST])|(?:ML))(?[A-Z0-9]{0,6}))?$/;\r\n * ```\r\n */\r\nexport function createRouteRegex(validRrts = [...rrtMapping.keys()], rampLetters = [\"P\", \"Q\", \"R\", \"S\"]) {\r\n // Simplify the part of the regex that matches ramp RRTs.\r\n // Instead of `(P1)|(P2)|(P3)`...`(S1)|(S2)`, etc., use\r\n // ([PQRS\\dU])\r\n let rampLettersRe = null;\r\n if (rampLetters) {\r\n // If ramp letters is a single string, split into individual letters.\r\n if (typeof rampLetters === \"string\") {\r\n rampLetters = [...rampLetters];\r\n }\r\n // Test to make sure each string is only one character long.\r\n for (const rl of rampLetters) {\r\n if (rl.length != 1) {\r\n throw new TypeError(`Invalid value for member of ramp letters array: \"${rl}\"`);\r\n }\r\n }\r\n // Create a regex matching ramp RRTs using the specified rampLetters.\r\n // Matches that letter plus either a digit or a \"U\".\r\n rampLettersRe = new RegExp(String.raw `[${rampLetters.join(\"\")}][\\dU]`);\r\n // Remove the individual ramp RRTs from the array of valid RRTs. \r\n validRrts = validRrts.filter(r => !rampLettersRe?.test(r));\r\n // Add the simplified version.\r\n validRrts.push(rampLettersRe.source);\r\n }\r\n const rrtGroups = validRrts.map(rrt => `(?:${rrt})`).join(\"|\");\r\n const srGroup = \"(?\\\\d{3})\";\r\n const rrqGroup = \"(?[A-Z0-9]{0,6})\";\r\n const pattern = `^${srGroup}(?:(?${rrtGroups})${rrqGroup})?$`;\r\n return new RegExp(pattern);\r\n}\r\n/**\r\n * Matches state route format, with captures for SR, RRT, and RRQ. First element in array will be entire match.\r\n *\r\n \r\n */\r\nexport const srRegex = createRouteRegex();\r\n","/**\r\n * Utilities for WSDOT Route Identifiers\r\n */\r\nimport FormatError from \"./FormatError.js\";\r\nimport { appendSuffixesToRegex, srRegex } from \"./regex.js\";\r\nexport const DEFAULT_ROUTE_ID_PARSE_OPTIONS = {\r\n throwErrorOnMatchFail: true\r\n};\r\n/**\r\n * Splits a state route identifier into its component SR, RRT, and RRQ parts.\r\n * If the input route ID is not in the expected format, one of two things\r\n * will happen according to the value of the {@link RouteIdParseOptions.throwErrorOnMatchFail|options.throwErrorOnMatchFail}.\r\n * If set to false, null will be returned. If set to true, an Error will be thrown.\r\n * @param routeId - A state route identifier.\r\n * @param options - Controls how the route will be parsed.\r\n * @returns An array of three elements: SR, RRT, and RRQ.\r\n * The elements at position 1 and 2 may be null if a route has no RRT or RRQ\r\n * (as would be the case with a mainline).\r\n * Will be null if the routeId is not in the expected format and if throwErrorOnMatchFail is false.\r\n * @throws {@link TypeError} thrown if {@link routeId} is not a string.\r\n * @throws {@link FormatError} thrown if routeId is not in the expected format and {@link RouteIdParseOptions.throwErrorOnMatchFail} is true.\r\n */\r\nexport function getRouteParts(routeId, options = {\r\n throwErrorOnMatchFail: true\r\n}) {\r\n if (options.throwErrorOnMatchFail === undefined) {\r\n options.throwErrorOnMatchFail = true;\r\n }\r\n if (!(routeId && typeof routeId === \"string\")) {\r\n throw new TypeError(\"Input must be a string.\");\r\n }\r\n // specify a regex based on the suffixesAreOptional and allowedSuffixes.\r\n let re;\r\n if (options?.allowedSuffixes && options?.allowedSuffixes.length) {\r\n re = appendSuffixesToRegex(srRegex, options);\r\n }\r\n else {\r\n re = srRegex;\r\n }\r\n const match = routeId.match(re);\r\n if (match) {\r\n return match.splice(1).map(s => s || null);\r\n }\r\n else if (options?.throwErrorOnMatchFail) {\r\n throw new FormatError(routeId, re);\r\n }\r\n else {\r\n return null;\r\n }\r\n}\r\n","export const rrqs = new Map([\r\n [\"2NDST\", \"2nd St.\"],\r\n [\"3RDAVE\", \"3rd Ave.\"],\r\n [\"6THST\", \"6th St.\"],\r\n [\"ABERDN\", \"Aberdeen\"],\r\n [\"ANACOR\", \"Anacortes\"],\r\n [\"ANACRT\", \"Anacortes\"],\r\n [\"ANAFT2\", \"ANAFT2\"],\r\n [\"AURORA\", \"Aurora\"],\r\n [\"BOONE\", \"Boone St.\"],\r\n // [\"BREFT2\", \"BREFT2\"],\r\n [\"BREMER\", \"Bremerton\"],\r\n [\"BROWNE\", \"Browne St.\"],\r\n [\"BURKE\", \"Beverly Burke Rd.\"],\r\n [\"CANBY\", \"Fort Canby\"],\r\n [\"CEDRWY\", \"Cedar Way\"],\r\n [\"CLEELM\", \"Cle Elem\"],\r\n // [\"CLIFT2\", \"CLIFT2\"],\r\n [\"CLINTN\", \"Clifton\"],\r\n [\"COLFAX\", \"Colfax\"],\r\n [\"COUGAR\", \"Cougar\"],\r\n [\"COUPLT\", \"COUPLT\"],\r\n [\"COUPVL\", \"Coupville\"],\r\n [\"CRWNPT\", \"Crown Point\"],\r\n [\"CS0631\", \"CS0631\"],\r\n [\"DIVISN\", \"Division\"],\r\n [\"EAGHBR\", \"Eagle Harbor\"],\r\n [\"EDMOND\", \"Edmonds\"],\r\n [\"EVERET\", \"Everett\"],\r\n [\"FAUNTL\", \"Fauntleroy\"],\r\n [\"FIFE\", \"Fife\"],\r\n [\"FRIDAY\", \"Friday Harbor\"],\r\n [\"GNESSE\", \"GNESSE\"],\r\n [\"GORST\", \"Gorst\"],\r\n [\"HERON\", \"Heron St.\"],\r\n [\"HQUIAM\", \"Hoquiam\"],\r\n [\"HYAK\", \"Hyak Dr.\"],\r\n [\"KELRNO\", \"Keller North\"],\r\n [\"KELRSO\", \"Keller South\"],\r\n [\"KELSO\", \"Kelso\"],\r\n [\"KINFT1\", \"KINFT1\"],\r\n [\"KINGST\", \"Kingston\"],\r\n [\"KNGSTN\", \"Kingston\"],\r\n [\"LEAHY\", \"Leahy\"],\r\n [\"LONNGR\", \"LONNGR\"],\r\n [\"LOPEZ\", \"Lopez\"],\r\n [\"MARYHL\", \"Maryhill\"],\r\n [\"MKLTEO\", \"Mukilteo\"],\r\n [\"MONROE\", \"Monroe\"],\r\n [\"MORA\", \"Mora Rd.\"],\r\n [\"MTBAKR\", \"Mt. Baker\"],\r\n [\"MUKILT\", \"Mukilteo\"],\r\n [\"NEWPRT\", \"Newport\"],\r\n [\"NSC\", \"NSC\"],\r\n [\"OLD504\", \"Old 504\"],\r\n [\"OMAK\", \"Omak\"],\r\n [\"ORCAS\", \"Orcas Island\"],\r\n [\"ORGBEG\", \"ORGBEG\"],\r\n [\"ORGMID\", \"ORGMID\"],\r\n [\"ORGSPR\", \"ORGSPR\"],\r\n [\"ORONDO\", \"Orondo\"],\r\n [\"OSO\", \"Oso\"],\r\n [\"PAINE\", \"Paine\"],\r\n [\"PEARL\", \"Pearl St.\"],\r\n [\"PRTANG\", \"Port Angeles\"],\r\n [\"PTDEFI\", \"Pt. Defiance\"],\r\n [\"PTTFT2\", \"PTTFT2\"],\r\n [\"PTTOWN\", \"Port Townsend\"],\r\n [\"PULLMN\", \"Pullman\"],\r\n [\"PURDY\", \"Purdy Ln.\"],\r\n [\"REDMND\", \"Redmond\"],\r\n // [\"SEAFT2\", \"SEAFT2\"],\r\n // [\"SEAFT3\", \"SEAFT3\"],\r\n [\"SEATAC\", \"SeaTac\"],\r\n [\"SEATTL\", \"Seattle\"],\r\n [\"SHAW\", \"Shaw Island\"],\r\n [\"SIDNEY\", \"Sidney\"],\r\n [\"SLVRDL\", \"Silverdale\"],\r\n [\"SOUTHW\", \"Southworth\"],\r\n [\"SUMAS\", \"Sumas\"],\r\n [\"TAHLEQ\", \"Tahlequa\"],\r\n [\"TUNNEL\", \"Tunnel\"],\r\n [\"UNDRWD\", \"Underwood\"],\r\n [\"VANCVR\", \"Vancouver\"],\r\n // [\"VASFT2\", \"VASFT2\"],\r\n [\"VASHON\", \"Vashon\"],\r\n [\"VIADCT\", \"Alaskan Way Viaduct\"],\r\n [\"WALULA\", \"Wallula Junction\"],\r\n [\"WENTCH\", \"Wenatchee\"],\r\n [\"WESTPT\", \"Westport\"],\r\n // [\"WINFT2\", \"WINFT2\"],\r\n [\"WINSLO\", \"Winslow\"],\r\n [\"XBASE\", \"XBASE\"],\r\n [\"YELMLP\", \"Yelm Loop\"]\r\n]);\r\nexport default rrqs;\r\n","import { getShieldType } from \"./route-shields.js\";\r\nimport rrqs from \"./rrq.js\";\r\nimport { rrts } from \"./rrt.js\";\r\nimport { DEFAULT_ROUTE_ID_PARSE_OPTIONS, getRouteParts } from \"./wsdot-route-utils.js\";\r\n/**\r\n * Provides a description of a route.\r\n */\r\nexport class RouteDescription extends Object {\r\n _sr;\r\n _rrt;\r\n _rrq;\r\n _isDecrease = null;\r\n _suffix = null;\r\n _shield = undefined;\r\n /**\r\n * Creates new instance.\r\n * @param routeId - route ID\r\n * @param options - route parsing options. Note that the value of\r\n * {@link RouteIdParseOptions.throwErrorOnMatchFail} will be ignored\r\n * and will behave as if it were set to `true`.\r\n * @see - same named parameter of {@link getRouteParts}\r\n * @throws {@link TypeError} @see {@link getRouteParts}\r\n * @throws {@link FormatError} @see {@link getRouteParts}\r\n */\r\n constructor(routeId, options = DEFAULT_ROUTE_ID_PARSE_OPTIONS) {\r\n super();\r\n // When constructing an object of this type, we ALWAYS want an exception\r\n // to be thrown when parsing.\r\n options.throwErrorOnMatchFail = true;\r\n const routeParts = getRouteParts(routeId, options);\r\n // If there are more than one allowedSuffixes defined...\r\n if (options?.allowedSuffixes && options?.allowedSuffixes.length) {\r\n let suffix;\r\n [this._sr, this._rrt, this._rrq, suffix] = routeParts;\r\n this._suffix = suffix || null;\r\n this._isDecrease = suffix === \"d\";\r\n }\r\n else {\r\n [this._sr, this._rrt, this._rrq] = routeParts;\r\n }\r\n }\r\n static parseWaprRouteId(routeId) {\r\n return new RouteDescription(routeId, {\r\n allowedSuffixes: [\"d\"],\r\n suffixesAreOptional: true\r\n });\r\n }\r\n static parseRoadsAndHighwaysRouteId(routeId) {\r\n return new RouteDescription(routeId, {\r\n allowedSuffixes: [\"i\", \"d\", \"r\"],\r\n suffixesAreOptional: false\r\n });\r\n }\r\n /**\r\n * Gets the type of shield of a WA state route: \"IS\", \"US\", or \"SR\"\r\n */\r\n get shield() {\r\n if (this._shield === undefined) {\r\n this._shield = getShieldType(this.sr) || null;\r\n }\r\n return this._shield;\r\n }\r\n /**\r\n * Mainline component of route ID.\r\n */\r\n get sr() {\r\n return this._sr;\r\n }\r\n /**\r\n * Related Route Type (RRT) component.\r\n */\r\n get rrt() {\r\n return this._rrt || null;\r\n }\r\n /**\r\n * Related Route Qualifier (RRQ).\r\n */\r\n get rrq() {\r\n return this._rrq || null;\r\n }\r\n /**\r\n * Indicates if this is a mainline route ID.\r\n * I.e., no RRT or RRQ.\r\n */\r\n get isMainline() {\r\n return !this.rrt && !this.rrq;\r\n }\r\n /**\r\n * Indicates decreasing direction was specified.\r\n * If the \"canIncludeDirection\" option was set to false\r\n * in the constructor, this value will be null.\r\n */\r\n get isDecrease() {\r\n return this._isDecrease;\r\n }\r\n /**\r\n * A suffix used to indicate a route's direction\r\n * a/o route type.\r\n *\r\n * | Context | Allowed suffixes |\r\n * | -------------------------------------- | ----------------------- |\r\n * | LRS Feature Datasets / Feature Classes | no suffixes are allowed |\r\n * | WA Public Roads (WAPR) | `i` |\r\n * | Roads and Highways | `i`, `d`, `r` |\r\n */\r\n get RouteTypeSuffix() {\r\n return this._suffix;\r\n }\r\n /**\r\n * More detailed description of the RRT.\r\n * @returns Returns a detailed description of the RRT if possible.\r\n * Returns null if more details cannot be determined.\r\n */\r\n get rrtDescription() {\r\n return this.rrt ? rrts[this.rrt] : null;\r\n }\r\n /**\r\n * If applicable, milepost where this route either leaves or joins the mainline.\r\n * Value will be null when not applicable.\r\n */\r\n get mainlineConnectionMP() {\r\n if (this.rrq && /^\\d+$/.test(this.rrq)) {\r\n return parseInt(this.rrq, 10) / 100;\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n /**\r\n * Indicates if the route is a \"local collector\" type.\r\n */\r\n get isLocalCollector() {\r\n return !!this.rrt && /((LX)|(F[DI]))/.test(this.rrt);\r\n }\r\n /**\r\n * Indicates if the route is a ramp.\r\n */\r\n get isRamp() {\r\n return this.RouteTypeSuffix === \"r\" || (!!this.rrt && /[PQRS][1-9]/.test(this.rrt)); // spell-checker: disable-line\r\n }\r\n /**\r\n * Detailed description of the RRQ.\r\n */\r\n get rrqDescription() {\r\n if (!this.rrq) {\r\n return null;\r\n }\r\n else if (rrqs.has(this.rrq)) {\r\n return rrqs.get(this.rrq) || null;\r\n }\r\n else if (typeof this.mainlineConnectionMP === \"number\") {\r\n return `at milepost ${this.mainlineConnectionMP}`;\r\n }\r\n return this.rrq;\r\n }\r\n /**\r\n * Returns the route ID string.\r\n */\r\n toString() {\r\n return `${this.sr}${this.rrt || \"\"}${this.rrq || \"\"}${this.RouteTypeSuffix || \"\"}`;\r\n }\r\n}\r\nexport default RouteDescription;\r\n","import FormatError from \"./FormatError.js\";\r\n/**\r\n * Represents a WA state route milepost, consisting of a numeric and \"is back\" boolean value.\r\n */\r\nexport class Milepost extends Object {\r\n _isBack;\r\n _mp;\r\n /**\r\n * Matches milepost info from a Roads & Highways route name.\r\n */\r\n static milepostRegex = /^(?\\d+)(?[AB])?$/i;\r\n /**\r\n * Parses a string into a boolean value: `true` for back mileage,\r\n * or `false` otherwise.\r\n * @param backIndicator - Input string.\r\n * * If this parameter is boolean, this function will simply return the same value.\r\n * * If value is `null` or `undefined`, `false` is returned.\r\n * * If value is a string matching `\"B\"` or `\"b\"`, `true` is returned.\r\n * @returns A boolean equivalent of input back indicator string.\r\n */\r\n static parseBack(backIndicator) {\r\n if (typeof backIndicator === \"boolean\") {\r\n return backIndicator;\r\n }\r\n if (typeof backIndicator === \"string\" && backIndicator.toUpperCase() === \"B\") {\r\n return true;\r\n }\r\n return false;\r\n }\r\n /**\r\n * Indicates if the milepost represents Back mileage.\r\n */\r\n get isBack() {\r\n return this._isBack;\r\n }\r\n /**\r\n * The mileage value.\r\n */\r\n get mp() {\r\n return this._mp;\r\n }\r\n /**\r\n * This value will be \"B\" if {@link isBack} is true, \"A\" otherwise.\r\n */\r\n get mpAsChar() {\r\n return this.isBack ? \"B\" : \"A\";\r\n }\r\n /**\r\n * Returns a string representation of the {@link Milepost}, including a \"B\" suffix for back mileage.\r\n * @param forceA - If set to true and if {@link isBack} is false, an \"A\" will be appended to the end of the output string.\r\n * @returns A string representation of this object.\r\n */\r\n toString(forceA = false) {\r\n if (!forceA && !this.isBack) {\r\n return this.mp.toString(10);\r\n }\r\n return `${this.mp}${this.mpAsChar}`;\r\n }\r\n /**\r\n * Parses the milepost portion of a Roads and Highways route name.\r\n * @param input - Milepost portion of a Roads and Highways route name.\r\n * * Note that the mileage portion will be multiplied by 1000 in a R & H route name.\r\n * * Input **must** end with either an \"A\" or a \"B\".\r\n * @returns A {@link Milepost} equivalent of the input string.\r\n */\r\n static parseFromRoadsAndHighways(input) {\r\n const rhMPRe = /^(?\\d+)(?[AB])$/i;\r\n const match = input.match(rhMPRe);\r\n if (!(match && match.length >= 3 && match.groups)) {\r\n throw new FormatError(input, rhMPRe);\r\n }\r\n const mp = parseInt(match.groups[\"mp\"], 10) / 1000;\r\n const isBack = Milepost.parseBack(match.groups[\"ab\"]);\r\n return new Milepost(mp, isBack);\r\n }\r\n constructor(mpStringOrNumber, isBack = false) {\r\n super();\r\n if (typeof mpStringOrNumber === \"string\") {\r\n const match = mpStringOrNumber.match(Milepost.milepostRegex);\r\n if (!(match && match.length >= 3 && match.groups)) {\r\n throw new FormatError(mpStringOrNumber, Milepost.milepostRegex);\r\n }\r\n const mp = match.groups[\"mp\"];\r\n this._mp = parseInt(mp, 10);\r\n this._isBack = Milepost.parseBack(match.groups[\"ab\"]);\r\n }\r\n else {\r\n this._mp = mpStringOrNumber;\r\n this._isBack = Milepost.parseBack(isBack);\r\n }\r\n }\r\n}\r\n","/**\r\n * This module is for use with the WSDOT LRS map service with Roads & Highways\r\n * extension for parsing its route name string values.\r\n *\r\n * TODO: The following route names found in the Roads & Highways service\r\n * do not currently match the regular expression and currently cannot be\r\n * parsed.\r\n *\r\n *\r\n * * 002R1CN097Adi000000A\r\n * * 005CNLC2RMP1i000000A\r\n * * 005CNLC2RMP2i000000A\r\n * * 005CNLC2RMP3i000000A\r\n * * 097AiCN002S2i000000A\r\n * * 405CNLC2RMP1i000000A\r\n * * 518CNLC2RMP1i000000A\r\n * * 520P1CN202di000000A\r\n * * 520P1CNLCdi000000A\r\n * * LC2512S5rampi000000A\r\n * * LCCN2026di000000A\r\n */\r\nimport { RouteDescription, Milepost, createRouteRegex, FormatError } from \"./index.js\";\r\n/**\r\n * Builds a {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp|RegExp} that will match a route name.\r\n * @param validRrts -\r\n * @see {@link createRouteRegex}\r\n * @returns\r\n */\r\nexport function buildRouteNameRegExp(validRrts) {\r\n // /^(?(?[\\da-z]+)(?[idr]))(?\\w+[idr])?(?(?\\d+)(?[AB]))$/i;\r\n const routeIdRegex = createRouteRegex(validRrts, \"PQRSUWXY\");\r\n let routeIdPattern = routeIdRegex.source;\r\n // Remove the \"^\" and \"$\" parts of the pattern,\r\n // since it will be inserted into another regex.\r\n routeIdPattern = routeIdPattern.replace(/[$^]/g, \"\");\r\n const pattern = String.raw `^(?(?${routeIdPattern})(?[idr]))(?\\w+[idr])?(?(?\\d+)(?[AB]))$`;\r\n return new RegExp(pattern);\r\n}\r\n/**\r\n * Route name used with WSDOT's implementation of ArcGIS Roads & Highways extension.\r\n */\r\nexport class WsdotRHRouteName {\r\n static routeNameRe = buildRouteNameRegExp();\r\n static parseRouteDescription(v) {\r\n return v instanceof RouteDescription ? v : RouteDescription.parseRoadsAndHighwaysRouteId(v);\r\n }\r\n static parseRouteIdAndMilepost(routeIdOrName) {\r\n const match = routeIdOrName.match(WsdotRHRouteName.routeNameRe);\r\n if (match && match.groups) {\r\n const routeIdString = match.groups[\"routeIdAndDir\"];\r\n const milepostString = match.groups[\"mpAndAB\"];\r\n const routeId = WsdotRHRouteName.parseRouteDescription(routeIdString);\r\n const milepost = Milepost.parseFromRoadsAndHighways(milepostString);\r\n return [routeId, milepost];\r\n }\r\n throw new FormatError(routeIdOrName, WsdotRHRouteName.routeNameRe, `routeName parameter \"${routeIdOrName}\" not in expected format: ${WsdotRHRouteName.routeNameRe}.`);\r\n }\r\n _routeId;\r\n _milepost;\r\n /** Route Identifier */\r\n get routeId() {\r\n return this._routeId;\r\n }\r\n /**\r\n * Milepost w/ boolean back mileage indicator\r\n */\r\n get milepost() {\r\n return this._milepost;\r\n }\r\n /**\r\n * Creates a new instance of this object.\r\n * @param routeIdOrName - A route ID or {@link RouteDescription} object.\r\n * @param mp - a milepost, required if {@link routeIdOrName} is a string.\r\n * @throws {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypeError|TypeError} - Thrown if input is a {@link RouteDescription}\r\n * but no value was provided for {@link mp}.\r\n */\r\n constructor(routeIdOrName, mp) {\r\n if (routeIdOrName instanceof RouteDescription) {\r\n this._routeId = routeIdOrName;\r\n if (typeof mp === \"undefined\") {\r\n throw new TypeError(`You must provide a value for the mp parameter if first parameter is a ${RouteDescription.name}`);\r\n }\r\n else {\r\n this._milepost = mp;\r\n }\r\n }\r\n else {\r\n const [r, m] = WsdotRHRouteName.parseRouteIdAndMilepost(routeIdOrName);\r\n this._routeId = r;\r\n this._milepost = m;\r\n }\r\n if (!this._routeId || !this._milepost) {\r\n throw new TypeError();\r\n }\r\n }\r\n}\r\n"],"names":["FormatError","input","expectedFormat","message","US_SYMBOL","IS_SYMBOL","SR_SYMBOL","shieldTypes","shields","getShieldType","routeId","sr","re","match","shield","RelatedRouteType","rrt","description","rrtType","rrts","enumerateRrtDictionaryProperties","enumerateRampRrts","rampTypes","letter","i","onOrOff","incOrDec","rrtDesc","RelatedRouteTypes","desc","enumerateRrtMappingValues","rrtMapping","appendToRegex","inputRe","escapedText","appendSuffixesToRegex","options","suffix","createRouteRegex","validRrts","rampLetters","rampLettersRe","rl","r","pattern","srRegex","DEFAULT_ROUTE_ID_PARSE_OPTIONS","getRouteParts","s","rrqs","RouteDescription","routeParts","Milepost","backIndicator","forceA","rhMPRe","mp","isBack","mpStringOrNumber","buildRouteNameRegExp","routeIdPattern","WsdotRHRouteName","v","routeIdOrName","routeIdString","milepostString","milepost","m"],"mappings":"AAGe,MAAMA,UAAoB,KAAM,CAC3C,MACA,eAWA,YAEAC,EAEAC,EAEAC,EAAS,CACL,MAAMA,GAAW,GAAGF,CAAK,+BAA+BC,CAAc,GAAG,EACzE,KAAK,MAAQD,EACb,KAAK,eAAiBC,CACzB,CACL,CCpBO,MAAME,EAAY,OAAO,IAAI,EAEvBC,EAAY,OAAO,IAAI,EAEvBC,EAAY,OAAO,IAAI,EAI9BC,EAAc,IAAI,IAAI,CACxB,CAACH,EAAW,IAAI,EAChB,CAACC,EAAW,IAAI,EAChB,CAACC,EAAW,IAAI,CACpB,CAAC,EAIYE,EAAU,IAAI,IAAI,CAC3B,CAAC,EAAGJ,CAAS,EACb,CAAC,EAAGE,CAAS,EACb,CAAC,EAAGA,CAAS,EACb,CAAC,EAAGD,CAAS,EACb,CAAC,EAAGC,CAAS,EACb,CAAC,EAAGA,CAAS,EACb,CAAC,EAAGA,CAAS,EACb,CAAC,EAAGA,CAAS,EACb,CAAC,GAAIA,CAAS,EACd,CAAC,GAAIA,CAAS,EACd,CAAC,GAAIF,CAAS,EACd,CAAC,GAAIE,CAAS,EACd,CAAC,GAAIA,CAAS,EACd,CAAC,GAAIA,CAAS,EACd,CAAC,GAAIA,CAAS,EACd,CAAC,GAAIA,CAAS,EACd,CAAC,GAAIA,CAAS,EACd,CAAC,GAAIA,CAAS,EACd,CAAC,GAAIA,CAAS,EACd,CAAC,GAAIA,CAAS,EACd,CAAC,GAAIA,CAAS,EACd,CAAC,GAAIA,CAAS,EACd,CAAC,GAAIA,CAAS,EACd,CAAC,GAAIA,CAAS,EACd,CAAC,GAAIA,CAAS,EACd,CAAC,GAAIA,CAAS,EACd,CAAC,GAAIA,CAAS,EACd,CAAC,GAAID,CAAS,EACd,CAAC,GAAIA,CAAS,EACd,CAAC,GAAIC,CAAS,EACd,CAAC,GAAIA,CAAS,EACd,CAAC,GAAIF,CAAS,EACd,CAAC,GAAIE,CAAS,EACd,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKF,CAAS,EACf,CAAC,IAAKE,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKD,CAAS,EACf,CAAC,IAAKC,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKF,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKE,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKD,CAAS,EACf,CAAC,IAAKC,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKF,CAAS,EACf,CAAC,IAAKE,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKD,CAAS,EACf,CAAC,IAAKC,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EACf,CAAC,IAAKA,CAAS,EA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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8]}