ttp-agent-sdk 2.3.19 → 2.3.21

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":"agent-widget.js","mappings":"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","sources":["webpack://TTPAgentSDK/webpack/universalModuleDefinition","webpack://TTPAgentSDK/./node_modules/react/index.js","webpack://TTPAgentSDK/./node_modules/react/cjs/react-jsx-runtime.production.js","webpack://TTPAgentSDK/./node_modules/react/jsx-runtime.js","webpack://TTPAgentSDK/./node_modules/react/cjs/react.production.js","webpack://TTPAgentSDK/webpack/bootstrap","webpack://TTPAgentSDK/webpack/runtime/define property getters","webpack://TTPAgentSDK/webpack/runtime/hasOwnProperty shorthand","webpack://TTPAgentSDK/webpack/runtime/make namespace object","webpack://TTPAgentSDK/./src/core/EventEmitter.js","webpack://TTPAgentSDK/./src/core/WebSocketSingleton.js","webpack://TTPAgentSDK/./src/core/WebSocketManager.js","webpack://TTPAgentSDK/./src/core/AudioRecorder.js","webpack://TTPAgentSDK/./src/core/AudioPlayer.js","webpack://TTPAgentSDK/./src/core/VoiceSDK.js","webpack://TTPAgentSDK/./src/shared/EventEmitter.js","webpack://TTPAgentSDK/./src/v2/codecs/PCMCodec.js","webpack://TTPAgentSDK/./src/v2/codecs/PCMUCodec.js","webpack://TTPAgentSDK/./src/v2/codecs/PCMACodec.js","webpack://TTPAgentSDK/./src/v2/AudioPlayer.js","webpack://TTPAgentSDK/./src/v1/AudioRecorder.js","webpack://TTPAgentSDK/./src/v2/utils/converters/ContainerConverter.js","webpack://TTPAgentSDK/./src/v2/utils/converters/EncodingConverter.js","webpack://TTPAgentSDK/./src/v2/utils/converters/BitDepthConverter.js","webpack://TTPAgentSDK/./src/v2/utils/converters/SampleRateConverter.js","webpack://TTPAgentSDK/./src/v2/utils/converters/ChannelConverter.js","webpack://TTPAgentSDK/./src/v2/utils/AudioFormatConverter.js","webpack://TTPAgentSDK/./src/v2/VoiceSDK.js","webpack://TTPAgentSDK/./src/core/TextChatSDK.js","webpack://TTPAgentSDK/./src/react/VoiceButton.jsx","webpack://TTPAgentSDK/./src/vanilla/VoiceButton.js","webpack://TTPAgentSDK/./src/legacy/AgentSDK.js","webpack://TTPAgentSDK/./src/legacy/VoiceInterface.js","webpack://TTPAgentSDK/./src/legacy/TextInterface.js","webpack://TTPAgentSDK/./src/legacy/widget-translations.js","webpack://TTPAgentSDK/./src/legacy/TextChatWidget.js","webpack://TTPAgentSDK/./src/index.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"TTPAgentSDK\"] = factory();\n\telse\n\t\troot[\"TTPAgentSDK\"] = factory();\n})(window, () => {\nreturn ","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react.production.js');\n} else {\n module.exports = require('./cjs/react.development.js');\n}\n","/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","/**\n * @license React\n * react.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n MAYBE_ITERATOR_SYMBOL = Symbol.iterator;\nfunction getIteratorFn(maybeIterable) {\n if (null === maybeIterable || \"object\" !== typeof maybeIterable) return null;\n maybeIterable =\n (MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL]) ||\n maybeIterable[\"@@iterator\"];\n return \"function\" === typeof maybeIterable ? maybeIterable : null;\n}\nvar ReactNoopUpdateQueue = {\n isMounted: function () {\n return !1;\n },\n enqueueForceUpdate: function () {},\n enqueueReplaceState: function () {},\n enqueueSetState: function () {}\n },\n assign = Object.assign,\n emptyObject = {};\nfunction Component(props, context, updater) {\n this.props = props;\n this.context = context;\n this.refs = emptyObject;\n this.updater = updater || ReactNoopUpdateQueue;\n}\nComponent.prototype.isReactComponent = {};\nComponent.prototype.setState = function (partialState, callback) {\n if (\n \"object\" !== typeof partialState &&\n \"function\" !== typeof partialState &&\n null != partialState\n )\n throw Error(\n \"takes an object of state variables to update or a function which returns an object of state variables.\"\n );\n this.updater.enqueueSetState(this, partialState, callback, \"setState\");\n};\nComponent.prototype.forceUpdate = function (callback) {\n this.updater.enqueueForceUpdate(this, callback, \"forceUpdate\");\n};\nfunction ComponentDummy() {}\nComponentDummy.prototype = Component.prototype;\nfunction PureComponent(props, context, updater) {\n this.props = props;\n this.context = context;\n this.refs = emptyObject;\n this.updater = updater || ReactNoopUpdateQueue;\n}\nvar pureComponentPrototype = (PureComponent.prototype = new ComponentDummy());\npureComponentPrototype.constructor = PureComponent;\nassign(pureComponentPrototype, Component.prototype);\npureComponentPrototype.isPureReactComponent = !0;\nvar isArrayImpl = Array.isArray;\nfunction noop() {}\nvar ReactSharedInternals = { H: null, A: null, T: null, S: null },\n hasOwnProperty = Object.prototype.hasOwnProperty;\nfunction ReactElement(type, key, props) {\n var refProp = props.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== refProp ? refProp : null,\n props: props\n };\n}\nfunction cloneAndReplaceKey(oldElement, newKey) {\n return ReactElement(oldElement.type, newKey, oldElement.props);\n}\nfunction isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n}\nfunction escape(key) {\n var escaperLookup = { \"=\": \"=0\", \":\": \"=2\" };\n return (\n \"$\" +\n key.replace(/[=:]/g, function (match) {\n return escaperLookup[match];\n })\n );\n}\nvar userProvidedKeyEscapeRegex = /\\/+/g;\nfunction getElementKey(element, index) {\n return \"object\" === typeof element && null !== element && null != element.key\n ? escape(\"\" + element.key)\n : index.toString(36);\n}\nfunction resolveThenable(thenable) {\n switch (thenable.status) {\n case \"fulfilled\":\n return thenable.value;\n case \"rejected\":\n throw thenable.reason;\n default:\n switch (\n (\"string\" === typeof thenable.status\n ? thenable.then(noop, noop)\n : ((thenable.status = \"pending\"),\n thenable.then(\n function (fulfilledValue) {\n \"pending\" === thenable.status &&\n ((thenable.status = \"fulfilled\"),\n (thenable.value = fulfilledValue));\n },\n function (error) {\n \"pending\" === thenable.status &&\n ((thenable.status = \"rejected\"), (thenable.reason = error));\n }\n )),\n thenable.status)\n ) {\n case \"fulfilled\":\n return thenable.value;\n case \"rejected\":\n throw thenable.reason;\n }\n }\n throw thenable;\n}\nfunction mapIntoArray(children, array, escapedPrefix, nameSoFar, callback) {\n var type = typeof children;\n if (\"undefined\" === type || \"boolean\" === type) children = null;\n var invokeCallback = !1;\n if (null === children) invokeCallback = !0;\n else\n switch (type) {\n case \"bigint\":\n case \"string\":\n case \"number\":\n invokeCallback = !0;\n break;\n case \"object\":\n switch (children.$$typeof) {\n case REACT_ELEMENT_TYPE:\n case REACT_PORTAL_TYPE:\n invokeCallback = !0;\n break;\n case REACT_LAZY_TYPE:\n return (\n (invokeCallback = children._init),\n mapIntoArray(\n invokeCallback(children._payload),\n array,\n escapedPrefix,\n nameSoFar,\n callback\n )\n );\n }\n }\n if (invokeCallback)\n return (\n (callback = callback(children)),\n (invokeCallback =\n \"\" === nameSoFar ? \".\" + getElementKey(children, 0) : nameSoFar),\n isArrayImpl(callback)\n ? ((escapedPrefix = \"\"),\n null != invokeCallback &&\n (escapedPrefix =\n invokeCallback.replace(userProvidedKeyEscapeRegex, \"$&/\") + \"/\"),\n mapIntoArray(callback, array, escapedPrefix, \"\", function (c) {\n return c;\n }))\n : null != callback &&\n (isValidElement(callback) &&\n (callback = cloneAndReplaceKey(\n callback,\n escapedPrefix +\n (null == callback.key ||\n (children && children.key === callback.key)\n ? \"\"\n : (\"\" + callback.key).replace(\n userProvidedKeyEscapeRegex,\n \"$&/\"\n ) + \"/\") +\n invokeCallback\n )),\n array.push(callback)),\n 1\n );\n invokeCallback = 0;\n var nextNamePrefix = \"\" === nameSoFar ? \".\" : nameSoFar + \":\";\n if (isArrayImpl(children))\n for (var i = 0; i < children.length; i++)\n (nameSoFar = children[i]),\n (type = nextNamePrefix + getElementKey(nameSoFar, i)),\n (invokeCallback += mapIntoArray(\n nameSoFar,\n array,\n escapedPrefix,\n type,\n callback\n ));\n else if (((i = getIteratorFn(children)), \"function\" === typeof i))\n for (\n children = i.call(children), i = 0;\n !(nameSoFar = children.next()).done;\n\n )\n (nameSoFar = nameSoFar.value),\n (type = nextNamePrefix + getElementKey(nameSoFar, i++)),\n (invokeCallback += mapIntoArray(\n nameSoFar,\n array,\n escapedPrefix,\n type,\n callback\n ));\n else if (\"object\" === type) {\n if (\"function\" === typeof children.then)\n return mapIntoArray(\n resolveThenable(children),\n array,\n escapedPrefix,\n nameSoFar,\n callback\n );\n array = String(children);\n throw Error(\n \"Objects are not valid as a React child (found: \" +\n (\"[object Object]\" === array\n ? \"object with keys {\" + Object.keys(children).join(\", \") + \"}\"\n : array) +\n \"). If you meant to render a collection of children, use an array instead.\"\n );\n }\n return invokeCallback;\n}\nfunction mapChildren(children, func, context) {\n if (null == children) return children;\n var result = [],\n count = 0;\n mapIntoArray(children, result, \"\", \"\", function (child) {\n return func.call(context, child, count++);\n });\n return result;\n}\nfunction lazyInitializer(payload) {\n if (-1 === payload._status) {\n var ctor = payload._result;\n ctor = ctor();\n ctor.then(\n function (moduleObject) {\n if (0 === payload._status || -1 === payload._status)\n (payload._status = 1), (payload._result = moduleObject);\n },\n function (error) {\n if (0 === payload._status || -1 === payload._status)\n (payload._status = 2), (payload._result = error);\n }\n );\n -1 === payload._status && ((payload._status = 0), (payload._result = ctor));\n }\n if (1 === payload._status) return payload._result.default;\n throw payload._result;\n}\nvar reportGlobalError =\n \"function\" === typeof reportError\n ? reportError\n : function (error) {\n if (\n \"object\" === typeof window &&\n \"function\" === typeof window.ErrorEvent\n ) {\n var event = new window.ErrorEvent(\"error\", {\n bubbles: !0,\n cancelable: !0,\n message:\n \"object\" === typeof error &&\n null !== error &&\n \"string\" === typeof error.message\n ? String(error.message)\n : String(error),\n error: error\n });\n if (!window.dispatchEvent(event)) return;\n } else if (\n \"object\" === typeof process &&\n \"function\" === typeof process.emit\n ) {\n process.emit(\"uncaughtException\", error);\n return;\n }\n console.error(error);\n },\n Children = {\n map: mapChildren,\n forEach: function (children, forEachFunc, forEachContext) {\n mapChildren(\n children,\n function () {\n forEachFunc.apply(this, arguments);\n },\n forEachContext\n );\n },\n count: function (children) {\n var n = 0;\n mapChildren(children, function () {\n n++;\n });\n return n;\n },\n toArray: function (children) {\n return (\n mapChildren(children, function (child) {\n return child;\n }) || []\n );\n },\n only: function (children) {\n if (!isValidElement(children))\n throw Error(\n \"React.Children.only expected to receive a single React element child.\"\n );\n return children;\n }\n };\nexports.Activity = REACT_ACTIVITY_TYPE;\nexports.Children = Children;\nexports.Component = Component;\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.Profiler = REACT_PROFILER_TYPE;\nexports.PureComponent = PureComponent;\nexports.StrictMode = REACT_STRICT_MODE_TYPE;\nexports.Suspense = REACT_SUSPENSE_TYPE;\nexports.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE =\n ReactSharedInternals;\nexports.__COMPILER_RUNTIME = {\n __proto__: null,\n c: function (size) {\n return ReactSharedInternals.H.useMemoCache(size);\n }\n};\nexports.cache = function (fn) {\n return function () {\n return fn.apply(null, arguments);\n };\n};\nexports.cacheSignal = function () {\n return null;\n};\nexports.cloneElement = function (element, config, children) {\n if (null === element || void 0 === element)\n throw Error(\n \"The argument must be a React element, but you passed \" + element + \".\"\n );\n var props = assign({}, element.props),\n key = element.key;\n if (null != config)\n for (propName in (void 0 !== config.key && (key = \"\" + config.key), config))\n !hasOwnProperty.call(config, propName) ||\n \"key\" === propName ||\n \"__self\" === propName ||\n \"__source\" === propName ||\n (\"ref\" === propName && void 0 === config.ref) ||\n (props[propName] = config[propName]);\n var propName = arguments.length - 2;\n if (1 === propName) props.children = children;\n else if (1 < propName) {\n for (var childArray = Array(propName), i = 0; i < propName; i++)\n childArray[i] = arguments[i + 2];\n props.children = childArray;\n }\n return ReactElement(element.type, key, props);\n};\nexports.createContext = function (defaultValue) {\n defaultValue = {\n $$typeof: REACT_CONTEXT_TYPE,\n _currentValue: defaultValue,\n _currentValue2: defaultValue,\n _threadCount: 0,\n Provider: null,\n Consumer: null\n };\n defaultValue.Provider = defaultValue;\n defaultValue.Consumer = {\n $$typeof: REACT_CONSUMER_TYPE,\n _context: defaultValue\n };\n return defaultValue;\n};\nexports.createElement = function (type, config, children) {\n var propName,\n props = {},\n key = null;\n if (null != config)\n for (propName in (void 0 !== config.key && (key = \"\" + config.key), config))\n hasOwnProperty.call(config, propName) &&\n \"key\" !== propName &&\n \"__self\" !== propName &&\n \"__source\" !== propName &&\n (props[propName] = config[propName]);\n var childrenLength = arguments.length - 2;\n if (1 === childrenLength) props.children = children;\n else if (1 < childrenLength) {\n for (var childArray = Array(childrenLength), i = 0; i < childrenLength; i++)\n childArray[i] = arguments[i + 2];\n props.children = childArray;\n }\n if (type && type.defaultProps)\n for (propName in ((childrenLength = type.defaultProps), childrenLength))\n void 0 === props[propName] &&\n (props[propName] = childrenLength[propName]);\n return ReactElement(type, key, props);\n};\nexports.createRef = function () {\n return { current: null };\n};\nexports.forwardRef = function (render) {\n return { $$typeof: REACT_FORWARD_REF_TYPE, render: render };\n};\nexports.isValidElement = isValidElement;\nexports.lazy = function (ctor) {\n return {\n $$typeof: REACT_LAZY_TYPE,\n _payload: { _status: -1, _result: ctor },\n _init: lazyInitializer\n };\n};\nexports.memo = function (type, compare) {\n return {\n $$typeof: REACT_MEMO_TYPE,\n type: type,\n compare: void 0 === compare ? null : compare\n };\n};\nexports.startTransition = function (scope) {\n var prevTransition = ReactSharedInternals.T,\n currentTransition = {};\n ReactSharedInternals.T = currentTransition;\n try {\n var returnValue = scope(),\n onStartTransitionFinish = ReactSharedInternals.S;\n null !== onStartTransitionFinish &&\n onStartTransitionFinish(currentTransition, returnValue);\n \"object\" === typeof returnValue &&\n null !== returnValue &&\n \"function\" === typeof returnValue.then &&\n returnValue.then(noop, reportGlobalError);\n } catch (error) {\n reportGlobalError(error);\n } finally {\n null !== prevTransition &&\n null !== currentTransition.types &&\n (prevTransition.types = currentTransition.types),\n (ReactSharedInternals.T = prevTransition);\n }\n};\nexports.unstable_useCacheRefresh = function () {\n return ReactSharedInternals.H.useCacheRefresh();\n};\nexports.use = function (usable) {\n return ReactSharedInternals.H.use(usable);\n};\nexports.useActionState = function (action, initialState, permalink) {\n return ReactSharedInternals.H.useActionState(action, initialState, permalink);\n};\nexports.useCallback = function (callback, deps) {\n return ReactSharedInternals.H.useCallback(callback, deps);\n};\nexports.useContext = function (Context) {\n return ReactSharedInternals.H.useContext(Context);\n};\nexports.useDebugValue = function () {};\nexports.useDeferredValue = function (value, initialValue) {\n return ReactSharedInternals.H.useDeferredValue(value, initialValue);\n};\nexports.useEffect = function (create, deps) {\n return ReactSharedInternals.H.useEffect(create, deps);\n};\nexports.useEffectEvent = function (callback) {\n return ReactSharedInternals.H.useEffectEvent(callback);\n};\nexports.useId = function () {\n return ReactSharedInternals.H.useId();\n};\nexports.useImperativeHandle = function (ref, create, deps) {\n return ReactSharedInternals.H.useImperativeHandle(ref, create, deps);\n};\nexports.useInsertionEffect = function (create, deps) {\n return ReactSharedInternals.H.useInsertionEffect(create, deps);\n};\nexports.useLayoutEffect = function (create, deps) {\n return ReactSharedInternals.H.useLayoutEffect(create, deps);\n};\nexports.useMemo = function (create, deps) {\n return ReactSharedInternals.H.useMemo(create, deps);\n};\nexports.useOptimistic = function (passthrough, reducer) {\n return ReactSharedInternals.H.useOptimistic(passthrough, reducer);\n};\nexports.useReducer = function (reducer, initialArg, init) {\n return ReactSharedInternals.H.useReducer(reducer, initialArg, init);\n};\nexports.useRef = function (initialValue) {\n return ReactSharedInternals.H.useRef(initialValue);\n};\nexports.useState = function (initialState) {\n return ReactSharedInternals.H.useState(initialState);\n};\nexports.useSyncExternalStore = function (\n subscribe,\n getSnapshot,\n getServerSnapshot\n) {\n return ReactSharedInternals.H.useSyncExternalStore(\n subscribe,\n getSnapshot,\n getServerSnapshot\n );\n};\nexports.useTransition = function () {\n return ReactSharedInternals.H.useTransition();\n};\nexports.version = \"19.2.0\";\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/**\n * EventEmitter - Simple event system for the VoiceSDK\n */\nexport default class EventEmitter {\n constructor() {\n this.events = {};\n }\n \n /**\n * Add event listener\n */\n on(event, callback) {\n if (!this.events[event]) {\n this.events[event] = [];\n }\n this.events[event].push(callback);\n }\n \n /**\n * Remove event listener\n */\n off(event, callback) {\n if (!this.events[event]) return;\n \n this.events[event] = this.events[event].filter(cb => cb !== callback);\n }\n \n /**\n * Emit event\n */\n emit(event, ...args) {\n if (!this.events[event]) return;\n \n this.events[event].forEach(callback => {\n try {\n callback(...args);\n } catch (error) {\n console.error(`Error in event listener for ${event}:`, error);\n }\n });\n }\n \n /**\n * Remove all listeners for an event\n */\n removeAllListeners(event) {\n if (event) {\n delete this.events[event];\n } else {\n this.events = {};\n }\n }\n}\n","/**\n * WebSocketSingleton - Ensures only one WebSocket connection per URL exists\n */\nimport EventEmitter from './EventEmitter.js';\n\nclass WebSocketSingleton extends EventEmitter {\n constructor() {\n super();\n this.connections = new Map(); // Map of URL -> WebSocket instance\n this.connectionCounts = new Map(); // Map of URL -> number of subscribers\n this.creatingConnections = new Set(); // Set of URLs currently being created\n }\n \n /**\n * Get or create a WebSocket connection\n */\n async getConnection(url, config = {}) {\n // If connection already exists, just return it\n if (this.connections.has(url)) {\n const existingConnection = this.connections.get(url);\n this.connectionCounts.set(url, (this.connectionCounts.get(url) || 0) + 1);\n return existingConnection;\n }\n \n // Check if we're already in the process of creating a connection\n if (this.creatingConnections && this.creatingConnections.has(url)) {\n // Wait for the existing creation to complete\n return new Promise((resolve) => {\n const checkConnection = () => {\n if (this.connections.has(url)) {\n const existingConnection = this.connections.get(url);\n this.connectionCounts.set(url, (this.connectionCounts.get(url) || 0) + 1);\n resolve(existingConnection);\n } else {\n setTimeout(checkConnection, 50);\n }\n };\n checkConnection();\n });\n }\n \n // Create new connection\n this.creatingConnections.add(url);\n const connection = new WebSocket(url);\n this.connections.set(url, connection);\n this.connectionCounts.set(url, 1);\n \n // Set up event forwarding\n connection.addEventListener('open', (event) => {\n this.creatingConnections.delete(url);\n this.emit('open', event, url);\n });\n \n connection.addEventListener('close', (event) => {\n this.creatingConnections.delete(url);\n this.connections.delete(url);\n this.connectionCounts.delete(url);\n this.emit('close', event, url);\n });\n \n connection.addEventListener('error', (event) => {\n this.creatingConnections.delete(url);\n this.emit('error', event, url);\n });\n \n connection.addEventListener('message', (event) => {\n this.emit('message', event, url);\n });\n \n return connection;\n }\n \n /**\n * Release a connection (decrement subscriber count)\n */\n releaseConnection(url) {\n if (!this.connections.has(url)) {\n return;\n }\n \n const currentCount = this.connectionCounts.get(url) || 0;\n const newCount = Math.max(0, currentCount - 1);\n this.connectionCounts.set(url, newCount);\n \n // If no more subscribers, close the connection\n if (newCount === 0) {\n const connection = this.connections.get(url);\n if (connection && connection.readyState === WebSocket.OPEN) {\n connection.close(1000, 'No more subscribers');\n }\n this.connections.delete(url);\n this.connectionCounts.delete(url);\n }\n }\n \n /**\n * Force close a connection\n */\n forceClose(url) {\n if (this.connections.has(url)) {\n const connection = this.connections.get(url);\n if (connection && connection.readyState === WebSocket.OPEN) {\n connection.close(1000, 'Force close');\n }\n this.connections.delete(url);\n this.connectionCounts.delete(url);\n }\n }\n \n /**\n * Get connection status\n */\n getConnectionStatus(url) {\n if (!this.connections.has(url)) {\n return { exists: false, readyState: null, subscribers: 0 };\n }\n \n const connection = this.connections.get(url);\n return {\n exists: true,\n readyState: connection.readyState,\n subscribers: this.connectionCounts.get(url) || 0\n };\n }\n \n /**\n * Get all active connections\n */\n getAllConnections() {\n const result = {};\n for (const [url, connection] of this.connections.entries()) {\n result[url] = {\n readyState: connection.readyState,\n subscribers: this.connectionCounts.get(url) || 0\n };\n }\n return result;\n }\n \n /**\n * Clear all connections (for testing)\n */\n clearAll() {\n for (const [url, connection] of this.connections.entries()) {\n if (connection && connection.readyState === WebSocket.OPEN) {\n connection.close(1000, 'Clear all');\n }\n }\n this.connections.clear();\n this.connectionCounts.clear();\n this.creatingConnections.clear();\n }\n}\n\n// Global singleton instance\nconst webSocketSingleton = new WebSocketSingleton();\n\nexport default webSocketSingleton;\n","/**\n * WebSocketManager - Uses singleton pattern to prevent multiple connections\n */\nimport EventEmitter from './EventEmitter.js';\nimport webSocketSingleton from './WebSocketSingleton.js';\n\nexport default class WebSocketManager extends EventEmitter {\n constructor(config) {\n super();\n this.config = config;\n this.ws = null;\n this.isConnected = false;\n this.connectionId = null;\n }\n \n /**\n * Connect to WebSocket using singleton\n */\n async connect() {\n return new Promise((resolve, reject) => {\n try {\n this.connectionId = Date.now() + '_' + Math.random().toString(36).substr(2, 9);\n \n // Store resolve/reject for later use\n this.connectResolve = resolve;\n this.connectReject = reject;\n \n // Get connection from singleton\n webSocketSingleton.getConnection(this.config.websocketUrl, this.config)\n .then((connection) => {\n this.ws = connection;\n \n // Set up event listeners (this will set up handlers that can resolve the promise)\n this.setupEventListeners();\n \n // If already connected, resolve immediately\n if (connection.readyState === WebSocket.OPEN) {\n this.isConnected = true;\n this.emit('connected');\n resolve();\n this.connectResolve = null;\n this.connectReject = null;\n }\n })\n .catch((error) => {\n console.error(`🔌 WebSocketManager: Connection failed ${this.connectionId}`, error);\n reject(error);\n this.connectResolve = null;\n this.connectReject = null;\n });\n \n } catch (error) {\n console.error(`🔌 WebSocketManager: Connection error ${this.connectionId}`, error);\n reject(error);\n this.connectResolve = null;\n this.connectReject = null;\n }\n });\n }\n \n /**\n * Set up event listeners\n */\n setupEventListeners() {\n if (!this.ws) return;\n \n // Use singleton's event forwarding\n const handleOpen = (event, url) => {\n if (url === this.config.websocketUrl) {\n this.isConnected = true;\n this.emit('connected');\n \n // Resolve the connect promise if it hasn't been resolved yet\n if (this.connectResolve) {\n this.connectResolve();\n this.connectResolve = null;\n this.connectReject = null;\n }\n }\n };\n \n const handleClose = (event, url) => {\n if (url === this.config.websocketUrl) {\n this.isConnected = false;\n this.emit('disconnected', event);\n }\n };\n \n const handleError = (event, url) => {\n if (url === this.config.websocketUrl) {\n this.emit('error', event);\n \n // Reject the connect promise if it hasn't been resolved yet\n if (this.connectReject) {\n this.connectReject(event);\n this.connectResolve = null;\n this.connectReject = null;\n }\n }\n };\n \n const handleMessage = (event, url) => {\n if (url === this.config.websocketUrl) {\n this.handleMessage(event);\n }\n };\n \n // Add event listeners\n webSocketSingleton.on('open', handleOpen);\n webSocketSingleton.on('close', handleClose);\n webSocketSingleton.on('error', handleError);\n webSocketSingleton.on('message', handleMessage);\n \n // Store handlers for cleanup\n this.eventHandlers = {\n open: handleOpen,\n close: handleClose,\n error: handleError,\n message: handleMessage\n };\n }\n \n /**\n * Disconnect from WebSocket\n */\n disconnect() {\n // Remove event listeners\n if (this.eventHandlers) {\n webSocketSingleton.off('open', this.eventHandlers.open);\n webSocketSingleton.off('close', this.eventHandlers.close);\n webSocketSingleton.off('error', this.eventHandlers.error);\n webSocketSingleton.off('message', this.eventHandlers.message);\n }\n \n // Release connection from singleton\n if (this.config.websocketUrl) {\n webSocketSingleton.releaseConnection(this.config.websocketUrl);\n }\n \n this.ws = null;\n this.isConnected = false;\n }\n \n /**\n * Send JSON message\n */\n sendMessage(message) {\n if (!this.isConnected || !this.ws) {\n // Silently ignore if not connected (may happen during cleanup/disconnect)\n return;\n }\n \n try {\n this.ws.send(JSON.stringify(message));\n } catch (error) {\n // Log but don't throw - connection may have closed between check and send\n console.warn('🔌 WebSocketManager: Failed to send message:', error.message);\n }\n }\n \n /**\n * Send binary data\n */\n sendBinary(data) {\n if (!this.isConnected || !this.ws) {\n // Silently ignore if not connected (may happen during cleanup/disconnect)\n return;\n }\n \n try {\n this.ws.send(data);\n } catch (error) {\n // Log but don't throw - connection may have closed between check and send\n console.warn('🔌 WebSocketManager: Failed to send binary data:', error.message);\n }\n }\n \n /**\n * Handle incoming messages\n */\n handleMessage(event) {\n // Check if it's binary data\n if (event.data instanceof ArrayBuffer) {\n this.emit('binaryAudio', event.data);\n return;\n } else if (event.data instanceof Blob) {\n event.data.arrayBuffer().then(arrayBuffer => {\n this.emit('binaryAudio', arrayBuffer);\n }).catch(err => {\n console.error('🔌 WebSocketManager: Error converting Blob to ArrayBuffer:', err);\n });\n return;\n }\n \n // Handle JSON messages\n try {\n const message = JSON.parse(event.data);\n \n // Handle barge-in related messages\n if (message.t === 'barge_in_ack' || message.t === 'stop_sending') {\n this.emit('bargeIn', message);\n }\n \n // Handle stop playing message\n if (message.t === 'stop_playing') {\n this.emit('stopPlaying', message);\n }\n \n this.emit('message', message);\n } catch (error) {\n this.emit('error', error);\n }\n }\n \n /**\n * Get connection status\n */\n getStatus() {\n return {\n isConnected: this.isConnected,\n readyState: this.ws ? this.ws.readyState : null,\n connectionId: this.connectionId\n };\n }\n \n /**\n * Get singleton status (for debugging)\n */\n static getSingletonStatus() {\n return webSocketSingleton.getAllConnections();\n }\n \n /**\n * Clear all singleton connections (for testing)\n */\n static clearAllConnections() {\n webSocketSingleton.clearAll();\n }\n}\n","/**\n * AudioRecorder - Handles audio recording using AudioWorklet\n */\nimport EventEmitter from './EventEmitter.js';\n\nexport default class AudioRecorder extends EventEmitter {\n constructor(config) {\n super();\n this.config = config;\n this.audioContext = null;\n this.audioWorkletNode = null;\n this.mediaStream = null;\n this.isRecording = false;\n }\n \n /**\n * Get the audio processor path\n * Tries to detect from script source, falls back to config or default\n */\n getAudioProcessorPath() {\n // If explicitly configured, use it\n if (this.config.audioProcessorPath) {\n return this.config.audioProcessorPath;\n }\n \n // Try to find the script that loaded the SDK\n const scripts = document.getElementsByTagName('script');\n for (let script of scripts) {\n const src = script.src;\n // Check if this is the agent-widget.js script\n if (src && (src.includes('agent-widget.js') || src.includes('ttp-agent-sdk'))) {\n // Extract base URL and construct processor path\n try {\n const url = new URL(src);\n const basePath = src.substring(0, src.lastIndexOf('/'));\n return `${basePath}/audio-processor.js`;\n } catch (e) {\n // If URL parsing fails, try to extract path manually\n const basePath = src.substring(0, src.lastIndexOf('/'));\n return `${basePath}/audio-processor.js`;\n }\n }\n }\n \n // Fallback to CDN\n return 'https://cdn.talktopc.com/audio-processor.js';\n }\n \n /**\n * Start audio recording\n */\n async start() {\n try {\n // Get user media\n this.mediaStream = await navigator.mediaDevices.getUserMedia({\n audio: {\n sampleRate: this.config.sampleRate,\n channelCount: 1,\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true\n }\n });\n \n // Create AudioContext\n this.audioContext = new (window.AudioContext || window.webkitAudioContext)({\n sampleRate: this.config.sampleRate\n });\n \n // Resume AudioContext if suspended\n if (this.audioContext.state === 'suspended') {\n await this.audioContext.resume();\n }\n \n // Get the audio processor path\n const processorPath = this.getAudioProcessorPath();\n \n // Load AudioWorklet module\n await this.audioContext.audioWorklet.addModule(processorPath);\n \n // Create AudioWorklet node\n this.audioWorkletNode = new AudioWorkletNode(this.audioContext, 'audio-processor');\n \n // Create media stream source\n const source = this.audioContext.createMediaStreamSource(this.mediaStream);\n source.connect(this.audioWorkletNode);\n \n // Handle messages from AudioWorklet\n this.audioWorkletNode.port.onmessage = (event) => {\n const { type, data } = event.data;\n \n if (type === 'pcm_audio_data') {\n this.emit('audioData', data);\n }\n };\n \n // Enable continuous mode\n this.audioWorkletNode.port.postMessage({\n type: 'setForceContinuous',\n data: { enabled: true }\n });\n \n this.isRecording = true;\n this.emit('recordingStarted');\n \n } catch (error) {\n this.emit('error', error);\n throw error;\n }\n }\n \n /**\n * Stop audio recording\n */\n async stop() {\n if (!this.isRecording) {\n return;\n }\n \n try {\n // Flush any remaining audio data\n if (this.audioWorkletNode) {\n this.audioWorkletNode.port.postMessage({ type: 'flush' });\n await new Promise(resolve => setTimeout(resolve, 100));\n }\n \n // Disconnect and cleanup\n if (this.mediaStream) {\n this.mediaStream.getTracks().forEach(track => track.stop());\n this.mediaStream = null;\n }\n \n if (this.audioContext && this.audioContext.state !== 'closed') {\n await this.audioContext.close();\n this.audioContext = null;\n }\n \n this.audioWorkletNode = null;\n this.isRecording = false;\n this.emit('recordingStopped');\n \n } catch (error) {\n this.emit('error', error);\n throw error;\n }\n }\n \n /**\n * Get recording status\n */\n getStatus() {\n return {\n isRecording: this.isRecording,\n audioContextState: this.audioContext ? this.audioContext.state : 'closed'\n };\n }\n \n /**\n * Cleanup resources\n */\n destroy() {\n this.stop();\n }\n}\n","/**\n * AudioPlayer - Handles audio playback with queue system\n */\nimport EventEmitter from './EventEmitter.js';\n\nexport default class AudioPlayer extends EventEmitter {\n constructor(config) {\n super();\n this.config = config;\n this.audioContext = null;\n this.audioQueue = [];\n this.isPlaying = false;\n this.isProcessingQueue = false;\n this.currentSource = null;\n }\n \n /**\n * Add audio data to playback queue\n */\n playAudio(audioData) {\n try {\n const audioBlob = this.createAudioBlob(audioData);\n this.audioQueue.push(audioBlob);\n \n // Process queue if not already playing or processing\n // Also check if we have a current source - if not, we should start processing\n if (!this.isPlaying && !this.isProcessingQueue && !this.currentSource) {\n setTimeout(() => this.processQueue(), 50);\n }\n } catch (error) {\n this.emit('playbackError', error);\n }\n }\n \n /**\n * Create audio blob from ArrayBuffer\n */\n createAudioBlob(arrayBuffer) {\n const uint8Array = new Uint8Array(arrayBuffer);\n \n // Detect audio format\n if (uint8Array.length >= 4) {\n // WAV header (RIFF)\n if (uint8Array[0] === 0x52 && uint8Array[1] === 0x49 && \n uint8Array[2] === 0x46 && uint8Array[3] === 0x46) {\n return new Blob([arrayBuffer], { type: 'audio/wav' });\n }\n \n // MP3 header\n if (uint8Array[0] === 0xFF && (uint8Array[1] & 0xE0) === 0xE0) {\n return new Blob([arrayBuffer], { type: 'audio/mpeg' });\n }\n \n // OGG header\n if (uint8Array[0] === 0x4F && uint8Array[1] === 0x67 && \n uint8Array[2] === 0x67 && uint8Array[3] === 0x53) {\n return new Blob([arrayBuffer], { type: 'audio/ogg' });\n }\n }\n \n // Default to WAV format\n return new Blob([arrayBuffer], { type: 'audio/wav' });\n }\n \n /**\n * Process audio queue\n */\n async processQueue() {\n // Prevent multiple simultaneous queue processing\n // Note: isPlaying check removed to allow seamless queue processing\n if (this.isProcessingQueue || this.audioQueue.length === 0) {\n return;\n }\n \n this.isProcessingQueue = true;\n \n const audioBlob = this.audioQueue.shift();\n if (!audioBlob) {\n this.isProcessingQueue = false;\n return;\n }\n \n try {\n // Check if we were playing BEFORE async operations (decode, etc.)\n // This ensures we detect the true state before any async delays\n const wasNotPlayingBefore = !this.isPlaying && this.currentSource === null;\n \n // Create AudioContext if not exists\n if (!this.audioContext) {\n // Use configured sample rate if available, otherwise let browser choose\n const contextOptions = this.config.sampleRate ? { sampleRate: this.config.sampleRate } : {};\n this.audioContext = new (window.AudioContext || window.webkitAudioContext)(contextOptions);\n }\n \n const audioContext = this.audioContext;\n \n // Resume AudioContext if suspended\n if (audioContext.state === 'suspended') {\n await audioContext.resume();\n }\n \n // Create audio source from blob\n const arrayBuffer = await audioBlob.arrayBuffer();\n const audioBuffer = await audioContext.decodeAudioData(arrayBuffer);\n \n // Double-check state AFTER async operations - audio might have been stopped\n // If currentSource is still null and isPlaying is still false, we're truly starting\n const isTrulyStarting = wasNotPlayingBefore && !this.isPlaying && this.currentSource === null;\n \n const source = audioContext.createBufferSource();\n source.buffer = audioBuffer;\n source.connect(audioContext.destination);\n \n // Set state BEFORE emitting event to prevent race conditions\n this.currentSource = source;\n this.isPlaying = true;\n \n // Emit playbackStarted right before actually starting playback\n // This ensures the event is sent when audio actually starts playing\n // CRITICAL: This must be emitted when audio truly starts, not before\n if (isTrulyStarting) {\n this.emit('playbackStarted');\n }\n \n // Handle audio end\n source.onended = () => {\n this.currentSource = null;\n this.isProcessingQueue = false;\n \n // Process next audio in queue if there are more items\n if (this.audioQueue.length > 0) {\n // More audio to play - continue processing without emitting playbackStopped\n // Keep isPlaying = true since we'll continue playing\n // Use immediate processing for gapless playback (0ms instead of 50ms)\n setTimeout(() => this.processQueue(), 0);\n } else {\n // Queue is empty - playback has truly ended\n // Small delay to ensure smooth transition if new audio arrives quickly\n setTimeout(() => {\n // Check again if new audio arrived during the delay\n if (this.audioQueue.length === 0 && !this.currentSource) {\n this.isPlaying = false;\n this.emit('playbackStopped');\n }\n }, 100);\n }\n };\n \n // Start playback\n source.start();\n \n } catch (error) {\n this.currentSource = null;\n this.emit('playbackError', error);\n \n // Try to process next audio in queue if there are more items\n if (this.audioQueue.length > 0) {\n this.isProcessingQueue = false;\n setTimeout(() => this.processQueue(), 100);\n } else {\n // Queue is empty - playback has ended\n this.isPlaying = false;\n this.isProcessingQueue = false;\n this.emit('playbackStopped');\n }\n }\n }\n \n /**\n * Stop current playback and clear queue\n */\n stop() {\n this.stopImmediate();\n }\n \n /**\n * Stop current playback immediately and clear queue\n */\n stopImmediate() {\n const wasPlaying = this.isPlaying || this.currentSource !== null;\n \n if (this.currentSource) {\n try {\n this.currentSource.stop();\n } catch (error) {\n // Ignore errors when stopping\n }\n this.currentSource = null;\n }\n \n this.isPlaying = false;\n this.isProcessingQueue = false;\n this.audioQueue = [];\n \n // Only emit playbackStopped if audio was actually playing\n if (wasPlaying) {\n this.emit('playbackStopped');\n }\n }\n \n /**\n * Get playback status\n */\n getStatus() {\n return {\n isPlaying: this.isPlaying,\n isProcessingQueue: this.isProcessingQueue,\n queueLength: this.audioQueue.length,\n audioContextState: this.audioContext ? this.audioContext.state : 'closed'\n };\n }\n \n /**\n * Cleanup resources\n */\n destroy() {\n this.stop();\n \n if (this.audioContext && this.audioContext.state !== 'closed') {\n this.audioContext.close();\n this.audioContext = null;\n }\n }\n}\n","/**\n * VoiceSDK - Core voice interaction SDK\n * Handles WebSocket connection, audio recording, and audio playback\n */\nimport EventEmitter from './EventEmitter.js';\nimport WebSocketManager from './WebSocketManager.js';\nimport AudioRecorder from './AudioRecorder.js';\nimport AudioPlayer from './AudioPlayer.js';\n\nexport default class VoiceSDK extends EventEmitter {\n constructor(config = {}) {\n super();\n \n // Configuration\n this.config = {\n websocketUrl: config.websocketUrl || 'wss://speech.talktopc.com/ws/conv',\n agentId: config.agentId, // Optional - for direct agent access (unsecured method)\n appId: config.appId, // User's app ID for authentication (REQUIRED)\n ttpId: config.ttpId, // Optional - custom TTP ID (fallback if appId not provided)\n voice: config.voice || 'default',\n language: config.language || 'en',\n sampleRate: config.sampleRate || 16000,\n \n // NEW: Agent settings override (sent via WebSocket message)\n // Only available with signed link authentication\n agentSettingsOverride: config.agentSettingsOverride || null,\n \n ...config\n };\n \n // State\n this.isConnected = false;\n this.isRecording = false;\n this.isPlaying = false;\n this.isDestroyed = false;\n \n // Components\n this.webSocketManager = new WebSocketManager({\n ...this.config,\n autoReconnect: this.config.autoReconnect !== false // Default to true unless explicitly disabled\n });\n this.audioRecorder = new AudioRecorder(this.config);\n this.audioPlayer = new AudioPlayer(this.config);\n \n // Bind event handlers\n this.setupEventHandlers();\n }\n \n /**\n * Setup event handlers for all components\n */\n setupEventHandlers() {\n // WebSocket events\n this.webSocketManager.on('connected', () => {\n this.isConnected = true;\n this.sendHelloMessage();\n this.emit('connected');\n });\n \n this.webSocketManager.on('disconnected', (event) => {\n this.isConnected = false;\n \n // Check if disconnect was due to domain whitelist violation\n if (event && event.code === 1008 && event.reason && \n (event.reason.includes('Domain not whitelisted') || \n event.reason.includes('domain') || \n event.reason.includes('whitelist'))) {\n const domainError = new Error('DOMAIN_NOT_WHITELISTED');\n domainError.reason = event.reason;\n domainError.code = event.code;\n this.emit('domainError', domainError);\n this.emit('error', domainError);\n }\n \n // IMPORTANT: Stop recording when WebSocket disconnects (e.g., no credits, max duration exceeded)\n // This ensures microphone is released and no more audio is streamed\n if (this.isRecording) {\n this.stopRecording().catch(err => {\n console.error('VoiceSDK: Error stopping recording on disconnect:', err);\n });\n }\n \n // Pass close event details (code, reason) to consumers\n this.emit('disconnected', event);\n });\n \n this.webSocketManager.on('error', (error) => {\n this.emit('error', error);\n });\n \n this.webSocketManager.on('message', (message) => {\n // Handle greeting audio message\n if (message.t === 'greeting_audio' && message.data) {\n try {\n // Convert base64 audio data to Uint8Array\n const binaryString = atob(message.data);\n const audioData = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n audioData[i] = binaryString.charCodeAt(i);\n }\n \n this.audioPlayer.playAudio(audioData);\n this.emit('greetingStarted');\n } catch (error) {\n console.error('VoiceSDK: Error playing greeting audio:', error);\n }\n } else {\n this.emit('message', message);\n }\n });\n \n this.webSocketManager.on('binaryAudio', (audioData) => {\n this.audioPlayer.playAudio(audioData);\n });\n \n this.webSocketManager.on('bargeIn', (message) => {\n this.emit('bargeIn', message);\n });\n \n this.webSocketManager.on('stopPlaying', (message) => {\n this.emit('stopPlaying', message);\n // Stop current playback and clear queue, but keep playing new audio\n // Note: stopImmediate() will emit playbackStopped, which will send audio_stopped_playing to backend\n // This ensures backend knows when browser actually stops playing\n this.audioPlayer.stopImmediate();\n // Note: stopImmediate() clears the queue but AudioPlayer can still accept new audio via playAudio()\n });\n \n // Audio recorder events\n this.audioRecorder.on('recordingStarted', () => {\n this.isRecording = true;\n \n // Detect barge-in: if audio is playing when recording starts\n if (this.isPlaying) {\n // Stop audio playback immediately\n this.audioPlayer.stopImmediate();\n // Send barge-in message to server\n if (this.isConnected) {\n this.webSocketManager.sendMessage({\n t: 'barge_in'\n });\n }\n }\n \n this.emit('recordingStarted');\n });\n \n this.audioRecorder.on('recordingStopped', () => {\n this.isRecording = false;\n this.emit('recordingStopped');\n });\n \n this.audioRecorder.on('audioData', (audioData) => {\n if (this.isConnected) {\n this.webSocketManager.sendBinary(audioData);\n }\n });\n \n // Audio player events\n this.audioPlayer.on('playbackStarted', () => {\n this.isPlaying = true;\n this.emit('playbackStarted');\n \n // Send audio_started_playing message to server\n if (this.isConnected) {\n this.webSocketManager.sendMessage({\n t: 'audio_started_playing'\n });\n }\n });\n \n this.audioPlayer.on('playbackStopped', () => {\n this.isPlaying = false;\n this.emit('playbackStopped');\n \n // Send audio_stopped_playing message to server\n if (this.isConnected) {\n this.webSocketManager.sendMessage({\n t: 'audio_stopped_playing'\n });\n }\n });\n \n this.audioPlayer.on('playbackError', (error) => {\n this.emit('playbackError', error);\n });\n }\n \n /**\n * Connect to the voice server\n */\n async connect() {\n if (this.isDestroyed) {\n console.warn('VoiceSDK: Cannot connect - SDK is destroyed');\n return false; // Prevent connect after destroy\n }\n \n try {\n // Build WebSocket URL with query parameters if needed\n const wsUrl = this.buildWebSocketUrl();\n \n // Update the WebSocket manager with the URL that includes query parameters\n this.webSocketManager.config.websocketUrl = wsUrl;\n \n await this.webSocketManager.connect();\n return true;\n } catch (error) {\n console.error('🔌 VoiceSDK: Connection failed with error:', error);\n this.emit('error', error);\n return false;\n }\n }\n\n /**\n * Build WebSocket URL with query parameters for authentication\n */\n buildWebSocketUrl() {\n let url = this.config.websocketUrl;\n const params = new URLSearchParams();\n \n // Add agentId as query parameter if provided\n if (this.config.agentId) {\n params.append('agentId', this.config.agentId);\n }\n \n // Add appId as query parameter if provided\n if (this.config.appId) {\n params.append('appId', this.config.appId);\n }\n \n // Add other parameters if needed\n if (this.config.voice && this.config.voice !== 'default') {\n params.append('voice', this.config.voice);\n }\n \n if (this.config.language && this.config.language !== 'en') {\n params.append('language', this.config.language);\n }\n \n // Append query parameters to URL if any exist\n if (params.toString()) {\n const separator = url.includes('?') ? '&' : '?';\n url += separator + params.toString();\n }\n \n return url;\n }\n \n /**\n * Disconnect from the voice server\n */\n disconnect() {\n if (this.isDestroyed) {\n return; // Prevent disconnect after destroy\n }\n this.stopRecording();\n this.webSocketManager.disconnect();\n }\n \n /**\n * Reset reconnection attempts (useful for manual reconnection)\n */\n resetReconnectionAttempts() {\n if (this.isDestroyed) {\n return;\n }\n this.webSocketManager.resetReconnectionAttempts();\n }\n \n /**\n * Manually reconnect to the voice server\n */\n async reconnect() {\n if (this.isDestroyed) {\n return false;\n }\n \n this.disconnect();\n this.resetReconnectionAttempts();\n return await this.connect();\n }\n \n /**\n * Start voice recording and streaming\n */\n async startRecording() {\n if (!this.isConnected) {\n throw new Error('Not connected to voice server');\n }\n \n try {\n // Send start continuous mode message\n this.webSocketManager.sendMessage({\n t: 'start_continuous_mode',\n ttpId: this.generateTtpId(),\n voice: this.config.voice,\n language: this.config.language\n });\n \n // Start audio recording\n await this.audioRecorder.start();\n return true;\n } catch (error) {\n console.error('❌ VoiceSDK: Failed to start recording:', error);\n this.emit('error', error);\n return false;\n }\n }\n \n /**\n * Stop voice recording and streaming\n */\n async stopRecording() {\n if (!this.isRecording) {\n return;\n }\n \n try {\n // Send stop continuous mode message\n this.webSocketManager.sendMessage({\n t: 'stop_continuous_mode',\n ttpId: this.generateTtpId()\n });\n \n // Stop audio recording\n await this.audioRecorder.stop();\n \n // Stop audio playback immediately when stopping recording\n this.audioPlayer.stopImmediate();\n \n return true;\n } catch (error) {\n this.emit('error', error);\n return false;\n }\n }\n \n /**\n * Toggle recording state\n */\n async toggleRecording() {\n if (this.isRecording) {\n return await this.stopRecording();\n } else {\n return await this.startRecording();\n }\n }\n \n /**\n * Stop audio playback immediately (for barge-in scenarios)\n */\n stopAudioPlayback() {\n this.audioPlayer.stopImmediate();\n }\n \n /**\n * Handle barge-in (user starts speaking while audio is playing)\n */\n async handleBargeIn() {\n // Stop current audio playback immediately\n this.stopAudioPlayback();\n \n // If not already recording, start recording\n if (!this.isRecording) {\n await this.startRecording();\n }\n }\n \n /**\n * Get current connection status\n */\n getStatus() {\n return {\n isConnected: this.isConnected,\n isRecording: this.isRecording,\n isPlaying: this.isPlaying\n };\n }\n \n /**\n * Update configuration\n */\n updateConfig(newConfig) {\n this.config = { ...this.config, ...newConfig };\n }\n \n /**\n * Generate unique TTP ID\n */\n generateTtpId() {\n return 'sdk_' + Math.random().toString(36).substr(2, 9) + '_' + Date.now();\n }\n\n /**\n * Send hello message with appropriate authentication\n */\n sendHelloMessage() {\n if (!this.isConnected) {\n console.warn('VoiceSDK: Cannot send hello message - not connected');\n return;\n }\n\n const helloMessage = {\n t: \"hello\"\n };\n\n // appId is REQUIRED - no fallback to ttpId\n if (!this.config.appId) {\n const error = new Error('appId is required for connection');\n console.error('VoiceSDK: Failed to send hello message:', error);\n this.emit('error', error);\n return;\n }\n \n helloMessage.appId = this.config.appId;\n\n // NEW: Include agent settings override if provided\n // This is only accepted by the server if using signed link authentication\n if (this.config.agentSettingsOverride && \n Object.keys(this.config.agentSettingsOverride).length > 0) {\n helloMessage.agentSettingsOverride = this.config.agentSettingsOverride;\n console.log('🔧 VoiceSDK: Sending agent settings override:', \n Object.keys(this.config.agentSettingsOverride));\n }\n\n // Note: agentId is now sent as query parameter in WebSocket URL, not in hello message\n\n try {\n this.webSocketManager.sendMessage(helloMessage);\n } catch (error) {\n console.error('VoiceSDK: Failed to send hello message:', error);\n this.emit('error', error);\n }\n }\n \n /**\n * Cleanup resources\n */\n destroy() {\n if (this.isDestroyed) {\n return; // Prevent multiple destroy calls\n }\n \n // Disconnect first, before setting isDestroyed\n this.disconnect();\n \n this.isDestroyed = true;\n this.audioRecorder.destroy();\n this.audioPlayer.destroy();\n this.removeAllListeners();\n }\n}\n","// src/shared/EventEmitter.js\nclass EventEmitter {\n constructor() {\n this.events = {};\n }\n\n on(event, listener) {\n if (!this.events[event]) {\n this.events[event] = [];\n }\n this.events[event].push(listener);\n return this;\n }\n\n off(event, listenerToRemove) {\n if (!this.events[event]) return this;\n\n this.events[event] = this.events[event].filter(\n listener => listener !== listenerToRemove\n );\n return this;\n }\n\n emit(event, ...args) {\n if (!this.events[event]) return false;\n\n this.events[event].forEach(listener => {\n listener(...args);\n });\n return true;\n }\n\n once(event, listener) {\n const onceWrapper = (...args) => {\n listener(...args);\n this.off(event, onceWrapper);\n };\n return this.on(event, onceWrapper);\n }\n\n removeAllListeners(event) {\n if (event) {\n delete this.events[event];\n } else {\n this.events = {};\n }\n return this;\n }\n}\n\nexport default EventEmitter;\n\n","// src/v2/codecs/PCMCodec.js\n\n/**\n * PCM Codec - handles raw PCM audio (no compression)\n */\nclass PCMCodec {\n constructor() {\n this.name = 'PCM';\n }\n\n /**\n * Decode PCM data (it's already decoded, so return as-is)\n * @param {Uint8Array|ArrayBuffer} data - PCM audio data\n * @returns {ArrayBuffer} - PCM audio data\n */\n decode(data) {\n if (data instanceof ArrayBuffer) {\n return data;\n }\n if (data instanceof Uint8Array) {\n return data.buffer;\n }\n throw new Error('Invalid PCM data type');\n }\n\n /**\n * Encode PCM data (no encoding needed)\n * @param {ArrayBuffer} pcmData - PCM audio data\n * @returns {ArrayBuffer} - PCM audio data\n */\n encode(pcmData) {\n return pcmData;\n }\n}\n\nexport default PCMCodec;\n\n","// src/v2/codecs/PCMUCodec.js\n\n/**\n * PCMU (μ-law) Codec - handles μ-law compressed audio\n * Used for telephony (8kHz, 8-bit)\n */\nclass PCMUCodec {\n constructor() {\n this.name = 'PCMU';\n }\n\n /**\n * Decode PCMU (μ-law) to 16-bit PCM\n * @param {Uint8Array} pcmuData - μ-law encoded audio data\n * @returns {ArrayBuffer} - 16-bit PCM audio data\n */\n decode(pcmuData) {\n const input = pcmuData instanceof Uint8Array ? \n pcmuData : \n new Uint8Array(pcmuData);\n \n const pcm16 = new Int16Array(input.length);\n \n for (let i = 0; i < input.length; i++) {\n pcm16[i] = this.mulawToLinear(input[i]);\n }\n \n return pcm16.buffer;\n }\n\n /**\n * Encode 16-bit PCM to PCMU (μ-law)\n * @param {ArrayBuffer} pcm16Data - 16-bit PCM audio data\n * @returns {Uint8Array} - μ-law encoded audio data\n */\n encode(pcm16Data) {\n const pcm16 = pcm16Data instanceof Int16Array ? \n pcm16Data : \n new Int16Array(pcm16Data);\n \n const pcmu = new Uint8Array(pcm16.length);\n \n for (let i = 0; i < pcm16.length; i++) {\n pcmu[i] = this.linearToMulaw(pcm16[i]);\n }\n \n return pcmu;\n }\n\n /**\n * μ-law decompression: 8-bit → 16-bit\n * @param {number} mulaw - μ-law encoded byte\n * @returns {number} - 16-bit linear PCM sample\n */\n mulawToLinear(mulaw) {\n // μ-law decompression algorithm\n const sign = (mulaw & 0x80) ? -1 : 1;\n const exponent = (mulaw >> 4) & 0x07;\n const mantissa = mulaw & 0x0F;\n \n const step = 1 << (exponent + 3);\n const value = 132 + mantissa * step + (step >> 1) - 4;\n \n return sign * value;\n }\n\n /**\n * μ-law compression: 16-bit → 8-bit\n * @param {number} sample - 16-bit linear PCM sample\n * @returns {number} - μ-law encoded byte\n */\n linearToMulaw(sample) {\n const BIAS = 0x84;\n const CLIP = 32635;\n \n let sign = (sample >> 8) & 0x80;\n if (sign) {\n sample = -sample;\n }\n \n if (sample > CLIP) {\n sample = CLIP;\n }\n \n sample += BIAS;\n \n let exponent = 7;\n for (let expMask = 0x4000; (sample & expMask) === 0 && exponent > 0; exponent--, expMask >>= 1);\n \n let mantissa = (sample >> (exponent + 3)) & 0x0F;\n let mulaw = ~(sign | (exponent << 4) | mantissa);\n \n return mulaw & 0xFF;\n }\n}\n\nexport default PCMUCodec;\n\n","// src/v2/codecs/PCMACodec.js\n\n/**\n * PCMA (A-law) Codec - handles A-law compressed audio\n * Used for European telephony (8kHz, 8-bit)\n */\nclass PCMACodec {\n constructor() {\n this.name = 'PCMA';\n }\n\n /**\n * Decode PCMA (A-law) to 16-bit PCM\n * @param {Uint8Array} pcmaData - A-law encoded audio data\n * @returns {ArrayBuffer} - 16-bit PCM audio data\n */\n decode(pcmaData) {\n const input = pcmaData instanceof Uint8Array ? \n pcmaData : \n new Uint8Array(pcmaData);\n \n const pcm16 = new Int16Array(input.length);\n \n for (let i = 0; i < input.length; i++) {\n pcm16[i] = this.alawToLinear(input[i]);\n }\n \n return pcm16.buffer;\n }\n\n /**\n * Encode 16-bit PCM to PCMA (A-law)\n * @param {ArrayBuffer} pcm16Data - 16-bit PCM audio data\n * @returns {Uint8Array} - A-law encoded audio data\n */\n encode(pcm16Data) {\n const pcm16 = pcm16Data instanceof Int16Array ? \n pcm16Data : \n new Int16Array(pcm16Data);\n \n const pcma = new Uint8Array(pcm16.length);\n \n for (let i = 0; i < pcm16.length; i++) {\n pcma[i] = this.linearToAlaw(pcm16[i]);\n }\n \n return pcma;\n }\n\n /**\n * A-law decompression: 8-bit → 16-bit\n * @param {number} alaw - A-law encoded byte\n * @returns {number} - 16-bit linear PCM sample\n */\n alawToLinear(alaw) {\n alaw ^= 0x55; // XOR with 0x55\n \n const sign = (alaw & 0x80) ? -1 : 1;\n const exponent = (alaw >> 4) & 0x07;\n const mantissa = alaw & 0x0F;\n \n let value;\n if (exponent === 0) {\n value = (mantissa << 4) + 8;\n } else {\n value = ((mantissa << 4) + 0x108) << (exponent - 1);\n }\n \n return sign * value;\n }\n\n /**\n * A-law compression: 16-bit → 8-bit\n * @param {number} sample - 16-bit linear PCM sample\n * @returns {number} - A-law encoded byte\n */\n linearToAlaw(sample) {\n const CLIP = 32635;\n \n let sign = (sample >> 8) & 0x80;\n if (sign) {\n sample = -sample;\n }\n \n if (sample > CLIP) {\n sample = CLIP;\n }\n \n let exponent, mantissa;\n \n if (sample < 256) {\n exponent = 0;\n mantissa = sample >> 4;\n } else {\n exponent = 7;\n for (let expMask = 0x4000; (sample & expMask) === 0 && exponent > 0; exponent--, expMask >>= 1);\n mantissa = (sample >> (exponent + 3)) & 0x0F;\n }\n \n let alaw = sign | (exponent << 4) | mantissa;\n \n return alaw ^ 0x55; // XOR with 0x55\n }\n}\n\nexport default PCMACodec;\n\n","// src/v2/AudioPlayer.js\n\nimport EventEmitter from '../shared/EventEmitter.js';\n\nimport PCMCodec from './codecs/PCMCodec.js';\n\nimport PCMUCodec from './codecs/PCMUCodec.js';\n\nimport PCMACodec from './codecs/PCMACodec.js';\n\n\n\n/**\n\n * AudioPlayer v2 - Handles multiple audio formats with codec support\n\n * \n\n * Features:\n\n * - Auto-detects WAV files vs raw audio data\n\n * - Supports PCM, PCMU (μ-law), PCMA (A-law) encodings\n\n * - Handles both WAV containers and raw streams\n\n * - Queues audio for smooth playback\n\n * \n\n * Events:\n\n * - 'playbackStarted' - Audio playback begins\n\n * - 'playbackStopped' - Audio playback ends\n\n * - 'playbackError' - Error during playback\n\n */\n\nclass AudioPlayer extends EventEmitter {\n\n constructor(config = {}) {\n\n super();\n\n \n\n this.config = config;\n\n this.audioContext = null;\n\n this.audioQueue = [];\n\n this.isPlaying = false;\n\n this.isProcessingQueue = false;\n\n this.currentSource = null;\n\n this.outputFormat = null;\n\n // Audio scheduling for seamless PCM chunk playback\n\n this.nextStartTime = 0;\n\n this.scheduledBuffers = 0;\n\n // Track all scheduled AudioBufferSource nodes (for stopping on barge-in)\n this.scheduledSources = new Set();\n\n // Queue for raw PCM chunks (before processing)\n this.pcmChunkQueue = [];\n\n // Queue for prepared AudioBuffers (ready to schedule)\n this.preparedBuffer = [];\n\n this.isProcessingPcmQueue = false;\n\n this.isSchedulingFrames = false;\n\n // Minimal scheduling delay to avoid scheduling audio in the past\n // REMOVED: Lookahead buffering was causing quality degradation due to browser resampling/timing issues\n // Now we only schedule with minimal delay (20ms) just enough to avoid gaps\n this.MAX_LOOKAHEAD_SECONDS = 0.02; // 20ms minimal delay to avoid scheduling in the past\n\n \n\n // Codec registry\n\n this.codecs = {\n\n pcm: new PCMCodec(),\n\n pcmu: new PCMUCodec(),\n\n pcma: new PCMACodec()\n\n };\n\n \n\n // Supported OUTPUT formats (matching backend validation)\n\n this.SUPPORTED_CONTAINERS = ['wav', 'raw'];\n\n this.SUPPORTED_ENCODINGS = ['pcm', 'pcmu', 'pcma']; // Backend only supports these three\n\n this.SUPPORTED_SAMPLE_RATES = [8000, 16000, 22050, 24000, 44100, 48000]; // Backend supported rates\n\n this.SUPPORTED_BIT_DEPTHS = [8, 16, 24];\n\n this.SUPPORTED_CHANNELS = [1]; // Backend only supports mono\n\n \n\n console.log('🎵 AudioPlayer v2 initialized');\n\n }\n\n \n\n /**\n\n * Set the expected output audio format\n\n * @param {Object} format - Audio format specification\n\n * @param {string} format.container - 'wav' or 'raw'\n\n * @param {string} format.encoding - 'pcm', 'pcmu', 'pcma'\n\n * @param {number} format.sampleRate - Sample rate in Hz\n\n * @param {number} format.channels - Number of channels (1 or 2)\n\n * @param {number} format.bitDepth - Bit depth (8, 16, 24)\n\n */\n\n setOutputFormat(format) {\n\n if (!this.validateFormat(format)) {\n\n console.warn('⚠️ AudioPlayer: Invalid format, using defaults:', format);\n\n format = this.getDefaultFormat();\n\n }\n\n \n\n const oldSampleRate = this.outputFormat?.sampleRate;\n\n const newSampleRate = format.sampleRate;\n\n \n\n this.outputFormat = format;\n\n console.log('✅ AudioPlayer v2: Format set:', format);\n\n \n\n // CRITICAL: If AudioContext already exists and sample rate changed, recreate it\n\n if (this.audioContext && oldSampleRate && oldSampleRate !== newSampleRate) {\n\n console.warn('⚠️ AudioPlayer: Sample rate changed, recreating AudioContext');\n\n console.warn(` Old: ${oldSampleRate}Hz → New: ${newSampleRate}Hz`);\n\n \n\n // Stop any playing audio first\n\n this.stopImmediate();\n\n \n\n // Close old context\n\n if (this.audioContext.state !== 'closed') {\n\n this.audioContext.close();\n\n }\n\n this.audioContext = null;\n\n \n\n console.log('ℹ️ AudioContext will be recreated on next audio chunk with correct sample rate');\n\n }\n\n }\n\n \n\n /**\n\n * Validate audio format\n\n */\n\n validateFormat(format) {\n\n if (!format) return false;\n\n \n\n const container = format.container?.toLowerCase();\n\n const encoding = format.encoding?.toLowerCase();\n\n \n\n return (\n\n container &&\n\n encoding &&\n\n this.SUPPORTED_CONTAINERS.includes(container) &&\n\n this.SUPPORTED_ENCODINGS.includes(encoding) &&\n\n this.SUPPORTED_SAMPLE_RATES.includes(format.sampleRate) &&\n\n this.SUPPORTED_BIT_DEPTHS.includes(format.bitDepth) &&\n\n (!format.channels || this.SUPPORTED_CHANNELS.includes(format.channels))\n\n );\n\n }\n\n \n\n /**\n\n * Get default audio format\n\n */\n\n getDefaultFormat() {\n\n return {\n\n container: 'raw',\n\n encoding: 'pcm',\n\n sampleRate: 16000,\n\n channels: 1,\n\n bitDepth: 16\n\n };\n\n }\n\n \n\n /**\n\n * Play audio data\n\n * @param {ArrayBuffer|Uint8Array} binaryData - Audio data to play\n\n */\n\n playAudio(binaryData) {\n\n try {\n\n const audioBlob = this.createAudioBlob(binaryData);\n\n this.audioQueue.push(audioBlob);\n\n \n\n // Start processing queue if not already playing\n\n if (!this.isPlaying && !this.isProcessingQueue && !this.currentSource) {\n\n setTimeout(() => this.processQueue(), 50);\n\n }\n\n } catch (error) {\n\n console.error('❌ AudioPlayer v2: Playback error:', error);\n\n this.emit('playbackError', error);\n\n }\n\n }\n\n \n\n /**\n\n * Play raw PCM chunk directly with seamless scheduling\n\n * This method bypasses blob creation and directly schedules audio chunks\n\n * for lower latency and seamless playback. Chunks are queued and processed\n\n * sequentially to handle bursts of incoming data.\n\n * \n\n * @param {ArrayBuffer|Uint8Array} pcmData - Raw 16-bit PCM audio data\n\n */\n\n async playChunk(pcmData) {\n\n // Pre-process frame immediately (convert to AudioBuffer)\n const preparedFrame = this.prepareChunk(pcmData);\n\n if (preparedFrame) {\n\n // Add prepared frame to buffer\n\n this.preparedBuffer.push(preparedFrame);\n\n \n\n // Always try to schedule prepared frames\n\n // Use requestAnimationFrame to avoid blocking, but ensure scheduling happens\n\n if (!this.isSchedulingFrames) {\n\n // Schedule immediately if not already scheduling\n\n this.schedulePreparedFrames();\n\n } else {\n\n // Already scheduling, but ensure we'll schedule this new frame too\n\n // The scheduling loop will pick it up, but we can also trigger a re-check\n\n requestAnimationFrame(() => {\n\n if (this.preparedBuffer.length > 0 && !this.isSchedulingFrames) {\n\n this.schedulePreparedFrames();\n\n }\n\n });\n\n }\n\n \n\n // Also process any raw chunks in queue (for backward compatibility)\n\n if (this.pcmChunkQueue.length > 0 && !this.isProcessingPcmQueue) {\n\n this.processPcmQueue();\n\n }\n\n } else {\n\n // prepareChunk returned null - log error for debugging\n console.error('❌ AudioPlayer: playChunk failed - prepareChunk returned null');\n console.error(' pcmData length:', pcmData?.byteLength || 'undefined');\n console.error(' outputFormat:', this.outputFormat);\n console.error(' audioContext:', this.audioContext ? 'initialized' : 'not initialized');\n console.error(' audioContext state:', this.audioContext?.state || 'N/A');\n \n // Emit error event\n this.emit('playbackError', new Error('Failed to prepare PCM chunk for playback'));\n }\n\n }\n\n \n\n /**\n\n * Pre-process a PCM chunk: convert to Float32 and create AudioBuffer\n\n * This happens immediately when frame arrives, not during playback\n\n * @param {ArrayBuffer|Uint8Array} pcmData - Raw PCM data\n\n * @returns {Object|null} Prepared frame with AudioBuffer and metadata\n\n */\n\n prepareChunk(pcmData) {\n\n try {\n\n // Ensure output format is set\n if (!this.outputFormat) {\n console.error('❌ AudioPlayer: Cannot prepare chunk - outputFormat not set');\n console.error(' Call setOutputFormat() before playing audio chunks');\n return null;\n }\n\n // Ensure audio context is initialized\n\n if (!this.audioContext) {\n\n this.initializeAudioContext();\n\n }\n\n \n\n if (!this.audioContext) {\n\n console.error('❌ AudioPlayer: Cannot prepare chunk - AudioContext not available');\n\n return null;\n\n }\n\n \n\n // Ensure even byte count for 16-bit PCM\n\n let processedData = pcmData;\n\n if (pcmData.byteLength % 2 !== 0) {\n\n console.warn('⚠️ Odd PCM chunk size, padding:', pcmData.byteLength);\n\n const padded = new Uint8Array(pcmData.byteLength + 1);\n\n padded.set(new Uint8Array(pcmData), 0);\n\n padded[pcmData.byteLength] = 0; // Silence padding\n\n processedData = padded.buffer;\n\n }\n\n \n\n // Convert Int16 PCM to Float32 (pre-processing)\n\n const int16Array = new Int16Array(processedData);\n\n const float32Array = new Float32Array(int16Array.length);\n\n const NORMALIZATION = 1.0 / 32768.0;\n\n const length = int16Array.length;\n\n for (let i = 0; i < length; i++) {\n\n float32Array[i] = int16Array[i] * NORMALIZATION;\n\n }\n\n \n\n // Create audio buffer with the ACTUAL sample rate of the audio data\n\n const audioDataSampleRate = this.outputFormat?.sampleRate || this.audioContext.sampleRate;\n\n const contextSampleRate = this.audioContext.sampleRate;\n\n \n\n const audioBuffer = this.audioContext.createBuffer(\n\n 1, // mono\n\n float32Array.length,\n\n audioDataSampleRate\n\n );\n\n \n\n audioBuffer.getChannelData(0).set(float32Array);\n\n // Calculate duration (handle browser resampling)\n\n const chunkDuration = audioBuffer.duration;\n\n const sampleCount = float32Array.length;\n\n let actualDuration = chunkDuration;\n\n \n\n if (contextSampleRate !== audioDataSampleRate) {\n\n actualDuration = sampleCount / contextSampleRate;\n\n }\n\n \n\n // Return prepared frame\n\n return {\n\n buffer: audioBuffer,\n\n duration: actualDuration,\n\n sampleRate: audioDataSampleRate,\n\n contextSampleRate: contextSampleRate\n\n };\n\n \n\n } catch (error) {\n\n console.error('❌ AudioPlayer: Error preparing chunk:', error);\n\n return null;\n\n }\n\n }\n\n /**\n * Apply fade-out to audio buffer (stub method to prevent errors)\n * This method is called by some code paths but doesn't need to do anything\n * @param {AudioBuffer} audioBuffer - Audio buffer to fade\n * @returns {AudioBuffer} - Same audio buffer (no modification)\n */\n applyFadeOut(audioBuffer) {\n // Stub method - fade-out is not needed for streaming audio\n // This method exists to prevent \"is not a function\" errors\n return audioBuffer;\n }\n\n \n\n /**\n\n * Schedule prepared frames ahead of time for smooth playback\n\n * This runs continuously to keep frames scheduled ahead\n\n */\n\n async schedulePreparedFrames() {\n\n if (this.isSchedulingFrames) {\n\n return;\n\n }\n\n \n\n this.isSchedulingFrames = true;\n \n // REMOVED: Dynamic lookahead calculation\n // Now we only schedule 1-2 frames ahead to avoid gaps, but not far in advance\n // This preserves audio quality by avoiding browser resampling/timing issues\n let targetLookaheadFrames = 1; // Schedule only 1 frame ahead (just enough to avoid gaps)\n\n \n\n try {\n\n // Initialize audio context if needed\n\n if (!this.audioContext) {\n\n this.initializeAudioContext();\n\n }\n\n \n\n // Resume if suspended\n\n if (this.audioContext.state === 'suspended') {\n\n await this.audioContext.resume();\n\n }\n\n \n\n // Schedule frames up to target lookahead (ensures smooth playback)\n // For small frames (200ms), we need more frames scheduled ahead\n // For large frames (1200ms), fewer frames are needed\n let scheduledCount = 0;\n while (this.preparedBuffer.length > 0 && scheduledCount < targetLookaheadFrames) {\n\n // Get next prepared frame\n\n const preparedFrame = this.preparedBuffer.shift();\n\n if (!preparedFrame) {\n\n break;\n\n }\n\n \n\n // Create source and schedule playback\n\n const source = this.audioContext.createBufferSource();\n\n source.buffer = preparedFrame.buffer;\n\n source.connect(this.audioContext.destination);\n\n \n\n // Track this source so we can stop it on barge-in\n\n this.scheduledSources.add(source);\n\n \n\n // Calculate when to start this chunk\n\n const currentTime = this.audioContext.currentTime;\n\n \n\n // Ensure we don't schedule in the past, but NEVER decrease nextStartTime\n // This prevents overlapping audio by maintaining sequential ordering\n if (this.scheduledBuffers === 0) {\n\n // First chunk: start with minimal delay just enough to avoid scheduling in the past\n if (this.nextStartTime < currentTime) {\n\n this.nextStartTime = currentTime + this.MAX_LOOKAHEAD_SECONDS;\n\n }\n\n console.log('🎵 Starting playback with minimal delay:', this.nextStartTime);\n\n } else {\n\n // Subsequent chunks: ensure nextStartTime is not in the past, but never decrease it\n // This maintains sequential playback - each chunk starts after the previous one\n const minStartTime = currentTime + this.MAX_LOOKAHEAD_SECONDS;\n\n this.nextStartTime = Math.max(this.nextStartTime, minStartTime);\n\n }\n\n \n\n // Schedule this chunk to start at nextStartTime\n\n source.start(this.nextStartTime);\n\n \n\n // Calculate when the next chunk should start (seamless, no gaps)\n // This ensures sequential playback - each chunk starts after the previous one\n\n this.nextStartTime += preparedFrame.duration;\n\n \n\n // Round to prevent floating point accumulation errors\n\n this.nextStartTime = Math.round(this.nextStartTime * 1000000) / 1000000;\n\n \n\n // Log timing for first few chunks (debugging)\n\n if (this.scheduledBuffers < 3) {\n\n const startTime = this.nextStartTime - preparedFrame.duration;\n\n console.log(`🎵 AudioPlayer: Scheduled prepared frame ${this.scheduledBuffers + 1} at ${startTime.toFixed(4)}s, next at ${this.nextStartTime.toFixed(4)}s`);\n\n console.log(` Duration: ${preparedFrame.duration.toFixed(4)}s (${(preparedFrame.duration * 1000).toFixed(2)}ms), Scheduled ahead: ${this.scheduledBuffers}`);\n\n }\n\n \n\n this.scheduledBuffers++;\n scheduledCount++; // Track how many we've scheduled in this batch\n\n \n\n // Track when this buffer finishes (for cleanup only)\n\n source.onended = () => {\n\n // Remove from tracked sources\n\n this.scheduledSources.delete(source);\n\n \n\n this.scheduledBuffers--;\n\n \n\n // If no more scheduled buffers and no prepared frames, playback is complete\n\n if (this.scheduledBuffers === 0 && this.preparedBuffer.length === 0 && this.pcmChunkQueue.length === 0) {\n\n this.isPlaying = false;\n\n this.isSchedulingFrames = false;\n\n console.log('🛑 AudioPlayer: Emitting playbackStopped event (all buffers finished)');\n\n this.emit('playbackStopped');\n\n } else if (this.preparedBuffer.length > 0) {\n\n // More frames available, schedule them immediately\n\n // Use setTimeout to avoid blocking, but schedule quickly\n\n setTimeout(() => {\n\n if (this.preparedBuffer.length > 0 && !this.isSchedulingFrames) {\n\n this.schedulePreparedFrames();\n\n }\n\n }, 0);\n\n }\n\n };\n\n \n\n if (!this.isPlaying) {\n\n this.isPlaying = true;\n\n console.log('🎵 AudioPlayer: Emitting playbackStarted event');\n\n this.emit('playbackStarted');\n\n }\n\n }\n\n \n\n // All prepared frames scheduled, reset flag\n\n this.isSchedulingFrames = false;\n\n \n\n // If more frames arrive while we were processing, schedule them now\n\n // Use requestAnimationFrame for smooth scheduling without blocking\n\n if (this.preparedBuffer.length > 0) {\n\n // More frames arrived, schedule them immediately\n\n requestAnimationFrame(() => {\n\n if (this.preparedBuffer.length > 0 && !this.isSchedulingFrames) {\n\n this.schedulePreparedFrames();\n\n }\n\n });\n\n } else if (this.scheduledBuffers > 0) {\n\n // Still have scheduled buffers playing, but no more prepared frames\n\n // Set up a periodic check to schedule new frames as they arrive\n\n // This ensures continuous playback even if frames arrive slowly\n\n setTimeout(() => {\n\n if (this.preparedBuffer.length > 0 && !this.isSchedulingFrames && this.scheduledBuffers > 0) {\n\n this.schedulePreparedFrames();\n\n }\n\n }, 25); // Check every 25ms for new frames (reduced from 50ms for smaller frame durations)\n\n }\n\n \n\n } catch (error) {\n\n console.error('❌ AudioPlayer v2: Error scheduling frames:', error);\n\n this.emit('playbackError', error);\n\n this.isSchedulingFrames = false;\n\n }\n\n }\n\n \n\n /**\n\n * Process PCM chunk queue with seamless scheduling\n\n * Process one chunk at a time to ensure proper timing\n\n */\n\n async processPcmQueue() {\n\n if (this.isProcessingPcmQueue) {\n\n return;\n\n }\n\n this.isProcessingPcmQueue = true;\n\n \n\n try {\n\n // Initialize audio context if needed\n\n if (!this.audioContext) {\n\n this.initializeAudioContext();\n\n }\n\n \n\n // Resume if suspended\n\n if (this.audioContext.state === 'suspended') {\n\n await this.audioContext.resume();\n\n }\n\n // Process ALL queued chunks immediately with precise scheduling\n // This eliminates overhead from onended callbacks and setTimeout delays\n // The browser's AudioContext handles seamless playback automatically\n while (this.pcmChunkQueue.length > 0) {\n const pcmData = this.pcmChunkQueue.shift();\n\n if (!pcmData) {\n continue;\n }\n\n // Ensure even byte count for 16-bit PCM\n let processedData = pcmData;\n\n if (pcmData.byteLength % 2 !== 0) {\n console.warn('⚠️ Odd PCM chunk size, padding:', pcmData.byteLength);\n const padded = new Uint8Array(pcmData.byteLength + 1);\n padded.set(new Uint8Array(pcmData), 0);\n padded[pcmData.byteLength] = 0; // Silence padding\n processedData = padded.buffer;\n }\n\n // Convert Int16 PCM to Float32\n const int16Array = new Int16Array(processedData);\n const float32Array = new Float32Array(int16Array.length);\n const NORMALIZATION = 1.0 / 32768.0;\n const length = int16Array.length;\n for (let i = 0; i < length; i++) {\n float32Array[i] = int16Array[i] * NORMALIZATION;\n }\n\n // Create audio buffer with the ACTUAL sample rate of the audio data\n const audioDataSampleRate = this.outputFormat?.sampleRate || this.audioContext.sampleRate;\n const contextSampleRate = this.audioContext.sampleRate;\n \n if (!this.outputFormat?.sampleRate) {\n console.warn('⚠️ AudioPlayer: outputFormat.sampleRate not set! Using AudioContext sample rate:', contextSampleRate);\n } else if (this.scheduledBuffers < 3) {\n console.log(`🎵 AudioPlayer: Creating buffer at ${audioDataSampleRate}Hz (AudioContext: ${contextSampleRate}Hz)`);\n }\n \n const audioBuffer = this.audioContext.createBuffer(\n 1, // mono\n float32Array.length,\n audioDataSampleRate\n );\n\n audioBuffer.getChannelData(0).set(float32Array);\n\n // Schedule playback with seamless timing\n const source = this.audioContext.createBufferSource();\n source.buffer = audioBuffer;\n source.connect(this.audioContext.destination);\n\n // Calculate when to start this chunk\n const currentTime = this.audioContext.currentTime;\n\n // If this is the first chunk or we've fallen behind, start immediately\n if (this.nextStartTime < currentTime) {\n this.nextStartTime = currentTime;\n if (this.scheduledBuffers === 0) {\n console.log('🎵 Starting playback at current time:', currentTime);\n }\n }\n\n // Calculate frame duration - handle browser resampling correctly\n const chunkDuration = audioBuffer.duration;\n const sampleCount = float32Array.length;\n let actualDuration = chunkDuration;\n \n if (contextSampleRate !== audioDataSampleRate) {\n actualDuration = sampleCount / contextSampleRate;\n \n if (this.scheduledBuffers < 3) {\n console.log(`🔄 Resampling detected: ${audioDataSampleRate}Hz → ${contextSampleRate}Hz`);\n console.log(` Buffer duration: ${chunkDuration.toFixed(4)}s, Calculated: ${actualDuration.toFixed(4)}s`);\n }\n }\n \n // Schedule this chunk to start at nextStartTime\n source.start(this.nextStartTime);\n \n // Calculate when the next chunk should start (seamless, no gaps)\n this.nextStartTime += actualDuration;\n \n // Round to prevent floating point accumulation errors\n this.nextStartTime = Math.round(this.nextStartTime * 1000000) / 1000000;\n \n // Log timing for first few chunks (debugging)\n if (this.scheduledBuffers < 3) {\n const startTime = this.nextStartTime - actualDuration;\n console.log(`🎵 AudioPlayer: Scheduled chunk ${this.scheduledBuffers + 1} at ${startTime.toFixed(4)}s, next at ${this.nextStartTime.toFixed(4)}s`);\n console.log(` Duration: ${actualDuration.toFixed(4)}s (${(actualDuration * 1000).toFixed(2)}ms)`);\n }\n\n this.scheduledBuffers++;\n\n // Track when this buffer finishes (for cleanup only, not for scheduling)\n source.onended = () => {\n this.scheduledBuffers--;\n\n // If no more scheduled buffers and queue is empty, playback is complete\n if (this.scheduledBuffers === 0 && this.pcmChunkQueue.length === 0) {\n this.isPlaying = false;\n this.isProcessingPcmQueue = false;\n this.emit('playbackStopped');\n }\n };\n\n if (!this.isPlaying) {\n this.isPlaying = true;\n this.emit('playbackStarted');\n }\n } // end while loop\n\n // All chunks scheduled, reset processing flag\n this.isProcessingPcmQueue = false;\n\n } catch (error) {\n\n console.error('❌ AudioPlayer v2: Error playing chunk:', error);\n\n this.emit('playbackError', error);\n\n this.isProcessingPcmQueue = false;\n\n }\n\n }\n\n \n\n /**\n\n * Create audio blob from binary data\n\n * Detects format and converts to browser-playable WAV\n\n */\n\n createAudioBlob(rawData) {\n\n const bytes = new Uint8Array(rawData);\n\n \n\n console.log(`🎵 AudioPlayer: Processing ${bytes.length} bytes`);\n\n console.log(`🎵 AudioPlayer: Negotiated format:`, this.outputFormat);\n\n \n\n // 1. Check negotiated format first\n // If format says \"raw\", trust that and don't auto-detect WAV\n // Only auto-detect if format is unknown or explicitly says \"wav\"\n \n const isNegotiatedWav = this.outputFormat && \n this.outputFormat.container && \n this.outputFormat.container.toLowerCase() === 'wav';\n \n const isNegotiatedRaw = this.outputFormat && \n this.outputFormat.container && \n this.outputFormat.container.toLowerCase() === 'raw';\n\n // 2. Check if data looks like WAV (for auto-detection when format is unknown or wav)\n const looksLikeWav = this.isWavFile(bytes);\n \n if (looksLikeWav) {\n console.log('🎵 AudioPlayer: Data has WAV header (RIFF)');\n }\n\n // 3. Decision logic:\n // Priority: Negotiated format > Auto-detection\n // BUT: If backend sends WAV when raw was negotiated, process as WAV (with warning)\n // to avoid playback failures\n \n if (isNegotiatedRaw && looksLikeWav) {\n // Backend negotiated \"raw\" but sent WAV - backend is ignoring format request\n console.error('❌ AudioPlayer: CRITICAL MISMATCH!');\n console.error(' Negotiated format: RAW');\n console.error(' Actual data: WAV (RIFF header detected)');\n console.error(' Backend is ignoring format request and sending WAV anyway.');\n console.warn('⚠️ AudioPlayer: Processing as WAV to avoid playback failure, but UI configuration was bypassed.');\n // Process as WAV since that's what we actually received\n return this.handleWavFile(bytes);\n }\n \n if (isNegotiatedRaw && !looksLikeWav) {\n // Negotiated raw and data looks raw - process as raw\n console.log('🎵 AudioPlayer: Processing as RAW data (as negotiated)');\n // Fall through to handleRawData\n } else if (isNegotiatedWav && looksLikeWav) {\n // Negotiated WAV and data is WAV - perfect match\n console.log('✅ AudioPlayer: Processing as WAV file (matches negotiation)');\n return this.handleWavFile(bytes);\n } else if (isNegotiatedWav && !looksLikeWav) {\n // Negotiated WAV but data doesn't look like WAV - warn but try to process as WAV\n console.warn('⚠️ AudioPlayer: Negotiated WAV but data lacks WAV header. Attempting WAV processing anyway.');\n return this.handleWavFile(bytes);\n } else if (!this.outputFormat && looksLikeWav) {\n // No format negotiated, but data looks like WAV - auto-detect\n console.log('🎵 AudioPlayer: No format negotiated, auto-detecting WAV');\n return this.handleWavFile(bytes);\n } else if (!this.outputFormat && !looksLikeWav) {\n // No format negotiated, data doesn't look like WAV - use defaults\n console.warn('⚠️ AudioPlayer: No format negotiated and data not WAV, using defaults');\n this.outputFormat = this.getDefaultFormat();\n }\n \n // 4. Handle raw data based on negotiated format (if we get here)\n\n if (!this.outputFormat) {\n\n console.warn('⚠️ AudioPlayer: No format set, using defaults');\n\n this.outputFormat = this.getDefaultFormat();\n\n }\n\n \n\n console.log('🎵 AudioPlayer: Processing as RAW data with encoding:', this.outputFormat.encoding);\n\n return this.handleRawData(bytes);\n\n }\n\n \n\n /**\n\n * Check if data is a WAV file\n\n */\n\n isWavFile(bytes) {\n\n return bytes.length >= 44 &&\n\n bytes[0] === 0x52 && bytes[1] === 0x49 && // \"RI\"\n\n bytes[2] === 0x46 && bytes[3] === 0x46; // \"FF\"\n\n }\n\n \n\n /**\n\n * Handle WAV file data\n\n */\n\n handleWavFile(bytes) {\n\n const wavInfo = this.parseWavHeader(bytes);\n\n \n\n console.log('🎵 WAV file detected:', {\n\n format: wavInfo.audioFormat,\n\n encoding: this.getEncodingName(wavInfo.audioFormat),\n\n sampleRate: wavInfo.sampleRate,\n\n channels: wavInfo.channels,\n\n bitDepth: wavInfo.bitsPerSample\n\n });\n\n \n\n // PCM WAV (format code 1) - browser can play directly\n\n if (wavInfo.audioFormat === 1) {\n\n console.log('✅ PCM WAV - using directly');\n\n return new Blob([bytes], { type: 'audio/wav' });\n\n }\n\n \n\n // Non-PCM WAV - need to convert to PCM\n\n const codec = this.getCodecForWavFormat(wavInfo.audioFormat);\n\n if (!codec) {\n\n throw new Error(`Unsupported WAV format code: ${wavInfo.audioFormat}`);\n\n }\n\n \n\n console.log('🔄 Non-PCM WAV - converting to PCM WAV');\n\n \n\n // Extract raw audio data (skip 44-byte header)\n\n const rawData = bytes.slice(44);\n\n \n\n // Decode to 16-bit PCM\n\n const pcm16 = codec.decode(rawData);\n\n \n\n // Wrap in new PCM WAV header\n\n const wavHeader = this.createWavHeader(\n\n pcm16.byteLength,\n\n wavInfo.sampleRate,\n\n wavInfo.channels,\n\n 16 // Always decode to 16-bit PCM for browser\n\n );\n\n \n\n return new Blob([wavHeader, pcm16], { type: 'audio/wav' });\n\n }\n\n \n\n /**\n\n * Handle raw audio data (no WAV header)\n\n */\n\n handleRawData(bytes) {\n\n const encoding = this.outputFormat.encoding.toLowerCase();\n\n const codec = this.getCodec(encoding);\n\n \n\n if (!codec) {\n\n throw new Error(`No codec found for encoding: ${encoding}`);\n\n }\n\n \n\n console.log(`🎵 AudioPlayer: Decoding ${encoding.toUpperCase()} to PCM`);\n\n console.log(`🎵 AudioPlayer: Input format - bitDepth: ${this.outputFormat.bitDepth}, sampleRate: ${this.outputFormat.sampleRate}`);\n\n \n\n // Handle PCM data - use native bit depth when possible\n\n let pcmData;\n\n let outputBitDepth;\n\n \n\n if (encoding === 'pcm') {\n\n // Handle PCM data based on bit depth\n const bitDepth = this.outputFormat.bitDepth || 16;\n\n // Check if data length matches expected bit depth\n const expectedBytesPerSample = bitDepth / 8;\n const remainder = bytes.length % expectedBytesPerSample;\n \n if (bitDepth === 24) {\n // Convert 24-bit PCM to 16-bit PCM for browser compatibility\n // TODO: Implement proper 24-bit handling if needed\n console.warn(`⚠️ AudioPlayer: Format says 24-bit PCM, but browser support is limited.`);\n console.warn(` Treating as 16-bit PCM. If audio sounds wrong, backend should send 16-bit instead.`);\n pcmData = this.convert24BitTo16Bit(bytes);\n outputBitDepth = 16;\n } else if (bitDepth === 8) {\n // Convert 8-bit PCM to 16-bit PCM\n console.log(`🔄 AudioPlayer: Converting 8-bit PCM to 16-bit PCM`);\n pcmData = this.convert8BitTo16Bit(bytes);\n outputBitDepth = 16;\n } else {\n // Use PCM data as-is for 16-bit (most common)\n pcmData = bytes.buffer;\n outputBitDepth = bitDepth;\n console.log(`✅ AudioPlayer: Using native ${bitDepth}-bit PCM (no conversion needed)`);\n }\n\n \n\n } else {\n\n // Non-PCM encoding - decode to 16-bit PCM (codecs output 16-bit)\n\n pcmData = codec.decode(bytes);\n\n outputBitDepth = 16;\n\n console.log(`🔄 AudioPlayer: Decoded ${encoding.toUpperCase()} to 16-bit PCM`);\n\n }\n\n \n\n // Wrap in PCM WAV header with correct bit depth\n\n // Modern browsers support 8-bit, 16-bit, and 24-bit WAV files\n\n const wavHeader = this.createWavHeader(\n\n pcmData.byteLength,\n\n this.outputFormat.sampleRate,\n\n this.outputFormat.channels,\n\n outputBitDepth // Use native bit depth\n\n );\n\n \n\n return new Blob([wavHeader, pcmData], { type: 'audio/wav' });\n\n }\n\n \n\n /**\n\n * Convert 24-bit PCM to 16-bit PCM\n\n * @param {Uint8Array} bytes - 24-bit PCM data (3 bytes per sample)\n\n * @returns {ArrayBuffer} - 16-bit PCM data (2 bytes per sample)\n\n */\n\n convert24BitTo16Bit(bytes) {\n\n const samples = Math.floor(bytes.length / 3);\n\n const pcm16 = new Int16Array(samples);\n\n \n\n for (let i = 0; i < samples; i++) {\n\n // Read 24-bit signed integer (little-endian: LSB first)\n // 24-bit PCM: 3 bytes per sample, signed integer\n const byte0 = bytes[i * 3]; // LSB (bits 0-7)\n const byte1 = bytes[i * 3 + 1]; // Middle (bits 8-15)\n const byte2 = bytes[i * 3 + 2]; // MSB (bits 16-23, sign bit is bit 23)\n\n \n\n // Combine bytes to 24-bit value (little-endian)\n // Use bitwise OR to combine, then handle sign extension\n let value24 = byte0 | (byte1 << 8) | ((byte2 & 0xFF) << 16);\n\n \n\n // Convert unsigned 24-bit to signed 32-bit integer\n // If sign bit (bit 23 = byte2 bit 7) is set, sign extend\n if (byte2 & 0x80) {\n\n // Negative: sign extend to 32-bit signed integer\n value24 = value24 | 0xFF000000;\n\n }\n\n \n\n // Convert signed 32-bit integer to signed 16-bit\n // Scale down by dividing by 256 (equivalent to right shift by 8)\n // 24-bit range: -8388608 to 8388607\n // 16-bit range: -32768 to 32767\n // Clamp to prevent overflow\n pcm16[i] = Math.max(-32768, Math.min(32767, Math.round(value24 / 256)));\n\n }\n\n \n\n return pcm16.buffer;\n\n }\n\n \n\n /**\n\n * Convert 8-bit PCM to 16-bit PCM\n\n * @param {Uint8Array} bytes - 8-bit PCM data (1 byte per sample, unsigned 0-255)\n\n * @returns {ArrayBuffer} - 16-bit PCM data (2 bytes per sample)\n\n */\n\n convert8BitTo16Bit(bytes) {\n\n const samples = bytes.length;\n\n const pcm16 = new Int16Array(samples);\n\n \n\n for (let i = 0; i < samples; i++) {\n\n // 8-bit unsigned (0-255) -> 16-bit signed (-32768 to 32767)\n\n // Convert: (value - 128) * 256\n\n const value8 = bytes[i];\n\n pcm16[i] = (value8 - 128) * 256;\n\n }\n\n \n\n return pcm16.buffer;\n\n }\n\n \n\n /**\n\n * Get codec for encoding name\n\n */\n\n getCodec(encoding) {\n\n // Normalize encoding names\n\n const normalized = {\n\n 'pcm': 'pcm',\n\n 'linear': 'pcm',\n\n 'l16': 'pcm',\n\n 'pcmu': 'pcmu',\n\n 'ulaw': 'pcmu',\n\n 'mulaw': 'pcmu',\n\n 'g711u': 'pcmu',\n\n 'pcma': 'pcma',\n\n 'alaw': 'pcma',\n\n 'g711a': 'pcma'\n\n }[encoding.toLowerCase()];\n\n \n\n return this.codecs[normalized];\n\n }\n\n \n\n /**\n\n * Get codec for WAV format code\n\n */\n\n getCodecForWavFormat(audioFormat) {\n\n switch (audioFormat) {\n\n case 1: return this.codecs.pcm; // PCM\n\n case 6: return this.codecs.pcma; // A-law\n\n case 7: return this.codecs.pcmu; // μ-law\n\n default: return null;\n\n }\n\n }\n\n \n\n /**\n\n * Get human-readable encoding name from WAV format code\n\n */\n\n getEncodingName(audioFormat) {\n\n switch (audioFormat) {\n\n case 1: return 'PCM';\n\n case 6: return 'A-law';\n\n case 7: return 'μ-law';\n\n default: return `Unknown (${audioFormat})`;\n\n }\n\n }\n\n \n\n /**\n\n * Parse WAV file header\n\n */\n\n parseWavHeader(bytes) {\n\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n\n \n\n return {\n\n audioFormat: view.getUint16(20, true), // 1=PCM, 6=A-law, 7=μ-law\n\n channels: view.getUint16(22, true),\n\n sampleRate: view.getUint32(24, true),\n\n byteRate: view.getUint32(28, true),\n\n blockAlign: view.getUint16(32, true),\n\n bitsPerSample: view.getUint16(34, true)\n\n };\n\n }\n\n \n\n /**\n\n * Create WAV header\n\n */\n\n createWavHeader(dataLength, sampleRate, numChannels, bitsPerSample) {\n\n const header = new ArrayBuffer(44);\n\n const view = new DataView(header);\n\n \n\n // RIFF header\n\n view.setUint32(0, 0x52494646, false); // \"RIFF\"\n\n view.setUint32(4, 36 + dataLength, true);\n\n view.setUint32(8, 0x57415645, false); // \"WAVE\"\n\n \n\n // fmt chunk\n\n view.setUint32(12, 0x666D7420, false); // \"fmt \"\n\n view.setUint32(16, 16, true); // Subchunk size\n\n view.setUint16(20, 1, true); // Audio format (1 = PCM)\n\n view.setUint16(22, numChannels, true);\n\n view.setUint32(24, sampleRate, true);\n\n view.setUint32(28, sampleRate * numChannels * bitsPerSample / 8, true); // Byte rate\n\n view.setUint16(32, numChannels * bitsPerSample / 8, true); // Block align\n\n view.setUint16(34, bitsPerSample, true);\n\n \n\n // data chunk\n\n view.setUint32(36, 0x64617461, false); // \"data\"\n\n view.setUint32(40, dataLength, true);\n\n \n\n return header;\n\n }\n\n \n\n /**\n /**\n *\n * Initialize audio context with correct sample rate\n *\n */\n initializeAudioContext() {\n // Use negotiated sample rate, but prefer 48kHz to avoid browser resampling\n // Most browsers default to 48kHz, so requesting it avoids resampling overhead\n let desiredSampleRate = this.outputFormat?.sampleRate || 48000;\n \n // If backend sends non-standard rate (like 22050Hz), check if browser supports it\n // If not, prefer 48kHz to avoid resampling issues\n if (desiredSampleRate !== 48000 && desiredSampleRate !== 44100) {\n // For non-standard rates, try to use browser's native rate to avoid resampling\n // This prevents tiny cuts caused by browser resampling\n console.log(`ℹ️ AudioPlayer: Backend requested ${desiredSampleRate}Hz, but browser may resample to 48kHz`);\n console.log(` Consider requesting 48kHz from backend to avoid resampling and improve quality`);\n }\n \n // Check if AudioContext exists and if it matches the desired sample rate\n if (this.audioContext) {\n const currentSampleRate = this.audioContext.sampleRate;\n // If sample rate differs significantly, recreate the AudioContext\n if (Math.abs(currentSampleRate - desiredSampleRate) > 100) {\n console.warn(`⚠️ AudioPlayer: AudioContext sample rate (${currentSampleRate}Hz) doesn't match format (${desiredSampleRate}Hz), recreating...`);\n this.stopImmediate();\n if (this.audioContext.state !== 'closed') {\n this.audioContext.close();\n }\n this.audioContext = null;\n } else {\n // Sample rate matches (or close enough), no need to recreate\n return;\n }\n }\n\n console.log(`🎵 AudioPlayer: Creating AudioContext at ${desiredSampleRate}Hz (from outputFormat: ${this.outputFormat?.sampleRate || 'not set'})`);\n \n try {\n // Try to create with specific sample rate\n this.audioContext = new (window.AudioContext || window.webkitAudioContext)({\n sampleRate: desiredSampleRate,\n latencyHint: 'playback' // ✅ Better for streaming audio - prioritizes smooth playback over low latency\n });\n \n console.log(`✅ AudioContext created at ${this.audioContext.sampleRate}Hz (requested: ${desiredSampleRate}Hz)`);\n \n // ❌ CRITICAL: If browser can't create requested sample rate, we have a problem\n if (Math.abs(this.audioContext.sampleRate - desiredSampleRate) > 100) {\n console.error(`❌ CRITICAL: Browser sample rate mismatch!`);\n console.error(` Requested: ${desiredSampleRate}Hz`);\n console.error(` Got: ${this.audioContext.sampleRate}Hz`);\n console.error(` This WILL cause audio distortion/noise!`);\n console.error(` Solution: Backend should send ${this.audioContext.sampleRate}Hz audio instead`);\n } else if (this.audioContext.sampleRate !== desiredSampleRate) {\n console.warn(`⚠️ Browser adjusted sample rate: ${desiredSampleRate}Hz → ${this.audioContext.sampleRate}Hz`);\n console.warn(` Browser will automatically resample audio.`);\n }\n } catch (error) {\n // Fallback to default if browser doesn't support custom sample rate\n console.error(`❌ Failed to create AudioContext:`, error);\n this.audioContext = new (window.AudioContext || window.webkitAudioContext)();\n console.log(`ℹ️ Using browser default: ${this.audioContext.sampleRate}Hz`);\n }\n }\n\n \n\n /**\n\n *\n\n * Process audio queue\n\n *\n\n */\n\n async processQueue() {\n\n if (this.isProcessingQueue || this.audioQueue.length === 0) {\n\n return;\n\n }\n\n \n\n this.isProcessingQueue = true;\n\n const audioBlob = this.audioQueue.shift();\n\n \n\n if (!audioBlob) {\n\n this.isProcessingQueue = false;\n\n return;\n\n }\n\n \n\n try {\n\n const wasFirstPlay = !this.isPlaying && this.currentSource === null;\n\n \n\n // Initialize audio context if needed\n\n if (!this.audioContext) {\n\n this.initializeAudioContext();\n\n }\n\n \n\n // Resume if suspended\n\n if (this.audioContext.state === 'suspended') {\n\n await this.audioContext.resume();\n\n }\n\n \n\n // Decode audio\n\n const arrayBuffer = await audioBlob.arrayBuffer();\n\n const audioBuffer = await this.audioContext.decodeAudioData(arrayBuffer);\n\n \n\n const shouldEmitStart = wasFirstPlay && !this.isPlaying && this.currentSource === null;\n\n \n\n // Create source\n\n const source = this.audioContext.createBufferSource();\n\n source.buffer = audioBuffer;\n\n source.connect(this.audioContext.destination);\n\n \n\n this.currentSource = source;\n\n this.isPlaying = true;\n\n \n\n // Emit playback started (only on first chunk)\n\n if (shouldEmitStart) {\n\n this.emit('playbackStarted');\n\n }\n\n \n\n // Handle end\n\n source.onended = () => {\n\n this.currentSource = null;\n\n this.isProcessingQueue = false;\n\n \n\n // Process next chunk\n\n if (this.audioQueue.length > 0) {\n\n setTimeout(() => this.processQueue(), 50);\n\n } else {\n\n // No more chunks - stop after delay\n\n setTimeout(() => {\n\n if (this.audioQueue.length === 0 && !this.currentSource) {\n\n this.isPlaying = false;\n\n this.emit('playbackStopped');\n\n }\n\n }, 100);\n\n }\n\n };\n\n \n\n // Start playback\n\n source.start();\n\n \n\n } catch (error) {\n\n console.error('❌ AudioPlayer v2: Error processing queue:', error);\n\n this.currentSource = null;\n\n this.emit('playbackError', error);\n\n \n\n // Try next chunk\n\n if (this.audioQueue.length > 0) {\n\n this.isProcessingQueue = false;\n\n setTimeout(() => this.processQueue(), 100);\n\n } else {\n\n this.isPlaying = false;\n\n this.isProcessingQueue = false;\n\n this.emit('playbackStopped');\n\n }\n\n }\n\n }\n\n \n\n /**\n\n * Stop audio playback immediately\n\n */\n\n stop() {\n\n this.stopImmediate();\n\n }\n\n \n\n /**\n\n * Reset player state and clear queue\n\n */\n\n reset() {\n\n this.stop();\n\n this.audioQueue = [];\n\n this.pcmChunkQueue = [];\n\n }\n\n \n\n /**\n\n * Stop playback and clear queue\n\n */\n\n stopImmediate() {\n\n const wasPlaying = this.isPlaying || this.currentSource !== null || this.scheduledSources.size > 0;\n\n \n\n console.log('🛑 AudioPlayer.stopImmediate() called');\n\n console.log(' isPlaying:', this.isPlaying);\n\n console.log(' currentSource:', this.currentSource !== null);\n\n console.log(' scheduledSources.size:', this.scheduledSources.size);\n\n console.log(' scheduledBuffers:', this.scheduledBuffers);\n\n \n\n // Stop current source (legacy queue-based system)\n\n if (this.currentSource) {\n\n try {\n\n console.log(' Stopping currentSource...');\n\n this.currentSource.stop();\n\n } catch (e) {\n\n // Ignore if already stopped\n\n console.log(' currentSource already stopped or error:', e.message);\n\n }\n\n this.currentSource = null;\n\n }\n\n \n\n // Stop ALL scheduled AudioBufferSource nodes (new lookahead system)\n\n // This is critical for barge-in to work properly\n\n if (this.scheduledSources.size > 0) {\n\n console.log(` Stopping ${this.scheduledSources.size} scheduled sources...`);\n\n let stoppedCount = 0;\n\n for (const source of this.scheduledSources) {\n\n try {\n\n source.stop();\n\n stoppedCount++;\n\n } catch (e) {\n\n // Ignore if already stopped or not started yet\n\n console.log(' Source already stopped or not started:', e.message);\n\n }\n\n }\n\n console.log(` Stopped ${stoppedCount} sources`);\n\n this.scheduledSources.clear();\n\n }\n\n \n\n // Clear state\n\n this.isPlaying = false;\n\n this.isProcessingQueue = false;\n\n this.audioQueue = [];\n\n \n\n // Clear PCM chunk queue and prepared buffer\n\n this.pcmChunkQueue = [];\n\n this.preparedBuffer = [];\n\n this.isProcessingPcmQueue = false;\n\n this.isSchedulingFrames = false;\n\n \n\n // Reset scheduling properties\n\n this.nextStartTime = 0;\n\n this.scheduledBuffers = 0;\n\n \n\n // Emit stopped event - CRITICAL for barge-in\n\n if (wasPlaying) {\n\n console.log('🛑 AudioPlayer: Emitting playbackStopped event (stopImmediate called)');\n\n this.emit('playbackStopped');\n\n }\n\n }\n\n \n\n /**\n\n * Get player status\n\n */\n\n getStatus() {\n\n return {\n\n isPlaying: this.isPlaying,\n\n isProcessingQueue: this.isProcessingQueue,\n\n queueLength: this.audioQueue.length,\n\n audioContextState: this.audioContext ? this.audioContext.state : 'closed',\n\n outputFormat: this.outputFormat,\n\n scheduledBuffers: this.scheduledBuffers,\n\n preparedBufferLength: this.preparedBuffer.length,\n\n scheduledSourcesCount: this.scheduledSources.size\n\n };\n\n }\n\n \n\n /**\n\n * Destroy player and release resources\n\n */\n\n destroy() {\n\n this.stop();\n\n \n\n if (this.audioContext && this.audioContext.state !== 'closed') {\n\n this.audioContext.close();\n\n this.audioContext = null;\n\n }\n\n \n\n this.removeAllListeners();\n\n }\n\n}\n\n\n\nexport default AudioPlayer;\n\n","/**\n * AudioRecorder - Handles audio recording using AudioWorklet\n */\nimport EventEmitter from '../shared/EventEmitter.js';\n\nexport default class AudioRecorder extends EventEmitter {\n constructor(config) {\n super();\n this.config = config;\n this.audioContext = null;\n this.audioWorkletNode = null;\n this.mediaStream = null;\n this.isRecording = false;\n }\n \n /**\n * Get the audio processor path\n * Tries to detect from script source, falls back to config or default\n */\n getAudioProcessorPath() {\n // If explicitly configured, use it\n if (this.config.audioProcessorPath) {\n return this.config.audioProcessorPath;\n }\n \n // Try to find the script that loaded the SDK\n const scripts = document.getElementsByTagName('script');\n for (let script of scripts) {\n const src = script.src;\n // Check if this is the agent-widget.js script\n if (src && (src.includes('agent-widget.js') || src.includes('ttp-agent-sdk'))) {\n // Extract base URL and construct processor path\n try {\n const basePath = src.substring(0, src.lastIndexOf('/'));\n return `${basePath}/audio-processor.js`;\n } catch (e) {\n const basePath = src.substring(0, src.lastIndexOf('/'));\n return `${basePath}/audio-processor.js`;\n }\n }\n }\n \n // Fallback to CDN (update with your actual CDN URL)\n return 'https://cdn.talktopc.com/audio-processor.js';\n }\n \n /**\n * Start audio recording\n */\n async start() {\n try {\n // Get user media\n this.mediaStream = await navigator.mediaDevices.getUserMedia({\n audio: {\n sampleRate: this.config.sampleRate,\n channelCount: 1,\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true\n }\n });\n \n // Create AudioContext\n this.audioContext = new (window.AudioContext || window.webkitAudioContext)({\n sampleRate: this.config.sampleRate\n });\n \n // Resume AudioContext if suspended\n if (this.audioContext.state === 'suspended') {\n await this.audioContext.resume();\n }\n \n // Get the audio processor path\n const processorPath = this.getAudioProcessorPath();\n \n // Load AudioWorklet module\n await this.audioContext.audioWorklet.addModule(processorPath);\n \n // Create AudioWorklet node\n this.audioWorkletNode = new AudioWorkletNode(this.audioContext, 'audio-processor');\n \n // Create media stream source\n const source = this.audioContext.createMediaStreamSource(this.mediaStream);\n source.connect(this.audioWorkletNode);\n \n // Handle messages from AudioWorklet\n this.audioWorkletNode.port.onmessage = (event) => {\n const { type, data } = event.data;\n \n if (type === 'pcm_audio_data') {\n this.emit('audioData', data);\n }\n };\n \n // Enable continuous mode\n this.audioWorkletNode.port.postMessage({\n type: 'setForceContinuous',\n data: { enabled: true }\n });\n \n this.isRecording = true;\n this.emit('recordingStarted');\n \n } catch (error) {\n this.emit('error', error);\n throw error;\n }\n }\n \n /**\n * Stop audio recording\n */\n async stop() {\n if (!this.isRecording) {\n return;\n }\n \n try {\n // Flush any remaining audio data\n if (this.audioWorkletNode) {\n this.audioWorkletNode.port.postMessage({ type: 'flush' });\n await new Promise(resolve => setTimeout(resolve, 100));\n }\n \n // Disconnect and cleanup\n if (this.mediaStream) {\n this.mediaStream.getTracks().forEach(track => track.stop());\n this.mediaStream = null;\n }\n \n if (this.audioContext && this.audioContext.state !== 'closed') {\n await this.audioContext.close();\n this.audioContext = null;\n }\n \n this.audioWorkletNode = null;\n this.isRecording = false;\n this.emit('recordingStopped');\n \n } catch (error) {\n this.emit('error', error);\n throw error;\n }\n }\n \n /**\n * Get recording status\n */\n getStatus() {\n return {\n isRecording: this.isRecording,\n audioContextState: this.audioContext ? this.audioContext.state : 'closed'\n };\n }\n \n /**\n * Cleanup resources\n */\n destroy() {\n this.stop();\n }\n}\n","// src/v2/utils/converters/ContainerConverter.js\n\n/**\n * Container Converter - Handles WAV ↔ Raw conversion\n * \n * Responsibilities:\n * - Extract PCM from WAV (parse header, extract data chunk)\n * - Wrap PCM in WAV header (create standard WAV file)\n */\nclass ContainerConverter {\n /**\n * Extract raw PCM from WAV file\n * @param {ArrayBuffer|Uint8Array} wavData - WAV file data\n * @returns {Object} - { pcmData: ArrayBuffer, format: { sampleRate, channels, bitDepth } }\n */\n static extractPcmFromWav(wavData) {\n const bytes = wavData instanceof Uint8Array ? wavData : new Uint8Array(wavData);\n \n if (bytes.length < 44) {\n throw new Error('WAV data too short (< 44 bytes)');\n }\n \n // Verify RIFF header\n const riff = String.fromCharCode(bytes[0], bytes[1], bytes[2], bytes[3]);\n if (riff !== 'RIFF') {\n throw new Error('Not a valid WAV file - missing RIFF header');\n }\n \n // Verify WAVE format\n const wave = String.fromCharCode(bytes[8], bytes[9], bytes[10], bytes[11]);\n if (wave !== 'WAVE') {\n throw new Error('Not a valid WAV file - missing WAVE format');\n }\n \n // Parse format chunk (little-endian)\n const channels = bytes[22] | (bytes[23] << 8);\n const sampleRate = bytes[24] | (bytes[25] << 8) | (bytes[26] << 16) | (bytes[27] << 24);\n const bitDepth = bytes[34] | (bytes[35] << 8);\n \n // Find \"data\" chunk\n let dataChunkStart = -1;\n for (let i = 12; i < bytes.length - 8; i += 4) {\n const chunkId = String.fromCharCode(bytes[i], bytes[i + 1], bytes[i + 2], bytes[i + 3]);\n if (chunkId === 'data') {\n dataChunkStart = i;\n break;\n }\n // Skip this chunk\n const chunkSize = bytes[i + 4] | (bytes[i + 5] << 8) | (bytes[i + 6] << 16) | (bytes[i + 7] << 24);\n i += 4 + chunkSize; // Skip chunk header + data\n }\n \n if (dataChunkStart === -1) {\n throw new Error('No data chunk found in WAV');\n }\n \n // Read data chunk size\n const dataSize = bytes[dataChunkStart + 4] | \n (bytes[dataChunkStart + 5] << 8) | \n (bytes[dataChunkStart + 6] << 16) | \n (bytes[dataChunkStart + 7] << 24);\n \n // Extract PCM data\n const dataStart = dataChunkStart + 8;\n const actualDataSize = Math.min(dataSize, bytes.length - dataStart);\n \n const pcmData = bytes.slice(dataStart, dataStart + actualDataSize);\n \n return {\n pcmData: pcmData.buffer,\n format: {\n sampleRate,\n channels,\n bitDepth\n }\n };\n }\n \n /**\n * Check if data is a WAV file\n * @param {Uint8Array} bytes - Data to check\n * @returns {boolean} - True if WAV file\n */\n static isWavFile(bytes) {\n return bytes.length >= 44 &&\n bytes[0] === 0x52 && bytes[1] === 0x49 && // \"RI\"\n bytes[2] === 0x46 && bytes[3] === 0x46; // \"FF\"\n }\n \n /**\n * Create WAV header\n * @param {number} dataLength - Length of PCM data in bytes\n * @param {number} sampleRate - Sample rate in Hz\n * @param {number} numChannels - Number of channels (1 = mono)\n * @param {number} bitsPerSample - Bit depth (8, 16, 24)\n * @returns {ArrayBuffer} - 44-byte WAV header\n */\n static createWavHeader(dataLength, sampleRate, numChannels, bitsPerSample) {\n const header = new ArrayBuffer(44);\n const view = new DataView(header);\n \n // RIFF header\n view.setUint32(0, 0x52494646, false); // \"RIFF\"\n view.setUint32(4, 36 + dataLength, true);\n view.setUint32(8, 0x57415645, false); // \"WAVE\"\n \n // fmt chunk\n view.setUint32(12, 0x666D7420, false); // \"fmt \"\n view.setUint32(16, 16, true); // Subchunk size\n view.setUint16(20, 1, true); // Audio format (1 = PCM)\n view.setUint16(22, numChannels, true);\n view.setUint32(24, sampleRate, true);\n view.setUint32(28, sampleRate * numChannels * bitsPerSample / 8, true); // Byte rate\n view.setUint16(32, numChannels * bitsPerSample / 8, true); // Block align\n view.setUint16(34, bitsPerSample, true);\n \n // data chunk\n view.setUint32(36, 0x64617461, false); // \"data\"\n view.setUint32(40, dataLength, true);\n \n return header;\n }\n \n /**\n * Wrap PCM data in WAV container\n * @param {ArrayBuffer} pcmData - Raw PCM audio data\n * @param {Object} format - Audio format { sampleRate, channels, bitDepth }\n * @returns {ArrayBuffer} - WAV file data\n */\n static wrapPcmInWav(pcmData, format) {\n const header = ContainerConverter.createWavHeader(\n pcmData.byteLength,\n format.sampleRate,\n format.channels || 1,\n format.bitDepth || 16\n );\n \n // Combine header + data\n const wavFile = new Uint8Array(header.byteLength + pcmData.byteLength);\n wavFile.set(new Uint8Array(header), 0);\n wavFile.set(new Uint8Array(pcmData), header.byteLength);\n \n return wavFile.buffer;\n }\n}\n\nexport default ContainerConverter;\n\n\n\n\n","// src/v2/utils/converters/EncodingConverter.js\n\nimport PCMCodec from '../../codecs/PCMCodec.js';\nimport PCMUCodec from '../../codecs/PCMUCodec.js';\nimport PCMACodec from '../../codecs/PCMACodec.js';\n\n/**\n * Encoding Converter - Handles PCM ↔ PCMU ↔ PCMA conversion\n * \n * All conversions are FROM PCM (PCM is the universal intermediate format)\n */\nclass EncodingConverter {\n constructor() {\n this.codecs = {\n pcm: new PCMCodec(),\n pcmu: new PCMUCodec(),\n pcma: new PCMACodec()\n };\n }\n \n /**\n * Decode encoded audio to PCM\n * @param {ArrayBuffer|Uint8Array} encodedData - Encoded audio (PCMU/PCMA)\n * @param {string} encoding - Source encoding ('pcm', 'pcmu', 'pcma')\n * @returns {ArrayBuffer} - 16-bit PCM audio data\n */\n decodeToPcm(encodedData, encoding) {\n const normalizedEncoding = encoding?.toLowerCase();\n \n if (!normalizedEncoding || normalizedEncoding === 'pcm') {\n // Already PCM, return as-is\n if (encodedData instanceof ArrayBuffer) {\n return encodedData;\n }\n if (encodedData instanceof Uint8Array) {\n return encodedData.buffer;\n }\n return encodedData;\n }\n \n const codec = this.codecs[normalizedEncoding];\n if (!codec) {\n throw new Error(`Unsupported encoding: ${encoding}`);\n }\n \n const input = encodedData instanceof Uint8Array ? \n encodedData : \n new Uint8Array(encodedData);\n \n return codec.decode(input);\n }\n \n /**\n * Encode PCM to target encoding\n * @param {ArrayBuffer} pcmData - 16-bit PCM audio data\n * @param {string} targetEncoding - Target encoding ('pcm', 'pcmu', 'pcma')\n * @returns {ArrayBuffer|Uint8Array} - Encoded audio data\n */\n encodeFromPcm(pcmData, targetEncoding) {\n const normalizedEncoding = targetEncoding?.toLowerCase();\n \n if (!normalizedEncoding || normalizedEncoding === 'pcm') {\n // Target is PCM, return as-is\n return pcmData;\n }\n \n const codec = this.codecs[normalizedEncoding];\n if (!codec) {\n throw new Error(`Unsupported target encoding: ${targetEncoding}`);\n }\n \n const encoded = codec.encode(pcmData);\n \n // Return as ArrayBuffer for consistency\n if (encoded instanceof Uint8Array) {\n return encoded.buffer;\n }\n \n return encoded;\n }\n \n /**\n * Get codec for encoding\n * @param {string} encoding - Encoding name\n * @returns {Object|null} - Codec instance or null\n */\n getCodec(encoding) {\n const normalized = encoding?.toLowerCase();\n return this.codecs[normalized] || null;\n }\n}\n\nexport default EncodingConverter;\n\n\n","// src/v2/utils/converters/BitDepthConverter.js\n\n/**\n * Bit Depth Converter - Handles bit depth conversion FROM PCM\n * \n * Note: Source is NEVER 8-bit (only 16-bit or 24-bit)\n * All conversions are FROM PCM\n */\nclass BitDepthConverter {\n /**\n * Convert PCM from one bit depth to another\n * @param {ArrayBuffer} pcmData - Input PCM data\n * @param {number} inputBitDepth - Input bit depth (16 or 24, never 8)\n * @param {number} outputBitDepth - Output bit depth (8, 16, or 24)\n * @returns {ArrayBuffer} - Converted PCM data\n */\n static convert(pcmData, inputBitDepth, outputBitDepth) {\n if (inputBitDepth === outputBitDepth) {\n return pcmData; // No conversion needed\n }\n \n if (inputBitDepth === 8) {\n throw new Error('Source bit depth cannot be 8-bit (only 16-bit or 24-bit supported)');\n }\n \n const inputBytesPerSample = inputBitDepth / 8;\n const outputBytesPerSample = outputBitDepth / 8;\n const numSamples = pcmData.byteLength / inputBytesPerSample;\n \n const outputData = new ArrayBuffer(numSamples * outputBytesPerSample);\n \n if (inputBitDepth === 16 && outputBitDepth === 16) {\n // No conversion\n return pcmData;\n } else if (inputBitDepth === 24 && outputBitDepth === 16) {\n // 24-bit → 16-bit: Scale down\n return BitDepthConverter.convert24To16(pcmData);\n } else if (inputBitDepth === 16 && outputBitDepth === 24) {\n // 16-bit → 24-bit: Scale up\n return BitDepthConverter.convert16To24(pcmData);\n } else if (inputBitDepth === 16 && outputBitDepth === 8) {\n // 16-bit → 8-bit: Scale down (rare)\n return BitDepthConverter.convert16To8(pcmData);\n } else if (inputBitDepth === 24 && outputBitDepth === 8) {\n // 24-bit → 8-bit: Scale down (rare)\n return BitDepthConverter.convert24To8(pcmData);\n } else {\n throw new Error(`Unsupported bit depth conversion: ${inputBitDepth}-bit → ${outputBitDepth}-bit`);\n }\n }\n \n /**\n * Convert 24-bit PCM to 16-bit PCM\n * @param {ArrayBuffer} pcm24Data - 24-bit PCM data\n * @returns {ArrayBuffer} - 16-bit PCM data\n */\n static convert24To16(pcm24Data) {\n const bytes = new Uint8Array(pcm24Data);\n const samples = Math.floor(bytes.length / 3);\n const pcm16 = new Int16Array(samples);\n \n for (let i = 0; i < samples; i++) {\n // Read 24-bit signed integer (little-endian)\n const byte0 = bytes[i * 3]; // LSB\n const byte1 = bytes[i * 3 + 1]; // Middle\n const byte2 = bytes[i * 3 + 2]; // MSB (sign bit)\n \n // Combine bytes to 24-bit value\n let value24 = byte0 | (byte1 << 8) | ((byte2 & 0xFF) << 16);\n \n // Sign extend if negative\n if (byte2 & 0x80) {\n value24 = value24 | 0xFF000000;\n }\n \n // Scale down to 16-bit (divide by 256)\n pcm16[i] = Math.max(-32768, Math.min(32767, Math.round(value24 / 256)));\n }\n \n return pcm16.buffer;\n }\n \n /**\n * Convert 16-bit PCM to 24-bit PCM\n * @param {ArrayBuffer} pcm16Data - 16-bit PCM data\n * @returns {ArrayBuffer} - 24-bit PCM data\n */\n static convert16To24(pcm16Data) {\n const pcm16 = new Int16Array(pcm16Data);\n const pcm24 = new Uint8Array(pcm16.length * 3);\n \n for (let i = 0; i < pcm16.length; i++) {\n const value = pcm16[i];\n // Scale up to 24-bit (multiply by 256)\n const value24 = value * 256;\n \n // Write as little-endian 24-bit\n pcm24[i * 3] = value24 & 0xFF;\n pcm24[i * 3 + 1] = (value24 >> 8) & 0xFF;\n pcm24[i * 3 + 2] = (value24 >> 16) & 0xFF;\n }\n \n return pcm24.buffer;\n }\n \n /**\n * Convert 16-bit PCM to 8-bit PCM\n * @param {ArrayBuffer} pcm16Data - 16-bit PCM data\n * @returns {ArrayBuffer} - 8-bit PCM data\n */\n static convert16To8(pcm16Data) {\n const pcm16 = new Int16Array(pcm16Data);\n const pcm8 = new Uint8Array(pcm16.length);\n \n for (let i = 0; i < pcm16.length; i++) {\n // 16-bit signed (-32768 to 32767) → 8-bit unsigned (0 to 255)\n const value = pcm16[i];\n pcm8[i] = Math.max(0, Math.min(255, Math.round((value / 256) + 128)));\n }\n \n return pcm8.buffer;\n }\n \n /**\n * Convert 24-bit PCM to 8-bit PCM\n * @param {ArrayBuffer} pcm24Data - 24-bit PCM data\n * @returns {ArrayBuffer} - 8-bit PCM data\n */\n static convert24To8(pcm24Data) {\n // First convert to 16-bit, then to 8-bit\n const pcm16 = BitDepthConverter.convert24To16(pcm24Data);\n return BitDepthConverter.convert16To8(pcm16);\n }\n}\n\nexport default BitDepthConverter;\n\n\n\n\n","// src/v2/utils/converters/SampleRateConverter.js\n\n/**\n * Sample Rate Converter - Handles resampling FROM PCM\n * \n * Uses Web Audio API OfflineAudioContext for high-quality resampling\n */\nclass SampleRateConverter {\n /**\n * Resample PCM audio to target sample rate\n * @param {ArrayBuffer} pcmData - Input PCM data (16-bit)\n * @param {number} inputSampleRate - Input sample rate in Hz\n * @param {number} outputSampleRate - Output sample rate in Hz\n * @returns {Promise<ArrayBuffer>} - Resampled PCM data\n */\n static async resample(pcmData, inputSampleRate, outputSampleRate) {\n if (inputSampleRate === outputSampleRate) {\n return pcmData; // No resampling needed\n }\n \n // Convert Int16 PCM to Float32 for Web Audio API\n const int16Array = new Int16Array(pcmData);\n const float32Array = new Float32Array(int16Array.length);\n const NORMALIZATION = 1.0 / 32768.0;\n \n for (let i = 0; i < int16Array.length; i++) {\n float32Array[i] = int16Array[i] * NORMALIZATION;\n }\n \n // Create offline audio context for resampling\n const outputLength = Math.ceil(float32Array.length * outputSampleRate / inputSampleRate);\n const offlineContext = new OfflineAudioContext(\n 1, // mono\n outputLength,\n outputSampleRate\n );\n \n // Create buffer with input sample rate\n const inputBuffer = offlineContext.createBuffer(\n 1, // mono\n float32Array.length,\n inputSampleRate\n );\n \n inputBuffer.getChannelData(0).set(float32Array);\n \n // Create source and connect\n const source = offlineContext.createBufferSource();\n source.buffer = inputBuffer;\n source.connect(offlineContext.destination);\n source.start();\n \n // Render to get resampled audio\n const resampledBuffer = await offlineContext.startRendering();\n const resampledFloat32 = resampledBuffer.getChannelData(0);\n \n // Convert Float32 back to Int16 PCM\n const resampledInt16 = new Int16Array(resampledFloat32.length);\n for (let i = 0; i < resampledFloat32.length; i++) {\n const sample = Math.max(-1, Math.min(1, resampledFloat32[i]));\n resampledInt16[i] = Math.round(sample * 32767);\n }\n \n return resampledInt16.buffer;\n }\n}\n\nexport default SampleRateConverter;\n\n\n\n\n","// src/v2/utils/converters/ChannelConverter.js\n\n/**\n * Channel Converter - Handles channel conversion FROM PCM\n * \n * Currently only supports mono (1 channel), but prepared for future stereo support\n */\nclass ChannelConverter {\n /**\n * Convert PCM channels\n * @param {ArrayBuffer} pcmData - Input PCM data\n * @param {number} inputChannels - Input channel count\n * @param {number} outputChannels - Output channel count\n * @param {number} bitDepth - Bit depth (16 or 24)\n * @returns {ArrayBuffer} - Converted PCM data\n */\n static convert(pcmData, inputChannels, outputChannels, bitDepth = 16) {\n if (inputChannels === outputChannels) {\n return pcmData; // No conversion needed\n }\n \n if (inputChannels === 1 && outputChannels === 1) {\n return pcmData; // Already mono\n }\n \n if (inputChannels === 1 && outputChannels === 2) {\n // Mono → Stereo: Duplicate channel\n return ChannelConverter.monoToStereo(pcmData, bitDepth);\n }\n \n if (inputChannels === 2 && outputChannels === 1) {\n // Stereo → Mono: Average channels\n return ChannelConverter.stereoToMono(pcmData, bitDepth);\n }\n \n throw new Error(`Unsupported channel conversion: ${inputChannels} → ${outputChannels}`);\n }\n \n /**\n * Convert mono to stereo (duplicate channel)\n * @param {ArrayBuffer} monoData - Mono PCM data\n * @param {number} bitDepth - Bit depth\n * @returns {ArrayBuffer} - Stereo PCM data\n */\n static monoToStereo(monoData, bitDepth) {\n const bytesPerSample = bitDepth / 8;\n const numSamples = monoData.byteLength / bytesPerSample;\n const stereoData = new ArrayBuffer(numSamples * bytesPerSample * 2);\n \n const input = new Uint8Array(monoData);\n const output = new Uint8Array(stereoData);\n \n for (let i = 0; i < numSamples; i++) {\n const inputOffset = i * bytesPerSample;\n const outputOffset = i * bytesPerSample * 2;\n \n // Copy sample to both left and right channels\n for (let j = 0; j < bytesPerSample; j++) {\n output[outputOffset + j] = input[inputOffset + j]; // Left\n output[outputOffset + bytesPerSample + j] = input[inputOffset + j]; // Right\n }\n }\n \n return stereoData;\n }\n \n /**\n * Convert stereo to mono (average channels)\n * @param {ArrayBuffer} stereoData - Stereo PCM data\n * @param {number} bitDepth - Bit depth\n * @returns {ArrayBuffer} - Mono PCM data\n */\n static stereoToMono(stereoData, bitDepth) {\n const bytesPerSample = bitDepth / 8;\n const numSamples = stereoData.byteLength / (bytesPerSample * 2);\n const monoData = new ArrayBuffer(numSamples * bytesPerSample);\n \n const input = new Uint8Array(stereoData);\n const output = new Uint8Array(monoData);\n \n if (bitDepth === 16) {\n // 16-bit: Average samples\n for (let i = 0; i < numSamples; i++) {\n const leftOffset = i * bytesPerSample * 2;\n const rightOffset = leftOffset + bytesPerSample;\n \n const left = (input[leftOffset] | (input[leftOffset + 1] << 8)) << 16 >> 16; // Sign extend\n const right = (input[rightOffset] | (input[rightOffset + 1] << 8)) << 16 >> 16;\n \n const mono = Math.round((left + right) / 2);\n \n const outputOffset = i * bytesPerSample;\n output[outputOffset] = mono & 0xFF;\n output[outputOffset + 1] = (mono >> 8) & 0xFF;\n }\n } else {\n // For other bit depths, just take left channel\n for (let i = 0; i < numSamples; i++) {\n const inputOffset = i * bytesPerSample * 2;\n const outputOffset = i * bytesPerSample;\n \n for (let j = 0; j < bytesPerSample; j++) {\n output[outputOffset + j] = input[inputOffset + j];\n }\n }\n }\n \n return monoData;\n }\n}\n\nexport default ChannelConverter;\n\n\n\n\n","// src/v2/utils/AudioFormatConverter.js\n\nimport ContainerConverter from './converters/ContainerConverter.js';\nimport EncodingConverter from './converters/EncodingConverter.js';\nimport BitDepthConverter from './converters/BitDepthConverter.js';\nimport SampleRateConverter from './converters/SampleRateConverter.js';\nimport ChannelConverter from './converters/ChannelConverter.js';\n\n/**\n * Audio Format Converter - Converts audio from backend format to requested format\n * \n * All conversions start FROM PCM (PCM is the universal intermediate format)\n * \n * @example\n * const converter = new AudioFormatConverter(requestedFormat, actualFormat);\n * if (converter.needsConversion()) {\n * const converted = await converter.convert(audioData);\n * }\n */\nclass AudioFormatConverter {\n /**\n * @param {Object} requestedFormat - What user wants\n * @param {string} requestedFormat.container - 'raw' or 'wav'\n * @param {string} requestedFormat.encoding - 'pcm', 'pcmu', 'pcma'\n * @param {number} requestedFormat.sampleRate - Sample rate in Hz\n * @param {number} requestedFormat.bitDepth - Bit depth (8, 16, 24)\n * @param {number} requestedFormat.channels - Number of channels (1 = mono)\n * \n * @param {Object} actualFormat - What backend is sending\n * @param {string} actualFormat.container - 'raw' or 'wav'\n * @param {string} actualFormat.encoding - 'pcm', 'pcmu', 'pcma'\n * @param {number} actualFormat.sampleRate - Sample rate in Hz\n * @param {number} actualFormat.bitDepth - Bit depth (16 or 24, never 8)\n * @param {number} actualFormat.channels - Number of channels (1 = mono)\n */\n constructor(requestedFormat, actualFormat) {\n this.requestedFormat = requestedFormat;\n this.actualFormat = actualFormat;\n this.encodingConverter = new EncodingConverter();\n this.conversionSteps = [];\n \n // Analyze what conversions are needed\n this._analyzeConversions();\n }\n \n /**\n * Analyze what conversions are needed\n * @private\n */\n _analyzeConversions() {\n this.conversionSteps = [];\n \n // Check container\n if (this.actualFormat.container !== this.requestedFormat.container) {\n if (this.actualFormat.container === 'wav') {\n this.conversionSteps.push('extract_wav');\n } else if (this.requestedFormat.container === 'wav') {\n this.conversionSteps.push('wrap_wav');\n }\n }\n \n // Check encoding\n if (this.actualFormat.encoding !== this.requestedFormat.encoding) {\n if (this.actualFormat.encoding !== 'pcm') {\n this.conversionSteps.push('decode_encoding');\n }\n if (this.requestedFormat.encoding !== 'pcm') {\n this.conversionSteps.push('encode_encoding');\n }\n }\n \n // Check sample rate\n if (this.actualFormat.sampleRate !== this.requestedFormat.sampleRate) {\n this.conversionSteps.push('resample');\n }\n \n // Check bit depth\n if (this.actualFormat.bitDepth !== this.requestedFormat.bitDepth) {\n this.conversionSteps.push('convert_bitdepth');\n }\n \n // Check channels\n if (this.actualFormat.channels !== this.requestedFormat.channels) {\n this.conversionSteps.push('convert_channels');\n }\n }\n \n /**\n * Check if conversion is needed\n * @returns {boolean} - True if formats differ\n */\n needsConversion() {\n return this.conversionSteps.length > 0;\n }\n \n /**\n * Get conversion steps as human-readable array\n * @returns {string[]} - Array of conversion step descriptions\n */\n getConversionSteps() {\n const steps = [];\n \n if (this.conversionSteps.includes('extract_wav')) {\n steps.push(`Extract PCM from WAV (${this.actualFormat.container} → raw)`);\n }\n \n if (this.conversionSteps.includes('decode_encoding')) {\n steps.push(`Decode ${this.actualFormat.encoding.toUpperCase()} → PCM`);\n }\n \n if (this.conversionSteps.includes('resample')) {\n steps.push(`Resample ${this.actualFormat.sampleRate}Hz → ${this.requestedFormat.sampleRate}Hz`);\n }\n \n if (this.conversionSteps.includes('convert_bitdepth')) {\n steps.push(`Convert bit depth ${this.actualFormat.bitDepth}-bit → ${this.requestedFormat.bitDepth}-bit`);\n }\n \n if (this.conversionSteps.includes('convert_channels')) {\n steps.push(`Convert channels ${this.actualFormat.channels} → ${this.requestedFormat.channels}`);\n }\n \n if (this.conversionSteps.includes('encode_encoding')) {\n steps.push(`Encode PCM → ${this.requestedFormat.encoding.toUpperCase()}`);\n }\n \n if (this.conversionSteps.includes('wrap_wav')) {\n steps.push(`Wrap in WAV container (raw → ${this.requestedFormat.container})`);\n }\n \n return steps;\n }\n \n /**\n * Convert audio data from actual format to requested format\n * @param {ArrayBuffer|Uint8Array} audioData - Input audio data\n * @returns {Promise<ArrayBuffer>} - Converted audio data\n */\n async convert(audioData) {\n if (!this.needsConversion()) {\n return audioData instanceof ArrayBuffer ? audioData : audioData.buffer;\n }\n \n let currentData = audioData instanceof ArrayBuffer ? audioData : audioData.buffer;\n let currentFormat = { ...this.actualFormat };\n \n // Step 1: Extract PCM from WAV if needed\n if (this.conversionSteps.includes('extract_wav')) {\n const extracted = ContainerConverter.extractPcmFromWav(currentData);\n currentData = extracted.pcmData;\n // Update format from WAV header\n currentFormat = {\n ...currentFormat,\n container: 'raw',\n sampleRate: extracted.format.sampleRate,\n channels: extracted.format.channels,\n bitDepth: extracted.format.bitDepth\n };\n console.log('🔄 AudioFormatConverter: Extracted PCM from WAV', extracted.format);\n }\n \n // Step 2: Decode to PCM if needed (PCMU/PCMA → PCM)\n if (this.conversionSteps.includes('decode_encoding')) {\n currentData = this.encodingConverter.decodeToPcm(currentData, currentFormat.encoding);\n currentFormat.encoding = 'pcm';\n currentFormat.bitDepth = 16; // Decoded to 16-bit PCM\n console.log(`🔄 AudioFormatConverter: Decoded ${this.actualFormat.encoding.toUpperCase()} → PCM`);\n }\n \n // Step 3: Normalize to 16-bit PCM if 24-bit (for processing)\n if (currentFormat.bitDepth === 24 && currentFormat.bitDepth !== this.requestedFormat.bitDepth) {\n // Only normalize if we need to process it (resample, etc.)\n if (this.conversionSteps.includes('resample') || \n this.conversionSteps.includes('convert_channels') ||\n (this.requestedFormat.bitDepth !== 24)) {\n currentData = BitDepthConverter.convert(currentData, 24, 16);\n currentFormat.bitDepth = 16;\n console.log('🔄 AudioFormatConverter: Normalized 24-bit → 16-bit PCM');\n }\n }\n \n // Step 4: Resample if needed (FROM PCM)\n if (this.conversionSteps.includes('resample')) {\n currentData = await SampleRateConverter.resample(\n currentData,\n currentFormat.sampleRate,\n this.requestedFormat.sampleRate\n );\n currentFormat.sampleRate = this.requestedFormat.sampleRate;\n console.log(`🔄 AudioFormatConverter: Resampled ${this.actualFormat.sampleRate}Hz → ${this.requestedFormat.sampleRate}Hz`);\n }\n \n // Step 5: Convert channels if needed (FROM PCM)\n if (this.conversionSteps.includes('convert_channels')) {\n currentData = ChannelConverter.convert(\n currentData,\n currentFormat.channels,\n this.requestedFormat.channels,\n currentFormat.bitDepth\n );\n currentFormat.channels = this.requestedFormat.channels;\n console.log(`🔄 AudioFormatConverter: Converted channels ${this.actualFormat.channels} → ${this.requestedFormat.channels}`);\n }\n \n // Step 6: Convert bit depth if needed (FROM PCM)\n if (this.conversionSteps.includes('convert_bitdepth')) {\n currentData = BitDepthConverter.convert(\n currentData,\n currentFormat.bitDepth,\n this.requestedFormat.bitDepth\n );\n currentFormat.bitDepth = this.requestedFormat.bitDepth;\n console.log(`🔄 AudioFormatConverter: Converted bit depth ${this.actualFormat.bitDepth}-bit → ${this.requestedFormat.bitDepth}-bit`);\n }\n \n // Step 7: Encode to target encoding if needed (FROM PCM)\n if (this.conversionSteps.includes('encode_encoding')) {\n const encoded = this.encodingConverter.encodeFromPcm(currentData, this.requestedFormat.encoding);\n currentData = encoded instanceof ArrayBuffer ? encoded : encoded.buffer;\n currentFormat.encoding = this.requestedFormat.encoding;\n console.log(`🔄 AudioFormatConverter: Encoded PCM → ${this.requestedFormat.encoding.toUpperCase()}`);\n }\n \n // Step 8: Wrap in WAV container if needed\n if (this.conversionSteps.includes('wrap_wav')) {\n currentData = ContainerConverter.wrapPcmInWav(currentData, currentFormat);\n currentFormat.container = 'wav';\n console.log('🔄 AudioFormatConverter: Wrapped in WAV container');\n }\n \n console.log('✅ AudioFormatConverter: Conversion complete');\n return currentData;\n }\n}\n\nexport default AudioFormatConverter;\n\n\n\n\n","// src/v2/VoiceSDK.js\n\nimport EventEmitter from '../shared/EventEmitter.js';\n\nimport AudioPlayer from './AudioPlayer.js';\n\nimport AudioRecorder from '../v1/AudioRecorder.js';\n\nimport AudioFormatConverter from './utils/AudioFormatConverter.js';\n\n\n\n/**\n\n * VoiceSDK v2 - Multi-codec speech-to-speech SDK\n\n * \n\n * Features:\n\n * - Format negotiation with backend\n\n * - Support for PCM, PCMU (μ-law), PCMA (A-law)\n\n * - Support for WAV and raw audio containers\n\n * - Backward compatible with v1 protocol\n\n * \n\n * Events:\n\n * - 'connected' - WebSocket connected\n\n * - 'disconnected' - WebSocket disconnected\n\n * - 'formatNegotiated' - Audio format confirmed by server\n\n * - 'recordingStarted' - Recording started\n\n * - 'recordingStopped' - Recording stopped\n\n * - 'playbackStarted' - Audio playback started\n\n * - 'playbackStopped' - Audio playback stopped\n\n * - 'error' - Error occurred\n\n * - 'message' - Text message from server\n\n */\n\nclass VoiceSDK_v2 extends EventEmitter {\n\n // Supported INPUT audio format configurations (matching backend validation)\n\n static SUPPORTED_INPUT_ENCODINGS = ['pcm', 'pcmu', 'pcma'];\n\n static SUPPORTED_INPUT_SAMPLE_RATES = [8000, 16000, 24000, 48000];\n\n static SUPPORTED_INPUT_BIT_DEPTHS = [8, 16, 24];\n\n static SUPPORTED_INPUT_CHANNELS = [1];\n\n \n\n // Supported OUTPUT audio format configurations (matching backend validation)\n\n static SUPPORTED_OUTPUT_ENCODINGS = ['pcm', 'pcmu', 'pcma'];\n\n static SUPPORTED_OUTPUT_SAMPLE_RATES = [8000, 16000, 22050, 24000, 44100, 48000];\n\n static SUPPORTED_OUTPUT_BIT_DEPTHS = [8, 16, 24];\n\n static SUPPORTED_OUTPUT_CHANNELS = [1];\n\n static SUPPORTED_OUTPUT_CONTAINERS = ['raw', 'wav'];\n\n \n\n constructor(config = {}) {\n\n super();\n\n \n\n this.version = '2.0.0';\n\n \n\n this.config = {\n\n // Connection\n\n websocketUrl: config.websocketUrl || 'wss://speech.talktopc.com/ws/conv',\n\n agentId: config.agentId,\n\n appId: config.appId,\n\n \n\n // Input format (what we send to server)\n\n sampleRate: config.sampleRate || 16000,\n\n channels: config.channels || 1,\n\n bitDepth: config.bitDepth || 16,\n\n \n\n // Audio processor path (optional)\n\n audioProcessorPath: config.audioProcessorPath, // Will auto-detect if not provided\n\n \n\n // Output format (what we want from server)\n\n outputContainer: config.outputContainer || this.getDefaultContainer(config),\n\n outputEncoding: config.outputEncoding || config.outputCodec || 'pcm',\n\n outputSampleRate: config.outputSampleRate || 16000,\n\n outputChannels: config.outputChannels || 1,\n\n outputBitDepth: config.outputBitDepth || 16,\n\n // Output frame duration (for raw PCM streaming)\n outputFrameDurationMs: config.outputFrameDurationMs || 600, // Default 600ms - smooth playback with good latency balance\n\n \n\n // Legacy support\n\n outputCodec: config.outputCodec,\n\n \n\n // Optional settings\n\n agentSettingsOverride: config.agentSettingsOverride || null,\n\n autoReconnect: config.autoReconnect !== false,\n\n \n\n // Protocol version\n\n protocolVersion: config.protocolVersion || 2\n\n };\n\n \n\n // State\n\n this.isConnected = false;\n\n this.hasEverConnected = false; // Track if we've successfully connected at least once\n\n this.isRecording = false;\n\n this.isPlaying = false;\n\n this.isDestroyed = false;\n\n this.outputAudioFormat = null;\n\n this.requestedOutputFormat = null; // What user requested\n\n this.formatConverter = null; // Format converter instance\n\n this.websocket = null;\n\n \n\n // Components\n\n this.audioPlayer = new AudioPlayer(this.config);\n\n this.audioRecorder = new AudioRecorder(this.config);\n\n \n\n\n // DON'T set default format in constructor\n // Wait for hello_ack to set the correct format\n // outputAudioFormat is already set to null above\n\n \n\n this.setupAudioPlayerEvents();\n\n this.setupAudioRecorderEvents();\n\n \n\n // Validate input and output formats\n\n this.validateConfig();\n\n \n\n console.log('🎵 VoiceSDK v2 initialized:', {\n\n version: this.version,\n\n outputContainer: this.config.outputContainer,\n\n outputEncoding: this.config.outputEncoding,\n\n outputSampleRate: this.config.outputSampleRate\n\n });\n\n }\n\n \n\n /**\n\n * Get default container based on config\n\n */\n\n getDefaultContainer(config) {\n\n // Backward compatibility: if user specified 'wav' as codec, use wav container\n\n if (config.outputCodec === 'wav') {\n\n return 'wav';\n\n }\n\n // Default: raw (no container overhead)\n\n return 'raw';\n\n }\n\n \n\n /**\n\n * Validate input audio format (matching backend validation)\n\n * @param {Object} format - Input format to validate\n\n * @returns {string|null} - Error message if invalid, null if valid\n\n */\n\n validateInputFormat(format) {\n\n if (!format) {\n\n return 'Input format is required';\n\n }\n\n \n\n const encoding = format.encoding?.toLowerCase();\n\n if (!encoding || !VoiceSDK_v2.SUPPORTED_INPUT_ENCODINGS.includes(encoding)) {\n\n return `Unsupported input encoding: ${format.encoding}. Supported: ${VoiceSDK_v2.SUPPORTED_INPUT_ENCODINGS.join(', ')}`;\n\n }\n\n \n\n if (!format.sampleRate || !VoiceSDK_v2.SUPPORTED_INPUT_SAMPLE_RATES.includes(format.sampleRate)) {\n\n return `Unsupported input sample rate: ${format.sampleRate}. Supported: ${VoiceSDK_v2.SUPPORTED_INPUT_SAMPLE_RATES.join(', ')}`;\n\n }\n\n \n\n if (!format.bitDepth || !VoiceSDK_v2.SUPPORTED_INPUT_BIT_DEPTHS.includes(format.bitDepth)) {\n\n return `Unsupported input bit depth: ${format.bitDepth}. Supported: ${VoiceSDK_v2.SUPPORTED_INPUT_BIT_DEPTHS.join(', ')}`;\n\n }\n\n \n\n if (!format.channels || !VoiceSDK_v2.SUPPORTED_INPUT_CHANNELS.includes(format.channels)) {\n\n return `Unsupported input channels: ${format.channels}. Supported: ${VoiceSDK_v2.SUPPORTED_INPUT_CHANNELS.join(', ')}`;\n\n }\n\n \n\n return null; // Valid\n\n }\n\n \n\n /**\n\n * Validate output audio format (matching backend validation)\n\n * @param {Object} format - Output format to validate\n\n * @returns {string|null} - Error message if invalid, null if valid\n\n */\n\n validateOutputFormat(format) {\n\n if (!format) {\n\n return 'Output format is required';\n\n }\n\n \n\n const encoding = format.encoding?.toLowerCase();\n\n if (!encoding || !VoiceSDK_v2.SUPPORTED_OUTPUT_ENCODINGS.includes(encoding)) {\n\n return `Unsupported output encoding: ${format.encoding}. Supported: ${VoiceSDK_v2.SUPPORTED_OUTPUT_ENCODINGS.join(', ')}`;\n\n }\n\n \n\n if (!format.sampleRate || !VoiceSDK_v2.SUPPORTED_OUTPUT_SAMPLE_RATES.includes(format.sampleRate)) {\n\n return `Unsupported output sample rate: ${format.sampleRate}. Supported: ${VoiceSDK_v2.SUPPORTED_OUTPUT_SAMPLE_RATES.join(', ')}`;\n\n }\n\n \n\n if (!format.bitDepth || !VoiceSDK_v2.SUPPORTED_OUTPUT_BIT_DEPTHS.includes(format.bitDepth)) {\n\n return `Unsupported output bit depth: ${format.bitDepth}. Supported: ${VoiceSDK_v2.SUPPORTED_OUTPUT_BIT_DEPTHS.join(', ')}`;\n\n }\n\n \n\n if (!format.channels || !VoiceSDK_v2.SUPPORTED_OUTPUT_CHANNELS.includes(format.channels)) {\n\n return `Unsupported output channels: ${format.channels}. Supported: ${VoiceSDK_v2.SUPPORTED_OUTPUT_CHANNELS.join(', ')}`;\n\n }\n\n \n\n const container = format.container?.toLowerCase();\n\n if (!container || !VoiceSDK_v2.SUPPORTED_OUTPUT_CONTAINERS.includes(container)) {\n\n return `Unsupported output container: ${format.container}. Supported: ${VoiceSDK_v2.SUPPORTED_OUTPUT_CONTAINERS.join(', ')}`;\n\n }\n\n \n\n return null; // Valid\n\n }\n\n \n\n /**\n\n * Validate SDK configuration and warn/error on invalid formats\n\n */\n\n validateConfig() {\n\n // Validate input format\n\n const inputFormat = {\n\n encoding: 'pcm', // SDK always sends PCM input\n\n sampleRate: this.config.sampleRate,\n\n channels: this.config.channels,\n\n bitDepth: this.config.bitDepth\n\n };\n\n \n\n const inputError = this.validateInputFormat(inputFormat);\n\n if (inputError) {\n\n console.error('❌ VoiceSDK v2: Invalid input format:', inputError);\n\n this.emit('error', new Error(inputError));\n\n return;\n\n }\n\n \n\n // Validate output format\n\n const outputFormat = {\n\n encoding: this.config.outputEncoding,\n\n sampleRate: this.config.outputSampleRate,\n\n channels: this.config.outputChannels,\n\n bitDepth: this.config.outputBitDepth,\n\n container: this.config.outputContainer\n\n };\n\n \n\n const outputError = this.validateOutputFormat(outputFormat);\n\n if (outputError) {\n\n console.error('❌ VoiceSDK v2: Invalid output format:', outputError);\n\n this.emit('error', new Error(outputError));\n\n return;\n\n }\n\n \n\n console.log('✅ VoiceSDK v2: Format validation passed');\n\n }\n\n \n\n /**\n\n * Setup AudioPlayer event listeners\n\n */\n\n setupAudioPlayerEvents() {\n\n this.audioPlayer.on('playbackStarted', () => {\n\n this.isPlaying = true;\n\n this.emit('playbackStarted');\n\n \n\n // Notify server - CRITICAL for barge-in detection\n\n if (this.isConnected) {\n\n console.log('📤 VoiceSDK v2: Sending audio_started_playing message to server');\n\n this.sendMessage({ t: 'audio_started_playing' });\n\n } else {\n\n console.warn('⚠️ VoiceSDK v2: Cannot send audio_started_playing - not connected');\n\n }\n\n });\n\n \n\n this.audioPlayer.on('playbackStopped', () => {\n\n this.isPlaying = false;\n\n this.emit('playbackStopped');\n\n \n\n // Notify server - CRITICAL for barge-in detection\n\n if (this.isConnected) {\n\n console.log('📤 VoiceSDK v2: Sending audio_stopped_playing message to server');\n\n this.sendMessage({ t: 'audio_stopped_playing' });\n\n } else {\n\n console.warn('⚠️ VoiceSDK v2: Cannot send audio_stopped_playing - not connected');\n\n }\n\n });\n\n \n\n this.audioPlayer.on('playbackError', (error) => {\n\n this.emit('playbackError', error);\n\n this.emit('error', error);\n\n });\n\n }\n\n \n\n /**\n\n * Setup AudioRecorder event listeners\n\n */\n\n setupAudioRecorderEvents() {\n\n this.audioRecorder.on('recordingStarted', () => {\n\n this.isRecording = true;\n\n \n\n // If audio is playing, stop it and barge-in\n\n // Check both isPlaying flag and AudioPlayer's actual state (scheduled buffers, sources, etc.)\n\n const audioPlayerStatus = this.audioPlayer.getStatus();\n\n const hasScheduledAudio = (audioPlayerStatus.scheduledBuffers && audioPlayerStatus.scheduledBuffers > 0) || \n\n (audioPlayerStatus.scheduledSourcesCount && audioPlayerStatus.scheduledSourcesCount > 0);\n\n const isActuallyPlaying = this.isPlaying || audioPlayerStatus.isPlaying || hasScheduledAudio;\n\n \n\n console.log('🎤 VoiceSDK v2: Recording started - checking for barge-in...');\n\n console.log(' VoiceSDK.isPlaying:', this.isPlaying);\n\n console.log(' AudioPlayer.isPlaying:', audioPlayerStatus.isPlaying);\n\n console.log(' scheduledBuffers:', audioPlayerStatus.scheduledBuffers || 0);\n\n console.log(' scheduledSourcesCount:', audioPlayerStatus.scheduledSourcesCount || 0);\n\n console.log(' preparedBufferLength:', audioPlayerStatus.preparedBufferLength || 0);\n\n console.log(' isActuallyPlaying:', isActuallyPlaying);\n\n \n\n if (isActuallyPlaying) {\n\n console.log('🛑 VoiceSDK v2: Barge-in detected! Stopping audio playback...');\n\n \n\n this.audioPlayer.stopImmediate();\n\n console.log('✅ VoiceSDK v2: Audio playback stopped');\n\n \n\n if (this.isConnected) {\n\n this.sendMessage({ t: 'barge_in' });\n\n console.log('📤 VoiceSDK v2: Sent barge_in message to server');\n\n } else {\n\n console.warn('⚠️ VoiceSDK v2: Cannot send barge_in - not connected');\n\n }\n\n } else {\n\n console.log('ℹ️ VoiceSDK v2: No audio playing, normal recording start');\n\n }\n\n \n\n this.emit('recordingStarted');\n\n });\n\n \n\n this.audioRecorder.on('recordingStopped', () => {\n\n this.isRecording = false;\n\n this._bargeInChecked = false; // Reset for next recording session\n\n this.emit('recordingStopped');\n\n console.log('🛑 VoiceSDK v2: Recording stopped');\n\n });\n\n \n\n this.audioRecorder.on('audioData', (pcmData) => {\n\n // Check for barge-in on first audio data (user actually speaking)\n\n // This is more reliable than checking on recordingStarted\n\n if (!this._bargeInChecked && this.isRecording) {\n\n this._bargeInChecked = true; // Only check once per recording session\n\n \n\n const audioPlayerStatus = this.audioPlayer.getStatus();\n\n const hasScheduledAudio = (audioPlayerStatus.scheduledBuffers && audioPlayerStatus.scheduledBuffers > 0) || \n\n (audioPlayerStatus.scheduledSourcesCount && audioPlayerStatus.scheduledSourcesCount > 0);\n\n const isActuallyPlaying = this.isPlaying || audioPlayerStatus.isPlaying || hasScheduledAudio;\n\n \n\n if (isActuallyPlaying) {\n\n console.log('🛑 VoiceSDK v2: Barge-in detected on first audio data! Stopping audio playback...');\n\n console.log(' VoiceSDK.isPlaying:', this.isPlaying);\n\n console.log(' AudioPlayer.isPlaying:', audioPlayerStatus.isPlaying);\n\n console.log(' scheduledBuffers:', audioPlayerStatus.scheduledBuffers || 0);\n\n console.log(' scheduledSourcesCount:', audioPlayerStatus.scheduledSourcesCount || 0);\n\n \n\n this.audioPlayer.stopImmediate();\n\n console.log('✅ VoiceSDK v2: Audio playback stopped');\n\n \n\n if (this.isConnected) {\n\n this.sendMessage({ t: 'barge_in' });\n\n console.log('📤 VoiceSDK v2: Sent barge_in message to server');\n\n }\n\n }\n\n }\n\n \n\n // Send audio chunks to server via WebSocket\n // NOTE: Don't check isRecording here - the audioRecorder emits data when it's active\n // This allows continuous frame sending even during barge-in scenarios\n // Matching v1 behavior: frames are sent as long as recorder is producing data\n if (this.isConnected) {\n this.sendBinary(pcmData);\n }\n\n });\n\n \n\n this.audioRecorder.on('error', (error) => {\n\n console.error('❌ AudioRecorder error:', error);\n\n this.emit('error', error);\n\n });\n\n }\n\n \n\n /**\n\n * Build WebSocket URL with query parameters\n\n */\n\n buildWebSocketUrl() {\n\n const baseUrl = this.config.websocketUrl;\n\n const params = new URLSearchParams();\n\n \n\n // Add agentId and appId to query parameters if provided\n\n if (this.config.agentId) {\n\n params.append('agentId', this.config.agentId);\n\n }\n\n \n\n if (this.config.appId) {\n\n params.append('appId', this.config.appId);\n\n }\n\n \n\n // If we have query parameters, append them to the URL\n\n if (params.toString()) {\n\n const separator = baseUrl.includes('?') ? '&' : '?';\n\n return `${baseUrl}${separator}${params.toString()}`;\n\n }\n\n \n\n return baseUrl;\n\n }\n\n \n\n /**\n\n * Connect to WebSocket server\n\n */\n\n async connect() {\n\n if (this.isDestroyed) {\n\n console.warn('VoiceSDK v2: Cannot connect - SDK is destroyed');\n\n return false;\n\n }\n\n \n\n if (this.isConnected) {\n\n console.warn('VoiceSDK v2: Already connected');\n\n return true;\n\n }\n\n \n\n try {\n\n // Build WebSocket URL with query parameters (agentId and appId)\n\n const wsUrl = this.buildWebSocketUrl();\n\n console.log('🔌 VoiceSDK v2: Connecting to', wsUrl);\n\n \n\n return await new Promise((resolve, reject) => {\n\n this.websocket = new WebSocket(wsUrl);\n\n \n\n // Connection opened\n\n this.websocket.onopen = () => {\n\n console.log('✅ VoiceSDK v2: WebSocket connected');\n\n this.isConnected = true;\n\n this.hasEverConnected = true; // Mark that we've successfully connected\n\n \n\n // Send hello message\n\n this.sendHelloMessage();\n\n \n\n this.emit('connected');\n\n resolve(true);\n\n };\n\n \n\n // Connection error\n\n this.websocket.onerror = (error) => {\n\n console.error('❌ VoiceSDK v2: WebSocket error:', error);\n\n reject(error);\n\n };\n\n \n\n // Connection closed\n\n this.websocket.onclose = (event) => {\n\n console.log('🔌 VoiceSDK v2: WebSocket closed:', event.code, event.reason);\n\n this.isConnected = false;\n\n \n\n // Stop recording if active\n\n if (this.isRecording) {\n\n this.stopRecording().catch(err => \n\n console.error('Error stopping recording:', err)\n\n );\n\n }\n\n \n\n this.emit('disconnected', event);\n\n \n\n // Auto-reconnect (if enabled) - only retry if we've successfully connected before\n\n // This prevents infinite retry loops on initial connection failures\n\n if (this.config.autoReconnect && !this.isDestroyed && this.hasEverConnected) {\n\n console.log('🔄 VoiceSDK v2: Auto-reconnecting in 3s...');\n\n setTimeout(() => {\n\n if (!this.isDestroyed && !this.isConnected) {\n\n this.connect();\n\n }\n\n }, 3000);\n\n } else if (this.config.autoReconnect && !this.hasEverConnected) {\n\n console.log('⚠️ VoiceSDK v2: Initial connection failed. Auto-reconnect disabled to prevent retry loop.');\n\n }\n\n };\n\n \n\n // Message received\n\n this.websocket.onmessage = (event) => {\n\n this.handleMessage(event);\n\n };\n\n });\n\n \n\n } catch (error) {\n\n console.error('🔌 VoiceSDK v2: Connection failed:', error);\n\n this.emit('error', error);\n\n return false;\n\n }\n\n }\n\n \n\n /**\n\n * Send hello message with format negotiation\n\n */\n\n sendHelloMessage() {\n\n if (!this.isConnected) {\n\n console.warn('VoiceSDK v2: Cannot send hello - not connected');\n\n return;\n\n }\n\n \n\n // Build input format object\n\n const inputFormat = {\n\n encoding: 'pcm', // \"pcm\", \"pcmu\", \"pcma\"\n\n sampleRate: this.config.sampleRate, // Integer\n\n channels: this.config.channels, // Integer\n\n bitDepth: this.config.bitDepth // Integer\n\n };\n\n \n\n // Build requested output format object\n\n const requestedOutputFormat = {\n\n encoding: this.config.outputEncoding, // \"pcm\", \"pcmu\", \"pcma\"\n\n sampleRate: this.config.outputSampleRate, // Integer\n\n channels: this.config.outputChannels, // Integer\n\n bitDepth: this.config.outputBitDepth, // Integer\n\n container: this.config.outputContainer // \"raw\" or \"wav\" (for output format only)\n\n };\n\n \n\n // Validate formats before sending (matching backend validation)\n\n const inputError = this.validateInputFormat(inputFormat);\n\n if (inputError) {\n\n console.error('❌ VoiceSDK v2: Cannot send hello - invalid input format:', inputError);\n\n this.emit('error', new Error(`Invalid input format: ${inputError}`));\n\n return;\n\n }\n\n \n\n const outputError = this.validateOutputFormat(requestedOutputFormat);\n\n if (outputError) {\n\n console.error('❌ VoiceSDK v2: Cannot send hello - invalid output format:', outputError);\n\n this.emit('error', new Error(`Invalid output format: ${outputError}`));\n\n return;\n\n }\n\n \n\n // Build hello message matching backend ControlMessage structure\n\n const helloMessage = {\n\n t: 'hello',\n\n v: this.config.protocolVersion, // Protocol version (Integer)\n\n inputFormat: inputFormat,\n\n requestedOutputFormat: requestedOutputFormat,\n\n outputFrameDurationMs: this.config.outputFrameDurationMs // Frame duration in milliseconds\n\n };\n\n \n\n // Optional: Agent settings override (Map<String, Object>)\n\n if (this.config.agentSettingsOverride) {\n\n helloMessage.agentSettingsOverride = this.config.agentSettingsOverride;\n\n }\n\n \n\n // Note: appId and agentId are sent as query parameters in WebSocket URL, not in hello message\n\n // (matching v1 behavior and backend expectations)\n\n \n\n console.log('📤 VoiceSDK v2: Sending hello:', {\n\n version: helloMessage.v,\n\n requestedFormat: helloMessage.requestedOutputFormat\n\n });\n\n console.log('📤 VoiceSDK v2: Requested output format:', {\n\n container: helloMessage.requestedOutputFormat.container,\n\n encoding: helloMessage.requestedOutputFormat.encoding,\n\n sampleRate: helloMessage.requestedOutputFormat.sampleRate,\n\n bitDepth: helloMessage.requestedOutputFormat.bitDepth\n\n });\n\n \n\n try {\n\n this.sendMessage(helloMessage);\n\n } catch (error) {\n\n console.error('VoiceSDK v2: Failed to send hello:', error);\n\n this.emit('error', error);\n\n }\n\n }\n\n \n\n /**\n\n * Handle incoming WebSocket message\n\n */\n\n handleMessage(event) {\n\n // Binary message (audio data)\n\n if (event.data instanceof ArrayBuffer || event.data instanceof Blob) {\n\n this.handleBinaryMessage(event.data);\n\n return;\n\n }\n\n \n\n // Text message (JSON)\n\n try {\n\n const message = JSON.parse(event.data);\n\n \n\n console.log('📥 VoiceSDK v2: Received message:', message.t);\n\n \n\n switch (message.t) {\n\n case 'hello_ack':\n\n this.handleHelloAck(message);\n\n break;\n\n \n\n case 'user_transcript':\n\n case 'agent_response':\n\n case 'error':\n\n this.emit('message', message);\n\n break;\n\n \n\n case 'barge_in':\n\n this.emit('bargeIn', message);\n\n this.audioPlayer.stopImmediate();\n\n break;\n\n \n\n case 'stop_playing':\n\n this.emit('stopPlaying', message);\n\n this.audioPlayer.stopImmediate();\n\n break;\n\n \n\n default:\n\n console.log('VoiceSDK v2: Unknown message type:', message.t);\n\n this.emit('message', message);\n\n }\n\n \n\n } catch (error) {\n\n console.error('VoiceSDK v2: Error parsing message:', error);\n\n }\n\n }\n\n \n\n /**\n\n * Handle hello_ack message\n\n */\n\n handleHelloAck(message) {\n\n console.log('📥 VoiceSDK v2: Received hello_ack:', {\n hasOutputFormat: !!message.outputAudioFormat,\n outputFormat: message.outputAudioFormat,\n messageType: message.t\n });\n\n \n\n if (message.outputAudioFormat) {\n\n // v2 protocol: format was negotiated\n\n this.outputAudioFormat = message.outputAudioFormat;\n\n this.audioPlayer.setOutputFormat(message.outputAudioFormat);\n\n \n\n console.log('✅ VoiceSDK v2: Format negotiated by server:', this.outputAudioFormat);\n \n // Store requested format\n this.requestedOutputFormat = {\n container: this.config.outputContainer || 'wav',\n encoding: this.config.outputEncoding || 'pcm',\n sampleRate: this.config.outputSampleRate || 16000,\n bitDepth: this.config.outputBitDepth || 16,\n channels: this.config.outputChannels || 1\n };\n \n const negotiatedFormat = {\n container: this.outputAudioFormat.container || 'unknown',\n encoding: this.outputAudioFormat.encoding || 'unknown',\n sampleRate: this.outputAudioFormat.sampleRate || 0,\n bitDepth: this.outputAudioFormat.bitDepth || 0,\n channels: this.outputAudioFormat.channels || 0\n };\n \n // Check for mismatches and create converter if needed\n const mismatches = [];\n if (this.requestedOutputFormat.container !== negotiatedFormat.container) {\n mismatches.push(`container: \"${this.requestedOutputFormat.container}\" → \"${negotiatedFormat.container}\"`);\n }\n if (this.requestedOutputFormat.encoding !== negotiatedFormat.encoding) {\n mismatches.push(`encoding: \"${this.requestedOutputFormat.encoding}\" → \"${negotiatedFormat.encoding}\"`);\n }\n if (this.requestedOutputFormat.sampleRate !== negotiatedFormat.sampleRate) {\n mismatches.push(`sampleRate: ${this.requestedOutputFormat.sampleRate}Hz → ${negotiatedFormat.sampleRate}Hz`);\n }\n if (this.requestedOutputFormat.bitDepth !== negotiatedFormat.bitDepth) {\n mismatches.push(`bitDepth: ${this.requestedOutputFormat.bitDepth}-bit → ${negotiatedFormat.bitDepth}-bit`);\n }\n if (this.requestedOutputFormat.channels !== negotiatedFormat.channels) {\n mismatches.push(`channels: ${this.requestedOutputFormat.channels} → ${negotiatedFormat.channels}`);\n }\n \n if (mismatches.length > 0) {\n console.warn('⚠️ VoiceSDK v2: Format negotiation mismatch!');\n console.warn(' Requested:', this.requestedOutputFormat);\n console.warn(' Negotiated:', negotiatedFormat);\n console.warn(' Differences:', mismatches.join(', '));\n \n // Create format converter to automatically convert\n try {\n this.formatConverter = new AudioFormatConverter(\n this.requestedOutputFormat,\n negotiatedFormat\n );\n \n if (this.formatConverter.needsConversion()) {\n const steps = this.formatConverter.getConversionSteps();\n console.log('🔄 VoiceSDK v2: Format conversion enabled');\n console.log(' Conversion steps:', steps.join(', '));\n console.log(' Audio will be automatically converted to requested format');\n }\n } catch (error) {\n console.error('❌ VoiceSDK v2: Failed to create format converter:', error);\n console.warn(' Will use backend format without conversion');\n this.formatConverter = null;\n }\n } else {\n console.log('✅ VoiceSDK v2: Format perfectly matched!', negotiatedFormat);\n this.formatConverter = null; // No conversion needed\n }\n\n this.emit('formatNegotiated', this.outputAudioFormat);\n\n \n\n } else {\n\n // v1 protocol: no format info (backward compatibility)\n // OR v2 protocol but backend didn't include outputAudioFormat\n\n if (this.config.protocolVersion >= 2) {\n\n console.warn('⚠️ VoiceSDK v2: hello_ack received but no outputAudioFormat in response.');\n\n console.warn(' This may happen if:');\n\n console.warn(' 1. Backend is not sending outputAudioFormat (check backend logs)');\n\n console.warn(' 2. Hello message missing v2 fields (v, inputFormat, requestedOutputFormat)');\n\n console.warn(' 3. Backend validation failed (check backend error logs)');\n\n console.warn(' Using default format from config...');\n\n } else {\n\n console.log('✅ VoiceSDK v2: Connected (v1 legacy mode)');\n\n }\n\n \n\n // Use defaults from config (already set during initialization, but update if needed)\n\n const defaultFormat = {\n\n container: this.config.outputContainer || 'wav',\n\n encoding: this.config.outputEncoding || 'pcm',\n\n sampleRate: this.config.outputSampleRate || 16000,\n\n channels: this.config.outputChannels || 1,\n\n bitDepth: this.config.outputBitDepth || 16\n\n };\n\n \n\n this.outputAudioFormat = defaultFormat;\n \n this.requestedOutputFormat = defaultFormat; // Same as default when no negotiation\n\n this.audioPlayer.setOutputFormat(defaultFormat);\n \n this.formatConverter = null; // No conversion needed when using defaults\n\n }\n\n }\n\n \n\n /**\n\n * Handle binary audio data\n\n */\n\n async handleBinaryMessage(data) {\n\n // Convert Blob to ArrayBuffer if needed\n\n let arrayBuffer;\n\n if (data instanceof Blob) {\n\n arrayBuffer = await data.arrayBuffer();\n\n } else {\n\n arrayBuffer = data;\n\n }\n\n \n\n console.log('📥 VoiceSDK v2: Received audio:', arrayBuffer.byteLength, 'bytes');\n\n \n\n // Convert format if needed (before passing to AudioPlayer)\n let processedAudio = arrayBuffer;\n \n if (this.formatConverter && this.formatConverter.needsConversion()) {\n try {\n processedAudio = await this.formatConverter.convert(arrayBuffer);\n console.log('✅ VoiceSDK v2: Audio converted to requested format');\n } catch (error) {\n console.error('❌ VoiceSDK v2: Format conversion failed:', error);\n console.warn(' Using backend format without conversion');\n processedAudio = arrayBuffer; // Fall back to original\n }\n }\n \n // Determine format for playback (use requested format if converter was used, otherwise use negotiated)\n const playbackFormat = this.formatConverter && this.formatConverter.needsConversion() \n ? this.requestedOutputFormat \n : (this.outputAudioFormat || {\n container: this.config.outputContainer || 'raw',\n encoding: this.config.outputEncoding || 'pcm',\n sampleRate: this.config.outputSampleRate || 16000,\n bitDepth: this.config.outputBitDepth || 16,\n channels: this.config.outputChannels || 1\n });\n \n const container = playbackFormat.container || 'raw';\n const encoding = (playbackFormat.encoding || 'pcm').toLowerCase();\n \n if (container === 'raw') {\n // Raw audio - decode if needed, then use playChunk for seamless scheduling\n let pcmData = processedAudio;\n \n if (encoding !== 'pcm') {\n // Need to decode PCMU/PCMA to PCM\n const codec = this.audioPlayer.getCodec(encoding);\n if (codec) {\n const decoded = codec.decode(new Uint8Array(processedAudio));\n pcmData = decoded.buffer;\n console.log(`🔄 VoiceSDK v2: Decoded ${encoding.toUpperCase()} to PCM (${decoded.byteLength} bytes)`);\n } else {\n console.warn(`⚠️ VoiceSDK v2: No codec for ${encoding}, treating as PCM`);\n }\n }\n \n // Ensure outputFormat is set on AudioPlayer before playing chunks\n // This is critical for raw PCM playback\n if (!this.audioPlayer.outputFormat) {\n console.warn('⚠️ VoiceSDK v2: outputFormat not set on AudioPlayer, setting from playbackFormat');\n this.audioPlayer.setOutputFormat(playbackFormat);\n }\n \n // Use playChunk for seamless scheduling\n this.audioPlayer.playChunk(pcmData);\n } else {\n // WAV or other - use playAudio which handles headers\n this.audioPlayer.playAudio(processedAudio);\n }\n\n }\n\n \n\n /**\n\n * Send message to server\n\n */\n\n sendMessage(message) {\n\n if (!this.websocket || this.websocket.readyState !== WebSocket.OPEN) {\n\n console.warn('VoiceSDK v2: Cannot send message - not connected');\n\n return false;\n\n }\n\n \n\n try {\n\n this.websocket.send(JSON.stringify(message));\n\n return true;\n\n } catch (error) {\n\n console.error('VoiceSDK v2: Error sending message:', error);\n\n this.emit('error', error);\n\n return false;\n\n }\n\n }\n\n \n\n /**\n\n * Send binary audio data to server\n\n */\n\n sendBinary(audioData) {\n\n if (!this.websocket || this.websocket.readyState !== WebSocket.OPEN) {\n\n console.warn('VoiceSDK v2: Cannot send audio - not connected');\n\n return false;\n\n }\n\n \n\n try {\n\n this.websocket.send(audioData);\n\n return true;\n\n } catch (error) {\n\n console.error('VoiceSDK v2: Error sending audio:', error);\n\n this.emit('error', error);\n\n return false;\n\n }\n\n }\n\n \n\n /**\n\n * Disconnect from server\n\n */\n\n disconnect() {\n\n if (this.isDestroyed) return;\n\n \n\n console.log('🔌 VoiceSDK v2: Disconnecting...');\n\n \n\n this.stopRecording();\n\n \n // Stop audio playback and clear queues (like v1)\n if (this.audioPlayer) {\n this.audioPlayer.stopImmediate();\n }\n\n if (this.websocket) {\n\n this.websocket.close();\n\n this.websocket = null;\n\n }\n\n \n\n this.isConnected = false;\n\n }\n\n \n\n /**\n\n * Start recording audio from microphone\n\n */\n\n async startRecording() {\n\n if (!this.isConnected) {\n\n const error = new Error('Not connected to voice server');\n\n this.emit('error', error);\n\n throw error;\n\n }\n\n \n\n if (this.isRecording) {\n\n console.warn('VoiceSDK v2: Already recording');\n\n return true;\n\n }\n\n \n\n console.log('🎤 VoiceSDK v2: Starting recording...');\n\n \n\n try {\n\n // Send start_continuous_mode message to server\n\n this.sendMessage({\n\n t: 'start_continuous_mode',\n\n ttpId: this.generateTtpId()\n\n });\n\n \n\n // Start capturing audio from microphone\n\n await this.audioRecorder.start();\n\n \n\n return true;\n\n \n\n } catch (error) {\n\n console.error('❌ VoiceSDK v2: Failed to start recording:', error);\n\n this.emit('error', error);\n\n return false;\n\n }\n\n }\n\n \n\n /**\n\n * Stop recording audio\n\n */\n\n async stopRecording() {\n\n if (!this.isRecording) {\n\n console.warn('VoiceSDK v2: Not recording');\n\n return true;\n\n }\n\n \n\n console.log('🛑 VoiceSDK v2: Stopping recording...');\n\n \n\n try {\n\n // Send stop_continuous_mode message to server\n\n this.sendMessage({\n\n t: 'stop_continuous_mode',\n\n ttpId: this.generateTtpId()\n\n });\n\n \n\n // Stop capturing audio from microphone\n\n await this.audioRecorder.stop();\n\n \n\n // Stop any playing audio\n\n this.audioPlayer.stopImmediate();\n\n \n\n return true;\n\n \n\n } catch (error) {\n\n console.error('VoiceSDK v2: Error stopping recording:', error);\n\n this.emit('error', error);\n\n return false;\n\n }\n\n }\n\n \n\n /**\n\n * Toggle recording on/off\n\n */\n\n async toggleRecording() {\n\n if (this.isRecording) {\n\n return await this.stopRecording();\n\n } else {\n\n return await this.startRecording();\n\n }\n\n }\n\n \n\n /**\n\n * Stop audio playback\n\n */\n\n stopAudioPlayback() {\n\n this.audioPlayer.stopImmediate();\n\n }\n\n \n\n /**\n\n * Handle barge-in (interrupt agent, start listening)\n\n */\n\n async handleBargeIn() {\n\n this.stopAudioPlayback();\n\n \n\n if (!this.isRecording) {\n\n await this.startRecording();\n\n }\n\n }\n\n \n\n /**\n\n * Get SDK status\n\n */\n\n getStatus() {\n\n return {\n\n version: this.version,\n\n isConnected: this.isConnected,\n\n isRecording: this.isRecording,\n\n isPlaying: this.isPlaying,\n\n outputFormat: this.outputAudioFormat,\n\n audioPlayer: this.audioPlayer.getStatus(),\n\n audioRecorder: this.audioRecorder.getStatus()\n\n };\n\n }\n\n \n\n /**\n\n * Update configuration\n\n */\n\n updateConfig(newConfig) {\n\n this.config = { ...this.config, ...newConfig };\n\n }\n\n \n\n /**\n\n * Generate unique TTP ID\n\n */\n\n generateTtpId() {\n\n return 'sdk_' + Math.random().toString(36).substr(2, 9) + '_' + Date.now();\n\n }\n\n \n\n /**\n\n * Destroy SDK and cleanup resources\n\n */\n\n destroy() {\n\n if (this.isDestroyed) return;\n\n \n\n console.log('🗑️ VoiceSDK v2: Destroying...');\n\n \n\n this.disconnect();\n\n this.isDestroyed = true;\n\n \n\n // Cleanup components\n\n if (this.audioPlayer) {\n\n this.audioPlayer.destroy();\n\n }\n\n \n\n if (this.audioRecorder) {\n\n this.audioRecorder.destroy();\n\n }\n\n \n\n this.removeAllListeners();\n\n }\n\n}\n\n\n\nexport default VoiceSDK_v2;\n\n","/**\n * TextChatSDK - Single-shot WebSocket per message\n * - Opens a new WS to /chat for each message, streams chunks, emits events, then closes\n * - Persists conversationId locally to allow continuity across messages\n */\nimport EventEmitter from './EventEmitter.js';\n\nexport default class TextChatSDK extends EventEmitter {\n constructor(config = {}) {\n super();\n \n const scriptConfig = this.readScriptTagConfig();\n\n this.config = {\n // Prefer SockJS native upgrade endpoint directly to avoid an initial failed attempt on /chat\n baseWsUrl: 'wss://backend.talktopc.com/chat/websocket',\n appId: config.appId || scriptConfig.appId,\n agentId: config.agentId || scriptConfig.agentId,\n conversationId: config.conversationId !== undefined ? config.conversationId : this.getPersistedConversationId(),\n // Optional testing override: force a specific conversationId for all sends\n forceConversationId: config.forceConversationId,\n // queueing behavior\n queue: [],\n inFlight: false,\n ...config\n };\n \n this.fullResponseBuffer = '';\n }\n\n // Read appId/agentId from the embedding script tag data attributes\n readScriptTagConfig() {\n try {\n const scripts = Array.from(document.getElementsByTagName('script'));\n const sdkScript = scripts.reverse().find(s => (s.dataset && (s.dataset.appId || s.dataset.agentId)) || (s.src && s.src.includes('agent-widget')));\n if (!sdkScript) return {};\n return {\n appId: sdkScript.dataset.appId,\n agentId: sdkScript.dataset.agentId\n };\n } catch (_) {\n return {};\n }\n }\n\n // Build WS URL with query params\n buildWebSocketUrl(base = this.config.baseWsUrl) {\n const params = new URLSearchParams();\n if (this.config.appId) params.append('appId', this.config.appId);\n if (this.config.agentId) params.append('agentId', this.config.agentId);\n if (this.config.conversationId) params.append('conversationId', this.config.conversationId);\n return `${base}?${params.toString()}`;\n }\n\n // Public API: sendMessage opens a fresh WS, streams, then closes\n async sendMessage(text) {\n return new Promise((resolve, reject) => {\n if (!text || !text.trim()) {\n reject(new Error('Message is empty'));\n return;\n }\n if (!this.config.appId || !this.config.agentId) {\n reject(new Error('Missing appId or agentId'));\n return;\n }\n \n const task = { text, resolve, reject };\n if (this.config.inFlight) {\n this.config.queue.push(task);\n } else {\n this.executeTask(task);\n }\n });\n }\n\n executeTask(task) {\n this.config.inFlight = true;\n this.fullResponseBuffer = '';\n\n // If conversationId is missing in memory, try to hydrate from localStorage before sending\n if (!this.config.conversationId) {\n const persisted = this.getPersistedConversationId();\n if (persisted) {\n this.config.conversationId = persisted;\n console.log('🔍 TextChatSDK hydrated conversationId from storage:', persisted);\n }\n }\n\n const primaryUrl = this.buildWebSocketUrl(this.config.baseWsUrl);\n const fallbackBase = this.config.baseWsUrl.endsWith('/websocket')\n ? this.config.baseWsUrl.replace(/\\/websocket$/, '')\n : `${this.config.baseWsUrl}/websocket`;\n const fallbackUrl = this.buildWebSocketUrl(fallbackBase);\n let triedFallback = false;\n\n let messageSent = false;\n let helloWaitTimer = null;\n\n const sendPayload = (socket) => {\n if (messageSent) return;\n try {\n const payload = { message: task.text };\n const effectiveConvId = this.config.forceConversationId || this.config.conversationId;\n if (effectiveConvId) {\n payload.conversationId = effectiveConvId;\n // Persist and keep in-memory if coming from a forced value (test mode)\n if (this.config.forceConversationId && !this.config.conversationId) {\n this.config.conversationId = effectiveConvId;\n this.persistConversationId(effectiveConvId);\n }\n }\n console.log('🔍 TextChatSDK sending payload:', payload, 'conversationId in config:', this.config.conversationId);\n socket.send(JSON.stringify(payload));\n messageSent = true;\n } catch (e) {\n task.reject(e);\n this.emit('error', e);\n try { socket.close(); } catch (_) {}\n }\n };\n\n const handleOpen = (socket) => () => {\n // Wait briefly for server 'hello' to capture conversationId before first send\n // If no hello within 200ms, send anyway\n if (!this.config.conversationId) {\n helloWaitTimer = setTimeout(() => sendPayload(socket), 200);\n } else {\n sendPayload(socket);\n }\n };\n\n const handleMessage = (socket) => (evt) => {\n try {\n try { console.log('🔎 [TextChatSDK] WS <= raw:', evt.data); } catch (_) {}\n const data = JSON.parse(evt.data);\n try { console.log('🔎 [TextChatSDK] WS <= parsed:', data); } catch (_) {}\n // Capture conversationId handshake from server\n if (data.type === 'hello' && data.conversationId) {\n // Persist the conversation id for subsequent messages\n console.log('🔍 TextChatSDK received conversationId:', data.conversationId);\n this.config.conversationId = data.conversationId;\n this.persistConversationId(data.conversationId);\n this.emit && this.emit('conversationIdChanged', data.conversationId);\n // If we were waiting to send the first message, send it now\n if (!messageSent && socket && socket.readyState === 1) {\n if (helloWaitTimer) { try { clearTimeout(helloWaitTimer); } catch (_) {} }\n sendPayload(socket);\n }\n return; // nothing else to do for handshake\n }\n // Fallback: capture conversationId if present on any message shape\n if (!this.config.conversationId && data.conversationId) {\n console.log('🔍 TextChatSDK captured conversationId from message:', data.conversationId);\n this.config.conversationId = data.conversationId;\n this.persistConversationId(data.conversationId);\n }\n if (data.type === 'chunk' && typeof data.content === 'string') {\n this.fullResponseBuffer += data.content;\n this.emit('chunk', data.content);\n } else if (data.type === 'done') {\n // If server sent a final text in the done payload, capture it for non-streaming backends\n try {\n const finalText = data.text || data.content || data.answer || data.message || '';\n if (finalText && !this.fullResponseBuffer) {\n this.fullResponseBuffer = finalText;\n }\n } catch (_) {}\n // Persist conversationId if provided on completion (fallback when hello was missed)\n if (!this.config.conversationId && data.conversationId) {\n console.log('🔍 TextChatSDK captured conversationId from done:', data.conversationId);\n this.config.conversationId = data.conversationId;\n }\n this.persistConversationId(this.config.conversationId);\n this.emit('done', { text: this.fullResponseBuffer });\n task.resolve({ conversationId: this.config.conversationId, fullText: this.fullResponseBuffer });\n try { socket.close(); } catch (_) {}\n } else if (data.type === 'error') {\n const err = new Error(data.message || 'Server error');\n this.emit('error', err);\n task.reject(err);\n try { socket.close(); } catch (_) {}\n }\n } catch (e) {\n // Non-JSON or parse error; ignore or surface\n }\n };\n\n const handleError = (socket) => (e) => {\n // Try alternate path once: toggle /websocket suffix\n if (!triedFallback) {\n triedFallback = true;\n try { socket.close(); } catch (_) {}\n const fb = new WebSocket(fallbackUrl);\n fb.onopen = handleOpen(fb);\n fb.onmessage = handleMessage(fb);\n fb.onerror = (err) => {\n this.emit('error', err);\n task.reject(err);\n };\n fb.onclose = handleClose;\n return;\n }\n this.emit('error', e);\n task.reject(e);\n };\n\n const handleClose = (event) => {\n // Check if connection was closed due to domain whitelist violation\n if (event.code === 1008 && event.reason && \n (event.reason.includes('Domain not whitelisted') || \n event.reason.includes('domain') || \n event.reason.includes('whitelist'))) {\n const domainError = new Error('DOMAIN_NOT_WHITELISTED');\n domainError.reason = event.reason;\n domainError.code = event.code;\n // Only emit domainError, not error - to avoid duplicate handling\n this.emit('domainError', domainError);\n task.reject(domainError);\n // Reset inFlight and drain queue to allow subsequent messages\n this.config.inFlight = false;\n this.drainQueue();\n return;\n }\n \n this.config.inFlight = false;\n this.drainQueue();\n };\n\n const ws = new WebSocket(primaryUrl);\n ws.onopen = handleOpen(ws);\n ws.onmessage = handleMessage(ws);\n ws.onerror = handleError(ws);\n ws.onclose = handleClose;\n }\n\n drainQueue() {\n if (this.config.queue.length === 0 || this.config.inFlight) return;\n const next = this.config.queue.shift();\n this.executeTask(next);\n }\n\n persistConversationId(conversationId) {\n try {\n if (conversationId) localStorage.setItem('ttp_text_chat_conversation_id', conversationId);\n } catch (_) {}\n }\n\n getPersistedConversationId() {\n try {\n return localStorage.getItem('ttp_text_chat_conversation_id') || null;\n } catch (_) {\n return null;\n }\n }\n\n updateConfig(newConfig) {\n this.config = { ...this.config, ...newConfig };\n }\n \n destroy() {\n this.config.queue = [];\n this.config.inFlight = false;\n this.removeAllListeners();\n }\n}\n\n","/**\n * VoiceButton - React component for voice interaction\n */\nimport React, { useState, useEffect, useRef } from 'react';\nimport VoiceSDK from '../core/VoiceSDK.js';\n\nconst VoiceButton = ({ \n websocketUrl,\n agentId, // Optional - for direct agent access (unsecured method)\n appId, // Required - User's app ID for authentication\n voice = 'default',\n language = 'en',\n autoReconnect = true,\n \n // NEW: Agent settings override (only available with signed link)\n agentSettingsOverride = null,\n \n onConnected,\n onDisconnected,\n onRecordingStarted,\n onRecordingStopped,\n onPlaybackStarted,\n onPlaybackStopped,\n onError,\n onMessage,\n onBargeIn,\n onStopPlaying,\n className = '',\n style = {},\n children\n}) => {\n const [isConnected, setIsConnected] = useState(false);\n const [isRecording, setIsRecording] = useState(false);\n const [isPlaying, setIsPlaying] = useState(false);\n const [connectionStatus, setConnectionStatus] = useState('Disconnected');\n \n const voiceSDKRef = useRef(null);\n \n // Initialize VoiceSDK\n useEffect(() => {\n console.log(`🎙️ VoiceButton: Creating VoiceSDK instance for ${websocketUrl}`);\n \n // Clean up existing instance if any\n if (voiceSDKRef.current) {\n console.log(`🎙️ VoiceButton: Destroying existing VoiceSDK instance`);\n voiceSDKRef.current.destroy();\n voiceSDKRef.current = null;\n }\n \n const voiceSDK = new VoiceSDK({\n websocketUrl,\n agentId, // Pass through agentId if provided\n appId, // Required for authentication\n voice,\n language,\n autoReconnect,\n agentSettingsOverride // Pass through agent settings override\n });\n \n // Setup event listeners\n voiceSDK.on('connected', () => {\n setIsConnected(true);\n setConnectionStatus('Connected');\n onConnected?.();\n });\n \n voiceSDK.on('disconnected', () => {\n setIsConnected(false);\n setConnectionStatus('Disconnected');\n onDisconnected?.();\n });\n \n voiceSDK.on('recordingStarted', () => {\n setIsRecording(true);\n onRecordingStarted?.();\n });\n \n voiceSDK.on('recordingStopped', () => {\n setIsRecording(false);\n onRecordingStopped?.();\n });\n \n voiceSDK.on('playbackStarted', () => {\n setIsPlaying(true);\n onPlaybackStarted?.();\n });\n \n voiceSDK.on('playbackStopped', () => {\n setIsPlaying(false);\n onPlaybackStopped?.();\n });\n \n voiceSDK.on('error', (error) => {\n onError?.(error);\n });\n \n voiceSDK.on('message', (message) => {\n onMessage?.(message);\n });\n \n voiceSDK.on('bargeIn', (message) => {\n onBargeIn?.(message);\n });\n \n voiceSDK.on('stopPlaying', (message) => {\n onStopPlaying?.(message);\n });\n \n voiceSDKRef.current = voiceSDK;\n \n // Auto-connect\n voiceSDK.connect();\n \n // Cleanup on unmount\n return () => {\n console.log(`🎙️ VoiceButton: Cleaning up VoiceSDK instance for ${websocketUrl}`);\n if (voiceSDKRef.current) {\n voiceSDKRef.current.destroy();\n voiceSDKRef.current = null;\n }\n };\n }, [websocketUrl, agentId, appId, voice, language, agentSettingsOverride]);\n \n // Handle button click\n const handleClick = async () => {\n if (!voiceSDKRef.current) return;\n \n try {\n await voiceSDKRef.current.toggleRecording();\n } catch (error) {\n console.error('Error toggling recording:', error);\n }\n };\n \n // Default button content\n const defaultContent = (\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <div style={{ fontSize: '20px' }}>\n {isRecording ? '🔴' : '🎤'}\n </div>\n <div>\n {isRecording ? 'Stop Listening' : 'Start Listening'}\n </div>\n </div>\n );\n \n return (\n <button\n className={`voice-button ${isRecording ? 'recording' : ''} ${className}`}\n style={{\n padding: '12px 24px',\n border: 'none',\n borderRadius: '8px',\n backgroundColor: isRecording ? '#dc3545' : '#007bff',\n color: 'white',\n cursor: 'pointer',\n fontSize: '16px',\n fontWeight: '500',\n transition: 'all 0.2s ease',\n ...style\n }}\n onClick={handleClick}\n disabled={!isConnected}\n >\n {children || defaultContent}\n </button>\n );\n};\n\nexport default VoiceButton;\n","/**\n * VoiceButton - Vanilla JavaScript voice button\n */\nimport VoiceSDK from '../core/VoiceSDK.js';\n\nexport default class VoiceButton {\n constructor(options = {}) {\n this.options = {\n websocketUrl: options.websocketUrl || 'wss://speech.talktopc.com/ws/conv',\n agentId: options.agentId, // Optional - for direct agent access (unsecured method)\n voice: options.voice || 'default',\n language: options.language || 'en',\n container: options.container || document.body,\n buttonText: options.buttonText || 'Start Listening',\n buttonClass: options.buttonClass || 'voice-button',\n ...options\n };\n \n this.isConnected = false;\n this.isRecording = false;\n this.isPlaying = false;\n \n this.voiceSDK = new VoiceSDK({\n websocketUrl: this.options.websocketUrl,\n agentId: this.options.agentId, // Pass through agentId if provided\n voice: this.options.voice,\n language: this.options.language\n });\n \n this.setupEventListeners();\n this.createButton();\n this.connect();\n }\n \n /**\n * Setup event listeners\n */\n setupEventListeners() {\n this.voiceSDK.on('connected', () => {\n this.isConnected = true;\n this.updateButton();\n this.options.onConnected?.();\n });\n \n this.voiceSDK.on('disconnected', () => {\n this.isConnected = false;\n this.updateButton();\n this.options.onDisconnected?.();\n });\n \n this.voiceSDK.on('recordingStarted', () => {\n this.isRecording = true;\n this.updateButton();\n this.options.onRecordingStarted?.();\n });\n \n this.voiceSDK.on('recordingStopped', () => {\n this.isRecording = false;\n this.updateButton();\n this.options.onRecordingStopped?.();\n });\n \n this.voiceSDK.on('playbackStarted', () => {\n this.isPlaying = true;\n this.options.onPlaybackStarted?.();\n });\n \n this.voiceSDK.on('playbackStopped', () => {\n this.isPlaying = false;\n this.options.onPlaybackStopped?.();\n });\n \n this.voiceSDK.on('error', (error) => {\n this.options.onError?.(error);\n });\n \n this.voiceSDK.on('message', (message) => {\n this.options.onMessage?.(message);\n });\n \n this.voiceSDK.on('bargeIn', (message) => {\n this.options.onBargeIn?.(message);\n });\n \n this.voiceSDK.on('stopPlaying', (message) => {\n this.options.onStopPlaying?.(message);\n });\n }\n \n /**\n * Create the button element\n */\n createButton() {\n this.button = document.createElement('button');\n this.button.className = this.options.buttonClass;\n this.button.style.cssText = `\n padding: 12px 24px;\n border: none;\n border-radius: 8px;\n background-color: #6c757d;\n color: white;\n cursor: pointer;\n font-size: 16px;\n font-weight: 500;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 8px;\n `;\n \n this.button.addEventListener('click', () => this.toggleRecording());\n this.options.container.appendChild(this.button);\n \n this.updateButton();\n }\n \n /**\n * Update button appearance and state\n */\n updateButton() {\n if (!this.button) return;\n \n const icon = this.isRecording ? '🔴' : '🎤';\n const text = this.isRecording ? 'Stop Listening' : 'Start Listening';\n \n this.button.innerHTML = `\n <span style=\"font-size: 20px;\">${icon}</span>\n <span>${text}</span>\n `;\n \n this.button.disabled = !this.isConnected;\n this.button.style.backgroundColor = this.isRecording ? '#dc3545' : \n this.isConnected ? '#007bff' : '#6c757d';\n }\n \n /**\n * Connect to voice server\n */\n async connect() {\n try {\n await this.voiceSDK.connect();\n } catch (error) {\n console.error('Failed to connect:', error);\n }\n }\n \n /**\n * Toggle recording\n */\n async toggleRecording() {\n if (!this.voiceSDK) return;\n \n try {\n await this.voiceSDK.toggleRecording();\n } catch (error) {\n console.error('Error toggling recording:', error);\n }\n }\n \n /**\n * Get current status\n */\n getStatus() {\n return {\n isConnected: this.isConnected,\n isRecording: this.isRecording,\n isPlaying: this.isPlaying\n };\n }\n \n /**\n * Update configuration\n */\n updateConfig(newConfig) {\n this.voiceSDK.updateConfig(newConfig);\n }\n \n /**\n * Destroy the button and cleanup\n */\n destroy() {\n if (this.button && this.button.parentNode) {\n this.button.parentNode.removeChild(this.button);\n }\n \n if (this.voiceSDK) {\n this.voiceSDK.destroy();\n }\n }\n}\n","/**\n * Legacy AgentSDK - Backward Compatibility Layer\n * \n * This maintains the original AgentSDK API while using the new VoiceSDK internally.\n * This ensures existing integrations continue to work without changes.\n */\n\nimport { VoiceSDK } from '../index.js';\n\nexport class AgentSDK {\n constructor(config) {\n console.log('🚀 AgentSDK v2.1.8 initialized with config:', config);\n this.config = config;\n this.voiceSDK = null;\n this.isConnected = false;\n this.isListening = false;\n \n // Legacy callback properties\n this.onConnected = () => {};\n this.onDisconnected = () => {};\n this.onError = (error) => console.error('SDK Error:', error);\n this.onTranscript = (text) => {};\n this.onAgentSpeaking = (isStart) => {};\n }\n\n async connect(signedUrl) {\n try {\n if (!signedUrl) {\n throw new Error('signedUrl is required');\n }\n \n // Clean up existing connection if any\n if (this.voiceSDK) {\n console.log('🔌 AgentSDK: Cleaning up existing connection');\n this.voiceSDK.destroy();\n this.voiceSDK = null;\n }\n \n // Create VoiceSDK instance\n this.voiceSDK = new VoiceSDK({\n websocketUrl: signedUrl,\n autoReconnect: false,\n agentId: this.config.agentId,\n appId: this.config.appId,\n language: this.config.language || 'en'\n });\n \n // Set up event handlers to map to legacy callbacks\n this.voiceSDK.on('connected', () => {\n this.isConnected = true;\n this.onConnected();\n });\n \n this.voiceSDK.on('disconnected', (event) => {\n this.isConnected = false;\n // Check if disconnect was due to domain whitelist violation\n if (event && event.code === 1008 && event.reason && \n (event.reason.includes('Domain not whitelisted') || \n event.reason.includes('domain') || \n event.reason.includes('whitelist'))) {\n const domainError = new Error('DOMAIN_NOT_WHITELISTED');\n domainError.reason = event.reason;\n domainError.code = event.code;\n this.onError(domainError);\n }\n this.onDisconnected();\n });\n \n this.voiceSDK.on('domainError', (error) => {\n this.onError(error);\n });\n \n this.voiceSDK.on('error', (error) => {\n this.onError(error);\n });\n \n this.voiceSDK.on('message', (message) => {\n this.handleWebSocketMessage(message);\n });\n \n this.voiceSDK.on('recordingStarted', () => {\n this.isListening = true;\n });\n \n this.voiceSDK.on('recordingStopped', () => {\n this.isListening = false;\n });\n \n this.voiceSDK.on('playbackStarted', () => {\n this.onAgentSpeaking(true);\n });\n \n this.voiceSDK.on('playbackStopped', () => {\n this.onAgentSpeaking(false);\n });\n \n // Connect using VoiceSDK\n await this.voiceSDK.connect();\n \n } catch (error) {\n this.onError(error);\n throw error;\n }\n }\n\n handleWebSocketMessage(message) {\n // Map new message format to legacy format\n switch (message.type) {\n case 'connected':\n console.log('Session started successfully');\n break;\n \n case 'user_transcript':\n this.onTranscript(message.user_transcription || message.text);\n break;\n \n case 'agent_response':\n // Handle agent text response\n break;\n \n case 'barge_in':\n // Handle barge-in\n break;\n \n case 'stop_playing':\n // Handle stop playing\n break;\n \n case 'error':\n this.onError(new Error(message.message));\n break;\n }\n }\n\n async startListening() {\n console.log('🎤 AgentSDK: startListening() called');\n if (this.voiceSDK) {\n try {\n console.log('🎤 AgentSDK: Starting recording...');\n await this.voiceSDK.startRecording();\n console.log('✅ AgentSDK: Recording started successfully');\n } catch (error) {\n console.error('❌ AgentSDK: Failed to start recording:', error);\n throw error;\n }\n } else {\n console.error('❌ AgentSDK: No voiceSDK instance available');\n throw new Error('No voiceSDK instance available');\n }\n }\n\n stopListening() {\n if (this.voiceSDK) {\n this.voiceSDK.stopRecording();\n }\n }\n\n updateVariables(variables) {\n if (this.voiceSDK && this.isConnected) {\n // Send variables update message\n this.voiceSDK.webSocketManager.sendMessage({\n t: 'update_variables',\n variables\n });\n }\n }\n\n disconnect() {\n if (this.voiceSDK) {\n this.voiceSDK.destroy();\n this.voiceSDK = null;\n }\n this.isConnected = false;\n this.isListening = false;\n }\n}\n","/**\n * VoiceInterface - Handles voice call UI and functionality\n * Part of the unified TTPChatWidget\n * Optimized for Wix iframe embedding\n */\n\nimport { AgentSDK } from '../index.js';\n\nexport class VoiceInterface {\n constructor(config) {\n this.config = config;\n this.audioStream = null;\n this.callStartTime = null;\n this.callTimerInterval = null;\n this.sdk = null;\n this.isActive = false;\n \n // Initialize AgentSDK for voice connection\n this.sdk = new AgentSDK({\n agentId: config.agentId,\n appId: config.appId,\n getSessionUrl: config.getSessionUrl,\n websocketUrl: config.websocketUrl,\n variables: config.variables || {},\n language: config.language || 'en'\n });\n \n // Setup SDK event handlers\n this.setupSDKEventHandlers();\n }\n \n /**\n * Setup event handlers for AgentSDK\n */\n setupSDKEventHandlers() {\n // Handle transcript updates\n this.sdk.onTranscript = (text) => {\n this.updateTranscript(text);\n };\n \n // Handle agent speaking state\n this.sdk.onAgentSpeaking = (isStart) => {\n const avatar = document.getElementById('voiceAvatarActive');\n if (avatar) {\n if (isStart) {\n avatar.classList.add('speaking');\n } else {\n avatar.classList.remove('speaking');\n }\n }\n };\n \n // Handle websocket disconnection - hangup the call\n this.sdk.onDisconnected = () => {\n console.log('🔌 WebSocket disconnected, hanging up call...');\n // Only hangup if call is still active (prevents duplicate calls)\n if (this.isActive) {\n // Set isActive to false first to prevent re-entry\n this.isActive = false;\n this.endVoiceCall();\n }\n };\n \n // Handle errors\n this.sdk.onError = (error) => {\n console.error('❌ Voice SDK Error:', error);\n // Check if it's a domain error\n if (error && (error.message === 'DOMAIN_NOT_WHITELISTED' || \n (error.message && error.message.includes('Domain not whitelisted')))) {\n this.showDomainError();\n } else {\n this.showError(error.message || error);\n }\n };\n }\n\n /**\n * Helper function to get translated text\n */\n t(key) {\n const lang = this.config.language || 'en';\n const translations = this.config.translations?.[lang] || this.config.translations?.en || {};\n return translations[key] || key;\n }\n\n getTooltip(key) {\n const tooltip = this.config.tooltips?.[key];\n if (tooltip !== null && tooltip !== undefined) return tooltip;\n // Use translations for default tooltips\n const defaults = {\n mute: this.t('mute'),\n speaker: this.t('speaker'),\n endCall: this.t('endCall')\n };\n return defaults[key] || '';\n }\n\n /**\n * Generate HTML for voice interface\n */\n generateHTML() {\n return `<div class=\"voice-interface\" id=\"voiceInterface\">\n <!-- Before Call State -->\n <div id=\"voiceIdleState\">\n <div class=\"voice-avatar\" id=\"voiceAvatar\">🤖</div>\n <div class=\"voice-status\">\n <div class=\"voice-status-title\">${this.t('clickToStartCall')}</div>\n <div class=\"voice-status-subtitle\">${this.t('realTimeVoice')}</div>\n </div>\n <button class=\"start-call-btn\" id=\"startCallBtn\">\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M20.01 15.38c-1.23 0-2.42-.2-3.53-.56-.35-.12-.74-.03-1.01.24l-1.57 1.97c-2.83-1.35-5.48-3.9-6.89-6.83l1.95-1.66c.27-.28.35-.67.24-1.02-.37-1.11-.56-2.3-.56-3.53 0-.54-.45-.99-.99-.99H4.19C3.65 3 3 3.24 3 3.99 3 13.28 10.73 21 20.01 21c.71 0 .99-.63.99-1.18v-3.45c0-.54-.45-.99-.99-.99z\"/>\n </svg>\n <span>${this.t('startCall')}</span>\n </button>\n </div>\n <!-- During Call State -->\n <div id=\"voiceActiveState\" style=\"display: none;\">\n <div class=\"voice-avatar-active\" id=\"voiceAvatarActive\">\n <div class=\"voice-rings\">\n <div class=\"voice-ring\"></div>\n <div class=\"voice-ring\"></div>\n <div class=\"voice-ring\"></div>\n </div>\n 🤖\n </div>\n <div class=\"voice-status\">\n <div class=\"voice-status-title\" id=\"voiceStatusTitleActive\">${this.t('listening')}</div>\n <div class=\"voice-status-subtitle\" id=\"voiceStatusSubtitleActive\">${this.t('speakFreely')}</div>\n </div>\n <div class=\"voice-transcript\">\n <div class=\"transcript-label\">${this.t('liveTranscript')}</div>\n <div class=\"transcript-text empty\" id=\"transcriptText\">\n ${this.t('transcriptWillAppear')}\n </div>\n </div>\n <div class=\"voice-controls\">\n <button class=\"voice-control-btn secondary\" id=\"muteBtn\" title=\"${this.getTooltip('mute')}\">\n <svg width=\"64\" height=\"64\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"mute-icon\">\n <path d=\"M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z\"/>\n <path d=\"M19 10v2a7 7 0 0 1-14 0v-2\"/>\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"23\"/>\n <line x1=\"8\" y1=\"23\" x2=\"16\" y2=\"23\"/>\n <line x1=\"2\" y1=\"2\" x2=\"22\" y2=\"22\" class=\"mute-cross\" style=\"display: none; stroke: #ef4444; stroke-width: 3.5;\"/>\n </svg>\n </button>\n <button class=\"voice-control-btn primary active\" id=\"endCallBtn\" title=\"${this.getTooltip('endCall')}\">\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 24 24\" fill=\"#ef4444\">\n <rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"2\"/>\n </svg>\n <div class=\"voice-timer\" id=\"voiceTimer\">00:00</div>\n </button>\n <button class=\"voice-control-btn secondary\" id=\"speakerBtn\" title=\"${this.getTooltip('speaker')}\">\n <svg width=\"64\" height=\"64\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polygon points=\"11 5 6 9 2 9 2 15 6 15 11 19 11 5\"/>\n <path d=\"M19.07 4.93a10 10 0 0 1 0 14.14\"/>\n <path d=\"M15.54 8.46a5 5 0 0 1 0 7.07\"/>\n </svg>\n </button>\n </div>\n </div>\n </div>`;\n }\n\n /**\n * Generate CSS for voice interface - Optimized for small heights\n */\n generateCSS() {\n const avatarBg = this.config.avatarBackgroundColor || '#667eea';\n const avatarActiveBg = this.config.avatarActiveBackgroundColor || this.config.avatarBackgroundColor || '#667eea';\n const statusTitleColor = this.config.statusTitleColor || '#1e293b';\n const statusSubtitleColor = this.config.statusSubtitleColor || '#64748b';\n const startCallBtnColor = this.config.startCallButtonColor || '#667eea';\n const startCallBtnTextColor = this.config.startCallButtonTextColor || '#FFFFFF';\n const transcriptBg = this.config.transcriptBackgroundColor || '#FFFFFF';\n const transcriptTextColor = this.config.transcriptTextColor || '#1e293b';\n const transcriptLabelColor = this.config.transcriptLabelColor || '#94a3b8';\n const controlBtnColor = this.config.controlButtonColor || '#FFFFFF';\n const controlBtnSecondaryColor = this.config.controlButtonSecondaryColor || '#64748b';\n const endCallBtnColor = this.config.endCallButtonColor || '#ef4444';\n \n return `\n /* Voice Interface Styles - Ultra-compact for Wix iframes */\n .voice-interface { \n display: none; \n flex: 1; \n flex-direction: column;\n align-items: center; \n justify-content: center; \n padding: 6px 10px 6px 10px; \n background: linear-gradient(180deg, #f8fafc 0%, #e0e7ff 100%);\n overflow: hidden;\n min-height: 0;\n height: 100%;\n width: 100%;\n box-sizing: border-box;\n }\n .voice-interface.active { display: flex; }\n \n /* Voice States - Better scaling gaps */\n #voiceIdleState,\n #voiceActiveState {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n height: 100%;\n min-height: 0;\n justify-content: center;\n overflow: hidden;\n flex: 1;\n box-sizing: border-box;\n gap: clamp(6px, 1.5vh, 12px);\n }\n \n #voiceActiveState[style*=\"display: none\"] {\n display: none !important;\n }\n \n /* Voice Avatar - Scales better from small to large */\n .voice-avatar,\n .voice-avatar-active {\n width: clamp(80px, 18vh, 160px);\n height: clamp(80px, 18vh, 160px);\n aspect-ratio: 1;\n border-radius: 50%;\n background: linear-gradient(135deg, ${avatarBg} 0%, ${avatarActiveBg} 100%);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: clamp(40px, 9vh, 80px);\n margin: 0;\n box-shadow: 0 8px 30px rgba(102, 126, 234, 0.3);\n transition: all 0.3s ease;\n flex-shrink: 1;\n position: relative;\n }\n \n .voice-avatar-active {\n animation: avatarPulse 2s ease-in-out infinite;\n }\n \n @keyframes avatarPulse {\n 0%, 100% { \n transform: scale(1);\n }\n 50% { \n transform: scale(1.05);\n }\n }\n \n .voice-avatar-active.speaking {\n animation: avatarSpeak 0.5s ease-in-out infinite;\n }\n \n @keyframes avatarSpeak {\n 0%, 100% { transform: scale(1); }\n 50% { transform: scale(1.08); }\n }\n \n /* Voice Rings Animation */\n .voice-rings {\n position: absolute;\n width: 100%;\n height: 100%;\n border-radius: 50%;\n }\n \n .voice-ring {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n border: 2px solid rgba(102, 126, 234, 0.3);\n border-radius: 50%;\n opacity: 0;\n animation: ringExpand 2s ease-out infinite;\n }\n \n .voice-ring:nth-child(2) { animation-delay: 0.5s; }\n .voice-ring:nth-child(3) { animation-delay: 1s; }\n \n @keyframes ringExpand {\n 0% {\n width: 100%;\n height: 100%;\n opacity: 0.6;\n }\n 100% {\n width: 160%;\n height: 160%;\n opacity: 0;\n }\n }\n \n /* Voice Status - Scales with container */\n .voice-status {\n text-align: center;\n margin: 0;\n flex-shrink: 1;\n min-height: 0;\n }\n \n .voice-status-title {\n font-size: clamp(12px, 3vh, 20px);\n font-weight: 600;\n color: ${statusTitleColor};\n margin-bottom: clamp(2px, 0.5vh, 4px);\n line-height: 1.2;\n }\n \n .voice-status-subtitle {\n font-size: clamp(10px, 2vh, 14px);\n color: ${statusSubtitleColor};\n line-height: 1.2;\n }\n \n /* Start Call Button - Scales with container */\n .start-call-btn {\n margin: 0;\n width: min(280px, 70vw);\n height: clamp(48px, 8vh, 64px);\n border-radius: clamp(24px, 4vh, 32px);\n border: none;\n background: ${startCallBtnColor};\n color: ${startCallBtnTextColor};\n font-size: clamp(14px, 2.5vh, 18px);\n font-weight: 600;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: clamp(8px, 1.5vh, 12px);\n box-shadow: 0 12px 30px rgba(102, 126, 234, 0.4);\n transition: all 0.3s ease;\n flex-shrink: 0;\n }\n \n .start-call-btn svg {\n width: clamp(22px, 4vh, 32px);\n height: clamp(22px, 4vh, 32px);\n }\n \n .start-call-btn:hover {\n transform: translateY(-2px);\n box-shadow: 0 12px 28px rgba(102, 126, 234, 0.5);\n }\n \n .start-call-btn:active {\n transform: translateY(-1px);\n }\n \n /* Voice Transcript - Scales with container */\n .voice-transcript {\n background: ${transcriptBg};\n padding: clamp(6px, 1.5vh, 12px);\n border-radius: 10px;\n width: min(360px, calc(100% - 40px));\n margin: 0;\n min-height: clamp(45px, 10vh, 80px);\n max-height: clamp(70px, 16vh, 110px);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);\n flex-shrink: 1;\n overflow-y: auto;\n overflow-x: hidden;\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n }\n \n .transcript-label {\n font-size: clamp(8px, 1.4vh, 11px);\n color: ${transcriptLabelColor};\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n margin-bottom: clamp(3px, 0.6vh, 6px);\n flex-shrink: 0;\n word-wrap: break-word;\n }\n \n .transcript-text {\n font-size: clamp(11px, 2vh, 15px);\n color: ${transcriptTextColor};\n line-height: 1.4;\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n word-wrap: break-word;\n overflow-wrap: break-word;\n }\n \n .transcript-text.empty {\n color: #cbd5e1;\n font-style: italic;\n }\n \n /* Voice Controls - Scales with container */\n .voice-controls {\n display: flex;\n gap: clamp(8px, 1.8vh, 14px);\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n margin: 0;\n padding-top: clamp(5px, 1.2vh, 10px);\n }\n \n .voice-control-btn {\n width: clamp(48px, 9vh, 72px);\n height: clamp(48px, 9vh, 72px);\n aspect-ratio: 1;\n border-radius: 50%;\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s;\n position: relative;\n flex-shrink: 0;\n }\n \n .voice-control-btn svg {\n width: 48%;\n height: 48%;\n }\n \n .voice-control-btn.primary {\n width: clamp(54px, 10vh, 80px);\n height: clamp(54px, 10vh, 80px);\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n box-shadow: 0 6px 18px rgba(102, 126, 234, 0.4);\n }\n \n .voice-control-btn.primary:hover {\n transform: scale(1.05);\n }\n \n .voice-control-btn.primary.active {\n background: white;\n animation: recordingPulse 1.5s ease-in-out infinite;\n }\n \n @keyframes recordingPulse {\n 0%, 100% { \n box-shadow: 0 6px 16px rgba(239, 68, 68, 0.4);\n }\n 50% { \n box-shadow: 0 6px 24px rgba(239, 68, 68, 0.7);\n }\n }\n \n .voice-control-btn.secondary {\n background: ${controlBtnColor};\n color: ${controlBtnSecondaryColor};\n box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1);\n }\n \n .voice-control-btn.secondary:hover {\n background: #f8fafc;\n transform: scale(1.05);\n }\n \n .voice-control-btn.secondary.muted {\n background: #f3f4f6;\n }\n \n .voice-control-btn.secondary.muted .mute-icon {\n stroke: #9ca3af !important;\n }\n \n .voice-timer {\n position: absolute;\n bottom: clamp(-18px, -3vh, -24px);\n font-size: clamp(9px, 1.6vh, 12px);\n color: #64748b;\n font-weight: 500;\n white-space: nowrap;\n }\n \n /* Mobile optimization */\n @media (max-width: 768px) {\n .voice-interface {\n padding: 6px 10px;\n }\n }\n \n @media (max-width: 480px) {\n .voice-interface {\n padding: 5px 8px;\n }\n }\n `;\n }\n\n /**\n * Setup event handlers for voice interface\n */\n setupEventHandlers(callbacks) {\n const startCallBtn = document.getElementById('startCallBtn');\n const endCallBtn = document.getElementById('endCallBtn');\n const muteBtn = document.getElementById('muteBtn');\n const speakerBtn = document.getElementById('speakerBtn');\n \n if (startCallBtn) {\n startCallBtn.onclick = () => this.startVoiceCall();\n }\n if (endCallBtn) {\n endCallBtn.onclick = () => this.endVoiceCall();\n }\n if (muteBtn) {\n muteBtn.onclick = () => this.toggleMute();\n }\n if (speakerBtn) {\n speakerBtn.onclick = () => this.toggleSpeaker();\n }\n \n // Adjust sizes when the interface first loads - with retries and longer delays\n const tryAdjustSizes = (attempt = 0) => {\n const voiceInterface = document.getElementById('voiceInterface');\n if (voiceInterface && voiceInterface.classList.contains('active') && voiceInterface.clientHeight > 100) {\n console.log('✅ Interface is active and has proper dimensions, adjusting sizes (attempt', attempt + 1, ')');\n this.adjustSizesForContainer();\n \n // Do one more adjustment after a short delay to ensure everything is rendered\n if (attempt === 0) {\n setTimeout(() => this.adjustSizesForContainer(), 500);\n }\n } else if (attempt < 15) {\n console.log('⏳ Interface not ready yet (height:', voiceInterface?.clientHeight, '), retrying... (attempt', attempt + 1, ')');\n setTimeout(() => tryAdjustSizes(attempt + 1), 250);\n } else {\n console.warn('⚠️ Interface never became fully ready, adjusting sizes anyway');\n this.adjustSizesForContainer();\n }\n };\n \n setTimeout(() => tryAdjustSizes(), 200);\n \n // Also adjust on window resize\n window.addEventListener('resize', () => {\n console.log('🔄 Window resized, re-adjusting sizes');\n this.adjustSizesForContainer();\n });\n }\n\n /**\n * Get signed URL for WebSocket connection\n */\n async getSignedUrl() {\n // If getSessionUrl is not provided, construct URL directly from agentId and appId\n if (!this.config.getSessionUrl) {\n if (!this.config.agentId) {\n throw new Error('agentId is required');\n }\n \n // Build WebSocket URL directly\n const baseUrl = this.config.websocketUrl || 'wss://speech.talktopc.com/ws/conv';\n const params = new URLSearchParams();\n params.append('agentId', this.config.agentId);\n \n if (this.config.appId) {\n params.append('appId', this.config.appId);\n }\n \n // Add demo flag if in development\n if (this.config.demo !== false) {\n params.append('demo', 'true');\n }\n \n return `${baseUrl}?${params.toString()}`;\n }\n \n // Handle getSessionUrl as string (backend URL)\n if (typeof this.config.getSessionUrl === 'string') {\n const requestBody = {\n agentId: this.config.agentId,\n variables: this.config.variables || {}\n };\n \n // Add appId if provided in config\n if (this.config.appId) {\n requestBody.appId = this.config.appId;\n }\n \n const response = await fetch(this.config.getSessionUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestBody)\n });\n\n if (!response.ok) {\n throw new Error(`Failed to get session URL: ${response.statusText}`);\n }\n\n const data = await response.json();\n return data.signedUrl || data.wsUrl || data.url;\n }\n \n // Handle getSessionUrl as function\n else if (typeof this.config.getSessionUrl === 'function') {\n const params = {\n agentId: this.config.agentId,\n variables: this.config.variables || {}\n };\n \n // Add appId if provided in config\n if (this.config.appId) {\n params.appId = this.config.appId;\n }\n \n const result = await this.config.getSessionUrl(params);\n \n return typeof result === 'string' ? result : (result.signedUrl || result.wsUrl || result.url);\n }\n \n else {\n throw new Error('getSessionUrl must be a string (backend URL), a function, or omitted (for direct connection with agentId/appId)');\n }\n }\n\n /**\n * Adjust UI sizes based on container height\n */\n adjustSizesForContainer() {\n const voiceInterface = document.getElementById('voiceInterface');\n if (!voiceInterface) {\n console.warn('⚠️ voiceInterface not found, skipping size adjustment');\n return;\n }\n \n const containerHeight = voiceInterface.clientHeight;\n const containerWidth = voiceInterface.clientWidth;\n \n console.log('📏 Container size:', containerHeight, 'x', containerWidth);\n \n // Check if we have visible elements\n const idleState = document.getElementById('voiceIdleState');\n const activeState = document.getElementById('voiceActiveState');\n const isIdleVisible = idleState && idleState.style.display !== 'none';\n const isActiveVisible = activeState && activeState.style.display !== 'none';\n \n console.log('👁️ Visible state - Idle:', isIdleVisible, 'Active:', isActiveVisible);\n \n // Calculate sizes ensuring everything fits\n // Total height = padding + gaps + avatar + status + transcript + controls\n const padding = 12; // top + bottom padding\n const gapsCount = 4; // gaps between elements\n \n let avatarSize, avatarFontSize, titleSize, subtitleSize, statusHeight, transcriptHeight, buttonSize, primaryButtonSize, gapSize;\n \n if (containerHeight <= 350) {\n // Very small - ultra compact\n gapSize = 5;\n avatarSize = 70;\n avatarFontSize = 35;\n titleSize = 11;\n subtitleSize = 9;\n statusHeight = 32;\n transcriptHeight = 45;\n buttonSize = 42;\n primaryButtonSize = 48;\n } else if (containerHeight <= 450) {\n // Small (400-420px) - BIGGER AVATAR for 500px Wix height\n gapSize = 7;\n avatarSize = 110; // Increased from 85 to 110\n avatarFontSize = 55; // Increased from 42 to 55\n titleSize = 15; // Increased from 13\n subtitleSize = 11; // Increased from 10\n statusHeight = 38;\n transcriptHeight = 58; // Slightly reduced\n buttonSize = 52; // Increased from 48\n primaryButtonSize = 58; // Increased from 54\n } else if (containerHeight <= 550) {\n // Medium (500px) - BIGGER ROBOT\n gapSize = 8;\n avatarSize = 140; // Increased from 110 to 140\n avatarFontSize = 70; // Increased from 55 to 70\n titleSize = 16; // Increased from 15\n subtitleSize = 12; // Increased from 11\n statusHeight = 42;\n transcriptHeight = 68; // Reduced slightly to compensate for bigger robot\n buttonSize = 56; // Increased from 54\n primaryButtonSize = 64; // Increased from 62\n } else if (containerHeight <= 700) {\n // Medium-Large (600px)\n gapSize = 10;\n avatarSize = 130;\n avatarFontSize = 65;\n titleSize = 18;\n subtitleSize = 13;\n statusHeight = 46;\n transcriptHeight = 85;\n buttonSize = 60;\n primaryButtonSize = 70;\n } else {\n // Large (700+)\n gapSize = 12;\n avatarSize = 150;\n avatarFontSize = 75;\n titleSize = 20;\n subtitleSize = 14;\n statusHeight = 50;\n transcriptHeight = 100;\n buttonSize = 66;\n primaryButtonSize = 76;\n }\n \n // Apply gap size\n const stateContainers = document.querySelectorAll('#voiceIdleState, #voiceActiveState');\n stateContainers.forEach(container => {\n container.style.gap = `${gapSize}px`;\n });\n \n // Apply sizes to avatar\n const avatars = document.querySelectorAll('.voice-avatar, .voice-avatar-active');\n console.log('🤖 Found', avatars.length, 'avatars, setting size to', avatarSize, 'px');\n avatars.forEach(avatar => {\n avatar.style.width = `${avatarSize}px`;\n avatar.style.height = `${avatarSize}px`;\n avatar.style.fontSize = `${avatarFontSize}px`;\n });\n \n // Apply sizes to status text\n const statusTitle = document.querySelectorAll('.voice-status-title');\n statusTitle.forEach(el => el.style.fontSize = `${titleSize}px`);\n \n const statusSubtitle = document.querySelectorAll('.voice-status-subtitle');\n statusSubtitle.forEach(el => el.style.fontSize = `${subtitleSize}px`);\n \n // Apply sizes to transcript\n const transcript = document.querySelector('.voice-transcript');\n if (transcript) {\n transcript.style.minHeight = `${transcriptHeight}px`;\n transcript.style.maxHeight = `${transcriptHeight}px`;\n transcript.style.height = `${transcriptHeight}px`;\n transcript.style.width = `min(360px, ${containerWidth - 40}px)`; // Ensure it doesn't overflow\n transcript.style.boxSizing = 'border-box';\n }\n \n const transcriptLabel = document.querySelector('.transcript-label');\n if (transcriptLabel) {\n transcriptLabel.style.fontSize = `${Math.max(8, titleSize - 4)}px`;\n }\n \n const transcriptText = document.querySelector('.transcript-text');\n if (transcriptText) {\n transcriptText.style.fontSize = `${Math.max(10, titleSize - 2)}px`;\n }\n \n // Apply sizes to control buttons\n const secondaryButtons = document.querySelectorAll('.voice-control-btn.secondary');\n secondaryButtons.forEach(btn => {\n btn.style.width = `${buttonSize}px`;\n btn.style.height = `${buttonSize}px`;\n \n // Scale the SVG icon inside the button - much bigger!\n const svg = btn.querySelector('svg');\n if (svg) {\n const iconSize = buttonSize * 0.65; // Increased from 50% to 65%\n svg.style.setProperty('width', `${iconSize}px`, 'important');\n svg.style.setProperty('height', `${iconSize}px`, 'important');\n svg.style.setProperty('min-width', `${iconSize}px`, 'important');\n svg.style.setProperty('min-height', `${iconSize}px`, 'important');\n }\n });\n \n const primaryButton = document.querySelector('.voice-control-btn.primary');\n if (primaryButton) {\n primaryButton.style.width = `${primaryButtonSize}px`;\n primaryButton.style.height = `${primaryButtonSize}px`;\n \n // Scale the SVG icon inside the primary button - much bigger!\n const svg = primaryButton.querySelector('svg');\n if (svg) {\n const iconSize = primaryButtonSize * 0.70; // Increased from 55% to 70%\n svg.style.setProperty('width', `${iconSize}px`, 'important');\n svg.style.setProperty('height', `${iconSize}px`, 'important');\n svg.style.setProperty('min-width', `${iconSize}px`, 'important');\n svg.style.setProperty('min-height', `${iconSize}px`, 'important');\n }\n }\n \n // Apply to start call button\n const startCallBtn = document.querySelector('.start-call-btn');\n if (startCallBtn) {\n let btnHeight, btnFontSize;\n if (containerHeight <= 350) {\n btnHeight = 48;\n btnFontSize = 14;\n } else if (containerHeight <= 450) {\n btnHeight = 52;\n btnFontSize = 15;\n } else if (containerHeight <= 550) {\n btnHeight = 58; // Bigger button at 500px\n btnFontSize = 17;\n } else if (containerHeight <= 700) {\n btnHeight = 62;\n btnFontSize = 18;\n } else {\n btnHeight = 64;\n btnFontSize = 18;\n }\n startCallBtn.style.height = `${btnHeight}px`;\n startCallBtn.style.fontSize = `${btnFontSize}px`;\n \n // Also adjust the SVG icon size in the button\n const btnIcon = startCallBtn.querySelector('svg');\n if (btnIcon) {\n const iconSize = Math.max(22, btnHeight * 0.5);\n btnIcon.style.width = `${iconSize}px`;\n btnIcon.style.height = `${iconSize}px`;\n }\n }\n \n console.log('✅ Sizes adjusted - Avatar:', avatarSize, 'Status:', statusHeight, 'Transcript:', transcriptHeight, 'Buttons:', buttonSize);\n }\n\n /**\n * Start voice call\n */\n async startVoiceCall() {\n if (this.isActive) {\n console.log('⚠️ Voice call already active');\n return;\n }\n \n console.log('🎤 Starting voice call...');\n \n try {\n // Hide idle state, show active state\n const idleState = document.getElementById('voiceIdleState');\n const activeState = document.getElementById('voiceActiveState');\n const voiceInterface = document.getElementById('voiceInterface');\n \n if (idleState) idleState.style.display = 'none';\n if (activeState) activeState.style.display = 'flex';\n \n // Adjust sizes based on container dimensions\n setTimeout(() => this.adjustSizesForContainer(), 50);\n \n // Prevent any scrolling when switching states\n if (voiceInterface) {\n voiceInterface.scrollTop = 0;\n }\n \n // Get signed URL and connect\n const signedUrl = await this.getSignedUrl();\n console.log('🔗 Got signed URL:', signedUrl);\n \n const connected = await this.sdk.connect(signedUrl);\n console.log('✅ Connected to WebSocket, connected:', connected);\n \n // Wait for connection to be fully ready (for hello message exchange)\n let attempts = 0;\n while (!this.sdk.isConnected && attempts < 50) {\n await new Promise(resolve => setTimeout(resolve, 100));\n attempts++;\n }\n \n if (this.sdk.isConnected) {\n console.log('✅ WebSocket ready, starting listening...');\n await this.sdk.startListening();\n console.log('🎤 Started listening');\n \n this.isActive = true;\n \n // Start timer\n this.callStartTime = Date.now();\n this.callTimerInterval = setInterval(() => {\n const elapsed = Date.now() - this.callStartTime;\n const minutes = Math.floor(elapsed / 60000);\n const seconds = Math.floor((elapsed % 60000) / 1000);\n const timerEl = document.getElementById('voiceTimer');\n if (timerEl) {\n timerEl.textContent = `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n }\n }, 1000);\n } else {\n console.warn('⚠️ Connection not fully ready, but trying to start listening anyway...');\n await this.sdk.startListening();\n console.log('🎤 Started listening');\n \n this.isActive = true;\n \n // Start timer\n this.callStartTime = Date.now();\n this.callTimerInterval = setInterval(() => {\n const elapsed = Date.now() - this.callStartTime;\n const minutes = Math.floor(elapsed / 60000);\n const seconds = Math.floor((elapsed % 60000) / 1000);\n const timerEl = document.getElementById('voiceTimer');\n if (timerEl) {\n timerEl.textContent = `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n }\n }, 1000);\n }\n \n console.log('✅ Voice call started successfully');\n \n } catch (error) {\n console.error('❌ Error starting voice call:', error);\n this.showError(error.message || error);\n \n // Reset UI state on error\n const idleState = document.getElementById('voiceIdleState');\n const activeState = document.getElementById('voiceActiveState');\n if (idleState) idleState.style.display = 'flex';\n if (activeState) activeState.style.display = 'none';\n }\n }\n\n /**\n * End voice call\n */\n endVoiceCall() {\n console.log('🔴 Ending voice call...');\n \n // Stop listening and disconnect\n if (this.sdk && this.isActive) {\n this.sdk.stopListening();\n this.sdk.disconnect();\n this.isActive = false;\n }\n \n // Stop audio stream (if any)\n if (this.audioStream) {\n this.audioStream.getTracks().forEach(track => track.stop());\n this.audioStream = null;\n }\n \n // Stop timer\n if (this.callTimerInterval) {\n clearInterval(this.callTimerInterval);\n this.callTimerInterval = null;\n }\n \n // Show idle state, hide active state\n const idleState = document.getElementById('voiceIdleState');\n const activeState = document.getElementById('voiceActiveState');\n \n if (idleState) idleState.style.display = 'flex';\n if (activeState) activeState.style.display = 'none';\n \n // Re-adjust sizes for idle state\n setTimeout(() => this.adjustSizesForContainer(), 50);\n \n // Reset transcript\n const transcriptEl = document.getElementById('transcriptText');\n if (transcriptEl) {\n transcriptEl.textContent = this.t('transcriptWillAppear');\n transcriptEl.classList.add('empty');\n }\n \n // Remove speaking state from avatar\n const avatar = document.getElementById('voiceAvatarActive');\n if (avatar) {\n avatar.classList.remove('speaking');\n }\n \n console.log('✅ Voice call ended');\n }\n \n /**\n * Update transcript text\n */\n updateTranscript(text) {\n const transcriptEl = document.getElementById('transcriptText');\n if (transcriptEl) {\n transcriptEl.textContent = text;\n transcriptEl.classList.remove('empty');\n }\n }\n \n /**\n * Show error message\n */\n showError(message) {\n const transcriptEl = document.getElementById('transcriptText');\n if (transcriptEl) {\n transcriptEl.textContent = `${this.t('error')}: ${message}`;\n transcriptEl.classList.remove('empty');\n }\n }\n \n /**\n * Show domain validation error\n */\n showDomainError() {\n const transcriptEl = document.getElementById('transcriptText');\n if (transcriptEl) {\n const title = this.t('domainNotValidated');\n const message = this.t('domainErrorMessage');\n transcriptEl.innerHTML = `<div style=\"font-weight: 600; font-size: 16px; margin-bottom: 8px; color: #991B1B;\">${title}</div><div style=\"font-size: 14px; color: #991B1B; line-height: 1.5;\">${message}</div>`;\n transcriptEl.classList.remove('empty');\n }\n }\n\n /**\n * Toggle mute state\n */\n toggleMute() {\n if (!this.sdk || !this.isActive) {\n return;\n }\n \n // Access the audio recorder's media stream through VoiceSDK\n let audioTrack = null;\n if (this.sdk.voiceSDK && this.sdk.voiceSDK.audioRecorder && this.sdk.voiceSDK.audioRecorder.mediaStream) {\n audioTrack = this.sdk.voiceSDK.audioRecorder.mediaStream.getAudioTracks()[0];\n }\n \n // Fallback to stored audioStream if available\n if (!audioTrack && this.audioStream) {\n audioTrack = this.audioStream.getAudioTracks()[0];\n }\n \n if (audioTrack) {\n audioTrack.enabled = !audioTrack.enabled;\n \n const muteBtn = document.getElementById('muteBtn');\n const muteIcon = muteBtn?.querySelector('.mute-icon');\n const muteCross = muteBtn?.querySelector('.mute-cross');\n \n if (muteBtn && muteIcon && muteCross) {\n if (!audioTrack.enabled) {\n // Muted state: gray color and show cross\n muteIcon.style.stroke = '#9ca3af'; // gray color\n muteCross.style.display = 'block';\n muteBtn.classList.add('muted');\n } else {\n // Unmuted state: normal color and hide cross\n muteIcon.style.stroke = '';\n muteCross.style.display = 'none';\n muteBtn.classList.remove('muted');\n }\n }\n \n console.log(audioTrack.enabled ? '🔊 Unmuted' : '🔇 Muted');\n } else {\n console.warn('⚠️ No audio track available for mute toggle');\n }\n }\n\n /**\n * Toggle speaker (placeholder)\n */\n toggleSpeaker() {\n // Speaker toggle logic (placeholder)\n console.log('🔊 Speaker toggle');\n }\n\n /**\n * Cleanup resources\n */\n destroy() {\n // End call if active\n if (this.isActive) {\n this.endVoiceCall();\n }\n \n // Clean up voice call resources\n if (this.audioStream) {\n this.audioStream.getTracks().forEach(track => track.stop());\n this.audioStream = null;\n }\n if (this.callTimerInterval) {\n clearInterval(this.callTimerInterval);\n this.callTimerInterval = null;\n }\n \n // Disconnect SDK\n if (this.sdk) {\n this.sdk.disconnect();\n this.sdk = null;\n }\n }\n}","/**\n * TextInterface - Handles text chat UI and functionality\n * Part of the unified TTPChatWidget\n */\n\nexport class TextInterface {\n constructor(config, sdk) {\n this.config = config;\n this.sdk = sdk;\n this.streamingEl = null;\n this.hasStartedStreaming = false;\n this.isActive = false;\n // Store event handlers to allow cleanup\n this.eventHandlers = {\n autoResize: null,\n keydown: null\n };\n // Track if event handlers are already set up to avoid unnecessary re-initialization\n this.eventHandlersSetup = false;\n }\n\n // Helper function to get translated text\n t(key) {\n const lang = this.config.language || 'en';\n const translations = this.config.translations?.[lang] || this.config.translations?.en || {};\n return translations[key] || key;\n }\n\n /**\n * Generate HTML for text interface\n */\n generateHTML() {\n // Use text config, fallback to panel config, then translation, then default\n const inputPlaceholder = this.config.inputPlaceholder || \n this.config.panel?.inputPlaceholder || \n this.t('typeMessage') || \n 'Type your message...';\n return `<div class=\"text-interface\" id=\"textInterface\">\n <div class=\"messages-container\" id=\"messagesContainer\">\n <div class=\"empty-state\">\n <div class=\"empty-state-icon\">💬</div>\n <div class=\"empty-state-title\">${this.t('hello')}</div>\n <div class=\"empty-state-text\">${this.t('sendMessage')}</div>\n </div>\n </div>\n <div class=\"input-container\">\n <div class=\"input-wrapper\" style=\"flex:1;\">\n <textarea class=\"message-input\" id=\"messageInput\" placeholder=\"${inputPlaceholder}\" rows=\"1\" dir=\"${this.config.direction || 'ltr'}\"></textarea>\n </div>\n <button class=\"send-button\" id=\"sendButton\" aria-label=\"${this.t('sendMessageAria')}\">${this.config.sendButtonText || '➤'}</button>\n ${(this.config.sendButtonHint?.text || this.config.panel?.sendButtonHint?.text) ? `\n <div class=\"send-button-hint\" style=\"color: ${this.config.sendButtonHint?.color || this.config.panel?.sendButtonHint?.color || '#6B7280'}; font-size: ${this.config.sendButtonHint?.fontSize || this.config.panel?.sendButtonHint?.fontSize || '12px'}; text-align: center; margin-top: 4px;\">\n ${this.config.sendButtonHint?.text || this.config.panel?.sendButtonHint?.text}\n </div>\n ` : ''}\n </div>\n </div>`;\n }\n\n /**\n * Generate CSS for text interface\n */\n generateCSS() {\n const messages = this.config.messages;\n const panel = this.config.panel;\n const anim = this.config.animation;\n \n // Use text config, fallback to panel config for backward compatibility\n const sendButtonColor = this.config.sendButtonColor || this.config.panel?.sendButtonColor || '#7C3AED'; // Purple default\n const sendButtonHoverColor = this.config.sendButtonHoverColor || this.config.panel?.sendButtonHoverColor || '#6D28D9';\n const sendButtonTextColor = this.config.sendButtonTextColor || this.config.panel?.sendButtonTextColor || '#FFFFFF';\n const inputPlaceholder = this.config.inputPlaceholder || this.config.panel?.inputPlaceholder || 'Type your message...';\n const inputBorderColor = this.config.inputBorderColor || this.config.panel?.inputBorderColor || '#E5E7EB';\n const inputFocusColor = this.config.inputFocusColor || this.config.panel?.inputFocusColor || '#7C3AED'; // Purple default\n const inputBackgroundColor = this.config.inputBackgroundColor || this.config.panel?.inputBackgroundColor || '#FFFFFF';\n const inputTextColor = this.config.inputTextColor || this.config.panel?.inputTextColor || '#1F2937';\n const inputFontSize = this.config.inputFontSize || this.config.panel?.inputFontSize || '14px';\n const inputBorderRadius = this.config.inputBorderRadius || this.config.panel?.inputBorderRadius || 20;\n const inputPadding = this.config.inputPadding || this.config.panel?.inputPadding || '6px 14px';\n \n return `\n /* Messages container using new classes */\n #messagesContainer { \n flex: 1; \n overflow-y: auto; \n overflow-x: hidden; \n padding: 20px; \n background: #f8fafc; \n display: flex; \n flex-direction: column; \n gap: 16px; \n min-height: 0; \n }\n .empty-state { \n flex: 1; \n display: flex; \n flex-direction: column; \n align-items: center; \n justify-content: center; \n gap: 12px; \n color: #64748b; \n text-align: center; \n padding: 20px; \n }\n .empty-state-icon { font-size: 48px; opacity: 0.3; }\n .empty-state-title { font-size: 20px; font-weight: 700; color: #334155; }\n .empty-state-text { font-size: 13px; max-width: 280px; }\n\n .text-interface { \n display: none; \n flex: 1; \n flex-direction: column; \n min-height: 0; \n overflow: hidden; \n }\n .text-interface.active { display: flex; }\n \n .message { \n display: flex; \n gap: 8px; \n padding: 4px 0; \n max-width: 100%; \n align-items: center; \n }\n .message.edge-left { flex-direction: row; }\n .message.edge-right { flex-direction: row-reverse; }\n .message-bubble { \n padding: 12px; \n border-radius: ${messages.borderRadius}px; \n max-width: 80%; \n font-size: ${messages.fontSize}; \n color: ${messages.textColor}; \n word-wrap: break-word; \n text-align: ${this.config.direction === 'rtl' ? 'right' : 'left'}; \n direction: ${this.config.direction || 'ltr'};\n }\n .message.user { \n background: ${messages.userBackgroundColor}; \n align-self: ${this.config.direction === 'rtl' ? 'flex-start' : 'flex-end'}; \n }\n .message.agent { \n background: ${messages.agentBackgroundColor}; \n align-self: ${this.config.direction === 'rtl' ? 'flex-end' : 'flex-start'}; \n }\n .message .message-bubble { \n text-align: ${this.config.direction === 'rtl' ? 'right' : 'left'} !important; \n }\n ${this.config.direction === 'rtl' ? `\n .message-bubble {\n text-align: right !important;\n }\n ` : ''}\n .message-avatar { \n width: 20px; \n height: 20px; \n display: flex; \n align-items: center; \n justify-content: center; \n flex-shrink: 0; \n color: inherit; \n font-size: 18px; \n line-height: 1; \n background: transparent; \n border: none; \n }\n .message-avatar.user { background: transparent; }\n .message-avatar.agent { background: transparent; }\n \n .message.system {\n background: ${messages.systemBackgroundColor};\n align-self: flex-start;\n }\n .message.error {\n background: ${messages.errorBackgroundColor};\n align-self: flex-start;\n }\n \n .input-container {\n display: flex;\n gap: 8px;\n padding: 12px 16px;\n background: #FFFFFF;\n border-top: 1px solid #E5E7EB;\n align-items: center;\n flex-shrink: 0;\n flex-direction: ${this.config.direction === 'rtl' ? 'row-reverse' : 'row'};\n }\n \n .input-wrapper {\n position: relative;\n display: flex;\n align-items: center;\n }\n \n .message-input {\n width: 100%;\n min-height: 32px;\n max-height: 120px;\n padding: ${inputPadding};\n border: 1px solid ${inputBorderColor};\n border-radius: ${inputBorderRadius}px;\n font-size: ${inputFontSize};\n font-family: inherit;\n line-height: 1.3;\n resize: none;\n overflow-y: auto;\n background: ${inputBackgroundColor};\n color: ${inputTextColor};\n vertical-align: top;\n margin: 0;\n display: block;\n white-space: pre-wrap;\n word-wrap: break-word;\n text-align: ${this.config.direction === 'rtl' ? 'right' : 'left'};\n direction: ${this.config.direction || 'ltr'};\n -webkit-appearance: none;\n appearance: none;\n box-sizing: border-box;\n }\n \n .message-input:focus {\n outline: none;\n border-color: ${inputFocusColor};\n background: ${inputBackgroundColor === '#FFFFFF' ? '#FFFFFF' : inputBackgroundColor};\n box-shadow: 0 0 0 3px ${inputFocusColor}33;\n }\n \n .message-input::placeholder {\n color: #9CA3AF;\n text-align: ${this.config.direction === 'rtl' ? 'right' : 'left'};\n }\n \n .send-button {\n width: 40px;\n height: 40px;\n border-radius: 50%;\n border: none;\n background: ${sendButtonColor};\n color: ${sendButtonTextColor};\n font-size: ${this.config.sendButtonFontSize || this.config.panel?.sendButtonFontSize || '18px'};\n font-weight: ${this.config.sendButtonFontWeight || this.config.panel?.sendButtonFontWeight || '500'};\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.2s ease;\n box-shadow: 0 4px 12px rgba(124, 60, 237, 0.3);\n }\n \n .send-button:hover:not(:disabled) {\n background: ${sendButtonHoverColor};\n transform: scale(1.05);\n box-shadow: 0 6px 16px rgba(124, 60, 237, 0.4);\n }\n \n .send-button-hint {\n width: 100%;\n text-align: center;\n margin-top: 4px;\n }\n \n .send-button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n \n .typing-indicator {\n display: inline-flex;\n gap: 4px;\n align-items: center;\n }\n \n .typing-dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: #64748b;\n animation: typingDot 1.4s ease-in-out infinite;\n }\n \n .typing-dot:nth-child(2) { animation-delay: 0.2s; }\n .typing-dot:nth-child(3) { animation-delay: 0.4s; }\n \n @keyframes typingDot {\n 0%, 60%, 100% { transform: translateY(0); opacity: 0.7; }\n 30% { transform: translateY(-8px); opacity: 1; }\n }\n \n .error-message {\n padding: 12px;\n background: ${messages.errorBackgroundColor};\n border-radius: ${messages.borderRadius}px;\n color: #991B1B;\n font-size: ${messages.fontSize};\n margin: 8px 0;\n }\n \n @media (max-width: 768px) {\n #messagesContainer {\n padding: 12px;\n gap: 12px;\n }\n \n .message-bubble {\n max-width: 85%;\n font-size: 14px;\n padding: 10px;\n }\n \n .text-input-container {\n padding: 10px;\n gap: 8px;\n }\n \n #text-chat-input {\n font-size: 16px !important; /* Prevents iOS zoom on focus */\n padding: 10px 14px;\n min-height: 44px;\n }\n \n #text-chat-send {\n min-width: 56px;\n min-height: 44px;\n width: 56px;\n height: 44px;\n }\n \n .empty-state-icon {\n font-size: 40px;\n }\n \n .empty-state-title {\n font-size: 18px;\n }\n \n .empty-state-text {\n font-size: 12px;\n }\n }\n \n @media (max-width: 480px) {\n #messagesContainer {\n padding: 10px;\n gap: 10px;\n }\n \n .message-bubble {\n max-width: 90%;\n font-size: 13px;\n padding: 8px;\n }\n \n .text-input-container {\n padding: 8px;\n }\n \n #text-chat-input {\n font-size: 16px !important;\n padding: 8px 12px;\n }\n }\n `;\n }\n\n /**\n * Setup event handlers for text interface\n */\n setupEventHandlers() {\n const sendButton = document.getElementById('sendButton');\n const inputField = document.getElementById('messageInput');\n const newChatBtn = document.getElementById('newChatBtn');\n \n if (sendButton) sendButton.onclick = () => this.sendMessage();\n if (newChatBtn) newChatBtn.onclick = () => this.startNewChat();\n \n // Update placeholder and direction when config changes\n this.updateInputAttributes();\n \n // Send on Enter key, auto-resize textarea, and keep cursor visible\n if (inputField) {\n // Set initial height\n inputField.style.height = '32px';\n inputField.style.overflow = 'hidden';\n \n // Auto-resize textarea as user types\n const autoResize = () => {\n inputField.style.height = 'auto';\n const newHeight = Math.min(inputField.scrollHeight, 120);\n inputField.style.height = newHeight + 'px';\n inputField.style.overflowY = newHeight >= 120 ? 'auto' : 'hidden';\n \n // When at max height with overflow, scroll to bottom to keep cursor visible\n if (newHeight >= 120) {\n // Small delay to ensure height is applied first\n setTimeout(() => {\n inputField.scrollTop = inputField.scrollHeight;\n }, 0);\n }\n };\n \n inputField.addEventListener('input', autoResize);\n \n inputField.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n this.sendMessage();\n } else if (e.key === 'Enter' && e.shiftKey) {\n // Allow Enter with Shift for new line, resize after\n setTimeout(autoResize, 0);\n }\n });\n }\n }\n\n /**\n * Start new chat\n */\n startNewChat() {\n try { \n localStorage.removeItem('ttp_text_chat_conversation_id'); \n } catch (_) {}\n \n if (this.sdk) {\n this.sdk.config.conversationId = null;\n }\n \n // Reset UI messages to empty state\n const container = document.getElementById('messagesContainer');\n if (container) {\n container.innerHTML = `\n <div class=\"empty-state\">\n <div class=\"empty-state-icon\">💬</div>\n <div class=\"empty-state-title\">${this.t('hello')}</div>\n <div class=\"empty-state-text\">${this.t('sendMessage')}</div>\n </div>`;\n }\n \n // Focus message input\n const input = document.getElementById('messageInput');\n if (input) input.focus();\n }\n\n /**\n * Update input attributes (placeholder, direction) when config changes\n */\n updateInputAttributes() {\n const inputField = document.getElementById('messageInput');\n if (inputField) {\n // Update placeholder based on current language\n const inputPlaceholder = this.config.inputPlaceholder || \n this.config.panel?.inputPlaceholder || \n this.t('typeMessage') || \n 'Type your message...';\n inputField.placeholder = inputPlaceholder;\n \n // Update direction\n inputField.dir = this.config.direction || 'ltr';\n \n // Update text-align style\n inputField.style.textAlign = this.config.direction === 'rtl' ? 'right' : 'left';\n }\n }\n\n /**\n * Show text interface\n */\n show() {\n const textInterface = document.getElementById('textInterface');\n if (textInterface) textInterface.classList.add('active');\n \n // Focus input soon after render\n setTimeout(() => {\n const input = document.getElementById('messageInput');\n if (input) input.focus();\n }, 50);\n }\n\n /**\n * Hide text interface\n */\n hide() {\n const textInterface = document.getElementById('textInterface');\n if (textInterface) textInterface.classList.remove('active');\n }\n\n /**\n * Start chat session\n */\n async startChat() {\n // No-op with single-shot design; connection happens per message\n this.isActive = true;\n this.updateSendButtonState();\n }\n\n /**\n * Send message\n */\n async sendMessage() {\n const input = document.getElementById('messageInput');\n const text = input.value.trim();\n \n if (!text) {\n return;\n }\n \n // Ensure active state\n if (!this.isActive) {\n await this.startChat();\n }\n \n // Add user message to UI\n this.addMessage('user', text);\n \n // Clear input and reset height\n input.value = '';\n input.style.height = '32px';\n input.style.overflow = 'hidden';\n \n // Prepare streaming bubble and send via SDK\n try {\n this.beginStreaming();\n await this.sdk.sendMessage(text);\n } catch (error) {\n console.error('❌ Failed to send message:', error);\n // Check if this is a domain error - if so, it's already handled by the domainError event handler\n // Don't show it here to avoid duplicates\n const isDomainError = error && (\n error.message === 'DOMAIN_NOT_WHITELISTED' ||\n (error.message && error.message.includes('Domain not whitelisted'))\n );\n \n if (!isDomainError) {\n // Only show non-domain errors here (domain errors are handled by event handler)\n this.showError(error);\n }\n this.stopStreamingState();\n }\n }\n\n /**\n * Update send button state\n */\n updateSendButtonState() {\n const sendButton = document.getElementById('sendButton');\n if (!sendButton) return;\n \n sendButton.disabled = !this.isActive; // single-shot; enable when ready for input\n }\n\n /**\n * Add message to UI\n */\n addMessage(type, text) {\n const messages = document.getElementById('messagesContainer');\n if (!messages) return;\n \n // Remove empty state if present\n const emptyState = messages.querySelector('.empty-state');\n if (emptyState) {\n emptyState.remove();\n }\n \n const message = document.createElement('div');\n const edgeClass = (this.config.direction === 'rtl')\n ? (type === 'user' ? 'edge-left' : 'edge-right')\n : (type === 'user' ? 'edge-right' : 'edge-left');\n message.className = `message ${type} ${edgeClass}`;\n\n const avatar = document.createElement('div');\n avatar.className = `message-avatar ${type}`;\n avatar.textContent = type === 'user' ? '👤' : '🤖';\n\n const bubble = document.createElement('div');\n bubble.className = 'message-bubble';\n bubble.textContent = text;\n\n // Order is controlled by edgeClass via flex-direction\n message.appendChild(avatar);\n message.appendChild(bubble);\n messages.appendChild(message);\n messages.scrollTop = messages.scrollHeight;\n }\n\n /**\n * Begin streaming response\n */\n beginStreaming() {\n const messages = document.getElementById('messagesContainer');\n if (!messages) return;\n \n // Clean any previous indicator\n this.stopStreamingState();\n \n const el = document.createElement('div');\n const edgeClass = (this.config.direction === 'rtl') ? 'edge-right' : 'edge-left';\n el.className = `message agent ${edgeClass}`;\n el.id = 'agent-streaming';\n\n const avatar = document.createElement('div');\n avatar.className = 'message-avatar agent';\n avatar.textContent = '🤖';\n \n const bubble = document.createElement('div');\n bubble.className = 'message-bubble';\n // show typing dots until first chunk\n bubble.innerHTML = '<span class=\"typing-indicator\"><span class=\"typing-dot\"></span><span class=\"typing-dot\"></span><span class=\"typing-dot\"></span></span>';\n\n el.appendChild(avatar);\n el.appendChild(bubble);\n messages.appendChild(el);\n this.streamingEl = bubble;\n this.hasStartedStreaming = false;\n messages.scrollTop = messages.scrollHeight;\n }\n\n /**\n * Append chunk to streaming response\n */\n appendStreamingChunk(chunk) {\n if (!this.streamingEl) return;\n \n if (!this.hasStartedStreaming) {\n // remove typing indicator on first content\n this.streamingEl.textContent = '';\n this.hasStartedStreaming = true;\n }\n \n this.streamingEl.textContent += chunk;\n const messages = document.getElementById('messagesContainer');\n if (messages) {\n messages.scrollTop = messages.scrollHeight;\n }\n }\n\n /**\n * Finalize streaming response\n */\n finalizeStreaming(fullText) {\n if (this.streamingEl) {\n this.streamingEl.textContent = fullText || this.streamingEl.textContent;\n const container = document.getElementById('agent-streaming');\n if (container) container.id = '';\n this.streamingEl = null;\n }\n this.updateSendButtonState();\n }\n\n /**\n * Stop streaming state\n */\n stopStreamingState() {\n const existing = document.getElementById('agent-streaming');\n if (existing) existing.remove();\n this.streamingEl = null;\n this.hasStartedStreaming = false;\n }\n\n /**\n * Show error message\n */\n showError(error) {\n const messages = document.getElementById('messagesContainer');\n if (!messages) return;\n \n // Check if this is a domain validation error\n const isDomainError = error && (\n error.message === 'DOMAIN_NOT_WHITELISTED' ||\n (typeof error === 'string' && error.includes('DOMAIN_NOT_WHITELISTED')) ||\n (error.message && error.message.includes('Domain not whitelisted')) ||\n (typeof error === 'string' && error.includes('Domain not whitelisted'))\n );\n \n if (isDomainError) {\n // Show domain error with title and message\n const errorContainer = document.createElement('div');\n errorContainer.className = 'error-message';\n errorContainer.style.cssText = 'padding: 16px; margin: 12px; border-radius: 8px; background: ' + \n (this.config.messages?.errorBackgroundColor || '#FEE2E2') + ';';\n \n const title = document.createElement('div');\n title.style.cssText = 'font-weight: 600; font-size: 16px; margin-bottom: 8px; color: #991B1B;';\n title.textContent = this.t('domainNotValidated');\n \n const message = document.createElement('div');\n message.style.cssText = 'font-size: 14px; color: #991B1B; line-height: 1.5;';\n message.textContent = this.t('domainErrorMessage');\n \n errorContainer.appendChild(title);\n errorContainer.appendChild(message);\n messages.appendChild(errorContainer);\n } else {\n // Show regular error\n const errorEl = document.createElement('div');\n errorEl.className = 'error-message';\n errorEl.textContent = typeof error === 'string' ? error : (error?.message || error);\n messages.appendChild(errorEl);\n }\n \n messages.scrollTop = messages.scrollHeight;\n }\n\n /**\n * Set active state\n */\n setActive(active) {\n this.isActive = active;\n this.updateSendButtonState();\n }\n}\n\n","export default {\n \"en\": {\n \"landingTitle\": \"How would you like to communicate?\",\n \"voiceCall\": \"Voice Call\",\n \"textChat\": \"Text Chat\",\n \"clickToStartCall\": \"Click to Start Call\",\n \"realTimeVoice\": \"Real-time voice conversation\",\n \"startCall\": \"Start Call\",\n \"listening\": \"Listening...\",\n \"speakFreely\": \"Speak freely\",\n \"liveTranscript\": \"Live Transcript\",\n \"transcriptWillAppear\": \"Transcript will appear here during the call...\",\n \"mute\": \"Mute\",\n \"speaker\": \"Speaker\",\n \"endCall\": \"End Call\",\n \"hello\": \"Hello! How can I help?\",\n \"sendMessage\": \"Send a message to get started\",\n \"online\": \"Online\",\n \"newChat\": \"New Chat\",\n \"back\": \"Back\",\n \"close\": \"Close\",\n \"error\": \"Error\",\n \"typeMessage\": \"Type your message...\",\n \"sendMessageAria\": \"Send message\",\n \"domainNotValidated\": \"Domain not validated\",\n \"domainErrorMessage\": \"This domain is not whitelisted. Please contact the administrator to whitelist your website URL.\"\n },\n \"he\": {\n \"landingTitle\": \"איך תרצה לתקשר?\",\n \"voiceCall\": \"שיחה קולית\",\n \"textChat\": \"צ'אט טקסט\",\n \"clickToStartCall\": \"לחץ להתחלת שיחה\",\n \"realTimeVoice\": \"שיחה קולית בזמן אמת\",\n \"startCall\": \"התחל שיחה\",\n \"listening\": \"מקשיב...\",\n \"speakFreely\": \"דבר בחופשיות\",\n \"liveTranscript\": \"תמלול בזמן אמת\",\n \"transcriptWillAppear\": \"התמלול יופיע כאן במהלך השיחה...\",\n \"mute\": \"השתק\",\n \"speaker\": \"רמקול\",\n \"endCall\": \"סיים שיחה\",\n \"hello\": \"שלום! איך אפשר לעזור?\",\n \"sendMessage\": \"שלח הודעה או עבור למצב קולי לשיחה בזמן אמת\",\n \"online\": \"מקוון\",\n \"newChat\": \"צ'אט חדש\",\n \"back\": \"חזור\",\n \"close\": \"סגור\",\n \"error\": \"שגיאה\",\n \"typeMessage\": \"הקלד הודעה...\",\n \"sendMessageAria\": \"שלח הודעה\",\n \"domainNotValidated\": \"דומיין לא מאומת\",\n \"domainErrorMessage\": \"דומיין זה לא ברשימת המורשים. אנא פנה למנהל המערכת כדי להוסיף את כתובת האתר שלך לרשימה.\"\n },\n \"ar\": {\n \"landingTitle\": \"كيف تريد التواصل؟\",\n \"voiceCall\": \"مكالمة صوتية\",\n \"textChat\": \"دردشة نصية\",\n \"clickToStartCall\": \"انقر لبدء المكالمة\",\n \"realTimeVoice\": \"محادثة صوتية في الوقت الفعلي\",\n \"startCall\": \"ابدأ المكالمة\",\n \"listening\": \"الاستماع...\",\n \"speakFreely\": \"تكلم بحرية\",\n \"liveTranscript\": \"نص مباشر\",\n \"transcriptWillAppear\": \"سيظهر النص هنا أثناء المكالمة...\",\n \"mute\": \"كتم الصوت\",\n \"speaker\": \"مكبر الصوت\",\n \"endCall\": \"إنهاء المكالمة\",\n \"hello\": \"مرحبا! كيف يمكنني المساعدة؟\",\n \"sendMessage\": \"أرسل رسالة للبدء\",\n \"online\": \"متصل\",\n \"newChat\": \"محادثة جديدة\",\n \"back\": \"رجوع\",\n \"close\": \"إغلاق\",\n \"error\": \"خطأ\",\n \"typeMessage\": \"اكتب رسالة...\",\n \"sendMessageAria\": \"إرسال رسالة\",\n \"domainNotValidated\": \"النطاق غير معتمد\",\n \"domainErrorMessage\": \"هذا النطاق غير مسموح به. يرجى الاتصال بالمسؤول لإضافة عنوان موقع الويب الخاص بك إلى القائمة.\"\n },\n \"ru\": {\n \"landingTitle\": \"Как вы хотите общаться?\",\n \"voiceCall\": \"Голосовой звонок\",\n \"textChat\": \"Текстовый чат\",\n \"clickToStartCall\": \"Нажмите, чтобы начать звонок\",\n \"realTimeVoice\": \"Голосовой разговор в реальном времени\",\n \"startCall\": \"Начать звонок\",\n \"listening\": \"Слушаю...\",\n \"speakFreely\": \"Говорите свободно\",\n \"liveTranscript\": \"Живая транскрипция\",\n \"transcriptWillAppear\": \"Транскрипция появится здесь во время звонка...\",\n \"mute\": \"Отключить звук\",\n \"speaker\": \"Динамик\",\n \"endCall\": \"Завершить звонок\",\n \"hello\": \"Привет! Как я могу помочь?\",\n \"sendMessage\": \"Отправьте сообщение для начала\",\n \"online\": \"В сети\",\n \"newChat\": \"Новый чат\",\n \"back\": \"Назад\",\n \"close\": \"Закрыть\",\n \"error\": \"Ошибка\",\n \"typeMessage\": \"Введите сообщение...\",\n \"sendMessageAria\": \"Отправить сообщение\",\n \"domainNotValidated\": \"Домен не проверен\",\n \"domainErrorMessage\": \"Этот домен не в белом списке. Пожалуйста, свяжитесь с администратором, чтобы добавить URL вашего веб-сайта в список.\"\n },\n \"es\": {\n \"landingTitle\": \"¿Cómo te gustaría comunicarte?\",\n \"voiceCall\": \"Llamada de voz\",\n \"textChat\": \"Chat de texto\",\n \"clickToStartCall\": \"Haz clic para iniciar la llamada\",\n \"realTimeVoice\": \"Conversación de voz en tiempo real\",\n \"startCall\": \"Iniciar llamada\",\n \"listening\": \"Escuchando...\",\n \"speakFreely\": \"Habla libremente\",\n \"liveTranscript\": \"Transcripción en vivo\",\n \"transcriptWillAppear\": \"La transcripción aparecerá aquí durante la llamada...\",\n \"mute\": \"Silenciar\",\n \"speaker\": \"Altavoz\",\n \"endCall\": \"Terminar llamada\",\n \"hello\": \"¡Hola! ¿Cómo puedo ayudarte?\",\n \"sendMessage\": \"Envía un mensaje para comenzar\",\n \"online\": \"En línea\",\n \"newChat\": \"Nuevo chat\",\n \"back\": \"Atrás\",\n \"close\": \"Cerrar\",\n \"error\": \"Error\",\n \"typeMessage\": \"Escribe un mensaje...\",\n \"sendMessageAria\": \"Enviar mensaje\",\n \"domainNotValidated\": \"Dominio no validado\",\n \"domainErrorMessage\": \"Este dominio no está en la lista blanca. Por favor, contacte al administrador para agregar la URL de su sitio web a la lista.\"\n },\n \"fr\": {\n \"landingTitle\": \"Comment souhaitez-vous communiquer?\",\n \"voiceCall\": \"Appel vocal\",\n \"textChat\": \"Chat texte\",\n \"clickToStartCall\": \"Cliquez pour démarrer l'appel\",\n \"realTimeVoice\": \"Conversation vocale en temps réel\",\n \"startCall\": \"Démarrer l'appel\",\n \"listening\": \"Écoute...\",\n \"speakFreely\": \"Parlez librement\",\n \"liveTranscript\": \"Transcripción en direct\",\n \"transcriptWillAppear\": \"La transcription apparaîtra ici pendant l'appel...\",\n \"mute\": \"Muet\",\n \"speaker\": \"Haut-parleur\",\n \"endCall\": \"Terminer l'appel\",\n \"hello\": \"Bonjour! Comment puis-je vous aider?\",\n \"sendMessage\": \"Envoyez un message pour commencer\",\n \"online\": \"En ligne\",\n \"newChat\": \"Nouveau chat\",\n \"back\": \"Retour\",\n \"close\": \"Fermer\",\n \"error\": \"Erreur\",\n \"typeMessage\": \"Tapez votre message...\",\n \"sendMessageAria\": \"Envoyer un message\",\n \"domainNotValidated\": \"Domaine non validé\",\n \"domainErrorMessage\": \"Ce domaine n'est pas sur la liste blanche. Veuillez contacter l'administrateur pour ajouter l'URL de votre site Web à la liste.\"\n },\n \"de\": {\n \"landingTitle\": \"Wie möchten Sie kommunizieren?\",\n \"voiceCall\": \"Sprachanruf\",\n \"textChat\": \"Text-Chat\",\n \"clickToStartCall\": \"Klicken Sie, um den Anruf zu starten\",\n \"realTimeVoice\": \"Sprachanruf in Echtzeit\",\n \"startCall\": \"Anruf starten\",\n \"listening\": \"Hören...\",\n \"speakFreely\": \"Sprechen Sie frei\",\n \"liveTranscript\": \"Live-Transkription\",\n \"transcriptWillAppear\": \"Die Transkription erscheint hier während des Anrufs...\",\n \"mute\": \"Stumm\",\n \"speaker\": \"Lautsprecher\",\n \"endCall\": \"Anruf beenden\",\n \"hello\": \"Hallo! Wie kann ich helfen?\",\n \"sendMessage\": \"Senden Sie eine Nachricht zum Starten\",\n \"online\": \"Online\",\n \"newChat\": \"Neuer Chat\",\n \"back\": \"Zurück\",\n \"close\": \"Schließen\",\n \"error\": \"Fehler\",\n \"typeMessage\": \"Geben Sie eine Nachricht ein...\",\n \"sendMessageAria\": \"Nachricht senden\",\n \"domainNotValidated\": \"Domain nicht validiert\",\n \"domainErrorMessage\": \"Diese Domain steht nicht auf der Whitelist. Bitte kontaktieren Sie den Administrator, um die URL Ihrer Website zur Liste hinzuzufügen.\"\n }\n};\n","/**\n * TTPChatWidget - Pre-built UI widget for text chat using TextChatSDK\n * Similar to AgentWidget but designed for text-based chat\n */\n\nimport TextChatSDK from '../core/TextChatSDK.js';\nimport { VoiceInterface } from './VoiceInterface.js';\nimport { TextInterface } from './TextInterface.js';\nimport widgetTranslations from './widget-translations.js';\n\nexport class TTPChatWidget {\n constructor(config = {}) {\n // Merge user config with defaults (backward compatible with simple config)\n this.config = this.mergeWithDefaults(config);\n this.sdk = new TextChatSDK(this.config);\n this.isOpen = false;\n this.isActive = false;\n this.translations = widgetTranslations;\n // Track current view state in unified mode to prevent resetting when widget is recreated\n this.currentView = 'landing'; // 'landing', 'text', or 'voice'\n \n // Initialize interfaces with proper config\n // Voice interface needs voice config merged with main config\n const voiceConfig = {\n ...this.config,\n ...this.config.voice,\n language: this.config.voice?.language || this.config.language || 'en',\n websocketUrl: this.config.voice?.websocketUrl || this.config.websocketUrl || 'wss://speech.talktopc.com/ws/conv',\n translations: this.translations\n };\n this.voiceInterface = new VoiceInterface(voiceConfig);\n // Text interface needs text config merged with main config\n const textConfig = {\n ...this.config,\n ...this.config.text,\n translations: this.translations\n };\n this.textInterface = new TextInterface(textConfig, this.sdk);\n \n this.setupEventHandlers();\n this.createWidget();\n \n // Start open if configured (immediately)\n if (this.config.behavior.startOpen || this.config.behavior.autoOpen) {\n const panel = document.getElementById('text-chat-panel');\n if (panel) {\n this.isOpen = true;\n panel.classList.add('open');\n }\n }\n }\n\n /**\n * Merge user configuration with defaults\n * Supports both simple config (backward compatible) and advanced config\n */\n mergeWithDefaults(userConfig) {\n // Handle legacy position string format\n let positionConfig = userConfig.position || 'bottom-right';\n if (typeof positionConfig === 'string') {\n // Convert legacy format 'bottom-right' to new format\n const parts = positionConfig.split('-');\n positionConfig = {\n vertical: parts[0] || 'bottom',\n horizontal: parts[1] || 'right',\n offset: userConfig.positionOffset || { x: 20, y: 20 }\n };\n }\n\n // Handle legacy primaryColor - default to purple\n const primaryColor = userConfig.primaryColor || userConfig.button?.primaryColor || userConfig.button?.backgroundColor || '#7C3AED';\n \n // Calculate headerColor for use in landing config (needed before landing config is defined)\n const headerColor = userConfig.header?.backgroundColor || userConfig.button?.backgroundColor || primaryColor;\n\n return {\n // Required (agentId is required, appId is optional)\n agentId: userConfig.agentId,\n appId: userConfig.appId,\n getSessionUrl: userConfig.getSessionUrl, // Optional - will auto-construct URL if omitted (for voice)\n websocketUrl: userConfig.websocketUrl, // Optional - defaults to backend.talktopc.com/ws/conv (for text), speech.talktopc.com/ws/conv (for voice)\n demo: userConfig.demo !== false, // Optional - defaults to true\n direction: userConfig.direction || 'ltr', // Optional - text direction: 'ltr' or 'rtl'\n language: userConfig.language || 'en', // Optional - language for voice (defaults to 'en')\n \n // Icon/Image Configuration\n icon: {\n type: userConfig.icon?.type || 'custom', // 'microphone', 'custom', 'emoji', 'text'\n customImage: userConfig.icon?.customImage || 'https://talktopc.com/logo192.png',\n emoji: userConfig.icon?.emoji || '🎤',\n text: userConfig.icon?.text || 'AI',\n size: userConfig.icon?.size || 'medium', // 'small', 'medium', 'large', 'xl'\n backgroundColor: userConfig.icon?.backgroundColor || '#FFFFFF',\n ...userConfig.icon\n },\n \n // Positioning Configuration (supports both object and legacy string)\n position: {\n vertical: positionConfig.vertical || 'bottom',\n horizontal: positionConfig.horizontal || 'right',\n offset: positionConfig.offset || { x: 20, y: 20 },\n ...(typeof userConfig.position === 'object' ? userConfig.position : {})\n },\n \n // Button Configuration\n button: {\n size: userConfig.button?.size || 'medium',\n shape: userConfig.button?.shape || 'circle',\n // Floating button colors (main button)\n backgroundColor: userConfig.button?.backgroundColor || userConfig.icon?.backgroundColor || primaryColor,\n hoverColor: userConfig.button?.hoverColor || '#7C3AED',\n shadow: userConfig.button?.shadow !== false,\n shadowColor: userConfig.button?.shadowColor || 'rgba(0,0,0,0.15)',\n // Legacy support - map to backgroundColor\n primaryColor: userConfig.button?.backgroundColor || userConfig.icon?.backgroundColor || primaryColor,\n ...userConfig.button\n },\n \n // Panel Configuration (common to both voice and text)\n panel: {\n width: userConfig.panel?.width || 350,\n height: userConfig.panel?.height || 500,\n borderRadius: userConfig.panel?.borderRadius || 12,\n backgroundColor: userConfig.panel?.backgroundColor || '#FFFFFF',\n backdropFilter: userConfig.panel?.backdropFilter || null,\n border: userConfig.panel?.border || '1px solid rgba(0,0,0,0.1)',\n ...userConfig.panel\n },\n \n // Voice-specific Configuration\n voice: {\n // Voice button colors (inside panel)\n micButtonColor: userConfig.voice?.micButtonColor || userConfig.panel?.micButtonColor || primaryColor,\n micButtonActiveColor: userConfig.voice?.micButtonActiveColor || userConfig.panel?.micButtonActiveColor || '#EF4444',\n // Voice button hint text (below button)\n micButtonHint: {\n text: userConfig.voice?.micButtonHint?.text || userConfig.panel?.micButtonHint?.text || 'Click the button to start voice conversation',\n color: userConfig.voice?.micButtonHint?.color || userConfig.panel?.micButtonHint?.color || '#6B7280',\n fontSize: userConfig.voice?.micButtonHint?.fontSize || userConfig.panel?.micButtonHint?.fontSize || '12px',\n ...userConfig.voice?.micButtonHint,\n ...userConfig.panel?.micButtonHint\n },\n // Voice interface colors\n avatarBackgroundColor: userConfig.voice?.avatarBackgroundColor || '#667eea',\n avatarActiveBackgroundColor: userConfig.voice?.avatarActiveBackgroundColor || '#667eea',\n statusTitleColor: userConfig.voice?.statusTitleColor || '#1e293b',\n statusSubtitleColor: userConfig.voice?.statusSubtitleColor || '#64748b',\n startCallButtonColor: userConfig.voice?.startCallButtonColor || '#667eea',\n startCallButtonTextColor: userConfig.voice?.startCallButtonTextColor || '#FFFFFF',\n transcriptBackgroundColor: userConfig.voice?.transcriptBackgroundColor || '#FFFFFF',\n transcriptTextColor: userConfig.voice?.transcriptTextColor || '#1e293b',\n transcriptLabelColor: userConfig.voice?.transcriptLabelColor || '#94a3b8',\n controlButtonColor: userConfig.voice?.controlButtonColor || '#FFFFFF',\n controlButtonSecondaryColor: userConfig.voice?.controlButtonSecondaryColor || '#64748b',\n endCallButtonColor: userConfig.voice?.endCallButtonColor || '#ef4444',\n // Voice language setting\n language: userConfig.voice?.language || userConfig.language || 'en',\n // Voice websocket URL (can override global websocketUrl)\n websocketUrl: userConfig.voice?.websocketUrl || userConfig.websocketUrl,\n ...userConfig.voice\n },\n \n // Text-specific Configuration\n text: {\n // Send button colors (inside panel)\n sendButtonColor: userConfig.text?.sendButtonColor || userConfig.panel?.sendButtonColor || '#7C3AED', // Purple default\n sendButtonHoverColor: userConfig.text?.sendButtonHoverColor || userConfig.panel?.sendButtonHoverColor || '#6D28D9',\n sendButtonActiveColor: userConfig.text?.sendButtonActiveColor || userConfig.panel?.sendButtonActiveColor || '#6D28D9', // Purple darker for active\n sendButtonText: userConfig.text?.sendButtonText || userConfig.panel?.sendButtonText || '➤',\n sendButtonTextColor: userConfig.text?.sendButtonTextColor || userConfig.panel?.sendButtonTextColor || '#FFFFFF',\n sendButtonFontSize: userConfig.text?.sendButtonFontSize || userConfig.panel?.sendButtonFontSize || '18px',\n sendButtonFontWeight: userConfig.text?.sendButtonFontWeight || userConfig.panel?.sendButtonFontWeight || '500',\n // Send button hint text (below button or near it)\n sendButtonHint: {\n text: userConfig.text?.sendButtonHint?.text || userConfig.panel?.sendButtonHint?.text || '',\n color: userConfig.text?.sendButtonHint?.color || userConfig.panel?.sendButtonHint?.color || '#6B7280',\n fontSize: userConfig.text?.sendButtonHint?.fontSize || userConfig.panel?.sendButtonHint?.fontSize || '12px',\n ...userConfig.text?.sendButtonHint,\n ...userConfig.panel?.sendButtonHint\n },\n // Input field configuration\n inputPlaceholder: userConfig.text?.inputPlaceholder || userConfig.panel?.inputPlaceholder || 'Type your message...',\n inputBorderColor: userConfig.text?.inputBorderColor || userConfig.panel?.inputBorderColor || '#E5E7EB',\n inputFocusColor: userConfig.text?.inputFocusColor || userConfig.panel?.inputFocusColor || '#7C3AED', // Purple default\n inputBackgroundColor: userConfig.text?.inputBackgroundColor || userConfig.panel?.inputBackgroundColor || '#FFFFFF',\n inputTextColor: userConfig.text?.inputTextColor || userConfig.panel?.inputTextColor || '#1F2937',\n inputFontSize: userConfig.text?.inputFontSize || userConfig.panel?.inputFontSize || '14px',\n inputBorderRadius: userConfig.text?.inputBorderRadius || userConfig.panel?.inputBorderRadius || 20,\n inputPadding: userConfig.text?.inputPadding || userConfig.panel?.inputPadding || '6px 14px',\n ...userConfig.text\n },\n \n // Landing Screen Configuration (only for unified mode)\n landing: {\n backgroundColor: userConfig.landing?.backgroundColor || 'linear-gradient(180deg, #f8fafc 0%, #e0e7ff 100%)',\n logo: userConfig.landing?.logo || '🤖',\n title: userConfig.landing?.title || null, // null means use default translated text\n titleColor: userConfig.landing?.titleColor || '#1e293b',\n modeCardBackgroundColor: userConfig.landing?.modeCardBackgroundColor || '#FFFFFF',\n modeCardBorderColor: userConfig.landing?.modeCardBorderColor || '#E2E8F0',\n modeCardHoverBorderColor: userConfig.landing?.modeCardHoverBorderColor || headerColor,\n modeCardIconBackgroundColor: userConfig.landing?.modeCardIconBackgroundColor || headerColor,\n modeCardTitleColor: userConfig.landing?.modeCardTitleColor || '#111827',\n voiceCardIcon: userConfig.landing?.voiceCardIcon || '🎤',\n textCardIcon: userConfig.landing?.textCardIcon || '💬',\n ...userConfig.landing\n },\n \n // Header Configuration (top of panel)\n header: {\n title: userConfig.header?.title || 'Chat Assistant',\n showTitle: userConfig.header?.showTitle !== false,\n backgroundColor: userConfig.header?.backgroundColor || userConfig.button?.backgroundColor || '#7C3AED', // Default purple\n textColor: userConfig.header?.textColor || '#FFFFFF',\n showCloseButton: userConfig.header?.showCloseButton !== false,\n ...userConfig.header\n },\n \n // Tooltips Configuration\n tooltips: {\n newChat: userConfig.tooltips?.newChat || null, // null means use default based on direction\n back: userConfig.tooltips?.back || null,\n close: userConfig.tooltips?.close || null,\n mute: userConfig.tooltips?.mute || null,\n speaker: userConfig.tooltips?.speaker || null,\n endCall: userConfig.tooltips?.endCall || null,\n ...userConfig.tooltips\n },\n \n // Messages Configuration\n messages: {\n userBackgroundColor: userConfig.messages?.userBackgroundColor || '#E5E7EB',\n agentBackgroundColor: userConfig.messages?.agentBackgroundColor || '#F3F4F6',\n systemBackgroundColor: userConfig.messages?.systemBackgroundColor || '#DCFCE7',\n errorBackgroundColor: userConfig.messages?.errorBackgroundColor || '#FEE2E2',\n textColor: userConfig.messages?.textColor || '#1F2937',\n fontSize: userConfig.messages?.fontSize || '14px',\n borderRadius: userConfig.messages?.borderRadius || 8,\n ...userConfig.messages\n },\n \n // Animation Configuration\n animation: {\n enableHover: userConfig.animation?.enableHover !== false,\n enablePulse: userConfig.animation?.enablePulse !== false,\n enableSlide: userConfig.animation?.enableSlide !== false,\n duration: userConfig.animation?.duration || 0.3,\n ...userConfig.animation\n },\n \n // Behavior Configuration\n behavior: {\n autoOpen: userConfig.behavior?.autoOpen || false,\n startOpen: userConfig.behavior?.startOpen || false,\n hidden: userConfig.behavior?.hidden || false,\n autoConnect: userConfig.behavior?.autoConnect || false,\n showWelcomeMessage: userConfig.behavior?.showWelcomeMessage !== false,\n welcomeMessage: userConfig.behavior?.welcomeMessage || 'Hello! How can I help you today?',\n // Voice selection landing (enabled by default)\n enableVoiceMode: userConfig.behavior?.enableVoiceMode !== undefined ? userConfig.behavior.enableVoiceMode : true,\n // Widget mode: 'unified' (both voice and text with landing screen), 'voice-only' (only voice), 'text-only' (only text)\n mode: userConfig.behavior?.mode || 'unified',\n ...userConfig.behavior\n },\n \n // Accessibility Configuration\n accessibility: {\n ariaLabel: userConfig.accessibility?.ariaLabel || 'Chat Assistant',\n ariaDescription: userConfig.accessibility?.ariaDescription || 'Click to open chat assistant',\n keyboardNavigation: userConfig.accessibility?.keyboardNavigation !== false,\n ...userConfig.accessibility\n },\n \n // Custom CSS\n customStyles: userConfig.customStyles || '',\n \n // Variables for the agent\n variables: userConfig.variables || {},\n // TEST: allow forcing a conversationId for debugging\n forceConversationId: userConfig.forceConversationId,\n \n // Legacy support (for backward compatibility)\n primaryColor: primaryColor,\n // Keep position string for backward compatibility\n ...(typeof userConfig.position === 'string' ? { positionString: userConfig.position } : {})\n };\n }\n\n setupEventHandlers() {\n // Handle domain validation errors\n this.sdk.on('domainError', (error) => {\n this.textInterface.showError(error);\n this.textInterface.stopStreamingState();\n });\n\n this.sdk.on('error', (error) => {\n // Domain errors are handled by domainError event, skip here\n if (error && (error.message === 'DOMAIN_NOT_WHITELISTED' || \n (error.message && error.message.includes('Domain not whitelisted')))) {\n return; // Already handled by domainError event\n }\n this.textInterface.showError(error.message || error);\n this.textInterface.stopStreamingState();\n });\n\n this.sdk.on('chunk', (chunk) => {\n this.textInterface.appendStreamingChunk(chunk);\n });\n\n this.sdk.on('done', ({ text }) => {\n this.textInterface.finalizeStreaming(text);\n });\n }\n\n createWidget() {\n console.log('🏗️ createWidget called', {\n stack: new Error().stack.split('\\n').slice(1, 6).join('\\n')\n });\n \n // Remove existing widget if it exists\n const existingWidget = document.getElementById('text-chat-widget');\n if (existingWidget) {\n existingWidget.remove();\n }\n \n const widget = document.createElement('div');\n widget.id = 'text-chat-widget';\n widget.innerHTML = this.generateWidgetHTML();\n \n document.body.appendChild(widget);\n \n this.setupWidgetEvents();\n \n // Ensure initial open state if configured\n if (this.config.behavior.startOpen || this.config.behavior.autoOpen) {\n const panel = document.getElementById('text-chat-panel');\n if (panel) {\n this.isOpen = true;\n panel.classList.add('open');\n }\n }\n }\n\n generateWidgetHTML() {\n const pos = this.config.position;\n const btn = this.config.button;\n const icon = this.config.icon;\n const panel = this.config.panel;\n const header = this.config.header;\n const anim = this.config.animation;\n\n // Calculate button size\n const buttonSizes = {\n small: 50,\n medium: 60,\n large: 70,\n xl: 80\n };\n const buttonSize = buttonSizes[btn.size] || 60;\n\n // Calculate icon size\n const iconSizes = {\n small: 20,\n medium: 28,\n large: 36,\n xl: 44\n };\n const iconSize = iconSizes[icon.size] || 28;\n\n // Generate position styles\n const positionStyles = this.generatePositionStyles();\n\n // Generate icon HTML\n const iconHTML = this.generateIconHTML(iconSize);\n\n const widgetMode = this.config.behavior.mode || 'unified';\n const showLanding = widgetMode === 'unified';\n const showVoice = widgetMode === 'unified' || widgetMode === 'voice-only';\n const showText = widgetMode === 'unified' || widgetMode === 'text-only';\n const voiceEnabled = showVoice;\n \n // Helper function to get translated text\n const t = (key) => {\n const lang = this.config.language || 'en';\n const translations = this.translations[lang] || this.translations.en;\n return translations[key] || key;\n };\n \n // Helper function to get tooltip text\n const getTooltip = (key) => {\n const tooltip = this.config.tooltips?.[key];\n if (tooltip !== null && tooltip !== undefined) return tooltip;\n // Use translations for default tooltips\n const defaults = {\n newChat: t('newChat'),\n back: t('back'),\n close: t('close'),\n mute: t('mute'),\n speaker: t('speaker'),\n endCall: t('endCall')\n };\n return defaults[key] || '';\n };\n\n return `\n <style>\n ${this.generateCSS(positionStyles, buttonSize, iconSize)}\n ${this.config.customStyles}\n </style>\n \n ${this.config.behavior.hidden ? '' : `\n <button id=\\\"text-chat-button\\\" \n aria-label=\\\"${this.config.accessibility.ariaLabel}\\\"\n aria-description=\\\"${this.config.accessibility.ariaDescription}\\\">\\n ${iconHTML}\\n </button>\n `}\n \n <div id=\"text-chat-panel\">\n <div class=\"widget-shell\">\n <div class=\"panel-inner widget-container\" style=\"direction: ${this.config.direction};\">\n <div class=\"widget-header\" style=\"background: ${header.backgroundColor}; color: ${header.textColor};\">\n <div>\n ${header.showTitle ? `<div class=\"header-title\">${header.title}</div>` : ''}\n <div class=\"header-status\">\n <span class=\"status-dot\"></span>\n <span>${t('online')}</span>\n </div>\n </div>\n \n <div style=\"display: flex; gap: 12px; align-items: center;\">\n <!-- New Chat Button (hide on landing screen, show otherwise) -->\n <button class=\"header-icon new-chat-btn\" id=\"newChatBtn\" title=\"${getTooltip('newChat')}\" style=\"${showLanding ? 'display: none;' : ''}\">\n <span style=\"font-size: 18px; font-weight: bold;\">+</span>\n </button>\n \n <!-- Back Button (only show in unified mode) -->\n ${widgetMode === 'unified' ? `<button class=\"header-icon back-btn\" id=\"backBtn\" title=\"${getTooltip('back')}\" style=\"display: none;\">\n <span style=\"font-size: 16px;\">‹</span>\n </button>` : ''}\n \n <!-- Close Button -->\n ${header.showCloseButton ? '<button class=\"header-icon close-btn\" id=\"closeBtn\" title=\"' + getTooltip('close') + '\">'+\n '<span style=\"font-size: 18px; font-weight: bold;\">×</span>'+\n '</button>' : ''}\n </div>\n </div>\n\n ${showLanding ? `\n <div class=\"landing-screen\" id=\"landingScreen\">\n <div class=\"landing-logo\">🤖</div>\n <div class=\"landing-title\">${t('landingTitle')}</div>\n <div class=\"mode-selection\">\n ${showVoice ? `<div class=\"mode-card voice\" id=\"mode-card-voice\">\n <div class=\"mode-card-icon\">🎤</div>\n <div class=\"mode-card-title\">${t('voiceCall')}</div>\n </div>` : ''}\n ${showText ? `<div class=\"mode-card text\" id=\"mode-card-text\">\n <div class=\"mode-card-icon\">💬</div>\n <div class=\"mode-card-title\">${t('textChat')}</div>\n </div>` : ''}\n </div>\n </div>` : ''}\n\n ${showVoice ? this.voiceInterface.generateHTML() : ''}\n ${showText ? this.textInterface.generateHTML() : ''}\n </div>\n </div>\n </div>\n `;\n }\n\n generatePositionStyles() {\n const pos = this.config.position;\n const offset = pos.offset || { x: 20, y: 20 };\n \n let styles = '';\n \n // Vertical positioning\n if (pos.vertical === 'top') {\n styles += `top: ${offset.y}px;`;\n } else if (pos.vertical === 'bottom') {\n styles += `bottom: ${offset.y}px;`;\n } else if (pos.vertical === 'center') {\n styles += `top: 50%; transform: translateY(-50%);`;\n }\n \n // Horizontal positioning\n if (pos.horizontal === 'left') {\n styles += `left: ${offset.x}px;`;\n } else if (pos.horizontal === 'right') {\n styles += `right: ${offset.x}px;`;\n } else if (pos.horizontal === 'center') {\n styles += `left: 50%; transform: translateX(-50%);`;\n }\n \n return styles;\n }\n\n generateIconHTML(size) {\n const icon = this.config.icon;\n \n switch (icon.type) {\n case 'custom':\n return `<img src=\"${icon.customImage}\" alt=\"Chat Assistant\" style=\"width: ${size}px; height: ${size}px; object-fit: contain;\" />`;\n \n case 'emoji':\n return `<span style=\"font-size: ${size}px; line-height: 1;\">${icon.emoji}</span>`;\n \n case 'text':\n return `<span style=\"font-size: ${Math.floor(size * 0.6)}px; font-weight: bold; color: white;\">${icon.text}</span>`;\n \n case 'microphone':\n default:\n return `<svg viewBox=\"0 0 24 24\" style=\"width: ${size}px; height: ${size}px; fill: white;\">\n <path d=\"M12 14c1.66 0 3-1.34 3-3V5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3z\"/>\n <path d=\"M17 11c0 2.76-2.24 5-5 5s-5-2.24-5-5H5c0 3.53 2.61 6.43 6 6.92V21h2v-3.08c3.39-.49 6-3.39 6-6.92h-2z\"/>\n </svg>`;\n \n case 'chat':\n return `<svg viewBox=\"0 0 24 24\" style=\"width: ${size}px; height: ${size}px; fill: white;\">\n <path d=\"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H6l-2 2V4h16v12z\"/>\n </svg>`;\n }\n }\n\n generateCSS(positionStyles, buttonSize, iconSize) {\n const btn = this.config.button;\n const icon = this.config.icon;\n const panel = this.config.panel;\n const header = this.config.header;\n const messages = this.config.messages;\n const anim = this.config.animation;\n \n // Determine which interfaces to show\n const widgetMode = this.config.behavior.mode || 'unified';\n const showVoice = widgetMode === 'unified' || widgetMode === 'voice-only';\n const showText = widgetMode === 'unified' || widgetMode === 'text-only';\n \n // Color references for clarity (needed for landing screen styles)\n const headerColor = header.backgroundColor;\n\n return `\n /* MOBILE FIRST - Default styles for all devices */\n #text-chat-widget {\n position: fixed !important;\n z-index: 10000;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n /* Mobile defaults */\n right: 10px;\n bottom: 10px;\n left: auto;\n top: auto;\n }\n \n /* Desktop positioning (only on larger screens) */\n @media (min-width: 769px) {\n #text-chat-widget {\n ${positionStyles}\n right: ${this.config.position.horizontal === 'right' ? '20px' : 'auto'};\n left: ${this.config.position.horizontal === 'left' ? '20px' : 'auto'};\n bottom: ${this.config.position.vertical === 'bottom' ? '20px' : 'auto'};\n top: ${this.config.position.vertical === 'top' ? '20px' : 'auto'};\n }\n }\n \n /* Mobile override (force mobile positioning) */\n @media (max-width: 768px) {\n #text-chat-widget {\n right: 10px !important;\n bottom: 10px !important;\n left: auto !important;\n top: auto !important;\n transform: none !important;\n }\n }\n \n @media (max-width: 480px) {\n #text-chat-widget {\n right: 8px !important;\n bottom: 8px !important;\n left: auto !important;\n top: auto !important;\n }\n }\n \n #text-chat-button {\n width: ${buttonSize}px;\n height: ${buttonSize}px;\n border-radius: ${btn.shape === 'circle' ? '50%' : btn.shape === 'square' ? '0' : '12px'};\n background: ${btn.backgroundColor || icon.backgroundColor || '#7C3AED'};\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all ${anim.duration}s ease;\n box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4);\n touch-action: manipulation;\n -webkit-tap-highlight-color: transparent;\n -webkit-touch-callout: none;\n user-select: none;\n min-width: 44px;\n min-height: 44px;\n }\n \n @media (max-width: 768px) {\n #text-chat-widget {\n right: 10px !important;\n bottom: 10px !important;\n left: auto !important;\n top: auto !important;\n transform: none !important;\n }\n \n #text-chat-button {\n width: 56px !important;\n height: 56px !important;\n min-width: 56px !important;\n min-height: 56px !important;\n max-width: 56px !important;\n max-height: 56px !important;\n }\n \n #text-chat-panel {\n position: fixed !important;\n left: 10px !important;\n right: 10px !important;\n bottom: 76px !important; /* 56px button + 20px gap */\n top: 60px !important; /* Add top spacing */\n width: auto !important;\n max-width: none !important;\n height: auto !important; /* Change from max-height to auto */\n max-height: none !important; /* Remove max-height */\n transform: none !important;\n margin: 0 !important;\n }\n \n #text-chat-panel .widget-header {\n padding: 10px 14px;\n min-height: 56px;\n }\n \n #text-chat-panel .header-title {\n font-size: 15px;\n }\n \n #text-chat-panel .header-icon {\n width: 40px;\n height: 40px;\n min-width: 40px;\n min-height: 40px;\n }\n \n #text-chat-input {\n font-size: 16px !important; /* Prevents iOS zoom on focus */\n padding: 12px 16px !important;\n min-height: 48px !important;\n }\n \n #text-chat-send {\n min-width: 48px !important;\n min-height: 48px !important;\n width: 48px !important;\n height: 48px !important;\n }\n \n .landing-screen {\n padding: 16px;\n }\n \n .landing-logo {\n font-size: 40px;\n }\n \n .landing-title {\n font-size: 18px;\n margin-bottom: 16px;\n }\n \n .mode-selection {\n flex-direction: column;\n gap: 12px;\n align-items: center;\n }\n \n .mode-card {\n max-width: 100%;\n width: 100%;\n padding: 16px;\n }\n \n .mode-card-icon {\n width: 50px;\n height: 50px;\n font-size: 28px;\n }\n \n .mode-card-title {\n font-size: 14px;\n }\n }\n \n @media (max-width: 480px) {\n #text-chat-widget {\n right: 8px !important;\n bottom: 8px !important;\n left: auto !important;\n top: auto !important;\n }\n \n #text-chat-button {\n width: 54px !important;\n height: 54px !important;\n min-width: 54px !important;\n min-height: 54px !important;\n }\n \n #text-chat-panel {\n left: 8px !important;\n right: 8px !important;\n bottom: 70px !important;\n top: 50px !important; /* Add top spacing for very small screens */\n height: auto !important;\n max-height: none !important;\n }\n \n #text-chat-panel .widget-header {\n padding: 8px 12px;\n min-height: 52px;\n }\n \n #text-chat-panel .header-title {\n font-size: 14px;\n }\n \n .landing-logo {\n font-size: 36px;\n }\n \n .landing-title {\n font-size: 16px;\n }\n }\n \n ${anim.enableHover ? `\n #text-chat-button:hover {\n background: linear-gradient(135deg, #764ba2 0%, #667eea 100%);\n transform: scale(1.05);\n box-shadow: 0 8px 20px rgba(102, 126, 234, 0.5);\n }\n ` : ''}\n \n #text-chat-panel {\n display: none;\n position: fixed;\n bottom: calc(${buttonSize}px + 20px);\n ${this.config.position.horizontal === 'right' ? 'right: 20px;' : 'left: 20px;'}\n width: ${panel.width}px;\n max-width: calc(100vw - 40px);\n height: ${panel.height}px;\n max-height: calc(100vh - ${buttonSize}px - 40px);\n background: transparent;\n border-radius: ${panel.borderRadius}px;\n border: none;\n flex-direction: column;\n overflow: hidden;\n ${panel.backdropFilter ? `backdrop-filter: ${panel.backdropFilter};` : ''}\n ${anim.enableSlide ? `transition: all ${anim.duration}s ease;` : ''}\n box-sizing: border-box;\n }\n \n #text-chat-panel.open {\n display: flex;\n ${anim.enableSlide ? 'transform: translateY(0); opacity: 1;' : ''}\n }\n\n /* Shell for gradient border/background */\n .widget-shell { width: 100%; height: 100%; padding: 0; border-radius: ${panel.borderRadius}px; background: transparent; box-shadow: 0 20px 60px rgba(0,0,0,0.15); overflow: hidden; display: flex; flex-direction: column; box-sizing: border-box; }\n .panel-inner { width: 100%; height: 100%; background: #ffffff; border-radius: ${panel.borderRadius}px; overflow: hidden; display:flex; flex-direction: column; padding: 0; box-sizing: border-box; max-width: 100%; }\n\n /* New structure styles matching provided design */\n #text-chat-panel .widget-container {\n width: 100%; height: 100%; min-height: 0; background: #FFFFFF; overflow: hidden; display: flex; flex-direction: column; border-radius: ${panel.borderRadius}px;\n container-type: size;\n }\n \n /* Ensure content areas can scroll when height is constrained */\n #text-chat-panel .widget-container > .landing-screen,\n #text-chat-panel .widget-container > .voice-interface,\n #text-chat-panel .widget-container > .text-interface {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n overflow-x: hidden;\n }\n \n /* Header should not scroll */\n #text-chat-panel .widget-header {\n padding: 12px 16px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n border-top-left-radius: ${panel.borderRadius}px;\n border-top-right-radius: ${panel.borderRadius}px;\n flex-shrink: 0;\n min-height: 60px;\n box-sizing: border-box;\n }\n #text-chat-panel .header-title { font-size: 16px; font-weight: 600; }\n #text-chat-panel .header-status { display: flex; align-items: center; gap: 8px; font-size: 12px; opacity: 0.9; }\n #text-chat-panel .status-dot { width: 8px; height: 8px; background: #4ade80; border-radius: 50%; animation: pulse 2s ease-in-out infinite; }\n @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } }\n /* Header icon buttons */\n .header-icon {\n background: rgba(255, 255, 255, 0.2);\n border: none;\n color: white;\n width: 36px;\n height: 36px;\n min-width: 36px;\n min-height: 36px;\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.2s;\n flex-shrink: 0;\n font-size: 16px;\n padding: 0;\n box-sizing: border-box;\n }\n \n .header-icon:hover {\n background: rgba(255, 255, 255, 0.3);\n }\n \n .header-icon svg {\n pointer-events: none;\n stroke: white;\n fill: none;\n }\n \n .back-btn.visible {\n display: flex !important;\n }\n\n /* Landing and mode selection (shown only if voice enabled) */\n .landing-screen { \n display: none; \n flex: 1; \n padding: 20px; \n background: ${this.config.landing?.backgroundColor || 'linear-gradient(180deg, #f8fafc 0%, #e0e7ff 100%)'}; \n align-items: center; \n justify-content: flex-start; \n flex-direction: column; \n gap: 16px; \n overflow-y: auto; \n min-height: 0; \n }\n .landing-screen.active { display: flex; }\n .landing-logo { font-size: 48px; }\n .landing-title { \n font-size: 20px; \n color: ${this.config.landing?.titleColor || '#1e293b'}; \n font-weight: 700; \n margin-bottom: 20px; \n text-align: center;\n width: 100%;\n }\n .mode-selection { display: flex; gap: 16px; width: 100%; justify-content: center; }\n .mode-card { \n flex: 1; \n max-width: 180px; \n background: ${this.config.landing?.modeCardBackgroundColor || '#FFFFFF'}; \n border: 2px solid ${this.config.landing?.modeCardBorderColor || '#E2E8F0'}; \n border-radius: 20px; \n padding: 20px 12px; \n cursor: pointer; \n display: flex; \n flex-direction: column; \n align-items: center; \n gap: 8px; \n transition: transform ${anim.duration}s ease, box-shadow ${anim.duration}s ease, border-color ${anim.duration}s ease; \n box-shadow: 0 4px 12px rgba(0,0,0,0.05); \n }\n .mode-card:hover { \n transform: translateY(-6px); \n box-shadow: 0 12px 24px rgba(102, 126, 234, 0.2); \n border-color: ${this.config.landing?.modeCardHoverBorderColor || headerColor}; \n }\n .mode-card-icon { \n width: 60px; \n height: 60px; \n display: flex; \n align-items: center; \n justify-content: center; \n border-radius: 50%; \n background: ${this.config.landing?.modeCardIconBackgroundColor || headerColor}; \n color: #fff; \n font-size: 32px; \n }\n .mode-card-title { \n color: ${this.config.landing?.modeCardTitleColor || '#111827'}; \n font-weight: 600; \n text-align: center;\n width: 100%;\n }\n\n ${showVoice ? this.voiceInterface.generateCSS() : ''}\n ${showText ? this.textInterface.generateCSS() : ''}\n \n #text-chat-send-hint {\n text-align: center;\n line-height: 1.4;\n }\n \n .agent-thinking {\n font-style: italic;\n color: #6B7280;\n }\n `;\n }\n\n setupWidgetEvents() {\n console.log('⚙️ setupWidgetEvents called', {\n stack: new Error().stack.split('\\n').slice(1, 6).join('\\n'),\n currentView: this.currentView\n });\n \n const openBtn = document.getElementById('text-chat-button');\n if (openBtn) {\n openBtn.onclick = () => this.togglePanel();\n }\n \n const closeBtn = document.getElementById('closeBtn');\n if (closeBtn) {\n closeBtn.onclick = () => this.togglePanel();\n }\n \n // Voice selection events (based on widget mode)\n const widgetMode = this.config.behavior.mode || 'unified';\n const showLanding = widgetMode === 'unified';\n const showVoice = widgetMode === 'unified' || widgetMode === 'voice-only';\n const showText = widgetMode === 'unified' || widgetMode === 'text-only';\n \n const backBtn = document.getElementById('backBtn');\n const landing = document.getElementById('landingScreen');\n const voiceCard = document.getElementById('mode-card-voice');\n const textCard = document.getElementById('mode-card-text');\n const textInterface = document.getElementById('textInterface');\n const voiceInterface = document.getElementById('voiceInterface');\n \n // Setup back button handler\n if (backBtn) {\n backBtn.onclick = () => this.showLanding();\n }\n \n if (showLanding) {\n if (voiceCard) voiceCard.onclick = () => this.showVoice();\n if (textCard) textCard.onclick = () => this.showText();\n \n // Restore previous view state if user had selected an interface, otherwise show landing\n if (this.currentView === 'text') {\n // User was on text interface, restore it\n if (landing) landing.classList.remove('active');\n if (textInterface) textInterface.classList.add('active');\n if (voiceInterface) voiceInterface.classList.remove('active');\n if (backBtn && widgetMode === 'unified') backBtn.classList.add('visible');\n if (newChatBtn) newChatBtn.style.display = '';\n } else if (this.currentView === 'voice') {\n // User was on voice interface, restore it\n if (landing) landing.classList.remove('active');\n if (textInterface) textInterface.classList.remove('active');\n if (voiceInterface) voiceInterface.classList.add('active');\n if (backBtn && widgetMode === 'unified') backBtn.classList.add('visible');\n if (newChatBtn) newChatBtn.style.display = 'none';\n } else {\n // Initial state or landing: show landing screen\n this.currentView = 'landing';\n if (landing) landing.classList.add('active');\n if (textInterface) textInterface.classList.remove('active');\n if (voiceInterface) voiceInterface.classList.remove('active');\n // Hide back button on landing screen (only exists in unified mode)\n if (backBtn && widgetMode === 'unified') backBtn.classList.remove('visible');\n }\n } else if (widgetMode === 'voice-only') {\n // Voice-only mode: show voice interface directly\n if (voiceInterface) voiceInterface.classList.add('active');\n if (textInterface) textInterface.classList.remove('active');\n if (landing) landing.classList.remove('active');\n // Back button doesn't exist in voice-only mode (only in unified)\n } else if (widgetMode === 'text-only') {\n // Text-only mode: show text interface directly\n if (textInterface) textInterface.classList.add('active');\n if (voiceInterface) voiceInterface.classList.remove('active');\n if (landing) landing.classList.remove('active');\n // Back button doesn't exist in text-only mode (only in unified)\n }\n \n // Setup interface event handlers\n if (showVoice) {\n console.log('⚙️ Setting up voice interface event handlers');\n this.voiceInterface.setupEventHandlers();\n }\n if (showText) {\n console.log('⚙️ Setting up text interface event handlers');\n this.textInterface.setupEventHandlers();\n }\n \n // Setup header button handlers\n const newChatBtn = document.getElementById('newChatBtn');\n \n if (newChatBtn) {\n newChatBtn.onclick = () => this.textInterface.startNewChat();\n // Hide new chat button on landing screen initially\n if (showLanding) {\n newChatBtn.style.display = 'none';\n }\n }\n \n // Keyboard navigation\n if (this.config.accessibility.keyboardNavigation) {\n this.setupKeyboardNavigation();\n }\n }\n\n startNewChat() {\n this.textInterface.startNewChat();\n }\n\n showLanding() {\n const widgetMode = this.config.behavior.mode || 'unified';\n if (widgetMode !== 'unified') return; // Only show landing in unified mode\n this.currentView = 'landing'; // Track state\n const landing = document.getElementById('landingScreen');\n const textInterface = document.getElementById('textInterface');\n const voiceInterface = document.getElementById('voiceInterface');\n const backBtn = document.getElementById('backBtn');\n const newChatBtn = document.getElementById('newChatBtn');\n if (landing) landing.classList.add('active');\n if (textInterface) textInterface.classList.remove('active');\n if (voiceInterface) voiceInterface.classList.remove('active');\n // Hide back button on landing screen\n if (backBtn) backBtn.classList.remove('visible');\n // Hide new chat button on landing screen\n if (newChatBtn) newChatBtn.style.display = 'none';\n }\n\n showText() {\n this.currentView = 'text'; // Track state\n const landing = document.getElementById('landingScreen');\n const voiceInterface = document.getElementById('voiceInterface');\n const backBtn = document.getElementById('backBtn');\n const newChatBtn = document.getElementById('newChatBtn');\n if (landing) landing.classList.remove('active');\n if (voiceInterface) voiceInterface.classList.remove('active');\n this.textInterface.show();\n // Show back button when not on landing (only in unified mode)\n const widgetMode = this.config.behavior.mode || 'unified';\n if (backBtn && widgetMode === 'unified') backBtn.classList.add('visible');\n // Show new chat button when not on landing\n if (newChatBtn) newChatBtn.style.display = '';\n }\n\n showVoice() {\n this.currentView = 'voice'; // Track state\n const landing = document.getElementById('landingScreen');\n const textInterface = document.getElementById('textInterface');\n const voiceInterface = document.getElementById('voiceInterface');\n const backBtn = document.getElementById('backBtn');\n const newChatBtn = document.getElementById('newChatBtn');\n if (landing) landing.classList.remove('active');\n if (textInterface) textInterface.classList.remove('active');\n if (voiceInterface) voiceInterface.classList.add('active');\n // Show back button when not on landing (only in unified mode)\n const widgetMode = this.config.behavior.mode || 'unified';\n if (backBtn && widgetMode === 'unified') backBtn.classList.add('visible');\n // Hide new chat button on voice interface (not applicable)\n if (newChatBtn) newChatBtn.style.display = 'none';\n }\n\n setupKeyboardNavigation() {\n document.addEventListener('keydown', (e) => {\n if (e.key === 'Escape' && this.isOpen) {\n this.togglePanel();\n }\n });\n }\n\n togglePanel() {\n this.isOpen = !this.isOpen;\n const panel = document.getElementById('text-chat-panel');\n panel.classList.toggle('open');\n \n // Focus input when opening\n if (this.isOpen) {\n setTimeout(() => {\n const input = document.getElementById('messageInput');\n if (input) input.focus();\n }, 100);\n }\n \n // Auto-connect if enabled\n if (this.isOpen && !this.isActive && this.config.behavior.autoConnect) {\n this.startChat();\n }\n }\n\n async startChat() {\n // No-op with single-shot design; connection happens per message\n this.isActive = true;\n this.textInterface.setActive(true);\n }\n\n async sendMessage() {\n await this.textInterface.sendMessage();\n }\n\n updateSendButtonState() {\n this.textInterface.updateSendButtonState();\n }\n\n async getSignedUrl() {\n // If getSessionUrl is not provided, construct URL directly from agentId and appId\n if (!this.config.getSessionUrl) {\n if (!this.config.agentId) {\n throw new Error('agentId is required');\n }\n \n // Build WebSocket URL directly\n // Default uses backend.talktopc.com for text chat (path may need adjustment)\n const baseUrl = this.config.websocketUrl || 'wss://backend.talktopc.com/ws/conv';\n const params = new URLSearchParams();\n params.append('agentId', this.config.agentId);\n \n if (this.config.appId) {\n params.append('appId', this.config.appId);\n }\n \n // Add demo flag if in development\n if (this.config.demo !== false) {\n params.append('demo', 'true');\n }\n \n return `${baseUrl}?${params.toString()}`;\n }\n \n // Handle getSessionUrl as string (backend URL)\n if (typeof this.config.getSessionUrl === 'string') {\n const requestBody = {\n agentId: this.config.agentId,\n variables: this.config.variables || {}\n };\n \n // Add appId if provided in config\n if (this.config.appId) {\n requestBody.appId = this.config.appId;\n }\n \n const response = await fetch(this.config.getSessionUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestBody)\n });\n\n if (!response.ok) {\n throw new Error(`Failed to get session URL: ${response.statusText}`);\n }\n\n const data = await response.json();\n return data.signedUrl || data.wsUrl || data.url;\n }\n \n // Handle getSessionUrl as function\n else if (typeof this.config.getSessionUrl === 'function') {\n const params = {\n agentId: this.config.agentId,\n variables: this.config.variables || {}\n };\n \n // Add appId if provided in config\n if (this.config.appId) {\n params.appId = this.config.appId;\n }\n \n const result = await this.config.getSessionUrl(params);\n \n return typeof result === 'string' ? result : (result.signedUrl || result.wsUrl || result.url);\n }\n \n else {\n throw new Error('getSessionUrl must be a string (backend URL), a function, or omitted (for direct connection with agentId/appId)');\n }\n }\n\n // Delegated to TextInterface\n addMessage(type, text) {\n this.textInterface.addMessage(type, text);\n }\n\n beginStreaming() {\n this.textInterface.beginStreaming();\n }\n\n appendStreamingChunk(chunk) {\n this.textInterface.appendStreamingChunk(chunk);\n }\n\n finalizeStreaming(fullText) {\n this.textInterface.finalizeStreaming(fullText);\n }\n\n stopStreamingState() {\n this.textInterface.stopStreamingState();\n }\n\n showError(message) {\n this.textInterface.showError(message);\n }\n\n updateStatus(status) {\n // Status update handler (can be overridden by users)\n }\n\n // Public API methods\n updateConfig(newConfig) {\n console.log('🔄 updateConfig called', {\n newConfig,\n stack: new Error().stack.split('\\n').slice(1, 6).join('\\n')\n });\n \n // Deep merge nested objects\n const mergedConfig = { ...this.config };\n \n // Deep merge panel config if it exists (common config)\n if (newConfig.panel) {\n mergedConfig.panel = { ...this.config.panel, ...newConfig.panel };\n }\n \n // Deep merge voice config if it exists\n if (newConfig.voice) {\n mergedConfig.voice = { ...this.config.voice, ...newConfig.voice };\n // Deep merge micButtonHint if it exists\n if (newConfig.voice.micButtonHint) {\n mergedConfig.voice.micButtonHint = {\n ...this.config.voice?.micButtonHint,\n ...newConfig.voice.micButtonHint\n };\n }\n }\n \n // Deep merge text config if it exists\n if (newConfig.text) {\n mergedConfig.text = { ...this.config.text, ...newConfig.text };\n // Deep merge sendButtonHint if it exists\n if (newConfig.text.sendButtonHint) {\n mergedConfig.text.sendButtonHint = {\n ...this.config.text?.sendButtonHint,\n ...newConfig.text.sendButtonHint\n };\n }\n }\n \n // Update language if provided - must be before mergeWithDefaults\n if (newConfig.language !== undefined) {\n mergedConfig.language = newConfig.language;\n }\n \n // Update direction if language changed to RTL language\n if (newConfig.language !== undefined) {\n const rtlLanguages = ['he', 'ar'];\n if (rtlLanguages.includes(newConfig.language)) {\n mergedConfig.direction = 'rtl';\n } else if (newConfig.direction === undefined) {\n mergedConfig.direction = 'ltr';\n }\n }\n \n // Update translations if provided\n if (newConfig.translations) {\n mergedConfig.translations = newConfig.translations;\n this.translations = newConfig.translations;\n }\n \n // Merge other configs (shallow merge is fine for these)\n if (newConfig.button) {\n mergedConfig.button = { ...this.config.button, ...newConfig.button };\n }\n if (newConfig.header) {\n mergedConfig.header = { ...this.config.header, ...newConfig.header };\n }\n if (newConfig.icon) {\n mergedConfig.icon = { ...this.config.icon, ...newConfig.icon };\n }\n if (newConfig.messages) {\n mergedConfig.messages = { ...this.config.messages, ...newConfig.messages };\n }\n if (newConfig.animation) {\n mergedConfig.animation = { ...this.config.animation, ...newConfig.animation };\n }\n if (newConfig.behavior) {\n mergedConfig.behavior = { ...this.config.behavior, ...newConfig.behavior };\n }\n if (newConfig.accessibility) {\n mergedConfig.accessibility = { ...this.config.accessibility, ...newConfig.accessibility };\n }\n if (newConfig.tooltips) {\n mergedConfig.tooltips = { ...this.config.tooltips, ...newConfig.tooltips };\n }\n if (newConfig.landing) {\n mergedConfig.landing = { ...this.config.landing, ...newConfig.landing };\n }\n \n // Merge direction property (only if not set by language change above)\n if (newConfig.direction !== undefined && mergedConfig.direction === undefined) {\n mergedConfig.direction = newConfig.direction;\n }\n \n // Merge primaryColor if provided\n if (newConfig.primaryColor !== undefined) {\n mergedConfig.primaryColor = newConfig.primaryColor;\n }\n \n // Merge any other top-level properties\n Object.keys(newConfig).forEach(key => {\n if (!['panel', 'button', 'header', 'icon', 'messages', 'direction', 'voice', 'text', 'animation', 'behavior', 'accessibility', 'language', 'tooltips', 'landing', 'primaryColor'].includes(key)) {\n mergedConfig[key] = newConfig[key];\n }\n });\n \n // Store current language before merge to detect changes\n const oldLanguage = this.config?.language || 'en';\n \n this.config = this.mergeWithDefaults(mergedConfig);\n \n // Recreate interfaces with new config (after mergeWithDefaults, so language is current)\n // Ensure language is correctly passed - use the merged config value\n const currentLanguage = this.config.language || 'en';\n const voiceConfig = {\n ...this.config,\n ...this.config.voice,\n language: currentLanguage, // Use the current language from merged config\n websocketUrl: this.config.voice?.websocketUrl || this.config.websocketUrl || 'wss://speech.talktopc.com/ws/conv',\n translations: this.translations\n };\n this.voiceInterface = new VoiceInterface(voiceConfig);\n const textConfig = {\n ...this.config,\n ...this.config.text,\n language: currentLanguage, // Ensure language is set from merged config\n translations: this.translations\n };\n this.textInterface = new TextInterface(textConfig, this.sdk);\n \n // Recreate widget with new config\n const existingWidget = document.getElementById('text-chat-widget');\n if (existingWidget) {\n existingWidget.remove();\n }\n this.createWidget();\n \n // Update input attributes in case widget was recreated\n if (this.textInterface && this.textInterface.updateInputAttributes) {\n this.textInterface.updateInputAttributes();\n }\n }\n\n destroy() {\n const widget = document.getElementById('text-chat-widget');\n if (widget) {\n widget.remove();\n }\n if (this.sdk) {\n this.sdk.destroy();\n }\n // Clean up interface resources\n if (this.voiceInterface) {\n this.voiceInterface.destroy();\n }\n }\n\n // Delegated to VoiceInterface\n async startVoiceCall() {\n await this.voiceInterface.startVoiceCall();\n }\n\n endVoiceCall() {\n this.voiceInterface.endVoiceCall();\n }\n\n toggleMute() {\n this.voiceInterface.toggleMute();\n }\n\n toggleSpeaker() {\n this.voiceInterface.toggleSpeaker();\n }\n}\n\n","/**\n * TTP Agent SDK - Main Entry Point\n * \n * A comprehensive SDK for voice and text interaction with AI agents.\n * Provides real-time audio recording, WebSocket communication, and audio playback.\n * \n * Features:\n * - 🎤 Real-time Audio Recording with AudioWorklet\n * - 💬 Text Chat Support\n * - 🔄 WebSocket Communication with authentication\n * - 🔊 Audio Playback with queue management\n * - ⚛️ React Components\n * - 🌐 Vanilla JavaScript Components\n * - 🎯 Event-driven architecture\n * - 🔒 Multiple authentication methods\n */\n\n// Core SDK\nimport VoiceSDK from './core/VoiceSDK.js';\nimport VoiceSDK_v2 from './v2/VoiceSDK.js';\nimport TextChatSDK from './core/TextChatSDK.js';\nimport WebSocketManager from './core/WebSocketManager.js';\nimport AudioRecorder from './core/AudioRecorder.js';\nimport AudioPlayer from './core/AudioPlayer.js';\nimport EventEmitter from './core/EventEmitter.js';\n\n// React components\nimport VoiceButton from './react/VoiceButton.jsx';\n\n// Vanilla JavaScript components\nimport VanillaVoiceButton from './vanilla/VoiceButton.js';\n\n// TTPChatWidget and AgentSDK (AgentSDK is used by VoiceInterface, which TTPChatWidget uses)\nimport { AgentSDK } from './legacy/AgentSDK.js';\nimport { TTPChatWidget } from './legacy/TextChatWidget.js';\n\n// Version\nexport const VERSION = '2.0.0';\n\n// Named exports\nexport {\n VoiceSDK,\n VoiceSDK_v2,\n TextChatSDK,\n WebSocketManager,\n AudioRecorder,\n AudioPlayer,\n EventEmitter,\n VoiceButton,\n VanillaVoiceButton,\n AgentSDK,\n TTPChatWidget\n};\n\n// Default export for convenience\nexport default {\n VoiceSDK,\n VoiceSDK_v2,\n TextChatSDK,\n WebSocketManager,\n AudioRecorder,\n AudioPlayer,\n EventEmitter,\n VoiceButton,\n VanillaVoiceButton,\n AgentSDK,\n TTPChatWidget,\n VERSION\n};\n"],"names":["root","factory","exports","module","define","amd","window","REACT_ELEMENT_TYPE","Symbol","for","jsxProd","type","config","maybeKey","key","propName","ref","$$typeof","props","jsx","jsxs","iterator","ReactNoopUpdateQueue","isMounted","enqueueForceUpdate","enqueueReplaceState","enqueueSetState","assign","Object","emptyObject","Component","context","updater","this","refs","ComponentDummy","PureComponent","prototype","isReactComponent","setState","partialState","callback","Error","forceUpdate","pureComponentPrototype","constructor","isPureReactComponent","Array","isArray","ReactSharedInternals","H","A","T","S","hasOwnProperty","reportError","useEffect","create","deps","useRef","initialValue","useState","initialState","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","d","definition","o","defineProperty","enumerable","get","obj","prop","call","r","toStringTag","value","EventEmitter","_classCallCheck","events","event","push","filter","cb","_len","arguments","length","args","_key","forEach","apply","error","console","concat","e","t","n","i","c","Generator","u","_regeneratorDefine2","f","p","y","G","v","a","bind","l","TypeError","done","return","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","setPrototypeOf","__proto__","displayName","_regenerator","w","m","_invoke","configurable","writable","asyncGeneratorStep","Promise","resolve","then","_defineProperties","_toPropertyKey","_typeof","toPrimitive","String","_toPrimitive","_isNativeReflectConstruct","Boolean","valueOf","Reflect","construct","_getPrototypeOf","_setPrototypeOf","_EventEmitter","WebSocketSingleton","_this","ReferenceError","_assertThisInitialized","_possibleConstructorReturn","_callSuper","connections","Map","connectionCounts","creatingConnections","Set","_inherits","_callee","url","existingConnection","connection","_this2","_context","has","set","checkConnection","setTimeout","add","WebSocket","addEventListener","delete","emit","_getConnection","_next","_throw","_x","currentCount","newCount","Math","max","readyState","OPEN","close","exists","subscribers","_step","result","_iterator","_createForOfIteratorHelper","entries","s","_step$value","_slicedToArray","err","_step2","_iterator2","_step2$value","clear","WebSocketManager","ws","isConnected","connectionId","reject","Date","now","random","toString","substr","connectResolve","connectReject","webSocketSingleton","getConnection","websocketUrl","setupEventListeners","catch","_connect","_this3","handleOpen","handleClose","handleError","handleMessage","on","eventHandlers","open","message","off","releaseConnection","send","JSON","stringify","warn","data","_this4","ArrayBuffer","Blob","arrayBuffer","parse","getAllConnections","clearAll","_asyncToGenerator","_arrayLikeToArray","AudioRecorder","audioContext","audioWorkletNode","mediaStream","isRecording","audioProcessorPath","slice","name","from","test","_unsupportedIterableToArray","_n","F","next","document","getElementsByTagName","src","includes","URL","basePath","substring","lastIndexOf","_start","processorPath","_t","navigator","mediaDevices","getUserMedia","audio","sampleRate","channelCount","echoCancellation","noiseSuppression","autoGainControl","AudioContext","webkitAudioContext","state","resume","getAudioProcessorPath","audioWorklet","addModule","AudioWorkletNode","createMediaStreamSource","connect","port","onmessage","_event$data","postMessage","enabled","_stop","_callee2","_t2","_context2","getTracks","track","stop","audioContextState","AudioPlayer","audioQueue","isPlaying","isProcessingQueue","currentSource","audioData","audioBlob","createAudioBlob","processQueue","uint8Array","Uint8Array","wasNotPlayingBefore","contextOptions","audioBuffer","isTrulyStarting","source","shift","decodeAudioData","createBufferSource","buffer","destination","onended","start","_processQueue","stopImmediate","wasPlaying","queueLength","ownKeys","keys","getOwnPropertySymbols","getOwnPropertyDescriptor","_objectSpread","_defineProperty","getOwnPropertyDescriptors","defineProperties","VoiceSDK","agentId","appId","ttpId","voice","language","agentSettingsOverride","isDestroyed","webSocketManager","autoReconnect","audioRecorder","audioPlayer","setupEventHandlers","sendHelloMessage","code","reason","domainError","stopRecording","binaryString","atob","charCodeAt","playAudio","sendMessage","sendBinary","wsUrl","buildWebSocketUrl","params","URLSearchParams","append","separator","disconnect","resetReconnectionAttempts","_reconnect","_startRecording","_callee3","_context3","generateTtpId","_stopRecording","_callee4","_t3","_context4","_toggleRecording","_callee5","_context5","startRecording","_handleBargeIn","_callee6","_context6","stopAudioPlayback","newConfig","helloMessage","log","destroy","removeAllListeners","listener","listenerToRemove","onceWrapper","PCMCodec","pcmData","PCMUCodec","pcmuData","input","pcm16","Int16Array","mulawToLinear","pcm16Data","pcmu","linearToMulaw","mulaw","step","sample","sign","exponent","expMask","PCMACodec","pcmaData","alawToLinear","pcma","linearToAlaw","alaw","mantissa","outputFormat","nextStartTime","scheduledBuffers","scheduledSources","pcmChunkQueue","preparedBuffer","isProcessingPcmQueue","isSchedulingFrames","MAX_LOOKAHEAD_SECONDS","codecs","pcm","SUPPORTED_CONTAINERS","SUPPORTED_ENCODINGS","SUPPORTED_SAMPLE_RATES","SUPPORTED_BIT_DEPTHS","SUPPORTED_CHANNELS","format","_this$outputFormat","validateFormat","getDefaultFormat","oldSampleRate","newSampleRate","_format$container","_format$encoding","container","toLowerCase","encoding","bitDepth","channels","binaryData","_playChunk","preparedFrame","_this$audioContext","prepareChunk","requestAnimationFrame","schedulePreparedFrames","processPcmQueue","byteLength","_this$outputFormat2","initializeAudioContext","processedData","padded","int16Array","float32Array","Float32Array","NORMALIZATION","audioDataSampleRate","contextSampleRate","createBuffer","getChannelData","chunkDuration","duration","sampleCount","actualDuration","_schedulePreparedFrames","targetLookaheadFrames","scheduledCount","_loop","currentTime","minStartTime","startTime","round","toFixed","_regeneratorValues","_processPcmQueue","_this$outputFormat3","_this$outputFormat4","_this5","rawData","bytes","isNegotiatedWav","isNegotiatedRaw","looksLikeWav","isWavFile","handleWavFile","handleRawData","wavInfo","parseWavHeader","audioFormat","getEncodingName","bitsPerSample","codec","getCodecForWavFormat","decode","wavHeader","createWavHeader","outputBitDepth","getCodec","toUpperCase","convert24BitTo16Bit","convert8BitTo16Bit","samples","floor","byte0","byte1","byte2","value24","min","value8","normalized","view","DataView","byteOffset","getUint16","getUint32","byteRate","blockAlign","dataLength","numChannels","header","setUint32","setUint16","_this$outputFormat5","_this$outputFormat6","desiredSampleRate","currentSampleRate","abs","latencyHint","wasFirstPlay","shouldEmitStart","_this6","size","stoppedCount","preparedBufferLength","scheduledSourcesCount","ContainerConverter","wavData","fromCharCode","dataChunkStart","dataSize","dataStart","actualDataSize","wavFile","EncodingConverter","encodedData","normalizedEncoding","targetEncoding","encoded","encode","BitDepthConverter","inputBitDepth","inputBytesPerSample","outputBytesPerSample","numSamples","convert24To16","convert16To24","convert16To8","convert24To8","pcm24Data","pcm24","pcm8","SampleRateConverter","inputSampleRate","outputSampleRate","outputLength","offlineContext","inputBuffer","resampledBuffer","resampledFloat32","resampledInt16","_i","ceil","OfflineAudioContext","startRendering","_resample","_x2","_x3","ChannelConverter","inputChannels","outputChannels","monoToStereo","stereoToMono","monoData","bytesPerSample","stereoData","output","inputOffset","outputOffset","j","leftOffset","rightOffset","left","right","mono","AudioFormatConverter","requestedFormat","actualFormat","encodingConverter","conversionSteps","_analyzeConversions","steps","currentData","currentFormat","extracted","needsConversion","extractPcmFromWav","decodeToPcm","convert","resample","encodeFromPcm","wrapPcmInWav","_convert","VoiceSDK_v2","version","outputContainer","getDefaultContainer","outputEncoding","outputCodec","outputFrameDurationMs","protocolVersion","hasEverConnected","outputAudioFormat","requestedOutputFormat","formatConverter","websocket","setupAudioPlayerEvents","setupAudioRecorderEvents","validateConfig","SUPPORTED_INPUT_ENCODINGS","SUPPORTED_INPUT_SAMPLE_RATES","SUPPORTED_INPUT_BIT_DEPTHS","SUPPORTED_INPUT_CHANNELS","join","_format$encoding2","SUPPORTED_OUTPUT_ENCODINGS","SUPPORTED_OUTPUT_SAMPLE_RATES","SUPPORTED_OUTPUT_BIT_DEPTHS","SUPPORTED_OUTPUT_CHANNELS","SUPPORTED_OUTPUT_CONTAINERS","inputFormat","inputError","validateInputFormat","outputError","validateOutputFormat","audioPlayerStatus","getStatus","hasScheduledAudio","isActuallyPlaying","_bargeInChecked","baseUrl","onopen","onerror","onclose","handleBinaryMessage","handleHelloAck","hasOutputFormat","messageType","setOutputFormat","negotiatedFormat","mismatches","getConversionSteps","defaultFormat","_handleBinaryMessage","processedAudio","playbackFormat","decoded","playChunk","_t4","TextChatSDK","scriptConfig","readScriptTagConfig","baseWsUrl","conversationId","getPersistedConversationId","forceConversationId","queue","inFlight","fullResponseBuffer","sdkScript","reverse","find","dataset","_","base","text","trim","task","executeTask","_sendMessage","persisted","socket","primaryUrl","fallbackBase","endsWith","replace","fallbackUrl","triedFallback","messageSent","helloWaitTimer","sendPayload","payload","effectiveConvId","persistConversationId","evt","clearTimeout","content","finalText","answer","fullText","drainQueue","fb","localStorage","setItem","getItem","_arrayWithHoles","_iterableToArrayLimit","_nonIterableRest","_ref","_ref$voice","_ref$language","_ref$autoReconnect","_ref$agentSettingsOve","onConnected","onDisconnected","onRecordingStarted","onRecordingStopped","onPlaybackStarted","onPlaybackStopped","onError","onMessage","onBargeIn","onStopPlaying","_ref$className","className","_ref$style","style","children","_useState2","setIsConnected","_useState4","setIsRecording","_useState6","setIsPlaying","_useState8","setConnectionStatus","voiceSDKRef","current","voiceSDK","handleClick","_ref2","toggleRecording","defaultContent","_jsxs","display","alignItems","gap","_jsx","fontSize","padding","border","borderRadius","backgroundColor","color","cursor","fontWeight","transition","onClick","disabled","VoiceButton","options","body","buttonText","buttonClass","createButton","_this$options$onConne","_this$options","updateButton","_this$options$onDisco","_this$options2","_this$options$onRecor","_this$options3","_this$options$onRecor2","_this$options4","_this$options$onPlayb","_this$options5","_this$options$onPlayb2","_this$options6","_this$options$onError","_this$options7","_this$options$onMessa","_this$options8","_this$options$onBarge","_this$options9","_this$options$onStopP","_this$options0","button","createElement","cssText","appendChild","icon","innerHTML","updateConfig","parentNode","removeChild","AgentSDK","isListening","onTranscript","onAgentSpeaking","isStart","signedUrl","handleWebSocketMessage","user_transcription","_startListening","variables","VoiceInterface","audioStream","callStartTime","callTimerInterval","sdk","isActive","getSessionUrl","setupSDKEventHandlers","updateTranscript","avatar","getElementById","classList","remove","endVoiceCall","showDomainError","showError","_this$config$translat","_this$config$translat2","lang","translations","en","_this$config$tooltips","tooltip","tooltips","mute","speaker","endCall","getTooltip","avatarBg","avatarBackgroundColor","avatarActiveBg","avatarActiveBackgroundColor","statusTitleColor","statusSubtitleColor","startCallBtnColor","startCallButtonColor","startCallBtnTextColor","startCallButtonTextColor","transcriptBg","transcriptBackgroundColor","transcriptTextColor","transcriptLabelColor","controlBtnColor","controlButtonColor","controlBtnSecondaryColor","controlButtonSecondaryColor","endCallButtonColor","callbacks","startCallBtn","endCallBtn","muteBtn","speakerBtn","onclick","startVoiceCall","toggleMute","toggleSpeaker","tryAdjustSizes","attempt","voiceInterface","contains","clientHeight","adjustSizesForContainer","_getSignedUrl","requestBody","response","_params","demo","fetch","method","headers","ok","statusText","json","containerHeight","containerWidth","clientWidth","avatarSize","avatarFontSize","titleSize","subtitleSize","statusHeight","transcriptHeight","buttonSize","primaryButtonSize","gapSize","idleState","activeState","isIdleVisible","isActiveVisible","querySelectorAll","avatars","width","height","el","transcript","querySelector","minHeight","maxHeight","boxSizing","transcriptLabel","transcriptText","btn","svg","iconSize","setProperty","primaryButton","btnHeight","btnFontSize","btnIcon","_startVoiceCall","connected","attempts","_idleState","_activeState","scrollTop","getSignedUrl","startListening","setInterval","elapsed","minutes","seconds","timerEl","textContent","padStart","stopListening","clearInterval","transcriptEl","title","audioTrack","getAudioTracks","muteIcon","muteCross","stroke","TextInterface","streamingEl","hasStartedStreaming","autoResize","keydown","eventHandlersSetup","_this$config$panel","_this$config$sendButt","_this$config$panel2","_this$config$sendButt2","_this$config$panel3","_this$config$sendButt3","_this$config$panel4","_this$config$sendButt4","_this$config$panel5","inputPlaceholder","panel","direction","sendButtonText","sendButtonHint","_this$config$panel6","_this$config$panel7","_this$config$panel8","_this$config$panel9","_this$config$panel0","_this$config$panel1","_this$config$panel10","_this$config$panel11","_this$config$panel12","_this$config$panel13","_this$config$panel14","_this$config$panel15","_this$config$panel16","messages","sendButtonColor","animation","sendButtonHoverColor","sendButtonTextColor","inputBorderColor","inputFocusColor","inputBackgroundColor","inputTextColor","inputFontSize","inputBorderRadius","inputPadding","textColor","userBackgroundColor","agentBackgroundColor","systemBackgroundColor","errorBackgroundColor","sendButtonFontSize","sendButtonFontWeight","sendButton","inputField","newChatBtn","startNewChat","updateInputAttributes","overflow","newHeight","scrollHeight","overflowY","shiftKey","preventDefault","removeItem","focus","_this$config$panel17","placeholder","dir","textAlign","textInterface","_startChat","updateSendButtonState","startChat","addMessage","beginStreaming","stopStreamingState","emptyState","edgeClass","bubble","id","chunk","existing","_this$config$messages","errorContainer","errorEl","active","TTPChatWidget","_this$config$voice","_this$config$voice2","mergeWithDefaults","isOpen","widgetTranslations","currentView","voiceConfig","textConfig","createWidget","behavior","startOpen","autoOpen","userConfig","_userConfig$button","_userConfig$button2","_userConfig$header","_userConfig$button3","_userConfig$icon","_userConfig$icon2","_userConfig$icon3","_userConfig$icon4","_userConfig$icon5","_userConfig$icon6","_userConfig$button4","_userConfig$button5","_userConfig$button6","_userConfig$icon7","_userConfig$button7","_userConfig$button8","_userConfig$button9","_userConfig$button0","_userConfig$icon8","_userConfig$panel","_userConfig$panel2","_userConfig$panel3","_userConfig$panel4","_userConfig$panel5","_userConfig$panel6","_userConfig$voice","_userConfig$panel7","_userConfig$voice2","_userConfig$panel8","_userConfig$voice3","_userConfig$panel9","_userConfig$voice4","_userConfig$panel0","_userConfig$voice5","_userConfig$panel1","_userConfig$voice6","_userConfig$panel10","_userConfig$voice7","_userConfig$voice8","_userConfig$voice9","_userConfig$voice0","_userConfig$voice1","_userConfig$voice10","_userConfig$voice11","_userConfig$voice12","_userConfig$voice13","_userConfig$voice14","_userConfig$voice15","_userConfig$voice16","_userConfig$voice17","_userConfig$voice18","_userConfig$text","_userConfig$panel11","_userConfig$text2","_userConfig$panel12","_userConfig$text3","_userConfig$panel13","_userConfig$text4","_userConfig$panel14","_userConfig$text5","_userConfig$panel15","_userConfig$text6","_userConfig$panel16","_userConfig$text7","_userConfig$panel17","_userConfig$text8","_userConfig$panel18","_userConfig$text9","_userConfig$panel19","_userConfig$text0","_userConfig$panel20","_userConfig$text1","_userConfig$panel21","_userConfig$text10","_userConfig$panel22","_userConfig$text11","_userConfig$panel23","_userConfig$text12","_userConfig$panel24","_userConfig$text13","_userConfig$panel25","_userConfig$text14","_userConfig$panel26","_userConfig$text15","_userConfig$panel27","_userConfig$text16","_userConfig$panel28","_userConfig$text17","_userConfig$panel29","_userConfig$landing","_userConfig$landing2","_userConfig$landing3","_userConfig$landing4","_userConfig$landing5","_userConfig$landing6","_userConfig$landing7","_userConfig$landing8","_userConfig$landing9","_userConfig$landing0","_userConfig$landing1","_userConfig$header2","_userConfig$header3","_userConfig$header4","_userConfig$button1","_userConfig$header5","_userConfig$header6","_userConfig$tooltips","_userConfig$tooltips2","_userConfig$tooltips3","_userConfig$tooltips4","_userConfig$tooltips5","_userConfig$tooltips6","_userConfig$messages","_userConfig$messages2","_userConfig$messages3","_userConfig$messages4","_userConfig$messages5","_userConfig$messages6","_userConfig$messages7","_userConfig$animation","_userConfig$animation2","_userConfig$animation3","_userConfig$animation4","_userConfig$behavior","_userConfig$behavior2","_userConfig$behavior3","_userConfig$behavior4","_userConfig$behavior5","_userConfig$behavior6","_userConfig$behavior7","_userConfig$behavior8","_userConfig$accessibi","_userConfig$accessibi2","_userConfig$accessibi3","positionConfig","position","parts","split","vertical","horizontal","offset","positionOffset","x","primaryColor","headerColor","customImage","emoji","shape","hoverColor","shadow","shadowColor","backdropFilter","micButtonColor","micButtonActiveColor","micButtonHint","sendButtonActiveColor","landing","logo","titleColor","modeCardBackgroundColor","modeCardBorderColor","modeCardHoverBorderColor","modeCardIconBackgroundColor","modeCardTitleColor","voiceCardIcon","textCardIcon","showTitle","showCloseButton","newChat","back","enableHover","enablePulse","enableSlide","hidden","autoConnect","showWelcomeMessage","welcomeMessage","enableVoiceMode","mode","accessibility","ariaLabel","ariaDescription","keyboardNavigation","customStyles","positionString","appendStreamingChunk","finalizeStreaming","stack","existingWidget","widget","generateWidgetHTML","setupWidgetEvents","small","medium","large","xl","positionStyles","generatePositionStyles","iconHTML","generateIconHTML","widgetMode","showLanding","showVoice","showText","_this2$config$tooltip","generateCSS","generateHTML","pos","styles","_this$config$landing","_this$config$landing2","_this$config$landing3","_this$config$landing4","_this$config$landing5","_this$config$landing6","_this$config$landing7","anim","openBtn","togglePanel","closeBtn","backBtn","voiceCard","textCard","setupKeyboardNavigation","show","toggle","setActive","status","_this$config","_this$config$voice4","_this$config$voice3","_this$config$text","mergedConfig","currentLanguage","VERSION","VanillaVoiceButton"],"sourceRoot":""}
1
+ {"version":3,"file":"agent-widget.js","mappings":";CAAA,SAA2CA,EAAMC,GAC1B,iBAAZC,SAA0C,iBAAXC,OACxCA,OAAOD,QAAUD,IACQ,mBAAXG,QAAyBA,OAAOC,IAC9CD,OAAO,GAAIH,GACe,iBAAZC,QACdA,QAAqB,YAAID,IAEzBD,EAAkB,YAAIC,GACvB,CATD,CASGK,OAAQ,I,wCCNTH,EAAOD,QAAU,EAAjB,I,kBCQEK,EAAqBC,OAAOC,IAAI,8BAEpC,SAASC,EAAQC,EAAMC,EAAQC,GAC7B,IAAIC,EAAM,KAGV,QAFA,IAAWD,IAAaC,EAAM,GAAKD,QACnC,IAAWD,EAAOE,MAAQA,EAAM,GAAKF,EAAOE,KACxC,QAASF,EAEX,IAAK,IAAIG,KADTF,EAAW,CAAC,EACSD,EACnB,QAAUG,IAAaF,EAASE,GAAYH,EAAOG,SAChDF,EAAWD,EAElB,OADAA,EAASC,EAASG,IACX,CACLC,SAAUV,EACVI,KAAMA,EACNG,IAAKA,EACLE,SAAK,IAAWJ,EAASA,EAAS,KAClCM,MAAOL,EAEX,CAlBwBL,OAAOC,IAAI,kBAoBnCP,EAAQiB,IAAMT,EACdR,EAAQkB,KAAOV,C,gBC9BbP,EAAOD,QAAU,EAAjB,I,cCQuBM,OAAOC,IAAI,8BACdD,OAAOC,IAAI,gBACTD,OAAOC,IAAI,kBACRD,OAAOC,IAAI,qBACdD,OAAOC,IAAI,kBACXD,OAAOC,IAAI,kBACZD,OAAOC,IAAI,iBACPD,OAAOC,IAAI,qBACdD,OAAOC,IAAI,kBACfD,OAAOC,IAAI,cACXD,OAAOC,IAAI,cACPD,OAAOC,IAAI,kBACTD,OAAOa,S,IAQ7BC,EAAuB,CACvBC,UAAW,WACT,OAAO,CACT,EACAC,mBAAoB,WAAa,EACjCC,oBAAqB,WAAa,EAClCC,gBAAiB,WAAa,GAEhCC,EAASC,OAAOD,OAChBE,EAAc,CAAC,EACjB,SAASC,EAAUZ,EAAOa,EAASC,GACjCC,KAAKf,MAAQA,EACbe,KAAKF,QAAUA,EACfE,KAAKC,KAAOL,EACZI,KAAKD,QAAUA,GAAWV,CAC5B,CAgBA,SAASa,IAAkB,CAE3B,SAASC,EAAclB,EAAOa,EAASC,GACrCC,KAAKf,MAAQA,EACbe,KAAKF,QAAUA,EACfE,KAAKC,KAAOL,EACZI,KAAKD,QAAUA,GAAWV,CAC5B,CAtBAQ,EAAUO,UAAUC,iBAAmB,CAAC,EACxCR,EAAUO,UAAUE,SAAW,SAAUC,EAAcC,GACrD,GACE,iBAAoBD,GACpB,mBAAsBA,GACtB,MAAQA,EAER,MAAME,MACJ,0GAEJT,KAAKD,QAAQN,gBAAgBO,KAAMO,EAAcC,EAAU,WAC7D,EACAX,EAAUO,UAAUM,YAAc,SAAUF,GAC1CR,KAAKD,QAAQR,mBAAmBS,KAAMQ,EAAU,cAClD,EAEAN,EAAeE,UAAYP,EAAUO,UAOrC,IAAIO,EAA0BR,EAAcC,UAAY,IAAIF,EAC5DS,EAAuBC,YAAcT,EACrCT,EAAOiB,EAAwBd,EAAUO,WACzCO,EAAuBE,sBAAuB,EAC5BC,MAAMC,QAExB,IAAIC,EAAuB,CAAEC,EAAG,KAAMC,EAAG,KAAMC,EAAG,KAAMC,EAAG,MACxCzB,OAAOS,UAAUiB,eA8MhC,mBAAsBC,aAClBA,YAkNRrD,EAAQsD,UAAY,SAAUC,EAAQC,GACpC,OAAOT,EAAqBC,EAAEM,UAAUC,EAAQC,EAClD,EAyBAxD,EAAQyD,OAAS,SAAUC,GACzB,OAAOX,EAAqBC,EAAES,OAAOC,EACvC,EACA1D,EAAQ2D,SAAW,SAAUC,GAC3B,OAAOb,EAAqBC,EAAEW,SAASC,EACzC,C,GC7gBIC,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBE,IAAjBD,EACH,OAAOA,EAAahE,QAGrB,IAAIC,EAAS4D,EAAyBE,GAAY,CAGjD/D,QAAS,CAAC,GAOX,OAHAkE,EAAoBH,GAAU9D,EAAQA,EAAOD,QAAS8D,GAG/C7D,EAAOD,OACf,CCrBA8D,EAAoBK,EAAI,CAACnE,EAASoE,KACjC,IAAI,IAAIxD,KAAOwD,EACXN,EAAoBO,EAAED,EAAYxD,KAASkD,EAAoBO,EAAErE,EAASY,IAC5Ec,OAAO4C,eAAetE,EAASY,EAAK,CAAE2D,YAAY,EAAMC,IAAKJ,EAAWxD,MCJ3EkD,EAAoBO,EAAI,CAACI,EAAKC,IAAUhD,OAAOS,UAAUiB,eAAeuB,KAAKF,EAAKC,GCClFZ,EAAoBc,EAAK5E,IACH,oBAAXM,QAA0BA,OAAOuE,aAC1CnD,OAAO4C,eAAetE,EAASM,OAAOuE,YAAa,CAAEC,MAAO,WAE7DpD,OAAO4C,eAAetE,EAAS,aAAc,CAAE8E,OAAO,K,i7BCLvD,IAGqBC,EAAY,WAK/B,O,EAJA,SAAAA,K,4FAAcC,CAAA,KAAAD,GACZhD,KAAKkD,OAAS,CAAC,CACjB,E,EAEA,EAAArE,IAAA,KAAAkE,MAGA,SAAGI,EAAO3C,GACHR,KAAKkD,OAAOC,KACfnD,KAAKkD,OAAOC,GAAS,IAEvBnD,KAAKkD,OAAOC,GAAOC,KAAK5C,EAC1B,GAEA,CAAA3B,IAAA,MAAAkE,MAGA,SAAII,EAAO3C,GACJR,KAAKkD,OAAOC,KAEjBnD,KAAKkD,OAAOC,GAASnD,KAAKkD,OAAOC,GAAOE,OAAO,SAAAC,GAAE,OAAIA,IAAO9C,CAAQ,GACtE,GAEA,CAAA3B,IAAA,OAAAkE,MAGA,SAAKI,GAAgB,QAAAI,EAAAC,UAAAC,OAANC,EAAI,IAAA5C,MAAAyC,EAAA,EAAAA,EAAA,KAAAI,EAAA,EAAAA,EAAAJ,EAAAI,IAAJD,EAAIC,EAAA,GAAAH,UAAAG,GACZ3D,KAAKkD,OAAOC,IAEjBnD,KAAKkD,OAAOC,GAAOS,QAAQ,SAAApD,GACzB,IACEA,EAAQqD,WAAC,EAAGH,EACd,CAAE,MAAOI,GACPC,QAAQD,MAAM,+BAADE,OAAgCb,EAAK,KAAKW,EACzD,CACF,EACF,GAEA,CAAAjF,IAAA,qBAAAkE,MAGA,SAAmBI,GACbA,SACKnD,KAAKkD,OAAOC,GAEnBnD,KAAKkD,OAAS,CAAC,CAEnB,I,gFAAC,CAhD8B,G,w3DCFjC,IAAAe,EAAAC,EAAArB,EAAA,mBAAAtE,OAAAA,OAAA,GAAA4F,EAAAtB,EAAAzD,UAAA,aAAAkD,EAAAO,EAAAC,aAAA,yBAAAsB,EAAAvB,EAAAsB,EAAA7B,EAAA8B,GAAA,IAAAC,EAAAF,GAAAA,EAAA/D,qBAAAkE,EAAAH,EAAAG,EAAAC,EAAA5E,OAAA6B,OAAA6C,EAAAjE,WAAA,OAAAoE,EAAAD,EAAA,mBAAA1B,EAAAsB,EAAA7B,GAAA,IAAA8B,EAAAC,EAAAE,EAAAE,EAAA,EAAAC,EAAApC,GAAA,GAAAqC,GAAA,EAAAC,EAAA,CAAAF,EAAA,EAAAP,EAAA,EAAAU,EAAAZ,EAAAa,EAAA1C,EAAAqC,EAAArC,EAAA2C,KAAAd,EAAA,GAAA7B,EAAA,SAAA8B,EAAArB,GAAA,OAAAuB,EAAAF,EAAAG,EAAA,EAAAE,EAAAN,EAAAW,EAAAT,EAAAtB,EAAAiC,CAAA,YAAA1C,EAAAS,EAAAsB,GAAA,IAAAE,EAAAxB,EAAA0B,EAAAJ,EAAAD,EAAA,GAAAS,GAAAF,IAAAnC,GAAA4B,EAAAQ,EAAAjB,OAAAS,IAAA,KAAA5B,EAAA8B,EAAAM,EAAAR,GAAA9B,EAAAwC,EAAAF,EAAAM,EAAAZ,EAAA,GAAAvB,EAAA,GAAAP,EAAA0C,IAAAb,KAAAI,EAAAH,GAAAC,EAAAD,EAAA,OAAAC,EAAA,MAAAD,EAAA,GAAAA,EAAA,GAAAH,GAAAG,EAAA,IAAAhC,KAAAE,EAAAO,EAAA,GAAAT,EAAAgC,EAAA,KAAAC,EAAA,EAAAO,EAAAC,EAAAV,EAAAS,EAAAT,EAAAC,EAAA,IAAAhC,EAAA4C,IAAA1C,EAAAO,EAAA,GAAAuB,EAAA,GAAAD,GAAAA,EAAAa,KAAAZ,EAAA,GAAAvB,EAAAuB,EAAA,GAAAD,EAAAS,EAAAT,EAAAa,EAAAX,EAAA,OAAA/B,GAAAO,EAAA,SAAAiC,EAAA,MAAAH,GAAA,EAAAR,CAAA,iBAAA7B,EAAAoC,EAAAM,GAAA,GAAAP,EAAA,QAAAQ,UAAA,oCAAAN,GAAA,IAAAD,GAAAtC,EAAAsC,EAAAM,GAAAX,EAAAK,EAAAH,EAAAS,GAAAd,EAAAG,EAAA,EAAAJ,EAAAM,KAAAI,GAAA,CAAAP,IAAAC,EAAAA,EAAA,GAAAA,EAAA,IAAAO,EAAAT,GAAA,GAAA/B,EAAAiC,EAAAE,IAAAK,EAAAT,EAAAI,EAAAK,EAAAC,EAAAN,GAAA,OAAAE,EAAA,EAAAL,EAAA,IAAAC,IAAA/B,EAAA,QAAA4B,EAAAE,EAAA9B,GAAA,MAAA4B,EAAAA,EAAAtB,KAAAwB,EAAAG,IAAA,MAAAU,UAAA,wCAAAf,EAAAgB,KAAA,OAAAhB,EAAAK,EAAAL,EAAAnB,MAAAsB,EAAA,IAAAA,EAAA,YAAAA,IAAAH,EAAAE,EAAAe,SAAAjB,EAAAtB,KAAAwB,GAAAC,EAAA,IAAAE,EAAAU,UAAA,oCAAA3C,EAAA,YAAA+B,EAAA,GAAAD,EAAAH,CAAA,UAAAC,GAAAS,EAAAC,EAAAT,EAAA,GAAAI,EAAA1B,EAAAD,KAAAuB,EAAAS,MAAAE,EAAA,YAAAZ,GAAAE,EAAAH,EAAAI,EAAA,EAAAE,EAAAL,CAAA,SAAAO,EAAA,UAAA1B,MAAAmB,EAAAgB,KAAAP,EAAA,GAAA9B,EAAAP,EAAA8B,IAAA,GAAAG,CAAA,KAAAO,EAAA,YAAAR,IAAA,UAAAc,IAAA,UAAAC,IAAA,CAAAnB,EAAAvE,OAAA2F,eAAA,IAAAjB,EAAA,GAAAF,GAAAD,EAAAA,EAAA,GAAAC,QAAAK,EAAAN,EAAA,GAAAC,EAAA,yBAAAD,GAAAK,EAAAc,EAAAjF,UAAAkE,EAAAlE,UAAAT,OAAA6B,OAAA6C,GAAA,SAAAI,EAAAR,GAAA,OAAAtE,OAAA4F,eAAA5F,OAAA4F,eAAAtB,EAAAoB,IAAApB,EAAAuB,UAAAH,EAAAb,EAAAP,EAAA3B,EAAA,sBAAA2B,EAAA7D,UAAAT,OAAA6B,OAAA+C,GAAAN,CAAA,QAAAmB,EAAAhF,UAAAiF,EAAAb,EAAAD,EAAA,cAAAc,GAAAb,EAAAa,EAAA,cAAAD,GAAAA,EAAAK,YAAA,oBAAAjB,EAAAa,EAAA/C,EAAA,qBAAAkC,EAAAD,GAAAC,EAAAD,EAAAjC,EAAA,aAAAkC,EAAAD,EAAAJ,EAAA,yBAAAK,EAAAD,EAAA,oDAAAmB,EAAA,kBAAAC,EAAAvB,EAAAwB,EAAAnB,EAAA,cAAAD,EAAAP,EAAApB,EAAAsB,EAAAD,GAAA,IAAAE,EAAAzE,OAAA4C,eAAA,IAAA6B,EAAA,gBAAAH,GAAAG,EAAA,EAAAI,EAAA,SAAAP,EAAApB,EAAAsB,EAAAD,GAAA,SAAA5B,EAAAO,EAAAsB,GAAAK,EAAAP,EAAApB,EAAA,SAAAoB,GAAA,YAAA4B,QAAAhD,EAAAsB,EAAAF,EAAA,GAAApB,EAAAuB,EAAAA,EAAAH,EAAApB,EAAA,CAAAE,MAAAoB,EAAA3B,YAAA0B,EAAA4B,cAAA5B,EAAA6B,UAAA7B,IAAAD,EAAApB,GAAAsB,GAAA7B,EAAA,UAAAA,EAAA,WAAAA,EAAA,cAAAkC,EAAAP,EAAApB,EAAAsB,EAAAD,EAAA,UAAA8B,EAAA7B,EAAAD,EAAAD,EAAApB,EAAAP,EAAAwC,EAAAT,GAAA,QAAAD,EAAAD,EAAAW,GAAAT,GAAAE,EAAAH,EAAArB,KAAA,OAAAoB,GAAA,YAAAF,EAAAE,EAAA,CAAAC,EAAAc,KAAAhB,EAAAK,GAAA0B,QAAAC,QAAA3B,GAAA4B,KAAAtD,EAAAP,EAAA,UAAA8D,EAAAnC,EAAApB,GAAA,QAAAqB,EAAA,EAAAA,EAAArB,EAAAY,OAAAS,IAAA,KAAA5B,EAAAO,EAAAqB,GAAA5B,EAAAE,WAAAF,EAAAE,aAAA,EAAAF,EAAAwD,cAAA,YAAAxD,IAAAA,EAAAyD,UAAA,GAAApG,OAAA4C,eAAA0B,EAAAoC,EAAA/D,EAAAzD,KAAAyD,EAAA,WAAA+D,EAAAnC,GAAA,IAAAE,EAAA,SAAAF,GAAA,aAAAoC,EAAApC,KAAAA,EAAA,OAAAA,EAAA,IAAAD,EAAAC,EAAA3F,OAAAgI,aAAA,YAAAtC,EAAA,KAAAG,EAAAH,EAAArB,KAAAsB,EAAArB,UAAA,aAAAyD,EAAAlC,GAAA,OAAAA,EAAA,UAAAa,UAAA,uDAAAuB,OAAAtC,EAAA,CAAAuC,CAAAvC,GAAA,gBAAAoC,EAAAlC,GAAAA,EAAAA,EAAA,YAAAsC,IAAA,QAAAxC,GAAAyC,QAAAvG,UAAAwG,QAAAhE,KAAAiE,QAAAC,UAAAH,QAAA,wBAAAzC,GAAA,QAAAwC,EAAA,mBAAAxC,CAAA,cAAA6C,EAAA7C,GAAA,OAAA6C,EAAApH,OAAA4F,eAAA5F,OAAA2F,eAAAP,OAAA,SAAAb,GAAA,OAAAA,EAAAsB,WAAA7F,OAAA2F,eAAApB,EAAA,EAAA6C,EAAA7C,EAAA,UAAA8C,EAAA9C,EAAAD,GAAA,OAAA+C,EAAArH,OAAA4F,eAAA5F,OAAA4F,eAAAR,OAAA,SAAAb,EAAAD,GAAA,OAAAC,EAAAsB,UAAAvB,EAAAC,CAAA,EAAA8C,EAAA9C,EAAAD,EAAA,CA4JA,QAF2B,IAtJH,SAAAgD,GACtB,SAAAC,IAAc,IAAAC,EAI0B,OAT1C,SAAArC,EAAAX,GAAA,KAAAW,aAAAX,GAAA,UAAAc,UAAA,qCAKgBhC,CAAA,KAAAiE,IACZC,EANJ,SAAAjD,EAAA5B,EAAA2B,GAAA,OAAA3B,EAAAyE,EAAAzE,GAAA,SAAA4B,EAAAD,GAAA,GAAAA,IAAA,UAAAqC,EAAArC,IAAA,mBAAAA,GAAA,OAAAA,EAAA,YAAAA,EAAA,UAAAgB,UAAA,4EAAAhB,GAAA,YAAAA,EAAA,UAAAmD,eAAA,oEAAAnD,CAAA,CAAAoD,CAAAnD,EAAA,CAAAoD,CAAApD,EAAAwC,IAAAG,QAAAC,UAAAxE,EAAA2B,GAAA,GAAA8C,EAAA7C,GAAAtD,aAAA0B,EAAAuB,MAAAK,EAAAD,GAAA,CAMIsD,CAAA,KAAAL,IACKM,YAAc,IAAIC,IACvBN,EAAKO,iBAAmB,IAAID,IAC5BN,EAAKQ,oBAAsB,IAAIC,IAAOT,CACxC,CAEA,OAZF,SAAAjD,EAAAD,GAAA,sBAAAA,GAAA,OAAAA,EAAA,UAAAgB,UAAA,sDAAAf,EAAA9D,UAAAT,OAAA6B,OAAAyC,GAAAA,EAAA7D,UAAA,CAAAQ,YAAA,CAAAmC,MAAAmB,EAAA6B,UAAA,EAAAD,cAAA,KAAAnG,OAAA4C,eAAA2B,EAAA,aAAA6B,UAAA,IAAA9B,GAAA+C,EAAA9C,EAAAD,EAAA,CAYE4D,CAAAX,EAAAD,GAZFhD,EAYEiD,EAZFrE,EAYE,EAAAhE,IAAA,gBAAAkE,OAZFoB,EAYEuB,IAAAE,EAGA,SAAAkC,EAAoBC,GAAG,IAAAC,EAAAC,EAAAC,EAAA,YAAAxC,IAAAC,EAAA,SAAAwC,GAAA,cAAAA,EAAAhE,GAAA,OAAa,IAE9BnE,KAAKwH,YAAYY,IAAIL,GAAM,CAAFI,EAAAhE,EAAA,QAE+C,OADpE6D,EAAqBhI,KAAKwH,YAAY/E,IAAIsF,GAChD/H,KAAK0H,iBAAiBW,IAAIN,GAAM/H,KAAK0H,iBAAiBjF,IAAIsF,IAAQ,GAAK,GAAGI,EAAArD,EAAA,EACnEkD,GAAkB,WAIvBhI,KAAK2H,sBAAuB3H,KAAK2H,oBAAoBS,IAAIL,GAAI,CAAAI,EAAAhE,EAAA,eAAAgE,EAAArD,EAAA,EAExD,IAAImB,QAAQ,SAACC,GAClB,IAAMoC,EAAkB,WACtB,GAAIJ,EAAKV,YAAYY,IAAIL,GAAM,CAC7B,IAAMC,EAAqBE,EAAKV,YAAY/E,IAAIsF,GAChDG,EAAKR,iBAAiBW,IAAIN,GAAMG,EAAKR,iBAAiBjF,IAAIsF,IAAQ,GAAK,GACvE7B,EAAQ8B,EACV,MACEO,WAAWD,EAAiB,GAEhC,EACAA,GACF,IAAE,OA6BD,OAzBHtI,KAAK2H,oBAAoBa,IAAIT,GACvBE,EAAa,IAAIQ,UAAUV,GACjC/H,KAAKwH,YAAYa,IAAIN,EAAKE,GAC1BjI,KAAK0H,iBAAiBW,IAAIN,EAAK,GAG/BE,EAAWS,iBAAiB,OAAQ,SAACvF,GACnC+E,EAAKP,oBAAoBgB,OAAOZ,GAChCG,EAAKU,KAAK,OAAQzF,EAAO4E,EAC3B,GAEAE,EAAWS,iBAAiB,QAAS,SAACvF,GACpC+E,EAAKP,oBAAoBgB,OAAOZ,GAChCG,EAAKV,YAAYmB,OAAOZ,GACxBG,EAAKR,iBAAiBiB,OAAOZ,GAC7BG,EAAKU,KAAK,QAASzF,EAAO4E,EAC5B,GAEAE,EAAWS,iBAAiB,QAAS,SAACvF,GACpC+E,EAAKP,oBAAoBgB,OAAOZ,GAChCG,EAAKU,KAAK,QAASzF,EAAO4E,EAC5B,GAEAE,EAAWS,iBAAiB,UAAW,SAACvF,GACtC+E,EAAKU,KAAK,UAAWzF,EAAO4E,EAC9B,GAAGI,EAAArD,EAAA,EAEImD,GAAU,EAAAH,EAAA,QAxDnBe,EAZF,eAAA3E,EAAA,KAAAD,EAAAT,UAAA,WAAAyC,QAAA,SAAApD,EAAAP,GAAA,IAAAwC,EAAAX,EAAAN,MAAAK,EAAAD,GAAA,SAAA6E,EAAA3E,GAAA6B,EAAAlB,EAAAjC,EAAAP,EAAAwG,EAAAC,EAAA,OAAA5E,EAAA,UAAA4E,EAAA5E,GAAA6B,EAAAlB,EAAAjC,EAAAP,EAAAwG,EAAAC,EAAA,QAAA5E,EAAA,CAAA2E,OAAA,MAqEG,SAtDkBE,GAAA,OAAAH,EAAAhF,MAAC,KAADL,UAAA,IAwDnB,CAAA3E,IAAA,oBAAAkE,MAGA,SAAkBgF,GAChB,GAAK/H,KAAKwH,YAAYY,IAAIL,GAA1B,CAIA,IAAMkB,EAAejJ,KAAK0H,iBAAiBjF,IAAIsF,IAAQ,EACjDmB,EAAWC,KAAKC,IAAI,EAAGH,EAAe,GAI5C,GAHAjJ,KAAK0H,iBAAiBW,IAAIN,EAAKmB,GAGd,IAAbA,EAAgB,CAClB,IAAMjB,EAAajI,KAAKwH,YAAY/E,IAAIsF,GACpCE,GAAcA,EAAWoB,aAAeZ,UAAUa,MACpDrB,EAAWsB,MAAM,IAAM,uBAEzBvJ,KAAKwH,YAAYmB,OAAOZ,GACxB/H,KAAK0H,iBAAiBiB,OAAOZ,EAC/B,CAdA,CAeF,GAEA,CAAAlJ,IAAA,aAAAkE,MAGA,SAAWgF,GACT,GAAI/H,KAAKwH,YAAYY,IAAIL,GAAM,CAC7B,IAAME,EAAajI,KAAKwH,YAAY/E,IAAIsF,GACpCE,GAAcA,EAAWoB,aAAeZ,UAAUa,MACpDrB,EAAWsB,MAAM,IAAM,eAEzBvJ,KAAKwH,YAAYmB,OAAOZ,GACxB/H,KAAK0H,iBAAiBiB,OAAOZ,EAC/B,CACF,GAEA,CAAAlJ,IAAA,sBAAAkE,MAGA,SAAoBgF,GAClB,OAAK/H,KAAKwH,YAAYY,IAAIL,GAKnB,CACLyB,QAAQ,EACRH,WAHiBrJ,KAAKwH,YAAY/E,IAAIsF,GAGfsB,WACvBI,YAAazJ,KAAK0H,iBAAiBjF,IAAIsF,IAAQ,GAPxC,CAAEyB,QAAQ,EAAOH,WAAY,KAAMI,YAAa,EAS3D,GAEA,CAAA5K,IAAA,oBAAAkE,MAGA,WACE,IAC0D2G,EADpDC,EAAS,CAAC,EAAEC,EAAAC,EACc7J,KAAKwH,YAAYsC,WAAS,IAA1D,IAAAF,EAAAG,MAAAL,EAAAE,EAAAzF,KAAAe,MAA4D,KAAA8E,EAAAC,EAAAP,EAAA3G,MAAA,GAAhDgF,EAAGiC,EAAA,GAAE/B,EAAU+B,EAAA,GACzBL,EAAO5B,GAAO,CACZsB,WAAYpB,EAAWoB,WACvBI,YAAazJ,KAAK0H,iBAAiBjF,IAAIsF,IAAQ,EAEnD,CAAC,OAAAmC,GAAAN,EAAA3F,EAAAiG,EAAA,SAAAN,EAAAnF,GAAA,CACD,OAAOkF,CACT,GAEA,CAAA9K,IAAA,WAAAkE,MAGA,WAAW,IACiDoH,EADjDC,EAAAP,EACuB7J,KAAKwH,YAAYsC,WAAS,IAA1D,IAAAM,EAAAL,MAAAI,EAAAC,EAAAjG,KAAAe,MAA4D,KAAAmF,EAAAJ,EAAAE,EAAApH,MAAA,GAA3CkF,GAAFoC,EAAA,GAAYA,EAAA,IACrBpC,GAAcA,EAAWoB,aAAeZ,UAAUa,MACpDrB,EAAWsB,MAAM,IAAM,YAE3B,CAAC,OAAAW,GAAAE,EAAAnG,EAAAiG,EAAA,SAAAE,EAAA3F,GAAA,CACDzE,KAAKwH,YAAY8C,QACjBtK,KAAK0H,iBAAiB4C,QACtBtK,KAAK2H,oBAAoB2C,OAC3B,IAtJFzH,GAAAuD,EAAAnC,EAAA7D,UAAAyC,GAAAlD,OAAA4C,eAAA0B,EAAA,aAAA8B,UAAA,IAAA9B,EAAA,IAAAA,EAAApB,EAAAsB,EAYE0E,CA0IC,CAlJqB,CAAS7F,I,mPCJjC,IAAAiB,EAAAC,EAAArB,EAAA,mBAAAtE,OAAAA,OAAA,GAAA4F,EAAAtB,EAAAzD,UAAA,aAAAkD,EAAAO,EAAAC,aAAA,yBAAAsB,EAAAvB,EAAAsB,EAAA7B,EAAA8B,GAAA,IAAAC,EAAAF,GAAAA,EAAA/D,qBAAAkE,EAAAH,EAAAG,EAAAC,EAAA5E,OAAA6B,OAAA6C,EAAAjE,WAAA,OAAAoE,EAAAD,EAAA,mBAAA1B,EAAAsB,EAAA7B,GAAA,IAAA8B,EAAAC,EAAAE,EAAAE,EAAA,EAAAC,EAAApC,GAAA,GAAAqC,GAAA,EAAAC,EAAA,CAAAF,EAAA,EAAAP,EAAA,EAAAU,EAAAZ,EAAAa,EAAA1C,EAAAqC,EAAArC,EAAA2C,KAAAd,EAAA,GAAA7B,EAAA,SAAA8B,EAAArB,GAAA,OAAAuB,EAAAF,EAAAG,EAAA,EAAAE,EAAAN,EAAAW,EAAAT,EAAAtB,EAAAiC,CAAA,YAAA1C,EAAAS,EAAAsB,GAAA,IAAAE,EAAAxB,EAAA0B,EAAAJ,EAAAD,EAAA,GAAAS,GAAAF,IAAAnC,GAAA4B,EAAAQ,EAAAjB,OAAAS,IAAA,KAAA5B,EAAA8B,EAAAM,EAAAR,GAAA9B,EAAAwC,EAAAF,EAAAM,EAAAZ,EAAA,GAAAvB,EAAA,GAAAP,EAAA0C,IAAAb,KAAAI,EAAAH,GAAAC,EAAAD,EAAA,OAAAC,EAAA,MAAAD,EAAA,GAAAA,EAAA,GAAAH,GAAAG,EAAA,IAAAhC,KAAAE,EAAAO,EAAA,GAAAT,EAAAgC,EAAA,KAAAC,EAAA,EAAAO,EAAAC,EAAAV,EAAAS,EAAAT,EAAAC,EAAA,IAAAhC,EAAA4C,IAAA1C,EAAAO,EAAA,GAAAuB,EAAA,GAAAD,GAAAA,EAAAa,KAAAZ,EAAA,GAAAvB,EAAAuB,EAAA,GAAAD,EAAAS,EAAAT,EAAAa,EAAAX,EAAA,OAAA/B,GAAAO,EAAA,SAAAiC,EAAA,MAAAH,GAAA,EAAAR,CAAA,iBAAA7B,EAAAoC,EAAAM,GAAA,GAAAP,EAAA,QAAAQ,UAAA,oCAAAN,GAAA,IAAAD,GAAAtC,EAAAsC,EAAAM,GAAAX,EAAAK,EAAAH,EAAAS,GAAAd,EAAAG,EAAA,EAAAJ,EAAAM,KAAAI,GAAA,CAAAP,IAAAC,EAAAA,EAAA,GAAAA,EAAA,IAAAO,EAAAT,GAAA,GAAA/B,EAAAiC,EAAAE,IAAAK,EAAAT,EAAAI,EAAAK,EAAAC,EAAAN,GAAA,OAAAE,EAAA,EAAAL,EAAA,IAAAC,IAAA/B,EAAA,QAAA4B,EAAAE,EAAA9B,GAAA,MAAA4B,EAAAA,EAAAtB,KAAAwB,EAAAG,IAAA,MAAAU,UAAA,wCAAAf,EAAAgB,KAAA,OAAAhB,EAAAK,EAAAL,EAAAnB,MAAAsB,EAAA,IAAAA,EAAA,YAAAA,IAAAH,EAAAE,EAAAe,SAAAjB,EAAAtB,KAAAwB,GAAAC,EAAA,IAAAE,EAAAU,UAAA,oCAAA3C,EAAA,YAAA+B,EAAA,GAAAD,EAAAH,CAAA,UAAAC,GAAAS,EAAAC,EAAAT,EAAA,GAAAI,EAAA1B,EAAAD,KAAAuB,EAAAS,MAAAE,EAAA,YAAAZ,GAAAE,EAAAH,EAAAI,EAAA,EAAAE,EAAAL,CAAA,SAAAO,EAAA,UAAA1B,MAAAmB,EAAAgB,KAAAP,EAAA,GAAA9B,EAAAP,EAAA8B,IAAA,GAAAG,CAAA,KAAAO,EAAA,YAAAR,IAAA,UAAAc,IAAA,UAAAC,IAAA,CAAAnB,EAAAvE,OAAA2F,eAAA,IAAAjB,EAAA,GAAAF,GAAAD,EAAAA,EAAA,GAAAC,QAAAK,EAAAN,EAAA,GAAAC,EAAA,yBAAAD,GAAAK,EAAAc,EAAAjF,UAAAkE,EAAAlE,UAAAT,OAAA6B,OAAA6C,GAAA,SAAAI,EAAAR,GAAA,OAAAtE,OAAA4F,eAAA5F,OAAA4F,eAAAtB,EAAAoB,IAAApB,EAAAuB,UAAAH,EAAAb,EAAAP,EAAA3B,EAAA,sBAAA2B,EAAA7D,UAAAT,OAAA6B,OAAA+C,GAAAN,CAAA,QAAAmB,EAAAhF,UAAAiF,EAAAb,EAAAD,EAAA,cAAAc,GAAAb,EAAAa,EAAA,cAAAD,GAAAA,EAAAK,YAAA,oBAAAjB,EAAAa,EAAA/C,EAAA,qBAAAkC,EAAAD,GAAAC,EAAAD,EAAAjC,EAAA,aAAAkC,EAAAD,EAAAJ,EAAA,yBAAAK,EAAAD,EAAA,oDAAAmB,EAAA,kBAAAC,EAAAvB,EAAAwB,EAAAnB,EAAA,cAAAD,EAAAP,EAAApB,EAAAsB,EAAAD,GAAA,IAAAE,EAAAzE,OAAA4C,eAAA,IAAA6B,EAAA,gBAAAH,GAAAG,EAAA,EAAAI,EAAA,SAAAP,EAAApB,EAAAsB,EAAAD,GAAA,SAAA5B,EAAAO,EAAAsB,GAAAK,EAAAP,EAAApB,EAAA,SAAAoB,GAAA,YAAA4B,QAAAhD,EAAAsB,EAAAF,EAAA,GAAApB,EAAAuB,EAAAA,EAAAH,EAAApB,EAAA,CAAAE,MAAAoB,EAAA3B,YAAA0B,EAAA4B,cAAA5B,EAAA6B,UAAA7B,IAAAD,EAAApB,GAAAsB,GAAA7B,EAAA,UAAAA,EAAA,WAAAA,EAAA,cAAAkC,EAAAP,EAAApB,EAAAsB,EAAAD,EAAA,UAAA8B,EAAA7B,EAAAD,EAAAD,EAAApB,EAAAP,EAAAwC,EAAAT,GAAA,QAAAD,EAAAD,EAAAW,GAAAT,GAAAE,EAAAH,EAAArB,KAAA,OAAAoB,GAAA,YAAAF,EAAAE,EAAA,CAAAC,EAAAc,KAAAhB,EAAAK,GAAA0B,QAAAC,QAAA3B,GAAA4B,KAAAtD,EAAAP,EAAA,UAAA8D,EAAAnC,EAAApB,GAAA,QAAAqB,EAAA,EAAAA,EAAArB,EAAAY,OAAAS,IAAA,KAAA5B,EAAAO,EAAAqB,GAAA5B,EAAAE,WAAAF,EAAAE,aAAA,EAAAF,EAAAwD,cAAA,YAAAxD,IAAAA,EAAAyD,UAAA,GAAApG,OAAA4C,eAAA0B,EAAAoC,EAAA/D,EAAAzD,KAAAyD,EAAA,WAAA+D,EAAAnC,GAAA,IAAAE,EAAA,SAAAF,GAAA,aAAAoC,EAAApC,KAAAA,EAAA,OAAAA,EAAA,IAAAD,EAAAC,EAAA3F,OAAAgI,aAAA,YAAAtC,EAAA,KAAAG,EAAAH,EAAArB,KAAAsB,EAAArB,UAAA,aAAAyD,EAAAlC,GAAA,OAAAA,EAAA,UAAAa,UAAA,uDAAAuB,OAAAtC,EAAA,CAAAuC,CAAAvC,GAAA,gBAAAoC,EAAAlC,GAAAA,EAAAA,EAAA,YAAAsC,IAAA,QAAAxC,GAAAyC,QAAAvG,UAAAwG,QAAAhE,KAAAiE,QAAAC,UAAAH,QAAA,wBAAAzC,GAAA,QAAAwC,EAAA,mBAAAxC,CAAA,cAAA6C,EAAA7C,GAAA,OAAA6C,EAAApH,OAAA4F,eAAA5F,OAAA2F,eAAAP,OAAA,SAAAb,GAAA,OAAAA,EAAAsB,WAAA7F,OAAA2F,eAAApB,EAAA,EAAA6C,EAAA7C,EAAA,UAAA8C,EAAA9C,EAAAD,GAAA,OAAA+C,EAAArH,OAAA4F,eAAA5F,OAAA4F,eAAAR,OAAA,SAAAb,EAAAD,GAAA,OAAAC,EAAAsB,UAAAvB,EAAAC,CAAA,EAAA8C,EAAA9C,EAAAD,EAAA,CAGyD,IAEpCsG,EAAgB,SAAAtD,GACnC,SAAAsD,EAAY5L,GAAQ,IAAAwI,EAKO,OAX7B,SAAArC,EAAAX,GAAA,KAAAW,aAAAX,GAAA,UAAAc,UAAA,qCAMsBhC,CAAA,KAAAsH,IAClBpD,EAPJ,SAAAjD,EAAA5B,EAAA2B,GAAA,OAAA3B,EAAAyE,EAAAzE,GAAA,SAAA4B,EAAAD,GAAA,GAAAA,IAAA,UAAAqC,EAAArC,IAAA,mBAAAA,GAAA,OAAAA,EAAA,YAAAA,EAAA,UAAAgB,UAAA,4EAAAhB,GAAA,YAAAA,EAAA,UAAAmD,eAAA,oEAAAnD,CAAA,CAAAoD,CAAAnD,EAAA,CAAAoD,CAAApD,EAAAwC,IAAAG,QAAAC,UAAAxE,EAAA2B,GAAA,GAAA8C,EAAA7C,GAAAtD,aAAA0B,EAAAuB,MAAAK,EAAAD,GAAA,CAOIsD,CAAA,KAAAgD,IACK5L,OAASA,EACdwI,EAAKqD,GAAK,KACVrD,EAAKsD,aAAc,EACnBtD,EAAKuD,aAAe,KAAKvD,CAC3B,CAEA,OAdF,SAAAjD,EAAAD,GAAA,sBAAAA,GAAA,OAAAA,EAAA,UAAAgB,UAAA,sDAAAf,EAAA9D,UAAAT,OAAA6B,OAAAyC,GAAAA,EAAA7D,UAAA,CAAAQ,YAAA,CAAAmC,MAAAmB,EAAA6B,UAAA,EAAAD,cAAA,KAAAnG,OAAA4C,eAAA2B,EAAA,aAAA6B,UAAA,IAAA9B,GAAA+C,EAAA9C,EAAAD,EAAA,CAcE4D,CAAA0C,EAAAtD,GAdFhD,EAcEsG,EAdF1H,EAcE,EAAAhE,IAAA,UAAAkE,OAdFoB,EAcEuB,IAAAE,EAGA,SAAAkC,IAAA,IAAAI,EAAA,YAAAxC,IAAAC,EAAA,SAAAwC,GAAA,cAAAA,EAAAhE,EAAA,OAAAgE,EAAArD,EAAA,EACS,IAAImB,QAAQ,SAACC,EAASyE,GAC3B,IACEzC,EAAKwC,aAAeE,KAAKC,MAAQ,IAAM1B,KAAK2B,SAASC,SAAS,IAAIC,OAAO,EAAG,GAG5E9C,EAAK+C,eAAiB/E,EACtBgC,EAAKgD,cAAgBP,EAGrBQ,EAAmBC,cAAclD,EAAKvJ,OAAO0M,aAAcnD,EAAKvJ,QAC7DwH,KAAK,SAAC8B,GACLC,EAAKsC,GAAKvC,EAGVC,EAAKoD,sBAGDrD,EAAWoB,aAAeZ,UAAUa,OACtCpB,EAAKuC,aAAc,EACnBvC,EAAKU,KAAK,aACV1C,IACAgC,EAAK+C,eAAiB,KACtB/C,EAAKgD,cAAgB,KAEzB,GACCK,MAAM,SAACzH,GACNC,QAAQD,MAAM,0CAADE,OAA2CkE,EAAKwC,cAAgB5G,GAC7E6G,EAAO7G,GACPoE,EAAK+C,eAAiB,KACtB/C,EAAKgD,cAAgB,IACvB,EAEJ,CAAE,MAAOpH,GACPC,QAAQD,MAAM,yCAADE,OAA0CkE,EAAKwC,cAAgB5G,GAC5E6G,EAAO7G,GACPoE,EAAK+C,eAAiB,KACtB/C,EAAKgD,cAAgB,IACvB,CACF,GAAE,EAAApD,EAAA,GA1CJ0D,EAdF,eAAAtH,EAAA,KAAAD,EAAAT,UAAA,WAAAyC,QAAA,SAAApD,EAAAP,GAAA,IAAAwC,EAAAX,EAAAN,MAAAK,EAAAD,GAAA,SAAA6E,EAAA3E,GAAA6B,EAAAlB,EAAAjC,EAAAP,EAAAwG,EAAAC,EAAA,OAAA5E,EAAA,UAAA4E,EAAA5E,GAAA6B,EAAAlB,EAAAjC,EAAAP,EAAAwG,EAAAC,EAAA,QAAA5E,EAAA,CAAA2E,OAAA,MAyDG,WAxCY,OAAA0C,EAAA3H,MAAC,KAADL,UAAA,IA0Cb,CAAA3E,IAAA,sBAAAkE,MAGA,WAAsB,IAAA0I,EAAA,KACpB,GAAKzL,KAAKwK,GAAV,CAGA,IAAMkB,EAAa,SAACvI,EAAO4E,GACrBA,IAAQ0D,EAAK9M,OAAO0M,eACtBI,EAAKhB,aAAc,EACnBgB,EAAK7C,KAAK,aAGN6C,EAAKR,iBACPQ,EAAKR,iBACLQ,EAAKR,eAAiB,KACtBQ,EAAKP,cAAgB,MAG3B,EAEMS,EAAc,SAACxI,EAAO4E,GACtBA,IAAQ0D,EAAK9M,OAAO0M,eACtBI,EAAKhB,aAAc,EACnBgB,EAAK7C,KAAK,eAAgBzF,GAE9B,EAEMyI,EAAc,SAACzI,EAAO4E,GACtBA,IAAQ0D,EAAK9M,OAAO0M,eACtBI,EAAK7C,KAAK,QAASzF,GAGfsI,EAAKP,gBACPO,EAAKP,cAAc/H,GACnBsI,EAAKR,eAAiB,KACtBQ,EAAKP,cAAgB,MAG3B,EAEMW,EAAgB,SAAC1I,EAAO4E,GACxBA,IAAQ0D,EAAK9M,OAAO0M,cACtBI,EAAKI,cAAc1I,EAEvB,EAGAgI,EAAmBW,GAAG,OAAQJ,GAC9BP,EAAmBW,GAAG,QAASH,GAC/BR,EAAmBW,GAAG,QAASF,GAC/BT,EAAmBW,GAAG,UAAWD,GAGjC7L,KAAK+L,cAAgB,CACnBC,KAAMN,EACNnC,MAAOoC,EACP7H,MAAO8H,EACPK,QAASJ,EAtDS,CAwDtB,GAEA,CAAAhN,IAAA,aAAAkE,MAGA,WAEM/C,KAAK+L,gBACPZ,EAAmBe,IAAI,OAAQlM,KAAK+L,cAAcC,MAClDb,EAAmBe,IAAI,QAASlM,KAAK+L,cAAcxC,OACnD4B,EAAmBe,IAAI,QAASlM,KAAK+L,cAAcjI,OACnDqH,EAAmBe,IAAI,UAAWlM,KAAK+L,cAAcE,UAInDjM,KAAKrB,OAAO0M,cACdF,EAAmBgB,kBAAkBnM,KAAKrB,OAAO0M,cAGnDrL,KAAKwK,GAAK,KACVxK,KAAKyK,aAAc,CACrB,GAEA,CAAA5L,IAAA,cAAAkE,MAGA,SAAYkJ,GACV,GAAKjM,KAAKyK,aAAgBzK,KAAKwK,GAK/B,IACExK,KAAKwK,GAAG4B,KAAKC,KAAKC,UAAUL,GAC9B,CAAE,MAAOnI,GAEPC,QAAQwI,KAAK,+CAAgDzI,EAAMmI,QACrE,CACF,GAEA,CAAApN,IAAA,aAAAkE,MAGA,SAAWyJ,GACT,GAAKxM,KAAKyK,aAAgBzK,KAAKwK,GAK/B,IACExK,KAAKwK,GAAG4B,KAAKI,EACf,CAAE,MAAO1I,GAEPC,QAAQwI,KAAK,mDAAoDzI,EAAMmI,QACzE,CACF,GAEA,CAAApN,IAAA,gBAAAkE,MAGA,SAAcI,GAAO,IAAAsJ,EAAA,KAEnB,GAAItJ,EAAMqJ,gBAAgBE,YACxB1M,KAAK4I,KAAK,cAAezF,EAAMqJ,WAE1B,GAAIrJ,EAAMqJ,gBAAgBG,KAC/BxJ,EAAMqJ,KAAKI,cAAczG,KAAK,SAAAyG,GAC5BH,EAAK7D,KAAK,cAAegE,EAC3B,GAAGrB,MAAM,SAAArB,GACPnG,QAAQD,MAAM,6DAA8DoG,EAC9E,QAKF,IACE,IAAM+B,EAAUI,KAAKQ,MAAM1J,EAAMqJ,MAGf,iBAAdP,EAAQ/H,GAAsC,iBAAd+H,EAAQ/H,GAC1ClE,KAAK4I,KAAK,UAAWqD,GAIL,iBAAdA,EAAQ/H,GACVlE,KAAK4I,KAAK,cAAeqD,GAG3BjM,KAAK4I,KAAK,UAAWqD,EACvB,CAAE,MAAOnI,GACP9D,KAAK4I,KAAK,QAAS9E,EACrB,CACF,GAEA,CAAAjF,IAAA,YAAAkE,MAGA,WACE,MAAO,CACL0H,YAAazK,KAAKyK,YAClBpB,WAAYrJ,KAAKwK,GAAKxK,KAAKwK,GAAGnB,WAAa,KAC3CqB,aAAc1K,KAAK0K,aAEvB,IA9NFxG,EAgOE,EAAArF,IAAA,qBAAAkE,MAGA,WACE,OAAOoI,EAAmB2B,mBAC5B,GAEA,CAAAjO,IAAA,sBAAAkE,MAGA,WACEoI,EAAmB4B,UACrB,IA5OFlK,GAAAuD,EAAAnC,EAAA7D,UAAAyC,GAAAqB,GAAAkC,EAAAnC,EAAAC,GAAAvE,OAAA4C,eAAA0B,EAAA,aAAA8B,UAAA,IAAA9B,EAAA,IAAAA,EAAApB,EAAAqB,EAAAC,EAcEqH,CA8NC,CAvOkC,CAASxI,G,mPCL9C,IAAAiB,EAAAC,EAAArB,EAAA,mBAAAtE,OAAAA,OAAA,GAAA4F,EAAAtB,EAAAzD,UAAA,aAAAkD,EAAAO,EAAAC,aAAA,yBAAAsB,EAAAvB,EAAAsB,EAAA7B,EAAA8B,GAAA,IAAAC,EAAAF,GAAAA,EAAA/D,qBAAAkE,EAAAH,EAAAG,EAAAC,EAAA5E,OAAA6B,OAAA6C,EAAAjE,WAAA,OAAAoE,EAAAD,EAAA,mBAAA1B,EAAAsB,EAAA7B,GAAA,IAAA8B,EAAAC,EAAAE,EAAAE,EAAA,EAAAC,EAAApC,GAAA,GAAAqC,GAAA,EAAAC,EAAA,CAAAF,EAAA,EAAAP,EAAA,EAAAU,EAAAZ,EAAAa,EAAA1C,EAAAqC,EAAArC,EAAA2C,KAAAd,EAAA,GAAA7B,EAAA,SAAA8B,EAAArB,GAAA,OAAAuB,EAAAF,EAAAG,EAAA,EAAAE,EAAAN,EAAAW,EAAAT,EAAAtB,EAAAiC,CAAA,YAAA1C,EAAAS,EAAAsB,GAAA,IAAAE,EAAAxB,EAAA0B,EAAAJ,EAAAD,EAAA,GAAAS,GAAAF,IAAAnC,GAAA4B,EAAAQ,EAAAjB,OAAAS,IAAA,KAAA5B,EAAA8B,EAAAM,EAAAR,GAAA9B,EAAAwC,EAAAF,EAAAM,EAAAZ,EAAA,GAAAvB,EAAA,GAAAP,EAAA0C,IAAAb,KAAAI,EAAAH,GAAAC,EAAAD,EAAA,OAAAC,EAAA,MAAAD,EAAA,GAAAA,EAAA,GAAAH,GAAAG,EAAA,IAAAhC,KAAAE,EAAAO,EAAA,GAAAT,EAAAgC,EAAA,KAAAC,EAAA,EAAAO,EAAAC,EAAAV,EAAAS,EAAAT,EAAAC,EAAA,IAAAhC,EAAA4C,IAAA1C,EAAAO,EAAA,GAAAuB,EAAA,GAAAD,GAAAA,EAAAa,KAAAZ,EAAA,GAAAvB,EAAAuB,EAAA,GAAAD,EAAAS,EAAAT,EAAAa,EAAAX,EAAA,OAAA/B,GAAAO,EAAA,SAAAiC,EAAA,MAAAH,GAAA,EAAAR,CAAA,iBAAA7B,EAAAoC,EAAAM,GAAA,GAAAP,EAAA,QAAAQ,UAAA,oCAAAN,GAAA,IAAAD,GAAAtC,EAAAsC,EAAAM,GAAAX,EAAAK,EAAAH,EAAAS,GAAAd,EAAAG,EAAA,EAAAJ,EAAAM,KAAAI,GAAA,CAAAP,IAAAC,EAAAA,EAAA,GAAAA,EAAA,IAAAO,EAAAT,GAAA,GAAA/B,EAAAiC,EAAAE,IAAAK,EAAAT,EAAAI,EAAAK,EAAAC,EAAAN,GAAA,OAAAE,EAAA,EAAAL,EAAA,IAAAC,IAAA/B,EAAA,QAAA4B,EAAAE,EAAA9B,GAAA,MAAA4B,EAAAA,EAAAtB,KAAAwB,EAAAG,IAAA,MAAAU,UAAA,wCAAAf,EAAAgB,KAAA,OAAAhB,EAAAK,EAAAL,EAAAnB,MAAAsB,EAAA,IAAAA,EAAA,YAAAA,IAAAH,EAAAE,EAAAe,SAAAjB,EAAAtB,KAAAwB,GAAAC,EAAA,IAAAE,EAAAU,UAAA,oCAAA3C,EAAA,YAAA+B,EAAA,GAAAD,EAAAH,CAAA,UAAAC,GAAAS,EAAAC,EAAAT,EAAA,GAAAI,EAAA1B,EAAAD,KAAAuB,EAAAS,MAAAE,EAAA,YAAAZ,GAAAE,EAAAH,EAAAI,EAAA,EAAAE,EAAAL,CAAA,SAAAO,EAAA,UAAA1B,MAAAmB,EAAAgB,KAAAP,EAAA,GAAA9B,EAAAP,EAAA8B,IAAA,GAAAG,CAAA,KAAAO,EAAA,YAAAR,IAAA,UAAAc,IAAA,UAAAC,IAAA,CAAAnB,EAAAvE,OAAA2F,eAAA,IAAAjB,EAAA,GAAAF,GAAAD,EAAAA,EAAA,GAAAC,QAAAK,EAAAN,EAAA,GAAAC,EAAA,yBAAAD,GAAAK,EAAAc,EAAAjF,UAAAkE,EAAAlE,UAAAT,OAAA6B,OAAA6C,GAAA,SAAAI,EAAAR,GAAA,OAAAtE,OAAA4F,eAAA5F,OAAA4F,eAAAtB,EAAAoB,IAAApB,EAAAuB,UAAAH,EAAAb,EAAAP,EAAA3B,EAAA,sBAAA2B,EAAA7D,UAAAT,OAAA6B,OAAA+C,GAAAN,CAAA,QAAAmB,EAAAhF,UAAAiF,EAAAb,EAAAD,EAAA,cAAAc,GAAAb,EAAAa,EAAA,cAAAD,GAAAA,EAAAK,YAAA,oBAAAjB,EAAAa,EAAA/C,EAAA,qBAAAkC,EAAAD,GAAAC,EAAAD,EAAAjC,EAAA,aAAAkC,EAAAD,EAAAJ,EAAA,yBAAAK,EAAAD,EAAA,oDAAAmB,EAAA,kBAAAC,EAAAvB,EAAAwB,EAAAnB,EAAA,cAAAD,EAAAP,EAAApB,EAAAsB,EAAAD,GAAA,IAAAE,EAAAzE,OAAA4C,eAAA,IAAA6B,EAAA,gBAAAH,GAAAG,EAAA,EAAAI,EAAA,SAAAP,EAAApB,EAAAsB,EAAAD,GAAA,SAAA5B,EAAAO,EAAAsB,GAAAK,EAAAP,EAAApB,EAAA,SAAAoB,GAAA,YAAA4B,QAAAhD,EAAAsB,EAAAF,EAAA,GAAApB,EAAAuB,EAAAA,EAAAH,EAAApB,EAAA,CAAAE,MAAAoB,EAAA3B,YAAA0B,EAAA4B,cAAA5B,EAAA6B,UAAA7B,IAAAD,EAAApB,GAAAsB,GAAA7B,EAAA,UAAAA,EAAA,WAAAA,EAAA,cAAAkC,EAAAP,EAAApB,EAAAsB,EAAAD,EAAA,UAAA8B,EAAA7B,EAAAD,EAAAD,EAAApB,EAAAP,EAAAwC,EAAAT,GAAA,QAAAD,EAAAD,EAAAW,GAAAT,GAAAE,EAAAH,EAAArB,KAAA,OAAAoB,GAAA,YAAAF,EAAAE,EAAA,CAAAC,EAAAc,KAAAhB,EAAAK,GAAA0B,QAAAC,QAAA3B,GAAA4B,KAAAtD,EAAAP,EAAA,UAAA0K,EAAA7I,GAAA,sBAAAD,EAAA,KAAAD,EAAAT,UAAA,WAAAyC,QAAA,SAAApD,EAAAP,GAAA,IAAAwC,EAAAX,EAAAN,MAAAK,EAAAD,GAAA,SAAA6E,EAAA3E,GAAA6B,EAAAlB,EAAAjC,EAAAP,EAAAwG,EAAAC,EAAA,OAAA5E,EAAA,UAAA4E,EAAA5E,GAAA6B,EAAAlB,EAAAjC,EAAAP,EAAAwG,EAAAC,EAAA,QAAA5E,EAAA,CAAA2E,OAAA,eAAAmE,EAAApK,EAAAiC,IAAA,MAAAA,GAAAA,EAAAjC,EAAAY,UAAAqB,EAAAjC,EAAAY,QAAA,QAAAQ,EAAA,EAAAE,EAAArD,MAAAgE,GAAAb,EAAAa,EAAAb,IAAAE,EAAAF,GAAApB,EAAAoB,GAAA,OAAAE,CAAA,UAAAiC,EAAAnC,EAAApB,GAAA,QAAAqB,EAAA,EAAAA,EAAArB,EAAAY,OAAAS,IAAA,KAAA5B,EAAAO,EAAAqB,GAAA5B,EAAAE,WAAAF,EAAAE,aAAA,EAAAF,EAAAwD,cAAA,YAAAxD,IAAAA,EAAAyD,UAAA,GAAApG,OAAA4C,eAAA0B,EAAAoC,EAAA/D,EAAAzD,KAAAyD,EAAA,WAAA+D,EAAAnC,GAAA,IAAAE,EAAA,SAAAF,GAAA,aAAAoC,EAAApC,KAAAA,EAAA,OAAAA,EAAA,IAAAD,EAAAC,EAAA3F,OAAAgI,aAAA,YAAAtC,EAAA,KAAAG,EAAAH,EAAArB,KAAAsB,EAAArB,UAAA,aAAAyD,EAAAlC,GAAA,OAAAA,EAAA,UAAAa,UAAA,uDAAAuB,OAAAtC,EAAA,CAAAuC,CAAAvC,GAAA,gBAAAoC,EAAAlC,GAAAA,EAAAA,EAAA,YAAAsC,IAAA,QAAAxC,GAAAyC,QAAAvG,UAAAwG,QAAAhE,KAAAiE,QAAAC,UAAAH,QAAA,wBAAAzC,GAAA,QAAAwC,EAAA,mBAAAxC,CAAA,cAAA6C,EAAA7C,GAAA,OAAA6C,EAAApH,OAAA4F,eAAA5F,OAAA2F,eAAAP,OAAA,SAAAb,GAAA,OAAAA,EAAAsB,WAAA7F,OAAA2F,eAAApB,EAAA,EAAA6C,EAAA7C,EAAA,UAAA8C,EAAA9C,EAAAD,GAAA,OAAA+C,EAAArH,OAAA4F,eAAA5F,OAAA4F,eAAAR,OAAA,SAAAb,EAAAD,GAAA,OAAAC,EAAAsB,UAAAvB,EAAAC,CAAA,EAAA8C,EAAA9C,EAAAD,EAAA,CAE6C,IAExBiJ,EAAa,SAAAjG,GAChC,SAAAiG,EAAYvO,GAAQ,IAAAwI,EAMO,OAX7B,SAAArC,EAAAX,GAAA,KAAAW,aAAAX,GAAA,UAAAc,UAAA,qCAKsBhC,CAAA,KAAAiK,IAClB/F,EANJ,SAAAjD,EAAA5B,EAAA2B,GAAA,OAAA3B,EAAAyE,EAAAzE,GAAA,SAAA4B,EAAAD,GAAA,GAAAA,IAAA,UAAAqC,EAAArC,IAAA,mBAAAA,GAAA,OAAAA,EAAA,YAAAA,EAAA,UAAAgB,UAAA,4EAAAhB,GAAA,YAAAA,EAAA,UAAAmD,eAAA,oEAAAnD,CAAA,CAAAoD,CAAAnD,EAAA,CAAAoD,CAAApD,EAAAwC,IAAAG,QAAAC,UAAAxE,EAAA2B,GAAA,GAAA8C,EAAA7C,GAAAtD,aAAA0B,EAAAuB,MAAAK,EAAAD,GAAA,CAMIsD,CAAA,KAAA2F,IACKvO,OAASA,EACdwI,EAAKgG,aAAe,KACpBhG,EAAKiG,iBAAmB,KACxBjG,EAAKkG,YAAc,KACnBlG,EAAKmG,aAAc,EAAMnG,CAC3B,CAEA,OAdF,SAAAjD,EAAAD,GAAA,sBAAAA,GAAA,OAAAA,EAAA,UAAAgB,UAAA,sDAAAf,EAAA9D,UAAAT,OAAA6B,OAAAyC,GAAAA,EAAA7D,UAAA,CAAAQ,YAAA,CAAAmC,MAAAmB,EAAA6B,UAAA,EAAAD,cAAA,KAAAnG,OAAA4C,eAAA2B,EAAA,aAAA6B,UAAA,IAAA9B,GAAA+C,EAAA9C,EAAAD,EAAA,CAcE4D,CAAAqF,EAAAjG,GAdFhD,EAcEiJ,EAdFrK,EAcE,EAAAhE,IAAA,wBAAAkE,MAIA,WAEE,GAAI/C,KAAKrB,OAAO4O,mBACd,OAAOvN,KAAKrB,OAAO4O,mBAIrB,IAC0B7D,EAD8BE,EAzB5D,SAAA/G,EAAAoB,GAAA,IAAAC,EAAA,oBAAA3F,QAAAsE,EAAAtE,OAAAa,WAAAyD,EAAA,kBAAAqB,EAAA,IAAApD,MAAAC,QAAA8B,KAAAqB,EAAA,SAAArB,EAAAiC,GAAA,GAAAjC,EAAA,qBAAAA,EAAA,OAAAoK,EAAApK,EAAAiC,GAAA,IAAAZ,EAAA,GAAA6G,SAAAnI,KAAAC,GAAA2K,MAAA,uBAAAtJ,GAAArB,EAAAjC,cAAAsD,EAAArB,EAAAjC,YAAA6M,MAAA,QAAAvJ,GAAA,QAAAA,EAAApD,MAAA4M,KAAA7K,GAAA,cAAAqB,GAAA,2CAAAyJ,KAAAzJ,GAAA+I,EAAApK,EAAAiC,QAAA,GAAA8I,CAAA/K,KAAAoB,GAAApB,GAAA,iBAAAA,EAAAY,OAAA,CAAAS,IAAArB,EAAAqB,GAAA,IAAA2J,EAAA,EAAAC,EAAA,oBAAA/D,EAAA+D,EAAA3J,EAAA,kBAAA0J,GAAAhL,EAAAY,OAAA,CAAAyB,MAAA,IAAAA,MAAA,EAAAnC,MAAAF,EAAAgL,KAAA,EAAA5J,EAAA,SAAApB,GAAA,MAAAA,CAAA,EAAA4B,EAAAqJ,EAAA,WAAA7I,UAAA,6IAAA3C,EAAAwC,GAAA,EAAAP,GAAA,SAAAwF,EAAA,WAAA7F,EAAAA,EAAAtB,KAAAC,EAAA,EAAAsB,EAAA,eAAAtB,EAAAqB,EAAA6J,OAAA,OAAAjJ,EAAAjC,EAAAqC,KAAArC,CAAA,EAAAoB,EAAA,SAAApB,GAAA0B,GAAA,EAAAjC,EAAAO,CAAA,EAAA4B,EAAA,eAAAK,GAAA,MAAAZ,EAAAiB,QAAAjB,EAAAiB,QAAA,YAAAZ,EAAA,MAAAjC,CAAA,IAyB4DuH,CAAxCmE,SAASC,qBAAqB,WACpB,IAA1B,IAAArE,EAAAG,MAAAL,EAAAE,EAAAzF,KAAAe,MAA4B,KACpBgJ,EADOxE,EAAA3G,MACMmL,IAEnB,GAAIA,IAAQA,EAAIC,SAAS,oBAAsBD,EAAIC,SAAS,kBAE1D,IACc,IAAIC,IAAIF,GAApB,IACMG,EAAWH,EAAII,UAAU,EAAGJ,EAAIK,YAAY,MAClD,MAAO,GAAPvK,OAAUqK,EAAQ,sBACpB,CAAE,MAAOpK,GAEP,IAAMoK,EAAWH,EAAII,UAAU,EAAGJ,EAAIK,YAAY,MAClD,MAAO,GAAPvK,OAAUqK,EAAQ,sBACpB,CAEJ,CAEA,OAAAnE,GAAAN,EAAA3F,EAAAiG,EAAA,SAAAN,EAAAnF,GAAA,CACA,MAAO,6CACT,GAEA,CAAA5F,IAAA,QAAAkE,OAAAyL,EAAAxB,EAAAtH,IAAAE,EAGA,SAAAkC,IAAA,IAAA2G,EAAAC,EAAAxG,EAAA,YAAAxC,IAAAC,EAAA,SAAAwC,GAAA,cAAAA,EAAAzD,EAAAyD,EAAAhE,GAAA,cAAAgE,EAAAzD,EAAA,EAAAyD,EAAAhE,EAAA,EAG6BwK,UAAUC,aAAaC,aAAa,CAC3DC,MAAO,CACLC,WAAY/O,KAAKrB,OAAOoQ,WACxBC,aAAc,EACdC,kBAAkB,EAClBC,kBAAkB,EAClBC,iBAAiB,KAEnB,OAOF,GAfAnP,KAAKqN,YAAWlF,EAAAtD,EAWhB7E,KAAKmN,aAAe,IAAK9O,OAAO+Q,cAAgB/Q,OAAOgR,oBAAoB,CACzEN,WAAY/O,KAAKrB,OAAOoQ,aAIM,cAA5B/O,KAAKmN,aAAamC,MAAqB,CAAAnH,EAAAhE,EAAA,eAAAgE,EAAAhE,EAAA,EACnCnE,KAAKmN,aAAaoC,SAAQ,OAMlC,OAFMd,EAAgBzO,KAAKwP,wBAE3BrH,EAAAhE,EAAA,EACMnE,KAAKmN,aAAasC,aAAaC,UAAUjB,GAAc,OAG7DzO,KAAKoN,iBAAmB,IAAIuC,iBAAiB3P,KAAKmN,aAAc,mBAGjDnN,KAAKmN,aAAayC,wBAAwB5P,KAAKqN,aACvDwC,QAAQ7P,KAAKoN,kBAGpBpN,KAAKoN,iBAAiB0C,KAAKC,UAAY,SAAC5M,GACtC,IAAA6M,EAAuB7M,EAAMqJ,KAArB9N,EAAIsR,EAAJtR,KAAM8N,EAAIwD,EAAJxD,KAED,mBAAT9N,GACFwJ,EAAKU,KAAK,YAAa4D,EAE3B,EAGAxM,KAAKoN,iBAAiB0C,KAAKG,YAAY,CACrCvR,KAAM,qBACN8N,KAAM,CAAE0D,SAAS,KAGnBlQ,KAAKsN,aAAc,EACnBtN,KAAK4I,KAAK,oBAAoBT,EAAAhE,EAAA,eAGJ,MAHIgE,EAAAzD,EAAA,EAAAgK,EAAAvG,EAAAtD,EAG9B7E,KAAK4I,KAAK,QAAO8F,GAASA,EAAA,cAAAvG,EAAArD,EAAA,KAAAgD,EAAA,iBAG7B,WA1DU,OAAA0G,EAAA3K,MAAC,KAADL,UAAA,IA4DX,CAAA3E,IAAA,OAAAkE,OAAAoN,EAAAnD,EAAAtH,IAAAE,EAGA,SAAAwK,IAAA,IAAAC,EAAA,OAAA3K,IAAAC,EAAA,SAAA2K,GAAA,cAAAA,EAAA5L,EAAA4L,EAAAnM,GAAA,UACOnE,KAAKsN,YAAa,CAAFgD,EAAAnM,EAAA,eAAAmM,EAAAxL,EAAA,aAAAwL,EAAA5L,EAAA,GAMf1E,KAAKoN,iBAAkB,CAAFkD,EAAAnM,EAAA,QACmC,OAA1DnE,KAAKoN,iBAAiB0C,KAAKG,YAAY,CAAEvR,KAAM,UAAW4R,EAAAnM,EAAA,EACpD,IAAI8B,QAAQ,SAAAC,GAAO,OAAIqC,WAAWrC,EAAS,IAAI,GAAC,OAOvD,GAHGlG,KAAKqN,cACPrN,KAAKqN,YAAYkD,YAAY3M,QAAQ,SAAA4M,GAAK,OAAIA,EAAMC,MAAM,GAC1DzQ,KAAKqN,YAAc,OAGjBrN,KAAKmN,cAA4C,WAA5BnN,KAAKmN,aAAamC,MAAkB,CAAAgB,EAAAnM,EAAA,eAAAmM,EAAAnM,EAAA,EACrDnE,KAAKmN,aAAa5D,QAAO,OAC/BvJ,KAAKmN,aAAe,KAAK,OAG3BnN,KAAKoN,iBAAmB,KACxBpN,KAAKsN,aAAc,EACnBtN,KAAK4I,KAAK,oBAAoB0H,EAAAnM,EAAA,eAGJ,MAHImM,EAAA5L,EAAA,EAAA2L,EAAAC,EAAAzL,EAG9B7E,KAAK4I,KAAK,QAAOyH,GAASA,EAAA,cAAAC,EAAAxL,EAAA,KAAAsL,EAAA,iBAG7B,WA/BS,OAAAD,EAAAtM,MAAC,KAADL,UAAA,IAiCV,CAAA3E,IAAA,YAAAkE,MAGA,WACE,MAAO,CACLuK,YAAatN,KAAKsN,YAClBoD,kBAAmB1Q,KAAKmN,aAAenN,KAAKmN,aAAamC,MAAQ,SAErE,GAEA,CAAAzQ,IAAA,UAAAkE,MAGA,WACE/C,KAAKyQ,MACP,IAjKF5N,GAAAuD,EAAAnC,EAAA7D,UAAAyC,GAAAlD,OAAA4C,eAAA0B,EAAA,aAAA8B,UAAA,IAAA9B,EAAA,IAAAA,EAAApB,EA8GEsN,EA/DA3B,CAkHC,CA7J+B,CAASxL,G,mPCJ3C,IAAAiB,EAAAC,EAAArB,EAAA,mBAAAtE,OAAAA,OAAA,GAAA4F,EAAAtB,EAAAzD,UAAA,aAAAkD,EAAAO,EAAAC,aAAA,yBAAAsB,EAAAvB,EAAAsB,EAAA7B,EAAA8B,GAAA,IAAAC,EAAAF,GAAAA,EAAA/D,qBAAAkE,EAAAH,EAAAG,EAAAC,EAAA5E,OAAA6B,OAAA6C,EAAAjE,WAAA,OAAAoE,EAAAD,EAAA,mBAAA1B,EAAAsB,EAAA7B,GAAA,IAAA8B,EAAAC,EAAAE,EAAAE,EAAA,EAAAC,EAAApC,GAAA,GAAAqC,GAAA,EAAAC,EAAA,CAAAF,EAAA,EAAAP,EAAA,EAAAU,EAAAZ,EAAAa,EAAA1C,EAAAqC,EAAArC,EAAA2C,KAAAd,EAAA,GAAA7B,EAAA,SAAA8B,EAAArB,GAAA,OAAAuB,EAAAF,EAAAG,EAAA,EAAAE,EAAAN,EAAAW,EAAAT,EAAAtB,EAAAiC,CAAA,YAAA1C,EAAAS,EAAAsB,GAAA,IAAAE,EAAAxB,EAAA0B,EAAAJ,EAAAD,EAAA,GAAAS,GAAAF,IAAAnC,GAAA4B,EAAAQ,EAAAjB,OAAAS,IAAA,KAAA5B,EAAA8B,EAAAM,EAAAR,GAAA9B,EAAAwC,EAAAF,EAAAM,EAAAZ,EAAA,GAAAvB,EAAA,GAAAP,EAAA0C,IAAAb,KAAAI,EAAAH,GAAAC,EAAAD,EAAA,OAAAC,EAAA,MAAAD,EAAA,GAAAA,EAAA,GAAAH,GAAAG,EAAA,IAAAhC,KAAAE,EAAAO,EAAA,GAAAT,EAAAgC,EAAA,KAAAC,EAAA,EAAAO,EAAAC,EAAAV,EAAAS,EAAAT,EAAAC,EAAA,IAAAhC,EAAA4C,IAAA1C,EAAAO,EAAA,GAAAuB,EAAA,GAAAD,GAAAA,EAAAa,KAAAZ,EAAA,GAAAvB,EAAAuB,EAAA,GAAAD,EAAAS,EAAAT,EAAAa,EAAAX,EAAA,OAAA/B,GAAAO,EAAA,SAAAiC,EAAA,MAAAH,GAAA,EAAAR,CAAA,iBAAA7B,EAAAoC,EAAAM,GAAA,GAAAP,EAAA,QAAAQ,UAAA,oCAAAN,GAAA,IAAAD,GAAAtC,EAAAsC,EAAAM,GAAAX,EAAAK,EAAAH,EAAAS,GAAAd,EAAAG,EAAA,EAAAJ,EAAAM,KAAAI,GAAA,CAAAP,IAAAC,EAAAA,EAAA,GAAAA,EAAA,IAAAO,EAAAT,GAAA,GAAA/B,EAAAiC,EAAAE,IAAAK,EAAAT,EAAAI,EAAAK,EAAAC,EAAAN,GAAA,OAAAE,EAAA,EAAAL,EAAA,IAAAC,IAAA/B,EAAA,QAAA4B,EAAAE,EAAA9B,GAAA,MAAA4B,EAAAA,EAAAtB,KAAAwB,EAAAG,IAAA,MAAAU,UAAA,wCAAAf,EAAAgB,KAAA,OAAAhB,EAAAK,EAAAL,EAAAnB,MAAAsB,EAAA,IAAAA,EAAA,YAAAA,IAAAH,EAAAE,EAAAe,SAAAjB,EAAAtB,KAAAwB,GAAAC,EAAA,IAAAE,EAAAU,UAAA,oCAAA3C,EAAA,YAAA+B,EAAA,GAAAD,EAAAH,CAAA,UAAAC,GAAAS,EAAAC,EAAAT,EAAA,GAAAI,EAAA1B,EAAAD,KAAAuB,EAAAS,MAAAE,EAAA,YAAAZ,GAAAE,EAAAH,EAAAI,EAAA,EAAAE,EAAAL,CAAA,SAAAO,EAAA,UAAA1B,MAAAmB,EAAAgB,KAAAP,EAAA,GAAA9B,EAAAP,EAAA8B,IAAA,GAAAG,CAAA,KAAAO,EAAA,YAAAR,IAAA,UAAAc,IAAA,UAAAC,IAAA,CAAAnB,EAAAvE,OAAA2F,eAAA,IAAAjB,EAAA,GAAAF,GAAAD,EAAAA,EAAA,GAAAC,QAAAK,EAAAN,EAAA,GAAAC,EAAA,yBAAAD,GAAAK,EAAAc,EAAAjF,UAAAkE,EAAAlE,UAAAT,OAAA6B,OAAA6C,GAAA,SAAAI,EAAAR,GAAA,OAAAtE,OAAA4F,eAAA5F,OAAA4F,eAAAtB,EAAAoB,IAAApB,EAAAuB,UAAAH,EAAAb,EAAAP,EAAA3B,EAAA,sBAAA2B,EAAA7D,UAAAT,OAAA6B,OAAA+C,GAAAN,CAAA,QAAAmB,EAAAhF,UAAAiF,EAAAb,EAAAD,EAAA,cAAAc,GAAAb,EAAAa,EAAA,cAAAD,GAAAA,EAAAK,YAAA,oBAAAjB,EAAAa,EAAA/C,EAAA,qBAAAkC,EAAAD,GAAAC,EAAAD,EAAAjC,EAAA,aAAAkC,EAAAD,EAAAJ,EAAA,yBAAAK,EAAAD,EAAA,oDAAAmB,EAAA,kBAAAC,EAAAvB,EAAAwB,EAAAnB,EAAA,cAAAD,EAAAP,EAAApB,EAAAsB,EAAAD,GAAA,IAAAE,EAAAzE,OAAA4C,eAAA,IAAA6B,EAAA,gBAAAH,GAAAG,EAAA,EAAAI,EAAA,SAAAP,EAAApB,EAAAsB,EAAAD,GAAA,SAAA5B,EAAAO,EAAAsB,GAAAK,EAAAP,EAAApB,EAAA,SAAAoB,GAAA,YAAA4B,QAAAhD,EAAAsB,EAAAF,EAAA,GAAApB,EAAAuB,EAAAA,EAAAH,EAAApB,EAAA,CAAAE,MAAAoB,EAAA3B,YAAA0B,EAAA4B,cAAA5B,EAAA6B,UAAA7B,IAAAD,EAAApB,GAAAsB,GAAA7B,EAAA,UAAAA,EAAA,WAAAA,EAAA,cAAAkC,EAAAP,EAAApB,EAAAsB,EAAAD,EAAA,UAAA8B,EAAA7B,EAAAD,EAAAD,EAAApB,EAAAP,EAAAwC,EAAAT,GAAA,QAAAD,EAAAD,EAAAW,GAAAT,GAAAE,EAAAH,EAAArB,KAAA,OAAAoB,GAAA,YAAAF,EAAAE,EAAA,CAAAC,EAAAc,KAAAhB,EAAAK,GAAA0B,QAAAC,QAAA3B,GAAA4B,KAAAtD,EAAAP,EAAA,UAAA8D,EAAAnC,EAAApB,GAAA,QAAAqB,EAAA,EAAAA,EAAArB,EAAAY,OAAAS,IAAA,KAAA5B,EAAAO,EAAAqB,GAAA5B,EAAAE,WAAAF,EAAAE,aAAA,EAAAF,EAAAwD,cAAA,YAAAxD,IAAAA,EAAAyD,UAAA,GAAApG,OAAA4C,eAAA0B,EAAAoC,EAAA/D,EAAAzD,KAAAyD,EAAA,WAAA+D,EAAAnC,GAAA,IAAAE,EAAA,SAAAF,GAAA,aAAAoC,EAAApC,KAAAA,EAAA,OAAAA,EAAA,IAAAD,EAAAC,EAAA3F,OAAAgI,aAAA,YAAAtC,EAAA,KAAAG,EAAAH,EAAArB,KAAAsB,EAAArB,UAAA,aAAAyD,EAAAlC,GAAA,OAAAA,EAAA,UAAAa,UAAA,uDAAAuB,OAAAtC,EAAA,CAAAuC,CAAAvC,GAAA,gBAAAoC,EAAAlC,GAAAA,EAAAA,EAAA,YAAAsC,IAAA,QAAAxC,GAAAyC,QAAAvG,UAAAwG,QAAAhE,KAAAiE,QAAAC,UAAAH,QAAA,wBAAAzC,GAAA,QAAAwC,EAAA,mBAAAxC,CAAA,cAAA6C,EAAA7C,GAAA,OAAA6C,EAAApH,OAAA4F,eAAA5F,OAAA2F,eAAAP,OAAA,SAAAb,GAAA,OAAAA,EAAAsB,WAAA7F,OAAA2F,eAAApB,EAAA,EAAA6C,EAAA7C,EAAA,UAAA8C,EAAA9C,EAAAD,GAAA,OAAA+C,EAAArH,OAAA4F,eAAA5F,OAAA4F,eAAAR,OAAA,SAAAb,EAAAD,GAAA,OAAAC,EAAAsB,UAAAvB,EAAAC,CAAA,EAAA8C,EAAA9C,EAAAD,EAAA,CAE6C,IAExB0M,EAAW,SAAA1J,GAC9B,SAAA0J,EAAYhS,GAAQ,IAAAwI,EAOQ,OAZ9B,SAAArC,EAAAX,GAAA,KAAAW,aAAAX,GAAA,UAAAc,UAAA,qCAKsBhC,CAAA,KAAA0N,IAClBxJ,EANJ,SAAAjD,EAAA5B,EAAA2B,GAAA,OAAA3B,EAAAyE,EAAAzE,GAAA,SAAA4B,EAAAD,GAAA,GAAAA,IAAA,UAAAqC,EAAArC,IAAA,mBAAAA,GAAA,OAAAA,EAAA,YAAAA,EAAA,UAAAgB,UAAA,4EAAAhB,GAAA,YAAAA,EAAA,UAAAmD,eAAA,oEAAAnD,CAAA,CAAAoD,CAAAnD,EAAA,CAAAoD,CAAApD,EAAAwC,IAAAG,QAAAC,UAAAxE,EAAA2B,GAAA,GAAA8C,EAAA7C,GAAAtD,aAAA0B,EAAAuB,MAAAK,EAAAD,GAAA,CAMIsD,CAAA,KAAAoJ,IACKhS,OAASA,EACdwI,EAAKgG,aAAe,KACpBhG,EAAKyJ,WAAa,GAClBzJ,EAAK0J,WAAY,EACjB1J,EAAK2J,mBAAoB,EACzB3J,EAAK4J,cAAgB,KAAK5J,CAC5B,CAEA,OAfF,SAAAjD,EAAAD,GAAA,sBAAAA,GAAA,OAAAA,EAAA,UAAAgB,UAAA,sDAAAf,EAAA9D,UAAAT,OAAA6B,OAAAyC,GAAAA,EAAA7D,UAAA,CAAAQ,YAAA,CAAAmC,MAAAmB,EAAA6B,UAAA,EAAAD,cAAA,KAAAnG,OAAA4C,eAAA2B,EAAA,aAAA6B,UAAA,IAAA9B,GAAA+C,EAAA9C,EAAAD,EAAA,CAeE4D,CAAA8I,EAAA1J,GAfFhD,EAeE0M,EAfF9N,EAeE,EAAAhE,IAAA,YAAAkE,MAGA,SAAUiO,GAAW,IAAA9I,EAAA,KACnB,IACE,IAAM+I,EAAYjR,KAAKkR,gBAAgBF,GACvChR,KAAK4Q,WAAWxN,KAAK6N,GAIhBjR,KAAK6Q,WAAc7Q,KAAK8Q,mBAAsB9Q,KAAK+Q,eACtDxI,WAAW,kBAAML,EAAKiJ,cAAc,EAAE,GAE1C,CAAE,MAAOrN,GACP9D,KAAK4I,KAAK,gBAAiB9E,EAC7B,CACF,GAEA,CAAAjF,IAAA,kBAAAkE,MAGA,SAAgB6J,GACd,IAAMwE,EAAa,IAAIC,WAAWzE,GAGlC,GAAIwE,EAAW3N,QAAU,EAAG,CAE1B,GAAsB,KAAlB2N,EAAW,IAAiC,KAAlBA,EAAW,IACnB,KAAlBA,EAAW,IAAiC,KAAlBA,EAAW,GACvC,OAAO,IAAIzE,KAAK,CAACC,GAAc,CAAElO,KAAM,cAIzC,GAAsB,MAAlB0S,EAAW,MAA0C,KAA1BA,EAAW,IACxC,OAAO,IAAIzE,KAAK,CAACC,GAAc,CAAElO,KAAM,eAIzC,GAAsB,KAAlB0S,EAAW,IAAiC,MAAlBA,EAAW,IACnB,MAAlBA,EAAW,IAAiC,KAAlBA,EAAW,GACvC,OAAO,IAAIzE,KAAK,CAACC,GAAc,CAAElO,KAAM,aAE3C,CAGA,OAAO,IAAIiO,KAAK,CAACC,GAAc,CAAElO,KAAM,aACzC,GAEA,CAAAG,IAAA,eAAAkE,OA/DFoB,EA+DEuB,IAAAE,EAGA,SAAAkC,IAAA,IAAAmJ,EAAAK,EAAAC,EAAApE,EAAAP,EAAA4E,EAAAC,EAAAC,EAAAhD,EAAAjD,EAAA,YAAA/F,IAAAC,EAAA,SAAAwC,GAAA,cAAAA,EAAAzD,EAAAyD,EAAAhE,GAAA,WAGMnE,KAAK8Q,mBAAgD,IAA3B9Q,KAAK4Q,WAAWnN,OAAY,CAAA0E,EAAAhE,EAAA,eAAAgE,EAAArD,EAAA,UAMjB,GAFzC9E,KAAK8Q,mBAAoB,EAEnBG,EAAYjR,KAAK4Q,WAAWe,QAClB,CAAFxJ,EAAAhE,EAAA,QACmB,OAA/BnE,KAAK8Q,mBAAoB,EAAM3I,EAAArD,EAAA,UAkB/B,GAlB+BqD,EAAAzD,EAAA,EAOzB4M,GAAuBtR,KAAK6Q,WAAoC,OAAvB7Q,KAAK+Q,cAG/C/Q,KAAKmN,eAEFoE,EAAiBvR,KAAKrB,OAAOoQ,WAAa,CAAEA,WAAY/O,KAAKrB,OAAOoQ,YAAe,CAAC,EAC1F/O,KAAKmN,aAAe,IAAK9O,OAAO+Q,cAAgB/Q,OAAOgR,oBAAoBkC,IAMlD,eAHrBpE,EAAenN,KAAKmN,cAGTmC,MAAqB,CAAAnH,EAAAhE,EAAA,eAAAgE,EAAAhE,EAAA,EAC9BgJ,EAAaoC,SAAQ,cAAApH,EAAAhE,EAAA,EAIH8M,EAAUrE,cAAa,OAAhC,OAAXA,EAAWzE,EAAAtD,EAAAsD,EAAAhE,EAAG,EACMgJ,EAAayE,gBAAgBhF,GAAY,OAA7D4E,EAAWrJ,EAAAtD,EAIX4M,EAAkBH,IAAwBtR,KAAK6Q,WAAoC,OAAvB7Q,KAAK+Q,eAEjEW,EAASvE,EAAa0E,sBACrBC,OAASN,EAChBE,EAAO7B,QAAQ1C,EAAa4E,aAG5B/R,KAAK+Q,cAAgBW,EACrB1R,KAAK6Q,WAAY,EAKbY,GACFzR,KAAK4I,KAAK,mBAIZ8I,EAAOM,QAAU,WACfvG,EAAKsF,cAAgB,KACrBtF,EAAKqF,mBAAoB,EAGrBrF,EAAKmF,WAAWnN,OAAS,EAI3B8E,WAAW,kBAAMkD,EAAK0F,cAAc,EAAE,GAItC5I,WAAW,WAEsB,IAA3BkD,EAAKmF,WAAWnN,QAAiBgI,EAAKsF,gBACxCtF,EAAKoF,WAAY,EACjBpF,EAAK7C,KAAK,mBAEd,EAAG,IAEP,EAGA8I,EAAOO,QAAQ9J,EAAAhE,EAAA,eAAAgE,EAAAzD,EAAA,EAAAgK,EAAAvG,EAAAtD,EAGf7E,KAAK+Q,cAAgB,KACrB/Q,KAAK4I,KAAK,gBAAe8F,GAGrB1O,KAAK4Q,WAAWnN,OAAS,GAC3BzD,KAAK8Q,mBAAoB,EACzBvI,WAAW,kBAAMkD,EAAK0F,cAAc,EAAE,OAGtCnR,KAAK6Q,WAAY,EACjB7Q,KAAK8Q,mBAAoB,EACzB9Q,KAAK4I,KAAK,oBACX,cAAAT,EAAArD,EAAA,KAAAgD,EAAA,gBApGLoK,EA/DF,eAAAhO,EAAA,KAAAD,EAAAT,UAAA,WAAAyC,QAAA,SAAApD,EAAAP,GAAA,IAAAwC,EAAAX,EAAAN,MAAAK,EAAAD,GAAA,SAAA6E,EAAA3E,GAAA6B,EAAAlB,EAAAjC,EAAAP,EAAAwG,EAAAC,EAAA,OAAA5E,EAAA,UAAA4E,EAAA5E,GAAA6B,EAAAlB,EAAAjC,EAAAP,EAAAwG,EAAAC,EAAA,QAAA5E,EAAA,CAAA2E,OAAA,MAqKG,WAnGiB,OAAAoJ,EAAArO,MAAC,KAADL,UAAA,IAqGlB,CAAA3E,IAAA,OAAAkE,MAGA,WACE/C,KAAKmS,eACP,GAEA,CAAAtT,IAAA,gBAAAkE,MAGA,WACE,IAAMqP,EAAapS,KAAK6Q,WAAoC,OAAvB7Q,KAAK+Q,cAE1C,GAAI/Q,KAAK+Q,cAAe,CACtB,IACE/Q,KAAK+Q,cAAcN,MACrB,CAAE,MAAO3M,GACP,CAEF9D,KAAK+Q,cAAgB,IACvB,CAEA/Q,KAAK6Q,WAAY,EACjB7Q,KAAK8Q,mBAAoB,EACzB9Q,KAAK4Q,WAAa,GAGdwB,GACFpS,KAAK4I,KAAK,kBAEd,GAEA,CAAA/J,IAAA,YAAAkE,MAGA,WACE,MAAO,CACL8N,UAAW7Q,KAAK6Q,UAChBC,kBAAmB9Q,KAAK8Q,kBACxBuB,YAAarS,KAAK4Q,WAAWnN,OAC7BiN,kBAAmB1Q,KAAKmN,aAAenN,KAAKmN,aAAamC,MAAQ,SAErE,GAEA,CAAAzQ,IAAA,UAAAkE,MAGA,WACE/C,KAAKyQ,OAEDzQ,KAAKmN,cAA4C,WAA5BnN,KAAKmN,aAAamC,QACzCtP,KAAKmN,aAAa5D,QAClBvJ,KAAKmN,aAAe,KAExB,IA7NFtK,GAAAuD,EAAAnC,EAAA7D,UAAAyC,GAAAlD,OAAA4C,eAAA0B,EAAA,aAAA8B,UAAA,IAAA9B,EAAA,IAAAA,EAAApB,EAAAsB,EA+DE+N,CA8JC,CAzN6B,CAASlP,G,uPCJzC,IAAAiB,EAAAC,EAAArB,EAAA,mBAAAtE,OAAAA,OAAA,GAAA4F,EAAAtB,EAAAzD,UAAA,aAAAkD,EAAAO,EAAAC,aAAA,yBAAAsB,EAAAvB,EAAAsB,EAAA7B,EAAA8B,GAAA,IAAAC,EAAAF,GAAAA,EAAA/D,qBAAAkE,EAAAH,EAAAG,EAAAC,EAAA5E,OAAA6B,OAAA6C,EAAAjE,WAAA,OAAAoE,GAAAD,EAAA,mBAAA1B,EAAAsB,EAAA7B,GAAA,IAAA8B,EAAAC,EAAAE,EAAAE,EAAA,EAAAC,EAAApC,GAAA,GAAAqC,GAAA,EAAAC,EAAA,CAAAF,EAAA,EAAAP,EAAA,EAAAU,EAAAZ,EAAAa,EAAA1C,EAAAqC,EAAArC,EAAA2C,KAAAd,EAAA,GAAA7B,EAAA,SAAA8B,EAAArB,GAAA,OAAAuB,EAAAF,EAAAG,EAAA,EAAAE,EAAAN,EAAAW,EAAAT,EAAAtB,EAAAiC,CAAA,YAAA1C,EAAAS,EAAAsB,GAAA,IAAAE,EAAAxB,EAAA0B,EAAAJ,EAAAD,EAAA,GAAAS,GAAAF,IAAAnC,GAAA4B,EAAAQ,EAAAjB,OAAAS,IAAA,KAAA5B,EAAA8B,EAAAM,EAAAR,GAAA9B,EAAAwC,EAAAF,EAAAM,EAAAZ,EAAA,GAAAvB,EAAA,GAAAP,EAAA0C,IAAAb,KAAAI,EAAAH,GAAAC,EAAAD,EAAA,OAAAC,EAAA,MAAAD,EAAA,GAAAA,EAAA,GAAAH,GAAAG,EAAA,IAAAhC,KAAAE,EAAAO,EAAA,GAAAT,EAAAgC,EAAA,KAAAC,EAAA,EAAAO,EAAAC,EAAAV,EAAAS,EAAAT,EAAAC,EAAA,IAAAhC,EAAA4C,IAAA1C,EAAAO,EAAA,GAAAuB,EAAA,GAAAD,GAAAA,EAAAa,KAAAZ,EAAA,GAAAvB,EAAAuB,EAAA,GAAAD,EAAAS,EAAAT,EAAAa,EAAAX,EAAA,OAAA/B,GAAAO,EAAA,SAAAiC,EAAA,MAAAH,GAAA,EAAAR,CAAA,iBAAA7B,EAAAoC,EAAAM,GAAA,GAAAP,EAAA,QAAAQ,UAAA,oCAAAN,GAAA,IAAAD,GAAAtC,EAAAsC,EAAAM,GAAAX,EAAAK,EAAAH,EAAAS,GAAAd,EAAAG,EAAA,EAAAJ,EAAAM,KAAAI,GAAA,CAAAP,IAAAC,EAAAA,EAAA,GAAAA,EAAA,IAAAO,EAAAT,GAAA,GAAA/B,EAAAiC,EAAAE,IAAAK,EAAAT,EAAAI,EAAAK,EAAAC,EAAAN,GAAA,OAAAE,EAAA,EAAAL,EAAA,IAAAC,IAAA/B,EAAA,QAAA4B,EAAAE,EAAA9B,GAAA,MAAA4B,EAAAA,EAAAtB,KAAAwB,EAAAG,IAAA,MAAAU,UAAA,wCAAAf,EAAAgB,KAAA,OAAAhB,EAAAK,EAAAL,EAAAnB,MAAAsB,EAAA,IAAAA,EAAA,YAAAA,IAAAH,EAAAE,EAAAe,SAAAjB,EAAAtB,KAAAwB,GAAAC,EAAA,IAAAE,EAAAU,UAAA,oCAAA3C,EAAA,YAAA+B,EAAA,GAAAD,EAAAH,CAAA,UAAAC,GAAAS,EAAAC,EAAAT,EAAA,GAAAI,EAAA1B,EAAAD,KAAAuB,EAAAS,MAAAE,EAAA,YAAAZ,GAAAE,EAAAH,EAAAI,EAAA,EAAAE,EAAAL,CAAA,SAAAO,EAAA,UAAA1B,MAAAmB,EAAAgB,KAAAP,EAAA,GAAA9B,EAAAP,EAAA8B,IAAA,GAAAG,CAAA,KAAAO,EAAA,YAAAR,IAAA,UAAAc,IAAA,UAAAC,IAAA,CAAAnB,EAAAvE,OAAA2F,eAAA,IAAAjB,EAAA,GAAAF,GAAAD,EAAAA,EAAA,GAAAC,QAAAK,GAAAN,EAAA,GAAAC,EAAA,yBAAAD,GAAAK,EAAAc,EAAAjF,UAAAkE,EAAAlE,UAAAT,OAAA6B,OAAA6C,GAAA,SAAAI,EAAAR,GAAA,OAAAtE,OAAA4F,eAAA5F,OAAA4F,eAAAtB,EAAAoB,IAAApB,EAAAuB,UAAAH,EAAAb,GAAAP,EAAA3B,EAAA,sBAAA2B,EAAA7D,UAAAT,OAAA6B,OAAA+C,GAAAN,CAAA,QAAAmB,EAAAhF,UAAAiF,EAAAb,GAAAD,EAAA,cAAAc,GAAAb,GAAAa,EAAA,cAAAD,GAAAA,EAAAK,YAAA,oBAAAjB,GAAAa,EAAA/C,EAAA,qBAAAkC,GAAAD,GAAAC,GAAAD,EAAAjC,EAAA,aAAAkC,GAAAD,EAAAJ,EAAA,yBAAAK,GAAAD,EAAA,oDAAAmB,GAAA,kBAAAC,EAAAvB,EAAAwB,EAAAnB,EAAA,cAAAD,GAAAP,EAAApB,EAAAsB,EAAAD,GAAA,IAAAE,EAAAzE,OAAA4C,eAAA,IAAA6B,EAAA,gBAAAH,GAAAG,EAAA,EAAAI,GAAA,SAAAP,EAAApB,EAAAsB,EAAAD,GAAA,SAAA5B,EAAAO,EAAAsB,GAAAK,GAAAP,EAAApB,EAAA,SAAAoB,GAAA,YAAA4B,QAAAhD,EAAAsB,EAAAF,EAAA,GAAApB,EAAAuB,EAAAA,EAAAH,EAAApB,EAAA,CAAAE,MAAAoB,EAAA3B,YAAA0B,EAAA4B,cAAA5B,EAAA6B,UAAA7B,IAAAD,EAAApB,GAAAsB,GAAA7B,EAAA,UAAAA,EAAA,WAAAA,EAAA,cAAAkC,GAAAP,EAAApB,EAAAsB,EAAAD,EAAA,UAAA8B,GAAA7B,EAAAD,EAAAD,EAAApB,EAAAP,EAAAwC,EAAAT,GAAA,QAAAD,EAAAD,EAAAW,GAAAT,GAAAE,EAAAH,EAAArB,KAAA,OAAAoB,GAAA,YAAAF,EAAAE,EAAA,CAAAC,EAAAc,KAAAhB,EAAAK,GAAA0B,QAAAC,QAAA3B,GAAA4B,KAAAtD,EAAAP,EAAA,UAAA0K,GAAA7I,GAAA,sBAAAD,EAAA,KAAAD,EAAAT,UAAA,WAAAyC,QAAA,SAAApD,EAAAP,GAAA,IAAAwC,EAAAX,EAAAN,MAAAK,EAAAD,GAAA,SAAA6E,EAAA3E,GAAA6B,GAAAlB,EAAAjC,EAAAP,EAAAwG,EAAAC,EAAA,OAAA5E,EAAA,UAAA4E,EAAA5E,GAAA6B,GAAAlB,EAAAjC,EAAAP,EAAAwG,EAAAC,EAAA,QAAA5E,EAAA,CAAA2E,OAAA,eAAAwJ,GAAArO,EAAApB,GAAA,IAAAqB,EAAAvE,OAAA4S,KAAAtO,GAAA,GAAAtE,OAAA6S,sBAAA,KAAAlQ,EAAA3C,OAAA6S,sBAAAvO,GAAApB,IAAAP,EAAAA,EAAAe,OAAA,SAAAR,GAAA,OAAAlD,OAAA8S,yBAAAxO,EAAApB,GAAAL,UAAA,IAAA0B,EAAAd,KAAAS,MAAAK,EAAA5B,EAAA,QAAA4B,CAAA,UAAAwO,GAAAzO,GAAA,QAAApB,EAAA,EAAAA,EAAAW,UAAAC,OAAAZ,IAAA,KAAAqB,EAAA,MAAAV,UAAAX,GAAAW,UAAAX,GAAA,GAAAA,EAAA,EAAAyP,GAAA3S,OAAAuE,IAAA,GAAAN,QAAA,SAAAf,GAAA8P,GAAA1O,EAAApB,EAAAqB,EAAArB,GAAA,GAAAlD,OAAAiT,0BAAAjT,OAAAkT,iBAAA5O,EAAAtE,OAAAiT,0BAAA1O,IAAAoO,GAAA3S,OAAAuE,IAAAN,QAAA,SAAAf,GAAAlD,OAAA4C,eAAA0B,EAAApB,EAAAlD,OAAA8S,yBAAAvO,EAAArB,GAAA,UAAAoB,CAAA,UAAA0O,GAAA1O,EAAApB,EAAAqB,GAAA,OAAArB,EAAAwD,GAAAxD,MAAAoB,EAAAtE,OAAA4C,eAAA0B,EAAApB,EAAA,CAAAE,MAAAmB,EAAA1B,YAAA,EAAAsD,cAAA,EAAAC,UAAA,IAAA9B,EAAApB,GAAAqB,EAAAD,CAAA,UAAAmC,GAAAnC,EAAApB,GAAA,QAAAqB,EAAA,EAAAA,EAAArB,EAAAY,OAAAS,IAAA,KAAA5B,EAAAO,EAAAqB,GAAA5B,EAAAE,WAAAF,EAAAE,aAAA,EAAAF,EAAAwD,cAAA,YAAAxD,IAAAA,EAAAyD,UAAA,GAAApG,OAAA4C,eAAA0B,EAAAoC,GAAA/D,EAAAzD,KAAAyD,EAAA,WAAA+D,GAAAnC,GAAA,IAAAE,EAAA,SAAAF,GAAA,aAAAoC,GAAApC,KAAAA,EAAA,OAAAA,EAAA,IAAAD,EAAAC,EAAA3F,OAAAgI,aAAA,YAAAtC,EAAA,KAAAG,EAAAH,EAAArB,KAAAsB,EAAArB,UAAA,aAAAyD,GAAAlC,GAAA,OAAAA,EAAA,UAAAa,UAAA,uDAAAuB,OAAAtC,EAAA,CAAAuC,CAAAvC,GAAA,gBAAAoC,GAAAlC,GAAAA,EAAAA,EAAA,YAAAsC,KAAA,QAAAxC,GAAAyC,QAAAvG,UAAAwG,QAAAhE,KAAAiE,QAAAC,UAAAH,QAAA,wBAAAzC,GAAA,QAAAwC,GAAA,mBAAAxC,CAAA,cAAA6C,GAAA7C,GAAA,OAAA6C,GAAApH,OAAA4F,eAAA5F,OAAA2F,eAAAP,OAAA,SAAAb,GAAA,OAAAA,EAAAsB,WAAA7F,OAAA2F,eAAApB,EAAA,EAAA6C,GAAA7C,EAAA,UAAA8C,GAAA9C,EAAAD,GAAA,OAAA+C,GAAArH,OAAA4F,eAAA5F,OAAA4F,eAAAR,OAAA,SAAAb,EAAAD,GAAA,OAAAC,EAAAsB,UAAAvB,EAAAC,CAAA,EAAA8C,GAAA9C,EAAAD,EAAA,CAM2C,IAEtB6O,GAAQ,SAAA7L,GAC3B,SAAA6L,IAAyB,IAAA3L,EAAbxI,EAAM6E,UAAAC,OAAA,QAAAvB,IAAAsB,UAAA,GAAAA,UAAA,GAAG,CAAC,EAmCM,OA5C9B,SAAAsB,EAAAX,GAAA,KAAAW,aAAAX,GAAA,UAAAc,UAAA,qCASyBhC,CAAA,KAAA6P,IACrB3L,EAVJ,SAAAjD,EAAA5B,EAAA2B,GAAA,OAAA3B,EAAAyE,GAAAzE,GAAA,SAAA4B,EAAAD,GAAA,GAAAA,IAAA,UAAAqC,GAAArC,IAAA,mBAAAA,GAAA,OAAAA,EAAA,YAAAA,EAAA,UAAAgB,UAAA,4EAAAhB,GAAA,YAAAA,EAAA,UAAAmD,eAAA,oEAAAnD,CAAA,CAAAoD,CAAAnD,EAAA,CAAAoD,CAAApD,EAAAwC,KAAAG,QAAAC,UAAAxE,EAAA2B,GAAA,GAAA8C,GAAA7C,GAAAtD,aAAA0B,EAAAuB,MAAAK,EAAAD,GAAA,CAUIsD,CAAA,KAAAuL,IAGKnU,OAAM+T,GAAA,CACTrH,aAAc1M,EAAO0M,cAAgB,oCACrC0H,QAASpU,EAAOoU,QAChBC,MAAOrU,EAAOqU,MACdC,MAAOtU,EAAOsU,MACdC,MAAOvU,EAAOuU,OAAS,UACvBC,SAAUxU,EAAOwU,UAAY,KAC7BpE,WAAYpQ,EAAOoQ,YAAc,KAIjCqE,sBAAuBzU,EAAOyU,uBAAyB,MAEpDzU,GAILwI,EAAKsD,aAAc,EACnBtD,EAAKmG,aAAc,EACnBnG,EAAK0J,WAAY,EACjB1J,EAAKkM,aAAc,EAGnBlM,EAAKmM,iBAAmB,IAAI/I,EAAgBmI,GAAAA,GAAC,CAAC,EACzCvL,EAAKxI,QAAM,IACd4U,eAA6C,IAA9BpM,EAAKxI,OAAO4U,iBAE7BpM,EAAKqM,cAAgB,IAAItG,EAAc/F,EAAKxI,QAC5CwI,EAAKsM,YAAc,IAAI9C,EAAYxJ,EAAKxI,QAGxCwI,EAAKuM,qBAAqBvM,CAC5B,CAEA,OA/CF,SAAAjD,EAAAD,GAAA,sBAAAA,GAAA,OAAAA,EAAA,UAAAgB,UAAA,sDAAAf,EAAA9D,UAAAT,OAAA6B,OAAAyC,GAAAA,EAAA7D,UAAA,CAAAQ,YAAA,CAAAmC,MAAAmB,EAAA6B,UAAA,EAAAD,cAAA,KAAAnG,OAAA4C,eAAA2B,EAAA,aAAA6B,UAAA,IAAA9B,GAAA+C,GAAA9C,EAAAD,EAAA,CA+CE4D,CAAAiL,EAAA7L,GA/CFhD,EA+CE6O,EA/CFjQ,EA+CE,EAAAhE,IAAA,qBAAAkE,MAGA,WAAqB,IAAAmF,EAAA,KAEnBlI,KAAKsT,iBAAiBxH,GAAG,YAAa,WACpC5D,EAAKuC,aAAc,EACnBvC,EAAKyL,mBACLzL,EAAKU,KAAK,YACZ,GAEA5I,KAAKsT,iBAAiBxH,GAAG,eAAgB,SAAC3I,GAIxC,GAHA+E,EAAKuC,aAAc,EAGftH,GAAwB,OAAfA,EAAMyQ,MAAiBzQ,EAAM0Q,SACrC1Q,EAAM0Q,OAAO1F,SAAS,2BACtBhL,EAAM0Q,OAAO1F,SAAS,WACtBhL,EAAM0Q,OAAO1F,SAAS,cAAe,CACxC,IAAM2F,EAAc,IAAIrT,MAAM,0BAC9BqT,EAAYD,OAAS1Q,EAAM0Q,OAC3BC,EAAYF,KAAOzQ,EAAMyQ,KACzB1L,EAAKU,KAAK,cAAekL,GACzB5L,EAAKU,KAAK,QAASkL,EACrB,CAII5L,EAAKoF,aACPpF,EAAK6L,gBAAgBxI,MAAM,SAAArB,GACzBnG,QAAQD,MAAM,oDAAqDoG,EACrE,GAIFhC,EAAKU,KAAK,eAAgBzF,EAC5B,GAEAnD,KAAKsT,iBAAiBxH,GAAG,QAAS,SAAChI,GACjCoE,EAAKU,KAAK,QAAS9E,EACrB,GAEA9D,KAAKsT,iBAAiBxH,GAAG,UAAW,SAACG,GAEnC,GAAkB,mBAAdA,EAAQ/H,GAA0B+H,EAAQO,KAC5C,IAIE,IAFA,IAAMwH,EAAeC,KAAKhI,EAAQO,MAC5BwE,EAAY,IAAIK,WAAW2C,EAAavQ,QACrCW,EAAI,EAAGA,EAAI4P,EAAavQ,OAAQW,IACvC4M,EAAU5M,GAAK4P,EAAaE,WAAW9P,GAGzC8D,EAAKuL,YAAYU,UAAUnD,GAC3B9I,EAAKU,KAAK,kBACZ,CAAE,MAAO9E,GACPC,QAAQD,MAAM,0CAA2CA,EAC3D,MAEAoE,EAAKU,KAAK,UAAWqD,EAEzB,GAEAjM,KAAKsT,iBAAiBxH,GAAG,cAAe,SAACkF,GACvC9I,EAAKuL,YAAYU,UAAUnD,EAC7B,GAEAhR,KAAKsT,iBAAiBxH,GAAG,UAAW,SAACG,GACnC/D,EAAKU,KAAK,UAAWqD,EACvB,GAEAjM,KAAKsT,iBAAiBxH,GAAG,cAAe,SAACG,GACvC/D,EAAKU,KAAK,cAAeqD,GAIzB/D,EAAKuL,YAAYtB,eAEnB,GAGAnS,KAAKwT,cAAc1H,GAAG,mBAAoB,WACxC5D,EAAKoF,aAAc,EAGfpF,EAAK2I,YAEP3I,EAAKuL,YAAYtB,gBAEbjK,EAAKuC,aACPvC,EAAKoL,iBAAiBc,YAAY,CAChClQ,EAAG,cAKTgE,EAAKU,KAAK,mBACZ,GAEA5I,KAAKwT,cAAc1H,GAAG,mBAAoB,WACxC5D,EAAKoF,aAAc,EACnBpF,EAAKU,KAAK,mBACZ,GAEA5I,KAAKwT,cAAc1H,GAAG,YAAa,SAACkF,GAC9B9I,EAAKuC,aACPvC,EAAKoL,iBAAiBe,WAAWrD,EAErC,GAGAhR,KAAKyT,YAAY3H,GAAG,kBAAmB,WACrC5D,EAAK2I,WAAY,EACjB3I,EAAKU,KAAK,mBAGNV,EAAKuC,aACPvC,EAAKoL,iBAAiBc,YAAY,CAChClQ,EAAG,yBAGT,GAEAlE,KAAKyT,YAAY3H,GAAG,kBAAmB,WACrC5D,EAAK2I,WAAY,EACjB3I,EAAKU,KAAK,mBAGNV,EAAKuC,aACPvC,EAAKoL,iBAAiBc,YAAY,CAChClQ,EAAG,yBAGT,GAEAlE,KAAKyT,YAAY3H,GAAG,gBAAiB,SAAChI,GACpCoE,EAAKU,KAAK,gBAAiB9E,EAC7B,EACF,GAEA,CAAAjF,IAAA,UAAAkE,OAAAyI,EAAAwB,GAAAtH,KAAAE,EAGA,SAAAkC,IAAA,IAAAwM,EAAA5F,EAAA,OAAAhJ,KAAAC,EAAA,SAAAwC,GAAA,cAAAA,EAAAzD,EAAAyD,EAAAhE,GAAA,WACMnE,KAAKqT,YAAa,CAAFlL,EAAAhE,EAAA,QAC0C,OAA5DJ,QAAQwI,KAAK,+CAA+CpE,EAAArD,EAAA,GACrD,GAAK,OAQsC,OARtCqD,EAAAzD,EAAA,EAKN4P,EAAQtU,KAAKuU,oBAGnBvU,KAAKsT,iBAAiB3U,OAAO0M,aAAeiJ,EAAMnM,EAAAhE,EAAA,EAE5CnE,KAAKsT,iBAAiBzD,UAAS,cAAA1H,EAAArD,EAAA,GAC9B,GAAI,OAGe,OAHfqD,EAAAzD,EAAA,EAAAgK,EAAAvG,EAAAtD,EAEXd,QAAQD,MAAM,6CAA4C4K,GAC1D1O,KAAK4I,KAAK,QAAO8F,GAASvG,EAAArD,EAAA,GACnB,GAAK,EAAAgD,EAAA,iBAEf,WApBY,OAAA0D,EAAA3H,MAAC,KAADL,UAAA,IAsBb,CAAA3E,IAAA,oBAAAkE,MAGA,WACE,IAAIgF,EAAM/H,KAAKrB,OAAO0M,aAChBmJ,EAAS,IAAIC,gBAsBnB,GAnBIzU,KAAKrB,OAAOoU,SACdyB,EAAOE,OAAO,UAAW1U,KAAKrB,OAAOoU,SAInC/S,KAAKrB,OAAOqU,OACdwB,EAAOE,OAAO,QAAS1U,KAAKrB,OAAOqU,OAIjChT,KAAKrB,OAAOuU,OAA+B,YAAtBlT,KAAKrB,OAAOuU,OACnCsB,EAAOE,OAAO,QAAS1U,KAAKrB,OAAOuU,OAGjClT,KAAKrB,OAAOwU,UAAqC,OAAzBnT,KAAKrB,OAAOwU,UACtCqB,EAAOE,OAAO,WAAY1U,KAAKrB,OAAOwU,UAIpCqB,EAAOzJ,WAAY,CACrB,IAAM4J,EAAY5M,EAAIoG,SAAS,KAAO,IAAM,IAC5CpG,GAAO4M,EAAYH,EAAOzJ,UAC5B,CAEA,OAAOhD,CACT,GAEA,CAAAlJ,IAAA,aAAAkE,MAGA,WACM/C,KAAKqT,cAGTrT,KAAK+T,gBACL/T,KAAKsT,iBAAiBsB,aACxB,GAEA,CAAA/V,IAAA,4BAAAkE,MAGA,WACM/C,KAAKqT,aAGTrT,KAAKsT,iBAAiBuB,2BACxB,GAEA,CAAAhW,IAAA,YAAAkE,OAAA+R,EAAA9H,GAAAtH,KAAAE,EAGA,SAAAwK,IAAA,OAAA1K,KAAAC,EAAA,SAAA2K,GAAA,cAAAA,EAAAnM,GAAA,WACMnE,KAAKqT,YAAa,CAAF/C,EAAAnM,EAAA,eAAAmM,EAAAxL,EAAA,GACX,GAAK,OAImB,OADjC9E,KAAK4U,aACL5U,KAAK6U,4BAA4BvE,EAAAnM,EAAA,EACpBnE,KAAK6P,UAAS,cAAAS,EAAAxL,EAAA,EAAAwL,EAAAzL,GAAA,EAAAuL,EAAA,SAC5B,WARc,OAAA0E,EAAAjR,MAAC,KAADL,UAAA,IAUf,CAAA3E,IAAA,iBAAAkE,OAAAgS,EAAA/H,GAAAtH,KAAAE,EAGA,SAAAoP,IAAA,IAAA3E,EAAA,OAAA3K,KAAAC,EAAA,SAAAsP,GAAA,cAAAA,EAAAvQ,EAAAuQ,EAAA9Q,GAAA,UACOnE,KAAKyK,YAAa,CAAFwK,EAAA9Q,EAAA,cACb,IAAI1D,MAAM,iCAAgC,OAYhD,OAZgDwU,EAAAvQ,EAAA,EAKhD1E,KAAKsT,iBAAiBc,YAAY,CAChClQ,EAAG,wBACH+O,MAAOjT,KAAKkV,gBACZhC,MAAOlT,KAAKrB,OAAOuU,MACnBC,SAAUnT,KAAKrB,OAAOwU,WAGxB8B,EAAA9Q,EAAA,EACMnE,KAAKwT,cAAcvB,QAAO,cAAAgD,EAAAnQ,EAAA,GACzB,GAAI,OAGe,OAHfmQ,EAAAvQ,EAAA,EAAA2L,EAAA4E,EAAApQ,EAEXd,QAAQD,MAAM,yCAAwCuM,GACtDrQ,KAAK4I,KAAK,QAAOyH,GAAS4E,EAAAnQ,EAAA,GACnB,GAAK,EAAAkQ,EAAA,iBAEf,WAtBmB,OAAAD,EAAAlR,MAAC,KAADL,UAAA,IAwBpB,CAAA3E,IAAA,gBAAAkE,OAAAoS,EAAAnI,GAAAtH,KAAAE,EAGA,SAAAwP,IAAA,IAAAC,EAAA,OAAA3P,KAAAC,EAAA,SAAA2P,GAAA,cAAAA,EAAA5Q,EAAA4Q,EAAAnR,GAAA,UACOnE,KAAKsN,YAAa,CAAFgI,EAAAnR,EAAA,eAAAmR,EAAAxQ,EAAA,UAWnB,OAXmBwQ,EAAA5Q,EAAA,EAMnB1E,KAAKsT,iBAAiBc,YAAY,CAChClQ,EAAG,uBACH+O,MAAOjT,KAAKkV,kBAGdI,EAAAnR,EAAA,EACMnE,KAAKwT,cAAc/C,OAAM,OAGE,OAAjCzQ,KAAKyT,YAAYtB,gBAAgBmD,EAAAxQ,EAAA,GAE1B,GAAI,OAEe,OAFfwQ,EAAA5Q,EAAA,EAAA2Q,EAAAC,EAAAzQ,EAEX7E,KAAK4I,KAAK,QAAOyM,GAASC,EAAAxQ,EAAA,GACnB,GAAK,EAAAsQ,EAAA,iBAEf,WAvBkB,OAAAD,EAAAtR,MAAC,KAADL,UAAA,IAyBnB,CAAA3E,IAAA,kBAAAkE,OAAAwS,EAAAvI,GAAAtH,KAAAE,EAGA,SAAA4P,IAAA,OAAA9P,KAAAC,EAAA,SAAA8P,GAAA,cAAAA,EAAAtR,GAAA,WACMnE,KAAKsN,YAAa,CAAFmI,EAAAtR,EAAA,eAAAsR,EAAAtR,EAAA,EACLnE,KAAK+T,gBAAe,OAEC,cAAA0B,EAAA3Q,EAAA,EAAA2Q,EAAA5Q,GAFD,cAAA4Q,EAAAtR,EAAA,EAEpBnE,KAAK0V,iBAAgB,cAAAD,EAAA3Q,EAAA,KAAA0Q,EAAA,SAErC,WANoB,OAAAD,EAAA1R,MAAC,KAADL,UAAA,IAQrB,CAAA3E,IAAA,oBAAAkE,MAGA,WACE/C,KAAKyT,YAAYtB,eACnB,GAEA,CAAAtT,IAAA,gBAAAkE,OAAA4S,EAAA3I,GAAAtH,KAAAE,EAGA,SAAAgQ,IAAA,OAAAlQ,KAAAC,EAAA,SAAAkQ,GAAA,cAAAA,EAAA1R,GAAA,OAIE,GAFAnE,KAAK8V,oBAGA9V,KAAKsN,YAAa,CAAFuI,EAAA1R,EAAA,eAAA0R,EAAA1R,EAAA,EACbnE,KAAK0V,iBAAgB,cAAAG,EAAA/Q,EAAA,KAAA8Q,EAAA,SAE9B,WARkB,OAAAD,EAAA9R,MAAC,KAADL,UAAA,IAUnB,CAAA3E,IAAA,YAAAkE,MAGA,WACE,MAAO,CACL0H,YAAazK,KAAKyK,YAClB6C,YAAatN,KAAKsN,YAClBuD,UAAW7Q,KAAK6Q,UAEpB,GAEA,CAAAhS,IAAA,eAAAkE,MAGA,SAAagT,GACX/V,KAAKrB,OAAM+T,GAAAA,GAAA,GAAQ1S,KAAKrB,QAAWoX,EACrC,GAEA,CAAAlX,IAAA,gBAAAkE,MAGA,WACE,MAAO,OAASoG,KAAK2B,SAASC,SAAS,IAAIC,OAAO,EAAG,GAAK,IAAMJ,KAAKC,KACvE,GAEA,CAAAhM,IAAA,mBAAAkE,MAGA,WACE,GAAK/C,KAAKyK,YAAV,CAKA,IAAMuL,EAAe,CACnB9R,EAAG,SAIL,IAAKlE,KAAKrB,OAAOqU,MAAO,CACtB,IAAMlP,EAAQ,IAAIrD,MAAM,oCAGxB,OAFAsD,QAAQD,MAAM,0CAA2CA,QACzD9D,KAAK4I,KAAK,QAAS9E,EAErB,CAEEkS,EAAahD,MAAQhT,KAAKrB,OAAOqU,MAI/BhT,KAAKrB,OAAOyU,uBACZzT,OAAO4S,KAAKvS,KAAKrB,OAAOyU,uBAAuB3P,OAAS,IAC1DuS,EAAa5C,sBAAwBpT,KAAKrB,OAAOyU,sBACjDrP,QAAQkS,IAAI,gDACVtW,OAAO4S,KAAKvS,KAAKrB,OAAOyU,yBAK5B,IACEpT,KAAKsT,iBAAiBc,YAAY4B,EACpC,CAAE,MAAOlS,GACPC,QAAQD,MAAM,0CAA2CA,GACzD9D,KAAK4I,KAAK,QAAS9E,EACrB,CAhCA,MAFEC,QAAQwI,KAAK,sDAmCjB,GAEA,CAAA1N,IAAA,UAAAkE,MAGA,WACM/C,KAAKqT,cAKTrT,KAAK4U,aAEL5U,KAAKqT,aAAc,EACnBrT,KAAKwT,cAAc0C,UACnBlW,KAAKyT,YAAYyC,UACjBlW,KAAKmW,qBACP,IAjcFtT,GAAAuD,GAAAnC,EAAA7D,UAAAyC,GAAAlD,OAAA4C,eAAA0B,EAAA,aAAA8B,UAAA,IAAA9B,EAAA,IAAAA,EAAApB,EAkWE8S,EAlBAJ,EA5BAJ,EA3BAJ,EAbAD,EAjFAtJ,CAsQC,CAzb0B,CAASxI,G,2qBCTtC,IACMA,GAAY,WAGf,O,EAFD,SAAAA,K,4FAAcC,CAAA,KAAAD,GACZhD,KAAKkD,OAAS,CAAC,CACjB,E,EAAC,EAAArE,IAAA,KAAAkE,MAED,SAAGI,EAAOiT,GAKR,OAJKpW,KAAKkD,OAAOC,KACfnD,KAAKkD,OAAOC,GAAS,IAEvBnD,KAAKkD,OAAOC,GAAOC,KAAKgT,GACjBpW,IACT,GAAC,CAAAnB,IAAA,MAAAkE,MAED,SAAII,EAAOkT,GACT,OAAKrW,KAAKkD,OAAOC,IAEjBnD,KAAKkD,OAAOC,GAASnD,KAAKkD,OAAOC,GAAOE,OACtC,SAAA+S,GAAQ,OAAIA,IAAaC,CAAgB,GAEpCrW,MALyBA,IAMlC,GAAC,CAAAnB,IAAA,OAAAkE,MAED,SAAKI,GAAgB,QAAAI,EAAAC,UAAAC,OAANC,EAAI,IAAA5C,MAAAyC,EAAA,EAAAA,EAAA,KAAAI,EAAA,EAAAA,EAAAJ,EAAAI,IAAJD,EAAIC,EAAA,GAAAH,UAAAG,GACjB,QAAK3D,KAAKkD,OAAOC,KAEjBnD,KAAKkD,OAAOC,GAAOS,QAAQ,SAAAwS,GACzBA,EAAQvS,WAAC,EAAGH,EACd,IACO,EACT,GAAC,CAAA7E,IAAA,OAAAkE,MAED,SAAKI,EAAOiT,GAAU,IAAAjP,EAAA,KACdmP,EAAc,WAClBF,EAAQvS,WAAC,EAADL,WACR2D,EAAK+E,IAAI/I,EAAOmT,EAClB,EACA,OAAOtW,KAAK8L,GAAG3I,EAAOmT,EACxB,GAAC,CAAAzX,IAAA,qBAAAkE,MAED,SAAmBI,GAMjB,OALIA,SACKnD,KAAKkD,OAAOC,GAEnBnD,KAAKkD,OAAS,CAAC,EAEVlD,IACT,I,iFAAC,CA9Ce,GAiDlB,Y,2qBCfA,SA9Bc,WAKZ,O,EAJA,SAAAuW,K,4FAActT,CAAA,KAAAsT,GACZvW,KAAKyN,KAAO,KACd,G,EAEA,EAAA5O,IAAA,SAAAkE,MAKA,SAAOyJ,GACL,GAAIA,aAAgBE,YAClB,OAAOF,EAET,GAAIA,aAAgB6E,WAClB,OAAO7E,EAAKsF,OAEd,MAAM,IAAIrR,MAAM,wBAClB,GAEA,CAAA5B,IAAA,SAAAkE,MAKA,SAAOyT,GACL,OAAOA,CACT,M,8EAAC,CA3BW,G,2qBC2Fd,SA1Fe,WAKb,O,EAJA,SAAAC,K,4FAAcxT,CAAA,KAAAwT,GACZzW,KAAKyN,KAAO,MACd,G,EAEA,EAAA5O,IAAA,SAAAkE,MAKA,SAAO2T,GAOL,IANA,IAAMC,EAAQD,aAAoBrF,WACpBqF,EACA,IAAIrF,WAAWqF,GAEvBE,EAAQ,IAAIC,WAAWF,EAAMlT,QAE1BW,EAAI,EAAGA,EAAIuS,EAAMlT,OAAQW,IAChCwS,EAAMxS,GAAKpE,KAAK8W,cAAcH,EAAMvS,IAGtC,OAAOwS,EAAM9E,MACf,GAEA,CAAAjT,IAAA,SAAAkE,MAKA,SAAOgU,GAOL,IANA,IAAMH,EAAQG,aAAqBF,WACrBE,EACA,IAAIF,WAAWE,GAEvBC,EAAO,IAAI3F,WAAWuF,EAAMnT,QAEzBW,EAAI,EAAGA,EAAIwS,EAAMnT,OAAQW,IAChC4S,EAAK5S,GAAKpE,KAAKiX,cAAcL,EAAMxS,IAGrC,OAAO4S,CACT,GAEA,CAAAnY,IAAA,gBAAAkE,MAKA,SAAcmU,GAEZ,IAIMC,EAAO,GAAiB,GAHZD,GAAS,EAAK,GAMhC,OAPsB,IAARA,GAAiB,EAAI,IAKrB,KAHW,GAARA,GAGcC,GAAQA,GAAQ,GAAK,EAGtD,GAEA,CAAAtY,IAAA,gBAAAkE,MAKA,SAAcqU,GACZ,IAGIC,EAAQD,GAAU,EAAK,IACvBC,IACFD,GAAUA,GAGRA,EAPS,QAQXA,EARW,OAWbA,GAZa,IAeb,IADA,IAAIE,EAAW,EACNC,EAAU,MAA+B,KAAtBH,EAASG,IAAkBD,EAAW,EAAGA,IAAYC,IAAY,GAK7F,OAAe,MAFDF,EAAQC,GAAY,EADlBF,GAAWE,EAAW,EAAM,GAI9C,M,8EAAC,CAvFY,G,2qBCmGf,SAnGe,WAKb,O,EAJA,SAAAE,K,4FAAcvU,CAAA,KAAAuU,GACZxX,KAAKyN,KAAO,MACd,G,EAEA,EAAA5O,IAAA,SAAAkE,MAKA,SAAO0U,GAOL,IANA,IAAMd,EAAQc,aAAoBpG,WACpBoG,EACA,IAAIpG,WAAWoG,GAEvBb,EAAQ,IAAIC,WAAWF,EAAMlT,QAE1BW,EAAI,EAAGA,EAAIuS,EAAMlT,OAAQW,IAChCwS,EAAMxS,GAAKpE,KAAK0X,aAAaf,EAAMvS,IAGrC,OAAOwS,EAAM9E,MACf,GAEA,CAAAjT,IAAA,SAAAkE,MAKA,SAAOgU,GAOL,IANA,IAAMH,EAAQG,aAAqBF,WACrBE,EACA,IAAIF,WAAWE,GAEvBY,EAAO,IAAItG,WAAWuF,EAAMnT,QAEzBW,EAAI,EAAGA,EAAIwS,EAAMnT,OAAQW,IAChCuT,EAAKvT,GAAKpE,KAAK4X,aAAahB,EAAMxS,IAGpC,OAAOuT,CACT,GAEA,CAAA9Y,IAAA,eAAAkE,MAKA,SAAa8U,GAGX,IACMP,GAHNO,GAAQ,KAGkB,EAAK,EACzBC,EAAkB,GAAPD,EASjB,OAXqB,IAAPA,GAAgB,EAAI,IAKjB,IAAbP,EACwB,GAAjBQ,GAAY,GAEM,KAAjBA,GAAY,IAAgBR,EAAW,EAIrD,GAEA,CAAAzY,IAAA,eAAAkE,MAKA,SAAaqU,GACX,IAWIE,EAAUQ,EATVT,EAAQD,GAAU,EAAK,IAW3B,GAVIC,IACFD,GAAUA,GAGRA,EAPS,QAQXA,EARW,OAaTA,EAAS,IACXE,EAAW,EACXQ,EAAWV,GAAU,MAChB,CACLE,EAAW,EACX,IAAK,IAAIC,EAAU,MAA+B,KAAtBH,EAASG,IAAkBD,EAAW,EAAGA,IAAYC,IAAY,GAC7FO,EAAYV,GAAWE,EAAW,EAAM,EAC1C,CAIA,OAAc,IAFHD,EAAQC,GAAY,EAAKQ,EAGtC,M,8EAAC,CAhGY,G,kpBCLf,IAAA7T,EAAAC,EAAArB,EAAA,mBAAAtE,OAAAA,OAAA,GAAA4F,EAAAtB,EAAAzD,UAAA,aAAAkD,EAAAO,EAAAC,aAAA,yBAAAsB,EAAAvB,EAAAsB,EAAA7B,EAAA8B,GAAA,IAAAC,EAAAF,GAAAA,EAAA/D,qBAAAkE,EAAAH,EAAAG,EAAAC,EAAA5E,OAAA6B,OAAA6C,EAAAjE,WAAA,OAAAoE,GAAAD,EAAA,mBAAA1B,EAAAsB,EAAA7B,GAAA,IAAA8B,EAAAC,EAAAE,EAAAE,EAAA,EAAAC,EAAApC,GAAA,GAAAqC,GAAA,EAAAC,EAAA,CAAAF,EAAA,EAAAP,EAAA,EAAAU,EAAAZ,EAAAa,EAAA1C,EAAAqC,EAAArC,EAAA2C,KAAAd,EAAA,GAAA7B,EAAA,SAAA8B,EAAArB,GAAA,OAAAuB,EAAAF,EAAAG,EAAA,EAAAE,EAAAN,EAAAW,EAAAT,EAAAtB,EAAAiC,CAAA,YAAA1C,EAAAS,EAAAsB,GAAA,IAAAE,EAAAxB,EAAA0B,EAAAJ,EAAAD,EAAA,GAAAS,GAAAF,IAAAnC,GAAA4B,EAAAQ,EAAAjB,OAAAS,IAAA,KAAA5B,EAAA8B,EAAAM,EAAAR,GAAA9B,EAAAwC,EAAAF,EAAAM,EAAAZ,EAAA,GAAAvB,EAAA,GAAAP,EAAA0C,IAAAb,KAAAI,EAAAH,GAAAC,EAAAD,EAAA,OAAAC,EAAA,MAAAD,EAAA,GAAAA,EAAA,GAAAH,GAAAG,EAAA,IAAAhC,KAAAE,EAAAO,EAAA,GAAAT,EAAAgC,EAAA,KAAAC,EAAA,EAAAO,EAAAC,EAAAV,EAAAS,EAAAT,EAAAC,EAAA,IAAAhC,EAAA4C,IAAA1C,EAAAO,EAAA,GAAAuB,EAAA,GAAAD,GAAAA,EAAAa,KAAAZ,EAAA,GAAAvB,EAAAuB,EAAA,GAAAD,EAAAS,EAAAT,EAAAa,EAAAX,EAAA,OAAA/B,GAAAO,EAAA,SAAAiC,EAAA,MAAAH,GAAA,EAAAR,CAAA,iBAAA7B,EAAAoC,EAAAM,GAAA,GAAAP,EAAA,QAAAQ,UAAA,oCAAAN,GAAA,IAAAD,GAAAtC,EAAAsC,EAAAM,GAAAX,EAAAK,EAAAH,EAAAS,GAAAd,EAAAG,EAAA,EAAAJ,EAAAM,KAAAI,GAAA,CAAAP,IAAAC,EAAAA,EAAA,GAAAA,EAAA,IAAAO,EAAAT,GAAA,GAAA/B,EAAAiC,EAAAE,IAAAK,EAAAT,EAAAI,EAAAK,EAAAC,EAAAN,GAAA,OAAAE,EAAA,EAAAL,EAAA,IAAAC,IAAA/B,EAAA,QAAA4B,EAAAE,EAAA9B,GAAA,MAAA4B,EAAAA,EAAAtB,KAAAwB,EAAAG,IAAA,MAAAU,UAAA,wCAAAf,EAAAgB,KAAA,OAAAhB,EAAAK,EAAAL,EAAAnB,MAAAsB,EAAA,IAAAA,EAAA,YAAAA,IAAAH,EAAAE,EAAAe,SAAAjB,EAAAtB,KAAAwB,GAAAC,EAAA,IAAAE,EAAAU,UAAA,oCAAA3C,EAAA,YAAA+B,EAAA,GAAAD,EAAAH,CAAA,UAAAC,GAAAS,EAAAC,EAAAT,EAAA,GAAAI,EAAA1B,EAAAD,KAAAuB,EAAAS,MAAAE,EAAA,YAAAZ,GAAAE,EAAAH,EAAAI,EAAA,EAAAE,EAAAL,CAAA,SAAAO,EAAA,UAAA1B,MAAAmB,EAAAgB,KAAAP,EAAA,GAAA9B,EAAAP,EAAA8B,IAAA,GAAAG,CAAA,KAAAO,EAAA,YAAAR,IAAA,UAAAc,IAAA,UAAAC,IAAA,CAAAnB,EAAAvE,OAAA2F,eAAA,IAAAjB,EAAA,GAAAF,GAAAD,EAAAA,EAAA,GAAAC,QAAAK,GAAAN,EAAA,GAAAC,EAAA,yBAAAD,GAAAK,EAAAc,EAAAjF,UAAAkE,EAAAlE,UAAAT,OAAA6B,OAAA6C,GAAA,SAAAI,EAAAR,GAAA,OAAAtE,OAAA4F,eAAA5F,OAAA4F,eAAAtB,EAAAoB,IAAApB,EAAAuB,UAAAH,EAAAb,GAAAP,EAAA3B,EAAA,sBAAA2B,EAAA7D,UAAAT,OAAA6B,OAAA+C,GAAAN,CAAA,QAAAmB,EAAAhF,UAAAiF,EAAAb,GAAAD,EAAA,cAAAc,GAAAb,GAAAa,EAAA,cAAAD,GAAAA,EAAAK,YAAA,oBAAAjB,GAAAa,EAAA/C,EAAA,qBAAAkC,GAAAD,GAAAC,GAAAD,EAAAjC,EAAA,aAAAkC,GAAAD,EAAAJ,EAAA,yBAAAK,GAAAD,EAAA,oDAAAmB,GAAA,kBAAAC,EAAAvB,EAAAwB,EAAAnB,EAAA,cAAAD,GAAAP,EAAApB,EAAAsB,EAAAD,GAAA,IAAAE,EAAAzE,OAAA4C,eAAA,IAAA6B,EAAA,gBAAAH,GAAAG,EAAA,EAAAI,GAAA,SAAAP,EAAApB,EAAAsB,EAAAD,GAAA,SAAA5B,EAAAO,EAAAsB,GAAAK,GAAAP,EAAApB,EAAA,SAAAoB,GAAA,YAAA4B,QAAAhD,EAAAsB,EAAAF,EAAA,GAAApB,EAAAuB,EAAAA,EAAAH,EAAApB,EAAA,CAAAE,MAAAoB,EAAA3B,YAAA0B,EAAA4B,cAAA5B,EAAA6B,UAAA7B,IAAAD,EAAApB,GAAAsB,GAAA7B,EAAA,UAAAA,EAAA,WAAAA,EAAA,cAAAkC,GAAAP,EAAApB,EAAAsB,EAAAD,EAAA,UAAA8B,GAAA7B,EAAAD,EAAAD,EAAApB,EAAAP,EAAAwC,EAAAT,GAAA,QAAAD,EAAAD,EAAAW,GAAAT,GAAAE,EAAAH,EAAArB,KAAA,OAAAoB,GAAA,YAAAF,EAAAE,EAAA,CAAAC,EAAAc,KAAAhB,EAAAK,GAAA0B,QAAAC,QAAA3B,GAAA4B,KAAAtD,EAAAP,EAAA,UAAA0K,GAAA7I,GAAA,sBAAAD,EAAA,KAAAD,EAAAT,UAAA,WAAAyC,QAAA,SAAApD,EAAAP,GAAA,IAAAwC,EAAAX,EAAAN,MAAAK,EAAAD,GAAA,SAAA6E,EAAA3E,GAAA6B,GAAAlB,EAAAjC,EAAAP,EAAAwG,EAAAC,EAAA,OAAA5E,EAAA,UAAA4E,EAAA5E,GAAA6B,GAAAlB,EAAAjC,EAAAP,EAAAwG,EAAAC,EAAA,QAAA5E,EAAA,CAAA2E,OAAA,eAAA1C,GAAAnC,EAAApB,GAAA,QAAAqB,EAAA,EAAAA,EAAArB,EAAAY,OAAAS,IAAA,KAAA5B,EAAAO,EAAAqB,GAAA5B,EAAAE,WAAAF,EAAAE,aAAA,EAAAF,EAAAwD,cAAA,YAAAxD,IAAAA,EAAAyD,UAAA,GAAApG,OAAA4C,eAAA0B,EAAAoC,GAAA/D,EAAAzD,KAAAyD,EAAA,WAAA+D,GAAAnC,GAAA,IAAAE,EAAA,SAAAF,GAAA,aAAAoC,GAAApC,KAAAA,EAAA,OAAAA,EAAA,IAAAD,EAAAC,EAAA3F,OAAAgI,aAAA,YAAAtC,EAAA,KAAAG,EAAAH,EAAArB,KAAAsB,EAAArB,UAAA,aAAAyD,GAAAlC,GAAA,OAAAA,EAAA,UAAAa,UAAA,uDAAAuB,OAAAtC,EAAA,CAAAuC,CAAAvC,GAAA,gBAAAoC,GAAAlC,GAAAA,EAAAA,EAAA,YAAAsC,KAAA,QAAAxC,GAAAyC,QAAAvG,UAAAwG,QAAAhE,KAAAiE,QAAAC,UAAAH,QAAA,wBAAAzC,GAAA,QAAAwC,GAAA,mBAAAxC,CAAA,cAAA6C,GAAA7C,GAAA,OAAA6C,GAAApH,OAAA4F,eAAA5F,OAAA2F,eAAAP,OAAA,SAAAb,GAAA,OAAAA,EAAAsB,WAAA7F,OAAA2F,eAAApB,EAAA,EAAA6C,GAAA7C,EAAA,UAAA8C,GAAA9C,EAAAD,GAAA,OAAA+C,GAAArH,OAAA4F,eAAA5F,OAAA4F,eAAAR,OAAA,SAAAb,EAAAD,GAAA,OAAAC,EAAAsB,UAAAvB,EAAAC,CAAA,EAAA8C,GAAA9C,EAAAD,EAAA,CAWA,IA4BM0M,GAAW,SAAA1J,GAEf,SAAA0J,IAAyB,IAAAxJ,EAAbxI,EAAM6E,UAAAC,OAAA,QAAAvB,IAAAsB,UAAA,GAAAA,UAAA,GAAG,CAAC,EA0EyB,OAnHjD,SAAAsB,EAAAX,GAAA,KAAAW,aAAAX,GAAA,UAAAc,UAAA,qCAyCyBhC,CAAA,KAAA0N,IAErBxJ,EA3CJ,SAAAjD,EAAA5B,EAAA2B,GAAA,OAAA3B,EAAAyE,GAAAzE,GAAA,SAAA4B,EAAAD,GAAA,GAAAA,IAAA,UAAAqC,GAAArC,IAAA,mBAAAA,GAAA,OAAAA,EAAA,YAAAA,EAAA,UAAAgB,UAAA,4EAAAhB,GAAA,YAAAA,EAAA,UAAAmD,eAAA,oEAAAnD,CAAA,CAAAoD,CAAAnD,EAAA,CAAAoD,CAAApD,EAAAwC,KAAAG,QAAAC,UAAAxE,EAAA2B,GAAA,GAAA8C,GAAA7C,GAAAtD,aAAA0B,EAAAuB,MAAAK,EAAAD,GAAA,CA2CIsD,CAAA,KAAAoJ,IAIKhS,OAASA,EAEdwI,EAAKgG,aAAe,KAEpBhG,EAAKyJ,WAAa,GAElBzJ,EAAK0J,WAAY,EAEjB1J,EAAK2J,mBAAoB,EAEzB3J,EAAK4J,cAAgB,KAErB5J,EAAK4Q,aAAe,KAIpB5Q,EAAK6Q,cAAgB,EAErB7Q,EAAK8Q,iBAAmB,EAGxB9Q,EAAK+Q,iBAAmB,IAAItQ,IAG5BT,EAAKgR,cAAgB,GAGrBhR,EAAKiR,eAAiB,GAEtBjR,EAAKkR,sBAAuB,EAE5BlR,EAAKmR,oBAAqB,EAK1BnR,EAAKoR,sBAAwB,IAM7BpR,EAAKqR,OAAS,CAEZC,IAAK,IAAIlC,GAETS,KAAM,IAAIP,GAEVkB,KAAM,IAAIH,IAQZrQ,EAAKuR,qBAAuB,CAAC,MAAO,OAEpCvR,EAAKwR,oBAAsB,CAAC,MAAO,OAAQ,QAE3CxR,EAAKyR,uBAAyB,CAAC,IAAM,KAAO,MAAO,KAAO,MAAO,MAEjEzR,EAAK0R,qBAAuB,CAAC,EAAG,GAAI,IAEpC1R,EAAK2R,mBAAqB,CAAC,GAI3B/U,QAAQkS,IAAI,iCAAiC9O,CAE/C,CAIA,OAzHF,SAAAjD,EAAAD,GAAA,sBAAAA,GAAA,OAAAA,EAAA,UAAAgB,UAAA,sDAAAf,EAAA9D,UAAAT,OAAA6B,OAAAyC,GAAAA,EAAA7D,UAAA,CAAAQ,YAAA,CAAAmC,MAAAmB,EAAA6B,UAAA,EAAAD,cAAA,KAAAnG,OAAA4C,eAAA2B,EAAA,aAAA6B,UAAA,IAAA9B,GAAA+C,GAAA9C,EAAAD,EAAA,CAyHE4D,CAAA8I,EAAA1J,GAzHFhD,EAyHE0M,EAzHF9N,EAyHE,EAAAhE,IAAA,kBAAAkE,MAkBA,SAAgBgW,GAAQ,IAAAC,EAEjBhZ,KAAKiZ,eAAeF,KAEvBhV,QAAQwI,KAAK,kDAAmDwM,GAEhEA,EAAS/Y,KAAKkZ,oBAMhB,IAAMC,EAAiC,QAApBH,EAAGhZ,KAAK+X,oBAAY,IAAAiB,OAAA,EAAjBA,EAAmBjK,WAEnCqK,EAAgBL,EAAOhK,WAI7B/O,KAAK+X,aAAegB,EAEpBhV,QAAQkS,IAAI,gCAAiC8C,GAMzC/Y,KAAKmN,cAAgBgM,GAAiBA,IAAkBC,IAE1DrV,QAAQwI,KAAK,gEAEbxI,QAAQwI,KAAK,WAADvI,OAAYmV,EAAa,cAAAnV,OAAaoV,EAAa,OAM/DpZ,KAAKmS,gBAM2B,WAA5BnS,KAAKmN,aAAamC,OAEpBtP,KAAKmN,aAAa5D,QAIpBvJ,KAAKmN,aAAe,KAIpBpJ,QAAQkS,IAAI,kFAIhB,GAIA,CAAApX,IAAA,iBAAAkE,MAMA,SAAegW,GAAQ,IAAAM,EAAAC,EAErB,IAAKP,EAAQ,OAAO,EAIpB,IAAMQ,EAA4B,QAAnBF,EAAGN,EAAOQ,iBAAS,IAAAF,OAAA,EAAhBA,EAAkBG,cAE9BC,EAA0B,QAAlBH,EAAGP,EAAOU,gBAAQ,IAAAH,OAAA,EAAfA,EAAiBE,cAIlC,OAEED,GAEAE,GAEAzZ,KAAK0Y,qBAAqBvK,SAASoL,IAEnCvZ,KAAK2Y,oBAAoBxK,SAASsL,IAElCzZ,KAAK4Y,uBAAuBzK,SAAS4K,EAAOhK,aAE5C/O,KAAK6Y,qBAAqB1K,SAAS4K,EAAOW,aAExCX,EAAOY,UAAY3Z,KAAK8Y,mBAAmB3K,SAAS4K,EAAOY,UAIjE,GAIA,CAAA9a,IAAA,mBAAAkE,MAMA,WAEE,MAAO,CAELwW,UAAW,MAEXE,SAAU,MAEV1K,WAAY,KAEZ4K,SAAU,EAEVD,SAAU,GAId,GAIA,CAAA7a,IAAA,YAAAkE,MAQA,SAAU6W,GAAY,IAAA1R,EAAA,KAEpB,IAEE,IAAM+I,EAAYjR,KAAKkR,gBAAgB0I,GAEvC5Z,KAAK4Q,WAAWxN,KAAK6N,GAMhBjR,KAAK6Q,WAAc7Q,KAAK8Q,mBAAsB9Q,KAAK+Q,eAEtDxI,WAAW,kBAAML,EAAKiJ,cAAc,EAAE,GAI1C,CAAE,MAAOrN,GAEPC,QAAQD,MAAM,oCAAqCA,GAEnD9D,KAAK4I,KAAK,gBAAiB9E,EAE7B,CAEF,GAIA,CAAAjF,IAAA,YAAAkE,OAAA8W,EAAA7M,GAAAtH,KAAAE,EAgBA,SAAAkC,EAAgB0O,GAAO,IAAAsD,EAAAC,EAAAtO,EAAA,YAAA/F,KAAAC,EAAA,SAAAwC,GAAA,cAAAA,EAAAhE,GAAA,QAGf2V,EAAgB9Z,KAAKga,aAAaxD,KAMtCxW,KAAKoY,eAAehV,KAAK0W,GAQpB9Z,KAAKsY,mBAYR2B,sBAAsB,WAEhBxO,EAAK2M,eAAe3U,OAAS,IAAMgI,EAAK6M,oBAE1C7M,EAAKyO,wBAIT,GAhBAla,KAAKka,yBAwBHla,KAAKmY,cAAc1U,OAAS,IAAMzD,KAAKqY,sBAEzCrY,KAAKma,oBAOPpW,QAAQD,MAAM,gEACdC,QAAQD,MAAM,sBAAsB0S,aAAO,EAAPA,EAAS4D,aAAc,aAC3DrW,QAAQD,MAAM,mBAAoB9D,KAAK+X,cACvChU,QAAQD,MAAM,mBAAoB9D,KAAKmN,aAAe,cAAgB,mBACtEpJ,QAAQD,MAAM,0BAA2C,QAAjBiW,EAAA/Z,KAAKmN,oBAAY,IAAA4M,OAAA,EAAjBA,EAAmBzK,QAAS,OAGpEtP,KAAK4I,KAAK,gBAAiB,IAAInI,MAAM,8CACtC,cAAA0H,EAAArD,EAAA,KAAAgD,EAAA,SAEF,SAhEckB,GAAA,OAAA6Q,EAAAhW,MAAC,KAADL,UAAA,IAoEf,CAAA3E,IAAA,eAAAkE,MAYA,SAAayT,GAEX,IAAI,IAAA6D,EAGF,IAAKra,KAAK+X,aAGR,OAFAhU,QAAQD,MAAM,8DACdC,QAAQD,MAAM,yDACP,KAaT,GARK9D,KAAKmN,cAERnN,KAAKsa,0BAMFta,KAAKmN,aAIR,OAFApJ,QAAQD,MAAM,oEAEP,KAQT,IAAIyW,EAAgB/D,EAEpB,GAAIA,EAAQ4D,WAAa,GAAM,EAAG,CAEhCrW,QAAQwI,KAAK,kCAAmCiK,EAAQ4D,YAExD,IAAMI,EAAS,IAAInJ,WAAWmF,EAAQ4D,WAAa,GAEnDI,EAAOnS,IAAI,IAAIgJ,WAAWmF,GAAU,GAEpCgE,EAAOhE,EAAQ4D,YAAc,EAE7BG,EAAgBC,EAAO1I,MAEzB,CAcA,IARA,IAAM2I,EAAa,IAAI5D,WAAW0D,GAE5BG,EAAe,IAAIC,aAAaF,EAAWhX,QAE3CmX,EAAgB,EAAM,MAEtBnX,EAASgX,EAAWhX,OAEjBW,EAAI,EAAGA,EAAIX,EAAQW,IAE1BsW,EAAatW,GAAKqW,EAAWrW,GAAKwW,EAQpC,IAAMC,GAAuC,QAAjBR,EAAAra,KAAK+X,oBAAY,IAAAsC,OAAA,EAAjBA,EAAmBtL,aAAc/O,KAAKmN,aAAa4B,WAEzE+L,EAAoB9a,KAAKmN,aAAa4B,WAItCyC,EAAcxR,KAAKmN,aAAa4N,aAEpC,EAEAL,EAAajX,OAEboX,GAMFrJ,EAAYwJ,eAAe,GAAG3S,IAAIqS,GAIlC,IAAMO,EAAgBzJ,EAAY0J,SAE5BC,EAAcT,EAAajX,OAE7B2X,EAAiBH,EAcrB,OAVIH,IAAsBD,IAExBO,EAAiBD,EAAcL,GAQ1B,CAELhJ,OAAQN,EAER0J,SAAUE,EAEVrM,WAAY8L,EAEZC,kBAAmBA,EAMvB,CAAE,MAAOhX,GAIP,OAFAC,QAAQD,MAAM,wCAAyCA,GAEhD,IAET,CAEF,GAEA,CAAAjF,IAAA,eAAAkE,MAMA,SAAayO,GAGX,OAAOA,CACT,GAIA,CAAA3S,IAAA,yBAAAkE,OAAAsY,EAAArO,GAAAtH,KAAAE,EAQA,SAAAwK,IAAA,IAAAkL,EAAAC,EAAAC,EAAA9M,EAAAjC,EAAA,YAAA/G,KAAAC,EAAA,SAAAsP,GAAA,cAAAA,EAAAvQ,EAAAuQ,EAAA9Q,GAAA,WAEMnE,KAAKsY,mBAAoB,CAAFrD,EAAA9Q,EAAA,eAAA8Q,EAAAnQ,EAAA,UA6BzB,GArBF9E,KAAKsY,oBAAqB,EAKtBgD,EAAwB,EAAGrG,EAAAvQ,EAAA,EAQxB1E,KAAKmN,cAERnN,KAAKsa,yBAQyB,cAA5Bta,KAAKmN,aAAamC,MAAqB,CAAA2F,EAAA9Q,EAAA,eAAA8Q,EAAA9Q,EAAA,EAEnCnE,KAAKmN,aAAaoC,SAAQ,OAS9BgM,EAAiB,EAACC,EAAA9V,KAAAE,EAAA,SAAA4V,IAAA,IAAA1B,EAAApI,EAAA+J,EAAAC,EAAAC,EAAA,OAAAjW,KAAAC,EAAA,SAAA2K,GAAA,cAAAA,EAAAnM,GAAA,OAK6B,GAA3C2V,EAAgBrN,EAAK2L,eAAezG,QAEtB,CAAFrB,EAAAnM,EAAA,eAAAmM,EAAAxL,EAAA,aAUZ4M,EAASjF,EAAKU,aAAa0E,sBAE1BC,OAASgI,EAAchI,OAE9BJ,EAAO7B,QAAQpD,EAAKU,aAAa4E,aAMjCtF,EAAKyL,iBAAiB1P,IAAIkJ,GAMpB+J,EAAchP,EAAKU,aAAasO,YAMR,IAA1BhP,EAAKwL,kBAGHxL,EAAKuL,cAAgByD,IAEvBhP,EAAKuL,cAAgByD,EAAchP,EAAK8L,uBAI1CxU,QAAQkS,IAAI,2CAA4CxJ,EAAKuL,iBAMvD0D,EAAeD,EAAchP,EAAK8L,sBAExC9L,EAAKuL,cAAgB7O,KAAKC,IAAIqD,EAAKuL,cAAe0D,IAQpDhK,EAAOO,MAAMxF,EAAKuL,eAOlBvL,EAAKuL,eAAiB8B,EAAcoB,SAMpCzO,EAAKuL,cAAgB7O,KAAKyS,MAA2B,IAArBnP,EAAKuL,eAA2B,IAM5DvL,EAAKwL,iBAAmB,IAEpB0D,EAAYlP,EAAKuL,cAAgB8B,EAAcoB,SAErDnX,QAAQkS,IAAI,4CAADjS,OAA6CyI,EAAKwL,iBAAmB,EAAC,QAAAjU,OAAO2X,EAAUE,QAAQ,GAAE,eAAA7X,OAAcyI,EAAKuL,cAAc6D,QAAQ,GAAE,MAEvJ9X,QAAQkS,IAAI,gBAADjS,OAAiB8V,EAAcoB,SAASW,QAAQ,GAAE,OAAA7X,QAAgC,IAAzB8V,EAAcoB,UAAiBW,QAAQ,GAAE,0BAAA7X,OAAyByI,EAAKwL,oBAM7IxL,EAAKwL,mBACLsD,IAMA7J,EAAOM,QAAU,WAIfvF,EAAKyL,iBAAiBvP,OAAO+I,GAI7BjF,EAAKwL,mBAMyB,IAA1BxL,EAAKwL,kBAAyD,IAA/BxL,EAAK2L,eAAe3U,QAA8C,IAA9BgJ,EAAK0L,cAAc1U,QAExFgJ,EAAKoE,WAAY,EAEjBpE,EAAK6L,oBAAqB,EAE1BvU,QAAQkS,IAAI,yEAEZxJ,EAAK7D,KAAK,oBAED6D,EAAK2L,eAAe3U,OAAS,GAMtC8E,WAAW,WAELkE,EAAK2L,eAAe3U,OAAS,IAAMgJ,EAAK6L,oBAE1C7L,EAAKyN,wBAIT,EAAG,EAIP,EAIKzN,EAAKoE,YAERpE,EAAKoE,WAAY,EAEjB9M,QAAQkS,IAAI,kDAEZxJ,EAAK7D,KAAK,oBAEX,cAAA0H,EAAAxL,EAAA,KAAA0W,EAAA,eA3JIxb,KAAKoY,eAAe3U,OAAS,GAAK8X,EAAiBD,GAAqB,CAAArG,EAAA9Q,EAAA,eAAA8Q,EAAA7S,EAAA0Z,GAAAN,KAAA,cAAAvG,EAAApQ,EAAE,CAAFoQ,EAAA9Q,EAAA,eAAA8Q,EAAAnQ,EAAA,YAAAmQ,EAAA9Q,EAAA,eAmK/EnE,KAAKsY,oBAAqB,EAQtBtY,KAAKoY,eAAe3U,OAAS,EAI/BwW,sBAAsB,WAEhBxN,EAAK2L,eAAe3U,OAAS,IAAMgJ,EAAK6L,oBAE1C7L,EAAKyN,wBAIT,GAESla,KAAKiY,iBAAmB,GAQjC1P,WAAW,WAELkE,EAAK2L,eAAe3U,OAAS,IAAMgJ,EAAK6L,oBAAsB7L,EAAKwL,iBAAmB,GAExFxL,EAAKyN,wBAIT,EAAG,IAEJjF,EAAA9Q,EAAA,eAAA8Q,EAAAvQ,EAAA,EAAAgK,EAAAuG,EAAApQ,EAMDd,QAAQD,MAAM,6CAA4C4K,GAE1D1O,KAAK4I,KAAK,gBAAe8F,GAEzB1O,KAAKsY,oBAAqB,EAAM,cAAArD,EAAAnQ,EAAA,KAAAsL,EAAA,iBAInC,WAtQ2B,OAAAiL,EAAAxX,MAAC,KAADL,UAAA,IA0Q5B,CAAA3E,IAAA,kBAAAkE,OAAAgZ,EAAA/O,GAAAtH,KAAAE,EAQA,SAAAoP,IAAA,IAAAgH,EAAAC,EAAAzF,EAAA+D,EAAAC,EAAAC,EAAAC,EAAAE,EAAAnX,EAAAW,EAAAyW,EAAAC,EAAAtJ,EAAAE,EAAA+J,EAAAR,EAAAE,EAAAC,EAAAO,EAAAtL,EAAA6L,EAAA,YAAAxW,KAAAC,EAAA,SAAA2P,GAAA,cAAAA,EAAA5Q,EAAA4Q,EAAAnR,GAAA,WAEMnE,KAAKqY,qBAAsB,CAAF/C,EAAAnR,EAAA,eAAAmR,EAAAxQ,EAAA,UAsB3B,GAhBF9E,KAAKqY,sBAAuB,EAAK/C,EAAA5Q,EAAA,EAQ1B1E,KAAKmN,cAERnN,KAAKsa,yBAQyB,cAA5Bta,KAAKmN,aAAamC,MAAqB,CAAAgG,EAAAnR,EAAA,eAAAmR,EAAAnR,EAAA,EAEnCnE,KAAKmN,aAAaoC,SAAQ,YAO3BvP,KAAKmY,cAAc1U,OAAS,GAAC,CAAA6R,EAAAnR,EAAA,QACQ,GAApCqS,EAAUxW,KAAKmY,cAAcxG,QAErB,CAAF2D,EAAAnR,EAAA,eAAAmR,EAAAxQ,EAAA,YAoBZ,IAfIyV,EAAgB/D,EAEhBA,EAAQ4D,WAAa,GAAM,IAC7BrW,QAAQwI,KAAK,kCAAmCiK,EAAQ4D,aAClDI,EAAS,IAAInJ,WAAWmF,EAAQ4D,WAAa,IAC5C/R,IAAI,IAAIgJ,WAAWmF,GAAU,GACpCgE,EAAOhE,EAAQ4D,YAAc,EAC7BG,EAAgBC,EAAO1I,QAInB2I,EAAa,IAAI5D,WAAW0D,GAC5BG,EAAe,IAAIC,aAAaF,EAAWhX,QAC3CmX,EAAgB,EAAM,MACtBnX,EAASgX,EAAWhX,OACjBW,EAAI,EAAGA,EAAIX,EAAQW,IAC1BsW,EAAatW,GAAKqW,EAAWrW,GAAKwW,EAI9BC,GAAuC,QAAjBmB,EAAAhc,KAAK+X,oBAAY,IAAAiE,OAAA,EAAjBA,EAAmBjN,aAAc/O,KAAKmN,aAAa4B,WACzE+L,EAAoB9a,KAAKmN,aAAa4B,WAEtB,QAAlBkN,EAACjc,KAAK+X,oBAAY,IAAAkE,GAAjBA,EAAmBlN,WAEb/O,KAAKiY,iBAAmB,GACjClU,QAAQkS,IAAI,sCAADjS,OAAuC6W,EAAmB,sBAAA7W,OAAqB8W,EAAiB,QAF3G/W,QAAQwI,KAAK,mFAAoFuO,IAK7FtJ,EAAcxR,KAAKmN,aAAa4N,aACpC,EACAL,EAAajX,OACboX,IAGUG,eAAe,GAAG3S,IAAIqS,IAG5BhJ,EAAS1R,KAAKmN,aAAa0E,sBAC1BC,OAASN,EAChBE,EAAO7B,QAAQ7P,KAAKmN,aAAa4E,aAG3B0J,EAAczb,KAAKmN,aAAasO,YAGlCzb,KAAKgY,cAAgByD,IACvBzb,KAAKgY,cAAgByD,EACS,IAA1Bzb,KAAKiY,kBACPlU,QAAQkS,IAAI,wCAAyCwF,IAKnDR,EAAgBzJ,EAAY0J,SAC5BC,EAAcT,EAAajX,OAC7B2X,EAAiBH,EAEjBH,IAAsBD,IACxBO,EAAiBD,EAAcL,EAE3B9a,KAAKiY,iBAAmB,IAC1BlU,QAAQkS,IAAI,2BAADjS,OAA4B6W,EAAmB,SAAA7W,OAAQ8W,EAAiB,OACnF/W,QAAQkS,IAAI,uBAADjS,OAAwBiX,EAAcY,QAAQ,GAAE,mBAAA7X,OAAkBoX,EAAeS,QAAQ,GAAE,QAK1GnK,EAAOO,MAAMjS,KAAKgY,eAGlBhY,KAAKgY,eAAiBoD,EAGtBpb,KAAKgY,cAAgB7O,KAAKyS,MAA2B,IAArB5b,KAAKgY,eAA2B,IAG5DhY,KAAKiY,iBAAmB,IACpB0D,EAAY3b,KAAKgY,cAAgBoD,EACvCrX,QAAQkS,IAAI,mCAADjS,OAAoChE,KAAKiY,iBAAmB,EAAC,QAAAjU,OAAO2X,EAAUE,QAAQ,GAAE,eAAA7X,OAAchE,KAAKgY,cAAc6D,QAAQ,GAAE,MAC9I9X,QAAQkS,IAAI,gBAADjS,OAAiBoX,EAAeS,QAAQ,GAAE,OAAA7X,QAAwB,IAAjBoX,GAAuBS,QAAQ,GAAE,SAG/F7b,KAAKiY,mBAGLvG,EAAOM,QAAU,WACfkK,EAAKjE,mBAGyB,IAA1BiE,EAAKjE,kBAAwD,IAA9BiE,EAAK/D,cAAc1U,SACpDyY,EAAKrL,WAAY,EACjBqL,EAAK7D,sBAAuB,EAC5B6D,EAAKtT,KAAK,mBAEd,EAEK5I,KAAK6Q,YACR7Q,KAAK6Q,WAAY,EACjB7Q,KAAK4I,KAAK,oBACX0M,EAAAnR,EAAA,eAIHnE,KAAKqY,sBAAuB,EAAM/C,EAAAnR,EAAA,eAAAmR,EAAA5Q,EAAA,EAAA2L,EAAAiF,EAAAzQ,EAIlCd,QAAQD,MAAM,yCAAwCuM,GAEtDrQ,KAAK4I,KAAK,gBAAeyH,GAEzBrQ,KAAKqY,sBAAuB,EAAM,cAAA/C,EAAAxQ,EAAA,KAAAkQ,EAAA,iBAIrC,WA/JoB,OAAA+G,EAAAlY,MAAC,KAADL,UAAA,IAmKrB,CAAA3E,IAAA,kBAAAkE,MAQA,SAAgBoZ,GAEd,IAAMC,EAAQ,IAAI/K,WAAW8K,GAI7BpY,QAAQkS,IAAI,8BAADjS,OAA+BoY,EAAM3Y,OAAM,WAEtDM,QAAQkS,IAAI,qCAAsCjW,KAAK+X,cAQvD,IAAMsE,EAAkBrc,KAAK+X,cACN/X,KAAK+X,aAAawB,WAC4B,QAA9CvZ,KAAK+X,aAAawB,UAAUC,cAE7C8C,EAAkBtc,KAAK+X,cACL/X,KAAK+X,aAAawB,WAC4B,QAA9CvZ,KAAK+X,aAAawB,UAAUC,cAG9C+C,EAAevc,KAAKwc,UAAUJ,GAWpC,GATIG,GACFxY,QAAQkS,IAAI,8CAQVqG,GAAmBC,EAQrB,OANAxY,QAAQD,MAAM,qCACdC,QAAQD,MAAM,6BACdC,QAAQD,MAAM,8CACdC,QAAQD,MAAM,iEACdC,QAAQwI,KAAK,mGAENvM,KAAKyc,cAAcL,GAG5B,GAAIE,IAAoBC,EAEtBxY,QAAQkS,IAAI,8DAEP,IAAIoG,GAAmBE,EAG5B,OADAxY,QAAQkS,IAAI,+DACLjW,KAAKyc,cAAcL,GACrB,GAAIC,IAAoBE,EAG7B,OADAxY,QAAQwI,KAAK,+FACNvM,KAAKyc,cAAcL,GACrB,IAAKpc,KAAK+X,cAAgBwE,EAG/B,OADAxY,QAAQkS,IAAI,4DACLjW,KAAKyc,cAAcL,GAChBpc,KAAK+X,cAAiBwE,IAEhCxY,QAAQwI,KAAK,yEACbvM,KAAK+X,aAAe/X,KAAKkZ,mBAC3B,CAgBA,OAZKlZ,KAAK+X,eAERhU,QAAQwI,KAAK,iDAEbvM,KAAK+X,aAAe/X,KAAKkZ,oBAM3BnV,QAAQkS,IAAI,wDAAyDjW,KAAK+X,aAAa0B,UAEhFzZ,KAAK0c,cAAcN,EAE5B,GAIA,CAAAvd,IAAA,YAAAkE,MAMA,SAAUqZ,GAER,OAAOA,EAAM3Y,QAAU,IAEH,KAAb2Y,EAAM,IAA4B,KAAbA,EAAM,IAEd,KAAbA,EAAM,IAA4B,KAAbA,EAAM,EAEpC,GAIA,CAAAvd,IAAA,gBAAAkE,MAMA,SAAcqZ,GAEZ,IAAMO,EAAU3c,KAAK4c,eAAeR,GAsBpC,GAlBArY,QAAQkS,IAAI,wBAAyB,CAEnC8C,OAAQ4D,EAAQE,YAEhBpD,SAAUzZ,KAAK8c,gBAAgBH,EAAQE,aAEvC9N,WAAY4N,EAAQ5N,WAEpB4K,SAAUgD,EAAQhD,SAElBD,SAAUiD,EAAQI,gBAQQ,IAAxBJ,EAAQE,YAIV,OAFA9Y,QAAQkS,IAAI,8BAEL,IAAItJ,KAAK,CAACyP,GAAQ,CAAE1d,KAAM,cAQnC,IAAMse,EAAQhd,KAAKid,qBAAqBN,EAAQE,aAEhD,IAAKG,EAEH,MAAM,IAAIvc,MAAM,gCAADuD,OAAiC2Y,EAAQE,cAM1D9Y,QAAQkS,IAAI,0CAMZ,IAAMkG,EAAUC,EAAM5O,MAAM,IAMtBoJ,EAAQoG,EAAME,OAAOf,GAMrBgB,EAAYnd,KAAKod,gBAErBxG,EAAMwD,WAENuC,EAAQ5N,WAER4N,EAAQhD,SAER,IAMF,OAAO,IAAIhN,KAAK,CAACwQ,EAAWvG,GAAQ,CAAElY,KAAM,aAE9C,GAIA,CAAAG,IAAA,gBAAAkE,MAMA,SAAcqZ,GAEZ,IAsBI5F,EAEA6G,EAxBE5D,EAAWzZ,KAAK+X,aAAa0B,SAASD,cAEtCwD,EAAQhd,KAAKsd,SAAS7D,GAI5B,IAAKuD,EAEH,MAAM,IAAIvc,MAAM,gCAADuD,OAAiCyV,IAoBlD,GAdA1V,QAAQkS,IAAI,4BAADjS,OAA6ByV,EAAS8D,cAAa,YAE9DxZ,QAAQkS,IAAI,4CAADjS,OAA6ChE,KAAK+X,aAAa2B,SAAQ,kBAAA1V,OAAiBhE,KAAK+X,aAAahJ,aAYpG,QAAb0K,EAAoB,CAGtB,IAAMC,EAAW1Z,KAAK+X,aAAa2B,UAAY,GAI7B0C,EAAM3Y,OAEP,KAAbiW,GAGF3V,QAAQwI,KAAK,2EACbxI,QAAQwI,KAAK,yFACbiK,EAAUxW,KAAKwd,oBAAoBpB,GACnCiB,EAAiB,IACK,IAAb3D,GAET3V,QAAQkS,IAAI,sDACZO,EAAUxW,KAAKyd,mBAAmBrB,GAClCiB,EAAiB,KAGjB7G,EAAU4F,EAAMtK,OAChBuL,EAAiB3D,EACjB3V,QAAQkS,IAAI,+BAADjS,OAAgC0V,EAAQ,oCAKvD,MAIElD,EAAUwG,EAAME,OAAOd,GAEvBiB,EAAiB,GAEjBtZ,QAAQkS,IAAI,2BAADjS,OAA4ByV,EAAS8D,cAAa,mBAU/D,IAAMJ,EAAYnd,KAAKod,gBAErB5G,EAAQ4D,WAERpa,KAAK+X,aAAahJ,WAElB/O,KAAK+X,aAAa4B,SAElB0D,GAMF,OAAO,IAAI1Q,KAAK,CAACwQ,EAAW3G,GAAU,CAAE9X,KAAM,aAEhD,GAIA,CAAAG,IAAA,sBAAAkE,MAUA,SAAoBqZ,GAQlB,IANA,IAAMsB,EAAUvU,KAAKwU,MAAMvB,EAAM3Y,OAAS,GAEpCmT,EAAQ,IAAIC,WAAW6G,GAIpBtZ,EAAI,EAAGA,EAAIsZ,EAAStZ,IAAK,CAIhC,IAAMwZ,EAAQxB,EAAU,EAAJhY,GACdyZ,EAAQzB,EAAU,EAAJhY,EAAQ,GACtB0Z,EAAQ1B,EAAU,EAAJhY,EAAQ,GAMxB2Z,EAAUH,EAASC,GAAS,GAAe,IAARC,IAAiB,GAM5C,IAARA,IAGFC,GAAoB,YAWtBnH,EAAMxS,GAAK+E,KAAKC,KAAK,MAAOD,KAAK6U,IAAI,MAAO7U,KAAKyS,MAAMmC,EAAU,MAEnE,CAIA,OAAOnH,EAAM9E,MAEf,GAIA,CAAAjT,IAAA,qBAAAkE,MAUA,SAAmBqZ,GAQjB,IANA,IAAMsB,EAAUtB,EAAM3Y,OAEhBmT,EAAQ,IAAIC,WAAW6G,GAIpBtZ,EAAI,EAAGA,EAAIsZ,EAAStZ,IAAK,CAMhC,IAAM6Z,EAAS7B,EAAMhY,GAErBwS,EAAMxS,GAAsB,KAAhB6Z,EAAS,IAEvB,CAIA,OAAOrH,EAAM9E,MAEf,GAIA,CAAAjT,IAAA,WAAAkE,MAMA,SAAS0W,GAIP,IAAMyE,EAAa,CAEjB,IAAO,MAEP,OAAU,MAEV,IAAO,MAEP,KAAQ,OAER,KAAQ,OAER,MAAS,OAET,MAAS,OAET,KAAQ,OAER,KAAQ,OAER,MAAS,QAETzE,EAASD,eAIX,OAAOxZ,KAAKwY,OAAO0F,EAErB,GAIA,CAAArf,IAAA,uBAAAkE,MAMA,SAAqB8Z,GAEnB,OAAQA,GAEN,KAAK,EAAG,OAAO7c,KAAKwY,OAAOC,IAE3B,KAAK,EAAG,OAAOzY,KAAKwY,OAAOb,KAE3B,KAAK,EAAG,OAAO3X,KAAKwY,OAAOxB,KAE3B,QAAS,OAAO,KAIpB,GAIA,CAAAnY,IAAA,kBAAAkE,MAMA,SAAgB8Z,GAEd,OAAQA,GAEN,KAAK,EAAG,MAAO,MAEf,KAAK,EAAG,MAAO,QAEf,KAAK,EAAG,MAAO,QAEf,QAAS,MAAO,YAAP7Y,OAAmB6Y,EAAW,KAI3C,GAIA,CAAAhe,IAAA,iBAAAkE,MAMA,SAAeqZ,GAEb,IAAM+B,EAAO,IAAIC,SAAShC,EAAMtK,OAAQsK,EAAMiC,WAAYjC,EAAMhC,YAIhE,MAAO,CAELyC,YAAasB,EAAKG,UAAU,IAAI,GAEhC3E,SAAUwE,EAAKG,UAAU,IAAI,GAE7BvP,WAAYoP,EAAKI,UAAU,IAAI,GAE/BC,SAAUL,EAAKI,UAAU,IAAI,GAE7BE,WAAYN,EAAKG,UAAU,IAAI,GAE/BvB,cAAeoB,EAAKG,UAAU,IAAI,GAItC,GAIA,CAAAzf,IAAA,kBAAAkE,MAMA,SAAgB2b,EAAY3P,EAAY4P,EAAa5B,GAEnD,IAAM6B,EAAS,IAAIlS,YAAY,IAEzByR,EAAO,IAAIC,SAASQ,GA0C1B,OApCAT,EAAKU,UAAU,EAAG,YAAY,GAE9BV,EAAKU,UAAU,EAAG,GAAKH,GAAY,GAEnCP,EAAKU,UAAU,EAAG,YAAY,GAM9BV,EAAKU,UAAU,GAAI,YAAY,GAE/BV,EAAKU,UAAU,GAAI,IAAI,GAEvBV,EAAKW,UAAU,GAAI,GAAG,GAEtBX,EAAKW,UAAU,GAAIH,GAAa,GAEhCR,EAAKU,UAAU,GAAI9P,GAAY,GAE/BoP,EAAKU,UAAU,GAAI9P,EAAa4P,EAAc5B,EAAgB,GAAG,GAEjEoB,EAAKW,UAAU,GAAIH,EAAc5B,EAAgB,GAAG,GAEpDoB,EAAKW,UAAU,GAAI/B,GAAe,GAMlCoB,EAAKU,UAAU,GAAI,YAAY,GAE/BV,EAAKU,UAAU,GAAIH,GAAY,GAIxBE,CAET,GAIA,CAAA/f,IAAA,yBAAAkE,MAMA,WAAyB,IAAAgc,EAAAC,EAGnBC,GAAqC,QAAjBF,EAAA/e,KAAK+X,oBAAY,IAAAgH,OAAA,EAAjBA,EAAmBhQ,aAAc,KAYzD,GAR0B,OAAtBkQ,GAAqD,QAAtBA,IAGjClb,QAAQkS,IAAI,qCAADjS,OAAsCib,EAAiB,0CAClElb,QAAQkS,IAAI,sFAIVjW,KAAKmN,aAAc,CACrB,IAAM+R,EAAoBlf,KAAKmN,aAAa4B,WAE5C,KAAI5F,KAAKgW,IAAID,EAAoBD,GAAqB,KASpD,OARAlb,QAAQwI,KAAK,6CAADvI,OAA8Ckb,EAAiB,8BAAAlb,OAA6Bib,EAAiB,uBACzHjf,KAAKmS,gBAC2B,WAA5BnS,KAAKmN,aAAamC,OACpBtP,KAAKmN,aAAa5D,QAEpBvJ,KAAKmN,aAAe,IAKxB,CAEApJ,QAAQkS,IAAI,4CAADjS,OAA6Cib,EAAiB,2BAAAjb,QAA2C,QAAjBgb,EAAAhf,KAAK+X,oBAAY,IAAAiH,OAAA,EAAjBA,EAAmBjQ,aAAc,UAAS,MAE7I,IAEE/O,KAAKmN,aAAe,IAAK9O,OAAO+Q,cAAgB/Q,OAAOgR,oBAAoB,CACzEN,WAAYkQ,EACZG,YAAa,aAGfrb,QAAQkS,IAAI,6BAADjS,OAA8BhE,KAAKmN,aAAa4B,WAAU,mBAAA/K,OAAkBib,EAAiB,QAGpG9V,KAAKgW,IAAInf,KAAKmN,aAAa4B,WAAakQ,GAAqB,KAC/Dlb,QAAQD,MAAM,6CACdC,QAAQD,MAAM,iBAADE,OAAkBib,EAAiB,OAChDlb,QAAQD,MAAM,WAADE,OAAYhE,KAAKmN,aAAa4B,WAAU,OACrDhL,QAAQD,MAAM,8CACdC,QAAQD,MAAM,oCAADE,OAAqChE,KAAKmN,aAAa4B,WAAU,sBACrE/O,KAAKmN,aAAa4B,aAAekQ,IAC1Clb,QAAQwI,KAAK,oCAADvI,OAAqCib,EAAiB,SAAAjb,OAAQhE,KAAKmN,aAAa4B,WAAU,OACtGhL,QAAQwI,KAAK,iDAEjB,CAAE,MAAOzI,GAEPC,QAAQD,MAAM,mCAAoCA,GAClD9D,KAAKmN,aAAe,IAAK9O,OAAO+Q,cAAgB/Q,OAAOgR,oBACvDtL,QAAQkS,IAAI,6BAADjS,OAA8BhE,KAAKmN,aAAa4B,WAAU,MACvE,CACF,GAIA,CAAAlQ,IAAA,eAAAkE,OAAAmP,EAAAlF,GAAAtH,KAAAE,EAUA,SAAAwP,IAAA,IAAAnE,EAAAoO,EAAAzS,EAAA4E,EAAA8N,EAAA5N,EAAA2D,EAAAkK,EAAA,YAAA7Z,KAAAC,EAAA,SAAA8P,GAAA,cAAAA,EAAA/Q,EAAA+Q,EAAAtR,GAAA,WAEMnE,KAAK8Q,mBAAgD,IAA3B9Q,KAAK4Q,WAAWnN,OAAY,CAAAgS,EAAAtR,EAAA,eAAAsR,EAAA3Q,EAAA,UAUjB,GAFzC9E,KAAK8Q,mBAAoB,EAEnBG,EAAYjR,KAAK4Q,WAAWe,QAIlB,CAAF8D,EAAAtR,EAAA,QAEmB,OAA/BnE,KAAK8Q,mBAAoB,EAAM2E,EAAA3Q,EAAA,UAwB/B,GAxB+B2Q,EAAA/Q,EAAA,EAUzB2a,GAAgBrf,KAAK6Q,WAAoC,OAAvB7Q,KAAK+Q,cAMxC/Q,KAAKmN,cAERnN,KAAKsa,yBAQyB,cAA5Bta,KAAKmN,aAAamC,MAAqB,CAAAmG,EAAAtR,EAAA,eAAAsR,EAAAtR,EAAA,EAEnCnE,KAAKmN,aAAaoC,SAAQ,cAAAkG,EAAAtR,EAAA,EAQR8M,EAAUrE,cAAa,OAAhC,OAAXA,EAAW6I,EAAA5Q,EAAA4Q,EAAAtR,EAAG,EAEMnE,KAAKmN,aAAayE,gBAAgBhF,GAAY,OAAlE4E,EAAWiE,EAAA5Q,EAIXya,EAAkBD,IAAiBrf,KAAK6Q,WAAoC,OAAvB7Q,KAAK+Q,eAM1DW,EAAS1R,KAAKmN,aAAa0E,sBAE1BC,OAASN,EAEhBE,EAAO7B,QAAQ7P,KAAKmN,aAAa4E,aAIjC/R,KAAK+Q,cAAgBW,EAErB1R,KAAK6Q,WAAY,EAMbyO,GAEFtf,KAAK4I,KAAK,mBAQZ8I,EAAOM,QAAU,WAEfuN,EAAKxO,cAAgB,KAErBwO,EAAKzO,mBAAoB,EAMrByO,EAAK3O,WAAWnN,OAAS,EAE3B8E,WAAW,kBAAMgX,EAAKpO,cAAc,EAAE,IAMtC5I,WAAW,WAEsB,IAA3BgX,EAAK3O,WAAWnN,QAAiB8b,EAAKxO,gBAExCwO,EAAK1O,WAAY,EAEjB0O,EAAK3W,KAAK,mBAId,EAAG,IAIP,EAMA8I,EAAOO,QAAQwD,EAAAtR,EAAA,eAAAsR,EAAA/Q,EAAA,EAAA2Q,EAAAI,EAAA5Q,EAMfd,QAAQD,MAAM,4CAA2CuR,GAEzDrV,KAAK+Q,cAAgB,KAErB/Q,KAAK4I,KAAK,gBAAeyM,GAMrBrV,KAAK4Q,WAAWnN,OAAS,GAE3BzD,KAAK8Q,mBAAoB,EAEzBvI,WAAW,kBAAMgX,EAAKpO,cAAc,EAAE,OAItCnR,KAAK6Q,WAAY,EAEjB7Q,KAAK8Q,mBAAoB,EAEzB9Q,KAAK4I,KAAK,oBAEX,cAAA6M,EAAA3Q,EAAA,KAAAsQ,EAAA,iBAIJ,WApKiB,OAAAlD,EAAArO,MAAC,KAADL,UAAA,IAwKlB,CAAA3E,IAAA,OAAAkE,MAMA,WAEE/C,KAAKmS,eAEP,GAIA,CAAAtT,IAAA,QAAAkE,MAMA,WAEE/C,KAAKyQ,OAELzQ,KAAK4Q,WAAa,GAElB5Q,KAAKmY,cAAgB,EAEvB,GAIA,CAAAtZ,IAAA,gBAAAkE,MAMA,WAEE,IAAMqP,EAAapS,KAAK6Q,WAAoC,OAAvB7Q,KAAK+Q,eAA0B/Q,KAAKkY,iBAAiBsH,KAAO,EAkBjG,GAdAzb,QAAQkS,IAAI,yCAEZlS,QAAQkS,IAAI,gBAAiBjW,KAAK6Q,WAElC9M,QAAQkS,IAAI,oBAA4C,OAAvBjW,KAAK+Q,eAEtChN,QAAQkS,IAAI,4BAA6BjW,KAAKkY,iBAAiBsH,MAE/Dzb,QAAQkS,IAAI,uBAAwBjW,KAAKiY,kBAMrCjY,KAAK+Q,cAAe,CAEtB,IAEEhN,QAAQkS,IAAI,gCAEZjW,KAAK+Q,cAAcN,MAErB,CAAE,MAAOxM,GAIPF,QAAQkS,IAAI,6CAA8ChS,EAAEgI,QAE9D,CAEAjM,KAAK+Q,cAAgB,IAEvB,CAQA,GAAI/Q,KAAKkY,iBAAiBsH,KAAO,EAAG,CAElCzb,QAAQkS,IAAI,eAADjS,OAAgBhE,KAAKkY,iBAAiBsH,KAAI,0BAErD,IAE0C9V,EAFtC+V,EAAe,EAAE7V,E,+4BAAAC,CAEA7J,KAAKkY,kBAAgB,IAA1C,IAAAtO,EAAAG,MAAAL,EAAAE,EAAAzF,KAAAe,MAA4C,KAAjCwM,EAAMhI,EAAA3G,MAEf,IAEE2O,EAAOjB,OAEPgP,GAEF,CAAE,MAAOxb,GAIPF,QAAQkS,IAAI,4CAA6ChS,EAAEgI,QAE7D,CAEF,CAAC,OAAA/B,GAAAN,EAAA3F,EAAAiG,EAAA,SAAAN,EAAAnF,GAAA,CAEDV,QAAQkS,IAAI,cAADjS,OAAeyb,EAAY,aAEtCzf,KAAKkY,iBAAiB5N,OAExB,CAMAtK,KAAK6Q,WAAY,EAEjB7Q,KAAK8Q,mBAAoB,EAEzB9Q,KAAK4Q,WAAa,GAMlB5Q,KAAKmY,cAAgB,GAErBnY,KAAKoY,eAAiB,GAEtBpY,KAAKqY,sBAAuB,EAE5BrY,KAAKsY,oBAAqB,EAM1BtY,KAAKgY,cAAgB,EAErBhY,KAAKiY,iBAAmB,EAMpB7F,IAEFrO,QAAQkS,IAAI,yEAEZjW,KAAK4I,KAAK,mBAId,GAIA,CAAA/J,IAAA,YAAAkE,MAMA,WAEE,MAAO,CAEL8N,UAAW7Q,KAAK6Q,UAEhBC,kBAAmB9Q,KAAK8Q,kBAExBuB,YAAarS,KAAK4Q,WAAWnN,OAE7BiN,kBAAmB1Q,KAAKmN,aAAenN,KAAKmN,aAAamC,MAAQ,SAEjEyI,aAAc/X,KAAK+X,aAEnBE,iBAAkBjY,KAAKiY,iBAEvByH,qBAAsB1f,KAAKoY,eAAe3U,OAE1Ckc,sBAAuB3f,KAAKkY,iBAAiBsH,KAIjD,GAIA,CAAA3gB,IAAA,UAAAkE,MAMA,WAEE/C,KAAKyQ,OAIDzQ,KAAKmN,cAA4C,WAA5BnN,KAAKmN,aAAamC,QAEzCtP,KAAKmN,aAAa5D,QAElBvJ,KAAKmN,aAAe,MAMtBnN,KAAKmW,oBAEP,IA7/DFtT,GAAAuD,GAAAnC,EAAA7D,UAAAyC,GAAAlD,OAAA4C,eAAA0B,EAAA,aAAA8B,UAAA,IAAA9B,EAAA,IAAAA,EAAApB,EAmnDEqP,EA7zBA6J,EAlRAV,EArPAxB,CA8sDC,CAt9Dc,CAAS7W,IA49D1B,Y,uPCngEA,IAAAiB,EAAAC,EAAArB,EAAA,mBAAAtE,OAAAA,OAAA,GAAA4F,EAAAtB,EAAAzD,UAAA,aAAAkD,EAAAO,EAAAC,aAAA,yBAAAsB,EAAAvB,EAAAsB,EAAA7B,EAAA8B,GAAA,IAAAC,EAAAF,GAAAA,EAAA/D,qBAAAkE,EAAAH,EAAAG,EAAAC,EAAA5E,OAAA6B,OAAA6C,EAAAjE,WAAA,OAAAoE,GAAAD,EAAA,mBAAA1B,EAAAsB,EAAA7B,GAAA,IAAA8B,EAAAC,EAAAE,EAAAE,EAAA,EAAAC,EAAApC,GAAA,GAAAqC,GAAA,EAAAC,EAAA,CAAAF,EAAA,EAAAP,EAAA,EAAAU,EAAAZ,EAAAa,EAAA1C,EAAAqC,EAAArC,EAAA2C,KAAAd,EAAA,GAAA7B,EAAA,SAAA8B,EAAArB,GAAA,OAAAuB,EAAAF,EAAAG,EAAA,EAAAE,EAAAN,EAAAW,EAAAT,EAAAtB,EAAAiC,CAAA,YAAA1C,EAAAS,EAAAsB,GAAA,IAAAE,EAAAxB,EAAA0B,EAAAJ,EAAAD,EAAA,GAAAS,GAAAF,IAAAnC,GAAA4B,EAAAQ,EAAAjB,OAAAS,IAAA,KAAA5B,EAAA8B,EAAAM,EAAAR,GAAA9B,EAAAwC,EAAAF,EAAAM,EAAAZ,EAAA,GAAAvB,EAAA,GAAAP,EAAA0C,IAAAb,KAAAI,EAAAH,GAAAC,EAAAD,EAAA,OAAAC,EAAA,MAAAD,EAAA,GAAAA,EAAA,GAAAH,GAAAG,EAAA,IAAAhC,KAAAE,EAAAO,EAAA,GAAAT,EAAAgC,EAAA,KAAAC,EAAA,EAAAO,EAAAC,EAAAV,EAAAS,EAAAT,EAAAC,EAAA,IAAAhC,EAAA4C,IAAA1C,EAAAO,EAAA,GAAAuB,EAAA,GAAAD,GAAAA,EAAAa,KAAAZ,EAAA,GAAAvB,EAAAuB,EAAA,GAAAD,EAAAS,EAAAT,EAAAa,EAAAX,EAAA,OAAA/B,GAAAO,EAAA,SAAAiC,EAAA,MAAAH,GAAA,EAAAR,CAAA,iBAAA7B,EAAAoC,EAAAM,GAAA,GAAAP,EAAA,QAAAQ,UAAA,oCAAAN,GAAA,IAAAD,GAAAtC,EAAAsC,EAAAM,GAAAX,EAAAK,EAAAH,EAAAS,GAAAd,EAAAG,EAAA,EAAAJ,EAAAM,KAAAI,GAAA,CAAAP,IAAAC,EAAAA,EAAA,GAAAA,EAAA,IAAAO,EAAAT,GAAA,GAAA/B,EAAAiC,EAAAE,IAAAK,EAAAT,EAAAI,EAAAK,EAAAC,EAAAN,GAAA,OAAAE,EAAA,EAAAL,EAAA,IAAAC,IAAA/B,EAAA,QAAA4B,EAAAE,EAAA9B,GAAA,MAAA4B,EAAAA,EAAAtB,KAAAwB,EAAAG,IAAA,MAAAU,UAAA,wCAAAf,EAAAgB,KAAA,OAAAhB,EAAAK,EAAAL,EAAAnB,MAAAsB,EAAA,IAAAA,EAAA,YAAAA,IAAAH,EAAAE,EAAAe,SAAAjB,EAAAtB,KAAAwB,GAAAC,EAAA,IAAAE,EAAAU,UAAA,oCAAA3C,EAAA,YAAA+B,EAAA,GAAAD,EAAAH,CAAA,UAAAC,GAAAS,EAAAC,EAAAT,EAAA,GAAAI,EAAA1B,EAAAD,KAAAuB,EAAAS,MAAAE,EAAA,YAAAZ,GAAAE,EAAAH,EAAAI,EAAA,EAAAE,EAAAL,CAAA,SAAAO,EAAA,UAAA1B,MAAAmB,EAAAgB,KAAAP,EAAA,GAAA9B,EAAAP,EAAA8B,IAAA,GAAAG,CAAA,KAAAO,EAAA,YAAAR,IAAA,UAAAc,IAAA,UAAAC,IAAA,CAAAnB,EAAAvE,OAAA2F,eAAA,IAAAjB,EAAA,GAAAF,GAAAD,EAAAA,EAAA,GAAAC,QAAAK,GAAAN,EAAA,GAAAC,EAAA,yBAAAD,GAAAK,EAAAc,EAAAjF,UAAAkE,EAAAlE,UAAAT,OAAA6B,OAAA6C,GAAA,SAAAI,EAAAR,GAAA,OAAAtE,OAAA4F,eAAA5F,OAAA4F,eAAAtB,EAAAoB,IAAApB,EAAAuB,UAAAH,EAAAb,GAAAP,EAAA3B,EAAA,sBAAA2B,EAAA7D,UAAAT,OAAA6B,OAAA+C,GAAAN,CAAA,QAAAmB,EAAAhF,UAAAiF,EAAAb,GAAAD,EAAA,cAAAc,GAAAb,GAAAa,EAAA,cAAAD,GAAAA,EAAAK,YAAA,oBAAAjB,GAAAa,EAAA/C,EAAA,qBAAAkC,GAAAD,GAAAC,GAAAD,EAAAjC,EAAA,aAAAkC,GAAAD,EAAAJ,EAAA,yBAAAK,GAAAD,EAAA,oDAAAmB,GAAA,kBAAAC,EAAAvB,EAAAwB,EAAAnB,EAAA,cAAAD,GAAAP,EAAApB,EAAAsB,EAAAD,GAAA,IAAAE,EAAAzE,OAAA4C,eAAA,IAAA6B,EAAA,gBAAAH,GAAAG,EAAA,EAAAI,GAAA,SAAAP,EAAApB,EAAAsB,EAAAD,GAAA,SAAA5B,EAAAO,EAAAsB,GAAAK,GAAAP,EAAApB,EAAA,SAAAoB,GAAA,YAAA4B,QAAAhD,EAAAsB,EAAAF,EAAA,GAAApB,EAAAuB,EAAAA,EAAAH,EAAApB,EAAA,CAAAE,MAAAoB,EAAA3B,YAAA0B,EAAA4B,cAAA5B,EAAA6B,UAAA7B,IAAAD,EAAApB,GAAAsB,GAAA7B,EAAA,UAAAA,EAAA,WAAAA,EAAA,cAAAkC,GAAAP,EAAApB,EAAAsB,EAAAD,EAAA,UAAA8B,GAAA7B,EAAAD,EAAAD,EAAApB,EAAAP,EAAAwC,EAAAT,GAAA,QAAAD,EAAAD,EAAAW,GAAAT,GAAAE,EAAAH,EAAArB,KAAA,OAAAoB,GAAA,YAAAF,EAAAE,EAAA,CAAAC,EAAAc,KAAAhB,EAAAK,GAAA0B,QAAAC,QAAA3B,GAAA4B,KAAAtD,EAAAP,EAAA,UAAA0K,GAAA7I,GAAA,sBAAAD,EAAA,KAAAD,EAAAT,UAAA,WAAAyC,QAAA,SAAApD,EAAAP,GAAA,IAAAwC,EAAAX,EAAAN,MAAAK,EAAAD,GAAA,SAAA6E,EAAA3E,GAAA6B,GAAAlB,EAAAjC,EAAAP,EAAAwG,EAAAC,EAAA,OAAA5E,EAAA,UAAA4E,EAAA5E,GAAA6B,GAAAlB,EAAAjC,EAAAP,EAAAwG,EAAAC,EAAA,QAAA5E,EAAA,CAAA2E,OAAA,eAAAmE,GAAApK,EAAAiC,IAAA,MAAAA,GAAAA,EAAAjC,EAAAY,UAAAqB,EAAAjC,EAAAY,QAAA,QAAAQ,EAAA,EAAAE,EAAArD,MAAAgE,GAAAb,EAAAa,EAAAb,IAAAE,EAAAF,GAAApB,EAAAoB,GAAA,OAAAE,CAAA,UAAAiC,GAAAnC,EAAApB,GAAA,QAAAqB,EAAA,EAAAA,EAAArB,EAAAY,OAAAS,IAAA,KAAA5B,EAAAO,EAAAqB,GAAA5B,EAAAE,WAAAF,EAAAE,aAAA,EAAAF,EAAAwD,cAAA,YAAAxD,IAAAA,EAAAyD,UAAA,GAAApG,OAAA4C,eAAA0B,EAAAoC,GAAA/D,EAAAzD,KAAAyD,EAAA,WAAA+D,GAAAnC,GAAA,IAAAE,EAAA,SAAAF,GAAA,aAAAoC,GAAApC,KAAAA,EAAA,OAAAA,EAAA,IAAAD,EAAAC,EAAA3F,OAAAgI,aAAA,YAAAtC,EAAA,KAAAG,EAAAH,EAAArB,KAAAsB,EAAArB,UAAA,aAAAyD,GAAAlC,GAAA,OAAAA,EAAA,UAAAa,UAAA,uDAAAuB,OAAAtC,EAAA,CAAAuC,CAAAvC,GAAA,gBAAAoC,GAAAlC,GAAAA,EAAAA,EAAA,YAAAsC,KAAA,QAAAxC,GAAAyC,QAAAvG,UAAAwG,QAAAhE,KAAAiE,QAAAC,UAAAH,QAAA,wBAAAzC,GAAA,QAAAwC,GAAA,mBAAAxC,CAAA,cAAA6C,GAAA7C,GAAA,OAAA6C,GAAApH,OAAA4F,eAAA5F,OAAA2F,eAAAP,OAAA,SAAAb,GAAA,OAAAA,EAAAsB,WAAA7F,OAAA2F,eAAApB,EAAA,EAAA6C,GAAA7C,EAAA,UAAA8C,GAAA9C,EAAAD,GAAA,OAAA+C,GAAArH,OAAA4F,eAAA5F,OAAA4F,eAAAR,OAAA,SAAAb,EAAAD,GAAA,OAAAC,EAAAsB,UAAAvB,EAAAC,CAAA,EAAA8C,GAAA9C,EAAAD,EAAA,CAEqD,IAEhCiJ,GAAa,SAAAjG,GAChC,SAAAiG,EAAYvO,GAAQ,IAAAwI,EAMO,OAX7B,SAAArC,EAAAX,GAAA,KAAAW,aAAAX,GAAA,UAAAc,UAAA,qCAKsBhC,CAAA,KAAAiK,IAClB/F,EANJ,SAAAjD,EAAA5B,EAAA2B,GAAA,OAAA3B,EAAAyE,GAAAzE,GAAA,SAAA4B,EAAAD,GAAA,GAAAA,IAAA,UAAAqC,GAAArC,IAAA,mBAAAA,GAAA,OAAAA,EAAA,YAAAA,EAAA,UAAAgB,UAAA,4EAAAhB,GAAA,YAAAA,EAAA,UAAAmD,eAAA,oEAAAnD,CAAA,CAAAoD,CAAAnD,EAAA,CAAAoD,CAAApD,EAAAwC,KAAAG,QAAAC,UAAAxE,EAAA2B,GAAA,GAAA8C,GAAA7C,GAAAtD,aAAA0B,EAAAuB,MAAAK,EAAAD,GAAA,CAMIsD,CAAA,KAAA2F,IACKvO,OAASA,EACdwI,EAAKgG,aAAe,KACpBhG,EAAKiG,iBAAmB,KACxBjG,EAAKkG,YAAc,KACnBlG,EAAKmG,aAAc,EAAMnG,CAC3B,CAEA,OAdF,SAAAjD,EAAAD,GAAA,sBAAAA,GAAA,OAAAA,EAAA,UAAAgB,UAAA,sDAAAf,EAAA9D,UAAAT,OAAA6B,OAAAyC,GAAAA,EAAA7D,UAAA,CAAAQ,YAAA,CAAAmC,MAAAmB,EAAA6B,UAAA,EAAAD,cAAA,KAAAnG,OAAA4C,eAAA2B,EAAA,aAAA6B,UAAA,IAAA9B,GAAA+C,GAAA9C,EAAAD,EAAA,CAcE4D,CAAAqF,EAAAjG,GAdFhD,EAcEiJ,EAdFrK,EAcE,EAAAhE,IAAA,wBAAAkE,MAIA,WAEE,GAAI/C,KAAKrB,OAAO4O,mBACd,OAAOvN,KAAKrB,OAAO4O,mBAIrB,IAC0B7D,EAD8BE,EAzB5D,SAAA/G,EAAAoB,GAAA,IAAAC,EAAA,oBAAA3F,QAAAsE,EAAAtE,OAAAa,WAAAyD,EAAA,kBAAAqB,EAAA,IAAApD,MAAAC,QAAA8B,KAAAqB,EAAA,SAAArB,EAAAiC,GAAA,GAAAjC,EAAA,qBAAAA,EAAA,OAAAoK,GAAApK,EAAAiC,GAAA,IAAAZ,EAAA,GAAA6G,SAAAnI,KAAAC,GAAA2K,MAAA,uBAAAtJ,GAAArB,EAAAjC,cAAAsD,EAAArB,EAAAjC,YAAA6M,MAAA,QAAAvJ,GAAA,QAAAA,EAAApD,MAAA4M,KAAA7K,GAAA,cAAAqB,GAAA,2CAAAyJ,KAAAzJ,GAAA+I,GAAApK,EAAAiC,QAAA,GAAA8I,CAAA/K,KAAAoB,GAAApB,GAAA,iBAAAA,EAAAY,OAAA,CAAAS,IAAArB,EAAAqB,GAAA,IAAA2J,EAAA,EAAAC,EAAA,oBAAA/D,EAAA+D,EAAA3J,EAAA,kBAAA0J,GAAAhL,EAAAY,OAAA,CAAAyB,MAAA,IAAAA,MAAA,EAAAnC,MAAAF,EAAAgL,KAAA,EAAA5J,EAAA,SAAApB,GAAA,MAAAA,CAAA,EAAA4B,EAAAqJ,EAAA,WAAA7I,UAAA,6IAAA3C,EAAAwC,GAAA,EAAAP,GAAA,SAAAwF,EAAA,WAAA7F,EAAAA,EAAAtB,KAAAC,EAAA,EAAAsB,EAAA,eAAAtB,EAAAqB,EAAA6J,OAAA,OAAAjJ,EAAAjC,EAAAqC,KAAArC,CAAA,EAAAoB,EAAA,SAAApB,GAAA0B,GAAA,EAAAjC,EAAAO,CAAA,EAAA4B,EAAA,eAAAK,GAAA,MAAAZ,EAAAiB,QAAAjB,EAAAiB,QAAA,YAAAZ,EAAA,MAAAjC,CAAA,IAyB4DuH,CAAxCmE,SAASC,qBAAqB,WACpB,IAA1B,IAAArE,EAAAG,MAAAL,EAAAE,EAAAzF,KAAAe,MAA4B,KACpBgJ,EADOxE,EAAA3G,MACMmL,IAEnB,GAAIA,IAAQA,EAAIC,SAAS,oBAAsBD,EAAIC,SAAS,kBAE1D,IACE,IAAME,EAAWH,EAAII,UAAU,EAAGJ,EAAIK,YAAY,MAClD,MAAO,GAAPvK,OAAUqK,EAAQ,sBACpB,CAAE,MAAOpK,GACP,IAAMoK,EAAWH,EAAII,UAAU,EAAGJ,EAAIK,YAAY,MAClD,MAAO,GAAPvK,OAAUqK,EAAQ,sBACpB,CAEJ,CAEA,OAAAnE,GAAAN,EAAA3F,EAAAiG,EAAA,SAAAN,EAAAnF,GAAA,CACA,MAAO,6CACT,GAEA,CAAA5F,IAAA,QAAAkE,OAAAyL,EAAAxB,GAAAtH,KAAAE,EAGA,SAAAkC,IAAA,IAAA2G,EAAAC,EAAAxG,EAAA,YAAAxC,KAAAC,EAAA,SAAAwC,GAAA,cAAAA,EAAAzD,EAAAyD,EAAAhE,GAAA,cAAAgE,EAAAzD,EAAA,EAAAyD,EAAAhE,EAAA,EAG6BwK,UAAUC,aAAaC,aAAa,CAC3DC,MAAO,CACLC,WAAY/O,KAAKrB,OAAOoQ,WACxBC,aAAc,EACdC,kBAAkB,EAClBC,kBAAkB,EAClBC,iBAAiB,KAEnB,OAOF,GAfAnP,KAAKqN,YAAWlF,EAAAtD,EAWhB7E,KAAKmN,aAAe,IAAK9O,OAAO+Q,cAAgB/Q,OAAOgR,oBAAoB,CACzEN,WAAY/O,KAAKrB,OAAOoQ,aAIM,cAA5B/O,KAAKmN,aAAamC,MAAqB,CAAAnH,EAAAhE,EAAA,eAAAgE,EAAAhE,EAAA,EACnCnE,KAAKmN,aAAaoC,SAAQ,OAMlC,OAFMd,EAAgBzO,KAAKwP,wBAE3BrH,EAAAhE,EAAA,EACMnE,KAAKmN,aAAasC,aAAaC,UAAUjB,GAAc,OAG7DzO,KAAKoN,iBAAmB,IAAIuC,iBAAiB3P,KAAKmN,aAAc,mBAGjDnN,KAAKmN,aAAayC,wBAAwB5P,KAAKqN,aACvDwC,QAAQ7P,KAAKoN,kBAGpBpN,KAAKoN,iBAAiB0C,KAAKC,UAAY,SAAC5M,GACtC,IAAA6M,EAAuB7M,EAAMqJ,KAArB9N,EAAIsR,EAAJtR,KAAM8N,EAAIwD,EAAJxD,KAED,mBAAT9N,GACFwJ,EAAKU,KAAK,YAAa4D,EAE3B,EAGAxM,KAAKoN,iBAAiB0C,KAAKG,YAAY,CACrCvR,KAAM,qBACN8N,KAAM,CAAE0D,SAAS,KAGnBlQ,KAAKsN,aAAc,EACnBtN,KAAK4I,KAAK,oBAAoBT,EAAAhE,EAAA,eAGJ,MAHIgE,EAAAzD,EAAA,EAAAgK,EAAAvG,EAAAtD,EAG9B7E,KAAK4I,KAAK,QAAO8F,GAASA,EAAA,cAAAvG,EAAArD,EAAA,KAAAgD,EAAA,iBAG7B,WA1DU,OAAA0G,EAAA3K,MAAC,KAADL,UAAA,IA4DX,CAAA3E,IAAA,OAAAkE,OAAAoN,EAAAnD,GAAAtH,KAAAE,EAGA,SAAAwK,IAAA,IAAAC,EAAA,OAAA3K,KAAAC,EAAA,SAAA2K,GAAA,cAAAA,EAAA5L,EAAA4L,EAAAnM,GAAA,UACOnE,KAAKsN,YAAa,CAAFgD,EAAAnM,EAAA,eAAAmM,EAAAxL,EAAA,aAAAwL,EAAA5L,EAAA,GAMf1E,KAAKoN,iBAAkB,CAAFkD,EAAAnM,EAAA,QACmC,OAA1DnE,KAAKoN,iBAAiB0C,KAAKG,YAAY,CAAEvR,KAAM,UAAW4R,EAAAnM,EAAA,EACpD,IAAI8B,QAAQ,SAAAC,GAAO,OAAIqC,WAAWrC,EAAS,IAAI,GAAC,OAOvD,GAHGlG,KAAKqN,cACPrN,KAAKqN,YAAYkD,YAAY3M,QAAQ,SAAA4M,GAAK,OAAIA,EAAMC,MAAM,GAC1DzQ,KAAKqN,YAAc,OAGjBrN,KAAKmN,cAA4C,WAA5BnN,KAAKmN,aAAamC,MAAkB,CAAAgB,EAAAnM,EAAA,eAAAmM,EAAAnM,EAAA,EACrDnE,KAAKmN,aAAa5D,QAAO,OAC/BvJ,KAAKmN,aAAe,KAAK,OAG3BnN,KAAKoN,iBAAmB,KACxBpN,KAAKsN,aAAc,EACnBtN,KAAK4I,KAAK,oBAAoB0H,EAAAnM,EAAA,eAGJ,MAHImM,EAAA5L,EAAA,EAAA2L,EAAAC,EAAAzL,EAG9B7E,KAAK4I,KAAK,QAAOyH,GAASA,EAAA,cAAAC,EAAAxL,EAAA,KAAAsL,EAAA,iBAG7B,WA/BS,OAAAD,EAAAtM,MAAC,KAADL,UAAA,IAiCV,CAAA3E,IAAA,YAAAkE,MAGA,WACE,MAAO,CACLuK,YAAatN,KAAKsN,YAClBoD,kBAAmB1Q,KAAKmN,aAAenN,KAAKmN,aAAamC,MAAQ,SAErE,GAEA,CAAAzQ,IAAA,UAAAkE,MAGA,WACE/C,KAAKyQ,MACP,IA/JF5N,GAAAuD,GAAAnC,EAAA7D,UAAAyC,GAAAlD,OAAA4C,eAAA0B,EAAA,aAAA8B,UAAA,IAAA9B,EAAA,IAAAA,EAAApB,EA4GEsN,EA/DA3B,CAkHC,CA3J+B,CAASxL,I,2qBC6I3C,SAzIwB,oBAAA4c,K,4FAAA3c,CAAA,KAAA2c,EAAA,Q,EAAAA,E,EAAA,EAAA/gB,IAAA,oBAAAkE,MAMtB,SAAyB8c,GACvB,IAAMzD,EAAQyD,aAAmBxO,WAAawO,EAAU,IAAIxO,WAAWwO,GAEvE,GAAIzD,EAAM3Y,OAAS,GACjB,MAAM,IAAIhD,MAAM,mCAKlB,GAAa,SADA+F,OAAOsZ,aAAa1D,EAAM,GAAIA,EAAM,GAAIA,EAAM,GAAIA,EAAM,IAEnE,MAAM,IAAI3b,MAAM,8CAKlB,GAAa,SADA+F,OAAOsZ,aAAa1D,EAAM,GAAIA,EAAM,GAAIA,EAAM,IAAKA,EAAM,KAEpE,MAAM,IAAI3b,MAAM,8CAUlB,IANA,IAAMkZ,EAAWyC,EAAM,IAAOA,EAAM,KAAO,EACrCrN,EAAaqN,EAAM,IAAOA,EAAM,KAAO,EAAMA,EAAM,KAAO,GAAOA,EAAM,KAAO,GAC9E1C,EAAW0C,EAAM,IAAOA,EAAM,KAAO,EAGvC2D,GAAkB,EACb3b,EAAI,GAAIA,EAAIgY,EAAM3Y,OAAS,EAAGW,GAAK,EAAG,CAE7C,GAAgB,SADAoC,OAAOsZ,aAAa1D,EAAMhY,GAAIgY,EAAMhY,EAAI,GAAIgY,EAAMhY,EAAI,GAAIgY,EAAMhY,EAAI,IAC5D,CACtB2b,EAAiB3b,EACjB,KACF,CAGAA,GAAK,GADagY,EAAMhY,EAAI,GAAMgY,EAAMhY,EAAI,IAAM,EAAMgY,EAAMhY,EAAI,IAAM,GAAOgY,EAAMhY,EAAI,IAAM,GAEjG,CAEA,IAAwB,IAApB2b,EACF,MAAM,IAAItf,MAAM,8BAIlB,IAAMuf,EAAW5D,EAAM2D,EAAiB,GACvB3D,EAAM2D,EAAiB,IAAM,EAC7B3D,EAAM2D,EAAiB,IAAM,GAC7B3D,EAAM2D,EAAiB,IAAM,GAGxCE,EAAYF,EAAiB,EAC7BG,EAAiB/W,KAAK6U,IAAIgC,EAAU5D,EAAM3Y,OAASwc,GAIzD,MAAO,CACLzJ,QAHc4F,EAAM5O,MAAMyS,EAAWA,EAAYC,GAGhCpO,OACjBiH,OAAQ,CACNhK,WAAAA,EACA4K,SAAAA,EACAD,SAAAA,GAGN,GAEA,CAAA7a,IAAA,YAAAkE,MAKA,SAAiBqZ,GACf,OAAOA,EAAM3Y,QAAU,IACH,KAAb2Y,EAAM,IAA4B,KAAbA,EAAM,IACd,KAAbA,EAAM,IAA4B,KAAbA,EAAM,EACpC,GAEA,CAAAvd,IAAA,kBAAAkE,MAQA,SAAuB2b,EAAY3P,EAAY4P,EAAa5B,GAC1D,IAAM6B,EAAS,IAAIlS,YAAY,IACzByR,EAAO,IAAIC,SAASQ,GAqB1B,OAlBAT,EAAKU,UAAU,EAAG,YAAY,GAC9BV,EAAKU,UAAU,EAAG,GAAKH,GAAY,GACnCP,EAAKU,UAAU,EAAG,YAAY,GAG9BV,EAAKU,UAAU,GAAI,YAAY,GAC/BV,EAAKU,UAAU,GAAI,IAAI,GACvBV,EAAKW,UAAU,GAAI,GAAG,GACtBX,EAAKW,UAAU,GAAIH,GAAa,GAChCR,EAAKU,UAAU,GAAI9P,GAAY,GAC/BoP,EAAKU,UAAU,GAAI9P,EAAa4P,EAAc5B,EAAgB,GAAG,GACjEoB,EAAKW,UAAU,GAAIH,EAAc5B,EAAgB,GAAG,GACpDoB,EAAKW,UAAU,GAAI/B,GAAe,GAGlCoB,EAAKU,UAAU,GAAI,YAAY,GAC/BV,EAAKU,UAAU,GAAIH,GAAY,GAExBE,CACT,GAEA,CAAA/f,IAAA,eAAAkE,MAMA,SAAoByT,EAASuC,GAC3B,IAAM6F,EAASgB,EAAmBxC,gBAChC5G,EAAQ4D,WACRrB,EAAOhK,WACPgK,EAAOY,UAAY,EACnBZ,EAAOW,UAAY,IAIfyG,EAAU,IAAI9O,WAAWuN,EAAOxE,WAAa5D,EAAQ4D,YAI3D,OAHA+F,EAAQ9X,IAAI,IAAIgJ,WAAWuN,GAAS,GACpCuB,EAAQ9X,IAAI,IAAIgJ,WAAWmF,GAAUoI,EAAOxE,YAErC+F,EAAQrO,MACjB,IAtIsB,M,eAAA,M,uEAsIrB,CAtIqB,G,2qBCmFxB,SAjFuB,WASrB,O,EARA,SAAAsO,K,4FAAcnd,CAAA,KAAAmd,GACZpgB,KAAKwY,OAAS,CACZC,IAAK,IAAIlC,GACTS,KAAM,IAAIP,GACVkB,KAAM,IAAIH,GAEd,G,EAEA,EAAA3Y,IAAA,cAAAkE,MAMA,SAAYsd,EAAa5G,GACvB,IAAM6G,EAAqB7G,aAAQ,EAARA,EAAUD,cAErC,IAAK8G,GAA6C,QAAvBA,EAEzB,OAAID,aAAuB3T,YAClB2T,EAELA,aAAuBhP,WAClBgP,EAAYvO,OAEduO,EAGT,IAAMrD,EAAQhd,KAAKwY,OAAO8H,GAC1B,IAAKtD,EACH,MAAM,IAAIvc,MAAM,yBAADuD,OAA0ByV,IAG3C,IAAM9C,EAAQ0J,aAAuBhP,WACvBgP,EACA,IAAIhP,WAAWgP,GAE7B,OAAOrD,EAAME,OAAOvG,EACtB,GAEA,CAAA9X,IAAA,gBAAAkE,MAMA,SAAcyT,EAAS+J,GACrB,IAAMD,EAAqBC,aAAc,EAAdA,EAAgB/G,cAE3C,IAAK8G,GAA6C,QAAvBA,EAEzB,OAAO9J,EAGT,IAAMwG,EAAQhd,KAAKwY,OAAO8H,GAC1B,IAAKtD,EACH,MAAM,IAAIvc,MAAM,gCAADuD,OAAiCuc,IAGlD,IAAMC,EAAUxD,EAAMyD,OAAOjK,GAG7B,OAAIgK,aAAmBnP,WACdmP,EAAQ1O,OAGV0O,CACT,GAEA,CAAA3hB,IAAA,WAAAkE,MAKA,SAAS0W,GACP,IAAMyE,EAAazE,aAAQ,EAARA,EAAUD,cAC7B,OAAOxZ,KAAKwY,OAAO0F,IAAe,IACpC,M,8EAAC,CA9EoB,G,2qBC4HvB,SA/HuB,oBAAAwC,K,4FAAAzd,CAAA,KAAAyd,EAAA,Q,EAAAA,E,EAAA,EAAA7hB,IAAA,UAAAkE,MAQrB,SAAeyT,EAASmK,EAAetD,GACrC,GAAIsD,IAAkBtD,EACpB,OAAO7G,EAGT,GAAsB,IAAlBmK,EACF,MAAM,IAAIlgB,MAAM,sEAGlB,IAAMmgB,EAAsBD,EAAgB,EACtCE,EAAuBxD,EAAiB,EACxCyD,EAAatK,EAAQ4D,WAAawG,EAIxC,GAFmB,IAAIlU,YAAYoU,EAAaD,GAE1B,KAAlBF,GAA2C,KAAnBtD,EAE1B,OAAO7G,EACF,GAAsB,KAAlBmK,GAA2C,KAAnBtD,EAEjC,OAAOqD,EAAkBK,cAAcvK,GAClC,GAAsB,KAAlBmK,GAA2C,KAAnBtD,EAEjC,OAAOqD,EAAkBM,cAAcxK,GAClC,GAAsB,KAAlBmK,GAA2C,IAAnBtD,EAEjC,OAAOqD,EAAkBO,aAAazK,GACjC,GAAsB,KAAlBmK,GAA2C,IAAnBtD,EAEjC,OAAOqD,EAAkBQ,aAAa1K,GAEtC,MAAM,IAAI/V,MAAM,qCAADuD,OAAsC2c,EAAa,WAAA3c,OAAUqZ,EAAc,QAE9F,GAEA,CAAAxe,IAAA,gBAAAkE,MAKA,SAAqBoe,GAKnB,IAJA,IAAM/E,EAAQ,IAAI/K,WAAW8P,GACvBzD,EAAUvU,KAAKwU,MAAMvB,EAAM3Y,OAAS,GACpCmT,EAAQ,IAAIC,WAAW6G,GAEpBtZ,EAAI,EAAGA,EAAIsZ,EAAStZ,IAAK,CAEhC,IAAMwZ,EAAQxB,EAAU,EAAJhY,GACdyZ,EAAQzB,EAAU,EAAJhY,EAAQ,GACtB0Z,EAAQ1B,EAAU,EAAJhY,EAAQ,GAGxB2Z,EAAUH,EAASC,GAAS,GAAe,IAARC,IAAiB,GAG5C,IAARA,IACFC,GAAoB,YAItBnH,EAAMxS,GAAK+E,KAAKC,KAAK,MAAOD,KAAK6U,IAAI,MAAO7U,KAAKyS,MAAMmC,EAAU,MACnE,CAEA,OAAOnH,EAAM9E,MACf,GAEA,CAAAjT,IAAA,gBAAAkE,MAKA,SAAqBgU,GAInB,IAHA,IAAMH,EAAQ,IAAIC,WAAWE,GACvBqK,EAAQ,IAAI/P,WAA0B,EAAfuF,EAAMnT,QAE1BW,EAAI,EAAGA,EAAIwS,EAAMnT,OAAQW,IAAK,CACrC,IAEM2Z,EAAkB,IAFVnH,EAAMxS,GAKpBgd,EAAU,EAAJhd,GAAmB,IAAV2Z,EACfqD,EAAU,EAAJhd,EAAQ,GAAM2Z,GAAW,EAAK,IACpCqD,EAAU,EAAJhd,EAAQ,GAAM2Z,GAAW,GAAM,GACvC,CAEA,OAAOqD,EAAMtP,MACf,GAEA,CAAAjT,IAAA,eAAAkE,MAKA,SAAoBgU,GAIlB,IAHA,IAAMH,EAAQ,IAAIC,WAAWE,GACvBsK,EAAO,IAAIhQ,WAAWuF,EAAMnT,QAEzBW,EAAI,EAAGA,EAAIwS,EAAMnT,OAAQW,IAAK,CAErC,IAAMrB,EAAQ6T,EAAMxS,GACpBid,EAAKjd,GAAK+E,KAAKC,IAAI,EAAGD,KAAK6U,IAAI,IAAK7U,KAAKyS,MAAO7Y,EAAQ,IAAO,MACjE,CAEA,OAAOse,EAAKvP,MACd,GAEA,CAAAjT,IAAA,eAAAkE,MAKA,SAAoBoe,GAElB,IAAMvK,EAAQ8J,EAAkBK,cAAcI,GAC9C,OAAOT,EAAkBO,aAAarK,EACxC,IA5HqB,M,eAAA,M,uEA4HpB,CA5HoB,G,uPCPvB,IAAA3S,EAAAC,EAAArB,EAAA,mBAAAtE,OAAAA,OAAA,GAAA4F,EAAAtB,EAAAzD,UAAA,aAAAkD,EAAAO,EAAAC,aAAA,yBAAAsB,EAAAvB,EAAAsB,EAAA7B,EAAA8B,GAAA,IAAAC,EAAAF,GAAAA,EAAA/D,qBAAAkE,EAAAH,EAAAG,EAAAC,EAAA5E,OAAA6B,OAAA6C,EAAAjE,WAAA,OAAAoE,GAAAD,EAAA,mBAAA1B,EAAAsB,EAAA7B,GAAA,IAAA8B,EAAAC,EAAAE,EAAAE,EAAA,EAAAC,EAAApC,GAAA,GAAAqC,GAAA,EAAAC,EAAA,CAAAF,EAAA,EAAAP,EAAA,EAAAU,EAAAZ,EAAAa,EAAA1C,EAAAqC,EAAArC,EAAA2C,KAAAd,EAAA,GAAA7B,EAAA,SAAA8B,EAAArB,GAAA,OAAAuB,EAAAF,EAAAG,EAAA,EAAAE,EAAAN,EAAAW,EAAAT,EAAAtB,EAAAiC,CAAA,YAAA1C,EAAAS,EAAAsB,GAAA,IAAAE,EAAAxB,EAAA0B,EAAAJ,EAAAD,EAAA,GAAAS,GAAAF,IAAAnC,GAAA4B,EAAAQ,EAAAjB,OAAAS,IAAA,KAAA5B,EAAA8B,EAAAM,EAAAR,GAAA9B,EAAAwC,EAAAF,EAAAM,EAAAZ,EAAA,GAAAvB,EAAA,GAAAP,EAAA0C,IAAAb,KAAAI,EAAAH,GAAAC,EAAAD,EAAA,OAAAC,EAAA,MAAAD,EAAA,GAAAA,EAAA,GAAAH,GAAAG,EAAA,IAAAhC,KAAAE,EAAAO,EAAA,GAAAT,EAAAgC,EAAA,KAAAC,EAAA,EAAAO,EAAAC,EAAAV,EAAAS,EAAAT,EAAAC,EAAA,IAAAhC,EAAA4C,IAAA1C,EAAAO,EAAA,GAAAuB,EAAA,GAAAD,GAAAA,EAAAa,KAAAZ,EAAA,GAAAvB,EAAAuB,EAAA,GAAAD,EAAAS,EAAAT,EAAAa,EAAAX,EAAA,OAAA/B,GAAAO,EAAA,SAAAiC,EAAA,MAAAH,GAAA,EAAAR,CAAA,iBAAA7B,EAAAoC,EAAAM,GAAA,GAAAP,EAAA,QAAAQ,UAAA,oCAAAN,GAAA,IAAAD,GAAAtC,EAAAsC,EAAAM,GAAAX,EAAAK,EAAAH,EAAAS,GAAAd,EAAAG,EAAA,EAAAJ,EAAAM,KAAAI,GAAA,CAAAP,IAAAC,EAAAA,EAAA,GAAAA,EAAA,IAAAO,EAAAT,GAAA,GAAA/B,EAAAiC,EAAAE,IAAAK,EAAAT,EAAAI,EAAAK,EAAAC,EAAAN,GAAA,OAAAE,EAAA,EAAAL,EAAA,IAAAC,IAAA/B,EAAA,QAAA4B,EAAAE,EAAA9B,GAAA,MAAA4B,EAAAA,EAAAtB,KAAAwB,EAAAG,IAAA,MAAAU,UAAA,wCAAAf,EAAAgB,KAAA,OAAAhB,EAAAK,EAAAL,EAAAnB,MAAAsB,EAAA,IAAAA,EAAA,YAAAA,IAAAH,EAAAE,EAAAe,SAAAjB,EAAAtB,KAAAwB,GAAAC,EAAA,IAAAE,EAAAU,UAAA,oCAAA3C,EAAA,YAAA+B,EAAA,GAAAD,EAAAH,CAAA,UAAAC,GAAAS,EAAAC,EAAAT,EAAA,GAAAI,EAAA1B,EAAAD,KAAAuB,EAAAS,MAAAE,EAAA,YAAAZ,GAAAE,EAAAH,EAAAI,EAAA,EAAAE,EAAAL,CAAA,SAAAO,EAAA,UAAA1B,MAAAmB,EAAAgB,KAAAP,EAAA,GAAA9B,EAAAP,EAAA8B,IAAA,GAAAG,CAAA,KAAAO,EAAA,YAAAR,IAAA,UAAAc,IAAA,UAAAC,IAAA,CAAAnB,EAAAvE,OAAA2F,eAAA,IAAAjB,EAAA,GAAAF,GAAAD,EAAAA,EAAA,GAAAC,QAAAK,GAAAN,EAAA,GAAAC,EAAA,yBAAAD,GAAAK,EAAAc,EAAAjF,UAAAkE,EAAAlE,UAAAT,OAAA6B,OAAA6C,GAAA,SAAAI,EAAAR,GAAA,OAAAtE,OAAA4F,eAAA5F,OAAA4F,eAAAtB,EAAAoB,IAAApB,EAAAuB,UAAAH,EAAAb,GAAAP,EAAA3B,EAAA,sBAAA2B,EAAA7D,UAAAT,OAAA6B,OAAA+C,GAAAN,CAAA,QAAAmB,EAAAhF,UAAAiF,EAAAb,GAAAD,EAAA,cAAAc,GAAAb,GAAAa,EAAA,cAAAD,GAAAA,EAAAK,YAAA,oBAAAjB,GAAAa,EAAA/C,EAAA,qBAAAkC,GAAAD,GAAAC,GAAAD,EAAAjC,EAAA,aAAAkC,GAAAD,EAAAJ,EAAA,yBAAAK,GAAAD,EAAA,oDAAAmB,GAAA,kBAAAC,EAAAvB,EAAAwB,EAAAnB,EAAA,cAAAD,GAAAP,EAAApB,EAAAsB,EAAAD,GAAA,IAAAE,EAAAzE,OAAA4C,eAAA,IAAA6B,EAAA,gBAAAH,GAAAG,EAAA,EAAAI,GAAA,SAAAP,EAAApB,EAAAsB,EAAAD,GAAA,SAAA5B,EAAAO,EAAAsB,GAAAK,GAAAP,EAAApB,EAAA,SAAAoB,GAAA,YAAA4B,QAAAhD,EAAAsB,EAAAF,EAAA,GAAApB,EAAAuB,EAAAA,EAAAH,EAAApB,EAAA,CAAAE,MAAAoB,EAAA3B,YAAA0B,EAAA4B,cAAA5B,EAAA6B,UAAA7B,IAAAD,EAAApB,GAAAsB,GAAA7B,EAAA,UAAAA,EAAA,WAAAA,EAAA,cAAAkC,GAAAP,EAAApB,EAAAsB,EAAAD,EAAA,UAAA8B,GAAA7B,EAAAD,EAAAD,EAAApB,EAAAP,EAAAwC,EAAAT,GAAA,QAAAD,EAAAD,EAAAW,GAAAT,GAAAE,EAAAH,EAAArB,KAAA,OAAAoB,GAAA,YAAAF,EAAAE,EAAA,CAAAC,EAAAc,KAAAhB,EAAAK,GAAA0B,QAAAC,QAAA3B,GAAA4B,KAAAtD,EAAAP,EAAA,UAAA8D,GAAAnC,EAAApB,GAAA,QAAAqB,EAAA,EAAAA,EAAArB,EAAAY,OAAAS,IAAA,KAAA5B,EAAAO,EAAAqB,GAAA5B,EAAAE,WAAAF,EAAAE,aAAA,EAAAF,EAAAwD,cAAA,YAAAxD,IAAAA,EAAAyD,UAAA,GAAApG,OAAA4C,eAAA0B,EAAAoC,GAAA/D,EAAAzD,KAAAyD,EAAA,WAAA+D,GAAAnC,GAAA,IAAAE,EAAA,SAAAF,GAAA,aAAAoC,GAAApC,KAAAA,EAAA,OAAAA,EAAA,IAAAD,EAAAC,EAAA3F,OAAAgI,aAAA,YAAAtC,EAAA,KAAAG,EAAAH,EAAArB,KAAAsB,EAAArB,UAAA,aAAAyD,GAAAlC,GAAA,OAAAA,EAAA,UAAAa,UAAA,uDAAAuB,OAAAtC,EAAA,CAAAuC,CAAAvC,GAAA,gBAAAoC,GAAAlC,GAAAA,EAAAA,EAAA,GAkEA,SA5DyB,kBANzBH,EAMyB,SAAAqd,KANzB,SAAAxc,EAAAX,GAAA,KAAAW,aAAAX,GAAA,UAAAc,UAAA,qCAMyBhC,CAAA,KAAAqe,EAAA,EANzBpd,EAMyB,EAAArF,IAAA,WAAAkE,OANzBoB,EAOEuB,KAAAE,EAOA,SAAAkC,EAAsB0O,EAAS+K,EAAiBC,GAAgB,IAAA/G,EAAAC,EAAAE,EAAAxW,EAAAqd,EAAAC,EAAAC,EAAAjQ,EAAAkQ,EAAAC,EAAAC,EAAAC,EAAA3K,EAAA,OAAA1R,KAAAC,EAAA,SAAAwC,GAAA,cAAAA,EAAAhE,GAAA,UAC1Dod,IAAoBC,EAAgB,CAAArZ,EAAAhE,EAAA,eAAAgE,EAAArD,EAAA,EAC/B0R,GAAO,OAQhB,IAJMiE,EAAa,IAAI5D,WAAWL,GAC5BkE,EAAe,IAAIC,aAAaF,EAAWhX,QAC3CmX,EAAgB,EAAM,MAEnBxW,EAAI,EAAGA,EAAIqW,EAAWhX,OAAQW,IACrCsW,EAAatW,GAAKqW,EAAWrW,GAAKwW,EA0BpC,OAtBM6G,EAAetY,KAAK6Y,KAAKtH,EAAajX,OAAS+d,EAAmBD,GAClEG,EAAiB,IAAIO,oBACzB,EACAR,EACAD,IAIIG,EAAcD,EAAe3G,aACjC,EACAL,EAAajX,OACb8d,IAGUvG,eAAe,GAAG3S,IAAIqS,IAG5BhJ,EAASgQ,EAAe7P,sBACvBC,OAAS6P,EAChBjQ,EAAO7B,QAAQ6R,EAAe3P,aAC9BL,EAAOO,QAEP9J,EAAAhE,EAAA,EAC8Bud,EAAeQ,iBAAgB,OAK7D,IALMN,EAAezZ,EAAAtD,EACfgd,EAAmBD,EAAgB5G,eAAe,GAGlD8G,EAAiB,IAAIjL,WAAWgL,EAAiBpe,QAC9CW,EAAI,EAAGA,EAAIyd,EAAiBpe,OAAQW,IACrCgT,EAASjO,KAAKC,KAAK,EAAGD,KAAK6U,IAAI,EAAG6D,EAAiBzd,KACzD0d,EAAe1d,GAAK+E,KAAKyS,MAAe,MAATxE,GAChC,OAAAjP,EAAArD,EAAA,EAEMgd,EAAehQ,QAAM,EAAAhK,EAAA,GAvD9Bqa,EAPF,eAAAje,EAAA,KAAAD,EAAAT,UAAA,WAAAyC,QAAA,SAAApD,EAAAP,GAAA,IAAAwC,EAAAX,EAAAN,MAAAK,EAAAD,GAAA,SAAA6E,EAAA3E,GAAA6B,GAAAlB,EAAAjC,EAAAP,EAAAwG,EAAAC,EAAA,OAAA5E,EAAA,UAAA4E,EAAA5E,GAAA6B,GAAAlB,EAAAjC,EAAAP,EAAAwG,EAAAC,EAAA,QAAA5E,EAAA,CAAA2E,OAAA,MA+DG,SAjDoBE,EAAAoZ,EAAAC,GAAA,OAAAF,EAAAte,MAAC,KAADL,UAAA,KAdvBU,GAAAkC,GAAAnC,EAAAC,GAAAvE,OAAA4C,eAAA0B,EAAA,aAAA8B,UAAA,IAAA9B,EAAA,IAAAA,EAAAC,EAAAC,EAOEge,CAOqB,CARE,G,2qBCwGzB,SAxGsB,oBAAAG,K,4FAAArf,CAAA,KAAAqf,EAAA,Q,EAAAA,E,EAAA,EAAAzjB,IAAA,UAAAkE,MASpB,SAAeyT,EAAS+L,EAAeC,GAA+B,IAAf9I,EAAQlW,UAAAC,OAAA,QAAAvB,IAAAsB,UAAA,GAAAA,UAAA,GAAG,GAChE,GAAI+e,IAAkBC,EACpB,OAAOhM,EAGT,GAAsB,IAAlB+L,GAA0C,IAAnBC,EACzB,OAAOhM,EAGT,GAAsB,IAAlB+L,GAA0C,IAAnBC,EAEzB,OAAOF,EAAiBG,aAAajM,EAASkD,GAGhD,GAAsB,IAAlB6I,GAA0C,IAAnBC,EAEzB,OAAOF,EAAiBI,aAAalM,EAASkD,GAGhD,MAAM,IAAIjZ,MAAM,mCAADuD,OAAoCue,EAAa,OAAAve,OAAMwe,GACxE,GAEA,CAAA3jB,IAAA,eAAAkE,MAMA,SAAoB4f,EAAUjJ,GAQ5B,IAPA,IAAMkJ,EAAiBlJ,EAAW,EAC5BoH,EAAa6B,EAASvI,WAAawI,EACnCC,EAAa,IAAInW,YAAYoU,EAAa8B,EAAiB,GAE3DjM,EAAQ,IAAItF,WAAWsR,GACvBG,EAAS,IAAIzR,WAAWwR,GAErBze,EAAI,EAAGA,EAAI0c,EAAY1c,IAK9B,IAJA,IAAM2e,EAAc3e,EAAIwe,EAClBI,EAAe5e,EAAIwe,EAAiB,EAGjCK,EAAI,EAAGA,EAAIL,EAAgBK,IAClCH,EAAOE,EAAeC,GAAKtM,EAAMoM,EAAcE,GAC/CH,EAAOE,EAAeJ,EAAiBK,GAAKtM,EAAMoM,EAAcE,GAIpE,OAAOJ,CACT,GAEA,CAAAhkB,IAAA,eAAAkE,MAMA,SAAoB8f,EAAYnJ,GAC9B,IAAMkJ,EAAiBlJ,EAAW,EAC5BoH,EAAa+B,EAAWzI,YAA+B,EAAjBwI,GACtCD,EAAW,IAAIjW,YAAYoU,EAAa8B,GAExCjM,EAAQ,IAAItF,WAAWwR,GACvBC,EAAS,IAAIzR,WAAWsR,GAE9B,GAAiB,KAAbjJ,EAEF,IAAK,IAAItV,EAAI,EAAGA,EAAI0c,EAAY1c,IAAK,CACnC,IAAM8e,EAAa9e,EAAIwe,EAAiB,EAClCO,EAAcD,EAAaN,EAE3BQ,GAAQzM,EAAMuM,GAAevM,EAAMuM,EAAa,IAAM,IAAO,IAAM,GACnEG,GAAS1M,EAAMwM,GAAgBxM,EAAMwM,EAAc,IAAM,IAAO,IAAM,GAEtEG,EAAOna,KAAKyS,OAAOwH,EAAOC,GAAS,GAEnCL,EAAe5e,EAAIwe,EACzBE,EAAOE,GAAuB,IAAPM,EACvBR,EAAOE,EAAe,GAAMM,GAAQ,EAAK,GAC3C,MAGA,IAAK,IAAIlf,EAAI,EAAGA,EAAI0c,EAAY1c,IAI9B,IAHA,IAAM2e,EAAc3e,EAAIwe,EAAiB,EACnCI,EAAe5e,EAAIwe,EAEhBK,EAAI,EAAGA,EAAIL,EAAgBK,IAClCH,EAAOE,EAAeC,GAAKtM,EAAMoM,EAAcE,GAKrD,OAAON,CACT,IArGoB,M,eAAA,M,uEAqGnB,CArGmB,G,uPCNtB,IAAA1e,EAAAC,EAAArB,EAAA,mBAAAtE,OAAAA,OAAA,GAAA4F,EAAAtB,EAAAzD,UAAA,aAAAkD,EAAAO,EAAAC,aAAA,yBAAAsB,EAAAvB,EAAAsB,EAAA7B,EAAA8B,GAAA,IAAAC,EAAAF,GAAAA,EAAA/D,qBAAAkE,EAAAH,EAAAG,EAAAC,EAAA5E,OAAA6B,OAAA6C,EAAAjE,WAAA,OAAAoE,GAAAD,EAAA,mBAAA1B,EAAAsB,EAAA7B,GAAA,IAAA8B,EAAAC,EAAAE,EAAAE,EAAA,EAAAC,EAAApC,GAAA,GAAAqC,GAAA,EAAAC,EAAA,CAAAF,EAAA,EAAAP,EAAA,EAAAU,EAAAZ,EAAAa,EAAA1C,EAAAqC,EAAArC,EAAA2C,KAAAd,EAAA,GAAA7B,EAAA,SAAA8B,EAAArB,GAAA,OAAAuB,EAAAF,EAAAG,EAAA,EAAAE,EAAAN,EAAAW,EAAAT,EAAAtB,EAAAiC,CAAA,YAAA1C,EAAAS,EAAAsB,GAAA,IAAAE,EAAAxB,EAAA0B,EAAAJ,EAAAD,EAAA,GAAAS,GAAAF,IAAAnC,GAAA4B,EAAAQ,EAAAjB,OAAAS,IAAA,KAAA5B,EAAA8B,EAAAM,EAAAR,GAAA9B,EAAAwC,EAAAF,EAAAM,EAAAZ,EAAA,GAAAvB,EAAA,GAAAP,EAAA0C,IAAAb,KAAAI,EAAAH,GAAAC,EAAAD,EAAA,OAAAC,EAAA,MAAAD,EAAA,GAAAA,EAAA,GAAAH,GAAAG,EAAA,IAAAhC,KAAAE,EAAAO,EAAA,GAAAT,EAAAgC,EAAA,KAAAC,EAAA,EAAAO,EAAAC,EAAAV,EAAAS,EAAAT,EAAAC,EAAA,IAAAhC,EAAA4C,IAAA1C,EAAAO,EAAA,GAAAuB,EAAA,GAAAD,GAAAA,EAAAa,KAAAZ,EAAA,GAAAvB,EAAAuB,EAAA,GAAAD,EAAAS,EAAAT,EAAAa,EAAAX,EAAA,OAAA/B,GAAAO,EAAA,SAAAiC,EAAA,MAAAH,GAAA,EAAAR,CAAA,iBAAA7B,EAAAoC,EAAAM,GAAA,GAAAP,EAAA,QAAAQ,UAAA,oCAAAN,GAAA,IAAAD,GAAAtC,EAAAsC,EAAAM,GAAAX,EAAAK,EAAAH,EAAAS,GAAAd,EAAAG,EAAA,EAAAJ,EAAAM,KAAAI,GAAA,CAAAP,IAAAC,EAAAA,EAAA,GAAAA,EAAA,IAAAO,EAAAT,GAAA,GAAA/B,EAAAiC,EAAAE,IAAAK,EAAAT,EAAAI,EAAAK,EAAAC,EAAAN,GAAA,OAAAE,EAAA,EAAAL,EAAA,IAAAC,IAAA/B,EAAA,QAAA4B,EAAAE,EAAA9B,GAAA,MAAA4B,EAAAA,EAAAtB,KAAAwB,EAAAG,IAAA,MAAAU,UAAA,wCAAAf,EAAAgB,KAAA,OAAAhB,EAAAK,EAAAL,EAAAnB,MAAAsB,EAAA,IAAAA,EAAA,YAAAA,IAAAH,EAAAE,EAAAe,SAAAjB,EAAAtB,KAAAwB,GAAAC,EAAA,IAAAE,EAAAU,UAAA,oCAAA3C,EAAA,YAAA+B,EAAA,GAAAD,EAAAH,CAAA,UAAAC,GAAAS,EAAAC,EAAAT,EAAA,GAAAI,EAAA1B,EAAAD,KAAAuB,EAAAS,MAAAE,EAAA,YAAAZ,GAAAE,EAAAH,EAAAI,EAAA,EAAAE,EAAAL,CAAA,SAAAO,EAAA,UAAA1B,MAAAmB,EAAAgB,KAAAP,EAAA,GAAA9B,EAAAP,EAAA8B,IAAA,GAAAG,CAAA,KAAAO,EAAA,YAAAR,IAAA,UAAAc,IAAA,UAAAC,IAAA,CAAAnB,EAAAvE,OAAA2F,eAAA,IAAAjB,EAAA,GAAAF,GAAAD,EAAAA,EAAA,GAAAC,QAAAK,GAAAN,EAAA,GAAAC,EAAA,yBAAAD,GAAAK,EAAAc,EAAAjF,UAAAkE,EAAAlE,UAAAT,OAAA6B,OAAA6C,GAAA,SAAAI,EAAAR,GAAA,OAAAtE,OAAA4F,eAAA5F,OAAA4F,eAAAtB,EAAAoB,IAAApB,EAAAuB,UAAAH,EAAAb,GAAAP,EAAA3B,EAAA,sBAAA2B,EAAA7D,UAAAT,OAAA6B,OAAA+C,GAAAN,CAAA,QAAAmB,EAAAhF,UAAAiF,EAAAb,GAAAD,EAAA,cAAAc,GAAAb,GAAAa,EAAA,cAAAD,GAAAA,EAAAK,YAAA,oBAAAjB,GAAAa,EAAA/C,EAAA,qBAAAkC,GAAAD,GAAAC,GAAAD,EAAAjC,EAAA,aAAAkC,GAAAD,EAAAJ,EAAA,yBAAAK,GAAAD,EAAA,oDAAAmB,GAAA,kBAAAC,EAAAvB,EAAAwB,EAAAnB,EAAA,cAAAD,GAAAP,EAAApB,EAAAsB,EAAAD,GAAA,IAAAE,EAAAzE,OAAA4C,eAAA,IAAA6B,EAAA,gBAAAH,GAAAG,EAAA,EAAAI,GAAA,SAAAP,EAAApB,EAAAsB,EAAAD,GAAA,SAAA5B,EAAAO,EAAAsB,GAAAK,GAAAP,EAAApB,EAAA,SAAAoB,GAAA,YAAA4B,QAAAhD,EAAAsB,EAAAF,EAAA,GAAApB,EAAAuB,EAAAA,EAAAH,EAAApB,EAAA,CAAAE,MAAAoB,EAAA3B,YAAA0B,EAAA4B,cAAA5B,EAAA6B,UAAA7B,IAAAD,EAAApB,GAAAsB,GAAA7B,EAAA,UAAAA,EAAA,WAAAA,EAAA,cAAAkC,GAAAP,EAAApB,EAAAsB,EAAAD,EAAA,UAAAoO,GAAArO,EAAApB,GAAA,IAAAqB,EAAAvE,OAAA4S,KAAAtO,GAAA,GAAAtE,OAAA6S,sBAAA,KAAAlQ,EAAA3C,OAAA6S,sBAAAvO,GAAApB,IAAAP,EAAAA,EAAAe,OAAA,SAAAR,GAAA,OAAAlD,OAAA8S,yBAAAxO,EAAApB,GAAAL,UAAA,IAAA0B,EAAAd,KAAAS,MAAAK,EAAA5B,EAAA,QAAA4B,CAAA,UAAAwO,GAAAzO,GAAA,QAAApB,EAAA,EAAAA,EAAAW,UAAAC,OAAAZ,IAAA,KAAAqB,EAAA,MAAAV,UAAAX,GAAAW,UAAAX,GAAA,GAAAA,EAAA,EAAAyP,GAAA3S,OAAAuE,IAAA,GAAAN,QAAA,SAAAf,GAAA8P,GAAA1O,EAAApB,EAAAqB,EAAArB,GAAA,GAAAlD,OAAAiT,0BAAAjT,OAAAkT,iBAAA5O,EAAAtE,OAAAiT,0BAAA1O,IAAAoO,GAAA3S,OAAAuE,IAAAN,QAAA,SAAAf,GAAAlD,OAAA4C,eAAA0B,EAAApB,EAAAlD,OAAA8S,yBAAAvO,EAAArB,GAAA,UAAAoB,CAAA,UAAA0O,GAAA1O,EAAApB,EAAAqB,GAAA,OAAArB,EAAAwD,GAAAxD,MAAAoB,EAAAtE,OAAA4C,eAAA0B,EAAApB,EAAA,CAAAE,MAAAmB,EAAA1B,YAAA,EAAAsD,cAAA,EAAAC,UAAA,IAAA9B,EAAApB,GAAAqB,EAAAD,CAAA,UAAA+B,GAAA7B,EAAAD,EAAAD,EAAApB,EAAAP,EAAAwC,EAAAT,GAAA,QAAAD,EAAAD,EAAAW,GAAAT,GAAAE,EAAAH,EAAArB,KAAA,OAAAoB,GAAA,YAAAF,EAAAE,EAAA,CAAAC,EAAAc,KAAAhB,EAAAK,GAAA0B,QAAAC,QAAA3B,GAAA4B,KAAAtD,EAAAP,EAAA,UAAA8D,GAAAnC,EAAApB,GAAA,QAAAqB,EAAA,EAAAA,EAAArB,EAAAY,OAAAS,IAAA,KAAA5B,EAAAO,EAAAqB,GAAA5B,EAAAE,WAAAF,EAAAE,aAAA,EAAAF,EAAAwD,cAAA,YAAAxD,IAAAA,EAAAyD,UAAA,GAAApG,OAAA4C,eAAA0B,EAAAoC,GAAA/D,EAAAzD,KAAAyD,EAAA,WAAA+D,GAAAnC,GAAA,IAAAE,EAAA,SAAAF,GAAA,aAAAoC,GAAApC,KAAAA,EAAA,OAAAA,EAAA,IAAAD,EAAAC,EAAA3F,OAAAgI,aAAA,YAAAtC,EAAA,KAAAG,EAAAH,EAAArB,KAAAsB,EAAArB,UAAA,aAAAyD,GAAAlC,GAAA,OAAAA,EAAA,UAAAa,UAAA,uDAAAuB,OAAAtC,EAAA,CAAAuC,CAAAvC,GAAA,gBAAAoC,GAAAlC,GAAAA,EAAAA,EAAA,GA0OA,SAxN0B,WA0BxB,OA5CFH,EAkCE,SAAAsf,EAAYC,EAAiBC,IAlC/B,SAAA3e,EAAAX,GAAA,KAAAW,aAAAX,GAAA,UAAAc,UAAA,qCAkC6ChC,CAAA,KAAAsgB,GACzCvjB,KAAKwjB,gBAAkBA,EACvBxjB,KAAKyjB,aAAeA,EACpBzjB,KAAK0jB,kBAAoB,IAAItD,GAC7BpgB,KAAK2jB,gBAAkB,GAGvB3jB,KAAK4jB,qBACP,EA1CF/gB,EA4CE,EAAAhE,IAAA,sBAAAkE,MAIA,WACE/C,KAAK2jB,gBAAkB,GAGnB3jB,KAAKyjB,aAAalK,YAAcvZ,KAAKwjB,gBAAgBjK,YACnB,QAAhCvZ,KAAKyjB,aAAalK,UACpBvZ,KAAK2jB,gBAAgBvgB,KAAK,eACkB,QAAnCpD,KAAKwjB,gBAAgBjK,WAC9BvZ,KAAK2jB,gBAAgBvgB,KAAK,aAK1BpD,KAAKyjB,aAAahK,WAAazZ,KAAKwjB,gBAAgB/J,WACnB,QAA/BzZ,KAAKyjB,aAAahK,UACpBzZ,KAAK2jB,gBAAgBvgB,KAAK,mBAEU,QAAlCpD,KAAKwjB,gBAAgB/J,UACvBzZ,KAAK2jB,gBAAgBvgB,KAAK,oBAK1BpD,KAAKyjB,aAAa1U,aAAe/O,KAAKwjB,gBAAgBzU,YACxD/O,KAAK2jB,gBAAgBvgB,KAAK,YAIxBpD,KAAKyjB,aAAa/J,WAAa1Z,KAAKwjB,gBAAgB9J,UACtD1Z,KAAK2jB,gBAAgBvgB,KAAK,oBAIxBpD,KAAKyjB,aAAa9J,WAAa3Z,KAAKwjB,gBAAgB7J,UACtD3Z,KAAK2jB,gBAAgBvgB,KAAK,mBAE9B,GAEA,CAAAvE,IAAA,kBAAAkE,MAIA,WACE,OAAO/C,KAAK2jB,gBAAgBlgB,OAAS,CACvC,GAEA,CAAA5E,IAAA,qBAAAkE,MAIA,WACE,IAAM8gB,EAAQ,GA8Bd,OA5BI7jB,KAAK2jB,gBAAgBxV,SAAS,gBAChC0V,EAAMzgB,KAAK,yBAADY,OAA0BhE,KAAKyjB,aAAalK,UAAS,YAG7DvZ,KAAK2jB,gBAAgBxV,SAAS,oBAChC0V,EAAMzgB,KAAK,UAADY,OAAWhE,KAAKyjB,aAAahK,SAAS8D,cAAa,WAG3Dvd,KAAK2jB,gBAAgBxV,SAAS,aAChC0V,EAAMzgB,KAAK,YAADY,OAAahE,KAAKyjB,aAAa1U,WAAU,SAAA/K,OAAQhE,KAAKwjB,gBAAgBzU,WAAU,OAGxF/O,KAAK2jB,gBAAgBxV,SAAS,qBAChC0V,EAAMzgB,KAAK,qBAADY,OAAsBhE,KAAKyjB,aAAa/J,SAAQ,WAAA1V,OAAUhE,KAAKwjB,gBAAgB9J,SAAQ,SAG/F1Z,KAAK2jB,gBAAgBxV,SAAS,qBAChC0V,EAAMzgB,KAAK,oBAADY,OAAqBhE,KAAKyjB,aAAa9J,SAAQ,OAAA3V,OAAMhE,KAAKwjB,gBAAgB7J,WAGlF3Z,KAAK2jB,gBAAgBxV,SAAS,oBAChC0V,EAAMzgB,KAAK,gBAADY,OAAiBhE,KAAKwjB,gBAAgB/J,SAAS8D,gBAGvDvd,KAAK2jB,gBAAgBxV,SAAS,aAChC0V,EAAMzgB,KAAK,gCAADY,OAAiChE,KAAKwjB,gBAAgBjK,UAAS,MAGpEsK,CACT,GAEA,CAAAhlB,IAAA,UAAAkE,OApIFoB,EAoIEuB,KAAAE,EAKA,SAAAkC,EAAckJ,GAAS,IAAA8S,EAAAC,EAAAC,EAAAxD,EAAA,OAAA9a,KAAAC,EAAA,SAAAwC,GAAA,cAAAA,EAAAhE,GAAA,UAChBnE,KAAKikB,kBAAmB,CAAF9b,EAAAhE,EAAA,eAAAgE,EAAArD,EAAA,EAClBkM,aAAqBtE,YAAcsE,EAAYA,EAAUc,QAAM,OAyCxE,GAtCIgS,EAAc9S,aAAqBtE,YAAcsE,EAAYA,EAAUc,OACvEiS,EAAarR,GAAA,GAAQ1S,KAAKyjB,cAG1BzjB,KAAK2jB,gBAAgBxV,SAAS,iBAC1B6V,EAAYpE,GAAmBsE,kBAAkBJ,GACvDA,EAAcE,EAAUxN,QAExBuN,EAAarR,GAAAA,GAAA,GACRqR,GAAa,IAChBxK,UAAW,MACXxK,WAAYiV,EAAUjL,OAAOhK,WAC7B4K,SAAUqK,EAAUjL,OAAOY,SAC3BD,SAAUsK,EAAUjL,OAAOW,WAE7B3V,QAAQkS,IAAI,kDAAmD+N,EAAUjL,SAIvE/Y,KAAK2jB,gBAAgBxV,SAAS,qBAChC2V,EAAc9jB,KAAK0jB,kBAAkBS,YAAYL,EAAaC,EAActK,UAC5EsK,EAActK,SAAW,MACzBsK,EAAcrK,SAAW,GACzB3V,QAAQkS,IAAI,oCAADjS,OAAqChE,KAAKyjB,aAAahK,SAAS8D,cAAa,YAI3D,KAA3BwG,EAAcrK,UAAmBqK,EAAcrK,WAAa1Z,KAAKwjB,gBAAgB9J,WAE/E1Z,KAAK2jB,gBAAgBxV,SAAS,aAC9BnO,KAAK2jB,gBAAgBxV,SAAS,qBACK,KAAlCnO,KAAKwjB,gBAAgB9J,YACxBoK,EAAcpD,GAAkB0D,QAAQN,EAAa,GAAI,IACzDC,EAAcrK,SAAW,GACzB3V,QAAQkS,IAAI,6DAKZjW,KAAK2jB,gBAAgBxV,SAAS,YAAa,CAAFhG,EAAAhE,EAAA,eAAAgE,EAAAhE,EAAA,EACvBmd,GAAoB+C,SACtCP,EACAC,EAAchV,WACd/O,KAAKwjB,gBAAgBzU,YACtB,OAJD+U,EAAW3b,EAAAtD,EAKXkf,EAAchV,WAAa/O,KAAKwjB,gBAAgBzU,WAChDhL,QAAQkS,IAAI,sCAADjS,OAAuChE,KAAKyjB,aAAa1U,WAAU,SAAA/K,OAAQhE,KAAKwjB,gBAAgBzU,WAAU,OAAM,OAyClE,OArCvD/O,KAAK2jB,gBAAgBxV,SAAS,sBAChC2V,EAAcxB,GAAiB8B,QAC7BN,EACAC,EAAcpK,SACd3Z,KAAKwjB,gBAAgB7J,SACrBoK,EAAcrK,UAEhBqK,EAAcpK,SAAW3Z,KAAKwjB,gBAAgB7J,SAC9C5V,QAAQkS,IAAI,+CAADjS,OAAgDhE,KAAKyjB,aAAa9J,SAAQ,OAAA3V,OAAMhE,KAAKwjB,gBAAgB7J,YAI9G3Z,KAAK2jB,gBAAgBxV,SAAS,sBAChC2V,EAAcpD,GAAkB0D,QAC9BN,EACAC,EAAcrK,SACd1Z,KAAKwjB,gBAAgB9J,UAEvBqK,EAAcrK,SAAW1Z,KAAKwjB,gBAAgB9J,SAC9C3V,QAAQkS,IAAI,gDAADjS,OAAiDhE,KAAKyjB,aAAa/J,SAAQ,WAAA1V,OAAUhE,KAAKwjB,gBAAgB9J,SAAQ,UAI3H1Z,KAAK2jB,gBAAgBxV,SAAS,qBAC1BqS,EAAUxgB,KAAK0jB,kBAAkBY,cAAcR,EAAa9jB,KAAKwjB,gBAAgB/J,UACvFqK,EAActD,aAAmB9T,YAAc8T,EAAUA,EAAQ1O,OACjEiS,EAActK,SAAWzZ,KAAKwjB,gBAAgB/J,SAC9C1V,QAAQkS,IAAI,0CAADjS,OAA2ChE,KAAKwjB,gBAAgB/J,SAAS8D,iBAIlFvd,KAAK2jB,gBAAgBxV,SAAS,cAChC2V,EAAclE,GAAmB2E,aAAaT,EAAaC,GAC3DA,EAAcxK,UAAY,MAC1BxV,QAAQkS,IAAI,sDAGdlS,QAAQkS,IAAI,+CAA+C9N,EAAArD,EAAA,EACpDgf,GAAW,EAAAhc,EAAA,QAlGpB0c,EApIF,eAAAtgB,EAAA,KAAAD,EAAAT,UAAA,WAAAyC,QAAA,SAAApD,EAAAP,GAAA,IAAAwC,EAAAX,EAAAN,MAAAK,EAAAD,GAAA,SAAA6E,EAAA3E,GAAA6B,GAAAlB,EAAAjC,EAAAP,EAAAwG,EAAAC,EAAA,OAAA5E,EAAA,UAAA4E,EAAA5E,GAAA6B,GAAAlB,EAAAjC,EAAAP,EAAAwG,EAAAC,EAAA,QAAA5E,EAAA,CAAA2E,OAAA,MAuOG,SA9FYE,GAAA,OAAAwb,EAAA3gB,MAAC,KAADL,UAAA,KAzIfX,GAAAuD,GAAAnC,EAAA7D,UAAAyC,GAAAlD,OAAA4C,eAAA0B,EAAA,aAAA8B,UAAA,IAAA9B,EAAA,IAAAA,EAAApB,EAAAsB,EAoIEqgB,CAKa,CAvHW,G,qzBClB1B,IAAAvgB,EAAAC,EAAArB,EAAA,mBAAAtE,OAAAA,OAAA,GAAA4F,EAAAtB,EAAAzD,UAAA,aAAAkD,EAAAO,EAAAC,aAAA,yBAAAsB,EAAAvB,EAAAsB,EAAA7B,EAAA8B,GAAA,IAAAC,EAAAF,GAAAA,EAAA/D,qBAAAkE,EAAAH,EAAAG,EAAAC,EAAA5E,OAAA6B,OAAA6C,EAAAjE,WAAA,OAAAoE,GAAAD,EAAA,mBAAA1B,EAAAsB,EAAA7B,GAAA,IAAA8B,EAAAC,EAAAE,EAAAE,EAAA,EAAAC,EAAApC,GAAA,GAAAqC,GAAA,EAAAC,EAAA,CAAAF,EAAA,EAAAP,EAAA,EAAAU,EAAAZ,EAAAa,EAAA1C,EAAAqC,EAAArC,EAAA2C,KAAAd,EAAA,GAAA7B,EAAA,SAAA8B,EAAArB,GAAA,OAAAuB,EAAAF,EAAAG,EAAA,EAAAE,EAAAN,EAAAW,EAAAT,EAAAtB,EAAAiC,CAAA,YAAA1C,EAAAS,EAAAsB,GAAA,IAAAE,EAAAxB,EAAA0B,EAAAJ,EAAAD,EAAA,GAAAS,GAAAF,IAAAnC,GAAA4B,EAAAQ,EAAAjB,OAAAS,IAAA,KAAA5B,EAAA8B,EAAAM,EAAAR,GAAA9B,EAAAwC,EAAAF,EAAAM,EAAAZ,EAAA,GAAAvB,EAAA,GAAAP,EAAA0C,IAAAb,KAAAI,EAAAH,GAAAC,EAAAD,EAAA,OAAAC,EAAA,MAAAD,EAAA,GAAAA,EAAA,GAAAH,GAAAG,EAAA,IAAAhC,KAAAE,EAAAO,EAAA,GAAAT,EAAAgC,EAAA,KAAAC,EAAA,EAAAO,EAAAC,EAAAV,EAAAS,EAAAT,EAAAC,EAAA,IAAAhC,EAAA4C,IAAA1C,EAAAO,EAAA,GAAAuB,EAAA,GAAAD,GAAAA,EAAAa,KAAAZ,EAAA,GAAAvB,EAAAuB,EAAA,GAAAD,EAAAS,EAAAT,EAAAa,EAAAX,EAAA,OAAA/B,GAAAO,EAAA,SAAAiC,EAAA,MAAAH,GAAA,EAAAR,CAAA,iBAAA7B,EAAAoC,EAAAM,GAAA,GAAAP,EAAA,QAAAQ,UAAA,oCAAAN,GAAA,IAAAD,GAAAtC,EAAAsC,EAAAM,GAAAX,EAAAK,EAAAH,EAAAS,GAAAd,EAAAG,EAAA,EAAAJ,EAAAM,KAAAI,GAAA,CAAAP,IAAAC,EAAAA,EAAA,GAAAA,EAAA,IAAAO,EAAAT,GAAA,GAAA/B,EAAAiC,EAAAE,IAAAK,EAAAT,EAAAI,EAAAK,EAAAC,EAAAN,GAAA,OAAAE,EAAA,EAAAL,EAAA,IAAAC,IAAA/B,EAAA,QAAA4B,EAAAE,EAAA9B,GAAA,MAAA4B,EAAAA,EAAAtB,KAAAwB,EAAAG,IAAA,MAAAU,UAAA,wCAAAf,EAAAgB,KAAA,OAAAhB,EAAAK,EAAAL,EAAAnB,MAAAsB,EAAA,IAAAA,EAAA,YAAAA,IAAAH,EAAAE,EAAAe,SAAAjB,EAAAtB,KAAAwB,GAAAC,EAAA,IAAAE,EAAAU,UAAA,oCAAA3C,EAAA,YAAA+B,EAAA,GAAAD,EAAAH,CAAA,UAAAC,GAAAS,EAAAC,EAAAT,EAAA,GAAAI,EAAA1B,EAAAD,KAAAuB,EAAAS,MAAAE,EAAA,YAAAZ,GAAAE,EAAAH,EAAAI,EAAA,EAAAE,EAAAL,CAAA,SAAAO,EAAA,UAAA1B,MAAAmB,EAAAgB,KAAAP,EAAA,GAAA9B,EAAAP,EAAA8B,IAAA,GAAAG,CAAA,KAAAO,EAAA,YAAAR,IAAA,UAAAc,IAAA,UAAAC,IAAA,CAAAnB,EAAAvE,OAAA2F,eAAA,IAAAjB,EAAA,GAAAF,GAAAD,EAAAA,EAAA,GAAAC,QAAAK,GAAAN,EAAA,GAAAC,EAAA,yBAAAD,GAAAK,EAAAc,EAAAjF,UAAAkE,EAAAlE,UAAAT,OAAA6B,OAAA6C,GAAA,SAAAI,EAAAR,GAAA,OAAAtE,OAAA4F,eAAA5F,OAAA4F,eAAAtB,EAAAoB,IAAApB,EAAAuB,UAAAH,EAAAb,GAAAP,EAAA3B,EAAA,sBAAA2B,EAAA7D,UAAAT,OAAA6B,OAAA+C,GAAAN,CAAA,QAAAmB,EAAAhF,UAAAiF,EAAAb,GAAAD,EAAA,cAAAc,GAAAb,GAAAa,EAAA,cAAAD,GAAAA,EAAAK,YAAA,oBAAAjB,GAAAa,EAAA/C,EAAA,qBAAAkC,GAAAD,GAAAC,GAAAD,EAAAjC,EAAA,aAAAkC,GAAAD,EAAAJ,EAAA,yBAAAK,GAAAD,EAAA,oDAAAmB,GAAA,kBAAAC,EAAAvB,EAAAwB,EAAAnB,EAAA,cAAAD,GAAAP,EAAApB,EAAAsB,EAAAD,GAAA,IAAAE,EAAAzE,OAAA4C,eAAA,IAAA6B,EAAA,gBAAAH,GAAAG,EAAA,EAAAI,GAAA,SAAAP,EAAApB,EAAAsB,EAAAD,GAAA,SAAA5B,EAAAO,EAAAsB,GAAAK,GAAAP,EAAApB,EAAA,SAAAoB,GAAA,YAAA4B,QAAAhD,EAAAsB,EAAAF,EAAA,GAAApB,EAAAuB,EAAAA,EAAAH,EAAApB,EAAA,CAAAE,MAAAoB,EAAA3B,YAAA0B,EAAA4B,cAAA5B,EAAA6B,UAAA7B,IAAAD,EAAApB,GAAAsB,GAAA7B,EAAA,UAAAA,EAAA,WAAAA,EAAA,cAAAkC,GAAAP,EAAApB,EAAAsB,EAAAD,EAAA,UAAA8B,GAAA7B,EAAAD,EAAAD,EAAApB,EAAAP,EAAAwC,EAAAT,GAAA,QAAAD,EAAAD,EAAAW,GAAAT,GAAAE,EAAAH,EAAArB,KAAA,OAAAoB,GAAA,YAAAF,EAAAE,EAAA,CAAAC,EAAAc,KAAAhB,EAAAK,GAAA0B,QAAAC,QAAA3B,GAAA4B,KAAAtD,EAAAP,EAAA,UAAA0K,GAAA7I,GAAA,sBAAAD,EAAA,KAAAD,EAAAT,UAAA,WAAAyC,QAAA,SAAApD,EAAAP,GAAA,IAAAwC,EAAAX,EAAAN,MAAAK,EAAAD,GAAA,SAAA6E,EAAA3E,GAAA6B,GAAAlB,EAAAjC,EAAAP,EAAAwG,EAAAC,EAAA,OAAA5E,EAAA,UAAA4E,EAAA5E,GAAA6B,GAAAlB,EAAAjC,EAAAP,EAAAwG,EAAAC,EAAA,QAAA5E,EAAA,CAAA2E,OAAA,eAAA1C,GAAAnC,EAAApB,GAAA,QAAAqB,EAAA,EAAAA,EAAArB,EAAAY,OAAAS,IAAA,KAAA5B,EAAAO,EAAAqB,GAAA5B,EAAAE,WAAAF,EAAAE,aAAA,EAAAF,EAAAwD,cAAA,YAAAxD,IAAAA,EAAAyD,UAAA,GAAApG,OAAA4C,eAAA0B,EAAAoC,GAAA/D,EAAAzD,KAAAyD,EAAA,WAAAoE,KAAA,QAAAxC,GAAAyC,QAAAvG,UAAAwG,QAAAhE,KAAAiE,QAAAC,UAAAH,QAAA,wBAAAzC,GAAA,QAAAwC,GAAA,mBAAAxC,CAAA,cAAA6C,GAAA7C,GAAA,OAAA6C,GAAApH,OAAA4F,eAAA5F,OAAA2F,eAAAP,OAAA,SAAAb,GAAA,OAAAA,EAAAsB,WAAA7F,OAAA2F,eAAApB,EAAA,EAAA6C,GAAA7C,EAAA,UAAA8C,GAAA9C,EAAAD,GAAA,OAAA+C,GAAArH,OAAA4F,eAAA5F,OAAA4F,eAAAR,OAAA,SAAAb,EAAAD,GAAA,OAAAC,EAAAsB,UAAAvB,EAAAC,CAAA,EAAA8C,GAAA9C,EAAAD,EAAA,UAAA0O,GAAA1O,EAAApB,EAAAqB,GAAA,OAAArB,EAAAwD,GAAAxD,MAAAoB,EAAAtE,OAAA4C,eAAA0B,EAAApB,EAAA,CAAAE,MAAAmB,EAAA1B,YAAA,EAAAsD,cAAA,EAAAC,UAAA,IAAA9B,EAAApB,GAAAqB,EAAAD,CAAA,UAAAoC,GAAAnC,GAAA,IAAAE,EAAA,SAAAF,GAAA,aAAAoC,GAAApC,KAAAA,EAAA,OAAAA,EAAA,IAAAD,EAAAC,EAAA3F,OAAAgI,aAAA,YAAAtC,EAAA,KAAAG,EAAAH,EAAArB,KAAAsB,EAAArB,UAAA,aAAAyD,GAAAlC,GAAA,OAAAA,EAAA,UAAAa,UAAA,uDAAAuB,OAAAtC,EAAA,CAAAuC,CAAAvC,GAAA,gBAAAoC,GAAAlC,GAAAA,EAAAA,EAAA,GAWA,IAwCMqgB,GAAW,SAAAxd,GA4Bf,SAAAwd,IAAyB,IAAAtd,EAAbxI,EAAM6E,UAAAC,OAAA,QAAAvB,IAAAsB,UAAA,GAAAA,UAAA,GAAG,CAAC,EAwIjB,OAvNP,SAAAsB,EAAAX,GAAA,KAAAW,aAAAX,GAAA,UAAAc,UAAA,qCA+EyBhC,CAAA,KAAAwhB,IAErBtd,EAjFJ,SAAAjD,EAAA5B,EAAA2B,GAAA,OAAA3B,EAAAyE,GAAAzE,GAAA,SAAA4B,EAAAD,GAAA,GAAAA,IAAA,UAAAqC,GAAArC,IAAA,mBAAAA,GAAA,OAAAA,EAAA,YAAAA,EAAA,UAAAgB,UAAA,4EAAAhB,GAAA,YAAAA,EAAA,UAAAmD,eAAA,oEAAAnD,CAAA,CAAAoD,CAAAnD,EAAA,CAAAoD,CAAApD,EAAAwC,KAAAG,QAAAC,UAAAxE,EAAA2B,GAAA,GAAA8C,GAAA7C,GAAAtD,aAAA0B,EAAAuB,MAAAK,EAAAD,GAAA,CAiFIsD,CAAA,KAAAkd,IAIKC,QAAU,QAIfvd,EAAKxI,OAAS,CAIZ0M,aAAc1M,EAAO0M,cAAgB,oCAErC0H,QAASpU,EAAOoU,QAEhBC,MAAOrU,EAAOqU,MAMdjE,WAAYpQ,EAAOoQ,YAAc,KAEjC4K,SAAUhb,EAAOgb,UAAY,EAE7BD,SAAU/a,EAAO+a,UAAY,GAM7BnM,mBAAoB5O,EAAO4O,mBAM3BoX,gBAAiBhmB,EAAOgmB,iBAAmBxd,EAAKyd,oBAAoBjmB,GAEpEkmB,eAAgBlmB,EAAOkmB,gBAAkBlmB,EAAOmmB,aAAe,MAE/DtD,iBAAkB7iB,EAAO6iB,kBAAoB,KAE7CgB,eAAgB7jB,EAAO6jB,gBAAkB,EAEzCnF,eAAgB1e,EAAO0e,gBAAkB,GAGzC0H,sBAAuBpmB,EAAOomB,uBAAyB,IAMvDD,YAAanmB,EAAOmmB,YAMpB1R,sBAAuBzU,EAAOyU,uBAAyB,KAEvDG,eAAwC,IAAzB5U,EAAO4U,cAMtByR,gBAAiBrmB,EAAOqmB,iBAAmB,GAQ7C7d,EAAKsD,aAAc,EAEnBtD,EAAK8d,kBAAmB,EAExB9d,EAAKmG,aAAc,EAEnBnG,EAAK0J,WAAY,EAEjB1J,EAAKkM,aAAc,EAEnBlM,EAAK+d,kBAAoB,KAEzB/d,EAAKge,sBAAwB,KAE7Bhe,EAAKie,gBAAkB,KAEvBje,EAAKke,UAAY,KAMjBle,EAAKsM,YAAc,IAAI9C,GAAYxJ,EAAKxI,QAExCwI,EAAKqM,cAAgB,IAAItG,GAAc/F,EAAKxI,QAW5CwI,EAAKme,yBAELne,EAAKoe,2BAMLpe,EAAKqe,iBAILzhB,QAAQkS,IAAI,8BAA+B,CAEzCyO,QAASvd,EAAKud,QAEdC,gBAAiBxd,EAAKxI,OAAOgmB,gBAE7BE,eAAgB1d,EAAKxI,OAAOkmB,eAE5BrD,iBAAkBra,EAAKxI,OAAO6iB,mBAE7Bra,CAEL,CAIA,OA7NF,SAAAjD,EAAAD,GAAA,sBAAAA,GAAA,OAAAA,EAAA,UAAAgB,UAAA,sDAAAf,EAAA9D,UAAAT,OAAA6B,OAAAyC,GAAAA,EAAA7D,UAAA,CAAAQ,YAAA,CAAAmC,MAAAmB,EAAA6B,UAAA,EAAAD,cAAA,KAAAnG,OAAA4C,eAAA2B,EAAA,aAAA6B,UAAA,IAAA9B,GAAA+C,GAAA9C,EAAAD,EAAA,CA6NE4D,CAAA4c,EAAAxd,GA7NFhD,EA6NEwgB,EA7NF5hB,EA6NE,EAAAhE,IAAA,sBAAAkE,MAMA,SAAoBpE,GAIlB,MAA2B,QAAvBA,EAAOmmB,YAEF,MAMF,KAET,GAIA,CAAAjmB,IAAA,sBAAAkE,MAUA,SAAoBgW,GAAQ,IAAAO,EAE1B,IAAKP,EAEH,MAAO,2BAMT,IAAMU,EAA0B,QAAlBH,EAAGP,EAAOU,gBAAQ,IAAAH,OAAA,EAAfA,EAAiBE,cAElC,OAAKC,GAAagL,EAAYgB,0BAA0BtX,SAASsL,GAQ5DV,EAAOhK,YAAe0V,EAAYiB,6BAA6BvX,SAAS4K,EAAOhK,YAQ/EgK,EAAOW,UAAa+K,EAAYkB,2BAA2BxX,SAAS4K,EAAOW,UAQ3EX,EAAOY,UAAa8K,EAAYmB,yBAAyBzX,SAAS4K,EAAOY,UAQvE,KANE,+BAAP3V,OAAsC+U,EAAOY,SAAQ,iBAAA3V,OAAgBygB,EAAYmB,yBAAyBC,KAAK,OARxG,gCAAP7hB,OAAuC+U,EAAOW,SAAQ,iBAAA1V,OAAgBygB,EAAYkB,2BAA2BE,KAAK,OAR3G,kCAAP7hB,OAAyC+U,EAAOhK,WAAU,iBAAA/K,OAAgBygB,EAAYiB,6BAA6BG,KAAK,OARjH,+BAAP7hB,OAAsC+U,EAAOU,SAAQ,iBAAAzV,OAAgBygB,EAAYgB,0BAA0BI,KAAK,MAgCpH,GAIA,CAAAhnB,IAAA,uBAAAkE,MAUA,SAAqBgW,GAAQ,IAAA+M,EAAAzM,EAE3B,IAAKN,EAEH,MAAO,4BAMT,IAAMU,EAA0B,QAAlBqM,EAAG/M,EAAOU,gBAAQ,IAAAqM,OAAA,EAAfA,EAAiBtM,cAElC,IAAKC,IAAagL,EAAYsB,2BAA2B5X,SAASsL,GAEhE,MAAO,gCAAPzV,OAAuC+U,EAAOU,SAAQ,iBAAAzV,OAAgBygB,EAAYsB,2BAA2BF,KAAK,OAMpH,IAAK9M,EAAOhK,aAAe0V,EAAYuB,8BAA8B7X,SAAS4K,EAAOhK,YAEnF,MAAO,mCAAP/K,OAA0C+U,EAAOhK,WAAU,iBAAA/K,OAAgBygB,EAAYuB,8BAA8BH,KAAK,OAM5H,IAAK9M,EAAOW,WAAa+K,EAAYwB,4BAA4B9X,SAAS4K,EAAOW,UAE/E,MAAO,iCAAP1V,OAAwC+U,EAAOW,SAAQ,iBAAA1V,OAAgBygB,EAAYwB,4BAA4BJ,KAAK,OAMtH,IAAK9M,EAAOY,WAAa8K,EAAYyB,0BAA0B/X,SAAS4K,EAAOY,UAE7E,MAAO,gCAAP3V,OAAuC+U,EAAOY,SAAQ,iBAAA3V,OAAgBygB,EAAYyB,0BAA0BL,KAAK,OAMnH,IAAMtM,EAA4B,QAAnBF,EAAGN,EAAOQ,iBAAS,IAAAF,OAAA,EAAhBA,EAAkBG,cAEpC,OAAKD,GAAckL,EAAY0B,4BAA4BhY,SAASoL,GAQ7D,KANE,iCAAPvV,OAAwC+U,EAAOQ,UAAS,iBAAAvV,OAAgBygB,EAAY0B,4BAA4BN,KAAK,MAQzH,GAIA,CAAAhnB,IAAA,iBAAAkE,MAMA,WAIE,IAAMqjB,EAAc,CAElB3M,SAAU,MAEV1K,WAAY/O,KAAKrB,OAAOoQ,WAExB4K,SAAU3Z,KAAKrB,OAAOgb,SAEtBD,SAAU1Z,KAAKrB,OAAO+a,UAMlB2M,EAAarmB,KAAKsmB,oBAAoBF,GAE5C,GAAIC,EAMF,OAJAtiB,QAAQD,MAAM,uCAAwCuiB,QAEtDrmB,KAAK4I,KAAK,QAAS,IAAInI,MAAM4lB,IAU/B,IAAMtO,EAAe,CAEnB0B,SAAUzZ,KAAKrB,OAAOkmB,eAEtB9V,WAAY/O,KAAKrB,OAAO6iB,iBAExB7H,SAAU3Z,KAAKrB,OAAO6jB,eAEtB9I,SAAU1Z,KAAKrB,OAAO0e,eAEtB9D,UAAWvZ,KAAKrB,OAAOgmB,iBAMnB4B,EAAcvmB,KAAKwmB,qBAAqBzO,GAE9C,GAAIwO,EAMF,OAJAxiB,QAAQD,MAAM,wCAAyCyiB,QAEvDvmB,KAAK4I,KAAK,QAAS,IAAInI,MAAM8lB,IAQ/BxiB,QAAQkS,IAAI,0CAEd,GAIA,CAAApX,IAAA,yBAAAkE,MAMA,WAAyB,IAAAmF,EAAA,KAEvBlI,KAAKyT,YAAY3H,GAAG,kBAAmB,WAErC5D,EAAK2I,WAAY,EAEjB3I,EAAKU,KAAK,mBAMNV,EAAKuC,aAEP1G,QAAQkS,IAAI,mEAEZ/N,EAAKkM,YAAY,CAAElQ,EAAG,2BAItBH,QAAQwI,KAAK,oEAIjB,GAIAvM,KAAKyT,YAAY3H,GAAG,kBAAmB,WAErC5D,EAAK2I,WAAY,EAEjB3I,EAAKU,KAAK,mBAMNV,EAAKuC,aAEP1G,QAAQkS,IAAI,mEAEZ/N,EAAKkM,YAAY,CAAElQ,EAAG,2BAItBH,QAAQwI,KAAK,oEAIjB,GAIAvM,KAAKyT,YAAY3H,GAAG,gBAAiB,SAAChI,GAEpCoE,EAAKU,KAAK,gBAAiB9E,GAE3BoE,EAAKU,KAAK,QAAS9E,EAErB,EAEF,GAIA,CAAAjF,IAAA,2BAAAkE,MAMA,WAA2B,IAAA0I,EAAA,KAEzBzL,KAAKwT,cAAc1H,GAAG,mBAAoB,WAExCL,EAAK6B,aAAc,EAQnB,IAAMmZ,EAAoBhb,EAAKgI,YAAYiT,YAErCC,EAAqBF,EAAkBxO,kBAAoBwO,EAAkBxO,iBAAmB,GAE3EwO,EAAkB9G,uBAAyB8G,EAAkB9G,sBAAwB,EAE1GiH,EAAoBnb,EAAKoF,WAAa4V,EAAkB5V,WAAa8V,EAI3E5iB,QAAQkS,IAAI,gEAEZlS,QAAQkS,IAAI,yBAA0BxK,EAAKoF,WAE3C9M,QAAQkS,IAAI,4BAA6BwQ,EAAkB5V,WAE3D9M,QAAQkS,IAAI,uBAAwBwQ,EAAkBxO,kBAAoB,GAE1ElU,QAAQkS,IAAI,4BAA6BwQ,EAAkB9G,uBAAyB,GAEpF5b,QAAQkS,IAAI,2BAA4BwQ,EAAkB/G,sBAAwB,GAElF3b,QAAQkS,IAAI,wBAAyB2Q,GAIjCA,GAEF7iB,QAAQkS,IAAI,iEAIZxK,EAAKgI,YAAYtB,gBAEjBpO,QAAQkS,IAAI,yCAIRxK,EAAKhB,aAEPgB,EAAK2I,YAAY,CAAElQ,EAAG,aAEtBH,QAAQkS,IAAI,oDAIZlS,QAAQwI,KAAK,yDAMfxI,QAAQkS,IAAI,4DAMdxK,EAAK7C,KAAK,mBAEZ,GAIA5I,KAAKwT,cAAc1H,GAAG,mBAAoB,WAExCL,EAAK6B,aAAc,EAEnB7B,EAAKob,iBAAkB,EAEvBpb,EAAK7C,KAAK,oBAEV7E,QAAQkS,IAAI,oCAEd,GAIAjW,KAAKwT,cAAc1H,GAAG,YAAa,SAAC0K,GAMlC,IAAK/K,EAAKob,iBAAmBpb,EAAK6B,YAAa,CAE7C7B,EAAKob,iBAAkB,EAIvB,IAAMJ,EAAoBhb,EAAKgI,YAAYiT,YAErCC,EAAqBF,EAAkBxO,kBAAoBwO,EAAkBxO,iBAAmB,GAE3EwO,EAAkB9G,uBAAyB8G,EAAkB9G,sBAAwB,GAEtFlU,EAAKoF,WAAa4V,EAAkB5V,WAAa8V,KAMzE5iB,QAAQkS,IAAI,qFAEZlS,QAAQkS,IAAI,yBAA0BxK,EAAKoF,WAE3C9M,QAAQkS,IAAI,4BAA6BwQ,EAAkB5V,WAE3D9M,QAAQkS,IAAI,uBAAwBwQ,EAAkBxO,kBAAoB,GAE1ElU,QAAQkS,IAAI,4BAA6BwQ,EAAkB9G,uBAAyB,GAIpFlU,EAAKgI,YAAYtB,gBAEjBpO,QAAQkS,IAAI,yCAIRxK,EAAKhB,cAEPgB,EAAK2I,YAAY,CAAElQ,EAAG,aAEtBH,QAAQkS,IAAI,oDAMlB,CAQIxK,EAAKhB,aACPgB,EAAK4I,WAAWmC,EAGpB,GAIAxW,KAAKwT,cAAc1H,GAAG,QAAS,SAAChI,GAE9BC,QAAQD,MAAM,yBAA0BA,GAExC2H,EAAK7C,KAAK,QAAS9E,EAErB,EAEF,GAIA,CAAAjF,IAAA,oBAAAkE,MAMA,WAEE,IAAM+jB,EAAU9mB,KAAKrB,OAAO0M,aAEtBmJ,EAAS,IAAIC,gBAwBnB,GAlBIzU,KAAKrB,OAAOoU,SAEdyB,EAAOE,OAAO,UAAW1U,KAAKrB,OAAOoU,SAMnC/S,KAAKrB,OAAOqU,OAEdwB,EAAOE,OAAO,QAAS1U,KAAKrB,OAAOqU,OAQjCwB,EAAOzJ,WAAY,CAErB,IAAM4J,EAAYmS,EAAQ3Y,SAAS,KAAO,IAAM,IAEhD,MAAO,GAAPnK,OAAU8iB,GAAO9iB,OAAG2Q,GAAS3Q,OAAGwQ,EAAOzJ,WAEzC,CAIA,OAAO+b,CAET,GAIA,CAAAjoB,IAAA,UAAAkE,OAAAyI,EAAAwB,GAAAtH,KAAAE,EAMA,SAAAkC,IAAA,IAAAwM,EAAA5F,EAAAjC,EAAA,YAAA/G,KAAAC,EAAA,SAAAwC,GAAA,cAAAA,EAAAzD,EAAAyD,EAAAhE,GAAA,WAEMnE,KAAKqT,YAAa,CAAFlL,EAAAhE,EAAA,QAE6C,OAA/DJ,QAAQwI,KAAK,kDAAkDpE,EAAArD,EAAA,GAExD,GAAK,WAMV9E,KAAKyK,YAAa,CAAFtC,EAAAhE,EAAA,QAE6B,OAA/CJ,QAAQwI,KAAK,kCAAkCpE,EAAArD,EAAA,GAExC,GAAI,OAYyC,OAZzCqD,EAAAzD,EAAA,EAUL4P,EAAQtU,KAAKuU,oBAEnBxQ,QAAQkS,IAAI,gCAAiC3B,GAAOnM,EAAAhE,EAAA,EAIvC,IAAI8B,QAAQ,SAACC,EAASyE,GAEjC8B,EAAK4Y,UAAY,IAAI5c,UAAU6L,GAM/B7H,EAAK4Y,UAAU0B,OAAS,WAEtBhjB,QAAQkS,IAAI,sCAEZxJ,EAAKhC,aAAc,EAEnBgC,EAAKwY,kBAAmB,EAMxBxY,EAAKkH,mBAILlH,EAAK7D,KAAK,aAEV1C,GAAQ,EAEV,EAMAuG,EAAK4Y,UAAU2B,QAAU,SAACljB,GAExBC,QAAQD,MAAM,kCAAmCA,GAEjD6G,EAAO7G,EAET,EAMA2I,EAAK4Y,UAAU4B,QAAU,SAAC9jB,GAExBY,QAAQkS,IAAI,oCAAqC9S,EAAMyQ,KAAMzQ,EAAM0Q,QAEnEpH,EAAKhC,aAAc,EAMfgC,EAAKa,aAEPb,EAAKsH,gBAAgBxI,MAAM,SAAArB,GAAG,OAE5BnG,QAAQD,MAAM,4BAA6BoG,EAAI,GAQnDuC,EAAK7D,KAAK,eAAgBzF,GAQtBsJ,EAAK9N,OAAO4U,gBAAkB9G,EAAK4G,aAAe5G,EAAKwY,kBAEzDlhB,QAAQkS,IAAI,8CAEZ1N,WAAW,WAEJkE,EAAK4G,aAAgB5G,EAAKhC,aAE7BgC,EAAKoD,SAIT,EAAG,MAEMpD,EAAK9N,OAAO4U,gBAAkB9G,EAAKwY,kBAE5ClhB,QAAQkS,IAAI,4FAIhB,EAMAxJ,EAAK4Y,UAAUtV,UAAY,SAAC5M,GAE1BsJ,EAAKZ,cAAc1I,EAErB,CAEF,GAAE,cAAAgF,EAAArD,EAAA,EAAAqD,EAAAtD,GAAA,OAQwB,OARxBsD,EAAAzD,EAAA,EAAAgK,EAAAvG,EAAAtD,EAMFd,QAAQD,MAAM,qCAAoC4K,GAElD1O,KAAK4I,KAAK,QAAO8F,GAASvG,EAAArD,EAAA,GAEnB,GAAK,EAAAgD,EAAA,iBAIf,WA1JY,OAAA0D,EAAA3H,MAAC,KAADL,UAAA,IA8Jb,CAAA3E,IAAA,mBAAAkE,MAMA,WAEE,GAAK/C,KAAKyK,YAAV,CAYA,IAAM2b,EAAc,CAElB3M,SAAU,MAEV1K,WAAY/O,KAAKrB,OAAOoQ,WAExB4K,SAAU3Z,KAAKrB,OAAOgb,SAEtBD,SAAU1Z,KAAKrB,OAAO+a,UAQlByL,EAAwB,CAE5B1L,SAAUzZ,KAAKrB,OAAOkmB,eAEtB9V,WAAY/O,KAAKrB,OAAO6iB,iBAExB7H,SAAU3Z,KAAKrB,OAAO6jB,eAEtB9I,SAAU1Z,KAAKrB,OAAO0e,eAEtB9D,UAAWvZ,KAAKrB,OAAOgmB,iBAQnB0B,EAAarmB,KAAKsmB,oBAAoBF,GAE5C,GAAIC,EAMF,OAJAtiB,QAAQD,MAAM,2DAA4DuiB,QAE1ErmB,KAAK4I,KAAK,QAAS,IAAInI,MAAM,yBAADuD,OAA0BqiB,KAQxD,IAAME,EAAcvmB,KAAKwmB,qBAAqBrB,GAE9C,GAAIoB,EAMF,OAJAxiB,QAAQD,MAAM,4DAA6DyiB,QAE3EvmB,KAAK4I,KAAK,QAAS,IAAInI,MAAM,0BAADuD,OAA2BuiB,KAUzD,IAAMvQ,EAAe,CAEnB9R,EAAG,QAEHW,EAAG7E,KAAKrB,OAAOqmB,gBAEfoB,YAAaA,EAEbjB,sBAAuBA,EAEvBJ,sBAAuB/kB,KAAKrB,OAAOomB,uBAQjC/kB,KAAKrB,OAAOyU,wBAEd4C,EAAa5C,sBAAwBpT,KAAKrB,OAAOyU,uBAYnDrP,QAAQkS,IAAI,iCAAkC,CAE5CyO,QAAS1O,EAAanR,EAEtB2e,gBAAiBxN,EAAamP,wBAIhCphB,QAAQkS,IAAI,2CAA4C,CAEtDsD,UAAWvD,EAAamP,sBAAsB5L,UAE9CE,SAAUzD,EAAamP,sBAAsB1L,SAE7C1K,WAAYiH,EAAamP,sBAAsBpW,WAE/C2K,SAAU1D,EAAamP,sBAAsBzL,WAM/C,IAEE1Z,KAAKoU,YAAY4B,EAEnB,CAAE,MAAOlS,GAEPC,QAAQD,MAAM,qCAAsCA,GAEpD9D,KAAK4I,KAAK,QAAS9E,EAErB,CAtIA,MAJEC,QAAQwI,KAAK,iDA4IjB,GAIA,CAAA1N,IAAA,gBAAAkE,MAMA,SAAcI,GAIZ,GAAIA,EAAMqJ,gBAAgBE,aAAevJ,EAAMqJ,gBAAgBG,KAE7D3M,KAAKknB,oBAAoB/jB,EAAMqJ,WAUjC,IAEE,IAAMP,EAAUI,KAAKQ,MAAM1J,EAAMqJ,MAQjC,OAJAzI,QAAQkS,IAAI,oCAAqChK,EAAQ/H,GAIjD+H,EAAQ/H,GAEd,IAAK,YAEHlE,KAAKmnB,eAAelb,GAEpB,MAIF,IAAK,kBAEL,IAAK,iBAEL,IAAK,QAEHjM,KAAK4I,KAAK,UAAWqD,GAErB,MAIF,IAAK,WAEHjM,KAAK4I,KAAK,UAAWqD,GAErBjM,KAAKyT,YAAYtB,gBAEjB,MAIF,IAAK,eAEHnS,KAAK4I,KAAK,cAAeqD,GAEzBjM,KAAKyT,YAAYtB,gBAEjB,MAIF,QAEEpO,QAAQkS,IAAI,qCAAsChK,EAAQ/H,GAE1DlE,KAAK4I,KAAK,UAAWqD,GAM3B,CAAE,MAAOnI,GAEPC,QAAQD,MAAM,sCAAuCA,EAEvD,CAEF,GAIA,CAAAjF,IAAA,iBAAAkE,MAMA,SAAekJ,GAUb,GARAlI,QAAQkS,IAAI,sCAAuC,CACjDmR,kBAAmBnb,EAAQiZ,kBAC3BnN,aAAc9L,EAAQiZ,kBACtBmC,YAAapb,EAAQ/H,IAKnB+H,EAAQiZ,kBAAmB,CAI7BllB,KAAKklB,kBAAoBjZ,EAAQiZ,kBAEjCllB,KAAKyT,YAAY6T,gBAAgBrb,EAAQiZ,mBAIzCnhB,QAAQkS,IAAI,8CAA+CjW,KAAKklB,mBAGhEllB,KAAKmlB,sBAAwB,CAC3B5L,UAAWvZ,KAAKrB,OAAOgmB,iBAAmB,MAC1ClL,SAAUzZ,KAAKrB,OAAOkmB,gBAAkB,MACxC9V,WAAY/O,KAAKrB,OAAO6iB,kBAAoB,KAC5C9H,SAAU1Z,KAAKrB,OAAO0e,gBAAkB,GACxC1D,SAAU3Z,KAAKrB,OAAO6jB,gBAAkB,GAG1C,IAAM+E,EAAmB,CACvBhO,UAAWvZ,KAAKklB,kBAAkB3L,WAAa,UAC/CE,SAAUzZ,KAAKklB,kBAAkBzL,UAAY,UAC7C1K,WAAY/O,KAAKklB,kBAAkBnW,YAAc,EACjD2K,SAAU1Z,KAAKklB,kBAAkBxL,UAAY,EAC7CC,SAAU3Z,KAAKklB,kBAAkBvL,UAAY,GAIzC6N,EAAa,GAiBnB,GAhBIxnB,KAAKmlB,sBAAsB5L,YAAcgO,EAAiBhO,WAC5DiO,EAAWpkB,KAAK,eAADY,OAAgBhE,KAAKmlB,sBAAsB5L,UAAS,SAAAvV,OAAQujB,EAAiBhO,UAAS,MAEnGvZ,KAAKmlB,sBAAsB1L,WAAa8N,EAAiB9N,UAC3D+N,EAAWpkB,KAAK,cAADY,OAAehE,KAAKmlB,sBAAsB1L,SAAQ,SAAAzV,OAAQujB,EAAiB9N,SAAQ,MAEhGzZ,KAAKmlB,sBAAsBpW,aAAewY,EAAiBxY,YAC7DyY,EAAWpkB,KAAK,eAADY,OAAgBhE,KAAKmlB,sBAAsBpW,WAAU,SAAA/K,OAAQujB,EAAiBxY,WAAU,OAErG/O,KAAKmlB,sBAAsBzL,WAAa6N,EAAiB7N,UAC3D8N,EAAWpkB,KAAK,aAADY,OAAchE,KAAKmlB,sBAAsBzL,SAAQ,WAAA1V,OAAUujB,EAAiB7N,SAAQ,SAEjG1Z,KAAKmlB,sBAAsBxL,WAAa4N,EAAiB5N,UAC3D6N,EAAWpkB,KAAK,aAADY,OAAchE,KAAKmlB,sBAAsBxL,SAAQ,OAAA3V,OAAMujB,EAAiB5N,WAGrF6N,EAAW/jB,OAAS,EAAG,CACzBM,QAAQwI,KAAK,gDACbxI,QAAQwI,KAAK,gBAAiBvM,KAAKmlB,uBACnCphB,QAAQwI,KAAK,iBAAkBgb,GAC/BxjB,QAAQwI,KAAK,kBAAmBib,EAAW3B,KAAK,OAGhD,IAME,GALA7lB,KAAKolB,gBAAkB,IAAI7B,GACzBvjB,KAAKmlB,sBACLoC,GAGEvnB,KAAKolB,gBAAgBnB,kBAAmB,CAC1C,IAAMJ,EAAQ7jB,KAAKolB,gBAAgBqC,qBACnC1jB,QAAQkS,IAAI,6CACZlS,QAAQkS,IAAI,uBAAwB4N,EAAMgC,KAAK,OAC/C9hB,QAAQkS,IAAI,+DACd,CACF,CAAE,MAAOnS,GACPC,QAAQD,MAAM,oDAAqDA,GACnEC,QAAQwI,KAAK,iDACbvM,KAAKolB,gBAAkB,IACzB,CACF,MACErhB,QAAQkS,IAAI,2CAA4CsR,GACxDvnB,KAAKolB,gBAAkB,KAGzBplB,KAAK4I,KAAK,mBAAoB5I,KAAKklB,kBAIrC,KAAO,CAKDllB,KAAKrB,OAAOqmB,iBAAmB,GAEjCjhB,QAAQwI,KAAK,4EAEbxI,QAAQwI,KAAK,0BAEbxI,QAAQwI,KAAK,uEAEbxI,QAAQwI,KAAK,iFAEbxI,QAAQwI,KAAK,8DAEbxI,QAAQwI,KAAK,2CAIbxI,QAAQkS,IAAI,6CAQd,IAAMyR,EAAgB,CAEpBnO,UAAWvZ,KAAKrB,OAAOgmB,iBAAmB,MAE1ClL,SAAUzZ,KAAKrB,OAAOkmB,gBAAkB,MAExC9V,WAAY/O,KAAKrB,OAAO6iB,kBAAoB,KAE5C7H,SAAU3Z,KAAKrB,OAAO6jB,gBAAkB,EAExC9I,SAAU1Z,KAAKrB,OAAO0e,gBAAkB,IAM1Crd,KAAKklB,kBAAoBwC,EAEzB1nB,KAAKmlB,sBAAwBuC,EAE7B1nB,KAAKyT,YAAY6T,gBAAgBI,GAEjC1nB,KAAKolB,gBAAkB,IAEzB,CAEF,GAIA,CAAAvmB,IAAA,sBAAAkE,OAAA4kB,EAAA3a,GAAAtH,KAAAE,EAMA,SAAAwK,EAA0B5D,GAAI,IAAAI,EAAAgb,EAAAC,EAAAtO,EAAAE,EAAAjD,EAAAwG,EAAA8K,EAAAzX,EAAA,OAAA3K,KAAAC,EAAA,SAAA2K,GAAA,cAAAA,EAAA5L,EAAA4L,EAAAnM,GAAA,YAMxBqI,aAAgBG,MAAI,CAAA2D,EAAAnM,EAAA,eAAAmM,EAAAnM,EAAA,EAEFqI,EAAKI,cAAa,OAAtCA,EAAW0D,EAAAzL,EAAAyL,EAAAnM,EAAG,EAAH,aAIXyI,EAAcJ,EAAK,OAWW,GALhCzI,QAAQkS,IAAI,kCAAmCrJ,EAAYwN,WAAY,SAKnEwN,EAAiBhb,GAEjB5M,KAAKolB,kBAAmBplB,KAAKolB,gBAAgBnB,kBAAiB,CAAA3T,EAAAnM,EAAA,eAAAmM,EAAA5L,EAAA,EAAA4L,EAAAnM,EAAA,EAEvCnE,KAAKolB,gBAAgBhB,QAAQxX,GAAY,OAAhEgb,EAActX,EAAAzL,EACdd,QAAQkS,IAAI,sDAAsD3F,EAAAnM,EAAA,eAAAmM,EAAA5L,EAAA,EAAA2L,EAAAC,EAAAzL,EAElEd,QAAQD,MAAM,2CAA0CuM,GACxDtM,QAAQwI,KAAK,8CACbqb,EAAiBhb,EAAa,OAK5Bib,EAAiB7nB,KAAKolB,iBAAmBplB,KAAKolB,gBAAgBnB,kBAChEjkB,KAAKmlB,sBACJnlB,KAAKklB,mBAAqB,CACzB3L,UAAWvZ,KAAKrB,OAAOgmB,iBAAmB,MAC1ClL,SAAUzZ,KAAKrB,OAAOkmB,gBAAkB,MACxC9V,WAAY/O,KAAKrB,OAAO6iB,kBAAoB,KAC5C9H,SAAU1Z,KAAKrB,OAAO0e,gBAAkB,GACxC1D,SAAU3Z,KAAKrB,OAAO6jB,gBAAkB,GAGxCjJ,EAAYsO,EAAetO,WAAa,MACxCE,GAAYoO,EAAepO,UAAY,OAAOD,cAElC,QAAdD,GAEE/C,EAAUoR,EAEG,QAAbnO,KAEIuD,EAAQhd,KAAKyT,YAAY6J,SAAS7D,KAEhCqO,EAAU9K,EAAME,OAAO,IAAI7L,WAAWuW,IAC5CpR,EAAUsR,EAAQhW,OAClB/N,QAAQkS,IAAI,2BAADjS,OAA4ByV,EAAS8D,cAAa,aAAAvZ,OAAY8jB,EAAQ1N,WAAU,aAE3FrW,QAAQwI,KAAK,gCAADvI,OAAiCyV,EAAQ,uBAMpDzZ,KAAKyT,YAAYsE,eACpBhU,QAAQwI,KAAK,oFACbvM,KAAKyT,YAAY6T,gBAAgBO,IAInC7nB,KAAKyT,YAAYsU,UAAUvR,IAG3BxW,KAAKyT,YAAYU,UAAUyT,GAC5B,cAAAtX,EAAAxL,EAAA,KAAAsL,EAAA,iBAEF,SAhFwBpH,GAAA,OAAA2e,EAAA9jB,MAAC,KAADL,UAAA,IAoFzB,CAAA3E,IAAA,cAAAkE,MAMA,SAAYkJ,GAEV,IAAKjM,KAAKqlB,WAAarlB,KAAKqlB,UAAUhc,aAAeZ,UAAUa,KAI7D,OAFAvF,QAAQwI,KAAK,qDAEN,EAMT,IAIE,OAFAvM,KAAKqlB,UAAUjZ,KAAKC,KAAKC,UAAUL,KAE5B,CAET,CAAE,MAAOnI,GAMP,OAJAC,QAAQD,MAAM,sCAAuCA,GAErD9D,KAAK4I,KAAK,QAAS9E,IAEZ,CAET,CAEF,GAIA,CAAAjF,IAAA,aAAAkE,MAMA,SAAWiO,GAET,IAAKhR,KAAKqlB,WAAarlB,KAAKqlB,UAAUhc,aAAeZ,UAAUa,KAI7D,OAFAvF,QAAQwI,KAAK,mDAEN,EAMT,IAIE,OAFAvM,KAAKqlB,UAAUjZ,KAAK4E,IAEb,CAET,CAAE,MAAOlN,GAMP,OAJAC,QAAQD,MAAM,oCAAqCA,GAEnD9D,KAAK4I,KAAK,QAAS9E,IAEZ,CAET,CAEF,GAIA,CAAAjF,IAAA,aAAAkE,MAMA,WAEM/C,KAAKqT,cAITtP,QAAQkS,IAAI,oCAIZjW,KAAK+T,gBAID/T,KAAKyT,aACPzT,KAAKyT,YAAYtB,gBAGfnS,KAAKqlB,YAEPrlB,KAAKqlB,UAAU9b,QAEfvJ,KAAKqlB,UAAY,MAMnBrlB,KAAKyK,aAAc,EAErB,GAIA,CAAA5L,IAAA,iBAAAkE,OAAAgS,EAAA/H,GAAAtH,KAAAE,EAMA,SAAAoP,IAAA,IAAAlR,EAAAuR,EAAA,OAAA3P,KAAAC,EAAA,SAAAsP,GAAA,cAAAA,EAAAvQ,EAAAuQ,EAAA9Q,GAAA,UAEOnE,KAAKyK,YAAa,CAAFwK,EAAA9Q,EAAA,QAIO,MAFpBL,EAAQ,IAAIrD,MAAM,iCAExBT,KAAK4I,KAAK,QAAS9E,GAEbA,EAAK,WAMT9D,KAAKsN,YAAa,CAAF2H,EAAA9Q,EAAA,QAE6B,OAA/CJ,QAAQwI,KAAK,kCAAkC0I,EAAAnQ,EAAA,GAExC,GAAI,OAwBX,OAlBFf,QAAQkS,IAAI,yCAAyChB,EAAAvQ,EAAA,EAQnD1E,KAAKoU,YAAY,CAEflQ,EAAG,wBAEH+O,MAAOjT,KAAKkV,kBAMdD,EAAA9Q,EAAA,EAEMnE,KAAKwT,cAAcvB,QAAO,cAAAgD,EAAAnQ,EAAA,GAIzB,GAAI,OAQe,OARfmQ,EAAAvQ,EAAA,EAAA2Q,EAAAJ,EAAApQ,EAMXd,QAAQD,MAAM,4CAA2CuR,GAEzDrV,KAAK4I,KAAK,QAAOyM,GAASJ,EAAAnQ,EAAA,GAEnB,GAAK,EAAAkQ,EAAA,iBAIf,WA9DmB,OAAAD,EAAAlR,MAAC,KAADL,UAAA,IAkEpB,CAAA3E,IAAA,gBAAAkE,OAAAoS,EAAAnI,GAAAtH,KAAAE,EAMA,SAAAwP,IAAA,IAAA4S,EAAA,OAAAtiB,KAAAC,EAAA,SAAA2P,GAAA,cAAAA,EAAA5Q,EAAA4Q,EAAAnR,GAAA,UAEOnE,KAAKsN,YAAa,CAAFgI,EAAAnR,EAAA,QAEwB,OAA3CJ,QAAQwI,KAAK,8BAA8B+I,EAAAxQ,EAAA,GAEpC,GAAI,OAwBX,OAlBFf,QAAQkS,IAAI,yCAAyCX,EAAA5Q,EAAA,EAQnD1E,KAAKoU,YAAY,CAEflQ,EAAG,uBAEH+O,MAAOjT,KAAKkV,kBAMdI,EAAAnR,EAAA,EAEMnE,KAAKwT,cAAc/C,OAAM,OAME,OAAjCzQ,KAAKyT,YAAYtB,gBAAgBmD,EAAAxQ,EAAA,GAI1B,GAAI,OAQe,OARfwQ,EAAA5Q,EAAA,EAAAsjB,EAAA1S,EAAAzQ,EAMXd,QAAQD,MAAM,yCAAwCkkB,GAEtDhoB,KAAK4I,KAAK,QAAOof,GAAS1S,EAAAxQ,EAAA,GAEnB,GAAK,EAAAsQ,EAAA,iBAIf,WAxDkB,OAAAD,EAAAtR,MAAC,KAADL,UAAA,IA4DnB,CAAA3E,IAAA,kBAAAkE,OAAAwS,EAAAvI,GAAAtH,KAAAE,EAMA,SAAA4P,IAAA,OAAA9P,KAAAC,EAAA,SAAA8P,GAAA,cAAAA,EAAAtR,GAAA,WAEMnE,KAAKsN,YAAa,CAAFmI,EAAAtR,EAAA,eAAAsR,EAAAtR,EAAA,EAELnE,KAAK+T,gBAAe,OAIC,cAAA0B,EAAA3Q,EAAA,EAAA2Q,EAAA5Q,GAJD,cAAA4Q,EAAAtR,EAAA,EAIpBnE,KAAK0V,iBAAgB,cAAAD,EAAA3Q,EAAA,KAAA0Q,EAAA,SAIrC,WAZoB,OAAAD,EAAA1R,MAAC,KAADL,UAAA,IAgBrB,CAAA3E,IAAA,oBAAAkE,MAMA,WAEE/C,KAAKyT,YAAYtB,eAEnB,GAIA,CAAAtT,IAAA,gBAAAkE,OAAA4S,EAAA3I,GAAAtH,KAAAE,EAMA,SAAAgQ,IAAA,OAAAlQ,KAAAC,EAAA,SAAAkQ,GAAA,cAAAA,EAAA1R,GAAA,OAE2B,GAAzBnE,KAAK8V,oBAIA9V,KAAKsN,YAAa,CAAFuI,EAAA1R,EAAA,eAAA0R,EAAA1R,EAAA,EAEbnE,KAAK0V,iBAAgB,cAAAG,EAAA/Q,EAAA,KAAA8Q,EAAA,SAI9B,WAZkB,OAAAD,EAAA9R,MAAC,KAADL,UAAA,IAgBnB,CAAA3E,IAAA,YAAAkE,MAMA,WAEE,MAAO,CAEL2hB,QAAS1kB,KAAK0kB,QAEdja,YAAazK,KAAKyK,YAElB6C,YAAatN,KAAKsN,YAElBuD,UAAW7Q,KAAK6Q,UAEhBkH,aAAc/X,KAAKklB,kBAEnBzR,YAAazT,KAAKyT,YAAYiT,YAE9BlT,cAAexT,KAAKwT,cAAckT,YAItC,GAIA,CAAA7nB,IAAA,eAAAkE,MAMA,SAAagT,GAEX/V,KAAKrB,OAAM+T,GAAAA,GAAA,GAAQ1S,KAAKrB,QAAWoX,EAErC,GAIA,CAAAlX,IAAA,gBAAAkE,MAMA,WAEE,MAAO,OAASoG,KAAK2B,SAASC,SAAS,IAAIC,OAAO,EAAG,GAAK,IAAMJ,KAAKC,KAEvE,GAIA,CAAAhM,IAAA,UAAAkE,MAMA,WAEM/C,KAAKqT,cAITtP,QAAQkS,IAAI,kCAIZjW,KAAK4U,aAEL5U,KAAKqT,aAAc,EAMfrT,KAAKyT,aAEPzT,KAAKyT,YAAYyC,UAMflW,KAAKwT,eAEPxT,KAAKwT,cAAc0C,UAMrBlW,KAAKmW,qBAEP,IA1xDFtT,GAAAuD,GAAAnC,EAAA7D,UAAAyC,GAAAlD,OAAA4C,eAAA0B,EAAA,aAAA8B,UAAA,IAAA9B,EAAA,IAAAA,EAAApB,EAgqDE8S,EApCAJ,EAlEAJ,EAxEAJ,EA9MA4S,EAvjBAnc,CA6iCC,CAvuDc,CAASxI,IAExB2P,GAFI8R,GAAW,4BAIoB,CAAC,MAAO,OAAQ,SAAO9R,GAJtD8R,GAAW,+BAMuB,CAAC,IAAM,KAAO,MAAO,KAAO,MAAO,OAAM9R,GAN3E8R,GAAW,6BAQqB,CAAC,EAAG,GAAI,KAAG9R,GAR3C8R,GAAW,2BAUmB,CAAC,IAInC9R,GAdI8R,GAAW,6BAgBqB,CAAC,MAAO,OAAQ,SAAO9R,GAhBvD8R,GAAW,gCAkBwB,CAAC,IAAM,KAAO,MAAO,KAAO,MAAO,OAAM9R,GAlB5E8R,GAAW,8BAoBsB,CAAC,EAAG,GAAI,KAAG9R,GApB5C8R,GAAW,4BAsBoB,CAAC,IAAE9R,GAtBlC8R,GAAW,8BAwBsB,CAAC,MAAO,QAqtD/C,Y,uPChyDA,IAAAxgB,EAAAC,EAAArB,EAAA,mBAAAtE,OAAAA,OAAA,GAAA4F,EAAAtB,EAAAzD,UAAA,aAAAkD,EAAAO,EAAAC,aAAA,yBAAAsB,EAAAvB,EAAAsB,EAAA7B,EAAA8B,GAAA,IAAAC,EAAAF,GAAAA,EAAA/D,qBAAAkE,EAAAH,EAAAG,EAAAC,EAAA5E,OAAA6B,OAAA6C,EAAAjE,WAAA,OAAAoE,GAAAD,EAAA,mBAAA1B,EAAAsB,EAAA7B,GAAA,IAAA8B,EAAAC,EAAAE,EAAAE,EAAA,EAAAC,EAAApC,GAAA,GAAAqC,GAAA,EAAAC,EAAA,CAAAF,EAAA,EAAAP,EAAA,EAAAU,EAAAZ,EAAAa,EAAA1C,EAAAqC,EAAArC,EAAA2C,KAAAd,EAAA,GAAA7B,EAAA,SAAA8B,EAAArB,GAAA,OAAAuB,EAAAF,EAAAG,EAAA,EAAAE,EAAAN,EAAAW,EAAAT,EAAAtB,EAAAiC,CAAA,YAAA1C,EAAAS,EAAAsB,GAAA,IAAAE,EAAAxB,EAAA0B,EAAAJ,EAAAD,EAAA,GAAAS,GAAAF,IAAAnC,GAAA4B,EAAAQ,EAAAjB,OAAAS,IAAA,KAAA5B,EAAA8B,EAAAM,EAAAR,GAAA9B,EAAAwC,EAAAF,EAAAM,EAAAZ,EAAA,GAAAvB,EAAA,GAAAP,EAAA0C,IAAAb,KAAAI,EAAAH,GAAAC,EAAAD,EAAA,OAAAC,EAAA,MAAAD,EAAA,GAAAA,EAAA,GAAAH,GAAAG,EAAA,IAAAhC,KAAAE,EAAAO,EAAA,GAAAT,EAAAgC,EAAA,KAAAC,EAAA,EAAAO,EAAAC,EAAAV,EAAAS,EAAAT,EAAAC,EAAA,IAAAhC,EAAA4C,IAAA1C,EAAAO,EAAA,GAAAuB,EAAA,GAAAD,GAAAA,EAAAa,KAAAZ,EAAA,GAAAvB,EAAAuB,EAAA,GAAAD,EAAAS,EAAAT,EAAAa,EAAAX,EAAA,OAAA/B,GAAAO,EAAA,SAAAiC,EAAA,MAAAH,GAAA,EAAAR,CAAA,iBAAA7B,EAAAoC,EAAAM,GAAA,GAAAP,EAAA,QAAAQ,UAAA,oCAAAN,GAAA,IAAAD,GAAAtC,EAAAsC,EAAAM,GAAAX,EAAAK,EAAAH,EAAAS,GAAAd,EAAAG,EAAA,EAAAJ,EAAAM,KAAAI,GAAA,CAAAP,IAAAC,EAAAA,EAAA,GAAAA,EAAA,IAAAO,EAAAT,GAAA,GAAA/B,EAAAiC,EAAAE,IAAAK,EAAAT,EAAAI,EAAAK,EAAAC,EAAAN,GAAA,OAAAE,EAAA,EAAAL,EAAA,IAAAC,IAAA/B,EAAA,QAAA4B,EAAAE,EAAA9B,GAAA,MAAA4B,EAAAA,EAAAtB,KAAAwB,EAAAG,IAAA,MAAAU,UAAA,wCAAAf,EAAAgB,KAAA,OAAAhB,EAAAK,EAAAL,EAAAnB,MAAAsB,EAAA,IAAAA,EAAA,YAAAA,IAAAH,EAAAE,EAAAe,SAAAjB,EAAAtB,KAAAwB,GAAAC,EAAA,IAAAE,EAAAU,UAAA,oCAAA3C,EAAA,YAAA+B,EAAA,GAAAD,EAAAH,CAAA,UAAAC,GAAAS,EAAAC,EAAAT,EAAA,GAAAI,EAAA1B,EAAAD,KAAAuB,EAAAS,MAAAE,EAAA,YAAAZ,GAAAE,EAAAH,EAAAI,EAAA,EAAAE,EAAAL,CAAA,SAAAO,EAAA,UAAA1B,MAAAmB,EAAAgB,KAAAP,EAAA,GAAA9B,EAAAP,EAAA8B,IAAA,GAAAG,CAAA,KAAAO,EAAA,YAAAR,IAAA,UAAAc,IAAA,UAAAC,IAAA,CAAAnB,EAAAvE,OAAA2F,eAAA,IAAAjB,EAAA,GAAAF,GAAAD,EAAAA,EAAA,GAAAC,QAAAK,GAAAN,EAAA,GAAAC,EAAA,yBAAAD,GAAAK,EAAAc,EAAAjF,UAAAkE,EAAAlE,UAAAT,OAAA6B,OAAA6C,GAAA,SAAAI,EAAAR,GAAA,OAAAtE,OAAA4F,eAAA5F,OAAA4F,eAAAtB,EAAAoB,IAAApB,EAAAuB,UAAAH,EAAAb,GAAAP,EAAA3B,EAAA,sBAAA2B,EAAA7D,UAAAT,OAAA6B,OAAA+C,GAAAN,CAAA,QAAAmB,EAAAhF,UAAAiF,EAAAb,GAAAD,EAAA,cAAAc,GAAAb,GAAAa,EAAA,cAAAD,GAAAA,EAAAK,YAAA,oBAAAjB,GAAAa,EAAA/C,EAAA,qBAAAkC,GAAAD,GAAAC,GAAAD,EAAAjC,EAAA,aAAAkC,GAAAD,EAAAJ,EAAA,yBAAAK,GAAAD,EAAA,oDAAAmB,GAAA,kBAAAC,EAAAvB,EAAAwB,EAAAnB,EAAA,cAAAD,GAAAP,EAAApB,EAAAsB,EAAAD,GAAA,IAAAE,EAAAzE,OAAA4C,eAAA,IAAA6B,EAAA,gBAAAH,GAAAG,EAAA,EAAAI,GAAA,SAAAP,EAAApB,EAAAsB,EAAAD,GAAA,SAAA5B,EAAAO,EAAAsB,GAAAK,GAAAP,EAAApB,EAAA,SAAAoB,GAAA,YAAA4B,QAAAhD,EAAAsB,EAAAF,EAAA,GAAApB,EAAAuB,EAAAA,EAAAH,EAAApB,EAAA,CAAAE,MAAAoB,EAAA3B,YAAA0B,EAAA4B,cAAA5B,EAAA6B,UAAA7B,IAAAD,EAAApB,GAAAsB,GAAA7B,EAAA,UAAAA,EAAA,WAAAA,EAAA,cAAAkC,GAAAP,EAAApB,EAAAsB,EAAAD,EAAA,UAAA8B,GAAA7B,EAAAD,EAAAD,EAAApB,EAAAP,EAAAwC,EAAAT,GAAA,QAAAD,EAAAD,EAAAW,GAAAT,GAAAE,EAAAH,EAAArB,KAAA,OAAAoB,GAAA,YAAAF,EAAAE,EAAA,CAAAC,EAAAc,KAAAhB,EAAAK,GAAA0B,QAAAC,QAAA3B,GAAA4B,KAAAtD,EAAAP,EAAA,UAAAgQ,GAAArO,EAAApB,GAAA,IAAAqB,EAAAvE,OAAA4S,KAAAtO,GAAA,GAAAtE,OAAA6S,sBAAA,KAAAlQ,EAAA3C,OAAA6S,sBAAAvO,GAAApB,IAAAP,EAAAA,EAAAe,OAAA,SAAAR,GAAA,OAAAlD,OAAA8S,yBAAAxO,EAAApB,GAAAL,UAAA,IAAA0B,EAAAd,KAAAS,MAAAK,EAAA5B,EAAA,QAAA4B,CAAA,UAAAwO,GAAAzO,GAAA,QAAApB,EAAA,EAAAA,EAAAW,UAAAC,OAAAZ,IAAA,KAAAqB,EAAA,MAAAV,UAAAX,GAAAW,UAAAX,GAAA,GAAAA,EAAA,EAAAyP,GAAA3S,OAAAuE,IAAA,GAAAN,QAAA,SAAAf,GAAA8P,GAAA1O,EAAApB,EAAAqB,EAAArB,GAAA,GAAAlD,OAAAiT,0BAAAjT,OAAAkT,iBAAA5O,EAAAtE,OAAAiT,0BAAA1O,IAAAoO,GAAA3S,OAAAuE,IAAAN,QAAA,SAAAf,GAAAlD,OAAA4C,eAAA0B,EAAApB,EAAAlD,OAAA8S,yBAAAvO,EAAArB,GAAA,UAAAoB,CAAA,UAAA0O,GAAA1O,EAAApB,EAAAqB,GAAA,OAAArB,EAAAwD,GAAAxD,MAAAoB,EAAAtE,OAAA4C,eAAA0B,EAAApB,EAAA,CAAAE,MAAAmB,EAAA1B,YAAA,EAAAsD,cAAA,EAAAC,UAAA,IAAA9B,EAAApB,GAAAqB,EAAAD,CAAA,UAAAmC,GAAAnC,EAAApB,GAAA,QAAAqB,EAAA,EAAAA,EAAArB,EAAAY,OAAAS,IAAA,KAAA5B,EAAAO,EAAAqB,GAAA5B,EAAAE,WAAAF,EAAAE,aAAA,EAAAF,EAAAwD,cAAA,YAAAxD,IAAAA,EAAAyD,UAAA,GAAApG,OAAA4C,eAAA0B,EAAAoC,GAAA/D,EAAAzD,KAAAyD,EAAA,WAAA+D,GAAAnC,GAAA,IAAAE,EAAA,SAAAF,GAAA,aAAAoC,GAAApC,KAAAA,EAAA,OAAAA,EAAA,IAAAD,EAAAC,EAAA3F,OAAAgI,aAAA,YAAAtC,EAAA,KAAAG,EAAAH,EAAArB,KAAAsB,EAAArB,UAAA,aAAAyD,GAAAlC,GAAA,OAAAA,EAAA,UAAAa,UAAA,uDAAAuB,OAAAtC,EAAA,CAAAuC,CAAAvC,GAAA,gBAAAoC,GAAAlC,GAAAA,EAAAA,EAAA,YAAAsC,KAAA,QAAAxC,GAAAyC,QAAAvG,UAAAwG,QAAAhE,KAAAiE,QAAAC,UAAAH,QAAA,wBAAAzC,GAAA,QAAAwC,GAAA,mBAAAxC,CAAA,cAAA6C,GAAA7C,GAAA,OAAA6C,GAAApH,OAAA4F,eAAA5F,OAAA2F,eAAAP,OAAA,SAAAb,GAAA,OAAAA,EAAAsB,WAAA7F,OAAA2F,eAAApB,EAAA,EAAA6C,GAAA7C,EAAA,UAAA8C,GAAA9C,EAAAD,GAAA,OAAA+C,GAAArH,OAAA4F,eAAA5F,OAAA4F,eAAAR,OAAA,SAAAb,EAAAD,GAAA,OAAAC,EAAAsB,UAAAvB,EAAAC,CAAA,EAAA8C,GAAA9C,EAAAD,EAAA,CAI6C,IAExBgkB,GAAW,SAAAhhB,GAC9B,SAAAghB,IAAyB,IAAA9gB,EAAbxI,EAAM6E,UAAAC,OAAA,QAAAvB,IAAAsB,UAAA,GAAAA,UAAA,GAAG,CAAC,GAPxB,SAAAsB,EAAAX,GAAA,KAAAW,aAAAX,GAAA,UAAAc,UAAA,qCAOyBhC,CAAA,KAAAglB,GAGrB,IAAMC,GAFN/gB,EARJ,SAAAjD,EAAA5B,EAAA2B,GAAA,OAAA3B,EAAAyE,GAAAzE,GAAA,SAAA4B,EAAAD,GAAA,GAAAA,IAAA,UAAAqC,GAAArC,IAAA,mBAAAA,GAAA,OAAAA,EAAA,YAAAA,EAAA,UAAAgB,UAAA,4EAAAhB,GAAA,YAAAA,EAAA,UAAAmD,eAAA,oEAAAnD,CAAA,CAAAoD,CAAAnD,EAAA,CAAAoD,CAAApD,EAAAwC,KAAAG,QAAAC,UAAAxE,EAAA2B,GAAA,GAAA8C,GAAA7C,GAAAtD,aAAA0B,EAAAuB,MAAAK,EAAAD,GAAA,CAQIsD,CAAA,KAAA0gB,IAE0BE,sBAgBG,OAd7BhhB,EAAKxI,OAAM+T,GAAA,CAET0V,UAAW,4CACXpV,MAAOrU,EAAOqU,OAASkV,EAAalV,MACpCD,QAASpU,EAAOoU,SAAWmV,EAAanV,QACxCsV,oBAA0CnmB,IAA1BvD,EAAO0pB,eAA+B1pB,EAAO0pB,eAAiBlhB,EAAKmhB,6BAEnFC,oBAAqB5pB,EAAO4pB,oBAE5BC,MAAO,GACPC,UAAU,GACP9pB,GAGLwI,EAAKuhB,mBAAqB,GAAGvhB,CAC/B,CAEA,OA7BF,SAAAjD,EAAAD,GAAA,sBAAAA,GAAA,OAAAA,EAAA,UAAAgB,UAAA,sDAAAf,EAAA9D,UAAAT,OAAA6B,OAAAyC,GAAAA,EAAA7D,UAAA,CAAAQ,YAAA,CAAAmC,MAAAmB,EAAA6B,UAAA,EAAAD,cAAA,KAAAnG,OAAA4C,eAAA2B,EAAA,aAAA6B,UAAA,IAAA9B,GAAA+C,GAAA9C,EAAAD,EAAA,CA6BE4D,CAAAogB,EAAAhhB,GA7BFhD,EA6BEgkB,EA7BFplB,EA6BE,EAAAhE,IAAA,sBAAAkE,MACA,WACE,IACE,IACM4lB,EADU7nB,MAAM4M,KAAKM,SAASC,qBAAqB,WAC/B2a,UAAUC,KAAK,SAAA9e,GAAC,OAAKA,EAAE+e,UAAY/e,EAAE+e,QAAQ9V,OAASjJ,EAAE+e,QAAQ/V,UAAchJ,EAAEmE,KAAOnE,EAAEmE,IAAIC,SAAS,eAAgB,GAChJ,OAAKwa,EACE,CACL3V,MAAO2V,EAAUG,QAAQ9V,MACzBD,QAAS4V,EAAUG,QAAQ/V,SAHN,CAAC,CAK1B,CAAE,MAAOgW,GACP,MAAO,CAAC,CACV,CACF,GAEA,CAAAlqB,IAAA,oBAAAkE,MACA,WAAgD,IAA9BimB,EAAIxlB,UAAAC,OAAA,QAAAvB,IAAAsB,UAAA,GAAAA,UAAA,GAAGxD,KAAKrB,OAAOypB,UAC7B5T,EAAS,IAAIC,gBAInB,OAHIzU,KAAKrB,OAAOqU,OAAOwB,EAAOE,OAAO,QAAS1U,KAAKrB,OAAOqU,OACtDhT,KAAKrB,OAAOoU,SAASyB,EAAOE,OAAO,UAAW1U,KAAKrB,OAAOoU,SAC1D/S,KAAKrB,OAAO0pB,gBAAgB7T,EAAOE,OAAO,iBAAkB1U,KAAKrB,OAAO0pB,gBACrE,GAAPrkB,OAAUglB,EAAI,KAAAhlB,OAAIwQ,EAAOzJ,WAC3B,GAEA,CAAAlM,IAAA,cAAAkE,OArDFoB,EAqDEuB,KAAAE,EACA,SAAAkC,EAAkBmhB,GAAI,IAAA/gB,EAAA,YAAAxC,KAAAC,EAAA,SAAAwC,GAAA,cAAAA,EAAAhE,EAAA,OAAAgE,EAAArD,EAAA,EACb,IAAImB,QAAQ,SAACC,EAASyE,GAC3B,GAAKse,GAASA,EAAKC,OAInB,GAAKhhB,EAAKvJ,OAAOqU,OAAU9K,EAAKvJ,OAAOoU,QAAvC,CAKA,IAAMoW,EAAO,CAAEF,KAAAA,EAAM/iB,QAAAA,EAASyE,OAAAA,GAC1BzC,EAAKvJ,OAAO8pB,SACdvgB,EAAKvJ,OAAO6pB,MAAMplB,KAAK+lB,GAEvBjhB,EAAKkhB,YAAYD,EANvB,MAFMxe,EAAO,IAAIlK,MAAM,kCAJjBkK,EAAO,IAAIlK,MAAM,oBAcrB,GAAE,EAAAqH,EAAA,GAlBJuhB,EArDF,eAAAnlB,EAAA,KAAAD,EAAAT,UAAA,WAAAyC,QAAA,SAAApD,EAAAP,GAAA,IAAAwC,EAAAX,EAAAN,MAAAK,EAAAD,GAAA,SAAA6E,EAAA3E,GAAA6B,GAAAlB,EAAAjC,EAAAP,EAAAwG,EAAAC,EAAA,OAAA5E,EAAA,UAAA4E,EAAA5E,GAAA6B,GAAAlB,EAAAjC,EAAAP,EAAAwG,EAAAC,EAAA,QAAA5E,EAAA,CAAA2E,OAAA,MAwEG,SAlBgBE,GAAA,OAAAqgB,EAAAxlB,MAAC,KAADL,UAAA,KAAA3E,IAAA,cAAAkE,MAoBjB,SAAYomB,GAAM,IAAA1d,EAAA,KAKhB,GAJAzL,KAAKrB,OAAO8pB,UAAW,EACvBzoB,KAAK0oB,mBAAqB,IAGrB1oB,KAAKrB,OAAO0pB,eAAgB,CAC/B,IAAMiB,EAAYtpB,KAAKsoB,6BACnBgB,IACFtpB,KAAKrB,OAAO0pB,eAAiBiB,EAC7BvlB,QAAQkS,IAAI,uDAAwDqT,GAExE,CAEA,IAmGqBC,EAnGfC,EAAaxpB,KAAKuU,kBAAkBvU,KAAKrB,OAAOypB,WAChDqB,EAAezpB,KAAKrB,OAAOypB,UAAUsB,SAAS,cAChD1pB,KAAKrB,OAAOypB,UAAUuB,QAAQ,eAAgB,IAAG,GAAA3lB,OAC9ChE,KAAKrB,OAAOypB,UAAS,cACtBwB,EAAc5pB,KAAKuU,kBAAkBkV,GACvCI,GAAgB,EAEhBC,GAAc,EACdC,EAAiB,KAEfC,EAAc,SAACT,GACnB,IAAIO,EACJ,IACE,IAAMG,EAAU,CAAEhe,QAASkd,EAAKF,MAC1BiB,EAAkBze,EAAK9M,OAAO4pB,qBAAuB9c,EAAK9M,OAAO0pB,eACnE6B,IACFD,EAAQ5B,eAAiB6B,EAErBze,EAAK9M,OAAO4pB,sBAAwB9c,EAAK9M,OAAO0pB,iBAClD5c,EAAK9M,OAAO0pB,eAAiB6B,EAC7Bze,EAAK0e,sBAAsBD,KAG/BnmB,QAAQkS,IAAI,kCAAmCgU,EAAS,4BAA6Bxe,EAAK9M,OAAO0pB,gBACjGkB,EAAOnd,KAAKC,KAAKC,UAAU2d,IAC3BH,GAAc,CAChB,CAAE,MAAO7lB,GACPklB,EAAKxe,OAAO1G,GACZwH,EAAK7C,KAAK,QAAS3E,GACnB,IAAMslB,EAAOhgB,OAAS,CAAE,MAAOwf,GAAI,CACrC,CACF,EAEMrd,EAAa,SAAC6d,GAAM,OAAK,WAGxB9d,EAAK9M,OAAO0pB,eAGf2B,EAAYT,GAFZQ,EAAiBxhB,WAAW,kBAAMyhB,EAAYT,EAAO,EAAE,IAI3D,CAAC,EAEK1d,EAAgB,SAAC0d,GAAM,OAAK,SAACa,GACjC,IACE,IAAMrmB,QAAQkS,IAAI,8BAA+BmU,EAAI5d,KAAO,CAAE,MAAOuc,GAAI,CACzE,IAAMvc,EAAOH,KAAKQ,MAAMud,EAAI5d,MAC5B,IAAMzI,QAAQkS,IAAI,iCAAkCzJ,EAAO,CAAE,MAAOuc,GAAI,CAExE,GAAkB,UAAdvc,EAAK9N,MAAoB8N,EAAK6b,eAAgB,CAOhD,GALAtkB,QAAQkS,IAAI,0CAA2CzJ,EAAK6b,gBAC5D5c,EAAK9M,OAAO0pB,eAAiB7b,EAAK6b,eAClC5c,EAAK0e,sBAAsB3d,EAAK6b,gBAChC5c,EAAK7C,MAAQ6C,EAAK7C,KAAK,wBAAyB4D,EAAK6b,iBAEhDyB,GAAeP,GAAgC,IAAtBA,EAAOlgB,WAAkB,CACrD,GAAI0gB,EAAkB,IAAMM,aAAaN,EAAiB,CAAE,MAAOhB,GAAI,CACvEiB,EAAYT,EACd,CACA,MACF,CAOA,IALK9d,EAAK9M,OAAO0pB,gBAAkB7b,EAAK6b,iBACtCtkB,QAAQkS,IAAI,uDAAwDzJ,EAAK6b,gBACzE5c,EAAK9M,OAAO0pB,eAAiB7b,EAAK6b,eAClC5c,EAAK0e,sBAAsB3d,EAAK6b,iBAEhB,UAAd7b,EAAK9N,MAA4C,iBAAjB8N,EAAK8d,QACvC7e,EAAKid,oBAAsBlc,EAAK8d,QAChC7e,EAAK7C,KAAK,QAAS4D,EAAK8d,cACnB,GAAkB,SAAd9d,EAAK9N,KAAiB,CAE/B,IACE,IAAM6rB,EAAY/d,EAAKyc,MAAQzc,EAAK8d,SAAW9d,EAAKge,QAAUhe,EAAKP,SAAW,GAC1Ese,IAAc9e,EAAKid,qBACrBjd,EAAKid,mBAAqB6B,EAE9B,CAAE,MAAOxB,GAAI,EAERtd,EAAK9M,OAAO0pB,gBAAkB7b,EAAK6b,iBACtCtkB,QAAQkS,IAAI,oDAAqDzJ,EAAK6b,gBACtE5c,EAAK9M,OAAO0pB,eAAiB7b,EAAK6b,gBAEpC5c,EAAK0e,sBAAsB1e,EAAK9M,OAAO0pB,gBACvC5c,EAAK7C,KAAK,OAAQ,CAAEqgB,KAAMxd,EAAKid,qBAC/BS,EAAKjjB,QAAQ,CAAEmiB,eAAgB5c,EAAK9M,OAAO0pB,eAAgBoC,SAAUhf,EAAKid,qBAC1E,IAAMa,EAAOhgB,OAAS,CAAE,MAAOwf,GAAI,CACrC,MAAO,GAAkB,UAAdvc,EAAK9N,KAAkB,CAChC,IAAMwL,EAAM,IAAIzJ,MAAM+L,EAAKP,SAAW,gBACtCR,EAAK7C,KAAK,QAASsB,GACnBif,EAAKxe,OAAOT,GACZ,IAAMqf,EAAOhgB,OAAS,CAAE,MAAOwf,GAAI,CACrC,CACF,CAAE,MAAO9kB,GACP,CAEJ,CAAC,EAqBK0H,EAAc,SAACxI,GAEnB,GAAmB,OAAfA,EAAMyQ,MAAiBzQ,EAAM0Q,SAC5B1Q,EAAM0Q,OAAO1F,SAAS,2BACtBhL,EAAM0Q,OAAO1F,SAAS,WACtBhL,EAAM0Q,OAAO1F,SAAS,cAAe,CACxC,IAAM2F,EAAc,IAAIrT,MAAM,0BAS9B,OARAqT,EAAYD,OAAS1Q,EAAM0Q,OAC3BC,EAAYF,KAAOzQ,EAAMyQ,KAEzBnI,EAAK7C,KAAK,cAAekL,GACzBqV,EAAKxe,OAAOmJ,GAEZrI,EAAK9M,OAAO8pB,UAAW,OACvBhd,EAAKif,YAEP,CAEAjf,EAAK9M,OAAO8pB,UAAW,EACvBhd,EAAKif,YACP,EAEMlgB,EAAK,IAAI/B,UAAU+gB,GACzBhf,EAAGuc,OAASrb,EAAWlB,GACvBA,EAAGuF,UAAYlE,EAAcrB,GAC7BA,EAAGwc,SA5CkBuC,EA4CI/e,EA5CO,SAACvG,GAE/B,IAAK4lB,EAAe,CAClBA,GAAgB,EAChB,IAAMN,EAAOhgB,OAAS,CAAE,MAAOwf,GAAI,CACnC,IAAM4B,EAAK,IAAIliB,UAAUmhB,GAQzB,OAPAe,EAAG5D,OAASrb,EAAWif,GACvBA,EAAG5a,UAAYlE,EAAc8e,GAC7BA,EAAG3D,QAAU,SAAC9c,GACZuB,EAAK7C,KAAK,QAASsB,GACnBif,EAAKxe,OAAOT,EACd,OACAygB,EAAG1D,QAAUtb,EAEf,CACAF,EAAK7C,KAAK,QAAS3E,GACnBklB,EAAKxe,OAAO1G,EACd,GA4BAuG,EAAGyc,QAAUtb,CACf,GAAC,CAAA9M,IAAA,aAAAkE,MAED,WACE,GAAiC,IAA7B/C,KAAKrB,OAAO6pB,MAAM/kB,SAAgBzD,KAAKrB,OAAO8pB,SAAlD,CACA,IAAM1a,EAAO/N,KAAKrB,OAAO6pB,MAAM7W,QAC/B3R,KAAKopB,YAAYrb,EAFiD,CAGpE,GAAC,CAAAlP,IAAA,wBAAAkE,MAED,SAAsBslB,GACpB,IACMA,GAAgBuC,aAAaC,QAAQ,gCAAiCxC,EAC5E,CAAE,MAAOU,GAAI,CACf,GAAC,CAAAlqB,IAAA,6BAAAkE,MAED,WACE,IACE,OAAO6nB,aAAaE,QAAQ,kCAAoC,IAClE,CAAE,MAAO/B,GACP,OAAO,IACT,CACF,GAAC,CAAAlqB,IAAA,eAAAkE,MAED,SAAagT,GACX/V,KAAKrB,OAAM+T,GAAAA,GAAA,GAAQ1S,KAAKrB,QAAWoX,EACrC,GAAC,CAAAlX,IAAA,UAAAkE,MAED,WACE/C,KAAKrB,OAAO6pB,MAAQ,GACpBxoB,KAAKrB,OAAO8pB,UAAW,EACvBzoB,KAAKmW,oBACP,IAtQFtT,GAAAuD,GAAAnC,EAAA7D,UAAAyC,GAAAlD,OAAA4C,eAAA0B,EAAA,aAAA8B,UAAA,IAAA9B,EAAA,IAAAA,EAAApB,EAAAsB,EAqDEklB,CAiNC,CAhQ6B,CAASrmB,G,0tCCNzC,IAAAiB,EAAAC,EAAArB,EAAA,mBAAAtE,OAAAA,OAAA,GAAA4F,EAAAtB,EAAAzD,UAAA,aAAAkD,EAAAO,EAAAC,aAAA,yBAAAsB,EAAAvB,EAAAsB,EAAA7B,EAAA8B,GAAA,IAAAC,EAAAF,GAAAA,EAAA/D,qBAAAkE,EAAAH,EAAAG,EAAAC,EAAA5E,OAAA6B,OAAA6C,EAAAjE,WAAA,OAAAoE,GAAAD,EAAA,mBAAA1B,EAAAsB,EAAA7B,GAAA,IAAA8B,EAAAC,EAAAE,EAAAE,EAAA,EAAAC,EAAApC,GAAA,GAAAqC,GAAA,EAAAC,EAAA,CAAAF,EAAA,EAAAP,EAAA,EAAAU,EAAAZ,EAAAa,EAAA1C,EAAAqC,EAAArC,EAAA2C,KAAAd,EAAA,GAAA7B,EAAA,SAAA8B,EAAArB,GAAA,OAAAuB,EAAAF,EAAAG,EAAA,EAAAE,EAAAN,EAAAW,EAAAT,EAAAtB,EAAAiC,CAAA,YAAA1C,EAAAS,EAAAsB,GAAA,IAAAE,EAAAxB,EAAA0B,EAAAJ,EAAAD,EAAA,GAAAS,GAAAF,IAAAnC,GAAA4B,EAAAQ,EAAAjB,OAAAS,IAAA,KAAA5B,EAAA8B,EAAAM,EAAAR,GAAA9B,EAAAwC,EAAAF,EAAAM,EAAAZ,EAAA,GAAAvB,EAAA,GAAAP,EAAA0C,IAAAb,KAAAI,EAAAH,GAAAC,EAAAD,EAAA,OAAAC,EAAA,MAAAD,EAAA,GAAAA,EAAA,GAAAH,GAAAG,EAAA,IAAAhC,KAAAE,EAAAO,EAAA,GAAAT,EAAAgC,EAAA,KAAAC,EAAA,EAAAO,EAAAC,EAAAV,EAAAS,EAAAT,EAAAC,EAAA,IAAAhC,EAAA4C,IAAA1C,EAAAO,EAAA,GAAAuB,EAAA,GAAAD,GAAAA,EAAAa,KAAAZ,EAAA,GAAAvB,EAAAuB,EAAA,GAAAD,EAAAS,EAAAT,EAAAa,EAAAX,EAAA,OAAA/B,GAAAO,EAAA,SAAAiC,EAAA,MAAAH,GAAA,EAAAR,CAAA,iBAAA7B,EAAAoC,EAAAM,GAAA,GAAAP,EAAA,QAAAQ,UAAA,oCAAAN,GAAA,IAAAD,GAAAtC,EAAAsC,EAAAM,GAAAX,EAAAK,EAAAH,EAAAS,GAAAd,EAAAG,EAAA,EAAAJ,EAAAM,KAAAI,GAAA,CAAAP,IAAAC,EAAAA,EAAA,GAAAA,EAAA,IAAAO,EAAAT,GAAA,GAAA/B,EAAAiC,EAAAE,IAAAK,EAAAT,EAAAI,EAAAK,EAAAC,EAAAN,GAAA,OAAAE,EAAA,EAAAL,EAAA,IAAAC,IAAA/B,EAAA,QAAA4B,EAAAE,EAAA9B,GAAA,MAAA4B,EAAAA,EAAAtB,KAAAwB,EAAAG,IAAA,MAAAU,UAAA,wCAAAf,EAAAgB,KAAA,OAAAhB,EAAAK,EAAAL,EAAAnB,MAAAsB,EAAA,IAAAA,EAAA,YAAAA,IAAAH,EAAAE,EAAAe,SAAAjB,EAAAtB,KAAAwB,GAAAC,EAAA,IAAAE,EAAAU,UAAA,oCAAA3C,EAAA,YAAA+B,EAAA,GAAAD,EAAAH,CAAA,UAAAC,GAAAS,EAAAC,EAAAT,EAAA,GAAAI,EAAA1B,EAAAD,KAAAuB,EAAAS,MAAAE,EAAA,YAAAZ,GAAAE,EAAAH,EAAAI,EAAA,EAAAE,EAAAL,CAAA,SAAAO,EAAA,UAAA1B,MAAAmB,EAAAgB,KAAAP,EAAA,GAAA9B,EAAAP,EAAA8B,IAAA,GAAAG,CAAA,KAAAO,EAAA,YAAAR,IAAA,UAAAc,IAAA,UAAAC,IAAA,CAAAnB,EAAAvE,OAAA2F,eAAA,IAAAjB,EAAA,GAAAF,GAAAD,EAAAA,EAAA,GAAAC,QAAAK,GAAAN,EAAA,GAAAC,EAAA,yBAAAD,GAAAK,EAAAc,EAAAjF,UAAAkE,EAAAlE,UAAAT,OAAA6B,OAAA6C,GAAA,SAAAI,EAAAR,GAAA,OAAAtE,OAAA4F,eAAA5F,OAAA4F,eAAAtB,EAAAoB,IAAApB,EAAAuB,UAAAH,EAAAb,GAAAP,EAAA3B,EAAA,sBAAA2B,EAAA7D,UAAAT,OAAA6B,OAAA+C,GAAAN,CAAA,QAAAmB,EAAAhF,UAAAiF,EAAAb,GAAAD,EAAA,cAAAc,GAAAb,GAAAa,EAAA,cAAAD,GAAAA,EAAAK,YAAA,oBAAAjB,GAAAa,EAAA/C,EAAA,qBAAAkC,GAAAD,GAAAC,GAAAD,EAAAjC,EAAA,aAAAkC,GAAAD,EAAAJ,EAAA,yBAAAK,GAAAD,EAAA,oDAAAmB,GAAA,kBAAAC,EAAAvB,EAAAwB,EAAAnB,EAAA,cAAAD,GAAAP,EAAApB,EAAAsB,EAAAD,GAAA,IAAAE,EAAAzE,OAAA4C,eAAA,IAAA6B,EAAA,gBAAAH,GAAAG,EAAA,EAAAI,GAAA,SAAAP,EAAApB,EAAAsB,EAAAD,GAAA,SAAA5B,EAAAO,EAAAsB,GAAAK,GAAAP,EAAApB,EAAA,SAAAoB,GAAA,YAAA4B,QAAAhD,EAAAsB,EAAAF,EAAA,GAAApB,EAAAuB,EAAAA,EAAAH,EAAApB,EAAA,CAAAE,MAAAoB,EAAA3B,YAAA0B,EAAA4B,cAAA5B,EAAA6B,UAAA7B,IAAAD,EAAApB,GAAAsB,GAAA7B,EAAA,UAAAA,EAAA,WAAAA,EAAA,cAAAkC,GAAAP,EAAApB,EAAAsB,EAAAD,EAAA,UAAA8B,GAAA7B,EAAAD,EAAAD,EAAApB,EAAAP,EAAAwC,EAAAT,GAAA,QAAAD,EAAAD,EAAAW,GAAAT,GAAAE,EAAAH,EAAArB,KAAA,OAAAoB,GAAA,YAAAF,EAAAE,EAAA,CAAAC,EAAAc,KAAAhB,EAAAK,GAAA0B,QAAAC,QAAA3B,GAAA4B,KAAAtD,EAAAP,EAAA,UAAA2H,GAAApH,EAAAoB,GAAA,gBAAApB,GAAA,GAAA/B,MAAAC,QAAA8B,GAAA,OAAAA,CAAA,CAAAkoB,CAAAloB,IAAA,SAAAA,EAAAmC,GAAA,IAAAd,EAAA,MAAArB,EAAA,yBAAAtE,QAAAsE,EAAAtE,OAAAa,WAAAyD,EAAA,uBAAAqB,EAAA,KAAAD,EAAAE,EAAAC,EAAAG,EAAAO,EAAA,GAAAL,GAAA,EAAAnC,GAAA,SAAA8B,GAAAF,EAAAA,EAAAtB,KAAAC,IAAAkL,KAAA,IAAA/I,EAAA,IAAArF,OAAAuE,KAAAA,EAAA,OAAAO,GAAA,cAAAA,GAAAR,EAAAG,EAAAxB,KAAAsB,IAAAgB,QAAAJ,EAAA1B,KAAAa,EAAAlB,OAAA+B,EAAArB,SAAAuB,GAAAP,GAAA,UAAA5B,GAAAP,GAAA,EAAA6B,EAAAtB,CAAA,iBAAA4B,GAAA,MAAAP,EAAAiB,SAAAZ,EAAAL,EAAAiB,SAAAxF,OAAA4E,KAAAA,GAAA,kBAAAjC,EAAA,MAAA6B,CAAA,SAAAW,CAAA,EAAAkmB,CAAAnoB,EAAAoB,IAAA,SAAApB,EAAAiC,GAAA,GAAAjC,EAAA,qBAAAA,EAAA,OAAAoK,GAAApK,EAAAiC,GAAA,IAAAZ,EAAA,GAAA6G,SAAAnI,KAAAC,GAAA2K,MAAA,uBAAAtJ,GAAArB,EAAAjC,cAAAsD,EAAArB,EAAAjC,YAAA6M,MAAA,QAAAvJ,GAAA,QAAAA,EAAApD,MAAA4M,KAAA7K,GAAA,cAAAqB,GAAA,2CAAAyJ,KAAAzJ,GAAA+I,GAAApK,EAAAiC,QAAA,GAAA8I,CAAA/K,EAAAoB,IAAA,qBAAAgB,UAAA,6IAAAgmB,EAAA,UAAAhe,GAAApK,EAAAiC,IAAA,MAAAA,GAAAA,EAAAjC,EAAAY,UAAAqB,EAAAjC,EAAAY,QAAA,QAAAQ,EAAA,EAAAE,EAAArD,MAAAgE,GAAAb,EAAAa,EAAAb,IAAAE,EAAAF,GAAApB,EAAAoB,GAAA,OAAAE,CAAA,CAwKA,SAnKoB,SAAH+mB,GAwBX,IAvBJ7f,EAAY6f,EAAZ7f,aACA0H,EAAOmY,EAAPnY,QACAC,EAAKkY,EAALlY,MAAKmY,EAAAD,EACLhY,MAAAA,OAAK,IAAAiY,EAAG,UAASA,EAAAC,EAAAF,EACjB/X,SAAAA,OAAQ,IAAAiY,EAAG,KAAIA,EAAAC,EAAAH,EACf3X,cAAAA,OAAa,IAAA8X,GAAOA,EAAAC,EAAAJ,EAGpB9X,sBAAAA,OAAqB,IAAAkY,EAAG,KAAIA,EAE5BC,EAAWL,EAAXK,YACAC,EAAcN,EAAdM,eACAC,EAAkBP,EAAlBO,mBACAC,EAAkBR,EAAlBQ,mBACAC,EAAiBT,EAAjBS,kBACAC,EAAiBV,EAAjBU,kBACAC,EAAOX,EAAPW,QACAC,EAASZ,EAATY,UACAC,EAASb,EAATa,UACAC,EAAad,EAAbc,cAAaC,EAAAf,EACbgB,UAAAA,OAAS,IAAAD,EAAG,GAAEA,EAAAE,EAAAjB,EACdkB,MAAAA,OAAK,IAAAD,EAAG,CAAC,EAACA,EACVE,EAAQnB,EAARmB,SAEqDC,EAAAriB,IAAfrI,EAAAA,GAAAA,WAAS,GAAM,GAA9C6I,EAAW6hB,EAAA,GAAEC,EAAcD,EAAA,GACmBE,EAAAviB,IAAfrI,EAAAA,GAAAA,WAAS,GAAM,GAA9C0L,EAAWkf,EAAA,GAAEC,EAAcD,EAAA,GACeE,EAAAziB,IAAfrI,EAAAA,GAAAA,WAAS,GAAM,GAA/B+qB,GAAFD,EAAA,GAAcA,EAAA,IAC0CE,EAAA3iB,IAAxBrI,EAAAA,GAAAA,UAAS,gBAAe,GAA/CirB,GAAFD,EAAA,GAAqBA,EAAA,IAEtCE,GAAcprB,EAAAA,GAAAA,QAAO,OAG3BH,EAAAA,GAAAA,WAAU,WACRwC,QAAQkS,IAAI,mDAADjS,OAAoDqH,IAG3DyhB,EAAYC,UACdhpB,QAAQkS,IAAI,0DACZ6W,EAAYC,QAAQ7W,UACpB4W,EAAYC,QAAU,MAGxB,IAAMC,EAAW,IAAIla,GAAS,CAC5BzH,aAAAA,EACA0H,QAAAA,EACAC,MAAAA,EACAE,MAAAA,EACAC,SAAAA,EACAI,cAAAA,EACAH,sBAAAA,IA0DF,OAtDA4Z,EAASlhB,GAAG,YAAa,WACvBygB,GAAe,GACfM,EAAoB,aACpBtB,SAAAA,GACF,GAEAyB,EAASlhB,GAAG,eAAgB,WAC1BygB,GAAe,GACfM,EAAoB,gBACpBrB,SAAAA,GACF,GAEAwB,EAASlhB,GAAG,mBAAoB,WAC9B2gB,GAAe,GACfhB,SAAAA,GACF,GAEAuB,EAASlhB,GAAG,mBAAoB,WAC9B2gB,GAAe,GACff,SAAAA,GACF,GAEAsB,EAASlhB,GAAG,kBAAmB,WAC7B6gB,GAAa,GACbhB,SAAAA,GACF,GAEAqB,EAASlhB,GAAG,kBAAmB,WAC7B6gB,GAAa,GACbf,SAAAA,GACF,GAEAoB,EAASlhB,GAAG,QAAS,SAAChI,GACpB+nB,SAAAA,EAAU/nB,EACZ,GAEAkpB,EAASlhB,GAAG,UAAW,SAACG,GACtB6f,SAAAA,EAAY7f,EACd,GAEA+gB,EAASlhB,GAAG,UAAW,SAACG,GACtB8f,SAAAA,EAAY9f,EACd,GAEA+gB,EAASlhB,GAAG,cAAe,SAACG,GAC1B+f,SAAAA,EAAgB/f,EAClB,GAEA6gB,EAAYC,QAAUC,EAGtBA,EAASnd,UAGF,WACL9L,QAAQkS,IAAI,sDAADjS,OAAuDqH,IAC9DyhB,EAAYC,UACdD,EAAYC,QAAQ7W,UACpB4W,EAAYC,QAAU,KAE1B,CACF,EAAG,CAAC1hB,EAAc0H,EAASC,EAAOE,EAAOC,EAAUC,IAGnD,IAAM6Z,EAAW,eA3HnB9oB,EA2HmB+oB,GA3HnB/oB,EA2HmBuB,KAAAE,EAAG,SAAAkC,IAAA,IAAA4G,EAAA,OAAAhJ,KAAAC,EAAA,SAAAwC,GAAA,cAAAA,EAAAzD,EAAAyD,EAAAhE,GAAA,UACb2oB,EAAYC,QAAS,CAAF5kB,EAAAhE,EAAA,eAAAgE,EAAArD,EAAA,iBAAAqD,EAAAzD,EAAA,EAAAyD,EAAAhE,EAAA,EAGhB2oB,EAAYC,QAAQI,kBAAiB,OAAAhlB,EAAAhE,EAAA,eAAAgE,EAAAzD,EAAA,EAAAgK,EAAAvG,EAAAtD,EAE3Cd,QAAQD,MAAM,4BAA2B4K,GAAS,cAAAvG,EAAArD,EAAA,KAAAgD,EAAA,gBAjIxD,eAAA5D,EAAA,KAAAD,EAAAT,UAAA,WAAAyC,QAAA,SAAApD,EAAAP,GAAA,IAAAwC,EAAAX,EAAAN,MAAAK,EAAAD,GAAA,SAAA6E,EAAA3E,GAAA6B,GAAAlB,EAAAjC,EAAAP,EAAAwG,EAAAC,EAAA,OAAA5E,EAAA,UAAA4E,EAAA5E,GAAA6B,GAAAlB,EAAAjC,EAAAP,EAAAwG,EAAAC,EAAA,QAAA5E,EAAA,CAAA2E,OAAA,OAmIG,kBARgB,OAAAokB,EAAArpB,MAAA,KAAAL,UAAA,KAWX4pB,GACJC,EAAAA,GAAAA,MAAA,OAAKjB,MAAO,CAAEkB,QAAS,OAAQC,WAAY,SAAUC,IAAK,OAAQnB,SAAA,EAChEoB,EAAAA,GAAAA,KAAA,OAAKrB,MAAO,CAAEsB,SAAU,QAASrB,SAC9B/e,EAAc,KAAO,QAExBmgB,EAAAA,GAAAA,KAAA,OAAApB,SACG/e,EAAc,iBAAmB,uBAKxC,OACEmgB,EAAAA,GAAAA,KAAA,UACEvB,UAAS,gBAAAloB,OAAkBsJ,EAAc,YAAc,GAAE,KAAAtJ,OAAIkoB,GAC7DE,MAAK1Z,GAAA,CACHib,QAAS,YACTC,OAAQ,OACRC,aAAc,MACdC,gBAAiBxgB,EAAc,UAAY,UAC3CygB,MAAO,QACPC,OAAQ,UACRN,SAAU,OACVO,WAAY,MACZC,WAAY,iBACT9B,GAEL+B,QAASlB,EACTmB,UAAW3jB,EAAY4hB,SAEtBA,GAAYe,GAGnB,E,uPCtKA,IAAAnpB,EAAAC,EAAArB,EAAA,mBAAAtE,OAAAA,OAAA,GAAA4F,EAAAtB,EAAAzD,UAAA,aAAAkD,EAAAO,EAAAC,aAAA,yBAAAsB,EAAAvB,EAAAsB,EAAA7B,EAAA8B,GAAA,IAAAC,EAAAF,GAAAA,EAAA/D,qBAAAkE,EAAAH,EAAAG,EAAAC,EAAA5E,OAAA6B,OAAA6C,EAAAjE,WAAA,OAAAoE,GAAAD,EAAA,mBAAA1B,EAAAsB,EAAA7B,GAAA,IAAA8B,EAAAC,EAAAE,EAAAE,EAAA,EAAAC,EAAApC,GAAA,GAAAqC,GAAA,EAAAC,EAAA,CAAAF,EAAA,EAAAP,EAAA,EAAAU,EAAAZ,EAAAa,EAAA1C,EAAAqC,EAAArC,EAAA2C,KAAAd,EAAA,GAAA7B,EAAA,SAAA8B,EAAArB,GAAA,OAAAuB,EAAAF,EAAAG,EAAA,EAAAE,EAAAN,EAAAW,EAAAT,EAAAtB,EAAAiC,CAAA,YAAA1C,EAAAS,EAAAsB,GAAA,IAAAE,EAAAxB,EAAA0B,EAAAJ,EAAAD,EAAA,GAAAS,GAAAF,IAAAnC,GAAA4B,EAAAQ,EAAAjB,OAAAS,IAAA,KAAA5B,EAAA8B,EAAAM,EAAAR,GAAA9B,EAAAwC,EAAAF,EAAAM,EAAAZ,EAAA,GAAAvB,EAAA,GAAAP,EAAA0C,IAAAb,KAAAI,EAAAH,GAAAC,EAAAD,EAAA,OAAAC,EAAA,MAAAD,EAAA,GAAAA,EAAA,GAAAH,GAAAG,EAAA,IAAAhC,KAAAE,EAAAO,EAAA,GAAAT,EAAAgC,EAAA,KAAAC,EAAA,EAAAO,EAAAC,EAAAV,EAAAS,EAAAT,EAAAC,EAAA,IAAAhC,EAAA4C,IAAA1C,EAAAO,EAAA,GAAAuB,EAAA,GAAAD,GAAAA,EAAAa,KAAAZ,EAAA,GAAAvB,EAAAuB,EAAA,GAAAD,EAAAS,EAAAT,EAAAa,EAAAX,EAAA,OAAA/B,GAAAO,EAAA,SAAAiC,EAAA,MAAAH,GAAA,EAAAR,CAAA,iBAAA7B,EAAAoC,EAAAM,GAAA,GAAAP,EAAA,QAAAQ,UAAA,oCAAAN,GAAA,IAAAD,GAAAtC,EAAAsC,EAAAM,GAAAX,EAAAK,EAAAH,EAAAS,GAAAd,EAAAG,EAAA,EAAAJ,EAAAM,KAAAI,GAAA,CAAAP,IAAAC,EAAAA,EAAA,GAAAA,EAAA,IAAAO,EAAAT,GAAA,GAAA/B,EAAAiC,EAAAE,IAAAK,EAAAT,EAAAI,EAAAK,EAAAC,EAAAN,GAAA,OAAAE,EAAA,EAAAL,EAAA,IAAAC,IAAA/B,EAAA,QAAA4B,EAAAE,EAAA9B,GAAA,MAAA4B,EAAAA,EAAAtB,KAAAwB,EAAAG,IAAA,MAAAU,UAAA,wCAAAf,EAAAgB,KAAA,OAAAhB,EAAAK,EAAAL,EAAAnB,MAAAsB,EAAA,IAAAA,EAAA,YAAAA,IAAAH,EAAAE,EAAAe,SAAAjB,EAAAtB,KAAAwB,GAAAC,EAAA,IAAAE,EAAAU,UAAA,oCAAA3C,EAAA,YAAA+B,EAAA,GAAAD,EAAAH,CAAA,UAAAC,GAAAS,EAAAC,EAAAT,EAAA,GAAAI,EAAA1B,EAAAD,KAAAuB,EAAAS,MAAAE,EAAA,YAAAZ,GAAAE,EAAAH,EAAAI,EAAA,EAAAE,EAAAL,CAAA,SAAAO,EAAA,UAAA1B,MAAAmB,EAAAgB,KAAAP,EAAA,GAAA9B,EAAAP,EAAA8B,IAAA,GAAAG,CAAA,KAAAO,EAAA,YAAAR,IAAA,UAAAc,IAAA,UAAAC,IAAA,CAAAnB,EAAAvE,OAAA2F,eAAA,IAAAjB,EAAA,GAAAF,GAAAD,EAAAA,EAAA,GAAAC,QAAAK,GAAAN,EAAA,GAAAC,EAAA,yBAAAD,GAAAK,EAAAc,EAAAjF,UAAAkE,EAAAlE,UAAAT,OAAA6B,OAAA6C,GAAA,SAAAI,EAAAR,GAAA,OAAAtE,OAAA4F,eAAA5F,OAAA4F,eAAAtB,EAAAoB,IAAApB,EAAAuB,UAAAH,EAAAb,GAAAP,EAAA3B,EAAA,sBAAA2B,EAAA7D,UAAAT,OAAA6B,OAAA+C,GAAAN,CAAA,QAAAmB,EAAAhF,UAAAiF,EAAAb,GAAAD,EAAA,cAAAc,GAAAb,GAAAa,EAAA,cAAAD,GAAAA,EAAAK,YAAA,oBAAAjB,GAAAa,EAAA/C,EAAA,qBAAAkC,GAAAD,GAAAC,GAAAD,EAAAjC,EAAA,aAAAkC,GAAAD,EAAAJ,EAAA,yBAAAK,GAAAD,EAAA,oDAAAmB,GAAA,kBAAAC,EAAAvB,EAAAwB,EAAAnB,EAAA,cAAAD,GAAAP,EAAApB,EAAAsB,EAAAD,GAAA,IAAAE,EAAAzE,OAAA4C,eAAA,IAAA6B,EAAA,gBAAAH,GAAAG,EAAA,EAAAI,GAAA,SAAAP,EAAApB,EAAAsB,EAAAD,GAAA,SAAA5B,EAAAO,EAAAsB,GAAAK,GAAAP,EAAApB,EAAA,SAAAoB,GAAA,YAAA4B,QAAAhD,EAAAsB,EAAAF,EAAA,GAAApB,EAAAuB,EAAAA,EAAAH,EAAApB,EAAA,CAAAE,MAAAoB,EAAA3B,YAAA0B,EAAA4B,cAAA5B,EAAA6B,UAAA7B,IAAAD,EAAApB,GAAAsB,GAAA7B,EAAA,UAAAA,EAAA,WAAAA,EAAA,cAAAkC,GAAAP,EAAApB,EAAAsB,EAAAD,EAAA,UAAA8B,GAAA7B,EAAAD,EAAAD,EAAApB,EAAAP,EAAAwC,EAAAT,GAAA,QAAAD,EAAAD,EAAAW,GAAAT,GAAAE,EAAAH,EAAArB,KAAA,OAAAoB,GAAA,YAAAF,EAAAE,EAAA,CAAAC,EAAAc,KAAAhB,EAAAK,GAAA0B,QAAAC,QAAA3B,GAAA4B,KAAAtD,EAAAP,EAAA,UAAA0K,GAAA7I,GAAA,sBAAAD,EAAA,KAAAD,EAAAT,UAAA,WAAAyC,QAAA,SAAApD,EAAAP,GAAA,IAAAwC,EAAAX,EAAAN,MAAAK,EAAAD,GAAA,SAAA6E,EAAA3E,GAAA6B,GAAAlB,EAAAjC,EAAAP,EAAAwG,EAAAC,EAAA,OAAA5E,EAAA,UAAA4E,EAAA5E,GAAA6B,GAAAlB,EAAAjC,EAAAP,EAAAwG,EAAAC,EAAA,QAAA5E,EAAA,CAAA2E,OAAA,eAAAwJ,GAAArO,EAAApB,GAAA,IAAAqB,EAAAvE,OAAA4S,KAAAtO,GAAA,GAAAtE,OAAA6S,sBAAA,KAAAlQ,EAAA3C,OAAA6S,sBAAAvO,GAAApB,IAAAP,EAAAA,EAAAe,OAAA,SAAAR,GAAA,OAAAlD,OAAA8S,yBAAAxO,EAAApB,GAAAL,UAAA,IAAA0B,EAAAd,KAAAS,MAAAK,EAAA5B,EAAA,QAAA4B,CAAA,UAAAyO,GAAA1O,EAAApB,EAAAqB,GAAA,OAAArB,EAAAwD,GAAAxD,MAAAoB,EAAAtE,OAAA4C,eAAA0B,EAAApB,EAAA,CAAAE,MAAAmB,EAAA1B,YAAA,EAAAsD,cAAA,EAAAC,UAAA,IAAA9B,EAAApB,GAAAqB,EAAAD,CAAA,UAAAmC,GAAAnC,EAAApB,GAAA,QAAAqB,EAAA,EAAAA,EAAArB,EAAAY,OAAAS,IAAA,KAAA5B,EAAAO,EAAAqB,GAAA5B,EAAAE,WAAAF,EAAAE,aAAA,EAAAF,EAAAwD,cAAA,YAAAxD,IAAAA,EAAAyD,UAAA,GAAApG,OAAA4C,eAAA0B,EAAAoC,GAAA/D,EAAAzD,KAAAyD,EAAA,WAAA+D,GAAAnC,GAAA,IAAAE,EAAA,SAAAF,GAAA,aAAAoC,GAAApC,KAAAA,EAAA,OAAAA,EAAA,IAAAD,EAAAC,EAAA3F,OAAAgI,aAAA,YAAAtC,EAAA,KAAAG,EAAAH,EAAArB,KAAAsB,EAAArB,UAAA,aAAAyD,GAAAlC,GAAA,OAAAA,EAAA,UAAAa,UAAA,uDAAAuB,OAAAtC,EAAA,CAAAuC,CAAAvC,GAAA,gBAAAoC,GAAAlC,GAAAA,EAAAA,EAAA,GAE2C,IAEtBiqB,GAAW,WA6B9B,OAjCFpqB,EAKE,SAAAoqB,IAA0B,IAAdC,EAAO9qB,UAAAC,OAAA,QAAAvB,IAAAsB,UAAA,GAAAA,UAAA,GAAG,CAAC,GALzB,SAAAsB,EAAAX,GAAA,KAAAW,aAAAX,GAAA,UAAAc,UAAA,qCAK0BhC,CAAA,KAAAorB,GACtBruB,KAAKsuB,QANT,SAAArqB,GAAA,QAAApB,EAAA,EAAAA,EAAAW,UAAAC,OAAAZ,IAAA,KAAAqB,EAAA,MAAAV,UAAAX,GAAAW,UAAAX,GAAA,GAAAA,EAAA,EAAAyP,GAAA3S,OAAAuE,IAAA,GAAAN,QAAA,SAAAf,GAAA8P,GAAA1O,EAAApB,EAAAqB,EAAArB,GAAA,GAAAlD,OAAAiT,0BAAAjT,OAAAkT,iBAAA5O,EAAAtE,OAAAiT,0BAAA1O,IAAAoO,GAAA3S,OAAAuE,IAAAN,QAAA,SAAAf,GAAAlD,OAAA4C,eAAA0B,EAAApB,EAAAlD,OAAA8S,yBAAAvO,EAAArB,GAAA,UAAAoB,CAAA,CAMgByO,CAAA,CACVrH,aAAcijB,EAAQjjB,cAAgB,oCACtC0H,QAASub,EAAQvb,QACjBG,MAAOob,EAAQpb,OAAS,UACxBC,SAAUmb,EAAQnb,UAAY,KAC9BoG,UAAW+U,EAAQ/U,WAAavL,SAASugB,KACzCC,WAAYF,EAAQE,YAAc,kBAClCC,YAAaH,EAAQG,aAAe,gBACjCH,GAGLtuB,KAAKyK,aAAc,EACnBzK,KAAKsN,aAAc,EACnBtN,KAAK6Q,WAAY,EAEjB7Q,KAAKgtB,SAAW,IAAIla,GAAS,CAC3BzH,aAAcrL,KAAKsuB,QAAQjjB,aAC3B0H,QAAS/S,KAAKsuB,QAAQvb,QACtBG,MAAOlT,KAAKsuB,QAAQpb,MACpBC,SAAUnT,KAAKsuB,QAAQnb,WAGzBnT,KAAKsL,sBACLtL,KAAK0uB,eACL1uB,KAAK6P,SACP,EA/BFhN,EAiCE,EAAAhE,IAAA,sBAAAkE,MAGA,WAAsB,IAAAoE,EAAA,KACpBnH,KAAKgtB,SAASlhB,GAAG,YAAa,WAAM,IAAA6iB,EAAAC,EAClCznB,EAAKsD,aAAc,EACnBtD,EAAK0nB,eACmB,QAAxBF,GAAAC,EAAAznB,EAAKmnB,SAAQ/C,mBAAW,IAAAoD,GAAxBA,EAAA/rB,KAAAgsB,EACF,GAEA5uB,KAAKgtB,SAASlhB,GAAG,eAAgB,WAAM,IAAAgjB,EAAAC,EACrC5nB,EAAKsD,aAAc,EACnBtD,EAAK0nB,eACsB,QAA3BC,GAAAC,EAAA5nB,EAAKmnB,SAAQ9C,sBAAc,IAAAsD,GAA3BA,EAAAlsB,KAAAmsB,EACF,GAEA/uB,KAAKgtB,SAASlhB,GAAG,mBAAoB,WAAM,IAAAkjB,EAAAC,EACzC9nB,EAAKmG,aAAc,EACnBnG,EAAK0nB,eAC0B,QAA/BG,GAAAC,EAAA9nB,EAAKmnB,SAAQ7C,0BAAkB,IAAAuD,GAA/BA,EAAApsB,KAAAqsB,EACF,GAEAjvB,KAAKgtB,SAASlhB,GAAG,mBAAoB,WAAM,IAAAojB,EAAAC,EACzChoB,EAAKmG,aAAc,EACnBnG,EAAK0nB,eAC0B,QAA/BK,GAAAC,EAAAhoB,EAAKmnB,SAAQ5C,0BAAkB,IAAAwD,GAA/BA,EAAAtsB,KAAAusB,EACF,GAEAnvB,KAAKgtB,SAASlhB,GAAG,kBAAmB,WAAM,IAAAsjB,EAAAC,EACxCloB,EAAK0J,WAAY,EACa,QAA9Bue,GAAAC,EAAAloB,EAAKmnB,SAAQ3C,yBAAiB,IAAAyD,GAA9BA,EAAAxsB,KAAAysB,EACF,GAEArvB,KAAKgtB,SAASlhB,GAAG,kBAAmB,WAAM,IAAAwjB,EAAAC,EACxCpoB,EAAK0J,WAAY,EACa,QAA9Bye,GAAAC,EAAApoB,EAAKmnB,SAAQ1C,yBAAiB,IAAA0D,GAA9BA,EAAA1sB,KAAA2sB,EACF,GAEAvvB,KAAKgtB,SAASlhB,GAAG,QAAS,SAAChI,GAAU,IAAA0rB,EAAAC,EACf,QAApBD,GAAAC,EAAAtoB,EAAKmnB,SAAQzC,eAAO,IAAA2D,GAApBA,EAAA5sB,KAAA6sB,EAAuB3rB,EACzB,GAEA9D,KAAKgtB,SAASlhB,GAAG,UAAW,SAACG,GAAY,IAAAyjB,EAAAC,EACjB,QAAtBD,GAAAC,EAAAxoB,EAAKmnB,SAAQxC,iBAAS,IAAA4D,GAAtBA,EAAA9sB,KAAA+sB,EAAyB1jB,EAC3B,GAEAjM,KAAKgtB,SAASlhB,GAAG,UAAW,SAACG,GAAY,IAAA2jB,EAAAC,EACjB,QAAtBD,GAAAC,EAAA1oB,EAAKmnB,SAAQvC,iBAAS,IAAA6D,GAAtBA,EAAAhtB,KAAAitB,EAAyB5jB,EAC3B,GAEAjM,KAAKgtB,SAASlhB,GAAG,cAAe,SAACG,GAAY,IAAA6jB,EAAAC,EACjB,QAA1BD,GAAAC,EAAA5oB,EAAKmnB,SAAQtC,qBAAa,IAAA8D,GAA1BA,EAAAltB,KAAAmtB,EAA6B9jB,EAC/B,EACF,GAEA,CAAApN,IAAA,eAAAkE,MAGA,WAAe,IAAAmF,EAAA,KACblI,KAAKgwB,OAAShiB,SAASiiB,cAAc,UACrCjwB,KAAKgwB,OAAO9D,UAAYlsB,KAAKsuB,QAAQG,YACrCzuB,KAAKgwB,OAAO5D,MAAM8D,QAAU,yTAe5BlwB,KAAKgwB,OAAOtnB,iBAAiB,QAAS,kBAAMR,EAAKilB,iBAAiB,GAClEntB,KAAKsuB,QAAQ/U,UAAU4W,YAAYnwB,KAAKgwB,QAExChwB,KAAK6uB,cACP,GAEA,CAAAhwB,IAAA,eAAAkE,MAGA,WACE,GAAK/C,KAAKgwB,OAAV,CAEA,IAAMI,EAAOpwB,KAAKsN,YAAc,KAAO,KACjC2b,EAAOjpB,KAAKsN,YAAc,iBAAmB,kBAEnDtN,KAAKgwB,OAAOK,UAAY,0CAAHrsB,OACcosB,EAAI,yBAAApsB,OAC7BilB,EAAI,iBAGdjpB,KAAKgwB,OAAO5B,UAAYpuB,KAAKyK,YAC7BzK,KAAKgwB,OAAO5D,MAAM0B,gBAAkB9tB,KAAKsN,YAAc,UACrBtN,KAAKyK,YAAc,UAAY,SAZzC,CAa1B,GAEA,CAAA5L,IAAA,UAAAkE,OAAAyI,EAAAwB,GAAAtH,KAAAE,EAGA,SAAAkC,IAAA,IAAA4G,EAAA,OAAAhJ,KAAAC,EAAA,SAAAwC,GAAA,cAAAA,EAAAzD,EAAAyD,EAAAhE,GAAA,cAAAgE,EAAAzD,EAAA,EAAAyD,EAAAhE,EAAA,EAEUnE,KAAKgtB,SAASnd,UAAS,OAAA1H,EAAAhE,EAAA,eAAAgE,EAAAzD,EAAA,EAAAgK,EAAAvG,EAAAtD,EAE7Bd,QAAQD,MAAM,qBAAoB4K,GAAS,cAAAvG,EAAArD,EAAA,KAAAgD,EAAA,iBAE9C,WANY,OAAA0D,EAAA3H,MAAC,KAADL,UAAA,IAQb,CAAA3E,IAAA,kBAAAkE,OAAAwS,EAAAvI,GAAAtH,KAAAE,EAGA,SAAAwK,IAAA,IAAAC,EAAA,OAAA3K,KAAAC,EAAA,SAAA2K,GAAA,cAAAA,EAAA5L,EAAA4L,EAAAnM,GAAA,UACOnE,KAAKgtB,SAAU,CAAF1c,EAAAnM,EAAA,eAAAmM,EAAAxL,EAAA,iBAAAwL,EAAA5L,EAAA,EAAA4L,EAAAnM,EAAA,EAGVnE,KAAKgtB,SAASG,kBAAiB,OAAA7c,EAAAnM,EAAA,eAAAmM,EAAA5L,EAAA,EAAA2L,EAAAC,EAAAzL,EAErCd,QAAQD,MAAM,4BAA2BuM,GAAS,cAAAC,EAAAxL,EAAA,KAAAsL,EAAA,iBAErD,WARoB,OAAAmF,EAAA1R,MAAC,KAADL,UAAA,IAUrB,CAAA3E,IAAA,YAAAkE,MAGA,WACE,MAAO,CACL0H,YAAazK,KAAKyK,YAClB6C,YAAatN,KAAKsN,YAClBuD,UAAW7Q,KAAK6Q,UAEpB,GAEA,CAAAhS,IAAA,eAAAkE,MAGA,SAAagT,GACX/V,KAAKgtB,SAASsD,aAAava,EAC7B,GAEA,CAAAlX,IAAA,UAAAkE,MAGA,WACM/C,KAAKgwB,QAAUhwB,KAAKgwB,OAAOO,YAC7BvwB,KAAKgwB,OAAOO,WAAWC,YAAYxwB,KAAKgwB,QAGtChwB,KAAKgtB,UACPhtB,KAAKgtB,SAAS9W,SAElB,IA3LFrT,GAAAuD,GAAAnC,EAAA7D,UAAAyC,GAAAlD,OAAA4C,eAAA0B,EAAA,aAAA8B,UAAA,IAAA9B,EAAA,IAAAA,EAAApB,EAiJE0S,EAXA/J,CAqDC,CAvL6B,G,uPCJhC,IAAAvH,EAAAC,EAAArB,EAAA,mBAAAtE,OAAAA,OAAA,GAAA4F,EAAAtB,EAAAzD,UAAA,aAAAkD,EAAAO,EAAAC,aAAA,yBAAAsB,EAAAvB,EAAAsB,EAAA7B,EAAA8B,GAAA,IAAAC,EAAAF,GAAAA,EAAA/D,qBAAAkE,EAAAH,EAAAG,EAAAC,EAAA5E,OAAA6B,OAAA6C,EAAAjE,WAAA,OAAAoE,GAAAD,EAAA,mBAAA1B,EAAAsB,EAAA7B,GAAA,IAAA8B,EAAAC,EAAAE,EAAAE,EAAA,EAAAC,EAAApC,GAAA,GAAAqC,GAAA,EAAAC,EAAA,CAAAF,EAAA,EAAAP,EAAA,EAAAU,EAAAZ,EAAAa,EAAA1C,EAAAqC,EAAArC,EAAA2C,KAAAd,EAAA,GAAA7B,EAAA,SAAA8B,EAAArB,GAAA,OAAAuB,EAAAF,EAAAG,EAAA,EAAAE,EAAAN,EAAAW,EAAAT,EAAAtB,EAAAiC,CAAA,YAAA1C,EAAAS,EAAAsB,GAAA,IAAAE,EAAAxB,EAAA0B,EAAAJ,EAAAD,EAAA,GAAAS,GAAAF,IAAAnC,GAAA4B,EAAAQ,EAAAjB,OAAAS,IAAA,KAAA5B,EAAA8B,EAAAM,EAAAR,GAAA9B,EAAAwC,EAAAF,EAAAM,EAAAZ,EAAA,GAAAvB,EAAA,GAAAP,EAAA0C,IAAAb,KAAAI,EAAAH,GAAAC,EAAAD,EAAA,OAAAC,EAAA,MAAAD,EAAA,GAAAA,EAAA,GAAAH,GAAAG,EAAA,IAAAhC,KAAAE,EAAAO,EAAA,GAAAT,EAAAgC,EAAA,KAAAC,EAAA,EAAAO,EAAAC,EAAAV,EAAAS,EAAAT,EAAAC,EAAA,IAAAhC,EAAA4C,IAAA1C,EAAAO,EAAA,GAAAuB,EAAA,GAAAD,GAAAA,EAAAa,KAAAZ,EAAA,GAAAvB,EAAAuB,EAAA,GAAAD,EAAAS,EAAAT,EAAAa,EAAAX,EAAA,OAAA/B,GAAAO,EAAA,SAAAiC,EAAA,MAAAH,GAAA,EAAAR,CAAA,iBAAA7B,EAAAoC,EAAAM,GAAA,GAAAP,EAAA,QAAAQ,UAAA,oCAAAN,GAAA,IAAAD,GAAAtC,EAAAsC,EAAAM,GAAAX,EAAAK,EAAAH,EAAAS,GAAAd,EAAAG,EAAA,EAAAJ,EAAAM,KAAAI,GAAA,CAAAP,IAAAC,EAAAA,EAAA,GAAAA,EAAA,IAAAO,EAAAT,GAAA,GAAA/B,EAAAiC,EAAAE,IAAAK,EAAAT,EAAAI,EAAAK,EAAAC,EAAAN,GAAA,OAAAE,EAAA,EAAAL,EAAA,IAAAC,IAAA/B,EAAA,QAAA4B,EAAAE,EAAA9B,GAAA,MAAA4B,EAAAA,EAAAtB,KAAAwB,EAAAG,IAAA,MAAAU,UAAA,wCAAAf,EAAAgB,KAAA,OAAAhB,EAAAK,EAAAL,EAAAnB,MAAAsB,EAAA,IAAAA,EAAA,YAAAA,IAAAH,EAAAE,EAAAe,SAAAjB,EAAAtB,KAAAwB,GAAAC,EAAA,IAAAE,EAAAU,UAAA,oCAAA3C,EAAA,YAAA+B,EAAA,GAAAD,EAAAH,CAAA,UAAAC,GAAAS,EAAAC,EAAAT,EAAA,GAAAI,EAAA1B,EAAAD,KAAAuB,EAAAS,MAAAE,EAAA,YAAAZ,GAAAE,EAAAH,EAAAI,EAAA,EAAAE,EAAAL,CAAA,SAAAO,EAAA,UAAA1B,MAAAmB,EAAAgB,KAAAP,EAAA,GAAA9B,EAAAP,EAAA8B,IAAA,GAAAG,CAAA,KAAAO,EAAA,YAAAR,IAAA,UAAAc,IAAA,UAAAC,IAAA,CAAAnB,EAAAvE,OAAA2F,eAAA,IAAAjB,EAAA,GAAAF,GAAAD,EAAAA,EAAA,GAAAC,QAAAK,GAAAN,EAAA,GAAAC,EAAA,yBAAAD,GAAAK,EAAAc,EAAAjF,UAAAkE,EAAAlE,UAAAT,OAAA6B,OAAA6C,GAAA,SAAAI,EAAAR,GAAA,OAAAtE,OAAA4F,eAAA5F,OAAA4F,eAAAtB,EAAAoB,IAAApB,EAAAuB,UAAAH,EAAAb,GAAAP,EAAA3B,EAAA,sBAAA2B,EAAA7D,UAAAT,OAAA6B,OAAA+C,GAAAN,CAAA,QAAAmB,EAAAhF,UAAAiF,EAAAb,GAAAD,EAAA,cAAAc,GAAAb,GAAAa,EAAA,cAAAD,GAAAA,EAAAK,YAAA,oBAAAjB,GAAAa,EAAA/C,EAAA,qBAAAkC,GAAAD,GAAAC,GAAAD,EAAAjC,EAAA,aAAAkC,GAAAD,EAAAJ,EAAA,yBAAAK,GAAAD,EAAA,oDAAAmB,GAAA,kBAAAC,EAAAvB,EAAAwB,EAAAnB,EAAA,cAAAD,GAAAP,EAAApB,EAAAsB,EAAAD,GAAA,IAAAE,EAAAzE,OAAA4C,eAAA,IAAA6B,EAAA,gBAAAH,GAAAG,EAAA,EAAAI,GAAA,SAAAP,EAAApB,EAAAsB,EAAAD,GAAA,SAAA5B,EAAAO,EAAAsB,GAAAK,GAAAP,EAAApB,EAAA,SAAAoB,GAAA,YAAA4B,QAAAhD,EAAAsB,EAAAF,EAAA,GAAApB,EAAAuB,EAAAA,EAAAH,EAAApB,EAAA,CAAAE,MAAAoB,EAAA3B,YAAA0B,EAAA4B,cAAA5B,EAAA6B,UAAA7B,IAAAD,EAAApB,GAAAsB,GAAA7B,EAAA,UAAAA,EAAA,WAAAA,EAAA,cAAAkC,GAAAP,EAAApB,EAAAsB,EAAAD,EAAA,UAAA8B,GAAA7B,EAAAD,EAAAD,EAAApB,EAAAP,EAAAwC,EAAAT,GAAA,QAAAD,EAAAD,EAAAW,GAAAT,GAAAE,EAAAH,EAAArB,KAAA,OAAAoB,GAAA,YAAAF,EAAAE,EAAA,CAAAC,EAAAc,KAAAhB,EAAAK,GAAA0B,QAAAC,QAAA3B,GAAA4B,KAAAtD,EAAAP,EAAA,UAAA0K,GAAA7I,GAAA,sBAAAD,EAAA,KAAAD,EAAAT,UAAA,WAAAyC,QAAA,SAAApD,EAAAP,GAAA,IAAAwC,EAAAX,EAAAN,MAAAK,EAAAD,GAAA,SAAA6E,EAAA3E,GAAA6B,GAAAlB,EAAAjC,EAAAP,EAAAwG,EAAAC,EAAA,OAAA5E,EAAA,UAAA4E,EAAA5E,GAAA6B,GAAAlB,EAAAjC,EAAAP,EAAAwG,EAAAC,EAAA,QAAA5E,EAAA,CAAA2E,OAAA,eAAA1C,GAAAnC,EAAApB,GAAA,QAAAqB,EAAA,EAAAA,EAAArB,EAAAY,OAAAS,IAAA,KAAA5B,EAAAO,EAAAqB,GAAA5B,EAAAE,WAAAF,EAAAE,aAAA,EAAAF,EAAAwD,cAAA,YAAAxD,IAAAA,EAAAyD,UAAA,GAAApG,OAAA4C,eAAA0B,EAAAoC,GAAA/D,EAAAzD,KAAAyD,EAAA,WAAA+D,GAAAnC,GAAA,IAAAE,EAAA,SAAAF,GAAA,aAAAoC,GAAApC,KAAAA,EAAA,OAAAA,EAAA,IAAAD,EAAAC,EAAA3F,OAAAgI,aAAA,YAAAtC,EAAA,KAAAG,EAAAH,EAAArB,KAAAsB,EAAArB,UAAA,aAAAyD,GAAAlC,GAAA,OAAAA,EAAA,UAAAa,UAAA,uDAAAuB,OAAAtC,EAAA,CAAAuC,CAAAvC,GAAA,gBAAAoC,GAAAlC,GAAAA,EAAAA,EAAA,GAQO,IAAMqsB,GAAQ,WAclB,OAtBHxsB,EASE,SAAAwsB,EAAY9xB,IATd,SAAAmG,EAAAX,GAAA,KAAAW,aAAAX,GAAA,UAAAc,UAAA,qCASsBhC,CAAA,KAAAwtB,GAClB1sB,QAAQkS,IAAI,8CAA+CtX,GAC3DqB,KAAKrB,OAASA,EACdqB,KAAKgtB,SAAW,KAChBhtB,KAAKyK,aAAc,EACnBzK,KAAK0wB,aAAc,EAGnB1wB,KAAKurB,YAAc,WAAO,EAC1BvrB,KAAKwrB,eAAiB,WAAO,EAC7BxrB,KAAK6rB,QAAU,SAAC/nB,GAAK,OAAKC,QAAQD,MAAM,aAAcA,EAAM,EAC5D9D,KAAK2wB,aAAe,SAAC1H,GAAU,EAC/BjpB,KAAK4wB,gBAAkB,SAACC,GAAa,CACvC,EAtBFhuB,EAsBG,EAAAhE,IAAA,UAAAkE,OAAAyI,EAAAwB,GAAAtH,KAAAE,EAED,SAAAkC,EAAcgpB,GAAS,IAAApiB,EAAAvH,EAAA,YAAAzB,KAAAC,EAAA,SAAAwC,GAAA,cAAAA,EAAAzD,EAAAyD,EAAAhE,GAAA,UAAAgE,EAAAzD,EAAA,EAEdosB,EAAW,CAAF3oB,EAAAhE,EAAA,cACN,IAAI1D,MAAM,yBAAwB,OAoE1C,OAhEIT,KAAKgtB,WACPjpB,QAAQkS,IAAI,gDACZjW,KAAKgtB,SAAS9W,UACdlW,KAAKgtB,SAAW,MAIlBhtB,KAAKgtB,SAAW,IAAIla,GAAS,CAC3BzH,aAAcylB,EACdvd,eAAe,EACfR,QAAS/S,KAAKrB,OAAOoU,QACrBC,MAAOhT,KAAKrB,OAAOqU,MACnBG,SAAUnT,KAAKrB,OAAOwU,UAAY,OAIpCnT,KAAKgtB,SAASlhB,GAAG,YAAa,WAC5B3E,EAAKsD,aAAc,EACnBtD,EAAKokB,aACP,GAEAvrB,KAAKgtB,SAASlhB,GAAG,eAAgB,SAAC3I,GAGhC,GAFAgE,EAAKsD,aAAc,EAEftH,GAAwB,OAAfA,EAAMyQ,MAAiBzQ,EAAM0Q,SACrC1Q,EAAM0Q,OAAO1F,SAAS,2BACtBhL,EAAM0Q,OAAO1F,SAAS,WACtBhL,EAAM0Q,OAAO1F,SAAS,cAAe,CACxC,IAAM2F,EAAc,IAAIrT,MAAM,0BAC9BqT,EAAYD,OAAS1Q,EAAM0Q,OAC3BC,EAAYF,KAAOzQ,EAAMyQ,KACzBzM,EAAK0kB,QAAQ/X,EACf,CACA3M,EAAKqkB,gBACP,GAEAxrB,KAAKgtB,SAASlhB,GAAG,cAAe,SAAChI,GAC/BqD,EAAK0kB,QAAQ/nB,EACf,GAEA9D,KAAKgtB,SAASlhB,GAAG,QAAS,SAAChI,GACzBqD,EAAK0kB,QAAQ/nB,EACf,GAEA9D,KAAKgtB,SAASlhB,GAAG,UAAW,SAACG,GAC3B9E,EAAK4pB,uBAAuB9kB,EAC9B,GAEAjM,KAAKgtB,SAASlhB,GAAG,mBAAoB,WACnC3E,EAAKupB,aAAc,CACrB,GAEA1wB,KAAKgtB,SAASlhB,GAAG,mBAAoB,WACnC3E,EAAKupB,aAAc,CACrB,GAEA1wB,KAAKgtB,SAASlhB,GAAG,kBAAmB,WAClC3E,EAAKypB,iBAAgB,EACvB,GAEA5wB,KAAKgtB,SAASlhB,GAAG,kBAAmB,WAClC3E,EAAKypB,iBAAgB,EACvB,GAEAzoB,EAAAhE,EAAA,EACMnE,KAAKgtB,SAASnd,UAAS,OAAA1H,EAAAhE,EAAA,eAGT,MAHSgE,EAAAzD,EAAA,EAAAgK,EAAAvG,EAAAtD,EAG7B7E,KAAK6rB,QAAOnd,GAAQA,EAAA,cAAAvG,EAAArD,EAAA,KAAAgD,EAAA,iBAGvB,SA9EYkB,GAAA,OAAAwC,EAAA3H,MAAC,KAADL,UAAA,KAAA3E,IAAA,yBAAAkE,MAgFb,SAAuBkJ,GAErB,OAAQA,EAAQvN,MACd,IAAK,YACHqF,QAAQkS,IAAI,gCACZ,MAEF,IAAK,kBACHjW,KAAK2wB,aAAa1kB,EAAQ+kB,oBAAsB/kB,EAAQgd,MACxD,MAEF,IAAK,iBAIL,IAAK,WAIL,IAAK,eAEH,MAEF,IAAK,QACHjpB,KAAK6rB,QAAQ,IAAIprB,MAAMwL,EAAQA,UAGrC,GAAC,CAAApN,IAAA,iBAAAkE,OAAAkuB,EAAAjkB,GAAAtH,KAAAE,EAED,SAAAwK,IAAA,IAAAC,EAAA,OAAA3K,KAAAC,EAAA,SAAA2K,GAAA,cAAAA,EAAA5L,EAAA4L,EAAAnM,GAAA,OACsD,GAApDJ,QAAQkS,IAAI,yCACRjW,KAAKgtB,SAAU,CAAF1c,EAAAnM,EAAA,QAEqC,OAFrCmM,EAAA5L,EAAA,EAEbX,QAAQkS,IAAI,sCAAsC3F,EAAAnM,EAAA,EAC5CnE,KAAKgtB,SAAStX,iBAAgB,OACpC3R,QAAQkS,IAAI,8CAA8C3F,EAAAnM,EAAA,eAEK,MAFLmM,EAAA5L,EAAA,EAAA2L,EAAAC,EAAAzL,EAE1Dd,QAAQD,MAAM,yCAAwCuM,GAASA,EAAA,OAAAC,EAAAnM,EAAA,eAIL,MAA5DJ,QAAQD,MAAM,8CACR,IAAIrD,MAAM,kCAAiC,cAAA6P,EAAAxL,EAAA,KAAAsL,EAAA,iBAEpD,WAfmB,OAAA6gB,EAAAptB,MAAC,KAADL,UAAA,KAAA3E,IAAA,gBAAAkE,MAiBpB,WACM/C,KAAKgtB,UACPhtB,KAAKgtB,SAASjZ,eAElB,GAAC,CAAAlV,IAAA,kBAAAkE,MAED,SAAgBmuB,GACVlxB,KAAKgtB,UAAYhtB,KAAKyK,aAExBzK,KAAKgtB,SAAS1Z,iBAAiBc,YAAY,CACzClQ,EAAG,mBACHgtB,UAAAA,GAGN,GAAC,CAAAryB,IAAA,aAAAkE,MAED,WACM/C,KAAKgtB,WACPhtB,KAAKgtB,SAAS9W,UACdlW,KAAKgtB,SAAW,MAElBhtB,KAAKyK,aAAc,EACnBzK,KAAK0wB,aAAc,CACrB,IA7KF7tB,GAAAuD,GAAAnC,EAAA7D,UAAAyC,GAAAlD,OAAA4C,eAAA0B,EAAA,aAAA8B,UAAA,IAAA9B,EAAA,IAAAA,EAAApB,EAmIGouB,EA7GAzlB,CAuJA,CArKkB,G,uPCRrB,IAAAvH,EAAAC,EAAArB,EAAA,mBAAAtE,OAAAA,OAAA,GAAA4F,EAAAtB,EAAAzD,UAAA,aAAAkD,EAAAO,EAAAC,aAAA,yBAAAsB,EAAAvB,EAAAsB,EAAA7B,EAAA8B,GAAA,IAAAC,EAAAF,GAAAA,EAAA/D,qBAAAkE,EAAAH,EAAAG,EAAAC,EAAA5E,OAAA6B,OAAA6C,EAAAjE,WAAA,OAAAoE,GAAAD,EAAA,mBAAA1B,EAAAsB,EAAA7B,GAAA,IAAA8B,EAAAC,EAAAE,EAAAE,EAAA,EAAAC,EAAApC,GAAA,GAAAqC,GAAA,EAAAC,EAAA,CAAAF,EAAA,EAAAP,EAAA,EAAAU,EAAAZ,EAAAa,EAAA1C,EAAAqC,EAAArC,EAAA2C,KAAAd,EAAA,GAAA7B,EAAA,SAAA8B,EAAArB,GAAA,OAAAuB,EAAAF,EAAAG,EAAA,EAAAE,EAAAN,EAAAW,EAAAT,EAAAtB,EAAAiC,CAAA,YAAA1C,EAAAS,EAAAsB,GAAA,IAAAE,EAAAxB,EAAA0B,EAAAJ,EAAAD,EAAA,GAAAS,GAAAF,IAAAnC,GAAA4B,EAAAQ,EAAAjB,OAAAS,IAAA,KAAA5B,EAAA8B,EAAAM,EAAAR,GAAA9B,EAAAwC,EAAAF,EAAAM,EAAAZ,EAAA,GAAAvB,EAAA,GAAAP,EAAA0C,IAAAb,KAAAI,EAAAH,GAAAC,EAAAD,EAAA,OAAAC,EAAA,MAAAD,EAAA,GAAAA,EAAA,GAAAH,GAAAG,EAAA,IAAAhC,KAAAE,EAAAO,EAAA,GAAAT,EAAAgC,EAAA,KAAAC,EAAA,EAAAO,EAAAC,EAAAV,EAAAS,EAAAT,EAAAC,EAAA,IAAAhC,EAAA4C,IAAA1C,EAAAO,EAAA,GAAAuB,EAAA,GAAAD,GAAAA,EAAAa,KAAAZ,EAAA,GAAAvB,EAAAuB,EAAA,GAAAD,EAAAS,EAAAT,EAAAa,EAAAX,EAAA,OAAA/B,GAAAO,EAAA,SAAAiC,EAAA,MAAAH,GAAA,EAAAR,CAAA,iBAAA7B,EAAAoC,EAAAM,GAAA,GAAAP,EAAA,QAAAQ,UAAA,oCAAAN,GAAA,IAAAD,GAAAtC,EAAAsC,EAAAM,GAAAX,EAAAK,EAAAH,EAAAS,GAAAd,EAAAG,EAAA,EAAAJ,EAAAM,KAAAI,GAAA,CAAAP,IAAAC,EAAAA,EAAA,GAAAA,EAAA,IAAAO,EAAAT,GAAA,GAAA/B,EAAAiC,EAAAE,IAAAK,EAAAT,EAAAI,EAAAK,EAAAC,EAAAN,GAAA,OAAAE,EAAA,EAAAL,EAAA,IAAAC,IAAA/B,EAAA,QAAA4B,EAAAE,EAAA9B,GAAA,MAAA4B,EAAAA,EAAAtB,KAAAwB,EAAAG,IAAA,MAAAU,UAAA,wCAAAf,EAAAgB,KAAA,OAAAhB,EAAAK,EAAAL,EAAAnB,MAAAsB,EAAA,IAAAA,EAAA,YAAAA,IAAAH,EAAAE,EAAAe,SAAAjB,EAAAtB,KAAAwB,GAAAC,EAAA,IAAAE,EAAAU,UAAA,oCAAA3C,EAAA,YAAA+B,EAAA,GAAAD,EAAAH,CAAA,UAAAC,GAAAS,EAAAC,EAAAT,EAAA,GAAAI,EAAA1B,EAAAD,KAAAuB,EAAAS,MAAAE,EAAA,YAAAZ,GAAAE,EAAAH,EAAAI,EAAA,EAAAE,EAAAL,CAAA,SAAAO,EAAA,UAAA1B,MAAAmB,EAAAgB,KAAAP,EAAA,GAAA9B,EAAAP,EAAA8B,IAAA,GAAAG,CAAA,KAAAO,EAAA,YAAAR,IAAA,UAAAc,IAAA,UAAAC,IAAA,CAAAnB,EAAAvE,OAAA2F,eAAA,IAAAjB,EAAA,GAAAF,GAAAD,EAAAA,EAAA,GAAAC,QAAAK,GAAAN,EAAA,GAAAC,EAAA,yBAAAD,GAAAK,EAAAc,EAAAjF,UAAAkE,EAAAlE,UAAAT,OAAA6B,OAAA6C,GAAA,SAAAI,EAAAR,GAAA,OAAAtE,OAAA4F,eAAA5F,OAAA4F,eAAAtB,EAAAoB,IAAApB,EAAAuB,UAAAH,EAAAb,GAAAP,EAAA3B,EAAA,sBAAA2B,EAAA7D,UAAAT,OAAA6B,OAAA+C,GAAAN,CAAA,QAAAmB,EAAAhF,UAAAiF,EAAAb,GAAAD,EAAA,cAAAc,GAAAb,GAAAa,EAAA,cAAAD,GAAAA,EAAAK,YAAA,oBAAAjB,GAAAa,EAAA/C,EAAA,qBAAAkC,GAAAD,GAAAC,GAAAD,EAAAjC,EAAA,aAAAkC,GAAAD,EAAAJ,EAAA,yBAAAK,GAAAD,EAAA,oDAAAmB,GAAA,kBAAAC,EAAAvB,EAAAwB,EAAAnB,EAAA,cAAAD,GAAAP,EAAApB,EAAAsB,EAAAD,GAAA,IAAAE,EAAAzE,OAAA4C,eAAA,IAAA6B,EAAA,gBAAAH,GAAAG,EAAA,EAAAI,GAAA,SAAAP,EAAApB,EAAAsB,EAAAD,GAAA,SAAA5B,EAAAO,EAAAsB,GAAAK,GAAAP,EAAApB,EAAA,SAAAoB,GAAA,YAAA4B,QAAAhD,EAAAsB,EAAAF,EAAA,GAAApB,EAAAuB,EAAAA,EAAAH,EAAApB,EAAA,CAAAE,MAAAoB,EAAA3B,YAAA0B,EAAA4B,cAAA5B,EAAA6B,UAAA7B,IAAAD,EAAApB,GAAAsB,GAAA7B,EAAA,UAAAA,EAAA,WAAAA,EAAA,cAAAkC,GAAAP,EAAApB,EAAAsB,EAAAD,EAAA,UAAA8B,GAAA7B,EAAAD,EAAAD,EAAApB,EAAAP,EAAAwC,EAAAT,GAAA,QAAAD,EAAAD,EAAAW,GAAAT,GAAAE,EAAAH,EAAArB,KAAA,OAAAoB,GAAA,YAAAF,EAAAE,EAAA,CAAAC,EAAAc,KAAAhB,EAAAK,GAAA0B,QAAAC,QAAA3B,GAAA4B,KAAAtD,EAAAP,EAAA,UAAA0K,GAAA7I,GAAA,sBAAAD,EAAA,KAAAD,EAAAT,UAAA,WAAAyC,QAAA,SAAApD,EAAAP,GAAA,IAAAwC,EAAAX,EAAAN,MAAAK,EAAAD,GAAA,SAAA6E,EAAA3E,GAAA6B,GAAAlB,EAAAjC,EAAAP,EAAAwG,EAAAC,EAAA,OAAA5E,EAAA,UAAA4E,EAAA5E,GAAA6B,GAAAlB,EAAAjC,EAAAP,EAAAwG,EAAAC,EAAA,QAAA5E,EAAA,CAAA2E,OAAA,eAAA1C,GAAAnC,EAAApB,GAAA,QAAAqB,EAAA,EAAAA,EAAArB,EAAAY,OAAAS,IAAA,KAAA5B,EAAAO,EAAAqB,GAAA5B,EAAAE,WAAAF,EAAAE,aAAA,EAAAF,EAAAwD,cAAA,YAAAxD,IAAAA,EAAAyD,UAAA,GAAApG,OAAA4C,eAAA0B,EAAAoC,GAAA/D,EAAAzD,KAAAyD,EAAA,WAAA+D,GAAAnC,GAAA,IAAAE,EAAA,SAAAF,GAAA,aAAAoC,GAAApC,KAAAA,EAAA,OAAAA,EAAA,IAAAD,EAAAC,EAAA3F,OAAAgI,aAAA,YAAAtC,EAAA,KAAAG,EAAAH,EAAArB,KAAAsB,EAAArB,UAAA,aAAAyD,GAAAlC,GAAA,OAAAA,EAAA,UAAAa,UAAA,uDAAAuB,OAAAtC,EAAA,CAAAuC,CAAAvC,GAAA,gBAAAoC,GAAAlC,GAAAA,EAAAA,EAAA,GAOO,IAAM+sB,GAAc,WAuBzB,OA9BFltB,EAQE,SAAAktB,EAAYxyB,IARd,SAAAmG,EAAAX,GAAA,KAAAW,aAAAX,GAAA,UAAAc,UAAA,qCAQsBhC,CAAA,KAAAkuB,GAClBnxB,KAAKrB,OAASA,EACdqB,KAAKoxB,YAAc,KACnBpxB,KAAKqxB,cAAgB,KACrBrxB,KAAKsxB,kBAAoB,KACzBtxB,KAAKuxB,IAAM,KACXvxB,KAAKwxB,UAAW,EAGhBxxB,KAAKuxB,IAAM,IAAId,GAAS,CACtB1d,QAASpU,EAAOoU,QAChBC,MAAOrU,EAAOqU,MACdye,cAAe9yB,EAAO8yB,cACtBpmB,aAAc1M,EAAO0M,aACrB6lB,UAAWvyB,EAAOuyB,WAAa,CAAC,EAChC/d,SAAUxU,EAAOwU,UAAY,OAI/BnT,KAAK0xB,uBACP,EA5BF7uB,EA8BE,EAAAhE,IAAA,wBAAAkE,MAGA,WAAwB,IAAAoE,EAAA,KAEtBnH,KAAKuxB,IAAIZ,aAAe,SAAC1H,GACvB9hB,EAAKwqB,iBAAiB1I,EACxB,EAGAjpB,KAAKuxB,IAAIX,gBAAkB,SAACC,GAC1B,IAAMe,EAAS5jB,SAAS6jB,eAAe,qBACnCD,IACEf,EACFe,EAAOE,UAAUtpB,IAAI,YAErBopB,EAAOE,UAAUC,OAAO,YAG9B,EAGA/xB,KAAKuxB,IAAI/F,eAAiB,WACxBznB,QAAQkS,IAAI,iDAER9O,EAAKqqB,WAEPrqB,EAAKqqB,UAAW,EAChBrqB,EAAK6qB,eAET,EAGAhyB,KAAKuxB,IAAI1F,QAAU,SAAC/nB,GAClBC,QAAQD,MAAM,qBAAsBA,GAEhCA,IAA4B,2BAAlBA,EAAMmI,SACfnI,EAAMmI,SAAWnI,EAAMmI,QAAQkC,SAAS,2BAC3ChH,EAAK8qB,kBAEL9qB,EAAK+qB,UAAUpuB,EAAMmI,SAAWnI,EAEpC,CACF,GAEA,CAAAjF,IAAA,IAAAkE,MAGA,SAAElE,GAAK,IAAAszB,EAAAC,EACCC,EAAOryB,KAAKrB,OAAOwU,UAAY,KAErC,QAD6C,QAAxBgf,EAAAnyB,KAAKrB,OAAO2zB,oBAAY,IAAAH,OAAA,EAAxBA,EAA2BE,MAAiC,QAA5BD,EAAIpyB,KAAKrB,OAAO2zB,oBAAY,IAAAF,OAAA,EAAxBA,EAA0BG,KAAM,CAAC,GACtE1zB,IAAQA,CAC9B,GAAC,CAAAA,IAAA,aAAAkE,MAED,SAAWlE,GAAK,IAAA2zB,EACRC,EAA8B,QAAvBD,EAAGxyB,KAAKrB,OAAO+zB,gBAAQ,IAAAF,OAAA,EAApBA,EAAuB3zB,GACvC,OAAI4zB,QAAkDA,EAErC,CACfE,KAAM3yB,KAAKkE,EAAE,QACb0uB,QAAS5yB,KAAKkE,EAAE,WAChB2uB,QAAS7yB,KAAKkE,EAAE,YAEFrF,IAAQ,EAC1B,GAEA,CAAAA,IAAA,eAAAkE,MAGA,WACE,MAAO,0QAAPiB,OAKwChE,KAAKkE,EAAE,oBAAmB,yDAAAF,OACvBhE,KAAKkE,EAAE,iBAAgB,igBAAAF,OAMpDhE,KAAKkE,EAAE,aAAY,qhBAAAF,OAcmChE,KAAKkE,EAAE,aAAY,wFAAAF,OACbhE,KAAKkE,EAAE,eAAc,4GAAAF,OAGzDhE,KAAKkE,EAAE,kBAAiB,2FAAAF,OAEpDhE,KAAKkE,EAAE,wBAAuB,wJAAAF,OAIgChE,KAAK8yB,WAAW,QAAO,6qBAAA9uB,OASfhE,KAAK8yB,WAAW,WAAU,8UAAA9uB,OAM/BhE,KAAK8yB,WAAW,WAAU,kbAUvG,GAEA,CAAAj0B,IAAA,cAAAkE,MAGA,WACE,IAAMgwB,EAAW/yB,KAAKrB,OAAOq0B,uBAAyB,UAChDC,EAAiBjzB,KAAKrB,OAAOu0B,6BAA+BlzB,KAAKrB,OAAOq0B,uBAAyB,UACjGG,EAAmBnzB,KAAKrB,OAAOw0B,kBAAoB,UACnDC,EAAsBpzB,KAAKrB,OAAOy0B,qBAAuB,UACzDC,EAAoBrzB,KAAKrB,OAAO20B,sBAAwB,UACxDC,EAAwBvzB,KAAKrB,OAAO60B,0BAA4B,UAChEC,EAAezzB,KAAKrB,OAAO+0B,2BAA6B,UACxDC,EAAsB3zB,KAAKrB,OAAOg1B,qBAAuB,UACzDC,EAAuB5zB,KAAKrB,OAAOi1B,sBAAwB,UAC3DC,EAAkB7zB,KAAKrB,OAAOm1B,oBAAsB,UACpDC,EAA2B/zB,KAAKrB,OAAOq1B,6BAA+B,UAG5E,OAFwBh0B,KAAKrB,OAAOs1B,mBAE7B,61CAAPjwB,OA6C0C+uB,EAAQ,SAAA/uB,OAAQivB,EAAc,49DAAAjvB,OAgF3DmvB,EAAgB,8LAAAnvB,OAOhBovB,EAAmB,6TAAApvB,OAWdqvB,EAAiB,sBAAArvB,OACtBuvB,EAAqB,8zBAAAvvB,OA6BhByvB,EAAY,wjBAAAzvB,OAkBjB4vB,EAAoB,qTAAA5vB,OAWpB2vB,EAAmB,g4DAAA3vB,OAwEd6vB,EAAe,sBAAA7vB,OACpB+vB,EAAwB,44BAuCvC,GAEA,CAAAl1B,IAAA,qBAAAkE,MAGA,SAAmBmxB,GAAW,IAAAhsB,EAAA,KACtBisB,EAAenmB,SAAS6jB,eAAe,gBACvCuC,EAAapmB,SAAS6jB,eAAe,cACrCwC,EAAUrmB,SAAS6jB,eAAe,WAClCyC,EAAatmB,SAAS6jB,eAAe,cAEvCsC,IACFA,EAAaI,QAAU,kBAAMrsB,EAAKssB,gBAAgB,GAEhDJ,IACFA,EAAWG,QAAU,kBAAMrsB,EAAK8pB,cAAc,GAE5CqC,IACFA,EAAQE,QAAU,kBAAMrsB,EAAKusB,YAAY,GAEvCH,IACFA,EAAWC,QAAU,kBAAMrsB,EAAKwsB,eAAe,GAIjD,IAAMC,EAAiB,WAAiB,IAAhBC,EAAOpxB,UAAAC,OAAA,QAAAvB,IAAAsB,UAAA,GAAAA,UAAA,GAAG,EAC1BqxB,EAAiB7mB,SAAS6jB,eAAe,kBAC3CgD,GAAkBA,EAAe/C,UAAUgD,SAAS,WAAaD,EAAeE,aAAe,KACjGhxB,QAAQkS,IAAI,4EAA6E2e,EAAU,EAAG,KACtG1sB,EAAK8sB,0BAGW,IAAZJ,GACFrsB,WAAW,kBAAML,EAAK8sB,yBAAyB,EAAE,MAE1CJ,EAAU,IACnB7wB,QAAQkS,IAAI,qCAAsC4e,aAAc,EAAdA,EAAgBE,aAAc,0BAA2BH,EAAU,EAAG,KACxHrsB,WAAW,kBAAMosB,EAAeC,EAAU,EAAE,EAAE,OAE9C7wB,QAAQwI,KAAK,iEACbrE,EAAK8sB,0BAET,EAEAzsB,WAAW,kBAAMosB,GAAgB,EAAE,KAGnCt2B,OAAOqK,iBAAiB,SAAU,WAChC3E,QAAQkS,IAAI,yCACZ/N,EAAK8sB,yBACP,EACF,GAEA,CAAAn2B,IAAA,eAAAkE,OAAAkyB,EAAAjoB,GAAAtH,KAAAE,EAGA,SAAAkC,IAAA,IAAAgf,EAAAtS,EAAA0gB,EAAAC,EAAA3oB,EAAA4oB,EAAAzrB,EAAA,OAAAjE,KAAAC,EAAA,SAAAwC,GAAA,cAAAA,EAAAhE,GAAA,UAEOnE,KAAKrB,OAAO8yB,cAAe,CAAFtpB,EAAAhE,EAAA,WACvBnE,KAAKrB,OAAOoU,QAAS,CAAF5K,EAAAhE,EAAA,cAChB,IAAI1D,MAAM,uBAAsB,OAevC,OAXKqmB,EAAU9mB,KAAKrB,OAAO0M,cAAgB,qCACtCmJ,EAAS,IAAIC,iBACZC,OAAO,UAAW1U,KAAKrB,OAAOoU,SAEjC/S,KAAKrB,OAAOqU,OACdwB,EAAOE,OAAO,QAAS1U,KAAKrB,OAAOqU,QAIZ,IAArBhT,KAAKrB,OAAO02B,MACd7gB,EAAOE,OAAO,OAAQ,QACvBvM,EAAArD,EAAA,KAAAd,OAES8iB,EAAO,KAAA9iB,OAAIwQ,EAAOzJ,aAAU,UAIC,iBAA9B/K,KAAKrB,OAAO8yB,cAA0B,CAAAtpB,EAAAhE,EAAA,QAS9C,OARK+wB,EAAc,CAClBniB,QAAS/S,KAAKrB,OAAOoU,QACrBme,UAAWlxB,KAAKrB,OAAOuyB,WAAa,CAAC,GAInClxB,KAAKrB,OAAOqU,QACdkiB,EAAYliB,MAAQhT,KAAKrB,OAAOqU,OACjC7K,EAAAhE,EAAA,EAEsBmxB,MAAMt1B,KAAKrB,OAAO8yB,cAAe,CACtD8D,OAAQ,OACRC,QAAS,CACP,eAAgB,oBAElBjH,KAAMliB,KAAKC,UAAU4oB,KACrB,OANY,IAARC,EAAQhtB,EAAAtD,GAQA4wB,GAAI,CAAFttB,EAAAhE,EAAA,cACR,IAAI1D,MAAM,8BAADuD,OAA+BmxB,EAASO,aAAa,cAAAvtB,EAAAhE,EAAA,EAGnDgxB,EAASQ,OAAM,OAAxB,OAAJnpB,EAAIrE,EAAAtD,EAAAsD,EAAArD,EAAA,EACH0H,EAAKskB,WAAatkB,EAAK8H,OAAS9H,EAAKzE,KAAG,UAIH,mBAA9B/H,KAAKrB,OAAO8yB,cAA4B,CAAAtpB,EAAAhE,EAAA,QASrD,OARKqQ,EAAS,CACbzB,QAAS/S,KAAKrB,OAAOoU,QACrBme,UAAWlxB,KAAKrB,OAAOuyB,WAAa,CAAC,GAInClxB,KAAKrB,OAAOqU,QACdwB,EAAOxB,MAAQhT,KAAKrB,OAAOqU,OAC5B7K,EAAAhE,EAAA,EAEoBnE,KAAKrB,OAAO8yB,cAAcjd,GAAO,OAA1C,OAAN7K,EAAMxB,EAAAtD,EAAAsD,EAAArD,EAAA,EAEa,iBAAX6E,EAAsBA,EAAUA,EAAOmnB,WAAannB,EAAO2K,OAAS3K,EAAO5B,KAAI,aAIvF,IAAItH,MAAM,mHAAkH,cAAA0H,EAAArD,EAAA,KAAAgD,EAAA,SAErI,WAxEiB,OAAAmtB,EAAApxB,MAAC,KAADL,UAAA,IA0ElB,CAAA3E,IAAA,0BAAAkE,MAGA,WACE,IAAM8xB,EAAiB7mB,SAAS6jB,eAAe,kBAC/C,GAAKgD,EAAL,CAKA,IAAMe,EAAkBf,EAAeE,aACjCc,EAAiBhB,EAAeiB,YAEtC/xB,QAAQkS,IAAI,qBAAsB2f,EAAiB,IAAKC,GAGxD,IAYIE,EAAYC,EAAgBC,EAAWC,EAAcC,EAAcC,EAAkBC,EAAYC,EAAmBC,EAZlHC,EAAYxoB,SAAS6jB,eAAe,kBACpC4E,EAAczoB,SAAS6jB,eAAe,oBACtC6E,EAAgBF,GAAyC,SAA5BA,EAAUpK,MAAMkB,QAC7CqJ,EAAkBF,GAA6C,SAA9BA,EAAYrK,MAAMkB,QAEzDvpB,QAAQkS,IAAI,4BAA6BygB,EAAe,UAAWC,GAS/Df,GAAmB,KAErBW,EAAU,EACVR,EAAa,GACbC,EAAiB,GACjBC,EAAY,GACZC,EAAe,EACfC,EAAe,GACfC,EAAmB,GACnBC,EAAa,GACbC,EAAoB,IACXV,GAAmB,KAE5BW,EAAU,EACVR,EAAa,IACbC,EAAiB,GACjBC,EAAY,GACZC,EAAe,GACfC,EAAe,GACfC,EAAmB,GACnBC,EAAa,GACbC,EAAoB,IACXV,GAAmB,KAE5BW,EAAU,EACVR,EAAa,IACbC,EAAiB,GACjBC,EAAY,GACZC,EAAe,GACfC,EAAe,GACfC,EAAmB,GACnBC,EAAa,GACbC,EAAoB,IACXV,GAAmB,KAE5BW,EAAU,GACVR,EAAa,IACbC,EAAiB,GACjBC,EAAY,GACZC,EAAe,GACfC,EAAe,GACfC,EAAmB,GACnBC,EAAa,GACbC,EAAoB,KAGpBC,EAAU,GACVR,EAAa,IACbC,EAAiB,GACjBC,EAAY,GACZC,EAAe,GACfC,EAAe,GACfC,EAAmB,IACnBC,EAAa,GACbC,EAAoB,IAIEtoB,SAAS4oB,iBAAiB,sCAClChzB,QAAQ,SAAA2V,GACtBA,EAAU6S,MAAMoB,IAAM,GAAHxpB,OAAMuyB,EAAO,KAClC,GAGA,IAAMM,EAAU7oB,SAAS4oB,iBAAiB,uCAC1C7yB,QAAQkS,IAAI,WAAY4gB,EAAQpzB,OAAQ,2BAA4BsyB,EAAY,MAChFc,EAAQjzB,QAAQ,SAAAguB,GACdA,EAAOxF,MAAM0K,MAAQ,GAAH9yB,OAAM+xB,EAAU,MAClCnE,EAAOxF,MAAM2K,OAAS,GAAH/yB,OAAM+xB,EAAU,MACnCnE,EAAOxF,MAAMsB,SAAW,GAAH1pB,OAAMgyB,EAAc,KAC3C,GAGoBhoB,SAAS4oB,iBAAiB,uBAClChzB,QAAQ,SAAAozB,GAAE,OAAIA,EAAG5K,MAAMsB,SAAW,GAAH1pB,OAAMiyB,EAAS,KAAI,GAEvCjoB,SAAS4oB,iBAAiB,0BAClChzB,QAAQ,SAAAozB,GAAE,OAAIA,EAAG5K,MAAMsB,SAAW,GAAH1pB,OAAMkyB,EAAY,KAAI,GAGpE,IAAMe,EAAajpB,SAASkpB,cAAc,qBACtCD,IACFA,EAAW7K,MAAM+K,UAAY,GAAHnzB,OAAMoyB,EAAgB,MAChDa,EAAW7K,MAAMgL,UAAY,GAAHpzB,OAAMoyB,EAAgB,MAChDa,EAAW7K,MAAM2K,OAAS,GAAH/yB,OAAMoyB,EAAgB,MAC7Ca,EAAW7K,MAAM0K,MAAQ,cAAH9yB,OAAiB6xB,EAAiB,GAAE,OAC1DoB,EAAW7K,MAAMiL,UAAY,cAG/B,IAAMC,EAAkBtpB,SAASkpB,cAAc,qBAC3CI,IACFA,EAAgBlL,MAAMsB,SAAW,GAAH1pB,OAAMmF,KAAKC,IAAI,EAAG6sB,EAAY,GAAE,OAGhE,IAAMsB,EAAiBvpB,SAASkpB,cAAc,oBAC1CK,IACFA,EAAenL,MAAMsB,SAAW,GAAH1pB,OAAMmF,KAAKC,IAAI,GAAI6sB,EAAY,GAAE,OAIvCjoB,SAAS4oB,iBAAiB,gCAClChzB,QAAQ,SAAA4zB,GACvBA,EAAIpL,MAAM0K,MAAQ,GAAH9yB,OAAMqyB,EAAU,MAC/BmB,EAAIpL,MAAM2K,OAAS,GAAH/yB,OAAMqyB,EAAU,MAGhC,IAAMoB,EAAMD,EAAIN,cAAc,OAC9B,GAAIO,EAAK,CACP,IAAMC,EAAwB,IAAbrB,EACjBoB,EAAIrL,MAAMuL,YAAY,QAAS,GAAF3zB,OAAK0zB,EAAQ,MAAM,aAChDD,EAAIrL,MAAMuL,YAAY,SAAU,GAAF3zB,OAAK0zB,EAAQ,MAAM,aACjDD,EAAIrL,MAAMuL,YAAY,YAAa,GAAF3zB,OAAK0zB,EAAQ,MAAM,aACpDD,EAAIrL,MAAMuL,YAAY,aAAc,GAAF3zB,OAAK0zB,EAAQ,MAAM,YACvD,CACF,GAEA,IAAME,EAAgB5pB,SAASkpB,cAAc,8BAC7C,GAAIU,EAAe,CACjBA,EAAcxL,MAAM0K,MAAQ,GAAH9yB,OAAMsyB,EAAiB,MAChDsB,EAAcxL,MAAM2K,OAAS,GAAH/yB,OAAMsyB,EAAiB,MAGjD,IAAMmB,EAAMG,EAAcV,cAAc,OACxC,GAAIO,EAAK,CACP,IAAMC,EAA+B,GAApBpB,EACjBmB,EAAIrL,MAAMuL,YAAY,QAAS,GAAF3zB,OAAK0zB,EAAQ,MAAM,aAChDD,EAAIrL,MAAMuL,YAAY,SAAU,GAAF3zB,OAAK0zB,EAAQ,MAAM,aACjDD,EAAIrL,MAAMuL,YAAY,YAAa,GAAF3zB,OAAK0zB,EAAQ,MAAM,aACpDD,EAAIrL,MAAMuL,YAAY,aAAc,GAAF3zB,OAAK0zB,EAAQ,MAAM,YACvD,CACF,CAGA,IAAMvD,EAAenmB,SAASkpB,cAAc,mBAC5C,GAAI/C,EAAc,CAChB,IAAI0D,EAAWC,EACXlC,GAAmB,KACrBiC,EAAY,GACZC,EAAc,IACLlC,GAAmB,KAC5BiC,EAAY,GACZC,EAAc,IACLlC,GAAmB,KAC5BiC,EAAY,GACZC,EAAc,IACLlC,GAAmB,KAC5BiC,EAAY,GACZC,EAAc,KAEdD,EAAY,GACZC,EAAc,IAEhB3D,EAAa/H,MAAM2K,OAAS,GAAH/yB,OAAM6zB,EAAS,MACxC1D,EAAa/H,MAAMsB,SAAW,GAAH1pB,OAAM8zB,EAAW,MAG5C,IAAMC,EAAU5D,EAAa+C,cAAc,OAC3C,GAAIa,EAAS,CACX,IAAML,EAAWvuB,KAAKC,IAAI,GAAgB,GAAZyuB,GAC9BE,EAAQ3L,MAAM0K,MAAQ,GAAH9yB,OAAM0zB,EAAQ,MACjCK,EAAQ3L,MAAM2K,OAAS,GAAH/yB,OAAM0zB,EAAQ,KACpC,CACF,CAEA3zB,QAAQkS,IAAI,6BAA8B8f,EAAY,UAAWI,EAAc,cAAeC,EAAkB,WAAYC,EA1L5H,MAFEtyB,QAAQwI,KAAK,wDA6LjB,GAEA,CAAA1N,IAAA,iBAAAkE,OAAAi1B,EAAAhrB,GAAAtH,KAAAE,EAGA,SAAAwK,IAAA,IAAAomB,EAAAC,EAAA5B,EAAA/D,EAAAmH,EAAAC,EAAAC,EAAAC,EAAA1pB,EAAAjD,EAAA,YAAA/F,KAAAC,EAAA,SAAA2K,GAAA,cAAAA,EAAA5L,EAAA4L,EAAAnM,GAAA,WACMnE,KAAKwxB,SAAU,CAAFlhB,EAAAnM,EAAA,QAC6B,OAA5CJ,QAAQkS,IAAI,gCAAgC3F,EAAAxL,EAAA,UAuB5C,OAnBFf,QAAQkS,IAAI,6BAA6B3F,EAAA5L,EAAA,EAIjC8xB,EAAYxoB,SAAS6jB,eAAe,kBACpC4E,EAAczoB,SAAS6jB,eAAe,oBACtCgD,EAAiB7mB,SAAS6jB,eAAe,kBAE3C2E,IAAWA,EAAUpK,MAAMkB,QAAU,QACrCmJ,IAAaA,EAAYrK,MAAMkB,QAAU,QAG7C/kB,WAAW,kBAAMkD,EAAKupB,yBAAyB,EAAE,IAG7CH,IACFA,EAAewD,UAAY,GAG7B/nB,EAAAnM,EAAA,EACwBnE,KAAKs4B,eAAc,OACE,OADvCxH,EAASxgB,EAAAzL,EACfd,QAAQkS,IAAI,qBAAsB6a,GAAWxgB,EAAAnM,EAAA,EAErBnE,KAAKuxB,IAAI1hB,QAAQihB,GAAU,OAA7CmH,EAAS3nB,EAAAzL,EACfd,QAAQkS,IAAI,uCAAwCgiB,GAGhDC,EAAW,EAAC,UACRl4B,KAAKuxB,IAAI9mB,eAAeytB,EAAW,IAAE,CAAA5nB,EAAAnM,EAAA,eAAAmM,EAAAnM,EAAA,EACrC,IAAI8B,QAAQ,SAAAC,GAAO,OAAIqC,WAAWrC,EAAS,IAAI,GAAC,OACtDgyB,IAAW5nB,EAAAnM,EAAA,mBAGTnE,KAAKuxB,IAAI9mB,YAAa,CAAF6F,EAAAnM,EAAA,QACkC,OAAxDJ,QAAQkS,IAAI,4CAA4C3F,EAAAnM,EAAA,EAClDnE,KAAKuxB,IAAIgH,iBAAgB,OAC/Bx0B,QAAQkS,IAAI,wBAEZjW,KAAKwxB,UAAW,EAGhBxxB,KAAKqxB,cAAgBzmB,KAAKC,MAC1B7K,KAAKsxB,kBAAoBkH,YAAY,WACnC,IAAMC,EAAU7tB,KAAKC,MAAQY,EAAK4lB,cAC5BqH,EAAUvvB,KAAKwU,MAAM8a,EAAU,KAC/BE,EAAUxvB,KAAKwU,MAAO8a,EAAU,IAAS,KACzCG,EAAU5qB,SAAS6jB,eAAe,cACpC+G,IACFA,EAAQC,YAAc,GAAH70B,OAAM00B,EAAQ3tB,WAAW+tB,SAAS,EAAG,KAAI,KAAA90B,OAAI20B,EAAQ5tB,WAAW+tB,SAAS,EAAG,MAEnG,EAAG,KAAMxoB,EAAAnM,EAAA,gBAE8E,OAAvFJ,QAAQwI,KAAK,0EAA0E+D,EAAAnM,EAAA,GACjFnE,KAAKuxB,IAAIgH,iBAAgB,QAC/Bx0B,QAAQkS,IAAI,wBAEZjW,KAAKwxB,UAAW,EAGhBxxB,KAAKqxB,cAAgBzmB,KAAKC,MAC1B7K,KAAKsxB,kBAAoBkH,YAAY,WACnC,IAAMC,EAAU7tB,KAAKC,MAAQY,EAAK4lB,cAC5BqH,EAAUvvB,KAAKwU,MAAM8a,EAAU,KAC/BE,EAAUxvB,KAAKwU,MAAO8a,EAAU,IAAS,KACzCG,EAAU5qB,SAAS6jB,eAAe,cACpC+G,IACFA,EAAQC,YAAc,GAAH70B,OAAM00B,EAAQ3tB,WAAW+tB,SAAS,EAAG,KAAI,KAAA90B,OAAI20B,EAAQ5tB,WAAW+tB,SAAS,EAAG,MAEnG,EAAG,KAAM,QAGX/0B,QAAQkS,IAAI,qCAAqC3F,EAAAnM,EAAA,iBAAAmM,EAAA5L,EAAA,GAAAgK,EAAA4B,EAAAzL,EAGjDd,QAAQD,MAAM,+BAA8B4K,GAC5C1O,KAAKkyB,UAAUxjB,EAAMzC,SAAOyC,GAGtB8nB,EAAYxoB,SAAS6jB,eAAe,kBACpC4E,EAAczoB,SAAS6jB,eAAe,oBACxC2E,IAAWA,EAAUpK,MAAMkB,QAAU,QACrCmJ,IAAaA,EAAYrK,MAAMkB,QAAU,QAAO,eAAAhd,EAAAxL,EAAA,KAAAsL,EAAA,kBAEvD,WAzFmB,OAAA4nB,EAAAn0B,MAAC,KAADL,UAAA,IA2FpB,CAAA3E,IAAA,eAAAkE,MAGA,WAAe,IAAA0J,EAAA,KACb1I,QAAQkS,IAAI,2BAGRjW,KAAKuxB,KAAOvxB,KAAKwxB,WACnBxxB,KAAKuxB,IAAIwH,gBACT/4B,KAAKuxB,IAAI3c,aACT5U,KAAKwxB,UAAW,GAIdxxB,KAAKoxB,cACPpxB,KAAKoxB,YAAY7gB,YAAY3M,QAAQ,SAAA4M,GAAK,OAAIA,EAAMC,MAAM,GAC1DzQ,KAAKoxB,YAAc,MAIjBpxB,KAAKsxB,oBACP0H,cAAch5B,KAAKsxB,mBACnBtxB,KAAKsxB,kBAAoB,MAI3B,IAAMkF,EAAYxoB,SAAS6jB,eAAe,kBACpC4E,EAAczoB,SAAS6jB,eAAe,oBAExC2E,IAAWA,EAAUpK,MAAMkB,QAAU,QACrCmJ,IAAaA,EAAYrK,MAAMkB,QAAU,QAG7C/kB,WAAW,kBAAMkE,EAAKuoB,yBAAyB,EAAE,IAGjD,IAAMiE,EAAejrB,SAAS6jB,eAAe,kBACzCoH,IACFA,EAAaJ,YAAc74B,KAAKkE,EAAE,wBAClC+0B,EAAanH,UAAUtpB,IAAI,UAI7B,IAAMopB,EAAS5jB,SAAS6jB,eAAe,qBACnCD,GACFA,EAAOE,UAAUC,OAAO,YAG1BhuB,QAAQkS,IAAI,qBACd,GAEA,CAAApX,IAAA,mBAAAkE,MAGA,SAAiBkmB,GACf,IAAMgQ,EAAejrB,SAAS6jB,eAAe,kBACzCoH,IACFA,EAAaJ,YAAc5P,EAC3BgQ,EAAanH,UAAUC,OAAO,SAElC,GAEA,CAAAlzB,IAAA,YAAAkE,MAGA,SAAUkJ,GACR,IAAMgtB,EAAejrB,SAAS6jB,eAAe,kBACzCoH,IACFA,EAAaJ,YAAc,GAAH70B,OAAMhE,KAAKkE,EAAE,SAAQ,MAAAF,OAAKiI,GAClDgtB,EAAanH,UAAUC,OAAO,SAElC,GAEA,CAAAlzB,IAAA,kBAAAkE,MAGA,WACE,IAAMk2B,EAAejrB,SAAS6jB,eAAe,kBAC7C,GAAIoH,EAAc,CAChB,IAAMC,EAAQl5B,KAAKkE,EAAE,sBACf+H,EAAUjM,KAAKkE,EAAE,sBACvB+0B,EAAa5I,UAAY,uFAAHrsB,OAA0Fk1B,EAAK,0EAAAl1B,OAAyEiI,EAAO,UACrMgtB,EAAanH,UAAUC,OAAO,QAChC,CACF,GAEA,CAAAlzB,IAAA,aAAAkE,MAGA,WACE,GAAK/C,KAAKuxB,KAAQvxB,KAAKwxB,SAAvB,CAKA,IAAI2H,EAAa,KAUjB,GATIn5B,KAAKuxB,IAAIvE,UAAYhtB,KAAKuxB,IAAIvE,SAASxZ,eAAiBxT,KAAKuxB,IAAIvE,SAASxZ,cAAcnG,cAC1F8rB,EAAan5B,KAAKuxB,IAAIvE,SAASxZ,cAAcnG,YAAY+rB,iBAAiB,KAIvED,GAAcn5B,KAAKoxB,cACtB+H,EAAan5B,KAAKoxB,YAAYgI,iBAAiB,IAG7CD,EAAY,CACdA,EAAWjpB,SAAWipB,EAAWjpB,QAEjC,IAAMmkB,EAAUrmB,SAAS6jB,eAAe,WAClCwH,EAAWhF,aAAO,EAAPA,EAAS6C,cAAc,cAClCoC,EAAYjF,aAAO,EAAPA,EAAS6C,cAAc,eAErC7C,GAAWgF,GAAYC,IACpBH,EAAWjpB,SAOdmpB,EAASjN,MAAMmN,OAAS,GACxBD,EAAUlN,MAAMkB,QAAU,OAC1B+G,EAAQvC,UAAUC,OAAO,WAPzBsH,EAASjN,MAAMmN,OAAS,UACxBD,EAAUlN,MAAMkB,QAAU,QAC1B+G,EAAQvC,UAAUtpB,IAAI,WAS1BzE,QAAQkS,IAAIkjB,EAAWjpB,QAAU,aAAe,WAClD,MACEnM,QAAQwI,KAAK,8CApCf,CAsCF,GAEA,CAAA1N,IAAA,gBAAAkE,MAGA,WAEEgB,QAAQkS,IAAI,oBACd,GAEA,CAAApX,IAAA,UAAAkE,MAGA,WAEM/C,KAAKwxB,UACPxxB,KAAKgyB,eAIHhyB,KAAKoxB,cACPpxB,KAAKoxB,YAAY7gB,YAAY3M,QAAQ,SAAA4M,GAAK,OAAIA,EAAMC,MAAM,GAC1DzQ,KAAKoxB,YAAc,MAEjBpxB,KAAKsxB,oBACP0H,cAAch5B,KAAKsxB,mBACnBtxB,KAAKsxB,kBAAoB,MAIvBtxB,KAAKuxB,MACPvxB,KAAKuxB,IAAI3c,aACT5U,KAAKuxB,IAAM,KAEf,IAvjCF1uB,GAAAuD,GAAAnC,EAAA7D,UAAAyC,GAAAlD,OAAA4C,eAAA0B,EAAA,aAAA8B,UAAA,IAAA9B,EAAA,IAAAA,EAAApB,EAqzBEm1B,EAlRA/C,CAohBC,CAhjCwB,G,uPCP3B,IAAAhxB,EAAAC,EAAArB,EAAA,mBAAAtE,OAAAA,OAAA,GAAA4F,EAAAtB,EAAAzD,UAAA,aAAAkD,EAAAO,EAAAC,aAAA,yBAAAsB,EAAAvB,EAAAsB,EAAA7B,EAAA8B,GAAA,IAAAC,EAAAF,GAAAA,EAAA/D,qBAAAkE,EAAAH,EAAAG,EAAAC,EAAA5E,OAAA6B,OAAA6C,EAAAjE,WAAA,OAAAoE,GAAAD,EAAA,mBAAA1B,EAAAsB,EAAA7B,GAAA,IAAA8B,EAAAC,EAAAE,EAAAE,EAAA,EAAAC,EAAApC,GAAA,GAAAqC,GAAA,EAAAC,EAAA,CAAAF,EAAA,EAAAP,EAAA,EAAAU,EAAAZ,EAAAa,EAAA1C,EAAAqC,EAAArC,EAAA2C,KAAAd,EAAA,GAAA7B,EAAA,SAAA8B,EAAArB,GAAA,OAAAuB,EAAAF,EAAAG,EAAA,EAAAE,EAAAN,EAAAW,EAAAT,EAAAtB,EAAAiC,CAAA,YAAA1C,EAAAS,EAAAsB,GAAA,IAAAE,EAAAxB,EAAA0B,EAAAJ,EAAAD,EAAA,GAAAS,GAAAF,IAAAnC,GAAA4B,EAAAQ,EAAAjB,OAAAS,IAAA,KAAA5B,EAAA8B,EAAAM,EAAAR,GAAA9B,EAAAwC,EAAAF,EAAAM,EAAAZ,EAAA,GAAAvB,EAAA,GAAAP,EAAA0C,IAAAb,KAAAI,EAAAH,GAAAC,EAAAD,EAAA,OAAAC,EAAA,MAAAD,EAAA,GAAAA,EAAA,GAAAH,GAAAG,EAAA,IAAAhC,KAAAE,EAAAO,EAAA,GAAAT,EAAAgC,EAAA,KAAAC,EAAA,EAAAO,EAAAC,EAAAV,EAAAS,EAAAT,EAAAC,EAAA,IAAAhC,EAAA4C,IAAA1C,EAAAO,EAAA,GAAAuB,EAAA,GAAAD,GAAAA,EAAAa,KAAAZ,EAAA,GAAAvB,EAAAuB,EAAA,GAAAD,EAAAS,EAAAT,EAAAa,EAAAX,EAAA,OAAA/B,GAAAO,EAAA,SAAAiC,EAAA,MAAAH,GAAA,EAAAR,CAAA,iBAAA7B,EAAAoC,EAAAM,GAAA,GAAAP,EAAA,QAAAQ,UAAA,oCAAAN,GAAA,IAAAD,GAAAtC,EAAAsC,EAAAM,GAAAX,EAAAK,EAAAH,EAAAS,GAAAd,EAAAG,EAAA,EAAAJ,EAAAM,KAAAI,GAAA,CAAAP,IAAAC,EAAAA,EAAA,GAAAA,EAAA,IAAAO,EAAAT,GAAA,GAAA/B,EAAAiC,EAAAE,IAAAK,EAAAT,EAAAI,EAAAK,EAAAC,EAAAN,GAAA,OAAAE,EAAA,EAAAL,EAAA,IAAAC,IAAA/B,EAAA,QAAA4B,EAAAE,EAAA9B,GAAA,MAAA4B,EAAAA,EAAAtB,KAAAwB,EAAAG,IAAA,MAAAU,UAAA,wCAAAf,EAAAgB,KAAA,OAAAhB,EAAAK,EAAAL,EAAAnB,MAAAsB,EAAA,IAAAA,EAAA,YAAAA,IAAAH,EAAAE,EAAAe,SAAAjB,EAAAtB,KAAAwB,GAAAC,EAAA,IAAAE,EAAAU,UAAA,oCAAA3C,EAAA,YAAA+B,EAAA,GAAAD,EAAAH,CAAA,UAAAC,GAAAS,EAAAC,EAAAT,EAAA,GAAAI,EAAA1B,EAAAD,KAAAuB,EAAAS,MAAAE,EAAA,YAAAZ,GAAAE,EAAAH,EAAAI,EAAA,EAAAE,EAAAL,CAAA,SAAAO,EAAA,UAAA1B,MAAAmB,EAAAgB,KAAAP,EAAA,GAAA9B,EAAAP,EAAA8B,IAAA,GAAAG,CAAA,KAAAO,EAAA,YAAAR,IAAA,UAAAc,IAAA,UAAAC,IAAA,CAAAnB,EAAAvE,OAAA2F,eAAA,IAAAjB,EAAA,GAAAF,GAAAD,EAAAA,EAAA,GAAAC,QAAAK,GAAAN,EAAA,GAAAC,EAAA,yBAAAD,GAAAK,EAAAc,EAAAjF,UAAAkE,EAAAlE,UAAAT,OAAA6B,OAAA6C,GAAA,SAAAI,EAAAR,GAAA,OAAAtE,OAAA4F,eAAA5F,OAAA4F,eAAAtB,EAAAoB,IAAApB,EAAAuB,UAAAH,EAAAb,GAAAP,EAAA3B,EAAA,sBAAA2B,EAAA7D,UAAAT,OAAA6B,OAAA+C,GAAAN,CAAA,QAAAmB,EAAAhF,UAAAiF,EAAAb,GAAAD,EAAA,cAAAc,GAAAb,GAAAa,EAAA,cAAAD,GAAAA,EAAAK,YAAA,oBAAAjB,GAAAa,EAAA/C,EAAA,qBAAAkC,GAAAD,GAAAC,GAAAD,EAAAjC,EAAA,aAAAkC,GAAAD,EAAAJ,EAAA,yBAAAK,GAAAD,EAAA,oDAAAmB,GAAA,kBAAAC,EAAAvB,EAAAwB,EAAAnB,EAAA,cAAAD,GAAAP,EAAApB,EAAAsB,EAAAD,GAAA,IAAAE,EAAAzE,OAAA4C,eAAA,IAAA6B,EAAA,gBAAAH,GAAAG,EAAA,EAAAI,GAAA,SAAAP,EAAApB,EAAAsB,EAAAD,GAAA,SAAA5B,EAAAO,EAAAsB,GAAAK,GAAAP,EAAApB,EAAA,SAAAoB,GAAA,YAAA4B,QAAAhD,EAAAsB,EAAAF,EAAA,GAAApB,EAAAuB,EAAAA,EAAAH,EAAApB,EAAA,CAAAE,MAAAoB,EAAA3B,YAAA0B,EAAA4B,cAAA5B,EAAA6B,UAAA7B,IAAAD,EAAApB,GAAAsB,GAAA7B,EAAA,UAAAA,EAAA,WAAAA,EAAA,cAAAkC,GAAAP,EAAApB,EAAAsB,EAAAD,EAAA,UAAA8B,GAAA7B,EAAAD,EAAAD,EAAApB,EAAAP,EAAAwC,EAAAT,GAAA,QAAAD,EAAAD,EAAAW,GAAAT,GAAAE,EAAAH,EAAArB,KAAA,OAAAoB,GAAA,YAAAF,EAAAE,EAAA,CAAAC,EAAAc,KAAAhB,EAAAK,GAAA0B,QAAAC,QAAA3B,GAAA4B,KAAAtD,EAAAP,EAAA,UAAA0K,GAAA7I,GAAA,sBAAAD,EAAA,KAAAD,EAAAT,UAAA,WAAAyC,QAAA,SAAApD,EAAAP,GAAA,IAAAwC,EAAAX,EAAAN,MAAAK,EAAAD,GAAA,SAAA6E,EAAA3E,GAAA6B,GAAAlB,EAAAjC,EAAAP,EAAAwG,EAAAC,EAAA,OAAA5E,EAAA,UAAA4E,EAAA5E,GAAA6B,GAAAlB,EAAAjC,EAAAP,EAAAwG,EAAAC,EAAA,QAAA5E,EAAA,CAAA2E,OAAA,eAAA1C,GAAAnC,EAAApB,GAAA,QAAAqB,EAAA,EAAAA,EAAArB,EAAAY,OAAAS,IAAA,KAAA5B,EAAAO,EAAAqB,GAAA5B,EAAAE,WAAAF,EAAAE,aAAA,EAAAF,EAAAwD,cAAA,YAAAxD,IAAAA,EAAAyD,UAAA,GAAApG,OAAA4C,eAAA0B,EAAAoC,GAAA/D,EAAAzD,KAAAyD,EAAA,WAAA+D,GAAAnC,GAAA,IAAAE,EAAA,SAAAF,GAAA,aAAAoC,GAAApC,KAAAA,EAAA,OAAAA,EAAA,IAAAD,EAAAC,EAAA3F,OAAAgI,aAAA,YAAAtC,EAAA,KAAAG,EAAAH,EAAArB,KAAAsB,EAAArB,UAAA,aAAAyD,GAAAlC,GAAA,OAAAA,EAAA,UAAAa,UAAA,uDAAAuB,OAAAtC,EAAA,CAAAuC,CAAAvC,GAAA,gBAAAoC,GAAAlC,GAAAA,EAAAA,EAAA,GAIO,IAAMo1B,GAAa,WAgBxB,OApBFv1B,EAKE,SAAAu1B,EAAY76B,EAAQ4yB,IALtB,SAAAzsB,EAAAX,GAAA,KAAAW,aAAAX,GAAA,UAAAc,UAAA,qCAK2BhC,CAAA,KAAAu2B,GACvBx5B,KAAKrB,OAASA,EACdqB,KAAKuxB,IAAMA,EACXvxB,KAAKy5B,YAAc,KACnBz5B,KAAK05B,qBAAsB,EAC3B15B,KAAKwxB,UAAW,EAEhBxxB,KAAK+L,cAAgB,CACnB4tB,WAAY,KACZC,QAAS,MAGX55B,KAAK65B,oBAAqB,CAC5B,EAlBFh3B,EAoBE,EAAAhE,IAAA,IAAAkE,MACA,SAAElE,GAAK,IAAAszB,EAAAC,EACCC,EAAOryB,KAAKrB,OAAOwU,UAAY,KAErC,QAD6C,QAAxBgf,EAAAnyB,KAAKrB,OAAO2zB,oBAAY,IAAAH,OAAA,EAAxBA,EAA2BE,MAAiC,QAA5BD,EAAIpyB,KAAKrB,OAAO2zB,oBAAY,IAAAF,OAAA,EAAxBA,EAA0BG,KAAM,CAAC,GACtE1zB,IAAQA,CAC9B,GAEA,CAAAA,IAAA,eAAAkE,MAGA,WAAe,IAAA+2B,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAEPC,EAAmBv6B,KAAKrB,OAAO47B,mBACI,QADYT,EAC7B95B,KAAKrB,OAAO67B,aAAK,IAAAV,OAAA,EAAjBA,EAAmBS,mBACnBv6B,KAAKkE,EAAE,gBACP,uBACxB,MAAO,iPAAPF,OAIuChE,KAAKkE,EAAE,SAAQ,oDAAAF,OAChBhE,KAAKkE,EAAE,eAAc,6MAAAF,OAKYu2B,EAAgB,oBAAAv2B,OAAmBhE,KAAKrB,OAAO87B,WAAa,MAAK,mGAAAz2B,OAE1EhE,KAAKkE,EAAE,mBAAkB,MAAAF,OAAKhE,KAAKrB,OAAO+7B,gBAAkB,IAAG,uBAAA12B,OAC5F,QAA1B+1B,EAAA/5B,KAAKrB,OAAOg8B,sBAAc,IAAAZ,GAA1BA,EAA4B9Q,MAAyB,QAArB+Q,EAAIh6B,KAAKrB,OAAO67B,aAAK,IAAAR,GAAgB,QAAhBA,EAAjBA,EAAmBW,sBAAc,IAAAX,GAAjCA,EAAmC/Q,KAAI,2DAAAjlB,QACJ,QAA1Bi2B,EAAAj6B,KAAKrB,OAAOg8B,sBAAc,IAAAV,OAAA,EAA1BA,EAA4BlM,SAA0B,QAArBmM,EAAIl6B,KAAKrB,OAAO67B,aAAK,IAAAN,GAAgB,QAAhBA,EAAjBA,EAAmBS,sBAAc,IAAAT,OAAA,EAAjCA,EAAmCnM,QAAS,UAAS,iBAAA/pB,QAA0C,QAA1Bm2B,EAAAn6B,KAAKrB,OAAOg8B,sBAAc,IAAAR,OAAA,EAA1BA,EAA4BzM,YAA6B,QAArB0M,EAAIp6B,KAAKrB,OAAO67B,aAAK,IAAAJ,GAAgB,QAAhBA,EAAjBA,EAAmBO,sBAAc,IAAAP,OAAA,EAAjCA,EAAmC1M,WAAY,OAAM,0DAAA1pB,QACvN,QAA1Bq2B,EAAAr6B,KAAKrB,OAAOg8B,sBAAc,IAAAN,OAAA,EAA1BA,EAA4BpR,QAAyB,QAArBqR,EAAIt6B,KAAKrB,OAAO67B,aAAK,IAAAF,GAAgB,QAAhBA,EAAjBA,EAAmBK,sBAAc,IAAAL,OAAA,EAAjCA,EAAmCrR,MAAI,gCAE7E,GAAE,6BAGZ,GAEA,CAAApqB,IAAA,cAAAkE,MAGA,WAAc,IAAA63B,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EACNC,EAAWz7B,KAAKrB,OAAO88B,SAKvBC,GAJQ17B,KAAKrB,OAAO67B,MACbx6B,KAAKrB,OAAOg9B,UAGD37B,KAAKrB,OAAO+8B,kBAAoC,QAArBd,EAAI56B,KAAKrB,OAAO67B,aAAK,IAAAI,OAAA,EAAjBA,EAAmBc,kBAAmB,WACvFE,EAAuB57B,KAAKrB,OAAOi9B,uBAAyC,QAArBf,EAAI76B,KAAKrB,OAAO67B,aAAK,IAAAK,OAAA,EAAjBA,EAAmBe,uBAAwB,UACtGC,EAAsB77B,KAAKrB,OAAOk9B,sBAAwC,QAArBf,EAAI96B,KAAKrB,OAAO67B,aAAK,IAAAM,OAAA,EAAjBA,EAAmBe,sBAAuB,UAEnGC,GADmB97B,KAAKrB,OAAO47B,kBAAqC,QAArBQ,EAAI/6B,KAAKrB,OAAO67B,aAAK,IAAAO,GAAjBA,EAAmBR,iBACnDv6B,KAAKrB,OAAOm9B,mBAAqC,QAArBd,EAAIh7B,KAAKrB,OAAO67B,aAAK,IAAAQ,OAAA,EAAjBA,EAAmBc,mBAAoB,WAC1FC,EAAkB/7B,KAAKrB,OAAOo9B,kBAAoC,QAArBd,EAAIj7B,KAAKrB,OAAO67B,aAAK,IAAAS,OAAA,EAAjBA,EAAmBc,kBAAmB,UACvFC,EAAuBh8B,KAAKrB,OAAOq9B,uBAAyC,QAArBd,EAAIl7B,KAAKrB,OAAO67B,aAAK,IAAAU,OAAA,EAAjBA,EAAmBc,uBAAwB,UACtGC,EAAiBj8B,KAAKrB,OAAOs9B,iBAAmC,QAArBd,EAAIn7B,KAAKrB,OAAO67B,aAAK,IAAAW,OAAA,EAAjBA,EAAmBc,iBAAkB,UACpFC,EAAgBl8B,KAAKrB,OAAOu9B,gBAAkC,QAArBd,EAAIp7B,KAAKrB,OAAO67B,aAAK,IAAAY,OAAA,EAAjBA,EAAmBc,gBAAiB,OACjFC,EAAoBn8B,KAAKrB,OAAOw9B,oBAAsC,QAArBd,EAAIr7B,KAAKrB,OAAO67B,aAAK,IAAAa,OAAA,EAAjBA,EAAmBc,oBAAqB,GAC7FC,EAAep8B,KAAKrB,OAAOy9B,eAAiC,QAArBd,EAAIt7B,KAAKrB,OAAO67B,aAAK,IAAAc,OAAA,EAAjBA,EAAmBc,eAAgB,WAEpF,MAAO,q2CAAPp4B,OAgDqBy3B,EAAS5N,aAAY,uDAAA7pB,OAEzBy3B,EAAS/N,SAAQ,uBAAA1pB,OACrBy3B,EAASY,UAAS,6DAAAr4B,OAEa,QAA1BhE,KAAKrB,OAAO87B,UAAsB,QAAU,OAAM,2BAAAz2B,OACnDhE,KAAKrB,OAAO87B,WAAa,MAAK,4DAAAz2B,OAG7By3B,EAASa,oBAAmB,4BAAAt4B,OACF,QAA1BhE,KAAKrB,OAAO87B,UAAsB,aAAe,WAAU,8DAAAz2B,OAG3Dy3B,EAASc,qBAAoB,4BAAAv4B,OACH,QAA1BhE,KAAKrB,OAAO87B,UAAsB,WAAa,aAAY,wEAAAz2B,OAGjC,QAA1BhE,KAAKrB,OAAO87B,UAAsB,QAAU,OAAM,kCAAAz2B,OAEtC,QAA1BhE,KAAKrB,OAAO87B,UAAsB,oFAIhC,GAAE,+fAAAz2B,OAkBUy3B,EAASe,sBAAqB,6FAAAx4B,OAI9By3B,EAASgB,qBAAoB,gTAAAz4B,OAYC,QAA1BhE,KAAKrB,OAAO87B,UAAsB,cAAgB,MAAK,0QAAAz2B,OAa9Do4B,EAAY,iCAAAp4B,OACH83B,EAAgB,8BAAA93B,OACnBm4B,EAAiB,4BAAAn4B,OACrBk4B,EAAa,uIAAAl4B,OAKZg4B,EAAoB,sBAAAh4B,OACzBi4B,EAAc,sKAAAj4B,OAMiB,QAA1BhE,KAAKrB,OAAO87B,UAAsB,QAAU,OAAM,0BAAAz2B,OACnDhE,KAAKrB,OAAO87B,WAAa,MAAK,mMAAAz2B,OAQ3B+3B,EAAe,2BAAA/3B,OACQ,YAAzBg4B,EAAqC,UAAYA,EAAoB,qCAAAh4B,OAC3D+3B,EAAe,4GAAA/3B,OAKC,QAA1BhE,KAAKrB,OAAO87B,UAAsB,QAAU,OAAM,mKAAAz2B,OAQlD03B,EAAe,sBAAA13B,OACpB63B,EAAmB,0BAAA73B,OACfhE,KAAKrB,OAAO+9B,qBAAuC,QAArBnB,EAAIv7B,KAAKrB,OAAO67B,aAAK,IAAAe,OAAA,EAAjBA,EAAmBmB,qBAAsB,OAAM,4BAAA14B,OAC/EhE,KAAKrB,OAAOg+B,uBAAyC,QAArBnB,EAAIx7B,KAAKrB,OAAO67B,aAAK,IAAAgB,OAAA,EAAjBA,EAAmBmB,uBAAwB,MAAK,+TAAA34B,OAWrF43B,EAAoB,+/BAAA53B,OAwCpBy3B,EAASgB,qBAAoB,8BAAAz4B,OAC1By3B,EAAS5N,aAAY,qDAAA7pB,OAEzBy3B,EAAS/N,SAAQ,06CAqEpC,GAEA,CAAA7uB,IAAA,qBAAAkE,MAGA,WAAqB,IAAAoE,EAAA,KACby1B,EAAa5uB,SAAS6jB,eAAe,cACrCgL,EAAa7uB,SAAS6jB,eAAe,gBACrCiL,EAAa9uB,SAAS6jB,eAAe,cAS3C,GAPI+K,IAAYA,EAAWrI,QAAU,kBAAMptB,EAAKiN,aAAa,GACzD0oB,IAAYA,EAAWvI,QAAU,kBAAMptB,EAAK41B,cAAc,GAG9D/8B,KAAKg9B,wBAGDH,EAAY,CAEdA,EAAWzQ,MAAM2K,OAAS,OAC1B8F,EAAWzQ,MAAM6Q,SAAW,SAG5B,IAAMtD,EAAa,WACjBkD,EAAWzQ,MAAM2K,OAAS,OAC1B,IAAMmG,EAAY/zB,KAAK6U,IAAI6e,EAAWM,aAAc,KACpDN,EAAWzQ,MAAM2K,OAASmG,EAAY,KACtCL,EAAWzQ,MAAMgR,UAAYF,GAAa,IAAM,OAAS,SAGrDA,GAAa,KAEf30B,WAAW,WACTs0B,EAAWxE,UAAYwE,EAAWM,YACpC,EAAG,EAEP,EAEAN,EAAWn0B,iBAAiB,QAASixB,GAErCkD,EAAWn0B,iBAAiB,UAAW,SAACzE,GACxB,UAAVA,EAAEpF,KAAoBoF,EAAEo5B,SAGP,UAAVp5B,EAAEpF,KAAmBoF,EAAEo5B,UAEhC90B,WAAWoxB,EAAY,IAJvB11B,EAAEq5B,iBACFn2B,EAAKiN,cAKT,EACF,CACF,GAEA,CAAAvV,IAAA,eAAAkE,MAGA,WACE,IACE6nB,aAAa2S,WAAW,gCAC1B,CAAE,MAAOxU,GAAI,CAET/oB,KAAKuxB,MACPvxB,KAAKuxB,IAAI5yB,OAAO0pB,eAAiB,MAInC,IAAM9O,EAAYvL,SAAS6jB,eAAe,qBACtCtY,IACFA,EAAU8W,UAAY,mIAAHrsB,OAGkBhE,KAAKkE,EAAE,SAAQ,oDAAAF,OAChBhE,KAAKkE,EAAE,eAAc,2BAK3D,IAAMyS,EAAQ3I,SAAS6jB,eAAe,gBAClClb,GAAOA,EAAM6mB,OACnB,GAEA,CAAA3+B,IAAA,wBAAAkE,MAGA,WACE,IAAM85B,EAAa7uB,SAAS6jB,eAAe,gBAC3C,GAAIgL,EAAY,KAAAY,EAERlD,EAAmBv6B,KAAKrB,OAAO47B,mBACI,QADYkD,EAC7Bz9B,KAAKrB,OAAO67B,aAAK,IAAAiD,OAAA,EAAjBA,EAAmBlD,mBACnBv6B,KAAKkE,EAAE,gBACP,uBACxB24B,EAAWa,YAAcnD,EAGzBsC,EAAWc,IAAM39B,KAAKrB,OAAO87B,WAAa,MAG1CoC,EAAWzQ,MAAMwR,UAAsC,QAA1B59B,KAAKrB,OAAO87B,UAAsB,QAAU,MAC3E,CACF,GAEA,CAAA57B,IAAA,OAAAkE,MAGA,WACE,IAAM86B,EAAgB7vB,SAAS6jB,eAAe,iBAC1CgM,GAAeA,EAAc/L,UAAUtpB,IAAI,UAG/CD,WAAW,WACT,IAAMoO,EAAQ3I,SAAS6jB,eAAe,gBAClClb,GAAOA,EAAM6mB,OACnB,EAAG,GACL,GAEA,CAAA3+B,IAAA,OAAAkE,MAGA,WACE,IAAM86B,EAAgB7vB,SAAS6jB,eAAe,iBAC1CgM,GAAeA,EAAc/L,UAAUC,OAAO,SACpD,GAEA,CAAAlzB,IAAA,YAAAkE,OAAA+6B,EAAA9wB,GAAAtH,KAAAE,EAGA,SAAAkC,IAAA,OAAApC,KAAAC,EAAA,SAAAwC,GAAA,cAAAA,EAAAhE,GAAA,OAEEnE,KAAKwxB,UAAW,EAChBxxB,KAAK+9B,wBAAwB,cAAA51B,EAAArD,EAAA,KAAAgD,EAAA,SAC9B,WAJc,OAAAg2B,EAAAj6B,MAAC,KAADL,UAAA,IAMf,CAAA3E,IAAA,cAAAkE,OAAAsmB,EAAArc,GAAAtH,KAAAE,EAGA,SAAAwK,IAAA,IAAAuG,EAAAsS,EAAAva,EAAA,OAAAhJ,KAAAC,EAAA,SAAA2K,GAAA,cAAAA,EAAA5L,EAAA4L,EAAAnM,GAAA,OAEiC,GADzBwS,EAAQ3I,SAAS6jB,eAAe,gBAChC5I,EAAOtS,EAAM5T,MAAMmmB,OAEd,CAAF5Y,EAAAnM,EAAA,eAAAmM,EAAAxL,EAAA,aAKJ9E,KAAKwxB,SAAU,CAAFlhB,EAAAnM,EAAA,eAAAmM,EAAAnM,EAAA,EACVnE,KAAKg+B,YAAW,OAaA,OATxBh+B,KAAKi+B,WAAW,OAAQhV,GAGxBtS,EAAM5T,MAAQ,GACd4T,EAAMyV,MAAM2K,OAAS,OACrBpgB,EAAMyV,MAAM6Q,SAAW,SAEvB3sB,EAAA5L,EAAA,EAEE1E,KAAKk+B,iBAAiB5tB,EAAAnM,EAAA,EAChBnE,KAAKuxB,IAAInd,YAAY6U,GAAK,OAAA3Y,EAAAnM,EAAA,eAAAmM,EAAA5L,EAAA,EAAAgK,EAAA4B,EAAAzL,EAEhCd,QAAQD,MAAM,4BAA2B4K,GAGnBA,IACF,2BAAlBA,EAAMzC,SACLyC,EAAMzC,SAAWyC,EAAMzC,QAAQkC,SAAS,4BAKzCnO,KAAKkyB,UAASxjB,GAEhB1O,KAAKm+B,qBAAqB,cAAA7tB,EAAAxL,EAAA,KAAAsL,EAAA,iBAE7B,WAxCgB,OAAAiZ,EAAAxlB,MAAC,KAADL,UAAA,IA0CjB,CAAA3E,IAAA,wBAAAkE,MAGA,WACE,IAAM65B,EAAa5uB,SAAS6jB,eAAe,cACtC+K,IAELA,EAAWxO,UAAYpuB,KAAKwxB,SAC9B,GAEA,CAAA3yB,IAAA,aAAAkE,MAGA,SAAWrE,EAAMuqB,GACf,IAAMwS,EAAWztB,SAAS6jB,eAAe,qBACzC,GAAK4J,EAAL,CAGA,IAAM2C,EAAa3C,EAASvE,cAAc,gBACtCkH,GACFA,EAAWrM,SAGb,IAAM9lB,EAAU+B,SAASiiB,cAAc,OACjCoO,EAAuC,QAA1Br+B,KAAKrB,OAAO87B,UACjB,SAAT/7B,EAAkB,YAAc,aACvB,SAATA,EAAkB,aAAe,YACtCuN,EAAQigB,UAAY,WAAHloB,OAActF,EAAI,KAAAsF,OAAIq6B,GAEvC,IAAMzM,EAAS5jB,SAASiiB,cAAc,OACtC2B,EAAO1F,UAAY,kBAAHloB,OAAqBtF,GACrCkzB,EAAOiH,YAAuB,SAATn6B,EAAkB,KAAO,KAE9C,IAAM4/B,EAAStwB,SAASiiB,cAAc,OACtCqO,EAAOpS,UAAY,iBACnBoS,EAAOzF,YAAc5P,EAGrBhd,EAAQkkB,YAAYyB,GACpB3lB,EAAQkkB,YAAYmO,GACpB7C,EAAStL,YAAYlkB,GACrBwvB,EAASpD,UAAYoD,EAAS0B,YA1BT,CA2BvB,GAEA,CAAAt+B,IAAA,iBAAAkE,MAGA,WACE,IAAM04B,EAAWztB,SAAS6jB,eAAe,qBACzC,GAAK4J,EAAL,CAGAz7B,KAAKm+B,qBAEL,IAAMnH,EAAKhpB,SAASiiB,cAAc,OAC5BoO,EAAuC,QAA1Br+B,KAAKrB,OAAO87B,UAAuB,aAAe,YACrEzD,EAAG9K,UAAY,iBAAHloB,OAAoBq6B,GAChCrH,EAAGuH,GAAK,kBAER,IAAM3M,EAAS5jB,SAASiiB,cAAc,OACtC2B,EAAO1F,UAAY,uBACnB0F,EAAOiH,YAAc,KAErB,IAAMyF,EAAStwB,SAASiiB,cAAc,OACtCqO,EAAOpS,UAAY,iBAEnBoS,EAAOjO,UAAY,yIAEnB2G,EAAG7G,YAAYyB,GACfoF,EAAG7G,YAAYmO,GACf7C,EAAStL,YAAY6G,GACrBh3B,KAAKy5B,YAAc6E,EACnBt+B,KAAK05B,qBAAsB,EAC3B+B,EAASpD,UAAYoD,EAAS0B,YAxBT,CAyBvB,GAEA,CAAAt+B,IAAA,uBAAAkE,MAGA,SAAqBy7B,GACnB,GAAKx+B,KAAKy5B,YAAV,CAEKz5B,KAAK05B,sBAER15B,KAAKy5B,YAAYZ,YAAc,GAC/B74B,KAAK05B,qBAAsB,GAG7B15B,KAAKy5B,YAAYZ,aAAe2F,EAChC,IAAM/C,EAAWztB,SAAS6jB,eAAe,qBACrC4J,IACFA,EAASpD,UAAYoD,EAAS0B,aAXH,CAa/B,GAEA,CAAAt+B,IAAA,oBAAAkE,MAGA,SAAkB0nB,GAChB,GAAIzqB,KAAKy5B,YAAa,CACpBz5B,KAAKy5B,YAAYZ,YAAcpO,GAAYzqB,KAAKy5B,YAAYZ,YAC5D,IAAMtf,EAAYvL,SAAS6jB,eAAe,mBACtCtY,IAAWA,EAAUglB,GAAK,IAC9Bv+B,KAAKy5B,YAAc,IACrB,CACAz5B,KAAK+9B,uBACP,GAEA,CAAAl/B,IAAA,qBAAAkE,MAGA,WACE,IAAM07B,EAAWzwB,SAAS6jB,eAAe,mBACrC4M,GAAUA,EAAS1M,SACvB/xB,KAAKy5B,YAAc,KACnBz5B,KAAK05B,qBAAsB,CAC7B,GAEA,CAAA76B,IAAA,YAAAkE,MAGA,SAAUe,GACR,IAAM23B,EAAWztB,SAAS6jB,eAAe,qBACzC,GAAK4J,EAAL,CAUA,GAPsB33B,IACF,2BAAlBA,EAAMmI,SACY,iBAAVnI,GAAsBA,EAAMqK,SAAS,2BAC5CrK,EAAMmI,SAAWnI,EAAMmI,QAAQkC,SAAS,2BACvB,iBAAVrK,GAAsBA,EAAMqK,SAAS,2BAG5B,KAAAuwB,EAEXC,EAAiB3wB,SAASiiB,cAAc,OAC9C0O,EAAezS,UAAY,gBAC3ByS,EAAevS,MAAM8D,QAAU,kEACR,QAApBwO,EAAA1+B,KAAKrB,OAAO88B,gBAAQ,IAAAiD,OAAA,EAApBA,EAAsBjC,uBAAwB,WAAa,IAE9D,IAAMvD,EAAQlrB,SAASiiB,cAAc,OACrCiJ,EAAM9M,MAAM8D,QAAU,yEACtBgJ,EAAML,YAAc74B,KAAKkE,EAAE,sBAE3B,IAAM+H,EAAU+B,SAASiiB,cAAc,OACvChkB,EAAQmgB,MAAM8D,QAAU,qDACxBjkB,EAAQ4sB,YAAc74B,KAAKkE,EAAE,sBAE7By6B,EAAexO,YAAY+I,GAC3ByF,EAAexO,YAAYlkB,GAC3BwvB,EAAStL,YAAYwO,EACvB,KAAO,CAEL,IAAMC,EAAU5wB,SAASiiB,cAAc,OACvC2O,EAAQ1S,UAAY,gBACpB0S,EAAQ/F,YAA+B,iBAAV/0B,EAAqBA,GAASA,aAAK,EAALA,EAAOmI,UAAWnI,EAC7E23B,EAAStL,YAAYyO,EACvB,CAEAnD,EAASpD,UAAYoD,EAAS0B,YApCT,CAqCvB,GAEA,CAAAt+B,IAAA,YAAAkE,MAGA,SAAU87B,GACR7+B,KAAKwxB,SAAWqN,EAChB7+B,KAAK+9B,uBACP,IAnsBFl7B,GAAAuD,GAAAnC,EAAA7D,UAAAyC,GAAAlD,OAAA4C,eAAA0B,EAAA,aAAA8B,UAAA,IAAA9B,EAAA,IAAAA,EAAApB,EA8eEwmB,EATAyU,CA8NC,CA/rBuB,GCL1B,UACE,GAAM,CACJ,aAAgB,qCAChB,UAAa,aACb,SAAY,YACZ,iBAAoB,sBACpB,cAAiB,+BACjB,UAAa,aACb,UAAa,eACb,YAAe,eACf,eAAkB,kBAClB,qBAAwB,iDACxB,KAAQ,OACR,QAAW,UACX,QAAW,WACX,MAAS,yBACT,YAAe,gCACf,OAAU,SACV,QAAW,WACX,KAAQ,OACR,MAAS,QACT,MAAS,QACT,YAAe,uBACf,gBAAmB,eACnB,mBAAsB,uBACtB,mBAAsB,mGAExB,GAAM,CACJ,aAAgB,kBAChB,UAAa,aACb,SAAY,YACZ,iBAAoB,kBACpB,cAAiB,sBACjB,UAAa,YACb,UAAa,WACb,YAAe,eACf,eAAkB,iBAClB,qBAAwB,kCACxB,KAAQ,OACR,QAAW,QACX,QAAW,YACX,MAAS,wBACT,YAAe,6CACf,OAAU,QACV,QAAW,WACX,KAAQ,OACR,MAAS,OACT,MAAS,QACT,YAAe,gBACf,gBAAmB,YACnB,mBAAsB,kBACtB,mBAAsB,0FAExB,GAAM,CACJ,aAAgB,oBAChB,UAAa,eACb,SAAY,aACZ,iBAAoB,qBACpB,cAAiB,+BACjB,UAAa,gBACb,UAAa,cACb,YAAe,aACf,eAAkB,WAClB,qBAAwB,mCACxB,KAAQ,YACR,QAAW,aACX,QAAW,iBACX,MAAS,8BACT,YAAe,mBACf,OAAU,OACV,QAAW,eACX,KAAQ,OACR,MAAS,QACT,MAAS,MACT,YAAe,gBACf,gBAAmB,cACnB,mBAAsB,mBACtB,mBAAsB,gGAExB,GAAM,CACJ,aAAgB,0BAChB,UAAa,mBACb,SAAY,gBACZ,iBAAoB,+BACpB,cAAiB,wCACjB,UAAa,gBACb,UAAa,YACb,YAAe,oBACf,eAAkB,qBAClB,qBAAwB,iDACxB,KAAQ,iBACR,QAAW,UACX,QAAW,mBACX,MAAS,6BACT,YAAe,iCACf,OAAU,SACV,QAAW,YACX,KAAQ,QACR,MAAS,UACT,MAAS,SACT,YAAe,uBACf,gBAAmB,sBACnB,mBAAsB,oBACtB,mBAAsB,wHAExB,GAAM,CACJ,aAAgB,iCAChB,UAAa,iBACb,SAAY,gBACZ,iBAAoB,mCACpB,cAAiB,qCACjB,UAAa,kBACb,UAAa,gBACb,YAAe,mBACf,eAAkB,wBAClB,qBAAwB,wDACxB,KAAQ,YACR,QAAW,UACX,QAAW,mBACX,MAAS,+BACT,YAAe,iCACf,OAAU,WACV,QAAW,aACX,KAAQ,QACR,MAAS,SACT,MAAS,QACT,YAAe,wBACf,gBAAmB,iBACnB,mBAAsB,sBACtB,mBAAsB,iIAExB,GAAM,CACJ,aAAgB,sCAChB,UAAa,cACb,SAAY,aACZ,iBAAoB,gCACpB,cAAiB,oCACjB,UAAa,mBACb,UAAa,YACb,YAAe,mBACf,eAAkB,0BAClB,qBAAwB,qDACxB,KAAQ,OACR,QAAW,eACX,QAAW,mBACX,MAAS,uCACT,YAAe,oCACf,OAAU,WACV,QAAW,eACX,KAAQ,SACR,MAAS,SACT,MAAS,SACT,YAAe,yBACf,gBAAmB,qBACnB,mBAAsB,qBACtB,mBAAsB,mIAExB,GAAM,CACJ,aAAgB,iCAChB,UAAa,cACb,SAAY,YACZ,iBAAoB,uCACpB,cAAiB,0BACjB,UAAa,gBACb,UAAa,WACb,YAAe,oBACf,eAAkB,qBAClB,qBAAwB,yDACxB,KAAQ,QACR,QAAW,eACX,QAAW,gBACX,MAAS,8BACT,YAAe,wCACf,OAAU,SACV,QAAW,aACX,KAAQ,SACR,MAAS,YACT,MAAS,SACT,YAAe,kCACf,gBAAmB,mBACnB,mBAAsB,yBACtB,mBAAsB,2I,cCpL1B,IAAA75B,EAAAC,EAAArB,EAAA,mBAAAtE,OAAAA,OAAA,GAAA4F,EAAAtB,EAAAzD,UAAA,aAAAkD,EAAAO,EAAAC,aAAA,yBAAAsB,EAAAvB,EAAAsB,EAAA7B,EAAA8B,GAAA,IAAAC,EAAAF,GAAAA,EAAA/D,qBAAAkE,EAAAH,EAAAG,EAAAC,EAAA5E,OAAA6B,OAAA6C,EAAAjE,WAAA,OAAAoE,GAAAD,EAAA,mBAAA1B,EAAAsB,EAAA7B,GAAA,IAAA8B,EAAAC,EAAAE,EAAAE,EAAA,EAAAC,EAAApC,GAAA,GAAAqC,GAAA,EAAAC,EAAA,CAAAF,EAAA,EAAAP,EAAA,EAAAU,EAAAZ,EAAAa,EAAA1C,EAAAqC,EAAArC,EAAA2C,KAAAd,EAAA,GAAA7B,EAAA,SAAA8B,EAAArB,GAAA,OAAAuB,EAAAF,EAAAG,EAAA,EAAAE,EAAAN,EAAAW,EAAAT,EAAAtB,EAAAiC,CAAA,YAAA1C,EAAAS,EAAAsB,GAAA,IAAAE,EAAAxB,EAAA0B,EAAAJ,EAAAD,EAAA,GAAAS,GAAAF,IAAAnC,GAAA4B,EAAAQ,EAAAjB,OAAAS,IAAA,KAAA5B,EAAA8B,EAAAM,EAAAR,GAAA9B,EAAAwC,EAAAF,EAAAM,EAAAZ,EAAA,GAAAvB,EAAA,GAAAP,EAAA0C,IAAAb,KAAAI,EAAAH,GAAAC,EAAAD,EAAA,OAAAC,EAAA,MAAAD,EAAA,GAAAA,EAAA,GAAAH,GAAAG,EAAA,IAAAhC,KAAAE,EAAAO,EAAA,GAAAT,EAAAgC,EAAA,KAAAC,EAAA,EAAAO,EAAAC,EAAAV,EAAAS,EAAAT,EAAAC,EAAA,IAAAhC,EAAA4C,IAAA1C,EAAAO,EAAA,GAAAuB,EAAA,GAAAD,GAAAA,EAAAa,KAAAZ,EAAA,GAAAvB,EAAAuB,EAAA,GAAAD,EAAAS,EAAAT,EAAAa,EAAAX,EAAA,OAAA/B,GAAAO,EAAA,SAAAiC,EAAA,MAAAH,GAAA,EAAAR,CAAA,iBAAA7B,EAAAoC,EAAAM,GAAA,GAAAP,EAAA,QAAAQ,UAAA,oCAAAN,GAAA,IAAAD,GAAAtC,EAAAsC,EAAAM,GAAAX,EAAAK,EAAAH,EAAAS,GAAAd,EAAAG,EAAA,EAAAJ,EAAAM,KAAAI,GAAA,CAAAP,IAAAC,EAAAA,EAAA,GAAAA,EAAA,IAAAO,EAAAT,GAAA,GAAA/B,EAAAiC,EAAAE,IAAAK,EAAAT,EAAAI,EAAAK,EAAAC,EAAAN,GAAA,OAAAE,EAAA,EAAAL,EAAA,IAAAC,IAAA/B,EAAA,QAAA4B,EAAAE,EAAA9B,GAAA,MAAA4B,EAAAA,EAAAtB,KAAAwB,EAAAG,IAAA,MAAAU,UAAA,wCAAAf,EAAAgB,KAAA,OAAAhB,EAAAK,EAAAL,EAAAnB,MAAAsB,EAAA,IAAAA,EAAA,YAAAA,IAAAH,EAAAE,EAAAe,SAAAjB,EAAAtB,KAAAwB,GAAAC,EAAA,IAAAE,EAAAU,UAAA,oCAAA3C,EAAA,YAAA+B,EAAA,GAAAD,EAAAH,CAAA,UAAAC,GAAAS,EAAAC,EAAAT,EAAA,GAAAI,EAAA1B,EAAAD,KAAAuB,EAAAS,MAAAE,EAAA,YAAAZ,GAAAE,EAAAH,EAAAI,EAAA,EAAAE,EAAAL,CAAA,SAAAO,EAAA,UAAA1B,MAAAmB,EAAAgB,KAAAP,EAAA,GAAA9B,EAAAP,EAAA8B,IAAA,GAAAG,CAAA,KAAAO,EAAA,YAAAR,IAAA,UAAAc,IAAA,UAAAC,IAAA,CAAAnB,EAAAvE,OAAA2F,eAAA,IAAAjB,EAAA,GAAAF,GAAAD,EAAAA,EAAA,GAAAC,QAAAK,GAAAN,EAAA,GAAAC,EAAA,yBAAAD,GAAAK,EAAAc,EAAAjF,UAAAkE,EAAAlE,UAAAT,OAAA6B,OAAA6C,GAAA,SAAAI,EAAAR,GAAA,OAAAtE,OAAA4F,eAAA5F,OAAA4F,eAAAtB,EAAAoB,IAAApB,EAAAuB,UAAAH,EAAAb,GAAAP,EAAA3B,EAAA,sBAAA2B,EAAA7D,UAAAT,OAAA6B,OAAA+C,GAAAN,CAAA,QAAAmB,EAAAhF,UAAAiF,EAAAb,GAAAD,EAAA,cAAAc,GAAAb,GAAAa,EAAA,cAAAD,GAAAA,EAAAK,YAAA,oBAAAjB,GAAAa,EAAA/C,EAAA,qBAAAkC,GAAAD,GAAAC,GAAAD,EAAAjC,EAAA,aAAAkC,GAAAD,EAAAJ,EAAA,yBAAAK,GAAAD,EAAA,oDAAAmB,GAAA,kBAAAC,EAAAvB,EAAAwB,EAAAnB,EAAA,cAAAD,GAAAP,EAAApB,EAAAsB,EAAAD,GAAA,IAAAE,EAAAzE,OAAA4C,eAAA,IAAA6B,EAAA,gBAAAH,GAAAG,EAAA,EAAAI,GAAA,SAAAP,EAAApB,EAAAsB,EAAAD,GAAA,SAAA5B,EAAAO,EAAAsB,GAAAK,GAAAP,EAAApB,EAAA,SAAAoB,GAAA,YAAA4B,QAAAhD,EAAAsB,EAAAF,EAAA,GAAApB,EAAAuB,EAAAA,EAAAH,EAAApB,EAAA,CAAAE,MAAAoB,EAAA3B,YAAA0B,EAAA4B,cAAA5B,EAAA6B,UAAA7B,IAAAD,EAAApB,GAAAsB,GAAA7B,EAAA,UAAAA,EAAA,WAAAA,EAAA,cAAAkC,GAAAP,EAAApB,EAAAsB,EAAAD,EAAA,UAAA8B,GAAA7B,EAAAD,EAAAD,EAAApB,EAAAP,EAAAwC,EAAAT,GAAA,QAAAD,EAAAD,EAAAW,GAAAT,GAAAE,EAAAH,EAAArB,KAAA,OAAAoB,GAAA,YAAAF,EAAAE,EAAA,CAAAC,EAAAc,KAAAhB,EAAAK,GAAA0B,QAAAC,QAAA3B,GAAA4B,KAAAtD,EAAAP,EAAA,UAAA0K,GAAA7I,GAAA,sBAAAD,EAAA,KAAAD,EAAAT,UAAA,WAAAyC,QAAA,SAAApD,EAAAP,GAAA,IAAAwC,EAAAX,EAAAN,MAAAK,EAAAD,GAAA,SAAA6E,EAAA3E,GAAA6B,GAAAlB,EAAAjC,EAAAP,EAAAwG,EAAAC,EAAA,OAAA5E,EAAA,UAAA4E,EAAA5E,GAAA6B,GAAAlB,EAAAjC,EAAAP,EAAAwG,EAAAC,EAAA,QAAA5E,EAAA,CAAA2E,OAAA,eAAAxC,GAAAhE,GAAA,OAAAgE,GAAA,mBAAA/H,QAAA,iBAAAA,OAAAa,SAAA,SAAAkD,GAAA,cAAAA,CAAA,WAAAA,GAAA,OAAAA,GAAA,mBAAA/D,QAAA+D,EAAA1B,cAAArC,QAAA+D,IAAA/D,OAAA6B,UAAA,gBAAAkC,CAAA,EAAAgE,GAAAhE,EAAA,UAAAgQ,GAAArO,EAAApB,GAAA,IAAAqB,EAAAvE,OAAA4S,KAAAtO,GAAA,GAAAtE,OAAA6S,sBAAA,KAAAlQ,EAAA3C,OAAA6S,sBAAAvO,GAAApB,IAAAP,EAAAA,EAAAe,OAAA,SAAAR,GAAA,OAAAlD,OAAA8S,yBAAAxO,EAAApB,GAAAL,UAAA,IAAA0B,EAAAd,KAAAS,MAAAK,EAAA5B,EAAA,QAAA4B,CAAA,UAAAwO,GAAAzO,GAAA,QAAApB,EAAA,EAAAA,EAAAW,UAAAC,OAAAZ,IAAA,KAAAqB,EAAA,MAAAV,UAAAX,GAAAW,UAAAX,GAAA,GAAAA,EAAA,EAAAyP,GAAA3S,OAAAuE,IAAA,GAAAN,QAAA,SAAAf,GAAA8P,GAAA1O,EAAApB,EAAAqB,EAAArB,GAAA,GAAAlD,OAAAiT,0BAAAjT,OAAAkT,iBAAA5O,EAAAtE,OAAAiT,0BAAA1O,IAAAoO,GAAA3S,OAAAuE,IAAAN,QAAA,SAAAf,GAAAlD,OAAA4C,eAAA0B,EAAApB,EAAAlD,OAAA8S,yBAAAvO,EAAArB,GAAA,UAAAoB,CAAA,UAAA0O,GAAA1O,EAAApB,EAAAqB,GAAA,OAAArB,EAAAwD,GAAAxD,MAAAoB,EAAAtE,OAAA4C,eAAA0B,EAAApB,EAAA,CAAAE,MAAAmB,EAAA1B,YAAA,EAAAsD,cAAA,EAAAC,UAAA,IAAA9B,EAAApB,GAAAqB,EAAAD,CAAA,UAAAmC,GAAAnC,EAAApB,GAAA,QAAAqB,EAAA,EAAAA,EAAArB,EAAAY,OAAAS,IAAA,KAAA5B,EAAAO,EAAAqB,GAAA5B,EAAAE,WAAAF,EAAAE,aAAA,EAAAF,EAAAwD,cAAA,YAAAxD,IAAAA,EAAAyD,UAAA,GAAApG,OAAA4C,eAAA0B,EAAAoC,GAAA/D,EAAAzD,KAAAyD,EAAA,WAAA+D,GAAAnC,GAAA,IAAAE,EAAA,SAAAF,GAAA,aAAAoC,GAAApC,KAAAA,EAAA,OAAAA,EAAA,IAAAD,EAAAC,EAAA3F,OAAAgI,aAAA,YAAAtC,EAAA,KAAAG,EAAAH,EAAArB,KAAAsB,EAAArB,UAAA,aAAAyD,GAAAlC,GAAA,OAAAA,EAAA,UAAAa,UAAA,uDAAAuB,OAAAtC,EAAA,CAAAuC,CAAAvC,GAAA,gBAAAoC,GAAAlC,GAAAA,EAAAA,EAAA,GASO,IAAM06B,GAAa,WA0CxB,OAnDF76B,EAUE,SAAA66B,IAAyB,IAAAC,EAAAC,EAAbrgC,EAAM6E,UAAAC,OAAA,QAAAvB,IAAAsB,UAAA,GAAAA,UAAA,GAAG,CAAC,GAVxB,SAAAsB,EAAAX,GAAA,KAAAW,aAAAX,GAAA,UAAAc,UAAA,qCAUyBhC,CAAA,KAAA67B,GAErB9+B,KAAKrB,OAASqB,KAAKi/B,kBAAkBtgC,GACrCqB,KAAKuxB,IAAM,IAAItJ,GAAYjoB,KAAKrB,QAChCqB,KAAKk/B,QAAS,EACdl/B,KAAKwxB,UAAW,EAChBxxB,KAAKsyB,aAAe6M,GAEpBn/B,KAAKo/B,YAAc,UAInB,IAAMC,EAAW3sB,GAAAA,GAAAA,GAAA,GACZ1S,KAAKrB,QACLqB,KAAKrB,OAAOuU,OAAK,IACpBC,UAA2B,QAAjB4rB,EAAA/+B,KAAKrB,OAAOuU,aAAK,IAAA6rB,OAAA,EAAjBA,EAAmB5rB,WAAYnT,KAAKrB,OAAOwU,UAAY,KACjE9H,cAA+B,QAAjB2zB,EAAAh/B,KAAKrB,OAAOuU,aAAK,IAAA8rB,OAAA,EAAjBA,EAAmB3zB,eAAgBrL,KAAKrB,OAAO0M,cAAgB,oCAC7EinB,aAActyB,KAAKsyB,eAErBtyB,KAAK60B,eAAiB,IAAI1D,GAAekO,GAEzC,IAAMC,EAAU5sB,GAAAA,GAAAA,GAAA,GACX1S,KAAKrB,QACLqB,KAAKrB,OAAOsqB,MAAI,IACnBqJ,aAActyB,KAAKsyB,eAQrB,GANAtyB,KAAK69B,cAAgB,IAAIrE,GAAc8F,EAAYt/B,KAAKuxB,KAExDvxB,KAAK0T,qBACL1T,KAAKu/B,eAGDv/B,KAAKrB,OAAO6gC,SAASC,WAAaz/B,KAAKrB,OAAO6gC,SAASE,SAAU,CACnE,IAAMlF,EAAQxsB,SAAS6jB,eAAe,mBAClC2I,IACFx6B,KAAKk/B,QAAS,EACd1E,EAAM1I,UAAUtpB,IAAI,QAExB,CACF,EAjDF3F,EAmDE,EAAAhE,IAAA,oBAAAkE,MAIA,SAAkB48B,GAAY,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAExBC,GAAiBvI,EAAWwI,UAAY,eAC5C,GAA8B,iBAAnBD,GAA6B,CAEtC,IAAME,GAAQF,GAAeG,MAAM,KACnCH,GAAiB,CACfI,SAAUF,GAAM,IAAM,SACtBG,WAAYH,GAAM,IAAM,QACxBI,OAAQ7I,EAAW8I,gBAAkB,CAAEC,EAAG,GAAI/jC,EAAG,IAErD,CAGA,IAAMgkC,GAAehJ,EAAWgJ,eAAiC,QAArB/I,EAAID,EAAW3P,cAAM,IAAA4P,OAAA,EAAjBA,EAAmB+I,gBAAiC,QAArB9I,EAAIF,EAAW3P,cAAM,IAAA6P,OAAA,EAAjBA,EAAmB/R,kBAAmB,UAGnH8a,IAA+B,QAAjB9I,EAAAH,EAAW/gB,cAAM,IAAAkhB,OAAA,EAAjBA,EAAmBhS,mBAAoC,QAArBiS,EAAIJ,EAAW3P,cAAM,IAAA+P,OAAA,EAAjBA,EAAmBjS,kBAAmB6a,GAEhG,OAAAj2B,GAAA,CAEEK,QAAS4sB,EAAW5sB,QACpBC,MAAO2sB,EAAW3sB,MAClBye,cAAekO,EAAWlO,cAC1BpmB,aAAcs0B,EAAWt0B,aACzBgqB,MAA0B,IAApBsK,EAAWtK,KACjBoF,UAAWkF,EAAWlF,WAAa,MACnCtnB,SAAUwsB,EAAWxsB,UAAY,KAGjCid,KAAI1d,GAAA,CACFhU,MAAqB,QAAfshC,EAAAL,EAAWvP,YAAI,IAAA4P,OAAA,EAAfA,EAAiBthC,OAAQ,SAC/BmqC,aAA4B,QAAf5I,EAAAN,EAAWvP,YAAI,IAAA6P,OAAA,EAAfA,EAAiB4I,cAAe,mCAC7CC,OAAsB,QAAf5I,EAAAP,EAAWvP,YAAI,IAAA8P,OAAA,EAAfA,EAAiB4I,QAAS,KACjC7f,MAAqB,QAAfkX,EAAAR,EAAWvP,YAAI,IAAA+P,OAAA,EAAfA,EAAiBlX,OAAQ,KAC/BzJ,MAAqB,QAAf4gB,EAAAT,EAAWvP,YAAI,IAAAgQ,OAAA,EAAfA,EAAiB5gB,OAAQ,SAC/BsO,iBAAgC,QAAfuS,EAAAV,EAAWvP,YAAI,IAAAiQ,OAAA,EAAfA,EAAiBvS,kBAAmB,WAClD6R,EAAWvP,MAIhB+X,SAAQz1B,GAAA,CACN41B,SAAUJ,GAAeI,UAAY,SACrCC,WAAYL,GAAeK,YAAc,QACzCC,OAAQN,GAAeM,QAAU,CAAEE,EAAG,GAAI/jC,EAAG,KACV,WAA/B2B,GAAOq5B,EAAWwI,UAAwBxI,EAAWwI,SAAW,CAAC,GAIvEnY,OAAMtd,GAAA,CACJ8M,MAAuB,QAAjB8gB,EAAAX,EAAW3P,cAAM,IAAAsQ,OAAA,EAAjBA,EAAmB9gB,OAAQ,SACjCupB,OAAwB,QAAjBxI,EAAAZ,EAAW3P,cAAM,IAAAuQ,OAAA,EAAjBA,EAAmBwI,QAAS,SAEnCjb,iBAAkC,QAAjB0S,EAAAb,EAAW3P,cAAM,IAAAwQ,OAAA,EAAjBA,EAAmB1S,mBAAkC,QAAnB2S,EAAId,EAAWvP,YAAI,IAAAqQ,OAAA,EAAfA,EAAiB3S,kBAAmB6a,GAC3FK,YAA6B,QAAjBtI,EAAAf,EAAW3P,cAAM,IAAA0Q,OAAA,EAAjBA,EAAmBsI,aAAc,UAC7CC,QAAsC,KAAb,QAAjBtI,EAAAhB,EAAW3P,cAAM,IAAA2Q,OAAA,EAAjBA,EAAmBsI,QAC3BC,aAA8B,QAAjBtI,EAAAjB,EAAW3P,cAAM,IAAA4Q,OAAA,EAAjBA,EAAmBsI,cAAe,mBAE/CP,cAA+B,QAAjB9H,EAAAlB,EAAW3P,cAAM,IAAA6Q,OAAA,EAAjBA,EAAmB/S,mBAAkC,QAAnBgT,EAAInB,EAAWvP,YAAI,IAAA0Q,OAAA,EAAfA,EAAiBhT,kBAAmB6a,IACrFhJ,EAAW3P,QAIhBwK,MAAK9nB,GAAA,CACHokB,OAAuB,QAAhBiK,EAAApB,EAAWnF,aAAK,IAAAuG,OAAA,EAAhBA,EAAkBjK,QAAS,IAClCC,QAAwB,QAAhBiK,EAAArB,EAAWnF,aAAK,IAAAwG,OAAA,EAAhBA,EAAkBjK,SAAU,IACpClJ,cAA8B,QAAhBoT,EAAAtB,EAAWnF,aAAK,IAAAyG,OAAA,EAAhBA,EAAkBpT,eAAgB,GAChDC,iBAAiC,QAAhBoT,EAAAvB,EAAWnF,aAAK,IAAA0G,OAAA,EAAhBA,EAAkBpT,kBAAmB,UACtDqb,gBAAgC,QAAhBhI,EAAAxB,EAAWnF,aAAK,IAAA2G,OAAA,EAAhBA,EAAkBgI,iBAAkB,KACpDvb,QAAwB,QAAhBwT,EAAAzB,EAAWnF,aAAK,IAAA4G,OAAA,EAAhBA,EAAkBxT,SAAU,6BACjC+R,EAAWnF,OAIhBtnB,MAAKR,GAAA,CAEH02B,gBAAgC,QAAhB/H,EAAA1B,EAAWzsB,aAAK,IAAAmuB,OAAA,EAAhBA,EAAkB+H,kBAAkC,QAApB9H,EAAI3B,EAAWnF,aAAK,IAAA8G,OAAA,EAAhBA,EAAkB8H,iBAAkBT,GACxFU,sBAAsC,QAAhB9H,EAAA5B,EAAWzsB,aAAK,IAAAquB,OAAA,EAAhBA,EAAkB8H,wBAAwC,QAApB7H,EAAI7B,EAAWnF,aAAK,IAAAgH,OAAA,EAAhBA,EAAkB6H,uBAAwB,UAE1GC,cAAa52B,GAAAA,GAAA,CACXuW,MAAsB,QAAhBwY,EAAA9B,EAAWzsB,aAAK,IAAAuuB,GAAe,QAAfA,EAAhBA,EAAkB6H,qBAAa,IAAA7H,OAAA,EAA/BA,EAAiCxY,QAAwB,QAApByY,EAAI/B,EAAWnF,aAAK,IAAAkH,GAAe,QAAfA,EAAhBA,EAAkB4H,qBAAa,IAAA5H,OAAA,EAA/BA,EAAiCzY,OAAQ,+CACxF8E,OAAuB,QAAhB4T,EAAAhC,EAAWzsB,aAAK,IAAAyuB,GAAe,QAAfA,EAAhBA,EAAkB2H,qBAAa,IAAA3H,OAAA,EAA/BA,EAAiC5T,SAAyB,QAApB6T,EAAIjC,EAAWnF,aAAK,IAAAoH,GAAe,QAAfA,EAAhBA,EAAkB0H,qBAAa,IAAA1H,OAAA,EAA/BA,EAAiC7T,QAAS,UAC3FL,UAA0B,QAAhBmU,EAAAlC,EAAWzsB,aAAK,IAAA2uB,GAAe,QAAfA,EAAhBA,EAAkByH,qBAAa,IAAAzH,OAAA,EAA/BA,EAAiCnU,YAA4B,QAApBoU,EAAInC,EAAWnF,aAAK,IAAAsH,GAAe,QAAfA,EAAhBA,EAAkBwH,qBAAa,IAAAxH,OAAA,EAA/BA,EAAiCpU,WAAY,QACjF,QADuFqU,EACvGpC,EAAWzsB,aAAK,IAAA6uB,OAAA,EAAhBA,EAAkBuH,eACF,QADetH,EAC/BrC,EAAWnF,aAAK,IAAAwH,OAAA,EAAhBA,EAAkBsH,eAGvBtW,uBAAuC,QAAhBiP,EAAAtC,EAAWzsB,aAAK,IAAA+uB,OAAA,EAAhBA,EAAkBjP,wBAAyB,UAClEE,6BAA6C,QAAhBgP,EAAAvC,EAAWzsB,aAAK,IAAAgvB,OAAA,EAAhBA,EAAkBhP,8BAA+B,UAC9EC,kBAAkC,QAAhBgP,EAAAxC,EAAWzsB,aAAK,IAAAivB,OAAA,EAAhBA,EAAkBhP,mBAAoB,UACxDC,qBAAqC,QAAhBgP,EAAAzC,EAAWzsB,aAAK,IAAAkvB,OAAA,EAAhBA,EAAkBhP,sBAAuB,UAC9DE,sBAAsC,QAAhB+O,EAAA1C,EAAWzsB,aAAK,IAAAmvB,OAAA,EAAhBA,EAAkB/O,uBAAwB,UAChEE,0BAA0C,QAAhB8O,EAAA3C,EAAWzsB,aAAK,IAAAovB,OAAA,EAAhBA,EAAkB9O,2BAA4B,UACxEE,2BAA2C,QAAhB6O,EAAA5C,EAAWzsB,aAAK,IAAAqvB,OAAA,EAAhBA,EAAkB7O,4BAA6B,UAC1EC,qBAAqC,QAAhB6O,EAAA7C,EAAWzsB,aAAK,IAAAsvB,OAAA,EAAhBA,EAAkB7O,sBAAuB,UAC9DC,sBAAsC,QAAhB6O,EAAA9C,EAAWzsB,aAAK,IAAAuvB,OAAA,EAAhBA,EAAkB7O,uBAAwB,UAChEE,oBAAoC,QAAhB4O,EAAA/C,EAAWzsB,aAAK,IAAAwvB,OAAA,EAAhBA,EAAkB5O,qBAAsB,UAC5DE,6BAA6C,QAAhB2O,EAAAhD,EAAWzsB,aAAK,IAAAyvB,OAAA,EAAhBA,EAAkB3O,8BAA+B,UAC9EC,oBAAoC,QAAhB2O,EAAAjD,EAAWzsB,aAAK,IAAA0vB,OAAA,EAAhBA,EAAkB3O,qBAAsB,UAE5D9gB,UAA0B,QAAhB0vB,EAAAlD,EAAWzsB,aAAK,IAAA2vB,OAAA,EAAhBA,EAAkB1vB,WAAYwsB,EAAWxsB,UAAY,KAE/D9H,cAA8B,QAAhBy3B,EAAAnD,EAAWzsB,aAAK,IAAA4vB,OAAA,EAAhBA,EAAkBz3B,eAAgBs0B,EAAWt0B,cACxDs0B,EAAWzsB,OAIhB+V,KAAIvW,GAAA,CAEFgpB,iBAAgC,QAAfqH,EAAApD,EAAW1W,YAAI,IAAA8Z,OAAA,EAAfA,EAAiBrH,mBAAmC,QAApBsH,EAAIrD,EAAWnF,aAAK,IAAAwI,OAAA,EAAhBA,EAAkBtH,kBAAmB,UAC1FE,sBAAqC,QAAfqH,GAAAtD,EAAW1W,YAAI,IAAAga,QAAA,EAAfA,GAAiBrH,wBAAwC,QAApBsH,GAAIvD,EAAWnF,aAAK,IAAA0I,QAAA,EAAhBA,GAAkBtH,uBAAwB,UACzG2N,uBAAsC,QAAfpG,GAAAxD,EAAW1W,YAAI,IAAAka,QAAA,EAAfA,GAAiBoG,yBAAyC,QAApBnG,GAAIzD,EAAWnF,aAAK,IAAA4I,QAAA,EAAhBA,GAAkBmG,wBAAyB,UAC5G7O,gBAA+B,QAAf2I,GAAA1D,EAAW1W,YAAI,IAAAoa,QAAA,EAAfA,GAAiB3I,kBAAkC,QAApB4I,GAAI3D,EAAWnF,aAAK,IAAA8I,QAAA,EAAhBA,GAAkB5I,iBAAkB,IACvFmB,qBAAoC,QAAf0H,GAAA5D,EAAW1W,YAAI,IAAAsa,QAAA,EAAfA,GAAiB1H,uBAAuC,QAApB2H,GAAI7D,EAAWnF,aAAK,IAAAgJ,QAAA,EAAhBA,GAAkB3H,sBAAuB,UACtGa,oBAAmC,QAAf+G,GAAA9D,EAAW1W,YAAI,IAAAwa,QAAA,EAAfA,GAAiB/G,sBAAsC,QAApBgH,GAAI/D,EAAWnF,aAAK,IAAAkJ,QAAA,EAAhBA,GAAkBhH,qBAAsB,OACnGC,sBAAqC,QAAfgH,GAAAhE,EAAW1W,YAAI,IAAA0a,QAAA,EAAfA,GAAiBhH,wBAAwC,QAApBiH,GAAIjE,EAAWnF,aAAK,IAAAoJ,QAAA,EAAhBA,GAAkBjH,uBAAwB,MAEzGhC,eAAcjoB,GAAAA,GAAA,CACZuW,MAAqB,QAAf4a,GAAAlE,EAAW1W,YAAI,IAAA4a,IAAgB,QAAhBA,GAAfA,GAAiBlJ,sBAAc,IAAAkJ,QAAA,EAA/BA,GAAiC5a,QAAwB,QAApB6a,GAAInE,EAAWnF,aAAK,IAAAsJ,IAAgB,QAAhBA,GAAhBA,GAAkBnJ,sBAAc,IAAAmJ,QAAA,EAAhCA,GAAkC7a,OAAQ,GACzF8E,OAAsB,QAAfgW,GAAApE,EAAW1W,YAAI,IAAA8a,IAAgB,QAAhBA,GAAfA,GAAiBpJ,sBAAc,IAAAoJ,QAAA,EAA/BA,GAAiChW,SAAyB,QAApBiW,GAAIrE,EAAWnF,aAAK,IAAAwJ,IAAgB,QAAhBA,GAAhBA,GAAkBrJ,sBAAc,IAAAqJ,QAAA,EAAhCA,GAAkCjW,QAAS,UAC5FL,UAAyB,QAAfuW,GAAAtE,EAAW1W,YAAI,IAAAgb,IAAgB,QAAhBA,GAAfA,GAAiBtJ,sBAAc,IAAAsJ,QAAA,EAA/BA,GAAiCvW,YAA4B,QAApBwW,GAAIvE,EAAWnF,aAAK,IAAA0J,IAAgB,QAAhBA,GAAhBA,GAAkBvJ,sBAAc,IAAAuJ,QAAA,EAAhCA,GAAkCxW,WAAY,QACnF,QADyFyW,GACxGxE,EAAW1W,YAAI,IAAAkb,QAAA,EAAfA,GAAiBxJ,gBACD,QADeyJ,GAC/BzE,EAAWnF,aAAK,IAAA4J,QAAA,EAAhBA,GAAkBzJ,gBAGvBJ,kBAAiC,QAAf8J,GAAA1E,EAAW1W,YAAI,IAAAob,QAAA,EAAfA,GAAiB9J,oBAAoC,QAApB+J,GAAI3E,EAAWnF,aAAK,IAAA8J,QAAA,EAAhBA,GAAkB/J,mBAAoB,uBAC7FuB,kBAAiC,QAAfyI,GAAA5E,EAAW1W,YAAI,IAAAsb,QAAA,EAAfA,GAAiBzI,oBAAoC,QAApB0I,GAAI7E,EAAWnF,aAAK,IAAAgK,QAAA,EAAhBA,GAAkB1I,mBAAoB,UAC7FC,iBAAgC,QAAf0I,GAAA9E,EAAW1W,YAAI,IAAAwb,QAAA,EAAfA,GAAiB1I,mBAAmC,QAApB2I,GAAI/E,EAAWnF,aAAK,IAAAkK,QAAA,EAAhBA,GAAkB3I,kBAAmB,UAC1FC,sBAAqC,QAAf2I,GAAAhF,EAAW1W,YAAI,IAAA0b,QAAA,EAAfA,GAAiB3I,wBAAwC,QAApB4I,GAAIjF,EAAWnF,aAAK,IAAAoK,QAAA,EAAhBA,GAAkB5I,uBAAwB,UACzGC,gBAA+B,QAAf4I,GAAAlF,EAAW1W,YAAI,IAAA4b,QAAA,EAAfA,GAAiB5I,kBAAkC,QAApB6I,GAAInF,EAAWnF,aAAK,IAAAsK,QAAA,EAAhBA,GAAkB7I,iBAAkB,UACvFC,eAA8B,QAAf6I,GAAApF,EAAW1W,YAAI,IAAA8b,QAAA,EAAfA,GAAiB7I,iBAAiC,QAApB8I,GAAIrF,EAAWnF,aAAK,IAAAwK,QAAA,EAAhBA,GAAkB9I,gBAAiB,OACpFC,mBAAkC,QAAf8I,GAAAtF,EAAW1W,YAAI,IAAAgc,QAAA,EAAfA,GAAiB9I,qBAAqC,QAApB+I,GAAIvF,EAAWnF,aAAK,IAAA0K,QAAA,EAAhBA,GAAkB/I,oBAAqB,GAChGC,cAA6B,QAAf+I,GAAAxF,EAAW1W,YAAI,IAAAkc,QAAA,EAAfA,GAAiB/I,gBAAgC,QAApBgJ,GAAIzF,EAAWnF,aAAK,IAAA4K,QAAA,EAAhBA,GAAkBhJ,eAAgB,YAC9EuD,EAAW1W,MAIhBugB,QAAO92B,GAAA,CACLob,iBAAmC,QAAlBuX,GAAA1F,EAAW6J,eAAO,IAAAnE,QAAA,EAAlBA,GAAoBvX,kBAAmB,oDACxD2b,MAAwB,QAAlBnE,GAAA3F,EAAW6J,eAAO,IAAAlE,QAAA,EAAlBA,GAAoBmE,OAAQ,KAClCvQ,OAAyB,QAAlBqM,GAAA5F,EAAW6J,eAAO,IAAAjE,QAAA,EAAlBA,GAAoBrM,QAAS,KACpCwQ,YAA8B,QAAlBlE,GAAA7F,EAAW6J,eAAO,IAAAhE,QAAA,EAAlBA,GAAoBkE,aAAc,UAC9CC,yBAA2C,QAAlBlE,GAAA9F,EAAW6J,eAAO,IAAA/D,QAAA,EAAlBA,GAAoBkE,0BAA2B,UACxEC,qBAAuC,QAAlBlE,GAAA/F,EAAW6J,eAAO,IAAA9D,QAAA,EAAlBA,GAAoBkE,sBAAuB,UAChEC,0BAA4C,QAAlBlE,GAAAhG,EAAW6J,eAAO,IAAA7D,QAAA,EAAlBA,GAAoBkE,2BAA4BjB,GAC1EkB,6BAA+C,QAAlBlE,GAAAjG,EAAW6J,eAAO,IAAA5D,QAAA,EAAlBA,GAAoBkE,8BAA+BlB,GAChFmB,oBAAsC,QAAlBlE,GAAAlG,EAAW6J,eAAO,IAAA3D,QAAA,EAAlBA,GAAoBkE,qBAAsB,UAC9DC,eAAiC,QAAlBlE,GAAAnG,EAAW6J,eAAO,IAAA1D,QAAA,EAAlBA,GAAoBkE,gBAAiB,KACpDC,cAAgC,QAAlBlE,GAAApG,EAAW6J,eAAO,IAAAzD,QAAA,EAAlBA,GAAoBkE,eAAgB,MAC/CtK,EAAW6J,SAIhB5qB,OAAMlM,GAAA,CACJwmB,OAAwB,QAAjB8M,GAAArG,EAAW/gB,cAAM,IAAAonB,QAAA,EAAjBA,GAAmB9M,QAAS,iBACnCgR,WAA4C,KAAhB,QAAjBjE,GAAAtG,EAAW/gB,cAAM,IAAAqnB,QAAA,EAAjBA,GAAmBiE,WAC9Bpc,iBAAkC,QAAjBoY,GAAAvG,EAAW/gB,cAAM,IAAAsnB,QAAA,EAAjBA,GAAmBpY,mBAAoC,QAArBqY,GAAIxG,EAAW3P,cAAM,IAAAmW,QAAA,EAAjBA,GAAmBrY,kBAAmB,UAC7FuO,WAA4B,QAAjB+J,GAAAzG,EAAW/gB,cAAM,IAAAwnB,QAAA,EAAjBA,GAAmB/J,YAAa,UAC3C8N,iBAAwD,KAAtB,QAAjB9D,GAAA1G,EAAW/gB,cAAM,IAAAynB,QAAA,EAAjBA,GAAmB8D,kBACjCxK,EAAW/gB,QAIhB8T,SAAQhgB,GAAA,CACN03B,SAA4B,QAAnB9D,GAAA3G,EAAWjN,gBAAQ,IAAA4T,QAAA,EAAnBA,GAAqB8D,UAAW,KACzCC,MAAyB,QAAnB9D,GAAA5G,EAAWjN,gBAAQ,IAAA6T,QAAA,EAAnBA,GAAqB8D,OAAQ,KACnC9gC,OAA0B,QAAnBi9B,GAAA7G,EAAWjN,gBAAQ,IAAA8T,QAAA,EAAnBA,GAAqBj9B,QAAS,KACrCopB,MAAyB,QAAnB8T,GAAA9G,EAAWjN,gBAAQ,IAAA+T,QAAA,EAAnBA,GAAqB9T,OAAQ,KACnCC,SAA4B,QAAnB8T,GAAA/G,EAAWjN,gBAAQ,IAAAgU,QAAA,EAAnBA,GAAqB9T,UAAW,KACzCC,SAA4B,QAAnB8T,GAAAhH,EAAWjN,gBAAQ,IAAAiU,QAAA,EAAnBA,GAAqB9T,UAAW,MACtC8M,EAAWjN,UAIhB+I,SAAQ/oB,GAAA,CACN4pB,qBAAwC,QAAnBsK,GAAAjH,EAAWlE,gBAAQ,IAAAmL,QAAA,EAAnBA,GAAqBtK,sBAAuB,UACjEC,sBAAyC,QAAnBsK,GAAAlH,EAAWlE,gBAAQ,IAAAoL,QAAA,EAAnBA,GAAqBtK,uBAAwB,UACnEC,uBAA0C,QAAnBsK,GAAAnH,EAAWlE,gBAAQ,IAAAqL,QAAA,EAAnBA,GAAqBtK,wBAAyB,UACrEC,sBAAyC,QAAnBsK,GAAApH,EAAWlE,gBAAQ,IAAAsL,QAAA,EAAnBA,GAAqBtK,uBAAwB,UACnEJ,WAA8B,QAAnB2K,GAAArH,EAAWlE,gBAAQ,IAAAuL,QAAA,EAAnBA,GAAqB3K,YAAa,UAC7C3O,UAA6B,QAAnBuZ,GAAAtH,EAAWlE,gBAAQ,IAAAwL,QAAA,EAAnBA,GAAqBvZ,WAAY,OAC3CG,cAAiC,QAAnBqZ,GAAAvH,EAAWlE,gBAAQ,IAAAyL,QAAA,EAAnBA,GAAqBrZ,eAAgB,GAChD8R,EAAWlE,UAIhBE,UAASjpB,GAAA,CACP43B,aAAmD,KAAlB,QAApBnD,GAAAxH,EAAWhE,iBAAS,IAAAwL,QAAA,EAApBA,GAAsBmD,aACnCC,aAAmD,KAAlB,QAApBnD,GAAAzH,EAAWhE,iBAAS,IAAAyL,QAAA,EAApBA,GAAsBmD,aACnCC,aAAmD,KAAlB,QAApBnD,GAAA1H,EAAWhE,iBAAS,IAAA0L,QAAA,EAApBA,GAAsBmD,aACnCtvB,UAA8B,QAApBosB,GAAA3H,EAAWhE,iBAAS,IAAA2L,QAAA,EAApBA,GAAsBpsB,WAAY,IACzCykB,EAAWhE,WAIhB6D,SAAQ9sB,GAAA,CACNgtB,UAA6B,QAAnB6H,GAAA5H,EAAWH,gBAAQ,IAAA+H,QAAA,EAAnBA,GAAqB7H,YAAY,EAC3CD,WAA8B,QAAnB+H,GAAA7H,EAAWH,gBAAQ,IAAAgI,QAAA,EAAnBA,GAAqB/H,aAAa,EAC7CgL,QAA2B,QAAnBhD,GAAA9H,EAAWH,gBAAQ,IAAAiI,QAAA,EAAnBA,GAAqBgD,UAAU,EACvCC,aAAgC,QAAnBhD,GAAA/H,EAAWH,gBAAQ,IAAAkI,QAAA,EAAnBA,GAAqBgD,eAAe,EACjDC,oBAAgE,KAAzB,QAAnBhD,GAAAhI,EAAWH,gBAAQ,IAAAmI,QAAA,EAAnBA,GAAqBgD,oBACzCC,gBAAmC,QAAnBhD,GAAAjI,EAAWH,gBAAQ,IAAAoI,QAAA,EAAnBA,GAAqBgD,iBAAkB,mCAEvDC,qBAA0D3oC,KAAtB,QAAnB2lC,GAAAlI,EAAWH,gBAAQ,IAAAqI,QAAA,EAAnBA,GAAqBgD,kBAAgClL,EAAWH,SAASqL,gBAE1FC,MAAyB,QAAnBhD,GAAAnI,EAAWH,gBAAQ,IAAAsI,QAAA,EAAnBA,GAAqBgD,OAAQ,WAChCnL,EAAWH,UAIhBuL,cAAar4B,GAAA,CACXs4B,WAAmC,QAAxBjD,GAAApI,EAAWoL,qBAAa,IAAAhD,QAAA,EAAxBA,GAA0BiD,YAAa,iBAClDC,iBAAyC,QAAxBjD,GAAArI,EAAWoL,qBAAa,IAAA/C,QAAA,EAAxBA,GAA0BiD,kBAAmB,+BAC9DC,oBAAqE,KAAzB,QAAxBjD,GAAAtI,EAAWoL,qBAAa,IAAA9C,QAAA,EAAxBA,GAA0BiD,qBAC3CvL,EAAWoL,eAIhBI,aAAcxL,EAAWwL,cAAgB,GAGzCja,UAAWyO,EAAWzO,WAAa,CAAC,EAEpC3I,oBAAqBoX,EAAWpX,oBAGhCogB,aAAcA,IAEqB,iBAAxBhJ,EAAWwI,SAAwB,CAAEiD,eAAgBzL,EAAWwI,UAAa,CAAC,EAE7F,GAAC,CAAAtpC,IAAA,qBAAAkE,MAED,WAAqB,IAAAoE,EAAA,KAEnBnH,KAAKuxB,IAAIzlB,GAAG,cAAe,SAAChI,GAC1BqD,EAAK02B,cAAc3L,UAAUpuB,GAC7BqD,EAAK02B,cAAcM,oBACrB,GAEAn+B,KAAKuxB,IAAIzlB,GAAG,QAAS,SAAChI,GAEhBA,IAA4B,2BAAlBA,EAAMmI,SACfnI,EAAMmI,SAAWnI,EAAMmI,QAAQkC,SAAS,6BAG7ChH,EAAK02B,cAAc3L,UAAUpuB,EAAMmI,SAAWnI,GAC9CqD,EAAK02B,cAAcM,qBACrB,GAEAn+B,KAAKuxB,IAAIzlB,GAAG,QAAS,SAAC0yB,GACpBr3B,EAAK02B,cAAcwN,qBAAqB7M,EAC1C,GAEAx+B,KAAKuxB,IAAIzlB,GAAG,OAAQ,SAAAof,GAAc,IAAXjC,EAAIiC,EAAJjC,KACrB9hB,EAAK02B,cAAcyN,kBAAkBriB,EACvC,EACF,GAAC,CAAApqB,IAAA,eAAAkE,MAED,WACEgB,QAAQkS,IAAI,0BAA2B,CACrCs1B,OAAO,IAAI9qC,OAAQ8qC,MAAMlD,MAAM,MAAM76B,MAAM,EAAG,GAAGqY,KAAK,QAIxD,IAAM2lB,EAAiBx9B,SAAS6jB,eAAe,oBAC3C2Z,GACFA,EAAezZ,SAGjB,IAAM0Z,EAASz9B,SAASiiB,cAAc,OAStC,GARAwb,EAAOlN,GAAK,mBACZkN,EAAOpb,UAAYrwB,KAAK0rC,qBAExB19B,SAASugB,KAAK4B,YAAYsb,GAE1BzrC,KAAK2rC,oBAGD3rC,KAAKrB,OAAO6gC,SAASC,WAAaz/B,KAAKrB,OAAO6gC,SAASE,SAAU,CACnE,IAAMlF,EAAQxsB,SAAS6jB,eAAe,mBAClC2I,IACFx6B,KAAKk/B,QAAS,EACd1E,EAAM1I,UAAUtpB,IAAI,QAExB,CACF,GAAC,CAAA3J,IAAA,qBAAAkE,MAED,WAAqB,IAAAmF,EAAA,KAEbsvB,GADMx3B,KAAKrB,OAAOwpC,SACZnoC,KAAKrB,OAAOqxB,QAClBI,EAAOpwB,KAAKrB,OAAOyxB,KAEnBxR,GADQ5e,KAAKrB,OAAO67B,MACXx6B,KAAKrB,OAAOigB,QAUrByX,GATOr2B,KAAKrB,OAAOg9B,UAGL,CAClBiQ,MAAO,GACPC,OAAQ,GACRC,MAAO,GACPC,GAAI,IAEyBvU,EAAIhY,OAAS,IAStCkY,EANY,CAChBkU,MAAO,GACPC,OAAQ,GACRC,MAAO,GACPC,GAAI,IAEqB3b,EAAK5Q,OAAS,GAGnCwsB,EAAiBhsC,KAAKisC,yBAGtBC,EAAWlsC,KAAKmsC,iBAAiBzU,GAEjC0U,EAAapsC,KAAKrB,OAAO6gC,SAASsL,MAAQ,UAC1CuB,EAA6B,YAAfD,EACdE,EAA2B,YAAfF,GAA2C,eAAfA,EACxCG,EAA0B,YAAfH,GAA2C,cAAfA,EAIvCloC,EAAI,SAACrF,GACT,IAAMwzB,EAAOnqB,EAAKvJ,OAAOwU,UAAY,KAErC,OADqBjL,EAAKoqB,aAAaD,IAASnqB,EAAKoqB,aAAaC,IAC9C1zB,IAAQA,CAC9B,EAGMi0B,EAAa,SAACj0B,GAAQ,IAAA2tC,EACpB/Z,EAA8B,QAAvB+Z,EAAGtkC,EAAKvJ,OAAO+zB,gBAAQ,IAAA8Z,OAAA,EAApBA,EAAuB3tC,GACvC,OAAI4zB,QAAkDA,EAErC,CACf2X,QAASlmC,EAAE,WACXmmC,KAAMnmC,EAAE,QACRqF,MAAOrF,EAAE,SACTyuB,KAAMzuB,EAAE,QACR0uB,QAAS1uB,EAAE,WACX2uB,QAAS3uB,EAAE,YAEGrF,IAAQ,EAC1B,EAEA,MAAO,4BAAPmF,OAEMhE,KAAKysC,YAAYT,EAAgB3V,EAAYqB,GAAS,cAAA1zB,OACtDhE,KAAKrB,OAAOwsC,aAAY,oCAAAnnC,OAG1BhE,KAAKrB,OAAO6gC,SAASiL,OAAS,GAAK,qEAAHzmC,OAEXhE,KAAKrB,OAAOosC,cAAcC,UAAS,uCAAAhnC,OAC7BhE,KAAKrB,OAAOosC,cAAcE,gBAAe,gBAAAjnC,OAAgBkoC,EAAQ,6BAC7F,0JAAAloC,OAIiEhE,KAAKrB,OAAO87B,UAAS,iEAAAz2B,OACnC4a,EAAOkP,gBAAe,aAAA9pB,OAAY4a,EAAOyd,UAAS,0CAAAr4B,OAE5F4a,EAAOsrB,UAAY,6BAAHlmC,OAAgC4a,EAAOsa,MAAK,UAAW,GAAE,yHAAAl1B,OAGjEE,EAAE,UAAS,oTAAAF,OAM6C8uB,EAAW,WAAU,aAAA9uB,OAAYqoC,EAAc,iBAAmB,GAAE,iNAAAroC,OAKrH,YAAfooC,EAA2B,4DAAHpoC,OAA+D8uB,EAAW,QAAO,+GAE9F,GAAE,+EAAA9uB,OAGb4a,EAAOurB,gBAAkB,8DAAgErX,EAAW,SAA3E,wEAEX,GAAE,wDAAA9uB,OAIpBqoC,EAAc,uJAAHroC,OAGkBE,EAAE,gBAAe,oEAAAF,OAE1CsoC,EAAY,0JAAHtoC,OAEsBE,EAAE,aAAY,gCACrC,GAAE,oBAAAF,OACVuoC,EAAW,wJAAHvoC,OAEuBE,EAAE,YAAW,gCACpC,GAAE,0CAEN,GAAE,kBAAAF,OAEVsoC,EAAYtsC,KAAK60B,eAAe6X,eAAiB,GAAE,gBAAA1oC,OACnDuoC,EAAWvsC,KAAK69B,cAAc6O,eAAiB,GAAE,yDAK3D,GAAC,CAAA7tC,IAAA,yBAAAkE,MAED,WACE,IAAM4pC,EAAM3sC,KAAKrB,OAAOwpC,SAClBK,EAASmE,EAAInE,QAAU,CAAEE,EAAG,GAAI/jC,EAAG,IAErCioC,EAAS,GAoBb,MAjBqB,QAAjBD,EAAIrE,SACNsE,GAAU,QAAJ5oC,OAAYwkC,EAAO7jC,EAAC,OACA,WAAjBgoC,EAAIrE,SACbsE,GAAU,WAAJ5oC,OAAewkC,EAAO7jC,EAAC,OACH,WAAjBgoC,EAAIrE,WACbsE,GAAU,0CAIW,SAAnBD,EAAIpE,WACNqE,GAAU,SAAJ5oC,OAAawkC,EAAOE,EAAC,OACC,UAAnBiE,EAAIpE,WACbqE,GAAU,UAAJ5oC,OAAcwkC,EAAOE,EAAC,OACA,WAAnBiE,EAAIpE,aACbqE,GAAU,2CAGLA,CACT,GAAC,CAAA/tC,IAAA,mBAAAkE,MAED,SAAiByc,GACf,IAAM4Q,EAAOpwB,KAAKrB,OAAOyxB,KAEzB,OAAQA,EAAK1xB,MACX,IAAK,SACH,MAAO,aAAPsF,OAAoBosB,EAAKyY,YAAW,yCAAA7kC,OAAwCwb,EAAI,gBAAAxb,OAAewb,EAAI,gCAErG,IAAK,QACH,MAAO,2BAAPxb,OAAkCwb,EAAI,yBAAAxb,OAAwBosB,EAAK0Y,MAAK,WAE1E,IAAK,OACH,MAAO,2BAAP9kC,OAAkCmF,KAAKwU,MAAa,GAAP6B,GAAW,0CAAAxb,OAAyCosB,EAAKnH,KAAI,WAE5G,IAAK,aACL,QACE,MAAO,0CAAPjlB,OAAiDwb,EAAI,gBAAAxb,OAAewb,EAAI,sQAK1E,IAAK,OACH,MAAO,0CAAPxb,OAAiDwb,EAAI,gBAAAxb,OAAewb,EAAI,qJAI9E,GAAC,CAAA3gB,IAAA,cAAAkE,MAED,SAAYipC,EAAgB3V,EAAYqB,GAAU,IAAAmV,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAC1C3V,EAAMx3B,KAAKrB,OAAOqxB,OAClBI,EAAOpwB,KAAKrB,OAAOyxB,KACnBoK,EAAQx6B,KAAKrB,OAAO67B,MACpB5b,EAAS5e,KAAKrB,OAAOigB,OAErBwuB,GADWptC,KAAKrB,OAAO88B,SAChBz7B,KAAKrB,OAAOg9B,WAGnByQ,EAAapsC,KAAKrB,OAAO6gC,SAASsL,MAAQ,UAC1CwB,EAA2B,YAAfF,GAA2C,eAAfA,EACxCG,EAA0B,YAAfH,GAA2C,cAAfA,EAGvCxD,EAAchqB,EAAOkP,gBAE3B,MAAO,4fAAP9pB,OAgBQgoC,EAAc,uBAAAhoC,OAC6B,UAApChE,KAAKrB,OAAOwpC,SAASI,WAAyB,OAAS,OAAM,uBAAAvkC,OAC1B,SAApChE,KAAKrB,OAAOwpC,SAASI,WAAwB,OAAS,OAAM,yBAAAvkC,OACxB,WAAlChE,KAAKrB,OAAOwpC,SAASG,SAAwB,OAAS,OAAM,sBAAAtkC,OAC7B,QAAlChE,KAAKrB,OAAOwpC,SAASG,SAAqB,OAAS,OAAM,snBAAAtkC,OAyBzDqyB,EAAU,yBAAAryB,OACTqyB,EAAU,gCAAAryB,OACW,WAAdwzB,EAAIuR,MAAqB,MAAsB,WAAdvR,EAAIuR,MAAqB,IAAM,OAAM,2BAAA/kC,OACzEwzB,EAAI1J,iBAAmBsC,EAAKtC,iBAAmB,UAAS,wKAAA9pB,OAMpDopC,EAAKlyB,SAAQ,q6HAAAlX,OAqJ/BopC,EAAK9C,YAAc,kOAMjB,GAAE,+GAAAtmC,OAKWqyB,EAAU,yBAAAryB,OACa,UAApChE,KAAKrB,OAAOwpC,SAASI,WAAyB,eAAiB,cAAa,qBAAAvkC,OACrEw2B,EAAM1D,MAAK,iEAAA9yB,OAEVw2B,EAAMzD,OAAM,0CAAA/yB,OACKqyB,EAAU,0EAAAryB,OAEpBw2B,EAAM3M,aAAY,oGAAA7pB,OAIjCw2B,EAAM2O,eAAiB,oBAAHnlC,OAAuBw2B,EAAM2O,eAAc,KAAM,GAAE,cAAAnlC,OACvEopC,EAAK5C,YAAc,mBAAHxmC,OAAsBopC,EAAKlyB,SAAQ,WAAY,GAAE,uHAAAlX,OAMjEopC,EAAK5C,YAAc,wCAA0C,GAAE,+IAAAxmC,OAIKw2B,EAAM3M,aAAY,mPAAA7pB,OACVw2B,EAAM3M,aAAY,gXAAA7pB,OAIyCw2B,EAAM3M,aAAY,wpBAAA7pB,OAoBjIw2B,EAAM3M,aAAY,0CAAA7pB,OACjBw2B,EAAM3M,aAAY,qgDAAA7pB,QAiDZ,QAAnB6oC,EAAA7sC,KAAKrB,OAAO6qC,eAAO,IAAAqD,OAAA,EAAnBA,EAAqB/e,kBAAmB,oDAAmD,iWAAA9pB,QAY7E,QAAnB8oC,EAAA9sC,KAAKrB,OAAO6qC,eAAO,IAAAsD,OAAA,EAAnBA,EAAqBpD,aAAc,UAAS,kTAAA1lC,QAUpB,QAAnB+oC,EAAA/sC,KAAKrB,OAAO6qC,eAAO,IAAAuD,OAAA,EAAnBA,EAAqBpD,0BAA2B,UAAS,kCAAA3lC,QAChC,QAAnBgpC,EAAAhtC,KAAKrB,OAAO6qC,eAAO,IAAAwD,OAAA,EAAnBA,EAAqBpD,sBAAuB,UAAS,4OAAA5lC,OAQjDopC,EAAKlyB,SAAQ,uBAAAlX,OAAsBopC,EAAKlyB,SAAQ,yBAAAlX,OAAwBopC,EAAKlyB,SAAQ,8NAAAlX,QAM1E,QAAnBipC,EAAAjtC,KAAKrB,OAAO6qC,eAAO,IAAAyD,OAAA,EAAnBA,EAAqBpD,2BAA4BjB,EAAW,uOAAA5kC,QAS3C,QAAnBkpC,EAAAltC,KAAKrB,OAAO6qC,eAAO,IAAA0D,OAAA,EAAnBA,EAAqBpD,8BAA+BlB,EAAW,6GAAA5kC,QAKjD,QAAnBmpC,EAAAntC,KAAKrB,OAAO6qC,eAAO,IAAA2D,OAAA,EAAnBA,EAAqBpD,qBAAsB,UAAS,wGAAA/lC,OAM7DsoC,EAAYtsC,KAAK60B,eAAe4X,cAAgB,GAAE,YAAAzoC,OAClDuoC,EAAWvsC,KAAK69B,cAAc4O,cAAgB,GAAE,gNAYtD,GAAC,CAAA5tC,IAAA,oBAAAkE,MAED,WAAoB,IAAA0I,EAAA,KAClB1H,QAAQkS,IAAI,8BAA+B,CACzCs1B,OAAO,IAAI9qC,OAAQ8qC,MAAMlD,MAAM,MAAM76B,MAAM,EAAG,GAAGqY,KAAK,MACtDuZ,YAAap/B,KAAKo/B,cAGpB,IAAMiO,EAAUr/B,SAAS6jB,eAAe,oBACpCwb,IACFA,EAAQ9Y,QAAU,kBAAM9oB,EAAK6hC,aAAa,GAG5C,IAAMC,EAAWv/B,SAAS6jB,eAAe,YACrC0b,IACFA,EAAShZ,QAAU,kBAAM9oB,EAAK6hC,aAAa,GAI7C,IAAMlB,EAAapsC,KAAKrB,OAAO6gC,SAASsL,MAAQ,UAC1CuB,EAA6B,YAAfD,EACdE,EAA2B,YAAfF,GAA2C,eAAfA,EACxCG,EAA0B,YAAfH,GAA2C,cAAfA,EAEvCoB,EAAUx/B,SAAS6jB,eAAe,WAClC2X,EAAUx7B,SAAS6jB,eAAe,iBAClC4b,EAAYz/B,SAAS6jB,eAAe,mBACpC6b,EAAW1/B,SAAS6jB,eAAe,kBACnCgM,EAAgB7vB,SAAS6jB,eAAe,iBACxCgD,EAAiB7mB,SAAS6jB,eAAe,kBAG3C2b,IACFA,EAAQjZ,QAAU,kBAAM9oB,EAAK4gC,aAAa,GAGxCA,GACEoB,IAAWA,EAAUlZ,QAAU,kBAAM9oB,EAAK6gC,WAAW,GACrDoB,IAAUA,EAASnZ,QAAU,kBAAM9oB,EAAK8gC,UAAU,GAG7B,SAArBvsC,KAAKo/B,aAEHoK,GAASA,EAAQ1X,UAAUC,OAAO,UAClC8L,GAAeA,EAAc/L,UAAUtpB,IAAI,UAC3CqsB,GAAgBA,EAAe/C,UAAUC,OAAO,UAChDyb,GAA0B,YAAfpB,GAA0BoB,EAAQ1b,UAAUtpB,IAAI,WAC3Ds0B,IAAYA,EAAW1Q,MAAMkB,QAAU,KACb,UAArBttB,KAAKo/B,aAEVoK,GAASA,EAAQ1X,UAAUC,OAAO,UAClC8L,GAAeA,EAAc/L,UAAUC,OAAO,UAC9C8C,GAAgBA,EAAe/C,UAAUtpB,IAAI,UAC7CglC,GAA0B,YAAfpB,GAA0BoB,EAAQ1b,UAAUtpB,IAAI,WAC3Ds0B,IAAYA,EAAW1Q,MAAMkB,QAAU,UAG3CttB,KAAKo/B,YAAc,UACfoK,GAASA,EAAQ1X,UAAUtpB,IAAI,UAC/Bq1B,GAAeA,EAAc/L,UAAUC,OAAO,UAC9C8C,GAAgBA,EAAe/C,UAAUC,OAAO,UAEhDyb,GAA0B,YAAfpB,GAA0BoB,EAAQ1b,UAAUC,OAAO,aAE5C,eAAfqa,GAELvX,GAAgBA,EAAe/C,UAAUtpB,IAAI,UAC7Cq1B,GAAeA,EAAc/L,UAAUC,OAAO,UAC9CyX,GAASA,EAAQ1X,UAAUC,OAAO,WAEd,cAAfqa,IAELvO,GAAeA,EAAc/L,UAAUtpB,IAAI,UAC3CqsB,GAAgBA,EAAe/C,UAAUC,OAAO,UAChDyX,GAASA,EAAQ1X,UAAUC,OAAO,WAKpCua,IACFvoC,QAAQkS,IAAI,gDACZjW,KAAK60B,eAAenhB,sBAElB64B,IACFxoC,QAAQkS,IAAI,+CACZjW,KAAK69B,cAAcnqB,sBAIrB,IAAMopB,EAAa9uB,SAAS6jB,eAAe,cAEvCiL,IACFA,EAAWvI,QAAU,kBAAM9oB,EAAKoyB,cAAcd,cAAc,EAExDsP,IACFvP,EAAW1Q,MAAMkB,QAAU,SAK3BttB,KAAKrB,OAAOosC,cAAcG,oBAC5BlrC,KAAK2tC,yBAET,GAAC,CAAA9uC,IAAA,eAAAkE,MAED,WACE/C,KAAK69B,cAAcd,cACrB,GAAC,CAAAl+B,IAAA,cAAAkE,MAED,WAEE,GAAmB,aADA/C,KAAKrB,OAAO6gC,SAASsL,MAAQ,WAChD,CACA9qC,KAAKo/B,YAAc,UACnB,IAAMoK,EAAUx7B,SAAS6jB,eAAe,iBAClCgM,EAAgB7vB,SAAS6jB,eAAe,iBACxCgD,EAAiB7mB,SAAS6jB,eAAe,kBACzC2b,EAAUx/B,SAAS6jB,eAAe,WAClCiL,EAAa9uB,SAAS6jB,eAAe,cACvC2X,GAASA,EAAQ1X,UAAUtpB,IAAI,UAC/Bq1B,GAAeA,EAAc/L,UAAUC,OAAO,UAC9C8C,GAAgBA,EAAe/C,UAAUC,OAAO,UAEhDyb,GAASA,EAAQ1b,UAAUC,OAAO,WAElC+K,IAAYA,EAAW1Q,MAAMkB,QAAU,OAbP,CActC,GAAC,CAAAzuB,IAAA,WAAAkE,MAED,WACE/C,KAAKo/B,YAAc,OACnB,IAAMoK,EAAUx7B,SAAS6jB,eAAe,iBAClCgD,EAAiB7mB,SAAS6jB,eAAe,kBACzC2b,EAAUx/B,SAAS6jB,eAAe,WAClCiL,EAAa9uB,SAAS6jB,eAAe,cACvC2X,GAASA,EAAQ1X,UAAUC,OAAO,UAClC8C,GAAgBA,EAAe/C,UAAUC,OAAO,UACpD/xB,KAAK69B,cAAc+P,OAEnB,IAAMxB,EAAapsC,KAAKrB,OAAO6gC,SAASsL,MAAQ,UAC5C0C,GAA0B,YAAfpB,GAA0BoB,EAAQ1b,UAAUtpB,IAAI,WAE3Ds0B,IAAYA,EAAW1Q,MAAMkB,QAAU,GAC7C,GAAC,CAAAzuB,IAAA,YAAAkE,MAED,WACE/C,KAAKo/B,YAAc,QACnB,IAAMoK,EAAUx7B,SAAS6jB,eAAe,iBAClCgM,EAAgB7vB,SAAS6jB,eAAe,iBACxCgD,EAAiB7mB,SAAS6jB,eAAe,kBACzC2b,EAAUx/B,SAAS6jB,eAAe,WAClCiL,EAAa9uB,SAAS6jB,eAAe,cACvC2X,GAASA,EAAQ1X,UAAUC,OAAO,UAClC8L,GAAeA,EAAc/L,UAAUC,OAAO,UAC9C8C,GAAgBA,EAAe/C,UAAUtpB,IAAI,UAEjD,IAAM4jC,EAAapsC,KAAKrB,OAAO6gC,SAASsL,MAAQ,UAC5C0C,GAA0B,YAAfpB,GAA0BoB,EAAQ1b,UAAUtpB,IAAI,WAE3Ds0B,IAAYA,EAAW1Q,MAAMkB,QAAU,OAC7C,GAAC,CAAAzuB,IAAA,0BAAAkE,MAED,WAA0B,IAAA0J,EAAA,KACxBuB,SAAStF,iBAAiB,UAAW,SAACzE,GACtB,WAAVA,EAAEpF,KAAoB4N,EAAKyyB,QAC7BzyB,EAAK6gC,aAET,EACF,GAAC,CAAAzuC,IAAA,cAAAkE,MAED,WACE/C,KAAKk/B,QAAUl/B,KAAKk/B,OACNlxB,SAAS6jB,eAAe,mBAChCC,UAAU+b,OAAO,QAGnB7tC,KAAKk/B,QACP32B,WAAW,WACb,IAAMoO,EAAQ3I,SAAS6jB,eAAe,gBAC9Blb,GAAOA,EAAM6mB,OACnB,EAAG,KAIDx9B,KAAKk/B,SAAWl/B,KAAKwxB,UAAYxxB,KAAKrB,OAAO6gC,SAASkL,aACxD1qC,KAAKg+B,WAET,GAAC,CAAAn/B,IAAA,YAAAkE,OAAA+6B,EAAA9wB,GAAAtH,KAAAE,EAED,SAAAkC,IAAA,OAAApC,KAAAC,EAAA,SAAAwC,GAAA,cAAAA,EAAAhE,GAAA,OAEEnE,KAAKwxB,UAAW,EAChBxxB,KAAK69B,cAAciQ,WAAU,GAAM,cAAA3lC,EAAArD,EAAA,KAAAgD,EAAA,SACpC,WAJc,OAAAg2B,EAAAj6B,MAAC,KAADL,UAAA,KAAA3E,IAAA,cAAAkE,OAAAsmB,EAAArc,GAAAtH,KAAAE,EAMf,SAAAwK,IAAA,OAAA1K,KAAAC,EAAA,SAAA2K,GAAA,cAAAA,EAAAnM,GAAA,cAAAmM,EAAAnM,EAAA,EACQnE,KAAK69B,cAAczpB,cAAa,cAAA9D,EAAAxL,EAAA,KAAAsL,EAAA,SACvC,WAFgB,OAAAiZ,EAAAxlB,MAAC,KAADL,UAAA,KAAA3E,IAAA,wBAAAkE,MAIjB,WACE/C,KAAK69B,cAAcE,uBACrB,GAAC,CAAAl/B,IAAA,eAAAkE,OAAAkyB,EAAAjoB,GAAAtH,KAAAE,EAED,SAAAoP,IAAA,IAAA8R,EAAAtS,EAAA0gB,EAAAC,EAAA3oB,EAAA4oB,EAAAzrB,EAAA,OAAAjE,KAAAC,EAAA,SAAAsP,GAAA,cAAAA,EAAA9Q,GAAA,UAEOnE,KAAKrB,OAAO8yB,cAAe,CAAFxc,EAAA9Q,EAAA,WACvBnE,KAAKrB,OAAOoU,QAAS,CAAFkC,EAAA9Q,EAAA,cAChB,IAAI1D,MAAM,uBAAsB,OAgBvC,OAXKqmB,EAAU9mB,KAAKrB,OAAO0M,cAAgB,sCACtCmJ,EAAS,IAAIC,iBACZC,OAAO,UAAW1U,KAAKrB,OAAOoU,SAEjC/S,KAAKrB,OAAOqU,OACdwB,EAAOE,OAAO,QAAS1U,KAAKrB,OAAOqU,QAIZ,IAArBhT,KAAKrB,OAAO02B,MACd7gB,EAAOE,OAAO,OAAQ,QACvBO,EAAAnQ,EAAA,KAAAd,OAES8iB,EAAO,KAAA9iB,OAAIwQ,EAAOzJ,aAAU,UAIC,iBAA9B/K,KAAKrB,OAAO8yB,cAA0B,CAAAxc,EAAA9Q,EAAA,QAS9C,OARK+wB,EAAc,CAClBniB,QAAS/S,KAAKrB,OAAOoU,QACrBme,UAAWlxB,KAAKrB,OAAOuyB,WAAa,CAAC,GAInClxB,KAAKrB,OAAOqU,QACdkiB,EAAYliB,MAAQhT,KAAKrB,OAAOqU,OACjCiC,EAAA9Q,EAAA,EAEsBmxB,MAAMt1B,KAAKrB,OAAO8yB,cAAe,CACtD8D,OAAQ,OACRC,QAAS,CACP,eAAgB,oBAElBjH,KAAMliB,KAAKC,UAAU4oB,KACrB,OANY,IAARC,EAAQlgB,EAAApQ,GAQA4wB,GAAI,CAAFxgB,EAAA9Q,EAAA,cACR,IAAI1D,MAAM,8BAADuD,OAA+BmxB,EAASO,aAAa,cAAAzgB,EAAA9Q,EAAA,EAGnDgxB,EAASQ,OAAM,OAAxB,OAAJnpB,EAAIyI,EAAApQ,EAAAoQ,EAAAnQ,EAAA,EACH0H,EAAKskB,WAAatkB,EAAK8H,OAAS9H,EAAKzE,KAAG,UAIH,mBAA9B/H,KAAKrB,OAAO8yB,cAA4B,CAAAxc,EAAA9Q,EAAA,QASrD,OARKqQ,EAAS,CACbzB,QAAS/S,KAAKrB,OAAOoU,QACrBme,UAAWlxB,KAAKrB,OAAOuyB,WAAa,CAAC,GAInClxB,KAAKrB,OAAOqU,QACdwB,EAAOxB,MAAQhT,KAAKrB,OAAOqU,OAC5BiC,EAAA9Q,EAAA,EAEoBnE,KAAKrB,OAAO8yB,cAAcjd,GAAO,OAA1C,OAAN7K,EAAMsL,EAAApQ,EAAAoQ,EAAAnQ,EAAA,EAEa,iBAAX6E,EAAsBA,EAAUA,EAAOmnB,WAAannB,EAAO2K,OAAS3K,EAAO5B,KAAI,aAIvF,IAAItH,MAAM,mHAAkH,cAAAwU,EAAAnQ,EAAA,KAAAkQ,EAAA,SAErI,WAzEiB,OAAAigB,EAAApxB,MAAC,KAADL,UAAA,IA2ElB,CAAA3E,IAAA,aAAAkE,MACA,SAAWrE,EAAMuqB,GACfjpB,KAAK69B,cAAcI,WAAWv/B,EAAMuqB,EACtC,GAAC,CAAApqB,IAAA,iBAAAkE,MAED,WACE/C,KAAK69B,cAAcK,gBACrB,GAAC,CAAAr/B,IAAA,uBAAAkE,MAED,SAAqBy7B,GACnBx+B,KAAK69B,cAAcwN,qBAAqB7M,EAC1C,GAAC,CAAA3/B,IAAA,oBAAAkE,MAED,SAAkB0nB,GAChBzqB,KAAK69B,cAAcyN,kBAAkB7gB,EACvC,GAAC,CAAA5rB,IAAA,qBAAAkE,MAED,WACE/C,KAAK69B,cAAcM,oBACrB,GAAC,CAAAt/B,IAAA,YAAAkE,MAED,SAAUkJ,GACRjM,KAAK69B,cAAc3L,UAAUjmB,EAC/B,GAAC,CAAApN,IAAA,eAAAkE,MAED,SAAagrC,GACX,GAGF,CAAAlvC,IAAA,eAAAkE,MACA,SAAagT,GAAW,IAAAi4B,EAAAC,EACtBlqC,QAAQkS,IAAI,yBAA0B,CACpCF,UAAAA,EACAw1B,OAAO,IAAI9qC,OAAQ8qC,MAAMlD,MAAM,MAAM76B,MAAM,EAAG,GAAGqY,KAAK,QAIxD,IAWqCqoB,EAYAC,EAvB/BC,EAAY17B,GAAA,GAAQ1S,KAAKrB,QAG3BoX,EAAUykB,QACZ4T,EAAa5T,MAAK9nB,GAAAA,GAAA,GAAQ1S,KAAKrB,OAAO67B,OAAUzkB,EAAUykB,QAIxDzkB,EAAU7C,QACZk7B,EAAal7B,MAAKR,GAAAA,GAAA,GAAQ1S,KAAKrB,OAAOuU,OAAU6C,EAAU7C,OAEtD6C,EAAU7C,MAAMo2B,gBAClB8E,EAAal7B,MAAMo2B,cAAa52B,GAAAA,GAAA,GACV,QADUw7B,EAC3BluC,KAAKrB,OAAOuU,aAAK,IAAAg7B,OAAA,EAAjBA,EAAmB5E,eACnBvzB,EAAU7C,MAAMo2B,iBAMrBvzB,EAAUkT,OACZmlB,EAAanlB,KAAIvW,GAAAA,GAAA,GAAQ1S,KAAKrB,OAAOsqB,MAASlT,EAAUkT,MAEpDlT,EAAUkT,KAAK0R,iBACjByT,EAAanlB,KAAK0R,eAAcjoB,GAAAA,GAAA,GACX,QADWy7B,EAC3BnuC,KAAKrB,OAAOsqB,YAAI,IAAAklB,OAAA,EAAhBA,EAAkBxT,gBAClB5kB,EAAUkT,KAAK0R,uBAMGz4B,IAAvB6T,EAAU5C,WACZi7B,EAAaj7B,SAAW4C,EAAU5C,eAITjR,IAAvB6T,EAAU5C,WACS,CAAC,KAAM,MACXhF,SAAS4H,EAAU5C,UAClCi7B,EAAa3T,UAAY,WACQv4B,IAAxB6T,EAAU0kB,YACnB2T,EAAa3T,UAAY,QAKzB1kB,EAAUuc,eACZ8b,EAAa9b,aAAevc,EAAUuc,aACtCtyB,KAAKsyB,aAAevc,EAAUuc,cAI5Bvc,EAAUia,SACZoe,EAAape,OAAMtd,GAAAA,GAAA,GAAQ1S,KAAKrB,OAAOqxB,QAAWja,EAAUia,SAE1Dja,EAAU6I,SACZwvB,EAAaxvB,OAAMlM,GAAAA,GAAA,GAAQ1S,KAAKrB,OAAOigB,QAAW7I,EAAU6I,SAE1D7I,EAAUqa,OACZge,EAAahe,KAAI1d,GAAAA,GAAA,GAAQ1S,KAAKrB,OAAOyxB,MAASra,EAAUqa,OAEtDra,EAAU0lB,WACZ2S,EAAa3S,SAAQ/oB,GAAAA,GAAA,GAAQ1S,KAAKrB,OAAO88B,UAAa1lB,EAAU0lB,WAE9D1lB,EAAU4lB,YACZyS,EAAazS,UAASjpB,GAAAA,GAAA,GAAQ1S,KAAKrB,OAAOg9B,WAAc5lB,EAAU4lB,YAEhE5lB,EAAUypB,WACZ4O,EAAa5O,SAAQ9sB,GAAAA,GAAA,GAAQ1S,KAAKrB,OAAO6gC,UAAazpB,EAAUypB,WAE9DzpB,EAAUg1B,gBACZqD,EAAarD,cAAar4B,GAAAA,GAAA,GAAQ1S,KAAKrB,OAAOosC,eAAkBh1B,EAAUg1B,gBAExEh1B,EAAU2c,WACZ0b,EAAa1b,SAAQhgB,GAAAA,GAAA,GAAQ1S,KAAKrB,OAAO+zB,UAAa3c,EAAU2c,WAE9D3c,EAAUyzB,UACZ4E,EAAa5E,QAAO92B,GAAAA,GAAA,GAAQ1S,KAAKrB,OAAO6qC,SAAYzzB,EAAUyzB,eAIpCtnC,IAAxB6T,EAAU0kB,gBAAsDv4B,IAA3BksC,EAAa3T,YACpD2T,EAAa3T,UAAY1kB,EAAU0kB,gBAINv4B,IAA3B6T,EAAU4yB,eACZyF,EAAazF,aAAe5yB,EAAU4yB,cAIxChpC,OAAO4S,KAAKwD,GAAWnS,QAAQ,SAAA/E,GACxB,CAAC,QAAS,SAAU,SAAU,OAAQ,WAAY,YAAa,QAAS,OAAQ,YAAa,WAAY,gBAAiB,WAAY,WAAY,UAAW,gBAAgBsP,SAAStP,KACzLuvC,EAAavvC,GAAOkX,EAAUlX,GAElC,GAG+B,QAAXmvC,EAAAhuC,KAAKrB,cAAM,IAAAqvC,GAAXA,EAAa76B,SAEjCnT,KAAKrB,OAASqB,KAAKi/B,kBAAkBmP,GAIrC,IAAMC,EAAkBruC,KAAKrB,OAAOwU,UAAY,KAC1CksB,EAAW3sB,GAAAA,GAAAA,GAAA,GACZ1S,KAAKrB,QACLqB,KAAKrB,OAAOuU,OAAK,IACpBC,SAAUk7B,EACVhjC,cAA+B,QAAjB4iC,EAAAjuC,KAAKrB,OAAOuU,aAAK,IAAA+6B,OAAA,EAAjBA,EAAmB5iC,eAAgBrL,KAAKrB,OAAO0M,cAAgB,oCAC7EinB,aAActyB,KAAKsyB,eAErBtyB,KAAK60B,eAAiB,IAAI1D,GAAekO,GACzC,IAAMC,EAAU5sB,GAAAA,GAAAA,GAAA,GACX1S,KAAKrB,QACLqB,KAAKrB,OAAOsqB,MAAI,IACnB9V,SAAUk7B,EACV/b,aAActyB,KAAKsyB,eAErBtyB,KAAK69B,cAAgB,IAAIrE,GAAc8F,EAAYt/B,KAAKuxB,KAGxD,IAAMia,EAAiBx9B,SAAS6jB,eAAe,oBAC3C2Z,GACFA,EAAezZ,SAEjB/xB,KAAKu/B,eAGDv/B,KAAK69B,eAAiB79B,KAAK69B,cAAcb,uBAC3Ch9B,KAAK69B,cAAcb,uBAEvB,GAAC,CAAAn+B,IAAA,UAAAkE,MAED,WACE,IAAM0oC,EAASz9B,SAAS6jB,eAAe,oBACnC4Z,GACFA,EAAO1Z,SAEL/xB,KAAKuxB,KACPvxB,KAAKuxB,IAAIrb,UAGPlW,KAAK60B,gBACP70B,KAAK60B,eAAe3e,SAExB,GAEA,CAAArX,IAAA,iBAAAkE,OAAAi1B,EAAAhrB,GAAAtH,KAAAE,EACA,SAAAwP,IAAA,OAAA1P,KAAAC,EAAA,SAAA2P,GAAA,cAAAA,EAAAnR,GAAA,cAAAmR,EAAAnR,EAAA,EACQnE,KAAK60B,eAAeL,iBAAgB,cAAAlf,EAAAxQ,EAAA,KAAAsQ,EAAA,SAC3C,WAFmB,OAAA4iB,EAAAn0B,MAAC,KAADL,UAAA,KAAA3E,IAAA,eAAAkE,MAIpB,WACE/C,KAAK60B,eAAe7C,cACtB,GAAC,CAAAnzB,IAAA,aAAAkE,MAED,WACE/C,KAAK60B,eAAeJ,YACtB,GAAC,CAAA51B,IAAA,gBAAAkE,MAED,WACE/C,KAAK60B,eAAeH,eACtB,IAr3CF7xB,GAAAuD,GAAAnC,EAAA7D,UAAAyC,GAAAlD,OAAA4C,eAAA0B,EAAA,aAAA8B,UAAA,IAAA9B,EAAA,IAAAA,EAAApB,EAs2CEm1B,EAvQC/C,EAZc5L,EAFdyU,CAoSA,CA52CuB,GC2BbwQ,GAAU,QAkBvB,UACEx7B,SAAAA,GACA2R,YAAAA,GACAwD,YAAAA,GACA1d,iBAAAA,EACA2C,cAAAA,EACAyD,YAAAA,EACA3N,aAAAA,EACAqrB,YAAAA,GACAkgB,mBAAAA,GACA9d,SAAAA,GACAqO,cAAAA,GACAwP,QAAAA,I","sources":["webpack://TTPAgentSDK/webpack/universalModuleDefinition","webpack://TTPAgentSDK/./node_modules/react/index.js","webpack://TTPAgentSDK/./node_modules/react/cjs/react-jsx-runtime.production.js","webpack://TTPAgentSDK/./node_modules/react/jsx-runtime.js","webpack://TTPAgentSDK/./node_modules/react/cjs/react.production.js","webpack://TTPAgentSDK/webpack/bootstrap","webpack://TTPAgentSDK/webpack/runtime/define property getters","webpack://TTPAgentSDK/webpack/runtime/hasOwnProperty shorthand","webpack://TTPAgentSDK/webpack/runtime/make namespace object","webpack://TTPAgentSDK/./src/core/EventEmitter.js","webpack://TTPAgentSDK/./src/core/WebSocketSingleton.js","webpack://TTPAgentSDK/./src/core/WebSocketManager.js","webpack://TTPAgentSDK/./src/core/AudioRecorder.js","webpack://TTPAgentSDK/./src/core/AudioPlayer.js","webpack://TTPAgentSDK/./src/core/VoiceSDK.js","webpack://TTPAgentSDK/./src/shared/EventEmitter.js","webpack://TTPAgentSDK/./src/v2/codecs/PCMCodec.js","webpack://TTPAgentSDK/./src/v2/codecs/PCMUCodec.js","webpack://TTPAgentSDK/./src/v2/codecs/PCMACodec.js","webpack://TTPAgentSDK/./src/v2/AudioPlayer.js","webpack://TTPAgentSDK/./src/v1/AudioRecorder.js","webpack://TTPAgentSDK/./src/v2/utils/converters/ContainerConverter.js","webpack://TTPAgentSDK/./src/v2/utils/converters/EncodingConverter.js","webpack://TTPAgentSDK/./src/v2/utils/converters/BitDepthConverter.js","webpack://TTPAgentSDK/./src/v2/utils/converters/SampleRateConverter.js","webpack://TTPAgentSDK/./src/v2/utils/converters/ChannelConverter.js","webpack://TTPAgentSDK/./src/v2/utils/AudioFormatConverter.js","webpack://TTPAgentSDK/./src/v2/VoiceSDK.js","webpack://TTPAgentSDK/./src/core/TextChatSDK.js","webpack://TTPAgentSDK/./src/react/VoiceButton.jsx","webpack://TTPAgentSDK/./src/vanilla/VoiceButton.js","webpack://TTPAgentSDK/./src/legacy/AgentSDK.js","webpack://TTPAgentSDK/./src/legacy/VoiceInterface.js","webpack://TTPAgentSDK/./src/legacy/TextInterface.js","webpack://TTPAgentSDK/./src/legacy/widget-translations.js","webpack://TTPAgentSDK/./src/legacy/TextChatWidget.js","webpack://TTPAgentSDK/./src/index.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"TTPAgentSDK\"] = factory();\n\telse\n\t\troot[\"TTPAgentSDK\"] = factory();\n})(window, () => {\nreturn ","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react.production.js');\n} else {\n module.exports = require('./cjs/react.development.js');\n}\n","/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","/**\n * @license React\n * react.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n MAYBE_ITERATOR_SYMBOL = Symbol.iterator;\nfunction getIteratorFn(maybeIterable) {\n if (null === maybeIterable || \"object\" !== typeof maybeIterable) return null;\n maybeIterable =\n (MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL]) ||\n maybeIterable[\"@@iterator\"];\n return \"function\" === typeof maybeIterable ? maybeIterable : null;\n}\nvar ReactNoopUpdateQueue = {\n isMounted: function () {\n return !1;\n },\n enqueueForceUpdate: function () {},\n enqueueReplaceState: function () {},\n enqueueSetState: function () {}\n },\n assign = Object.assign,\n emptyObject = {};\nfunction Component(props, context, updater) {\n this.props = props;\n this.context = context;\n this.refs = emptyObject;\n this.updater = updater || ReactNoopUpdateQueue;\n}\nComponent.prototype.isReactComponent = {};\nComponent.prototype.setState = function (partialState, callback) {\n if (\n \"object\" !== typeof partialState &&\n \"function\" !== typeof partialState &&\n null != partialState\n )\n throw Error(\n \"takes an object of state variables to update or a function which returns an object of state variables.\"\n );\n this.updater.enqueueSetState(this, partialState, callback, \"setState\");\n};\nComponent.prototype.forceUpdate = function (callback) {\n this.updater.enqueueForceUpdate(this, callback, \"forceUpdate\");\n};\nfunction ComponentDummy() {}\nComponentDummy.prototype = Component.prototype;\nfunction PureComponent(props, context, updater) {\n this.props = props;\n this.context = context;\n this.refs = emptyObject;\n this.updater = updater || ReactNoopUpdateQueue;\n}\nvar pureComponentPrototype = (PureComponent.prototype = new ComponentDummy());\npureComponentPrototype.constructor = PureComponent;\nassign(pureComponentPrototype, Component.prototype);\npureComponentPrototype.isPureReactComponent = !0;\nvar isArrayImpl = Array.isArray;\nfunction noop() {}\nvar ReactSharedInternals = { H: null, A: null, T: null, S: null },\n hasOwnProperty = Object.prototype.hasOwnProperty;\nfunction ReactElement(type, key, props) {\n var refProp = props.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== refProp ? refProp : null,\n props: props\n };\n}\nfunction cloneAndReplaceKey(oldElement, newKey) {\n return ReactElement(oldElement.type, newKey, oldElement.props);\n}\nfunction isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n}\nfunction escape(key) {\n var escaperLookup = { \"=\": \"=0\", \":\": \"=2\" };\n return (\n \"$\" +\n key.replace(/[=:]/g, function (match) {\n return escaperLookup[match];\n })\n );\n}\nvar userProvidedKeyEscapeRegex = /\\/+/g;\nfunction getElementKey(element, index) {\n return \"object\" === typeof element && null !== element && null != element.key\n ? escape(\"\" + element.key)\n : index.toString(36);\n}\nfunction resolveThenable(thenable) {\n switch (thenable.status) {\n case \"fulfilled\":\n return thenable.value;\n case \"rejected\":\n throw thenable.reason;\n default:\n switch (\n (\"string\" === typeof thenable.status\n ? thenable.then(noop, noop)\n : ((thenable.status = \"pending\"),\n thenable.then(\n function (fulfilledValue) {\n \"pending\" === thenable.status &&\n ((thenable.status = \"fulfilled\"),\n (thenable.value = fulfilledValue));\n },\n function (error) {\n \"pending\" === thenable.status &&\n ((thenable.status = \"rejected\"), (thenable.reason = error));\n }\n )),\n thenable.status)\n ) {\n case \"fulfilled\":\n return thenable.value;\n case \"rejected\":\n throw thenable.reason;\n }\n }\n throw thenable;\n}\nfunction mapIntoArray(children, array, escapedPrefix, nameSoFar, callback) {\n var type = typeof children;\n if (\"undefined\" === type || \"boolean\" === type) children = null;\n var invokeCallback = !1;\n if (null === children) invokeCallback = !0;\n else\n switch (type) {\n case \"bigint\":\n case \"string\":\n case \"number\":\n invokeCallback = !0;\n break;\n case \"object\":\n switch (children.$$typeof) {\n case REACT_ELEMENT_TYPE:\n case REACT_PORTAL_TYPE:\n invokeCallback = !0;\n break;\n case REACT_LAZY_TYPE:\n return (\n (invokeCallback = children._init),\n mapIntoArray(\n invokeCallback(children._payload),\n array,\n escapedPrefix,\n nameSoFar,\n callback\n )\n );\n }\n }\n if (invokeCallback)\n return (\n (callback = callback(children)),\n (invokeCallback =\n \"\" === nameSoFar ? \".\" + getElementKey(children, 0) : nameSoFar),\n isArrayImpl(callback)\n ? ((escapedPrefix = \"\"),\n null != invokeCallback &&\n (escapedPrefix =\n invokeCallback.replace(userProvidedKeyEscapeRegex, \"$&/\") + \"/\"),\n mapIntoArray(callback, array, escapedPrefix, \"\", function (c) {\n return c;\n }))\n : null != callback &&\n (isValidElement(callback) &&\n (callback = cloneAndReplaceKey(\n callback,\n escapedPrefix +\n (null == callback.key ||\n (children && children.key === callback.key)\n ? \"\"\n : (\"\" + callback.key).replace(\n userProvidedKeyEscapeRegex,\n \"$&/\"\n ) + \"/\") +\n invokeCallback\n )),\n array.push(callback)),\n 1\n );\n invokeCallback = 0;\n var nextNamePrefix = \"\" === nameSoFar ? \".\" : nameSoFar + \":\";\n if (isArrayImpl(children))\n for (var i = 0; i < children.length; i++)\n (nameSoFar = children[i]),\n (type = nextNamePrefix + getElementKey(nameSoFar, i)),\n (invokeCallback += mapIntoArray(\n nameSoFar,\n array,\n escapedPrefix,\n type,\n callback\n ));\n else if (((i = getIteratorFn(children)), \"function\" === typeof i))\n for (\n children = i.call(children), i = 0;\n !(nameSoFar = children.next()).done;\n\n )\n (nameSoFar = nameSoFar.value),\n (type = nextNamePrefix + getElementKey(nameSoFar, i++)),\n (invokeCallback += mapIntoArray(\n nameSoFar,\n array,\n escapedPrefix,\n type,\n callback\n ));\n else if (\"object\" === type) {\n if (\"function\" === typeof children.then)\n return mapIntoArray(\n resolveThenable(children),\n array,\n escapedPrefix,\n nameSoFar,\n callback\n );\n array = String(children);\n throw Error(\n \"Objects are not valid as a React child (found: \" +\n (\"[object Object]\" === array\n ? \"object with keys {\" + Object.keys(children).join(\", \") + \"}\"\n : array) +\n \"). If you meant to render a collection of children, use an array instead.\"\n );\n }\n return invokeCallback;\n}\nfunction mapChildren(children, func, context) {\n if (null == children) return children;\n var result = [],\n count = 0;\n mapIntoArray(children, result, \"\", \"\", function (child) {\n return func.call(context, child, count++);\n });\n return result;\n}\nfunction lazyInitializer(payload) {\n if (-1 === payload._status) {\n var ctor = payload._result;\n ctor = ctor();\n ctor.then(\n function (moduleObject) {\n if (0 === payload._status || -1 === payload._status)\n (payload._status = 1), (payload._result = moduleObject);\n },\n function (error) {\n if (0 === payload._status || -1 === payload._status)\n (payload._status = 2), (payload._result = error);\n }\n );\n -1 === payload._status && ((payload._status = 0), (payload._result = ctor));\n }\n if (1 === payload._status) return payload._result.default;\n throw payload._result;\n}\nvar reportGlobalError =\n \"function\" === typeof reportError\n ? reportError\n : function (error) {\n if (\n \"object\" === typeof window &&\n \"function\" === typeof window.ErrorEvent\n ) {\n var event = new window.ErrorEvent(\"error\", {\n bubbles: !0,\n cancelable: !0,\n message:\n \"object\" === typeof error &&\n null !== error &&\n \"string\" === typeof error.message\n ? String(error.message)\n : String(error),\n error: error\n });\n if (!window.dispatchEvent(event)) return;\n } else if (\n \"object\" === typeof process &&\n \"function\" === typeof process.emit\n ) {\n process.emit(\"uncaughtException\", error);\n return;\n }\n console.error(error);\n },\n Children = {\n map: mapChildren,\n forEach: function (children, forEachFunc, forEachContext) {\n mapChildren(\n children,\n function () {\n forEachFunc.apply(this, arguments);\n },\n forEachContext\n );\n },\n count: function (children) {\n var n = 0;\n mapChildren(children, function () {\n n++;\n });\n return n;\n },\n toArray: function (children) {\n return (\n mapChildren(children, function (child) {\n return child;\n }) || []\n );\n },\n only: function (children) {\n if (!isValidElement(children))\n throw Error(\n \"React.Children.only expected to receive a single React element child.\"\n );\n return children;\n }\n };\nexports.Activity = REACT_ACTIVITY_TYPE;\nexports.Children = Children;\nexports.Component = Component;\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.Profiler = REACT_PROFILER_TYPE;\nexports.PureComponent = PureComponent;\nexports.StrictMode = REACT_STRICT_MODE_TYPE;\nexports.Suspense = REACT_SUSPENSE_TYPE;\nexports.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE =\n ReactSharedInternals;\nexports.__COMPILER_RUNTIME = {\n __proto__: null,\n c: function (size) {\n return ReactSharedInternals.H.useMemoCache(size);\n }\n};\nexports.cache = function (fn) {\n return function () {\n return fn.apply(null, arguments);\n };\n};\nexports.cacheSignal = function () {\n return null;\n};\nexports.cloneElement = function (element, config, children) {\n if (null === element || void 0 === element)\n throw Error(\n \"The argument must be a React element, but you passed \" + element + \".\"\n );\n var props = assign({}, element.props),\n key = element.key;\n if (null != config)\n for (propName in (void 0 !== config.key && (key = \"\" + config.key), config))\n !hasOwnProperty.call(config, propName) ||\n \"key\" === propName ||\n \"__self\" === propName ||\n \"__source\" === propName ||\n (\"ref\" === propName && void 0 === config.ref) ||\n (props[propName] = config[propName]);\n var propName = arguments.length - 2;\n if (1 === propName) props.children = children;\n else if (1 < propName) {\n for (var childArray = Array(propName), i = 0; i < propName; i++)\n childArray[i] = arguments[i + 2];\n props.children = childArray;\n }\n return ReactElement(element.type, key, props);\n};\nexports.createContext = function (defaultValue) {\n defaultValue = {\n $$typeof: REACT_CONTEXT_TYPE,\n _currentValue: defaultValue,\n _currentValue2: defaultValue,\n _threadCount: 0,\n Provider: null,\n Consumer: null\n };\n defaultValue.Provider = defaultValue;\n defaultValue.Consumer = {\n $$typeof: REACT_CONSUMER_TYPE,\n _context: defaultValue\n };\n return defaultValue;\n};\nexports.createElement = function (type, config, children) {\n var propName,\n props = {},\n key = null;\n if (null != config)\n for (propName in (void 0 !== config.key && (key = \"\" + config.key), config))\n hasOwnProperty.call(config, propName) &&\n \"key\" !== propName &&\n \"__self\" !== propName &&\n \"__source\" !== propName &&\n (props[propName] = config[propName]);\n var childrenLength = arguments.length - 2;\n if (1 === childrenLength) props.children = children;\n else if (1 < childrenLength) {\n for (var childArray = Array(childrenLength), i = 0; i < childrenLength; i++)\n childArray[i] = arguments[i + 2];\n props.children = childArray;\n }\n if (type && type.defaultProps)\n for (propName in ((childrenLength = type.defaultProps), childrenLength))\n void 0 === props[propName] &&\n (props[propName] = childrenLength[propName]);\n return ReactElement(type, key, props);\n};\nexports.createRef = function () {\n return { current: null };\n};\nexports.forwardRef = function (render) {\n return { $$typeof: REACT_FORWARD_REF_TYPE, render: render };\n};\nexports.isValidElement = isValidElement;\nexports.lazy = function (ctor) {\n return {\n $$typeof: REACT_LAZY_TYPE,\n _payload: { _status: -1, _result: ctor },\n _init: lazyInitializer\n };\n};\nexports.memo = function (type, compare) {\n return {\n $$typeof: REACT_MEMO_TYPE,\n type: type,\n compare: void 0 === compare ? null : compare\n };\n};\nexports.startTransition = function (scope) {\n var prevTransition = ReactSharedInternals.T,\n currentTransition = {};\n ReactSharedInternals.T = currentTransition;\n try {\n var returnValue = scope(),\n onStartTransitionFinish = ReactSharedInternals.S;\n null !== onStartTransitionFinish &&\n onStartTransitionFinish(currentTransition, returnValue);\n \"object\" === typeof returnValue &&\n null !== returnValue &&\n \"function\" === typeof returnValue.then &&\n returnValue.then(noop, reportGlobalError);\n } catch (error) {\n reportGlobalError(error);\n } finally {\n null !== prevTransition &&\n null !== currentTransition.types &&\n (prevTransition.types = currentTransition.types),\n (ReactSharedInternals.T = prevTransition);\n }\n};\nexports.unstable_useCacheRefresh = function () {\n return ReactSharedInternals.H.useCacheRefresh();\n};\nexports.use = function (usable) {\n return ReactSharedInternals.H.use(usable);\n};\nexports.useActionState = function (action, initialState, permalink) {\n return ReactSharedInternals.H.useActionState(action, initialState, permalink);\n};\nexports.useCallback = function (callback, deps) {\n return ReactSharedInternals.H.useCallback(callback, deps);\n};\nexports.useContext = function (Context) {\n return ReactSharedInternals.H.useContext(Context);\n};\nexports.useDebugValue = function () {};\nexports.useDeferredValue = function (value, initialValue) {\n return ReactSharedInternals.H.useDeferredValue(value, initialValue);\n};\nexports.useEffect = function (create, deps) {\n return ReactSharedInternals.H.useEffect(create, deps);\n};\nexports.useEffectEvent = function (callback) {\n return ReactSharedInternals.H.useEffectEvent(callback);\n};\nexports.useId = function () {\n return ReactSharedInternals.H.useId();\n};\nexports.useImperativeHandle = function (ref, create, deps) {\n return ReactSharedInternals.H.useImperativeHandle(ref, create, deps);\n};\nexports.useInsertionEffect = function (create, deps) {\n return ReactSharedInternals.H.useInsertionEffect(create, deps);\n};\nexports.useLayoutEffect = function (create, deps) {\n return ReactSharedInternals.H.useLayoutEffect(create, deps);\n};\nexports.useMemo = function (create, deps) {\n return ReactSharedInternals.H.useMemo(create, deps);\n};\nexports.useOptimistic = function (passthrough, reducer) {\n return ReactSharedInternals.H.useOptimistic(passthrough, reducer);\n};\nexports.useReducer = function (reducer, initialArg, init) {\n return ReactSharedInternals.H.useReducer(reducer, initialArg, init);\n};\nexports.useRef = function (initialValue) {\n return ReactSharedInternals.H.useRef(initialValue);\n};\nexports.useState = function (initialState) {\n return ReactSharedInternals.H.useState(initialState);\n};\nexports.useSyncExternalStore = function (\n subscribe,\n getSnapshot,\n getServerSnapshot\n) {\n return ReactSharedInternals.H.useSyncExternalStore(\n subscribe,\n getSnapshot,\n getServerSnapshot\n );\n};\nexports.useTransition = function () {\n return ReactSharedInternals.H.useTransition();\n};\nexports.version = \"19.2.0\";\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/**\n * EventEmitter - Simple event system for the VoiceSDK\n */\nexport default class EventEmitter {\n constructor() {\n this.events = {};\n }\n \n /**\n * Add event listener\n */\n on(event, callback) {\n if (!this.events[event]) {\n this.events[event] = [];\n }\n this.events[event].push(callback);\n }\n \n /**\n * Remove event listener\n */\n off(event, callback) {\n if (!this.events[event]) return;\n \n this.events[event] = this.events[event].filter(cb => cb !== callback);\n }\n \n /**\n * Emit event\n */\n emit(event, ...args) {\n if (!this.events[event]) return;\n \n this.events[event].forEach(callback => {\n try {\n callback(...args);\n } catch (error) {\n console.error(`Error in event listener for ${event}:`, error);\n }\n });\n }\n \n /**\n * Remove all listeners for an event\n */\n removeAllListeners(event) {\n if (event) {\n delete this.events[event];\n } else {\n this.events = {};\n }\n }\n}\n","/**\n * WebSocketSingleton - Ensures only one WebSocket connection per URL exists\n */\nimport EventEmitter from './EventEmitter.js';\n\nclass WebSocketSingleton extends EventEmitter {\n constructor() {\n super();\n this.connections = new Map(); // Map of URL -> WebSocket instance\n this.connectionCounts = new Map(); // Map of URL -> number of subscribers\n this.creatingConnections = new Set(); // Set of URLs currently being created\n }\n \n /**\n * Get or create a WebSocket connection\n */\n async getConnection(url, config = {}) {\n // If connection already exists, just return it\n if (this.connections.has(url)) {\n const existingConnection = this.connections.get(url);\n this.connectionCounts.set(url, (this.connectionCounts.get(url) || 0) + 1);\n return existingConnection;\n }\n \n // Check if we're already in the process of creating a connection\n if (this.creatingConnections && this.creatingConnections.has(url)) {\n // Wait for the existing creation to complete\n return new Promise((resolve) => {\n const checkConnection = () => {\n if (this.connections.has(url)) {\n const existingConnection = this.connections.get(url);\n this.connectionCounts.set(url, (this.connectionCounts.get(url) || 0) + 1);\n resolve(existingConnection);\n } else {\n setTimeout(checkConnection, 50);\n }\n };\n checkConnection();\n });\n }\n \n // Create new connection\n this.creatingConnections.add(url);\n const connection = new WebSocket(url);\n this.connections.set(url, connection);\n this.connectionCounts.set(url, 1);\n \n // Set up event forwarding\n connection.addEventListener('open', (event) => {\n this.creatingConnections.delete(url);\n this.emit('open', event, url);\n });\n \n connection.addEventListener('close', (event) => {\n this.creatingConnections.delete(url);\n this.connections.delete(url);\n this.connectionCounts.delete(url);\n this.emit('close', event, url);\n });\n \n connection.addEventListener('error', (event) => {\n this.creatingConnections.delete(url);\n this.emit('error', event, url);\n });\n \n connection.addEventListener('message', (event) => {\n this.emit('message', event, url);\n });\n \n return connection;\n }\n \n /**\n * Release a connection (decrement subscriber count)\n */\n releaseConnection(url) {\n if (!this.connections.has(url)) {\n return;\n }\n \n const currentCount = this.connectionCounts.get(url) || 0;\n const newCount = Math.max(0, currentCount - 1);\n this.connectionCounts.set(url, newCount);\n \n // If no more subscribers, close the connection\n if (newCount === 0) {\n const connection = this.connections.get(url);\n if (connection && connection.readyState === WebSocket.OPEN) {\n connection.close(1000, 'No more subscribers');\n }\n this.connections.delete(url);\n this.connectionCounts.delete(url);\n }\n }\n \n /**\n * Force close a connection\n */\n forceClose(url) {\n if (this.connections.has(url)) {\n const connection = this.connections.get(url);\n if (connection && connection.readyState === WebSocket.OPEN) {\n connection.close(1000, 'Force close');\n }\n this.connections.delete(url);\n this.connectionCounts.delete(url);\n }\n }\n \n /**\n * Get connection status\n */\n getConnectionStatus(url) {\n if (!this.connections.has(url)) {\n return { exists: false, readyState: null, subscribers: 0 };\n }\n \n const connection = this.connections.get(url);\n return {\n exists: true,\n readyState: connection.readyState,\n subscribers: this.connectionCounts.get(url) || 0\n };\n }\n \n /**\n * Get all active connections\n */\n getAllConnections() {\n const result = {};\n for (const [url, connection] of this.connections.entries()) {\n result[url] = {\n readyState: connection.readyState,\n subscribers: this.connectionCounts.get(url) || 0\n };\n }\n return result;\n }\n \n /**\n * Clear all connections (for testing)\n */\n clearAll() {\n for (const [url, connection] of this.connections.entries()) {\n if (connection && connection.readyState === WebSocket.OPEN) {\n connection.close(1000, 'Clear all');\n }\n }\n this.connections.clear();\n this.connectionCounts.clear();\n this.creatingConnections.clear();\n }\n}\n\n// Global singleton instance\nconst webSocketSingleton = new WebSocketSingleton();\n\nexport default webSocketSingleton;\n","/**\n * WebSocketManager - Uses singleton pattern to prevent multiple connections\n */\nimport EventEmitter from './EventEmitter.js';\nimport webSocketSingleton from './WebSocketSingleton.js';\n\nexport default class WebSocketManager extends EventEmitter {\n constructor(config) {\n super();\n this.config = config;\n this.ws = null;\n this.isConnected = false;\n this.connectionId = null;\n }\n \n /**\n * Connect to WebSocket using singleton\n */\n async connect() {\n return new Promise((resolve, reject) => {\n try {\n this.connectionId = Date.now() + '_' + Math.random().toString(36).substr(2, 9);\n \n // Store resolve/reject for later use\n this.connectResolve = resolve;\n this.connectReject = reject;\n \n // Get connection from singleton\n webSocketSingleton.getConnection(this.config.websocketUrl, this.config)\n .then((connection) => {\n this.ws = connection;\n \n // Set up event listeners (this will set up handlers that can resolve the promise)\n this.setupEventListeners();\n \n // If already connected, resolve immediately\n if (connection.readyState === WebSocket.OPEN) {\n this.isConnected = true;\n this.emit('connected');\n resolve();\n this.connectResolve = null;\n this.connectReject = null;\n }\n })\n .catch((error) => {\n console.error(`🔌 WebSocketManager: Connection failed ${this.connectionId}`, error);\n reject(error);\n this.connectResolve = null;\n this.connectReject = null;\n });\n \n } catch (error) {\n console.error(`🔌 WebSocketManager: Connection error ${this.connectionId}`, error);\n reject(error);\n this.connectResolve = null;\n this.connectReject = null;\n }\n });\n }\n \n /**\n * Set up event listeners\n */\n setupEventListeners() {\n if (!this.ws) return;\n \n // Use singleton's event forwarding\n const handleOpen = (event, url) => {\n if (url === this.config.websocketUrl) {\n this.isConnected = true;\n this.emit('connected');\n \n // Resolve the connect promise if it hasn't been resolved yet\n if (this.connectResolve) {\n this.connectResolve();\n this.connectResolve = null;\n this.connectReject = null;\n }\n }\n };\n \n const handleClose = (event, url) => {\n if (url === this.config.websocketUrl) {\n this.isConnected = false;\n this.emit('disconnected', event);\n }\n };\n \n const handleError = (event, url) => {\n if (url === this.config.websocketUrl) {\n this.emit('error', event);\n \n // Reject the connect promise if it hasn't been resolved yet\n if (this.connectReject) {\n this.connectReject(event);\n this.connectResolve = null;\n this.connectReject = null;\n }\n }\n };\n \n const handleMessage = (event, url) => {\n if (url === this.config.websocketUrl) {\n this.handleMessage(event);\n }\n };\n \n // Add event listeners\n webSocketSingleton.on('open', handleOpen);\n webSocketSingleton.on('close', handleClose);\n webSocketSingleton.on('error', handleError);\n webSocketSingleton.on('message', handleMessage);\n \n // Store handlers for cleanup\n this.eventHandlers = {\n open: handleOpen,\n close: handleClose,\n error: handleError,\n message: handleMessage\n };\n }\n \n /**\n * Disconnect from WebSocket\n */\n disconnect() {\n // Remove event listeners\n if (this.eventHandlers) {\n webSocketSingleton.off('open', this.eventHandlers.open);\n webSocketSingleton.off('close', this.eventHandlers.close);\n webSocketSingleton.off('error', this.eventHandlers.error);\n webSocketSingleton.off('message', this.eventHandlers.message);\n }\n \n // Release connection from singleton\n if (this.config.websocketUrl) {\n webSocketSingleton.releaseConnection(this.config.websocketUrl);\n }\n \n this.ws = null;\n this.isConnected = false;\n }\n \n /**\n * Send JSON message\n */\n sendMessage(message) {\n if (!this.isConnected || !this.ws) {\n // Silently ignore if not connected (may happen during cleanup/disconnect)\n return;\n }\n \n try {\n this.ws.send(JSON.stringify(message));\n } catch (error) {\n // Log but don't throw - connection may have closed between check and send\n console.warn('🔌 WebSocketManager: Failed to send message:', error.message);\n }\n }\n \n /**\n * Send binary data\n */\n sendBinary(data) {\n if (!this.isConnected || !this.ws) {\n // Silently ignore if not connected (may happen during cleanup/disconnect)\n return;\n }\n \n try {\n this.ws.send(data);\n } catch (error) {\n // Log but don't throw - connection may have closed between check and send\n console.warn('🔌 WebSocketManager: Failed to send binary data:', error.message);\n }\n }\n \n /**\n * Handle incoming messages\n */\n handleMessage(event) {\n // Check if it's binary data\n if (event.data instanceof ArrayBuffer) {\n this.emit('binaryAudio', event.data);\n return;\n } else if (event.data instanceof Blob) {\n event.data.arrayBuffer().then(arrayBuffer => {\n this.emit('binaryAudio', arrayBuffer);\n }).catch(err => {\n console.error('🔌 WebSocketManager: Error converting Blob to ArrayBuffer:', err);\n });\n return;\n }\n \n // Handle JSON messages\n try {\n const message = JSON.parse(event.data);\n \n // Handle barge-in related messages\n if (message.t === 'barge_in_ack' || message.t === 'stop_sending') {\n this.emit('bargeIn', message);\n }\n \n // Handle stop playing message\n if (message.t === 'stop_playing') {\n this.emit('stopPlaying', message);\n }\n \n this.emit('message', message);\n } catch (error) {\n this.emit('error', error);\n }\n }\n \n /**\n * Get connection status\n */\n getStatus() {\n return {\n isConnected: this.isConnected,\n readyState: this.ws ? this.ws.readyState : null,\n connectionId: this.connectionId\n };\n }\n \n /**\n * Get singleton status (for debugging)\n */\n static getSingletonStatus() {\n return webSocketSingleton.getAllConnections();\n }\n \n /**\n * Clear all singleton connections (for testing)\n */\n static clearAllConnections() {\n webSocketSingleton.clearAll();\n }\n}\n","/**\n * AudioRecorder - Handles audio recording using AudioWorklet\n */\nimport EventEmitter from './EventEmitter.js';\n\nexport default class AudioRecorder extends EventEmitter {\n constructor(config) {\n super();\n this.config = config;\n this.audioContext = null;\n this.audioWorkletNode = null;\n this.mediaStream = null;\n this.isRecording = false;\n }\n \n /**\n * Get the audio processor path\n * Tries to detect from script source, falls back to config or default\n */\n getAudioProcessorPath() {\n // If explicitly configured, use it\n if (this.config.audioProcessorPath) {\n return this.config.audioProcessorPath;\n }\n \n // Try to find the script that loaded the SDK\n const scripts = document.getElementsByTagName('script');\n for (let script of scripts) {\n const src = script.src;\n // Check if this is the agent-widget.js script\n if (src && (src.includes('agent-widget.js') || src.includes('ttp-agent-sdk'))) {\n // Extract base URL and construct processor path\n try {\n const url = new URL(src);\n const basePath = src.substring(0, src.lastIndexOf('/'));\n return `${basePath}/audio-processor.js`;\n } catch (e) {\n // If URL parsing fails, try to extract path manually\n const basePath = src.substring(0, src.lastIndexOf('/'));\n return `${basePath}/audio-processor.js`;\n }\n }\n }\n \n // Fallback to CDN\n return 'https://cdn.talktopc.com/audio-processor.js';\n }\n \n /**\n * Start audio recording\n */\n async start() {\n try {\n // Get user media\n this.mediaStream = await navigator.mediaDevices.getUserMedia({\n audio: {\n sampleRate: this.config.sampleRate,\n channelCount: 1,\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true\n }\n });\n \n // Create AudioContext\n this.audioContext = new (window.AudioContext || window.webkitAudioContext)({\n sampleRate: this.config.sampleRate\n });\n \n // Resume AudioContext if suspended\n if (this.audioContext.state === 'suspended') {\n await this.audioContext.resume();\n }\n \n // Get the audio processor path\n const processorPath = this.getAudioProcessorPath();\n \n // Load AudioWorklet module\n await this.audioContext.audioWorklet.addModule(processorPath);\n \n // Create AudioWorklet node\n this.audioWorkletNode = new AudioWorkletNode(this.audioContext, 'audio-processor');\n \n // Create media stream source\n const source = this.audioContext.createMediaStreamSource(this.mediaStream);\n source.connect(this.audioWorkletNode);\n \n // Handle messages from AudioWorklet\n this.audioWorkletNode.port.onmessage = (event) => {\n const { type, data } = event.data;\n \n if (type === 'pcm_audio_data') {\n this.emit('audioData', data);\n }\n };\n \n // Enable continuous mode\n this.audioWorkletNode.port.postMessage({\n type: 'setForceContinuous',\n data: { enabled: true }\n });\n \n this.isRecording = true;\n this.emit('recordingStarted');\n \n } catch (error) {\n this.emit('error', error);\n throw error;\n }\n }\n \n /**\n * Stop audio recording\n */\n async stop() {\n if (!this.isRecording) {\n return;\n }\n \n try {\n // Flush any remaining audio data\n if (this.audioWorkletNode) {\n this.audioWorkletNode.port.postMessage({ type: 'flush' });\n await new Promise(resolve => setTimeout(resolve, 100));\n }\n \n // Disconnect and cleanup\n if (this.mediaStream) {\n this.mediaStream.getTracks().forEach(track => track.stop());\n this.mediaStream = null;\n }\n \n if (this.audioContext && this.audioContext.state !== 'closed') {\n await this.audioContext.close();\n this.audioContext = null;\n }\n \n this.audioWorkletNode = null;\n this.isRecording = false;\n this.emit('recordingStopped');\n \n } catch (error) {\n this.emit('error', error);\n throw error;\n }\n }\n \n /**\n * Get recording status\n */\n getStatus() {\n return {\n isRecording: this.isRecording,\n audioContextState: this.audioContext ? this.audioContext.state : 'closed'\n };\n }\n \n /**\n * Cleanup resources\n */\n destroy() {\n this.stop();\n }\n}\n","/**\n * AudioPlayer - Handles audio playback with queue system\n */\nimport EventEmitter from './EventEmitter.js';\n\nexport default class AudioPlayer extends EventEmitter {\n constructor(config) {\n super();\n this.config = config;\n this.audioContext = null;\n this.audioQueue = [];\n this.isPlaying = false;\n this.isProcessingQueue = false;\n this.currentSource = null;\n }\n \n /**\n * Add audio data to playback queue\n */\n playAudio(audioData) {\n try {\n const audioBlob = this.createAudioBlob(audioData);\n this.audioQueue.push(audioBlob);\n \n // Process queue if not already playing or processing\n // Also check if we have a current source - if not, we should start processing\n if (!this.isPlaying && !this.isProcessingQueue && !this.currentSource) {\n setTimeout(() => this.processQueue(), 50);\n }\n } catch (error) {\n this.emit('playbackError', error);\n }\n }\n \n /**\n * Create audio blob from ArrayBuffer\n */\n createAudioBlob(arrayBuffer) {\n const uint8Array = new Uint8Array(arrayBuffer);\n \n // Detect audio format\n if (uint8Array.length >= 4) {\n // WAV header (RIFF)\n if (uint8Array[0] === 0x52 && uint8Array[1] === 0x49 && \n uint8Array[2] === 0x46 && uint8Array[3] === 0x46) {\n return new Blob([arrayBuffer], { type: 'audio/wav' });\n }\n \n // MP3 header\n if (uint8Array[0] === 0xFF && (uint8Array[1] & 0xE0) === 0xE0) {\n return new Blob([arrayBuffer], { type: 'audio/mpeg' });\n }\n \n // OGG header\n if (uint8Array[0] === 0x4F && uint8Array[1] === 0x67 && \n uint8Array[2] === 0x67 && uint8Array[3] === 0x53) {\n return new Blob([arrayBuffer], { type: 'audio/ogg' });\n }\n }\n \n // Default to WAV format\n return new Blob([arrayBuffer], { type: 'audio/wav' });\n }\n \n /**\n * Process audio queue\n */\n async processQueue() {\n // Prevent multiple simultaneous queue processing\n // Note: isPlaying check removed to allow seamless queue processing\n if (this.isProcessingQueue || this.audioQueue.length === 0) {\n return;\n }\n \n this.isProcessingQueue = true;\n \n const audioBlob = this.audioQueue.shift();\n if (!audioBlob) {\n this.isProcessingQueue = false;\n return;\n }\n \n try {\n // Check if we were playing BEFORE async operations (decode, etc.)\n // This ensures we detect the true state before any async delays\n const wasNotPlayingBefore = !this.isPlaying && this.currentSource === null;\n \n // Create AudioContext if not exists\n if (!this.audioContext) {\n // Use configured sample rate if available, otherwise let browser choose\n const contextOptions = this.config.sampleRate ? { sampleRate: this.config.sampleRate } : {};\n this.audioContext = new (window.AudioContext || window.webkitAudioContext)(contextOptions);\n }\n \n const audioContext = this.audioContext;\n \n // Resume AudioContext if suspended\n if (audioContext.state === 'suspended') {\n await audioContext.resume();\n }\n \n // Create audio source from blob\n const arrayBuffer = await audioBlob.arrayBuffer();\n const audioBuffer = await audioContext.decodeAudioData(arrayBuffer);\n \n // Double-check state AFTER async operations - audio might have been stopped\n // If currentSource is still null and isPlaying is still false, we're truly starting\n const isTrulyStarting = wasNotPlayingBefore && !this.isPlaying && this.currentSource === null;\n \n const source = audioContext.createBufferSource();\n source.buffer = audioBuffer;\n source.connect(audioContext.destination);\n \n // Set state BEFORE emitting event to prevent race conditions\n this.currentSource = source;\n this.isPlaying = true;\n \n // Emit playbackStarted right before actually starting playback\n // This ensures the event is sent when audio actually starts playing\n // CRITICAL: This must be emitted when audio truly starts, not before\n if (isTrulyStarting) {\n this.emit('playbackStarted');\n }\n \n // Handle audio end\n source.onended = () => {\n this.currentSource = null;\n this.isProcessingQueue = false;\n \n // Process next audio in queue if there are more items\n if (this.audioQueue.length > 0) {\n // More audio to play - continue processing without emitting playbackStopped\n // Keep isPlaying = true since we'll continue playing\n // Use immediate processing for gapless playback (0ms instead of 50ms)\n setTimeout(() => this.processQueue(), 0);\n } else {\n // Queue is empty - playback has truly ended\n // Small delay to ensure smooth transition if new audio arrives quickly\n setTimeout(() => {\n // Check again if new audio arrived during the delay\n if (this.audioQueue.length === 0 && !this.currentSource) {\n this.isPlaying = false;\n this.emit('playbackStopped');\n }\n }, 100);\n }\n };\n \n // Start playback\n source.start();\n \n } catch (error) {\n this.currentSource = null;\n this.emit('playbackError', error);\n \n // Try to process next audio in queue if there are more items\n if (this.audioQueue.length > 0) {\n this.isProcessingQueue = false;\n setTimeout(() => this.processQueue(), 100);\n } else {\n // Queue is empty - playback has ended\n this.isPlaying = false;\n this.isProcessingQueue = false;\n this.emit('playbackStopped');\n }\n }\n }\n \n /**\n * Stop current playback and clear queue\n */\n stop() {\n this.stopImmediate();\n }\n \n /**\n * Stop current playback immediately and clear queue\n */\n stopImmediate() {\n const wasPlaying = this.isPlaying || this.currentSource !== null;\n \n if (this.currentSource) {\n try {\n this.currentSource.stop();\n } catch (error) {\n // Ignore errors when stopping\n }\n this.currentSource = null;\n }\n \n this.isPlaying = false;\n this.isProcessingQueue = false;\n this.audioQueue = [];\n \n // Only emit playbackStopped if audio was actually playing\n if (wasPlaying) {\n this.emit('playbackStopped');\n }\n }\n \n /**\n * Get playback status\n */\n getStatus() {\n return {\n isPlaying: this.isPlaying,\n isProcessingQueue: this.isProcessingQueue,\n queueLength: this.audioQueue.length,\n audioContextState: this.audioContext ? this.audioContext.state : 'closed'\n };\n }\n \n /**\n * Cleanup resources\n */\n destroy() {\n this.stop();\n \n if (this.audioContext && this.audioContext.state !== 'closed') {\n this.audioContext.close();\n this.audioContext = null;\n }\n }\n}\n","/**\n * VoiceSDK - Core voice interaction SDK\n * Handles WebSocket connection, audio recording, and audio playback\n */\nimport EventEmitter from './EventEmitter.js';\nimport WebSocketManager from './WebSocketManager.js';\nimport AudioRecorder from './AudioRecorder.js';\nimport AudioPlayer from './AudioPlayer.js';\n\nexport default class VoiceSDK extends EventEmitter {\n constructor(config = {}) {\n super();\n \n // Configuration\n this.config = {\n websocketUrl: config.websocketUrl || 'wss://speech.talktopc.com/ws/conv',\n agentId: config.agentId, // Optional - for direct agent access (unsecured method)\n appId: config.appId, // User's app ID for authentication (REQUIRED)\n ttpId: config.ttpId, // Optional - custom TTP ID (fallback if appId not provided)\n voice: config.voice || 'default',\n language: config.language || 'en',\n sampleRate: config.sampleRate || 16000,\n \n // NEW: Agent settings override (sent via WebSocket message)\n // Only available with signed link authentication\n agentSettingsOverride: config.agentSettingsOverride || null,\n \n ...config\n };\n \n // State\n this.isConnected = false;\n this.isRecording = false;\n this.isPlaying = false;\n this.isDestroyed = false;\n \n // Components\n this.webSocketManager = new WebSocketManager({\n ...this.config,\n autoReconnect: this.config.autoReconnect !== false // Default to true unless explicitly disabled\n });\n this.audioRecorder = new AudioRecorder(this.config);\n this.audioPlayer = new AudioPlayer(this.config);\n \n // Bind event handlers\n this.setupEventHandlers();\n }\n \n /**\n * Setup event handlers for all components\n */\n setupEventHandlers() {\n // WebSocket events\n this.webSocketManager.on('connected', () => {\n this.isConnected = true;\n this.sendHelloMessage();\n this.emit('connected');\n });\n \n this.webSocketManager.on('disconnected', (event) => {\n this.isConnected = false;\n \n // Check if disconnect was due to domain whitelist violation\n if (event && event.code === 1008 && event.reason && \n (event.reason.includes('Domain not whitelisted') || \n event.reason.includes('domain') || \n event.reason.includes('whitelist'))) {\n const domainError = new Error('DOMAIN_NOT_WHITELISTED');\n domainError.reason = event.reason;\n domainError.code = event.code;\n this.emit('domainError', domainError);\n this.emit('error', domainError);\n }\n \n // IMPORTANT: Stop recording when WebSocket disconnects (e.g., no credits, max duration exceeded)\n // This ensures microphone is released and no more audio is streamed\n if (this.isRecording) {\n this.stopRecording().catch(err => {\n console.error('VoiceSDK: Error stopping recording on disconnect:', err);\n });\n }\n \n // Pass close event details (code, reason) to consumers\n this.emit('disconnected', event);\n });\n \n this.webSocketManager.on('error', (error) => {\n this.emit('error', error);\n });\n \n this.webSocketManager.on('message', (message) => {\n // Handle greeting audio message\n if (message.t === 'greeting_audio' && message.data) {\n try {\n // Convert base64 audio data to Uint8Array\n const binaryString = atob(message.data);\n const audioData = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n audioData[i] = binaryString.charCodeAt(i);\n }\n \n this.audioPlayer.playAudio(audioData);\n this.emit('greetingStarted');\n } catch (error) {\n console.error('VoiceSDK: Error playing greeting audio:', error);\n }\n } else {\n this.emit('message', message);\n }\n });\n \n this.webSocketManager.on('binaryAudio', (audioData) => {\n this.audioPlayer.playAudio(audioData);\n });\n \n this.webSocketManager.on('bargeIn', (message) => {\n this.emit('bargeIn', message);\n });\n \n this.webSocketManager.on('stopPlaying', (message) => {\n this.emit('stopPlaying', message);\n // Stop current playback and clear queue, but keep playing new audio\n // Note: stopImmediate() will emit playbackStopped, which will send audio_stopped_playing to backend\n // This ensures backend knows when browser actually stops playing\n this.audioPlayer.stopImmediate();\n // Note: stopImmediate() clears the queue but AudioPlayer can still accept new audio via playAudio()\n });\n \n // Audio recorder events\n this.audioRecorder.on('recordingStarted', () => {\n this.isRecording = true;\n \n // Detect barge-in: if audio is playing when recording starts\n if (this.isPlaying) {\n // Stop audio playback immediately\n this.audioPlayer.stopImmediate();\n // Send barge-in message to server\n if (this.isConnected) {\n this.webSocketManager.sendMessage({\n t: 'barge_in'\n });\n }\n }\n \n this.emit('recordingStarted');\n });\n \n this.audioRecorder.on('recordingStopped', () => {\n this.isRecording = false;\n this.emit('recordingStopped');\n });\n \n this.audioRecorder.on('audioData', (audioData) => {\n if (this.isConnected) {\n this.webSocketManager.sendBinary(audioData);\n }\n });\n \n // Audio player events\n this.audioPlayer.on('playbackStarted', () => {\n this.isPlaying = true;\n this.emit('playbackStarted');\n \n // Send audio_started_playing message to server\n if (this.isConnected) {\n this.webSocketManager.sendMessage({\n t: 'audio_started_playing'\n });\n }\n });\n \n this.audioPlayer.on('playbackStopped', () => {\n this.isPlaying = false;\n this.emit('playbackStopped');\n \n // Send audio_stopped_playing message to server\n if (this.isConnected) {\n this.webSocketManager.sendMessage({\n t: 'audio_stopped_playing'\n });\n }\n });\n \n this.audioPlayer.on('playbackError', (error) => {\n this.emit('playbackError', error);\n });\n }\n \n /**\n * Connect to the voice server\n */\n async connect() {\n if (this.isDestroyed) {\n console.warn('VoiceSDK: Cannot connect - SDK is destroyed');\n return false; // Prevent connect after destroy\n }\n \n try {\n // Build WebSocket URL with query parameters if needed\n const wsUrl = this.buildWebSocketUrl();\n \n // Update the WebSocket manager with the URL that includes query parameters\n this.webSocketManager.config.websocketUrl = wsUrl;\n \n await this.webSocketManager.connect();\n return true;\n } catch (error) {\n console.error('🔌 VoiceSDK: Connection failed with error:', error);\n this.emit('error', error);\n return false;\n }\n }\n\n /**\n * Build WebSocket URL with query parameters for authentication\n */\n buildWebSocketUrl() {\n let url = this.config.websocketUrl;\n const params = new URLSearchParams();\n \n // Add agentId as query parameter if provided\n if (this.config.agentId) {\n params.append('agentId', this.config.agentId);\n }\n \n // Add appId as query parameter if provided\n if (this.config.appId) {\n params.append('appId', this.config.appId);\n }\n \n // Add other parameters if needed\n if (this.config.voice && this.config.voice !== 'default') {\n params.append('voice', this.config.voice);\n }\n \n if (this.config.language && this.config.language !== 'en') {\n params.append('language', this.config.language);\n }\n \n // Append query parameters to URL if any exist\n if (params.toString()) {\n const separator = url.includes('?') ? '&' : '?';\n url += separator + params.toString();\n }\n \n return url;\n }\n \n /**\n * Disconnect from the voice server\n */\n disconnect() {\n if (this.isDestroyed) {\n return; // Prevent disconnect after destroy\n }\n this.stopRecording();\n this.webSocketManager.disconnect();\n }\n \n /**\n * Reset reconnection attempts (useful for manual reconnection)\n */\n resetReconnectionAttempts() {\n if (this.isDestroyed) {\n return;\n }\n this.webSocketManager.resetReconnectionAttempts();\n }\n \n /**\n * Manually reconnect to the voice server\n */\n async reconnect() {\n if (this.isDestroyed) {\n return false;\n }\n \n this.disconnect();\n this.resetReconnectionAttempts();\n return await this.connect();\n }\n \n /**\n * Start voice recording and streaming\n */\n async startRecording() {\n if (!this.isConnected) {\n throw new Error('Not connected to voice server');\n }\n \n try {\n // Send start continuous mode message\n this.webSocketManager.sendMessage({\n t: 'start_continuous_mode',\n ttpId: this.generateTtpId(),\n voice: this.config.voice,\n language: this.config.language\n });\n \n // Start audio recording\n await this.audioRecorder.start();\n return true;\n } catch (error) {\n console.error('❌ VoiceSDK: Failed to start recording:', error);\n this.emit('error', error);\n return false;\n }\n }\n \n /**\n * Stop voice recording and streaming\n */\n async stopRecording() {\n if (!this.isRecording) {\n return;\n }\n \n try {\n // Send stop continuous mode message\n this.webSocketManager.sendMessage({\n t: 'stop_continuous_mode',\n ttpId: this.generateTtpId()\n });\n \n // Stop audio recording\n await this.audioRecorder.stop();\n \n // Stop audio playback immediately when stopping recording\n this.audioPlayer.stopImmediate();\n \n return true;\n } catch (error) {\n this.emit('error', error);\n return false;\n }\n }\n \n /**\n * Toggle recording state\n */\n async toggleRecording() {\n if (this.isRecording) {\n return await this.stopRecording();\n } else {\n return await this.startRecording();\n }\n }\n \n /**\n * Stop audio playback immediately (for barge-in scenarios)\n */\n stopAudioPlayback() {\n this.audioPlayer.stopImmediate();\n }\n \n /**\n * Handle barge-in (user starts speaking while audio is playing)\n */\n async handleBargeIn() {\n // Stop current audio playback immediately\n this.stopAudioPlayback();\n \n // If not already recording, start recording\n if (!this.isRecording) {\n await this.startRecording();\n }\n }\n \n /**\n * Get current connection status\n */\n getStatus() {\n return {\n isConnected: this.isConnected,\n isRecording: this.isRecording,\n isPlaying: this.isPlaying\n };\n }\n \n /**\n * Update configuration\n */\n updateConfig(newConfig) {\n this.config = { ...this.config, ...newConfig };\n }\n \n /**\n * Generate unique TTP ID\n */\n generateTtpId() {\n return 'sdk_' + Math.random().toString(36).substr(2, 9) + '_' + Date.now();\n }\n\n /**\n * Send hello message with appropriate authentication\n */\n sendHelloMessage() {\n if (!this.isConnected) {\n console.warn('VoiceSDK: Cannot send hello message - not connected');\n return;\n }\n\n const helloMessage = {\n t: \"hello\"\n };\n\n // appId is REQUIRED - no fallback to ttpId\n if (!this.config.appId) {\n const error = new Error('appId is required for connection');\n console.error('VoiceSDK: Failed to send hello message:', error);\n this.emit('error', error);\n return;\n }\n \n helloMessage.appId = this.config.appId;\n\n // NEW: Include agent settings override if provided\n // This is only accepted by the server if using signed link authentication\n if (this.config.agentSettingsOverride && \n Object.keys(this.config.agentSettingsOverride).length > 0) {\n helloMessage.agentSettingsOverride = this.config.agentSettingsOverride;\n console.log('🔧 VoiceSDK: Sending agent settings override:', \n Object.keys(this.config.agentSettingsOverride));\n }\n\n // Note: agentId is now sent as query parameter in WebSocket URL, not in hello message\n\n try {\n this.webSocketManager.sendMessage(helloMessage);\n } catch (error) {\n console.error('VoiceSDK: Failed to send hello message:', error);\n this.emit('error', error);\n }\n }\n \n /**\n * Cleanup resources\n */\n destroy() {\n if (this.isDestroyed) {\n return; // Prevent multiple destroy calls\n }\n \n // Disconnect first, before setting isDestroyed\n this.disconnect();\n \n this.isDestroyed = true;\n this.audioRecorder.destroy();\n this.audioPlayer.destroy();\n this.removeAllListeners();\n }\n}\n","// src/shared/EventEmitter.js\nclass EventEmitter {\n constructor() {\n this.events = {};\n }\n\n on(event, listener) {\n if (!this.events[event]) {\n this.events[event] = [];\n }\n this.events[event].push(listener);\n return this;\n }\n\n off(event, listenerToRemove) {\n if (!this.events[event]) return this;\n\n this.events[event] = this.events[event].filter(\n listener => listener !== listenerToRemove\n );\n return this;\n }\n\n emit(event, ...args) {\n if (!this.events[event]) return false;\n\n this.events[event].forEach(listener => {\n listener(...args);\n });\n return true;\n }\n\n once(event, listener) {\n const onceWrapper = (...args) => {\n listener(...args);\n this.off(event, onceWrapper);\n };\n return this.on(event, onceWrapper);\n }\n\n removeAllListeners(event) {\n if (event) {\n delete this.events[event];\n } else {\n this.events = {};\n }\n return this;\n }\n}\n\nexport default EventEmitter;\n\n","// src/v2/codecs/PCMCodec.js\n\n/**\n * PCM Codec - handles raw PCM audio (no compression)\n */\nclass PCMCodec {\n constructor() {\n this.name = 'PCM';\n }\n\n /**\n * Decode PCM data (it's already decoded, so return as-is)\n * @param {Uint8Array|ArrayBuffer} data - PCM audio data\n * @returns {ArrayBuffer} - PCM audio data\n */\n decode(data) {\n if (data instanceof ArrayBuffer) {\n return data;\n }\n if (data instanceof Uint8Array) {\n return data.buffer;\n }\n throw new Error('Invalid PCM data type');\n }\n\n /**\n * Encode PCM data (no encoding needed)\n * @param {ArrayBuffer} pcmData - PCM audio data\n * @returns {ArrayBuffer} - PCM audio data\n */\n encode(pcmData) {\n return pcmData;\n }\n}\n\nexport default PCMCodec;\n\n","// src/v2/codecs/PCMUCodec.js\n\n/**\n * PCMU (μ-law) Codec - handles μ-law compressed audio\n * Used for telephony (8kHz, 8-bit)\n */\nclass PCMUCodec {\n constructor() {\n this.name = 'PCMU';\n }\n\n /**\n * Decode PCMU (μ-law) to 16-bit PCM\n * @param {Uint8Array} pcmuData - μ-law encoded audio data\n * @returns {ArrayBuffer} - 16-bit PCM audio data\n */\n decode(pcmuData) {\n const input = pcmuData instanceof Uint8Array ? \n pcmuData : \n new Uint8Array(pcmuData);\n \n const pcm16 = new Int16Array(input.length);\n \n for (let i = 0; i < input.length; i++) {\n pcm16[i] = this.mulawToLinear(input[i]);\n }\n \n return pcm16.buffer;\n }\n\n /**\n * Encode 16-bit PCM to PCMU (μ-law)\n * @param {ArrayBuffer} pcm16Data - 16-bit PCM audio data\n * @returns {Uint8Array} - μ-law encoded audio data\n */\n encode(pcm16Data) {\n const pcm16 = pcm16Data instanceof Int16Array ? \n pcm16Data : \n new Int16Array(pcm16Data);\n \n const pcmu = new Uint8Array(pcm16.length);\n \n for (let i = 0; i < pcm16.length; i++) {\n pcmu[i] = this.linearToMulaw(pcm16[i]);\n }\n \n return pcmu;\n }\n\n /**\n * μ-law decompression: 8-bit → 16-bit\n * @param {number} mulaw - μ-law encoded byte\n * @returns {number} - 16-bit linear PCM sample\n */\n mulawToLinear(mulaw) {\n // μ-law decompression algorithm\n const sign = (mulaw & 0x80) ? -1 : 1;\n const exponent = (mulaw >> 4) & 0x07;\n const mantissa = mulaw & 0x0F;\n \n const step = 1 << (exponent + 3);\n const value = 132 + mantissa * step + (step >> 1) - 4;\n \n return sign * value;\n }\n\n /**\n * μ-law compression: 16-bit → 8-bit\n * @param {number} sample - 16-bit linear PCM sample\n * @returns {number} - μ-law encoded byte\n */\n linearToMulaw(sample) {\n const BIAS = 0x84;\n const CLIP = 32635;\n \n let sign = (sample >> 8) & 0x80;\n if (sign) {\n sample = -sample;\n }\n \n if (sample > CLIP) {\n sample = CLIP;\n }\n \n sample += BIAS;\n \n let exponent = 7;\n for (let expMask = 0x4000; (sample & expMask) === 0 && exponent > 0; exponent--, expMask >>= 1);\n \n let mantissa = (sample >> (exponent + 3)) & 0x0F;\n let mulaw = ~(sign | (exponent << 4) | mantissa);\n \n return mulaw & 0xFF;\n }\n}\n\nexport default PCMUCodec;\n\n","// src/v2/codecs/PCMACodec.js\n\n/**\n * PCMA (A-law) Codec - handles A-law compressed audio\n * Used for European telephony (8kHz, 8-bit)\n */\nclass PCMACodec {\n constructor() {\n this.name = 'PCMA';\n }\n\n /**\n * Decode PCMA (A-law) to 16-bit PCM\n * @param {Uint8Array} pcmaData - A-law encoded audio data\n * @returns {ArrayBuffer} - 16-bit PCM audio data\n */\n decode(pcmaData) {\n const input = pcmaData instanceof Uint8Array ? \n pcmaData : \n new Uint8Array(pcmaData);\n \n const pcm16 = new Int16Array(input.length);\n \n for (let i = 0; i < input.length; i++) {\n pcm16[i] = this.alawToLinear(input[i]);\n }\n \n return pcm16.buffer;\n }\n\n /**\n * Encode 16-bit PCM to PCMA (A-law)\n * @param {ArrayBuffer} pcm16Data - 16-bit PCM audio data\n * @returns {Uint8Array} - A-law encoded audio data\n */\n encode(pcm16Data) {\n const pcm16 = pcm16Data instanceof Int16Array ? \n pcm16Data : \n new Int16Array(pcm16Data);\n \n const pcma = new Uint8Array(pcm16.length);\n \n for (let i = 0; i < pcm16.length; i++) {\n pcma[i] = this.linearToAlaw(pcm16[i]);\n }\n \n return pcma;\n }\n\n /**\n * A-law decompression: 8-bit → 16-bit\n * @param {number} alaw - A-law encoded byte\n * @returns {number} - 16-bit linear PCM sample\n */\n alawToLinear(alaw) {\n alaw ^= 0x55; // XOR with 0x55\n \n const sign = (alaw & 0x80) ? -1 : 1;\n const exponent = (alaw >> 4) & 0x07;\n const mantissa = alaw & 0x0F;\n \n let value;\n if (exponent === 0) {\n value = (mantissa << 4) + 8;\n } else {\n value = ((mantissa << 4) + 0x108) << (exponent - 1);\n }\n \n return sign * value;\n }\n\n /**\n * A-law compression: 16-bit → 8-bit\n * @param {number} sample - 16-bit linear PCM sample\n * @returns {number} - A-law encoded byte\n */\n linearToAlaw(sample) {\n const CLIP = 32635;\n \n let sign = (sample >> 8) & 0x80;\n if (sign) {\n sample = -sample;\n }\n \n if (sample > CLIP) {\n sample = CLIP;\n }\n \n let exponent, mantissa;\n \n if (sample < 256) {\n exponent = 0;\n mantissa = sample >> 4;\n } else {\n exponent = 7;\n for (let expMask = 0x4000; (sample & expMask) === 0 && exponent > 0; exponent--, expMask >>= 1);\n mantissa = (sample >> (exponent + 3)) & 0x0F;\n }\n \n let alaw = sign | (exponent << 4) | mantissa;\n \n return alaw ^ 0x55; // XOR with 0x55\n }\n}\n\nexport default PCMACodec;\n\n","// src/v2/AudioPlayer.js\n\nimport EventEmitter from '../shared/EventEmitter.js';\n\nimport PCMCodec from './codecs/PCMCodec.js';\n\nimport PCMUCodec from './codecs/PCMUCodec.js';\n\nimport PCMACodec from './codecs/PCMACodec.js';\n\n\n\n/**\n\n * AudioPlayer v2 - Handles multiple audio formats with codec support\n\n * \n\n * Features:\n\n * - Auto-detects WAV files vs raw audio data\n\n * - Supports PCM, PCMU (μ-law), PCMA (A-law) encodings\n\n * - Handles both WAV containers and raw streams\n\n * - Queues audio for smooth playback\n\n * \n\n * Events:\n\n * - 'playbackStarted' - Audio playback begins\n\n * - 'playbackStopped' - Audio playback ends\n\n * - 'playbackError' - Error during playback\n\n */\n\nclass AudioPlayer extends EventEmitter {\n\n constructor(config = {}) {\n\n super();\n\n \n\n this.config = config;\n\n this.audioContext = null;\n\n this.audioQueue = [];\n\n this.isPlaying = false;\n\n this.isProcessingQueue = false;\n\n this.currentSource = null;\n\n this.outputFormat = null;\n\n // Audio scheduling for seamless PCM chunk playback\n\n this.nextStartTime = 0;\n\n this.scheduledBuffers = 0;\n\n // Track all scheduled AudioBufferSource nodes (for stopping on barge-in)\n this.scheduledSources = new Set();\n\n // Queue for raw PCM chunks (before processing)\n this.pcmChunkQueue = [];\n\n // Queue for prepared AudioBuffers (ready to schedule)\n this.preparedBuffer = [];\n\n this.isProcessingPcmQueue = false;\n\n this.isSchedulingFrames = false;\n\n // Minimal scheduling delay to avoid scheduling audio in the past\n // REMOVED: Lookahead buffering was causing quality degradation due to browser resampling/timing issues\n // Now we only schedule with minimal delay (20ms) just enough to avoid gaps\n this.MAX_LOOKAHEAD_SECONDS = 0.02; // 20ms minimal delay to avoid scheduling in the past\n\n \n\n // Codec registry\n\n this.codecs = {\n\n pcm: new PCMCodec(),\n\n pcmu: new PCMUCodec(),\n\n pcma: new PCMACodec()\n\n };\n\n \n\n // Supported OUTPUT formats (matching backend validation)\n\n this.SUPPORTED_CONTAINERS = ['wav', 'raw'];\n\n this.SUPPORTED_ENCODINGS = ['pcm', 'pcmu', 'pcma']; // Backend only supports these three\n\n this.SUPPORTED_SAMPLE_RATES = [8000, 16000, 22050, 24000, 44100, 48000]; // Backend supported rates\n\n this.SUPPORTED_BIT_DEPTHS = [8, 16, 24];\n\n this.SUPPORTED_CHANNELS = [1]; // Backend only supports mono\n\n \n\n console.log('🎵 AudioPlayer v2 initialized');\n\n }\n\n \n\n /**\n\n * Set the expected output audio format\n\n * @param {Object} format - Audio format specification\n\n * @param {string} format.container - 'wav' or 'raw'\n\n * @param {string} format.encoding - 'pcm', 'pcmu', 'pcma'\n\n * @param {number} format.sampleRate - Sample rate in Hz\n\n * @param {number} format.channels - Number of channels (1 or 2)\n\n * @param {number} format.bitDepth - Bit depth (8, 16, 24)\n\n */\n\n setOutputFormat(format) {\n\n if (!this.validateFormat(format)) {\n\n console.warn('⚠️ AudioPlayer: Invalid format, using defaults:', format);\n\n format = this.getDefaultFormat();\n\n }\n\n \n\n const oldSampleRate = this.outputFormat?.sampleRate;\n\n const newSampleRate = format.sampleRate;\n\n \n\n this.outputFormat = format;\n\n console.log('✅ AudioPlayer v2: Format set:', format);\n\n \n\n // CRITICAL: If AudioContext already exists and sample rate changed, recreate it\n\n if (this.audioContext && oldSampleRate && oldSampleRate !== newSampleRate) {\n\n console.warn('⚠️ AudioPlayer: Sample rate changed, recreating AudioContext');\n\n console.warn(` Old: ${oldSampleRate}Hz → New: ${newSampleRate}Hz`);\n\n \n\n // Stop any playing audio first\n\n this.stopImmediate();\n\n \n\n // Close old context\n\n if (this.audioContext.state !== 'closed') {\n\n this.audioContext.close();\n\n }\n\n this.audioContext = null;\n\n \n\n console.log('ℹ️ AudioContext will be recreated on next audio chunk with correct sample rate');\n\n }\n\n }\n\n \n\n /**\n\n * Validate audio format\n\n */\n\n validateFormat(format) {\n\n if (!format) return false;\n\n \n\n const container = format.container?.toLowerCase();\n\n const encoding = format.encoding?.toLowerCase();\n\n \n\n return (\n\n container &&\n\n encoding &&\n\n this.SUPPORTED_CONTAINERS.includes(container) &&\n\n this.SUPPORTED_ENCODINGS.includes(encoding) &&\n\n this.SUPPORTED_SAMPLE_RATES.includes(format.sampleRate) &&\n\n this.SUPPORTED_BIT_DEPTHS.includes(format.bitDepth) &&\n\n (!format.channels || this.SUPPORTED_CHANNELS.includes(format.channels))\n\n );\n\n }\n\n \n\n /**\n\n * Get default audio format\n\n */\n\n getDefaultFormat() {\n\n return {\n\n container: 'raw',\n\n encoding: 'pcm',\n\n sampleRate: 16000,\n\n channels: 1,\n\n bitDepth: 16\n\n };\n\n }\n\n \n\n /**\n\n * Play audio data\n\n * @param {ArrayBuffer|Uint8Array} binaryData - Audio data to play\n\n */\n\n playAudio(binaryData) {\n\n try {\n\n const audioBlob = this.createAudioBlob(binaryData);\n\n this.audioQueue.push(audioBlob);\n\n \n\n // Start processing queue if not already playing\n\n if (!this.isPlaying && !this.isProcessingQueue && !this.currentSource) {\n\n setTimeout(() => this.processQueue(), 50);\n\n }\n\n } catch (error) {\n\n console.error('❌ AudioPlayer v2: Playback error:', error);\n\n this.emit('playbackError', error);\n\n }\n\n }\n\n \n\n /**\n\n * Play raw PCM chunk directly with seamless scheduling\n\n * This method bypasses blob creation and directly schedules audio chunks\n\n * for lower latency and seamless playback. Chunks are queued and processed\n\n * sequentially to handle bursts of incoming data.\n\n * \n\n * @param {ArrayBuffer|Uint8Array} pcmData - Raw 16-bit PCM audio data\n\n */\n\n async playChunk(pcmData) {\n\n // Pre-process frame immediately (convert to AudioBuffer)\n const preparedFrame = this.prepareChunk(pcmData);\n\n if (preparedFrame) {\n\n // Add prepared frame to buffer\n\n this.preparedBuffer.push(preparedFrame);\n\n \n\n // Always try to schedule prepared frames\n\n // Use requestAnimationFrame to avoid blocking, but ensure scheduling happens\n\n if (!this.isSchedulingFrames) {\n\n // Schedule immediately if not already scheduling\n\n this.schedulePreparedFrames();\n\n } else {\n\n // Already scheduling, but ensure we'll schedule this new frame too\n\n // The scheduling loop will pick it up, but we can also trigger a re-check\n\n requestAnimationFrame(() => {\n\n if (this.preparedBuffer.length > 0 && !this.isSchedulingFrames) {\n\n this.schedulePreparedFrames();\n\n }\n\n });\n\n }\n\n \n\n // Also process any raw chunks in queue (for backward compatibility)\n\n if (this.pcmChunkQueue.length > 0 && !this.isProcessingPcmQueue) {\n\n this.processPcmQueue();\n\n }\n\n } else {\n\n // prepareChunk returned null - log error for debugging\n console.error('❌ AudioPlayer: playChunk failed - prepareChunk returned null');\n console.error(' pcmData length:', pcmData?.byteLength || 'undefined');\n console.error(' outputFormat:', this.outputFormat);\n console.error(' audioContext:', this.audioContext ? 'initialized' : 'not initialized');\n console.error(' audioContext state:', this.audioContext?.state || 'N/A');\n \n // Emit error event\n this.emit('playbackError', new Error('Failed to prepare PCM chunk for playback'));\n }\n\n }\n\n \n\n /**\n\n * Pre-process a PCM chunk: convert to Float32 and create AudioBuffer\n\n * This happens immediately when frame arrives, not during playback\n\n * @param {ArrayBuffer|Uint8Array} pcmData - Raw PCM data\n\n * @returns {Object|null} Prepared frame with AudioBuffer and metadata\n\n */\n\n prepareChunk(pcmData) {\n\n try {\n\n // Ensure output format is set\n if (!this.outputFormat) {\n console.error('❌ AudioPlayer: Cannot prepare chunk - outputFormat not set');\n console.error(' Call setOutputFormat() before playing audio chunks');\n return null;\n }\n\n // Ensure audio context is initialized\n\n if (!this.audioContext) {\n\n this.initializeAudioContext();\n\n }\n\n \n\n if (!this.audioContext) {\n\n console.error('❌ AudioPlayer: Cannot prepare chunk - AudioContext not available');\n\n return null;\n\n }\n\n \n\n // Ensure even byte count for 16-bit PCM\n\n let processedData = pcmData;\n\n if (pcmData.byteLength % 2 !== 0) {\n\n console.warn('⚠️ Odd PCM chunk size, padding:', pcmData.byteLength);\n\n const padded = new Uint8Array(pcmData.byteLength + 1);\n\n padded.set(new Uint8Array(pcmData), 0);\n\n padded[pcmData.byteLength] = 0; // Silence padding\n\n processedData = padded.buffer;\n\n }\n\n \n\n // Convert Int16 PCM to Float32 (pre-processing)\n\n const int16Array = new Int16Array(processedData);\n\n const float32Array = new Float32Array(int16Array.length);\n\n const NORMALIZATION = 1.0 / 32768.0;\n\n const length = int16Array.length;\n\n for (let i = 0; i < length; i++) {\n\n float32Array[i] = int16Array[i] * NORMALIZATION;\n\n }\n\n \n\n // Create audio buffer with the ACTUAL sample rate of the audio data\n\n const audioDataSampleRate = this.outputFormat?.sampleRate || this.audioContext.sampleRate;\n\n const contextSampleRate = this.audioContext.sampleRate;\n\n \n\n const audioBuffer = this.audioContext.createBuffer(\n\n 1, // mono\n\n float32Array.length,\n\n audioDataSampleRate\n\n );\n\n \n\n audioBuffer.getChannelData(0).set(float32Array);\n\n // Calculate duration (handle browser resampling)\n\n const chunkDuration = audioBuffer.duration;\n\n const sampleCount = float32Array.length;\n\n let actualDuration = chunkDuration;\n\n \n\n if (contextSampleRate !== audioDataSampleRate) {\n\n actualDuration = sampleCount / contextSampleRate;\n\n }\n\n \n\n // Return prepared frame\n\n return {\n\n buffer: audioBuffer,\n\n duration: actualDuration,\n\n sampleRate: audioDataSampleRate,\n\n contextSampleRate: contextSampleRate\n\n };\n\n \n\n } catch (error) {\n\n console.error('❌ AudioPlayer: Error preparing chunk:', error);\n\n return null;\n\n }\n\n }\n\n /**\n * Apply fade-out to audio buffer (stub method to prevent errors)\n * This method is called by some code paths but doesn't need to do anything\n * @param {AudioBuffer} audioBuffer - Audio buffer to fade\n * @returns {AudioBuffer} - Same audio buffer (no modification)\n */\n applyFadeOut(audioBuffer) {\n // Stub method - fade-out is not needed for streaming audio\n // This method exists to prevent \"is not a function\" errors\n return audioBuffer;\n }\n\n \n\n /**\n\n * Schedule prepared frames ahead of time for smooth playback\n\n * This runs continuously to keep frames scheduled ahead\n\n */\n\n async schedulePreparedFrames() {\n\n if (this.isSchedulingFrames) {\n\n return;\n\n }\n\n \n\n this.isSchedulingFrames = true;\n \n // REMOVED: Dynamic lookahead calculation\n // Now we only schedule 1-2 frames ahead to avoid gaps, but not far in advance\n // This preserves audio quality by avoiding browser resampling/timing issues\n let targetLookaheadFrames = 1; // Schedule only 1 frame ahead (just enough to avoid gaps)\n\n \n\n try {\n\n // Initialize audio context if needed\n\n if (!this.audioContext) {\n\n this.initializeAudioContext();\n\n }\n\n \n\n // Resume if suspended\n\n if (this.audioContext.state === 'suspended') {\n\n await this.audioContext.resume();\n\n }\n\n \n\n // Schedule frames up to target lookahead (ensures smooth playback)\n // For small frames (200ms), we need more frames scheduled ahead\n // For large frames (1200ms), fewer frames are needed\n let scheduledCount = 0;\n while (this.preparedBuffer.length > 0 && scheduledCount < targetLookaheadFrames) {\n\n // Get next prepared frame\n\n const preparedFrame = this.preparedBuffer.shift();\n\n if (!preparedFrame) {\n\n break;\n\n }\n\n \n\n // Create source and schedule playback\n\n const source = this.audioContext.createBufferSource();\n\n source.buffer = preparedFrame.buffer;\n\n source.connect(this.audioContext.destination);\n\n \n\n // Track this source so we can stop it on barge-in\n\n this.scheduledSources.add(source);\n\n \n\n // Calculate when to start this chunk\n\n const currentTime = this.audioContext.currentTime;\n\n \n\n // Ensure we don't schedule in the past, but NEVER decrease nextStartTime\n // This prevents overlapping audio by maintaining sequential ordering\n if (this.scheduledBuffers === 0) {\n\n // First chunk: start with minimal delay just enough to avoid scheduling in the past\n if (this.nextStartTime < currentTime) {\n\n this.nextStartTime = currentTime + this.MAX_LOOKAHEAD_SECONDS;\n\n }\n\n console.log('🎵 Starting playback with minimal delay:', this.nextStartTime);\n\n } else {\n\n // Subsequent chunks: ensure nextStartTime is not in the past, but never decrease it\n // This maintains sequential playback - each chunk starts after the previous one\n const minStartTime = currentTime + this.MAX_LOOKAHEAD_SECONDS;\n\n this.nextStartTime = Math.max(this.nextStartTime, minStartTime);\n\n }\n\n \n\n // Schedule this chunk to start at nextStartTime\n\n source.start(this.nextStartTime);\n\n \n\n // Calculate when the next chunk should start (seamless, no gaps)\n // This ensures sequential playback - each chunk starts after the previous one\n\n this.nextStartTime += preparedFrame.duration;\n\n \n\n // Round to prevent floating point accumulation errors\n\n this.nextStartTime = Math.round(this.nextStartTime * 1000000) / 1000000;\n\n \n\n // Log timing for first few chunks (debugging)\n\n if (this.scheduledBuffers < 3) {\n\n const startTime = this.nextStartTime - preparedFrame.duration;\n\n console.log(`🎵 AudioPlayer: Scheduled prepared frame ${this.scheduledBuffers + 1} at ${startTime.toFixed(4)}s, next at ${this.nextStartTime.toFixed(4)}s`);\n\n console.log(` Duration: ${preparedFrame.duration.toFixed(4)}s (${(preparedFrame.duration * 1000).toFixed(2)}ms), Scheduled ahead: ${this.scheduledBuffers}`);\n\n }\n\n \n\n this.scheduledBuffers++;\n scheduledCount++; // Track how many we've scheduled in this batch\n\n \n\n // Track when this buffer finishes (for cleanup only)\n\n source.onended = () => {\n\n // Remove from tracked sources\n\n this.scheduledSources.delete(source);\n\n \n\n this.scheduledBuffers--;\n\n \n\n // If no more scheduled buffers and no prepared frames, playback is complete\n\n if (this.scheduledBuffers === 0 && this.preparedBuffer.length === 0 && this.pcmChunkQueue.length === 0) {\n\n this.isPlaying = false;\n\n this.isSchedulingFrames = false;\n\n console.log('🛑 AudioPlayer: Emitting playbackStopped event (all buffers finished)');\n\n this.emit('playbackStopped');\n\n } else if (this.preparedBuffer.length > 0) {\n\n // More frames available, schedule them immediately\n\n // Use setTimeout to avoid blocking, but schedule quickly\n\n setTimeout(() => {\n\n if (this.preparedBuffer.length > 0 && !this.isSchedulingFrames) {\n\n this.schedulePreparedFrames();\n\n }\n\n }, 0);\n\n }\n\n };\n\n \n\n if (!this.isPlaying) {\n\n this.isPlaying = true;\n\n console.log('🎵 AudioPlayer: Emitting playbackStarted event');\n\n this.emit('playbackStarted');\n\n }\n\n }\n\n \n\n // All prepared frames scheduled, reset flag\n\n this.isSchedulingFrames = false;\n\n \n\n // If more frames arrive while we were processing, schedule them now\n\n // Use requestAnimationFrame for smooth scheduling without blocking\n\n if (this.preparedBuffer.length > 0) {\n\n // More frames arrived, schedule them immediately\n\n requestAnimationFrame(() => {\n\n if (this.preparedBuffer.length > 0 && !this.isSchedulingFrames) {\n\n this.schedulePreparedFrames();\n\n }\n\n });\n\n } else if (this.scheduledBuffers > 0) {\n\n // Still have scheduled buffers playing, but no more prepared frames\n\n // Set up a periodic check to schedule new frames as they arrive\n\n // This ensures continuous playback even if frames arrive slowly\n\n setTimeout(() => {\n\n if (this.preparedBuffer.length > 0 && !this.isSchedulingFrames && this.scheduledBuffers > 0) {\n\n this.schedulePreparedFrames();\n\n }\n\n }, 25); // Check every 25ms for new frames (reduced from 50ms for smaller frame durations)\n\n }\n\n \n\n } catch (error) {\n\n console.error('❌ AudioPlayer v2: Error scheduling frames:', error);\n\n this.emit('playbackError', error);\n\n this.isSchedulingFrames = false;\n\n }\n\n }\n\n \n\n /**\n\n * Process PCM chunk queue with seamless scheduling\n\n * Process one chunk at a time to ensure proper timing\n\n */\n\n async processPcmQueue() {\n\n if (this.isProcessingPcmQueue) {\n\n return;\n\n }\n\n this.isProcessingPcmQueue = true;\n\n \n\n try {\n\n // Initialize audio context if needed\n\n if (!this.audioContext) {\n\n this.initializeAudioContext();\n\n }\n\n \n\n // Resume if suspended\n\n if (this.audioContext.state === 'suspended') {\n\n await this.audioContext.resume();\n\n }\n\n // Process ALL queued chunks immediately with precise scheduling\n // This eliminates overhead from onended callbacks and setTimeout delays\n // The browser's AudioContext handles seamless playback automatically\n while (this.pcmChunkQueue.length > 0) {\n const pcmData = this.pcmChunkQueue.shift();\n\n if (!pcmData) {\n continue;\n }\n\n // Ensure even byte count for 16-bit PCM\n let processedData = pcmData;\n\n if (pcmData.byteLength % 2 !== 0) {\n console.warn('⚠️ Odd PCM chunk size, padding:', pcmData.byteLength);\n const padded = new Uint8Array(pcmData.byteLength + 1);\n padded.set(new Uint8Array(pcmData), 0);\n padded[pcmData.byteLength] = 0; // Silence padding\n processedData = padded.buffer;\n }\n\n // Convert Int16 PCM to Float32\n const int16Array = new Int16Array(processedData);\n const float32Array = new Float32Array(int16Array.length);\n const NORMALIZATION = 1.0 / 32768.0;\n const length = int16Array.length;\n for (let i = 0; i < length; i++) {\n float32Array[i] = int16Array[i] * NORMALIZATION;\n }\n\n // Create audio buffer with the ACTUAL sample rate of the audio data\n const audioDataSampleRate = this.outputFormat?.sampleRate || this.audioContext.sampleRate;\n const contextSampleRate = this.audioContext.sampleRate;\n \n if (!this.outputFormat?.sampleRate) {\n console.warn('⚠️ AudioPlayer: outputFormat.sampleRate not set! Using AudioContext sample rate:', contextSampleRate);\n } else if (this.scheduledBuffers < 3) {\n console.log(`🎵 AudioPlayer: Creating buffer at ${audioDataSampleRate}Hz (AudioContext: ${contextSampleRate}Hz)`);\n }\n \n const audioBuffer = this.audioContext.createBuffer(\n 1, // mono\n float32Array.length,\n audioDataSampleRate\n );\n\n audioBuffer.getChannelData(0).set(float32Array);\n\n // Schedule playback with seamless timing\n const source = this.audioContext.createBufferSource();\n source.buffer = audioBuffer;\n source.connect(this.audioContext.destination);\n\n // Calculate when to start this chunk\n const currentTime = this.audioContext.currentTime;\n\n // If this is the first chunk or we've fallen behind, start immediately\n if (this.nextStartTime < currentTime) {\n this.nextStartTime = currentTime;\n if (this.scheduledBuffers === 0) {\n console.log('🎵 Starting playback at current time:', currentTime);\n }\n }\n\n // Calculate frame duration - handle browser resampling correctly\n const chunkDuration = audioBuffer.duration;\n const sampleCount = float32Array.length;\n let actualDuration = chunkDuration;\n \n if (contextSampleRate !== audioDataSampleRate) {\n actualDuration = sampleCount / contextSampleRate;\n \n if (this.scheduledBuffers < 3) {\n console.log(`🔄 Resampling detected: ${audioDataSampleRate}Hz → ${contextSampleRate}Hz`);\n console.log(` Buffer duration: ${chunkDuration.toFixed(4)}s, Calculated: ${actualDuration.toFixed(4)}s`);\n }\n }\n \n // Schedule this chunk to start at nextStartTime\n source.start(this.nextStartTime);\n \n // Calculate when the next chunk should start (seamless, no gaps)\n this.nextStartTime += actualDuration;\n \n // Round to prevent floating point accumulation errors\n this.nextStartTime = Math.round(this.nextStartTime * 1000000) / 1000000;\n \n // Log timing for first few chunks (debugging)\n if (this.scheduledBuffers < 3) {\n const startTime = this.nextStartTime - actualDuration;\n console.log(`🎵 AudioPlayer: Scheduled chunk ${this.scheduledBuffers + 1} at ${startTime.toFixed(4)}s, next at ${this.nextStartTime.toFixed(4)}s`);\n console.log(` Duration: ${actualDuration.toFixed(4)}s (${(actualDuration * 1000).toFixed(2)}ms)`);\n }\n\n this.scheduledBuffers++;\n\n // Track when this buffer finishes (for cleanup only, not for scheduling)\n source.onended = () => {\n this.scheduledBuffers--;\n\n // If no more scheduled buffers and queue is empty, playback is complete\n if (this.scheduledBuffers === 0 && this.pcmChunkQueue.length === 0) {\n this.isPlaying = false;\n this.isProcessingPcmQueue = false;\n this.emit('playbackStopped');\n }\n };\n\n if (!this.isPlaying) {\n this.isPlaying = true;\n this.emit('playbackStarted');\n }\n } // end while loop\n\n // All chunks scheduled, reset processing flag\n this.isProcessingPcmQueue = false;\n\n } catch (error) {\n\n console.error('❌ AudioPlayer v2: Error playing chunk:', error);\n\n this.emit('playbackError', error);\n\n this.isProcessingPcmQueue = false;\n\n }\n\n }\n\n \n\n /**\n\n * Create audio blob from binary data\n\n * Detects format and converts to browser-playable WAV\n\n */\n\n createAudioBlob(rawData) {\n\n const bytes = new Uint8Array(rawData);\n\n \n\n console.log(`🎵 AudioPlayer: Processing ${bytes.length} bytes`);\n\n console.log(`🎵 AudioPlayer: Negotiated format:`, this.outputFormat);\n\n \n\n // 1. Check negotiated format first\n // If format says \"raw\", trust that and don't auto-detect WAV\n // Only auto-detect if format is unknown or explicitly says \"wav\"\n \n const isNegotiatedWav = this.outputFormat && \n this.outputFormat.container && \n this.outputFormat.container.toLowerCase() === 'wav';\n \n const isNegotiatedRaw = this.outputFormat && \n this.outputFormat.container && \n this.outputFormat.container.toLowerCase() === 'raw';\n\n // 2. Check if data looks like WAV (for auto-detection when format is unknown or wav)\n const looksLikeWav = this.isWavFile(bytes);\n \n if (looksLikeWav) {\n console.log('🎵 AudioPlayer: Data has WAV header (RIFF)');\n }\n\n // 3. Decision logic:\n // Priority: Negotiated format > Auto-detection\n // BUT: If backend sends WAV when raw was negotiated, process as WAV (with warning)\n // to avoid playback failures\n \n if (isNegotiatedRaw && looksLikeWav) {\n // Backend negotiated \"raw\" but sent WAV - backend is ignoring format request\n console.error('❌ AudioPlayer: CRITICAL MISMATCH!');\n console.error(' Negotiated format: RAW');\n console.error(' Actual data: WAV (RIFF header detected)');\n console.error(' Backend is ignoring format request and sending WAV anyway.');\n console.warn('⚠️ AudioPlayer: Processing as WAV to avoid playback failure, but UI configuration was bypassed.');\n // Process as WAV since that's what we actually received\n return this.handleWavFile(bytes);\n }\n \n if (isNegotiatedRaw && !looksLikeWav) {\n // Negotiated raw and data looks raw - process as raw\n console.log('🎵 AudioPlayer: Processing as RAW data (as negotiated)');\n // Fall through to handleRawData\n } else if (isNegotiatedWav && looksLikeWav) {\n // Negotiated WAV and data is WAV - perfect match\n console.log('✅ AudioPlayer: Processing as WAV file (matches negotiation)');\n return this.handleWavFile(bytes);\n } else if (isNegotiatedWav && !looksLikeWav) {\n // Negotiated WAV but data doesn't look like WAV - warn but try to process as WAV\n console.warn('⚠️ AudioPlayer: Negotiated WAV but data lacks WAV header. Attempting WAV processing anyway.');\n return this.handleWavFile(bytes);\n } else if (!this.outputFormat && looksLikeWav) {\n // No format negotiated, but data looks like WAV - auto-detect\n console.log('🎵 AudioPlayer: No format negotiated, auto-detecting WAV');\n return this.handleWavFile(bytes);\n } else if (!this.outputFormat && !looksLikeWav) {\n // No format negotiated, data doesn't look like WAV - use defaults\n console.warn('⚠️ AudioPlayer: No format negotiated and data not WAV, using defaults');\n this.outputFormat = this.getDefaultFormat();\n }\n \n // 4. Handle raw data based on negotiated format (if we get here)\n\n if (!this.outputFormat) {\n\n console.warn('⚠️ AudioPlayer: No format set, using defaults');\n\n this.outputFormat = this.getDefaultFormat();\n\n }\n\n \n\n console.log('🎵 AudioPlayer: Processing as RAW data with encoding:', this.outputFormat.encoding);\n\n return this.handleRawData(bytes);\n\n }\n\n \n\n /**\n\n * Check if data is a WAV file\n\n */\n\n isWavFile(bytes) {\n\n return bytes.length >= 44 &&\n\n bytes[0] === 0x52 && bytes[1] === 0x49 && // \"RI\"\n\n bytes[2] === 0x46 && bytes[3] === 0x46; // \"FF\"\n\n }\n\n \n\n /**\n\n * Handle WAV file data\n\n */\n\n handleWavFile(bytes) {\n\n const wavInfo = this.parseWavHeader(bytes);\n\n \n\n console.log('🎵 WAV file detected:', {\n\n format: wavInfo.audioFormat,\n\n encoding: this.getEncodingName(wavInfo.audioFormat),\n\n sampleRate: wavInfo.sampleRate,\n\n channels: wavInfo.channels,\n\n bitDepth: wavInfo.bitsPerSample\n\n });\n\n \n\n // PCM WAV (format code 1) - browser can play directly\n\n if (wavInfo.audioFormat === 1) {\n\n console.log('✅ PCM WAV - using directly');\n\n return new Blob([bytes], { type: 'audio/wav' });\n\n }\n\n \n\n // Non-PCM WAV - need to convert to PCM\n\n const codec = this.getCodecForWavFormat(wavInfo.audioFormat);\n\n if (!codec) {\n\n throw new Error(`Unsupported WAV format code: ${wavInfo.audioFormat}`);\n\n }\n\n \n\n console.log('🔄 Non-PCM WAV - converting to PCM WAV');\n\n \n\n // Extract raw audio data (skip 44-byte header)\n\n const rawData = bytes.slice(44);\n\n \n\n // Decode to 16-bit PCM\n\n const pcm16 = codec.decode(rawData);\n\n \n\n // Wrap in new PCM WAV header\n\n const wavHeader = this.createWavHeader(\n\n pcm16.byteLength,\n\n wavInfo.sampleRate,\n\n wavInfo.channels,\n\n 16 // Always decode to 16-bit PCM for browser\n\n );\n\n \n\n return new Blob([wavHeader, pcm16], { type: 'audio/wav' });\n\n }\n\n \n\n /**\n\n * Handle raw audio data (no WAV header)\n\n */\n\n handleRawData(bytes) {\n\n const encoding = this.outputFormat.encoding.toLowerCase();\n\n const codec = this.getCodec(encoding);\n\n \n\n if (!codec) {\n\n throw new Error(`No codec found for encoding: ${encoding}`);\n\n }\n\n \n\n console.log(`🎵 AudioPlayer: Decoding ${encoding.toUpperCase()} to PCM`);\n\n console.log(`🎵 AudioPlayer: Input format - bitDepth: ${this.outputFormat.bitDepth}, sampleRate: ${this.outputFormat.sampleRate}`);\n\n \n\n // Handle PCM data - use native bit depth when possible\n\n let pcmData;\n\n let outputBitDepth;\n\n \n\n if (encoding === 'pcm') {\n\n // Handle PCM data based on bit depth\n const bitDepth = this.outputFormat.bitDepth || 16;\n\n // Check if data length matches expected bit depth\n const expectedBytesPerSample = bitDepth / 8;\n const remainder = bytes.length % expectedBytesPerSample;\n \n if (bitDepth === 24) {\n // Convert 24-bit PCM to 16-bit PCM for browser compatibility\n // TODO: Implement proper 24-bit handling if needed\n console.warn(`⚠️ AudioPlayer: Format says 24-bit PCM, but browser support is limited.`);\n console.warn(` Treating as 16-bit PCM. If audio sounds wrong, backend should send 16-bit instead.`);\n pcmData = this.convert24BitTo16Bit(bytes);\n outputBitDepth = 16;\n } else if (bitDepth === 8) {\n // Convert 8-bit PCM to 16-bit PCM\n console.log(`🔄 AudioPlayer: Converting 8-bit PCM to 16-bit PCM`);\n pcmData = this.convert8BitTo16Bit(bytes);\n outputBitDepth = 16;\n } else {\n // Use PCM data as-is for 16-bit (most common)\n pcmData = bytes.buffer;\n outputBitDepth = bitDepth;\n console.log(`✅ AudioPlayer: Using native ${bitDepth}-bit PCM (no conversion needed)`);\n }\n\n \n\n } else {\n\n // Non-PCM encoding - decode to 16-bit PCM (codecs output 16-bit)\n\n pcmData = codec.decode(bytes);\n\n outputBitDepth = 16;\n\n console.log(`🔄 AudioPlayer: Decoded ${encoding.toUpperCase()} to 16-bit PCM`);\n\n }\n\n \n\n // Wrap in PCM WAV header with correct bit depth\n\n // Modern browsers support 8-bit, 16-bit, and 24-bit WAV files\n\n const wavHeader = this.createWavHeader(\n\n pcmData.byteLength,\n\n this.outputFormat.sampleRate,\n\n this.outputFormat.channels,\n\n outputBitDepth // Use native bit depth\n\n );\n\n \n\n return new Blob([wavHeader, pcmData], { type: 'audio/wav' });\n\n }\n\n \n\n /**\n\n * Convert 24-bit PCM to 16-bit PCM\n\n * @param {Uint8Array} bytes - 24-bit PCM data (3 bytes per sample)\n\n * @returns {ArrayBuffer} - 16-bit PCM data (2 bytes per sample)\n\n */\n\n convert24BitTo16Bit(bytes) {\n\n const samples = Math.floor(bytes.length / 3);\n\n const pcm16 = new Int16Array(samples);\n\n \n\n for (let i = 0; i < samples; i++) {\n\n // Read 24-bit signed integer (little-endian: LSB first)\n // 24-bit PCM: 3 bytes per sample, signed integer\n const byte0 = bytes[i * 3]; // LSB (bits 0-7)\n const byte1 = bytes[i * 3 + 1]; // Middle (bits 8-15)\n const byte2 = bytes[i * 3 + 2]; // MSB (bits 16-23, sign bit is bit 23)\n\n \n\n // Combine bytes to 24-bit value (little-endian)\n // Use bitwise OR to combine, then handle sign extension\n let value24 = byte0 | (byte1 << 8) | ((byte2 & 0xFF) << 16);\n\n \n\n // Convert unsigned 24-bit to signed 32-bit integer\n // If sign bit (bit 23 = byte2 bit 7) is set, sign extend\n if (byte2 & 0x80) {\n\n // Negative: sign extend to 32-bit signed integer\n value24 = value24 | 0xFF000000;\n\n }\n\n \n\n // Convert signed 32-bit integer to signed 16-bit\n // Scale down by dividing by 256 (equivalent to right shift by 8)\n // 24-bit range: -8388608 to 8388607\n // 16-bit range: -32768 to 32767\n // Clamp to prevent overflow\n pcm16[i] = Math.max(-32768, Math.min(32767, Math.round(value24 / 256)));\n\n }\n\n \n\n return pcm16.buffer;\n\n }\n\n \n\n /**\n\n * Convert 8-bit PCM to 16-bit PCM\n\n * @param {Uint8Array} bytes - 8-bit PCM data (1 byte per sample, unsigned 0-255)\n\n * @returns {ArrayBuffer} - 16-bit PCM data (2 bytes per sample)\n\n */\n\n convert8BitTo16Bit(bytes) {\n\n const samples = bytes.length;\n\n const pcm16 = new Int16Array(samples);\n\n \n\n for (let i = 0; i < samples; i++) {\n\n // 8-bit unsigned (0-255) -> 16-bit signed (-32768 to 32767)\n\n // Convert: (value - 128) * 256\n\n const value8 = bytes[i];\n\n pcm16[i] = (value8 - 128) * 256;\n\n }\n\n \n\n return pcm16.buffer;\n\n }\n\n \n\n /**\n\n * Get codec for encoding name\n\n */\n\n getCodec(encoding) {\n\n // Normalize encoding names\n\n const normalized = {\n\n 'pcm': 'pcm',\n\n 'linear': 'pcm',\n\n 'l16': 'pcm',\n\n 'pcmu': 'pcmu',\n\n 'ulaw': 'pcmu',\n\n 'mulaw': 'pcmu',\n\n 'g711u': 'pcmu',\n\n 'pcma': 'pcma',\n\n 'alaw': 'pcma',\n\n 'g711a': 'pcma'\n\n }[encoding.toLowerCase()];\n\n \n\n return this.codecs[normalized];\n\n }\n\n \n\n /**\n\n * Get codec for WAV format code\n\n */\n\n getCodecForWavFormat(audioFormat) {\n\n switch (audioFormat) {\n\n case 1: return this.codecs.pcm; // PCM\n\n case 6: return this.codecs.pcma; // A-law\n\n case 7: return this.codecs.pcmu; // μ-law\n\n default: return null;\n\n }\n\n }\n\n \n\n /**\n\n * Get human-readable encoding name from WAV format code\n\n */\n\n getEncodingName(audioFormat) {\n\n switch (audioFormat) {\n\n case 1: return 'PCM';\n\n case 6: return 'A-law';\n\n case 7: return 'μ-law';\n\n default: return `Unknown (${audioFormat})`;\n\n }\n\n }\n\n \n\n /**\n\n * Parse WAV file header\n\n */\n\n parseWavHeader(bytes) {\n\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n\n \n\n return {\n\n audioFormat: view.getUint16(20, true), // 1=PCM, 6=A-law, 7=μ-law\n\n channels: view.getUint16(22, true),\n\n sampleRate: view.getUint32(24, true),\n\n byteRate: view.getUint32(28, true),\n\n blockAlign: view.getUint16(32, true),\n\n bitsPerSample: view.getUint16(34, true)\n\n };\n\n }\n\n \n\n /**\n\n * Create WAV header\n\n */\n\n createWavHeader(dataLength, sampleRate, numChannels, bitsPerSample) {\n\n const header = new ArrayBuffer(44);\n\n const view = new DataView(header);\n\n \n\n // RIFF header\n\n view.setUint32(0, 0x52494646, false); // \"RIFF\"\n\n view.setUint32(4, 36 + dataLength, true);\n\n view.setUint32(8, 0x57415645, false); // \"WAVE\"\n\n \n\n // fmt chunk\n\n view.setUint32(12, 0x666D7420, false); // \"fmt \"\n\n view.setUint32(16, 16, true); // Subchunk size\n\n view.setUint16(20, 1, true); // Audio format (1 = PCM)\n\n view.setUint16(22, numChannels, true);\n\n view.setUint32(24, sampleRate, true);\n\n view.setUint32(28, sampleRate * numChannels * bitsPerSample / 8, true); // Byte rate\n\n view.setUint16(32, numChannels * bitsPerSample / 8, true); // Block align\n\n view.setUint16(34, bitsPerSample, true);\n\n \n\n // data chunk\n\n view.setUint32(36, 0x64617461, false); // \"data\"\n\n view.setUint32(40, dataLength, true);\n\n \n\n return header;\n\n }\n\n \n\n /**\n /**\n *\n * Initialize audio context with correct sample rate\n *\n */\n initializeAudioContext() {\n // Use negotiated sample rate, but prefer 48kHz to avoid browser resampling\n // Most browsers default to 48kHz, so requesting it avoids resampling overhead\n let desiredSampleRate = this.outputFormat?.sampleRate || 48000;\n \n // If backend sends non-standard rate (like 22050Hz), check if browser supports it\n // If not, prefer 48kHz to avoid resampling issues\n if (desiredSampleRate !== 48000 && desiredSampleRate !== 44100) {\n // For non-standard rates, try to use browser's native rate to avoid resampling\n // This prevents tiny cuts caused by browser resampling\n console.log(`ℹ️ AudioPlayer: Backend requested ${desiredSampleRate}Hz, but browser may resample to 48kHz`);\n console.log(` Consider requesting 48kHz from backend to avoid resampling and improve quality`);\n }\n \n // Check if AudioContext exists and if it matches the desired sample rate\n if (this.audioContext) {\n const currentSampleRate = this.audioContext.sampleRate;\n // If sample rate differs significantly, recreate the AudioContext\n if (Math.abs(currentSampleRate - desiredSampleRate) > 100) {\n console.warn(`⚠️ AudioPlayer: AudioContext sample rate (${currentSampleRate}Hz) doesn't match format (${desiredSampleRate}Hz), recreating...`);\n this.stopImmediate();\n if (this.audioContext.state !== 'closed') {\n this.audioContext.close();\n }\n this.audioContext = null;\n } else {\n // Sample rate matches (or close enough), no need to recreate\n return;\n }\n }\n\n console.log(`🎵 AudioPlayer: Creating AudioContext at ${desiredSampleRate}Hz (from outputFormat: ${this.outputFormat?.sampleRate || 'not set'})`);\n \n try {\n // Try to create with specific sample rate\n this.audioContext = new (window.AudioContext || window.webkitAudioContext)({\n sampleRate: desiredSampleRate,\n latencyHint: 'playback' // ✅ Better for streaming audio - prioritizes smooth playback over low latency\n });\n \n console.log(`✅ AudioContext created at ${this.audioContext.sampleRate}Hz (requested: ${desiredSampleRate}Hz)`);\n \n // ❌ CRITICAL: If browser can't create requested sample rate, we have a problem\n if (Math.abs(this.audioContext.sampleRate - desiredSampleRate) > 100) {\n console.error(`❌ CRITICAL: Browser sample rate mismatch!`);\n console.error(` Requested: ${desiredSampleRate}Hz`);\n console.error(` Got: ${this.audioContext.sampleRate}Hz`);\n console.error(` This WILL cause audio distortion/noise!`);\n console.error(` Solution: Backend should send ${this.audioContext.sampleRate}Hz audio instead`);\n } else if (this.audioContext.sampleRate !== desiredSampleRate) {\n console.warn(`⚠️ Browser adjusted sample rate: ${desiredSampleRate}Hz → ${this.audioContext.sampleRate}Hz`);\n console.warn(` Browser will automatically resample audio.`);\n }\n } catch (error) {\n // Fallback to default if browser doesn't support custom sample rate\n console.error(`❌ Failed to create AudioContext:`, error);\n this.audioContext = new (window.AudioContext || window.webkitAudioContext)();\n console.log(`ℹ️ Using browser default: ${this.audioContext.sampleRate}Hz`);\n }\n }\n\n \n\n /**\n\n *\n\n * Process audio queue\n\n *\n\n */\n\n async processQueue() {\n\n if (this.isProcessingQueue || this.audioQueue.length === 0) {\n\n return;\n\n }\n\n \n\n this.isProcessingQueue = true;\n\n const audioBlob = this.audioQueue.shift();\n\n \n\n if (!audioBlob) {\n\n this.isProcessingQueue = false;\n\n return;\n\n }\n\n \n\n try {\n\n const wasFirstPlay = !this.isPlaying && this.currentSource === null;\n\n \n\n // Initialize audio context if needed\n\n if (!this.audioContext) {\n\n this.initializeAudioContext();\n\n }\n\n \n\n // Resume if suspended\n\n if (this.audioContext.state === 'suspended') {\n\n await this.audioContext.resume();\n\n }\n\n \n\n // Decode audio\n\n const arrayBuffer = await audioBlob.arrayBuffer();\n\n const audioBuffer = await this.audioContext.decodeAudioData(arrayBuffer);\n\n \n\n const shouldEmitStart = wasFirstPlay && !this.isPlaying && this.currentSource === null;\n\n \n\n // Create source\n\n const source = this.audioContext.createBufferSource();\n\n source.buffer = audioBuffer;\n\n source.connect(this.audioContext.destination);\n\n \n\n this.currentSource = source;\n\n this.isPlaying = true;\n\n \n\n // Emit playback started (only on first chunk)\n\n if (shouldEmitStart) {\n\n this.emit('playbackStarted');\n\n }\n\n \n\n // Handle end\n\n source.onended = () => {\n\n this.currentSource = null;\n\n this.isProcessingQueue = false;\n\n \n\n // Process next chunk\n\n if (this.audioQueue.length > 0) {\n\n setTimeout(() => this.processQueue(), 50);\n\n } else {\n\n // No more chunks - stop after delay\n\n setTimeout(() => {\n\n if (this.audioQueue.length === 0 && !this.currentSource) {\n\n this.isPlaying = false;\n\n this.emit('playbackStopped');\n\n }\n\n }, 100);\n\n }\n\n };\n\n \n\n // Start playback\n\n source.start();\n\n \n\n } catch (error) {\n\n console.error('❌ AudioPlayer v2: Error processing queue:', error);\n\n this.currentSource = null;\n\n this.emit('playbackError', error);\n\n \n\n // Try next chunk\n\n if (this.audioQueue.length > 0) {\n\n this.isProcessingQueue = false;\n\n setTimeout(() => this.processQueue(), 100);\n\n } else {\n\n this.isPlaying = false;\n\n this.isProcessingQueue = false;\n\n this.emit('playbackStopped');\n\n }\n\n }\n\n }\n\n \n\n /**\n\n * Stop audio playback immediately\n\n */\n\n stop() {\n\n this.stopImmediate();\n\n }\n\n \n\n /**\n\n * Reset player state and clear queue\n\n */\n\n reset() {\n\n this.stop();\n\n this.audioQueue = [];\n\n this.pcmChunkQueue = [];\n\n }\n\n \n\n /**\n\n * Stop playback and clear queue\n\n */\n\n stopImmediate() {\n\n const wasPlaying = this.isPlaying || this.currentSource !== null || this.scheduledSources.size > 0;\n\n \n\n console.log('🛑 AudioPlayer.stopImmediate() called');\n\n console.log(' isPlaying:', this.isPlaying);\n\n console.log(' currentSource:', this.currentSource !== null);\n\n console.log(' scheduledSources.size:', this.scheduledSources.size);\n\n console.log(' scheduledBuffers:', this.scheduledBuffers);\n\n \n\n // Stop current source (legacy queue-based system)\n\n if (this.currentSource) {\n\n try {\n\n console.log(' Stopping currentSource...');\n\n this.currentSource.stop();\n\n } catch (e) {\n\n // Ignore if already stopped\n\n console.log(' currentSource already stopped or error:', e.message);\n\n }\n\n this.currentSource = null;\n\n }\n\n \n\n // Stop ALL scheduled AudioBufferSource nodes (new lookahead system)\n\n // This is critical for barge-in to work properly\n\n if (this.scheduledSources.size > 0) {\n\n console.log(` Stopping ${this.scheduledSources.size} scheduled sources...`);\n\n let stoppedCount = 0;\n\n for (const source of this.scheduledSources) {\n\n try {\n\n source.stop();\n\n stoppedCount++;\n\n } catch (e) {\n\n // Ignore if already stopped or not started yet\n\n console.log(' Source already stopped or not started:', e.message);\n\n }\n\n }\n\n console.log(` Stopped ${stoppedCount} sources`);\n\n this.scheduledSources.clear();\n\n }\n\n \n\n // Clear state\n\n this.isPlaying = false;\n\n this.isProcessingQueue = false;\n\n this.audioQueue = [];\n\n \n\n // Clear PCM chunk queue and prepared buffer\n\n this.pcmChunkQueue = [];\n\n this.preparedBuffer = [];\n\n this.isProcessingPcmQueue = false;\n\n this.isSchedulingFrames = false;\n\n \n\n // Reset scheduling properties\n\n this.nextStartTime = 0;\n\n this.scheduledBuffers = 0;\n\n \n\n // Emit stopped event - CRITICAL for barge-in\n\n if (wasPlaying) {\n\n console.log('🛑 AudioPlayer: Emitting playbackStopped event (stopImmediate called)');\n\n this.emit('playbackStopped');\n\n }\n\n }\n\n \n\n /**\n\n * Get player status\n\n */\n\n getStatus() {\n\n return {\n\n isPlaying: this.isPlaying,\n\n isProcessingQueue: this.isProcessingQueue,\n\n queueLength: this.audioQueue.length,\n\n audioContextState: this.audioContext ? this.audioContext.state : 'closed',\n\n outputFormat: this.outputFormat,\n\n scheduledBuffers: this.scheduledBuffers,\n\n preparedBufferLength: this.preparedBuffer.length,\n\n scheduledSourcesCount: this.scheduledSources.size\n\n };\n\n }\n\n \n\n /**\n\n * Destroy player and release resources\n\n */\n\n destroy() {\n\n this.stop();\n\n \n\n if (this.audioContext && this.audioContext.state !== 'closed') {\n\n this.audioContext.close();\n\n this.audioContext = null;\n\n }\n\n \n\n this.removeAllListeners();\n\n }\n\n}\n\n\n\nexport default AudioPlayer;\n\n","/**\n * AudioRecorder - Handles audio recording using AudioWorklet\n */\nimport EventEmitter from '../shared/EventEmitter.js';\n\nexport default class AudioRecorder extends EventEmitter {\n constructor(config) {\n super();\n this.config = config;\n this.audioContext = null;\n this.audioWorkletNode = null;\n this.mediaStream = null;\n this.isRecording = false;\n }\n \n /**\n * Get the audio processor path\n * Tries to detect from script source, falls back to config or default\n */\n getAudioProcessorPath() {\n // If explicitly configured, use it\n if (this.config.audioProcessorPath) {\n return this.config.audioProcessorPath;\n }\n \n // Try to find the script that loaded the SDK\n const scripts = document.getElementsByTagName('script');\n for (let script of scripts) {\n const src = script.src;\n // Check if this is the agent-widget.js script\n if (src && (src.includes('agent-widget.js') || src.includes('ttp-agent-sdk'))) {\n // Extract base URL and construct processor path\n try {\n const basePath = src.substring(0, src.lastIndexOf('/'));\n return `${basePath}/audio-processor.js`;\n } catch (e) {\n const basePath = src.substring(0, src.lastIndexOf('/'));\n return `${basePath}/audio-processor.js`;\n }\n }\n }\n \n // Fallback to CDN (update with your actual CDN URL)\n return 'https://cdn.talktopc.com/audio-processor.js';\n }\n \n /**\n * Start audio recording\n */\n async start() {\n try {\n // Get user media\n this.mediaStream = await navigator.mediaDevices.getUserMedia({\n audio: {\n sampleRate: this.config.sampleRate,\n channelCount: 1,\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true\n }\n });\n \n // Create AudioContext\n this.audioContext = new (window.AudioContext || window.webkitAudioContext)({\n sampleRate: this.config.sampleRate\n });\n \n // Resume AudioContext if suspended\n if (this.audioContext.state === 'suspended') {\n await this.audioContext.resume();\n }\n \n // Get the audio processor path\n const processorPath = this.getAudioProcessorPath();\n \n // Load AudioWorklet module\n await this.audioContext.audioWorklet.addModule(processorPath);\n \n // Create AudioWorklet node\n this.audioWorkletNode = new AudioWorkletNode(this.audioContext, 'audio-processor');\n \n // Create media stream source\n const source = this.audioContext.createMediaStreamSource(this.mediaStream);\n source.connect(this.audioWorkletNode);\n \n // Handle messages from AudioWorklet\n this.audioWorkletNode.port.onmessage = (event) => {\n const { type, data } = event.data;\n \n if (type === 'pcm_audio_data') {\n this.emit('audioData', data);\n }\n };\n \n // Enable continuous mode\n this.audioWorkletNode.port.postMessage({\n type: 'setForceContinuous',\n data: { enabled: true }\n });\n \n this.isRecording = true;\n this.emit('recordingStarted');\n \n } catch (error) {\n this.emit('error', error);\n throw error;\n }\n }\n \n /**\n * Stop audio recording\n */\n async stop() {\n if (!this.isRecording) {\n return;\n }\n \n try {\n // Flush any remaining audio data\n if (this.audioWorkletNode) {\n this.audioWorkletNode.port.postMessage({ type: 'flush' });\n await new Promise(resolve => setTimeout(resolve, 100));\n }\n \n // Disconnect and cleanup\n if (this.mediaStream) {\n this.mediaStream.getTracks().forEach(track => track.stop());\n this.mediaStream = null;\n }\n \n if (this.audioContext && this.audioContext.state !== 'closed') {\n await this.audioContext.close();\n this.audioContext = null;\n }\n \n this.audioWorkletNode = null;\n this.isRecording = false;\n this.emit('recordingStopped');\n \n } catch (error) {\n this.emit('error', error);\n throw error;\n }\n }\n \n /**\n * Get recording status\n */\n getStatus() {\n return {\n isRecording: this.isRecording,\n audioContextState: this.audioContext ? this.audioContext.state : 'closed'\n };\n }\n \n /**\n * Cleanup resources\n */\n destroy() {\n this.stop();\n }\n}\n","// src/v2/utils/converters/ContainerConverter.js\n\n/**\n * Container Converter - Handles WAV ↔ Raw conversion\n * \n * Responsibilities:\n * - Extract PCM from WAV (parse header, extract data chunk)\n * - Wrap PCM in WAV header (create standard WAV file)\n */\nclass ContainerConverter {\n /**\n * Extract raw PCM from WAV file\n * @param {ArrayBuffer|Uint8Array} wavData - WAV file data\n * @returns {Object} - { pcmData: ArrayBuffer, format: { sampleRate, channels, bitDepth } }\n */\n static extractPcmFromWav(wavData) {\n const bytes = wavData instanceof Uint8Array ? wavData : new Uint8Array(wavData);\n \n if (bytes.length < 44) {\n throw new Error('WAV data too short (< 44 bytes)');\n }\n \n // Verify RIFF header\n const riff = String.fromCharCode(bytes[0], bytes[1], bytes[2], bytes[3]);\n if (riff !== 'RIFF') {\n throw new Error('Not a valid WAV file - missing RIFF header');\n }\n \n // Verify WAVE format\n const wave = String.fromCharCode(bytes[8], bytes[9], bytes[10], bytes[11]);\n if (wave !== 'WAVE') {\n throw new Error('Not a valid WAV file - missing WAVE format');\n }\n \n // Parse format chunk (little-endian)\n const channels = bytes[22] | (bytes[23] << 8);\n const sampleRate = bytes[24] | (bytes[25] << 8) | (bytes[26] << 16) | (bytes[27] << 24);\n const bitDepth = bytes[34] | (bytes[35] << 8);\n \n // Find \"data\" chunk\n let dataChunkStart = -1;\n for (let i = 12; i < bytes.length - 8; i += 4) {\n const chunkId = String.fromCharCode(bytes[i], bytes[i + 1], bytes[i + 2], bytes[i + 3]);\n if (chunkId === 'data') {\n dataChunkStart = i;\n break;\n }\n // Skip this chunk\n const chunkSize = bytes[i + 4] | (bytes[i + 5] << 8) | (bytes[i + 6] << 16) | (bytes[i + 7] << 24);\n i += 4 + chunkSize; // Skip chunk header + data\n }\n \n if (dataChunkStart === -1) {\n throw new Error('No data chunk found in WAV');\n }\n \n // Read data chunk size\n const dataSize = bytes[dataChunkStart + 4] | \n (bytes[dataChunkStart + 5] << 8) | \n (bytes[dataChunkStart + 6] << 16) | \n (bytes[dataChunkStart + 7] << 24);\n \n // Extract PCM data\n const dataStart = dataChunkStart + 8;\n const actualDataSize = Math.min(dataSize, bytes.length - dataStart);\n \n const pcmData = bytes.slice(dataStart, dataStart + actualDataSize);\n \n return {\n pcmData: pcmData.buffer,\n format: {\n sampleRate,\n channels,\n bitDepth\n }\n };\n }\n \n /**\n * Check if data is a WAV file\n * @param {Uint8Array} bytes - Data to check\n * @returns {boolean} - True if WAV file\n */\n static isWavFile(bytes) {\n return bytes.length >= 44 &&\n bytes[0] === 0x52 && bytes[1] === 0x49 && // \"RI\"\n bytes[2] === 0x46 && bytes[3] === 0x46; // \"FF\"\n }\n \n /**\n * Create WAV header\n * @param {number} dataLength - Length of PCM data in bytes\n * @param {number} sampleRate - Sample rate in Hz\n * @param {number} numChannels - Number of channels (1 = mono)\n * @param {number} bitsPerSample - Bit depth (8, 16, 24)\n * @returns {ArrayBuffer} - 44-byte WAV header\n */\n static createWavHeader(dataLength, sampleRate, numChannels, bitsPerSample) {\n const header = new ArrayBuffer(44);\n const view = new DataView(header);\n \n // RIFF header\n view.setUint32(0, 0x52494646, false); // \"RIFF\"\n view.setUint32(4, 36 + dataLength, true);\n view.setUint32(8, 0x57415645, false); // \"WAVE\"\n \n // fmt chunk\n view.setUint32(12, 0x666D7420, false); // \"fmt \"\n view.setUint32(16, 16, true); // Subchunk size\n view.setUint16(20, 1, true); // Audio format (1 = PCM)\n view.setUint16(22, numChannels, true);\n view.setUint32(24, sampleRate, true);\n view.setUint32(28, sampleRate * numChannels * bitsPerSample / 8, true); // Byte rate\n view.setUint16(32, numChannels * bitsPerSample / 8, true); // Block align\n view.setUint16(34, bitsPerSample, true);\n \n // data chunk\n view.setUint32(36, 0x64617461, false); // \"data\"\n view.setUint32(40, dataLength, true);\n \n return header;\n }\n \n /**\n * Wrap PCM data in WAV container\n * @param {ArrayBuffer} pcmData - Raw PCM audio data\n * @param {Object} format - Audio format { sampleRate, channels, bitDepth }\n * @returns {ArrayBuffer} - WAV file data\n */\n static wrapPcmInWav(pcmData, format) {\n const header = ContainerConverter.createWavHeader(\n pcmData.byteLength,\n format.sampleRate,\n format.channels || 1,\n format.bitDepth || 16\n );\n \n // Combine header + data\n const wavFile = new Uint8Array(header.byteLength + pcmData.byteLength);\n wavFile.set(new Uint8Array(header), 0);\n wavFile.set(new Uint8Array(pcmData), header.byteLength);\n \n return wavFile.buffer;\n }\n}\n\nexport default ContainerConverter;\n\n\n\n\n\n\n","// src/v2/utils/converters/EncodingConverter.js\n\nimport PCMCodec from '../../codecs/PCMCodec.js';\nimport PCMUCodec from '../../codecs/PCMUCodec.js';\nimport PCMACodec from '../../codecs/PCMACodec.js';\n\n/**\n * Encoding Converter - Handles PCM ↔ PCMU ↔ PCMA conversion\n * \n * All conversions are FROM PCM (PCM is the universal intermediate format)\n */\nclass EncodingConverter {\n constructor() {\n this.codecs = {\n pcm: new PCMCodec(),\n pcmu: new PCMUCodec(),\n pcma: new PCMACodec()\n };\n }\n \n /**\n * Decode encoded audio to PCM\n * @param {ArrayBuffer|Uint8Array} encodedData - Encoded audio (PCMU/PCMA)\n * @param {string} encoding - Source encoding ('pcm', 'pcmu', 'pcma')\n * @returns {ArrayBuffer} - 16-bit PCM audio data\n */\n decodeToPcm(encodedData, encoding) {\n const normalizedEncoding = encoding?.toLowerCase();\n \n if (!normalizedEncoding || normalizedEncoding === 'pcm') {\n // Already PCM, return as-is\n if (encodedData instanceof ArrayBuffer) {\n return encodedData;\n }\n if (encodedData instanceof Uint8Array) {\n return encodedData.buffer;\n }\n return encodedData;\n }\n \n const codec = this.codecs[normalizedEncoding];\n if (!codec) {\n throw new Error(`Unsupported encoding: ${encoding}`);\n }\n \n const input = encodedData instanceof Uint8Array ? \n encodedData : \n new Uint8Array(encodedData);\n \n return codec.decode(input);\n }\n \n /**\n * Encode PCM to target encoding\n * @param {ArrayBuffer} pcmData - 16-bit PCM audio data\n * @param {string} targetEncoding - Target encoding ('pcm', 'pcmu', 'pcma')\n * @returns {ArrayBuffer|Uint8Array} - Encoded audio data\n */\n encodeFromPcm(pcmData, targetEncoding) {\n const normalizedEncoding = targetEncoding?.toLowerCase();\n \n if (!normalizedEncoding || normalizedEncoding === 'pcm') {\n // Target is PCM, return as-is\n return pcmData;\n }\n \n const codec = this.codecs[normalizedEncoding];\n if (!codec) {\n throw new Error(`Unsupported target encoding: ${targetEncoding}`);\n }\n \n const encoded = codec.encode(pcmData);\n \n // Return as ArrayBuffer for consistency\n if (encoded instanceof Uint8Array) {\n return encoded.buffer;\n }\n \n return encoded;\n }\n \n /**\n * Get codec for encoding\n * @param {string} encoding - Encoding name\n * @returns {Object|null} - Codec instance or null\n */\n getCodec(encoding) {\n const normalized = encoding?.toLowerCase();\n return this.codecs[normalized] || null;\n }\n}\n\nexport default EncodingConverter;\n\n\n","// src/v2/utils/converters/BitDepthConverter.js\n\n/**\n * Bit Depth Converter - Handles bit depth conversion FROM PCM\n * \n * Note: Source is NEVER 8-bit (only 16-bit or 24-bit)\n * All conversions are FROM PCM\n */\nclass BitDepthConverter {\n /**\n * Convert PCM from one bit depth to another\n * @param {ArrayBuffer} pcmData - Input PCM data\n * @param {number} inputBitDepth - Input bit depth (16 or 24, never 8)\n * @param {number} outputBitDepth - Output bit depth (8, 16, or 24)\n * @returns {ArrayBuffer} - Converted PCM data\n */\n static convert(pcmData, inputBitDepth, outputBitDepth) {\n if (inputBitDepth === outputBitDepth) {\n return pcmData; // No conversion needed\n }\n \n if (inputBitDepth === 8) {\n throw new Error('Source bit depth cannot be 8-bit (only 16-bit or 24-bit supported)');\n }\n \n const inputBytesPerSample = inputBitDepth / 8;\n const outputBytesPerSample = outputBitDepth / 8;\n const numSamples = pcmData.byteLength / inputBytesPerSample;\n \n const outputData = new ArrayBuffer(numSamples * outputBytesPerSample);\n \n if (inputBitDepth === 16 && outputBitDepth === 16) {\n // No conversion\n return pcmData;\n } else if (inputBitDepth === 24 && outputBitDepth === 16) {\n // 24-bit → 16-bit: Scale down\n return BitDepthConverter.convert24To16(pcmData);\n } else if (inputBitDepth === 16 && outputBitDepth === 24) {\n // 16-bit → 24-bit: Scale up\n return BitDepthConverter.convert16To24(pcmData);\n } else if (inputBitDepth === 16 && outputBitDepth === 8) {\n // 16-bit → 8-bit: Scale down (rare)\n return BitDepthConverter.convert16To8(pcmData);\n } else if (inputBitDepth === 24 && outputBitDepth === 8) {\n // 24-bit → 8-bit: Scale down (rare)\n return BitDepthConverter.convert24To8(pcmData);\n } else {\n throw new Error(`Unsupported bit depth conversion: ${inputBitDepth}-bit → ${outputBitDepth}-bit`);\n }\n }\n \n /**\n * Convert 24-bit PCM to 16-bit PCM\n * @param {ArrayBuffer} pcm24Data - 24-bit PCM data\n * @returns {ArrayBuffer} - 16-bit PCM data\n */\n static convert24To16(pcm24Data) {\n const bytes = new Uint8Array(pcm24Data);\n const samples = Math.floor(bytes.length / 3);\n const pcm16 = new Int16Array(samples);\n \n for (let i = 0; i < samples; i++) {\n // Read 24-bit signed integer (little-endian)\n const byte0 = bytes[i * 3]; // LSB\n const byte1 = bytes[i * 3 + 1]; // Middle\n const byte2 = bytes[i * 3 + 2]; // MSB (sign bit)\n \n // Combine bytes to 24-bit value\n let value24 = byte0 | (byte1 << 8) | ((byte2 & 0xFF) << 16);\n \n // Sign extend if negative\n if (byte2 & 0x80) {\n value24 = value24 | 0xFF000000;\n }\n \n // Scale down to 16-bit (divide by 256)\n pcm16[i] = Math.max(-32768, Math.min(32767, Math.round(value24 / 256)));\n }\n \n return pcm16.buffer;\n }\n \n /**\n * Convert 16-bit PCM to 24-bit PCM\n * @param {ArrayBuffer} pcm16Data - 16-bit PCM data\n * @returns {ArrayBuffer} - 24-bit PCM data\n */\n static convert16To24(pcm16Data) {\n const pcm16 = new Int16Array(pcm16Data);\n const pcm24 = new Uint8Array(pcm16.length * 3);\n \n for (let i = 0; i < pcm16.length; i++) {\n const value = pcm16[i];\n // Scale up to 24-bit (multiply by 256)\n const value24 = value * 256;\n \n // Write as little-endian 24-bit\n pcm24[i * 3] = value24 & 0xFF;\n pcm24[i * 3 + 1] = (value24 >> 8) & 0xFF;\n pcm24[i * 3 + 2] = (value24 >> 16) & 0xFF;\n }\n \n return pcm24.buffer;\n }\n \n /**\n * Convert 16-bit PCM to 8-bit PCM\n * @param {ArrayBuffer} pcm16Data - 16-bit PCM data\n * @returns {ArrayBuffer} - 8-bit PCM data\n */\n static convert16To8(pcm16Data) {\n const pcm16 = new Int16Array(pcm16Data);\n const pcm8 = new Uint8Array(pcm16.length);\n \n for (let i = 0; i < pcm16.length; i++) {\n // 16-bit signed (-32768 to 32767) → 8-bit unsigned (0 to 255)\n const value = pcm16[i];\n pcm8[i] = Math.max(0, Math.min(255, Math.round((value / 256) + 128)));\n }\n \n return pcm8.buffer;\n }\n \n /**\n * Convert 24-bit PCM to 8-bit PCM\n * @param {ArrayBuffer} pcm24Data - 24-bit PCM data\n * @returns {ArrayBuffer} - 8-bit PCM data\n */\n static convert24To8(pcm24Data) {\n // First convert to 16-bit, then to 8-bit\n const pcm16 = BitDepthConverter.convert24To16(pcm24Data);\n return BitDepthConverter.convert16To8(pcm16);\n }\n}\n\nexport default BitDepthConverter;\n\n\n\n\n\n\n","// src/v2/utils/converters/SampleRateConverter.js\n\n/**\n * Sample Rate Converter - Handles resampling FROM PCM\n * \n * Uses Web Audio API OfflineAudioContext for high-quality resampling\n */\nclass SampleRateConverter {\n /**\n * Resample PCM audio to target sample rate\n * @param {ArrayBuffer} pcmData - Input PCM data (16-bit)\n * @param {number} inputSampleRate - Input sample rate in Hz\n * @param {number} outputSampleRate - Output sample rate in Hz\n * @returns {Promise<ArrayBuffer>} - Resampled PCM data\n */\n static async resample(pcmData, inputSampleRate, outputSampleRate) {\n if (inputSampleRate === outputSampleRate) {\n return pcmData; // No resampling needed\n }\n \n // Convert Int16 PCM to Float32 for Web Audio API\n const int16Array = new Int16Array(pcmData);\n const float32Array = new Float32Array(int16Array.length);\n const NORMALIZATION = 1.0 / 32768.0;\n \n for (let i = 0; i < int16Array.length; i++) {\n float32Array[i] = int16Array[i] * NORMALIZATION;\n }\n \n // Create offline audio context for resampling\n const outputLength = Math.ceil(float32Array.length * outputSampleRate / inputSampleRate);\n const offlineContext = new OfflineAudioContext(\n 1, // mono\n outputLength,\n outputSampleRate\n );\n \n // Create buffer with input sample rate\n const inputBuffer = offlineContext.createBuffer(\n 1, // mono\n float32Array.length,\n inputSampleRate\n );\n \n inputBuffer.getChannelData(0).set(float32Array);\n \n // Create source and connect\n const source = offlineContext.createBufferSource();\n source.buffer = inputBuffer;\n source.connect(offlineContext.destination);\n source.start();\n \n // Render to get resampled audio\n const resampledBuffer = await offlineContext.startRendering();\n const resampledFloat32 = resampledBuffer.getChannelData(0);\n \n // Convert Float32 back to Int16 PCM\n const resampledInt16 = new Int16Array(resampledFloat32.length);\n for (let i = 0; i < resampledFloat32.length; i++) {\n const sample = Math.max(-1, Math.min(1, resampledFloat32[i]));\n resampledInt16[i] = Math.round(sample * 32767);\n }\n \n return resampledInt16.buffer;\n }\n}\n\nexport default SampleRateConverter;\n\n\n\n\n\n\n","// src/v2/utils/converters/ChannelConverter.js\n\n/**\n * Channel Converter - Handles channel conversion FROM PCM\n * \n * Currently only supports mono (1 channel), but prepared for future stereo support\n */\nclass ChannelConverter {\n /**\n * Convert PCM channels\n * @param {ArrayBuffer} pcmData - Input PCM data\n * @param {number} inputChannels - Input channel count\n * @param {number} outputChannels - Output channel count\n * @param {number} bitDepth - Bit depth (16 or 24)\n * @returns {ArrayBuffer} - Converted PCM data\n */\n static convert(pcmData, inputChannels, outputChannels, bitDepth = 16) {\n if (inputChannels === outputChannels) {\n return pcmData; // No conversion needed\n }\n \n if (inputChannels === 1 && outputChannels === 1) {\n return pcmData; // Already mono\n }\n \n if (inputChannels === 1 && outputChannels === 2) {\n // Mono → Stereo: Duplicate channel\n return ChannelConverter.monoToStereo(pcmData, bitDepth);\n }\n \n if (inputChannels === 2 && outputChannels === 1) {\n // Stereo → Mono: Average channels\n return ChannelConverter.stereoToMono(pcmData, bitDepth);\n }\n \n throw new Error(`Unsupported channel conversion: ${inputChannels} → ${outputChannels}`);\n }\n \n /**\n * Convert mono to stereo (duplicate channel)\n * @param {ArrayBuffer} monoData - Mono PCM data\n * @param {number} bitDepth - Bit depth\n * @returns {ArrayBuffer} - Stereo PCM data\n */\n static monoToStereo(monoData, bitDepth) {\n const bytesPerSample = bitDepth / 8;\n const numSamples = monoData.byteLength / bytesPerSample;\n const stereoData = new ArrayBuffer(numSamples * bytesPerSample * 2);\n \n const input = new Uint8Array(monoData);\n const output = new Uint8Array(stereoData);\n \n for (let i = 0; i < numSamples; i++) {\n const inputOffset = i * bytesPerSample;\n const outputOffset = i * bytesPerSample * 2;\n \n // Copy sample to both left and right channels\n for (let j = 0; j < bytesPerSample; j++) {\n output[outputOffset + j] = input[inputOffset + j]; // Left\n output[outputOffset + bytesPerSample + j] = input[inputOffset + j]; // Right\n }\n }\n \n return stereoData;\n }\n \n /**\n * Convert stereo to mono (average channels)\n * @param {ArrayBuffer} stereoData - Stereo PCM data\n * @param {number} bitDepth - Bit depth\n * @returns {ArrayBuffer} - Mono PCM data\n */\n static stereoToMono(stereoData, bitDepth) {\n const bytesPerSample = bitDepth / 8;\n const numSamples = stereoData.byteLength / (bytesPerSample * 2);\n const monoData = new ArrayBuffer(numSamples * bytesPerSample);\n \n const input = new Uint8Array(stereoData);\n const output = new Uint8Array(monoData);\n \n if (bitDepth === 16) {\n // 16-bit: Average samples\n for (let i = 0; i < numSamples; i++) {\n const leftOffset = i * bytesPerSample * 2;\n const rightOffset = leftOffset + bytesPerSample;\n \n const left = (input[leftOffset] | (input[leftOffset + 1] << 8)) << 16 >> 16; // Sign extend\n const right = (input[rightOffset] | (input[rightOffset + 1] << 8)) << 16 >> 16;\n \n const mono = Math.round((left + right) / 2);\n \n const outputOffset = i * bytesPerSample;\n output[outputOffset] = mono & 0xFF;\n output[outputOffset + 1] = (mono >> 8) & 0xFF;\n }\n } else {\n // For other bit depths, just take left channel\n for (let i = 0; i < numSamples; i++) {\n const inputOffset = i * bytesPerSample * 2;\n const outputOffset = i * bytesPerSample;\n \n for (let j = 0; j < bytesPerSample; j++) {\n output[outputOffset + j] = input[inputOffset + j];\n }\n }\n }\n \n return monoData;\n }\n}\n\nexport default ChannelConverter;\n\n\n\n\n\n\n","// src/v2/utils/AudioFormatConverter.js\n\nimport ContainerConverter from './converters/ContainerConverter.js';\nimport EncodingConverter from './converters/EncodingConverter.js';\nimport BitDepthConverter from './converters/BitDepthConverter.js';\nimport SampleRateConverter from './converters/SampleRateConverter.js';\nimport ChannelConverter from './converters/ChannelConverter.js';\n\n/**\n * Audio Format Converter - Converts audio from backend format to requested format\n * \n * All conversions start FROM PCM (PCM is the universal intermediate format)\n * \n * @example\n * const converter = new AudioFormatConverter(requestedFormat, actualFormat);\n * if (converter.needsConversion()) {\n * const converted = await converter.convert(audioData);\n * }\n */\nclass AudioFormatConverter {\n /**\n * @param {Object} requestedFormat - What user wants\n * @param {string} requestedFormat.container - 'raw' or 'wav'\n * @param {string} requestedFormat.encoding - 'pcm', 'pcmu', 'pcma'\n * @param {number} requestedFormat.sampleRate - Sample rate in Hz\n * @param {number} requestedFormat.bitDepth - Bit depth (8, 16, 24)\n * @param {number} requestedFormat.channels - Number of channels (1 = mono)\n * \n * @param {Object} actualFormat - What backend is sending\n * @param {string} actualFormat.container - 'raw' or 'wav'\n * @param {string} actualFormat.encoding - 'pcm', 'pcmu', 'pcma'\n * @param {number} actualFormat.sampleRate - Sample rate in Hz\n * @param {number} actualFormat.bitDepth - Bit depth (16 or 24, never 8)\n * @param {number} actualFormat.channels - Number of channels (1 = mono)\n */\n constructor(requestedFormat, actualFormat) {\n this.requestedFormat = requestedFormat;\n this.actualFormat = actualFormat;\n this.encodingConverter = new EncodingConverter();\n this.conversionSteps = [];\n \n // Analyze what conversions are needed\n this._analyzeConversions();\n }\n \n /**\n * Analyze what conversions are needed\n * @private\n */\n _analyzeConversions() {\n this.conversionSteps = [];\n \n // Check container\n if (this.actualFormat.container !== this.requestedFormat.container) {\n if (this.actualFormat.container === 'wav') {\n this.conversionSteps.push('extract_wav');\n } else if (this.requestedFormat.container === 'wav') {\n this.conversionSteps.push('wrap_wav');\n }\n }\n \n // Check encoding\n if (this.actualFormat.encoding !== this.requestedFormat.encoding) {\n if (this.actualFormat.encoding !== 'pcm') {\n this.conversionSteps.push('decode_encoding');\n }\n if (this.requestedFormat.encoding !== 'pcm') {\n this.conversionSteps.push('encode_encoding');\n }\n }\n \n // Check sample rate\n if (this.actualFormat.sampleRate !== this.requestedFormat.sampleRate) {\n this.conversionSteps.push('resample');\n }\n \n // Check bit depth\n if (this.actualFormat.bitDepth !== this.requestedFormat.bitDepth) {\n this.conversionSteps.push('convert_bitdepth');\n }\n \n // Check channels\n if (this.actualFormat.channels !== this.requestedFormat.channels) {\n this.conversionSteps.push('convert_channels');\n }\n }\n \n /**\n * Check if conversion is needed\n * @returns {boolean} - True if formats differ\n */\n needsConversion() {\n return this.conversionSteps.length > 0;\n }\n \n /**\n * Get conversion steps as human-readable array\n * @returns {string[]} - Array of conversion step descriptions\n */\n getConversionSteps() {\n const steps = [];\n \n if (this.conversionSteps.includes('extract_wav')) {\n steps.push(`Extract PCM from WAV (${this.actualFormat.container} → raw)`);\n }\n \n if (this.conversionSteps.includes('decode_encoding')) {\n steps.push(`Decode ${this.actualFormat.encoding.toUpperCase()} → PCM`);\n }\n \n if (this.conversionSteps.includes('resample')) {\n steps.push(`Resample ${this.actualFormat.sampleRate}Hz → ${this.requestedFormat.sampleRate}Hz`);\n }\n \n if (this.conversionSteps.includes('convert_bitdepth')) {\n steps.push(`Convert bit depth ${this.actualFormat.bitDepth}-bit → ${this.requestedFormat.bitDepth}-bit`);\n }\n \n if (this.conversionSteps.includes('convert_channels')) {\n steps.push(`Convert channels ${this.actualFormat.channels} → ${this.requestedFormat.channels}`);\n }\n \n if (this.conversionSteps.includes('encode_encoding')) {\n steps.push(`Encode PCM → ${this.requestedFormat.encoding.toUpperCase()}`);\n }\n \n if (this.conversionSteps.includes('wrap_wav')) {\n steps.push(`Wrap in WAV container (raw → ${this.requestedFormat.container})`);\n }\n \n return steps;\n }\n \n /**\n * Convert audio data from actual format to requested format\n * @param {ArrayBuffer|Uint8Array} audioData - Input audio data\n * @returns {Promise<ArrayBuffer>} - Converted audio data\n */\n async convert(audioData) {\n if (!this.needsConversion()) {\n return audioData instanceof ArrayBuffer ? audioData : audioData.buffer;\n }\n \n let currentData = audioData instanceof ArrayBuffer ? audioData : audioData.buffer;\n let currentFormat = { ...this.actualFormat };\n \n // Step 1: Extract PCM from WAV if needed\n if (this.conversionSteps.includes('extract_wav')) {\n const extracted = ContainerConverter.extractPcmFromWav(currentData);\n currentData = extracted.pcmData;\n // Update format from WAV header\n currentFormat = {\n ...currentFormat,\n container: 'raw',\n sampleRate: extracted.format.sampleRate,\n channels: extracted.format.channels,\n bitDepth: extracted.format.bitDepth\n };\n console.log('🔄 AudioFormatConverter: Extracted PCM from WAV', extracted.format);\n }\n \n // Step 2: Decode to PCM if needed (PCMU/PCMA → PCM)\n if (this.conversionSteps.includes('decode_encoding')) {\n currentData = this.encodingConverter.decodeToPcm(currentData, currentFormat.encoding);\n currentFormat.encoding = 'pcm';\n currentFormat.bitDepth = 16; // Decoded to 16-bit PCM\n console.log(`🔄 AudioFormatConverter: Decoded ${this.actualFormat.encoding.toUpperCase()} → PCM`);\n }\n \n // Step 3: Normalize to 16-bit PCM if 24-bit (for processing)\n if (currentFormat.bitDepth === 24 && currentFormat.bitDepth !== this.requestedFormat.bitDepth) {\n // Only normalize if we need to process it (resample, etc.)\n if (this.conversionSteps.includes('resample') || \n this.conversionSteps.includes('convert_channels') ||\n (this.requestedFormat.bitDepth !== 24)) {\n currentData = BitDepthConverter.convert(currentData, 24, 16);\n currentFormat.bitDepth = 16;\n console.log('🔄 AudioFormatConverter: Normalized 24-bit → 16-bit PCM');\n }\n }\n \n // Step 4: Resample if needed (FROM PCM)\n if (this.conversionSteps.includes('resample')) {\n currentData = await SampleRateConverter.resample(\n currentData,\n currentFormat.sampleRate,\n this.requestedFormat.sampleRate\n );\n currentFormat.sampleRate = this.requestedFormat.sampleRate;\n console.log(`🔄 AudioFormatConverter: Resampled ${this.actualFormat.sampleRate}Hz → ${this.requestedFormat.sampleRate}Hz`);\n }\n \n // Step 5: Convert channels if needed (FROM PCM)\n if (this.conversionSteps.includes('convert_channels')) {\n currentData = ChannelConverter.convert(\n currentData,\n currentFormat.channels,\n this.requestedFormat.channels,\n currentFormat.bitDepth\n );\n currentFormat.channels = this.requestedFormat.channels;\n console.log(`🔄 AudioFormatConverter: Converted channels ${this.actualFormat.channels} → ${this.requestedFormat.channels}`);\n }\n \n // Step 6: Convert bit depth if needed (FROM PCM)\n if (this.conversionSteps.includes('convert_bitdepth')) {\n currentData = BitDepthConverter.convert(\n currentData,\n currentFormat.bitDepth,\n this.requestedFormat.bitDepth\n );\n currentFormat.bitDepth = this.requestedFormat.bitDepth;\n console.log(`🔄 AudioFormatConverter: Converted bit depth ${this.actualFormat.bitDepth}-bit → ${this.requestedFormat.bitDepth}-bit`);\n }\n \n // Step 7: Encode to target encoding if needed (FROM PCM)\n if (this.conversionSteps.includes('encode_encoding')) {\n const encoded = this.encodingConverter.encodeFromPcm(currentData, this.requestedFormat.encoding);\n currentData = encoded instanceof ArrayBuffer ? encoded : encoded.buffer;\n currentFormat.encoding = this.requestedFormat.encoding;\n console.log(`🔄 AudioFormatConverter: Encoded PCM → ${this.requestedFormat.encoding.toUpperCase()}`);\n }\n \n // Step 8: Wrap in WAV container if needed\n if (this.conversionSteps.includes('wrap_wav')) {\n currentData = ContainerConverter.wrapPcmInWav(currentData, currentFormat);\n currentFormat.container = 'wav';\n console.log('🔄 AudioFormatConverter: Wrapped in WAV container');\n }\n \n console.log('✅ AudioFormatConverter: Conversion complete');\n return currentData;\n }\n}\n\nexport default AudioFormatConverter;\n\n\n\n\n","// src/v2/VoiceSDK.js\n\nimport EventEmitter from '../shared/EventEmitter.js';\n\nimport AudioPlayer from './AudioPlayer.js';\n\nimport AudioRecorder from '../v1/AudioRecorder.js';\n\nimport AudioFormatConverter from './utils/AudioFormatConverter.js';\n\n\n\n/**\n\n * VoiceSDK v2 - Multi-codec speech-to-speech SDK\n\n * \n\n * Features:\n\n * - Format negotiation with backend\n\n * - Support for PCM, PCMU (μ-law), PCMA (A-law)\n\n * - Support for WAV and raw audio containers\n\n * - Backward compatible with v1 protocol\n\n * \n\n * Events:\n\n * - 'connected' - WebSocket connected\n\n * - 'disconnected' - WebSocket disconnected\n\n * - 'formatNegotiated' - Audio format confirmed by server\n\n * - 'recordingStarted' - Recording started\n\n * - 'recordingStopped' - Recording stopped\n\n * - 'playbackStarted' - Audio playback started\n\n * - 'playbackStopped' - Audio playback stopped\n\n * - 'error' - Error occurred\n\n * - 'message' - Text message from server\n\n */\n\nclass VoiceSDK_v2 extends EventEmitter {\n\n // Supported INPUT audio format configurations (matching backend validation)\n\n static SUPPORTED_INPUT_ENCODINGS = ['pcm', 'pcmu', 'pcma'];\n\n static SUPPORTED_INPUT_SAMPLE_RATES = [8000, 16000, 22050, 24000, 44100, 48000];\n\n static SUPPORTED_INPUT_BIT_DEPTHS = [8, 16, 24];\n\n static SUPPORTED_INPUT_CHANNELS = [1];\n\n \n\n // Supported OUTPUT audio format configurations (matching backend validation)\n\n static SUPPORTED_OUTPUT_ENCODINGS = ['pcm', 'pcmu', 'pcma'];\n\n static SUPPORTED_OUTPUT_SAMPLE_RATES = [8000, 16000, 22050, 24000, 44100, 48000];\n\n static SUPPORTED_OUTPUT_BIT_DEPTHS = [8, 16, 24];\n\n static SUPPORTED_OUTPUT_CHANNELS = [1];\n\n static SUPPORTED_OUTPUT_CONTAINERS = ['raw', 'wav'];\n\n \n\n constructor(config = {}) {\n\n super();\n\n \n\n this.version = '2.0.0';\n\n \n\n this.config = {\n\n // Connection\n\n websocketUrl: config.websocketUrl || 'wss://speech.talktopc.com/ws/conv',\n\n agentId: config.agentId,\n\n appId: config.appId,\n\n \n\n // Input format (what we send to server)\n\n sampleRate: config.sampleRate || 16000,\n\n channels: config.channels || 1,\n\n bitDepth: config.bitDepth || 16,\n\n \n\n // Audio processor path (optional)\n\n audioProcessorPath: config.audioProcessorPath, // Will auto-detect if not provided\n\n \n\n // Output format (what we want from server)\n\n outputContainer: config.outputContainer || this.getDefaultContainer(config),\n\n outputEncoding: config.outputEncoding || config.outputCodec || 'pcm',\n\n outputSampleRate: config.outputSampleRate || 16000,\n\n outputChannels: config.outputChannels || 1,\n\n outputBitDepth: config.outputBitDepth || 16,\n\n // Output frame duration (for raw PCM streaming)\n outputFrameDurationMs: config.outputFrameDurationMs || 600, // Default 600ms - smooth playback with good latency balance\n\n \n\n // Legacy support\n\n outputCodec: config.outputCodec,\n\n \n\n // Optional settings\n\n agentSettingsOverride: config.agentSettingsOverride || null,\n\n autoReconnect: config.autoReconnect !== false,\n\n \n\n // Protocol version\n\n protocolVersion: config.protocolVersion || 2\n\n };\n\n \n\n // State\n\n this.isConnected = false;\n\n this.hasEverConnected = false; // Track if we've successfully connected at least once\n\n this.isRecording = false;\n\n this.isPlaying = false;\n\n this.isDestroyed = false;\n\n this.outputAudioFormat = null;\n\n this.requestedOutputFormat = null; // What user requested\n\n this.formatConverter = null; // Format converter instance\n\n this.websocket = null;\n\n \n\n // Components\n\n this.audioPlayer = new AudioPlayer(this.config);\n\n this.audioRecorder = new AudioRecorder(this.config);\n\n \n\n\n // DON'T set default format in constructor\n // Wait for hello_ack to set the correct format\n // outputAudioFormat is already set to null above\n\n \n\n this.setupAudioPlayerEvents();\n\n this.setupAudioRecorderEvents();\n\n \n\n // Validate input and output formats\n\n this.validateConfig();\n\n \n\n console.log('🎵 VoiceSDK v2 initialized:', {\n\n version: this.version,\n\n outputContainer: this.config.outputContainer,\n\n outputEncoding: this.config.outputEncoding,\n\n outputSampleRate: this.config.outputSampleRate\n\n });\n\n }\n\n \n\n /**\n\n * Get default container based on config\n\n */\n\n getDefaultContainer(config) {\n\n // Backward compatibility: if user specified 'wav' as codec, use wav container\n\n if (config.outputCodec === 'wav') {\n\n return 'wav';\n\n }\n\n // Default: raw (no container overhead)\n\n return 'raw';\n\n }\n\n \n\n /**\n\n * Validate input audio format (matching backend validation)\n\n * @param {Object} format - Input format to validate\n\n * @returns {string|null} - Error message if invalid, null if valid\n\n */\n\n validateInputFormat(format) {\n\n if (!format) {\n\n return 'Input format is required';\n\n }\n\n \n\n const encoding = format.encoding?.toLowerCase();\n\n if (!encoding || !VoiceSDK_v2.SUPPORTED_INPUT_ENCODINGS.includes(encoding)) {\n\n return `Unsupported input encoding: ${format.encoding}. Supported: ${VoiceSDK_v2.SUPPORTED_INPUT_ENCODINGS.join(', ')}`;\n\n }\n\n \n\n if (!format.sampleRate || !VoiceSDK_v2.SUPPORTED_INPUT_SAMPLE_RATES.includes(format.sampleRate)) {\n\n return `Unsupported input sample rate: ${format.sampleRate}. Supported: ${VoiceSDK_v2.SUPPORTED_INPUT_SAMPLE_RATES.join(', ')}`;\n\n }\n\n \n\n if (!format.bitDepth || !VoiceSDK_v2.SUPPORTED_INPUT_BIT_DEPTHS.includes(format.bitDepth)) {\n\n return `Unsupported input bit depth: ${format.bitDepth}. Supported: ${VoiceSDK_v2.SUPPORTED_INPUT_BIT_DEPTHS.join(', ')}`;\n\n }\n\n \n\n if (!format.channels || !VoiceSDK_v2.SUPPORTED_INPUT_CHANNELS.includes(format.channels)) {\n\n return `Unsupported input channels: ${format.channels}. Supported: ${VoiceSDK_v2.SUPPORTED_INPUT_CHANNELS.join(', ')}`;\n\n }\n\n \n\n return null; // Valid\n\n }\n\n \n\n /**\n\n * Validate output audio format (matching backend validation)\n\n * @param {Object} format - Output format to validate\n\n * @returns {string|null} - Error message if invalid, null if valid\n\n */\n\n validateOutputFormat(format) {\n\n if (!format) {\n\n return 'Output format is required';\n\n }\n\n \n\n const encoding = format.encoding?.toLowerCase();\n\n if (!encoding || !VoiceSDK_v2.SUPPORTED_OUTPUT_ENCODINGS.includes(encoding)) {\n\n return `Unsupported output encoding: ${format.encoding}. Supported: ${VoiceSDK_v2.SUPPORTED_OUTPUT_ENCODINGS.join(', ')}`;\n\n }\n\n \n\n if (!format.sampleRate || !VoiceSDK_v2.SUPPORTED_OUTPUT_SAMPLE_RATES.includes(format.sampleRate)) {\n\n return `Unsupported output sample rate: ${format.sampleRate}. Supported: ${VoiceSDK_v2.SUPPORTED_OUTPUT_SAMPLE_RATES.join(', ')}`;\n\n }\n\n \n\n if (!format.bitDepth || !VoiceSDK_v2.SUPPORTED_OUTPUT_BIT_DEPTHS.includes(format.bitDepth)) {\n\n return `Unsupported output bit depth: ${format.bitDepth}. Supported: ${VoiceSDK_v2.SUPPORTED_OUTPUT_BIT_DEPTHS.join(', ')}`;\n\n }\n\n \n\n if (!format.channels || !VoiceSDK_v2.SUPPORTED_OUTPUT_CHANNELS.includes(format.channels)) {\n\n return `Unsupported output channels: ${format.channels}. Supported: ${VoiceSDK_v2.SUPPORTED_OUTPUT_CHANNELS.join(', ')}`;\n\n }\n\n \n\n const container = format.container?.toLowerCase();\n\n if (!container || !VoiceSDK_v2.SUPPORTED_OUTPUT_CONTAINERS.includes(container)) {\n\n return `Unsupported output container: ${format.container}. Supported: ${VoiceSDK_v2.SUPPORTED_OUTPUT_CONTAINERS.join(', ')}`;\n\n }\n\n \n\n return null; // Valid\n\n }\n\n \n\n /**\n\n * Validate SDK configuration and warn/error on invalid formats\n\n */\n\n validateConfig() {\n\n // Validate input format\n\n const inputFormat = {\n\n encoding: 'pcm', // SDK always sends PCM input\n\n sampleRate: this.config.sampleRate,\n\n channels: this.config.channels,\n\n bitDepth: this.config.bitDepth\n\n };\n\n \n\n const inputError = this.validateInputFormat(inputFormat);\n\n if (inputError) {\n\n console.error('❌ VoiceSDK v2: Invalid input format:', inputError);\n\n this.emit('error', new Error(inputError));\n\n return;\n\n }\n\n \n\n // Validate output format\n\n const outputFormat = {\n\n encoding: this.config.outputEncoding,\n\n sampleRate: this.config.outputSampleRate,\n\n channels: this.config.outputChannels,\n\n bitDepth: this.config.outputBitDepth,\n\n container: this.config.outputContainer\n\n };\n\n \n\n const outputError = this.validateOutputFormat(outputFormat);\n\n if (outputError) {\n\n console.error('❌ VoiceSDK v2: Invalid output format:', outputError);\n\n this.emit('error', new Error(outputError));\n\n return;\n\n }\n\n \n\n console.log('✅ VoiceSDK v2: Format validation passed');\n\n }\n\n \n\n /**\n\n * Setup AudioPlayer event listeners\n\n */\n\n setupAudioPlayerEvents() {\n\n this.audioPlayer.on('playbackStarted', () => {\n\n this.isPlaying = true;\n\n this.emit('playbackStarted');\n\n \n\n // Notify server - CRITICAL for barge-in detection\n\n if (this.isConnected) {\n\n console.log('📤 VoiceSDK v2: Sending audio_started_playing message to server');\n\n this.sendMessage({ t: 'audio_started_playing' });\n\n } else {\n\n console.warn('⚠️ VoiceSDK v2: Cannot send audio_started_playing - not connected');\n\n }\n\n });\n\n \n\n this.audioPlayer.on('playbackStopped', () => {\n\n this.isPlaying = false;\n\n this.emit('playbackStopped');\n\n \n\n // Notify server - CRITICAL for barge-in detection\n\n if (this.isConnected) {\n\n console.log('📤 VoiceSDK v2: Sending audio_stopped_playing message to server');\n\n this.sendMessage({ t: 'audio_stopped_playing' });\n\n } else {\n\n console.warn('⚠️ VoiceSDK v2: Cannot send audio_stopped_playing - not connected');\n\n }\n\n });\n\n \n\n this.audioPlayer.on('playbackError', (error) => {\n\n this.emit('playbackError', error);\n\n this.emit('error', error);\n\n });\n\n }\n\n \n\n /**\n\n * Setup AudioRecorder event listeners\n\n */\n\n setupAudioRecorderEvents() {\n\n this.audioRecorder.on('recordingStarted', () => {\n\n this.isRecording = true;\n\n \n\n // If audio is playing, stop it and barge-in\n\n // Check both isPlaying flag and AudioPlayer's actual state (scheduled buffers, sources, etc.)\n\n const audioPlayerStatus = this.audioPlayer.getStatus();\n\n const hasScheduledAudio = (audioPlayerStatus.scheduledBuffers && audioPlayerStatus.scheduledBuffers > 0) || \n\n (audioPlayerStatus.scheduledSourcesCount && audioPlayerStatus.scheduledSourcesCount > 0);\n\n const isActuallyPlaying = this.isPlaying || audioPlayerStatus.isPlaying || hasScheduledAudio;\n\n \n\n console.log('🎤 VoiceSDK v2: Recording started - checking for barge-in...');\n\n console.log(' VoiceSDK.isPlaying:', this.isPlaying);\n\n console.log(' AudioPlayer.isPlaying:', audioPlayerStatus.isPlaying);\n\n console.log(' scheduledBuffers:', audioPlayerStatus.scheduledBuffers || 0);\n\n console.log(' scheduledSourcesCount:', audioPlayerStatus.scheduledSourcesCount || 0);\n\n console.log(' preparedBufferLength:', audioPlayerStatus.preparedBufferLength || 0);\n\n console.log(' isActuallyPlaying:', isActuallyPlaying);\n\n \n\n if (isActuallyPlaying) {\n\n console.log('🛑 VoiceSDK v2: Barge-in detected! Stopping audio playback...');\n\n \n\n this.audioPlayer.stopImmediate();\n\n console.log('✅ VoiceSDK v2: Audio playback stopped');\n\n \n\n if (this.isConnected) {\n\n this.sendMessage({ t: 'barge_in' });\n\n console.log('📤 VoiceSDK v2: Sent barge_in message to server');\n\n } else {\n\n console.warn('⚠️ VoiceSDK v2: Cannot send barge_in - not connected');\n\n }\n\n } else {\n\n console.log('ℹ️ VoiceSDK v2: No audio playing, normal recording start');\n\n }\n\n \n\n this.emit('recordingStarted');\n\n });\n\n \n\n this.audioRecorder.on('recordingStopped', () => {\n\n this.isRecording = false;\n\n this._bargeInChecked = false; // Reset for next recording session\n\n this.emit('recordingStopped');\n\n console.log('🛑 VoiceSDK v2: Recording stopped');\n\n });\n\n \n\n this.audioRecorder.on('audioData', (pcmData) => {\n\n // Check for barge-in on first audio data (user actually speaking)\n\n // This is more reliable than checking on recordingStarted\n\n if (!this._bargeInChecked && this.isRecording) {\n\n this._bargeInChecked = true; // Only check once per recording session\n\n \n\n const audioPlayerStatus = this.audioPlayer.getStatus();\n\n const hasScheduledAudio = (audioPlayerStatus.scheduledBuffers && audioPlayerStatus.scheduledBuffers > 0) || \n\n (audioPlayerStatus.scheduledSourcesCount && audioPlayerStatus.scheduledSourcesCount > 0);\n\n const isActuallyPlaying = this.isPlaying || audioPlayerStatus.isPlaying || hasScheduledAudio;\n\n \n\n if (isActuallyPlaying) {\n\n console.log('🛑 VoiceSDK v2: Barge-in detected on first audio data! Stopping audio playback...');\n\n console.log(' VoiceSDK.isPlaying:', this.isPlaying);\n\n console.log(' AudioPlayer.isPlaying:', audioPlayerStatus.isPlaying);\n\n console.log(' scheduledBuffers:', audioPlayerStatus.scheduledBuffers || 0);\n\n console.log(' scheduledSourcesCount:', audioPlayerStatus.scheduledSourcesCount || 0);\n\n \n\n this.audioPlayer.stopImmediate();\n\n console.log('✅ VoiceSDK v2: Audio playback stopped');\n\n \n\n if (this.isConnected) {\n\n this.sendMessage({ t: 'barge_in' });\n\n console.log('📤 VoiceSDK v2: Sent barge_in message to server');\n\n }\n\n }\n\n }\n\n \n\n // Send audio chunks to server via WebSocket\n // NOTE: Don't check isRecording here - the audioRecorder emits data when it's active\n // This allows continuous frame sending even during barge-in scenarios\n // Matching v1 behavior: frames are sent as long as recorder is producing data\n if (this.isConnected) {\n this.sendBinary(pcmData);\n }\n\n });\n\n \n\n this.audioRecorder.on('error', (error) => {\n\n console.error('❌ AudioRecorder error:', error);\n\n this.emit('error', error);\n\n });\n\n }\n\n \n\n /**\n\n * Build WebSocket URL with query parameters\n\n */\n\n buildWebSocketUrl() {\n\n const baseUrl = this.config.websocketUrl;\n\n const params = new URLSearchParams();\n\n \n\n // Add agentId and appId to query parameters if provided\n\n if (this.config.agentId) {\n\n params.append('agentId', this.config.agentId);\n\n }\n\n \n\n if (this.config.appId) {\n\n params.append('appId', this.config.appId);\n\n }\n\n \n\n // If we have query parameters, append them to the URL\n\n if (params.toString()) {\n\n const separator = baseUrl.includes('?') ? '&' : '?';\n\n return `${baseUrl}${separator}${params.toString()}`;\n\n }\n\n \n\n return baseUrl;\n\n }\n\n \n\n /**\n\n * Connect to WebSocket server\n\n */\n\n async connect() {\n\n if (this.isDestroyed) {\n\n console.warn('VoiceSDK v2: Cannot connect - SDK is destroyed');\n\n return false;\n\n }\n\n \n\n if (this.isConnected) {\n\n console.warn('VoiceSDK v2: Already connected');\n\n return true;\n\n }\n\n \n\n try {\n\n // Build WebSocket URL with query parameters (agentId and appId)\n\n const wsUrl = this.buildWebSocketUrl();\n\n console.log('🔌 VoiceSDK v2: Connecting to', wsUrl);\n\n \n\n return await new Promise((resolve, reject) => {\n\n this.websocket = new WebSocket(wsUrl);\n\n \n\n // Connection opened\n\n this.websocket.onopen = () => {\n\n console.log('✅ VoiceSDK v2: WebSocket connected');\n\n this.isConnected = true;\n\n this.hasEverConnected = true; // Mark that we've successfully connected\n\n \n\n // Send hello message\n\n this.sendHelloMessage();\n\n \n\n this.emit('connected');\n\n resolve(true);\n\n };\n\n \n\n // Connection error\n\n this.websocket.onerror = (error) => {\n\n console.error('❌ VoiceSDK v2: WebSocket error:', error);\n\n reject(error);\n\n };\n\n \n\n // Connection closed\n\n this.websocket.onclose = (event) => {\n\n console.log('🔌 VoiceSDK v2: WebSocket closed:', event.code, event.reason);\n\n this.isConnected = false;\n\n \n\n // Stop recording if active\n\n if (this.isRecording) {\n\n this.stopRecording().catch(err => \n\n console.error('Error stopping recording:', err)\n\n );\n\n }\n\n \n\n this.emit('disconnected', event);\n\n \n\n // Auto-reconnect (if enabled) - only retry if we've successfully connected before\n\n // This prevents infinite retry loops on initial connection failures\n\n if (this.config.autoReconnect && !this.isDestroyed && this.hasEverConnected) {\n\n console.log('🔄 VoiceSDK v2: Auto-reconnecting in 3s...');\n\n setTimeout(() => {\n\n if (!this.isDestroyed && !this.isConnected) {\n\n this.connect();\n\n }\n\n }, 3000);\n\n } else if (this.config.autoReconnect && !this.hasEverConnected) {\n\n console.log('⚠️ VoiceSDK v2: Initial connection failed. Auto-reconnect disabled to prevent retry loop.');\n\n }\n\n };\n\n \n\n // Message received\n\n this.websocket.onmessage = (event) => {\n\n this.handleMessage(event);\n\n };\n\n });\n\n \n\n } catch (error) {\n\n console.error('🔌 VoiceSDK v2: Connection failed:', error);\n\n this.emit('error', error);\n\n return false;\n\n }\n\n }\n\n \n\n /**\n\n * Send hello message with format negotiation\n\n */\n\n sendHelloMessage() {\n\n if (!this.isConnected) {\n\n console.warn('VoiceSDK v2: Cannot send hello - not connected');\n\n return;\n\n }\n\n \n\n // Build input format object\n\n const inputFormat = {\n\n encoding: 'pcm', // \"pcm\", \"pcmu\", \"pcma\"\n\n sampleRate: this.config.sampleRate, // Integer\n\n channels: this.config.channels, // Integer\n\n bitDepth: this.config.bitDepth // Integer\n\n };\n\n \n\n // Build requested output format object\n\n const requestedOutputFormat = {\n\n encoding: this.config.outputEncoding, // \"pcm\", \"pcmu\", \"pcma\"\n\n sampleRate: this.config.outputSampleRate, // Integer\n\n channels: this.config.outputChannels, // Integer\n\n bitDepth: this.config.outputBitDepth, // Integer\n\n container: this.config.outputContainer // \"raw\" or \"wav\" (for output format only)\n\n };\n\n \n\n // Validate formats before sending (matching backend validation)\n\n const inputError = this.validateInputFormat(inputFormat);\n\n if (inputError) {\n\n console.error('❌ VoiceSDK v2: Cannot send hello - invalid input format:', inputError);\n\n this.emit('error', new Error(`Invalid input format: ${inputError}`));\n\n return;\n\n }\n\n \n\n const outputError = this.validateOutputFormat(requestedOutputFormat);\n\n if (outputError) {\n\n console.error('❌ VoiceSDK v2: Cannot send hello - invalid output format:', outputError);\n\n this.emit('error', new Error(`Invalid output format: ${outputError}`));\n\n return;\n\n }\n\n \n\n // Build hello message matching backend ControlMessage structure\n\n const helloMessage = {\n\n t: 'hello',\n\n v: this.config.protocolVersion, // Protocol version (Integer)\n\n inputFormat: inputFormat,\n\n requestedOutputFormat: requestedOutputFormat,\n\n outputFrameDurationMs: this.config.outputFrameDurationMs // Frame duration in milliseconds\n\n };\n\n \n\n // Optional: Agent settings override (Map<String, Object>)\n\n if (this.config.agentSettingsOverride) {\n\n helloMessage.agentSettingsOverride = this.config.agentSettingsOverride;\n\n }\n\n \n\n // Note: appId and agentId are sent as query parameters in WebSocket URL, not in hello message\n\n // (matching v1 behavior and backend expectations)\n\n \n\n console.log('📤 VoiceSDK v2: Sending hello:', {\n\n version: helloMessage.v,\n\n requestedFormat: helloMessage.requestedOutputFormat\n\n });\n\n console.log('📤 VoiceSDK v2: Requested output format:', {\n\n container: helloMessage.requestedOutputFormat.container,\n\n encoding: helloMessage.requestedOutputFormat.encoding,\n\n sampleRate: helloMessage.requestedOutputFormat.sampleRate,\n\n bitDepth: helloMessage.requestedOutputFormat.bitDepth\n\n });\n\n \n\n try {\n\n this.sendMessage(helloMessage);\n\n } catch (error) {\n\n console.error('VoiceSDK v2: Failed to send hello:', error);\n\n this.emit('error', error);\n\n }\n\n }\n\n \n\n /**\n\n * Handle incoming WebSocket message\n\n */\n\n handleMessage(event) {\n\n // Binary message (audio data)\n\n if (event.data instanceof ArrayBuffer || event.data instanceof Blob) {\n\n this.handleBinaryMessage(event.data);\n\n return;\n\n }\n\n \n\n // Text message (JSON)\n\n try {\n\n const message = JSON.parse(event.data);\n\n \n\n console.log('📥 VoiceSDK v2: Received message:', message.t);\n\n \n\n switch (message.t) {\n\n case 'hello_ack':\n\n this.handleHelloAck(message);\n\n break;\n\n \n\n case 'user_transcript':\n\n case 'agent_response':\n\n case 'error':\n\n this.emit('message', message);\n\n break;\n\n \n\n case 'barge_in':\n\n this.emit('bargeIn', message);\n\n this.audioPlayer.stopImmediate();\n\n break;\n\n \n\n case 'stop_playing':\n\n this.emit('stopPlaying', message);\n\n this.audioPlayer.stopImmediate();\n\n break;\n\n \n\n default:\n\n console.log('VoiceSDK v2: Unknown message type:', message.t);\n\n this.emit('message', message);\n\n }\n\n \n\n } catch (error) {\n\n console.error('VoiceSDK v2: Error parsing message:', error);\n\n }\n\n }\n\n \n\n /**\n\n * Handle hello_ack message\n\n */\n\n handleHelloAck(message) {\n\n console.log('📥 VoiceSDK v2: Received hello_ack:', {\n hasOutputFormat: !!message.outputAudioFormat,\n outputFormat: message.outputAudioFormat,\n messageType: message.t\n });\n\n \n\n if (message.outputAudioFormat) {\n\n // v2 protocol: format was negotiated\n\n this.outputAudioFormat = message.outputAudioFormat;\n\n this.audioPlayer.setOutputFormat(message.outputAudioFormat);\n\n \n\n console.log('✅ VoiceSDK v2: Format negotiated by server:', this.outputAudioFormat);\n \n // Store requested format\n this.requestedOutputFormat = {\n container: this.config.outputContainer || 'wav',\n encoding: this.config.outputEncoding || 'pcm',\n sampleRate: this.config.outputSampleRate || 16000,\n bitDepth: this.config.outputBitDepth || 16,\n channels: this.config.outputChannels || 1\n };\n \n const negotiatedFormat = {\n container: this.outputAudioFormat.container || 'unknown',\n encoding: this.outputAudioFormat.encoding || 'unknown',\n sampleRate: this.outputAudioFormat.sampleRate || 0,\n bitDepth: this.outputAudioFormat.bitDepth || 0,\n channels: this.outputAudioFormat.channels || 0\n };\n \n // Check for mismatches and create converter if needed\n const mismatches = [];\n if (this.requestedOutputFormat.container !== negotiatedFormat.container) {\n mismatches.push(`container: \"${this.requestedOutputFormat.container}\" → \"${negotiatedFormat.container}\"`);\n }\n if (this.requestedOutputFormat.encoding !== negotiatedFormat.encoding) {\n mismatches.push(`encoding: \"${this.requestedOutputFormat.encoding}\" → \"${negotiatedFormat.encoding}\"`);\n }\n if (this.requestedOutputFormat.sampleRate !== negotiatedFormat.sampleRate) {\n mismatches.push(`sampleRate: ${this.requestedOutputFormat.sampleRate}Hz → ${negotiatedFormat.sampleRate}Hz`);\n }\n if (this.requestedOutputFormat.bitDepth !== negotiatedFormat.bitDepth) {\n mismatches.push(`bitDepth: ${this.requestedOutputFormat.bitDepth}-bit → ${negotiatedFormat.bitDepth}-bit`);\n }\n if (this.requestedOutputFormat.channels !== negotiatedFormat.channels) {\n mismatches.push(`channels: ${this.requestedOutputFormat.channels} → ${negotiatedFormat.channels}`);\n }\n \n if (mismatches.length > 0) {\n console.warn('⚠️ VoiceSDK v2: Format negotiation mismatch!');\n console.warn(' Requested:', this.requestedOutputFormat);\n console.warn(' Negotiated:', negotiatedFormat);\n console.warn(' Differences:', mismatches.join(', '));\n \n // Create format converter to automatically convert\n try {\n this.formatConverter = new AudioFormatConverter(\n this.requestedOutputFormat,\n negotiatedFormat\n );\n \n if (this.formatConverter.needsConversion()) {\n const steps = this.formatConverter.getConversionSteps();\n console.log('🔄 VoiceSDK v2: Format conversion enabled');\n console.log(' Conversion steps:', steps.join(', '));\n console.log(' Audio will be automatically converted to requested format');\n }\n } catch (error) {\n console.error('❌ VoiceSDK v2: Failed to create format converter:', error);\n console.warn(' Will use backend format without conversion');\n this.formatConverter = null;\n }\n } else {\n console.log('✅ VoiceSDK v2: Format perfectly matched!', negotiatedFormat);\n this.formatConverter = null; // No conversion needed\n }\n\n this.emit('formatNegotiated', this.outputAudioFormat);\n\n \n\n } else {\n\n // v1 protocol: no format info (backward compatibility)\n // OR v2 protocol but backend didn't include outputAudioFormat\n\n if (this.config.protocolVersion >= 2) {\n\n console.warn('⚠️ VoiceSDK v2: hello_ack received but no outputAudioFormat in response.');\n\n console.warn(' This may happen if:');\n\n console.warn(' 1. Backend is not sending outputAudioFormat (check backend logs)');\n\n console.warn(' 2. Hello message missing v2 fields (v, inputFormat, requestedOutputFormat)');\n\n console.warn(' 3. Backend validation failed (check backend error logs)');\n\n console.warn(' Using default format from config...');\n\n } else {\n\n console.log('✅ VoiceSDK v2: Connected (v1 legacy mode)');\n\n }\n\n \n\n // Use defaults from config (already set during initialization, but update if needed)\n\n const defaultFormat = {\n\n container: this.config.outputContainer || 'wav',\n\n encoding: this.config.outputEncoding || 'pcm',\n\n sampleRate: this.config.outputSampleRate || 16000,\n\n channels: this.config.outputChannels || 1,\n\n bitDepth: this.config.outputBitDepth || 16\n\n };\n\n \n\n this.outputAudioFormat = defaultFormat;\n \n this.requestedOutputFormat = defaultFormat; // Same as default when no negotiation\n\n this.audioPlayer.setOutputFormat(defaultFormat);\n \n this.formatConverter = null; // No conversion needed when using defaults\n\n }\n\n }\n\n \n\n /**\n\n * Handle binary audio data\n\n */\n\n async handleBinaryMessage(data) {\n\n // Convert Blob to ArrayBuffer if needed\n\n let arrayBuffer;\n\n if (data instanceof Blob) {\n\n arrayBuffer = await data.arrayBuffer();\n\n } else {\n\n arrayBuffer = data;\n\n }\n\n \n\n console.log('📥 VoiceSDK v2: Received audio:', arrayBuffer.byteLength, 'bytes');\n\n \n\n // Convert format if needed (before passing to AudioPlayer)\n let processedAudio = arrayBuffer;\n \n if (this.formatConverter && this.formatConverter.needsConversion()) {\n try {\n processedAudio = await this.formatConverter.convert(arrayBuffer);\n console.log('✅ VoiceSDK v2: Audio converted to requested format');\n } catch (error) {\n console.error('❌ VoiceSDK v2: Format conversion failed:', error);\n console.warn(' Using backend format without conversion');\n processedAudio = arrayBuffer; // Fall back to original\n }\n }\n \n // Determine format for playback (use requested format if converter was used, otherwise use negotiated)\n const playbackFormat = this.formatConverter && this.formatConverter.needsConversion() \n ? this.requestedOutputFormat \n : (this.outputAudioFormat || {\n container: this.config.outputContainer || 'raw',\n encoding: this.config.outputEncoding || 'pcm',\n sampleRate: this.config.outputSampleRate || 16000,\n bitDepth: this.config.outputBitDepth || 16,\n channels: this.config.outputChannels || 1\n });\n \n const container = playbackFormat.container || 'raw';\n const encoding = (playbackFormat.encoding || 'pcm').toLowerCase();\n \n if (container === 'raw') {\n // Raw audio - decode if needed, then use playChunk for seamless scheduling\n let pcmData = processedAudio;\n \n if (encoding !== 'pcm') {\n // Need to decode PCMU/PCMA to PCM\n const codec = this.audioPlayer.getCodec(encoding);\n if (codec) {\n const decoded = codec.decode(new Uint8Array(processedAudio));\n pcmData = decoded.buffer;\n console.log(`🔄 VoiceSDK v2: Decoded ${encoding.toUpperCase()} to PCM (${decoded.byteLength} bytes)`);\n } else {\n console.warn(`⚠️ VoiceSDK v2: No codec for ${encoding}, treating as PCM`);\n }\n }\n \n // Ensure outputFormat is set on AudioPlayer before playing chunks\n // This is critical for raw PCM playback\n if (!this.audioPlayer.outputFormat) {\n console.warn('⚠️ VoiceSDK v2: outputFormat not set on AudioPlayer, setting from playbackFormat');\n this.audioPlayer.setOutputFormat(playbackFormat);\n }\n \n // Use playChunk for seamless scheduling\n this.audioPlayer.playChunk(pcmData);\n } else {\n // WAV or other - use playAudio which handles headers\n this.audioPlayer.playAudio(processedAudio);\n }\n\n }\n\n \n\n /**\n\n * Send message to server\n\n */\n\n sendMessage(message) {\n\n if (!this.websocket || this.websocket.readyState !== WebSocket.OPEN) {\n\n console.warn('VoiceSDK v2: Cannot send message - not connected');\n\n return false;\n\n }\n\n \n\n try {\n\n this.websocket.send(JSON.stringify(message));\n\n return true;\n\n } catch (error) {\n\n console.error('VoiceSDK v2: Error sending message:', error);\n\n this.emit('error', error);\n\n return false;\n\n }\n\n }\n\n \n\n /**\n\n * Send binary audio data to server\n\n */\n\n sendBinary(audioData) {\n\n if (!this.websocket || this.websocket.readyState !== WebSocket.OPEN) {\n\n console.warn('VoiceSDK v2: Cannot send audio - not connected');\n\n return false;\n\n }\n\n \n\n try {\n\n this.websocket.send(audioData);\n\n return true;\n\n } catch (error) {\n\n console.error('VoiceSDK v2: Error sending audio:', error);\n\n this.emit('error', error);\n\n return false;\n\n }\n\n }\n\n \n\n /**\n\n * Disconnect from server\n\n */\n\n disconnect() {\n\n if (this.isDestroyed) return;\n\n \n\n console.log('🔌 VoiceSDK v2: Disconnecting...');\n\n \n\n this.stopRecording();\n\n \n // Stop audio playback and clear queues (like v1)\n if (this.audioPlayer) {\n this.audioPlayer.stopImmediate();\n }\n\n if (this.websocket) {\n\n this.websocket.close();\n\n this.websocket = null;\n\n }\n\n \n\n this.isConnected = false;\n\n }\n\n \n\n /**\n\n * Start recording audio from microphone\n\n */\n\n async startRecording() {\n\n if (!this.isConnected) {\n\n const error = new Error('Not connected to voice server');\n\n this.emit('error', error);\n\n throw error;\n\n }\n\n \n\n if (this.isRecording) {\n\n console.warn('VoiceSDK v2: Already recording');\n\n return true;\n\n }\n\n \n\n console.log('🎤 VoiceSDK v2: Starting recording...');\n\n \n\n try {\n\n // Send start_continuous_mode message to server\n\n this.sendMessage({\n\n t: 'start_continuous_mode',\n\n ttpId: this.generateTtpId()\n\n });\n\n \n\n // Start capturing audio from microphone\n\n await this.audioRecorder.start();\n\n \n\n return true;\n\n \n\n } catch (error) {\n\n console.error('❌ VoiceSDK v2: Failed to start recording:', error);\n\n this.emit('error', error);\n\n return false;\n\n }\n\n }\n\n \n\n /**\n\n * Stop recording audio\n\n */\n\n async stopRecording() {\n\n if (!this.isRecording) {\n\n console.warn('VoiceSDK v2: Not recording');\n\n return true;\n\n }\n\n \n\n console.log('🛑 VoiceSDK v2: Stopping recording...');\n\n \n\n try {\n\n // Send stop_continuous_mode message to server\n\n this.sendMessage({\n\n t: 'stop_continuous_mode',\n\n ttpId: this.generateTtpId()\n\n });\n\n \n\n // Stop capturing audio from microphone\n\n await this.audioRecorder.stop();\n\n \n\n // Stop any playing audio\n\n this.audioPlayer.stopImmediate();\n\n \n\n return true;\n\n \n\n } catch (error) {\n\n console.error('VoiceSDK v2: Error stopping recording:', error);\n\n this.emit('error', error);\n\n return false;\n\n }\n\n }\n\n \n\n /**\n\n * Toggle recording on/off\n\n */\n\n async toggleRecording() {\n\n if (this.isRecording) {\n\n return await this.stopRecording();\n\n } else {\n\n return await this.startRecording();\n\n }\n\n }\n\n \n\n /**\n\n * Stop audio playback\n\n */\n\n stopAudioPlayback() {\n\n this.audioPlayer.stopImmediate();\n\n }\n\n \n\n /**\n\n * Handle barge-in (interrupt agent, start listening)\n\n */\n\n async handleBargeIn() {\n\n this.stopAudioPlayback();\n\n \n\n if (!this.isRecording) {\n\n await this.startRecording();\n\n }\n\n }\n\n \n\n /**\n\n * Get SDK status\n\n */\n\n getStatus() {\n\n return {\n\n version: this.version,\n\n isConnected: this.isConnected,\n\n isRecording: this.isRecording,\n\n isPlaying: this.isPlaying,\n\n outputFormat: this.outputAudioFormat,\n\n audioPlayer: this.audioPlayer.getStatus(),\n\n audioRecorder: this.audioRecorder.getStatus()\n\n };\n\n }\n\n \n\n /**\n\n * Update configuration\n\n */\n\n updateConfig(newConfig) {\n\n this.config = { ...this.config, ...newConfig };\n\n }\n\n \n\n /**\n\n * Generate unique TTP ID\n\n */\n\n generateTtpId() {\n\n return 'sdk_' + Math.random().toString(36).substr(2, 9) + '_' + Date.now();\n\n }\n\n \n\n /**\n\n * Destroy SDK and cleanup resources\n\n */\n\n destroy() {\n\n if (this.isDestroyed) return;\n\n \n\n console.log('🗑️ VoiceSDK v2: Destroying...');\n\n \n\n this.disconnect();\n\n this.isDestroyed = true;\n\n \n\n // Cleanup components\n\n if (this.audioPlayer) {\n\n this.audioPlayer.destroy();\n\n }\n\n \n\n if (this.audioRecorder) {\n\n this.audioRecorder.destroy();\n\n }\n\n \n\n this.removeAllListeners();\n\n }\n\n}\n\n\n\nexport default VoiceSDK_v2;\n\n","/**\n * TextChatSDK - Single-shot WebSocket per message\n * - Opens a new WS to /chat for each message, streams chunks, emits events, then closes\n * - Persists conversationId locally to allow continuity across messages\n */\nimport EventEmitter from './EventEmitter.js';\n\nexport default class TextChatSDK extends EventEmitter {\n constructor(config = {}) {\n super();\n \n const scriptConfig = this.readScriptTagConfig();\n\n this.config = {\n // Prefer SockJS native upgrade endpoint directly to avoid an initial failed attempt on /chat\n baseWsUrl: 'wss://backend.talktopc.com/chat/websocket',\n appId: config.appId || scriptConfig.appId,\n agentId: config.agentId || scriptConfig.agentId,\n conversationId: config.conversationId !== undefined ? config.conversationId : this.getPersistedConversationId(),\n // Optional testing override: force a specific conversationId for all sends\n forceConversationId: config.forceConversationId,\n // queueing behavior\n queue: [],\n inFlight: false,\n ...config\n };\n \n this.fullResponseBuffer = '';\n }\n\n // Read appId/agentId from the embedding script tag data attributes\n readScriptTagConfig() {\n try {\n const scripts = Array.from(document.getElementsByTagName('script'));\n const sdkScript = scripts.reverse().find(s => (s.dataset && (s.dataset.appId || s.dataset.agentId)) || (s.src && s.src.includes('agent-widget')));\n if (!sdkScript) return {};\n return {\n appId: sdkScript.dataset.appId,\n agentId: sdkScript.dataset.agentId\n };\n } catch (_) {\n return {};\n }\n }\n\n // Build WS URL with query params\n buildWebSocketUrl(base = this.config.baseWsUrl) {\n const params = new URLSearchParams();\n if (this.config.appId) params.append('appId', this.config.appId);\n if (this.config.agentId) params.append('agentId', this.config.agentId);\n if (this.config.conversationId) params.append('conversationId', this.config.conversationId);\n return `${base}?${params.toString()}`;\n }\n\n // Public API: sendMessage opens a fresh WS, streams, then closes\n async sendMessage(text) {\n return new Promise((resolve, reject) => {\n if (!text || !text.trim()) {\n reject(new Error('Message is empty'));\n return;\n }\n if (!this.config.appId || !this.config.agentId) {\n reject(new Error('Missing appId or agentId'));\n return;\n }\n \n const task = { text, resolve, reject };\n if (this.config.inFlight) {\n this.config.queue.push(task);\n } else {\n this.executeTask(task);\n }\n });\n }\n\n executeTask(task) {\n this.config.inFlight = true;\n this.fullResponseBuffer = '';\n\n // If conversationId is missing in memory, try to hydrate from localStorage before sending\n if (!this.config.conversationId) {\n const persisted = this.getPersistedConversationId();\n if (persisted) {\n this.config.conversationId = persisted;\n console.log('🔍 TextChatSDK hydrated conversationId from storage:', persisted);\n }\n }\n\n const primaryUrl = this.buildWebSocketUrl(this.config.baseWsUrl);\n const fallbackBase = this.config.baseWsUrl.endsWith('/websocket')\n ? this.config.baseWsUrl.replace(/\\/websocket$/, '')\n : `${this.config.baseWsUrl}/websocket`;\n const fallbackUrl = this.buildWebSocketUrl(fallbackBase);\n let triedFallback = false;\n\n let messageSent = false;\n let helloWaitTimer = null;\n\n const sendPayload = (socket) => {\n if (messageSent) return;\n try {\n const payload = { message: task.text };\n const effectiveConvId = this.config.forceConversationId || this.config.conversationId;\n if (effectiveConvId) {\n payload.conversationId = effectiveConvId;\n // Persist and keep in-memory if coming from a forced value (test mode)\n if (this.config.forceConversationId && !this.config.conversationId) {\n this.config.conversationId = effectiveConvId;\n this.persistConversationId(effectiveConvId);\n }\n }\n console.log('🔍 TextChatSDK sending payload:', payload, 'conversationId in config:', this.config.conversationId);\n socket.send(JSON.stringify(payload));\n messageSent = true;\n } catch (e) {\n task.reject(e);\n this.emit('error', e);\n try { socket.close(); } catch (_) {}\n }\n };\n\n const handleOpen = (socket) => () => {\n // Wait briefly for server 'hello' to capture conversationId before first send\n // If no hello within 200ms, send anyway\n if (!this.config.conversationId) {\n helloWaitTimer = setTimeout(() => sendPayload(socket), 200);\n } else {\n sendPayload(socket);\n }\n };\n\n const handleMessage = (socket) => (evt) => {\n try {\n try { console.log('🔎 [TextChatSDK] WS <= raw:', evt.data); } catch (_) {}\n const data = JSON.parse(evt.data);\n try { console.log('🔎 [TextChatSDK] WS <= parsed:', data); } catch (_) {}\n // Capture conversationId handshake from server\n if (data.type === 'hello' && data.conversationId) {\n // Persist the conversation id for subsequent messages\n console.log('🔍 TextChatSDK received conversationId:', data.conversationId);\n this.config.conversationId = data.conversationId;\n this.persistConversationId(data.conversationId);\n this.emit && this.emit('conversationIdChanged', data.conversationId);\n // If we were waiting to send the first message, send it now\n if (!messageSent && socket && socket.readyState === 1) {\n if (helloWaitTimer) { try { clearTimeout(helloWaitTimer); } catch (_) {} }\n sendPayload(socket);\n }\n return; // nothing else to do for handshake\n }\n // Fallback: capture conversationId if present on any message shape\n if (!this.config.conversationId && data.conversationId) {\n console.log('🔍 TextChatSDK captured conversationId from message:', data.conversationId);\n this.config.conversationId = data.conversationId;\n this.persistConversationId(data.conversationId);\n }\n if (data.type === 'chunk' && typeof data.content === 'string') {\n this.fullResponseBuffer += data.content;\n this.emit('chunk', data.content);\n } else if (data.type === 'done') {\n // If server sent a final text in the done payload, capture it for non-streaming backends\n try {\n const finalText = data.text || data.content || data.answer || data.message || '';\n if (finalText && !this.fullResponseBuffer) {\n this.fullResponseBuffer = finalText;\n }\n } catch (_) {}\n // Persist conversationId if provided on completion (fallback when hello was missed)\n if (!this.config.conversationId && data.conversationId) {\n console.log('🔍 TextChatSDK captured conversationId from done:', data.conversationId);\n this.config.conversationId = data.conversationId;\n }\n this.persistConversationId(this.config.conversationId);\n this.emit('done', { text: this.fullResponseBuffer });\n task.resolve({ conversationId: this.config.conversationId, fullText: this.fullResponseBuffer });\n try { socket.close(); } catch (_) {}\n } else if (data.type === 'error') {\n const err = new Error(data.message || 'Server error');\n this.emit('error', err);\n task.reject(err);\n try { socket.close(); } catch (_) {}\n }\n } catch (e) {\n // Non-JSON or parse error; ignore or surface\n }\n };\n\n const handleError = (socket) => (e) => {\n // Try alternate path once: toggle /websocket suffix\n if (!triedFallback) {\n triedFallback = true;\n try { socket.close(); } catch (_) {}\n const fb = new WebSocket(fallbackUrl);\n fb.onopen = handleOpen(fb);\n fb.onmessage = handleMessage(fb);\n fb.onerror = (err) => {\n this.emit('error', err);\n task.reject(err);\n };\n fb.onclose = handleClose;\n return;\n }\n this.emit('error', e);\n task.reject(e);\n };\n\n const handleClose = (event) => {\n // Check if connection was closed due to domain whitelist violation\n if (event.code === 1008 && event.reason && \n (event.reason.includes('Domain not whitelisted') || \n event.reason.includes('domain') || \n event.reason.includes('whitelist'))) {\n const domainError = new Error('DOMAIN_NOT_WHITELISTED');\n domainError.reason = event.reason;\n domainError.code = event.code;\n // Only emit domainError, not error - to avoid duplicate handling\n this.emit('domainError', domainError);\n task.reject(domainError);\n // Reset inFlight and drain queue to allow subsequent messages\n this.config.inFlight = false;\n this.drainQueue();\n return;\n }\n \n this.config.inFlight = false;\n this.drainQueue();\n };\n\n const ws = new WebSocket(primaryUrl);\n ws.onopen = handleOpen(ws);\n ws.onmessage = handleMessage(ws);\n ws.onerror = handleError(ws);\n ws.onclose = handleClose;\n }\n\n drainQueue() {\n if (this.config.queue.length === 0 || this.config.inFlight) return;\n const next = this.config.queue.shift();\n this.executeTask(next);\n }\n\n persistConversationId(conversationId) {\n try {\n if (conversationId) localStorage.setItem('ttp_text_chat_conversation_id', conversationId);\n } catch (_) {}\n }\n\n getPersistedConversationId() {\n try {\n return localStorage.getItem('ttp_text_chat_conversation_id') || null;\n } catch (_) {\n return null;\n }\n }\n\n updateConfig(newConfig) {\n this.config = { ...this.config, ...newConfig };\n }\n \n destroy() {\n this.config.queue = [];\n this.config.inFlight = false;\n this.removeAllListeners();\n }\n}\n\n","/**\n * VoiceButton - React component for voice interaction\n */\nimport React, { useState, useEffect, useRef } from 'react';\nimport VoiceSDK from '../core/VoiceSDK.js';\n\nconst VoiceButton = ({ \n websocketUrl,\n agentId, // Optional - for direct agent access (unsecured method)\n appId, // Required - User's app ID for authentication\n voice = 'default',\n language = 'en',\n autoReconnect = true,\n \n // NEW: Agent settings override (only available with signed link)\n agentSettingsOverride = null,\n \n onConnected,\n onDisconnected,\n onRecordingStarted,\n onRecordingStopped,\n onPlaybackStarted,\n onPlaybackStopped,\n onError,\n onMessage,\n onBargeIn,\n onStopPlaying,\n className = '',\n style = {},\n children\n}) => {\n const [isConnected, setIsConnected] = useState(false);\n const [isRecording, setIsRecording] = useState(false);\n const [isPlaying, setIsPlaying] = useState(false);\n const [connectionStatus, setConnectionStatus] = useState('Disconnected');\n \n const voiceSDKRef = useRef(null);\n \n // Initialize VoiceSDK\n useEffect(() => {\n console.log(`🎙️ VoiceButton: Creating VoiceSDK instance for ${websocketUrl}`);\n \n // Clean up existing instance if any\n if (voiceSDKRef.current) {\n console.log(`🎙️ VoiceButton: Destroying existing VoiceSDK instance`);\n voiceSDKRef.current.destroy();\n voiceSDKRef.current = null;\n }\n \n const voiceSDK = new VoiceSDK({\n websocketUrl,\n agentId, // Pass through agentId if provided\n appId, // Required for authentication\n voice,\n language,\n autoReconnect,\n agentSettingsOverride // Pass through agent settings override\n });\n \n // Setup event listeners\n voiceSDK.on('connected', () => {\n setIsConnected(true);\n setConnectionStatus('Connected');\n onConnected?.();\n });\n \n voiceSDK.on('disconnected', () => {\n setIsConnected(false);\n setConnectionStatus('Disconnected');\n onDisconnected?.();\n });\n \n voiceSDK.on('recordingStarted', () => {\n setIsRecording(true);\n onRecordingStarted?.();\n });\n \n voiceSDK.on('recordingStopped', () => {\n setIsRecording(false);\n onRecordingStopped?.();\n });\n \n voiceSDK.on('playbackStarted', () => {\n setIsPlaying(true);\n onPlaybackStarted?.();\n });\n \n voiceSDK.on('playbackStopped', () => {\n setIsPlaying(false);\n onPlaybackStopped?.();\n });\n \n voiceSDK.on('error', (error) => {\n onError?.(error);\n });\n \n voiceSDK.on('message', (message) => {\n onMessage?.(message);\n });\n \n voiceSDK.on('bargeIn', (message) => {\n onBargeIn?.(message);\n });\n \n voiceSDK.on('stopPlaying', (message) => {\n onStopPlaying?.(message);\n });\n \n voiceSDKRef.current = voiceSDK;\n \n // Auto-connect\n voiceSDK.connect();\n \n // Cleanup on unmount\n return () => {\n console.log(`🎙️ VoiceButton: Cleaning up VoiceSDK instance for ${websocketUrl}`);\n if (voiceSDKRef.current) {\n voiceSDKRef.current.destroy();\n voiceSDKRef.current = null;\n }\n };\n }, [websocketUrl, agentId, appId, voice, language, agentSettingsOverride]);\n \n // Handle button click\n const handleClick = async () => {\n if (!voiceSDKRef.current) return;\n \n try {\n await voiceSDKRef.current.toggleRecording();\n } catch (error) {\n console.error('Error toggling recording:', error);\n }\n };\n \n // Default button content\n const defaultContent = (\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <div style={{ fontSize: '20px' }}>\n {isRecording ? '🔴' : '🎤'}\n </div>\n <div>\n {isRecording ? 'Stop Listening' : 'Start Listening'}\n </div>\n </div>\n );\n \n return (\n <button\n className={`voice-button ${isRecording ? 'recording' : ''} ${className}`}\n style={{\n padding: '12px 24px',\n border: 'none',\n borderRadius: '8px',\n backgroundColor: isRecording ? '#dc3545' : '#007bff',\n color: 'white',\n cursor: 'pointer',\n fontSize: '16px',\n fontWeight: '500',\n transition: 'all 0.2s ease',\n ...style\n }}\n onClick={handleClick}\n disabled={!isConnected}\n >\n {children || defaultContent}\n </button>\n );\n};\n\nexport default VoiceButton;\n","/**\n * VoiceButton - Vanilla JavaScript voice button\n */\nimport VoiceSDK from '../core/VoiceSDK.js';\n\nexport default class VoiceButton {\n constructor(options = {}) {\n this.options = {\n websocketUrl: options.websocketUrl || 'wss://speech.talktopc.com/ws/conv',\n agentId: options.agentId, // Optional - for direct agent access (unsecured method)\n voice: options.voice || 'default',\n language: options.language || 'en',\n container: options.container || document.body,\n buttonText: options.buttonText || 'Start Listening',\n buttonClass: options.buttonClass || 'voice-button',\n ...options\n };\n \n this.isConnected = false;\n this.isRecording = false;\n this.isPlaying = false;\n \n this.voiceSDK = new VoiceSDK({\n websocketUrl: this.options.websocketUrl,\n agentId: this.options.agentId, // Pass through agentId if provided\n voice: this.options.voice,\n language: this.options.language\n });\n \n this.setupEventListeners();\n this.createButton();\n this.connect();\n }\n \n /**\n * Setup event listeners\n */\n setupEventListeners() {\n this.voiceSDK.on('connected', () => {\n this.isConnected = true;\n this.updateButton();\n this.options.onConnected?.();\n });\n \n this.voiceSDK.on('disconnected', () => {\n this.isConnected = false;\n this.updateButton();\n this.options.onDisconnected?.();\n });\n \n this.voiceSDK.on('recordingStarted', () => {\n this.isRecording = true;\n this.updateButton();\n this.options.onRecordingStarted?.();\n });\n \n this.voiceSDK.on('recordingStopped', () => {\n this.isRecording = false;\n this.updateButton();\n this.options.onRecordingStopped?.();\n });\n \n this.voiceSDK.on('playbackStarted', () => {\n this.isPlaying = true;\n this.options.onPlaybackStarted?.();\n });\n \n this.voiceSDK.on('playbackStopped', () => {\n this.isPlaying = false;\n this.options.onPlaybackStopped?.();\n });\n \n this.voiceSDK.on('error', (error) => {\n this.options.onError?.(error);\n });\n \n this.voiceSDK.on('message', (message) => {\n this.options.onMessage?.(message);\n });\n \n this.voiceSDK.on('bargeIn', (message) => {\n this.options.onBargeIn?.(message);\n });\n \n this.voiceSDK.on('stopPlaying', (message) => {\n this.options.onStopPlaying?.(message);\n });\n }\n \n /**\n * Create the button element\n */\n createButton() {\n this.button = document.createElement('button');\n this.button.className = this.options.buttonClass;\n this.button.style.cssText = `\n padding: 12px 24px;\n border: none;\n border-radius: 8px;\n background-color: #6c757d;\n color: white;\n cursor: pointer;\n font-size: 16px;\n font-weight: 500;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n gap: 8px;\n `;\n \n this.button.addEventListener('click', () => this.toggleRecording());\n this.options.container.appendChild(this.button);\n \n this.updateButton();\n }\n \n /**\n * Update button appearance and state\n */\n updateButton() {\n if (!this.button) return;\n \n const icon = this.isRecording ? '🔴' : '🎤';\n const text = this.isRecording ? 'Stop Listening' : 'Start Listening';\n \n this.button.innerHTML = `\n <span style=\"font-size: 20px;\">${icon}</span>\n <span>${text}</span>\n `;\n \n this.button.disabled = !this.isConnected;\n this.button.style.backgroundColor = this.isRecording ? '#dc3545' : \n this.isConnected ? '#007bff' : '#6c757d';\n }\n \n /**\n * Connect to voice server\n */\n async connect() {\n try {\n await this.voiceSDK.connect();\n } catch (error) {\n console.error('Failed to connect:', error);\n }\n }\n \n /**\n * Toggle recording\n */\n async toggleRecording() {\n if (!this.voiceSDK) return;\n \n try {\n await this.voiceSDK.toggleRecording();\n } catch (error) {\n console.error('Error toggling recording:', error);\n }\n }\n \n /**\n * Get current status\n */\n getStatus() {\n return {\n isConnected: this.isConnected,\n isRecording: this.isRecording,\n isPlaying: this.isPlaying\n };\n }\n \n /**\n * Update configuration\n */\n updateConfig(newConfig) {\n this.voiceSDK.updateConfig(newConfig);\n }\n \n /**\n * Destroy the button and cleanup\n */\n destroy() {\n if (this.button && this.button.parentNode) {\n this.button.parentNode.removeChild(this.button);\n }\n \n if (this.voiceSDK) {\n this.voiceSDK.destroy();\n }\n }\n}\n","/**\n * Legacy AgentSDK - Backward Compatibility Layer\n * \n * This maintains the original AgentSDK API while using the new VoiceSDK internally.\n * This ensures existing integrations continue to work without changes.\n */\n\nimport { VoiceSDK } from '../index.js';\n\nexport class AgentSDK {\n constructor(config) {\n console.log('🚀 AgentSDK v2.1.8 initialized with config:', config);\n this.config = config;\n this.voiceSDK = null;\n this.isConnected = false;\n this.isListening = false;\n \n // Legacy callback properties\n this.onConnected = () => {};\n this.onDisconnected = () => {};\n this.onError = (error) => console.error('SDK Error:', error);\n this.onTranscript = (text) => {};\n this.onAgentSpeaking = (isStart) => {};\n }\n\n async connect(signedUrl) {\n try {\n if (!signedUrl) {\n throw new Error('signedUrl is required');\n }\n \n // Clean up existing connection if any\n if (this.voiceSDK) {\n console.log('🔌 AgentSDK: Cleaning up existing connection');\n this.voiceSDK.destroy();\n this.voiceSDK = null;\n }\n \n // Create VoiceSDK instance\n this.voiceSDK = new VoiceSDK({\n websocketUrl: signedUrl,\n autoReconnect: false,\n agentId: this.config.agentId,\n appId: this.config.appId,\n language: this.config.language || 'en'\n });\n \n // Set up event handlers to map to legacy callbacks\n this.voiceSDK.on('connected', () => {\n this.isConnected = true;\n this.onConnected();\n });\n \n this.voiceSDK.on('disconnected', (event) => {\n this.isConnected = false;\n // Check if disconnect was due to domain whitelist violation\n if (event && event.code === 1008 && event.reason && \n (event.reason.includes('Domain not whitelisted') || \n event.reason.includes('domain') || \n event.reason.includes('whitelist'))) {\n const domainError = new Error('DOMAIN_NOT_WHITELISTED');\n domainError.reason = event.reason;\n domainError.code = event.code;\n this.onError(domainError);\n }\n this.onDisconnected();\n });\n \n this.voiceSDK.on('domainError', (error) => {\n this.onError(error);\n });\n \n this.voiceSDK.on('error', (error) => {\n this.onError(error);\n });\n \n this.voiceSDK.on('message', (message) => {\n this.handleWebSocketMessage(message);\n });\n \n this.voiceSDK.on('recordingStarted', () => {\n this.isListening = true;\n });\n \n this.voiceSDK.on('recordingStopped', () => {\n this.isListening = false;\n });\n \n this.voiceSDK.on('playbackStarted', () => {\n this.onAgentSpeaking(true);\n });\n \n this.voiceSDK.on('playbackStopped', () => {\n this.onAgentSpeaking(false);\n });\n \n // Connect using VoiceSDK\n await this.voiceSDK.connect();\n \n } catch (error) {\n this.onError(error);\n throw error;\n }\n }\n\n handleWebSocketMessage(message) {\n // Map new message format to legacy format\n switch (message.type) {\n case 'connected':\n console.log('Session started successfully');\n break;\n \n case 'user_transcript':\n this.onTranscript(message.user_transcription || message.text);\n break;\n \n case 'agent_response':\n // Handle agent text response\n break;\n \n case 'barge_in':\n // Handle barge-in\n break;\n \n case 'stop_playing':\n // Handle stop playing\n break;\n \n case 'error':\n this.onError(new Error(message.message));\n break;\n }\n }\n\n async startListening() {\n console.log('🎤 AgentSDK: startListening() called');\n if (this.voiceSDK) {\n try {\n console.log('🎤 AgentSDK: Starting recording...');\n await this.voiceSDK.startRecording();\n console.log('✅ AgentSDK: Recording started successfully');\n } catch (error) {\n console.error('❌ AgentSDK: Failed to start recording:', error);\n throw error;\n }\n } else {\n console.error('❌ AgentSDK: No voiceSDK instance available');\n throw new Error('No voiceSDK instance available');\n }\n }\n\n stopListening() {\n if (this.voiceSDK) {\n this.voiceSDK.stopRecording();\n }\n }\n\n updateVariables(variables) {\n if (this.voiceSDK && this.isConnected) {\n // Send variables update message\n this.voiceSDK.webSocketManager.sendMessage({\n t: 'update_variables',\n variables\n });\n }\n }\n\n disconnect() {\n if (this.voiceSDK) {\n this.voiceSDK.destroy();\n this.voiceSDK = null;\n }\n this.isConnected = false;\n this.isListening = false;\n }\n}\n","/**\n * VoiceInterface - Handles voice call UI and functionality\n * Part of the unified TTPChatWidget\n * Optimized for Wix iframe embedding\n */\n\nimport { AgentSDK } from '../index.js';\n\nexport class VoiceInterface {\n constructor(config) {\n this.config = config;\n this.audioStream = null;\n this.callStartTime = null;\n this.callTimerInterval = null;\n this.sdk = null;\n this.isActive = false;\n \n // Initialize AgentSDK for voice connection\n this.sdk = new AgentSDK({\n agentId: config.agentId,\n appId: config.appId,\n getSessionUrl: config.getSessionUrl,\n websocketUrl: config.websocketUrl,\n variables: config.variables || {},\n language: config.language || 'en'\n });\n \n // Setup SDK event handlers\n this.setupSDKEventHandlers();\n }\n \n /**\n * Setup event handlers for AgentSDK\n */\n setupSDKEventHandlers() {\n // Handle transcript updates\n this.sdk.onTranscript = (text) => {\n this.updateTranscript(text);\n };\n \n // Handle agent speaking state\n this.sdk.onAgentSpeaking = (isStart) => {\n const avatar = document.getElementById('voiceAvatarActive');\n if (avatar) {\n if (isStart) {\n avatar.classList.add('speaking');\n } else {\n avatar.classList.remove('speaking');\n }\n }\n };\n \n // Handle websocket disconnection - hangup the call\n this.sdk.onDisconnected = () => {\n console.log('🔌 WebSocket disconnected, hanging up call...');\n // Only hangup if call is still active (prevents duplicate calls)\n if (this.isActive) {\n // Set isActive to false first to prevent re-entry\n this.isActive = false;\n this.endVoiceCall();\n }\n };\n \n // Handle errors\n this.sdk.onError = (error) => {\n console.error('❌ Voice SDK Error:', error);\n // Check if it's a domain error\n if (error && (error.message === 'DOMAIN_NOT_WHITELISTED' || \n (error.message && error.message.includes('Domain not whitelisted')))) {\n this.showDomainError();\n } else {\n this.showError(error.message || error);\n }\n };\n }\n\n /**\n * Helper function to get translated text\n */\n t(key) {\n const lang = this.config.language || 'en';\n const translations = this.config.translations?.[lang] || this.config.translations?.en || {};\n return translations[key] || key;\n }\n\n getTooltip(key) {\n const tooltip = this.config.tooltips?.[key];\n if (tooltip !== null && tooltip !== undefined) return tooltip;\n // Use translations for default tooltips\n const defaults = {\n mute: this.t('mute'),\n speaker: this.t('speaker'),\n endCall: this.t('endCall')\n };\n return defaults[key] || '';\n }\n\n /**\n * Generate HTML for voice interface\n */\n generateHTML() {\n return `<div class=\"voice-interface\" id=\"voiceInterface\">\n <!-- Before Call State -->\n <div id=\"voiceIdleState\">\n <div class=\"voice-avatar\" id=\"voiceAvatar\">🤖</div>\n <div class=\"voice-status\">\n <div class=\"voice-status-title\">${this.t('clickToStartCall')}</div>\n <div class=\"voice-status-subtitle\">${this.t('realTimeVoice')}</div>\n </div>\n <button class=\"start-call-btn\" id=\"startCallBtn\">\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M20.01 15.38c-1.23 0-2.42-.2-3.53-.56-.35-.12-.74-.03-1.01.24l-1.57 1.97c-2.83-1.35-5.48-3.9-6.89-6.83l1.95-1.66c.27-.28.35-.67.24-1.02-.37-1.11-.56-2.3-.56-3.53 0-.54-.45-.99-.99-.99H4.19C3.65 3 3 3.24 3 3.99 3 13.28 10.73 21 20.01 21c.71 0 .99-.63.99-1.18v-3.45c0-.54-.45-.99-.99-.99z\"/>\n </svg>\n <span>${this.t('startCall')}</span>\n </button>\n </div>\n <!-- During Call State -->\n <div id=\"voiceActiveState\" style=\"display: none;\">\n <div class=\"voice-avatar-active\" id=\"voiceAvatarActive\">\n <div class=\"voice-rings\">\n <div class=\"voice-ring\"></div>\n <div class=\"voice-ring\"></div>\n <div class=\"voice-ring\"></div>\n </div>\n 🤖\n </div>\n <div class=\"voice-status\">\n <div class=\"voice-status-title\" id=\"voiceStatusTitleActive\">${this.t('listening')}</div>\n <div class=\"voice-status-subtitle\" id=\"voiceStatusSubtitleActive\">${this.t('speakFreely')}</div>\n </div>\n <div class=\"voice-transcript\">\n <div class=\"transcript-label\">${this.t('liveTranscript')}</div>\n <div class=\"transcript-text empty\" id=\"transcriptText\">\n ${this.t('transcriptWillAppear')}\n </div>\n </div>\n <div class=\"voice-controls\">\n <button class=\"voice-control-btn secondary\" id=\"muteBtn\" title=\"${this.getTooltip('mute')}\">\n <svg width=\"64\" height=\"64\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"mute-icon\">\n <path d=\"M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z\"/>\n <path d=\"M19 10v2a7 7 0 0 1-14 0v-2\"/>\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"23\"/>\n <line x1=\"8\" y1=\"23\" x2=\"16\" y2=\"23\"/>\n <line x1=\"2\" y1=\"2\" x2=\"22\" y2=\"22\" class=\"mute-cross\" style=\"display: none; stroke: #ef4444; stroke-width: 3.5;\"/>\n </svg>\n </button>\n <button class=\"voice-control-btn primary active\" id=\"endCallBtn\" title=\"${this.getTooltip('endCall')}\">\n <svg width=\"56\" height=\"56\" viewBox=\"0 0 24 24\" fill=\"#ef4444\">\n <rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"2\"/>\n </svg>\n <div class=\"voice-timer\" id=\"voiceTimer\">00:00</div>\n </button>\n <button class=\"voice-control-btn secondary\" id=\"speakerBtn\" title=\"${this.getTooltip('speaker')}\">\n <svg width=\"64\" height=\"64\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polygon points=\"11 5 6 9 2 9 2 15 6 15 11 19 11 5\"/>\n <path d=\"M19.07 4.93a10 10 0 0 1 0 14.14\"/>\n <path d=\"M15.54 8.46a5 5 0 0 1 0 7.07\"/>\n </svg>\n </button>\n </div>\n </div>\n </div>`;\n }\n\n /**\n * Generate CSS for voice interface - Optimized for small heights\n */\n generateCSS() {\n const avatarBg = this.config.avatarBackgroundColor || '#667eea';\n const avatarActiveBg = this.config.avatarActiveBackgroundColor || this.config.avatarBackgroundColor || '#667eea';\n const statusTitleColor = this.config.statusTitleColor || '#1e293b';\n const statusSubtitleColor = this.config.statusSubtitleColor || '#64748b';\n const startCallBtnColor = this.config.startCallButtonColor || '#667eea';\n const startCallBtnTextColor = this.config.startCallButtonTextColor || '#FFFFFF';\n const transcriptBg = this.config.transcriptBackgroundColor || '#FFFFFF';\n const transcriptTextColor = this.config.transcriptTextColor || '#1e293b';\n const transcriptLabelColor = this.config.transcriptLabelColor || '#94a3b8';\n const controlBtnColor = this.config.controlButtonColor || '#FFFFFF';\n const controlBtnSecondaryColor = this.config.controlButtonSecondaryColor || '#64748b';\n const endCallBtnColor = this.config.endCallButtonColor || '#ef4444';\n \n return `\n /* Voice Interface Styles - Ultra-compact for Wix iframes */\n .voice-interface { \n display: none; \n flex: 1; \n flex-direction: column;\n align-items: center; \n justify-content: center; \n padding: 6px 10px 6px 10px; \n background: linear-gradient(180deg, #f8fafc 0%, #e0e7ff 100%);\n overflow: hidden;\n min-height: 0;\n height: 100%;\n width: 100%;\n box-sizing: border-box;\n }\n .voice-interface.active { display: flex; }\n \n /* Voice States - Better scaling gaps */\n #voiceIdleState,\n #voiceActiveState {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n height: 100%;\n min-height: 0;\n justify-content: center;\n overflow: hidden;\n flex: 1;\n box-sizing: border-box;\n gap: clamp(6px, 1.5vh, 12px);\n }\n \n #voiceActiveState[style*=\"display: none\"] {\n display: none !important;\n }\n \n /* Voice Avatar - Scales better from small to large */\n .voice-avatar,\n .voice-avatar-active {\n width: clamp(80px, 18vh, 160px);\n height: clamp(80px, 18vh, 160px);\n aspect-ratio: 1;\n border-radius: 50%;\n background: linear-gradient(135deg, ${avatarBg} 0%, ${avatarActiveBg} 100%);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: clamp(40px, 9vh, 80px);\n margin: 0;\n box-shadow: 0 8px 30px rgba(102, 126, 234, 0.3);\n transition: all 0.3s ease;\n flex-shrink: 1;\n position: relative;\n }\n \n .voice-avatar-active {\n animation: avatarPulse 2s ease-in-out infinite;\n }\n \n @keyframes avatarPulse {\n 0%, 100% { \n transform: scale(1);\n }\n 50% { \n transform: scale(1.05);\n }\n }\n \n .voice-avatar-active.speaking {\n animation: avatarSpeak 0.5s ease-in-out infinite;\n }\n \n @keyframes avatarSpeak {\n 0%, 100% { transform: scale(1); }\n 50% { transform: scale(1.08); }\n }\n \n /* Voice Rings Animation */\n .voice-rings {\n position: absolute;\n width: 100%;\n height: 100%;\n border-radius: 50%;\n }\n \n .voice-ring {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n border: 2px solid rgba(102, 126, 234, 0.3);\n border-radius: 50%;\n opacity: 0;\n animation: ringExpand 2s ease-out infinite;\n }\n \n .voice-ring:nth-child(2) { animation-delay: 0.5s; }\n .voice-ring:nth-child(3) { animation-delay: 1s; }\n \n @keyframes ringExpand {\n 0% {\n width: 100%;\n height: 100%;\n opacity: 0.6;\n }\n 100% {\n width: 160%;\n height: 160%;\n opacity: 0;\n }\n }\n \n /* Voice Status - Scales with container */\n .voice-status {\n text-align: center;\n margin: 0;\n flex-shrink: 1;\n min-height: 0;\n }\n \n .voice-status-title {\n font-size: clamp(12px, 3vh, 20px);\n font-weight: 600;\n color: ${statusTitleColor};\n margin-bottom: clamp(2px, 0.5vh, 4px);\n line-height: 1.2;\n }\n \n .voice-status-subtitle {\n font-size: clamp(10px, 2vh, 14px);\n color: ${statusSubtitleColor};\n line-height: 1.2;\n }\n \n /* Start Call Button - Scales with container */\n .start-call-btn {\n margin: 0;\n width: min(280px, 70vw);\n height: clamp(48px, 8vh, 64px);\n border-radius: clamp(24px, 4vh, 32px);\n border: none;\n background: ${startCallBtnColor};\n color: ${startCallBtnTextColor};\n font-size: clamp(14px, 2.5vh, 18px);\n font-weight: 600;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: clamp(8px, 1.5vh, 12px);\n box-shadow: 0 12px 30px rgba(102, 126, 234, 0.4);\n transition: all 0.3s ease;\n flex-shrink: 0;\n }\n \n .start-call-btn svg {\n width: clamp(22px, 4vh, 32px);\n height: clamp(22px, 4vh, 32px);\n }\n \n .start-call-btn:hover {\n transform: translateY(-2px);\n box-shadow: 0 12px 28px rgba(102, 126, 234, 0.5);\n }\n \n .start-call-btn:active {\n transform: translateY(-1px);\n }\n \n /* Voice Transcript - Scales with container */\n .voice-transcript {\n background: ${transcriptBg};\n padding: clamp(6px, 1.5vh, 12px);\n border-radius: 10px;\n width: min(360px, calc(100% - 40px));\n margin: 0;\n min-height: clamp(45px, 10vh, 80px);\n max-height: clamp(70px, 16vh, 110px);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);\n flex-shrink: 1;\n overflow-y: auto;\n overflow-x: hidden;\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n }\n \n .transcript-label {\n font-size: clamp(8px, 1.4vh, 11px);\n color: ${transcriptLabelColor};\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n margin-bottom: clamp(3px, 0.6vh, 6px);\n flex-shrink: 0;\n word-wrap: break-word;\n }\n \n .transcript-text {\n font-size: clamp(11px, 2vh, 15px);\n color: ${transcriptTextColor};\n line-height: 1.4;\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n word-wrap: break-word;\n overflow-wrap: break-word;\n }\n \n .transcript-text.empty {\n color: #cbd5e1;\n font-style: italic;\n }\n \n /* Voice Controls - Scales with container */\n .voice-controls {\n display: flex;\n gap: clamp(8px, 1.8vh, 14px);\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n margin: 0;\n padding-top: clamp(5px, 1.2vh, 10px);\n }\n \n .voice-control-btn {\n width: clamp(48px, 9vh, 72px);\n height: clamp(48px, 9vh, 72px);\n aspect-ratio: 1;\n border-radius: 50%;\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s;\n position: relative;\n flex-shrink: 0;\n }\n \n .voice-control-btn svg {\n width: 48%;\n height: 48%;\n }\n \n .voice-control-btn.primary {\n width: clamp(54px, 10vh, 80px);\n height: clamp(54px, 10vh, 80px);\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n box-shadow: 0 6px 18px rgba(102, 126, 234, 0.4);\n }\n \n .voice-control-btn.primary:hover {\n transform: scale(1.05);\n }\n \n .voice-control-btn.primary.active {\n background: white;\n animation: recordingPulse 1.5s ease-in-out infinite;\n }\n \n @keyframes recordingPulse {\n 0%, 100% { \n box-shadow: 0 6px 16px rgba(239, 68, 68, 0.4);\n }\n 50% { \n box-shadow: 0 6px 24px rgba(239, 68, 68, 0.7);\n }\n }\n \n .voice-control-btn.secondary {\n background: ${controlBtnColor};\n color: ${controlBtnSecondaryColor};\n box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1);\n }\n \n .voice-control-btn.secondary:hover {\n background: #f8fafc;\n transform: scale(1.05);\n }\n \n .voice-control-btn.secondary.muted {\n background: #f3f4f6;\n }\n \n .voice-control-btn.secondary.muted .mute-icon {\n stroke: #9ca3af !important;\n }\n \n .voice-timer {\n position: absolute;\n bottom: clamp(-18px, -3vh, -24px);\n font-size: clamp(9px, 1.6vh, 12px);\n color: #64748b;\n font-weight: 500;\n white-space: nowrap;\n }\n \n /* Mobile optimization */\n @media (max-width: 768px) {\n .voice-interface {\n padding: 6px 10px;\n }\n }\n \n @media (max-width: 480px) {\n .voice-interface {\n padding: 5px 8px;\n }\n }\n `;\n }\n\n /**\n * Setup event handlers for voice interface\n */\n setupEventHandlers(callbacks) {\n const startCallBtn = document.getElementById('startCallBtn');\n const endCallBtn = document.getElementById('endCallBtn');\n const muteBtn = document.getElementById('muteBtn');\n const speakerBtn = document.getElementById('speakerBtn');\n \n if (startCallBtn) {\n startCallBtn.onclick = () => this.startVoiceCall();\n }\n if (endCallBtn) {\n endCallBtn.onclick = () => this.endVoiceCall();\n }\n if (muteBtn) {\n muteBtn.onclick = () => this.toggleMute();\n }\n if (speakerBtn) {\n speakerBtn.onclick = () => this.toggleSpeaker();\n }\n \n // Adjust sizes when the interface first loads - with retries and longer delays\n const tryAdjustSizes = (attempt = 0) => {\n const voiceInterface = document.getElementById('voiceInterface');\n if (voiceInterface && voiceInterface.classList.contains('active') && voiceInterface.clientHeight > 100) {\n console.log('✅ Interface is active and has proper dimensions, adjusting sizes (attempt', attempt + 1, ')');\n this.adjustSizesForContainer();\n \n // Do one more adjustment after a short delay to ensure everything is rendered\n if (attempt === 0) {\n setTimeout(() => this.adjustSizesForContainer(), 500);\n }\n } else if (attempt < 15) {\n console.log('⏳ Interface not ready yet (height:', voiceInterface?.clientHeight, '), retrying... (attempt', attempt + 1, ')');\n setTimeout(() => tryAdjustSizes(attempt + 1), 250);\n } else {\n console.warn('⚠️ Interface never became fully ready, adjusting sizes anyway');\n this.adjustSizesForContainer();\n }\n };\n \n setTimeout(() => tryAdjustSizes(), 200);\n \n // Also adjust on window resize\n window.addEventListener('resize', () => {\n console.log('🔄 Window resized, re-adjusting sizes');\n this.adjustSizesForContainer();\n });\n }\n\n /**\n * Get signed URL for WebSocket connection\n */\n async getSignedUrl() {\n // If getSessionUrl is not provided, construct URL directly from agentId and appId\n if (!this.config.getSessionUrl) {\n if (!this.config.agentId) {\n throw new Error('agentId is required');\n }\n \n // Build WebSocket URL directly\n const baseUrl = this.config.websocketUrl || 'wss://speech.talktopc.com/ws/conv';\n const params = new URLSearchParams();\n params.append('agentId', this.config.agentId);\n \n if (this.config.appId) {\n params.append('appId', this.config.appId);\n }\n \n // Add demo flag if in development\n if (this.config.demo !== false) {\n params.append('demo', 'true');\n }\n \n return `${baseUrl}?${params.toString()}`;\n }\n \n // Handle getSessionUrl as string (backend URL)\n if (typeof this.config.getSessionUrl === 'string') {\n const requestBody = {\n agentId: this.config.agentId,\n variables: this.config.variables || {}\n };\n \n // Add appId if provided in config\n if (this.config.appId) {\n requestBody.appId = this.config.appId;\n }\n \n const response = await fetch(this.config.getSessionUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestBody)\n });\n\n if (!response.ok) {\n throw new Error(`Failed to get session URL: ${response.statusText}`);\n }\n\n const data = await response.json();\n return data.signedUrl || data.wsUrl || data.url;\n }\n \n // Handle getSessionUrl as function\n else if (typeof this.config.getSessionUrl === 'function') {\n const params = {\n agentId: this.config.agentId,\n variables: this.config.variables || {}\n };\n \n // Add appId if provided in config\n if (this.config.appId) {\n params.appId = this.config.appId;\n }\n \n const result = await this.config.getSessionUrl(params);\n \n return typeof result === 'string' ? result : (result.signedUrl || result.wsUrl || result.url);\n }\n \n else {\n throw new Error('getSessionUrl must be a string (backend URL), a function, or omitted (for direct connection with agentId/appId)');\n }\n }\n\n /**\n * Adjust UI sizes based on container height\n */\n adjustSizesForContainer() {\n const voiceInterface = document.getElementById('voiceInterface');\n if (!voiceInterface) {\n console.warn('⚠️ voiceInterface not found, skipping size adjustment');\n return;\n }\n \n const containerHeight = voiceInterface.clientHeight;\n const containerWidth = voiceInterface.clientWidth;\n \n console.log('📏 Container size:', containerHeight, 'x', containerWidth);\n \n // Check if we have visible elements\n const idleState = document.getElementById('voiceIdleState');\n const activeState = document.getElementById('voiceActiveState');\n const isIdleVisible = idleState && idleState.style.display !== 'none';\n const isActiveVisible = activeState && activeState.style.display !== 'none';\n \n console.log('👁️ Visible state - Idle:', isIdleVisible, 'Active:', isActiveVisible);\n \n // Calculate sizes ensuring everything fits\n // Total height = padding + gaps + avatar + status + transcript + controls\n const padding = 12; // top + bottom padding\n const gapsCount = 4; // gaps between elements\n \n let avatarSize, avatarFontSize, titleSize, subtitleSize, statusHeight, transcriptHeight, buttonSize, primaryButtonSize, gapSize;\n \n if (containerHeight <= 350) {\n // Very small - ultra compact\n gapSize = 5;\n avatarSize = 70;\n avatarFontSize = 35;\n titleSize = 11;\n subtitleSize = 9;\n statusHeight = 32;\n transcriptHeight = 45;\n buttonSize = 42;\n primaryButtonSize = 48;\n } else if (containerHeight <= 450) {\n // Small (400-420px) - BIGGER AVATAR for 500px Wix height\n gapSize = 7;\n avatarSize = 110; // Increased from 85 to 110\n avatarFontSize = 55; // Increased from 42 to 55\n titleSize = 15; // Increased from 13\n subtitleSize = 11; // Increased from 10\n statusHeight = 38;\n transcriptHeight = 58; // Slightly reduced\n buttonSize = 52; // Increased from 48\n primaryButtonSize = 58; // Increased from 54\n } else if (containerHeight <= 550) {\n // Medium (500px) - BIGGER ROBOT\n gapSize = 8;\n avatarSize = 140; // Increased from 110 to 140\n avatarFontSize = 70; // Increased from 55 to 70\n titleSize = 16; // Increased from 15\n subtitleSize = 12; // Increased from 11\n statusHeight = 42;\n transcriptHeight = 68; // Reduced slightly to compensate for bigger robot\n buttonSize = 56; // Increased from 54\n primaryButtonSize = 64; // Increased from 62\n } else if (containerHeight <= 700) {\n // Medium-Large (600px)\n gapSize = 10;\n avatarSize = 130;\n avatarFontSize = 65;\n titleSize = 18;\n subtitleSize = 13;\n statusHeight = 46;\n transcriptHeight = 85;\n buttonSize = 60;\n primaryButtonSize = 70;\n } else {\n // Large (700+)\n gapSize = 12;\n avatarSize = 150;\n avatarFontSize = 75;\n titleSize = 20;\n subtitleSize = 14;\n statusHeight = 50;\n transcriptHeight = 100;\n buttonSize = 66;\n primaryButtonSize = 76;\n }\n \n // Apply gap size\n const stateContainers = document.querySelectorAll('#voiceIdleState, #voiceActiveState');\n stateContainers.forEach(container => {\n container.style.gap = `${gapSize}px`;\n });\n \n // Apply sizes to avatar\n const avatars = document.querySelectorAll('.voice-avatar, .voice-avatar-active');\n console.log('🤖 Found', avatars.length, 'avatars, setting size to', avatarSize, 'px');\n avatars.forEach(avatar => {\n avatar.style.width = `${avatarSize}px`;\n avatar.style.height = `${avatarSize}px`;\n avatar.style.fontSize = `${avatarFontSize}px`;\n });\n \n // Apply sizes to status text\n const statusTitle = document.querySelectorAll('.voice-status-title');\n statusTitle.forEach(el => el.style.fontSize = `${titleSize}px`);\n \n const statusSubtitle = document.querySelectorAll('.voice-status-subtitle');\n statusSubtitle.forEach(el => el.style.fontSize = `${subtitleSize}px`);\n \n // Apply sizes to transcript\n const transcript = document.querySelector('.voice-transcript');\n if (transcript) {\n transcript.style.minHeight = `${transcriptHeight}px`;\n transcript.style.maxHeight = `${transcriptHeight}px`;\n transcript.style.height = `${transcriptHeight}px`;\n transcript.style.width = `min(360px, ${containerWidth - 40}px)`; // Ensure it doesn't overflow\n transcript.style.boxSizing = 'border-box';\n }\n \n const transcriptLabel = document.querySelector('.transcript-label');\n if (transcriptLabel) {\n transcriptLabel.style.fontSize = `${Math.max(8, titleSize - 4)}px`;\n }\n \n const transcriptText = document.querySelector('.transcript-text');\n if (transcriptText) {\n transcriptText.style.fontSize = `${Math.max(10, titleSize - 2)}px`;\n }\n \n // Apply sizes to control buttons\n const secondaryButtons = document.querySelectorAll('.voice-control-btn.secondary');\n secondaryButtons.forEach(btn => {\n btn.style.width = `${buttonSize}px`;\n btn.style.height = `${buttonSize}px`;\n \n // Scale the SVG icon inside the button - much bigger!\n const svg = btn.querySelector('svg');\n if (svg) {\n const iconSize = buttonSize * 0.65; // Increased from 50% to 65%\n svg.style.setProperty('width', `${iconSize}px`, 'important');\n svg.style.setProperty('height', `${iconSize}px`, 'important');\n svg.style.setProperty('min-width', `${iconSize}px`, 'important');\n svg.style.setProperty('min-height', `${iconSize}px`, 'important');\n }\n });\n \n const primaryButton = document.querySelector('.voice-control-btn.primary');\n if (primaryButton) {\n primaryButton.style.width = `${primaryButtonSize}px`;\n primaryButton.style.height = `${primaryButtonSize}px`;\n \n // Scale the SVG icon inside the primary button - much bigger!\n const svg = primaryButton.querySelector('svg');\n if (svg) {\n const iconSize = primaryButtonSize * 0.70; // Increased from 55% to 70%\n svg.style.setProperty('width', `${iconSize}px`, 'important');\n svg.style.setProperty('height', `${iconSize}px`, 'important');\n svg.style.setProperty('min-width', `${iconSize}px`, 'important');\n svg.style.setProperty('min-height', `${iconSize}px`, 'important');\n }\n }\n \n // Apply to start call button\n const startCallBtn = document.querySelector('.start-call-btn');\n if (startCallBtn) {\n let btnHeight, btnFontSize;\n if (containerHeight <= 350) {\n btnHeight = 48;\n btnFontSize = 14;\n } else if (containerHeight <= 450) {\n btnHeight = 52;\n btnFontSize = 15;\n } else if (containerHeight <= 550) {\n btnHeight = 58; // Bigger button at 500px\n btnFontSize = 17;\n } else if (containerHeight <= 700) {\n btnHeight = 62;\n btnFontSize = 18;\n } else {\n btnHeight = 64;\n btnFontSize = 18;\n }\n startCallBtn.style.height = `${btnHeight}px`;\n startCallBtn.style.fontSize = `${btnFontSize}px`;\n \n // Also adjust the SVG icon size in the button\n const btnIcon = startCallBtn.querySelector('svg');\n if (btnIcon) {\n const iconSize = Math.max(22, btnHeight * 0.5);\n btnIcon.style.width = `${iconSize}px`;\n btnIcon.style.height = `${iconSize}px`;\n }\n }\n \n console.log('✅ Sizes adjusted - Avatar:', avatarSize, 'Status:', statusHeight, 'Transcript:', transcriptHeight, 'Buttons:', buttonSize);\n }\n\n /**\n * Start voice call\n */\n async startVoiceCall() {\n if (this.isActive) {\n console.log('⚠️ Voice call already active');\n return;\n }\n \n console.log('🎤 Starting voice call...');\n \n try {\n // Hide idle state, show active state\n const idleState = document.getElementById('voiceIdleState');\n const activeState = document.getElementById('voiceActiveState');\n const voiceInterface = document.getElementById('voiceInterface');\n \n if (idleState) idleState.style.display = 'none';\n if (activeState) activeState.style.display = 'flex';\n \n // Adjust sizes based on container dimensions\n setTimeout(() => this.adjustSizesForContainer(), 50);\n \n // Prevent any scrolling when switching states\n if (voiceInterface) {\n voiceInterface.scrollTop = 0;\n }\n \n // Get signed URL and connect\n const signedUrl = await this.getSignedUrl();\n console.log('🔗 Got signed URL:', signedUrl);\n \n const connected = await this.sdk.connect(signedUrl);\n console.log('✅ Connected to WebSocket, connected:', connected);\n \n // Wait for connection to be fully ready (for hello message exchange)\n let attempts = 0;\n while (!this.sdk.isConnected && attempts < 50) {\n await new Promise(resolve => setTimeout(resolve, 100));\n attempts++;\n }\n \n if (this.sdk.isConnected) {\n console.log('✅ WebSocket ready, starting listening...');\n await this.sdk.startListening();\n console.log('🎤 Started listening');\n \n this.isActive = true;\n \n // Start timer\n this.callStartTime = Date.now();\n this.callTimerInterval = setInterval(() => {\n const elapsed = Date.now() - this.callStartTime;\n const minutes = Math.floor(elapsed / 60000);\n const seconds = Math.floor((elapsed % 60000) / 1000);\n const timerEl = document.getElementById('voiceTimer');\n if (timerEl) {\n timerEl.textContent = `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n }\n }, 1000);\n } else {\n console.warn('⚠️ Connection not fully ready, but trying to start listening anyway...');\n await this.sdk.startListening();\n console.log('🎤 Started listening');\n \n this.isActive = true;\n \n // Start timer\n this.callStartTime = Date.now();\n this.callTimerInterval = setInterval(() => {\n const elapsed = Date.now() - this.callStartTime;\n const minutes = Math.floor(elapsed / 60000);\n const seconds = Math.floor((elapsed % 60000) / 1000);\n const timerEl = document.getElementById('voiceTimer');\n if (timerEl) {\n timerEl.textContent = `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n }\n }, 1000);\n }\n \n console.log('✅ Voice call started successfully');\n \n } catch (error) {\n console.error('❌ Error starting voice call:', error);\n this.showError(error.message || error);\n \n // Reset UI state on error\n const idleState = document.getElementById('voiceIdleState');\n const activeState = document.getElementById('voiceActiveState');\n if (idleState) idleState.style.display = 'flex';\n if (activeState) activeState.style.display = 'none';\n }\n }\n\n /**\n * End voice call\n */\n endVoiceCall() {\n console.log('🔴 Ending voice call...');\n \n // Stop listening and disconnect\n if (this.sdk && this.isActive) {\n this.sdk.stopListening();\n this.sdk.disconnect();\n this.isActive = false;\n }\n \n // Stop audio stream (if any)\n if (this.audioStream) {\n this.audioStream.getTracks().forEach(track => track.stop());\n this.audioStream = null;\n }\n \n // Stop timer\n if (this.callTimerInterval) {\n clearInterval(this.callTimerInterval);\n this.callTimerInterval = null;\n }\n \n // Show idle state, hide active state\n const idleState = document.getElementById('voiceIdleState');\n const activeState = document.getElementById('voiceActiveState');\n \n if (idleState) idleState.style.display = 'flex';\n if (activeState) activeState.style.display = 'none';\n \n // Re-adjust sizes for idle state\n setTimeout(() => this.adjustSizesForContainer(), 50);\n \n // Reset transcript\n const transcriptEl = document.getElementById('transcriptText');\n if (transcriptEl) {\n transcriptEl.textContent = this.t('transcriptWillAppear');\n transcriptEl.classList.add('empty');\n }\n \n // Remove speaking state from avatar\n const avatar = document.getElementById('voiceAvatarActive');\n if (avatar) {\n avatar.classList.remove('speaking');\n }\n \n console.log('✅ Voice call ended');\n }\n \n /**\n * Update transcript text\n */\n updateTranscript(text) {\n const transcriptEl = document.getElementById('transcriptText');\n if (transcriptEl) {\n transcriptEl.textContent = text;\n transcriptEl.classList.remove('empty');\n }\n }\n \n /**\n * Show error message\n */\n showError(message) {\n const transcriptEl = document.getElementById('transcriptText');\n if (transcriptEl) {\n transcriptEl.textContent = `${this.t('error')}: ${message}`;\n transcriptEl.classList.remove('empty');\n }\n }\n \n /**\n * Show domain validation error\n */\n showDomainError() {\n const transcriptEl = document.getElementById('transcriptText');\n if (transcriptEl) {\n const title = this.t('domainNotValidated');\n const message = this.t('domainErrorMessage');\n transcriptEl.innerHTML = `<div style=\"font-weight: 600; font-size: 16px; margin-bottom: 8px; color: #991B1B;\">${title}</div><div style=\"font-size: 14px; color: #991B1B; line-height: 1.5;\">${message}</div>`;\n transcriptEl.classList.remove('empty');\n }\n }\n\n /**\n * Toggle mute state\n */\n toggleMute() {\n if (!this.sdk || !this.isActive) {\n return;\n }\n \n // Access the audio recorder's media stream through VoiceSDK\n let audioTrack = null;\n if (this.sdk.voiceSDK && this.sdk.voiceSDK.audioRecorder && this.sdk.voiceSDK.audioRecorder.mediaStream) {\n audioTrack = this.sdk.voiceSDK.audioRecorder.mediaStream.getAudioTracks()[0];\n }\n \n // Fallback to stored audioStream if available\n if (!audioTrack && this.audioStream) {\n audioTrack = this.audioStream.getAudioTracks()[0];\n }\n \n if (audioTrack) {\n audioTrack.enabled = !audioTrack.enabled;\n \n const muteBtn = document.getElementById('muteBtn');\n const muteIcon = muteBtn?.querySelector('.mute-icon');\n const muteCross = muteBtn?.querySelector('.mute-cross');\n \n if (muteBtn && muteIcon && muteCross) {\n if (!audioTrack.enabled) {\n // Muted state: gray color and show cross\n muteIcon.style.stroke = '#9ca3af'; // gray color\n muteCross.style.display = 'block';\n muteBtn.classList.add('muted');\n } else {\n // Unmuted state: normal color and hide cross\n muteIcon.style.stroke = '';\n muteCross.style.display = 'none';\n muteBtn.classList.remove('muted');\n }\n }\n \n console.log(audioTrack.enabled ? '🔊 Unmuted' : '🔇 Muted');\n } else {\n console.warn('⚠️ No audio track available for mute toggle');\n }\n }\n\n /**\n * Toggle speaker (placeholder)\n */\n toggleSpeaker() {\n // Speaker toggle logic (placeholder)\n console.log('🔊 Speaker toggle');\n }\n\n /**\n * Cleanup resources\n */\n destroy() {\n // End call if active\n if (this.isActive) {\n this.endVoiceCall();\n }\n \n // Clean up voice call resources\n if (this.audioStream) {\n this.audioStream.getTracks().forEach(track => track.stop());\n this.audioStream = null;\n }\n if (this.callTimerInterval) {\n clearInterval(this.callTimerInterval);\n this.callTimerInterval = null;\n }\n \n // Disconnect SDK\n if (this.sdk) {\n this.sdk.disconnect();\n this.sdk = null;\n }\n }\n}","/**\n * TextInterface - Handles text chat UI and functionality\n * Part of the unified TTPChatWidget\n */\n\nexport class TextInterface {\n constructor(config, sdk) {\n this.config = config;\n this.sdk = sdk;\n this.streamingEl = null;\n this.hasStartedStreaming = false;\n this.isActive = false;\n // Store event handlers to allow cleanup\n this.eventHandlers = {\n autoResize: null,\n keydown: null\n };\n // Track if event handlers are already set up to avoid unnecessary re-initialization\n this.eventHandlersSetup = false;\n }\n\n // Helper function to get translated text\n t(key) {\n const lang = this.config.language || 'en';\n const translations = this.config.translations?.[lang] || this.config.translations?.en || {};\n return translations[key] || key;\n }\n\n /**\n * Generate HTML for text interface\n */\n generateHTML() {\n // Use text config, fallback to panel config, then translation, then default\n const inputPlaceholder = this.config.inputPlaceholder || \n this.config.panel?.inputPlaceholder || \n this.t('typeMessage') || \n 'Type your message...';\n return `<div class=\"text-interface\" id=\"textInterface\">\n <div class=\"messages-container\" id=\"messagesContainer\">\n <div class=\"empty-state\">\n <div class=\"empty-state-icon\">💬</div>\n <div class=\"empty-state-title\">${this.t('hello')}</div>\n <div class=\"empty-state-text\">${this.t('sendMessage')}</div>\n </div>\n </div>\n <div class=\"input-container\">\n <div class=\"input-wrapper\" style=\"flex:1;\">\n <textarea class=\"message-input\" id=\"messageInput\" placeholder=\"${inputPlaceholder}\" rows=\"1\" dir=\"${this.config.direction || 'ltr'}\"></textarea>\n </div>\n <button class=\"send-button\" id=\"sendButton\" aria-label=\"${this.t('sendMessageAria')}\">${this.config.sendButtonText || '➤'}</button>\n ${(this.config.sendButtonHint?.text || this.config.panel?.sendButtonHint?.text) ? `\n <div class=\"send-button-hint\" style=\"color: ${this.config.sendButtonHint?.color || this.config.panel?.sendButtonHint?.color || '#6B7280'}; font-size: ${this.config.sendButtonHint?.fontSize || this.config.panel?.sendButtonHint?.fontSize || '12px'}; text-align: center; margin-top: 4px;\">\n ${this.config.sendButtonHint?.text || this.config.panel?.sendButtonHint?.text}\n </div>\n ` : ''}\n </div>\n </div>`;\n }\n\n /**\n * Generate CSS for text interface\n */\n generateCSS() {\n const messages = this.config.messages;\n const panel = this.config.panel;\n const anim = this.config.animation;\n \n // Use text config, fallback to panel config for backward compatibility\n const sendButtonColor = this.config.sendButtonColor || this.config.panel?.sendButtonColor || '#7C3AED'; // Purple default\n const sendButtonHoverColor = this.config.sendButtonHoverColor || this.config.panel?.sendButtonHoverColor || '#6D28D9';\n const sendButtonTextColor = this.config.sendButtonTextColor || this.config.panel?.sendButtonTextColor || '#FFFFFF';\n const inputPlaceholder = this.config.inputPlaceholder || this.config.panel?.inputPlaceholder || 'Type your message...';\n const inputBorderColor = this.config.inputBorderColor || this.config.panel?.inputBorderColor || '#E5E7EB';\n const inputFocusColor = this.config.inputFocusColor || this.config.panel?.inputFocusColor || '#7C3AED'; // Purple default\n const inputBackgroundColor = this.config.inputBackgroundColor || this.config.panel?.inputBackgroundColor || '#FFFFFF';\n const inputTextColor = this.config.inputTextColor || this.config.panel?.inputTextColor || '#1F2937';\n const inputFontSize = this.config.inputFontSize || this.config.panel?.inputFontSize || '14px';\n const inputBorderRadius = this.config.inputBorderRadius || this.config.panel?.inputBorderRadius || 20;\n const inputPadding = this.config.inputPadding || this.config.panel?.inputPadding || '6px 14px';\n \n return `\n /* Messages container using new classes */\n #messagesContainer { \n flex: 1; \n overflow-y: auto; \n overflow-x: hidden; \n padding: 20px; \n background: #f8fafc; \n display: flex; \n flex-direction: column; \n gap: 16px; \n min-height: 0; \n }\n .empty-state { \n flex: 1; \n display: flex; \n flex-direction: column; \n align-items: center; \n justify-content: center; \n gap: 12px; \n color: #64748b; \n text-align: center; \n padding: 20px; \n }\n .empty-state-icon { font-size: 48px; opacity: 0.3; }\n .empty-state-title { font-size: 20px; font-weight: 700; color: #334155; }\n .empty-state-text { font-size: 13px; max-width: 280px; }\n\n .text-interface { \n display: none; \n flex: 1; \n flex-direction: column; \n min-height: 0; \n overflow: hidden; \n }\n .text-interface.active { display: flex; }\n \n .message { \n display: flex; \n gap: 8px; \n padding: 4px 0; \n max-width: 100%; \n align-items: center; \n }\n .message.edge-left { flex-direction: row; }\n .message.edge-right { flex-direction: row-reverse; }\n .message-bubble { \n padding: 12px; \n border-radius: ${messages.borderRadius}px; \n max-width: 80%; \n font-size: ${messages.fontSize}; \n color: ${messages.textColor}; \n word-wrap: break-word; \n text-align: ${this.config.direction === 'rtl' ? 'right' : 'left'}; \n direction: ${this.config.direction || 'ltr'};\n }\n .message.user { \n background: ${messages.userBackgroundColor}; \n align-self: ${this.config.direction === 'rtl' ? 'flex-start' : 'flex-end'}; \n }\n .message.agent { \n background: ${messages.agentBackgroundColor}; \n align-self: ${this.config.direction === 'rtl' ? 'flex-end' : 'flex-start'}; \n }\n .message .message-bubble { \n text-align: ${this.config.direction === 'rtl' ? 'right' : 'left'} !important; \n }\n ${this.config.direction === 'rtl' ? `\n .message-bubble {\n text-align: right !important;\n }\n ` : ''}\n .message-avatar { \n width: 20px; \n height: 20px; \n display: flex; \n align-items: center; \n justify-content: center; \n flex-shrink: 0; \n color: inherit; \n font-size: 18px; \n line-height: 1; \n background: transparent; \n border: none; \n }\n .message-avatar.user { background: transparent; }\n .message-avatar.agent { background: transparent; }\n \n .message.system {\n background: ${messages.systemBackgroundColor};\n align-self: flex-start;\n }\n .message.error {\n background: ${messages.errorBackgroundColor};\n align-self: flex-start;\n }\n \n .input-container {\n display: flex;\n gap: 8px;\n padding: 12px 16px;\n background: #FFFFFF;\n border-top: 1px solid #E5E7EB;\n align-items: center;\n flex-shrink: 0;\n flex-direction: ${this.config.direction === 'rtl' ? 'row-reverse' : 'row'};\n }\n \n .input-wrapper {\n position: relative;\n display: flex;\n align-items: center;\n }\n \n .message-input {\n width: 100%;\n min-height: 32px;\n max-height: 120px;\n padding: ${inputPadding};\n border: 1px solid ${inputBorderColor};\n border-radius: ${inputBorderRadius}px;\n font-size: ${inputFontSize};\n font-family: inherit;\n line-height: 1.3;\n resize: none;\n overflow-y: auto;\n background: ${inputBackgroundColor};\n color: ${inputTextColor};\n vertical-align: top;\n margin: 0;\n display: block;\n white-space: pre-wrap;\n word-wrap: break-word;\n text-align: ${this.config.direction === 'rtl' ? 'right' : 'left'};\n direction: ${this.config.direction || 'ltr'};\n -webkit-appearance: none;\n appearance: none;\n box-sizing: border-box;\n }\n \n .message-input:focus {\n outline: none;\n border-color: ${inputFocusColor};\n background: ${inputBackgroundColor === '#FFFFFF' ? '#FFFFFF' : inputBackgroundColor};\n box-shadow: 0 0 0 3px ${inputFocusColor}33;\n }\n \n .message-input::placeholder {\n color: #9CA3AF;\n text-align: ${this.config.direction === 'rtl' ? 'right' : 'left'};\n }\n \n .send-button {\n width: 40px;\n height: 40px;\n border-radius: 50%;\n border: none;\n background: ${sendButtonColor};\n color: ${sendButtonTextColor};\n font-size: ${this.config.sendButtonFontSize || this.config.panel?.sendButtonFontSize || '18px'};\n font-weight: ${this.config.sendButtonFontWeight || this.config.panel?.sendButtonFontWeight || '500'};\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n transition: all 0.2s ease;\n box-shadow: 0 4px 12px rgba(124, 60, 237, 0.3);\n }\n \n .send-button:hover:not(:disabled) {\n background: ${sendButtonHoverColor};\n transform: scale(1.05);\n box-shadow: 0 6px 16px rgba(124, 60, 237, 0.4);\n }\n \n .send-button-hint {\n width: 100%;\n text-align: center;\n margin-top: 4px;\n }\n \n .send-button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n \n .typing-indicator {\n display: inline-flex;\n gap: 4px;\n align-items: center;\n }\n \n .typing-dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: #64748b;\n animation: typingDot 1.4s ease-in-out infinite;\n }\n \n .typing-dot:nth-child(2) { animation-delay: 0.2s; }\n .typing-dot:nth-child(3) { animation-delay: 0.4s; }\n \n @keyframes typingDot {\n 0%, 60%, 100% { transform: translateY(0); opacity: 0.7; }\n 30% { transform: translateY(-8px); opacity: 1; }\n }\n \n .error-message {\n padding: 12px;\n background: ${messages.errorBackgroundColor};\n border-radius: ${messages.borderRadius}px;\n color: #991B1B;\n font-size: ${messages.fontSize};\n margin: 8px 0;\n }\n \n @media (max-width: 768px) {\n #messagesContainer {\n padding: 12px;\n gap: 12px;\n }\n \n .message-bubble {\n max-width: 85%;\n font-size: 14px;\n padding: 10px;\n }\n \n .text-input-container {\n padding: 10px;\n gap: 8px;\n }\n \n #text-chat-input {\n font-size: 16px !important; /* Prevents iOS zoom on focus */\n padding: 10px 14px;\n min-height: 44px;\n }\n \n #text-chat-send {\n min-width: 56px;\n min-height: 44px;\n width: 56px;\n height: 44px;\n }\n \n .empty-state-icon {\n font-size: 40px;\n }\n \n .empty-state-title {\n font-size: 18px;\n }\n \n .empty-state-text {\n font-size: 12px;\n }\n }\n \n @media (max-width: 480px) {\n #messagesContainer {\n padding: 10px;\n gap: 10px;\n }\n \n .message-bubble {\n max-width: 90%;\n font-size: 13px;\n padding: 8px;\n }\n \n .text-input-container {\n padding: 8px;\n }\n \n #text-chat-input {\n font-size: 16px !important;\n padding: 8px 12px;\n }\n }\n `;\n }\n\n /**\n * Setup event handlers for text interface\n */\n setupEventHandlers() {\n const sendButton = document.getElementById('sendButton');\n const inputField = document.getElementById('messageInput');\n const newChatBtn = document.getElementById('newChatBtn');\n \n if (sendButton) sendButton.onclick = () => this.sendMessage();\n if (newChatBtn) newChatBtn.onclick = () => this.startNewChat();\n \n // Update placeholder and direction when config changes\n this.updateInputAttributes();\n \n // Send on Enter key, auto-resize textarea, and keep cursor visible\n if (inputField) {\n // Set initial height\n inputField.style.height = '32px';\n inputField.style.overflow = 'hidden';\n \n // Auto-resize textarea as user types\n const autoResize = () => {\n inputField.style.height = 'auto';\n const newHeight = Math.min(inputField.scrollHeight, 120);\n inputField.style.height = newHeight + 'px';\n inputField.style.overflowY = newHeight >= 120 ? 'auto' : 'hidden';\n \n // When at max height with overflow, scroll to bottom to keep cursor visible\n if (newHeight >= 120) {\n // Small delay to ensure height is applied first\n setTimeout(() => {\n inputField.scrollTop = inputField.scrollHeight;\n }, 0);\n }\n };\n \n inputField.addEventListener('input', autoResize);\n \n inputField.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n this.sendMessage();\n } else if (e.key === 'Enter' && e.shiftKey) {\n // Allow Enter with Shift for new line, resize after\n setTimeout(autoResize, 0);\n }\n });\n }\n }\n\n /**\n * Start new chat\n */\n startNewChat() {\n try { \n localStorage.removeItem('ttp_text_chat_conversation_id'); \n } catch (_) {}\n \n if (this.sdk) {\n this.sdk.config.conversationId = null;\n }\n \n // Reset UI messages to empty state\n const container = document.getElementById('messagesContainer');\n if (container) {\n container.innerHTML = `\n <div class=\"empty-state\">\n <div class=\"empty-state-icon\">💬</div>\n <div class=\"empty-state-title\">${this.t('hello')}</div>\n <div class=\"empty-state-text\">${this.t('sendMessage')}</div>\n </div>`;\n }\n \n // Focus message input\n const input = document.getElementById('messageInput');\n if (input) input.focus();\n }\n\n /**\n * Update input attributes (placeholder, direction) when config changes\n */\n updateInputAttributes() {\n const inputField = document.getElementById('messageInput');\n if (inputField) {\n // Update placeholder based on current language\n const inputPlaceholder = this.config.inputPlaceholder || \n this.config.panel?.inputPlaceholder || \n this.t('typeMessage') || \n 'Type your message...';\n inputField.placeholder = inputPlaceholder;\n \n // Update direction\n inputField.dir = this.config.direction || 'ltr';\n \n // Update text-align style\n inputField.style.textAlign = this.config.direction === 'rtl' ? 'right' : 'left';\n }\n }\n\n /**\n * Show text interface\n */\n show() {\n const textInterface = document.getElementById('textInterface');\n if (textInterface) textInterface.classList.add('active');\n \n // Focus input soon after render\n setTimeout(() => {\n const input = document.getElementById('messageInput');\n if (input) input.focus();\n }, 50);\n }\n\n /**\n * Hide text interface\n */\n hide() {\n const textInterface = document.getElementById('textInterface');\n if (textInterface) textInterface.classList.remove('active');\n }\n\n /**\n * Start chat session\n */\n async startChat() {\n // No-op with single-shot design; connection happens per message\n this.isActive = true;\n this.updateSendButtonState();\n }\n\n /**\n * Send message\n */\n async sendMessage() {\n const input = document.getElementById('messageInput');\n const text = input.value.trim();\n \n if (!text) {\n return;\n }\n \n // Ensure active state\n if (!this.isActive) {\n await this.startChat();\n }\n \n // Add user message to UI\n this.addMessage('user', text);\n \n // Clear input and reset height\n input.value = '';\n input.style.height = '32px';\n input.style.overflow = 'hidden';\n \n // Prepare streaming bubble and send via SDK\n try {\n this.beginStreaming();\n await this.sdk.sendMessage(text);\n } catch (error) {\n console.error('❌ Failed to send message:', error);\n // Check if this is a domain error - if so, it's already handled by the domainError event handler\n // Don't show it here to avoid duplicates\n const isDomainError = error && (\n error.message === 'DOMAIN_NOT_WHITELISTED' ||\n (error.message && error.message.includes('Domain not whitelisted'))\n );\n \n if (!isDomainError) {\n // Only show non-domain errors here (domain errors are handled by event handler)\n this.showError(error);\n }\n this.stopStreamingState();\n }\n }\n\n /**\n * Update send button state\n */\n updateSendButtonState() {\n const sendButton = document.getElementById('sendButton');\n if (!sendButton) return;\n \n sendButton.disabled = !this.isActive; // single-shot; enable when ready for input\n }\n\n /**\n * Add message to UI\n */\n addMessage(type, text) {\n const messages = document.getElementById('messagesContainer');\n if (!messages) return;\n \n // Remove empty state if present\n const emptyState = messages.querySelector('.empty-state');\n if (emptyState) {\n emptyState.remove();\n }\n \n const message = document.createElement('div');\n const edgeClass = (this.config.direction === 'rtl')\n ? (type === 'user' ? 'edge-left' : 'edge-right')\n : (type === 'user' ? 'edge-right' : 'edge-left');\n message.className = `message ${type} ${edgeClass}`;\n\n const avatar = document.createElement('div');\n avatar.className = `message-avatar ${type}`;\n avatar.textContent = type === 'user' ? '👤' : '🤖';\n\n const bubble = document.createElement('div');\n bubble.className = 'message-bubble';\n bubble.textContent = text;\n\n // Order is controlled by edgeClass via flex-direction\n message.appendChild(avatar);\n message.appendChild(bubble);\n messages.appendChild(message);\n messages.scrollTop = messages.scrollHeight;\n }\n\n /**\n * Begin streaming response\n */\n beginStreaming() {\n const messages = document.getElementById('messagesContainer');\n if (!messages) return;\n \n // Clean any previous indicator\n this.stopStreamingState();\n \n const el = document.createElement('div');\n const edgeClass = (this.config.direction === 'rtl') ? 'edge-right' : 'edge-left';\n el.className = `message agent ${edgeClass}`;\n el.id = 'agent-streaming';\n\n const avatar = document.createElement('div');\n avatar.className = 'message-avatar agent';\n avatar.textContent = '🤖';\n \n const bubble = document.createElement('div');\n bubble.className = 'message-bubble';\n // show typing dots until first chunk\n bubble.innerHTML = '<span class=\"typing-indicator\"><span class=\"typing-dot\"></span><span class=\"typing-dot\"></span><span class=\"typing-dot\"></span></span>';\n\n el.appendChild(avatar);\n el.appendChild(bubble);\n messages.appendChild(el);\n this.streamingEl = bubble;\n this.hasStartedStreaming = false;\n messages.scrollTop = messages.scrollHeight;\n }\n\n /**\n * Append chunk to streaming response\n */\n appendStreamingChunk(chunk) {\n if (!this.streamingEl) return;\n \n if (!this.hasStartedStreaming) {\n // remove typing indicator on first content\n this.streamingEl.textContent = '';\n this.hasStartedStreaming = true;\n }\n \n this.streamingEl.textContent += chunk;\n const messages = document.getElementById('messagesContainer');\n if (messages) {\n messages.scrollTop = messages.scrollHeight;\n }\n }\n\n /**\n * Finalize streaming response\n */\n finalizeStreaming(fullText) {\n if (this.streamingEl) {\n this.streamingEl.textContent = fullText || this.streamingEl.textContent;\n const container = document.getElementById('agent-streaming');\n if (container) container.id = '';\n this.streamingEl = null;\n }\n this.updateSendButtonState();\n }\n\n /**\n * Stop streaming state\n */\n stopStreamingState() {\n const existing = document.getElementById('agent-streaming');\n if (existing) existing.remove();\n this.streamingEl = null;\n this.hasStartedStreaming = false;\n }\n\n /**\n * Show error message\n */\n showError(error) {\n const messages = document.getElementById('messagesContainer');\n if (!messages) return;\n \n // Check if this is a domain validation error\n const isDomainError = error && (\n error.message === 'DOMAIN_NOT_WHITELISTED' ||\n (typeof error === 'string' && error.includes('DOMAIN_NOT_WHITELISTED')) ||\n (error.message && error.message.includes('Domain not whitelisted')) ||\n (typeof error === 'string' && error.includes('Domain not whitelisted'))\n );\n \n if (isDomainError) {\n // Show domain error with title and message\n const errorContainer = document.createElement('div');\n errorContainer.className = 'error-message';\n errorContainer.style.cssText = 'padding: 16px; margin: 12px; border-radius: 8px; background: ' + \n (this.config.messages?.errorBackgroundColor || '#FEE2E2') + ';';\n \n const title = document.createElement('div');\n title.style.cssText = 'font-weight: 600; font-size: 16px; margin-bottom: 8px; color: #991B1B;';\n title.textContent = this.t('domainNotValidated');\n \n const message = document.createElement('div');\n message.style.cssText = 'font-size: 14px; color: #991B1B; line-height: 1.5;';\n message.textContent = this.t('domainErrorMessage');\n \n errorContainer.appendChild(title);\n errorContainer.appendChild(message);\n messages.appendChild(errorContainer);\n } else {\n // Show regular error\n const errorEl = document.createElement('div');\n errorEl.className = 'error-message';\n errorEl.textContent = typeof error === 'string' ? error : (error?.message || error);\n messages.appendChild(errorEl);\n }\n \n messages.scrollTop = messages.scrollHeight;\n }\n\n /**\n * Set active state\n */\n setActive(active) {\n this.isActive = active;\n this.updateSendButtonState();\n }\n}\n\n","export default {\n \"en\": {\n \"landingTitle\": \"How would you like to communicate?\",\n \"voiceCall\": \"Voice Call\",\n \"textChat\": \"Text Chat\",\n \"clickToStartCall\": \"Click to Start Call\",\n \"realTimeVoice\": \"Real-time voice conversation\",\n \"startCall\": \"Start Call\",\n \"listening\": \"Listening...\",\n \"speakFreely\": \"Speak freely\",\n \"liveTranscript\": \"Live Transcript\",\n \"transcriptWillAppear\": \"Transcript will appear here during the call...\",\n \"mute\": \"Mute\",\n \"speaker\": \"Speaker\",\n \"endCall\": \"End Call\",\n \"hello\": \"Hello! How can I help?\",\n \"sendMessage\": \"Send a message to get started\",\n \"online\": \"Online\",\n \"newChat\": \"New Chat\",\n \"back\": \"Back\",\n \"close\": \"Close\",\n \"error\": \"Error\",\n \"typeMessage\": \"Type your message...\",\n \"sendMessageAria\": \"Send message\",\n \"domainNotValidated\": \"Domain not validated\",\n \"domainErrorMessage\": \"This domain is not whitelisted. Please contact the administrator to whitelist your website URL.\"\n },\n \"he\": {\n \"landingTitle\": \"איך תרצה לתקשר?\",\n \"voiceCall\": \"שיחה קולית\",\n \"textChat\": \"צ'אט טקסט\",\n \"clickToStartCall\": \"לחץ להתחלת שיחה\",\n \"realTimeVoice\": \"שיחה קולית בזמן אמת\",\n \"startCall\": \"התחל שיחה\",\n \"listening\": \"מקשיב...\",\n \"speakFreely\": \"דבר בחופשיות\",\n \"liveTranscript\": \"תמלול בזמן אמת\",\n \"transcriptWillAppear\": \"התמלול יופיע כאן במהלך השיחה...\",\n \"mute\": \"השתק\",\n \"speaker\": \"רמקול\",\n \"endCall\": \"סיים שיחה\",\n \"hello\": \"שלום! איך אפשר לעזור?\",\n \"sendMessage\": \"שלח הודעה או עבור למצב קולי לשיחה בזמן אמת\",\n \"online\": \"מקוון\",\n \"newChat\": \"צ'אט חדש\",\n \"back\": \"חזור\",\n \"close\": \"סגור\",\n \"error\": \"שגיאה\",\n \"typeMessage\": \"הקלד הודעה...\",\n \"sendMessageAria\": \"שלח הודעה\",\n \"domainNotValidated\": \"דומיין לא מאומת\",\n \"domainErrorMessage\": \"דומיין זה לא ברשימת המורשים. אנא פנה למנהל המערכת כדי להוסיף את כתובת האתר שלך לרשימה.\"\n },\n \"ar\": {\n \"landingTitle\": \"كيف تريد التواصل؟\",\n \"voiceCall\": \"مكالمة صوتية\",\n \"textChat\": \"دردشة نصية\",\n \"clickToStartCall\": \"انقر لبدء المكالمة\",\n \"realTimeVoice\": \"محادثة صوتية في الوقت الفعلي\",\n \"startCall\": \"ابدأ المكالمة\",\n \"listening\": \"الاستماع...\",\n \"speakFreely\": \"تكلم بحرية\",\n \"liveTranscript\": \"نص مباشر\",\n \"transcriptWillAppear\": \"سيظهر النص هنا أثناء المكالمة...\",\n \"mute\": \"كتم الصوت\",\n \"speaker\": \"مكبر الصوت\",\n \"endCall\": \"إنهاء المكالمة\",\n \"hello\": \"مرحبا! كيف يمكنني المساعدة؟\",\n \"sendMessage\": \"أرسل رسالة للبدء\",\n \"online\": \"متصل\",\n \"newChat\": \"محادثة جديدة\",\n \"back\": \"رجوع\",\n \"close\": \"إغلاق\",\n \"error\": \"خطأ\",\n \"typeMessage\": \"اكتب رسالة...\",\n \"sendMessageAria\": \"إرسال رسالة\",\n \"domainNotValidated\": \"النطاق غير معتمد\",\n \"domainErrorMessage\": \"هذا النطاق غير مسموح به. يرجى الاتصال بالمسؤول لإضافة عنوان موقع الويب الخاص بك إلى القائمة.\"\n },\n \"ru\": {\n \"landingTitle\": \"Как вы хотите общаться?\",\n \"voiceCall\": \"Голосовой звонок\",\n \"textChat\": \"Текстовый чат\",\n \"clickToStartCall\": \"Нажмите, чтобы начать звонок\",\n \"realTimeVoice\": \"Голосовой разговор в реальном времени\",\n \"startCall\": \"Начать звонок\",\n \"listening\": \"Слушаю...\",\n \"speakFreely\": \"Говорите свободно\",\n \"liveTranscript\": \"Живая транскрипция\",\n \"transcriptWillAppear\": \"Транскрипция появится здесь во время звонка...\",\n \"mute\": \"Отключить звук\",\n \"speaker\": \"Динамик\",\n \"endCall\": \"Завершить звонок\",\n \"hello\": \"Привет! Как я могу помочь?\",\n \"sendMessage\": \"Отправьте сообщение для начала\",\n \"online\": \"В сети\",\n \"newChat\": \"Новый чат\",\n \"back\": \"Назад\",\n \"close\": \"Закрыть\",\n \"error\": \"Ошибка\",\n \"typeMessage\": \"Введите сообщение...\",\n \"sendMessageAria\": \"Отправить сообщение\",\n \"domainNotValidated\": \"Домен не проверен\",\n \"domainErrorMessage\": \"Этот домен не в белом списке. Пожалуйста, свяжитесь с администратором, чтобы добавить URL вашего веб-сайта в список.\"\n },\n \"es\": {\n \"landingTitle\": \"¿Cómo te gustaría comunicarte?\",\n \"voiceCall\": \"Llamada de voz\",\n \"textChat\": \"Chat de texto\",\n \"clickToStartCall\": \"Haz clic para iniciar la llamada\",\n \"realTimeVoice\": \"Conversación de voz en tiempo real\",\n \"startCall\": \"Iniciar llamada\",\n \"listening\": \"Escuchando...\",\n \"speakFreely\": \"Habla libremente\",\n \"liveTranscript\": \"Transcripción en vivo\",\n \"transcriptWillAppear\": \"La transcripción aparecerá aquí durante la llamada...\",\n \"mute\": \"Silenciar\",\n \"speaker\": \"Altavoz\",\n \"endCall\": \"Terminar llamada\",\n \"hello\": \"¡Hola! ¿Cómo puedo ayudarte?\",\n \"sendMessage\": \"Envía un mensaje para comenzar\",\n \"online\": \"En línea\",\n \"newChat\": \"Nuevo chat\",\n \"back\": \"Atrás\",\n \"close\": \"Cerrar\",\n \"error\": \"Error\",\n \"typeMessage\": \"Escribe un mensaje...\",\n \"sendMessageAria\": \"Enviar mensaje\",\n \"domainNotValidated\": \"Dominio no validado\",\n \"domainErrorMessage\": \"Este dominio no está en la lista blanca. Por favor, contacte al administrador para agregar la URL de su sitio web a la lista.\"\n },\n \"fr\": {\n \"landingTitle\": \"Comment souhaitez-vous communiquer?\",\n \"voiceCall\": \"Appel vocal\",\n \"textChat\": \"Chat texte\",\n \"clickToStartCall\": \"Cliquez pour démarrer l'appel\",\n \"realTimeVoice\": \"Conversation vocale en temps réel\",\n \"startCall\": \"Démarrer l'appel\",\n \"listening\": \"Écoute...\",\n \"speakFreely\": \"Parlez librement\",\n \"liveTranscript\": \"Transcripción en direct\",\n \"transcriptWillAppear\": \"La transcription apparaîtra ici pendant l'appel...\",\n \"mute\": \"Muet\",\n \"speaker\": \"Haut-parleur\",\n \"endCall\": \"Terminer l'appel\",\n \"hello\": \"Bonjour! Comment puis-je vous aider?\",\n \"sendMessage\": \"Envoyez un message pour commencer\",\n \"online\": \"En ligne\",\n \"newChat\": \"Nouveau chat\",\n \"back\": \"Retour\",\n \"close\": \"Fermer\",\n \"error\": \"Erreur\",\n \"typeMessage\": \"Tapez votre message...\",\n \"sendMessageAria\": \"Envoyer un message\",\n \"domainNotValidated\": \"Domaine non validé\",\n \"domainErrorMessage\": \"Ce domaine n'est pas sur la liste blanche. Veuillez contacter l'administrateur pour ajouter l'URL de votre site Web à la liste.\"\n },\n \"de\": {\n \"landingTitle\": \"Wie möchten Sie kommunizieren?\",\n \"voiceCall\": \"Sprachanruf\",\n \"textChat\": \"Text-Chat\",\n \"clickToStartCall\": \"Klicken Sie, um den Anruf zu starten\",\n \"realTimeVoice\": \"Sprachanruf in Echtzeit\",\n \"startCall\": \"Anruf starten\",\n \"listening\": \"Hören...\",\n \"speakFreely\": \"Sprechen Sie frei\",\n \"liveTranscript\": \"Live-Transkription\",\n \"transcriptWillAppear\": \"Die Transkription erscheint hier während des Anrufs...\",\n \"mute\": \"Stumm\",\n \"speaker\": \"Lautsprecher\",\n \"endCall\": \"Anruf beenden\",\n \"hello\": \"Hallo! Wie kann ich helfen?\",\n \"sendMessage\": \"Senden Sie eine Nachricht zum Starten\",\n \"online\": \"Online\",\n \"newChat\": \"Neuer Chat\",\n \"back\": \"Zurück\",\n \"close\": \"Schließen\",\n \"error\": \"Fehler\",\n \"typeMessage\": \"Geben Sie eine Nachricht ein...\",\n \"sendMessageAria\": \"Nachricht senden\",\n \"domainNotValidated\": \"Domain nicht validiert\",\n \"domainErrorMessage\": \"Diese Domain steht nicht auf der Whitelist. Bitte kontaktieren Sie den Administrator, um die URL Ihrer Website zur Liste hinzuzufügen.\"\n }\n};\n","/**\n * TTPChatWidget - Pre-built UI widget for text chat using TextChatSDK\n * Similar to AgentWidget but designed for text-based chat\n */\n\nimport TextChatSDK from '../core/TextChatSDK.js';\nimport { VoiceInterface } from './VoiceInterface.js';\nimport { TextInterface } from './TextInterface.js';\nimport widgetTranslations from './widget-translations.js';\n\nexport class TTPChatWidget {\n constructor(config = {}) {\n // Merge user config with defaults (backward compatible with simple config)\n this.config = this.mergeWithDefaults(config);\n this.sdk = new TextChatSDK(this.config);\n this.isOpen = false;\n this.isActive = false;\n this.translations = widgetTranslations;\n // Track current view state in unified mode to prevent resetting when widget is recreated\n this.currentView = 'landing'; // 'landing', 'text', or 'voice'\n \n // Initialize interfaces with proper config\n // Voice interface needs voice config merged with main config\n const voiceConfig = {\n ...this.config,\n ...this.config.voice,\n language: this.config.voice?.language || this.config.language || 'en',\n websocketUrl: this.config.voice?.websocketUrl || this.config.websocketUrl || 'wss://speech.talktopc.com/ws/conv',\n translations: this.translations\n };\n this.voiceInterface = new VoiceInterface(voiceConfig);\n // Text interface needs text config merged with main config\n const textConfig = {\n ...this.config,\n ...this.config.text,\n translations: this.translations\n };\n this.textInterface = new TextInterface(textConfig, this.sdk);\n \n this.setupEventHandlers();\n this.createWidget();\n \n // Start open if configured (immediately)\n if (this.config.behavior.startOpen || this.config.behavior.autoOpen) {\n const panel = document.getElementById('text-chat-panel');\n if (panel) {\n this.isOpen = true;\n panel.classList.add('open');\n }\n }\n }\n\n /**\n * Merge user configuration with defaults\n * Supports both simple config (backward compatible) and advanced config\n */\n mergeWithDefaults(userConfig) {\n // Handle legacy position string format\n let positionConfig = userConfig.position || 'bottom-right';\n if (typeof positionConfig === 'string') {\n // Convert legacy format 'bottom-right' to new format\n const parts = positionConfig.split('-');\n positionConfig = {\n vertical: parts[0] || 'bottom',\n horizontal: parts[1] || 'right',\n offset: userConfig.positionOffset || { x: 20, y: 20 }\n };\n }\n\n // Handle legacy primaryColor - default to purple\n const primaryColor = userConfig.primaryColor || userConfig.button?.primaryColor || userConfig.button?.backgroundColor || '#7C3AED';\n \n // Calculate headerColor for use in landing config (needed before landing config is defined)\n const headerColor = userConfig.header?.backgroundColor || userConfig.button?.backgroundColor || primaryColor;\n\n return {\n // Required (agentId is required, appId is optional)\n agentId: userConfig.agentId,\n appId: userConfig.appId,\n getSessionUrl: userConfig.getSessionUrl, // Optional - will auto-construct URL if omitted (for voice)\n websocketUrl: userConfig.websocketUrl, // Optional - defaults to backend.talktopc.com/ws/conv (for text), speech.talktopc.com/ws/conv (for voice)\n demo: userConfig.demo !== false, // Optional - defaults to true\n direction: userConfig.direction || 'ltr', // Optional - text direction: 'ltr' or 'rtl'\n language: userConfig.language || 'en', // Optional - language for voice (defaults to 'en')\n \n // Icon/Image Configuration\n icon: {\n type: userConfig.icon?.type || 'custom', // 'microphone', 'custom', 'emoji', 'text'\n customImage: userConfig.icon?.customImage || 'https://talktopc.com/logo192.png',\n emoji: userConfig.icon?.emoji || '🎤',\n text: userConfig.icon?.text || 'AI',\n size: userConfig.icon?.size || 'medium', // 'small', 'medium', 'large', 'xl'\n backgroundColor: userConfig.icon?.backgroundColor || '#FFFFFF',\n ...userConfig.icon\n },\n \n // Positioning Configuration (supports both object and legacy string)\n position: {\n vertical: positionConfig.vertical || 'bottom',\n horizontal: positionConfig.horizontal || 'right',\n offset: positionConfig.offset || { x: 20, y: 20 },\n ...(typeof userConfig.position === 'object' ? userConfig.position : {})\n },\n \n // Button Configuration\n button: {\n size: userConfig.button?.size || 'medium',\n shape: userConfig.button?.shape || 'circle',\n // Floating button colors (main button)\n backgroundColor: userConfig.button?.backgroundColor || userConfig.icon?.backgroundColor || primaryColor,\n hoverColor: userConfig.button?.hoverColor || '#7C3AED',\n shadow: userConfig.button?.shadow !== false,\n shadowColor: userConfig.button?.shadowColor || 'rgba(0,0,0,0.15)',\n // Legacy support - map to backgroundColor\n primaryColor: userConfig.button?.backgroundColor || userConfig.icon?.backgroundColor || primaryColor,\n ...userConfig.button\n },\n \n // Panel Configuration (common to both voice and text)\n panel: {\n width: userConfig.panel?.width || 350,\n height: userConfig.panel?.height || 500,\n borderRadius: userConfig.panel?.borderRadius || 12,\n backgroundColor: userConfig.panel?.backgroundColor || '#FFFFFF',\n backdropFilter: userConfig.panel?.backdropFilter || null,\n border: userConfig.panel?.border || '1px solid rgba(0,0,0,0.1)',\n ...userConfig.panel\n },\n \n // Voice-specific Configuration\n voice: {\n // Voice button colors (inside panel)\n micButtonColor: userConfig.voice?.micButtonColor || userConfig.panel?.micButtonColor || primaryColor,\n micButtonActiveColor: userConfig.voice?.micButtonActiveColor || userConfig.panel?.micButtonActiveColor || '#EF4444',\n // Voice button hint text (below button)\n micButtonHint: {\n text: userConfig.voice?.micButtonHint?.text || userConfig.panel?.micButtonHint?.text || 'Click the button to start voice conversation',\n color: userConfig.voice?.micButtonHint?.color || userConfig.panel?.micButtonHint?.color || '#6B7280',\n fontSize: userConfig.voice?.micButtonHint?.fontSize || userConfig.panel?.micButtonHint?.fontSize || '12px',\n ...userConfig.voice?.micButtonHint,\n ...userConfig.panel?.micButtonHint\n },\n // Voice interface colors\n avatarBackgroundColor: userConfig.voice?.avatarBackgroundColor || '#667eea',\n avatarActiveBackgroundColor: userConfig.voice?.avatarActiveBackgroundColor || '#667eea',\n statusTitleColor: userConfig.voice?.statusTitleColor || '#1e293b',\n statusSubtitleColor: userConfig.voice?.statusSubtitleColor || '#64748b',\n startCallButtonColor: userConfig.voice?.startCallButtonColor || '#667eea',\n startCallButtonTextColor: userConfig.voice?.startCallButtonTextColor || '#FFFFFF',\n transcriptBackgroundColor: userConfig.voice?.transcriptBackgroundColor || '#FFFFFF',\n transcriptTextColor: userConfig.voice?.transcriptTextColor || '#1e293b',\n transcriptLabelColor: userConfig.voice?.transcriptLabelColor || '#94a3b8',\n controlButtonColor: userConfig.voice?.controlButtonColor || '#FFFFFF',\n controlButtonSecondaryColor: userConfig.voice?.controlButtonSecondaryColor || '#64748b',\n endCallButtonColor: userConfig.voice?.endCallButtonColor || '#ef4444',\n // Voice language setting\n language: userConfig.voice?.language || userConfig.language || 'en',\n // Voice websocket URL (can override global websocketUrl)\n websocketUrl: userConfig.voice?.websocketUrl || userConfig.websocketUrl,\n ...userConfig.voice\n },\n \n // Text-specific Configuration\n text: {\n // Send button colors (inside panel)\n sendButtonColor: userConfig.text?.sendButtonColor || userConfig.panel?.sendButtonColor || '#7C3AED', // Purple default\n sendButtonHoverColor: userConfig.text?.sendButtonHoverColor || userConfig.panel?.sendButtonHoverColor || '#6D28D9',\n sendButtonActiveColor: userConfig.text?.sendButtonActiveColor || userConfig.panel?.sendButtonActiveColor || '#6D28D9', // Purple darker for active\n sendButtonText: userConfig.text?.sendButtonText || userConfig.panel?.sendButtonText || '➤',\n sendButtonTextColor: userConfig.text?.sendButtonTextColor || userConfig.panel?.sendButtonTextColor || '#FFFFFF',\n sendButtonFontSize: userConfig.text?.sendButtonFontSize || userConfig.panel?.sendButtonFontSize || '18px',\n sendButtonFontWeight: userConfig.text?.sendButtonFontWeight || userConfig.panel?.sendButtonFontWeight || '500',\n // Send button hint text (below button or near it)\n sendButtonHint: {\n text: userConfig.text?.sendButtonHint?.text || userConfig.panel?.sendButtonHint?.text || '',\n color: userConfig.text?.sendButtonHint?.color || userConfig.panel?.sendButtonHint?.color || '#6B7280',\n fontSize: userConfig.text?.sendButtonHint?.fontSize || userConfig.panel?.sendButtonHint?.fontSize || '12px',\n ...userConfig.text?.sendButtonHint,\n ...userConfig.panel?.sendButtonHint\n },\n // Input field configuration\n inputPlaceholder: userConfig.text?.inputPlaceholder || userConfig.panel?.inputPlaceholder || 'Type your message...',\n inputBorderColor: userConfig.text?.inputBorderColor || userConfig.panel?.inputBorderColor || '#E5E7EB',\n inputFocusColor: userConfig.text?.inputFocusColor || userConfig.panel?.inputFocusColor || '#7C3AED', // Purple default\n inputBackgroundColor: userConfig.text?.inputBackgroundColor || userConfig.panel?.inputBackgroundColor || '#FFFFFF',\n inputTextColor: userConfig.text?.inputTextColor || userConfig.panel?.inputTextColor || '#1F2937',\n inputFontSize: userConfig.text?.inputFontSize || userConfig.panel?.inputFontSize || '14px',\n inputBorderRadius: userConfig.text?.inputBorderRadius || userConfig.panel?.inputBorderRadius || 20,\n inputPadding: userConfig.text?.inputPadding || userConfig.panel?.inputPadding || '6px 14px',\n ...userConfig.text\n },\n \n // Landing Screen Configuration (only for unified mode)\n landing: {\n backgroundColor: userConfig.landing?.backgroundColor || 'linear-gradient(180deg, #f8fafc 0%, #e0e7ff 100%)',\n logo: userConfig.landing?.logo || '🤖',\n title: userConfig.landing?.title || null, // null means use default translated text\n titleColor: userConfig.landing?.titleColor || '#1e293b',\n modeCardBackgroundColor: userConfig.landing?.modeCardBackgroundColor || '#FFFFFF',\n modeCardBorderColor: userConfig.landing?.modeCardBorderColor || '#E2E8F0',\n modeCardHoverBorderColor: userConfig.landing?.modeCardHoverBorderColor || headerColor,\n modeCardIconBackgroundColor: userConfig.landing?.modeCardIconBackgroundColor || headerColor,\n modeCardTitleColor: userConfig.landing?.modeCardTitleColor || '#111827',\n voiceCardIcon: userConfig.landing?.voiceCardIcon || '🎤',\n textCardIcon: userConfig.landing?.textCardIcon || '💬',\n ...userConfig.landing\n },\n \n // Header Configuration (top of panel)\n header: {\n title: userConfig.header?.title || 'Chat Assistant',\n showTitle: userConfig.header?.showTitle !== false,\n backgroundColor: userConfig.header?.backgroundColor || userConfig.button?.backgroundColor || '#7C3AED', // Default purple\n textColor: userConfig.header?.textColor || '#FFFFFF',\n showCloseButton: userConfig.header?.showCloseButton !== false,\n ...userConfig.header\n },\n \n // Tooltips Configuration\n tooltips: {\n newChat: userConfig.tooltips?.newChat || null, // null means use default based on direction\n back: userConfig.tooltips?.back || null,\n close: userConfig.tooltips?.close || null,\n mute: userConfig.tooltips?.mute || null,\n speaker: userConfig.tooltips?.speaker || null,\n endCall: userConfig.tooltips?.endCall || null,\n ...userConfig.tooltips\n },\n \n // Messages Configuration\n messages: {\n userBackgroundColor: userConfig.messages?.userBackgroundColor || '#E5E7EB',\n agentBackgroundColor: userConfig.messages?.agentBackgroundColor || '#F3F4F6',\n systemBackgroundColor: userConfig.messages?.systemBackgroundColor || '#DCFCE7',\n errorBackgroundColor: userConfig.messages?.errorBackgroundColor || '#FEE2E2',\n textColor: userConfig.messages?.textColor || '#1F2937',\n fontSize: userConfig.messages?.fontSize || '14px',\n borderRadius: userConfig.messages?.borderRadius || 8,\n ...userConfig.messages\n },\n \n // Animation Configuration\n animation: {\n enableHover: userConfig.animation?.enableHover !== false,\n enablePulse: userConfig.animation?.enablePulse !== false,\n enableSlide: userConfig.animation?.enableSlide !== false,\n duration: userConfig.animation?.duration || 0.3,\n ...userConfig.animation\n },\n \n // Behavior Configuration\n behavior: {\n autoOpen: userConfig.behavior?.autoOpen || false,\n startOpen: userConfig.behavior?.startOpen || false,\n hidden: userConfig.behavior?.hidden || false,\n autoConnect: userConfig.behavior?.autoConnect || false,\n showWelcomeMessage: userConfig.behavior?.showWelcomeMessage !== false,\n welcomeMessage: userConfig.behavior?.welcomeMessage || 'Hello! How can I help you today?',\n // Voice selection landing (enabled by default)\n enableVoiceMode: userConfig.behavior?.enableVoiceMode !== undefined ? userConfig.behavior.enableVoiceMode : true,\n // Widget mode: 'unified' (both voice and text with landing screen), 'voice-only' (only voice), 'text-only' (only text)\n mode: userConfig.behavior?.mode || 'unified',\n ...userConfig.behavior\n },\n \n // Accessibility Configuration\n accessibility: {\n ariaLabel: userConfig.accessibility?.ariaLabel || 'Chat Assistant',\n ariaDescription: userConfig.accessibility?.ariaDescription || 'Click to open chat assistant',\n keyboardNavigation: userConfig.accessibility?.keyboardNavigation !== false,\n ...userConfig.accessibility\n },\n \n // Custom CSS\n customStyles: userConfig.customStyles || '',\n \n // Variables for the agent\n variables: userConfig.variables || {},\n // TEST: allow forcing a conversationId for debugging\n forceConversationId: userConfig.forceConversationId,\n \n // Legacy support (for backward compatibility)\n primaryColor: primaryColor,\n // Keep position string for backward compatibility\n ...(typeof userConfig.position === 'string' ? { positionString: userConfig.position } : {})\n };\n }\n\n setupEventHandlers() {\n // Handle domain validation errors\n this.sdk.on('domainError', (error) => {\n this.textInterface.showError(error);\n this.textInterface.stopStreamingState();\n });\n\n this.sdk.on('error', (error) => {\n // Domain errors are handled by domainError event, skip here\n if (error && (error.message === 'DOMAIN_NOT_WHITELISTED' || \n (error.message && error.message.includes('Domain not whitelisted')))) {\n return; // Already handled by domainError event\n }\n this.textInterface.showError(error.message || error);\n this.textInterface.stopStreamingState();\n });\n\n this.sdk.on('chunk', (chunk) => {\n this.textInterface.appendStreamingChunk(chunk);\n });\n\n this.sdk.on('done', ({ text }) => {\n this.textInterface.finalizeStreaming(text);\n });\n }\n\n createWidget() {\n console.log('🏗️ createWidget called', {\n stack: new Error().stack.split('\\n').slice(1, 6).join('\\n')\n });\n \n // Remove existing widget if it exists\n const existingWidget = document.getElementById('text-chat-widget');\n if (existingWidget) {\n existingWidget.remove();\n }\n \n const widget = document.createElement('div');\n widget.id = 'text-chat-widget';\n widget.innerHTML = this.generateWidgetHTML();\n \n document.body.appendChild(widget);\n \n this.setupWidgetEvents();\n \n // Ensure initial open state if configured\n if (this.config.behavior.startOpen || this.config.behavior.autoOpen) {\n const panel = document.getElementById('text-chat-panel');\n if (panel) {\n this.isOpen = true;\n panel.classList.add('open');\n }\n }\n }\n\n generateWidgetHTML() {\n const pos = this.config.position;\n const btn = this.config.button;\n const icon = this.config.icon;\n const panel = this.config.panel;\n const header = this.config.header;\n const anim = this.config.animation;\n\n // Calculate button size\n const buttonSizes = {\n small: 50,\n medium: 60,\n large: 70,\n xl: 80\n };\n const buttonSize = buttonSizes[btn.size] || 60;\n\n // Calculate icon size\n const iconSizes = {\n small: 20,\n medium: 28,\n large: 36,\n xl: 44\n };\n const iconSize = iconSizes[icon.size] || 28;\n\n // Generate position styles\n const positionStyles = this.generatePositionStyles();\n\n // Generate icon HTML\n const iconHTML = this.generateIconHTML(iconSize);\n\n const widgetMode = this.config.behavior.mode || 'unified';\n const showLanding = widgetMode === 'unified';\n const showVoice = widgetMode === 'unified' || widgetMode === 'voice-only';\n const showText = widgetMode === 'unified' || widgetMode === 'text-only';\n const voiceEnabled = showVoice;\n \n // Helper function to get translated text\n const t = (key) => {\n const lang = this.config.language || 'en';\n const translations = this.translations[lang] || this.translations.en;\n return translations[key] || key;\n };\n \n // Helper function to get tooltip text\n const getTooltip = (key) => {\n const tooltip = this.config.tooltips?.[key];\n if (tooltip !== null && tooltip !== undefined) return tooltip;\n // Use translations for default tooltips\n const defaults = {\n newChat: t('newChat'),\n back: t('back'),\n close: t('close'),\n mute: t('mute'),\n speaker: t('speaker'),\n endCall: t('endCall')\n };\n return defaults[key] || '';\n };\n\n return `\n <style>\n ${this.generateCSS(positionStyles, buttonSize, iconSize)}\n ${this.config.customStyles}\n </style>\n \n ${this.config.behavior.hidden ? '' : `\n <button id=\\\"text-chat-button\\\" \n aria-label=\\\"${this.config.accessibility.ariaLabel}\\\"\n aria-description=\\\"${this.config.accessibility.ariaDescription}\\\">\\n ${iconHTML}\\n </button>\n `}\n \n <div id=\"text-chat-panel\">\n <div class=\"widget-shell\">\n <div class=\"panel-inner widget-container\" style=\"direction: ${this.config.direction};\">\n <div class=\"widget-header\" style=\"background: ${header.backgroundColor}; color: ${header.textColor};\">\n <div>\n ${header.showTitle ? `<div class=\"header-title\">${header.title}</div>` : ''}\n <div class=\"header-status\">\n <span class=\"status-dot\"></span>\n <span>${t('online')}</span>\n </div>\n </div>\n \n <div style=\"display: flex; gap: 12px; align-items: center;\">\n <!-- New Chat Button (hide on landing screen, show otherwise) -->\n <button class=\"header-icon new-chat-btn\" id=\"newChatBtn\" title=\"${getTooltip('newChat')}\" style=\"${showLanding ? 'display: none;' : ''}\">\n <span style=\"font-size: 18px; font-weight: bold;\">+</span>\n </button>\n \n <!-- Back Button (only show in unified mode) -->\n ${widgetMode === 'unified' ? `<button class=\"header-icon back-btn\" id=\"backBtn\" title=\"${getTooltip('back')}\" style=\"display: none;\">\n <span style=\"font-size: 16px;\">‹</span>\n </button>` : ''}\n \n <!-- Close Button -->\n ${header.showCloseButton ? '<button class=\"header-icon close-btn\" id=\"closeBtn\" title=\"' + getTooltip('close') + '\">'+\n '<span style=\"font-size: 18px; font-weight: bold;\">×</span>'+\n '</button>' : ''}\n </div>\n </div>\n\n ${showLanding ? `\n <div class=\"landing-screen\" id=\"landingScreen\">\n <div class=\"landing-logo\">🤖</div>\n <div class=\"landing-title\">${t('landingTitle')}</div>\n <div class=\"mode-selection\">\n ${showVoice ? `<div class=\"mode-card voice\" id=\"mode-card-voice\">\n <div class=\"mode-card-icon\">🎤</div>\n <div class=\"mode-card-title\">${t('voiceCall')}</div>\n </div>` : ''}\n ${showText ? `<div class=\"mode-card text\" id=\"mode-card-text\">\n <div class=\"mode-card-icon\">💬</div>\n <div class=\"mode-card-title\">${t('textChat')}</div>\n </div>` : ''}\n </div>\n </div>` : ''}\n\n ${showVoice ? this.voiceInterface.generateHTML() : ''}\n ${showText ? this.textInterface.generateHTML() : ''}\n </div>\n </div>\n </div>\n `;\n }\n\n generatePositionStyles() {\n const pos = this.config.position;\n const offset = pos.offset || { x: 20, y: 20 };\n \n let styles = '';\n \n // Vertical positioning\n if (pos.vertical === 'top') {\n styles += `top: ${offset.y}px;`;\n } else if (pos.vertical === 'bottom') {\n styles += `bottom: ${offset.y}px;`;\n } else if (pos.vertical === 'center') {\n styles += `top: 50%; transform: translateY(-50%);`;\n }\n \n // Horizontal positioning\n if (pos.horizontal === 'left') {\n styles += `left: ${offset.x}px;`;\n } else if (pos.horizontal === 'right') {\n styles += `right: ${offset.x}px;`;\n } else if (pos.horizontal === 'center') {\n styles += `left: 50%; transform: translateX(-50%);`;\n }\n \n return styles;\n }\n\n generateIconHTML(size) {\n const icon = this.config.icon;\n \n switch (icon.type) {\n case 'custom':\n return `<img src=\"${icon.customImage}\" alt=\"Chat Assistant\" style=\"width: ${size}px; height: ${size}px; object-fit: contain;\" />`;\n \n case 'emoji':\n return `<span style=\"font-size: ${size}px; line-height: 1;\">${icon.emoji}</span>`;\n \n case 'text':\n return `<span style=\"font-size: ${Math.floor(size * 0.6)}px; font-weight: bold; color: white;\">${icon.text}</span>`;\n \n case 'microphone':\n default:\n return `<svg viewBox=\"0 0 24 24\" style=\"width: ${size}px; height: ${size}px; fill: white;\">\n <path d=\"M12 14c1.66 0 3-1.34 3-3V5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3z\"/>\n <path d=\"M17 11c0 2.76-2.24 5-5 5s-5-2.24-5-5H5c0 3.53 2.61 6.43 6 6.92V21h2v-3.08c3.39-.49 6-3.39 6-6.92h-2z\"/>\n </svg>`;\n \n case 'chat':\n return `<svg viewBox=\"0 0 24 24\" style=\"width: ${size}px; height: ${size}px; fill: white;\">\n <path d=\"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H6l-2 2V4h16v12z\"/>\n </svg>`;\n }\n }\n\n generateCSS(positionStyles, buttonSize, iconSize) {\n const btn = this.config.button;\n const icon = this.config.icon;\n const panel = this.config.panel;\n const header = this.config.header;\n const messages = this.config.messages;\n const anim = this.config.animation;\n \n // Determine which interfaces to show\n const widgetMode = this.config.behavior.mode || 'unified';\n const showVoice = widgetMode === 'unified' || widgetMode === 'voice-only';\n const showText = widgetMode === 'unified' || widgetMode === 'text-only';\n \n // Color references for clarity (needed for landing screen styles)\n const headerColor = header.backgroundColor;\n\n return `\n /* MOBILE FIRST - Default styles for all devices */\n #text-chat-widget {\n position: fixed !important;\n z-index: 10000;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n /* Mobile defaults */\n right: 10px;\n bottom: 10px;\n left: auto;\n top: auto;\n }\n \n /* Desktop positioning (only on larger screens) */\n @media (min-width: 769px) {\n #text-chat-widget {\n ${positionStyles}\n right: ${this.config.position.horizontal === 'right' ? '20px' : 'auto'};\n left: ${this.config.position.horizontal === 'left' ? '20px' : 'auto'};\n bottom: ${this.config.position.vertical === 'bottom' ? '20px' : 'auto'};\n top: ${this.config.position.vertical === 'top' ? '20px' : 'auto'};\n }\n }\n \n /* Mobile override (force mobile positioning) */\n @media (max-width: 768px) {\n #text-chat-widget {\n right: 10px !important;\n bottom: 10px !important;\n left: auto !important;\n top: auto !important;\n transform: none !important;\n }\n }\n \n @media (max-width: 480px) {\n #text-chat-widget {\n right: 8px !important;\n bottom: 8px !important;\n left: auto !important;\n top: auto !important;\n }\n }\n \n #text-chat-button {\n width: ${buttonSize}px;\n height: ${buttonSize}px;\n border-radius: ${btn.shape === 'circle' ? '50%' : btn.shape === 'square' ? '0' : '12px'};\n background: ${btn.backgroundColor || icon.backgroundColor || '#7C3AED'};\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all ${anim.duration}s ease;\n box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4);\n touch-action: manipulation;\n -webkit-tap-highlight-color: transparent;\n -webkit-touch-callout: none;\n user-select: none;\n min-width: 44px;\n min-height: 44px;\n }\n \n @media (max-width: 768px) {\n #text-chat-widget {\n right: 10px !important;\n bottom: 10px !important;\n left: auto !important;\n top: auto !important;\n transform: none !important;\n }\n \n #text-chat-button {\n width: 56px !important;\n height: 56px !important;\n min-width: 56px !important;\n min-height: 56px !important;\n max-width: 56px !important;\n max-height: 56px !important;\n }\n \n #text-chat-panel {\n position: fixed !important;\n left: 10px !important;\n right: 10px !important;\n bottom: 76px !important; /* 56px button + 20px gap */\n top: 60px !important; /* Add top spacing */\n width: auto !important;\n max-width: none !important;\n height: auto !important; /* Change from max-height to auto */\n max-height: none !important; /* Remove max-height */\n transform: none !important;\n margin: 0 !important;\n }\n \n #text-chat-panel .widget-header {\n padding: 10px 14px;\n min-height: 56px;\n }\n \n #text-chat-panel .header-title {\n font-size: 15px;\n }\n \n #text-chat-panel .header-icon {\n width: 40px;\n height: 40px;\n min-width: 40px;\n min-height: 40px;\n }\n \n #text-chat-input {\n font-size: 16px !important; /* Prevents iOS zoom on focus */\n padding: 12px 16px !important;\n min-height: 48px !important;\n }\n \n #text-chat-send {\n min-width: 48px !important;\n min-height: 48px !important;\n width: 48px !important;\n height: 48px !important;\n }\n \n .landing-screen {\n padding: 16px;\n }\n \n .landing-logo {\n font-size: 40px;\n }\n \n .landing-title {\n font-size: 18px;\n margin-bottom: 16px;\n }\n \n .mode-selection {\n flex-direction: column;\n gap: 12px;\n align-items: center;\n }\n \n .mode-card {\n max-width: 100%;\n width: 100%;\n padding: 16px;\n }\n \n .mode-card-icon {\n width: 50px;\n height: 50px;\n font-size: 28px;\n }\n \n .mode-card-title {\n font-size: 14px;\n }\n }\n \n @media (max-width: 480px) {\n #text-chat-widget {\n right: 8px !important;\n bottom: 8px !important;\n left: auto !important;\n top: auto !important;\n }\n \n #text-chat-button {\n width: 54px !important;\n height: 54px !important;\n min-width: 54px !important;\n min-height: 54px !important;\n }\n \n #text-chat-panel {\n left: 8px !important;\n right: 8px !important;\n bottom: 70px !important;\n top: 50px !important; /* Add top spacing for very small screens */\n height: auto !important;\n max-height: none !important;\n }\n \n #text-chat-panel .widget-header {\n padding: 8px 12px;\n min-height: 52px;\n }\n \n #text-chat-panel .header-title {\n font-size: 14px;\n }\n \n .landing-logo {\n font-size: 36px;\n }\n \n .landing-title {\n font-size: 16px;\n }\n }\n \n ${anim.enableHover ? `\n #text-chat-button:hover {\n background: linear-gradient(135deg, #764ba2 0%, #667eea 100%);\n transform: scale(1.05);\n box-shadow: 0 8px 20px rgba(102, 126, 234, 0.5);\n }\n ` : ''}\n \n #text-chat-panel {\n display: none;\n position: fixed;\n bottom: calc(${buttonSize}px + 20px);\n ${this.config.position.horizontal === 'right' ? 'right: 20px;' : 'left: 20px;'}\n width: ${panel.width}px;\n max-width: calc(100vw - 40px);\n height: ${panel.height}px;\n max-height: calc(100vh - ${buttonSize}px - 40px);\n background: transparent;\n border-radius: ${panel.borderRadius}px;\n border: none;\n flex-direction: column;\n overflow: hidden;\n ${panel.backdropFilter ? `backdrop-filter: ${panel.backdropFilter};` : ''}\n ${anim.enableSlide ? `transition: all ${anim.duration}s ease;` : ''}\n box-sizing: border-box;\n }\n \n #text-chat-panel.open {\n display: flex;\n ${anim.enableSlide ? 'transform: translateY(0); opacity: 1;' : ''}\n }\n\n /* Shell for gradient border/background */\n .widget-shell { width: 100%; height: 100%; padding: 0; border-radius: ${panel.borderRadius}px; background: transparent; box-shadow: 0 20px 60px rgba(0,0,0,0.15); overflow: hidden; display: flex; flex-direction: column; box-sizing: border-box; }\n .panel-inner { width: 100%; height: 100%; background: #ffffff; border-radius: ${panel.borderRadius}px; overflow: hidden; display:flex; flex-direction: column; padding: 0; box-sizing: border-box; max-width: 100%; }\n\n /* New structure styles matching provided design */\n #text-chat-panel .widget-container {\n width: 100%; height: 100%; min-height: 0; background: #FFFFFF; overflow: hidden; display: flex; flex-direction: column; border-radius: ${panel.borderRadius}px;\n container-type: size;\n }\n \n /* Ensure content areas can scroll when height is constrained */\n #text-chat-panel .widget-container > .landing-screen,\n #text-chat-panel .widget-container > .voice-interface,\n #text-chat-panel .widget-container > .text-interface {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n overflow-x: hidden;\n }\n \n /* Header should not scroll */\n #text-chat-panel .widget-header {\n padding: 12px 16px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n border-top-left-radius: ${panel.borderRadius}px;\n border-top-right-radius: ${panel.borderRadius}px;\n flex-shrink: 0;\n min-height: 60px;\n box-sizing: border-box;\n }\n #text-chat-panel .header-title { font-size: 16px; font-weight: 600; }\n #text-chat-panel .header-status { display: flex; align-items: center; gap: 8px; font-size: 12px; opacity: 0.9; }\n #text-chat-panel .status-dot { width: 8px; height: 8px; background: #4ade80; border-radius: 50%; animation: pulse 2s ease-in-out infinite; }\n @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } }\n /* Header icon buttons */\n .header-icon {\n background: rgba(255, 255, 255, 0.2);\n border: none;\n color: white;\n width: 36px;\n height: 36px;\n min-width: 36px;\n min-height: 36px;\n border-radius: 50%;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.2s;\n flex-shrink: 0;\n font-size: 16px;\n padding: 0;\n box-sizing: border-box;\n }\n \n .header-icon:hover {\n background: rgba(255, 255, 255, 0.3);\n }\n \n .header-icon svg {\n pointer-events: none;\n stroke: white;\n fill: none;\n }\n \n .back-btn.visible {\n display: flex !important;\n }\n\n /* Landing and mode selection (shown only if voice enabled) */\n .landing-screen { \n display: none; \n flex: 1; \n padding: 20px; \n background: ${this.config.landing?.backgroundColor || 'linear-gradient(180deg, #f8fafc 0%, #e0e7ff 100%)'}; \n align-items: center; \n justify-content: flex-start; \n flex-direction: column; \n gap: 16px; \n overflow-y: auto; \n min-height: 0; \n }\n .landing-screen.active { display: flex; }\n .landing-logo { font-size: 48px; }\n .landing-title { \n font-size: 20px; \n color: ${this.config.landing?.titleColor || '#1e293b'}; \n font-weight: 700; \n margin-bottom: 20px; \n text-align: center;\n width: 100%;\n }\n .mode-selection { display: flex; gap: 16px; width: 100%; justify-content: center; }\n .mode-card { \n flex: 1; \n max-width: 180px; \n background: ${this.config.landing?.modeCardBackgroundColor || '#FFFFFF'}; \n border: 2px solid ${this.config.landing?.modeCardBorderColor || '#E2E8F0'}; \n border-radius: 20px; \n padding: 20px 12px; \n cursor: pointer; \n display: flex; \n flex-direction: column; \n align-items: center; \n gap: 8px; \n transition: transform ${anim.duration}s ease, box-shadow ${anim.duration}s ease, border-color ${anim.duration}s ease; \n box-shadow: 0 4px 12px rgba(0,0,0,0.05); \n }\n .mode-card:hover { \n transform: translateY(-6px); \n box-shadow: 0 12px 24px rgba(102, 126, 234, 0.2); \n border-color: ${this.config.landing?.modeCardHoverBorderColor || headerColor}; \n }\n .mode-card-icon { \n width: 60px; \n height: 60px; \n display: flex; \n align-items: center; \n justify-content: center; \n border-radius: 50%; \n background: ${this.config.landing?.modeCardIconBackgroundColor || headerColor}; \n color: #fff; \n font-size: 32px; \n }\n .mode-card-title { \n color: ${this.config.landing?.modeCardTitleColor || '#111827'}; \n font-weight: 600; \n text-align: center;\n width: 100%;\n }\n\n ${showVoice ? this.voiceInterface.generateCSS() : ''}\n ${showText ? this.textInterface.generateCSS() : ''}\n \n #text-chat-send-hint {\n text-align: center;\n line-height: 1.4;\n }\n \n .agent-thinking {\n font-style: italic;\n color: #6B7280;\n }\n `;\n }\n\n setupWidgetEvents() {\n console.log('⚙️ setupWidgetEvents called', {\n stack: new Error().stack.split('\\n').slice(1, 6).join('\\n'),\n currentView: this.currentView\n });\n \n const openBtn = document.getElementById('text-chat-button');\n if (openBtn) {\n openBtn.onclick = () => this.togglePanel();\n }\n \n const closeBtn = document.getElementById('closeBtn');\n if (closeBtn) {\n closeBtn.onclick = () => this.togglePanel();\n }\n \n // Voice selection events (based on widget mode)\n const widgetMode = this.config.behavior.mode || 'unified';\n const showLanding = widgetMode === 'unified';\n const showVoice = widgetMode === 'unified' || widgetMode === 'voice-only';\n const showText = widgetMode === 'unified' || widgetMode === 'text-only';\n \n const backBtn = document.getElementById('backBtn');\n const landing = document.getElementById('landingScreen');\n const voiceCard = document.getElementById('mode-card-voice');\n const textCard = document.getElementById('mode-card-text');\n const textInterface = document.getElementById('textInterface');\n const voiceInterface = document.getElementById('voiceInterface');\n \n // Setup back button handler\n if (backBtn) {\n backBtn.onclick = () => this.showLanding();\n }\n \n if (showLanding) {\n if (voiceCard) voiceCard.onclick = () => this.showVoice();\n if (textCard) textCard.onclick = () => this.showText();\n \n // Restore previous view state if user had selected an interface, otherwise show landing\n if (this.currentView === 'text') {\n // User was on text interface, restore it\n if (landing) landing.classList.remove('active');\n if (textInterface) textInterface.classList.add('active');\n if (voiceInterface) voiceInterface.classList.remove('active');\n if (backBtn && widgetMode === 'unified') backBtn.classList.add('visible');\n if (newChatBtn) newChatBtn.style.display = '';\n } else if (this.currentView === 'voice') {\n // User was on voice interface, restore it\n if (landing) landing.classList.remove('active');\n if (textInterface) textInterface.classList.remove('active');\n if (voiceInterface) voiceInterface.classList.add('active');\n if (backBtn && widgetMode === 'unified') backBtn.classList.add('visible');\n if (newChatBtn) newChatBtn.style.display = 'none';\n } else {\n // Initial state or landing: show landing screen\n this.currentView = 'landing';\n if (landing) landing.classList.add('active');\n if (textInterface) textInterface.classList.remove('active');\n if (voiceInterface) voiceInterface.classList.remove('active');\n // Hide back button on landing screen (only exists in unified mode)\n if (backBtn && widgetMode === 'unified') backBtn.classList.remove('visible');\n }\n } else if (widgetMode === 'voice-only') {\n // Voice-only mode: show voice interface directly\n if (voiceInterface) voiceInterface.classList.add('active');\n if (textInterface) textInterface.classList.remove('active');\n if (landing) landing.classList.remove('active');\n // Back button doesn't exist in voice-only mode (only in unified)\n } else if (widgetMode === 'text-only') {\n // Text-only mode: show text interface directly\n if (textInterface) textInterface.classList.add('active');\n if (voiceInterface) voiceInterface.classList.remove('active');\n if (landing) landing.classList.remove('active');\n // Back button doesn't exist in text-only mode (only in unified)\n }\n \n // Setup interface event handlers\n if (showVoice) {\n console.log('⚙️ Setting up voice interface event handlers');\n this.voiceInterface.setupEventHandlers();\n }\n if (showText) {\n console.log('⚙️ Setting up text interface event handlers');\n this.textInterface.setupEventHandlers();\n }\n \n // Setup header button handlers\n const newChatBtn = document.getElementById('newChatBtn');\n \n if (newChatBtn) {\n newChatBtn.onclick = () => this.textInterface.startNewChat();\n // Hide new chat button on landing screen initially\n if (showLanding) {\n newChatBtn.style.display = 'none';\n }\n }\n \n // Keyboard navigation\n if (this.config.accessibility.keyboardNavigation) {\n this.setupKeyboardNavigation();\n }\n }\n\n startNewChat() {\n this.textInterface.startNewChat();\n }\n\n showLanding() {\n const widgetMode = this.config.behavior.mode || 'unified';\n if (widgetMode !== 'unified') return; // Only show landing in unified mode\n this.currentView = 'landing'; // Track state\n const landing = document.getElementById('landingScreen');\n const textInterface = document.getElementById('textInterface');\n const voiceInterface = document.getElementById('voiceInterface');\n const backBtn = document.getElementById('backBtn');\n const newChatBtn = document.getElementById('newChatBtn');\n if (landing) landing.classList.add('active');\n if (textInterface) textInterface.classList.remove('active');\n if (voiceInterface) voiceInterface.classList.remove('active');\n // Hide back button on landing screen\n if (backBtn) backBtn.classList.remove('visible');\n // Hide new chat button on landing screen\n if (newChatBtn) newChatBtn.style.display = 'none';\n }\n\n showText() {\n this.currentView = 'text'; // Track state\n const landing = document.getElementById('landingScreen');\n const voiceInterface = document.getElementById('voiceInterface');\n const backBtn = document.getElementById('backBtn');\n const newChatBtn = document.getElementById('newChatBtn');\n if (landing) landing.classList.remove('active');\n if (voiceInterface) voiceInterface.classList.remove('active');\n this.textInterface.show();\n // Show back button when not on landing (only in unified mode)\n const widgetMode = this.config.behavior.mode || 'unified';\n if (backBtn && widgetMode === 'unified') backBtn.classList.add('visible');\n // Show new chat button when not on landing\n if (newChatBtn) newChatBtn.style.display = '';\n }\n\n showVoice() {\n this.currentView = 'voice'; // Track state\n const landing = document.getElementById('landingScreen');\n const textInterface = document.getElementById('textInterface');\n const voiceInterface = document.getElementById('voiceInterface');\n const backBtn = document.getElementById('backBtn');\n const newChatBtn = document.getElementById('newChatBtn');\n if (landing) landing.classList.remove('active');\n if (textInterface) textInterface.classList.remove('active');\n if (voiceInterface) voiceInterface.classList.add('active');\n // Show back button when not on landing (only in unified mode)\n const widgetMode = this.config.behavior.mode || 'unified';\n if (backBtn && widgetMode === 'unified') backBtn.classList.add('visible');\n // Hide new chat button on voice interface (not applicable)\n if (newChatBtn) newChatBtn.style.display = 'none';\n }\n\n setupKeyboardNavigation() {\n document.addEventListener('keydown', (e) => {\n if (e.key === 'Escape' && this.isOpen) {\n this.togglePanel();\n }\n });\n }\n\n togglePanel() {\n this.isOpen = !this.isOpen;\n const panel = document.getElementById('text-chat-panel');\n panel.classList.toggle('open');\n \n // Focus input when opening\n if (this.isOpen) {\n setTimeout(() => {\n const input = document.getElementById('messageInput');\n if (input) input.focus();\n }, 100);\n }\n \n // Auto-connect if enabled\n if (this.isOpen && !this.isActive && this.config.behavior.autoConnect) {\n this.startChat();\n }\n }\n\n async startChat() {\n // No-op with single-shot design; connection happens per message\n this.isActive = true;\n this.textInterface.setActive(true);\n }\n\n async sendMessage() {\n await this.textInterface.sendMessage();\n }\n\n updateSendButtonState() {\n this.textInterface.updateSendButtonState();\n }\n\n async getSignedUrl() {\n // If getSessionUrl is not provided, construct URL directly from agentId and appId\n if (!this.config.getSessionUrl) {\n if (!this.config.agentId) {\n throw new Error('agentId is required');\n }\n \n // Build WebSocket URL directly\n // Default uses backend.talktopc.com for text chat (path may need adjustment)\n const baseUrl = this.config.websocketUrl || 'wss://backend.talktopc.com/ws/conv';\n const params = new URLSearchParams();\n params.append('agentId', this.config.agentId);\n \n if (this.config.appId) {\n params.append('appId', this.config.appId);\n }\n \n // Add demo flag if in development\n if (this.config.demo !== false) {\n params.append('demo', 'true');\n }\n \n return `${baseUrl}?${params.toString()}`;\n }\n \n // Handle getSessionUrl as string (backend URL)\n if (typeof this.config.getSessionUrl === 'string') {\n const requestBody = {\n agentId: this.config.agentId,\n variables: this.config.variables || {}\n };\n \n // Add appId if provided in config\n if (this.config.appId) {\n requestBody.appId = this.config.appId;\n }\n \n const response = await fetch(this.config.getSessionUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestBody)\n });\n\n if (!response.ok) {\n throw new Error(`Failed to get session URL: ${response.statusText}`);\n }\n\n const data = await response.json();\n return data.signedUrl || data.wsUrl || data.url;\n }\n \n // Handle getSessionUrl as function\n else if (typeof this.config.getSessionUrl === 'function') {\n const params = {\n agentId: this.config.agentId,\n variables: this.config.variables || {}\n };\n \n // Add appId if provided in config\n if (this.config.appId) {\n params.appId = this.config.appId;\n }\n \n const result = await this.config.getSessionUrl(params);\n \n return typeof result === 'string' ? result : (result.signedUrl || result.wsUrl || result.url);\n }\n \n else {\n throw new Error('getSessionUrl must be a string (backend URL), a function, or omitted (for direct connection with agentId/appId)');\n }\n }\n\n // Delegated to TextInterface\n addMessage(type, text) {\n this.textInterface.addMessage(type, text);\n }\n\n beginStreaming() {\n this.textInterface.beginStreaming();\n }\n\n appendStreamingChunk(chunk) {\n this.textInterface.appendStreamingChunk(chunk);\n }\n\n finalizeStreaming(fullText) {\n this.textInterface.finalizeStreaming(fullText);\n }\n\n stopStreamingState() {\n this.textInterface.stopStreamingState();\n }\n\n showError(message) {\n this.textInterface.showError(message);\n }\n\n updateStatus(status) {\n // Status update handler (can be overridden by users)\n }\n\n // Public API methods\n updateConfig(newConfig) {\n console.log('🔄 updateConfig called', {\n newConfig,\n stack: new Error().stack.split('\\n').slice(1, 6).join('\\n')\n });\n \n // Deep merge nested objects\n const mergedConfig = { ...this.config };\n \n // Deep merge panel config if it exists (common config)\n if (newConfig.panel) {\n mergedConfig.panel = { ...this.config.panel, ...newConfig.panel };\n }\n \n // Deep merge voice config if it exists\n if (newConfig.voice) {\n mergedConfig.voice = { ...this.config.voice, ...newConfig.voice };\n // Deep merge micButtonHint if it exists\n if (newConfig.voice.micButtonHint) {\n mergedConfig.voice.micButtonHint = {\n ...this.config.voice?.micButtonHint,\n ...newConfig.voice.micButtonHint\n };\n }\n }\n \n // Deep merge text config if it exists\n if (newConfig.text) {\n mergedConfig.text = { ...this.config.text, ...newConfig.text };\n // Deep merge sendButtonHint if it exists\n if (newConfig.text.sendButtonHint) {\n mergedConfig.text.sendButtonHint = {\n ...this.config.text?.sendButtonHint,\n ...newConfig.text.sendButtonHint\n };\n }\n }\n \n // Update language if provided - must be before mergeWithDefaults\n if (newConfig.language !== undefined) {\n mergedConfig.language = newConfig.language;\n }\n \n // Update direction if language changed to RTL language\n if (newConfig.language !== undefined) {\n const rtlLanguages = ['he', 'ar'];\n if (rtlLanguages.includes(newConfig.language)) {\n mergedConfig.direction = 'rtl';\n } else if (newConfig.direction === undefined) {\n mergedConfig.direction = 'ltr';\n }\n }\n \n // Update translations if provided\n if (newConfig.translations) {\n mergedConfig.translations = newConfig.translations;\n this.translations = newConfig.translations;\n }\n \n // Merge other configs (shallow merge is fine for these)\n if (newConfig.button) {\n mergedConfig.button = { ...this.config.button, ...newConfig.button };\n }\n if (newConfig.header) {\n mergedConfig.header = { ...this.config.header, ...newConfig.header };\n }\n if (newConfig.icon) {\n mergedConfig.icon = { ...this.config.icon, ...newConfig.icon };\n }\n if (newConfig.messages) {\n mergedConfig.messages = { ...this.config.messages, ...newConfig.messages };\n }\n if (newConfig.animation) {\n mergedConfig.animation = { ...this.config.animation, ...newConfig.animation };\n }\n if (newConfig.behavior) {\n mergedConfig.behavior = { ...this.config.behavior, ...newConfig.behavior };\n }\n if (newConfig.accessibility) {\n mergedConfig.accessibility = { ...this.config.accessibility, ...newConfig.accessibility };\n }\n if (newConfig.tooltips) {\n mergedConfig.tooltips = { ...this.config.tooltips, ...newConfig.tooltips };\n }\n if (newConfig.landing) {\n mergedConfig.landing = { ...this.config.landing, ...newConfig.landing };\n }\n \n // Merge direction property (only if not set by language change above)\n if (newConfig.direction !== undefined && mergedConfig.direction === undefined) {\n mergedConfig.direction = newConfig.direction;\n }\n \n // Merge primaryColor if provided\n if (newConfig.primaryColor !== undefined) {\n mergedConfig.primaryColor = newConfig.primaryColor;\n }\n \n // Merge any other top-level properties\n Object.keys(newConfig).forEach(key => {\n if (!['panel', 'button', 'header', 'icon', 'messages', 'direction', 'voice', 'text', 'animation', 'behavior', 'accessibility', 'language', 'tooltips', 'landing', 'primaryColor'].includes(key)) {\n mergedConfig[key] = newConfig[key];\n }\n });\n \n // Store current language before merge to detect changes\n const oldLanguage = this.config?.language || 'en';\n \n this.config = this.mergeWithDefaults(mergedConfig);\n \n // Recreate interfaces with new config (after mergeWithDefaults, so language is current)\n // Ensure language is correctly passed - use the merged config value\n const currentLanguage = this.config.language || 'en';\n const voiceConfig = {\n ...this.config,\n ...this.config.voice,\n language: currentLanguage, // Use the current language from merged config\n websocketUrl: this.config.voice?.websocketUrl || this.config.websocketUrl || 'wss://speech.talktopc.com/ws/conv',\n translations: this.translations\n };\n this.voiceInterface = new VoiceInterface(voiceConfig);\n const textConfig = {\n ...this.config,\n ...this.config.text,\n language: currentLanguage, // Ensure language is set from merged config\n translations: this.translations\n };\n this.textInterface = new TextInterface(textConfig, this.sdk);\n \n // Recreate widget with new config\n const existingWidget = document.getElementById('text-chat-widget');\n if (existingWidget) {\n existingWidget.remove();\n }\n this.createWidget();\n \n // Update input attributes in case widget was recreated\n if (this.textInterface && this.textInterface.updateInputAttributes) {\n this.textInterface.updateInputAttributes();\n }\n }\n\n destroy() {\n const widget = document.getElementById('text-chat-widget');\n if (widget) {\n widget.remove();\n }\n if (this.sdk) {\n this.sdk.destroy();\n }\n // Clean up interface resources\n if (this.voiceInterface) {\n this.voiceInterface.destroy();\n }\n }\n\n // Delegated to VoiceInterface\n async startVoiceCall() {\n await this.voiceInterface.startVoiceCall();\n }\n\n endVoiceCall() {\n this.voiceInterface.endVoiceCall();\n }\n\n toggleMute() {\n this.voiceInterface.toggleMute();\n }\n\n toggleSpeaker() {\n this.voiceInterface.toggleSpeaker();\n }\n}\n\n","/**\n * TTP Agent SDK - Main Entry Point\n * \n * A comprehensive SDK for voice and text interaction with AI agents.\n * Provides real-time audio recording, WebSocket communication, and audio playback.\n * \n * Features:\n * - 🎤 Real-time Audio Recording with AudioWorklet\n * - 💬 Text Chat Support\n * - 🔄 WebSocket Communication with authentication\n * - 🔊 Audio Playback with queue management\n * - ⚛️ React Components\n * - 🌐 Vanilla JavaScript Components\n * - 🎯 Event-driven architecture\n * - 🔒 Multiple authentication methods\n */\n\n// Core SDK\nimport VoiceSDK from './core/VoiceSDK.js';\nimport VoiceSDK_v2 from './v2/VoiceSDK.js';\nimport TextChatSDK from './core/TextChatSDK.js';\nimport WebSocketManager from './core/WebSocketManager.js';\nimport AudioRecorder from './core/AudioRecorder.js';\nimport AudioPlayer from './core/AudioPlayer.js';\nimport EventEmitter from './core/EventEmitter.js';\n\n// React components\nimport VoiceButton from './react/VoiceButton.jsx';\n\n// Vanilla JavaScript components\nimport VanillaVoiceButton from './vanilla/VoiceButton.js';\n\n// TTPChatWidget and AgentSDK (AgentSDK is used by VoiceInterface, which TTPChatWidget uses)\nimport { AgentSDK } from './legacy/AgentSDK.js';\nimport { TTPChatWidget } from './legacy/TextChatWidget.js';\n\n// Version\nexport const VERSION = '2.0.0';\n\n// Named exports\nexport {\n VoiceSDK,\n VoiceSDK_v2,\n TextChatSDK,\n WebSocketManager,\n AudioRecorder,\n AudioPlayer,\n EventEmitter,\n VoiceButton,\n VanillaVoiceButton,\n AgentSDK,\n TTPChatWidget\n};\n\n// Default export for convenience\nexport default {\n VoiceSDK,\n VoiceSDK_v2,\n TextChatSDK,\n WebSocketManager,\n AudioRecorder,\n AudioPlayer,\n EventEmitter,\n VoiceButton,\n VanillaVoiceButton,\n AgentSDK,\n TTPChatWidget,\n VERSION\n};\n"],"names":["root","factory","exports","module","define","amd","window","REACT_ELEMENT_TYPE","Symbol","for","jsxProd","type","config","maybeKey","key","propName","ref","$$typeof","props","jsx","jsxs","iterator","ReactNoopUpdateQueue","isMounted","enqueueForceUpdate","enqueueReplaceState","enqueueSetState","assign","Object","emptyObject","Component","context","updater","this","refs","ComponentDummy","PureComponent","prototype","isReactComponent","setState","partialState","callback","Error","forceUpdate","pureComponentPrototype","constructor","isPureReactComponent","Array","isArray","ReactSharedInternals","H","A","T","S","hasOwnProperty","reportError","useEffect","create","deps","useRef","initialValue","useState","initialState","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","d","definition","o","defineProperty","enumerable","get","obj","prop","call","r","toStringTag","value","EventEmitter","_classCallCheck","events","event","push","filter","cb","_len","arguments","length","args","_key","forEach","apply","error","console","concat","e","t","n","i","c","Generator","u","_regeneratorDefine2","f","p","y","G","v","a","bind","l","TypeError","done","return","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","setPrototypeOf","__proto__","displayName","_regenerator","w","m","_invoke","configurable","writable","asyncGeneratorStep","Promise","resolve","then","_defineProperties","_toPropertyKey","_typeof","toPrimitive","String","_toPrimitive","_isNativeReflectConstruct","Boolean","valueOf","Reflect","construct","_getPrototypeOf","_setPrototypeOf","_EventEmitter","WebSocketSingleton","_this","ReferenceError","_assertThisInitialized","_possibleConstructorReturn","_callSuper","connections","Map","connectionCounts","creatingConnections","Set","_inherits","_callee","url","existingConnection","connection","_this2","_context","has","set","checkConnection","setTimeout","add","WebSocket","addEventListener","delete","emit","_getConnection","_next","_throw","_x","currentCount","newCount","Math","max","readyState","OPEN","close","exists","subscribers","_step","result","_iterator","_createForOfIteratorHelper","entries","s","_step$value","_slicedToArray","err","_step2","_iterator2","_step2$value","clear","WebSocketManager","ws","isConnected","connectionId","reject","Date","now","random","toString","substr","connectResolve","connectReject","webSocketSingleton","getConnection","websocketUrl","setupEventListeners","catch","_connect","_this3","handleOpen","handleClose","handleError","handleMessage","on","eventHandlers","open","message","off","releaseConnection","send","JSON","stringify","warn","data","_this4","ArrayBuffer","Blob","arrayBuffer","parse","getAllConnections","clearAll","_asyncToGenerator","_arrayLikeToArray","AudioRecorder","audioContext","audioWorkletNode","mediaStream","isRecording","audioProcessorPath","slice","name","from","test","_unsupportedIterableToArray","_n","F","next","document","getElementsByTagName","src","includes","URL","basePath","substring","lastIndexOf","_start","processorPath","_t","navigator","mediaDevices","getUserMedia","audio","sampleRate","channelCount","echoCancellation","noiseSuppression","autoGainControl","AudioContext","webkitAudioContext","state","resume","getAudioProcessorPath","audioWorklet","addModule","AudioWorkletNode","createMediaStreamSource","connect","port","onmessage","_event$data","postMessage","enabled","_stop","_callee2","_t2","_context2","getTracks","track","stop","audioContextState","AudioPlayer","audioQueue","isPlaying","isProcessingQueue","currentSource","audioData","audioBlob","createAudioBlob","processQueue","uint8Array","Uint8Array","wasNotPlayingBefore","contextOptions","audioBuffer","isTrulyStarting","source","shift","decodeAudioData","createBufferSource","buffer","destination","onended","start","_processQueue","stopImmediate","wasPlaying","queueLength","ownKeys","keys","getOwnPropertySymbols","getOwnPropertyDescriptor","_objectSpread","_defineProperty","getOwnPropertyDescriptors","defineProperties","VoiceSDK","agentId","appId","ttpId","voice","language","agentSettingsOverride","isDestroyed","webSocketManager","autoReconnect","audioRecorder","audioPlayer","setupEventHandlers","sendHelloMessage","code","reason","domainError","stopRecording","binaryString","atob","charCodeAt","playAudio","sendMessage","sendBinary","wsUrl","buildWebSocketUrl","params","URLSearchParams","append","separator","disconnect","resetReconnectionAttempts","_reconnect","_startRecording","_callee3","_context3","generateTtpId","_stopRecording","_callee4","_t3","_context4","_toggleRecording","_callee5","_context5","startRecording","_handleBargeIn","_callee6","_context6","stopAudioPlayback","newConfig","helloMessage","log","destroy","removeAllListeners","listener","listenerToRemove","onceWrapper","PCMCodec","pcmData","PCMUCodec","pcmuData","input","pcm16","Int16Array","mulawToLinear","pcm16Data","pcmu","linearToMulaw","mulaw","step","sample","sign","exponent","expMask","PCMACodec","pcmaData","alawToLinear","pcma","linearToAlaw","alaw","mantissa","outputFormat","nextStartTime","scheduledBuffers","scheduledSources","pcmChunkQueue","preparedBuffer","isProcessingPcmQueue","isSchedulingFrames","MAX_LOOKAHEAD_SECONDS","codecs","pcm","SUPPORTED_CONTAINERS","SUPPORTED_ENCODINGS","SUPPORTED_SAMPLE_RATES","SUPPORTED_BIT_DEPTHS","SUPPORTED_CHANNELS","format","_this$outputFormat","validateFormat","getDefaultFormat","oldSampleRate","newSampleRate","_format$container","_format$encoding","container","toLowerCase","encoding","bitDepth","channels","binaryData","_playChunk","preparedFrame","_this$audioContext","prepareChunk","requestAnimationFrame","schedulePreparedFrames","processPcmQueue","byteLength","_this$outputFormat2","initializeAudioContext","processedData","padded","int16Array","float32Array","Float32Array","NORMALIZATION","audioDataSampleRate","contextSampleRate","createBuffer","getChannelData","chunkDuration","duration","sampleCount","actualDuration","_schedulePreparedFrames","targetLookaheadFrames","scheduledCount","_loop","currentTime","minStartTime","startTime","round","toFixed","_regeneratorValues","_processPcmQueue","_this$outputFormat3","_this$outputFormat4","_this5","rawData","bytes","isNegotiatedWav","isNegotiatedRaw","looksLikeWav","isWavFile","handleWavFile","handleRawData","wavInfo","parseWavHeader","audioFormat","getEncodingName","bitsPerSample","codec","getCodecForWavFormat","decode","wavHeader","createWavHeader","outputBitDepth","getCodec","toUpperCase","convert24BitTo16Bit","convert8BitTo16Bit","samples","floor","byte0","byte1","byte2","value24","min","value8","normalized","view","DataView","byteOffset","getUint16","getUint32","byteRate","blockAlign","dataLength","numChannels","header","setUint32","setUint16","_this$outputFormat5","_this$outputFormat6","desiredSampleRate","currentSampleRate","abs","latencyHint","wasFirstPlay","shouldEmitStart","_this6","size","stoppedCount","preparedBufferLength","scheduledSourcesCount","ContainerConverter","wavData","fromCharCode","dataChunkStart","dataSize","dataStart","actualDataSize","wavFile","EncodingConverter","encodedData","normalizedEncoding","targetEncoding","encoded","encode","BitDepthConverter","inputBitDepth","inputBytesPerSample","outputBytesPerSample","numSamples","convert24To16","convert16To24","convert16To8","convert24To8","pcm24Data","pcm24","pcm8","SampleRateConverter","inputSampleRate","outputSampleRate","outputLength","offlineContext","inputBuffer","resampledBuffer","resampledFloat32","resampledInt16","_i","ceil","OfflineAudioContext","startRendering","_resample","_x2","_x3","ChannelConverter","inputChannels","outputChannels","monoToStereo","stereoToMono","monoData","bytesPerSample","stereoData","output","inputOffset","outputOffset","j","leftOffset","rightOffset","left","right","mono","AudioFormatConverter","requestedFormat","actualFormat","encodingConverter","conversionSteps","_analyzeConversions","steps","currentData","currentFormat","extracted","needsConversion","extractPcmFromWav","decodeToPcm","convert","resample","encodeFromPcm","wrapPcmInWav","_convert","VoiceSDK_v2","version","outputContainer","getDefaultContainer","outputEncoding","outputCodec","outputFrameDurationMs","protocolVersion","hasEverConnected","outputAudioFormat","requestedOutputFormat","formatConverter","websocket","setupAudioPlayerEvents","setupAudioRecorderEvents","validateConfig","SUPPORTED_INPUT_ENCODINGS","SUPPORTED_INPUT_SAMPLE_RATES","SUPPORTED_INPUT_BIT_DEPTHS","SUPPORTED_INPUT_CHANNELS","join","_format$encoding2","SUPPORTED_OUTPUT_ENCODINGS","SUPPORTED_OUTPUT_SAMPLE_RATES","SUPPORTED_OUTPUT_BIT_DEPTHS","SUPPORTED_OUTPUT_CHANNELS","SUPPORTED_OUTPUT_CONTAINERS","inputFormat","inputError","validateInputFormat","outputError","validateOutputFormat","audioPlayerStatus","getStatus","hasScheduledAudio","isActuallyPlaying","_bargeInChecked","baseUrl","onopen","onerror","onclose","handleBinaryMessage","handleHelloAck","hasOutputFormat","messageType","setOutputFormat","negotiatedFormat","mismatches","getConversionSteps","defaultFormat","_handleBinaryMessage","processedAudio","playbackFormat","decoded","playChunk","_t4","TextChatSDK","scriptConfig","readScriptTagConfig","baseWsUrl","conversationId","getPersistedConversationId","forceConversationId","queue","inFlight","fullResponseBuffer","sdkScript","reverse","find","dataset","_","base","text","trim","task","executeTask","_sendMessage","persisted","socket","primaryUrl","fallbackBase","endsWith","replace","fallbackUrl","triedFallback","messageSent","helloWaitTimer","sendPayload","payload","effectiveConvId","persistConversationId","evt","clearTimeout","content","finalText","answer","fullText","drainQueue","fb","localStorage","setItem","getItem","_arrayWithHoles","_iterableToArrayLimit","_nonIterableRest","_ref","_ref$voice","_ref$language","_ref$autoReconnect","_ref$agentSettingsOve","onConnected","onDisconnected","onRecordingStarted","onRecordingStopped","onPlaybackStarted","onPlaybackStopped","onError","onMessage","onBargeIn","onStopPlaying","_ref$className","className","_ref$style","style","children","_useState2","setIsConnected","_useState4","setIsRecording","_useState6","setIsPlaying","_useState8","setConnectionStatus","voiceSDKRef","current","voiceSDK","handleClick","_ref2","toggleRecording","defaultContent","_jsxs","display","alignItems","gap","_jsx","fontSize","padding","border","borderRadius","backgroundColor","color","cursor","fontWeight","transition","onClick","disabled","VoiceButton","options","body","buttonText","buttonClass","createButton","_this$options$onConne","_this$options","updateButton","_this$options$onDisco","_this$options2","_this$options$onRecor","_this$options3","_this$options$onRecor2","_this$options4","_this$options$onPlayb","_this$options5","_this$options$onPlayb2","_this$options6","_this$options$onError","_this$options7","_this$options$onMessa","_this$options8","_this$options$onBarge","_this$options9","_this$options$onStopP","_this$options0","button","createElement","cssText","appendChild","icon","innerHTML","updateConfig","parentNode","removeChild","AgentSDK","isListening","onTranscript","onAgentSpeaking","isStart","signedUrl","handleWebSocketMessage","user_transcription","_startListening","variables","VoiceInterface","audioStream","callStartTime","callTimerInterval","sdk","isActive","getSessionUrl","setupSDKEventHandlers","updateTranscript","avatar","getElementById","classList","remove","endVoiceCall","showDomainError","showError","_this$config$translat","_this$config$translat2","lang","translations","en","_this$config$tooltips","tooltip","tooltips","mute","speaker","endCall","getTooltip","avatarBg","avatarBackgroundColor","avatarActiveBg","avatarActiveBackgroundColor","statusTitleColor","statusSubtitleColor","startCallBtnColor","startCallButtonColor","startCallBtnTextColor","startCallButtonTextColor","transcriptBg","transcriptBackgroundColor","transcriptTextColor","transcriptLabelColor","controlBtnColor","controlButtonColor","controlBtnSecondaryColor","controlButtonSecondaryColor","endCallButtonColor","callbacks","startCallBtn","endCallBtn","muteBtn","speakerBtn","onclick","startVoiceCall","toggleMute","toggleSpeaker","tryAdjustSizes","attempt","voiceInterface","contains","clientHeight","adjustSizesForContainer","_getSignedUrl","requestBody","response","_params","demo","fetch","method","headers","ok","statusText","json","containerHeight","containerWidth","clientWidth","avatarSize","avatarFontSize","titleSize","subtitleSize","statusHeight","transcriptHeight","buttonSize","primaryButtonSize","gapSize","idleState","activeState","isIdleVisible","isActiveVisible","querySelectorAll","avatars","width","height","el","transcript","querySelector","minHeight","maxHeight","boxSizing","transcriptLabel","transcriptText","btn","svg","iconSize","setProperty","primaryButton","btnHeight","btnFontSize","btnIcon","_startVoiceCall","connected","attempts","_idleState","_activeState","scrollTop","getSignedUrl","startListening","setInterval","elapsed","minutes","seconds","timerEl","textContent","padStart","stopListening","clearInterval","transcriptEl","title","audioTrack","getAudioTracks","muteIcon","muteCross","stroke","TextInterface","streamingEl","hasStartedStreaming","autoResize","keydown","eventHandlersSetup","_this$config$panel","_this$config$sendButt","_this$config$panel2","_this$config$sendButt2","_this$config$panel3","_this$config$sendButt3","_this$config$panel4","_this$config$sendButt4","_this$config$panel5","inputPlaceholder","panel","direction","sendButtonText","sendButtonHint","_this$config$panel6","_this$config$panel7","_this$config$panel8","_this$config$panel9","_this$config$panel0","_this$config$panel1","_this$config$panel10","_this$config$panel11","_this$config$panel12","_this$config$panel13","_this$config$panel14","_this$config$panel15","_this$config$panel16","messages","sendButtonColor","animation","sendButtonHoverColor","sendButtonTextColor","inputBorderColor","inputFocusColor","inputBackgroundColor","inputTextColor","inputFontSize","inputBorderRadius","inputPadding","textColor","userBackgroundColor","agentBackgroundColor","systemBackgroundColor","errorBackgroundColor","sendButtonFontSize","sendButtonFontWeight","sendButton","inputField","newChatBtn","startNewChat","updateInputAttributes","overflow","newHeight","scrollHeight","overflowY","shiftKey","preventDefault","removeItem","focus","_this$config$panel17","placeholder","dir","textAlign","textInterface","_startChat","updateSendButtonState","startChat","addMessage","beginStreaming","stopStreamingState","emptyState","edgeClass","bubble","id","chunk","existing","_this$config$messages","errorContainer","errorEl","active","TTPChatWidget","_this$config$voice","_this$config$voice2","mergeWithDefaults","isOpen","widgetTranslations","currentView","voiceConfig","textConfig","createWidget","behavior","startOpen","autoOpen","userConfig","_userConfig$button","_userConfig$button2","_userConfig$header","_userConfig$button3","_userConfig$icon","_userConfig$icon2","_userConfig$icon3","_userConfig$icon4","_userConfig$icon5","_userConfig$icon6","_userConfig$button4","_userConfig$button5","_userConfig$button6","_userConfig$icon7","_userConfig$button7","_userConfig$button8","_userConfig$button9","_userConfig$button0","_userConfig$icon8","_userConfig$panel","_userConfig$panel2","_userConfig$panel3","_userConfig$panel4","_userConfig$panel5","_userConfig$panel6","_userConfig$voice","_userConfig$panel7","_userConfig$voice2","_userConfig$panel8","_userConfig$voice3","_userConfig$panel9","_userConfig$voice4","_userConfig$panel0","_userConfig$voice5","_userConfig$panel1","_userConfig$voice6","_userConfig$panel10","_userConfig$voice7","_userConfig$voice8","_userConfig$voice9","_userConfig$voice0","_userConfig$voice1","_userConfig$voice10","_userConfig$voice11","_userConfig$voice12","_userConfig$voice13","_userConfig$voice14","_userConfig$voice15","_userConfig$voice16","_userConfig$voice17","_userConfig$voice18","_userConfig$text","_userConfig$panel11","_userConfig$text2","_userConfig$panel12","_userConfig$text3","_userConfig$panel13","_userConfig$text4","_userConfig$panel14","_userConfig$text5","_userConfig$panel15","_userConfig$text6","_userConfig$panel16","_userConfig$text7","_userConfig$panel17","_userConfig$text8","_userConfig$panel18","_userConfig$text9","_userConfig$panel19","_userConfig$text0","_userConfig$panel20","_userConfig$text1","_userConfig$panel21","_userConfig$text10","_userConfig$panel22","_userConfig$text11","_userConfig$panel23","_userConfig$text12","_userConfig$panel24","_userConfig$text13","_userConfig$panel25","_userConfig$text14","_userConfig$panel26","_userConfig$text15","_userConfig$panel27","_userConfig$text16","_userConfig$panel28","_userConfig$text17","_userConfig$panel29","_userConfig$landing","_userConfig$landing2","_userConfig$landing3","_userConfig$landing4","_userConfig$landing5","_userConfig$landing6","_userConfig$landing7","_userConfig$landing8","_userConfig$landing9","_userConfig$landing0","_userConfig$landing1","_userConfig$header2","_userConfig$header3","_userConfig$header4","_userConfig$button1","_userConfig$header5","_userConfig$header6","_userConfig$tooltips","_userConfig$tooltips2","_userConfig$tooltips3","_userConfig$tooltips4","_userConfig$tooltips5","_userConfig$tooltips6","_userConfig$messages","_userConfig$messages2","_userConfig$messages3","_userConfig$messages4","_userConfig$messages5","_userConfig$messages6","_userConfig$messages7","_userConfig$animation","_userConfig$animation2","_userConfig$animation3","_userConfig$animation4","_userConfig$behavior","_userConfig$behavior2","_userConfig$behavior3","_userConfig$behavior4","_userConfig$behavior5","_userConfig$behavior6","_userConfig$behavior7","_userConfig$behavior8","_userConfig$accessibi","_userConfig$accessibi2","_userConfig$accessibi3","positionConfig","position","parts","split","vertical","horizontal","offset","positionOffset","x","primaryColor","headerColor","customImage","emoji","shape","hoverColor","shadow","shadowColor","backdropFilter","micButtonColor","micButtonActiveColor","micButtonHint","sendButtonActiveColor","landing","logo","titleColor","modeCardBackgroundColor","modeCardBorderColor","modeCardHoverBorderColor","modeCardIconBackgroundColor","modeCardTitleColor","voiceCardIcon","textCardIcon","showTitle","showCloseButton","newChat","back","enableHover","enablePulse","enableSlide","hidden","autoConnect","showWelcomeMessage","welcomeMessage","enableVoiceMode","mode","accessibility","ariaLabel","ariaDescription","keyboardNavigation","customStyles","positionString","appendStreamingChunk","finalizeStreaming","stack","existingWidget","widget","generateWidgetHTML","setupWidgetEvents","small","medium","large","xl","positionStyles","generatePositionStyles","iconHTML","generateIconHTML","widgetMode","showLanding","showVoice","showText","_this2$config$tooltip","generateCSS","generateHTML","pos","styles","_this$config$landing","_this$config$landing2","_this$config$landing3","_this$config$landing4","_this$config$landing5","_this$config$landing6","_this$config$landing7","anim","openBtn","togglePanel","closeBtn","backBtn","voiceCard","textCard","setupKeyboardNavigation","show","toggle","setActive","status","_this$config","_this$config$voice4","_this$config$voice3","_this$config$text","mergedConfig","currentLanguage","VERSION","VanillaVoiceButton"],"sourceRoot":""}