{"version":3,"sources":["../../../src/lib/v1/index.ts","../../../src/lib/v1/ConnectedMotionGroup.ts","../../../src/lib/converters.ts","../../../src/lib/v1/motionStateUpdate.ts","../../../src/lib/v1/getLatestTrajectories.ts","../../../node_modules/lodash-es/_listCacheClear.js","../../../node_modules/lodash-es/eq.js","../../../node_modules/lodash-es/_assocIndexOf.js","../../../node_modules/lodash-es/_listCacheDelete.js","../../../node_modules/lodash-es/_listCacheGet.js","../../../node_modules/lodash-es/_listCacheHas.js","../../../node_modules/lodash-es/_listCacheSet.js","../../../node_modules/lodash-es/_ListCache.js","../../../node_modules/lodash-es/_stackClear.js","../../../node_modules/lodash-es/_stackDelete.js","../../../node_modules/lodash-es/_stackGet.js","../../../node_modules/lodash-es/_stackHas.js","../../../node_modules/lodash-es/_freeGlobal.js","../../../node_modules/lodash-es/_root.js","../../../node_modules/lodash-es/_Symbol.js","../../../node_modules/lodash-es/_getRawTag.js","../../../node_modules/lodash-es/_objectToString.js","../../../node_modules/lodash-es/_baseGetTag.js","../../../node_modules/lodash-es/isObject.js","../../../node_modules/lodash-es/isFunction.js","../../../node_modules/lodash-es/_coreJsData.js","../../../node_modules/lodash-es/_isMasked.js","../../../node_modules/lodash-es/_toSource.js","../../../node_modules/lodash-es/_baseIsNative.js","../../../node_modules/lodash-es/_getValue.js","../../../node_modules/lodash-es/_getNative.js","../../../node_modules/lodash-es/_Map.js","../../../node_modules/lodash-es/_nativeCreate.js","../../../node_modules/lodash-es/_hashClear.js","../../../node_modules/lodash-es/_hashDelete.js","../../../node_modules/lodash-es/_hashGet.js","../../../node_modules/lodash-es/_hashHas.js","../../../node_modules/lodash-es/_hashSet.js","../../../node_modules/lodash-es/_Hash.js","../../../node_modules/lodash-es/_mapCacheClear.js","../../../node_modules/lodash-es/_isKeyable.js","../../../node_modules/lodash-es/_getMapData.js","../../../node_modules/lodash-es/_mapCacheDelete.js","../../../node_modules/lodash-es/_mapCacheGet.js","../../../node_modules/lodash-es/_mapCacheHas.js","../../../node_modules/lodash-es/_mapCacheSet.js","../../../node_modules/lodash-es/_MapCache.js","../../../node_modules/lodash-es/_stackSet.js","../../../node_modules/lodash-es/_Stack.js","../../../node_modules/lodash-es/_setCacheAdd.js","../../../node_modules/lodash-es/_setCacheHas.js","../../../node_modules/lodash-es/_SetCache.js","../../../node_modules/lodash-es/_arraySome.js","../../../node_modules/lodash-es/_cacheHas.js","../../../node_modules/lodash-es/_equalArrays.js","../../../node_modules/lodash-es/_Uint8Array.js","../../../node_modules/lodash-es/_mapToArray.js","../../../node_modules/lodash-es/_setToArray.js","../../../node_modules/lodash-es/_equalByTag.js","../../../node_modules/lodash-es/_arrayPush.js","../../../node_modules/lodash-es/isArray.js","../../../node_modules/lodash-es/_baseGetAllKeys.js","../../../node_modules/lodash-es/_arrayFilter.js","../../../node_modules/lodash-es/stubArray.js","../../../node_modules/lodash-es/_getSymbols.js","../../../node_modules/lodash-es/_baseTimes.js","../../../node_modules/lodash-es/isObjectLike.js","../../../node_modules/lodash-es/_baseIsArguments.js","../../../node_modules/lodash-es/isArguments.js","../../../node_modules/lodash-es/stubFalse.js","../../../node_modules/lodash-es/isBuffer.js","../../../node_modules/lodash-es/_isIndex.js","../../../node_modules/lodash-es/isLength.js","../../../node_modules/lodash-es/_baseIsTypedArray.js","../../../node_modules/lodash-es/_baseUnary.js","../../../node_modules/lodash-es/_nodeUtil.js","../../../node_modules/lodash-es/isTypedArray.js","../../../node_modules/lodash-es/_arrayLikeKeys.js","../../../node_modules/lodash-es/_isPrototype.js","../../../node_modules/lodash-es/_overArg.js","../../../node_modules/lodash-es/_nativeKeys.js","../../../node_modules/lodash-es/_baseKeys.js","../../../node_modules/lodash-es/isArrayLike.js","../../../node_modules/lodash-es/keys.js","../../../node_modules/lodash-es/_getAllKeys.js","../../../node_modules/lodash-es/_equalObjects.js","../../../node_modules/lodash-es/_DataView.js","../../../node_modules/lodash-es/_Promise.js","../../../node_modules/lodash-es/_Set.js","../../../node_modules/lodash-es/_WeakMap.js","../../../node_modules/lodash-es/_getTag.js","../../../node_modules/lodash-es/_baseIsEqualDeep.js","../../../node_modules/lodash-es/_baseIsEqual.js","../../../node_modules/lodash-es/isEqual.js","../../../src/lib/v1/JoggerConnection.ts","../../../src/lib/v1/MotionStreamConnection.ts","../../../src/lib/v1/NovaCellAPIClient.ts","../../../src/lib/v1/NovaClient.ts","../../../src/LoginWithAuth0.ts","../../../src/lib/AutoReconnectingWebsocket.ts","../../../src/lib/availableStorage.ts","../../../src/lib/v1/mock/MockNovaInstance.ts","../../../src/lib/v1/ProgramStateConnection.ts"],"sourcesContent":["export * from \"@wandelbots/nova-api/v1\"\nexport * from \"./ConnectedMotionGroup\"\nexport * from \"./getLatestTrajectories\"\nexport * from \"./JoggerConnection\"\nexport * from \"./MotionStreamConnection\"\nexport * from \"./NovaCellAPIClient\"\nexport * from \"./NovaClient\"\nexport * from \"./ProgramStateConnection\"\n","import type {\n  ControllerInstance,\n  MotionGroupPhysical,\n  MotionGroupSpecification,\n  MotionGroupStateResponse,\n  Mounting,\n  RobotControllerState,\n  RobotControllerStateOperationModeEnum,\n  RobotControllerStateSafetyStateEnum,\n  RobotTcp,\n  SafetySetup,\n} from \"@wandelbots/nova-api/v1\"\nimport { makeAutoObservable, runInAction } from \"mobx\"\nimport * as THREE from \"three\"\nimport type { AutoReconnectingWebsocket } from \"../AutoReconnectingWebsocket\"\nimport { tryParseJson } from \"../converters\"\nimport { jointValuesEqual, tcpPoseEqual } from \"./motionStateUpdate\"\nimport type { NovaClient } from \"./NovaClient\"\n\nconst MOTION_DELTA_THRESHOLD = 0.0001\n\nexport type MotionGroupOption = {\n  selectionId: string\n} & MotionGroupPhysical\n\n/**\n * Store representing the current state of a connected motion group.\n */\nexport class ConnectedMotionGroup {\n  static async connect(\n    nova: NovaClient,\n    motionGroupId: string,\n    controllers: ControllerInstance[],\n  ) {\n    const [_motionGroupIndex, controllerId] = motionGroupId.split(\"@\") as [\n      string,\n      string,\n    ]\n    const controller = controllers.find((c) => c.controller === controllerId)\n    const motionGroup = controller?.physical_motion_groups.find(\n      (mg) => mg.motion_group === motionGroupId,\n    )\n    if (!controller || !motionGroup) {\n      throw new Error(\n        `Controller ${controllerId} or motion group ${motionGroupId} not found`,\n      )\n    }\n\n    const motionStateSocket = nova.openReconnectingWebsocket(\n      `/motion-groups/${motionGroupId}/state-stream`,\n    )\n\n    // Wait for the first message to get the initial state\n    const firstMessage = await motionStateSocket.firstMessage()\n    const initialMotionState = tryParseJson(firstMessage.data)\n      ?.result as MotionGroupStateResponse\n\n    if (!initialMotionState) {\n      throw new Error(\n        `Unable to parse initial motion state message ${firstMessage.data}`,\n      )\n    }\n\n    console.log(\n      `Connected motion state websocket to motion group ${motionGroup.motion_group}. Initial state:\\n  `,\n      initialMotionState,\n    )\n\n    // Check if robot is virtual or physical\n    const config = await nova.api.controller.getRobotController(\n      controller.controller,\n    )\n    const isVirtual = config.configuration.kind === \"VirtualController\"\n\n    // If there's a configured mounting, we need it to show the right\n    // position of the robot model\n    const mounting = await (async () => {\n      try {\n        const mounting = await nova.api.motionGroupInfos.getMounting(\n          motionGroup.motion_group,\n        )\n        return mounting\n      } catch (err) {\n        console.error(\n          `Error fetching mounting for ${motionGroup.motion_group}`,\n          err,\n        )\n        return null\n      }\n    })()\n\n    // Open the websocket to monitor controller state for e.g. e-stop\n    const controllerStateSocket = nova.openReconnectingWebsocket(\n      `/controllers/${controller.controller}/state-stream?response_rate=1000`,\n    )\n\n    // Wait for the first message to get the initial state\n    const firstControllerMessage = await controllerStateSocket.firstMessage()\n    const initialControllerState = tryParseJson(firstControllerMessage.data)\n      ?.result as RobotControllerState\n\n    if (!initialControllerState) {\n      throw new Error(\n        `Unable to parse initial controller state message ${firstControllerMessage.data}`,\n      )\n    }\n\n    console.log(\n      `Connected controller state websocket to controller ${controller.controller}. Initial state:\\n  `,\n      initialControllerState,\n    )\n\n    // Find out what TCPs this motion group has (we need it for jogging)\n    const { tcps } = await nova.api.motionGroupInfos.listTcps(motionGroupId)\n\n    const motionGroupSpecification =\n      await nova.api.motionGroupInfos.getMotionGroupSpecification(motionGroupId)\n\n    const safetySetup =\n      await nova.api.motionGroupInfos.getSafetySetup(motionGroupId)\n\n    return new ConnectedMotionGroup(\n      nova,\n      controller,\n      motionGroup,\n      initialMotionState,\n      motionStateSocket,\n      isVirtual,\n      tcps!,\n      motionGroupSpecification,\n      safetySetup,\n      mounting,\n      initialControllerState,\n      controllerStateSocket,\n    )\n  }\n\n  connectedJoggingCartesianSocket: WebSocket | null = null\n  connectedJoggingJointsSocket: WebSocket | null = null\n  planData: any | null // tmp\n  joggingVelocity: number = 10\n\n  // Not mobx-observable as this changes very fast; should be observed\n  // using animation frames\n  rapidlyChangingMotionState: MotionGroupStateResponse\n\n  // Response rate on the websocket should be a bit slower on this one since\n  // we don't use the motion data\n  controllerState: RobotControllerState\n\n  /**\n   * Reflects activation state of the motion group / robot servos. The\n   * movement controls in the UI should only be enabled in the \"active\" state\n   */\n  activationState: \"inactive\" | \"activating\" | \"deactivating\" | \"active\" =\n    \"inactive\"\n\n  constructor(\n    readonly nova: NovaClient,\n    readonly controller: ControllerInstance,\n    readonly motionGroup: MotionGroupPhysical,\n    readonly initialMotionState: MotionGroupStateResponse,\n    readonly motionStateSocket: AutoReconnectingWebsocket,\n    readonly isVirtual: boolean,\n    readonly tcps: RobotTcp[],\n    readonly motionGroupSpecification: MotionGroupSpecification,\n    readonly safetySetup: SafetySetup,\n    readonly mounting: Mounting | null,\n    readonly initialControllerState: RobotControllerState,\n    readonly controllerStateSocket: AutoReconnectingWebsocket,\n  ) {\n    this.rapidlyChangingMotionState = initialMotionState\n    this.controllerState = initialControllerState\n\n    // Track controller state updates (e.g. safety state and operation mode)\n    controllerStateSocket.addEventListener(\"message\", (event) => {\n      const data = tryParseJson(event.data)?.result\n\n      if (!data) {\n        return\n      }\n\n      runInAction(() => {\n        this.controllerState = data\n      })\n    })\n\n    motionStateSocket.addEventListener(\"message\", (event) => {\n      const motionStateResponse = tryParseJson(event.data)?.result as\n        | MotionGroupStateResponse\n        | undefined\n\n      if (!motionStateResponse) {\n        throw new Error(\n          `Failed to get motion state for ${this.motionGroupId}: ${event.data}`,\n        )\n      }\n\n      // handle motionState message\n      if (\n        !jointValuesEqual(\n          this.rapidlyChangingMotionState.state.joint_position.joints,\n          motionStateResponse.state.joint_position.joints,\n          MOTION_DELTA_THRESHOLD,\n        )\n      ) {\n        runInAction(() => {\n          this.rapidlyChangingMotionState.state = motionStateResponse.state\n        })\n      }\n\n      // handle tcpPose message\n      if (\n        !tcpPoseEqual(\n          this.rapidlyChangingMotionState.tcp_pose,\n          motionStateResponse.tcp_pose,\n          MOTION_DELTA_THRESHOLD,\n        )\n      ) {\n        runInAction(() => {\n          this.rapidlyChangingMotionState.tcp_pose =\n            motionStateResponse.tcp_pose\n        })\n      }\n    })\n    makeAutoObservable(this)\n  }\n\n  get motionGroupId() {\n    return this.motionGroup.motion_group\n  }\n\n  get controllerId() {\n    return this.controller.controller\n  }\n\n  get modelFromController() {\n    return this.motionGroup.model_from_controller\n  }\n\n  get wandelscriptIdentifier() {\n    const num = this.motionGroupId.split(\"@\")[0]\n    return `${this.controllerId.replaceAll(\"-\", \"_\")}_${num}`\n  }\n\n  /** Jogging velocity in radians for rotation and joint movement */\n  get joggingVelocityRads() {\n    return (this.joggingVelocity * Math.PI) / 180\n  }\n\n  get joints() {\n    return this.initialMotionState.state.joint_position.joints.map((_, i) => {\n      return {\n        index: i,\n      }\n    })\n  }\n\n  get dhParameters() {\n    return this.motionGroupSpecification.dh_parameters\n  }\n\n  get safetyZones() {\n    return this.safetySetup.safety_zones\n  }\n\n  /** Gets the robot mounting position offset in 3D viz coordinates */\n  get mountingPosition(): [number, number, number] {\n    if (!this.mounting) {\n      return [0, 0, 0]\n    }\n\n    return [\n      this.mounting.pose.position.x / 1000,\n      this.mounting.pose.position.y / 1000,\n      this.mounting.pose.position.z / 1000,\n    ]\n  }\n\n  /** Gets the robot mounting position rotation in 3D viz coordinates */\n  get mountingQuaternion() {\n    const rotationVector = new THREE.Vector3(\n      this.mounting?.pose.orientation?.x || 0,\n      this.mounting?.pose.orientation?.y || 0,\n      this.mounting?.pose.orientation?.z || 0,\n    )\n\n    const magnitude = rotationVector.length()\n    const axis = rotationVector.normalize()\n\n    return new THREE.Quaternion().setFromAxisAngle(axis, magnitude)\n  }\n\n  /**\n   * Whether the controller is currently in a safety state\n   * corresponding to an emergency stop\n   */\n  get isEstopActive() {\n    const estopStates: RobotControllerStateSafetyStateEnum[] = [\n      \"SAFETY_STATE_ROBOT_EMERGENCY_STOP\",\n      \"SAFETY_STATE_DEVICE_EMERGENCY_STOP\",\n    ]\n\n    return estopStates.includes(this.controllerState.safety_state)\n  }\n\n  /**\n   * Whether the controller is in a safety state\n   * that may be non-functional for robot pad purposes\n   */\n  get isMoveableSafetyState() {\n    const goodSafetyStates: RobotControllerStateSafetyStateEnum[] = [\n      \"SAFETY_STATE_NORMAL\",\n      \"SAFETY_STATE_REDUCED\",\n    ]\n\n    return goodSafetyStates.includes(this.controllerState.safety_state)\n  }\n\n  /**\n   * Whether the controller is in an operation mode that allows movement\n   */\n  get isMoveableOperationMode() {\n    const goodOperationModes: RobotControllerStateOperationModeEnum[] = [\n      \"OPERATION_MODE_AUTO\",\n      \"OPERATION_MODE_MANUAL\",\n      \"OPERATION_MODE_MANUAL_T1\",\n      \"OPERATION_MODE_MANUAL_T2\",\n    ]\n\n    return goodOperationModes.includes(this.controllerState.operation_mode)\n  }\n\n  /**\n   * Whether the robot is currently active and can be moved, based on the\n   * safety state, operation mode and servo toggle activation state.\n   */\n  get canBeMoved() {\n    return (\n      this.isMoveableSafetyState &&\n      this.isMoveableOperationMode &&\n      this.activationState === \"active\"\n    )\n  }\n\n  async deactivate() {\n    if (this.activationState !== \"active\") {\n      console.error(\"Tried to deactivate while already deactivating\")\n      return\n    }\n\n    runInAction(() => {\n      this.activationState = \"deactivating\"\n    })\n\n    try {\n      await this.nova.api.controller.setDefaultMode(\n        this.controllerId,\n        \"MODE_MONITOR\",\n      )\n\n      runInAction(() => {\n        this.activationState = \"inactive\"\n      })\n    } catch (err) {\n      runInAction(() => {\n        this.activationState = \"active\"\n      })\n      throw err\n    }\n  }\n\n  async activate() {\n    if (this.activationState !== \"inactive\") {\n      console.error(\"Tried to activate while already activating\")\n      return\n    }\n\n    runInAction(() => {\n      this.activationState = \"activating\"\n    })\n\n    try {\n      await this.nova.api.controller.setDefaultMode(\n        this.controllerId,\n        \"MODE_CONTROL\",\n      )\n\n      runInAction(() => {\n        this.activationState = \"active\"\n      })\n    } catch (err) {\n      runInAction(() => {\n        this.activationState = \"inactive\"\n      })\n      throw err\n    }\n  }\n\n  toggleActivation() {\n    if (this.activationState === \"inactive\") {\n      this.activate()\n    } else if (this.activationState === \"active\") {\n      this.deactivate()\n    }\n  }\n\n  dispose() {\n    this.motionStateSocket.close()\n    if (this.connectedJoggingCartesianSocket)\n      this.connectedJoggingCartesianSocket.close()\n    if (this.connectedJoggingJointsSocket)\n      this.connectedJoggingJointsSocket.close()\n  }\n\n  setJoggingVelocity(velocity: number) {\n    this.joggingVelocity = velocity\n  }\n}\n","import type { Pose } from \"@wandelbots/nova-api/v1\"\n\n/** Try to parse something as JSON; return undefined if we can't */\nexport function tryParseJson(json: unknown): any {\n  try {\n    return JSON.parse(json as string)\n  } catch {\n    return undefined\n  }\n}\n\n/** Try to turn something into JSON; return undefined if we can't */\nexport function tryStringifyJson(json: unknown): string | undefined {\n  try {\n    return JSON.stringify(json)\n  } catch {\n    return undefined\n  }\n}\n\n/**\n * Converts object parameters to query string.\n * e.g. { a: \"1\", b: \"2\" } => \"?a=1&b=2\"\n *      {} => \"\"\n */\nexport function makeUrlQueryString(obj: Record<string, string>): string {\n  const str = new URLSearchParams(obj).toString()\n  return str ? `?${str}` : \"\"\n}\n\n/** Convert radians to degrees */\nexport function radiansToDegrees(radians: number): number {\n  return radians * (180 / Math.PI)\n}\n\n/** Convert degrees to radians */\nexport function degreesToRadians(degrees: number): number {\n  return degrees * (Math.PI / 180)\n}\n\n/**\n * Convert a Pose object representing a motion group position\n * into a string which represents that pose in Wandelscript.\n */\nexport function poseToWandelscriptString(\n  pose: Pick<Pose, \"position\" | \"orientation\">,\n) {\n  const position = [pose.position.x, pose.position.y, pose.position.z]\n  const orientation = [\n    pose.orientation?.x ?? 0,\n    pose.orientation?.y ?? 0,\n    pose.orientation?.z ?? 0,\n  ]\n\n  const positionValues = position.map((v) => v.toFixed(1))\n  // Rotation needs more precision since it's in radians\n  const rotationValues = orientation.map((v) => v.toFixed(4))\n\n  return `(${positionValues.concat(rotationValues).join(\", \")})`\n}\n\n/**\n * Check for coordinate system id equivalence, accounting for the \"world\" default\n * on empty/undefined values.\n */\nexport function isSameCoordinateSystem(\n  firstCoordSystem: string | undefined,\n  secondCoordSystem: string | undefined,\n) {\n  if (!firstCoordSystem) firstCoordSystem = \"world\"\n  if (!secondCoordSystem) secondCoordSystem = \"world\"\n\n  return firstCoordSystem === secondCoordSystem\n}\n","import type { TcpPose } from \"@wandelbots/nova-api/v1\"\n\nexport function jointValuesEqual(\n  oldJointValues: number[],\n  newJointValues: number[],\n  changeDeltaThreshold: number,\n): boolean {\n  if (newJointValues.length !== oldJointValues.length) {\n    return true\n  }\n\n  for (let jointIndex = 0; jointIndex < newJointValues.length; jointIndex++) {\n    if (\n      Math.abs(newJointValues[jointIndex]! - oldJointValues[jointIndex]!) >\n      changeDeltaThreshold\n    ) {\n      return false\n    }\n  }\n\n  return true\n}\n\nexport function tcpPoseEqual(\n  oldTcp: TcpPose | undefined,\n  newTcp: TcpPose | undefined,\n  changeDeltaThreshold: number,\n): boolean {\n  // undefined -> defined (+reverse) transition\n  if ((oldTcp === undefined && newTcp) || (oldTcp && newTcp === undefined)) {\n    return false\n  }\n\n  // the typechecker cannot resolve states to \"!= undefined\" if \"&&\" is used\n  if (oldTcp === undefined || newTcp === undefined) {\n    return true\n  }\n\n  let changedDelta = 0\n  changedDelta += Math.abs(oldTcp.orientation.x - newTcp.orientation.x)\n  changedDelta += Math.abs(oldTcp.orientation.y - newTcp.orientation.y)\n  changedDelta += Math.abs(oldTcp.orientation.z - newTcp.orientation.z)\n  changedDelta += Math.abs(oldTcp.position.x - newTcp.position.x)\n  changedDelta += Math.abs(oldTcp.position.y - newTcp.position.y)\n  changedDelta += Math.abs(oldTcp.position.z - newTcp.position.z)\n\n  if (changedDelta > changeDeltaThreshold) {\n    return false\n  }\n\n  return (\n    oldTcp.coordinate_system === newTcp.coordinate_system &&\n    oldTcp.tcp === newTcp.tcp\n  )\n}\n","import type { GetTrajectoryResponse } from \"@wandelbots/nova-api/v1\"\nimport type { NovaCellAPIClient } from \"./NovaCellAPIClient\"\n\nlet lastMotionIds: Set<string> = new Set()\n\nexport async function getLatestTrajectories(\n  apiClient: NovaCellAPIClient,\n  sampleTime: number = 50,\n  responsesCoordinateSystem?: string,\n): Promise<GetTrajectoryResponse[]> {\n  const newTrajectories: GetTrajectoryResponse[] = []\n\n  try {\n    const motions = await apiClient.motion.listMotions()\n    const currentMotionIds = new Set(motions.motions)\n\n    const newMotionIds = Array.from(currentMotionIds).filter(\n      (id) => !lastMotionIds.has(id),\n    )\n\n    for (const motionId of newMotionIds) {\n      const trajectory = await apiClient.motion.getMotionTrajectory(\n        motionId,\n        sampleTime,\n        responsesCoordinateSystem,\n      )\n      newTrajectories.push(trajectory)\n    }\n\n    lastMotionIds = currentMotionIds\n  } catch (error) {\n    console.error(\"Failed to get latest trajectories:\", error)\n  }\n\n  return newTrajectories\n}\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n  this.__data__ = [];\n  this.size = 0;\n}\n\nexport default listCacheClear;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n  return value === other || (value !== value && other !== other);\n}\n\nexport default eq;\n","import eq from './eq.js';\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n  var length = array.length;\n  while (length--) {\n    if (eq(array[length][0], key)) {\n      return length;\n    }\n  }\n  return -1;\n}\n\nexport default assocIndexOf;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    return false;\n  }\n  var lastIndex = data.length - 1;\n  if (index == lastIndex) {\n    data.pop();\n  } else {\n    splice.call(data, index, 1);\n  }\n  --this.size;\n  return true;\n}\n\nexport default listCacheDelete;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  return index < 0 ? undefined : data[index][1];\n}\n\nexport default listCacheGet;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n  return assocIndexOf(this.__data__, key) > -1;\n}\n\nexport default listCacheHas;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    ++this.size;\n    data.push([key, value]);\n  } else {\n    data[index][1] = value;\n  }\n  return this;\n}\n\nexport default listCacheSet;\n","import listCacheClear from './_listCacheClear.js';\nimport listCacheDelete from './_listCacheDelete.js';\nimport listCacheGet from './_listCacheGet.js';\nimport listCacheHas from './_listCacheHas.js';\nimport listCacheSet from './_listCacheSet.js';\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nexport default ListCache;\n","import ListCache from './_ListCache.js';\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n  this.__data__ = new ListCache;\n  this.size = 0;\n}\n\nexport default stackClear;\n","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n  var data = this.__data__,\n      result = data['delete'](key);\n\n  this.size = data.size;\n  return result;\n}\n\nexport default stackDelete;\n","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n  return this.__data__.get(key);\n}\n\nexport default stackGet;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n  return this.__data__.has(key);\n}\n\nexport default stackHas;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nexport default freeGlobal;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nexport default root;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nexport default Symbol;\n","import Symbol from './_Symbol.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n  var isOwn = hasOwnProperty.call(value, symToStringTag),\n      tag = value[symToStringTag];\n\n  try {\n    value[symToStringTag] = undefined;\n    var unmasked = true;\n  } catch (e) {}\n\n  var result = nativeObjectToString.call(value);\n  if (unmasked) {\n    if (isOwn) {\n      value[symToStringTag] = tag;\n    } else {\n      delete value[symToStringTag];\n    }\n  }\n  return result;\n}\n\nexport default getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n  return nativeObjectToString.call(value);\n}\n\nexport default objectToString;\n","import Symbol from './_Symbol.js';\nimport getRawTag from './_getRawTag.js';\nimport objectToString from './_objectToString.js';\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n    undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n  if (value == null) {\n    return value === undefined ? undefinedTag : nullTag;\n  }\n  return (symToStringTag && symToStringTag in Object(value))\n    ? getRawTag(value)\n    : objectToString(value);\n}\n\nexport default baseGetTag;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return value != null && (type == 'object' || type == 'function');\n}\n\nexport default isObject;\n","import baseGetTag from './_baseGetTag.js';\nimport isObject from './isObject.js';\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n    funcTag = '[object Function]',\n    genTag = '[object GeneratorFunction]',\n    proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n  if (!isObject(value)) {\n    return false;\n  }\n  // The use of `Object#toString` avoids issues with the `typeof` operator\n  // in Safari 9 which returns 'object' for typed arrays and other constructors.\n  var tag = baseGetTag(value);\n  return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nexport default isFunction;\n","import root from './_root.js';\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nexport default coreJsData;\n","import coreJsData from './_coreJsData.js';\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n  var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n  return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n  return !!maskSrcKey && (maskSrcKey in func);\n}\n\nexport default isMasked;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n  if (func != null) {\n    try {\n      return funcToString.call(func);\n    } catch (e) {}\n    try {\n      return (func + '');\n    } catch (e) {}\n  }\n  return '';\n}\n\nexport default toSource;\n","import isFunction from './isFunction.js';\nimport isMasked from './_isMasked.js';\nimport isObject from './isObject.js';\nimport toSource from './_toSource.js';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n    objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n  funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n  .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n *  else `false`.\n */\nfunction baseIsNative(value) {\n  if (!isObject(value) || isMasked(value)) {\n    return false;\n  }\n  var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n  return pattern.test(toSource(value));\n}\n\nexport default baseIsNative;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n  return object == null ? undefined : object[key];\n}\n\nexport default getValue;\n","import baseIsNative from './_baseIsNative.js';\nimport getValue from './_getValue.js';\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n  var value = getValue(object, key);\n  return baseIsNative(value) ? value : undefined;\n}\n\nexport default getNative;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nexport default Map;\n","import getNative from './_getNative.js';\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nexport default nativeCreate;\n","import nativeCreate from './_nativeCreate.js';\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n  this.__data__ = nativeCreate ? nativeCreate(null) : {};\n  this.size = 0;\n}\n\nexport default hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n  var result = this.has(key) && delete this.__data__[key];\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\nexport default hashDelete;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n  var data = this.__data__;\n  if (nativeCreate) {\n    var result = data[key];\n    return result === HASH_UNDEFINED ? undefined : result;\n  }\n  return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nexport default hashGet;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n  var data = this.__data__;\n  return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nexport default hashHas;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n  var data = this.__data__;\n  this.size += this.has(key) ? 0 : 1;\n  data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n  return this;\n}\n\nexport default hashSet;\n","import hashClear from './_hashClear.js';\nimport hashDelete from './_hashDelete.js';\nimport hashGet from './_hashGet.js';\nimport hashHas from './_hashHas.js';\nimport hashSet from './_hashSet.js';\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nexport default Hash;\n","import Hash from './_Hash.js';\nimport ListCache from './_ListCache.js';\nimport Map from './_Map.js';\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n  this.size = 0;\n  this.__data__ = {\n    'hash': new Hash,\n    'map': new (Map || ListCache),\n    'string': new Hash\n  };\n}\n\nexport default mapCacheClear;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n  var type = typeof value;\n  return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n    ? (value !== '__proto__')\n    : (value === null);\n}\n\nexport default isKeyable;\n","import isKeyable from './_isKeyable.js';\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n  var data = map.__data__;\n  return isKeyable(key)\n    ? data[typeof key == 'string' ? 'string' : 'hash']\n    : data.map;\n}\n\nexport default getMapData;\n","import getMapData from './_getMapData.js';\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n  var result = getMapData(this, key)['delete'](key);\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\nexport default mapCacheDelete;\n","import getMapData from './_getMapData.js';\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n  return getMapData(this, key).get(key);\n}\n\nexport default mapCacheGet;\n","import getMapData from './_getMapData.js';\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n  return getMapData(this, key).has(key);\n}\n\nexport default mapCacheHas;\n","import getMapData from './_getMapData.js';\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n  var data = getMapData(this, key),\n      size = data.size;\n\n  data.set(key, value);\n  this.size += data.size == size ? 0 : 1;\n  return this;\n}\n\nexport default mapCacheSet;\n","import mapCacheClear from './_mapCacheClear.js';\nimport mapCacheDelete from './_mapCacheDelete.js';\nimport mapCacheGet from './_mapCacheGet.js';\nimport mapCacheHas from './_mapCacheHas.js';\nimport mapCacheSet from './_mapCacheSet.js';\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nexport default MapCache;\n","import ListCache from './_ListCache.js';\nimport Map from './_Map.js';\nimport MapCache from './_MapCache.js';\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n  var data = this.__data__;\n  if (data instanceof ListCache) {\n    var pairs = data.__data__;\n    if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n      pairs.push([key, value]);\n      this.size = ++data.size;\n      return this;\n    }\n    data = this.__data__ = new MapCache(pairs);\n  }\n  data.set(key, value);\n  this.size = data.size;\n  return this;\n}\n\nexport default stackSet;\n","import ListCache from './_ListCache.js';\nimport stackClear from './_stackClear.js';\nimport stackDelete from './_stackDelete.js';\nimport stackGet from './_stackGet.js';\nimport stackHas from './_stackHas.js';\nimport stackSet from './_stackSet.js';\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n  var data = this.__data__ = new ListCache(entries);\n  this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nexport default Stack;\n","/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n  this.__data__.set(value, HASH_UNDEFINED);\n  return this;\n}\n\nexport default setCacheAdd;\n","/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n  return this.__data__.has(value);\n}\n\nexport default setCacheHas;\n","import MapCache from './_MapCache.js';\nimport setCacheAdd from './_setCacheAdd.js';\nimport setCacheHas from './_setCacheHas.js';\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n  var index = -1,\n      length = values == null ? 0 : values.length;\n\n  this.__data__ = new MapCache;\n  while (++index < length) {\n    this.add(values[index]);\n  }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nexport default SetCache;\n","/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n *  else `false`.\n */\nfunction arraySome(array, predicate) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    if (predicate(array[index], index, array)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nexport default arraySome;\n","/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n  return cache.has(key);\n}\n\nexport default cacheHas;\n","import SetCache from './_SetCache.js';\nimport arraySome from './_arraySome.js';\nimport cacheHas from './_cacheHas.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n  var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n      arrLength = array.length,\n      othLength = other.length;\n\n  if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n    return false;\n  }\n  // Check that cyclic values are equal.\n  var arrStacked = stack.get(array);\n  var othStacked = stack.get(other);\n  if (arrStacked && othStacked) {\n    return arrStacked == other && othStacked == array;\n  }\n  var index = -1,\n      result = true,\n      seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n  stack.set(array, other);\n  stack.set(other, array);\n\n  // Ignore non-index properties.\n  while (++index < arrLength) {\n    var arrValue = array[index],\n        othValue = other[index];\n\n    if (customizer) {\n      var compared = isPartial\n        ? customizer(othValue, arrValue, index, other, array, stack)\n        : customizer(arrValue, othValue, index, array, other, stack);\n    }\n    if (compared !== undefined) {\n      if (compared) {\n        continue;\n      }\n      result = false;\n      break;\n    }\n    // Recursively compare arrays (susceptible to call stack limits).\n    if (seen) {\n      if (!arraySome(other, function(othValue, othIndex) {\n            if (!cacheHas(seen, othIndex) &&\n                (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n              return seen.push(othIndex);\n            }\n          })) {\n        result = false;\n        break;\n      }\n    } else if (!(\n          arrValue === othValue ||\n            equalFunc(arrValue, othValue, bitmask, customizer, stack)\n        )) {\n      result = false;\n      break;\n    }\n  }\n  stack['delete'](array);\n  stack['delete'](other);\n  return result;\n}\n\nexport default equalArrays;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nexport default Uint8Array;\n","/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n  var index = -1,\n      result = Array(map.size);\n\n  map.forEach(function(value, key) {\n    result[++index] = [key, value];\n  });\n  return result;\n}\n\nexport default mapToArray;\n","/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n  var index = -1,\n      result = Array(set.size);\n\n  set.forEach(function(value) {\n    result[++index] = value;\n  });\n  return result;\n}\n\nexport default setToArray;\n","import Symbol from './_Symbol.js';\nimport Uint8Array from './_Uint8Array.js';\nimport eq from './eq.js';\nimport equalArrays from './_equalArrays.js';\nimport mapToArray from './_mapToArray.js';\nimport setToArray from './_setToArray.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n  switch (tag) {\n    case dataViewTag:\n      if ((object.byteLength != other.byteLength) ||\n          (object.byteOffset != other.byteOffset)) {\n        return false;\n      }\n      object = object.buffer;\n      other = other.buffer;\n\n    case arrayBufferTag:\n      if ((object.byteLength != other.byteLength) ||\n          !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n        return false;\n      }\n      return true;\n\n    case boolTag:\n    case dateTag:\n    case numberTag:\n      // Coerce booleans to `1` or `0` and dates to milliseconds.\n      // Invalid dates are coerced to `NaN`.\n      return eq(+object, +other);\n\n    case errorTag:\n      return object.name == other.name && object.message == other.message;\n\n    case regexpTag:\n    case stringTag:\n      // Coerce regexes to strings and treat strings, primitives and objects,\n      // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n      // for more details.\n      return object == (other + '');\n\n    case mapTag:\n      var convert = mapToArray;\n\n    case setTag:\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n      convert || (convert = setToArray);\n\n      if (object.size != other.size && !isPartial) {\n        return false;\n      }\n      // Assume cyclic values are equal.\n      var stacked = stack.get(object);\n      if (stacked) {\n        return stacked == other;\n      }\n      bitmask |= COMPARE_UNORDERED_FLAG;\n\n      // Recursively compare objects (susceptible to call stack limits).\n      stack.set(object, other);\n      var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n      stack['delete'](object);\n      return result;\n\n    case symbolTag:\n      if (symbolValueOf) {\n        return symbolValueOf.call(object) == symbolValueOf.call(other);\n      }\n  }\n  return false;\n}\n\nexport default equalByTag;\n","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n  var index = -1,\n      length = values.length,\n      offset = array.length;\n\n  while (++index < length) {\n    array[offset + index] = values[index];\n  }\n  return array;\n}\n\nexport default arrayPush;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nexport default isArray;\n","import arrayPush from './_arrayPush.js';\nimport isArray from './isArray.js';\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n  var result = keysFunc(object);\n  return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nexport default baseGetAllKeys;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n  var index = -1,\n      length = array == null ? 0 : array.length,\n      resIndex = 0,\n      result = [];\n\n  while (++index < length) {\n    var value = array[index];\n    if (predicate(value, index, array)) {\n      result[resIndex++] = value;\n    }\n  }\n  return result;\n}\n\nexport default arrayFilter;\n","/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n  return [];\n}\n\nexport default stubArray;\n","import arrayFilter from './_arrayFilter.js';\nimport stubArray from './stubArray.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n  if (object == null) {\n    return [];\n  }\n  object = Object(object);\n  return arrayFilter(nativeGetSymbols(object), function(symbol) {\n    return propertyIsEnumerable.call(object, symbol);\n  });\n};\n\nexport default getSymbols;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n  var index = -1,\n      result = Array(n);\n\n  while (++index < n) {\n    result[index] = iteratee(index);\n  }\n  return result;\n}\n\nexport default baseTimes;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return value != null && typeof value == 'object';\n}\n\nexport default isObjectLike;\n","import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n  return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nexport default baseIsArguments;\n","import baseIsArguments from './_baseIsArguments.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n *  else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n  return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n    !propertyIsEnumerable.call(value, 'callee');\n};\n\nexport default isArguments;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n  return false;\n}\n\nexport default stubFalse;\n","import root from './_root.js';\nimport stubFalse from './stubFalse.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nexport default isBuffer;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n  var type = typeof value;\n  length = length == null ? MAX_SAFE_INTEGER : length;\n\n  return !!length &&\n    (type == 'number' ||\n      (type != 'symbol' && reIsUint.test(value))) &&\n        (value > -1 && value % 1 == 0 && value < length);\n}\n\nexport default isIndex;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n  return typeof value == 'number' &&\n    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nexport default isLength;\n","import baseGetTag from './_baseGetTag.js';\nimport isLength from './isLength.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n  return isObjectLike(value) &&\n    isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nexport default baseIsTypedArray;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n  return function(value) {\n    return func(value);\n  };\n}\n\nexport default baseUnary;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n  try {\n    // Use `util.types` for Node.js 10+.\n    var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n    if (types) {\n      return types;\n    }\n\n    // Legacy `process.binding('util')` for Node.js < 10.\n    return freeProcess && freeProcess.binding && freeProcess.binding('util');\n  } catch (e) {}\n}());\n\nexport default nodeUtil;\n","import baseIsTypedArray from './_baseIsTypedArray.js';\nimport baseUnary from './_baseUnary.js';\nimport nodeUtil from './_nodeUtil.js';\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nexport default isTypedArray;\n","import baseTimes from './_baseTimes.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\nimport isBuffer from './isBuffer.js';\nimport isIndex from './_isIndex.js';\nimport isTypedArray from './isTypedArray.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n  var isArr = isArray(value),\n      isArg = !isArr && isArguments(value),\n      isBuff = !isArr && !isArg && isBuffer(value),\n      isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n      skipIndexes = isArr || isArg || isBuff || isType,\n      result = skipIndexes ? baseTimes(value.length, String) : [],\n      length = result.length;\n\n  for (var key in value) {\n    if ((inherited || hasOwnProperty.call(value, key)) &&\n        !(skipIndexes && (\n           // Safari 9 has enumerable `arguments.length` in strict mode.\n           key == 'length' ||\n           // Node.js 0.10 has enumerable non-index properties on buffers.\n           (isBuff && (key == 'offset' || key == 'parent')) ||\n           // PhantomJS 2 has enumerable non-index properties on typed arrays.\n           (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n           // Skip index properties.\n           isIndex(key, length)\n        ))) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nexport default arrayLikeKeys;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n  var Ctor = value && value.constructor,\n      proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n  return value === proto;\n}\n\nexport default isPrototype;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n  return function(arg) {\n    return func(transform(arg));\n  };\n}\n\nexport default overArg;\n","import overArg from './_overArg.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nexport default nativeKeys;\n","import isPrototype from './_isPrototype.js';\nimport nativeKeys from './_nativeKeys.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n  if (!isPrototype(object)) {\n    return nativeKeys(object);\n  }\n  var result = [];\n  for (var key in Object(object)) {\n    if (hasOwnProperty.call(object, key) && key != 'constructor') {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nexport default baseKeys;\n","import isFunction from './isFunction.js';\nimport isLength from './isLength.js';\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n  return value != null && isLength(value.length) && !isFunction(value);\n}\n\nexport default isArrayLike;\n","import arrayLikeKeys from './_arrayLikeKeys.js';\nimport baseKeys from './_baseKeys.js';\nimport isArrayLike from './isArrayLike.js';\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n  return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nexport default keys;\n","import baseGetAllKeys from './_baseGetAllKeys.js';\nimport getSymbols from './_getSymbols.js';\nimport keys from './keys.js';\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n  return baseGetAllKeys(object, keys, getSymbols);\n}\n\nexport default getAllKeys;\n","import getAllKeys from './_getAllKeys.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n  var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n      objProps = getAllKeys(object),\n      objLength = objProps.length,\n      othProps = getAllKeys(other),\n      othLength = othProps.length;\n\n  if (objLength != othLength && !isPartial) {\n    return false;\n  }\n  var index = objLength;\n  while (index--) {\n    var key = objProps[index];\n    if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n      return false;\n    }\n  }\n  // Check that cyclic values are equal.\n  var objStacked = stack.get(object);\n  var othStacked = stack.get(other);\n  if (objStacked && othStacked) {\n    return objStacked == other && othStacked == object;\n  }\n  var result = true;\n  stack.set(object, other);\n  stack.set(other, object);\n\n  var skipCtor = isPartial;\n  while (++index < objLength) {\n    key = objProps[index];\n    var objValue = object[key],\n        othValue = other[key];\n\n    if (customizer) {\n      var compared = isPartial\n        ? customizer(othValue, objValue, key, other, object, stack)\n        : customizer(objValue, othValue, key, object, other, stack);\n    }\n    // Recursively compare objects (susceptible to call stack limits).\n    if (!(compared === undefined\n          ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n          : compared\n        )) {\n      result = false;\n      break;\n    }\n    skipCtor || (skipCtor = key == 'constructor');\n  }\n  if (result && !skipCtor) {\n    var objCtor = object.constructor,\n        othCtor = other.constructor;\n\n    // Non `Object` object instances with different constructors are not equal.\n    if (objCtor != othCtor &&\n        ('constructor' in object && 'constructor' in other) &&\n        !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n          typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n      result = false;\n    }\n  }\n  stack['delete'](object);\n  stack['delete'](other);\n  return result;\n}\n\nexport default equalObjects;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nexport default DataView;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nexport default Promise;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nexport default Set;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nexport default WeakMap;\n","import DataView from './_DataView.js';\nimport Map from './_Map.js';\nimport Promise from './_Promise.js';\nimport Set from './_Set.js';\nimport WeakMap from './_WeakMap.js';\nimport baseGetTag from './_baseGetTag.js';\nimport toSource from './_toSource.js';\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n    objectTag = '[object Object]',\n    promiseTag = '[object Promise]',\n    setTag = '[object Set]',\n    weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n    mapCtorString = toSource(Map),\n    promiseCtorString = toSource(Promise),\n    setCtorString = toSource(Set),\n    weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n    (Map && getTag(new Map) != mapTag) ||\n    (Promise && getTag(Promise.resolve()) != promiseTag) ||\n    (Set && getTag(new Set) != setTag) ||\n    (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n  getTag = function(value) {\n    var result = baseGetTag(value),\n        Ctor = result == objectTag ? value.constructor : undefined,\n        ctorString = Ctor ? toSource(Ctor) : '';\n\n    if (ctorString) {\n      switch (ctorString) {\n        case dataViewCtorString: return dataViewTag;\n        case mapCtorString: return mapTag;\n        case promiseCtorString: return promiseTag;\n        case setCtorString: return setTag;\n        case weakMapCtorString: return weakMapTag;\n      }\n    }\n    return result;\n  };\n}\n\nexport default getTag;\n","import Stack from './_Stack.js';\nimport equalArrays from './_equalArrays.js';\nimport equalByTag from './_equalByTag.js';\nimport equalObjects from './_equalObjects.js';\nimport getTag from './_getTag.js';\nimport isArray from './isArray.js';\nimport isBuffer from './isBuffer.js';\nimport isTypedArray from './isTypedArray.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n  var objIsArr = isArray(object),\n      othIsArr = isArray(other),\n      objTag = objIsArr ? arrayTag : getTag(object),\n      othTag = othIsArr ? arrayTag : getTag(other);\n\n  objTag = objTag == argsTag ? objectTag : objTag;\n  othTag = othTag == argsTag ? objectTag : othTag;\n\n  var objIsObj = objTag == objectTag,\n      othIsObj = othTag == objectTag,\n      isSameTag = objTag == othTag;\n\n  if (isSameTag && isBuffer(object)) {\n    if (!isBuffer(other)) {\n      return false;\n    }\n    objIsArr = true;\n    objIsObj = false;\n  }\n  if (isSameTag && !objIsObj) {\n    stack || (stack = new Stack);\n    return (objIsArr || isTypedArray(object))\n      ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n      : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n  }\n  if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n    var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n        othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n    if (objIsWrapped || othIsWrapped) {\n      var objUnwrapped = objIsWrapped ? object.value() : object,\n          othUnwrapped = othIsWrapped ? other.value() : other;\n\n      stack || (stack = new Stack);\n      return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n    }\n  }\n  if (!isSameTag) {\n    return false;\n  }\n  stack || (stack = new Stack);\n  return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nexport default baseIsEqualDeep;\n","import baseIsEqualDeep from './_baseIsEqualDeep.js';\nimport isObjectLike from './isObjectLike.js';\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n *  1 - Unordered comparison\n *  2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n  if (value === other) {\n    return true;\n  }\n  if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n    return value !== value && other !== other;\n  }\n  return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nexport default baseIsEqual;\n","import baseIsEqual from './_baseIsEqual.js';\n\n/**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `===`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n */\nfunction isEqual(value, other) {\n  return baseIsEqual(value, other);\n}\n\nexport default isEqual;\n","import type { Command, Joints, TcpPose } from \"@wandelbots/nova-api/v1\"\nimport isEqual from \"lodash-es/isEqual\"\nimport { Vector3 } from \"three/src/math/Vector3.js\"\nimport type { AutoReconnectingWebsocket } from \"../AutoReconnectingWebsocket\"\nimport { isSameCoordinateSystem, tryParseJson } from \"../converters\"\nimport type { MotionStreamConnection } from \"./MotionStreamConnection\"\nimport type { NovaClient } from \"./NovaClient\"\n\nexport type JoggerConnectionOpts = {\n  /**\n   * When an error message is received from the jogging websocket, it\n   * will be passed here. If this handler is not provided, the error will\n   * instead be thrown as an unhandled error.\n   */\n  onError?: (err: unknown) => void\n}\n\nexport class JoggerConnection {\n  // Currently a separate websocket is needed for each mode, pester API people\n  // to merge these for simplicity\n  cartesianWebsocket: AutoReconnectingWebsocket | null = null\n  jointWebsocket: AutoReconnectingWebsocket | null = null\n  cartesianJoggingOpts: {\n    tcpId?: string\n    coordSystemId?: string\n  } = {}\n\n  static async open(\n    nova: NovaClient,\n    motionGroupId: string,\n    opts: JoggerConnectionOpts = {},\n  ) {\n    const motionStream = await nova.connectMotionStream(motionGroupId)\n\n    return new JoggerConnection(motionStream, opts)\n  }\n\n  constructor(\n    readonly motionStream: MotionStreamConnection,\n    readonly opts: JoggerConnectionOpts = {},\n  ) {}\n\n  get motionGroupId() {\n    return this.motionStream.motionGroupId\n  }\n\n  get nova() {\n    return this.motionStream.nova\n  }\n\n  get numJoints() {\n    return this.motionStream.joints.length\n  }\n\n  get activeJoggingMode() {\n    if (this.cartesianWebsocket) return \"cartesian\"\n    if (this.jointWebsocket) return \"joint\"\n    return \"increment\"\n  }\n\n  get activeWebsocket() {\n    return this.cartesianWebsocket || this.jointWebsocket\n  }\n\n  async stop() {\n    // Why not call the stopJogging API endpoint?\n    // Because this results in the websocket closing and we\n    // would like to keep it open for now.\n\n    if (this.cartesianWebsocket) {\n      this.cartesianWebsocket.sendJson({\n        motion_group: this.motionGroupId,\n        position_direction: { x: 0, y: 0, z: 0 },\n        rotation_direction: { x: 0, y: 0, z: 0 },\n        position_velocity: 0,\n        rotation_velocity: 0,\n        tcp: this.cartesianJoggingOpts.tcpId,\n        coordinate_system: this.cartesianJoggingOpts.coordSystemId,\n      })\n    }\n\n    if (this.jointWebsocket) {\n      this.jointWebsocket.sendJson({\n        motion_group: this.motionGroupId,\n        joint_velocities: new Array(this.numJoints).fill(0),\n      })\n    }\n  }\n\n  dispose() {\n    if (this.cartesianWebsocket) {\n      this.cartesianWebsocket.dispose()\n    }\n\n    if (this.jointWebsocket) {\n      this.jointWebsocket.dispose()\n    }\n  }\n\n  setJoggingMode(\n    mode: \"cartesian\" | \"joint\" | \"increment\",\n    cartesianJoggingOpts?: {\n      tcpId?: string\n      coordSystemId?: string\n    },\n  ) {\n    console.log(\"Setting jogging mode to\", mode)\n    if (cartesianJoggingOpts) {\n      // Websocket needs to be reopened to change options\n      if (!isEqual(this.cartesianJoggingOpts, cartesianJoggingOpts)) {\n        if (this.cartesianWebsocket) {\n          this.cartesianWebsocket.dispose()\n          this.cartesianWebsocket = null\n        }\n      }\n\n      this.cartesianJoggingOpts = cartesianJoggingOpts\n    }\n\n    if (mode !== \"cartesian\" && this.cartesianWebsocket) {\n      this.cartesianWebsocket.dispose()\n      this.cartesianWebsocket = null\n    }\n\n    if (mode !== \"joint\" && this.jointWebsocket) {\n      this.jointWebsocket.dispose()\n      this.jointWebsocket = null\n    }\n\n    if (mode === \"cartesian\" && !this.cartesianWebsocket) {\n      this.cartesianWebsocket = this.nova.openReconnectingWebsocket(\n        `/motion-groups/move-tcp`,\n      )\n\n      this.cartesianWebsocket.addEventListener(\n        \"message\",\n        (ev: MessageEvent) => {\n          const data = tryParseJson(ev.data)\n          if (data && \"error\" in data) {\n            if (this.opts.onError) {\n              this.opts.onError(ev.data)\n            } else {\n              throw new Error(ev.data)\n            }\n          }\n        },\n      )\n    }\n\n    if (mode === \"joint\" && !this.jointWebsocket) {\n      this.jointWebsocket = this.nova.openReconnectingWebsocket(\n        `/motion-groups/move-joint`,\n      )\n\n      this.jointWebsocket.addEventListener(\"message\", (ev: MessageEvent) => {\n        const data = tryParseJson(ev.data)\n        if (data && \"error\" in data) {\n          if (this.opts.onError) {\n            this.opts.onError(ev.data)\n          } else {\n            throw new Error(ev.data)\n          }\n        }\n      })\n    }\n  }\n\n  /**\n   * Start rotation of a single robot joint at the specified velocity\n   */\n  async startJointRotation({\n    joint,\n    direction,\n    velocityRadsPerSec,\n  }: {\n    /** Index of the joint to rotate */\n    joint: number\n    /** Direction of rotation (\"+\" or \"-\") */\n    direction: \"+\" | \"-\"\n    /** Speed of the rotation in radians per second */\n    velocityRadsPerSec: number\n  }) {\n    if (!this.jointWebsocket) {\n      throw new Error(\n        \"Joint jogging websocket not connected; call setJoggingMode first\",\n      )\n    }\n\n    const jointVelocities = new Array(this.numJoints).fill(0)\n\n    jointVelocities[joint] =\n      direction === \"-\" ? -velocityRadsPerSec : velocityRadsPerSec\n\n    this.jointWebsocket.sendJson({\n      motion_group: this.motionGroupId,\n      joint_velocities: jointVelocities,\n    })\n  }\n\n  /**\n   * Start the TCP moving along a specified axis at a given velocity\n   */\n  async startTCPTranslation({\n    axis,\n    direction,\n    velocityMmPerSec,\n  }: {\n    axis: \"x\" | \"y\" | \"z\"\n    direction: \"-\" | \"+\"\n    velocityMmPerSec: number\n  }) {\n    if (!this.cartesianWebsocket) {\n      throw new Error(\n        \"Cartesian jogging websocket not connected; call setJoggingMode first\",\n      )\n    }\n\n    const zeroVector = { x: 0, y: 0, z: 0 }\n    const joggingVector = Object.assign({}, zeroVector)\n    joggingVector[axis] = direction === \"-\" ? -1 : 1\n\n    this.cartesianWebsocket.sendJson({\n      motion_group: this.motionGroupId,\n      position_direction: joggingVector,\n      rotation_direction: zeroVector,\n      position_velocity: velocityMmPerSec,\n      rotation_velocity: 0,\n      tcp: this.cartesianJoggingOpts.tcpId,\n      coordinate_system: this.cartesianJoggingOpts.coordSystemId,\n    })\n  }\n\n  /**\n   * Start the TCP rotating around a specified axis at a given velocity\n   */\n  async startTCPRotation({\n    axis,\n    direction,\n    velocityRadsPerSec,\n  }: {\n    axis: \"x\" | \"y\" | \"z\"\n    direction: \"-\" | \"+\"\n    velocityRadsPerSec: number\n  }) {\n    if (!this.cartesianWebsocket) {\n      throw new Error(\n        \"Cartesian jogging websocket not connected; call setJoggingMode first\",\n      )\n    }\n\n    const zeroVector = { x: 0, y: 0, z: 0 }\n    const joggingVector = Object.assign({}, zeroVector)\n    joggingVector[axis] = direction === \"-\" ? -1 : 1\n\n    this.cartesianWebsocket.sendJson({\n      motion_group: this.motionGroupId,\n      position_direction: zeroVector,\n      rotation_direction: joggingVector,\n      position_velocity: 0,\n      rotation_velocity: velocityRadsPerSec,\n      tcp: this.cartesianJoggingOpts.tcpId,\n      coordinate_system: this.cartesianJoggingOpts.coordSystemId,\n    })\n  }\n\n  /**\n   * Move the robot by a fixed distance in a single cartesian\n   * axis, either rotating or translating relative to the TCP.\n   * Promise resolves only after the motion has completed.\n   */\n  async runIncrementalCartesianMotion({\n    currentTcpPose,\n    currentJoints,\n    coordSystemId,\n    velocityInRelevantUnits,\n    axis,\n    direction,\n    motion,\n  }: {\n    currentTcpPose: TcpPose\n    currentJoints: Joints\n    coordSystemId: string\n    velocityInRelevantUnits: number\n    axis: \"x\" | \"y\" | \"z\"\n    direction: \"-\" | \"+\"\n    motion:\n      | {\n          type: \"rotate\"\n          distanceRads: number\n        }\n      | {\n          type: \"translate\"\n          distanceMm: number\n        }\n  }) {\n    const commands: Command[] = []\n\n    if (\n      !isSameCoordinateSystem(currentTcpPose.coordinate_system, coordSystemId)\n    ) {\n      throw new Error(\n        `Current TCP pose coordinate system ${currentTcpPose.coordinate_system} does not match target coordinate system ${coordSystemId}`,\n      )\n    }\n\n    if (motion.type === \"translate\") {\n      const targetTcpPosition = Object.assign({}, currentTcpPose.position)\n      targetTcpPosition[axis] +=\n        motion.distanceMm * (direction === \"-\" ? -1 : 1)\n\n      commands.push({\n        settings: {\n          limits_override: {\n            tcp_velocity_limit: velocityInRelevantUnits,\n          },\n        },\n        line: {\n          position: targetTcpPosition,\n          orientation: currentTcpPose.orientation,\n          coordinate_system: coordSystemId,\n        },\n      })\n    } else if (motion.type === \"rotate\") {\n      // Concatenate rotations expressed by rotation vectors\n      // Equations taken from https://physics.stackexchange.com/a/287819\n\n      // Compute axis and angle of current rotation vector\n      const currentRotationVector = new Vector3(\n        currentTcpPose.orientation[\"x\"],\n        currentTcpPose.orientation[\"y\"],\n        currentTcpPose.orientation[\"z\"],\n      )\n\n      const currentRotationRad = currentRotationVector.length()\n      const currentRotationDirection = currentRotationVector.clone().normalize()\n\n      // Compute axis and angle of difference rotation vector\n      const differenceRotationRad =\n        motion.distanceRads * (direction === \"-\" ? -1 : 1)\n\n      const differenceRotationDirection = new Vector3(0.0, 0.0, 0.0)\n      differenceRotationDirection[axis] = 1.0\n\n      // Some abbreviations to make the following equations more readable\n      const f1 =\n        Math.cos(0.5 * differenceRotationRad) *\n        Math.cos(0.5 * currentRotationRad)\n      const f2 =\n        Math.sin(0.5 * differenceRotationRad) *\n        Math.sin(0.5 * currentRotationRad)\n      const f3 =\n        Math.sin(0.5 * differenceRotationRad) *\n        Math.cos(0.5 * currentRotationRad)\n      const f4 =\n        Math.cos(0.5 * differenceRotationRad) *\n        Math.sin(0.5 * currentRotationRad)\n\n      const dotProduct = differenceRotationDirection.dot(\n        currentRotationDirection,\n      )\n\n      const crossProduct = differenceRotationDirection\n        .clone()\n        .cross(currentRotationDirection)\n\n      // Compute angle of concatenated rotation\n      const newRotationRad = 2.0 * Math.acos(f1 - f2 * dotProduct)\n\n      // Compute rotation vector of concatenated rotation\n      const f5 = newRotationRad / Math.sin(0.5 * newRotationRad)\n\n      const targetTcpOrientation = new Vector3()\n        .addScaledVector(crossProduct, f2)\n        .addScaledVector(differenceRotationDirection, f3)\n        .addScaledVector(currentRotationDirection, f4)\n        .multiplyScalar(f5)\n\n      commands.push({\n        settings: {\n          limits_override: {\n            tcp_orientation_velocity_limit: velocityInRelevantUnits,\n          },\n        },\n        line: {\n          position: currentTcpPose.position,\n          orientation: targetTcpOrientation,\n          coordinate_system: coordSystemId,\n        },\n      })\n    }\n\n    const motionPlanRes = await this.nova.api.motion.planMotion({\n      motion_group: this.motionGroupId,\n      start_joint_position: currentJoints,\n      tcp: this.cartesianJoggingOpts.tcpId,\n      commands,\n    })\n\n    const plannedMotion = motionPlanRes.plan_successful_response?.motion\n    if (!plannedMotion) {\n      throw new Error(\n        `Failed to plan jogging increment motion ${JSON.stringify(motionPlanRes)}`,\n      )\n    }\n\n    await this.nova.api.motion.streamMoveForward(\n      plannedMotion,\n      100,\n      undefined,\n      undefined,\n      undefined,\n      {\n        // Might take a while at low velocity\n        timeout: 1000 * 60,\n      },\n    )\n  }\n\n  /**\n   * Rotate a single robot joint by a fixed number of radians\n   * Promise resolves only after the motion has completed.\n   */\n  async runIncrementalJointRotation({\n    joint,\n    currentJoints,\n    velocityRadsPerSec,\n    direction,\n    distanceRads,\n  }: {\n    joint: number\n    currentJoints: Joints\n    velocityRadsPerSec: number\n    direction: \"-\" | \"+\"\n    distanceRads: number\n  }) {\n    const targetJoints = [...currentJoints.joints]\n    targetJoints[joint]! += distanceRads * (direction === \"-\" ? -1 : 1)\n\n    const jointVelocityLimits: number[] = new Array(\n      currentJoints.joints.length,\n    ).fill(velocityRadsPerSec)\n\n    const motionPlanRes = await this.nova.api.motion.planMotion({\n      motion_group: this.motionGroupId,\n      start_joint_position: currentJoints,\n      commands: [\n        {\n          settings: {\n            limits_override: {\n              joint_velocity_limits: {\n                joints: jointVelocityLimits,\n              },\n            },\n          },\n          joint_ptp: {\n            joints: targetJoints,\n          },\n        },\n      ],\n    })\n\n    const plannedMotion = motionPlanRes.plan_successful_response?.motion\n    if (!plannedMotion) {\n      console.error(\"Failed to plan jogging increment motion\", motionPlanRes)\n      return\n    }\n\n    await this.nova.api.motion.streamMoveForward(\n      plannedMotion,\n      100,\n      undefined,\n      undefined,\n      undefined,\n      {\n        // Might take a while at low velocity\n        timeout: 1000 * 60,\n      },\n    )\n  }\n}\n","import type {\n  ControllerInstance,\n  MotionGroupPhysical,\n  MotionGroupStateResponse,\n  Vector3d,\n} from \"@wandelbots/nova-api/v1\"\nimport { makeAutoObservable, runInAction } from \"mobx\"\nimport { Vector3 } from \"three\"\nimport type { AutoReconnectingWebsocket } from \"../AutoReconnectingWebsocket\"\nimport { tryParseJson } from \"../converters\"\nimport { jointValuesEqual, tcpPoseEqual } from \"./motionStateUpdate\"\nimport type { NovaClient } from \"./NovaClient\"\n\nconst MOTION_DELTA_THRESHOLD = 0.0001\n\nfunction unwrapRotationVector(\n  newRotationVectorApi: Vector3d,\n  currentRotationVectorApi: Vector3d,\n): Vector3d {\n  const currentRotationVector = new Vector3(\n    currentRotationVectorApi.x,\n    currentRotationVectorApi.y,\n    currentRotationVectorApi.z,\n  )\n\n  const newRotationVector = new Vector3(\n    newRotationVectorApi.x,\n    newRotationVectorApi.y,\n    newRotationVectorApi.z,\n  )\n\n  const currentAngle = currentRotationVector.length()\n  const currentAxis = currentRotationVector.normalize()\n\n  let newAngle = newRotationVector.length()\n  let newAxis = newRotationVector.normalize()\n\n  // Align rotation axes\n  if (newAxis.dot(currentAxis) < 0) {\n    newAngle = -newAngle\n    newAxis = newAxis.multiplyScalar(-1.0)\n  }\n\n  // Shift rotation angle close to previous one to extend domain of rotation angles beyond [0, pi]\n  // - this simplifies interpolation and prevents abruptly changing signs of the rotation angles\n  let angleDifference = newAngle - currentAngle\n  angleDifference -=\n    2.0 * Math.PI * Math.floor((angleDifference + Math.PI) / (2.0 * Math.PI))\n\n  newAngle = currentAngle + angleDifference\n\n  return newAxis.multiplyScalar(newAngle)\n}\n\n/**\n * Store representing the current state of a connected motion group.\n */\nexport class MotionStreamConnection {\n  static async open(nova: NovaClient, motionGroupId: string) {\n    const { instances: controllers } =\n      await nova.api.controller.listControllers()\n\n    const [_motionGroupIndex, controllerId] = motionGroupId.split(\"@\") as [\n      string,\n      string,\n    ]\n    const controller = controllers.find((c) => c.controller === controllerId)\n    const motionGroup = controller?.physical_motion_groups.find(\n      (mg) => mg.motion_group === motionGroupId,\n    )\n    if (!controller || !motionGroup) {\n      throw new Error(\n        `Controller ${controllerId} or motion group ${motionGroupId} not found`,\n      )\n    }\n\n    const motionStateSocket = nova.openReconnectingWebsocket(\n      `/motion-groups/${motionGroupId}/state-stream`,\n    )\n\n    // Wait for the first message to get the initial state\n    const firstMessage = await motionStateSocket.firstMessage()\n    console.log(\"got first message\", firstMessage)\n    const initialMotionState = tryParseJson(firstMessage.data)\n      ?.result as MotionGroupStateResponse\n\n    if (!initialMotionState) {\n      throw new Error(\n        `Unable to parse initial motion state message ${firstMessage.data}`,\n      )\n    }\n\n    console.log(\n      `Connected motion state websocket to motion group ${motionGroup.motion_group}. Initial state:\\n  `,\n      initialMotionState,\n    )\n\n    return new MotionStreamConnection(\n      nova,\n      controller,\n      motionGroup,\n      initialMotionState,\n      motionStateSocket,\n    )\n  }\n\n  // Not mobx-observable as this changes very fast; should be observed\n  // using animation frames\n  rapidlyChangingMotionState: MotionGroupStateResponse\n\n  constructor(\n    readonly nova: NovaClient,\n    readonly controller: ControllerInstance,\n    readonly motionGroup: MotionGroupPhysical,\n    readonly initialMotionState: MotionGroupStateResponse,\n    readonly motionStateSocket: AutoReconnectingWebsocket,\n  ) {\n    this.rapidlyChangingMotionState = initialMotionState\n\n    motionStateSocket.addEventListener(\"message\", (event) => {\n      const motionStateResponse = tryParseJson(event.data)?.result as\n        | MotionGroupStateResponse\n        | undefined\n\n      if (!motionStateResponse) {\n        throw new Error(\n          `Failed to get motion state for ${this.motionGroupId}: ${event.data}`,\n        )\n      }\n\n      // handle motionState message\n      if (\n        !jointValuesEqual(\n          this.rapidlyChangingMotionState.state.joint_position.joints,\n          motionStateResponse.state.joint_position.joints,\n          MOTION_DELTA_THRESHOLD,\n        )\n      ) {\n        runInAction(() => {\n          this.rapidlyChangingMotionState.state = motionStateResponse.state\n        })\n      }\n\n      // handle tcpPose message\n      if (\n        !tcpPoseEqual(\n          this.rapidlyChangingMotionState.tcp_pose,\n          motionStateResponse.tcp_pose,\n          MOTION_DELTA_THRESHOLD,\n        )\n      ) {\n        runInAction(() => {\n          if (this.rapidlyChangingMotionState.tcp_pose == undefined) {\n            this.rapidlyChangingMotionState.tcp_pose =\n              motionStateResponse.tcp_pose\n          } else {\n            this.rapidlyChangingMotionState.tcp_pose = {\n              position: motionStateResponse.tcp_pose!.position,\n              orientation: unwrapRotationVector(\n                motionStateResponse.tcp_pose!.orientation,\n                this.rapidlyChangingMotionState.tcp_pose!.orientation,\n              ),\n              tcp: motionStateResponse.tcp_pose!.tcp,\n              coordinate_system:\n                motionStateResponse.tcp_pose!.coordinate_system,\n            }\n          }\n        })\n      }\n    })\n    makeAutoObservable(this)\n  }\n\n  get motionGroupId() {\n    return this.motionGroup.motion_group\n  }\n\n  get controllerId() {\n    return this.controller.controller\n  }\n\n  get modelFromController() {\n    return this.motionGroup.model_from_controller\n  }\n\n  get wandelscriptIdentifier() {\n    const num = this.motionGroupId.split(\"@\")[0]\n    return `${this.controllerId.replaceAll(\"-\", \"_\")}_${num}`\n  }\n\n  get joints() {\n    return this.initialMotionState.state.joint_position.joints.map((_, i) => {\n      return {\n        index: i,\n      }\n    })\n  }\n\n  dispose() {\n    this.motionStateSocket.close()\n  }\n}\n","import type { Configuration as BaseConfiguration } from \"@wandelbots/nova-api/v1\"\nimport {\n  ApplicationApi,\n  CellApi,\n  ControllerApi,\n  ControllerIOsApi,\n  CoordinateSystemsApi,\n  DeviceConfigurationApi,\n  LibraryProgramApi,\n  LibraryProgramMetadataApi,\n  LibraryRecipeApi,\n  LibraryRecipeMetadataApi,\n  MotionApi,\n  MotionGroupApi,\n  MotionGroupInfosApi,\n  MotionGroupJoggingApi,\n  MotionGroupKinematicApi,\n  ProgramApi,\n  ProgramValuesApi,\n  StoreCollisionComponentsApi,\n  StoreCollisionScenesApi,\n  StoreObjectApi,\n  SystemApi,\n  VirtualRobotApi,\n  VirtualRobotBehaviorApi,\n  VirtualRobotModeApi,\n  VirtualRobotSetupApi,\n} from \"@wandelbots/nova-api/v1\"\nimport type { BaseAPI } from \"@wandelbots/nova-api/v1/base\"\nimport type { AxiosInstance } from \"axios\"\nimport axios from \"axios\"\n\ntype OmitFirstArg<F> = F extends (x: any, ...args: infer P) => infer R\n  ? (...args: P) => R\n  : never\n\ntype UnwrapAxiosResponseReturn<T> = T extends (...a: any) => any\n  ? (\n      ...a: Parameters<T>\n    ) => Promise<Awaited<ReturnType<T>> extends { data: infer D } ? D : never>\n  : never\n\nexport type WithCellId<T> = {\n  [P in keyof T]: UnwrapAxiosResponseReturn<OmitFirstArg<T[P]>>\n}\n\nexport type WithUnwrappedAxiosResponse<T> = {\n  [P in keyof T]: UnwrapAxiosResponseReturn<T[P]>\n}\n\n/**\n * API client providing type-safe access to all the Nova API REST endpoints\n * associated with a specific cell id.\n */\nexport class NovaCellAPIClient {\n  constructor(\n    readonly cellId: string,\n    readonly opts: BaseConfiguration & {\n      axiosInstance?: AxiosInstance\n      mock?: boolean\n    },\n  ) {}\n\n  /**\n   * Some TypeScript sorcery which alters the API class methods so you don't\n   * have to pass the cell id to every single one, and de-encapsulates the\n   * response data\n   */\n  private withCellId<T extends BaseAPI>(\n    ApiConstructor: new (\n      config: BaseConfiguration,\n      basePath: string,\n      axios: AxiosInstance,\n    ) => T,\n  ) {\n    const apiClient = new ApiConstructor(\n      {\n        ...this.opts,\n        isJsonMime: (mime: string) => {\n          return mime === \"application/json\"\n        },\n      },\n      this.opts.basePath ?? \"\",\n      this.opts.axiosInstance ?? axios.create(),\n    ) as {\n      [key: string | symbol]: any\n    }\n\n    for (const key of Reflect.ownKeys(Reflect.getPrototypeOf(apiClient)!)) {\n      if (key !== \"constructor\" && typeof apiClient[key] === \"function\") {\n        const originalFunction = apiClient[key]\n        apiClient[key] = (...args: any[]) => {\n          return originalFunction\n            .apply(apiClient, [this.cellId, ...args])\n            .then((res: any) => res.data)\n        }\n      }\n    }\n\n    return apiClient as WithCellId<T>\n  }\n\n  /**\n   * As withCellId, but only does the response unwrapping\n   */\n  private withUnwrappedResponsesOnly<T extends BaseAPI>(\n    ApiConstructor: new (\n      config: BaseConfiguration,\n      basePath: string,\n      axios: AxiosInstance,\n    ) => T,\n  ) {\n    const apiClient = new ApiConstructor(\n      {\n        ...this.opts,\n        isJsonMime: (mime: string) => {\n          return mime === \"application/json\"\n        },\n      },\n      this.opts.basePath ?? \"\",\n      this.opts.axiosInstance ?? axios.create(),\n    ) as {\n      [key: string | symbol]: any\n    }\n\n    for (const key of Reflect.ownKeys(Reflect.getPrototypeOf(apiClient)!)) {\n      if (key !== \"constructor\" && typeof apiClient[key] === \"function\") {\n        const originalFunction = apiClient[key]\n        apiClient[key] = (...args: any[]) => {\n          return originalFunction\n            .apply(apiClient, args)\n            .then((res: any) => res.data)\n        }\n      }\n    }\n\n    return apiClient as WithUnwrappedAxiosResponse<T>\n  }\n\n  readonly system = this.withUnwrappedResponsesOnly(SystemApi)\n  readonly cell = this.withUnwrappedResponsesOnly(CellApi)\n\n  readonly deviceConfig = this.withCellId(DeviceConfigurationApi)\n\n  readonly motionGroup = this.withCellId(MotionGroupApi)\n  readonly motionGroupInfos = this.withCellId(MotionGroupInfosApi)\n\n  readonly controller = this.withCellId(ControllerApi)\n\n  readonly program = this.withCellId(ProgramApi)\n  readonly programValues = this.withCellId(ProgramValuesApi)\n\n  readonly controllerIOs = this.withCellId(ControllerIOsApi)\n\n  readonly motionGroupKinematic = this.withCellId(MotionGroupKinematicApi)\n  readonly motion = this.withCellId(MotionApi)\n\n  readonly coordinateSystems = this.withCellId(CoordinateSystemsApi)\n\n  readonly application = this.withCellId(ApplicationApi)\n  readonly applicationGlobal = this.withUnwrappedResponsesOnly(ApplicationApi)\n\n  readonly motionGroupJogging = this.withCellId(MotionGroupJoggingApi)\n\n  readonly virtualRobot = this.withCellId(VirtualRobotApi)\n  readonly virtualRobotSetup = this.withCellId(VirtualRobotSetupApi)\n  readonly virtualRobotMode = this.withCellId(VirtualRobotModeApi)\n  readonly virtualRobotBehavior = this.withCellId(VirtualRobotBehaviorApi)\n\n  readonly libraryProgramMetadata = this.withCellId(LibraryProgramMetadataApi)\n  readonly libraryProgram = this.withCellId(LibraryProgramApi)\n  readonly libraryRecipeMetadata = this.withCellId(LibraryRecipeMetadataApi)\n  readonly libraryRecipe = this.withCellId(LibraryRecipeApi)\n\n  readonly storeObject = this.withCellId(StoreObjectApi)\n  readonly storeCollisionComponents = this.withCellId(\n    StoreCollisionComponentsApi,\n  )\n  readonly storeCollisionScenes = this.withCellId(StoreCollisionScenesApi)\n}\n","import type { Configuration as BaseConfiguration } from \"@wandelbots/nova-api/v1\"\nimport type { AxiosRequestConfig } from \"axios\"\nimport axios, { isAxiosError } from \"axios\"\nimport urlJoin from \"url-join\"\nimport { loginWithAuth0 } from \"../../LoginWithAuth0.js\"\nimport { AutoReconnectingWebsocket } from \"../AutoReconnectingWebsocket.js\"\nimport { availableStorage } from \"../availableStorage.js\"\nimport { ConnectedMotionGroup } from \"./ConnectedMotionGroup.js\"\nimport { JoggerConnection } from \"./JoggerConnection.js\"\nimport { MotionStreamConnection } from \"./MotionStreamConnection.js\"\nimport { NovaCellAPIClient } from \"./NovaCellAPIClient.js\"\nimport { MockNovaInstance } from \"./mock/MockNovaInstance.js\"\n\nexport type NovaClientConfig = {\n  /**\n   * Url of the deployed Nova instance to connect to\n   * e.g. https://saeattii.instance.wandelbots.io\n   */\n  instanceUrl: string | \"https://mock.example.com\"\n\n  /**\n   * Identifier of the cell on the Nova instance to connect this client to.\n   * If omitted, the default identifier \"cell\" is used.\n   **/\n  cellId?: string\n\n  /**\n   * Username for basic auth to the Nova instance.\n   * @deprecated use accessToken instead\n   */\n  username?: string\n\n  /**\n   * Password for basic auth to the Nova instance.\n   * @deprecated use accessToken instead\n   */\n  password?: string\n\n  /**\n   * Access token for Bearer authentication.\n   */\n  accessToken?: string\n} & Omit<BaseConfiguration, \"isJsonMime\" | \"basePath\">\n\ntype NovaClientConfigWithDefaults = NovaClientConfig & { cellId: string }\n\n/**\n * Client for connecting to a Nova instance and controlling robots.\n */\nexport class NovaClient {\n  readonly api: NovaCellAPIClient\n  readonly config: NovaClientConfigWithDefaults\n  readonly mock?: MockNovaInstance\n  authPromise: Promise<string | null> | null = null\n  accessToken: string | null = null\n\n  constructor(config: NovaClientConfig) {\n    const cellId = config.cellId ?? \"cell\"\n    this.config = {\n      cellId,\n      ...config,\n    }\n    this.accessToken =\n      config.accessToken ||\n      availableStorage.getString(\"wbjs.access_token\") ||\n      null\n\n    if (this.config.instanceUrl === \"https://mock.example.com\") {\n      this.mock = new MockNovaInstance()\n    }\n\n    // Set up Axios instance with interceptor for token fetching\n    const axiosInstance = axios.create({\n      baseURL: urlJoin(this.config.instanceUrl, \"/api/v1\"),\n      // TODO - backend needs to set proper CORS headers for this\n      headers:\n        typeof window !== \"undefined\" &&\n        window.location.origin.includes(\"localhost\")\n          ? {}\n          : {\n              // Identify the client to the backend for logging purposes\n              \"X-Wandelbots-Client\": \"Wandelbots-Nova-JS-SDK\",\n            },\n    })\n\n    axiosInstance.interceptors.request.use(async (request) => {\n      if (!request.headers.Authorization) {\n        if (this.accessToken) {\n          request.headers.Authorization = `Bearer ${this.accessToken}`\n        } else if (this.config.username && this.config.password) {\n          request.headers.Authorization = `Basic ${btoa(config.username + \":\" + config.password)}`\n        }\n      }\n      return request\n    })\n\n    if (typeof window !== \"undefined\") {\n      axiosInstance.interceptors.response.use(\n        (r) => r,\n        async (error) => {\n          if (isAxiosError(error)) {\n            if (error.response?.status === 401) {\n              // If we hit a 401, attempt to login the user and retry with\n              // a new access token\n              try {\n                await this.renewAuthentication()\n\n                if (error.config) {\n                  if (this.accessToken) {\n                    error.config.headers.Authorization = `Bearer ${this.accessToken}`\n                  } else {\n                    delete error.config.headers.Authorization\n                  }\n                  return axiosInstance.request(error.config)\n                }\n              } catch (err) {\n                return Promise.reject(err)\n              }\n            } else if (error.response?.status === 503) {\n              // Check if the server as a whole is down\n              const res = await fetch(window.location.href)\n              if (res.status === 503) {\n                // Go to 503 page\n                window.location.reload()\n              }\n            }\n          }\n\n          return Promise.reject(error)\n        },\n      )\n    }\n\n    this.api = new NovaCellAPIClient(cellId, {\n      ...config,\n      basePath: urlJoin(this.config.instanceUrl, \"/api/v1\"),\n      isJsonMime: (mime: string) => {\n        return mime === \"application/json\"\n      },\n      baseOptions: {\n        ...(this.mock\n          ? ({\n              adapter: (config) => {\n                return this.mock!.handleAPIRequest(config)\n              },\n            } satisfies AxiosRequestConfig)\n          : {}),\n        ...config.baseOptions,\n      },\n      axiosInstance,\n    })\n  }\n\n  async renewAuthentication(): Promise<void> {\n    if (this.authPromise) {\n      // Don't double up\n      return\n    }\n\n    this.authPromise = loginWithAuth0(this.config.instanceUrl)\n    try {\n      this.accessToken = await this.authPromise\n      if (this.accessToken) {\n        // Cache access token so we don't need to log in every refresh\n        availableStorage.setString(\"wbjs.access_token\", this.accessToken)\n      } else {\n        availableStorage.delete(\"wbjs.access_token\")\n      }\n    } finally {\n      this.authPromise = null\n    }\n  }\n\n  makeWebsocketURL(path: string): string {\n    const url = new URL(\n      urlJoin(\n        this.config.instanceUrl,\n        `/api/v1/cells/${this.config.cellId}`,\n        path,\n      ),\n    )\n    url.protocol = url.protocol.replace(\"http\", \"ws\")\n    url.protocol = url.protocol.replace(\"https\", \"wss\")\n\n    // If provided, add basic auth credentials to the URL\n    // NOTE - basic auth is deprecated on websockets and doesn't work in Safari\n    // use tokens instead\n    if (this.accessToken) {\n      url.searchParams.append(\"token\", this.accessToken)\n    } else if (this.config.username && this.config.password) {\n      url.username = this.config.username\n      url.password = this.config.password\n    }\n\n    return url.toString()\n  }\n\n  /**\n   * Retrieve an AutoReconnectingWebsocket to the given path on the Nova instance.\n   * If you explicitly want to reconnect an existing websocket, call `reconnect`\n   * on the returned object.\n   */\n  openReconnectingWebsocket(path: string) {\n    return new AutoReconnectingWebsocket(this.makeWebsocketURL(path), {\n      mock: this.mock,\n    })\n  }\n\n  /**\n   * Connect to the motion state websocket(s) for a given motion group\n   */\n  async connectMotionStream(motionGroupId: string) {\n    return await MotionStreamConnection.open(this, motionGroupId)\n  }\n\n  /**\n   * Connect to the jogging websocket(s) for a given motion group\n   */\n  async connectJogger(motionGroupId: string) {\n    return await JoggerConnection.open(this, motionGroupId)\n  }\n\n  async connectMotionGroups(\n    motionGroupIds: string[],\n  ): Promise<ConnectedMotionGroup[]> {\n    const { instances } = await this.api.controller.listControllers()\n\n    return Promise.all(\n      motionGroupIds.map((motionGroupId) =>\n        ConnectedMotionGroup.connect(this, motionGroupId, instances),\n      ),\n    )\n  }\n\n  async connectMotionGroup(\n    motionGroupId: string,\n  ): Promise<ConnectedMotionGroup> {\n    const motionGroups = await this.connectMotionGroups([motionGroupId])\n    return motionGroups[0]!\n  }\n}\n","const DOMAIN_SUFFIX = \"wandelbots.io\"\n\n/** Mapping of stages to Auth0 configurations */\nconst auth0ConfigMap = {\n  dev: {\n    domain: `https://auth.portal.dev.${DOMAIN_SUFFIX}`,\n    clientId: process.env.NOVA_AUTH0_DEV_CLIENT_ID,\n  },\n  stg: {\n    domain: `https://auth.portal.stg.${DOMAIN_SUFFIX}`,\n    clientId: process.env.NOVA_AUTH0_STG_CLIENT_ID,\n  },\n  prod: {\n    domain: `https://auth.portal.${DOMAIN_SUFFIX}`,\n    clientId: process.env.NOVA_AUTH0_PROD_CLIENT_ID,\n  },\n}\n\n/** Determine which Auth0 configuration to use based on instance URL  */\nconst getAuth0Config = (instanceUrl: string) => {\n  if (instanceUrl.includes(`dev.${DOMAIN_SUFFIX}`)) return auth0ConfigMap.dev\n  if (instanceUrl.includes(`stg.${DOMAIN_SUFFIX}`)) return auth0ConfigMap.stg\n  if (instanceUrl.includes(DOMAIN_SUFFIX)) return auth0ConfigMap.prod\n  throw new Error(\n    \"Unsupported instance URL. Cannot determine Auth0 configuration.\",\n  )\n}\n\n/**\n * Initializes Auth0 login process using redirect if necessary and retrieves an access token.\n * Returns null when an access token should not be needed to authenticate (i.e. cookie auth\n * when deployed on the instance domain)\n */\nexport const loginWithAuth0 = async (\n  instanceUrl: string,\n): Promise<string | null> => {\n  if (typeof window === \"undefined\") {\n    throw new Error(\n      `Access token must be set to use NovaClient when not in a browser environment.`,\n    )\n  }\n\n  const auth0Config = getAuth0Config(instanceUrl)\n\n  if (new URL(instanceUrl).origin === window.location.origin) {\n    // When deployed on the instance itself, our auth is handled by cookies\n    // and no access token is needed-- just need to reload the page and it'll\n    // login again / set cookie as needed\n    window.location.reload()\n    throw new Error(\n      \"Failed to reload page to get auth details, please refresh manually\",\n    )\n  }\n\n  // If we're on localhost or another domain, we need to do the full oauth flow\n  // Note this will ONLY work for origins which are whitelisted as a redirect_uri\n  // in the auth0 config, currently\n  const { Auth0Client } = await import(\"@auth0/auth0-spa-js\")\n\n  const auth0Client = new Auth0Client({\n    domain: auth0Config.domain,\n    clientId: auth0Config.clientId ?? \"\",\n    useRefreshTokens: false,\n    authorizationParams: {\n      audience: \"nova-api\",\n      redirect_uri: window.location.origin,\n    },\n  })\n\n  // If the URL includes a redirect result, handle it\n  if (\n    window.location.search.includes(\"code=\") &&\n    window.location.search.includes(\"state=\")\n  ) {\n    const { appState } = await auth0Client.handleRedirectCallback()\n    // Return to the URL the user was originally on before the redirect\n    window.history.replaceState(\n      {},\n      document.title,\n      appState?.returnTo || window.location.pathname,\n    )\n  } else {\n    // Initiate login with redirect\n    await auth0Client.loginWithRedirect()\n  }\n\n  // Once logged in, retrieve the access token silently\n  const accessToken = await auth0Client.getTokenSilently()\n  return accessToken\n}\n","import ReconnectingWebSocket, { type ErrorEvent } from \"reconnecting-websocket\"\nimport * as v2 from \"./v2/mock/MockNovaInstance\"\nimport * as v1 from \"./v1/mock/MockNovaInstance\"\n\nexport class AutoReconnectingWebsocket extends ReconnectingWebSocket {\n  receivedFirstMessage?: MessageEvent\n  targetUrl: string\n  disposed = false\n\n  constructor(\n    targetUrl: string,\n    readonly opts: {\n      mock?: v1.MockNovaInstance | v2.MockNovaInstance\n      onDispose?: () => void\n    } = {},\n  ) {\n    console.log(\"Opening websocket to\", targetUrl)\n\n    super(() => this.targetUrl || targetUrl, undefined, {\n      startClosed: true,\n    })\n\n    // Reconnecting websocket doesn't set this properly with startClosed\n    Object.defineProperty(this, \"url\", {\n      get() {\n        return this.targetUrl\n      },\n    })\n\n    this.targetUrl = targetUrl\n\n    this.addEventListener(\"open\", () => {\n      console.log(`Websocket to ${this.url} opened`)\n    })\n\n    this.addEventListener(\"message\", (ev) => {\n      if (!this.receivedFirstMessage) {\n        this.receivedFirstMessage = ev\n      }\n    })\n\n    this.addEventListener(\"close\", () => {\n      console.log(`Websocket to ${this.url} closed`)\n    })\n\n    const origReconnect = this.reconnect\n    this.reconnect = () => {\n      if (this.opts.mock) {\n        this.opts.mock.handleWebsocketConnection(this)\n      } else {\n        origReconnect.apply(this)\n      }\n    }\n\n    this.reconnect()\n  }\n\n  changeUrl(targetUrl: string) {\n    this.receivedFirstMessage = undefined\n    this.targetUrl = targetUrl\n    this.reconnect()\n  }\n\n  sendJson(data: unknown) {\n    if (this.opts.mock) {\n      this.opts.mock.handleWebsocketMessage(this, JSON.stringify(data))\n    } else {\n      this.send(JSON.stringify(data))\n    }\n  }\n\n  /**\n   * Permanently close this websocket and indicate that\n   * this object should not be used again.\n   **/\n  dispose() {\n    this.close()\n    this.disposed = true\n    if (this.opts.onDispose) {\n      this.opts.onDispose()\n    }\n  }\n\n  /**\n   * Returns a promise that resolves once the websocket\n   * is in the OPEN state. */\n  async opened() {\n    return new Promise<void>((resolve, reject) => {\n      if (this.readyState === WebSocket.OPEN) {\n        resolve()\n      } else {\n        this.addEventListener(\"open\", () => resolve())\n        this.addEventListener(\"error\", reject)\n      }\n    })\n  }\n\n  /**\n   * Returns a promise that resolves once the websocket\n   * is in the CLOSED state. */\n  async closed() {\n    return new Promise<void>((resolve, reject) => {\n      if (this.readyState === WebSocket.CLOSED) {\n        resolve()\n      } else {\n        this.addEventListener(\"close\", () => resolve())\n        this.addEventListener(\"error\", reject)\n      }\n    })\n  }\n\n  /**\n   * Returns a promise that resolves when the first message\n   * is received from the websocket. Resolves immediately if\n   * the first message has already been received.\n   */\n  async firstMessage() {\n    if (this.receivedFirstMessage) {\n      return this.receivedFirstMessage\n    }\n\n    return new Promise<MessageEvent>((resolve, reject) => {\n      const onMessage = (ev: MessageEvent) => {\n        this.receivedFirstMessage = ev\n        this.removeEventListener(\"message\", onMessage)\n        this.removeEventListener(\"error\", onError)\n        resolve(ev)\n      }\n\n      const onError = (ev: ErrorEvent) => {\n        this.removeEventListener(\"message\", onMessage)\n        this.removeEventListener(\"error\", onError)\n        reject(ev)\n      }\n\n      this.addEventListener(\"message\", onMessage)\n      this.addEventListener(\"error\", onError)\n    })\n  }\n\n  /**\n   * Returns a promise that resolves when the next message\n   * is received from the websocket.\n   */\n  async nextMessage() {\n    return new Promise<MessageEvent>((resolve, reject) => {\n      const onMessage = (ev: MessageEvent) => {\n        this.removeEventListener(\"message\", onMessage)\n        this.removeEventListener(\"error\", onError)\n        resolve(ev)\n      }\n\n      const onError = (ev: ErrorEvent) => {\n        this.removeEventListener(\"message\", onMessage)\n        this.removeEventListener(\"error\", onError)\n        reject(ev)\n      }\n\n      this.addEventListener(\"message\", onMessage)\n      this.addEventListener(\"error\", onError)\n    })\n  }\n}\n","/**\n * Safety wrapper around browser localStorage providing context availability\n * checks and JSON parsing\n */\nclass AvailableStorage {\n  available = typeof window !== \"undefined\" && !!window.localStorage\n\n  getJSON<T>(key: string): Partial<T> | null {\n    if (!this.available) return null\n\n    const result = window.localStorage.getItem(key)\n    if (result === null) return null\n\n    try {\n      return JSON.parse(result)\n    } catch (err) {\n      return null\n    }\n  }\n\n  setJSON(key: string, obj: any) {\n    if (!this.available) return null\n\n    window.localStorage.setItem(key, JSON.stringify(obj))\n  }\n\n  delete(key: string) {\n    if (!this.available) return null\n\n    window.localStorage.removeItem(key)\n  }\n\n  setString(key: string, value: string) {\n    if (!this.available) return null\n\n    window.localStorage.setItem(key, value)\n  }\n\n  getString(key: string): string | null {\n    if (!this.available) return null\n\n    return window.localStorage.getItem(key)\n  }\n}\n\nexport const availableStorage = new AvailableStorage()\n","import type {\n  ControllerInstanceList,\n  MotionGroupSpecification,\n  MotionGroupStateResponse,\n  RobotController,\n  SafetySetup,\n} from \"@wandelbots/nova-api/v1\"\nimport type { AxiosResponse, InternalAxiosRequestConfig } from \"axios\"\nimport { AxiosError } from \"axios\"\nimport * as pathToRegexp from \"path-to-regexp\"\nimport type { AutoReconnectingWebsocket } from \"../../AutoReconnectingWebsocket\"\n\n/**\n * EXPERIMENTAL\n * Ultra-simplified mock Nova server for testing stuff\n */\nexport class MockNovaInstance {\n  readonly connections: AutoReconnectingWebsocket[] = []\n\n  async handleAPIRequest(\n    config: InternalAxiosRequestConfig,\n  ): Promise<AxiosResponse> {\n    const apiHandlers = [\n      {\n        method: \"GET\",\n        path: \"/cells/:cellId/controllers\",\n        handle() {\n          return {\n            instances: [\n              {\n                controller: \"mock-ur5e\",\n                model_name: \"UniversalRobots::Controller\",\n                host: \"mock-ur5e\",\n                allow_software_install_on_controller: true,\n                physical_motion_groups: [\n                  {\n                    motion_group: \"0@mock-ur5e\",\n                    name_from_controller: \"UR5e\",\n                    active: false,\n                    model_from_controller: \"UniversalRobots_UR5e\",\n                  },\n                ],\n                has_error: false,\n                error_details: \"\",\n              },\n            ],\n          } satisfies ControllerInstanceList\n        },\n      },\n      {\n        method: \"GET\",\n        path: \"/cells/:cellId/controllers/:controllerId\",\n        handle() {\n          return {\n            configuration: {\n              kind: \"VirtualController\",\n              manufacturer: \"universalrobots\",\n              position: \"[0,-1.571,-1.571,-1.571,1.571,-1.571,0]\",\n              type: \"universalrobots-ur5e\",\n            },\n            name: \"mock-ur5\",\n          } satisfies RobotController\n        },\n      },\n      {\n        method: \"GET\",\n        path: \"/cells/:cellId/motion-groups/:motionGroupId/specification\",\n        handle() {\n          return {\n            dh_parameters: [\n              {\n                alpha: 1.5707963267948966,\n                theta: 0,\n                a: 0,\n                d: 162.25,\n                reverse_rotation_direction: false,\n              },\n              {\n                alpha: 0,\n                theta: 0,\n                a: -425,\n                d: 0,\n                reverse_rotation_direction: false,\n              },\n              {\n                alpha: 0,\n                theta: 0,\n                a: -392.2,\n                d: 0,\n                reverse_rotation_direction: false,\n              },\n              {\n                alpha: 1.5707963267948966,\n                theta: 0,\n                a: 0,\n                d: 133.3,\n                reverse_rotation_direction: false,\n              },\n              {\n                alpha: -1.5707963267948966,\n                theta: 0,\n                a: 0,\n                d: 99.7,\n                reverse_rotation_direction: false,\n              },\n              {\n                alpha: 0,\n                theta: 0,\n                a: 0,\n                d: 99.6,\n                reverse_rotation_direction: false,\n              },\n            ],\n            mechanical_joint_limits: [\n              {\n                joint: \"JOINTNAME_AXIS_1\",\n                lower_limit: -6.335545063018799,\n                upper_limit: 6.335545063018799,\n                unlimited: false,\n              },\n              {\n                joint: \"JOINTNAME_AXIS_2\",\n                lower_limit: -6.335545063018799,\n                upper_limit: 6.335545063018799,\n                unlimited: false,\n              },\n              {\n                joint: \"JOINTNAME_AXIS_3\",\n                lower_limit: -6.335545063018799,\n                upper_limit: 6.335545063018799,\n                unlimited: false,\n              },\n              {\n                joint: \"JOINTNAME_AXIS_4\",\n                lower_limit: -6.335545063018799,\n                upper_limit: 6.335545063018799,\n                unlimited: false,\n              },\n              {\n                joint: \"JOINTNAME_AXIS_5\",\n                lower_limit: -6.335545063018799,\n                upper_limit: 6.335545063018799,\n                unlimited: false,\n              },\n              {\n                joint: \"JOINTNAME_AXIS_6\",\n                lower_limit: -6.335545063018799,\n                upper_limit: 6.335545063018799,\n                unlimited: false,\n              },\n            ],\n          } satisfies MotionGroupSpecification\n        },\n      },\n      {\n        method: \"GET\",\n        path: \"/cells/:cellId/motion-groups/:motionGroupId/safety-setup\",\n        handle() {\n          return {\n            safety_settings: [\n              {\n                safety_state: \"SAFETY_NORMAL\",\n                settings: {\n                  joint_position_limits: [\n                    {\n                      joint: \"JOINTNAME_AXIS_1\",\n                      lower_limit: -2.96705961227417,\n                      upper_limit: 2.96705961227417,\n                      unlimited: false,\n                    },\n                    {\n                      joint: \"JOINTNAME_AXIS_2\",\n                      lower_limit: -1.7453292608261108,\n                      upper_limit: 2.7925267219543457,\n                      unlimited: false,\n                    },\n                    {\n                      joint: \"JOINTNAME_AXIS_3\",\n                      lower_limit: -3.3161256313323975,\n                      upper_limit: 0.40142571926116943,\n                      unlimited: false,\n                    },\n                    {\n                      joint: \"JOINTNAME_AXIS_4\",\n                      lower_limit: -3.4906585216522217,\n                      upper_limit: 3.4906585216522217,\n                      unlimited: false,\n                    },\n                    {\n                      joint: \"JOINTNAME_AXIS_5\",\n                      lower_limit: -2.4434609413146973,\n                      upper_limit: 2.4434609413146973,\n                      unlimited: false,\n                    },\n                    {\n                      joint: \"JOINTNAME_AXIS_6\",\n                      lower_limit: -4.71238899230957,\n                      upper_limit: 4.71238899230957,\n                      unlimited: false,\n                    },\n                  ],\n                  joint_velocity_limits: [\n                    {\n                      joint: \"JOINTNAME_AXIS_1\",\n                      limit: 3.1415927410125732,\n                    },\n                    {\n                      joint: \"JOINTNAME_AXIS_2\",\n                      limit: 3.1415927410125732,\n                    },\n                    {\n                      joint: \"JOINTNAME_AXIS_3\",\n                      limit: 3.4906585216522217,\n                    },\n                    {\n                      joint: \"JOINTNAME_AXIS_4\",\n                      limit: 6.108652591705322,\n                    },\n                    {\n                      joint: \"JOINTNAME_AXIS_5\",\n                      limit: 6.108652591705322,\n                    },\n                    {\n                      joint: \"JOINTNAME_AXIS_6\",\n                      limit: 6.981317043304443,\n                    },\n                  ],\n                  joint_acceleration_limits: [],\n                  joint_torque_limits: [],\n                  tcp_velocity_limit: 1800,\n                },\n              },\n            ],\n            safety_zones: [\n              {\n                id: 1,\n                priority: 0,\n                geometry: {\n                  compound: {\n                    child_geometries: [\n                      {\n                        convex_hull: {\n                          vertices: [\n                            {\n                              x: -800,\n                              y: -1330,\n                              z: -1820,\n                            },\n                            {\n                              x: 1650,\n                              y: -1330,\n                              z: -1820,\n                            },\n                            {\n                              x: 1650,\n                              y: 1330,\n                              z: -1820,\n                            },\n                            {\n                              x: -800,\n                              y: 1330,\n                              z: -1820,\n                            },\n                          ],\n                        },\n                        init_pose: {\n                          position: {\n                            x: 0,\n                            y: 0,\n                            z: 0,\n                          },\n                          orientation: {\n                            x: 0,\n                            y: 0,\n                            z: 0,\n                            w: 1,\n                          },\n                        },\n                        id: \"box\",\n                      },\n                      {\n                        convex_hull: {\n                          vertices: [\n                            {\n                              x: -800,\n                              y: -1330,\n                              z: -1820,\n                            },\n                            {\n                              x: 1650,\n                              y: -1330,\n                              z: -1820,\n                            },\n                            {\n                              x: 1650,\n                              y: -1330,\n                              z: 1500,\n                            },\n                            {\n                              x: -800,\n                              y: -1330,\n                              z: 1500,\n                            },\n                          ],\n                        },\n                        init_pose: {\n                          position: {\n                            x: 0,\n                            y: 0,\n                            z: 0,\n                          },\n                          orientation: {\n                            x: 0,\n                            y: 0,\n                            z: 0,\n                            w: 1,\n                          },\n                        },\n                        id: \"box\",\n                      },\n                      {\n                        convex_hull: {\n                          vertices: [\n                            {\n                              x: -800,\n                              y: -1330,\n                              z: -1820,\n                            },\n                            {\n                              x: -800,\n                              y: 1330,\n                              z: -1820,\n                            },\n                            {\n                              x: -800,\n                              y: 1330,\n                              z: 1500,\n                            },\n                            {\n                              x: -800,\n                              y: -1330,\n                              z: 1500,\n                            },\n                          ],\n                        },\n                        init_pose: {\n                          position: {\n                            x: 0,\n                            y: 0,\n                            z: 0,\n                          },\n                          orientation: {\n                            x: 0,\n                            y: 0,\n                            z: 0,\n                            w: 1,\n                          },\n                        },\n                        id: \"box\",\n                      },\n                      {\n                        convex_hull: {\n                          vertices: [\n                            {\n                              x: 1650,\n                              y: 1330,\n                              z: 1500,\n                            },\n                            {\n                              x: -800,\n                              y: 1330,\n                              z: 1500,\n                            },\n                            {\n                              x: -800,\n                              y: -1330,\n                              z: 1500,\n                            },\n                            {\n                              x: 1650,\n                              y: -1330,\n                              z: 1500,\n                            },\n                          ],\n                        },\n                        init_pose: {\n                          position: {\n                            x: 0,\n                            y: 0,\n                            z: 0,\n                          },\n                          orientation: {\n                            x: 0,\n                            y: 0,\n                            z: 0,\n                            w: 1,\n                          },\n                        },\n                        id: \"box\",\n                      },\n                      {\n                        convex_hull: {\n                          vertices: [\n                            {\n                              x: 1650,\n                              y: 1330,\n                              z: 1500,\n                            },\n                            {\n                              x: -800,\n                              y: 1330,\n                              z: 1500,\n                            },\n                            {\n                              x: -800,\n                              y: 1330,\n                              z: -1820,\n                            },\n                            {\n                              x: 1650,\n                              y: 1330,\n                              z: -1820,\n                            },\n                          ],\n                        },\n                        init_pose: {\n                          position: {\n                            x: 0,\n                            y: 0,\n                            z: 0,\n                          },\n                          orientation: {\n                            x: 0,\n                            y: 0,\n                            z: 0,\n                            w: 1,\n                          },\n                        },\n                        id: \"box\",\n                      },\n                      {\n                        convex_hull: {\n                          vertices: [\n                            {\n                              x: 1650,\n                              y: 1330,\n                              z: 1500,\n                            },\n                            {\n                              x: 1650,\n                              y: -1330,\n                              z: 1500,\n                            },\n                            {\n                              x: 1650,\n                              y: -1330,\n                              z: -1820,\n                            },\n                            {\n                              x: 1650,\n                              y: 1330,\n                              z: -1820,\n                            },\n                          ],\n                        },\n                        init_pose: {\n                          position: {\n                            x: 0,\n                            y: 0,\n                            z: 0,\n                          },\n                          orientation: {\n                            x: 0,\n                            y: 0,\n                            z: 0,\n                            w: 1,\n                          },\n                        },\n                        id: \"box\",\n                      },\n                    ],\n                  },\n                  init_pose: {\n                    position: {\n                      x: 0,\n                      y: 0,\n                      z: 0,\n                    },\n                    orientation: {\n                      x: 0,\n                      y: 0,\n                      z: 0,\n                      w: 1,\n                    },\n                  },\n                  id: \"Cell workzone\",\n                },\n                motion_group_uid: 1,\n              },\n              {\n                id: 2,\n                priority: 0,\n                geometry: {\n                  convex_hull: {\n                    vertices: [\n                      {\n                        x: 1650,\n                        y: 1330,\n                        z: -1850,\n                      },\n                      {\n                        x: 865,\n                        y: 1330,\n                        z: -1850,\n                      },\n                      {\n                        x: 865,\n                        y: -720,\n                        z: -1850,\n                      },\n                      {\n                        x: 1650,\n                        y: -720,\n                        z: -1850,\n                      },\n                      {\n                        x: 1650,\n                        y: 1330,\n                        z: -920,\n                      },\n                      {\n                        x: 865,\n                        y: 1330,\n                        z: -920,\n                      },\n                      {\n                        x: 865,\n                        y: -720,\n                        z: -920,\n                      },\n                      {\n                        x: 1650,\n                        y: -720,\n                        z: -920,\n                      },\n                    ],\n                  },\n                  init_pose: {\n                    position: {\n                      x: 0,\n                      y: 0,\n                      z: 0,\n                    },\n                    orientation: {\n                      x: 0,\n                      y: 0,\n                      z: 0,\n                      w: 1,\n                    },\n                  },\n                  id: \"Transport\",\n                },\n                motion_group_uid: 1,\n              },\n              {\n                id: 3,\n                priority: 0,\n                geometry: {\n                  convex_hull: {\n                    vertices: [\n                      {\n                        x: 1650,\n                        y: 1330,\n                        z: -600,\n                      },\n                      {\n                        x: 865,\n                        y: 1330,\n                        z: -600,\n                      },\n                      {\n                        x: 865,\n                        y: 430,\n                        z: -600,\n                      },\n                      {\n                        x: 1650,\n                        y: 430,\n                        z: -600,\n                      },\n                      {\n                        x: 1650,\n                        y: 1330,\n                        z: -1250,\n                      },\n                      {\n                        x: 865,\n                        y: 1330,\n                        z: -1250,\n                      },\n                      {\n                        x: 865,\n                        y: 430,\n                        z: -1250,\n                      },\n                      {\n                        x: 1650,\n                        y: 430,\n                        z: -1250,\n                      },\n                    ],\n                  },\n                  init_pose: {\n                    position: {\n                      x: 0,\n                      y: 0,\n                      z: 0,\n                    },\n                    orientation: {\n                      x: 0,\n                      y: 0,\n                      z: 0,\n                      w: 1,\n                    },\n                  },\n                  id: \"Tunel\",\n                },\n                motion_group_uid: 1,\n              },\n              {\n                id: 4,\n                priority: 0,\n                geometry: {\n                  convex_hull: {\n                    vertices: [\n                      {\n                        x: 1650,\n                        y: -760,\n                        z: -440,\n                      },\n                      {\n                        x: 900,\n                        y: -760,\n                        z: -440,\n                      },\n                      {\n                        x: 900,\n                        y: -1330,\n                        z: -440,\n                      },\n                      {\n                        x: 1650,\n                        y: -1330,\n                        z: -440,\n                      },\n                      {\n                        x: 1650,\n                        y: -760,\n                        z: -1800,\n                      },\n                      {\n                        x: 900,\n                        y: -760,\n                        z: -1800,\n                      },\n                      {\n                        x: 900,\n                        y: -1330,\n                        z: -1800,\n                      },\n                      {\n                        x: 1650,\n                        y: -1330,\n                        z: -1800,\n                      },\n                    ],\n                  },\n                  init_pose: {\n                    position: {\n                      x: 0,\n                      y: 0,\n                      z: 0,\n                    },\n                    orientation: {\n                      x: 0,\n                      y: 0,\n                      z: 0,\n                      w: 1,\n                    },\n                  },\n                  id: \"Fanuc controller\",\n                },\n                motion_group_uid: 1,\n              },\n              {\n                id: 6,\n                priority: 0,\n                geometry: {\n                  convex_hull: {\n                    vertices: [\n                      {\n                        x: -200,\n                        y: -200,\n                        z: -1900,\n                      },\n                      {\n                        x: 200,\n                        y: -200,\n                        z: -1900,\n                      },\n                      {\n                        x: 200,\n                        y: 200,\n                        z: -1900,\n                      },\n                      {\n                        x: -200,\n                        y: 200,\n                        z: -1900,\n                      },\n                      {\n                        x: -200,\n                        y: -200,\n                        z: -350,\n                      },\n                      {\n                        x: 200,\n                        y: -200,\n                        z: -350,\n                      },\n                      {\n                        x: 200,\n                        y: 200,\n                        z: -350,\n                      },\n                      {\n                        x: -200,\n                        y: 200,\n                        z: -350,\n                      },\n                    ],\n                  },\n                  init_pose: {\n                    position: {\n                      x: 0,\n                      y: 0,\n                      z: 0,\n                    },\n                    orientation: {\n                      x: 0,\n                      y: 0,\n                      z: 0,\n                      w: 1,\n                    },\n                  },\n                  id: \"Robot base\",\n                },\n                motion_group_uid: 1,\n              },\n            ],\n            robot_model_geometries: [\n              {\n                link_index: 1,\n                geometry: {\n                  sphere: {\n                    radius: 270,\n                  },\n                  init_pose: {\n                    position: {\n                      x: -70,\n                      y: -70,\n                      z: -50,\n                    },\n                    orientation: {\n                      x: 0,\n                      y: 0,\n                      z: 0,\n                      w: 1,\n                    },\n                  },\n                  id: \"link1_sphere\",\n                },\n              },\n              {\n                link_index: 2,\n                geometry: {\n                  capsule: {\n                    radius: 160,\n                    cylinder_height: 800,\n                  },\n                  init_pose: {\n                    position: {\n                      x: -450,\n                      y: 40,\n                      z: 170,\n                    },\n                    orientation: {\n                      x: 0,\n                      y: -0.7071067811865475,\n                      z: 0,\n                      w: 0.7071067811865476,\n                    },\n                  },\n                  id: \"link2_capsule\",\n                },\n              },\n              {\n                link_index: 3,\n                geometry: {\n                  sphere: {\n                    radius: 270,\n                  },\n                  init_pose: {\n                    position: {\n                      x: -110,\n                      y: 10,\n                      z: -100,\n                    },\n                    orientation: {\n                      x: 0,\n                      y: 0,\n                      z: 0,\n                      w: 1,\n                    },\n                  },\n                  id: \"link3_sphere\",\n                },\n              },\n              {\n                link_index: 4,\n                geometry: {\n                  capsule: {\n                    radius: 110,\n                    cylinder_height: 600,\n                  },\n                  init_pose: {\n                    position: {\n                      x: 0,\n                      y: 300,\n                      z: 40,\n                    },\n                    orientation: {\n                      x: -0.7071067811865475,\n                      y: 0,\n                      z: 0,\n                      w: 0.7071067811865476,\n                    },\n                  },\n                  id: \"link4_capsule\",\n                },\n              },\n              {\n                link_index: 5,\n                geometry: {\n                  sphere: {\n                    radius: 75,\n                  },\n                  init_pose: {\n                    position: {\n                      x: 0,\n                      y: 0,\n                      z: -50,\n                    },\n                    orientation: {\n                      x: 0,\n                      y: 0,\n                      z: 0,\n                      w: 1,\n                    },\n                  },\n                  id: \"link5_sphere\",\n                },\n              },\n            ],\n            tool_geometries: [],\n          } satisfies SafetySetup\n        },\n      },\n      {\n        method: \"GET\",\n        path: \"/cells/:cellId/coordinate-systems\",\n        handle() {\n          return {\n            coordinatesystems: [\n              {\n                coordinate_system: \"\",\n                name: \"world\",\n                reference_uid: \"\",\n                position: {\n                  x: 0,\n                  y: 0,\n                  z: 0,\n                },\n                rotation: {\n                  angles: [0, 0, 0],\n                  type: \"ROTATION_VECTOR\",\n                },\n              },\n            ],\n          } //satisfies CoordinateSystems\n        },\n      },\n      {\n        method: \"GET\",\n        path: \"/cells/:cellId/motion-groups/:motionGroupId/tcps\",\n        handle() {\n          return {\n            tcps: [\n              {\n                id: \"Flange\",\n                readable_name: \"Default-Flange\",\n                position: {\n                  x: 0,\n                  y: 0,\n                  z: 0,\n                },\n                rotation: {\n                  angles: [0, 0, 0, 0],\n                  type: \"ROTATION_VECTOR\",\n                },\n              },\n              {\n                id: \"complex-tcp-position\",\n                readable_name: \"Complex TCP Position\",\n                position: {\n                  x: -200,\n                  y: 300,\n                  z: 150,\n                },\n                rotation: {\n                  angles: [\n                    -0.12139440409113832, -0.06356210998212003,\n                    -0.2023240068185639, 0,\n                  ],\n                  type: \"ROTATION_VECTOR\",\n                },\n              },\n            ],\n          }\n        },\n      },\n    ]\n\n    const method = config.method?.toUpperCase() || \"GET\"\n    const path = \"/cells\" + config.url?.split(\"/cells\")[1]?.split(\"?\")[0]\n\n    for (const handler of apiHandlers) {\n      const match = pathToRegexp.match(handler.path)(path || \"\")\n      if (method === handler.method && match) {\n        const json = handler.handle()\n        return {\n          status: 200,\n          statusText: \"Success\",\n          data: JSON.stringify(json),\n          headers: {},\n          config,\n          request: {\n            responseURL: config.url,\n          },\n        }\n      }\n    }\n\n    throw new AxiosError(\n      `No mock handler matched this request: ${method} ${path}`,\n      \"404\",\n      config,\n    )\n\n    // return {\n    //   status: 404,\n    //   statusText: \"Not Found\",\n    //   data: \"\",\n    //   headers: {},\n    //   config,\n    //   request: {\n    //     responseURL: config.url,\n    //   },\n    // }\n  }\n\n  handleWebsocketConnection(socket: AutoReconnectingWebsocket) {\n    this.connections.push(socket)\n\n    setTimeout(() => {\n      socket.dispatchEvent(new Event(\"open\"))\n\n      console.log(\"Websocket connection opened from\", socket.url)\n\n      if (socket.url.includes(\"/state-stream\")) {\n        socket.dispatchEvent(\n          new MessageEvent(\"message\", {\n            data: JSON.stringify(defaultMotionState),\n          }),\n        )\n      }\n\n      if (socket.url.includes(\"/move-joint\")) {\n        socket.dispatchEvent(\n          new MessageEvent(\"message\", {\n            data: JSON.stringify({\n              result: {\n                motion_group: \"0@ur\",\n                state: {\n                  controller: \"ur\",\n                  operation_mode: \"OPERATION_MODE_AUTO\",\n                  safety_state: \"SAFETY_STATE_NORMAL\",\n                  timestamp: \"2024-09-18T12:48:26.096266444Z\",\n                  velocity_override: 100,\n                  motion_groups: [\n                    {\n                      motion_group: \"0@ur\",\n                      controller: \"ur\",\n                      joint_position: {\n                        joints: [\n                          1.3492152690887451, -1.5659207105636597,\n                          1.6653711795806885, -1.0991662740707397,\n                          -1.829018235206604, 1.264623761177063,\n                        ],\n                      },\n                      joint_velocity: {\n                        joints: [0, 0, 0, 0, 0, 0],\n                      },\n                      flange_pose: {\n                        position: {\n                          x: 6.437331889439328,\n                          y: -628.4123774830913,\n                          z: 577.0569957147832,\n                        },\n                        orientation: {\n                          x: -1.683333649797158,\n                          y: -1.9783363827298732,\n                          z: -0.4928031860165713,\n                        },\n                        coordinate_system: \"\",\n                      },\n                      tcp_pose: {\n                        position: {\n                          x: 6.437331889439328,\n                          y: -628.4123774830913,\n                          z: 577.0569957147832,\n                        },\n                        orientation: {\n                          x: -1.683333649797158,\n                          y: -1.9783363827298732,\n                          z: -0.4928031860165713,\n                        },\n                        coordinate_system: \"\",\n                        tcp: \"Flange\",\n                      },\n                      velocity: {\n                        linear: {\n                          x: 0,\n                          y: 0,\n                          z: 0,\n                        },\n                        angular: {\n                          x: -0,\n                          y: 0,\n                          z: 0,\n                        },\n                        coordinate_system: \"\",\n                      },\n                      force: {\n                        force: {\n                          x: 0,\n                          y: 0,\n                          z: 0,\n                        },\n                        moment: {\n                          x: 0,\n                          y: 0,\n                          z: 0,\n                        },\n                        coordinate_system: \"\",\n                      },\n                      joint_limit_reached: {\n                        limit_reached: [\n                          false,\n                          false,\n                          false,\n                          false,\n                          false,\n                          false,\n                        ],\n                      },\n                      joint_current: {\n                        joints: [0, 0, 0, 0, 0, 0],\n                      },\n                      sequence_number: \"671259\",\n                    },\n                  ],\n                  sequence_number: \"671259\",\n                },\n                movement_state: \"MOVEMENT_STATE_MOVING\",\n              },\n            }),\n          }),\n        )\n      }\n\n      if (socket.url.includes(\"/move-tcp\")) {\n        socket.dispatchEvent(\n          new MessageEvent(\"message\", {\n            data: JSON.stringify({\n              result: {\n                motion_group: \"0@ur\",\n                state: {\n                  controller: \"ur\",\n                  operation_mode: \"OPERATION_MODE_AUTO\",\n                  safety_state: \"SAFETY_STATE_NORMAL\",\n                  timestamp: \"2024-09-18T12:43:12.188335774Z\",\n                  velocity_override: 100,\n                  motion_groups: [\n                    {\n                      motion_group: \"0@ur\",\n                      controller: \"ur\",\n                      joint_position: {\n                        joints: [\n                          1.3352527618408203, -1.5659207105636597,\n                          1.6653711795806885, -1.110615611076355,\n                          -1.829018235206604, 1.264623761177063,\n                        ],\n                      },\n                      joint_velocity: {\n                        joints: [0, 0, 0, 0, 0, 0],\n                      },\n                      flange_pose: {\n                        position: {\n                          x: -2.763015284002938,\n                          y: -630.2151479701106,\n                          z: 577.524509114342,\n                        },\n                        orientation: {\n                          x: -1.704794877102097,\n                          y: -1.9722372952861567,\n                          z: -0.4852079204210754,\n                        },\n                        coordinate_system: \"\",\n                      },\n                      tcp_pose: {\n                        position: {\n                          x: -2.763015284002938,\n                          y: -630.2151479701106,\n                          z: 577.524509114342,\n                        },\n                        orientation: {\n                          x: -1.704794877102097,\n                          y: -1.9722372952861567,\n                          z: -0.4852079204210754,\n                        },\n                        coordinate_system: \"\",\n                        tcp: \"Flange\",\n                      },\n                      velocity: {\n                        linear: {\n                          x: 0,\n                          y: 0,\n                          z: 0,\n                        },\n                        angular: {\n                          x: -0,\n                          y: 0,\n                          z: 0,\n                        },\n                        coordinate_system: \"\",\n                      },\n                      force: {\n                        force: {\n                          x: 0,\n                          y: 0,\n                          z: 0,\n                        },\n                        moment: {\n                          x: 0,\n                          y: 0,\n                          z: 0,\n                        },\n                        coordinate_system: \"\",\n                      },\n                      joint_limit_reached: {\n                        limit_reached: [\n                          false,\n                          false,\n                          false,\n                          false,\n                          false,\n                          false,\n                        ],\n                      },\n                      joint_current: {\n                        joints: [0, 0, 0, 0, 0, 0],\n                      },\n                      sequence_number: \"627897\",\n                    },\n                  ],\n                  sequence_number: \"627897\",\n                },\n                movement_state: \"MOVEMENT_STATE_MOVING\",\n              },\n            }),\n          }),\n        )\n      }\n    }, 10)\n  }\n\n  handleWebsocketMessage(socket: AutoReconnectingWebsocket, message: string) {\n    console.log(`Received message on ${socket.url}`, message)\n  }\n}\n\nconst defaultMotionState = {\n  result: {\n    state: {\n      motion_group: \"0@universalrobots-ur5e\",\n      controller: \"universalrobots-ur5e\",\n      joint_position: {\n        joints: [\n          1.1699999570846558, -1.5700000524520874, 1.3600000143051147,\n          1.0299999713897705, 1.2899999618530273, 1.2799999713897705,\n        ],\n      },\n      joint_velocity: {\n        joints: [0, 0, 0, 0, 0, 0],\n      },\n      flange_pose: {\n        position: {\n          x: 1.3300010259703043,\n          y: -409.2680714682808,\n          z: 531.0203477065281,\n        },\n        orientation: {\n          x: 1.7564919306270736,\n          y: -1.7542521568325058,\n          z: 0.7326972590614671,\n        },\n        coordinate_system: \"\",\n      },\n      tcp_pose: {\n        position: {\n          x: 1.3300010259703043,\n          y: -409.2680714682808,\n          z: 531.0203477065281,\n        },\n        orientation: {\n          x: 1.7564919306270736,\n          y: -1.7542521568325058,\n          z: 0.7326972590614671,\n        },\n        coordinate_system: \"\",\n        tcp: \"Flange\",\n      },\n      velocity: {\n        linear: {\n          x: 0,\n          y: 0,\n          z: 0,\n        },\n        angular: {\n          x: 0,\n          y: 0,\n          z: 0,\n        },\n        coordinate_system: \"\",\n      },\n      force: {\n        force: {\n          x: 0,\n          y: 0,\n          z: 0,\n        },\n        moment: {\n          x: 0,\n          y: 0,\n          z: 0,\n        },\n        coordinate_system: \"\",\n      },\n      joint_limit_reached: {\n        limit_reached: [false, false, false, false, false, false],\n      },\n      joint_current: {\n        joints: [0, 0, 0, 0, 0, 0],\n      },\n      sequence_number: \"1\",\n    },\n    tcp_pose: {\n      position: {\n        x: 302.90748476115556,\n        y: -152.87065869452337,\n        z: 424.0454619321661,\n      },\n      orientation: {\n        x: 2.3403056115045353,\n        y: -1.1706836379431356,\n        z: 0.9772511964246311,\n      },\n      coordinate_system: \"\",\n      tcp: \"Flange\",\n    },\n  } satisfies MotionGroupStateResponse,\n}\n","import { AxiosError } from \"axios\"\nimport { makeAutoObservable, runInAction } from \"mobx\"\nimport { AutoReconnectingWebsocket } from \"../AutoReconnectingWebsocket\"\nimport { tryParseJson } from \"../converters\"\nimport type { MotionStreamConnection } from \"./MotionStreamConnection\"\nimport type { NovaClient } from \"./NovaClient\"\n\nexport type ProgramRunnerLogEntry = {\n  timestamp: number\n  message: string\n  level?: \"warn\" | \"error\"\n}\n\nexport enum ProgramState {\n  NotStarted = \"not started\",\n  Running = \"running\",\n  Stopped = \"stopped\",\n  Failed = \"failed\",\n  Completed = \"completed\",\n}\n\nexport type CurrentProgram = {\n  id?: string\n  wandelscript?: string\n  state?: ProgramState\n}\n\ntype ProgramStateMessage = {\n  type: string\n  runner: {\n    id: string\n    state: ProgramState\n    start_time?: number | null\n    execution_time?: number | null\n  }\n}\n\n/**\n * Interface for running Wandelscript programs on the Nova instance and\n * tracking their progress and output\n */\nexport class ProgramStateConnection {\n  currentProgram: CurrentProgram = {}\n  logs: ProgramRunnerLogEntry[] = []\n\n  executionState = \"idle\" as \"idle\" | \"starting\" | \"executing\" | \"stopping\"\n  currentlyExecutingProgramRunnerId = null as string | null\n\n  programStateSocket: AutoReconnectingWebsocket\n\n  constructor(readonly nova: NovaClient) {\n    makeAutoObservable(this, {}, { autoBind: true })\n\n    this.programStateSocket = nova.openReconnectingWebsocket(`/programs/state`)\n\n    this.programStateSocket.addEventListener(\"message\", (ev) => {\n      const msg = tryParseJson(ev.data)\n\n      if (!msg) {\n        console.error(\"Failed to parse program state message\", ev.data)\n        return\n      }\n      if (msg.type === \"update\") {\n        this.handleProgramStateMessage(msg)\n      }\n    })\n  }\n\n  /** Handle a program state update from the backend */\n  async handleProgramStateMessage(msg: ProgramStateMessage) {\n    const { runner } = msg\n\n    // Ignoring other programs for now\n    // TODO - show if execution state is busy from another source\n    if (runner.id !== this.currentlyExecutingProgramRunnerId) return\n\n    if (runner.state === ProgramState.Failed) {\n      try {\n        const runnerState = await this.nova.api.program.getProgramRunner(\n          runner.id,\n        )\n\n        // TODO - wandelengine should send print statements in real time over\n        // websocket as well, rather than at the end\n        const stdout = (runnerState as any).stdout\n        if (stdout) {\n          this.log(stdout)\n        }\n        this.logError(\n          `Program runner ${runner.id} failed with error: ${runnerState.error}\\n${runnerState.traceback}`,\n        )\n      } catch (err) {\n        this.logError(\n          `Failed to retrieve results for program ${runner.id}: ${err}`,\n        )\n      }\n\n      this.currentProgram.state = ProgramState.Failed\n\n      this.gotoIdleState()\n    } else if (runner.state === ProgramState.Stopped) {\n      try {\n        const runnerState = await this.nova.api.program.getProgramRunner(\n          runner.id,\n        )\n\n        const stdout = (runnerState as any).stdout\n        if (stdout) {\n          this.log(stdout)\n        }\n\n        this.currentProgram.state = ProgramState.Stopped\n        this.log(`Program runner ${runner.id} stopped`)\n      } catch (err) {\n        this.logError(\n          `Failed to retrieve results for program ${runner.id}: ${err}`,\n        )\n      }\n\n      this.gotoIdleState()\n    } else if (runner.state === ProgramState.Completed) {\n      try {\n        const runnerState = await this.nova.api.program.getProgramRunner(\n          runner.id,\n        )\n\n        const stdout = (runnerState as any).stdout\n        if (stdout) {\n          this.log(stdout)\n        }\n        this.log(\n          `Program runner ${runner.id} finished successfully in ${runner.execution_time?.toFixed(2)} seconds`,\n        )\n\n        this.currentProgram.state = ProgramState.Completed\n      } catch (err) {\n        this.logError(\n          `Failed to retrieve results for program ${runner.id}: ${err}`,\n        )\n      }\n\n      this.gotoIdleState()\n    } else if (runner.state === ProgramState.Running) {\n      this.currentProgram.state = ProgramState.Running\n      this.log(`Program runner ${runner.id} now running`)\n    } else if (runner.state !== ProgramState.NotStarted) {\n      console.error(runner)\n      this.logError(\n        `Program runner ${runner.id} entered unexpected state: ${runner.state}`,\n      )\n      this.currentProgram.state = ProgramState.NotStarted\n      this.gotoIdleState()\n    }\n  }\n\n  /** Call when a program is no longer executing */\n  gotoIdleState() {\n    runInAction(() => {\n      this.executionState = \"idle\"\n    })\n    this.currentlyExecutingProgramRunnerId = null\n  }\n\n  async executeProgram(\n    wandelscript: string,\n    initial_state?: Object,\n    activeRobot?: MotionStreamConnection,\n  ) {\n    this.currentProgram = {\n      wandelscript: wandelscript,\n      state: ProgramState.NotStarted,\n    }\n\n    const { currentProgram: openProgram } = this\n    if (!openProgram) return\n    runInAction(() => {\n      this.executionState = \"starting\"\n    })\n\n    // Jogging can cause program execution to fail for some time after\n    // So we need to explicitly stop jogging before running a program\n    if (activeRobot) {\n      try {\n        await this.nova.api.motionGroupJogging.stopJogging(\n          activeRobot.motionGroupId,\n        )\n      } catch (err) {\n        console.error(err)\n      }\n    }\n\n    // WOS-1539: Wandelengine parser currently breaks if there are empty lines with indentation\n    const trimmedCode = openProgram.wandelscript!.replaceAll(/^\\s*$/gm, \"\")\n\n    try {\n      const programRunnerRef = await this.nova.api.program.createProgramRunner(\n        {\n          code: trimmedCode,\n          initial_state: initial_state,\n          default_robot: activeRobot?.wandelscriptIdentifier,\n        } as any,\n        {\n          headers: {\n            \"Content-Type\": \"application/json\",\n          },\n        },\n      )\n\n      this.log(`Created program runner ${programRunnerRef.id}\"`)\n      runInAction(() => {\n        this.executionState = \"executing\"\n      })\n      this.currentlyExecutingProgramRunnerId = programRunnerRef.id\n    } catch (error) {\n      if (error instanceof AxiosError && error.response && error.request) {\n        this.logError(\n          `${error.response.status} ${error.response.statusText} from ${error.response.config.url} ${JSON.stringify(error.response.data)}`,\n        )\n      } else {\n        this.logError(JSON.stringify(error))\n      }\n      runInAction(() => {\n        this.executionState = \"idle\"\n      })\n    }\n  }\n\n  async stopProgram() {\n    if (!this.currentlyExecutingProgramRunnerId) return\n    runInAction(() => {\n      this.executionState = \"stopping\"\n    })\n\n    try {\n      await this.nova.api.program.stopProgramRunner(\n        this.currentlyExecutingProgramRunnerId,\n      )\n    } catch (err) {\n      // Reactivate the stop button so user can try again\n      runInAction(() => {\n        this.executionState = \"executing\"\n      })\n      throw err\n    }\n  }\n\n  reset() {\n    this.currentProgram = {}\n  }\n\n  log(message: string) {\n    console.log(message)\n    this.logs.push({\n      timestamp: Date.now(),\n      message,\n    })\n  }\n\n  logError(message: string) {\n    console.log(message)\n    this.logs.push({\n      timestamp: Date.now(),\n      message,\n      level: \"error\",\n    })\n  }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAc,oCAAd;;;ACYA,kBAAgD;AAChD,YAAuB;;;ACVhB,SAAS,aAAa,MAAoB;AAC/C,MAAI;AACF,WAAO,KAAK,MAAM,IAAc;AAAA,EAClC,SAAQ;AACN,WAAO;AAAA,EACT;AACF;AAwDO,SAAS,uBACd,kBACA,mBACA;AACA,MAAI,CAAC,iBAAkB,oBAAmB;AAC1C,MAAI,CAAC,kBAAmB,qBAAoB;AAE5C,SAAO,qBAAqB;AAC9B;;;ACvEO,SAAS,iBACd,gBACA,gBACA,sBACS;AACT,MAAI,eAAe,WAAW,eAAe,QAAQ;AACnD,WAAO;AAAA,EACT;AAEA,WAAS,aAAa,GAAG,aAAa,eAAe,QAAQ,cAAc;AACzE,QACE,KAAK,IAAI,eAAe,UAAU,IAAK,eAAe,UAAU,CAAE,IAClE,sBACA;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,aACd,QACA,QACA,sBACS;AAET,MAAK,WAAW,UAAa,UAAY,UAAU,WAAW,QAAY;AACxE,WAAO;AAAA,EACT;AAGA,MAAI,WAAW,UAAa,WAAW,QAAW;AAChD,WAAO;AAAA,EACT;AAEA,MAAI,eAAe;AACnB,kBAAgB,KAAK,IAAI,OAAO,YAAY,IAAI,OAAO,YAAY,CAAC;AACpE,kBAAgB,KAAK,IAAI,OAAO,YAAY,IAAI,OAAO,YAAY,CAAC;AACpE,kBAAgB,KAAK,IAAI,OAAO,YAAY,IAAI,OAAO,YAAY,CAAC;AACpE,kBAAgB,KAAK,IAAI,OAAO,SAAS,IAAI,OAAO,SAAS,CAAC;AAC9D,kBAAgB,KAAK,IAAI,OAAO,SAAS,IAAI,OAAO,SAAS,CAAC;AAC9D,kBAAgB,KAAK,IAAI,OAAO,SAAS,IAAI,OAAO,SAAS,CAAC;AAE9D,MAAI,eAAe,sBAAsB;AACvC,WAAO;AAAA,EACT;AAEA,SACE,OAAO,sBAAsB,OAAO,qBACpC,OAAO,QAAQ,OAAO;AAE1B;;;AFnCA,IAAM,yBAAyB;AASxB,IAAM,uBAAN,MAAM,sBAAqB;AAAA,EAiIhC,YACW,MACA,YACA,aACA,oBACA,mBACA,WACA,MACA,0BACA,aACA,UACA,wBACA,uBACT;AAZS;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAhCX,2CAAoD;AACpD,wCAAiD;AAEjD;AAAA,2BAA0B;AAc1B;AAAA;AAAA;AAAA;AAAA,2BACE;AAgBA,SAAK,6BAA6B;AAClC,SAAK,kBAAkB;AAGvB,0BAAsB,iBAAiB,WAAW,CAAC,UAAU;AA/KjE;AAgLM,YAAM,QAAO,kBAAa,MAAM,IAAI,MAAvB,mBAA0B;AAEvC,UAAI,CAAC,MAAM;AACT;AAAA,MACF;AAEA,mCAAY,MAAM;AAChB,aAAK,kBAAkB;AAAA,MACzB,CAAC;AAAA,IACH,CAAC;AAED,sBAAkB,iBAAiB,WAAW,CAAC,UAAU;AA3L7D;AA4LM,YAAM,uBAAsB,kBAAa,MAAM,IAAI,MAAvB,mBAA0B;AAItD,UAAI,CAAC,qBAAqB;AACxB,cAAM,IAAI;AAAA,UACR,kCAAkC,KAAK,aAAa,KAAK,MAAM,IAAI;AAAA,QACrE;AAAA,MACF;AAGA,UACE,CAAC;AAAA,QACC,KAAK,2BAA2B,MAAM,eAAe;AAAA,QACrD,oBAAoB,MAAM,eAAe;AAAA,QACzC;AAAA,MACF,GACA;AACA,qCAAY,MAAM;AAChB,eAAK,2BAA2B,QAAQ,oBAAoB;AAAA,QAC9D,CAAC;AAAA,MACH;AAGA,UACE,CAAC;AAAA,QACC,KAAK,2BAA2B;AAAA,QAChC,oBAAoB;AAAA,QACpB;AAAA,MACF,GACA;AACA,qCAAY,MAAM;AAChB,eAAK,2BAA2B,WAC9B,oBAAoB;AAAA,QACxB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AACD,wCAAmB,IAAI;AAAA,EACzB;AAAA,EArMA,OAAa,QACX,MACA,eACA,aACA;AAAA;AAjCJ;AAkCI,YAAM,CAAC,mBAAmB,YAAY,IAAI,cAAc,MAAM,GAAG;AAIjE,YAAM,aAAa,YAAY,KAAK,CAAC,MAAM,EAAE,eAAe,YAAY;AACxE,YAAM,cAAc,yCAAY,uBAAuB;AAAA,QACrD,CAAC,OAAO,GAAG,iBAAiB;AAAA;AAE9B,UAAI,CAAC,cAAc,CAAC,aAAa;AAC/B,cAAM,IAAI;AAAA,UACR,cAAc,YAAY,oBAAoB,aAAa;AAAA,QAC7D;AAAA,MACF;AAEA,YAAM,oBAAoB,KAAK;AAAA,QAC7B,kBAAkB,aAAa;AAAA,MACjC;AAGA,YAAM,eAAe,MAAM,kBAAkB,aAAa;AAC1D,YAAM,sBAAqB,kBAAa,aAAa,IAAI,MAA9B,mBACvB;AAEJ,UAAI,CAAC,oBAAoB;AACvB,cAAM,IAAI;AAAA,UACR,gDAAgD,aAAa,IAAI;AAAA,QACnE;AAAA,MACF;AAEA,cAAQ;AAAA,QACN,oDAAoD,YAAY,YAAY;AAAA;AAAA,QAC5E;AAAA,MACF;AAGA,YAAM,SAAS,MAAM,KAAK,IAAI,WAAW;AAAA,QACvC,WAAW;AAAA,MACb;AACA,YAAM,YAAY,OAAO,cAAc,SAAS;AAIhD,YAAM,WAAW,OAAO,MAAY;AAClC,YAAI;AACF,gBAAMA,YAAW,MAAM,KAAK,IAAI,iBAAiB;AAAA,YAC/C,YAAY;AAAA,UACd;AACA,iBAAOA;AAAA,QACT,SAAS,KAAK;AACZ,kBAAQ;AAAA,YACN,+BAA+B,YAAY,YAAY;AAAA,YACvD;AAAA,UACF;AACA,iBAAO;AAAA,QACT;AAAA,MACF,IAAG;AAGH,YAAM,wBAAwB,KAAK;AAAA,QACjC,gBAAgB,WAAW,UAAU;AAAA,MACvC;AAGA,YAAM,yBAAyB,MAAM,sBAAsB,aAAa;AACxE,YAAM,0BAAyB,kBAAa,uBAAuB,IAAI,MAAxC,mBAC3B;AAEJ,UAAI,CAAC,wBAAwB;AAC3B,cAAM,IAAI;AAAA,UACR,oDAAoD,uBAAuB,IAAI;AAAA,QACjF;AAAA,MACF;AAEA,cAAQ;AAAA,QACN,sDAAsD,WAAW,UAAU;AAAA;AAAA,QAC3E;AAAA,MACF;AAGA,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK,IAAI,iBAAiB,SAAS,aAAa;AAEvE,YAAM,2BACJ,MAAM,KAAK,IAAI,iBAAiB,4BAA4B,aAAa;AAE3E,YAAM,cACJ,MAAM,KAAK,IAAI,iBAAiB,eAAe,aAAa;AAE9D,aAAO,IAAI;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA;AAAA,EA6FA,IAAI,gBAAgB;AAClB,WAAO,KAAK,YAAY;AAAA,EAC1B;AAAA,EAEA,IAAI,eAAe;AACjB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEA,IAAI,sBAAsB;AACxB,WAAO,KAAK,YAAY;AAAA,EAC1B;AAAA,EAEA,IAAI,yBAAyB;AAC3B,UAAM,MAAM,KAAK,cAAc,MAAM,GAAG,EAAE,CAAC;AAC3C,WAAO,GAAG,KAAK,aAAa,WAAW,KAAK,GAAG,CAAC,IAAI,GAAG;AAAA,EACzD;AAAA;AAAA,EAGA,IAAI,sBAAsB;AACxB,WAAQ,KAAK,kBAAkB,KAAK,KAAM;AAAA,EAC5C;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK,mBAAmB,MAAM,eAAe,OAAO,IAAI,CAAC,GAAG,MAAM;AACvE,aAAO;AAAA,QACL,OAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,IAAI,eAAe;AACjB,WAAO,KAAK,yBAAyB;AAAA,EACvC;AAAA,EAEA,IAAI,cAAc;AAChB,WAAO,KAAK,YAAY;AAAA,EAC1B;AAAA;AAAA,EAGA,IAAI,mBAA6C;AAC/C,QAAI,CAAC,KAAK,UAAU;AAClB,aAAO,CAAC,GAAG,GAAG,CAAC;AAAA,IACjB;AAEA,WAAO;AAAA,MACL,KAAK,SAAS,KAAK,SAAS,IAAI;AAAA,MAChC,KAAK,SAAS,KAAK,SAAS,IAAI;AAAA,MAChC,KAAK,SAAS,KAAK,SAAS,IAAI;AAAA,IAClC;AAAA,EACF;AAAA;AAAA,EAGA,IAAI,qBAAqB;AAxR3B;AAyRI,UAAM,iBAAiB,IAAU;AAAA,QAC/B,gBAAK,aAAL,mBAAe,KAAK,gBAApB,mBAAiC,MAAK;AAAA,QACtC,gBAAK,aAAL,mBAAe,KAAK,gBAApB,mBAAiC,MAAK;AAAA,QACtC,gBAAK,aAAL,mBAAe,KAAK,gBAApB,mBAAiC,MAAK;AAAA,IACxC;AAEA,UAAM,YAAY,eAAe,OAAO;AACxC,UAAM,OAAO,eAAe,UAAU;AAEtC,WAAO,IAAU,iBAAW,EAAE,iBAAiB,MAAM,SAAS;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,gBAAgB;AAClB,UAAM,cAAqD;AAAA,MACzD;AAAA,MACA;AAAA,IACF;AAEA,WAAO,YAAY,SAAS,KAAK,gBAAgB,YAAY;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,wBAAwB;AAC1B,UAAM,mBAA0D;AAAA,MAC9D;AAAA,MACA;AAAA,IACF;AAEA,WAAO,iBAAiB,SAAS,KAAK,gBAAgB,YAAY;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,0BAA0B;AAC5B,UAAM,qBAA8D;AAAA,MAClE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WAAO,mBAAmB,SAAS,KAAK,gBAAgB,cAAc;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,aAAa;AACf,WACE,KAAK,yBACL,KAAK,2BACL,KAAK,oBAAoB;AAAA,EAE7B;AAAA,EAEM,aAAa;AAAA;AACjB,UAAI,KAAK,oBAAoB,UAAU;AACrC,gBAAQ,MAAM,gDAAgD;AAC9D;AAAA,MACF;AAEA,mCAAY,MAAM;AAChB,aAAK,kBAAkB;AAAA,MACzB,CAAC;AAED,UAAI;AACF,cAAM,KAAK,KAAK,IAAI,WAAW;AAAA,UAC7B,KAAK;AAAA,UACL;AAAA,QACF;AAEA,qCAAY,MAAM;AAChB,eAAK,kBAAkB;AAAA,QACzB,CAAC;AAAA,MACH,SAAS,KAAK;AACZ,qCAAY,MAAM;AAChB,eAAK,kBAAkB;AAAA,QACzB,CAAC;AACD,cAAM;AAAA,MACR;AAAA,IACF;AAAA;AAAA,EAEM,WAAW;AAAA;AACf,UAAI,KAAK,oBAAoB,YAAY;AACvC,gBAAQ,MAAM,4CAA4C;AAC1D;AAAA,MACF;AAEA,mCAAY,MAAM;AAChB,aAAK,kBAAkB;AAAA,MACzB,CAAC;AAED,UAAI;AACF,cAAM,KAAK,KAAK,IAAI,WAAW;AAAA,UAC7B,KAAK;AAAA,UACL;AAAA,QACF;AAEA,qCAAY,MAAM;AAChB,eAAK,kBAAkB;AAAA,QACzB,CAAC;AAAA,MACH,SAAS,KAAK;AACZ,qCAAY,MAAM;AAChB,eAAK,kBAAkB;AAAA,QACzB,CAAC;AACD,cAAM;AAAA,MACR;AAAA,IACF;AAAA;AAAA,EAEA,mBAAmB;AACjB,QAAI,KAAK,oBAAoB,YAAY;AACvC,WAAK,SAAS;AAAA,IAChB,WAAW,KAAK,oBAAoB,UAAU;AAC5C,WAAK,WAAW;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,UAAU;AACR,SAAK,kBAAkB,MAAM;AAC7B,QAAI,KAAK;AACP,WAAK,gCAAgC,MAAM;AAC7C,QAAI,KAAK;AACP,WAAK,6BAA6B,MAAM;AAAA,EAC5C;AAAA,EAEA,mBAAmB,UAAkB;AACnC,SAAK,kBAAkB;AAAA,EACzB;AACF;;;AG/ZA,IAAI,gBAA6B,oBAAI,IAAI;AAEzC,SAAsB,sBACpB,WACA,aAAqB,IACrB,2BACkC;AAAA;AAClC,UAAM,kBAA2C,CAAC;AAElD,QAAI;AACF,YAAM,UAAU,MAAM,UAAU,OAAO,YAAY;AACnD,YAAM,mBAAmB,IAAI,IAAI,QAAQ,OAAO;AAEhD,YAAM,eAAe,MAAM,KAAK,gBAAgB,EAAE;AAAA,QAChD,CAAC,OAAO,CAAC,cAAc,IAAI,EAAE;AAAA,MAC/B;AAEA,iBAAW,YAAY,cAAc;AACnC,cAAM,aAAa,MAAM,UAAU,OAAO;AAAA,UACxC;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,wBAAgB,KAAK,UAAU;AAAA,MACjC;AAEA,sBAAgB;AAAA,IAClB,SAAS,OAAO;AACd,cAAQ,MAAM,sCAAsC,KAAK;AAAA,IAC3D;AAEA,WAAO;AAAA,EACT;AAAA;;;AC5BA,SAAS,iBAAiB;AACxB,OAAK,WAAW,CAAC;AACjB,OAAK,OAAO;AACd;AAEA,IAAO,yBAAQ;;;ACoBf,SAAS,GAAG,OAAO,OAAO;AACxB,SAAO,UAAU,SAAU,UAAU,SAAS,UAAU;AAC1D;AAEA,IAAO,aAAQ;;;AC1Bf,SAAS,aAAa,OAAO,KAAK;AAChC,MAAI,SAAS,MAAM;AACnB,SAAO,UAAU;AACf,QAAI,WAAG,MAAM,MAAM,EAAE,CAAC,GAAG,GAAG,GAAG;AAC7B,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAO,uBAAQ;;;ACjBf,IAAI,aAAa,MAAM;AAGvB,IAAI,SAAS,WAAW;AAWxB,SAAS,gBAAgB,KAAK;AAC5B,MAAI,OAAO,KAAK,UACZ,QAAQ,qBAAa,MAAM,GAAG;AAElC,MAAI,QAAQ,GAAG;AACb,WAAO;AAAA,EACT;AACA,MAAI,YAAY,KAAK,SAAS;AAC9B,MAAI,SAAS,WAAW;AACtB,SAAK,IAAI;AAAA,EACX,OAAO;AACL,WAAO,KAAK,MAAM,OAAO,CAAC;AAAA,EAC5B;AACA,IAAE,KAAK;AACP,SAAO;AACT;AAEA,IAAO,0BAAQ;;;ACvBf,SAAS,aAAa,KAAK;AACzB,MAAI,OAAO,KAAK,UACZ,QAAQ,qBAAa,MAAM,GAAG;AAElC,SAAO,QAAQ,IAAI,SAAY,KAAK,KAAK,EAAE,CAAC;AAC9C;AAEA,IAAO,uBAAQ;;;ACPf,SAAS,aAAa,KAAK;AACzB,SAAO,qBAAa,KAAK,UAAU,GAAG,IAAI;AAC5C;AAEA,IAAO,uBAAQ;;;ACHf,SAAS,aAAa,KAAK,OAAO;AAChC,MAAI,OAAO,KAAK,UACZ,QAAQ,qBAAa,MAAM,GAAG;AAElC,MAAI,QAAQ,GAAG;AACb,MAAE,KAAK;AACP,SAAK,KAAK,CAAC,KAAK,KAAK,CAAC;AAAA,EACxB,OAAO;AACL,SAAK,KAAK,EAAE,CAAC,IAAI;AAAA,EACnB;AACA,SAAO;AACT;AAEA,IAAO,uBAAQ;;;ACZf,SAAS,UAAU,SAAS;AAC1B,MAAI,QAAQ,IACR,SAAS,WAAW,OAAO,IAAI,QAAQ;AAE3C,OAAK,MAAM;AACX,SAAO,EAAE,QAAQ,QAAQ;AACvB,QAAI,QAAQ,QAAQ,KAAK;AACzB,SAAK,IAAI,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AAAA,EAC7B;AACF;AAGA,UAAU,UAAU,QAAQ;AAC5B,UAAU,UAAU,QAAQ,IAAI;AAChC,UAAU,UAAU,MAAM;AAC1B,UAAU,UAAU,MAAM;AAC1B,UAAU,UAAU,MAAM;AAE1B,IAAO,oBAAQ;;;ACtBf,SAAS,aAAa;AACpB,OAAK,WAAW,IAAI;AACpB,OAAK,OAAO;AACd;AAEA,IAAO,qBAAQ;;;ACLf,SAAS,YAAY,KAAK;AACxB,MAAI,OAAO,KAAK,UACZ,SAAS,KAAK,QAAQ,EAAE,GAAG;AAE/B,OAAK,OAAO,KAAK;AACjB,SAAO;AACT;AAEA,IAAO,sBAAQ;;;ACRf,SAAS,SAAS,KAAK;AACrB,SAAO,KAAK,SAAS,IAAI,GAAG;AAC9B;AAEA,IAAO,mBAAQ;;;ACJf,SAAS,SAAS,KAAK;AACrB,SAAO,KAAK,SAAS,IAAI,GAAG;AAC9B;AAEA,IAAO,mBAAQ;;;ACZf,IAAI,aAAa,OAAO,UAAU,YAAY,UAAU,OAAO,WAAW,UAAU;AAEpF,IAAO,qBAAQ;;;ACAf,IAAI,WAAW,OAAO,QAAQ,YAAY,QAAQ,KAAK,WAAW,UAAU;AAG5E,IAAI,OAAO,sBAAc,YAAY,SAAS,aAAa,EAAE;AAE7D,IAAO,eAAQ;;;ACLf,IAAIC,UAAS,aAAK;AAElB,IAAO,iBAAQA;;;ACFf,IAAI,cAAc,OAAO;AAGzB,IAAI,iBAAiB,YAAY;AAOjC,IAAI,uBAAuB,YAAY;AAGvC,IAAI,iBAAiB,iBAAS,eAAO,cAAc;AASnD,SAAS,UAAU,OAAO;AACxB,MAAI,QAAQ,eAAe,KAAK,OAAO,cAAc,GACjD,MAAM,MAAM,cAAc;AAE9B,MAAI;AACF,UAAM,cAAc,IAAI;AACxB,QAAI,WAAW;AAAA,EACjB,SAAS,GAAG;AAAA,EAAC;AAEb,MAAI,SAAS,qBAAqB,KAAK,KAAK;AAC5C,MAAI,UAAU;AACZ,QAAI,OAAO;AACT,YAAM,cAAc,IAAI;AAAA,IAC1B,OAAO;AACL,aAAO,MAAM,cAAc;AAAA,IAC7B;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAO,oBAAQ;;;AC5Cf,IAAIC,eAAc,OAAO;AAOzB,IAAIC,wBAAuBD,aAAY;AASvC,SAAS,eAAe,OAAO;AAC7B,SAAOC,sBAAqB,KAAK,KAAK;AACxC;AAEA,IAAO,yBAAQ;;;AChBf,IAAI,UAAU;AAAd,IACI,eAAe;AAGnB,IAAIC,kBAAiB,iBAAS,eAAO,cAAc;AASnD,SAAS,WAAW,OAAO;AACzB,MAAI,SAAS,MAAM;AACjB,WAAO,UAAU,SAAY,eAAe;AAAA,EAC9C;AACA,SAAQA,mBAAkBA,mBAAkB,OAAO,KAAK,IACpD,kBAAU,KAAK,IACf,uBAAe,KAAK;AAC1B;AAEA,IAAO,qBAAQ;;;ACFf,SAAS,SAAS,OAAO;AACvB,MAAI,OAAO,OAAO;AAClB,SAAO,SAAS,SAAS,QAAQ,YAAY,QAAQ;AACvD;AAEA,IAAO,mBAAQ;;;AC1Bf,IAAI,WAAW;AAAf,IACI,UAAU;AADd,IAEI,SAAS;AAFb,IAGI,WAAW;AAmBf,SAAS,WAAW,OAAO;AACzB,MAAI,CAAC,iBAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAGA,MAAI,MAAM,mBAAW,KAAK;AAC1B,SAAO,OAAO,WAAW,OAAO,UAAU,OAAO,YAAY,OAAO;AACtE;AAEA,IAAO,qBAAQ;;;ACjCf,IAAI,aAAa,aAAK,oBAAoB;AAE1C,IAAO,qBAAQ;;;ACFf,IAAI,aAAc,WAAW;AAC3B,MAAI,MAAM,SAAS,KAAK,sBAAc,mBAAW,QAAQ,mBAAW,KAAK,YAAY,EAAE;AACvF,SAAO,MAAO,mBAAmB,MAAO;AAC1C,EAAE;AASF,SAAS,SAAS,MAAM;AACtB,SAAO,CAAC,CAAC,cAAe,cAAc;AACxC;AAEA,IAAO,mBAAQ;;;AClBf,IAAI,YAAY,SAAS;AAGzB,IAAI,eAAe,UAAU;AAS7B,SAAS,SAAS,MAAM;AACtB,MAAI,QAAQ,MAAM;AAChB,QAAI;AACF,aAAO,aAAa,KAAK,IAAI;AAAA,IAC/B,SAAS,GAAG;AAAA,IAAC;AACb,QAAI;AACF,aAAQ,OAAO;AAAA,IACjB,SAAS,GAAG;AAAA,IAAC;AAAA,EACf;AACA,SAAO;AACT;AAEA,IAAO,mBAAQ;;;AChBf,IAAI,eAAe;AAGnB,IAAI,eAAe;AAGnB,IAAIC,aAAY,SAAS;AAAzB,IACIC,eAAc,OAAO;AAGzB,IAAIC,gBAAeF,WAAU;AAG7B,IAAIG,kBAAiBF,aAAY;AAGjC,IAAI,aAAa;AAAA,EAAO,MACtBC,cAAa,KAAKC,eAAc,EAAE,QAAQ,cAAc,MAAM,EAC7D,QAAQ,0DAA0D,OAAO,IAAI;AAChF;AAUA,SAAS,aAAa,OAAO;AAC3B,MAAI,CAAC,iBAAS,KAAK,KAAK,iBAAS,KAAK,GAAG;AACvC,WAAO;AAAA,EACT;AACA,MAAI,UAAU,mBAAW,KAAK,IAAI,aAAa;AAC/C,SAAO,QAAQ,KAAK,iBAAS,KAAK,CAAC;AACrC;AAEA,IAAO,uBAAQ;;;ACtCf,SAAS,SAAS,QAAQ,KAAK;AAC7B,SAAO,UAAU,OAAO,SAAY,OAAO,GAAG;AAChD;AAEA,IAAO,mBAAQ;;;ACDf,SAAS,UAAU,QAAQ,KAAK;AAC9B,MAAI,QAAQ,iBAAS,QAAQ,GAAG;AAChC,SAAO,qBAAa,KAAK,IAAI,QAAQ;AACvC;AAEA,IAAO,oBAAQ;;;ACZf,IAAI,MAAM,kBAAU,cAAM,KAAK;AAE/B,IAAO,cAAQ;;;ACHf,IAAI,eAAe,kBAAU,QAAQ,QAAQ;AAE7C,IAAO,uBAAQ;;;ACIf,SAAS,YAAY;AACnB,OAAK,WAAW,uBAAe,qBAAa,IAAI,IAAI,CAAC;AACrD,OAAK,OAAO;AACd;AAEA,IAAO,oBAAQ;;;ACJf,SAAS,WAAW,KAAK;AACvB,MAAI,SAAS,KAAK,IAAI,GAAG,KAAK,OAAO,KAAK,SAAS,GAAG;AACtD,OAAK,QAAQ,SAAS,IAAI;AAC1B,SAAO;AACT;AAEA,IAAO,qBAAQ;;;ACbf,IAAI,iBAAiB;AAGrB,IAAIC,eAAc,OAAO;AAGzB,IAAIC,kBAAiBD,aAAY;AAWjC,SAAS,QAAQ,KAAK;AACpB,MAAI,OAAO,KAAK;AAChB,MAAI,sBAAc;AAChB,QAAI,SAAS,KAAK,GAAG;AACrB,WAAO,WAAW,iBAAiB,SAAY;AAAA,EACjD;AACA,SAAOC,gBAAe,KAAK,MAAM,GAAG,IAAI,KAAK,GAAG,IAAI;AACtD;AAEA,IAAO,kBAAQ;;;AC1Bf,IAAIC,eAAc,OAAO;AAGzB,IAAIC,kBAAiBD,aAAY;AAWjC,SAAS,QAAQ,KAAK;AACpB,MAAI,OAAO,KAAK;AAChB,SAAO,uBAAgB,KAAK,GAAG,MAAM,SAAaC,gBAAe,KAAK,MAAM,GAAG;AACjF;AAEA,IAAO,kBAAQ;;;ACnBf,IAAIC,kBAAiB;AAYrB,SAAS,QAAQ,KAAK,OAAO;AAC3B,MAAI,OAAO,KAAK;AAChB,OAAK,QAAQ,KAAK,IAAI,GAAG,IAAI,IAAI;AACjC,OAAK,GAAG,IAAK,wBAAgB,UAAU,SAAaA,kBAAiB;AACrE,SAAO;AACT;AAEA,IAAO,kBAAQ;;;ACTf,SAAS,KAAK,SAAS;AACrB,MAAI,QAAQ,IACR,SAAS,WAAW,OAAO,IAAI,QAAQ;AAE3C,OAAK,MAAM;AACX,SAAO,EAAE,QAAQ,QAAQ;AACvB,QAAI,QAAQ,QAAQ,KAAK;AACzB,SAAK,IAAI,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AAAA,EAC7B;AACF;AAGA,KAAK,UAAU,QAAQ;AACvB,KAAK,UAAU,QAAQ,IAAI;AAC3B,KAAK,UAAU,MAAM;AACrB,KAAK,UAAU,MAAM;AACrB,KAAK,UAAU,MAAM;AAErB,IAAO,eAAQ;;;ACpBf,SAAS,gBAAgB;AACvB,OAAK,OAAO;AACZ,OAAK,WAAW;AAAA,IACd,QAAQ,IAAI;AAAA,IACZ,OAAO,KAAK,eAAO;AAAA,IACnB,UAAU,IAAI;AAAA,EAChB;AACF;AAEA,IAAO,wBAAQ;;;ACbf,SAAS,UAAU,OAAO;AACxB,MAAI,OAAO,OAAO;AAClB,SAAQ,QAAQ,YAAY,QAAQ,YAAY,QAAQ,YAAY,QAAQ,YACvE,UAAU,cACV,UAAU;AACjB;AAEA,IAAO,oBAAQ;;;ACJf,SAAS,WAAW,KAAK,KAAK;AAC5B,MAAI,OAAO,IAAI;AACf,SAAO,kBAAU,GAAG,IAChB,KAAK,OAAO,OAAO,WAAW,WAAW,MAAM,IAC/C,KAAK;AACX;AAEA,IAAO,qBAAQ;;;ACNf,SAAS,eAAe,KAAK;AAC3B,MAAI,SAAS,mBAAW,MAAM,GAAG,EAAE,QAAQ,EAAE,GAAG;AAChD,OAAK,QAAQ,SAAS,IAAI;AAC1B,SAAO;AACT;AAEA,IAAO,yBAAQ;;;ACNf,SAAS,YAAY,KAAK;AACxB,SAAO,mBAAW,MAAM,GAAG,EAAE,IAAI,GAAG;AACtC;AAEA,IAAO,sBAAQ;;;ACJf,SAAS,YAAY,KAAK;AACxB,SAAO,mBAAW,MAAM,GAAG,EAAE,IAAI,GAAG;AACtC;AAEA,IAAO,sBAAQ;;;ACHf,SAAS,YAAY,KAAK,OAAO;AAC/B,MAAI,OAAO,mBAAW,MAAM,GAAG,GAC3B,OAAO,KAAK;AAEhB,OAAK,IAAI,KAAK,KAAK;AACnB,OAAK,QAAQ,KAAK,QAAQ,OAAO,IAAI;AACrC,SAAO;AACT;AAEA,IAAO,sBAAQ;;;ACRf,SAAS,SAAS,SAAS;AACzB,MAAI,QAAQ,IACR,SAAS,WAAW,OAAO,IAAI,QAAQ;AAE3C,OAAK,MAAM;AACX,SAAO,EAAE,QAAQ,QAAQ;AACvB,QAAI,QAAQ,QAAQ,KAAK;AACzB,SAAK,IAAI,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AAAA,EAC7B;AACF;AAGA,SAAS,UAAU,QAAQ;AAC3B,SAAS,UAAU,QAAQ,IAAI;AAC/B,SAAS,UAAU,MAAM;AACzB,SAAS,UAAU,MAAM;AACzB,SAAS,UAAU,MAAM;AAEzB,IAAO,mBAAQ;;;AC1Bf,IAAI,mBAAmB;AAYvB,SAAS,SAAS,KAAK,OAAO;AAC5B,MAAI,OAAO,KAAK;AAChB,MAAI,gBAAgB,mBAAW;AAC7B,QAAI,QAAQ,KAAK;AACjB,QAAI,CAAC,eAAQ,MAAM,SAAS,mBAAmB,GAAI;AACjD,YAAM,KAAK,CAAC,KAAK,KAAK,CAAC;AACvB,WAAK,OAAO,EAAE,KAAK;AACnB,aAAO;AAAA,IACT;AACA,WAAO,KAAK,WAAW,IAAI,iBAAS,KAAK;AAAA,EAC3C;AACA,OAAK,IAAI,KAAK,KAAK;AACnB,OAAK,OAAO,KAAK;AACjB,SAAO;AACT;AAEA,IAAO,mBAAQ;;;ACnBf,SAAS,MAAM,SAAS;AACtB,MAAI,OAAO,KAAK,WAAW,IAAI,kBAAU,OAAO;AAChD,OAAK,OAAO,KAAK;AACnB;AAGA,MAAM,UAAU,QAAQ;AACxB,MAAM,UAAU,QAAQ,IAAI;AAC5B,MAAM,UAAU,MAAM;AACtB,MAAM,UAAU,MAAM;AACtB,MAAM,UAAU,MAAM;AAEtB,IAAO,gBAAQ;;;ACzBf,IAAIC,kBAAiB;AAYrB,SAAS,YAAY,OAAO;AAC1B,OAAK,SAAS,IAAI,OAAOA,eAAc;AACvC,SAAO;AACT;AAEA,IAAO,sBAAQ;;;ACTf,SAAS,YAAY,OAAO;AAC1B,SAAO,KAAK,SAAS,IAAI,KAAK;AAChC;AAEA,IAAO,sBAAQ;;;ACDf,SAAS,SAAS,QAAQ;AACxB,MAAI,QAAQ,IACR,SAAS,UAAU,OAAO,IAAI,OAAO;AAEzC,OAAK,WAAW,IAAI;AACpB,SAAO,EAAE,QAAQ,QAAQ;AACvB,SAAK,IAAI,OAAO,KAAK,CAAC;AAAA,EACxB;AACF;AAGA,SAAS,UAAU,MAAM,SAAS,UAAU,OAAO;AACnD,SAAS,UAAU,MAAM;AAEzB,IAAO,mBAAQ;;;AChBf,SAAS,UAAU,OAAO,WAAW;AACnC,MAAI,QAAQ,IACR,SAAS,SAAS,OAAO,IAAI,MAAM;AAEvC,SAAO,EAAE,QAAQ,QAAQ;AACvB,QAAI,UAAU,MAAM,KAAK,GAAG,OAAO,KAAK,GAAG;AACzC,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAO,oBAAQ;;;ACdf,SAAS,SAAS,OAAO,KAAK;AAC5B,SAAO,MAAM,IAAI,GAAG;AACtB;AAEA,IAAO,mBAAQ;;;ACPf,IAAI,uBAAuB;AAA3B,IACI,yBAAyB;AAe7B,SAAS,YAAY,OAAO,OAAO,SAAS,YAAY,WAAW,OAAO;AACxE,MAAI,YAAY,UAAU,sBACtB,YAAY,MAAM,QAClB,YAAY,MAAM;AAEtB,MAAI,aAAa,aAAa,EAAE,aAAa,YAAY,YAAY;AACnE,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,MAAM,IAAI,KAAK;AAChC,MAAI,aAAa,MAAM,IAAI,KAAK;AAChC,MAAI,cAAc,YAAY;AAC5B,WAAO,cAAc,SAAS,cAAc;AAAA,EAC9C;AACA,MAAI,QAAQ,IACR,SAAS,MACT,OAAQ,UAAU,yBAA0B,IAAI,qBAAW;AAE/D,QAAM,IAAI,OAAO,KAAK;AACtB,QAAM,IAAI,OAAO,KAAK;AAGtB,SAAO,EAAE,QAAQ,WAAW;AAC1B,QAAI,WAAW,MAAM,KAAK,GACtB,WAAW,MAAM,KAAK;AAE1B,QAAI,YAAY;AACd,UAAI,WAAW,YACX,WAAW,UAAU,UAAU,OAAO,OAAO,OAAO,KAAK,IACzD,WAAW,UAAU,UAAU,OAAO,OAAO,OAAO,KAAK;AAAA,IAC/D;AACA,QAAI,aAAa,QAAW;AAC1B,UAAI,UAAU;AACZ;AAAA,MACF;AACA,eAAS;AACT;AAAA,IACF;AAEA,QAAI,MAAM;AACR,UAAI,CAAC,kBAAU,OAAO,SAASC,WAAU,UAAU;AAC7C,YAAI,CAAC,iBAAS,MAAM,QAAQ,MACvB,aAAaA,aAAY,UAAU,UAAUA,WAAU,SAAS,YAAY,KAAK,IAAI;AACxF,iBAAO,KAAK,KAAK,QAAQ;AAAA,QAC3B;AAAA,MACF,CAAC,GAAG;AACN,iBAAS;AACT;AAAA,MACF;AAAA,IACF,WAAW,EACL,aAAa,YACX,UAAU,UAAU,UAAU,SAAS,YAAY,KAAK,IACzD;AACL,eAAS;AACT;AAAA,IACF;AAAA,EACF;AACA,QAAM,QAAQ,EAAE,KAAK;AACrB,QAAM,QAAQ,EAAE,KAAK;AACrB,SAAO;AACT;AAEA,IAAO,sBAAQ;;;AChFf,IAAIC,cAAa,aAAK;AAEtB,IAAO,qBAAQA;;;ACEf,SAAS,WAAW,KAAK;AACvB,MAAI,QAAQ,IACR,SAAS,MAAM,IAAI,IAAI;AAE3B,MAAI,QAAQ,SAAS,OAAO,KAAK;AAC/B,WAAO,EAAE,KAAK,IAAI,CAAC,KAAK,KAAK;AAAA,EAC/B,CAAC;AACD,SAAO;AACT;AAEA,IAAO,qBAAQ;;;ACVf,SAAS,WAAW,KAAK;AACvB,MAAI,QAAQ,IACR,SAAS,MAAM,IAAI,IAAI;AAE3B,MAAI,QAAQ,SAAS,OAAO;AAC1B,WAAO,EAAE,KAAK,IAAI;AAAA,EACpB,CAAC;AACD,SAAO;AACT;AAEA,IAAO,qBAAQ;;;ACTf,IAAIC,wBAAuB;AAA3B,IACIC,0BAAyB;AAG7B,IAAI,UAAU;AAAd,IACI,UAAU;AADd,IAEI,WAAW;AAFf,IAGI,SAAS;AAHb,IAII,YAAY;AAJhB,IAKI,YAAY;AALhB,IAMI,SAAS;AANb,IAOI,YAAY;AAPhB,IAQI,YAAY;AAEhB,IAAI,iBAAiB;AAArB,IACI,cAAc;AAGlB,IAAI,cAAc,iBAAS,eAAO,YAAY;AAA9C,IACI,gBAAgB,cAAc,YAAY,UAAU;AAmBxD,SAAS,WAAW,QAAQ,OAAO,KAAK,SAAS,YAAY,WAAW,OAAO;AAC7E,UAAQ,KAAK;AAAA,IACX,KAAK;AACH,UAAK,OAAO,cAAc,MAAM,cAC3B,OAAO,cAAc,MAAM,YAAa;AAC3C,eAAO;AAAA,MACT;AACA,eAAS,OAAO;AAChB,cAAQ,MAAM;AAAA,IAEhB,KAAK;AACH,UAAK,OAAO,cAAc,MAAM,cAC5B,CAAC,UAAU,IAAI,mBAAW,MAAM,GAAG,IAAI,mBAAW,KAAK,CAAC,GAAG;AAC7D,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IAET,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAGH,aAAO,WAAG,CAAC,QAAQ,CAAC,KAAK;AAAA,IAE3B,KAAK;AACH,aAAO,OAAO,QAAQ,MAAM,QAAQ,OAAO,WAAW,MAAM;AAAA,IAE9D,KAAK;AAAA,IACL,KAAK;AAIH,aAAO,UAAW,QAAQ;AAAA,IAE5B,KAAK;AACH,UAAI,UAAU;AAAA,IAEhB,KAAK;AACH,UAAI,YAAY,UAAUD;AAC1B,kBAAY,UAAU;AAEtB,UAAI,OAAO,QAAQ,MAAM,QAAQ,CAAC,WAAW;AAC3C,eAAO;AAAA,MACT;AAEA,UAAI,UAAU,MAAM,IAAI,MAAM;AAC9B,UAAI,SAAS;AACX,eAAO,WAAW;AAAA,MACpB;AACA,iBAAWC;AAGX,YAAM,IAAI,QAAQ,KAAK;AACvB,UAAI,SAAS,oBAAY,QAAQ,MAAM,GAAG,QAAQ,KAAK,GAAG,SAAS,YAAY,WAAW,KAAK;AAC/F,YAAM,QAAQ,EAAE,MAAM;AACtB,aAAO;AAAA,IAET,KAAK;AACH,UAAI,eAAe;AACjB,eAAO,cAAc,KAAK,MAAM,KAAK,cAAc,KAAK,KAAK;AAAA,MAC/D;AAAA,EACJ;AACA,SAAO;AACT;AAEA,IAAO,qBAAQ;;;ACvGf,SAAS,UAAU,OAAO,QAAQ;AAChC,MAAI,QAAQ,IACR,SAAS,OAAO,QAChB,SAAS,MAAM;AAEnB,SAAO,EAAE,QAAQ,QAAQ;AACvB,UAAM,SAAS,KAAK,IAAI,OAAO,KAAK;AAAA,EACtC;AACA,SAAO;AACT;AAEA,IAAO,oBAAQ;;;ACIf,IAAI,UAAU,MAAM;AAEpB,IAAO,kBAAQ;;;ACXf,SAAS,eAAe,QAAQ,UAAU,aAAa;AACrD,MAAI,SAAS,SAAS,MAAM;AAC5B,SAAO,gBAAQ,MAAM,IAAI,SAAS,kBAAU,QAAQ,YAAY,MAAM,CAAC;AACzE;AAEA,IAAO,yBAAQ;;;ACVf,SAAS,YAAY,OAAO,WAAW;AACrC,MAAI,QAAQ,IACR,SAAS,SAAS,OAAO,IAAI,MAAM,QACnC,WAAW,GACX,SAAS,CAAC;AAEd,SAAO,EAAE,QAAQ,QAAQ;AACvB,QAAI,QAAQ,MAAM,KAAK;AACvB,QAAI,UAAU,OAAO,OAAO,KAAK,GAAG;AAClC,aAAO,UAAU,IAAI;AAAA,IACvB;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAO,sBAAQ;;;ACNf,SAAS,YAAY;AACnB,SAAO,CAAC;AACV;AAEA,IAAO,oBAAQ;;;AClBf,IAAIC,eAAc,OAAO;AAGzB,IAAI,uBAAuBA,aAAY;AAGvC,IAAI,mBAAmB,OAAO;AAS9B,IAAI,aAAa,CAAC,mBAAmB,oBAAY,SAAS,QAAQ;AAChE,MAAI,UAAU,MAAM;AAClB,WAAO,CAAC;AAAA,EACV;AACA,WAAS,OAAO,MAAM;AACtB,SAAO,oBAAY,iBAAiB,MAAM,GAAG,SAAS,QAAQ;AAC5D,WAAO,qBAAqB,KAAK,QAAQ,MAAM;AAAA,EACjD,CAAC;AACH;AAEA,IAAO,qBAAQ;;;ACpBf,SAAS,UAAU,GAAG,UAAU;AAC9B,MAAI,QAAQ,IACR,SAAS,MAAM,CAAC;AAEpB,SAAO,EAAE,QAAQ,GAAG;AAClB,WAAO,KAAK,IAAI,SAAS,KAAK;AAAA,EAChC;AACA,SAAO;AACT;AAEA,IAAO,oBAAQ;;;ACKf,SAAS,aAAa,OAAO;AAC3B,SAAO,SAAS,QAAQ,OAAO,SAAS;AAC1C;AAEA,IAAO,uBAAQ;;;ACxBf,IAAI,UAAU;AASd,SAAS,gBAAgB,OAAO;AAC9B,SAAO,qBAAa,KAAK,KAAK,mBAAW,KAAK,KAAK;AACrD;AAEA,IAAO,0BAAQ;;;ACbf,IAAIC,eAAc,OAAO;AAGzB,IAAIC,kBAAiBD,aAAY;AAGjC,IAAIE,wBAAuBF,aAAY;AAoBvC,IAAI,cAAc,wBAAgB,2BAAW;AAAE,SAAO;AAAW,EAAE,CAAC,IAAI,0BAAkB,SAAS,OAAO;AACxG,SAAO,qBAAa,KAAK,KAAKC,gBAAe,KAAK,OAAO,QAAQ,KAC/D,CAACC,sBAAqB,KAAK,OAAO,QAAQ;AAC9C;AAEA,IAAO,sBAAQ;;;ACtBf,SAAS,YAAY;AACnB,SAAO;AACT;AAEA,IAAO,oBAAQ;;;ACbf,IAAI,cAAc,OAAO,WAAW,YAAY,WAAW,CAAC,QAAQ,YAAY;AAGhF,IAAI,aAAa,eAAe,OAAO,UAAU,YAAY,UAAU,CAAC,OAAO,YAAY;AAG3F,IAAI,gBAAgB,cAAc,WAAW,YAAY;AAGzD,IAAIC,UAAS,gBAAgB,aAAK,SAAS;AAG3C,IAAI,iBAAiBA,UAASA,QAAO,WAAW;AAmBhD,IAAI,WAAW,kBAAkB;AAEjC,IAAO,mBAAQ;;;ACpCf,IAAI,mBAAmB;AAGvB,IAAI,WAAW;AAUf,SAAS,QAAQ,OAAO,QAAQ;AAC9B,MAAI,OAAO,OAAO;AAClB,WAAS,UAAU,OAAO,mBAAmB;AAE7C,SAAO,CAAC,CAAC,WACN,QAAQ,YACN,QAAQ,YAAY,SAAS,KAAK,KAAK,OACrC,QAAQ,MAAM,QAAQ,KAAK,KAAK,QAAQ;AACjD;AAEA,IAAO,kBAAQ;;;ACvBf,IAAIC,oBAAmB;AA4BvB,SAAS,SAAS,OAAO;AACvB,SAAO,OAAO,SAAS,YACrB,QAAQ,MAAM,QAAQ,KAAK,KAAK,SAASA;AAC7C;AAEA,IAAO,mBAAQ;;;AC7Bf,IAAIC,WAAU;AAAd,IACI,WAAW;AADf,IAEIC,WAAU;AAFd,IAGIC,WAAU;AAHd,IAIIC,YAAW;AAJf,IAKIC,WAAU;AALd,IAMIC,UAAS;AANb,IAOIC,aAAY;AAPhB,IAQI,YAAY;AARhB,IASIC,aAAY;AAThB,IAUIC,UAAS;AAVb,IAWIC,aAAY;AAXhB,IAYI,aAAa;AAEjB,IAAIC,kBAAiB;AAArB,IACIC,eAAc;AADlB,IAEI,aAAa;AAFjB,IAGI,aAAa;AAHjB,IAII,UAAU;AAJd,IAKI,WAAW;AALf,IAMI,WAAW;AANf,IAOI,WAAW;AAPf,IAQI,kBAAkB;AARtB,IASI,YAAY;AAThB,IAUI,YAAY;AAGhB,IAAI,iBAAiB,CAAC;AACtB,eAAe,UAAU,IAAI,eAAe,UAAU,IACtD,eAAe,OAAO,IAAI,eAAe,QAAQ,IACjD,eAAe,QAAQ,IAAI,eAAe,QAAQ,IAClD,eAAe,eAAe,IAAI,eAAe,SAAS,IAC1D,eAAe,SAAS,IAAI;AAC5B,eAAeX,QAAO,IAAI,eAAe,QAAQ,IACjD,eAAeU,eAAc,IAAI,eAAeT,QAAO,IACvD,eAAeU,YAAW,IAAI,eAAeT,QAAO,IACpD,eAAeC,SAAQ,IAAI,eAAeC,QAAO,IACjD,eAAeC,OAAM,IAAI,eAAeC,UAAS,IACjD,eAAe,SAAS,IAAI,eAAeC,UAAS,IACpD,eAAeC,OAAM,IAAI,eAAeC,UAAS,IACjD,eAAe,UAAU,IAAI;AAS7B,SAAS,iBAAiB,OAAO;AAC/B,SAAO,qBAAa,KAAK,KACvB,iBAAS,MAAM,MAAM,KAAK,CAAC,CAAC,eAAe,mBAAW,KAAK,CAAC;AAChE;AAEA,IAAO,2BAAQ;;;ACpDf,SAAS,UAAU,MAAM;AACvB,SAAO,SAAS,OAAO;AACrB,WAAO,KAAK,KAAK;AAAA,EACnB;AACF;AAEA,IAAO,oBAAQ;;;ACVf,IAAIG,eAAc,OAAO,WAAW,YAAY,WAAW,CAAC,QAAQ,YAAY;AAGhF,IAAIC,cAAaD,gBAAe,OAAO,UAAU,YAAY,UAAU,CAAC,OAAO,YAAY;AAG3F,IAAIE,iBAAgBD,eAAcA,YAAW,YAAYD;AAGzD,IAAI,cAAcE,kBAAiB,mBAAW;AAG9C,IAAI,WAAY,WAAW;AACzB,MAAI;AAEF,QAAI,QAAQD,eAAcA,YAAW,WAAWA,YAAW,QAAQ,MAAM,EAAE;AAE3E,QAAI,OAAO;AACT,aAAO;AAAA,IACT;AAGA,WAAO,eAAe,YAAY,WAAW,YAAY,QAAQ,MAAM;AAAA,EACzE,SAAS,GAAG;AAAA,EAAC;AACf,EAAE;AAEF,IAAO,mBAAQ;;;ACxBf,IAAI,mBAAmB,oBAAY,iBAAS;AAmB5C,IAAI,eAAe,mBAAmB,kBAAU,gBAAgB,IAAI;AAEpE,IAAO,uBAAQ;;;AClBf,IAAIE,eAAc,OAAO;AAGzB,IAAIC,kBAAiBD,aAAY;AAUjC,SAAS,cAAc,OAAO,WAAW;AACvC,MAAI,QAAQ,gBAAQ,KAAK,GACrB,QAAQ,CAAC,SAAS,oBAAY,KAAK,GACnC,SAAS,CAAC,SAAS,CAAC,SAAS,iBAAS,KAAK,GAC3C,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,UAAU,qBAAa,KAAK,GAC1D,cAAc,SAAS,SAAS,UAAU,QAC1C,SAAS,cAAc,kBAAU,MAAM,QAAQ,MAAM,IAAI,CAAC,GAC1D,SAAS,OAAO;AAEpB,WAAS,OAAO,OAAO;AACrB,SAAK,aAAaC,gBAAe,KAAK,OAAO,GAAG,MAC5C,EAAE;AAAA,KAEC,OAAO;AAAA,IAEN,WAAW,OAAO,YAAY,OAAO;AAAA,IAErC,WAAW,OAAO,YAAY,OAAO,gBAAgB,OAAO;AAAA,IAE7D,gBAAQ,KAAK,MAAM,KAClB;AACN,aAAO,KAAK,GAAG;AAAA,IACjB;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAO,wBAAQ;;;AC/Cf,IAAIC,eAAc,OAAO;AASzB,SAAS,YAAY,OAAO;AAC1B,MAAI,OAAO,SAAS,MAAM,aACtB,QAAS,OAAO,QAAQ,cAAc,KAAK,aAAcA;AAE7D,SAAO,UAAU;AACnB;AAEA,IAAO,sBAAQ;;;ACTf,SAAS,QAAQ,MAAM,WAAW;AAChC,SAAO,SAAS,KAAK;AACnB,WAAO,KAAK,UAAU,GAAG,CAAC;AAAA,EAC5B;AACF;AAEA,IAAO,kBAAQ;;;ACXf,IAAI,aAAa,gBAAQ,OAAO,MAAM,MAAM;AAE5C,IAAO,qBAAQ;;;ACDf,IAAIC,gBAAc,OAAO;AAGzB,IAAIC,kBAAiBD,cAAY;AASjC,SAAS,SAAS,QAAQ;AACxB,MAAI,CAAC,oBAAY,MAAM,GAAG;AACxB,WAAO,mBAAW,MAAM;AAAA,EAC1B;AACA,MAAI,SAAS,CAAC;AACd,WAAS,OAAO,OAAO,MAAM,GAAG;AAC9B,QAAIC,gBAAe,KAAK,QAAQ,GAAG,KAAK,OAAO,eAAe;AAC5D,aAAO,KAAK,GAAG;AAAA,IACjB;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAO,mBAAQ;;;ACDf,SAAS,YAAY,OAAO;AAC1B,SAAO,SAAS,QAAQ,iBAAS,MAAM,MAAM,KAAK,CAAC,mBAAW,KAAK;AACrE;AAEA,IAAO,sBAAQ;;;ACAf,SAAS,KAAK,QAAQ;AACpB,SAAO,oBAAY,MAAM,IAAI,sBAAc,MAAM,IAAI,iBAAS,MAAM;AACtE;AAEA,IAAO,eAAQ;;;ACzBf,SAAS,WAAW,QAAQ;AAC1B,SAAO,uBAAe,QAAQ,cAAM,kBAAU;AAChD;AAEA,IAAO,qBAAQ;;;ACZf,IAAIC,wBAAuB;AAG3B,IAAIC,gBAAc,OAAO;AAGzB,IAAIC,kBAAiBD,cAAY;AAejC,SAAS,aAAa,QAAQ,OAAO,SAAS,YAAY,WAAW,OAAO;AAC1E,MAAI,YAAY,UAAUD,uBACtB,WAAW,mBAAW,MAAM,GAC5B,YAAY,SAAS,QACrB,WAAW,mBAAW,KAAK,GAC3B,YAAY,SAAS;AAEzB,MAAI,aAAa,aAAa,CAAC,WAAW;AACxC,WAAO;AAAA,EACT;AACA,MAAI,QAAQ;AACZ,SAAO,SAAS;AACd,QAAI,MAAM,SAAS,KAAK;AACxB,QAAI,EAAE,YAAY,OAAO,QAAQE,gBAAe,KAAK,OAAO,GAAG,IAAI;AACjE,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,aAAa,MAAM,IAAI,MAAM;AACjC,MAAI,aAAa,MAAM,IAAI,KAAK;AAChC,MAAI,cAAc,YAAY;AAC5B,WAAO,cAAc,SAAS,cAAc;AAAA,EAC9C;AACA,MAAI,SAAS;AACb,QAAM,IAAI,QAAQ,KAAK;AACvB,QAAM,IAAI,OAAO,MAAM;AAEvB,MAAI,WAAW;AACf,SAAO,EAAE,QAAQ,WAAW;AAC1B,UAAM,SAAS,KAAK;AACpB,QAAI,WAAW,OAAO,GAAG,GACrB,WAAW,MAAM,GAAG;AAExB,QAAI,YAAY;AACd,UAAI,WAAW,YACX,WAAW,UAAU,UAAU,KAAK,OAAO,QAAQ,KAAK,IACxD,WAAW,UAAU,UAAU,KAAK,QAAQ,OAAO,KAAK;AAAA,IAC9D;AAEA,QAAI,EAAE,aAAa,SACV,aAAa,YAAY,UAAU,UAAU,UAAU,SAAS,YAAY,KAAK,IAClF,WACD;AACL,eAAS;AACT;AAAA,IACF;AACA,iBAAa,WAAW,OAAO;AAAA,EACjC;AACA,MAAI,UAAU,CAAC,UAAU;AACvB,QAAI,UAAU,OAAO,aACjB,UAAU,MAAM;AAGpB,QAAI,WAAW,YACV,iBAAiB,UAAU,iBAAiB,UAC7C,EAAE,OAAO,WAAW,cAAc,mBAAmB,WACnD,OAAO,WAAW,cAAc,mBAAmB,UAAU;AACjE,eAAS;AAAA,IACX;AAAA,EACF;AACA,QAAM,QAAQ,EAAE,MAAM;AACtB,QAAM,QAAQ,EAAE,KAAK;AACrB,SAAO;AACT;AAEA,IAAO,uBAAQ;;;ACrFf,IAAI,WAAW,kBAAU,cAAM,UAAU;AAEzC,IAAO,mBAAQ;;;ACFf,IAAIC,WAAU,kBAAU,cAAM,SAAS;AAEvC,IAAO,kBAAQA;;;ACFf,IAAIC,OAAM,kBAAU,cAAM,KAAK;AAE/B,IAAO,cAAQA;;;ACFf,IAAI,UAAU,kBAAU,cAAM,SAAS;AAEvC,IAAO,kBAAQ;;;ACGf,IAAIC,UAAS;AAAb,IACIC,aAAY;AADhB,IAEI,aAAa;AAFjB,IAGIC,UAAS;AAHb,IAIIC,cAAa;AAEjB,IAAIC,eAAc;AAGlB,IAAI,qBAAqB,iBAAS,gBAAQ;AAA1C,IACI,gBAAgB,iBAAS,WAAG;AADhC,IAEI,oBAAoB,iBAAS,eAAO;AAFxC,IAGI,gBAAgB,iBAAS,WAAG;AAHhC,IAII,oBAAoB,iBAAS,eAAO;AASxC,IAAI,SAAS;AAGb,IAAK,oBAAY,OAAO,IAAI,iBAAS,IAAI,YAAY,CAAC,CAAC,CAAC,KAAKA,gBACxD,eAAO,OAAO,IAAI,aAAG,KAAKJ,WAC1B,mBAAW,OAAO,gBAAQ,QAAQ,CAAC,KAAK,cACxC,eAAO,OAAO,IAAI,aAAG,KAAKE,WAC1B,mBAAW,OAAO,IAAI,iBAAO,KAAKC,aAAa;AAClD,WAAS,SAAS,OAAO;AACvB,QAAI,SAAS,mBAAW,KAAK,GACzB,OAAO,UAAUF,aAAY,MAAM,cAAc,QACjD,aAAa,OAAO,iBAAS,IAAI,IAAI;AAEzC,QAAI,YAAY;AACd,cAAQ,YAAY;AAAA,QAClB,KAAK;AAAoB,iBAAOG;AAAA,QAChC,KAAK;AAAe,iBAAOJ;AAAA,QAC3B,KAAK;AAAmB,iBAAO;AAAA,QAC/B,KAAK;AAAe,iBAAOE;AAAA,QAC3B,KAAK;AAAmB,iBAAOC;AAAA,MACjC;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAEA,IAAO,iBAAQ;;;AC/Cf,IAAIE,wBAAuB;AAG3B,IAAIC,WAAU;AAAd,IACIC,YAAW;AADf,IAEIC,aAAY;AAGhB,IAAIC,gBAAc,OAAO;AAGzB,IAAIC,kBAAiBD,cAAY;AAgBjC,SAAS,gBAAgB,QAAQ,OAAO,SAAS,YAAY,WAAW,OAAO;AAC7E,MAAI,WAAW,gBAAQ,MAAM,GACzB,WAAW,gBAAQ,KAAK,GACxB,SAAS,WAAWF,YAAW,eAAO,MAAM,GAC5C,SAAS,WAAWA,YAAW,eAAO,KAAK;AAE/C,WAAS,UAAUD,WAAUE,aAAY;AACzC,WAAS,UAAUF,WAAUE,aAAY;AAEzC,MAAI,WAAW,UAAUA,YACrB,WAAW,UAAUA,YACrB,YAAY,UAAU;AAE1B,MAAI,aAAa,iBAAS,MAAM,GAAG;AACjC,QAAI,CAAC,iBAAS,KAAK,GAAG;AACpB,aAAO;AAAA,IACT;AACA,eAAW;AACX,eAAW;AAAA,EACb;AACA,MAAI,aAAa,CAAC,UAAU;AAC1B,cAAU,QAAQ,IAAI;AACtB,WAAQ,YAAY,qBAAa,MAAM,IACnC,oBAAY,QAAQ,OAAO,SAAS,YAAY,WAAW,KAAK,IAChE,mBAAW,QAAQ,OAAO,QAAQ,SAAS,YAAY,WAAW,KAAK;AAAA,EAC7E;AACA,MAAI,EAAE,UAAUH,wBAAuB;AACrC,QAAI,eAAe,YAAYK,gBAAe,KAAK,QAAQ,aAAa,GACpE,eAAe,YAAYA,gBAAe,KAAK,OAAO,aAAa;AAEvE,QAAI,gBAAgB,cAAc;AAChC,UAAI,eAAe,eAAe,OAAO,MAAM,IAAI,QAC/C,eAAe,eAAe,MAAM,MAAM,IAAI;AAElD,gBAAU,QAAQ,IAAI;AACtB,aAAO,UAAU,cAAc,cAAc,SAAS,YAAY,KAAK;AAAA,IACzE;AAAA,EACF;AACA,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AACA,YAAU,QAAQ,IAAI;AACtB,SAAO,qBAAa,QAAQ,OAAO,SAAS,YAAY,WAAW,KAAK;AAC1E;AAEA,IAAO,0BAAQ;;;ACjEf,SAAS,YAAY,OAAO,OAAO,SAAS,YAAY,OAAO;AAC7D,MAAI,UAAU,OAAO;AACnB,WAAO;AAAA,EACT;AACA,MAAI,SAAS,QAAQ,SAAS,QAAS,CAAC,qBAAa,KAAK,KAAK,CAAC,qBAAa,KAAK,GAAI;AACpF,WAAO,UAAU,SAAS,UAAU;AAAA,EACtC;AACA,SAAO,wBAAgB,OAAO,OAAO,SAAS,YAAY,aAAa,KAAK;AAC9E;AAEA,IAAO,sBAAQ;;;ACGf,SAAS,QAAQ,OAAO,OAAO;AAC7B,SAAO,oBAAY,OAAO,KAAK;AACjC;AAEA,IAAO,kBAAQ;;;AChCf,qBAAwB;AAejB,IAAM,mBAAN,MAAM,kBAAiB;AAAA,EAoB5B,YACW,cACA,OAA6B,CAAC,GACvC;AAFS;AACA;AAnBX;AAAA;AAAA,8BAAuD;AACvD,0BAAmD;AACnD,gCAGI,CAAC;AAAA,EAeF;AAAA,EAbH,OAAa,KACX,IACA,IAEA;AAAA,+CAHA,MACA,eACA,OAA6B,CAAC,GAC9B;AACA,YAAM,eAAe,MAAM,KAAK,oBAAoB,aAAa;AAEjE,aAAO,IAAI,kBAAiB,cAAc,IAAI;AAAA,IAChD;AAAA;AAAA,EAOA,IAAI,gBAAgB;AAClB,WAAO,KAAK,aAAa;AAAA,EAC3B;AAAA,EAEA,IAAI,OAAO;AACT,WAAO,KAAK,aAAa;AAAA,EAC3B;AAAA,EAEA,IAAI,YAAY;AACd,WAAO,KAAK,aAAa,OAAO;AAAA,EAClC;AAAA,EAEA,IAAI,oBAAoB;AACtB,QAAI,KAAK,mBAAoB,QAAO;AACpC,QAAI,KAAK,eAAgB,QAAO;AAChC,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,kBAAkB;AACpB,WAAO,KAAK,sBAAsB,KAAK;AAAA,EACzC;AAAA,EAEM,OAAO;AAAA;AAKX,UAAI,KAAK,oBAAoB;AAC3B,aAAK,mBAAmB,SAAS;AAAA,UAC/B,cAAc,KAAK;AAAA,UACnB,oBAAoB,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,UACvC,oBAAoB,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,UACvC,mBAAmB;AAAA,UACnB,mBAAmB;AAAA,UACnB,KAAK,KAAK,qBAAqB;AAAA,UAC/B,mBAAmB,KAAK,qBAAqB;AAAA,QAC/C,CAAC;AAAA,MACH;AAEA,UAAI,KAAK,gBAAgB;AACvB,aAAK,eAAe,SAAS;AAAA,UAC3B,cAAc,KAAK;AAAA,UACnB,kBAAkB,IAAI,MAAM,KAAK,SAAS,EAAE,KAAK,CAAC;AAAA,QACpD,CAAC;AAAA,MACH;AAAA,IACF;AAAA;AAAA,EAEA,UAAU;AACR,QAAI,KAAK,oBAAoB;AAC3B,WAAK,mBAAmB,QAAQ;AAAA,IAClC;AAEA,QAAI,KAAK,gBAAgB;AACvB,WAAK,eAAe,QAAQ;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,eACE,MACA,sBAIA;AACA,YAAQ,IAAI,2BAA2B,IAAI;AAC3C,QAAI,sBAAsB;AAExB,UAAI,CAAC,gBAAQ,KAAK,sBAAsB,oBAAoB,GAAG;AAC7D,YAAI,KAAK,oBAAoB;AAC3B,eAAK,mBAAmB,QAAQ;AAChC,eAAK,qBAAqB;AAAA,QAC5B;AAAA,MACF;AAEA,WAAK,uBAAuB;AAAA,IAC9B;AAEA,QAAI,SAAS,eAAe,KAAK,oBAAoB;AACnD,WAAK,mBAAmB,QAAQ;AAChC,WAAK,qBAAqB;AAAA,IAC5B;AAEA,QAAI,SAAS,WAAW,KAAK,gBAAgB;AAC3C,WAAK,eAAe,QAAQ;AAC5B,WAAK,iBAAiB;AAAA,IACxB;AAEA,QAAI,SAAS,eAAe,CAAC,KAAK,oBAAoB;AACpD,WAAK,qBAAqB,KAAK,KAAK;AAAA,QAClC;AAAA,MACF;AAEA,WAAK,mBAAmB;AAAA,QACtB;AAAA,QACA,CAAC,OAAqB;AACpB,gBAAM,OAAO,aAAa,GAAG,IAAI;AACjC,cAAI,QAAQ,WAAW,MAAM;AAC3B,gBAAI,KAAK,KAAK,SAAS;AACrB,mBAAK,KAAK,QAAQ,GAAG,IAAI;AAAA,YAC3B,OAAO;AACL,oBAAM,IAAI,MAAM,GAAG,IAAI;AAAA,YACzB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,SAAS,WAAW,CAAC,KAAK,gBAAgB;AAC5C,WAAK,iBAAiB,KAAK,KAAK;AAAA,QAC9B;AAAA,MACF;AAEA,WAAK,eAAe,iBAAiB,WAAW,CAAC,OAAqB;AACpE,cAAM,OAAO,aAAa,GAAG,IAAI;AACjC,YAAI,QAAQ,WAAW,MAAM;AAC3B,cAAI,KAAK,KAAK,SAAS;AACrB,iBAAK,KAAK,QAAQ,GAAG,IAAI;AAAA,UAC3B,OAAO;AACL,kBAAM,IAAI,MAAM,GAAG,IAAI;AAAA,UACzB;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKM,mBAAmB,IAWtB;AAAA,+CAXsB;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA,IACF,GAOG;AACD,UAAI,CAAC,KAAK,gBAAgB;AACxB,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAEA,YAAM,kBAAkB,IAAI,MAAM,KAAK,SAAS,EAAE,KAAK,CAAC;AAExD,sBAAgB,KAAK,IACnB,cAAc,MAAM,CAAC,qBAAqB;AAE5C,WAAK,eAAe,SAAS;AAAA,QAC3B,cAAc,KAAK;AAAA,QACnB,kBAAkB;AAAA,MACpB,CAAC;AAAA,IACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAKM,oBAAoB,IAQvB;AAAA,+CARuB;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,IACF,GAIG;AACD,UAAI,CAAC,KAAK,oBAAoB;AAC5B,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAEA,YAAM,aAAa,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AACtC,YAAM,gBAAgB,OAAO,OAAO,CAAC,GAAG,UAAU;AAClD,oBAAc,IAAI,IAAI,cAAc,MAAM,KAAK;AAE/C,WAAK,mBAAmB,SAAS;AAAA,QAC/B,cAAc,KAAK;AAAA,QACnB,oBAAoB;AAAA,QACpB,oBAAoB;AAAA,QACpB,mBAAmB;AAAA,QACnB,mBAAmB;AAAA,QACnB,KAAK,KAAK,qBAAqB;AAAA,QAC/B,mBAAmB,KAAK,qBAAqB;AAAA,MAC/C,CAAC;AAAA,IACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAKM,iBAAiB,IAQpB;AAAA,+CARoB;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,IACF,GAIG;AACD,UAAI,CAAC,KAAK,oBAAoB;AAC5B,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAEA,YAAM,aAAa,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AACtC,YAAM,gBAAgB,OAAO,OAAO,CAAC,GAAG,UAAU;AAClD,oBAAc,IAAI,IAAI,cAAc,MAAM,KAAK;AAE/C,WAAK,mBAAmB,SAAS;AAAA,QAC/B,cAAc,KAAK;AAAA,QACnB,oBAAoB;AAAA,QACpB,oBAAoB;AAAA,QACpB,mBAAmB;AAAA,QACnB,mBAAmB;AAAA,QACnB,KAAK,KAAK,qBAAqB;AAAA,QAC/B,mBAAmB,KAAK,qBAAqB;AAAA,MAC/C,CAAC;AAAA,IACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOM,8BAA8B,IAwBjC;AAAA,+CAxBiC;AAAA,MAClC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,GAgBG;AAtSL;AAuSI,YAAM,WAAsB,CAAC;AAE7B,UACE,CAAC,uBAAuB,eAAe,mBAAmB,aAAa,GACvE;AACA,cAAM,IAAI;AAAA,UACR,sCAAsC,eAAe,iBAAiB,4CAA4C,aAAa;AAAA,QACjI;AAAA,MACF;AAEA,UAAI,OAAO,SAAS,aAAa;AAC/B,cAAM,oBAAoB,OAAO,OAAO,CAAC,GAAG,eAAe,QAAQ;AACnE,0BAAkB,IAAI,KACpB,OAAO,cAAc,cAAc,MAAM,KAAK;AAEhD,iBAAS,KAAK;AAAA,UACZ,UAAU;AAAA,YACR,iBAAiB;AAAA,cACf,oBAAoB;AAAA,YACtB;AAAA,UACF;AAAA,UACA,MAAM;AAAA,YACJ,UAAU;AAAA,YACV,aAAa,eAAe;AAAA,YAC5B,mBAAmB;AAAA,UACrB;AAAA,QACF,CAAC;AAAA,MACH,WAAW,OAAO,SAAS,UAAU;AAKnC,cAAM,wBAAwB,IAAI;AAAA,UAChC,eAAe,YAAY,GAAG;AAAA,UAC9B,eAAe,YAAY,GAAG;AAAA,UAC9B,eAAe,YAAY,GAAG;AAAA,QAChC;AAEA,cAAM,qBAAqB,sBAAsB,OAAO;AACxD,cAAM,2BAA2B,sBAAsB,MAAM,EAAE,UAAU;AAGzE,cAAM,wBACJ,OAAO,gBAAgB,cAAc,MAAM,KAAK;AAElD,cAAM,8BAA8B,IAAI,uBAAQ,GAAK,GAAK,CAAG;AAC7D,oCAA4B,IAAI,IAAI;AAGpC,cAAM,KACJ,KAAK,IAAI,MAAM,qBAAqB,IACpC,KAAK,IAAI,MAAM,kBAAkB;AACnC,cAAM,KACJ,KAAK,IAAI,MAAM,qBAAqB,IACpC,KAAK,IAAI,MAAM,kBAAkB;AACnC,cAAM,KACJ,KAAK,IAAI,MAAM,qBAAqB,IACpC,KAAK,IAAI,MAAM,kBAAkB;AACnC,cAAM,KACJ,KAAK,IAAI,MAAM,qBAAqB,IACpC,KAAK,IAAI,MAAM,kBAAkB;AAEnC,cAAM,aAAa,4BAA4B;AAAA,UAC7C;AAAA,QACF;AAEA,cAAM,eAAe,4BAClB,MAAM,EACN,MAAM,wBAAwB;AAGjC,cAAM,iBAAiB,IAAM,KAAK,KAAK,KAAK,KAAK,UAAU;AAG3D,cAAM,KAAK,iBAAiB,KAAK,IAAI,MAAM,cAAc;AAEzD,cAAM,uBAAuB,IAAI,uBAAQ,EACtC,gBAAgB,cAAc,EAAE,EAChC,gBAAgB,6BAA6B,EAAE,EAC/C,gBAAgB,0BAA0B,EAAE,EAC5C,eAAe,EAAE;AAEpB,iBAAS,KAAK;AAAA,UACZ,UAAU;AAAA,YACR,iBAAiB;AAAA,cACf,gCAAgC;AAAA,YAClC;AAAA,UACF;AAAA,UACA,MAAM;AAAA,YACJ,UAAU,eAAe;AAAA,YACzB,aAAa;AAAA,YACb,mBAAmB;AAAA,UACrB;AAAA,QACF,CAAC;AAAA,MACH;AAEA,YAAM,gBAAgB,MAAM,KAAK,KAAK,IAAI,OAAO,WAAW;AAAA,QAC1D,cAAc,KAAK;AAAA,QACnB,sBAAsB;AAAA,QACtB,KAAK,KAAK,qBAAqB;AAAA,QAC/B;AAAA,MACF,CAAC;AAED,YAAM,iBAAgB,mBAAc,6BAAd,mBAAwC;AAC9D,UAAI,CAAC,eAAe;AAClB,cAAM,IAAI;AAAA,UACR,2CAA2C,KAAK,UAAU,aAAa,CAAC;AAAA,QAC1E;AAAA,MACF;AAEA,YAAM,KAAK,KAAK,IAAI,OAAO;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,UAEE,SAAS,MAAO;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMM,4BAA4B,IAY/B;AAAA,+CAZ+B;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,GAMG;AAlbL;AAmbI,YAAM,eAAe,CAAC,GAAG,cAAc,MAAM;AAC7C,mBAAa,KAAK,KAAM,gBAAgB,cAAc,MAAM,KAAK;AAEjE,YAAM,sBAAgC,IAAI;AAAA,QACxC,cAAc,OAAO;AAAA,MACvB,EAAE,KAAK,kBAAkB;AAEzB,YAAM,gBAAgB,MAAM,KAAK,KAAK,IAAI,OAAO,WAAW;AAAA,QAC1D,cAAc,KAAK;AAAA,QACnB,sBAAsB;AAAA,QACtB,UAAU;AAAA,UACR;AAAA,YACE,UAAU;AAAA,cACR,iBAAiB;AAAA,gBACf,uBAAuB;AAAA,kBACrB,QAAQ;AAAA,gBACV;AAAA,cACF;AAAA,YACF;AAAA,YACA,WAAW;AAAA,cACT,QAAQ;AAAA,YACV;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAED,YAAM,iBAAgB,mBAAc,6BAAd,mBAAwC;AAC9D,UAAI,CAAC,eAAe;AAClB,gBAAQ,MAAM,2CAA2C,aAAa;AACtE;AAAA,MACF;AAEA,YAAM,KAAK,KAAK,IAAI,OAAO;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,UAEE,SAAS,MAAO;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA;AACF;;;ACzdA,IAAAC,eAAgD;AAChD,mBAAwB;AAMxB,IAAMC,0BAAyB;AAE/B,SAAS,qBACP,sBACA,0BACU;AACV,QAAM,wBAAwB,IAAI;AAAA,IAChC,yBAAyB;AAAA,IACzB,yBAAyB;AAAA,IACzB,yBAAyB;AAAA,EAC3B;AAEA,QAAM,oBAAoB,IAAI;AAAA,IAC5B,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,EACvB;AAEA,QAAM,eAAe,sBAAsB,OAAO;AAClD,QAAM,cAAc,sBAAsB,UAAU;AAEpD,MAAI,WAAW,kBAAkB,OAAO;AACxC,MAAI,UAAU,kBAAkB,UAAU;AAG1C,MAAI,QAAQ,IAAI,WAAW,IAAI,GAAG;AAChC,eAAW,CAAC;AACZ,cAAU,QAAQ,eAAe,EAAI;AAAA,EACvC;AAIA,MAAI,kBAAkB,WAAW;AACjC,qBACE,IAAM,KAAK,KAAK,KAAK,OAAO,kBAAkB,KAAK,OAAO,IAAM,KAAK,GAAG;AAE1E,aAAW,eAAe;AAE1B,SAAO,QAAQ,eAAe,QAAQ;AACxC;AAKO,IAAM,yBAAN,MAAM,wBAAuB;AAAA,EAqDlC,YACW,MACA,YACA,aACA,oBACA,mBACT;AALS;AACA;AACA;AACA;AACA;AAET,SAAK,6BAA6B;AAElC,sBAAkB,iBAAiB,WAAW,CAAC,UAAU;AAvH7D;AAwHM,YAAM,uBAAsB,kBAAa,MAAM,IAAI,MAAvB,mBAA0B;AAItD,UAAI,CAAC,qBAAqB;AACxB,cAAM,IAAI;AAAA,UACR,kCAAkC,KAAK,aAAa,KAAK,MAAM,IAAI;AAAA,QACrE;AAAA,MACF;AAGA,UACE,CAAC;AAAA,QACC,KAAK,2BAA2B,MAAM,eAAe;AAAA,QACrD,oBAAoB,MAAM,eAAe;AAAA,QACzCA;AAAA,MACF,GACA;AACA,sCAAY,MAAM;AAChB,eAAK,2BAA2B,QAAQ,oBAAoB;AAAA,QAC9D,CAAC;AAAA,MACH;AAGA,UACE,CAAC;AAAA,QACC,KAAK,2BAA2B;AAAA,QAChC,oBAAoB;AAAA,QACpBA;AAAA,MACF,GACA;AACA,sCAAY,MAAM;AAChB,cAAI,KAAK,2BAA2B,YAAY,QAAW;AACzD,iBAAK,2BAA2B,WAC9B,oBAAoB;AAAA,UACxB,OAAO;AACL,iBAAK,2BAA2B,WAAW;AAAA,cACzC,UAAU,oBAAoB,SAAU;AAAA,cACxC,aAAa;AAAA,gBACX,oBAAoB,SAAU;AAAA,gBAC9B,KAAK,2BAA2B,SAAU;AAAA,cAC5C;AAAA,cACA,KAAK,oBAAoB,SAAU;AAAA,cACnC,mBACE,oBAAoB,SAAU;AAAA,YAClC;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AACD,yCAAmB,IAAI;AAAA,EACzB;AAAA,EAjHA,OAAa,KAAK,MAAkB,eAAuB;AAAA;AA1D7D;AA2DI,YAAM,EAAE,WAAW,YAAY,IAC7B,MAAM,KAAK,IAAI,WAAW,gBAAgB;AAE5C,YAAM,CAAC,mBAAmB,YAAY,IAAI,cAAc,MAAM,GAAG;AAIjE,YAAM,aAAa,YAAY,KAAK,CAAC,MAAM,EAAE,eAAe,YAAY;AACxE,YAAM,cAAc,yCAAY,uBAAuB;AAAA,QACrD,CAAC,OAAO,GAAG,iBAAiB;AAAA;AAE9B,UAAI,CAAC,cAAc,CAAC,aAAa;AAC/B,cAAM,IAAI;AAAA,UACR,cAAc,YAAY,oBAAoB,aAAa;AAAA,QAC7D;AAAA,MACF;AAEA,YAAM,oBAAoB,KAAK;AAAA,QAC7B,kBAAkB,aAAa;AAAA,MACjC;AAGA,YAAM,eAAe,MAAM,kBAAkB,aAAa;AAC1D,cAAQ,IAAI,qBAAqB,YAAY;AAC7C,YAAM,sBAAqB,kBAAa,aAAa,IAAI,MAA9B,mBACvB;AAEJ,UAAI,CAAC,oBAAoB;AACvB,cAAM,IAAI;AAAA,UACR,gDAAgD,aAAa,IAAI;AAAA,QACnE;AAAA,MACF;AAEA,cAAQ;AAAA,QACN,oDAAoD,YAAY,YAAY;AAAA;AAAA,QAC5E;AAAA,MACF;AAEA,aAAO,IAAI;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA;AAAA,EAqEA,IAAI,gBAAgB;AAClB,WAAO,KAAK,YAAY;AAAA,EAC1B;AAAA,EAEA,IAAI,eAAe;AACjB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEA,IAAI,sBAAsB;AACxB,WAAO,KAAK,YAAY;AAAA,EAC1B;AAAA,EAEA,IAAI,yBAAyB;AAC3B,UAAM,MAAM,KAAK,cAAc,MAAM,GAAG,EAAE,CAAC;AAC3C,WAAO,GAAG,KAAK,aAAa,WAAW,KAAK,GAAG,CAAC,IAAI,GAAG;AAAA,EACzD;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK,mBAAmB,MAAM,eAAe,OAAO,IAAI,CAAC,GAAG,MAAM;AACvE,aAAO;AAAA,QACL,OAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,UAAU;AACR,SAAK,kBAAkB,MAAM;AAAA,EAC/B;AACF;;;ACxMA,gBA0BO;AAGP,mBAAkB;AAwBX,IAAM,oBAAN,MAAwB;AAAA,EAC7B,YACW,QACA,MAIT;AALS;AACA;AAkFX,SAAS,SAAS,KAAK,2BAA2B,mBAAS;AAC3D,SAAS,OAAO,KAAK,2BAA2B,iBAAO;AAEvD,SAAS,eAAe,KAAK,WAAW,gCAAsB;AAE9D,SAAS,cAAc,KAAK,WAAW,wBAAc;AACrD,SAAS,mBAAmB,KAAK,WAAW,6BAAmB;AAE/D,SAAS,aAAa,KAAK,WAAW,uBAAa;AAEnD,SAAS,UAAU,KAAK,WAAW,oBAAU;AAC7C,SAAS,gBAAgB,KAAK,WAAW,0BAAgB;AAEzD,SAAS,gBAAgB,KAAK,WAAW,0BAAgB;AAEzD,SAAS,uBAAuB,KAAK,WAAW,iCAAuB;AACvE,SAAS,SAAS,KAAK,WAAW,mBAAS;AAE3C,SAAS,oBAAoB,KAAK,WAAW,8BAAoB;AAEjE,SAAS,cAAc,KAAK,WAAW,wBAAc;AACrD,SAAS,oBAAoB,KAAK,2BAA2B,wBAAc;AAE3E,SAAS,qBAAqB,KAAK,WAAW,+BAAqB;AAEnE,SAAS,eAAe,KAAK,WAAW,yBAAe;AACvD,SAAS,oBAAoB,KAAK,WAAW,8BAAoB;AACjE,SAAS,mBAAmB,KAAK,WAAW,6BAAmB;AAC/D,SAAS,uBAAuB,KAAK,WAAW,iCAAuB;AAEvE,SAAS,yBAAyB,KAAK,WAAW,mCAAyB;AAC3E,SAAS,iBAAiB,KAAK,WAAW,2BAAiB;AAC3D,SAAS,wBAAwB,KAAK,WAAW,kCAAwB;AACzE,SAAS,gBAAgB,KAAK,WAAW,0BAAgB;AAEzD,SAAS,cAAc,KAAK,WAAW,wBAAc;AACrD,SAAS,2BAA2B,KAAK;AAAA,MACvC;AAAA,IACF;AACA,SAAS,uBAAuB,KAAK,WAAW,iCAAuB;AAAA,EArHpE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOK,WACN,gBAKA;AA1EJ;AA2EI,UAAM,YAAY,IAAI;AAAA,MACpB,iCACK,KAAK,OADV;AAAA,QAEE,YAAY,CAAC,SAAiB;AAC5B,iBAAO,SAAS;AAAA,QAClB;AAAA,MACF;AAAA,OACA,UAAK,KAAK,aAAV,YAAsB;AAAA,OACtB,UAAK,KAAK,kBAAV,YAA2B,aAAAC,QAAM,OAAO;AAAA,IAC1C;AAIA,eAAW,OAAO,QAAQ,QAAQ,QAAQ,eAAe,SAAS,CAAE,GAAG;AACrE,UAAI,QAAQ,iBAAiB,OAAO,UAAU,GAAG,MAAM,YAAY;AACjE,cAAM,mBAAmB,UAAU,GAAG;AACtC,kBAAU,GAAG,IAAI,IAAI,SAAgB;AACnC,iBAAO,iBACJ,MAAM,WAAW,CAAC,KAAK,QAAQ,GAAG,IAAI,CAAC,EACvC,KAAK,CAAC,QAAa,IAAI,IAAI;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,2BACN,gBAKA;AA/GJ;AAgHI,UAAM,YAAY,IAAI;AAAA,MACpB,iCACK,KAAK,OADV;AAAA,QAEE,YAAY,CAAC,SAAiB;AAC5B,iBAAO,SAAS;AAAA,QAClB;AAAA,MACF;AAAA,OACA,UAAK,KAAK,aAAV,YAAsB;AAAA,OACtB,UAAK,KAAK,kBAAV,YAA2B,aAAAA,QAAM,OAAO;AAAA,IAC1C;AAIA,eAAW,OAAO,QAAQ,QAAQ,QAAQ,eAAe,SAAS,CAAE,GAAG;AACrE,UAAI,QAAQ,iBAAiB,OAAO,UAAU,GAAG,MAAM,YAAY;AACjE,cAAM,mBAAmB,UAAU,GAAG;AACtC,kBAAU,GAAG,IAAI,IAAI,SAAgB;AACnC,iBAAO,iBACJ,MAAM,WAAW,IAAI,EACrB,KAAK,CAAC,QAAa,IAAI,IAAI;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AA0CF;;;ACjLA,IAAAC,gBAAoC;AACpC,sBAAoB;;;ACHpB,IAAM,gBAAgB;AAGtB,IAAM,iBAAiB;AAAA,EACrB,KAAK;AAAA,IACH,QAAQ,2BAA2B,aAAa;AAAA,IAChD,UAAU;AAAA,EACZ;AAAA,EACA,KAAK;AAAA,IACH,QAAQ,2BAA2B,aAAa;AAAA,IAChD,UAAU;AAAA,EACZ;AAAA,EACA,MAAM;AAAA,IACJ,QAAQ,uBAAuB,aAAa;AAAA,IAC5C,UAAU;AAAA,EACZ;AACF;AAGA,IAAM,iBAAiB,CAAC,gBAAwB;AAC9C,MAAI,YAAY,SAAS,OAAO,aAAa,EAAE,EAAG,QAAO,eAAe;AACxE,MAAI,YAAY,SAAS,OAAO,aAAa,EAAE,EAAG,QAAO,eAAe;AACxE,MAAI,YAAY,SAAS,aAAa,EAAG,QAAO,eAAe;AAC/D,QAAM,IAAI;AAAA,IACR;AAAA,EACF;AACF;AAOO,IAAM,iBAAiB,CAC5B,gBAC2B;AAnC7B;AAoCE,MAAI,OAAO,WAAW,aAAa;AACjC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc,eAAe,WAAW;AAE9C,MAAI,IAAI,IAAI,WAAW,EAAE,WAAW,OAAO,SAAS,QAAQ;AAI1D,WAAO,SAAS,OAAO;AACvB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAKA,QAAM,EAAE,YAAY,IAAI,MAAM,OAAO,qBAAqB;AAE1D,QAAM,cAAc,IAAI,YAAY;AAAA,IAClC,QAAQ,YAAY;AAAA,IACpB,WAAU,iBAAY,aAAZ,YAAwB;AAAA,IAClC,kBAAkB;AAAA,IAClB,qBAAqB;AAAA,MACnB,UAAU;AAAA,MACV,cAAc,OAAO,SAAS;AAAA,IAChC;AAAA,EACF,CAAC;AAGD,MACE,OAAO,SAAS,OAAO,SAAS,OAAO,KACvC,OAAO,SAAS,OAAO,SAAS,QAAQ,GACxC;AACA,UAAM,EAAE,SAAS,IAAI,MAAM,YAAY,uBAAuB;AAE9D,WAAO,QAAQ;AAAA,MACb,CAAC;AAAA,MACD,SAAS;AAAA,OACT,qCAAU,aAAY,OAAO,SAAS;AAAA,IACxC;AAAA,EACF,OAAO;AAEL,UAAM,YAAY,kBAAkB;AAAA,EACtC;AAGA,QAAM,cAAc,MAAM,YAAY,iBAAiB;AACvD,SAAO;AACT;;;ACzFA,oCAAuD;AAIhD,IAAM,4BAAN,cAAwC,8BAAAC,QAAsB;AAAA,EAKnE,YACE,WACS,OAGL,CAAC,GACL;AACA,YAAQ,IAAI,wBAAwB,SAAS;AAE7C,UAAM,MAAM,KAAK,aAAa,WAAW,QAAW;AAAA,MAClD,aAAa;AAAA,IACf,CAAC;AATQ;AAJX,oBAAW;AAgBT,WAAO,eAAe,MAAM,OAAO;AAAA,MACjC,MAAM;AACJ,eAAO,KAAK;AAAA,MACd;AAAA,IACF,CAAC;AAED,SAAK,YAAY;AAEjB,SAAK,iBAAiB,QAAQ,MAAM;AAClC,cAAQ,IAAI,gBAAgB,KAAK,GAAG,SAAS;AAAA,IAC/C,CAAC;AAED,SAAK,iBAAiB,WAAW,CAAC,OAAO;AACvC,UAAI,CAAC,KAAK,sBAAsB;AAC9B,aAAK,uBAAuB;AAAA,MAC9B;AAAA,IACF,CAAC;AAED,SAAK,iBAAiB,SAAS,MAAM;AACnC,cAAQ,IAAI,gBAAgB,KAAK,GAAG,SAAS;AAAA,IAC/C,CAAC;AAED,UAAM,gBAAgB,KAAK;AAC3B,SAAK,YAAY,MAAM;AACrB,UAAI,KAAK,KAAK,MAAM;AAClB,aAAK,KAAK,KAAK,0BAA0B,IAAI;AAAA,MAC/C,OAAO;AACL,sBAAc,MAAM,IAAI;AAAA,MAC1B;AAAA,IACF;AAEA,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,UAAU,WAAmB;AAC3B,SAAK,uBAAuB;AAC5B,SAAK,YAAY;AACjB,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,SAAS,MAAe;AACtB,QAAI,KAAK,KAAK,MAAM;AAClB,WAAK,KAAK,KAAK,uBAAuB,MAAM,KAAK,UAAU,IAAI,CAAC;AAAA,IAClE,OAAO;AACL,WAAK,KAAK,KAAK,UAAU,IAAI,CAAC;AAAA,IAChC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU;AACR,SAAK,MAAM;AACX,SAAK,WAAW;AAChB,QAAI,KAAK,KAAK,WAAW;AACvB,WAAK,KAAK,UAAU;AAAA,IACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKM,SAAS;AAAA;AACb,aAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAC5C,YAAI,KAAK,eAAe,UAAU,MAAM;AACtC,kBAAQ;AAAA,QACV,OAAO;AACL,eAAK,iBAAiB,QAAQ,MAAM,QAAQ,CAAC;AAC7C,eAAK,iBAAiB,SAAS,MAAM;AAAA,QACvC;AAAA,MACF,CAAC;AAAA,IACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAKM,SAAS;AAAA;AACb,aAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAC5C,YAAI,KAAK,eAAe,UAAU,QAAQ;AACxC,kBAAQ;AAAA,QACV,OAAO;AACL,eAAK,iBAAiB,SAAS,MAAM,QAAQ,CAAC;AAC9C,eAAK,iBAAiB,SAAS,MAAM;AAAA,QACvC;AAAA,MACF,CAAC;AAAA,IACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOM,eAAe;AAAA;AACnB,UAAI,KAAK,sBAAsB;AAC7B,eAAO,KAAK;AAAA,MACd;AAEA,aAAO,IAAI,QAAsB,CAAC,SAAS,WAAW;AACpD,cAAM,YAAY,CAAC,OAAqB;AACtC,eAAK,uBAAuB;AAC5B,eAAK,oBAAoB,WAAW,SAAS;AAC7C,eAAK,oBAAoB,SAAS,OAAO;AACzC,kBAAQ,EAAE;AAAA,QACZ;AAEA,cAAM,UAAU,CAAC,OAAmB;AAClC,eAAK,oBAAoB,WAAW,SAAS;AAC7C,eAAK,oBAAoB,SAAS,OAAO;AACzC,iBAAO,EAAE;AAAA,QACX;AAEA,aAAK,iBAAiB,WAAW,SAAS;AAC1C,aAAK,iBAAiB,SAAS,OAAO;AAAA,MACxC,CAAC;AAAA,IACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMM,cAAc;AAAA;AAClB,aAAO,IAAI,QAAsB,CAAC,SAAS,WAAW;AACpD,cAAM,YAAY,CAAC,OAAqB;AACtC,eAAK,oBAAoB,WAAW,SAAS;AAC7C,eAAK,oBAAoB,SAAS,OAAO;AACzC,kBAAQ,EAAE;AAAA,QACZ;AAEA,cAAM,UAAU,CAAC,OAAmB;AAClC,eAAK,oBAAoB,WAAW,SAAS;AAC7C,eAAK,oBAAoB,SAAS,OAAO;AACzC,iBAAO,EAAE;AAAA,QACX;AAEA,aAAK,iBAAiB,WAAW,SAAS;AAC1C,aAAK,iBAAiB,SAAS,OAAO;AAAA,MACxC,CAAC;AAAA,IACH;AAAA;AACF;;;AC9JA,IAAM,mBAAN,MAAuB;AAAA,EAAvB;AACE,qBAAY,OAAO,WAAW,eAAe,CAAC,CAAC,OAAO;AAAA;AAAA,EAEtD,QAAW,KAAgC;AACzC,QAAI,CAAC,KAAK,UAAW,QAAO;AAE5B,UAAM,SAAS,OAAO,aAAa,QAAQ,GAAG;AAC9C,QAAI,WAAW,KAAM,QAAO;AAE5B,QAAI;AACF,aAAO,KAAK,MAAM,MAAM;AAAA,IAC1B,SAAS,KAAK;AACZ,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,QAAQ,KAAa,KAAU;AAC7B,QAAI,CAAC,KAAK,UAAW,QAAO;AAE5B,WAAO,aAAa,QAAQ,KAAK,KAAK,UAAU,GAAG,CAAC;AAAA,EACtD;AAAA,EAEA,OAAO,KAAa;AAClB,QAAI,CAAC,KAAK,UAAW,QAAO;AAE5B,WAAO,aAAa,WAAW,GAAG;AAAA,EACpC;AAAA,EAEA,UAAU,KAAa,OAAe;AACpC,QAAI,CAAC,KAAK,UAAW,QAAO;AAE5B,WAAO,aAAa,QAAQ,KAAK,KAAK;AAAA,EACxC;AAAA,EAEA,UAAU,KAA4B;AACpC,QAAI,CAAC,KAAK,UAAW,QAAO;AAE5B,WAAO,OAAO,aAAa,QAAQ,GAAG;AAAA,EACxC;AACF;AAEO,IAAM,mBAAmB,IAAI,iBAAiB;;;ACrCrD,IAAAC,gBAA2B;AAC3B,mBAA8B;AAOvB,IAAM,mBAAN,MAAuB;AAAA,EAAvB;AACL,SAAS,cAA2C,CAAC;AAAA;AAAA,EAE/C,iBACJ,QACwB;AAAA;AArB5B;AAsBI,YAAM,cAAc;AAAA,QAClB;AAAA,UACE,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,SAAS;AACP,mBAAO;AAAA,cACL,WAAW;AAAA,gBACT;AAAA,kBACE,YAAY;AAAA,kBACZ,YAAY;AAAA,kBACZ,MAAM;AAAA,kBACN,sCAAsC;AAAA,kBACtC,wBAAwB;AAAA,oBACtB;AAAA,sBACE,cAAc;AAAA,sBACd,sBAAsB;AAAA,sBACtB,QAAQ;AAAA,sBACR,uBAAuB;AAAA,oBACzB;AAAA,kBACF;AAAA,kBACA,WAAW;AAAA,kBACX,eAAe;AAAA,gBACjB;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,SAAS;AACP,mBAAO;AAAA,cACL,eAAe;AAAA,gBACb,MAAM;AAAA,gBACN,cAAc;AAAA,gBACd,UAAU;AAAA,gBACV,MAAM;AAAA,cACR;AAAA,cACA,MAAM;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,SAAS;AACP,mBAAO;AAAA,cACL,eAAe;AAAA,gBACb;AAAA,kBACE,OAAO;AAAA,kBACP,OAAO;AAAA,kBACP,GAAG;AAAA,kBACH,GAAG;AAAA,kBACH,4BAA4B;AAAA,gBAC9B;AAAA,gBACA;AAAA,kBACE,OAAO;AAAA,kBACP,OAAO;AAAA,kBACP,GAAG;AAAA,kBACH,GAAG;AAAA,kBACH,4BAA4B;AAAA,gBAC9B;AAAA,gBACA;AAAA,kBACE,OAAO;AAAA,kBACP,OAAO;AAAA,kBACP,GAAG;AAAA,kBACH,GAAG;AAAA,kBACH,4BAA4B;AAAA,gBAC9B;AAAA,gBACA;AAAA,kBACE,OAAO;AAAA,kBACP,OAAO;AAAA,kBACP,GAAG;AAAA,kBACH,GAAG;AAAA,kBACH,4BAA4B;AAAA,gBAC9B;AAAA,gBACA;AAAA,kBACE,OAAO;AAAA,kBACP,OAAO;AAAA,kBACP,GAAG;AAAA,kBACH,GAAG;AAAA,kBACH,4BAA4B;AAAA,gBAC9B;AAAA,gBACA;AAAA,kBACE,OAAO;AAAA,kBACP,OAAO;AAAA,kBACP,GAAG;AAAA,kBACH,GAAG;AAAA,kBACH,4BAA4B;AAAA,gBAC9B;AAAA,cACF;AAAA,cACA,yBAAyB;AAAA,gBACvB;AAAA,kBACE,OAAO;AAAA,kBACP,aAAa;AAAA,kBACb,aAAa;AAAA,kBACb,WAAW;AAAA,gBACb;AAAA,gBACA;AAAA,kBACE,OAAO;AAAA,kBACP,aAAa;AAAA,kBACb,aAAa;AAAA,kBACb,WAAW;AAAA,gBACb;AAAA,gBACA;AAAA,kBACE,OAAO;AAAA,kBACP,aAAa;AAAA,kBACb,aAAa;AAAA,kBACb,WAAW;AAAA,gBACb;AAAA,gBACA;AAAA,kBACE,OAAO;AAAA,kBACP,aAAa;AAAA,kBACb,aAAa;AAAA,kBACb,WAAW;AAAA,gBACb;AAAA,gBACA;AAAA,kBACE,OAAO;AAAA,kBACP,aAAa;AAAA,kBACb,aAAa;AAAA,kBACb,WAAW;AAAA,gBACb;AAAA,gBACA;AAAA,kBACE,OAAO;AAAA,kBACP,aAAa;AAAA,kBACb,aAAa;AAAA,kBACb,WAAW;AAAA,gBACb;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,SAAS;AACP,mBAAO;AAAA,cACL,iBAAiB;AAAA,gBACf;AAAA,kBACE,cAAc;AAAA,kBACd,UAAU;AAAA,oBACR,uBAAuB;AAAA,sBACrB;AAAA,wBACE,OAAO;AAAA,wBACP,aAAa;AAAA,wBACb,aAAa;AAAA,wBACb,WAAW;AAAA,sBACb;AAAA,sBACA;AAAA,wBACE,OAAO;AAAA,wBACP,aAAa;AAAA,wBACb,aAAa;AAAA,wBACb,WAAW;AAAA,sBACb;AAAA,sBACA;AAAA,wBACE,OAAO;AAAA,wBACP,aAAa;AAAA,wBACb,aAAa;AAAA,wBACb,WAAW;AAAA,sBACb;AAAA,sBACA;AAAA,wBACE,OAAO;AAAA,wBACP,aAAa;AAAA,wBACb,aAAa;AAAA,wBACb,WAAW;AAAA,sBACb;AAAA,sBACA;AAAA,wBACE,OAAO;AAAA,wBACP,aAAa;AAAA,wBACb,aAAa;AAAA,wBACb,WAAW;AAAA,sBACb;AAAA,sBACA;AAAA,wBACE,OAAO;AAAA,wBACP,aAAa;AAAA,wBACb,aAAa;AAAA,wBACb,WAAW;AAAA,sBACb;AAAA,oBACF;AAAA,oBACA,uBAAuB;AAAA,sBACrB;AAAA,wBACE,OAAO;AAAA,wBACP,OAAO;AAAA,sBACT;AAAA,sBACA;AAAA,wBACE,OAAO;AAAA,wBACP,OAAO;AAAA,sBACT;AAAA,sBACA;AAAA,wBACE,OAAO;AAAA,wBACP,OAAO;AAAA,sBACT;AAAA,sBACA;AAAA,wBACE,OAAO;AAAA,wBACP,OAAO;AAAA,sBACT;AAAA,sBACA;AAAA,wBACE,OAAO;AAAA,wBACP,OAAO;AAAA,sBACT;AAAA,sBACA;AAAA,wBACE,OAAO;AAAA,wBACP,OAAO;AAAA,sBACT;AAAA,oBACF;AAAA,oBACA,2BAA2B,CAAC;AAAA,oBAC5B,qBAAqB,CAAC;AAAA,oBACtB,oBAAoB;AAAA,kBACtB;AAAA,gBACF;AAAA,cACF;AAAA,cACA,cAAc;AAAA,gBACZ;AAAA,kBACE,IAAI;AAAA,kBACJ,UAAU;AAAA,kBACV,UAAU;AAAA,oBACR,UAAU;AAAA,sBACR,kBAAkB;AAAA,wBAChB;AAAA,0BACE,aAAa;AAAA,4BACX,UAAU;AAAA,8BACR;AAAA,gCACE,GAAG;AAAA,gCACH,GAAG;AAAA,gCACH,GAAG;AAAA,8BACL;AAAA,8BACA;AAAA,gCACE,GAAG;AAAA,gCACH,GAAG;AAAA,gCACH,GAAG;AAAA,8BACL;AAAA,8BACA;AAAA,gCACE,GAAG;AAAA,gCACH,GAAG;AAAA,gCACH,GAAG;AAAA,8BACL;AAAA,8BACA;AAAA,gCACE,GAAG;AAAA,gCACH,GAAG;AAAA,gCACH,GAAG;AAAA,8BACL;AAAA,4BACF;AAAA,0BACF;AAAA,0BACA,WAAW;AAAA,4BACT,UAAU;AAAA,8BACR,GAAG;AAAA,8BACH,GAAG;AAAA,8BACH,GAAG;AAAA,4BACL;AAAA,4BACA,aAAa;AAAA,8BACX,GAAG;AAAA,8BACH,GAAG;AAAA,8BACH,GAAG;AAAA,8BACH,GAAG;AAAA,4BACL;AAAA,0BACF;AAAA,0BACA,IAAI;AAAA,wBACN;AAAA,wBACA;AAAA,0BACE,aAAa;AAAA,4BACX,UAAU;AAAA,8BACR;AAAA,gCACE,GAAG;AAAA,gCACH,GAAG;AAAA,gCACH,GAAG;AAAA,8BACL;AAAA,8BACA;AAAA,gCACE,GAAG;AAAA,gCACH,GAAG;AAAA,gCACH,GAAG;AAAA,8BACL;AAAA,8BACA;AAAA,gCACE,GAAG;AAAA,gCACH,GAAG;AAAA,gCACH,GAAG;AAAA,8BACL;AAAA,8BACA;AAAA,gCACE,GAAG;AAAA,gCACH,GAAG;AAAA,gCACH,GAAG;AAAA,8BACL;AAAA,4BACF;AAAA,0BACF;AAAA,0BACA,WAAW;AAAA,4BACT,UAAU;AAAA,8BACR,GAAG;AAAA,8BACH,GAAG;AAAA,8BACH,GAAG;AAAA,4BACL;AAAA,4BACA,aAAa;AAAA,8BACX,GAAG;AAAA,8BACH,GAAG;AAAA,8BACH,GAAG;AAAA,8BACH,GAAG;AAAA,4BACL;AAAA,0BACF;AAAA,0BACA,IAAI;AAAA,wBACN;AAAA,wBACA;AAAA,0BACE,aAAa;AAAA,4BACX,UAAU;AAAA,8BACR;AAAA,gCACE,GAAG;AAAA,gCACH,GAAG;AAAA,gCACH,GAAG;AAAA,8BACL;AAAA,8BACA;AAAA,gCACE,GAAG;AAAA,gCACH,GAAG;AAAA,gCACH,GAAG;AAAA,8BACL;AAAA,8BACA;AAAA,gCACE,GAAG;AAAA,gCACH,GAAG;AAAA,gCACH,GAAG;AAAA,8BACL;AAAA,8BACA;AAAA,gCACE,GAAG;AAAA,gCACH,GAAG;AAAA,gCACH,GAAG;AAAA,8BACL;AAAA,4BACF;AAAA,0BACF;AAAA,0BACA,WAAW;AAAA,4BACT,UAAU;AAAA,8BACR,GAAG;AAAA,8BACH,GAAG;AAAA,8BACH,GAAG;AAAA,4BACL;AAAA,4BACA,aAAa;AAAA,8BACX,GAAG;AAAA,8BACH,GAAG;AAAA,8BACH,GAAG;AAAA,8BACH,GAAG;AAAA,4BACL;AAAA,0BACF;AAAA,0BACA,IAAI;AAAA,wBACN;AAAA,wBACA;AAAA,0BACE,aAAa;AAAA,4BACX,UAAU;AAAA,8BACR;AAAA,gCACE,GAAG;AAAA,gCACH,GAAG;AAAA,gCACH,GAAG;AAAA,8BACL;AAAA,8BACA;AAAA,gCACE,GAAG;AAAA,gCACH,GAAG;AAAA,gCACH,GAAG;AAAA,8BACL;AAAA,8BACA;AAAA,gCACE,GAAG;AAAA,gCACH,GAAG;AAAA,gCACH,GAAG;AAAA,8BACL;AAAA,8BACA;AAAA,gCACE,GAAG;AAAA,gCACH,GAAG;AAAA,gCACH,GAAG;AAAA,8BACL;AAAA,4BACF;AAAA,0BACF;AAAA,0BACA,WAAW;AAAA,4BACT,UAAU;AAAA,8BACR,GAAG;AAAA,8BACH,GAAG;AAAA,8BACH,GAAG;AAAA,4BACL;AAAA,4BACA,aAAa;AAAA,8BACX,GAAG;AAAA,8BACH,GAAG;AAAA,8BACH,GAAG;AAAA,8BACH,GAAG;AAAA,4BACL;AAAA,0BACF;AAAA,0BACA,IAAI;AAAA,wBACN;AAAA,wBACA;AAAA,0BACE,aAAa;AAAA,4BACX,UAAU;AAAA,8BACR;AAAA,gCACE,GAAG;AAAA,gCACH,GAAG;AAAA,gCACH,GAAG;AAAA,8BACL;AAAA,8BACA;AAAA,gCACE,GAAG;AAAA,gCACH,GAAG;AAAA,gCACH,GAAG;AAAA,8BACL;AAAA,8BACA;AAAA,gCACE,GAAG;AAAA,gCACH,GAAG;AAAA,gCACH,GAAG;AAAA,8BACL;AAAA,8BACA;AAAA,gCACE,GAAG;AAAA,gCACH,GAAG;AAAA,gCACH,GAAG;AAAA,8BACL;AAAA,4BACF;AAAA,0BACF;AAAA,0BACA,WAAW;AAAA,4BACT,UAAU;AAAA,8BACR,GAAG;AAAA,8BACH,GAAG;AAAA,8BACH,GAAG;AAAA,4BACL;AAAA,4BACA,aAAa;AAAA,8BACX,GAAG;AAAA,8BACH,GAAG;AAAA,8BACH,GAAG;AAAA,8BACH,GAAG;AAAA,4BACL;AAAA,0BACF;AAAA,0BACA,IAAI;AAAA,wBACN;AAAA,wBACA;AAAA,0BACE,aAAa;AAAA,4BACX,UAAU;AAAA,8BACR;AAAA,gCACE,GAAG;AAAA,gCACH,GAAG;AAAA,gCACH,GAAG;AAAA,8BACL;AAAA,8BACA;AAAA,gCACE,GAAG;AAAA,gCACH,GAAG;AAAA,gCACH,GAAG;AAAA,8BACL;AAAA,8BACA;AAAA,gCACE,GAAG;AAAA,gCACH,GAAG;AAAA,gCACH,GAAG;AAAA,8BACL;AAAA,8BACA;AAAA,gCACE,GAAG;AAAA,gCACH,GAAG;AAAA,gCACH,GAAG;AAAA,8BACL;AAAA,4BACF;AAAA,0BACF;AAAA,0BACA,WAAW;AAAA,4BACT,UAAU;AAAA,8BACR,GAAG;AAAA,8BACH,GAAG;AAAA,8BACH,GAAG;AAAA,4BACL;AAAA,4BACA,aAAa;AAAA,8BACX,GAAG;AAAA,8BACH,GAAG;AAAA,8BACH,GAAG;AAAA,8BACH,GAAG;AAAA,4BACL;AAAA,0BACF;AAAA,0BACA,IAAI;AAAA,wBACN;AAAA,sBACF;AAAA,oBACF;AAAA,oBACA,WAAW;AAAA,sBACT,UAAU;AAAA,wBACR,GAAG;AAAA,wBACH,GAAG;AAAA,wBACH,GAAG;AAAA,sBACL;AAAA,sBACA,aAAa;AAAA,wBACX,GAAG;AAAA,wBACH,GAAG;AAAA,wBACH,GAAG;AAAA,wBACH,GAAG;AAAA,sBACL;AAAA,oBACF;AAAA,oBACA,IAAI;AAAA,kBACN;AAAA,kBACA,kBAAkB;AAAA,gBACpB;AAAA,gBACA;AAAA,kBACE,IAAI;AAAA,kBACJ,UAAU;AAAA,kBACV,UAAU;AAAA,oBACR,aAAa;AAAA,sBACX,UAAU;AAAA,wBACR;AAAA,0BACE,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA;AAAA,0BACE,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA;AAAA,0BACE,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA;AAAA,0BACE,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA;AAAA,0BACE,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA;AAAA,0BACE,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA;AAAA,0BACE,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA;AAAA,0BACE,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,sBACF;AAAA,oBACF;AAAA,oBACA,WAAW;AAAA,sBACT,UAAU;AAAA,wBACR,GAAG;AAAA,wBACH,GAAG;AAAA,wBACH,GAAG;AAAA,sBACL;AAAA,sBACA,aAAa;AAAA,wBACX,GAAG;AAAA,wBACH,GAAG;AAAA,wBACH,GAAG;AAAA,wBACH,GAAG;AAAA,sBACL;AAAA,oBACF;AAAA,oBACA,IAAI;AAAA,kBACN;AAAA,kBACA,kBAAkB;AAAA,gBACpB;AAAA,gBACA;AAAA,kBACE,IAAI;AAAA,kBACJ,UAAU;AAAA,kBACV,UAAU;AAAA,oBACR,aAAa;AAAA,sBACX,UAAU;AAAA,wBACR;AAAA,0BACE,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA;AAAA,0BACE,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA;AAAA,0BACE,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA;AAAA,0BACE,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA;AAAA,0BACE,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA;AAAA,0BACE,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA;AAAA,0BACE,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA;AAAA,0BACE,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,sBACF;AAAA,oBACF;AAAA,oBACA,WAAW;AAAA,sBACT,UAAU;AAAA,wBACR,GAAG;AAAA,wBACH,GAAG;AAAA,wBACH,GAAG;AAAA,sBACL;AAAA,sBACA,aAAa;AAAA,wBACX,GAAG;AAAA,wBACH,GAAG;AAAA,wBACH,GAAG;AAAA,wBACH,GAAG;AAAA,sBACL;AAAA,oBACF;AAAA,oBACA,IAAI;AAAA,kBACN;AAAA,kBACA,kBAAkB;AAAA,gBACpB;AAAA,gBACA;AAAA,kBACE,IAAI;AAAA,kBACJ,UAAU;AAAA,kBACV,UAAU;AAAA,oBACR,aAAa;AAAA,sBACX,UAAU;AAAA,wBACR;AAAA,0BACE,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA;AAAA,0BACE,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA;AAAA,0BACE,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA;AAAA,0BACE,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA;AAAA,0BACE,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA;AAAA,0BACE,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA;AAAA,0BACE,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA;AAAA,0BACE,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,sBACF;AAAA,oBACF;AAAA,oBACA,WAAW;AAAA,sBACT,UAAU;AAAA,wBACR,GAAG;AAAA,wBACH,GAAG;AAAA,wBACH,GAAG;AAAA,sBACL;AAAA,sBACA,aAAa;AAAA,wBACX,GAAG;AAAA,wBACH,GAAG;AAAA,wBACH,GAAG;AAAA,wBACH,GAAG;AAAA,sBACL;AAAA,oBACF;AAAA,oBACA,IAAI;AAAA,kBACN;AAAA,kBACA,kBAAkB;AAAA,gBACpB;AAAA,gBACA;AAAA,kBACE,IAAI;AAAA,kBACJ,UAAU;AAAA,kBACV,UAAU;AAAA,oBACR,aAAa;AAAA,sBACX,UAAU;AAAA,wBACR;AAAA,0BACE,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA;AAAA,0BACE,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA;AAAA,0BACE,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA;AAAA,0BACE,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA;AAAA,0BACE,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA;AAAA,0BACE,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA;AAAA,0BACE,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA;AAAA,0BACE,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,sBACF;AAAA,oBACF;AAAA,oBACA,WAAW;AAAA,sBACT,UAAU;AAAA,wBACR,GAAG;AAAA,wBACH,GAAG;AAAA,wBACH,GAAG;AAAA,sBACL;AAAA,sBACA,aAAa;AAAA,wBACX,GAAG;AAAA,wBACH,GAAG;AAAA,wBACH,GAAG;AAAA,wBACH,GAAG;AAAA,sBACL;AAAA,oBACF;AAAA,oBACA,IAAI;AAAA,kBACN;AAAA,kBACA,kBAAkB;AAAA,gBACpB;AAAA,cACF;AAAA,cACA,wBAAwB;AAAA,gBACtB;AAAA,kBACE,YAAY;AAAA,kBACZ,UAAU;AAAA,oBACR,QAAQ;AAAA,sBACN,QAAQ;AAAA,oBACV;AAAA,oBACA,WAAW;AAAA,sBACT,UAAU;AAAA,wBACR,GAAG;AAAA,wBACH,GAAG;AAAA,wBACH,GAAG;AAAA,sBACL;AAAA,sBACA,aAAa;AAAA,wBACX,GAAG;AAAA,wBACH,GAAG;AAAA,wBACH,GAAG;AAAA,wBACH,GAAG;AAAA,sBACL;AAAA,oBACF;AAAA,oBACA,IAAI;AAAA,kBACN;AAAA,gBACF;AAAA,gBACA;AAAA,kBACE,YAAY;AAAA,kBACZ,UAAU;AAAA,oBACR,SAAS;AAAA,sBACP,QAAQ;AAAA,sBACR,iBAAiB;AAAA,oBACnB;AAAA,oBACA,WAAW;AAAA,sBACT,UAAU;AAAA,wBACR,GAAG;AAAA,wBACH,GAAG;AAAA,wBACH,GAAG;AAAA,sBACL;AAAA,sBACA,aAAa;AAAA,wBACX,GAAG;AAAA,wBACH,GAAG;AAAA,wBACH,GAAG;AAAA,wBACH,GAAG;AAAA,sBACL;AAAA,oBACF;AAAA,oBACA,IAAI;AAAA,kBACN;AAAA,gBACF;AAAA,gBACA;AAAA,kBACE,YAAY;AAAA,kBACZ,UAAU;AAAA,oBACR,QAAQ;AAAA,sBACN,QAAQ;AAAA,oBACV;AAAA,oBACA,WAAW;AAAA,sBACT,UAAU;AAAA,wBACR,GAAG;AAAA,wBACH,GAAG;AAAA,wBACH,GAAG;AAAA,sBACL;AAAA,sBACA,aAAa;AAAA,wBACX,GAAG;AAAA,wBACH,GAAG;AAAA,wBACH,GAAG;AAAA,wBACH,GAAG;AAAA,sBACL;AAAA,oBACF;AAAA,oBACA,IAAI;AAAA,kBACN;AAAA,gBACF;AAAA,gBACA;AAAA,kBACE,YAAY;AAAA,kBACZ,UAAU;AAAA,oBACR,SAAS;AAAA,sBACP,QAAQ;AAAA,sBACR,iBAAiB;AAAA,oBACnB;AAAA,oBACA,WAAW;AAAA,sBACT,UAAU;AAAA,wBACR,GAAG;AAAA,wBACH,GAAG;AAAA,wBACH,GAAG;AAAA,sBACL;AAAA,sBACA,aAAa;AAAA,wBACX,GAAG;AAAA,wBACH,GAAG;AAAA,wBACH,GAAG;AAAA,wBACH,GAAG;AAAA,sBACL;AAAA,oBACF;AAAA,oBACA,IAAI;AAAA,kBACN;AAAA,gBACF;AAAA,gBACA;AAAA,kBACE,YAAY;AAAA,kBACZ,UAAU;AAAA,oBACR,QAAQ;AAAA,sBACN,QAAQ;AAAA,oBACV;AAAA,oBACA,WAAW;AAAA,sBACT,UAAU;AAAA,wBACR,GAAG;AAAA,wBACH,GAAG;AAAA,wBACH,GAAG;AAAA,sBACL;AAAA,sBACA,aAAa;AAAA,wBACX,GAAG;AAAA,wBACH,GAAG;AAAA,wBACH,GAAG;AAAA,wBACH,GAAG;AAAA,sBACL;AAAA,oBACF;AAAA,oBACA,IAAI;AAAA,kBACN;AAAA,gBACF;AAAA,cACF;AAAA,cACA,iBAAiB,CAAC;AAAA,YACpB;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,SAAS;AACP,mBAAO;AAAA,cACL,mBAAmB;AAAA,gBACjB;AAAA,kBACE,mBAAmB;AAAA,kBACnB,MAAM;AAAA,kBACN,eAAe;AAAA,kBACf,UAAU;AAAA,oBACR,GAAG;AAAA,oBACH,GAAG;AAAA,oBACH,GAAG;AAAA,kBACL;AAAA,kBACA,UAAU;AAAA,oBACR,QAAQ,CAAC,GAAG,GAAG,CAAC;AAAA,oBAChB,MAAM;AAAA,kBACR;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA;AAAA,UACE,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,SAAS;AACP,mBAAO;AAAA,cACL,MAAM;AAAA,gBACJ;AAAA,kBACE,IAAI;AAAA,kBACJ,eAAe;AAAA,kBACf,UAAU;AAAA,oBACR,GAAG;AAAA,oBACH,GAAG;AAAA,oBACH,GAAG;AAAA,kBACL;AAAA,kBACA,UAAU;AAAA,oBACR,QAAQ,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,oBACnB,MAAM;AAAA,kBACR;AAAA,gBACF;AAAA,gBACA;AAAA,kBACE,IAAI;AAAA,kBACJ,eAAe;AAAA,kBACf,UAAU;AAAA,oBACR,GAAG;AAAA,oBACH,GAAG;AAAA,oBACH,GAAG;AAAA,kBACL;AAAA,kBACA,UAAU;AAAA,oBACR,QAAQ;AAAA,sBACN;AAAA,sBAAsB;AAAA,sBACtB;AAAA,sBAAqB;AAAA,oBACvB;AAAA,oBACA,MAAM;AAAA,kBACR;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,WAAS,YAAO,WAAP,mBAAe,kBAAiB;AAC/C,YAAM,OAAO,aAAW,kBAAO,QAAP,mBAAY,MAAM,UAAU,OAA5B,mBAAgC,MAAM,KAAK;AAEnE,iBAAW,WAAW,aAAa;AACjC,cAAMC,SAAqB,mBAAM,QAAQ,IAAI,EAAE,QAAQ,EAAE;AACzD,YAAI,WAAW,QAAQ,UAAUA,QAAO;AACtC,gBAAM,OAAO,QAAQ,OAAO;AAC5B,iBAAO;AAAA,YACL,QAAQ;AAAA,YACR,YAAY;AAAA,YACZ,MAAM,KAAK,UAAU,IAAI;AAAA,YACzB,SAAS,CAAC;AAAA,YACV;AAAA,YACA,SAAS;AAAA,cACP,aAAa,OAAO;AAAA,YACtB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,IAAI;AAAA,QACR,yCAAyC,MAAM,IAAI,IAAI;AAAA,QACvD;AAAA,QACA;AAAA,MACF;AAAA,IAYF;AAAA;AAAA,EAEA,0BAA0B,QAAmC;AAC3D,SAAK,YAAY,KAAK,MAAM;AAE5B,eAAW,MAAM;AACf,aAAO,cAAc,IAAI,MAAM,MAAM,CAAC;AAEtC,cAAQ,IAAI,oCAAoC,OAAO,GAAG;AAE1D,UAAI,OAAO,IAAI,SAAS,eAAe,GAAG;AACxC,eAAO;AAAA,UACL,IAAI,aAAa,WAAW;AAAA,YAC1B,MAAM,KAAK,UAAU,kBAAkB;AAAA,UACzC,CAAC;AAAA,QACH;AAAA,MACF;AAEA,UAAI,OAAO,IAAI,SAAS,aAAa,GAAG;AACtC,eAAO;AAAA,UACL,IAAI,aAAa,WAAW;AAAA,YAC1B,MAAM,KAAK,UAAU;AAAA,cACnB,QAAQ;AAAA,gBACN,cAAc;AAAA,gBACd,OAAO;AAAA,kBACL,YAAY;AAAA,kBACZ,gBAAgB;AAAA,kBAChB,cAAc;AAAA,kBACd,WAAW;AAAA,kBACX,mBAAmB;AAAA,kBACnB,eAAe;AAAA,oBACb;AAAA,sBACE,cAAc;AAAA,sBACd,YAAY;AAAA,sBACZ,gBAAgB;AAAA,wBACd,QAAQ;AAAA,0BACN;AAAA,0BAAoB;AAAA,0BACpB;AAAA,0BAAoB;AAAA,0BACpB;AAAA,0BAAoB;AAAA,wBACtB;AAAA,sBACF;AAAA,sBACA,gBAAgB;AAAA,wBACd,QAAQ,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,sBAC3B;AAAA,sBACA,aAAa;AAAA,wBACX,UAAU;AAAA,0BACR,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA,aAAa;AAAA,0BACX,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA,mBAAmB;AAAA,sBACrB;AAAA,sBACA,UAAU;AAAA,wBACR,UAAU;AAAA,0BACR,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA,aAAa;AAAA,0BACX,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA,mBAAmB;AAAA,wBACnB,KAAK;AAAA,sBACP;AAAA,sBACA,UAAU;AAAA,wBACR,QAAQ;AAAA,0BACN,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA,SAAS;AAAA,0BACP,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA,mBAAmB;AAAA,sBACrB;AAAA,sBACA,OAAO;AAAA,wBACL,OAAO;AAAA,0BACL,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA,QAAQ;AAAA,0BACN,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA,mBAAmB;AAAA,sBACrB;AAAA,sBACA,qBAAqB;AAAA,wBACnB,eAAe;AAAA,0BACb;AAAA,0BACA;AAAA,0BACA;AAAA,0BACA;AAAA,0BACA;AAAA,0BACA;AAAA,wBACF;AAAA,sBACF;AAAA,sBACA,eAAe;AAAA,wBACb,QAAQ,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,sBAC3B;AAAA,sBACA,iBAAiB;AAAA,oBACnB;AAAA,kBACF;AAAA,kBACA,iBAAiB;AAAA,gBACnB;AAAA,gBACA,gBAAgB;AAAA,cAClB;AAAA,YACF,CAAC;AAAA,UACH,CAAC;AAAA,QACH;AAAA,MACF;AAEA,UAAI,OAAO,IAAI,SAAS,WAAW,GAAG;AACpC,eAAO;AAAA,UACL,IAAI,aAAa,WAAW;AAAA,YAC1B,MAAM,KAAK,UAAU;AAAA,cACnB,QAAQ;AAAA,gBACN,cAAc;AAAA,gBACd,OAAO;AAAA,kBACL,YAAY;AAAA,kBACZ,gBAAgB;AAAA,kBAChB,cAAc;AAAA,kBACd,WAAW;AAAA,kBACX,mBAAmB;AAAA,kBACnB,eAAe;AAAA,oBACb;AAAA,sBACE,cAAc;AAAA,sBACd,YAAY;AAAA,sBACZ,gBAAgB;AAAA,wBACd,QAAQ;AAAA,0BACN;AAAA,0BAAoB;AAAA,0BACpB;AAAA,0BAAoB;AAAA,0BACpB;AAAA,0BAAoB;AAAA,wBACtB;AAAA,sBACF;AAAA,sBACA,gBAAgB;AAAA,wBACd,QAAQ,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,sBAC3B;AAAA,sBACA,aAAa;AAAA,wBACX,UAAU;AAAA,0BACR,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA,aAAa;AAAA,0BACX,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA,mBAAmB;AAAA,sBACrB;AAAA,sBACA,UAAU;AAAA,wBACR,UAAU;AAAA,0BACR,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA,aAAa;AAAA,0BACX,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA,mBAAmB;AAAA,wBACnB,KAAK;AAAA,sBACP;AAAA,sBACA,UAAU;AAAA,wBACR,QAAQ;AAAA,0BACN,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA,SAAS;AAAA,0BACP,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA,mBAAmB;AAAA,sBACrB;AAAA,sBACA,OAAO;AAAA,wBACL,OAAO;AAAA,0BACL,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA,QAAQ;AAAA,0BACN,GAAG;AAAA,0BACH,GAAG;AAAA,0BACH,GAAG;AAAA,wBACL;AAAA,wBACA,mBAAmB;AAAA,sBACrB;AAAA,sBACA,qBAAqB;AAAA,wBACnB,eAAe;AAAA,0BACb;AAAA,0BACA;AAAA,0BACA;AAAA,0BACA;AAAA,0BACA;AAAA,0BACA;AAAA,wBACF;AAAA,sBACF;AAAA,sBACA,eAAe;AAAA,wBACb,QAAQ,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,sBAC3B;AAAA,sBACA,iBAAiB;AAAA,oBACnB;AAAA,kBACF;AAAA,kBACA,iBAAiB;AAAA,gBACnB;AAAA,gBACA,gBAAgB;AAAA,cAClB;AAAA,YACF,CAAC;AAAA,UACH,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,GAAG,EAAE;AAAA,EACP;AAAA,EAEA,uBAAuB,QAAmC,SAAiB;AACzE,YAAQ,IAAI,uBAAuB,OAAO,GAAG,IAAI,OAAO;AAAA,EAC1D;AACF;AAEA,IAAM,qBAAqB;AAAA,EACzB,QAAQ;AAAA,IACN,OAAO;AAAA,MACL,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,gBAAgB;AAAA,QACd,QAAQ;AAAA,UACN;AAAA,UAAoB;AAAA,UAAqB;AAAA,UACzC;AAAA,UAAoB;AAAA,UAAoB;AAAA,QAC1C;AAAA,MACF;AAAA,MACA,gBAAgB;AAAA,QACd,QAAQ,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,MAC3B;AAAA,MACA,aAAa;AAAA,QACX,UAAU;AAAA,UACR,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG;AAAA,QACL;AAAA,QACA,aAAa;AAAA,UACX,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG;AAAA,QACL;AAAA,QACA,mBAAmB;AAAA,MACrB;AAAA,MACA,UAAU;AAAA,QACR,UAAU;AAAA,UACR,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG;AAAA,QACL;AAAA,QACA,aAAa;AAAA,UACX,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG;AAAA,QACL;AAAA,QACA,mBAAmB;AAAA,QACnB,KAAK;AAAA,MACP;AAAA,MACA,UAAU;AAAA,QACR,QAAQ;AAAA,UACN,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG;AAAA,QACL;AAAA,QACA,SAAS;AAAA,UACP,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG;AAAA,QACL;AAAA,QACA,mBAAmB;AAAA,MACrB;AAAA,MACA,OAAO;AAAA,QACL,OAAO;AAAA,UACL,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG;AAAA,QACL;AAAA,QACA,QAAQ;AAAA,UACN,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG;AAAA,QACL;AAAA,QACA,mBAAmB;AAAA,MACrB;AAAA,MACA,qBAAqB;AAAA,QACnB,eAAe,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AAAA,MAC1D;AAAA,MACA,eAAe;AAAA,QACb,QAAQ,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAAA,MAC3B;AAAA,MACA,iBAAiB;AAAA,IACnB;AAAA,IACA,UAAU;AAAA,MACR,UAAU;AAAA,QACR,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,MACL;AAAA,MACA,aAAa;AAAA,QACX,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,MACL;AAAA,MACA,mBAAmB;AAAA,MACnB,KAAK;AAAA,IACP;AAAA,EACF;AACF;;;AJruCO,IAAM,aAAN,MAAiB;AAAA,EAOtB,YAAY,QAA0B;AAHtC,uBAA6C;AAC7C,uBAA6B;AAtD/B;AAyDI,UAAM,UAAS,YAAO,WAAP,YAAiB;AAChC,SAAK,SAAS;AAAA,MACZ;AAAA,OACG;AAEL,SAAK,cACH,OAAO,eACP,iBAAiB,UAAU,mBAAmB,KAC9C;AAEF,QAAI,KAAK,OAAO,gBAAgB,4BAA4B;AAC1D,WAAK,OAAO,IAAI,iBAAiB;AAAA,IACnC;AAGA,UAAM,gBAAgB,cAAAC,QAAM,OAAO;AAAA,MACjC,aAAS,gBAAAC,SAAQ,KAAK,OAAO,aAAa,SAAS;AAAA;AAAA,MAEnD,SACE,OAAO,WAAW,eAClB,OAAO,SAAS,OAAO,SAAS,WAAW,IACvC,CAAC,IACD;AAAA;AAAA,QAEE,uBAAuB;AAAA,MACzB;AAAA,IACR,CAAC;AAED,kBAAc,aAAa,QAAQ,IAAI,CAAO,YAAY;AACxD,UAAI,CAAC,QAAQ,QAAQ,eAAe;AAClC,YAAI,KAAK,aAAa;AACpB,kBAAQ,QAAQ,gBAAgB,UAAU,KAAK,WAAW;AAAA,QAC5D,WAAW,KAAK,OAAO,YAAY,KAAK,OAAO,UAAU;AACvD,kBAAQ,QAAQ,gBAAgB,SAAS,KAAK,OAAO,WAAW,MAAM,OAAO,QAAQ,CAAC;AAAA,QACxF;AAAA,MACF;AACA,aAAO;AAAA,IACT,EAAC;AAED,QAAI,OAAO,WAAW,aAAa;AACjC,oBAAc,aAAa,SAAS;AAAA,QAClC,CAAC,MAAM;AAAA,QACP,CAAO,UAAU;AAnGzB,cAAAC,KAAA;AAoGU,kBAAI,4BAAa,KAAK,GAAG;AACvB,kBAAIA,MAAA,MAAM,aAAN,gBAAAA,IAAgB,YAAW,KAAK;AAGlC,kBAAI;AACF,sBAAM,KAAK,oBAAoB;AAE/B,oBAAI,MAAM,QAAQ;AAChB,sBAAI,KAAK,aAAa;AACpB,0BAAM,OAAO,QAAQ,gBAAgB,UAAU,KAAK,WAAW;AAAA,kBACjE,OAAO;AACL,2BAAO,MAAM,OAAO,QAAQ;AAAA,kBAC9B;AACA,yBAAO,cAAc,QAAQ,MAAM,MAAM;AAAA,gBAC3C;AAAA,cACF,SAAS,KAAK;AACZ,uBAAO,QAAQ,OAAO,GAAG;AAAA,cAC3B;AAAA,YACF,aAAW,WAAM,aAAN,mBAAgB,YAAW,KAAK;AAEzC,oBAAM,MAAM,MAAM,MAAM,OAAO,SAAS,IAAI;AAC5C,kBAAI,IAAI,WAAW,KAAK;AAEtB,uBAAO,SAAS,OAAO;AAAA,cACzB;AAAA,YACF;AAAA,UACF;AAEA,iBAAO,QAAQ,OAAO,KAAK;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAEA,SAAK,MAAM,IAAI,kBAAkB,QAAQ,iCACpC,SADoC;AAAA,MAEvC,cAAU,gBAAAD,SAAQ,KAAK,OAAO,aAAa,SAAS;AAAA,MACpD,YAAY,CAAC,SAAiB;AAC5B,eAAO,SAAS;AAAA,MAClB;AAAA,MACA,aAAa,kCACP,KAAK,OACJ;AAAA,QACC,SAAS,CAACE,YAAW;AACnB,iBAAO,KAAK,KAAM,iBAAiBA,OAAM;AAAA,QAC3C;AAAA,MACF,IACA,CAAC,IACF,OAAO;AAAA,MAEZ;AAAA,IACF,EAAC;AAAA,EACH;AAAA,EAEM,sBAAqC;AAAA;AACzC,UAAI,KAAK,aAAa;AAEpB;AAAA,MACF;AAEA,WAAK,cAAc,eAAe,KAAK,OAAO,WAAW;AACzD,UAAI;AACF,aAAK,cAAc,MAAM,KAAK;AAC9B,YAAI,KAAK,aAAa;AAEpB,2BAAiB,UAAU,qBAAqB,KAAK,WAAW;AAAA,QAClE,OAAO;AACL,2BAAiB,OAAO,mBAAmB;AAAA,QAC7C;AAAA,MACF,UAAE;AACA,aAAK,cAAc;AAAA,MACrB;AAAA,IACF;AAAA;AAAA,EAEA,iBAAiB,MAAsB;AACrC,UAAM,MAAM,IAAI;AAAA,UACd,gBAAAF;AAAA,QACE,KAAK,OAAO;AAAA,QACZ,iBAAiB,KAAK,OAAO,MAAM;AAAA,QACnC;AAAA,MACF;AAAA,IACF;AACA,QAAI,WAAW,IAAI,SAAS,QAAQ,QAAQ,IAAI;AAChD,QAAI,WAAW,IAAI,SAAS,QAAQ,SAAS,KAAK;AAKlD,QAAI,KAAK,aAAa;AACpB,UAAI,aAAa,OAAO,SAAS,KAAK,WAAW;AAAA,IACnD,WAAW,KAAK,OAAO,YAAY,KAAK,OAAO,UAAU;AACvD,UAAI,WAAW,KAAK,OAAO;AAC3B,UAAI,WAAW,KAAK,OAAO;AAAA,IAC7B;AAEA,WAAO,IAAI,SAAS;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,0BAA0B,MAAc;AACtC,WAAO,IAAI,0BAA0B,KAAK,iBAAiB,IAAI,GAAG;AAAA,MAChE,MAAM,KAAK;AAAA,IACb,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKM,oBAAoB,eAAuB;AAAA;AAC/C,aAAO,MAAM,uBAAuB,KAAK,MAAM,aAAa;AAAA,IAC9D;AAAA;AAAA;AAAA;AAAA;AAAA,EAKM,cAAc,eAAuB;AAAA;AACzC,aAAO,MAAM,iBAAiB,KAAK,MAAM,aAAa;AAAA,IACxD;AAAA;AAAA,EAEM,oBACJ,gBACiC;AAAA;AACjC,YAAM,EAAE,UAAU,IAAI,MAAM,KAAK,IAAI,WAAW,gBAAgB;AAEhE,aAAO,QAAQ;AAAA,QACb,eAAe;AAAA,UAAI,CAAC,kBAClB,qBAAqB,QAAQ,MAAM,eAAe,SAAS;AAAA,QAC7D;AAAA,MACF;AAAA,IACF;AAAA;AAAA,EAEM,mBACJ,eAC+B;AAAA;AAC/B,YAAM,eAAe,MAAM,KAAK,oBAAoB,CAAC,aAAa,CAAC;AACnE,aAAO,aAAa,CAAC;AAAA,IACvB;AAAA;AACF;;;AKhPA,IAAAG,gBAA2B;AAC3B,IAAAC,eAAgD;AAYzC,IAAK,eAAL,kBAAKC,kBAAL;AACL,EAAAA,cAAA,gBAAa;AACb,EAAAA,cAAA,aAAU;AACV,EAAAA,cAAA,aAAU;AACV,EAAAA,cAAA,YAAS;AACT,EAAAA,cAAA,eAAY;AALF,SAAAA;AAAA,GAAA;AA4BL,IAAM,yBAAN,MAA6B;AAAA,EASlC,YAAqB,MAAkB;AAAlB;AARrB,0BAAiC,CAAC;AAClC,gBAAgC,CAAC;AAEjC,0BAAiB;AACjB,6CAAoC;AAKlC,yCAAmB,MAAM,CAAC,GAAG,EAAE,UAAU,KAAK,CAAC;AAE/C,SAAK,qBAAqB,KAAK,0BAA0B,iBAAiB;AAE1E,SAAK,mBAAmB,iBAAiB,WAAW,CAAC,OAAO;AAC1D,YAAM,MAAM,aAAa,GAAG,IAAI;AAEhC,UAAI,CAAC,KAAK;AACR,gBAAQ,MAAM,yCAAyC,GAAG,IAAI;AAC9D;AAAA,MACF;AACA,UAAI,IAAI,SAAS,UAAU;AACzB,aAAK,0BAA0B,GAAG;AAAA,MACpC;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGM,0BAA0B,KAA0B;AAAA;AArE5D;AAsEI,YAAM,EAAE,OAAO,IAAI;AAInB,UAAI,OAAO,OAAO,KAAK,kCAAmC;AAE1D,UAAI,OAAO,UAAU,uBAAqB;AACxC,YAAI;AACF,gBAAM,cAAc,MAAM,KAAK,KAAK,IAAI,QAAQ;AAAA,YAC9C,OAAO;AAAA,UACT;AAIA,gBAAM,SAAU,YAAoB;AACpC,cAAI,QAAQ;AACV,iBAAK,IAAI,MAAM;AAAA,UACjB;AACA,eAAK;AAAA,YACH,kBAAkB,OAAO,EAAE,uBAAuB,YAAY,KAAK;AAAA,EAAK,YAAY,SAAS;AAAA,UAC/F;AAAA,QACF,SAAS,KAAK;AACZ,eAAK;AAAA,YACH,0CAA0C,OAAO,EAAE,KAAK,GAAG;AAAA,UAC7D;AAAA,QACF;AAEA,aAAK,eAAe,QAAQ;AAE5B,aAAK,cAAc;AAAA,MACrB,WAAW,OAAO,UAAU,yBAAsB;AAChD,YAAI;AACF,gBAAM,cAAc,MAAM,KAAK,KAAK,IAAI,QAAQ;AAAA,YAC9C,OAAO;AAAA,UACT;AAEA,gBAAM,SAAU,YAAoB;AACpC,cAAI,QAAQ;AACV,iBAAK,IAAI,MAAM;AAAA,UACjB;AAEA,eAAK,eAAe,QAAQ;AAC5B,eAAK,IAAI,kBAAkB,OAAO,EAAE,UAAU;AAAA,QAChD,SAAS,KAAK;AACZ,eAAK;AAAA,YACH,0CAA0C,OAAO,EAAE,KAAK,GAAG;AAAA,UAC7D;AAAA,QACF;AAEA,aAAK,cAAc;AAAA,MACrB,WAAW,OAAO,UAAU,6BAAwB;AAClD,YAAI;AACF,gBAAM,cAAc,MAAM,KAAK,KAAK,IAAI,QAAQ;AAAA,YAC9C,OAAO;AAAA,UACT;AAEA,gBAAM,SAAU,YAAoB;AACpC,cAAI,QAAQ;AACV,iBAAK,IAAI,MAAM;AAAA,UACjB;AACA,eAAK;AAAA,YACH,kBAAkB,OAAO,EAAE,8BAA6B,YAAO,mBAAP,mBAAuB,QAAQ,EAAE;AAAA,UAC3F;AAEA,eAAK,eAAe,QAAQ;AAAA,QAC9B,SAAS,KAAK;AACZ,eAAK;AAAA,YACH,0CAA0C,OAAO,EAAE,KAAK,GAAG;AAAA,UAC7D;AAAA,QACF;AAEA,aAAK,cAAc;AAAA,MACrB,WAAW,OAAO,UAAU,yBAAsB;AAChD,aAAK,eAAe,QAAQ;AAC5B,aAAK,IAAI,kBAAkB,OAAO,EAAE,cAAc;AAAA,MACpD,WAAW,OAAO,UAAU,gCAAyB;AACnD,gBAAQ,MAAM,MAAM;AACpB,aAAK;AAAA,UACH,kBAAkB,OAAO,EAAE,8BAA8B,OAAO,KAAK;AAAA,QACvE;AACA,aAAK,eAAe,QAAQ;AAC5B,aAAK,cAAc;AAAA,MACrB;AAAA,IACF;AAAA;AAAA;AAAA,EAGA,gBAAgB;AACd,kCAAY,MAAM;AAChB,WAAK,iBAAiB;AAAA,IACxB,CAAC;AACD,SAAK,oCAAoC;AAAA,EAC3C;AAAA,EAEM,eACJ,cACA,eACA,aACA;AAAA;AACA,WAAK,iBAAiB;AAAA,QACpB;AAAA,QACA,OAAO;AAAA,MACT;AAEA,YAAM,EAAE,gBAAgB,YAAY,IAAI;AACxC,UAAI,CAAC,YAAa;AAClB,oCAAY,MAAM;AAChB,aAAK,iBAAiB;AAAA,MACxB,CAAC;AAID,UAAI,aAAa;AACf,YAAI;AACF,gBAAM,KAAK,KAAK,IAAI,mBAAmB;AAAA,YACrC,YAAY;AAAA,UACd;AAAA,QACF,SAAS,KAAK;AACZ,kBAAQ,MAAM,GAAG;AAAA,QACnB;AAAA,MACF;AAGA,YAAM,cAAc,YAAY,aAAc,WAAW,WAAW,EAAE;AAEtE,UAAI;AACF,cAAM,mBAAmB,MAAM,KAAK,KAAK,IAAI,QAAQ;AAAA,UACnD;AAAA,YACE,MAAM;AAAA,YACN;AAAA,YACA,eAAe,2CAAa;AAAA,UAC9B;AAAA,UACA;AAAA,YACE,SAAS;AAAA,cACP,gBAAgB;AAAA,YAClB;AAAA,UACF;AAAA,QACF;AAEA,aAAK,IAAI,0BAA0B,iBAAiB,EAAE,GAAG;AACzD,sCAAY,MAAM;AAChB,eAAK,iBAAiB;AAAA,QACxB,CAAC;AACD,aAAK,oCAAoC,iBAAiB;AAAA,MAC5D,SAAS,OAAO;AACd,YAAI,iBAAiB,4BAAc,MAAM,YAAY,MAAM,SAAS;AAClE,eAAK;AAAA,YACH,GAAG,MAAM,SAAS,MAAM,IAAI,MAAM,SAAS,UAAU,SAAS,MAAM,SAAS,OAAO,GAAG,IAAI,KAAK,UAAU,MAAM,SAAS,IAAI,CAAC;AAAA,UAChI;AAAA,QACF,OAAO;AACL,eAAK,SAAS,KAAK,UAAU,KAAK,CAAC;AAAA,QACrC;AACA,sCAAY,MAAM;AAChB,eAAK,iBAAiB;AAAA,QACxB,CAAC;AAAA,MACH;AAAA,IACF;AAAA;AAAA,EAEM,cAAc;AAAA;AAClB,UAAI,CAAC,KAAK,kCAAmC;AAC7C,oCAAY,MAAM;AAChB,aAAK,iBAAiB;AAAA,MACxB,CAAC;AAED,UAAI;AACF,cAAM,KAAK,KAAK,IAAI,QAAQ;AAAA,UAC1B,KAAK;AAAA,QACP;AAAA,MACF,SAAS,KAAK;AAEZ,sCAAY,MAAM;AAChB,eAAK,iBAAiB;AAAA,QACxB,CAAC;AACD,cAAM;AAAA,MACR;AAAA,IACF;AAAA;AAAA,EAEA,QAAQ;AACN,SAAK,iBAAiB,CAAC;AAAA,EACzB;AAAA,EAEA,IAAI,SAAiB;AACnB,YAAQ,IAAI,OAAO;AACnB,SAAK,KAAK,KAAK;AAAA,MACb,WAAW,KAAK,IAAI;AAAA,MACpB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,SAAS,SAAiB;AACxB,YAAQ,IAAI,OAAO;AACnB,SAAK,KAAK,KAAK;AAAA,MACb,WAAW,KAAK,IAAI;AAAA,MACpB;AAAA,MACA,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AACF;","names":["mounting","Symbol","objectProto","nativeObjectToString","symToStringTag","funcProto","objectProto","funcToString","hasOwnProperty","objectProto","hasOwnProperty","objectProto","hasOwnProperty","HASH_UNDEFINED","HASH_UNDEFINED","othValue","Uint8Array","COMPARE_PARTIAL_FLAG","COMPARE_UNORDERED_FLAG","objectProto","objectProto","hasOwnProperty","propertyIsEnumerable","Buffer","MAX_SAFE_INTEGER","argsTag","boolTag","dateTag","errorTag","funcTag","mapTag","numberTag","regexpTag","setTag","stringTag","arrayBufferTag","dataViewTag","freeExports","freeModule","moduleExports","objectProto","hasOwnProperty","objectProto","objectProto","hasOwnProperty","COMPARE_PARTIAL_FLAG","objectProto","hasOwnProperty","Promise","Set","mapTag","objectTag","setTag","weakMapTag","dataViewTag","COMPARE_PARTIAL_FLAG","argsTag","arrayTag","objectTag","objectProto","hasOwnProperty","import_mobx","MOTION_DELTA_THRESHOLD","axios","import_axios","ReconnectingWebSocket","import_axios","match","axios","urlJoin","_a","config","import_axios","import_mobx","ProgramState"]}