{"version":3,"file":"CarComparisonTable-9b118950.js","sources":["../../src/foundation/carDataFieldTransforms.ts","../../src/components/car-comparison/CarComparisonTable.vue"],"sourcesContent":["type TransformFunctionType = { functionName: string };\r\n\r\n/**\r\n * Create a Map to store the API field names that\r\n * point to the corresponding function to execute.\r\n */\r\nexport const carDataFieldTransforms = new Map([\r\n ['upperCase', upperCase],\r\n ['capitalizeFirstLetter', capitalizeFirstLetter],\r\n ['addSuffixCubicMetres', addSuffixCubicMetres],\r\n ['autonomousDriveLevel', autonomousDriveLevel],\r\n ['getYearFromDatestamp', getYearFromDatestamp],\r\n ['addSuffixGramsPerKM', addSuffixGramsPerKM],\r\n ['regularServiceInterval', regularServiceInterval],\r\n ['transmissionType', transmissionType],\r\n ['fuelAddLitres', fuelAddLitres],\r\n ['fuelAddLitresPerKM', fuelAddLitresPerKM],\r\n ['toInteger', toInteger],\r\n ['titleCase', titleCase],\r\n ['driveLayout', driveLayout],\r\n ['toOneDecimal', toOneDecimal],\r\n ['tyresFormat', tyresFormat],\r\n ['addSuffixCC', addSuffixCC],\r\n ['addSuffixKG', addSuffixKG],\r\n ['addSuffixSeconds', addSuffixSeconds],\r\n ['addSuffixKMH', addSuffixKMH],\r\n ['addSuffixKM', addSuffixKM],\r\n ['addSuffixMM', addSuffixMM],\r\n ['addSuffixKWH', addSuffixKWH],\r\n ['addSuffixKW', addSuffixKW],\r\n ['addSuffixMonths', addSuffixMonths],\r\n ['addSuffixDegrees', addSuffixDegrees],\r\n ['ancapStars', ancapStars],\r\n ['rateOfCharge', rateOfCharge],\r\n ['addInchesSymbolToNumber', addInchesSymbolToNumber],\r\n ['tyreSpeedRating', tyreSpeedRating],\r\n ['numberWithCommas', numberWithCommas],\r\n]);\r\n\r\n//\r\n// Note to self\r\n//\r\n// After looking at the excel spreadsheet, I think it will mostly make sense to create\r\n// unique function names for most of the data points in the spreadsheet. There is too\r\n// much complexity with the specific transforms and corresponding data points.\r\n//\r\n// I suggest we continue creating generic helper functions to assist the transforms,\r\n// (eg) upperCase, addSuffix, capitalize, but the main use of the Map will be for the\r\n// more complex fn transforms coming from SC (eg) transmissionType, acceleration.\r\n//\r\n// The Map fn will be big, but if we try and build a generic function to rule them all\r\n// it will become complex, difficult to read and maintain.\r\n//\r\n// I recommend we aim to reduce the amount of transform combinations we use in SiteCore\r\n// (eg) 'transmissionType' instead of 'transmissionType|upperCase|suffixKMS'.\r\n// Then the 'transmissionType' fn can handle uppercasing and suffixing on its own.\r\n//\r\n//\r\n//\r\n\r\n/**\r\n * Transform a vehicle's data using a specific transform function registered in the transform Map.\r\n *\r\n * This function takes in a vehicle data object, an array of the field keys in the data to transform.\r\n *\r\n * @param vehicle The vehicle data object\r\n * @param fieldKeys An array of vehicle data object keys to target\r\n * @param transformFunction The transform function to run (string of funcs separated by the '|' pipe symbol)\r\n *\r\n * @returns The transformed data value\r\n */\r\nexport function transformDataPoint(vehicle: any, fieldKeys: string[], transformFunctions: TransformFunctionType[]) {\r\n // Loop over each transformFunction and execute the corresponding transform\r\n function recursiveTransform(transformFunctions: TransformFunctionType[], result: any): any {\r\n const fieldValue = result || vehicle[fieldKeys[0]];\r\n\r\n if (!fieldValue) {\r\n return handleUndefinedFields(fieldKeys);\r\n }\r\n\r\n if (transformFunctions.length === 0) {\r\n return result;\r\n }\r\n\r\n const transformFunc = transformFunctions[0].functionName;\r\n const fn = carDataFieldTransforms.get(transformFunc);\r\n const isValidFunction = carDataFieldTransforms.has(transformFunc) && fn && typeof fn === 'function';\r\n\r\n if (isValidFunction) {\r\n if (!fieldValue) {\r\n console.error(`no field value (${transformFunc}): ${JSON.stringify({ fieldValue, fieldKeys, value: result })}`);\r\n }\r\n\r\n return recursiveTransform(transformFunctions.slice(1), fn(vehicle, fieldKeys, result));\r\n }\r\n\r\n throw Error(`Transform function does not exist: ${JSON.stringify({ transformFunc, transformFunctions })}`);\r\n }\r\n\r\n return recursiveTransform(transformFunctions, undefined);\r\n}\r\n\r\n// --- --- --- --- --- --- --- --- --- --- --- --- --- ---\r\n// Transformation functions to render vehicle datapoints\r\n// in comparison table, car details and other places.\r\n// --- --- --- --- --- --- --- --- --- --- --- --- --- ---\r\n\r\n/**\r\n * Uppercase a data field string.\r\n *\r\n * @param vehicle\r\n * @param fieldKeys\r\n *\r\n * @returns {String}\r\n */\r\nfunction upperCase(vehicle: any, fieldKeys: string[], value: string): string {\r\n const fieldValue = value || vehicle[fieldKeys[0]];\r\n\r\n return fieldValue?.toUpperCase();\r\n}\r\n\r\n/**\r\n * Capitalise the first letter of a data string.\r\n *\r\n * @param vehicle\r\n * @param fieldKeys\r\n *\r\n * @returns {String}\r\n */\r\nfunction capitalizeFirstLetter(vehicle: any, fieldKeys: string[], value: string): string {\r\n const fieldValue = value || vehicle[fieldKeys[0]];\r\n\r\n return fieldValue?.charAt(0)?.toUpperCase() + fieldValue?.slice(1);\r\n}\r\n\r\n/**\r\n * Format a string to title case.\r\n * For example: 'hello world' => 'Hello World'\r\n *\r\n * @param vehicle\r\n * @param fieldKeys\r\n *\r\n * @returns {String}\r\n */\r\nfunction titleCase(vehicle: any, fieldKeys: string[], value: string): string {\r\n const fieldValue: string = value || vehicle[fieldKeys[0]];\r\n\r\n return fieldValue\r\n .split(' ')\r\n .map((w) => w[0].toUpperCase() + w.substring(1).toLowerCase())\r\n .join(' ');\r\n}\r\n\r\n/**\r\n * Transform the transmission type data into a human readable string.\r\n *\r\n * @param vehicle\r\n * @param fieldKeys\r\n *\r\n * @returns {String}\r\n */\r\nfunction transmissionType(vehicle: any, fieldKeys: string[], value: string): string {\r\n const transType = capitalizeFirstLetterOfString(vehicle[fieldKeys[1]]); // manual -> Manual, auto -> Auto\r\n const speeds = capitalizeFirstLetterOfString(vehicle[fieldKeys[0]]); // variable -> Variable, 3 -> 3 (i.e. no change for numbers)\r\n return speeds + ' speed ' + transType;\r\n}\r\n\r\n/**\r\n * Transform the EV charge data into a readable string.\r\n *\r\n * @param vehicle\r\n * @param fieldKeys\r\n *\r\n * @returns {String}\r\n */\r\nfunction rateOfCharge(vehicle: any, fieldKeys: string[], value: string): string {\r\n //\r\n //\r\n return 'rate of charge TBD';\r\n}\r\n\r\n/**\r\n * Format a string to show the servicing interval in KMs and months.\r\n *\r\n * @param vehicle\r\n * @param fieldKeys\r\n *\r\n * @returns {String}\r\n */\r\nfunction regularServiceInterval(vehicle: any, fieldKeys: string[], value: string): string {\r\n const kmsFormatted = addSuffix(numberWithCommas(vehicle, fieldKeys, value), 'km');\r\n const monthsFormatted = addSuffix(vehicle[fieldKeys[1]], ' months');\r\n\r\n return `${kmsFormatted} ${monthsFormatted ? `or every ${monthsFormatted}` : ''}`;\r\n}\r\n\r\n/**\r\n * Add commas to a number based on locale standards\r\n * eg. 10000 => 10,000\r\n *\r\n * @param vehicle\r\n * @param fieldKeys\r\n * @param value\r\n * @returns {String}\r\n */\r\nfunction numberWithCommas(vehicle: any, fieldKeys: string[], value: string): string {\r\n return new Intl.NumberFormat().format(vehicle[fieldKeys[0]]);\r\n}\r\n\r\n/**\r\n * Add suffix 'L' suffix to value.\r\n *\r\n * @param vehicle\r\n * @param fieldKeys\r\n * @param value\r\n *\r\n * @returns {String}\r\n */\r\nfunction fuelAddLitres(vehicle: any, fieldKeys: string[], value: string): string {\r\n const fieldValue = value || vehicle[fieldKeys[0]];\r\n\r\n if (!fieldValue) return 'N/A';\r\n\r\n return addSuffix(fieldValue, 'L');\r\n}\r\n\r\n/**\r\n * Add suffix 'L/100km' to value.\r\n *\r\n * @param vehicle\r\n * @param fieldKeys\r\n * @param value\r\n *\r\n * @returns {String}\r\n */\r\nfunction fuelAddLitresPerKM(vehicle: any, fieldKeys: string[], value: string): string {\r\n const fieldValue = value || vehicle[fieldKeys[0]];\r\n\r\n return addSuffix(fieldValue, 'L/100km');\r\n}\r\n\r\n/**\r\n * Add suffix 'g/km' to value.\r\n * @param vehicle\r\n * @param fieldKeys\r\n * @param value\r\n *\r\n * @returns {String}\r\n */\r\nfunction addSuffixGramsPerKM(vehicle: any, fieldKeys: string[], value: string): string {\r\n const fieldValue = value || vehicle[fieldKeys[0]];\r\n\r\n return addSuffix(fieldValue, 'g/km');\r\n}\r\n\r\n/**\r\n * Remove decimal places from an integer and return as a string.\r\n *\r\n * @param vehicle\r\n * @param fieldKeys\r\n * @param value\r\n *\r\n * @returns {String}\r\n */\r\nfunction toInteger(vehicle: any, fieldKeys: string[], value: string): string {\r\n const fieldValue = value || vehicle[fieldKeys[0]];\r\n\r\n return String(Math?.trunc(Number(fieldValue)));\r\n}\r\n\r\n/**\r\n * Return a number as a string to one decimal place.\r\n * For example: 2.20 => 2.2\r\n *\r\n * @param vehicle\r\n * @param fieldKeys\r\n * @param value\r\n * @returns\r\n */\r\nfunction toOneDecimal(vehicle: any, fieldKeys: string[], value: string): string {\r\n const fieldValue = value || vehicle[fieldKeys[0]];\r\n\r\n return String(Number(Number(fieldValue))?.toFixed(1));\r\n}\r\n\r\n/**\r\n * Returns a lookup and transform of drive layouts\r\n * For example: front = FWD\r\n *\r\n * @param vehicle\r\n * @param fieldKeys\r\n * @param value\r\n * @returns\r\n */\r\nfunction driveLayout(vehicle: any, fieldKeys: string[], value: string): string {\r\n const fieldValue = value || vehicle[fieldKeys[0]];\r\n\r\n switch (fieldValue) {\r\n case 'front':\r\n return 'FWD';\r\n case 'rear':\r\n return 'RWD';\r\n case '4x4':\r\n return '4WD';\r\n default:\r\n return 'Unknown drive layout';\r\n }\r\n}\r\n\r\n/**\r\n * Add 'cc' to the end of a string.\r\n *\r\n * @param vehicle\r\n * @param fieldKeys\r\n * @param value\r\n *\r\n * @returns {String}\r\n */\r\nfunction addSuffixCC(vehicle: any, fieldKeys: string[], value: string): string {\r\n const fieldValue = value || vehicle[fieldKeys[0]];\r\n\r\n return addSuffix(fieldValue, 'cc');\r\n}\r\n\r\n/**\r\n * Add 'kg' to the end of a string.\r\n *\r\n * @param vehicle\r\n * @param fieldKeys\r\n * @param value\r\n *\r\n * @returns {String}\r\n */\r\nfunction addSuffixKG(vehicle: any, fieldKeys: string[], value: string): string {\r\n const fieldValue = value || vehicle[fieldKeys[0]];\r\n\r\n return addSuffix(fieldValue, 'kg');\r\n}\r\n\r\n/**\r\n * Add 's' to the end of a string.\r\n *\r\n * @param vehicle\r\n * @param fieldKeys\r\n * @param value\r\n *\r\n * @returns {String}\r\n */\r\nfunction addSuffixSeconds(vehicle: any, fieldKeys: string[], value: string): string {\r\n const fieldValue = value || vehicle[fieldKeys[0]];\r\n\r\n return addSuffix(fieldValue, 's');\r\n}\r\n\r\n/**\r\n * Add 'km/h' to the end of a string.\r\n *\r\n * @param vehicle\r\n * @param fieldKeys\r\n * @param value\r\n *\r\n * @returns {String}\r\n */\r\nfunction addSuffixKMH(vehicle: any, fieldKeys: string[], value: string): string {\r\n const fieldValue = value || vehicle[fieldKeys[0]];\r\n\r\n return addSuffix(fieldValue, 'km/h');\r\n}\r\n\r\n/**\r\n * Add 'km' to the end of a string.\r\n *\r\n * @param vehicle\r\n * @param fieldKeys\r\n * @param value\r\n *\r\n * @returns {String}\r\n */\r\nfunction addSuffixKM(vehicle: any, fieldKeys: string[], value: string): string {\r\n const fieldValue = value || vehicle[fieldKeys[0]];\r\n\r\n return addSuffix(fieldValue, 'km');\r\n}\r\n\r\n/**\r\n * Add 'mm' to the end of a string.\r\n *\r\n * @param vehicle\r\n * @param fieldKeys\r\n * @param value\r\n *\r\n * @returns {String}\r\n */\r\nfunction addSuffixMM(vehicle: any, fieldKeys: string[], value: string): string {\r\n const fieldValue = value || vehicle[fieldKeys[0]];\r\n\r\n return addSuffix(fieldValue, 'mm');\r\n}\r\n\r\n/**\r\n * Add 'm3' to the end of a string.\r\n *\r\n * @param vehicle\r\n * @param fieldKeys\r\n * @param value\r\n *\r\n * @returns {String}\r\n */\r\nfunction addSuffixCubicMetres(vehicle: any, fieldKeys: string[], value: string): string {\r\n const fieldValue = value || vehicle[fieldKeys[0]];\r\n\r\n return addSuffix(fieldValue, 'm3');\r\n}\r\n\r\n/**\r\n * Add 'kWh' to the end of a string.\r\n *\r\n * @param vehicle\r\n * @param fieldKeys\r\n * @param value\r\n *\r\n * @returns {String}\r\n */\r\nfunction addSuffixKWH(vehicle: any, fieldKeys: string[], value: string): string {\r\n const fieldValue = value || vehicle[fieldKeys[0]];\r\n\r\n return addSuffix(fieldValue, 'kWh');\r\n}\r\n\r\n/**\r\n * Add 'kW' to the end of a string.\r\n *\r\n * @param vehicle\r\n * @param fieldKeys\r\n * @param value\r\n *\r\n * @returns {String}\r\n */\r\nfunction addSuffixKW(vehicle: any, fieldKeys: string[], value: string): string {\r\n const fieldValue = value || vehicle[fieldKeys[0]];\r\n\r\n return addSuffix(fieldValue, 'kW');\r\n}\r\n\r\n/**\r\n * Add ' months' to the end of a string.\r\n *\r\n * @param vehicle\r\n * @param fieldKeys\r\n * @param value\r\n *\r\n * @returns {String}\r\n */\r\nfunction addSuffixMonths(vehicle: any, fieldKeys: string[], value: string): string {\r\n const fieldValue = value || vehicle[fieldKeys[0]];\r\n // TODO: confirm that we want a space before the word 'months'\r\n return addSuffix(fieldValue, ' months');\r\n}\r\n\r\n/**\r\n * Add degrees HTML entity to the end of a string.\r\n *\r\n * @param vehicle\r\n * @param fieldKeys\r\n * @param value\r\n *\r\n * @returns {String}\r\n */\r\nfunction addSuffixDegrees(vehicle: any, fieldKeys: string[], value: string): string {\r\n const fieldValue = value || vehicle[fieldKeys[0]];\r\n\r\n return addSuffix(fieldValue, '°');\r\n}\r\n\r\n/**\r\n * Format a string into tyres format\r\n *\r\n * @param vehicle\r\n * @param fieldKeys\r\n * @param value\r\n *\r\n * @returns {String}\r\n */\r\nfunction tyresFormat(vehicle: any, fieldKeys: string[], value: string): string {\r\n const fieldValue = value || vehicle[fieldKeys[0]];\r\n\r\n return fieldValue?.replaceAll('_', '/');\r\n}\r\n\r\n/**\r\n * Return the automation level from a given number.\r\n *\r\n * @param vehicle\r\n * @param fieldKeys\r\n * @param value\r\n *\r\n * @returns {String}\r\n */\r\nfunction autonomousDriveLevel(vehicle: any, fieldKeys: string[], value: string | number): string {\r\n // TODO: confirm that these are all possible options for autonomous drive level\r\n switch (String(value || vehicle[fieldKeys[0]])) {\r\n case '1':\r\n return '1 - Full automation';\r\n case '2':\r\n return '2 - Partial automation';\r\n default:\r\n return 'Unknown autonomous drive level';\r\n }\r\n}\r\n\r\n/**\r\n * Returns the the ANCAP rating as a string.\r\n *\r\n * @param vehicle\r\n * @param fieldKeys\r\n * @param value\r\n *\r\n * @returns {String}\r\n */\r\nfunction ancapStars(vehicle: any, fieldKeys: string[], value: string | number): string {\r\n const fieldValueAsNumber = Number(value || vehicle[fieldKeys[0]]);\r\n\r\n return Math?.trunc(fieldValueAsNumber) + ' Stars';\r\n}\r\n\r\n/**\r\n * Return the year from a given date stamp.\r\n *\r\n * @param vehicle\r\n * @param fieldKeys\r\n * @param value\r\n *\r\n * @returns {String}\r\n */\r\nfunction getYearFromDatestamp(vehicle: any, fieldKeys: string[], value: string): string {\r\n const fieldValueAsDate = new Date(value || vehicle[fieldKeys[0]]);\r\n\r\n return String(fieldValueAsDate?.getFullYear());\r\n}\r\n\r\n/**\r\n * Add the inches (\") symbol to a number in a string.\r\n *\r\n * @param vehicle\r\n * @param fieldKeys\r\n * @param value\r\n *\r\n * @returns {String}\r\n */\r\nfunction addInchesSymbolToNumber(vehicle: any, fieldKeys: string[], value: string): string {\r\n const fieldValue = value || vehicle[fieldKeys[0]];\r\n\r\n return fieldValue.replace(/(\\d+)/, '$1\"');\r\n}\r\n\r\n/**\r\n * Create a dictionary for speed symbols.\r\n *\r\n * @param vehicle\r\n * @param fieldKeys\r\n * @param value\r\n * @returns {String}\r\n */\r\nfunction tyreSpeedRating(vehicle: any, fieldKeys: string[], value: string): string {\r\n const fieldValue = value || vehicle[fieldKeys[0]];\r\n let output = '';\r\n\r\n switch (fieldValue) {\r\n case 'F':\r\n output = '80';\r\n break;\r\n case 'G':\r\n output = '90';\r\n break;\r\n case 'J':\r\n output = '100';\r\n break;\r\n case 'K':\r\n output = '110';\r\n break;\r\n case 'L':\r\n output = '120';\r\n break;\r\n case 'M':\r\n output = '130';\r\n break;\r\n case 'N':\r\n output = '140';\r\n break;\r\n case 'P':\r\n output = '150';\r\n break;\r\n case 'Q':\r\n output = '160';\r\n break;\r\n case 'R':\r\n output = '170';\r\n break;\r\n case 'S':\r\n output = '180';\r\n break;\r\n case 'T':\r\n output = '190';\r\n break;\r\n case 'U':\r\n output = '200';\r\n break;\r\n case 'H':\r\n output = '210';\r\n break;\r\n case 'V':\r\n case 'Z':\r\n output = '240';\r\n break;\r\n case 'W':\r\n output = '270';\r\n break;\r\n case 'ZR':\r\n output = 'Above 270';\r\n break;\r\n case 'Y':\r\n output = '300';\r\n break;\r\n case '(Y)':\r\n output = 'Above 300';\r\n break;\r\n default:\r\n return 'N/A';\r\n }\r\n\r\n return addSuffix(fieldValue + ' - ' + output, 'km/h');\r\n}\r\n\r\n// --- --- --- --- --- --- --- --- --- --- --- ---\r\n// Generic Helper Functions\r\n// --- --- --- --- --- --- --- --- --- --- --- ---\r\n\r\n/**\r\n * Add a suffix to a string.\r\n *\r\n * @param vehicle\r\n * @param fieldKeys\r\n * @param suffixValue\r\n *\r\n * @returns {String}\r\n */\r\nfunction addSuffix(value: string, suffixValue: string): string {\r\n return value ? value + suffixValue : '';\r\n}\r\n\r\n/**\r\n * Capitalise the first letter of a string parameter.\r\n *\r\n * @param value\r\n *\r\n * @returns {String}\r\n */\r\nfunction capitalizeFirstLetterOfString(value: string): string {\r\n return value?.charAt(0)?.toUpperCase() + value?.slice(1);\r\n}\r\n\r\n/**\r\n * Helper function to handle specific error scenarios.\r\n *\r\n * @param fieldKeys An array of vehicle data object keys to target\r\n *\r\n * @returns An informative error\r\n */\r\nfunction handleUndefinedFields(fieldKeys: string[]) {\r\n if (fieldKeys[0] === 'ANCAP_Overall_score') {\r\n return 'Current rating not available';\r\n }\r\n\r\n return 'N/A';\r\n}\r\n","\r\n\r\n\r\n\r\n\r\n"],"names":["carDataFieldTransforms","upperCase","capitalizeFirstLetter","addSuffixCubicMetres","autonomousDriveLevel","getYearFromDatestamp","addSuffixGramsPerKM","regularServiceInterval","transmissionType","fuelAddLitres","fuelAddLitresPerKM","toInteger","titleCase","driveLayout","toOneDecimal","tyresFormat","addSuffixCC","addSuffixKG","addSuffixSeconds","addSuffixKMH","addSuffixKM","addSuffixMM","addSuffixKWH","addSuffixKW","addSuffixMonths","addSuffixDegrees","ancapStars","rateOfCharge","addInchesSymbolToNumber","tyreSpeedRating","numberWithCommas","transformDataPoint","vehicle","fieldKeys","transformFunctions","recursiveTransform","result","fieldValue","handleUndefinedFields","transformFunc","fn","value","_a","w","transType","capitalizeFirstLetterOfString","kmsFormatted","addSuffix","monthsFormatted","fieldValueAsNumber","fieldValueAsDate","output","suffixValue","comparisonStore","useCarComparisonStore","fetchedVehicles","storeToRefs","getDataValue","carData","dataPoint","vehicleData","vehicleDataKeys","_b","vehicleDataTransformFunctions","item"],"mappings":"0WAMa,MAAAA,MAA6B,IAAI,CAC5C,CAAC,YAAaC,CAAS,EACvB,CAAC,wBAAyBC,CAAqB,EAC/C,CAAC,uBAAwBC,CAAoB,EAC7C,CAAC,uBAAwBC,CAAoB,EAC7C,CAAC,uBAAwBC,EAAoB,EAC7C,CAAC,sBAAuBC,CAAmB,EAC3C,CAAC,yBAA0BC,CAAsB,EACjD,CAAC,mBAAoBC,CAAgB,EACrC,CAAC,gBAAiBC,CAAa,EAC/B,CAAC,qBAAsBC,CAAkB,EACzC,CAAC,YAAaC,CAAS,EACvB,CAAC,YAAaC,CAAS,EACvB,CAAC,cAAeC,CAAW,EAC3B,CAAC,eAAgBC,CAAY,EAC7B,CAAC,cAAeC,CAAW,EAC3B,CAAC,cAAeC,CAAW,EAC3B,CAAC,cAAeC,CAAW,EAC3B,CAAC,mBAAoBC,CAAgB,EACrC,CAAC,eAAgBC,CAAY,EAC7B,CAAC,cAAeC,CAAW,EAC3B,CAAC,cAAeC,CAAW,EAC3B,CAAC,eAAgBC,CAAY,EAC7B,CAAC,cAAeC,CAAW,EAC3B,CAAC,kBAAmBC,CAAe,EACnC,CAAC,mBAAoBC,CAAgB,EACrC,CAAC,aAAcC,EAAU,EACzB,CAAC,eAAgBC,CAAY,EAC7B,CAAC,0BAA2BC,EAAuB,EACnD,CAAC,kBAAmBC,EAAe,EACnC,CAAC,mBAAoBC,CAAgB,CACvC,CAAC,EAkCe,SAAAC,EAAmBC,EAAcC,EAAqBC,EAA6C,CAExG,SAAAC,EAAmBD,EAA6CE,EAAkB,CACnF,MAAAC,EAAaD,GAAUJ,EAAQC,EAAU,IAE/C,GAAI,CAACI,EACH,OAAOC,GAAsBL,CAAS,EAGpCC,GAAAA,EAAmB,SAAW,EACzB,OAAAE,EAGH,MAAAG,EAAgBL,EAAmB,GAAG,aACtCM,EAAKxC,EAAuB,IAAIuC,CAAa,EAGnD,GAFwBvC,EAAuB,IAAIuC,CAAa,GAAKC,GAAM,OAAOA,GAAO,WAGvF,OAAKH,GACK,QAAA,MAAM,mBAAmBE,OAAmB,KAAK,UAAU,CAAE,WAAAF,EAAY,UAAAJ,EAAW,MAAOG,CAAO,CAAC,GAAG,EAGzGD,EAAmBD,EAAmB,MAAM,CAAC,EAAGM,EAAGR,EAASC,EAAWG,CAAM,CAAC,EAGjF,MAAA,MAAM,sCAAsC,KAAK,UAAU,CAAE,cAAAG,EAAe,mBAAAL,EAAoB,GAAG,CAC3G,CAEO,OAAAC,EAAmBD,EAAoB,MAAS,CACzD,CAeA,SAASjC,EAAU+B,EAAcC,EAAqBQ,EAAuB,CACrE,MAAAJ,EAAaI,GAAST,EAAQC,EAAU,IAE9C,OAAOI,GAAA,YAAAA,EAAY,aACrB,CAUA,SAASnC,EAAsB8B,EAAcC,EAAqBQ,EAAuB,OACjF,MAAAJ,EAAaI,GAAST,EAAQC,EAAU,IAEvC,QAAAS,EAAAL,GAAA,YAAAA,EAAY,OAAO,KAAnB,YAAAK,EAAuB,gBAAgBL,GAAA,YAAAA,EAAY,MAAM,GAClE,CAWA,SAASzB,EAAUoB,EAAcC,EAAqBQ,EAAuB,CAG3E,OAF2BA,GAAST,EAAQC,EAAU,KAGnD,MAAM,GAAG,EACT,IAAKU,GAAMA,EAAE,GAAG,cAAgBA,EAAE,UAAU,CAAC,EAAE,aAAa,EAC5D,KAAK,GAAG,CACb,CAUA,SAASnC,EAAiBwB,EAAcC,EAAqBQ,EAAuB,CAClF,MAAMG,EAAYC,EAA8Bb,EAAQC,EAAU,GAAG,EAErE,OADeY,EAA8Bb,EAAQC,EAAU,GAAG,EAClD,UAAYW,CAC9B,CAUA,SAASjB,EAAaK,EAAcC,EAAqBQ,EAAuB,CAGvE,MAAA,oBACT,CAUA,SAASlC,EAAuByB,EAAcC,EAAqBQ,EAAuB,CACxF,MAAMK,EAAeC,EAAUjB,EAAiBE,EAASC,CAAgB,EAAG,IAAI,EAC1Ee,EAAkBD,EAAUf,EAAQC,EAAU,IAAK,SAAS,EAElE,MAAO,GAAGa,KAAgBE,EAAkB,YAAYA,IAAoB,IAC9E,CAWA,SAASlB,EAAiBE,EAAcC,EAAqBQ,EAAuB,CAClF,OAAO,IAAI,KAAK,eAAe,OAAOT,EAAQC,EAAU,GAAG,CAC7D,CAWA,SAASxB,EAAcuB,EAAcC,EAAqBQ,EAAuB,CACzE,MAAAJ,EAAaI,GAAST,EAAQC,EAAU,IAE9C,OAAKI,EAEEU,EAAUV,EAAY,GAAG,EAFR,KAG1B,CAWA,SAAS3B,EAAmBsB,EAAcC,EAAqBQ,EAAuB,CAC9E,MAAAJ,EAAaI,GAAST,EAAQC,EAAU,IAEvC,OAAAc,EAAUV,EAAY,SAAS,CACxC,CAUA,SAAS/B,EAAoB0B,EAAcC,EAAqBQ,EAAuB,CAC/E,MAAAJ,EAAaI,GAAST,EAAQC,EAAU,IAEvC,OAAAc,EAAUV,EAAY,MAAM,CACrC,CAWA,SAAS1B,EAAUqB,EAAcC,EAAqBQ,EAAuB,CACrE,MAAAJ,EAAaI,GAAST,EAAQC,EAAU,IAE9C,OAAO,OAAO,uBAAM,MAAM,OAAOI,CAAU,EAAE,CAC/C,CAWA,SAASvB,EAAakB,EAAcC,EAAqBQ,EAAuB,OACxE,MAAAJ,EAAaI,GAAST,EAAQC,EAAU,IAEvC,OAAA,QAAOS,EAAA,OAAO,OAAOL,CAAU,CAAC,IAAzB,YAAAK,EAA4B,QAAQ,EAAE,CACtD,CAWA,SAAS7B,EAAYmB,EAAcC,EAAqBQ,EAAuB,CAG7E,OAFmBA,GAAST,EAAQC,EAAU,IAE1B,CAClB,IAAK,QACI,MAAA,MACT,IAAK,OACI,MAAA,MACT,IAAK,MACI,MAAA,MACT,QACS,MAAA,sBACX,CACF,CAWA,SAASjB,EAAYgB,EAAcC,EAAqBQ,EAAuB,CACvE,MAAAJ,EAAaI,GAAST,EAAQC,EAAU,IAEvC,OAAAc,EAAUV,EAAY,IAAI,CACnC,CAWA,SAASpB,EAAYe,EAAcC,EAAqBQ,EAAuB,CACvE,MAAAJ,EAAaI,GAAST,EAAQC,EAAU,IAEvC,OAAAc,EAAUV,EAAY,IAAI,CACnC,CAWA,SAASnB,EAAiBc,EAAcC,EAAqBQ,EAAuB,CAC5E,MAAAJ,EAAaI,GAAST,EAAQC,EAAU,IAEvC,OAAAc,EAAUV,EAAY,GAAG,CAClC,CAWA,SAASlB,EAAaa,EAAcC,EAAqBQ,EAAuB,CACxE,MAAAJ,EAAaI,GAAST,EAAQC,EAAU,IAEvC,OAAAc,EAAUV,EAAY,MAAM,CACrC,CAWA,SAASjB,EAAYY,EAAcC,EAAqBQ,EAAuB,CACvE,MAAAJ,EAAaI,GAAST,EAAQC,EAAU,IAEvC,OAAAc,EAAUV,EAAY,IAAI,CACnC,CAWA,SAAShB,EAAYW,EAAcC,EAAqBQ,EAAuB,CACvE,MAAAJ,EAAaI,GAAST,EAAQC,EAAU,IAEvC,OAAAc,EAAUV,EAAY,IAAI,CACnC,CAWA,SAASlC,EAAqB6B,EAAcC,EAAqBQ,EAAuB,CAChF,MAAAJ,EAAaI,GAAST,EAAQC,EAAU,IAEvC,OAAAc,EAAUV,EAAY,eAAe,CAC9C,CAWA,SAASf,EAAaU,EAAcC,EAAqBQ,EAAuB,CACxE,MAAAJ,EAAaI,GAAST,EAAQC,EAAU,IAEvC,OAAAc,EAAUV,EAAY,KAAK,CACpC,CAWA,SAASd,EAAYS,EAAcC,EAAqBQ,EAAuB,CACvE,MAAAJ,EAAaI,GAAST,EAAQC,EAAU,IAEvC,OAAAc,EAAUV,EAAY,IAAI,CACnC,CAWA,SAASb,EAAgBQ,EAAcC,EAAqBQ,EAAuB,CAC3E,MAAAJ,EAAaI,GAAST,EAAQC,EAAU,IAEvC,OAAAc,EAAUV,EAAY,SAAS,CACxC,CAWA,SAASZ,EAAiBO,EAAcC,EAAqBQ,EAAuB,CAC5E,MAAAJ,EAAaI,GAAST,EAAQC,EAAU,IAEvC,OAAAc,EAAUV,EAAY,OAAO,CACtC,CAWA,SAAStB,EAAYiB,EAAcC,EAAqBQ,EAAuB,CACvE,MAAAJ,EAAaI,GAAST,EAAQC,EAAU,IAEvC,OAAAI,GAAA,YAAAA,EAAY,WAAW,IAAK,IACrC,CAWA,SAASjC,EAAqB4B,EAAcC,EAAqBQ,EAAgC,CAE/F,OAAQ,OAAOA,GAAST,EAAQC,EAAU,GAAG,EAAG,CAC9C,IAAK,IACI,MAAA,sBACT,IAAK,IACI,MAAA,yBACT,QACS,MAAA,gCACX,CACF,CAWA,SAASP,GAAWM,EAAcC,EAAqBQ,EAAgC,CACrF,MAAMQ,EAAqB,OAAOR,GAAST,EAAQC,EAAU,GAAG,EAEzD,OAAA,uBAAM,MAAMgB,IAAsB,QAC3C,CAWA,SAAS5C,GAAqB2B,EAAcC,EAAqBQ,EAAuB,CACtF,MAAMS,EAAmB,IAAI,KAAKT,GAAST,EAAQC,EAAU,GAAG,EAEzD,OAAA,OAAOiB,GAAA,YAAAA,EAAkB,aAAa,CAC/C,CAWA,SAAStB,GAAwBI,EAAcC,EAAqBQ,EAAuB,CAGlF,OAFYA,GAAST,EAAQC,EAAU,KAE5B,QAAQ,QAAS,KAAK,CAC1C,CAUA,SAASJ,GAAgBG,EAAcC,EAAqBQ,EAAuB,CAC3E,MAAAJ,EAAaI,GAAST,EAAQC,EAAU,IAC9C,IAAIkB,EAAS,GAEb,OAAQd,EAAY,CAClB,IAAK,IACMc,EAAA,KACT,MACF,IAAK,IACMA,EAAA,KACT,MACF,IAAK,IACMA,EAAA,MACT,MACF,IAAK,IACMA,EAAA,MACT,MACF,IAAK,IACMA,EAAA,MACT,MACF,IAAK,IACMA,EAAA,MACT,MACF,IAAK,IACMA,EAAA,MACT,MACF,IAAK,IACMA,EAAA,MACT,MACF,IAAK,IACMA,EAAA,MACT,MACF,IAAK,IACMA,EAAA,MACT,MACF,IAAK,IACMA,EAAA,MACT,MACF,IAAK,IACMA,EAAA,MACT,MACF,IAAK,IACMA,EAAA,MACT,MACF,IAAK,IACMA,EAAA,MACT,MACF,IAAK,IACL,IAAK,IACMA,EAAA,MACT,MACF,IAAK,IACMA,EAAA,MACT,MACF,IAAK,KACMA,EAAA,YACT,MACF,IAAK,IACMA,EAAA,MACT,MACF,IAAK,MACMA,EAAA,YACT,MACF,QACS,MAAA,KACX,CAEA,OAAOJ,EAAUV,EAAa,MAAQc,EAAQ,MAAM,CACtD,CAeA,SAASJ,EAAUN,EAAeW,EAA6B,CACtD,OAAAX,EAAQA,EAAQW,EAAc,EACvC,CASA,SAASP,EAA8BJ,EAAuB,OACrD,QAAAC,EAAAD,GAAA,YAAAA,EAAO,OAAO,KAAd,YAAAC,EAAkB,gBAAgBD,GAAA,YAAAA,EAAO,MAAM,GACxD,CASA,SAASH,GAAsBL,EAAqB,CAC9C,OAAAA,EAAU,KAAO,sBACZ,+BAGF,KACT,sKCjoBA,MAAMoB,EAAkBC,IAClB,CAAE,gBAAAC,CAAA,EAAoBC,EAAYH,CAAe,EAOvD,SAASI,EAAa,CAAE,QAAAC,EAAS,UAAAC,GAAiD,SAChF,IAAIjB,EAAAiB,EAAU,WAAV,MAAAjB,EAAoB,QAASgB,GAAA,MAAAA,EAAS,aAAa,CAC/C,MAAAE,EAAcL,EAAgB,MAAMG,EAAQ,aAE5CG,GAAkBC,EAAAH,EAAU,WAAV,YAAAG,EAAoB,MAAM,MAAM,KAElDC,EAAgCJ,EAAU,uBAAuB,YAAY,IAAKK,IAAe,CAAE,aAAcA,EAAK,SAAS,KAAA,EAAQ,EAEzI,OAAAH,EAAgB,OAAS,EAEvBE,EAA8B,OAAS,EAClChC,EAAmB6B,EAAaC,EAAiBE,CAA6B,EAIhFH,EAAYC,EAAgB,KAAO,MAGrC,uBACT,CAGF"}