@woven-canvas/plugin-tapes 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/index.cjs CHANGED
@@ -122,8 +122,8 @@ var tapeDrawMachine = (0, import_xstate.setup)({
122
122
  },
123
123
  guards: {
124
124
  isThresholdReached: ({ context, event }) => {
125
- const dist = import_math.Vec2.distance(context.pointingStartClient, event.screenPosition);
126
- return dist >= POINTING_THRESHOLD;
125
+ const worldDist = import_math.Vec2.distance(context.pointingStartWorld, event.worldPosition);
126
+ return worldDist * event.cameraZoom >= POINTING_THRESHOLD;
127
127
  }
128
128
  },
129
129
  actions: {
@@ -213,7 +213,7 @@ var tapeDrawMachine = (0, import_xstate.setup)({
213
213
  target: TapeDrawStateEnum.Drawing
214
214
  },
215
215
  pointerUp: {
216
- actions: ["placeTape", "exitTapeControl"],
216
+ actions: ["placeTape"],
217
217
  target: TapeDrawStateEnum.Idle
218
218
  },
219
219
  cancel: {
@@ -223,7 +223,7 @@ var tapeDrawMachine = (0, import_xstate.setup)({
223
223
  },
224
224
  [TapeDrawStateEnum.Drawing]: {
225
225
  entry: "addTape",
226
- exit: "exitTapeControl",
226
+ exit: [],
227
227
  on: {
228
228
  pointerMove: {
229
229
  actions: "drawTape"
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/tape.ts","../src/components/index.ts","../src/components/Tape.ts","../src/constants.ts","../src/singletons/index.ts","../src/singletons/TapeDrawState.ts","../src/types.ts","../src/TapesPlugin.ts","../src/systems/index.ts","../src/systems/captureTapeDrawSystem.ts","../src/systems/updateTapeDrawSystem.ts"],"sourcesContent":["export * from './commands'\nexport * from './components'\nexport * from './constants'\nexport * from './singletons'\nexport { createTapesPlugin, TapesPlugin } from './TapesPlugin'\nexport * from './types'\n","import { defineCommand, type EntityId } from '@woven-canvas/core'\nimport type { Vec2 } from '@woven-canvas/math'\n\n/**\n * Add a new tape block at the given world position.\n */\nexport const AddTape = defineCommand<{\n entityId: EntityId\n position: Vec2\n}>('tape-add')\n\n/**\n * Update tape geometry during drawing.\n * Stretches tape from start to end position.\n */\nexport const DrawTape = defineCommand<{\n entityId: EntityId\n start: Vec2\n end: Vec2\n}>('tape-draw')\n\n/**\n * Remove a tape entity (on cancel).\n */\nexport const RemoveTape = defineCommand<{\n entityId: EntityId\n}>('tape-remove')\n\n/**\n * Complete drawing a tape.\n * Finalizes the tape and selects it.\n */\nexport const CompleteTape = defineCommand<{\n entityId: EntityId\n}>('tape-complete')\n\n/**\n * Place a default-sized tape at the given position (on simple click).\n */\nexport const PlaceTape = defineCommand<{\n entityId: EntityId\n position: Vec2\n}>('tape-place')\n","export { Tape } from './Tape'\n","import { defineCanvasComponent, field } from '@woven-canvas/core'\n\n/**\n * Tape component - stores tape-specific metadata for washi tape blocks.\n *\n * Tape is a ribbon-like element positioned by its two endpoints.\n * The block's width represents the tape length and height represents thickness.\n * Rotation is derived from the angle between endpoints.\n *\n * The tape image is stored via the Image and Asset components (same as image blocks).\n * For default tapes, the Asset identifier is set to the known URL directly —\n * AssetManager will return it as-is without going through the upload pipeline.\n * The image tiles horizontally along the tape length.\n */\nexport const Tape = defineCanvasComponent(\n { name: 'tape', sync: 'document' },\n {\n /** Tape thickness in world units (the height of the tape ribbon) */\n thickness: field.float64().default(30),\n },\n)\n","/** Plugin name identifier */\nexport const TAPES_PLUGIN_NAME = 'tapes'\n\n/** Default tape thickness in world units */\nexport const DEFAULT_TAPE_THICKNESS = 30\n\n/** Default tape length in world units (for click-to-place) */\nexport const DEFAULT_TAPE_LENGTH = 200\n\n/** Minimum distance (in screen pixels) before transitioning from Pointing to Drawing */\nexport const POINTING_THRESHOLD = 4\n\n/** Default tape image URL */\nexport const DEFAULT_TAPE_IMAGE =\n 'https://storage.googleapis.com/download/storage/v1/b/zine-maker-public/o/tapes%2F7e3b7dde-927d-4b09-aeb4-d49eac36d4ea.png?generation=1715183194653465&alt=media'\n","export { TapeDrawState } from './TapeDrawState'\n","import { defineEditorState, field } from '@woven-canvas/core'\nimport { TapeDrawStateEnum } from '../types'\n\n/**\n * Tape draw state singleton - stores the current state of the tape draw state machine.\n *\n * Tracks the drawing tool state and active tape entity while drawing new tape.\n */\nexport const TapeDrawState = defineEditorState('tapeDrawState', {\n /** Current state machine state */\n state: field.string().max(16).default(TapeDrawStateEnum.Idle),\n\n /** Reference to the active tape entity (while drawing) */\n activeTape: field.ref(),\n\n /** Pointing start position in client coordinates [x, y] */\n pointingStartClient: field.tuple(field.int32(), 2).default([0, 0]),\n\n /** Pointing start position in world coordinates [x, y] */\n pointingStartWorld: field.tuple(field.float64(), 2).default([0, 0]),\n})\n","/**\n * State values for the tape draw state machine.\n */\nexport const TapeDrawStateEnum = {\n /** Idle - waiting for user to start drawing */\n Idle: 'idle',\n /** Pointing - pointer down, waiting for drag threshold */\n Pointing: 'pointing',\n /** Drawing - tape created, stretching with pointer */\n Drawing: 'drawing',\n} as const\n\nexport type TapeDrawStateValue = (typeof TapeDrawStateEnum)[keyof typeof TapeDrawStateEnum]\n","import {\n Asset,\n CanvasComponentDef,\n CanvasSingletonDef,\n type EditorPlugin,\n type EditorPluginFactory,\n type EditorSystem,\n Image,\n ResizeMode,\n} from '@woven-canvas/core'\n\nimport * as components from './components'\nimport { TAPES_PLUGIN_NAME } from './constants'\nimport * as singletons from './singletons'\nimport * as systems from './systems'\n\n// Helper to filter EditorSystem instances from a namespace\nconst filterSystems = (ns: object): EditorSystem[] =>\n Object.values(ns).filter(\n (v): v is EditorSystem => typeof v === 'object' && v !== null && '_system' in v && 'phase' in v,\n )\n\n/**\n * Create a Tapes plugin.\n *\n * @returns Configured EditorPlugin\n */\nexport function createTapesPlugin(): EditorPlugin {\n return {\n name: TAPES_PLUGIN_NAME,\n\n dependencies: ['selection'],\n\n components: Object.values(components).filter((v) => v instanceof CanvasComponentDef),\n\n singletons: Object.values(singletons).filter((v) => v instanceof CanvasSingletonDef),\n\n blockDefs: [\n {\n tag: 'tape',\n components: [components.Tape, Image, Asset],\n resizeMode: ResizeMode.Scale,\n connectors: {\n enabled: false,\n },\n },\n ],\n\n systems: filterSystems(systems),\n }\n}\n\n/**\n * Tapes Plugin\n *\n * Provides washi tape drawing functionality for infinite canvas:\n * - Click and drag to draw tape across the canvas\n * - Tape stretches from start to end point with rotation\n * - Uses tiling tape texture images via Asset system\n * - RotateScale handles for repositioning tape endpoints\n *\n * @example\n * ```typescript\n * import { Editor } from '@woven-canvas/core';\n * import { TapesPlugin } from '@woven-canvas/plugin-tapes';\n *\n * const editor = new Editor(el, {\n * plugins: [TapesPlugin],\n * });\n * ```\n */\nexport const TapesPlugin: EditorPluginFactory = () => createTapesPlugin()\n","export { captureTapeDrawSystem } from './captureTapeDrawSystem'\nexport { updateTapeDrawSystem } from './updateTapeDrawSystem'\n","import {\n Controls,\n Cursor,\n createEntity,\n defineEditorSystem,\n type EntityId,\n getPointerInput,\n type InferStateContext,\n type PointerInput,\n} from '@woven-canvas/core'\nimport { Vec2 } from '@woven-canvas/math'\nimport { DeselectAll } from '@woven-canvas/plugin-selection'\nimport { assign, setup } from 'xstate'\nimport { AddTape, CompleteTape, DrawTape, PlaceTape, RemoveTape } from '../commands'\nimport { POINTING_THRESHOLD } from '../constants'\nimport { TapeDrawState } from '../singletons'\nimport { TapeDrawStateEnum } from '../types'\n\n/**\n * Tape draw state machine context - derived from TapeDrawState schema.\n */\ntype TapeDrawContext = InferStateContext<typeof TapeDrawState>\n\n/**\n * Tape draw state machine - handles pointer events for drawing new tape.\n *\n * Flow:\n * - Idle → pointerDown → Pointing (record start position)\n * - Pointing → pointerMove (past threshold) → Drawing (create tape entity)\n * - Drawing → pointerMove → update tape geometry\n * - Drawing → pointerUp → Idle (complete tape)\n * - Any → cancel → Idle (remove tape if exists)\n */\nconst tapeDrawMachine = setup({\n types: {\n context: {} as TapeDrawContext,\n events: {} as PointerInput,\n },\n guards: {\n isThresholdReached: ({ context, event }) => {\n const dist = Vec2.distance(context.pointingStartClient as [number, number], event.screenPosition)\n return dist >= POINTING_THRESHOLD\n },\n },\n actions: {\n setPointingStart: assign({\n pointingStartClient: ({ event }): [number, number] => [event.screenPosition[0], event.screenPosition[1]],\n pointingStartWorld: ({ event }): [number, number] => [event.worldPosition[0], event.worldPosition[1]],\n }),\n\n resetContext: assign({\n pointingStartClient: (): [number, number] => [0, 0],\n pointingStartWorld: (): [number, number] => [0, 0],\n activeTape: () => null,\n }),\n\n addTape: assign({\n activeTape: ({ context, event }): EntityId => {\n const startWorld = context.pointingStartWorld as [number, number]\n const entityId = createEntity(event.ctx)\n AddTape.spawn(event.ctx, {\n entityId,\n position: startWorld,\n })\n return entityId\n },\n }),\n\n drawTape: ({ context, event }) => {\n if (!context.activeTape) return\n const startWorld = context.pointingStartWorld as [number, number]\n DrawTape.spawn(event.ctx, {\n entityId: context.activeTape,\n start: startWorld,\n end: event.worldPosition,\n })\n },\n\n completeTape: ({ context, event }) => {\n if (!context.activeTape) return\n CompleteTape.spawn(event.ctx, { entityId: context.activeTape })\n },\n\n removeTape: assign({\n activeTape: ({ context, event }): EntityId | null => {\n if (!context.activeTape) return null\n RemoveTape.spawn(event.ctx, { entityId: context.activeTape })\n return null\n },\n }),\n\n placeTape: ({ context, event }) => {\n const startWorld = context.pointingStartWorld as [number, number]\n const entityId = createEntity(event.ctx)\n PlaceTape.spawn(event.ctx, {\n entityId,\n position: startWorld,\n })\n },\n\n exitTapeControl: ({ event }) => {\n const controls = Controls.write(event.ctx)\n controls.leftMouseTool = 'select'\n\n const cursor = Cursor.write(event.ctx)\n cursor.cursorKind = 'select'\n },\n\n deselectAll: ({ event }) => {\n DeselectAll.spawn(event.ctx)\n },\n },\n}).createMachine({\n id: 'tapeDraw',\n initial: TapeDrawStateEnum.Idle,\n context: {\n activeTape: null,\n pointingStartClient: [0, 0] as [number, number],\n pointingStartWorld: [0, 0] as [number, number],\n },\n states: {\n [TapeDrawStateEnum.Idle]: {\n entry: 'resetContext',\n on: {\n pointerDown: [\n {\n actions: 'deselectAll',\n target: TapeDrawStateEnum.Pointing,\n },\n ],\n },\n },\n [TapeDrawStateEnum.Pointing]: {\n entry: 'setPointingStart',\n on: {\n pointerMove: {\n guard: 'isThresholdReached',\n target: TapeDrawStateEnum.Drawing,\n },\n pointerUp: {\n actions: ['placeTape', 'exitTapeControl'],\n target: TapeDrawStateEnum.Idle,\n },\n cancel: {\n target: TapeDrawStateEnum.Idle,\n },\n },\n },\n [TapeDrawStateEnum.Drawing]: {\n entry: 'addTape',\n exit: 'exitTapeControl',\n on: {\n pointerMove: {\n actions: 'drawTape',\n },\n pointerUp: {\n actions: 'completeTape',\n target: TapeDrawStateEnum.Idle,\n },\n cancel: {\n actions: 'removeTape',\n target: TapeDrawStateEnum.Idle,\n },\n },\n },\n },\n})\n\n/**\n * Capture tape draw system - runs the tape draw state machine.\n *\n * Runs in the capture phase to handle pointer events for the tape draw tool.\n * Generates commands that are processed by the update system.\n */\nexport const captureTapeDrawSystem = defineEditorSystem({ phase: 'capture', priority: 100 }, (ctx) => {\n // Get pointer buttons mapped to tape tool\n const buttons = Controls.getButtons(ctx, 'tape')\n\n // Skip if tape tool is not active\n if (buttons.length === 0) return\n\n // Get pointer events\n const events = getPointerInput(ctx, buttons)\n\n if (events.length === 0) return\n\n TapeDrawState.run(ctx, tapeDrawMachine, events)\n})\n","import {\n Asset,\n addComponent,\n Block,\n type Context,\n defineEditorSystem,\n type EntityId,\n Grid,\n Image,\n on,\n RankBounds,\n removeEntity,\n Synced,\n UploadState,\n} from '@woven-canvas/core'\nimport type { Vec2 } from '@woven-canvas/math'\nimport { selectBlock } from '@woven-canvas/plugin-selection'\nimport { AddTape, CompleteTape, DrawTape, PlaceTape, RemoveTape } from '../commands'\nimport { Tape } from '../components'\nimport { DEFAULT_TAPE_IMAGE, DEFAULT_TAPE_LENGTH, DEFAULT_TAPE_THICKNESS } from '../constants'\n\n/**\n * Update tape draw system - handles tape commands.\n *\n * Processes:\n * - AddTape: Create new tape entity at start position\n * - DrawTape: Update tape geometry as user drags\n * - RemoveTape: Delete tape entity\n * - CompleteTape: Finalize and select tape\n */\nexport const updateTapeDrawSystem = defineEditorSystem({ phase: 'update' }, (ctx: Context) => {\n on(ctx, AddTape, (ctx, { entityId, position }) => {\n addTape(ctx, entityId, position)\n })\n\n on(ctx, DrawTape, (ctx, { entityId, start, end }) => {\n drawTape(ctx, entityId, start, end)\n })\n\n on(ctx, RemoveTape, (ctx, { entityId }) => {\n removeEntity(ctx, entityId)\n })\n\n on(ctx, CompleteTape, (ctx, { entityId }) => {\n completeTape(ctx, entityId)\n })\n\n on(ctx, PlaceTape, (ctx, { entityId, position }) => {\n placeTape(ctx, entityId, position)\n })\n})\n\n/**\n * Create a new tape entity at the given position.\n */\nfunction addTape(ctx: Context, entityId: EntityId, position: Vec2): void {\n // Snap start position to grid\n const snappedPos: Vec2 = [position[0], position[1]]\n Grid.snapPosition(ctx, snappedPos)\n\n // Create block with minimal initial size (will be updated by drawTape)\n addComponent(ctx, entityId, Block, {\n tag: 'tape',\n rank: RankBounds.genNext(ctx),\n position: [snappedPos[0], snappedPos[1] - DEFAULT_TAPE_THICKNESS / 2],\n size: [1, DEFAULT_TAPE_THICKNESS],\n })\n\n addComponent(ctx, entityId, Synced, {\n id: crypto.randomUUID(),\n })\n\n addComponent(ctx, entityId, Tape)\n\n addComponent(ctx, entityId, Image, {})\n\n addComponent(ctx, entityId, Asset, {\n identifier: DEFAULT_TAPE_IMAGE,\n uploadState: UploadState.Complete,\n })\n}\n\n/**\n * Update tape geometry based on start and end positions.\n *\n * The tape stretches from the start point to the current cursor position.\n * Position is the midpoint, width is the distance, height is the thickness,\n * and rotation is derived from the angle between the two points.\n */\nfunction drawTape(ctx: Context, entityId: EntityId, start: Vec2, end: Vec2): void {\n // Snap both endpoints to grid\n const s: Vec2 = [start[0], start[1]]\n const e: Vec2 = [end[0], end[1]]\n Grid.snapPosition(ctx, s)\n Grid.snapPosition(ctx, e)\n\n const dx = e[0] - s[0]\n const dy = e[1] - s[1]\n const length = Math.sqrt(dx * dx + dy * dy)\n const angle = Math.atan2(dy, dx)\n\n // Midpoint between start and end\n const midX = (s[0] + e[0]) / 2\n const midY = (s[1] + e[1]) / 2\n\n const block = Block.write(ctx, entityId)\n const tape = Tape.read(ctx, entityId)\n const thickness = tape.thickness\n\n // Position is top-left corner of the unrotated bounding box centered on midpoint\n block.position = [midX - length / 2, midY - thickness / 2]\n block.size = [Math.max(length, 1), thickness]\n block.rotateZ = angle\n}\n\n/**\n * Place a default-sized tape at the given position (simple click).\n */\nfunction placeTape(ctx: Context, entityId: EntityId, position: Vec2): void {\n const snappedPos: Vec2 = [position[0], position[1]]\n Grid.snapPosition(ctx, snappedPos)\n\n addComponent(ctx, entityId, Block, {\n tag: 'tape',\n rank: RankBounds.genNext(ctx),\n position: [snappedPos[0] - DEFAULT_TAPE_LENGTH / 2, snappedPos[1] - DEFAULT_TAPE_THICKNESS / 2],\n size: [DEFAULT_TAPE_LENGTH, DEFAULT_TAPE_THICKNESS],\n })\n\n addComponent(ctx, entityId, Synced, {\n id: crypto.randomUUID(),\n })\n\n addComponent(ctx, entityId, Tape)\n\n addComponent(ctx, entityId, Image, {})\n\n addComponent(ctx, entityId, Asset, {\n identifier: DEFAULT_TAPE_IMAGE,\n uploadState: UploadState.Complete,\n })\n\n selectBlock(ctx, entityId)\n}\n\n/**\n * Complete tape drawing - select it.\n */\nfunction completeTape(ctx: Context, entityId: EntityId): void {\n // Check the tape has meaningful size\n const block = Block.read(ctx, entityId)\n if (block.size[0] <= 1) {\n // Too small - remove it\n removeEntity(ctx, entityId)\n return\n }\n\n selectBlock(ctx, entityId)\n}\n"],"mappings":"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","names":["import_core","import_core","import_core","import_core","import_core","import_plugin_selection","ctx"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/tape.ts","../src/components/index.ts","../src/components/Tape.ts","../src/constants.ts","../src/singletons/index.ts","../src/singletons/TapeDrawState.ts","../src/types.ts","../src/TapesPlugin.ts","../src/systems/index.ts","../src/systems/captureTapeDrawSystem.ts","../src/systems/updateTapeDrawSystem.ts"],"sourcesContent":["export * from './commands'\nexport * from './components'\nexport * from './constants'\nexport * from './singletons'\nexport { createTapesPlugin, TapesPlugin } from './TapesPlugin'\nexport * from './types'\n","import { defineCommand, type EntityId } from '@woven-canvas/core'\nimport type { Vec2 } from '@woven-canvas/math'\n\n/**\n * Add a new tape block at the given world position.\n */\nexport const AddTape = defineCommand<{\n entityId: EntityId\n position: Vec2\n}>('tape-add')\n\n/**\n * Update tape geometry during drawing.\n * Stretches tape from start to end position.\n */\nexport const DrawTape = defineCommand<{\n entityId: EntityId\n start: Vec2\n end: Vec2\n}>('tape-draw')\n\n/**\n * Remove a tape entity (on cancel).\n */\nexport const RemoveTape = defineCommand<{\n entityId: EntityId\n}>('tape-remove')\n\n/**\n * Complete drawing a tape.\n * Finalizes the tape and selects it.\n */\nexport const CompleteTape = defineCommand<{\n entityId: EntityId\n}>('tape-complete')\n\n/**\n * Place a default-sized tape at the given position (on simple click).\n */\nexport const PlaceTape = defineCommand<{\n entityId: EntityId\n position: Vec2\n}>('tape-place')\n","export { Tape } from './Tape'\n","import { defineCanvasComponent, field } from '@woven-canvas/core'\n\n/**\n * Tape component - stores tape-specific metadata for washi tape blocks.\n *\n * Tape is a ribbon-like element positioned by its two endpoints.\n * The block's width represents the tape length and height represents thickness.\n * Rotation is derived from the angle between endpoints.\n *\n * The tape image is stored via the Image and Asset components (same as image blocks).\n * For default tapes, the Asset identifier is set to the known URL directly —\n * AssetManager will return it as-is without going through the upload pipeline.\n * The image tiles horizontally along the tape length.\n */\nexport const Tape = defineCanvasComponent(\n { name: 'tape', sync: 'document' },\n {\n /** Tape thickness in world units (the height of the tape ribbon) */\n thickness: field.float64().default(30),\n },\n)\n","/** Plugin name identifier */\nexport const TAPES_PLUGIN_NAME = 'tapes'\n\n/** Default tape thickness in world units */\nexport const DEFAULT_TAPE_THICKNESS = 30\n\n/** Default tape length in world units (for click-to-place) */\nexport const DEFAULT_TAPE_LENGTH = 200\n\n/** Minimum distance (in screen pixels) before transitioning from Pointing to Drawing */\nexport const POINTING_THRESHOLD = 4\n\n/** Default tape image URL */\nexport const DEFAULT_TAPE_IMAGE =\n 'https://storage.googleapis.com/download/storage/v1/b/zine-maker-public/o/tapes%2F7e3b7dde-927d-4b09-aeb4-d49eac36d4ea.png?generation=1715183194653465&alt=media'\n","export { TapeDrawState } from './TapeDrawState'\n","import { defineEditorState, field } from '@woven-canvas/core'\nimport { TapeDrawStateEnum } from '../types'\n\n/**\n * Tape draw state singleton - stores the current state of the tape draw state machine.\n *\n * Tracks the drawing tool state and active tape entity while drawing new tape.\n */\nexport const TapeDrawState = defineEditorState('tapeDrawState', {\n /** Current state machine state */\n state: field.string().max(16).default(TapeDrawStateEnum.Idle),\n\n /** Reference to the active tape entity (while drawing) */\n activeTape: field.ref(),\n\n /** Pointing start position in client coordinates [x, y] */\n pointingStartClient: field.tuple(field.int32(), 2).default([0, 0]),\n\n /** Pointing start position in world coordinates [x, y] */\n pointingStartWorld: field.tuple(field.float64(), 2).default([0, 0]),\n})\n","/**\n * State values for the tape draw state machine.\n */\nexport const TapeDrawStateEnum = {\n /** Idle - waiting for user to start drawing */\n Idle: 'idle',\n /** Pointing - pointer down, waiting for drag threshold */\n Pointing: 'pointing',\n /** Drawing - tape created, stretching with pointer */\n Drawing: 'drawing',\n} as const\n\nexport type TapeDrawStateValue = (typeof TapeDrawStateEnum)[keyof typeof TapeDrawStateEnum]\n","import {\n Asset,\n CanvasComponentDef,\n CanvasSingletonDef,\n type EditorPlugin,\n type EditorPluginFactory,\n type EditorSystem,\n Image,\n ResizeMode,\n} from '@woven-canvas/core'\n\nimport * as components from './components'\nimport { TAPES_PLUGIN_NAME } from './constants'\nimport * as singletons from './singletons'\nimport * as systems from './systems'\n\n// Helper to filter EditorSystem instances from a namespace\nconst filterSystems = (ns: object): EditorSystem[] =>\n Object.values(ns).filter(\n (v): v is EditorSystem => typeof v === 'object' && v !== null && '_system' in v && 'phase' in v,\n )\n\n/**\n * Create a Tapes plugin.\n *\n * @returns Configured EditorPlugin\n */\nexport function createTapesPlugin(): EditorPlugin {\n return {\n name: TAPES_PLUGIN_NAME,\n\n dependencies: ['selection'],\n\n components: Object.values(components).filter((v) => v instanceof CanvasComponentDef),\n\n singletons: Object.values(singletons).filter((v) => v instanceof CanvasSingletonDef),\n\n blockDefs: [\n {\n tag: 'tape',\n components: [components.Tape, Image, Asset],\n resizeMode: ResizeMode.Scale,\n connectors: {\n enabled: false,\n },\n },\n ],\n\n systems: filterSystems(systems),\n }\n}\n\n/**\n * Tapes Plugin\n *\n * Provides washi tape drawing functionality for infinite canvas:\n * - Click and drag to draw tape across the canvas\n * - Tape stretches from start to end point with rotation\n * - Uses tiling tape texture images via Asset system\n * - RotateScale handles for repositioning tape endpoints\n *\n * @example\n * ```typescript\n * import { Editor } from '@woven-canvas/core';\n * import { TapesPlugin } from '@woven-canvas/plugin-tapes';\n *\n * const editor = new Editor(el, {\n * plugins: [TapesPlugin],\n * });\n * ```\n */\nexport const TapesPlugin: EditorPluginFactory = () => createTapesPlugin()\n","export { captureTapeDrawSystem } from './captureTapeDrawSystem'\nexport { updateTapeDrawSystem } from './updateTapeDrawSystem'\n","import {\n Controls,\n Cursor,\n createEntity,\n defineEditorSystem,\n type EntityId,\n getPointerInput,\n type InferStateContext,\n type PointerInput,\n} from '@woven-canvas/core'\nimport { Vec2 } from '@woven-canvas/math'\nimport { DeselectAll } from '@woven-canvas/plugin-selection'\nimport { assign, setup } from 'xstate'\nimport { AddTape, CompleteTape, DrawTape, PlaceTape, RemoveTape } from '../commands'\nimport { POINTING_THRESHOLD } from '../constants'\nimport { TapeDrawState } from '../singletons'\nimport { TapeDrawStateEnum } from '../types'\n\n/**\n * Tape draw state machine context - derived from TapeDrawState schema.\n */\ntype TapeDrawContext = InferStateContext<typeof TapeDrawState>\n\n/**\n * Tape draw state machine - handles pointer events for drawing new tape.\n *\n * Flow:\n * - Idle → pointerDown → Pointing (record start position)\n * - Pointing → pointerMove (past threshold) → Drawing (create tape entity)\n * - Drawing → pointerMove → update tape geometry\n * - Drawing → pointerUp → Idle (complete tape)\n * - Any → cancel → Idle (remove tape if exists)\n */\nconst tapeDrawMachine = setup({\n types: {\n context: {} as TapeDrawContext,\n events: {} as PointerInput,\n },\n guards: {\n isThresholdReached: ({ context, event }) => {\n const worldDist = Vec2.distance(context.pointingStartWorld as [number, number], event.worldPosition)\n return worldDist * event.cameraZoom >= POINTING_THRESHOLD\n },\n },\n actions: {\n setPointingStart: assign({\n pointingStartClient: ({ event }): [number, number] => [event.screenPosition[0], event.screenPosition[1]],\n pointingStartWorld: ({ event }): [number, number] => [event.worldPosition[0], event.worldPosition[1]],\n }),\n\n resetContext: assign({\n pointingStartClient: (): [number, number] => [0, 0],\n pointingStartWorld: (): [number, number] => [0, 0],\n activeTape: () => null,\n }),\n\n addTape: assign({\n activeTape: ({ context, event }): EntityId => {\n const startWorld = context.pointingStartWorld as [number, number]\n const entityId = createEntity(event.ctx)\n AddTape.spawn(event.ctx, {\n entityId,\n position: startWorld,\n })\n return entityId\n },\n }),\n\n drawTape: ({ context, event }) => {\n if (!context.activeTape) return\n const startWorld = context.pointingStartWorld as [number, number]\n DrawTape.spawn(event.ctx, {\n entityId: context.activeTape,\n start: startWorld,\n end: event.worldPosition,\n })\n },\n\n completeTape: ({ context, event }) => {\n if (!context.activeTape) return\n CompleteTape.spawn(event.ctx, { entityId: context.activeTape })\n },\n\n removeTape: assign({\n activeTape: ({ context, event }): EntityId | null => {\n if (!context.activeTape) return null\n RemoveTape.spawn(event.ctx, { entityId: context.activeTape })\n return null\n },\n }),\n\n placeTape: ({ context, event }) => {\n const startWorld = context.pointingStartWorld as [number, number]\n const entityId = createEntity(event.ctx)\n PlaceTape.spawn(event.ctx, {\n entityId,\n position: startWorld,\n })\n },\n\n exitTapeControl: ({ event }) => {\n const controls = Controls.write(event.ctx)\n controls.leftMouseTool = 'select'\n\n const cursor = Cursor.write(event.ctx)\n cursor.cursorKind = 'select'\n },\n\n deselectAll: ({ event }) => {\n DeselectAll.spawn(event.ctx)\n },\n },\n}).createMachine({\n id: 'tapeDraw',\n initial: TapeDrawStateEnum.Idle,\n context: {\n activeTape: null,\n pointingStartClient: [0, 0] as [number, number],\n pointingStartWorld: [0, 0] as [number, number],\n },\n states: {\n [TapeDrawStateEnum.Idle]: {\n entry: 'resetContext',\n on: {\n pointerDown: [\n {\n actions: 'deselectAll',\n target: TapeDrawStateEnum.Pointing,\n },\n ],\n },\n },\n [TapeDrawStateEnum.Pointing]: {\n entry: 'setPointingStart',\n on: {\n pointerMove: {\n guard: 'isThresholdReached',\n target: TapeDrawStateEnum.Drawing,\n },\n pointerUp: {\n actions: ['placeTape'],\n target: TapeDrawStateEnum.Idle,\n },\n cancel: {\n target: TapeDrawStateEnum.Idle,\n },\n },\n },\n [TapeDrawStateEnum.Drawing]: {\n entry: 'addTape',\n exit: [],\n on: {\n pointerMove: {\n actions: 'drawTape',\n },\n pointerUp: {\n actions: 'completeTape',\n target: TapeDrawStateEnum.Idle,\n },\n cancel: {\n actions: 'removeTape',\n target: TapeDrawStateEnum.Idle,\n },\n },\n },\n },\n})\n\n/**\n * Capture tape draw system - runs the tape draw state machine.\n *\n * Runs in the capture phase to handle pointer events for the tape draw tool.\n * Generates commands that are processed by the update system.\n */\nexport const captureTapeDrawSystem = defineEditorSystem({ phase: 'capture', priority: 100 }, (ctx) => {\n // Get pointer buttons mapped to tape tool\n const buttons = Controls.getButtons(ctx, 'tape')\n\n // Skip if tape tool is not active\n if (buttons.length === 0) return\n\n // Get pointer events\n const events = getPointerInput(ctx, buttons)\n\n if (events.length === 0) return\n\n TapeDrawState.run(ctx, tapeDrawMachine, events)\n})\n","import {\n Asset,\n addComponent,\n Block,\n type Context,\n defineEditorSystem,\n type EntityId,\n Grid,\n Image,\n on,\n RankBounds,\n removeEntity,\n Synced,\n UploadState,\n} from '@woven-canvas/core'\nimport type { Vec2 } from '@woven-canvas/math'\nimport { selectBlock } from '@woven-canvas/plugin-selection'\nimport { AddTape, CompleteTape, DrawTape, PlaceTape, RemoveTape } from '../commands'\nimport { Tape } from '../components'\nimport { DEFAULT_TAPE_IMAGE, DEFAULT_TAPE_LENGTH, DEFAULT_TAPE_THICKNESS } from '../constants'\n\n/**\n * Update tape draw system - handles tape commands.\n *\n * Processes:\n * - AddTape: Create new tape entity at start position\n * - DrawTape: Update tape geometry as user drags\n * - RemoveTape: Delete tape entity\n * - CompleteTape: Finalize and select tape\n */\nexport const updateTapeDrawSystem = defineEditorSystem({ phase: 'update' }, (ctx: Context) => {\n on(ctx, AddTape, (ctx, { entityId, position }) => {\n addTape(ctx, entityId, position)\n })\n\n on(ctx, DrawTape, (ctx, { entityId, start, end }) => {\n drawTape(ctx, entityId, start, end)\n })\n\n on(ctx, RemoveTape, (ctx, { entityId }) => {\n removeEntity(ctx, entityId)\n })\n\n on(ctx, CompleteTape, (ctx, { entityId }) => {\n completeTape(ctx, entityId)\n })\n\n on(ctx, PlaceTape, (ctx, { entityId, position }) => {\n placeTape(ctx, entityId, position)\n })\n})\n\n/**\n * Create a new tape entity at the given position.\n */\nfunction addTape(ctx: Context, entityId: EntityId, position: Vec2): void {\n // Snap start position to grid\n const snappedPos: Vec2 = [position[0], position[1]]\n Grid.snapPosition(ctx, snappedPos)\n\n // Create block with minimal initial size (will be updated by drawTape)\n addComponent(ctx, entityId, Block, {\n tag: 'tape',\n rank: RankBounds.genNext(ctx),\n position: [snappedPos[0], snappedPos[1] - DEFAULT_TAPE_THICKNESS / 2],\n size: [1, DEFAULT_TAPE_THICKNESS],\n })\n\n addComponent(ctx, entityId, Synced, {\n id: crypto.randomUUID(),\n })\n\n addComponent(ctx, entityId, Tape)\n\n addComponent(ctx, entityId, Image, {})\n\n addComponent(ctx, entityId, Asset, {\n identifier: DEFAULT_TAPE_IMAGE,\n uploadState: UploadState.Complete,\n })\n}\n\n/**\n * Update tape geometry based on start and end positions.\n *\n * The tape stretches from the start point to the current cursor position.\n * Position is the midpoint, width is the distance, height is the thickness,\n * and rotation is derived from the angle between the two points.\n */\nfunction drawTape(ctx: Context, entityId: EntityId, start: Vec2, end: Vec2): void {\n // Snap both endpoints to grid\n const s: Vec2 = [start[0], start[1]]\n const e: Vec2 = [end[0], end[1]]\n Grid.snapPosition(ctx, s)\n Grid.snapPosition(ctx, e)\n\n const dx = e[0] - s[0]\n const dy = e[1] - s[1]\n const length = Math.sqrt(dx * dx + dy * dy)\n const angle = Math.atan2(dy, dx)\n\n // Midpoint between start and end\n const midX = (s[0] + e[0]) / 2\n const midY = (s[1] + e[1]) / 2\n\n const block = Block.write(ctx, entityId)\n const tape = Tape.read(ctx, entityId)\n const thickness = tape.thickness\n\n // Position is top-left corner of the unrotated bounding box centered on midpoint\n block.position = [midX - length / 2, midY - thickness / 2]\n block.size = [Math.max(length, 1), thickness]\n block.rotateZ = angle\n}\n\n/**\n * Place a default-sized tape at the given position (simple click).\n */\nfunction placeTape(ctx: Context, entityId: EntityId, position: Vec2): void {\n const snappedPos: Vec2 = [position[0], position[1]]\n Grid.snapPosition(ctx, snappedPos)\n\n addComponent(ctx, entityId, Block, {\n tag: 'tape',\n rank: RankBounds.genNext(ctx),\n position: [snappedPos[0] - DEFAULT_TAPE_LENGTH / 2, snappedPos[1] - DEFAULT_TAPE_THICKNESS / 2],\n size: [DEFAULT_TAPE_LENGTH, DEFAULT_TAPE_THICKNESS],\n })\n\n addComponent(ctx, entityId, Synced, {\n id: crypto.randomUUID(),\n })\n\n addComponent(ctx, entityId, Tape)\n\n addComponent(ctx, entityId, Image, {})\n\n addComponent(ctx, entityId, Asset, {\n identifier: DEFAULT_TAPE_IMAGE,\n uploadState: UploadState.Complete,\n })\n\n selectBlock(ctx, entityId)\n}\n\n/**\n * Complete tape drawing - select it.\n */\nfunction completeTape(ctx: Context, entityId: EntityId): void {\n // Check the tape has meaningful size\n const block = Block.read(ctx, entityId)\n if (block.size[0] <= 1) {\n // Too small - remove it\n removeEntity(ctx, entityId)\n return\n }\n\n selectBlock(ctx, entityId)\n}\n"],"mappings":"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","names":["import_core","import_core","import_core","import_core","import_core","import_plugin_selection","ctx"]}
package/build/index.js CHANGED
@@ -100,8 +100,8 @@ var tapeDrawMachine = setup({
100
100
  },
101
101
  guards: {
102
102
  isThresholdReached: ({ context, event }) => {
103
- const dist = Vec2.distance(context.pointingStartClient, event.screenPosition);
104
- return dist >= POINTING_THRESHOLD;
103
+ const worldDist = Vec2.distance(context.pointingStartWorld, event.worldPosition);
104
+ return worldDist * event.cameraZoom >= POINTING_THRESHOLD;
105
105
  }
106
106
  },
107
107
  actions: {
@@ -191,7 +191,7 @@ var tapeDrawMachine = setup({
191
191
  target: TapeDrawStateEnum.Drawing
192
192
  },
193
193
  pointerUp: {
194
- actions: ["placeTape", "exitTapeControl"],
194
+ actions: ["placeTape"],
195
195
  target: TapeDrawStateEnum.Idle
196
196
  },
197
197
  cancel: {
@@ -201,7 +201,7 @@ var tapeDrawMachine = setup({
201
201
  },
202
202
  [TapeDrawStateEnum.Drawing]: {
203
203
  entry: "addTape",
204
- exit: "exitTapeControl",
204
+ exit: [],
205
205
  on: {
206
206
  pointerMove: {
207
207
  actions: "drawTape"
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/tape.ts","../src/components/index.ts","../src/components/Tape.ts","../src/constants.ts","../src/singletons/index.ts","../src/singletons/TapeDrawState.ts","../src/types.ts","../src/TapesPlugin.ts","../src/systems/index.ts","../src/systems/captureTapeDrawSystem.ts","../src/systems/updateTapeDrawSystem.ts"],"sourcesContent":["import { defineCommand, type EntityId } from '@woven-canvas/core'\nimport type { Vec2 } from '@woven-canvas/math'\n\n/**\n * Add a new tape block at the given world position.\n */\nexport const AddTape = defineCommand<{\n entityId: EntityId\n position: Vec2\n}>('tape-add')\n\n/**\n * Update tape geometry during drawing.\n * Stretches tape from start to end position.\n */\nexport const DrawTape = defineCommand<{\n entityId: EntityId\n start: Vec2\n end: Vec2\n}>('tape-draw')\n\n/**\n * Remove a tape entity (on cancel).\n */\nexport const RemoveTape = defineCommand<{\n entityId: EntityId\n}>('tape-remove')\n\n/**\n * Complete drawing a tape.\n * Finalizes the tape and selects it.\n */\nexport const CompleteTape = defineCommand<{\n entityId: EntityId\n}>('tape-complete')\n\n/**\n * Place a default-sized tape at the given position (on simple click).\n */\nexport const PlaceTape = defineCommand<{\n entityId: EntityId\n position: Vec2\n}>('tape-place')\n","export { Tape } from './Tape'\n","import { defineCanvasComponent, field } from '@woven-canvas/core'\n\n/**\n * Tape component - stores tape-specific metadata for washi tape blocks.\n *\n * Tape is a ribbon-like element positioned by its two endpoints.\n * The block's width represents the tape length and height represents thickness.\n * Rotation is derived from the angle between endpoints.\n *\n * The tape image is stored via the Image and Asset components (same as image blocks).\n * For default tapes, the Asset identifier is set to the known URL directly —\n * AssetManager will return it as-is without going through the upload pipeline.\n * The image tiles horizontally along the tape length.\n */\nexport const Tape = defineCanvasComponent(\n { name: 'tape', sync: 'document' },\n {\n /** Tape thickness in world units (the height of the tape ribbon) */\n thickness: field.float64().default(30),\n },\n)\n","/** Plugin name identifier */\nexport const TAPES_PLUGIN_NAME = 'tapes'\n\n/** Default tape thickness in world units */\nexport const DEFAULT_TAPE_THICKNESS = 30\n\n/** Default tape length in world units (for click-to-place) */\nexport const DEFAULT_TAPE_LENGTH = 200\n\n/** Minimum distance (in screen pixels) before transitioning from Pointing to Drawing */\nexport const POINTING_THRESHOLD = 4\n\n/** Default tape image URL */\nexport const DEFAULT_TAPE_IMAGE =\n 'https://storage.googleapis.com/download/storage/v1/b/zine-maker-public/o/tapes%2F7e3b7dde-927d-4b09-aeb4-d49eac36d4ea.png?generation=1715183194653465&alt=media'\n","export { TapeDrawState } from './TapeDrawState'\n","import { defineEditorState, field } from '@woven-canvas/core'\nimport { TapeDrawStateEnum } from '../types'\n\n/**\n * Tape draw state singleton - stores the current state of the tape draw state machine.\n *\n * Tracks the drawing tool state and active tape entity while drawing new tape.\n */\nexport const TapeDrawState = defineEditorState('tapeDrawState', {\n /** Current state machine state */\n state: field.string().max(16).default(TapeDrawStateEnum.Idle),\n\n /** Reference to the active tape entity (while drawing) */\n activeTape: field.ref(),\n\n /** Pointing start position in client coordinates [x, y] */\n pointingStartClient: field.tuple(field.int32(), 2).default([0, 0]),\n\n /** Pointing start position in world coordinates [x, y] */\n pointingStartWorld: field.tuple(field.float64(), 2).default([0, 0]),\n})\n","/**\n * State values for the tape draw state machine.\n */\nexport const TapeDrawStateEnum = {\n /** Idle - waiting for user to start drawing */\n Idle: 'idle',\n /** Pointing - pointer down, waiting for drag threshold */\n Pointing: 'pointing',\n /** Drawing - tape created, stretching with pointer */\n Drawing: 'drawing',\n} as const\n\nexport type TapeDrawStateValue = (typeof TapeDrawStateEnum)[keyof typeof TapeDrawStateEnum]\n","import {\n Asset,\n CanvasComponentDef,\n CanvasSingletonDef,\n type EditorPlugin,\n type EditorPluginFactory,\n type EditorSystem,\n Image,\n ResizeMode,\n} from '@woven-canvas/core'\n\nimport * as components from './components'\nimport { TAPES_PLUGIN_NAME } from './constants'\nimport * as singletons from './singletons'\nimport * as systems from './systems'\n\n// Helper to filter EditorSystem instances from a namespace\nconst filterSystems = (ns: object): EditorSystem[] =>\n Object.values(ns).filter(\n (v): v is EditorSystem => typeof v === 'object' && v !== null && '_system' in v && 'phase' in v,\n )\n\n/**\n * Create a Tapes plugin.\n *\n * @returns Configured EditorPlugin\n */\nexport function createTapesPlugin(): EditorPlugin {\n return {\n name: TAPES_PLUGIN_NAME,\n\n dependencies: ['selection'],\n\n components: Object.values(components).filter((v) => v instanceof CanvasComponentDef),\n\n singletons: Object.values(singletons).filter((v) => v instanceof CanvasSingletonDef),\n\n blockDefs: [\n {\n tag: 'tape',\n components: [components.Tape, Image, Asset],\n resizeMode: ResizeMode.Scale,\n connectors: {\n enabled: false,\n },\n },\n ],\n\n systems: filterSystems(systems),\n }\n}\n\n/**\n * Tapes Plugin\n *\n * Provides washi tape drawing functionality for infinite canvas:\n * - Click and drag to draw tape across the canvas\n * - Tape stretches from start to end point with rotation\n * - Uses tiling tape texture images via Asset system\n * - RotateScale handles for repositioning tape endpoints\n *\n * @example\n * ```typescript\n * import { Editor } from '@woven-canvas/core';\n * import { TapesPlugin } from '@woven-canvas/plugin-tapes';\n *\n * const editor = new Editor(el, {\n * plugins: [TapesPlugin],\n * });\n * ```\n */\nexport const TapesPlugin: EditorPluginFactory = () => createTapesPlugin()\n","export { captureTapeDrawSystem } from './captureTapeDrawSystem'\nexport { updateTapeDrawSystem } from './updateTapeDrawSystem'\n","import {\n Controls,\n Cursor,\n createEntity,\n defineEditorSystem,\n type EntityId,\n getPointerInput,\n type InferStateContext,\n type PointerInput,\n} from '@woven-canvas/core'\nimport { Vec2 } from '@woven-canvas/math'\nimport { DeselectAll } from '@woven-canvas/plugin-selection'\nimport { assign, setup } from 'xstate'\nimport { AddTape, CompleteTape, DrawTape, PlaceTape, RemoveTape } from '../commands'\nimport { POINTING_THRESHOLD } from '../constants'\nimport { TapeDrawState } from '../singletons'\nimport { TapeDrawStateEnum } from '../types'\n\n/**\n * Tape draw state machine context - derived from TapeDrawState schema.\n */\ntype TapeDrawContext = InferStateContext<typeof TapeDrawState>\n\n/**\n * Tape draw state machine - handles pointer events for drawing new tape.\n *\n * Flow:\n * - Idle → pointerDown → Pointing (record start position)\n * - Pointing → pointerMove (past threshold) → Drawing (create tape entity)\n * - Drawing → pointerMove → update tape geometry\n * - Drawing → pointerUp → Idle (complete tape)\n * - Any → cancel → Idle (remove tape if exists)\n */\nconst tapeDrawMachine = setup({\n types: {\n context: {} as TapeDrawContext,\n events: {} as PointerInput,\n },\n guards: {\n isThresholdReached: ({ context, event }) => {\n const dist = Vec2.distance(context.pointingStartClient as [number, number], event.screenPosition)\n return dist >= POINTING_THRESHOLD\n },\n },\n actions: {\n setPointingStart: assign({\n pointingStartClient: ({ event }): [number, number] => [event.screenPosition[0], event.screenPosition[1]],\n pointingStartWorld: ({ event }): [number, number] => [event.worldPosition[0], event.worldPosition[1]],\n }),\n\n resetContext: assign({\n pointingStartClient: (): [number, number] => [0, 0],\n pointingStartWorld: (): [number, number] => [0, 0],\n activeTape: () => null,\n }),\n\n addTape: assign({\n activeTape: ({ context, event }): EntityId => {\n const startWorld = context.pointingStartWorld as [number, number]\n const entityId = createEntity(event.ctx)\n AddTape.spawn(event.ctx, {\n entityId,\n position: startWorld,\n })\n return entityId\n },\n }),\n\n drawTape: ({ context, event }) => {\n if (!context.activeTape) return\n const startWorld = context.pointingStartWorld as [number, number]\n DrawTape.spawn(event.ctx, {\n entityId: context.activeTape,\n start: startWorld,\n end: event.worldPosition,\n })\n },\n\n completeTape: ({ context, event }) => {\n if (!context.activeTape) return\n CompleteTape.spawn(event.ctx, { entityId: context.activeTape })\n },\n\n removeTape: assign({\n activeTape: ({ context, event }): EntityId | null => {\n if (!context.activeTape) return null\n RemoveTape.spawn(event.ctx, { entityId: context.activeTape })\n return null\n },\n }),\n\n placeTape: ({ context, event }) => {\n const startWorld = context.pointingStartWorld as [number, number]\n const entityId = createEntity(event.ctx)\n PlaceTape.spawn(event.ctx, {\n entityId,\n position: startWorld,\n })\n },\n\n exitTapeControl: ({ event }) => {\n const controls = Controls.write(event.ctx)\n controls.leftMouseTool = 'select'\n\n const cursor = Cursor.write(event.ctx)\n cursor.cursorKind = 'select'\n },\n\n deselectAll: ({ event }) => {\n DeselectAll.spawn(event.ctx)\n },\n },\n}).createMachine({\n id: 'tapeDraw',\n initial: TapeDrawStateEnum.Idle,\n context: {\n activeTape: null,\n pointingStartClient: [0, 0] as [number, number],\n pointingStartWorld: [0, 0] as [number, number],\n },\n states: {\n [TapeDrawStateEnum.Idle]: {\n entry: 'resetContext',\n on: {\n pointerDown: [\n {\n actions: 'deselectAll',\n target: TapeDrawStateEnum.Pointing,\n },\n ],\n },\n },\n [TapeDrawStateEnum.Pointing]: {\n entry: 'setPointingStart',\n on: {\n pointerMove: {\n guard: 'isThresholdReached',\n target: TapeDrawStateEnum.Drawing,\n },\n pointerUp: {\n actions: ['placeTape', 'exitTapeControl'],\n target: TapeDrawStateEnum.Idle,\n },\n cancel: {\n target: TapeDrawStateEnum.Idle,\n },\n },\n },\n [TapeDrawStateEnum.Drawing]: {\n entry: 'addTape',\n exit: 'exitTapeControl',\n on: {\n pointerMove: {\n actions: 'drawTape',\n },\n pointerUp: {\n actions: 'completeTape',\n target: TapeDrawStateEnum.Idle,\n },\n cancel: {\n actions: 'removeTape',\n target: TapeDrawStateEnum.Idle,\n },\n },\n },\n },\n})\n\n/**\n * Capture tape draw system - runs the tape draw state machine.\n *\n * Runs in the capture phase to handle pointer events for the tape draw tool.\n * Generates commands that are processed by the update system.\n */\nexport const captureTapeDrawSystem = defineEditorSystem({ phase: 'capture', priority: 100 }, (ctx) => {\n // Get pointer buttons mapped to tape tool\n const buttons = Controls.getButtons(ctx, 'tape')\n\n // Skip if tape tool is not active\n if (buttons.length === 0) return\n\n // Get pointer events\n const events = getPointerInput(ctx, buttons)\n\n if (events.length === 0) return\n\n TapeDrawState.run(ctx, tapeDrawMachine, events)\n})\n","import {\n Asset,\n addComponent,\n Block,\n type Context,\n defineEditorSystem,\n type EntityId,\n Grid,\n Image,\n on,\n RankBounds,\n removeEntity,\n Synced,\n UploadState,\n} from '@woven-canvas/core'\nimport type { Vec2 } from '@woven-canvas/math'\nimport { selectBlock } from '@woven-canvas/plugin-selection'\nimport { AddTape, CompleteTape, DrawTape, PlaceTape, RemoveTape } from '../commands'\nimport { Tape } from '../components'\nimport { DEFAULT_TAPE_IMAGE, DEFAULT_TAPE_LENGTH, DEFAULT_TAPE_THICKNESS } from '../constants'\n\n/**\n * Update tape draw system - handles tape commands.\n *\n * Processes:\n * - AddTape: Create new tape entity at start position\n * - DrawTape: Update tape geometry as user drags\n * - RemoveTape: Delete tape entity\n * - CompleteTape: Finalize and select tape\n */\nexport const updateTapeDrawSystem = defineEditorSystem({ phase: 'update' }, (ctx: Context) => {\n on(ctx, AddTape, (ctx, { entityId, position }) => {\n addTape(ctx, entityId, position)\n })\n\n on(ctx, DrawTape, (ctx, { entityId, start, end }) => {\n drawTape(ctx, entityId, start, end)\n })\n\n on(ctx, RemoveTape, (ctx, { entityId }) => {\n removeEntity(ctx, entityId)\n })\n\n on(ctx, CompleteTape, (ctx, { entityId }) => {\n completeTape(ctx, entityId)\n })\n\n on(ctx, PlaceTape, (ctx, { entityId, position }) => {\n placeTape(ctx, entityId, position)\n })\n})\n\n/**\n * Create a new tape entity at the given position.\n */\nfunction addTape(ctx: Context, entityId: EntityId, position: Vec2): void {\n // Snap start position to grid\n const snappedPos: Vec2 = [position[0], position[1]]\n Grid.snapPosition(ctx, snappedPos)\n\n // Create block with minimal initial size (will be updated by drawTape)\n addComponent(ctx, entityId, Block, {\n tag: 'tape',\n rank: RankBounds.genNext(ctx),\n position: [snappedPos[0], snappedPos[1] - DEFAULT_TAPE_THICKNESS / 2],\n size: [1, DEFAULT_TAPE_THICKNESS],\n })\n\n addComponent(ctx, entityId, Synced, {\n id: crypto.randomUUID(),\n })\n\n addComponent(ctx, entityId, Tape)\n\n addComponent(ctx, entityId, Image, {})\n\n addComponent(ctx, entityId, Asset, {\n identifier: DEFAULT_TAPE_IMAGE,\n uploadState: UploadState.Complete,\n })\n}\n\n/**\n * Update tape geometry based on start and end positions.\n *\n * The tape stretches from the start point to the current cursor position.\n * Position is the midpoint, width is the distance, height is the thickness,\n * and rotation is derived from the angle between the two points.\n */\nfunction drawTape(ctx: Context, entityId: EntityId, start: Vec2, end: Vec2): void {\n // Snap both endpoints to grid\n const s: Vec2 = [start[0], start[1]]\n const e: Vec2 = [end[0], end[1]]\n Grid.snapPosition(ctx, s)\n Grid.snapPosition(ctx, e)\n\n const dx = e[0] - s[0]\n const dy = e[1] - s[1]\n const length = Math.sqrt(dx * dx + dy * dy)\n const angle = Math.atan2(dy, dx)\n\n // Midpoint between start and end\n const midX = (s[0] + e[0]) / 2\n const midY = (s[1] + e[1]) / 2\n\n const block = Block.write(ctx, entityId)\n const tape = Tape.read(ctx, entityId)\n const thickness = tape.thickness\n\n // Position is top-left corner of the unrotated bounding box centered on midpoint\n block.position = [midX - length / 2, midY - thickness / 2]\n block.size = [Math.max(length, 1), thickness]\n block.rotateZ = angle\n}\n\n/**\n * Place a default-sized tape at the given position (simple click).\n */\nfunction placeTape(ctx: Context, entityId: EntityId, position: Vec2): void {\n const snappedPos: Vec2 = [position[0], position[1]]\n Grid.snapPosition(ctx, snappedPos)\n\n addComponent(ctx, entityId, Block, {\n tag: 'tape',\n rank: RankBounds.genNext(ctx),\n position: [snappedPos[0] - DEFAULT_TAPE_LENGTH / 2, snappedPos[1] - DEFAULT_TAPE_THICKNESS / 2],\n size: [DEFAULT_TAPE_LENGTH, DEFAULT_TAPE_THICKNESS],\n })\n\n addComponent(ctx, entityId, Synced, {\n id: crypto.randomUUID(),\n })\n\n addComponent(ctx, entityId, Tape)\n\n addComponent(ctx, entityId, Image, {})\n\n addComponent(ctx, entityId, Asset, {\n identifier: DEFAULT_TAPE_IMAGE,\n uploadState: UploadState.Complete,\n })\n\n selectBlock(ctx, entityId)\n}\n\n/**\n * Complete tape drawing - select it.\n */\nfunction completeTape(ctx: Context, entityId: EntityId): void {\n // Check the tape has meaningful size\n const block = Block.read(ctx, entityId)\n if (block.size[0] <= 1) {\n // Too small - remove it\n removeEntity(ctx, entityId)\n return\n }\n\n selectBlock(ctx, entityId)\n}\n"],"mappings":"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","names":["field","field","Asset","Image","defineEditorSystem","defineEditorSystem","ctx","Image","Asset"]}
1
+ {"version":3,"sources":["../src/commands/tape.ts","../src/components/index.ts","../src/components/Tape.ts","../src/constants.ts","../src/singletons/index.ts","../src/singletons/TapeDrawState.ts","../src/types.ts","../src/TapesPlugin.ts","../src/systems/index.ts","../src/systems/captureTapeDrawSystem.ts","../src/systems/updateTapeDrawSystem.ts"],"sourcesContent":["import { defineCommand, type EntityId } from '@woven-canvas/core'\nimport type { Vec2 } from '@woven-canvas/math'\n\n/**\n * Add a new tape block at the given world position.\n */\nexport const AddTape = defineCommand<{\n entityId: EntityId\n position: Vec2\n}>('tape-add')\n\n/**\n * Update tape geometry during drawing.\n * Stretches tape from start to end position.\n */\nexport const DrawTape = defineCommand<{\n entityId: EntityId\n start: Vec2\n end: Vec2\n}>('tape-draw')\n\n/**\n * Remove a tape entity (on cancel).\n */\nexport const RemoveTape = defineCommand<{\n entityId: EntityId\n}>('tape-remove')\n\n/**\n * Complete drawing a tape.\n * Finalizes the tape and selects it.\n */\nexport const CompleteTape = defineCommand<{\n entityId: EntityId\n}>('tape-complete')\n\n/**\n * Place a default-sized tape at the given position (on simple click).\n */\nexport const PlaceTape = defineCommand<{\n entityId: EntityId\n position: Vec2\n}>('tape-place')\n","export { Tape } from './Tape'\n","import { defineCanvasComponent, field } from '@woven-canvas/core'\n\n/**\n * Tape component - stores tape-specific metadata for washi tape blocks.\n *\n * Tape is a ribbon-like element positioned by its two endpoints.\n * The block's width represents the tape length and height represents thickness.\n * Rotation is derived from the angle between endpoints.\n *\n * The tape image is stored via the Image and Asset components (same as image blocks).\n * For default tapes, the Asset identifier is set to the known URL directly —\n * AssetManager will return it as-is without going through the upload pipeline.\n * The image tiles horizontally along the tape length.\n */\nexport const Tape = defineCanvasComponent(\n { name: 'tape', sync: 'document' },\n {\n /** Tape thickness in world units (the height of the tape ribbon) */\n thickness: field.float64().default(30),\n },\n)\n","/** Plugin name identifier */\nexport const TAPES_PLUGIN_NAME = 'tapes'\n\n/** Default tape thickness in world units */\nexport const DEFAULT_TAPE_THICKNESS = 30\n\n/** Default tape length in world units (for click-to-place) */\nexport const DEFAULT_TAPE_LENGTH = 200\n\n/** Minimum distance (in screen pixels) before transitioning from Pointing to Drawing */\nexport const POINTING_THRESHOLD = 4\n\n/** Default tape image URL */\nexport const DEFAULT_TAPE_IMAGE =\n 'https://storage.googleapis.com/download/storage/v1/b/zine-maker-public/o/tapes%2F7e3b7dde-927d-4b09-aeb4-d49eac36d4ea.png?generation=1715183194653465&alt=media'\n","export { TapeDrawState } from './TapeDrawState'\n","import { defineEditorState, field } from '@woven-canvas/core'\nimport { TapeDrawStateEnum } from '../types'\n\n/**\n * Tape draw state singleton - stores the current state of the tape draw state machine.\n *\n * Tracks the drawing tool state and active tape entity while drawing new tape.\n */\nexport const TapeDrawState = defineEditorState('tapeDrawState', {\n /** Current state machine state */\n state: field.string().max(16).default(TapeDrawStateEnum.Idle),\n\n /** Reference to the active tape entity (while drawing) */\n activeTape: field.ref(),\n\n /** Pointing start position in client coordinates [x, y] */\n pointingStartClient: field.tuple(field.int32(), 2).default([0, 0]),\n\n /** Pointing start position in world coordinates [x, y] */\n pointingStartWorld: field.tuple(field.float64(), 2).default([0, 0]),\n})\n","/**\n * State values for the tape draw state machine.\n */\nexport const TapeDrawStateEnum = {\n /** Idle - waiting for user to start drawing */\n Idle: 'idle',\n /** Pointing - pointer down, waiting for drag threshold */\n Pointing: 'pointing',\n /** Drawing - tape created, stretching with pointer */\n Drawing: 'drawing',\n} as const\n\nexport type TapeDrawStateValue = (typeof TapeDrawStateEnum)[keyof typeof TapeDrawStateEnum]\n","import {\n Asset,\n CanvasComponentDef,\n CanvasSingletonDef,\n type EditorPlugin,\n type EditorPluginFactory,\n type EditorSystem,\n Image,\n ResizeMode,\n} from '@woven-canvas/core'\n\nimport * as components from './components'\nimport { TAPES_PLUGIN_NAME } from './constants'\nimport * as singletons from './singletons'\nimport * as systems from './systems'\n\n// Helper to filter EditorSystem instances from a namespace\nconst filterSystems = (ns: object): EditorSystem[] =>\n Object.values(ns).filter(\n (v): v is EditorSystem => typeof v === 'object' && v !== null && '_system' in v && 'phase' in v,\n )\n\n/**\n * Create a Tapes plugin.\n *\n * @returns Configured EditorPlugin\n */\nexport function createTapesPlugin(): EditorPlugin {\n return {\n name: TAPES_PLUGIN_NAME,\n\n dependencies: ['selection'],\n\n components: Object.values(components).filter((v) => v instanceof CanvasComponentDef),\n\n singletons: Object.values(singletons).filter((v) => v instanceof CanvasSingletonDef),\n\n blockDefs: [\n {\n tag: 'tape',\n components: [components.Tape, Image, Asset],\n resizeMode: ResizeMode.Scale,\n connectors: {\n enabled: false,\n },\n },\n ],\n\n systems: filterSystems(systems),\n }\n}\n\n/**\n * Tapes Plugin\n *\n * Provides washi tape drawing functionality for infinite canvas:\n * - Click and drag to draw tape across the canvas\n * - Tape stretches from start to end point with rotation\n * - Uses tiling tape texture images via Asset system\n * - RotateScale handles for repositioning tape endpoints\n *\n * @example\n * ```typescript\n * import { Editor } from '@woven-canvas/core';\n * import { TapesPlugin } from '@woven-canvas/plugin-tapes';\n *\n * const editor = new Editor(el, {\n * plugins: [TapesPlugin],\n * });\n * ```\n */\nexport const TapesPlugin: EditorPluginFactory = () => createTapesPlugin()\n","export { captureTapeDrawSystem } from './captureTapeDrawSystem'\nexport { updateTapeDrawSystem } from './updateTapeDrawSystem'\n","import {\n Controls,\n Cursor,\n createEntity,\n defineEditorSystem,\n type EntityId,\n getPointerInput,\n type InferStateContext,\n type PointerInput,\n} from '@woven-canvas/core'\nimport { Vec2 } from '@woven-canvas/math'\nimport { DeselectAll } from '@woven-canvas/plugin-selection'\nimport { assign, setup } from 'xstate'\nimport { AddTape, CompleteTape, DrawTape, PlaceTape, RemoveTape } from '../commands'\nimport { POINTING_THRESHOLD } from '../constants'\nimport { TapeDrawState } from '../singletons'\nimport { TapeDrawStateEnum } from '../types'\n\n/**\n * Tape draw state machine context - derived from TapeDrawState schema.\n */\ntype TapeDrawContext = InferStateContext<typeof TapeDrawState>\n\n/**\n * Tape draw state machine - handles pointer events for drawing new tape.\n *\n * Flow:\n * - Idle → pointerDown → Pointing (record start position)\n * - Pointing → pointerMove (past threshold) → Drawing (create tape entity)\n * - Drawing → pointerMove → update tape geometry\n * - Drawing → pointerUp → Idle (complete tape)\n * - Any → cancel → Idle (remove tape if exists)\n */\nconst tapeDrawMachine = setup({\n types: {\n context: {} as TapeDrawContext,\n events: {} as PointerInput,\n },\n guards: {\n isThresholdReached: ({ context, event }) => {\n const worldDist = Vec2.distance(context.pointingStartWorld as [number, number], event.worldPosition)\n return worldDist * event.cameraZoom >= POINTING_THRESHOLD\n },\n },\n actions: {\n setPointingStart: assign({\n pointingStartClient: ({ event }): [number, number] => [event.screenPosition[0], event.screenPosition[1]],\n pointingStartWorld: ({ event }): [number, number] => [event.worldPosition[0], event.worldPosition[1]],\n }),\n\n resetContext: assign({\n pointingStartClient: (): [number, number] => [0, 0],\n pointingStartWorld: (): [number, number] => [0, 0],\n activeTape: () => null,\n }),\n\n addTape: assign({\n activeTape: ({ context, event }): EntityId => {\n const startWorld = context.pointingStartWorld as [number, number]\n const entityId = createEntity(event.ctx)\n AddTape.spawn(event.ctx, {\n entityId,\n position: startWorld,\n })\n return entityId\n },\n }),\n\n drawTape: ({ context, event }) => {\n if (!context.activeTape) return\n const startWorld = context.pointingStartWorld as [number, number]\n DrawTape.spawn(event.ctx, {\n entityId: context.activeTape,\n start: startWorld,\n end: event.worldPosition,\n })\n },\n\n completeTape: ({ context, event }) => {\n if (!context.activeTape) return\n CompleteTape.spawn(event.ctx, { entityId: context.activeTape })\n },\n\n removeTape: assign({\n activeTape: ({ context, event }): EntityId | null => {\n if (!context.activeTape) return null\n RemoveTape.spawn(event.ctx, { entityId: context.activeTape })\n return null\n },\n }),\n\n placeTape: ({ context, event }) => {\n const startWorld = context.pointingStartWorld as [number, number]\n const entityId = createEntity(event.ctx)\n PlaceTape.spawn(event.ctx, {\n entityId,\n position: startWorld,\n })\n },\n\n exitTapeControl: ({ event }) => {\n const controls = Controls.write(event.ctx)\n controls.leftMouseTool = 'select'\n\n const cursor = Cursor.write(event.ctx)\n cursor.cursorKind = 'select'\n },\n\n deselectAll: ({ event }) => {\n DeselectAll.spawn(event.ctx)\n },\n },\n}).createMachine({\n id: 'tapeDraw',\n initial: TapeDrawStateEnum.Idle,\n context: {\n activeTape: null,\n pointingStartClient: [0, 0] as [number, number],\n pointingStartWorld: [0, 0] as [number, number],\n },\n states: {\n [TapeDrawStateEnum.Idle]: {\n entry: 'resetContext',\n on: {\n pointerDown: [\n {\n actions: 'deselectAll',\n target: TapeDrawStateEnum.Pointing,\n },\n ],\n },\n },\n [TapeDrawStateEnum.Pointing]: {\n entry: 'setPointingStart',\n on: {\n pointerMove: {\n guard: 'isThresholdReached',\n target: TapeDrawStateEnum.Drawing,\n },\n pointerUp: {\n actions: ['placeTape'],\n target: TapeDrawStateEnum.Idle,\n },\n cancel: {\n target: TapeDrawStateEnum.Idle,\n },\n },\n },\n [TapeDrawStateEnum.Drawing]: {\n entry: 'addTape',\n exit: [],\n on: {\n pointerMove: {\n actions: 'drawTape',\n },\n pointerUp: {\n actions: 'completeTape',\n target: TapeDrawStateEnum.Idle,\n },\n cancel: {\n actions: 'removeTape',\n target: TapeDrawStateEnum.Idle,\n },\n },\n },\n },\n})\n\n/**\n * Capture tape draw system - runs the tape draw state machine.\n *\n * Runs in the capture phase to handle pointer events for the tape draw tool.\n * Generates commands that are processed by the update system.\n */\nexport const captureTapeDrawSystem = defineEditorSystem({ phase: 'capture', priority: 100 }, (ctx) => {\n // Get pointer buttons mapped to tape tool\n const buttons = Controls.getButtons(ctx, 'tape')\n\n // Skip if tape tool is not active\n if (buttons.length === 0) return\n\n // Get pointer events\n const events = getPointerInput(ctx, buttons)\n\n if (events.length === 0) return\n\n TapeDrawState.run(ctx, tapeDrawMachine, events)\n})\n","import {\n Asset,\n addComponent,\n Block,\n type Context,\n defineEditorSystem,\n type EntityId,\n Grid,\n Image,\n on,\n RankBounds,\n removeEntity,\n Synced,\n UploadState,\n} from '@woven-canvas/core'\nimport type { Vec2 } from '@woven-canvas/math'\nimport { selectBlock } from '@woven-canvas/plugin-selection'\nimport { AddTape, CompleteTape, DrawTape, PlaceTape, RemoveTape } from '../commands'\nimport { Tape } from '../components'\nimport { DEFAULT_TAPE_IMAGE, DEFAULT_TAPE_LENGTH, DEFAULT_TAPE_THICKNESS } from '../constants'\n\n/**\n * Update tape draw system - handles tape commands.\n *\n * Processes:\n * - AddTape: Create new tape entity at start position\n * - DrawTape: Update tape geometry as user drags\n * - RemoveTape: Delete tape entity\n * - CompleteTape: Finalize and select tape\n */\nexport const updateTapeDrawSystem = defineEditorSystem({ phase: 'update' }, (ctx: Context) => {\n on(ctx, AddTape, (ctx, { entityId, position }) => {\n addTape(ctx, entityId, position)\n })\n\n on(ctx, DrawTape, (ctx, { entityId, start, end }) => {\n drawTape(ctx, entityId, start, end)\n })\n\n on(ctx, RemoveTape, (ctx, { entityId }) => {\n removeEntity(ctx, entityId)\n })\n\n on(ctx, CompleteTape, (ctx, { entityId }) => {\n completeTape(ctx, entityId)\n })\n\n on(ctx, PlaceTape, (ctx, { entityId, position }) => {\n placeTape(ctx, entityId, position)\n })\n})\n\n/**\n * Create a new tape entity at the given position.\n */\nfunction addTape(ctx: Context, entityId: EntityId, position: Vec2): void {\n // Snap start position to grid\n const snappedPos: Vec2 = [position[0], position[1]]\n Grid.snapPosition(ctx, snappedPos)\n\n // Create block with minimal initial size (will be updated by drawTape)\n addComponent(ctx, entityId, Block, {\n tag: 'tape',\n rank: RankBounds.genNext(ctx),\n position: [snappedPos[0], snappedPos[1] - DEFAULT_TAPE_THICKNESS / 2],\n size: [1, DEFAULT_TAPE_THICKNESS],\n })\n\n addComponent(ctx, entityId, Synced, {\n id: crypto.randomUUID(),\n })\n\n addComponent(ctx, entityId, Tape)\n\n addComponent(ctx, entityId, Image, {})\n\n addComponent(ctx, entityId, Asset, {\n identifier: DEFAULT_TAPE_IMAGE,\n uploadState: UploadState.Complete,\n })\n}\n\n/**\n * Update tape geometry based on start and end positions.\n *\n * The tape stretches from the start point to the current cursor position.\n * Position is the midpoint, width is the distance, height is the thickness,\n * and rotation is derived from the angle between the two points.\n */\nfunction drawTape(ctx: Context, entityId: EntityId, start: Vec2, end: Vec2): void {\n // Snap both endpoints to grid\n const s: Vec2 = [start[0], start[1]]\n const e: Vec2 = [end[0], end[1]]\n Grid.snapPosition(ctx, s)\n Grid.snapPosition(ctx, e)\n\n const dx = e[0] - s[0]\n const dy = e[1] - s[1]\n const length = Math.sqrt(dx * dx + dy * dy)\n const angle = Math.atan2(dy, dx)\n\n // Midpoint between start and end\n const midX = (s[0] + e[0]) / 2\n const midY = (s[1] + e[1]) / 2\n\n const block = Block.write(ctx, entityId)\n const tape = Tape.read(ctx, entityId)\n const thickness = tape.thickness\n\n // Position is top-left corner of the unrotated bounding box centered on midpoint\n block.position = [midX - length / 2, midY - thickness / 2]\n block.size = [Math.max(length, 1), thickness]\n block.rotateZ = angle\n}\n\n/**\n * Place a default-sized tape at the given position (simple click).\n */\nfunction placeTape(ctx: Context, entityId: EntityId, position: Vec2): void {\n const snappedPos: Vec2 = [position[0], position[1]]\n Grid.snapPosition(ctx, snappedPos)\n\n addComponent(ctx, entityId, Block, {\n tag: 'tape',\n rank: RankBounds.genNext(ctx),\n position: [snappedPos[0] - DEFAULT_TAPE_LENGTH / 2, snappedPos[1] - DEFAULT_TAPE_THICKNESS / 2],\n size: [DEFAULT_TAPE_LENGTH, DEFAULT_TAPE_THICKNESS],\n })\n\n addComponent(ctx, entityId, Synced, {\n id: crypto.randomUUID(),\n })\n\n addComponent(ctx, entityId, Tape)\n\n addComponent(ctx, entityId, Image, {})\n\n addComponent(ctx, entityId, Asset, {\n identifier: DEFAULT_TAPE_IMAGE,\n uploadState: UploadState.Complete,\n })\n\n selectBlock(ctx, entityId)\n}\n\n/**\n * Complete tape drawing - select it.\n */\nfunction completeTape(ctx: Context, entityId: EntityId): void {\n // Check the tape has meaningful size\n const block = Block.read(ctx, entityId)\n if (block.size[0] <= 1) {\n // Too small - remove it\n removeEntity(ctx, entityId)\n return\n }\n\n selectBlock(ctx, entityId)\n}\n"],"mappings":"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","names":["field","field","Asset","Image","defineEditorSystem","defineEditorSystem","ctx","Image","Asset"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@woven-canvas/plugin-tapes",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "Tape plugin - draw washi tape with click-and-drag for infinite canvas",
5
5
  "repository": {
6
6
  "type": "git",
@@ -40,16 +40,16 @@
40
40
  "peerDependencies": {
41
41
  "typescript": "^5.9.3",
42
42
  "xstate": "^5.24.0",
43
- "@woven-canvas/math": "^1.0.1",
44
- "@woven-canvas/core": "^1.0.1",
45
- "@woven-canvas/plugin-selection": "^1.0.1"
43
+ "@woven-canvas/core": "^1.0.3",
44
+ "@woven-canvas/math": "^1.0.2",
45
+ "@woven-canvas/plugin-selection": "^1.0.3"
46
46
  },
47
47
  "scripts": {
48
48
  "clean": "rimraf build .turbo",
49
49
  "build": "tsup ./src/index.ts --tsconfig ./tsconfig.build.json --config ../../tsup.config.ts",
50
50
  "build:watch": "pnpm build --watch",
51
51
  "check:exports": "attw --pack .",
52
- "test": "vitest --config ../../vitest.config.ts run",
52
+ "test": "vitest --config ../../vitest.config.ts run --passWithNoTests",
53
53
  "test:watch": "vitest --config ../../vitest.config.ts run --watch"
54
54
  }
55
55
  }
@@ -1 +0,0 @@
1
- {"fileNames":["../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2023.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2023.array.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2023.collection.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2023.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.collection.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.object.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.regexp.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2024.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.array.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.collection.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.decorators.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.iterator.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.float16.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.error.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../math/src/vec2.ts","../../math/src/aabb.ts","../../math/src/arc.ts","../../math/src/capsule.ts","../../math/src/mat2.ts","../../math/src/rect.ts","../../math/src/ray.ts","../../math/src/scalar.ts","../../math/src/index.ts","../../../node_modules/.pnpm/@woven-ecs+core@1.0.4_typescript@5.9.3/node_modules/@woven-ecs/core/build/_tsup-dts-rollup.d.ts","../../../node_modules/.pnpm/@woven-ecs+core@1.0.4_typescript@5.9.3/node_modules/@woven-ecs/core/build/index.d.ts","../../../node_modules/.pnpm/idb@8.0.3/node_modules/idb/build/wrap-idb-value.d.ts","../../../node_modules/.pnpm/idb@8.0.3/node_modules/idb/build/entry.d.ts","../../../node_modules/.pnpm/idb@8.0.3/node_modules/idb/build/database-extras.d.ts","../../../node_modules/.pnpm/idb@8.0.3/node_modules/idb/build/async-iterators.d.ts","../../../node_modules/.pnpm/idb@8.0.3/node_modules/idb/build/index.d.ts","../../../node_modules/.pnpm/@woven-ecs+canvas-store@1.0.8_typescript@5.9.3/node_modules/@woven-ecs/canvas-store/build/_tsup-dts-rollup.d.ts","../../../node_modules/.pnpm/@woven-ecs+canvas-store@1.0.8_typescript@5.9.3/node_modules/@woven-ecs/canvas-store/build/index.d.ts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/json-schema.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/standard-schema.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/registries.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/to-json-schema.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/util.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/versions.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/schemas.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/checks.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/errors.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/core.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/parse.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/regexes.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/ar.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/az.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/be.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/bg.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/ca.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/cs.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/da.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/de.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/en.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/eo.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/es.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/fa.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/fi.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/fr.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/fr-ca.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/he.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/hu.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/hy.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/id.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/is.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/it.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/ja.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/ka.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/kh.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/km.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/ko.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/lt.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/mk.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/ms.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/nl.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/no.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/ota.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/ps.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/pl.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/pt.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/ru.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/sl.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/sv.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/ta.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/th.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/tr.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/ua.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/uk.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/ur.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/uz.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/vi.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/zh-cn.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/zh-tw.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/yo.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/locales/index.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/doc.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/api.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/json-schema-processors.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/json-schema-generator.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/index.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/classic/errors.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/classic/parse.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/classic/schemas.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/classic/checks.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/classic/compat.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/classic/from-json-schema.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/classic/iso.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/classic/coerce.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/classic/external.d.cts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/index.d.cts","../../core/src/command.ts","../../core/src/editorsystem.ts","../../core/src/fontloader.ts","../../core/src/plugin.ts","../../core/src/singletons/screen.ts","../../core/src/singletons/camera.ts","../../core/src/singletons/controls.ts","../../core/src/singletons/cursor.ts","../../core/src/singletons/frame.ts","../../core/src/singletons/grid.ts","../../core/src/singletons/intersect.ts","../../core/src/singletons/keyboard.ts","../../core/src/singletons/mouse.ts","../../../node_modules/.pnpm/fractional-indexing-jittered@1.0.0/node_modules/fractional-indexing-jittered/lib/index.d.ts","../../core/src/singletons/rankbounds.ts","../../core/src/singletons/scalewithzoomstate.ts","../../core/src/singletons/index.ts","../../core/src/systems/input/framesystem.ts","../../core/src/systems/input/keyboardsystem.ts","../../core/src/systems/input/mousesystem.ts","../../core/src/components/pointer.ts","../../core/src/systems/input/pointersystem.ts","../../core/src/systems/input/screensystem.ts","../../core/src/systems/input/index.ts","../../core/src/editor.ts","../../core/src/types.ts","../../core/src/components/block.ts","../../core/src/components/aabb.ts","../../core/src/components/asset.ts","../../core/src/components/color.ts","../../core/src/components/connector.ts","../../core/src/components/edited.ts","../../core/src/components/embed.ts","../../core/src/components/held.ts","../../core/src/components/hitgeometry.ts","../../core/src/components/hovered.ts","../../core/src/components/image.ts","../../core/src/components/opacity.ts","../../core/src/components/scalewithzoom.ts","../../core/src/components/shape.ts","../../core/src/components/text.ts","../../core/src/components/user.ts","../../core/src/components/verticalalign.ts","../../core/src/components/index.ts","../../core/src/constants.ts","../../core/src/systems/capture/keybindsystem.ts","../../core/src/systems/capture/index.ts","../../core/src/systems/postrender/cursorsystem.ts","../../core/src/helpers/blockdefs.ts","../../core/src/helpers/computeaabb.ts","../../core/src/helpers/embed.ts","../../core/src/helpers/held.ts","../../core/src/helpers/intersect.ts","../../core/src/helpers/intersectcapsule.ts","../../core/src/helpers/user.ts","../../core/src/helpers/index.ts","../../core/src/systems/postrender/presencesystem.ts","../../core/src/systems/postrender/index.ts","../../core/src/systems/precapture/intersectsystem.ts","../../core/src/systems/precapture/index.ts","../../core/src/systems/preinput/rankboundssystem.ts","../../core/src/systems/preinput/index.ts","../../core/src/systems/prerender/canseeblockssystem.ts","../../core/src/systems/prerender/scalewithzoomsystem.ts","../../core/src/systems/prerender/index.ts","../../core/src/coreplugin.ts","../../../node_modules/.pnpm/xstate@5.28.0/node_modules/xstate/dist/declarations/src/inspection.d.ts","../../../node_modules/.pnpm/xstate@5.28.0/node_modules/xstate/dist/declarations/src/system.d.ts","../../../node_modules/.pnpm/xstate@5.28.0/node_modules/xstate/dist/declarations/src/statemachine.d.ts","../../../node_modules/.pnpm/xstate@5.28.0/node_modules/xstate/dist/declarations/src/statenode.d.ts","../../../node_modules/.pnpm/xstate@5.28.0/node_modules/xstate/dist/declarations/src/state.d.ts","../../../node_modules/.pnpm/xstate@5.28.0/node_modules/xstate/dist/declarations/src/actions/raise.d.ts","../../../node_modules/.pnpm/xstate@5.28.0/node_modules/xstate/dist/declarations/src/actions/send.d.ts","../../../node_modules/.pnpm/xstate@5.28.0/node_modules/xstate/dist/declarations/src/actors/promise.d.ts","../../../node_modules/.pnpm/xstate@5.28.0/node_modules/xstate/dist/declarations/src/symbolobservable.d.ts","../../../node_modules/.pnpm/xstate@5.28.0/node_modules/xstate/dist/declarations/src/createactor.d.ts","../../../node_modules/.pnpm/xstate@5.28.0/node_modules/xstate/dist/declarations/src/guards.d.ts","../../../node_modules/.pnpm/xstate@5.28.0/node_modules/xstate/dist/declarations/src/types.d.ts","../../../node_modules/.pnpm/xstate@5.28.0/node_modules/xstate/dist/declarations/src/spawn.d.ts","../../../node_modules/.pnpm/xstate@5.28.0/node_modules/xstate/dist/declarations/src/actions/assign.d.ts","../../../node_modules/.pnpm/xstate@5.28.0/node_modules/xstate/dist/declarations/src/actions/cancel.d.ts","../../../node_modules/.pnpm/xstate@5.28.0/node_modules/xstate/dist/declarations/src/actions/emit.d.ts","../../../node_modules/.pnpm/xstate@5.28.0/node_modules/xstate/dist/declarations/src/actions/spawnchild.d.ts","../../../node_modules/.pnpm/xstate@5.28.0/node_modules/xstate/dist/declarations/src/actions/stopchild.d.ts","../../../node_modules/.pnpm/xstate@5.28.0/node_modules/xstate/dist/declarations/src/actions/enqueueactions.d.ts","../../../node_modules/.pnpm/xstate@5.28.0/node_modules/xstate/dist/declarations/src/actions/log.d.ts","../../../node_modules/.pnpm/xstate@5.28.0/node_modules/xstate/dist/declarations/src/actions.d.ts","../../../node_modules/.pnpm/xstate@5.28.0/node_modules/xstate/dist/declarations/src/actors/callback.d.ts","../../../node_modules/.pnpm/xstate@5.28.0/node_modules/xstate/dist/declarations/src/actors/observable.d.ts","../../../node_modules/.pnpm/xstate@5.28.0/node_modules/xstate/dist/declarations/src/actors/transition.d.ts","../../../node_modules/.pnpm/xstate@5.28.0/node_modules/xstate/dist/declarations/src/actors/index.d.ts","../../../node_modules/.pnpm/xstate@5.28.0/node_modules/xstate/dist/declarations/src/assert.d.ts","../../../node_modules/.pnpm/xstate@5.28.0/node_modules/xstate/dist/declarations/src/createmachine.d.ts","../../../node_modules/.pnpm/xstate@5.28.0/node_modules/xstate/dist/declarations/src/getnextsnapshot.d.ts","../../../node_modules/.pnpm/xstate@5.28.0/node_modules/xstate/dist/declarations/src/setup.d.ts","../../../node_modules/.pnpm/xstate@5.28.0/node_modules/xstate/dist/declarations/src/simulatedclock.d.ts","../../../node_modules/.pnpm/xstate@5.28.0/node_modules/xstate/dist/declarations/src/stateutils.d.ts","../../../node_modules/.pnpm/xstate@5.28.0/node_modules/xstate/dist/declarations/src/topromise.d.ts","../../../node_modules/.pnpm/xstate@5.28.0/node_modules/xstate/dist/declarations/src/utils.d.ts","../../../node_modules/.pnpm/xstate@5.28.0/node_modules/xstate/dist/declarations/src/transition.d.ts","../../../node_modules/.pnpm/xstate@5.28.0/node_modules/xstate/dist/declarations/src/waitfor.d.ts","../../../node_modules/.pnpm/xstate@5.28.0/node_modules/xstate/dist/declarations/src/index.d.ts","../../../node_modules/.pnpm/xstate@5.28.0/node_modules/xstate/dist/xstate.cjs.d.mts","../../core/src/machine.ts","../../core/src/editorstatedef.ts","../../core/src/events/types.ts","../../core/src/events/frameinputevents.ts","../../core/src/events/keyboardinputevents.ts","../../core/src/events/mouseinputevents.ts","../../core/src/events/pointerinputevents.ts","../../core/src/events/index.ts","../../core/src/index.ts","../src/components/tape.ts","../src/components/index.ts","../src/constants.ts","../src/types.ts","../src/singletons/tapedrawstate.ts","../src/singletons/index.ts","../../plugin-selection/src/commands/blocks.ts","../../plugin-selection/src/commands/clipboard.ts","../../plugin-selection/src/commands/selection.ts","../../plugin-selection/src/commands/transformbox.ts","../../plugin-selection/src/commands/index.ts","../../plugin-selection/src/components/dragstart.ts","../../plugin-selection/src/components/editafterplacing.ts","../../plugin-selection/src/components/selected.ts","../../plugin-selection/src/components/selectionbox.ts","../../plugin-selection/src/components/transformbox.ts","../../plugin-selection/src/cursors.ts","../../../node_modules/.pnpm/zod@3.24.4/node_modules/zod/lib/helpers/typealiases.d.ts","../../../node_modules/.pnpm/zod@3.24.4/node_modules/zod/lib/helpers/util.d.ts","../../../node_modules/.pnpm/zod@3.24.4/node_modules/zod/lib/zoderror.d.ts","../../../node_modules/.pnpm/zod@3.24.4/node_modules/zod/lib/locales/en.d.ts","../../../node_modules/.pnpm/zod@3.24.4/node_modules/zod/lib/errors.d.ts","../../../node_modules/.pnpm/zod@3.24.4/node_modules/zod/lib/helpers/parseutil.d.ts","../../../node_modules/.pnpm/zod@3.24.4/node_modules/zod/lib/helpers/enumutil.d.ts","../../../node_modules/.pnpm/zod@3.24.4/node_modules/zod/lib/helpers/errorutil.d.ts","../../../node_modules/.pnpm/zod@3.24.4/node_modules/zod/lib/helpers/partialutil.d.ts","../../../node_modules/.pnpm/zod@3.24.4/node_modules/zod/lib/standard-schema.d.ts","../../../node_modules/.pnpm/zod@3.24.4/node_modules/zod/lib/types.d.ts","../../../node_modules/.pnpm/zod@3.24.4/node_modules/zod/lib/external.d.ts","../../../node_modules/.pnpm/zod@3.24.4/node_modules/zod/lib/index.d.ts","../../../node_modules/.pnpm/zod@3.24.4/node_modules/zod/index.d.ts","../../plugin-selection/src/types.ts","../../plugin-selection/src/components/transformhandle.ts","../../plugin-selection/src/components/index.ts","../../plugin-selection/src/constants.ts","../../plugin-selection/src/helpers/ref.ts","../../plugin-selection/src/helpers/select.ts","../../plugin-selection/src/helpers/uuid.ts","../../plugin-selection/src/helpers/index.ts","../../plugin-selection/src/singletons/clipboard.ts","../../plugin-selection/src/singletons/scrolledgesstatesingleton.ts","../../plugin-selection/src/singletons/selectionstatesingleton.ts","../../plugin-selection/src/singletons/transformboxstatesingleton.ts","../../plugin-selection/src/singletons/index.ts","../../plugin-selection/src/systems/capture/hovercursorsystem.ts","../../plugin-selection/src/systems/capture/scrolledgessystem.ts","../../plugin-selection/src/systems/capture/transformboxsystem.ts","../../plugin-selection/src/systems/capture/index.ts","../../plugin-selection/src/systems/postupdate/transformboxsystem.ts","../../plugin-selection/src/systems/postupdate/index.ts","../../plugin-selection/src/systems/precapture/selectsystem.ts","../../plugin-selection/src/systems/precapture/index.ts","../../plugin-selection/src/systems/update/blocksystem.ts","../../plugin-selection/src/systems/update/draghandlersystem.ts","../../plugin-selection/src/systems/update/selectsystem.ts","../../plugin-selection/src/systems/update/index.ts","../../plugin-selection/src/systems/index.ts","../../plugin-selection/src/selectionplugin.ts","../../plugin-selection/src/index.ts","../src/commands/tape.ts","../src/commands/index.ts","../src/systems/capturetapedrawsystem.ts","../src/systems/updatetapedrawsystem.ts","../src/systems/index.ts","../src/tapesplugin.ts","../src/index.ts","../../../node_modules/.pnpm/@vitest+pretty-format@4.0.18/node_modules/@vitest/pretty-format/dist/index.d.ts","../../../node_modules/.pnpm/@vitest+utils@4.0.18/node_modules/@vitest/utils/dist/display.d.ts","../../../node_modules/.pnpm/@vitest+utils@4.0.18/node_modules/@vitest/utils/dist/types.d.ts","../../../node_modules/.pnpm/@vitest+utils@4.0.18/node_modules/@vitest/utils/dist/helpers.d.ts","../../../node_modules/.pnpm/@vitest+utils@4.0.18/node_modules/@vitest/utils/dist/timers.d.ts","../../../node_modules/.pnpm/@vitest+utils@4.0.18/node_modules/@vitest/utils/dist/index.d.ts","../../../node_modules/.pnpm/@vitest+runner@4.0.18/node_modules/@vitest/runner/dist/tasks.d-c7uxawj9.d.ts","../../../node_modules/.pnpm/@vitest+utils@4.0.18/node_modules/@vitest/utils/dist/types.d-bcelap-c.d.ts","../../../node_modules/.pnpm/@vitest+utils@4.0.18/node_modules/@vitest/utils/dist/diff.d.ts","../../../node_modules/.pnpm/@vitest+runner@4.0.18/node_modules/@vitest/runner/dist/types.d.ts","../../../node_modules/.pnpm/@vitest+runner@4.0.18/node_modules/@vitest/runner/dist/index.d.ts","../../../node_modules/.pnpm/vitest@4.0.18_@types+node@2_6926f3384d9fff4046f2a825bc43822d/node_modules/vitest/dist/chunks/traces.d.402v_yfi.d.ts","../../../node_modules/.pnpm/vite@7.3.1_@types+node@24.1_bcacba5aa3a5e817fe5d8c3f45fd368e/node_modules/vite/types/hmrpayload.d.ts","../../../node_modules/.pnpm/vite@7.3.1_@types+node@24.1_bcacba5aa3a5e817fe5d8c3f45fd368e/node_modules/vite/dist/node/chunks/modulerunnertransport.d.ts","../../../node_modules/.pnpm/vite@7.3.1_@types+node@24.1_bcacba5aa3a5e817fe5d8c3f45fd368e/node_modules/vite/types/customevent.d.ts","../../../node_modules/.pnpm/vite@7.3.1_@types+node@24.1_bcacba5aa3a5e817fe5d8c3f45fd368e/node_modules/vite/types/hot.d.ts","../../../node_modules/.pnpm/vite@7.3.1_@types+node@24.1_bcacba5aa3a5e817fe5d8c3f45fd368e/node_modules/vite/dist/node/module-runner.d.ts","../../../node_modules/.pnpm/@vitest+snapshot@4.0.18/node_modules/@vitest/snapshot/dist/environment.d-dhdq1csl.d.ts","../../../node_modules/.pnpm/@vitest+snapshot@4.0.18/node_modules/@vitest/snapshot/dist/rawsnapshot.d-lfsmjfud.d.ts","../../../node_modules/.pnpm/@vitest+snapshot@4.0.18/node_modules/@vitest/snapshot/dist/index.d.ts","../../../node_modules/.pnpm/vitest@4.0.18_@types+node@2_6926f3384d9fff4046f2a825bc43822d/node_modules/vitest/dist/chunks/config.d.cy95hicx.d.ts","../../../node_modules/.pnpm/vitest@4.0.18_@types+node@2_6926f3384d9fff4046f2a825bc43822d/node_modules/vitest/dist/chunks/environment.d.crsxczp1.d.ts","../../../node_modules/.pnpm/vitest@4.0.18_@types+node@2_6926f3384d9fff4046f2a825bc43822d/node_modules/vitest/dist/chunks/rpc.d.rh3apgef.d.ts","../../../node_modules/.pnpm/vitest@4.0.18_@types+node@2_6926f3384d9fff4046f2a825bc43822d/node_modules/vitest/dist/chunks/worker.d.dyxm8del.d.ts","../../../node_modules/.pnpm/vitest@4.0.18_@types+node@2_6926f3384d9fff4046f2a825bc43822d/node_modules/vitest/dist/chunks/browser.d.chkacdzh.d.ts","../../../node_modules/.pnpm/@vitest+spy@4.0.18/node_modules/@vitest/spy/dist/index.d.ts","../../../node_modules/.pnpm/tinyrainbow@3.0.3/node_modules/tinyrainbow/dist/index.d.ts","../../../node_modules/.pnpm/@standard-schema+spec@1.1.0/node_modules/@standard-schema/spec/dist/index.d.ts","../../../node_modules/.pnpm/@types+deep-eql@4.0.2/node_modules/@types/deep-eql/index.d.ts","../../../node_modules/.pnpm/assertion-error@2.0.1/node_modules/assertion-error/index.d.ts","../../../node_modules/.pnpm/@types+chai@5.2.3/node_modules/@types/chai/index.d.ts","../../../node_modules/.pnpm/@vitest+expect@4.0.18/node_modules/@vitest/expect/dist/index.d.ts","../../../node_modules/.pnpm/@vitest+runner@4.0.18/node_modules/@vitest/runner/dist/utils.d.ts","../../../node_modules/.pnpm/tinybench@2.9.0/node_modules/tinybench/dist/index.d.ts","../../../node_modules/.pnpm/vitest@4.0.18_@types+node@2_6926f3384d9fff4046f2a825bc43822d/node_modules/vitest/dist/chunks/benchmark.d.daahlpsq.d.ts","../../../node_modules/.pnpm/vitest@4.0.18_@types+node@2_6926f3384d9fff4046f2a825bc43822d/node_modules/vitest/dist/chunks/global.d.b15mdlcr.d.ts","../../../node_modules/.pnpm/vitest@4.0.18_@types+node@2_6926f3384d9fff4046f2a825bc43822d/node_modules/vitest/dist/chunks/suite.d.bjwk38hb.d.ts","../../../node_modules/.pnpm/vitest@4.0.18_@types+node@2_6926f3384d9fff4046f2a825bc43822d/node_modules/vitest/dist/chunks/evaluatedmodules.d.bxj5omdx.d.ts","../../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/utils.d.ts","../../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/overloads.d.ts","../../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/branding.d.ts","../../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/messages.d.ts","../../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/index.d.ts","../../../node_modules/.pnpm/vitest@4.0.18_@types+node@2_6926f3384d9fff4046f2a825bc43822d/node_modules/vitest/dist/index.d.ts","../../../node_modules/.pnpm/vitest@4.0.18_@types+node@2_6926f3384d9fff4046f2a825bc43822d/node_modules/vitest/globals.d.ts"],"fileIdsList":[[383,384],[356,360,363,365,380,381,382,385,390],[360,361,363,364],[360],[360,361,363],[360,361],[355,372,373],[355,372],[355,362],[355],[357],[355,356,357,358,359],[92,97],[98],[91],[393,394],[393,394,395,396],[393,395],[393],[93],[94,95,96],[94],[367],[367,368,369,370],[369],[365,387,388,390],[365,366,378,390],[355,363,365,374,390],[371],[355,365,374,377,386,389,390],[365,366,371,374,390],[365,387,388,389,390],[365,371,375,376,377,390],[355,360,363,365,366,371,374,375,376,377,378,379,380,386,387,388,389,390,391,392,397],[398],[248,249,256,257,258,259,260,261,262],[254,255],[254],[248,249,253,254,256,257,258,259,260],[244,254],[250,254,264,265,266],[244,251,254],[245,254],[243,244,245,246,247,252,253,254,255,263,267,268,269,270,271,272,273,274,275,276,277],[245,248,249,253,254,256,257,258,259,260,261,262],[244],[245,246,254],[244,246,247,254],[246,247,254],[243,254],[243,244,245,246,247,248,249,250,252,253,255,256],[246,254],[278],[318],[308,309],[306,307,308,310,311,316],[307,308],[317],[308],[306,307,308,311,312,313,314,315],[306,307,318],[175],[166],[166,169],[161,164,166,167,168,169,170,171,172,173,174],[100,102,169],[166,167],[101,166,168],[102,104,106,107,108,109],[104,106,108,109],[104,106,108],[101,104,106,107,109],[100,102,103,104,105,106,107,108,109,110,111,161,162,163,164,165],[100,102,103,106],[102,103,106],[106,109],[100,101,103,104,105,107,108,109],[100,101,102,106,166],[106,107,108,109],[108],[112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160],[92,201,202],[90,92,99,203],[92,99],[90,92,99,202],[99],[197,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219],[90,92,99],[92,99,202],[92,99,180,193,200,202,220,221,223,234,236,238,241],[92,99,177,178,179,180,193,200,202,220,242],[92,99,279,280],[92,202],[92,193,282],[282,283,284,285,286],[90,92,193,282],[90,92,193,220,232,282],[90,92,197],[176],[92,202,203],[90,92,203,211],[209],[92,202,210],[225,226,227,228,229,230,231],[90,92,203,204,211,221,225],[90,92,203,204,211],[92,202,218],[90,92,99,177,178,179,180,193,201,202,220,221,232,242,280,281,287],[279],[92,99,178,179,202],[90,92,99,181],[92,99,220],[181,182,183,184,185,186,187,188,189,191,192],[92,99,190],[222],[92,177,178,193,202],[178,193],[194,195,196,198,199],[92,177,178,188,202],[92,178,181,189,202],[90,92,178,181,197,202],[92,178,193,202],[224,233],[92,178,193,220,232],[235],[92,178,193,202,220,232],[237],[92,99,178,193,220],[90,92,99,178,193,220],[239,240],[90,92,178,193,220],[92,99,176,178,179,180,201],[82],[82,83],[82,83,84,85,86,87,88,89],[82,83,87],[82,83,86],[288],[295,296,297,298],[90,288],[300,301,302,303,304,321],[288,305,320],[324,325,326],[288,322],[299,305,320,322,323,327,332,346],[288,299,305,320,322,323,332,345],[328,329,330,331],[288,320],[333,334,335],[279,288,320,323,332],[279,288,299,320,322,332],[336,338,340,344],[337],[90,288,299,305,320,322,332],[339],[90,279,288,299,305,320,322,332],[90,288,299,322,327,328,332],[90,288,299,320,322],[341,342,343],[288,299,322,327],[319],[348],[289],[290,291,292,294,349,353],[293],[288,292],[90,279,288,291,292,294,347,349],[350,351],[90,288,290,291,347,349],[288,290,291,294,352]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","impliedFormat":1},{"version":"2ab096661c711e4a81cc464fa1e6feb929a54f5340b46b0a07ac6bbf857471f0","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"60037901da1a425516449b9a20073aa03386cce92f7a1fd902d7602be3a7c2e9","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"22adec94ef7047a6c9d1af3cb96be87a335908bf9ef386ae9fd50eeb37f44c47","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"73f78680d4c08509933daf80947902f6ff41b6230f94dd002ae372620adb0f60","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5239f5c01bcfa9cd32f37c496cf19c61d69d37e48be9de612b541aac915805b","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},"c8584f87c792fb9b1ec68db090f04d619515904126cc36c33ef4429973ea6ac8","be3c821942666070f391221548d884d04572479be643e8c1d5c3fa1954e05749","bc7e1112587d6d2eb543702c807632164796e78e2e79258f4c127e646afb198f","eeb17b6856f1a4314bf03ce7bbd336d14cc9b6e5ac45ba6bdb59e59629ba4345","149616509756a77377e7fd7c001c446532ca1c4142410e039e8cdd1254d6d76a","de68ebf450c1fd77de5c375c3b5816777203967f07d30d9f5481073a94c09309","91f9c76a25f3db97df8327839cb37c4d2fdb66e895ba0e75beac9c7883b8081b","5e48badaafda1c8c327aa00144df869a429d141c2a05f7725472a4236e983f66","c8b71eec13a0eec7a2c97fa58074947068cf24eb40e22220d87a88a6820348cb",{"version":"77db55b31b325743fccdb189fb3fe97944124795395d87c4bd47ba79277d6799","impliedFormat":99},{"version":"d4b7e76e2121195704c5229ef04377db92ca970972c5d6ce861b9b2143733634","impliedFormat":99},{"version":"6eec0b712ee4fa23cdd367f5d866d6719b7c8812bc46c623668ed6072587ee80","impliedFormat":99},{"version":"34200a82ddb7fdf868d86595bf9729aac18a0e2795034431550551d0a31e7e9b","impliedFormat":99},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":99},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":99},{"version":"1ab59b972136fb41d90d704d6faeaa695fcc51be2bcd390e3d44f7d8fa055edf","impliedFormat":99},{"version":"4ef0fd8dc5537f883386637c517329901173b67c17f0e9b6f9569d814cfdacce","impliedFormat":99},{"version":"5401d1e76edbe2457a71d4a48b931d2cc1390cfcbb7747fcea43140a1284db6d","impliedFormat":99},{"version":"c1a2e05eb6d7ca8d7e4a7f4c93ccf0c2857e842a64c98eaee4d85841ee9855e6","impliedFormat":1},{"version":"835fb2909ce458740fb4a49fc61709896c6864f5ce3db7f0a88f06c720d74d02","impliedFormat":1},{"version":"6e5857f38aa297a859cab4ec891408659218a5a2610cd317b6dcbef9979459cc","impliedFormat":1},{"version":"ead8e39c2e11891f286b06ae2aa71f208b1802661fcdb2425cffa4f494a68854","impliedFormat":1},{"version":"82919acbb38870fcf5786ec1292f0f5afe490f9b3060123e48675831bd947192","impliedFormat":1},{"version":"e222701788ec77bd57c28facbbd142eadf5c749a74d586bc2f317db7e33544b1","impliedFormat":1},{"version":"09154713fae0ed7befacdad783e5bd1970c06fc41a5f866f7f933b96312ce764","impliedFormat":1},{"version":"8d67b13da77316a8a2fabc21d340866ddf8a4b99e76a6c951cc45189142df652","impliedFormat":1},{"version":"a91c8d28d10fee7fe717ddf3743f287b68770c813c98f796b6e38d5d164bd459","impliedFormat":1},{"version":"68add36d9632bc096d7245d24d6b0b8ad5f125183016102a3dad4c9c2438ccb0","impliedFormat":1},{"version":"3a819c2928ee06bbcc84e2797fd3558ae2ebb7e0ed8d87f71732fb2e2acc87b4","impliedFormat":1},{"version":"f6f827cd43e92685f194002d6b52a9408309cda1cec46fb7ca8489a95cbd2fd4","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"a270a1a893d1aee5a3c1c8c276cd2778aa970a2741ee2ccf29cc3210d7da80f5","impliedFormat":1},{"version":"add0ce7b77ba5b308492fa68f77f24d1ed1d9148534bdf05ac17c30763fc1a79","impliedFormat":1},{"version":"8926594ee895917e90701d8cbb5fdf77fc238b266ac540f929c7253f8ad6233d","impliedFormat":1},{"version":"2f67911e4bf4e0717dc2ded248ce2d5e4398d945ee13889a6852c1233ea41508","impliedFormat":1},{"version":"d8430c275b0f59417ea8e173cfb888a4477b430ec35b595bf734f3ec7a7d729f","impliedFormat":1},{"version":"69364df1c776372d7df1fb46a6cb3a6bf7f55e700f533a104e3f9d70a32bec18","impliedFormat":1},{"version":"6042774c61ece4ba77b3bf375f15942eb054675b7957882a00c22c0e4fe5865c","impliedFormat":1},{"version":"5a3bd57ed7a9d9afef74c75f77fce79ba3c786401af9810cdf45907c4e93f30e","impliedFormat":1},{"version":"ed8763205f02fb65e84eff7432155258df7f93b7d938f01785cb447d043d53f3","impliedFormat":1},{"version":"30db853bb2e60170ba11e39ab48bacecb32d06d4def89eedf17e58ebab762a65","impliedFormat":1},{"version":"e27451b24234dfed45f6cf22112a04955183a99c42a2691fb4936d63cfe42761","impliedFormat":1},{"version":"2316301dd223d31962d917999acf8e543e0119c5d24ec984c9f22cb23247160c","impliedFormat":1},{"version":"58d65a2803c3b6629b0e18c8bf1bc883a686fcf0333230dd0151ab6e85b74307","impliedFormat":1},{"version":"e818471014c77c103330aee11f00a7a00b37b35500b53ea6f337aefacd6174c9","impliedFormat":1},{"version":"d4a5b1d2ff02c37643e18db302488cd64c342b00e2786e65caac4e12bda9219b","impliedFormat":1},{"version":"29f823cbe0166e10e7176a94afe609a24b9e5af3858628c541ff8ce1727023cd","impliedFormat":1},"e428c16ff90bbc95b50745af8b14e49cb4e3dc2cb133d50d7086e8dadca57d3d","53aaaab7aac6f30709df620a63ddbd261541f68344af8e56ad5d59ec65e3902b","0c5da0888a6a1c29d9482573eb54019c57a4c8b387d00edc85b01dfb05688675","478d84ae00f0e2cbd14460a8c2b04499eb1cc8157e69703a1567fafa8a198188","c75fdbfe0e5f0735cc68853500f1307f1a54246e2b5ec5855bc184417af5a81a","e9c78877585624af7c5b79982dfeb28af92a484c793923b1f54ec21bbecf3ffa","045a25c600a93763fbcdae0efa88ad211a37a2fa4a94cad1d66158e32859b06a","beb195e0971dabb1085bcb766a79152f8423758c171f11588189ccb0ffd7d5d0","87eab8b039f43d7a26d5beb0c14b2a4b733a58341c8e1241643dc95834f9f08b","75ed542afc7e462014cd13231ae9352a14951398e8e13db5f85e16cb0c6cd562","1884728c32b91171c215be127be117691db76906fd7162e5f2c7b44d8f7f2e49","c00f50f70e9aa5f6a72f8cf5c523b6ab72ad815086c8e2d25a48871558cef788","87ff21ee3c13167fc94cb9f84c005aa63206806f478cc66111aac6ac0b2a54f3",{"version":"3dbadaf72a5d02e92f67682edae2239524c4d6b063d6eed69d505830b6069aef","impliedFormat":99},"720b07882b22ef92604069dc962e0fb5726e487764f29689a59bb1972f8bee56","db2fdfa462bfd5aac5ba16b9009dd864e3551ba9b558e81b0696f6f4dc15bd24","e2a2a305610f5caebc3e067dd4efaa068f8447fe035a1bfcead14b3f38b88dac","b14a0537b03010490f2dfcc28b9257552695d91cbdaa6576eb1326f64e79573a","1f3042d41cdff54f002dfebb5564d411bed3c9fb6a6344c8092046c8ae51b4ae","a42bd80f053cad119a0a160c994b0ef6c0f35003916865e6436472643f2a1efa","79e99ffe23f0c58cc17b05855d817bc8f50b5aeb2833a05bc311e5cbbf3d021e","7e4127c0131a7976d8bb82f6506ab2884803b2ae60409066bacf7a4b3f9bab59","9f805c665f4094f62fcb14ab81adba6b594b4659dea9d007bcfb3fc973f646c2","0518960964ab53a68bce4d8beaeb4d6f1141b56670d208129f3f30af7f1b945c","fe8fb772684fb6b134020e53944b3f179d1c0e3d67f3ef95f9ae0054d21c8e55","d7647e92a0f478f37c4988a41f99869be9ba7655243c7e7acad4d308cbc94b2b","dbe65b38b43197668146e97f26529f65b90d40b8afc822ffad4f237f2be06636","03cd04153bdc60672ab5dfdeb491f944cc572ec0228b8f527de77e39a8019cc4","b90d2c842d6f6d4698f9cff659a60e05b6f7cc3931fd9e2b90f6f365483dc54b","f75a5ee199929b4ac08ea1fff163c35bc8972dce0b7fb302d2e753302edce1b0","c00f126210f45c6169faeaf02fd846a09ddc0d51704b11e18a948703d36cac66","eaf95b1f36dfc93f1b90158f3594daea1176a2e646a1285990b6d8cb8b106ded","34b56a401faaef1b6f162a16a8612f0ddad904d82dd36cc34ad85a0a67d55901","cfbb2840b583a11bd0fe9bbaaa660e883e7a1611e62a9ef41cad567d6745cc9b","c1c33010da1098c491a90da2b2edde9e6fc469603c144ffed8588df70def179e","e19f05bad67fd0cd1c904b9bc126c03b7ae4e1c9a3b76e6f2b362fde9ffa03f4","25d2e4c259b78c2a9025cbab14b37da52c68c62a1cba329402113b133aec67cd","14aad5ca2e68b8211b16d5ca6e533b75c168be03ac226736063c3195d47e2de3","38be823ab863f9fb760a84b677dfe8a085a69fb4bd0ad68539f8d8bf0826c8a8","0848310261cd33fac5295b5916d210fe7bdfda7386ef1e4ffa206eacd48c1755","81e8d6e613a1397103cc67b32391ce31efad5b250b5c8130640e6bb61618e920","5798a2a8410ac8e4b1dbb7407066e980780afa38a0fd113c9bc50dc92994d56e","69e38b84396c0ef7fd85b3fe8d05aa38005508880507fa8b4fb91c52c4f20171","5d9750ff3982cb693600ea719910a7bdddb7ec9079ca356f806f4c59f948e799","bb85221539dc247eee18eceee16884d2e2420bb4cfb47b7ef28c2b32e22ad53e","3ed38079be2759d1ef40430238b93004775f8280ddee7066940285b69fd451d5","25375007f7a93519985d0749305155e83ef01d863cf4b7f061fde9d9abbc801d","a0391df9316a258d1b537608f65bb257efdb73a6dd69b7653279275e513af247","cf0695f921ba385cccd77f3bacbb7b8c083835fb25cf20b451a3b238735e92e9","f4eb389e81211471e9da7bcb2e289a157d674cb6c5745208380d85cce5f0ee37","2499b2c14f629c6720e85d9de3b28d92bea7c7d474e0256dbf39546f3a5d938e","858d846bcd03ab4a93dc821d39d90dffd56aa31fd0bcee5d66e1e1ca41317f98","f72b18374b6a556062bd6b657f24dc5e3bbc33a7d22a4f891399bc4a7ab6c07e","dff7ce538efec5077c5221969aef84c5b1ea0235af043768eef2616252e43514","6b1938e1691c0dfeea52a7e8d83471007eedb670037a06b46853a73db4259b4a","901e0c41a20848b24af644e4a9c4f4bd808961ff7921a00855fd782e4183daa7","ac1dbed82e0d44b971f5fd3a6d7330a0a707bd5a6be354117b6b13fd82bd6895","6c7e1c39b560dd56b1a694c99c43d59e01e3c10a677b2df4a453549b87b08b65","d02eb80ebe4dab9f6d111a8d0484c97229767321976e790ed780535426c3ddc9","aaf9961cce8f6d143848bd83b22e21a47eb8ebb21cbe1edf963e4e828f2afbf5","70c7af81856534daa2c14512570fc67ebaada2b6b50b7f1cc4ad0009a87f91bd","3bbc6c18ae6b6534030332bd2a490c237f346a641e92f9e203899838e3e96bc9","9937cf58a9b5a9b086f1ce85150716a737308400836eda1165cb7950a62fb6fa","615259016cd06180c005fabae84275b3cde1dc047f4d16253ba3e785eb386928","e420ce725b7dceca72ca6fb19c4dfbd3f7417e0cabd820c9b80a2ccb9ac54f9c","c2b1d0d7e186718d02ab09a98e6c2def30a0b722fd930a45c031175f91f7b5dc",{"version":"3a22045e94ed099cf2d521ae47f8b0b2e50033fa0b24838c42a6a312fc7755f2","impliedFormat":1},{"version":"1723af1fd61438370ef2f9b162c21925d7d8263f02ea3786701207a2697bc570","impliedFormat":1},{"version":"f978ab920c44da04b106e19376eac3d5873680407778be96a6597feb930a7c92","impliedFormat":1},{"version":"92b81364ea40c145da7f730f660350935e49334a18faafbe7f86105763e6e486","impliedFormat":1},{"version":"672c3ab666d58c2e16ade2836c496278da896764c8f91143ad5c51fab2b9367b","impliedFormat":1},{"version":"d2617b18ac1e533346f2a3a054a2c6f31f86f909242e93c7a6b98c635e0f8792","impliedFormat":1},{"version":"bb892dcd5d3c7b31e1c251bb43384e0eac9604b32b54f27f682b78ba0fa6d257","impliedFormat":1},{"version":"9e49b5ba3cfc1de785d7c3941ea1bccb32e61b880af78748013a9bce376d9817","impliedFormat":1},{"version":"e653259e64adbe8acf9c33dc1a525ac1d1a1dd0f82580f73d81543f948485a86","impliedFormat":1},{"version":"65ec5e77d12a9fef085314729cfa5459a863e2d190184a418fb89b8f3d39a0c9","impliedFormat":1},{"version":"1c328efb6045370a8303b4d2bf3fb67e226a07e9391f9044e40f791faa545c82","impliedFormat":1},{"version":"7c2d9cbddddfa130bd953bf59a3556ef0e9494e70585feb54a60866845555ea6","impliedFormat":1},{"version":"9dc0ec853f1e803bdf9d2dcc69509f8dae488100664915ab1dd9ffbb732291ba","impliedFormat":1},{"version":"1559b4a59a19b452d5bc46c1f584d99f2775f6d016af0177a5a2150d4955676d","impliedFormat":1},{"version":"245b103ea8c3b19f25cc0b9bb8acc1330b55f0f04338b2d83e236869a6d99e71","impliedFormat":1},{"version":"a2553ad8aacc78a09e9d91d91f9bf21bb4ea98c45f44475c45ea9cc8a5a8b0d9","impliedFormat":1},{"version":"0bb0ba4030a0b3ada4eadf14ca3450653ec4a0e78ffa26ab742ac1548032b200","impliedFormat":1},{"version":"a0af6c85115a5c705af405fd8d3018cc681a9d86e2758395dd8fafd264e93e77","impliedFormat":1},{"version":"dd927c1c69750111f7b88dea99168831251b699486ed211b8f48d3d7790bdd10","impliedFormat":1},{"version":"d6e0a302299f70d42fb6068e4f9f98f95bf63e0d17f96ae0bc54c0fb61b00b92","impliedFormat":1},{"version":"98a7e602735736dee031310c9b49c16988ac523895c628eb358ab9d0c98c47ae","impliedFormat":1},{"version":"d77b19a94143dd761991f7f7f25f8dab258d3eb3e19b85048ba3d41f83d5de41","impliedFormat":1},{"version":"507057a5b3bd68b3056cfb09e9de27601a99e339907cf0fd0b03d5dd840b4c4a","impliedFormat":1},{"version":"3f246c5f9ac101ccef1e1aad6719b6dd1449461b071dea904856780cac690c94","impliedFormat":1},{"version":"24ca5a7d5faa57d04f86e622e614931bf6aeb2d50dfbb8bab1ff319630347407","impliedFormat":1},{"version":"dcca19a81187a21482680d12d92840af02cea5a06e3620d86c3e633242424c42","impliedFormat":1},{"version":"d5144eb14cb4d9292b841699fb53e9a6641b64d926170043412f1e5293bba369","impliedFormat":1},{"version":"6af618a43f82b685b70b919a00aea9ff6bc2d574c016278b2413631f8ab7ce76","impliedFormat":1},{"version":"68baace0098c248dbee92001664c7eff0dc40182d61a255ba053ea9d68c749fb","impliedFormat":1},{"version":"b58d89b47b1fa76ce57bf1179e53f9d6f5118a301943cb4dea5987d72d529ce9","impliedFormat":1},{"version":"a0982cf55aad440267fc9432f3a12e3a67c497a34cac47f38a3e5a04156b46c1","impliedFormat":1},{"version":"8549892f753971e3ec5f8bad0bd9f74d1a8521f573fd006cfd00d3c27490f444","impliedFormat":1},{"version":"1d5454555a8ee7f7660b48a9d7cf3270d260d3bc61350d79b7c5e2700b7aa20a","impliedFormat":1},{"version":"68cc279fd82ace672f68b6996223f2d6125d81ca544510a52f59f911051d4068","impliedFormat":1},{"version":"7cdbd04d7f3657409c1cab924650dfe5ca74735d45e4f746cab2c571074f580f","impliedFormat":1},{"version":"84c91746cd45d714dec0cd2d4f410810324e2152e4ed674aedad6c1e71aca5cd","affectsGlobalScope":true,"impliedFormat":1},{"version":"b75d56703daaffcb31a7cdebf190856e07739a9481f01c2919f95bde99be9424","impliedFormat":99},"43b6226ac28ba607ab02a2be8d01e12fb2204703bc4254897b4f209d4790613d","cd25c2270f374ce94c5eef989290173f199c02db830601ad1a894bb898ac013e","b2511fa510a2d76d2340e1d358cc21c2b4a4a23acf555da33556aff2175982e4","718871c6de3f58ef2994693db3d611b91ceadf8048f81d5318eb0afd0c04600e","0349eaf279c21ef34310040420cb7c24b778a25b3b924b80998148adfaac9319","618b8ca1623d75f47fe591f64cc925a46a28ea00dd0d018317b2c2d541f82b52","122e37b98e0ab529d8858dc23b2042e7a7e29419b8366880b62f8f3e6d4dffc1","f0998a2dc1f3c6c33940a1b1e92ad89aa897e6b1041d100a9d9420f78453f40b","bb6ba9d5e0735f77ffd840fc63ea11c21e55e176046635b24407725610202591",{"version":"c59ee5773ba2d8b5a9d3ac8f212e12ff6255aeec2d9c43e2538f2aa1c3a56192","signature":"2c2467daa5b4853ff18ebd847fce0cd88a760dc9489844f106eb6bcace124b0d"},"3f3299f788f72b1df2316176d8d079279b40b9cd54e663d42320c9359028bd03",{"version":"d8e251d6a4c1454d6c57718cfd909a972b7f6e366a7e95db5a8253c1c59718f0","signature":"794a14d1151b44ccaa9f1cc021bdd004736a0ce071dc537ec0ca13806b4692c3"},"245b47fee8426c75d6487116f907b785a2dada0d1983b61b783e7da30588827a","b941c426a23da1fde686f099b251e815b59cbae177d74ed98b1608e7219c4c17","0c6f6a542a1997561078faecd5eaf7d90bdefea4ac4c3cf526032088651c044e","04ce7e60638a392c83beda036a4b71e9cd196e5e9e54fb9f2ac49a1d7a8d52d8","ce50db3d038b781350d999515c416d799069ad0f436180b20585f5f6fc7f969d","460722d7181359cb413098f90541d5759c8c373c39024432f2ab46247c3a787b","b4e2436931e2111d1bc3c3f3cabd61534401b773c058582fdb6147c94025d8c9","aac74c0f15429c9aa13e88eb3d77109da9fb8cfd14b94d20f84f5a8d38f05c0d","11833683ca7e65e762158a736bc1ab0b5c54f358686bc3b90fc8e7a5982bfa26","98b8fe650d5f7285ced05fd067d17fffc56df098e75b826e470ab4740cbd525e","2c41b90520c188c90cf52eee1142ec80ea8cebd9d6f3c3f521dc7643c11c2f0d","73c7b36337320597575229d9510fa13135c5f86aa400c3795146cc24d3cfef04","7d6d62d12dcfa2bdb01d4bd7abe8f31c6ec88a7c8ce9ea38430bab8aff5216a5","0fb2f7a3e8c4f6129d953ec76bd45ef5ad42334c525d20a6bdece874423bf682",{"version":"d3cfde44f8089768ebb08098c96d01ca260b88bccf238d55eee93f1c620ff5a5","impliedFormat":1},{"version":"950f2cd81e30d0ecdf70ab78fcfd85fc5bb28b45ebb08c860daff059feea412e","impliedFormat":1},{"version":"3a5af4fba7b27b815bb40f52715aedebaa4b371da3e5a664e7e0798c9b638825","impliedFormat":1},{"version":"8485b6da53ec35637d072e516631d25dae53984500de70a6989058f24354666f","impliedFormat":1},{"version":"ebe80346928736532e4a822154eb77f57ef3389dbe2b3ba4e571366a15448ef2","impliedFormat":1},{"version":"49c632082dc8a916353288d3d8b2dc82b3471794249a381d090d960c8ceac908","impliedFormat":1},{"version":"f672c876c1a04a223cf2023b3d91e8a52bb1544c576b81bf64a8fec82be9969c","impliedFormat":1},{"version":"71addb585c2db7b8e53dc1b0bcfa58c6c67c6e4fa2b968942046749d66f82e7e","impliedFormat":1},{"version":"c76b0c5727302341d0bdfa2cc2cee4b19ff185b554edb6e8543f0661d8487116","impliedFormat":1},{"version":"25b3f581e12ede11e5739f57a86e8668fbc0124f6649506def306cad2c59d262","impliedFormat":1},{"version":"e703cfacb9965c4d4155346c65a0091ecded90ea98874ed6b3f36286577c4dde","impliedFormat":1},{"version":"f5ef066942e4f0bd98200aa6a6694b831e73200c9b3ade77ad0aa2409e8fe1b1","impliedFormat":1},{"version":"b9e99cd94f4166a245f5158f7286c05406e2a4c694619bceb7a4f3519d1d768e","impliedFormat":1},{"version":"5568d7c32e5cf5f35e092649f4e5e168c3114c800b1d7545b7ae5e0415704802","impliedFormat":1},"4bb7a323df72cc559c6ac57eac75e18e84394bb477cc824c45094f11290caf44","4ece90b6306f6de53d16b8dddcf49193b96dc7e3fecf02278f608cc95545ce07","6d2ba92f9b87f8d6700ba3d88db6fe77336c3d61bf604b401a979157665433d8","8727c4521e52f89bdc0a8e8c5dc50d81c2f5ce719cb78f65767ed9ba9b3b6914","e248fe48d306b8a65605e9b8f3b717797e06101b9eea1d2b8fceb42afe5d0a14","7218778acbbd12e5948d95d96ac0870137748db03095f6141d26745f0ffc2d5c","70e7eb38abdc22c99b8dc45902ea433d3108afa0967e5bddb63babd424e815a3","33aacd770330af69c191ccf58356fa7636dfe4aeba614fb7b3a5a0315bae3e63","c18ce201093bb5990d07f1306d3cd80de30fb5e302da9f3fe27c5508426841a9","56b447f2599cf2eee141668cea791daabc6f5e85bcf247adc411349eb152dbf0","8101b7e9eb730823b6ad5950cb4c172914c96e9fe0ce146b58875ae39780a122","fd1ba6da6d02e2507cf1213f54e525c2a4ce38f1f68ec773cc592d56904ec912","2adf263f8b946b4a982ebd888395a041b540b5245a3c9506bfb16bc9e352b77c","19f15871bcfd7e66aa85c2fd52df3687acc9a9ef50abca476356a05b30517fb0","f7e9d7bc91a32c77aa83d6851089455d2c21995b7b9fc6b31c39b6ee1d42e5f4","5d73473e4ef5a659d187d11ccb8c7acdb59e66e3b5d79ac5f10cc7041fab3e31","e03ab1d52d28def39ff4439f96f817804b57e6739f176d4140a97314c725624d","c15ef67e2083476e49c6ed72c59e8ba9a2606f066f90eea214311b8305fb373e","1550e1406107336f7e10f487842b65ad9a1cb4b02b0c2743a71d1f8d9c17a842","b0f101863fa05e7110b8aff46436288ce9e2cd2a8abcee0695ef64708b64951f","82308ddc81e614843cd34da71a0cc2a5d8a255c734ec802cde17b45d2d005c1d","aed671662fd9588950fc5d801611cbbce57fef5b26f55e8ad2837f3f2c7287a6","bb5d79f72d6d4fada9a1e1235f91c34bb523b174f23d046a99b76e661f2940f2","607ad8e01485639d8955e0bed8c80beaaf1604c0489d3a15fc88955c7d2e52dc","5fe745c6c99e91524724fa11ef4ebfe537f0d13818aef0ffd8513325ae0bcc34","ac6d8936fb408d8b333ed50339e3ff8a6884a932bfa813f2e2cf63f3043d6125","6e4f57ec7f660c5529e450a35f42d83e25fbcbeec07aa95a122d0048387fb42f","2c14460f7de7d4b37b8f522c7b0ded5c35b3fb497dae1d380735a41ce99254e9",{"version":"32bb45b78238bfce782907886bc8637fc6c629e962f2595d13e94aa2dc57a186","signature":"5469ec7ea1b97dbb44b436116772110c91f0005c18807ae81b45827d21f7ba5f"},{"version":"e26089c69443468e4436b8e0e419dee7b076a4fb3ead0ee460886c7a33ef562c","signature":"5013dd5b5dcf1655a57aa3ad43988af00ee89e6a5f50247c0c75f12151095a6d"},{"version":"ae952c119ef4013bc5975b97392963d54f6f594f47ac619c414c843a7c6612a9","signature":"dd6cba3a67d74198c14179250417b7f8d949e2c4d67a40bfc297e45b90062e65"},{"version":"8a4e8d5a98f18621280ea98242ef8a76a3b5bc567a45c06149104c0f93033399","signature":"ccd9e8fb4ef591e5c6663d74c34d23dfe6423e8181920661b9eec9cc32dbbf10"},"dcd9d470024f74b9b021f6c953a737e6f8a1a9526ea587c1c69ff02b85931600","86bcdc695f8607e8b82151b62603b58a7c4a263cf7080b3e1b66b281535dbcde",{"version":"97771d403ee0e6ab4b448b62033ea09490106d12047c51e9b3f2a845122d6963","signature":"c0b808ec5d384297a7fdbcead17ca849d10636792af3bafd7c37495d0c131b1c"},{"version":"acfb723d81eda39156251aed414c553294870bf53062429ebfcfba8a68cb4753","impliedFormat":99},{"version":"fa69a90381c2f85889722a911a732a5ee3596dc3acecda8a9aa2fa89b9615d8d","impliedFormat":99},{"version":"b5ce343886d23392be9c8280e9f24a87f1d7d3667f6672c2fe4aa61fa4ece7d4","impliedFormat":99},{"version":"57e9e1b0911874c62d743af24b5d56032759846533641d550b12a45ff404bf07","impliedFormat":99},{"version":"b0857bb28fd5236ace84280f79a25093f919fd0eff13e47cc26ea03de60a7294","impliedFormat":99},{"version":"5e43e0824f10cd8c48e7a8c5c673638488925a12c31f0f9e0957965c290eb14c","impliedFormat":99},{"version":"854cd3a3375ffc4e7a92b2168dd065d7ff2614b43341038a65cca865a44c00c5","impliedFormat":99},{"version":"ef13c73d6157a32933c612d476c1524dd674cf5b9a88571d7d6a0d147544d529","impliedFormat":99},{"version":"3b0a56d056d81a011e484b9c05d5e430711aaecd561a788bad1d0498aad782c7","impliedFormat":99},{"version":"2f863ee9b873a65d9c3338ea7aaddbdb41a9673f062f06983d712bd01c25dc6b","impliedFormat":99},{"version":"67aa128c2bc170b93794f191feffc65a4b33e878db211cfcb7658c4b72f7a1f5","impliedFormat":99},{"version":"ac3d263474022e9a14c43f588f485d549641d839b159ecc971978b90f34bdf6b","impliedFormat":99},{"version":"a7ca8df4f2931bef2aa4118078584d84a0b16539598eaadf7dce9104dfaa381c","impliedFormat":1},{"version":"10073cdcf56982064c5337787cc59b79586131e1b28c106ede5bff362f912b70","impliedFormat":99},{"version":"72950913f4900b680f44d8cab6dd1ea0311698fc1eefb014eb9cdfc37ac4a734","impliedFormat":1},{"version":"36977c14a7f7bfc8c0426ae4343875689949fb699f3f84ecbe5b300ebf9a2c55","impliedFormat":1},{"version":"ff0a83c9a0489a627e264ffcb63f2264b935b20a502afa3a018848139e3d8575","impliedFormat":99},{"version":"324ac98294dab54fbd580c7d0e707d94506d7b2c3d5efe981a8495f02cf9ad96","impliedFormat":99},{"version":"9ec72eb493ff209b470467e24264116b6a8616484bca438091433a545dfba17e","impliedFormat":99},{"version":"c35b8117804c639c53c87f2c23e0c786df61d552e513bd5179f5b88e29964838","impliedFormat":99},{"version":"c609331c6ed4ad4af54e101088c6a4dcb48f8db7b0b97e44a6efeb130f4331bd","impliedFormat":99},{"version":"bcbd3becd08b4515225880abea0dbfbbf0d1181ce3af8f18f72f61edbe4febfb","impliedFormat":99},{"version":"67acaedb46832d66c15f1b09fb7b6a0b7f41bdbf8eaa586ec70459b3e8896eb9","impliedFormat":99},{"version":"4535ab977ee871e956eb7bebe2db5de79f5d5ec7dfbbf1d35e08f4a2d6630dac","impliedFormat":99},{"version":"b79b5ed99f26ffb2f8ae4bdcc4b34a9542197dc3fa96cfb425c2a81e618cff28","impliedFormat":99},{"version":"31fd7c12f6e27154efb52a916b872509a771880f3b20f2dfd045785c13aa813f","impliedFormat":99},{"version":"b481de4ab5379bd481ca12fc0b255cdc47341629a22c240a89cdb4e209522be2","impliedFormat":99},{"version":"bdd14f07b4eca0b4b5203b85b8dbc4d084c749fa590bee5ea613e1641dcd3b29","impliedFormat":99},{"version":"427fe2004642504828c1476d0af4270e6ad4db6de78c0b5da3e4c5ca95052a99","impliedFormat":1},{"version":"2eeffcee5c1661ddca53353929558037b8cf305ffb86a803512982f99bcab50d","impliedFormat":99},{"version":"9afb4cb864d297e4092a79ee2871b5d3143ea14153f62ef0bb04ede25f432030","affectsGlobalScope":true,"impliedFormat":99},{"version":"4e258d11c899cb9ff36b4b5c53df59cf4a5ccae9a9931529686e77431e0a3518","affectsGlobalScope":true,"impliedFormat":99},{"version":"a5ae67a67f786ffe92d34b55467a40fb50fb0093e92388cadce6168fa42690fd","impliedFormat":99},{"version":"69bf2422313487956e4dacf049f30cb91b34968912058d244cb19e4baa24da97","impliedFormat":99},{"version":"6987dfb4b0c4e02112cc4e548e7a77b3d9ddfeffa8c8a2db13ceac361a4567d9","impliedFormat":99},{"version":"a534e61c2f06a147d97aebad720db97dffd8066b7142212e46bcbcdcb640b81a","impliedFormat":99},{"version":"ddf569d04470a4d629090d43a16735185001f3fcf0ae036ead99f2ceab62be48","impliedFormat":99},{"version":"b413fbc6658fe2774f8bf9a15cf4c53e586fc38a2d5256b3b9647da242c14389","impliedFormat":99},{"version":"c30a41267fc04c6518b17e55dcb2b810f267af4314b0b6d7df1c33a76ce1b330","impliedFormat":1},{"version":"72422d0bac4076912385d0c10911b82e4694fc106e2d70added091f88f0824ba","impliedFormat":1},{"version":"da251b82c25bee1d93f9fd80c5a61d945da4f708ca21285541d7aff83ecb8200","impliedFormat":1},{"version":"64db14db2bf37ac089766fdb3c7e1160fabc10e9929bc2deeede7237e4419fc8","impliedFormat":1},{"version":"98b94085c9f78eba36d3d2314affe973e8994f99864b8708122750788825c771","impliedFormat":1},{"version":"53c448183c7177c83d3eb0b40824cf8952721a6584cf22052adc24f778986732","impliedFormat":99},{"version":"0a5bc32362b0559b9bcf0a6a83136c4442dbbd0edecd671538a5e03454b6dff0","affectsGlobalScope":true,"impliedFormat":99}],"root":[[289,294],[348,354]],"options":{"allowJs":false,"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"declarationMap":true,"emitDeclarationOnly":true,"esModuleInterop":true,"module":99,"noEmitOnError":true,"noFallthroughCasesInSwitch":true,"noImplicitReturns":true,"noUnusedLocals":false,"noUnusedParameters":false,"outDir":"./","removeComments":true,"skipLibCheck":true,"strict":true,"target":99,"useDefineForClassFields":false,"verbatimModuleSyntax":true},"referencedMap":[[385,1],[386,2],[365,3],[361,4],[364,5],[387,6],[374,7],[373,8],[363,9],[356,10],[358,11],[360,12],[362,10],[98,13],[99,14],[92,15],[395,16],[397,17],[396,18],[394,19],[94,20],[97,21],[93,22],[368,23],[371,24],[369,23],[370,25],[389,26],[379,27],[375,28],[376,4],[392,29],[390,30],[377,31],[391,32],[378,33],[398,34],[399,35],[263,36],[256,37],[257,38],[258,38],[261,39],[262,38],[248,38],[249,38],[259,38],[260,38],[264,40],[267,41],[265,40],[250,40],[266,40],[268,38],[252,42],[269,43],[270,38],[253,38],[278,44],[243,38],[271,45],[272,46],[255,38],[247,47],[245,48],[246,43],[273,49],[244,50],[274,38],[276,38],[254,51],[275,52],[277,38],[279,53],[319,54],[310,55],[317,56],[311,57],[314,54],[318,58],[309,59],[316,60],[308,61],[176,62],[170,63],[174,64],[171,64],[167,63],[175,65],[172,66],[173,64],[168,67],[169,68],[163,69],[107,70],[109,71],[108,72],[166,73],[165,74],[164,75],[110,70],[102,76],[106,77],[103,78],[104,79],[112,80],[113,80],[114,80],[115,80],[116,80],[117,80],[118,80],[119,80],[120,80],[121,80],[122,80],[123,80],[124,80],[126,80],[125,80],[127,80],[128,80],[129,80],[130,80],[161,81],[131,80],[132,80],[133,80],[134,80],[135,80],[136,80],[137,80],[138,80],[139,80],[140,80],[141,80],[142,80],[143,80],[145,80],[144,80],[146,80],[147,80],[148,80],[149,80],[150,80],[151,80],[152,80],[153,80],[154,80],[155,80],[156,80],[157,80],[160,80],[158,80],[159,80],[177,82],[204,83],[205,84],[203,85],[206,84],[207,84],[208,86],[209,84],[210,84],[211,83],[212,86],[213,84],[220,87],[214,84],[197,88],[215,84],[216,84],[217,89],[218,84],[219,89],[242,90],[201,91],[281,92],[178,93],[283,94],[287,95],[284,94],[285,96],[286,97],[282,98],[179,99],[225,100],[226,101],[227,102],[228,103],[232,104],[229,105],[230,106],[231,107],[288,108],[280,109],[180,110],[182,111],[183,112],[184,84],[185,84],[186,88],[193,113],[187,84],[188,84],[189,88],[191,114],[192,84],[181,88],[223,115],[222,116],[194,117],[200,118],[195,119],[196,120],[198,121],[199,122],[224,122],[234,123],[233,124],[236,125],[235,126],[238,127],[237,128],[239,129],[241,130],[240,131],[202,132],[83,133],[84,134],[85,134],[90,135],[86,133],[88,136],[87,137],[295,138],[296,138],[299,139],[297,140],[298,138],[300,138],[301,138],[322,141],[302,138],[303,138],[304,138],[321,142],[305,138],[327,143],[324,138],[325,144],[347,145],[346,146],[328,138],[332,147],[329,148],[330,148],[331,148],[333,144],[336,149],[334,150],[335,151],[345,152],[338,153],[337,154],[340,155],[339,156],[341,157],[342,158],[344,159],[343,160],[320,161],[349,162],[348,140],[290,163],[289,138],[354,164],[294,165],[293,166],[350,167],[352,168],[351,169],[353,170]],"affectedFilesPendingEmit":[[349,48],[348,48],[290,48],[289,48],[291,48],[354,48],[294,48],[293,48],[350,48],[352,48],[351,48],[353,48],[292,48]],"emitSignatures":[289,290,291,292,293,294,348,349,350,351,352,353,354],"version":"5.9.3"}