likec4 1.48.0 → 1.49.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/README.md +11 -1
  2. package/__app__/src/likec4.js +5595 -4127
  3. package/__app__/src/routes/index.js +3 -153
  4. package/__app__/src/routes/projects.js +21 -1087
  5. package/__app__/src/routes/single.js +1221 -16
  6. package/__app__/src/style.css +1 -1
  7. package/__app__/src/vendors.js +3507 -894
  8. package/__app__/src/webcomponent.js +1 -1
  9. package/config/schema.json +155 -143
  10. package/dist/THIRD-PARTY-LICENSES.md +1739 -0
  11. package/dist/_chunks/GraphvizBinaryAdapter.mjs +72 -0
  12. package/dist/_chunks/filenames.mjs +14 -0
  13. package/dist/_chunks/index.d.mts +224 -129
  14. package/dist/_chunks/index2.d.mts +2033 -1908
  15. package/dist/_chunks/libs/@chevrotain/gast.mjs +1 -3969
  16. package/dist/_chunks/libs/@chevrotain/regexp-to-ast.mjs +9 -785
  17. package/dist/_chunks/libs/@chevrotain/utils.mjs +1 -37
  18. package/dist/_chunks/libs/@hono/mcp.mjs +34 -0
  19. package/dist/_chunks/libs/@hono/node-server.mjs +1 -436
  20. package/dist/_chunks/libs/@logtape/logtape.d.mts +741 -0
  21. package/dist/_chunks/libs/@logtape/logtape.mjs +6 -1354
  22. package/dist/_chunks/libs/@lume/kiwi.mjs +1 -1355
  23. package/dist/_chunks/libs/@modelcontextprotocol/sdk.d.mts +14 -14
  24. package/dist/_chunks/libs/@modelcontextprotocol/sdk.mjs +12 -25105
  25. package/dist/_chunks/libs/@msgpack/msgpack.mjs +1 -1503
  26. package/dist/_chunks/libs/@nanostores/react.mjs +1 -30
  27. package/dist/_chunks/libs/@smithy/util-base64.mjs +1 -100
  28. package/dist/_chunks/libs/ajv.mjs +1 -777
  29. package/dist/_chunks/libs/atomically.mjs +1 -362
  30. package/dist/_chunks/libs/birpc.mjs +1 -201
  31. package/dist/_chunks/libs/chevrotain-allstar.mjs +2 -850
  32. package/dist/_chunks/libs/chevrotain.mjs +55 -6229
  33. package/dist/_chunks/libs/conf.mjs +1 -2258
  34. package/dist/_chunks/libs/defu.mjs +1 -42
  35. package/dist/_chunks/libs/esm-env.mjs +1 -5
  36. package/dist/_chunks/libs/eventemitter3.mjs +1 -243
  37. package/dist/_chunks/libs/fast-equals.mjs +1 -446
  38. package/dist/_chunks/libs/find-up-simple.mjs +1 -24
  39. package/dist/_chunks/libs/get-port.mjs +1 -107
  40. package/dist/_chunks/libs/is-docker.mjs +1 -26
  41. package/dist/_chunks/libs/is-error-instance.mjs +1 -26
  42. package/dist/_chunks/libs/is-inside-container.mjs +1 -20
  43. package/dist/_chunks/libs/is-plain-obj.mjs +1 -9
  44. package/dist/_chunks/libs/isexe.mjs +1 -127
  45. package/dist/_chunks/libs/json5.mjs +14 -959
  46. package/dist/_chunks/libs/khroma.mjs +1 -605
  47. package/dist/_chunks/libs/ky.mjs +2 -807
  48. package/dist/_chunks/libs/langium.d.mts +2880 -2844
  49. package/dist/_chunks/libs/langium.mjs +32 -20351
  50. package/dist/_chunks/libs/merge-error-cause.mjs +2 -746
  51. package/dist/_chunks/libs/nanostores.mjs +1 -198
  52. package/dist/_chunks/libs/p-limit.mjs +1 -120
  53. package/dist/_chunks/libs/p-queue.mjs +1 -449
  54. package/dist/_chunks/libs/package-manager-detector.mjs +1 -559
  55. package/dist/_chunks/libs/package-up.mjs +1 -10
  56. package/dist/_chunks/libs/parse-ms.mjs +1 -36
  57. package/dist/_chunks/libs/pathe.mjs +1 -0
  58. package/dist/_chunks/libs/picomatch.mjs +1 -1673
  59. package/dist/_chunks/libs/pretty-ms.mjs +1 -80
  60. package/dist/_chunks/libs/remeda.mjs +1 -690
  61. package/dist/_chunks/libs/safe-stringify.mjs +1 -21
  62. package/dist/_chunks/libs/strip-indent.mjs +1 -15
  63. package/dist/_chunks/libs/tinyrainbow.mjs +1 -88
  64. package/dist/_chunks/libs/ts-graphviz.mjs +4 -725
  65. package/dist/_chunks/libs/ufo.mjs +1 -240
  66. package/dist/_chunks/libs/which.mjs +1 -84
  67. package/dist/_chunks/libs/word-wrap.mjs +12 -43
  68. package/dist/_chunks/node.mjs +481 -0
  69. package/dist/_chunks/plugin.mjs +98 -772
  70. package/dist/_chunks/rolldown-runtime.mjs +1 -48
  71. package/dist/_chunks/sequence-view.mjs +1 -575
  72. package/dist/cli/index.mjs +127 -1846
  73. package/dist/config/index.d.mts +2 -2
  74. package/dist/config/index.mjs +1 -6
  75. package/dist/index.d.mts +148 -7
  76. package/dist/index.mjs +1 -21
  77. package/dist/model/builder.mjs +1 -3
  78. package/dist/model/index.d.mts +57 -3
  79. package/dist/model/index.mjs +1 -5
  80. package/dist/vite-plugin/index.d.mts +4 -3
  81. package/dist/vite-plugin/index.mjs +1 -22
  82. package/dist/vite-plugin/internal.d.mts +5 -5
  83. package/dist/vite-plugin/internal.mjs +1 -68
  84. package/package.json +60 -41
  85. package/react/{index.d.ts → index.d.mts} +112 -70
  86. package/react/{index.js → index.mjs} +21361 -22064
  87. package/react/package.json +2 -5
  88. package/vite-plugin-modules.d.ts +5 -5
  89. package/dist/_chunks/LikeC4.d.mts +0 -121
  90. package/dist/_chunks/LikeC4.mjs +0 -202
  91. package/dist/_chunks/config-app.prod.d.mts +0 -18
  92. package/dist/_chunks/config-app.prod.mjs +0 -188
  93. package/dist/_chunks/config-webcomponent.prod.mjs +0 -71
  94. package/dist/_chunks/define-config.mjs +0 -409
  95. package/dist/_chunks/index3.d.mts +0 -60
  96. package/dist/_chunks/index4.d.mts +0 -1
  97. package/dist/_chunks/libs/@smithy/is-array-buffer.mjs +0 -10
  98. package/dist/_chunks/libs/hono.mjs +0 -1829
  99. package/dist/_chunks/libs/nanoid.mjs +0 -29
  100. package/dist/_chunks/model.mjs +0 -12
  101. package/dist/_chunks/module.d.mts +0 -71
  102. package/dist/_chunks/module.mjs +0 -18657
  103. package/dist/_chunks/vite-build.mjs +0 -69
  104. package/dist/_chunks/vite-dev.mjs +0 -79
  105. package/dist/_chunks/vite-preview.mjs +0 -27
  106. package/dist/language/module.d.mts +0 -5
  107. package/dist/language/module.mjs +0 -20
  108. package/dist/vite/vite-build.d.mts +0 -26
  109. package/dist/vite/vite-build.mjs +0 -27
  110. package/dist/vite/vite-dev.d.mts +0 -34
  111. package/dist/vite/vite-dev.mjs +0 -29
  112. package/dist/vite/vite-preview.d.mts +0 -20
  113. package/dist/vite/vite-preview.mjs +0 -26
@@ -0,0 +1,72 @@
1
+ import{s as __toESM}from"./rolldown-runtime.mjs";import{$ as t$15,A as e$3,B as t$13,C as e$9,D as e$1,E as e$5,G as r$1,J as t$4,K as n$2,L as t$11,M as e$11,N as t$6,O as e$8,P as e$2,Q as t$16,R as n$6,S as e$4,T as e$6,U as n$4,V as t$7,W as t$26,X as t$3,Y as r,Z as t$8,_ as t$20,a as n$3,b as t$5,c as t$22,et as t$18,f as t$1,g as n,h as t$23,i as t$14,j as e$12,k as e$7,l as e,m as e$13,n as n$5,o as t$9,p as t$19,q as t$2,r as n$1,s as t$10,t as t$12,tt as t$17,u as t$24,v as t$25,w as e$10,x as t$21,y as t,z as t$27}from"./libs/remeda.mjs";import{i as getLogger,n as getConsoleSink$1,r as getAnsiColorFormatter$1,t as configureSync}from"./libs/@logtape/logtape.mjs";import{n as wrapErrorMessage,t as mergeErrorCause}from"./libs/merge-error-cause.mjs";import{t as safeStringify}from"./libs/safe-stringify.mjs";import{t as defu}from"./libs/defu.mjs";import{n as extname$1}from"./libs/pathe.mjs";import{t as u}from"./libs/tinyrainbow.mjs";import{t as lib}from"./libs/json5.mjs";import{J as v4_default}from"./libs/@hono/mcp.mjs";import{a as LikeC4ProjectConfigOps,c as validateProjectConfig,n as isLikeC4JsonConfig,r as isLikeC4NonJsonConfig,s as LikeC4ProjectJsonConfigSchema,t as isLikeC4Config}from"./filenames.mjs";import{$ as TextEdit$1,A as EMPTY_SCOPE,B as URI,C as DefaultIndexManager,D as DefaultScopeProvider,E as DefaultDocumentValidator,F as DefaultNameProvider,G as CompletionItemKind,H as isOperationCancelled,I as isNamed,J as Position,K as DiagnosticSeverity$1,L as DefaultLangiumDocuments,M as StreamScope,N as DefaultScopeComputation,O as SimpleCache,P as MultiMap$1,Q as SymbolKind,R as DocumentState,S as DefaultWorkspaceManager,T as DefaultAstNodeDescriptionProvider,U as DefaultValueConverter,V as interruptAndCheck,W as ValueConverter,X as SemanticTokenModifiers,Y as Range,Z as SemanticTokenTypes,_ as require_main$2,_t as isAstNode,at as ast_utils_exports,b as inject,c as createDefaultModule,ct as hasContainerOfType,d as AbstractSemanticTokenProvider,dt as isKeyword,et as init_main,f as AstNodeHoverProvider,ft as isRuleCall,g as require_main$1,gt as AbstractAstReflection,h as require_main,ht as stream,it as grammar_utils_exports,j as MapScope,k as WorkspaceCache,l as createDefaultSharedModule,lt as streamAllContents$1,m as DefaultCompletionProvider,mt as EMPTY_STREAM,nt as findNodeForProperty$1,o as AbstractFormatter,ot as getContainerOfType,p as DefaultDocumentHighlightProvider,pt as findCommentNode,q as InsertTextFormat,rt as findNodesForProperty,s as Formatting,st as getDocument$6,tt as findNodeForKeyword$3,u as DefaultWorkspaceSymbolProvider,ut as isCrossReference,v as NodeFileSystemProvider,w as Disposable,x as JSDocDocumentationProvider,y as loadGrammarFromJson,z as UriUtils}from"./libs/langium.mjs";import{t as PQueue}from"./libs/p-queue.mjs";import{t as deepEqual}from"./libs/fast-equals.mjs";import{t as calcSequenceLayout}from"./sequence-view.mjs";import{n as digraph,r as toDot,t as attribute}from"./libs/ts-graphviz.mjs";import{t as require_word_wrap}from"./libs/word-wrap.mjs";import{n as transparentize,r as toHex,t as scale}from"./libs/khroma.mjs";import{t as pLimit}from"./libs/p-limit.mjs";import{t as require_picomatch}from"./libs/picomatch.mjs";import{a as joinRelativeURL,d as withoutLeadingSlash,f as withoutProtocol,i as isRelative,l as withTrailingSlash,n as hasLeadingSlash,o as joinURL,p as withoutTrailingSlash,r as hasProtocol,t as cleanDoubleSlashes,u as withoutBase}from"./libs/ufo.mjs";import{t as prettyMilliseconds}from"./libs/pretty-ms.mjs";import{t as decode}from"./libs/@msgpack/msgpack.mjs";import{t as fromBase64}from"./libs/@smithy/util-base64.mjs";import{t as dedent}from"./libs/strip-indent.mjs";import{t as require_lib}from"./libs/which.mjs";import{LikeC4Model}from"@likec4/core/model";import*as c4 from"@likec4/core";import{Fqn,FqnExpr,FqnRef,GlobalFqn,LikeC4Styles,LinkedList,RelationExpr,RichText,_layout,_stage,_type,ancestorsFqn,applyManualLayout,calcDriftsFromSnapshot,exact,extractStep,invariant,isAncestor,isAndOperator,isAnyOf,isAutoLayoutDirection,isDeploymentNode,isDeploymentView,isDynamicView,isElementView,isGlobalFqn,isNonEmptyArray,isOrOperator,isSameHierarchy,nameFromFqn,nonNullable,nonexhaustive,preferSummary,splitGlobalFqn}from"@likec4/core";import{LikeC4Styles as LikeC4Styles$1,ThemeColors,assignTagColors,computeColorValues}from"@likec4/core/styles";import{Fqn as Fqn$1,FqnExpr as FqnExpr$1,FqnRef as FqnRef$1,_stage as _stage$1,_type as _type$1,exact as exact$1,isAnyOf as isAnyOf$1,isExtendsElementView}from"@likec4/core/types";import{bundleRequire}from"bundle-require";import{formatMessagesSync}from"esbuild";import*as fs$2 from"node:fs/promises";import{unlink,writeFile}from"node:fs/promises";import{basename,dirname,resolve}from"node:path";import{fdir}from"fdir";import{mkdirSync,statSync}from"node:fs";import{DefaultMap,DefaultWeakMap,MultiMap,ancestorsFqn as ancestorsFqn$1,compareFqnHierarchically,compareNatural,compareNaturalHierarchically,delay,hierarchyDistance,ifilter,invariant as invariant$1,isNonEmptyArray as isNonEmptyArray$1,isString,memoizeProp as memoizeProp$1,nameFromFqn as nameFromFqn$1,nonNullable as nonNullable$1,nonexhaustive as nonexhaustive$1,objectHash,onNextTick,parentFqn,promiseNextTick,sortNaturalByFqn,sortParentsFirst,stringHash,toArray}from"@likec4/core/utils";import chokidar from"chokidar";import{BBox as BBox$1,Vector}from"@likec4/core/geometry";import{Graph}from"@likec4/core/utils/graphology";import{Graphviz}from"@hpcc-js/wasm-graphviz";import{computeAdhocView,computeProjectsView,computeView,resolveRulesExtendedViews}from"@likec4/core/compute-view";import spawn,{SubprocessError}from"nano-spawn";import os from"node:os";const parseStack=i=>i.split(`
2
+ `).map(i=>i.trim().replace(`file://`,``));function indent(i,a=2){i=Array.isArray(i)?i:i.split(`
3
+ `);let o=` `.repeat(a);return i.map(i=>`${o}${i}`).join(`
4
+ `)}function loggable(i){if(typeof i==`string`)return i;if(i instanceof Error){let a=mergeErrorCause(i);if(a.stack){let i=parseStack(a.stack);return a.message+`
5
+ `+indent(i.slice(1))}return a.message}return safeStringify(i,{indentation:` `})}function wrapError(i,a){return wrapErrorMessage(i,a)}function gerErrorFromLogRecord(i){let a=Object.entries(i.properties).flatMap(([i,a])=>{if(a instanceof Error){let i=mergeErrorCause(a);return i.stack&&=parseStack(i.stack).join(`
6
+ `),[i]}return i===`error`||i===`err`?[Error(`${a}`)]:[]});return a.length===0?null:a.length===1?a[0]:AggregateError(a)}function appendErrorToMessage(i,a=!1){let o=gerErrorFromLogRecord(i.record);if(o){let s=o.message;return o.stack&&(s=s+`
7
+ `+indent(o.stack.split(`
8
+ `).slice(1))),a&&(s=`${ansiColors.red}${s}${RESET}`),{...i,message:i.message+`
9
+ `+indent(s)}}return i}const levelAbbreviations={trace:`TRACE`,debug:`DEBUG`,info:`INFO `,warning:`WARN `,error:`ERROR`,fatal:`FATAL`},level=i=>levelAbbreviations[i],RESET=`\x1B[0m`,ansiColors={red:`\x1B[31m`};function getAnsiColorFormatter(i){let a=i?.format??(({timestamp:i,level:a,category:o,message:s})=>`${i} ${a} ${o} ${s}`);return getAnsiColorFormatter$1({timestamp:`time`,level,categoryStyle:`bold`,categoryColor:`cyan`,category:`.`,...i,format:i=>a(appendErrorToMessage(i,!0))})}function getConsoleFormatter(i){let a=i?.messageFormatter;return a?i=>{let{properties:o}=i;return o&&Object.keys(o).length>0?[a(i),o]:[a(i)]}:i=>{let{message:a,properties:o}=i;return o&&Object.keys(o).length>0?[...a,o]:a}}function getConsoleSink(i){return getConsoleSink$1({formatter:getConsoleFormatter(),...i})}function getConsoleStderrSink(i){let a=i?.formatter??getConsoleFormatter();return i=>{let o=a(i);if(typeof o==`string`){let i=o.replace(/\r?\n$/,``);console.error(i)}else console.error(...o)}}const logger$17=getLogger(`likec4`);function createLogger(i){return logger$17.getChild(i)}function configureLogger(i){try{let a=i?.sinks??{};configureSync({reset:!0,...i,sinks:{console:getConsoleSink(),...a},loggers:[{category:[`logtape`,`meta`],sinks:[`console`],lowestLevel:`warning`},...i?.loggers??[{category:`likec4`,sinks:[`console`],lowestLevel:`debug`}]]})}catch(i){console.error(i)}}init_main();var LikeC4=class{langium;logger;constructor(i,a=logger$17){this.langium=i,this.logger=a}get workspace(){return this.langium.shared.workspace.WorkspaceManager.workspaceUri.fsPath}get workspaceURI(){return this.langium.shared.workspace.WorkspaceManager.workspaceUri}get workspaceURL(){return this.langium.shared.workspace.WorkspaceManager.workspaceURL}get languageServices(){return this.langium.likec4.likec4.LanguageServices}get projectsManager(){return this.langium.shared.workspace.ProjectsManager}get viewsService(){return this.langium.likec4.likec4.Views}get modelBuilder(){return this.langium.likec4.likec4.ModelBuilder}get LangiumDocuments(){return this.langium.shared.workspace.LangiumDocuments}ensureSingleProject(){let i=this.languageServices.projects();if(i.length>1)throw this.logger.error(`Multiple projects found:
10
+ ${i.map(i=>` - ${i.folder.fsPath}`).join(`
11
+ `)}
12
+
13
+ Please specify a project folder`),Error(`Multiple projects found`)}async diagrams(i){let a=this.projectsManager.ensureProjectId(i);return await this.viewsService.diagrams(a)}syncComputedModel(i){let a=this.projectsManager.ensureProjectId(i);return this.modelBuilder.unsafeSyncComputeModel(a)}async computedModel(i){let a=this.projectsManager.ensureProjectId(i);return await this.modelBuilder.computeModel(a)}projects(){return t(this.languageServices.projects(),e(`id`))}async layoutedModel(i){let a=this.projectsManager.ensureProjectId(i);return await this.languageServices.layoutedModel(a)}getErrors(){return this.LangiumDocuments.all.toArray().flatMap(i=>(i.diagnostics??[]).filter(i=>i.severity===DiagnosticSeverity$1.Error).map(({message:a,range:o})=>({message:a,line:o.start.line,range:o,sourceFsPath:i.uri.fsPath})))}hasErrors(){return this.LangiumDocuments.all.some(i=>i.diagnostics?.some(i=>i.severity===DiagnosticSeverity$1.Error)??!1)}printErrors(){let i=!1;for(let a of this.LangiumDocuments.all){let o=a.diagnostics?.filter(i=>i.severity===1);if(o&&o.length>0){i=!0;let s=o.flatMap(i=>{let a=i.range.start.line,o=i.message.split(`
14
+ `);return o.length>10&&(o.length=10,o.push(`...`)),o.map((i,o)=>o===0?` `+u.dim(`Line ${a}: `)+u.red(i):` `.repeat(10)+u.red(i))}).join(`
15
+ `);this.logger.error(`Invalid ${a.uri.fsPath}\n${s}`)}}return i}onModelUpdate(i){let a=this.modelBuilder.onModelParsed(()=>i());return()=>{a.dispose()}}async dispose(){await this.languageServices.dispose()}async[Symbol.asyncDispose](){await this.dispose()}};const validationErrorsToError=i=>Error(`Invalid model:\n${i.getErrors().map(i=>` ${i.sourceFsPath}:${i.line} ${i.message.slice(0,200)}`).join(`
16
+ `)}`);async function handleInitOptions(i,a=logger$17,o){let s=new LikeC4(i,a),c=defu(o,{printErrors:!0,throwIfInvalid:!1});return c.throwIfInvalid===!0&&s.hasErrors()?(await s.dispose(),Promise.reject(validationErrorsToError(s))):(c.printErrors!==!1&&s.hasErrors()&&s.printErrors(),s)}async function createFromSources(i,a,o,s){let c=URI.from({scheme:`virtual`,path:`/workspace`}),l={name:`virtual`,uri:c.toString()},d=i.shared.workspace.WorkspaceManager;d.initialize({capabilities:{},processId:null,rootUri:l.uri,workspaceFolders:[l]}),await d.initializeWorkspace([l]);let f=i.shared.ServiceRegistry.all.flatMap(i=>i.LanguageMetaData.fileExtensions),[p,m]=t$1(t$2(o),([i])=>isLikeC4JsonConfig(i));for(let[o,s]of p){let l=UriUtils.joinPath(c,o);try{await i.shared.workspace.ProjectsManager.registerProject({configUri:l,config:LikeC4ProjectConfigOps.parse(s)})}catch(i){a.error(loggable(i))}}let h=t$3(m,t(([a,o])=>{f.includes(extname$1(a))||(a+=`.c4`);let s=UriUtils.joinPath(c,a);return i.shared.workspace.LangiumDocuments.createDocument(s,o)}));return await i.shared.workspace.DocumentBuilder.build(h,{validation:!0}),handleInitOptions(i,a,s)}const LibIcons=[`likec4lib {`,` icons {`,...[...Object.entries({aws:`activate.alexa-for-business.amplify.apache-mxnet-on-aws.api-gateway.app-config.app-flow.app-mesh.app-runner.app-stream.app-sync.application-auto-scaling.application-composer.application-cost-profiler.application-discovery-service.application-migration-service.artifact.athena.audit-manager.augmented-ai-a2i.aurora.auto-scaling.backint-agent.backup.batch.billing-conductor.bottlerocket.braket.budgets.certificate-manager.chatbot.chime-sdk.chime-voice-connector.chime.clean-rooms.client-vpn.cloud-control-api.cloud-development-kit.cloud-directory.cloud-formation.cloud-front.cloud-hsm.cloud-map.cloud-search.cloud-shell.cloud-trail.cloud-wan.cloud-watch.cloud9.code-artifact.code-build.code-catalyst.code-commit.code-deploy.code-guru.code-pipeline.code-star.code-whisperer.cognito.command-line-interface.comprehend-medical.comprehend.compute-optimizer.config.connect.console-mobile-application.control-tower.corretto.cost-and-usage-report.cost-explorer.data-exchange.data-pipeline.data-sync.data-zone.database-migration-service.deep-composer.deep-learning-amis.deep-learning-containers.deep-lens.deep-racer.detective.dev-ops-guru.device-farm.direct-connect.directory-service.distro-for-open-telemetry.document-db.dynamo-db.ec2-auto-scaling.ec2-image-builder.ec2.ecs-anywhere.efs.eks-anywhere.eks-cloud.eks-distro.elasti-cache.elastic-beanstalk.elastic-block-store.elastic-container-registry.elastic-container-service.elastic-disaster-recovery.elastic-fabric-adapter.elastic-inference.elastic-kubernetes-service.elastic-load-balancing.elastic-transcoder.elemental-appliances-software.elemental-conductor.elemental-delta.elemental-link.elemental-live.elemental-media-connect.elemental-media-convert.elemental-media-live.elemental-media-package.elemental-media-store.elemental-media-tailor.elemental-server.emr.event-bridge.express-workflows.fargate.fault-injection-simulator.file-cache.fin-space.firewall-manager.forecast.fraud-detector.free-rtos.fsx-for-lustre.fsx-for-net-app-ontap.fsx-for-open-zfs.fsx-for-wfs.fsx.game-kit.game-lift.game-sparks.genomics-cli.global-accelerator.glue-data-brew.glue-elastic-views.glue.ground-station.guard-duty.health-lake.honeycode.iam-identity-center.identity-and-access-management.inspector.interactive-video-service.io-t-1-click.io-t-analytics.io-t-button.io-t-core.io-t-device-defender.io-t-device-management.io-t-edu-kit.io-t-events.io-t-express-link.io-t-fleet-wise.io-t-greengrass.io-t-robo-runner.io-t-site-wise.io-t-things-graph.io-t-twin-maker.iq.kendra.key-management-service.keyspaces.kinesis-data-analytics.kinesis-data-streams.kinesis-firehose.kinesis-video-streams.kinesis.lake-formation.lambda.launch-wizard.lex.license-manager.lightsail.local-zones.location-service.lookout-for-equipment.lookout-for-metrics.lookout-for-vision.lumberyard.macie.mainframe-modernization.managed-blockchain.managed-grafana.managed-service-for-prometheus.managed-services.managed-streaming-for-apache-kafka.managed-workflows-for-apache-airflow.management-console.marketplace-dark.marketplace-light.memory-db-for-redis.migration-evaluator.migration-hub.monitron.mq.neptune.network-firewall.neuron.nice-dcv.nice-engin-frame.nimble-studio.nitro-enclaves.omics.open-3d-engine.open-search-service.ops-works.organizations.outposts-family.outposts-rack.outposts-servers.panorama.parallel-cluster.personal-health-dashboard.personalize.pinpoint-apis.pinpoint.polly.private-5g.private-certificate-authority.private-link.professional-services.proton.quantum-ledger-database.quick-sight.rds-on-vmware.rds.re-post.red-hat-open-shift-service-on-aws.redshift.rekognition.reserved-instance-reporting.resilience-hub.resource-access-manager.resource-explorer.robo-maker.route-53.s3-on-outposts.sage-maker-ground-truth.sage-maker-studio-lab.sage-maker.savings-plans.secrets-manager.security-hub.security-lake.server-migration-service.serverless-application-repository.service-catalog.service-management-connector.shield.signer.sim-space-weaver.simple-email-service.simple-notification-service.simple-queue-service.simple-storage-service-glacier.simple-storage-service.site-to-site-vpn.snowball-edge.snowball.snowcone.snowmobile.step-functions.storage-gateway.sumerian.supply-chain.support.systems-manager.tensor-flow-on-aws.textract.thinkbox-deadline.thinkbox-frost.thinkbox-krakatoa.thinkbox-sequoia.thinkbox-stoke.thinkbox-xmesh.timestream.tools-and-sdks.torch-serve.training-certification.transcribe.transfer-family.transit-gateway.translate.trusted-advisor.verified-access.verified-permissions.virtual-private-cloud.vmware-cloud-on-aws.vpc-lattice.waf.wavelength.well-architected-tool.wickr.work-docs-sdk.work-docs.work-link.work-mail.work-spaces-family.x-ray`.split(`.`),azure:`abs-member.active-directory-connect-health.activity-log.administrative-units.advisor.ai-at-edge.ai-studio.aks-automatic.aks-istio.alerts.all-resources.analysis-services.anomaly-detector.api-center.api-connections.api-management-services.api-proxy.app-compliance-automation.app-configuration.app-registrations.app-service-certificates.app-service-domains.app-service-environments.app-service-plans.app-services.app-space-component.app-space.applens.application-gateway-containers.application-gateways.application-group.application-insights.application-security-groups.aquila.arc-data-services.arc-kubernetes.arc-machines.arc-postgre-sql.arc-sql-managed-instance.arc-sql-server.atm-multistack.auto-scale.automanaged-vm.automation-accounts.availability-sets.avs-vm.azure-a.azure-ad-b2c.azure-api-for-fhir.azure-applied-ai-services.azure-arc.azure-attestation.azure-backup-center.azure-blockchain-service.azure-center-for-sap.azure-chaos-studio.azure-cloud-shell.azure-communication-services.azure-communications-gateway.azure-compute-galleries.azure-consumption-commitment.azure-cosmos-db.azure-data-catalog.azure-data-explorer-clusters.azure-database-maria-db-server.azure-database-migration-services.azure-database-my-sql-server.azure-database-postgre-sql-server-group.azure-database-postgre-sql-server.azure-databox-gateway.azure-databricks.azure-deployment-environments.azure-dev-ops.azure-dev-tunnels.azure-edge-hardware-center.azure-experimentation-studio.azure-fileshares.azure-firewall-manager.azure-firewall-policy.azure-hcp-cache.azure-hpc-workbenches.azure-hybrid-center.azure-information-protection.azure-io-t-operations.azure-lighthouse.azure-load-testing.azure-managed-grafana.azure-managed-redis.azure-maps-accounts.azure-media-service.azure-migrate.azure-monitor-dashboard.azure-monitor-pipeline.azure-monitors-for-sap-solutions.azure-net-app-files.azure-network-function-manager-functions.azure-network-function-manager.azure-object-understanding.azure-open-ai.azure-operator-5g-core.azure-operator-insights.azure-operator-nexus.azure-operator-service-manager.azure-orbital.azure-programmable-connectivity.azure-purview-accounts.azure-quotas.azure-red-hat-open-shift.azure-sentinel.azure-service-bus.azure-sphere.azure-spring-apps.azure-sql-edge.azure-sql-server-stretch-databases.azure-sql-vm.azure-sql.azure-stack-edge.azure-stack-hci-sizer.azure-stack.azure-storage-mover.azure-support-center-blue.azure-sustainability.azure-synapse-analytics.azure-token-service.azure-video-indexer.azure-virtual-desktop.azure-vmware-solution.azure-workbooks.azurite.backlog.backup-vault.bare-metal-infrastructure.bastions.batch-accounts.batch-ai.biz-talk.blob-block.blob-page.blockchain-applications.blueprints.bonsai.bot-services.branch.breeze.browser.bug.builds.business-process-tracking.cache-redis.cache.capacity-reservation-groups.capacity.cdn-profiles.central-service-instance-for-sap.ceres.change-analysis.client-apps.cloud-services-classic.cloud-services-extended-support.cloud-test.code-optimization.code.cognitive-search.cognitive-services-decisions.cognitive-services.collaborative-service.commit.community-images.compliance-center.compliance.compute-fleet.computer-vision.conditional-access.confidential-ledgers.connected-cache.connected-vehicle-platform.connections.consortium.container-apps-environments.container-instances.container-registries.container-services-deprecated.content-moderators.content-safety.controls-horizontal.controls.cost-alerts.cost-analysis.cost-budgets.cost-export.cost-management-and-billing.cost-management.counter.cubes.custom-ip-prefix.custom-vision.customer-lockbox-for-microsoft-azure.dashboard-hub.dashboard.data-box.data-collection-rules.data-factories.data-lake-analytics.data-lake-storage-gen1.data-lake-store-gen1.data-share-invitations.data-shares.data-virtualization.database-instance-for-sap.ddo-s-protection-plans.dedicated-hsm.defender-cm-local-manager.defender-dcs-controller.defender-distributer-control-system.defender-engineering-station.defender-external-management.defender-freezer-monitor.defender-historian.defender-hmi.defender-industrial-packaging-system.defender-industrial-printer.defender-industrial-robot.defender-industrial-scale-system.defender-marquee.defender-meter.defender-plc.defender-pneumatic-device.defender-programable-board.defender-relay.defender-robot-controller.defender-rtu.defender-sensor.defender-slot.defender-web-guiding-system.detonation.dev-console.dev-ops-starter.dev-test-labs.device-compliance.device-configuration.device-enrollment.device-provisioning-services.device-security-apple.device-security-google.device-security-windows.device-update-io-t-hub.devices.diagnostics-settings.digital-twins.disk-encryption-sets.disk-pool.disks-classic.disks-snapshots.disks.dns-multistack.dns-private-resolver.dns-security-policy.dns-zones.download.e-books.edge-actions.edge-management.edge-storage-accelerator.education.elastic-job-agents.elastic-san.endpoint-analytics.engage-center-connect.enterprise-applications.entra-connect-health.entra-connect-sync.entra-connect.entra-domain-services.entra-global-secure-access.entra-id-protection.entra-identity-custom-roles.entra-identity-licenses.entra-identity-risky-signins.entra-identity-risky-users.entra-identity-roles-and-administrators.entra-internet-access.entra-managed-identities.entra-private-access.entra-privleged-identity-management.entra-verified-id.error.event-grid-domains.event-grid-subscriptions.event-grid-topics.event-hub-clusters.event-hubs.exchange-access.exchange-on-premises-access.express-route-circuits.express-route-direct.express-route-traffic-collector.extended-security-updates.extensions.external-id-modified.external-id.external-identities.face-apis.feature-previews.fhir-service.fiji.file.files.firewalls.folder-blank.folder-website.form-recognizers.frd-qa.free-services.front-door-and-cdn-profiles.ftp.function-apps.gear.genomics-accounts.genomics.globe-error.globe-success.globe-warning.groups.guide.hd-insight-clusters.hdi-aks-cluster.heart.help-and-support.host-groups.host-pools.hosts.hybrid-connectivity-hub.ic-m-troubleshooting.identity-governance.identity-multi-factor-authentication.identity-secure-score.image-definitions.image-templates.image-versions.image.images.immersive-readers.import-export-jobs.industrial-io-t.information.infrastructure-backup.input-output.instance-pools.integration-accounts.integration-environments.integration-service-environments.internet-analyzer-profiles.intune-app-protection.intune-for-education.intune-trends.intune.io-t-central-applications.io-t-edge.io-t-hub.ip-address-manager.ip-groups.journey-hub.key-vaults.keys.kubernetes-fleet-manager.kubernetes-services.lab-accounts.lab-services.landing-zone.language-understanding.language.launch-portal.learn.load-balancer-hub.load-balancers.load-test.load-testing.local-network-gateways.location.log-analytics-query-pack.log-analytics-workspaces.log-streaming.logic-apps-custom-connector.logic-apps-template.logic-apps.machine-learning-studio-classic-web-services.machine-learning-studio-web-service-plans.machine-learning-studio-workspaces.machine-learning.machines-azure-arc.maintenance-configuration.managed-applications-center.managed-database.managed-desktop.managed-dev-ops-pools.managed-file-shares.managed-identities.managed-instance-apache-cassandra.managed-service-fabric.management-groups.management-portal.marketplace-management.marketplace.med-tech-service.media-file.media.mesh-applications.metrics-advisor.metrics.microsoft-defender-easm.microsoft-defender-for-cloud.microsoft-defender-for-io-t.microsoft-dev-box.mindaro.mission-landing-zone.mobile-engagement.mobile-networks.mobile.modular-data-center.module.monitor-health-models.monitor.multi-tenancy.multifactor-authentication.my-customers.nat.network-foundation-hub.network-interfaces.network-managers.network-security-groups.network-security-hub.network-security-perimeters.network-watcher.notification-hub-namespaces.notification-hubs.offers.on-premises-data-gateways.open-supply-chain-platform.operation-log-classic.oracle-database.os-images-classic.osconfig.outbound-connection.partner-namespace.partner-registration.partner-topic.peering-service.peerings.personalizers.planetary-computer-pro.plans.policy.power-bi-embedded.power-platform.power-up.power.powershell.preview-features.private-endpoints.private-link-service.private-link-services.private-link.process-explorer.production-ready-database.promethus.proximity-placement-groups.public-ip-addresses-classic.public-ip-addresses.public-ip-prefixes.qn-a-makers.quickstart-center.recent.recovery-services-vaults.region-management.relays.remote-rendering.reservations.reserved-capacity.reserved-ip-addresses-classic.resource-explorer.resource-graph-explorer.resource-group-list.resource-groups.resource-guard.resource-linked.resource-management-private-link.resource-mover.resources-provider.restore-points-collections.restore-points.route-filters.route-tables.rtos.savings-plans.scheduler-job-collections.scheduler.scvmm-management-servers.search-grid.search.security-baselines.security.send-grid-accounts.server-farm.serverless-search.service-catalog-mad.service-endpoint-policies.service-fabric-clusters.service-group-relationships.service-groups.service-health.service-providers.shared-image-galleries.signal-r.software-as-a-service.software-updates.solutions.sonic-dash.spatial-anchor-accounts.speech-services.spot-vm.spot-vmss.sql-data-warehouses.sql-database-fleet-manager.sql-database.sql-elastic-pools.sql-managed-instance.sql-server-registries.sql-server.ssd.ssh-keys.ssis-lift-and-shift-ir.stack-hci-premium.static-apps.stor-simple-data-managers.stor-simple-device-managers.storage-accounts-classic.storage-accounts.storage-actions.storage-azure-files.storage-container.storage-explorer.storage-functions.storage-hubs.storage-queue.storage-sync-services.stream-analytics-jobs.subnet.subscriptions.system-topic.table.tag.tags.targets-management.template-specs.templates.tenant-properties.tenant-status.test-base.tfs-vc-repository.time-series-data-sets.time-series-insights-access-policies.time-series-insights-environments.time-series-insights-event-sources.toolbox.toolchain-orchestrator.traffic-manager-profiles.translator-text.troubleshoot.universal-print.update-management-center.updates.user-privacy.user-settings.user-subscriptions.users.verifiable-credentials.verification-as-a-service.versions.video-analyzers.virtual-clusters.virtual-enclaves.virtual-instance-for-sap.virtual-machine.virtual-machines-classic.virtual-network-gateways.virtual-networks-classic.virtual-networks.virtual-router.virtual-visits-builder.virtual-wan-hub.virtual-wans.vm-app-definitions.vm-app-versions.vm-image-version.vm-images-classic.vm-scale-sets.vpnclient-windows.wac-installer.wac.web-app-database.web-application-firewall-policies-waf.web-jobs.web-slots.web-test.website-power.website-staging.windows-notification-services.windows10-core-services.workbooks.worker-container-app.workflow.workload-orchestration.workspace-gateway.workspaces`.split(`.`),gcp:`access-context-manager.administration.advanced-agent-modeling.advanced-solutions-lab.agent-assist.ai-hub.ai-platform-unified.ai-platform.analytics-hub.anthos-config-management.anthos-service-mesh.anthos.api-analytics.api-monetization.api.apigee-api-platform.apigee-sense.app-engine.artifact-registry.asset-inventory.assured-workloads.auto-ml-natural-language.auto-ml-tables.auto-ml-translation.auto-ml-video-intelligence.auto-ml-vision.auto-ml.bare-metal-solutions.batch.beyondcorp.big-query.bigtable.billing.binary-authorization.catalog.certificate-authority-service.certificate-manager.cloud-api-gateway.cloud-apis.cloud-armor.cloud-asset-inventory.cloud-audit-logs.cloud-build.cloud-cdn.cloud-code.cloud-composer.cloud-data-fusion.cloud-deploy.cloud-deployment-manager.cloud-dns.cloud-domains.cloud-ekm.cloud-endpoints.cloud-external-ip-addresses.cloud-firewall-rules.cloud-for-marketing.cloud-functions.cloud-generic.cloud-gpu.cloud-healthcare-api.cloud-healthcare-marketplace.cloud-hsm.cloud-ids.cloud-inference-api.cloud-interconnect.cloud-jobs-api.cloud-load-balancing.cloud-logging.cloud-media-edge.cloud-monitoring.cloud-nat.cloud-natural-language-api.cloud-network.cloud-ops.cloud-optimization-ai-fleet-routing-api.cloud-optimization-ai.cloud-router.cloud-routes.cloud-run-for-anthos.cloud-run.cloud-scheduler.cloud-security-scanner.cloud-shell.cloud-spanner.cloud-sql.cloud-storage.cloud-tasks.cloud-test-lab.cloud-tpu.cloud-translation-api.cloud-vision-api.cloud-vpn.compute-engine.configuration-management.connectivity-test.connectors.contact-center-ai.container-optimized-os.container-registry.data-catalog.data-labeling.data-layers.data-loss-prevention-api.data-qn-a.data-studio.data-transfer.database-migration-service.dataflow.datalab.dataplex.datapol.dataprep.dataproc-metastore.dataproc.datashare.datastore.datastream.debugger.developer-portal.dialogflow-cx.dialogflow-insights.dialogflow.document-ai.early-access-center.error-reporting.eventarc.filestore.financial-services-marketplace.firestore.fleet-engine.free-trial.game-servers.gce-systems-management.genomics.gke-on-prem.google-cloud-marketplace.google-kubernetes-engine.google-maps-platform.healthcare-nlp-api.home.identity-and-access-management.identity-aware-proxy.identity-platform.iot-core.iot-edge.key-access-justifications.key-management-service.kuberun.launcher.local-ssd.looker.managed-service-for-microsoft-active-directory.media-translation-api.memorystore.migrate-for-anthos.migrate-for-compute-engine.my-cloud.network-connectivity-center.network-intelligence-center.network-security.network-tiers.network-topology.onboarding.os-configuration-management.os-inventory-management.os-patch-management.partner-interconnect.partner-portal.performance-dashboard.permissions.persistent-disk.phishing-protection.policy-analyzer.premium-network-tier.private-connectivity.private-service-connect.producer-portal.profiler.project.pub-sub.quantum-engine.quotas.real-world-insights.recommendations-ai.release-notes.retail-api.risk-manager.runtime-config.secret-manager.security-command-center.security-health-advisor.security-key-enforcement.security.service-discovery.speech-to-text.stackdriver.standard-network-tier.stream-suite.support.tensorflow-enterprise.text-to-speech.tools-for-powershell.trace.traffic-director.transfer-appliance.transfer.user-preferences.vertex-ai.video-intelligence-api.virtual-private-cloud.visual-inspection.vmware-engine.web-risk.web-security-scanner.workflows.workload-identity-pool`.split(`.`),tech:`100tb.500px.aarch64.active-campaign-icon.active-campaign.adobe-after-effects.adobe-animate.adobe-dreamweaver.adobe-icon.adobe-illustrator.adobe-incopy.adobe-indesign.adobe-lightroom.adobe-photoshop.adobe-premiere-pro.adobe-premiere.adobe-xd.adobe.adonis-js.adonisjs-icon.adroll.adyen.aerogear.aerospike-icon.aerospike.after-effects.aha.airbnb-icon.airbnb.airbrake.airflow-icon.airflow.airtable.aix.akamai.akka.alfresco.algolia.alpinejs-icon.alpinejs.altair.amazon-chime.amazon-connect.amazon-web-services.amd.amex-digital.amex.amp-icon.amp.ampersand.amplication-icon.amplication.amplitude-icon.amplitude.anaconda.analog.android-icon.android-studio.android-vertical.android.angellist.angular-icon.angular-js.angular.ansible.ant-design.anthropic-icon.anthropic.apache-camel.apache-cloudstack.apache-flink-icon.apache-flink.apache-spark.apache-superset-icon.apache-superset.apache.apiary.apidog-icon.apidog.apl.apollostack.apostrophe.appbaseio-icon.appbaseio.appcelerator.appcenter-icon.appcenter.appcircle-icon.appcircle.appcode.appdynamics-icon.appdynamics.appium.apple-app-store.apple-pay.apple-safari.apple.applitools-icon.applitools.appsignal-icon.appsignal.apptentive.appveyor.appwrite-icon.appwrite.arangodb-icon.arangodb.arc.architect-icon.architect.archlinux.arduino.argo-icon.argo.argocd.arm.armory-icon.armory.asana-icon.asana.asciidoctor.assembla-icon.assembla.astro-icon.astro.astronomer.async-api-icon.async-api.atlassian.atom-icon.atom.atomic-icon.atomic.atomicojs-icon.atomicojs.aurelia.aurora.auth0-icon.auth0.authy.autodesk-maya.autodesk-shot-grid.autoit.autoprefixer.ava.awesome.awk.aws-amplify.aws-api-gateway.aws-app-mesh.aws-appflow.aws-appsync.aws-athena.aws-aurora.aws-backup.aws-batch.aws-certificate-manager.aws-cloudformation.aws-cloudfront.aws-cloudsearch.aws-cloudtrail.aws-cloudwatch.aws-codebuild.aws-codecommit.aws-codedeploy.aws-codepipeline.aws-codestar.aws-cognito.aws-config.aws-documentdb.aws-dynamodb.aws-ec2.aws-ecs.aws-eks.aws-elastic-beanstalk.aws-elasticache.aws-elb.aws-eventbridge.aws-fargate.aws-glacier.aws-glue.aws-iam.aws-keyspaces.aws-kinesis.aws-kms.aws-lake-formation.aws-lambda.aws-lightsail.aws-mq.aws-msk.aws-neptune.aws-open-search.aws-opsworks.aws-quicksight.aws-rds.aws-redshift.aws-route53.aws-s3.aws-secrets-manager.aws-ses.aws-shield.aws-sns.aws-sqs.aws-step-functions.aws-systems-manager.aws-timestream.aws-vpc.aws-waf.aws-xray.aws.axios.azios.azure-devops.azure-sql-database.azure.babel.backbone-icon.backbone-js.backbone.backerkit.baker-street.balena.ballerina.bamboo.basecamp-icon.basecamp.basekit.baseline.bash-icon.bash.batch.beats.behance.bem-2.bem.bigpanda.bing.biomejs-icon.biomejs.bitbar.bitbucket.bitcoin.bitnami.bitrise-icon.bitrise.blender.blitzjs-icon.blitzjs.blocs.blogger.blossom.blueprint.bluesky.bluetooth.booqable-icon.booqable.bootstrap.bosun.botanalytics.bourbon.bower.box.brackets.brainjs.branch-icon.branch.brandfolder-icon.brandfolder.brave.braze-icon.braze.broadcom-icon.broadcom.broccoli.brotli.browserify-icon.browserify.browserling.browserslist.browserstack.browsersync.brunch.bubble-icon.bubble.buck.buddy.buffer.bugherd-icon.bugherd.bugsee.bugsnag.builder-io-icon.builder-io.buildkite-icon.buildkite.bulma.bun.bunny-net-icon.bunny-net.c.cachet.cairo-graphics.cake-php.cakephp-icon.calibre-icon.calibre.campaignmonitor-icon.campaignmonitor.canjs.canva.capacitor.capacitorjs-icon.capacitorjs.capistrano.carbide.cardano-icon.cardano.cassandra.cent-os.centos-icon.certbot.ceylon.chai.chalk.chargebee-icon.chargebee.chartjs.chef.chevereto.chroma.chromatic-icon.chromatic.chrome-web-store.chrome.cinder.circle-ci.cirrus-ci.cirrus.clarity.claude-icon.claude.clio-lang.clion.cljs.clojure-script.clojure.close.cloud9.cloudacademy-icon.cloudacademy.cloudcraft.cloudflare-icon.cloudflare-workers-icon.cloudflare-workers.cloudflare.cloudinary-icon.cloudinary.cloudlinux.cmake.cobalt.cockpit.cocoapods.coda-icon.coda.codacy.code-igniter.code-pen.codeac.codebase.codebeat.codecademy.codeception.codeclimate-icon.codeclimate.codecov-icon.codecov.codefactor-icon.codefactor.codeigniter-icon.codepen-icon.codersrank-icon.codersrank.coderwall.codesandbox-icon.codesandbox.codesee-icon.codesee.codio.codium-icon.codium.coffee-script.commitizen.compass.componentkit.compose-multiplatform.compose.composer.conan-io.concourse.concretecms-icon.concretecms.conda.confluence.consul.contao.contentful.convox-icon.convox.copyleft-pirate.copyleft.corda.cordova.cosmosdb.couchbase.couchdb-icon.couchdb.coursera.coveralls.cpanel.cplusplus.craftcms.crashlytics.crateio.create-react-app.createjs.crossplane-icon.crossplane.crucible.crystal.csharp.css3-official.css3.cssnext.cube-icon.cube.cucumber.curl.customerio-icon.customerio.cyclejs.cypress-icon.cypress.d3.d3js.dailydev-icon.dailydev.daisy-ui-icon.daisy-ui.danfo.dart.dashlane-icon.dashlane.data-grip.data-spell.data-station.database-labs.datadog-icon.datadog.datasette-icon.datasette.datocms-icon.datocms.dbeaver.dbt-icon.dbt.dcos-icon.dcos.debian.delighted-icon.delighted.deno.dependabot.deployhq-icon.deployhq.derby.descript-icon.descript.designernews.deviantart-icon.deviantart.devicon.dgraph-icon.dgraph.dialogflow.digital-ocean-icon.digital-ocean.dimer.dinersclub.discord-icon.discord-js.discord.discourse-icon.discourse.discover.disqus.django-icon.django-rest.django.dockbit.docker-icon.docker.doctrine.docusaurus.dojo-icon.dojo-toolkit.dojo.dolt.dotnet.dovetail-icon.dovetail.dreamhost.dribbble-icon.dribbble.drift.drip.drizzle-icon.drizzle.drone-icon.drone.drools-icon.drools.dropbox.dropmark.dropwizard.dropzone.drupal-icon.drupal.duckduckgo.dynatrace-icon.dynatrace.dyndns.ebanx.eclipse-ceylon.eclipse-icon.eclipse-ide.eclipse-vert-x.eclipse.ecma.edgedb.edgio-icon.edgio.editorconfig.effect-icon.effect.effector.egghead.elasticbeats.elasticpath-icon.elasticpath.elasticsearch.electron.element.elemental-ui.elementary.eleventy-11ty.eleventy.elixir.ello.elm-classic.elm.elo.emacs-classic.emacs.embedded-c.embedly.ember-js.ember-tomster.ember.emmet.enact.engine-yard-icon.engine-yard.envato.envoy-icon.envoy.envoyer.eraser-icon.eraser.erlang.esbuild.esdoc.eslint-old.eslint.eta-icon.eta.etcd.ethereum-color.ethereum.ethers.ethnio.eventbrite-icon.eventbrite.eventsentry.evergreen-icon.evergreen.expo-icon.expo.express.fabric.facebook.faker.falcor.fast-api.fastapi-icon.fastify-icon.fastify.fastlane.fastly.fauna-icon.fauna.feathers.feathersjs.fedora.fetch.ffmpeg-icon.ffmpeg.figma.file-zilla.firebase-icon.firebase.firefox.flannel.flarum.flask.flat-ui.flattr-icon.flattr.fleep.flickr-icon.flickr.flight.floodio.flow.flowxo.floydhub.flutter.flux.fluxxor.fly-icon.fly.fogbugz-icon.fogbugz.fomo-icon.fomo.font-awesome.forestadmin-icon.forestadmin.forever.formkeep.fortran.foundation.foundationdb-icon.foundationdb.framer.framework7-icon.framework7.freebsd.freedcamp-icon.freedcamp.freedomdefined.fresh.frontapp.fsharp.fuchsia.galliumos.game-analytics-icon.game-analytics.ganache-icon.ganache.gatling.gatsby.gazebo.gcc.geekbot.geetest-icon.geetest.gentoo.getyourguide.ghost.giantswarm.gimp.gin.git-icon.git.gitboard.gitbook.github-actions.github-codespaces.github-copilot.github-icon.github-octocat.github.gitkraken.gitlab-icon.gitlab.gitpod.gitter.gitup.glamorous-icon.glamorous.gleam.glimmerjs.glint.glitch-icon.glitch.gnome-icon.gnome.gnu-emacs.gnu-net.gnu.gnupg-icon.gnupg.go-land.go.gocd.godot-engine.godot-icon.godot.gohorse.google-360suite.google-admob.google-ads.google-adsense.google-analytics.google-bard-icon.google-bard.google-calendar.google-cloud-functions.google-cloud-run.google-cloud.google-data-studio.google-developers.google-domains-icon.google-domains.google-drive.google-fit.google-gemini.google-gmail.google-home.google-icon.google-keep.google-maps.google-marketing-platform.google-meet.google-one.google-optimize.google-palm.google-pay.google-photos.google-play-console-icon.google-play-console.google-play-icon.google-play.google-search-console.google-tag-manager.google-workspace.google.gopher.gradio-icon.gradio.gradle.grafana.grails.grammarly-icon.grammarly.graphene.graphql.grav.gravatar-icon.gravatar.graylog-icon.graylog.greensock-icon.greensock.gridsome-icon.gridsome.grommet.groovehq.groovy.grove.growth-book-icon.growth-book.grpc.grunt.gruntjs.gulp.gulpjs.gunicorn.gunjs.gusto.gwt.hack.hacker-one.hadoop.haiku-icon.haiku.haml.hanami.handlebars.hapi.hardhat-icon.hardhat.harness-icon.harness.harvester.hashicorp-icon.hashicorp-vault.hashicorp.hashnode-icon.hashnode.haskell-icon.haskell.hasura-icon.hasura.haxe.haxl.hbase.hcaptcha-icon.hcaptcha.headlessui-icon.headlessui.heap-icon.heap.helm.helpscout-icon.helpscout.hermes.heroku-icon.heroku-redis.heroku.hexo.hhvm.hibernate.highcharts.hipercard.homebrew.hono.hookstate.hootsuite-icon.hootsuite.hosted-graphite.hostgator-icon.hostgator.hotjar-icon.hotjar.houndci.html5-boilerplate.html5.htmx-icon.htmx.httpie-icon.httpie.hubspot.hugging-face-icon.hugging-face.huggy.hugo.humongous.hyper.hyperapp.ibm-spss-statistics.ibm.ie10.ieee.ietf.ifttt.imagemin.imba-icon.imba.immer-icon.immer.immutable.impala.importio-icon.importio.incident-icon.incident.infer.inferno.influxdb-icon.influxdb.ink.inkscape.insomnia.instagram-icon.instagram.intel.intellij-idea.intercom-icon.intercom.internet-computer-icon.internet-computer.internetexplorer.invision-icon.invision.ionic-icon.ionic.ios.iron-icon.iron.itsalive-icon.itsalive.jade.jaeger.jamstack-icon.jamstack.jasmine.java.javascript.jcb.jeet.jekyll.jenkins.jest.jetbrains-icon.jetbrains-space-icon.jetbrains-space.jetbrains.jfrog.jhipster-icon.jhipster.jira-align.jira.joomla.jotai.jquery-mobile.jquery.jruby.jsbin.jsdelivr.jsdom.jsfiddle.json-ld.json-schema-icon.json-schema.json.jspm.jss.juju.jule.julia.junit.jupyter.jwt-icon.jwt.k3os.k3s.kafka-icon.kafka.kaggle.kaios.kallithea.karate.karma.katalon-icon.katalon.kde.keen.kemal.keras.keycdn-icon.keycdn.keydb-icon.keydb.keystonejs.khan-academy-icon.khan-academy.kibana.kickstarter-icon.kickstarter.kinto-icon.kinto.kirby-icon.kirby.knex-js.knex.knockout.koa.kong-icon.kong.kops.koreio.kotlin-icon.kotlin.kraken.krakenjs.ktor-icon.ktor.kubernetes.kustomer.labview.languagetool.laravel.lastfm.lateral-icon.lateral.latex.launchdarkly-icon.launchdarkly.launchrock.leaflet.leankit-icon.leankit.lerna.less-js.less.lets-cloud.letsencrypt.leveldb.lexical-icon.lexical.liftweb.lighthouse.lightstep-icon.lightstep.lighttpd.linear-icon.linear.linkedin-icon.linkedin.linkerd.linode.linux-mint.linux-tux.linux.liquibase.lit-icon.lit.litmus.livewire.llvm.loader.lodash.logentries.logstash.lookback.looker-icon.looker.loom-icon.loom.loopback-icon.loopback.losant.lua.lucene-net.lucene.lumen.mac-os.madge.maestro.mageia.magento.mailchimp-freddie.mailchimp.maildeveloper.mailgun-icon.mailgun.mailjet-icon.mailjet.malinajs.manjaro.mantine-icon.mantine.mapbox-icon.mapbox.maps-me.mapzen-icon.mapzen.mariadb-icon.mariadb.marionette.markdown.marko.marvel.mastercard.mastodon-icon.mastodon.material-ui.materialize.materializecss.matlab.matomo-icon.matomo.matplotlib-icon.matplotlib.matter-icon.matter.mattermost-icon.mattermost.mautic-icon.mautic.maven.mdn.mdx.medium-icon.medium.medusa-icon.medusa.meilisearch.memcached.memgraph.mention.mercurial.mesos.messenger.meta-icon.meta.metabase.metamask-icon.metamask.meteor-icon.meteor-js.meteor.micro-icon.micro-python.micro.microcosm.micron-icon.micron.microsoft-azure.microsoft-edge.microsoft-icon.microsoft-onedrive.microsoft-power-bi.microsoft-sql-server.microsoft-teams.microsoft-windows-icon.microsoft-windows.microsoft.mida-icon.mida.middleman.midjourney.milligram.million-icon.million.milvus-icon.milvus.mindsdb-icon.mindsdb.minitab.mint-lang.mio.miro-icon.miro.mist.mistral-ai-icon.mistral-ai.mithril.mixmax.mixpanel.mlab.mob-x.mocha.mockflow-icon.mockflow.modernizr.modx-icon.modx.moleculer.momentjs.monday-icon.monday.monero.mongodb-icon.mongodb.mongoose-js.mono.moodle.moon.mootools.morpheus-icon.morpheus.mozilla.mparticle-icon.mparticle.mps-icon.mps.ms-dos.msw-icon.msw.multipass.mysql-icon.mysql.naiveui.namecheap.nano.nanonets.nasm.nativescript.nats-icon.nats.neat.neo4j.neon-icon.neon.neovim.nerog.nestjs.net-core.net.netbeans.netflix-icon.netflix.netlify-icon.netlify.network-x.neverinstall-icon.neverinstall.new-relic-icon.new-relic.new4j.nextjs-icon.nextjs.nginx.ngrok.nhibernate.nhost-icon.nhost.nightwatch.nim-lang.nim.nimble.nix.nocodb.nodal.node-sass.nodebots.nodejs-icon-alt.nodejs-icon.nodejs.nodemon.nodeos.nodewebkit.nomad-icon.nomad.notion-icon.notion.noysi.npm-icon.npm.nuclide.nuget.num-py.nuxt-icon.nuxt-js.nuxt.nvidia.nvm.nx.oauth.objective-c.observablehq.obsidian-icon.obsidian.ocaml.octodns.octopus-deploy.oh-my-zsh.okta-icon.okta.olark.onesignal.open-al.open-api.open-cl.open-cv.open-gl.open-graph.open-stack.open-suse.open-telemetry.open-zeppelin-icon.open-zeppelin.openai-icon.openai.openapi-icon.opencart.opencollective.openframeworks.openjs-foundation-icon.openjs-foundation.openlayers.opensearch-icon.opensearch.openshift.opensource.openstack-icon.opentelemetry-icon.opera.opsgenie.optimizely-icon.optimizely.oracle.oreilly.origami.origin.oshw.osquery.overloop-icon.overloop.p5js.packer.pagekit.pagekite.pagerduty-icon.pagerduty.panda.pandacss-icon.pandacss.pandas-icon.pandas.parcel-icon.parcel.parse.parsehub.partytown-icon.partytown.passbolt-icon.passbolt.passport.patreon.payload.paypal.peer5.pepperoni.percona.percy-icon.percy.perf-rocks.perl.perplexity-icon.perplexity.pf-sense.phalcon.phoenix-framework.phoenix.photon-engine.php-alt.php-storm.php.pinecone-icon.pinecone.pinia.pinterest.pipedream.pipedrive.pipefy.pivotal-tracker.pixijs.pkg.planetscale.planless-icon.planless.plasmic.plastic-scm.platformio.play.playwright.playwrite.ploty.pluralsight-icon.pluralsight.pm2-icon.pm2.pnpm.pocket-base.podman.poeditor.polygon.polymer.portainer.postcss.postgraphile.postgresql.posthog-icon.posthog.postman-icon.postman.pouchdb.powershell.preact.precursor.prerender-icon.prerender.prestashop-icon.prestashop.presto-icon.presto.prettier.prisma.prismic-icon.prismic.processing.processwire-icon.processwire.productboard-icon.productboard.producthunt.progress.prometheus.promises.proofy.protoio.protonet.protractor.prott.pug.pulumi-icon.pulumi.pumpkindb.puppet-icon.puppet.puppeteer.purescript-icon.purescript.pushbullet.pusher-icon.pusher.putty.pwa.pycharm.pypi.pyscript.pytest.python-poetry.python.pytorch-icon.pytorch.pyup.q.qdrant-icon.qdrant.qlik.qodana.qt.qualcomm.quarkus-icon.quarkus.quasar.quay.quobyte.quora.qwik-icon.qwik.r-lang.r.rabbitmq-icon.rabbitmq.rackspace-icon.rackspace.rails.ramda.raml.rancher-icon.rancher.raphael.raspberry-pi.rax.reach.react-bootstrap.react-query-icon.react-query.react-router.react-spring.react-styleguidist.react.reactivex.realm.reapp.reasonml-icon.reasonml.recaptcha.recoil-icon.recoil.red-cube-s-epic-compiler-thingy-programming-re-ct.reddit-icon.reddit.redhat-icon.redhat.redis.redsmin.redux-observable.redux-saga.redux.redwoodjs.reindex.relay.release.remix-icon.remix.ren-py.renovatebot.replay-icon.replay.replit-icon.replit.require.rescript-icon.rescript.rest-li.rethinkdb.retool-icon.retool.riak.rider.riot.risingwave-icon.risingwave.robot-operating-system-ros.rocket-chat-icon.rocket-chat.rocksdb.rocky-linux-icon.rocky-linux.rollbar-icon.rollbar.rollupjs.rome-icon.rome.ros.rsa.rsmq.rspec.rstudio.rubocop.ruby-mine.ruby-on-rails.ruby.rubygems.rum.runscope.rush-icon.rush.rust.rxdb.safari.sagui.sails.salesforce.sameroom.samsung.sanity.sap.sass-doc.sass.saucelabs.scala.scaledrone.scalingo.scribd-icon.scribd.sdl.seaborn-icon.seaborn.section-icon.section.segment-icon.segment.selenium.sema-software.semantic-release.semantic-ui.semaphoreci.sencha.sendgrid-icon.sendgrid.seneca.sensu-icon.sensu.sentry-icon.sentry.sequelize.serverless.sherlock-icon.sherlock.shields.shipit.shogun.shopify.shopware.shortcut-icon.shortcut.sidekiq-icon.sidekiq.signal.sigstore-icon.sigstore.sinatra.singlestore-icon.singlestore.sitepoint.sk-hynix.skaffolder.sketch.skylight.skype.slack-icon.slack.slides.slidev.slim.smartling.smashingmagazine.snap-svg.snaplet-icon.snaplet.snowflake-icon.snowflake.snowpack.snyk.socket-io.solarwinds.solid.solidity.solidjs-icon.solidjs.solr.sonarcloud-icon.sonarcloud.sonarlint-icon.sonarlint.sonarqube.soundcloud.sourcegraph.sourcetree.spark.sparkpost.speakerdeck.speedcurve.spidermonkey-icon.spidermonkey.spinnaker.splunk.spotify-icon.spotify.spree.spring-icon.spring.sql-developer.sqlalchemy.sqlite.square.squarespace.ssh.sst-icon.sst.stability-ai-icon.stability-ai.stackbit-icon.stackbit.stackblitz-icon.stackblitz.stackoverflow-icon.stackoverflow.stackshare.stata.stately-icon.stately.statuspage.stdlib-icon.stdlib.steam.stenciljs-icon.stenciljs.stetho.stickermule.stigg-icon.stigg.stimulus-icon.stimulus.stitch.stoplight.storyblocks-icon.storyblocks.storyblok-icon.storyblok.storybook-icon.storybook.strapi-icon.strapi.streamlit.strider.stripe.struts.styleci.stylefmt.stylelint.stylis.stylus.stytch.sublimetext-icon.sublimetext.subversion.sugarss.supabase-icon.supabase.supertokens-icon.supertokens.surge.surrealdb-icon.surrealdb.survicate-icon.survicate.suse.susy.svelte-icon.svelte-kit.svelte.svg.svgator.swagger.swc.swift.swiftype.swimm.swr.symfony.sysdig-icon.sysdig.t3.tableau-icon.tableau.taiga.tailwindcss-icon.tailwindcss.tapcart-icon.tapcart.taskade-icon.taskade.tastejs.tauri.tealium.teamcity.teamgrid.teamwork-icon.teamwork.telegram.tensorflow.terminal.terraform-icon.terraform.terser-icon.terser.testcafe.testing-library.testlodge.tex.the-algorithms.threejs.thymeleaf-icon.thymeleaf.tidal-icon.tidal.tiktok-icon.tiktok.titanium-sdk.tnw.todoist-icon.todoist.todomvc.tomcat.toml.tor-browser.tor.tortoise-git.tower.traackr.trac.traefik-mesh.traefik-proxy.travis-ci-monochrome.travis-ci.treasuredata-icon.treasuredata.treehouse-icon.treehouse.trello.trpc.truffle-icon.truffle.tsmc.tsnode.tsuru.tumblr-icon.tumblr.tunein.tuple.turbopack-icon.turbopack.turborepo-icon.turborepo.turret.twilio-icon.twilio.twitch.twitter.typeform-icon.typeform.typeorm.typescript-icon-round.typescript-icon.typescript.typesense-icon.typesense.typo3-icon.typo3.ubuntu.udacity-icon.udacity.udemy-icon.udemy.uikit.uml.umu.unbounce-icon.unbounce.undertow.unionpay.unitjs.unito-icon.unito.unity.unix.unjs.unocss.unrealengine-icon.unrealengine.upcase.upstash-icon.upstash.upwork.user-testing-icon.user-testing.uservoice-icon.uservoice.uwsgi.v8-ignition.v8-turbofan.v8.vaadin.vaddy.vagrant-icon.vagrant.vala.vault-icon.vault.vector.vercel-icon.vercel.verdaccio-icon.verdaccio.vernemq.veutify.vim.vimeo-icon.vimeo.visa.visaelectron.visual-studio-code.visual-studio.vite.vitejs.vitess.vitest.vivaldi-icon.vivaldi.vlang.vmware.void.volar.vorejs.vscode.vsphere.vue-storefront.vue.vuetifyjs.vueuse.vulkan.vultr-icon.vultr.vwo.vyper.w3c.waffle-icon.waffle.wagtail.wakatime.walkme.watchman.waypoint-icon.waypoint.wayscript-icon.wayscript.wearos.weave.web-dev-icon.web-dev.web3js.webassembly.webcomponents.webdriverio.webflow.webgpu.webhint-icon.webhint.webhooks.webix-icon.webix.webkit.weblate.webmin.webpack.webplatform.webrtc.websocket.webstorm.webtorrent.weebly.whalar-icon.whalar.whatsapp-icon.whatsapp-monochrome-icon.whatsapp.whatwg.wicket-icon.wicket.wifi.wildfly.windi-css.windows11.windows8.winglang-icon.winglang.wire.wix.wmr.woo-commerce.woocommerce-icon.woopra.wordpress-icon-alt.wordpress-icon.wordpress.workboard.workos-icon.workos.workplace-icon.workplace.wpengine.wufoo.x.xamarin.xampp.xata-icon.xata.xcart.xcode.xero.xml.xray-for-jira.xstate.xtend.xwiki-icon.xwiki.yahoo.yaml.yammer.yandex-ru.yarn.ycombinator.yeoman.yii-framework.yii.youtrack.youtube-icon.youtube.yugabyte-icon.yugabyte.yuno-host.zabbix.zapier.zend-framework.zendesk-icon.zendesk.zenhub-icon.zenhub.zeplin.zeroheight-icon.zeroheight.zig.zod.zoho.zoom-icon.zoom.zorin-os.zsh.zube.zulip-icon.zulip.zwave`.split(`.`),bootstrap:`0-circle-fill.0-circle.0-square-fill.0-square.1-circle-fill.1-circle.1-square-fill.1-square.123.2-circle-fill.2-circle.2-square-fill.2-square.3-circle-fill.3-circle.3-square-fill.3-square.4-circle-fill.4-circle.4-square-fill.4-square.5-circle-fill.5-circle.5-square-fill.5-square.6-circle-fill.6-circle.6-square-fill.6-square.7-circle-fill.7-circle.7-square-fill.7-square.8-circle-fill.8-circle.8-square-fill.8-square.9-circle-fill.9-circle.9-square-fill.9-square.activity.airplane-engines-fill.airplane-engines.airplane-fill.airplane.alarm-fill.alarm.alexa.align-bottom.align-center.align-end.align-middle.align-start.align-top.alipay.alphabet-uppercase.alphabet.alt.amazon.amd.android.android2.app-indicator.app.apple.archive-fill.archive.arrow-90deg-down.arrow-90deg-left.arrow-90deg-right.arrow-90deg-up.arrow-bar-down.arrow-bar-left.arrow-bar-right.arrow-bar-up.arrow-clockwise.arrow-counterclockwise.arrow-down-circle-fill.arrow-down-circle.arrow-down-left-circle-fill.arrow-down-left-circle.arrow-down-left-square-fill.arrow-down-left-square.arrow-down-left.arrow-down-right-circle-fill.arrow-down-right-circle.arrow-down-right-square-fill.arrow-down-right-square.arrow-down-right.arrow-down-short.arrow-down-square-fill.arrow-down-square.arrow-down-up.arrow-down.arrow-left-circle-fill.arrow-left-circle.arrow-left-right.arrow-left-short.arrow-left-square-fill.arrow-left-square.arrow-left.arrow-repeat.arrow-return-left.arrow-return-right.arrow-right-circle-fill.arrow-right-circle.arrow-right-short.arrow-right-square-fill.arrow-right-square.arrow-right.arrow-through-heart-fill.arrow-through-heart.arrow-up-circle-fill.arrow-up-circle.arrow-up-left-circle-fill.arrow-up-left-circle.arrow-up-left-square-fill.arrow-up-left-square.arrow-up-left.arrow-up-right-circle-fill.arrow-up-right-circle.arrow-up-right-square-fill.arrow-up-right-square.arrow-up-right.arrow-up-short.arrow-up-square-fill.arrow-up-square.arrow-up.arrows-angle-contract.arrows-angle-expand.arrows-collapse-vertical.arrows-collapse.arrows-expand-vertical.arrows-expand.arrows-fullscreen.arrows-move.arrows-vertical.arrows.aspect-ratio-fill.aspect-ratio.asterisk.at.award-fill.award.back.backpack-fill.backpack.backpack2-fill.backpack2.backpack3-fill.backpack3.backpack4-fill.backpack4.backspace-fill.backspace-reverse-fill.backspace-reverse.backspace.badge-3d-fill.badge-3d.badge-4k-fill.badge-4k.badge-8k-fill.badge-8k.badge-ad-fill.badge-ad.badge-ar-fill.badge-ar.badge-cc-fill.badge-cc.badge-hd-fill.badge-hd.badge-sd-fill.badge-sd.badge-tm-fill.badge-tm.badge-vo-fill.badge-vo.badge-vr-fill.badge-vr.badge-wc-fill.badge-wc.bag-check-fill.bag-check.bag-dash-fill.bag-dash.bag-fill.bag-heart-fill.bag-heart.bag-plus-fill.bag-plus.bag-x-fill.bag-x.bag.balloon-fill.balloon-heart-fill.balloon-heart.balloon.ban-fill.ban.bandaid-fill.bandaid.bank.bank2.bar-chart-fill.bar-chart-line-fill.bar-chart-line.bar-chart-steps.bar-chart.basket-fill.basket.basket2-fill.basket2.basket3-fill.basket3.battery-charging.battery-full.battery-half.battery.behance.bell-fill.bell-slash-fill.bell-slash.bell.bezier.bezier2.bicycle.bing.binoculars-fill.binoculars.blockquote-left.blockquote-right.bluetooth.body-text.book-fill.book-half.book.bookmark-check-fill.bookmark-check.bookmark-dash-fill.bookmark-dash.bookmark-fill.bookmark-heart-fill.bookmark-heart.bookmark-plus-fill.bookmark-plus.bookmark-star-fill.bookmark-star.bookmark-x-fill.bookmark-x.bookmark.bookmarks-fill.bookmarks.bookshelf.boombox-fill.boombox.bootstrap-fill.bootstrap-icons.bootstrap-reboot.bootstrap.border-all.border-bottom.border-center.border-inner.border-left.border-middle.border-outer.border-right.border-style.border-top.border-width.border.bounding-box-circles.bounding-box.box-arrow-down-left.box-arrow-down-right.box-arrow-down.box-arrow-in-down-left.box-arrow-in-down-right.box-arrow-in-down.box-arrow-in-left.box-arrow-in-right.box-arrow-in-up-left.box-arrow-in-up-right.box-arrow-in-up.box-arrow-left.box-arrow-right.box-arrow-up-left.box-arrow-up-right.box-arrow-up.box-fill.box-seam-fill.box-seam.box.box2-fill.box2-heart-fill.box2-heart.box2.boxes.braces-asterisk.braces.bricks.briefcase-fill.briefcase.brightness-alt-high-fill.brightness-alt-high.brightness-alt-low-fill.brightness-alt-low.brightness-high-fill.brightness-high.brightness-low-fill.brightness-low.brilliance.broadcast-pin.broadcast.browser-chrome.browser-edge.browser-firefox.browser-safari.brush-fill.brush.bucket-fill.bucket.bug-fill.bug.building-add.building-check.building-dash.building-down.building-exclamation.building-fill-add.building-fill-check.building-fill-dash.building-fill-down.building-fill-exclamation.building-fill-gear.building-fill-lock.building-fill-slash.building-fill-up.building-fill-x.building-fill.building-gear.building-lock.building-slash.building-up.building-x.building.buildings-fill.buildings.bullseye.bus-front-fill.bus-front.c-circle-fill.c-circle.c-square-fill.c-square.cake-fill.cake.cake2-fill.cake2.calculator-fill.calculator.calendar-check-fill.calendar-check.calendar-date-fill.calendar-date.calendar-day-fill.calendar-day.calendar-event-fill.calendar-event.calendar-fill.calendar-heart-fill.calendar-heart.calendar-minus-fill.calendar-minus.calendar-month-fill.calendar-month.calendar-plus-fill.calendar-plus.calendar-range-fill.calendar-range.calendar-week-fill.calendar-week.calendar-x-fill.calendar-x.calendar.calendar2-check-fill.calendar2-check.calendar2-date-fill.calendar2-date.calendar2-day-fill.calendar2-day.calendar2-event-fill.calendar2-event.calendar2-fill.calendar2-heart-fill.calendar2-heart.calendar2-minus-fill.calendar2-minus.calendar2-month-fill.calendar2-month.calendar2-plus-fill.calendar2-plus.calendar2-range-fill.calendar2-range.calendar2-week-fill.calendar2-week.calendar2-x-fill.calendar2-x.calendar2.calendar3-event-fill.calendar3-event.calendar3-fill.calendar3-range-fill.calendar3-range.calendar3-week-fill.calendar3-week.calendar3.calendar4-event.calendar4-range.calendar4-week.calendar4.camera-fill.camera-reels-fill.camera-reels.camera-video-fill.camera-video-off-fill.camera-video-off.camera-video.camera.camera2.capslock-fill.capslock.capsule-pill.capsule.car-front-fill.car-front.card-checklist.card-heading.card-image.card-list.card-text.caret-down-fill.caret-down-square-fill.caret-down-square.caret-down.caret-left-fill.caret-left-square-fill.caret-left-square.caret-left.caret-right-fill.caret-right-square-fill.caret-right-square.caret-right.caret-up-fill.caret-up-square-fill.caret-up-square.caret-up.cart-check-fill.cart-check.cart-dash-fill.cart-dash.cart-fill.cart-plus-fill.cart-plus.cart-x-fill.cart-x.cart.cart2.cart3.cart4.cash-coin.cash-stack.cash.cassette-fill.cassette.cast.cc-circle-fill.cc-circle.cc-square-fill.cc-square.chat-dots-fill.chat-dots.chat-fill.chat-heart-fill.chat-heart.chat-left-dots-fill.chat-left-dots.chat-left-fill.chat-left-heart-fill.chat-left-heart.chat-left-quote-fill.chat-left-quote.chat-left-text-fill.chat-left-text.chat-left.chat-quote-fill.chat-quote.chat-right-dots-fill.chat-right-dots.chat-right-fill.chat-right-heart-fill.chat-right-heart.chat-right-quote-fill.chat-right-quote.chat-right-text-fill.chat-right-text.chat-right.chat-square-dots-fill.chat-square-dots.chat-square-fill.chat-square-heart-fill.chat-square-heart.chat-square-quote-fill.chat-square-quote.chat-square-text-fill.chat-square-text.chat-square.chat-text-fill.chat-text.chat.check-all.check-circle-fill.check-circle.check-lg.check-square-fill.check-square.check.check2-all.check2-circle.check2-square.check2.chevron-bar-contract.chevron-bar-down.chevron-bar-expand.chevron-bar-left.chevron-bar-right.chevron-bar-up.chevron-compact-down.chevron-compact-left.chevron-compact-right.chevron-compact-up.chevron-contract.chevron-double-down.chevron-double-left.chevron-double-right.chevron-double-up.chevron-down.chevron-expand.chevron-left.chevron-right.chevron-up.circle-fill.circle-half.circle-square.circle.clipboard-check-fill.clipboard-check.clipboard-data-fill.clipboard-data.clipboard-fill.clipboard-heart-fill.clipboard-heart.clipboard-minus-fill.clipboard-minus.clipboard-plus-fill.clipboard-plus.clipboard-pulse.clipboard-x-fill.clipboard-x.clipboard.clipboard2-check-fill.clipboard2-check.clipboard2-data-fill.clipboard2-data.clipboard2-fill.clipboard2-heart-fill.clipboard2-heart.clipboard2-minus-fill.clipboard2-minus.clipboard2-plus-fill.clipboard2-plus.clipboard2-pulse-fill.clipboard2-pulse.clipboard2-x-fill.clipboard2-x.clipboard2.clock-fill.clock-history.clock.cloud-arrow-down-fill.cloud-arrow-down.cloud-arrow-up-fill.cloud-arrow-up.cloud-check-fill.cloud-check.cloud-download-fill.cloud-download.cloud-drizzle-fill.cloud-drizzle.cloud-fill.cloud-fog-fill.cloud-fog.cloud-fog2-fill.cloud-fog2.cloud-hail-fill.cloud-hail.cloud-haze-fill.cloud-haze.cloud-haze2-fill.cloud-haze2.cloud-lightning-fill.cloud-lightning-rain-fill.cloud-lightning-rain.cloud-lightning.cloud-minus-fill.cloud-minus.cloud-moon-fill.cloud-moon.cloud-plus-fill.cloud-plus.cloud-rain-fill.cloud-rain-heavy-fill.cloud-rain-heavy.cloud-rain.cloud-slash-fill.cloud-slash.cloud-sleet-fill.cloud-sleet.cloud-snow-fill.cloud-snow.cloud-sun-fill.cloud-sun.cloud-upload-fill.cloud-upload.cloud.clouds-fill.clouds.cloudy-fill.cloudy.code-slash.code-square.code.coin.collection-fill.collection-play-fill.collection-play.collection.columns-gap.columns.command.compass-fill.compass.cone-striped.cone.controller.cookie.copy.cpu-fill.cpu.credit-card-2-back-fill.credit-card-2-back.credit-card-2-front-fill.credit-card-2-front.credit-card-fill.credit-card.crop.crosshair.crosshair2.cup-fill.cup-hot-fill.cup-hot.cup-straw.cup.currency-bitcoin.currency-dollar.currency-euro.currency-exchange.currency-pound.currency-rupee.currency-yen.cursor-fill.cursor-text.cursor.dash-circle-dotted.dash-circle-fill.dash-circle.dash-lg.dash-square-dotted.dash-square-fill.dash-square.dash.database-add.database-check.database-dash.database-down.database-exclamation.database-fill-add.database-fill-check.database-fill-dash.database-fill-down.database-fill-exclamation.database-fill-gear.database-fill-lock.database-fill-slash.database-fill-up.database-fill-x.database-fill.database-gear.database-lock.database-slash.database-up.database-x.database.device-hdd-fill.device-hdd.device-ssd-fill.device-ssd.diagram-2-fill.diagram-2.diagram-3-fill.diagram-3.diamond-fill.diamond-half.diamond.dice-1-fill.dice-1.dice-2-fill.dice-2.dice-3-fill.dice-3.dice-4-fill.dice-4.dice-5-fill.dice-5.dice-6-fill.dice-6.disc-fill.disc.discord.display-fill.display.displayport-fill.displayport.distribute-horizontal.distribute-vertical.door-closed-fill.door-closed.door-open-fill.door-open.dot.download.dpad-fill.dpad.dribbble.dropbox.droplet-fill.droplet-half.droplet.duffle-fill.duffle.ear-fill.ear.earbuds.easel-fill.easel.easel2-fill.easel2.easel3-fill.easel3.egg-fill.egg-fried.egg.eject-fill.eject.emoji-angry-fill.emoji-angry.emoji-astonished-fill.emoji-astonished.emoji-dizzy-fill.emoji-dizzy.emoji-expressionless-fill.emoji-expressionless.emoji-frown-fill.emoji-frown.emoji-grimace-fill.emoji-grimace.emoji-grin-fill.emoji-grin.emoji-heart-eyes-fill.emoji-heart-eyes.emoji-kiss-fill.emoji-kiss.emoji-laughing-fill.emoji-laughing.emoji-neutral-fill.emoji-neutral.emoji-smile-fill.emoji-smile-upside-down-fill.emoji-smile-upside-down.emoji-smile.emoji-sunglasses-fill.emoji-sunglasses.emoji-surprise-fill.emoji-surprise.emoji-tear-fill.emoji-tear.emoji-wink-fill.emoji-wink.envelope-arrow-down-fill.envelope-arrow-down.envelope-arrow-up-fill.envelope-arrow-up.envelope-at-fill.envelope-at.envelope-check-fill.envelope-check.envelope-dash-fill.envelope-dash.envelope-exclamation-fill.envelope-exclamation.envelope-fill.envelope-heart-fill.envelope-heart.envelope-open-fill.envelope-open-heart-fill.envelope-open-heart.envelope-open.envelope-paper-fill.envelope-paper-heart-fill.envelope-paper-heart.envelope-paper.envelope-plus-fill.envelope-plus.envelope-slash-fill.envelope-slash.envelope-x-fill.envelope-x.envelope.eraser-fill.eraser.escape.ethernet.ev-front-fill.ev-front.ev-station-fill.ev-station.exclamation-circle-fill.exclamation-circle.exclamation-diamond-fill.exclamation-diamond.exclamation-lg.exclamation-octagon-fill.exclamation-octagon.exclamation-square-fill.exclamation-square.exclamation-triangle-fill.exclamation-triangle.exclamation.exclude.explicit-fill.explicit.exposure.eye-fill.eye-slash-fill.eye-slash.eye.eyedropper.eyeglasses.facebook.fan.fast-forward-btn-fill.fast-forward-btn.fast-forward-circle-fill.fast-forward-circle.fast-forward-fill.fast-forward.feather.feather2.file-arrow-down-fill.file-arrow-down.file-arrow-up-fill.file-arrow-up.file-bar-graph-fill.file-bar-graph.file-binary-fill.file-binary.file-break-fill.file-break.file-check-fill.file-check.file-code-fill.file-code.file-diff-fill.file-diff.file-earmark-arrow-down-fill.file-earmark-arrow-down.file-earmark-arrow-up-fill.file-earmark-arrow-up.file-earmark-bar-graph-fill.file-earmark-bar-graph.file-earmark-binary-fill.file-earmark-binary.file-earmark-break-fill.file-earmark-break.file-earmark-check-fill.file-earmark-check.file-earmark-code-fill.file-earmark-code.file-earmark-diff-fill.file-earmark-diff.file-earmark-easel-fill.file-earmark-easel.file-earmark-excel-fill.file-earmark-excel.file-earmark-fill.file-earmark-font-fill.file-earmark-font.file-earmark-image-fill.file-earmark-image.file-earmark-lock-fill.file-earmark-lock.file-earmark-lock2-fill.file-earmark-lock2.file-earmark-medical-fill.file-earmark-medical.file-earmark-minus-fill.file-earmark-minus.file-earmark-music-fill.file-earmark-music.file-earmark-pdf-fill.file-earmark-pdf.file-earmark-person-fill.file-earmark-person.file-earmark-play-fill.file-earmark-play.file-earmark-plus-fill.file-earmark-plus.file-earmark-post-fill.file-earmark-post.file-earmark-ppt-fill.file-earmark-ppt.file-earmark-richtext-fill.file-earmark-richtext.file-earmark-ruled-fill.file-earmark-ruled.file-earmark-slides-fill.file-earmark-slides.file-earmark-spreadsheet-fill.file-earmark-spreadsheet.file-earmark-text-fill.file-earmark-text.file-earmark-word-fill.file-earmark-word.file-earmark-x-fill.file-earmark-x.file-earmark-zip-fill.file-earmark-zip.file-earmark.file-easel-fill.file-easel.file-excel-fill.file-excel.file-fill.file-font-fill.file-font.file-image-fill.file-image.file-lock-fill.file-lock.file-lock2-fill.file-lock2.file-medical-fill.file-medical.file-minus-fill.file-minus.file-music-fill.file-music.file-pdf-fill.file-pdf.file-person-fill.file-person.file-play-fill.file-play.file-plus-fill.file-plus.file-post-fill.file-post.file-ppt-fill.file-ppt.file-richtext-fill.file-richtext.file-ruled-fill.file-ruled.file-slides-fill.file-slides.file-spreadsheet-fill.file-spreadsheet.file-text-fill.file-text.file-word-fill.file-word.file-x-fill.file-x.file-zip-fill.file-zip.file.files-alt.files.filetype-aac.filetype-ai.filetype-bmp.filetype-cs.filetype-css.filetype-csv.filetype-doc.filetype-docx.filetype-exe.filetype-gif.filetype-heic.filetype-html.filetype-java.filetype-jpg.filetype-js.filetype-json.filetype-jsx.filetype-key.filetype-m4p.filetype-md.filetype-mdx.filetype-mov.filetype-mp3.filetype-mp4.filetype-otf.filetype-pdf.filetype-php.filetype-png.filetype-ppt.filetype-pptx.filetype-psd.filetype-py.filetype-raw.filetype-rb.filetype-sass.filetype-scss.filetype-sh.filetype-sql.filetype-svg.filetype-tiff.filetype-tsx.filetype-ttf.filetype-txt.filetype-wav.filetype-woff.filetype-xls.filetype-xlsx.filetype-xml.filetype-yml.film.filter-circle-fill.filter-circle.filter-left.filter-right.filter-square-fill.filter-square.filter.fingerprint.fire.flag-fill.flag.floppy-fill.floppy.floppy2-fill.floppy2.flower1.flower2.flower3.folder-check.folder-fill.folder-minus.folder-plus.folder-symlink-fill.folder-symlink.folder-x.folder.folder2-open.folder2.fonts.forward-fill.forward.front.fuel-pump-diesel-fill.fuel-pump-diesel.fuel-pump-fill.fuel-pump.fullscreen-exit.fullscreen.funnel-fill.funnel.gear-fill.gear-wide-connected.gear-wide.gear.gem.gender-ambiguous.gender-female.gender-male.gender-neuter.gender-trans.geo-alt-fill.geo-alt.geo-fill.geo.gift-fill.gift.git.github.gitlab.globe-americas.globe-asia-australia.globe-central-south-asia.globe-europe-africa.globe.globe2.google-play.google.gpu-card.graph-down-arrow.graph-down.graph-up-arrow.graph-up.grid-1x2-fill.grid-1x2.grid-3x2-gap-fill.grid-3x2-gap.grid-3x2.grid-3x3-gap-fill.grid-3x3-gap.grid-3x3.grid-fill.grid.grip-horizontal.grip-vertical.h-circle-fill.h-circle.h-square-fill.h-square.hammer.hand-index-fill.hand-index-thumb-fill.hand-index-thumb.hand-index.hand-thumbs-down-fill.hand-thumbs-down.hand-thumbs-up-fill.hand-thumbs-up.handbag-fill.handbag.hash.hdd-fill.hdd-network-fill.hdd-network.hdd-rack-fill.hdd-rack.hdd-stack-fill.hdd-stack.hdd.hdmi-fill.hdmi.headphones.headset-vr.headset.heart-arrow.heart-fill.heart-half.heart-pulse-fill.heart-pulse.heart.heartbreak-fill.heartbreak.hearts.heptagon-fill.heptagon-half.heptagon.hexagon-fill.hexagon-half.hexagon.highlighter.highlights.hospital-fill.hospital.hourglass-bottom.hourglass-split.hourglass-top.hourglass.house-add-fill.house-add.house-check-fill.house-check.house-dash-fill.house-dash.house-door-fill.house-door.house-down-fill.house-down.house-exclamation-fill.house-exclamation.house-fill.house-gear-fill.house-gear.house-heart-fill.house-heart.house-lock-fill.house-lock.house-slash-fill.house-slash.house-up-fill.house-up.house-x-fill.house-x.house.houses-fill.houses.hr.hurricane.hypnotize.image-alt.image-fill.image.images.inbox-fill.inbox.inboxes-fill.inboxes.incognito.indent.infinity.info-circle-fill.info-circle.info-lg.info-square-fill.info-square.info.input-cursor-text.input-cursor.instagram.intersect.journal-album.journal-arrow-down.journal-arrow-up.journal-bookmark-fill.journal-bookmark.journal-check.journal-code.journal-medical.journal-minus.journal-plus.journal-richtext.journal-text.journal-x.journal.journals.joystick.justify-left.justify-right.justify.kanban-fill.kanban.key-fill.key.keyboard-fill.keyboard.ladder.lamp-fill.lamp.laptop-fill.laptop.layer-backward.layer-forward.layers-fill.layers-half.layers.layout-sidebar-inset-reverse.layout-sidebar-inset.layout-sidebar-reverse.layout-sidebar.layout-split.layout-text-sidebar-reverse.layout-text-sidebar.layout-text-window-reverse.layout-text-window.layout-three-columns.layout-wtf.life-preserver.lightbulb-fill.lightbulb-off-fill.lightbulb-off.lightbulb.lightning-charge-fill.lightning-charge.lightning-fill.lightning.line.link-45deg.link.linkedin.list-check.list-columns-reverse.list-columns.list-nested.list-ol.list-stars.list-task.list-ul.list.lock-fill.lock.luggage-fill.luggage.lungs-fill.lungs.magic.magnet-fill.magnet.mailbox-flag.mailbox.mailbox2-flag.mailbox2.map-fill.map.markdown-fill.markdown.marker-tip.mask.mastodon.medium.megaphone-fill.megaphone.memory.menu-app-fill.menu-app.menu-button-fill.menu-button-wide-fill.menu-button-wide.menu-button.menu-down.menu-up.messenger.meta.mic-fill.mic-mute-fill.mic-mute.mic.microsoft-teams.microsoft.minecart-loaded.minecart.modem-fill.modem.moisture.moon-fill.moon-stars-fill.moon-stars.moon.mortarboard-fill.mortarboard.motherboard-fill.motherboard.mouse-fill.mouse.mouse2-fill.mouse2.mouse3-fill.mouse3.music-note-beamed.music-note-list.music-note.music-player-fill.music-player.newspaper.nintendo-switch.node-minus-fill.node-minus.node-plus-fill.node-plus.noise-reduction.nut-fill.nut.nvidia.nvme-fill.nvme.octagon-fill.octagon-half.octagon.opencollective.optical-audio-fill.optical-audio.option.outlet.p-circle-fill.p-circle.p-square-fill.p-square.paint-bucket.palette-fill.palette.palette2.paperclip.paragraph.pass-fill.pass.passport-fill.passport.patch-check-fill.patch-check.patch-exclamation-fill.patch-exclamation.patch-minus-fill.patch-minus.patch-plus-fill.patch-plus.patch-question-fill.patch-question.pause-btn-fill.pause-btn.pause-circle-fill.pause-circle.pause-fill.pause.paypal.pc-display-horizontal.pc-display.pc-horizontal.pc.pci-card-network.pci-card-sound.pci-card.peace-fill.peace.pen-fill.pen.pencil-fill.pencil-square.pencil.pentagon-fill.pentagon-half.pentagon.people-fill.people.percent.person-add.person-arms-up.person-badge-fill.person-badge.person-bounding-box.person-check-fill.person-check.person-circle.person-dash-fill.person-dash.person-down.person-exclamation.person-fill-add.person-fill-check.person-fill-dash.person-fill-down.person-fill-exclamation.person-fill-gear.person-fill-lock.person-fill-slash.person-fill-up.person-fill-x.person-fill.person-gear.person-heart.person-hearts.person-lines-fill.person-lock.person-plus-fill.person-plus.person-raised-hand.person-rolodex.person-slash.person-square.person-standing-dress.person-standing.person-up.person-vcard-fill.person-vcard.person-video.person-video2.person-video3.person-walking.person-wheelchair.person-workspace.person-x-fill.person-x.person.phone-fill.phone-flip.phone-landscape-fill.phone-landscape.phone-vibrate-fill.phone-vibrate.phone.pie-chart-fill.pie-chart.piggy-bank-fill.piggy-bank.pin-angle-fill.pin-angle.pin-fill.pin-map-fill.pin-map.pin.pinterest.pip-fill.pip.play-btn-fill.play-btn.play-circle-fill.play-circle.play-fill.play.playstation.plug-fill.plug.plugin.plus-circle-dotted.plus-circle-fill.plus-circle.plus-lg.plus-slash-minus.plus-square-dotted.plus-square-fill.plus-square.plus.postage-fill.postage-heart-fill.postage-heart.postage.postcard-fill.postcard-heart-fill.postcard-heart.postcard.power.prescription.prescription2.printer-fill.printer.projector-fill.projector.puzzle-fill.puzzle.qr-code-scan.qr-code.question-circle-fill.question-circle.question-diamond-fill.question-diamond.question-lg.question-octagon-fill.question-octagon.question-square-fill.question-square.question.quora.quote.r-circle-fill.r-circle.r-square-fill.r-square.radar.radioactive.rainbow.receipt-cutoff.receipt.reception-0.reception-1.reception-2.reception-3.reception-4.record-btn-fill.record-btn.record-circle-fill.record-circle.record-fill.record.record2-fill.record2.recycle.reddit.regex.repeat-1.repeat.reply-all-fill.reply-all.reply-fill.reply.rewind-btn-fill.rewind-btn.rewind-circle-fill.rewind-circle.rewind-fill.rewind.robot.rocket-fill.rocket-takeoff-fill.rocket-takeoff.rocket.router-fill.router.rss-fill.rss.rulers.safe-fill.safe.safe2-fill.safe2.save-fill.save.save2-fill.save2.scissors.scooter.screwdriver.sd-card-fill.sd-card.search-heart-fill.search-heart.search.segmented-nav.send-arrow-down-fill.send-arrow-down.send-arrow-up-fill.send-arrow-up.send-check-fill.send-check.send-dash-fill.send-dash.send-exclamation-fill.send-exclamation.send-fill.send-plus-fill.send-plus.send-slash-fill.send-slash.send-x-fill.send-x.send.server.shadows.share-fill.share.shield-check.shield-exclamation.shield-fill-check.shield-fill-exclamation.shield-fill-minus.shield-fill-plus.shield-fill-x.shield-fill.shield-lock-fill.shield-lock.shield-minus.shield-plus.shield-shaded.shield-slash-fill.shield-slash.shield-x.shield.shift-fill.shift.shop-window.shop.shuffle.sign-dead-end-fill.sign-dead-end.sign-do-not-enter-fill.sign-do-not-enter.sign-intersection-fill.sign-intersection-side-fill.sign-intersection-side.sign-intersection-t-fill.sign-intersection-t.sign-intersection-y-fill.sign-intersection-y.sign-intersection.sign-merge-left-fill.sign-merge-left.sign-merge-right-fill.sign-merge-right.sign-no-left-turn-fill.sign-no-left-turn.sign-no-parking-fill.sign-no-parking.sign-no-right-turn-fill.sign-no-right-turn.sign-railroad-fill.sign-railroad.sign-stop-fill.sign-stop-lights-fill.sign-stop-lights.sign-stop.sign-turn-left-fill.sign-turn-left.sign-turn-right-fill.sign-turn-right.sign-turn-slight-left-fill.sign-turn-slight-left.sign-turn-slight-right-fill.sign-turn-slight-right.sign-yield-fill.sign-yield.signal.signpost-2-fill.signpost-2.signpost-fill.signpost-split-fill.signpost-split.signpost.sim-fill.sim-slash-fill.sim-slash.sim.sina-weibo.skip-backward-btn-fill.skip-backward-btn.skip-backward-circle-fill.skip-backward-circle.skip-backward-fill.skip-backward.skip-end-btn-fill.skip-end-btn.skip-end-circle-fill.skip-end-circle.skip-end-fill.skip-end.skip-forward-btn-fill.skip-forward-btn.skip-forward-circle-fill.skip-forward-circle.skip-forward-fill.skip-forward.skip-start-btn-fill.skip-start-btn.skip-start-circle-fill.skip-start-circle.skip-start-fill.skip-start.skype.slack.slash-circle-fill.slash-circle.slash-lg.slash-square-fill.slash-square.slash.sliders.sliders2-vertical.sliders2.smartwatch.snapchat.snow.snow2.snow3.sort-alpha-down-alt.sort-alpha-down.sort-alpha-up-alt.sort-alpha-up.sort-down-alt.sort-down.sort-numeric-down-alt.sort-numeric-down.sort-numeric-up-alt.sort-numeric-up.sort-up-alt.sort-up.soundwave.sourceforge.speaker-fill.speaker.speedometer.speedometer2.spellcheck.spotify.square-fill.square-half.square.stack-overflow.stack.star-fill.star-half.star.stars.steam.stickies-fill.stickies.sticky-fill.sticky.stop-btn-fill.stop-btn.stop-circle-fill.stop-circle.stop-fill.stop.stoplights-fill.stoplights.stopwatch-fill.stopwatch.strava.stripe.subscript.substack.subtract.suit-club-fill.suit-club.suit-diamond-fill.suit-diamond.suit-heart-fill.suit-heart.suit-spade-fill.suit-spade.suitcase-fill.suitcase-lg-fill.suitcase-lg.suitcase.suitcase2-fill.suitcase2.sun-fill.sun.sunglasses.sunrise-fill.sunrise.sunset-fill.sunset.superscript.symmetry-horizontal.symmetry-vertical.table.tablet-fill.tablet-landscape-fill.tablet-landscape.tablet.tag-fill.tag.tags-fill.tags.taxi-front-fill.taxi-front.telegram.telephone-fill.telephone-forward-fill.telephone-forward.telephone-inbound-fill.telephone-inbound.telephone-minus-fill.telephone-minus.telephone-outbound-fill.telephone-outbound.telephone-plus-fill.telephone-plus.telephone-x-fill.telephone-x.telephone.tencent-qq.terminal-dash.terminal-fill.terminal-plus.terminal-split.terminal-x.terminal.text-center.text-indent-left.text-indent-right.text-left.text-paragraph.text-right.text-wrap.textarea-resize.textarea-t.textarea.thermometer-half.thermometer-high.thermometer-low.thermometer-snow.thermometer-sun.thermometer.threads-fill.threads.three-dots-vertical.three-dots.thunderbolt-fill.thunderbolt.ticket-detailed-fill.ticket-detailed.ticket-fill.ticket-perforated-fill.ticket-perforated.ticket.tiktok.toggle-off.toggle-on.toggle2-off.toggle2-on.toggles.toggles2.tools.tornado.train-freight-front-fill.train-freight-front.train-front-fill.train-front.train-lightrail-front-fill.train-lightrail-front.translate.transparency.trash-fill.trash.trash2-fill.trash2.trash3-fill.trash3.tree-fill.tree.trello.triangle-fill.triangle-half.triangle.trophy-fill.trophy.tropical-storm.truck-flatbed.truck-front-fill.truck-front.truck.tsunami.tv-fill.tv.twitch.twitter-x.twitter.type-bold.type-h1.type-h2.type-h3.type-h4.type-h5.type-h6.type-italic.type-strikethrough.type-underline.type.ubuntu.ui-checks-grid.ui-checks.ui-radios-grid.ui-radios.umbrella-fill.umbrella.unindent.union.unity.universal-access-circle.universal-access.unlock-fill.unlock.upc-scan.upc.upload.usb-c-fill.usb-c.usb-drive-fill.usb-drive.usb-fill.usb-micro-fill.usb-micro.usb-mini-fill.usb-mini.usb-plug-fill.usb-plug.usb-symbol.usb.valentine.valentine2.vector-pen.view-list.view-stacked.vignette.vimeo.vinyl-fill.vinyl.virus.virus2.voicemail.volume-down-fill.volume-down.volume-mute-fill.volume-mute.volume-off-fill.volume-off.volume-up-fill.volume-up.vr.wallet-fill.wallet.wallet2.watch.water.webcam-fill.webcam.wechat.whatsapp.wifi-1.wifi-2.wifi-off.wifi.wikipedia.wind.window-dash.window-desktop.window-dock.window-fullscreen.window-plus.window-sidebar.window-split.window-stack.window-x.window.windows.wordpress.wrench-adjustable-circle-fill.wrench-adjustable-circle.wrench-adjustable.wrench.x-circle-fill.x-circle.x-diamond-fill.x-diamond.x-lg.x-octagon-fill.x-octagon.x-square-fill.x-square.x.xbox.yelp.yin-yang.youtube.zoom-in.zoom-out`.split(`.`)})].flatMap(([i,a])=>a.map(a=>i+`:`+a)).map(i=>` `+i),` }`,`}`].join(`
17
+ `),Scheme=`likec4builtin`,Uri=`${Scheme}:///likec4/lib/icons.c4`;function isLikeC4Builtin(i){return(`uri`in i?i.uri:i).scheme===Scheme}function isNotLikeC4Builtin(i){return!isLikeC4Builtin(i)}var NoopFileSystemProvider=class{scanProjectFiles(){return Promise.resolve([])}scanDirectory(){return Promise.resolve([])}readFile(i){if(isLikeC4Builtin(i))return Promise.resolve(LibIcons);throw Error(`No file system is available.`)}readDirectory(){return Promise.resolve([])}loadProjectConfig(){throw Error(`No file system is available.`)}writeFile(){throw Error(`No file system is available.`)}deleteFile(){throw Error(`No file system is available.`)}},NoopFileSystemWatcher=class{watch(){}dispose(){return Promise.resolve()}},NoopLikeC4ManualLayouts=class{read(){return Promise.resolve(null)}write(){return Promise.reject(Error(`NoopLikeC4ManualLayouts: write operation is not supported`))}remove(){return Promise.resolve(null)}clearCaches(){}};const NoFileSystemWatcher={fileSystemWatcher:()=>new NoopFileSystemWatcher},NoFileSystem={fileSystemProvider:()=>new NoopFileSystemProvider,...NoFileSystemWatcher},NoLikeC4ManualLayouts={manualLayouts:()=>new NoopLikeC4ManualLayouts},JsonConfigInputSchema=LikeC4ProjectJsonConfigSchema.pick({extends:!0,styles:!0}).loose(),normalizeExtends=i=>i?Array.isArray(i)?i:[i]:[],parseJsonConfig=async i=>{let a=await fs$2.readFile(i,`utf-8`),o;try{o=lib.parse(a.trim()||`{}`)}catch(a){throw wrapError(a,`${i}:`)}if(!o||typeof o!=`object`||Array.isArray(o))throw Error(`${i}: Config must be a JSON object`);let s=JsonConfigInputSchema.safeParse(o);if(!s.success)throw Error(`${i}: Invalid config\n`+v4_default.prettifyError(s.error));return s.data},loadJsonConfigs=async(i,a)=>{if(a.includes(i)){let o=a.indexOf(i),s=[...a.slice(o),i].join(` -> `);throw Error(`Config extends cycle detected: ${s}`)}let o=await parseJsonConfig(i),s=normalizeExtends(o.extends),c=[...a,i],l=[];for(let a of s){let o=resolve(dirname(i),a);l.push(...await loadJsonConfigs(o,c))}return[...l,o]};async function loadConfig(i){i=typeof i==`string`?i:i.fsPath,logger$17.getChild(`config`).debug`Loading config: ${i}`;let a=dirname(i),o=basename(i),s={name:basename(a)};if(isLikeC4JsonConfig(o)){let a=await loadJsonConfigs(resolve(i),[]);invariant(t$4(a,1),`Expect at least one config`);let o=n(t$5(a),[`extends`,`styles`]),c=a.map(i=>i.styles).filter(e$1),d=c.length>0?defu({},...c.reverse()):void 0;return validateProjectConfig({...s,...o,...d?{styles:d}:{}})}invariant(isLikeC4NonJsonConfig(o),`Invalid name for config file: ${i}`);let{mod:c}=await bundleRequire({filepath:i,cwd:a,esbuildOptions:{resolveExtensions:[`.ts`,`.mts`,`.cts`,`.mjs`,`.js`,`.cjs`],plugins:[{name:`likec4-config`,setup(i){i.onResolve({filter:/^@?likec4\/config$/},i=>({path:i.path,namespace:`likec4-config`})),i.onEnd(i=>{let a=formatMessagesSync(i.errors,{kind:`error`});for(let i of a)logger$17.error(i)}),i.onLoad({filter:/.*/,namespace:`likec4-config`},i=>({contents:`
18
+ // Mock implementation to allow loading config files without bundling @likec4/config
19
+ function mock(x) { return x }
20
+ export {
21
+ mock as defineConfig,
22
+ mock as defineGenerators,
23
+ mock as defineStyle,
24
+ mock as defineTheme,
25
+ mock as defineThemeColor,
26
+ }`,loader:`js`}))}}]}});return validateProjectConfig(Object.assign(s,c?.default??c))}const logger$16=logger$17.getChild(`server`);function logWarnError(i){logger$16.warn(loggable(i))}init_main();const layoutsLogger=logger$16.getChild(`manual-layouts`),isManualLayoutFile=i=>i.endsWith(`.likec4.snap`);function fileName(i){return`${i}.likec4.snap`}function getManualLayoutsOutDir(i){return UriUtils.resolvePath(i.folderUri,i.config.manualLayouts?.outDir??`.likec4`)}const WithLikeC4ManualLayouts={manualLayouts:i=>new DefaultLikeC4ManualLayouts(i)},RELATIVE_PATH_PREFIX=`file://./`;var DefaultLikeC4ManualLayouts=class{cache;constructor(i){this.services=i,this.cache=new SimpleCache,onNextTick(()=>{i.workspace.ProjectsManager.onProjectsUpdate(()=>{this.clearCaches()})})}async read(i){return await this.cache.get(i.id,async()=>{let a=layoutsLogger.getChild(i.id),o=this.services.workspace.FileSystemProvider,s=getManualLayoutsOutDir(i),c=[];try{let l=await o.scanDirectory(s,isManualLayoutFile);if(l.length===0)return null;for(let s of l)try{let a=await o.readFile(s.uri),l=lib.parse(a),d=this.resolveIconPathsAfterRead(l,i.folderUri);c.push({...d,_layout:`manual`})}catch(i){a.warn(`Failed to read view snapshot ${s.uri.fsPath}`,{err:i})}c.length&&a.debug`read manual layouts for ${i.id}, found ${c.length}`}catch(o){a.warn(`Failed to read manual layouts for ${i.folderUri.fsPath}`,{err:o})}if(c.length===0)return null;let l=t$6(c,e(`id`));return{hash:objectHash(l),views:l}})}async write(i,a){let o=layoutsLogger.getChild(i.id),s=getManualLayoutsOutDir(i),c=UriUtils.joinPath(s,fileName(a.id));if(`manualLayout`in a){let{manualLayout:i,...o}=a;a=o}let l=lib.stringify(this.normalizeIconPathsForWrite(a,i.folderUri),{space:2,quote:`'`}),d={uri:c.toString(),range:Range.create(Position.create(0,0),Position.create(l.split(`
27
+ `).length-1,1))};o.debug`write snapshot of ${a.id} in project ${i.id} to ${c.fsPath}`;let f=this.services.workspace.FileSystemProvider;try{await f.writeFile(c,l+`
28
+ `)}catch(i){o.warn(`Failed to write snapshot ${a.id} to ${c.fsPath}`,{err:i})}return this.cache.delete(i.id),d}async remove(i,a){let o=layoutsLogger.getChild(i.id),s=getManualLayoutsOutDir(i),c=UriUtils.joinPath(s,fileName(a));o.debug`delete snapshot of ${a} in project ${i.id}. File: ${c.fsPath}`;let l={uri:c.toString(),range:Range.create(0,0,0,0)};this.cache.delete(i.id);try{if(!await this.services.workspace.FileSystemProvider.deleteFile(c))return o.warn`Snapshot ${a} did not exist at ${c.fsPath}`,null}catch(i){o.warn(`Failed to delete snapshot ${a} from ${c.fsPath}`,{err:i})}return l}clearCaches(){layoutsLogger.trace`clear caches`,this.cache.clear()}normalizeIconPathsForWrite(i,a){let o=i.nodes.map(i=>{if(!i.icon||typeof i.icon!=`string`)return i;if(i.icon.startsWith(`file://`)){let o=URI.parse(i.icon),s=UriUtils.relative(a,o);return s.startsWith(`..`)?i:{...i,icon:`${RELATIVE_PATH_PREFIX}${s}`}}return i});return{...i,nodes:o}}resolveIconPathsAfterRead(i,a){let o=i.nodes.map(i=>{if(!i.icon||typeof i.icon!=`string`)return i;if(i.icon.startsWith(RELATIVE_PATH_PREFIX)){let o=i.icon.substring(9),s=UriUtils.joinPath(a,o);return{...i,icon:s.toString()}}return i});return{...i,nodes:o}}};const AnyProperty=`AnyProperty`;function isAnyProperty(i){return reflection.isInstance(i,AnyProperty)}const ColorLiteral=`ColorLiteral`;function isColorLiteral(i){return reflection.isInstance(i,ColorLiteral)}const DeploymentElement=`DeploymentElement`;function isDeploymentElement(i){return reflection.isInstance(i,DeploymentElement)}const DeploymentNodeOrElementKind=`DeploymentNodeOrElementKind`,DeploymentViewRule=`DeploymentViewRule`;function isDeploymentViewRule(i){return reflection.isInstance(i,DeploymentViewRule)}const DynamicViewProperty=`DynamicViewProperty`,DynamicViewRule=`DynamicViewRule`;function isDynamicViewRule(i){return reflection.isInstance(i,DynamicViewRule)}const DynamicViewStep=`DynamicViewStep`;function isDynamicViewStep(i){return reflection.isInstance(i,DynamicViewStep)}const ElementProperty=`ElementProperty`;function isElementProperty(i){return reflection.isInstance(i,ElementProperty)}const ExpressionV2=`ExpressionV2`;function isExpressionV2(i){return reflection.isInstance(i,ExpressionV2)}const ExtendElementProperty=`ExtendElementProperty`,ExtendRelationProperty=`ExtendRelationProperty`,FqnExpr$2=`FqnExpr`;function isFqnExpr(i){return reflection.isInstance(i,FqnExpr$2)}const FqnExprOrWhere=`FqnExprOrWhere`;function isFqnExprOrWhere(i){return reflection.isInstance(i,FqnExprOrWhere)}const FqnExprOrWith=`FqnExprOrWith`;function isFqnExprOrWith(i){return reflection.isInstance(i,FqnExprOrWith)}const FqnReferenceable=`FqnReferenceable`,LikeC4View=`LikeC4View`;function isLikeC4View(i){return reflection.isInstance(i,LikeC4View)}const MetadataProperty=`MetadataProperty`;function isMetadataProperty(i){return reflection.isInstance(i,MetadataProperty)}const MetadataValue=`MetadataValue`,ModelReferenceable=`ModelReferenceable`,Referenceable=`Referenceable`,RelationExpr$1=`RelationExpr`;function isRelationExpr(i){return reflection.isInstance(i,RelationExpr$1)}const RelationExprOrWhere=`RelationExprOrWhere`;function isRelationExprOrWhere(i){return reflection.isInstance(i,RelationExprOrWhere)}const RelationExprOrWith=`RelationExprOrWith`;function isRelationExprOrWith(i){return reflection.isInstance(i,RelationExprOrWith)}const RelationProperty=`RelationProperty`,RelationshipStyleProperty=`RelationshipStyleProperty`;function isRelationshipStyleProperty(i){return reflection.isInstance(i,RelationshipStyleProperty)}const SizeProperty=`SizeProperty`;function isSizeProperty(i){return reflection.isInstance(i,SizeProperty)}const StringProperty=`StringProperty`;function isStringProperty(i){return reflection.isInstance(i,StringProperty)}const StyleProperty=`StyleProperty`;function isStyleProperty(i){return reflection.isInstance(i,StyleProperty)}const ViewProperty=`ViewProperty`;function isViewProperty(i){return reflection.isInstance(i,ViewProperty)}const ViewRule=`ViewRule`;function isViewRule(i){return reflection.isInstance(i,ViewRule)}const ViewRuleStyleOrGlobalRef=`ViewRuleStyleOrGlobalRef`;function isViewRuleStyleOrGlobalRef(i){return reflection.isInstance(i,ViewRuleStyleOrGlobalRef)}const WhereElement=`WhereElement`;function isWhereElement(i){return reflection.isInstance(i,WhereElement)}const WhereElementExpression=`WhereElementExpression`;function isWhereElementExpression(i){return reflection.isInstance(i,WhereElementExpression)}const WhereExpression=`WhereExpression`,WhereKindEqual=`WhereKindEqual`;function isWhereKindEqual(i){return reflection.isInstance(i,WhereKindEqual)}const WhereRelation=`WhereRelation`;function isWhereRelation(i){return reflection.isInstance(i,WhereRelation)}const WhereRelationExpression=`WhereRelationExpression`;function isWhereRelationExpression(i){return reflection.isInstance(i,WhereRelationExpression)}const WhereTagEqual=`WhereTagEqual`;function isWhereTagEqual(i){return reflection.isInstance(i,WhereTagEqual)}const AbstractDynamicStep=`AbstractDynamicStep`,ArrowProperty=`ArrowProperty`;function isArrowProperty(i){return reflection.isInstance(i,ArrowProperty)}const BorderProperty=`BorderProperty`;function isBorderProperty(i){return reflection.isInstance(i,BorderProperty)}const ColorProperty=`ColorProperty`;function isColorProperty(i){return reflection.isInstance(i,ColorProperty)}const CustomColor=`CustomColor`,CustomElementProperties=`CustomElementProperties`;function isCustomElementProperties(i){return reflection.isInstance(i,CustomElementProperties)}const CustomRelationProperties=`CustomRelationProperties`;function isCustomRelationProperties(i){return reflection.isInstance(i,CustomRelationProperties)}const DeployedInstance=`DeployedInstance`;function isDeployedInstance(i){return reflection.isInstance(i,DeployedInstance)}const DeployedInstanceBody=`DeployedInstanceBody`;function isDeployedInstanceBody(i){return reflection.isInstance(i,DeployedInstanceBody)}const DeploymentNode=`DeploymentNode`;function isDeploymentNode$1(i){return reflection.isInstance(i,DeploymentNode)}const DeploymentNodeBody=`DeploymentNodeBody`;function isDeploymentNodeBody(i){return reflection.isInstance(i,DeploymentNodeBody)}const DeploymentNodeKind=`DeploymentNodeKind`;function isDeploymentNodeKind(i){return reflection.isInstance(i,DeploymentNodeKind)}const DeploymentRelation=`DeploymentRelation`;function isDeploymentRelation(i){return reflection.isInstance(i,DeploymentRelation)}const DeploymentRelationBody=`DeploymentRelationBody`;function isDeploymentRelationBody(i){return reflection.isInstance(i,DeploymentRelationBody)}const DeploymentView=`DeploymentView`;function isDeploymentView$1(i){return reflection.isInstance(i,DeploymentView)}const DeploymentViewBody=`DeploymentViewBody`;function isDeploymentViewBody(i){return reflection.isInstance(i,DeploymentViewBody)}const DeploymentViewRulePredicate=`DeploymentViewRulePredicate`;function isDeploymentViewRulePredicate(i){return reflection.isInstance(i,DeploymentViewRulePredicate)}const DeploymentViewRuleStyle=`DeploymentViewRuleStyle`;function isDeploymentViewRuleStyle(i){return reflection.isInstance(i,DeploymentViewRuleStyle)}const DirectedRelationExpr=`DirectedRelationExpr`;function isDirectedRelationExpr(i){return reflection.isInstance(i,DirectedRelationExpr)}const DynamicView=`DynamicView`;function isDynamicView$1(i){return reflection.isInstance(i,DynamicView)}const DynamicViewBody=`DynamicViewBody`;function isDynamicViewBody(i){return reflection.isInstance(i,DynamicViewBody)}const DynamicViewDisplayVariantProperty=`DynamicViewDisplayVariantProperty`;function isDynamicViewDisplayVariantProperty(i){return reflection.isInstance(i,DynamicViewDisplayVariantProperty)}const DynamicViewGlobalPredicateRef=`DynamicViewGlobalPredicateRef`;function isDynamicViewGlobalPredicateRef(i){return reflection.isInstance(i,DynamicViewGlobalPredicateRef)}const DynamicViewIncludePredicate=`DynamicViewIncludePredicate`;function isDynamicViewIncludePredicate(i){return reflection.isInstance(i,DynamicViewIncludePredicate)}const DynamicViewParallelSteps=`DynamicViewParallelSteps`;function isDynamicViewParallelSteps(i){return reflection.isInstance(i,DynamicViewParallelSteps)}const DynamicViewRef=`DynamicViewRef`,Element=`Element`;function isElement(i){return reflection.isInstance(i,Element)}const ElementBody=`ElementBody`;function isElementBody(i){return reflection.isInstance(i,ElementBody)}const ElementKind=`ElementKind`;function isElementKind(i){return reflection.isInstance(i,ElementKind)}const ElementKindExpression=`ElementKindExpression`;function isElementKindExpression(i){return reflection.isInstance(i,ElementKindExpression)}const ElementRef=`ElementRef`;function isElementRef(i){return reflection.isInstance(i,ElementRef)}const ElementStringProperty=`ElementStringProperty`;function isElementStringProperty(i){return reflection.isInstance(i,ElementStringProperty)}const ElementStyleProperty=`ElementStyleProperty`;function isElementStyleProperty(i){return reflection.isInstance(i,ElementStyleProperty)}const ElementTagExpression=`ElementTagExpression`;function isElementTagExpression(i){return reflection.isInstance(i,ElementTagExpression)}const ElementView=`ElementView`;function isElementView$1(i){return reflection.isInstance(i,ElementView)}const ElementViewBody=`ElementViewBody`;function isElementViewBody(i){return reflection.isInstance(i,ElementViewBody)}const ElementViewRef=`ElementViewRef`,Expressions=`Expressions`;function isExpressions(i){return reflection.isInstance(i,Expressions)}const ExtendDeployment=`ExtendDeployment`;function isExtendDeployment(i){return reflection.isInstance(i,ExtendDeployment)}const ExtendDeploymentBody=`ExtendDeploymentBody`;function isExtendDeploymentBody(i){return reflection.isInstance(i,ExtendDeploymentBody)}const ExtendElement=`ExtendElement`;function isExtendElement(i){return reflection.isInstance(i,ExtendElement)}const ExtendElementBody=`ExtendElementBody`;function isExtendElementBody(i){return reflection.isInstance(i,ExtendElementBody)}const ExtendRelation=`ExtendRelation`;function isExtendRelation(i){return reflection.isInstance(i,ExtendRelation)}const ExtendRelationBody=`ExtendRelationBody`;function isExtendRelationBody(i){return reflection.isInstance(i,ExtendRelationBody)}const FqnExpressions=`FqnExpressions`;function isFqnExpressions(i){return reflection.isInstance(i,FqnExpressions)}const FqnExprWhere=`FqnExprWhere`;function isFqnExprWhere(i){return reflection.isInstance(i,FqnExprWhere)}const FqnExprWith=`FqnExprWith`;function isFqnExprWith(i){return reflection.isInstance(i,FqnExprWith)}const FqnRef$2=`FqnRef`;function isFqnRef(i){return reflection.isInstance(i,FqnRef$2)}const FqnRefExpr=`FqnRefExpr`;function isFqnRefExpr(i){return reflection.isInstance(i,FqnRefExpr)}const GlobalDynamicPredicateGroup=`GlobalDynamicPredicateGroup`;function isGlobalDynamicPredicateGroup(i){return reflection.isInstance(i,GlobalDynamicPredicateGroup)}const GlobalPredicateGroup=`GlobalPredicateGroup`;function isGlobalPredicateGroup(i){return reflection.isInstance(i,GlobalPredicateGroup)}const Globals=`Globals`;function isGlobals(i){return reflection.isInstance(i,Globals)}const GlobalStyle=`GlobalStyle`;function isGlobalStyle(i){return reflection.isInstance(i,GlobalStyle)}const GlobalStyleGroup=`GlobalStyleGroup`;function isGlobalStyleGroup(i){return reflection.isInstance(i,GlobalStyleGroup)}const GlobalStyleId=`GlobalStyleId`,HexColor=`HexColor`;function isHexColor(i){return reflection.isInstance(i,HexColor)}const IconColorProperty=`IconColorProperty`;function isIconColorProperty(i){return reflection.isInstance(i,IconColorProperty)}const IconPositionProperty=`IconPositionProperty`;function isIconPositionProperty(i){return reflection.isInstance(i,IconPositionProperty)}const IconProperty=`IconProperty`;function isIconProperty(i){return reflection.isInstance(i,IconProperty)}const IconSizeProperty=`IconSizeProperty`;function isIconSizeProperty(i){return reflection.isInstance(i,IconSizeProperty)}const Imported=`Imported`;function isImported(i){return reflection.isInstance(i,Imported)}const ImportsFromPoject=`ImportsFromPoject`;function isImportsFromPoject(i){return reflection.isInstance(i,ImportsFromPoject)}const IncomingRelationExpr=`IncomingRelationExpr`;function isIncomingRelationExpr(i){return reflection.isInstance(i,IncomingRelationExpr)}const InOutRelationExpr=`InOutRelationExpr`;function isInOutRelationExpr(i){return reflection.isInstance(i,InOutRelationExpr)}const LibIcon=`LibIcon`;function isLibIcon(i){return reflection.isInstance(i,LibIcon)}const LikeC4Grammar$1=`LikeC4Grammar`;function isLikeC4Grammar(i){return reflection.isInstance(i,LikeC4Grammar$1)}const LikeC4Lib=`LikeC4Lib`;function isLikeC4Lib(i){return reflection.isInstance(i,LikeC4Lib)}const LineProperty=`LineProperty`;function isLineProperty(i){return reflection.isInstance(i,LineProperty)}const LinkProperty=`LinkProperty`;function isLinkProperty(i){return reflection.isInstance(i,LinkProperty)}const MarkdownOrString=`MarkdownOrString`;function isMarkdownOrString(i){return reflection.isInstance(i,MarkdownOrString)}const MetadataArray=`MetadataArray`;function isMetadataArray(i){return reflection.isInstance(i,MetadataArray)}const MetadataAttribute=`MetadataAttribute`;function isMetadataAttribute(i){return reflection.isInstance(i,MetadataAttribute)}const MetadataBody=`MetadataBody`;function isMetadataBody(i){return reflection.isInstance(i,MetadataBody)}const Model=`Model`;function isModel(i){return reflection.isInstance(i,Model)}const ModelDeployments=`ModelDeployments`;function isModelDeployments(i){return reflection.isInstance(i,ModelDeployments)}const ModelViews=`ModelViews`;function isModelViews(i){return reflection.isInstance(i,ModelViews)}const MultipleProperty=`MultipleProperty`;function isMultipleProperty(i){return reflection.isInstance(i,MultipleProperty)}const NavigateToProperty=`NavigateToProperty`;function isNavigateToProperty(i){return reflection.isInstance(i,NavigateToProperty)}const NotationProperty=`NotationProperty`;function isNotationProperty(i){return reflection.isInstance(i,NotationProperty)}const NotesProperty=`NotesProperty`;function isNotesProperty(i){return reflection.isInstance(i,NotesProperty)}const OpacityProperty=`OpacityProperty`;function isOpacityProperty(i){return reflection.isInstance(i,OpacityProperty)}const OutgoingRelationExpr=`OutgoingRelationExpr`;function isOutgoingRelationExpr(i){return reflection.isInstance(i,OutgoingRelationExpr)}const PaddingSizeProperty=`PaddingSizeProperty`;function isPaddingSizeProperty(i){return reflection.isInstance(i,PaddingSizeProperty)}const Relation=`Relation`;function isRelation(i){return reflection.isInstance(i,Relation)}const RelationBody=`RelationBody`;function isRelationBody(i){return reflection.isInstance(i,RelationBody)}const RelationExprWhere=`RelationExprWhere`;function isRelationExprWhere(i){return reflection.isInstance(i,RelationExprWhere)}const RelationExprWith=`RelationExprWith`;function isRelationExprWith(i){return reflection.isInstance(i,RelationExprWith)}const RelationKindDotRef=`RelationKindDotRef`;function isRelationKindDotRef(i){return reflection.isInstance(i,RelationKindDotRef)}const RelationNavigateToProperty=`RelationNavigateToProperty`;function isRelationNavigateToProperty(i){return reflection.isInstance(i,RelationNavigateToProperty)}const RelationshipKind=`RelationshipKind`;function isRelationshipKind(i){return reflection.isInstance(i,RelationshipKind)}const RelationStringProperty=`RelationStringProperty`;function isRelationStringProperty(i){return reflection.isInstance(i,RelationStringProperty)}const RelationStyleProperty=`RelationStyleProperty`;function isRelationStyleProperty(i){return reflection.isInstance(i,RelationStyleProperty)}const RGBAColor=`RGBAColor`;function isRGBAColor(i){return reflection.isInstance(i,RGBAColor)}const ShapeProperty=`ShapeProperty`;function isShapeProperty(i){return reflection.isInstance(i,ShapeProperty)}const ShapeSizeProperty=`ShapeSizeProperty`;function isShapeSizeProperty(i){return reflection.isInstance(i,ShapeSizeProperty)}const SpecificationColor=`SpecificationColor`;function isSpecificationColor(i){return reflection.isInstance(i,SpecificationColor)}const SpecificationDeploymentNodeKind=`SpecificationDeploymentNodeKind`;function isSpecificationDeploymentNodeKind(i){return reflection.isInstance(i,SpecificationDeploymentNodeKind)}const SpecificationElementKind=`SpecificationElementKind`;function isSpecificationElementKind(i){return reflection.isInstance(i,SpecificationElementKind)}const SpecificationElementStringProperty=`SpecificationElementStringProperty`;function isSpecificationElementStringProperty(i){return reflection.isInstance(i,SpecificationElementStringProperty)}const SpecificationRelationshipKind=`SpecificationRelationshipKind`;function isSpecificationRelationshipKind(i){return reflection.isInstance(i,SpecificationRelationshipKind)}const SpecificationRelationshipStringProperty=`SpecificationRelationshipStringProperty`;function isSpecificationRelationshipStringProperty(i){return reflection.isInstance(i,SpecificationRelationshipStringProperty)}const SpecificationRule=`SpecificationRule`;function isSpecificationRule(i){return reflection.isInstance(i,SpecificationRule)}const SpecificationTag=`SpecificationTag`;function isSpecificationTag(i){return reflection.isInstance(i,SpecificationTag)}const StrictFqnElementRef=`StrictFqnElementRef`;function isStrictFqnElementRef(i){return reflection.isInstance(i,StrictFqnElementRef)}const StrictFqnRef=`StrictFqnRef`;function isStrictFqnRef(i){return reflection.isInstance(i,StrictFqnRef)}function isTag(i){return reflection.isInstance(i,`Tag`)}const TagRef=`TagRef`;function isTagRef(i){return reflection.isInstance(i,TagRef)}const Tags=`Tags`;function isTags(i){return reflection.isInstance(i,Tags)}const TextSizeProperty=`TextSizeProperty`;function isTextSizeProperty(i){return reflection.isInstance(i,TextSizeProperty)}const ViewRef=`ViewRef`,ViewRuleAutoLayout=`ViewRuleAutoLayout`;function isViewRuleAutoLayout(i){return reflection.isInstance(i,ViewRuleAutoLayout)}const ViewRuleGlobalPredicateRef=`ViewRuleGlobalPredicateRef`;function isViewRuleGlobalPredicateRef(i){return reflection.isInstance(i,ViewRuleGlobalPredicateRef)}const ViewRuleGlobalStyle=`ViewRuleGlobalStyle`;function isViewRuleGlobalStyle(i){return reflection.isInstance(i,ViewRuleGlobalStyle)}const ViewRuleGroup=`ViewRuleGroup`;function isViewRuleGroup(i){return reflection.isInstance(i,ViewRuleGroup)}const ViewRulePredicate=`ViewRulePredicate`;function isViewRulePredicate(i){return reflection.isInstance(i,ViewRulePredicate)}const ViewRuleRank=`ViewRuleRank`;function isViewRuleRank(i){return reflection.isInstance(i,ViewRuleRank)}const ViewRuleStyle=`ViewRuleStyle`;function isViewRuleStyle(i){return reflection.isInstance(i,ViewRuleStyle)}const ViewStringProperty=`ViewStringProperty`;function isViewStringProperty(i){return reflection.isInstance(i,ViewStringProperty)}const WhereBinaryExpression=`WhereBinaryExpression`;function isWhereBinaryExpression(i){return reflection.isInstance(i,WhereBinaryExpression)}const WhereElementKind=`WhereElementKind`;function isWhereElementKind(i){return reflection.isInstance(i,WhereElementKind)}const WhereElementNegation=`WhereElementNegation`;function isWhereElementNegation(i){return reflection.isInstance(i,WhereElementNegation)}const WhereElementTag=`WhereElementTag`;function isWhereElementTag(i){return reflection.isInstance(i,WhereElementTag)}const WhereRelationKind=`WhereRelationKind`;function isWhereRelationKind(i){return reflection.isInstance(i,WhereRelationKind)}const WhereRelationNegation=`WhereRelationNegation`;function isWhereRelationNegation(i){return reflection.isInstance(i,WhereRelationNegation)}const WhereRelationParticipantKind=`WhereRelationParticipantKind`;function isWhereRelationParticipantKind(i){return reflection.isInstance(i,WhereRelationParticipantKind)}const WhereRelationParticipantTag=`WhereRelationParticipantTag`;function isWhereRelationParticipantTag(i){return reflection.isInstance(i,WhereRelationParticipantTag)}const WhereRelationTag=`WhereRelationTag`;function isWhereRelationTag(i){return reflection.isInstance(i,WhereRelationTag)}const WildcardExpression=`WildcardExpression`;function isWildcardExpression(i){return reflection.isInstance(i,WildcardExpression)}const DynamicStepChain=`DynamicStepChain`;function isDynamicStepChain(i){return reflection.isInstance(i,DynamicStepChain)}const DynamicStepSingle=`DynamicStepSingle`;function isDynamicStepSingle(i){return reflection.isInstance(i,DynamicStepSingle)}var LikeC4AstReflection=class extends AbstractAstReflection{getAllTypes(){return[AbstractDynamicStep,AnyProperty,ArrowProperty,BorderProperty,ColorLiteral,ColorProperty,CustomColor,CustomElementProperties,CustomRelationProperties,DeployedInstance,DeployedInstanceBody,DeploymentElement,DeploymentNode,DeploymentNodeBody,DeploymentNodeKind,DeploymentNodeOrElementKind,DeploymentRelation,DeploymentRelationBody,DeploymentView,DeploymentViewBody,DeploymentViewRule,DeploymentViewRulePredicate,DeploymentViewRuleStyle,DirectedRelationExpr,DynamicStepChain,DynamicStepSingle,DynamicView,DynamicViewBody,DynamicViewDisplayVariantProperty,DynamicViewGlobalPredicateRef,DynamicViewIncludePredicate,DynamicViewParallelSteps,DynamicViewProperty,DynamicViewRef,DynamicViewRule,DynamicViewStep,Element,ElementBody,ElementKind,ElementKindExpression,ElementProperty,ElementRef,ElementStringProperty,ElementStyleProperty,ElementTagExpression,ElementView,ElementViewBody,ElementViewRef,ExpressionV2,Expressions,ExtendDeployment,ExtendDeploymentBody,ExtendElement,ExtendElementBody,ExtendElementProperty,ExtendRelation,ExtendRelationBody,ExtendRelationProperty,FqnExpr$2,FqnExprOrWhere,FqnExprOrWith,FqnExprWhere,FqnExprWith,FqnExpressions,FqnRef$2,FqnRefExpr,FqnReferenceable,GlobalDynamicPredicateGroup,GlobalPredicateGroup,GlobalStyle,GlobalStyleGroup,GlobalStyleId,Globals,HexColor,IconColorProperty,IconPositionProperty,IconProperty,IconSizeProperty,Imported,ImportsFromPoject,InOutRelationExpr,IncomingRelationExpr,LibIcon,LikeC4Grammar$1,LikeC4Lib,LikeC4View,LineProperty,LinkProperty,MarkdownOrString,MetadataArray,MetadataAttribute,MetadataBody,MetadataProperty,MetadataValue,Model,ModelDeployments,ModelReferenceable,ModelViews,MultipleProperty,NavigateToProperty,NotationProperty,NotesProperty,OpacityProperty,OutgoingRelationExpr,PaddingSizeProperty,RGBAColor,Referenceable,Relation,RelationBody,RelationExpr$1,RelationExprOrWhere,RelationExprOrWith,RelationExprWhere,RelationExprWith,RelationKindDotRef,RelationNavigateToProperty,RelationProperty,RelationStringProperty,RelationStyleProperty,RelationshipKind,RelationshipStyleProperty,ShapeProperty,ShapeSizeProperty,SizeProperty,SpecificationColor,SpecificationDeploymentNodeKind,SpecificationElementKind,SpecificationElementStringProperty,SpecificationRelationshipKind,SpecificationRelationshipStringProperty,SpecificationRule,SpecificationTag,StrictFqnElementRef,StrictFqnRef,StringProperty,StyleProperty,`Tag`,TagRef,Tags,TextSizeProperty,ViewProperty,ViewRef,ViewRule,ViewRuleAutoLayout,ViewRuleGlobalPredicateRef,ViewRuleGlobalStyle,ViewRuleGroup,ViewRulePredicate,ViewRuleRank,ViewRuleStyle,ViewRuleStyleOrGlobalRef,ViewStringProperty,WhereBinaryExpression,WhereElement,WhereElementExpression,WhereElementKind,WhereElementNegation,WhereElementTag,WhereExpression,WhereKindEqual,WhereRelation,WhereRelationExpression,WhereRelationKind,WhereRelationNegation,WhereRelationParticipantKind,WhereRelationParticipantTag,WhereRelationTag,WhereTagEqual,WildcardExpression]}computeIsSubtype(i,a){switch(i){case ArrowProperty:case LineProperty:return this.isSubtype(RelationshipStyleProperty,a);case BorderProperty:case IconColorProperty:case IconPositionProperty:case MultipleProperty:case OpacityProperty:case ShapeProperty:return this.isSubtype(StyleProperty,a);case ColorProperty:return this.isSubtype(RelationshipStyleProperty,a)||this.isSubtype(StyleProperty,a);case DeployedInstance:case DeploymentNode:return this.isSubtype(DeploymentElement,a)||this.isSubtype(Referenceable,a);case DeploymentNodeKind:case ElementKind:return this.isSubtype(DeploymentNodeOrElementKind,a);case DeploymentView:case DynamicView:case ElementView:return this.isSubtype(LikeC4View,a);case DeploymentViewRulePredicate:case DeploymentViewRuleStyle:return this.isSubtype(DeploymentViewRule,a);case DirectedRelationExpr:case IncomingRelationExpr:case InOutRelationExpr:case OutgoingRelationExpr:return this.isSubtype(RelationExpr$1,a);case DynamicStepChain:case DynamicStepSingle:return this.isSubtype(AbstractDynamicStep,a)||this.isSubtype(DynamicViewStep,a);case DynamicViewDisplayVariantProperty:return this.isSubtype(DynamicViewProperty,a);case DynamicViewGlobalPredicateRef:case DynamicViewIncludePredicate:return this.isSubtype(DynamicViewRule,a);case DynamicViewProperty:case ElementProperty:case RelationProperty:case StringProperty:return this.isSubtype(AnyProperty,a);case Element:return this.isSubtype(FqnReferenceable,a)||this.isSubtype(ModelReferenceable,a)||this.isSubtype(Referenceable,a);case ElementKindExpression:case ElementTagExpression:case FqnRefExpr:case WildcardExpression:return this.isSubtype(FqnExpr$2,a);case ElementStringProperty:return this.isSubtype(ElementProperty,a)||this.isSubtype(StringProperty,a);case ElementStyleProperty:return this.isSubtype(ElementProperty,a);case ExtendDeployment:case ExtendElement:case Referenceable:return this.isSubtype(FqnReferenceable,a);case FqnExpr$2:case FqnExprWhere:return this.isSubtype(FqnExprOrWhere,a);case FqnExprOrWhere:case FqnExprWith:return this.isSubtype(FqnExprOrWith,a);case FqnExprOrWith:case RelationExprOrWith:return this.isSubtype(ExpressionV2,a);case HexColor:case RGBAColor:return this.isSubtype(ColorLiteral,a);case IconProperty:return this.isSubtype(ElementProperty,a)||this.isSubtype(StyleProperty,a);case IconSizeProperty:case PaddingSizeProperty:case ShapeSizeProperty:case TextSizeProperty:return this.isSubtype(SizeProperty,a)||this.isSubtype(StyleProperty,a);case Imported:return this.isSubtype(ModelReferenceable,a)||this.isSubtype(Referenceable,a);case LinkProperty:return this.isSubtype(ElementProperty,a)||this.isSubtype(ExtendElementProperty,a)||this.isSubtype(ExtendRelationProperty,a)||this.isSubtype(RelationProperty,a)||this.isSubtype(ViewProperty,a);case MarkdownOrString:case MetadataArray:return this.isSubtype(MetadataValue,a);case MetadataAttribute:case NotationProperty:case NotesProperty:case SpecificationElementStringProperty:case SpecificationRelationshipStringProperty:return this.isSubtype(StringProperty,a);case MetadataBody:return this.isSubtype(MetadataProperty,a);case MetadataProperty:return this.isSubtype(ElementProperty,a)||this.isSubtype(ExtendElementProperty,a)||this.isSubtype(ExtendRelationProperty,a)||this.isSubtype(RelationProperty,a);case RelationExpr$1:case RelationExprWhere:return this.isSubtype(RelationExprOrWhere,a);case RelationExprOrWhere:case RelationExprWith:return this.isSubtype(RelationExprOrWith,a);case RelationNavigateToProperty:case RelationStyleProperty:return this.isSubtype(RelationProperty,a);case RelationStringProperty:return this.isSubtype(RelationProperty,a)||this.isSubtype(StringProperty,a);case ViewProperty:return this.isSubtype(AnyProperty,a)||this.isSubtype(DynamicViewProperty,a);case ViewRuleAutoLayout:return this.isSubtype(DeploymentViewRule,a)||this.isSubtype(DynamicViewRule,a)||this.isSubtype(ViewRule,a);case ViewRuleGlobalPredicateRef:case ViewRuleGroup:case ViewRulePredicate:case ViewRuleRank:return this.isSubtype(ViewRule,a);case ViewRuleGlobalStyle:case ViewRuleStyle:return this.isSubtype(ViewRuleStyleOrGlobalRef,a);case ViewRuleStyleOrGlobalRef:return this.isSubtype(DynamicViewRule,a)||this.isSubtype(ViewRule,a);case ViewStringProperty:return this.isSubtype(StringProperty,a)||this.isSubtype(ViewProperty,a);case WhereBinaryExpression:return this.isSubtype(WhereElementExpression,a)||this.isSubtype(WhereRelationExpression,a);case WhereElement:case WhereElementNegation:return this.isSubtype(WhereElementExpression,a);case WhereElementExpression:case WhereRelationExpression:return this.isSubtype(WhereExpression,a);case WhereElementKind:return this.isSubtype(WhereElement,a)||this.isSubtype(WhereKindEqual,a);case WhereElementTag:return this.isSubtype(WhereElement,a)||this.isSubtype(WhereTagEqual,a);case WhereRelation:case WhereRelationNegation:return this.isSubtype(WhereRelationExpression,a);case WhereRelationKind:case WhereRelationParticipantKind:return this.isSubtype(WhereKindEqual,a)||this.isSubtype(WhereRelation,a);case WhereRelationParticipantTag:case WhereRelationTag:return this.isSubtype(WhereRelation,a)||this.isSubtype(WhereTagEqual,a);default:return!1}}getReferenceType(i){let a=`${i.container.$type}:${i.property}`;switch(a){case`AbstractDynamicStep:kind`:case`DeploymentRelation:kind`:case`DynamicStepChain:kind`:case`DynamicStepSingle:kind`:case`ExtendRelation:kind`:case`OutgoingRelationExpr:kind`:case`Relation:kind`:case`RelationKindDotRef:kind`:case`WhereRelationKind:value`:return RelationshipKind;case`ColorProperty:customColor`:case`IconColorProperty:customColor`:return CustomColor;case`DeploymentNode:kind`:return DeploymentNodeKind;case`DynamicViewGlobalPredicateRef:predicate`:return GlobalDynamicPredicateGroup;case`DynamicViewRef:view`:return DynamicView;case`Element:kind`:case`ElementKindExpression:kind`:return ElementKind;case`ElementViewRef:view`:return ElementView;case`FqnRef:value`:case`StrictFqnRef:value`:return Referenceable;case`IconProperty:libicon`:return LibIcon;case`Imported:imported`:case`StrictFqnElementRef:el`:return Element;case`TagRef:tag`:return`Tag`;case`ViewRef:view`:return LikeC4View;case`ViewRuleGlobalPredicateRef:predicate`:return GlobalPredicateGroup;case`ViewRuleGlobalStyle:style`:return GlobalStyleId;case`WhereElementKind:value`:case`WhereRelationParticipantKind:value`:return DeploymentNodeOrElementKind;default:throw Error(`${a} is not a valid reference id.`)}}getTypeMetaData(i){switch(i){case AbstractDynamicStep:return{name:AbstractDynamicStep,properties:[{name:`custom`},{name:`dotKind`},{name:`kind`},{name:`target`},{name:`title`}]};case ArrowProperty:return{name:ArrowProperty,properties:[{name:`key`},{name:`value`}]};case BorderProperty:return{name:BorderProperty,properties:[{name:`key`},{name:`value`}]};case ColorProperty:return{name:ColorProperty,properties:[{name:`customColor`},{name:`key`},{name:`themeColor`}]};case CustomColor:return{name:CustomColor,properties:[{name:`name`}]};case CustomElementProperties:return{name:CustomElementProperties,properties:[{name:`props`,defaultValue:[]}]};case CustomRelationProperties:return{name:CustomRelationProperties,properties:[{name:`props`,defaultValue:[]}]};case DeployedInstance:return{name:DeployedInstance,properties:[{name:`body`},{name:`name`},{name:`summary`},{name:`target`},{name:`title`}]};case DeployedInstanceBody:return{name:DeployedInstanceBody,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case DeploymentNode:return{name:DeploymentNode,properties:[{name:`body`},{name:`kind`},{name:`name`},{name:`summary`},{name:`title`}]};case DeploymentNodeBody:return{name:DeploymentNodeBody,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case DeploymentNodeKind:return{name:DeploymentNodeKind,properties:[{name:`name`}]};case DeploymentRelation:return{name:DeploymentRelation,properties:[{name:`body`},{name:`description`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`tags`},{name:`target`},{name:`technology`},{name:`title`}]};case DeploymentRelationBody:return{name:DeploymentRelationBody,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case DeploymentView:return{name:DeploymentView,properties:[{name:`body`},{name:`name`}]};case DeploymentViewBody:return{name:DeploymentViewBody,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`tags`}]};case DeploymentViewRulePredicate:return{name:DeploymentViewRulePredicate,properties:[{name:`expr`},{name:`isInclude`,defaultValue:!1}]};case DeploymentViewRuleStyle:return{name:DeploymentViewRuleStyle,properties:[{name:`props`,defaultValue:[]},{name:`targets`}]};case DirectedRelationExpr:return{name:DirectedRelationExpr,properties:[{name:`source`},{name:`target`}]};case DynamicView:return{name:DynamicView,properties:[{name:`body`},{name:`name`}]};case DynamicViewBody:return{name:DynamicViewBody,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`steps`,defaultValue:[]},{name:`tags`}]};case DynamicViewDisplayVariantProperty:return{name:DynamicViewDisplayVariantProperty,properties:[{name:`key`},{name:`value`}]};case DynamicViewGlobalPredicateRef:return{name:DynamicViewGlobalPredicateRef,properties:[{name:`predicate`}]};case DynamicViewIncludePredicate:return{name:DynamicViewIncludePredicate,properties:[{name:`exprs`}]};case DynamicViewParallelSteps:return{name:DynamicViewParallelSteps,properties:[{name:`steps`,defaultValue:[]}]};case DynamicViewRef:return{name:DynamicViewRef,properties:[{name:`view`}]};case Element:return{name:Element,properties:[{name:`body`},{name:`kind`},{name:`name`},{name:`props`,defaultValue:[]}]};case ElementBody:return{name:ElementBody,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case ElementKind:return{name:ElementKind,properties:[{name:`name`}]};case ElementKindExpression:return{name:ElementKindExpression,properties:[{name:`isEqual`,defaultValue:!1},{name:`kind`}]};case ElementRef:return{name:ElementRef,properties:[{name:`modelElement`}]};case ElementStringProperty:return{name:ElementStringProperty,properties:[{name:`key`},{name:`value`}]};case ElementStyleProperty:return{name:ElementStyleProperty,properties:[{name:`key`},{name:`props`,defaultValue:[]}]};case ElementTagExpression:return{name:ElementTagExpression,properties:[{name:`isEqual`,defaultValue:!1},{name:`tag`}]};case ElementView:return{name:ElementView,properties:[{name:`body`},{name:`extends`},{name:`name`},{name:`viewOf`}]};case ElementViewBody:return{name:ElementViewBody,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`tags`}]};case ElementViewRef:return{name:ElementViewRef,properties:[{name:`view`}]};case Expressions:return{name:Expressions,properties:[{name:`prev`},{name:`value`}]};case ExtendDeployment:return{name:ExtendDeployment,properties:[{name:`body`},{name:`deploymentNode`}]};case ExtendDeploymentBody:return{name:ExtendDeploymentBody,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case ExtendElement:return{name:ExtendElement,properties:[{name:`body`},{name:`element`}]};case ExtendElementBody:return{name:ExtendElementBody,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case ExtendRelation:return{name:ExtendRelation,properties:[{name:`body`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};case ExtendRelationBody:return{name:ExtendRelationBody,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case FqnExpressions:return{name:FqnExpressions,properties:[{name:`prev`},{name:`value`}]};case FqnExprWhere:return{name:FqnExprWhere,properties:[{name:`subject`},{name:`where`}]};case FqnExprWith:return{name:FqnExprWith,properties:[{name:`custom`},{name:`subject`}]};case FqnRef$2:return{name:FqnRef$2,properties:[{name:`parent`},{name:`value`}]};case FqnRefExpr:return{name:FqnRefExpr,properties:[{name:`ref`},{name:`selector`}]};case GlobalDynamicPredicateGroup:return{name:GlobalDynamicPredicateGroup,properties:[{name:`name`},{name:`predicates`,defaultValue:[]}]};case GlobalPredicateGroup:return{name:GlobalPredicateGroup,properties:[{name:`name`},{name:`predicates`,defaultValue:[]}]};case Globals:return{name:Globals,properties:[{name:`name`},{name:`predicates`,defaultValue:[]},{name:`styles`,defaultValue:[]}]};case GlobalStyle:return{name:GlobalStyle,properties:[{name:`id`},{name:`props`,defaultValue:[]},{name:`targets`}]};case GlobalStyleGroup:return{name:GlobalStyleGroup,properties:[{name:`id`},{name:`styles`,defaultValue:[]}]};case GlobalStyleId:return{name:GlobalStyleId,properties:[{name:`name`}]};case HexColor:return{name:HexColor,properties:[{name:`hex`}]};case IconColorProperty:return{name:IconColorProperty,properties:[{name:`customColor`},{name:`key`},{name:`themeColor`}]};case IconPositionProperty:return{name:IconPositionProperty,properties:[{name:`key`},{name:`value`}]};case IconProperty:return{name:IconProperty,properties:[{name:`key`},{name:`libicon`},{name:`value`}]};case IconSizeProperty:return{name:IconSizeProperty,properties:[{name:`key`},{name:`value`}]};case Imported:return{name:Imported,properties:[{name:`imported`},{name:`prev`}]};case ImportsFromPoject:return{name:ImportsFromPoject,properties:[{name:`imports`},{name:`project`}]};case IncomingRelationExpr:return{name:IncomingRelationExpr,properties:[{name:`to`}]};case InOutRelationExpr:return{name:InOutRelationExpr,properties:[{name:`inout`}]};case LibIcon:return{name:LibIcon,properties:[{name:`name`}]};case LikeC4Grammar$1:return{name:LikeC4Grammar$1,properties:[{name:`deployments`,defaultValue:[]},{name:`globals`,defaultValue:[]},{name:`imports`,defaultValue:[]},{name:`likec4lib`,defaultValue:[]},{name:`models`,defaultValue:[]},{name:`specifications`,defaultValue:[]},{name:`views`,defaultValue:[]}]};case LikeC4Lib:return{name:LikeC4Lib,properties:[{name:`icons`,defaultValue:[]}]};case LineProperty:return{name:LineProperty,properties:[{name:`key`},{name:`value`}]};case LinkProperty:return{name:LinkProperty,properties:[{name:`key`},{name:`title`},{name:`value`}]};case MarkdownOrString:return{name:MarkdownOrString,properties:[{name:`markdown`},{name:`text`}]};case MetadataArray:return{name:MetadataArray,properties:[{name:`values`,defaultValue:[]}]};case MetadataAttribute:return{name:MetadataAttribute,properties:[{name:`key`},{name:`value`}]};case MetadataBody:return{name:MetadataBody,properties:[{name:`props`,defaultValue:[]}]};case Model:return{name:Model,properties:[{name:`elements`,defaultValue:[]},{name:`name`}]};case ModelDeployments:return{name:ModelDeployments,properties:[{name:`elements`,defaultValue:[]},{name:`name`}]};case ModelViews:return{name:ModelViews,properties:[{name:`folder`},{name:`name`},{name:`styles`,defaultValue:[]},{name:`views`,defaultValue:[]}]};case MultipleProperty:return{name:MultipleProperty,properties:[{name:`key`},{name:`value`,defaultValue:!1}]};case NavigateToProperty:return{name:NavigateToProperty,properties:[{name:`key`},{name:`value`}]};case NotationProperty:return{name:NotationProperty,properties:[{name:`key`},{name:`value`}]};case NotesProperty:return{name:NotesProperty,properties:[{name:`key`},{name:`value`}]};case OpacityProperty:return{name:OpacityProperty,properties:[{name:`key`},{name:`value`}]};case OutgoingRelationExpr:return{name:OutgoingRelationExpr,properties:[{name:`dotKind`},{name:`from`},{name:`isBidirectional`,defaultValue:!1},{name:`kind`}]};case PaddingSizeProperty:return{name:PaddingSizeProperty,properties:[{name:`key`},{name:`value`}]};case Relation:return{name:Relation,properties:[{name:`body`},{name:`description`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`tags`},{name:`target`},{name:`technology`},{name:`title`}]};case RelationBody:return{name:RelationBody,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case RelationExprWhere:return{name:RelationExprWhere,properties:[{name:`subject`},{name:`where`}]};case RelationExprWith:return{name:RelationExprWith,properties:[{name:`custom`},{name:`subject`}]};case RelationKindDotRef:return{name:RelationKindDotRef,properties:[{name:`kind`}]};case RelationNavigateToProperty:return{name:RelationNavigateToProperty,properties:[{name:`key`},{name:`value`}]};case RelationshipKind:return{name:RelationshipKind,properties:[{name:`name`}]};case RelationStringProperty:return{name:RelationStringProperty,properties:[{name:`key`},{name:`value`}]};case RelationStyleProperty:return{name:RelationStyleProperty,properties:[{name:`key`},{name:`props`,defaultValue:[]}]};case RGBAColor:return{name:RGBAColor,properties:[{name:`alpha`},{name:`blue`},{name:`green`},{name:`red`}]};case ShapeProperty:return{name:ShapeProperty,properties:[{name:`key`},{name:`value`}]};case ShapeSizeProperty:return{name:ShapeSizeProperty,properties:[{name:`key`},{name:`value`}]};case SpecificationColor:return{name:SpecificationColor,properties:[{name:`color`},{name:`name`}]};case SpecificationDeploymentNodeKind:return{name:SpecificationDeploymentNodeKind,properties:[{name:`kind`},{name:`props`,defaultValue:[]},{name:`tags`}]};case SpecificationElementKind:return{name:SpecificationElementKind,properties:[{name:`kind`},{name:`props`,defaultValue:[]},{name:`tags`}]};case SpecificationElementStringProperty:return{name:SpecificationElementStringProperty,properties:[{name:`key`},{name:`value`}]};case SpecificationRelationshipKind:return{name:SpecificationRelationshipKind,properties:[{name:`kind`},{name:`props`,defaultValue:[]}]};case SpecificationRelationshipStringProperty:return{name:SpecificationRelationshipStringProperty,properties:[{name:`key`},{name:`value`}]};case SpecificationRule:return{name:SpecificationRule,properties:[{name:`colors`,defaultValue:[]},{name:`deploymentNodes`,defaultValue:[]},{name:`elements`,defaultValue:[]},{name:`name`},{name:`relationships`,defaultValue:[]},{name:`tags`,defaultValue:[]}]};case SpecificationTag:return{name:SpecificationTag,properties:[{name:`color`},{name:`tag`}]};case StrictFqnElementRef:return{name:StrictFqnElementRef,properties:[{name:`el`},{name:`parent`}]};case StrictFqnRef:return{name:StrictFqnRef,properties:[{name:`parent`},{name:`value`}]};case`Tag`:return{name:`Tag`,properties:[{name:`name`}]};case TagRef:return{name:TagRef,properties:[{name:`tag`}]};case Tags:return{name:Tags,properties:[{name:`prev`},{name:`values`,defaultValue:[]}]};case TextSizeProperty:return{name:TextSizeProperty,properties:[{name:`key`},{name:`value`}]};case ViewRef:return{name:ViewRef,properties:[{name:`view`}]};case ViewRuleAutoLayout:return{name:ViewRuleAutoLayout,properties:[{name:`direction`},{name:`nodeSep`},{name:`rankSep`}]};case ViewRuleGlobalPredicateRef:return{name:ViewRuleGlobalPredicateRef,properties:[{name:`predicate`}]};case ViewRuleGlobalStyle:return{name:ViewRuleGlobalStyle,properties:[{name:`style`}]};case ViewRuleGroup:return{name:ViewRuleGroup,properties:[{name:`groupRules`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`title`}]};case ViewRulePredicate:return{name:ViewRulePredicate,properties:[{name:`exprs`},{name:`isInclude`,defaultValue:!1}]};case ViewRuleRank:return{name:ViewRuleRank,properties:[{name:`targets`},{name:`value`}]};case ViewRuleStyle:return{name:ViewRuleStyle,properties:[{name:`props`,defaultValue:[]},{name:`targets`}]};case ViewStringProperty:return{name:ViewStringProperty,properties:[{name:`key`},{name:`value`}]};case WhereBinaryExpression:return{name:WhereBinaryExpression,properties:[{name:`left`},{name:`operator`},{name:`right`}]};case WhereElementKind:return{name:WhereElementKind,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case WhereElementNegation:return{name:WhereElementNegation,properties:[{name:`value`}]};case WhereElementTag:return{name:WhereElementTag,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case WhereRelationKind:return{name:WhereRelationKind,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case WhereRelationNegation:return{name:WhereRelationNegation,properties:[{name:`value`}]};case WhereRelationParticipantKind:return{name:WhereRelationParticipantKind,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case WhereRelationParticipantTag:return{name:WhereRelationParticipantTag,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case WhereRelationTag:return{name:WhereRelationTag,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case WildcardExpression:return{name:WildcardExpression,properties:[{name:`isWildcard`,defaultValue:!1}]};case DynamicStepChain:return{name:DynamicStepChain,properties:[{name:`custom`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};case DynamicStepSingle:return{name:DynamicStepSingle,properties:[{name:`custom`},{name:`dotKind`},{name:`isBackward`,defaultValue:!1},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};default:return{name:i,properties:[]}}}};const reflection=new LikeC4AstReflection;let loadedLikeC4Grammar;const LikeC4Grammar=()=>loadedLikeC4Grammar??=loadGrammarFromJson(`{"$type":"Grammar","isDeclared":true,"name":"LikeC4","rules":[{"$type":"ParserRule","entry":true,"name":"LikeC4Grammar","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"imports","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}},{"$type":"Assignment","feature":"specifications","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}},{"$type":"Assignment","feature":"models","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]}},{"$type":"Assignment","feature":"views","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@44"},"arguments":[]}},{"$type":"Assignment","feature":"globals","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@122"},"arguments":[]}},{"$type":"Assignment","feature":"deployments","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@108"},"arguments":[]}},{"$type":"Assignment","feature":"likec4lib","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}}],"cardinality":"*"},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LikeC4Lib","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"likec4lib"},{"$type":"Keyword","value":"{"},{"$type":"Keyword","value":"icons"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"icons","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]},"cardinality":"+"},{"$type":"Keyword","value":"}"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LibIcon","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@160"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementKind","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Tag","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationshipKind","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CustomColor","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentNodeKind","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationRule","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"specification"}},{"$type":"Keyword","value":"{"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}},{"$type":"Assignment","feature":"relationships","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]}},{"$type":"Assignment","feature":"colors","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}},{"$type":"Assignment","feature":"deploymentNodes","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationElementKind","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"element"},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationElementStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"description"},{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"notation"},{"$type":"Keyword","value":"summary"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationDeploymentNodeKind","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"deploymentNode"},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationTag","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"tag"},{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Group","elements":[{"$type":"Keyword","value":"color"},{"$type":"Assignment","feature":"color","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]}}],"cardinality":"?"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationColor","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"color"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Assignment","feature":"color","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationRelationshipKind","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"relationship"},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@148"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationRelationshipStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"notation"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ImportsFromPoject","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"import"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"imports","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}},{"$type":"Keyword","value":"}"}]},{"$type":"Assignment","feature":"imports","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Keyword","value":"from"},{"$type":"Assignment","feature":"project","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Imported","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"imported","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@20"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"Imported"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"imported","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@20"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Tags","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]},"cardinality":"+"},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"Tags"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]},"cardinality":"*"}],"cardinality":"*"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Model","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"model"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@27"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@34"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Element","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@3"},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@3"},"deprecatedSyntax":false}}]}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@34"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@132"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"description"},{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"summary"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendElement","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"extend"},{"$type":"Assignment","feature":"element","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@31"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@25"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendElementBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@26"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@34"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendElementProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendRelation","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"extend"},{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Keyword","value":"->"}]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@28"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendRelationBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@29"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendRelationProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementRef","definition":{"$type":"Assignment","feature":"modelElement","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StrictFqnElementRef","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"el","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@20"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"StrictFqnElementRef"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Assignment","feature":"el","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@20"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnRef","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnRef"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StrictFqnRef","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"StrictFqnRef"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Relation","parameters":[{"$type":"Parameter","name":"isExplicit"}],"definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","guardCondition":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@34/parameters@0"}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}}]},{"$type":"Group","guardCondition":{"$type":"Negation","value":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@34/parameters@0"}}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]},"cardinality":"?"}]}]},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Keyword","value":"->"}]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"description","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Assignment","feature":"technology","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@35"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"wildcard":false},{"$type":"ParserRule","name":"RelationBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@36"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@37"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@81"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@38"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"description"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationStyleProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"style"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@148"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataProperty","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"metadata"},{"$type":"RuleCall","rule":{"$ref":"#/rules@40"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@41"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataAttribute","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@42"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataValue","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@43"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataArray","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"["},{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"]"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ModelViews","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"views"}},{"$type":"Assignment","feature":"folder","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"views","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@45"},"arguments":[]}},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@74"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LikeC4ViewRule","returnType":{"$ref":"#/types@2"},"definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@46"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@47"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@117"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementView","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"view"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"extends"},{"$type":"Assignment","feature":"extends","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@49"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"of"},{"$type":"Assignment","feature":"viewOf","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}}]}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@51"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicView","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"dynamic"},{"$type":"Keyword","value":"view"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@52"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRef","definition":{"$type":"Assignment","feature":"view","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@2"},"deprecatedSyntax":false}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementViewRef","definition":{"$type":"Assignment","feature":"view","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@46"},"deprecatedSyntax":false}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewRef","definition":{"$type":"Assignment","feature":"view","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@47"},"deprecatedSyntax":false}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementViewBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@55"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"rules","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@58"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@53"},"arguments":[]},"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"steps","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@63"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@65"},"arguments":[]}]}},{"$type":"Assignment","feature":"rules","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@62"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@54"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@55"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewDisplayVariantProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"variant"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@56"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"description"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewLayoutDirection","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"TopBottom"},{"$type":"Keyword","value":"LeftRight"},{"$type":"Keyword","value":"BottomTop"},{"$type":"Keyword","value":"RightLeft"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRule","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@68"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@69"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@61"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@74"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@75"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@59"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleRank","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"rank"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@60"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"arguments":[]}},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RankValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"same"},{"$type":"Keyword","value":"min"},{"$type":"Keyword","value":"max"},{"$type":"Keyword","value":"source"},{"$type":"Keyword","value":"sink"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"group"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@129"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@139"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@130"},"arguments":[]}]},"cardinality":"*"},{"$type":"Assignment","feature":"groupRules","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@68"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@61"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewRule","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@70"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@71"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@74"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@75"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewParallelSteps","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"parallel"},{"$type":"Keyword","value":"par"}]},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"steps","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@65"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"DynamicViewStepTarget","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@79"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewStep","returnType":{"$ref":"#/types@5"},"definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@66"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicStepChain","returnType":{"$ref":"#/interfaces@1"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@67"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@2"},"feature":"source","operator":"="},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"->"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@64"},"arguments":[]}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicStepSingle","returnType":{"$ref":"#/interfaces@1"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isBackward","operator":"?=","terminal":{"$type":"Keyword","value":"<-"}},{"$type":"Keyword","value":"->"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@64"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRulePredicate","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isInclude","operator":"?=","terminal":{"$type":"Keyword","value":"include"}},{"$type":"Keyword","value":"exclude"}]},{"$type":"Assignment","feature":"exprs","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@82"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleGlobalPredicateRef","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"global"},{"$type":"Keyword","value":"predicate"},{"$type":"Assignment","feature":"predicate","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@123"},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewIncludePredicate","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"include"},{"$type":"Assignment","feature":"exprs","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@82"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewGlobalPredicateRef","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"global"},{"$type":"Keyword","value":"predicate"},{"$type":"Assignment","feature":"predicate","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@124"},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleGlobalStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"global"},{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"style","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@125"},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleStyleOrGlobalRef","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@72"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@73"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleAutoLayout","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"autoLayout"},{"$type":"Assignment","feature":"direction","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@57"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"rankSep","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Assignment","feature":"nodeSep","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"NotationProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"notation"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"NotesProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"notes"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CustomElementProperties","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@80"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@77"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CustomRelationProperties","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@81"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@37"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@77"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@148"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"NavigateToProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"navigateTo"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@48"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationNavigateToProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"navigateTo"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@50"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Expressions","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@83"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"Expressions"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@83"},"arguments":[]},"cardinality":"?"}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExpressionV2","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@86"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@84"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExprOrWith","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@85"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnExprWith"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"with"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@78"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExprOrWhere","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnExprWhere"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"where"},{"$type":"Assignment","feature":"where","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@96"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationExprOrWith","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@87"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"RelationExprWith"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"with"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@79"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationExprOrWhere","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@90"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"RelationExprWhere"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"where"},{"$type":"Assignment","feature":"where","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@102"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExpr","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WildcardExpression"}},{"$type":"Assignment","feature":"isWildcard","operator":"?=","terminal":{"$type":"Keyword","value":"*"}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"ElementTagExpression"}},{"$type":"Keyword","value":"element.tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"ElementKindExpression"}},{"$type":"Keyword","value":"element.kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@3"},"deprecatedSyntax":false}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@89"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnRefExpr","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"ref","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Assignment","feature":"selector","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@177"},"arguments":[]}]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationExpr","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@91"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@93"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"InOutRelationExpr","inferredType":{"$type":"InferredType","name":"RelationExpr"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@92"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"InOutRelationExpr"},"feature":"inout","operator":"="},{"$type":"Keyword","value":"->"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IncomingRelationExpr","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"->"},{"$type":"Assignment","feature":"to","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DirectedRelationExpr","inferredType":{"$type":"InferredType","name":"RelationExpr"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@94"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"DirectedRelationExpr"},"feature":"source","operator":"="},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]}}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"OutgoingRelationExpr","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"from","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isBidirectional","operator":"?=","terminal":{"$type":"Keyword","value":"<->"}},{"$type":"Keyword","value":"->"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExpressions","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnExpressions"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]},"cardinality":"?"}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementExpression","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@97"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementOr","inferredType":{"$type":"InferredType","name":"WhereElementExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@98"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"or"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@98"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementAnd","inferredType":{"$type":"InferredType","name":"WhereElementExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@99"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"and"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@99"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementPrimary","inferredType":{"$type":"InferredType","name":"WhereElementExpression"},"definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"("},{"$type":"RuleCall","rule":{"$ref":"#/rules@96"},"arguments":[]},{"$type":"Keyword","value":")"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@100"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@101"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementNegation","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"not"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@96"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElement","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereElementTag"}},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereElementKind"}},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@6"},"deprecatedSyntax":false}}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationExpression","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@103"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationOr","inferredType":{"$type":"InferredType","name":"WhereRelationExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@104"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"or"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@104"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationAnd","inferredType":{"$type":"InferredType","name":"WhereRelationExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@105"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"and"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@105"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationPrimary","inferredType":{"$type":"InferredType","name":"WhereRelationExpression"},"definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"("},{"$type":"RuleCall","rule":{"$ref":"#/rules@102"},"arguments":[]},{"$type":"Keyword","value":")"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@106"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@107"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationNegation","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"not"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@102"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelation","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationTag"}},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationKind"}},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantTag"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantKind"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ModelDeployments","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"deployment"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@109"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@115"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@113"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentNode","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@7"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@7"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}]}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Assignment","feature":"summary","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@110"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentNodeBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@111"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@115"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@109"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeployedInstance","definition":{"$type":"Group","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"arguments":[]}],"cardinality":"?"},{"$type":"Keyword","value":"instanceOf"},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Assignment","feature":"summary","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@112"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeployedInstanceBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@115"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendDeployment","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"extend"},{"$type":"Assignment","feature":"deploymentNode","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@33"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@114"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendDeploymentBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@26"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@111"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@115"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@109"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentRelation","parameters":[{"$type":"Parameter","name":"isExplicit"}],"definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","guardCondition":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@115/parameters@0"}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}}]},{"$type":"Group","guardCondition":{"$type":"Negation","value":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@115/parameters@0"}}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]},"cardinality":"?"}]}]},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Keyword","value":"->"}]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"description","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}},{"$type":"Assignment","feature":"technology","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@116"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentRelationBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@36"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentView","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"deployment"},{"$type":"Keyword","value":"view"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@118"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentViewBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@55"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"rules","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@119"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentViewRule","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@121"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@120"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@75"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentViewRuleStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentViewRulePredicate","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isInclude","operator":"?=","terminal":{"$type":"Keyword","value":"include"}},{"$type":"Keyword","value":"exclude"}]},{"$type":"Assignment","feature":"expr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@82"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Globals","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"global"}},{"$type":"Keyword","value":"{"},{"$type":"Group","elements":[{"$type":"Assignment","feature":"predicates","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@123"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@124"},"arguments":[]}]},"cardinality":"*"},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@126"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@127"},"arguments":[]}]},"cardinality":"*"}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalPredicateGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"predicateGroup"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"predicates","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@68"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalDynamicPredicateGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"dynamicPredicateGroup"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"predicates","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@70"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalStyleId","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@125"},"arguments":[]}},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalStyleGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"styleGroup"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@125"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@72"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LinkProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"link"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@161"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ColorProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"color"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"themeColor","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@154"},"arguments":[]}},{"$type":"Assignment","feature":"customColor","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]},"deprecatedSyntax":false}}]},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"OpacityProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"opacity"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@183"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MultipleProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"multiple"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@171"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"icon"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"libicon","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@2"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@160"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"none"},{"$type":"RuleCall","rule":{"$ref":"#/rules@161"},"arguments":[]}]}}]},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconColorProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"iconColor"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"themeColor","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@154"},"arguments":[]}},{"$type":"Assignment","feature":"customColor","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]},"deprecatedSyntax":false}}]},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"iconSize"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconPositionValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"left"},{"$type":"Keyword","value":"right"},{"$type":"Keyword","value":"top"},{"$type":"Keyword","value":"bottom"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconPositionProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"iconPosition"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@135"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ShapeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"shape"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@155"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"BorderStyleValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]},{"$type":"Keyword","value":"none"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"BorderProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"border"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@138"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SizeValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"xs"},{"$type":"Keyword","value":"sm"},{"$type":"Keyword","value":"md"},{"$type":"Keyword","value":"lg"},{"$type":"Keyword","value":"xl"},{"$type":"Keyword","value":"xsmall"},{"$type":"Keyword","value":"small"},{"$type":"Keyword","value":"medium"},{"$type":"Keyword","value":"large"},{"$type":"Keyword","value":"xlarge"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ShapeSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"size"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"PaddingSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"padding"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"TextSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"textSize"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StyleProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@129"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@137"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@139"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@130"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@132"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@133"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@131"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@141"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@142"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@143"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@134"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@136"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementStyleProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"style"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LineProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"line"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ArrowProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"head"},{"$type":"Keyword","value":"tail"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationshipStyleProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@129"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@146"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@147"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"TagRef","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@4"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationKindDotRef","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LineOptions","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"solid"},{"$type":"Keyword","value":"dashed"},{"$type":"Keyword","value":"dotted"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ArrowType","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"none"},{"$type":"Keyword","value":"normal"},{"$type":"Keyword","value":"onormal"},{"$type":"Keyword","value":"dot"},{"$type":"Keyword","value":"odot"},{"$type":"Keyword","value":"diamond"},{"$type":"Keyword","value":"odiamond"},{"$type":"Keyword","value":"crow"},{"$type":"Keyword","value":"open"},{"$type":"Keyword","value":"vee"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewDisplayVariantValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"diagram"},{"$type":"Keyword","value":"sequence"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ThemeColor","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"primary"},{"$type":"Keyword","value":"secondary"},{"$type":"Keyword","value":"muted"},{"$type":"Keyword","value":"slate"},{"$type":"Keyword","value":"blue"},{"$type":"Keyword","value":"indigo"},{"$type":"Keyword","value":"sky"},{"$type":"Keyword","value":"red"},{"$type":"Keyword","value":"gray"},{"$type":"Keyword","value":"green"},{"$type":"Keyword","value":"amber"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementShape","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"rectangle"},{"$type":"Keyword","value":"component"},{"$type":"Keyword","value":"person"},{"$type":"Keyword","value":"browser"},{"$type":"Keyword","value":"mobile"},{"$type":"Keyword","value":"cylinder"},{"$type":"Keyword","value":"storage"},{"$type":"Keyword","value":"queue"},{"$type":"Keyword","value":"bucket"},{"$type":"Keyword","value":"document"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Participant","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"source"},{"$type":"Keyword","value":"target"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ColorLiteral","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@158"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@159"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RGBAColor","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"rgba"},{"$type":"Keyword","value":"rgb"}]},{"$type":"Keyword","value":"("},{"$type":"Assignment","feature":"red","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"green","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"blue","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"alpha","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@183"},"arguments":[]}]},"cardinality":"?"},{"$type":"Keyword","value":")"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"HexColor","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},{"$type":"Assignment","feature":"hex","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]}]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconId","dataType":"string","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@172"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Uri","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@173"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@175"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MarkdownOrString","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"markdown","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@184"},"arguments":[]}},{"$type":"Assignment","feature":"text","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@185"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CustomColorId","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@155"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]},{"$type":"Keyword","value":"element"},{"$type":"Keyword","value":"model"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Id","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@155"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@154"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@135"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@60"},"arguments":[]},{"$type":"Keyword","value":"element"},{"$type":"Keyword","value":"model"},{"$type":"Keyword","value":"group"},{"$type":"Keyword","value":"node"},{"$type":"Keyword","value":"deployment"},{"$type":"Keyword","value":"instance"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EqOperator","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@181"},"arguments":[]}]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"is"}},{"$type":"Assignment","feature":"not","operator":"?=","terminal":{"$type":"Keyword","value":"not"},"cardinality":"?"}]}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"IsEqual","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isEqual","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@182"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@181"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","hidden":true,"name":"BLOCK_COMMENT","definition":{"$type":"RegexToken","regex":"/\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\//"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/\\\\/\\\\/[^\\\\n\\\\r]*/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"WS","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"NL","definition":{"$type":"RegexToken","regex":"/[\\\\r\\\\n]+/"},"fragment":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"RegexToken","regex":"/\\\\b(true|false)\\\\b/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"LIB_ICON","definition":{"$type":"RegexToken","regex":"/(aws|azure|bootstrap|gcp|tech):[-\\\\w]*/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"URI_WITH_SCHEMA","definition":{"$type":"RegexToken","regex":"/\\\\w+:\\\\/{2}\\\\S+/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"URI_RELATIVE","definition":{"$type":"RegexToken","regex":"/\\\\.{0,2}\\\\/[^\\\\/]\\\\S+/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"URI_ALIAS","definition":{"$type":"RegexToken","regex":"/@[a-zA-Z0-9_-]*\\\\/[^\\\\s]+/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"DotUnderscore","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\._(?![_a-zA-Z])/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"DotWildcard","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\.\\\\*{1,2}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Hash","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"#"}},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"StickyDot","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\./"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Dot","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"."}},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NotEqual","definition":{"$type":"RegexToken","regex":"/\\\\!\\\\={1,2}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Eq","definition":{"$type":"RegexToken","regex":"/\\\\={1,2}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Percent","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\d+%/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"MarkdownString","definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalGroup","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"'''"}},{"$type":"UntilToken","terminal":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"'''"}}}]},{"$type":"TerminalGroup","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"\\"\\"\\""}},{"$type":"UntilToken","terminal":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"\\"\\"\\""}}}]}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"String","definition":{"$type":"RegexToken","regex":"/\\"(?:[^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'(?:[^'\\\\\\\\]|\\\\\\\\.)*'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Float","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/\\\\b\\\\d+\\\\.\\\\d+\\\\b/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Number","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/\\\\b\\\\d+\\\\b/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"IdTerminal","definition":{"$type":"RegexToken","regex":"/[_]*[a-zA-Z][-\\\\w]*/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Hex","definition":{"$type":"RegexToken","regex":"/[a-fA-F0-9]{3,}(?![-_g-zG-Z])/"},"fragment":false,"hidden":false}],"types":[{"$type":"Type","name":"ModelReferenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@20"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@17"}}]}},{"$type":"Type","name":"Referenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@109"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@111"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@20"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@17"}}]}},{"$type":"Type","name":"LikeC4View","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@46"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@47"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@117"}}]}},{"$type":"Type","name":"StringProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@23"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@56"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@37"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@41"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@10"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@15"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@76"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@77"}}]}},{"$type":"Type","name":"AnyProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/types@3"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@55"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@53"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@22"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@36"}}]}},{"$type":"Type","name":"DynamicViewStep","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@1"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@2"}}]}},{"$type":"Type","name":"DeploymentNodeOrElementKind","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@3"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@7"}}]}},{"$type":"Type","name":"WhereTagEqual","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@101/definition/elements@0/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@107/definition/elements@0/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@107/definition/elements@2/elements@0/inferredType"}}]}},{"$type":"Type","name":"WhereKindEqual","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@101/definition/elements@1/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@107/definition/elements@1/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@107/definition/elements@3/elements@0/inferredType"}}]}},{"$type":"Type","name":"WhereExpression","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@96"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@102"}}]}},{"$type":"Type","name":"DeploymentElement","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@109"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@111"}}]}},{"$type":"Type","name":"FqnReferenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/types@1"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@20"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@24"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@113"}}]}},{"$type":"Type","name":"SizeProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@141"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@142"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@143"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@134"}}]}}],"interfaces":[{"$type":"Interface","name":"AbstractDynamicStep","attributes":[{"$type":"TypeAttribute","name":"kind","isOptional":true,"type":{"$type":"ReferenceType","referenceType":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@5"}}}},{"$type":"TypeAttribute","name":"dotKind","isOptional":true,"type":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@150"}}},{"$type":"TypeAttribute","name":"target","type":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@30"}},"isOptional":false},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"custom","isOptional":true,"type":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@79"}}}],"superTypes":[]},{"$type":"Interface","name":"DynamicStepSingle","superTypes":[{"$ref":"#/interfaces@0"}],"attributes":[{"$type":"TypeAttribute","name":"source","type":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@30"}},"isOptional":false},{"$type":"TypeAttribute","name":"isBackward","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"boolean"}}]},{"$type":"Interface","name":"DynamicStepChain","superTypes":[{"$ref":"#/interfaces@0"}],"attributes":[{"$type":"TypeAttribute","name":"source","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@1"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@2"}}]},"isOptional":false}]}],"definesHiddenTokens":false,"hiddenTokens":[],"imports":[],"usedGrammars":[]}`),LikeC4LanguageMetaData={languageId:`likec4`,fileExtensions:[`.c4`,`.likec4`,`.like-c4`],caseInsensitive:!1,mode:`production`},parserConfig={skipValidations:!0,recoveryEnabled:!0,nodeLocationTracking:`full`},LikeC4GeneratedSharedModule={AstReflection:()=>new LikeC4AstReflection},LikeC4GeneratedModule={Grammar:()=>LikeC4Grammar(),LanguageMetaData:()=>LikeC4LanguageMetaData,parser:{ParserConfig:()=>parserConfig}};function hasLikeC4Ext(i){return LikeC4LanguageMetaData.fileExtensions.some(a=>i!==a&&i.endsWith(a))}function excludeNodeModules(i){return[`node_modules`,`.git`,`.svn`,`.yarn`,`.pnpm`].includes(i)}const compare$2=compareNaturalHierarchically(`/`);function ensureOrder$1(i,a){return compare$2(i.uri.path,a.uri.path)}const logger$15=logger$16.getChild(`chokidar`),WithChokidarWatcher={fileSystemWatcher:i=>new ChokidarFileSystemWatcher(i)},isAnyLikeC4File=i=>{let a=basename(i);return hasLikeC4Ext(a)||isLikeC4Config(a)||isManualLayoutFile(a)};var ChokidarFileSystemWatcher=class{watcher;queue=new PQueue({concurrency:1,timeout:5e3});constructor(i){this.services=i}watch(i){if(this.watcher){logger$15.debug`add watching folder: ${i}`,this.watcher.add(i);return}this.watcher=this.createWatcher(i)}async dispose(){if(this.watcher){let i=this.watcher;this.watcher=void 0,await i.close()}}createWatcher(i){logger$15.debug`create watcher for folder: ${i}`;let a=chokidar.watch(i,{ignored:[i=>i.includes(`node_modules`)||i.includes(`.git`),(i,a)=>!!a?.isFile()&&!isAnyLikeC4File(i)],followSymlinks:!0,ignoreInitial:!0}),o=(i,a)=>{a?.isDirectory()||this.enqueueFileOp(`addOrChange: `+i,async()=>{await this.onAddOrChange(i)})},s=(i,a)=>{a?.isDirectory()||this.enqueueFileOp(`remove: `+i,async()=>{await this.onRemove(i)})};return a.on(`add`,o).on(`change`,o).on(`unlink`,s).on(`unlinkDir`,i=>{this.enqueueFileOp(`removeDir: `+i,async()=>{await this.onRemoveDir(i)})}),a}enqueueFileOp(i,a){this.queue.add(async()=>{try{await a()}catch(a){logger$15.warn(`Failed on {fileop}`,{fileop:i,error:a})}}).catch(a=>{logger$15.error(`Error on {fileop}`,{fileop:i,error:a})})}async onAddOrChange(i){let a=this.services.workspace,o=basename(i),s=URI.file(i);switch(!0){case isLikeC4Config(o):logger$15.debug`project file changed: ${i}`,a.ManualLayouts.clearCaches(),await a.ProjectsManager.registerConfigFile(s);break;case hasLikeC4Ext(o):logger$15.debug`file changed: ${i}`,await a.DocumentBuilder.update([s],[]);break;case isManualLayoutFile(o):{logger$15.debug`manual layout file changed: ${i}`,a.ManualLayouts.clearCaches();let o=a.ProjectsManager.ownerProjectId(s);await a.ProjectsManager.rebuildProject(o);break}default:logger$15.warn`Unknown file change: ${i}`}}async onRemove(i){let a=this.services.workspace,o=basename(i),s=URI.file(i);switch(!0){case isLikeC4Config(o):logger$15.debug`project file removed: ${i}`,a.ManualLayouts.clearCaches(),await a.ProjectsManager.reloadProjects();break;case hasLikeC4Ext(o):logger$15.debug`file removed: ${i}`,await a.DocumentBuilder.update([],[s]);break;case isManualLayoutFile(o):{logger$15.debug`manual layout file removed: ${i}`;let o=a.ProjectsManager.ownerProjectId(s);a.ManualLayouts.clearCaches(),await a.ProjectsManager.rebuildProject(o);break}default:logger$15.warn`Unknown file removal: ${i}`}}async onRemoveDir(i){logger$15.debug`directory removed: ${i}`;let a=this.services.workspace;a.ProjectsManager.findOverlaped(i).length>0&&(a.ManualLayouts.clearCaches(),await a.ProjectsManager.reloadProjects())}};const logger$14=logger$16.getChild(`filesystem`);function isLikeC4ConfigFile(i,a=!1){return!a&&isLikeC4Config(basename(i))}function isLikeC4File(i,a=!1){return!a&&hasLikeC4Ext(basename(i))}const WithFileSystem=(i=!0)=>({fileSystemProvider:()=>new SymLinkTraversingFileSystemProvider,...i?WithChokidarWatcher:NoFileSystemWatcher});var SymLinkTraversingFileSystemProvider=class extends NodeFileSystemProvider{async readFile(i){if(isLikeC4Builtin(i))return Promise.resolve(LibIcons);try{return await super.readFile(i)}catch(a){return logger$14.warn(`Failed to read file ${i.fsPath}`,{error:a}),``}}async readDirectory(i,a){let o=a?.recursive??!0,s=a?.maxDepth??1/0,c=[];try{let a=new fdir().withSymlinks({resolvePaths:!1}).exclude(excludeNodeModules).withFullPaths().filter(isLikeC4File);o?s!==1/0&&(a=a.withMaxDepth(s)):a=a.withMaxDepth(1);let l=await a.crawl(i.fsPath).withPromise();for(let i of l)c.push({isFile:!0,isDirectory:!1,uri:URI.file(i)})}catch(a){logger$14.warn(`Failed to read directory ${i.fsPath}`,{error:a})}return c.sort(ensureOrder$1)}async scanProjectFiles(i){return await this.scanDirectory(i,isLikeC4ConfigFile)}async scanDirectory(i,a){let o=[];try{let s=await new fdir().withSymlinks({resolvePaths:!1}).exclude(excludeNodeModules).withFullPaths().filter(a).crawl(i.fsPath).withPromise();for(let i of s)o.push({isFile:!0,isDirectory:!1,uri:URI.file(i)})}catch(a){logger$14.warn(`Failed to scan directory {path}`,{path:i.fsPath,error:a})}return o}async loadProjectConfig(i){return await loadConfig(i)}async writeFile(i,a){let o=dirname(i.fsPath),s=statSync(o,{throwIfNoEntry:!1});if(s?.isFile())throw Error(`Cannot create directory ${o} because a file with the same name exists.`);return s||(logger$14.debug(`creating directory {path}`,{path:o}),mkdirSync(o,{recursive:!0})),logger$14.debug(`writing file {path}`,{path:i.fsPath}),await writeFile(i.fsPath,a,{encoding:`utf-8`})}async deleteFile(i){try{let a=i.fsPath,o=statSync(a,{throwIfNoEntry:!1});return o?.isFile()||o?.isSymbolicLink()?(await unlink(a),logger$14.debug(`deleted file {path}`,{path:a}),!0):(logger$14.warn(`deleteFile failed: {path} does not exist, or is not a file`,{path:a}),!1)}catch(a){logger$14.warn(`Failed to delete file ${i.fsPath}`,{error:a})}return!1}};const containerMargin={top:50,right:40,bottom:40,left:40};function safeApplyLayout(i,a){let o=i.nodes.map(i=>{let o=a.nodes[i.id];if(!o)return i;let{x:s,y:c,width:l,height:d}=o;return{...i,width:l,height:d,x:s,y:c}}),s=i.edges.map(i=>{let o=a.edges[i.id];return o?{...i,...o}:i});return{...i,bounds:{x:a.x,y:a.y,width:a.width,height:a.height},nodes:o,edges:s}}function applyManualLayout$1(i,a){let o=new Map(i.nodes.map(i=>[i.id,i]));if(i.hash===a.hash||canApplySafely(i,a))return adjustCompoundNodes(i.nodes.filter(i=>!i.parent),o,a),safeApplyLayout(i,a);i.hasLayoutDrift=!0;let s=BBox$1.merge(...i.nodes.map(i=>a.nodes[i.id]).filter(i=>!!i));return i.nodes.filter(i=>i.parent==null).reduce((i,s)=>layoutNode(s,i,o,a),{x:s.x,y:s.y+s.height+100}),i.edges.filter(i=>!a.edges[i.id]).forEach(i=>layoutEdge(i,a)),safeApplyLayout(i,a)}function layoutNode(i,a,o,s){let c=s.nodes[i.id],l=c?.isCompound??!1,d=!c,f=d?a:{x:c.x,y:c.y},p=i.children.map(i=>s.nodes[i]).filter(i=>!!i),m=p.length>0&&BBox$1.merge(...p),h=l&&m?{x:m.x,y:m.y+m.height+100}:{x:f.x+containerMargin.left,y:f.y+containerMargin.top};return i.children.map(i=>o.get(i)).reduce((i,a)=>layoutNode(a,i,o,s),h),c=i.children.length>0?buildCompoundNodeLayout(i,s):s.nodes[i.id]??{isCompound:!1,width:i.width,height:i.height,x:f.x,y:f.y},s.nodes[i.id]=c,d?{x:c.x+c.width+100,y:c.y}:a}function layoutEdge(i,a){let o=a.nodes[i.source],s=a.nodes[i.target],c=toVector(BBox$1.center(o)),l=toVector(BBox$1.center(s)),d=l.subtract(c),{x:f,y:p}=d.divide(2).add(c),m={...i?.labelBBox??{width:0,height:0},x:f,y:p},h=d.multiply(.7).add(c),g=d.multiply(.3).add(c);a.edges[i.id]={points:[[c.x,c.y],[g.x,g.y],[h.x,h.y],[l.x,l.y]],labelBBox:m,controlPoints:[h]}}function adjustCompoundNodes(i,a,o){i.filter(i=>i.children.length>0).forEach(i=>{adjustCompoundNodes(i.children.map(i=>a.get(i)).filter(i=>!!i),a,o),o.nodes[i.id]=buildCompoundNodeLayout(i,o)})}function buildCompoundNodeLayout(i,a){let o=BBox$1.merge(...i.children.map(i=>a.nodes[i]));return{isCompound:!0,x:o.x-containerMargin.left,y:o.y-containerMargin.top,width:o.width+containerMargin.left+containerMargin.right,height:o.height+containerMargin.top+containerMargin.bottom}}function canApplySafely(i,a){let o=i=>i.children.length>0;return deepEqual(i.autoLayout,a.autoLayout)&&i.nodes.every(i=>{let s=a.nodes[i.id];return!!s&&o(i)===s.isCompound})&&i.edges.every(i=>!!a.edges[i.id])}function toVector({x:i,y:a}){return new Vector(i,a)}function isCompound(i){return i.children.length>0}function toArrowType(i){switch(i){case`open`:return`vee`;default:return i}}function pointToPx(i){return Array.isArray(i)?[pointToPx(i[0]),pointToPx(i[1])]:(invariant$1(isFinite(i),`Invalid not finite point value ${i}`),Math.round(i))}const inchToPx=i=>(invariant$1(isFinite(i),`Invalid not finite inch value ${i}`),Math.floor(i*72)),pxToInch=i=>Math.ceil(i/72*1e3)/1e3,pxToPoints=i=>Math.ceil(i);pxToPoints(40).toString();function compoundColor(i,a){return toHex(scale(i,{l:-35-5*a,s:-15-5*a}))}function compoundLabelColor(i){return toHex(transparentize(i,.3))}var import_word_wrap=__toESM(require_word_wrap(),1);function sanitize(i){return i.trim().replaceAll(`&`,`&amp;`).replaceAll(`<`,`&lt;`).replaceAll(`>`,`&gt;`)}function wrap(i,{maxchars:a,maxLines:s,sanitize:c=e$2()}){let l=(0,import_word_wrap.default)(i,{width:a,indent:``,escape:c}).split(`
29
+ `);return e$3(s)&&s>0&&l.length>s&&(l=l.slice(0,s)),l}function wrapWithFont({text:i,maxchars:a,fontsize:o,maxLines:s,bold:c,color:l}){let d=wrap(i,{maxchars:a,maxLines:s,sanitize}).join(`<BR/>`);c&&(d=`<B>${d}</B>`);let f=l?` COLOR="${l}"`:``;return`<FONT POINT-SIZE="${pxToPoints(o)}"${f}>${d}</FONT>`}function maxchars(i){switch(i){case`xs`:case`sm`:return 30;case`md`:return 40;case`lg`:case`xl`:return 55;default:nonexhaustive$1(i)}}function nodeLabel(i,a){let{sizes:{size:o},values:s}=a.nodeSizes(i.style),c=a.colors(i.color).elements,l=[`sm`,`xs`].includes(o),d=e$4(i.icon),f=i.style.iconPosition??`left`,p=d&&(f===`left`||f===`right`),m=[wrapWithFont({text:i.title,fontsize:s.textSize,maxchars:maxchars(o),maxLines:l?1:3})];if(o!==`xs`){e$4(i.technology?.trim())&&m.push(wrapWithFont({text:i.technology,fontsize:Math.ceil(s.textSize*.65),maxchars:p?35:45,maxLines:1,color:c.loContrast}));let a=RichText.from(i.description).text;a&&m.push(wrapWithFont({text:a,fontsize:Math.ceil(s.textSize*.75),maxchars:p?35:45,maxLines:l?3:5,color:c.loContrast}))}if(m.length===1&&d===!1)return`<${m[0]}>`;let h=p?(a,o,c)=>{let l=`<TD ALIGN="TEXT" BALIGN="LEFT">${a}</TD>`;if(o===0){let a=c.length>1?` ROWSPAN="${c.length}"`:``,o=Math.ceil(s.iconSize+16);(i.shape===`queue`||i.shape===`mobile`)&&(o+=20),f===`right`?(l=`<TD${a} WIDTH="16"> </TD>${l}`,l=`${l}<TD${a} WIDTH="${o}"> </TD>`):(l=`<TD${a} WIDTH="${o}"> </TD>${l}`,l=`${l}<TD${a} WIDTH="16"> </TD>`)}return`<TR>${l}</TR>`}:i=>`<TR><TD>${i}</TD></TR>`,g=m.map(h).join(``);if(d&&(f===`top`||f===`bottom`)){let i=`<TR><TD HEIGHT="${Math.ceil(s.iconSize+8)}"> </TD></TR>`;g=f===`top`?`${i}${g}`:`${g}${i}`}return`<<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="4">${g}</TABLE>>`}function compoundLabel(i,a){let o=wrapWithFont({text:i.title.toUpperCase(),maxchars:50,fontsize:11,maxLines:1,bold:!0,color:a});return o.includes(`<BR/>`)?`<<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0"><TR><TD ALIGN="TEXT" BALIGN="LEFT">${o}</TD></TR></TABLE>>`:`<${o}>`}const BGCOLOR=`BGCOLOR="${LikeC4Styles.DEFAULT.relationshipColors.labelBg}A0"`;function edgelabel({label:i,technology:a}){let o=[];return e$4(i?.trim())&&o.push(wrapWithFont({text:i,maxchars:40,fontsize:14,maxLines:5,bold:i===`[...]`})),e$4(a?.trim())&&o.push(wrapWithFont({text:`[ ${a} ]`,fontsize:12,maxLines:1,maxchars:40})),o.length===0?null:`<<TABLE BORDER="0" CELLPADDING="3" CELLSPACING="0" ${BGCOLOR}>${o.map(i=>`<TR><TD ALIGN="TEXT" BALIGN="LEFT">${i}</TD></TR>`).join(``)}</TABLE>>`}function stepEdgeLabel(i,a){let o=`<TABLE BORDER="0" CELLPADDING="6" ${BGCOLOR}><TR><TD WIDTH="20" HEIGHT="20"><FONT POINT-SIZE="${pxToPoints(14)}"><B>${i}</B></FONT></TD></TR></TABLE>`;return e$4(a?.trim())?`<${[`<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">`,`<TR>`,`<TD>${o}</TD>`,`<TD ${BGCOLOR} CELLPADDING="3">`,wrapWithFont({text:a,maxchars:40,fontsize:14,maxLines:5}),`</TD>`,`</TR>`,`</TABLE>`].join(``)}>`:`<${o}>`}const DefaultEdgeStyle=`dashed`,FontName=`Arial`,logger$13=createLogger(`dot`),GraphClusterSpace=50.1;var DotPrinter=class{ids=new Set;subgraphs=new Map;nodes=new Map;edges=new Map;compoundIds;edgesWithCompounds;graphology=new Graph({allowSelfLoops:!0,multi:!0,type:`directed`});graphvizModel;constructor(i,a){this.view=i,this.styles=a,this.compoundIds=new Set(i.nodes.filter(isCompound).map(i=>i.id)),this.edgesWithCompounds=new Set(this.compoundIds.size>0?i.edges.filter(i=>this.compoundIds.has(i.source)||this.compoundIds.has(i.target)).map(i=>i.id):[]);for(let a of i.nodes)this.graphology.addNode(a.id,{origin:a,level:a.level,depth:a.depth??0,modelRef:a.modelRef??null,deploymentRef:a.deploymentRef??null,maxConnectedHierarchyDistance:0});for(let a of i.edges){let i=this.graphology.getNodeAttribute(a.source,`deploymentRef`),o=this.graphology.getNodeAttribute(a.target,`deploymentRef`);(i===null||o===null)&&(i=this.graphology.getNodeAttribute(a.source,`modelRef`),o=this.graphology.getNodeAttribute(a.target,`modelRef`));let s=-1;i!==null&&o!==null&&(s=hierarchyDistance(i,o)),this.graphology.addEdgeWithKey(a.id,a.source,a.target,{origin:a,hierarchyDistance:s,weight:1}),s>this.graphology.getNodeAttribute(a.source,`maxConnectedHierarchyDistance`)&&this.graphology.mergeNodeAttributes(a.source,{maxConnectedHierarchyDistance:s}),s>this.graphology.getNodeAttribute(a.target,`maxConnectedHierarchyDistance`)&&this.graphology.mergeNodeAttributes(a.target,{maxConnectedHierarchyDistance:s})}this.graphology.forEachEdge((i,{hierarchyDistance:a},o,s,c,l)=>{let d=Math.max(c.maxConnectedHierarchyDistance,l.maxConnectedHierarchyDistance);if(d>a)this.graphology.mergeEdgeAttributes(i,{weight:d-a+1});else{let c=this.graphology.directedDegree(o),l=this.graphology.directedDegree(s);c===1&&l===1&&a>1&&this.graphology.mergeEdgeAttributes(i,{weight:a})}});let o=this.graphvizModel=this.createGraph();this.applyNodeAttributes(o.attributes.node),this.applyEdgeAttributes(o.attributes.edge),this.build(o),this.postBuild(o)}get $defaults(){return this.styles.defaults}get hasEdgesWithCompounds(){return this.edgesWithCompounds.size>0}get defaultRelationshipColors(){let i=this.styles.relationshipColors;return{line:i.line,label:i.label,labelBg:i.labelBg}}postBuild(i){}build(i){let a=(i,o)=>{let s=this.generateGraphvizId(i),c=this.elementToSubgraph(i,o.subgraph(s));this.subgraphs.set(i.id,c);for(let o of i.children){let i=this.computedNode(o);if(isCompound(i))a(i,c);else{let a=nonNullable$1(this.getGraphNode(i.id),`Graphviz Node not found for ${i.id}`);c.node(a.id)}}},o=[];for(let a of this.view.nodes)if(isCompound(a))e$5(a.parent)&&o.push(a);else{let o=this.generateGraphvizId(a),s=this.elementToNode(a,i.node(o));this.nodes.set(a.id,s)}for(let s of o)a(s,i);for(let a of this.view.edges){let o=this.addEdge(a,i);o&&this.edges.set(a.id,o)}}print(){return toDot(this.graphvizModel,{print:{indentStyle:`space`,indentSize:2}})}createGraph(){let i=this.view.autoLayout,a=digraph({[attribute.likec4_viewId]:this.view.id,[attribute.bgcolor]:`transparent`,[attribute.layout]:`dot`,[attribute.compound]:!0,[attribute.rankdir]:i.direction,[attribute.TBbalance]:`min`,[attribute.splines]:`spline`,[attribute.outputorder]:`nodesfirst`,[attribute.nodesep]:pxToInch(i.nodeSep??110),[attribute.ranksep]:pxToInch(i.rankSep??120),[attribute.pad]:pxToInch(15),[attribute.fontname]:FontName});return a.attributes.graph.apply({[attribute.fontsize]:pxToPoints(this.styles.fontSize()),[attribute.labeljust]:i.direction===`RL`?`r`:`l`,[attribute.labelloc]:i.direction===`BT`?`b`:`t`,[attribute.margin]:GraphClusterSpace}),a}applyNodeAttributes(i){let a=this.styles.elementColors;i.apply({[attribute.fontname]:FontName,[attribute.shape]:`rect`,[attribute.fillcolor]:a.fill,[attribute.fontcolor]:a.hiContrast,[attribute.color]:a.stroke,[attribute.style]:`filled`,[attribute.penwidth]:0})}applyEdgeAttributes(i){let a=this.defaultRelationshipColors;i.apply({[attribute.arrowsize]:.75,[attribute.fontname]:FontName,[attribute.fontsize]:pxToPoints(14),[attribute.penwidth]:pxToPoints(2),[attribute.color]:a.line,[attribute.fontcolor]:a.label})}checkNodeId(i,a=!1){return a?i=`cluster_`+i:i.toLowerCase().startsWith(`cluster`)&&(i=`nd_`+i),this.ids.has(i)?null:(this.ids.add(i),i)}generateGraphvizId(i){let a=isCompound(i),o=nameFromFqn$1(i.id).toLowerCase(),s=this.checkNodeId(o,a);if(s!==null)return s;o=nameFromFqn$1(i.id).toLowerCase();let c=1;do s=this.checkNodeId(o+`_`+ c++,a);while(s===null);return s}elementToSubgraph(i,a){invariant$1(isCompound(i),`node should be compound`),invariant$1(e$6(i.depth),`node.depth should be defined`);let o=this.styles.colors(i.color).elements,s=compoundLabelColor(o.loContrast);return a.apply({[attribute.likec4_id]:i.id,[attribute.likec4_level]:i.level,[attribute.likec4_depth]:i.depth,[attribute.fillcolor]:compoundColor(o.fill,i.depth),[attribute.color]:compoundColor(o.stroke,i.depth),[attribute.style]:`filled`,[attribute.margin]:pxToPoints(i.children.length>1?40:32)}),e$7(i.title.trim())||a.set(attribute.label,compoundLabel(i,s)),a}elementToNode(i,a){invariant$1(!isCompound(i),`node should not be compound`);let o=e$4(i.icon),s=this.styles.colors(i.color).elements,{values:{padding:c,sizes:{width:l,height:d}}}=this.styles.nodeSizes(i.style),f=o?8:c;switch(a.attributes.apply({[attribute.likec4_id]:i.id,[attribute.likec4_level]:i.level,[attribute.label]:nodeLabel(i,this.styles),[attribute.margin]:`${pxToInch(f)},${pxToInch(c)}`}),a.attributes.set(attribute.width,pxToInch(l)),a.attributes.set(attribute.height,pxToInch(d)),this.styles.isDefaultColor(i.color)||a.attributes.apply({[attribute.fillcolor]:s.fill,[attribute.fontcolor]:s.hiContrast,[attribute.color]:s.stroke}),i.shape){case`cylinder`:case`storage`:a.attributes.apply({[attribute.margin]:`${pxToInch(f)},${pxToInch(0)}`,[attribute.penwidth]:pxToPoints(2),[attribute.shape]:`cylinder`});break;case`browser`:a.attributes.apply({[attribute.margin]:`${pxToInch(o?f:f+4)},${pxToInch(c+6)}`});break;case`mobile`:a.attributes.apply({[attribute.margin]:`${pxToInch(o?f:f+4)},${pxToInch(c)}`});break;case`queue`:a.attributes.apply({[attribute.width]:pxToInch(l),[attribute.height]:pxToInch(d-8),[attribute.margin]:`${pxToInch(o?f:f+4)},${pxToInch(c)}`});break;case`component`:a.attributes.apply({[attribute.width]:pxToInch(l+10),[attribute.margin]:`${pxToInch(f+20)},${pxToInch(c)}`});break;default:break}return a}leafElements(i){return i===null?this.view.nodes.filter(i=>!isCompound(i)):this.computedNode(i).children.flatMap(i=>{let a=this.computedNode(i);return isCompound(a)?this.leafElements(a.id):a})}descendants(i){return i===null?this.view.nodes.slice():this.computedNode(i).children.flatMap(i=>{let a=this.computedNode(i);return[a,...this.descendants(a.id)]})}computedNode(i){return nonNullable$1(this.view.nodes.find(a=>a.id===i),`Node ${i} not found`)}getGraphNode(i){return this.nodes.get(i)??null}getSubgraph(i){return this.subgraphs.get(i)??null}edgeEndpoint(i,a){let o=this.computedNode(i),s=this.getGraphNode(i),c;return s?[o,s,void 0]:(invariant$1(isCompound(o),`endpoint node should be compound`),c=this.getSubgraph(i)?.id,invariant$1(c,`subgraph ${i} not found`),o=nonNullable$1(a(this.leafElements(i)),`leaf element in ${i} not found`),s=nonNullable$1(this.getGraphNode(o.id),`source graphviz node ${o.id} not found`),[o,s,c])}findInternalEdges(i){if(i===null)return this.view.edges.slice();let a=this.computedNode(i);return t$3(this.descendants(i),t$7(i=>t$8(i.inEdges,i.outEdges)),n$1(),r(t$8(a.inEdges,a.outEdges)),t(i=>this.view.edges.find(a=>a.id===i)),n$2(e$4))}withoutCompoundEdges(i){return this.edgesWithCompounds.size===0?i:{...i,inEdges:i.inEdges.filter(i=>!this.edgesWithCompounds.has(i)),outEdges:i.outEdges.filter(i=>!this.edgesWithCompounds.has(i))}}assignGroups(){let i=t$3(this.view.nodes,n$2(isCompound),t(i=>i.id),t$9(compareFqnHierarchically),t$10(),t(i=>({id:i,edges:this.findInternalEdges(i).filter(i=>i.source!==i.target&&!this.compoundIds.has(i.source)&&!this.compoundIds.has(i.target))})),n$2(({edges:i})=>i.length>1&&i.length<8),n$3(4)),a=new Set;for(let o of i){let i=o.edges.filter(i=>!a.has(i.source)&&!a.has(i.target));for(let s of i)try{let i=nonNullable$1(this.getGraphNode(s.source),`Graphviz Node not found for ${s.source}`),c=nonNullable$1(this.getGraphNode(s.target),`Graphviz Node not found for ${s.target}`);a.add(s.source),a.add(s.target),i.attributes.set(attribute.group,o.id),c.attributes.set(attribute.group,o.id)}catch(i){logger$13.error(`Failed to assign group to edge ${s.id}`,{error:i})}}}applyManualLayout({height:i,...a}){let o=a.x<0?-a.x:0;a.y<0&&-a.y;for(let{id:s,...c}of a.nodes){let a=this.getGraphNode(s);if(!a)continue;let l=pxToInch(c.center.x)+o,d=pxToInch(i-c.center.y);c.fixedsize?a.attributes.apply({[attribute.pos]:`${l},${d}!`,[attribute.pin]:!0,[attribute.width]:pxToInch(c.fixedsize.width),[attribute.height]:pxToInch(c.fixedsize.height),[attribute.fixedsize]:!0}):a.attributes.set(attribute.pos,`${l},${d}`)}for(let[,i]of this.edges.entries())i.attributes.delete(attribute.weight),i.attributes.delete(attribute.minlen),i.attributes.delete(attribute.constraint);return this.graphvizModel.apply({[attribute.layout]:`fdp`,[attribute.overlap]:`vpsc`,[attribute.sep]:`+50,50`,[attribute.esep]:`+10,10`,[attribute.start]:`random2`,[attribute.splines]:`compound`,[attribute.K]:10}),this.graphvizModel.delete(attribute.compound),this.graphvizModel.delete(attribute.rankdir),this.graphvizModel.delete(attribute.nodesep),this.graphvizModel.delete(attribute.ranksep),this.graphvizModel.delete(attribute.pack),this.graphvizModel.delete(attribute.pad),this.graphvizModel.delete(attribute.packmode),this.graphvizModel.attributes.graph.delete(attribute.margin),this}},DeploymentViewPrinter=class extends DotPrinter{createGraph(){let i=super.createGraph(),a=this.view.autoLayout;return i.delete(attribute.TBbalance),i.apply({[attribute.nodesep]:pxToInch(a.nodeSep??130),[attribute.ranksep]:pxToInch(a.rankSep??130)}),i}postBuild(i){t$3(this.view.nodes,t(i=>({node:i,graphvizNode:this.getGraphNode(i.id)})),t$11(({node:i,graphvizNode:a})=>{if(a!=null)return i.modelRef}),t$12(),t(i=>i),t$13(a=>{a.length<2||i.subgraph({[attribute.rank]:`same`},i=>{for(let{graphvizNode:o}of a)i.node(nonNullable$1(o).id)})}),t$14(()=>{i.set(attribute.newrank,!0),i.set(attribute.clusterrank,`global`),i.delete(attribute.pack),i.delete(attribute.packmode)}))}elementToSubgraph(i,a){let o=super.elementToSubgraph(i,a);return i.children.length>1&&o.set(attribute.margin,pxToPoints(50)),o}addEdge(i,a){let[o,s]=[i.source,i.target],[c,d,f]=this.edgeEndpoint(o,i=>t$5(i)),[p,m,h]=this.edgeEndpoint(s,n$4),g=e$1(h)||e$1(f),_=a.edge([d,m],{[attribute.likec4_id]:i.id,[attribute.style]:i.line??DefaultEdgeStyle});h&&_.attributes.set(attribute.lhead,h),f&&_.attributes.set(attribute.ltail,f);let v=this.graphology.getEdgeAttribute(i.id,`weight`);v>1&&!this.graphology.hasDirectedEdge(i.target,i.source)&&_.attributes.set(attribute.weight,v);let y=edgelabel(i);if(y&&_.attributes.set(g?attribute.xlabel:attribute.label,y),i.color&&i.color!==this.$defaults.relationship.color){let a=this.styles.colors(i.color).relationships;_.attributes.apply({[attribute.color]:a.line,[attribute.fontcolor]:a.label})}let[b,x]=[i.head??this.$defaults.relationship.arrow,i.tail??`none`];return b===`none`&&x===`none`?(_.attributes.apply({[attribute.arrowtail]:`none`,[attribute.arrowhead]:`none`,[attribute.dir]:`none`}),_):i.dir===`both`?(_.attributes.apply({[attribute.arrowhead]:toArrowType(b),[attribute.arrowtail]:toArrowType(i.tail??b),[attribute.dir]:`both`}),!g&&c.modelRef!==p.modelRef&&_.attributes.set(attribute.constraint,!1),_):(b&&_.attributes.set(attribute.arrowhead,toArrowType(b)),x!==`none`&&_.attributes.set(attribute.arrowtail,toArrowType(x)),_)}},DynamicViewPrinter=class extends DotPrinter{postBuild(i){i.delete(attribute.TBbalance),i.set(attribute.ordering,`in`)}addEdge(i,a){let{nodes:o}=this.view,[s,c]=i.dir===`back`?[i.target,i.source]:[i.source,i.target],[l,d,f]=this.edgeEndpoint(s,i=>t$5(i)),[p,m,h]=this.edgeEndpoint(c,n$4),g=a.edge([d,m],{[attribute.likec4_id]:i.id,[attribute.style]:i.line??DefaultEdgeStyle});if(h&&g.attributes.set(attribute.lhead,h),f&&g.attributes.set(attribute.ltail,f),i.color&&i.color!==this.$defaults.relationship.color){let a=this.styles.colors(i.color).relationships;g.attributes.apply({[attribute.color]:a.line,[attribute.fontcolor]:a.label})}let _=[i.label?.trim(),i.technology?.trim()].filter(e$4).join(`
30
+ `),v=stepEdgeLabel(extractStep(i.id),_);g.attributes.set(attribute.label,v);let y=o.findIndex(i=>i.id===s);o.findIndex(i=>i.id===c)<y&&i.dir!==`back`&&g.attributes.apply({[attribute.minlen]:0});let[b,x]=[i.head??this.$defaults.relationship.arrow,i.tail??`none`];return i.dir===`back`?(g.attributes.apply({[attribute.arrowtail]:toArrowType(b),[attribute.dir]:`back`}),x!==`none`&&g.attributes.apply({[attribute.arrowhead]:toArrowType(x),[attribute.minlen]:0}),g):b===`none`&&x===`none`||b!==`none`&&x!==`none`?(g.attributes.apply({[attribute.arrowhead]:toArrowType(b),[attribute.arrowtail]:toArrowType(x),[attribute.dir]:`both`}),g):b===`none`?(g.attributes.delete(attribute.arrowhead),g.attributes.apply({[attribute.arrowtail]:toArrowType(x),[attribute.minlen]:0,[attribute.dir]:`back`}),g):(g.attributes.set(attribute.arrowhead,toArrowType(b)),g)}};const rankLogger=createLogger(`dot.rank`);var ElementViewPrinter=class extends DotPrinter{postBuild(i){this.assignGroups();let o=new Set,s=this.view.nodes.reduce((i,a)=>(isCompound(a)&&(o.add(a.id),i.push(a)),i),[]),c=!1;for(let i of s){let o=t$3(i.children,n$2(i=>!this.compoundIds.has(i)),t(i=>this.computedNode(i)),n$2(i=>i.inEdges.length===0&&i.outEdges.length===0));if(o.length<=2)continue;let s=2;switch(!0){case o.length>11:s=4;break;case o.length>4:s=3;break}let l=nonNullable$1(this.getSubgraph(i.id),`Subgraph not found for ${i.id}`),d=null;t$15(o,s).forEach(i=>{let a=i.length>1?l.createSubgraph({[attribute.rank]:`same`}):null;i.forEach((i,o)=>{let s=this.getGraphNode(i.id);s&&(a?.node(s.id),o===0&&(d&&l.edge([d,s],{[attribute.style]:`invis`}),d=s))}),c||=!!a})}let l=this.applyExplicitRankBlocks(i);c&&(i.set(attribute.newrank,!0),i.set(attribute.clusterrank,`global`)),l>0&&i.set(`likec4_rankBlocks`,l)}applyExplicitRankBlocks(i){let a=this.view.ranks??[];if(a.length===0)return 0;let o=0;for(let s of a){let a=[...new Set(s.nodes)].map(i=>this.getGraphNode(i)).filter(i=>!!i);if(a.length===0)continue;let c=i.createSubgraph({[attribute.rank]:s.type});a.forEach(i=>c.node(i.id)),o+=1,rankLogger.debug`rank ${s.type} => ${a.map(i=>i.id).join(`, `)}`}return o}addEdge(i,a){let[o,s]=i.dir===`back`?[i.target,i.source]:[i.source,i.target],[c,d,f]=this.edgeEndpoint(o,i=>t$5(i)),[p,m,h]=this.edgeEndpoint(s,n$4),g=i.parent,_=this.graphology.getEdgeAttributes(i.id),v=a.edge([d,m],{[attribute.likec4_id]:i.id,[attribute.style]:i.line??DefaultEdgeStyle});h&&v.attributes.set(attribute.lhead,h),f&&v.attributes.set(attribute.ltail,f);let y=e$1(h)||e$1(f);!this.graphology.hasDirectedEdge(i.target,i.source)&&_.weight>1&&v.attributes.set(attribute.weight,_.weight);let b=edgelabel(i);if(b&&v.attributes.set(y?attribute.xlabel:attribute.label,b),i.color&&i.color!==this.$defaults.relationship.color){let a=this.styles.colors(i.color).relationships;v.attributes.apply({[attribute.color]:a.line,[attribute.fontcolor]:a.label})}let[x,S]=[i.head??this.$defaults.relationship.arrow,i.tail??`none`];if(i.dir===`back`)return v.attributes.apply({[attribute.arrowtail]:toArrowType(x),[attribute.dir]:`back`}),S!==`none`&&v.attributes.apply({[attribute.arrowhead]:toArrowType(S),[attribute.dir]:`both`,[attribute.minlen]:0}),v;if(x===`none`&&S===`none`)return v.attributes.apply({[attribute.arrowtail]:`none`,[attribute.arrowhead]:`none`,[attribute.dir]:`none`,[attribute.minlen]:0,[attribute.constraint]:!1}),v;if(x!==`none`&&S!==`none`)return v.attributes.apply({[attribute.arrowhead]:toArrowType(x),[attribute.arrowtail]:toArrowType(S),[attribute.dir]:`both`}),v;if(v.attributes.set(attribute.arrowhead,toArrowType(x)),S!==`none`&&v.attributes.set(attribute.arrowtail,toArrowType(S)),this.view.edges.length===1)return v;let C;return C=g===null&&c.parent==null&&p.parent==null?this.view.edges.filter(a=>{if(a.id===i.id||a.parent!==null||a.source===i.source&&a.target===i.target||a.source===i.target&&a.target===i.source)return!1;let o=this.computedNode(a.source),s=this.computedNode(a.target);return isCompound(o)||isCompound(s)?!1:o.parent==null&&s.parent==null}):this.findInternalEdges(g).filter(a=>!(a.id===i.id||a.source===i.source&&a.target===i.target||a.source===i.target&&a.target===i.source)),C.length===0&&(g===null||this.leafElements(g).length<=3)&&v.attributes.set(attribute.minlen,0),v}};function parseBB(i){let[a,o,s,c]=i?i.split(`,`).map(i=>pointToPx(+i)):[0,0,0,0],l=Math.round(s-a),d=Math.round(o-c);return{x:Math.round(a),y:Math.round(c),width:l,height:d}}function parsePos(i){try{let[a,o]=i.split(`,`);return{x:pointToPx(parseFloat(a)),y:pointToPx(parseFloat(o))}}catch(a){throw Error(`Failed on parsing pos: ${i}`,{cause:a})}}function parseNode(i){let{x:a,y:o}=parsePos(i.pos),s=inchToPx(parseFloat(i.width)),c=inchToPx(parseFloat(i.height));return{x:a-Math.round(s/2),y:o-Math.round(c/2),width:s,height:c}}function parseLabelBbox(i,[a,o]=[0,0]){if(!i||i.length===0)return null;let s=1/0,c=1/0,l=-1/0,d=-1/0,f=13;try{for(let p of i){if(p.op===`F`){f=pointToPx(p.size);continue}if(p.op===`T`){let i=pointToPx(p.pt[0])-a,m=pointToPx(p.width);switch(p.align){case`r`:i-=m;break;case`c`:i-=Math.round(m/2);break}s=Math.min(s,i),l=Math.max(l,i+m);let h=pointToPx(p.pt[1])-o;c=Math.min(c,Math.round(h-f)),d=Math.max(d,h)}}}catch(a){return logger$17.warn(`Failed on parsing label draw ops:
31
+ {labelDrawOps}`,{e:a,labelDrawOps:i}),null}return s===1/0?null:{x:s-2,y:c-2,width:l-s+4,height:d-c+4}}function parseEdgePoints({_draw_:i,likec4_id:a=`???`},o=`<unknown view>`){try{let s=i.filter(i=>i.op.toLowerCase()===`b`);invariant$1(t$4(s,1),`view ${o} edge ${a} should have at least one bezier draw op`),s.length>1&&logger$17.warn(`view ${o} edge ${a} has more than one bezier draw op, using the first one only`);let c=s[0].points.map(i=>pointToPx(i));return invariant$1(t$4(c,2),`view ${o} edge ${a} should have at least two points`),c}catch(s){throw Error(`failed on parsing view ${o} edge ${a} _draw_:\n${JSON.stringify(i,null,2)}`,{cause:s})}}function parseGraphvizEdge(i,{id:a,source:o,target:s,dir:c,label:l,description:d,...f},p){let m=parseLabelBbox(i._ldraw_??i._tldraw_??i._hldraw_),h=i.dir===`back`||c===`back`;return l=l&&m?wrap(l,{maxchars:40,maxLines:5}).join(`
32
+ `):null,{id:a,source:o,target:s,label:l,...e$4(d)&&{description:d},points:parseEdgePoints(i,p),labelBBox:m,...h?{dir:`back`}:{},...f}}function parseGraphvizJson(i,a){let o=parseBB(i.bb),{nodes:s,edges:c,hasManualLayout:l,manualLayout:d,...f}=a,p=[],m=[],h;if(h=f._type===`dynamic`?{...f,sequenceLayout:{actors:[],compounds:[],parallelAreas:[],steps:[],bounds:o},[_stage]:`layouted`,bounds:o,nodes:p,edges:m}:{...f,[_stage]:`layouted`,bounds:o,nodes:p,edges:m},l){let i=h;i[_layout]=`auto`}let g=i.objects??[];for(let i of s){let a=g.find(a=>a.likec4_id===i.id);invariant$1(a,`View ${f.id} node ${i.id} not found in graphviz output`);try{let{x:o,y:s,width:c,height:l}=`bb`in a?parseBB(a.bb):parseNode(a),d=[o,s];p.push({...i,x:o,y:s,width:c,height:l,labelBBox:parseLabelBbox(a._ldraw_,d)??{x:o,y:s,width:c,height:l}})}catch(o){throw Error(`Failed on parsing node ${i.id}:\n${JSON.stringify(a,null,2)}`,{cause:o})}}let _=i.edges??[];for(let i of c){let a=_.find(a=>a.likec4_id===i.id);if(!a){logger$17.warn`View ${f.id} edge ${i.id} not found in graphviz output, skipping`;continue}m.push(parseGraphvizEdge(a,i,f.id))}return h}function parseGraphvizJsonOfProjectsView(i,a){return parseGraphvizJson(i,a)}var ProjectsViewPrinter=class i extends DotPrinter{static toDot(a){return new i(a).print()}constructor(i){super(i,LikeC4Styles$1.DEFAULT)}createGraph(){let i=super.createGraph();return i.apply({[attribute.nodesep]:pxToInch(100),[attribute.ranksep]:pxToInch(100)}),i.delete(attribute.TBbalance),i}elementToNode(i,a){return a.attributes.apply({[attribute.likec4_id]:i.id,[attribute.likec4_project]:i.projectId}),super.elementToNode(i,a)}addEdge(i,a){let o=nonNullable$1(this.getGraphNode(i.source),`Node not found for ${i.source}`),s=nonNullable$1(this.getGraphNode(i.target),`Node not found for ${i.target}`),c=this.graphology.getEdgeAttributes(i.id),l=a.edge([o,s],{[attribute.likec4_id]:i.id,[attribute.likec4_project]:i.projectId,[attribute.style]:i.line??DefaultEdgeStyle});!this.graphology.hasDirectedEdge(i.target,i.source)&&c.weight>1&&l.attributes.set(attribute.weight,c.weight);let d=edgelabel(i);if(d&&l.attributes.set(attribute.label,d),i.color&&i.color!==this.$defaults.relationship.color){let a=this.styles.colors(i.color).relationships;l.attributes.apply({[attribute.color]:a.line,[attribute.fontcolor]:a.label})}return l}};const limit=pLimit(1),logger$12=logger$17.getChild(`graphviz-wasm`);var GraphvizWasmAdapter=class i{static _graphviz=null;static opsCount=0;get concurrency(){return 1}dispose(){Graphviz.unload(),i._graphviz=null}[Symbol.dispose](){this.dispose()}graphviz(){return Promise.resolve().then(async()=>(i._graphviz||=(logger$12.debug`loading wasm`,i.opsCount=0,Graphviz.load()),await i._graphviz))}async attempt(a,o,s){return await limit(async()=>{try{let a=await s();return++i.opsCount>=10&&(logger$12.debug`unloading wasm`,Graphviz.unload(),i._graphviz=null),a}catch(s){logger$12.error(`FAILED GraphvizWasm. ${a}`,{error:s}),logger$12.error(`FAILED DOT:
33
+ `+o),Graphviz.unload(),i._graphviz=null}logger$12.warn(`Retrying...`),await delay(10,500);try{return await s()}finally{Graphviz.unload(),i._graphviz=null}})}async unflatten(i){return await this.attempt(`unflatten`,i,async()=>(await this.graphviz()).unflatten(i,1,!1,3).replaceAll(/\t\[/g,` [`).replaceAll(/\t/g,` `))}async acyclic(i){return await this.attempt(`acyclic`,i,async()=>{let a=(await this.graphviz()).acyclic(i,!0);return a.acyclic&&a.outFile||i})}async layoutJson(i){return await this.attempt(`layout`,i,async()=>(await this.graphviz()).layout(i,`json`,void 0,{yInvert:!0}))}async svg(i){return await this.attempt(`svg`,i,async()=>(await this.graphviz()).layout(i,`svg`))}};const getPrinter=({view:i,styles:a})=>{switch(!0){case isDynamicView(i):return new DynamicViewPrinter(i,a);case isDeploymentView(i):return new DeploymentViewPrinter(i,a);case isElementView(i):return new ElementViewPrinter(i,a);default:nonexhaustive$1(i)}},logger$11=logger$17.getChild([`layouter`]);var GraphvizLayouter=class{graphviz;constructor(i){this.graphviz=i??new GraphvizWasmAdapter}dispose(){this.graphviz.dispose()}[Symbol.dispose](){this.dispose()}get graphvizPort(){return this.graphviz}changePort(i){this.graphviz.dispose(),this.graphviz=i}async dotToJson(i){let a;try{a=await this.graphviz.layoutJson(i)}catch(a){throw logger$11.error(loggable(a)),logger$11.error`Failed to convert DOT to JSON:\n${i}`,a}try{return JSON.parse(a)}catch(o){throw logger$11.error(loggable(o)),logger$11.error`Failed to parse JSON:\n${a}\n. Generated from DOT:\n${i}`,o}}async layout(i){try{logger$11.debug`layouting view ${i.view.id}...`;let a=await this.dot(i),{view:o}=i,s=parseGraphvizJson(await this.dotToJson(a),o);return o.manualLayout&&(s=applyManualLayout$1(s,o.manualLayout)),isDynamicView(s)&&Object.assign(s,{sequenceLayout:calcSequenceLayout(s)}),a=a.split(`
34
+ `).filter(i=>!(i.includes(`margin`)&&i.includes(`${GraphClusterSpace}`))).join(`
35
+ `),logger$11.debug`layouting view ${i.view.id} done`,{dot:a,diagram:s}}catch(a){throw Error(`Error during layout: ${i.view.id}`,{cause:a})}}async svg(i){let a=await this.dot(i);return a=a.split(`
36
+ `).filter(i=>!(i.includes(`margin`)&&i.includes(`${GraphClusterSpace}`))).join(`
37
+ `),{svg:await this.graphviz.svg(a),dot:a}}async dot(i){let a=getPrinter(i).print();if(!isElementView(i.view))return a;try{return await this.graphviz.unflatten(a)}catch(o){return logger$11.warn(`Error during unflatten: ${i.view.id}`,{error:o}),a}}async layoutProjectsView(i){logger$11.debug`layouting projects overview...`;let a=new ProjectsViewPrinter(i).print();try{a=await this.graphviz.unflatten(a)}catch(i){logger$11.warn(`Error during unflatten of projects view`,{error:i})}let o=await this.dotToJson(a);return logger$11.debug`layouting projects overview done`,parseGraphvizJsonOfProjectsView(o,i)}};const logger$10=logger$17.getChild([`layouter`,`queue`]);var QueueGraphvizLayoter=class extends GraphvizLayouter{queue;isProcessingBatch=!1;constructor(i){super(i?.graphviz),this.queue=new PQueue({concurrency:i?.concurrency??this.graphvizPort.concurrency,timeout:i?.timeout??2e4,throwOnTimeout:i?.throwOnTimeout??!0})}async runInQueue(i){return this.isProcessingBatch?(logger$10.debug`waiting for batch to finish`,await this.queue.onIdle(),await promiseNextTick(),await this.runInQueue(i)):(this.queue.size>this.queue.concurrency*2+1&&(logger$10.debug`task limit reached: ${this.queue.size} (pending: ${this.queue.pending}), waiting queue to shrink to ${this.queue.concurrency}`,await this.queue.onSizeLessThan(this.queue.concurrency+1)),logger$10.trace`add task to queue`,await this.queue.add(i))}changePort(i){super.changePort(i),this.queue.concurrency!==i.concurrency&&(this.queue.concurrency=this.graphvizPort.concurrency,logger$10.debug`set queue concurrency to ${this.graphvizPort.concurrency}`)}async layout(i){let a=await this.runInQueue(async()=>await super.layout(i));if(!a)throw Error(`QueueGraphvizLayoter: layout failed`);return a}async layoutProjectsView(i){logger$10.debug`adding layoutProjectsView task to queue`;let a=await this.runInQueue(async()=>(logger$10.debug`layouting projects view`,await super.layoutProjectsView(i)));if(!a)throw Error(`QueueGraphvizLayoter: layoutProjectsView failed`);return a}async batchLayout(i){if(this.isProcessingBatch)return logger$10.debug`wait for previous layouts to finish`,await this.queue.onIdle(),await promiseNextTick(),await this.batchLayout(i);if(i.cancelToken?.isCancellationRequested)return logger$10.debug`cancellation requested`,[];let a=this.queue.concurrency;logger$10.debug`starting batch layout, size: ${i.batch.length}, concurrency: ${a}`,this.isProcessingBatch=!0;let o=[];try{for(let s of i.batch)if(logger$10.debug`add task for view ${s.view.id}`,this.queue.add(async()=>(a<=2&&await promiseNextTick(),await super.layout(s))).then(a=>{if(!a){i.onError?.(s,Error(`Layout queue returned null for view ${s.view.id}`));return}o.push(a),i.onSuccess?.(s,a)}).catch(a=>{logger$10.error(`Fail layout view ${s.view.id}`,{err:a}),i.onError?.(s,a)}),this.queue.size>a+2&&(logger$10.debug`task limit reached: ${this.queue.size}, waiting queue to shrink to ${a}`,await this.queue.onSizeLessThan(a+1),i.cancelToken?.isCancellationRequested)){logger$10.debug`cancellation requested`;break}}finally{await this.queue.onIdle(),logger$10.debug`batch layout done`,this.isProcessingBatch=!1}return o}dispose(){this.queue.clear(),super.dispose()}};const idattr=Symbol.for(`idattr`),ViewOps={writeId(i,a){return i[idattr]=a,i},readId(i){return i[idattr]}},ElementOps={writeId(i,a){return e$5(a)?i[idattr]=void 0:i[idattr]=a,i},readId(i){return i[idattr]}};function isLikeC4LangiumDocument(i){return i?.textDocument.languageId===LikeC4LanguageMetaData.languageId}function parseMarkdownAsString(i){return i?.markdown||i?.text}function parseAstPercent(i){let a=parseFloat(i);return isNaN(a)?100:t$16(a,{min:0,max:100})}function parseAstOpacityProperty({value:i}){return parseAstPercent(i)}function parseAstSizeValue({value:i}){switch(i){case`xs`:case`sm`:case`md`:case`lg`:case`xl`:return i;case`xsmall`:return`xs`;case`small`:return`sm`;case`medium`:return`md`;case`large`:return`lg`;case`xlarge`:return`xl`;default:nonexhaustive$1(i)}}function parseAstIconPositionValue({value:i}){switch(i){case`left`:case`right`:case`top`:case`bottom`:return i;default:nonexhaustive$1(i)}}function toRelationshipStyle(i,a){let o={};if(!i||i.length===0)return o;for(let s of i)if(a(s))switch(!0){case isColorProperty(s):{let i=toColor(s);e$4(i)&&(o.color=i);break}case isLineProperty(s):o.line=s.value;break;case isArrowProperty(s):switch(s.key){case`head`:o.head=s.value;break;case`tail`:o.tail=s.value;break;default:nonexhaustive$1(s)}break;default:nonexhaustive$1(s)}return o}function toColor(i){return i?.themeColor??i?.customColor?.$refText}function toAutoLayout(i){let a=i.rankSep,o=i.nodeSep,s;switch(i.direction){case`TopBottom`:s=`TB`;break;case`BottomTop`:s=`BT`;break;case`LeftRight`:s=`LR`;break;case`RightLeft`:s=`RL`;break;default:nonexhaustive$1(i.direction)}return{direction:s,...o&&{nodeSep:o},...a&&{rankSep:a}}}function toAstViewLayoutDirection(i){switch(i){case`TB`:return`TopBottom`;case`BT`:return`BottomTop`;case`LR`:return`LeftRight`;case`RL`:return`RightLeft`;default:nonexhaustive$1(i)}}function getViewRulePredicateContainer(i){return getContainerOfType(i,i=>isViewRulePredicate(i)||isDeploymentViewRulePredicate(i)||isDynamicViewIncludePredicate(i))}const _isModel=i=>isModel(i)||isElementBody(i)||isExtendElementBody(i)||isElementViewBody(i)||isDynamicViewBody(i)||isElementRef(i),_isDeployment$1=i=>isModelDeployments(i)||isDeploymentViewBody(i)||isDeploymentNodeBody(i)||isExtendDeploymentBody(i)||isDeployedInstanceBody(i);function isFqnRefInsideGlobals(i){for(;;){if(_isDeployment$1(i)||_isModel(i))return!1;if(isGlobals(i)||isModelViews(i))return!0;if(i.$container)i=i.$container;else return!1}}function isFqnRefInsideModel(i){for(;;){if(_isDeployment$1(i))return!1;if(_isModel(i))return!0;if(i.$container)i=i.$container;else return!1}}function isFqnRefInsideDeployment(i){for(;;){if(_isModel(i))return!1;if(_isDeployment$1(i))return!0;if(i.$container)i=i.$container;else return!1}}var LikeC4DocumentationProvider=class extends JSDocDocumentationProvider{parser;locator;constructor(i){super(i),this.parser=i.likec4.ModelParser,this.locator=i.likec4.ModelLocator}getDocumentation(i){if(!isDeploymentNode$1(i)&&!isDeployedInstance(i)&&!isElement(i))return super.getDocumentation(i);try{let a=getDocument$6(i);if(a.state<DocumentState.Linked)return super.getDocumentation(i);let o=this.parser.forDocument(a);if(isDeploymentNode$1(i))return`**${o.parseDeploymentNode(i).title}**`;if(isDeployedInstance(i)){let s=o.parseDeployedInstance(i),[c,l]=FqnRef.isImportRef(s.element)?[s.element.project,s.element.model]:[a.likec4ProjectId,s.element.model],d=c?this.locator.getParsedElement(l,c):this.locator.getParsedElement(l),f=[`_instance of_ \`${l}\``];return d&&f.push(`**${d.element.title}**`),f.join(`
38
+ `)}if(isElement(i)){let a=o.parseElement(i);return a?[`**${a.title}**`,`<small>kind: \`${a.kind}\`</small>`].join(`
39
+ `):void 0}nonexhaustive(i)}catch(i){logWarnError(i)}}};function areOverlap(i,a){return[i,a]=compareRanges(i,a)>0?[a,i]:[i,a],isInRagne(i.range,a.range.start)}function compareRanges(i,a){let o=i.range.start.line-a.range.start.line;return o===0?i.range.start.character-a.range.start.character:o}function isInRagne(i,a){return!(a.line<i.start.line||a.line>i.end.line||a.line==i.start.line&&a.character<i.start.character||a.line==i.end.line&&a.character>i.end.character)}function isMultiline(i){return!!i&&i.range.start.line!=i.range.end.line}const FormattingOptions={newLine:Formatting.newLine({allowMore:!0}),oneSpace:Formatting.oneSpace(),noSpace:Formatting.noSpace(),indent:Formatting.indent({allowMore:!0}),noIndent:Formatting.noIndent()};var LikeC4Formatter=class extends AbstractFormatter{options={quoteStyle:`auto`};extendedFormattingCommands=[];constructor(i){super(),i.shared.workspace.ConfigurationProvider.onConfigurationSectionUpdate(i=>this.onConfigurationUpdate(i.configuration.formatting))}doDocumentFormat(i,a,o){this.extendedFormattingCommands=[];let s=super.doDocumentFormat(i,a,o);return this.doExtendedFormatting(s),s}format(i){this.removeIndentFromTopLevelStatements(i),this.indentContentInBraces(i),this.normalizeQuotes(i),this.formatImports(i),this.formatSpecificationRule(i),this.formatGlobals(i),this.formatElementDeclaration(i),this.formatExtendElement(i),this.formatRelation(i),this.formatMetadataProperty(i),this.formatDeploymentNodeDeclaration(i),this.formatDeployedInstance(i),this.formatDeploymentRelation(i),this.formatExtendDeployment(i),this.formatView(i),this.formatViewRuleGroup(i),this.formatViewRuleGlobalStyle(i),this.formatViewRuleGlobalPredicate(i),this.formatIncludeExcludeExpressions(i),this.formatWhereExpression(i),this.formatWhereRelationExpression(i),this.formatWhereElementExpression(i),this.formatRelationExpression(i),this.formatAutolayoutProperty(i),this.formatWithPredicate(i),this.formatViewRuleStyle(i),this.formatLeafProperty(i),this.formatLinkProperty(i),this.formatNavigateToProperty(i),this.formatTags(i)}formatTags(i){this.on(i,isTags,(i,a)=>{let o=findNodesForProperty(i.$cstNode,`values`).filter(e$4).slice(1);a.cst(o).prepend(FormattingOptions.oneSpace),a.keywords(`,`).prepend(FormattingOptions.noSpace).append(FormattingOptions.oneSpace)})}formatDeploymentRelation(i){this.on(i,isDeploymentRelation,(i,a)=>{let o=i?.source?.$cstNode?[i?.source?.$cstNode]:[];a.cst(o).append(FormattingOptions.oneSpace),a.keywords(`]->`).prepend(FormattingOptions.noSpace),a.keywords(`-[`).append(FormattingOptions.noSpace),a.nodes(...n$2([i.target,i.tags],e$4)).prepend(FormattingOptions.oneSpace),a.properties(`title`,`description`,`technology`).prepend(FormattingOptions.oneSpace)})}formatExtendDeployment(i){this.on(i,isExtendDeployment,(i,a)=>{a.keywords(`extend`).append(FormattingOptions.oneSpace)})}formatRelation(i){this.on(i,i=>isRelation(i)||isDeploymentRelation(i),(i,a)=>{let o=i?.source?.$cstNode?[i?.source?.$cstNode]:[];a.cst(o).append(FormattingOptions.oneSpace),a.keywords(`]->`).prepend(FormattingOptions.noSpace),a.keywords(`-[`).append(FormattingOptions.noSpace),a.nodes(...n$2([i.target,i.tags],e$4)).prepend(FormattingOptions.oneSpace),a.properties(`title`,`description`,`technology`).prepend(FormattingOptions.oneSpace)}),this.on(i,isDynamicViewStep,(i,a)=>{a.keywords(`->`,`<-`).surround(FormattingOptions.oneSpace),a.property(`dotKind`).prepend(FormattingOptions.oneSpace).append(FormattingOptions.oneSpace),a.keywords(`]->`).prepend(FormattingOptions.noSpace).append(FormattingOptions.oneSpace),a.keywords(`-[`).prepend(FormattingOptions.oneSpace).append(FormattingOptions.noSpace),a.properties(`title`).prepend(FormattingOptions.oneSpace),(isDynamicStepChain(i)&&isMultiline(i.$cstNode)||isDynamicStepSingle(i)&&isDynamicStepChain(i.$container)&&isMultiline(i.$container.$cstNode))&&(a.property(`dotKind`).prepend(Formatting.indent({allowLess:!1,allowMore:!0,priority:2})),a.keywords(`->`,`-[`).prepend(Formatting.indent({allowLess:!1,allowMore:!0,priority:2})),i.custom?.$cstNode&&isMultiline(i.custom.$cstNode)&&a.property(`custom`).prepend({options:{allowLess:!1,allowMore:!0,priority:2},moves:[{tabs:1}]}))})}removeIndentFromTopLevelStatements(i){isLikeC4Grammar(i.$container)&&this.getNodeFormatter(i).keywords(`specification`,`model`,`views`,`likec4lib`,`global`,`deployments`,`import`).prepend(FormattingOptions.noIndent)}indentContentInBraces(i){if(isLikeC4Lib(i)||isSpecificationRule(i)||isSpecificationElementKind(i)||isSpecificationRelationshipKind(i)||isSpecificationDeploymentNodeKind(i)||isGlobals(i)||isGlobalStyle(i)||isGlobalStyleGroup(i)||isGlobalPredicateGroup(i)||isGlobalDynamicPredicateGroup(i)||isGlobalStyleGroup(i)||isModel(i)||isElementBody(i)||isExtendElementBody(i)||isRelationBody(i)||isRelationStyleProperty(i)||isMetadataBody(i)||isModelViews(i)||isElementViewBody(i)||isDynamicViewBody(i)||isDeploymentViewBody(i)||isViewRuleStyle(i)||isViewRuleGroup(i)||isCustomElementProperties(i)||isCustomRelationProperties(i)||isElementStyleProperty(i)||isDynamicViewParallelSteps(i)||isModelDeployments(i)||isDeploymentNodeBody(i)||isDeploymentRelationBody(i)||isDeployedInstanceBody(i)||isExtendDeploymentBody(i)){let a=this.getNodeFormatter(i),o=a.keywords(`{`);o.prepend(FormattingOptions.noIndent).prepend(FormattingOptions.oneSpace);let s=isMultiline(i.$cstNode),c=a.keywords(`}`),l=a.interior(o,c),d=null;for(let i of l.nodes){if(!s){a.cst([i]).surround(FormattingOptions.oneSpace);continue}(!d||!areOverlap(d,i))&&a.cst([i]).prepend(Formatting.newLine({allowMore:!0})).prepend(FormattingOptions.indent),d=i}s?c.prepend(FormattingOptions.noIndent).prepend(Formatting.newLine({allowMore:!0})):c.prepend(Formatting.oneSpace({allowLess:!0}))}}appendKeywordsWithSpace(i){this.on(i,isElementKind)?.keywords(`element`).append(FormattingOptions.oneSpace)}formatView(i){this.on(i,isElementView$1,(i,a)=>{(i.extends||i.viewOf||i.name)&&a.keywords(`view`).append(FormattingOptions.oneSpace),a.keywords(`of`,`extends`).surround(FormattingOptions.oneSpace)}),this.on(i,isDynamicView$1)?.keywords(`dynamic`,`view`).append(FormattingOptions.oneSpace),this.on(i,isDeploymentView$1)?.keywords(`deployment`,`view`).append(FormattingOptions.oneSpace)}formatLeafProperty(i){if(isElementStringProperty(i)||isRelationStringProperty(i)||isViewStringProperty(i)||isNotationProperty(i)||isNotesProperty(i)||isSpecificationElementStringProperty(i)||isSpecificationRelationshipStringProperty(i)||isColorProperty(i)||isLineProperty(i)||isArrowProperty(i)||isIconProperty(i)||isShapeProperty(i)||isBorderProperty(i)||isOpacityProperty(i)||isMultipleProperty(i)||isIconColorProperty(i)||isIconSizeProperty(i)||isIconPositionProperty(i)||isShapeSizeProperty(i)||isPaddingSizeProperty(i)||isTextSizeProperty(i)){let a=this.getNodeFormatter(i),o=a.keyword(`:`),s=a.keywords(`title`,`description`,`technology`,`summary`,`notation`,`notes`,`color`,`line`,`head`,`tail`,`icon`,`iconColor`,`iconSize`,`iconPosition`,`shape`,`border`,`opacity`,`multiple`,`size`,`padding`,`textSize`);o.nodes.length===0?s.append(FormattingOptions.oneSpace):o.prepend(FormattingOptions.noSpace).append(FormattingOptions.oneSpace),a.keyword(`;`).prepend(FormattingOptions.noSpace).append(FormattingOptions.newLine)}}formatLinkProperty(i){this.on(i,isLinkProperty,(i,a)=>{a.keyword(`link`).append(FormattingOptions.oneSpace),a.property(`value`).append(FormattingOptions.oneSpace),a.keyword(`:`).prepend(FormattingOptions.noSpace).append(FormattingOptions.oneSpace),a.keyword(`;`).prepend(FormattingOptions.noSpace).append(FormattingOptions.newLine)})}formatNavigateToProperty(i){this.on(i,isNavigateToProperty)?.property(`key`).append(FormattingOptions.oneSpace)}formatAutolayoutProperty(i){this.on(i,isViewRuleAutoLayout,(i,a)=>{a.keyword(`autoLayout`).append(FormattingOptions.oneSpace),a.property(`rankSep`).prepend(FormattingOptions.oneSpace),a.property(`nodeSep`).prepend(FormattingOptions.oneSpace)})}formatMetadataProperty(i){this.on(i,isMetadataAttribute,(i,a)=>{a.property(`key`).append(FormattingOptions.oneSpace),a.keyword(`:`).prepend(FormattingOptions.noSpace).append(FormattingOptions.oneSpace),a.keyword(`;`).prepend(FormattingOptions.noSpace).append(FormattingOptions.newLine)})}formatElementDeclaration(i){this.on(i,isElement,(i,a)=>{let o=findNodeForProperty$1(i.$cstNode,`kind`),s=findNodeForProperty$1(i.$cstNode,`name`);s&&o&&(compareRanges(s,o)>0?a.cst([o]).append(FormattingOptions.oneSpace):(a.cst([s]).append(FormattingOptions.oneSpace),a.cst([o]).prepend(FormattingOptions.oneSpace))),a.properties(`props`).prepend(FormattingOptions.oneSpace)})}formatExtendElement(i){this.on(i,isExtendElement,(i,a)=>{a.keywords(`extend`).append(FormattingOptions.oneSpace)})}formatGlobals(i){this.on(i,isGlobalStyle,(i,a)=>{a.keyword(`style`).append(FormattingOptions.oneSpace),a.property(`id`).append(FormattingOptions.oneSpace)}),this.on(i,isGlobalStyleGroup,(i,a)=>{a.keyword(`styleGroup`).append(FormattingOptions.oneSpace)}),this.on(i,isGlobalPredicateGroup,(i,a)=>{a.keyword(`predicateGroup`).append(FormattingOptions.oneSpace)}),this.on(i,isGlobalDynamicPredicateGroup,(i,a)=>{a.keyword(`dynamicPredicateGroup`).append(FormattingOptions.oneSpace)})}formatImports(i){this.on(i,isImportsFromPoject,(i,a)=>{a.keyword(`import`).append(FormattingOptions.oneSpace),a.keywords(`{`,`}`,`from`).surround(FormattingOptions.oneSpace)}),this.on(i,isImported,(i,a)=>{a.keywords(`,`).prepend(FormattingOptions.noSpace).append(FormattingOptions.oneSpace)})}formatSpecificationRule(i){if((isSpecificationElementKind(i)||isSpecificationRelationshipKind(i)||isSpecificationTag(i)||isSpecificationDeploymentNodeKind(i))&&this.getNodeFormatter(i).keywords(`element`,`relationship`,`tag`,`deploymentNode`).append(FormattingOptions.oneSpace),isSpecificationColor(i)){let a=this.getNodeFormatter(i);a.keyword(`color`).append(FormattingOptions.oneSpace),a.property(`name`).append(FormattingOptions.oneSpace)}}formatWithPredicate(i){(isFqnExprWith(i)||isRelationExprWith(i))&&this.getNodeFormatter(i).keyword(`with`).prepend(FormattingOptions.oneSpace)}formatDeploymentNodeDeclaration(i){this.on(i,isDeploymentNode$1,(i,a)=>{let o=findNodeForProperty$1(i.$cstNode,`kind`),s=findNodeForProperty$1(i.$cstNode,`name`);s&&o&&(compareRanges(s,o)>0?a.cst([o]).append(FormattingOptions.oneSpace):(a.cst([s]).append(FormattingOptions.oneSpace),a.cst([o]).prepend(FormattingOptions.oneSpace))),a.properties(`title`).prepend(FormattingOptions.oneSpace)})}formatDeployedInstance(i){this.on(i,isDeployedInstance,(i,a)=>{let o=i.$cstNode?.content.find(i=>i.text===`=`);o&&a.cst([o]).surround(FormattingOptions.oneSpace),a.keyword(`instanceOf`).append(FormattingOptions.oneSpace),a.property(`title`).prepend(FormattingOptions.oneSpace)})}formatViewRuleGlobalStyle(i){this.on(i,isViewRuleGlobalStyle,(i,a)=>{a.keywords(`global`,`style`).append(FormattingOptions.oneSpace)})}formatViewRuleGlobalPredicate(i){let a=this.getNodeFormatter(i);(isViewRuleGlobalPredicateRef(i)||isDynamicViewGlobalPredicateRef(i))&&a.keywords(`global`,`predicate`).append(FormattingOptions.oneSpace)}formatViewRuleGroup(i){this.on(i,isViewRuleGroup,(i,a)=>{a.keyword(`group`).append(FormattingOptions.oneSpace)})}formatViewRuleStyle(i){this.on(i,isViewRuleStyle)?.keyword(`style`).append(FormattingOptions.oneSpace),this.on(i,isDeploymentViewRuleStyle)?.keyword(`style`).append(FormattingOptions.oneSpace),this.on(i,isExpressions)?.keyword(`,`).prepend(FormattingOptions.noSpace).append(FormattingOptions.oneSpace),this.on(i,isFqnExpressions)?.keyword(`,`).prepend(FormattingOptions.noSpace).append(FormattingOptions.oneSpace)}formatWhereExpression(i){(isRelationExprWhere(i)||isFqnExprWhere(i))&&this.getNodeFormatter(i).keyword(`where`).append(FormattingOptions.oneSpace)}formatWhereRelationExpression(i){if(this.on(i,isWhereRelationExpression,(i,a)=>{a.property(`operator`).surround(FormattingOptions.oneSpace)}),this.on(i,isWhereRelationNegation,(i,a)=>{a.keyword(`not`).append(FormattingOptions.oneSpace)}),isWhereRelation(i)||isWhereRelationTag(i)||isWhereRelationKind(i)){let a=this.getNodeFormatter(i);a.property(`operator`).surround(FormattingOptions.oneSpace),a.property(`not`).surround(FormattingOptions.oneSpace)}}formatWhereElementExpression(i){if(this.on(i,isWhereElementExpression,(i,a)=>{a.property(`operator`).surround(FormattingOptions.oneSpace)}),this.on(i,isWhereElementNegation,(i,a)=>{a.keyword(`not`).append(FormattingOptions.oneSpace)}),isWhereElement(i)||isWhereElementTag(i)||isWhereElementKind(i)){let a=this.getNodeFormatter(i);a.property(`operator`).surround(FormattingOptions.oneSpace),a.property(`not`).surround(FormattingOptions.oneSpace)}}formatIncludeExcludeExpressions(i){if(isDynamicViewRule(i)||isViewRulePredicate(i)||isDeploymentViewRulePredicate(i)){let a=this.getNodeFormatter(i);(!i.$cstNode||!isMultiline(i.$cstNode))&&a.keywords(`include`,`exclude`).append(FormattingOptions.oneSpace)}if(isExpressions(i)){let a=this.getNodeFormatter(i),o=this.findPredicateExpressionRoot(i),s=o?.$cstNode&&isMultiline(o?.$cstNode);s&&a.property(`value`).prepend(FormattingOptions.indent),a.keyword(`,`).prepend(FormattingOptions.noSpace).append(s?FormattingOptions.newLine:FormattingOptions.oneSpace)}}formatRelationExpression(i){this.on(i,isIncomingRelationExpr,(i,a)=>{a.keyword(`->`).append(FormattingOptions.oneSpace)}),this.on(i,isInOutRelationExpr,(i,a)=>{a.keyword(`->`).prepend(FormattingOptions.oneSpace)}),this.on(i,isOutgoingRelationExpr,(i,a)=>{a.keywords(`->`,`<->`).prepend(FormattingOptions.oneSpace),a.keywords(`-[`).prepend(FormattingOptions.oneSpace).append(FormattingOptions.noSpace),a.keywords(`]->`).prepend(FormattingOptions.noSpace).append(FormattingOptions.oneSpace),a.property(`dotKind`).prepend(FormattingOptions.oneSpace).append(FormattingOptions.oneSpace)}),this.on(i,isDirectedRelationExpr,(i,a)=>{a.property(`target`).prepend(FormattingOptions.oneSpace)})}findPredicateExpressionRoot(i){let a=i.$container;for(;;){if(!a||isDynamicViewRule(a)||isViewRulePredicate(a)||isDeploymentViewRulePredicate(a))return a;a=a.$container}}on(i,a,o){let s=a(i)?this.getNodeFormatter(i):void 0;return o&&s&&o(i,s),s}doExtendedFormatting(i){let a=this.quotesNormalizerFactory(this.extendedFormattingCommands);for(let o of this.extendedFormattingCommands)switch(o.type){case`normalizeQuotes`:a(o,i);break;default:nonexhaustive(o.type)}}normalizeQuotes(i){if(this.options.quoteStyle===`ignore`)return;let a=null;a??=this.on(i,isStringProperty)?.property(`value`),a??=this.on(i,isElement)?.properties(`props`),a??=this.on(i,isImportsFromPoject)?.properties(`project`),a??=this.on(i,isRelation)?.properties(`title`,`technology`),a??=this.on(i,isViewRuleGroup)?.properties(`title`),a??=this.on(i,isDynamicViewStep)?.properties(`title`),a??=this.on(i,isDeploymentNode$1)?.properties(`title`),a??=this.on(i,isDeployedInstance)?.properties(`title`),a??=this.on(i,isDeploymentRelation)?.properties(`title`,`technology`),a??=this.on(i,isLinkProperty)?.properties(`title`),a&&this.extendedFormattingCommands.push({type:`normalizeQuotes`,region:a})}quotesNormalizerFactory(i){let a=this.options.quoteStyle==`auto`?this.getAutoQuoteStyle(i):this.options.quoteStyle;return(i,o)=>{let s=a===`single`?`"`:`'`,c=a===`single`?`'`:`"`,l=c.repeat(3),d=c,f=i.region.nodes.map(i=>{let a=i.text.startsWith(`"""`)||i.text.startsWith(`'''`)?l:d;return{range:i.range,newText:a+this.escapeQuotesInternalQuotes(i.text.slice(a.length,-a.length),s,c)+a}});o.push(...f)}}escapeQuotesInternalQuotes(i,a,o){let s=``,c=0;for(;c>=0;){let a=i.indexOf(o,c);if(a<0){s+=i.slice(c);break}s+=i.slice(c,a),c=a+1;let l=!1;for(;a>0&&i[a-1]==`\\`;)l=!l,a--;s+=l?o:`\\${o}`}return s}getAutoQuoteStyle(i){let a=i.flatMap(i=>i.region.nodes);return a.filter(i=>i.text[0]==`"`).length*2>=a.length?`double`:`single`}onConfigurationUpdate(i){this.options={...this.options,...i??{quoteStyle:`auto`}}}};const NoMCPServer={mcpServer:()=>new NoopLikeC4MCPServer,mcpServerFactory:()=>new NoopLikeC4MCPServerFactory};var NoopLikeC4MCPServer=class{get mcp(){throw Error(`NoopLikeC4MCPServer does not have a McpServer`)}get isStarted(){return!1}get port(){return NaN}start(){return Promise.resolve()}stop(){return Promise.resolve()}},NoopLikeC4MCPServerFactory=class{create(i){throw Error(`NoopLikeC4MCPServerFactory`)}},AstNodeDescriptionProvider=class extends DefaultAstNodeDescriptionProvider{constructor(i){super(i),this.services=i}createDescription(i,a,o){o??=getDocument$6(i);let s=super.createDescription(i,a,o);return isLikeC4Builtin(o.uri)||(o.likec4ProjectId??=this.services.shared.workspace.ProjectsManager.ownerProjectId(o),s.likec4ProjectId=o.likec4ProjectId),s}},IndexManager=class extends DefaultIndexManager{constructor(i){super(i),this.services=i}async updateContent(i,a){i.likec4ProjectId=this.services.workspace.ProjectsManager.ownerProjectId(i),await super.updateContent(i,a)}projectElements(i,a,o){let s=this.services.workspace.ProjectsManager;return stream(this.symbolIndex.keys()).filter(a=>o&&!o.has(a)?!1:s.isIncluded(i,a)).flatMap(i=>this.getFileDescriptions(i,a))}};const compare$1=compareNaturalHierarchically(`/`),ensureOrder=(i,a)=>compare$1(i.uri.path,a.uri.path),isLikeC4UserDocument=i=>isLikeC4LangiumDocument(i)&&isNotLikeC4Builtin(i);var LangiumDocuments=class extends DefaultLangiumDocuments{constructor(i){super(i),this.services=i}get projectsManager(){return this.services.workspace.ProjectsManager}addDocument(i){let a=i.uri.toString();if(this.documentMap.has(a))throw Error(`A document with the URI '${a}' is already present.`);let o=[...this.documentMap.values(),i].sort(ensureOrder);this.documentMap.clear();for(let i of o)this.documentMap.set(i.uri.toString(),i);isLikeC4UserDocument(i)&&(i.likec4ProjectId=this.projectsManager.ownerProjectId(i))}getDocument(i){let a=super.getDocument(i);return isLikeC4UserDocument(a)&&(a.likec4ProjectId=this.projectsManager.ownerProjectId(a)),a}get userDocuments(){return stream(this.documentMap.values()).filter(i=>isLikeC4UserDocument(i)&&!this.projectsManager.isExcluded(i))}get all(){return stream(this.documentMap.values()).map(i=>(isLikeC4UserDocument(i)&&(i.likec4ProjectId=this.projectsManager.ownerProjectId(i)),i))}projectDocuments(i){let a=this.services.workspace.ProjectsManager;return stream(this.documentMap.values()).filter(o=>isLikeC4UserDocument(o)&&a.isIncluded(i,o)?(o.likec4ProjectId=i,!0):!1)}groupedByProject(){let i=this.services.workspace.ProjectsManager;return t$3(this.userDocuments.toArray(),t(a=>(a.likec4ProjectId=i.ownerProjectId(a),a)),t$11(e(`likec4ProjectId`)))}resetProjectIds(){let i=[];for(let a of this.documentMap.values())delete a.likec4ProjectId,isLikeC4UserDocument(a)&&!this.projectsManager.isExcluded(a)&&i.push(a.uri);return i}},import_picomatch=__toESM(require_picomatch(),1);const logger$9=logger$16.getChild(`projects`);function isLangiumDocument(i){return typeof i==`object`&&`uri`in i&&`textDocument`in i}function normalizeUri(i){return isLangiumDocument(i)?i.uri.toString():typeof i==`string`?hasProtocol(i)?i:URI.file(i).toString():i.toString()}const compare=compareNaturalHierarchically(`/`,!0),compareUri=(i,a)=>compare(withoutTrailingSlash(i.path),withoutTrailingSlash(a.path));function isParentFolderFor(i){return a=>i.startsWith(isString(a)?a:a.folder)}function _overlaps(i,a){let o=isString(i)?i:i.folder,s=isString(a)?a:a.folder;return o.startsWith(s)||s.startsWith(o)}function overlaps(...i){return t$17(_overlaps,i)}function _includes(i,a){return a.startsWith(i.folder)||i.includePaths?.some(isParentFolderFor(a))?!_excludes(i,a):!1}function _excludes(i,a){return i.exclude?.(withoutProtocol(a))??!1}function includes(...i){return t$17(_includes,i)}function excludes(...i){return t$17(_excludes,i)}function ProjectFolder(i){return i=normalizeUri(i),withTrailingSlash(i)}const DefaultProject={id:`default`,config:{name:`default`,exclude:[`**/node_modules/**`]},exclude:(0,import_picomatch.default)(`**/node_modules/**`,{dot:!0}),includeConfig:{paths:[],maxDepth:3,fileThreshold:30}};function isExcludedByDefault(i){return DefaultProject.exclude(withoutProtocol(i))}function parseRegisterOptions(i){if(`configUri`in i){invariant$1(!e$8(i.configUri),`configUri is emptyish`);let a=URI.isUri(i.configUri)?i.configUri:URI.parse(normalizeUri(i.configUri)),o=ProjectFolder(UriUtils.dirname(a));return{configUri:a,folder:o,folderUri:URI.parse(o)}}invariant$1(!e$8(i.folderUri),`folderUri is emptyish`);let a=ProjectFolder(i.folderUri),o=URI.parse(a);return{configUri:UriUtils.joinPath(o,`likec4.config.json`),folder:a,folderUri:o}}var ProjectsManager=class i{static DefaultProjectId=DefaultProject.id;#e=[];#t=void 0;#n=void 0;#r=[];#i=new DefaultMap(a=>{if(a===i.DefaultProjectId){let i=this.getWorkspaceFolder(),o=UriUtils.joinPath(i,`.likec4rc`),s=ProjectFolder(i);return{id:a,config:DefaultProject.config,folder:s,folderUri:URI.parse(s),configUri:o,exclude:DefaultProject.exclude,includeConfig:DefaultProject.includeConfig}}return nonNullable$1(this.#r.find(i=>i.id===a),`Project ${a} not found`)});#a=new DefaultMap(i=>{let a=normalizeUri(i),o=this.#o.get(a);return o?excludes(o,a)?!this.#r.some(includes(a)):!1:isExcludedByDefault(a)});#o=new DefaultMap(i=>{let a=isParentFolderFor(i);return this.#r.find(a)??this.#r.find(includes(i))??null});constructor(i){this.services=i,logger$9.debug`created`}get defaultProjectId(){if(this.#t)return this.#t;if(!(this.#r.length>1))return t$4(this.#r,1)?this.#r[0].id:i.DefaultProjectId}set defaultProjectId(a){if(a!==this.#t){if(this.#n=void 0,!a||a===i.DefaultProjectId){logger$9.debug`reset default project ID`,this.#t=void 0;return}invariant$1(this.#r.find(i=>i.id===a),`Project "${a}" not found`),logger$9.debug`set default project ID to ${a}`,this.#t=a}}get default(){if(!this.#n){let a=this.defaultProjectId??i.DefaultProjectId;this.#n=this.#i.get(a)}return this.#n}get all(){if(t$4(this.#r,1)){let i=[...t(this.#r,e(`id`)),DefaultProject.id];if(this.#t){let a=i.findIndex(i=>i===this.#t);a>0&&(i.splice(a,1),i.unshift(this.#t))}return i}return[DefaultProject.id]}getProject(i){let a=typeof i==`string`?i:i.likec4ProjectId||this.ownerProjectId(i);return this.#i.get(a)}findOverlaped(i){let a=overlaps(ProjectFolder(i)),o=i=>a(i)||!!i.includePaths&&!!r$1(i.includePaths,a);return this.#r.filter(o)}ensureProjectId(a){return a===i.DefaultProjectId?this.defaultProjectId??i.DefaultProjectId:a?(invariant$1(this.#r.some(i=>a===i.id),`Project ID ${a} is not registered`),a):nonNullable$1(this.defaultProjectId,()=>`Specify exact project, known: [${t(this.#r,e(`id`)).join(`, `)}]`)}ensureProject(i){return i=this.ensureProjectId(i),this.getProject(i)}hasMultipleProjects(){return this.#r.length>1}isExcluded(...i){let a=i.length===1?i[0]:i[1];return isLangiumDocument(a)&&isLikeC4Builtin(a)?!0:i.length===1?this.#a.get(normalizeUri(a)):excludes(this.#i.get(i[0]),normalizeUri(a))}isIncluded(a,o){let s=normalizeUri(o);return t$4(this.#r,1)?a===i.DefaultProjectId?!this.#o.get(s)&&!isExcludedByDefault(s):includes(this.#i.get(a),normalizeUri(o)):!isExcludedByDefault(s)}async registerConfigFile(i,a){if(isExcludedByDefault(normalizeUri(i)))throw Error(`Failed to register project config, path ${i.fsPath} is excluded by: ${DefaultProject.config.exclude.map(i=>`"${i}"`).join(`, `)}`);try{let o=await this.services.workspace.FileSystemProvider.loadProjectConfig(i);return await this.registerProject({config:o,configUri:i},a)}catch(a){if(!isOperationCancelled(a))throw wrapError(a,`Failed to register project config ${i.fsPath}:\n`);return Promise.reject(a)}}async registerProject(i,a){let o=LikeC4ProjectConfigOps.validate(i.config),{configUri:s,folder:c,folderUri:l}=parseRegisterOptions(i),d=LikeC4ProjectConfigOps.normalizeInclude(o.include),f=this.#r.find(i=>i.folder===c);return f?(f.config.name!==o.name&&(f.id=this.uniqueProjectId(o.name),logger$9.info`re-register ${f.id}`),f.config=o,f.folder=c,f.folderUri=l,f.configUri=s,f.includeConfig=d):(f={id:this.uniqueProjectId(o.name),config:o,folder:c,configUri:s,folderUri:l,includeConfig:d},this.#r=t$3([...this.#r,f],t$9((i,a)=>compareUri(i.folderUri,a.folderUri))),logger$9.info`register ${f.id}`),this.updateIncludesExcludes(f),this.resetCaches(),this.#s?f:(this.notifyListeners(),await this.rebuildProject(f.id,a).catch(i=>isOperationCancelled(i)?Promise.reject(i):(logger$9.warn(`Failed to rebuild project {projectId} after config change`,{projectId:f.id,error:i}),Promise.resolve())),f)}ownerProjectId(a){return this.#o.get(normalizeUri(a))?.id??this.#t??i.DefaultProjectId}#s=null;async reloadProjects(i){return this.#s?(logger$9.debug`reload projects is already in progress, waiting`,await this.#s.catch(()=>{})):(logger$9.debug`schedule reload projects`,this.#s=Promise.resolve().then(()=>this._reloadProjects(i)).catch(i=>(isOperationCancelled(i)||logger$9.warn(`Failed to reload projects`,{error:i}),Promise.reject(i))).finally(()=>{this.#s=null,this.notifyListeners()}),await this.#s)}async _reloadProjects(i){let a=this.services.workspace.WorkspaceManager.workspaceFolders;if(!a||a.length===0){logger$9.warn(`Failed to reloadProjects, no workspace folders found`);return}logger$9.debug`start reload projects`;let o=[];for(let i of a){let a=URI.parse(i.uri);logger$9.debug`scan projects in ${a.fsPath}`;try{let i=await this.services.workspace.FileSystemProvider.scanProjectFiles(a);for(let s of i)logger$9.debug`found config ${UriUtils.relative(a,s.uri)}`,o.push(s.uri)}catch(i){logger$9.warn(`Failed on scanProjectFiles in {folder}`,{folder:a.fsPath,error:i})}}if(o.length===0){if(this.#r.length===0){logger$9.warning(`No config files found`);return}logger$9.warning(`No config files found, but {count} projects were registered before`,{count:this.#r.length})}o.sort(compareUri);let s=new Map(this.#r.map(i=>[i.configUri.toString(),i]));this.#r=[],this.#i.clear();for(let i of o)try{await this.registerConfigFile(i)}catch(a){logger$9.warn(loggable(a));let o=s.get(i.toString());o&&(logger$9.debug`Update failed, restore project ${o.id}`,await this.registerProject(o))}this.resetCaches(),this.notifyListeners(),await this.services.workspace.WorkspaceManager.rebuildAll(i)}uniqueProjectId(i){let a=new Set(t(this.#r,e(`id`))),o=i;if(!a.has(o))return o;logger$9.warn`Project "${i}" already exists, generating unique ID`;let s=1;for(;a.has(o);)o=`${i}-${s++}`;return o}resetCaches(){logger$9.trace(`resetCaches`),this.#n=void 0,this.#t&&!this.#r.some(i=>i.id===this.#t)&&(this.#t=void 0),this.#i.clear(),this.#o.clear(),this.#a.clear()}async rebuildProject(a,o){let s=this.#r.find(i=>i.id===a);if(!s)return a===i.DefaultProjectId?logger$9.info`Rebuilding all documents `:logger$9.warn`Project ${a} not found, rebuilding all`,await this.services.workspace.WorkspaceManager.rebuildAll(o);let c=logger$9.getChild(s.id),l=i=>includes(s,normalizeUri(i)),d=this.services.workspace.LangiumDocuments.resetProjectIds().filter(l);d.length!==0&&(c.info(`rebuild project documents: {docs}`,{docs:d.length}),this.resetCaches(),await this.services.workspace.DocumentBuilder.update(d,[],o).catch(i=>{c.warn(`Failed to rebuild project`,{error:i})}))}getAllIncludePaths(){let i=[];for(let a of this.#r)if(a.includePaths)for(let o of a.includePaths)i.push({projectId:a.id,includePath:o.uri,includeConfig:a.includeConfig});return i}onProjectsUpdate(i){return this.#e.push(i),Disposable.create(()=>{let a=this.#e.indexOf(i);a>=0&&this.#e.splice(a,1)})}getWorkspaceFolder(){try{return this.services.workspace.WorkspaceManager.workspaceUri}catch(i){return logger$9.warn(`Failed to get workspace URI, using default folder`,{error:i}),URI.file(`/`)}}notifyListeners(){for(let i of this.#e)try{i()}catch(i){logger$9.warn(loggable(i))}}updateIncludesExcludes(i){let a=i.config;switch(!0){case e$5(a.exclude):i.exclude=DefaultProject.exclude;break;case a.exclude&&t$4(a.exclude,1):i.exclude=(0,import_picomatch.default)(t(a.exclude,a=>(!isRelative(a)&&!a.startsWith(`**`)&&(a=joinURL(`**`,a)),cleanDoubleSlashes(joinRelativeURL(i.folderUri.path,a)))),{contains:!0,dot:!0});break;default:delete i.exclude}let o=i.includeConfig.paths;if(!t$4(o,1))return delete i.includePaths,i;i.includePaths=t(o,a=>{let o=UriUtils.resolvePath(i.folderUri,a);return{uri:o,folder:ProjectFolder(o)}}),logger$9.debug`project ${i.id} include paths: ${i.includePaths.map(i=>i.uri.fsPath).join(`, `)}`;for(let a of i.includePaths)for(let o of this.#r)o.id!==i.id&&(overlaps(a,o)&&logger$9.warn(`Project "{projectId}" include path "{includePath}" overlaps with project "{otherProjectId}" folder. Files in overlapping areas will only belong to one project.`,{projectId:i.id,includePath:a.folder,otherProjectId:o.id}),o.includePaths?.forEach(s=>{overlaps(a,s)&&logger$9.warn(`Project "{projectId}" include path "{includePath}" overlaps with project "{otherProjectId}" include path "{otherIncludePath}". Files in overlapping areas will only belong to one project.`,{projectId:i.id,includePath:a.folder,otherProjectId:o.id,otherIncludePath:s.folder})}));return i}},LikeC4WorkspaceManager=class extends DefaultWorkspaceManager{documentFactory;fileSystemProvider;#e=[];initialBuildOptions={eagerLinking:!0,validation:!0};constructor(i){super(i),this.services=i,this.documentFactory=i.workspace.LangiumDocumentFactory,this.fileSystemProvider=i.workspace.FileSystemProvider}async performStartup(i){this.folders??=i;let a=[];for(let o of i)try{let i=URI.parse(o.uri),s=await this.fileSystemProvider.scanProjectFiles(i);a.push(...s),this.services.workspace.FileSystemWatcher.watch(i.fsPath)}catch(i){logWarnError(i)}let o=this.services.workspace.ProjectsManager;for(let i of a)try{await o.registerConfigFile(i.uri)}catch(i){logWarnError(i)}return await super.performStartup(i)}async loadAdditionalDocuments(i,a){a(this.documentFactory.fromString(LibIcons,URI.parse(Uri)));let o=this.services.workspace.ProjectsManager.getAllIncludePaths(),s=0,c=[];for(let{projectId:i,includePath:a,includeConfig:s}of o)try{logger$16.debug`scanning include path ${a.fsPath} for project ${i}`;let o=await this.fileSystemProvider.readDirectory(a,{recursive:!0,maxDepth:s.maxDepth});c.push(...o),o.length===0&&logger$16.debug`loaded ${o.length} files from include path ${a.fsPath}`}catch(i){logger$16.warn(`Failed to scan include path ${a.fsPath}`,{error:i})}for(let i of n$5(c,i=>i.uri.path))try{a(await this.langiumDocuments.getOrCreateDocument(i.uri)),s++}catch(a){logger$16.warn(`Failed to load document ${i.uri.fsPath}`,{error:a})}if(o.length>0&&s>0){let i=Math.min(...o.map(i=>i.includeConfig.fileThreshold));s>i?logger$16.warn(`Loaded ${s} files from include paths (threshold: ${i}). Large include directories may slow workspace initialization. Consider adjusting "include.fileThreshold" or "include.maxDepth" in your project configuration.`):logger$16.info`loaded ${s} total files from ${o.length} include paths`}}includeEntry(i,a,o){let s=UriUtils.basename(a.uri);return a.isDirectory?!excludeNodeModules(s):a.isFile?(o.fileExtensions.includes(UriUtils.extname(a.uri))||o.fileNames.includes(s))&&!this.services.workspace.ProjectsManager.isExcluded(a.uri):!1}workspace(){return this.folders&&t$4(this.folders,1)?this.folders[0]:null}async rebuildAll(i){let a=this.services.workspace.LangiumDocuments.resetProjectIds();logger$16.info(`invalidate and rebuild all {docs} documents`,{docs:a.length}),this.forceCleanCaches(),await this.documentBuilder.update(a,[],i)}get workspaceUri(){let i=this.workspace();return invariant(i,`Workspace not initialized`),URI.parse(i.uri)}get workspaceURL(){let i=this.workspace();return invariant(i,`Workspace not initialized`),new URL(i.uri)}forceCleanCaches(){for(let i of this.#e)i();this.services.workspace.ManualLayouts.clearCaches(),this.services.workspace.Cache.clear()}onForceCleanCache(i){return this.#e.push(i),Disposable.create(()=>{this.#e=this.#e.filter(a=>a!==i)})}};init_main();const logger$8=logger$16.getChild(`LanguageServices`),isErrorDiagnostic=i=>i.severity===DiagnosticSeverity$1.Error;var DefaultLikeC4LanguageServices=class{builder;editor;projectsManager;constructor(i){this.services=i,this.builder=i.likec4.ModelBuilder,this.projectsManager=i.shared.workspace.ProjectsManager,this.editor=i.likec4.ModelChanges}get mcpServer(){let i=this.services.mcp.Server;return i instanceof NoopLikeC4MCPServer?null:i}get views(){return this.services.likec4.Views}get workspaceUri(){return this.services.shared.workspace.WorkspaceManager.workspaceUri}projects(){let i=this.services.shared.workspace.ProjectsManager,a=t$3(this.services.shared.workspace.LangiumDocuments.groupedByProject(),t$2(),t(([a,o])=>{let s=a,{folderUri:c,config:l}=i.getProject(s);return{id:s,folder:c,title:l.title??l.name,documents:t(o,e(`uri`)),config:l}}));if(t$4(a,2)&&i.defaultProjectId){let o=a.findIndex(a=>a.id===i.defaultProjectId);if(o>0){let[i]=a.splice(o,1);return[i,...a]}return a}if(t$4(a,1))return a;let{id:o,folderUri:s,config:c}=i.default;return[{id:o,folder:s,title:c.title??c.name,documents:[],config:c}]}project(i){let{id:a,folderUri:o,config:s}=this.projectsManager.ensureProject(i),c=t(this.services.shared.workspace.LangiumDocuments.projectDocuments(a).toArray(),e(`uri`));return{id:a,folder:o,title:s.title??s.name,documents:c,config:s}}async diagrams(i,a){let o=this.projectsManager.ensureProjectId(i);return await this.views.diagrams(o,a)}async computedModel(i,a){let o=this.projectsManager.ensureProjectId(i);return await this.builder.computeModel(o,a)}async layoutedModel(i,a){let o=this.projectsManager.ensureProjectId(i),s=await this.builder.computeModel(o,a);if(!s)throw Error(`Failed to compute model, empty project?`);let c=await this.views.layoutAllViews(o,a);return LikeC4Model.create({...s.$data,_stage:`layouted`,views:t$3(c,t(e(`diagram`)),t$6(e(`id`)))})}async projectsOverview(i){let a=this.services.shared.workspace.ProjectsManager.all,o=[];for(let s of a){let a=await this.builder.computeModel(s,i);if(i?.isCancellationRequested)throw Error(`Operation cancelled`);if(a===LikeC4Model.EMPTY){logger$8.debug(`Project ${s} is empty, skipping`);continue}o.push(a)}if(!t$4(o,1))throw Error(`No models found`);let s=computeProjectsView(o);return await this.views.layouter.layoutProjectsView(s)}getErrors(){return t$3(this.services.shared.workspace.LangiumDocuments.userDocuments.toArray(),t$7(i=>t$3(i.diagnostics??[],n$2(isErrorDiagnostic),t(({message:a,range:o})=>({message:a,line:o.start.line,range:o,sourceFsPath:i.uri.fsPath})))))}locate(i){switch(!0){case`element`in i:return this.services.likec4.ModelLocator.locateElement(i.element,i.projectId);case`relation`in i:return this.services.likec4.ModelLocator.locateRelation(i.relation,i.projectId);case`view`in i:return this.services.likec4.ModelLocator.locateView(i.view,i.projectId);case`deployment`in i:return this.services.likec4.ModelLocator.locateDeploymentElement(i.deployment,i.projectId);default:nonexhaustive(i)}}async dispose(){try{logger$8.debug(`disposing LikeC4LanguageServices`),await this.services.shared.workspace.FileSystemWatcher.dispose(),this.services.mcp.Server.isStarted&&await this.services.mcp.Server.stop(),this.services.Rpc.dispose(),this.services.likec4.ModelBuilder.dispose()}catch(i){logger$8.error(loggable(i))}finally{logger$8.debug(`LikeC4LanguageServices disposed`)}}},ADisposable=class{toDispose=[];isDisposed=!1;onDispose(...i){this.toDispose.push(...i)}dispose(){this.throwIfDisposed(),this.isDisposed=!0;let i;for(;i=this.toDispose.pop();)try{i.dispose()}catch(i){logWarnError(i)}}throwIfDisposed(){if(this.isDisposed)throw Error(`This has already been disposed`)}};function elementRef(i){try{let a=isStrictFqnElementRef(i)?i.el.ref:i.modelElement.value.ref;return a?.$type===`Imported`&&(a=a.imported.ref),a?.$type===`Element`?a:void 0}catch{return}}function readStrictFqn(i){let a=[i.$type===`StrictFqnRef`?i.value.$refText:i.el.$refText],o=i.parent;for(;o;)a.push(o.$type===`StrictFqnRef`?o.value.$refText:o.el.$refText),o=o.parent;return a.length===1?a[0]:a.reverse().join(`.`)}function referenceableParent(i){for(;i.parent;)i=i.parent;return i.value.ref??null}function instanceRef(i){let a;for(;a=i.value?.ref;){if(isDeploymentNode$1(a))return null;if(isDeployedInstance(a))return a;if(e$5(i.parent))return null;i=i.parent}return null}function importsRef(i){let a=referenceableParent(i);return a?.$type===`Imported`?a:null}function isReferenceToDeploymentModel(i){let a;for(;a=i.value?.ref;){if(isDeploymentElement(a))return!0;if(e$5(i.parent))return!1;i=i.parent}return!1}function projectIdFrom(i){if(isImported(i)){for(;i.$type===`Imported`&&i.$container;)i=i.$container;invariant(isImportsFromPoject(i))}if(isImportsFromPoject(i))return i.project;let a=isAstNode(i)?getDocument$6(i):i;return a.likec4ProjectId?a.likec4ProjectId:(logger$16.warn`Document ${a.uri.fsPath} does not have a project ID assigned, this may lead to unexpected behavior.`,ProjectsManager.DefaultProjectId)}function stringHash$1(...i){return stringHash(i.length>1?i.join(`:::`):i[0])}function safeCall(i){try{return i()}catch(i){logger$16.trace(`Safe call failed`,{error:i});return}}function performanceNow(){try{return globalThis.performance.now()}catch{return Date.now()}}function performanceMark(){let i=performanceNow();return{get ms(){return performanceNow()-i},get pretty(){return prettyMilliseconds(performanceNow()-i)}}}var LikeC4CodeLensProvider=class{constructor(i){this.services=i}async provideCodeLens(i,a,o){if(isLikeC4LangiumDocument(i))return i.state<DocumentState.Linked&&(logger$16.debug(`Waiting for document ${i.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(DocumentState.Linked,i.uri,o),logger$16.debug(`Document is linked`)),i.parseResult.value.views.flatMap(i=>i.views).flatMap(i=>{let a=ViewOps.readId(i),o=i.$cstNode?.range;if(!o||!a)return[];let s=projectIdFrom(i);return{range:{start:o.start,end:{line:o.start.line,character:o.start.character+4}},command:{command:`likec4.open-preview`,arguments:[a,s],title:`open preview`}}})}};init_main();const STYLE_FIELDS=[`color`,`shape`,`icon`,`iconColor`,`iconSize`,`iconPosition`,`border`,`opacity`,`multiple`,`size`,`textSize`].join(`,`);function isCompletionForPojectName(i,a){return isRuleCall(a.feature)&&a.property===`project`&&isImportsFromPoject(i.node)}var LikeC4CompletionProvider=class extends DefaultCompletionProvider{constructor(i){super(i),this.services=i}completionOptions={triggerCharacters:[`.`,`#`]};completionFor(i,a,o){switch(!0){case isKeyword(a.feature):return this.completionForKeyword(i,a.feature,o);case isCrossReference(a.feature)&&!!i.node:return this.completionForCrossReference(i,a,o);case isCompletionForPojectName(i,a):return this.completionForImportedProject(i,o)}}completionForKeyword(i,a,o){if(this.filterKeyword(i,a))switch(!0){case a.value===`import`:o(i,{label:a.value,kind:CompletionItemKind.Snippet,insertTextFormat:InsertTextFormat.Snippet,insertText:`${a.value} { $0 } from '\${1|${this.services.shared.workspace.ProjectsManager.all.join(`,`)}|}'`});break;case a.value===`deployment`&&hasContainerOfType(i.node,isModelViews):o(i,{label:a.value,detail:`Insert deployment view`,kind:CompletionItemKind.Class,insertTextFormat:InsertTextFormat.Snippet,insertText:["deployment view ${1:view_${TM_FILENAME_BASE}_${CURRENT_SECOND}} {"," title '${2:Untitled}'",` `,` include $0`,`}`].join(`
40
+ `)});break;case[`title`,`description`,`technology`,`link`].includes(a.value):o(i,{label:a.value,detail:`Insert ${a.value} property`,kind:CompletionItemKind.Property,insertTextFormat:InsertTextFormat.Snippet,insertText:`${a.value} '\${0}'`});break;case a.value===`color`:o(i,{label:a.value,kind:CompletionItemKind.Property,insertTextFormat:InsertTextFormat.Snippet,insertText:`${a.value} \${1|${ThemeColors.join(`,`)}|}$0`});break;case a.value===`opacity`:o(i,{label:a.value,kind:CompletionItemKind.Property,insertTextFormat:InsertTextFormat.Snippet,insertText:`${a.value} \${0:100}%`});break;case[`views`,`specification`,`model`,`deployment`,`with`].includes(a.value):o(i,{label:a.value,detail:`Insert ${a.value} block`,kind:CompletionItemKind.Module,insertTextFormat:InsertTextFormat.Snippet,insertText:`${a.value} {\n\t$0\n}`});break;case a.value===`group`:o(i,{label:a.value,detail:`Insert group block`,kind:CompletionItemKind.Module,insertTextFormat:InsertTextFormat.Snippet,insertText:["group '${1:Title}' {",` $0`,`}`].join(`
41
+ `)});break;case[`par`,`parallel`].includes(a.value):o(i,{label:a.value,detail:`Insert block of parallel steps`,kind:CompletionItemKind.Module,insertTextFormat:InsertTextFormat.Snippet,insertText:[`${a.value} {`,` $0`,`}`].join(`
42
+ `)});break;case a.value===`dynamic`&&hasContainerOfType(i.node,isModelViews):o(i,{label:a.value,detail:`Insert dynamic view`,kind:CompletionItemKind.Class,insertTextFormat:InsertTextFormat.Snippet,insertText:["dynamic view ${1:view_${TM_FILENAME_BASE}_${CURRENT_SECOND}} {"," title '${2:Untitled}'",` `,` $0`,`}`].join(`
43
+ `)});break;case a.value===`style`&&i.node&&hasContainerOfType(i.node,isGlobalStyle):o(i,{label:a.value,detail:`Insert ${a.value} block`,kind:CompletionItemKind.Module,insertTextFormat:InsertTextFormat.Snippet,insertText:`${a.value} \${1:name} \${2:*} {\n\t\${3|${STYLE_FIELDS}|} $0\n}`});break;case a.value===`style`&&i.node&&hasContainerOfType(i.node,t$18([isModelViews,isGlobalStyleGroup])):o(i,{label:a.value,detail:`Insert ${a.value} block`,kind:CompletionItemKind.Module,insertTextFormat:InsertTextFormat.Snippet,insertText:`${a.value} \${1:*} {\n\t\${2|${STYLE_FIELDS}|} $0\n}`});break;case a.value===`style`:o(i,{label:a.value,detail:`Insert ${a.value} block`,kind:CompletionItemKind.Module,insertTextFormat:InsertTextFormat.Snippet,insertText:`${a.value} {\n\t\${1|${STYLE_FIELDS}|} $0\n}`});break;case a.value===`extend`:o(i,{label:a.value,detail:`Extend another view`,kind:CompletionItemKind.Class,insertTextFormat:InsertTextFormat.Snippet,insertText:`extend $1 {
44
+ $0
45
+ }`});break;case a.value===`autoLayout`:o(i,{label:a.value,kind:CompletionItemKind.Property,insertTextFormat:InsertTextFormat.Snippet,insertText:"autoLayout ${1|TopBottom,BottomTop,LeftRight,RightLeft|}$0"});break;case a.value===`mode`:o(i,{label:a.value,kind:CompletionItemKind.Property,insertTextFormat:InsertTextFormat.Snippet,insertText:"mode ${1|sequence,diagram|}$0"});break;case[`include`,`exclude`].includes(a.value):o(i,{label:a.value,kind:CompletionItemKind.Operator,detail:`Insert ${a.value} predicate`,insertTextFormat:InsertTextFormat.PlainText,insertText:`${a.value} `});break;default:o(i,{label:a.value,kind:this.getKeywordCompletionItemKind(a),detail:`Keyword`,sortText:`1`})}}completionForImportedProject(i,a){let o=this.services.shared.workspace.ProjectsManager,s=i.document.textDocument,c={start:s.positionAt(i.tokenOffset),end:s.positionAt(i.tokenEndOffset)},l=s.getText(c),d=e$7(l)?`'`:l.substring(0,1);for(let s of o.all){let o=d+s+d;a(i,{label:s,kind:CompletionItemKind.Folder,insertText:o,filterText:o,textEdit:TextEdit$1.replace(c,o),detail:`Project`,sortText:`0_`+s})}}},import_main$2=require_main(),LikeC4DocumentHighlightProvider=class extends DefaultDocumentHighlightProvider{createDocumentHighlight(i){return import_main$2.DocumentHighlight.create(i.segment.range,import_main$2.DocumentHighlightKind.Read)}},LikeC4DocumentLinkProvider=class{constructor(i){this.services=i}async getDocumentLinks(i,a,o){return!isLikeC4LangiumDocument(i)||this.services.shared.workspace.ProjectsManager.isExcluded(i)?[]:streamAllContents$1(i.parseResult.value).filter(isLinkProperty).map(a=>{try{let o=findNodeForProperty$1(a.$cstNode,`value`)?.range,s=o&&this.resolveLink(i,a.value);if(s&&hasProtocol(s))return{range:o,target:s}}catch(i){logWarnError(i)}return null}).nonNullable().toArray()}resolveLink(i,a){if(hasProtocol(a)||hasLeadingSlash(a))return a;if(isRelative(a))return joinRelativeURL(i.uri.toString(),`../`,a);let o=this.services.shared.workspace.ProjectsManager.getProject(i).folderUri;return joinRelativeURL(o.toString(),a)}relativeLink(i,a){if(hasLeadingSlash(a))return withoutLeadingSlash(a);if(isRelative(a)){let o=this.services.shared.workspace.ProjectsManager.getProject(i).folderUri.toString(),s=new URL(i.uri.toString());return withoutLeadingSlash(withoutBase(new URL(a,s).toString(),o))}return null}};init_main();const logger$7=logger$16.getChild(`DocumentSymbolProvider`);var LikeC4DocumentSymbolProvider=class{nodeKindProvider;nameProvider;parser;locator;constructor(i){this.services=i,this.nodeKindProvider=i.shared.lsp.NodeKindProvider,this.parser=i.likec4.ModelParser,this.locator=i.likec4.ModelLocator,this.nameProvider=i.references.NameProvider}async getSymbols(i,a,o){if(!isLikeC4LangiumDocument(i)||this.services.shared.workspace.ProjectsManager.isExcluded(i))return[];i.state<DocumentState.Linked&&(logger$7.debug(`Waiting for document ${i.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(DocumentState.Linked,i.uri,o),logger$7.debug(`document is Linked`));let{parseResult:{value:{specifications:s,models:c,deployments:l,views:d,likec4lib:f}}}=i;return[...f.map(i=>()=>this.getLikec4LibSymbol(i)),...s.map(i=>()=>this.getSpecSymbol(i)),...c.map(i=>()=>this.getModelSymbol(i)),...l.map(i=>()=>this.getDeploymentModelSymbol(i)),...d.map(i=>()=>this.getModelViewsSymbol(i))].flatMap(i=>{try{return i()??[]}catch(i){return logWarnError(i),[]}})}getLikec4LibSymbol(i){let a=i?.$cstNode;if(!a)return[];let o=i.icons.map(i=>this.getLibIconSymbol(i)).filter(e$4);return o.length===0?[]:[{kind:SymbolKind.Namespace,name:`icons`,range:a.range,selectionRange:findNodeForKeyword$3(a,`icons`)?.range??a.range,children:o}]}getSpecSymbol(i){let a=i?.$cstNode;if(!a)return[];let o=findNodeForProperty$1(a,`name`);if(!o)return[];let s=t$3([...i.elements,...i.tags,...i.relationships],t(i=>{try{if(isSpecificationElementKind(i)||isSpecificationRelationshipKind(i)||isSpecificationDeploymentNodeKind(i))return this.getKindSymbol(i);if(isSpecificationTag(i))return this.getTagSymbol(i)}catch(i){return logWarnError(i),null}nonexhaustive(i)}),n$2(e$4));return s.length===0?[]:[{kind:SymbolKind.Namespace,name:i.name,range:a.range,selectionRange:o.range,children:s}]}getModelSymbol(i){let a=i.$cstNode;if(!a)return[];let o=findNodeForProperty$1(a,`name`);return o?[{kind:this.symbolKind(i),name:i.name,range:a.range,selectionRange:o.range,children:i.elements.flatMap(i=>isExtendRelation(i)?[]:this.getElementsSymbol(i))}]:[]}getDeploymentModelSymbol(i){let a=i.$cstNode;if(!a)return[];let o=findNodeForProperty$1(a,`name`);return o?[{kind:this.symbolKind(i),name:i.name,range:a.range,selectionRange:o.range,children:i.elements.flatMap(i=>this.getDeploymentElementSymbol(i))}]:[]}getElementsSymbol(i){try{if(isExtendElement(i))return this.getExtendElementSymbol(i);if(isElement(i))return this.getElementSymbol(i)}catch(i){logWarnError(i)}return[]}getExtendElementSymbol(i){let a=i.$cstNode,o=i.element.$cstNode,s=i.body;return!a||!o?[]:[{kind:this.symbolKind(i),name:readStrictFqn(i.element),range:a.range,selectionRange:o.range,children:s.elements.flatMap(i=>this.getElementsSymbol(i))}]}getElementSymbol(i){let a=i.$cstNode,o=findNodeForProperty$1(a,`name`);if(!o||!a)return[];let s=i.name,c=i.kind.$refText;return[{kind:this.symbolKind(i),name:s,range:a.range,selectionRange:o.range,detail:c,children:i.body?.elements.flatMap(i=>this.getElementsSymbol(i))??[]}]}getModelViewsSymbol(i){let a=i.$cstNode,o=findNodeForProperty$1(a,`name`);return!o||!a?[]:[{kind:this.symbolKind(i),name:i.name,range:a.range,selectionRange:o.range,children:i.views.flatMap(i=>this.getViewSymbol(i))}]}getKindSymbol(i){return!i.$cstNode||!i.kind.$cstNode||e$7(i.kind.name)?null:{kind:this.symbolKind(i),name:i.kind.name,range:i.$cstNode.range,selectionRange:i.kind.$cstNode.range}}getTagSymbol(i){return!i.$cstNode||!i.tag.$cstNode||e$7(i.tag.name)?null:{kind:this.symbolKind(i),name:`#`+i.tag.name,range:i.$cstNode.range,selectionRange:i.tag.$cstNode.range}}getLibIconSymbol(i){return!i.$cstNode||e$7(i.name)?null:{kind:this.symbolKind(i),name:i.name,range:i.$cstNode.range,selectionRange:i.$cstNode.range}}getViewSymbol(i){let a=i?.$cstNode;if(!a)return[];let o=i.name?findNodeForProperty$1(a,`name`):null;return o?[{kind:this.symbolKind(i),name:o.text,range:a.range,selectionRange:o.range,children:[]}]:[]}getDeploymentElementSymbol(i){try{if(isDeploymentNode$1(i))return this.getDeploymentNodeSymbol(i);if(isDeployedInstance(i))return this.getDeployedInstanceSymbol(i);if(isExtendDeployment(i))return[]}catch(i){logWarnError(i)}return[]}getDeploymentNodeSymbol(i){let a=i.$cstNode,o=this.nameProvider.getNameNode(i);if(!o||!a)return[];let s=this.nameProvider.getNameStrict(i),c=i.kind.$refText;return[{kind:this.symbolKind(i),name:s,range:a.range,selectionRange:o.range,detail:c,children:i.body?.elements.flatMap(i=>this.getDeploymentElementSymbol(i))??[]}]}getDeployedInstanceSymbol(i){let a=i.$cstNode,o=this.nameProvider.getNameNode(i);if(!o||!a)return[];let s=getDocument$6(i),c=this.parser.forDocument(s).parseDeployedInstance(i),l=this.nameProvider.getNameStrict(i),d=`instance of `+c.element.model;return[{kind:this.symbolKind(i),name:l,range:a.range,selectionRange:o.range,detail:d,children:[]}]}symbolKind(i){return this.nodeKindProvider.getSymbolKind(i)}};const HR=`
46
+ ---
47
+ `;var LikeC4HoverProvider=class extends AstNodeHoverProvider{parser;locator;constructor(i){super(i),this.services=i,this.parser=i.likec4.ModelParser,this.locator=i.likec4.ModelLocator}getAstNodeHoverContent(i){if(isTag(i))return{contents:{kind:`markdown`,value:"tag `"+i.name+"`"}};if(isElementKind(i))return{contents:{kind:`markdown`,value:"element kind `"+i.name+"`"}};if(isDeploymentNodeKind(i))return{contents:{kind:`markdown`,value:"deployment node `"+i.name+"`"}};if(isRelationshipKind(i))return{contents:{kind:`markdown`,value:"relationship kind `"+i.name+"`"}};try{if(isElement(i))return this.getElementHover(i);if(isDeploymentNode$1(i))return this.getDeploymentNodeHover(i);if(isDeployedInstance(i))return this.getDeployedInstanceHover(i)}catch(i){logger$16.debug(loggable(i))}}getElementHover(i){let a=this.locator.getParsedElement(i);if(!a)return;let o=a.element,s=[`<sup>\`${o.id}\`</sup> `,`### ${o.title} `],c=preferSummary(o);c&&s.push(``,(c.md??c.txt).split(`
48
+ `).join(`
49
+ `));let l=this.services.likec4.LastSeen.model(a.projectId)?.findElement(o.id),d=l&&this.getElementModelHover(l,a.projectId);return s.push(d||`
50
+ <small>_Model not processed yet, open any view to trigger_</small> `),{contents:{kind:`markdown`,value:s.join(`
51
+ `)}}}getElementModelHover(i,a){let o=[],s=[...i.incoming(`direct`)].length,c=[...i.outgoing(`direct`)].length;(s>0||c>0)&&o.push(HR,`<small>**${s}** incoming, **${c}** outgoing relationships</small> `);let d=i=>{let o=[i.id,a],s=URI.parse(`command:likec4.open-preview?${encodeURIComponent(JSON.stringify(o))}`);return` - [${i.titleOrId}](${s})`},f=[...i.scopedViews()].map(d);f.length>0&&o.push(HR,`<small>Element views:</small>`,...f);let p=[...i.views()].map(a=>a.isScopedElementView()&&a.viewOf===i?null:d(a)).filter(e$1);if(p.length>0){let i=f.length>0?`Also appears in views:`:`Appears in views:`;o.push(f.length>0?``:HR,`<small>${i}</small>`,...p,` `)}return o.length>0?o.join(`
52
+ `):void 0}getDeploymentNodeHover(i){let a=getDocument$6(i),o=this.parser.forDocument(a).parseDeploymentNode(i),s=[o.id+` `];o.title!==i.name&&s.push(`### ${o.title}`),s.push("deployment node `"+o.kind+"` ");let c=preferSummary(o);return c&&s.push(``,c.md??c.txt),{contents:{kind:`markdown`,value:s.join(`
53
+ `)}}}getDeployedInstanceHover(i){let a=getDocument$6(i),o=this.parser.forDocument(a).parseDeployedInstance(i),[s,c]=FqnRef.isImportRef(o.element)?[o.element.project,o.element.model]:[a.likec4ProjectId,o.element.model],l=s?this.locator.getParsedElement(c,s):this.locator.getParsedElement(c),d=[o.id+` `,`instance of \`${FqnRef.flatten(o.element)}\``];return l&&d.push(`### ${l.element.title}`,"element kind `"+l.element.kind+"` "),{contents:{kind:`markdown`,value:d.join(`
54
+ `)}}}},import_main$1=require_main$1(),LikeC4CodeActionProvider=class{getCodeActions(i,a){let o=a.context.diagnostics,s=[];for(let c of o)c.code===`manual-layout-v1`&&s.push({title:`Migrate Manual Layouts`,command:import_main$1.Command.create(`Migrate Manual Layouts`,`likec4.migrate-manual-layouts`),edit:{changes:{[i.textDocument.uri]:[import_main$1.TextEdit.insert(a.range.start,``)]}},kind:`quickfix`,isPreferred:!0,diagnostics:[c]});return s.length>0?s:void 0}};init_main();const logger$6=logger$16.getChild(`SemanticTokenProvider`),SemanticTypes={...SemanticTokenTypes},SemanticModifiers={...SemanticTokenModifiers};function createSemanticTypeMethods(i){let a=[],o=new Proxy({},{get(s,c){if(c===`modifier`)return i=>(a.push(i),o);if(c in SemanticModifiers)return a.push(SemanticModifiers[c]),o;if(c in SemanticTypes)return()=>i(SemanticTypes[c],a);throw Error(`Unknown semantic token type or modifier: ${c}`)}});return o}const PRUNE=`Stop Highlighting`,stopHighlight=()=>{throw PRUNE};var LikeC4SemanticTokenProvider=class extends AbstractSemanticTokenProvider{rules=[];constructor(i){super(i),this.services=i,this.initRules()}initRules(){this.rules=[];let i=(i,a)=>{let o={predicate:i,highlightFn:a};this.rules.push(o)};i(isRelationshipKind,i=>{i.property(`name`).function()}),i(isAnyOf$1(isRelation,isOutgoingRelationExpr,isDeploymentRelation),i=>{i.property(`kind`).function()}),i(isLibIcon,i=>{i.property(`name`).definition.function(),stopHighlight()}),i(isAnyOf$1(isNavigateToProperty,isRelationNavigateToProperty),i=>{i.property(`value`).readonly.definition.interface(),stopHighlight()}),i(isWildcardExpression,i=>{i.cst().readonly.definition.variable(),stopHighlight()}),i(isFqnRefExpr,i=>{i.node.selector&&(i.node.ref.parent?i.property(`selector`).property():i.property(`selector`).readonly.definition.variable())}),i(isTagRef,i=>{i.cst().type(),stopHighlight()}),i(isRelationKindDotRef,i=>{i.cst().function(),stopHighlight()}),i(isWhereRelationKind,i=>{e$4(i.node.value)&&i.property(`value`).function()}),i(isAnyOf$1(isWhereElement,isWhereRelation),i=>{e$4(i.node.value)&&i.property(`value`).readonly.definition.type()}),i(isAnyOf$1(isWhereRelationParticipantKind,isWhereRelationParticipantTag),i=>{i.property(`participant`).keyword()}),i(isElementKindExpression,i=>{e$4(i.node.kind)&&i.property(`kind`).definition.type()}),i(isAnyOf$1(isGlobalStyleGroup,isGlobalStyle),i=>{i.property(`id`).readonly.definition.variable()}),i(isViewRuleGlobalStyle,i=>{i.property(`style`).readonly.definition.variable()}),i(isAnyOf$1(isGlobalPredicateGroup,isGlobalDynamicPredicateGroup),i=>{i.property(`name`).readonly.definition.variable()}),i(isViewRuleGlobalPredicateRef,i=>{i.property(`predicate`).readonly.definition.variable()}),i(isElementTagExpression,i=>{e$4(i.node.tag)&&i.property(`tag`).definition.type()}),i(isAnyOf$1(isFqnRef,isStrictFqnRef),i=>{if(i.node.parent){i.property(`value`).property();return}let a=i.node.$cstNode?.text;a!==`this`&&a!==`it`&&i.property(`value`).readonly.definition.variable(),stopHighlight()}),i(isStrictFqnElementRef,i=>{i.node.parent?i.property(`el`).property():(i.property(`el`).readonly.definition.variable(),stopHighlight())}),i(isSpecificationColor,i=>{i.keyword(`color`).keyword(),i.property(`name`).readonly.declaration.type()}),i(isSpecificationTag,i=>{e$4(i.node.color)&&i.keyword(`color`).property()}),i(isAnyOf$1(isSpecificationElementKind,isSpecificationRelationshipKind,isSpecificationDeploymentNodeKind),i=>{i.property(`kind`).readonly.declaration.type()}),i(isTag,i=>{i.property(`name`).definition.type()}),i(isOpacityProperty,i=>{i.property(`value`).number()}),i(isIconProperty,i=>{if(i.node.libicon||i.node.value===`none`){i.property(i.node.libicon?`libicon`:`value`).defaultLibrary.enum();return}i.property(`value`).string()}),i(isLinkProperty,i=>{e$4(i.node.value)&&i.property(`value`).string()}),i(isColorProperty,i=>{e$4(i.node.customColor)&&i.property(`customColor`).enum(),e$4(i.node.themeColor)&&i.property(`themeColor`).enum()}),i(isIconColorProperty,i=>{e$4(i.node.customColor)&&i.property(`customColor`).enum(),e$4(i.node.themeColor)&&i.property(`themeColor`).enum()}),i(isAnyOf$1(isShapeProperty,isArrowProperty,isLineProperty,isBorderProperty,isSizeProperty,isIconPositionProperty,isDynamicViewDisplayVariantProperty),i=>{e$4(i.node.value)&&i.property(`value`).enum()})}async semanticHighlight(i,a,o=import_main$1.CancellationToken.None){return i.state<DocumentState.Linked&&await this.ensureState(i,o),await super.semanticHighlight(i,a,o)}async semanticHighlightRange(i,a,o=import_main$1.CancellationToken.None){return i.state<DocumentState.Linked&&await this.ensureState(i,o),await super.semanticHighlightRange(i,a,o)}async semanticHighlightDelta(i,a,o=import_main$1.CancellationToken.None){return i.state<DocumentState.Linked&&await this.ensureState(i,o),await super.semanticHighlightDelta(i,a,o)}async ensureState(i,a){i.state<DocumentState.Linked&&(logger$6.debug`waiting for document ${i.uri.path} to be ${`Linked`}`,await this.services.shared.workspace.DocumentBuilder.waitUntil(DocumentState.Linked,i.uri,a),logger$6.debug`document ${i.uri.path} is ${`Linked`}`)}highlightElement(i,a){if(isAnyOf$1(isElement,isDeploymentNode$1,isDeployedInstance)(i))return this.highlightNameAndKind(i);if(isLikeC4View(i))return this.highlightView(i);isAnyProperty(i)&&!isAnyOf$1(isMetadataProperty,isElementStyleProperty,isRelationStyleProperty)(i)&&e$4(i.key)&&a({node:i,property:`key`,type:SemanticTokenTypes.property});let o;for(let{predicate:a,highlightFn:s}of this.rules)if(a(i))try{o??=this.mark(i),s(o)}catch(a){if(a===PRUNE)return`prune`;logger$6.warn(`Error highlighting node of type ${i._type}`,{error:a})}}highlightNameAndKind(i){if(this.mark(i).property(`name`).declaration.readonly.variable(),isDeployedInstance(i)||this.mark(i).property(`kind`).keyword(),isElement(i)){i.props.length>0&&this.mark(i).property(`props`).string();return}i.title&&this.mark(i).property(`title`).string()}highlightView(i){i.name&&this.mark(i).property(`name`).modifier(`local`).declaration.readonly.interface()}mark(i){let a=a=>createSemanticTypeMethods((o,s)=>this.highlightToken({range:nonNullable$1(a??i.$cstNode,`AST node has no CST node`).range,type:o,modifier:s})),o=a=>createSemanticTypeMethods((o,s)=>this.highlightKeyword({node:i,keyword:a,type:o,modifier:s})),s=(a,o)=>createSemanticTypeMethods((s,c)=>this.highlightProperty({node:i,property:a,type:s,modifier:c,...o===void 0?{}:{index:o}}));return{node:i,cst:a,keyword:o,property:s}}};const isIndexableElement=isAnyOf$1(isElement,isExtendElement);var FqnIndex=class extends ADisposable{projects;langiumDocuments;documentCache;workspaceCache;logger=logger$16.getChild(`fqn-index`);constructor(i){super(),this.services=i,this.langiumDocuments=i.shared.workspace.LangiumDocuments,this.projects=i.shared.workspace.ProjectsManager,this.documentCache=new DefaultWeakMap(i=>this.createDocumentIndex(i)),this.workspaceCache=new WorkspaceCache(i.shared,DocumentState.IndexedContent),this.onDispose(i.shared.workspace.DocumentBuilder.onDocumentPhase(DocumentState.IndexedContent,i=>{isLikeC4LangiumDocument(i)&&isNotLikeC4Builtin(i)&&this.documentCache.delete(i)}))}documents(i){return this.langiumDocuments.projectDocuments(i).filter(i=>i.state>=DocumentState.IndexedContent)}get(i){return i.state<DocumentState.IndexedContent&&this.logger.warn(`document {doc} is in state {state}, expected at least IndexedContent ({expect}). This may lead to incorrect FQN resolution.`,{doc:UriUtils.basename(i.uri),state:i.state,expect:DocumentState.IndexedContent}),this.documentCache.get(i)}resolve(i){return i.$type===`Imported`?this.getFqn(i.imported.ref):i.$type===`Element`?this.getFqn(i):this.services.likec4.DeploymentsIndex.getFqn(i)}getFqn(i){invariant(isElement(i)||isDeploymentElement(i));let a=ElementOps.readId(i);if(e$4(a))return a;let o=getDocument$6(i);return o.state<DocumentState.IndexedContent&&this.logger.warn(`document {doc} is not yet indexed, creating on the fly to resolve FQN for element {el}`,{el:i.name??i.$type,doc:UriUtils.basename(o.uri)}),invariant(isLikeC4LangiumDocument(o)),this.get(o),nonNullable(ElementOps.readId(i),`Element fqn must be set, invalid state`)}byFqn(i,a){return stream(this.workspaceCache.get(`${i}:fqn:${a}`,()=>this.documents(i).flatMap(i=>this.get(i).byFqn(a)).toArray()))}rootElements(i){return stream(this.workspaceCache.get(`${i}:rootElements`,()=>{let a=new MultiMap;for(let o of this.documents(i))for(let i of this.get(o).rootElements())a.set(i.name,i);return uniqueByName(a)}))}directChildrenOf(i,a){return stream(this.workspaceCache.get(`${i}:directChildrenOf:${a}`,()=>{let o=new MultiMap;for(let s of this.documents(i))for(let i of this.get(s).children(a))o.set(i.name,i);return uniqueByName(o)}))}uniqueDescedants(i,a){return stream(this.workspaceCache.get(`${i}:uniqueDescedants:${a}`,()=>{let o=new MultiMap,s=new MultiMap;for(let c of this.documents(i)){let i=this.get(c);for(let s of i.children(a))o.set(s.name,s);for(let o of i.descendants(a))s.set(o.name,o)}let c=uniqueByName(o),l=[...s.associations()].flatMap(([i,a])=>a.length===1&&!o.has(i)?a:[]);return[...c,...sortNaturalByFqn(l)]}))}createDocumentIndex(i){let a=i.parseResult.value.models.flatMap(i=>i.elements.filter(isIndexableElement));if(a.length===0)return DocumentFqnIndex.EMPTY;let o=i.likec4ProjectId??this.projects.ownerProjectId(i),s=[],c=new MultiMap,l=new MultiMap,d=new MultiMap,f=this.services.workspace.AstNodeDescriptionProvider,h=(a,s,c)=>{let l=Object.assign(f.createDescription(a,s,i),{id:c,likec4ProjectId:o});return ElementOps.writeId(a,c),d.set(c,l),l};function g(i,a){let o=Fqn$1(i.name,a),d=h(i,i.name,o);a?c.set(a,d):s.push(d);let f=n$2(i.body?.elements??[],isIndexableElement);if(!t$4(f,1))return[d];let _=f.flatMap(i=>g(i,o));for(let i of _)l.set(o,i);return[d,..._]}function _(i){let a=readStrictFqn(i.element),o=t$3(i.body?.elements??[],n$2(isElement),t$7(i=>g(i,a)));if(o.length!==0)for(let i of[a,...ancestorsFqn$1(a)])for(let a of o)l.set(i,a)}for(let o of a)try{if(isExtendElement(o)){_(o);continue}g(o,null)}catch(a){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:o.$type,doc:UriUtils.basename(i.uri),error:a})}return new DocumentFqnIndex(s,c,l,d,o)}};function uniqueByName(i){return[...i.associations()].flatMap(([i,a])=>a.length===1?a:[]).sort((i,a)=>compareNatural(i.name,a.name))}var DocumentFqnIndex=class i{static EMPTY=new i([],new MultiMap,new MultiMap,new MultiMap,ProjectsManager.DefaultProjectId);constructor(i,a,o,s,c){this._rootElements=i,this._children=a,this._descendants=o,this._byfqn=s,this.projectId=c}rootElements(){return this._rootElements}byFqn(i){return this._byfqn.get(i)??[]}children(i){return this._children.get(i)??[]}descendants(i){return this._descendants.get(i)??[]}};const _isDeployment=isAnyOf(isDeploymentElement,isExtendDeployment);var DeploymentsIndex=class extends FqnIndex{Names;logger=logger$16.getChild(`deployments-index`);constructor(i){super(i),this.services=i,this.Names=i.references.NameProvider}createDocumentIndex(i){let a=i.parseResult.value.deployments.flatMap(i=>i.elements.filter(_isDeployment));if(a.length===0)return DocumentFqnIndex.EMPTY;let o=i.likec4ProjectId??this.projects.ownerProjectId(i),s=[],c=new MultiMap,l=new MultiMap,d=new MultiMap,f=this.Names,h=this.services.workspace.AstNodeDescriptionProvider,g=(a,s,c)=>{let l={...h.createDescription(a,s,i),id:c,likec4ProjectId:o};return ElementOps.writeId(a,c),d.set(c,l),l};function _(i,a){let o=f.getName(i);if(!e$4(o))return[];let d=Fqn(o,a),h=g(i,o,d);if(a?c.set(a,h):s.push(h),isDeployedInstance(i))return[h];let v=n$2(i.body?.elements??[],_isDeployment);if(!t$4(v,1))return[h];let y=v.flatMap(i=>_(i,d));for(let i of y)l.set(d,i);return[h,...y]}function v(i){let a=readStrictFqn(i.deploymentNode),o=t$3(i.body?.elements??[],n$2(_isDeployment),t$7(i=>_(i,a)));if(o.length!==0)for(let i of[a,...ancestorsFqn(a)])for(let a of o)l.set(i,a)}for(let o of a)try{if(isExtendDeployment(o)){v(o);continue}_(o,null)}catch(a){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:o.$type,doc:UriUtils.basename(i.uri),error:a})}return new DocumentFqnIndex(s,c,l,d,o)}},MergedSpecification=class{specs={elements:{},deployments:{},relationships:{},colors:{}};tags;globals={predicates:{},dynamicPredicates:{},styles:{}};imports=new MultiMap(Set);projectId;constructor(i){let a={},o=[];for(let s of i){let{c4Specification:i,c4Globals:c,c4Imports:d}=s,f=s.likec4ProjectId;e$1(f)&&(o.length===0||o[0]!==f)&&o.push(s.likec4ProjectId),Object.assign(a,i.tags),Object.assign(this.specs.elements,i.elements),Object.assign(this.specs.relationships,i.relationships),Object.assign(this.specs.colors,i.colors),Object.assign(this.specs.deployments,i.deployments),Object.assign(this.globals.predicates,c.predicates),Object.assign(this.globals.dynamicPredicates,c.dynamicPredicates),Object.assign(this.globals.styles,c.styles);for(let[i,a]of d)this.imports.set(i,a)}this.tags=assignTagColors(a),this.projectId=t$19(o)}toModelElement=({tags:i,links:a,style:o,id:s,kind:c,title:l,description:d,technology:f,summary:p,metadata:m})=>{try{let h=this.specs.elements[c];return h?(f??=h.technology,d??=h.description,p??=h.summary,a??=h.links,e$8(l)&&(l=h.title||nameFromFqn$1(s)),h.tags&&isNonEmptyArray$1(h.tags)&&(i=i?n$1([...h.tags,...i]):h.tags),exact$1({metadata:m&&!e$7(m)?m:void 0,notation:h.notation,style:exact$1({...h.style,...o}),links:a,tags:i,summary:p,technology:f,description:d,title:l,kind:c,id:s})):(logger$16.warn`No kind '${c}' found for ${s}`,null)}catch(i){logWarnError(i)}return null};toModelRelation=({astPath:i,source:a,target:o,kind:s,links:c,id:d,...f})=>e$1(s)&&this.specs.relationships[s]?{...this.specs.relationships[s],...f,...c&&{links:c},source:a,target:o,kind:s,id:d}:{...c&&{links:c},...f,source:a,target:o,id:d};toDeploymentElement=i=>{if(`element`in i&&!(`kind`in i))return{...i,element:FqnRef$1.flatten(i.element)};if(`element`in i)return logger$16.warn`Invalid ParsedAstDeployment ${i.id}, has both element and kind properties`,null;try{let a=this.specs.deployments[i.kind];if(!a)return logger$16.warn`No kind ${i.kind} found for ${i.id}`,null;let{id:o,style:s,title:c,...l}=i;return c=c===nameFromFqn$1(i.id)&&a.title?a.title:c,exact$1({...a,...l,title:c,style:exact$1({...a.style,...s}),id:o})}catch(i){logWarnError(i)}return null};toDeploymentRelation=({astPath:i,source:a,target:o,kind:s,links:c,id:d,...f})=>e$1(s)&&this.specs.relationships[s]?{...this.specs.relationships[s],...f,...c&&{links:c},source:a,target:o,kind:s,id:d}:{...c&&{links:c},...f,source:a,target:o,id:d}},LastSeenArtifacts=class{#e=new Map;#t=new Map;#n=new Map;constructor(i){i.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.#e.clear(),this.#t.clear(),this.#n.clear()})}rememberSpecification(i){return i.projectId&&this.#e.set(i.projectId,i),i}rememberModel(i){let a=i.projectId,o=i.$styles,s=this.#t.get(a);return(!s||!s.equals(o))&&this.#t.set(a,o),this.#n.set(a,i),i}specification(i){return this.#e.get(i)}styles(i){return this.#t.get(i)}model(i){return this.#n.get(i)}};function assignNavigateTo(i){let a=new Map;for(let o of i)if(isElementView(o)&&o.viewOf&&e$5(o.extends)){let i=a.get(o.viewOf)??[];i.push(o.id),a.set(o.viewOf,i)}for(let{id:o,nodes:s}of i)for(let i of s){let s=i.modelRef;if(i.navigateTo||!s)continue;let c=r$1(a.get(s)??[],i=>i!==o);c&&(i.navigateTo=c)}return i}const{getDocument:getDocument$5}=ast_utils_exports;function unpack({nodes:i,edges:a,autoLayout:o,...s}){return{...s,autoLayout:isAutoLayoutDirection(o)?{direction:o}:o,nodes:t$20(i,({b:i,c:a,...o})=>({x:i[0],y:i[1],width:i[2],height:i[3],isCompound:a,...o})),edges:t$20(a,({p:i,cp:a,l:o,...s})=>({...!!a&&{controlPoints:a},...!!o&&{labelBBox:o},...s,points:i}))}}function hasManualLayout(i){return i.includes(`@likec4-generated`)}function deserializeFromComment(i){if(!hasManualLayout(i))throw Error(`Not a likec4-generated comment: ${i}`);return unpack(decode(fromBase64(i.trim().split(`
55
+ `).filter(i=>!i.includes(`**`)&&!i.includes(`@likec4-`)&&!i.includes(`*/`)).map(i=>i.replaceAll(`*`,``).trim()).join(``))))}function parseViewManualLayout(i){let a=findCommentNode(i.$cstNode,[`BLOCK_COMMENT`]);if(!(!a||!hasManualLayout(a.text)))try{return deserializeFromComment(a.text)}catch(o){let s=getDocument$5(i);logWarnError(o),logger$16.warn(`Ignoring manual layout of "${i.name??`unnamed`}" at ${s.uri.fsPath}:${1+(a.range.start.line||0)}`);return}}var MergedExtends=class{mergedData=new Map;mergeMetadata(i,a){let o={...i};for(let[i,s]of Object.entries(a)){let a=o[i];if(a===void 0){o[i]=s;continue}let c=Array.isArray(a)?a:[a],l=Array.isArray(s)?s:[s],d=n$1([...c,...l]);o[i]=d.length===1?d[0]:d}return o}merge(i){for(let a of i){let{id:i,links:o,tags:s,metadata:c}=a,l=this.mergedData.get(i)??{links:[],tags:[],metadata:{}};o&&l.links.push(...o),s&&(l.tags=n$1([...l.tags,...s])),c&&(l.metadata=this.mergeMetadata(l.metadata,c)),this.mergedData.set(i,l)}}applyExtended(i){let a=this.mergedData.get(i.id);if(!a)return i;let o=a.links;i.links&&i.links.length>0&&(o=[...i.links,...o]);let s=a.tags;i.tags&&i.tags.length>0&&(s=n$1([...i.tags,...s]));let c=a.metadata;return i.metadata&&(c=this.mergeMetadata(i.metadata,a.metadata)),{...i,tags:t$4(s,1)?s:null,links:t$4(o,1)?o:null,...!e$7(c)&&{metadata:c}}}};function buildModelData(i,a,c){let l=new MergedSpecification(c);l.projectId===a.id&&i.likec4.LastSeen.rememberSpecification(l);let f=t$20(l.specs.colors,i=>computeColorValues(i.color)),h=new Set,g=new MergedExtends,v=new MergedExtends,y=c.flatMap(i=>i.c4ExtendRelations),b=new Set,x=i=>{i?.metadata&&t$21(i.metadata).forEach(i=>h.add(i))},C=t$3(c,t$7(i=>(g.merge(i.c4ExtendElements),t(i.c4Elements,l.toModelElement))),n$2(e$4),sortParentsFirst,t$22((i,a)=>{let o=parentFqn(a.id);return o&&e$5(i[o])?(logger$16.debug`No parent found for ${a.id}`,i):(i[a.id]=g.applyExtended(a),x(i[a.id]),i)},{})),w=t$3(c,t$7(i=>t(i.c4Relations,l.toModelRelation)),n$2(i=>{if(!i)return!1;let a=FqnRef$1.flatten(i.source),o=FqnRef$1.flatten(i.target);return e$5(C[a])&&!isGlobalFqn(a)||e$5(C[o])&&!isGlobalFqn(o)?(logger$16.debug`Invalid relation ${i.id}
56
+ source: ${a} resolved: ${!!C[a]}
57
+ target: ${o} resolved: ${!!C[o]}\n`,!1):!0}),t(i=>{let a=stringHash$1(`extend-relation`,FqnRef$1.flatten(i.source),FqnRef$1.flatten(i.target),i.kind??`default`,i.title??``),o=y.filter(i=>i.id===a);if(o.length===0)return i;o.forEach(i=>b.add(i.astPath));let s=i.tags?[...i.tags]:[],c=i.links?[...i.links]:[],l=i.metadata?{...i.metadata}:{};for(let i of o){if(i.tags&&s.push(...i.tags),i.links)for(let a of i.links)c.some(i=>i.url===a.url&&(i.title||``)===(a.title||``))||c.push(a);if(i.metadata)for(let[a,o]of Object.entries(i.metadata)){let i=l[a];if(i===void 0)l[a]=o;else{let s=Array.isArray(i)?i:[i],c=Array.isArray(o)?o:[o],d=n$1([...s,...c]);l[a]=d.length===1?d[0]:d}}}let d=n$1(s),f=c;return{...i,...t$4(d,1)&&{tags:d},...t$4(f,1)&&{links:f},...!e$7(l)&&{metadata:l}}}),t$13(x),t$6(e(`id`))),T=t$3(c,t$7(i=>(v.merge(i.c4ExtendDeployments),t(i.c4Deployments,l.toDeploymentElement))),n$2(e$4),sortParentsFirst,t$22((i,a)=>{let o=parentFqn(a.id);return o&&e$5(i[o])?(logger$16.debug`No parent found for deployment element ${a.id}`,i):(i[a.id]=isDeploymentNode(a)?v.applyExtended(a):a,x(i[a.id]),i)},{})),E=t$3(c,t$7(i=>t(i.c4DeploymentRelations,l.toDeploymentRelation)),n$2(i=>i?e$5(T[i.source.deployment])||e$5(T[i.target.deployment])?(logger$16.debug`Invalid deployment relation ${i.id}
58
+ source: ${i.source.deployment} resolved: ${!!T[i.source.deployment]}
59
+ target: ${i.target.deployment} resolved: ${!!T[i.target.deployment]}\n`,!1):!0:!1),t$22((i,a)=>e$3(i[a.id])?(logger$16.debug`Duplicate deployment relation ${a.id}`,i):(x(a),i[a.id]=a,i),{}));function D(i){let o=i.uri.toString();return i=>{let{id:s,title:c,description:l,astPath:f,...p}=i;return i[_type$1]===`element`&&e$5(c)&&`viewOf`in i&&(c=C[i.viewOf]?.title??null),e$5(c)&&s===`index`&&(c=`Landscape view`),{...t$23(p,i=>i===void 0),[_stage$1]:`parsed`,sourcePath:UriUtils.relative(a.folderUri,o),docUri:o,description:l,title:c,id:s}}}let O=c.flatMap(i=>t(i.c4Views,D(i)));O.some(i=>i.id===`index`)||O.unshift({[_stage$1]:`parsed`,[_type$1]:`element`,id:`index`,title:`Landscape view`,description:null,rules:[{include:[{wildcard:!0}]}]});let k=t$3(O,t$6(e(`id`)));O.some(isExtendsElementView)&&(k=resolveRulesExtendedViews(k));for(let i of y)b.has(i.astPath)||logger$16.warn(`Relation extend at ${i.astPath} does not match any relation in the model`);return{data:{[_stage$1]:`parsed`,projectId:a.id,project:exact$1({id:a.id,title:a.config.title??a.config.name,styles:a.config.styles,manualLayouts:a.config.manualLayouts}),specification:{tags:l.tags,elements:l.specs.elements,relationships:t$20(l.specs.relationships,({notation:i,technology:a,...o})=>({...i&&{notation:i},...a&&{technology:a},style:o})),deployments:l.specs.deployments,...h.size>0&&{metadataKeys:[...h].sort(compareNatural)},customColors:f},elements:C,relations:w,globals:l.globals,views:k,deployments:{elements:T,relations:E},imports:{}},imports:l.imports}}const parsedWithoutImportsCacheKey=i=>`parsed-without-imports-${i}`,parsedModelCacheKey=i=>`parsed-model-${i}`,computedModelCacheKey=i=>`computed-model-${i}`,builderLogger=logger$16.getChild(`builder`);var DefaultLikeC4ModelBuilder=class extends ADisposable{projects;parser;listeners=[];cache;DocumentBuilder;manualLayouts;mutex;lastSeen;constructor(i){super(),this.services=i,this.projects=i.shared.workspace.ProjectsManager,this.parser=i.likec4.ModelParser,this.cache=i.shared.workspace.Cache,this.DocumentBuilder=i.shared.workspace.DocumentBuilder,this.mutex=i.shared.workspace.WorkspaceLock,this.manualLayouts=i.shared.workspace.ManualLayouts,this.lastSeen=i.likec4.LastSeen,this.onDispose(this.DocumentBuilder.onUpdate((i,a)=>{a.length>0&&this.notifyListeners(a)}),i.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.clearCache()}));let a=t$24(e$2(),n$2(i=>isNotLikeC4Builtin(i)&&!this.projects.isExcluded(i)),t(i=>i.uri));this.onDispose(this.DocumentBuilder.onBuildPhase(DocumentState.Validated,(i,o)=>{let s=a(i);s.length>0&&this.notifyListeners(s)})),builderLogger.debug`created`}unsafeSyncParseModelData(i){let a=this.cache,o=parsedWithoutImportsCacheKey(i);return a.get(o,()=>{let a=builderLogger.getChild(i);try{let o=this.projects.getProject(i),s=this.documents(i);return s.length===0?(a.debug`unsafeSyncParseModelData: skipped due to no documents`,null):(a.debug`unsafeSyncParseModelData: completed`,buildModelData(this.services,o,s))}catch(a){return builderLogger.warn(`unsafeSyncParseModelData failed for project ${i}`,{err:a}),null}})}unsafeSyncJoinedModelData(i){let a=builderLogger.getChild(i),o=this.unsafeSyncParseModelData(i);if(!o)return null;if(o.imports.size===0)return o.data;a.debug`processing imports of ${i}`;let s=[...o.imports.associations()].reduce((i,[a,o])=>{if(o.size===0)return i;let s=this.unsafeSyncParseModelData(a);if(s){let c=[...o].flatMap(i=>s.data.elements[i]??[]);t$4(c,1)&&(i[a]=structuredClone(c))}return i},{});return{...o.data,imports:s}}async parseModel(i,a){i=this.projects.ensureProjectId(i);let o=builderLogger.getChild(i),s=this.cache,c=performanceMark();return await this.mutex.read(async()=>{a?.isCancellationRequested&&await interruptAndCheck(a);let l=parsedModelCacheKey(i);return s.has(l)&&o.debug`parseModel from cache`,s.get(l,()=>{let a=this.unsafeSyncJoinedModelData(i);return a?(o.debug`parseModel in ${c.pretty}`,LikeC4Model.create(a)):(o.debug`parseModel: returning EMPTY`,LikeC4Model.EMPTY.asParsed)})})}previousViews={};unsafeSyncComputeModel(i,a){let o=this.cache,s=computedModelCacheKey(i)+(a?.hash??``);return o.get(s,()=>{let o=builderLogger.getChild(i),s=this.unsafeSyncJoinedModelData(i);if(!s)return o.debug`unsafeSyncComputeModel: returning EMPTY`,LikeC4Model.EMPTY.asComputed;let c=LikeC4Model.create(s),l=[];for(let i of t$12(s.views)){let s=computeView(i,c);if(!s.isSuccess){o.warn(loggable(s.error));continue}a?.views[i.id]&&Object.assign(s.view,{hasManualLayout:!0}),l.push(s.view)}assignNavigateTo(l);let d=t$25(l,a=>{let o=computedViewKey(i,a.id),s=this.previousViews[o],c=s&&deepEqual(a,s)?s:a;return this.previousViews[o]=c,[a.id,c]}),f={...s,manualLayouts:{...a?.views},[_stage]:`computed`,views:d};return o.debug(`unsafeSyncComputeModel${a?` with manual layouts`:``}: completed`),this.lastSeen.rememberModel(LikeC4Model.create(f))})}async computeModel(i,a){i=this.projects.ensureProjectId(i);let o=builderLogger.getChild(i),s=performanceMark();return await this.mutex.read(async()=>{a?.isCancellationRequested&&await interruptAndCheck(a);let c=this.projects.getProject(i),l=await this.manualLayouts.read(c),d=this.unsafeSyncComputeModel(i,l);return d===LikeC4Model.EMPTY?o.debug(`computeModel returned EMPTY`):s.ms>10&&o.debug(`computeModel completed in ${s.pretty}`),d})}onModelParsed(i){return this.listeners.push(i),Disposable.create(()=>{let a=this.listeners.indexOf(i);a>=0&&this.listeners.splice(a,1)})}clearCache(){builderLogger.debug(`clearCache`),this.cache.clear(),this.previousViews={}}documents(i){return this.parser.documents(i).toArray()}notifyListeners(i){for(let a of this.listeners)try{a(i)}catch(i){builderLogger.warn(loggable(i))}}};function computedViewKey(i,a){return`computed-view-${i}-${a}`}const{findNodeForKeyword:findNodeForKeyword$2,findNodeForProperty}=grammar_utils_exports,{getDocument:getDocument$4,streamAllContents}=ast_utils_exports,logger$5=logger$16.getChild(`locator`);var LikeC4ModelLocator=class{fqnIndex;deploymentsIndex;langiumDocuments;parser;projects;constructor(i){this.services=i,this.fqnIndex=i.likec4.FqnIndex,this.deploymentsIndex=i.likec4.DeploymentsIndex,this.langiumDocuments=i.shared.workspace.LangiumDocuments,this.parser=i.likec4.ModelParser,this.projects=i.shared.workspace.ProjectsManager}documents(i){return this.parser.documents(i)}getParsedElement(...i){try{let a,o;if(i.length===2?(a=i[0],o=i[1]):(a=i[0],o=e$9(a)?this.projects.ensureProjectId():projectIdFrom(a)),e$9(a)){let i=a,s=this.fqnIndex.byFqn(o,i).head();if(!s)return null;let c=this.langiumDocuments.getDocument(s.documentUri),l=this.findParsedElementByFqnIn(i,c);return l&&c?{projectId:o,element:l,document:c}:null}let s=this.fqnIndex.getFqn(a),l=getDocument$4(a),d=this.findParsedElementByFqnIn(s,l);return d&&l?{projectId:o,element:d,document:l}:null}catch(i){return logger$5.debug(loggable(i)),null}}findParsedElementByFqnIn(i,a){if(a)return this.parser.parse(a).c4Elements.find(a=>a.id===i)}locateElement(i,a){let[o,s]=splitGlobalFqn(i);o??=this.projects.ensureProjectId(a);let c=this.fqnIndex.byFqn(o,s).head(),l=c?.nameSegment??c?.selectionSegment;return!c||!l?null:{uri:c.documentUri.toString(),range:l.range}}locateDeploymentElement(i,a){let o=this.projects.ensureProjectId(a),s=i,c=this.deploymentsIndex.byFqn(o,s).head(),l=c?.nameSegment??c?.selectionSegment;return!c||!l?null:{uri:c.documentUri.toString(),range:l.range}}locateRelation(i,a){let o=this.projects.ensureProjectId(a);for(let a of this.documents(o)){let o=a.c4Relations.find(a=>a.id===i)??a.c4DeploymentRelations.find(a=>a.id===i);if(!o)continue;let s=this.services.workspace.AstNodeLocator.getAstNode(a.parseResult.value,o.astPath);if(!isRelation(s)&&!isDeploymentRelation(s))continue;let c=s.kind?findNodeForProperty(s.$cstNode,`kind`):void 0;if(c??=s.dotKind?findNodeForProperty(s.$cstNode,`dotKind`):void 0,c??=findNodeForKeyword$2(s.$cstNode,`->`),c??=findNodeForProperty(s.$cstNode,`title`),c??=findNodeForProperty(s.$cstNode,`target`),c??=s.$cstNode,c)return{uri:a.uri.toString(),range:{start:c.range.start,end:c.range.start}}}return null}locateViewAst(i,a){let o=this.projects.ensureProjectId(a);for(let a of this.documents(o)){let o=a.c4Views.find(a=>a.id===i);if(!o)continue;let s=this.services.workspace.AstNodeLocator.getAstNode(a.parseResult.value,o.astPath);if(isLikeC4View(s))return{doc:a,view:o,viewAst:s}}return null}locateView(i,a){let o=this.locateViewAst(i,a);if(!o)return null;let s=o.viewAst,c=s.name?findNodeForProperty(s.$cstNode,`name`):void 0;return c??=findNodeForKeyword$2(s.$cstNode,`view`),c??=s.$cstNode,c?{uri:o.doc.uri.toString(),range:{start:c.range.start,end:c.range.start}}:null}async locateDocumentTags(i,a){let o=this.langiumDocuments.getDocument(i);if(!o||!o.likec4ProjectId)return null;o.state<DocumentState.Linked&&(logger$5.debug(`Waiting for document ${o.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(DocumentState.Linked,o.uri,a));let s=projectIdFrom(o);logger$5.trace`locate document tags for ${o.uri.fsPath} in project ${s}`;try{let i=this.services.likec4.LastSeen.specification(s)?.tags,a=this.services.likec4.LastSeen.styles(s)??LikeC4Styles$1.DEFAULT;if(!i)return logger$5.trace(`No specification or styles found for project ${s}, cannot locate tags for document ${o.uri.fsPath}`),null;let c=t$3(streamAllContents(o.parseResult.value),ifilter(i=>isTag(i)||isTagRef(i)),toArray(),t$7(o=>{let s,c;try{isTag(o)?(s=o.name,c=o.$cstNode):(s=o.tag.$refText,c=o.tag.$refNode);let l=i[s];return invariant$1(l,`Tag ${s} not found in merged specification`),invariant$1(c,`Tag ${s} does not have a $cstNode`),{name:s,color:a.tagColor(l.color).fill,range:c.range,isSpecification:isTag(o)}}catch(i){return logger$5.warn(`Fail on tag ${s}`,{err:i}),[]}}));return logger$5.debug(`Found ${c.length} tags in document ${o.uri.path}`),c}catch(i){return logger$5.warn(loggable(i)),null}}locateDynamicViewStep(i){let{doc:a,viewAst:o}=this.locateViewAst(i.view,i.projectId)??{};if(!a||!o)return null;if(!isDynamicView$1(o)||!o.body)return logger$5.warn(`View ${i.view} is not a dynamic view`),null;let s=this.services.workspace.AstNodeLocator.getAstNodePath(o.body)+i.astPath,c=this.services.workspace.AstNodeLocator.getAstNode(a.parseResult.value,s);if(!c||!isDynamicViewStep(c))return logger$5.warn(`Failed to locate dynamic view step ${s} in view ${i.view}`),null;let l=c.kind?findNodeForProperty(c.$cstNode,`kind`):void 0;return l??=c.dotKind?findNodeForProperty(c.$cstNode,`dotKind`):void 0,l??=findNodeForKeyword$2(c.$cstNode,`->`),l??=findNodeForKeyword$2(c.$cstNode,`<-`),l??=findNodeForProperty(c.$cstNode,`title`),l??=findNodeForProperty(c.$cstNode,`target`),l??=c.$cstNode,l?{uri:a.uri.toString(),range:{start:l.range.start,end:l.range.start}}:null}};const RESERVED_WORDS=[`this`,`it`,`self`,`super`,`likec4lib`,`global`];function tryOrLog(i){return async function a(o,s,c){try{let a=i(o,s,c);e$10(a)&&await a;return}catch(i){let a=i instanceof Error?i.message:String(i);s(`error`,`Validation failed: ${a}`,{node:o}),logger$16.debug(`Validation failed: ${a}`,{error:i})}}}const{getDocument:getDocument$3}=ast_utils_exports,deploymentNodeChecks=i=>{let a=i.likec4.DeploymentsIndex,o=i.references.NameProvider;return tryOrLog((i,s)=>{let c=o.getName(i);if(!c){s(`error`,`DeploymentNode must be named`,{node:i});return}let l=nonNullable(o.getNameNode(i),`name CstNode not found`).range;RESERVED_WORDS.includes(c)&&s(`error`,`Reserved word: ${c}`,{node:i,range:l});let d=projectIdFrom(i),f=a.getFqn(i);a.byFqn(d,f).limit(2).toArray().length>1&&s(`error`,`Duplicate node name "${f}"`,{node:i,range:l})})},deployedInstanceChecks=i=>{let a=i.likec4.DeploymentsIndex,o=i.references.NameProvider;return tryOrLog((i,s)=>{let c=o.getName(i);if(!c){s(`error`,`Deployed instance must be named, unique inside node`,{node:i});return}let l=nonNullable(o.getNameNode(i),`name CstNode not found`).range;RESERVED_WORDS.includes(c)&&s(`error`,`Reserved word: ${c}`,{node:i,range:l});let d=projectIdFrom(i),f=a.getFqn(i);a.byFqn(d,f).limit(2).toArray().length>1&&s(`error`,`Duplicate instance name "${f}"`,{node:i,range:l})})},deploymentRelationChecks=i=>{let a=i.likec4.ModelParser;return tryOrLog((i,o)=>{if(!i.target?.value?.ref){o(`error`,`DeploymentRelation target '${i.target?.$cstNode?.text??``}' not resolved`,{node:i,property:`target`});return}let s=getDocument$3(i),c=a.forDocument(s),l;try{l=c._resolveDeploymentRelationSource(i)}catch(a){logger$16.warn(loggable(a)),o(`error`,`DeploymentRelation source not resolved`,{node:i,property:`source`});return}if(FqnRef.isImportRef(l)){o(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:i,property:`source`});return}if(FqnRef.isModelRef(l)){o(`error`,`DeploymentRelation must refer deployment element`,{node:i,property:`source`});return}let d=c.parseFqnRef(i.target);if(FqnRef.isImportRef(d)){o(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:i,property:`target`});return}if(FqnRef.isModelRef(d)){o(`error`,`DeploymentRelation must refer deployment element`,{node:i,property:`target`});return}isSameHierarchy(l.deployment,d.deployment)&&o(`error`,`Invalid parent-child relationship`,{node:i})})},extendDeploymentChecks=i=>tryOrLog((i,a)=>{let o=i.deploymentNode.value.ref;(!o||!isDeploymentNode$1(o))&&a(`error`,`ExtendDeployment allows only DeploymentNode`,{node:i,property:`deploymentNode`})}),dynamicViewStepSingle=i=>{let a=i.likec4.FqnIndex;return tryOrLog((i,o)=>{let s=elementRef(i.source),c=s&&a.getFqn(s);c||o(`error`,`Source not found (not parsed/indexed yet)`,{node:i,property:`source`});let l=elementRef(i.target),d=l&&a.getFqn(l);d||o(`error`,`Target not found (not parsed/indexed yet)`,{node:i,property:`target`}),c&&d&&(isAncestor(c,d)||isAncestor(d,c))&&o(`error`,`Invalid parent-child relationship`,{node:i})})},dynamicViewStepChain=i=>{let a=i.likec4.FqnIndex;return tryOrLog((i,o)=>{let s=i.source;isDynamicStepSingle(s)&&s.isBackward&&o(`error`,`Invalid chain after backward step`,{node:i});let c=elementRef(i.target);c&&a.getFqn(c)||o(`error`,`Target not found (not parsed/indexed yet)`,{node:i,property:`target`})})},dynamicViewDisplayVariant=i=>tryOrLog((i,a)=>{if(e$7(i.value)||i.value!==`diagram`&&i.value!==`sequence`){a(`error`,`Invalid display variant: "diagram" or "sequence" are allowed`,{node:i,property:`value`});return}hasContainerOfType(i,isDynamicViewBody)||a(`error`,`Display mode can be defined only inside dynamic view`,{node:i})}),{getDocument:getDocument$2}=ast_utils_exports,checkElement=i=>{let a=i.likec4.FqnIndex,o=i.workspace.AstNodeLocator;return tryOrLog((i,s)=>{let c=a.getFqn(i);if(!c){s(`error`,`Not indexed element`,{node:i,property:`name`});return}RESERVED_WORDS.includes(i.name)&&s(`error`,`Reserved word: ${i.name}`,{node:i,property:`name`});let l=getDocument$2(i),d=l.uri,f=o.getAstNodePath(i),p=a.byFqn(projectIdFrom(l),c).filter(i=>i.documentUri!==d||i.path!==f).head();if(p){let a=p.documentUri!==d;s(`error`,`Duplicate element name ${i.name===c?i.name:i.name+` (`+c+`)`}`,{node:i,property:`name`,...a&&{relatedInformation:[{location:{range:p.nameSegment?.range??p.selectionSegment?.range,uri:p.documentUri.toString()},message:`conflicting element`}]}})}})},checkElementRef=i=>tryOrLog((i,a)=>{isReferenceToDeploymentModel(i.modelElement)&&a(`error`,`Only model elements allowed here`,{node:i,property:`modelElement`})}),{getDocument:getDocument$1}=ast_utils_exports,checkImportsFromPoject=i=>{let a=i.shared.workspace.ProjectsManager;return tryOrLog((i,o)=>{if(!a.all.includes(i.project)){o(`error`,`Imported project not found`,{node:i,property:`project`});return}let s=projectIdFrom(getDocument$1(i));if(i.project===s){o(`error`,`Imported project cannot be the same as the current project`,{node:i,property:`project`});return}})},opacityPropertyRuleChecks=i=>tryOrLog((i,a)=>{let o=parseFloat(i.value);(isNaN(o)||o<0||o>100)&&a(`warning`,`Value ignored, must be between 0% and 100%`,{node:i,property:`value`})}),iconPropertyRuleChecks=i=>(i,a)=>{let o=i.$container;o.props.some(a=>isIconProperty(a)&&a!==i)&&a(`error`,`Icon must be defined once`,{node:i}),isElementStyleProperty(o)&&isElementBody(o.$container)&&o.$container.props.some(i=>isIconProperty(i))&&a(`warning`,`Redundant as icon defined on element`,{node:i}),i.value?.startsWith(`file://`)&&a(`error`,`Icon URI must not start with file://`,{node:i,property:`value`})},colorLiteralRuleChecks=i=>(i,a)=>{if(i.$type===`HexColor`){if(i.hex===void 0||e$9(i.hex)&&!i.hex.match(/^[a-fA-F0-9]+$/)){a(`error`,`Invalid HEX`,{node:i,property:`hex`});return}let o=e$6(i.hex)?i.hex.toString().length:i.hex.length;o!==6&&o!==3&&o!==8&&a(`error`,`Invalid value "${i.$cstNode?.text}", must be 3, 6 or 8 characters long`,{node:i,property:`hex`});return}if(i.$type===`RGBAColor`){if((!e$6(i.red)||i.red<0||i.red>255)&&a(`error`,`Invalid value, must be between 0 and 255`,{node:i,property:`red`}),(!e$6(i.green)||i.green<0||i.green>255)&&a(`error`,`Invalid value, must be between 0 and 255`,{node:i,property:`green`}),(!e$6(i.blue)||i.blue<0||i.blue>255)&&a(`error`,`Invalid value, must be between 0 and 255`,{node:i,property:`blue`}),e$6(i.alpha)&&(i.alpha<0||i.alpha>1)&&a(`error`,`Invalid value, must be between 0 and 1`,{node:i,property:`alpha`}),e$9(i.alpha)){let o=parseFloat(i.alpha);(o<0||o>100)&&a(`error`,`Invalid value, must be between 0% and 100%`,{node:i,property:`alpha`})}return}nonexhaustive(i)},relationChecks=i=>{let a=i.likec4.ModelParser;return tryOrLog((i,o)=>{let s=a.forDocument(getDocument$6(i)),c=safeCall(()=>s._resolveRelationSource(i));if(!c){o(`error`,`Source not resolved`,{node:i,property:`source`});return}let l=safeCall(()=>s.parseFqnRef(i.target));if(!l){o(`error`,`Target not resolved`,{node:i,property:`target`});return}FqnRef.isImportRef(c)&&(FqnRef.isImportRef(l)?o(`warning`,`Relationship between imported elements may not be visible in origin projects`,{node:i}):o(`warning`,`Relationship from imported element to local element may not be visible in origin project`,{node:i,property:`source`})),isSameHierarchy(FqnRef.flatten(c),FqnRef.flatten(l))&&o(`error`,`Invalid parent-child relationship`,{node:i})})},checkRelationBody=i=>tryOrLog((i,a)=>{i.$container.tags?.values&&i.tags?.values&&a(`error`,`Relation cannot have tags in both header and body`,{node:i.tags})}),extendRelationChecks=i=>{let a=i.likec4.ModelParser,o=new WorkspaceCache(i.shared,DocumentState.Linked),s=({source:i,target:a,kind:o,title:s})=>stringHash$1(`extend-relation`,FqnRef.flatten(i),FqnRef.flatten(a),o??`default`,s??``);function c(a){return o.get(a,()=>new Set(t$3(i.shared.workspace.LangiumDocuments.projectDocuments(a).toArray(),t$7(i=>i.c4Relations??[]),t(i=>s(i)))))}return tryOrLog((i,o)=>{let l=getDocument$6(i),d=a.forDocument(l),f=safeCall(()=>d.parseFqnRef(i.source));if(!f){o(`error`,`Source not resolved`,{node:i,property:`source`});return}let p=safeCall(()=>d.parseFqnRef(i.target));if(!p){o(`error`,`Target not resolved`,{node:i,property:`target`});return}if(!FqnRef.isModelRef(f)&&!FqnRef.isImportRef(f)){o(`error`,`Source must reference a model element`,{node:i,property:`source`});return}if(!FqnRef.isModelRef(p)&&!FqnRef.isImportRef(p)){o(`error`,`Target must reference a model element`,{node:i,property:`target`});return}let m=projectIdFrom(l),h=(i.kind??i.dotKind?.kind)?.ref?.name??`default`,{title:g=``}=d.parseBaseProps({},{title:i.title}),_=s({source:f,target:p,kind:h,title:g});c(m).has(_)||o(`warning`,`This extend does not match any relation (by source, kind, target, title)`,{node:i})})},checkSpecificationRule=i=>tryOrLog((i,a)=>{i.$containerIndex&&i.$containerIndex>0&&a(`warning`,`Prefer one specification per document`,{node:i,property:`name`})}),checkModel=i=>tryOrLog((i,a)=>{i.$containerIndex&&i.$containerIndex>0&&a(`warning`,`Prefer one model per document`,{node:i,property:`name`})}),checkGlobals=i=>tryOrLog((i,a)=>{i.$containerIndex&&i.$containerIndex>0&&a(`warning`,`Prefer one global block per document`,{node:i,property:`name`})}),checkElementKind=i=>{let a=i.shared.workspace.IndexManager;return tryOrLog((i,o)=>{RESERVED_WORDS.includes(i.name)&&o(`error`,`Reserved word: ${i.name}`,{node:i,property:`name`});let s=projectIdFrom(i),c=a.projectElements(s,ElementKind).filter(a=>a.name===i.name&&a.node!==i).head();if(c){let a=c.documentUri!==getDocument$6(i).uri;o(`error`,`Duplicate element kind '${i.name}'`,{node:i,property:`name`,...a&&{relatedInformation:[{location:{range:c.nameSegment.range,uri:c.documentUri.toString()},message:`conflicting definition`}]}})}})},checkDeploymentNodeKind=i=>{let a=i.shared.workspace.IndexManager;return tryOrLog((i,o)=>{RESERVED_WORDS.includes(i.name)&&o(`error`,`Reserved word: ${i.name}`,{node:i,property:`name`});let s=projectIdFrom(i),c=a.projectElements(s,DeploymentNodeKind).filter(a=>a.name===i.name&&a.node!==i).head();if(c){let a=c.documentUri!==getDocument$6(i).uri;o(`error`,`Duplicate deploymentNode kind '${i.name}'`,{node:i,property:`name`,...a&&{relatedInformation:[{location:{range:c.nameSegment.range,uri:c.documentUri.toString()},message:`conflicting definition`}]}})}})},checkTag=i=>{let a=i.shared.workspace.IndexManager;return tryOrLog((i,o)=>{let s=i.name,c=projectIdFrom(i),l=a.projectElements(c,`Tag`).filter(a=>a.name===s&&a.node!==i).head();if(l){let a=l.documentUri!==getDocument$6(i).uri;o(`error`,`Duplicate tag '${i.name}'`,{node:i,property:`name`,...a&&{relatedInformation:[{location:{range:l.nameSegment.range,uri:l.documentUri.toString()},message:`conflicting definition`}]}})}})},checkRelationshipKind=i=>{let a=i.shared.workspace.IndexManager;return tryOrLog((i,o)=>{RESERVED_WORDS.includes(i.name)&&o(`error`,`Reserved word: ${i.name}`,{node:i,property:`name`});let s=projectIdFrom(i);a.projectElements(s,RelationshipKind).filter(a=>a.name===i.name).limit(2).count()>1&&o(`error`,`Duplicate RelationshipKind '${i.name}'`,{node:i,property:`name`})})},checkGlobalPredicate=i=>{let a=i.shared.workspace.IndexManager;return tryOrLog((i,o)=>{let s=projectIdFrom(i),c=a.projectElements(s,GlobalPredicateGroup),l=a.projectElements(s,GlobalDynamicPredicateGroup);c.concat(l).filter(a=>a.name===i.name).limit(2).count()>1&&o(`error`,`Duplicate GlobalPredicateGroup or GlobalDynamicPredicateGroup name '${i.name}'`,{node:i,property:`name`})})},checkGlobalStyleId=i=>{let a=i.shared.workspace.IndexManager;return tryOrLog((i,o)=>{let s=projectIdFrom(i);a.projectElements(s,GlobalStyleId).filter(a=>a.name===i.name).limit(2).count()>1&&o(`error`,`Duplicate GlobalStyleId name '${i.name}'`,{node:i,property:`name`})})},viewChecks=i=>{let a=i.shared.workspace.IndexManager;return tryOrLog((i,o)=>{let s=findCommentNode(i.$cstNode,[`BLOCK_COMMENT`]);if(s&&hasManualLayout(s.text)&&o(`warning`,`Migrate to the new manual layout snapshots (run LikeC4: Migrate manual layouts)`,{node:i,range:s.range,code:`manual-layout-v1`}),!i.name)return;RESERVED_WORDS.includes(i.name)&&o(`error`,`Reserved word: ${i.name}`,{node:i,property:`name`});let c=projectIdFrom(i);a.projectElements(c,LikeC4View).filter(a=>a.name===i.name).limit(2).count()>1&&o(`error`,`Duplicate view '${i.name}'`,{node:i,property:`name`})})};function collectFqnExprs(i){let a=[],o=i;for(;o;)o.value&&a.push(o.value),o=o.prev;return a.reverse()}const viewRuleRankChecks=i=>tryOrLog((i,a)=>{let o=collectFqnExprs(i.targets);o.length<2&&i.value===`same`&&a(`warning`,`Rank rule should have at least 2 targets`,{node:i,property:`targets`});let s=o.filter(isFqnRefExpr),c=s[0]?.ref?.parent;for(let o=1;o<s.length;o++){let l=s[o];i.value===`same`&&!areSame(c,l?.ref?.parent)&&a(`error`,`All targets must have the same parent rank same`,{node:i,property:`targets`})}});function areSame(i,a){return!i&&!a?!0:!i||!a||i.value.ref!==a.value.ref?!1:areSame(i.parent,a.parent)}const checkFqnExprWith=i=>{let a=i.likec4.ModelParser;return tryOrLog((i,o)=>{let s=getViewRulePredicateContainer(i);if(s?.$type!==`DynamicViewIncludePredicate`&&s?.isInclude!==!0){o(`error`,`Invalid usage inside "exclude"`,{node:i});return}let c=s.$type===`DynamicViewIncludePredicate`,l=a.forDocument(getDocument$6(s)),d=FqnExpr$1.unwrap(l.parseFqnExprWith(i).custom.expr);switch(!0){case FqnExpr$1.isWildcard(d)&&c:case FqnExpr$1.isElementKindExpr(d)&&c:case FqnExpr$1.isElementTagExpr(d)&&c:o(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:i});return;case FqnExpr$1.isWildcard(d):case FqnExpr$1.isModelRef(d):case FqnExpr$1.isDeploymentRef(d):return;case FqnExpr$1.isElementKindExpr(d):case FqnExpr$1.isElementTagExpr(d):o(`error`,`Invalid target (expect reference to specific element)`,{node:i,property:`subject`});return;default:nonexhaustive$1(d)}})},checkFqnRefExpr=i=>{let a=i.likec4.ModelParser;return tryOrLog((i,o)=>{let s=a.forDocument(getDocument$6(i)).parseFqnRefExpr(i),c=getViewRulePredicateContainer(i),l=isFqnRefInsideDeployment(i)&&!hasContainerOfType(i,i=>isDeploymentViewRuleStyle(i)||isViewRuleStyle(i));if(c?.$type===`DeploymentViewRulePredicate`||l){if(!hasContainerOfType(i,isRelationExpr)){if(FqnExpr$1.isModelRef(s)){o(`error`,`Deployment view predicate must reference deployment model`,{node:i});return}if(FqnExpr$1.isDeploymentRef(s)&&FqnRef$1.isInsideInstanceRef(s.ref)){o(`error`,`Must reference deployment nodes or instances, but not internals`,{node:i});return}}e$4(i.selector)&&!isDeploymentNode$1(i.ref.value?.ref)&&o(`warning`,`Selector '${i.selector}' applies to deployment nodes only, ignored here`,{node:i,property:`selector`});return}if(c?.$type===`DynamicViewIncludePredicate`)switch(!0){case FqnExpr$1.isElementKindExpr(s):case FqnExpr$1.isElementTagExpr(s):case FqnExpr$1.isWildcard(s):o(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:i});return}})},checkIncomingRelationExpr=i=>tryOrLog((i,a)=>{i.to.$type===`WildcardExpression`&&!isInOutRelationExpr(i.$container)&&e$5(getContainerOfType(i,isElementView$1)?.viewOf)&&a(`warning`,`Predicate is ignored as it concerns all relationships`,{node:i})}),checkOutgoingRelationExpr=i=>tryOrLog((i,a)=>{if(getViewRulePredicateContainer(i)?.$type===`ViewRulePredicate`&&i.$container.$type!==`DirectedRelationExpr`&&i.from.$type===`WildcardExpression`){let o=getContainerOfType(i,isElementView$1);o&&e$5(o.viewOf)&&a(`warning`,`Predicate is ignored as it concerns all relationships`,{node:i})}}),checkRelationExpr=i=>{let a=i.likec4.ModelParser;return tryOrLog((i,o)=>{let s=getContainerOfType(i,isDeploymentViewRulePredicate);if(!s||s.isInclude!==!0)return;let c=getDocument$6(i),l=a.forDocument(c),d=RelationExpr.unwrap(l.parseRelationExpr(i)),f=`Model reference is allowed in exclude predicate only`;if(RelationExpr.isDirect(d)){(FqnExpr.isModelRef(d.source)||FqnExpr.isModelRef(d.target))&&o(`error`,f,{node:i});return}let p;if(p=RelationExpr.isIncoming(d)?d.incoming:RelationExpr.isOutgoing(d)?d.outgoing:d.inout,FqnExpr.isModelRef(p)){o(`error`,f,{node:i});return}})},checkRelationExprWith=i=>tryOrLog((i,a)=>{let o=getViewRulePredicateContainer(i);if(!(!o||o.$type==`DynamicViewIncludePredicate`)&&!o.isInclude){a(`error`,`Invalid usage inside "exclude"`,{node:i});return}});var LikeC4DocumentValidator=class extends DefaultDocumentValidator{constructor(i){super(i),this.services=i}async validateDocument(i,a,o){return this.services.shared.workspace.ProjectsManager.isExcluded(i)?[]:await super.validateDocument(i,a,o)}};init_main();const isValidatableAstNode=isAnyOf$1(isImportsFromPoject,isImported,isGlobals,isGlobalPredicateGroup,isGlobalDynamicPredicateGroup,isGlobalStyle,isGlobalStyleGroup,isFqnExprWith,isRelationExprWith,isFqnExpr,isRelationExpr,isDynamicViewParallelSteps,isDynamicStepChain,isDynamicStepSingle,isDeploymentViewRule,isDeploymentViewRulePredicate,isExpressionV2,isRelationExpr,isFqnRefExpr,isViewProperty,isStyleProperty,isTags,isViewRule,isDynamicViewRule,isLikeC4View,isViewRuleStyleOrGlobalRef,isDeployedInstance,isDeploymentNode$1,isDeploymentRelation,isRelationshipStyleProperty,isDynamicViewDisplayVariantProperty,isMetadataBody,isMetadataProperty,isRelation,isRelationBody,isElementProperty,isStringProperty,isNavigateToProperty,isElement,isElementBody,isElementStyleProperty,isElementRef,isExtendElement,isExtendElementBody,isExtendDeployment,isExtendDeploymentBody,isExtendRelation,isExtendRelationBody,isSpecificationElementKind,isSpecificationRelationshipKind,isSpecificationDeploymentNodeKind,isSpecificationTag,isSpecificationColor,isSpecificationRule,isExpressions,isColorLiteral),findInvalidContainer=i=>{let a=i;for(;a&&!isLikeC4Grammar(a);){if(isValidatableAstNode(a))return a;a=a.$container}};function checksFromDiagnostics(i){let a=i.state>=DocumentState.Validated?i.diagnostics?.filter(i=>i.severity===DiagnosticSeverity$1.Error)??[]:[],o=new WeakSet;for(let{node:i}of a){if(e$5(i)||o.has(i))continue;o.add(i);let a=findInvalidContainer(i);a&&o.add(a)}let s=i=>!o.has(i);return{isValid:s,invalidNodes:o}}function registerValidationChecks(i){logger$16.debug(`registerValidationChecks`),i.validation.ValidationRegistry.register({DeployedInstance:deployedInstanceChecks(i),DeploymentNodeKind:checkDeploymentNodeKind(i),DeploymentNode:deploymentNodeChecks(i),DeploymentRelation:deploymentRelationChecks(i),ExtendDeployment:extendDeploymentChecks(i),ExtendRelation:extendRelationChecks(i),FqnRefExpr:checkFqnRefExpr(i),RelationExpr:checkRelationExpr(i),OpacityProperty:opacityPropertyRuleChecks(i),IconProperty:iconPropertyRuleChecks(i),SpecificationRule:checkSpecificationRule(i),Model:checkModel(i),Globals:checkGlobals(i),GlobalPredicateGroup:checkGlobalPredicate(i),GlobalDynamicPredicateGroup:checkGlobalPredicate(i),GlobalStyleId:checkGlobalStyleId(i),DynamicStepSingle:dynamicViewStepSingle(i),DynamicStepChain:dynamicViewStepChain(i),LikeC4View:viewChecks(i),Element:checkElement(i),ElementRef:checkElementRef(i),ElementKind:checkElementKind(i),Relation:relationChecks(i),RelationBody:checkRelationBody(i),Tag:checkTag(i),FqnExprWith:checkFqnExprWith(i),RelationExprWith:checkRelationExprWith(i),RelationshipKind:checkRelationshipKind(i),IncomingRelationExpr:checkIncomingRelationExpr(i),OutgoingRelationExpr:checkOutgoingRelationExpr(i),ImportsFromPoject:checkImportsFromPoject(i),ColorLiteral:colorLiteralRuleChecks(i),DynamicViewDisplayVariantProperty:dynamicViewDisplayVariant(i),ViewRuleRank:viewRuleRankChecks(i)});let a=i.shared.lsp.Connection;a&&onNextTick(()=>{i.shared.workspace.DocumentBuilder.onUpdate((i,o)=>{for(let i of o)logger$16.debug(`clear diagnostics for deleted ${i.path}`),a.sendDiagnostics({uri:i.toString(),diagnostics:[]}).catch(i=>logger$16.error(loggable(i)))})})}const logger$4=logger$16.getChild(`parser`);function toSingleLine(i){if(i==null)return;let a=removeIndent(i);return e$9(a)?a.split(`
60
+ `).join(` `):`md`in a?{md:a.md.split(`
61
+ `).join(` `)}:{txt:a.txt.split(`
62
+ `).join(` `)}}function removeIndent(i){if(i!=null)switch(!0){case e$9(i):return dedent(i).trim();case isMarkdownOrString(i)&&e$9(i.markdown):return{md:dedent(i.markdown).trim()};case isMarkdownOrString(i)&&e$9(i.text):return{txt:dedent(i.text).trim()};case isMarkdownOrString(i):return{txt:``};default:return}}var BaseParser=class{isValid;constructor(i,a,o){this.services=i,this.doc=a,this.project=o,this.isValid=checksFromDiagnostics(a).isValid}logError(i,a,o){let s=i instanceof Error?i.message:typeof i==`string`?i:String(i);if(isAstNode(a)){let i=this.services.references.NameProvider.getName(a);i=i?`"${i}" (${a.$type})`:`${a.$type}`;let o=a.$cstNode,c=o?`:${o.range.start.line+1}:${o.range.start.character+1}`:``;s+=`\n\tat ${i} (${this.doc.uri.fsPath}${c})`}else a&&`$refText`in a&&(s+=`\n\tat reference "${a.$refText}" (${this.doc.uri.fsPath})`);o&&o!==`base`?logger$4.getChild(o).debug(s):logger$4.debug(s)}tryParse(i,a,o){try{return!a||!this.isValid(a)?void 0:o(a)}catch(o){this.logError(o,a,i);return}}tryMap(i,a,o){return t$7(a,a=>this.tryParse(i,a,o)??[])}resolveFqn(i){if(isImported(i)){let a=projectIdFrom(i),o=this.resolveFqn(nonNullable(i.imported.ref,`FqnRef is empty of imported: ${i.$cstNode?.text}`));return this.doc.c4Imports.set(a,o),GlobalFqn(a,o)}return isExtendElement(i)?readStrictFqn(i.element):isExtendDeployment(i)?readStrictFqn(i.deploymentNode):isDeploymentElement(i)?this.services.likec4.DeploymentsIndex.getFqn(i):this.services.likec4.FqnIndex.getFqn(i)}getAstNodePath(i){return this.services.workspace.AstNodeLocator.getAstNodePath(i)}getMetadata(i){if(!i||!this.isValid(i)||e$7(i.props))return;let a=i=>{if(isMarkdownOrString(i)){let a=removeIndent(i);if(!a)return[];if(typeof a==`string`)return e$4(a)?[a]:[];{let i=a.md||a.txt;return e$4(i)?[i]:[]}}else if(isMetadataArray(i))return i.values.map(i=>removeIndent(i)).map(i=>typeof i==`string`?i:i.md||i.txt).filter(e$4);return[]},o=t$3(i.props,t$7(i=>a(i.value).map(a=>[i.key,a])),n$2(([i,a])=>e$4(a)));if(e$7(o))return;let s=t$3(o,t$11(([i])=>i),t$20(i=>i.map(([i,a])=>a))),c={};for(let[i,a]of Object.entries(s))a&&a.length>0&&(c[i]=a.length===1?a[0]:a);return e$7(c)?void 0:c}parseMarkdownOrString(i){if(isMarkdownOrString(i))return removeIndent(i)}convertTags(i){return this.parseTags(i)}parseTags(i){let a=i?.tags;if(!a)return null;let o=[];for(;a;)o.push(...this.tryMap(`base`,a.values,i=>nonNullable(i.tag.ref,`Tag reference is not resolved`).name).filter(e$4)),a=a.prev;return isNonEmptyArray(o)?n$1(o):null}convertLinks(i){return this.parseLinks(i)}parseLinks(i){if(!i?.props||i.props.length===0)return;let a=this.tryMap(`base`,n$2(i.props,isLinkProperty),i=>{let a=i.value;if(e$8(a))return;let o=e$4(i.title)?toSingleLine(i.title):void 0,s=this.services.lsp.DocumentLinkProvider.relativeLink(this.doc,a);return exact({url:a,title:o,relative:s&&s!==a?s:void 0})});return isNonEmptyArray(a)?a:void 0}parseIconProperty(i){if(!i||!this.isValid(i))return;let{libicon:a,value:o}=i;switch(!0){case!!a:{let o=a.ref?.name;if(!o){this.logError(`Library icon ${a.$refText} is not a valid library icon`,i);return}return o}case o&&o===`none`:return o;case o&&hasProtocol(o):if(o.startsWith(`file:`)){this.logError(`Icon property '${o}' used the 'file' protocol which is not supported`,i);return}return o;case o&&o.startsWith(`@`):return this.parseImageAlias(o);case o&&isRelative(o):return joinRelativeURL(this.doc.uri.toString(),`../`,o);case o&&hasLeadingSlash(o):return joinURL(this.project.folderUri.toString(),o);default:this.logError(`Icon property '${o}' is not a valid URL, library icon, image alias or 'none'`,i);return}}parseImageAlias(i){let a=i.indexOf(`/`),o=a>0?i.substring(0,a):i,s=a>0?i.substring(a+1):``,c={"@":`./images`,...this.project.config.imageAliases}[o];if(!c){logger$4.warn(`Image alias "${o}" not found in project configuration`);return}let l=s?joinURL(c,s):c;return joinURL(this.project.folderUri.toString(),l)}parseColorLiteral(i){if(this.isValid(i)){if(isHexColor(i))return`#${i.hex}`;if(isRGBAColor(i)){let a=e$6(i.alpha)?i.alpha:void 0;return e$9(i.alpha)&&(a=parseAstPercent(i.alpha)/100),a===void 0?`rgb(${i.red},${i.green},${i.blue})`:`rgba(${i.red},${i.green},${i.blue},${a})`}nonexhaustive(i)}}parseElementStyle(i){if(!i)return{};if(e$11(i)){let a=this.parseStyleProps(i.find(isElementStyleProperty)?.props);try{let o=this.parseIconProperty(i.find(isIconProperty));o&&(a.icon=o)}catch(i){this.logError(i)}return a}return this.parseStyleProps(i.props)}parseStyleProps(i){let a={};if(!i||i.length===0)return a;for(let o of i)if(this.isValid(o))try{switch(!0){case isBorderProperty(o):e$4(o.value)&&(a.border=o.value);break;case isColorProperty(o):{let i=toColor(o);e$4(i)&&(a.color=i);break}case isShapeProperty(o):e$4(o.value)&&(a.shape=o.value);break;case isIconProperty(o):{let i=this.parseIconProperty(o);e$4(i)&&(a.icon=i);break}case isIconColorProperty(o):{let i=toColor(o);e$4(i)&&(a.iconColor=i);break}case isIconSizeProperty(o):e$4(o.value)&&(a.iconSize=parseAstSizeValue(o));break;case isIconPositionProperty(o):e$4(o.value)&&(a.iconPosition=parseAstIconPositionValue(o));break;case isOpacityProperty(o):a.opacity=parseAstOpacityProperty(o);break;case isMultipleProperty(o):a.multiple=e$12(o.value)?o.value:!1;break;case isShapeSizeProperty(o):e$4(o.value)&&(a.size=parseAstSizeValue(o));break;case isPaddingSizeProperty(o):e$4(o.value)&&(a.padding=parseAstSizeValue(o));break;case isTextSizeProperty(o):e$4(o.value)&&(a.textSize=parseAstSizeValue(o));break;default:nonexhaustive(o)}}catch(i){this.logError(i,o)}return exact(a)}parseBaseProps(i,a){let o=removeIndent(a?.title??parseMarkdownAsString(i.title)),s=a?.description?{txt:removeIndent(a.description)}:this.parseMarkdownOrString(i.description);return exact({title:o,summary:a?.summary?{txt:removeIndent(a.summary)}:this.parseMarkdownOrString(i.summary),description:s,technology:toSingleLine(a?.technology)??removeIndent(parseMarkdownAsString(i.technology))})}};function*streamDeploymentModel(i){let a=LinkedList.from(i.parseResult.value.deployments.flatMap(i=>i.elements)),o=[],s;for(;s=a.shift();){if(isDeploymentRelation(s)){o.push(s);continue}if(s.body&&s.body.elements.length>0)for(let i of s.body.elements)a.push(i);yield s}yield*o}function DeploymentModelParser(i){return class a extends i{parseDeployment(){let i=this.doc;for(let a of streamDeploymentModel(i))try{switch(!0){case isDeploymentRelation(a):this.isValid(a)&&i.c4DeploymentRelations.push(this.parseDeploymentRelation(a));break;case isDeployedInstance(a):i.c4Deployments.push(this.parseDeployedInstance(a));break;case isDeploymentNode$1(a):i.c4Deployments.push(this.parseDeploymentNode(a));break;case isExtendDeployment(a):{let o=this.parseExtendDeployment(a);o&&i.c4ExtendDeployments.push(o);break}default:nonexhaustive(a)}}catch(i){this.logError(i,a,`deployment`)}}parseDeploymentNode(i){let a=this.isValid,o=this.resolveFqn(i),s=nonNullable(i.kind.ref,`DeploymentKind not resolved`).name,c=this.parseTags(i.body)??void 0,l=this.parseLinks(i.body),d=this.parseElementStyle(i.body?.props),f=this.getMetadata(i.body?.props.find(isMetadataProperty)),p=t$3(i.body?.props??[],n$2(a),n$2(isElementStringProperty),t$25(i=>[i.key,i.value])),{title:h,...g}=this.parseBaseProps(p,{title:i.title,summary:i.summary});return exact({id:o,kind:s,title:h??nameFromFqn(o),...g,tags:c,links:l,style:d,metadata:f})}parseDeployedInstance(i){let a=this.isValid,o=this.resolveFqn(i),s=this.parseFqnRef(i.target.modelElement);invariant(FqnRef.isModelRef(s)||FqnRef.isImportRef(s),`Target must be a model reference`);let c=this.parseTags(i.body)??void 0,l=this.parseElementStyle(i.body?.props),d=this.getMetadata(i.body?.props.find(isMetadataProperty)),f=t$3(i.body?.props??[],n$2(a),n$2(isElementStringProperty),t$25(i=>[i.key,i.value])),p=this.parseBaseProps(f,{title:i.title,summary:i.summary});return exact({id:o,element:s,tags:c,links:this.parseLinks(i.body),...p,style:l,metadata:d})}parseExtendDeployment(i){let a=this.parseTags(i.body),o=this.getMetadata(i.body?.props.find(isMetadataProperty)),s=this.parseLinks(i.body);return!a&&e$7(o??{})&&!s?null:exact({id:this.resolveFqn(i),astPath:this.getAstNodePath(i),metadata:o,tags:a,links:s})}_resolveDeploymentRelationSource(i){if(e$3(i.source))return this.parseFqnRef(i.source);if(i.$container.$type===`DeploymentNodeBody`||i.$container.$type===`DeployedInstanceBody`)return{deployment:this.resolveFqn(i.$container.$container)};throw Error(`RelationRefError: Invalid container for sourceless relation`)}parseDeploymentRelation(i){let a=this.isValid,o=this.getAstNodePath(i),s=this._resolveDeploymentRelationSource(i);invariant(FqnRef.isDeploymentRef(s),`Invalid source for deployment relation`);let c=this.parseFqnRef(i.target);invariant(FqnRef.isDeploymentRef(c),`Invalid target for deployment relation`);let l=this.convertTags(i)??this.convertTags(i.body)??void 0,d=this.convertLinks(i.body),f=(i.kind??i.dotKind?.kind)?.ref?.name,p=this.getMetadata(i.body?.props.find(isMetadataProperty)),h=t$3(i.body?.props??[],n$2(isRelationStringProperty),n$2(i=>e$4(i.value)),t$25(i=>[i.key,i.value])),g=t$3(i.body?.props??[],n$2(isRelationNavigateToProperty),n$4())?.value.view.ref?.name,_=this.parseBaseProps(h,{title:i.title}),v=i.body?.props.find(isRelationStyleProperty);return exact({id:stringHash$1(`deployment`,o,s.deployment,c.deployment),source:s,target:c,..._,metadata:p,kind:f,tags:l,links:d,...toRelationshipStyle(v?.props,a),navigateTo:g,astPath:o})}}}function DeploymentViewParser(i){return class a extends i{parseDeploymentView(i){let a=i.body;invariant(a,`DynamicElementView body is not defined`);let o=a.props.filter(this.isValid),s=this.getAstNodePath(i),c=i.name;c||=`deployment_`+stringHash$1(this.doc.uri.toString(),s);let{title:l=null,description:d=null}=this.parseBaseProps(t$3(o,n$2(isViewStringProperty),t$25(i=>[i.key,i.value]))),f=this.convertTags(a),p=this.convertLinks(a);ViewOps.writeId(i,c);let h=parseViewManualLayout(i);return{[c4._type]:`deployment`,id:c,astPath:s,title:toSingleLine(l)??null,description:d,tags:f,links:isNonEmptyArray(p)?p:null,rules:this.tryMap(`deployment`,a.rules,i=>this.parseDeploymentViewRule(i)),...h&&{manualLayout:h}}}parseDeploymentViewRule(i){if(isDeploymentViewRulePredicate(i))return this.parseDeploymentViewRulePredicate(i);if(isViewRuleAutoLayout(i))return toAutoLayout(i);if(isDeploymentViewRuleStyle(i))return this.parseDeploymentViewRuleStyle(i);nonexhaustive(i)}parseDeploymentViewRulePredicate(i){let a=[],o=i.expr;for(;o;){try{let i=o.value;e$1(i)&&this.isValid(i)&&a.unshift(this.parseExpressionV2(i))}catch(i){logWarnError(i)}o=o.prev}return i.isInclude?{include:a}:{exclude:a}}parseDeploymentViewRuleStyle(i){let a=this.parseStyleProps(i.props.filter(isStyleProperty)),o=removeIndent(parseMarkdownAsString(i.props.find(isNotationProperty)?.value));return{targets:this.parseFqnExpressions(i.targets),style:a,...o&&{notation:o}}}}}const parseEquals=({operator:i,not:a},o)=>i.startsWith(`!=`)?{neq:o}:i.startsWith(`=`)?{eq:o}:a?{neq:o}:{eq:o};function parseParticipant(i){return!isWhereRelationParticipantKind(i)&&!isWhereRelationParticipantTag(i)?null:i.participant}function parseWhereClause(i){switch(!0){case isWhereTagEqual(i):{let a=i.value.tag.ref?.name,o=parseParticipant(i);invariant(a,`Expected tag name`);let s={tag:parseEquals(i,a)};return o?{participant:o,operator:s}:s}case isWhereKindEqual(i):{let a=i.value?.ref?.name,o=parseParticipant(i);invariant(a,`Expected kind name`);let s={kind:parseEquals(i,a)};return o?{participant:o,operator:s}:s}case isWhereElementNegation(i)||isWhereRelationNegation(i):return{not:parseWhereClause(i.value)};case isWhereBinaryExpression(i):{let a=parseWhereClause(i.left),o=parseWhereClause(i.right);return createBinaryOperator(i.operator.toLowerCase(),a,o)}default:nonexhaustive(i)}}function createBinaryOperator(i,a,o){if(o===null)return a;switch(i){case`and`:{let i=[isAndOperator(a)?a.and:a,isAndOperator(o)?o.and:o].flat();return invariant(isNonEmptyArray(i),`Expected non-empty array`),{and:i}}case`or`:{let i=[isOrOperator(a)?a.or:a,isOrOperator(o)?o.or:o].flat();return invariant(isNonEmptyArray(i),`Expected non-empty array`),{or:i}}default:nonexhaustive(i)}}function ExpressionV2Parser(i){return class a extends i{parseFqnRef(i){let a=nonNullable(i.value?.ref,()=>`Element "${i.$cstNode?.text}" is not resolved`);if(isImported(a)){let i={project:projectIdFrom(a),model:this.resolveFqn(nonNullable(a.imported.ref,`Imported "${a.$cstNode?.text}" is not resolved`))};return this.doc.c4Imports.set(i.project,i.model),i}if(isElement(a)){let o=importsRef(i);if(o){let i={project:projectIdFrom(o),model:this.resolveFqn(a)};return this.doc.c4Imports.set(i.project,i.model),i}let s=instanceRef(i);return s?{deployment:this.resolveFqn(s),element:this.resolveFqn(a)}:{model:this.resolveFqn(a)}}if(isDeploymentElement(a))return{deployment:this.resolveFqn(a)};nonexhaustive(a)}parseExpressionV2(i){if(isFqnExprOrWith(i))return this.parseFqnExprOrWith(i);if(isRelationExprOrWith(i))return this.parseRelationExprOrWith(i);nonexhaustive(i)}parseFqnExprOrWith(i){if(isFqnExprWith(i))return this.parseFqnExprWith(i);if(isFqnExprOrWhere(i))return this.parseFqnExprOrWhere(i);nonexhaustive(i)}parseFqnExprWith(i){let a=this.parseFqnExprOrWhere(i.subject);return(i.custom?.props??[]).reduce((i,a)=>{if(!this.isValid(a))return i;if(isNavigateToProperty(a)){let o=a.value.view.$refText;return e$4(o)&&(i.custom.navigateTo=o),i}if(isNotesProperty(a)){let o=this.parseMarkdownOrString(a.value);return o&&(i.custom[a.key]=o),i}if(isElementStringProperty(a)){if(a.key===`description`||a.key===`summary`){let o=this.parseMarkdownOrString(a.value);return o&&(i.custom.description=o),i}let o=removeIndent(parseMarkdownAsString(a.value));return o&&(i.custom[a.key]=o),i}if(isIconProperty(a)){let s=this.parseIconProperty(a);return e$3(s)&&(i.custom[a.key]=s),i}if(isColorProperty(a)){let s=toColor(a);return e$3(s)&&(i.custom[a.key]=s),i}if(isShapeProperty(a)||isBorderProperty(a))return e$3(a.value)&&(i.custom[a.key]=a.value),i;if(isOpacityProperty(a))return e$3(a.value)&&(i.custom[a.key]=parseAstOpacityProperty(a)),i;if(isIconColorProperty(a)){let s=toColor(a);return e$3(s)&&(i.custom[a.key]=s),i}if(isNotationProperty(a)){let o=e$4(a.value)?removeIndent(parseMarkdownAsString(a.value)):void 0;return o&&(i.custom[a.key]=o),i}if(isMultipleProperty(a))return e$12(a.value)&&(i.custom[a.key]=a.value),i;if(isShapeSizeProperty(a)||isTextSizeProperty(a)||isPaddingSizeProperty(a)||isIconSizeProperty(a))return e$4(a.value)&&(i.custom[a.key]=parseAstSizeValue(a)),i;if(isIconPositionProperty(a))return e$4(a.value)&&(i.custom[a.key]=a.value),i;nonexhaustive(a)},{custom:{expr:a}})}parseFqnExprOrWhere(i){if(isFqnExprWhere(i))return this.parseFqnExprWhere(i);if(isFqnExpr(i))return this.parseFqnExpr(i);nonexhaustive(i)}parseFqnExprWhere(i){return invariant(!isFqnExprWhere(i.subject),`FqnExprWhere is not allowed as subject of FqnExprWhere`),{where:{expr:this.parseFqnExpr(i.subject),condition:i.where?parseWhereClause(i.where):{kind:{neq:`--always-true--`}}}}}parseFqnExpr(i){if(isWildcardExpression(i))return{wildcard:!0};if(isElementKindExpression(i))return invariant(i.kind?.ref,`ElementKind "${i.$cstNode?.text}" is not resolved`),{elementKind:i.kind.ref.name,isEqual:i.isEqual};if(isElementTagExpression(i))return invariant(i.tag.tag.ref,`Tag ${i.$cstNode?.text} is not resolved`),{elementTag:i.tag.tag.$refText,isEqual:i.isEqual};if(isFqnRefExpr(i))return this.parseFqnRefExpr(i);nonexhaustive(i)}parseFqnRefExpr(i){let a=this.parseFqnRef(i.ref);switch(!0){case i.selector===`._`:return{ref:a,selector:`expanded`};case i.selector===`.**`:return{ref:a,selector:`descendants`};case i.selector===`.*`:return{ref:a,selector:`children`};default:return{ref:a}}}parseFqnExpressions(i){let a=[],o=i;for(;o;){try{e$1(o.value)&&this.isValid(o.value)&&a.push(this.parseFqnExpr(o.value))}catch(i){this.logError(i,o.value,`fqnref`)}o=o.prev}return a.reverse()}parseRelationExprOrWith(i){if(isRelationExprWith(i))return this.parseRelationExprWith(i);if(isRelationExprOrWhere(i))return this.parseRelationExprOrWhere(i);nonexhaustive(i)}parseRelationExprWith(i){let a=this.parseRelationExprOrWhere(i.subject);return{customRelation:{...this.parseCustomRelationProperties(i.custom),expr:a}}}parseCustomRelationProperties(i){return(i?.props??[]).reduce((i,a)=>{if(isNotesProperty(a)){let o=this.parseMarkdownOrString(a.value);return o&&(i[a.key]=o),i}if(isRelationStringProperty(a)||isNotationProperty(a)){if(a.key===`description`){let o=this.parseMarkdownOrString(a.value);return o&&(i.description=o),i}let o=removeIndent(parseMarkdownAsString(a.value));return o&&(i[a.key]=o),i}if(isArrowProperty(a))return e$4(a.value)&&(i[a.key]=a.value),i;if(isColorProperty(a)){let o=toColor(a);return e$4(o)&&(i[a.key]=o),i}if(isLineProperty(a))return e$4(a.value)&&(i[a.key]=a.value),i;if(isRelationNavigateToProperty(a)){let o=a.value.view.ref?.name;return e$4(o)&&(i[a.key]=o),i}nonexhaustive(a)},{})}parseRelationExprOrWhere(i){if(isRelationExprWhere(i))return this.parseRelationExprWhere(i);if(isRelationExpr(i))return this.parseRelationExpr(i);nonexhaustive(i)}parseRelationExprWhere(i){invariant(!isRelationExprWhere(i.subject),`RelationExprWhere is not allowed as subject of RelationExprWhere`);let a=this.parseRelationExpr(i.subject),o=a.where?.expr??a,s=a.where?.condition,c=i.where?parseWhereClause(i.where):null,l;return l=c&&s?createBinaryOperator(`and`,s,c):c??s??{kind:{neq:`--always-true--`}},{where:{expr:o,condition:l}}}parseRelationExpr(i){switch(i.$type){case`DirectedRelationExpr`:return this.wrapInWhere({source:this.parseFqnExpr(i.source.from),target:this.parseFqnExpr(i.target),isBidirectional:i.source.isBidirectional},this.parseInlineKindCondition(i.source));case`InOutRelationExpr`:return{inout:this.parseFqnExpr(i.inout.to)};case`OutgoingRelationExpr`:return this.wrapInWhere({outgoing:this.parseFqnExpr(i.from)},this.parseInlineKindCondition(i));case`IncomingRelationExpr`:return{incoming:this.parseFqnExpr(i.to)};default:nonexhaustive(i)}}parseInlineKindCondition(i){let a=i.kind??i.dotKind?.kind;return a?a.ref?{kind:{eq:a.ref?.name}}:(this.logError(`RelationshipKind "${a.$refText}" is not resolved`,i,`fqnref`),null):null}wrapInWhere(i,a){return a?{where:{expr:i,condition:a}}:i}}}function GlobalsParser(i){return class a extends i{parseGlobals(){let{parseResult:i,c4Globals:a}=this.doc,o=this.isValid,s=i.value.globals.filter(o),c=s.flatMap(i=>i.predicates.filter(o));for(let i of c)try{let o=i.name;if(!e$4(o))continue;if(o in a.predicates){this.logError(`Global predicate named "${o}" is already defined`,i,`globals`);continue}this.parseAndStoreGlobalPredicateGroupOrDynamic(i,o,a)}catch(a){this.logError(a,i,`globals`)}let l=s.flatMap(i=>i.styles.filter(o));for(let i of l)try{let o=i.id.name;if(!e$4(o))continue;if(o in a.styles){this.logError(`Global style named "${o}" is already defined`,i,`globals`);continue}let s=this.parseGlobalStyleOrGroup(i);t$4(s,1)&&(a.styles[o]=s)}catch(a){this.logError(a,i,`globals`)}}parseAndStoreGlobalPredicateGroupOrDynamic(i,a,o){if(isGlobalPredicateGroup(i)){let s=this.parseGlobalPredicateGroup(i);t$4(s,1)&&(o.predicates[a]=s);return}if(isGlobalDynamicPredicateGroup(i)){let s=this.parseGlobalDynamicPredicateGroup(i);t$4(s,1)&&(o.dynamicPredicates[a]=s);return}nonexhaustive(i)}parseGlobalPredicateGroup(i){return i.predicates.map(i=>this.parseViewRulePredicate(i))}parseGlobalDynamicPredicateGroup(i){return i.predicates.map(i=>this.parseDynamicViewIncludePredicate(i))}parseGlobalStyleOrGroup(i){if(isGlobalStyle(i))return[this.parseViewRuleStyle(i)];if(isGlobalStyleGroup(i))return i.styles.map(i=>this.parseViewRuleStyle(i));nonexhaustive(i)}}}function ImportsParser(i){return class a extends i{parseImports(){let i=this.doc.parseResult.value.imports??[];for(let a of i){let i=a.project,o=a.imports;for(;o;){try{this.doc.c4Imports.set(i,this.resolveFqn(nonNullable(o.imported.ref,`ElementRef is empty of imported: ${o.imported.$refText}`)))}catch(i){this.logError(i,o,`imports`)}o=o.prev}}}}}function*streamModel(i){let a=LinkedList.from(i.parseResult.value.models.flatMap(i=>i.elements)),o=[],s;for(;s=a.shift();){if(isRelation(s)){o.push(s);continue}if(isExtendRelation(s)){o.push(s);continue}if(s.body?.elements&&t$4(s.body.elements,1))for(let i of s.body.elements)a.push(i);yield s}yield*o}function ModelParser(i){return class a extends i{parseModel(){let i=this.doc;for(let a of streamModel(i))try{if(isElement(a)){i.c4Elements.push(this.parseElement(a));continue}if(isRelation(a)){i.c4Relations.push(this.parseRelation(a));continue}if(isExtendElement(a)){let o=this.parseExtendElement(a);o&&i.c4ExtendElements.push(o);continue}if(isExtendRelation(a)){let o=this.parseExtendRelation(a);o&&i.c4ExtendRelations.push(o);continue}nonexhaustive(a)}catch(i){this.logError(i,a,`model`)}}parseElement(i){let a=this.isValid,o=this.resolveFqn(i),s=nonNullable(i.kind.ref,`Element kind is not resolved`).name,c=this.parseTags(i.body),l=this.parseElementStyle(i.body?.props),d=this.getMetadata(i.body?.props.find(isMetadataProperty)),f=this.getAstNodePath(i),[p,h,g]=i.props??[],_=t$3(i.body?.props??[],n$2(a),n$2(isElementStringProperty),t$25(i=>[i.key,i.value])),{title:v,...y}=this.parseBaseProps(_,{title:p,summary:h,technology:g});return exact$1({id:o,kind:s,astPath:f,title:v,metadata:d,tags:c??void 0,links:this.parseLinks(i.body),...y,style:l})}parseExtendElement(i){let a=this.parseTags(i.body),o=this.getMetadata(i.body?.props.find(isMetadataProperty)),s=this.parseLinks(i.body);if(!a&&e$8(o)&&!s)return null;let c=this.getAstNodePath(i);return exact$1({id:this.resolveFqn(i),astPath:c,metadata:o,tags:a,links:s})}parseExtendRelation(i){let a=this.parseFqnRef(i.source),o=this.parseFqnRef(i.target);invariant(FqnRef$1.isModelRef(a)||FqnRef$1.isImportRef(a),`Source must be a model reference`),invariant(FqnRef$1.isModelRef(o)||FqnRef$1.isImportRef(o),`Target must be a model reference`);let s=this.parseTags(i.body),c=this.getMetadata(i.body?.props.find(isMetadataProperty)),l=this.getAstNodePath(i),d=this.parseLinks(i.body);if(!s&&e$7(c??{})&&!d)return null;let f=(i.kind??i.dotKind?.kind)?.ref?.name,{title:p=``}=this.parseBaseProps({},{title:i.title});return exact$1({id:stringHash$1(`extend-relation`,FqnRef$1.flatten(a),FqnRef$1.flatten(o),f??`default`,p),astPath:l,metadata:c,tags:s,links:d})}_resolveRelationSource(i){if(e$3(i.source)){let a=this.parseFqnRef(i.source);return invariant(FqnRef$1.isModelRef(a)||FqnRef$1.isImportRef(a),`Relation source must be a model reference`),a}if(isElementBody(i.$container)||isExtendElementBody(i.$container))return{model:this.resolveFqn(i.$container.$container)};throw Error(`RelationRefError: Invalid container for sourceless relation`)}parseRelation(i){let a=this.isValid,o=this._resolveRelationSource(i),s=this.parseFqnRef(i.target);invariant(FqnRef$1.isModelRef(s)||FqnRef$1.isImportRef(s),`Target must be a model reference`);let c=this.parseTags(i)??this.parseTags(i.body)??void 0,l=this.parseLinks(i.body),d=(i.kind??i.dotKind?.kind)?.ref?.name,f=this.getMetadata(i.body?.props.find(isMetadataProperty)),p=this.getAstNodePath(i),h=t$3(i.body?.props??[],n$2(isRelationStringProperty),n$2(i=>e$4(i.value)),t$25(i=>[i.key,i.value])),g=t$3(i.body?.props??[],n$2(isRelationNavigateToProperty),t(i=>i.value.view.ref?.name),n$2(e$4),n$4()),{title:_=``,description:v,technology:y}=this.parseBaseProps(h,{title:i.title,description:i.description,technology:i.technology}),b=i.body?.props.find(isRelationStyleProperty);return exact$1({id:stringHash$1(p,o.model,s.model),astPath:p,source:o,target:s,title:_,metadata:f,kind:d,tags:c,links:l,navigateTo:g,description:v,technology:y,...toRelationshipStyle(b?.props,a)})}}}function PredicatesParser(i){return class a extends i{parsePredicate(i){return this.parseExpressionV2(i)}parseElementPredicate(i){if(isFqnExprWith(i))return this.parseFqnExprWith(i);if(isFqnExprOrWhere(i))return this.parseFqnExprOrWhere(i);nonexhaustive(i)}parseElementPredicateOrWhere(i){return this.parseFqnExprOrWhere(i)}parseElementExpression(i){return this.parseFqnExpr(i)}parseElementPredicateWhere(i){return this.parseFqnExprWhere(i)}parseElementPredicateWith(i){return this.parseFqnExprWith(i)}parseRelationPredicate(i){return this.parseRelationExprOrWith(i)}parseRelationPredicateOrWhere(i){return this.parseRelationExprOrWhere(i)}parseRelationPredicateWhere(i){return this.parseRelationExprWhere(i)}parseRelationPredicateWith(i){return this.parseRelationExprWith(i)}parseRelationExpression(i){return this.parseRelationExpr(i)}}}function SpecificationParser(i){return class a extends i{parseSpecification(){let{parseResult:{value:{specifications:i}},c4Specification:a}=this.doc,o=this.isValid;for(let s of i.flatMap(i=>i.elements.filter(o)))try{Object.assign(a.elements,this.parseElementSpecificationNode(s))}catch(i){this.logError(i,s,`specification`)}for(let s of i.flatMap(i=>i.deploymentNodes.filter(o)))try{Object.assign(a.deployments,this.parseElementSpecificationNode(s))}catch(i){this.logError(i,s,`specification`)}let s=i.flatMap(i=>i.relationships.filter(this.isValid));for(let{kind:i,props:o}of s)try{let s=i.name;if(!e$4(s))continue;if(s in a.relationships){this.logError(`Relationship kind "${s}" is already defined`,i,`specification`);continue}let c=t$3(o.filter(isSpecificationRelationshipStringProperty)??[],n$2(i=>this.isValid(i)&&e$1(i.value)),t$25(i=>[i.key,removeIndent(parseMarkdownAsString(i.value))]),t$23(e$5));a.relationships[s]={...c,...toRelationshipStyle(o.filter(isRelationshipStyleProperty),this.isValid)}}catch(a){this.logError(a,i,`specification`)}let c=i.flatMap(i=>i.tags.filter(this.isValid));for(let i of c)try{let o=i.tag.name,s=this.getAstNodePath(i.tag),c=i.color&&this.parseColorLiteral(i.color);if(o in a.tags){this.logError(`Tag ${o} is already defined, skipping duplicate`,i,`specification`);continue}e$4(o)&&(a.tags[o]={astPath:s,...c?{color:c}:{}})}catch(a){this.logError(a,i,`specification`)}let f=i.flatMap(i=>i.colors.filter(o));for(let{name:i,color:o}of f)try{let s=i.name;if(s in a.colors){this.logError(`Custom color "${s}" is already defined`,i,`specification`);continue}a.colors[s]={color:nonNullable$1(this.parseColorLiteral(o),`Color "${s}" is not valid`)}}catch(i){this.logError(i,o,`specification`)}}parseElementSpecificationNode(i){let{kind:a,props:o}=i,s=a.name;if(!e$4(s))throw Error(`DeploymentNodeKind name is not resolved`);let c=this.parseTags(i),l=this.parseElementStyle(o.find(isElementStyleProperty)),d=this.parseLinks(i),f=t$3(o.filter(isSpecificationElementStringProperty)??[],n$2(i=>this.isValid(i)),t$25(i=>[i.key,i.value])),p=this.parseBaseProps(f),h=removeIndent(parseMarkdownAsString(f.notation));return{[s]:exact({...p,notation:h,tags:c??void 0,...d&&c4.isNonEmptyArray(d)&&{links:d},style:l})}}}}function ViewsParser(i){return class a extends i{parseViews(){let i=this.isValid;for(let a of this.doc.parseResult.value.views){let o=a.styles.flatMap(a=>{try{return i(a)?this.parseViewRuleStyleOrGlobalRef(a):[]}catch(i){return this.logError(i,a,`views`),[]}}),s=a.folder&&!e$7(a.folder.trim())?toSingleLine(a.folder):null;for(let c of a.views)try{if(!i(c))continue;switch(!0){case isElementView$1(c):this.doc.c4Views.push(this.parseElementView(c,o));break;case isDynamicView$1(c):this.doc.c4Views.push(this.parseDynamicElementView(c,o));break;case isDeploymentView$1(c):this.doc.c4Views.push(this.parseDeploymentView(c));break;default:nonexhaustive(c)}if(s){let i=this.doc.c4Views.at(-1);i.title=s+` / `+(i.title||i.id)}}catch(i){this.logError(i,c,`views`)}}}parseElementView(i,a){let o=i.body;invariant(o,`ElementView body is not defined`);let s=this.getAstNodePath(i),c=null;if(`viewOf`in i){let a=elementRef(i.viewOf),o=a&&safeCall(()=>this.resolveFqn(a));if(o)c=o;else{let a=i.name??`unnamed`,o=i.viewOf.$cstNode?.text??`<unknown>`;this.logError(`viewOf ${a} not resolved ${o}`,i.viewOf)}}let l=i.name;l||=`view_`+stringHash$1(this.doc.uri.toString(),s,c??``);let{title:d=null,description:f=null}=this.parseBaseProps(t$3(o.props,n$2(i=>this.isValid(i)),n$2(isViewStringProperty),t$25(i=>[i.key,i.value]))),p=this.convertTags(o),h=this.convertLinks(o),g=parseViewManualLayout(i),_={[c4._type]:`element`,id:l,astPath:s,title:toSingleLine(d)??null,description:f,tags:p,links:isNonEmptyArray(h)?h:null,rules:[...a,...this.tryMap(`views`,o.rules,i=>this.parseElementViewRule(i))],...c&&{viewOf:c},...g&&{manualLayout:g}};if(ViewOps.writeId(i,_.id),`extends`in i){let a=i.extends.view.ref;return invariant(a?.name,`view extends is not resolved: `+i.$cstNode?.text),Object.assign(_,{extends:a.name})}return _}parseElementViewRule(i){if(isViewRulePredicate(i))return this.parseViewRulePredicate(i);if(isViewRuleGlobalPredicateRef(i))return this.parseViewRuleGlobalPredicateRef(i);if(isViewRuleStyleOrGlobalRef(i))return this.parseViewRuleStyleOrGlobalRef(i);if(isViewRuleAutoLayout(i))return toAutoLayout(i);if(isViewRuleGroup(i))return this.parseViewRuleGroup(i);if(isViewRuleRank(i))return this.parseViewRuleRank(i);nonexhaustive(i)}parseViewRulePredicate(i){let a=[],o=i.exprs;for(;o;){let{value:i,prev:s}=o;if(this.tryParse(`views`,i,()=>{let o=this.parsePredicate(i);a.unshift(o)}),!s)break;o=s}return i.isInclude?{include:a}:{exclude:a}}parseViewRuleGlobalPredicateRef(i){return{predicateId:i.predicate.$refText}}parseViewRuleStyleOrGlobalRef(i){if(isViewRuleStyle(i))return this.parseViewRuleStyle(i);if(isViewRuleGlobalStyle(i))return this.parseViewRuleGlobalStyle(i);nonexhaustive(i)}parseViewRuleGroup(i){let a=[];for(let o of i.groupRules)try{if(!this.isValid(o))continue;if(isViewRulePredicate(o)){a.push(this.parseViewRulePredicate(o));continue}if(isViewRuleGroup(o)){a.push(this.parseViewRuleGroup(o));continue}nonexhaustive(o)}catch(i){this.logError(i,o,`views`)}return{title:toSingleLine(i.title)??null,groupRules:a,...this.parseStyleProps(i.props)}}parseViewRuleRank(i){let a=this.parseFqnExpressions(i.targets).filter(i=>c4.ModelExpression.isFqnExpr(i));return{rank:i.value??`same`,targets:a}}parseViewRuleStyle(i){let a=this.parseFqnExpressions(i.targets).filter(i=>c4.ModelExpression.isFqnExpr(i)),o=this.parseStyleProps(i.props.filter(isStyleProperty)),s=removeIndent(parseMarkdownAsString(i.props.find(isNotationProperty)?.value));return{targets:a,style:o,...s&&{notation:s}}}parseViewRuleGlobalStyle(i){return{styleId:i.style.$refText}}parseDynamicElementView(i,a){let o=i.body;invariant(o,`DynamicElementView body is not defined`);let s=this.isValid,c=o.props.filter(s),l=this.getAstNodePath(i),d=i.name;d||=`dynamic_`+stringHash$1(this.doc.uri.toString(),l);let{title:p=null,description:h=null}=this.parseBaseProps(t$3(c,n$2(isViewStringProperty),t$25(i=>[i.key,i.value]))),g=this.convertTags(o),_=this.convertLinks(o);ViewOps.writeId(i,d);let v=parseViewManualLayout(i),y=r$1(c,isDynamicViewDisplayVariantProperty)?.value;return{[c4._type]:`dynamic`,id:d,astPath:l,title:toSingleLine(p)??null,description:h,tags:g,links:isNonEmptyArray(_)?_:null,variant:y,rules:[...a,...this.tryMap(`views`,o.rules,i=>this.parseDynamicViewRule(i))],steps:this.tryMap(`views`,o.steps,i=>isDynamicViewParallelSteps(i)?this.parseDynamicParallelSteps(i):this.parseDynamicStep(i)),...v&&{manualLayout:v}}}parseDynamicViewRule(i){if(isDynamicViewIncludePredicate(i))return this.parseDynamicViewIncludePredicate(i);if(isDynamicViewGlobalPredicateRef(i))return this.parseViewRuleGlobalPredicateRef(i);if(isViewRuleStyleOrGlobalRef(i))return this.parseViewRuleStyleOrGlobalRef(i);if(isViewRuleAutoLayout(i))return toAutoLayout(i);nonexhaustive(i)}parseDynamicViewIncludePredicate(i){let a=[],o=i.exprs;for(;o;)this.tryParse(`views`,o.value,i=>{if(isFqnExprOrWith(i)){let o=this.parseElementPredicate(i);a.unshift(o)}}),o=o.prev;return{include:a}}parseDynamicParallelSteps(i){let a=pathInsideDynamicView(i),o=this.tryMap(`views`,i.steps,i=>this.parseDynamicStep(i));return invariant(isNonEmptyArray(o),`Dynamic parallel steps must have at least one step`),{parallelId:a,__parallel:o}}parseDynamicStep(i){if(isDynamicStepSingle(i))return this.parseDynamicStepSingle(i);let a=this.recursiveParseDynamicStepChain(i);return invariant(isNonEmptyArray(a),`Dynamic step chain must have at least one step`),{seriesId:pathInsideDynamicView(i),__series:a}}recursiveParseDynamicStepChain(i,a){if(isDynamicStepSingle(i.source)){if(!this.isValid(i.source))return[];let o=this.parseDynamicStepSingle(i.source);if(o.isBackward)return[];let s={...this.parseAbstractDynamicStep(i),source:o.target};return s.target===o.source?s.isBackward=!0:a&&(a.push([o.source,o.target]),a.push([s.source,s.target])),[o,s]}a??=[];let o=this.recursiveParseDynamicStepChain(i.source,a);if(!isNonEmptyArray(o)||!this.isValid(i))return[];let s=t$5(o),c={...this.parseAbstractDynamicStep(i),source:s.target},l=a.findIndex(([i,a])=>i===c.target&&a===c.source);return l===-1?a.push([c.source,c.target]):(c.isBackward=!0,a.splice(l,a.length-l)),[...o,c]}parseDynamicStepSingle(i){let a=elementRef(i.source);if(!a)throw Error(`Invalid reference to source`);let o={...this.parseAbstractDynamicStep(i),source:this.resolveFqn(a)};return i.isBackward&&(o={...o,source:o.target,target:o.source,isBackward:!0}),o}parseAbstractDynamicStep(i){let a=elementRef(i.target);if(!a)throw Error(`Invalid reference to target`);let s={target:this.resolveFqn(a),astPath:pathInsideDynamicView(i)},c=removeIndent(i.title);c&&(s.title=c);let l=i.kind?.ref?.name??i.dotKind?.kind.ref?.name;l&&(s.kind=l);for(let a of i.custom?.props??[])try{switch(!0){case isRelationNavigateToProperty(a):{let i=a.value.view.ref?.name;e$4(i)&&(s.navigateTo=i);break}case isRelationStringProperty(a):case isNotationProperty(a):if(e$3(a.value))if(a.key===`description`){let i=removeIndent(a.value);i&&(s.description=i)}else s[a.key]=removeIndent(parseMarkdownAsString(a.value))??``;break;case isNotesProperty(a):e$3(a.value)&&(s[a.key]=removeIndent(a.value));break;case isArrowProperty(a):e$3(a.value)&&(s[a.key]=a.value);break;case isColorProperty(a):{let i=toColor(a);e$3(i)&&(s[a.key]=i);break}case isLineProperty(a):e$3(a.value)&&(s[a.key]=a.value);break;default:nonexhaustive(a)}}catch(i){this.logError(i,a,`views`)}return s}}}function pathInsideDynamicView(i){let a=i,o=[];for(;!isDynamicViewBody(a);)e$6(a.$containerIndex)&&o.unshift(`@${a.$containerIndex}`),o.unshift(`/${a.$containerProperty??`__invalid__`}`),a=a.$container;return o.join(``)}init_main();const DocumentParserFromMixins=t$3(BaseParser,ExpressionV2Parser,ImportsParser,ModelParser,DeploymentModelParser,DeploymentViewParser,PredicatesParser,SpecificationParser,ViewsParser,GlobalsParser);var DocumentParser=class extends DocumentParserFromMixins{};const logger$3=logger$16.getChild(`parser`),isError=i=>i.severity===DiagnosticSeverity$1.Error;var LikeC4ModelParser=class{cachedParsers=new DefaultWeakMap(i=>this.createParser(i));constructor(i){this.services=i,i.shared.workspace.DocumentBuilder.onDocumentPhase(DocumentState.Linked,async i=>{this.cachedParsers.has(i)&&(logger$3.trace(`Linked: clear cached parser {projectId} document {doc}`,{projectId:i.likec4ProjectId,doc:UriUtils.basename(i.uri)}),this.cachedParsers.delete(i))}),i.shared.workspace.DocumentBuilder.onBuildPhase(DocumentState.Linked,async a=>{for(let o of a)if(!i.shared.workspace.ProjectsManager.isExcluded(o))try{this.parse(o)}catch(i){logWarnError(i)}}),i.shared.workspace.DocumentBuilder.onDocumentPhase(DocumentState.Validated,async i=>{i.diagnostics?.some(isError)&&this.cachedParsers.has(i)&&(logger$3.trace(`Validated: clear cached parser {projectId} document {doc} because of errors`,{projectId:i.likec4ProjectId,doc:UriUtils.basename(i.uri)}),this.cachedParsers.delete(i))})}documents(i){return this.services.shared.workspace.LangiumDocuments.projectDocuments(i).map(i=>this.parse(i))}parse(i){return this.forDocument(i).doc}forDocument(i){return this.cachedParsers.get(i)}createParser(i){invariant$1(isLikeC4LangiumDocument(i),`Document ${i.uri.toString()} is not a LikeC4 document`);let a=this.services.shared.workspace.ProjectsManager.getProject(i),o=UriUtils.relative(a.folderUri,i.uri);i.likec4ProjectId?logger$3.trace(`create parser {projectId} document {doc}`,{projectId:i.likec4ProjectId,doc:o}):logger$3.debug(`create parser for document without project {doc}`,{doc:i.uri.fsPath}),i.state<DocumentState.Linked&&logger$3.debug(`Document {doc} is not linked, state is {state}`,{doc:o,state:i.state});let s={c4Specification:{tags:{},elements:{},relationships:{},colors:{},deployments:{}},c4Elements:[],c4ExtendElements:[],c4ExtendDeployments:[],c4ExtendRelations:[],c4Relations:[],c4Deployments:[],c4DeploymentRelations:[],c4Globals:{predicates:{},dynamicPredicates:{},styles:{}},c4Views:[],c4Imports:new MultiMap(Set)};i=Object.assign(i,s);let c=new DocumentParser(this.services,i,a);try{c.parseSpecification(),c.parseImports(),c.parseModel(),c.parseDeployment(),c.parseGlobals(),c.parseViews()}catch(i){throw Error(`Error parsing document ${o}`,{cause:i})}return c}},LikeC4ValueConverter=class extends DefaultValueConverter{runConverter(i,a,o){return i.name===`MarkdownString`?((a.startsWith(`"""`)&&a.endsWith(`"""`)||a.startsWith(`'''`)&&a.endsWith(`'''`))&&(a=a.slice(2,-2)),ValueConverter.convertString(a)):super.runConverter(i,a,o)}};init_main();const{findNodeForKeyword:findNodeForKeyword$1}=grammar_utils_exports,asViewStyleRule=(i,a,o=0)=>{let s=o>0?` `.repeat(o):``;return[s+`style ${i} {`,...t$2(a).map(([i,a])=>s+` ${i} ${i===`opacity`?a.toString()+`%`:a}`),s+`}`]},isMatchingViewRule=(i,a)=>o=>{if(!isViewRuleStyle(o)&&!isDeploymentViewRuleStyle(o))return!1;let s=o.targets.value;if(!s||e$4(o.targets.prev)||s.$type!==`FqnRefExpr`||e$4(s.selector))return!1;let c=s.ref?.value?.ref;return(c?a.resolve(c):null)===i};function changeElementStyle(i,{view:a,viewAst:o,targets:s,style:c}){invariant(o.body,`View ${a.id} has no body`);let l=o.$cstNode;invariant(l,`viewCstNode`);let d=t$5(o.body.rules)?.$cstNode?.range.end??o.body.$cstNode?.range.end;invariant(d,`insertPos is not defined`);let f=l.range.start.character+2,p=i.likec4.FqnIndex,h=n$2(o.body.rules,i=>isViewRuleStyle(i)||isDeploymentViewRuleStyle(i)),g=a[_type]===`element`?a.viewOf??null:null,_=[],v=[];s.forEach(i=>{let a=t$26(h,isMatchingViewRule(i,p)),o=g&&isAncestor(g,i)?i.substring(g.length+1):i;a?_.push({fqn:o,rule:a}):v.push({fqn:o})});let y={start:d,end:d},b=i=>{i.start.line<=y.start.line&&(i.start.line==y.start.line?y.start.character=Math.min(i.start.character,y.start.character):y.start=i.start),i.end.line>=y.end.line&&(i.end.line==y.end.line?y.end.character=Math.max(i.end.character,y.end.character):y.end=i.end)},x=[];if(v.length>0){let i=v.flatMap(({fqn:i})=>asViewStyleRule(i,c,f));x.push(TextEdit$1.insert(d,`
63
+ `+i.join(`
64
+ `))),y.start={line:d.line+1,character:f},y.end={line:d.line+i.length,character:t$5(i)?.length??0}}if(_.length>0)for(let{rule:i}of _){let a=i.$cstNode;invariant(a,`RuleCstNode not found`);for(let[o,s]of t$2(c)){let c=o===`opacity`?s.toString()+`%`:s,l=i.props.find(i=>i.key===o);if(l&&l.$cstNode){let{range:{start:i,end:a}}=l.$cstNode;b({start:i,end:a}),x.push(TextEdit$1.replace({start:i,end:a},o+` `+c));continue}let d=findNodeForKeyword$1(a,`{`)?.range.end;invariant(d,`Opening brace not found`);let f=` `.repeat(a.range.start.character)+` `,p=f+o+` `+c;x.push(TextEdit$1.insert(d,`
65
+ `+p)),b({start:{line:d.line+1,character:f.length},end:{line:d.line+1,character:p.length}})}}return{modifiedRange:y,edits:x}}init_main();const{findNodeForKeyword}=grammar_utils_exports;function changeViewLayout(i,{view:a,viewAst:o,layout:s}){invariant(o.body,`View ${a.id} has no body`);let c=o.$cstNode;invariant(c,`viewCstNode`);let l=toAstViewLayoutDirection(s.direction),d=t$26(o.body.rules,isViewRuleAutoLayout),f=`autoLayout ${l}`;if(e$6(s.rankSep)&&(f+=` ${s.rankSep}`,e$6(s.nodeSep)&&(f+=` ${s.nodeSep}`)),d&&d.$cstNode)return TextEdit$1.replace(d.$cstNode.range,f);let p=findNodeForKeyword(o.body.$cstNode,`}`)?.range.start;invariant(p,`Closing brace not found`);let m=`\t${f}\n\t`;return TextEdit$1.insert(p,m)}init_main();async function removeManualLayoutV1(i,{lookup:a}){if(!a.view.manualLayout)return!1;let o=a.viewAst.$cstNode;invariant(o,`invalid view.$cstNode`);let s=i.shared.lsp.Connection;invariant(s,`LSP Connection not available`);let c=findCommentNode(o,[`BLOCK_COMMENT`]);return c&&hasManualLayout(c.text)?(await s.workspace.applyEdit({label:`LikeC4 - remove manual layout v1 for ${a.view.id}`,edit:{changes:{[a.doc.textDocument.uri]:[TextEdit$1.del(c.range)]}}})).applied:!1}init_main();const logger$2=logger$16.getChild(`model-changes`);var LikeC4ModelChanges=class{locator;constructor(i){this.services=i,this.locator=i.likec4.ModelLocator}async applyChange(i){let a=this.services.shared.lsp.Connection,o=this.services.shared.workspace;try{let{viewId:s,projectId:c,change:l}=i,d=o.ProjectsManager.ensureProject(c);logger$2.debug`Applying model change ${l.op} to view ${s} in project ${d.id}`;let f=this.locator.locateViewAst(s,d.id);if(!f)throw Error(`View ${s} not found in project ${d.id}`);let p={uri:f.doc.textDocument.uri,version:f.doc.textDocument.version};if(l.op===`save-view-snapshot`)return invariant(s===l.layout.id,`View ID does not match, expected `+s+`, got `+l.layout.id),f.view.manualLayout&&a&&await removeManualLayoutV1(this.services,{lookup:f}).catch(i=>{logger$2.warn(`Failed to remove manual layout v1 for view ${s} in project ${d.id}`,{err:i})}),{success:!0,location:await o.ManualLayouts.write(d,l.layout)};if(l.op===`reset-manual-layout`)return f.view.manualLayout&&await removeManualLayoutV1(this.services,{lookup:f}).catch(i=>{logger$2.warn(`Failed to remove manual layout v1 for view ${s} in project ${d.id}`,{err:i})}),{success:!0,location:await o.ManualLayouts.remove(d,s)};invariant(a,`This change only supported in IDE (running as Extension)`);let{edits:m,modifiedRange:h}=this.convertToTextEdit({lookup:f,change:l});if(!m.length)return{success:!1,error:`No changes to apply`};let g=await a.workspace.applyEdit({label:`LikeC4 - change view ${i.viewId}`,edit:{changes:{[p.uri]:m}}});return g.applied?{success:!0,location:{uri:p.uri,range:h}}:(a.window.showErrorMessage(`Failed to apply changes ${g.failureReason}`),{success:!1,error:`Failed to apply changes ${g.failureReason}`})}catch(a){let o=loggable(wrapError(a,`Failed to apply change ${i.change.op} ${i.viewId}`));return logger$2.error(o),{success:!1,error:o}}finally{this.services.likec4.ModelBuilder.clearCache()}}convertToTextEdit({lookup:i,change:a}){switch(a.op){case`change-element-style`:return changeElementStyle(this.services,{...i,targets:a.targets,style:a.style});case`change-autolayout`:{let o=changeViewLayout(this.services,{...i,layout:a.layout});return{modifiedRange:o.range,edits:[o]}}default:nonexhaustive(a)}}},LikeC4NameProvider=class extends DefaultNameProvider{constructor(i){super(),this.services=i}getNameStrict(i){return nonNullable(this.getName(i),`Failed getName for ${this.services.workspace.AstNodeLocator.getAstNodePath(i)}`)}getName(i){if(isNamed(i))return i.name;if(isImported(i))return i.imported.$refText;if(isDeployedInstance(i))return i.target.modelElement.value.$refText}getNameNode(i){if(isNamed(i))return super.getNameNode(i);if(isImported(i))return i.imported.$refNode;if(isDeployedInstance(i))return i.target.modelElement.value.$refNode}};function uniqueDescriptions(i){return t$3(i,t$11(i=>`${i.type}.${i.name}`),t$2(),t$7(([i,a])=>a.length===1?a:[]))}var LikeC4ScopeComputation=class extends DefaultScopeComputation{constructor(i){super(i)}async computeExports(i,a){let o=[];try{let{specifications:a,models:s,views:c,globals:l,likec4lib:d,deployments:f}=i.parseResult.value;this.exportLibrary(d,o,i),this.exportSpecification(a,o,i),this.exportModel(s,o,i),this.exportViews(c,o,i),this.exportGlobals(l,o,i),this.exportDeployments(f,o,i)}catch(i){logWarnError(i)}return o}exportViews(i,a,o){let s=i?.flatMap(i=>i.views);if(!(e$5(s)||s.length===0))for(let i of s)try{e$4(i.name)&&a.push(this.descriptions.createDescription(i,i.name,o))}catch(i){logWarnError(i)}}exportGlobals(i,a,o){if(!(e$5(i)||i.length===0)){for(let s of i.flatMap(i=>i.predicates))try{let i=s;e$4(i.name)&&a.push(this.descriptions.createDescription(i,i.name,o))}catch(i){logWarnError(i)}for(let s of i.flatMap(i=>i.styles))try{let i=s.id;e$4(i.name)&&a.push(this.descriptions.createDescription(i,i.name,o))}catch(i){logWarnError(i)}}}exportModel(i,a,o){if(!(e$5(i)||i.length===0))for(let s of i.flatMap(i=>i.elements))try{isElement(s)&&e$4(s.name)&&a.push(this.descriptions.createDescription(s,s.name,o))}catch(i){logWarnError(i)}}exportLibrary(i,a,o){if(!e$5(i))try{for(let s of i.flatMap(i=>i.icons))a.push(this.descriptions.createDescription(s,s.name,o))}catch(i){logWarnError(i)}}exportSpecification(i,a,o){if(!(e$5(i)||i.length===0))for(let s of i.flatMap(i=>[...i.elements,...i.relationships,...i.deploymentNodes,...i.tags,...i.colors]))try{switch(!0){case isSpecificationDeploymentNodeKind(s):case isSpecificationElementKind(s):e$4(s.kind.name)&&a.push(this.descriptions.createDescription(s.kind,s.kind.name,o));continue;case isSpecificationTag(s):e$4(s.tag.name)&&a.push(this.descriptions.createDescription(s.tag,s.tag.name,o));continue;case isSpecificationRelationshipKind(s):e$4(s.kind.name)&&a.push(this.descriptions.createDescription(s.kind,s.kind.name,o));continue;case isSpecificationColor(s):e$4(s.name.name)&&a.push(this.descriptions.createDescription(s.name,s.name.name,o));continue;default:nonexhaustive(s)}}catch(i){logWarnError(i)}}exportDeployments(i,a,o){let s=i?.flatMap(i=>i.elements);if(!(e$5(s)||s.length===0))for(let i of s)try{isDeploymentNode$1(i)&&e$4(i.name)&&a.push(this.descriptions.createDescription(i,i.name,o))}catch(i){logWarnError(i)}}computeLocalScopes(i,a){return new Promise(a=>{let o=i.parseResult.value,s=[],c=new MultiMap$1;for(let a of o.models)try{s.push(...this.processContainer(a,c,i))}catch(i){logWarnError(i)}for(let a of o.deployments)try{s.push(...this.processDeployments(a,c,i))}catch(i){logWarnError(i)}for(let i of o.imports.flatMap(i=>i.imports))try{let a=i;for(;a;)s.push(this.descriptions.createDescription(a,a.imported.$refText)),a=a.prev}catch(i){logWarnError(i)}uniqueDescriptions(s).forEach(i=>{c.add(o,i)}),a(c)})}processContainer(i,a,o){let s=new MultiMap$1,c=[];for(let l of i.elements){if(isRelation(l))continue;let i;if(isElement(l)?(e$4(l.name)&&s.add(l.name,this.descriptions.createDescription(l,l.name,o)),i=l.body,i&&(a.add(i,this.descriptions.createDescription(l,`this`,o)),a.add(i,this.descriptions.createDescription(l,`it`,o)))):isExtendElement(l)&&(i=l.body),i&&i.elements.length>0)try{c.push(...this.processContainer(i,a,o))}catch(i){logWarnError(i)}}c.length&&t$3(c,n$2(i=>!s.has(i.name)),t$11(i=>i.name),t$27((i,a)=>{i.length===1&&s.add(a,i[0])}));let l=[...s.values()];return a.addAll(i,l),l}processDeployments(i,a,o){let s=new MultiMap$1,c=[];for(let l of i.elements){if(isDeploymentRelation(l))continue;let i=l.body;if(!isExtendDeployment(l)){let c=this.nameProvider.getName(l);if(e$4(c)){let i=this.descriptions.createDescription(l,c,o);s.add(c,i)}i&&(a.add(i,this.descriptions.createDescription(l,`this`,o)),a.add(i,this.descriptions.createDescription(l,`it`,o)))}if(i)try{c.push(...this.processDeployments(i,a,o))}catch(i){logWarnError(i)}}c.length&&t$3(c,n$2(i=>!s.has(i.name)),t$11(i=>i.name),t$27((i,a)=>{i.length===1&&s.add(a,i[0])}));let l=[...s.values()];return a.addAll(i,l),l}};const{getDocument}=ast_utils_exports;var LikeC4ScopeProvider=class extends DefaultScopeProvider{deploymentsIndex;fqnIndex;indexManager;constructor(i){super(i),this.indexManager=i.shared.workspace.IndexManager,this.fqnIndex=i.likec4.FqnIndex,this.deploymentsIndex=i.likec4.DeploymentsIndex}getScope(i){try{let a=projectIdFrom(i.container),o=this.reflection.getReferenceType(i);try{let s=i.container;if(isFqnRef(s))return new StreamScope(this.streamForFqnRef(a,s,i));if(isStrictFqnRef(s))return this.getScopeForStrictFqnRef(a,s,i);if(o!==Element)return this.getProjectScope(a,o,i);if(isImported(s)){let i=projectIdFrom(s);return new StreamScope(this.fqnIndex.rootElements(i))}if(isStrictFqnElementRef(s)&&i.property===`el`){let c=s.parent;return c?new StreamScope(this.fqnIndex.directChildrenOf(a,readStrictFqn(c))):this.getProjectScope(a,o,i)}return new StreamScope(stream(this.computeScope(a,i)))}catch(s){return logWarnError(s),this.getProjectScope(a,o,i)}}catch(i){return logWarnError(i),EMPTY_SCOPE}}*genUniqueDescedants(i){if(!i)return;let a=projectIdFrom(i);if(isElement(i)){let o=this.fqnIndex.getFqn(i);yield*this.fqnIndex.uniqueDescedants(a,o);return}if(isDeploymentNode$1(i)){let o=this.deploymentsIndex.getFqn(i);yield*this.deploymentsIndex.uniqueDescedants(a,o)}}*genScopeExtendElement({element:i}){i.el.$nodeDescription&&(yield i.el.$nodeDescription,yield{...i.el.$nodeDescription,name:`this`},yield{...i.el.$nodeDescription,name:`it`}),yield*this.genUniqueDescedants(elementRef(i))}*genScopeElementView({viewOf:i,extends:a}){if(i){i.modelElement.value.$nodeDescription&&(yield i.modelElement.value.$nodeDescription),yield*this.genUniqueDescedants(elementRef(i));return}if(a){let i=a.view.ref;i&&(yield*this.genScopeElementView(i))}}getScopeForStrictFqnRef(i,a,o){let s=a.parent;return s?new StreamScope(this.deploymentsIndex.directChildrenOf(i,readStrictFqn(s)).filter(i=>this.reflection.isSubtype(i.type,DeploymentNode))):this.getProjectScope(i,DeploymentNode,o)}*genScopeExtendDeployment({deploymentNode:i}){i.value.$nodeDescription&&(yield i.value.$nodeDescription);let a=i.value.ref;a&&isDeploymentNode$1(a)&&(yield*this.genUniqueDescedants(a))}streamForFqnRef(i,a,o){let s=a.parent;if(!s)return stream(this.genScopeForParentlessFqnRef(i,a,o));let c=s.value.ref;if(!c)return EMPTY_STREAM;if(isImported(c))return stream(this.genUniqueDescedants(c.imported.ref));if(isDeploymentNode$1(c))return stream(this.genUniqueDescedants(c));if(isDeployedInstance(c)){let i=c.target.modelElement.value.ref,a=isImported(i)?i.imported.ref:isElement(i)?i:void 0;return stream(this.genUniqueDescedants(a))}return isElement(c)?stream(this.genUniqueDescedants(c)):nonexhaustive(c)}*genScopeForParentlessFqnRef(i,a,o){hasContainerOfType(a,isElementRef)||isFqnRefInsideModel(a)?yield*this.computeScope(i,o,Element):isFqnRefInsideGlobals(a)?(yield*this.computeScope(i,o,Element),yield*this.computeScope(i,o,DeploymentNode),yield*this.computeScope(i,o,DeployedInstance)):(yield*this.computeScope(i,o,DeploymentNode),yield*this.computeScope(i,o,DeployedInstance),hasContainerOfType(a,isDeploymentViewBody)&&(yield*this.computeScope(i,o,Element)));let s=getDocument(a).precomputedScopes;s&&(yield*s.values().filter(i=>this.reflection.isSubtype(i.type,Imported)))}*computeScope(i,a,o=this.reflection.getReferenceType(a)){let s=this.reflection.isSubtype(o,Element),c=this.reflection.isSubtype(o,DeploymentElement),l=getDocument(a.container).precomputedScopes;if(!l){yield*this.getProjectScope(i,o,a).getAllElements();return}let d=i=>this.reflection.isSubtype(i.type,o),f=a.container;for(;f;){let i=l.get(f).filter(d);i.length>0&&(yield*i),c&&isExtendDeploymentBody(f)&&(yield*this.genScopeExtendDeployment(f.$container)),s&&isExtendElementBody(f)&&(yield*this.genScopeExtendElement(f.$container)),s&&isElementViewBody(f)&&(yield*this.genScopeElementView(f.$container)),f=f.$container}yield*this.getProjectScope(i,o,a).getAllElements()}getProjectScope(i,a,o){return a===LibIcon?super.getGlobalScope(a,o):this.globalScopeCache.get(`${i}::${a}`,()=>new MapScope(this.indexManager.projectElements(i,a)))}getGlobalScope(i,a){if(i===LibIcon)return super.getGlobalScope(i,a);let o=projectIdFrom(a.container);return this.getProjectScope(o,i,a)}},import_main=require_main$2();let DidChangeModelNotification;(function(i){i.type=new import_main.NotificationType(`likec4/onDidChangeModel`)})(DidChangeModelNotification||={});let DidChangeProjectsNotification;(function(i){i.type=new import_main.NotificationType0(`likec4/onDidChangeProjects`)})(DidChangeProjectsNotification||={});let DidChangeSnapshotNotification;(function(i){i.type=new import_main.NotificationType(i.Method=`likec4/onDidChangeSnapshot`)})(DidChangeSnapshotNotification||={});let DidRequestOpenViewNotification;(function(i){i.type=new import_main.NotificationType(`likec4/onRequestOpenView`)})(DidRequestOpenViewNotification||={});let FetchComputedModel;(function(i){i.req=new import_main.RequestType(`likec4/fetchComputedModel`)})(FetchComputedModel||={});let FetchViewsFromAllProjects;(function(i){i.req=new import_main.RequestType0(`likec4/fetchViewsFromAllProjects`)})(FetchViewsFromAllProjects||={});let FetchLayoutedModel;(function(i){i.req=new import_main.RequestType(`likec4/fetchLayoutedModel`)})(FetchLayoutedModel||={});let LayoutView;(function(i){i.req=new import_main.RequestType(`likec4/layout-view`)})(LayoutView||={});let ValidateLayout;(function(i){i.req=new import_main.RequestType(`likec4/validate-layout`)})(ValidateLayout||={});let ReloadProjects;(function(i){i.req=new import_main.RequestType0(`likec4/reload-projects`)})(ReloadProjects||={});let FetchProjects;(function(i){i.req=new import_main.RequestType0(`likec4/fetch-projects`)})(FetchProjects||={});let RegisterProject;(function(i){i.req=new import_main.RequestType(`likec4/register-project`)})(RegisterProject||={});let BuildDocuments;(function(i){i.req=new import_main.RequestType(`likec4/build`)})(BuildDocuments||={});let Locate;(function(i){i.req=new import_main.RequestType(`likec4/locate`)})(Locate||={});let ChangeView;(function(i){i.req=new import_main.RequestType(`likec4/change-view`)})(ChangeView||={});let FetchTelemetryMetrics;(function(i){i.req=new import_main.RequestType0(`likec4/metrics`)})(FetchTelemetryMetrics||={});let GetDocumentTags;(function(i){i.req=new import_main.RequestType(`likec4/document-tags`)})(GetDocumentTags||={});let FetchProjectsOverview;(function(i){i.req=new import_main.RequestType0(`likec4/fetch-projects-overview`)})(FetchProjectsOverview||={});const logger$1=logger$16.getChild(`rpc`);var Rpc=class extends ADisposable{constructor(i){super(),this.services=i}init=e$13(()=>{let i=this.services.shared.lsp.Connection;if(!i){logger$1.info(`no connection, skip init ServerRpc`);return}logger$1.info(`init ServerRpc`);let a=this.services.likec4,o=this.services.shared.workspace,s=o.LangiumDocuments,c=o.DocumentBuilder,l=n$6(a=>{a>1?logger$1.debug`send ${`onDidChangeModel`} (${a} batched)`:logger$1.debug`send ${`onDidChangeModel`}`,i.sendNotification(DidChangeModelNotification.type,``).catch(i=>{logger$1.warn(`[ServerRpc] error sending onDidChangeModel:`,{error:i})})},{reducer:(i,a)=>(i??0)+a,triggerAt:`end`,minQuietPeriodMs:130,maxBurstDurationMs:400}),d=n$6(a=>{a>1?logger$1.debug`send ${`DidChangeProjectsNotification`} (${a} batched)`:logger$1.debug`send ${`DidChangeProjectsNotification`}`,i.sendNotification(DidChangeProjectsNotification.type).catch(i=>{logger$1.warn(`[ServerRpc] error sending DidChangeProjectsNotification:`,{error:i})})},{reducer:(i,a)=>(i??0)+a,triggerAt:`end`,minQuietPeriodMs:100,maxBurstDurationMs:500}),f=!0;this.onDispose(a.ModelBuilder.onModelParsed(()=>l.call(1)),o.ProjectsManager.onProjectsUpdate(()=>d.call(1)),i.onRequest(FetchComputedModel.req,async({projectId:i,cleanCaches:s=!1},c)=>{logger$1.debug`received request ${`fetchComputedModel`} for project ${i}`,s&&(logger$1.debug`cleanCaches: ${s}`,i?await o.ProjectsManager.rebuildProject(i):await o.WorkspaceManager.rebuildAll());let l=await a.ModelBuilder.computeModel(i,c);return l===LikeC4Model.EMPTY?{model:null}:{model:l.$data}}),i.onNotification(DidChangeSnapshotNotification.type,async({snapshotUri:i})=>{logger$1.debug`received notification ${`onDidChangeSnapshot`} for snapshot ${i}`,o.ManualLayouts.clearCaches(),await o.ProjectsManager.rebuildProject(o.ProjectsManager.ownerProjectId(i))}),i.onRequest(FetchLayoutedModel.req,async({projectId:i},o)=>{logger$1.debug`received request ${`fetchLayoutedModel`} for project ${i}`;let s=await a.LanguageServices.layoutedModel(i);if(s===null)return{model:null};let c=await a.Views.diagrams(i,o);return{model:{...s.$data,_stage:`layouted`,views:t$6(c,i=>i.id)}}}),i.onRequest(LayoutView.req,async({viewId:i,projectId:o,layoutType:s},c)=>(logger$1.debug`received request ${`layoutView`} for ${i} from project ${o} (layout type: ${s??`not set`})`,{result:await a.Views.layoutView({viewId:i,projectId:o,layoutType:s,cancelToken:c})})),i.onRequest(ValidateLayout.req,async({projectId:i},o)=>(logger$1.debug`received request ${`validateLayout`} for project ${i}`,{result:p((await a.Views.layoutAllViews(i,o)).map(i=>i.diagram))})),i.onRequest(FetchProjects.req,async()=>(logger$1.debug`received request ${`FetchProjects`}`,{projects:t$20(s.groupedByProject(),(i,a)=>{let{folderUri:s,config:{name:c,title:l}}=o.ProjectsManager.getProject(a);return{folder:s.toString(),config:{name:c,title:l},docs:t(i,i=>i.uri.toString())}})})),i.onRequest(ReloadProjects.req,async i=>{logger$1.debug`received request ${`ReloadProjects`}`,o.ManualLayouts.clearCaches(),await o.ProjectsManager.reloadProjects(i)}),i.onRequest(RegisterProject.req,async(i,a)=>{logger$1.debug`received request ${`RegisterProject`}`,o.ManualLayouts.clearCaches();let s;return s=`configUri`in i?await o.ProjectsManager.registerConfigFile(URI.parse(i.configUri),a):await o.ProjectsManager.registerProject(i,a),{id:s.id}}),i.onRequest(FetchViewsFromAllProjects.req,async i=>{logger$1.debug`received request ${`FetchViewsFromAllProjects`}`;let s=[];for(let c of o.ProjectsManager.all){await interruptAndCheck(i);try{let o=await a.Views.computedViews(c,i);s.push(...t$3(o,t(i=>({id:i.id,title:i.title??i.id,projectId:c})),t$9((i,a)=>i.id===`index`?-1:a.id===`index`?1:i.title.localeCompare(a.title))))}catch(i){logger$1.warn(`Failed to fetch views for project ${c}:`,{error:i})}}return{views:s}}),i.onRequest(BuildDocuments.req,async({docs:a},o)=>{let l=a.map(i=>URI.parse(i)),d=i=>!l.some(a=>UriUtils.equals(a,i)),p=s.userDocuments.map(i=>i.uri).filter(d).toArray();logger$1.debug(`[ServerRpc] received request to build:
66
+ changed (total ${l.length}):${a.map(i=>`
67
+ - `+i).join(``)}
68
+ deleted (total ${p.length}):${p.map(i=>`
69
+ - `+i.toString()).join(`
70
+ `)}`),!f&&l.length+p.length>0&&await Promise.allSettled([...l,...p].map(async a=>{let o=a.toString();logger$1.debug(`clear diagnostics for ${o}`);try{await i.sendDiagnostics({uri:o,diagnostics:[]})}catch(i){logger$1.warn(`error clearing diagnostics for ${o}: ${i}`)}})),f=!1,await interruptAndCheck(o),await c.update(l,p,o)}),i.onRequest(Locate.req,i=>{switch(logger$1.debug`received request ${`locate`}, ${i}`,!0){case`element`in i:return a.ModelLocator.locateElement(i.element,i.projectId);case`relation`in i:return a.ModelLocator.locateRelation(i.relation,i.projectId);case`astPath`in i:return a.ModelLocator.locateDynamicViewStep({view:i.view,astPath:i.astPath,projectId:i.projectId});case`view`in i:return a.ModelLocator.locateView(i.view,i.projectId);case`deployment`in i:return a.ModelLocator.locateDeploymentElement(i.deployment,i.projectId);default:nonexhaustive(i)}}),i.onRequest(ChangeView.req,async(i,s)=>{logger$1.debug`received request ${`changeView`} of ${i.viewId} from project ${i.projectId}`;let c=await a.ModelChanges.applyChange(i),l=i.change.op;return i.projectId&&(l===`save-view-snapshot`||l===`reset-manual-layout`)&&await o.ProjectsManager.rebuildProject(i.projectId,s),c}),i.onRequest(FetchTelemetryMetrics.req,async i=>{let s=null;for(let c of o.ProjectsManager.all)try{let o=await a.ModelBuilder.computeModel(c,i);if(o===LikeC4Model.EMPTY)continue;s??={elementKinds:0,deploymentKinds:0,relationshipKinds:0,tags:0,customColors:0,elements:0,deploymentNodes:0,relationships:0,views:0,projects:0},s.elementKinds+=t$21(o.specification.elements).length,s.deploymentKinds+=t$21(o.specification.deployments).length,s.relationshipKinds+=t$21(o.specification.relationships).length,s.tags+=t$21(o.specification.tags).length,s.customColors+=t$21(o.specification.customColors??{}).length,s.elements+=t$21(o.$data.elements).length,s.deploymentNodes+=[...o.deployment.nodes()].length,s.relationships+=t$21(o.$data.relations).length,s.views+=t$21(o.$data.views).length,s.projects+=1}catch(i){logger$1.warn(`Error fetching telemetry metrics for project ${c}`,{err:i})}return await interruptAndCheck(i),{metrics:s}}),i.onRequest(GetDocumentTags.req,async({documentUri:i},s)=>{let c=URI.parse(i);logger$1.debug`received request ${`GetDocumentTags`} for document ${c}`;let l=await a.ModelLocator.locateDocumentTags(c,s);return{projectId:o.ProjectsManager.ownerProjectId(c),tags:l??[]}}),i.onRequest(FetchProjectsOverview.req,async i=>(logger$1.debug`received request ${`FetchProjectsOverview`}`,{projectsView:await a.LanguageServices.projectsOverview(i)})),Disposable.create(()=>{l.cancel()}));function p(i){return t$3(i,n$2(i=>!!i.hasLayoutDrift),t(i=>{let o=a.ModelLocator.locateView(i.id);return invariant(o,`View ${i.id} not found`),{uri:o.uri,viewId:i.id,severity:import_main$1.DiagnosticSeverity.Warning,message:`Layout drift detected for view '${i.id}'`,range:o.range}}))}});async openView(i){let a=this.services.shared.lsp.Connection;if(!a){logger$1.warn(`No LSP connection`);return}await a.sendNotification(DidRequestOpenViewNotification.type,i)}};init_main();var NodeKindProvider=class{constructor(i){this.services=i}getSymbolKind(i){let a=isAstNode(i)?i.$type:i.type,o=(...i)=>i.some(i=>this.services.AstReflection.isSubtype(a,i));switch(!0){case o(Element,ExtendElement,DeploymentNode,DeployedInstance,Imported):return SymbolKind.Constructor;case o(Model,ModelViews,ModelDeployments,Globals,SpecificationRule):return SymbolKind.Namespace;case o(LikeC4View):return SymbolKind.Class;case o(`Tag`,LibIcon,CustomColor,SpecificationTag):return SymbolKind.EnumMember;case o(RelationshipKind,SpecificationRelationshipKind):return SymbolKind.Event;case o(ElementKind,DeploymentNodeKind,SpecificationElementKind,SpecificationDeploymentNodeKind):return SymbolKind.TypeParameter}return SymbolKind.Field}getCompletionItemKind(i){let a=isAstNode(i)?i.$type:i.type,o=(...i)=>i.some(i=>this.services.AstReflection.isSubtype(a,i));switch(!0){case o(CustomColor):return CompletionItemKind.Color;case o(Element,DeploymentNode,DeployedInstance,ExtendElement,Imported):return CompletionItemKind.Constructor;case o(Model,ModelViews,ModelDeployments,Globals,SpecificationRule):return CompletionItemKind.Module;case o(LikeC4View):return CompletionItemKind.Class;case o(`Tag`,LibIcon,CustomColor,SpecificationTag):return CompletionItemKind.EnumMember;case o(RelationshipKind,SpecificationRelationshipKind):return CompletionItemKind.Event;case o(ElementKind,SpecificationElementKind,DeploymentNodeKind,SpecificationDeploymentNodeKind):return CompletionItemKind.TypeParameter;default:return CompletionItemKind.Reference}}},WorkspaceSymbolProvider=class extends DefaultWorkspaceSymbolProvider{};const viewsLogger=logger$16.getChild(`views`);var DefaultLikeC4Views=class{cache=new WeakMap;viewsWithReportedErrors=new Set;ModelBuilder;constructor(i){this.services=i,this.ModelBuilder=i.likec4.ModelBuilder,i.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.cache=new WeakMap})}get layouter(){return this.services.likec4.Layouter}async computedViews(i,a){return t$12((await this.ModelBuilder.computeModel(i,a)).$data.views)}async _layoutAllViews(i,a){let o=t$12(i.$data.views);if(o.length===0)return[];let s=performanceMark(),c=i.project.id,l=viewsLogger.getChild(c);l.debug`layoutAll: ${o.length} views`;let d=[],f=i.$styles,p=[];for(let i of o){let a=this.cache.get(i);if(a){l.debug`layout ${i.id} from cache`,p.push(a);continue}d.push({view:i,styles:f})}return d.length>0&&await this.layouter.batchLayout({batch:d,cancelToken:a,onSuccess:(a,o)=>{p.push(this.viewSucceed(a.view,i,o))},onError:(i,a)=>{l.warn(`Fail layout view ${i.view.id}`,{error:a})}}),a&&a.isCancellationRequested&&await interruptAndCheck(a),p.length===o.length?p.length>0&&l.debug`layouted all ${p.length} views in ${s.pretty}`:l.warn`layouted ${p.length} of ${o.length} views in ${s.pretty}`,p}async layoutAllViews(i,a){let o=await this.ModelBuilder.computeModel(i,a);return await this._layoutAllViews(o,a)}async layoutView({viewId:i,layoutType:a,projectId:o,cancelToken:s}){let c=await this.ModelBuilder.computeModel(o,s),l=c.findView(i)?.$view;o=c.project.id;let d=viewsLogger.getChild(o);if(!l){d.warn`layoutView ${i} not found`;let a=c.findManualLayout(i);if(a){d.debug`found manual layout for ${i}`;let o={...a};return o.drifts=[`not-exists`],o._layout=`manual`,{diagram:o,dot:`# manual layout`}}return null}try{let o=performanceMark(),s=this.cache.get(l)??await this.layouter.layout({view:l,styles:c.$styles});return this.cache.has(l)?d.debug`layout ${i} from cache`:(this.viewSucceed(l,c,s),d.debug(`layout {viewId} in ${o.pretty}`,{viewId:i})),e$4(a)?{dot:s.dot,diagram:this.withLayoutType(s.diagram,c,a)}:s}catch(i){let a=loggable(i);return d.warn(a),this.reportViewError(l,o,a),Promise.reject(i)}}async diagrams(i,a){let o=await this.ModelBuilder.computeModel(i,a);return(await this._layoutAllViews(o,a)).map(({diagram:i})=>this.withLayoutType(i,o,`manual`))}async viewsAsGraphvizOut(i,a){let o=`All-LayoutedViews-DotWithSvg`,s=this.services.shared.workspace.Cache;if(s.has(o))return await Promise.resolve(s.get(o));let c=await this.ModelBuilder.computeModel(i,a),l=t$12(c.$data.views);if(l.length===0)return[];let d=l.map(async i=>{let{dot:a,svg:o}=await this.layouter.svg({view:i,styles:c.$styles});return{id:i.id,dot:a,svg:o}}),f=[],p=await Promise.allSettled(d);for(let i of p)i.status===`fulfilled`?f.push(i.value):logWarnError(i.reason);return s.set(o,f),f}async openView(i,a){await this.services.Rpc.openView({viewId:i,projectId:a})}async adhocView(i,a){viewsLogger.debug`layouting adhoc view...`;let o=await this.ModelBuilder.computeModel(a),s=computeAdhocView(o,i),{diagram:c}=await this.layouter.layout({view:{...s,hash:``,_type:`element`},styles:o.$styles});return viewsLogger.debug`layouting adhoc view... done`,c}reportViewError(i,a,o){let s=`${a}-${i.id}`;this.cache.delete(i),this.viewsWithReportedErrors.has(s)||(this.services.shared.lsp.Connection?.window.showErrorMessage(`LikeC4: ${o}`),this.viewsWithReportedErrors.add(s))}withLayoutType(i,a,o){if(!o)return i;let s=a.findManualLayout(i.id);return s?o===`manual`?i[_layout]===`manual`?(viewsLogger.error(`View ${i.id} already has manual layout, this should not happen`),i):applyManualLayout(i,s):calcDriftsFromSnapshot(i,s):i}viewSucceed(i,a,o){let s=`${a.project.id}-${i.id}`;return this.viewsWithReportedErrors.delete(s),this.cache.set(i,o),o}};function createLikeC4SharedModule(i){return{lsp:{NodeKindProvider:i=>new NodeKindProvider(i),WorkspaceSymbolProvider:i=>new WorkspaceSymbolProvider(i)},workspace:{Cache:i=>new WorkspaceCache(i,DocumentState.Validated),IndexManager:i=>new IndexManager(i),LangiumDocuments:i=>new LangiumDocuments(i),ProjectsManager:i=>new ProjectsManager(i),WorkspaceManager:i=>new LikeC4WorkspaceManager(i),FileSystemProvider:()=>i.fileSystemProvider(),FileSystemWatcher:a=>i.fileSystemWatcher(a),ManualLayouts:a=>i.manualLayouts(a)}}}function bind(i){return a=>new i(a)}function createLikeC4Module(i){return{documentation:{DocumentationProvider:bind(LikeC4DocumentationProvider)},validation:{DocumentValidator:bind(LikeC4DocumentValidator)},Rpc:bind(Rpc),mcp:{Server:a=>i.mcpServer(a),ServerFactory:a=>i.mcpServerFactory(a)},likec4:{LanguageServices:bind(DefaultLikeC4LanguageServices),Layouter:i=>new QueueGraphvizLayoter({graphviz:new GraphvizWasmAdapter}),Views:bind(DefaultLikeC4Views),DeploymentsIndex:bind(DeploymentsIndex),ModelChanges:bind(LikeC4ModelChanges),FqnIndex:bind(FqnIndex),ModelParser:bind(LikeC4ModelParser),ModelBuilder:bind(DefaultLikeC4ModelBuilder),ModelLocator:bind(LikeC4ModelLocator),LastSeen:bind(LastSeenArtifacts)},lsp:{CompletionProvider:bind(LikeC4CompletionProvider),DocumentHighlightProvider:bind(LikeC4DocumentHighlightProvider),DocumentSymbolProvider:bind(LikeC4DocumentSymbolProvider),SemanticTokenProvider:bind(LikeC4SemanticTokenProvider),HoverProvider:bind(LikeC4HoverProvider),CodeLensProvider:bind(LikeC4CodeLensProvider),DocumentLinkProvider:bind(LikeC4DocumentLinkProvider),Formatter:bind(LikeC4Formatter),CodeActionProvider:bind(LikeC4CodeActionProvider)},workspace:{AstNodeDescriptionProvider:bind(AstNodeDescriptionProvider)},references:{NameProvider:bind(LikeC4NameProvider),ScopeComputation:bind(LikeC4ScopeComputation),ScopeProvider:bind(LikeC4ScopeProvider)},parser:{ValueConverter:bind(LikeC4ValueConverter)}}}function createLanguageServices(i={},a,o,s){let c=createSharedServices(i),l=inject([createDefaultModule({shared:c}),LikeC4GeneratedModule,createLikeC4Module({...NoMCPServer,...NoFileSystem,...NoLikeC4ManualLayouts,...i}),a,o,s].reduce(_merge,{}));return c.ServiceRegistry.register(l),registerValidationChecks(l),i.connection?onNextTick(()=>l.Rpc.init()):c.workspace.ConfigurationProvider.initialized({}),{shared:c,likec4:l}}function createSharedServices(i={}){let a={...NoMCPServer,...NoFileSystem,...NoLikeC4ManualLayouts,...i};return inject(createDefaultSharedModule(a),LikeC4GeneratedSharedModule,createLikeC4SharedModule(a))}function _merge(i,a){if(a){for(let[o,s]of Object.entries(a))if(s!==void 0){let a=i[o];a!==null&&s!==null&&typeof a==`object`&&typeof s==`object`?i[o]=_merge(a,s):i[o]=s}}return i}var import_lib=__toESM(require_lib(),1);const logger=logger$17.getChild(`graphviz-binary`);var GraphvizBinaryAdapter=class{_dotpath;_unflattenpath;constructor(i,a){this._dotpath=i,this._unflattenpath=a}dispose(){}[Symbol.dispose](){}get concurrency(){return Math.max(1,os.cpus().length-2)}get dotpath(){return this._dotpath??memoizeProp$1(this,`_dotpath`,()=>{let i=import_lib.default.sync(`dot`);return logger.debug`Found ${i}`,i})}get unflattenpath(){return this._unflattenpath??memoizeProp$1(this,`_unflattenpath`,()=>{let i=import_lib.default.sync(`unflatten`);return logger.debug`Found ${i}`,i})}async unflatten(i){let a;try{let o=await spawn(this.unflattenpath,[`-l 1`,`-c 3`],{timeout:1e4,stdin:{string:i}});a=o.stdout,e$7(o.stderr)||logger.warn(`Command ${o.command} has stderr:\n`+o.stderr)}catch(i){logger.error(`FAILED GraphvizBinaryAdapter.unflatten`,{error:i}),i instanceof SubprocessError&&!e$7(i.stdout)&&(logger.warn(`Command: '${i.command}' returned result but also failed (exitcode ${i.exitCode}):\n`+i.stderr),a=i.stdout)}return a&&(i=a.replaceAll(/\t\[/g,` [`).replaceAll(/\t/g,` `)),i}async layoutJson(i){let a;try{let o=await spawn(this.dotpath,[`-Tjson`,`-y`],{timeout:1e4,stdin:{string:i}});a=o.stdout,e$7(o.stderr)||logger.warn(`Command ${o.command} has stderr:\n`+o.stderr)}catch(o){if(logger.error(`FAILED GraphvizBinaryAdapter.layoutJson`,{error:o}),logger.warn(`FAILED DOT:
71
+ `+i),o instanceof SubprocessError&&!e$7(o.stdout))logger.warn(`Command: '${o.command}' returned result but also failed (exitcode ${o.exitCode}): "${o.stderr}"`),a=o.stdout;else throw o}return a}async acyclic(i){return Promise.reject(Error(`Method not implemented.`))}async svg(i){let a;try{let o=await spawn(this.dotpath,[`-Tsvg`,`-y`],{timeout:1e4,stdin:{string:i}});a=o.stdout,e$7(o.stderr)||logger.warn(`Command ${o.command} has stderr:\n`+o.stderr)}catch(o){if(logger.error(`FAILED GraphvizBinaryAdapter.svg`,{error:o}),logger.warn(`FAILED DOT:
72
+ `+i),o instanceof SubprocessError&&!e$7(o.stdout))logger.warn(`Command: '${o.command}' returned result but also failed (exitcode ${o.exitCode}):\n`+o.stderr),a=o.stdout;else throw o}return a}};export{getAnsiColorFormatter as _,GraphvizWasmAdapter as a,logger$16 as c,createFromSources as d,handleInitOptions as f,getConsoleStderrSink as g,getConsoleSink as h,QueueGraphvizLayoter as i,NoFileSystem as l,logger$17 as m,createLanguageServices as n,WithFileSystem as o,configureLogger as p,ProjectsManager as r,WithLikeC4ManualLayouts as s,GraphvizBinaryAdapter as t,NoLikeC4ManualLayouts as u,getConsoleFormatter as v,loggable as y};