├── .eslintrc.json ├── .gitignore ├── README.md ├── manifest.json ├── package.json ├── src ├── ast.ts ├── clippy-data.ts ├── debug.ts ├── engine.ts ├── eval.ts ├── index.ts ├── input.ts └── polyfills.ts ├── tsconfig.json ├── ui.html ├── webpack.config.js ├── window.json └── yarn.lock /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "eslint:recommended", 4 | "plugin:@typescript-eslint/recommended", 5 | "plugin:@figma/figma-plugins/recommended" 6 | ], 7 | "parser": "@typescript-eslint/parser", 8 | "parserOptions": { 9 | "project": "./tsconfig.json" 10 | }, 11 | "root": true, 12 | "rules": { 13 | "@typescript-eslint/no-unused-vars": [ 14 | "error", 15 | { 16 | "argsIgnorePattern": "^_", 17 | "varsIgnorePattern": "^_", 18 | "caughtErrorsIgnorePattern": "^_" 19 | } 20 | ], 21 | "@typescript-eslint/no-floating-promises": "error" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Node 2 | *.log 3 | *.log.* 4 | node_modules 5 | 6 | dist.js 7 | dist.js.map -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Unreal EngJam (Working Title) 2 | 3 | Design engineers are the latest trend in the tech space, but nobody is talking about engineer designers. We're here to change that. 4 | 5 | Unreal EngJam is a concerningly robust, from-scratch programming language and game engine, designed from the ground up to be programmed in a Figma FigJam whiteboard. 6 | 7 | With our incredibly high quality and extremely spaghetti programming language, you can program such things as classic single-player pong... 8 | 9 | ![pong](https://doggo.ninja/UVqBOT.png) 10 | 11 | ... and even render 3D models inside Figma: 12 | 13 | ![](https://doggo.ninja/oKQhg6.png) 14 | 15 | ## Think of All the Benefits 16 | 17 | - Why be limited to syntax highlighting when you can color-code your software? 18 | - Whiteboard out math and algorithms in the same space as your business logic 19 | - The visual programming appeal of Scratch, with the power and robustness of a real programming language 20 | - Comments are first-class, graphical, and move around as you refactor (and refactoring is as easy as drag-and-drop) 21 | 22 | ## Clippy 23 | 24 | Make a mistake? Your favorite office assistant will hover above the relevant code and help you out: 25 | 26 | ![](https://doggo.ninja/erw3KX.png) 27 | 28 | ![](https://doggo.ninja/fQMIww.png) 29 | 30 | ## How We Built It 31 | 32 | We wrote the programming language entirely from scratch (no dependencies) in TypeScript. We use Figma's plugin API to traverse the document and generate an AST which we can then interpret. We provide the programmer with access to render to and manipulate a "game window" inside Figma. 33 | 34 | It is important to sufficiently emphasize that this is a full, statically-typed, dynamically-bound novel programming language designed explicitly for the medium of Figma flowcharts. For example, to define a variable you draw a box. To store values, you can draw an arrow to the box, and to read values you draw an arrow from the box. With arrows, nothing needs to be referenced by name and refactoring is easy. 35 | 36 | The assignment of function and infix operator arguments are inferred first by applied name and then internal type. 37 | 38 | ## Challenges We Ran Into 39 | 40 | Figma runs plugins in WASM which means it is extremely difficult to debug code, and simple bugs like stack overflows often result in cryptic low-level memory leak errors. 41 | 42 | Also, 3D models are hard to get right :) 43 | 44 | ![broken](https://doggo.ninja/JNqtBT.png) 45 | -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Unreal EngJam", 3 | "id": "1429343707858855335", 4 | "api": "1.0.0", 5 | "main": "dist.js", 6 | "capabilities": [], 7 | "enableProposedApi": false, 8 | "documentAccess": "dynamic-page", 9 | "editorType": [ 10 | "figjam" 11 | ], 12 | "ui": "ui.html", 13 | "networkAccess": { 14 | "allowedDomains": [ 15 | "none" 16 | ] 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "unreal-engjam", 3 | "version": "1.0.0", 4 | "description": "Your Figma Plugin", 5 | "main": "dist.js", 6 | "scripts": { 7 | "build": "webpack", 8 | "dev": "yarn build --watch", 9 | "lint": "eslint --ext .ts,.tsx --ignore-pattern node_modules .", 10 | "lint:fix": "eslint --ext .ts,.tsx --ignore-pattern node_modules --fix ." 11 | }, 12 | "author": "", 13 | "license": "UNLICENSED", 14 | "devDependencies": { 15 | "@figma/eslint-plugin-figma-plugins": "*", 16 | "@figma/plugin-typings": "*", 17 | "@typescript-eslint/eslint-plugin": "^6.12.0", 18 | "@typescript-eslint/parser": "^6.12.0", 19 | "eslint": "^8.54.0", 20 | "ts-loader": "^9.5.1", 21 | "typescript": "^5.6.3", 22 | "webpack": "^5.95.0", 23 | "webpack-cli": "^5.1.4" 24 | }, 25 | "dependencies": {} 26 | } 27 | -------------------------------------------------------------------------------- /src/ast.ts: -------------------------------------------------------------------------------- 1 | import { checkLoop, clearClippies, WARN } from './debug' 2 | import { type InfixOperator, infixOperators } from './eval' 3 | 4 | export type Asts = 5 | | WindowAst 6 | | GraphicAst 7 | | FileAst 8 | | InstructionAst 9 | | FlowAst 10 | | FunctionAst 11 | | NumberAst 12 | | StringAst 13 | | InfixAst 14 | | VariableAst 15 | | PropertyAst 16 | | LoopAst 17 | export type AstByKind = Extract 18 | 19 | export interface WindowAst { 20 | kind: 'WINDOW' 21 | playButtons: SceneNode[] 22 | stopButtons: SceneNode[] 23 | setup: FlowAst | null 24 | loop: FlowAst | null 25 | at: SectionNode 26 | } 27 | 28 | export interface GraphicAst { 29 | kind: 'GRAPHIC' 30 | at: SceneNode 31 | } 32 | 33 | export interface FileAst { 34 | kind: 'FILE' 35 | data: string 36 | at: SceneNode 37 | } 38 | 39 | export interface FunctionAst { 40 | kind: 'FUNCTION' 41 | text: string 42 | at: TextNode 43 | } 44 | 45 | export interface InfixAst { 46 | kind: 'INFIX' 47 | operator: InfixOperator 48 | left: NumberAst | StringAst | PropertyAst | null 49 | right: NumberAst | StringAst | PropertyAst | null 50 | at: TextNode 51 | } 52 | 53 | export interface NumberAst { 54 | kind: 'NUMBER' 55 | value: number 56 | at: SceneNode 57 | } 58 | 59 | export interface StringAst { 60 | kind: 'STRING' 61 | value: string 62 | at: SceneNode 63 | } 64 | 65 | export interface VariableAst { 66 | kind: 'VARIABLE' 67 | name: string 68 | propertyInitializer: PropertyAst | null 69 | at: ShapeWithTextNode 70 | } 71 | 72 | export interface PropertyAst { 73 | kind: 'PROPERTY' 74 | name: string 75 | parent: DataAsts | 'CURRENT_WINDOW' 76 | at: SceneNode 77 | } 78 | 79 | export interface LoopAst { 80 | kind: 'LOOP' 81 | body: InstructionAst | null 82 | at: TextNode 83 | } 84 | 85 | export type InstructionInnerAsts = 86 | | FunctionAst 87 | | NumberAst 88 | | StringAst 89 | | InfixAst 90 | | LoopAst 91 | 92 | export interface InstructionAst { 93 | kind: 'INSTRUCTION' 94 | instruction: InstructionInnerAsts 95 | inputs: DataAsts[] 96 | outputs: DataAsts[] 97 | matchArms: Map | null 98 | next: InstructionAst | null 99 | at: TextNode 100 | } 101 | 102 | export type DataAsts = 103 | | FlowAst 104 | | GraphicAst 105 | | FileAst 106 | | VariableAst 107 | | PropertyAst 108 | | NumberAst 109 | | StringAst 110 | 111 | export interface FlowAst { 112 | kind: 'FLOW' 113 | name: string 114 | first: InstructionAst | null 115 | at: TextNode 116 | } 117 | 118 | export async function compilePage(page: PageNode): Promise { 119 | await clearClippies('WARNING') 120 | 121 | const windows: WindowAst[] = [] 122 | 123 | const ctx: CompileContext = {} 124 | 125 | for (const node of page.children) { 126 | if (node.type !== 'SECTION') continue 127 | windows.push(await compileWindow(node, ctx)) 128 | } 129 | 130 | return windows 131 | } 132 | 133 | interface CompileContext {} 134 | 135 | interface ConnectorDirections { 136 | incomingArrows: SceneNode[] 137 | outgoingArrows: SceneNode[] 138 | next: SceneNode[] 139 | } 140 | 141 | async function getConnections(node: SceneNode): Promise { 142 | checkLoop() 143 | 144 | const incomingArrows: SceneNode[] = [] 145 | const outgoingArrows: SceneNode[] = [] 146 | const next: SceneNode[] = [] 147 | 148 | for (const connector of node.attachedConnectors) { 149 | if (!('endpointNodeId' in connector.connectorStart)) continue 150 | if (!('endpointNodeId' in connector.connectorEnd)) continue 151 | if (connector.connectorStart.endpointNodeId === connector.connectorEnd.endpointNodeId) continue 152 | 153 | const polarized = connector.connectorStart.endpointNodeId === node.id 154 | ? { 155 | thisCap: connector.connectorStartStrokeCap, 156 | otherNode: (await figma.getNodeByIdAsync(connector.connectorEnd.endpointNodeId)) as SceneNode, 157 | otherCap: connector.connectorEndStrokeCap 158 | } 159 | : { 160 | thisCap: connector.connectorEndStrokeCap, 161 | otherNode: (await figma.getNodeByIdAsync(connector.connectorStart.endpointNodeId)) as SceneNode, 162 | otherCap: connector.connectorStartStrokeCap 163 | } 164 | 165 | if (polarized.otherCap !== 'NONE') { 166 | outgoingArrows.push(polarized.otherNode) 167 | } else if (polarized.thisCap !== 'NONE') { 168 | incomingArrows.push(polarized.otherNode) 169 | } else if (connector.connectorEnd.endpointNodeId !== node.id) { 170 | next.push((await figma.getNodeByIdAsync(connector.connectorEnd.endpointNodeId)) as SceneNode) 171 | } 172 | } 173 | 174 | // Sort next top-to-bottom. 175 | next.sort((a, b) => a.y - b.y) 176 | 177 | return { incomingArrows, outgoingArrows, next } 178 | } 179 | 180 | async function compileData(node: SceneNode, ctx: CompileContext): Promise { 181 | if (node.type === 'SHAPE_WITH_TEXT') { 182 | const text = node.text.characters.trim() 183 | 184 | if (text.length > 0) { 185 | if (node.shapeType === 'SQUARE') { 186 | const { incomingArrows } = await getConnections(node) 187 | const inputs = [] 188 | for (const incomingArrow of incomingArrows) { 189 | if (incomingArrow.type !== 'SHAPE_WITH_TEXT' || incomingArrow.shapeType !== 'ELLIPSE') continue 190 | const input = await compileData(incomingArrow, ctx) 191 | if (input) inputs.push(input) 192 | } 193 | 194 | return { 195 | kind: 'VARIABLE', 196 | name: text, 197 | propertyInitializer: inputs.find(input => input.kind === 'PROPERTY') ?? null, 198 | at: node, 199 | } 200 | } 201 | 202 | if (node.shapeType === 'ELLIPSE') { 203 | // Property. 204 | 205 | const { incomingArrows } = await getConnections(node) 206 | 207 | const validParents: DataAsts[] = [] 208 | for (const incomingArrow of incomingArrows) { 209 | if (incomingArrow.type === 'SHAPE_WITH_TEXT') { 210 | const data = await compileData(incomingArrow, ctx) 211 | if (data) validParents.push(data) 212 | } 213 | } 214 | 215 | if (validParents.length > 1) { 216 | WARN(`property '${text}' has more than one valid parents, only one will be used.`, node) 217 | } 218 | 219 | return { 220 | kind: 'PROPERTY', 221 | name: text, 222 | parent: validParents[0] ?? 'CURRENT_WINDOW', 223 | at: node, 224 | } 225 | } 226 | 227 | if (node.shapeType === 'ENG_DATABASE') { 228 | // File. 229 | 230 | return { 231 | kind: 'FILE', 232 | data: text, 233 | at: node 234 | } 235 | } 236 | } 237 | 238 | return { 239 | kind: 'GRAPHIC', 240 | at: node, 241 | } 242 | } 243 | 244 | if (node.type === 'TEXT') return await compileFlow(node, ctx) 245 | 246 | return { 247 | kind: 'GRAPHIC', 248 | at: node, 249 | } 250 | // WARN(`could not interpret this data, it will be ignored.`, node) 251 | // return null 252 | } 253 | 254 | function tryParseAsNumber(text: string): number | null { 255 | text = text.trim() 256 | if (!/^-?(?:\d*\.)?\d+$/.test(text)) return null 257 | return parseFloat(text) 258 | } 259 | 260 | function tryParseAsString(text: string): string | null { 261 | text = text.trim() 262 | if (!/^[/“”"/].*[/“”"/]$/.test(text)) return null 263 | return text.slice(1, -1) 264 | } 265 | 266 | async function compileInfixSide(text: string, _ctx: CompileContext, at: SceneNode): Promise { 267 | text = text.trim() 268 | 269 | const number = tryParseAsNumber(text) 270 | if (number !== null) { 271 | return { 272 | kind: 'NUMBER', 273 | value: number, 274 | at, 275 | } 276 | } 277 | 278 | const string = tryParseAsString(text) 279 | if (string !== null) { 280 | return { 281 | kind: 'STRING', 282 | value: string, 283 | at, 284 | } 285 | } 286 | 287 | if (text.length > 0) { 288 | return { 289 | kind: 'PROPERTY', 290 | name: text, 291 | parent: 'CURRENT_WINDOW', 292 | at, 293 | } 294 | } 295 | 296 | return null 297 | } 298 | 299 | async function compileInstruction(node: TextNode, ctx: CompileContext): Promise { 300 | const { inputs, outputs } = await getInputsAndOutputs(node, ctx) 301 | const text = node.characters.trim() 302 | 303 | async function getInner(node: TextNode): Promise { 304 | if (text === 'loop') { 305 | return { 306 | kind: 'LOOP', 307 | body: await compileInstructions(node, ctx), 308 | at: node, 309 | } 310 | } 311 | 312 | const number = tryParseAsNumber(text) 313 | if (number !== null) { 314 | return { 315 | kind: 'NUMBER', 316 | value: number, 317 | at: node, 318 | } 319 | } 320 | 321 | const string = tryParseAsString(text) 322 | if (string !== null) { 323 | return { 324 | kind: 'STRING', 325 | value: string, 326 | at: node, 327 | } 328 | } 329 | 330 | for (const operator of infixOperators) { 331 | const [ leftText, rightText, ...rest ] = text.split(operator) 332 | 333 | if (rightText === undefined) continue 334 | if (rest.length > 0) WARN('too many operands passed to infix operator.', node) 335 | 336 | return { 337 | kind: 'INFIX', 338 | operator, 339 | left: await compileInfixSide(leftText, ctx, node), 340 | right: await compileInfixSide(rightText, ctx, node), 341 | at: node, 342 | } 343 | } 344 | 345 | return { 346 | kind: 'FUNCTION', 347 | text: text, 348 | at: node, 349 | } 350 | } 351 | 352 | const instruction = await getInner(node) 353 | 354 | if (instruction.kind === 'LOOP') { 355 | return { 356 | kind: 'INSTRUCTION', 357 | next: null, 358 | matchArms: null, 359 | instruction, 360 | inputs, 361 | outputs, 362 | at: node, 363 | } 364 | } 365 | 366 | if (node.fontName === figma.mixed) WARN('mixed font detected, cannot detect italics.', node) 367 | 368 | if (node.fontName !== figma.mixed && node.fontName.style.includes('Italic')) { 369 | const { next } = await getConnections(node) 370 | 371 | const matchArms: Map = new Map() 372 | 373 | for (const destination of next) { 374 | if (destination.type !== 'TEXT') { 375 | WARN('cannot match against non-text.', destination) 376 | continue 377 | } 378 | 379 | const destinationText = destination.characters.trim() 380 | if (matchArms.has(destinationText)) { 381 | WARN(`duplicate match arm, one will be ignored.`, destination) 382 | } 383 | 384 | const nextInstruction = await compileInstructions(destination, ctx) 385 | if (nextInstruction) matchArms.set(destinationText, nextInstruction) 386 | } 387 | 388 | return { 389 | kind: 'INSTRUCTION', 390 | next: null, 391 | matchArms, 392 | instruction, 393 | inputs, 394 | outputs, 395 | at: node, 396 | } 397 | } 398 | 399 | return { 400 | kind: 'INSTRUCTION', 401 | next: await compileInstructions(node, ctx), 402 | matchArms: null, 403 | instruction, 404 | inputs, 405 | outputs, 406 | at: node, 407 | } 408 | } 409 | 410 | function getTail(instruction: InstructionAst): InstructionAst { 411 | checkLoop() 412 | if (!instruction.next) return instruction 413 | return getTail(instruction.next) 414 | } 415 | 416 | async function compileInstructions(node: SceneNode, ctx: CompileContext): Promise { 417 | const { next } = await getConnections(node) 418 | const nextText: TextNode[] = [] 419 | for (const node of next) { 420 | if (node.type === 'TEXT') { 421 | nextText.push(node) 422 | } else { 423 | WARN(`node type '${node.type}' cannot be a valid instruction.`, node) 424 | } 425 | } 426 | if (nextText.length === 0) return null 427 | 428 | const first: InstructionAst = await compileInstruction(nextText[0], ctx) 429 | 430 | let last: InstructionAst = getTail(first) 431 | for (const subsequent of nextText.slice(1)) { 432 | if (last.next) { 433 | WARN('something horrible happened because this tried to overwrite an instruction.', subsequent) 434 | continue 435 | } 436 | 437 | last.next = await compileInstruction(subsequent, ctx) 438 | last = getTail(last.next) 439 | } 440 | 441 | return first 442 | } 443 | 444 | async function compileFlow(node: TextNode, ctx: CompileContext): Promise { 445 | return { 446 | kind: 'FLOW', 447 | name: node.characters, 448 | first: await compileInstructions(node, ctx), 449 | at: node, 450 | } 451 | } 452 | 453 | export async function compileWindow(node: SectionNode, ctx: CompileContext): Promise { 454 | const { incomingArrows, outgoingArrows } = await getConnections(node) 455 | 456 | let setup: FlowAst | null = null 457 | let loop: FlowAst | null = null 458 | 459 | for (const node of outgoingArrows) { 460 | if (node.type !== 'TEXT') { 461 | WARN(`unknown node type '${node.type}' as child of window.`, node) 462 | continue 463 | } 464 | 465 | if (node.characters === 'setup') { 466 | if (setup) { 467 | WARN(`duplicate setup function! ignoring.`, node) 468 | continue 469 | } 470 | setup = await compileFlow(node, ctx) 471 | } else if (node.characters === 'loop') { 472 | if (loop) { 473 | WARN(`duplicate loop function! ignoring.`, node) 474 | continue 475 | } 476 | loop = await compileFlow(node, ctx) 477 | } else { 478 | WARN(`unknown flow '${node.characters}' on window.`, node) 479 | } 480 | } 481 | 482 | const playButtons = incomingArrows.filter(node => { 483 | if (node.type === 'SHAPE_WITH_TEXT' && node.shapeType === 'TRIANGLE_UP') return true 484 | return false 485 | }) 486 | 487 | const stopButtons = incomingArrows.filter(node => { 488 | if (node.type === 'SHAPE_WITH_TEXT' && node.shapeType === 'SQUARE') return true 489 | return false 490 | }) 491 | 492 | return { 493 | kind: 'WINDOW', 494 | playButtons, 495 | stopButtons, 496 | setup, 497 | loop, 498 | at: node, 499 | } 500 | } 501 | 502 | interface InputsAndOutputs { 503 | inputs: DataAsts[] 504 | outputs: DataAsts[] 505 | } 506 | 507 | async function getInputsAndOutputs(node: SceneNode, ctx: CompileContext): Promise<{ inputs: DataAsts[], outputs: DataAsts[] }> { 508 | const { incomingArrows, outgoingArrows } = await getConnections(node) 509 | 510 | const inputsAndOutputs: InputsAndOutputs = { 511 | inputs: [], 512 | outputs: [], 513 | } 514 | 515 | for (const incomingArrow of incomingArrows) { 516 | const input = await compileData(incomingArrow, ctx) 517 | if (input) inputsAndOutputs.inputs.push(input) 518 | } 519 | 520 | for (const outgoingArrow of outgoingArrows) { 521 | const output = await compileData(outgoingArrow, ctx) 522 | if (output) inputsAndOutputs.outputs.push(output) 523 | } 524 | 525 | return inputsAndOutputs 526 | } 527 | -------------------------------------------------------------------------------- /src/clippy-data.ts: -------------------------------------------------------------------------------- 1 | export const clippyHash = '552bb21748356c6f92f58844007a9acfee0cfac8' 2 | export const clippyBytes = new Uint8Array([137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,100,0,0,0,113,8,6,0,0,0,35,249,6,124,0,0,57,174,73,68,65,84,120,218,236,216,11,80,83,103,22,7,240,115,31,168,184,21,84,140,8,10,168,197,23,174,8,234,118,213,90,31,21,80,91,31,32,86,84,86,90,181,2,107,49,62,64,65,167,173,248,86,80,68,158,1,209,90,241,173,188,4,36,136,90,197,74,165,106,20,16,44,34,168,32,136,10,9,207,36,144,220,123,246,75,38,186,44,211,221,98,103,59,163,133,223,204,153,67,114,153,76,230,252,243,229,203,119,225,109,151,126,94,66,37,39,222,102,83,83,115,25,104,37,44,166,136,10,221,127,129,21,69,166,177,145,225,137,20,116,248,227,100,103,229,83,217,89,15,89,248,79,84,232,158,168,238,177,71,19,123,126,127,232,226,123,208,74,120,232,121,182,99,114,127,0,201,205,71,12,232,196,126,119,185,123,66,220,207,203,206,156,185,30,119,246,116,86,225,209,35,153,213,209,81,23,101,225,97,25,149,225,161,233,146,136,176,140,163,209,209,233,243,35,66,15,255,5,136,208,176,139,76,104,72,2,5,239,40,42,247,206,19,120,203,176,164,212,64,200,27,155,54,168,57,206,167,89,197,247,84,171,57,80,40,21,80,93,221,0,50,105,35,104,30,179,44,3,12,41,150,97,128,166,169,103,0,252,87,0,144,0,4,199,53,211,164,241,240,142,161,225,45,194,48,140,30,105,106,133,92,61,130,12,184,64,191,107,151,29,52,5,61,27,27,27,149,101,79,95,64,65,126,9,228,223,43,132,146,146,71,80,86,86,70,234,41,60,175,124,209,44,147,213,42,229,10,165,9,201,40,158,71,94,4,160,197,3,137,169,227,251,230,119,202,207,45,103,129,184,117,163,120,234,47,249,21,234,130,252,50,204,188,92,32,255,254,187,203,184,249,219,35,232,233,17,84,239,230,182,229,150,171,235,215,153,243,231,109,184,49,111,238,198,130,133,46,155,234,22,204,223,140,95,46,9,196,181,171,163,248,45,254,39,149,65,65,41,24,18,146,150,0,58,33,193,29,155,253,27,203,187,83,206,0,113,59,251,209,184,194,251,21,120,47,175,12,51,210,115,20,145,225,105,232,189,86,36,117,91,248,141,112,174,163,103,111,104,1,145,163,60,221,183,11,102,127,42,156,56,103,214,218,40,39,199,13,234,165,95,236,194,141,190,135,27,247,6,38,97,104,112,202,119,64,4,239,79,103,58,38,252,6,110,222,40,166,128,16,159,203,235,81,88,80,81,253,224,151,10,188,148,145,167,136,8,73,197,181,107,34,111,207,28,189,92,0,175,237,161,0,132,52,192,74,10,90,153,50,117,209,251,14,246,94,119,23,45,216,130,126,235,15,41,130,246,156,195,176,253,169,110,160,93,37,29,191,190,126,211,231,110,139,169,177,227,254,74,93,189,44,233,4,196,189,156,167,161,197,69,47,48,251,167,34,121,76,116,6,250,172,141,204,1,0,61,32,60,151,7,116,250,194,109,35,5,45,8,189,2,41,247,229,187,40,199,217,222,204,140,105,107,244,64,99,24,176,147,166,120,220,93,188,104,43,250,111,58,142,251,247,165,60,15,13,58,99,0,196,254,125,73,29,95,93,173,141,159,48,150,158,231,228,200,122,173,248,146,134,22,114,37,207,44,138,10,43,84,247,242,159,240,167,79,93,199,141,126,7,235,102,59,173,234,163,13,195,125,143,30,180,193,164,201,203,180,193,218,124,224,56,194,222,126,37,122,253,51,180,57,48,32,17,195,66,210,86,3,17,178,175,99,149,188,54,106,212,72,218,211,125,41,3,45,44,93,226,241,23,31,31,63,51,0,232,158,253,83,254,225,135,15,42,49,243,234,253,166,93,59,207,224,82,183,29,243,129,88,181,50,76,15,222,192,135,227,60,88,109,240,31,46,75,114,153,191,9,183,248,159,32,27,252,249,44,32,182,125,147,209,241,139,75,195,218,122,56,11,58,83,236,38,90,186,46,112,241,91,224,226,156,49,215,105,230,147,89,159,78,171,155,62,205,190,201,201,201,9,221,151,123,170,189,86,124,141,203,150,108,44,2,29,171,97,131,24,120,3,99,199,127,193,2,49,97,210,18,143,105,211,215,160,239,186,131,252,190,160,148,250,24,81,106,31,32,34,195,146,41,104,175,204,204,251,82,182,35,173,105,32,236,237,167,152,207,115,154,125,194,217,113,38,58,216,77,193,81,182,214,56,96,128,25,234,119,5,4,208,22,175,235,234,129,239,27,161,181,181,117,206,136,17,195,39,0,97,96,208,149,134,54,114,116,22,50,64,56,185,8,237,237,236,86,224,170,149,17,170,160,189,73,24,35,74,251,59,16,162,240,20,166,93,30,12,205,205,205,232,87,131,30,48,208,124,125,125,93,253,147,138,103,149,11,238,230,222,207,251,229,225,227,88,30,233,144,158,70,189,118,79,119,248,236,164,112,165,15,216,216,140,4,13,99,99,19,166,174,150,230,94,190,124,110,45,149,202,174,153,152,152,76,4,0,94,32,16,48,208,6,221,186,117,3,13,67,3,3,37,69,49,192,241,60,104,32,199,26,234,58,180,59,22,253,45,40,32,204,204,250,233,9,4,70,241,166,125,77,100,102,102,230,223,0,192,32,104,229,113,113,157,227,131,251,207,48,49,46,83,189,216,213,143,27,50,100,200,3,99,99,1,26,26,118,67,3,131,247,208,210,210,242,8,128,22,11,109,224,48,99,25,3,132,221,140,207,39,218,219,125,133,171,133,34,85,208,158,100,20,133,167,78,6,34,60,228,237,95,33,236,255,119,191,176,166,72,195,89,51,103,51,5,247,243,125,201,39,251,7,0,152,11,58,18,201,109,86,44,78,99,84,42,154,2,0,165,76,38,221,64,211,0,82,153,146,49,50,178,184,6,0,19,5,130,190,147,121,108,90,169,144,43,204,170,171,165,129,64,8,4,189,120,104,3,69,3,79,1,161,146,195,32,195,110,93,65,95,191,51,32,240,192,211,76,13,16,72,83,8,237,81,112,112,112,119,210,244,225,127,184,156,33,25,157,35,121,130,153,87,11,154,183,250,199,226,98,151,111,23,195,175,24,60,120,16,5,109,52,102,140,7,3,196,132,201,238,73,30,238,123,113,95,80,34,6,6,196,55,136,68,98,19,32,34,35,210,40,104,79,16,145,129,22,200,77,193,145,60,207,59,35,226,10,149,74,229,83,95,95,191,162,164,164,120,86,92,146,168,159,56,229,246,241,59,183,30,99,98,194,13,220,176,46,186,106,246,156,207,13,128,112,176,115,98,73,99,72,209,195,135,91,209,208,70,83,237,61,104,32,108,198,207,238,251,201,116,111,249,246,109,199,241,64,180,24,183,109,59,118,13,136,160,32,49,13,237,9,25,60,163,11,165,59,249,123,27,169,7,72,144,142,186,174,173,230,230,38,172,169,145,226,131,194,34,204,250,49,91,117,48,58,25,215,173,61,16,6,68,192,174,195,157,224,119,114,158,187,145,5,194,113,142,159,208,211,61,24,15,68,93,144,71,132,166,106,14,153,187,129,216,252,237,113,22,218,11,142,227,94,133,97,79,134,46,37,213,50,8,53,185,174,122,85,154,199,136,90,124,99,67,157,90,114,243,103,60,115,226,84,12,232,28,60,120,136,134,223,97,134,189,47,5,196,2,23,223,236,85,194,32,12,15,137,231,2,119,159,230,183,251,39,247,5,194,105,206,178,78,131,7,89,81,237,97,101,208,186,48,70,180,8,161,137,52,142,192,255,130,111,113,141,123,84,242,8,83,146,197,9,0,64,1,17,21,117,128,126,163,48,28,236,24,32,166,217,77,155,247,153,179,19,78,250,232,3,206,214,198,10,39,79,180,231,198,141,253,224,128,173,173,173,21,232,244,239,223,159,105,23,251,6,25,112,90,139,48,94,175,16,178,143,160,68,34,193,212,212,20,76,76,140,199,43,87,126,192,170,170,42,124,133,227,120,36,84,197,197,165,152,16,159,146,14,58,59,119,110,165,160,237,24,32,134,13,51,77,37,13,41,134,85,117,239,222,131,51,48,4,213,192,129,230,56,116,168,37,14,25,50,56,100,140,205,4,22,8,114,190,97,225,207,168,180,236,49,5,68,78,222,173,222,74,165,178,65,23,196,235,79,127,97,97,33,174,18,126,133,211,63,254,16,109,6,91,32,0,104,203,196,68,128,49,49,49,40,151,55,234,86,20,167,13,242,246,173,123,120,44,54,62,0,136,11,226,31,89,104,3,255,205,34,10,136,179,151,74,41,63,223,253,121,174,139,60,208,194,220,84,213,175,159,129,246,110,128,160,183,33,26,247,238,73,158,235,139,22,22,253,10,134,14,29,108,6,132,169,105,159,63,95,40,249,247,238,176,64,220,204,254,209,181,177,81,155,135,250,85,24,47,94,188,192,89,211,166,226,124,167,89,232,229,233,142,75,221,92,241,211,233,246,56,102,140,45,154,153,247,211,6,227,238,190,92,187,130,116,248,202,103,82,62,245,220,53,12,216,21,60,26,8,81,68,44,3,191,97,179,255,49,26,8,178,145,143,57,117,226,42,222,188,241,80,117,244,72,58,122,122,4,136,1,192,17,192,56,12,160,71,25,128,62,154,154,24,161,185,121,159,10,0,65,111,32,118,238,88,168,151,156,236,75,193,159,69,246,141,44,22,136,139,25,226,157,53,50,25,18,42,181,90,141,26,113,113,103,181,67,95,228,226,76,194,88,132,11,156,29,113,242,71,227,112,208,224,1,216,219,88,128,163,71,143,210,94,143,142,142,198,87,106,106,26,84,153,63,228,226,161,131,241,177,64,36,37,100,178,240,43,144,231,41,30,145,65,68,246,142,164,64,31,136,221,187,206,110,190,114,41,7,115,239,62,86,30,59,114,5,195,67,247,70,223,187,187,206,246,218,245,64,107,209,94,119,91,123,135,191,109,5,232,44,5,0,28,56,208,36,11,90,201,56,191,142,77,73,242,102,227,227,188,153,83,167,86,83,239,228,189,172,218,218,58,208,32,39,106,133,92,46,135,150,26,26,26,65,163,74,42,131,167,229,229,80,249,252,57,200,200,255,43,21,74,80,171,56,40,125,82,6,157,59,119,130,176,176,48,242,58,181,160,197,35,205,178,44,232,233,233,79,2,50,61,82,234,160,189,135,168,86,97,176,154,70,138,35,165,38,165,32,165,223,91,208,101,97,39,61,61,168,173,145,235,85,85,189,68,83,227,167,203,75,203,80,82,91,86,158,99,102,166,127,195,207,219,206,229,68,236,151,140,131,157,13,95,82,242,108,220,63,92,39,138,178,174,111,27,29,30,229,105,2,160,165,214,21,71,10,175,136,215,51,201,9,222,108,220,233,53,204,201,227,66,234,157,184,117,34,171,174,67,109,32,47,107,110,85,86,74,193,196,212,148,34,64,99,232,208,161,186,195,161,2,164,210,151,192,33,130,92,174,4,133,92,1,28,199,107,203,216,184,15,228,230,230,146,240,26,192,208,208,16,154,154,155,41,21,121,30,144,237,179,109,83,164,102,80,143,245,59,119,163,72,71,205,170,224,254,61,184,46,128,56,9,1,198,219,216,14,51,107,104,144,125,164,82,161,165,90,205,243,213,213,117,244,251,150,250,128,106,228,177,177,6,245,216,174,20,213,165,115,39,85,83,211,32,99,65,87,240,242,252,152,188,167,38,190,224,126,133,199,203,74,169,135,101,223,110,13,169,73,62,143,148,205,120,135,71,254,38,242,244,205,242,90,46,15,0,228,208,194,165,243,62,76,157,92,77,53,55,3,15,64,234,109,20,26,28,65,1,104,117,73,74,72,47,47,127,250,28,9,14,9,21,153,144,80,184,18,1,128,236,27,163,176,255,0,11,236,213,171,23,246,52,234,129,70,70,70,104,101,101,165,189,54,115,230,39,168,80,200,81,163,232,65,57,47,22,75,240,208,1,177,204,215,123,123,47,32,252,191,142,162,52,97,180,88,33,171,121,158,47,231,17,95,31,56,117,56,212,105,86,53,97,105,105,49,94,185,112,18,227,207,172,195,148,68,33,127,254,220,58,62,53,113,45,127,73,188,30,79,29,245,66,77,176,1,59,22,114,87,47,248,97,122,178,55,254,139,121,115,15,246,171,170,238,248,103,237,189,207,57,191,223,239,190,242,36,185,201,13,36,129,240,48,64,128,0,130,20,112,90,166,218,22,109,90,139,90,173,116,198,78,167,213,58,34,40,150,218,170,197,62,44,62,241,129,143,209,90,173,15,66,37,50,198,34,90,180,130,198,14,130,8,33,40,144,144,4,242,184,185,247,38,185,239,223,253,61,206,217,123,245,204,158,51,55,214,106,181,14,25,249,206,172,217,255,236,245,207,250,238,181,190,107,173,223,249,125,253,223,223,168,119,149,231,87,183,190,81,239,252,242,117,195,95,185,227,186,173,119,108,121,227,155,190,184,249,218,139,63,242,241,215,247,194,49,204,236,122,139,108,221,242,6,247,111,155,95,111,63,251,217,191,16,158,65,200,231,254,245,75,207,68,150,21,211,211,147,127,118,234,186,51,63,118,250,25,39,231,203,6,251,18,231,18,38,39,39,185,225,134,191,42,231,138,143,1,176,96,193,34,196,40,211,83,211,120,239,1,120,240,193,31,112,222,121,231,50,51,221,226,145,237,251,194,216,216,148,25,29,25,221,14,156,243,187,87,190,72,218,197,62,0,5,88,125,242,137,183,161,250,82,136,240,34,162,37,208,16,12,34,70,149,8,99,4,17,161,211,201,217,245,196,163,60,181,231,187,56,183,7,33,33,247,129,90,45,97,219,119,159,228,59,219,118,242,151,111,122,161,18,188,138,16,68,0,85,171,32,65,65,3,4,85,74,27,245,65,191,87,218,93,237,142,252,39,176,19,142,161,191,142,155,235,120,237,20,33,0,10,191,60,100,228,96,243,153,210,162,112,231,157,119,126,121,245,154,181,47,30,26,90,214,89,122,66,95,182,112,209,0,62,120,190,125,239,189,220,113,199,29,124,232,67,31,174,126,9,92,207,239,253,254,38,174,190,250,234,114,121,120,42,69,94,240,232,142,3,28,60,120,164,51,49,62,147,29,26,57,116,3,112,83,226,82,247,186,55,252,30,64,97,173,189,14,213,247,34,210,17,72,0,19,66,192,24,243,179,182,7,148,62,0,60,181,247,32,143,63,122,15,137,123,16,49,41,26,131,12,31,188,229,94,94,241,242,11,89,178,184,135,110,238,17,20,17,48,130,10,26,132,120,213,6,13,162,74,244,9,113,9,193,118,175,225,238,162,224,107,187,15,23,247,1,45,42,156,181,210,185,102,39,104,167,171,191,20,57,242,215,55,220,244,140,17,242,15,255,244,151,217,39,62,182,229,158,21,43,87,92,180,100,241,162,162,127,97,67,150,44,233,179,75,22,15,144,23,57,147,147,19,168,6,178,172,198,192,192,2,0,14,143,77,242,244,83,71,24,29,157,237,52,103,155,89,73,198,206,55,92,119,213,153,64,254,31,95,191,215,0,225,75,95,124,191,251,192,45,183,61,153,166,233,73,170,26,36,102,131,34,34,76,76,76,148,58,244,48,135,134,15,161,8,43,87,174,164,44,135,148,229,17,5,168,238,237,218,245,52,143,255,240,91,244,212,30,5,18,106,153,101,199,143,70,8,94,57,251,172,65,90,237,2,37,6,156,42,240,209,23,20,65,213,64,0,213,18,46,18,58,127,87,15,250,32,95,207,11,221,50,50,17,238,5,154,84,88,125,130,115,173,60,104,167,243,139,103,142,188,227,237,31,224,25,130,5,252,219,110,188,198,220,252,254,207,126,166,252,245,239,143,202,160,211,104,212,124,45,75,180,167,167,230,74,195,57,67,94,4,154,179,45,157,158,110,235,204,76,43,148,165,197,204,53,91,102,236,240,232,190,253,7,14,92,14,60,181,112,193,128,125,217,43,158,167,64,24,31,31,63,251,204,245,27,182,55,26,61,90,66,74,139,153,241,248,19,143,243,238,119,254,61,7,247,61,133,170,178,231,137,135,120,242,80,139,161,85,203,249,224,7,62,194,166,77,155,34,25,0,221,110,151,31,60,248,4,195,195,223,164,183,103,63,104,70,81,20,28,30,107,177,230,196,62,188,6,4,1,224,88,192,3,222,43,133,39,6,95,181,34,7,85,17,13,160,70,149,210,4,175,145,156,145,224,245,238,194,179,101,116,92,191,9,204,82,97,232,4,227,218,121,248,185,13,129,220,248,182,15,61,211,109,116,0,112,174,241,226,69,139,23,253,109,79,111,223,185,181,90,70,150,213,49,80,149,11,137,93,83,25,16,242,60,103,182,57,205,228,196,244,173,119,109,189,227,207,128,153,43,126,235,119,34,185,87,188,240,84,7,20,205,230,244,159,156,119,238,69,159,44,9,46,66,8,206,24,195,244,204,52,175,46,75,222,232,240,126,6,135,86,145,56,71,179,53,199,248,196,36,7,14,14,179,119,239,211,124,228,150,91,120,205,107,95,139,106,64,68,202,76,28,101,251,67,143,208,168,221,67,146,64,225,21,31,32,6,90,64,0,35,32,2,6,65,81,64,209,160,20,33,16,60,228,30,124,36,39,58,98,32,136,16,140,168,40,106,67,204,174,72,224,168,87,217,90,4,110,125,229,31,117,239,5,2,192,182,175,45,48,7,198,155,166,93,4,255,211,178,70,222,242,230,119,243,12,67,54,156,119,190,1,60,192,158,93,79,93,94,175,103,175,246,98,94,85,175,213,36,113,137,162,70,124,232,182,138,110,177,119,174,213,250,246,248,248,145,79,1,15,0,244,52,250,45,149,239,197,151,174,138,132,76,79,141,191,238,146,75,46,253,208,9,203,6,11,239,189,179,214,178,253,145,237,156,179,225,28,46,188,224,60,140,40,198,88,218,237,54,83,37,81,115,173,46,203,78,88,206,195,15,63,204,253,247,223,207,5,23,92,0,104,44,143,219,31,222,75,107,102,27,203,150,30,164,40,146,72,134,66,204,16,31,230,117,2,85,142,145,132,2,145,4,52,64,188,23,20,95,17,229,189,34,8,34,65,173,136,23,65,148,96,85,133,72,142,178,203,171,222,222,205,245,54,96,59,21,250,234,214,181,115,85,192,83,65,222,247,158,47,112,156,96,87,173,90,161,64,184,234,181,207,175,253,250,217,127,56,86,120,237,115,137,163,191,175,103,215,101,151,110,188,12,24,161,194,64,223,26,251,244,222,93,241,254,177,207,122,178,4,200,143,28,109,94,127,193,133,87,188,235,244,51,206,152,39,228,177,199,30,139,90,177,254,204,231,48,61,53,25,5,188,40,186,116,58,93,186,221,16,53,100,247,238,221,229,146,242,157,101,167,119,195,188,94,61,246,232,48,135,70,30,97,104,240,33,132,12,8,8,128,42,241,0,130,130,215,24,112,188,215,138,164,0,170,8,213,45,85,34,153,65,81,148,162,202,156,160,64,36,83,43,114,130,81,48,145,28,85,66,208,255,42,130,124,122,162,93,108,1,198,249,9,148,31,44,223,200,113,132,5,188,179,230,252,225,145,241,7,134,71,70,242,185,86,59,89,123,210,178,207,2,87,247,245,157,108,207,223,184,70,102,103,166,21,240,112,12,151,93,242,100,244,109,212,237,201,71,39,242,29,38,189,162,126,241,243,158,167,141,70,93,0,90,237,54,47,127,217,203,216,186,117,107,236,212,70,199,70,48,98,136,98,12,244,247,247,199,191,44,92,123,237,181,188,247,189,239,69,68,24,62,120,148,39,30,63,196,240,240,30,134,86,126,143,234,203,20,4,16,20,35,96,0,169,76,161,106,123,171,108,240,80,20,161,60,3,90,9,190,81,16,9,68,196,187,68,243,65,240,243,186,67,176,70,131,49,88,2,82,9,201,97,85,238,10,65,110,239,4,247,77,96,206,137,138,252,201,171,255,225,184,255,249,198,37,230,229,205,102,126,235,216,232,209,118,192,215,78,63,101,213,117,192,251,203,160,198,12,224,39,112,245,43,243,42,30,144,24,185,207,152,246,115,71,143,158,230,79,90,243,124,123,198,250,33,210,52,5,132,29,59,30,229,236,179,207,2,224,204,245,235,105,206,205,197,224,89,99,88,92,102,200,3,101,185,218,188,121,51,47,43,137,11,193,179,243,137,17,246,236,25,101,252,200,211,156,126,202,195,136,129,224,149,34,150,31,40,60,209,31,192,160,88,169,200,17,69,35,41,16,162,249,168,63,185,15,248,42,51,68,3,70,136,6,138,0,149,216,207,223,129,72,94,199,26,50,145,234,25,32,159,111,23,238,205,192,176,51,42,174,221,246,28,111,212,141,156,171,1,106,89,77,210,212,209,211,211,251,67,0,103,211,192,79,65,106,143,88,160,104,229,250,14,35,60,87,72,243,254,222,189,201,222,61,67,88,107,56,113,245,82,250,251,123,56,235,172,51,121,232,161,135,120,205,159,191,134,251,190,119,31,28,67,25,248,61,92,127,253,245,92,121,229,139,0,152,153,105,115,100,108,134,185,166,71,204,44,105,6,26,28,106,2,46,4,130,106,165,15,149,105,124,225,243,122,98,16,32,0,130,49,134,132,128,53,66,176,130,143,164,74,204,182,110,80,208,249,140,139,102,29,4,21,13,65,131,87,147,229,94,103,141,225,61,117,231,110,6,166,0,186,162,2,168,92,113,249,155,143,123,201,90,113,98,227,43,69,46,87,250,34,132,172,230,194,218,53,203,78,7,118,183,219,255,251,111,103,191,243,194,67,209,7,216,232,149,239,107,9,196,224,156,151,241,241,94,138,226,215,40,87,232,44,27,28,160,252,173,131,90,173,198,220,92,147,242,71,48,182,109,251,78,220,151,245,247,15,148,66,126,62,151,252,218,37,56,235,232,118,115,202,255,156,48,50,60,201,200,200,12,131,131,15,151,54,77,158,11,34,138,160,136,2,40,68,225,214,31,23,247,72,76,238,181,210,148,64,8,16,125,8,160,74,132,50,239,227,67,168,196,158,170,57,8,222,136,88,19,125,228,54,99,211,215,3,99,0,121,209,117,45,159,204,119,92,114,205,53,55,113,156,32,128,222,124,243,155,164,252,167,211,99,96,79,51,198,82,171,185,225,223,184,236,212,117,192,220,182,251,126,100,118,238,126,18,32,80,225,166,127,60,49,250,117,231,244,1,17,57,95,4,47,34,150,72,74,193,161,209,5,204,206,157,199,224,242,101,244,246,213,88,184,176,135,197,75,7,74,18,234,252,4,226,6,96,124,162,89,78,234,99,28,61,60,195,248,100,23,95,236,226,226,141,7,80,12,69,212,133,80,189,240,99,194,13,1,209,210,32,146,131,86,90,226,21,175,177,84,17,69,220,107,244,209,138,208,170,8,29,155,101,66,40,77,11,175,234,10,47,90,226,85,192,231,1,82,71,162,193,20,128,194,49,200,159,254,233,113,19,117,3,132,90,205,174,24,62,48,183,203,90,215,112,206,209,168,155,239,1,23,125,242,203,251,171,76,128,231,174,235,196,187,239,187,105,40,106,74,94,132,107,19,43,239,51,34,185,49,146,24,83,205,6,198,225,36,103,255,222,140,3,83,27,24,90,177,130,52,115,100,105,66,86,79,169,215,18,156,19,66,80,242,78,96,174,221,161,28,60,233,180,3,147,147,29,218,173,125,92,122,241,126,122,26,130,247,0,90,205,69,90,213,250,64,81,64,55,158,33,190,116,213,128,40,85,22,41,26,2,62,6,155,106,134,9,149,224,71,146,254,167,216,19,10,192,169,234,81,39,246,55,128,237,237,194,59,144,159,57,32,186,214,92,231,120,102,8,121,87,86,123,245,13,39,46,23,67,162,42,187,33,194,111,186,164,211,223,238,116,123,129,225,235,222,176,206,0,185,15,249,137,170,188,179,91,128,8,46,146,97,192,24,193,42,104,7,106,253,77,62,242,190,79,242,130,203,47,47,59,172,211,232,235,91,8,98,73,157,193,24,19,3,28,95,125,174,180,218,29,218,237,89,78,88,50,194,185,231,28,197,102,48,215,85,172,5,43,32,98,112,128,85,37,88,67,234,148,44,8,222,27,10,239,201,11,83,90,136,36,5,15,243,27,42,81,140,8,42,6,35,138,53,144,88,37,120,162,158,20,62,248,16,196,1,99,206,234,69,192,222,78,225,83,160,203,255,1,121,201,166,235,143,111,135,101,229,143,59,185,124,186,183,183,167,45,70,106,144,255,45,112,163,179,230,5,251,15,30,217,60,61,59,59,144,231,221,191,0,62,10,240,225,247,172,189,93,68,95,98,68,10,68,156,8,128,32,214,226,155,57,89,102,121,236,64,135,87,190,226,251,172,92,51,69,111,109,41,47,125,201,101,108,56,123,136,153,105,139,82,67,212,96,140,39,203,58,101,73,155,97,104,176,197,162,69,5,190,16,10,95,101,68,32,158,213,131,70,8,49,192,194,124,230,84,162,30,240,85,198,228,133,167,155,151,22,91,95,173,246,93,96,228,152,166,168,130,6,74,55,53,65,105,119,60,27,128,157,142,240,243,200,136,112,115,45,207,241,196,64,111,186,222,24,72,211,164,154,134,195,110,128,196,165,47,169,103,245,5,69,128,52,41,222,5,124,244,198,183,44,121,190,106,36,195,151,230,196,128,72,236,106,16,20,27,60,61,11,234,76,63,50,3,44,99,221,234,19,184,231,91,251,89,125,226,33,46,220,232,152,157,43,80,77,17,137,47,157,90,13,178,20,80,161,200,45,70,2,206,10,168,128,3,85,80,148,16,142,205,13,69,36,129,8,3,136,49,88,64,4,68,164,202,4,193,251,74,188,61,149,14,9,94,5,64,37,238,63,1,53,47,6,118,166,166,202,140,95,0,238,232,84,193,113,130,18,87,33,110,157,181,41,198,90,27,66,32,115,18,85,28,117,107,234,245,90,156,41,106,117,179,19,96,174,227,111,22,49,24,67,52,171,130,53,82,154,65,154,29,108,79,138,138,101,223,190,46,212,12,133,119,12,157,188,150,51,78,29,36,49,134,129,70,134,117,130,2,1,27,95,241,204,156,162,72,21,84,153,223,87,33,196,83,85,48,86,113,214,128,6,170,193,46,6,57,47,52,158,193,27,130,130,18,64,44,214,130,136,98,130,224,140,18,42,221,42,188,144,251,224,139,66,92,215,235,59,128,187,173,241,9,208,229,23,132,227,248,193,3,120,100,117,205,57,156,181,137,106,104,166,176,23,192,11,107,107,89,157,36,133,67,99,201,237,239,186,113,252,229,83,211,102,131,24,45,68,140,3,80,1,21,161,104,123,52,87,92,95,66,119,58,176,115,119,151,53,39,193,244,12,92,116,110,31,75,22,59,84,137,58,35,8,70,192,10,212,83,131,181,38,150,157,86,199,83,20,241,101,211,173,214,29,182,122,241,70,4,83,233,9,170,72,80,140,51,68,77,136,122,2,93,239,233,116,161,168,102,14,13,0,138,84,190,38,158,234,141,193,37,214,220,15,188,189,211,153,149,69,181,254,130,255,7,44,199,1,27,207,25,20,128,139,46,88,53,112,244,104,243,173,245,70,214,232,233,105,32,65,247,1,239,92,123,202,41,43,38,38,102,255,90,140,73,32,101,253,233,118,243,218,213,115,111,83,53,139,156,21,177,82,154,21,156,51,164,137,96,91,93,178,129,140,122,221,48,51,165,252,243,173,71,88,56,0,51,51,142,231,94,208,203,249,27,251,240,65,208,24,213,72,9,89,106,153,156,82,182,222,89,196,121,99,104,133,65,4,156,5,231,192,198,123,66,156,208,3,228,5,241,84,0,4,49,32,112,108,193,24,125,133,232,111,4,17,83,77,226,196,50,23,125,171,235,70,204,239,2,135,122,93,102,129,240,43,39,100,213,208,34,3,104,154,164,167,206,76,207,189,113,96,65,191,111,52,234,70,240,143,3,159,82,13,103,54,155,249,159,91,107,233,116,147,201,203,46,155,236,79,211,112,97,8,38,40,98,48,16,15,107,145,182,39,150,173,70,74,150,24,134,15,21,124,240,227,147,156,118,114,194,248,68,141,77,191,61,192,57,103,54,80,64,164,42,45,24,230,58,202,103,62,215,97,203,151,231,120,226,137,54,151,62,175,78,111,195,16,2,84,89,20,205,57,193,217,104,8,16,3,172,74,44,87,81,248,65,85,1,1,2,170,84,89,161,36,209,207,68,51,34,69,8,216,60,240,49,224,19,70,72,128,130,10,191,210,146,229,139,32,16,23,113,43,196,8,141,122,205,39,73,98,37,20,135,1,38,167,154,43,131,2,106,194,178,229,190,119,201,194,226,5,86,32,136,154,160,26,107,182,4,41,77,145,102,78,178,160,129,201,149,36,177,28,62,90,64,71,169,215,29,107,86,245,113,218,186,126,172,133,68,37,158,70,4,151,192,230,219,91,60,240,253,156,85,43,166,24,25,11,52,59,11,169,21,26,203,150,157,159,107,142,205,13,34,32,49,192,84,66,95,149,39,15,221,130,40,248,26,128,138,16,49,6,66,192,24,16,68,141,19,231,140,105,245,226,254,14,192,135,224,1,158,21,132,76,76,52,133,248,189,214,204,18,49,134,44,201,130,32,204,181,187,251,136,68,113,178,49,182,60,147,176,100,97,215,213,51,80,53,85,71,5,34,6,113,6,154,93,164,55,65,82,67,136,193,17,70,14,123,250,151,91,234,105,31,131,75,251,88,180,24,114,79,244,69,133,172,230,216,190,163,205,221,223,128,193,19,58,124,242,11,19,220,242,238,85,172,26,180,20,133,71,28,228,133,86,67,29,85,182,8,86,20,65,16,20,213,120,226,98,67,161,36,22,138,2,34,57,249,188,255,252,125,17,241,165,57,132,91,128,97,69,19,32,127,214,16,146,119,115,0,108,205,173,53,198,96,19,131,168,210,245,221,157,0,138,158,98,172,67,60,244,15,4,196,40,234,13,34,26,201,176,70,16,175,168,15,184,129,58,81,48,157,224,18,97,106,34,176,124,177,37,75,107,172,90,153,80,111,8,237,174,162,24,18,39,52,39,10,190,250,181,192,178,193,132,157,79,78,241,170,151,246,240,7,155,150,98,76,40,13,106,6,50,23,181,3,239,169,74,147,198,44,64,21,17,197,68,19,12,128,42,40,8,96,141,144,37,74,98,163,127,213,238,162,221,66,93,8,116,69,204,135,1,114,196,3,60,107,8,153,105,182,0,232,235,95,184,50,47,2,73,98,132,32,12,244,245,141,2,204,76,53,79,181,198,17,172,149,222,190,130,92,33,247,96,52,150,42,172,19,204,108,135,164,145,162,84,193,176,224,189,48,58,218,97,233,146,4,103,235,172,24,180,44,232,179,132,74,140,179,154,112,207,189,29,142,76,214,169,101,211,124,227,238,89,238,186,115,29,89,195,210,238,20,56,103,0,16,20,99,20,226,25,72,231,151,130,68,113,247,94,200,227,6,152,8,139,32,0,4,168,32,82,137,188,168,119,22,231,189,108,6,158,118,86,29,80,240,75,66,172,125,233,113,219,242,94,117,213,41,91,82,151,253,254,115,214,159,154,23,133,79,102,166,166,46,3,190,211,156,203,119,138,216,117,222,167,225,69,191,61,110,86,46,111,199,21,133,84,237,140,118,61,218,9,200,130,58,26,20,35,6,151,24,58,109,120,251,141,251,176,46,99,233,162,33,54,189,200,113,233,37,26,187,168,146,116,154,45,229,19,255,2,208,224,251,63,216,197,218,53,109,222,250,87,167,17,226,246,245,88,32,109,101,34,128,42,65,3,161,98,85,245,199,167,116,37,47,42,243,90,221,169,244,6,141,166,33,4,31,48,4,185,20,216,22,192,2,254,151,15,220,113,64,8,71,1,56,241,164,190,107,202,175,71,86,173,24,90,110,80,245,83,147,7,222,113,241,165,103,183,247,238,62,252,86,107,93,189,86,75,56,235,57,45,169,215,10,36,118,85,16,59,150,185,46,89,73,70,154,26,106,137,144,89,67,35,51,76,77,122,62,115,219,17,214,172,236,167,183,119,17,27,206,131,129,133,129,188,16,106,53,195,142,29,57,143,63,217,79,150,182,217,242,213,253,188,229,186,21,172,91,219,128,160,100,9,56,43,24,32,196,242,9,185,135,60,128,206,11,53,241,172,212,4,80,172,5,103,33,49,130,137,4,16,9,234,22,161,52,34,25,32,63,0,254,102,58,204,8,16,0,158,53,37,235,245,215,156,43,128,110,220,120,122,109,243,173,247,174,74,211,132,122,154,137,129,201,229,3,173,209,123,190,121,255,162,188,200,122,178,172,65,189,225,8,70,232,20,130,8,88,227,208,86,142,77,19,92,106,230,87,23,130,144,165,134,86,75,121,108,159,231,226,141,53,122,250,107,165,168,183,177,226,241,34,76,206,122,30,218,1,139,23,166,28,216,63,198,198,179,224,244,211,250,240,133,199,136,130,10,6,16,43,81,107,84,171,12,8,26,5,187,83,16,137,18,192,160,216,31,31,20,99,214,4,196,64,146,84,229,51,18,163,161,52,211,201,245,86,128,204,244,90,160,120,86,17,226,146,20,128,201,233,118,42,66,173,36,132,172,52,81,45,128,206,129,49,134,6,23,155,44,73,178,208,215,107,76,111,61,39,78,211,88,66,1,190,29,240,11,235,177,61,117,166,52,4,99,0,35,76,76,4,152,10,152,164,86,234,136,163,183,39,70,145,158,12,134,135,115,198,198,234,172,92,41,236,219,63,195,175,95,222,135,171,91,198,155,30,103,193,137,98,141,34,80,21,27,34,18,99,72,82,69,85,240,243,37,10,186,5,145,48,3,84,183,43,130,124,53,155,160,86,212,25,71,81,79,205,29,16,9,13,0,207,42,66,142,142,117,4,208,118,115,172,175,232,210,235,156,33,73,29,222,251,67,0,87,93,153,189,238,190,7,51,234,61,117,237,239,247,177,107,49,214,150,102,96,166,131,93,144,34,53,11,10,1,65,171,242,210,236,8,163,71,3,201,18,176,164,44,94,4,66,151,118,11,208,80,118,84,29,210,108,9,70,148,195,19,29,46,56,103,17,189,169,50,221,245,116,58,202,76,30,3,137,68,18,136,154,147,88,193,86,223,1,131,153,95,74,38,78,231,219,236,60,15,116,242,72,212,188,206,24,128,24,124,108,8,108,3,118,187,164,48,192,179,143,16,151,80,33,95,42,150,186,113,73,81,106,133,43,10,187,235,55,95,49,182,225,71,143,54,174,14,126,129,14,244,247,218,122,173,11,84,1,201,11,12,96,27,9,84,123,41,5,84,193,134,128,81,31,63,200,94,218,243,223,237,157,123,204,101,103,117,222,127,235,189,236,189,207,229,187,204,140,199,99,198,51,206,120,140,109,174,54,144,114,75,32,24,40,151,130,132,212,164,21,109,90,181,10,164,65,130,148,184,82,104,171,182,169,232,37,105,21,110,34,20,131,211,52,109,69,69,27,85,10,160,136,146,52,41,16,149,0,161,4,7,27,99,123,124,155,241,216,158,171,191,249,174,231,156,189,247,251,190,171,195,210,86,63,241,79,155,182,153,241,16,121,141,246,156,79,71,103,102,116,222,103,175,245,172,245,172,181,246,8,206,69,198,227,158,11,59,29,125,39,140,90,56,249,132,178,186,58,98,209,206,216,179,44,172,172,8,155,155,51,22,109,161,228,140,173,64,88,45,161,108,171,162,34,120,239,169,162,103,84,123,234,218,0,194,33,168,2,8,78,60,85,196,60,43,121,165,237,97,209,42,109,178,46,163,2,120,199,231,0,218,153,92,153,128,172,93,56,43,0,193,51,206,154,137,33,104,51,138,204,102,179,146,230,87,125,168,239,60,16,202,168,110,124,221,116,38,218,161,30,217,234,137,203,13,154,193,187,161,19,151,134,254,67,151,0,199,217,179,45,123,86,5,231,2,147,81,198,151,142,34,145,141,77,229,201,211,13,215,95,239,57,125,186,231,208,161,64,41,61,231,207,47,176,177,29,3,4,84,21,199,80,124,90,38,238,232,91,97,62,143,132,42,208,84,129,170,242,84,193,84,92,28,198,51,80,4,212,225,69,45,201,8,94,53,39,66,215,163,179,133,126,1,192,123,41,0,87,28,32,163,209,24,128,186,246,203,27,27,59,212,77,116,205,104,137,253,251,158,124,139,195,47,119,157,146,115,231,157,199,190,248,100,236,41,179,132,107,34,210,68,74,82,22,73,13,136,197,162,99,62,111,233,187,14,52,178,185,227,88,158,52,246,12,19,216,96,123,187,181,59,187,157,43,57,53,196,224,153,239,100,14,94,147,184,176,189,101,161,202,139,26,71,213,81,168,188,51,32,84,77,222,161,104,70,128,16,50,94,3,153,138,78,3,125,242,152,90,32,24,40,142,130,136,1,68,86,69,139,40,32,49,232,183,129,7,230,219,89,128,43,19,144,179,231,183,100,8,93,211,146,3,163,81,67,29,43,82,215,46,103,132,212,23,22,139,22,1,124,140,152,212,221,101,226,158,49,206,131,4,33,37,40,41,147,186,150,237,237,133,77,146,244,41,178,189,237,216,179,58,102,60,169,88,116,155,108,108,45,88,86,199,198,6,88,229,239,28,139,182,231,224,179,50,46,131,164,130,122,80,239,80,31,161,138,166,26,4,39,22,2,83,74,116,109,182,61,146,182,75,52,41,51,157,52,76,162,224,189,88,6,214,245,198,97,148,12,160,152,252,137,22,161,184,92,248,93,128,103,173,170,7,210,21,9,136,119,25,128,58,134,105,154,195,104,84,169,119,14,72,218,103,164,237,123,218,69,71,161,32,46,208,109,116,132,113,3,14,35,100,69,80,10,217,0,201,148,62,33,154,32,215,56,26,86,151,199,212,117,96,103,182,77,219,47,88,116,194,233,179,214,196,66,21,74,201,22,214,76,112,172,156,85,231,147,113,197,210,180,97,52,170,16,23,172,10,239,83,177,2,212,75,71,94,180,228,62,179,152,119,152,9,140,71,21,150,129,213,66,147,48,98,159,119,194,172,135,148,212,9,224,69,255,43,192,176,201,192,21,9,72,78,152,149,66,227,156,99,60,110,16,167,84,190,147,105,237,25,213,194,98,145,140,180,233,2,69,2,169,138,164,14,156,7,47,74,201,96,161,27,101,168,23,200,217,83,85,19,198,227,101,3,196,163,184,210,211,46,60,103,207,5,68,4,45,22,90,88,94,141,76,151,60,90,44,139,162,170,163,129,113,241,50,18,23,49,114,55,175,216,158,121,54,16,22,221,156,190,203,20,237,237,51,117,244,184,200,240,239,11,166,131,69,37,56,180,19,113,109,175,107,107,219,124,19,128,72,185,98,1,89,180,152,77,38,97,217,139,16,125,0,6,105,220,9,117,141,1,34,40,190,30,209,44,79,168,99,1,17,20,200,64,91,132,132,144,212,209,171,67,5,218,222,161,84,76,151,198,212,149,160,36,114,134,88,50,125,7,222,43,74,33,4,103,97,39,214,1,196,25,57,55,149,103,212,24,97,27,159,168,98,192,143,92,36,6,71,229,21,175,153,181,245,57,59,109,161,108,39,212,23,150,76,176,4,145,130,236,14,207,21,17,124,29,108,90,127,253,170,169,243,64,190,98,1,65,251,1,152,88,144,194,48,146,67,159,172,34,167,25,9,109,55,163,228,158,16,199,228,60,194,251,109,138,122,236,110,22,168,157,35,74,141,148,140,230,204,246,78,203,188,93,98,84,85,76,38,35,3,182,232,194,62,95,138,154,112,216,52,222,106,6,231,122,86,150,133,189,203,21,226,3,195,240,2,139,34,148,30,42,148,224,5,47,160,8,217,9,193,15,233,111,229,44,148,213,174,128,22,230,9,230,89,65,193,60,82,193,129,22,148,82,248,50,64,244,8,192,21,11,200,27,95,63,114,0,39,159,72,135,238,63,230,108,33,199,137,210,212,25,17,199,202,138,35,132,158,205,237,29,196,87,204,218,101,154,241,6,94,226,48,220,32,136,19,106,13,44,77,26,19,139,130,203,156,13,251,56,112,112,196,120,188,132,15,45,125,158,209,167,10,243,11,29,219,159,75,189,178,52,129,16,10,130,163,169,189,105,99,32,20,5,235,141,27,23,20,156,64,112,67,201,45,5,212,66,227,32,102,66,21,96,92,129,34,116,73,89,244,24,224,170,56,49,96,252,87,0,114,65,175,216,135,96,62,116,239,203,3,208,221,254,238,231,191,226,181,175,94,249,185,223,255,82,135,40,222,122,28,98,249,59,251,247,6,174,222,219,115,230,204,154,21,108,139,110,63,89,149,69,54,194,100,222,67,86,193,7,207,120,92,177,178,92,83,85,75,76,38,7,121,214,193,61,246,126,21,206,49,173,177,80,164,192,246,118,54,237,75,85,104,198,30,39,32,195,240,130,32,192,192,37,17,38,141,48,173,157,157,234,124,145,185,176,209,179,182,209,177,53,235,12,16,107,201,6,143,136,80,10,80,132,232,96,82,193,164,22,141,14,215,103,206,157,153,165,187,1,182,250,82,174,72,64,30,189,255,71,60,144,222,112,219,193,213,51,107,243,207,36,21,160,43,78,68,196,1,2,136,99,172,153,23,222,12,15,62,114,154,173,173,117,186,244,44,2,83,86,70,48,174,60,49,200,192,35,208,102,143,58,104,251,107,89,90,57,192,100,52,49,143,169,227,57,170,170,102,84,121,154,24,232,251,138,42,6,192,225,67,111,188,179,211,41,139,94,73,170,64,1,118,7,167,115,206,184,161,250,39,117,116,243,150,157,89,178,62,124,175,2,222,19,156,241,30,226,118,87,17,20,41,193,43,147,202,125,27,216,60,176,39,59,64,175,184,144,117,226,193,87,9,144,45,39,191,198,125,182,169,229,154,73,227,135,185,214,98,18,197,188,119,204,54,59,26,63,226,5,47,221,195,191,249,79,103,56,253,196,147,172,174,236,225,220,83,55,241,67,135,239,34,200,4,240,0,168,66,47,115,206,110,121,144,91,217,187,103,196,163,27,51,74,62,195,158,61,235,4,191,130,160,22,78,188,15,70,214,41,103,150,38,129,125,43,17,28,116,93,54,47,16,81,98,20,162,19,4,29,106,161,196,246,172,101,62,107,45,219,170,60,140,235,64,93,87,120,31,153,39,71,171,133,56,164,227,14,53,72,179,10,69,249,42,128,199,57,160,92,81,128,60,246,240,171,165,118,157,3,114,242,241,215,208,242,154,16,125,223,52,46,98,149,123,176,122,160,204,148,9,133,60,142,220,112,125,197,235,94,247,36,95,251,234,49,46,238,180,211,212,215,115,234,76,207,254,171,30,34,132,150,97,114,221,198,124,218,246,53,236,217,119,181,173,84,63,117,126,155,163,71,78,177,188,58,165,148,64,12,98,213,124,215,245,56,135,241,195,116,98,26,21,22,239,75,194,70,65,21,230,51,103,175,54,173,158,147,181,153,187,69,79,219,38,243,154,170,138,52,117,100,50,169,236,85,4,82,134,69,111,3,115,216,141,229,84,28,138,115,252,1,236,202,192,87,20,32,93,159,61,144,58,137,191,128,234,59,5,73,18,137,49,4,24,44,23,65,23,66,125,245,136,236,160,169,28,127,243,175,30,226,21,111,186,151,35,71,247,113,219,107,167,140,39,183,114,110,237,40,222,173,129,108,211,119,129,148,15,27,137,175,111,174,113,255,253,231,89,89,122,148,155,159,93,104,234,41,226,29,46,120,78,62,49,51,30,64,51,93,239,25,143,10,57,37,54,54,122,219,55,204,89,141,75,66,16,68,132,174,47,70,234,243,182,55,249,68,80,234,232,204,131,106,11,153,30,65,0,37,56,24,87,66,242,66,219,139,46,58,245,41,235,182,19,11,89,204,58,202,21,5,200,217,227,175,138,64,223,101,121,247,88,244,159,42,82,82,86,175,10,174,242,64,97,54,107,201,93,66,166,99,236,189,226,237,80,142,30,89,225,243,159,190,145,183,254,197,175,154,130,122,219,109,183,114,245,213,251,169,226,17,80,161,203,137,249,108,139,147,79,60,194,189,223,61,77,144,135,120,229,107,231,196,56,38,198,64,172,61,211,105,228,204,233,150,245,117,176,217,218,62,49,111,59,206,175,47,184,176,214,146,186,222,42,119,5,68,100,32,121,16,129,40,66,172,132,162,66,194,177,72,80,23,104,48,15,216,93,71,179,250,67,137,129,226,5,159,146,220,11,156,121,193,62,21,184,130,60,228,236,137,1,140,196,79,57,39,31,23,84,69,144,40,72,19,133,189,75,1,86,177,144,146,109,178,175,178,12,170,20,136,222,217,88,248,43,94,118,13,127,240,197,138,143,222,241,77,254,201,47,62,204,203,95,118,152,67,215,238,179,122,99,99,115,206,99,143,175,179,113,97,141,23,222,50,231,37,47,247,116,218,208,118,153,166,14,120,155,78,241,204,23,24,25,15,171,3,22,178,186,182,103,125,115,97,18,13,170,4,15,126,80,120,69,5,241,66,83,87,140,235,104,157,72,5,20,103,202,240,214,66,233,44,219,82,188,20,68,64,48,47,215,92,20,144,175,3,172,109,6,15,164,167,29,144,7,238,123,149,20,201,30,232,119,218,242,51,169,112,167,115,130,115,88,74,120,209,192,184,35,114,244,218,194,206,206,142,237,143,143,42,207,210,200,209,245,142,92,176,47,221,110,117,92,255,236,61,252,203,95,124,17,247,220,115,158,111,124,243,65,238,254,246,61,108,207,29,77,173,220,112,36,242,134,219,26,14,31,26,145,179,163,109,51,74,66,125,96,201,101,198,10,235,27,173,233,94,125,74,244,41,96,7,111,100,92,40,94,205,27,103,29,160,5,111,202,129,16,163,167,196,12,40,226,60,222,89,26,76,85,9,85,165,136,203,116,189,144,12,0,37,138,21,31,34,128,130,17,186,136,60,253,207,203,122,248,254,87,185,35,55,118,10,164,83,199,221,207,87,65,62,80,9,20,21,219,135,232,50,104,82,50,224,188,112,112,5,54,183,231,70,164,125,174,16,17,98,128,218,41,32,100,21,186,54,161,192,115,159,191,151,67,215,141,217,88,159,177,152,247,120,95,104,106,67,216,72,213,81,172,146,158,52,142,113,99,239,179,221,194,195,39,102,38,125,116,93,178,131,29,53,197,120,67,11,0,195,184,39,148,226,232,179,50,239,11,139,12,69,28,85,93,24,55,74,12,2,152,11,33,8,149,115,84,181,210,103,88,88,33,137,230,162,62,136,230,232,249,35,128,82,40,92,2,243,127,242,212,246,213,1,200,0,103,159,12,31,174,60,255,88,132,50,76,127,187,224,133,202,11,177,242,72,81,116,179,227,27,247,174,17,227,62,94,248,130,27,113,180,236,221,115,26,113,1,5,187,156,64,16,208,156,216,217,90,176,177,177,195,206,188,165,75,153,194,238,244,135,119,152,230,84,55,53,227,73,205,100,28,153,54,182,49,197,111,125,225,20,23,214,2,7,175,221,103,181,200,145,235,55,208,210,210,247,25,84,25,218,192,32,224,221,238,176,52,34,32,1,137,193,254,92,93,5,170,232,172,240,132,97,70,24,48,175,10,106,138,90,202,28,3,254,25,152,233,211,6,200,67,247,25,95,164,165,122,220,204,118,242,231,250,162,127,163,203,228,172,226,4,236,55,55,12,203,26,24,235,115,166,7,150,248,238,67,223,123,188,95,205,143,188,252,249,32,133,208,156,160,136,3,108,87,141,33,75,99,103,167,99,123,103,97,89,145,148,98,7,19,188,167,40,244,5,68,60,205,168,98,121,105,196,210,180,178,20,53,68,207,206,76,249,212,127,124,156,233,120,202,254,171,174,102,117,201,241,172,131,79,177,179,72,244,25,188,119,67,239,220,237,18,186,133,45,207,184,9,76,167,21,211,113,77,136,129,44,30,21,91,14,50,192,68,134,173,91,5,45,154,5,117,193,201,111,3,159,113,72,0,202,101,15,89,79,60,244,26,191,221,45,20,232,167,141,191,181,77,179,223,12,158,163,49,186,190,40,209,184,32,67,107,197,153,16,157,226,55,230,132,149,154,56,114,92,119,176,225,203,255,109,157,148,90,154,102,137,202,53,84,222,246,44,88,104,65,115,161,111,123,102,179,142,249,188,55,82,197,230,179,28,222,41,181,136,253,92,215,53,205,184,70,67,160,35,224,84,104,188,179,133,206,71,30,85,94,254,226,6,231,42,150,166,45,227,208,18,154,64,110,2,125,193,0,47,41,225,138,226,81,144,1,148,42,48,30,215,76,199,149,213,74,78,28,93,22,186,84,88,116,133,224,148,32,224,81,50,6,12,89,197,244,43,113,151,243,153,139,246,148,183,215,202,190,165,16,128,30,160,47,122,251,118,155,62,82,5,16,161,23,213,232,68,240,65,168,0,196,182,149,232,206,207,97,169,1,245,248,174,112,232,218,9,95,253,163,83,180,109,203,242,242,94,82,63,102,121,178,69,16,71,159,50,91,109,98,99,171,101,125,99,97,197,93,244,88,31,66,76,205,85,156,19,43,210,150,151,35,75,147,72,172,34,69,60,109,130,178,80,30,61,217,226,202,132,209,100,132,186,192,120,178,142,56,168,155,104,187,136,78,48,245,118,214,101,59,228,156,149,56,212,65,163,198,170,114,11,85,126,240,160,145,87,234,32,244,9,171,85,182,58,5,85,130,104,176,106,93,177,12,139,66,185,108,128,60,114,223,91,3,144,176,153,105,189,97,28,155,59,17,94,223,103,101,214,147,69,136,209,248,2,28,10,206,26,67,248,245,57,213,190,6,105,2,169,87,35,208,189,251,167,212,210,50,219,153,209,92,87,209,118,203,56,89,39,23,49,111,40,41,33,185,199,147,8,14,68,60,109,1,236,224,148,208,4,227,140,209,168,198,87,209,14,174,18,203,122,40,40,143,157,20,174,61,184,202,184,30,211,84,145,213,149,222,194,153,115,209,60,86,129,40,194,74,112,236,153,58,84,28,201,164,15,112,94,172,103,82,85,6,6,165,168,93,170,130,19,101,84,217,119,164,237,41,179,86,93,41,122,98,201,85,247,1,204,74,175,151,28,144,19,199,222,17,186,210,21,32,29,125,206,223,117,143,30,251,224,251,98,212,127,46,16,16,210,40,138,87,196,23,204,99,216,105,21,23,132,72,33,108,182,132,213,10,169,3,148,66,8,16,3,28,185,118,204,143,189,86,57,125,246,2,207,121,1,108,111,239,99,190,231,4,38,214,165,100,3,12,179,69,143,42,140,71,209,166,62,114,41,236,204,19,93,134,80,28,197,121,124,12,22,247,69,172,207,77,223,39,218,121,98,107,125,204,193,131,32,190,97,58,81,70,211,29,102,125,192,102,171,80,4,80,20,27,247,169,194,80,137,59,192,209,155,120,169,236,244,74,144,66,180,212,93,80,3,5,202,112,69,79,153,214,206,165,172,255,3,232,124,232,119,27,82,151,152,212,11,160,71,175,187,234,199,223,251,179,111,248,108,151,244,237,169,224,68,72,222,187,128,216,47,76,198,246,88,247,141,174,208,175,205,73,211,134,20,61,20,240,206,164,118,59,216,81,19,121,242,212,5,142,61,0,47,121,209,179,105,251,128,15,143,211,165,196,230,118,199,206,78,75,234,123,162,119,246,217,88,123,20,64,149,58,10,75,227,202,194,74,198,145,20,202,0,100,74,29,103,206,6,30,126,236,0,57,47,112,126,137,35,135,51,215,29,60,133,102,71,219,21,102,93,33,23,168,130,183,191,187,169,131,241,134,120,111,7,31,61,52,81,136,222,192,177,244,182,77,25,85,197,11,102,106,85,186,90,74,15,114,39,240,135,73,241,112,137,67,214,93,127,252,254,122,239,184,252,132,160,239,85,45,47,183,17,206,74,82,42,248,62,17,186,84,44,4,212,17,251,50,56,79,217,233,240,179,142,234,154,9,56,193,56,36,193,34,23,170,225,11,143,27,225,21,63,188,159,55,189,255,126,222,242,23,78,114,232,186,35,164,110,47,43,75,143,179,190,150,109,141,185,75,48,29,7,234,166,178,226,113,46,157,9,139,165,128,98,241,155,198,23,74,86,182,23,133,217,60,83,242,140,243,107,215,91,191,190,169,61,190,170,185,234,170,115,148,156,65,197,6,179,125,8,136,77,162,68,146,120,138,56,243,20,239,48,160,116,0,88,80,38,81,105,44,60,121,102,125,97,150,10,142,66,16,112,14,175,5,82,25,10,66,80,46,161,121,236,185,233,175,221,235,189,252,125,17,254,188,12,89,8,74,113,14,169,162,72,244,66,81,236,240,122,160,108,182,184,84,8,251,198,32,130,170,53,118,140,16,109,21,4,88,36,3,136,209,164,230,119,254,251,9,14,236,91,229,230,155,174,103,54,243,212,225,17,43,228,82,74,118,7,55,163,72,168,107,212,155,35,226,28,120,20,17,69,129,156,33,155,74,155,209,212,177,189,35,156,95,123,46,125,223,178,61,19,14,236,175,56,122,221,99,20,197,164,248,170,142,54,105,178,60,189,120,77,162,17,119,22,71,219,67,42,38,54,154,167,243,125,143,200,48,169,132,218,65,112,66,82,83,122,75,215,171,3,78,86,85,253,11,24,46,202,165,52,255,157,187,63,32,192,14,240,27,27,59,242,235,62,48,71,184,209,57,89,22,16,85,201,206,137,86,209,153,54,200,218,156,132,208,79,27,138,125,57,140,32,5,40,70,136,16,131,24,56,170,202,104,92,211,181,91,252,238,23,214,121,209,139,174,101,121,249,32,243,157,53,224,73,230,11,79,93,9,171,203,13,171,75,141,101,62,89,133,54,11,89,61,110,144,52,40,197,146,128,182,131,194,14,59,91,207,103,209,95,197,230,230,5,114,110,56,124,248,41,234,241,89,92,168,173,78,89,154,214,52,163,218,66,148,205,22,7,161,9,98,175,170,48,239,213,66,20,40,78,64,0,6,206,80,21,64,169,108,82,134,172,56,215,38,190,0,252,134,138,122,160,92,106,15,185,184,86,124,84,86,151,162,7,214,129,47,30,59,217,125,114,58,113,199,69,56,44,112,208,57,113,218,38,210,133,89,138,203,141,52,123,26,137,40,170,66,219,67,151,20,4,130,55,98,4,5,48,112,76,230,184,106,111,205,63,124,255,125,182,171,113,253,245,215,162,178,159,190,125,0,71,79,8,149,121,72,51,196,249,81,101,195,6,198,69,169,88,109,128,154,215,4,154,106,65,59,223,199,78,123,11,93,63,227,220,249,57,75,83,184,233,232,163,198,105,177,170,9,85,101,30,210,212,54,202,3,34,67,181,14,78,32,58,168,3,136,136,213,79,243,78,73,165,48,236,182,163,187,192,160,170,197,139,186,81,116,31,1,238,170,60,151,28,16,185,231,143,63,0,187,230,38,35,239,128,196,96,243,194,27,155,54,189,215,119,253,91,195,158,6,95,121,80,146,8,131,126,10,169,96,160,20,148,104,92,227,140,115,4,49,29,171,174,42,62,118,231,61,252,163,15,180,124,242,95,188,153,151,252,185,23,179,179,125,154,173,237,207,176,178,36,92,181,231,123,188,210,24,169,195,176,187,49,120,69,215,41,109,206,164,60,163,157,239,101,62,127,5,89,43,142,159,56,201,233,211,137,91,159,119,146,3,7,206,48,106,166,38,199,135,24,40,120,146,10,222,49,132,81,204,114,129,162,5,45,3,137,0,105,0,101,97,3,12,198,127,120,81,64,53,229,34,185,104,41,234,111,6,30,114,162,238,178,120,8,187,166,64,89,116,89,66,144,112,195,205,7,20,120,24,248,244,102,240,191,41,226,156,40,207,113,66,35,136,97,161,160,222,139,171,134,17,205,92,160,29,234,16,17,112,67,111,250,250,35,203,124,238,119,30,228,220,153,45,14,236,159,114,228,250,27,17,119,132,205,173,211,20,119,129,16,189,169,176,230,101,38,97,40,62,20,234,152,240,4,102,59,207,37,243,74,198,227,21,214,158,90,227,196,201,5,135,15,94,224,232,15,157,160,169,199,86,175,212,85,32,198,96,162,100,29,28,24,151,21,218,12,24,191,128,23,1,4,243,130,2,160,68,143,9,148,192,16,206,10,165,160,206,33,2,119,3,191,4,102,202,37,54,185,239,219,31,248,63,130,118,224,198,189,0,25,224,129,123,215,14,92,181,228,223,89,69,121,87,112,114,157,31,190,31,136,138,12,223,87,161,207,98,121,190,162,70,244,171,75,145,187,238,62,207,107,94,255,53,254,210,143,223,194,219,222,118,27,47,121,241,11,41,185,103,125,253,126,212,29,167,110,54,109,185,127,82,7,68,35,93,154,50,91,92,67,215,31,162,105,246,225,125,226,220,185,11,28,123,100,141,218,159,190,8,234,119,141,188,247,44,55,150,169,197,224,16,17,84,28,152,11,239,122,198,188,47,118,147,4,7,149,7,63,104,85,105,216,246,45,37,67,209,33,121,81,102,93,73,93,42,193,11,31,5,110,47,74,0,18,151,216,228,187,223,254,101,254,132,230,150,150,235,33,156,193,191,251,210,241,234,237,175,60,252,246,58,202,223,14,94,94,234,29,8,160,72,2,241,206,33,0,217,86,142,109,225,197,250,213,95,253,218,147,252,196,95,254,14,111,123,235,115,120,211,155,95,198,45,183,220,196,242,210,42,125,234,153,205,54,41,5,170,218,227,125,5,90,225,66,196,145,104,187,57,79,61,181,195,233,39,119,88,94,57,197,205,71,143,209,140,2,206,87,72,8,248,97,15,177,137,130,0,58,92,32,136,128,0,165,40,243,30,171,55,80,136,94,9,2,106,192,20,108,34,190,24,56,40,90,82,18,55,235,120,3,240,123,222,241,127,85,16,94,142,165,79,5,202,246,60,73,240,110,208,185,204,157,255,117,95,228,43,34,236,1,185,217,9,78,28,130,146,212,136,84,164,10,80,5,177,41,144,195,135,87,120,205,235,86,248,47,95,58,206,151,63,127,138,69,218,0,201,24,169,186,200,168,25,19,124,69,78,153,121,187,96,107,115,147,179,103,54,56,126,252,2,155,155,79,241,236,139,33,234,198,27,78,98,179,186,77,195,116,28,153,140,188,21,120,157,245,47,132,130,245,208,49,213,22,69,21,20,1,17,170,33,227,18,129,54,97,217,86,81,29,54,169,160,0,197,112,193,161,250,248,222,81,253,62,32,53,129,203,98,242,173,111,253,18,255,143,38,43,147,145,63,122,211,254,12,40,192,119,238,57,253,130,73,227,127,54,6,254,122,112,50,17,1,144,196,176,47,230,48,82,181,162,237,220,90,203,55,190,117,158,187,238,154,179,189,57,194,251,101,130,159,50,158,140,77,187,18,2,42,74,240,153,213,229,142,131,215,182,28,58,188,205,129,125,137,58,212,216,48,130,23,196,185,221,126,185,128,113,88,130,84,192,11,52,17,162,7,176,131,71,213,177,251,236,18,197,196,199,54,179,232,50,14,168,164,160,104,74,169,132,156,245,215,129,119,58,119,89,194,149,153,28,187,255,195,252,41,152,223,191,167,1,200,0,199,30,219,188,102,223,114,253,211,85,144,119,121,167,135,188,19,128,12,2,224,1,140,188,189,183,106,253,194,102,199,230,118,207,98,59,51,159,41,37,59,11,65,147,137,179,213,130,213,85,161,25,89,26,108,213,180,56,193,20,219,40,120,135,89,81,134,240,228,134,33,5,104,147,218,133,10,117,80,3,135,33,131,43,106,158,4,170,118,245,57,51,95,152,50,76,201,37,71,81,47,194,219,128,223,66,47,75,184,26,72,253,222,15,242,167,104,110,101,186,203,51,191,253,245,167,154,31,189,101,233,39,155,232,222,235,189,220,26,4,16,20,36,171,170,7,100,88,186,28,118,198,21,113,88,88,177,172,71,33,23,25,206,76,6,16,133,92,96,145,140,159,172,240,27,71,176,240,164,80,196,217,103,101,32,245,66,193,122,28,253,160,109,121,168,195,208,231,48,112,24,132,196,2,10,57,101,157,181,73,118,22,122,110,115,17,158,13,108,142,98,22,64,185,12,38,223,185,251,151,185,4,38,75,147,218,3,137,193,102,139,244,150,166,114,183,71,47,111,240,78,17,17,128,164,42,30,84,156,128,34,244,195,93,157,21,154,104,158,128,129,6,232,110,104,178,215,2,116,73,232,50,131,100,238,140,31,80,37,171,160,56,212,14,186,128,64,26,122,234,125,2,47,24,48,54,12,161,24,184,197,46,82,201,57,148,108,187,231,63,169,162,151,43,92,153,121,46,157,149,173,237,78,98,148,112,228,217,183,42,240,32,240,169,11,155,179,207,131,140,128,231,129,68,155,230,64,146,14,71,30,60,52,67,219,53,101,101,209,25,56,120,47,187,189,112,5,197,192,161,9,193,64,19,193,128,92,36,12,184,96,154,148,162,40,5,80,85,4,168,77,214,129,172,96,3,115,9,196,180,56,16,1,244,123,134,203,202,63,0,142,137,115,2,232,15,62,32,187,86,0,46,172,157,241,251,87,43,7,60,1,124,230,236,133,254,83,222,75,167,42,207,65,152,58,202,80,104,138,170,218,49,152,4,63,8,155,86,77,247,25,243,150,161,120,4,4,112,8,74,12,208,84,6,4,109,15,179,30,178,98,32,6,217,205,182,10,10,12,161,43,218,251,44,122,172,32,4,41,209,227,5,125,108,99,123,113,59,144,235,202,115,57,205,56,228,50,155,95,93,170,4,72,0,247,62,188,189,122,248,64,243,83,85,208,247,4,239,110,8,14,4,138,138,83,76,148,29,136,27,27,227,161,77,32,78,172,163,87,27,169,123,84,1,193,76,4,68,20,227,153,65,103,243,14,76,92,148,221,255,233,32,163,160,138,20,12,164,46,153,55,166,84,52,84,222,125,8,248,249,92,202,229,12,87,102,158,203,111,106,10,254,86,231,124,240,30,152,1,95,191,249,121,223,249,248,223,250,153,171,31,0,14,35,238,144,115,184,97,131,217,68,24,39,72,140,50,8,143,66,55,40,182,10,216,84,137,83,16,25,68,65,112,86,115,56,3,77,135,130,112,145,21,1,162,147,221,39,1,1,197,62,111,0,187,224,96,214,241,46,224,236,144,29,234,211,8,200,229,7,38,247,89,38,163,24,128,12,220,3,252,154,175,221,87,156,211,125,136,220,228,156,56,47,166,162,37,134,251,63,56,104,162,31,254,63,43,152,117,230,17,12,188,49,0,131,93,34,16,3,212,193,38,75,44,219,154,39,69,5,130,219,149,87,84,53,171,226,156,200,239,1,31,114,82,60,80,184,204,230,185,50,172,60,239,121,65,110,56,58,9,47,121,217,53,10,60,2,124,250,194,86,250,172,243,82,59,145,231,59,39,209,59,249,158,37,243,2,144,129,103,76,72,204,69,172,207,223,101,11,81,68,55,240,127,129,162,30,212,154,103,67,214,166,116,9,118,18,20,29,120,198,137,42,234,138,242,62,224,190,166,114,79,11,32,114,255,189,31,230,10,52,127,205,85,53,64,6,120,244,244,226,186,189,203,225,221,117,244,63,29,189,236,115,2,2,73,17,1,241,50,244,250,193,246,1,141,160,5,75,131,169,130,12,234,174,128,10,67,144,66,68,25,178,56,22,169,20,239,112,181,231,62,203,254,158,46,51,64,190,251,33,174,96,115,171,187,130,38,199,78,44,86,142,92,91,191,163,14,238,61,193,113,131,119,128,72,86,181,87,111,9,128,56,0,186,108,123,32,168,66,93,89,7,19,193,72,157,193,195,16,48,96,74,33,205,59,13,243,174,188,7,184,35,136,4,32,61,3,200,255,78,1,216,5,134,103,29,186,199,31,127,244,133,111,175,131,220,30,61,47,13,94,16,80,69,50,230,49,34,78,4,80,210,0,76,42,80,91,106,12,34,194,110,143,74,10,168,19,209,199,87,150,227,77,192,124,54,223,173,204,159,134,144,245,17,126,128,76,150,150,43,255,125,29,205,54,191,113,82,251,191,19,131,188,57,184,161,42,145,93,5,96,168,234,201,217,58,131,230,57,209,99,92,18,28,168,26,86,65,149,219,129,143,58,247,180,121,199,32,157,220,243,65,126,0,77,86,150,27,127,232,186,131,25,80,128,135,30,124,252,135,39,99,119,123,229,220,95,9,158,32,2,170,146,20,28,138,19,177,223,40,255,107,6,171,224,29,101,84,137,115,78,78,46,210,232,70,160,173,67,43,128,242,52,153,28,127,228,99,252,128,155,191,246,192,4,32,3,60,120,98,235,232,234,52,190,39,6,222,17,28,171,78,0,243,2,113,88,104,2,17,64,173,213,156,22,73,131,8,239,0,254,45,16,128,196,51,246,255,111,199,31,254,21,191,126,254,87,3,131,253,225,183,62,178,239,241,19,255,234,239,157,123,226,142,19,23,78,223,161,27,103,238,208,245,51,119,164,139,63,95,188,62,161,23,46,254,188,113,214,222,251,38,128,234,135,133,43,192,228,145,7,127,133,63,99,230,150,167,149,3,18,192,127,254,226,147,245,91,127,244,234,191,86,69,247,115,209,233,45,222,1,136,41,40,170,68,133,219,128,223,215,161,231,241,204,173,125,137,236,216,3,31,145,211,79,124,34,192,174,61,250,200,199,222,118,234,228,199,191,116,254,201,143,235,133,211,23,175,83,119,252,42,192,218,169,143,135,103,78,236,114,152,77,201,124,68,158,120,236,251,15,252,193,7,63,250,99,23,129,249,247,235,167,238,188,26,224,169,39,63,33,207,156,212,211,96,143,29,255,152,87,253,15,14,118,109,251,236,51,96,60,237,118,226,145,139,9,192,185,59,195,206,185,79,94,113,96,252,79,79,99,23,210,25,93,27,227,0,0,0,0,73,69,78,68,174,66,96,130]) 3 | -------------------------------------------------------------------------------- /src/debug.ts: -------------------------------------------------------------------------------- 1 | import type { Asts } from './ast' 2 | import { clippyHash, clippyBytes } from './clippy-data' 3 | 4 | export class EvalError extends Error { 5 | originalMessage: string 6 | node: SceneNode 7 | 8 | constructor({ message, node }: { message: string, node: SceneNode }) { 9 | super(`${message} @ ${node.type} '${node.name}'`) 10 | this.originalMessage = message 11 | this.node = node 12 | this.name = 'EvalError' 13 | } 14 | } 15 | 16 | function getClippy(): Image { 17 | const clippy = figma.getImageByHash(clippyHash) 18 | if (!clippy) { 19 | const newClippy = figma.createImage(clippyBytes) 20 | if (newClippy.hash !== clippyHash) throw new Error('mismatching clippy hashes!') 21 | return newClippy 22 | } 23 | return clippy 24 | } 25 | 26 | export type ClippyVariant = 'WARNING' | 'ERROR' 27 | 28 | const clippyPrefix = '__clippy__' 29 | 30 | export async function clearClippies(variant: ClippyVariant): Promise { 31 | for (const clippy of figma.currentPage.findAll((node) => node.name.startsWith(clippyPrefix + variant))) { 32 | clippy.remove() 33 | } 34 | } 35 | 36 | export async function makeClippyMessage(variant: ClippyVariant, message: string, on: SceneNode): Promise { 37 | for (const existing of figma.currentPage.findAll(node => node.name.startsWith(clippyPrefix) && node.name.endsWith(on.id))) { 38 | existing.remove() 39 | } 40 | 41 | const clippy = getClippy() 42 | const parent = on.parent ?? figma.currentPage 43 | 44 | const image = figma.createRectangle() 45 | image.resize(62, 70) 46 | // parent.appendChild(image) 47 | image.fills = [ 48 | { 49 | type: 'IMAGE', 50 | imageHash: clippy.hash, 51 | scaleMode: 'FILL' 52 | } 53 | ] 54 | image.x = on.x + on.width - 25 55 | image.y = on.y - 87 + 25 56 | 57 | const font = { family: 'Roboto Mono', style: 'Medium' } 58 | await figma.loadFontAsync(font) 59 | 60 | const text = figma.createShapeWithText() 61 | text.shapeType = 'SQUARE' 62 | text.fills = [ figma.util.solidPaint(variant === 'WARNING' ? '#FFFFCC' : '#FFC7C2') ] 63 | text.text.fontName = font 64 | text.text.fontSize = 12 65 | text.text.fills = [ figma.util.solidPaint('#000000') ] 66 | text.resize(227, 87) 67 | text.text.characters = `${variant === 'WARNING' ? 'warning' : 'error'}: ${message}` 68 | text.x = image.x + 62 69 | text.y = image.y - 6.5 70 | 71 | const group = figma.group([ image, text ], parent) 72 | group.name = clippyPrefix + variant + on.id 73 | 74 | return group 75 | } 76 | 77 | export function WARN(message: string, node: SceneNode): void { 78 | console.warn(`${message} @ ${node.type} '${node.name}'`) 79 | void makeClippyMessage('WARNING', message, node) 80 | } 81 | 82 | export function ERROR(message: string, node: SceneNode): never { 83 | throw new EvalError({ message, node }) 84 | } 85 | 86 | let _loop = 0 87 | export function checkLoop() { 88 | if (++_loop >= 10000) throw new Error('Max Lexi stack exceeded.') 89 | } 90 | 91 | export function resetLoop() { 92 | _loop = 0 93 | } 94 | 95 | export function indent(text: string, levels: number): string { 96 | return text.split('\n').map(line => ' '.repeat(levels) + line).join('\n') 97 | } 98 | 99 | export function stringifyAst(node: Asts): string { 100 | switch (node.kind) { 101 | case 'WINDOW': { 102 | return [ 103 | 'window', 104 | indent(node.setup ? stringifyAst(node.setup) : 'no setup', 1), 105 | indent(node.loop ? stringifyAst(node.loop) : 'no loop', 1), 106 | ].join('\n') 107 | } 108 | 109 | case 'FLOW': { 110 | return `flow '${node.name}'\n` 111 | + indent(node.first ? stringifyAst(node.first) : 'no instructions', 1) 112 | } 113 | 114 | case 'INSTRUCTION': { 115 | const lines = [ stringifyAst(node.instruction) ] 116 | 117 | for (const input of node.inputs) lines.push(indent('← ' + stringifyAst(input), 1)) 118 | for (const output of node.outputs) lines.push(indent('→ ' + stringifyAst(output), 1)) 119 | 120 | if (node.matchArms) { 121 | for (const [ key, value ] of node.matchArms) { 122 | lines.push(indent(`match '${key}':`, 1)) 123 | lines.push(indent(stringifyAst(value), 2)) 124 | } 125 | } 126 | 127 | if (node.next) lines.push(stringifyAst(node.next)) 128 | return lines.join('\n') 129 | } 130 | 131 | case 'GRAPHIC': { 132 | return '[graphic]' 133 | } 134 | 135 | case 'FILE': { 136 | return '[file]' 137 | } 138 | 139 | case 'INFIX': { 140 | let string = 'infix ' 141 | if (node.left) string += `[${stringifyAst(node.left)}] ` 142 | string += `${node.operator}` 143 | if (node.right) string += ` [${stringifyAst(node.right)}]` 144 | return string 145 | } 146 | 147 | case 'FUNCTION': { 148 | return `function '${node.text}'` 149 | } 150 | 151 | case 'LOOP': { 152 | return 'loop:\n' 153 | + (node.body ? indent(stringifyAst(node.body), 1) : '(no body)') 154 | } 155 | 156 | case 'NUMBER': { 157 | return `number ${node.value}` 158 | } 159 | 160 | case 'STRING': { 161 | return `string '${node.value}'` 162 | } 163 | 164 | case 'VARIABLE': { 165 | return `variable '${node.name}' (${node.at.id})` 166 | } 167 | 168 | case 'PROPERTY': { 169 | let string = `property '${node.name}' of` 170 | if (node.parent === 'CURRENT_WINDOW') { 171 | string += ' current window' 172 | } else { 173 | string += ':\n' + indent(stringifyAst(node.parent), 1) 174 | } 175 | return string 176 | } 177 | } 178 | } 179 | -------------------------------------------------------------------------------- /src/engine.ts: -------------------------------------------------------------------------------- 1 | export interface SpriteEngine { 2 | kind: 'SPRITE' 3 | [key: string]: unknown 4 | } 5 | 6 | export interface WindowEngine { 7 | kind: 'WINDOW' 8 | width: number 9 | height: number 10 | } 11 | 12 | export interface TextEngine { 13 | kind: 'TEXT' 14 | [key: string]: unknown 15 | } 16 | 17 | export type Engine = 18 | | SpriteEngine 19 | | WindowEngine 20 | 21 | export function clearWindow(window: SectionNode) { 22 | for (const child of window.children) { 23 | child.remove() 24 | } 25 | } 26 | 27 | export function makeWindow(window: SectionNode): WindowEngine { 28 | const windowEngine: WindowEngine = { 29 | kind: 'WINDOW', 30 | width: window.width, 31 | height: window.height 32 | } 33 | 34 | return new Proxy(windowEngine, { 35 | get(target, name, receiver) { 36 | windowEngine.width = window.width 37 | windowEngine.height = window.height 38 | if (Reflect.has(target, name)) { 39 | return Reflect.get(target, name, receiver) 40 | } 41 | }, 42 | set(target, name, receiver) { 43 | if (Reflect.has(target, name)) { 44 | switch (name) { 45 | case 'width': 46 | window.resizeWithoutConstraints(receiver, windowEngine.height) 47 | break 48 | case 'height': 49 | window.resizeWithoutConstraints(windowEngine.width, receiver) 50 | } 51 | return Reflect.set(target, name, receiver) 52 | } 53 | return false 54 | } 55 | }) 56 | } 57 | 58 | export function addSprite(window: SectionNode, graphic: SceneNode): SpriteEngine { 59 | const clone = graphic.clone() 60 | clone.x = 0 61 | clone.y = 0 62 | window.appendChild(clone) 63 | 64 | const spriteEngine: SpriteEngine = { 65 | kind: 'SPRITE', 66 | } 67 | 68 | return new Proxy(spriteEngine, { 69 | get(target, name, receiver) { 70 | if (Reflect.has(target, name)) { 71 | return Reflect.get(target, name, receiver) 72 | } else { 73 | const property = Object.getOwnPropertyDescriptor( 74 | Reflect.getPrototypeOf(clone), 75 | name 76 | ) 77 | if (property !== undefined && property.get !== undefined) 78 | return property.get.call(clone) 79 | } 80 | }, 81 | set(target, name, receiver) { 82 | switch (name) { 83 | case 'x': 84 | clone.x = receiver 85 | break 86 | case 'y': 87 | clone.y = receiver 88 | } 89 | return Reflect.set(target, name, receiver) 90 | } 91 | }) 92 | } 93 | 94 | export async function addText(window: SectionNode): Promise { 95 | const font = { family: 'Inter', style: 'Regular' } 96 | await figma.loadFontAsync(font) 97 | 98 | const text = figma.createText() 99 | text.fontName = font 100 | text.fontSize = 20 101 | text.fills = [ figma.util.solidPaint('#000000') ] 102 | window.appendChild(text) 103 | 104 | const textEngine: TextEngine = { 105 | kind: 'TEXT', 106 | } 107 | 108 | return new Proxy(textEngine, { 109 | get(target, name, receiver) { 110 | if (Reflect.has(target, name)) { 111 | return Reflect.get(target, name, receiver) 112 | } else { 113 | const property = Object.getOwnPropertyDescriptor( 114 | Reflect.getPrototypeOf(text), 115 | name 116 | ) 117 | if (property !== undefined && property.get !== undefined) 118 | return property.get.call(text) 119 | } 120 | }, 121 | set(target, name, receiver) { 122 | return Reflect.set(text, name, receiver) 123 | } 124 | }) 125 | } 126 | -------------------------------------------------------------------------------- /src/eval.ts: -------------------------------------------------------------------------------- 1 | import type { FlowAst, DataAsts, InstructionAst, WindowAst } from './ast' 2 | import { clearClippies, ERROR, EvalError, makeClippyMessage, resetLoop, WARN } from './debug' 3 | import { clearWindow, addSprite, type SpriteEngine, WindowEngine, makeWindow, TextEngine, addText } from './engine' 4 | import { getPressedKeys, keys } from './input' 5 | import { intersection } from './polyfills' 6 | 7 | export const booleanType: EnumType = { 8 | kind: 'ENUM_TYPE', 9 | options: new Set([ 'yes', 'no' ]), 10 | } 11 | export function booleanTrue(at: SceneNode): EnumObj { 12 | return { 13 | kind: 'ENUM_OBJ', 14 | type: booleanType, 15 | selected: new Set([ 'yes' ]), 16 | at, 17 | } 18 | } 19 | export function booleanFalse(at: SceneNode): EnumObj { 20 | return { 21 | kind: 'ENUM_OBJ', 22 | type: booleanType, 23 | selected: new Set(['no']), 24 | at, 25 | } 26 | } 27 | 28 | export interface NumberType { 29 | kind: 'NUMBER_TYPE' 30 | } 31 | 32 | export interface StringType { 33 | kind: 'STRING_TYPE' 34 | } 35 | 36 | export interface GraphicType { 37 | kind: 'GRAPHIC_TYPE' 38 | } 39 | 40 | export interface SpriteType { 41 | kind: 'SPRITE_TYPE' 42 | } 43 | 44 | export interface TextType { 45 | kind: 'TEXT_TYPE' 46 | } 47 | 48 | export interface EnumType { 49 | kind: 'ENUM_TYPE' 50 | options: Set 51 | } 52 | 53 | export interface GraphicType { 54 | kind: 'GRAPHIC_TYPE' 55 | } 56 | 57 | export interface FlowType { 58 | kind: 'FLOW_TYPE' 59 | } 60 | 61 | export interface ArrayType { 62 | kind: 'ARRAY_TYPE' 63 | item: Type 64 | } 65 | 66 | export interface AnyType { 67 | kind: 'ANY_TYPE' 68 | } 69 | 70 | export type Type = 71 | | NumberType 72 | | StringType 73 | | SpriteType 74 | | TextType 75 | | EnumType 76 | | GraphicType 77 | | FlowType 78 | | ArrayType 79 | | AnyType 80 | 81 | // --- 82 | 83 | export interface NumberObj { 84 | kind: 'NUMBER_OBJ' 85 | type: NumberType 86 | value: number 87 | at: SceneNode 88 | } 89 | 90 | export interface StringObj { 91 | kind: 'STRING_OBJ' 92 | type: StringType 93 | value: string 94 | at: SceneNode 95 | } 96 | 97 | export interface GraphicObj { 98 | kind: 'GRAPHIC_OBJ' 99 | type: GraphicType 100 | graphic: SceneNode 101 | at: SceneNode 102 | } 103 | 104 | export interface FlowObj { 105 | kind: 'FLOW_OBJ' 106 | type: FlowType 107 | node: FlowAst 108 | at: SceneNode 109 | } 110 | 111 | export interface SpriteObj { 112 | kind: 'SPRITE_OBJ' 113 | type: SpriteType 114 | engine: SpriteEngine 115 | at: SceneNode 116 | } 117 | 118 | export interface TextObj { 119 | kind: 'TEXT_OBJ' 120 | type: TextType 121 | engine: TextEngine 122 | at: SceneNode 123 | } 124 | 125 | export interface EnumObj { 126 | kind: 'ENUM_OBJ' 127 | type: EnumType 128 | selected: Set 129 | at: SceneNode 130 | } 131 | 132 | export interface ArrayObj { 133 | kind: 'ARRAY_OBJ' 134 | type: ArrayType 135 | items: Obj[] 136 | at: SceneNode 137 | } 138 | 139 | export type Obj = 140 | | NumberObj 141 | | StringObj 142 | | SpriteObj 143 | | EnumObj 144 | | GraphicObj 145 | | TextObj 146 | | FlowObj 147 | | ArrayObj 148 | 149 | export type ObjOfType = Extract 150 | 151 | // --- 152 | 153 | const stopFunctions: Map void> = new Map() 154 | const variables: Map = new Map() 155 | 156 | interface EvalContext { 157 | windowEngine: WindowEngine 158 | windowNode: SectionNode 159 | isDone: boolean 160 | } 161 | 162 | function getDataValue(data: DataAsts, ctx: EvalContext): Obj { 163 | switch (data.kind) { 164 | case 'GRAPHIC': { 165 | return { 166 | kind: 'GRAPHIC_OBJ', 167 | type: { kind: 'GRAPHIC_TYPE' }, 168 | graphic: data.at, 169 | at: data.at 170 | } 171 | } 172 | case 'VARIABLE': { 173 | return variables.get(data.at.id) 174 | ?? (data.propertyInitializer && getDataValue(data.propertyInitializer, ctx)) 175 | ?? ERROR(`variable '${data.name}' is not set.`, data.at) 176 | } 177 | case 'PROPERTY': { 178 | try { 179 | const evil: unknown = data.parent === 'CURRENT_WINDOW' 180 | ? ctx.windowEngine 181 | : data.parent.kind === 'VARIABLE' 182 | // @ts-expect-error jank 183 | ? getObjPrimitiveValue(variables.get(data.parent.at.id)) 184 | : undefined 185 | return { 186 | kind: 'NUMBER_OBJ', 187 | type: { kind: 'NUMBER_TYPE' }, 188 | // @ts-expect-error jank 189 | value: evil[data.name], 190 | at: data.at 191 | } 192 | } catch (error) { 193 | console.error('error reading property:') 194 | console.error(error) 195 | return ERROR('failed to read variable', data.at) 196 | } 197 | } 198 | case 'FLOW': { 199 | return { 200 | kind: 'FLOW_OBJ', 201 | type: { kind: 'FLOW_TYPE' }, 202 | node: data, 203 | at: data.at 204 | } 205 | } 206 | case 'NUMBER': { 207 | return { 208 | kind: 'NUMBER_OBJ', 209 | type: { kind: 'NUMBER_TYPE' }, 210 | value: data.value, 211 | at: data.at 212 | } 213 | } 214 | case 'STRING': { 215 | return { 216 | kind: 'STRING_OBJ', 217 | type: { kind: 'STRING_TYPE' }, 218 | value: data.value, 219 | at: data.at 220 | } 221 | } 222 | case 'FILE': { 223 | return { 224 | kind: 'STRING_OBJ', 225 | type: { kind: 'STRING_TYPE' }, 226 | value: data.data, 227 | at: data.at 228 | } 229 | } 230 | } 231 | } 232 | 233 | type PickArgsInput = { name: string | null, obj: Obj } 234 | 235 | function typesEq(a: Type, b: Type): boolean { 236 | if (a.kind === 'ANY_TYPE' || b.kind === 'ANY_TYPE') return true 237 | if (a.kind !== b.kind) return false 238 | if (a.kind === 'ENUM_TYPE' && b.kind === 'ENUM_TYPE') { 239 | if (a.options.size !== b.options.size) return false 240 | if (intersection(a.options, b.options).size !== a.options.size) return false 241 | } 242 | if (a.kind === 'ARRAY_TYPE' && b.kind === 'ARRAY_TYPE') { 243 | return typesEq(a.item, b.item) 244 | } 245 | return true 246 | } 247 | 248 | function pickArgs(required: FnArg[], inputs: PickArgsInput[], at: SceneNode): Obj[] { 249 | inputs = [ ...inputs ] 250 | 251 | const args: Obj[] = [] 252 | 253 | // Use named arguments. 254 | for (let i = 0; i < required.length; i++) { 255 | if (required[i].name === null) continue 256 | const inputIndex = inputs.findIndex(input => input.name === required[i].name) 257 | if (inputIndex === -1) continue 258 | args[i] = inputs[inputIndex].obj 259 | inputs.splice(inputIndex, 1) 260 | } 261 | 262 | // Process typed arguments. 263 | for (let i = 0; i < required.length; i++) { 264 | if (args[i]) continue 265 | const inputIndex = inputs.findIndex(input => typesEq(input.obj.type, required[i].type)) 266 | if (inputIndex === -1) continue 267 | args[i] = inputs[inputIndex].obj 268 | inputs.splice(inputIndex, 1) 269 | } 270 | 271 | for (const input of inputs) WARN('extraneous input has been ignored.', input.obj.at) 272 | 273 | // Ensure we have all arguments. 274 | for (let i = 0; i < required.length; i++) { 275 | if (args[i]) continue 276 | 277 | let message = `missing argument of type '${required[i].type.kind}'` 278 | if (required[i].name !== null) message += ` with name '${required[i].name}'` 279 | message += ` at position ${i}.` 280 | 281 | throw new EvalError({ message, node: at }) 282 | } 283 | 284 | return args 285 | } 286 | 287 | async function getInstructionValue(instruction: InstructionAst, ctx: EvalContext): Promise { 288 | // console.log('is done', ctx.isDone) 289 | const inputs: PickArgsInput[] = instruction.inputs.map(input => { 290 | return { 291 | name: input.kind === 'VARIABLE' ? input.name : null, 292 | obj: getDataValue(input, ctx) 293 | } 294 | }) 295 | 296 | switch (instruction.instruction.kind) { 297 | case 'LOOP': { 298 | if (!instruction.instruction.body) { 299 | WARN('loop has no body.', instruction.at) 300 | return null 301 | } 302 | 303 | const items = pickArgs([ 304 | { type: { kind: 'ARRAY_TYPE', item: { kind: 'ANY_TYPE' } } }, 305 | ], inputs, instruction.at) 306 | const array = items[0] as ArrayObj 307 | 308 | for (const item of array.items) { 309 | await setOutputs(instruction.outputs, item, ctx) 310 | await runInstructions(instruction.instruction.body, ctx) 311 | } 312 | 313 | return null 314 | } 315 | case 'FUNCTION': { 316 | const name = instruction.instruction.text 317 | if (name in builtinFnImpls) { 318 | const fn = builtinFnImpls[name as BuiltinFnNames] 319 | const args = pickArgs(fn.args, inputs, instruction.at) 320 | return await fn.impl(ctx, instruction.at, ...args) 321 | } else { 322 | return ERROR(`unknown builtin function call.`, instruction.at) 323 | } 324 | } 325 | case 'INFIX': { 326 | const fn = infixOperatorImpls[instruction.instruction.operator] 327 | 328 | if (instruction.instruction.left) { 329 | inputs.push({ 330 | name: 'left', 331 | obj: getDataValue(instruction.instruction.left, ctx) 332 | }) 333 | } 334 | if (instruction.instruction.right) { 335 | inputs.push({ 336 | name: 'right', 337 | obj: getDataValue(instruction.instruction.right, ctx) 338 | }) 339 | } 340 | 341 | const [ left, right ] = pickArgs([ fn.left, fn.right ], inputs, instruction.at) 342 | 343 | return await fn.impl(left, right, ctx, instruction.at) 344 | } 345 | case 'NUMBER': { 346 | return { 347 | kind: 'NUMBER_OBJ', 348 | type: { kind: 'NUMBER_TYPE' }, 349 | value: instruction.instruction.value, 350 | at: instruction.at 351 | } 352 | } 353 | case 'STRING': { 354 | return { 355 | kind: 'STRING_OBJ', 356 | type: { kind: 'STRING_TYPE' }, 357 | value: instruction.instruction.value, 358 | at: instruction.at 359 | } 360 | } 361 | } 362 | } 363 | function getObjPrimitiveValue(obj: Obj): unknown { 364 | switch (obj.kind) { 365 | case 'NUMBER_OBJ': return obj.value 366 | case 'GRAPHIC_OBJ': return obj.graphic 367 | case 'STRING_OBJ': return obj.value 368 | case 'ARRAY_OBJ': return obj.items.map(getObjPrimitiveValue) 369 | 370 | case 'SPRITE_OBJ': 371 | case 'TEXT_OBJ': return obj.engine 372 | 373 | default: ERROR(`cannot convert this ${obj.kind} into a primitive value.`, obj.at) 374 | } 375 | } 376 | 377 | async function setOutputs(outputs: DataAsts[], value: Obj, _ctx: EvalContext): Promise { 378 | for (const output of outputs) { 379 | switch (output.kind) { 380 | case 'VARIABLE': { 381 | variables.set(output.at.id, value) 382 | break 383 | } 384 | 385 | case 'PROPERTY': { 386 | try { 387 | if (output.parent !== 'CURRENT_WINDOW' && output.parent.kind === 'VARIABLE') { 388 | const parent = variables.get(output.parent.at.id) 389 | if (parent !== undefined) { 390 | // @ts-expect-error jank 391 | getObjPrimitiveValue(variables.get(output.parent.at.id))[output.name] = getObjPrimitiveValue(value) 392 | break 393 | } 394 | } 395 | } catch (error) { 396 | console.error('error setting property:') 397 | console.error(error) 398 | return ERROR('failed to set variable.', output.at ?? value.at) 399 | } 400 | 401 | return ERROR('fuck this shit.', output.at ?? value.at) 402 | } 403 | 404 | default: { 405 | if (!output.at) throw new Error('missing output at but need to error') 406 | ERROR(`this is a '${output.kind}' node and i don't know how to assign to it.`, output.at) 407 | } 408 | } 409 | } 410 | } 411 | 412 | async function runInstructions(instruction: InstructionAst | null, ctx: EvalContext) { 413 | // Instructions are executed from the last item backwards. 414 | const queue: InstructionAst[] = instruction ? [ instruction ] : [] 415 | 416 | for (let instruction = queue.pop(); instruction; instruction = queue.pop()) { 417 | if (ctx.isDone) return 418 | if (instruction.next) queue.push(instruction.next) 419 | 420 | const value = await getInstructionValue(instruction, ctx) 421 | 422 | if (value?.kind === 'ENUM_OBJ' && instruction.matchArms) { 423 | for (const [ option, arm ] of instruction.matchArms) { 424 | if (value.selected.has(option)) { 425 | queue.push(arm) 426 | } else if (!value.type.options.has(option)) { 427 | WARN(`unknown enum value. valid: ${[ ...value.type.options ].map(v => `'${v}'`).join(', ')}`, instruction.at) 428 | } 429 | } 430 | } 431 | 432 | if (value) { 433 | await setOutputs(instruction.outputs, value, ctx) 434 | } else if (instruction.outputs.length > 0 && instruction.instruction.kind !== 'LOOP') { 435 | WARN( 436 | 'not outputting anything because this function does not return anything.', 437 | instruction.outputs[0].at ?? instruction.at 438 | ) 439 | } 440 | } 441 | } 442 | 443 | export async function play(window: WindowAst) { 444 | await clearClippies('WARNING') 445 | await clearClippies('ERROR') 446 | clearWindow(window.at) 447 | await stop(window) 448 | 449 | const ctx: EvalContext = { 450 | windowEngine: makeWindow(window.at), 451 | windowNode: window.at, 452 | isDone: false, 453 | } 454 | 455 | stopFunctions.set(window.at.id, () => { 456 | ctx.isDone = true 457 | }) 458 | 459 | if (window.setup) { 460 | try { 461 | resetLoop() 462 | await runInstructions(window.setup.first, ctx) 463 | } catch (error) { 464 | if (error instanceof EvalError) { 465 | console.error('error in setup:') 466 | console.error(error) 467 | await makeClippyMessage('ERROR', error.originalMessage, error.node) 468 | await stop(window) 469 | return 470 | } else { 471 | throw error 472 | } 473 | } 474 | } 475 | 476 | const interval = setInterval(async () => { 477 | try { 478 | resetLoop() 479 | if (window.loop) await runInstructions(window.loop.first, ctx) 480 | } catch (error) { 481 | if (error instanceof EvalError) { 482 | console.error('error in loop:') 483 | console.error(error) 484 | await makeClippyMessage('ERROR', error.originalMessage, error.node) 485 | await stop(window) 486 | } else { 487 | throw error 488 | } 489 | } 490 | }, 1000 / 60) 491 | 492 | stopFunctions.set(window.at.id, () => { 493 | ctx.isDone = true 494 | clearInterval(interval) 495 | }) 496 | } 497 | 498 | export async function stop(window: WindowAst) { 499 | clearWindow(window.at) 500 | 501 | const stopFunction = stopFunctions.get(window.at.id) 502 | if (stopFunction) { 503 | stopFunction() 504 | stopFunctions.delete(window.at.id) 505 | } 506 | } 507 | 508 | // --- 509 | 510 | export interface FnArg { 511 | type: Type 512 | name?: string 513 | } 514 | 515 | export interface InfixOperatorImpl { 516 | left: FnArg 517 | right: FnArg 518 | impl(left: Obj, right: Obj, ctx: EvalContext, at: SceneNode): Promise 519 | } 520 | 521 | export type InfixOperator = '/' | '-' | '*' | '+' | '<' | '>' | '<=' | '>=' | '%' 522 | 523 | export const infixOperatorImpls: Record = { 524 | '/': { 525 | left: { type: { kind: 'NUMBER_TYPE' }, name: 'left' }, 526 | right: { type: { kind: 'NUMBER_TYPE' }, name: 'right' }, 527 | async impl(left: NumberObj, right: NumberObj, _ctx: EvalContext, at: SceneNode) { 528 | return { 529 | kind: 'NUMBER_OBJ', 530 | type: { kind: 'NUMBER_TYPE' }, 531 | value: left.value / right.value, 532 | at, 533 | } 534 | }, 535 | }, 536 | '%': { 537 | left: { type: { kind: 'NUMBER_TYPE' }, name: 'left' }, 538 | right: { type: { kind: 'NUMBER_TYPE' }, name: 'right' }, 539 | async impl(left: NumberObj, right: NumberObj, _ctx: EvalContext, at: SceneNode) { 540 | return { 541 | kind: 'NUMBER_OBJ', 542 | type: { kind: 'NUMBER_TYPE' }, 543 | value: left.value % right.value, 544 | at, 545 | } 546 | }, 547 | }, 548 | '-': { 549 | left: { type: { kind: 'NUMBER_TYPE' }, name: 'left' }, 550 | right: { type: { kind: 'NUMBER_TYPE' }, name: 'right' }, 551 | async impl(left: NumberObj, right: NumberObj, _ctx: EvalContext, at: SceneNode) { 552 | return { 553 | kind: 'NUMBER_OBJ', 554 | type: { kind: 'NUMBER_TYPE' }, 555 | value: left.value - right.value, 556 | at, 557 | } 558 | }, 559 | }, 560 | '*': { 561 | left: { type: { kind: 'NUMBER_TYPE' } }, 562 | right: { type: { kind: 'NUMBER_TYPE' } }, 563 | async impl(left: NumberObj, right: NumberObj, _ctx: EvalContext, at: SceneNode) { 564 | return { 565 | kind: 'NUMBER_OBJ', 566 | type: { kind: 'NUMBER_TYPE' }, 567 | value: left.value * right.value, 568 | at, 569 | } 570 | }, 571 | }, 572 | '+': { 573 | left: { type: { kind: 'NUMBER_TYPE' } }, 574 | right: { type: { kind: 'NUMBER_TYPE' } }, 575 | async impl(left: NumberObj, right: NumberObj, _ctx: EvalContext, at: SceneNode) { 576 | return { 577 | kind: 'NUMBER_OBJ', 578 | type: { kind: 'NUMBER_TYPE' }, 579 | value: left.value + right.value, 580 | at, 581 | } 582 | }, 583 | }, 584 | '<': { 585 | left: { name: 'left', type: { kind: 'NUMBER_TYPE' } }, 586 | right: { name: 'right', type: { kind: 'NUMBER_TYPE' } }, 587 | async impl(left: NumberObj, right: NumberObj, _ctx: EvalContext, at: SceneNode) { 588 | return left.value < right.value ? booleanTrue(at) : booleanFalse(at) 589 | }, 590 | }, 591 | '>': { 592 | left: { name: 'left', type: { kind: 'NUMBER_TYPE' } }, 593 | right: { name: 'right', type: { kind: 'NUMBER_TYPE' } }, 594 | async impl(left: NumberObj, right: NumberObj, _ctx: EvalContext, at: SceneNode) { 595 | return left.value > right.value ? booleanTrue(at) : booleanFalse(at) 596 | }, 597 | }, 598 | '<=': { 599 | left: { name: 'left', type: { kind: 'NUMBER_TYPE' } }, 600 | right: { name: 'right', type: { kind: 'NUMBER_TYPE' } }, 601 | async impl(left: NumberObj, right: NumberObj, _ctx: EvalContext, at: SceneNode) { 602 | return left.value <= right.value ? booleanTrue(at) : booleanFalse(at) 603 | }, 604 | }, 605 | '>=': { 606 | left: { name: 'left', type: { kind: 'NUMBER_TYPE' } }, 607 | right: { name: 'right', type: { kind: 'NUMBER_TYPE' } }, 608 | async impl(left: NumberObj, right: NumberObj, _ctx: EvalContext, at: SceneNode) { 609 | return left.value >= right.value ? booleanTrue(at) : booleanFalse(at) 610 | }, 611 | }, 612 | } 613 | 614 | export const infixOperators: InfixOperator[] = [ '>=', '<=', '>', '<', '+', '*', '/', '%', '-' ] 615 | 616 | export interface BuiltinFnImpl { 617 | args: FnArg[] 618 | impl(ctx: EvalContext, at: SceneNode, ...args: Obj[]): Promise 619 | } 620 | 621 | export type BuiltinFnNames = 622 | | 'add sprite' 623 | | 'add line' 624 | | 'call' 625 | | 'inputs' 626 | | 'colliding' 627 | | 'add text' 628 | | 'to string' 629 | | 'length' 630 | | 'index' 631 | | 'parse obj faces' 632 | | 'parse obj vertices' 633 | | 'debug log' 634 | | 'range' 635 | | 'yield' 636 | 637 | export const builtinFnImpls: Record = { 638 | 'add sprite': { 639 | args: [ 640 | { type: { kind: 'GRAPHIC_TYPE' } } 641 | ], 642 | impl: async function (ctx: EvalContext, at: SceneNode, graphic: GraphicObj) { 643 | const sprite = addSprite(ctx.windowNode, graphic.graphic) 644 | 645 | return { 646 | kind: 'SPRITE_OBJ', 647 | type: { kind: 'SPRITE_TYPE' }, 648 | engine: sprite, 649 | at, 650 | } 651 | }, 652 | }, 653 | 'add text': { 654 | args: [], 655 | impl: async function(ctx: EvalContext, at: SceneNode) { 656 | return { 657 | kind: 'TEXT_OBJ', 658 | type: { kind: 'TEXT_TYPE' }, 659 | engine: await addText(ctx.windowNode), 660 | at, 661 | } 662 | } 663 | }, 664 | 'add line': { 665 | args: [ 666 | { 667 | name: 'start x', 668 | type: { kind: 'NUMBER_TYPE' } 669 | }, 670 | { 671 | name: 'start y', 672 | type: { kind: 'NUMBER_TYPE' } 673 | }, 674 | { 675 | name: 'end x', 676 | type: { kind: 'NUMBER_TYPE' } 677 | }, 678 | { 679 | name: 'end y', 680 | type: { kind: 'NUMBER_TYPE' } 681 | } 682 | ], 683 | impl: async function ( 684 | ctx: EvalContext, 685 | at: SceneNode, 686 | startX: NumberObj, 687 | startY: NumberObj, 688 | endX: NumberObj, 689 | endY: NumberObj 690 | ): Promise { 691 | const connector = figma.createConnector() 692 | connector.strokes = [ figma.util.solidPaint('#000000') ] 693 | connector.strokeWeight = 1 694 | connector.connectorLineType = "STRAIGHT" 695 | connector.connectorStart = { 696 | position: { 697 | x: startX.value, 698 | y: startY.value 699 | } 700 | } 701 | connector.connectorStartStrokeCap = 'NONE' 702 | connector.connectorEnd = { 703 | position: { 704 | x: endX.value, 705 | y: endY.value 706 | } 707 | } 708 | connector.connectorEndStrokeCap = 'NONE' 709 | ctx.windowNode.appendChild(connector) 710 | return { 711 | kind: 'GRAPHIC_OBJ', 712 | type: { kind: 'GRAPHIC_TYPE' }, 713 | graphic: connector, 714 | at 715 | } 716 | } 717 | }, 718 | 'call': { 719 | args: [ 720 | { type: { kind: 'FLOW_TYPE' } } 721 | ], 722 | impl: async function (ctx: EvalContext, _at: SceneNode, flow: FlowObj) { 723 | await runInstructions(flow.node.first, ctx) 724 | return null 725 | } 726 | }, 727 | 'range': { 728 | args: [ 729 | { type: { kind: 'NUMBER_TYPE'} }, 730 | ], 731 | impl: async function (_ctx: EvalContext, at: SceneNode, max: NumberObj): Promise { 732 | return { 733 | kind: 'ARRAY_OBJ', 734 | type: { kind: 'ARRAY_TYPE', item: { kind: 'NUMBER_TYPE' } }, 735 | items: new Array(max.value).fill(null as unknown as NumberObj).map((_, index) => ({ 736 | kind: 'NUMBER_OBJ', 737 | type: { kind: 'NUMBER_TYPE' }, 738 | value: index, 739 | at, 740 | })), 741 | at, 742 | } 743 | } 744 | }, 745 | 'inputs': { 746 | args: [], 747 | impl: async function (_ctx: EvalContext, at: SceneNode,) { 748 | return { 749 | kind: 'ENUM_OBJ', 750 | type: { kind: 'ENUM_TYPE', options: new Set(keys) }, 751 | selected: getPressedKeys(), 752 | at, 753 | } 754 | } 755 | }, 756 | 'colliding': { 757 | args: [ 758 | { type: { kind: 'SPRITE_TYPE' } }, 759 | { type: { kind: 'SPRITE_TYPE' } } 760 | ], 761 | impl: async function(_ctx: EvalContext, at: SceneNode, a: SpriteObj, b: SpriteObj) { 762 | if ( 763 | // @ts-expect-error jank 764 | a.engine.x < b.engine.x + b.engine.width && 765 | // @ts-expect-error jank 766 | a.engine.x + a.engine.width > b.engine.x && 767 | // @ts-expect-error jank 768 | a.engine.y < b.engine.y + b.engine.height && 769 | // @ts-expect-error jank 770 | a.engine.y + a.engine.height > b.engine.y 771 | ) { 772 | return booleanTrue(at) 773 | } else { 774 | return booleanFalse(at) 775 | } 776 | } 777 | }, 778 | 'to string': { 779 | args: [ 780 | { type: { kind: 'NUMBER_TYPE' } } 781 | ], 782 | impl: async function(_ctx: EvalContext, at: SceneNode, number: NumberObj): Promise { 783 | return { 784 | kind: 'STRING_OBJ', 785 | type: { kind: 'STRING_TYPE' }, 786 | value: number.value.toString(), 787 | at, 788 | } 789 | } 790 | }, 791 | 'length': { 792 | args: [ 793 | { type: { kind: 'ARRAY_TYPE', item: { kind: 'ANY_TYPE' } } } 794 | ], 795 | impl: async function (_ctx: EvalContext, at: SceneNode, array: ArrayObj): Promise { 796 | return { 797 | kind: 'NUMBER_OBJ', 798 | type: { kind: 'NUMBER_TYPE' }, 799 | value: array.items.length, 800 | at, 801 | } 802 | } 803 | }, 804 | 'index': { 805 | args: [ 806 | { type: { kind: 'ARRAY_TYPE', item: { kind: 'ANY_TYPE' } } }, 807 | { type: { kind: 'NUMBER_TYPE' } }, 808 | ], 809 | impl: async function (_ctx: EvalContext, at: SceneNode, array: ArrayObj, index: NumberObj): Promise { 810 | const item = array.items[index.value] 811 | if (!item) ERROR(`array index out of bounds: ${index.value} >= length ${array.items.length}.`, at) 812 | return item 813 | } 814 | }, 815 | 'parse obj faces': { 816 | args: [ 817 | { type: { kind: 'STRING_TYPE' } } 818 | ], 819 | impl: async function(_ctx: EvalContext, at: SceneNode, file: StringObj): Promise { 820 | const indices: ArrayObj[] = file.value.split('\n').filter(line => /^f\s/.test(line)).map(line => { 821 | line = line.slice(1).trim() 822 | const coords: NumberObj[] = line.split(/\s+/g).map(index => { 823 | const value = Number.parseFloat(index) 824 | if (Number.isNaN(value)) ERROR(`could not parse obj: face '${index}' must is not a number.`, at) 825 | return { 826 | kind: 'NUMBER_OBJ', 827 | type: { kind: 'NUMBER_TYPE' }, 828 | value: value - 1, 829 | at 830 | } 831 | }) 832 | 833 | return { 834 | kind: 'ARRAY_OBJ', 835 | type: { kind: 'ARRAY_TYPE', item: { kind: 'NUMBER_TYPE' } }, 836 | items: coords, 837 | at 838 | } 839 | }) 840 | 841 | console.log(`loaded ${indices.length} faces`) 842 | 843 | return { 844 | kind: 'ARRAY_OBJ', 845 | type: { kind: 'ARRAY_TYPE', item: { kind: 'ARRAY_TYPE', item: { kind: 'NUMBER_TYPE' } } }, 846 | items: indices, 847 | at 848 | } 849 | } 850 | }, 851 | 'parse obj vertices': { 852 | args: [ 853 | { type: { kind: 'STRING_TYPE' } } 854 | ], 855 | impl: async function(_ctx: EvalContext, at: SceneNode, file: StringObj): Promise { 856 | console.log(file.value) 857 | const vertices: ArrayObj[] = file.value.split('\n').filter(line => /^v\s/.test(line)).map(line => { 858 | line = line.slice(1).trim() 859 | const coords: NumberObj[] = line.split(/\s+/g).map(coord => { 860 | const value = Number.parseFloat(coord) 861 | if (Number.isNaN(value)) ERROR(`could not parse obj: vertex '${coord}' is not a number.`, at) 862 | return { 863 | kind: 'NUMBER_OBJ', 864 | type: { kind: 'NUMBER_TYPE' }, 865 | value, 866 | at 867 | } 868 | }) 869 | return { 870 | kind: 'ARRAY_OBJ', 871 | type: { kind: 'ARRAY_TYPE', item: { kind: 'NUMBER_TYPE' } }, 872 | items: coords, 873 | at 874 | } 875 | }) 876 | 877 | console.log(`loaded ${vertices.length} vertices`) 878 | 879 | return { 880 | kind: 'ARRAY_OBJ', 881 | type: { kind: 'ARRAY_TYPE', item: { kind: 'NUMBER_TYPE' } }, 882 | items: vertices, 883 | at 884 | } 885 | } 886 | }, 887 | 'debug log': { 888 | args: [ 889 | { type: { kind: 'ANY_TYPE' } }, 890 | ], 891 | impl: async function(_ctx: EvalContext, _at: SceneNode, value: Obj): Promise { 892 | console.log('debug log:', value) 893 | return null 894 | } 895 | }, 896 | 'yield': { 897 | args: [], 898 | impl: async function (): Promise { 899 | await new Promise(resolve => setTimeout(resolve, 1)) 900 | return null 901 | } 902 | } 903 | } 904 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { compilePage } from './ast' 2 | import { resetLoop } from './debug' 3 | import { play, stop } from './eval' 4 | import { interpretBrowserKeys, updatePressedKeys } from './input' 5 | import { difference } from './polyfills' 6 | 7 | async function main() { 8 | let previousButtons: Set = new Set() 9 | figma.on('selectionchange', async () => { 10 | resetLoop() 11 | const windows = await compilePage(figma.currentPage) 12 | 13 | const buttons = new Set(figma.currentPage.selection.map(button => button.id)) 14 | const newButtons = difference(buttons, previousButtons) 15 | previousButtons = buttons 16 | if (newButtons.size > 1) return 17 | 18 | const playWindows = new Set(windows.filter(window => window.playButtons.some(button => newButtons.has(button.id)))) 19 | const stopWindows = new Set(windows.filter(window => window.stopButtons.some(button => newButtons.has(button.id)))) 20 | 21 | for (const window of playWindows) await play(window) 22 | for (const window of stopWindows) await stop(window) 23 | }) 24 | 25 | figma.showUI(__html__, { height: 100, width: 300 }) 26 | 27 | figma.ui.on('message', (message) => { 28 | switch (message.kind) { 29 | case 'UPDATE_PRESSED_KEYS': { 30 | const rawPressedKeys = new Set(message.pressedKeys as string[]) 31 | updatePressedKeys(interpretBrowserKeys(rawPressedKeys)) 32 | break 33 | } 34 | default: console.warn('unknown message:', message) 35 | } 36 | }) 37 | } 38 | 39 | main().catch(console.error) 40 | -------------------------------------------------------------------------------- /src/input.ts: -------------------------------------------------------------------------------- 1 | export const keys = [ 'up', 'down', 'left', 'right' ] as const 2 | 3 | export type Key = typeof keys[number] 4 | 5 | const pressedKeys: Set = new Set() 6 | 7 | export function interpretBrowserKeys(browserKeys: Set): Set { 8 | const keys: Set = new Set() 9 | 10 | for (const browserKey of browserKeys) { 11 | const key: Key | null = ({ 12 | ArrowUp: 'up', 13 | ArrowDown: 'down', 14 | ArrowLeft: 'left', 15 | ArrowRight: 'right', 16 | } as const)[browserKey] ?? null 17 | 18 | if (key !== null) keys.add(key) 19 | } 20 | 21 | return keys 22 | } 23 | 24 | export function updatePressedKeys(newPressedKeys: Set): void { 25 | let dirty = false 26 | 27 | for (const key of newPressedKeys) { 28 | if (!pressedKeys.has(key)) { 29 | pressedKeys.add(key) 30 | dirty = true 31 | } 32 | } 33 | 34 | for (const key of pressedKeys) { 35 | if (!newPressedKeys.has(key)) { 36 | pressedKeys.delete(key) 37 | dirty = true 38 | } 39 | } 40 | } 41 | 42 | export function getPressedKeys(): Set { 43 | return pressedKeys 44 | } 45 | -------------------------------------------------------------------------------- /src/polyfills.ts: -------------------------------------------------------------------------------- 1 | export function difference(a: Set, b: Set): Set { 2 | return new Set([ ...a ].filter(x => !b.has(x))) 3 | } 4 | 5 | export function intersection(a: Set, b: Set): Set { 6 | return new Set([ ...a ].filter(x => b.has(x))) 7 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2019", 4 | "lib": ["ES2019"], 5 | "strict": true, 6 | "typeRoots": [ 7 | "./node_modules/@types", 8 | "./node_modules/@figma" 9 | ], 10 | "outDir": "./dist", 11 | "jsx": "react", 12 | "allowJs": true, 13 | "moduleResolution": "node" 14 | }, 15 | "include": ["src/**/*.ts"] 16 | } 17 | -------------------------------------------------------------------------------- /ui.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 32 | 33 | 63 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const webpack = require('webpack') 3 | 4 | module.exports = (env, argv) => ({ 5 | mode: argv.mode === 'production' ? 'production' : 'development', 6 | devtool: argv.mode === 'production' ? false : 'inline-source-map', 7 | 8 | entry: { 9 | dist: './src/index.ts' 10 | }, 11 | module: { 12 | rules: [ 13 | { 14 | test: /\.tsx?$/, 15 | use: 'ts-loader', 16 | exclude: /node_modules/, 17 | }, 18 | ], 19 | }, 20 | resolve: { 21 | extensions: ['.ts', '.js'], 22 | }, 23 | output: { 24 | filename: '[name].js', 25 | path: __dirname, 26 | }, 27 | }) 28 | -------------------------------------------------------------------------------- /window.json: -------------------------------------------------------------------------------- 1 | { 2 | "kind": "WINDOW", 3 | "playButtons": [ 4 | { 5 | "id": "2:3503" 6 | } 7 | ], 8 | "stopButtons": [], 9 | "setup": { 10 | "kind": "FLOW", 11 | "name": "setup", 12 | "first": { 13 | "kind": "INSTRUCTION", 14 | "next": { 15 | "kind": "INSTRUCTION", 16 | "next": { 17 | "kind": "INSTRUCTION", 18 | "next": { 19 | "kind": "INSTRUCTION", 20 | "next": { 21 | "kind": "INSTRUCTION", 22 | "next": { 23 | "kind": "INSTRUCTION", 24 | "next": null, 25 | "matchArms": null, 26 | "instruction": { 27 | "kind": "NUMBER", 28 | "value": 10, 29 | "at": { 30 | "id": "2:2795" 31 | } 32 | }, 33 | "inputs": [], 34 | "outputs": [ 35 | { 36 | "kind": "VARIABLE", 37 | "name": "x velocity", 38 | "at": { 39 | "id": "2:2437" 40 | } 41 | }, 42 | { 43 | "kind": "VARIABLE", 44 | "name": "y velocity", 45 | "at": { 46 | "id": "2:2445" 47 | } 48 | } 49 | ], 50 | "at": { 51 | "id": "2:2795" 52 | } 53 | }, 54 | "matchArms": null, 55 | "instruction": { 56 | "kind": "INFIX", 57 | "operator": "/", 58 | "left": { 59 | "kind": "PROPERTY", 60 | "name": "height", 61 | "parent": "CURRENT_WINDOW", 62 | "at": null 63 | }, 64 | "right": { 65 | "kind": "NUMBER", 66 | "value": 2, 67 | "at": null 68 | }, 69 | "at": { 70 | "id": "2:2347" 71 | } 72 | }, 73 | "inputs": [], 74 | "outputs": [ 75 | { 76 | "kind": "PROPERTY", 77 | "name": "y pos", 78 | "parent": { 79 | "kind": "VARIABLE", 80 | "name": "ball", 81 | "at": { 82 | "id": "2:2076" 83 | } 84 | }, 85 | "at": { 86 | "id": "2:2569" 87 | } 88 | } 89 | ], 90 | "at": { 91 | "id": "2:2347" 92 | } 93 | }, 94 | "matchArms": null, 95 | "instruction": { 96 | "kind": "INFIX", 97 | "operator": "/", 98 | "left": { 99 | "kind": "PROPERTY", 100 | "name": "width", 101 | "parent": "CURRENT_WINDOW", 102 | "at": null 103 | }, 104 | "right": { 105 | "kind": "NUMBER", 106 | "value": 2, 107 | "at": null 108 | }, 109 | "at": { 110 | "id": "2:2268" 111 | } 112 | }, 113 | "inputs": [], 114 | "outputs": [ 115 | { 116 | "kind": "PROPERTY", 117 | "name": "x pos", 118 | "parent": { 119 | "kind": "VARIABLE", 120 | "name": "ball", 121 | "at": { 122 | "id": "2:2076" 123 | } 124 | }, 125 | "at": { 126 | "id": "2:2536" 127 | } 128 | } 129 | ], 130 | "at": { 131 | "id": "2:2268" 132 | } 133 | }, 134 | "matchArms": null, 135 | "instruction": { 136 | "kind": "FUNCTION", 137 | "text": "add sprite", 138 | "at": { 139 | "id": "2:2012" 140 | } 141 | }, 142 | "inputs": [ 143 | { 144 | "kind": "GRAPHIC", 145 | "at": { 146 | "id": "2:248" 147 | } 148 | } 149 | ], 150 | "outputs": [ 151 | { 152 | "kind": "VARIABLE", 153 | "name": "ball", 154 | "at": { 155 | "id": "2:2076" 156 | } 157 | } 158 | ], 159 | "at": { 160 | "id": "2:2012" 161 | } 162 | }, 163 | "matchArms": null, 164 | "instruction": { 165 | "kind": "NUMBER", 166 | "value": 30, 167 | "at": { 168 | "id": "2:1710" 169 | } 170 | }, 171 | "inputs": [], 172 | "outputs": [ 173 | { 174 | "kind": "PROPERTY", 175 | "name": "x pos", 176 | "parent": { 177 | "kind": "VARIABLE", 178 | "name": "paddle", 179 | "at": { 180 | "id": "4:339" 181 | } 182 | }, 183 | "at": { 184 | "id": "2:2623" 185 | } 186 | } 187 | ], 188 | "at": { 189 | "id": "2:1710" 190 | } 191 | }, 192 | "matchArms": null, 193 | "instruction": { 194 | "kind": "FUNCTION", 195 | "text": "add sprite", 196 | "at": { 197 | "id": "2:537" 198 | } 199 | }, 200 | "inputs": [ 201 | { 202 | "kind": "GRAPHIC", 203 | "at": { 204 | "id": "2:225" 205 | } 206 | } 207 | ], 208 | "outputs": [ 209 | { 210 | "kind": "VARIABLE", 211 | "name": "paddle", 212 | "at": { 213 | "id": "4:339" 214 | } 215 | } 216 | ], 217 | "at": { 218 | "id": "2:537" 219 | } 220 | }, 221 | "at": { 222 | "id": "2:505" 223 | } 224 | }, 225 | "loop": { 226 | "kind": "FLOW", 227 | "name": "loop", 228 | "first": { 229 | "kind": "INSTRUCTION", 230 | "next": { 231 | "kind": "INSTRUCTION", 232 | "next": { 233 | "kind": "INSTRUCTION", 234 | "next": { 235 | "kind": "INSTRUCTION", 236 | "next": { 237 | "kind": "INSTRUCTION", 238 | "next": { 239 | "kind": "INSTRUCTION", 240 | "next": { 241 | "kind": "INSTRUCTION", 242 | "next": null, 243 | "matchArms": null, 244 | "instruction": { 245 | "kind": "FUNCTION", 246 | "text": "call", 247 | "at": { 248 | "id": "2:3040" 249 | } 250 | }, 251 | "inputs": [ 252 | { 253 | "kind": "FLOW", 254 | "name": "move ball", 255 | "first": { 256 | "kind": "INSTRUCTION", 257 | "next": { 258 | "kind": "INSTRUCTION", 259 | "next": null, 260 | "matchArms": null, 261 | "instruction": { 262 | "kind": "INFIX", 263 | "operator": "+", 264 | "left": null, 265 | "right": null, 266 | "at": { 267 | "id": "2:3139" 268 | } 269 | }, 270 | "inputs": [ 271 | { 272 | "kind": "VARIABLE", 273 | "name": "y velocity", 274 | "at": { 275 | "id": "2:2445" 276 | } 277 | }, 278 | { 279 | "kind": "PROPERTY", 280 | "name": "y pos", 281 | "parent": { 282 | "kind": "VARIABLE", 283 | "name": "ball", 284 | "at": { 285 | "id": "2:2076" 286 | } 287 | }, 288 | "at": { 289 | "id": "2:2569" 290 | } 291 | } 292 | ], 293 | "outputs": [ 294 | { 295 | "kind": "PROPERTY", 296 | "name": "y pos", 297 | "parent": { 298 | "kind": "VARIABLE", 299 | "name": "ball", 300 | "at": { 301 | "id": "2:2076" 302 | } 303 | }, 304 | "at": { 305 | "id": "2:2569" 306 | } 307 | } 308 | ], 309 | "at": { 310 | "id": "2:3139" 311 | } 312 | }, 313 | "matchArms": null, 314 | "instruction": { 315 | "kind": "INFIX", 316 | "operator": "+", 317 | "left": null, 318 | "right": null, 319 | "at": { 320 | "id": "2:3136" 321 | } 322 | }, 323 | "inputs": [ 324 | { 325 | "kind": "VARIABLE", 326 | "name": "x velocity", 327 | "at": { 328 | "id": "2:2437" 329 | } 330 | }, 331 | { 332 | "kind": "PROPERTY", 333 | "name": "x pos", 334 | "parent": { 335 | "kind": "VARIABLE", 336 | "name": "ball", 337 | "at": { 338 | "id": "2:2076" 339 | } 340 | }, 341 | "at": { 342 | "id": "2:2536" 343 | } 344 | } 345 | ], 346 | "outputs": [ 347 | { 348 | "kind": "PROPERTY", 349 | "name": "x pos", 350 | "parent": { 351 | "kind": "VARIABLE", 352 | "name": "ball", 353 | "at": { 354 | "id": "2:2076" 355 | } 356 | }, 357 | "at": { 358 | "id": "2:2536" 359 | } 360 | } 361 | ], 362 | "at": { 363 | "id": "2:3136" 364 | } 365 | }, 366 | "at": { 367 | "id": "2:3018" 368 | } 369 | } 370 | ], 371 | "outputs": [], 372 | "at": { 373 | "id": "2:3040" 374 | } 375 | }, 376 | "matchArms": {}, 377 | "instruction": { 378 | "kind": "INFIX", 379 | "operator": "<=", 380 | "left": null, 381 | "right": { 382 | "kind": "NUMBER", 383 | "value": 0, 384 | "at": null 385 | }, 386 | "at": { 387 | "id": "2:3453" 388 | } 389 | }, 390 | "inputs": [ 391 | { 392 | "kind": "PROPERTY", 393 | "name": "y pos", 394 | "parent": { 395 | "kind": "VARIABLE", 396 | "name": "ball", 397 | "at": { 398 | "id": "2:2076" 399 | } 400 | }, 401 | "at": { 402 | "id": "2:2569" 403 | } 404 | } 405 | ], 406 | "outputs": [], 407 | "at": { 408 | "id": "2:3453" 409 | } 410 | }, 411 | "matchArms": {}, 412 | "instruction": { 413 | "kind": "INFIX", 414 | "operator": ">=", 415 | "left": null, 416 | "right": { 417 | "kind": "PROPERTY", 418 | "name": "height", 419 | "parent": "CURRENT_WINDOW", 420 | "at": null 421 | }, 422 | "at": { 423 | "id": "2:3450" 424 | } 425 | }, 426 | "inputs": [ 427 | { 428 | "kind": "PROPERTY", 429 | "name": "y pos", 430 | "parent": { 431 | "kind": "VARIABLE", 432 | "name": "ball", 433 | "at": { 434 | "id": "2:2076" 435 | } 436 | }, 437 | "at": { 438 | "id": "2:2569" 439 | } 440 | } 441 | ], 442 | "outputs": [], 443 | "at": { 444 | "id": "2:3450" 445 | } 446 | }, 447 | "matchArms": {}, 448 | "instruction": { 449 | "kind": "INFIX", 450 | "operator": ">=", 451 | "left": null, 452 | "right": { 453 | "kind": "PROPERTY", 454 | "name": "width", 455 | "parent": "CURRENT_WINDOW", 456 | "at": null 457 | }, 458 | "at": { 459 | "id": "2:3332" 460 | } 461 | }, 462 | "inputs": [ 463 | { 464 | "kind": "PROPERTY", 465 | "name": "x pos", 466 | "parent": { 467 | "kind": "VARIABLE", 468 | "name": "ball", 469 | "at": { 470 | "id": "2:2076" 471 | } 472 | }, 473 | "at": { 474 | "id": "2:2536" 475 | } 476 | } 477 | ], 478 | "outputs": [], 479 | "at": { 480 | "id": "2:3332" 481 | } 482 | }, 483 | "matchArms": {}, 484 | "instruction": { 485 | "kind": "FUNCTION", 486 | "text": "colliding", 487 | "at": { 488 | "id": "2:2947" 489 | } 490 | }, 491 | "inputs": [ 492 | { 493 | "kind": "VARIABLE", 494 | "name": "paddle", 495 | "at": { 496 | "id": "4:339" 497 | } 498 | }, 499 | { 500 | "kind": "VARIABLE", 501 | "name": "ball", 502 | "at": { 503 | "id": "2:2076" 504 | } 505 | } 506 | ], 507 | "outputs": [], 508 | "at": { 509 | "id": "2:2947" 510 | } 511 | }, 512 | "matchArms": {}, 513 | "instruction": { 514 | "kind": "FUNCTION", 515 | "text": "inputs", 516 | "at": { 517 | "id": "2:1544" 518 | } 519 | }, 520 | "inputs": [], 521 | "outputs": [], 522 | "at": { 523 | "id": "2:1544" 524 | } 525 | }, 526 | "matchArms": null, 527 | "instruction": { 528 | "kind": "NUMBER", 529 | "value": 10, 530 | "at": { 531 | "id": "5:246" 532 | } 533 | }, 534 | "inputs": [], 535 | "outputs": [ 536 | { 537 | "kind": "VARIABLE", 538 | "name": "right", 539 | "at": { 540 | "id": "5:259" 541 | } 542 | } 543 | ], 544 | "at": { 545 | "id": "5:246" 546 | } 547 | }, 548 | "at": { 549 | "id": "2:1543" 550 | } 551 | }, 552 | "at": { 553 | "id": "2:468" 554 | } 555 | } 556 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@discoveryjs/json-ext@^0.5.0": 6 | version "0.5.7" 7 | resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" 8 | integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== 9 | 10 | "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": 11 | version "4.4.0" 12 | resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" 13 | integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== 14 | dependencies: 15 | eslint-visitor-keys "^3.3.0" 16 | 17 | "@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": 18 | version "4.11.1" 19 | resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.1.tgz#a547badfc719eb3e5f4b556325e542fbe9d7a18f" 20 | integrity sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q== 21 | 22 | "@eslint/eslintrc@^2.1.4": 23 | version "2.1.4" 24 | resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" 25 | integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== 26 | dependencies: 27 | ajv "^6.12.4" 28 | debug "^4.3.2" 29 | espree "^9.6.0" 30 | globals "^13.19.0" 31 | ignore "^5.2.0" 32 | import-fresh "^3.2.1" 33 | js-yaml "^4.1.0" 34 | minimatch "^3.1.2" 35 | strip-json-comments "^3.1.1" 36 | 37 | "@eslint/js@8.57.1": 38 | version "8.57.1" 39 | resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" 40 | integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== 41 | 42 | "@figma/eslint-plugin-figma-plugins@*": 43 | version "0.15.0" 44 | resolved "https://registry.yarnpkg.com/@figma/eslint-plugin-figma-plugins/-/eslint-plugin-figma-plugins-0.15.0.tgz#66acadd82865d7f132acbcf0cf6058fe2b258df2" 45 | integrity sha512-ol/v6qje8sxE2npvjCbOQUGlTx++RdYcq98jKaNokL/qN1IF7Y6Y7jgj2wiAYmT2V+aABvtX7MNtKKJ2fbcfWA== 46 | dependencies: 47 | "@typescript-eslint/typescript-estree" "^6.13.2" 48 | "@typescript-eslint/utils" "^6.12.0" 49 | typescript "^5.3.2" 50 | 51 | "@figma/plugin-typings@*": 52 | version "1.100.2" 53 | resolved "https://registry.yarnpkg.com/@figma/plugin-typings/-/plugin-typings-1.100.2.tgz#a0d3c34f3667042b6d357ee56ef1b5c306966e70" 54 | integrity sha512-xRlneaT5D6afuzkt8J28DXgHAcglncqNVzh1qe5bJVzTLfniiDQY5N/IVXIJj/u7vXYMY6uqvJt8UBFe5l4FXA== 55 | 56 | "@humanwhocodes/config-array@^0.13.0": 57 | version "0.13.0" 58 | resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" 59 | integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== 60 | dependencies: 61 | "@humanwhocodes/object-schema" "^2.0.3" 62 | debug "^4.3.1" 63 | minimatch "^3.0.5" 64 | 65 | "@humanwhocodes/module-importer@^1.0.1": 66 | version "1.0.1" 67 | resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" 68 | integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== 69 | 70 | "@humanwhocodes/object-schema@^2.0.3": 71 | version "2.0.3" 72 | resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" 73 | integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== 74 | 75 | "@jridgewell/gen-mapping@^0.3.5": 76 | version "0.3.5" 77 | resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" 78 | integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== 79 | dependencies: 80 | "@jridgewell/set-array" "^1.2.1" 81 | "@jridgewell/sourcemap-codec" "^1.4.10" 82 | "@jridgewell/trace-mapping" "^0.3.24" 83 | 84 | "@jridgewell/resolve-uri@^3.1.0": 85 | version "3.1.2" 86 | resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" 87 | integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== 88 | 89 | "@jridgewell/set-array@^1.2.1": 90 | version "1.2.1" 91 | resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" 92 | integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== 93 | 94 | "@jridgewell/source-map@^0.3.3": 95 | version "0.3.6" 96 | resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.6.tgz#9d71ca886e32502eb9362c9a74a46787c36df81a" 97 | integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== 98 | dependencies: 99 | "@jridgewell/gen-mapping" "^0.3.5" 100 | "@jridgewell/trace-mapping" "^0.3.25" 101 | 102 | "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": 103 | version "1.5.0" 104 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" 105 | integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== 106 | 107 | "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": 108 | version "0.3.25" 109 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" 110 | integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== 111 | dependencies: 112 | "@jridgewell/resolve-uri" "^3.1.0" 113 | "@jridgewell/sourcemap-codec" "^1.4.14" 114 | 115 | "@nodelib/fs.scandir@2.1.5": 116 | version "2.1.5" 117 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 118 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 119 | dependencies: 120 | "@nodelib/fs.stat" "2.0.5" 121 | run-parallel "^1.1.9" 122 | 123 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 124 | version "2.0.5" 125 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 126 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 127 | 128 | "@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": 129 | version "1.2.8" 130 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 131 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 132 | dependencies: 133 | "@nodelib/fs.scandir" "2.1.5" 134 | fastq "^1.6.0" 135 | 136 | "@types/estree@^1.0.5": 137 | version "1.0.6" 138 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" 139 | integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== 140 | 141 | "@types/json-schema@^7.0.12", "@types/json-schema@^7.0.8": 142 | version "7.0.15" 143 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" 144 | integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== 145 | 146 | "@types/node@*": 147 | version "22.7.7" 148 | resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.7.tgz#6cd9541c3dccb4f7e8b141b491443f4a1570e307" 149 | integrity sha512-SRxCrrg9CL/y54aiMCG3edPKdprgMVGDXjA3gB8UmmBW5TcXzRUYAh8EWzTnSJFAd1rgImPELza+A3bJ+qxz8Q== 150 | dependencies: 151 | undici-types "~6.19.2" 152 | 153 | "@types/semver@^7.5.0": 154 | version "7.5.8" 155 | resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" 156 | integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== 157 | 158 | "@typescript-eslint/eslint-plugin@^6.12.0": 159 | version "6.21.0" 160 | resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz#30830c1ca81fd5f3c2714e524c4303e0194f9cd3" 161 | integrity sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA== 162 | dependencies: 163 | "@eslint-community/regexpp" "^4.5.1" 164 | "@typescript-eslint/scope-manager" "6.21.0" 165 | "@typescript-eslint/type-utils" "6.21.0" 166 | "@typescript-eslint/utils" "6.21.0" 167 | "@typescript-eslint/visitor-keys" "6.21.0" 168 | debug "^4.3.4" 169 | graphemer "^1.4.0" 170 | ignore "^5.2.4" 171 | natural-compare "^1.4.0" 172 | semver "^7.5.4" 173 | ts-api-utils "^1.0.1" 174 | 175 | "@typescript-eslint/parser@^6.12.0": 176 | version "6.21.0" 177 | resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" 178 | integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== 179 | dependencies: 180 | "@typescript-eslint/scope-manager" "6.21.0" 181 | "@typescript-eslint/types" "6.21.0" 182 | "@typescript-eslint/typescript-estree" "6.21.0" 183 | "@typescript-eslint/visitor-keys" "6.21.0" 184 | debug "^4.3.4" 185 | 186 | "@typescript-eslint/scope-manager@6.21.0": 187 | version "6.21.0" 188 | resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1" 189 | integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== 190 | dependencies: 191 | "@typescript-eslint/types" "6.21.0" 192 | "@typescript-eslint/visitor-keys" "6.21.0" 193 | 194 | "@typescript-eslint/type-utils@6.21.0": 195 | version "6.21.0" 196 | resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz#6473281cfed4dacabe8004e8521cee0bd9d4c01e" 197 | integrity sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag== 198 | dependencies: 199 | "@typescript-eslint/typescript-estree" "6.21.0" 200 | "@typescript-eslint/utils" "6.21.0" 201 | debug "^4.3.4" 202 | ts-api-utils "^1.0.1" 203 | 204 | "@typescript-eslint/types@6.21.0": 205 | version "6.21.0" 206 | resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" 207 | integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== 208 | 209 | "@typescript-eslint/typescript-estree@6.21.0", "@typescript-eslint/typescript-estree@^6.13.2": 210 | version "6.21.0" 211 | resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46" 212 | integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== 213 | dependencies: 214 | "@typescript-eslint/types" "6.21.0" 215 | "@typescript-eslint/visitor-keys" "6.21.0" 216 | debug "^4.3.4" 217 | globby "^11.1.0" 218 | is-glob "^4.0.3" 219 | minimatch "9.0.3" 220 | semver "^7.5.4" 221 | ts-api-utils "^1.0.1" 222 | 223 | "@typescript-eslint/utils@6.21.0", "@typescript-eslint/utils@^6.12.0": 224 | version "6.21.0" 225 | resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.21.0.tgz#4714e7a6b39e773c1c8e97ec587f520840cd8134" 226 | integrity sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ== 227 | dependencies: 228 | "@eslint-community/eslint-utils" "^4.4.0" 229 | "@types/json-schema" "^7.0.12" 230 | "@types/semver" "^7.5.0" 231 | "@typescript-eslint/scope-manager" "6.21.0" 232 | "@typescript-eslint/types" "6.21.0" 233 | "@typescript-eslint/typescript-estree" "6.21.0" 234 | semver "^7.5.4" 235 | 236 | "@typescript-eslint/visitor-keys@6.21.0": 237 | version "6.21.0" 238 | resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47" 239 | integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== 240 | dependencies: 241 | "@typescript-eslint/types" "6.21.0" 242 | eslint-visitor-keys "^3.4.1" 243 | 244 | "@ungap/structured-clone@^1.2.0": 245 | version "1.2.0" 246 | resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" 247 | integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== 248 | 249 | "@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1": 250 | version "1.12.1" 251 | resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.12.1.tgz#bb16a0e8b1914f979f45864c23819cc3e3f0d4bb" 252 | integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg== 253 | dependencies: 254 | "@webassemblyjs/helper-numbers" "1.11.6" 255 | "@webassemblyjs/helper-wasm-bytecode" "1.11.6" 256 | 257 | "@webassemblyjs/floating-point-hex-parser@1.11.6": 258 | version "1.11.6" 259 | resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" 260 | integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== 261 | 262 | "@webassemblyjs/helper-api-error@1.11.6": 263 | version "1.11.6" 264 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" 265 | integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== 266 | 267 | "@webassemblyjs/helper-buffer@1.12.1": 268 | version "1.12.1" 269 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz#6df20d272ea5439bf20ab3492b7fb70e9bfcb3f6" 270 | integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw== 271 | 272 | "@webassemblyjs/helper-numbers@1.11.6": 273 | version "1.11.6" 274 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" 275 | integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== 276 | dependencies: 277 | "@webassemblyjs/floating-point-hex-parser" "1.11.6" 278 | "@webassemblyjs/helper-api-error" "1.11.6" 279 | "@xtuc/long" "4.2.2" 280 | 281 | "@webassemblyjs/helper-wasm-bytecode@1.11.6": 282 | version "1.11.6" 283 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" 284 | integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== 285 | 286 | "@webassemblyjs/helper-wasm-section@1.12.1": 287 | version "1.12.1" 288 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz#3da623233ae1a60409b509a52ade9bc22a37f7bf" 289 | integrity sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g== 290 | dependencies: 291 | "@webassemblyjs/ast" "1.12.1" 292 | "@webassemblyjs/helper-buffer" "1.12.1" 293 | "@webassemblyjs/helper-wasm-bytecode" "1.11.6" 294 | "@webassemblyjs/wasm-gen" "1.12.1" 295 | 296 | "@webassemblyjs/ieee754@1.11.6": 297 | version "1.11.6" 298 | resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" 299 | integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== 300 | dependencies: 301 | "@xtuc/ieee754" "^1.2.0" 302 | 303 | "@webassemblyjs/leb128@1.11.6": 304 | version "1.11.6" 305 | resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" 306 | integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== 307 | dependencies: 308 | "@xtuc/long" "4.2.2" 309 | 310 | "@webassemblyjs/utf8@1.11.6": 311 | version "1.11.6" 312 | resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" 313 | integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== 314 | 315 | "@webassemblyjs/wasm-edit@^1.12.1": 316 | version "1.12.1" 317 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz#9f9f3ff52a14c980939be0ef9d5df9ebc678ae3b" 318 | integrity sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g== 319 | dependencies: 320 | "@webassemblyjs/ast" "1.12.1" 321 | "@webassemblyjs/helper-buffer" "1.12.1" 322 | "@webassemblyjs/helper-wasm-bytecode" "1.11.6" 323 | "@webassemblyjs/helper-wasm-section" "1.12.1" 324 | "@webassemblyjs/wasm-gen" "1.12.1" 325 | "@webassemblyjs/wasm-opt" "1.12.1" 326 | "@webassemblyjs/wasm-parser" "1.12.1" 327 | "@webassemblyjs/wast-printer" "1.12.1" 328 | 329 | "@webassemblyjs/wasm-gen@1.12.1": 330 | version "1.12.1" 331 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz#a6520601da1b5700448273666a71ad0a45d78547" 332 | integrity sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w== 333 | dependencies: 334 | "@webassemblyjs/ast" "1.12.1" 335 | "@webassemblyjs/helper-wasm-bytecode" "1.11.6" 336 | "@webassemblyjs/ieee754" "1.11.6" 337 | "@webassemblyjs/leb128" "1.11.6" 338 | "@webassemblyjs/utf8" "1.11.6" 339 | 340 | "@webassemblyjs/wasm-opt@1.12.1": 341 | version "1.12.1" 342 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz#9e6e81475dfcfb62dab574ac2dda38226c232bc5" 343 | integrity sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg== 344 | dependencies: 345 | "@webassemblyjs/ast" "1.12.1" 346 | "@webassemblyjs/helper-buffer" "1.12.1" 347 | "@webassemblyjs/wasm-gen" "1.12.1" 348 | "@webassemblyjs/wasm-parser" "1.12.1" 349 | 350 | "@webassemblyjs/wasm-parser@1.12.1", "@webassemblyjs/wasm-parser@^1.12.1": 351 | version "1.12.1" 352 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz#c47acb90e6f083391e3fa61d113650eea1e95937" 353 | integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ== 354 | dependencies: 355 | "@webassemblyjs/ast" "1.12.1" 356 | "@webassemblyjs/helper-api-error" "1.11.6" 357 | "@webassemblyjs/helper-wasm-bytecode" "1.11.6" 358 | "@webassemblyjs/ieee754" "1.11.6" 359 | "@webassemblyjs/leb128" "1.11.6" 360 | "@webassemblyjs/utf8" "1.11.6" 361 | 362 | "@webassemblyjs/wast-printer@1.12.1": 363 | version "1.12.1" 364 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz#bcecf661d7d1abdaf989d8341a4833e33e2b31ac" 365 | integrity sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA== 366 | dependencies: 367 | "@webassemblyjs/ast" "1.12.1" 368 | "@xtuc/long" "4.2.2" 369 | 370 | "@webpack-cli/configtest@^2.1.1": 371 | version "2.1.1" 372 | resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-2.1.1.tgz#3b2f852e91dac6e3b85fb2a314fb8bef46d94646" 373 | integrity sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw== 374 | 375 | "@webpack-cli/info@^2.0.2": 376 | version "2.0.2" 377 | resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-2.0.2.tgz#cc3fbf22efeb88ff62310cf885c5b09f44ae0fdd" 378 | integrity sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A== 379 | 380 | "@webpack-cli/serve@^2.0.5": 381 | version "2.0.5" 382 | resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.5.tgz#325db42395cd49fe6c14057f9a900e427df8810e" 383 | integrity sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ== 384 | 385 | "@xtuc/ieee754@^1.2.0": 386 | version "1.2.0" 387 | resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" 388 | integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== 389 | 390 | "@xtuc/long@4.2.2": 391 | version "4.2.2" 392 | resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" 393 | integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== 394 | 395 | acorn-import-attributes@^1.9.5: 396 | version "1.9.5" 397 | resolved "https://registry.yarnpkg.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz#7eb1557b1ba05ef18b5ed0ec67591bfab04688ef" 398 | integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== 399 | 400 | acorn-jsx@^5.3.2: 401 | version "5.3.2" 402 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" 403 | integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== 404 | 405 | acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: 406 | version "8.13.0" 407 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.13.0.tgz#2a30d670818ad16ddd6a35d3842dacec9e5d7ca3" 408 | integrity sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w== 409 | 410 | ajv-keywords@^3.5.2: 411 | version "3.5.2" 412 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" 413 | integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== 414 | 415 | ajv@^6.12.4, ajv@^6.12.5: 416 | version "6.12.6" 417 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 418 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 419 | dependencies: 420 | fast-deep-equal "^3.1.1" 421 | fast-json-stable-stringify "^2.0.0" 422 | json-schema-traverse "^0.4.1" 423 | uri-js "^4.2.2" 424 | 425 | ansi-regex@^5.0.1: 426 | version "5.0.1" 427 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 428 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 429 | 430 | ansi-styles@^4.1.0: 431 | version "4.3.0" 432 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 433 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 434 | dependencies: 435 | color-convert "^2.0.1" 436 | 437 | argparse@^2.0.1: 438 | version "2.0.1" 439 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 440 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 441 | 442 | array-union@^2.1.0: 443 | version "2.1.0" 444 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" 445 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 446 | 447 | balanced-match@^1.0.0: 448 | version "1.0.2" 449 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 450 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 451 | 452 | brace-expansion@^1.1.7: 453 | version "1.1.11" 454 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 455 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 456 | dependencies: 457 | balanced-match "^1.0.0" 458 | concat-map "0.0.1" 459 | 460 | brace-expansion@^2.0.1: 461 | version "2.0.1" 462 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" 463 | integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== 464 | dependencies: 465 | balanced-match "^1.0.0" 466 | 467 | braces@^3.0.3: 468 | version "3.0.3" 469 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" 470 | integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== 471 | dependencies: 472 | fill-range "^7.1.1" 473 | 474 | browserslist@^4.21.10: 475 | version "4.24.0" 476 | resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.0.tgz#a1325fe4bc80b64fda169629fc01b3d6cecd38d4" 477 | integrity sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A== 478 | dependencies: 479 | caniuse-lite "^1.0.30001663" 480 | electron-to-chromium "^1.5.28" 481 | node-releases "^2.0.18" 482 | update-browserslist-db "^1.1.0" 483 | 484 | buffer-from@^1.0.0: 485 | version "1.1.2" 486 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" 487 | integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== 488 | 489 | callsites@^3.0.0: 490 | version "3.1.0" 491 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 492 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 493 | 494 | caniuse-lite@^1.0.30001663: 495 | version "1.0.30001669" 496 | resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001669.tgz#fda8f1d29a8bfdc42de0c170d7f34a9cf19ed7a3" 497 | integrity sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w== 498 | 499 | chalk@^4.0.0, chalk@^4.1.0: 500 | version "4.1.2" 501 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 502 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 503 | dependencies: 504 | ansi-styles "^4.1.0" 505 | supports-color "^7.1.0" 506 | 507 | chrome-trace-event@^1.0.2: 508 | version "1.0.4" 509 | resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b" 510 | integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== 511 | 512 | clone-deep@^4.0.1: 513 | version "4.0.1" 514 | resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" 515 | integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== 516 | dependencies: 517 | is-plain-object "^2.0.4" 518 | kind-of "^6.0.2" 519 | shallow-clone "^3.0.0" 520 | 521 | color-convert@^2.0.1: 522 | version "2.0.1" 523 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 524 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 525 | dependencies: 526 | color-name "~1.1.4" 527 | 528 | color-name@~1.1.4: 529 | version "1.1.4" 530 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 531 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 532 | 533 | colorette@^2.0.14: 534 | version "2.0.20" 535 | resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" 536 | integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== 537 | 538 | commander@^10.0.1: 539 | version "10.0.1" 540 | resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" 541 | integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== 542 | 543 | commander@^2.20.0: 544 | version "2.20.3" 545 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" 546 | integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 547 | 548 | concat-map@0.0.1: 549 | version "0.0.1" 550 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 551 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 552 | 553 | cross-spawn@^7.0.2, cross-spawn@^7.0.3: 554 | version "7.0.3" 555 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 556 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 557 | dependencies: 558 | path-key "^3.1.0" 559 | shebang-command "^2.0.0" 560 | which "^2.0.1" 561 | 562 | debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: 563 | version "4.3.7" 564 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" 565 | integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== 566 | dependencies: 567 | ms "^2.1.3" 568 | 569 | deep-is@^0.1.3: 570 | version "0.1.4" 571 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" 572 | integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== 573 | 574 | dir-glob@^3.0.1: 575 | version "3.0.1" 576 | resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" 577 | integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== 578 | dependencies: 579 | path-type "^4.0.0" 580 | 581 | doctrine@^3.0.0: 582 | version "3.0.0" 583 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 584 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 585 | dependencies: 586 | esutils "^2.0.2" 587 | 588 | electron-to-chromium@^1.5.28: 589 | version "1.5.41" 590 | resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.41.tgz#eae1ba6c49a1a61d84cf8263351d3513b2bcc534" 591 | integrity sha512-dfdv/2xNjX0P8Vzme4cfzHqnPm5xsZXwsolTYr0eyW18IUmNyG08vL+fttvinTfhKfIKdRoqkDIC9e9iWQCNYQ== 592 | 593 | enhanced-resolve@^5.0.0, enhanced-resolve@^5.17.1: 594 | version "5.17.1" 595 | resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15" 596 | integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== 597 | dependencies: 598 | graceful-fs "^4.2.4" 599 | tapable "^2.2.0" 600 | 601 | envinfo@^7.7.3: 602 | version "7.14.0" 603 | resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.14.0.tgz#26dac5db54418f2a4c1159153a0b2ae980838aae" 604 | integrity sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg== 605 | 606 | es-module-lexer@^1.2.1: 607 | version "1.5.4" 608 | resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.4.tgz#a8efec3a3da991e60efa6b633a7cad6ab8d26b78" 609 | integrity sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw== 610 | 611 | escalade@^3.2.0: 612 | version "3.2.0" 613 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" 614 | integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== 615 | 616 | escape-string-regexp@^4.0.0: 617 | version "4.0.0" 618 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 619 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 620 | 621 | eslint-scope@5.1.1: 622 | version "5.1.1" 623 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" 624 | integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== 625 | dependencies: 626 | esrecurse "^4.3.0" 627 | estraverse "^4.1.1" 628 | 629 | eslint-scope@^7.2.2: 630 | version "7.2.2" 631 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" 632 | integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== 633 | dependencies: 634 | esrecurse "^4.3.0" 635 | estraverse "^5.2.0" 636 | 637 | eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: 638 | version "3.4.3" 639 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" 640 | integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== 641 | 642 | eslint@^8.54.0: 643 | version "8.57.1" 644 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" 645 | integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== 646 | dependencies: 647 | "@eslint-community/eslint-utils" "^4.2.0" 648 | "@eslint-community/regexpp" "^4.6.1" 649 | "@eslint/eslintrc" "^2.1.4" 650 | "@eslint/js" "8.57.1" 651 | "@humanwhocodes/config-array" "^0.13.0" 652 | "@humanwhocodes/module-importer" "^1.0.1" 653 | "@nodelib/fs.walk" "^1.2.8" 654 | "@ungap/structured-clone" "^1.2.0" 655 | ajv "^6.12.4" 656 | chalk "^4.0.0" 657 | cross-spawn "^7.0.2" 658 | debug "^4.3.2" 659 | doctrine "^3.0.0" 660 | escape-string-regexp "^4.0.0" 661 | eslint-scope "^7.2.2" 662 | eslint-visitor-keys "^3.4.3" 663 | espree "^9.6.1" 664 | esquery "^1.4.2" 665 | esutils "^2.0.2" 666 | fast-deep-equal "^3.1.3" 667 | file-entry-cache "^6.0.1" 668 | find-up "^5.0.0" 669 | glob-parent "^6.0.2" 670 | globals "^13.19.0" 671 | graphemer "^1.4.0" 672 | ignore "^5.2.0" 673 | imurmurhash "^0.1.4" 674 | is-glob "^4.0.0" 675 | is-path-inside "^3.0.3" 676 | js-yaml "^4.1.0" 677 | json-stable-stringify-without-jsonify "^1.0.1" 678 | levn "^0.4.1" 679 | lodash.merge "^4.6.2" 680 | minimatch "^3.1.2" 681 | natural-compare "^1.4.0" 682 | optionator "^0.9.3" 683 | strip-ansi "^6.0.1" 684 | text-table "^0.2.0" 685 | 686 | espree@^9.6.0, espree@^9.6.1: 687 | version "9.6.1" 688 | resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" 689 | integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== 690 | dependencies: 691 | acorn "^8.9.0" 692 | acorn-jsx "^5.3.2" 693 | eslint-visitor-keys "^3.4.1" 694 | 695 | esquery@^1.4.2: 696 | version "1.6.0" 697 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" 698 | integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== 699 | dependencies: 700 | estraverse "^5.1.0" 701 | 702 | esrecurse@^4.3.0: 703 | version "4.3.0" 704 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 705 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 706 | dependencies: 707 | estraverse "^5.2.0" 708 | 709 | estraverse@^4.1.1: 710 | version "4.3.0" 711 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" 712 | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== 713 | 714 | estraverse@^5.1.0, estraverse@^5.2.0: 715 | version "5.3.0" 716 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" 717 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== 718 | 719 | esutils@^2.0.2: 720 | version "2.0.3" 721 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 722 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 723 | 724 | events@^3.2.0: 725 | version "3.3.0" 726 | resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" 727 | integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== 728 | 729 | fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 730 | version "3.1.3" 731 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 732 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 733 | 734 | fast-glob@^3.2.9: 735 | version "3.3.2" 736 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" 737 | integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== 738 | dependencies: 739 | "@nodelib/fs.stat" "^2.0.2" 740 | "@nodelib/fs.walk" "^1.2.3" 741 | glob-parent "^5.1.2" 742 | merge2 "^1.3.0" 743 | micromatch "^4.0.4" 744 | 745 | fast-json-stable-stringify@^2.0.0: 746 | version "2.1.0" 747 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 748 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 749 | 750 | fast-levenshtein@^2.0.6: 751 | version "2.0.6" 752 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 753 | integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== 754 | 755 | fastest-levenshtein@^1.0.12: 756 | version "1.0.16" 757 | resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" 758 | integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== 759 | 760 | fastq@^1.6.0: 761 | version "1.17.1" 762 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" 763 | integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== 764 | dependencies: 765 | reusify "^1.0.4" 766 | 767 | file-entry-cache@^6.0.1: 768 | version "6.0.1" 769 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" 770 | integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== 771 | dependencies: 772 | flat-cache "^3.0.4" 773 | 774 | fill-range@^7.1.1: 775 | version "7.1.1" 776 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" 777 | integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== 778 | dependencies: 779 | to-regex-range "^5.0.1" 780 | 781 | find-up@^4.0.0: 782 | version "4.1.0" 783 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" 784 | integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== 785 | dependencies: 786 | locate-path "^5.0.0" 787 | path-exists "^4.0.0" 788 | 789 | find-up@^5.0.0: 790 | version "5.0.0" 791 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 792 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 793 | dependencies: 794 | locate-path "^6.0.0" 795 | path-exists "^4.0.0" 796 | 797 | flat-cache@^3.0.4: 798 | version "3.2.0" 799 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" 800 | integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== 801 | dependencies: 802 | flatted "^3.2.9" 803 | keyv "^4.5.3" 804 | rimraf "^3.0.2" 805 | 806 | flat@^5.0.2: 807 | version "5.0.2" 808 | resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" 809 | integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== 810 | 811 | flatted@^3.2.9: 812 | version "3.3.1" 813 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" 814 | integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== 815 | 816 | fs.realpath@^1.0.0: 817 | version "1.0.0" 818 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 819 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 820 | 821 | function-bind@^1.1.2: 822 | version "1.1.2" 823 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" 824 | integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== 825 | 826 | glob-parent@^5.1.2: 827 | version "5.1.2" 828 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 829 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 830 | dependencies: 831 | is-glob "^4.0.1" 832 | 833 | glob-parent@^6.0.2: 834 | version "6.0.2" 835 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" 836 | integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== 837 | dependencies: 838 | is-glob "^4.0.3" 839 | 840 | glob-to-regexp@^0.4.1: 841 | version "0.4.1" 842 | resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" 843 | integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== 844 | 845 | glob@^7.1.3: 846 | version "7.2.3" 847 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" 848 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 849 | dependencies: 850 | fs.realpath "^1.0.0" 851 | inflight "^1.0.4" 852 | inherits "2" 853 | minimatch "^3.1.1" 854 | once "^1.3.0" 855 | path-is-absolute "^1.0.0" 856 | 857 | globals@^13.19.0: 858 | version "13.24.0" 859 | resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" 860 | integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== 861 | dependencies: 862 | type-fest "^0.20.2" 863 | 864 | globby@^11.1.0: 865 | version "11.1.0" 866 | resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" 867 | integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== 868 | dependencies: 869 | array-union "^2.1.0" 870 | dir-glob "^3.0.1" 871 | fast-glob "^3.2.9" 872 | ignore "^5.2.0" 873 | merge2 "^1.4.1" 874 | slash "^3.0.0" 875 | 876 | graceful-fs@^4.1.2, graceful-fs@^4.2.11, graceful-fs@^4.2.4: 877 | version "4.2.11" 878 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" 879 | integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== 880 | 881 | graphemer@^1.4.0: 882 | version "1.4.0" 883 | resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" 884 | integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== 885 | 886 | has-flag@^4.0.0: 887 | version "4.0.0" 888 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 889 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 890 | 891 | hasown@^2.0.2: 892 | version "2.0.2" 893 | resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" 894 | integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== 895 | dependencies: 896 | function-bind "^1.1.2" 897 | 898 | ignore@^5.2.0, ignore@^5.2.4: 899 | version "5.3.2" 900 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" 901 | integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== 902 | 903 | import-fresh@^3.2.1: 904 | version "3.3.0" 905 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" 906 | integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== 907 | dependencies: 908 | parent-module "^1.0.0" 909 | resolve-from "^4.0.0" 910 | 911 | import-local@^3.0.2: 912 | version "3.2.0" 913 | resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" 914 | integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== 915 | dependencies: 916 | pkg-dir "^4.2.0" 917 | resolve-cwd "^3.0.0" 918 | 919 | imurmurhash@^0.1.4: 920 | version "0.1.4" 921 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 922 | integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== 923 | 924 | inflight@^1.0.4: 925 | version "1.0.6" 926 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 927 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 928 | dependencies: 929 | once "^1.3.0" 930 | wrappy "1" 931 | 932 | inherits@2: 933 | version "2.0.4" 934 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 935 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 936 | 937 | interpret@^3.1.1: 938 | version "3.1.1" 939 | resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" 940 | integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== 941 | 942 | is-core-module@^2.13.0: 943 | version "2.15.1" 944 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" 945 | integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== 946 | dependencies: 947 | hasown "^2.0.2" 948 | 949 | is-extglob@^2.1.1: 950 | version "2.1.1" 951 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 952 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 953 | 954 | is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: 955 | version "4.0.3" 956 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 957 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 958 | dependencies: 959 | is-extglob "^2.1.1" 960 | 961 | is-number@^7.0.0: 962 | version "7.0.0" 963 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 964 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 965 | 966 | is-path-inside@^3.0.3: 967 | version "3.0.3" 968 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" 969 | integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== 970 | 971 | is-plain-object@^2.0.4: 972 | version "2.0.4" 973 | resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" 974 | integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== 975 | dependencies: 976 | isobject "^3.0.1" 977 | 978 | isexe@^2.0.0: 979 | version "2.0.0" 980 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 981 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 982 | 983 | isobject@^3.0.1: 984 | version "3.0.1" 985 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" 986 | integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== 987 | 988 | jest-worker@^27.4.5: 989 | version "27.5.1" 990 | resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" 991 | integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== 992 | dependencies: 993 | "@types/node" "*" 994 | merge-stream "^2.0.0" 995 | supports-color "^8.0.0" 996 | 997 | js-yaml@^4.1.0: 998 | version "4.1.0" 999 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 1000 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 1001 | dependencies: 1002 | argparse "^2.0.1" 1003 | 1004 | json-buffer@3.0.1: 1005 | version "3.0.1" 1006 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" 1007 | integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== 1008 | 1009 | json-parse-even-better-errors@^2.3.1: 1010 | version "2.3.1" 1011 | resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" 1012 | integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== 1013 | 1014 | json-schema-traverse@^0.4.1: 1015 | version "0.4.1" 1016 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 1017 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 1018 | 1019 | json-stable-stringify-without-jsonify@^1.0.1: 1020 | version "1.0.1" 1021 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 1022 | integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== 1023 | 1024 | keyv@^4.5.3: 1025 | version "4.5.4" 1026 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" 1027 | integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== 1028 | dependencies: 1029 | json-buffer "3.0.1" 1030 | 1031 | kind-of@^6.0.2: 1032 | version "6.0.3" 1033 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" 1034 | integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== 1035 | 1036 | levn@^0.4.1: 1037 | version "0.4.1" 1038 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" 1039 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== 1040 | dependencies: 1041 | prelude-ls "^1.2.1" 1042 | type-check "~0.4.0" 1043 | 1044 | loader-runner@^4.2.0: 1045 | version "4.3.0" 1046 | resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" 1047 | integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== 1048 | 1049 | locate-path@^5.0.0: 1050 | version "5.0.0" 1051 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" 1052 | integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== 1053 | dependencies: 1054 | p-locate "^4.1.0" 1055 | 1056 | locate-path@^6.0.0: 1057 | version "6.0.0" 1058 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 1059 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 1060 | dependencies: 1061 | p-locate "^5.0.0" 1062 | 1063 | lodash.merge@^4.6.2: 1064 | version "4.6.2" 1065 | resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" 1066 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== 1067 | 1068 | merge-stream@^2.0.0: 1069 | version "2.0.0" 1070 | resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" 1071 | integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== 1072 | 1073 | merge2@^1.3.0, merge2@^1.4.1: 1074 | version "1.4.1" 1075 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 1076 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 1077 | 1078 | micromatch@^4.0.0, micromatch@^4.0.4: 1079 | version "4.0.8" 1080 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" 1081 | integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== 1082 | dependencies: 1083 | braces "^3.0.3" 1084 | picomatch "^2.3.1" 1085 | 1086 | mime-db@1.52.0: 1087 | version "1.52.0" 1088 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 1089 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 1090 | 1091 | mime-types@^2.1.27: 1092 | version "2.1.35" 1093 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 1094 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 1095 | dependencies: 1096 | mime-db "1.52.0" 1097 | 1098 | minimatch@9.0.3: 1099 | version "9.0.3" 1100 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" 1101 | integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== 1102 | dependencies: 1103 | brace-expansion "^2.0.1" 1104 | 1105 | minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: 1106 | version "3.1.2" 1107 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 1108 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 1109 | dependencies: 1110 | brace-expansion "^1.1.7" 1111 | 1112 | ms@^2.1.3: 1113 | version "2.1.3" 1114 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 1115 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 1116 | 1117 | natural-compare@^1.4.0: 1118 | version "1.4.0" 1119 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1120 | integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== 1121 | 1122 | neo-async@^2.6.2: 1123 | version "2.6.2" 1124 | resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" 1125 | integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== 1126 | 1127 | node-releases@^2.0.18: 1128 | version "2.0.18" 1129 | resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" 1130 | integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== 1131 | 1132 | once@^1.3.0: 1133 | version "1.4.0" 1134 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1135 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 1136 | dependencies: 1137 | wrappy "1" 1138 | 1139 | optionator@^0.9.3: 1140 | version "0.9.4" 1141 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" 1142 | integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== 1143 | dependencies: 1144 | deep-is "^0.1.3" 1145 | fast-levenshtein "^2.0.6" 1146 | levn "^0.4.1" 1147 | prelude-ls "^1.2.1" 1148 | type-check "^0.4.0" 1149 | word-wrap "^1.2.5" 1150 | 1151 | p-limit@^2.2.0: 1152 | version "2.3.0" 1153 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 1154 | integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== 1155 | dependencies: 1156 | p-try "^2.0.0" 1157 | 1158 | p-limit@^3.0.2: 1159 | version "3.1.0" 1160 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 1161 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 1162 | dependencies: 1163 | yocto-queue "^0.1.0" 1164 | 1165 | p-locate@^4.1.0: 1166 | version "4.1.0" 1167 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" 1168 | integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== 1169 | dependencies: 1170 | p-limit "^2.2.0" 1171 | 1172 | p-locate@^5.0.0: 1173 | version "5.0.0" 1174 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 1175 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 1176 | dependencies: 1177 | p-limit "^3.0.2" 1178 | 1179 | p-try@^2.0.0: 1180 | version "2.2.0" 1181 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 1182 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 1183 | 1184 | parent-module@^1.0.0: 1185 | version "1.0.1" 1186 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 1187 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 1188 | dependencies: 1189 | callsites "^3.0.0" 1190 | 1191 | path-exists@^4.0.0: 1192 | version "4.0.0" 1193 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1194 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1195 | 1196 | path-is-absolute@^1.0.0: 1197 | version "1.0.1" 1198 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1199 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 1200 | 1201 | path-key@^3.1.0: 1202 | version "3.1.1" 1203 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1204 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1205 | 1206 | path-parse@^1.0.7: 1207 | version "1.0.7" 1208 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 1209 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 1210 | 1211 | path-type@^4.0.0: 1212 | version "4.0.0" 1213 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" 1214 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== 1215 | 1216 | picocolors@^1.1.0: 1217 | version "1.1.1" 1218 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" 1219 | integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== 1220 | 1221 | picomatch@^2.3.1: 1222 | version "2.3.1" 1223 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 1224 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1225 | 1226 | pkg-dir@^4.2.0: 1227 | version "4.2.0" 1228 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" 1229 | integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== 1230 | dependencies: 1231 | find-up "^4.0.0" 1232 | 1233 | prelude-ls@^1.2.1: 1234 | version "1.2.1" 1235 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" 1236 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== 1237 | 1238 | punycode@^2.1.0: 1239 | version "2.3.1" 1240 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" 1241 | integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== 1242 | 1243 | queue-microtask@^1.2.2: 1244 | version "1.2.3" 1245 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 1246 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 1247 | 1248 | randombytes@^2.1.0: 1249 | version "2.1.0" 1250 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 1251 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 1252 | dependencies: 1253 | safe-buffer "^5.1.0" 1254 | 1255 | rechoir@^0.8.0: 1256 | version "0.8.0" 1257 | resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" 1258 | integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== 1259 | dependencies: 1260 | resolve "^1.20.0" 1261 | 1262 | resolve-cwd@^3.0.0: 1263 | version "3.0.0" 1264 | resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" 1265 | integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== 1266 | dependencies: 1267 | resolve-from "^5.0.0" 1268 | 1269 | resolve-from@^4.0.0: 1270 | version "4.0.0" 1271 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 1272 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1273 | 1274 | resolve-from@^5.0.0: 1275 | version "5.0.0" 1276 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" 1277 | integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== 1278 | 1279 | resolve@^1.20.0: 1280 | version "1.22.8" 1281 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" 1282 | integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== 1283 | dependencies: 1284 | is-core-module "^2.13.0" 1285 | path-parse "^1.0.7" 1286 | supports-preserve-symlinks-flag "^1.0.0" 1287 | 1288 | reusify@^1.0.4: 1289 | version "1.0.4" 1290 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 1291 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 1292 | 1293 | rimraf@^3.0.2: 1294 | version "3.0.2" 1295 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 1296 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 1297 | dependencies: 1298 | glob "^7.1.3" 1299 | 1300 | run-parallel@^1.1.9: 1301 | version "1.2.0" 1302 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 1303 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 1304 | dependencies: 1305 | queue-microtask "^1.2.2" 1306 | 1307 | safe-buffer@^5.1.0: 1308 | version "5.2.1" 1309 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1310 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1311 | 1312 | schema-utils@^3.1.1, schema-utils@^3.2.0: 1313 | version "3.3.0" 1314 | resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" 1315 | integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== 1316 | dependencies: 1317 | "@types/json-schema" "^7.0.8" 1318 | ajv "^6.12.5" 1319 | ajv-keywords "^3.5.2" 1320 | 1321 | semver@^7.3.4, semver@^7.5.4: 1322 | version "7.6.3" 1323 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" 1324 | integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== 1325 | 1326 | serialize-javascript@^6.0.1: 1327 | version "6.0.2" 1328 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" 1329 | integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== 1330 | dependencies: 1331 | randombytes "^2.1.0" 1332 | 1333 | shallow-clone@^3.0.0: 1334 | version "3.0.1" 1335 | resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" 1336 | integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== 1337 | dependencies: 1338 | kind-of "^6.0.2" 1339 | 1340 | shebang-command@^2.0.0: 1341 | version "2.0.0" 1342 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1343 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1344 | dependencies: 1345 | shebang-regex "^3.0.0" 1346 | 1347 | shebang-regex@^3.0.0: 1348 | version "3.0.0" 1349 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1350 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1351 | 1352 | slash@^3.0.0: 1353 | version "3.0.0" 1354 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 1355 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 1356 | 1357 | source-map-support@~0.5.20: 1358 | version "0.5.21" 1359 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" 1360 | integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== 1361 | dependencies: 1362 | buffer-from "^1.0.0" 1363 | source-map "^0.6.0" 1364 | 1365 | source-map@^0.6.0: 1366 | version "0.6.1" 1367 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1368 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 1369 | 1370 | source-map@^0.7.4: 1371 | version "0.7.4" 1372 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" 1373 | integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== 1374 | 1375 | strip-ansi@^6.0.1: 1376 | version "6.0.1" 1377 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 1378 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1379 | dependencies: 1380 | ansi-regex "^5.0.1" 1381 | 1382 | strip-json-comments@^3.1.1: 1383 | version "3.1.1" 1384 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 1385 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 1386 | 1387 | supports-color@^7.1.0: 1388 | version "7.2.0" 1389 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1390 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1391 | dependencies: 1392 | has-flag "^4.0.0" 1393 | 1394 | supports-color@^8.0.0: 1395 | version "8.1.1" 1396 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" 1397 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== 1398 | dependencies: 1399 | has-flag "^4.0.0" 1400 | 1401 | supports-preserve-symlinks-flag@^1.0.0: 1402 | version "1.0.0" 1403 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 1404 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 1405 | 1406 | tapable@^2.1.1, tapable@^2.2.0: 1407 | version "2.2.1" 1408 | resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" 1409 | integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== 1410 | 1411 | terser-webpack-plugin@^5.3.10: 1412 | version "5.3.10" 1413 | resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" 1414 | integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== 1415 | dependencies: 1416 | "@jridgewell/trace-mapping" "^0.3.20" 1417 | jest-worker "^27.4.5" 1418 | schema-utils "^3.1.1" 1419 | serialize-javascript "^6.0.1" 1420 | terser "^5.26.0" 1421 | 1422 | terser@^5.26.0: 1423 | version "5.36.0" 1424 | resolved "https://registry.yarnpkg.com/terser/-/terser-5.36.0.tgz#8b0dbed459ac40ff7b4c9fd5a3a2029de105180e" 1425 | integrity sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w== 1426 | dependencies: 1427 | "@jridgewell/source-map" "^0.3.3" 1428 | acorn "^8.8.2" 1429 | commander "^2.20.0" 1430 | source-map-support "~0.5.20" 1431 | 1432 | text-table@^0.2.0: 1433 | version "0.2.0" 1434 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1435 | integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== 1436 | 1437 | to-regex-range@^5.0.1: 1438 | version "5.0.1" 1439 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1440 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1441 | dependencies: 1442 | is-number "^7.0.0" 1443 | 1444 | ts-api-utils@^1.0.1: 1445 | version "1.3.0" 1446 | resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" 1447 | integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== 1448 | 1449 | ts-loader@^9.5.1: 1450 | version "9.5.1" 1451 | resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.5.1.tgz#63d5912a86312f1fbe32cef0859fb8b2193d9b89" 1452 | integrity sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg== 1453 | dependencies: 1454 | chalk "^4.1.0" 1455 | enhanced-resolve "^5.0.0" 1456 | micromatch "^4.0.0" 1457 | semver "^7.3.4" 1458 | source-map "^0.7.4" 1459 | 1460 | type-check@^0.4.0, type-check@~0.4.0: 1461 | version "0.4.0" 1462 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" 1463 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== 1464 | dependencies: 1465 | prelude-ls "^1.2.1" 1466 | 1467 | type-fest@^0.20.2: 1468 | version "0.20.2" 1469 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" 1470 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== 1471 | 1472 | typescript@^5.3.2, typescript@^5.6.3: 1473 | version "5.6.3" 1474 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" 1475 | integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== 1476 | 1477 | undici-types@~6.19.2: 1478 | version "6.19.8" 1479 | resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" 1480 | integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== 1481 | 1482 | update-browserslist-db@^1.1.0: 1483 | version "1.1.1" 1484 | resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5" 1485 | integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== 1486 | dependencies: 1487 | escalade "^3.2.0" 1488 | picocolors "^1.1.0" 1489 | 1490 | uri-js@^4.2.2: 1491 | version "4.4.1" 1492 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 1493 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 1494 | dependencies: 1495 | punycode "^2.1.0" 1496 | 1497 | watchpack@^2.4.1: 1498 | version "2.4.2" 1499 | resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.2.tgz#2feeaed67412e7c33184e5a79ca738fbd38564da" 1500 | integrity sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw== 1501 | dependencies: 1502 | glob-to-regexp "^0.4.1" 1503 | graceful-fs "^4.1.2" 1504 | 1505 | webpack-cli@^5.1.4: 1506 | version "5.1.4" 1507 | resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-5.1.4.tgz#c8e046ba7eaae4911d7e71e2b25b776fcc35759b" 1508 | integrity sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg== 1509 | dependencies: 1510 | "@discoveryjs/json-ext" "^0.5.0" 1511 | "@webpack-cli/configtest" "^2.1.1" 1512 | "@webpack-cli/info" "^2.0.2" 1513 | "@webpack-cli/serve" "^2.0.5" 1514 | colorette "^2.0.14" 1515 | commander "^10.0.1" 1516 | cross-spawn "^7.0.3" 1517 | envinfo "^7.7.3" 1518 | fastest-levenshtein "^1.0.12" 1519 | import-local "^3.0.2" 1520 | interpret "^3.1.1" 1521 | rechoir "^0.8.0" 1522 | webpack-merge "^5.7.3" 1523 | 1524 | webpack-merge@^5.7.3: 1525 | version "5.10.0" 1526 | resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177" 1527 | integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA== 1528 | dependencies: 1529 | clone-deep "^4.0.1" 1530 | flat "^5.0.2" 1531 | wildcard "^2.0.0" 1532 | 1533 | webpack-sources@^3.2.3: 1534 | version "3.2.3" 1535 | resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" 1536 | integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== 1537 | 1538 | webpack@^5.95.0: 1539 | version "5.95.0" 1540 | resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.95.0.tgz#8fd8c454fa60dad186fbe36c400a55848307b4c0" 1541 | integrity sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q== 1542 | dependencies: 1543 | "@types/estree" "^1.0.5" 1544 | "@webassemblyjs/ast" "^1.12.1" 1545 | "@webassemblyjs/wasm-edit" "^1.12.1" 1546 | "@webassemblyjs/wasm-parser" "^1.12.1" 1547 | acorn "^8.7.1" 1548 | acorn-import-attributes "^1.9.5" 1549 | browserslist "^4.21.10" 1550 | chrome-trace-event "^1.0.2" 1551 | enhanced-resolve "^5.17.1" 1552 | es-module-lexer "^1.2.1" 1553 | eslint-scope "5.1.1" 1554 | events "^3.2.0" 1555 | glob-to-regexp "^0.4.1" 1556 | graceful-fs "^4.2.11" 1557 | json-parse-even-better-errors "^2.3.1" 1558 | loader-runner "^4.2.0" 1559 | mime-types "^2.1.27" 1560 | neo-async "^2.6.2" 1561 | schema-utils "^3.2.0" 1562 | tapable "^2.1.1" 1563 | terser-webpack-plugin "^5.3.10" 1564 | watchpack "^2.4.1" 1565 | webpack-sources "^3.2.3" 1566 | 1567 | which@^2.0.1: 1568 | version "2.0.2" 1569 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 1570 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1571 | dependencies: 1572 | isexe "^2.0.0" 1573 | 1574 | wildcard@^2.0.0: 1575 | version "2.0.1" 1576 | resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" 1577 | integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== 1578 | 1579 | word-wrap@^1.2.5: 1580 | version "1.2.5" 1581 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" 1582 | integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== 1583 | 1584 | wrappy@1: 1585 | version "1.0.2" 1586 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1587 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 1588 | 1589 | yocto-queue@^0.1.0: 1590 | version "0.1.0" 1591 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 1592 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 1593 | --------------------------------------------------------------------------------