tods-competition-factory 1.9.0 → 1.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"utilities.mjs","sources":["../../src/utilities/sorting.ts","../../src/utilities/ensureInt.ts","../../src/utilities/math.ts","../../src/utilities/arrays.ts","../../src/constants/resultConstants.ts","../../src/constants/errorConditionConstants.ts","../../src/global/state/syncGlobalState.ts","../../src/global/state/globalState.ts","../../src/utilities/dateTime.ts","../../src/utilities/makeDeepCopy.ts","../../src/utilities/getAccessorValue.ts","../../src/utilities/objects.ts","../../src/utilities/attributeFilter.ts","../../src/utilities/timeCode.ts","../../src/utilities/json.ts","../../src/utilities/UUID.ts"],"sourcesContent":["export function numericSort(a, b) {\n return a - b;\n}\n","export function ensureInt(val: string | number) {\n if (typeof val === 'number') return parseInt(val.toString());\n return parseInt(val);\n}\n","import { numericSort } from './sorting';\nimport { ensureInt } from './ensureInt';\n\nexport function isPowerOf2(n?) {\n if (isNaN(n)) return false;\n return n && (n & (n - 1)) === 0;\n}\n\nexport function median(arr: number[]): number | undefined {\n if (!arr.length) return undefined;\n const s = [...arr].sort(numericSort);\n const mid = Math.floor(s.length / 2);\n return s.length % 2 ? s[mid] : (s[mid - 1] + s[mid]) / 2;\n}\n\nexport function deriveExponent(n) {\n if (!isPowerOf2(n)) return false;\n let m = n;\n let i = 1;\n while (m !== 2) {\n i += 1;\n m = m / 2;\n }\n return i;\n}\n\nexport function coerceEven(n) {\n return isNaN(n) ? 0 : (n % 2 && n + 1) || n;\n}\n\nexport function nearestPowerOf2(val) {\n return Math.pow(2, Math.round(Math.log(val) / Math.log(2)));\n}\n\nexport function isNumeric(value) {\n return !isNaN(parseFloat(value));\n}\n\nexport function isOdd(num) {\n const numInt = ensureInt(num);\n if (isNaN(numInt)) return undefined;\n if (numInt === 0) return false;\n return (numInt & -numInt) === 1;\n}\n\nexport function nextPowerOf2(n?) {\n if (isNaN(n)) return false;\n while (!isPowerOf2(n)) {\n n++;\n }\n return n;\n}\n\nexport function randomInt(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n\n// does accept e.e. '1.0'\nexport function isConvertableInteger(n) {\n return Number.isSafeInteger(typeof n === 'string' ? +n : n);\n}\n\n// produces an approximated normal distribution between 0 and max\nexport function weightedRandom(max = 1, weight = 3, round = true) {\n let num = 0;\n for (let i = 0; i < weight; i++) {\n num += Math.random() * (max / weight);\n }\n return round && max > 1 ? Math.round(num) : num;\n}\n\n// round to nearest step, e.g. 0.25\nfunction stepRound(value, step) {\n step || (step = 1.0);\n const inv = 1.0 / step;\n return Math.round(value * inv) / inv;\n}\n\nexport function skewedDistribution(\n min: number,\n max: number,\n skew: number,\n step?,\n significantDecimals = 2\n) {\n const u = 1 - Math.random();\n const v = 1 - Math.random();\n let num = Math.sqrt(-2.0 * Math.log(u)) * Math.cos(2.0 * Math.PI * v);\n\n num = num / 10.0 + 0.5;\n\n if (num > 1 || num < 0) {\n num = skewedDistribution(min, max, skew);\n } else {\n num = Math.pow(num, skew);\n num *= max - min;\n num += min;\n }\n\n if (step) num = stepRound(num, step);\n\n return parseFloat(num.toFixed(significantDecimals));\n}\n","import { isConvertableInteger } from './math';\n\n// returns only unique values within an array\nexport function unique(arr) {\n return arr.filter((item, i, s) => s.lastIndexOf(item) === i);\n}\n\nexport function noNulls(arr) {\n return arr?.map((item) => (item === null ? undefined : item));\n}\n\nexport function shuffleArray(arr) {\n return arr\n .map((a) => [Math.random(), a])\n .sort((a, b) => a[0] - b[0])\n .map((a) => a[1]);\n}\n\nexport function numericSortValue(v) {\n return isConvertableInteger(v) ? v : Infinity;\n}\n\n// return an object whose attributes are values and whose values are counts for values\n// e.g. values=[1,2,2,3,4,4,5] produces { 1: 1, 2: 2, 3: 1, 4: 2, 5: 1}\nexport function instanceCount(values): { [key: number | string]: number } {\n return values.reduce((a, c) => {\n if (!a[c]) a[c] = 0;\n a[c]++;\n return a;\n }, {});\n}\n\n// return an object whose attributes are value counts and values are arrays of values for each count\n// e.g. values=[1,2,2,3,4,4,5] produces { 1: [\"1\", \"3\", \"5\"], 2: [\"2\", \"4\"] }\nexport function countValues(values): { [key: number]: string[] } {\n return groupValues(instanceCount(values));\n}\n\n// group the values of an object by attributes(keys) which produce those values\n// e.g. obj = { 1: 1, 2: 2, 3: 1, 4: 2, 5: 1} produces { 1: [\"1\", \"3\", \"5\"], 2: [\"2\", \"4\"] }\nexport function groupValues(obj) {\n return Object.keys(obj).reduce((p, c) => {\n const value = obj[c];\n if (p[value]) {\n p[value].push(c);\n } else {\n p[value] = [c];\n }\n return p;\n }, {});\n}\n\nfunction onlyUnique(value, index, self) {\n return self.indexOf(value) === index;\n}\nexport function uniqueValues(arr) {\n return arr.filter(onlyUnique);\n}\nexport function randomPop(array) {\n return Array.isArray(array) && array.length\n ? array.splice(Math.floor(Math.random() * array.length), 1)[0]\n : undefined;\n}\nexport function randomMember(arr) {\n const index = Math.floor(Math.random() * arr.length);\n return arr[index];\n}\n\nexport function generateRange(start, end) {\n return Array.from({ length: end - start }, (_, k) => k + start);\n}\nexport function sizedRange(size, start) {\n return Array.from(Array(size).keys()).map((i) => i + start);\n}\n\nexport function arrayIndices(val, arr) {\n return arr.reduce((a, e, i) => {\n if (e === val) a.push(i);\n return a;\n }, []);\n}\nexport function intersection(a, b) {\n if (!Array.isArray(a) || !Array.isArray(b)) return [];\n return a\n .filter((n) => b.indexOf(n) !== -1)\n .filter((e, i, c) => c.indexOf(e) === i);\n}\nexport function difference(a, b) {\n if (!Array.isArray(a) || !Array.isArray(b)) return [];\n return a.filter((x) => !b.includes(x));\n}\nexport function symmetricDifference(a, b) {\n if (!Array.isArray(a) || !Array.isArray(b)) return [];\n return a\n .filter((x) => !b.includes(x))\n .concat(b.filter((x) => !a.includes(x)));\n}\nexport function overlap(a, b) {\n if (!Array.isArray(a) || !Array.isArray(b)) return false;\n return a.some((e) => b.includes(e));\n}\nexport function occurrences(val, arr) {\n return (\n arr.reduce((r, val) => {\n r[val] = 1 + r[val] || 1;\n return r;\n }, {})[val] || 0\n );\n}\nexport function subSort(arr, i, n, sortFx) {\n return [].concat(\n ...arr.slice(0, i),\n ...arr.slice(i, i + n).sort(sortFx),\n ...arr.slice(i + n, arr.length)\n );\n}\nexport function inPlaceSubSort(arr, i, n, sortFx) {\n const newarray = [].concat(\n ...arr.slice(0, i),\n ...arr.slice(i, i + n).sort(sortFx),\n ...arr.slice(i + n, arr.length)\n );\n arr.length = 0;\n arr.push(...newarray); // use spread operator instead?\n return arr;\n}\nexport function chunkArray(arr, chunksize) {\n return arr.reduce((all, one, i) => {\n const ch = Math.floor(i / chunksize);\n all[ch] = [].concat(all[ch] || [], one);\n return all;\n }, []);\n}\n\n// will break an array of items into chunks following pattern [size1, size2, ...]\nexport function chunkSizeProfile(\n arr: number[],\n [size, ...otherSizes]: number[]\n) {\n return arr.length\n ? [\n arr.slice(0, size),\n ...chunkSizeProfile(arr.slice(size), [...otherSizes, size]),\n ]\n : [];\n}\nexport function groupConsecutiveNumbers(arr) {\n return arr.reduce((result, num) => {\n const finalGroup = result[result.length - 1];\n if (!finalGroup || finalGroup[finalGroup.length - 1] !== num - 1) {\n result.push([]);\n }\n result[result.length - 1].push(num);\n return result;\n }, []);\n}\n\nexport function allNumeric(arr) {\n return arr.reduce((numeric, item) => !isNaN(parseInt(item)) && numeric, true);\n}\nexport function noNumeric(arr) {\n return arr.reduce((numeric, item) => isNaN(parseInt(item)) && numeric, true);\n}\n\n/**\n * chunk an arbitrary array of elements by adding every Nth instance to chunksCount chunks\n *\n * e.g. given arr=[1,2,3,4,5,6,7,8,9,10,11,12]:\n *\n * chunkByNth(arr, 3)\n * [1, 4, 7, 10]\n * [2, 5, 8, 11]\n * [3, 6, 9, 12]\n * chunkByNth(arr, 4)\n * [1, 5, 9]\n * [2, 6, 10]\n * [3, 7, 11]\n * [4, 8, 12]\n *\n * When shuttle = true:\n * chunkByNth(arr, 3, true)\n * [1, 6, 7, 12]\n * [2, 5, 8, 11]\n * [3, 4, 9, 10]\n * chunkByNth(arr, 4, true)\n * [1, 8, 9]\n * [2, 7, 10]\n * [3, 6, 11]\n * [4, 5, 12]\n *\n * @param {any[]} arr - an array\n * @param {number} chunksCount - number of chunks to create\n * @param {boolean} shuttle - whether or not to \"shuttle\" as in the movment of a shuttle in a loom\n */\nexport function chunkByNth(arr: any[], chunksCount: number, shuttle?: boolean) {\n return arr.reduce((chunks, entry, index) => {\n const reverseDirection = shuttle\n ? !!(Math.floor(index / chunksCount) % 2)\n : false;\n const chunkIndex = index % chunksCount;\n const directionIndex = reverseDirection\n ? chunksCount - 1 - chunkIndex\n : chunkIndex;\n if (!chunks[directionIndex]) chunks[directionIndex] = [];\n chunks[directionIndex].push(entry);\n return chunks;\n }, []);\n}\n\n// group numbers by contiguous ranges\nexport function getRanges(array) {\n return array\n .map((e) => parseInt(e))\n .filter((e) => !isNaN(e))\n .reduce((ranges, a) => {\n if (!ranges.some((range) => range.includes(a - 1) && range.push(a)))\n ranges.push([a]);\n return ranges;\n }, []);\n}\n\nexport function getMissingSequenceNumbers(arr, start = 1) {\n if (!Array.isArray(arr) || !arr.every(isConvertableInteger)) return [];\n const min = Math.min(...arr, start);\n const max = Math.max(...arr);\n return generateRange(min, max + 1).filter((n) => !arr.includes(n));\n}\n","export const SUCCESS = { success: true };\nexport const ERROR = 'error';\n\nexport const resultConstants = {\n SUCCESS,\n ERROR,\n};\n","export type ErrorType = {\n message: string;\n info?: string;\n code: string;\n};\n\nexport const ANACHRONISM = {\n message: 'Chronological error; time violation.',\n code: 'ANACHRONISM',\n};\nexport const CANNOT_REMOVE_MAIN_STRUCTURE = {\n message: 'Cannot remove main structure',\n code: 'ERR_CANNOT_REMOVE_MAIN_STRUCTURE',\n};\nexport const INVALID_RECORDS = {\n message: 'records must be an object with tournamentId keys',\n code: 'ERR_INVALID_TOURNAMENTS',\n};\nexport const MISSING_TOURNAMENT_RECORDS = {\n message: 'Missing tournamentRecords',\n code: 'ERR_MISSING_TOURNAMENTS',\n};\nexport const MISSING_TOURNAMENT_RECORD = {\n message: 'Missing tournamentRecord',\n code: 'ERR_MISSING_TOURNAMENT',\n};\nexport const INVALID_TOURNAMENT_RECORD = {\n message: 'Invalid tournamentRecord',\n code: 'ERR_INVALID_TOURNAMENT',\n};\nexport const MISSING_TOURNAMENT_ID = {\n message: 'Missing tournamentId',\n code: 'ERR_MISSING_TOURNAMENT_ID',\n};\n\nexport const INVALID_DRAW_DEFINITION = {\n message: 'Invalid drawDefinition',\n code: 'ERR_INVALID_DRAWDEF',\n};\nexport const MISSING_DRAW_DEFINITION = {\n message: 'Missing drawDefinition',\n code: 'ERR_MISSING_DRAWDEF',\n};\nexport const EXISTING_DRAW_DEFINITIONS = {\n message: 'Existing drawDefinition(s)',\n code: 'ERR_EXISTING_DRAWDEFS',\n};\nexport const DRAW_DEFINITION_NOT_FOUND = {\n message: 'drawDefinition not found',\n code: 'ERR_NOT_FOUND_DRAWDEF',\n};\nexport const INVALID_STRUCTURE = {\n message: 'Invalid structure',\n code: 'ERR_INVALID_STRUCTURE',\n};\nexport const INCOMPLETE_SOURCE_STRUCTURE = {\n message: 'Incomplete source structure',\n code: 'ERR_INCOMPLETE_STRUCTURE',\n};\n\nexport const INVALID_DRAW_POSITION_FOR_SEEDING = {\n message: 'Invalid drawPosition for seedAssignment',\n code: 'ERR_INVALID_SEEDING_POSITION',\n};\nexport const DRAW_POSITION_ASSIGNED = {\n message: 'drawPosition already assigned',\n code: 'ERR_EXISTING_POSITION_ASSIGNMENT',\n};\nexport const SCHEDULE_NOT_CLEARED = {\n message: 'Schedule not cleared',\n code: 'ERR_UNCHANGED_SCHEDULE_NOT_CLEARED',\n};\nexport const DRAW_POSITION_NOT_CLEARED = {\n message: 'drawPosition not cleared',\n code: 'ERR_FAILURE_POSITION_NOT_CLEARED',\n};\nexport const DRAW_POSITION_NOT_FOUND = {\n message: 'drawPosition not found',\n code: 'ERR_NOT_FOUND_DRAW_POSITION',\n};\nexport const UNRECOGNIZED_DRAW_TYPE = {\n message: 'Unrecognized drawType',\n code: 'ERR_UNRECOGNIZED_DRAW_TYPE',\n};\nexport const MISSING_DRAW_POSITIONS = {\n message: 'Missing drawPositions',\n code: 'ERR_MISSING_DRAW_POSITIONS',\n};\nexport const DRAW_POSITION_ACTIVE = {\n message: 'drawPosition is active',\n code: 'ERR_ACTIVE_DRAW_POSITION',\n};\nexport const INVALID_DRAW_POSITION = {\n message: 'Invlid drawPosition',\n code: 'ERR_INVALID_DRAW_POSITION',\n};\nexport const MISSING_DRAW_POSITION = {\n message: 'Missing drawPosition',\n code: 'ERR_MISSING_DRAW_POSITION',\n};\nexport const INVALID_DRAW_TYPE = {\n message: 'Invalid drawType',\n code: 'ERR_INVALID_DRAW_TYPE',\n};\nexport const INVALID_DRAW_SIZE = {\n message: 'Invalid drawSize',\n code: 'ERR_INVALID_DRAW_SIZE',\n};\nexport const DRAW_SIZE_MISMATCH = {\n message: 'Cannot set drawSize to be less than existing entries',\n code: 'ERR_INVALID_DRAW_SIZE_MISMATCH',\n};\nexport const MISSING_DRAW_SIZE = {\n message: 'Missing drawSize',\n code: 'ERR_MISSING_DRAW_SIZE',\n};\nexport const MISSING_DRAW_ID = {\n message: 'Missing drawId',\n code: 'ERR_MISSING_DRAW_ID',\n};\nexport const DRAW_ID_EXISTS = {\n message: 'drawId exists',\n code: 'ERR_EXISTING_DRAW_ID',\n};\nexport const INVALID_PARTICIPANT_SEEDING = {\n message: 'participantId cannot be assigned to multiple seedNumbers',\n code: 'INVALID_PARTICIPANT_SEEDING',\n};\nexport const SEEDSCOUNT_GREATER_THAN_DRAW_SIZE = {\n message: 'seedsCount greater than drawSize',\n code: 'ERR_INVALID_SEED_COUNT',\n};\nexport const MISSING_SEEDCOUNT_THRESHOLDS = {\n message: 'Missing seedCountThresholds',\n code: 'ERR_MISSING_SEED_COUNT_THRESHOLD',\n};\nexport const INVALID_ACTION = {\n message: 'Invalid action',\n code: 'ERR_INVALID_ACTION',\n};\nexport const INVALID_ASSIGNMENT = {\n message: 'Invalid assignment',\n code: 'ERR_INVALID_ASSIGNMENT',\n};\nexport const MISSING_SEED_ASSIGNMENTS = {\n message: 'Missing seedAssignments',\n code: 'ERR_MISSING_SEED_ASSIGNMENTS',\n};\nexport const INVALID_SEED_NUMBER = {\n message: 'Invalid seedNumber',\n code: 'ERR_INVALID_SEED_NUMBER',\n};\nexport const INVALID_SEED_POSITION = {\n message: 'Invalid seedPosition',\n code: 'ERR_INVALID_SEED_POSITION',\n};\n\nexport const MISSING_TARGET_LINK = {\n message: 'Missing targetLink',\n code: 'ERR_MISSING_LINK_TARGET',\n};\n\nexport const EXISTING_ROUND = {\n message: 'Existing round',\n code: 'ERR_EXISTING_ROUND',\n};\nexport const MISSING_ROUND_NUMBER = {\n message: 'Missing roundNumber',\n code: 'ERR_MISSING_ROUND_NUMBER',\n};\nexport const MISSING_STRUCTURE_ID = {\n message: 'Missing structureId',\n code: 'ERR_MISSING_STRUCTURE_ID',\n};\nexport const STRUCTURE_NOT_FOUND = {\n message: 'structure not found',\n code: 'ERR_NOT_FOUND_STRUCTURE',\n};\nexport const MISSING_STRUCTURES = {\n message: 'Missing structures',\n code: 'ERR_MISSING_STRUCTURES',\n};\nexport const MISSING_STRUCTURE = {\n message: 'Missing structure',\n code: 'ERR_MISSING_STRUCTURE',\n};\nexport const UNLINKED_STRUCTURES = {\n message: 'drawDefinition contains unlinked structures',\n code: 'ERR_MISSING_STRUCTURE_LINKS',\n};\n\nexport const INVALID_EVENT_TYPE = {\n message: 'Invalid eventType',\n code: 'ERR_INVALID_EVENT_TYPE',\n};\nexport const UNRECOGNIZED_EVENT_TYPE = {\n message: 'Unrecognized eventType',\n code: 'ERR_UNRECOGNIZED_EVENT_TYPE',\n};\nexport const MISSING_EVENT = {\n message: 'Missing event / eventId',\n code: 'ERR_MISSING_EVENT_ID',\n};\nexport const EVENT_NOT_FOUND = {\n message: 'Event not found',\n code: 'ERR_NOT_FOUND_EVENT',\n};\nexport const EVENT_EXISTS = {\n message: 'Event exists',\n code: 'ERR_EXISTING_EVENT',\n};\n\nexport const MISSING_ENTRIES = {\n message: 'Missing entries',\n code: 'ERR_MISSING_ENTRIES',\n};\nexport const INVALID_ENTRIES = {\n message: 'Invalid entries',\n code: 'ERR_INVALID_ENTRIES',\n};\nexport const MISSING_ASSIGNMENTS = {\n message: 'Missing assignments',\n code: 'ERR_MISSING_ASSIGNMENTS',\n};\n\nexport const MISSING_STAGE = {\n message: 'Missing stage',\n code: 'ERR_MISSING_STAGE',\n};\nexport const INVALID_STAGE = {\n message: 'Invalid stage',\n code: 'ERR_INVALID_STAGE',\n};\nexport const STAGE_SEQUENCE_LIMIT = {\n message: 'stageSequence limit',\n code: 'ERR_LIMIT_STAGE_SEQUENCE',\n};\nexport const MISSING_POSITION_ASSIGNMENTS = {\n message: 'Missing positionAssignments',\n code: 'ERR_MISSING_POSITION_ASSIGNMENTS',\n};\nexport const INVALID_MATCHUP_STATUS_BYE = {\n message: 'Cannot Assign BYE status if no assignment: { bye: true }',\n code: 'ERR_UNCHANGED_CANNOT_ASSIGN_BYE',\n};\nexport const UNRECOGNIZED_MATCHUP_STATUS = {\n message: 'Unrecognized matchUpStatus',\n code: 'ERR_UNRECOGNIZED_MATCHUP_STATUS',\n};\nexport const UNRECOGNIZED_MATCHUP_FORMAT = {\n message: 'Unrecognized matchUpFormat',\n code: 'ERR_UNRECOGNIZED_MATCHUP_FORMAT',\n};\nexport const INCOMPATIBLE_MATCHUP_STATUS = {\n message: 'Incompatible matchUpStatus',\n code: 'ERR_INCOMPATIBLE_MATCHUP_STATUS',\n};\nexport const INVALID_MATCHUP_STATUS = {\n message: 'Invalid matchUpStatus',\n code: 'ERR_INVALID_MATCHUP_STATUS',\n};\nexport const INVALID_TIE_FORMAT = {\n message: 'Invalid tieFormat',\n code: 'ERR_INVALID_TIE_FORMAT',\n};\nexport const INVALID_MATCHUP_FORMAT = {\n message: 'Invalid matchUpFormat',\n code: 'ERR_INVALID_MATCHUP_FORMAT',\n};\nexport const MISSING_MATCHUP_FORMAT = {\n message: 'Missing matchUpFormat',\n code: 'ERR_MISSING_MATCHUP_FORMAT',\n};\nexport const MISSING_COLLECTION_DEFINITION = {\n message: 'Missing collectionDefinition',\n code: 'ERR_MISSING_COLLECTION_DEFINITION',\n};\nexport const MISSING_TIE_FORMAT = {\n message: 'Missing tieFormat',\n code: 'ERR_MISSING_TIE_FORMAT',\n};\nexport const MISSING_MATCHUP_ID = {\n message: 'Missing matchUpId',\n code: 'ERR_MISSING_MATCHUP_ID',\n};\nexport const MISSING_MATCHUP_IDS = {\n message: 'Missing matchUpIds',\n code: 'ERR_MISSING_MATCHUP_IDS',\n};\nexport const MATCHUP_NOT_FOUND = {\n message: 'matchUp not found',\n code: 'ERR_NOT_FOUND_MATCHUP',\n};\nexport const MISSING_MATCHUPS = {\n message: 'Missing matchUps',\n code: 'ERR_MISSING_MATCHUPS',\n};\nexport const MISSING_MATCHUP = {\n message: 'Missing matchUp',\n code: 'ERR_MISSING_MATCHUP',\n};\nexport const INVALID_MATCHUP = {\n message: 'Invalid matchUp',\n code: 'ERR_INVALID_MATCHUP',\n};\n\nexport const MISSING_POLICY_TYPE = {\n message: 'Missing policyType',\n code: 'ERR_MISSING_POLICY_TYPE',\n};\nexport const MISSING_POLICY_DEFINITION = {\n message: 'Missing policyDefinitions',\n code: 'ERR_MISSING_POLICY_DEFINITIONS',\n};\nexport const MISSING_SEEDING_POLICY = {\n message: 'Missing seeding policy',\n code: 'ERR_MISSING_POLICY_SEEDING',\n};\nexport const MISSING_AVOIDANCE_POLICY = {\n message: 'Missing avoidance policy',\n code: 'ERR_MISSING_POLICY_AVOIDANCE',\n};\nexport const MISSING_POLICY_ATTRIBUTES = {\n message: 'Missing policy attributes',\n code: 'ERR_MISSING_POLICY_ATTRIBUTES',\n};\nexport const INVALID_POLICY_DEFINITION = {\n message: 'Invalid policyDefinitions',\n code: 'ERR_INVALID_POLICY_DEFINITIONS',\n};\nexport const EXISTING_POLICY_TYPE = {\n message: 'existing policyType',\n code: 'ERR_EXISTING_POLICY_TYPE',\n};\nexport const POLICY_NOT_ATTACHED = {\n message: 'Policy not attached',\n code: 'ERR_FAILURE_POLICY_NOT_ATTACHED',\n};\nexport const POLICY_NOT_FOUND = {\n message: 'Policy not found',\n code: 'ERR_NOT_FOUND_POLICY',\n};\nexport const MISSING_SCORING_POLICY = {\n message: 'Missing scoring policy / matchUpFormats',\n code: 'ERR_MISSING_POLICY_SCORING_MATCHUP_FORMATS',\n};\n\nexport const INVALID_SIDE_NUMBER = {\n message: 'Invalid sideNumber',\n code: 'ERR_INVALID_SIDE_NUMBER',\n};\nexport const INVALID_SET_NUMBER = {\n message: 'Invalid setNumber',\n code: 'ERR_INVALID_SET_NUMBER',\n};\nexport const MISSING_SET_OBJECT = {\n message: 'Missing setObject',\n code: 'ERR_MISSING_SET_ATTRIBUTE',\n};\nexport const MISSING_SET_NUMBER = {\n message: 'Missing setNumber',\n code: 'ERR_MISSING_SET_NUMBER',\n};\nexport const MISSING_SIDE_NUMBER = {\n message: 'Missing sideNumber',\n code: 'ERR_MISSING_SIDE_NUMBER',\n};\nexport const MISSING_COURT_ID = {\n message: 'Missing courtId',\n code: 'ERR_MISSING_COURT_ID',\n};\nexport const MISSING_VALUE = {\n message: 'Missing value',\n code: 'ERR_MISSING_VALUE',\n};\nexport const MISSING_DATE = {\n message: 'Missing date',\n code: 'ERR_MISSING_DATE',\n};\nexport const NO_VALID_DATES = {\n message: 'No valid dates',\n code: 'ERR_NO_VALID_DATES',\n};\n\nexport const INVALID_BOOKINGS = {\n message: 'Invalid bookings',\n code: 'ERR_INVALID_BOOKINGS',\n};\nexport const INVALID_DATE_AVAILABILITY = {\n message: 'Invalid dateAvailability',\n code: 'ERR_INVALID_DATE_AVAILABILITY',\n};\nexport const MISSING_DATE_AVAILABILITY = {\n message: 'Missing dateAvailability',\n code: 'ERR_MISSING_DATE_AVAILABILITY',\n};\n\n// Javascript constant for Date() function\nexport const INVALID_DATE = {\n message: 'Invalid Date',\n code: 'ERR_INVALID_DATE',\n};\nexport const INVALID_TIME = {\n message: 'Invalid time',\n code: 'ERR_INVALID_TIME',\n};\nexport const INVALID_TOURNAMENT_DATES = {\n message: 'Invalid tournament dates',\n code: 'ERR_INVALID_DATES_TOURNAMENT',\n};\nexport const INVALID_TIME_ZONE = {\n message: 'Invalid Time Zone',\n code: 'ERR_INVALID_TIME_ZONE',\n};\n\nexport const INVALID_GAME_SCORES = {\n message: 'Invalid game scores',\n code: 'ERR_INVALID_SCORES_GAME',\n};\nexport const INVALID_SCORE = {\n message: 'Invalid score',\n code: 'ERR_INVALID_SCORE',\n};\n\nexport const INVALID_WINNING_SIDE = {\n message: 'Invalid winningSide',\n code: 'ERR_INVALID_WINNING_SIDE',\n};\n\nexport const NO_PARTICIPANTS = {\n message: 'Tournament has no participants',\n code: 'ERR_NO_TOURNAMENT_PARTICIPANTS',\n};\nexport const NO_PARTICIPANTS_GENERATED = {\n message: 'No participants generated',\n code: 'ERR_NO_PARTICIPANTS_GENERATED',\n};\nexport const CANNOT_MODIFY_TIEFORMAT = {\n message: 'Cannot modify tieFormat',\n code: 'ERR_UNCHANGED_CANNOT_MODIFY_TIEFORMAT',\n};\nexport const CANNOT_MODIFY_PARTICIPANT_TYPE = {\n message: 'Cannot modify participantType',\n code: 'ERR_UNCHANGED_CANNOT_MODIFY_PARTICIPANT_TYPE',\n};\nexport const CANNOT_REMOVE_PARTICIPANTS = {\n message: 'Cannot remove participants',\n code: 'ERR_UNCHANGED_CANNOT_REMOVE_PARTICIPANTS',\n};\nexport const CANNOT_CHANGE_WINNING_SIDE = {\n message: 'Cannot change winningSide',\n code: 'ERR_UNCHANGED_CANNOT_CHANGE_WINNING_SIDE',\n};\nexport const INVALID_PARTICIPANT = {\n message: 'Invalid participant',\n code: 'ERR_INVALID_PARTICIPANT',\n};\nexport const INVALID_PARTICIPANT_ID = {\n message: 'Invalid participantId',\n code: 'ERR_INVALID_PARTICIPANT_ID',\n};\nexport const INVALID_PARTICIPANT_IDS = {\n message: 'Invalid participantIds',\n code: 'ERR_INVALID_PARTICIPANT_IDS',\n};\nexport const INVALID_PARTICIPANT_ROLE = {\n message: 'Invalid participantRole',\n code: 'ERR_INVALID_PARTICIPANT_ROLE',\n};\nexport const INVALID_PARTICIPANT_TYPE = {\n message: 'Invalid participantType',\n code: 'ERR_INVALID_PARTICIPANT_TYPE',\n};\nexport const MISSING_PARTICIPANT_ROLE = {\n message: 'Missing participantRole',\n code: 'ERR_MISSING_PARTICIPANT_ROLE',\n};\nexport const MISSING_PARTICIPANT = {\n message: 'Missing participant',\n code: 'ERR_MISSING_PARTICIPANT',\n};\nexport const MISSING_PARTICIPANTS = {\n message: 'Missing participants',\n code: 'ERR_MISSING_PARTICIPANTS',\n};\nexport const MISSING_PARTICIPANT_ID = {\n message: 'Missing participantId',\n code: 'ERR_MISSING_PARTICIPANT_ID',\n};\nexport const PARTICIPANT_NOT_FOUND = {\n message: 'Participant Not Found',\n code: 'ERR_NOT_FOUND_PARTICIPANT',\n};\nexport const PARTICIPANT_ID_EXISTS = {\n message: 'participantId exists',\n code: 'ERR_EXISTING_PARTICIPANT_ID',\n};\nexport const PARTICIPANT_PAIR_EXISTS = {\n message: 'participant pair exists',\n code: 'ERR_EXISTING_PARTICIPANT_PAIR',\n};\nexport const NO_PARTICIPANT_REMOVED = {\n message: 'No participant removed',\n code: 'ERR_UNCHANGED_NO_PARTICIPANT_REMOVED',\n};\nexport const MISSING_PARTICIPANT_IDS = {\n message: 'Missing participantIds',\n code: 'ERR_MISSING_PARTICIPANT_IDS',\n};\nexport const MISSING_PARTICIPANT_COUNT = {\n message: 'Missing participantsCount',\n code: 'ERR_MISSING_PARTICIPANT_COUNT',\n};\nexport const PARTICIPANT_NOT_CHECKED_IN = {\n message: 'Participant not checked in',\n code: 'ERR_UNCHANGED_PARTICIPANT_NOT_CHECKED_IN',\n};\nexport const PARTICIPANT_ALREADY_CHECKED_IN = {\n message: 'Participant already checked in',\n code: 'ERR_UNCHANGED_PARTICIPANT_CHECKED_IN',\n};\n\nexport const MISSING_PERSON_DETAILS = {\n message: 'Missing person details',\n code: 'ERR_MISSING_PERSON_DETAILS',\n};\n\nexport const EXISTING_PARTICIPANT_DRAW_POSITION_ASSIGNMENT = {\n message: 'Existing participant drawPosition assignment',\n code: 'ERR_EXISTING_PARTICIPANT_DRAW_POSITION_ASSIGNMENT',\n};\nexport const EXISTING_PARTICIPANT = {\n message: 'Existing participant',\n code: 'ERR_EXISTING_PARTICIPANT',\n};\nexport const PARTICIPANT_COUNT_EXCEEDS_DRAW_SIZE = {\n message: 'participantsCount exceeds drawSize',\n code: 'ERR_INVALID_PARTICIPANT_COUNT',\n};\n\nexport const INVALID_ENTRY_STATUS = {\n message: 'Invalid entry status',\n code: 'ERR_INVALID_ENTRY_STATUS',\n};\nexport const PARTICIPANT_ENTRY_NOT_FOUND = {\n message: 'Participant Entry Not Found',\n code: 'ERR_NOT_FOUND_PARTICIPANT_ENTRY',\n};\nexport const PARTICIPANT_NOT_ENTERED_IN_STAGE = {\n message: 'Participant not entered in stage',\n code: 'ERR_UNCHANGED_PARTICIPANT_NOT_ENTERED',\n};\nexport const PARTICIPANT_NOT_FOUND_IN_STAGE = {\n message: 'Participant not found in stageSequence',\n code: 'ERR_NOT_FOUND_PARTICIPANT_IN_STAGE',\n};\nexport const ENTRY_STATUS_NOT_ALLOWED_IN_STAGE = {\n message: 'entryStatus not allowed in stage',\n code: 'ERR_INVALID_ENTRY_STATUS_IN_STAGE',\n};\nexport const ENTRY_STATUS_NOT_ALLOWED_FOR_EVENT = {\n message: 'entryStatus not allowed for event',\n code: 'ERR_INVALID_ENTRY_STATUS_IN_EVENT',\n};\nexport const NO_STAGE_SPACE_AVAILABLE_FOR_ENTRY_STATUS = {\n message: 'No stage space available for entryStatus',\n code: 'ERR_UNCHANGED_NO_AVAILABLE_STAGE_SPACE',\n};\n\nexport const NO_DRAW_POSITIONS_AVAILABLE_FOR_QUALIFIERS = {\n message: 'Insufficient drawPositions to accommodate qualifiers',\n code: 'ERR_UNCHANGED_NO_DRAW_POSITIONS_FOR_QUALIFIERS',\n};\nexport const INSUFFICIENT_DRAW_POSITIONS = {\n message: 'Insufficient drawPositions to accommodate entries',\n code: 'ERR_INSUFFICIENT_DRAW_POSITIONS',\n};\n\nexport const MISSING_PENALTY_TYPE = {\n message: 'Missing penaltyType',\n code: 'ERR_MISSING_PENALTY_TYPE',\n};\nexport const MISSING_PENALTY_ID = {\n message: 'Missing penaltyId',\n code: 'ERR_MISSING_PENALTY_ID',\n};\nexport const PENALTY_NOT_FOUND = {\n message: 'Penalty not found',\n code: 'ERR_NOT_FOUND_PENALTY',\n};\n\nexport const MISSING_COURTS_INFO = {\n message: 'Missing courtsCount/courtNames',\n code: 'ERR_MISSING_COURTS_INFO',\n};\nexport const COURT_NOT_FOUND = {\n message: 'Court not found',\n code: 'ERR_NOT_FOUND_COURT',\n};\nexport const COURT_EXISTS = {\n message: 'Court exists',\n code: 'ERR_EXISTING_COURT',\n};\n\nexport const VENUE_EXISTS = {\n message: 'Venue exists',\n code: 'ERR_EXISTING_VENUE',\n};\nexport const VENUE_NOT_FOUND = {\n message: 'Venue not found',\n code: 'ERR_NOT_FOUND_VENUE',\n};\nexport const MISSING_VENUE_ID = {\n message: 'Missing venueId',\n code: 'ERR_MISSING_VENUE_ID',\n};\n\nexport const INVALID_END_TIME = {\n message: 'Invalid endTime',\n code: 'ERR_INVALID_END_TIME',\n};\nexport const EXISTING_END_TIME = {\n message: 'Existing endTime',\n code: 'ERR_EXISTING_END_TIME',\n};\nexport const INVALID_STOP_TIME = {\n message: 'Invalid stopTime',\n code: 'ERR_INVALID_STOP_TIME',\n};\nexport const INVALID_START_TIME = {\n message: 'Invalid startTime',\n code: 'ERR_INVALID_START_TIME',\n};\nexport const INVALID_RESUME_TIME = {\n message: 'Invalid resumeTime',\n code: 'ERR_INVALID_RESUME_TIME',\n};\nexport const INVALID_TIME_ITEM = {\n message: 'Invalid timeItem',\n code: 'ERR_INVALID_TIME_ITEMS',\n};\nexport const MISSING_ASYNC_STATE_PROVIDER = {\n message: 'Missing async state provider',\n code: 'ERR_MISSING_ASYNC_STATE_PROVIDER',\n};\nexport const MISSING_TIME_ITEM = {\n message: 'Missing timeItem',\n code: 'ERR_MISSING_TIME_ITEM',\n};\nexport const MISSING_TIME_ITEMS = {\n message: 'Missing timeItems',\n code: 'ERR_MISSING_TIME_ITEMS',\n};\nexport const MISSING_CONTEXT = {\n message: 'Missing context',\n code: 'ERR_MISSING_CONTEXT',\n};\nexport const MISSING_SCHEDULE = {\n message: 'Missing schedule',\n code: 'ERR_MISSING_SCHEDULE',\n};\n\nexport const INVALID_SCALE_ITEM = {\n message: 'Invalid scaleItem',\n code: 'ERR_INVALID_SCALE_ITEM',\n};\n\nexport const MODIFICATIONS_FAILED = {\n message: 'Modifications failed',\n code: 'ERR_FAILURE_MODIFICATIONS',\n};\nexport const NO_MODIFICATIONS_APPLIED = {\n message: 'No modifications applied',\n code: 'ERR_UNCHANGED_NO_MODIFICATIONS_APPLIED',\n};\n\nexport const UNABLE_TO_ASSIGN_COURT = {\n message: 'Unable to assign court',\n code: 'ERR_UNCHANGED_COURT_NOT_ASSIGNED',\n};\n\nexport const NO_CANDIDATES = {\n message: 'No Candidates',\n code: 'ERR_UNCHANGED_NO_CANDIDATES',\n};\n\nexport const INVALID_CONFIGURATION = {\n message: 'Invalid configuration',\n code: 'ERR_INVALID_CONFIG',\n};\nexport const INVALID_COLLECTION_DEFINITION = {\n message: 'Invalid collectionDefinition',\n code: 'ERR_INVALID_COLLECTION_DEFINITION',\n};\nexport const INVALID_OBJECT = {\n message: 'Invalid object',\n code: 'ERR_INVALID_OBJECT',\n};\nexport const INVALID_GENDER = {\n message: 'Invalid gender',\n code: 'ERR_INVALID_GENDER',\n};\nexport const INVALID_CATEGORY = {\n message: 'Invalid category',\n code: 'ERR_INVALID_CATEGORY',\n};\nexport const INVALID_VALUES = {\n message: 'Invalid values',\n code: 'ERR_INVALID_VALUES',\n};\nexport const DUPLICATE_VALUE = {\n message: 'Duplicate value',\n code: 'ERR_DUPLICATE_VALUE',\n};\n\nexport const TEAM_NOT_FOUND = {\n message: 'Team not found',\n code: 'ERR_NOT_FOUND_TEAM',\n};\nexport const NO_VALID_ACTIONS = {\n message: 'No valid actions',\n code: 'ERR_NO_VALID_ACTIONS',\n};\nexport const NO_VALID_ATTRIBUTES = {\n message: 'No valid attributes',\n code: 'ERR_NO_VALID_ATTRIBUTES',\n};\n\nexport const VALUE_UNCHANGED = {\n message: 'Value unchanged',\n code: 'ABORT_UNCHANGED',\n};\nexport const NOT_FOUND = { message: 'Not found', code: 'ERR_NOT_FOUND' };\nexport const NOT_IMPLEMENTED = {\n message: 'Not implemented',\n code: 'ERR_NOT_IMPLEMENTED',\n};\n\nexport const EXISTING_FLIGHT = {\n message: 'Existing flight',\n code: 'ERR_EXISTING_FLIGHT',\n};\nexport const EXISTING_PROFILE = {\n message: 'Existing flight profile',\n code: 'ERR_EXISTING_FLIGHT_PROFILE',\n};\nexport const EXISTING_OUTCOME = {\n message: 'Existing outcome',\n code: 'ERR_EXISTING_OUTCOME',\n};\n\nexport const EXISTING_MATCHUP_ID = {\n message: 'Existing matchUpId',\n code: 'ERR_EXISTING_MATCHUP_ID',\n};\n\nexport const EXISTING_STAGE = {\n message: 'Existing stage',\n code: 'ERR_EXISTING_STAGE',\n};\n\nexport const EXISTING_STRUCTURE = {\n message: 'Existing structure',\n code: 'ERR_EXISTING_STRUCTURE',\n};\n\nexport const METHOD_NOT_FOUND = {\n message: 'Method not found',\n code: 'ERR_NOT_FOUND_METHOD',\n};\n\nexport const SCHEDULED_MATCHUPS = {\n message: 'Scheduled matchUps',\n code: 'ERR_SCHEDULED_MATCHUPS',\n};\n\nexport const SCORES_PRESENT = {\n message: 'Scores present',\n code: 'ERR_SCORES_PRESENT',\n};\n\nexport const errorConditionConstants = {\n ANACHRONISM,\n CANNOT_CHANGE_WINNING_SIDE,\n CANNOT_MODIFY_TIEFORMAT,\n CANNOT_MODIFY_PARTICIPANT_TYPE,\n CANNOT_REMOVE_MAIN_STRUCTURE,\n CANNOT_REMOVE_PARTICIPANTS,\n COURT_EXISTS,\n COURT_NOT_FOUND,\n DRAW_DEFINITION_NOT_FOUND,\n DRAW_ID_EXISTS,\n DRAW_POSITION_ACTIVE,\n DRAW_POSITION_ASSIGNED,\n DRAW_POSITION_NOT_CLEARED,\n DRAW_POSITION_NOT_FOUND,\n DRAW_SIZE_MISMATCH,\n DUPLICATE_VALUE,\n ENTRY_STATUS_NOT_ALLOWED_FOR_EVENT,\n ENTRY_STATUS_NOT_ALLOWED_IN_STAGE,\n EVENT_EXISTS,\n EVENT_NOT_FOUND,\n EXISTING_DRAW_DEFINITIONS,\n EXISTING_END_TIME,\n EXISTING_FLIGHT,\n EXISTING_MATCHUP_ID,\n EXISTING_OUTCOME,\n EXISTING_PARTICIPANT_DRAW_POSITION_ASSIGNMENT,\n EXISTING_PARTICIPANT,\n EXISTING_POLICY_TYPE,\n EXISTING_PROFILE,\n EXISTING_ROUND,\n EXISTING_STAGE,\n EXISTING_STRUCTURE,\n INCOMPATIBLE_MATCHUP_STATUS,\n INCOMPLETE_SOURCE_STRUCTURE,\n INSUFFICIENT_DRAW_POSITIONS,\n INVALID_ACTION,\n INVALID_ASSIGNMENT,\n INVALID_BOOKINGS,\n INVALID_CATEGORY,\n INVALID_COLLECTION_DEFINITION,\n INVALID_CONFIGURATION,\n INVALID_DATE_AVAILABILITY,\n INVALID_DATE,\n INVALID_DRAW_DEFINITION,\n INVALID_DRAW_POSITION_FOR_SEEDING,\n INVALID_DRAW_POSITION,\n INVALID_DRAW_SIZE,\n INVALID_END_TIME,\n INVALID_ENTRIES,\n INVALID_EVENT_TYPE,\n INVALID_GAME_SCORES,\n INVALID_GENDER,\n INVALID_MATCHUP_FORMAT,\n INVALID_MATCHUP_STATUS,\n INVALID_MATCHUP_STATUS_BYE,\n INVALID_MATCHUP,\n INVALID_OBJECT,\n INVALID_PARTICIPANT_ID,\n INVALID_PARTICIPANT_IDS,\n INVALID_PARTICIPANT_ROLE,\n INVALID_PARTICIPANT_SEEDING,\n INVALID_PARTICIPANT_TYPE,\n INVALID_PARTICIPANT,\n INVALID_POLICY_DEFINITION,\n INVALID_RECORDS,\n INVALID_SCALE_ITEM,\n INVALID_SEED_NUMBER,\n INVALID_SEED_POSITION,\n INVALID_SET_NUMBER,\n INVALID_SIDE_NUMBER,\n INVALID_SCORE,\n INVALID_STAGE,\n INVALID_START_TIME,\n INVALID_STRUCTURE,\n INVALID_STOP_TIME,\n INVALID_TIE_FORMAT,\n INVALID_TIME,\n INVALID_TIME_ITEM,\n INVALID_TOURNAMENT_DATES,\n INVALID_TOURNAMENT_RECORD,\n INVALID_VALUES,\n INVALID_WINNING_SIDE,\n MATCHUP_NOT_FOUND,\n METHOD_NOT_FOUND,\n MISSING_ASSIGNMENTS,\n MISSING_ASYNC_STATE_PROVIDER,\n MISSING_AVOIDANCE_POLICY,\n MISSING_COLLECTION_DEFINITION,\n MISSING_COURT_ID,\n MISSING_COURTS_INFO,\n MISSING_DATE_AVAILABILITY,\n MISSING_DATE,\n MISSING_DRAW_DEFINITION,\n MISSING_DRAW_ID,\n MISSING_DRAW_POSITION,\n MISSING_DRAW_POSITIONS,\n MISSING_DRAW_SIZE,\n MISSING_ENTRIES,\n MISSING_EVENT,\n MISSING_MATCHUP_FORMAT,\n MISSING_MATCHUP_ID,\n MISSING_MATCHUP_IDS,\n MISSING_MATCHUP,\n MISSING_MATCHUPS,\n MISSING_PARTICIPANT_COUNT,\n MISSING_PARTICIPANT_ID,\n MISSING_PARTICIPANT_IDS,\n MISSING_PARTICIPANT_ROLE,\n MISSING_PARTICIPANT,\n MISSING_PARTICIPANTS,\n MISSING_PENALTY_ID,\n MISSING_PENALTY_TYPE,\n MISSING_PERSON_DETAILS,\n MISSING_POLICY_ATTRIBUTES,\n MISSING_POLICY_DEFINITION,\n MISSING_POLICY_TYPE,\n MISSING_POSITION_ASSIGNMENTS,\n MISSING_ROUND_NUMBER,\n MISSING_SCHEDULE,\n MISSING_SCORING_POLICY,\n MISSING_SEED_ASSIGNMENTS,\n MISSING_SEEDCOUNT_THRESHOLDS,\n MISSING_SEEDING_POLICY,\n MISSING_SET_NUMBER,\n MISSING_SET_OBJECT,\n MISSING_SIDE_NUMBER,\n MISSING_STAGE,\n MISSING_STRUCTURE_ID,\n MISSING_STRUCTURE,\n MISSING_STRUCTURES,\n MISSING_TARGET_LINK,\n MISSING_TIE_FORMAT,\n MISSING_TIME_ITEM,\n MISSING_TIME_ITEMS,\n MISSING_TOURNAMENT_ID,\n MISSING_TOURNAMENT_RECORD,\n MISSING_TOURNAMENT_RECORDS,\n MISSING_VALUE,\n MISSING_VENUE_ID,\n MODIFICATIONS_FAILED,\n NO_CANDIDATES,\n NO_DRAW_POSITIONS_AVAILABLE_FOR_QUALIFIERS,\n NO_MODIFICATIONS_APPLIED,\n NO_STAGE_SPACE_AVAILABLE_FOR_ENTRY_STATUS,\n NO_PARTICIPANT_REMOVED,\n NO_VALID_ACTIONS,\n NO_VALID_ATTRIBUTES,\n NO_VALID_DATES,\n NOT_FOUND,\n NOT_IMPLEMENTED,\n PARTICIPANT_ALREADY_CHECKED_IN,\n PARTICIPANT_COUNT_EXCEEDS_DRAW_SIZE,\n PARTICIPANT_ID_EXISTS,\n PARTICIPANT_NOT_CHECKED_IN,\n PARTICIPANT_NOT_FOUND,\n PARTICIPANT_PAIR_EXISTS,\n PENALTY_NOT_FOUND,\n POLICY_NOT_ATTACHED,\n POLICY_NOT_FOUND,\n SCHEDULE_NOT_CLEARED,\n SCHEDULED_MATCHUPS,\n SCORES_PRESENT,\n SEEDSCOUNT_GREATER_THAN_DRAW_SIZE,\n STAGE_SEQUENCE_LIMIT,\n STRUCTURE_NOT_FOUND,\n TEAM_NOT_FOUND,\n UNABLE_TO_ASSIGN_COURT,\n UNLINKED_STRUCTURES,\n UNRECOGNIZED_DRAW_TYPE,\n UNRECOGNIZED_MATCHUP_FORMAT,\n UNRECOGNIZED_MATCHUP_STATUS,\n VALUE_UNCHANGED,\n VENUE_EXISTS,\n};\n\nexport default errorConditionConstants;\n","import { SUCCESS } from '../../constants/resultConstants';\nimport {\n CallListenerArgs,\n DeleteNoticeArgs,\n GetNoticesArgs,\n HandleCaughtErrorArgs,\n ImplemtationGlobalStateTypes,\n Notice,\n} from './globalState';\nimport {\n INVALID_TOURNAMENT_RECORD,\n INVALID_VALUES,\n MISSING_TOURNAMENT_RECORD,\n NOT_FOUND,\n} from '../../constants/errorConditionConstants';\n\nconst syncGlobalState: ImplemtationGlobalStateTypes = {\n disableNotifications: false,\n tournamentId: undefined,\n tournamentRecords: {},\n subscriptions: {},\n modified: false,\n notices: [],\n};\n\nexport default {\n addNotice,\n callListener,\n cycleMutationStatus,\n deleteNotice,\n deleteNotices,\n disableNotifications,\n enableNotifications,\n getNotices,\n getTopics,\n getTournamentId,\n getTournamentRecord,\n getTournamentRecords,\n removeTournamentRecord,\n setSubscriptions,\n setTournamentId,\n setTournamentRecord,\n setTournamentRecords,\n handleCaughtError,\n};\n\nexport function disableNotifications() {\n syncGlobalState.disableNotifications = true;\n}\n\nexport function enableNotifications() {\n syncGlobalState.disableNotifications = false;\n}\n\nexport function getTournamentId() {\n return syncGlobalState.tournamentId;\n}\n\nexport function getTournamentRecord(tournamentId) {\n return syncGlobalState.tournamentRecords[tournamentId];\n}\n\nexport function getTournamentRecords() {\n return syncGlobalState.tournamentRecords;\n}\n\nexport function setTournamentRecord(tournamentRecord) {\n const tournamentId = tournamentRecord?.tournamentId;\n if (tournamentId) {\n syncGlobalState.tournamentRecords[tournamentId] = tournamentRecord;\n return { success: true };\n } else {\n return { error: INVALID_TOURNAMENT_RECORD };\n }\n}\n\nexport function setTournamentId(tournamentId) {\n if (syncGlobalState.tournamentRecords[tournamentId]) {\n syncGlobalState.tournamentId = tournamentId;\n return { success: true };\n } else {\n return { error: MISSING_TOURNAMENT_RECORD };\n }\n}\n\nexport function setTournamentRecords(tournamentRecords) {\n syncGlobalState.tournamentRecords = tournamentRecords;\n const tournamentIds = Object.keys(tournamentRecords);\n if (tournamentIds.length === 1) {\n syncGlobalState.tournamentId = tournamentIds[0];\n } else if (!tournamentIds.length) {\n syncGlobalState.tournamentId = undefined;\n }\n}\n\nexport function removeTournamentRecord(tournamentId) {\n if (typeof tournamentId !== 'string') return { error: INVALID_VALUES };\n if (!syncGlobalState.tournamentRecords[tournamentId])\n return { error: NOT_FOUND };\n\n delete syncGlobalState.tournamentRecords[tournamentId];\n const tournamentIds = Object.keys(syncGlobalState.tournamentRecords);\n if (tournamentIds.length === 1) {\n syncGlobalState.tournamentId = tournamentIds[0];\n } else if (!tournamentIds.length) {\n syncGlobalState.tournamentId = undefined;\n }\n return { success: true };\n}\n\nexport function setSubscriptions(params) {\n if (typeof params.subscriptions !== 'object')\n return { error: INVALID_VALUES };\n Object.keys(params.subscriptions).forEach((subscription) => {\n syncGlobalState.subscriptions[subscription] =\n params.subscriptions[subscription];\n });\n return { ...SUCCESS };\n}\n\nexport function cycleMutationStatus() {\n const status = syncGlobalState.modified;\n syncGlobalState.modified = false;\n return status;\n}\n\nexport function addNotice({ topic, payload, key }: Notice) {\n if (typeof topic !== 'string' || typeof payload !== 'object') {\n return;\n }\n\n if (!syncGlobalState.disableNotifications) syncGlobalState.modified = true;\n\n if (\n syncGlobalState.disableNotifications ||\n !syncGlobalState.subscriptions[topic]\n ) {\n return;\n }\n\n if (key) {\n syncGlobalState.notices = syncGlobalState.notices.filter(\n (notice) => !(notice.topic === topic && notice.key === key)\n );\n }\n\n syncGlobalState.notices.push({ topic, payload, key });\n\n return { ...SUCCESS };\n}\n\nexport function getNotices({ topic }: GetNoticesArgs) {\n const notices = syncGlobalState.notices\n .filter((notice) => notice.topic === topic)\n .map((notice) => notice.payload);\n return notices.length && notices;\n}\n\nexport function deleteNotices() {\n syncGlobalState.notices = [];\n}\n\nexport function deleteNotice({ topic, key }: DeleteNoticeArgs) {\n syncGlobalState.notices = syncGlobalState.notices.filter(\n (notice) => (!topic || notice.topic === topic) && notice.key !== key\n );\n}\n\nexport function getTopics() {\n const topics = Object.keys(syncGlobalState.subscriptions);\n return { topics };\n}\n\nexport function callListener({ topic, notices }: CallListenerArgs) {\n const method = syncGlobalState.subscriptions[topic];\n if (method && typeof method === 'function') {\n method(notices);\n }\n}\n\nexport function handleCaughtError({\n engineName,\n methodName,\n params,\n err,\n}: HandleCaughtErrorArgs) {\n let error;\n if (typeof err === 'string') {\n error = err.toUpperCase();\n } else if (err instanceof Error) {\n error = err.message;\n }\n\n console.log('ERROR', {\n tournamentId: getTournamentId(),\n params: JSON.stringify(params),\n engine: engineName,\n methodName,\n error,\n });\n}\n","import { intersection } from '../../utilities/arrays';\nimport syncGlobalState from './syncGlobalState';\n\nimport { TournamentRecordsArgs } from '../../types/factoryTypes';\nimport {\n ErrorType,\n MISSING_ASYNC_STATE_PROVIDER,\n MISSING_VALUE,\n} from '../../constants/errorConditionConstants';\n\nexport type Notice = {\n topic: string;\n payload: any;\n key?: string;\n};\n\ntype IteratorsType = {\n makeDeepCopy: number;\n [key: string]: any;\n};\n\ntype TimerType = {\n elapsedTime: number;\n startTime?: number;\n state?: string;\n};\ntype timersType = {\n [key: string]: TimerType;\n default: TimerType;\n};\n\ntype DeepCopyType = {\n threshold?: number;\n modulate?: any;\n stringify: string[];\n ignore: any;\n toJSON: string[];\n};\n\ntype DevContextType = {\n iterationThreshold: number;\n firstIteration: boolean;\n notInternalUse: boolean;\n log: boolean;\n};\n\ntype GlobalStateTypes = {\n devContext?: DevContextType | boolean;\n tournamentFactoryVersion: string;\n deepCopyAttributes: DeepCopyType;\n iterators: IteratorsType;\n timers: timersType;\n deepCopy: boolean;\n globalLog?: any;\n};\n\nexport type ImplemtationGlobalStateTypes = TournamentRecordsArgs & {\n tournamentId?: string | undefined;\n disableNotifications: boolean;\n subscriptions: any;\n notices: Notice[];\n modified: boolean;\n};\n\nconst globalState: GlobalStateTypes = {\n tournamentFactoryVersion: '0.0.0',\n timers: { default: { elapsedTime: 0 } },\n iterators: { makeDeepCopy: 0 },\n deepCopyAttributes: {\n stringify: [],\n ignore: [],\n toJSON: [],\n },\n deepCopy: true,\n};\n\nlet _globalStateProvider: any = syncGlobalState;\n\nconst requiredStateProviderMethods = [\n 'addNotice',\n 'callListener',\n 'cycleMutationStatus',\n 'deleteNotice',\n 'deleteNotices',\n 'disableNotifications',\n 'enableNotifications',\n 'getNotices',\n 'getTopics',\n 'getTournamentId',\n 'getTournamentRecord',\n 'getTournamentRecords',\n 'removeTournamentRecord',\n 'setSubscriptions',\n 'setTournamentId',\n 'setTournamentRecord',\n 'setTournamentRecords',\n];\n\nexport function setStateProvider(globalStateProvider?: { [key: string]: any }) {\n if (typeof globalStateProvider !== 'object') {\n throw new Error(`Global state provider can not be undefined or null`);\n } else {\n const providerMethods = intersection(\n Object.keys(globalStateProvider),\n requiredStateProviderMethods\n );\n if (providerMethods.length !== requiredStateProviderMethods.length) {\n throw new Error('Global state provider is missing required methods');\n } else {\n _globalStateProvider = globalStateProvider;\n return { success: true };\n }\n }\n}\n\nexport function createInstanceState() {\n //Only applicable for async\n if (_globalStateProvider.createInstanceState) {\n try {\n _globalStateProvider.createInstanceState();\n } catch (error) {\n return { error };\n }\n return { success: true };\n } else {\n return { error: MISSING_ASYNC_STATE_PROVIDER };\n }\n}\n\n/**\n * if contextCriteria, check whether all contextCriteria keys values are equivalent with globalState.devContext object\n */\nexport function getDevContext(contextCriteria?: any): any {\n if (!contextCriteria || typeof contextCriteria !== 'object') {\n return globalState.devContext ?? false;\n } else {\n if (typeof globalState.devContext !== 'object') return false;\n return (\n Object.keys(contextCriteria).every(\n (key) => globalState.devContext?.[key] === contextCriteria[key]\n ) && globalState.devContext\n );\n }\n}\n\nexport function timeKeeper(\n action: string = 'reset',\n timer: string = 'default'\n): any {\n const timeNow = Date.now();\n\n if (action === 'report') {\n if (timer === 'allTimers') {\n const timers = Object.keys(globalState.timers);\n return timers\n .filter(\n (timer) => timer !== 'default' || globalState.timers[timer].startTime\n )\n .map((timer) => {\n const currentTimer = globalState.timers[timer];\n const elapsedPeriod =\n currentTimer.state === 'stopped'\n ? 0\n : (timeNow - (currentTimer?.startTime ?? 0)) / 1000;\n\n const elapsedTime = currentTimer.elapsedTime + elapsedPeriod;\n return {\n state: globalState.timers[timer].state,\n elapsedTime: elapsedTime.toFixed(2),\n timer,\n };\n });\n } else {\n const elapsedPeriod =\n globalState.timers[timer].state === 'stopped'\n ? 0\n : (timeNow - (globalState.timers[timer]?.startTime ?? 0)) / 1000;\n\n const elapsedTime = globalState.timers[timer].elapsedTime + elapsedPeriod;\n\n return {\n state: globalState.timers[timer].state,\n elapsedTime: elapsedTime.toFixed(2),\n timer,\n };\n }\n }\n\n if (!globalState.timers[timer] || action === 'reset') {\n if (timer === 'allTimers') {\n globalState.timers = { default: { elapsedTime: 0 } };\n return true;\n } else {\n globalState.timers[timer] = {\n startTime: timeNow,\n state: 'active',\n elapsedTime: 0,\n };\n }\n }\n\n if (!globalState.timers[timer].elapsedTime)\n globalState.timers[timer].elapsedTime = 0;\n\n action === 'stop' &&\n globalState.timers[timer].state !== 'stopped' &&\n (globalState.timers[timer].state = 'stopped') &&\n (globalState.timers[timer].elapsedTime +=\n (timeNow - (globalState.timers[timer]?.startTime ?? 0)) / 1000);\n action === 'start' &&\n (globalState.timers[timer].startTime = timeNow) &&\n (globalState.timers[timer].state = 'active');\n\n return globalState.timers[timer];\n}\n\nexport function setGlobalLog(loggingFx?: any) {\n if (typeof loggingFx === 'function') {\n globalState.globalLog = loggingFx;\n } else {\n delete globalState.globalLog;\n }\n}\n\nexport function setDevContext(value?: any) {\n globalState.devContext = value;\n}\n\nexport function setDeepCopyIterations(value: number) {\n globalState.iterators.makeDeepCopy = value;\n}\n\nexport function getDeepCopyIterations() {\n return globalState.iterators.makeDeepCopy;\n}\n\nexport function disableNotifications() {\n _globalStateProvider.disableNotifications();\n}\n\nexport function enableNotifications() {\n _globalStateProvider.enableNotifications();\n}\n\nexport type DeepCopyAttributes = {\n threshold?: number;\n stringify?: string[];\n ignore?: string[];\n toJSON?: string[];\n};\n\nexport function setDeepCopy(value: boolean, attributes: DeepCopyAttributes) {\n if (typeof value === 'boolean') {\n globalState.deepCopy = value;\n }\n if (typeof attributes === 'object') {\n if (Array.isArray(attributes.ignore))\n globalState.deepCopyAttributes.ignore = attributes.ignore;\n if (Array.isArray(attributes.toJSON))\n globalState.deepCopyAttributes.toJSON = attributes.toJSON;\n if (Array.isArray(attributes.stringify))\n globalState.deepCopyAttributes.stringify = attributes.stringify;\n if (attributes.threshold)\n globalState.deepCopyAttributes.threshold = attributes.threshold;\n }\n}\n\nexport function deepCopyEnabled() {\n return {\n enabled: globalState.deepCopy,\n ...globalState.deepCopyAttributes,\n };\n}\n\nexport function setSubscriptions(params: any) {\n if (!params?.subscriptions)\n return { error: MISSING_VALUE, info: 'missing subscriptions' };\n return _globalStateProvider.setSubscriptions({\n subscriptions: params.subscriptions,\n });\n}\n\nexport function cycleMutationStatus() {\n return _globalStateProvider.cycleMutationStatus();\n}\n\nexport function addNotice(notice: Notice) {\n return _globalStateProvider.addNotice(notice);\n}\n\nexport type GetNoticesArgs = {\n topic: string;\n};\n\nexport function getNotices(params: GetNoticesArgs): string[] {\n return _globalStateProvider.getNotices(params);\n}\n\nexport type DeleteNoticeArgs = {\n topic?: string;\n key: string;\n};\nexport function deleteNotice({ key, topic }: DeleteNoticeArgs) {\n return _globalStateProvider.deleteNotice({ key, topic });\n}\n\nexport function deleteNotices() {\n return _globalStateProvider.deleteNotices();\n}\n\nexport function getTopics() {\n return _globalStateProvider.getTopics();\n}\n\nexport type CallListenerArgs = {\n notices: Notice[];\n topic: string;\n};\nexport async function callListener(payload) {\n return _globalStateProvider.callListener(payload);\n}\n\nexport function getTournamentId() {\n return _globalStateProvider.getTournamentId();\n}\n\nexport function getTournamentRecord(tournamentId: string) {\n return _globalStateProvider.getTournamentRecord(tournamentId);\n}\n\nexport function getTournamentRecords() {\n return _globalStateProvider.getTournamentRecords();\n}\n\nexport function setTournamentRecord(tournamentRecord: any) {\n return _globalStateProvider.setTournamentRecord(tournamentRecord);\n}\n\nexport function setTournamentRecords(tournamentRecords: any) {\n return _globalStateProvider.setTournamentRecords(tournamentRecords);\n}\n\nexport function setTournamentId(tournamentId: string): {\n success?: boolean;\n error?: ErrorType;\n} {\n return _globalStateProvider.setTournamentId(tournamentId);\n}\n\nexport function removeTournamentRecord(tournamentId: string) {\n return _globalStateProvider.removeTournamentRecord(tournamentId);\n}\n\nexport function getProvider() {\n return _globalStateProvider;\n}\n\nexport type HandleCaughtErrorArgs = {\n engineName?: string;\n methodName: string;\n params: any;\n err: any;\n};\n\nexport function handleCaughtError({\n engineName,\n methodName,\n params,\n err,\n}: HandleCaughtErrorArgs) {\n const caughtErrorHandler =\n (typeof _globalStateProvider.handleCaughtError === 'function' &&\n _globalStateProvider.handleCaughtError) ||\n syncGlobalState.handleCaughtError;\n\n return caughtErrorHandler({\n engineName,\n methodName,\n params,\n err,\n });\n}\n\nexport function globalLog(engine, log) {\n if (globalState.globalLog) {\n return globalState.globalLog(engine, log);\n } else {\n console.log(engine, log);\n }\n}\n","import {\n dateValidation,\n timeValidation,\n validDateString,\n} from '../fixtures/validations/regex';\n\nexport function getIsoDateString(schedule) {\n let { scheduledDate } = schedule;\n if (!scheduledDate && schedule.scheduledTime)\n scheduledDate = extractDate(schedule.scheduledTime);\n if (!scheduledDate) return;\n\n const extractedTime = extractTime(schedule.scheduledTime);\n let isoDateString = extractDate(scheduledDate);\n if (isoDateString && extractedTime) isoDateString += `T${extractedTime}`;\n return isoDateString;\n}\n\nexport function isDateObject(value) {\n if (typeof value !== 'object' || Array.isArray(value)) {\n return false;\n } else {\n const datePrototype = Object.prototype.toString.call(value);\n return datePrototype === '[object Date]';\n }\n}\n\nexport function validTimeValue(value) {\n const spaceSplit = typeof value === 'string' ? value?.split(' ') : [];\n if (\n value &&\n spaceSplit?.length > 1 &&\n !['AM', 'PM'].includes(spaceSplit[1].toUpperCase())\n )\n return false;\n\n return !!(!value || timeValidation.test(convertTime(value, true, true)));\n}\n\nexport function isValidDateString(scheduleDate) {\n return isISODateString(scheduleDate) || validDateString.test(scheduleDate);\n}\n\nexport function DateHHMM(date) {\n const dt = new Date(date);\n const secs = dt.getSeconds() + 60 * dt.getMinutes() + 60 * 60 * dt.getHours();\n return HHMMSS(secs, { displaySeconds: false });\n}\n\nexport function HHMMSS(s, format?) {\n const secondNumber = parseInt(s, 10); // don't forget the second param\n const hours = Math.floor(secondNumber / 3600);\n const minutes = Math.floor((secondNumber - hours * 3600) / 60);\n const seconds = secondNumber - hours * 3600 - minutes * 60;\n\n const displaySeconds = !format || format?.displaySeconds;\n const timeString = displaySeconds\n ? hours + ':' + minutes + ':' + seconds\n : hours + ':' + minutes;\n return timeString.split(':').map(zeroPad).join(':');\n}\n\nexport const getUTCdateString = (date?) => {\n const dateDate =\n isDate(date) || isISODateString(date) ? new Date(date) : new Date();\n const monthNumber = dateDate.getUTCMonth() + 1;\n const utcMonth = monthNumber < 10 ? `0${monthNumber}` : `${monthNumber}`;\n return `${dateDate.getUTCFullYear()}-${zeroPad(utcMonth)}-${zeroPad(\n dateDate.getUTCDate()\n )}`;\n};\n\nexport function timeUTC(date?) {\n const dateDate =\n isDate(date) || isISODateString(date) ? new Date(date) : new Date();\n return Date.UTC(\n dateDate.getFullYear(),\n dateDate.getMonth(),\n dateDate.getDate()\n );\n}\n\nexport function localizeDate(submittedDate, dateLocalization, locale) {\n const date = new Date(submittedDate);\n if (!isDate(date)) return undefined;\n const defaultLocalization = {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n };\n return date.toLocaleDateString(\n locale,\n dateLocalization || defaultLocalization\n );\n}\n\nexport function formatDate(date?, separator = '-', format = 'YMD') {\n if (!date) return '';\n if (typeof date === 'string' && date.indexOf('T') < 0) date = date + 'T00:00';\n\n const d = new Date(date);\n let month = '' + (d.getMonth() + 1);\n let day = '' + d.getDate();\n const year = d.getFullYear();\n\n if (month.length < 2) month = '0' + month;\n if (day.length < 2) day = '0' + day;\n\n if (format === 'DMY') return [day, month, year].join(separator);\n if (format === 'MDY') return [month, day, year].join(separator);\n if (format === 'YDM') return [year, day, month].join(separator);\n if (format === 'DYM') return [day, year, month].join(separator);\n if (format === 'MYD') return [month, year, day].join(separator);\n return [year, month, day].join(separator);\n}\n\nexport function offsetDate(date) {\n const targetTime = date ? new Date(date) : new Date();\n const tzDifference = targetTime.getTimezoneOffset();\n return new Date(targetTime.getTime() - tzDifference * 60 * 1000);\n}\n\nexport function offsetTime(date?) {\n return offsetDate(date).getTime();\n}\n\n// only returns true for valid date objects\n// dateArg = new Date('xxx') produces 'Invalid Date', which return false\nexport function isDate(dateArg) {\n if (typeof dateArg == 'boolean') return false;\n const t =\n (dateArg instanceof Date && dateArg) ||\n (!isNaN(dateArg) && new Date(dateArg)) ||\n false;\n return t && !isNaN(t.valueOf());\n}\n\nexport function dateRange(startDt?, endDt?) {\n if (!isValidDateString(startDt) || !isValidDateString(endDt)) return [];\n\n const startDateString = extractDate(startDt) + 'T00:00';\n const endDateString = extractDate(endDt) + 'T00:00';\n const startDate = new Date(startDateString);\n const endDate = new Date(endDateString);\n const process =\n isDate(endDate) &&\n isDate(startDate) &&\n isValidDateRange(startDate, endDate);\n const between: Date[] = [];\n let iterations = 0;\n\n if (process) {\n const currentDate = startDate;\n let dateSecs = currentDate.getTime();\n while (dateSecs <= endDate.getTime() && iterations < 300) {\n iterations += 1;\n // must be a *new* Date otherwise it is an array of the same object\n between.push(new Date(currentDate));\n dateSecs = currentDate.setDate(currentDate.getDate() + 1);\n }\n }\n\n return between.map((date) => formatDate(date));\n\n function isValidDateRange(minDate, maxDate) {\n return minDate <= maxDate;\n }\n}\n\n// matches valid ISO date string\nconst re =\n /^([+-]?\\d{4}(?!\\d{2}\\b))((-?)((0[1-9]|1[0-2])(\\3([12]\\d|0[1-9]|3[01]))?|W([0-4]\\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\\d|[12]\\d{2}|3([0-5]\\d|6[1-6])))([T\\s]((([01]\\d|2[0-3])((:?)[0-5]\\d)?|24:?00)([.,]\\d+(?!:))?)?(\\17[0-5]\\d([.,]\\d+)?)?([zZ]|([+-])([01]\\d|2[0-3]):?([0-5]\\d)?)?)?)?$/;\nexport function isISODateString(dateString) {\n if (typeof dateString !== 'string') return false;\n return re.test(dateString);\n}\n\nfunction isTimeString(timeString) {\n if (typeof timeString !== 'string') return false;\n const noZ = timeString.split('Z')[0];\n const parts: string[] = noZ.split(':');\n const isNumeric = parts.every((part) => !isNaN(parseInt(part)));\n const invalid =\n parts.length < 2 ||\n !isNumeric ||\n parseInt(parts[0]) > 23 ||\n parseInt(parts[1]) > 60;\n return !invalid;\n}\n\nexport function timeStringMinutes(timeString?) {\n const validTimeString = extractTime(timeString);\n if (!validTimeString) return 0;\n const [hours, minutes] = validTimeString\n .split(':')\n .map((value) => parseInt(value));\n return hours * 60 + minutes;\n}\n\nexport function dayMinutesToTimeString(totalMinutes) {\n let hours = Math.floor(totalMinutes / 60);\n const minutes = totalMinutes - hours * 60;\n if (hours > 23) hours = hours % 24;\n return [zeroPad(hours), zeroPad(minutes)].join(':');\n}\n\nexport function tidyTime(timeString) {\n return isTimeString(timeString)\n ? timeString.split(':').slice(0, 2).map(zeroPad).join(':')\n : undefined;\n}\n\nexport function extractTime(dateString) {\n return isISODateString(dateString) && dateString.indexOf('T') > 0\n ? tidyTime(dateString.split('T').reverse()[0])\n : tidyTime(dateString);\n}\n\nexport function extractDate(dateString) {\n return isISODateString(dateString) || dateValidation.test(dateString)\n ? dateString.split('T')[0]\n : undefined;\n}\n\nexport function dateStringDaysChange(dateString, daysChange) {\n const date = new Date(dateString);\n date.setDate(date.getDate() + daysChange);\n return extractDate(date.toISOString());\n}\n\nexport function splitTime(value) {\n value = typeof value !== 'string' ? '00:00' : value;\n const o: any = {},\n time: any = {};\n ({ 0: o.time, 1: o.ampm } = value.split(' ') || []);\n ({ 0: time.hours, 1: time.minutes } = o.time.split(':') || []);\n time.ampm = o.ampm;\n\n if (\n isNaN(time.hours) ||\n isNaN(time.minutes) ||\n (time.ampm && !['AM', 'PM'].includes(time.ampm.toUpperCase()))\n )\n return {};\n return time;\n}\n\nexport function militaryTime(value?) {\n const time = splitTime(value);\n if (time.ampm && time.hours) {\n if (time.ampm.toLowerCase() === 'pm' && parseInt(time.hours) < 12)\n time.hours = ((time.hours && parseInt(time.hours)) || 0) + 12;\n if (time.ampm.toLowerCase() === 'am' && time.hours === '12')\n time.hours = '00';\n }\n const timeString = `${time.hours || '12'}:${time.minutes || '00'}`;\n return timeString.split(':').map(zeroPad).join(':');\n}\n\nexport function regularTime(value) {\n const time = splitTime(value);\n if (typeof time === 'object' && !Object.keys(time).length) return undefined;\n\n if (time.ampm) return value;\n if (time.hours > 12) {\n time.hours -= 12;\n time.ampm = 'PM';\n } else if (time.hours === '12') {\n time.ampm = 'PM';\n } else if (time.hours === '00') {\n time.hours = '12';\n time.ampm = 'AM';\n } else {\n time.ampm = 'AM';\n }\n if (time.hours?.[0] === '0') {\n time.hours = time.hours.slice(1);\n }\n\n return `${time.hours || '12'}:${time.minutes || '00'} ${time.ampm}`;\n}\n\nexport function convertTime(value, time24?, keepDate?) {\n const hasDate = extractDate(value);\n const timeString = extractTime(value);\n const timeValue = hasDate ? timeString : value;\n\n return !value\n ? undefined\n : (time24 && ((hasDate && keepDate && value) || militaryTime(timeValue))) ||\n regularTime(timeValue);\n}\n\nexport function timeSort(a, b) {\n const as = splitTime(a);\n const bs = splitTime(b);\n if (parseInt(as.hours) < parseInt(bs.hours)) return -1;\n if (parseInt(as.hours) > parseInt(bs.hours)) return 1;\n if (as.hours === bs.hours) {\n if (parseInt(as.minutes) < parseInt(bs.minutes)) return -1;\n if (parseInt(as.minutes) > parseInt(bs.minutes)) return 1;\n }\n return 0;\n}\n\nexport function weekDays(date: any = new Date(), firstDayOfWeek = 0) {\n if (!isDate(date)) return [];\n const dates = [0, 1, 2, 3, 4, 5, 6].map((i) =>\n dayOfWeek(date, i + firstDayOfWeek)\n );\n return dates;\n\n function dayOfWeek(date, index) {\n const d = new Date(date);\n const day = d.getDay();\n const diff = index - day;\n\n const nextDate = new Date(d.setDate(d.getDate() + diff));\n return formatDate(nextDate);\n }\n}\n\nexport function addDays(date, days = 7) {\n const universalDate = extractDate(date) + 'T00:00';\n const now = new Date(universalDate);\n const adjustedDate = new Date(now.setDate(now.getDate() + days));\n return formatDate(adjustedDate);\n}\nexport function addWeek(date) {\n return addDays(date);\n}\nexport function subtractWeek(date, dateFormat?) {\n const universalDate = extractDate(date) + 'T00:00';\n const now = new Date(universalDate);\n return formatDate(now.setDate(now.getDate() - 7), dateFormat);\n}\n\nexport function getDateByWeek(week, year, dateFormat, sunday = false) {\n const date = new Date(year, 0, 1 + (week - 1) * 7);\n const startValue = sunday ? 0 : 1;\n date.setDate(date.getDate() + (startValue - date.getDay()));\n return formatDate(date, dateFormat);\n}\n\nexport function dateFromDay(year, day, dateFormat?) {\n const date = new Date(year, 0); // initialize a date in `year-01-01`\n return formatDate(new Date(date.setDate(day)), dateFormat); // add the number of days\n}\n\nexport function timeToDate(timeString, date = undefined) {\n const [hours, minutes] = (timeString || '00:00').split(':').map(zeroPad);\n const milliseconds = offsetDate(date).setHours(hours, minutes, 0, 0);\n return offsetDate(milliseconds);\n}\n\nexport function minutesDifference(date1, date2, absolute = true) {\n const dt1 = new Date(date1);\n const dt2 = new Date(date2);\n const diff = (dt2.getTime() - dt1.getTime()) / 1000 / 60;\n return absolute ? Math.abs(Math.round(diff)) : Math.round(diff);\n}\n\nexport function addMinutesToTimeString(timeString?, minutes?) {\n const validTimeString = extractTime(timeString);\n if (!validTimeString) return '00:00';\n const minutesToAdd = isNaN(minutes) ? 0 : minutes;\n return extractTime(\n addMinutes(timeToDate(validTimeString), minutesToAdd).toISOString()\n );\n}\n\nexport function addMinutes(startDate, minutes) {\n const date = new Date(startDate);\n return new Date(date.getTime() + minutes * 60000);\n}\n\nexport function zeroPad(number) {\n return number.toString()[1] ? number : '0' + number;\n}\n\nexport function sameDay(date1, date2) {\n const d1 = new Date(date1);\n const d2 = new Date(date2);\n return (\n d1.getFullYear() === d2.getFullYear() &&\n d1.getMonth() === d2.getMonth() &&\n d1.getDate() === d2.getDate()\n );\n}\n\nexport const dateTime = {\n addDays,\n addWeek,\n addMinutesToTimeString,\n convertTime,\n getIsoDateString,\n getUTCdateString,\n DateHHMM,\n extractDate,\n extractTime,\n formatDate,\n getDateByWeek,\n isISODateString,\n isDate,\n isTimeString,\n offsetDate,\n offsetTime,\n sameDay,\n timeStringMinutes,\n timeToDate,\n timeUTC,\n validTimeValue,\n validDateString,\n timeValidation,\n dateValidation,\n};\n","import { isDateObject } from './dateTime';\nimport {\n deepCopyEnabled,\n getDevContext,\n setDeepCopyIterations,\n getProvider,\n} from '../global/state/globalState';\n\nexport function makeDeepCopy(\n sourceObject, // arbitrary JSON object; functions will be stripped.\n convertExtensions?, // optional - all extension objects converted to attributes ._key\n internalUse?, // disregard deepCopy being disabled within the engine - necessary for query results\n removeExtensions?, // optional - strip all extension attributes\n iteration = 0 // escape hatch - check against iteration threshold\n) {\n if (getProvider().makeDeepCopy)\n return getProvider().makeDeepCopy(\n sourceObject,\n convertExtensions,\n internalUse,\n removeExtensions\n );\n\n const deepCopy = deepCopyEnabled();\n\n const { stringify, toJSON, ignore, modulate } = deepCopy || {};\n\n if (\n (!deepCopy?.enabled && !internalUse) ||\n typeof sourceObject !== 'object' ||\n typeof sourceObject === 'function' ||\n sourceObject === null ||\n (typeof deepCopy?.threshold === 'number' && iteration >= deepCopy.threshold)\n ) {\n return sourceObject;\n }\n\n const devContext = getDevContext({ makeDeepCopy: true });\n if (devContext) {\n setDeepCopyIterations(iteration);\n if (\n typeof devContext === 'object' &&\n (iteration > (devContext.iterationThreshold || 15) ||\n (devContext.firstIteration && iteration === 0)) &&\n devContext.log &&\n (!devContext.notInternalUse ||\n (devContext.notInternalUse && !internalUse))\n ) {\n console.log({ devContext, iteration, internalUse }, sourceObject);\n }\n }\n\n const targetObject = Array.isArray(sourceObject) ? [] : {};\n\n const sourceObjectKeys = Object.keys(sourceObject).filter(\n (key) =>\n !internalUse ||\n !ignore ||\n (Array.isArray(ignore) && !ignore.includes(key)) ||\n (typeof ignore === 'function' && !ignore(key))\n );\n\n const stringifyValue = (key, value) => {\n targetObject[key] =\n typeof value?.toString === 'function'\n ? value.toString()\n : JSON.stringify(value);\n };\n\n for (const key of sourceObjectKeys) {\n const value = sourceObject[key];\n const modulated =\n typeof modulate === 'function' ? modulate(value) : undefined;\n if (modulated !== undefined) {\n targetObject[key] = modulated;\n } else if (\n convertExtensions &&\n key === 'extensions' &&\n Array.isArray(value)\n ) {\n const extensionConversions = extensionsToAttributes(value);\n Object.assign(targetObject, ...extensionConversions);\n } else if (removeExtensions && key === 'extensions') {\n targetObject[key] = [];\n } else if (Array.isArray(stringify) && stringify.includes(key)) {\n stringifyValue(key, value);\n } else if (\n Array.isArray(toJSON) &&\n toJSON.includes(key) &&\n typeof value?.toJSON === 'function'\n ) {\n targetObject[key] = value.toJSON();\n } else if (value === null) {\n targetObject[key] = undefined;\n } else if (isDateObject(value)) {\n targetObject[key] = new Date(value).toISOString();\n } else {\n targetObject[key] = makeDeepCopy(\n value,\n convertExtensions,\n internalUse,\n removeExtensions,\n iteration + 1\n );\n }\n }\n\n return targetObject;\n}\n\nexport function extensionsToAttributes(extensions) {\n return extensions\n ?.map((extension) => {\n const { name, value } = extension;\n return name && value && { [`_${name}`]: value };\n })\n .filter(Boolean);\n}\n","import { makeDeepCopy } from './makeDeepCopy';\n\ntype ProcessKeysArgs = {\n significantCharacters?: boolean;\n attributes: string[];\n targetElement: any;\n};\n\nexport function getAccessorValue({ element, accessor }) {\n if (typeof accessor !== 'string') return { values: [] };\n const targetElement = makeDeepCopy(element);\n const attributes = accessor.split('.');\n\n const values: any[] = [];\n let value;\n processKeys({ targetElement, attributes });\n\n const result: any = { value };\n if (values.length) result.values = values;\n return result;\n\n function processKeys({\n targetElement,\n attributes = [],\n significantCharacters,\n }: ProcessKeysArgs) {\n for (const [index, attribute] of attributes.entries()) {\n if (targetElement?.[attribute]) {\n const remainingKeys = attributes.slice(index + 1);\n if (!remainingKeys.length) {\n if (!value) value = targetElement[attribute];\n if (!values.includes(targetElement[attribute])) {\n values.push(targetElement[attribute]);\n }\n } else if (Array.isArray(targetElement[attribute])) {\n const values = targetElement[attribute];\n values.forEach((nestedTarget) =>\n processKeys({\n targetElement: nestedTarget,\n attributes: remainingKeys,\n })\n );\n } else {\n targetElement = targetElement[attribute];\n checkValue({ targetElement, index });\n }\n }\n }\n\n function checkValue({ targetElement, index }) {\n if (\n targetElement &&\n index === attributes.length - 1 &&\n ['string', 'number'].includes(typeof targetElement)\n ) {\n const extractedValue = significantCharacters\n ? targetElement.slice(0, significantCharacters)\n : targetElement;\n\n if (value) {\n if (!values.includes(extractedValue)) {\n values.push(extractedValue);\n }\n } else {\n value = extractedValue;\n values.push(extractedValue);\n }\n }\n }\n }\n}\n","import { deepCopyEnabled } from '../global/state/globalState';\nimport { getAccessorValue } from './getAccessorValue';\n\nexport function isString(obj) {\n return typeof obj === 'string';\n}\n\nexport function isObject(obj) {\n return obj !== null && typeof obj === 'object';\n}\n\nexport function objShallowEqual(o1, o2) {\n if (!isObject(o1) || !isObject(o2)) return false;\n const keys1 = Object.keys(o1);\n const keys2 = Object.keys(o2);\n\n if (keys1.length !== keys2.length) {\n return false;\n }\n\n for (const key of keys1) {\n if (o1[key] !== o2[key]) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function createMap(objectArray, attribute) {\n if (!Array.isArray(objectArray)) return {};\n\n return Object.assign(\n {},\n ...(objectArray ?? [])\n .filter(isObject)\n .map((obj) => {\n return (\n obj[attribute] && {\n [obj[attribute]]: obj,\n }\n );\n })\n .filter(Boolean)\n );\n}\n\n// e.g. result.find(hav({ attr: value })) -or- result.filter(hav({ attr: value }))\nexport const hasAttributeValues = (a) => (o) =>\n Object.keys(a).every((key) => o[key] === a[key]);\n\n// extracts targeted attributes\n// e.g. const byeAssignments = positionAssignments.filter(xa('bye')).map(xa('drawPosition'));\n// supports xa('string'), xa(['string', 'string']), xa({ attr1: true, attr2: true })\nexport const extractAttributes = (accessor) => (element) =>\n !accessor || typeof element !== 'object'\n ? undefined\n : (Array.isArray(accessor) &&\n accessor.map((a) => ({\n [a]: getAccessorValue({ element, accessor: a })?.value,\n }))) ||\n (typeof accessor === 'object' &&\n Object.keys(accessor).map((key) => ({\n [key]: getAccessorValue({ element, accessor: key })?.value,\n }))) ||\n (typeof accessor === 'string' && getAccessorValue({ element, accessor }))\n ?.value;\n\nexport function definedAttributes(\n obj: object,\n ignoreFalse?: boolean,\n ignoreEmptyArrays?: boolean,\n shallow?: boolean\n) {\n if (typeof obj !== 'object' || obj === null) return obj;\n const deepCopy = deepCopyEnabled();\n if (!deepCopy?.enabled) shallow = true;\n\n const ignoreValues: any[] = ['', undefined, null];\n if (ignoreFalse) ignoreValues.push(false);\n\n const definedKeys = Object.keys(obj).filter(\n (key) =>\n !ignoreValues.includes(obj[key]) &&\n (!ignoreEmptyArrays || (Array.isArray(obj[key]) ? obj[key].length : true))\n );\n\n return Object.assign(\n {},\n ...definedKeys.map((key) => {\n return Array.isArray(obj[key])\n ? {\n [key]: shallow\n ? obj[key]\n : obj[key].map((m) => definedAttributes(m)),\n } // doesn't filter out undefined array elements\n : { [key]: shallow ? obj[key] : definedAttributes(obj[key]) };\n })\n );\n}\n\n// useful in notifications where back end does not recognize undefined for updates\nexport function undefinedToNull(obj: object, shallow?: boolean) {\n if (obj === undefined) return null;\n if (typeof obj !== 'object' || obj === null) return obj;\n\n const definedKeys = Object.keys(obj);\n const notNull = (value) => (value === undefined ? null : value);\n\n return Object.assign(\n {},\n ...definedKeys.map((key) => {\n return Array.isArray(obj[key])\n ? {\n [key]: shallow ? obj[key] : obj[key].map((m) => undefinedToNull(m)),\n }\n : { [key]: shallow ? notNull(obj[key]) : undefinedToNull(obj[key]) };\n })\n );\n}\n\nfunction countKeys(o) {\n if (Array.isArray(o)) {\n return o.length + o.map(countKeys).reduce((a, b) => a + b, 0);\n } else if (typeof o === 'object' && o !== null) {\n return (\n Object.keys(o).length +\n Object.keys(o)\n .map((k) => countKeys(o[k]))\n .reduce((a, b) => a + b, 0)\n );\n }\n return 0;\n}\n\nexport function generateHashCode(o) {\n if (o === null || typeof o !== 'object') return undefined;\n const str = JSON.stringify(o);\n const keyCount = countKeys(o);\n const charSum = str.split('').reduce((a, b) => a + b.charCodeAt(0), 0);\n return [str.length, keyCount, charSum].map((e) => e.toString(36)).join('');\n}\n","// NOTE: type really does need to be any!\nexport function attributeFilter(params?: any): any {\n if (params === null) return {};\n const { source, template } = params || {};\n if (!template) return source;\n\n const target = {};\n attributeCopy(source, template, target);\n\n return target;\n\n function attributeCopy(valuesObject, templateObject, outputObject) {\n if (!valuesObject || !templateObject) return undefined;\n const vKeys = Object.keys(valuesObject);\n const oKeys = Object.keys(templateObject);\n\n // the orMap allows spcification of { 'a||b': boolean } so that filter templates can apply to multiple attributes\n const orMap = Object.assign(\n {},\n ...oKeys\n .filter((key) => key.indexOf('||'))\n .map((key) => key.split('||').map((or) => ({ [or]: key })))\n .flat()\n );\n const allKeys = oKeys.concat(...Object.keys(orMap));\n const wildcard = allKeys.includes('*');\n\n for (const vKey of vKeys) {\n if (allKeys.indexOf(vKey) >= 0 || wildcard) {\n const templateKey = orMap[vKey] || vKey;\n const tobj = templateObject[templateKey] || wildcard;\n const vobj = valuesObject[vKey];\n\n if (\n typeof tobj === 'object' &&\n typeof vobj !== 'function' &&\n !Array.isArray(tobj)\n ) {\n if (Array.isArray(vobj)) {\n const mappedElements = vobj\n .map((arrayMember) => {\n const target = {};\n const result = attributeCopy(arrayMember, tobj, target);\n return result !== false ? target : undefined;\n })\n .filter(Boolean);\n outputObject[vKey] = mappedElements;\n } else if (vobj) {\n outputObject[vKey] = {};\n attributeCopy(vobj, tobj, outputObject[vKey]);\n }\n } else {\n const value = valuesObject[vKey];\n const exclude = Array.isArray(tobj) && !tobj.includes(value);\n if (exclude) return false;\n\n if (\n templateObject[vKey] ||\n (wildcard && templateObject[vKey] !== false)\n ) {\n outputObject[vKey] = value;\n }\n }\n }\n }\n return undefined;\n }\n}\n","export function generateTimeCode(index: number = 0): string {\n const uidate = new Date();\n uidate.setHours(uidate.getHours() + index);\n return uidate.getTime().toString(36).slice(-6).toUpperCase();\n}\n","import { isNumeric } from './math';\n\nimport { INVALID_VALUES } from '../constants/errorConditionConstants';\n\n/**\n *\n * @param {object[]} arrayOfJSON - JSON objects array\n * @param {object} config - object which configures processing (see below)\n * @returns {string} - joined by '\\r\\n' or specified line separator\n *\n * config {\n * {boolean} includeTransformAccessors, // transform accessors are included with columnAccessors\n * {string[]} columnAccessors, // [ 'includeThis', 'andThis' ]\n * {object} columnTransform, // e.g. { 'newColumnName': ['oldColumn1', 'oldColumn2' ]}\n * {object} columnMap, // e.g. { 'columnName': 'newColumnName' }\n * {object} valuesMap, // e.g. { 'columnName': { 'value1': 'mappedValue' }} // useful for mapping IDs\n * {array} sortOrder // e.g. ['columnName1', 'columnName2'] // determine order of csv columns\n * {object} context, // attributes which are to be added to all rows { 'columnName': 'value }\n * {string} delimiter, // defaults to '\"'\n * {string} columnJoiner, // defaults to ',' // defines how CSV columns are joined\n * {string} rowJoiner, // defaults to '\\r\\n' // defines how CSV lines are joined\n * {string} keyJoiner, // defaults to '.' // defines how flattened column names are constructed\n * }\n *\n * NOTE: `columnTransform` mapped array elements are sensitive to order and will resolve to the first matching value\n * NOTE: `columnMap` should not contain new columnName(s) that are `columnTransform` keys\n */\nexport function JSON2CSV(arrayOfJSON?, config?) {\n if (config && typeof config !== 'object') return INVALID_VALUES;\n\n let { columnTransform = {} } = config || {};\n\n const {\n includeTransformAccessors,\n includeHeaderRow = true,\n returnTransformedJSON,\n removeEmptyColumns,\n onlyHeaderRow,\n\n columnAccessors = [],\n functionMap = {},\n columnMap = {},\n valuesMap = {},\n context = {},\n\n delimiter = '\"',\n columnJoiner = ',',\n rowJoiner = '\\r\\n',\n keyJoiner = '.',\n } = config || {};\n\n if (\n !Array.isArray(arrayOfJSON) ||\n !Array.isArray(columnAccessors) ||\n typeof context !== 'object' ||\n typeof columnMap !== 'object' ||\n typeof columnTransform !== 'object' ||\n typeof functionMap !== 'object' ||\n typeof valuesMap !== 'object' ||\n typeof columnJoiner !== 'string' ||\n typeof rowJoiner !== 'string' ||\n typeof keyJoiner !== 'string' ||\n typeof delimiter !== 'string'\n )\n return INVALID_VALUES;\n\n // ensure all column transformers are arrays\n columnTransform = Object.assign(\n {},\n ...Object.keys(columnTransform)\n .reverse() // reverse so that exported CSV columns are in the order as defined\n .map((key) => ({\n [key]: Array.isArray(columnTransform[key])\n ? columnTransform[key]\n : [\n // ensure transform attributes are strings\n typeof columnTransform[key] === 'string' && columnTransform[key],\n ].filter(Boolean),\n }))\n );\n\n const flattened = arrayOfJSON\n .filter(Boolean)\n .map((obj) => flattenJSON(obj, keyJoiner));\n\n const transformColumns = Object.values(columnTransform).flat();\n if (includeTransformAccessors) columnAccessors.push(...transformColumns);\n\n const headerRow = flattened\n .reduce(\n (aggregator, row) =>\n Object.keys(row).every(\n (key) => (!aggregator.includes(key) && aggregator.push(key)) || true\n ) && aggregator,\n []\n )\n .filter((key) => !columnAccessors?.length || columnAccessors.includes(key));\n\n const accessorMap = Object.assign(\n {},\n ...Object.keys(columnTransform)\n .reverse() // so that original order is preserved when later pushed\n .map((transform) =>\n columnTransform[transform]\n .map((value) => ({ [value]: transform }))\n .flat()\n )\n .flat()\n );\n\n const sortColumns = (a, b) =>\n !config?.sortOrder\n ? 0\n : (config.sortOrder.includes(a) &&\n config.sortOrder.includes(b) &&\n config.sortOrder.indexOf(a) - config.sortOrder.indexOf(b)) ||\n (!config.sortOrder.includes(b) && -1);\n\n const tranformedHeaderRow = headerRow\n .reduce((def, key) => {\n const transform = accessorMap[key];\n if (transform) {\n if (!def.includes(transform)) def.push(transform);\n } else {\n def.push(key);\n }\n return def;\n }, [])\n .sort(sortColumns);\n\n Object.keys(columnMap).forEach(\n (columnName) =>\n !tranformedHeaderRow.includes(columnName) &&\n tranformedHeaderRow.unshift(columnName)\n );\n\n Object.keys(columnTransform).forEach(\n (columnName) =>\n !tranformedHeaderRow.includes(columnName) &&\n tranformedHeaderRow.unshift(columnName)\n );\n\n typeof context === 'object' &&\n Object.keys(context).forEach(\n (columnName) =>\n !tranformedHeaderRow.includes(columnName) &&\n tranformedHeaderRow.unshift(columnName)\n );\n\n let mappedHeaderRow = tranformedHeaderRow.map((key) => columnMap[key] || key);\n\n if (onlyHeaderRow) return [mappedHeaderRow];\n\n const withDelimiter = (value) => `${delimiter}${value}${delimiter}`;\n\n const columnValueCounts: number[] = [];\n const processRow = (row) => {\n return Object.values(\n tranformedHeaderRow.reduce((columnsMap, columnName, columnIndex) => {\n const accessors = columnTransform[columnName];\n const value =\n (accessors?.length\n ? row[accessors.find((accessor) => row[accessor])]\n : row[columnName]) ||\n context?.[columnName] ||\n '';\n\n const mappedValue = valuesMap[columnName]?.[value] || value;\n const fxValue =\n typeof functionMap[columnName] === 'function'\n ? functionMap[columnName](mappedValue)\n : mappedValue;\n columnsMap[columnName] = withDelimiter(fxValue);\n if (fxValue) {\n columnValueCounts[columnIndex] =\n (columnValueCounts[columnIndex] || 0) + 1;\n }\n return columnsMap;\n }, {})\n );\n };\n\n let flattenedRows = flattened.map(processRow);\n\n const indicesToRemove =\n removeEmptyColumns &&\n [...columnValueCounts]\n .map((count, index) => !count && index)\n .filter(isNumeric)\n .reverse();\n\n if (indicesToRemove) {\n const purge = (row) =>\n row.filter((_, index) => !indicesToRemove.includes(index));\n flattenedRows = flattenedRows.map(purge);\n mappedHeaderRow = purge(mappedHeaderRow);\n }\n\n const rows = flattenedRows.map((row) => row.join(columnJoiner));\n\n if (returnTransformedJSON) {\n return rows.map((row) => {\n const columnValues = row.split(columnJoiner);\n return Object.assign(\n {},\n ...columnValues.map((v, i) => ({ [mappedHeaderRow[i]]: v }))\n );\n });\n }\n\n return includeHeaderRow\n ? [mappedHeaderRow.map(withDelimiter).join(columnJoiner), ...rows].join(\n rowJoiner\n )\n : rows.join(rowJoiner);\n}\n\nexport function flattenJSON(obj, keyJoiner: string = '.', path: string[] = []) {\n return (\n typeof obj === 'object' &&\n Object.keys(obj).reduce((result, key: string) => {\n if (typeof obj[key] !== 'object') {\n result[path.concat(key).join(keyJoiner)] = obj[key];\n return result;\n }\n return Object.assign(\n result,\n flattenJSON(obj[key], keyJoiner, path.concat(key))\n );\n }, {})\n );\n}\n","/*\n based on an answer provided by Jeff Ward on StackOverflow; November 2019\n https://stackoverflow.com/users/1026023/jeff-ward\n https://stackoverflow.com/questions/105034/how-to-create-guid-uuid?rq=1\n*/\n\nimport { generateRange } from './arrays';\n\n/**\n * generate a given number of UUIDs\n *\n * @param {number} count - number of UUIDs to generate\n */\nexport function UUIDS(count = 1) {\n return generateRange(0, count).map(UUID);\n}\n\nexport function UUID() {\n const lut: string[] = [];\n\n for (let i = 0; i < 256; i++) {\n lut[i] = (i < 16 ? '0' : '') + i.toString(16);\n }\n\n const d0 = (Math.random() * 0xffffffff) | 0;\n const d1 = (Math.random() * 0xffffffff) | 0;\n const d2 = (Math.random() * 0xffffffff) | 0;\n const d3 = (Math.random() * 0xffffffff) | 0;\n // eslint-disable-next-line no-mixed-operators\n return (\n lut[d0 & 0xff] +\n lut[(d0 >> 8) & 0xff] +\n lut[(d0 >> 16) & 0xff] +\n lut[(d0 >> 24) & 0xff] +\n '-' +\n // eslint-disable-next-line no-mixed-operators\n lut[d1 & 0xff] +\n lut[(d1 >> 8) & 0xff] +\n '-' +\n lut[((d1 >> 16) & 0x0f) | 0x40] +\n lut[(d1 >> 24) & 0xff] +\n '-' +\n // eslint-disable-next-line no-mixed-operators\n lut[(d2 & 0x3f) | 0x80] +\n lut[(d2 >> 8) & 0xff] +\n '-' +\n lut[(d2 >> 16) & 0xff] +\n lut[(d2 >> 24) & 0xff] +\n // eslint-disable-next-line no-mixed-operators\n lut[d3 & 0xff] +\n lut[(d3 >> 8) & 0xff] +\n lut[(d3 >> 16) & 0xff] +\n lut[(d3 >> 24) & 0xff]\n );\n}\n\n/**\n * UUID prepended with 'u_' which is safe for html attribute ids\n */\nexport function safeUUID() {\n return `u_${UUID()}`;\n}\n"],"names":["val","syncGlobalState","targetElement","attributes","values","target"],"mappings":"AAAgB,SAAA,WAAA,CAAY,GAAG,CAAG,EAAA;AAChC,EAAA,OAAO,CAAI,GAAA,CAAA,CAAA;AACb;;ACFO,SAAS,UAAU,GAAsB,EAAA;AAC9C,EAAA,IAAI,OAAO,GAAQ,KAAA,QAAA;AAAU,IAAO,OAAA,QAAA,CAAS,GAAI,CAAA,QAAA,EAAU,CAAA,CAAA;AAC3D,EAAA,OAAO,SAAS,GAAG,CAAA,CAAA;AACrB;;ACAO,SAAS,WAAW,CAAI,EAAA;AAC7B,EAAA,IAAI,MAAM,CAAC,CAAA;AAAG,IAAO,OAAA,KAAA,CAAA;AACrB,EAAO,OAAA,CAAA,IAAA,CAAM,CAAK,GAAA,CAAA,GAAI,CAAQ,MAAA,CAAA,CAAA;AAChC,CAAA;AAwBO,SAAS,gBAAgB,GAAK,EAAA;AACnC,EAAA,OAAO,IAAK,CAAA,GAAA,CAAI,CAAG,EAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAK,GAAI,CAAA,GAAG,CAAI,GAAA,IAAA,CAAK,GAAI,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA;AAC5D,CAAA;AAEO,SAAS,UAAU,KAAO,EAAA;AAC/B,EAAA,OAAO,CAAC,KAAA,CAAM,UAAW,CAAA,KAAK,CAAC,CAAA,CAAA;AACjC,CAAA;AAEO,SAAS,MAAM,GAAK,EAAA;AACzB,EAAM,MAAA,MAAA,GAAS,UAAU,GAAG,CAAA,CAAA;AAC5B,EAAA,IAAI,MAAM,MAAM,CAAA;AAAG,IAAO,OAAA,KAAA,CAAA,CAAA;AAC1B,EAAA,IAAI,MAAW,KAAA,CAAA;AAAG,IAAO,OAAA,KAAA,CAAA;AACzB,EAAQ,OAAA,CAAA,MAAA,GAAS,CAAC,MAAY,MAAA,CAAA,CAAA;AAChC,CAAA;AAEO,SAAS,aAAa,CAAI,EAAA;AAC/B,EAAA,IAAI,MAAM,CAAC,CAAA;AAAG,IAAO,OAAA,KAAA,CAAA;AACrB,EAAO,OAAA,CAAC,UAAW,CAAA,CAAC,CAAG,EAAA;AACrB,IAAA,CAAA,EAAA,CAAA;AAAA,GACF;AACA,EAAO,OAAA,CAAA,CAAA;AACT;;AChDO,SAAS,OAAO,GAAK,EAAA;AAC1B,EAAO,OAAA,GAAA,CAAI,MAAO,CAAA,CAAC,IAAM,EAAA,CAAA,EAAG,MAAM,CAAE,CAAA,WAAA,CAAY,IAAI,CAAA,KAAM,CAAC,CAAA,CAAA;AAC7D,CAAA;AAEO,SAAS,QAAQ,GAAK,EAAA;AAC3B,EAAA,OAAO,KAAK,GAAI,CAAA,CAAC,SAAU,IAAS,KAAA,IAAA,GAAO,SAAY,IAAK,CAAA,CAAA;AAC9D,CAAA;AAEO,SAAS,aAAa,GAAK,EAAA;AAChC,EAAO,OAAA,GAAA,CACJ,GAAI,CAAA,CAAC,CAAM,KAAA,CAAC,IAAK,CAAA,MAAA,EAAU,EAAA,CAAC,CAAC,CAAA,CAC7B,IAAK,CAAA,CAAC,CAAG,EAAA,CAAA,KAAM,CAAE,CAAA,CAAC,CAAI,GAAA,CAAA,CAAE,CAAC,CAAC,CAC1B,CAAA,GAAA,CAAI,CAAC,CAAA,KAAM,CAAE,CAAA,CAAC,CAAC,CAAA,CAAA;AACpB,CAAA;AAQO,SAAS,cAAc,MAA4C,EAAA;AACxE,EAAA,OAAO,MAAO,CAAA,MAAA,CAAO,CAAC,CAAA,EAAG,CAAM,KAAA;AAC7B,IAAI,IAAA,CAAC,EAAE,CAAC,CAAA;AAAG,MAAA,CAAA,CAAE,CAAC,CAAI,GAAA,CAAA,CAAA;AAClB,IAAA,CAAA,CAAE,CAAC,CAAA,EAAA,CAAA;AACH,IAAO,OAAA,CAAA,CAAA;AAAA,GACT,EAAG,EAAE,CAAA,CAAA;AACP,CAAA;AAIO,SAAS,YAAY,MAAqC,EAAA;AAC/D,EAAO,OAAA,WAAA,CAAY,aAAc,CAAA,MAAM,CAAC,CAAA,CAAA;AAC1C,CAAA;AAIO,SAAS,YAAY,GAAK,EAAA;AAC/B,EAAA,OAAO,OAAO,IAAK,CAAA,GAAG,EAAE,MAAO,CAAA,CAAC,GAAG,CAAM,KAAA;AACvC,IAAM,MAAA,KAAA,GAAQ,IAAI,CAAC,CAAA,CAAA;AACnB,IAAI,IAAA,CAAA,CAAE,KAAK,CAAG,EAAA;AACZ,MAAE,CAAA,CAAA,KAAK,CAAE,CAAA,IAAA,CAAK,CAAC,CAAA,CAAA;AAAA,KACV,MAAA;AACL,MAAE,CAAA,CAAA,KAAK,CAAI,GAAA,CAAC,CAAC,CAAA,CAAA;AAAA,KACf;AACA,IAAO,OAAA,CAAA,CAAA;AAAA,GACT,EAAG,EAAE,CAAA,CAAA;AACP,CAAA;AAQO,SAAS,UAAU,KAAO,EAAA;AAC/B,EAAA,OAAO,MAAM,OAAQ,CAAA,KAAK,KAAK,KAAM,CAAA,MAAA,GACjC,MAAM,MAAO,CAAA,IAAA,CAAK,MAAM,IAAK,CAAA,MAAA,KAAW,KAAM,CAAA,MAAM,GAAG,CAAC,CAAA,CAAE,CAAC,CAC3D,GAAA,KAAA,CAAA,CAAA;AACN,CAAA;AACO,SAAS,aAAa,GAAK,EAAA;AAChC,EAAA,MAAM,QAAQ,IAAK,CAAA,KAAA,CAAM,KAAK,MAAO,EAAA,GAAI,IAAI,MAAM,CAAA,CAAA;AACnD,EAAA,OAAO,IAAI,KAAK,CAAA,CAAA;AAClB,CAAA;AAEgB,SAAA,aAAA,CAAc,OAAO,GAAK,EAAA;AACxC,EAAO,OAAA,KAAA,CAAM,IAAK,CAAA,EAAE,MAAQ,EAAA,GAAA,GAAM,KAAM,EAAA,EAAG,CAAC,CAAA,EAAG,CAAM,KAAA,CAAA,GAAI,KAAK,CAAA,CAAA;AAChE,CAAA;AAWgB,SAAA,YAAA,CAAa,GAAG,CAAG,EAAA;AACjC,EAAI,IAAA,CAAC,MAAM,OAAQ,CAAA,CAAC,KAAK,CAAC,KAAA,CAAM,QAAQ,CAAC,CAAA;AAAG,IAAA,OAAO,EAAC,CAAA;AACpD,EAAA,OAAO,EACJ,MAAO,CAAA,CAAC,MAAM,CAAE,CAAA,OAAA,CAAQ,CAAC,CAAM,KAAA,CAAA,CAAE,EACjC,MAAO,CAAA,CAAC,GAAG,CAAG,EAAA,CAAA,KAAM,EAAE,OAAQ,CAAA,CAAC,MAAM,CAAC,CAAA,CAAA;AAC3C,CAAA;AAWgB,SAAA,OAAA,CAAQ,GAAG,CAAG,EAAA;AAC5B,EAAI,IAAA,CAAC,MAAM,OAAQ,CAAA,CAAC,KAAK,CAAC,KAAA,CAAM,QAAQ,CAAC,CAAA;AAAG,IAAO,OAAA,KAAA,CAAA;AACnD,EAAA,OAAO,EAAE,IAAK,CAAA,CAAC,MAAM,CAAE,CAAA,QAAA,CAAS,CAAC,CAAC,CAAA,CAAA;AACpC,CAAA;AACgB,SAAA,WAAA,CAAY,KAAK,GAAK,EAAA;AACpC,EAAA,OACE,GAAI,CAAA,MAAA,CAAO,CAAC,CAAA,EAAGA,IAAQ,KAAA;AACrB,IAAA,CAAA,CAAEA,IAAG,CAAA,GAAI,CAAI,GAAA,CAAA,CAAEA,IAAG,CAAK,IAAA,CAAA,CAAA;AACvB,IAAO,OAAA,CAAA,CAAA;AAAA,GACN,EAAA,EAAE,CAAA,CAAE,GAAG,CAAK,IAAA,CAAA,CAAA;AAEnB,CAAA;AACO,SAAS,OAAQ,CAAA,GAAA,EAAK,CAAG,EAAA,CAAA,EAAG,MAAQ,EAAA;AACzC,EAAA,OAAO,EAAG,CAAA,MAAA;AAAA,IACR,GAAG,GAAA,CAAI,KAAM,CAAA,CAAA,EAAG,CAAC,CAAA;AAAA,IACjB,GAAG,IAAI,KAAM,CAAA,CAAA,EAAG,IAAI,CAAC,CAAA,CAAE,KAAK,MAAM,CAAA;AAAA,IAClC,GAAG,GAAI,CAAA,KAAA,CAAM,CAAI,GAAA,CAAA,EAAG,IAAI,MAAM,CAAA;AAAA,GAChC,CAAA;AACF,CAAA;AAWgB,SAAA,UAAA,CAAW,KAAK,SAAW,EAAA;AACzC,EAAA,OAAO,GAAI,CAAA,MAAA,CAAO,CAAC,GAAA,EAAK,KAAK,CAAM,KAAA;AACjC,IAAA,MAAM,EAAK,GAAA,IAAA,CAAK,KAAM,CAAA,CAAA,GAAI,SAAS,CAAA,CAAA;AACnC,IAAI,GAAA,CAAA,EAAE,CAAI,GAAA,EAAG,CAAA,MAAA,CAAO,IAAI,EAAE,CAAA,IAAK,EAAC,EAAG,GAAG,CAAA,CAAA;AACtC,IAAO,OAAA,GAAA,CAAA;AAAA,GACT,EAAG,EAAE,CAAA,CAAA;AACP,CAAA;AAGO,SAAS,iBACd,GACA,EAAA,CAAC,IAAM,EAAA,GAAG,UAAU,CACpB,EAAA;AACA,EAAA,OAAO,IAAI,MACP,GAAA;AAAA,IACE,GAAA,CAAI,KAAM,CAAA,CAAA,EAAG,IAAI,CAAA;AAAA,IACjB,GAAG,gBAAiB,CAAA,GAAA,CAAI,KAAM,CAAA,IAAI,GAAG,CAAC,GAAG,UAAY,EAAA,IAAI,CAAC,CAAA;AAAA,MAE5D,EAAC,CAAA;AACP,CAAA;AAYO,SAAS,WAAW,GAAK,EAAA;AAC9B,EAAA,OAAO,GAAI,CAAA,MAAA,CAAO,CAAC,OAAA,EAAS,IAAS,KAAA,CAAC,KAAM,CAAA,QAAA,CAAS,IAAI,CAAC,CAAK,IAAA,OAAA,EAAS,IAAI,CAAA,CAAA;AAC9E,CAAA;AACO,SAAS,UAAU,GAAK,EAAA;AAC7B,EAAO,OAAA,GAAA,CAAI,MAAO,CAAA,CAAC,OAAS,EAAA,IAAA,KAAS,KAAM,CAAA,QAAA,CAAS,IAAI,CAAC,CAAK,IAAA,OAAA,EAAS,IAAI,CAAA,CAAA;AAC7E,CAAA;AAgCgB,SAAA,UAAA,CAAW,GAAY,EAAA,WAAA,EAAqB,OAAmB,EAAA;AAC7E,EAAA,OAAO,GAAI,CAAA,MAAA,CAAO,CAAC,MAAA,EAAQ,OAAO,KAAU,KAAA;AAC1C,IAAM,MAAA,gBAAA,GAAmB,UACrB,CAAC,EAAE,KAAK,KAAM,CAAA,KAAA,GAAQ,WAAW,CAAA,GAAI,CACrC,CAAA,GAAA,KAAA,CAAA;AACJ,IAAA,MAAM,aAAa,KAAQ,GAAA,WAAA,CAAA;AAC3B,IAAA,MAAM,cAAiB,GAAA,gBAAA,GACnB,WAAc,GAAA,CAAA,GAAI,UAClB,GAAA,UAAA,CAAA;AACJ,IAAI,IAAA,CAAC,OAAO,cAAc,CAAA;AAAG,MAAO,MAAA,CAAA,cAAc,IAAI,EAAC,CAAA;AACvD,IAAO,MAAA,CAAA,cAAc,CAAE,CAAA,IAAA,CAAK,KAAK,CAAA,CAAA;AACjC,IAAO,OAAA,MAAA,CAAA;AAAA,GACT,EAAG,EAAE,CAAA,CAAA;AACP;;AC/Ma,MAAA,OAAA,GAAU,EAAE,OAAA,EAAS,IAAK,EAAA;;ACsBhC,MAAM,yBAA4B,GAAA;AAAA,EACvC,OAAS,EAAA,0BAAA;AAAA,EACT,IAAM,EAAA,wBAAA;AACR,CAAA,CAAA;AACO,MAAM,yBAA4B,GAAA;AAAA,EACvC,OAAS,EAAA,0BAAA;AAAA,EACT,IAAM,EAAA,wBAAA;AACR,CAAA,CAAA;AAqqBO,MAAM,cAAiB,GAAA;AAAA,EAC5B,OAAS,EAAA,gBAAA;AAAA,EACT,IAAM,EAAA,oBAAA;AACR,CAAA,CAAA;AAuBO,MAAM,SAAY,GAAA,EAAE,OAAS,EAAA,WAAA,EAAa,MAAM,eAAgB,EAAA;;AC5sBvE,MAAM,eAAgD,GAAA;AAAA,EACpD,oBAAsB,EAAA,KAAA;AAAA,EACtB,YAAc,EAAA,KAAA,CAAA;AAAA,EACd,mBAAmB,EAAC;AAAA,EACpB,eAAe,EAAC;AAAA,EAChB,QAAU,EAAA,KAAA;AAAA,EACV,SAAS,EAAC;AACZ,CAAA,CAAA;AAEA,wBAAe;AAAA,EACb,SAAA;AAAA,EACA,YAAA;AAAA,EACA,mBAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,oBAAA;AAAA,EACA,mBAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,mBAAA;AAAA,EACA,oBAAA;AAAA,EACA,sBAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,mBAAA;AAAA,EACA,oBAAA;AAAA,EACA,iBAAA;AACF,CAAA,CAAA;AAEO,SAAS,oBAAuB,GAAA;AACrC,EAAA,eAAA,CAAgB,oBAAuB,GAAA,IAAA,CAAA;AACzC,CAAA;AAEO,SAAS,mBAAsB,GAAA;AACpC,EAAA,eAAA,CAAgB,oBAAuB,GAAA,KAAA,CAAA;AACzC,CAAA;AAEO,SAAS,eAAkB,GAAA;AAChC,EAAA,OAAO,eAAgB,CAAA,YAAA,CAAA;AACzB,CAAA;AAEO,SAAS,oBAAoB,YAAc,EAAA;AAChD,EAAO,OAAA,eAAA,CAAgB,kBAAkB,YAAY,CAAA,CAAA;AACvD,CAAA;AAEO,SAAS,oBAAuB,GAAA;AACrC,EAAA,OAAO,eAAgB,CAAA,iBAAA,CAAA;AACzB,CAAA;AAEO,SAAS,oBAAoB,gBAAkB,EAAA;AACpD,EAAA,MAAM,eAAe,gBAAkB,EAAA,YAAA,CAAA;AACvC,EAAA,IAAI,YAAc,EAAA;AAChB,IAAgB,eAAA,CAAA,iBAAA,CAAkB,YAAY,CAAI,GAAA,gBAAA,CAAA;AAClD,IAAO,OAAA,EAAE,SAAS,IAAK,EAAA,CAAA;AAAA,GAClB,MAAA;AACL,IAAO,OAAA,EAAE,OAAO,yBAA0B,EAAA,CAAA;AAAA,GAC5C;AACF,CAAA;AAEO,SAAS,gBAAgB,YAAc,EAAA;AAC5C,EAAI,IAAA,eAAA,CAAgB,iBAAkB,CAAA,YAAY,CAAG,EAAA;AACnD,IAAA,eAAA,CAAgB,YAAe,GAAA,YAAA,CAAA;AAC/B,IAAO,OAAA,EAAE,SAAS,IAAK,EAAA,CAAA;AAAA,GAClB,MAAA;AACL,IAAO,OAAA,EAAE,OAAO,yBAA0B,EAAA,CAAA;AAAA,GAC5C;AACF,CAAA;AAEO,SAAS,qBAAqB,iBAAmB,EAAA;AACtD,EAAA,eAAA,CAAgB,iBAAoB,GAAA,iBAAA,CAAA;AACpC,EAAM,MAAA,aAAA,GAAgB,MAAO,CAAA,IAAA,CAAK,iBAAiB,CAAA,CAAA;AACnD,EAAI,IAAA,aAAA,CAAc,WAAW,CAAG,EAAA;AAC9B,IAAgB,eAAA,CAAA,YAAA,GAAe,cAAc,CAAC,CAAA,CAAA;AAAA,GAChD,MAAA,IAAW,CAAC,aAAA,CAAc,MAAQ,EAAA;AAChC,IAAA,eAAA,CAAgB,YAAe,GAAA,KAAA,CAAA,CAAA;AAAA,GACjC;AACF,CAAA;AAEO,SAAS,uBAAuB,YAAc,EAAA;AACnD,EAAA,IAAI,OAAO,YAAiB,KAAA,QAAA;AAAU,IAAO,OAAA,EAAE,OAAO,cAAe,EAAA,CAAA;AACrE,EAAI,IAAA,CAAC,eAAgB,CAAA,iBAAA,CAAkB,YAAY,CAAA;AACjD,IAAO,OAAA,EAAE,OAAO,SAAU,EAAA,CAAA;AAE5B,EAAO,OAAA,eAAA,CAAgB,kBAAkB,YAAY,CAAA,CAAA;AACrD,EAAA,MAAM,aAAgB,GAAA,MAAA,CAAO,IAAK,CAAA,eAAA,CAAgB,iBAAiB,CAAA,CAAA;AACnE,EAAI,IAAA,aAAA,CAAc,WAAW,CAAG,EAAA;AAC9B,IAAgB,eAAA,CAAA,YAAA,GAAe,cAAc,CAAC,CAAA,CAAA;AAAA,GAChD,MAAA,IAAW,CAAC,aAAA,CAAc,MAAQ,EAAA;AAChC,IAAA,eAAA,CAAgB,YAAe,GAAA,KAAA,CAAA,CAAA;AAAA,GACjC;AACA,EAAO,OAAA,EAAE,SAAS,IAAK,EAAA,CAAA;AACzB,CAAA;AAEO,SAAS,iBAAiB,MAAQ,EAAA;AACvC,EAAI,IAAA,OAAO,OAAO,aAAkB,KAAA,QAAA;AAClC,IAAO,OAAA,EAAE,OAAO,cAAe,EAAA,CAAA;AACjC,EAAA,MAAA,CAAO,KAAK,MAAO,CAAA,aAAa,CAAE,CAAA,OAAA,CAAQ,CAAC,YAAiB,KAAA;AAC1D,IAAA,eAAA,CAAgB,aAAc,CAAA,YAAY,CACxC,GAAA,MAAA,CAAO,cAAc,YAAY,CAAA,CAAA;AAAA,GACpC,CAAA,CAAA;AACD,EAAO,OAAA,EAAE,GAAG,OAAQ,EAAA,CAAA;AACtB,CAAA;AAEO,SAAS,mBAAsB,GAAA;AACpC,EAAA,MAAM,SAAS,eAAgB,CAAA,QAAA,CAAA;AAC/B,EAAA,eAAA,CAAgB,QAAW,GAAA,KAAA,CAAA;AAC3B,EAAO,OAAA,MAAA,CAAA;AACT,CAAA;AAEO,SAAS,SAAU,CAAA,EAAE,KAAO,EAAA,OAAA,EAAS,KAAe,EAAA;AACzD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAY,IAAA,OAAO,YAAY,QAAU,EAAA;AAC5D,IAAA,OAAA;AAAA,GACF;AAEA,EAAA,IAAI,CAAC,eAAgB,CAAA,oBAAA;AAAsB,IAAA,eAAA,CAAgB,QAAW,GAAA,IAAA,CAAA;AAEtE,EAAA,IACE,gBAAgB,oBAChB,IAAA,CAAC,eAAgB,CAAA,aAAA,CAAc,KAAK,CACpC,EAAA;AACA,IAAA,OAAA;AAAA,GACF;AAEA,EAAA,IAAI,GAAK,EAAA;AACP,IAAgB,eAAA,CAAA,OAAA,GAAU,gBAAgB,OAAQ,CAAA,MAAA;AAAA,MAChD,CAAC,MAAW,KAAA,EAAE,OAAO,KAAU,KAAA,KAAA,IAAS,OAAO,GAAQ,KAAA,GAAA,CAAA;AAAA,KACzD,CAAA;AAAA,GACF;AAEA,EAAA,eAAA,CAAgB,QAAQ,IAAK,CAAA,EAAE,KAAO,EAAA,OAAA,EAAS,KAAK,CAAA,CAAA;AAEpD,EAAO,OAAA,EAAE,GAAG,OAAQ,EAAA,CAAA;AACtB,CAAA;AAEgB,SAAA,UAAA,CAAW,EAAE,KAAA,EAAyB,EAAA;AACpD,EAAA,MAAM,OAAU,GAAA,eAAA,CAAgB,OAC7B,CAAA,MAAA,CAAO,CAAC,MAAW,KAAA,MAAA,CAAO,KAAU,KAAA,KAAK,CACzC,CAAA,GAAA,CAAI,CAAC,MAAA,KAAW,OAAO,OAAO,CAAA,CAAA;AACjC,EAAA,OAAO,QAAQ,MAAU,IAAA,OAAA,CAAA;AAC3B,CAAA;AAEO,SAAS,aAAgB,GAAA;AAC9B,EAAA,eAAA,CAAgB,UAAU,EAAC,CAAA;AAC7B,CAAA;AAEO,SAAS,YAAa,CAAA,EAAE,KAAO,EAAA,GAAA,EAAyB,EAAA;AAC7D,EAAgB,eAAA,CAAA,OAAA,GAAU,gBAAgB,OAAQ,CAAA,MAAA;AAAA,IAChD,CAAC,YAAY,CAAC,KAAA,IAAS,OAAO,KAAU,KAAA,KAAA,KAAU,OAAO,GAAQ,KAAA,GAAA;AAAA,GACnE,CAAA;AACF,CAAA;AAEO,SAAS,SAAY,GAAA;AAC1B,EAAA,MAAM,MAAS,GAAA,MAAA,CAAO,IAAK,CAAA,eAAA,CAAgB,aAAa,CAAA,CAAA;AACxD,EAAA,OAAO,EAAE,MAAO,EAAA,CAAA;AAClB,CAAA;AAEO,SAAS,YAAa,CAAA,EAAE,KAAO,EAAA,OAAA,EAA6B,EAAA;AACjE,EAAM,MAAA,MAAA,GAAS,eAAgB,CAAA,aAAA,CAAc,KAAK,CAAA,CAAA;AAClD,EAAI,IAAA,MAAA,IAAU,OAAO,MAAA,KAAW,UAAY,EAAA;AAC1C,IAAA,MAAA,CAAO,OAAO,CAAA,CAAA;AAAA,GAChB;AACF,CAAA;AAEO,SAAS,iBAAkB,CAAA;AAAA,EAChC,UAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,GAAA;AACF,CAA0B,EAAA;AACxB,EAAI,IAAA,KAAA,CAAA;AACJ,EAAI,IAAA,OAAO,QAAQ,QAAU,EAAA;AAC3B,IAAA,KAAA,GAAQ,IAAI,WAAY,EAAA,CAAA;AAAA,GAC1B,MAAA,IAAW,eAAe,KAAO,EAAA;AAC/B,IAAA,KAAA,GAAQ,GAAI,CAAA,OAAA,CAAA;AAAA,GACd;AAEA,EAAA,OAAA,CAAQ,IAAI,OAAS,EAAA;AAAA,IACnB,cAAc,eAAgB,EAAA;AAAA,IAC9B,MAAA,EAAQ,IAAK,CAAA,SAAA,CAAU,MAAM,CAAA;AAAA,IAC7B,MAAQ,EAAA,UAAA;AAAA,IACR,UAAA;AAAA,IACA,KAAA;AAAA,GACD,CAAA,CAAA;AACH;;ACxIA,MAAM,WAAgC,GAAA;AAAA,EACpC,wBAA0B,EAAA,OAAA;AAAA,EAC1B,QAAQ,EAAE,OAAA,EAAS,EAAE,WAAA,EAAa,GAAI,EAAA;AAAA,EACtC,SAAA,EAAW,EAAE,YAAA,EAAc,CAAE,EAAA;AAAA,EAC7B,kBAAoB,EAAA;AAAA,IAClB,WAAW,EAAC;AAAA,IACZ,QAAQ,EAAC;AAAA,IACT,QAAQ,EAAC;AAAA,GACX;AAAA,EACA,QAAU,EAAA,IAAA;AACZ,CAAA,CAAA;AAEA,IAAI,oBAA4B,GAAAC,iBAAA,CAAA;AAwDzB,SAAS,cAAc,eAA4B,EAAA;AACxD,EAAA,IAAI,CAAC,eAAA,IAAmB,OAAO,eAAA,KAAoB,QAAU,EAAA;AAC3D,IAAA,OAAO,YAAY,UAAc,IAAA,KAAA,CAAA;AAAA,GAC5B,MAAA;AACL,IAAI,IAAA,OAAO,YAAY,UAAe,KAAA,QAAA;AAAU,MAAO,OAAA,KAAA,CAAA;AACvD,IACE,OAAA,MAAA,CAAO,IAAK,CAAA,eAAe,CAAE,CAAA,KAAA;AAAA,MAC3B,CAAC,GAAQ,KAAA,WAAA,CAAY,aAAa,GAAG,CAAA,KAAM,gBAAgB,GAAG,CAAA;AAAA,SAC3D,WAAY,CAAA,UAAA,CAAA;AAAA,GAErB;AACF,CAAA;AAqFO,SAAS,sBAAsB,KAAe,EAAA;AACnD,EAAA,WAAA,CAAY,UAAU,YAAe,GAAA,KAAA,CAAA;AACvC,CAAA;AAqCO,SAAS,eAAkB,GAAA;AAChC,EAAO,OAAA;AAAA,IACL,SAAS,WAAY,CAAA,QAAA;AAAA,IACrB,GAAG,WAAY,CAAA,kBAAA;AAAA,GACjB,CAAA;AACF,CAAA;AAiFO,SAAS,WAAc,GAAA;AAC5B,EAAO,OAAA,oBAAA,CAAA;AACT;;ACjVO,SAAS,aAAa,KAAO,EAAA;AAClC,EAAA,IAAI,OAAO,KAAU,KAAA,QAAA,IAAY,KAAM,CAAA,OAAA,CAAQ,KAAK,CAAG,EAAA;AACrD,IAAO,OAAA,KAAA,CAAA;AAAA,GACF,MAAA;AACL,IAAA,MAAM,aAAgB,GAAA,MAAA,CAAO,SAAU,CAAA,QAAA,CAAS,KAAK,KAAK,CAAA,CAAA;AAC1D,IAAA,OAAO,aAAkB,KAAA,eAAA,CAAA;AAAA,GAC3B;AACF;;ACjBO,SAAS,aACd,YACA,EAAA,iBAAA,EACA,WACA,EAAA,gBAAA,EACA,YAAY,CACZ,EAAA;AACA,EAAA,IAAI,aAAc,CAAA,YAAA;AAChB,IAAA,OAAO,aAAc,CAAA,YAAA;AAAA,MACnB,YAAA;AAAA,MACA,iBAAA;AAAA,MACA,WAAA;AAAA,MACA,gBAAA;AAAA,KACF,CAAA;AAEF,EAAA,MAAM,WAAW,eAAgB,EAAA,CAAA;AAEjC,EAAA,MAAM,EAAE,SAAW,EAAA,MAAA,EAAQ,QAAQ,QAAS,EAAA,GAAI,YAAY,EAAC,CAAA;AAE7D,EAAA,IACG,CAAC,QAAU,EAAA,OAAA,IAAW,CAAC,WACxB,IAAA,OAAO,iBAAiB,QACxB,IAAA,OAAO,iBAAiB,UACxB,IAAA,YAAA,KAAiB,QAChB,OAAO,QAAA,EAAU,cAAc,QAAY,IAAA,SAAA,IAAa,SAAS,SAClE,EAAA;AACA,IAAO,OAAA,YAAA,CAAA;AAAA,GACT;AAEA,EAAA,MAAM,UAAa,GAAA,aAAA,CAAc,EAAE,YAAA,EAAc,MAAM,CAAA,CAAA;AACvD,EAAA,IAAI,UAAY,EAAA;AACd,IAAA,qBAAA,CAAsB,SAAS,CAAA,CAAA;AAC/B,IAAA,IACE,OAAO,UAAe,KAAA,QAAA,KACrB,aAAa,UAAW,CAAA,kBAAA,IAAsB,OAC5C,UAAW,CAAA,cAAA,IAAkB,cAAc,CAC9C,CAAA,IAAA,UAAA,CAAW,QACV,CAAC,UAAA,CAAW,kBACV,UAAW,CAAA,cAAA,IAAkB,CAAC,WACjC,CAAA,EAAA;AACA,MAAA,OAAA,CAAQ,IAAI,EAAE,UAAA,EAAY,SAAW,EAAA,WAAA,IAAe,YAAY,CAAA,CAAA;AAAA,KAClE;AAAA,GACF;AAEA,EAAA,MAAM,eAAe,KAAM,CAAA,OAAA,CAAQ,YAAY,CAAI,GAAA,KAAK,EAAC,CAAA;AAEzD,EAAA,MAAM,gBAAmB,GAAA,MAAA,CAAO,IAAK,CAAA,YAAY,CAAE,CAAA,MAAA;AAAA,IACjD,CAAC,QACC,CAAC,WAAA,IACD,CAAC,MACA,IAAA,KAAA,CAAM,QAAQ,MAAM,CAAA,IAAK,CAAC,MAAO,CAAA,QAAA,CAAS,GAAG,CAC7C,IAAA,OAAO,WAAW,UAAc,IAAA,CAAC,OAAO,GAAG,CAAA;AAAA,GAChD,CAAA;AAEA,EAAM,MAAA,cAAA,GAAiB,CAAC,GAAA,EAAK,KAAU,KAAA;AACrC,IAAa,YAAA,CAAA,GAAG,CACd,GAAA,OAAO,KAAO,EAAA,QAAA,KAAa,UACvB,GAAA,KAAA,CAAM,QAAS,EAAA,GACf,IAAK,CAAA,SAAA,CAAU,KAAK,CAAA,CAAA;AAAA,GAC5B,CAAA;AAEA,EAAA,KAAA,MAAW,OAAO,gBAAkB,EAAA;AAClC,IAAM,MAAA,KAAA,GAAQ,aAAa,GAAG,CAAA,CAAA;AAC9B,IAAA,MAAM,YACJ,OAAO,QAAA,KAAa,UAAa,GAAA,QAAA,CAAS,KAAK,CAAI,GAAA,KAAA,CAAA,CAAA;AACrD,IAAA,IAAI,cAAc,KAAW,CAAA,EAAA;AAC3B,MAAA,YAAA,CAAa,GAAG,CAAI,GAAA,SAAA,CAAA;AAAA,eAEpB,iBACA,IAAA,GAAA,KAAQ,gBACR,KAAM,CAAA,OAAA,CAAQ,KAAK,CACnB,EAAA;AACA,MAAM,MAAA,oBAAA,GAAuB,uBAAuB,KAAK,CAAA,CAAA;AACzD,MAAO,MAAA,CAAA,MAAA,CAAO,YAAc,EAAA,GAAG,oBAAoB,CAAA,CAAA;AAAA,KACrD,MAAA,IAAW,gBAAoB,IAAA,GAAA,KAAQ,YAAc,EAAA;AACnD,MAAa,YAAA,CAAA,GAAG,IAAI,EAAC,CAAA;AAAA,KACvB,MAAA,IAAW,MAAM,OAAQ,CAAA,SAAS,KAAK,SAAU,CAAA,QAAA,CAAS,GAAG,CAAG,EAAA;AAC9D,MAAA,cAAA,CAAe,KAAK,KAAK,CAAA,CAAA;AAAA,KAEzB,MAAA,IAAA,KAAA,CAAM,OAAQ,CAAA,MAAM,CACpB,IAAA,MAAA,CAAO,QAAS,CAAA,GAAG,CACnB,IAAA,OAAO,KAAO,EAAA,MAAA,KAAW,UACzB,EAAA;AACA,MAAa,YAAA,CAAA,GAAG,CAAI,GAAA,KAAA,CAAM,MAAO,EAAA,CAAA;AAAA,KACnC,MAAA,IAAW,UAAU,IAAM,EAAA;AACzB,MAAA,YAAA,CAAa,GAAG,CAAI,GAAA,KAAA,CAAA,CAAA;AAAA,KACtB,MAAA,IAAW,YAAa,CAAA,KAAK,CAAG,EAAA;AAC9B,MAAA,YAAA,CAAa,GAAG,CAAI,GAAA,IAAI,IAAK,CAAA,KAAK,EAAE,WAAY,EAAA,CAAA;AAAA,KAC3C,MAAA;AACL,MAAA,YAAA,CAAa,GAAG,CAAI,GAAA,YAAA;AAAA,QAClB,KAAA;AAAA,QACA,iBAAA;AAAA,QACA,WAAA;AAAA,QACA,gBAAA;AAAA,QACA,SAAY,GAAA,CAAA;AAAA,OACd,CAAA;AAAA,KACF;AAAA,GACF;AAEA,EAAO,OAAA,YAAA,CAAA;AACT,CAAA;AAEO,SAAS,uBAAuB,UAAY,EAAA;AACjD,EAAO,OAAA,UAAA,EACH,GAAI,CAAA,CAAC,SAAc,KAAA;AACnB,IAAM,MAAA,EAAE,IAAM,EAAA,KAAA,EAAU,GAAA,SAAA,CAAA;AACxB,IAAO,OAAA,IAAA,IAAQ,SAAS,EAAE,CAAC,IAAI,IAAI,CAAA,CAAE,GAAG,KAAM,EAAA,CAAA;AAAA,GAC/C,CACA,CAAA,MAAA,CAAO,OAAO,CAAA,CAAA;AACnB;;AC7GO,SAAS,gBAAiB,CAAA,EAAE,OAAS,EAAA,QAAA,EAAY,EAAA;AACtD,EAAA,IAAI,OAAO,QAAa,KAAA,QAAA;AAAU,IAAO,OAAA,EAAE,MAAQ,EAAA,EAAG,EAAA,CAAA;AACtD,EAAM,MAAA,aAAA,GAAgB,aAAa,OAAO,CAAA,CAAA;AAC1C,EAAM,MAAA,UAAA,GAAa,QAAS,CAAA,KAAA,CAAM,GAAG,CAAA,CAAA;AAErC,EAAA,MAAM,SAAgB,EAAC,CAAA;AACvB,EAAI,IAAA,KAAA,CAAA;AACJ,EAAY,WAAA,CAAA,EAAE,aAAe,EAAA,UAAA,EAAY,CAAA,CAAA;AAEzC,EAAM,MAAA,MAAA,GAAc,EAAE,KAAM,EAAA,CAAA;AAC5B,EAAA,IAAI,MAAO,CAAA,MAAA;AAAQ,IAAA,MAAA,CAAO,MAAS,GAAA,MAAA,CAAA;AACnC,EAAO,OAAA,MAAA,CAAA;AAEP,EAAA,SAAS,WAAY,CAAA;AAAA,IACnB,aAAAC,EAAAA,cAAAA;AAAA,IACA,UAAA,EAAAC,cAAa,EAAC;AAAA,IACd,qBAAA;AAAA,GACkB,EAAA;AAClB,IAAA,KAAA,MAAW,CAAC,KAAO,EAAA,SAAS,CAAKA,IAAAA,WAAAA,CAAW,SAAW,EAAA;AACrD,MAAID,IAAAA,cAAAA,GAAgB,SAAS,CAAG,EAAA;AAC9B,QAAA,MAAM,aAAgBC,GAAAA,WAAAA,CAAW,KAAM,CAAA,KAAA,GAAQ,CAAC,CAAA,CAAA;AAChD,QAAI,IAAA,CAAC,cAAc,MAAQ,EAAA;AACzB,UAAA,IAAI,CAAC,KAAA;AAAO,YAAA,KAAA,GAAQD,eAAc,SAAS,CAAA,CAAA;AAC3C,UAAA,IAAI,CAAC,MAAO,CAAA,QAAA,CAASA,cAAc,CAAA,SAAS,CAAC,CAAG,EAAA;AAC9C,YAAO,MAAA,CAAA,IAAA,CAAKA,cAAc,CAAA,SAAS,CAAC,CAAA,CAAA;AAAA,WACtC;AAAA,mBACS,KAAM,CAAA,OAAA,CAAQA,cAAc,CAAA,SAAS,CAAC,CAAG,EAAA;AAClD,UAAME,MAAAA,OAAAA,GAASF,eAAc,SAAS,CAAA,CAAA;AACtC,UAAAE,OAAO,CAAA,OAAA;AAAA,YAAQ,CAAC,iBACd,WAAY,CAAA;AAAA,cACV,aAAe,EAAA,YAAA;AAAA,cACf,UAAY,EAAA,aAAA;AAAA,aACb,CAAA;AAAA,WACH,CAAA;AAAA,SACK,MAAA;AACL,UAAAF,cAAAA,GAAgBA,eAAc,SAAS,CAAA,CAAA;AACvC,UAAA,UAAA,CAAW,EAAE,aAAA,EAAAA,cAAe,EAAA,KAAA,EAAO,CAAA,CAAA;AAAA,SACrC;AAAA,OACF;AAAA,KACF;AAEA,IAAA,SAAS,UAAW,CAAA,EAAE,aAAAA,EAAAA,cAAAA,EAAe,OAAS,EAAA;AAC5C,MAAA,IACEA,cACA,IAAA,KAAA,KAAUC,WAAW,CAAA,MAAA,GAAS,CAC9B,IAAA,CAAC,QAAU,EAAA,QAAQ,CAAE,CAAA,QAAA,CAAS,OAAOD,cAAa,CAClD,EAAA;AACA,QAAA,MAAM,iBAAiB,qBACnBA,GAAAA,cAAAA,CAAc,KAAM,CAAA,CAAA,EAAG,qBAAqB,CAC5CA,GAAAA,cAAAA,CAAAA;AAEJ,QAAA,IAAI,KAAO,EAAA;AACT,UAAA,IAAI,CAAC,MAAA,CAAO,QAAS,CAAA,cAAc,CAAG,EAAA;AACpC,YAAA,MAAA,CAAO,KAAK,cAAc,CAAA,CAAA;AAAA,WAC5B;AAAA,SACK,MAAA;AACL,UAAQ,KAAA,GAAA,cAAA,CAAA;AACR,UAAA,MAAA,CAAO,KAAK,cAAc,CAAA,CAAA;AAAA,SAC5B;AAAA,OACF;AAAA,KACF;AAAA,GACF;AACF;;AC/DO,SAAS,SAAS,GAAK,EAAA;AAC5B,EAAO,OAAA,GAAA,KAAQ,IAAQ,IAAA,OAAO,GAAQ,KAAA,QAAA,CAAA;AACxC,CAAA;AAoBgB,SAAA,SAAA,CAAU,aAAa,SAAW,EAAA;AAChD,EAAI,IAAA,CAAC,KAAM,CAAA,OAAA,CAAQ,WAAW,CAAA;AAAG,IAAA,OAAO,EAAC,CAAA;AAEzC,EAAA,OAAO,MAAO,CAAA,MAAA;AAAA,IACZ,EAAC;AAAA,IACD,GAAA,CAAI,eAAe,EAAC,EACjB,OAAO,QAAQ,CAAA,CACf,GAAI,CAAA,CAAC,GAAQ,KAAA;AACZ,MACE,OAAA,GAAA,CAAI,SAAS,CAAK,IAAA;AAAA,QAChB,CAAC,GAAA,CAAI,SAAS,CAAC,GAAG,GAAA;AAAA,OACpB,CAAA;AAAA,KAEH,CACA,CAAA,MAAA,CAAO,OAAO,CAAA;AAAA,GACnB,CAAA;AACF,CAAA;AAGO,MAAM,qBAAqB,CAAC,CAAA,KAAM,CAAC,CAAA,KACxC,OAAO,IAAK,CAAA,CAAC,CAAE,CAAA,KAAA,CAAM,CAAC,GAAQ,KAAA,CAAA,CAAE,GAAG,CAAM,KAAA,CAAA,CAAE,GAAG,CAAC,EAAA;AAK1C,MAAM,oBAAoB,CAAC,QAAA,KAAa,CAAC,OAC9C,KAAA,CAAC,YAAY,OAAO,OAAA,KAAY,QAC5B,GAAA,KAAA,CAAA,GACC,MAAM,OAAQ,CAAA,QAAQ,KACrB,QAAS,CAAA,GAAA,CAAI,CAAC,CAAO,MAAA;AAAA,EACnB,CAAC,CAAC,GAAG,gBAAA,CAAiB,EAAE,OAAS,EAAA,QAAA,EAAU,CAAE,EAAC,CAAG,EAAA,KAAA;AACnD,CAAE,CAAA,CAAA,IACH,OAAO,QAAA,KAAa,QACnB,IAAA,MAAA,CAAO,KAAK,QAAQ,CAAA,CAAE,GAAI,CAAA,CAAC,GAAS,MAAA;AAAA,EAClC,CAAC,GAAG,GAAG,gBAAA,CAAiB,EAAE,OAAS,EAAA,QAAA,EAAU,GAAI,EAAC,CAAG,EAAA,KAAA;AACvD,CAAE,CAAA,CAAA,IAAA,CACH,OAAO,QAAa,KAAA,QAAA,IAAY,iBAAiB,EAAE,OAAA,EAAS,QAAS,EAAC,CACnE,GAAA,MAAA;AAEH,SAAS,iBACd,CAAA,GAAA,EACA,WACA,EAAA,iBAAA,EACA,OACA,EAAA;AACA,EAAI,IAAA,OAAO,GAAQ,KAAA,QAAA,IAAY,GAAQ,KAAA,IAAA;AAAM,IAAO,OAAA,GAAA,CAAA;AACpD,EAAA,MAAM,WAAW,eAAgB,EAAA,CAAA;AACjC,EAAA,IAAI,CAAC,QAAU,EAAA,OAAA;AAAS,IAAU,OAAA,GAAA,IAAA,CAAA;AAElC,EAAA,MAAM,YAAsB,GAAA,CAAC,EAAI,EAAA,KAAA,CAAA,EAAW,IAAI,CAAA,CAAA;AAChD,EAAI,IAAA,WAAA;AAAa,IAAA,YAAA,CAAa,KAAK,KAAK,CAAA,CAAA;AAExC,EAAA,MAAM,WAAc,GAAA,MAAA,CAAO,IAAK,CAAA,GAAG,CAAE,CAAA,MAAA;AAAA,IACnC,CAAC,QACC,CAAC,YAAA,CAAa,SAAS,GAAI,CAAA,GAAG,CAAC,CAC9B,KAAA,CAAC,sBAAsB,KAAM,CAAA,OAAA,CAAQ,IAAI,GAAG,CAAC,IAAI,GAAI,CAAA,GAAG,EAAE,MAAS,GAAA,IAAA,CAAA,CAAA;AAAA,GACxE,CAAA;AAEA,EAAA,OAAO,MAAO,CAAA,MAAA;AAAA,IACZ,EAAC;AAAA,IACD,GAAG,WAAA,CAAY,GAAI,CAAA,CAAC,GAAQ,KAAA;AAC1B,MAAA,OAAO,KAAM,CAAA,OAAA,CAAQ,GAAI,CAAA,GAAG,CAAC,CACzB,GAAA;AAAA,QACE,CAAC,GAAG,GAAG,OAAA,GACH,IAAI,GAAG,CAAA,GACP,GAAI,CAAA,GAAG,EAAE,GAAI,CAAA,CAAC,CAAM,KAAA,iBAAA,CAAkB,CAAC,CAAC,CAAA;AAAA,OAE9C,GAAA,EAAE,CAAC,GAAG,GAAG,OAAA,GAAU,GAAI,CAAA,GAAG,CAAI,GAAA,iBAAA,CAAkB,GAAI,CAAA,GAAG,CAAC,CAAE,EAAA,CAAA;AAAA,KAC/D,CAAA;AAAA,GACH,CAAA;AACF,CAAA;AAGgB,SAAA,eAAA,CAAgB,KAAa,OAAmB,EAAA;AAC9D,EAAA,IAAI,GAAQ,KAAA,KAAA,CAAA;AAAW,IAAO,OAAA,IAAA,CAAA;AAC9B,EAAI,IAAA,OAAO,GAAQ,KAAA,QAAA,IAAY,GAAQ,KAAA,IAAA;AAAM,IAAO,OAAA,GAAA,CAAA;AAEpD,EAAM,MAAA,WAAA,GAAc,MAAO,CAAA,IAAA,CAAK,GAAG,CAAA,CAAA;AACnC,EAAA,MAAM,OAAU,GAAA,CAAC,KAAW,KAAA,KAAA,KAAU,SAAY,IAAO,GAAA,KAAA,CAAA;AAEzD,EAAA,OAAO,MAAO,CAAA,MAAA;AAAA,IACZ,EAAC;AAAA,IACD,GAAG,WAAA,CAAY,GAAI,CAAA,CAAC,GAAQ,KAAA;AAC1B,MAAA,OAAO,KAAM,CAAA,OAAA,CAAQ,GAAI,CAAA,GAAG,CAAC,CACzB,GAAA;AAAA,QACE,CAAC,GAAG,GAAG,OAAA,GAAU,IAAI,GAAG,CAAA,GAAI,GAAI,CAAA,GAAG,EAAE,GAAI,CAAA,CAAC,CAAM,KAAA,eAAA,CAAgB,CAAC,CAAC,CAAA;AAAA,OAEpE,GAAA,EAAE,CAAC,GAAG,GAAG,OAAU,GAAA,OAAA,CAAQ,GAAI,CAAA,GAAG,CAAC,CAAI,GAAA,eAAA,CAAgB,GAAI,CAAA,GAAG,CAAC,CAAE,EAAA,CAAA;AAAA,KACtE,CAAA;AAAA,GACH,CAAA;AACF,CAAA;AAEA,SAAS,UAAU,CAAG,EAAA;AACpB,EAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,CAAC,CAAG,EAAA;AACpB,IAAA,OAAO,CAAE,CAAA,MAAA,GAAS,CAAE,CAAA,GAAA,CAAI,SAAS,CAAA,CAAE,MAAO,CAAA,CAAC,CAAG,EAAA,CAAA,KAAM,CAAI,GAAA,CAAA,EAAG,CAAC,CAAA,CAAA;AAAA,GACnD,MAAA,IAAA,OAAO,CAAM,KAAA,QAAA,IAAY,MAAM,IAAM,EAAA;AAC9C,IACE,OAAA,MAAA,CAAO,IAAK,CAAA,CAAC,CAAE,CAAA,MAAA,GACf,OAAO,IAAK,CAAA,CAAC,CACV,CAAA,GAAA,CAAI,CAAC,CAAA,KAAM,UAAU,CAAE,CAAA,CAAC,CAAC,CAAC,CAC1B,CAAA,MAAA,CAAO,CAAC,CAAG,EAAA,CAAA,KAAM,CAAI,GAAA,CAAA,EAAG,CAAC,CAAA,CAAA;AAAA,GAEhC;AACA,EAAO,OAAA,CAAA,CAAA;AACT,CAAA;AAEO,SAAS,iBAAiB,CAAG,EAAA;AAClC,EAAI,IAAA,CAAA,KAAM,IAAQ,IAAA,OAAO,CAAM,KAAA,QAAA;AAAU,IAAO,OAAA,KAAA,CAAA,CAAA;AAChD,EAAM,MAAA,GAAA,GAAM,IAAK,CAAA,SAAA,CAAU,CAAC,CAAA,CAAA;AAC5B,EAAM,MAAA,QAAA,GAAW,UAAU,CAAC,CAAA,CAAA;AAC5B,EAAA,MAAM,OAAU,GAAA,GAAA,CAAI,KAAM,CAAA,EAAE,EAAE,MAAO,CAAA,CAAC,CAAG,EAAA,CAAA,KAAM,CAAI,GAAA,CAAA,CAAE,UAAW,CAAA,CAAC,GAAG,CAAC,CAAA,CAAA;AACrE,EAAA,OAAO,CAAC,GAAA,CAAI,MAAQ,EAAA,QAAA,EAAU,OAAO,CAAE,CAAA,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,QAAS,CAAA,EAAE,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA,CAAA;AAC3E;;AC5IO,SAAS,gBAAgB,MAAmB,EAAA;AACjD,EAAA,IAAI,MAAW,KAAA,IAAA;AAAM,IAAA,OAAO,EAAC,CAAA;AAC7B,EAAA,MAAM,EAAE,MAAA,EAAQ,QAAS,EAAA,GAAI,UAAU,EAAC,CAAA;AACxC,EAAA,IAAI,CAAC,QAAA;AAAU,IAAO,OAAA,MAAA,CAAA;AAEtB,EAAA,MAAM,SAAS,EAAC,CAAA;AAChB,EAAc,aAAA,CAAA,MAAA,EAAQ,UAAU,MAAM,CAAA,CAAA;AAEtC,EAAO,OAAA,MAAA,CAAA;AAEP,EAAS,SAAA,aAAA,CAAc,YAAc,EAAA,cAAA,EAAgB,YAAc,EAAA;AACjE,IAAI,IAAA,CAAC,gBAAgB,CAAC,cAAA;AAAgB,MAAO,OAAA,KAAA,CAAA,CAAA;AAC7C,IAAM,MAAA,KAAA,GAAQ,MAAO,CAAA,IAAA,CAAK,YAAY,CAAA,CAAA;AACtC,IAAM,MAAA,KAAA,GAAQ,MAAO,CAAA,IAAA,CAAK,cAAc,CAAA,CAAA;AAGxC,IAAA,MAAM,QAAQ,MAAO,CAAA,MAAA;AAAA,MACnB,EAAC;AAAA,MACD,GAAG,KAAA,CACA,MAAO,CAAA,CAAC,GAAQ,KAAA,GAAA,CAAI,OAAQ,CAAA,IAAI,CAAC,CAAA,CACjC,GAAI,CAAA,CAAC,GAAQ,KAAA,GAAA,CAAI,KAAM,CAAA,IAAI,CAAE,CAAA,GAAA,CAAI,CAAC,EAAA,MAAQ,EAAE,CAAC,EAAE,GAAG,GAAI,EAAA,CAAE,CAAC,CAAA,CACzD,IAAK,EAAA;AAAA,KACV,CAAA;AACA,IAAA,MAAM,UAAU,KAAM,CAAA,MAAA,CAAO,GAAG,MAAO,CAAA,IAAA,CAAK,KAAK,CAAC,CAAA,CAAA;AAClD,IAAM,MAAA,QAAA,GAAW,OAAQ,CAAA,QAAA,CAAS,GAAG,CAAA,CAAA;AAErC,IAAA,KAAA,MAAW,QAAQ,KAAO,EAAA;AACxB,MAAA,IAAI,OAAQ,CAAA,OAAA,CAAQ,IAAI,CAAA,IAAK,KAAK,QAAU,EAAA;AAC1C,QAAM,MAAA,WAAA,GAAc,KAAM,CAAA,IAAI,CAAK,IAAA,IAAA,CAAA;AACnC,QAAM,MAAA,IAAA,GAAO,cAAe,CAAA,WAAW,CAAK,IAAA,QAAA,CAAA;AAC5C,QAAM,MAAA,IAAA,GAAO,aAAa,IAAI,CAAA,CAAA;AAE9B,QACE,IAAA,OAAO,IAAS,KAAA,QAAA,IAChB,OAAO,IAAA,KAAS,cAChB,CAAC,KAAA,CAAM,OAAQ,CAAA,IAAI,CACnB,EAAA;AACA,UAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,IAAI,CAAG,EAAA;AACvB,YAAA,MAAM,cAAiB,GAAA,IAAA,CACpB,GAAI,CAAA,CAAC,WAAgB,KAAA;AACpB,cAAA,MAAMG,UAAS,EAAC,CAAA;AAChB,cAAA,MAAM,MAAS,GAAA,aAAA,CAAc,WAAa,EAAA,IAAA,EAAMA,OAAM,CAAA,CAAA;AACtD,cAAO,OAAA,MAAA,KAAW,QAAQA,OAAS,GAAA,KAAA,CAAA,CAAA;AAAA,aACpC,CACA,CAAA,MAAA,CAAO,OAAO,CAAA,CAAA;AACjB,YAAA,YAAA,CAAa,IAAI,CAAI,GAAA,cAAA,CAAA;AAAA,qBACZ,IAAM,EAAA;AACf,YAAa,YAAA,CAAA,IAAI,IAAI,EAAC,CAAA;AACtB,YAAA,aAAA,CAAc,IAAM,EAAA,IAAA,EAAM,YAAa,CAAA,IAAI,CAAC,CAAA,CAAA;AAAA,WAC9C;AAAA,SACK,MAAA;AACL,UAAM,MAAA,KAAA,GAAQ,aAAa,IAAI,CAAA,CAAA;AAC/B,UAAM,MAAA,OAAA,GAAU,MAAM,OAAQ,CAAA,IAAI,KAAK,CAAC,IAAA,CAAK,SAAS,KAAK,CAAA,CAAA;AAC3D,UAAI,IAAA,OAAA;AAAS,YAAO,OAAA,KAAA,CAAA;AAEpB,UAAA,IACE,eAAe,IAAI,CAAA,IAClB,YAAY,cAAe,CAAA,IAAI,MAAM,KACtC,EAAA;AACA,YAAA,YAAA,CAAa,IAAI,CAAI,GAAA,KAAA,CAAA;AAAA,WACvB;AAAA,SACF;AAAA,OACF;AAAA,KACF;AACA,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACT;AACF;;ACnEgB,SAAA,gBAAA,CAAiB,QAAgB,CAAW,EAAA;AAC1D,EAAM,MAAA,MAAA,uBAAa,IAAK,EAAA,CAAA;AACxB,EAAA,MAAA,CAAO,QAAS,CAAA,MAAA,CAAO,QAAS,EAAA,GAAI,KAAK,CAAA,CAAA;AACzC,EAAO,OAAA,MAAA,CAAO,SAAU,CAAA,QAAA,CAAS,EAAE,CAAE,CAAA,KAAA,CAAM,CAAE,CAAA,CAAA,CAAE,WAAY,EAAA,CAAA;AAC7D;;ACuBgB,SAAA,QAAA,CAAS,aAAc,MAAS,EAAA;AAC9C,EAAI,IAAA,MAAA,IAAU,OAAO,MAAW,KAAA,QAAA;AAAU,IAAO,OAAA,cAAA,CAAA;AAEjD,EAAA,IAAI,EAAE,eAAkB,GAAA,EAAG,EAAA,GAAI,UAAU,EAAC,CAAA;AAE1C,EAAM,MAAA;AAAA,IACJ,yBAAA;AAAA,IACA,gBAAmB,GAAA,IAAA;AAAA,IACnB,qBAAA;AAAA,IACA,kBAAA;AAAA,IACA,aAAA;AAAA,IAEA,kBAAkB,EAAC;AAAA,IACnB,cAAc,EAAC;AAAA,IACf,YAAY,EAAC;AAAA,IACb,YAAY,EAAC;AAAA,IACb,UAAU,EAAC;AAAA,IAEX,SAAY,GAAA,GAAA;AAAA,IACZ,YAAe,GAAA,GAAA;AAAA,IACf,SAAY,GAAA,MAAA;AAAA,IACZ,SAAY,GAAA,GAAA;AAAA,GACd,GAAI,UAAU,EAAC,CAAA;AAEf,EAAA,IACE,CAAC,KAAA,CAAM,OAAQ,CAAA,WAAW,KAC1B,CAAC,KAAA,CAAM,OAAQ,CAAA,eAAe,KAC9B,OAAO,OAAA,KAAY,QACnB,IAAA,OAAO,cAAc,QACrB,IAAA,OAAO,eAAoB,KAAA,QAAA,IAC3B,OAAO,WAAgB,KAAA,QAAA,IACvB,OAAO,SAAA,KAAc,YACrB,OAAO,YAAA,KAAiB,QACxB,IAAA,OAAO,cAAc,QACrB,IAAA,OAAO,SAAc,KAAA,QAAA,IACrB,OAAO,SAAc,KAAA,QAAA;AAErB,IAAO,OAAA,cAAA,CAAA;AAGT,EAAA,eAAA,GAAkB,MAAO,CAAA,MAAA;AAAA,IACvB,EAAC;AAAA,IACD,GAAG,OAAO,IAAK,CAAA,eAAe,EAC3B,OAAQ,EAAA,CACR,GAAI,CAAA,CAAC,GAAS,MAAA;AAAA,MACb,CAAC,GAAG,GAAG,KAAM,CAAA,OAAA,CAAQ,eAAgB,CAAA,GAAG,CAAC,CAAA,GACrC,eAAgB,CAAA,GAAG,CACnB,GAAA;AAAA;AAAA,QAEE,OAAO,eAAgB,CAAA,GAAG,CAAM,KAAA,QAAA,IAAY,gBAAgB,GAAG,CAAA;AAAA,OACjE,CAAE,OAAO,OAAO,CAAA;AAAA,KACpB,CAAA,CAAA;AAAA,GACN,CAAA;AAEA,EAAM,MAAA,SAAA,GAAY,WACf,CAAA,MAAA,CAAO,OAAO,CAAA,CACd,GAAI,CAAA,CAAC,GAAQ,KAAA,WAAA,CAAY,GAAK,EAAA,SAAS,CAAC,CAAA,CAAA;AAE3C,EAAA,MAAM,gBAAmB,GAAA,MAAA,CAAO,MAAO,CAAA,eAAe,EAAE,IAAK,EAAA,CAAA;AAC7D,EAAI,IAAA,yBAAA;AAA2B,IAAgB,eAAA,CAAA,IAAA,CAAK,GAAG,gBAAgB,CAAA,CAAA;AAEvE,EAAA,MAAM,YAAY,SACf,CAAA,MAAA;AAAA,IACC,CAAC,UAAY,EAAA,GAAA,KACX,MAAO,CAAA,IAAA,CAAK,GAAG,CAAE,CAAA,KAAA;AAAA,MACf,CAAC,GAAS,KAAA,CAAC,UAAW,CAAA,QAAA,CAAS,GAAG,CAAK,IAAA,UAAA,CAAW,IAAK,CAAA,GAAG,CAAM,IAAA,IAAA;AAAA,KAC7D,IAAA,UAAA;AAAA,IACP,EAAC;AAAA,GACH,CACC,MAAO,CAAA,CAAC,GAAQ,KAAA,CAAC,iBAAiB,MAAU,IAAA,eAAA,CAAgB,QAAS,CAAA,GAAG,CAAC,CAAA,CAAA;AAE5E,EAAA,MAAM,cAAc,MAAO,CAAA,MAAA;AAAA,IACzB,EAAC;AAAA,IACD,GAAG,MAAO,CAAA,IAAA,CAAK,eAAe,CAAA,CAC3B,SACA,CAAA,GAAA;AAAA,MAAI,CAAC,SAAA,KACJ,eAAgB,CAAA,SAAS,EACtB,GAAI,CAAA,CAAC,KAAW,MAAA,EAAE,CAAC,KAAK,GAAG,SAAU,EAAA,CAAE,EACvC,IAAK,EAAA;AAAA,MAET,IAAK,EAAA;AAAA,GACV,CAAA;AAEA,EAAA,MAAM,WAAc,GAAA,CAAC,CAAG,EAAA,CAAA,KACtB,CAAC,MAAQ,EAAA,SAAA,GACL,CACC,GAAA,MAAA,CAAO,SAAU,CAAA,QAAA,CAAS,CAAC,CAAA,IAC1B,OAAO,SAAU,CAAA,QAAA,CAAS,CAAC,CAAA,IAC3B,MAAO,CAAA,SAAA,CAAU,OAAQ,CAAA,CAAC,IAAI,MAAO,CAAA,SAAA,CAAU,OAAQ,CAAA,CAAC,KACzD,CAAC,MAAA,CAAO,SAAU,CAAA,QAAA,CAAS,CAAC,CAAK,IAAA,CAAA,CAAA,CAAA;AAExC,EAAA,MAAM,mBAAsB,GAAA,SAAA,CACzB,MAAO,CAAA,CAAC,KAAK,GAAQ,KAAA;AACpB,IAAM,MAAA,SAAA,GAAY,YAAY,GAAG,CAAA,CAAA;AACjC,IAAA,IAAI,SAAW,EAAA;AACb,MAAI,IAAA,CAAC,GAAI,CAAA,QAAA,CAAS,SAAS,CAAA;AAAG,QAAA,GAAA,CAAI,KAAK,SAAS,CAAA,CAAA;AAAA,KAC3C,MAAA;AACL,MAAA,GAAA,CAAI,KAAK,GAAG,CAAA,CAAA;AAAA,KACd;AACA,IAAO,OAAA,GAAA,CAAA;AAAA,GACN,EAAA,EAAE,CAAA,CACJ,KAAK,WAAW,CAAA,CAAA;AAEnB,EAAO,MAAA,CAAA,IAAA,CAAK,SAAS,CAAE,CAAA,OAAA;AAAA,IACrB,CAAC,eACC,CAAC,mBAAA,CAAoB,SAAS,UAAU,CAAA,IACxC,mBAAoB,CAAA,OAAA,CAAQ,UAAU,CAAA;AAAA,GAC1C,CAAA;AAEA,EAAO,MAAA,CAAA,IAAA,CAAK,eAAe,CAAE,CAAA,OAAA;AAAA,IAC3B,CAAC,eACC,CAAC,mBAAA,CAAoB,SAAS,UAAU,CAAA,IACxC,mBAAoB,CAAA,OAAA,CAAQ,UAAU,CAAA;AAAA,GAC1C,CAAA;AAEA,EAAA,OAAO,OAAY,KAAA,QAAA,IACjB,MAAO,CAAA,IAAA,CAAK,OAAO,CAAE,CAAA,OAAA;AAAA,IACnB,CAAC,eACC,CAAC,mBAAA,CAAoB,SAAS,UAAU,CAAA,IACxC,mBAAoB,CAAA,OAAA,CAAQ,UAAU,CAAA;AAAA,GAC1C,CAAA;AAEF,EAAI,IAAA,eAAA,GAAkB,oBAAoB,GAAI,CAAA,CAAC,QAAQ,SAAU,CAAA,GAAG,KAAK,GAAG,CAAA,CAAA;AAE5E,EAAI,IAAA,aAAA;AAAe,IAAA,OAAO,CAAC,eAAe,CAAA,CAAA;AAE1C,EAAM,MAAA,aAAA,GAAgB,CAAC,KAAU,KAAA,CAAA,EAAG,SAAS,CAAG,EAAA,KAAK,GAAG,SAAS,CAAA,CAAA,CAAA;AAEjE,EAAA,MAAM,oBAA8B,EAAC,CAAA;AACrC,EAAM,MAAA,UAAA,GAAa,CAAC,GAAQ,KAAA;AAC1B,IAAA,OAAO,MAAO,CAAA,MAAA;AAAA,MACZ,mBAAoB,CAAA,MAAA,CAAO,CAAC,UAAA,EAAY,YAAY,WAAgB,KAAA;AAClE,QAAM,MAAA,SAAA,GAAY,gBAAgB,UAAU,CAAA,CAAA;AAC5C,QAAA,MAAM,SACH,SAAW,EAAA,MAAA,GACR,IAAI,SAAU,CAAA,IAAA,CAAK,CAAC,QAAa,KAAA,GAAA,CAAI,QAAQ,CAAC,CAAC,CAC/C,GAAA,GAAA,CAAI,UAAU,CAClB,KAAA,OAAA,GAAU,UAAU,CACpB,IAAA,EAAA,CAAA;AAEF,QAAA,MAAM,WAAc,GAAA,SAAA,CAAU,UAAU,CAAA,GAAI,KAAK,CAAK,IAAA,KAAA,CAAA;AACtD,QAAM,MAAA,OAAA,GACJ,OAAO,WAAA,CAAY,UAAU,CAAA,KAAM,aAC/B,WAAY,CAAA,UAAU,CAAE,CAAA,WAAW,CACnC,GAAA,WAAA,CAAA;AACN,QAAW,UAAA,CAAA,UAAU,CAAI,GAAA,aAAA,CAAc,OAAO,CAAA,CAAA;AAC9C,QAAA,IAAI,OAAS,EAAA;AACX,UAAA,iBAAA,CAAkB,WAAW,CAAA,GAAA,CAC1B,iBAAkB,CAAA,WAAW,KAAK,CAAK,IAAA,CAAA,CAAA;AAAA,SAC5C;AACA,QAAO,OAAA,UAAA,CAAA;AAAA,OACT,EAAG,EAAE,CAAA;AAAA,KACP,CAAA;AAAA,GACF,CAAA;AAEA,EAAI,IAAA,aAAA,GAAgB,SAAU,CAAA,GAAA,CAAI,UAAU,CAAA,CAAA;AAE5C,EAAA,MAAM,kBACJ,kBACA,IAAA,CAAC,GAAG,iBAAiB,EAClB,GAAI,CAAA,CAAC,KAAO,EAAA,KAAA,KAAU,CAAC,KAAS,IAAA,KAAK,EACrC,MAAO,CAAA,SAAS,EAChB,OAAQ,EAAA,CAAA;AAEb,EAAA,IAAI,eAAiB,EAAA;AACnB,IAAA,MAAM,KAAQ,GAAA,CAAC,GACb,KAAA,GAAA,CAAI,MAAO,CAAA,CAAC,CAAG,EAAA,KAAA,KAAU,CAAC,eAAA,CAAgB,QAAS,CAAA,KAAK,CAAC,CAAA,CAAA;AAC3D,IAAgB,aAAA,GAAA,aAAA,CAAc,IAAI,KAAK,CAAA,CAAA;AACvC,IAAA,eAAA,GAAkB,MAAM,eAAe,CAAA,CAAA;AAAA,GACzC;AAEA,EAAM,MAAA,IAAA,GAAO,cAAc,GAAI,CAAA,CAAC,QAAQ,GAAI,CAAA,IAAA,CAAK,YAAY,CAAC,CAAA,CAAA;AAE9D,EAAA,IAAI,qBAAuB,EAAA;AACzB,IAAO,OAAA,IAAA,CAAK,GAAI,CAAA,CAAC,GAAQ,KAAA;AACvB,MAAM,MAAA,YAAA,GAAe,GAAI,CAAA,KAAA,CAAM,YAAY,CAAA,CAAA;AAC3C,MAAA,OAAO,MAAO,CAAA,MAAA;AAAA,QACZ,EAAC;AAAA,QACD,GAAG,YAAA,CAAa,GAAI,CAAA,CAAC,CAAG,EAAA,CAAA,MAAO,EAAE,CAAC,eAAgB,CAAA,CAAC,CAAC,GAAG,GAAI,CAAA,CAAA;AAAA,OAC7D,CAAA;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AAEA,EAAO,OAAA,gBAAA,GACH,CAAC,eAAA,CAAgB,GAAI,CAAA,aAAa,CAAE,CAAA,IAAA,CAAK,YAAY,CAAA,EAAG,GAAG,IAAI,CAAE,CAAA,IAAA;AAAA,IAC/D,SAAA;AAAA,GACF,GACA,IAAK,CAAA,IAAA,CAAK,SAAS,CAAA,CAAA;AACzB,CAAA;AAEO,SAAS,YAAY,GAAK,EAAA,SAAA,GAAoB,GAAK,EAAA,IAAA,GAAiB,EAAI,EAAA;AAC7E,EACE,OAAA,OAAO,GAAQ,KAAA,QAAA,IACf,MAAO,CAAA,IAAA,CAAK,GAAG,CAAE,CAAA,MAAA,CAAO,CAAC,MAAA,EAAQ,GAAgB,KAAA;AAC/C,IAAA,IAAI,OAAO,GAAA,CAAI,GAAG,CAAA,KAAM,QAAU,EAAA;AAChC,MAAO,MAAA,CAAA,IAAA,CAAK,OAAO,GAAG,CAAA,CAAE,KAAK,SAAS,CAAC,CAAI,GAAA,GAAA,CAAI,GAAG,CAAA,CAAA;AAClD,MAAO,OAAA,MAAA,CAAA;AAAA,KACT;AACA,IAAA,OAAO,MAAO,CAAA,MAAA;AAAA,MACZ,MAAA;AAAA,MACA,WAAA,CAAY,IAAI,GAAG,CAAA,EAAG,WAAW,IAAK,CAAA,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,KACnD,CAAA;AAAA,GACF,EAAG,EAAE,CAAA,CAAA;AAET;;ACtNO,SAAS,IAAO,GAAA;AACrB,EAAA,MAAM,MAAgB,EAAC,CAAA;AAEvB,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,GAAA,EAAK,CAAK,EAAA,EAAA;AAC5B,IAAI,GAAA,CAAA,CAAC,KAAK,CAAI,GAAA,EAAA,GAAK,MAAM,EAAM,IAAA,CAAA,CAAE,SAAS,EAAE,CAAA,CAAA;AAAA,GAC9C;AAEA,EAAA,MAAM,EAAM,GAAA,IAAA,CAAK,MAAO,EAAA,GAAI,UAAc,GAAA,CAAA,CAAA;AAC1C,EAAA,MAAM,EAAM,GAAA,IAAA,CAAK,MAAO,EAAA,GAAI,UAAc,GAAA,CAAA,CAAA;AAC1C,EAAA,MAAM,EAAM,GAAA,IAAA,CAAK,MAAO,EAAA,GAAI,UAAc,GAAA,CAAA,CAAA;AAC1C,EAAA,MAAM,EAAM,GAAA,IAAA,CAAK,MAAO,EAAA,GAAI,UAAc,GAAA,CAAA,CAAA;AAE1C,EAAA,OACE,IAAI,EAAK,GAAA,GAAI,IACb,GAAK,CAAA,EAAA,IAAM,IAAK,GAAI,CAAA,GACpB,GAAK,CAAA,EAAA,IAAM,KAAM,GAAI,CAAA,GACrB,IAAK,EAAM,IAAA,EAAA,GAAM,GAAI,CACrB,GAAA,GAAA;AAAA,EAEA,GAAA,CAAI,KAAK,GAAI,CAAA,GACb,IAAK,EAAM,IAAA,CAAA,GAAK,GAAI,CACpB,GAAA,GAAA,GACA,IAAM,EAAM,IAAA,EAAA,GAAM,KAAQ,EAAI,CAAA,GAC9B,IAAK,EAAM,IAAA,EAAA,GAAM,GAAI,CACrB,GAAA,GAAA;AAAA,EAEA,IAAK,EAAK,GAAA,EAAA,GAAQ,GAAI,CACtB,GAAA,GAAA,CAAK,MAAM,CAAK,GAAA,GAAI,IACpB,GACA,GAAA,GAAA,CAAK,MAAM,EAAM,GAAA,GAAI,IACrB,GAAK,CAAA,EAAA,IAAM,KAAM,GAAI,CAAA;AAAA,EAErB,IAAI,EAAK,GAAA,GAAI,CACb,GAAA,GAAA,CAAK,MAAM,CAAK,GAAA,GAAI,CACpB,GAAA,GAAA,CAAK,MAAM,EAAM,GAAA,GAAI,IACrB,GAAK,CAAA,EAAA,IAAM,KAAM,GAAI,CAAA,CAAA;AAEzB;;;;"}
1
+ {"version":3,"file":"utilities.mjs","sources":["../../src/utilities/sorting.ts","../../src/utilities/ensureInt.ts","../../src/utilities/math.ts","../../src/utilities/arrays.ts","../../src/constants/resultConstants.ts","../../src/constants/errorConditionConstants.ts","../../src/global/state/syncGlobalState.ts","../../src/global/state/globalState.ts","../../src/utilities/dateTime.ts","../../src/utilities/makeDeepCopy.ts","../../src/utilities/getAccessorValue.ts","../../src/utilities/objects.ts","../../src/utilities/attributeFilter.ts","../../src/utilities/timeCode.ts","../../src/utilities/json.ts","../../src/utilities/UUID.ts"],"sourcesContent":["export function numericSort(a, b) {\n return a - b;\n}\n","export function ensureInt(val: string | number) {\n if (typeof val === 'number') return parseInt(val.toString());\n return parseInt(val);\n}\n","import { numericSort } from './sorting';\nimport { ensureInt } from './ensureInt';\n\nexport function isPowerOf2(n?) {\n if (isNaN(n)) return false;\n return n && (n & (n - 1)) === 0;\n}\n\nexport function median(arr: number[]): number | undefined {\n if (!arr.length) return undefined;\n const s = [...arr].sort(numericSort);\n const mid = Math.floor(s.length / 2);\n return s.length % 2 ? s[mid] : (s[mid - 1] + s[mid]) / 2;\n}\n\nexport function deriveExponent(n) {\n if (!isPowerOf2(n)) return false;\n let m = n;\n let i = 1;\n while (m !== 2) {\n i += 1;\n m = m / 2;\n }\n return i;\n}\n\nexport function coerceEven(n) {\n return isNaN(n) ? 0 : (n % 2 && n + 1) || n;\n}\n\nexport function nearestPowerOf2(val) {\n return Math.pow(2, Math.round(Math.log(val) / Math.log(2)));\n}\n\nexport function isNumeric(value) {\n return !isNaN(parseFloat(value));\n}\n\nexport function isOdd(num) {\n const numInt = ensureInt(num);\n if (isNaN(numInt)) return undefined;\n if (numInt === 0) return false;\n return (numInt & -numInt) === 1;\n}\n\nexport function nextPowerOf2(n?) {\n if (isNaN(n)) return false;\n while (!isPowerOf2(n)) {\n n++;\n }\n return n;\n}\n\nexport function randomInt(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n\n// does accept e.e. '1.0'\nexport function isConvertableInteger(n) {\n return Number.isSafeInteger(typeof n === 'string' ? +n : n);\n}\n\n// produces an approximated normal distribution between 0 and max\nexport function weightedRandom(max = 1, weight = 3, round = true) {\n let num = 0;\n for (let i = 0; i < weight; i++) {\n num += Math.random() * (max / weight);\n }\n return round && max > 1 ? Math.round(num) : num;\n}\n\n// round to nearest step, e.g. 0.25\nfunction stepRound(value, step) {\n step || (step = 1.0);\n const inv = 1.0 / step;\n return Math.round(value * inv) / inv;\n}\n\nexport function skewedDistribution(\n min: number,\n max: number,\n skew: number,\n step?,\n significantDecimals = 2\n) {\n const u = 1 - Math.random();\n const v = 1 - Math.random();\n let num = Math.sqrt(-2.0 * Math.log(u)) * Math.cos(2.0 * Math.PI * v);\n\n num = num / 10.0 + 0.5;\n\n if (num > 1 || num < 0) {\n num = skewedDistribution(min, max, skew);\n } else {\n num = Math.pow(num, skew);\n num *= max - min;\n num += min;\n }\n\n if (step) num = stepRound(num, step);\n\n return parseFloat(num.toFixed(significantDecimals));\n}\n","import { isConvertableInteger } from './math';\n\n// returns only unique values within an array\nexport function unique(arr) {\n return arr.filter((item, i, s) => s.lastIndexOf(item) === i);\n}\n\nexport function noNulls(arr) {\n return arr?.map((item) => (item === null ? undefined : item));\n}\n\nexport function shuffleArray(arr) {\n return arr\n .map((a) => [Math.random(), a])\n .sort((a, b) => a[0] - b[0])\n .map((a) => a[1]);\n}\n\nexport function numericSortValue(v) {\n return isConvertableInteger(v) ? v : Infinity;\n}\n\n// return an object whose attributes are values and whose values are counts for values\n// e.g. values=[1,2,2,3,4,4,5] produces { 1: 1, 2: 2, 3: 1, 4: 2, 5: 1}\nexport function instanceCount(values): { [key: number | string]: number } {\n return values.reduce((a, c) => {\n if (!a[c]) a[c] = 0;\n a[c]++;\n return a;\n }, {});\n}\n\n// return an object whose attributes are value counts and values are arrays of values for each count\n// e.g. values=[1,2,2,3,4,4,5] produces { 1: [\"1\", \"3\", \"5\"], 2: [\"2\", \"4\"] }\nexport function countValues(values): { [key: number]: string[] } {\n return groupValues(instanceCount(values));\n}\n\n// group the values of an object by attributes(keys) which produce those values\n// e.g. obj = { 1: 1, 2: 2, 3: 1, 4: 2, 5: 1} produces { 1: [\"1\", \"3\", \"5\"], 2: [\"2\", \"4\"] }\nexport function groupValues(obj) {\n return Object.keys(obj).reduce((p, c) => {\n const value = obj[c];\n if (p[value]) {\n p[value].push(c);\n } else {\n p[value] = [c];\n }\n return p;\n }, {});\n}\n\nfunction onlyUnique(value, index, self) {\n return self.indexOf(value) === index;\n}\nexport function uniqueValues(arr) {\n return arr.filter(onlyUnique);\n}\nexport function randomPop(array) {\n return Array.isArray(array) && array.length\n ? array.splice(Math.floor(Math.random() * array.length), 1)[0]\n : undefined;\n}\nexport function randomMember(arr) {\n const index = Math.floor(Math.random() * arr.length);\n return arr[index];\n}\n\nexport function generateRange(start, end) {\n return Array.from({ length: end - start }, (_, k) => k + start);\n}\nexport function sizedRange(size, start) {\n return Array.from(Array(size).keys()).map((i) => i + start);\n}\n\nexport function arrayIndices(val, arr) {\n return arr.reduce((a, e, i) => {\n if (e === val) a.push(i);\n return a;\n }, []);\n}\nexport function intersection(a, b) {\n if (!Array.isArray(a) || !Array.isArray(b)) return [];\n return a\n .filter((n) => b.indexOf(n) !== -1)\n .filter((e, i, c) => c.indexOf(e) === i);\n}\nexport function difference(a, b) {\n if (!Array.isArray(a) || !Array.isArray(b)) return [];\n return a.filter((x) => !b.includes(x));\n}\nexport function symmetricDifference(a, b) {\n if (!Array.isArray(a) || !Array.isArray(b)) return [];\n return a\n .filter((x) => !b.includes(x))\n .concat(b.filter((x) => !a.includes(x)));\n}\nexport function overlap(a, b) {\n if (!Array.isArray(a) || !Array.isArray(b)) return false;\n return a.some((e) => b.includes(e));\n}\nexport function occurrences(val, arr) {\n return (\n arr.reduce((r, val) => {\n r[val] = 1 + r[val] || 1;\n return r;\n }, {})[val] || 0\n );\n}\nexport function subSort(arr, i, n, sortFx) {\n return [].concat(\n ...arr.slice(0, i),\n ...arr.slice(i, i + n).sort(sortFx),\n ...arr.slice(i + n, arr.length)\n );\n}\nexport function inPlaceSubSort(arr, i, n, sortFx) {\n const newarray = [].concat(\n ...arr.slice(0, i),\n ...arr.slice(i, i + n).sort(sortFx),\n ...arr.slice(i + n, arr.length)\n );\n arr.length = 0;\n arr.push(...newarray); // use spread operator instead?\n return arr;\n}\nexport function chunkArray(arr, chunksize) {\n return arr.reduce((all, one, i) => {\n const ch = Math.floor(i / chunksize);\n all[ch] = [].concat(all[ch] || [], one);\n return all;\n }, []);\n}\n\n// will break an array of items into chunks following pattern [size1, size2, ...]\nexport function chunkSizeProfile(\n arr: number[],\n [size, ...otherSizes]: number[]\n) {\n return arr.length\n ? [\n arr.slice(0, size),\n ...chunkSizeProfile(arr.slice(size), [...otherSizes, size]),\n ]\n : [];\n}\nexport function groupConsecutiveNumbers(arr) {\n return arr.reduce((result, num) => {\n const finalGroup = result[result.length - 1];\n if (!finalGroup || finalGroup[finalGroup.length - 1] !== num - 1) {\n result.push([]);\n }\n result[result.length - 1].push(num);\n return result;\n }, []);\n}\n\nexport function allNumeric(arr) {\n return arr.reduce((numeric, item) => !isNaN(parseInt(item)) && numeric, true);\n}\nexport function noNumeric(arr) {\n return arr.reduce((numeric, item) => isNaN(parseInt(item)) && numeric, true);\n}\n\n/**\n * chunk an arbitrary array of elements by adding every Nth instance to chunksCount chunks\n *\n * e.g. given arr=[1,2,3,4,5,6,7,8,9,10,11,12]:\n *\n * chunkByNth(arr, 3)\n * [1, 4, 7, 10]\n * [2, 5, 8, 11]\n * [3, 6, 9, 12]\n * chunkByNth(arr, 4)\n * [1, 5, 9]\n * [2, 6, 10]\n * [3, 7, 11]\n * [4, 8, 12]\n *\n * When shuttle = true:\n * chunkByNth(arr, 3, true)\n * [1, 6, 7, 12]\n * [2, 5, 8, 11]\n * [3, 4, 9, 10]\n * chunkByNth(arr, 4, true)\n * [1, 8, 9]\n * [2, 7, 10]\n * [3, 6, 11]\n * [4, 5, 12]\n *\n * @param {any[]} arr - an array\n * @param {number} chunksCount - number of chunks to create\n * @param {boolean} shuttle - whether or not to \"shuttle\" as in the movment of a shuttle in a loom\n */\nexport function chunkByNth(arr: any[], chunksCount: number, shuttle?: boolean) {\n return arr.reduce((chunks, entry, index) => {\n const reverseDirection = shuttle\n ? !!(Math.floor(index / chunksCount) % 2)\n : false;\n const chunkIndex = index % chunksCount;\n const directionIndex = reverseDirection\n ? chunksCount - 1 - chunkIndex\n : chunkIndex;\n if (!chunks[directionIndex]) chunks[directionIndex] = [];\n chunks[directionIndex].push(entry);\n return chunks;\n }, []);\n}\n\n// group numbers by contiguous ranges\nexport function getRanges(array) {\n return array\n .map((e) => parseInt(e))\n .filter((e) => !isNaN(e))\n .reduce((ranges, a) => {\n if (!ranges.some((range) => range.includes(a - 1) && range.push(a)))\n ranges.push([a]);\n return ranges;\n }, []);\n}\n\nexport function getMissingSequenceNumbers(arr, start = 1) {\n if (!Array.isArray(arr) || !arr.every(isConvertableInteger)) return [];\n const min = Math.min(...arr, start);\n const max = Math.max(...arr);\n return generateRange(min, max + 1).filter((n) => !arr.includes(n));\n}\n","export const SUCCESS = { success: true };\nexport const ERROR = 'error';\n\nexport const resultConstants = {\n SUCCESS,\n ERROR,\n};\n","export type ErrorType = {\n message: string;\n info?: string;\n code: string;\n};\n\nexport const ANACHRONISM = {\n message: 'Chronological error; time violation.',\n code: 'ANACHRONISM',\n};\nexport const CANNOT_REMOVE_MAIN_STRUCTURE = {\n message: 'Cannot remove main structure',\n code: 'ERR_CANNOT_REMOVE_MAIN_STRUCTURE',\n};\nexport const INVALID_RECORDS = {\n message: 'records must be an object with tournamentId keys',\n code: 'ERR_INVALID_TOURNAMENTS',\n};\nexport const MISSING_TOURNAMENT_RECORDS = {\n message: 'Missing tournamentRecords',\n code: 'ERR_MISSING_TOURNAMENTS',\n};\nexport const MISSING_TOURNAMENT_RECORD = {\n message: 'Missing tournamentRecord',\n code: 'ERR_MISSING_TOURNAMENT',\n};\nexport const INVALID_TOURNAMENT_RECORD = {\n message: 'Invalid tournamentRecord',\n code: 'ERR_INVALID_TOURNAMENT',\n};\nexport const MISSING_TOURNAMENT_ID = {\n message: 'Missing tournamentId',\n code: 'ERR_MISSING_TOURNAMENT_ID',\n};\n\nexport const INVALID_DRAW_DEFINITION = {\n message: 'Invalid drawDefinition',\n code: 'ERR_INVALID_DRAWDEF',\n};\nexport const MISSING_DRAW_DEFINITION = {\n message: 'Missing drawDefinition',\n code: 'ERR_MISSING_DRAWDEF',\n};\nexport const EXISTING_DRAW_DEFINITIONS = {\n message: 'Existing drawDefinition(s)',\n code: 'ERR_EXISTING_DRAWDEFS',\n};\nexport const DRAW_DEFINITION_NOT_FOUND = {\n message: 'drawDefinition not found',\n code: 'ERR_NOT_FOUND_DRAWDEF',\n};\nexport const INVALID_STRUCTURE = {\n message: 'Invalid structure',\n code: 'ERR_INVALID_STRUCTURE',\n};\nexport const INCOMPLETE_SOURCE_STRUCTURE = {\n message: 'Incomplete source structure',\n code: 'ERR_INCOMPLETE_STRUCTURE',\n};\n\nexport const INVALID_DRAW_POSITION_FOR_SEEDING = {\n message: 'Invalid drawPosition for seedAssignment',\n code: 'ERR_INVALID_SEEDING_POSITION',\n};\nexport const DRAW_POSITION_ASSIGNED = {\n message: 'drawPosition already assigned',\n code: 'ERR_EXISTING_POSITION_ASSIGNMENT',\n};\nexport const SCHEDULE_NOT_CLEARED = {\n message: 'Schedule not cleared',\n code: 'ERR_UNCHANGED_SCHEDULE_NOT_CLEARED',\n};\nexport const DRAW_POSITION_NOT_CLEARED = {\n message: 'drawPosition not cleared',\n code: 'ERR_FAILURE_POSITION_NOT_CLEARED',\n};\nexport const DRAW_POSITION_NOT_FOUND = {\n message: 'drawPosition not found',\n code: 'ERR_NOT_FOUND_DRAW_POSITION',\n};\nexport const UNRECOGNIZED_DRAW_TYPE = {\n message: 'Unrecognized drawType',\n code: 'ERR_UNRECOGNIZED_DRAW_TYPE',\n};\nexport const MISSING_DRAW_POSITIONS = {\n message: 'Missing drawPositions',\n code: 'ERR_MISSING_DRAW_POSITIONS',\n};\nexport const DRAW_POSITION_ACTIVE = {\n message: 'drawPosition is active',\n code: 'ERR_ACTIVE_DRAW_POSITION',\n};\nexport const INVALID_DRAW_POSITION = {\n message: 'Invlid drawPosition',\n code: 'ERR_INVALID_DRAW_POSITION',\n};\nexport const MISSING_DRAW_POSITION = {\n message: 'Missing drawPosition',\n code: 'ERR_MISSING_DRAW_POSITION',\n};\nexport const INVALID_DRAW_TYPE = {\n message: 'Invalid drawType',\n code: 'ERR_INVALID_DRAW_TYPE',\n};\nexport const INVALID_DRAW_SIZE = {\n message: 'Invalid drawSize',\n code: 'ERR_INVALID_DRAW_SIZE',\n};\nexport const DRAW_SIZE_MISMATCH = {\n message: 'Cannot set drawSize to be less than existing entries',\n code: 'ERR_INVALID_DRAW_SIZE_MISMATCH',\n};\nexport const MISSING_DRAW_SIZE = {\n message: 'Missing drawSize',\n code: 'ERR_MISSING_DRAW_SIZE',\n};\nexport const MISSING_DRAW_ID = {\n message: 'Missing drawId',\n code: 'ERR_MISSING_DRAW_ID',\n};\nexport const DRAW_ID_EXISTS = {\n message: 'drawId exists',\n code: 'ERR_EXISTING_DRAW_ID',\n};\nexport const INVALID_PARTICIPANT_SEEDING = {\n message: 'participantId cannot be assigned to multiple seedNumbers',\n code: 'INVALID_PARTICIPANT_SEEDING',\n};\nexport const SEEDSCOUNT_GREATER_THAN_DRAW_SIZE = {\n message: 'seedsCount greater than drawSize',\n code: 'ERR_INVALID_SEED_COUNT',\n};\nexport const MISSING_SEEDCOUNT_THRESHOLDS = {\n message: 'Missing seedCountThresholds',\n code: 'ERR_MISSING_SEED_COUNT_THRESHOLD',\n};\nexport const INVALID_ACTION = {\n message: 'Invalid action',\n code: 'ERR_INVALID_ACTION',\n};\nexport const INVALID_ASSIGNMENT = {\n message: 'Invalid assignment',\n code: 'ERR_INVALID_ASSIGNMENT',\n};\nexport const MISSING_SEED_ASSIGNMENTS = {\n message: 'Missing seedAssignments',\n code: 'ERR_MISSING_SEED_ASSIGNMENTS',\n};\nexport const INVALID_SEED_NUMBER = {\n message: 'Invalid seedNumber',\n code: 'ERR_INVALID_SEED_NUMBER',\n};\nexport const INVALID_SEED_POSITION = {\n message: 'Invalid seedPosition',\n code: 'ERR_INVALID_SEED_POSITION',\n};\n\nexport const MISSING_TARGET_LINK = {\n message: 'Missing targetLink',\n code: 'ERR_MISSING_LINK_TARGET',\n};\n\nexport const EXISTING_ROUND = {\n message: 'Existing round',\n code: 'ERR_EXISTING_ROUND',\n};\nexport const MISSING_ROUND_NUMBER = {\n message: 'Missing roundNumber',\n code: 'ERR_MISSING_ROUND_NUMBER',\n};\nexport const MISSING_STRUCTURE_ID = {\n message: 'Missing structureId',\n code: 'ERR_MISSING_STRUCTURE_ID',\n};\nexport const STRUCTURE_NOT_FOUND = {\n message: 'structure not found',\n code: 'ERR_NOT_FOUND_STRUCTURE',\n};\nexport const MISSING_STRUCTURES = {\n message: 'Missing structures',\n code: 'ERR_MISSING_STRUCTURES',\n};\nexport const MISSING_STRUCTURE = {\n message: 'Missing structure',\n code: 'ERR_MISSING_STRUCTURE',\n};\nexport const UNLINKED_STRUCTURES = {\n message: 'drawDefinition contains unlinked structures',\n code: 'ERR_MISSING_STRUCTURE_LINKS',\n};\n\nexport const INVALID_EVENT_TYPE = {\n message: 'Invalid eventType',\n code: 'ERR_INVALID_EVENT_TYPE',\n};\nexport const UNRECOGNIZED_EVENT_TYPE = {\n message: 'Unrecognized eventType',\n code: 'ERR_UNRECOGNIZED_EVENT_TYPE',\n};\nexport const MISSING_EVENT = {\n message: 'Missing event / eventId',\n code: 'ERR_MISSING_EVENT_ID',\n};\nexport const EVENT_NOT_FOUND = {\n message: 'Event not found',\n code: 'ERR_NOT_FOUND_EVENT',\n};\nexport const EVENT_EXISTS = {\n message: 'Event exists',\n code: 'ERR_EXISTING_EVENT',\n};\n\nexport const MISSING_ENTRIES = {\n message: 'Missing entries',\n code: 'ERR_MISSING_ENTRIES',\n};\nexport const INVALID_ENTRIES = {\n message: 'Invalid entries',\n code: 'ERR_INVALID_ENTRIES',\n};\nexport const MISSING_ASSIGNMENTS = {\n message: 'Missing assignments',\n code: 'ERR_MISSING_ASSIGNMENTS',\n};\n\nexport const MISSING_STAGE = {\n message: 'Missing stage',\n code: 'ERR_MISSING_STAGE',\n};\nexport const INVALID_STAGE = {\n message: 'Invalid stage',\n code: 'ERR_INVALID_STAGE',\n};\nexport const STAGE_SEQUENCE_LIMIT = {\n message: 'stageSequence limit',\n code: 'ERR_LIMIT_STAGE_SEQUENCE',\n};\nexport const MISSING_POSITION_ASSIGNMENTS = {\n message: 'Missing positionAssignments',\n code: 'ERR_MISSING_POSITION_ASSIGNMENTS',\n};\nexport const INVALID_MATCHUP_STATUS_BYE = {\n message: 'Cannot Assign BYE status if no assignment: { bye: true }',\n code: 'ERR_UNCHANGED_CANNOT_ASSIGN_BYE',\n};\nexport const UNRECOGNIZED_MATCHUP_STATUS = {\n message: 'Unrecognized matchUpStatus',\n code: 'ERR_UNRECOGNIZED_MATCHUP_STATUS',\n};\nexport const UNRECOGNIZED_MATCHUP_FORMAT = {\n message: 'Unrecognized matchUpFormat',\n code: 'ERR_UNRECOGNIZED_MATCHUP_FORMAT',\n};\nexport const INCOMPATIBLE_MATCHUP_STATUS = {\n message: 'Incompatible matchUpStatus',\n code: 'ERR_INCOMPATIBLE_MATCHUP_STATUS',\n};\nexport const INVALID_MATCHUP_STATUS = {\n message: 'Invalid matchUpStatus',\n code: 'ERR_INVALID_MATCHUP_STATUS',\n};\nexport const INVALID_TIE_FORMAT = {\n message: 'Invalid tieFormat',\n code: 'ERR_INVALID_TIE_FORMAT',\n};\nexport const INVALID_MATCHUP_FORMAT = {\n message: 'Invalid matchUpFormat',\n code: 'ERR_INVALID_MATCHUP_FORMAT',\n};\nexport const MISSING_MATCHUP_FORMAT = {\n message: 'Missing matchUpFormat',\n code: 'ERR_MISSING_MATCHUP_FORMAT',\n};\nexport const MISSING_COLLECTION_DEFINITION = {\n message: 'Missing collectionDefinition',\n code: 'ERR_MISSING_COLLECTION_DEFINITION',\n};\nexport const MISSING_TIE_FORMAT = {\n message: 'Missing tieFormat',\n code: 'ERR_MISSING_TIE_FORMAT',\n};\nexport const MISSING_MATCHUP_ID = {\n message: 'Missing matchUpId',\n code: 'ERR_MISSING_MATCHUP_ID',\n};\nexport const MISSING_MATCHUP_IDS = {\n message: 'Missing matchUpIds',\n code: 'ERR_MISSING_MATCHUP_IDS',\n};\nexport const MATCHUP_NOT_FOUND = {\n message: 'matchUp not found',\n code: 'ERR_NOT_FOUND_MATCHUP',\n};\nexport const MISSING_MATCHUPS = {\n message: 'Missing matchUps',\n code: 'ERR_MISSING_MATCHUPS',\n};\nexport const MISSING_MATCHUP = {\n message: 'Missing matchUp',\n code: 'ERR_MISSING_MATCHUP',\n};\nexport const INVALID_MATCHUP = {\n message: 'Invalid matchUp',\n code: 'ERR_INVALID_MATCHUP',\n};\n\nexport const MISSING_POLICY_TYPE = {\n message: 'Missing policyType',\n code: 'ERR_MISSING_POLICY_TYPE',\n};\nexport const MISSING_POLICY_DEFINITION = {\n message: 'Missing policyDefinitions',\n code: 'ERR_MISSING_POLICY_DEFINITIONS',\n};\nexport const MISSING_SEEDING_POLICY = {\n message: 'Missing seeding policy',\n code: 'ERR_MISSING_POLICY_SEEDING',\n};\nexport const MISSING_AVOIDANCE_POLICY = {\n message: 'Missing avoidance policy',\n code: 'ERR_MISSING_POLICY_AVOIDANCE',\n};\nexport const MISSING_POLICY_ATTRIBUTES = {\n message: 'Missing policy attributes',\n code: 'ERR_MISSING_POLICY_ATTRIBUTES',\n};\nexport const INVALID_POLICY_DEFINITION = {\n message: 'Invalid policyDefinitions',\n code: 'ERR_INVALID_POLICY_DEFINITIONS',\n};\nexport const EXISTING_POLICY_TYPE = {\n message: 'existing policyType',\n code: 'ERR_EXISTING_POLICY_TYPE',\n};\nexport const POLICY_NOT_ATTACHED = {\n message: 'Policy not attached',\n code: 'ERR_FAILURE_POLICY_NOT_ATTACHED',\n};\nexport const POLICY_NOT_FOUND = {\n message: 'Policy not found',\n code: 'ERR_NOT_FOUND_POLICY',\n};\nexport const MISSING_SCORING_POLICY = {\n message: 'Missing scoring policy / matchUpFormats',\n code: 'ERR_MISSING_POLICY_SCORING_MATCHUP_FORMATS',\n};\n\nexport const INVALID_SIDE_NUMBER = {\n message: 'Invalid sideNumber',\n code: 'ERR_INVALID_SIDE_NUMBER',\n};\nexport const INVALID_SET_NUMBER = {\n message: 'Invalid setNumber',\n code: 'ERR_INVALID_SET_NUMBER',\n};\nexport const MISSING_SET_OBJECT = {\n message: 'Missing setObject',\n code: 'ERR_MISSING_SET_ATTRIBUTE',\n};\nexport const MISSING_SET_NUMBER = {\n message: 'Missing setNumber',\n code: 'ERR_MISSING_SET_NUMBER',\n};\nexport const MISSING_SIDE_NUMBER = {\n message: 'Missing sideNumber',\n code: 'ERR_MISSING_SIDE_NUMBER',\n};\nexport const MISSING_COURT_ID = {\n message: 'Missing courtId',\n code: 'ERR_MISSING_COURT_ID',\n};\nexport const MISSING_VALUE = {\n message: 'Missing value',\n code: 'ERR_MISSING_VALUE',\n};\nexport const MISSING_DATE = {\n message: 'Missing date',\n code: 'ERR_MISSING_DATE',\n};\nexport const NO_VALID_DATES = {\n message: 'No valid dates',\n code: 'ERR_NO_VALID_DATES',\n};\n\nexport const INVALID_BOOKINGS = {\n message: 'Invalid bookings',\n code: 'ERR_INVALID_BOOKINGS',\n};\nexport const INVALID_DATE_AVAILABILITY = {\n message: 'Invalid dateAvailability',\n code: 'ERR_INVALID_DATE_AVAILABILITY',\n};\nexport const MISSING_DATE_AVAILABILITY = {\n message: 'Missing dateAvailability',\n code: 'ERR_MISSING_DATE_AVAILABILITY',\n};\n\n// Javascript constant for Date() function\nexport const INVALID_DATE = {\n message: 'Invalid Date',\n code: 'ERR_INVALID_DATE',\n};\nexport const INVALID_TIME = {\n message: 'Invalid time',\n code: 'ERR_INVALID_TIME',\n};\nexport const INVALID_TOURNAMENT_DATES = {\n message: 'Invalid tournament dates',\n code: 'ERR_INVALID_DATES_TOURNAMENT',\n};\nexport const INVALID_TIME_ZONE = {\n message: 'Invalid Time Zone',\n code: 'ERR_INVALID_TIME_ZONE',\n};\n\nexport const INVALID_GAME_SCORES = {\n message: 'Invalid game scores',\n code: 'ERR_INVALID_SCORES_GAME',\n};\nexport const INVALID_SCORE = {\n message: 'Invalid score',\n code: 'ERR_INVALID_SCORE',\n};\n\nexport const INVALID_WINNING_SIDE = {\n message: 'Invalid winningSide',\n code: 'ERR_INVALID_WINNING_SIDE',\n};\n\nexport const NO_PARTICIPANTS = {\n message: 'Tournament has no participants',\n code: 'ERR_NO_TOURNAMENT_PARTICIPANTS',\n};\nexport const NO_PARTICIPANTS_GENERATED = {\n message: 'No participants generated',\n code: 'ERR_NO_PARTICIPANTS_GENERATED',\n};\nexport const CANNOT_MODIFY_TIEFORMAT = {\n message: 'Cannot modify tieFormat',\n code: 'ERR_UNCHANGED_CANNOT_MODIFY_TIEFORMAT',\n};\nexport const CANNOT_MODIFY_PARTICIPANT_TYPE = {\n message: 'Cannot modify participantType',\n code: 'ERR_UNCHANGED_CANNOT_MODIFY_PARTICIPANT_TYPE',\n};\nexport const CANNOT_REMOVE_PARTICIPANTS = {\n message: 'Cannot remove participants',\n code: 'ERR_UNCHANGED_CANNOT_REMOVE_PARTICIPANTS',\n};\nexport const CANNOT_CHANGE_WINNING_SIDE = {\n message: 'Cannot change winningSide',\n code: 'ERR_UNCHANGED_CANNOT_CHANGE_WINNING_SIDE',\n};\nexport const INVALID_PARTICIPANT = {\n message: 'Invalid participant',\n code: 'ERR_INVALID_PARTICIPANT',\n};\nexport const INVALID_PARTICIPANT_ID = {\n message: 'Invalid participantId',\n code: 'ERR_INVALID_PARTICIPANT_ID',\n};\nexport const INVALID_PARTICIPANT_IDS = {\n message: 'Invalid participantIds',\n code: 'ERR_INVALID_PARTICIPANT_IDS',\n};\nexport const INVALID_PARTICIPANT_ROLE = {\n message: 'Invalid participantRole',\n code: 'ERR_INVALID_PARTICIPANT_ROLE',\n};\nexport const INVALID_PARTICIPANT_TYPE = {\n message: 'Invalid participantType',\n code: 'ERR_INVALID_PARTICIPANT_TYPE',\n};\nexport const MISSING_PARTICIPANT_ROLE = {\n message: 'Missing participantRole',\n code: 'ERR_MISSING_PARTICIPANT_ROLE',\n};\nexport const MISSING_PARTICIPANT = {\n message: 'Missing participant',\n code: 'ERR_MISSING_PARTICIPANT',\n};\nexport const MISSING_PARTICIPANTS = {\n message: 'Missing participants',\n code: 'ERR_MISSING_PARTICIPANTS',\n};\nexport const MISSING_PARTICIPANT_ID = {\n message: 'Missing participantId',\n code: 'ERR_MISSING_PARTICIPANT_ID',\n};\nexport const PARTICIPANT_NOT_FOUND = {\n message: 'Participant Not Found',\n code: 'ERR_NOT_FOUND_PARTICIPANT',\n};\nexport const PARTICIPANT_ID_EXISTS = {\n message: 'participantId exists',\n code: 'ERR_EXISTING_PARTICIPANT_ID',\n};\nexport const PARTICIPANT_PAIR_EXISTS = {\n message: 'participant pair exists',\n code: 'ERR_EXISTING_PARTICIPANT_PAIR',\n};\nexport const NO_PARTICIPANT_REMOVED = {\n message: 'No participant removed',\n code: 'ERR_UNCHANGED_NO_PARTICIPANT_REMOVED',\n};\nexport const MISSING_PARTICIPANT_IDS = {\n message: 'Missing participantIds',\n code: 'ERR_MISSING_PARTICIPANT_IDS',\n};\nexport const MISSING_PARTICIPANT_COUNT = {\n message: 'Missing participantsCount',\n code: 'ERR_MISSING_PARTICIPANT_COUNT',\n};\nexport const PARTICIPANT_NOT_CHECKED_IN = {\n message: 'Participant not checked in',\n code: 'ERR_UNCHANGED_PARTICIPANT_NOT_CHECKED_IN',\n};\nexport const PARTICIPANT_ALREADY_CHECKED_IN = {\n message: 'Participant already checked in',\n code: 'ERR_UNCHANGED_PARTICIPANT_CHECKED_IN',\n};\n\nexport const MISSING_PERSON_DETAILS = {\n message: 'Missing person details',\n code: 'ERR_MISSING_PERSON_DETAILS',\n};\n\nexport const EXISTING_PARTICIPANT_DRAW_POSITION_ASSIGNMENT = {\n message: 'Existing participant drawPosition assignment',\n code: 'ERR_EXISTING_PARTICIPANT_DRAW_POSITION_ASSIGNMENT',\n};\nexport const EXISTING_PARTICIPANT = {\n message: 'Existing participant',\n code: 'ERR_EXISTING_PARTICIPANT',\n};\nexport const PARTICIPANT_COUNT_EXCEEDS_DRAW_SIZE = {\n message: 'participantsCount exceeds drawSize',\n code: 'ERR_INVALID_PARTICIPANT_COUNT',\n};\n\nexport const INVALID_ENTRY_STATUS = {\n message: 'Invalid entry status',\n code: 'ERR_INVALID_ENTRY_STATUS',\n};\nexport const PARTICIPANT_ENTRY_NOT_FOUND = {\n message: 'Participant Entry Not Found',\n code: 'ERR_NOT_FOUND_PARTICIPANT_ENTRY',\n};\nexport const PARTICIPANT_NOT_ENTERED_IN_STAGE = {\n message: 'Participant not entered in stage',\n code: 'ERR_UNCHANGED_PARTICIPANT_NOT_ENTERED',\n};\nexport const PARTICIPANT_NOT_FOUND_IN_STAGE = {\n message: 'Participant not found in stageSequence',\n code: 'ERR_NOT_FOUND_PARTICIPANT_IN_STAGE',\n};\nexport const ENTRY_STATUS_NOT_ALLOWED_IN_STAGE = {\n message: 'entryStatus not allowed in stage',\n code: 'ERR_INVALID_ENTRY_STATUS_IN_STAGE',\n};\nexport const ENTRY_STATUS_NOT_ALLOWED_FOR_EVENT = {\n message: 'entryStatus not allowed for event',\n code: 'ERR_INVALID_ENTRY_STATUS_IN_EVENT',\n};\nexport const NO_STAGE_SPACE_AVAILABLE_FOR_ENTRY_STATUS = {\n message: 'No stage space available for entryStatus',\n code: 'ERR_UNCHANGED_NO_AVAILABLE_STAGE_SPACE',\n};\n\nexport const NO_DRAW_POSITIONS_AVAILABLE_FOR_QUALIFIERS = {\n message: 'Insufficient drawPositions to accommodate qualifiers',\n code: 'ERR_UNCHANGED_NO_DRAW_POSITIONS_FOR_QUALIFIERS',\n};\nexport const INSUFFICIENT_DRAW_POSITIONS = {\n message: 'Insufficient drawPositions to accommodate entries',\n code: 'ERR_INSUFFICIENT_DRAW_POSITIONS',\n};\n\nexport const MISSING_PENALTY_TYPE = {\n message: 'Missing penaltyType',\n code: 'ERR_MISSING_PENALTY_TYPE',\n};\nexport const MISSING_PENALTY_ID = {\n message: 'Missing penaltyId',\n code: 'ERR_MISSING_PENALTY_ID',\n};\nexport const PENALTY_NOT_FOUND = {\n message: 'Penalty not found',\n code: 'ERR_NOT_FOUND_PENALTY',\n};\n\nexport const MISSING_COURTS_INFO = {\n message: 'Missing courtsCount/courtNames',\n code: 'ERR_MISSING_COURTS_INFO',\n};\nexport const COURT_NOT_FOUND = {\n message: 'Court not found',\n code: 'ERR_NOT_FOUND_COURT',\n};\nexport const COURT_EXISTS = {\n message: 'Court exists',\n code: 'ERR_EXISTING_COURT',\n};\n\nexport const VENUE_EXISTS = {\n message: 'Venue exists',\n code: 'ERR_EXISTING_VENUE',\n};\nexport const VENUE_NOT_FOUND = {\n message: 'Venue not found',\n code: 'ERR_NOT_FOUND_VENUE',\n};\nexport const MISSING_VENUE_ID = {\n message: 'Missing venueId',\n code: 'ERR_MISSING_VENUE_ID',\n};\n\nexport const INVALID_END_TIME = {\n message: 'Invalid endTime',\n code: 'ERR_INVALID_END_TIME',\n};\nexport const EXISTING_END_TIME = {\n message: 'Existing endTime',\n code: 'ERR_EXISTING_END_TIME',\n};\nexport const INVALID_STOP_TIME = {\n message: 'Invalid stopTime',\n code: 'ERR_INVALID_STOP_TIME',\n};\nexport const INVALID_START_TIME = {\n message: 'Invalid startTime',\n code: 'ERR_INVALID_START_TIME',\n};\nexport const INVALID_RESUME_TIME = {\n message: 'Invalid resumeTime',\n code: 'ERR_INVALID_RESUME_TIME',\n};\nexport const INVALID_TIME_ITEM = {\n message: 'Invalid timeItem',\n code: 'ERR_INVALID_TIME_ITEMS',\n};\nexport const MISSING_ASYNC_STATE_PROVIDER = {\n message: 'Missing async state provider',\n code: 'ERR_MISSING_ASYNC_STATE_PROVIDER',\n};\nexport const MISSING_TIME_ITEM = {\n message: 'Missing timeItem',\n code: 'ERR_MISSING_TIME_ITEM',\n};\nexport const MISSING_TIME_ITEMS = {\n message: 'Missing timeItems',\n code: 'ERR_MISSING_TIME_ITEMS',\n};\nexport const MISSING_CONTEXT = {\n message: 'Missing context',\n code: 'ERR_MISSING_CONTEXT',\n};\nexport const MISSING_SCHEDULE = {\n message: 'Missing schedule',\n code: 'ERR_MISSING_SCHEDULE',\n};\n\nexport const INVALID_SCALE_ITEM = {\n message: 'Invalid scaleItem',\n code: 'ERR_INVALID_SCALE_ITEM',\n};\n\nexport const MODIFICATIONS_FAILED = {\n message: 'Modifications failed',\n code: 'ERR_FAILURE_MODIFICATIONS',\n};\nexport const NO_MODIFICATIONS_APPLIED = {\n message: 'No modifications applied',\n code: 'ERR_UNCHANGED_NO_MODIFICATIONS_APPLIED',\n};\n\nexport const UNABLE_TO_ASSIGN_COURT = {\n message: 'Unable to assign court',\n code: 'ERR_UNCHANGED_COURT_NOT_ASSIGNED',\n};\n\nexport const NO_CANDIDATES = {\n message: 'No Candidates',\n code: 'ERR_UNCHANGED_NO_CANDIDATES',\n};\n\nexport const INVALID_CONFIGURATION = {\n message: 'Invalid configuration',\n code: 'ERR_INVALID_CONFIG',\n};\nexport const INVALID_COLLECTION_DEFINITION = {\n message: 'Invalid collectionDefinition',\n code: 'ERR_INVALID_COLLECTION_DEFINITION',\n};\nexport const INVALID_OBJECT = {\n message: 'Invalid object',\n code: 'ERR_INVALID_OBJECT',\n};\nexport const INVALID_GENDER = {\n message: 'Invalid gender',\n code: 'ERR_INVALID_GENDER',\n};\nexport const INVALID_CATEGORY = {\n message: 'Invalid category',\n code: 'ERR_INVALID_CATEGORY',\n};\nexport const INVALID_VALUES = {\n message: 'Invalid values',\n code: 'ERR_INVALID_VALUES',\n};\nexport const DUPLICATE_VALUE = {\n message: 'Duplicate value',\n code: 'ERR_DUPLICATE_VALUE',\n};\n\nexport const TEAM_NOT_FOUND = {\n message: 'Team not found',\n code: 'ERR_NOT_FOUND_TEAM',\n};\nexport const NO_VALID_ACTIONS = {\n message: 'No valid actions',\n code: 'ERR_NO_VALID_ACTIONS',\n};\nexport const NO_VALID_ATTRIBUTES = {\n message: 'No valid attributes',\n code: 'ERR_NO_VALID_ATTRIBUTES',\n};\n\nexport const VALUE_UNCHANGED = {\n message: 'Value unchanged',\n code: 'ABORT_UNCHANGED',\n};\nexport const NOT_FOUND = { message: 'Not found', code: 'ERR_NOT_FOUND' };\nexport const NOT_IMPLEMENTED = {\n message: 'Not implemented',\n code: 'ERR_NOT_IMPLEMENTED',\n};\n\nexport const EXISTING_FLIGHT = {\n message: 'Existing flight',\n code: 'ERR_EXISTING_FLIGHT',\n};\nexport const EXISTING_PROFILE = {\n message: 'Existing flight profile',\n code: 'ERR_EXISTING_FLIGHT_PROFILE',\n};\nexport const EXISTING_OUTCOME = {\n message: 'Existing outcome',\n code: 'ERR_EXISTING_OUTCOME',\n};\n\nexport const EXISTING_MATCHUP_ID = {\n message: 'Existing matchUpId',\n code: 'ERR_EXISTING_MATCHUP_ID',\n};\n\nexport const EXISTING_STAGE = {\n message: 'Existing stage',\n code: 'ERR_EXISTING_STAGE',\n};\n\nexport const EXISTING_STRUCTURE = {\n message: 'Existing structure',\n code: 'ERR_EXISTING_STRUCTURE',\n};\n\nexport const METHOD_NOT_FOUND = {\n message: 'Method not found',\n code: 'ERR_NOT_FOUND_METHOD',\n};\n\nexport const SCHEDULED_MATCHUPS = {\n message: 'Scheduled matchUps',\n code: 'ERR_SCHEDULED_MATCHUPS',\n};\n\nexport const SCORES_PRESENT = {\n message: 'Scores present',\n code: 'ERR_SCORES_PRESENT',\n};\n\nexport const errorConditionConstants = {\n ANACHRONISM,\n CANNOT_CHANGE_WINNING_SIDE,\n CANNOT_MODIFY_TIEFORMAT,\n CANNOT_MODIFY_PARTICIPANT_TYPE,\n CANNOT_REMOVE_MAIN_STRUCTURE,\n CANNOT_REMOVE_PARTICIPANTS,\n COURT_EXISTS,\n COURT_NOT_FOUND,\n DRAW_DEFINITION_NOT_FOUND,\n DRAW_ID_EXISTS,\n DRAW_POSITION_ACTIVE,\n DRAW_POSITION_ASSIGNED,\n DRAW_POSITION_NOT_CLEARED,\n DRAW_POSITION_NOT_FOUND,\n DRAW_SIZE_MISMATCH,\n DUPLICATE_VALUE,\n ENTRY_STATUS_NOT_ALLOWED_FOR_EVENT,\n ENTRY_STATUS_NOT_ALLOWED_IN_STAGE,\n EVENT_EXISTS,\n EVENT_NOT_FOUND,\n EXISTING_DRAW_DEFINITIONS,\n EXISTING_END_TIME,\n EXISTING_FLIGHT,\n EXISTING_MATCHUP_ID,\n EXISTING_OUTCOME,\n EXISTING_PARTICIPANT_DRAW_POSITION_ASSIGNMENT,\n EXISTING_PARTICIPANT,\n EXISTING_POLICY_TYPE,\n EXISTING_PROFILE,\n EXISTING_ROUND,\n EXISTING_STAGE,\n EXISTING_STRUCTURE,\n INCOMPATIBLE_MATCHUP_STATUS,\n INCOMPLETE_SOURCE_STRUCTURE,\n INSUFFICIENT_DRAW_POSITIONS,\n INVALID_ACTION,\n INVALID_ASSIGNMENT,\n INVALID_BOOKINGS,\n INVALID_CATEGORY,\n INVALID_COLLECTION_DEFINITION,\n INVALID_CONFIGURATION,\n INVALID_DATE_AVAILABILITY,\n INVALID_DATE,\n INVALID_DRAW_DEFINITION,\n INVALID_DRAW_POSITION_FOR_SEEDING,\n INVALID_DRAW_POSITION,\n INVALID_DRAW_SIZE,\n INVALID_END_TIME,\n INVALID_ENTRIES,\n INVALID_EVENT_TYPE,\n INVALID_GAME_SCORES,\n INVALID_GENDER,\n INVALID_MATCHUP_FORMAT,\n INVALID_MATCHUP_STATUS,\n INVALID_MATCHUP_STATUS_BYE,\n INVALID_MATCHUP,\n INVALID_OBJECT,\n INVALID_PARTICIPANT_ID,\n INVALID_PARTICIPANT_IDS,\n INVALID_PARTICIPANT_ROLE,\n INVALID_PARTICIPANT_SEEDING,\n INVALID_PARTICIPANT_TYPE,\n INVALID_PARTICIPANT,\n INVALID_POLICY_DEFINITION,\n INVALID_RECORDS,\n INVALID_SCALE_ITEM,\n INVALID_SEED_NUMBER,\n INVALID_SEED_POSITION,\n INVALID_SET_NUMBER,\n INVALID_SIDE_NUMBER,\n INVALID_SCORE,\n INVALID_STAGE,\n INVALID_START_TIME,\n INVALID_STRUCTURE,\n INVALID_STOP_TIME,\n INVALID_TIE_FORMAT,\n INVALID_TIME,\n INVALID_TIME_ITEM,\n INVALID_TOURNAMENT_DATES,\n INVALID_TOURNAMENT_RECORD,\n INVALID_VALUES,\n INVALID_WINNING_SIDE,\n MATCHUP_NOT_FOUND,\n METHOD_NOT_FOUND,\n MISSING_ASSIGNMENTS,\n MISSING_ASYNC_STATE_PROVIDER,\n MISSING_AVOIDANCE_POLICY,\n MISSING_COLLECTION_DEFINITION,\n MISSING_COURT_ID,\n MISSING_COURTS_INFO,\n MISSING_DATE_AVAILABILITY,\n MISSING_DATE,\n MISSING_DRAW_DEFINITION,\n MISSING_DRAW_ID,\n MISSING_DRAW_POSITION,\n MISSING_DRAW_POSITIONS,\n MISSING_DRAW_SIZE,\n MISSING_ENTRIES,\n MISSING_EVENT,\n MISSING_MATCHUP_FORMAT,\n MISSING_MATCHUP_ID,\n MISSING_MATCHUP_IDS,\n MISSING_MATCHUP,\n MISSING_MATCHUPS,\n MISSING_PARTICIPANT_COUNT,\n MISSING_PARTICIPANT_ID,\n MISSING_PARTICIPANT_IDS,\n MISSING_PARTICIPANT_ROLE,\n MISSING_PARTICIPANT,\n MISSING_PARTICIPANTS,\n MISSING_PENALTY_ID,\n MISSING_PENALTY_TYPE,\n MISSING_PERSON_DETAILS,\n MISSING_POLICY_ATTRIBUTES,\n MISSING_POLICY_DEFINITION,\n MISSING_POLICY_TYPE,\n MISSING_POSITION_ASSIGNMENTS,\n MISSING_ROUND_NUMBER,\n MISSING_SCHEDULE,\n MISSING_SCORING_POLICY,\n MISSING_SEED_ASSIGNMENTS,\n MISSING_SEEDCOUNT_THRESHOLDS,\n MISSING_SEEDING_POLICY,\n MISSING_SET_NUMBER,\n MISSING_SET_OBJECT,\n MISSING_SIDE_NUMBER,\n MISSING_STAGE,\n MISSING_STRUCTURE_ID,\n MISSING_STRUCTURE,\n MISSING_STRUCTURES,\n MISSING_TARGET_LINK,\n MISSING_TIE_FORMAT,\n MISSING_TIME_ITEM,\n MISSING_TIME_ITEMS,\n MISSING_TOURNAMENT_ID,\n MISSING_TOURNAMENT_RECORD,\n MISSING_TOURNAMENT_RECORDS,\n MISSING_VALUE,\n MISSING_VENUE_ID,\n MODIFICATIONS_FAILED,\n NO_CANDIDATES,\n NO_DRAW_POSITIONS_AVAILABLE_FOR_QUALIFIERS,\n NO_MODIFICATIONS_APPLIED,\n NO_STAGE_SPACE_AVAILABLE_FOR_ENTRY_STATUS,\n NO_PARTICIPANT_REMOVED,\n NO_VALID_ACTIONS,\n NO_VALID_ATTRIBUTES,\n NO_VALID_DATES,\n NOT_FOUND,\n NOT_IMPLEMENTED,\n PARTICIPANT_ALREADY_CHECKED_IN,\n PARTICIPANT_COUNT_EXCEEDS_DRAW_SIZE,\n PARTICIPANT_ID_EXISTS,\n PARTICIPANT_NOT_CHECKED_IN,\n PARTICIPANT_NOT_FOUND,\n PARTICIPANT_PAIR_EXISTS,\n PENALTY_NOT_FOUND,\n POLICY_NOT_ATTACHED,\n POLICY_NOT_FOUND,\n SCHEDULE_NOT_CLEARED,\n SCHEDULED_MATCHUPS,\n SCORES_PRESENT,\n SEEDSCOUNT_GREATER_THAN_DRAW_SIZE,\n STAGE_SEQUENCE_LIMIT,\n STRUCTURE_NOT_FOUND,\n TEAM_NOT_FOUND,\n UNABLE_TO_ASSIGN_COURT,\n UNLINKED_STRUCTURES,\n UNRECOGNIZED_DRAW_TYPE,\n UNRECOGNIZED_MATCHUP_FORMAT,\n UNRECOGNIZED_MATCHUP_STATUS,\n VALUE_UNCHANGED,\n VENUE_EXISTS,\n};\n\nexport default errorConditionConstants;\n","import { SUCCESS } from '../../constants/resultConstants';\nimport {\n CallListenerArgs,\n DeleteNoticeArgs,\n GetNoticesArgs,\n HandleCaughtErrorArgs,\n ImplemtationGlobalStateTypes,\n Notice,\n} from './globalState';\nimport {\n INVALID_TOURNAMENT_RECORD,\n INVALID_VALUES,\n MISSING_TOURNAMENT_RECORD,\n NOT_FOUND,\n} from '../../constants/errorConditionConstants';\n\nconst syncGlobalState: ImplemtationGlobalStateTypes = {\n disableNotifications: false,\n tournamentId: undefined,\n tournamentRecords: {},\n subscriptions: {},\n modified: false,\n notices: [],\n};\n\nexport default {\n addNotice,\n callListener,\n cycleMutationStatus,\n deleteNotice,\n deleteNotices,\n disableNotifications,\n enableNotifications,\n getNotices,\n getTopics,\n getTournamentId,\n getTournamentRecord,\n getTournamentRecords,\n removeTournamentRecord,\n setSubscriptions,\n setTournamentId,\n setTournamentRecord,\n setTournamentRecords,\n handleCaughtError,\n};\n\nexport function disableNotifications() {\n syncGlobalState.disableNotifications = true;\n}\n\nexport function enableNotifications() {\n syncGlobalState.disableNotifications = false;\n}\n\nexport function getTournamentId() {\n return syncGlobalState.tournamentId;\n}\n\nexport function getTournamentRecord(tournamentId) {\n return syncGlobalState.tournamentRecords[tournamentId];\n}\n\nexport function getTournamentRecords() {\n return syncGlobalState.tournamentRecords;\n}\n\nexport function setTournamentRecord(tournamentRecord) {\n const tournamentId = tournamentRecord?.tournamentId;\n if (tournamentId) {\n syncGlobalState.tournamentRecords[tournamentId] = tournamentRecord;\n return { success: true };\n } else {\n return { error: INVALID_TOURNAMENT_RECORD };\n }\n}\n\nexport function setTournamentId(tournamentId) {\n if (syncGlobalState.tournamentRecords[tournamentId]) {\n syncGlobalState.tournamentId = tournamentId;\n return { success: true };\n } else {\n return { error: MISSING_TOURNAMENT_RECORD };\n }\n}\n\nexport function setTournamentRecords(tournamentRecords) {\n syncGlobalState.tournamentRecords = tournamentRecords;\n const tournamentIds = Object.keys(tournamentRecords);\n if (tournamentIds.length === 1) {\n syncGlobalState.tournamentId = tournamentIds[0];\n } else if (!tournamentIds.length) {\n syncGlobalState.tournamentId = undefined;\n }\n}\n\nexport function removeTournamentRecord(tournamentId) {\n if (typeof tournamentId !== 'string') return { error: INVALID_VALUES };\n if (!syncGlobalState.tournamentRecords[tournamentId])\n return { error: NOT_FOUND };\n\n delete syncGlobalState.tournamentRecords[tournamentId];\n const tournamentIds = Object.keys(syncGlobalState.tournamentRecords);\n if (tournamentIds.length === 1) {\n syncGlobalState.tournamentId = tournamentIds[0];\n } else if (!tournamentIds.length) {\n syncGlobalState.tournamentId = undefined;\n }\n return { success: true };\n}\n\nexport function setSubscriptions(params) {\n if (typeof params.subscriptions !== 'object')\n return { error: INVALID_VALUES };\n Object.keys(params.subscriptions).forEach((subscription) => {\n syncGlobalState.subscriptions[subscription] =\n params.subscriptions[subscription];\n });\n return { ...SUCCESS };\n}\n\nexport function cycleMutationStatus() {\n const status = syncGlobalState.modified;\n syncGlobalState.modified = false;\n return status;\n}\n\nexport function addNotice({ topic, payload, key }: Notice) {\n if (typeof topic !== 'string' || typeof payload !== 'object') {\n return;\n }\n\n if (!syncGlobalState.disableNotifications) syncGlobalState.modified = true;\n\n if (\n syncGlobalState.disableNotifications ||\n !syncGlobalState.subscriptions[topic]\n ) {\n return;\n }\n\n if (key) {\n syncGlobalState.notices = syncGlobalState.notices.filter(\n (notice) => !(notice.topic === topic && notice.key === key)\n );\n }\n\n syncGlobalState.notices.push({ topic, payload, key });\n\n return { ...SUCCESS };\n}\n\nexport function getNotices({ topic }: GetNoticesArgs) {\n const notices = syncGlobalState.notices\n .filter((notice) => notice.topic === topic)\n .map((notice) => notice.payload);\n return notices.length && notices;\n}\n\nexport function deleteNotices() {\n syncGlobalState.notices = [];\n}\n\nexport function deleteNotice({ topic, key }: DeleteNoticeArgs) {\n syncGlobalState.notices = syncGlobalState.notices.filter(\n (notice) => (!topic || notice.topic === topic) && notice.key !== key\n );\n}\n\nexport function getTopics() {\n const topics = Object.keys(syncGlobalState.subscriptions);\n return { topics };\n}\n\nexport function callListener({ topic, notices }: CallListenerArgs) {\n const method = syncGlobalState.subscriptions[topic];\n if (method && typeof method === 'function') {\n method(notices);\n }\n}\n\nexport function handleCaughtError({\n engineName,\n methodName,\n params,\n err,\n}: HandleCaughtErrorArgs) {\n let error;\n if (typeof err === 'string') {\n error = err.toUpperCase();\n } else if (err instanceof Error) {\n error = err.message;\n }\n\n console.log('ERROR', {\n tournamentId: getTournamentId(),\n params: JSON.stringify(params),\n engine: engineName,\n methodName,\n error,\n });\n}\n","import { intersection } from '../../utilities/arrays';\nimport syncGlobalState from './syncGlobalState';\n\nimport { TournamentRecordsArgs } from '../../types/factoryTypes';\nimport {\n ErrorType,\n MISSING_ASYNC_STATE_PROVIDER,\n MISSING_VALUE,\n} from '../../constants/errorConditionConstants';\n\nexport type Notice = {\n topic: string;\n payload: any;\n key?: string;\n};\n\ntype IteratorsType = {\n makeDeepCopy: number;\n [key: string]: any;\n};\n\ntype TimerType = {\n elapsedTime: number;\n startTime?: number;\n state?: string;\n};\ntype timersType = {\n [key: string]: TimerType;\n default: TimerType;\n};\n\ntype DeepCopyType = {\n threshold?: number;\n modulate?: any;\n stringify: string[];\n ignore: any;\n toJSON: string[];\n};\n\ntype DevContextType = {\n iterationThreshold: number;\n firstIteration: boolean;\n notInternalUse: boolean;\n log: boolean;\n};\n\ntype GlobalStateTypes = {\n devContext?: DevContextType | boolean;\n tournamentFactoryVersion: string;\n deepCopyAttributes: DeepCopyType;\n iterators: IteratorsType;\n timers: timersType;\n deepCopy: boolean;\n globalLog?: any;\n};\n\nexport type ImplemtationGlobalStateTypes = TournamentRecordsArgs & {\n tournamentId?: string | undefined;\n disableNotifications: boolean;\n subscriptions: any;\n notices: Notice[];\n modified: boolean;\n};\n\nconst globalState: GlobalStateTypes = {\n tournamentFactoryVersion: '0.0.0',\n timers: { default: { elapsedTime: 0 } },\n iterators: { makeDeepCopy: 0 },\n deepCopyAttributes: {\n stringify: [],\n ignore: [],\n toJSON: [],\n },\n deepCopy: true,\n};\n\nlet _globalStateProvider: any = syncGlobalState;\n\nconst requiredStateProviderMethods = [\n 'addNotice',\n 'callListener',\n 'cycleMutationStatus',\n 'deleteNotice',\n 'deleteNotices',\n 'disableNotifications',\n 'enableNotifications',\n 'getNotices',\n 'getTopics',\n 'getTournamentId',\n 'getTournamentRecord',\n 'getTournamentRecords',\n 'removeTournamentRecord',\n 'setSubscriptions',\n 'setTournamentId',\n 'setTournamentRecord',\n 'setTournamentRecords',\n];\n\nexport function setStateProvider(globalStateProvider?: { [key: string]: any }) {\n if (typeof globalStateProvider !== 'object') {\n throw new Error(`Global state provider can not be undefined or null`);\n } else {\n const providerMethods = intersection(\n Object.keys(globalStateProvider),\n requiredStateProviderMethods\n );\n if (providerMethods.length !== requiredStateProviderMethods.length) {\n throw new Error('Global state provider is missing required methods');\n } else {\n _globalStateProvider = globalStateProvider;\n return { success: true };\n }\n }\n}\n\nexport function createInstanceState() {\n //Only applicable for async\n if (_globalStateProvider.createInstanceState) {\n try {\n _globalStateProvider.createInstanceState();\n } catch (error) {\n return { error };\n }\n return { success: true };\n } else {\n return { error: MISSING_ASYNC_STATE_PROVIDER };\n }\n}\n\n/**\n * if contextCriteria, check whether all contextCriteria keys values are equivalent with globalState.devContext object\n */\nexport function getDevContext(contextCriteria?: any): any {\n if (!contextCriteria || typeof contextCriteria !== 'object') {\n return globalState.devContext ?? false;\n } else {\n if (typeof globalState.devContext !== 'object') return false;\n return (\n Object.keys(contextCriteria).every(\n (key) => globalState.devContext?.[key] === contextCriteria[key]\n ) && globalState.devContext\n );\n }\n}\n\nexport function timeKeeper(\n action: string = 'reset',\n timer: string = 'default'\n): any {\n const timeNow = Date.now();\n\n if (action === 'report') {\n if (timer === 'allTimers') {\n const timers = Object.keys(globalState.timers);\n return timers\n .filter(\n (timer) => timer !== 'default' || globalState.timers[timer].startTime\n )\n .map((timer) => {\n const currentTimer = globalState.timers[timer];\n const elapsedPeriod =\n currentTimer.state === 'stopped'\n ? 0\n : (timeNow - (currentTimer?.startTime ?? 0)) / 1000;\n\n const elapsedTime = currentTimer.elapsedTime + elapsedPeriod;\n return {\n state: globalState.timers[timer].state,\n elapsedTime: elapsedTime.toFixed(2),\n timer,\n };\n });\n } else {\n const elapsedPeriod =\n globalState.timers[timer].state === 'stopped'\n ? 0\n : (timeNow - (globalState.timers[timer]?.startTime ?? 0)) / 1000;\n\n const elapsedTime = globalState.timers[timer].elapsedTime + elapsedPeriod;\n\n return {\n state: globalState.timers[timer].state,\n elapsedTime: elapsedTime.toFixed(2),\n timer,\n };\n }\n }\n\n if (!globalState.timers[timer] || action === 'reset') {\n if (timer === 'allTimers') {\n globalState.timers = { default: { elapsedTime: 0 } };\n return true;\n } else {\n globalState.timers[timer] = {\n startTime: timeNow,\n state: 'active',\n elapsedTime: 0,\n };\n }\n }\n\n if (!globalState.timers[timer].elapsedTime)\n globalState.timers[timer].elapsedTime = 0;\n\n action === 'stop' &&\n globalState.timers[timer].state !== 'stopped' &&\n (globalState.timers[timer].state = 'stopped') &&\n (globalState.timers[timer].elapsedTime +=\n (timeNow - (globalState.timers[timer]?.startTime ?? 0)) / 1000);\n action === 'start' &&\n (globalState.timers[timer].startTime = timeNow) &&\n (globalState.timers[timer].state = 'active');\n\n return globalState.timers[timer];\n}\n\nexport function setGlobalLog(loggingFx?: any) {\n if (typeof loggingFx === 'function') {\n globalState.globalLog = loggingFx;\n } else {\n delete globalState.globalLog;\n }\n}\n\nexport function setDevContext(value?: any) {\n globalState.devContext = value;\n}\n\nexport function setDeepCopyIterations(value: number) {\n globalState.iterators.makeDeepCopy = value;\n}\n\nexport function getDeepCopyIterations() {\n return globalState.iterators.makeDeepCopy;\n}\n\nexport function disableNotifications() {\n _globalStateProvider.disableNotifications();\n}\n\nexport function enableNotifications() {\n _globalStateProvider.enableNotifications();\n}\n\nexport type DeepCopyAttributes = {\n threshold?: number;\n stringify?: string[];\n ignore?: string[];\n toJSON?: string[];\n};\n\nexport function setDeepCopy(value: boolean, attributes: DeepCopyAttributes) {\n if (typeof value === 'boolean') {\n globalState.deepCopy = value;\n }\n if (typeof attributes === 'object') {\n if (Array.isArray(attributes.ignore))\n globalState.deepCopyAttributes.ignore = attributes.ignore;\n if (Array.isArray(attributes.toJSON))\n globalState.deepCopyAttributes.toJSON = attributes.toJSON;\n if (Array.isArray(attributes.stringify))\n globalState.deepCopyAttributes.stringify = attributes.stringify;\n if (attributes.threshold)\n globalState.deepCopyAttributes.threshold = attributes.threshold;\n }\n}\n\nexport function deepCopyEnabled() {\n return {\n enabled: globalState.deepCopy,\n ...globalState.deepCopyAttributes,\n };\n}\n\nexport function setSubscriptions(params: any) {\n if (!params?.subscriptions)\n return { error: MISSING_VALUE, info: 'missing subscriptions' };\n return _globalStateProvider.setSubscriptions({\n subscriptions: params.subscriptions,\n });\n}\n\nexport function cycleMutationStatus() {\n return _globalStateProvider.cycleMutationStatus();\n}\n\nexport function addNotice(notice: Notice) {\n return _globalStateProvider.addNotice(notice);\n}\n\nexport type GetNoticesArgs = {\n topic: string;\n};\n\nexport function getNotices(params: GetNoticesArgs): string[] {\n return _globalStateProvider.getNotices(params);\n}\n\nexport type DeleteNoticeArgs = {\n topic?: string;\n key: string;\n};\nexport function deleteNotice({ key, topic }: DeleteNoticeArgs) {\n return _globalStateProvider.deleteNotice({ key, topic });\n}\n\nexport function deleteNotices() {\n return _globalStateProvider.deleteNotices();\n}\n\nexport function getTopics() {\n return _globalStateProvider.getTopics();\n}\n\nexport type CallListenerArgs = {\n notices: Notice[];\n topic: string;\n};\nexport async function callListener(payload) {\n return _globalStateProvider.callListener(payload);\n}\n\nexport function getTournamentId() {\n return _globalStateProvider.getTournamentId();\n}\n\nexport function getTournamentRecord(tournamentId: string) {\n return _globalStateProvider.getTournamentRecord(tournamentId);\n}\n\nexport function getTournamentRecords() {\n return _globalStateProvider.getTournamentRecords();\n}\n\nexport function setTournamentRecord(tournamentRecord: any) {\n return _globalStateProvider.setTournamentRecord(tournamentRecord);\n}\n\nexport function setTournamentRecords(tournamentRecords: any) {\n return _globalStateProvider.setTournamentRecords(tournamentRecords);\n}\n\nexport function setTournamentId(tournamentId: string): {\n success?: boolean;\n error?: ErrorType;\n} {\n return _globalStateProvider.setTournamentId(tournamentId);\n}\n\nexport function removeTournamentRecord(tournamentId: string) {\n return _globalStateProvider.removeTournamentRecord(tournamentId);\n}\n\nexport function getProvider() {\n return _globalStateProvider;\n}\n\nexport type HandleCaughtErrorArgs = {\n engineName?: string;\n methodName: string;\n params: any;\n err: any;\n};\n\nexport function handleCaughtError({\n engineName,\n methodName,\n params,\n err,\n}: HandleCaughtErrorArgs) {\n const caughtErrorHandler =\n (typeof _globalStateProvider.handleCaughtError === 'function' &&\n _globalStateProvider.handleCaughtError) ||\n syncGlobalState.handleCaughtError;\n\n return caughtErrorHandler({\n engineName,\n methodName,\n params,\n err,\n });\n}\n\nexport function globalLog(engine, log) {\n if (globalState.globalLog) {\n return globalState.globalLog(engine, log);\n } else {\n console.log(engine, log);\n }\n}\n","import {\n dateValidation,\n timeValidation,\n validDateString,\n} from '../fixtures/validations/regex';\n\nexport function getIsoDateString(schedule) {\n let { scheduledDate } = schedule;\n if (!scheduledDate && schedule.scheduledTime)\n scheduledDate = extractDate(schedule.scheduledTime);\n if (!scheduledDate) return;\n\n const extractedTime = extractTime(schedule.scheduledTime);\n let isoDateString = extractDate(scheduledDate);\n if (isoDateString && extractedTime) isoDateString += `T${extractedTime}`;\n return isoDateString;\n}\n\nexport function isDateObject(value) {\n if (typeof value !== 'object' || Array.isArray(value)) {\n return false;\n } else {\n const datePrototype = Object.prototype.toString.call(value);\n return datePrototype === '[object Date]';\n }\n}\n\nexport function validTimeValue(value) {\n const spaceSplit = typeof value === 'string' ? value?.split(' ') : [];\n if (\n value &&\n spaceSplit?.length > 1 &&\n !['AM', 'PM'].includes(spaceSplit[1].toUpperCase())\n )\n return false;\n\n return !!(!value || timeValidation.test(convertTime(value, true, true)));\n}\n\nexport function isValidDateString(scheduleDate) {\n return isISODateString(scheduleDate) || validDateString.test(scheduleDate);\n}\n\nexport function DateHHMM(date) {\n const dt = new Date(date);\n const secs = dt.getSeconds() + 60 * dt.getMinutes() + 60 * 60 * dt.getHours();\n return HHMMSS(secs, { displaySeconds: false });\n}\n\nexport function HHMMSS(s, format?) {\n const secondNumber = parseInt(s, 10); // don't forget the second param\n const hours = Math.floor(secondNumber / 3600);\n const minutes = Math.floor((secondNumber - hours * 3600) / 60);\n const seconds = secondNumber - hours * 3600 - minutes * 60;\n\n const displaySeconds = !format || format?.displaySeconds;\n const timeString = displaySeconds\n ? hours + ':' + minutes + ':' + seconds\n : hours + ':' + minutes;\n return timeString.split(':').map(zeroPad).join(':');\n}\n\nexport const getUTCdateString = (date?) => {\n const dateDate =\n isDate(date) || isISODateString(date) ? new Date(date) : new Date();\n const monthNumber = dateDate.getUTCMonth() + 1;\n const utcMonth = monthNumber < 10 ? `0${monthNumber}` : `${monthNumber}`;\n return `${dateDate.getUTCFullYear()}-${zeroPad(utcMonth)}-${zeroPad(\n dateDate.getUTCDate()\n )}`;\n};\n\nexport function timeUTC(date?) {\n const dateDate =\n isDate(date) || isISODateString(date) ? new Date(date) : new Date();\n return Date.UTC(\n dateDate.getFullYear(),\n dateDate.getMonth(),\n dateDate.getDate()\n );\n}\n\nexport function localizeDate(submittedDate, dateLocalization, locale) {\n const date = new Date(submittedDate);\n if (!isDate(date)) return undefined;\n const defaultLocalization = {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n };\n return date.toLocaleDateString(\n locale,\n dateLocalization || defaultLocalization\n );\n}\n\nexport function formatDate(date?, separator = '-', format = 'YMD') {\n if (!date) return '';\n if (typeof date === 'string' && date.indexOf('T') < 0) date = date + 'T00:00';\n\n const d = new Date(date);\n let month = '' + (d.getMonth() + 1);\n let day = '' + d.getDate();\n const year = d.getFullYear();\n\n if (month.length < 2) month = '0' + month;\n if (day.length < 2) day = '0' + day;\n\n if (format === 'DMY') return [day, month, year].join(separator);\n if (format === 'MDY') return [month, day, year].join(separator);\n if (format === 'YDM') return [year, day, month].join(separator);\n if (format === 'DYM') return [day, year, month].join(separator);\n if (format === 'MYD') return [month, year, day].join(separator);\n return [year, month, day].join(separator);\n}\n\nexport function offsetDate(date) {\n const targetTime = date ? new Date(date) : new Date();\n const tzDifference = targetTime.getTimezoneOffset();\n return new Date(targetTime.getTime() - tzDifference * 60 * 1000);\n}\n\nexport function offsetTime(date?) {\n return offsetDate(date).getTime();\n}\n\n// only returns true for valid date objects\n// dateArg = new Date('xxx') produces 'Invalid Date', which return false\nexport function isDate(dateArg) {\n if (typeof dateArg == 'boolean') return false;\n const t =\n (dateArg instanceof Date && dateArg) ||\n (!isNaN(dateArg) && new Date(dateArg)) ||\n false;\n return t && !isNaN(t.valueOf());\n}\n\nexport function dateRange(startDt?, endDt?) {\n if (!isValidDateString(startDt) || !isValidDateString(endDt)) return [];\n\n const startDateString = extractDate(startDt) + 'T00:00';\n const endDateString = extractDate(endDt) + 'T00:00';\n const startDate = new Date(startDateString);\n const endDate = new Date(endDateString);\n const process =\n isDate(endDate) &&\n isDate(startDate) &&\n isValidDateRange(startDate, endDate);\n const between: Date[] = [];\n let iterations = 0;\n\n if (process) {\n const currentDate = startDate;\n let dateSecs = currentDate.getTime();\n while (dateSecs <= endDate.getTime() && iterations < 300) {\n iterations += 1;\n // must be a *new* Date otherwise it is an array of the same object\n between.push(new Date(currentDate));\n dateSecs = currentDate.setDate(currentDate.getDate() + 1);\n }\n }\n\n return between.map((date) => formatDate(date));\n\n function isValidDateRange(minDate, maxDate) {\n return minDate <= maxDate;\n }\n}\n\n// matches valid ISO date string\nconst re =\n /^([+-]?\\d{4}(?!\\d{2}\\b))((-?)((0[1-9]|1[0-2])(\\3([12]\\d|0[1-9]|3[01]))?|W([0-4]\\d|5[0-2])(-?[1-7])?|(00[1-9]|0[1-9]\\d|[12]\\d{2}|3([0-5]\\d|6[1-6])))([T\\s]((([01]\\d|2[0-3])((:?)[0-5]\\d)?|24:?00)([.,]\\d+(?!:))?)?(\\17[0-5]\\d([.,]\\d+)?)?([zZ]|([+-])([01]\\d|2[0-3]):?([0-5]\\d)?)?)?)?$/;\nexport function isISODateString(dateString) {\n if (typeof dateString !== 'string') return false;\n return re.test(dateString);\n}\n\nfunction isTimeString(timeString) {\n if (typeof timeString !== 'string') return false;\n const noZ = timeString.split('Z')[0];\n const parts: string[] = noZ.split(':');\n const isNumeric = parts.every((part) => !isNaN(parseInt(part)));\n const invalid =\n parts.length < 2 ||\n !isNumeric ||\n parseInt(parts[0]) > 23 ||\n parseInt(parts[1]) > 60;\n return !invalid;\n}\n\nexport function timeStringMinutes(timeString?) {\n const validTimeString = extractTime(timeString);\n if (!validTimeString) return 0;\n const [hours, minutes] = validTimeString\n .split(':')\n .map((value) => parseInt(value));\n return hours * 60 + minutes;\n}\n\nexport function dayMinutesToTimeString(totalMinutes) {\n let hours = Math.floor(totalMinutes / 60);\n const minutes = totalMinutes - hours * 60;\n if (hours > 23) hours = hours % 24;\n return [zeroPad(hours), zeroPad(minutes)].join(':');\n}\n\nexport function tidyTime(timeString) {\n return isTimeString(timeString)\n ? timeString.split(':').slice(0, 2).map(zeroPad).join(':')\n : undefined;\n}\n\nexport function extractTime(dateString) {\n return isISODateString(dateString) && dateString.indexOf('T') > 0\n ? tidyTime(dateString.split('T').reverse()[0])\n : tidyTime(dateString);\n}\n\nexport function extractDate(dateString) {\n return isISODateString(dateString) || dateValidation.test(dateString)\n ? dateString.split('T')[0]\n : undefined;\n}\n\nexport function dateStringDaysChange(dateString, daysChange) {\n const date = new Date(dateString);\n date.setDate(date.getDate() + daysChange);\n return extractDate(date.toISOString());\n}\n\nexport function splitTime(value) {\n value = typeof value !== 'string' ? '00:00' : value;\n const o: any = {},\n time: any = {};\n ({ 0: o.time, 1: o.ampm } = value.split(' ') || []);\n ({ 0: time.hours, 1: time.minutes } = o.time.split(':') || []);\n time.ampm = o.ampm;\n\n if (\n isNaN(time.hours) ||\n isNaN(time.minutes) ||\n (time.ampm && !['AM', 'PM'].includes(time.ampm.toUpperCase()))\n )\n return {};\n return time;\n}\n\nexport function militaryTime(value?) {\n const time = splitTime(value);\n if (time.ampm && time.hours) {\n if (time.ampm.toLowerCase() === 'pm' && parseInt(time.hours) < 12)\n time.hours = ((time.hours && parseInt(time.hours)) || 0) + 12;\n if (time.ampm.toLowerCase() === 'am' && time.hours === '12')\n time.hours = '00';\n }\n const timeString = `${time.hours || '12'}:${time.minutes || '00'}`;\n return timeString.split(':').map(zeroPad).join(':');\n}\n\nexport function regularTime(value) {\n const time = splitTime(value);\n if (typeof time === 'object' && !Object.keys(time).length) return undefined;\n\n if (time.ampm) return value;\n if (time.hours > 12) {\n time.hours -= 12;\n time.ampm = 'PM';\n } else if (time.hours === '12') {\n time.ampm = 'PM';\n } else if (time.hours === '00') {\n time.hours = '12';\n time.ampm = 'AM';\n } else {\n time.ampm = 'AM';\n }\n if (time.hours?.[0] === '0') {\n time.hours = time.hours.slice(1);\n }\n\n return `${time.hours || '12'}:${time.minutes || '00'} ${time.ampm}`;\n}\n\nexport function convertTime(value, time24?, keepDate?) {\n const hasDate = extractDate(value);\n const timeString = extractTime(value);\n const timeValue = hasDate ? timeString : value;\n\n return !value\n ? undefined\n : (time24 && ((hasDate && keepDate && value) || militaryTime(timeValue))) ||\n regularTime(timeValue);\n}\n\nexport function timeSort(a, b) {\n const as = splitTime(a);\n const bs = splitTime(b);\n if (parseInt(as.hours) < parseInt(bs.hours)) return -1;\n if (parseInt(as.hours) > parseInt(bs.hours)) return 1;\n if (as.hours === bs.hours) {\n if (parseInt(as.minutes) < parseInt(bs.minutes)) return -1;\n if (parseInt(as.minutes) > parseInt(bs.minutes)) return 1;\n }\n return 0;\n}\n\nexport function weekDays(date: any = new Date(), firstDayOfWeek = 0) {\n if (!isDate(date)) return [];\n const dates = [0, 1, 2, 3, 4, 5, 6].map((i) =>\n dayOfWeek(date, i + firstDayOfWeek)\n );\n return dates;\n\n function dayOfWeek(date, index) {\n const d = new Date(date);\n const day = d.getDay();\n const diff = index - day;\n\n const nextDate = new Date(d.setDate(d.getDate() + diff));\n return formatDate(nextDate);\n }\n}\n\nexport function addDays(date, days = 7) {\n const universalDate = extractDate(date) + 'T00:00';\n const now = new Date(universalDate);\n const adjustedDate = new Date(now.setDate(now.getDate() + days));\n return formatDate(adjustedDate);\n}\nexport function addWeek(date) {\n return addDays(date);\n}\nexport function subtractWeek(date, dateFormat?) {\n const universalDate = extractDate(date) + 'T00:00';\n const now = new Date(universalDate);\n return formatDate(now.setDate(now.getDate() - 7), dateFormat);\n}\n\nexport function getDateByWeek(week, year, dateFormat, sunday = false) {\n const date = new Date(year, 0, 1 + (week - 1) * 7);\n const startValue = sunday ? 0 : 1;\n date.setDate(date.getDate() + (startValue - date.getDay()));\n return formatDate(date, dateFormat);\n}\n\nexport function dateFromDay(year, day, dateFormat?) {\n const date = new Date(year, 0); // initialize a date in `year-01-01`\n return formatDate(new Date(date.setDate(day)), dateFormat); // add the number of days\n}\n\nexport function timeToDate(timeString, date = undefined) {\n const [hours, minutes] = (timeString || '00:00').split(':').map(zeroPad);\n const milliseconds = offsetDate(date).setHours(hours, minutes, 0, 0);\n return offsetDate(milliseconds);\n}\n\nexport function minutesDifference(date1, date2, absolute = true) {\n const dt1 = new Date(date1);\n const dt2 = new Date(date2);\n const diff = (dt2.getTime() - dt1.getTime()) / 1000 / 60;\n return absolute ? Math.abs(Math.round(diff)) : Math.round(diff);\n}\n\nexport function addMinutesToTimeString(timeString?, minutes?) {\n const validTimeString = extractTime(timeString);\n if (!validTimeString) return '00:00';\n const minutesToAdd = isNaN(minutes) ? 0 : minutes;\n return extractTime(\n addMinutes(timeToDate(validTimeString), minutesToAdd).toISOString()\n );\n}\n\nexport function addMinutes(startDate, minutes) {\n const date = new Date(startDate);\n return new Date(date.getTime() + minutes * 60000);\n}\n\nexport function zeroPad(number) {\n return number.toString()[1] ? number : '0' + number;\n}\n\nexport function sameDay(date1, date2) {\n const d1 = new Date(date1);\n const d2 = new Date(date2);\n return (\n d1.getFullYear() === d2.getFullYear() &&\n d1.getMonth() === d2.getMonth() &&\n d1.getDate() === d2.getDate()\n );\n}\n\nexport const dateTime = {\n addDays,\n addWeek,\n addMinutesToTimeString,\n convertTime,\n getIsoDateString,\n getUTCdateString,\n DateHHMM,\n extractDate,\n extractTime,\n formatDate,\n getDateByWeek,\n isISODateString,\n isDate,\n isTimeString,\n offsetDate,\n offsetTime,\n sameDay,\n timeStringMinutes,\n timeToDate,\n timeUTC,\n validTimeValue,\n validDateString,\n timeValidation,\n dateValidation,\n};\n","import { isDateObject } from './dateTime';\nimport {\n deepCopyEnabled,\n getDevContext,\n setDeepCopyIterations,\n getProvider,\n} from '../global/state/globalState';\n\nexport function makeDeepCopy(\n sourceObject, // arbitrary JSON object; functions will be stripped.\n convertExtensions?, // optional - all extension objects converted to attributes ._key\n internalUse?, // disregard deepCopy being disabled within the engine - necessary for query results\n removeExtensions?, // optional - strip all extension attributes\n iteration = 0 // escape hatch - check against iteration threshold\n) {\n if (getProvider().makeDeepCopy)\n return getProvider().makeDeepCopy(\n sourceObject,\n convertExtensions,\n internalUse,\n removeExtensions\n );\n\n const deepCopy = deepCopyEnabled();\n\n const { stringify, toJSON, ignore, modulate } = deepCopy || {};\n\n if (\n (!deepCopy?.enabled && !internalUse) ||\n typeof sourceObject !== 'object' ||\n typeof sourceObject === 'function' ||\n sourceObject === null ||\n (typeof deepCopy?.threshold === 'number' && iteration >= deepCopy.threshold)\n ) {\n return sourceObject;\n }\n\n const devContext = getDevContext({ makeDeepCopy: true });\n if (devContext) {\n setDeepCopyIterations(iteration);\n if (\n typeof devContext === 'object' &&\n (iteration > (devContext.iterationThreshold || 15) ||\n (devContext.firstIteration && iteration === 0)) &&\n devContext.log &&\n (!devContext.notInternalUse ||\n (devContext.notInternalUse && !internalUse))\n ) {\n console.log({ devContext, iteration, internalUse }, sourceObject);\n }\n }\n\n const targetObject = Array.isArray(sourceObject) ? [] : {};\n\n const sourceObjectKeys = Object.keys(sourceObject).filter(\n (key) =>\n !internalUse ||\n !ignore ||\n (Array.isArray(ignore) && !ignore.includes(key)) ||\n (typeof ignore === 'function' && !ignore(key))\n );\n\n const stringifyValue = (key, value) => {\n targetObject[key] =\n typeof value?.toString === 'function'\n ? value.toString()\n : JSON.stringify(value);\n };\n\n for (const key of sourceObjectKeys) {\n const value = sourceObject[key];\n const modulated =\n typeof modulate === 'function' ? modulate(value) : undefined;\n if (modulated !== undefined) {\n targetObject[key] = modulated;\n } else if (\n convertExtensions &&\n key === 'extensions' &&\n Array.isArray(value)\n ) {\n const extensionConversions = extensionsToAttributes(value);\n Object.assign(targetObject, ...extensionConversions);\n } else if (removeExtensions && key === 'extensions') {\n targetObject[key] = [];\n } else if (Array.isArray(stringify) && stringify.includes(key)) {\n stringifyValue(key, value);\n } else if (\n Array.isArray(toJSON) &&\n toJSON.includes(key) &&\n typeof value?.toJSON === 'function'\n ) {\n targetObject[key] = value.toJSON();\n } else if (value === null) {\n targetObject[key] = undefined;\n } else if (isDateObject(value)) {\n targetObject[key] = new Date(value).toISOString();\n } else {\n targetObject[key] = makeDeepCopy(\n value,\n convertExtensions,\n internalUse,\n removeExtensions,\n iteration + 1\n );\n }\n }\n\n return targetObject;\n}\n\nexport function extensionsToAttributes(extensions) {\n return extensions\n ?.map((extension) => {\n const { name, value } = extension;\n return name && value && { [`_${name}`]: value };\n })\n .filter(Boolean);\n}\n","import { makeDeepCopy } from './makeDeepCopy';\n\ntype ProcessKeysArgs = {\n significantCharacters?: boolean;\n attributes: string[];\n targetElement: any;\n};\n\nexport function getAccessorValue({ element, accessor }) {\n if (typeof accessor !== 'string') return { values: [] };\n const targetElement = makeDeepCopy(element);\n const attributes = accessor.split('.');\n\n const values: any[] = [];\n let value;\n processKeys({ targetElement, attributes });\n\n const result: any = { value };\n if (values.length) result.values = values;\n return result;\n\n function processKeys({\n targetElement,\n attributes = [],\n significantCharacters,\n }: ProcessKeysArgs) {\n for (const [index, attribute] of attributes.entries()) {\n if (targetElement?.[attribute]) {\n const remainingKeys = attributes.slice(index + 1);\n if (!remainingKeys.length) {\n if (!value) value = targetElement[attribute];\n if (!values.includes(targetElement[attribute])) {\n values.push(targetElement[attribute]);\n }\n } else if (Array.isArray(targetElement[attribute])) {\n const values = targetElement[attribute];\n values.forEach((nestedTarget) =>\n processKeys({\n targetElement: nestedTarget,\n attributes: remainingKeys,\n })\n );\n } else {\n targetElement = targetElement[attribute];\n checkValue({ targetElement, index });\n }\n }\n }\n\n function checkValue({ targetElement, index }) {\n if (\n targetElement &&\n index === attributes.length - 1 &&\n ['string', 'number'].includes(typeof targetElement)\n ) {\n const extractedValue = significantCharacters\n ? targetElement.slice(0, significantCharacters)\n : targetElement;\n\n if (value) {\n if (!values.includes(extractedValue)) {\n values.push(extractedValue);\n }\n } else {\n value = extractedValue;\n values.push(extractedValue);\n }\n }\n }\n }\n}\n","import { deepCopyEnabled } from '../global/state/globalState';\nimport { getAccessorValue } from './getAccessorValue';\n\nexport function isString(obj) {\n return typeof obj === 'string';\n}\n\nexport function isObject(obj) {\n return obj !== null && typeof obj === 'object';\n}\n\nexport function objShallowEqual(o1, o2) {\n if (!isObject(o1) || !isObject(o2)) return false;\n const keys1 = Object.keys(o1);\n const keys2 = Object.keys(o2);\n\n if (keys1.length !== keys2.length) {\n return false;\n }\n\n for (const key of keys1) {\n if (o1[key] !== o2[key]) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function createMap(objectArray, attribute) {\n if (!Array.isArray(objectArray)) return {};\n\n return Object.assign(\n {},\n ...(objectArray ?? [])\n .filter(isObject)\n .map((obj) => {\n return (\n obj[attribute] && {\n [obj[attribute]]: obj,\n }\n );\n })\n .filter(Boolean)\n );\n}\n\n// e.g. result.find(hav({ attr: value })) -or- result.filter(hav({ attr: value }))\nexport const hasAttributeValues = (a) => (o) =>\n Object.keys(a).every((key) => o[key] === a[key]);\n\n// extracts targeted attributes\n// e.g. const byeAssignments = positionAssignments.filter(xa('bye')).map(xa('drawPosition'));\n// supports xa('string'), xa(['string', 'string']), xa({ attr1: true, attr2: true })\nexport const extractAttributes = (accessor) => (element) =>\n !accessor || typeof element !== 'object'\n ? undefined\n : (Array.isArray(accessor) &&\n accessor.map((a) => ({\n [a]: getAccessorValue({ element, accessor: a })?.value,\n }))) ||\n (typeof accessor === 'object' &&\n Object.keys(accessor).map((key) => ({\n [key]: getAccessorValue({ element, accessor: key })?.value,\n }))) ||\n (typeof accessor === 'string' && getAccessorValue({ element, accessor }))\n ?.value;\n\nfunction getDefinedKeys(obj, ignoreValues, ignoreEmptyArrays) {\n return Object.keys(obj).filter(\n (key) =>\n !ignoreValues.includes(obj[key]) &&\n (!ignoreEmptyArrays || (Array.isArray(obj[key]) ? obj[key].length : true))\n );\n}\n\nexport function definedAttributes(\n obj: object,\n ignoreFalse?: boolean,\n ignoreEmptyArrays?: boolean,\n shallow?: boolean\n) {\n if (typeof obj !== 'object' || obj === null) return obj;\n const deepCopy = deepCopyEnabled();\n if (!deepCopy?.enabled) shallow = true;\n\n const ignoreValues: any[] = ['', undefined, null];\n if (ignoreFalse) ignoreValues.push(false);\n\n const definedKeys = getDefinedKeys(obj, ignoreValues, ignoreEmptyArrays);\n\n return Object.assign(\n {},\n ...definedKeys.map((key) => {\n return Array.isArray(obj[key])\n ? {\n [key]: shallow\n ? obj[key]\n : obj[key].map((m) => definedAttributes(m)),\n } // doesn't filter out undefined array elements\n : { [key]: shallow ? obj[key] : definedAttributes(obj[key]) };\n })\n );\n}\n\n// useful in notifications where back end does not recognize undefined for updates\nexport function undefinedToNull(obj: object, shallow?: boolean) {\n if (obj === undefined) return null;\n if (typeof obj !== 'object' || obj === null) return obj;\n\n const definedKeys = Object.keys(obj);\n const notNull = (value) => (value === undefined ? null : value);\n\n return Object.assign(\n {},\n ...definedKeys.map((key) => {\n return Array.isArray(obj[key])\n ? {\n [key]: shallow ? obj[key] : obj[key].map((m) => undefinedToNull(m)),\n }\n : { [key]: shallow ? notNull(obj[key]) : undefinedToNull(obj[key]) };\n })\n );\n}\n\nfunction countKeys(o) {\n if (Array.isArray(o)) {\n return o.length + o.map(countKeys).reduce((a, b) => a + b, 0);\n } else if (typeof o === 'object' && o !== null) {\n return (\n Object.keys(o).length +\n Object.keys(o)\n .map((k) => countKeys(o[k]))\n .reduce((a, b) => a + b, 0)\n );\n }\n return 0;\n}\n\nexport function generateHashCode(o) {\n if (o === null || typeof o !== 'object') return undefined;\n const str = JSON.stringify(o);\n const keyCount = countKeys(o);\n const charSum = str.split('').reduce((a, b) => a + b.charCodeAt(0), 0);\n return [str.length, keyCount, charSum].map((e) => e.toString(36)).join('');\n}\n","// NOTE: type really does need to be any!\nexport function attributeFilter(params?: any): any {\n if (params === null) return {};\n const { source, template } = params || {};\n if (!template) return source;\n\n const target = {};\n attributeCopy(source, template, target);\n\n return target;\n\n function attributeCopy(valuesObject, templateObject, outputObject) {\n if (!valuesObject || !templateObject) return undefined;\n const vKeys = Object.keys(valuesObject);\n const oKeys = Object.keys(templateObject);\n\n // the orMap allows spcification of { 'a||b': boolean } so that filter templates can apply to multiple attributes\n const orMap = Object.assign(\n {},\n ...oKeys\n .filter((key) => key.indexOf('||'))\n .map((key) => key.split('||').map((or) => ({ [or]: key })))\n .flat()\n );\n const allKeys = oKeys.concat(...Object.keys(orMap));\n const wildcard = allKeys.includes('*');\n\n for (const vKey of vKeys) {\n if (allKeys.indexOf(vKey) >= 0 || wildcard) {\n const templateKey = orMap[vKey] || vKey;\n const tobj = templateObject[templateKey] || wildcard;\n const vobj = valuesObject[vKey];\n\n if (\n typeof tobj === 'object' &&\n typeof vobj !== 'function' &&\n !Array.isArray(tobj)\n ) {\n if (Array.isArray(vobj)) {\n const mappedElements = vobj\n .map((arrayMember) => {\n const target = {};\n const result = attributeCopy(arrayMember, tobj, target);\n return result !== false ? target : undefined;\n })\n .filter(Boolean);\n outputObject[vKey] = mappedElements;\n } else if (vobj) {\n outputObject[vKey] = {};\n attributeCopy(vobj, tobj, outputObject[vKey]);\n }\n } else {\n const value = valuesObject[vKey];\n const exclude = Array.isArray(tobj) && !tobj.includes(value);\n if (exclude) return false;\n\n if (\n templateObject[vKey] ||\n (wildcard && templateObject[vKey] !== false)\n ) {\n outputObject[vKey] = value;\n }\n }\n }\n }\n return undefined;\n }\n}\n","export function generateTimeCode(index: number = 0): string {\n const uidate = new Date();\n uidate.setHours(uidate.getHours() + index);\n return uidate.getTime().toString(36).slice(-6).toUpperCase();\n}\n","import { isNumeric } from './math';\n\nimport { INVALID_VALUES } from '../constants/errorConditionConstants';\n\n/**\n *\n * @param {object[]} arrayOfJSON - JSON objects array\n * @param {object} config - object which configures processing (see below)\n * @returns {string} - joined by '\\r\\n' or specified line separator\n *\n * config {\n * {boolean} includeTransformAccessors, // transform accessors are included with columnAccessors\n * {string[]} columnAccessors, // [ 'includeThis', 'andThis' ]\n * {object} columnTransform, // e.g. { 'newColumnName': ['oldColumn1', 'oldColumn2' ]}\n * {object} columnMap, // e.g. { 'columnName': 'newColumnName' }\n * {object} valuesMap, // e.g. { 'columnName': { 'value1': 'mappedValue' }} // useful for mapping IDs\n * {array} sortOrder // e.g. ['columnName1', 'columnName2'] // determine order of csv columns\n * {object} context, // attributes which are to be added to all rows { 'columnName': 'value }\n * {string} delimiter, // defaults to '\"'\n * {string} columnJoiner, // defaults to ',' // defines how CSV columns are joined\n * {string} rowJoiner, // defaults to '\\r\\n' // defines how CSV lines are joined\n * {string} keyJoiner, // defaults to '.' // defines how flattened column names are constructed\n * }\n *\n * NOTE: `columnTransform` mapped array elements are sensitive to order and will resolve to the first matching value\n * NOTE: `columnMap` should not contain new columnName(s) that are `columnTransform` keys\n */\nexport function JSON2CSV(arrayOfJSON?, config?) {\n if (config && typeof config !== 'object') return INVALID_VALUES;\n\n let { columnTransform = {} } = config || {};\n\n const {\n includeTransformAccessors,\n includeHeaderRow = true,\n returnTransformedJSON,\n removeEmptyColumns,\n onlyHeaderRow,\n\n columnAccessors = [],\n functionMap = {},\n columnMap = {},\n valuesMap = {},\n context = {},\n\n delimiter = '\"',\n columnJoiner = ',',\n rowJoiner = '\\r\\n',\n keyJoiner = '.',\n } = config || {};\n\n if (\n !Array.isArray(arrayOfJSON) ||\n !Array.isArray(columnAccessors) ||\n typeof context !== 'object' ||\n typeof columnMap !== 'object' ||\n typeof columnTransform !== 'object' ||\n typeof functionMap !== 'object' ||\n typeof valuesMap !== 'object' ||\n typeof columnJoiner !== 'string' ||\n typeof rowJoiner !== 'string' ||\n typeof keyJoiner !== 'string' ||\n typeof delimiter !== 'string'\n )\n return INVALID_VALUES;\n\n // ensure all column transformers are arrays\n columnTransform = Object.assign(\n {},\n ...Object.keys(columnTransform)\n .reverse() // reverse so that exported CSV columns are in the order as defined\n .map((key) => ({\n [key]: Array.isArray(columnTransform[key])\n ? columnTransform[key]\n : [\n // ensure transform attributes are strings\n typeof columnTransform[key] === 'string' && columnTransform[key],\n ].filter(Boolean),\n }))\n );\n\n const flattened = arrayOfJSON\n .filter(Boolean)\n .map((obj) => flattenJSON(obj, keyJoiner));\n\n const transformColumns = Object.values(columnTransform).flat();\n if (includeTransformAccessors) columnAccessors.push(...transformColumns);\n\n const headerRow = flattened\n .reduce(\n (aggregator, row) =>\n Object.keys(row).every(\n (key) => (!aggregator.includes(key) && aggregator.push(key)) || true\n ) && aggregator,\n []\n )\n .filter((key) => !columnAccessors?.length || columnAccessors.includes(key));\n\n const accessorMap = Object.assign(\n {},\n ...Object.keys(columnTransform)\n .reverse() // so that original order is preserved when later pushed\n .map((transform) =>\n columnTransform[transform]\n .map((value) => ({ [value]: transform }))\n .flat()\n )\n .flat()\n );\n\n const sortColumns = (a, b) =>\n !config?.sortOrder\n ? 0\n : (config.sortOrder.includes(a) &&\n config.sortOrder.includes(b) &&\n config.sortOrder.indexOf(a) - config.sortOrder.indexOf(b)) ||\n (!config.sortOrder.includes(b) && -1);\n\n const tranformedHeaderRow = headerRow\n .reduce((def, key) => {\n const transform = accessorMap[key];\n if (transform) {\n if (!def.includes(transform)) def.push(transform);\n } else {\n def.push(key);\n }\n return def;\n }, [])\n .sort(sortColumns);\n\n Object.keys(columnMap).forEach(\n (columnName) =>\n !tranformedHeaderRow.includes(columnName) &&\n tranformedHeaderRow.unshift(columnName)\n );\n\n Object.keys(columnTransform).forEach(\n (columnName) =>\n !tranformedHeaderRow.includes(columnName) &&\n tranformedHeaderRow.unshift(columnName)\n );\n\n typeof context === 'object' &&\n Object.keys(context).forEach(\n (columnName) =>\n !tranformedHeaderRow.includes(columnName) &&\n tranformedHeaderRow.unshift(columnName)\n );\n\n let mappedHeaderRow = tranformedHeaderRow.map((key) => columnMap[key] || key);\n\n if (onlyHeaderRow) return [mappedHeaderRow];\n\n const withDelimiter = (value) => `${delimiter}${value}${delimiter}`;\n\n const columnValueCounts: number[] = [];\n const processRow = (row) => {\n return Object.values(\n tranformedHeaderRow.reduce((columnsMap, columnName, columnIndex) => {\n const accessors = columnTransform[columnName];\n const value =\n (accessors?.length\n ? row[accessors.find((accessor) => row[accessor])]\n : row[columnName]) ||\n context?.[columnName] ||\n '';\n\n const mappedValue = valuesMap[columnName]?.[value] || value;\n const fxValue =\n typeof functionMap[columnName] === 'function'\n ? functionMap[columnName](mappedValue)\n : mappedValue;\n columnsMap[columnName] = withDelimiter(fxValue);\n if (fxValue) {\n columnValueCounts[columnIndex] =\n (columnValueCounts[columnIndex] || 0) + 1;\n }\n return columnsMap;\n }, {})\n );\n };\n\n let flattenedRows = flattened.map(processRow);\n\n const indicesToRemove =\n removeEmptyColumns &&\n [...columnValueCounts]\n .map((count, index) => !count && index)\n .filter(isNumeric)\n .reverse();\n\n if (indicesToRemove) {\n const purge = (row) =>\n row.filter((_, index) => !indicesToRemove.includes(index));\n flattenedRows = flattenedRows.map(purge);\n mappedHeaderRow = purge(mappedHeaderRow);\n }\n\n const rows = flattenedRows.map((row) => row.join(columnJoiner));\n\n if (returnTransformedJSON) {\n return rows.map((row) => {\n const columnValues = row.split(columnJoiner);\n return Object.assign(\n {},\n ...columnValues.map((v, i) => ({ [mappedHeaderRow[i]]: v }))\n );\n });\n }\n\n return includeHeaderRow\n ? [mappedHeaderRow.map(withDelimiter).join(columnJoiner), ...rows].join(\n rowJoiner\n )\n : rows.join(rowJoiner);\n}\n\nexport function flattenJSON(obj, keyJoiner: string = '.', path: string[] = []) {\n return (\n typeof obj === 'object' &&\n Object.keys(obj).reduce((result, key: string) => {\n if (typeof obj[key] !== 'object') {\n result[path.concat(key).join(keyJoiner)] = obj[key];\n return result;\n }\n return Object.assign(\n result,\n flattenJSON(obj[key], keyJoiner, path.concat(key))\n );\n }, {})\n );\n}\n","/*\n based on an answer provided by Jeff Ward on StackOverflow; November 2019\n https://stackoverflow.com/users/1026023/jeff-ward\n https://stackoverflow.com/questions/105034/how-to-create-guid-uuid?rq=1\n*/\n\nimport { generateRange } from './arrays';\n\n/**\n * generate a given number of UUIDs\n *\n * @param {number} count - number of UUIDs to generate\n */\nexport function UUIDS(count = 1) {\n return generateRange(0, count).map(UUID);\n}\n\nexport function UUID() {\n const lut: string[] = [];\n\n for (let i = 0; i < 256; i++) {\n lut[i] = (i < 16 ? '0' : '') + i.toString(16);\n }\n\n const d0 = (Math.random() * 0xffffffff) | 0;\n const d1 = (Math.random() * 0xffffffff) | 0;\n const d2 = (Math.random() * 0xffffffff) | 0;\n const d3 = (Math.random() * 0xffffffff) | 0;\n // eslint-disable-next-line no-mixed-operators\n return (\n lut[d0 & 0xff] +\n lut[(d0 >> 8) & 0xff] +\n lut[(d0 >> 16) & 0xff] +\n lut[(d0 >> 24) & 0xff] +\n '-' +\n // eslint-disable-next-line no-mixed-operators\n lut[d1 & 0xff] +\n lut[(d1 >> 8) & 0xff] +\n '-' +\n lut[((d1 >> 16) & 0x0f) | 0x40] +\n lut[(d1 >> 24) & 0xff] +\n '-' +\n // eslint-disable-next-line no-mixed-operators\n lut[(d2 & 0x3f) | 0x80] +\n lut[(d2 >> 8) & 0xff] +\n '-' +\n lut[(d2 >> 16) & 0xff] +\n lut[(d2 >> 24) & 0xff] +\n // eslint-disable-next-line no-mixed-operators\n lut[d3 & 0xff] +\n lut[(d3 >> 8) & 0xff] +\n lut[(d3 >> 16) & 0xff] +\n lut[(d3 >> 24) & 0xff]\n );\n}\n\n/**\n * UUID prepended with 'u_' which is safe for html attribute ids\n */\nexport function safeUUID() {\n return `u_${UUID()}`;\n}\n"],"names":["val","syncGlobalState","targetElement","attributes","values","target"],"mappings":"AAAgB,SAAA,WAAA,CAAY,GAAG,CAAG,EAAA;AAChC,EAAA,OAAO,CAAI,GAAA,CAAA,CAAA;AACb;;ACFO,SAAS,UAAU,GAAsB,EAAA;AAC9C,EAAA,IAAI,OAAO,GAAQ,KAAA,QAAA;AAAU,IAAO,OAAA,QAAA,CAAS,GAAI,CAAA,QAAA,EAAU,CAAA,CAAA;AAC3D,EAAA,OAAO,SAAS,GAAG,CAAA,CAAA;AACrB;;ACAO,SAAS,WAAW,CAAI,EAAA;AAC7B,EAAA,IAAI,MAAM,CAAC,CAAA;AAAG,IAAO,OAAA,KAAA,CAAA;AACrB,EAAO,OAAA,CAAA,IAAA,CAAM,CAAK,GAAA,CAAA,GAAI,CAAQ,MAAA,CAAA,CAAA;AAChC,CAAA;AAwBO,SAAS,gBAAgB,GAAK,EAAA;AACnC,EAAA,OAAO,IAAK,CAAA,GAAA,CAAI,CAAG,EAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAK,GAAI,CAAA,GAAG,CAAI,GAAA,IAAA,CAAK,GAAI,CAAA,CAAC,CAAC,CAAC,CAAA,CAAA;AAC5D,CAAA;AAEO,SAAS,UAAU,KAAO,EAAA;AAC/B,EAAA,OAAO,CAAC,KAAA,CAAM,UAAW,CAAA,KAAK,CAAC,CAAA,CAAA;AACjC,CAAA;AAEO,SAAS,MAAM,GAAK,EAAA;AACzB,EAAM,MAAA,MAAA,GAAS,UAAU,GAAG,CAAA,CAAA;AAC5B,EAAA,IAAI,MAAM,MAAM,CAAA;AAAG,IAAO,OAAA,KAAA,CAAA,CAAA;AAC1B,EAAA,IAAI,MAAW,KAAA,CAAA;AAAG,IAAO,OAAA,KAAA,CAAA;AACzB,EAAQ,OAAA,CAAA,MAAA,GAAS,CAAC,MAAY,MAAA,CAAA,CAAA;AAChC,CAAA;AAEO,SAAS,aAAa,CAAI,EAAA;AAC/B,EAAA,IAAI,MAAM,CAAC,CAAA;AAAG,IAAO,OAAA,KAAA,CAAA;AACrB,EAAO,OAAA,CAAC,UAAW,CAAA,CAAC,CAAG,EAAA;AACrB,IAAA,CAAA,EAAA,CAAA;AAAA,GACF;AACA,EAAO,OAAA,CAAA,CAAA;AACT;;AChDO,SAAS,OAAO,GAAK,EAAA;AAC1B,EAAO,OAAA,GAAA,CAAI,MAAO,CAAA,CAAC,IAAM,EAAA,CAAA,EAAG,MAAM,CAAE,CAAA,WAAA,CAAY,IAAI,CAAA,KAAM,CAAC,CAAA,CAAA;AAC7D,CAAA;AAEO,SAAS,QAAQ,GAAK,EAAA;AAC3B,EAAA,OAAO,KAAK,GAAI,CAAA,CAAC,SAAU,IAAS,KAAA,IAAA,GAAO,SAAY,IAAK,CAAA,CAAA;AAC9D,CAAA;AAEO,SAAS,aAAa,GAAK,EAAA;AAChC,EAAO,OAAA,GAAA,CACJ,GAAI,CAAA,CAAC,CAAM,KAAA,CAAC,IAAK,CAAA,MAAA,EAAU,EAAA,CAAC,CAAC,CAAA,CAC7B,IAAK,CAAA,CAAC,CAAG,EAAA,CAAA,KAAM,CAAE,CAAA,CAAC,CAAI,GAAA,CAAA,CAAE,CAAC,CAAC,CAC1B,CAAA,GAAA,CAAI,CAAC,CAAA,KAAM,CAAE,CAAA,CAAC,CAAC,CAAA,CAAA;AACpB,CAAA;AAQO,SAAS,cAAc,MAA4C,EAAA;AACxE,EAAA,OAAO,MAAO,CAAA,MAAA,CAAO,CAAC,CAAA,EAAG,CAAM,KAAA;AAC7B,IAAI,IAAA,CAAC,EAAE,CAAC,CAAA;AAAG,MAAA,CAAA,CAAE,CAAC,CAAI,GAAA,CAAA,CAAA;AAClB,IAAA,CAAA,CAAE,CAAC,CAAA,EAAA,CAAA;AACH,IAAO,OAAA,CAAA,CAAA;AAAA,GACT,EAAG,EAAE,CAAA,CAAA;AACP,CAAA;AAIO,SAAS,YAAY,MAAqC,EAAA;AAC/D,EAAO,OAAA,WAAA,CAAY,aAAc,CAAA,MAAM,CAAC,CAAA,CAAA;AAC1C,CAAA;AAIO,SAAS,YAAY,GAAK,EAAA;AAC/B,EAAA,OAAO,OAAO,IAAK,CAAA,GAAG,EAAE,MAAO,CAAA,CAAC,GAAG,CAAM,KAAA;AACvC,IAAM,MAAA,KAAA,GAAQ,IAAI,CAAC,CAAA,CAAA;AACnB,IAAI,IAAA,CAAA,CAAE,KAAK,CAAG,EAAA;AACZ,MAAE,CAAA,CAAA,KAAK,CAAE,CAAA,IAAA,CAAK,CAAC,CAAA,CAAA;AAAA,KACV,MAAA;AACL,MAAE,CAAA,CAAA,KAAK,CAAI,GAAA,CAAC,CAAC,CAAA,CAAA;AAAA,KACf;AACA,IAAO,OAAA,CAAA,CAAA;AAAA,GACT,EAAG,EAAE,CAAA,CAAA;AACP,CAAA;AAQO,SAAS,UAAU,KAAO,EAAA;AAC/B,EAAA,OAAO,MAAM,OAAQ,CAAA,KAAK,KAAK,KAAM,CAAA,MAAA,GACjC,MAAM,MAAO,CAAA,IAAA,CAAK,MAAM,IAAK,CAAA,MAAA,KAAW,KAAM,CAAA,MAAM,GAAG,CAAC,CAAA,CAAE,CAAC,CAC3D,GAAA,KAAA,CAAA,CAAA;AACN,CAAA;AACO,SAAS,aAAa,GAAK,EAAA;AAChC,EAAA,MAAM,QAAQ,IAAK,CAAA,KAAA,CAAM,KAAK,MAAO,EAAA,GAAI,IAAI,MAAM,CAAA,CAAA;AACnD,EAAA,OAAO,IAAI,KAAK,CAAA,CAAA;AAClB,CAAA;AAEgB,SAAA,aAAA,CAAc,OAAO,GAAK,EAAA;AACxC,EAAO,OAAA,KAAA,CAAM,IAAK,CAAA,EAAE,MAAQ,EAAA,GAAA,GAAM,KAAM,EAAA,EAAG,CAAC,CAAA,EAAG,CAAM,KAAA,CAAA,GAAI,KAAK,CAAA,CAAA;AAChE,CAAA;AAWgB,SAAA,YAAA,CAAa,GAAG,CAAG,EAAA;AACjC,EAAI,IAAA,CAAC,MAAM,OAAQ,CAAA,CAAC,KAAK,CAAC,KAAA,CAAM,QAAQ,CAAC,CAAA;AAAG,IAAA,OAAO,EAAC,CAAA;AACpD,EAAA,OAAO,EACJ,MAAO,CAAA,CAAC,MAAM,CAAE,CAAA,OAAA,CAAQ,CAAC,CAAM,KAAA,CAAA,CAAE,EACjC,MAAO,CAAA,CAAC,GAAG,CAAG,EAAA,CAAA,KAAM,EAAE,OAAQ,CAAA,CAAC,MAAM,CAAC,CAAA,CAAA;AAC3C,CAAA;AAWgB,SAAA,OAAA,CAAQ,GAAG,CAAG,EAAA;AAC5B,EAAI,IAAA,CAAC,MAAM,OAAQ,CAAA,CAAC,KAAK,CAAC,KAAA,CAAM,QAAQ,CAAC,CAAA;AAAG,IAAO,OAAA,KAAA,CAAA;AACnD,EAAA,OAAO,EAAE,IAAK,CAAA,CAAC,MAAM,CAAE,CAAA,QAAA,CAAS,CAAC,CAAC,CAAA,CAAA;AACpC,CAAA;AACgB,SAAA,WAAA,CAAY,KAAK,GAAK,EAAA;AACpC,EAAA,OACE,GAAI,CAAA,MAAA,CAAO,CAAC,CAAA,EAAGA,IAAQ,KAAA;AACrB,IAAA,CAAA,CAAEA,IAAG,CAAA,GAAI,CAAI,GAAA,CAAA,CAAEA,IAAG,CAAK,IAAA,CAAA,CAAA;AACvB,IAAO,OAAA,CAAA,CAAA;AAAA,GACN,EAAA,EAAE,CAAA,CAAE,GAAG,CAAK,IAAA,CAAA,CAAA;AAEnB,CAAA;AACO,SAAS,OAAQ,CAAA,GAAA,EAAK,CAAG,EAAA,CAAA,EAAG,MAAQ,EAAA;AACzC,EAAA,OAAO,EAAG,CAAA,MAAA;AAAA,IACR,GAAG,GAAA,CAAI,KAAM,CAAA,CAAA,EAAG,CAAC,CAAA;AAAA,IACjB,GAAG,IAAI,KAAM,CAAA,CAAA,EAAG,IAAI,CAAC,CAAA,CAAE,KAAK,MAAM,CAAA;AAAA,IAClC,GAAG,GAAI,CAAA,KAAA,CAAM,CAAI,GAAA,CAAA,EAAG,IAAI,MAAM,CAAA;AAAA,GAChC,CAAA;AACF,CAAA;AAWgB,SAAA,UAAA,CAAW,KAAK,SAAW,EAAA;AACzC,EAAA,OAAO,GAAI,CAAA,MAAA,CAAO,CAAC,GAAA,EAAK,KAAK,CAAM,KAAA;AACjC,IAAA,MAAM,EAAK,GAAA,IAAA,CAAK,KAAM,CAAA,CAAA,GAAI,SAAS,CAAA,CAAA;AACnC,IAAI,GAAA,CAAA,EAAE,CAAI,GAAA,EAAG,CAAA,MAAA,CAAO,IAAI,EAAE,CAAA,IAAK,EAAC,EAAG,GAAG,CAAA,CAAA;AACtC,IAAO,OAAA,GAAA,CAAA;AAAA,GACT,EAAG,EAAE,CAAA,CAAA;AACP,CAAA;AAGO,SAAS,iBACd,GACA,EAAA,CAAC,IAAM,EAAA,GAAG,UAAU,CACpB,EAAA;AACA,EAAA,OAAO,IAAI,MACP,GAAA;AAAA,IACE,GAAA,CAAI,KAAM,CAAA,CAAA,EAAG,IAAI,CAAA;AAAA,IACjB,GAAG,gBAAiB,CAAA,GAAA,CAAI,KAAM,CAAA,IAAI,GAAG,CAAC,GAAG,UAAY,EAAA,IAAI,CAAC,CAAA;AAAA,MAE5D,EAAC,CAAA;AACP,CAAA;AAYO,SAAS,WAAW,GAAK,EAAA;AAC9B,EAAA,OAAO,GAAI,CAAA,MAAA,CAAO,CAAC,OAAA,EAAS,IAAS,KAAA,CAAC,KAAM,CAAA,QAAA,CAAS,IAAI,CAAC,CAAK,IAAA,OAAA,EAAS,IAAI,CAAA,CAAA;AAC9E,CAAA;AACO,SAAS,UAAU,GAAK,EAAA;AAC7B,EAAO,OAAA,GAAA,CAAI,MAAO,CAAA,CAAC,OAAS,EAAA,IAAA,KAAS,KAAM,CAAA,QAAA,CAAS,IAAI,CAAC,CAAK,IAAA,OAAA,EAAS,IAAI,CAAA,CAAA;AAC7E,CAAA;AAgCgB,SAAA,UAAA,CAAW,GAAY,EAAA,WAAA,EAAqB,OAAmB,EAAA;AAC7E,EAAA,OAAO,GAAI,CAAA,MAAA,CAAO,CAAC,MAAA,EAAQ,OAAO,KAAU,KAAA;AAC1C,IAAM,MAAA,gBAAA,GAAmB,UACrB,CAAC,EAAE,KAAK,KAAM,CAAA,KAAA,GAAQ,WAAW,CAAA,GAAI,CACrC,CAAA,GAAA,KAAA,CAAA;AACJ,IAAA,MAAM,aAAa,KAAQ,GAAA,WAAA,CAAA;AAC3B,IAAA,MAAM,cAAiB,GAAA,gBAAA,GACnB,WAAc,GAAA,CAAA,GAAI,UAClB,GAAA,UAAA,CAAA;AACJ,IAAI,IAAA,CAAC,OAAO,cAAc,CAAA;AAAG,MAAO,MAAA,CAAA,cAAc,IAAI,EAAC,CAAA;AACvD,IAAO,MAAA,CAAA,cAAc,CAAE,CAAA,IAAA,CAAK,KAAK,CAAA,CAAA;AACjC,IAAO,OAAA,MAAA,CAAA;AAAA,GACT,EAAG,EAAE,CAAA,CAAA;AACP;;AC/Ma,MAAA,OAAA,GAAU,EAAE,OAAA,EAAS,IAAK,EAAA;;ACsBhC,MAAM,yBAA4B,GAAA;AAAA,EACvC,OAAS,EAAA,0BAAA;AAAA,EACT,IAAM,EAAA,wBAAA;AACR,CAAA,CAAA;AACO,MAAM,yBAA4B,GAAA;AAAA,EACvC,OAAS,EAAA,0BAAA;AAAA,EACT,IAAM,EAAA,wBAAA;AACR,CAAA,CAAA;AAqqBO,MAAM,cAAiB,GAAA;AAAA,EAC5B,OAAS,EAAA,gBAAA;AAAA,EACT,IAAM,EAAA,oBAAA;AACR,CAAA,CAAA;AAuBO,MAAM,SAAY,GAAA,EAAE,OAAS,EAAA,WAAA,EAAa,MAAM,eAAgB,EAAA;;AC5sBvE,MAAM,eAAgD,GAAA;AAAA,EACpD,oBAAsB,EAAA,KAAA;AAAA,EACtB,YAAc,EAAA,KAAA,CAAA;AAAA,EACd,mBAAmB,EAAC;AAAA,EACpB,eAAe,EAAC;AAAA,EAChB,QAAU,EAAA,KAAA;AAAA,EACV,SAAS,EAAC;AACZ,CAAA,CAAA;AAEA,wBAAe;AAAA,EACb,SAAA;AAAA,EACA,YAAA;AAAA,EACA,mBAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,oBAAA;AAAA,EACA,mBAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,mBAAA;AAAA,EACA,oBAAA;AAAA,EACA,sBAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,mBAAA;AAAA,EACA,oBAAA;AAAA,EACA,iBAAA;AACF,CAAA,CAAA;AAEO,SAAS,oBAAuB,GAAA;AACrC,EAAA,eAAA,CAAgB,oBAAuB,GAAA,IAAA,CAAA;AACzC,CAAA;AAEO,SAAS,mBAAsB,GAAA;AACpC,EAAA,eAAA,CAAgB,oBAAuB,GAAA,KAAA,CAAA;AACzC,CAAA;AAEO,SAAS,eAAkB,GAAA;AAChC,EAAA,OAAO,eAAgB,CAAA,YAAA,CAAA;AACzB,CAAA;AAEO,SAAS,oBAAoB,YAAc,EAAA;AAChD,EAAO,OAAA,eAAA,CAAgB,kBAAkB,YAAY,CAAA,CAAA;AACvD,CAAA;AAEO,SAAS,oBAAuB,GAAA;AACrC,EAAA,OAAO,eAAgB,CAAA,iBAAA,CAAA;AACzB,CAAA;AAEO,SAAS,oBAAoB,gBAAkB,EAAA;AACpD,EAAA,MAAM,eAAe,gBAAkB,EAAA,YAAA,CAAA;AACvC,EAAA,IAAI,YAAc,EAAA;AAChB,IAAgB,eAAA,CAAA,iBAAA,CAAkB,YAAY,CAAI,GAAA,gBAAA,CAAA;AAClD,IAAO,OAAA,EAAE,SAAS,IAAK,EAAA,CAAA;AAAA,GAClB,MAAA;AACL,IAAO,OAAA,EAAE,OAAO,yBAA0B,EAAA,CAAA;AAAA,GAC5C;AACF,CAAA;AAEO,SAAS,gBAAgB,YAAc,EAAA;AAC5C,EAAI,IAAA,eAAA,CAAgB,iBAAkB,CAAA,YAAY,CAAG,EAAA;AACnD,IAAA,eAAA,CAAgB,YAAe,GAAA,YAAA,CAAA;AAC/B,IAAO,OAAA,EAAE,SAAS,IAAK,EAAA,CAAA;AAAA,GAClB,MAAA;AACL,IAAO,OAAA,EAAE,OAAO,yBAA0B,EAAA,CAAA;AAAA,GAC5C;AACF,CAAA;AAEO,SAAS,qBAAqB,iBAAmB,EAAA;AACtD,EAAA,eAAA,CAAgB,iBAAoB,GAAA,iBAAA,CAAA;AACpC,EAAM,MAAA,aAAA,GAAgB,MAAO,CAAA,IAAA,CAAK,iBAAiB,CAAA,CAAA;AACnD,EAAI,IAAA,aAAA,CAAc,WAAW,CAAG,EAAA;AAC9B,IAAgB,eAAA,CAAA,YAAA,GAAe,cAAc,CAAC,CAAA,CAAA;AAAA,GAChD,MAAA,IAAW,CAAC,aAAA,CAAc,MAAQ,EAAA;AAChC,IAAA,eAAA,CAAgB,YAAe,GAAA,KAAA,CAAA,CAAA;AAAA,GACjC;AACF,CAAA;AAEO,SAAS,uBAAuB,YAAc,EAAA;AACnD,EAAA,IAAI,OAAO,YAAiB,KAAA,QAAA;AAAU,IAAO,OAAA,EAAE,OAAO,cAAe,EAAA,CAAA;AACrE,EAAI,IAAA,CAAC,eAAgB,CAAA,iBAAA,CAAkB,YAAY,CAAA;AACjD,IAAO,OAAA,EAAE,OAAO,SAAU,EAAA,CAAA;AAE5B,EAAO,OAAA,eAAA,CAAgB,kBAAkB,YAAY,CAAA,CAAA;AACrD,EAAA,MAAM,aAAgB,GAAA,MAAA,CAAO,IAAK,CAAA,eAAA,CAAgB,iBAAiB,CAAA,CAAA;AACnE,EAAI,IAAA,aAAA,CAAc,WAAW,CAAG,EAAA;AAC9B,IAAgB,eAAA,CAAA,YAAA,GAAe,cAAc,CAAC,CAAA,CAAA;AAAA,GAChD,MAAA,IAAW,CAAC,aAAA,CAAc,MAAQ,EAAA;AAChC,IAAA,eAAA,CAAgB,YAAe,GAAA,KAAA,CAAA,CAAA;AAAA,GACjC;AACA,EAAO,OAAA,EAAE,SAAS,IAAK,EAAA,CAAA;AACzB,CAAA;AAEO,SAAS,iBAAiB,MAAQ,EAAA;AACvC,EAAI,IAAA,OAAO,OAAO,aAAkB,KAAA,QAAA;AAClC,IAAO,OAAA,EAAE,OAAO,cAAe,EAAA,CAAA;AACjC,EAAA,MAAA,CAAO,KAAK,MAAO,CAAA,aAAa,CAAE,CAAA,OAAA,CAAQ,CAAC,YAAiB,KAAA;AAC1D,IAAA,eAAA,CAAgB,aAAc,CAAA,YAAY,CACxC,GAAA,MAAA,CAAO,cAAc,YAAY,CAAA,CAAA;AAAA,GACpC,CAAA,CAAA;AACD,EAAO,OAAA,EAAE,GAAG,OAAQ,EAAA,CAAA;AACtB,CAAA;AAEO,SAAS,mBAAsB,GAAA;AACpC,EAAA,MAAM,SAAS,eAAgB,CAAA,QAAA,CAAA;AAC/B,EAAA,eAAA,CAAgB,QAAW,GAAA,KAAA,CAAA;AAC3B,EAAO,OAAA,MAAA,CAAA;AACT,CAAA;AAEO,SAAS,SAAU,CAAA,EAAE,KAAO,EAAA,OAAA,EAAS,KAAe,EAAA;AACzD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAY,IAAA,OAAO,YAAY,QAAU,EAAA;AAC5D,IAAA,OAAA;AAAA,GACF;AAEA,EAAA,IAAI,CAAC,eAAgB,CAAA,oBAAA;AAAsB,IAAA,eAAA,CAAgB,QAAW,GAAA,IAAA,CAAA;AAEtE,EAAA,IACE,gBAAgB,oBAChB,IAAA,CAAC,eAAgB,CAAA,aAAA,CAAc,KAAK,CACpC,EAAA;AACA,IAAA,OAAA;AAAA,GACF;AAEA,EAAA,IAAI,GAAK,EAAA;AACP,IAAgB,eAAA,CAAA,OAAA,GAAU,gBAAgB,OAAQ,CAAA,MAAA;AAAA,MAChD,CAAC,MAAW,KAAA,EAAE,OAAO,KAAU,KAAA,KAAA,IAAS,OAAO,GAAQ,KAAA,GAAA,CAAA;AAAA,KACzD,CAAA;AAAA,GACF;AAEA,EAAA,eAAA,CAAgB,QAAQ,IAAK,CAAA,EAAE,KAAO,EAAA,OAAA,EAAS,KAAK,CAAA,CAAA;AAEpD,EAAO,OAAA,EAAE,GAAG,OAAQ,EAAA,CAAA;AACtB,CAAA;AAEgB,SAAA,UAAA,CAAW,EAAE,KAAA,EAAyB,EAAA;AACpD,EAAA,MAAM,OAAU,GAAA,eAAA,CAAgB,OAC7B,CAAA,MAAA,CAAO,CAAC,MAAW,KAAA,MAAA,CAAO,KAAU,KAAA,KAAK,CACzC,CAAA,GAAA,CAAI,CAAC,MAAA,KAAW,OAAO,OAAO,CAAA,CAAA;AACjC,EAAA,OAAO,QAAQ,MAAU,IAAA,OAAA,CAAA;AAC3B,CAAA;AAEO,SAAS,aAAgB,GAAA;AAC9B,EAAA,eAAA,CAAgB,UAAU,EAAC,CAAA;AAC7B,CAAA;AAEO,SAAS,YAAa,CAAA,EAAE,KAAO,EAAA,GAAA,EAAyB,EAAA;AAC7D,EAAgB,eAAA,CAAA,OAAA,GAAU,gBAAgB,OAAQ,CAAA,MAAA;AAAA,IAChD,CAAC,YAAY,CAAC,KAAA,IAAS,OAAO,KAAU,KAAA,KAAA,KAAU,OAAO,GAAQ,KAAA,GAAA;AAAA,GACnE,CAAA;AACF,CAAA;AAEO,SAAS,SAAY,GAAA;AAC1B,EAAA,MAAM,MAAS,GAAA,MAAA,CAAO,IAAK,CAAA,eAAA,CAAgB,aAAa,CAAA,CAAA;AACxD,EAAA,OAAO,EAAE,MAAO,EAAA,CAAA;AAClB,CAAA;AAEO,SAAS,YAAa,CAAA,EAAE,KAAO,EAAA,OAAA,EAA6B,EAAA;AACjE,EAAM,MAAA,MAAA,GAAS,eAAgB,CAAA,aAAA,CAAc,KAAK,CAAA,CAAA;AAClD,EAAI,IAAA,MAAA,IAAU,OAAO,MAAA,KAAW,UAAY,EAAA;AAC1C,IAAA,MAAA,CAAO,OAAO,CAAA,CAAA;AAAA,GAChB;AACF,CAAA;AAEO,SAAS,iBAAkB,CAAA;AAAA,EAChC,UAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,GAAA;AACF,CAA0B,EAAA;AACxB,EAAI,IAAA,KAAA,CAAA;AACJ,EAAI,IAAA,OAAO,QAAQ,QAAU,EAAA;AAC3B,IAAA,KAAA,GAAQ,IAAI,WAAY,EAAA,CAAA;AAAA,GAC1B,MAAA,IAAW,eAAe,KAAO,EAAA;AAC/B,IAAA,KAAA,GAAQ,GAAI,CAAA,OAAA,CAAA;AAAA,GACd;AAEA,EAAA,OAAA,CAAQ,IAAI,OAAS,EAAA;AAAA,IACnB,cAAc,eAAgB,EAAA;AAAA,IAC9B,MAAA,EAAQ,IAAK,CAAA,SAAA,CAAU,MAAM,CAAA;AAAA,IAC7B,MAAQ,EAAA,UAAA;AAAA,IACR,UAAA;AAAA,IACA,KAAA;AAAA,GACD,CAAA,CAAA;AACH;;ACxIA,MAAM,WAAgC,GAAA;AAAA,EACpC,wBAA0B,EAAA,OAAA;AAAA,EAC1B,QAAQ,EAAE,OAAA,EAAS,EAAE,WAAA,EAAa,GAAI,EAAA;AAAA,EACtC,SAAA,EAAW,EAAE,YAAA,EAAc,CAAE,EAAA;AAAA,EAC7B,kBAAoB,EAAA;AAAA,IAClB,WAAW,EAAC;AAAA,IACZ,QAAQ,EAAC;AAAA,IACT,QAAQ,EAAC;AAAA,GACX;AAAA,EACA,QAAU,EAAA,IAAA;AACZ,CAAA,CAAA;AAEA,IAAI,oBAA4B,GAAAC,iBAAA,CAAA;AAwDzB,SAAS,cAAc,eAA4B,EAAA;AACxD,EAAA,IAAI,CAAC,eAAA,IAAmB,OAAO,eAAA,KAAoB,QAAU,EAAA;AAC3D,IAAA,OAAO,YAAY,UAAc,IAAA,KAAA,CAAA;AAAA,GAC5B,MAAA;AACL,IAAI,IAAA,OAAO,YAAY,UAAe,KAAA,QAAA;AAAU,MAAO,OAAA,KAAA,CAAA;AACvD,IACE,OAAA,MAAA,CAAO,IAAK,CAAA,eAAe,CAAE,CAAA,KAAA;AAAA,MAC3B,CAAC,GAAQ,KAAA,WAAA,CAAY,aAAa,GAAG,CAAA,KAAM,gBAAgB,GAAG,CAAA;AAAA,SAC3D,WAAY,CAAA,UAAA,CAAA;AAAA,GAErB;AACF,CAAA;AAqFO,SAAS,sBAAsB,KAAe,EAAA;AACnD,EAAA,WAAA,CAAY,UAAU,YAAe,GAAA,KAAA,CAAA;AACvC,CAAA;AAqCO,SAAS,eAAkB,GAAA;AAChC,EAAO,OAAA;AAAA,IACL,SAAS,WAAY,CAAA,QAAA;AAAA,IACrB,GAAG,WAAY,CAAA,kBAAA;AAAA,GACjB,CAAA;AACF,CAAA;AAiFO,SAAS,WAAc,GAAA;AAC5B,EAAO,OAAA,oBAAA,CAAA;AACT;;ACjVO,SAAS,aAAa,KAAO,EAAA;AAClC,EAAA,IAAI,OAAO,KAAU,KAAA,QAAA,IAAY,KAAM,CAAA,OAAA,CAAQ,KAAK,CAAG,EAAA;AACrD,IAAO,OAAA,KAAA,CAAA;AAAA,GACF,MAAA;AACL,IAAA,MAAM,aAAgB,GAAA,MAAA,CAAO,SAAU,CAAA,QAAA,CAAS,KAAK,KAAK,CAAA,CAAA;AAC1D,IAAA,OAAO,aAAkB,KAAA,eAAA,CAAA;AAAA,GAC3B;AACF;;ACjBO,SAAS,aACd,YACA,EAAA,iBAAA,EACA,WACA,EAAA,gBAAA,EACA,YAAY,CACZ,EAAA;AACA,EAAA,IAAI,aAAc,CAAA,YAAA;AAChB,IAAA,OAAO,aAAc,CAAA,YAAA;AAAA,MACnB,YAAA;AAAA,MACA,iBAAA;AAAA,MACA,WAAA;AAAA,MACA,gBAAA;AAAA,KACF,CAAA;AAEF,EAAA,MAAM,WAAW,eAAgB,EAAA,CAAA;AAEjC,EAAA,MAAM,EAAE,SAAW,EAAA,MAAA,EAAQ,QAAQ,QAAS,EAAA,GAAI,YAAY,EAAC,CAAA;AAE7D,EAAA,IACG,CAAC,QAAU,EAAA,OAAA,IAAW,CAAC,WACxB,IAAA,OAAO,iBAAiB,QACxB,IAAA,OAAO,iBAAiB,UACxB,IAAA,YAAA,KAAiB,QAChB,OAAO,QAAA,EAAU,cAAc,QAAY,IAAA,SAAA,IAAa,SAAS,SAClE,EAAA;AACA,IAAO,OAAA,YAAA,CAAA;AAAA,GACT;AAEA,EAAA,MAAM,UAAa,GAAA,aAAA,CAAc,EAAE,YAAA,EAAc,MAAM,CAAA,CAAA;AACvD,EAAA,IAAI,UAAY,EAAA;AACd,IAAA,qBAAA,CAAsB,SAAS,CAAA,CAAA;AAC/B,IAAA,IACE,OAAO,UAAe,KAAA,QAAA,KACrB,aAAa,UAAW,CAAA,kBAAA,IAAsB,OAC5C,UAAW,CAAA,cAAA,IAAkB,cAAc,CAC9C,CAAA,IAAA,UAAA,CAAW,QACV,CAAC,UAAA,CAAW,kBACV,UAAW,CAAA,cAAA,IAAkB,CAAC,WACjC,CAAA,EAAA;AACA,MAAA,OAAA,CAAQ,IAAI,EAAE,UAAA,EAAY,SAAW,EAAA,WAAA,IAAe,YAAY,CAAA,CAAA;AAAA,KAClE;AAAA,GACF;AAEA,EAAA,MAAM,eAAe,KAAM,CAAA,OAAA,CAAQ,YAAY,CAAI,GAAA,KAAK,EAAC,CAAA;AAEzD,EAAA,MAAM,gBAAmB,GAAA,MAAA,CAAO,IAAK,CAAA,YAAY,CAAE,CAAA,MAAA;AAAA,IACjD,CAAC,QACC,CAAC,WAAA,IACD,CAAC,MACA,IAAA,KAAA,CAAM,QAAQ,MAAM,CAAA,IAAK,CAAC,MAAO,CAAA,QAAA,CAAS,GAAG,CAC7C,IAAA,OAAO,WAAW,UAAc,IAAA,CAAC,OAAO,GAAG,CAAA;AAAA,GAChD,CAAA;AAEA,EAAM,MAAA,cAAA,GAAiB,CAAC,GAAA,EAAK,KAAU,KAAA;AACrC,IAAa,YAAA,CAAA,GAAG,CACd,GAAA,OAAO,KAAO,EAAA,QAAA,KAAa,UACvB,GAAA,KAAA,CAAM,QAAS,EAAA,GACf,IAAK,CAAA,SAAA,CAAU,KAAK,CAAA,CAAA;AAAA,GAC5B,CAAA;AAEA,EAAA,KAAA,MAAW,OAAO,gBAAkB,EAAA;AAClC,IAAM,MAAA,KAAA,GAAQ,aAAa,GAAG,CAAA,CAAA;AAC9B,IAAA,MAAM,YACJ,OAAO,QAAA,KAAa,UAAa,GAAA,QAAA,CAAS,KAAK,CAAI,GAAA,KAAA,CAAA,CAAA;AACrD,IAAA,IAAI,cAAc,KAAW,CAAA,EAAA;AAC3B,MAAA,YAAA,CAAa,GAAG,CAAI,GAAA,SAAA,CAAA;AAAA,eAEpB,iBACA,IAAA,GAAA,KAAQ,gBACR,KAAM,CAAA,OAAA,CAAQ,KAAK,CACnB,EAAA;AACA,MAAM,MAAA,oBAAA,GAAuB,uBAAuB,KAAK,CAAA,CAAA;AACzD,MAAO,MAAA,CAAA,MAAA,CAAO,YAAc,EAAA,GAAG,oBAAoB,CAAA,CAAA;AAAA,KACrD,MAAA,IAAW,gBAAoB,IAAA,GAAA,KAAQ,YAAc,EAAA;AACnD,MAAa,YAAA,CAAA,GAAG,IAAI,EAAC,CAAA;AAAA,KACvB,MAAA,IAAW,MAAM,OAAQ,CAAA,SAAS,KAAK,SAAU,CAAA,QAAA,CAAS,GAAG,CAAG,EAAA;AAC9D,MAAA,cAAA,CAAe,KAAK,KAAK,CAAA,CAAA;AAAA,KAEzB,MAAA,IAAA,KAAA,CAAM,OAAQ,CAAA,MAAM,CACpB,IAAA,MAAA,CAAO,QAAS,CAAA,GAAG,CACnB,IAAA,OAAO,KAAO,EAAA,MAAA,KAAW,UACzB,EAAA;AACA,MAAa,YAAA,CAAA,GAAG,CAAI,GAAA,KAAA,CAAM,MAAO,EAAA,CAAA;AAAA,KACnC,MAAA,IAAW,UAAU,IAAM,EAAA;AACzB,MAAA,YAAA,CAAa,GAAG,CAAI,GAAA,KAAA,CAAA,CAAA;AAAA,KACtB,MAAA,IAAW,YAAa,CAAA,KAAK,CAAG,EAAA;AAC9B,MAAA,YAAA,CAAa,GAAG,CAAI,GAAA,IAAI,IAAK,CAAA,KAAK,EAAE,WAAY,EAAA,CAAA;AAAA,KAC3C,MAAA;AACL,MAAA,YAAA,CAAa,GAAG,CAAI,GAAA,YAAA;AAAA,QAClB,KAAA;AAAA,QACA,iBAAA;AAAA,QACA,WAAA;AAAA,QACA,gBAAA;AAAA,QACA,SAAY,GAAA,CAAA;AAAA,OACd,CAAA;AAAA,KACF;AAAA,GACF;AAEA,EAAO,OAAA,YAAA,CAAA;AACT,CAAA;AAEO,SAAS,uBAAuB,UAAY,EAAA;AACjD,EAAO,OAAA,UAAA,EACH,GAAI,CAAA,CAAC,SAAc,KAAA;AACnB,IAAM,MAAA,EAAE,IAAM,EAAA,KAAA,EAAU,GAAA,SAAA,CAAA;AACxB,IAAO,OAAA,IAAA,IAAQ,SAAS,EAAE,CAAC,IAAI,IAAI,CAAA,CAAE,GAAG,KAAM,EAAA,CAAA;AAAA,GAC/C,CACA,CAAA,MAAA,CAAO,OAAO,CAAA,CAAA;AACnB;;AC7GO,SAAS,gBAAiB,CAAA,EAAE,OAAS,EAAA,QAAA,EAAY,EAAA;AACtD,EAAA,IAAI,OAAO,QAAa,KAAA,QAAA;AAAU,IAAO,OAAA,EAAE,MAAQ,EAAA,EAAG,EAAA,CAAA;AACtD,EAAM,MAAA,aAAA,GAAgB,aAAa,OAAO,CAAA,CAAA;AAC1C,EAAM,MAAA,UAAA,GAAa,QAAS,CAAA,KAAA,CAAM,GAAG,CAAA,CAAA;AAErC,EAAA,MAAM,SAAgB,EAAC,CAAA;AACvB,EAAI,IAAA,KAAA,CAAA;AACJ,EAAY,WAAA,CAAA,EAAE,aAAe,EAAA,UAAA,EAAY,CAAA,CAAA;AAEzC,EAAM,MAAA,MAAA,GAAc,EAAE,KAAM,EAAA,CAAA;AAC5B,EAAA,IAAI,MAAO,CAAA,MAAA;AAAQ,IAAA,MAAA,CAAO,MAAS,GAAA,MAAA,CAAA;AACnC,EAAO,OAAA,MAAA,CAAA;AAEP,EAAA,SAAS,WAAY,CAAA;AAAA,IACnB,aAAAC,EAAAA,cAAAA;AAAA,IACA,UAAA,EAAAC,cAAa,EAAC;AAAA,IACd,qBAAA;AAAA,GACkB,EAAA;AAClB,IAAA,KAAA,MAAW,CAAC,KAAO,EAAA,SAAS,CAAKA,IAAAA,WAAAA,CAAW,SAAW,EAAA;AACrD,MAAID,IAAAA,cAAAA,GAAgB,SAAS,CAAG,EAAA;AAC9B,QAAA,MAAM,aAAgBC,GAAAA,WAAAA,CAAW,KAAM,CAAA,KAAA,GAAQ,CAAC,CAAA,CAAA;AAChD,QAAI,IAAA,CAAC,cAAc,MAAQ,EAAA;AACzB,UAAA,IAAI,CAAC,KAAA;AAAO,YAAA,KAAA,GAAQD,eAAc,SAAS,CAAA,CAAA;AAC3C,UAAA,IAAI,CAAC,MAAO,CAAA,QAAA,CAASA,cAAc,CAAA,SAAS,CAAC,CAAG,EAAA;AAC9C,YAAO,MAAA,CAAA,IAAA,CAAKA,cAAc,CAAA,SAAS,CAAC,CAAA,CAAA;AAAA,WACtC;AAAA,mBACS,KAAM,CAAA,OAAA,CAAQA,cAAc,CAAA,SAAS,CAAC,CAAG,EAAA;AAClD,UAAME,MAAAA,OAAAA,GAASF,eAAc,SAAS,CAAA,CAAA;AACtC,UAAAE,OAAO,CAAA,OAAA;AAAA,YAAQ,CAAC,iBACd,WAAY,CAAA;AAAA,cACV,aAAe,EAAA,YAAA;AAAA,cACf,UAAY,EAAA,aAAA;AAAA,aACb,CAAA;AAAA,WACH,CAAA;AAAA,SACK,MAAA;AACL,UAAAF,cAAAA,GAAgBA,eAAc,SAAS,CAAA,CAAA;AACvC,UAAA,UAAA,CAAW,EAAE,aAAA,EAAAA,cAAe,EAAA,KAAA,EAAO,CAAA,CAAA;AAAA,SACrC;AAAA,OACF;AAAA,KACF;AAEA,IAAA,SAAS,UAAW,CAAA,EAAE,aAAAA,EAAAA,cAAAA,EAAe,OAAS,EAAA;AAC5C,MAAA,IACEA,cACA,IAAA,KAAA,KAAUC,WAAW,CAAA,MAAA,GAAS,CAC9B,IAAA,CAAC,QAAU,EAAA,QAAQ,CAAE,CAAA,QAAA,CAAS,OAAOD,cAAa,CAClD,EAAA;AACA,QAAA,MAAM,iBAAiB,qBACnBA,GAAAA,cAAAA,CAAc,KAAM,CAAA,CAAA,EAAG,qBAAqB,CAC5CA,GAAAA,cAAAA,CAAAA;AAEJ,QAAA,IAAI,KAAO,EAAA;AACT,UAAA,IAAI,CAAC,MAAA,CAAO,QAAS,CAAA,cAAc,CAAG,EAAA;AACpC,YAAA,MAAA,CAAO,KAAK,cAAc,CAAA,CAAA;AAAA,WAC5B;AAAA,SACK,MAAA;AACL,UAAQ,KAAA,GAAA,cAAA,CAAA;AACR,UAAA,MAAA,CAAO,KAAK,cAAc,CAAA,CAAA;AAAA,SAC5B;AAAA,OACF;AAAA,KACF;AAAA,GACF;AACF;;AC/DO,SAAS,SAAS,GAAK,EAAA;AAC5B,EAAO,OAAA,GAAA,KAAQ,IAAQ,IAAA,OAAO,GAAQ,KAAA,QAAA,CAAA;AACxC,CAAA;AAoBgB,SAAA,SAAA,CAAU,aAAa,SAAW,EAAA;AAChD,EAAI,IAAA,CAAC,KAAM,CAAA,OAAA,CAAQ,WAAW,CAAA;AAAG,IAAA,OAAO,EAAC,CAAA;AAEzC,EAAA,OAAO,MAAO,CAAA,MAAA;AAAA,IACZ,EAAC;AAAA,IACD,GAAA,CAAI,eAAe,EAAC,EACjB,OAAO,QAAQ,CAAA,CACf,GAAI,CAAA,CAAC,GAAQ,KAAA;AACZ,MACE,OAAA,GAAA,CAAI,SAAS,CAAK,IAAA;AAAA,QAChB,CAAC,GAAA,CAAI,SAAS,CAAC,GAAG,GAAA;AAAA,OACpB,CAAA;AAAA,KAEH,CACA,CAAA,MAAA,CAAO,OAAO,CAAA;AAAA,GACnB,CAAA;AACF,CAAA;AAGO,MAAM,qBAAqB,CAAC,CAAA,KAAM,CAAC,CAAA,KACxC,OAAO,IAAK,CAAA,CAAC,CAAE,CAAA,KAAA,CAAM,CAAC,GAAQ,KAAA,CAAA,CAAE,GAAG,CAAM,KAAA,CAAA,CAAE,GAAG,CAAC,EAAA;AAK1C,MAAM,oBAAoB,CAAC,QAAA,KAAa,CAAC,OAC9C,KAAA,CAAC,YAAY,OAAO,OAAA,KAAY,QAC5B,GAAA,KAAA,CAAA,GACC,MAAM,OAAQ,CAAA,QAAQ,KACrB,QAAS,CAAA,GAAA,CAAI,CAAC,CAAO,MAAA;AAAA,EACnB,CAAC,CAAC,GAAG,gBAAA,CAAiB,EAAE,OAAS,EAAA,QAAA,EAAU,CAAE,EAAC,CAAG,EAAA,KAAA;AACnD,CAAE,CAAA,CAAA,IACH,OAAO,QAAA,KAAa,QACnB,IAAA,MAAA,CAAO,KAAK,QAAQ,CAAA,CAAE,GAAI,CAAA,CAAC,GAAS,MAAA;AAAA,EAClC,CAAC,GAAG,GAAG,gBAAA,CAAiB,EAAE,OAAS,EAAA,QAAA,EAAU,GAAI,EAAC,CAAG,EAAA,KAAA;AACvD,CAAE,CAAA,CAAA,IAAA,CACH,OAAO,QAAa,KAAA,QAAA,IAAY,iBAAiB,EAAE,OAAA,EAAS,QAAS,EAAC,CACnE,GAAA,MAAA;AAEV,SAAS,cAAA,CAAe,GAAK,EAAA,YAAA,EAAc,iBAAmB,EAAA;AAC5D,EAAO,OAAA,MAAA,CAAO,IAAK,CAAA,GAAG,CAAE,CAAA,MAAA;AAAA,IACtB,CAAC,QACC,CAAC,YAAA,CAAa,SAAS,GAAI,CAAA,GAAG,CAAC,CAC9B,KAAA,CAAC,sBAAsB,KAAM,CAAA,OAAA,CAAQ,IAAI,GAAG,CAAC,IAAI,GAAI,CAAA,GAAG,EAAE,MAAS,GAAA,IAAA,CAAA,CAAA;AAAA,GACxE,CAAA;AACF,CAAA;AAEO,SAAS,iBACd,CAAA,GAAA,EACA,WACA,EAAA,iBAAA,EACA,OACA,EAAA;AACA,EAAI,IAAA,OAAO,GAAQ,KAAA,QAAA,IAAY,GAAQ,KAAA,IAAA;AAAM,IAAO,OAAA,GAAA,CAAA;AACpD,EAAA,MAAM,WAAW,eAAgB,EAAA,CAAA;AACjC,EAAA,IAAI,CAAC,QAAU,EAAA,OAAA;AAAS,IAAU,OAAA,GAAA,IAAA,CAAA;AAElC,EAAA,MAAM,YAAsB,GAAA,CAAC,EAAI,EAAA,KAAA,CAAA,EAAW,IAAI,CAAA,CAAA;AAChD,EAAI,IAAA,WAAA;AAAa,IAAA,YAAA,CAAa,KAAK,KAAK,CAAA,CAAA;AAExC,EAAA,MAAM,WAAc,GAAA,cAAA,CAAe,GAAK,EAAA,YAAA,EAAc,iBAAiB,CAAA,CAAA;AAEvE,EAAA,OAAO,MAAO,CAAA,MAAA;AAAA,IACZ,EAAC;AAAA,IACD,GAAG,WAAA,CAAY,GAAI,CAAA,CAAC,GAAQ,KAAA;AAC1B,MAAA,OAAO,KAAM,CAAA,OAAA,CAAQ,GAAI,CAAA,GAAG,CAAC,CACzB,GAAA;AAAA,QACE,CAAC,GAAG,GAAG,OAAA,GACH,IAAI,GAAG,CAAA,GACP,GAAI,CAAA,GAAG,EAAE,GAAI,CAAA,CAAC,CAAM,KAAA,iBAAA,CAAkB,CAAC,CAAC,CAAA;AAAA,OAE9C,GAAA,EAAE,CAAC,GAAG,GAAG,OAAA,GAAU,GAAI,CAAA,GAAG,CAAI,GAAA,iBAAA,CAAkB,GAAI,CAAA,GAAG,CAAC,CAAE,EAAA,CAAA;AAAA,KAC/D,CAAA;AAAA,GACH,CAAA;AACF,CAAA;AAGgB,SAAA,eAAA,CAAgB,KAAa,OAAmB,EAAA;AAC9D,EAAA,IAAI,GAAQ,KAAA,KAAA,CAAA;AAAW,IAAO,OAAA,IAAA,CAAA;AAC9B,EAAI,IAAA,OAAO,GAAQ,KAAA,QAAA,IAAY,GAAQ,KAAA,IAAA;AAAM,IAAO,OAAA,GAAA,CAAA;AAEpD,EAAM,MAAA,WAAA,GAAc,MAAO,CAAA,IAAA,CAAK,GAAG,CAAA,CAAA;AACnC,EAAA,MAAM,OAAU,GAAA,CAAC,KAAW,KAAA,KAAA,KAAU,SAAY,IAAO,GAAA,KAAA,CAAA;AAEzD,EAAA,OAAO,MAAO,CAAA,MAAA;AAAA,IACZ,EAAC;AAAA,IACD,GAAG,WAAA,CAAY,GAAI,CAAA,CAAC,GAAQ,KAAA;AAC1B,MAAA,OAAO,KAAM,CAAA,OAAA,CAAQ,GAAI,CAAA,GAAG,CAAC,CACzB,GAAA;AAAA,QACE,CAAC,GAAG,GAAG,OAAA,GAAU,IAAI,GAAG,CAAA,GAAI,GAAI,CAAA,GAAG,EAAE,GAAI,CAAA,CAAC,CAAM,KAAA,eAAA,CAAgB,CAAC,CAAC,CAAA;AAAA,OAEpE,GAAA,EAAE,CAAC,GAAG,GAAG,OAAU,GAAA,OAAA,CAAQ,GAAI,CAAA,GAAG,CAAC,CAAI,GAAA,eAAA,CAAgB,GAAI,CAAA,GAAG,CAAC,CAAE,EAAA,CAAA;AAAA,KACtE,CAAA;AAAA,GACH,CAAA;AACF,CAAA;AAEA,SAAS,UAAU,CAAG,EAAA;AACpB,EAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,CAAC,CAAG,EAAA;AACpB,IAAA,OAAO,CAAE,CAAA,MAAA,GAAS,CAAE,CAAA,GAAA,CAAI,SAAS,CAAA,CAAE,MAAO,CAAA,CAAC,CAAG,EAAA,CAAA,KAAM,CAAI,GAAA,CAAA,EAAG,CAAC,CAAA,CAAA;AAAA,GACnD,MAAA,IAAA,OAAO,CAAM,KAAA,QAAA,IAAY,MAAM,IAAM,EAAA;AAC9C,IACE,OAAA,MAAA,CAAO,IAAK,CAAA,CAAC,CAAE,CAAA,MAAA,GACf,OAAO,IAAK,CAAA,CAAC,CACV,CAAA,GAAA,CAAI,CAAC,CAAA,KAAM,UAAU,CAAE,CAAA,CAAC,CAAC,CAAC,CAC1B,CAAA,MAAA,CAAO,CAAC,CAAG,EAAA,CAAA,KAAM,CAAI,GAAA,CAAA,EAAG,CAAC,CAAA,CAAA;AAAA,GAEhC;AACA,EAAO,OAAA,CAAA,CAAA;AACT,CAAA;AAEO,SAAS,iBAAiB,CAAG,EAAA;AAClC,EAAI,IAAA,CAAA,KAAM,IAAQ,IAAA,OAAO,CAAM,KAAA,QAAA;AAAU,IAAO,OAAA,KAAA,CAAA,CAAA;AAChD,EAAM,MAAA,GAAA,GAAM,IAAK,CAAA,SAAA,CAAU,CAAC,CAAA,CAAA;AAC5B,EAAM,MAAA,QAAA,GAAW,UAAU,CAAC,CAAA,CAAA;AAC5B,EAAA,MAAM,OAAU,GAAA,GAAA,CAAI,KAAM,CAAA,EAAE,EAAE,MAAO,CAAA,CAAC,CAAG,EAAA,CAAA,KAAM,CAAI,GAAA,CAAA,CAAE,UAAW,CAAA,CAAC,GAAG,CAAC,CAAA,CAAA;AACrE,EAAA,OAAO,CAAC,GAAA,CAAI,MAAQ,EAAA,QAAA,EAAU,OAAO,CAAE,CAAA,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,QAAS,CAAA,EAAE,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA,CAAA;AAC3E;;AChJO,SAAS,gBAAgB,MAAmB,EAAA;AACjD,EAAA,IAAI,MAAW,KAAA,IAAA;AAAM,IAAA,OAAO,EAAC,CAAA;AAC7B,EAAA,MAAM,EAAE,MAAA,EAAQ,QAAS,EAAA,GAAI,UAAU,EAAC,CAAA;AACxC,EAAA,IAAI,CAAC,QAAA;AAAU,IAAO,OAAA,MAAA,CAAA;AAEtB,EAAA,MAAM,SAAS,EAAC,CAAA;AAChB,EAAc,aAAA,CAAA,MAAA,EAAQ,UAAU,MAAM,CAAA,CAAA;AAEtC,EAAO,OAAA,MAAA,CAAA;AAEP,EAAS,SAAA,aAAA,CAAc,YAAc,EAAA,cAAA,EAAgB,YAAc,EAAA;AACjE,IAAI,IAAA,CAAC,gBAAgB,CAAC,cAAA;AAAgB,MAAO,OAAA,KAAA,CAAA,CAAA;AAC7C,IAAM,MAAA,KAAA,GAAQ,MAAO,CAAA,IAAA,CAAK,YAAY,CAAA,CAAA;AACtC,IAAM,MAAA,KAAA,GAAQ,MAAO,CAAA,IAAA,CAAK,cAAc,CAAA,CAAA;AAGxC,IAAA,MAAM,QAAQ,MAAO,CAAA,MAAA;AAAA,MACnB,EAAC;AAAA,MACD,GAAG,KAAA,CACA,MAAO,CAAA,CAAC,GAAQ,KAAA,GAAA,CAAI,OAAQ,CAAA,IAAI,CAAC,CAAA,CACjC,GAAI,CAAA,CAAC,GAAQ,KAAA,GAAA,CAAI,KAAM,CAAA,IAAI,CAAE,CAAA,GAAA,CAAI,CAAC,EAAA,MAAQ,EAAE,CAAC,EAAE,GAAG,GAAI,EAAA,CAAE,CAAC,CAAA,CACzD,IAAK,EAAA;AAAA,KACV,CAAA;AACA,IAAA,MAAM,UAAU,KAAM,CAAA,MAAA,CAAO,GAAG,MAAO,CAAA,IAAA,CAAK,KAAK,CAAC,CAAA,CAAA;AAClD,IAAM,MAAA,QAAA,GAAW,OAAQ,CAAA,QAAA,CAAS,GAAG,CAAA,CAAA;AAErC,IAAA,KAAA,MAAW,QAAQ,KAAO,EAAA;AACxB,MAAA,IAAI,OAAQ,CAAA,OAAA,CAAQ,IAAI,CAAA,IAAK,KAAK,QAAU,EAAA;AAC1C,QAAM,MAAA,WAAA,GAAc,KAAM,CAAA,IAAI,CAAK,IAAA,IAAA,CAAA;AACnC,QAAM,MAAA,IAAA,GAAO,cAAe,CAAA,WAAW,CAAK,IAAA,QAAA,CAAA;AAC5C,QAAM,MAAA,IAAA,GAAO,aAAa,IAAI,CAAA,CAAA;AAE9B,QACE,IAAA,OAAO,IAAS,KAAA,QAAA,IAChB,OAAO,IAAA,KAAS,cAChB,CAAC,KAAA,CAAM,OAAQ,CAAA,IAAI,CACnB,EAAA;AACA,UAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,IAAI,CAAG,EAAA;AACvB,YAAA,MAAM,cAAiB,GAAA,IAAA,CACpB,GAAI,CAAA,CAAC,WAAgB,KAAA;AACpB,cAAA,MAAMG,UAAS,EAAC,CAAA;AAChB,cAAA,MAAM,MAAS,GAAA,aAAA,CAAc,WAAa,EAAA,IAAA,EAAMA,OAAM,CAAA,CAAA;AACtD,cAAO,OAAA,MAAA,KAAW,QAAQA,OAAS,GAAA,KAAA,CAAA,CAAA;AAAA,aACpC,CACA,CAAA,MAAA,CAAO,OAAO,CAAA,CAAA;AACjB,YAAA,YAAA,CAAa,IAAI,CAAI,GAAA,cAAA,CAAA;AAAA,qBACZ,IAAM,EAAA;AACf,YAAa,YAAA,CAAA,IAAI,IAAI,EAAC,CAAA;AACtB,YAAA,aAAA,CAAc,IAAM,EAAA,IAAA,EAAM,YAAa,CAAA,IAAI,CAAC,CAAA,CAAA;AAAA,WAC9C;AAAA,SACK,MAAA;AACL,UAAM,MAAA,KAAA,GAAQ,aAAa,IAAI,CAAA,CAAA;AAC/B,UAAM,MAAA,OAAA,GAAU,MAAM,OAAQ,CAAA,IAAI,KAAK,CAAC,IAAA,CAAK,SAAS,KAAK,CAAA,CAAA;AAC3D,UAAI,IAAA,OAAA;AAAS,YAAO,OAAA,KAAA,CAAA;AAEpB,UAAA,IACE,eAAe,IAAI,CAAA,IAClB,YAAY,cAAe,CAAA,IAAI,MAAM,KACtC,EAAA;AACA,YAAA,YAAA,CAAa,IAAI,CAAI,GAAA,KAAA,CAAA;AAAA,WACvB;AAAA,SACF;AAAA,OACF;AAAA,KACF;AACA,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACT;AACF;;ACnEgB,SAAA,gBAAA,CAAiB,QAAgB,CAAW,EAAA;AAC1D,EAAM,MAAA,MAAA,uBAAa,IAAK,EAAA,CAAA;AACxB,EAAA,MAAA,CAAO,QAAS,CAAA,MAAA,CAAO,QAAS,EAAA,GAAI,KAAK,CAAA,CAAA;AACzC,EAAO,OAAA,MAAA,CAAO,SAAU,CAAA,QAAA,CAAS,EAAE,CAAE,CAAA,KAAA,CAAM,CAAE,CAAA,CAAA,CAAE,WAAY,EAAA,CAAA;AAC7D;;ACuBgB,SAAA,QAAA,CAAS,aAAc,MAAS,EAAA;AAC9C,EAAI,IAAA,MAAA,IAAU,OAAO,MAAW,KAAA,QAAA;AAAU,IAAO,OAAA,cAAA,CAAA;AAEjD,EAAA,IAAI,EAAE,eAAkB,GAAA,EAAG,EAAA,GAAI,UAAU,EAAC,CAAA;AAE1C,EAAM,MAAA;AAAA,IACJ,yBAAA;AAAA,IACA,gBAAmB,GAAA,IAAA;AAAA,IACnB,qBAAA;AAAA,IACA,kBAAA;AAAA,IACA,aAAA;AAAA,IAEA,kBAAkB,EAAC;AAAA,IACnB,cAAc,EAAC;AAAA,IACf,YAAY,EAAC;AAAA,IACb,YAAY,EAAC;AAAA,IACb,UAAU,EAAC;AAAA,IAEX,SAAY,GAAA,GAAA;AAAA,IACZ,YAAe,GAAA,GAAA;AAAA,IACf,SAAY,GAAA,MAAA;AAAA,IACZ,SAAY,GAAA,GAAA;AAAA,GACd,GAAI,UAAU,EAAC,CAAA;AAEf,EAAA,IACE,CAAC,KAAA,CAAM,OAAQ,CAAA,WAAW,KAC1B,CAAC,KAAA,CAAM,OAAQ,CAAA,eAAe,KAC9B,OAAO,OAAA,KAAY,QACnB,IAAA,OAAO,cAAc,QACrB,IAAA,OAAO,eAAoB,KAAA,QAAA,IAC3B,OAAO,WAAgB,KAAA,QAAA,IACvB,OAAO,SAAA,KAAc,YACrB,OAAO,YAAA,KAAiB,QACxB,IAAA,OAAO,cAAc,QACrB,IAAA,OAAO,SAAc,KAAA,QAAA,IACrB,OAAO,SAAc,KAAA,QAAA;AAErB,IAAO,OAAA,cAAA,CAAA;AAGT,EAAA,eAAA,GAAkB,MAAO,CAAA,MAAA;AAAA,IACvB,EAAC;AAAA,IACD,GAAG,OAAO,IAAK,CAAA,eAAe,EAC3B,OAAQ,EAAA,CACR,GAAI,CAAA,CAAC,GAAS,MAAA;AAAA,MACb,CAAC,GAAG,GAAG,KAAM,CAAA,OAAA,CAAQ,eAAgB,CAAA,GAAG,CAAC,CAAA,GACrC,eAAgB,CAAA,GAAG,CACnB,GAAA;AAAA;AAAA,QAEE,OAAO,eAAgB,CAAA,GAAG,CAAM,KAAA,QAAA,IAAY,gBAAgB,GAAG,CAAA;AAAA,OACjE,CAAE,OAAO,OAAO,CAAA;AAAA,KACpB,CAAA,CAAA;AAAA,GACN,CAAA;AAEA,EAAM,MAAA,SAAA,GAAY,WACf,CAAA,MAAA,CAAO,OAAO,CAAA,CACd,GAAI,CAAA,CAAC,GAAQ,KAAA,WAAA,CAAY,GAAK,EAAA,SAAS,CAAC,CAAA,CAAA;AAE3C,EAAA,MAAM,gBAAmB,GAAA,MAAA,CAAO,MAAO,CAAA,eAAe,EAAE,IAAK,EAAA,CAAA;AAC7D,EAAI,IAAA,yBAAA;AAA2B,IAAgB,eAAA,CAAA,IAAA,CAAK,GAAG,gBAAgB,CAAA,CAAA;AAEvE,EAAA,MAAM,YAAY,SACf,CAAA,MAAA;AAAA,IACC,CAAC,UAAY,EAAA,GAAA,KACX,MAAO,CAAA,IAAA,CAAK,GAAG,CAAE,CAAA,KAAA;AAAA,MACf,CAAC,GAAS,KAAA,CAAC,UAAW,CAAA,QAAA,CAAS,GAAG,CAAK,IAAA,UAAA,CAAW,IAAK,CAAA,GAAG,CAAM,IAAA,IAAA;AAAA,KAC7D,IAAA,UAAA;AAAA,IACP,EAAC;AAAA,GACH,CACC,MAAO,CAAA,CAAC,GAAQ,KAAA,CAAC,iBAAiB,MAAU,IAAA,eAAA,CAAgB,QAAS,CAAA,GAAG,CAAC,CAAA,CAAA;AAE5E,EAAA,MAAM,cAAc,MAAO,CAAA,MAAA;AAAA,IACzB,EAAC;AAAA,IACD,GAAG,MAAO,CAAA,IAAA,CAAK,eAAe,CAAA,CAC3B,SACA,CAAA,GAAA;AAAA,MAAI,CAAC,SAAA,KACJ,eAAgB,CAAA,SAAS,EACtB,GAAI,CAAA,CAAC,KAAW,MAAA,EAAE,CAAC,KAAK,GAAG,SAAU,EAAA,CAAE,EACvC,IAAK,EAAA;AAAA,MAET,IAAK,EAAA;AAAA,GACV,CAAA;AAEA,EAAA,MAAM,WAAc,GAAA,CAAC,CAAG,EAAA,CAAA,KACtB,CAAC,MAAQ,EAAA,SAAA,GACL,CACC,GAAA,MAAA,CAAO,SAAU,CAAA,QAAA,CAAS,CAAC,CAAA,IAC1B,OAAO,SAAU,CAAA,QAAA,CAAS,CAAC,CAAA,IAC3B,MAAO,CAAA,SAAA,CAAU,OAAQ,CAAA,CAAC,IAAI,MAAO,CAAA,SAAA,CAAU,OAAQ,CAAA,CAAC,KACzD,CAAC,MAAA,CAAO,SAAU,CAAA,QAAA,CAAS,CAAC,CAAK,IAAA,CAAA,CAAA,CAAA;AAExC,EAAA,MAAM,mBAAsB,GAAA,SAAA,CACzB,MAAO,CAAA,CAAC,KAAK,GAAQ,KAAA;AACpB,IAAM,MAAA,SAAA,GAAY,YAAY,GAAG,CAAA,CAAA;AACjC,IAAA,IAAI,SAAW,EAAA;AACb,MAAI,IAAA,CAAC,GAAI,CAAA,QAAA,CAAS,SAAS,CAAA;AAAG,QAAA,GAAA,CAAI,KAAK,SAAS,CAAA,CAAA;AAAA,KAC3C,MAAA;AACL,MAAA,GAAA,CAAI,KAAK,GAAG,CAAA,CAAA;AAAA,KACd;AACA,IAAO,OAAA,GAAA,CAAA;AAAA,GACN,EAAA,EAAE,CAAA,CACJ,KAAK,WAAW,CAAA,CAAA;AAEnB,EAAO,MAAA,CAAA,IAAA,CAAK,SAAS,CAAE,CAAA,OAAA;AAAA,IACrB,CAAC,eACC,CAAC,mBAAA,CAAoB,SAAS,UAAU,CAAA,IACxC,mBAAoB,CAAA,OAAA,CAAQ,UAAU,CAAA;AAAA,GAC1C,CAAA;AAEA,EAAO,MAAA,CAAA,IAAA,CAAK,eAAe,CAAE,CAAA,OAAA;AAAA,IAC3B,CAAC,eACC,CAAC,mBAAA,CAAoB,SAAS,UAAU,CAAA,IACxC,mBAAoB,CAAA,OAAA,CAAQ,UAAU,CAAA;AAAA,GAC1C,CAAA;AAEA,EAAA,OAAO,OAAY,KAAA,QAAA,IACjB,MAAO,CAAA,IAAA,CAAK,OAAO,CAAE,CAAA,OAAA;AAAA,IACnB,CAAC,eACC,CAAC,mBAAA,CAAoB,SAAS,UAAU,CAAA,IACxC,mBAAoB,CAAA,OAAA,CAAQ,UAAU,CAAA;AAAA,GAC1C,CAAA;AAEF,EAAI,IAAA,eAAA,GAAkB,oBAAoB,GAAI,CAAA,CAAC,QAAQ,SAAU,CAAA,GAAG,KAAK,GAAG,CAAA,CAAA;AAE5E,EAAI,IAAA,aAAA;AAAe,IAAA,OAAO,CAAC,eAAe,CAAA,CAAA;AAE1C,EAAM,MAAA,aAAA,GAAgB,CAAC,KAAU,KAAA,CAAA,EAAG,SAAS,CAAG,EAAA,KAAK,GAAG,SAAS,CAAA,CAAA,CAAA;AAEjE,EAAA,MAAM,oBAA8B,EAAC,CAAA;AACrC,EAAM,MAAA,UAAA,GAAa,CAAC,GAAQ,KAAA;AAC1B,IAAA,OAAO,MAAO,CAAA,MAAA;AAAA,MACZ,mBAAoB,CAAA,MAAA,CAAO,CAAC,UAAA,EAAY,YAAY,WAAgB,KAAA;AAClE,QAAM,MAAA,SAAA,GAAY,gBAAgB,UAAU,CAAA,CAAA;AAC5C,QAAA,MAAM,SACH,SAAW,EAAA,MAAA,GACR,IAAI,SAAU,CAAA,IAAA,CAAK,CAAC,QAAa,KAAA,GAAA,CAAI,QAAQ,CAAC,CAAC,CAC/C,GAAA,GAAA,CAAI,UAAU,CAClB,KAAA,OAAA,GAAU,UAAU,CACpB,IAAA,EAAA,CAAA;AAEF,QAAA,MAAM,WAAc,GAAA,SAAA,CAAU,UAAU,CAAA,GAAI,KAAK,CAAK,IAAA,KAAA,CAAA;AACtD,QAAM,MAAA,OAAA,GACJ,OAAO,WAAA,CAAY,UAAU,CAAA,KAAM,aAC/B,WAAY,CAAA,UAAU,CAAE,CAAA,WAAW,CACnC,GAAA,WAAA,CAAA;AACN,QAAW,UAAA,CAAA,UAAU,CAAI,GAAA,aAAA,CAAc,OAAO,CAAA,CAAA;AAC9C,QAAA,IAAI,OAAS,EAAA;AACX,UAAA,iBAAA,CAAkB,WAAW,CAAA,GAAA,CAC1B,iBAAkB,CAAA,WAAW,KAAK,CAAK,IAAA,CAAA,CAAA;AAAA,SAC5C;AACA,QAAO,OAAA,UAAA,CAAA;AAAA,OACT,EAAG,EAAE,CAAA;AAAA,KACP,CAAA;AAAA,GACF,CAAA;AAEA,EAAI,IAAA,aAAA,GAAgB,SAAU,CAAA,GAAA,CAAI,UAAU,CAAA,CAAA;AAE5C,EAAA,MAAM,kBACJ,kBACA,IAAA,CAAC,GAAG,iBAAiB,EAClB,GAAI,CAAA,CAAC,KAAO,EAAA,KAAA,KAAU,CAAC,KAAS,IAAA,KAAK,EACrC,MAAO,CAAA,SAAS,EAChB,OAAQ,EAAA,CAAA;AAEb,EAAA,IAAI,eAAiB,EAAA;AACnB,IAAA,MAAM,KAAQ,GAAA,CAAC,GACb,KAAA,GAAA,CAAI,MAAO,CAAA,CAAC,CAAG,EAAA,KAAA,KAAU,CAAC,eAAA,CAAgB,QAAS,CAAA,KAAK,CAAC,CAAA,CAAA;AAC3D,IAAgB,aAAA,GAAA,aAAA,CAAc,IAAI,KAAK,CAAA,CAAA;AACvC,IAAA,eAAA,GAAkB,MAAM,eAAe,CAAA,CAAA;AAAA,GACzC;AAEA,EAAM,MAAA,IAAA,GAAO,cAAc,GAAI,CAAA,CAAC,QAAQ,GAAI,CAAA,IAAA,CAAK,YAAY,CAAC,CAAA,CAAA;AAE9D,EAAA,IAAI,qBAAuB,EAAA;AACzB,IAAO,OAAA,IAAA,CAAK,GAAI,CAAA,CAAC,GAAQ,KAAA;AACvB,MAAM,MAAA,YAAA,GAAe,GAAI,CAAA,KAAA,CAAM,YAAY,CAAA,CAAA;AAC3C,MAAA,OAAO,MAAO,CAAA,MAAA;AAAA,QACZ,EAAC;AAAA,QACD,GAAG,YAAA,CAAa,GAAI,CAAA,CAAC,CAAG,EAAA,CAAA,MAAO,EAAE,CAAC,eAAgB,CAAA,CAAC,CAAC,GAAG,GAAI,CAAA,CAAA;AAAA,OAC7D,CAAA;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AAEA,EAAO,OAAA,gBAAA,GACH,CAAC,eAAA,CAAgB,GAAI,CAAA,aAAa,CAAE,CAAA,IAAA,CAAK,YAAY,CAAA,EAAG,GAAG,IAAI,CAAE,CAAA,IAAA;AAAA,IAC/D,SAAA;AAAA,GACF,GACA,IAAK,CAAA,IAAA,CAAK,SAAS,CAAA,CAAA;AACzB,CAAA;AAEO,SAAS,YAAY,GAAK,EAAA,SAAA,GAAoB,GAAK,EAAA,IAAA,GAAiB,EAAI,EAAA;AAC7E,EACE,OAAA,OAAO,GAAQ,KAAA,QAAA,IACf,MAAO,CAAA,IAAA,CAAK,GAAG,CAAE,CAAA,MAAA,CAAO,CAAC,MAAA,EAAQ,GAAgB,KAAA;AAC/C,IAAA,IAAI,OAAO,GAAA,CAAI,GAAG,CAAA,KAAM,QAAU,EAAA;AAChC,MAAO,MAAA,CAAA,IAAA,CAAK,OAAO,GAAG,CAAA,CAAE,KAAK,SAAS,CAAC,CAAI,GAAA,GAAA,CAAI,GAAG,CAAA,CAAA;AAClD,MAAO,OAAA,MAAA,CAAA;AAAA,KACT;AACA,IAAA,OAAO,MAAO,CAAA,MAAA;AAAA,MACZ,MAAA;AAAA,MACA,WAAA,CAAY,IAAI,GAAG,CAAA,EAAG,WAAW,IAAK,CAAA,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,KACnD,CAAA;AAAA,GACF,EAAG,EAAE,CAAA,CAAA;AAET;;ACtNO,SAAS,IAAO,GAAA;AACrB,EAAA,MAAM,MAAgB,EAAC,CAAA;AAEvB,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,GAAA,EAAK,CAAK,EAAA,EAAA;AAC5B,IAAI,GAAA,CAAA,CAAC,KAAK,CAAI,GAAA,EAAA,GAAK,MAAM,EAAM,IAAA,CAAA,CAAE,SAAS,EAAE,CAAA,CAAA;AAAA,GAC9C;AAEA,EAAA,MAAM,EAAM,GAAA,IAAA,CAAK,MAAO,EAAA,GAAI,UAAc,GAAA,CAAA,CAAA;AAC1C,EAAA,MAAM,EAAM,GAAA,IAAA,CAAK,MAAO,EAAA,GAAI,UAAc,GAAA,CAAA,CAAA;AAC1C,EAAA,MAAM,EAAM,GAAA,IAAA,CAAK,MAAO,EAAA,GAAI,UAAc,GAAA,CAAA,CAAA;AAC1C,EAAA,MAAM,EAAM,GAAA,IAAA,CAAK,MAAO,EAAA,GAAI,UAAc,GAAA,CAAA,CAAA;AAE1C,EAAA,OACE,IAAI,EAAK,GAAA,GAAI,IACb,GAAK,CAAA,EAAA,IAAM,IAAK,GAAI,CAAA,GACpB,GAAK,CAAA,EAAA,IAAM,KAAM,GAAI,CAAA,GACrB,IAAK,EAAM,IAAA,EAAA,GAAM,GAAI,CACrB,GAAA,GAAA;AAAA,EAEA,GAAA,CAAI,KAAK,GAAI,CAAA,GACb,IAAK,EAAM,IAAA,CAAA,GAAK,GAAI,CACpB,GAAA,GAAA,GACA,IAAM,EAAM,IAAA,EAAA,GAAM,KAAQ,EAAI,CAAA,GAC9B,IAAK,EAAM,IAAA,EAAA,GAAM,GAAI,CACrB,GAAA,GAAA;AAAA,EAEA,IAAK,EAAK,GAAA,EAAA,GAAQ,GAAI,CACtB,GAAA,GAAA,CAAK,MAAM,CAAK,GAAA,GAAI,IACpB,GACA,GAAA,GAAA,CAAK,MAAM,EAAM,GAAA,GAAI,IACrB,GAAK,CAAA,EAAA,IAAM,KAAM,GAAI,CAAA;AAAA,EAErB,IAAI,EAAK,GAAA,GAAI,CACb,GAAA,GAAA,CAAK,MAAM,CAAK,GAAA,GAAI,CACpB,GAAA,GAAA,CAAK,MAAM,EAAM,GAAA,GAAI,IACrB,GAAK,CAAA,EAAA,IAAM,KAAM,GAAI,CAAA,CAAA;AAEzB;;;;"}